ZGlmZiAtLWdpdCBhLy5oZ3RhZ3MtdG9wLXJlcG8gYi8uaGd0YWdzLXRvcC1yZXBvCmluZGV4IDdlNDMxNDMuLjBlMTNkYjUgMTAwNjQ0Ci0tLSBhLy5oZ3RhZ3MtdG9wLXJlcG8KKysrIGIvLmhndGFncy10b3AtcmVwbwpAQCAtMTgzLDMgKzE4Myw0IEBACiBkYWU5ODIxNTg5Y2NkMjYxMWJkZjcwODQyNjliOThlODE5MDkxNzcwIGpkazgtYjU5CiBlMDdmNDk5YjlkY2NiNTI5ZWNmNzQxNzJjZjZhYzExYTE5NWVjNTdhIGpkazgtYjYwCiAyMGZmMTE3YjUwOTA3NWMzYWVjNGVlM2E1Nzk5MGVjZDVkYjVkZjljIGpkazgtYjYxCis4YTNmZTBhZTA2YThjYzIxMzQ3ZGE1YTE4Mzg0YjBhYTZjMjM0OWY1IGpkazgtYjYyCmRpZmYgLS1naXQgYS9OZXdNYWtlZmlsZS5nbWsgYi9OZXdNYWtlZmlsZS5nbWsKaW5kZXggMjUyZjk4Yi4uZjM4ZDczOSAxMDA2NDQKLS0tIGEvTmV3TWFrZWZpbGUuZ21rCisrKyBiL05ld01ha2VmaWxlLmdtawpAQCAtMzEsOCArMzEsOSBAQAogQ1A9Y3AKIEVDSE89ZWNobwogTUtESVI9bWtkaXIKK1BSSU5URj1wcmludGYKIFBXRD1wd2QKLVNIPXNoCitUQVI9dGFyCiBpZmVxICgkKFBMQVRGT1JNKSx3aW5kb3dzKQogICBaSVA9emlwCiBlbHNlCkBAIC02MywxMCArNjQsNDggQEAKIAkgICQoRUNITykgIkVSUk9SOiBObyBjb25maWd1cmF0aW9ucyB0byBidWlsZCI7IGV4aXQgMTsgXAogCWZpCiAJQGZvciBiZGlyIGluICQoZGlyICQoQUxMX01BS0VGSUxFUykpIDsgZG8gXAotCSAgJChFQ0hPKSAiJChDRCkgJCR7YmRpcn0gJiYgJChNQUtFKSAkKEVYVFJBX01BS0VfQVJHUykgJEAiIDsgXAotCSAgJChDRCkgJCR7YmRpcn0gJiYgJChNQUtFKSAkKEVYVFJBX01BS0VfQVJHUykgJEAgOyBcCisJICAkKEVDSE8pICIkKENEKSAkJHtiZGlyfSAmJiAkKE1BS0UpICRAIiA7IFwKKwkgICQoQ0QpICQke2JkaXJ9ICYmICQoTUFLRSkgJEAgOyBcCiAJZG9uZQogCisjIFRCRDogRGVwbG95IGlucHV0CiskKEJVSUxEX0RJUl9ST09UKS8uZGVwbG95X2lucHV0OgorCUBpZiBbICIkKEFMTF9NQUtFRklMRVMpIiA9ICIiIF0gOyB0aGVuIFwKKwkgICQoRUNITykgIkVSUk9SOiBObyBjb25maWd1cmF0aW9ucyB0byBidWlsZCI7IGV4aXQgMTsgXAorCWZpCisJQGZvciBiZGlyIGluICQoZGlyICQoQUxMX01BS0VGSUxFUykpIDsgZG8gXAorCSAgaWYgWyBkZXBsb3kvbWFrZS9NYWtlZmlsZSBdIDsgdGhlbiBcCisJICAgIGVjaG8gIkF0dGVtcHRpbmcgZGVwbG95IGJ1aWxkLiIgOyBcCisJICAgICggXAorCSAgICAgICQoUk0pIC1yICQke2JkaXJ9L2RlcGxveV9pbnB1dCA7IFwKKwkgICAgICAkKE1LRElSKSAtcCAkJHtiZGlyfS9kZXBsb3lfaW5wdXQgOyBcCisJICAgICAgKCAkKENEKSAkJHtiZGlyfS9pbWFnZXMgJiYgJChUQVIpIC1jZiAtIGoyc2RrLWltYWdlIGoycmUtaW1hZ2UgKSBcCisJICAgICAgICB8ICggJChDRCkgJCR7YmRpcn0vZGVwbG95X2lucHV0ICYmICQoVEFSKSAteGYgLSApIDsgXAorCSAgICApIDsgXAorCSAgZmk7IFwKKwlkb25lCisJdG91Y2ggJEAKKworIyBUQkQ6IERlcGxveSBpbWFnZXMKK2RlcGxveTogJChCVUlMRF9ESVJfUk9PVCkvLmRlcGxveV9pbnB1dAorCUBpZiBbICIkKEFMTF9NQUtFRklMRVMpIiA9ICIiIF0gOyB0aGVuIFwKKwkgICQoRUNITykgIkVSUk9SOiBObyBjb25maWd1cmF0aW9ucyB0byBidWlsZCI7IGV4aXQgMTsgXAorCWZpCisJQGZvciBiZGlyIGluICQoZGlyICQoQUxMX01BS0VGSUxFUykpIDsgZG8gXAorCSAgaWYgWyBkZXBsb3kvbWFrZS9NYWtlZmlsZSBdIDsgdGhlbiBcCisJICAgIGVjaG8gIkF0dGVtcHRpbmcgZGVwbG95IGJ1aWxkLiIgOyBcCisJICAgICggXAorCSAgICAgICQoQ0QpIGRlcGxveS9tYWtlICYmIFwKKwkgICAgICAkKE1BS0UpIFwKKwkgICAgICAgIEFCU19PVVRQVVRESVI9JCR7YmRpcn0vZGVwbG95X2lucHV0IFwKKwkgICAgICAgIE9VVFBVVERJUj0kJHtiZGlyfS9kZXBsb3lfaW5wdXQgXAorCSAgICApIDsgXAorCSAgZmk7IFwKKwlkb25lCisKKyMgVEJEOiBJbnN0YWxsIGJ1bmRsZXMKK2luc3RhbGw6CisKICMgQnVuZGxlIGNyZWF0aW9uCiBidW5kbGVzOgogCUBpZiBbICIkKEFMTF9JTUFHRV9ESVJTKSIgPSAiIiBdIDsgdGhlbiBcCkBAIC05MSw4ICsxMzAsOCBAQAogY2hlY2tzOgogCUAkKEVDSE8pICJObyBjaGVja3MgeWV0IgogCi0jIEtlZXAgdHJhY2sgb2YgcGhvbnkgdGFyZ2V0cwotUEhPTllfTElTVCArPSBhbGwgaW1hZ2VzIGNsZWFuIGNsb2JiZXIgY2hlY2tzCisjIEtlZXAgdHJhY2sgb2YgdXNlciB0YXJnZXRzCitVU0VSX1RBUkdFVFMgKz0gYWxsIGRlcGxveSBpbnN0YWxsIGltYWdlcyBjbGVhbiBjbG9iYmVyIGNoZWNrcwogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMgVG8gaGVscCBpbiBhZG9wdGlvbiBvZiB0aGUgbmV3IGNvbmZpZ3VyZSYmbWFrZSBidWlsZCBwcm9jZXNzLCBhIGJyaWRnZQpAQCAtMTAyLDMyICsxNDEsMTggQEAKIGJyaWRnZUJ1aWxkOiBicmlkZ2UyY29uZmlndXJlIGltYWdlcwogCiAjIEJyaWRnZSBmcm9tIG9sZCBNYWtlZmlsZSBBTFQgc2V0dGluZ3MgdG8gY29uZmlndXJlIG9wdGlvbnMKLWJyaWRnZTJjb25maWd1cmU6IC5icmlkZ2UyY29uZmlndXJlT3B0cwotCSQoQ0QpIGNvbW1vbi9tYWtlZmlsZXMgJiYgc2ggLi4vYXV0b2NvbmYvY29uZmlndXJlICQoc3RyaXAgJChzaGVsbCAkKENBVCkgJDwpKQorYnJpZGdlMmNvbmZpZ3VyZTogJChCVUlMRF9ESVJfUk9PVCkvLmJyaWRnZTJjb25maWd1cmVPcHRzCisJYmFzaCAuL2NvbmZpZ3VyZSAkKHN0cmlwICQoc2hlbGwgJChDQVQpICQ8KSkKIAogIyBDcmVhdGUgYSBmaWxlIHdpdGggY29uZmlndXJlIG9wdGlvbnMgY3JlYXRlZCBmcm9tIG9sZCBNYWtlZmlsZSBtZWNoYW5pc21zLgotLmJyaWRnZTJjb25maWd1cmVPcHRzOiAuYnJpZGdlMmNvbmZpZ3VyZU9wdHNMYXRlc3QKKyQoQlVJTERfRElSX1JPT1QpLy5icmlkZ2UyY29uZmlndXJlT3B0czogJChCVUlMRF9ESVJfUk9PVCkvLmJyaWRnZTJjb25maWd1cmVPcHRzTGF0ZXN0CiAJJChSTSkgJEAKIAkkKENQKSAkPCAkQAogCi0jIEluIGNhc2UgbWFrZSB3YXMgaW52b2tlZCBmcm9tIGEgc3BlY2lmaWMgcGF0aAotX01BS0VfQ09NTUFORF9QQVRIOj0kKGZpcnN0d29yZCAkKE1BS0UpKQotaWZuZXEgKCQoZGlyICQoX01BS0VfQ09NTUFORF9QQVRIKSksLi8pCi0gICMgVGhpcyBjb3VsZCBiZSByZW1vdmVkIHNvbWVkYXkgaWYgSlBSVCB3YXMgZml4ZWQgYW5kIHdlIGNvdWxkIGFzc3VtZSB0aGF0Ci0gICMgICAgdGhlIHBhdGggdG8gbWFrZSB3YXMgYWx3YXlzIGluIFBBVEguCi0gIE1BS0VfQklORElSOj0kKGNhbGwgVW5peFBhdGgsJChkaXIgJChfTUFLRV9DT01NQU5EX1BBVEgpKSkKLSAgTkVXUEFUSDo9JChNQUtFX0JJTkRJUik6JHtQQVRIfQotICBQQVRIOj0kKE5FV1BBVEgpCi0gIGV4cG9ydCBQQVRICi0gIE1BS0VfQ09NTUFORD0kKE1BS0VfQklORElSKS8kKG5vdGRpciAkKF9NQUtFX0NPTU1BTkRfUEFUSCkpCi1lbHNlCi0gIE1BS0VfQ09NTUFORD0kKF9NQUtFX0NPTU1BTkRfUEFUSCkKLWVuZGlmCi0KICMgVXNlIHRoaXMgZmlsZSB0byBvbmx5IGNoYW5nZSB3aGVuIG9idmlvdXMgdGhpbmdzIGhhdmUgY2hhbmdlZAotLmJyaWRnZTJjb25maWd1cmVPcHRzTGF0ZXN0OiBGUkMKKyQoQlVJTERfRElSX1JPT1QpLy5icmlkZ2UyY29uZmlndXJlT3B0c0xhdGVzdDogRlJDCiAJJChSTSkgJEAudG1wCi0JQCQoRUNITykgIiBNQUtFPSQoTUFLRV9DT01NQU5EKSAiID4+ICRALnRtcAorCSQoTUtESVIpIC1wICQoQlVJTERfRElSX1JPT1QpCiAJQCQoRUNITykgIiAtLXdpdGgtZGVidWctbGV2ZWw9JChpZiAkKERFQlVHX0xFVkVMKSwkKERFQlVHX0xFVkVMKSxyZWxlYXNlKSAiID4+ICRALnRtcAogaWZkZWYgQVJDSF9EQVRBX01PREVMCiAJQCQoRUNITykgIiAtLXdpdGgtdGFyZ2V0LWJpdHM9JChBUkNIX0RBVEFfTU9ERUwpICIgPj4gJEAudG1wCkBAIC0xNTYsMjAgKzE4MSwzMCBAQAogIyBDbG9iYmVyIGFsbCB0aGUgYnVpbHQgZmlsZXMKIGNsb2JiZXI6OiBicmlkZ2UyY2xvYmJlcgogYnJpZGdlMmNsb2JiZXI6OgotCSQoUk0pIC5icmlkZ2UyKgorCSQoUk0pICQoQlVJTERfRElSX1JPT1QpLy5icmlkZ2UyKgorCSQoUk0pICQoQlVJTERfRElSX1JPT1QpLy5kZXBsb3lfaW5wdXQKIAogIyBLZWVwIHRyYWNrIG9mIHBob255IHRhcmdldHMKIFBIT05ZX0xJU1QgKz0gYnJpZGdlMmNvbmZpZ3VyZSBicmlkZ2VCdWlsZCBicmlkZ2UyY2xvYmJlcgogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgU2FuaXR5IGNoZWNrcyAoaGlzdG9yeSB0YXJnZXQpCisjCisKK3Nhbml0eTogY2hlY2tzCisKKyMgS2VlcCB0cmFjayBvZiB1c2VyIHRhcmdldHMKK1VTRVJfVEFSR0VUUyArPSBzYW5pdHkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIEphdmFkb2NzCiAjCiAKIGphdmFkb2NzOgogCWNkIGNvbW1vbi9tYWtlZmlsZXMgJiYgJChNQUtFKSAtZiBNYWtlZmlsZUphdmFkb2MuZ21rCiAKLSMgS2VlcCB0cmFjayBvZiBwaG9ueSB0YXJnZXRzCi1QSE9OWV9MSVNUICs9IGphdmFkb2NzCisjIEtlZXAgdHJhY2sgb2YgdXNlciB0YXJnZXRzCitVU0VSX1RBUkdFVFMgKz0gamF2YWRvY3MKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIEpQUlQgdGFyZ2V0cwpAQCAtMTkwLDcgKzIyNSw2IEBACiBqcHJ0X2J1aWxkX2RlYnVnOiBCVUlMRF9ESVJOQU1FPSotZGVidWcKIGpwcnRfYnVpbGRfZGVidWc6IGpwcnRfYnVpbGRfZ2VuZXJpYwogCi1qcHJ0X2J1aWxkX2dlbmVyaWM6IEVYVFJBX01BS0VfQVJHUz1MT0c9bm9maWxlLGluZm8KIGpwcnRfYnVpbGRfZ2VuZXJpYzogJChKUFJUX0FSQ0hJVkVfQlVORExFKQogCiAkKEpQUlRfQVJDSElWRV9CVU5ETEUpOiBicmlkZ2VCdWlsZCBidW5kbGVzCkBAIC0yMDMsOSArMjM3LDU5IEBACiAgICAgICAgICAgICAgIGpwcnRfYnVpbGRfZ2VuZXJpYwogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgSGVscCB0YXJnZXQKKworSEVMUF9GT1JNQVQ9JTEycyVzXG4KKworaGVscDoKKwlAJChQUklOVEYpICIjIEpESyBNYWtlZmlsZVxuIgorCUAkKFBSSU5URikgIiNcbiIKKwlAJChQUklOVEYpICIjIFVzYWdlOiBtYWtlIFtUYXJnZXRdXG4iCisJQCQoUFJJTlRGKSAiI1xuIgorCUAkKFBSSU5URikgIiMgICAkKEhFTFBfRk9STUFUKSIgIlRhcmdldCAgICIgIkRlc2NyaXB0aW9uIgorCUAkKFBSSU5URikgIiMgICAkKEhFTFBfRk9STUFUKSIgIi0tLS0tLSAgICIgIi0tLS0tLS0tLS0tIgorCUBmb3IgaSBpbiAkKFVTRVJfVEFSR0VUUykgOyBkbyBcCisJICAkKE1BS0UpIGhlbHBfJCR7aX0gOyBcCisJZG9uZQorCUAkKFBSSU5URikgIiNcbiIKKworaGVscF9hbGw6CisJQCQoUFJJTlRGKSAiIyAgICQoSEVMUF9GT1JNQVQpIiAiJChzdWJzdCBoZWxwXywsJEApIC0gIiBcCisJIkJ1aWxkIHRoZSBlbnRpcmUgamRrIGJ1dCBub3QgdGhlIGltYWdlcyIKK2hlbHBfaW1hZ2VzOgorCUAkKFBSSU5URikgIiMgICAkKEhFTFBfRk9STUFUKSIgIiQoc3Vic3QgaGVscF8sLCRAKSAtICIgXAorCSJDcmVhdGUgdGhlIGpkayBpbWFnZXMgZm9yIHRoZSBidWlsZHMiCitoZWxwX2RlcGxveToKKwlAJChQUklOVEYpICIjICAgJChIRUxQX0ZPUk1BVCkiICIkKHN1YnN0IGhlbHBfLCwkQCkgLSAiIFwKKwkiQ3JlYXRlIHRoZSBqZGsgZGVwbG95IGltYWdlcyBmcm9tIHRoZSBqZGsgaW1hZ2VzIgoraGVscF9pbnN0YWxsOgorCUAkKFBSSU5URikgIiMgICAkKEhFTFBfRk9STUFUKSIgIiQoc3Vic3QgaGVscF8sLCRAKSAtICIgXAorCSJDcmVhdGUgdGhlIGpkayBpbnN0YWxsIGJ1bmRsZXMgZnJvbSB0aGUgZGVwbG95IGltYWdlcyIKK2hlbHBfY2xlYW46CisJQCQoUFJJTlRGKSAiIyAgICQoSEVMUF9GT1JNQVQpIiAiJChzdWJzdCBoZWxwXywsJEApIC0gIiBcCisJIkNsZWFuIGFuZCBwcmVwYXJlIGZvciBhIGZyZXNoIGJ1aWxkIGZyb20gc2NyYXRjaCIKK2hlbHBfY2xvYmJlcjoKKwlAJChQUklOVEYpICIjICAgJChIRUxQX0ZPUk1BVCkiICIkKHN1YnN0IGhlbHBfLCwkQCkgLSAiIFwKKwkiQ2xlYW4gYW5kIGFsc28gcHVyZ2UgYW55IGhpZGRlbiBkZXJpdmVkIGRhdGEiCitoZWxwX2NoZWNrczoKKwlAJChQUklOVEYpICIjICAgJChIRUxQX0ZPUk1BVCkiICIkKHN1YnN0IGhlbHBfLCwkQCkgLSAiIFwKKwkiUGVyZm9ybSB2YXJpb3VzIGNoZWNrcyB0byBtYWtlIHN1cmUgd2UgY2FuIGJ1aWxkIgoraGVscF9zYW5pdHk6CisJQCQoUFJJTlRGKSAiIyAgICQoSEVMUF9GT1JNQVQpIiAiJChzdWJzdCBoZWxwXywsJEApIC0gIiBcCisJIlNhbWUgYXMgJ21ha2UgY2hlY2tzJyIKK2hlbHBfamF2YWRvY3M6CisJQCQoUFJJTlRGKSAiIyAgICQoSEVMUF9GT1JNQVQpIiAiJChzdWJzdCBoZWxwXywsJEApIC0gIiBcCisJIkJ1aWxkIHRoZSBqYXZhZG9jcyIKK2hlbHBfaGVscDoKKwlAJChQUklOVEYpICIjICAgJChIRUxQX0ZPUk1BVCkiICIkKHN1YnN0IGhlbHBfLCwkQCkgLSAiIFwKKwkiUHJpbnQgb3V0IHRoZSBoZWxwIG1lc3NhZ2VzIgorCisjIEtlZXAgdHJhY2sgb2YgdXNlciB0YXJnZXRzCitVU0VSX1RBUkdFVFMgKz0gaGVscAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMgUGhvbnkgdGFyZ2V0cwotLlBIT05ZOiAkKFBIT05ZX0xJU1QpCisuUEhPTlk6ICQoUEhPTllfTElTVCkgJChVU0VSX1RBUkdFVFMpCiAKICMgRm9yY2UgdGFyZ2V0CiBGUkM6Ci0KZGlmZiAtLWdpdCBhL2NvbW1vbi9hdXRvY29uZi9NYWtlZmlsZS5pbiBiL2NvbW1vbi9hdXRvY29uZi9NYWtlZmlsZS5pbgppbmRleCA2MjlmYWRmLi5kMWYxNDg2IDEwMDY0NAotLS0gYS9jb21tb24vYXV0b2NvbmYvTWFrZWZpbGUuaW4KKysrIGIvY29tbW9uL2F1dG9jb25mL01ha2VmaWxlLmluCkBAIC0yMSw2ICsyMSw3IEBACiAjIHF1ZXN0aW9ucy4KICMKIAotIyBHZW5lcmF0ZWQgTWFrZWZpbGUgQERBVEVfV0hFTl9DT05GSUdVUkVEQAorIyBUaGlzIE1ha2VmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgY29uZmlndXJlIEBEQVRFX1dIRU5fQ09ORklHVVJFREAKKyMgR0VORVJBVEVEIEZJTEUsIERPIE5PVCBFRElUCiBTUEVDOj1AT1VUUFVUX1JPT1RAL3NwZWMuZ21rCiBpbmNsdWRlIEBTUkNfUk9PVEAvY29tbW9uL21ha2VmaWxlcy9NYWtlZmlsZQpkaWZmIC0tZ2l0IGEvY29tbW9uL2F1dG9jb25mL2F1dG9nZW4uc2ggYi9jb21tb24vYXV0b2NvbmYvYXV0b2dlbi5zaAppbmRleCAxYWI1NWY3Li5kNGRhOTBjIDEwMDY0NAotLS0gYS9jb21tb24vYXV0b2NvbmYvYXV0b2dlbi5zaAorKysgYi9jb21tb24vYXV0b2NvbmYvYXV0b2dlbi5zaApAQCAtMSw0ICsxLDQgQEAKLSMhL2Jpbi9zaAorIyEvYmluL2Jhc2gKICMKICMgQ29weXJpZ2h0IChjKSAyMDExLCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogIyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCkBAIC0yOSwxNCArMjksMTEgQEAKICAgIyBkYXRlICslcyBpcyBub3QgYXZhaWxhYmxlIG9uIFNvbGFyaXMsIHVzZSB0aGlzIHdvcmthcm91bmQKICAgIyBmcm9tIGh0dHA6Ly9zb2xhcmlzamVkaS5ibG9nc3BvdC5jby51ay8yMDA2LzA2L3NvbGFyaXMtZGF0ZS1jb21tYW5kLWFuZC1lcG9jaC10aW1lLmh0bWwKICAgVElNRVNUQU1QPWAvdXNyL2Jpbi90cnVzcyAvdXNyL2Jpbi9kYXRlIDI+JjEgfCAgbmF3ayAtRj0gJy9edGltZVwoXCkvIHtnc3ViKC8gLywiIiwkMik7cHJpbnQgJDJ9J2AKLSAgIyBPbiBTb2xhcmlzIC9iaW4vc2ggZG9lc24ndCBzdXBwb3J0IHRlc3QgLWUgYnV0IC91c3IvYmluL3Rlc3QgZG9lcy4KLSAgVEVTVD1gd2hpY2ggdGVzdGAKIGVsc2UKICAgVElNRVNUQU1QPWBkYXRlICslc2AKLSAgVEVTVD0idGVzdCIKIGZpCiAKLWlmICRURVNUICIkQ1VTVE9NX0NPTkZJR19ESVIiID0gIiI7IHRoZW4KK2lmIHRlc3QgIngkQ1VTVE9NX0NPTkZJR19ESVIiID0gIngiOyB0aGVuCiAgIGN1c3RvbV9zY3JpcHRfZGlyPSIkc2NyaXB0X2Rpci8uLi8uLi9qZGsvbWFrZS9jbG9zZWQvYXV0b2NvbmYiCiBlbHNlCiAgIGN1c3RvbV9zY3JpcHRfZGlyPSRDVVNUT01fQ09ORklHX0RJUgpAQCAtNDQsMTYgKzQxLDIyIEBACiAKIGN1c3RvbV9ob29rPSRjdXN0b21fc2NyaXB0X2Rpci9jdXN0b20taG9vay5tNAogCitpZiB0ZXN0ICJ4YHdoaWNoIGF1dG9jb25mIDI+IC9kZXYvbnVsbGAiID0geDsgdGhlbgorICBlY2hvIFlvdSBuZWVkIGF1dG9jb25mIGluc3RhbGxlZCB0byBiZSBhYmxlIHRvIHJlZ2VuZXJhdGUgdGhlIGNvbmZpZ3VyZSBzY3JpcHQKKyAgZWNobyBFcnJvcjogQ2Fubm90IGZpbmQgYXV0b2NvbmYgMT4mMgorICBleGl0IDEKK2ZpCisKIGVjaG8gR2VuZXJhdGluZyBnZW5lcmF0ZWQtY29uZmlndXJlLnNoCiBjYXQgJHNjcmlwdF9kaXIvY29uZmlndXJlLmFjICB8IHNlZCAtZSAic3xAREFURV9XSEVOX0dFTkVSQVRFREB8JFRJTUVTVEFNUHwiIHwgYXV0b2NvbmYgLVcgYWxsIC1JJHNjcmlwdF9kaXIgLSA+ICRzY3JpcHRfZGlyL2dlbmVyYXRlZC1jb25maWd1cmUuc2gKIHJtIC1yZiBhdXRvbTR0ZS5jYWNoZQogCi1pZiAkVEVTVCAtZSAkY3VzdG9tX2hvb2s7IHRoZW4KK2lmIHRlc3QgLWUgJGN1c3RvbV9ob29rOyB0aGVuCiAgIGVjaG8gR2VuZXJhdGluZyBjdXN0b20gZ2VuZXJhdGVkLWNvbmZpZ3VyZS5zaAogICAjIFdlIGhhdmUgY3VzdG9tIHNvdXJjZXMgYXZhaWxhYmxlOyBhbHNvIGdlbmVyYXRlIGNvbmZpZ3VyZSBzY3JpcHQKICAgIyB3aXRoIGN1c3RvbSBob29rcyBjb21waWxlZCBpbi4KICAgY2F0ICRzY3JpcHRfZGlyL2NvbmZpZ3VyZS5hYyB8IHNlZCAtZSAic3xAREFURV9XSEVOX0dFTkVSQVRFREB8JFRJTUVTVEFNUHwiIHwgXAotICAgIHNlZCAtZSAic3xBQ19ERUZVTl9PTkNFKFxbQ1VTVE9NX0hPT0tcXSl8bTRfaW5jbHVkZShbJGN1c3RvbV9ob29rXSl8IiB8IGF1dG9jb25mIC1XIGFsbCAtSSRzY3JpcHRfZGlyIC0gPiAkY3VzdG9tX3NjcmlwdF9kaXIvZ2VuZXJhdGVkLWNvbmZpZ3VyZS5zaAorICAgIHNlZCAtZSAic3wjQ1VTVE9NX0FVVE9DT05GX0lOQ0xVREV8bTRfaW5jbHVkZShbJGN1c3RvbV9ob29rXSl8IiB8IGF1dG9jb25mIC1XIGFsbCAtSSRzY3JpcHRfZGlyIC0gPiAkY3VzdG9tX3NjcmlwdF9kaXIvZ2VuZXJhdGVkLWNvbmZpZ3VyZS5zaAogICBybSAtcmYgYXV0b200dGUuY2FjaGUKIGVsc2UKICAgZWNobyBObyBjdXN0b20gaG9vayBmb3VuZDogICRjdXN0b21faG9vawpkaWZmIC0tZ2l0IGEvY29tbW9uL2F1dG9jb25mL2Jhc2ljcy5tNCBiL2NvbW1vbi9hdXRvY29uZi9iYXNpY3MubTQKaW5kZXggZTBlN2NmNi4uY2JmYWUzOSAxMDA2NDQKLS0tIGEvY29tbW9uL2F1dG9jb25mL2Jhc2ljcy5tNAorKysgYi9jb21tb24vYXV0b2NvbmYvYmFzaWNzLm00CkBAIC0zNCw4NCArMzQsMTAyIEBACiAgICAgZmkKIF0pCiAKLUFDX0RFRlVOKFtTRVRfRlVMTF9QQVRIXSwKKyMgVGhpcyB3aWxsIG1ha2Ugc3VyZSB0aGUgZ2l2ZW4gdmFyaWFibGUgcG9pbnRzIHRvIGEgZnVsbCBhbmQgcHJvcGVyCisjIHBhdGguIFRoaXMgbWVhbnM6CisjIDEpIFRoZXJlIHdpbGwgYmUgbm8gc3BhY2VzIGluIHRoZSBwYXRoLiBPbiBwb3NpeCBwbGF0Zm9ybXMsCisjICAgIHNwYWNlcyBpbiB0aGUgcGF0aCB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvci4gT24gV2luZG93cywKKyMgICAgdGhlIHBhdGggd2lsbCBiZSByZXdyaXR0ZW4gdXNpbmcgc2hvcnQtc3R5bGUgdG8gYmUgc3BhY2UtZnJlZS4KKyMgMikgVGhlIHBhdGggd2lsbCBiZSBhYnNvbHV0ZSwgYW5kIGl0IHdpbGwgYmUgaW4gdW5peC1zdHlsZSAob24KKyMgICAgIGN5Z3dpbikuCisjICQxOiBUaGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdG8gZml4CitBQ19ERUZVTihbQkFTSUNfRklYVVBfUEFUSF0sCiBbCi0gICAgIyBUcmFuc2xhdGUgImdjYyAtRSIgaW50byAiYHdoaWNoIGdjY2AgLUUiIGllCi0gICAgIyBleHRyYWN0IHRoZSBmdWxsIHBhdGggdG8gdGhlIGJpbmFyeSBhbmQgYXQgdGhlCi0gICAgIyBzYW1lIHRpbWUgbWFpbnRhaW4gYW55IGFyZ3VtZW50cyBwYXNzZWQgdG8gaXQuCi0gICAgIyBUaGUgY29tbWFuZCBNVVNUIGV4aXN0IGluIHRoZSBwYXRoLCBvciBlbHNlIQotICAgIHRtcD0iWyRdJDEiCi0gICAgY2FyPSIke3RtcCUlICp9IgotICAgIHRtcD0iWyRdJDEgRU9MIgotICAgIGNkcj0iJHt0bXAjKiB9IgotICAgICMgT24gd2luZG93cyB3ZSB3YW50IHBhdGhzIHdpdGhvdXQgc3BhY2VzLgotICAgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PUyIgPSAieHdpbmRvd3MiOyB0aGVuCi0gICAgICAgIFNFVF9GVUxMX1BBVEhfU1BBQ0VTQUZFKGNhcikKLSAgICBlbHNlCi0gICAgICAgICMgIndoaWNoIiBpcyBub3QgcG9ydGFibGUsIGJ1dCBpcyB1c2VkIGhlcmUKLSAgICAgICAgIyBiZWNhdXNlIHdlIGtub3cgdGhhdCB0aGUgY29tbWFuZCBleGlzdHMhCi0gICAgICAgIGNhcj1gd2hpY2ggJGNhcmAKLSAgICBmaQotICAgIGlmIHRlc3QgIngkY2RyIiAhPSB4RU9MOyB0aGVuCi0gICAgICAgICQxPSIkY2FyICR7Y2RyJSAqfSIKLSAgICBlbHNlCi0gICAgICAgICQxPSIkY2FyIgotICAgIGZpCi1dKQotCi1BQ19ERUZVTihbU1BBQ0VTQUZFXSwKLVsKLSAgICAjIEZhaWwgd2l0aCBtZXNzYWdlICQyIGlmIHZhciAkMSBjb250YWlucyBhIHBhdGggd2l0aCBubyBzcGFjZXMgaW4gaXQuCi0gICAgIyBVbmxlc3Mgb24gV2luZG93cywgd2hlcmUgd2UgY2FuIHJld3JpdGUgdGhlIHBhdGguCi0gICAgSEFTX1NQQUNFPWBlY2hvICJbJF0kMSIgfCBncmVwICIgImAKLSAgICBpZiB0ZXN0ICJ4JEhBU19TUEFDRSIgIT0geDsgdGhlbgotICAgICAgICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1MiID0gInh3aW5kb3dzIjsgdGhlbgotICAgICAgICAgICAgIyBGaXJzdCBjb252ZXJ0IGl0IHRvIERPUy1zdHlsZSwgc2hvcnQgbW9kZSAobm8gc3BhY2VzKQotICAgICAgICAgICAgJDE9YCRDWUdQQVRIIC1zIC1tIC1hICJbJF0kMSJgCi0gICAgICAgICAgICAjIE5vdyBpdCdzIGNhc2UgaW5zZW5zaXRpdmU7IGxldCdzIG1ha2UgaXQgbG93ZXJjYXNlIHRvIGltcHJvdmUgcmVhZGFiaWxpdHkKLSAgICAgICAgICAgICQxPWAkRUNITyAiWyRdJDEiIHwgJFRSICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZxeHl6J2AKLSAgICAgICAgICAgICMgTm93IGNvbnZlcnQgaXQgYmFjayB0byBVbml4LXN0aWxlIChjeWdwYXRoKQotICAgICAgICAgICAgJDE9YCRDWUdQQVRIIC11ICJbJF0kMSJgCi0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIEFDX01TR19FUlJPUihbWW91IGNhbm5vdCBoYXZlIHNwYWNlcyBpbiAkMiEgIlskXSQxIl0pCi0gICAgICAgIGZpCi0gICAgZmkKLV0pCi0KLUFDX0RFRlVOKFtTRVRfRlVMTF9QQVRIX1NQQUNFU0FGRV0sCi1bCi0gICAgIyBUcmFuc2xhdGUgbG9uZyBjeWdkcml2ZSBvciBDOlxzZGZzZiBwYXRoCi0gICAgIyBpbnRvIGEgc2hvcnQgbWl4ZWQgbW9kZSBwYXRoIHRoYXQgaGFzIG5vCi0gICAgIyBzcGFjZXMgaW4gaXQuCi0gICAgdG1wPSJbJF0kMSIKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorICAgIEJBU0lDX0ZJWFVQX1BBVEhfQ1lHV0lOKCQxKQorICBlbGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLm1zeXMiOyB0aGVuCisgICAgQkFTSUNfRklYVVBfUEFUSF9NU1lTKCQxKQorICBlbHNlCisgICAgIyBXZSdyZSBvbiBhIHBvc2l4IHBsYXRmb3JtLiBIb29yYXkhIDopCisgICAgcGF0aD0iWyRdJDEiCiAgICAgCi0gICAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TIiA9ICJ4d2luZG93cyI7IHRoZW4KLSAgICAgICAgdG1wPWAkQ1lHUEFUSCAtdSAiWyRdJDEiYAotICAgICAgICB0bXA9YHdoaWNoICIkdG1wImAKLSAgICAgICAgIyBJZiBmaWxlIGV4aXN0cyB3aXRoIC5leGUgYXBwZW5kZWQsIHRoYXQncyB0aGUgcmVhbCBmaWxlbmFtZQotICAgICAgICAjIGFuZCBjeWdwYXRoIG5lZWRzIHRoYXQgdG8gY29udmVydCB0byBzaG9ydCBzdHlsZSBwYXRoLgotICAgICAgICBpZiB0ZXN0IC1mICIke3RtcH0uZXhlIjsgdGhlbgotICAgICAgICAgICB0bXA9IiR7dG1wfS5leGUiCi0gICAgICAgIGVsaWYgdGVzdCAtZiAiJHt0bXB9LmNtZCI7IHRoZW4KLSAgICAgICAgICAgdG1wPSIke3RtcH0uY21kIgotICAgICAgICBmaQotICAgICAgICAjIENvbnZlcnQgdG8gQzovIG1peGVkIHN0eWxlIHBhdGggd2l0aG91dCBzcGFjZXMuCi0gICAgICAgICB0bXA9YCRDWUdQQVRIIC1zIC1tICIkdG1wImAKKyAgICBpZiB0ZXN0ICEgLWYgIiRwYXRoIiAmJiB0ZXN0ICEgLWQgIiRwYXRoIjsgdGhlbgorICAgICAgQUNfTVNHX0VSUk9SKFtUaGUgcGF0aCBvZiAkMSwgd2hpY2ggcmVzb2x2ZXMgYXMgIiRwYXRoIiwgaXMgbm90IGZvdW5kLl0pCiAgICAgZmkKLSAgICAkMT0iJHRtcCIKKworICAgIGhhc19zcGFjZT1gJEVDSE8gIiRwYXRoIiB8ICRHUkVQICIgImAKKyAgICBpZiB0ZXN0ICJ4JGhhc19zcGFjZSIgIT0geDsgdGhlbgorICAgICAgQUNfTVNHX05PVElDRShbVGhlIHBhdGggb2YgJDEsIHdoaWNoIHJlc29sdmVzIGFzICIkcGF0aCIsIGlzIGludmFsaWQuXSkKKyAgICAgIEFDX01TR19FUlJPUihbU3BhY2VzIGFyZSBub3QgYWxsb3dlZCBpbiB0aGlzIHBhdGguXSkKKyAgICBmaQorICBmaQogXSkKIAotQUNfREVGVU4oW1JFTU9WRV9TWU1CT0xJQ19MSU5LU10sCisjIFRoaXMgd2lsbCBtYWtlIHN1cmUgdGhlIGdpdmVuIHZhcmlhYmxlIHBvaW50cyB0byBhIGV4ZWN1dGFibGUKKyMgd2l0aCBhIGZ1bGwgYW5kIHByb3BlciBwYXRoLiBUaGlzIG1lYW5zOgorIyAxKSBUaGVyZSB3aWxsIGJlIG5vIHNwYWNlcyBpbiB0aGUgcGF0aC4gT24gcG9zaXggcGxhdGZvcm1zLAorIyAgICBzcGFjZXMgaW4gdGhlIHBhdGggd2lsbCByZXN1bHQgaW4gYW4gZXJyb3IuIE9uIFdpbmRvd3MsCisjICAgIHRoZSBwYXRoIHdpbGwgYmUgcmV3cml0dGVuIHVzaW5nIHNob3J0LXN0eWxlIHRvIGJlIHNwYWNlLWZyZWUuCisjIDIpIFRoZSBwYXRoIHdpbGwgYmUgYWJzb2x1dGUsIGFuZCBpdCB3aWxsIGJlIGluIHVuaXgtc3R5bGUgKG9uCisjICAgICBjeWd3aW4pLgorIyBBbnkgYXJndW1lbnRzIGdpdmVuIHRvIHRoZSBleGVjdXRhYmxlIGlzIHByZXNlcnZlZC4KKyMgSWYgdGhlIGlucHV0IHZhcmlhYmxlIGRvZXMgbm90IGhhdmUgYSBkaXJlY3Rvcnkgc3BlY2lmaWNhdGlvbiwgdGhlbgorIyBpdCBuZWVkIHRvIGJlIGluIHRoZSBQQVRILgorIyAkMTogVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIGZpeAorQUNfREVGVU4oW0JBU0lDX0ZJWFVQX0VYRUNVVEFCTEVdLAorWworICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5jeWd3aW4iOyB0aGVuCisgICAgQkFTSUNfRklYVVBfRVhFQ1VUQUJMRV9DWUdXSU4oJDEpCisgIGVsaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MubXN5cyI7IHRoZW4KKyAgICBCQVNJQ19GSVhVUF9FWEVDVVRBQkxFX01TWVMoJDEpCisgIGVsc2UKKyAgICAjIFdlJ3JlIG9uIGEgcG9zaXggcGxhdGZvcm0uIEhvb3JheSEgOikKKyAgICAjIEZpcnN0IHNlcGFyYXRlIHRoZSBwYXRoIGZyb20gdGhlIGFyZ3VtZW50cy4gVGhpcyB3aWxsIHNwbGl0IGF0IHRoZSBmaXJzdAorICAgICMgc3BhY2UuCisgICAgY29tcGxldGU9IlskXSQxIgorICAgIHBhdGg9IiR7Y29tcGxldGUlJSAqfSIKKyAgICB0bXA9IiRjb21wbGV0ZSBFT0wiCisgICAgYXJndW1lbnRzPSIke3RtcCMqIH0iCisKKyAgICBuZXdfcGF0aD1gJFdISUNIICRwYXRoIDI+IC9kZXYvbnVsbGAKKyAgICBpZiB0ZXN0ICJ4JG5ld19wYXRoIiA9IHg7IHRoZW4KKyAgICAgIGlzX2Fic29sdXRlX3BhdGg9YCRFQ0hPICIkcGF0aCIgfCAkR1JFUCBeL2AKKyAgICAgIGlmIHRlc3QgIngkaXNfYWJzb2x1dGVfcGF0aCIgIT0geDsgdGhlbgorICAgICAgICBBQ19NU0dfTk9USUNFKFtSZXNvbHZpbmcgJDEgKGFzICRwYXRoKSB3aXRoICd3aGljaCcgZmFpbGVkLCB1c2luZyAkcGF0aCBkaXJlY3RseS5dKQorICAgICAgICBuZXdfcGF0aD0iJHBhdGgiCisgICAgICBlbHNlCisgICAgICAgIEFDX01TR19OT1RJQ0UoW1RoZSBwYXRoIG9mICQxLCB3aGljaCByZXNvbHZlcyBhcyAiJGNvbXBsZXRlIiwgaXMgbm90IGZvdW5kLl0pCisgICAgICAgIGhhc19zcGFjZT1gJEVDSE8gIiRjb21wbGV0ZSIgfCAkR1JFUCAiICJgCisgICAgICAgIGlmIHRlc3QgIngkaGFzX3NwYWNlIiAhPSB4OyB0aGVuCisgICAgICAgICAgQUNfTVNHX05PVElDRShbVGhpcyBtaWdodCBiZSBjYXVzZWQgYnkgc3BhY2VzIGluIHRoZSBwYXRoLCB3aGljaCBpcyBub3QgYWxsb3dlZC5dKQorICAgICAgICBmaQorICAgICAgICBBQ19NU0dfRVJST1IoW0Nhbm5vdCBsb2NhdGUgdGhlIHRoZSBwYXRoIG9mICQxXSkKKyAgICAgIGZpCisgICAgZmkKKyAgZmkKKworICAjIE5vdyBqb2luIHRvZ2V0aGVyIHRoZSBwYXRoIGFuZCB0aGUgYXJndW1lbnRzIG9uY2UgYWdhaW4KKyAgaWYgdGVzdCAieCRhcmd1bWVudHMiICE9IHhFT0w7IHRoZW4KKyAgICAgIG5ld19jb21wbGV0ZT0iJG5ld19wYXRoICR7YXJndW1lbnRzJSAqfSIKKyAgZWxzZQorICAgICAgbmV3X2NvbXBsZXRlPSIkbmV3X3BhdGgiCisgIGZpCisKKyAgaWYgdGVzdCAieCRjb21wbGV0ZSIgIT0gIngkbmV3X2NvbXBsZXRlIjsgdGhlbgorICAgICQxPSIkbmV3X2NvbXBsZXRlIgorICAgIEFDX01TR19OT1RJQ0UoW1Jld3JpdGluZyAkMSB0byAiJG5ld19jb21wbGV0ZSJdKQorICBmaQorXSkKKworQUNfREVGVU4oW0JBU0lDX1JFTU9WRV9TWU1CT0xJQ19MSU5LU10sCiBbCiAgICAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TIiAhPSB4d2luZG93czsgdGhlbgogICAgICAgICAjIEZvbGxvdyBhIGNoYWluIG9mIHN5bWJvbGljIGxpbmtzLiBVc2UgcmVhZGxpbmsKICAgICAgICAgIyB3aGVyZSBpdCBleGlzdHMsIGVsc2UgZmFsbCBiYWNrIHRvIGhvcnJpYmx5CiAgICAgICAgICMgY29tcGxpY2F0ZWQgc2hlbGwgY29kZS4KLSAgICAgICAgQUNfUEFUSF9QUk9HKFJFQURMSU5LLCByZWFkbGluaykKICAgICAgICAgaWYgdGVzdCAieCRSRUFETElOS19URVNURUQiICE9IHllczsgdGhlbgogICAgICAgICAgICAgIyBPbiBNYWNPU1ggdGhlcmUgaXMgYSByZWFkbGluayB0b29sIHdpdGggYSBkaWZmZXJlbnQKICAgICAgICAgICAgICMgcHVycG9zZSB0aGFuIHRoZSBHTlUgcmVhZGxpbmsgdG9vbC4gQ2hlY2sgdGhlIGZvdW5kIHJlYWRsaW5rLgotICAgICAgICAgICAgSVNHTlU9YCRSRUFETElOSyAtLWhlbHAgMj4mMSB8IGdyZXAgR05VYAorICAgICAgICAgICAgSVNHTlU9YCRSRUFETElOSyAtLWhlbHAgMj4mMSB8ICRHUkVQIEdOVWAKICAgICAgICAgICAgIGlmIHRlc3QgIngkSVNHTlUiID0geDsgdGhlbgogICAgICAgICAgICAgICAgICAjIEEgcmVhZGxpbmsgdGhhdCB3ZSBkbyBub3Qga25vdyBob3cgdG8gdXNlLgogICAgICAgICAgICAgICAgICAjIEFyZSB0aGVyZSBvdGhlciBub24tR05VIHJlYWRsaW5rcyBvdXQgdGhlcmU/CkBAIC0xMjUsMjMgKzE0MywyNSBAQAogICAgICAgICBlbHNlCiAgICAgICAgICAgICBTVEFSVERJUj0kUFdECiAgICAgICAgICAgICBDT1VOVEVSPTAKLSAgICAgICAgICAgIERJUj1gZGlybmFtZSBbJF0kMWAKLSAgICAgICAgICAgIEZJTD1gYmFzZW5hbWUgWyRdJDFgCisgICAgICAgICAgICBzeW1fbGlua19kaXI9YCRESVJOQU1FIFskXSQxYAorICAgICAgICAgICAgc3ltX2xpbmtfZmlsZT1gJEJBU0VOQU1FIFskXSQxYAogICAgICAgICAgICAgd2hpbGUgdGVzdCAkQ09VTlRFUiAtbHQgMjA7IGRvCi0gICAgICAgICAgICAgICAgSVNMSU5LPWBscyAtbCAkRElSLyRGSUwgfCBncmVwICdcLT4nIHwgc2VkIC1lICdzLy4qLT4gXCguKlwpL1wxLydgCisgICAgICAgICAgICAgICAgSVNMSU5LPWAkTFMgLWwgJHN5bV9saW5rX2Rpci8kc3ltX2xpbmtfZmlsZSB8ICRHUkVQICdcLT4nIHwgJFNFRCAtZSAncy8uKi0+IFwoLipcKS9cMS8nYAogICAgICAgICAgICAgICAgIGlmIHRlc3QgIngkSVNMSU5LIiA9PSB4OyB0aGVuCiAgICAgICAgICAgICAgICAgICAgICMgVGhpcyBpcyBub3QgYSBzeW1ib2xpYyBsaW5rISBXZSBhcmUgZG9uZSEKICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgICBmaQogICAgICAgICAgICAgICAgICMgVGhlIGxpbmsgbWlnaHQgYmUgcmVsYXRpdmUhIFdlIGhhdmUgdG8gdXNlIGNkIHRvIHRyYXZlbCBzYWZlbHkuCi0gICAgICAgICAgICAgICAgY2QgJERJUgotICAgICAgICAgICAgICAgIGNkIGBkaXJuYW1lICRJU0xJTktgCi0gICAgICAgICAgICAgICAgRElSPWBwd2RgCi0gICAgICAgICAgICAgICAgRklMPWBiYXNlbmFtZSAkSVNMSU5LYAorICAgICAgICAgICAgICAgIGNkICRzeW1fbGlua19kaXIKKyAgICAgICAgICAgICAgICAjIC4uLiBhbmQgd2UgbXVzdCBnZXQgdGhlIHRvIHRoZSBhYnNvbHV0ZSBwYXRoLCBub3Qgb25lIHVzaW5nIHN5bWJvbGljIGxpbmtzLiAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBjZCBgcHdkIC1QYAorICAgICAgICAgICAgICAgIGNkIGAkRElSTkFNRSAkSVNMSU5LYAorICAgICAgICAgICAgICAgIHN5bV9saW5rX2Rpcj1gJFRIRVBXRENNRGAKKyAgICAgICAgICAgICAgICBzeW1fbGlua19maWxlPWAkQkFTRU5BTUUgJElTTElOS2AKICAgICAgICAgICAgICAgICBsZXQgQ09VTlRFUj1DT1VOVEVSKzEKICAgICAgICAgICAgIGRvbmUKICAgICAgICAgICAgIGNkICRTVEFSVERJUgotICAgICAgICAgICAgJDE9JERJUi8kRklMCisgICAgICAgICAgICAkMT0kc3ltX2xpbmtfZGlyLyRzeW1fbGlua19maWxlCiAgICAgICAgIGZpCiAgICAgZmkKIF0pCkBAIC0xNTIsNiArMTcyLDEwNyBAQAogQUNfU1VCU1QoQ09ORklHVVJFX0NPTU1BTkRfTElORSkKIERBVEVfV0hFTl9DT05GSUdVUkVEPWBMQU5HPUMgZGF0ZWAKIEFDX1NVQlNUKERBVEVfV0hFTl9DT05GSUdVUkVEKQorQUNfTVNHX05PVElDRShbQ29uZmlndXJhdGlvbiBjcmVhdGVkIGF0ICREQVRFX1dIRU5fQ09ORklHVVJFRC5dKQorQUNfTVNHX05PVElDRShbY29uZmlndXJlIHNjcmlwdCBnZW5lcmF0ZWQgYXQgdGltZXN0YW1wICREQVRFX1dIRU5fR0VORVJBVEVELl0pCitdKQorCisjIFRlc3QgdGhhdCB2YXJpYWJsZSAkMSBkZW5vdGluZyBhIHByb2dyYW0gaXMgbm90IGVtcHR5LiBJZiBlbXB0eSwgZXhpdCB3aXRoIGFuIGVycm9yLgorIyAkMTogdmFyaWFibGUgdG8gY2hlY2sKKyMgJDI6IGV4ZWN1dGFibGUgbmFtZSB0byBwcmludCBpbiB3YXJuaW5nIChvcHRpb25hbCkKK0FDX0RFRlVOKFtCQVNJQ19DSEVDS19OT05FTVBUWV0sCitbCisgICAgaWYgdGVzdCAieFskXSQxIiA9IHg7IHRoZW4KKyAgICAgICAgaWYgdGVzdCAieCQyIiA9IHg7IHRoZW4KKyAgICAgICAgICBQUk9HX05BTUU9dHJhbnNsaXQoJDEsQS1aLGEteikKKyAgICAgICAgZWxzZQorICAgICAgICAgIFBST0dfTkFNRT0kMgorICAgICAgICBmaQorICAgICAgICBBQ19NU0dfTk9USUNFKFtDb3VsZCBub3QgZmluZCAkUFJPR19OQU1FIV0pCisgICAgICAgIEFDX01TR19FUlJPUihbQ2Fubm90IGNvbnRpbnVlXSkKKyAgICBmaQorXSkKKworIyBEb2VzIEFDX1BBVEhfUFJPRyBmb2xsb3dlZCBieSBCQVNJQ19DSEVDS19OT05FTVBUWS4KKyMgQXJndW1lbnRzIGFzIEFDX1BBVEhfUFJPRzoKKyMgJDE6IHZhcmlhYmxlIHRvIHNldAorIyAkMjogZXhlY3V0YWJsZSBuYW1lIHRvIGxvb2sgZm9yCitBQ19ERUZVTihbQkFTSUNfUkVRVUlSRV9QUk9HXSwKK1sKKyAgICBBQ19QQVRIX1BST0dTKCQxLCAkMikKKyAgICBCQVNJQ19DSEVDS19OT05FTVBUWSgkMSwgJDIpCitdKQorCisjIFNldHVwIHRoZSBtb3N0IGZ1bmRhbWVudGFsIHRvb2xzIHRoYXQgcmVsaWVzIG9uIG5vdCBtdWNoIGVsc2UgdG8gc2V0IHVwLAorIyBidXQgaXMgdXNlZCBieSBtdWNoIG9mIHRoZSBlYXJseSBib290c3RyYXAgY29kZS4KK0FDX0RFRlVOX09OQ0UoW0JBU0lDX1NFVFVQX0ZVTkRBTUVOVEFMX1RPT0xTXSwKK1sKKworIyBTdGFydCB3aXRoIHRvb2xzIHRoYXQgZG8gbm90IG5lZWQgaGF2ZSBjcm9zcyBjb21waWxhdGlvbiBzdXBwb3J0CisjIGFuZCBjYW4gYmUgZXhwZWN0ZWQgdG8gYmUgZm91bmQgaW4gdGhlIGRlZmF1bHQgUEFUSC4gVGhlc2UgdG9vbHMgYXJlCisjIHVzZWQgYnkgY29uZmlndXJlLiBOb3IgYXJlIHRoZXNlIHRvb2xzIGV4cGVjdGVkIHRvIGJlIGZvdW5kIGluIHRoZQorIyBkZXZraXQgZnJvbSB0aGUgYnVpbGRkZXBzIHNlcnZlciBlaXRoZXIsIHNpbmNlIHRoZXkgYXJlCisjIG5lZWRlZCB0byBkb3dubG9hZCB0aGUgZGV2a2l0LgorCisjIEZpcnN0IGFyZSBhbGwgdGhlIHNpbXBsZSByZXF1aXJlZCB0b29scy4KK0JBU0lDX1JFUVVJUkVfUFJPRyhCQVNFTkFNRSwgYmFzZW5hbWUpCitCQVNJQ19SRVFVSVJFX1BST0coQkFTSCwgYmFzaCkKK0JBU0lDX1JFUVVJUkVfUFJPRyhDQVQsIGNhdCkKK0JBU0lDX1JFUVVJUkVfUFJPRyhDSE1PRCwgY2htb2QpCitCQVNJQ19SRVFVSVJFX1BST0coQ01QLCBjbXApCitCQVNJQ19SRVFVSVJFX1BST0coQ1AsIGNwKQorQkFTSUNfUkVRVUlSRV9QUk9HKENVVCwgY3V0KQorQkFTSUNfUkVRVUlSRV9QUk9HKERBVEUsIGRhdGUpCitCQVNJQ19SRVFVSVJFX1BST0coRElGRiwgW2dkaWZmIGRpZmZdKQorQkFTSUNfUkVRVUlSRV9QUk9HKERJUk5BTUUsIGRpcm5hbWUpCitCQVNJQ19SRVFVSVJFX1BST0coRUNITywgZWNobykKK0JBU0lDX1JFUVVJUkVfUFJPRyhFWFBSLCBleHByKQorQkFTSUNfUkVRVUlSRV9QUk9HKEZJTEUsIGZpbGUpCitCQVNJQ19SRVFVSVJFX1BST0coRklORCwgZmluZCkKK0JBU0lDX1JFUVVJUkVfUFJPRyhIRUFELCBoZWFkKQorQkFTSUNfUkVRVUlSRV9QUk9HKExOLCBsbikKK0JBU0lDX1JFUVVJUkVfUFJPRyhMUywgbHMpCitCQVNJQ19SRVFVSVJFX1BST0coTUtESVIsIG1rZGlyKQorQkFTSUNfUkVRVUlSRV9QUk9HKE1LVEVNUCwgbWt0ZW1wKQorQkFTSUNfUkVRVUlSRV9QUk9HKE1WLCBtdikKK0JBU0lDX1JFUVVJUkVfUFJPRyhQUklOVEYsIHByaW50ZikKK0JBU0lDX1JFUVVJUkVfUFJPRyhUSEVQV0RDTUQsIHB3ZCkKK0JBU0lDX1JFUVVJUkVfUFJPRyhSTSwgcm0pCitCQVNJQ19SRVFVSVJFX1BST0coU0gsIHNoKQorQkFTSUNfUkVRVUlSRV9QUk9HKFNPUlQsIHNvcnQpCitCQVNJQ19SRVFVSVJFX1BST0coVEFJTCwgdGFpbCkKK0JBU0lDX1JFUVVJUkVfUFJPRyhUQVIsIHRhcikKK0JBU0lDX1JFUVVJUkVfUFJPRyhURUUsIHRlZSkKK0JBU0lDX1JFUVVJUkVfUFJPRyhUT1VDSCwgdG91Y2gpCitCQVNJQ19SRVFVSVJFX1BST0coVFIsIHRyKQorQkFTSUNfUkVRVUlSRV9QUk9HKFVOQU1FLCB1bmFtZSkKK0JBU0lDX1JFUVVJUkVfUFJPRyhVTklRLCB1bmlxKQorQkFTSUNfUkVRVUlSRV9QUk9HKFdDLCB3YykKK0JBU0lDX1JFUVVJUkVfUFJPRyhXSElDSCwgd2hpY2gpCitCQVNJQ19SRVFVSVJFX1BST0coWEFSR1MsIHhhcmdzKQorCisjIFRoZW4gcmVxdWlyZWQgdG9vbHMgdGhhdCByZXF1aXJlIHNvbWUgc3BlY2lhbCB0cmVhdG1lbnQuCitBQ19QUk9HX0FXSworQkFTSUNfQ0hFQ0tfTk9ORU1QVFkoQVdLKQorQUNfUFJPR19HUkVQCitCQVNJQ19DSEVDS19OT05FTVBUWShHUkVQKQorQUNfUFJPR19FR1JFUAorQkFTSUNfQ0hFQ0tfTk9ORU1QVFkoRUdSRVApCitBQ19QUk9HX0ZHUkVQCitCQVNJQ19DSEVDS19OT05FTVBUWShGR1JFUCkKK0FDX1BST0dfU0VECitCQVNJQ19DSEVDS19OT05FTVBUWShTRUQpCisKK0FDX1BBVEhfUFJPR1MoTkFXSywgW25hd2sgZ2F3ayBhd2tdKQorQkFTSUNfQ0hFQ0tfTk9ORU1QVFkoTkFXSykKKworIyBBbHdheXMgZm9yY2Ugcm0uCitSTT0iJFJNIC1mIgorCisjIFRoZXNlIGFyZSBub3QgcmVxdWlyZWQgb24gYWxsIHBsYXRmb3JtcworQUNfUEFUSF9QUk9HKENZR1BBVEgsIGN5Z3BhdGgpCitBQ19QQVRIX1BST0coUkVBRExJTkssIHJlYWRsaW5rKQorQUNfUEFUSF9QUk9HKERGLCBkZikKK0FDX1BBVEhfUFJPRyhTRVRGSUxFLCBTZXRGaWxlKQogXSkKIAogIyBTZXR1cCBiYXNpYyBjb25maWd1cmF0aW9uIHBhdGhzLCBhbmQgcGxhdGZvcm0tc3BlY2lmaWMgc3R1ZmYgcmVsYXRlZCB0byBQQVRIcy4KQEAgLTE1OSw0NiArMjgwLDM3IEBACiBbCiAjIExvY2F0ZSB0aGUgZGlyZWN0b3J5IG9mIHRoaXMgc2NyaXB0LgogU0NSSVBUPSJbJF0wIgotUkVNT1ZFX1NZTUJPTElDX0xJTktTKFNDUklQVCkKLUFVVE9DT05GX0RJUj1gZGlybmFtZSBbJF0wYAorQkFTSUNfUkVNT1ZFX1NZTUJPTElDX0xJTktTKFNDUklQVCkKK0FVVE9DT05GX0RJUj1gY2QgXGAkRElSTkFNRSAkU0NSSVBUXGA7ICRUSEVQV0RDTURgCiAKICMgV2hlcmUgaXMgdGhlIHNvdXJjZT8gSXQgaXMgbG9jYXRlZCB0d28gbGV2ZWxzIGFib3ZlIHRoZSBjb25maWd1cmUgc2NyaXB0LgogQ1VSRElSPSIkUFdEIgogY2QgIiRBVVRPQ09ORl9ESVIvLi4vLi4iCiBTUkNfUk9PVD0iYHB3ZGAiCi1pZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1MiID0gInh3aW5kb3dzIjsgdGhlbgotICAgIFNSQ19ST09UX0xFTkdUSD1gcHdkfHdjIC1tYAotICAgIGlmIHRlc3QgJFNSQ19ST09UX0xFTkdUSCAtZ3QgMTAwOyB0aGVuCi0gICAgICAgIEFDX01TR19FUlJPUihbWW91ciBiYXNlIHBhdGggaXMgdG9vIGxvbmcuIEl0IGlzICRTUkNfUk9PVF9MRU5HVEggY2hhcmFjdGVycyBsb25nLCBidXQgb25seSAxMDAgaXMgc3VwcG9ydGVkXSkKLSAgICBmaQorCitpZiB0ZXN0ICJ4JE9QRU5KREtfVEFSR0VUX09TIiA9ICJ4d2luZG93cyI7IHRoZW4KKyAgUEFUSF9TRVA9IjsiCisgIEJBU0lDX0NIRUNLX1BBVEhTX1dJTkRPV1MKK2Vsc2UKKyAgUEFUSF9TRVA9IjoiCiBmaQorCiBBQ19TVUJTVChTUkNfUk9PVCkKK0FDX1NVQlNUKFBBVEhfU0VQKQogY2QgIiRDVVJESVIiCiAKLVNQQUNFU0FGRShTUkNfUk9PVCxbdGhlIHBhdGggdG8gdGhlIHNvdXJjZSByb290XSkKLVNQQUNFU0FGRShDVVJESVIsW3RoZSBwYXRoIHRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeV0pCitCQVNJQ19GSVhVUF9QQVRIKFNSQ19ST09UKQorQkFTSUNfRklYVVBfUEFUSChDVVJESVIpCiAKIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PUyIgPSAieHNvbGFyaXMiOyB0aGVuCiAgICAgIyBBZGQgZXh0cmEgc2VhcmNoIHBhdGhzIG9uIHNvbGFyaXMgZm9yIHV0aWxpdGllcyBsaWtlIGFyIGFuZCBhcyBldGMuLi4KICAgICBQQVRIPSIkUEFUSDovdXNyL2Njcy9iaW46L3Vzci9zZncvYmluOi9vcHQvY3N3L2JpbiIKIGZpCiAKLSMgRm9yIGN5Z3dpbiB3ZSBuZWVkIGN5Z3BhdGggZmlyc3QsIHNpbmNlIGl0IGlzIHVzZWQgZXZlcnl3aGVyZS4KLUFDX1BBVEhfUFJPRyhDWUdQQVRILCBjeWdwYXRoKQotUEFUSF9TRVA9IjoiCi1pZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1MiID0gInh3aW5kb3dzIjsgdGhlbgotICAgIGlmIHRlc3QgIngkQ1lHUEFUSCIgPSB4OyB0aGVuCi0gICAgICAgIEFDX01TR19FUlJPUihbU29tZXRoaW5nIGlzIHdyb25nIHdpdGggeW91ciBjeWd3aW4gaW5zdGFsbGF0aW9uIHNpbmNlIEkgY2Fubm90IGZpbmQgY3lncGF0aC5leGUgaW4geW91ciBwYXRoXSkKLSAgICBmaQotICAgIFBBVEhfU0VQPSI7IgotZmkKLUFDX1NVQlNUKFBBVEhfU0VQKQotCiAjIFlvdSBjYW4gZm9yY2UgdGhlIHN5cy1yb290IGlmIHRoZSBzeXMtcm9vdCBlbmNvZGVkIGludG8gdGhlIGNyb3NzIGNvbXBpbGVyIHRvb2xzCiAjIGlzIG5vdCBjb3JyZWN0LgogQUNfQVJHX1dJVEgoc3lzLXJvb3QsIFtBU19IRUxQX1NUUklORyhbLS13aXRoLXN5cy1yb290XSwKLSAgW3Bhc3MgdGhpcyBzeXMtcm9vdCB0byB0aGUgY29tcGlsZXJzIGFuZCBsaW5rZXIgKHVzZWZ1bCBpZiB0aGUgc3lzLXJvb3QgZW5jb2RlZCBpbgotICAgdGhlIGNyb3NzIGNvbXBpbGVyIHRvb2xzIGlzIGluY29ycmVjdCldKV0pCisgIFtwYXNzIHRoaXMgc3lzLXJvb3QgdG8gdGhlIGNvbXBpbGVycyBhbmQgdG9vbHMgKGZvciBjcm9zcy1jb21waWxpbmcpXSldKQogCiBpZiB0ZXN0ICJ4JHdpdGhfc3lzX3Jvb3QiICE9IHg7IHRoZW4KICAgU1lTX1JPT1Q9JHdpdGhfc3lzX3Jvb3QKQEAgLTIwOCw3ICszMjAsNyBAQAogQUNfU1VCU1QoU1lTX1JPT1QpCiAKIEFDX0FSR19XSVRIKFt0b29scy1kaXJdLCBbQVNfSEVMUF9TVFJJTkcoWy0td2l0aC10b29scy1kaXJdLAotICBbc2VhcmNoIHRoaXMgZGlyZWN0b3J5IGZvciAoY3Jvc3MtY29tcGlsaW5nKSBjb21waWxlcnMgYW5kIHRvb2xzXSldLCBbVE9PTFNfRElSPSR3aXRoX3Rvb2xzX2Rpcl0pCisgIFtzZWFyY2ggdGhpcyBkaXJlY3RvcnkgZm9yIGNvbXBpbGVycyBhbmQgdG9vbHMgKGZvciBjcm9zcy1jb21waWxpbmcpXSldLCBbVE9PTFNfRElSPSR3aXRoX3Rvb2xzX2Rpcl0pCiAKIEFDX0FSR19XSVRIKFtkZXZraXRdLCBbQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1kZXZraXRdLAogICBbdXNlIHRoaXMgZGlyZWN0b3J5IGFzIGJhc2UgZm9yIHRvb2xzLWRpciBhbmQgc3lzLXJvb3QgKGZvciBjcm9zcy1jb21waWxpbmcpXSldLApAQCAtMjI5LDcgKzM0MSw3IEBACiBbCiAKIEFDX0FSR19XSVRIKGNvbmYtbmFtZSwgW0FTX0hFTFBfU1RSSU5HKFstLXdpdGgtY29uZi1uYW1lXSwKLQlbdXNlIHRoaXMgYXMgdGhlIG5hbWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24sIG92ZXJyaWRpbmcgdGhlIGdlbmVyYXRlZCBkZWZhdWx0XSldLAorCVt1c2UgdGhpcyBhcyB0aGUgbmFtZSBvZiB0aGUgY29uZmlndXJhdGlvbiBAPDpAZ2VuZXJhdGVkIGZyb20gaW1wb3J0YW50IGNvbmZpZ3VyYXRpb24gb3B0aW9uc0A6PkBdKV0sCiAgICAgICAgIFsgQ09ORl9OQU1FPSR7d2l0aF9jb25mX25hbWV9IF0pCiAKICMgVGVzdCBmcm9tIHdoZXJlIHdlIGFyZSBydW5uaW5nIGNvbmZpZ3VyZSwgaW4gb3Igb3V0c2lkZSBvZiBzcmMgcm9vdC4KQEAgLTI0MCw3ICszNTIsNyBAQAogICAgICAgICBDT05GX05BTUU9IiR7T1BFTkpES19UQVJHRVRfT1N9LSR7T1BFTkpES19UQVJHRVRfQ1BVfS0ke0pES19WQVJJQU5UfS0ke0FOREVEX0pWTV9WQVJJQU5UU30tJHtERUJVR19MRVZFTH0iCiAgICAgZmkKICAgICBPVVRQVVRfUk9PVD0iJFNSQ19ST09UL2J1aWxkLyR7Q09ORl9OQU1FfSIKLSAgICBta2RpciAtcCAiJE9VVFBVVF9ST09UIgorICAgICRNS0RJUiAtcCAiJE9VVFBVVF9ST09UIgogICAgIGlmIHRlc3QgISAtZCAiJE9VVFBVVF9ST09UIjsgdGhlbgogICAgICAgICBBQ19NU0dfRVJST1IoW0NvdWxkIG5vdCBjcmVhdGUgYnVpbGQgZGlyZWN0b3J5ICRPVVRQVVRfUk9PVF0pCiAgICAgZmkKQEAgLTI1Myw5ICszNjUsMzAgQEAKICAgICAgICAgQ09ORl9OQU1FPWAkRUNITyAkQ1VSRElSIHwgJFNFRCAtZSAicyFeJHtTUkNfUk9PVH0vYnVpbGQvISEiYAogICAgIGZpCiAgICAgT1VUUFVUX1JPT1Q9IiRDVVJESVIiCi1maQogCi1TUEFDRVNBRkUoT1VUUFVUX1JPT1QsW3RoZSBwYXRoIHRvIHRoZSBvdXRwdXQgcm9vdF0pCisgICAgIyBXQVJOSU5HOiBUaGlzIG1pZ2h0IGJlIGEgYmFkIHRoaW5nIHRvIGRvLiBZb3UgbmVlZCB0byBiZSBzdXJlIHlvdSB3YW50IHRvCisgICAgIyBoYXZlIGEgY29uZmlndXJhdGlvbiBpbiB0aGlzIGRpcmVjdG9yeS4gRG8gc29tZSBzYW5pdHkgY2hlY2tzIQorCisgICAgaWYgdGVzdCAhIC1lICIkT1VUUFVUX1JPT1Qvc3BlYy5nbWsiOyB0aGVuCisgICAgICAjIElmIHdlIGhhdmUgYSBzcGVjLmdtaywgd2UgaGF2ZSBydW4gaGVyZSBiZWZvcmUgYW5kIHdlIGFyZSBPSy4gT3RoZXJ3aXNlLCBjaGVjayBmb3IKKyAgICAgICMgb3RoZXIgZmlsZXMKKyAgICAgIGZpbGVzX3ByZXNlbnQ9YCRMUyAkT1VUUFVUX1JPT1RgCisgICAgICBpZiB0ZXN0ICJ4JGZpbGVzX3ByZXNlbnQiICE9IHg7IHRoZW4KKyAgICAgICAgQUNfTVNHX05PVElDRShbQ3VycmVudCBkaXJlY3RvcnkgaXMgJENVUkRJUi5dKQorICAgICAgICBBQ19NU0dfTk9USUNFKFtTaW5jZSB0aGlzIGlzIG5vdCB0aGUgc291cmNlIHJvb3QsIGNvbmZpZ3VyZSB3aWxsIG91dHB1dCB0aGUgY29uZmlndXJhdGlvbiBoZXJlXSkKKyAgICAgICAgQUNfTVNHX05PVElDRShbKGFzIG9wcG9zZWQgdG8gY3JlYXRpbmcgYSBjb25maWd1cmF0aW9uIGluIDxzcmNfcm9vdD4vYnVpbGQvPGNvbmYtbmFtZT4pLl0pCisgICAgICAgIEFDX01TR19OT1RJQ0UoW0hvd2V2ZXIsIHRoaXMgZGlyZWN0b3J5IGlzIG5vdCBlbXB0eS4gVGhpcyBpcyBub3QgYWxsb3dlZCwgc2luY2UgaXQgY291bGRdKQorICAgICAgICBBQ19NU0dfTk9USUNFKFtzZXJpb3VzbHkgbWVzcyB1cCBqdXN0IGFib3V0IGV2ZXJ5dGhpbmcuXSkKKyAgICAgICAgQUNfTVNHX05PVElDRShbVHJ5ICdjZCAkU1JDX1JPT1QnIGFuZCByZXN0YXJ0IGNvbmZpZ3VyZV0pCisgICAgICAgIEFDX01TR19OT1RJQ0UoWyhvciBjcmVhdGUgYSBuZXcgZW1wdHkgZGlyZWN0b3J5IGFuZCBjZCB0byBpdCkuXSkKKyAgICAgICAgQUNfTVNHX0VSUk9SKFtXaWxsIG5vdCBjb250aW51ZSBjcmVhdGluZyBjb25maWd1cmF0aW9uIGluICRDVVJESVJdKQorICAgICAgZmkKKyAgICBmaQorZmkKK0FDX01TR19DSEVDS0lORyhbd2hhdCBjb25maWd1cmF0aW9uIG5hbWUgdG8gdXNlXSkKK0FDX01TR19SRVNVTFQoWyRDT05GX05BTUVdKQorCitCQVNJQ19GSVhVUF9QQVRIKE9VVFBVVF9ST09UKQogCiBBQ19TVUJTVChTUEVDLCAkT1VUUFVUX1JPT1Qvc3BlYy5nbWspCiBBQ19TVUJTVChDT05GX05BTUUsICRDT05GX05BTUUpCkBAIC0yODcsNyArNDIwLDcgQEAKICMgU2V0dXAgZGVmYXVsdCBsb2dnaW5nIG9mIHN0ZG91dCBhbmQgc3RkZXJyIHRvIGJ1aWxkLmxvZyBpbiB0aGUgb3V0cHV0IHJvb3QuCiBCVUlMRF9MT0c9JyQoT1VUUFVUX1JPT1QpL2J1aWxkLmxvZycKIEJVSUxEX0xPR19QUkVWSU9VUz0nJChPVVRQVVRfUk9PVCkvYnVpbGQubG9nLm9sZCcKLUJVSUxEX0xPR19XUkFQUEVSPSckKFNIKSAkKFNSQ19ST09UKS9jb21tb24vYmluL2xvZ2dlci5zaCAkKEJVSUxEX0xPRyknCitCVUlMRF9MT0dfV1JBUFBFUj0nJChCQVNIKSAkKFNSQ19ST09UKS9jb21tb24vYmluL2xvZ2dlci5zaCAkKEJVSUxEX0xPRyknCiBBQ19TVUJTVChCVUlMRF9MT0cpCiBBQ19TVUJTVChCVUlMRF9MT0dfUFJFVklPVVMpCiBBQ19TVUJTVChCVUlMRF9MT0dfV1JBUFBFUikKQEAgLTMwNSw3ICs0MzgsNiBAQAogICBERVNDUklQVElPTj0iJDIiCiAgIGlmIHRlc3QgIngkTUFLRV9DQU5ESURBVEUiICE9IHg7IHRoZW4KICAgICBBQ19NU0dfTk9USUNFKFtUZXN0aW5nIHBvdGVudGlhbCBtYWtlIGF0ICRNQUtFX0NBTkRJREFURSwgZm91bmQgdXNpbmcgJERFU0NSSVBUSU9OXSkKLSAgICBTRVRfRlVMTF9QQVRIKE1BS0VfQ0FORElEQVRFKQogICAgIE1BS0VfVkVSU0lPTl9TVFJJTkc9YCRNQUtFX0NBTkRJREFURSAtLXZlcnNpb24gfCAkSEVBRCAtbiAxYAogICAgIElTX0dOVV9NQUtFPWAkRUNITyAkTUFLRV9WRVJTSU9OX1NUUklORyB8ICRHUkVQICdHTlUgTWFrZSdgCiAgICAgaWYgdGVzdCAieCRJU19HTlVfTUFLRSIgPSB4OyB0aGVuCkBAIC0zMTQsOCArNDQ2LDI3IEBACiAgICAgICBJU19NT0RFUk5fTUFLRT1gJEVDSE8gJE1BS0VfVkVSU0lPTl9TVFJJTkcgfCAkR1JFUCAnMy44W1sxMjM0Njc4OV1dJ2AKICAgICAgIGlmIHRlc3QgIngkSVNfTU9ERVJOX01BS0UiID0geDsgdGhlbgogICAgICAgICBBQ19NU0dfTk9USUNFKFtGb3VuZCBHTlUgbWFrZSBhdCAkTUFLRV9DQU5ESURBVEUsIGhvd2V2ZXIgdGhpcyBpcyBub3QgdmVyc2lvbiAzLjgxIG9yIGxhdGVyLiAoaXQgaXM6ICRNQUtFX1ZFUlNJT05fU1RSSU5HKS4gSWdub3JpbmcuXSkKLSAgICAgIGVsc2UgCi0gICAgICAgIEZPVU5EX01BS0U9JE1BS0VfQ0FORElEQVRFCisgICAgICBlbHNlCisgICAgICAgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PUyIgPSAieHdpbmRvd3MiOyB0aGVuCisgICAgICAgICAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorICAgICAgICAgICAgTUFLRV9FWFBFQ1RFRF9FTlY9J2N5Z3dpbicKKyAgICAgICAgICBlbGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLm1zeXMiOyB0aGVuCisgICAgICAgICAgICBNQUtFX0VYUEVDVEVEX0VOVj0nbXN5cycKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBBQ19NU0dfRVJST1IoW1Vua25vd24gV2luZG93cyBlbnZpcm9ubWVudF0pCisgICAgICAgICAgZmkKKyAgICAgICAgICBNQUtFX0JVSUxUX0ZPUj1gJE1BS0VfQ0FORElEQVRFIC0tdmVyc2lvbiB8ICRHUkVQIC1pICdidWlsdCBmb3InYAorICAgICAgICAgIElTX01BS0VfQ09SUkVDVF9FTlY9YCRFQ0hPICRNQUtFX0JVSUxUX0ZPUiB8ICRHUkVQICRNQUtFX0VYUEVDVEVEX0VOVmAKKyAgICAgICAgZWxzZQorICAgICAgICAgICMgTm90IHJlbGV2YW50IGZvciBub24tV2luZG93cworICAgICAgICAgIElTX01BS0VfQ09SUkVDVF9FTlY9dHJ1ZQorICAgICAgICBmaQorICAgICAgICBpZiB0ZXN0ICJ4JElTX01BS0VfQ09SUkVDVF9FTlYiID0geDsgdGhlbgorICAgICAgICAgIEFDX01TR19OT1RJQ0UoW0ZvdW5kIEdOVSBtYWtlIHZlcnNpb24gJE1BS0VfVkVSU0lPTl9TVFJJTkcgYXQgJE1BS0VfQ0FORElEQVRFLCBidXQgaXQgaXMgbm90IGZvciAkTUFLRV9FWFBFQ1RFRF9FTlYgKGl0IHNheXM6ICRNQUtFX0JVSUxUX0ZPUikuIElnbm9yaW5nLl0pCisgICAgICAgIGVsc2UKKyAgICAgICAgICBGT1VORF9NQUtFPSRNQUtFX0NBTkRJREFURQorICAgICAgICAgIEJBU0lDX0ZJWFVQX0VYRUNVVEFCTEUoRk9VTkRfTUFLRSkKKyAgICAgICAgZmkKICAgICAgIGZpCiAgICAgZmkKICAgZmkKQEAgLTMzMCw3ICs0ODEsNyBAQAogICAgIGlmIHRlc3QgISAtZiAiJE1BS0UiOyB0aGVuCiAgICAgICBBQ19NU0dfRVJST1IoW1RoZSBzcGVjaWZpZWQgbWFrZSAoYnkgTUFLRT0kTUFLRSkgaXMgbm90IGZvdW5kLl0pCiAgICAgZmkKLSAgICBCQVNJQ19DSEVDS19NQUtFX1ZFUlNJT04oIiRNQUtFIiwgW3VzZXIgc3VwcGxpZWQgTUFLRT1dKQorICAgIEJBU0lDX0NIRUNLX01BS0VfVkVSU0lPTigiJE1BS0UiLCBbdXNlciBzdXBwbGllZCBNQUtFPSRNQUtFXSkKICAgICBpZiB0ZXN0ICJ4JEZPVU5EX01BS0UiID0geDsgdGhlbgogICAgICAgQUNfTVNHX0VSUk9SKFtUaGUgc3BlY2lmaWVkIG1ha2UgKGJ5IE1BS0U9JE1BS0UpIGlzIG5vdCBHTlUgbWFrZSAzLjgxIG9yIG5ld2VyLl0pCiAgICAgZmkKQEAgLTM3NSw3ICs1MjYsNyBAQAogICAgIEFDX01TR19DSEVDS0lORyhbaWYgZmluZCBzdXBwb3J0cyAtZGVsZXRlXSkKICAgICBGSU5EX0RFTEVURT0iLWRlbGV0ZSIKIAotICAgIERFTEVURURJUj1gbWt0ZW1wIC1kIHRtcC5YWFhYWFhYWFhYYCB8fCAoZWNobyBDb3VsZCBub3QgY3JlYXRlIHRlbXBvcmFyeSBkaXJlY3RvcnkhOyBleGl0ICQ/KQorICAgIERFTEVURURJUj1gJE1LVEVNUCAtZCB0bXAuWFhYWFhYWFhYWGAgfHwgKGVjaG8gQ291bGQgbm90IGNyZWF0ZSB0ZW1wb3JhcnkgZGlyZWN0b3J5ITsgZXhpdCAkPykKIAogICAgIGVjaG8gSGVqc2FuID4gJERFTEVURURJUi9UZXN0SWZGaW5kU3VwcG9ydHNEZWxldGUKIApAQCAtMzg5LDEwMiArNTQwLDIyIEBACiAgICAgICAgIEFDX01TR19SRVNVTFQoW3llc10pICAgIAogICAgIGZpCiAgICAgcm1kaXIgJERFTEVURURJUgorICAgIEFDX1NVQlNUKEZJTkRfREVMRVRFKQogXSkKIAotIyBUZXN0IHRoYXQgdmFyaWFibGUgJDEgZGVub3RpbmcgYSBwcm9ncmFtIGlzIG5vdCBlbXB0eS4gSWYgZW1wdHksIGV4aXQgd2l0aCBhbiBlcnJvci4KLSMgJDE6IHZhcmlhYmxlIHRvIGNoZWNrCi0jICQyOiBleGVjdXRhYmxlIG5hbWUgdG8gcHJpbnQgaW4gd2FybmluZyAob3B0aW9uYWwpCi1BQ19ERUZVTihbQ0hFQ0tfTk9ORU1QVFldLAorQUNfREVGVU5fT05DRShbQkFTSUNfU0VUVVBfQ09NUExFWF9UT09MU10sCiBbCi0gICAgaWYgdGVzdCAieFskXSQxIiA9IHg7IHRoZW4KLSAgICAgICAgaWYgdGVzdCAieCQyIiA9IHg7IHRoZW4KLSAgICAgICAgICBQUk9HX05BTUU9dHJhbnNsaXQoJDEsQS1aLGEteikKLSAgICAgICAgZWxzZQotICAgICAgICAgIFBST0dfTkFNRT0kMgotICAgICAgICBmaQotICAgICAgICBBQ19NU0dfTk9USUNFKFtDb3VsZCBub3QgZmluZCAkUFJPR19OQU1FIV0pCi0gICAgICAgIEFDX01TR19FUlJPUihbQ2Fubm90IGNvbnRpbnVlXSkKLSAgICBmaQotXSkKLQotIyBEb2VzIEFDX1BBVEhfUFJPRyBmb2xsb3dlZCBieSBDSEVDS19OT05FTVBUWS4KLSMgQXJndW1lbnRzIGFzIEFDX1BBVEhfUFJPRzoKLSMgJDE6IHZhcmlhYmxlIHRvIHNldAotIyAkMjogZXhlY3V0YWJsZSBuYW1lIHRvIGxvb2sgZm9yCi1BQ19ERUZVTihbQkFTSUNfUkVRVUlSRV9QUk9HXSwKLVsKLSAgICBBQ19QQVRIX1BST0dTKCQxLCAkMikKLSAgICBDSEVDS19OT05FTVBUWSgkMSwgJDIpCi1dKQotCi1BQ19ERUZVTl9PTkNFKFtCQVNJQ19TRVRVUF9UT09MU10sCi1bCi0jIFN0YXJ0IHdpdGggdG9vbHMgdGhhdCBkbyBub3QgbmVlZCBoYXZlIGNyb3NzIGNvbXBpbGF0aW9uIHN1cHBvcnQKLSMgYW5kIGNhbiBiZSBleHBlY3RlZCB0byBiZSBmb3VuZCBpbiB0aGUgZGVmYXVsdCBQQVRILiBUaGVzZSB0b29scyBhcmUKLSMgdXNlZCBieSBjb25maWd1cmUuIE5vciBhcmUgdGhlc2UgdG9vbHMgZXhwZWN0ZWQgdG8gYmUgZm91bmQgaW4gdGhlCi0jIGRldmtpdCBmcm9tIHRoZSBidWlsZGRlcHMgc2VydmVyIGVpdGhlciwgc2luY2UgdGhleSBhcmUKLSMgbmVlZGVkIHRvIGRvd25sb2FkIHRoZSBkZXZraXQuCi0KLSMgRmlyc3QgYXJlIGFsbCB0aGUgc2ltcGxlIHJlcXVpcmVkIHRvb2xzLgotQkFTSUNfUkVRVUlSRV9QUk9HKEJBU0VOQU1FLCBiYXNlbmFtZSkKLUJBU0lDX1JFUVVJUkVfUFJPRyhDQVQsIGNhdCkKLUJBU0lDX1JFUVVJUkVfUFJPRyhDSE1PRCwgY2htb2QpCi1CQVNJQ19SRVFVSVJFX1BST0coQ01QLCBjbXApCi1CQVNJQ19SRVFVSVJFX1BST0coQ1AsIGNwKQotQkFTSUNfUkVRVUlSRV9QUk9HKENQSU8sIGNwaW8pCi1CQVNJQ19SRVFVSVJFX1BST0coQ1VULCBjdXQpCi1CQVNJQ19SRVFVSVJFX1BST0coREFURSwgZGF0ZSkKLUJBU0lDX1JFUVVJUkVfUFJPRyhERiwgZGYpCi1CQVNJQ19SRVFVSVJFX1BST0coRElGRiwgW2dkaWZmIGRpZmZdKQotQkFTSUNfUkVRVUlSRV9QUk9HKEVDSE8sIGVjaG8pCi1CQVNJQ19SRVFVSVJFX1BST0coRVhQUiwgZXhwcikKLUJBU0lDX1JFUVVJUkVfUFJPRyhGSUxFLCBmaWxlKQotQkFTSUNfUkVRVUlSRV9QUk9HKEZJTkQsIGZpbmQpCi1CQVNJQ19SRVFVSVJFX1BST0coSEVBRCwgaGVhZCkKLUJBU0lDX1JFUVVJUkVfUFJPRyhMTiwgbG4pCi1CQVNJQ19SRVFVSVJFX1BST0coTFMsIGxzKQotQkFTSUNfUkVRVUlSRV9QUk9HKE1LRElSLCBta2RpcikKLUJBU0lDX1JFUVVJUkVfUFJPRyhNViwgbXYpCi1CQVNJQ19SRVFVSVJFX1BST0coUFJJTlRGLCBwcmludGYpCi1CQVNJQ19SRVFVSVJFX1BST0coU0gsIHNoKQotQkFTSUNfUkVRVUlSRV9QUk9HKFNPUlQsIHNvcnQpCi1CQVNJQ19SRVFVSVJFX1BST0coVEFJTCwgdGFpbCkKLUJBU0lDX1JFUVVJUkVfUFJPRyhUQVIsIHRhcikKLUJBU0lDX1JFUVVJUkVfUFJPRyhURUUsIHRlZSkKLUJBU0lDX1JFUVVJUkVfUFJPRyhUT1VDSCwgdG91Y2gpCi1CQVNJQ19SRVFVSVJFX1BST0coVFIsIHRyKQotQkFTSUNfUkVRVUlSRV9QUk9HKFVOSVEsIHVuaXEpCi1CQVNJQ19SRVFVSVJFX1BST0coVU5aSVAsIHVuemlwKQotQkFTSUNfUkVRVUlSRV9QUk9HKFdDLCB3YykKLUJBU0lDX1JFUVVJUkVfUFJPRyhYQVJHUywgeGFyZ3MpCi1CQVNJQ19SRVFVSVJFX1BST0coWklQLCB6aXApCi0KLSMgVGhlbiByZXF1aXJlZCB0b29scyB0aGF0IHJlcXVpcmUgc29tZSBzcGVjaWFsIHRyZWF0bWVudC4KLUFDX1BST0dfQVdLCi1DSEVDS19OT05FTVBUWShBV0spCi1BQ19QUk9HX0dSRVAKLUNIRUNLX05PTkVNUFRZKEdSRVApCi1BQ19QUk9HX0VHUkVQCi1DSEVDS19OT05FTVBUWShFR1JFUCkKLUFDX1BST0dfRkdSRVAKLUNIRUNLX05PTkVNUFRZKEZHUkVQKQotQUNfUFJPR19TRUQKLUNIRUNLX05PTkVNUFRZKFNFRCkKLQotQUNfUEFUSF9QUk9HUyhOQVdLLCBbbmF3ayBnYXdrIGF3a10pCi1DSEVDS19OT05FTVBUWShOQVdLKQotCiBCQVNJQ19DSEVDS19HTlVfTUFLRQogCi1CQVNJQ19SRVFVSVJFX1BST0coUk0sIHJtKQotUk09IiRSTSAtZiIKLQogQkFTSUNfQ0hFQ0tfRklORF9ERUxFVEUKLUFDX1NVQlNUKEZJTkRfREVMRVRFKQorCisjIFRoZXNlIHRvb2xzIG1pZ2h0IG5vdCBiZSBpbnN0YWxsZWQgYnkgZGVmYXVsdCwgCisjIG5lZWQgaGludCBvbiBob3cgdG8gaW5zdGFsbCB0aGVtLgorQkFTSUNfUkVRVUlSRV9QUk9HKFVOWklQLCB1bnppcCkKK0JBU0lDX1JFUVVJUkVfUFJPRyhaSVAsIHppcCkKIAogIyBOb24tcmVxdWlyZWQgYmFzaWMgdG9vbHMKIAotQUNfUEFUSF9QUk9HKFRIRVBXRENNRCwgcHdkKQogQUNfUEFUSF9QUk9HKExERCwgbGRkKQogaWYgdGVzdCAieCRMREQiID0gIngiOyB0aGVuCiAgICAgIyBMaXN0IHNoYXJlZCBsaWIgZGVwZW5kZW5jaWVzIGlzIHVzZWQgZm9yCkBAIC00OTcsNTIgKzU2OCwxNyBAQAogICAgT1RPT0w9InRydWUiCiBmaQogQUNfUEFUSF9QUk9HUyhSRUFERUxGLCBbcmVhZGVsZiBncmVhZGVsZl0pCi1BQ19QQVRIX1BST0dTKE9CSkRVTVAsIFtvYmpkdW1wIGdvYmpkdW1wXSkKIEFDX1BBVEhfUFJPRyhIRywgaGcpCi1dKQorQUNfUEFUSF9QUk9HKFNUQVQsIHN0YXQpCitBQ19QQVRIX1BST0coVElNRSwgdGltZSkKIAotQUNfREVGVU5fT05DRShbQkFTSUNfQ09NUElMRV9VTkNZR0RSSVZFXSwKLVsKLSMgV2hlbiB1c2luZyBjeWd3aW4sIHdlIG5lZWQgYSB3cmFwcGVyIGJpbmFyeSB0aGF0IHJlbmFtZXMKLSMgL2N5Z2RyaXZlL2MvIGFyZ3VtZW50cyBpbnRvIGM6LyBhcmd1bWVudHMgYW5kIHBlZWtzIGludG8KLSMgQGZpbGVzIGFuZCByZXdyaXRlcyB0aGVzZSB0b28hIFRoaXMgd3JhcHBlciBiaW5hcnkgaXMKLSMgY2FsbGVkIHVuY3lnZHJpdmUuZXhlLgotVU5DWUdEUklWRT0KLWlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PUyIgPSB4d2luZG93czsgdGhlbgotICAgIEFDX01TR19DSEVDS0lORyhbaWYgdW5jeWdkcml2ZSBjYW4gYmUgY3JlYXRlZF0pCi0gICAgVU5DWUdEUklWRV9TUkM9YCRDWUdQQVRIIC1tICRTUkNfUk9PVC9jb21tb24vc3JjL3VuY3lnZHJpdmUuY2AKLSAgICBybSAtZiAkT1VUUFVUX1JPT1QvdW5jeWdkcml2ZSoKLSAgICBVTkNZR0RSSVZFPWAkQ1lHUEFUSCAtbSAkT1VUUFVUX1JPT1QvdW5jeWdkcml2ZS5leGVgCi0gICAgY2QgJE9VVFBVVF9ST09UCi0gICAgJENDICRVTkNZR0RSSVZFX1NSQyAvRmUkVU5DWUdEUklWRSA+ICRPVVRQVVRfUk9PVC91bmN5Z2RyaXZlMS5sb2cgMj4mMQotICAgIGNkICRDVVJESVIKLQotICAgIGlmIHRlc3QgISAteCAkT1VUUFVUX1JPT1QvdW5jeWdkcml2ZS5leGU7IHRoZW4gCi0gICAgICAgIEFDX01TR19SRVNVTFQoW25vXSkKLSAgICAgICAgY2F0ICRPVVRQVVRfUk9PVC91bmN5Z2RyaXZlMS5sb2cKLSAgICAgICAgQUNfTVNHX0VSUk9SKFtDb3VsZCBub3QgY3JlYXRlICRPVVRQVVRfUk9PVC91bmN5Z2RyaXZlLmV4ZV0pCi0gICAgZmkKLSAgICBBQ19NU0dfUkVTVUxUKFskVU5DWUdEUklWRV0pCi0gICAgQUNfTVNHX0NIRUNLSU5HKFtpZiB1bmN5Z2RyaXZlLmV4ZSB3b3Jrc10pCi0gICAgY2QgJE9VVFBVVF9ST09UCi0gICAgJFVOQ1lHRFJJVkUgJENDICRTUkNfUk9PVC9jb21tb24vc3JjL3VuY3lnZHJpdmUuYyAvRmUkT1VUUFVUX1JPT1QvdW5jeWdkcml2ZTIuZXhlID4gJE9VVFBVVF9ST09UL3VuY3lnZHJpdmUyLmxvZyAyPiYxIAotICAgIGNkICRDVVJESVIKLSAgICBpZiB0ZXN0ICEgLXggJE9VVFBVVF9ST09UL3VuY3lnZHJpdmUyLmV4ZTsgdGhlbiAKLSAgICAgICAgQUNfTVNHX1JFU1VMVChbbm9dKQotICAgICAgICBjYXQgJE9VVFBVVF9ST09UL3VuY3lnZHJpdmUyLmxvZwotICAgICAgICBBQ19NU0dfRVJST1IoW1VuY3lnZHJpdmUgZGlkIG5vdCB3b3JrIV0pCi0gICAgZmkKLSAgICBBQ19NU0dfUkVTVUxUKFt5ZXNdKQotICAgIHJtIC1mICRPVVRQVVRfUk9PVC91bmN5Z2RyaXZlPy4/Pz8gJE9VVFBVVF9ST09UL3VuY3lnZHJpdmUub2JqCi0gICAgIyBUaGUgcGF0aCB0byB1bmN5Z2RyaXZlIHRvIHVzZSBzaG91bGQgYmUgVW5peC1zdHlsZQotICAgIFVOQ1lHRFJJVkU9IiRPVVRQVVRfUk9PVC91bmN5Z2RyaXZlLmV4ZSIKK2lmIHRlc3QgIngkT1BFTkpES19UQVJHRVRfT1MiID0gInh3aW5kb3dzIjsgdGhlbgorICBCQVNJQ19SRVFVSVJFX1BST0coQ09NTSwgY29tbSkKIGZpCi0KLUFDX1NVQlNUKFVOQ1lHRFJJVkUpCiBdKQogCi0KLSMgQ2hlY2sgaWYgYnVpbGQgZGlyZWN0b3J5IGlzIG9uIGxvY2FsIGRpc2suCisjIENoZWNrIGlmIGJ1aWxkIGRpcmVjdG9yeSBpcyBvbiBsb2NhbCBkaXNrLiBJZiBub3QgcG9zc2libGUgdG8gZGV0ZXJtaW5lLAorIyB3ZSBwcmVmZXIgdG8gY2xhaW0gaXQncyBsb2NhbC4KICMgQXJndW1lbnQgMTogZGlyZWN0b3J5IHRvIHRlc3QKICMgQXJndW1lbnQgMjogd2hhdCB0byBkbyBpZiBpdCBpcyBvbiBsb2NhbCBkaXNrCiAjIEFyZ3VtZW50IDM6IHdoYXQgdG8gZG8gb3RoZXJ3aXNlIChyZW1vdGUgZGlzayBvciBmYWlsdXJlKQpAQCAtNTUwLDExICs1ODYsMjYgQEAKIFsKIAkjIGRmIC1sIGxpc3RzIG9ubHkgbG9jYWwgZGlza3M7IGlmIHRoZSBnaXZlbiBkaXJlY3RvcnkgaXMgbm90IGZvdW5kIHRoZW4KIAkjIGEgbm9uLXplcm8gZXhpdCBjb2RlIGlzIGdpdmVuCi0JaWYgJERGIC1sICQxID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICAgICAgICAkMgotICAgICAgICBlbHNlCi0gICAgICAgICAgJDMKLSAgICAgICAgZmkKKyAgaWYgdGVzdCAieCRERiIgPSB4OyB0aGVuCisgICAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MubXN5cyI7IHRoZW4KKyAgICAgICMgbXN5cyBkb2VzIG5vdCBoYXZlIGRmOyB1c2UgV2luZG93cyAibmV0IHVzZSIgaW5zdGVhZC4KKyAgICAgIElTX05FVFdPUktfRElTSz1gbmV0IHVzZSB8IGdyZXAgXGBwd2QgLVcgfCBjdXQgLWQgIjoiIC1mIDEgfCB0ciBhLXogQS1aXGA6YAorICAgICAgaWYgdGVzdCAieCRJU19ORVRXT1JLX0RJU0siID0geDsgdGhlbgorICAgICAgICAkMgorICAgICAgZWxzZQorICAgICAgICAkMworICAgICAgZmkKKyAgICBlbHNlCisgICAgICAjIE5vIGRmIGhlcmUsIHNheSBpdCdzIGxvY2FsCisgICAgICAkMgorICAgIGZpCisgIGVsc2UKKyAgICBpZiAkREYgLWwgJDEgPiAvZGV2L251bGwgMj4mMTsgdGhlbgorICAgICAgJDIKKyAgICBlbHNlCisgICAgICAkMworICAgIGZpCisgIGZpCiBdKQogCiBBQ19ERUZVTl9PTkNFKFtCQVNJQ19URVNUX1VTQUJJTElUWV9JU1NVRVNdLApkaWZmIC0tZ2l0IGEvY29tbW9uL2F1dG9jb25mL2Jhc2ljc193aW5kb3dzLm00IGIvY29tbW9uL2F1dG9jb25mL2Jhc2ljc193aW5kb3dzLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0OGIzZTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vYXV0b2NvbmYvYmFzaWNzX3dpbmRvd3MubTQKQEAgLTAsMCArMSw0MDYgQEAKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDExLCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisjCisjIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcworIyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisjIGJ5IE9yYWNsZSBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorIworIyBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisjIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorIyBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisjIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorIworIyBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQorIyBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CisjIHF1ZXN0aW9ucy4KKyMKKworQUNfREVGVU4oW0JBU0lDX1dJTkRPV1NfUkVXUklURV9BU19VTklYX1BBVEhdLAorWworICB3aW5kb3dzX3BhdGg9IlskXSQxIgorICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5jeWd3aW4iOyB0aGVuCisgICAgdW5peF9wYXRoPWAkQ1lHUEFUSCAtdSAiJHdpbmRvd3NfcGF0aCJgCisgICAgJDE9IiR1bml4X3BhdGgiCisgIGVsaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MubXN5cyI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRFQ0hPICIkd2luZG93c19wYXRoIiB8ICRTRUQgLWUgJ3MsXlxcKC5cXCk6LC9cXDEsZycgLWUgJ3MsXFxcXCwvLGcnYAorICAgICQxPSIkdW5peF9wYXRoIgorICBmaQorXSkKKworQUNfREVGVU4oW0JBU0lDX1dJTkRPV1NfUkVXUklURV9BU19XSU5ET1dTX01JWEVEX1BBVEhdLAorWworICB1bml4X3BhdGg9IlskXSQxIgorICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5jeWd3aW4iOyB0aGVuCisgICAgd2luZG93c19wYXRoPWAkQ1lHUEFUSCAtbSAiJHVuaXhfcGF0aCJgCisgICAgJDE9IiR3aW5kb3dzX3BhdGgiCisgIGVsaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MubXN5cyI7IHRoZW4KKyAgICB3aW5kb3dzX3BhdGg9YGNtZCAvL2MgZWNobyAkdW5peF9wYXRoYAorICAgICQxPSIkd2luZG93c19wYXRoIgorICBmaQorXSkKKworIyBIZWxwZXIgZnVuY3Rpb24gd2hpY2ggcG9zc2libHkgY29udmVydHMgYSBwYXRoIHVzaW5nIERPUy1zdHlsZSBzaG9ydCBtb2RlLgorIyBJZiBzbywgdGhlIHVwZGF0ZWQgcGF0aCBpcyBzdG9yZWQgaW4gJG5ld19wYXRoLgorIyAkMTogVGhlIHBhdGggdG8gY2hlY2sKK0FDX0RFRlVOKFtCQVNJQ19NQUtFX1dJTkRPV1NfU1BBQ0VfU0FGRV9DWUdXSU5dLAorWworICBpbnB1dF9wYXRoPSIkMSIKKyAgIyBDaGVjayBpZiB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhpcyB1c2luZyBET1Mtc3R5bGUgc2hvcnQgbW9kZS4gSWYgdGhlIHBhdGgKKyAgIyBjb250YWlucyBqdXN0IHNpbXBsZSBjaGFyYWN0ZXJzLCB1c2UgaXQuIE90aGVyd2lzZSAoc3BhY2VzLCB3ZWlyZCBjaGFyYWN0ZXJzKSwKKyAgIyB0YWtlIG5vIGNoYW5jZXMgYW5kIHJld3JpdGUgaXQuCisgICMgTm90ZTogbTQgZWF0cyBvdXIgW10sIHNvIHdlIG5lZWQgdG8gdXNlIEA8OkAgYW5kIEA6PkAgaW5zdGVhZC4KKyAgaGFzX2ZvcmJpZGRlbl9jaGFycz1gJEVDSE8gIiRpbnB1dF9wYXRoIiB8ICRHUkVQIEA8OkBeLS5fL2EtekEtWjAtOUA6PkBgCisgIGlmIHRlc3QgIngkaGFzX2ZvcmJpZGRlbl9jaGFycyIgIT0geDsgdGhlbgorICAgICMgTm93IGNvbnZlcnQgaXQgdG8gbWl4ZWQgRE9TLXN0eWxlLCBzaG9ydCBtb2RlIChubyBzcGFjZXMsIGFuZCAvIGluc3RlYWQgb2YgXCkKKyAgICBzaG9ydG1vZGVfcGF0aD1gJENZR1BBVEggLXMgLW0gLWEgIiRpbnB1dF9wYXRoImAKKyAgICBwYXRoX2FmdGVyX3Nob3J0bW9kZT1gJENZR1BBVEggLXUgIiRzaG9ydG1vZGVfcGF0aCJgCisgICAgaWYgdGVzdCAieCRwYXRoX2FmdGVyX3Nob3J0bW9kZSIgIT0gIngkaW5wdXRfdG9fc2hvcnRwYXRoIjsgdGhlbgorICAgICAgIyBHb2luZyB0byBzaG9ydCBtb2RlIGFuZCBiYWNrIGFnYWluIGRpZCBpbmRlZWQgbWF0dGVyLiBTaW5jZSBzaG9ydCBtb2RlIGlzCisgICAgICAjIGNhc2UgaW5zZW5zaXRpdmUsIGxldCdzIG1ha2UgaXQgbG93ZXJjYXNlIHRvIGltcHJvdmUgcmVhZGFiaWxpdHkuCisgICAgICBzaG9ydG1vZGVfcGF0aD1gJEVDSE8gIiRzaG9ydG1vZGVfcGF0aCIgfCAkVFIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAorICAgICAgIyBOb3cgY29udmVydCBpdCBiYWNrIHRvIFVuaXgtc3RpbGUgKGN5Z3BhdGgpCisgICAgICBpbnB1dF9wYXRoPWAkQ1lHUEFUSCAtdSAiJHNob3J0bW9kZV9wYXRoImAKKyAgICAgIG5ld19wYXRoPSIkaW5wdXRfcGF0aCIKKyAgICBmaQorICBmaQorCisgIHRlc3RfY3lnZHJpdmVfcHJlZml4PWAkRUNITyAkaW5wdXRfcGF0aCB8ICRHUkVQIF4vY3lnZHJpdmUvYAorICBpZiB0ZXN0ICJ4JHRlc3RfY3lnZHJpdmVfcHJlZml4IiA9IHg7IHRoZW4KKyAgICAjIEFzIGEgc2ltcGxlIGZpeCwgZXhjbHVkZSAvdXNyL2JpbiBzaW5jZSBpdCdzIG5vdCBhIHJlYWwgcGF0aC4KKyAgICBpZiB0ZXN0ICJ4YCRFQ0hPICQxIHwgJEdSRVAgXi91c3IvYmluL2AiID0geDsgdGhlbgorICAgICAgIyBUaGUgcGF0aCBpcyBpbiBhIEN5Z3dpbiBzcGVjaWFsIGRpcmVjdG9yeSAoZS5nLiAvaG9tZSkuIFdlIG5lZWQgdGhpcyBjb252ZXJ0ZWQgdG8KKyAgICAgICMgYSBwYXRoIHByZWZpeGVkIGJ5IC9jeWdkcml2ZSBmb3IgZml4cGF0aCB0byB3b3JrLgorICAgICAgbmV3X3BhdGg9IiRDWUdXSU5fUk9PVF9QQVRIJGlucHV0X3BhdGgiCisgICAgZmkKKyAgZmkKK10pCisKKyMgSGVscGVyIGZ1bmN0aW9uIHdoaWNoIHBvc3NpYmx5IGNvbnZlcnRzIGEgcGF0aCB1c2luZyBET1Mtc3R5bGUgc2hvcnQgbW9kZS4KKyMgSWYgc28sIHRoZSB1cGRhdGVkIHBhdGggaXMgc3RvcmVkIGluICRuZXdfcGF0aC4KKyMgJDE6IFRoZSBwYXRoIHRvIGNoZWNrCitBQ19ERUZVTihbQkFTSUNfTUFLRV9XSU5ET1dTX1NQQUNFX1NBRkVfTVNZU10sCitbCisgIGlucHV0X3BhdGg9IiQxIgorICAjIENoZWNrIGlmIHdlIG5lZWQgdG8gY29udmVydCB0aGlzIHVzaW5nIERPUy1zdHlsZSBzaG9ydCBtb2RlLiBJZiB0aGUgcGF0aAorICAjIGNvbnRhaW5zIGp1c3Qgc2ltcGxlIGNoYXJhY3RlcnMsIHVzZSBpdC4gT3RoZXJ3aXNlIChzcGFjZXMsIHdlaXJkIGNoYXJhY3RlcnMpLAorICAjIHRha2Ugbm8gY2hhbmNlcyBhbmQgcmV3cml0ZSBpdC4KKyAgIyBOb3RlOiBtNCBlYXRzIG91ciBbXSwgc28gd2UgbmVlZCB0byB1c2UgQDw6QCBhbmQgQDo+QCBpbnN0ZWFkLgorICBoYXNfZm9yYmlkZGVuX2NoYXJzPWAkRUNITyAiJGlucHV0X3BhdGgiIHwgJEdSRVAgQDw6QF4tXy86YS16QS1aMC05QDo+QGAKKyAgaWYgdGVzdCAieCRoYXNfZm9yYmlkZGVuX2NoYXJzIiAhPSB4OyB0aGVuCisgICAgIyBOb3cgY29udmVydCBpdCB0byBtaXhlZCBET1Mtc3R5bGUsIHNob3J0IG1vZGUgKG5vIHNwYWNlcywgYW5kIC8gaW5zdGVhZCBvZiBcKQorICAgIG5ld19wYXRoPWBjbWQgL2MgImZvciAlQSBpbiAoXCIkaW5wdXRfcGF0aFwiKSBkbyBAZWNobyAlfnNBInwkVFIgXFxcXFxcXFwgLyB8ICRUUiAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidgCisgIGZpCitdKQorCisjIEZJWE1FOiBUaGUgQkFTSUNfRklYVVBfKl9DWUdXSU4vTVNZUyBpcyBtb3N0IGxpa2VseSB0b28gY29udm9sdXRlZAorIyBhbmQgY291bGQgcHJvYmFibHkgYmUgaGVhdmlseSBzaW1wbGlmaWVkLiBIb3dldmVyLCBhbGwgY2hhbmdlcyBpbiB0aGlzCisjIGFyZWEgdGVuZCB0byBuZWVkIGxvdCBvZiB0ZXN0aW5nIGluIGRpZmZlcmVudCBzY2VuYXJpb3MsIGFuZCBpbiBsYWNrIG9mCisjIHByb3BlciB1bml0IHRlc3RpbmcsIGNsZWFuaW5nIHRoaXMgdXAgaGFzIG5vdCBiZWVuIGRlZW1lZCB3b3J0aCB0aGUgZWZmb3J0CisjIGF0IHRoZSBtb21lbnQuCisKK0FDX0RFRlVOKFtCQVNJQ19GSVhVUF9QQVRIX0NZR1dJTl0sCitbCisgICMgSW5wdXQgbWlnaHQgYmUgZ2l2ZW4gYXMgV2luZG93cyBmb3JtYXQsIHN0YXJ0IGJ5IGNvbnZlcnRpbmcgdG8KKyAgIyB1bml4IGZvcm1hdC4KKyAgcGF0aD0iWyRdJDEiCisgIG5ld19wYXRoPWAkQ1lHUEFUSCAtdSAiJHBhdGgiYAorCisgICMgQ3lnd2luIHRyaWVzIHRvIGhpZGUgc29tZSBhc3BlY3RzIG9mIHRoZSBXaW5kb3dzIGZpbGUgc3lzdGVtLCBzdWNoIHRoYXQgYmluYXJpZXMgYXJlCisgICMgbmFtZWQgLmV4ZSBidXQgY2FsbGVkIHdpdGhvdXQgdGhhdCBzdWZmaXguIFRoZXJlZm9yZSwgImZvbyIgYW5kICJmb28uZXhlIiBhcmUgY29uc2lkZXJlZAorICAjIHRoZSBzYW1lIGZpbGUsIG1vc3Qgb2YgdGhlIHRpbWUgKGFzIGluICJ0ZXN0IC1mIikuIEJ1dCBub3Qgd2hlbiBydW5uaW5nIGN5Z3BhdGggLXMsIHRoZW4KKyAgIyAiZm9vLmV4ZSIgaXMgT0sgYnV0ICJmb28iIGlzIGFuIGVycm9yLgorICAjCisgICMgVGhpcyB0ZXN0IGlzIHRoZXJlZm9yZSBzbGlnaHRseSBtb3JlIGFjY3VyYXRlIHRoYW4gInRlc3QgLWYiIHRvIGNoZWNrIGZvciBmaWxlIHByZWNlbnNlLgorICAjIEl0IGlzIGFsc28gYSB3YXkgdG8gbWFrZSBzdXJlIHdlIGdvdCB0aGUgcHJvcGVyIGZpbGUgbmFtZSBmb3IgdGhlIHJlYWwgdGVzdCBsYXRlciBvbi4KKyAgdGVzdF9zaG9ydHBhdGg9YCRDWUdQQVRIIC1zIC1tICIkbmV3X3BhdGgiIDI+IC9kZXYvbnVsbGAKKyAgaWYgdGVzdCAieCR0ZXN0X3Nob3J0cGF0aCIgPSB4OyB0aGVuCisgICAgQUNfTVNHX05PVElDRShbVGhlIHBhdGggb2YgJDEsIHdoaWNoIHJlc29sdmVzIGFzICIkcGF0aCIsIGlzIGludmFsaWQuXSkKKyAgICBBQ19NU0dfRVJST1IoW0Nhbm5vdCBsb2NhdGUgdGhlIHRoZSBwYXRoIG9mICQxXSkKKyAgZmkKKworICAjIENhbGwgaGVscGVyIGZ1bmN0aW9uIHdoaWNoIHBvc3NpYmx5IGNvbnZlcnRzIHRoaXMgdXNpbmcgRE9TLXN0eWxlIHNob3J0IG1vZGUuCisgICMgSWYgc28sIHRoZSB1cGRhdGVkIHBhdGggaXMgc3RvcmVkIGluICRuZXdfcGF0aC4KKyAgQkFTSUNfTUFLRV9XSU5ET1dTX1NQQUNFX1NBRkVfQ1lHV0lOKFskbmV3X3BhdGhdKQorCisgIGlmIHRlc3QgIngkcGF0aCIgIT0gIngkbmV3X3BhdGgiOyB0aGVuCisgICAgJDE9IiRuZXdfcGF0aCIKKyAgICBBQ19NU0dfTk9USUNFKFtSZXdyaXRpbmcgJDEgdG8gIiRuZXdfcGF0aCJdKQorICBmaQorXSkKKworQUNfREVGVU4oW0JBU0lDX0ZJWFVQX1BBVEhfTVNZU10sCitbCisgIHBhdGg9IlskXSQxIgorICBoYXNfY29sb249YCRFQ0hPICRwYXRoIHwgJEdSRVAgXi46YAorICBuZXdfcGF0aD0iJHBhdGgiCisgIGlmIHRlc3QgIngkaGFzX2NvbG9uIiA9IHg7IHRoZW4KKyAgICAjIE5vdCBpbiBtaXhlZCBvciBXaW5kb3dzIHN0eWxlLCBzdGFydCBieSB0aGF0LgorICAgIG5ld19wYXRoPWBjbWQgLy9jIGVjaG8gJHBhdGhgCisgIGZpCisgIAorICBCQVNJQ19NQUtFX1dJTkRPV1NfU1BBQ0VfU0FGRV9NU1lTKFskbmV3X3BhdGhdKQorICBCQVNJQ19XSU5ET1dTX1JFV1JJVEVfQVNfVU5JWF9QQVRIKG5ld19wYXRoKQorICBpZiB0ZXN0ICJ4JHBhdGgiICE9ICJ4JG5ld19wYXRoIjsgdGhlbgorICAgICQxPSIkbmV3X3BhdGgiCisgICAgQUNfTVNHX05PVElDRShbUmV3cml0aW5nICQxIHRvICIkbmV3X3BhdGgiXSkKKyAgZmkKKworICAjIFNhdmUgdGhlIGZpcnN0IDEwIGJ5dGVzIG9mIHRoaXMgcGF0aCB0byB0aGUgc3RvcmFnZSwgc28gZml4cGF0aCBjYW4gd29yay4KKyAgYWxsX2ZpeHBhdGhfcHJlZml4ZXM9KCIke2FsbF9maXhwYXRoX3ByZWZpeGVzQDw6QEBAOj5AfSIgIiR7bmV3X3BhdGg6MDoxMH0iKQorXSkKKworQUNfREVGVU4oW0JBU0lDX0ZJWFVQX0VYRUNVVEFCTEVfQ1lHV0lOXSwKK1sKKyAgIyBGaXJzdCBzZXBhcmF0ZSB0aGUgcGF0aCBmcm9tIHRoZSBhcmd1bWVudHMuIFRoaXMgd2lsbCBzcGxpdCBhdCB0aGUgZmlyc3QKKyAgIyBzcGFjZS4KKyAgY29tcGxldGU9IlskXSQxIgorICBwYXRoPSIke2NvbXBsZXRlJSUgKn0iCisgIHRtcD0iJGNvbXBsZXRlIEVPTCIKKyAgYXJndW1lbnRzPSIke3RtcCMqIH0iCisKKyAgIyBJbnB1dCBtaWdodCBiZSBnaXZlbiBhcyBXaW5kb3dzIGZvcm1hdCwgc3RhcnQgYnkgY29udmVydGluZyB0bworICAjIHVuaXggZm9ybWF0LgorICBuZXdfcGF0aD1gJENZR1BBVEggLXUgIiRwYXRoImAKKworICAjIE5vdyB0cnkgdG8gbG9jYXRlIGV4ZWN1dGFibGUgdXNpbmcgd2hpY2gKKyAgbmV3X3BhdGg9YCRXSElDSCAiJG5ld19wYXRoIiAyPiAvZGV2L251bGxgCisgIGlmIHRlc3QgIngkbmV3X3BhdGgiID0geDsgdGhlbgorICAgICMgT29wcy4gV2hpY2ggZGlkbid0IGZpbmQgdGhlIGV4ZWN1dGFibGUuCisgICAgIyBUaGUgc3BsaXR0aW5nIG9mIGFyZ3VtZW50cyBmcm9tIHRoZSBleGVjdXRhYmxlIGF0IGEgc3BhY2UgbWlnaHQgaGF2ZSBiZWVuIGluY29ycmVjdCwKKyAgICAjIHNpbmNlIHBhdGhzIHdpdGggc3BhY2UgYXJlIG1vcmUgbGlrZWx5IGluIFdpbmRvd3MuIEdpdmUgaXQgYW5vdGhlciB0cnkgd2l0aCB0aGUgd2hvbGUKKyAgICAjIGFyZ3VtZW50LgorICAgIHBhdGg9IiRjb21wbGV0ZSIKKyAgICBhcmd1bWVudHM9IkVPTCIKKyAgICBuZXdfcGF0aD1gJENZR1BBVEggLXUgIiRwYXRoImAKKyAgICBuZXdfcGF0aD1gJFdISUNIICIkbmV3X3BhdGgiIDI+IC9kZXYvbnVsbGAKKyAgICBpZiB0ZXN0ICJ4JG5ld19wYXRoIiA9IHg7IHRoZW4KKyAgICAgICMgSXQncyBzdGlsbCBub3QgZm91bmQuIE5vdyB0aGlzIGlzIGFuIHVucmVjb3ZlcmFibGUgZXJyb3IuCisgICAgICBBQ19NU0dfTk9USUNFKFtUaGUgcGF0aCBvZiAkMSwgd2hpY2ggcmVzb2x2ZXMgYXMgIiRjb21wbGV0ZSIsIGlzIG5vdCBmb3VuZC5dKQorICAgICAgaGFzX3NwYWNlPWAkRUNITyAiJGNvbXBsZXRlIiB8ICRHUkVQICIgImAKKyAgICAgIGlmIHRlc3QgIngkaGFzX3NwYWNlIiAhPSB4OyB0aGVuCisgICAgICAgIEFDX01TR19OT1RJQ0UoW1lvdSBtaWdodCBiZSBtaXhpbmcgc3BhY2VzIGluIHRoZSBwYXRoIGFuZCBleHRyYSBhcmd1bWVudHMsIHdoaWNoIGlzIG5vdCBhbGxvd2VkLl0pCisgICAgICBmaQorICAgICAgQUNfTVNHX0VSUk9SKFtDYW5ub3QgbG9jYXRlIHRoZSB0aGUgcGF0aCBvZiAkMV0pCisgICAgZmkKKyAgZmkKKworICAjIEN5Z3dpbiB0cmllcyB0byBoaWRlIHNvbWUgYXNwZWN0cyBvZiB0aGUgV2luZG93cyBmaWxlIHN5c3RlbSwgc3VjaCB0aGF0IGJpbmFyaWVzIGFyZQorICAjIG5hbWVkIC5leGUgYnV0IGNhbGxlZCB3aXRob3V0IHRoYXQgc3VmZml4LiBUaGVyZWZvcmUsICJmb28iIGFuZCAiZm9vLmV4ZSIgYXJlIGNvbnNpZGVyZWQKKyAgIyB0aGUgc2FtZSBmaWxlLCBtb3N0IG9mIHRoZSB0aW1lIChhcyBpbiAidGVzdCAtZiIpLiBCdXQgbm90IHdoZW4gcnVubmluZyBjeWdwYXRoIC1zLCB0aGVuCisgICMgImZvby5leGUiIGlzIE9LIGJ1dCAiZm9vIiBpcyBhbiBlcnJvci4KKyAgIworICAjIFRoaXMgdGVzdCBpcyB0aGVyZWZvcmUgc2xpZ2h0bHkgbW9yZSBhY2N1cmF0ZSB0aGFuICJ0ZXN0IC1mIiB0byBjaGVjayBmb3IgZmlsZSBwcmVjZW5zZS4KKyAgIyBJdCBpcyBhbHNvIGEgd2F5IHRvIG1ha2Ugc3VyZSB3ZSBnb3QgdGhlIHByb3BlciBmaWxlIG5hbWUgZm9yIHRoZSByZWFsIHRlc3QgbGF0ZXIgb24uCisgIHRlc3Rfc2hvcnRwYXRoPWAkQ1lHUEFUSCAtcyAtbSAiJG5ld19wYXRoIiAyPiAvZGV2L251bGxgCisgIGlmIHRlc3QgIngkdGVzdF9zaG9ydHBhdGgiID0geDsgdGhlbgorICAgICMgU2hvcnQgcGF0aCBmYWlsZWQsIGZpbGUgZG9lcyBub3QgZXhpc3QgYXMgc3BlY2lmaWVkLgorICAgICMgVHJ5IGFkZGluZyAuZXhlIG9yIC5jbWQKKyAgICBpZiB0ZXN0IC1mICIke25ld19wYXRofS5leGUiOyB0aGVuCisgICAgICAgaW5wdXRfdG9fc2hvcnRwYXRoPSIke25ld19wYXRofS5leGUiCisgICAgZWxpZiB0ZXN0IC1mICIke25ld19wYXRofS5jbWQiOyB0aGVuCisgICAgICAgaW5wdXRfdG9fc2hvcnRwYXRoPSIke25ld19wYXRofS5jbWQiCisgICAgZWxzZQorICAgICAgQUNfTVNHX05PVElDRShbVGhlIHBhdGggb2YgJDEsIHdoaWNoIHJlc29sdmVzIGFzICIkbmV3X3BhdGgiLCBpcyBpbnZhbGlkLl0pCisgICAgICBBQ19NU0dfTk9USUNFKFtOZWl0aGVyICIkbmV3X3BhdGgiIG5vciAiJG5ld19wYXRoLmV4ZS9jbWQiIGNhbiBiZSBmb3VuZF0pCisgICAgICBBQ19NU0dfRVJST1IoW0Nhbm5vdCBsb2NhdGUgdGhlIHRoZSBwYXRoIG9mICQxXSkKKyAgICBmaQorICBlbHNlCisgICAgaW5wdXRfdG9fc2hvcnRwYXRoPSIkbmV3X3BhdGgiCisgIGZpCisKKyAgIyBDYWxsIGhlbHBlciBmdW5jdGlvbiB3aGljaCBwb3NzaWJseSBjb252ZXJ0cyB0aGlzIHVzaW5nIERPUy1zdHlsZSBzaG9ydCBtb2RlLgorICAjIElmIHNvLCB0aGUgdXBkYXRlZCBwYXRoIGlzIHN0b3JlZCBpbiAkbmV3X3BhdGguCisgIG5ld19wYXRoPSIkaW5wdXRfdG9fc2hvcnRwYXRoIgorICBCQVNJQ19NQUtFX1dJTkRPV1NfU1BBQ0VfU0FGRV9DWUdXSU4oWyRpbnB1dF90b19zaG9ydHBhdGhdKQorICAjIHJlbW92ZSB0cmFpbGluZyAuZXhlIGlmIGFueQorICBuZXdfcGF0aD0iJHtuZXdfcGF0aC8lLmV4ZS99IgorXSkKKworQUNfREVGVU4oW0JBU0lDX0ZJWFVQX0VYRUNVVEFCTEVfTVNZU10sCitbCisgICMgRmlyc3Qgc2VwYXJhdGUgdGhlIHBhdGggZnJvbSB0aGUgYXJndW1lbnRzLiBUaGlzIHdpbGwgc3BsaXQgYXQgdGhlIGZpcnN0CisgICMgc3BhY2UuCisgIGNvbXBsZXRlPSJbJF0kMSIKKyAgcGF0aD0iJHtjb21wbGV0ZSUlICp9IgorICB0bXA9IiRjb21wbGV0ZSBFT0wiCisgIGFyZ3VtZW50cz0iJHt0bXAjKiB9IgorCisgICMgSW5wdXQgbWlnaHQgYmUgZ2l2ZW4gYXMgV2luZG93cyBmb3JtYXQsIHN0YXJ0IGJ5IGNvbnZlcnRpbmcgdG8KKyAgIyB1bml4IGZvcm1hdC4KKyAgbmV3X3BhdGg9IiRwYXRoIgorICBCQVNJQ19XSU5ET1dTX1JFV1JJVEVfQVNfVU5JWF9QQVRIKG5ld19wYXRoKQorCisgICMgTm93IHRyeSB0byBsb2NhdGUgZXhlY3V0YWJsZSB1c2luZyB3aGljaAorICBuZXdfcGF0aD1gJFdISUNIICIkbmV3X3BhdGgiIDI+IC9kZXYvbnVsbGAKKyAgCisgIGlmIHRlc3QgIngkbmV3X3BhdGgiID0geDsgdGhlbgorICAgICMgT29wcy4gV2hpY2ggZGlkbid0IGZpbmQgdGhlIGV4ZWN1dGFibGUuCisgICAgIyBUaGUgc3BsaXR0aW5nIG9mIGFyZ3VtZW50cyBmcm9tIHRoZSBleGVjdXRhYmxlIGF0IGEgc3BhY2UgbWlnaHQgaGF2ZSBiZWVuIGluY29ycmVjdCwKKyAgICAjIHNpbmNlIHBhdGhzIHdpdGggc3BhY2UgYXJlIG1vcmUgbGlrZWx5IGluIFdpbmRvd3MuIEdpdmUgaXQgYW5vdGhlciB0cnkgd2l0aCB0aGUgd2hvbGUKKyAgICAjIGFyZ3VtZW50LgorICAgIHBhdGg9IiRjb21wbGV0ZSIKKyAgICBhcmd1bWVudHM9IkVPTCIKKyAgICBuZXdfcGF0aD0iJHBhdGgiCisgICAgQkFTSUNfV0lORE9XU19SRVdSSVRFX0FTX1VOSVhfUEFUSChuZXdfcGF0aCkKKyAgICAKKyAgICBuZXdfcGF0aD1gJFdISUNIICIkbmV3X3BhdGgiIDI+IC9kZXYvbnVsbGAKKyAgICAKKyAgICBpZiB0ZXN0ICJ4JG5ld19wYXRoIiA9IHg7IHRoZW4KKyAgICAgICMgSXQncyBzdGlsbCBub3QgZm91bmQuIE5vdyB0aGlzIGlzIGFuIHVucmVjb3ZlcmFibGUgZXJyb3IuCisgICAgICBBQ19NU0dfTk9USUNFKFtUaGUgcGF0aCBvZiAkMSwgd2hpY2ggcmVzb2x2ZXMgYXMgIiRjb21wbGV0ZSIsIGlzIG5vdCBmb3VuZC5dKQorICAgICAgaGFzX3NwYWNlPWAkRUNITyAiJGNvbXBsZXRlIiB8ICRHUkVQICIgImAKKyAgICAgIGlmIHRlc3QgIngkaGFzX3NwYWNlIiAhPSB4OyB0aGVuCisgICAgICAgIEFDX01TR19OT1RJQ0UoW1lvdSBtaWdodCBiZSBtaXhpbmcgc3BhY2VzIGluIHRoZSBwYXRoIGFuZCBleHRyYSBhcmd1bWVudHMsIHdoaWNoIGlzIG5vdCBhbGxvd2VkLl0pCisgICAgICBmaQorICAgICAgQUNfTVNHX0VSUk9SKFtDYW5ub3QgbG9jYXRlIHRoZSB0aGUgcGF0aCBvZiAkMV0pCisgICAgZmkKKyAgZmkKKworICAjIE5vdyBuZXdfcGF0aCBoYXMgYSBjb21wbGV0ZSB1bml4IHBhdGggdG8gdGhlIGJpbmFyeQorICBpZiB0ZXN0ICJ4YCRFQ0hPICRuZXdfcGF0aCB8ICRHUkVQIF4vYmluL2AiICE9IHg7IHRoZW4KKyAgICAjIEtlZXAgcGF0aHMgaW4gL2JpbiBhcy1pcywgYnV0IHJlbW92ZSB0cmFpbGluZyAuZXhlIGlmIGFueQorICAgIG5ld19wYXRoPSIke25ld19wYXRoLyUuZXhlL30iCisgICAgIyBEbyBub3Qgc2F2ZSAvYmluIHBhdGhzIHRvIGFsbF9maXhwYXRoX3ByZWZpeGVzIQorICBlbHNlCisgICAgIyBOb3QgaW4gbWl4ZWQgb3IgV2luZG93cyBzdHlsZSwgc3RhcnQgYnkgdGhhdC4KKyAgICBuZXdfcGF0aD1gY21kIC8vYyBlY2hvICRuZXdfcGF0aGAKKyAgICBCQVNJQ19NQUtFX1dJTkRPV1NfU1BBQ0VfU0FGRV9NU1lTKFskbmV3X3BhdGhdKQorICAgICMgT3V0cHV0IGlzIGluICRuZXdfcGF0aAorICAgIEJBU0lDX1dJTkRPV1NfUkVXUklURV9BU19VTklYX1BBVEgobmV3X3BhdGgpCisgICAgIyByZW1vdmUgdHJhaWxpbmcgLmV4ZSBpZiBhbnkKKyAgICBuZXdfcGF0aD0iJHtuZXdfcGF0aC8lLmV4ZS99IgorCisgICAgIyBTYXZlIHRoZSBmaXJzdCAxMCBieXRlcyBvZiB0aGlzIHBhdGggdG8gdGhlIHN0b3JhZ2UsIHNvIGZpeHBhdGggY2FuIHdvcmsuCisgICAgYWxsX2ZpeHBhdGhfcHJlZml4ZXM9KCIke2FsbF9maXhwYXRoX3ByZWZpeGVzQDw6QEBAOj5AfSIgIiR7bmV3X3BhdGg6MDoxMH0iKQorICBmaQorXSkKKworIyBTZXR1cCBiYXNpYyBjb25maWd1cmF0aW9uIHBhdGhzLCBhbmQgcGxhdGZvcm0tc3BlY2lmaWMgc3R1ZmYgcmVsYXRlZCB0byBQQVRIcy4KK0FDX0RFRlVOKFtCQVNJQ19DSEVDS19QQVRIU19XSU5ET1dTXSwKK1sKKyAgU1JDX1JPT1RfTEVOR1RIPWAkVEhFUFdEQ01EfCRXQyAtbWAKKyAgaWYgdGVzdCAkU1JDX1JPT1RfTEVOR1RIIC1ndCAxMDA7IHRoZW4KKyAgICAgIEFDX01TR19FUlJPUihbWW91ciBiYXNlIHBhdGggaXMgdG9vIGxvbmcuIEl0IGlzICRTUkNfUk9PVF9MRU5HVEggY2hhcmFjdGVycyBsb25nLCBidXQgb25seSAxMDAgaXMgc3VwcG9ydGVkXSkKKyAgZmkKKworICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5jeWd3aW4iOyB0aGVuCisgICAgQUNfTVNHX0NIRUNLSU5HKFtjeWd3aW4gcmVsZWFzZV0pCisgICAgQ1lHV0lOX1ZFUlNJT049YCRVTkFNRSAtcmAKKyAgICBBQ19NU0dfUkVTVUxUKFskQ1lHV0lOX1ZFUlNJT05dKQorICAgIFdJTkRPV1NfRU5WX1ZFTkRPUj0nY3lnd2luJworICAgIFdJTkRPV1NfRU5WX1ZFUlNJT049IiRDWUdXSU5fVkVSU0lPTiIKKyAgICAKKyAgICBDWUdXSU5fVkVSU0lPTl9PSz1gJEVDSE8gJENZR1dJTl9WRVJTSU9OIHwgJEdSRVAgXjEuNy5gCisgICAgaWYgdGVzdCAieCRDWUdXSU5fVkVSU0lPTl9PSyIgPSB4OyB0aGVuCisgICAgICBBQ19NU0dfTk9USUNFKFtZb3VyIGN5Z3dpbiBpcyB0b28gb2xkLiBZb3UgYXJlIHJ1bm5pbmcgJENZR1dJTl9WRVJTSU9OLCBidXQgYXQgbGVhc3QgY3lnd2luIDEuNyBpcyByZXF1aXJlZC4gUGxlYXNlIHVwZ3JhZGUuXSkKKyAgICAgIEFDX01TR19FUlJPUihbQ2Fubm90IGNvbnRpbnVlXSkKKyAgICBmaQorICAgIGlmIHRlc3QgIngkQ1lHUEFUSCIgPSB4OyB0aGVuCisgICAgICAgIEFDX01TR19FUlJPUihbU29tZXRoaW5nIGlzIHdyb25nIHdpdGggeW91ciBjeWd3aW4gaW5zdGFsbGF0aW9uIHNpbmNlIEkgY2Fubm90IGZpbmQgY3lncGF0aC5leGUgaW4geW91ciBwYXRoXSkKKyAgICBmaQorICAgIEFDX01TR19DSEVDS0lORyhbY3lnd2luIHJvb3QgZGlyZWN0b3J5IGFzIHVuaXgtc3R5bGUgcGF0aF0pCisgICAgIyBUaGUgY21kIG91dHB1dCBlbmRzIHdpdGggV2luZG93cyBsaW5lIGVuZGluZ3MgKENSL0xGKSwgdGhlIGdyZXAgY29tbWFuZCB3aWxsIHN0cmlwIHRoYXQgYXdheQorICAgIGN5Z3dpbl93aW5wYXRoX3Jvb3Q9YGNkIC8gOyBjbWQgL2MgY2QgfCBncmVwICIuKiJgCisgICAgIyBGb3JjZSBjeWdwYXRoIHRvIHJlcG9ydCB0aGUgcHJvcGVyIHJvb3QgYnkgaW5jbHVkaW5nIGEgdHJhaWxpbmcgc3BhY2UsIGFuZCB0aGVuIHN0cmlwcGluZyBpdCBvZmYgYWdhaW4uCisgICAgQ1lHV0lOX1JPT1RfUEFUSD1gJENZR1BBVEggLXUgIiRjeWd3aW5fd2lucGF0aF9yb290ICIgfCAkQ1VUIC1mIDEgLWQgIiAiYAorICAgIEFDX01TR19SRVNVTFQoWyRDWUdXSU5fUk9PVF9QQVRIXSkKKyAgICBXSU5ET1dTX0VOVl9ST09UX1BBVEg9IiRDWUdXSU5fUk9PVF9QQVRIIgorICAgIHRlc3RfY3lnZHJpdmVfcHJlZml4PWAkRUNITyAkQ1lHV0lOX1JPT1RfUEFUSCB8ICRHUkVQIF4vY3lnZHJpdmUvYAorICAgIGlmIHRlc3QgIngkdGVzdF9jeWdkcml2ZV9wcmVmaXgiID0geDsgdGhlbgorICAgICAgICBBQ19NU0dfRVJST1IoW1lvdXIgY3lnZHJpdmUgcHJlZml4IGlzIG5vdCAvY3lnZHJpdmUuIFRoaXMgaXMgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQuIENoYW5nZSB3aXRoIG1vdW50IC1jLl0pCisgICAgZmkKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorICAgIEFDX01TR19DSEVDS0lORyhbbXN5cyByZWxlYXNlXSkKKyAgICBNU1lTX1ZFUlNJT049YCRVTkFNRSAtcmAKKyAgICBBQ19NU0dfUkVTVUxUKFskTVNZU19WRVJTSU9OXSkKKyAgICAKKyAgICBXSU5ET1dTX0VOVl9WRU5ET1I9J21zeXMnCisgICAgV0lORE9XU19FTlZfVkVSU0lPTj0iJE1TWVNfVkVSU0lPTiIKKworICAgIEFDX01TR19DSEVDS0lORyhbbXN5cyByb290IGRpcmVjdG9yeSBhcyB1bml4LXN0eWxlIHBhdGhdKQorICAgICMgVGhlIGNtZCBvdXRwdXQgZW5kcyB3aXRoIFdpbmRvd3MgbGluZSBlbmRpbmdzIChDUi9MRiksIHRoZSBncmVwIGNvbW1hbmQgd2lsbCBzdHJpcCB0aGF0IGF3YXkKKyAgICBNU1lTX1JPT1RfUEFUSD1gY2QgLyA7IGNtZCAvYyBjZCB8IGdyZXAgIi4qImAKKyAgICBCQVNJQ19XSU5ET1dTX1JFV1JJVEVfQVNfVU5JWF9QQVRIKE1TWVNfUk9PVF9QQVRIKQorICAgIEFDX01TR19SRVNVTFQoWyRNU1lTX1JPT1RfUEFUSF0pCisgICAgV0lORE9XU19FTlZfUk9PVF9QQVRIPSIkTVNZU19ST09UX1BBVEgiCisgIGVsc2UKKyAgICBBQ19NU0dfRVJST1IoW1Vua25vd24gV2luZG93cyBlbnZpcm9ubWVudC4gTmVpdGhlciBjeWd3aW4gbm9yIG1zeXMgd2FzIGRldGVjdGVkLl0pCisgIGZpCisKKyAgIyBUZXN0IGlmIHdpbmRvd3Mgb3IgdW5peCAoY3lnd2luL21zeXMpIGZpbmQgaXMgZmlyc3QgaW4gcGF0aC4KKyAgQUNfTVNHX0NIRUNLSU5HKFt3aGF0IGtpbmQgb2YgJ2ZpbmQnIGlzIGZpcnN0IG9uIHRoZSBQQVRIXSkKKyAgRklORF9CSU5BUllfT1VUUFVUPWBmaW5kIC0tdmVyc2lvbiAyPiYxYAorICBpZiB0ZXN0ICJ4YGVjaG8gJEZJTkRfQklOQVJZX09VVFBVVCB8ICRHUkVQIEdOVWAiICE9IHg7IHRoZW4KKyAgICBBQ19NU0dfUkVTVUxUKFt1bml4IHN0eWxlXSkKKyAgZWxpZiB0ZXN0ICJ4YGVjaG8gJEZJTkRfQklOQVJZX09VVFBVVCB8ICRHUkVQIEZJTkRgIiAhPSB4OyB0aGVuCisgICAgQUNfTVNHX1JFU1VMVChbV2luZG93c10pCisgICAgQUNfTVNHX05PVElDRShbWW91ciBwYXRoIGNvbnRhaW5zIFdpbmRvd3MgdG9vbHMgKEM6XFdpbmRvd3Ncc3lzdGVtMzIpIGJlZm9yZSB5b3VyIHVuaXggKGN5Z3dpbiBvciBtc3lzKSB0b29scy5dKQorICAgIEFDX01TR19OT1RJQ0UoW1RoaXMgd2lsbCBub3Qgd29yay4gUGxlYXNlIGNvcnJlY3QgYW5kIG1ha2Ugc3VyZSAvdXNyL2JpbiAob3Igc2ltaWxhcikgaXMgZmlyc3QgaW4gcGF0aC5dKQorICAgIEFDX01TR19FUlJPUihbQ2Fubm90IGNvbnRpbnVlXSkKKyAgZWxzZQorICAgIEFDX01TR19SRVNVTFQoW3Vua25vd25dKQorICAgIEFDX01TR19XQVJOKFtJdCBzZWVtcyB0aGF0IHlvdXIgZmluZCB1dGlsaXR5IGlzIG5vbi1zdGFuZGFyZC5dKQorICBmaQorXSkKKworQUNfREVGVU5fT05DRShbQkFTSUNfQ09NUElMRV9GSVhQQVRIXSwKK1sKKyMgV2hlbiB1c2luZyBjeWd3aW4gb3IgbXN5cywgd2UgbmVlZCBhIHdyYXBwZXIgYmluYXJ5IHRoYXQgcmVuYW1lcworIyAvY3lnZHJpdmUvYy8gYXJndW1lbnRzIGludG8gYzovIGFyZ3VtZW50cyBhbmQgcGVla3MgaW50bworIyBAZmlsZXMgYW5kIHJld3JpdGVzIHRoZXNlIHRvbyEgVGhpcyB3cmFwcGVyIGJpbmFyeSBpcworIyBjYWxsZWQgZml4cGF0aC4KK0ZJWFBBVEg9CitpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1MiID0geHdpbmRvd3M7IHRoZW4KKyAgICBBQ19NU0dfQ0hFQ0tJTkcoW2lmIGZpeHBhdGggY2FuIGJlIGNyZWF0ZWRdKQorICAgIEZJWFBBVEhfU1JDPSIkU1JDX1JPT1QvY29tbW9uL3NyYy9maXhwYXRoLmMiCisgICAgRklYUEFUSF9CSU49IiRPVVRQVVRfUk9PVC9maXhwYXRoLmV4ZSIKKyAgICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9IHh3aW5kb3dzLmN5Z3dpbjsgdGhlbgorICAgICAgRklYUEFUSF9TUkM9YCRDWUdQQVRIIC1tICRGSVhQQVRIX1NSQ2AKKyAgICAgIEZJWFBBVEhfQklOPWAkQ1lHUEFUSCAtbSAkRklYUEFUSF9CSU5gCisgICAgICAjIEltcG9ydGFudCB0byBrZWVwIHRoZSAuZXhlIHN1ZmZpeCBvbiBDeWd3aW4gZm9yIEhvdHNwb3QgbWFrZWZpbGVzCisgICAgICBGSVhQQVRIPSIkT1VUUFVUX1JPT1QvZml4cGF0aC5leGUgLWMiCisgICAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9IHh3aW5kb3dzLm1zeXM7IHRoZW4KKyAgICAgIEZJWFBBVEhfU1JDPWBjbWQgLy9jIGVjaG8gJEZJWFBBVEhfU1JDYAorICAgICAgRklYUEFUSF9CSU49YGNtZCAvL2MgZWNobyAkRklYUEFUSF9CSU5gCisKKyAgICAgICMgVGFrZSBhbGwgY29sbGVjdGVkIHByZWZpeGVzIGFuZCB0dXJuIHRoZW0gaW50byBhIC1tL2MvZm9vQC9jL2JhckAuLi4gY29tbWFuZCBsaW5lCisgICAgICAjIEAgd2FzIGNob3NlbiBhcyBzZXBhcmF0b3IgdG8gbWluaW1pemUgcmlzayBvZiBvdGhlciB0b29scyBtZXNzaW5nIGFyb3VuZCB3aXRoIGl0CisgICAgICBhbGxfdW5pcXVlX3ByZWZpeGVzPWBlY2hvICIke2FsbF9maXhwYXRoX3ByZWZpeGVzQDw6QEBAOj5AfSIgfCB0ciAnICcgJ1xuJyB8IGdyZXAgJ14vLi8nIHwgc29ydCB8IHVuaXFgCisgICAgICBmaXhwYXRoX2FyZ3VtZW50X2xpc3Q9YGVjaG8gJGFsbF91bmlxdWVfcHJlZml4ZXMgIHwgdHIgJyAnICdAJ2AKKyAgICAgIAorICAgICAgRklYUEFUSD0iJE9VVFBVVF9ST09UL2ZpeHBhdGggLW0kZml4cGF0aF9hcmd1bWVudF9saXN0IgorICAgIGZpCisgICAgcm0gLWYgJE9VVFBVVF9ST09UL2ZpeHBhdGgqCisgICAgY2QgJE9VVFBVVF9ST09UCisgICAgJENDICRGSVhQQVRIX1NSQyAtRmUkRklYUEFUSF9CSU4gPiAkT1VUUFVUX1JPT1QvZml4cGF0aDEubG9nIDI+JjEKKyAgICBjZCAkQ1VSRElSCisKKyAgICBpZiB0ZXN0ICEgLXggJE9VVFBVVF9ST09UL2ZpeHBhdGguZXhlOyB0aGVuIAorICAgICAgICBBQ19NU0dfUkVTVUxUKFtub10pCisgICAgICAgIGNhdCAkT1VUUFVUX1JPT1QvZml4cGF0aDEubG9nCisgICAgICAgIEFDX01TR19FUlJPUihbQ291bGQgbm90IGNyZWF0ZSAkT1VUUFVUX1JPT1QvZml4cGF0aC5leGVdKQorICAgIGZpCisgICAgQUNfTVNHX1JFU1VMVChbeWVzXSkKKyAgICBBQ19NU0dfQ0hFQ0tJTkcoW2lmIGZpeHBhdGguZXhlIHdvcmtzXSkKKyAgICBjZCAkT1VUUFVUX1JPT1QKKyAgICAkRklYUEFUSCAkQ0MgJFNSQ19ST09UL2NvbW1vbi9zcmMvZml4cGF0aC5jIC1GZSRPVVRQVVRfUk9PVC9maXhwYXRoMi5leGUgPiAkT1VUUFVUX1JPT1QvZml4cGF0aDIubG9nIDI+JjEgCisgICAgY2QgJENVUkRJUgorICAgIGlmIHRlc3QgISAteCAkT1VUUFVUX1JPT1QvZml4cGF0aDIuZXhlOyB0aGVuIAorICAgICAgICBBQ19NU0dfUkVTVUxUKFtub10pCisgICAgICAgIGNhdCAkT1VUUFVUX1JPT1QvZml4cGF0aDIubG9nCisgICAgICAgIEFDX01TR19FUlJPUihbZml4cGF0aCBkaWQgbm90IHdvcmshXSkKKyAgICBmaQorICAgIEFDX01TR19SRVNVTFQoW3llc10pCisgICAgcm0gLWYgJE9VVFBVVF9ST09UL2ZpeHBhdGg/Lj8/PyAkT1VUUFVUX1JPT1QvZml4cGF0aC5vYmoKK2ZpCisKK0FDX1NVQlNUKEZJWFBBVEgpCitdKQpkaWZmIC0tZ2l0IGEvY29tbW9uL2F1dG9jb25mL2Jvb3QtamRrLm00IGIvY29tbW9uL2F1dG9jb25mL2Jvb3QtamRrLm00CmluZGV4IGM0Y2U4ODMuLjRhNGVhMzYgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9hdXRvY29uZi9ib290LWpkay5tNAorKysgYi9jb21tb24vYXV0b2NvbmYvYm9vdC1qZGsubTQKQEAgLTYyLDkgKzYyLDEyIEBACiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICMgV2UncmUgZG9uZSEgOi0pCiAgICAgICAgICAgICAgIEJPT1RfSkRLX0ZPVU5EPXllcwotICAgICAgICAgICAgICBTUEFDRVNBRkUoQk9PVF9KREssW3RoZSBwYXRoIHRvIHRoZSBCb290IEpES10pCisgICAgICAgICAgICAgIEJBU0lDX0ZJWFVQX1BBVEgoQk9PVF9KREspCiAgICAgICAgICAgICAgIEFDX01TR19DSEVDS0lORyhbZm9yIEJvb3QgSkRLXSkKLSAgICAgICAgICAgICAgQUNfTVNHX1JFU1VMVChbJEJPT1RfSkRLICgkQk9PVF9KREtfVkVSU0lPTildKQorICAgICAgICAgICAgICBBQ19NU0dfUkVTVUxUKFskQk9PVF9KREtdKQorICAgICAgICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW0Jvb3QgSkRLIHZlcnNpb25dKQorICAgICAgICAgICAgICBCT09UX0pES19WRVJTSU9OPWAiJEJPT1RfSkRLL2Jpbi9qYXZhIiAtdmVyc2lvbiAyPiYxIHwgJFRSICdcblxyJyAnICAnYAorICAgICAgICAgICAgICBBQ19NU0dfUkVTVUxUKFskQk9PVF9KREtfVkVSU0lPTl0pCiAgICAgICAgICAgICBmaSAjIGVuZCBjaGVjayBqZGsgdmVyc2lvbgogICAgICAgICAgIGZpICMgZW5kIGNoZWNrIHJ0LmphcgogICAgICAgICBmaSAjIGVuZCBjaGVjayBqYXZhYwpAQCAtOTMsMTIgKzk2LDggQEAKIEFDX0RFRlVOKFtCT09USkRLX0NIRUNLX0pBVkFfSE9NRV0sCiBbCiAgICAgaWYgdGVzdCAieCRKQVZBX0hPTUUiICE9IHg7IHRoZW4KLSAgICAgICAgaWYgdGVzdCAieCRPUEVOSkRLX1RBUkdFVF9PUyIgPSB4d2luZG93czsgdGhlbgotICAgICAgICAgICMgT24gV2luZG93cywgSkFWQV9IT01FIGlzIGxpa2VseSBpbiBET1Mtc3R5bGUKLSAgICAgICAgICBKQVZBX0hPTUVfUFJPQ0VTU0VEPSJgJENZR1BBVEggLXUgIiRKQVZBX0hPTUUiYCIKLSAgICAgICAgZWxzZQotICAgICAgICAgIEpBVkFfSE9NRV9QUk9DRVNTRUQ9IiRKQVZBX0hPTUUiCi0gICAgICAgIGZpCisgICAgICAgIEpBVkFfSE9NRV9QUk9DRVNTRUQ9IiRKQVZBX0hPTUUiCisgICAgICAgIEJBU0lDX0ZJWFVQX1BBVEgoSkFWQV9IT01FX1BST0NFU1NFRCkKICAgICAgICAgaWYgdGVzdCAhIC1kICIkSkFWQV9IT01FX1BST0NFU1NFRCI7IHRoZW4KICAgICAgICAgICAgIEFDX01TR19OT1RJQ0UoW1lvdXIgSkFWQV9IT01FIHBvaW50cyB0byBhIG5vbi1leGlzdGluZyBkaXJlY3RvcnkhXSkKICAgICAgICAgZWxzZQpAQCAtMTI1LDggKzEyNCw3IEBACiAgICAgICAgICMgTGV0cyBmaW5kIHRoZSBKREsvSlJFIGRpcmVjdG9yeSBieSBmb2xsb3dpbmcgc3ltYm9saWMgbGlua3MuCiAgICAgICAgICMgTGludXgvR05VIHN5c3RlbXMgb2Z0ZW4gaGF2ZSBsaW5rcyBmcm9tIC91c3IvYmluL2phdmEgdG8gCiAgICAgICAgICMgL2V0Yy9hbHRlcm5hdGl2ZXMvamF2YSB0byB0aGUgcmVhbCBKREsgYmluYXJ5LgotICAgICAgICBTRVRfRlVMTF9QQVRIX1NQQUNFU0FGRShCSU5BUlkpCi0gICAgICAgIFJFTU9WRV9TWU1CT0xJQ19MSU5LUyhCSU5BUlkpCisgICAgICAgIEJBU0lDX1JFTU9WRV9TWU1CT0xJQ19MSU5LUyhCSU5BUlkpCiAgICAgICAgIEJPT1RfSkRLPWBkaXJuYW1lICIkQklOQVJZImAKICAgICAgICAgQk9PVF9KREs9YGNkICIkQk9PVF9KREsvLi4iOyBwd2RgCiAgICAgICAgIGlmIHRlc3QgLXggIiRCT09UX0pESy9iaW4vamF2YWMiICYmIHRlc3QgLXggIiRCT09UX0pESy9iaW4vamF2YSI7IHRoZW4KQEAgLTE1NSwxMyArMTUzLDE3IEBACiBbCiAgIEJPT1RfSkRLX1BSRUZJWD0iJDEiCiAgIEJPT1RfSkRLX1NVRkZJWD0iJDIiCi0gIEJFU1RfSkRLX0ZPVU5EPWAkTFMgIiRCT09UX0pES19QUkVGSVgiIDI+IC9kZXYvbnVsbCB8ICRHUkVQIGpkayB8ICRTT1JUIC1yIHwgJEhFQUQgLW4gMSBgCi0gIGlmIHRlc3QgIngkQkVTVF9KREtfRk9VTkQiICE9IHg7IHRoZW4KLSAgICBCT09UX0pESz0iJHtCT09UX0pES19QUkVGSVh9LyR7QkVTVF9KREtfRk9VTkR9JHtCT09UX0pES19TVUZGSVh9IgotICAgIGlmIHRlc3QgLWQgIiRCT09UX0pESyI7IHRoZW4KLSAgICAgIEJPT1RfSkRLX0ZPVU5EPW1heWJlCi0gICAgICBBQ19NU0dfTk9USUNFKFtGb3VuZCBwb3RlbnRpYWwgQm9vdCBKREsgdXNpbmcgd2VsbC1rbm93biBsb2NhdGlvbnMgKGluICRCT09UX0pES19QUkVGSVgpXSkKLSAgICBmaQorICBBTExfSkRLU19GT1VORD1gJExTICIkQk9PVF9KREtfUFJFRklYIiAyPiAvZGV2L251bGwgfCAkU09SVCAtcmAKKyAgaWYgdGVzdCAieCRBTExfSkRLU19GT1VORCIgIT0geDsgdGhlbgorICAgIGZvciBKREtfVE9fVFJZIGluICRBTExfSkRLU19GT1VORCA7IGRvCisgICAgICBCT09USkRLX0RPX0NIRUNLKFsKKyAgICAgICAgQk9PVF9KREs9IiR7Qk9PVF9KREtfUFJFRklYfS8ke0pES19UT19UUll9JHtCT09UX0pES19TVUZGSVh9IgorICAgICAgICBpZiB0ZXN0IC1kICIkQk9PVF9KREsiOyB0aGVuCisgICAgICAgICAgQk9PVF9KREtfRk9VTkQ9bWF5YmUKKyAgICAgICAgICBBQ19NU0dfTk9USUNFKFtGb3VuZCBwb3RlbnRpYWwgQm9vdCBKREsgdXNpbmcgd2VsbC1rbm93biBsb2NhdGlvbnMgKGluICRCT09UX0pES19QUkVGSVgvJEpES19UT19UUlkpXSkKKyAgICAgICAgZmkKKyAgICAgIF0pCisgICAgZG9uZQogICBmaQogXSkKIApAQCAtMTcxLDcgKzE3Myw5IEBACiBBQ19ERUZVTihbQk9PVEpES19GSU5EX0JFU1RfSkRLX0lOX1dJTkRPV1NfVklSVFVBTF9ESVJFQ1RPUlldLAogWwogICBpZiB0ZXN0ICJ4WyRdJDEiICE9IHg7IHRoZW4KLSAgICBCT09USkRLX0ZJTkRfQkVTVF9KREtfSU5fRElSRUNUT1JZKFtgJENZR1BBVEggLXUgIlskXSQxImAvSmF2YV0pCisgICAgVklSVFVBTF9ESVI9IlskXSQxL0phdmEiCisgICAgQkFTSUNfV0lORE9XU19SRVdSSVRFX0FTX1VOSVhfUEFUSChWSVJUVUFMX0RJUikKKyAgICBCT09USkRLX0ZJTkRfQkVTVF9KREtfSU5fRElSRUNUT1JZKCRWSVJUVUFMX0RJUikKICAgZmkKIF0pCiAKQEAgLTE4Nyw2ICsxOTEsOCBAQAogICBlbGlmIHRlc3QgIngkT1BFTkpES19UQVJHRVRfT1MiID0geG1hY29zeDsgdGhlbgogICAgIEJPT1RKREtfRE9fQ0hFQ0soW0JPT1RKREtfRklORF9CRVNUX0pES19JTl9ESVJFQ1RPUlkoWy9MaWJyYXJ5L0phdmEvSmF2YVZpcnR1YWxNYWNoaW5lc10sWy9Db250ZW50cy9Ib21lXSldKQogICAgIEJPT1RKREtfRE9fQ0hFQ0soW0JPT1RKREtfRklORF9CRVNUX0pES19JTl9ESVJFQ1RPUlkoWy9TeXN0ZW0vTGlicmFyeS9KYXZhL0phdmFWaXJ0dWFsTWFjaGluZXNdLFsvQ29udGVudHMvSG9tZV0pXSkKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfVEFSR0VUX09TIiA9IHhsaW51eDsgdGhlbgorICAgIEJPT1RKREtfRE9fQ0hFQ0soW0JPT1RKREtfRklORF9CRVNUX0pES19JTl9ESVJFQ1RPUlkoWy91c3IvbGliL2p2bV0pXSkKICAgZmkKIF0pCiAKZGlmZiAtLWdpdCBhL2NvbW1vbi9hdXRvY29uZi9idWlsZC1hdXgvY29uZmlnLmd1ZXNzIGIvY29tbW9uL2F1dG9jb25mL2J1aWxkLWF1eC9jb25maWcuZ3Vlc3MKaW5kZXggOWQ5ZDI5Yi4uNTcyZWQyYiAxMDA2NDQKLS0tIGEvY29tbW9uL2F1dG9jb25mL2J1aWxkLWF1eC9jb25maWcuZ3Vlc3MKKysrIGIvY29tbW9uL2F1dG9jb25mL2J1aWxkLWF1eC9jb25maWcuZ3Vlc3MKQEAgLTQ4LDYgKzQ4LDkgQEAKIAogIyBUZXN0IGFuZCBmaXggY3lnd2luIG9uIHg4Nl82NAogZWNobyAkT1VUIHwgZ3JlcCA4Ni1wYy1jeWd3aW4gPiAvZGV2L251bGwgMj4gL2Rldi9udWxsCitpZiB0ZXN0ICQ/ICE9IDA7IHRoZW4KKyAgZWNobyAkT1VUIHwgZ3JlcCA4Ni1wYy1taW5ndyA+IC9kZXYvbnVsbCAyPiAvZGV2L251bGwKK2ZpCiBpZiB0ZXN0ICQ/ID0gMDsgdGhlbgogICBjYXNlIGBlY2hvICRQUk9DRVNTT1JfSURFTlRJRklFUiB8IGN1dCAtZjEgLWQnICdgIGluCiAgICAgaW50ZWw2NHxJbnRlbDY0fElOVEVMNjR8ZW02NHR8RU02NFR8YW1kNjR8QU1ENjR8ODY2NHx4ODZfNjQpCmRpZmYgLS1naXQgYS9jb21tb24vYXV0b2NvbmYvYnVpbGQtcGVyZm9ybWFuY2UubTQgYi9jb21tb24vYXV0b2NvbmYvYnVpbGQtcGVyZm9ybWFuY2UubTQKaW5kZXggNWFkNTgzNy4uMDgzOGU4NiAxMDA2NDQKLS0tIGEvY29tbW9uL2F1dG9jb25mL2J1aWxkLXBlcmZvcm1hbmNlLm00CisrKyBiL2NvbW1vbi9hdXRvY29uZi9idWlsZC1wZXJmb3JtYW5jZS5tNApAQCAtNDEsNiArNDEsMTAgQEAKICAgICAgICAgIyBMb29rcyBsaWtlIGEgTWFjT1NYIHN5c3RlbQogICAgICAgICBOVU1fQ09SRVM9YC91c3Ivc2Jpbi9zeXN0ZW1fcHJvZmlsZXIgLWRldGFpbExldmVsIGZ1bGwgU1BIYXJkd2FyZURhdGFUeXBlIHwgZ3JlcCAnQ29yZXMnIHwgYXdrICAne3ByaW50IFskXTV9J2AKICAgICAgICAgRk9VTkRfQ09SRVM9eWVzCisgICAgZWxpZiB0ZXN0IC1uICIkTlVNQkVSX09GX1BST0NFU1NPUlMiOyB0aGVuCisgICAgICAgICMgT24gd2luZG93cywgbG9vayBpbiB0aGUgZW52CisgICAgICAgIE5VTV9DT1JFUz0kTlVNQkVSX09GX1BST0NFU1NPUlMKKyAgICAgICAgRk9VTkRfQ09SRVM9eWVzCiAgICAgZmkKIAogICAgICMgRm9yIGMvYysrIGNvZGUgd2UgcnVuIHR3aWNlIGFzIG1hbnkgY29uY3VycmVudCBidWlsZApAQCAtNTAsNyArNTQsOCBAQAogICAgIGlmIHRlc3QgIngkRk9VTkRfQ09SRVMiID0geHllczsgdGhlbgogICAgICAgICBBQ19NU0dfUkVTVUxUKFskTlVNX0NPUkVTXSkKICAgICBlbHNlCi0gICAgICAgIEFDX01TR19SRVNVTFQoW2NvdWxkIG5vdCBkZXRlY3QgbnVtYmVyIG9mIGNvcmVzLCBkZWZhdWx0aW5nIHRvIDEhXSkKKyAgICAgICAgQUNfTVNHX1JFU1VMVChbY291bGQgbm90IGRldGVjdCBudW1iZXIgb2YgY29yZXMsIGRlZmF1bHRpbmcgdG8gMV0pCisgICAgICAgIEFDX01TR19XQVJOKFtUaGlzIHdpbGwgZGlzYWJsZSBhbGwgcGFyYWxsZWxpc20gZnJvbSBidWlsZCFdKQogICAgIGZpIAogCiBdKQpAQCAtNzYsMTYgKzgxLDE4IEBACiAgICAgICAgIE1FTU9SWV9TSVpFPWAvdXNyL3NiaW4vc3lzdGVtX3Byb2ZpbGVyIC1kZXRhaWxMZXZlbCBmdWxsIFNQSGFyZHdhcmVEYXRhVHlwZSB8IGdyZXAgJ01lbW9yeScgfCBhd2sgICd7cHJpbnQgWyRdMn0nYAogICAgICAgICBNRU1PUllfU0laRT1gZXhwciAkTUVNT1JZX1NJWkUgXCogMTAyNGAKICAgICAgICAgRk9VTkRfTUVNPXllcwotICAgIGVsaWYgdGVzdCAieCRidWlsZF9vcyIgPSB4d2luZG93czsgdGhlbgorICAgIGVsaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TIiA9IHh3aW5kb3dzOyB0aGVuCiAgICAgICAgICMgV2luZG93cywgYnV0IHdpdGhvdXQgY3lnd2luCi0gICAgICAgIE1FTU9SWV9TSVpFPWBzeXN0ZW1pbmZvIHwgZ3JlcCAnVG90YWwgUGh5c2ljYWwgTWVtb3J5OicgfCBhd2sgJ3sgcHJpbnQgWyRdNCB9JyB8IHNlZCAncy8sLy8nYAorICAgICAgICBNRU1PUllfU0laRT1gd21pYyBjb21wdXRlcnN5c3RlbSBnZXQgdG90YWxwaHlzaWNhbG1lbW9yeSAtdmFsdWUgfCBncmVwID0gfCBjdXQgLWQgIj0iIC1mIDItYAorICAgICAgICBNRU1PUllfU0laRT1gZXhwciAkTUVNT1JZX1NJWkUgLyAxMDI0IC8gMTAyNGAKICAgICAgICAgRk9VTkRfTUVNPXllcyAgICAKICAgICBmaQogCiAgICAgaWYgdGVzdCAieCRGT1VORF9NRU0iID0geHllczsgdGhlbgogICAgICAgICBBQ19NU0dfUkVTVUxUKFskTUVNT1JZX1NJWkUgTUJdKQogICAgIGVsc2UKLSAgICAgICAgQUNfTVNHX1JFU1VMVChbY291bGQgbm90IGRldGVjdCBtZW1vcnkgc2l6ZSBkZWZhdWx0aW5nIHRvIDEwMjQgTUIhXSkKKyAgICAgICAgQUNfTVNHX1JFU1VMVChbY291bGQgbm90IGRldGVjdCBtZW1vcnkgc2l6ZSwgZGVmYXVsdGluZyB0byAxMDI0IE1CXSkKKyAgICAgICAgQUNfTVNHX1dBUk4oW1RoaXMgbWlnaHQgc2VyaW91c2x5IGltcGFjdCBidWlsZCBwZXJmb3JtYW5jZSFdKQogICAgIGZpIAogXSkKIApAQCAtMTIzLDcgKzEzMCw3IEBACiBbCiAgICAgQUNfQVJHX0VOQUJMRShbY2NhY2hlXSwKIAkgICAgICBbQVNfSEVMUF9TVFJJTkcoWy0tZGlzYWJsZS1jY2FjaGVdLAotCSAgICAgIAkJICAgICAgW3VzZSBjY2FjaGUgdG8gc3BlZWQgdXAgcmVjb21waWxhdGlvbnMgQDw6QGVuYWJsZWRAOj5AXSldLAorCSAgICAgIAkJICAgICAgW2Rpc2FibGUgdXNpbmcgY2NhY2hlIHRvIHNwZWVkIHVwIHJlY29tcGlsYXRpb25zIEA8OkBlbmFibGVkQDo+QF0pXSwKICAgICAgICAgICAgICAgW0VOQUJMRV9DQ0FDSEU9JHtlbmFibGVfY2NhY2hlfV0sIFtFTkFCTEVfQ0NBQ0hFPXllc10pCiAgICAgaWYgdGVzdCAieCRFTkFCTEVfQ0NBQ0hFIiA9IHh5ZXM7IHRoZW4KICAgICAgICAgQUNfUEFUSF9QUk9HKENDQUNIRSwgY2NhY2hlKQpAQCAtMTk2LDcgKzIwMyw3IEBACiAjIENhbiB0aGUgQy9DKysgY29tcGlsZXIgdXNlIHByZWNvbXBpbGVkIGhlYWRlcnM/CiAjCiBBQ19BUkdfRU5BQkxFKFtwcmVjb21waWxlZC1oZWFkZXJzXSwgW0FTX0hFTFBfU1RSSU5HKFstLWRpc2FibGUtcHJlY29tcGlsZWQtaGVhZGVyc10sCi0JW3VzZSBwcmVjb21waWxlZCBoZWFkZXJzIHdoZW4gY29tcGlsaW5nIEMrKyBAPDpAZW5hYmxlZEA6PkBdKV0sCisJW2Rpc2FibGUgdXNpbmcgcHJlY29tcGlsZWQgaGVhZGVycyB3aGVuIGNvbXBpbGluZyBDKysgQDw6QGVuYWJsZWRAOj5AXSldLAogICAgIFtFTkFCTEVfUFJFQ09NUEg9JHtlbmFibGVfcHJlY29tcGlsZWQtaGVhZGVyc31dLCBbRU5BQkxFX1BSRUNPTVBIPXllc10pCiAKIFVTRV9QUkVDT01QSUxFRF9IRUFERVI9MQpAQCAtMjI4LDggKzIzNSw3IEBACiBBQ19ERUZVTl9PTkNFKFtCUEVSRl9TRVRVUF9TTUFSVF9KQVZBQ10sCiBbCiBBQ19BUkdfV0lUSChzamF2YWMtc2VydmVyLWphdmEsIFtBU19IRUxQX1NUUklORyhbLS13aXRoLXNqYXZhYy1zZXJ2ZXItamF2YV0sCi0JW3VzZSB0aGlzIGphdmEgYmluYXJ5IGZvciBydW5uaW5nIHRoZSBzamF2YWMgYmFja2dyb3VuZCBzZXJ2ZXIgYW5kIG90aGVyIGxvbmcgcnVubmluZyBqYXZhIHRhc2tzIGluIHRoZSBidWlsZCBwcm9jZXNzLAotICAgICBlLmcuIC0tLXdpdGgtc2phdmFjLXNlcnZlci1qYXZhPSIvb3B0L2pyb2NraXQvYmluL2phdmEgLXNlcnZlciJdKV0pCisJW3VzZSB0aGlzIGphdmEgYmluYXJ5IGZvciBydW5uaW5nIHRoZSBzamF2YWMgYmFja2dyb3VuZCBzZXJ2ZXIgQDw6QEJvb3QgSkRLIGphdmFAOj5AXSldKQogCiBpZiB0ZXN0ICJ4JHdpdGhfc2phdmFjX3NlcnZlcl9qYXZhIiAhPSB4OyB0aGVuCiAgICAgU0pBVkFDX1NFUlZFUl9KQVZBPSIkd2l0aF9zamF2YWNfc2VydmVyX2phdmEiCmRpZmYgLS1naXQgYS9jb21tb24vYXV0b2NvbmYvYnVpbGRkZXBzLm00IGIvY29tbW9uL2F1dG9jb25mL2J1aWxkZGVwcy5tNAppbmRleCA2NjEwMDFkLi4yMDdiZTMzIDEwMDY0NAotLS0gYS9jb21tb24vYXV0b2NvbmYvYnVpbGRkZXBzLm00CisrKyBiL2NvbW1vbi9hdXRvY29uZi9idWlsZGRlcHMubTQKQEAgLTIzNSwyNiArMjM1LDEzIEBACiAgICAgW3VzZSB0aGlzIGNvbmZpZ3VyYXRpb24gZmlsZSBmb3IgdGhlIGJ1aWxkZGVwc10pXSkKIAogQUNfQVJHX1dJVEgoYnVpbGRkZXBzLXNlcnZlciwgW0FTX0hFTFBfU1RSSU5HKFstLXdpdGgtYnVpbGRkZXBzLXNlcnZlcl0sCi0gICAgW2Rvd25sb2FkIGFuZCB1c2UgYnVpbGQgZGVwZW5kZW5jaWVzIGZyb20gdGhpcyBzZXJ2ZXIgdXJsLCBlLmcuIC0td2l0aC1idWlsZGRlcHMtc2VydmVyPWZ0cDovL2V4YW1wbGUuY29tL2Rpcl0pXSkKKyAgICBbZG93bmxvYWQgYW5kIHVzZSBidWlsZCBkZXBlbmRlbmNpZXMgZnJvbSB0aGlzIHNlcnZlciB1cmxdKV0pCiAKIEFDX0FSR19XSVRIKGJ1aWxkZGVwcy1kaXIsIFtBU19IRUxQX1NUUklORyhbLS13aXRoLWJ1aWxkZGVwcy1kaXJdLAotICAgIFtzdG9yZSBkb3dubG9hZGVkIGJ1aWxkIGRlcGVuZGVuY2llcyBoZXJlIEA8OkBkL2xvY2FsaG9tZS9idWlsZGRlcHNAOj5AXSldLAorICAgIFtzdG9yZSBkb3dubG9hZGVkIGJ1aWxkIGRlcGVuZGVuY2llcyBoZXJlIEA8OkAvbG9jYWxob21lL2J1aWxkZGVwc0A6PkBdKV0sCiAgICAgW10sCiAgICAgW3dpdGhfYnVpbGRkZXBzX2Rpcj0vbG9jYWxob21lL2J1aWxkZGVwc10pCiAKIEFDX0FSR19XSVRIKGJ1aWxkZGVwcy1ncm91cCwgW0FTX0hFTFBfU1RSSU5HKFstLXdpdGgtYnVpbGRkZXBzLWdyb3VwXSwKICAgICBbY2hncnAgdGhlIGRvd25sb2FkZWQgYnVpbGQgZGVwZW5kZW5jaWVzIHRvIHRoaXMgZ3JvdXBdKV0pCi0KLUFDX0FSR19FTkFCTEUoW2xpc3QtYnVpbGRkZXBzXSwgW0FTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1saXN0LWJ1aWxkZGVwc10sCi0JW2xpc3QgYWxsIGJ1aWxkIGRlcGVuZGVuY2llcyBrbm93biB0byB0aGUgY29uZmlndXJlIHNjcmlwdF0pXSwKLQlbTElTVF9CVUlMRERFUFM9IiR7ZW5hYmxldmFsfSJdLCBbTElTVF9CVUlMRERFUFM9J25vJ10pCi0KLWlmIHRlc3QgIngkTElTVF9CVUlMRERFUFMiID0geHllczsgdGhlbgotICAgIGVjaG8KLSAgICBlY2hvIExpc3Qgb2YgYnVpbGQgZGVwZW5kZW5jaWVzIGtub3duIHRvIHRoZSBjb25maWd1cmUgc2NyaXB0LAotICAgIGVjaG8gdGhhdCBjYW4gYmUgdXNlZCBpbiBidWlsZGRlcHMuY29uZiBmaWxlczoKLSAgICBjYXQgJEFVVE9DT05GX0RJUi8qLmFjICRBVVRPQ09ORl9ESVIvKi5tNCB8IGdyZXAgQkRFUFNfQ0hFQ0tfTU9EVUxbRV1cKCB8IGN1dCAtZiAyIC1kICcsJyB8IHRyIC1kICcgJyB8IHNvcnQKLSAgICBlY2hvCi0gICAgZXhpdCAxCi1maQogXSkKZGlmZiAtLWdpdCBhL2NvbW1vbi9hdXRvY29uZi9jbG9zZWQudmVyc2lvbi5udW1iZXJzIGIvY29tbW9uL2F1dG9jb25mL2Nsb3NlZC52ZXJzaW9uLm51bWJlcnMKaW5kZXggYjExOWNkOS4uYjIyYWQ5NyAxMDA2NDQKLS0tIGEvY29tbW9uL2F1dG9jb25mL2Nsb3NlZC52ZXJzaW9uLm51bWJlcnMKKysrIGIvY29tbW9uL2F1dG9jb25mL2Nsb3NlZC52ZXJzaW9uLm51bWJlcnMKQEAgLTI2LDMgKzI2LDcgQEAKIFBST0RVQ1RfU1VGRklYPSJTRSBSdW50aW1lIEVudmlyb25tZW50IgogSkRLX1JDX1BMQVRGT1JNX05BTUU9IlBsYXRmb3JtIFNFIgogQ09NUEFOWV9OQU1FPSJPcmFjbGUgQ29ycG9yYXRpb24iCisKKyMgTWlnaHQgbmVlZCBiZXR0ZXIgbmFtZXMgZm9yIHRoZXNlCitNQUNPU1hfQlVORExFX05BTUVfQkFTRT0iSmF2YSBTRSIKK01BQ09TWF9CVU5ETEVfSURfQkFTRT0iY29tLm9yYWNsZS5qYXZhIgpkaWZmIC0tZ2l0IGEvY29tbW9uL2F1dG9jb25mL2NvbXBhcmUuc2guaW4gYi9jb21tb24vYXV0b2NvbmYvY29tcGFyZS5zaC5pbgppbmRleCAyNWM4YzdlLi41M2Q2MGI3IDEwMDY0NAotLS0gYS9jb21tb24vYXV0b2NvbmYvY29tcGFyZS5zaC5pbgorKysgYi9jb21tb24vYXV0b2NvbmYvY29tcGFyZS5zaC5pbgpAQCAtNDAsMTIgKzQwLDEyIEBACiBDUD0iQENQQCIKIENVVD0iQENVVEAiCiBESUZGPSJARElGRkAiCi1EVU1QQklOPSJAVU5DWUdEUklWRUAgQERVTVBCSU5AIgorRFVNUEJJTj0iQEZJWFBBVEhAIEBEVU1QQklOQCIKIEVYUFI9IkBFWFBSQCIKIEZJTEU9IkBGSUxFQCIKIEZJTkQ9IkBGSU5EQCIKIEdSRVA9IkBHUkVQQCIKLUpBVkFQPSJAVU5DWUdEUklWRUAgQEJPT1RfSkRLQC9iaW4vamF2YXAiCitKQVZBUD0iQEZJWFBBVEhAIEBCT09UX0pES0AvYmluL2phdmFwIgogTEREPSJATEREQCIKIE1LRElSPSJATUtESVJAIgogTk09IkBOTUAiCkBAIC01Niw2ICs1Niw3IEBACiBSTT0iQFJNQCIKIFNFRD0iQFNFREAiCiBTT1JUPSJAU09SVEAiCitTVEFUPSJAU1RBVEAiCiBTVFJJUD0iQFBPU1RfU1RSSVBfQ01EQCIKIFRFRT0iQFRFRUAiCiBVTklRPSJAVU5JUUAiCkBAIC02MywxNjA3ICs2NCwxNSBAQAogCiBTUkNfUk9PVD0iQFNSQ19ST09UQCIKIAotaWYgWyAiJE9QRU5KREtfVEFSR0VUX09TIiA9ICJtYWNvc3giIF07IHRoZW4KLSAgICBSRUFERUxGX0NNRD0ib3Rvb2wgLXYgLVYgLWggLVggLXQgLWQiCi1lbGlmIFsgLW4gIiRSRUFERUxGIiBdICYmIFsgIiRPUEVOSkRLX1RBUkdFVF9PUyIgIT0gIndpbmRvd3MiIF07IHRoZW4KLSAgICBSRUFERUxGX0NNRD0iJFJFQURFTEYgLWEiCi1maQotCi1pZiBbICIkT1BFTkpES19UQVJHRVRfT1MiID0gIm1hY29zeCIgXTsgdGhlbgotICAgIExERF9DTUQ9IiRPVE9PTCAtTCIKLWVsaWYgWyAtbiAiJExERCIgXTsgdGhlbgotICAgIExERF9DTUQ9IiRMREQiCi1maQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgRGlmZiBleGNlcHRpb25zCi0KLWlmIFsgIiRPUEVOSkRLX1RBUkdFVF9PUyIgPSAibGludXgiIF0gJiYgWyAiJE9QRU5KREtfVEFSR0VUX0NQVSIgPSAieDg2XzY0IiBdOyB0aGVuCi1TVFJJUF9CRUZPUkVfQ09NUEFSRT0iCi0uL2RlbW8vanZtdGkvY29tcGlsZWRNZXRob2RMb2FkL2xpYi9saWJjb21waWxlZE1ldGhvZExvYWQuc28KLS4vZGVtby9qdm10aS9nY3Rlc3QvbGliL2xpYmdjdGVzdC5zbwotLi9kZW1vL2p2bXRpL2hlYXBUcmFja2VyL2xpYi9saWJoZWFwVHJhY2tlci5zbwotLi9kZW1vL2p2bXRpL2hlYXBWaWV3ZXIvbGliL2xpYmhlYXBWaWV3ZXIuc28KLS4vZGVtby9qdm10aS9ocHJvZi9saWIvbGliaHByb2Yuc28KLS4vZGVtby9qdm10aS9taW5zdC9saWIvbGlibWluc3Quc28KLS4vZGVtby9qdm10aS9tdHJhY2UvbGliL2xpYm10cmFjZS5zbwotLi9kZW1vL2p2bXRpL3ZlcnNpb25DaGVjay9saWIvbGlidmVyc2lvbkNoZWNrLnNvCi0uL2RlbW8vanZtdGkvd2FpdGVycy9saWIvbGlid2FpdGVycy5zbwotIgotCi1LTk9XTl9CSU5fRElGRj0iCi0iCi0KLUFDQ0VQVEVEX0JJTl9ESUZGPSIKLS4vZGVtby9qdm10aS9jb21waWxlZE1ldGhvZExvYWQvbGliL2xpYmNvbXBpbGVkTWV0aG9kTG9hZC5zbwotLi9kZW1vL2p2bXRpL2djdGVzdC9saWIvbGliZ2N0ZXN0LnNvCi0uL2RlbW8vanZtdGkvaGVhcFRyYWNrZXIvbGliL2xpYmhlYXBUcmFja2VyLnNvCi0uL2RlbW8vanZtdGkvaGVhcFZpZXdlci9saWIvbGliaGVhcFZpZXdlci5zbwotLi9kZW1vL2p2bXRpL2hwcm9mL2xpYi9saWJocHJvZi5zbwotLi9kZW1vL2p2bXRpL21pbnN0L2xpYi9saWJtaW5zdC5zbwotLi9kZW1vL2p2bXRpL210cmFjZS9saWIvbGlibXRyYWNlLnNvCi0uL2RlbW8vanZtdGkvdmVyc2lvbkNoZWNrL2xpYi9saWJ2ZXJzaW9uQ2hlY2suc28KLS4vZGVtby9qdm10aS93YWl0ZXJzL2xpYi9saWJ3YWl0ZXJzLnNvCi0uL2pyZS9saWIvYW1kNjQvbGliYXR0YWNoLnNvCi0uL2pyZS9saWIvYW1kNjQvbGliZHRfc29ja2V0LnNvCi0uL2pyZS9saWIvYW1kNjQvbGliaHByb2Yuc28KLS4vanJlL2xpYi9hbWQ2NC9saWJpbnN0cnVtZW50LnNvCi0uL2pyZS9saWIvYW1kNjQvbGliamF2YV9jcndfZGVtby5zbwotLi9qcmUvbGliL2FtZDY0L2xpYmpzZHQuc28KLS4vanJlL2xpYi9hbWQ2NC9saWJqc2lnLnNvCi0uL2pyZS9saWIvYW1kNjQvbGlibWFuYWdlbWVudC5zbwotLi9qcmUvbGliL2FtZDY0L2xpYm5wdC5zbwotLi9qcmUvbGliL2FtZDY0L2xpYnNhcHJvYy5zbwotLi9qcmUvbGliL2FtZDY0L2xpYnZlcmlmeS5zbwotLi9qcmUvbGliL2FtZDY0L3NlcnZlci9saWJqc2lnLnNvCi0uL2pyZS9saWIvYW1kNjQvc2VydmVyL2xpYmp2bS5zbwotLi9iaW4vYXBwbGV0dmlld2VyCi0uL2Jpbi9leHRjaGVjawotLi9iaW4vaWRsagotLi9iaW4vamFyCi0uL2Jpbi9qYXJzaWduZXIKLS4vYmluL2phdmEKLS4vYmluL2phdmFjCi0uL2Jpbi9qYXZhZG9jCi0uL2Jpbi9qYXZhaAotLi9iaW4vamF2YXAKLS4vYmluL2pjbWQKLS4vYmluL2pjb25zb2xlCi0uL2Jpbi9qZGIKLS4vYmluL2poYXQKLS4vYmluL2ppbmZvCi0uL2Jpbi9qbWFwCi0uL2Jpbi9qcHMKLS4vYmluL2pydW5zY3JpcHQKLS4vYmluL2pzYWRlYnVnZAotLi9iaW4vanN0YWNrCi0uL2Jpbi9qc3RhdAotLi9iaW4vanN0YXRkCi0uL2Jpbi9rZXl0b29sCi0uL2Jpbi9uYXRpdmUyYXNjaWkKLS4vYmluL29yYmQKLS4vYmluL3BhY2syMDAKLS4vYmluL3BvbGljeXRvb2wKLS4vYmluL3JtaWMKLS4vYmluL3JtaWQKLS4vYmluL3JtaXJlZ2lzdHJ5Ci0uL2Jpbi9zY2hlbWFnZW4KLS4vYmluL3NlcmlhbHZlcgotLi9iaW4vc2VydmVydG9vbAotLi9iaW4vdG5hbWVzZXJ2Ci0uL2Jpbi93c2dlbgotLi9iaW4vd3NpbXBvcnQKLS4vYmluL3hqYwotLi9qcmUvYmluL2phdmEKLS4vanJlL2Jpbi9rZXl0b29sCi0uL2pyZS9iaW4vb3JiZAotLi9qcmUvYmluL3BhY2syMDAKLS4vanJlL2Jpbi9wb2xpY3l0b29sCi0uL2pyZS9iaW4vcm1pZAotLi9qcmUvYmluL3JtaXJlZ2lzdHJ5Ci0uL2pyZS9iaW4vc2VydmVydG9vbAotLi9qcmUvYmluL3RuYW1lc2VydgotIgotCi1LTk9XTl9TSVpFX0RJRkY9IgotIgotCi1LTk9XTl9TWU1fRElGRj0iCi0iCi0KLUtOT1dOX0VMRl9ESUZGPSIKLS4vZGVtby9qdm10aS9oZWFwVHJhY2tlci9saWIvbGliaGVhcFRyYWNrZXIuc28KLS4vZGVtby9qdm10aS9ocHJvZi9saWIvbGliaHByb2Yuc28KLS4vZGVtby9qdm10aS93YWl0ZXJzL2xpYi9saWJ3YWl0ZXJzLnNvCi0iCi1maQotCi1pZiBbICIkT1BFTkpES19UQVJHRVRfT1MiID0gInNvbGFyaXMiIF0gJiYgWyAiJE9QRU5KREtfVEFSR0VUX0NQVSIgPSAieDg2IiBdOyB0aGVuCi0KLVNUUklQX0JFRk9SRV9DT01QQVJFPSIKLS4vZGVtby9qbmkvUG9sbGVyL2xpYi9saWJQb2xsZXIuc28KLS4vZGVtby9qdm10aS9jb21waWxlZE1ldGhvZExvYWQvbGliL2xpYmNvbXBpbGVkTWV0aG9kTG9hZC5zbwotLi9kZW1vL2p2bXRpL2djdGVzdC9saWIvbGliZ2N0ZXN0LnNvCi0uL2RlbW8vanZtdGkvaGVhcFRyYWNrZXIvbGliL2xpYmhlYXBUcmFja2VyLnNvCi0uL2RlbW8vanZtdGkvaGVhcFZpZXdlci9saWIvbGliaGVhcFZpZXdlci5zbwotLi9kZW1vL2p2bXRpL2hwcm9mL2xpYi9saWJocHJvZi5zbwotLi9kZW1vL2p2bXRpL21pbnN0L2xpYi9saWJtaW5zdC5zbwotLi9kZW1vL2p2bXRpL210cmFjZS9saWIvbGlibXRyYWNlLnNvCi0uL2RlbW8vanZtdGkvdmVyc2lvbkNoZWNrL2xpYi9saWJ2ZXJzaW9uQ2hlY2suc28KLS4vZGVtby9qdm10aS93YWl0ZXJzL2xpYi9saWJ3YWl0ZXJzLnNvCi0uL2pyZS9saWIvaTM4Ni9qZXhlYwotIgotCi1TT1JUX1NZTUJPTFM9IgotLi9qcmUvbGliL2kzODYvY2xpZW50L2xpYmp2bS5zbwotLi9qcmUvbGliL2kzODYvc2VydmVyL2xpYmp2bS5zbwotIgotCi1TS0lQX0JJTl9ESUZGPSJ0cnVlIgotCi1BQ0NFUFRFRF9TTUFMTF9TSVpFX0RJRkY9IgotLi9kZW1vL2puaS9Qb2xsZXIvbGliL2xpYlBvbGxlci5zbwotLi9kZW1vL2p2bXRpL2NvbXBpbGVkTWV0aG9kTG9hZC9saWIvbGliY29tcGlsZWRNZXRob2RMb2FkLnNvCi0uL2RlbW8vanZtdGkvZ2N0ZXN0L2xpYi9saWJnY3Rlc3Quc28KLS4vZGVtby9qdm10aS9oZWFwVHJhY2tlci9saWIvbGliaGVhcFRyYWNrZXIuc28KLS4vZGVtby9qdm10aS9oZWFwVmlld2VyL2xpYi9saWJoZWFwVmlld2VyLnNvCi0uL2RlbW8vanZtdGkvaHByb2YvbGliL2xpYmhwcm9mLnNvCi0uL2RlbW8vanZtdGkvbWluc3QvbGliL2xpYm1pbnN0LnNvCi0uL2RlbW8vanZtdGkvbXRyYWNlL2xpYi9saWJtdHJhY2Uuc28KLS4vZGVtby9qdm10aS92ZXJzaW9uQ2hlY2svbGliL2xpYnZlcnNpb25DaGVjay5zbwotLi9kZW1vL2p2bXRpL3dhaXRlcnMvbGliL2xpYndhaXRlcnMuc28KLS4vanJlL2xpYi9pMzg2L2NsaWVudC9saWJqdm0uc28KLS4vanJlL2xpYi9pMzg2L2psaS9saWJqbGkuc28KLS4vanJlL2xpYi9pMzg2L2xpYkpkYmNPZGJjLnNvCi0uL2pyZS9saWIvaTM4Ni9saWJhdHRhY2guc28KLS4vanJlL2xpYi9pMzg2L2xpYmF3dC5zbwotLi9qcmUvbGliL2kzODYvbGliYXd0X2hlYWRsZXNzLnNvCi0uL2pyZS9saWIvaTM4Ni9saWJhd3RfeGF3dC5zbwotLi9qcmUvbGliL2kzODYvbGliZGNwci5zbwotLi9qcmUvbGliL2kzODYvbGliZHRfc29ja2V0LnNvCi0uL2pyZS9saWIvaTM4Ni9saWJmb250bWFuYWdlci5zbwotLi9qcmUvbGliL2kzODYvbGliaHByb2Yuc28KLS4vanJlL2xpYi9pMzg2L2xpYmluc3RydW1lbnQuc28KLS4vanJlL2xpYi9pMzg2L2xpYmoyZ3NzLnNvCi0uL2pyZS9saWIvaTM4Ni9saWJqMnBjc2Muc28KLS4vanJlL2xpYi9pMzg2L2xpYmoycGtjczExLnNvCi0uL2pyZS9saWIvaTM4Ni9saWJqMnVjcnlwdG8uc28KLS4vanJlL2xpYi9pMzg2L2xpYmphYXNfdW5peC5zbwotLi9qcmUvbGliL2kzODYvbGliamF2YS5zbwotLi9qcmUvbGliL2kzODYvbGliamF2YV9jcndfZGVtby5zbwotLi9qcmUvbGliL2kzODYvbGliamF3dC5zbwotLi9qcmUvbGliL2kzODYvbGliamR3cC5zbwotLi9qcmUvbGliL2kzODYvbGliamZyLnNvCi0uL2pyZS9saWIvaTM4Ni9saWJqcGVnLnNvCi0uL2pyZS9saWIvaTM4Ni9saWJqc2R0LnNvCi0uL2pyZS9saWIvaTM4Ni9saWJqc291bmQuc28KLS4vanJlL2xpYi9pMzg2L2xpYmtjbXMuc28KLS4vanJlL2xpYi9pMzg2L2xpYm1hbmFnZW1lbnQuc28KLS4vanJlL2xpYi9pMzg2L2xpYm1saWJfaW1hZ2Uuc28KLS4vanJlL2xpYi9pMzg2L2xpYm5ldC5zbwotLi9qcmUvbGliL2kzODYvbGlibmlvLnNvCi0uL2pyZS9saWIvaTM4Ni9saWJucHQuc28KLS4vanJlL2xpYi9pMzg2L2xpYnNjdHAuc28KLS4vanJlL2xpYi9pMzg2L2xpYnNwbGFzaHNjcmVlbi5zbwotLi9qcmUvbGliL2kzODYvbGlic3VuZWMuc28KLS4vanJlL2xpYi9pMzg2L2xpYnN1bndqZGdhLnNvCi0uL2pyZS9saWIvaTM4Ni9saWJ0Mmsuc28KLS4vanJlL2xpYi9pMzg2L2xpYnVucGFjay5zbwotLi9qcmUvbGliL2kzODYvbGlidmVyaWZ5LnNvCi0uL2pyZS9saWIvaTM4Ni9saWJ6aXAuc28KLS4vanJlL2xpYi9pMzg2L3NlcnZlci9saWJqdm0uc28KLS4vYmluL2FwcGxldHZpZXdlcgotLi9iaW4vZXh0Y2hlY2sKLS4vYmluL2lkbGoKLS4vYmluL2phcgotLi9iaW4vamFyc2lnbmVyCi0uL2Jpbi9qYXZhCi0uL2Jpbi9qYXZhYwotLi9iaW4vamF2YWRvYwotLi9iaW4vamF2YWgKLS4vYmluL2phdmFwCi0uL2Jpbi9qY21kCi0uL2Jpbi9qY29uc29sZQotLi9iaW4vamRiCi0uL2Jpbi9qaGF0Ci0uL2Jpbi9qaW5mbwotLi9iaW4vam1hcAotLi9iaW4vanBzCi0uL2Jpbi9qcnVuc2NyaXB0Ci0uL2Jpbi9qc2FkZWJ1Z2QKLS4vYmluL2pzdGFjawotLi9iaW4vanN0YXQKLS4vYmluL2pzdGF0ZAotLi9iaW4va2V5dG9vbAotLi9iaW4vbmF0aXZlMmFzY2lpCi0uL2Jpbi9vcmJkCi0uL2Jpbi9wYWNrMjAwCi0uL2Jpbi9wb2xpY3l0b29sCi0uL2Jpbi9ybWljCi0uL2Jpbi9ybWlkCi0uL2Jpbi9ybWlyZWdpc3RyeQotLi9iaW4vc2NoZW1hZ2VuCi0uL2Jpbi9zZXJpYWx2ZXIKLS4vYmluL3NlcnZlcnRvb2wKLS4vYmluL3RuYW1lc2VydgotLi9iaW4vdW5wYWNrMjAwCi0uL2Jpbi93c2dlbgotLi9iaW4vd3NpbXBvcnQKLS4vYmluL3hqYwotLi9qcmUvYmluL2phdmEKLS4vanJlL2Jpbi9rZXl0b29sCi0uL2pyZS9iaW4vb3JiZAotLi9qcmUvYmluL3BhY2syMDAKLS4vanJlL2Jpbi9wb2xpY3l0b29sCi0uL2pyZS9iaW4vcm1pZAotLi9qcmUvYmluL3JtaXJlZ2lzdHJ5Ci0uL2pyZS9iaW4vc2VydmVydG9vbAotLi9qcmUvYmluL3RuYW1lc2VydgotLi9qcmUvYmluL3VucGFjazIwMAotLi9qcmUvbGliL2kzODYvamV4ZWMKLSIKLQotU0tJUF9FTEZfRElGRj0idHJ1ZSIKLQotIyBsaWJqdm0uc28gZGlmZmVycyBpbiB0aGUgcmFuZG9tIDE1IGNoYXIgcHJlZml4IG9uIHNvbWUgc3ltYm9scy4KLUFDQ0VQVEVEX0RJU19ESUZGPSIKLS4vanJlL2xpYi9pMzg2L2NsaWVudC9saWJqdm0uc28KLS4vanJlL2xpYi9pMzg2L3NlcnZlci9saWJqdm0uc28KLSIKLQotZmkKLQotaWYgWyAiJE9QRU5KREtfVEFSR0VUX09TIiA9ICJzb2xhcmlzIiBdICYmIFsgIiRPUEVOSkRLX1RBUkdFVF9DUFUiID0gIng4Nl82NCIgXTsgdGhlbgotCi1TVFJJUF9CRUZPUkVfQ09NUEFSRT0iCi0uL2RlbW8vam5pL1BvbGxlci9saWIvYW1kNjQvbGliUG9sbGVyLnNvCi0uL2RlbW8vanZtdGkvY29tcGlsZWRNZXRob2RMb2FkL2xpYi9hbWQ2NC9saWJjb21waWxlZE1ldGhvZExvYWQuc28KLS4vZGVtby9qdm10aS9nY3Rlc3QvbGliL2FtZDY0L2xpYmdjdGVzdC5zbwotLi9kZW1vL2p2bXRpL2hlYXBUcmFja2VyL2xpYi9hbWQ2NC9saWJoZWFwVHJhY2tlci5zbwotLi9kZW1vL2p2bXRpL2hlYXBWaWV3ZXIvbGliL2FtZDY0L2xpYmhlYXBWaWV3ZXIuc28KLS4vZGVtby9qdm10aS9ocHJvZi9saWIvYW1kNjQvbGliaHByb2Yuc28KLS4vZGVtby9qdm10aS9taW5zdC9saWIvYW1kNjQvbGlibWluc3Quc28KLS4vZGVtby9qdm10aS9tdHJhY2UvbGliL2FtZDY0L2xpYm10cmFjZS5zbwotLi9kZW1vL2p2bXRpL3ZlcnNpb25DaGVjay9saWIvYW1kNjQvbGlidmVyc2lvbkNoZWNrLnNvCi0uL2RlbW8vanZtdGkvd2FpdGVycy9saWIvYW1kNjQvbGlid2FpdGVycy5zbwotIgotCi1TT1JUX1NZTUJPTFM9IgotLi9qcmUvbGliL2FtZDY0L3NlcnZlci9saWJqdm0uc28KLSIKLQotU0tJUF9CSU5fRElGRj0idHJ1ZSIKLQotQUNDRVBURURfU01BTExfU0laRV9ESUZGPSIKLS4vZGVtby9qbmkvUG9sbGVyL2xpYi9hbWQ2NC9saWJQb2xsZXIuc28KLS4vZGVtby9qdm10aS9jb21waWxlZE1ldGhvZExvYWQvbGliL2FtZDY0L2xpYmNvbXBpbGVkTWV0aG9kTG9hZC5zbwotLi9kZW1vL2p2bXRpL2djdGVzdC9saWIvYW1kNjQvbGliZ2N0ZXN0LnNvCi0uL2RlbW8vanZtdGkvaGVhcFRyYWNrZXIvbGliL2FtZDY0L2xpYmhlYXBUcmFja2VyLnNvCi0uL2RlbW8vanZtdGkvaGVhcFZpZXdlci9saWIvYW1kNjQvbGliaGVhcFZpZXdlci5zbwotLi9kZW1vL2p2bXRpL2hwcm9mL2xpYi9hbWQ2NC9saWJocHJvZi5zbwotLi9kZW1vL2p2bXRpL21pbnN0L2xpYi9hbWQ2NC9saWJtaW5zdC5zbwotLi9kZW1vL2p2bXRpL210cmFjZS9saWIvYW1kNjQvbGlibXRyYWNlLnNvCi0uL2RlbW8vanZtdGkvdmVyc2lvbkNoZWNrL2xpYi9hbWQ2NC9saWJ2ZXJzaW9uQ2hlY2suc28KLS4vZGVtby9qdm10aS93YWl0ZXJzL2xpYi9hbWQ2NC9saWJ3YWl0ZXJzLnNvCi0uL2pyZS9saWIvYW1kNjQvamxpL2xpYmpsaS5zbwotLi9qcmUvbGliL2FtZDY0L2xpYkpkYmNPZGJjLnNvCi0uL2pyZS9saWIvYW1kNjQvbGliYXR0YWNoLnNvCi0uL2pyZS9saWIvYW1kNjQvbGliYXd0LnNvCi0uL2pyZS9saWIvYW1kNjQvbGliYXd0X2hlYWRsZXNzLnNvCi0uL2pyZS9saWIvYW1kNjQvbGliYXd0X3hhd3Quc28KLS4vanJlL2xpYi9hbWQ2NC9saWJkY3ByLnNvCi0uL2pyZS9saWIvYW1kNjQvbGliZHRfc29ja2V0LnNvCi0uL2pyZS9saWIvYW1kNjQvbGliZm9udG1hbmFnZXIuc28KLS4vanJlL2xpYi9hbWQ2NC9saWJocHJvZi5zbwotLi9qcmUvbGliL2FtZDY0L2xpYmluc3RydW1lbnQuc28KLS4vanJlL2xpYi9hbWQ2NC9saWJqMmdzcy5zbwotLi9qcmUvbGliL2FtZDY0L2xpYmoycGNzYy5zbwotLi9qcmUvbGliL2FtZDY0L2xpYmoycGtjczExLnNvCi0uL2pyZS9saWIvYW1kNjQvbGliajJ1Y3J5cHRvLnNvCi0uL2pyZS9saWIvYW1kNjQvbGliamFhc191bml4LnNvCi0uL2pyZS9saWIvYW1kNjQvbGliamF2YS5zbwotLi9qcmUvbGliL2FtZDY0L2xpYmphdmFfY3J3X2RlbW8uc28KLS4vanJlL2xpYi9hbWQ2NC9saWJqYXd0LnNvCi0uL2pyZS9saWIvYW1kNjQvbGliamR3cC5zbwotLi9qcmUvbGliL2FtZDY0L2xpYmpmci5zbwotLi9qcmUvbGliL2FtZDY0L2xpYmpwZWcuc28KLS4vanJlL2xpYi9hbWQ2NC9saWJqc2R0LnNvCi0uL2pyZS9saWIvYW1kNjQvbGlianNvdW5kLnNvCi0uL2pyZS9saWIvYW1kNjQvbGlia2Ntcy5zbwotLi9qcmUvbGliL2FtZDY0L2xpYm1hbmFnZW1lbnQuc28KLS4vanJlL2xpYi9hbWQ2NC9saWJtbGliX2ltYWdlLnNvCi0uL2pyZS9saWIvYW1kNjQvbGlibmV0LnNvCi0uL2pyZS9saWIvYW1kNjQvbGlibmlvLnNvCi0uL2pyZS9saWIvYW1kNjQvbGlibnB0LnNvCi0uL2pyZS9saWIvYW1kNjQvbGlic2N0cC5zbwotLi9qcmUvbGliL2FtZDY0L2xpYnNwbGFzaHNjcmVlbi5zbwotLi9qcmUvbGliL2FtZDY0L2xpYnN1bmVjLnNvCi0uL2pyZS9saWIvYW1kNjQvbGlic3Vud2pkZ2Euc28KLS4vanJlL2xpYi9hbWQ2NC9saWJ0Mmsuc28KLS4vanJlL2xpYi9hbWQ2NC9saWJ1bnBhY2suc28KLS4vanJlL2xpYi9hbWQ2NC9saWJ2ZXJpZnkuc28KLS4vanJlL2xpYi9hbWQ2NC9saWJ6aXAuc28KLS4vanJlL2xpYi9hbWQ2NC9zZXJ2ZXIvNjQvbGlianZtX2RiLnNvCi0uL2pyZS9saWIvYW1kNjQvc2VydmVyLzY0L2xpYmp2bV9kdHJhY2Uuc28KLS4vYmluL2FtZDY0L2FwcGxldHZpZXdlcgotLi9iaW4vYW1kNjQvZXh0Y2hlY2sKLS4vYmluL2FtZDY0L2lkbGoKLS4vYmluL2FtZDY0L2phcgotLi9iaW4vYW1kNjQvamFyc2lnbmVyCi0uL2Jpbi9hbWQ2NC9qYXZhCi0uL2Jpbi9hbWQ2NC9qYXZhYwotLi9iaW4vYW1kNjQvamF2YWRvYwotLi9iaW4vYW1kNjQvamF2YWgKLS4vYmluL2FtZDY0L2phdmFwCi0uL2Jpbi9hbWQ2NC9qY21kCi0uL2Jpbi9hbWQ2NC9qY29uc29sZQotLi9iaW4vYW1kNjQvamRiCi0uL2Jpbi9hbWQ2NC9qaGF0Ci0uL2Jpbi9hbWQ2NC9qaW5mbwotLi9iaW4vYW1kNjQvam1hcAotLi9iaW4vYW1kNjQvanBzCi0uL2Jpbi9hbWQ2NC9qcnVuc2NyaXB0Ci0uL2Jpbi9hbWQ2NC9qc2FkZWJ1Z2QKLS4vYmluL2FtZDY0L2pzdGFjawotLi9iaW4vYW1kNjQvanN0YXQKLS4vYmluL2FtZDY0L2pzdGF0ZAotLi9iaW4vYW1kNjQva2V5dG9vbAotLi9iaW4vYW1kNjQvbmF0aXZlMmFzY2lpCi0uL2Jpbi9hbWQ2NC9vcmJkCi0uL2Jpbi9hbWQ2NC9wYWNrMjAwCi0uL2Jpbi9hbWQ2NC9wb2xpY3l0b29sCi0uL2Jpbi9hbWQ2NC9ybWljCi0uL2Jpbi9hbWQ2NC9ybWlkCi0uL2Jpbi9hbWQ2NC9ybWlyZWdpc3RyeQotLi9iaW4vYW1kNjQvc2NoZW1hZ2VuCi0uL2Jpbi9hbWQ2NC9zZXJpYWx2ZXIKLS4vYmluL2FtZDY0L3NlcnZlcnRvb2wKLS4vYmluL2FtZDY0L3RuYW1lc2VydgotLi9iaW4vYW1kNjQvdW5wYWNrMjAwCi0uL2Jpbi9hbWQ2NC93c2dlbgotLi9iaW4vYW1kNjQvd3NpbXBvcnQKLS4vYmluL2FtZDY0L3hqYwotLi9qcmUvYmluL2FtZDY0L2phdmEKLS4vanJlL2Jpbi9hbWQ2NC9rZXl0b29sCi0uL2pyZS9iaW4vYW1kNjQvb3JiZAotLi9qcmUvYmluL2FtZDY0L3BhY2syMDAKLS4vanJlL2Jpbi9hbWQ2NC9wb2xpY3l0b29sCi0uL2pyZS9iaW4vYW1kNjQvcm1pZAotLi9qcmUvYmluL2FtZDY0L3JtaXJlZ2lzdHJ5Ci0uL2pyZS9iaW4vYW1kNjQvc2VydmVydG9vbAotLi9qcmUvYmluL2FtZDY0L3RuYW1lc2VydgotLi9qcmUvYmluL2FtZDY0L3VucGFjazIwMAotLi9qcmUvbGliL2FtZDY0L2pleGVjCi0iCi0KLVNLSVBfRUxGX0RJRkY9InRydWUiCi0KLSMgQ2FuJ3QgZmluZCBhbiBleHBsYWluYXRpb24gZm9yIHRoZSBkaWZmIGluIGxpYm1saWJfaW1hZ2Uuc28uCi1LTk9XTl9ESVNfRElGRj0iCi0uL2pyZS9saWIvYW1kNjQvbGlibWxpYl9pbWFnZS5zbwotIgotIyBsaWJqdm0uc28gZGlmZmVycyBpbiB0aGUgcmFuZG9tIDE1IGNoYXIgcHJlZml4IG9uIHNvbWUgc3ltYm9scy4KLUFDQ0VQVEVEX0RJU19ESUZGPSIKLS4vanJlL2xpYi9hbWQ2NC9zZXJ2ZXIvbGlianZtLnNvCi0iCi0KLWZpCi0KLWlmIFsgIiRPUEVOSkRLX1RBUkdFVF9PUyIgPSAid2luZG93cyIgXSAmJiBbICIkT1BFTkpES19UQVJHRVRfQ1BVIiA9ICJ4ODZfNjQiIF07IHRoZW4KLQotQUNDRVBURURfQklOX0RJRkY9IgotLi9iaW4vamxpLmRsbAotLi9kZW1vL2p2bXRpL2NvbXBpbGVkTWV0aG9kTG9hZC9saWIvY29tcGlsZWRNZXRob2RMb2FkLmRsbAotLi9kZW1vL2p2bXRpL2djdGVzdC9saWIvZ2N0ZXN0LmRsbAotLi9kZW1vL2p2bXRpL2hlYXBUcmFja2VyL2xpYi9oZWFwVHJhY2tlci5kbGwKLS4vZGVtby9qdm10aS9oZWFwVmlld2VyL2xpYi9oZWFwVmlld2VyLmRsbAotLi9kZW1vL2p2bXRpL2hwcm9mL2xpYi9ocHJvZi5kbGwKLS4vZGVtby9qdm10aS9taW5zdC9saWIvbWluc3QuZGxsCi0uL2RlbW8vanZtdGkvbXRyYWNlL2xpYi9tdHJhY2UuZGxsCi0uL2RlbW8vanZtdGkvdmVyc2lvbkNoZWNrL2xpYi92ZXJzaW9uQ2hlY2suZGxsCi0uL2RlbW8vanZtdGkvd2FpdGVycy9saWIvd2FpdGVycy5kbGwKLS4vanJlL2Jpbi9hdHRhY2guZGxsCi0uL2pyZS9iaW4vYXd0LmRsbAotLi9qcmUvYmluL2RjcHIuZGxsCi0uL2pyZS9iaW4vZHRfc2htZW0uZGxsCi0uL2pyZS9iaW4vZHRfc29ja2V0LmRsbAotLi9qcmUvYmluL2ZvbnRtYW5hZ2VyLmRsbAotLi9qcmUvYmluL2hwcm9mLmRsbAotLi9qcmUvYmluL2luc3RydW1lbnQuZGxsCi0uL2pyZS9iaW4vajJwY3NjLmRsbAotLi9qcmUvYmluL2oycGtjczExLmRsbAotLi9qcmUvYmluL2phYXNfbnQuZGxsCi0uL2pyZS9iaW4vamF2YS5kbGwKLS4vanJlL2Jpbi9qYXZhX2Nyd19kZW1vLmRsbAotLi9qcmUvYmluL2phd3QuZGxsCi0uL2pyZS9iaW4vSmRiY09kYmMuZGxsCi0uL2pyZS9iaW4vamR3cC5kbGwKLS4vanJlL2Jpbi9qZnIuZGxsCi0uL2pyZS9iaW4vamxpLmRsbAotLi9qcmUvYmluL2pwZWcuZGxsCi0uL2pyZS9iaW4vanNkdC5kbGwKLS4vanJlL2Jpbi9qc291bmQuZGxsCi0uL2pyZS9iaW4vanNvdW5kZHMuZGxsCi0uL2pyZS9iaW4va2Ntcy5kbGwKLS4vanJlL2Jpbi9tYW5hZ2VtZW50LmRsbAotLi9qcmUvYmluL21saWJfaW1hZ2UuZGxsCi0uL2pyZS9iaW4vbmV0LmRsbAotLi9qcmUvYmluL25pby5kbGwKLS4vanJlL2Jpbi9ucHQuZGxsCi0uL2pyZS9iaW4vc2F3aW5kYmcuZGxsCi0uL2pyZS9iaW4vc2VydmVyL2p2bS5kbGwKLS4vanJlL2Jpbi9zcGxhc2hzY3JlZW4uZGxsCi0uL2pyZS9iaW4vc3VuZWMuZGxsCi0uL2pyZS9iaW4vc3VubXNjYXBpLmRsbAotLi9qcmUvYmluL3Qyay5kbGwKLS4vanJlL2Jpbi91bnBhY2suZGxsCi0uL2pyZS9iaW4vdmVyaWZ5LmRsbAotLi9qcmUvYmluL3cya19sc2FfYXV0aC5kbGwKLS4vanJlL2Jpbi96aXAuZGxsCi0uL2Jpbi9hcHBsZXR2aWV3ZXIuZXhlCi0uL2Jpbi9leHRjaGVjay5leGUKLS4vYmluL2lkbGouZXhlCi0uL2Jpbi9qYXIuZXhlCi0uL2Jpbi9qYXJzaWduZXIuZXhlCi0uL2Jpbi9qYXZhLmV4ZQotLi9iaW4vamF2YWMuZXhlCi0uL2Jpbi9qYXZhZG9jLmV4ZQotLi9iaW4vamF2YWguZXhlCi0uL2Jpbi9qYXZhcC5leGUKLS4vYmluL2phdmEtcm1pLmV4ZQotLi9iaW4vamF2YXcuZXhlCi0uL2Jpbi9qY21kLmV4ZQotLi9iaW4vamNvbnNvbGUuZXhlCi0uL2Jpbi9qZGIuZXhlCi0uL2Jpbi9qaGF0LmV4ZQotLi9iaW4vamluZm8uZXhlCi0uL2Jpbi9qbWFwLmV4ZQotLi9iaW4vanBzLmV4ZQotLi9iaW4vanJ1bnNjcmlwdC5leGUKLS4vYmluL2pzYWRlYnVnZC5leGUKLS4vYmluL2pzdGFjay5leGUKLS4vYmluL2pzdGF0LmV4ZQotLi9iaW4vanN0YXRkLmV4ZQotLi9iaW4va2V5dG9vbC5leGUKLS4vYmluL2tpbml0LmV4ZQotLi9iaW4va2xpc3QuZXhlCi0uL2Jpbi9rdGFiLmV4ZQotLi9iaW4vbmF0aXZlMmFzY2lpLmV4ZQotLi9iaW4vb3JiZC5leGUKLS4vYmluL3BhY2syMDAuZXhlCi0uL2Jpbi9wb2xpY3l0b29sLmV4ZQotLi9iaW4vcm1pYy5leGUKLS4vYmluL3JtaWQuZXhlCi0uL2Jpbi9ybWlyZWdpc3RyeS5leGUKLS4vYmluL3NjaGVtYWdlbi5leGUKLS4vYmluL3NlcmlhbHZlci5leGUKLS4vYmluL3NlcnZlcnRvb2wuZXhlCi0uL2Jpbi90bmFtZXNlcnYuZXhlCi0uL2Jpbi91bnBhY2syMDAuZXhlCi0uL2Jpbi93c2dlbi5leGUKLS4vYmluL3dzaW1wb3J0LmV4ZQotLi9iaW4veGpjLmV4ZQotLi9qcmUvYmluL2phdmEuZXhlCi0uL2pyZS9iaW4vamF2YS1ybWkuZXhlCi0uL2pyZS9iaW4vamF2YXcuZXhlCi0uL2pyZS9iaW4va2V5dG9vbC5leGUKLS4vanJlL2Jpbi9raW5pdC5leGUKLS4vanJlL2Jpbi9rbGlzdC5leGUKLS4vanJlL2Jpbi9rdGFiLmV4ZQotLi9qcmUvYmluL29yYmQuZXhlCi0uL2pyZS9iaW4vcGFjazIwMC5leGUKLS4vanJlL2Jpbi9wb2xpY3l0b29sLmV4ZQotLi9qcmUvYmluL3JtaWQuZXhlCi0uL2pyZS9iaW4vcm1pcmVnaXN0cnkuZXhlCi0uL2pyZS9iaW4vc2VydmVydG9vbC5leGUKLS4vanJlL2Jpbi90bmFtZXNlcnYuZXhlCi0uL2pyZS9iaW4vdW5wYWNrMjAwLmV4ZQotIgotCi1LTk9XTl9TSVpFX0RJRkY9IgotLi9kZW1vL2p2bXRpL2hlYXBUcmFja2VyL2xpYi9oZWFwVHJhY2tlci5kbGwKLS4vZGVtby9qdm10aS9taW5zdC9saWIvbWluc3QuZGxsCi0uL2pyZS9iaW4vYXd0LmRsbAotLi9qcmUvYmluL2phdmFfY3J3X2RlbW8uZGxsCi0uL2Jpbi9qYXZhLmV4ZQotLi9iaW4vamF2YXcuZXhlCi0uL2Jpbi91bnBhY2syMDAuZXhlCi0uL2pyZS9iaW4vamF2YS5leGUKLS4vanJlL2Jpbi9qYXZhdy5leGUKLS4vanJlL2Jpbi91bnBhY2syMDAuZXhlCi0iCi0KLUtOT1dOX1NZTV9ESUZGPSIKLS4vanJlL2Jpbi9hd3QuZGxsCi0uL2pyZS9iaW4vamF2YV9jcndfZGVtby5kbGwKLSIKLWZpCi0KLQotCi1pZiBbICIkT1BFTkpES19UQVJHRVRfT1MiID0gIm1hY29zeCIgXTsgdGhlbgotQUNDRVBURURfSkFSWklQX0NPTlRFTlRTPSIKLS9NRVRBLUlORi9JTkRFWC5MSVNUCi0iCi0KLUtOT1dOX0JJTl9ESUZGPSIKLS4vanJlL2xpYi9saWJKT2JqQy5keWxpYgotLi9qcmUvbGliL2xpYnNhcHJvYy5keWxpYgotLi9qcmUvbGliL3NlcnZlci9saWJqdm0uZHlsaWIKLSIKLQotQUNDRVBURURfQklOX0RJRkY9IgotLi9iaW4vYXBwbGV0dmlld2VyCi0uL2Jpbi9leHRjaGVjawotLi9iaW4vaWRsagotLi9iaW4vamFyCi0uL2Jpbi9qYXJzaWduZXIKLS4vYmluL2phdmEKLS4vYmluL2phdmFjCi0uL2Jpbi9qYXZhZG9jCi0uL2Jpbi9qYXZhaAotLi9iaW4vamF2YXAKLS4vYmluL2pjbWQKLS4vYmluL2pjb25zb2xlCi0uL2Jpbi9qZGIKLS4vYmluL2poYXQKLS4vYmluL2ppbmZvCi0uL2Jpbi9qbWFwCi0uL2Jpbi9qcHMKLS4vYmluL2pydW5zY3JpcHQKLS4vYmluL2pzYWRlYnVnZAotLi9iaW4vanN0YWNrCi0uL2Jpbi9qc3RhdAotLi9iaW4vanN0YXRkCi0uL2Jpbi9rZXl0b29sCi0uL2Jpbi9uYXRpdmUyYXNjaWkKLS4vYmluL29yYmQKLS4vYmluL3BhY2syMDAKLS4vYmluL3BvbGljeXRvb2wKLS4vYmluL3JtaWMKLS4vYmluL3JtaWQKLS4vYmluL3JtaXJlZ2lzdHJ5Ci0uL2Jpbi9zY2hlbWFnZW4KLS4vYmluL3NlcmlhbHZlcgotLi9iaW4vc2VydmVydG9vbAotLi9iaW4vdG5hbWVzZXJ2Ci0uL2Jpbi93c2dlbgotLi9iaW4vd3NpbXBvcnQKLS4vYmluL3hqYwotLi9qcmUvYmluL2phdmEKLS4vanJlL2Jpbi9rZXl0b29sCi0uL2pyZS9iaW4vb3JiZAotLi9qcmUvYmluL3BhY2syMDAKLS4vanJlL2Jpbi9wb2xpY3l0b29sCi0uL2pyZS9iaW4vcm1pZAotLi9qcmUvYmluL3JtaXJlZ2lzdHJ5Ci0uL2pyZS9iaW4vc2VydmVydG9vbAotLi9qcmUvYmluL3RuYW1lc2VydgotIgotCi1LTk9XTl9TSVpFX0RJRkY9IgotLi9qcmUvbGliL2xpYkpPYmpDLmR5bGliCi0uL2pyZS9saWIvc2VydmVyL2xpYmp2bS5keWxpYgotIgotCi1LTk9XTl9TWU1fRElGRj0iCi0uL2pyZS9saWIvbGliSk9iakMuZHlsaWIKLS4vanJlL2xpYi9zZXJ2ZXIvbGlianZtLmR5bGliCi0iCi0KLUtOT1dOX0VMRl9ESUZGPSIKLS4vanJlL2xpYi9saWJKT2JqQy5keWxpYgotLi9qcmUvbGliL3NlcnZlci9saWJqdm0uZHlsaWIKLSIKLQotU0tJUF9ESVNfRElGRj0idHJ1ZSIKLQotZmkKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvbXBhcmUgdGV4dCBmaWxlcyBhbmQgaWdub3JlIHNwZWNpZmljIGRpZmZlcmVuY2VzOgotIwotIyAgKiBUaW1lc3RhbXBzIGluIEphdmEgc291cmNlcyBnZW5lcmF0ZWQgYnkgaWRsMmphdmEKLSMgICogU29ydGluZyBvcmRlciBhbmQgY2xlYW51cCBzdHlsZSBpbiAucHJvcGVydGllcyBmaWxlcwotCi1kaWZmX3RleHQoKSB7Ci0gICAgT1RIRVJfRklMRT0kMQotICAgIFRISVNfRklMRT0kMgotCi0gICAgU1VGRklYPSIke1RISVNfRklMRSMjKi59IgotCi0gICAgVE1QPTEKLQotICAgIGlmIFtbICIkVEhJU19GSUxFIiA9ICoiTUVUQS1JTkYvTUFOSUZFU1QuTUYiIF1dOyB0aGVuCi0gICAgICAgIFRNUD0kKExBTkc9QyAkRElGRiAkT1RIRVJfRklMRSAkVEhJU19GSUxFIHwgXAotICAgICAgICAgICAgJEdSRVAgJ15bPD5dJyB8IFwKLSAgICAgICAgICAgICRTRUQgLWUgJy9bPD5dIEFudC1WZXJzaW9uOiBBcGFjaGUgQW50IC4qL2QnIFwKLQkgICAgICAgICAtZSAnL1s8Pl0gQ3JlYXRlZC1CeTogLiogKE9yYWNsZSBDb3Jwb3JhdGlvbikuKi9kJykKLSAgICBmaQotICAgIGlmIHRlc3QgIngkU1VGRklYIiA9ICJ4amF2YSI7IHRoZW4KLSAgICAgICAgVE1QPSQoTEFORz1DICRESUZGICRPVEhFUl9GSUxFICRUSElTX0ZJTEUgfCBcCi0gICAgICAgICAgICAkR1JFUCAnXls8Pl0nIHwgXAotICAgICAgICAgICAgJFNFRCAtZSAnL1s8Pl0gXCogZnJvbS4qXC5pZGwvZCcgXAotICAgICAgICAgICAgICAgICAtZSAnL1s8Pl0gXCouKlswLTldXHs0XH1fWzAtOV1cezJcfV9bMC05XVx7Mlx9X1swLTldXHsyXH1fWzAtOV1cezJcfS1iWzAtOV1cezJcfS4qL2QnIFwKLSAgICAgICAgICAgICAgICAgLWUgJy9bPD5dIFwqLipbMC05XVx7NFx9IFswLTldWzAtOV0qOlswLTldXHsyXH06WzAtOV1cezJcfS4qL2QnIFwKLSAgICAgICAgICAgICAgICAgLWUgJy9cL1wvIEdlbmVyYXRlZCBmcm9tIGlucHV0IGZpbGUuKi9kJyBcCi0gICAgICAgICAgICAgICAgIC1lICcvXC9cLyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBBVVRPTUFUSUNBTExZIGZyb20gYSB0ZW1wbGF0ZSBmaWxlLiovZCcgXAotICAgICAgICAgICAgICAgICAtZSAnL1wvXC8gamF2YSBHZW5lcmF0ZUNoYXJhY3Rlci4qL2QnKQotICAgIGZpCi0gICAgIyBJZ25vcmUgZGF0ZSBzdHJpbmdzIGluIGNsYXNzIGZpbGVzLgotICAgICMgT24gTWFjb3N4IHRoZSBzeXN0ZW0gc291cmNlcyBmb3IgZ2VuZXJhdGVkIGphdmEgY2xhc3NlcyBwcm9kdWNlIGRpZmZlcmVudCBvdXRwdXQgb24gCi0gICAgIyBjb25zZXF1dGl2ZSBpbnZva2F0aW9ucyBzZWVtaW5nbHkgcmFuZG9tbHkuCi0gICAgIyBGb3IgZXhhbXBsZSBhIG1ldGhvZCBwYXJhbWV0ZXIgcmFuZG9tbHkgbmFtZWQgInRoZVBvaW50IiBvciAiYVBvaW50Ii4gSWdub3JlIHRoaXMuCi0gICAgaWYgdGVzdCAieCRTVUZGSVgiID0gInhjbGFzcyI7IHRoZW4KLSAgICAgICAgJEpBVkFQIC1jIC1jb25zdGFudHMgLWwgLXAgJHtPVEhFUl9GSUxFfSA+ICAke09USEVSX0ZJTEV9LmphdmFwCi0gICAgICAgICRKQVZBUCAtYyAtY29uc3RhbnRzIC1sIC1wICR7VEhJU19GSUxFfSA+ICR7VEhJU19GSUxFfS5qYXZhcAotICAgICAgICBUTVA9JCgkRElGRiAke09USEVSX0ZJTEV9LmphdmFwICR7VEhJU19GSUxFfS5qYXZhcCB8IFwKLSAgICAgICAgICAgICRHUkVQICdeWzw+XScgfCBcCi0gICAgICAgICAgICAkU0VEIC1lICcvWzw+XS4qWzAtOV1cezRcfV9bMC05XVx7Mlx9X1swLTldXHsyXH1fWzAtOV1cezJcfV9bMC05XVx7Mlx9LWJbMC05XVx7Mlx9LiovZCcgXAotCSAgICAgICAgIC1lICcvWzw+XS4qUG9pbnQgICBMY29tXC9hcHBsZVwvam9iamNcL2ZvdW5kYXRpb25cL05TUG9pbnQ7L2QnIFwKLQkgICAgICAgICAtZSAnL1s8Pl0uKnB1YmxpYyBjb21cLmFwcGxlXC5qb2JqY1wuUG9pbnRlcjxjb21cLmFwcGxlXC5qb2JqY1wuLippdGVtc1B0cigpOy9kJyBcCi0JICAgICAgICAgLWUgJy9bPD5dLipwdWJsaWMgdm9pZCBzZXRJdGVtc1B0cihjb21cLmFwcGxlXC5qb2JqY1wuUG9pbnRlcjxjb21cLmFwcGxlXC5qb2JqY1wuLiopOy9kJykKLSAgICBmaQotICAgIGlmIHRlc3QgIngkU1VGRklYIiA9ICJ4cHJvcGVydGllcyI7IHRoZW4KLSAgICAgICAgJENBVCAkT1RIRVJfRklMRSB8ICRTRUQgLWUgJ3MvXChbXlxcXVwpOi9cMVxcOi9nJyAtZSAgJ3MvXChbXlxcXVwpPS9cMVxcPS9nJyAtZSAncy8jLiovIy9nJyBcCi0gICAgICAgICAgICB8ICRTRUQgLWYgIiRTUkNfUk9PVC9jb21tb24vYmluL3VuaWNvZGUyeC5zZWQiIFwKLSAgCSAgICB8ICRTRUQgLWUgJy9eIy9kJyAtZSAnL14kL2QnIFwKLSAgICAgICAgICAgIC1lIDphIC1lICcvXFwkL047IHMvXFxcbi8vOyB0YScgXAotICAJICAgIC1lICdzL15bIFx0XSovLztzL1sgXHRdKiQvLycgXAotCSAgICAtZSAncy9cXD0vPS8nIHwgTEFORz1DICRTT1JUID4gJE9USEVSX0ZJTEUuY2xlYW5lZAotICAgICAgICBUTVA9JChMQU5HPUMgJERJRkYgJE9USEVSX0ZJTEUuY2xlYW5lZCAkVEhJU19GSUxFKQotICAgIGZpCi0gICAgaWYgdGVzdCAtbiAiJFRNUCI7IHRoZW4KLSAgICAgICAgZWNobyBGaWxlcyAkT1RIRVJfRklMRSBhbmQgJFRISVNfRklMRSBkaWZmZXIKLSAgICAgICAgcmV0dXJuIDEKLSAgICBmaQotCi0gICAgcmV0dXJuIDAKLX0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvbXBhcmUgZGlyZWN0b3J5IHN0cnVjdHVyZQotCi1jb21wYXJlX2RpcnMoKSB7Ci0gICAgVEhJU19ESVI9JDEKLSAgICBPVEhFUl9ESVI9JDIKLSAgICBXT1JLX0RJUj0kMwotCi0gICAgbWtkaXIgLXAgJFdPUktfRElSCi0KLSAgICAoY2QgJE9USEVSX0RJUiAmJiAkRklORCAuIC10eXBlIGQgfCAkU09SVCA+ICRXT1JLX0RJUi9vdGhlcl9kaXJzKQotICAgIChjZCAkVEhJU19ESVIgJiYgJEZJTkQgLiAtdHlwZSBkIHwgJFNPUlQgPiAkV09SS19ESVIvdGhpc19kaXJzKQotICAgIAotICAgIGVjaG8gLW4gRGlyZWN0b3J5IHN0cnVjdHVyZS4uLgotICAgIGlmICRESUZGICRXT1JLX0RJUi9vdGhlcl9kaXJzICRXT1JLX0RJUi90aGlzX2RpcnMgPiAvZGV2L251bGw7IHRoZW4KLSAgICAgICAgZWNobyBJZGVudGljYWwhCi0gICAgZWxzZQotICAgICAgICBlY2hvIERpZmZlcmVuY2VzIGZvdW5kLgotICAgICAgICBSRUdSRVNTSU9OUz10cnVlCi0gICAgIyBEaWZmZXJlbmNlcyBpbiBkaXJlY3RvcmllcyBmb3VuZC4KLSAgICAgICAgT05MWV9PVEhFUj0kKCRESUZGICRXT1JLX0RJUi9vdGhlcl9kaXJzICRXT1JLX0RJUi90aGlzX2RpcnMgfCAkR1JFUCAnPCcpCi0gICAgICAgIGlmIFsgIiRPTkxZX09USEVSIiBdOyB0aGVuCi0gICAgICAgICAgICBlY2hvIE9ubHkgaW4gJE9USEVSCi0gICAgICAgICAgICBlY2hvICRPTkxZX09USEVSIHwgJFNFRCAnc3w8IC4vfFx0fGcnIHwgJFNFRCAncy8gL1xuL2cnCi0gICAgICAgIGZpCi0gICAgIyBEaWZmZXJlbmNlcyBpbiBkaXJlY3RvcmllcyBmb3VuZC4KLSAgICAgICAgT05MWV9USElTPSQoJERJRkYgJFdPUktfRElSL290aGVyX2RpcnMgJFdPUktfRElSL3RoaXNfZGlycyB8ICRHUkVQICc+JykKLSAgICAgICAgaWYgWyAiJE9OTFlfVEhJUyIgXTsgdGhlbgotICAgICAgICAgICAgZWNobyBPbmx5IGluICRUSElTCi0gICAgICAgICAgICBlY2hvICRPTkxZX1RISVMgfCAkU0VEICdzfD4gLi98XHR8ZycgfCAkU0VEICdzLyAvXG4vZycKLSAgICAgICAgZmkKLSAgICBmaQotfQotCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb21wYXJlIGZpbGUgc3RydWN0dXJlCi0KLWNvbXBhcmVfZmlsZXMoKSB7Ci0gICAgVEhJU19ESVI9JDEKLSAgICBPVEhFUl9ESVI9JDIKLSAgICBXT1JLX0RJUj0kMwotCi0gICAgbWtkaXIgLXAgJFdPUktfRElSCi0KLSAgICAoY2QgJE9USEVSX0RJUiAmJiAkRklORCAuIC10eXBlIGYgfCAkU09SVCA+ICRXT1JLX0RJUi9vdGhlcl9maWxlcykKLSAgICAoY2QgJFRISVNfRElSICYmICRGSU5EIC4gLXR5cGUgZiB8ICRTT1JUID4gJFdPUktfRElSL3RoaXNfZmlsZXMpCi0gICAgCi0gICAgZWNobyAtbiBGaWxlIG5hbWVzLi4uCi0gICAgaWYgZGlmZiAkV09SS19ESVIvb3RoZXJfZmlsZXMgJFdPUktfRElSL3RoaXNfZmlsZXMgPiAvZGV2L251bGw7IHRoZW4KLSAgICAgICAgZWNobyBJZGVudGljYWwhCi0gICAgZWxzZQotICAgICAgICBlY2hvIERpZmZlcmVuY2VzIGZvdW5kLgotICAgICAgICBSRUdSRVNTSU9OUz10cnVlCi0gICAgIyBEaWZmZXJlbmNlcyBpbiBkaXJlY3RvcmllcyBmb3VuZC4KLSAgICAgICAgT05MWV9PVEhFUj0kKGRpZmYgJFdPUktfRElSL290aGVyX2ZpbGVzICRXT1JLX0RJUi90aGlzX2ZpbGVzIHwgJEdSRVAgJzwnKQotICAgICAgICBpZiBbICIkT05MWV9PVEhFUiIgXTsgdGhlbgotICAgICAgICAgICAgZWNobyBPbmx5IGluICRPVEhFUgotICAgICAgICAgICAgZWNobyAiJE9OTFlfT1RIRVIiIHwgc2VkICdzfDwgLi98ICAgIHxnJwotICAgICAgICBmaQotICAgICMgRGlmZmVyZW5jZXMgaW4gZGlyZWN0b3JpZXMgZm91bmQuCi0gICAgICAgIE9OTFlfVEhJUz0kKGRpZmYgJFdPUktfRElSL290aGVyX2ZpbGVzICRXT1JLX0RJUi90aGlzX2ZpbGVzIHwgJEdSRVAgJz4nKQotICAgICAgICBpZiBbICIkT05MWV9USElTIiBdOyB0aGVuCi0gICAgICAgICAgICBlY2hvIE9ubHkgaW4gJFRISVMKLSAgICAgICAgICAgIGVjaG8gIiRPTkxZX1RISVMiIHwgc2VkICdzfD4gLi98ICAgIHxnJwotICAgICAgICBmaQotICAgIGZpCi19Ci0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvbXBhcmUgcGVybWlzc2lvbnMKLQotY29tcGFyZV9wZXJtaXNzaW9ucygpIHsKLSAgICBUSElTX0RJUj0kMQotICAgIE9USEVSX0RJUj0kMgotICAgIFdPUktfRElSPSQzCi0KLSAgICBta2RpciAtcCAkV09SS19ESVIKLQotICAgIGVjaG8gLW4gUGVybWlzc2lvbnMuLi4KLSAgICBmb3VuZD0iIgotICAgIGZvciBmIGluIGBjZCAkT1RIRVJfRElSICYmICRGSU5EIC4gLXR5cGUgZmAKLSAgICBkbwotICAgICAgICBpZiBbICEgLWYgJHtPVEhFUl9ESVJ9LyRmIF07IHRoZW4gY29udGludWU7IGZpCi0gICAgICAgIGlmIFsgISAtZiAke1RISVNfRElSfS8kZiBdOyB0aGVuIGNvbnRpbnVlOyBmaQotICAgICAgICBPUD1gbHMgLWwgJHtPVEhFUl9ESVJ9LyRmIHwgYXdrICd7cHJpbnRmKCIlLjEwc1xuIiwgJDEpO30nYAotICAgICAgICBUUD1gbHMgLWwgJHtUSElTX0RJUn0vJGYgfCBhd2sgJ3twcmludGYoIiUuMTBzXG4iLCAkMSk7fSdgCi0gICAgICAgIGlmIFsgIiRPUCIgIT0gIiRUUCIgXQotICAgICAgICB0aGVuCi0JICAgIGlmIFsgLXogIiRmb3VuZCIgXTsgdGhlbiBlY2hvIDsgZm91bmQ9InllcyI7IGZpCi0JICAgICRQUklOVEYgIlx0b2xkOiAke09QfSBuZXc6ICR7VFB9XHQkZlxuIgotICAgICAgICBmaQotICAgIGRvbmUKLSAgICBpZiBbIC16ICIkZm91bmQiIF07IHRoZW4gCi0gICAgICAgIGVjaG8gIklkZW50aWNhbCEiCi0gICAgZWxzZQotICAgICAgICBSRUdSRVNTSU9OUz10cnVlCi0gICAgZmkKLX0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvbXBhcmUgZmlsZSBjb21tYW5kIG91dHB1dAotCi1jb21wYXJlX2ZpbGVfdHlwZXMoKSB7Ci0gICAgVEhJU19ESVI9JDEKLSAgICBPVEhFUl9ESVI9JDIKLSAgICBXT1JLX0RJUj0kMwotCi0gICAgJE1LRElSIC1wICRXT1JLX0RJUgotCi0gICAgZWNobyAtbiBGaWxlIHR5cGVzLi4uCi0gICAgZm91bmQ9IiIKLSAgICBmb3IgZiBpbiBgY2QgJE9USEVSX0RJUiAmJiAkRklORCAuIC10eXBlIGZgCi0gICAgZG8KLSAgICAgICAgaWYgWyAhIC1mICR7T1RIRVJfRElSfS8kZiBdOyB0aGVuIGNvbnRpbnVlOyBmaQotICAgICAgICBpZiBbICEgLWYgJHtUSElTX0RJUn0vJGYgXTsgdGhlbiBjb250aW51ZTsgZmkKLSAgICAgICAgT0Y9YGNkICR7T1RIRVJfRElSfSAmJiAkRklMRSAkZmAKLSAgICAgICAgVEY9YGNkICR7VEhJU19ESVJ9ICYmICRGSUxFICRmYAotICAgICAgICBpZiBbICIkZiIgPSAiLi9zcmMuemlwIiBdIHx8IFsgIiRmIiA9ICIuL2pyZS9saWIvSk9iakMuamFyIiBdIHx8IFsgIiRmIiA9ICIuL2xpYi9KT2JqQy5qYXIiIF0KLSAgICAgICAgdGhlbgotCSAgICBpZiBbICJgZWNobyAkT0YgfCAkR1JFUCAtaWMgemlwYCIgLWd0IDAgLWEgImBlY2hvICRURiB8ICRHUkVQIC1pYyB6aXBgIiAtZ3QgMCBdCi0JICAgIHRoZW4KLQkgICAgICAgICMgdGhlIHdheSB3ZSBwcm9kdWNlcyB6aXAtZmlsZXMgbWFrZSBpdCBzbyB0aGF0IGRpcmVjdG9yaWVzIGFyZSBzdG9yZWQgaW4gb2xkIGZpbGUKLQkgICAgICAgICMgYnV0IG5vdCBpbiBuZXcgKG9ubHkgZmlsZXMgd2l0aCBmdWxsLXBhdGgpCi0JICAgICAgICAjIHRoaXMgbWFrZXMgZmlsZS01LjA5IHJlcG9ydCB0aGVtIGFzIGRpZmZlcmVudAotCSAgICAgICAgY29udGludWU7Ci0JICAgIGZpCi0gICAgICAgIGZpCi0gICAgICAgIAotICAgICAgICBpZiBbICIkT0YiICE9ICIkVEYiIF0KLSAgICAgICAgdGhlbgotCSAgICBpZiBbIC16ICIkZm91bmQiIF07IHRoZW4gZWNobyA7IGZvdW5kPSJ5ZXMiOyBmaQotCSAgICAkUFJJTlRGICJcdG90aGVyOiAke09GfVxuXHR0aGlzIDogJHtURn1cbiIKLSAgICAgICAgZmkKLSAgICBkb25lCi0gICAgaWYgWyAteiAiJGZvdW5kIiBdOyB0aGVuIAotICAgICAgICBlY2hvICJJZGVudGljYWwhIgotICAgIGVsc2UKLSAgICAgICAgUkVHUkVTU0lPTlM9dHJ1ZQotICAgIGZpCi19Ci0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb21wYXJlIHRoZSByZXN0IG9mIHRoZSBmaWxlcwotCi1jb21wYXJlX2dlbmVyYWxfZmlsZXMoKSB7Ci0gICAgVEhJU19ESVI9JDEKLSAgICBPVEhFUl9ESVI9JDIKLSAgICBXT1JLX0RJUj0kMwotICAgIAotICAgIEdFTkVSQUxfRklMRVM9JChjZCAkVEhJU19ESVIgJiYgJEZJTkQgLiAtdHlwZSBmICEgLW5hbWUgIiouc28iICEgLW5hbWUgIiouamFyIiAhIC1uYW1lICIqLnppcCIgXAotICAgICAgICAhIC1uYW1lICIqLmRlYnVnaW5mbyIgISAtbmFtZSAiKi5keWxpYiIgISAtbmFtZSAiamV4ZWMiIFwKLSAgICAgICAgISAtbmFtZSAiY3Quc3ltIiAhIC1uYW1lICIqLmRpeiIgISAtbmFtZSAiKi5kbGwiIFwKLSAgICAgICAgISAtbmFtZSAiKi5wZGIiICEgLW5hbWUgIiouZXhwIiAhIC1uYW1lICIqLmlsayIgXAotICAgICAgICAhIC1uYW1lICIqLmxpYiIgXAotICAgICAgICB8ICRHUkVQIC12ICIuL2Jpbi8iICB8ICRTT1JUIHwgJEZJTFRFUikKLQotICAgIGVjaG8gR2VuZXJhbCBmaWxlcy4uLgotICAgIGZvciBmIGluICRHRU5FUkFMX0ZJTEVTCi0gICAgZG8KLSAgICAgICAgaWYgWyAtZSAkT1RIRVJfRElSLyRmIF07IHRoZW4KLSAgICAgICAgICAgIERJRkZfT1VUPSQoJERJRkYgJE9USEVSX0RJUi8kZiAkVEhJU19ESVIvJGYgMj4mMSkKLSAgICAgICAgICAgIGlmIFsgLW4gIiRESUZGX09VVCIgXTsgdGhlbgotICAgICAgICAgICAgICAgIGVjaG8gJGYKLSAgICAgICAgICAgICAgICBSRUdSRVNTSU9OUz10cnVlCi0gICAgICAgICAgICAgICAgaWYgWyAiJFNIT1dfRElGRlMiID0gInRydWUiIF07IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgZWNobyAiJERJRkZfT1VUIgotICAgICAgICAgICAgICAgIGZpCi0gICAgICAgICAgICBmaQotICAgICAgICBmaQotICAgIGRvbmUKLQotCi19Ci0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb21wYXJlIHppcCBmaWxlCi0KLWNvbXBhcmVfemlwX2ZpbGUoKSB7Ci0gICAgVEhJU19ESVI9JDEKLSAgICBPVEhFUl9ESVI9JDIKLSAgICBXT1JLX0RJUj0kMwotICAgIFpJUF9GSUxFPSQ0Ci0KLSAgICBUSElTX1pJUD0kVEhJU19ESVIvJFpJUF9GSUxFCi0gICAgT1RIRVJfWklQPSRPVEhFUl9ESVIvJFpJUF9GSUxFCi0KLSAgICBUSElTX1NVRkZJWD0iJHtUSElTX1pJUCMjKi59IgotICAgIE9USEVSX1NVRkZJWD0iJHtPVEhFUl9aSVAjIyoufSIKLSAgICBpZiBbICIkVEhJU19TVUZGSVgiICE9ICIkT1RIRVJfU1VGRklYIiBdOyB0aGVuCi0gICAgICAgIGVjaG8gVGhlIGZpbGVzIGRvIG5vdCBoYXZlIHRoZSBzYW1lIHN1ZmZpeCB0eXBlIQotICAgICAgICByZXR1cm4gMgotICAgIGZpCi0KLSAgICBVTkFSQ0hJVkU9IiRVTlpJUCAtcSIKLQotICAgIFRZUEU9IiRUSElTX1NVRkZJWCIKLQotICAgIGlmICRDTVAgJE9USEVSX1pJUCAkVEhJU19aSVAgPiAvZGV2L251bGwKLSAgICB0aGVuCi0gICAgICAgIHJldHVybiAwCi0gICAgZmkKLSAgICAjIE5vdCBxdWl0ZSBpZGVudGljYWwsIHRoZSBtaWdodCBzdGlsbCBjb250YWluIHRoZSBzYW1lIGRhdGEuCi0gICAgIyBVbnBhY2sgdGhlIGphci96aXAgZmlsZXMgaW4gdGVtcCBkaXJzCi0gICAgCi0gICAgVEhJU19VTlpJUERJUj0kV09SS19ESVIvJFpJUF9GSUxFLnRoaXMKLSAgICBPVEhFUl9VTlpJUERJUj0kV09SS19ESVIvJFpJUF9GSUxFLm90aGVyCi0gICAgJFJNIC1yZiAkVEhJU19VTlpJUERJUiAkT1RIRVJfVU5aSVBESVIKLSAgICAkTUtESVIgLXAgJFRISVNfVU5aSVBESVIKLSAgICAkTUtESVIgLXAgJE9USEVSX1VOWklQRElSCi0gICAgKGNkICRUSElTX1VOWklQRElSICYmICRVTkFSQ0hJVkUgJFRISVNfWklQKQotICAgIChjZCAkT1RIRVJfVU5aSVBESVIgJiYgJFVOQVJDSElWRSAkT1RIRVJfWklQKQotCi0gICAgQ09OVEVOVFNfRElGRl9GSUxFPSRXT1JLX0RJUi8kWklQX0ZJTEUuZGlmZgotICAgIExBTkc9QyAkRElGRiAtcnEgJE9USEVSX1VOWklQRElSICRUSElTX1VOWklQRElSID4gJENPTlRFTlRTX0RJRkZfRklMRQotCi0gICAgT05MWV9PVEhFUj0kKCRHUkVQICJeT25seSBpbiAkT1RIRVJfVU5aSVBESVIiICRDT05URU5UU19ESUZGX0ZJTEUpCi0gICAgT05MWV9USElTPSQoJEdSRVAgIl5Pbmx5IGluICRUSElTX1VOWklQRElSIiAkQ09OVEVOVFNfRElGRl9GSUxFKQotCi0gICAgcmV0dXJuX3ZhbHVlPTAKLQotICAgIGlmIFsgLW4gIiRPTkxZX09USEVSIiBdOyB0aGVuCi0gICAgICAgIGVjaG8gIiAgICAgICAgT25seSBPVEhFUiAkWklQX0ZJTEUgY29udGFpbnM6IgotICAgICAgICBlY2hvICIkT05MWV9PVEhFUiIgfCBzZWQgInN8T25seSBpbiAkT1RIRVJfVU5aSVBESVJ8ICAgICAgICAgICAgfCJnIHwgc2VkICdzfDogfC98ZycKLSAgICAgICAgcmV0dXJuX3ZhbHVlPTEKLSAgICBmaQotCi0gICAgaWYgWyAtbiAiJE9OTFlfVEhJUyIgXTsgdGhlbgotICAgICAgICBlY2hvICIgICAgICAgIE9ubHkgVEhJUyAkWklQX0ZJTEUgY29udGFpbnM6IgotICAgICAgICBlY2hvICIkT05MWV9USElTIiB8IHNlZCAic3xPbmx5IGluICRUSElTX1VOWklQRElSfCAgICAgICAgICAgIHwiZyB8IHNlZCAnc3w6IHwvfGcnCi0gICAgICAgIHJldHVybl92YWx1ZT0xCi0gICAgZmkKLQotICAgIERJRkZJTkdfRklMRVM9JCgkR1JFUCBkaWZmZXIgJENPTlRFTlRTX0RJRkZfRklMRSB8ICRDVVQgLWYgMiAtZCAnICcgfCAkU0VEICJzfCRPVEhFUl9VTlpJUERJUi98fGciKQotCi0gICAgJFJNIC1mICRXT1JLX0RJUi8kWklQX0ZJTEUuZGlmZnMKLSAgICBmb3IgZmlsZSBpbiAkRElGRklOR19GSUxFUzsgZG8KLQlpZiBbWyAiJEFDQ0VQVEVEX0pBUlpJUF9DT05URU5UUyIgIT0gKiIkZmlsZSIqIF1dOyB0aGVuCi0gICAgICAgICAgICBkaWZmX3RleHQgJE9USEVSX1VOWklQRElSLyRmaWxlICRUSElTX1VOWklQRElSLyRmaWxlID4+ICRXT1JLX0RJUi8kWklQX0ZJTEUuZGlmZnMKLQlmaQotICAgIGRvbmUKLQotICAgIGlmIFsgLXMgIiRXT1JLX0RJUi8kWklQX0ZJTEUuZGlmZnMiIF07IHRoZW4KLSAgICAgICAgcmV0dXJuX3ZhbHVlPTEKLSAgICAgICAgZWNobyAiICAgICAgICBEaWZmZXJpbmcgZmlsZXMgaW4gJFpJUF9GSUxFIgotICAgICAgICAkQ0FUICRXT1JLX0RJUi8kWklQX0ZJTEUuZGlmZnMgfCAkR1JFUCBkaWZmZXIgfCBjdXQgLWYgMiAtZCAnICcgfCBcCi0gICAgICAgICAgICAkU0VEICJzfCRPVEhFUl9VTlpJUERJUnwgICAgICAgICAgICB8ZyIgPiAkV09SS19ESVIvJFpJUF9GSUxFLmRpZmZsaXN0Ci0gICAgICAgICRDQVQgJFdPUktfRElSLyRaSVBfRklMRS5kaWZmbGlzdAotCi0gICAgICAgIGlmIFsgLW4gIiRTSE9XX0RJRkZTIiBdOyB0aGVuCi0gICAgICAgICAgICBmb3IgaSBpbiAkKGNhdCAkV09SS19ESVIvJFpJUF9GSUxFLmRpZmZsaXN0KSA7IGRvCi0gICAgICAgICAgICAgICAgaWYgWyAtZiAiJHtPVEhFUl9VTlpJUERJUn0vJGkuamF2YXAiIF07IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgTEFORz1DICRESUZGICR7T1RIRVJfVU5aSVBESVJ9LyRpLmphdmFwICR7VEhJU19VTlpJUERJUn0vJGkuamF2YXAKLSAgICAgICAgICAgICAgICBlbGlmIFsgLWYgIiR7T1RIRVJfVU5aSVBESVJ9LyRpLmNsZWFuZWQiIF07IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgTEFORz1DICRESUZGICR7T1RIRVJfVU5aSVBESVJ9LyRpLmNsZWFuZWQgJHtUSElTX1VOWklQRElSfS8kaQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgTEFORz1DICRESUZGICR7T1RIRVJfVU5aSVBESVJ9LyRpICR7VEhJU19VTlpJUERJUn0vJGkKLSAgICAgICAgICAgICAgICBmaQotICAgICAgICAgICAgZG9uZQotICAgICAgICBmaQotICAgIGZpCi0KLSAgICByZXR1cm4gJHJldHVybl92YWx1ZQotfQotCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb21wYXJlIGFsbCB6aXAgZmlsZXMKLQotY29tcGFyZV9hbGxfemlwX2ZpbGVzKCkgewotICAgIFRISVNfRElSPSQxCi0gICAgT1RIRVJfRElSPSQyCi0gICAgV09SS19ESVI9JDMKLQotICAgIFpJUFM9JChjZCAkVEhJU19ESVIgJiYgJEZJTkQgLiAtdHlwZSBmIC1uYW1lICIqLnppcCIgfCAkU09SVCB8ICRGSUxURVIgKQotCi0gICAgaWYgWyAtbiAiJFpJUFMiIF07IHRoZW4KLSAgICAgICAgZWNobyBaaXAgZmlsZXMuLi4KLQotICAgICAgICByZXR1cm5fdmFsdWU9MAotICAgICAgICBmb3IgZiBpbiAkWklQUzsgZG8KLSAgICAgICAgICAgIGlmIFsgLWYgIiRPVEhFUl9ESVIvJGYiIF07IHRoZW4KLSAgICAgICAgICAgICAgICBjb21wYXJlX3ppcF9maWxlICRUSElTX0RJUiAkT1RIRVJfRElSICRXT1JLX0RJUiAkZgotICAgICAgICAgICAgICAgIGlmIFsgIiQ/IiAhPSAiMCIgXTsgdGhlbgotICAgICAgICAgICAgICAgICAgICByZXR1cm5fdmFsdWU9MQotICAgICAgICAgICAgICAgICAgICBSRUdSRVNTSU9OUz10cnVlCi0gICAgICAgICAgICAgICAgZmkKLSAgICAgICAgICAgIGZpCi0gICAgICAgIGRvbmUKLSAgICBmaQotCi0gICAgcmV0dXJuICRyZXR1cm5fdmFsdWUKLX0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvbXBhcmUgYWxsIGphciBmaWxlcwotCi1jb21wYXJlX2FsbF9qYXJfZmlsZXMoKSB7Ci0gICAgVEhJU19ESVI9JDEKLSAgICBPVEhFUl9ESVI9JDIKLSAgICBXT1JLX0RJUj0kMwotCi0gICAgIyBUT0RPIGZpbHRlcj8KLSAgICBaSVBTPSQoY2QgJFRISVNfRElSICYmICRGSU5EIC4gLXR5cGUgZiAtbmFtZSAiKi5qYXIiIHwgJFNPUlQgfCAkRklMVEVSKQotCi0gICAgaWYgWyAtbiAiJFpJUFMiIF07IHRoZW4KLSAgICAgICAgZWNobyBKYXIgZmlsZXMuLi4KLQotICAgICAgICByZXR1cm5fdmFsdWU9MAotICAgICAgICBmb3IgZiBpbiAkWklQUzsgZG8KLSAgICAgICAgICAgIGlmIFsgLWYgIiRPVEhFUl9ESVIvJGYiIF07IHRoZW4KLSAgICAgICAgICAgICAgICBjb21wYXJlX3ppcF9maWxlICRUSElTX0RJUiAkT1RIRVJfRElSICRXT1JLX0RJUiAkZgotICAgICAgICAgICAgICAgIGlmIFsgIiQ/IiAhPSAiMCIgXTsgdGhlbgotICAgICAgICAgICAgICAgICAgICByZXR1cm5fdmFsdWU9MQotICAgICAgICAgICAgICAgICAgICBSRUdSRVNTSU9OUz10cnVlCi0gICAgICAgICAgICAgICAgZmkKLSAgICAgICAgICAgIGZpCi0gICAgICAgIGRvbmUKLSAgICBmaQotCi0gICAgcmV0dXJuICRyZXR1cm5fdmFsdWUKLX0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvbXBhcmUgYmluYXJ5IChleGVjdXRhYmxlL2xpYnJhcnkpIGZpbGUKLQotY29tcGFyZV9iaW5fZmlsZSgpIHsKLSAgICBUSElTX0RJUj0kMQotICAgIE9USEVSX0RJUj0kMgotICAgIFdPUktfRElSPSQzCi0gICAgQklOX0ZJTEU9JDQKLQotICAgIFRISVNfRklMRT0kVEhJU19ESVIvJEJJTl9GSUxFCi0gICAgT1RIRVJfRklMRT0kT1RIRVJfRElSLyRCSU5fRklMRQotICAgIE5BTUU9JChiYXNlbmFtZSAkQklOX0ZJTEUpCi0gICAgV09SS19GSUxFX0JBU0U9JFdPUktfRElSLyRCSU5fRklMRQotICAgIEZJTEVfV09SS19ESVI9JChkaXJuYW1lICRXT1JLX0ZJTEVfQkFTRSkKLQotICAgICRNS0RJUiAtcCAkRklMRV9XT1JLX0RJUgotCi0gICAgT1JJR19USElTX0ZJTEU9IiRUSElTX0ZJTEUiCi0gICAgT1JJR19PVEhFUl9GSUxFPSIkT1RIRVJfRklMRSIKLQotICAgIGlmIFtbICIkU1RSSVBfQkVGT1JFX0NPTVBBUkUiID0gKiIkQklOX0ZJTEUiKiBdXTsgdGhlbgotICAgICAgICBUSElTX1NUUklQUEVEX0ZJTEU9JEZJTEVfV09SS19ESVIvdGhpcy8kTkFNRQotICAgICAgICBPVEhFUl9TVFJJUFBFRF9GSUxFPSRGSUxFX1dPUktfRElSL290aGVyLyROQU1FCi0gICAgICAgICRNS0RJUiAtcCAkRklMRV9XT1JLX0RJUi90aGlzICRGSUxFX1dPUktfRElSL290aGVyCi0gICAgICAgICRDUCAkVEhJU19GSUxFICRUSElTX1NUUklQUEVEX0ZJTEUKLSAgICAgICAgJENQICRPVEhFUl9GSUxFICRPVEhFUl9TVFJJUFBFRF9GSUxFCi0gICAgICAgICRTVFJJUCAkVEhJU19TVFJJUFBFRF9GSUxFCi0gICAgICAgICRTVFJJUCAkT1RIRVJfU1RSSVBQRURfRklMRQotICAgICAgICBUSElTX0ZJTEU9IiRUSElTX1NUUklQUEVEX0ZJTEUiCi0gICAgICAgIE9USEVSX0ZJTEU9IiRPVEhFUl9TVFJJUFBFRF9GSUxFIgotICAgIGZpCi0KLSAgICBpZiBbIC16ICIkU0tJUF9CSU5fRElGRiIgXTsgdGhlbgotICAgICAgICBpZiBjbXAgJE9USEVSX0ZJTEUgJFRISVNfRklMRSA+IC9kZXYvbnVsbDsgdGhlbgotICAgICAgICAjIFRoZSBmaWxlcyB3ZXJlIGJ5dGV3aXNlIGlkZW50aWNhbC4KLSAgICAgICAgICAgIGlmIFsgLW4gIiRWRVJCT1NFIiBdOyB0aGVuCi0gICAgICAgICAgICAgICAgZWNobyAiICAgICAgICA6ICAgICAgICAgICA6ICAgICAgICAgOiAgICAgICAgIDogICAgICAgICAgOiAkQklOX0ZJTEUiCi0gICAgICAgICAgICBmaQotICAgICAgICAgICAgcmV0dXJuIDAKLSAgICAgICAgZmkKLSAgICAgICAgQklOX01TRz0iIGRpZmYgIgotICAgICAgICBpZiBbWyAiJEFDQ0VQVEVEX0JJTl9ESUZGIiAhPSAqIiRCSU5fRklMRSIqIF1dOyB0aGVuCi0gICAgICAgICAgICBESUZGX0JJTj10cnVlCi0gICAgICAgICAgICBpZiBbWyAiJEtOT1dOX0JJTl9ESUZGIiAhPSAqIiRCSU5fRklMRSIqIF1dOyB0aGVuCi0gICAgICAgICAgICAgICAgQklOX01TRz0iKiRCSU5fTVNHKiIKLSAgICAgICAgICAgICAgICBSRUdSRVNTSU9OUz10cnVlCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgQklOX01TRz0iICRCSU5fTVNHICIKLSAgICAgICAgICAgIGZpCi0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIEJJTl9NU0c9IigkQklOX01TRykiCi0gICAgICAgICAgICBESUZGX0JJTj0KLSAgICAgICAgZmkKLSAgICBmaQotCi0gICAgVEhJU19TSVpFPSQobHMgLWwgIiRUSElTX0ZJTEUiIHwgYXdrICd7IHByaW50ICQ1IH0nKQotICAgIE9USEVSX1NJWkU9JChscyAtbCAiJE9USEVSX0ZJTEUiIHwgYXdrICd7IHByaW50ICQ1IH0nKQotICAgIGlmIFsgJFRISVNfU0laRSAtbmUgJE9USEVSX1NJWkUgXTsgdGhlbgotICAgICAgICBESUZGX1NJWkVfTlVNPSQoJEVYUFIgJFRISVNfU0laRSAtICRPVEhFUl9TSVpFKQotICAgICAgICBESUZGX1NJWkVfUkVMPSQoJEVYUFIgJFRISVNfU0laRSBcKiAxMDAgLyAkT1RIRVJfU0laRSkKLSAgICAgICAgU0laRV9NU0c9JCgkUFJJTlRGICIlM2QlJSAlNGQiICRESUZGX1NJWkVfUkVMICRESUZGX1NJWkVfTlVNKQotICAgICAgICBpZiBbWyAiJEFDQ0VQVEVEX1NNQUxMX1NJWkVfRElGRiIgPSAqIiRCSU5fRklMRSIqIF1dICYmIFsgIiRESUZGX1NJWkVfUkVMIiAtZ3QgOTggXSAmJiBbICIkRElGRl9TSVpFX1JFTCIgLWx0IDEwMiBdOyB0aGVuCi0gICAgICAgICAgICBTSVpFX01TRz0iKCRTSVpFX01TRykiCi0gICAgICAgICAgICBESUZGX1NJWkU9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGlmIFtbICIkQUNDRVBURURfU0laRV9ESUZGIiAhPSAqIiRCSU5fRklMRSIqIF1dOyB0aGVuCi0gICAgICAgICAgICAgICAgRElGRl9TSVpFPXRydWUKLSAgICAgICAgICAgICAgICBpZiBbWyAiJEtOT1dOX1NJWkVfRElGRiIgIT0gKiIkQklOX0ZJTEUiKiBdXTsgdGhlbgotICAgICAgICAgICAgICAgICAgICBTSVpFX01TRz0iKiRTSVpFX01TRyoiCi0gICAgICAgICAgICAgICAgICAgIFJFR1JFU1NJT05TPXRydWUKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIFNJWkVfTVNHPSIgJFNJWkVfTVNHICIKLSAgICAgICAgICAgICAgICBmaQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIFNJWkVfTVNHPSIoJFNJWkVfTVNHKSIKLSAgICAgICAgICAgICAgICBESUZGX1NJWkU9Ci0gICAgICAgICAgICBmaQotICAgICAgICBmaQotICAgIGVsc2UKLSAgICAgICAgU0laRV9NU0c9IiAgICAgICAgICAgIgotICAgICAgICBESUZGX1NJWkU9Ci0gICAgICAgIGlmIFtbICIkS05PV05fU0laRV9ESUZGICRBQ0NFUFRFRF9TSVpFX0RJRkYiID0gKiIkQklOX0ZJTEUiKiBdXTsgdGhlbgotICAgICAgICAgICAgU0laRV9NU0c9IiAgICAgISAgICAgIgotICAgICAgICBmaQotICAgIGZpCi0KLSAgICBpZiBbWyAiJFNPUlRfU1lNQk9MUyIgPSAqIiRCSU5fRklMRSIqIF1dOyB0aGVuCi0gICAgICAgIFNZTV9TT1JUX0NNRD0ic29ydCIKLSAgICBlbHNlCi0gICAgICAgIFNZTV9TT1JUX0NNRD0iY2F0IgotICAgIGZpCi0KLSAgICAjIENoZWNrIHN5bWJvbHMKLSAgICBpZiBbICIkT1BFTkpES19UQVJHRVRfT1MiID0gIndpbmRvd3MiIF07IHRoZW4KLQkkRFVNUEJJTiAtZXhwb3J0cyAkT1RIRVJfRklMRSB8ICRHUkVQICIgPSAiIHwgJFNZTV9TT1JUX0NNRCA+ICRXT1JLX0ZJTEVfQkFTRS5zeW1ib2xzLm90aGVyCi0JJERVTVBCSU4gLWV4cG9ydHMgJFRISVNfRklMRSAgfCAkR1JFUCAiID0gIiB8ICRTWU1fU09SVF9DTUQgPiAkV09SS19GSUxFX0JBU0Uuc3ltYm9scy50aGlzCi0gICAgZWxpZiBbICIkT1BFTkpES19UQVJHRVRfT1MiID0gInNvbGFyaXMiIF07IHRoZW4KLSAgICAgICAgIyBTb21lIHN5bWJvbHMgZ2V0IHNlZW1pbmdseSByYW5kb20gMTUgY2hhcmFjdGVyIHByZWZpeGVzLiBGaWx0ZXIgdGhlbSBvdXQuCi0gICAgICAgICROTSAtYSAkT1JJR19PVEhFUl9GSUxFIHwgJEdSRVAgLXYgJE5BTUUgfCAkQVdLICd7cHJpbnQgJDIsICQzLCAkNCwgJDV9JyB8ICRTRUQgJ3MvXlwoW2EtekEtWl0gXC5cKVthLXpBLVowLTlfXCRdXHsxNSwxNVx9XC4vXDEuL2cnIHwgJFNZTV9TT1JUX0NNRCA+ICRXT1JLX0ZJTEVfQkFTRS5zeW1ib2xzLm90aGVyCi0JJE5NIC1hICRPUklHX1RISVNfRklMRSAgfCAkR1JFUCAtdiAkTkFNRSB8ICRBV0sgJ3twcmludCAkMiwgJDMsICQ0LCAkNX0nIHwgJFNFRCAncy9eXChbYS16QS1aXSBcLlwpW2EtekEtWjAtOV9cJF1cezE1LDE1XH1cLi9cMS4vZycgfCAkU1lNX1NPUlRfQ01EID4gJFdPUktfRklMRV9CQVNFLnN5bWJvbHMudGhpcwotICAgIGVsc2UKLQkkTk0gLWEgJE9SSUdfT1RIRVJfRklMRSB8ICRHUkVQIC12ICROQU1FIHwgJEFXSyAne3ByaW50ICQyLCAkMywgJDQsICQ1fScgfCAkU1lNX1NPUlRfQ01EID4gJFdPUktfRklMRV9CQVNFLnN5bWJvbHMub3RoZXIKLQkkTk0gLWEgJE9SSUdfVEhJU19GSUxFICB8ICRHUkVQIC12ICROQU1FIHwgJEFXSyAne3ByaW50ICQyLCAkMywgJDQsICQ1fScgfCAkU1lNX1NPUlRfQ01EID4gJFdPUktfRklMRV9CQVNFLnN5bWJvbHMudGhpcwotICAgIGZpCi0gICAgCi0gICAgTEFORz1DICRESUZGICRXT1JLX0ZJTEVfQkFTRS5zeW1ib2xzLm90aGVyICRXT1JLX0ZJTEVfQkFTRS5zeW1ib2xzLnRoaXMgPiAkV09SS19GSUxFX0JBU0Uuc3ltYm9scy5kaWZmCi0gICAgaWYgWyAtcyAkV09SS19GSUxFX0JBU0Uuc3ltYm9scy5kaWZmIF07IHRoZW4KLSAgICAgICAgU1lNX01TRz0iIGRpZmYgICIKLSAgICAgICAgaWYgW1sgIiRBQ0NFUFRFRF9TWU1fRElGRiIgIT0gKiIkQklOX0ZJTEUiKiBdXTsgdGhlbgotICAgICAgICAgICAgRElGRl9TWU09dHJ1ZQotICAgICAgICAgICAgaWYgW1sgIiRLTk9XTl9TWU1fRElGRiIgIT0gKiIkQklOX0ZJTEUiKiBdXTsgdGhlbgotICAgICAgICAgICAgICAgIFNZTV9NU0c9IiokU1lNX01TRyoiCi0gICAgICAgICAgICAgICAgUkVHUkVTU0lPTlM9dHJ1ZQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIFNZTV9NU0c9IiAkU1lNX01TRyAiCi0gICAgICAgICAgICBmaQotICAgICAgICBlbHNlCi0gICAgICAgICAgICBTWU1fTVNHPSIoJFNZTV9NU0cpIiAgICAgICAgICAgIAotICAgICAgICAgICAgRElGRl9TWU09Ci0gICAgICAgIGZpCi0gICAgZWxzZQotICAgICAgICBTWU1fTVNHPSIgICAgICAgICAiCi0gICAgICAgIERJRkZfU1lNPQotICAgICAgICBpZiBbWyAiJEtOT1dOX1NZTV9ESUZGICRBQ0NFUFRFRF9TWU1fRElGRiIgPSAqIiRCSU5fRklMRSIqIF1dOyB0aGVuCi0gICAgICAgICAgICBTWU1fTVNHPSIgICAgISAgICAiCi0gICAgICAgIGZpCi0gICAgZmkKLQotICAgICMgQ2hlY2sgZGVwZW5kZW5jaWVzCi0gICAgaWYgWyAtbiAiJExERF9DTUQiIF07dGhlbgotCShjZCAkRklMRV9XT1JLX0RJUiAmJiAkQ1AgJE9USEVSX0ZJTEUgLiAmJiAkTEREX0NNRCAkTkFNRSB8ICRBV0sgJ3sgcHJpbnQgJDE7fScgfCAkU09SVCB8ICRURUUgJFdPUktfRklMRV9CQVNFLmRlcHMub3RoZXIgfCAkVU5JUSA+ICRXT1JLX0ZJTEVfQkFTRS5kZXBzLm90aGVyLnVuaXEpCi0JKGNkICRGSUxFX1dPUktfRElSICYmICRDUCAkVEhJU19GSUxFIC4gJiYgJExERF9DTUQgJE5BTUUgfCAkQVdLICd7IHByaW50ICQxO30nIHwgJFNPUlQgfCAkVEVFICRXT1JLX0ZJTEVfQkFTRS5kZXBzLnRoaXMgfCAkVU5JUSA+ICRXT1JLX0ZJTEVfQkFTRS5kZXBzLnRoaXMudW5pcSkKLQkoY2QgJEZJTEVfV09SS19ESVIgJiYgJFJNIC1mICROQU1FKQotCQotCUxBTkc9QyAkRElGRiAkV09SS19GSUxFX0JBU0UuZGVwcy5vdGhlciAkV09SS19GSUxFX0JBU0UuZGVwcy50aGlzID4gJFdPUktfRklMRV9CQVNFLmRlcHMuZGlmZgotCUxBTkc9QyAkRElGRiAkV09SS19GSUxFX0JBU0UuZGVwcy5vdGhlci51bmlxICRXT1JLX0ZJTEVfQkFTRS5kZXBzLnRoaXMudW5pcSA+ICRXT1JLX0ZJTEVfQkFTRS5kZXBzLmRpZmYudW5pcQotCQotCWlmIFsgLXMgJFdPUktfRklMRV9CQVNFLmRlcHMuZGlmZiBdOyB0aGVuCi0gICAgICAgICAgICBpZiBbIC1zICRXT1JLX0ZJTEVfQkFTRS5kZXBzLmRpZmYudW5pcSBdOyB0aGVuCi0JCURFUF9NU0c9IiBkaWZmICAiCi0gICAgICAgICAgICBlbHNlCi0JCURFUF9NU0c9IiByZWR1biAiCi0gICAgICAgICAgICBmaQotICAgICAgICAgICAgaWYgW1sgIiRBQ0NFUFRFRF9ERVBfRElGRiIgIT0gKiIkQklOX0ZJTEUiKiBdXTsgdGhlbgotCQlESUZGX0RFUD10cnVlCi0JCWlmIFtbICIkS05PV05fREVQX0RJRkYiICE9ICoiJEJJTl9GSUxFIiogXV07IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgREVQX01TRz0iKiRERVBfTVNHKiIKLSAgICAgICAgICAgICAgICAgICAgUkVHUkVTU0lPTlM9dHJ1ZQotCQllbHNlCi0gICAgICAgICAgICAgICAgICAgIERFUF9NU0c9IiAkREVQX01TRyAiCi0JCWZpCi0gICAgICAgICAgICBlbHNlCi0JCURFUF9NU0c9IigkREVQX01TRykiCi0JCURJRkZfREVQPQotICAgICAgICAgICAgZmkKLQllbHNlCi0JICAgIERFUF9NU0c9IiAgICAgICAgICIKLQkgICAgRElGRl9ERVA9Ci0gICAgICAgICAgICBpZiBbWyAiJEtOT1dOX0RFUF9ESUZGICRBQ0NFUFRFRF9ERVBfRElGRiIgPSAqIiRCSU5fRklMRSIqIF1dOyB0aGVuCi0gICAgICAgICAgICAgICAgREVQX01TRz0iICAgICAhICAgICAgIgotICAgICAgICAgICAgZmkKLQlmaQotICAgIGZpCi0gICAgCi0gICAgIyBDb21wYXJlIHJlYWRlbGYgb3V0cHV0Ci0gICAgaWYgWyAtbiAiJFJFQURFTEZfQ01EIiBdICYmIFsgLXogIiRTS0lQX0VMRl9ESUZGIiBdOyB0aGVuCi0gICAgICAgICRSRUFERUxGX0NNRCAkT1RIRVJfRklMRSA+ICRXT1JLX0ZJTEVfQkFTRS5yZWFkZWxmLm90aGVyIDI+JjEKLSAgICAgICAgJFJFQURFTEZfQ01EICRUSElTX0ZJTEUgPiAkV09SS19GSUxFX0JBU0UucmVhZGVsZi50aGlzIDI+JjEKLSAgICAgICAgCi0gICAgICAgIExBTkc9QyAkRElGRiAkV09SS19GSUxFX0JBU0UucmVhZGVsZi5vdGhlciAkV09SS19GSUxFX0JBU0UucmVhZGVsZi50aGlzID4gJFdPUktfRklMRV9CQVNFLnJlYWRlbGYuZGlmZgotICAgICAgICAKLSAgICAgICAgaWYgWyAtcyAkV09SS19GSUxFX0JBU0UucmVhZGVsZi5kaWZmIF07IHRoZW4KLSAgICAgICAgICAgIEVMRl9ESUZGX1NJWkU9JChscyAtbiAkV09SS19GSUxFX0JBU0UucmVhZGVsZi5kaWZmIHwgYXdrICd7cHJpbnQgJDV9JykKLSAgICAgICAgICAgIEVMRl9NU0c9JCgkUFJJTlRGICIlOGQiICRFTEZfRElGRl9TSVpFKQotICAgICAgICAgICAgaWYgW1sgIiRBQ0NFUFRFRF9FTEZfRElGRiIgIT0gKiIkQklOX0ZJTEUiKiBdXTsgdGhlbgotICAgICAgICAgICAgICAgIERJRkZfRUxGPXRydWUKLSAgICAgICAgICAgICAgICBpZiBbWyAiJEtOT1dOX0VMRl9ESUZGIiAhPSAqIiRCSU5fRklMRSIqIF1dOyB0aGVuCi0gICAgICAgICAgICAgICAgICAgIEVMRl9NU0c9IiokRUxGX01TRyoiCi0gICAgICAgICAgICAgICAgICAgIFJFR1JFU1NJT05TPXRydWUKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIEVMRl9NU0c9IiAkRUxGX01TRyAiCi0gICAgICAgICAgICAgICAgZmkKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBFTEZfTVNHPSIoJEVMRl9NU0cpIgotICAgICAgICAgICAgICAgIERJRkZfRUxGPQotICAgICAgICAgICAgZmkKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgRUxGX01TRz0iICAgICAgICAgICIKLSAgICAgICAgICAgIERJRkZfRUxGPQotICAgICAgICAgICAgaWYgW1sgIiRLTk9XTl9ERVBfRElGRiAkQUNDRVBURURfREVQX0RJRkYiID0gKiIkQklOX0ZJTEUiKiBdXTsgdGhlbgotICAgICAgICAgICAgICAgIEVMRl9NU0c9IiAgICAhICAgICIKLSAgICAgICAgICAgIGZpCi0gICAgICAgIGZpCi0gICAgZmkKLQotICAgICMgQ29tcGFyZSBkaXNhc3NlbWJsZSBvdXRwdXQKLSAgICBpZiBbIC1mICIkT0JKRFVNUCIgXSAmJiBbIC16ICIkU0tJUF9ESVNfRElGRiIgXTsgdGhlbgotICAgICAgICAkT0JKRFVNUCAtZCAkT1RIRVJfRklMRSB8ICRHUkVQIC12ICROQU1FID4gJFdPUktfRklMRV9CQVNFLmRpcy5vdGhlciAyPiYxCi0gICAgICAgICRPQkpEVU1QIC1kICRUSElTX0ZJTEUgIHwgJEdSRVAgLXYgJE5BTUUgPiAkV09SS19GSUxFX0JBU0UuZGlzLnRoaXMgIDI+JjEKLSAgICAgICAgCi0gICAgICAgIExBTkc9QyAkRElGRiAkV09SS19GSUxFX0JBU0UuZGlzLm90aGVyICRXT1JLX0ZJTEVfQkFTRS5kaXMudGhpcyA+ICRXT1JLX0ZJTEVfQkFTRS5kaXMuZGlmZgotICAgICAgICAKLSAgICAgICAgaWYgWyAtcyAkV09SS19GSUxFX0JBU0UuZGlzLmRpZmYgXTsgdGhlbgotICAgICAgICAgICAgRElTX0RJRkZfU0laRT0kKGxzIC1uICRXT1JLX0ZJTEVfQkFTRS5kaXMuZGlmZiB8IGF3ayAne3ByaW50ICQ1fScpCi0gICAgICAgICAgICBESVNfTVNHPSQoJFBSSU5URiAiJThkIiAkRElTX0RJRkZfU0laRSkKLSAgICAgICAgICAgIGlmIFtbICIkQUNDRVBURURfRElTX0RJRkYiICE9ICoiJEJJTl9GSUxFIiogXV07IHRoZW4KLSAgICAgICAgICAgICAgICBESUZGX0RJUz10cnVlCi0gICAgICAgICAgICAgICAgaWYgW1sgIiRLTk9XTl9ESVNfRElGRiIgIT0gKiIkQklOX0ZJTEUiKiBdXTsgdGhlbgotICAgICAgICAgICAgICAgICAgICBESVNfTVNHPSIqJERJU19NU0cqIgotICAgICAgICAgICAgICAgICAgICBSRUdSRVNTSU9OUz10cnVlCi0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBESVNfTVNHPSIgJERJU19NU0cgIgotICAgICAgICAgICAgICAgIGZpCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgRElTX01TRz0iKCRESVNfTVNHKSIKLSAgICAgICAgICAgICAgICBESUZGX0RJUz0KLSAgICAgICAgICAgIGZpCi0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIERJU19NU0c9IiAgICAgICAgICAiCi0gICAgICAgICAgICBESUZGX0RJUz0KLSAgICAgICAgICAgIGlmIFtbICIkS05PV05fREVQX0RJRkYgJEFDQ0VQVEVEX0RFUF9ESUZGIiA9ICoiJEJJTl9GSUxFIiogXV07IHRoZW4KLSAgICAgICAgICAgICAgICBESVNfTVNHPSIgICAgISAgICAiCi0gICAgICAgICAgICBmaQotICAgICAgICBmaQotICAgIGZpCi0KLQotICAgIGlmIFsgLW4gIiRESUZGX0JJTiRESUZGX1NJWkUkRElGRl9TWU0kRElGRl9ERVAkRElGRl9FTEYkRElGRl9ESVMiIF0gfHwgWyAtbiAiJFZFUkJPU0UiIF07IHRoZW4KLSAgICAgICAgaWYgWyAtbiAiJEJJTl9NU0ciIF07IHRoZW4gZWNobyAtbiAiJEJJTl9NU0c6IjsgZmkKLSAgICAgICAgaWYgWyAtbiAiJFNJWkVfTVNHIiBdOyB0aGVuIGVjaG8gLW4gIiRTSVpFX01TRzoiOyBmaQotICAgICAgICBpZiBbIC1uICIkU1lNX01TRyIgXTsgdGhlbiBlY2hvIC1uICIkU1lNX01TRzoiOyBmaQotICAgICAgICBpZiBbIC1uICIkREVQX01TRyIgXTsgdGhlbiBlY2hvIC1uICIkREVQX01TRzoiOyBmaQotICAgICAgICBpZiBbIC1uICIkRUxGX01TRyIgXTsgdGhlbiBlY2hvIC1uICIkRUxGX01TRzoiOyBmaQotICAgICAgICBpZiBbIC1uICIkRElTX01TRyIgXTsgdGhlbiBlY2hvIC1uICIkRElTX01TRzoiOyBmaQotICAgICAgICBlY2hvICIgJEJJTl9GSUxFIgotICAgICAgICBpZiBbICIkU0hPV19ESUZGUyIgPSAidHJ1ZSIgXTsgdGhlbgotICAgICAgICAgICAgaWYgWyAtcyAiJFdPUktfRklMRV9CQVNFLnN5bWJvbHMuZGlmZiIgXTsgdGhlbgotICAgICAgICAgICAgICAgIGVjaG8gIlN5bWJvbHMgZGlmZjoiCi0gICAgICAgICAgICAgICAgJENBVCAkV09SS19GSUxFX0JBU0Uuc3ltYm9scy5kaWZmCi0gICAgICAgICAgICBmaQotICAgICAgICAgICAgaWYgWyAtcyAiJFdPUktfRklMRV9CQVNFLmRlcHMuZGlmZiIgXTsgdGhlbgotICAgICAgICAgICAgICAgIGVjaG8gIkRlcHMgZGlmZjoiCi0gICAgICAgICAgICAgICAgJENBVCAkV09SS19GSUxFX0JBU0UuZGVwcy5kaWZmCi0gICAgICAgICAgICBmaQotICAgICAgICAgICAgaWYgWyAtcyAiJFdPUktfRklMRV9CQVNFLnJlYWRlbGYuZGlmZiIgXTsgdGhlbgotICAgICAgICAgICAgICAgIGVjaG8gIlJlYWRlbGYgZGlmZjoiCi0gICAgICAgICAgICAgICAgJENBVCAkV09SS19GSUxFX0JBU0UucmVhZGVsZi5kaWZmCi0gICAgICAgICAgICBmaQotICAgICAgICAgICAgaWYgWyAtcyAiJFdPUktfRklMRV9CQVNFLmRpcy5kaWZmIiBdOyB0aGVuCi0gICAgICAgICAgICAgICAgZWNobyAiRGlzYXNzZW1ibHkgZGlmZjoiCi0gICAgICAgICAgICAgICAgJENBVCAkV09SS19GSUxFX0JBU0UuZGlzLmRpZmYKLSAgICAgICAgICAgIGZpCi0gICAgICAgIGZpCi0gICAgICAgIHJldHVybiAxCi0gICAgZmkKLSAgICByZXR1cm4gMAotfQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgUHJpbnQgYmluYXJ5IGRpZmYgaGVhZGVyCi0KLXByaW50X2JpbmFyeV9kaWZmX2hlYWRlcigpIHsKLSAgICBpZiBbIC16ICIkU0tJUF9CSU5fRElGRiIgXTsgdGhlbiBlY2hvIC1uICIgQmluYXJ5IDoiOyBmaQotICAgIGlmIFsgLXogIiRTS0lQX1NJWkVfRElGRiIgXTsgdGhlbiBlY2hvIC1uICIgICBTaXplICAgIDoiOyBmaQotICAgIGlmIFsgLXogIiRTS0lQX1NZTV9ESUZGIiBdOyB0aGVuIGVjaG8gLW4gIiBTeW1ib2xzIDoiOyBmaQotICAgIGlmIFsgLXogIiRTS0lQX0RFUF9ESUZGIiBdOyB0aGVuIGVjaG8gLW4gIiAgRGVwcyAgIDoiOyBmaQotICAgIGlmIFsgLXogIiRTS0lQX0VMRl9ESUZGIiBdOyB0aGVuIGVjaG8gLW4gIiBSZWFkZWxmICA6IjsgZmkKLSAgICBpZiBbIC16ICIkU0tJUF9ESVNfRElGRiIgXTsgdGhlbiBlY2hvIC1uICIgRGlzYXNzICAgOiI7IGZpCi0gICAgZWNobwotfQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29tcGFyZSBhbGwgbGlicmFyaWVzCi0KLWNvbXBhcmVfYWxsX2xpYnMoKSB7Ci0gICAgVEhJU19ESVI9JDEKLSAgICBPVEhFUl9ESVI9JDIKLSAgICBXT1JLX0RJUj0kMwotCi0gICAgTElCUz0kKGNkICRUSElTX0RJUiAmJiAkRklORCAuIC1uYW1lICdsaWIqLnNvJyAtbyAtbmFtZSAnKi5keWxpYicgLW8gLW5hbWUgJyouZGxsJyB8ICRTT1JUIHwgJEZJTFRFUikKLQotICAgIGlmIFsgLW4gIiRMSUJTIiBdOyB0aGVuCi0gICAgICAgIGVjaG8gTGlicmFyaWVzLi4uCi0gICAgICAgIHByaW50X2JpbmFyeV9kaWZmX2hlYWRlcgotICAgICAgICBmb3IgbCBpbiAkTElCUzsgZG8KLSAgICAgICAgICAgIGlmIFsgLWYgIiRPVEhFUl9ESVIvJGwiIF07IHRoZW4KLSAgICAgICAgICAgICAgICBjb21wYXJlX2Jpbl9maWxlICRUSElTX0RJUiAkT1RIRVJfRElSICRXT1JLX0RJUiAkbAotICAgICAgICAgICAgICAgIGlmIFsgIiQ/IiAhPSAiMCIgXTsgdGhlbgotICAgICAgICAgICAgICAgICAgICByZXR1cm5fdmFsdWU9MQotICAgICAgICAgICAgICAgIGZpCi0gICAgICAgICAgICBmaQotICAgICAgICBkb25lCi0gICAgZmkKLQotICAgIHJldHVybiAkcmV0dXJuX3ZhbHVlCi19Ci0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb21wYXJlIGFsbCBleGVjdXRhYmxlcwotCi1jb21wYXJlX2FsbF9leGVjcygpIHsKLSAgICBUSElTX0RJUj0kMQotICAgIE9USEVSX0RJUj0kMgotICAgIFdPUktfRElSPSQzCi0KLSAgICBpZiBbICIkT1BFTkpES19UQVJHRVRfT1MiID0gIndpbmRvd3MiIF07IHRoZW4KLSAgICAgICAgRVhFQ1M9JChjZCAkVEhJU19ESVIgJiYgJEZJTkQgLiAtdHlwZSBmIC1uYW1lICcqLmV4ZScgfCAkU09SVCB8ICRGSUxURVIpCi0gICAgZWxzZQotICAgICAgICBFWEVDUz0kKGNkICRUSElTX0RJUiAmJiAkRklORCAuIC1uYW1lIGRiIC1wcnVuZSAtbyAtdHlwZSBmIC1wZXJtIC0xMDAgXCEgXCggLW5hbWUgJyouc28nIC1vIC1uYW1lICcqLmR5bGliJyAtbyAtbmFtZSAnKi5kbGwnIC1vIC1uYW1lICcqLmNnaScgXCkgfCAkU09SVCB8ICRGSUxURVIpCi0gICAgZmkKLQotICAgIGlmIFsgLW4gIiRFWEVDUyIgXTsgdGhlbgotICAgICAgICBlY2hvIEV4ZWN1dGFibGVzLi4uCi0gICAgICAgIHByaW50X2JpbmFyeV9kaWZmX2hlYWRlcgotICAgICAgICBmb3IgZSBpbiAkRVhFQ1M7IGRvCi0gICAgICAgICAgICBpZiBbIC1mICIkT1RIRVJfRElSLyRlIiBdOyB0aGVuCi0gICAgICAgICAgICAgICAgY29tcGFyZV9iaW5fZmlsZSAkVEhJU19ESVIgJE9USEVSX0RJUiAkV09SS19ESVIgJGUKLSAgICAgICAgICAgICAgICBpZiBbICIkPyIgIT0gIjAiIF07IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuX3ZhbHVlPTEKLSAgICAgICAgICAgICAgICBmaQotICAgICAgICAgICAgZmkKLSAgICAgICAgZG9uZQotICAgIGZpCi0KLSAgICByZXR1cm4gJHJldHVybl92YWx1ZQotfQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgSW5pdGlhdGUgY29uZmlndXJhdGlvbgotCi1DT01QQVJFX1JPT1Q9L3RtcC9jaW1hZ2VzLiRVU0VSCi0kTUtESVIgLXAgJENPTVBBUkVfUk9PVAogaWYgWyAiJE9QRU5KREtfVEFSR0VUX09TIiA9ICJ3aW5kb3dzIiBdOyB0aGVuCi0gICAgaWYgWyAiJCh1bmFtZSAtbykiID0gIkN5Z3dpbiIgXTsgdGhlbgotCUNPTVBBUkVfUk9PVD0kKGN5Z3BhdGggLW1zYSAkQ09NUEFSRV9ST09UKQotICAgIGZpCisgICAgUEFUSD0iQFZTX1BBVEhAIgogZmkKIAotVEhJUz0iJCggY2QgIiQoIGRpcm5hbWUgIiQwIiApIiAmJiBwd2QgKSIKLWVjaG8gIiRUSElTIgotVEhJU19TQ1JJUFQ9IiQwIgotCi1pZiBbIC16ICIkMSIgXSB8fCBbICIkMSIgPSAiLWgiIF0gfHwgWyAiJDEiID0gIi0/IiBdIHx8IFsgIiQxIiA9ICIvaCIgXSB8fCBbICIkMSIgPSAiLz8iIF0gfHwgWyAiJDEiID0gIi1oZWxwIiBdIHx8IFsgIiQxIiA9ICItLWhlbHAiIF07IHRoZW4KLSAgICBlY2hvICJiYXNoIC4vY29tcGFyZS5zaCBbT1BUSU9OU10gW0ZJTFRFUl0iCi0gICAgZWNobyAiIgotICAgIGVjaG8gIi1hbGwgICAgICAgICAgICAgICAgQ29tcGFyZSBhbGwgZmlsZXMgaW4gYWxsIGtub3duIHdheXMiCi0gICAgZWNobyAiLW5hbWVzICAgICAgICAgICAgICBDb21wYXJlIHRoZSBmaWxlIG5hbWVzIGFuZCBkaXJlY3Rvcnkgc3RydWN0dXJlIgotICAgIGVjaG8gIi1wZXJtcyAgICAgICAgICAgICAgQ29tcGFyZSB0aGUgcGVybWlzc2lvbiBiaXRzIG9uIGFsbCBmaWxlcyBhbmQgZGlyZWN0b3JpZXMiCi0gICAgZWNobyAiLXR5cGVzICAgICAgICAgICAgICBDb21wYXJlIHRoZSBvdXRwdXQgb2YgdGhlIGZpbGUgY29tbWFuZCBvbiBhbGwgZmlsZXMiCi0gICAgZWNobyAiLWdlbmVyYWwgICAgICAgICAgICBDb21wYXJlIHRoZSBmaWxlcyBub3QgY29udmVyZWQgYnkgdGhlIHNwZWNpYWxpemVkIGNvbXBhcmlzb25zIgotICAgIGVjaG8gIi16aXBzICAgICAgICAgICAgICAgQ29tcGFyZSB0aGUgY29udGVudHMgb2YgYWxsIHppcCBmaWxlcyIKLSAgICBlY2hvICItamFycyAgICAgICAgICAgICAgIENvbXBhcmUgdGhlIGNvbnRlbnRzIG9mIGFsbCBqYXIgZmlsZXMiCi0gICAgZWNobyAiLWxpYnMgICAgICAgICAgICAgICBDb21wYXJlIGFsbCBuYXRpdmUgbGlicmFyaWVzIgotICAgIGVjaG8gIi1leGVjcyAgICAgICAgICAgICAgQ29tcGFyZSBhbGwgZXhlY3V0YWJsZXMiCi0gICAgZWNobyAiLXYgICAgICAgICAgICAgICAgICBWZXJib3NlIG91dHB1dCwgZG9lcyBub3QgaGlkZSBrbm93biBkaWZmZXJlbmNlcyIKLSAgICBlY2hvICItdnYgICAgICAgICAgICAgICAgIE1vcmUgdmVyYm9zZSBvdXRwdXQsIHNob3dzIGRpZmYgb3V0cHV0IG9mIGFsbCBjb21wYXJpc29ucyIKLSAgICBlY2hvICItbyBbT1RIRVJdICAgICAgICAgIENvbXBhcmUgd2l0aCBidWlsZCBpbiBvdGhlciBkaXJlY3RvcnkuIFdpbGwgZGVmYXVsdCB0byB0aGUgb2xkIGJ1aWxkIGRpcmVjdG9yeSIKLSAgICBlY2hvICIiCi0gICAgZWNobyAiW0ZJTFRFUl0gICAgICAgICAgICBMaXN0IGZpbGVuYW1lcyBpbiB0aGUgaW1hZ2UgdG8gY29tcGFyZSwgd29ya3MgZm9yIGphcnMsIHppcHMsIGxpYnMgYW5kIGV4ZWNzIgotICAgIGVjaG8gIkV4YW1wbGU6IgotICAgIGVjaG8gImJhc2ggLi9jb21tb24vYmluL2NvbXBhcmVpbWFnZXMuc2ggQ29kZVBvaW50SU0uamFyIgotICAgIGV4aXQgMTAKLWZpCi0KLUNNUF9OQU1FUz1mYWxzZQotQ01QX1BFUk1TPWZhbHNlCi1DTVBfVFlQRVM9ZmFsc2UKLUNNUF9HRU5FUkFMPWZhbHNlCi1DTVBfWklQUz1mYWxzZQotQ01QX0pBUlM9ZmFsc2UKLUNNUF9MSUJTPWZhbHNlCi1DTVBfRVhFQ1M9ZmFsc2UKLQotd2hpbGUgWyAtbiAiJDEiIF07IGRvCi0gICAgY2FzZSAiJDEiIGluCi0gICAgICAgIC12KQotICAgICAgICAgICAgVkVSQk9TRT10cnVlCi0gICAgICAgICAgICA7OwotICAgICAgICAtdnYpCi0gICAgICAgICAgICBWRVJCT1NFPXRydWUKLSAgICAgICAgICAgIFNIT1dfRElGRlM9dHJ1ZQotICAgICAgICAgICAgOzsKLSAgICAgICAgLW8pCi0gICAgICAgICAgICBPVEhFUj0kMgotICAgICAgICAgICAgc2hpZnQKLSAgICAgICAgICAgIDs7Ci0gICAgICAgIC1hbGwpCi0gICAgICAgICAgICBDTVBfTkFNRVM9dHJ1ZQotICAgICAgICAgICAgaWYgWyAiJE9QRU5KREtfVEFSR0VUX09TIiAhPSAid2luZG93cyIgXTsgdGhlbgotICAgICAgICAgICAgICAgIENNUF9QRVJNUz10cnVlCi0gICAgICAgICAgICBmaQotICAgICAgICAgICAgQ01QX1RZUEVTPXRydWUKLSAgICAgICAgICAgIENNUF9HRU5FUkFMPXRydWUKLSAgICAgICAgICAgIENNUF9aSVBTPXRydWUKLSAgICAgICAgICAgIENNUF9KQVJTPXRydWUKLSAgICAgICAgICAgIENNUF9MSUJTPXRydWUKLSAgICAgICAgICAgIENNUF9FWEVDUz10cnVlCi0gICAgICAgICAgICA7OwotICAgICAgICAtbmFtZXMpCi0gICAgICAgICAgICBDTVBfTkFNRVM9dHJ1ZQotICAgICAgICAgICAgOzsKLSAgICAgICAgLXBlcm1zKQotICAgICAgICAgICAgQ01QX1BFUk1TPXRydWUKLSAgICAgICAgICAgIDs7Ci0gICAgICAgIC10eXBlcykKLSAgICAgICAgICAgIENNUF9UWVBFUz10cnVlCi0gICAgICAgICAgICA7OwotICAgICAgICAtZ2VuZXJhbCkKLSAgICAgICAgICAgIENNUF9HRU5FUkFMPXRydWUKLSAgICAgICAgICAgIDs7Ci0gICAgICAgIC16aXBzKQotICAgICAgICAgICAgQ01QX1pJUFM9dHJ1ZQotICAgICAgICAgICAgOzsKLSAgICAgICAgLWphcnMpCi0gICAgICAgICAgICBDTVBfSkFSUz10cnVlCi0gICAgICAgICAgICA7OwotICAgICAgICAtbGlicykKLSAgICAgICAgICAgIENNUF9MSUJTPXRydWUKLSAgICAgICAgICAgIDs7Ci0gICAgICAgIC1leGVjcykKLSAgICAgICAgICAgIENNUF9FWEVDUz10cnVlCi0gICAgICAgICAgICA7OwotICAgICAgICAqKQotICAgICAgICAgICAgQ01QX05BTUVTPWZhbHNlCi0gICAgICAgICAgICBDTVBfUEVSTVM9ZmFsc2UKLSAgICAgICAgICAgIENNUF9UWVBFUz1mYWxzZQotICAgICAgICAgICAgQ01QX1pJUFM9dHJ1ZQotICAgICAgICAgICAgQ01QX0pBUlM9dHJ1ZQotICAgICAgICAgICAgQ01QX0xJQlM9dHJ1ZQotICAgICAgICAgICAgQ01QX0VYRUNTPXRydWUKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgWyAteiAiJEZJTFRFUiIgXTsgdGhlbgotICAgICAgICAgICAgICAgIEZJTFRFUj0iJEdSRVAiCi0gICAgICAgICAgICBmaQotICAgICAgICAgICAgRklMVEVSPSIkRklMVEVSIC1lICQxIgotICAgICAgICAgICAgOzsKLSAgICBlc2FjCi0gICAgc2hpZnQKLWRvbmUKLQotaWYgWyAiJENNUF9OQU1FUyIgPSAiZmFsc2UiIF0gJiYgWyAiJENNUF9UWVBFUyIgPSAiZmFsc2UiIF0gJiYgWyAiJENNUF9QRVJNUyIgPSAiZmFsc2UiIF0gJiYgWyAiJENNUF9HRU5FUkFMIiA9ICJmYWxzZSIgXSAmJiBbICIkQ01QX1pJUFMiID0gImZhbHNlIiBdICYmIFsgIiRDTVBfSkFSUyIgPSAiZmFsc2UiIF0gJiYgWyAiJENNUF9MSUJTIiA9ICJmYWxzZSIgXSAmJiBbICIkQ01QX0VYRUNTIiA9ICJmYWxzZSIgXTsgdGhlbgotICAgIENNUF9OQU1FUz10cnVlCi0gICAgQ01QX1BFUk1TPXRydWUKLSAgICBDTVBfVFlQRVM9dHJ1ZQotICAgIENNUF9HRU5FUkFMPXRydWUKLSAgICBDTVBfWklQUz10cnVlCi0gICAgQ01QX0pBUlM9dHJ1ZQotICAgIENNUF9MSUJTPXRydWUKLSAgICBDTVBfRVhFQ1M9dHJ1ZQotZmkKLQotaWYgWyAteiAiJEZJTFRFUiIgXTsgdGhlbgotICAgIEZJTFRFUj0iJENBVCIKLWZpCi0KLWlmIFsgLXogIiRPVEhFUiIgXTsgdGhlbgotICAgIE9USEVSPSIkVEhJUy8uLi8kTEVHQUNZX0JVSUxEX0RJUiIKLSAgICBpZiBbIC1kICIkT1RIRVIiIF07IHRoZW4KLSAgICAgICAgT1RIRVI9IiQoIGNkICIkT1RIRVIiICYmIHB3ZCApIgotICAgIGVsc2UKLSAgICAgICAgZWNobyAiRGVmYXVsdCBvbGQgYnVpbGQgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0OiIKLSAgICAgICAgZWNobyAiJE9USEVSIgotICAgIGZpCi0gICAgZWNobyAiQ29tcGFyaW5nIHRvIGRlZmF1bHQgb2xkIGJ1aWxkOiIKLSAgICBlY2hvICIkT1RIRVIiCi0gICAgZWNobwotZWxzZQotICAgIGVjaG8gIkNvbXBhcmluZyB0bzoiCi0gICAgZWNobyAiJE9USEVSIgotICAgIGVjaG8KLWZpCi0KLWlmIFsgISAtZCAiJE9USEVSIiBdOyB0aGVuCi0gICAgZWNobyAiT3RoZXIgYnVpbGQgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0OiIKLSAgICBlY2hvICIkT1RIRVIiCi0gICAgZXhpdCAxOwotZmkKLQotIyBGaWd1cmUgb3V0IHRoZSBsYXlvdXQgb2YgdGhlIG5ldyBidWlsZC4gV2hpY2gga2luZHMgb2YgaW1hZ2VzIGhhdmUgYmVlbiBwcm9kdWNlZAotaWYgWyAtZCAiJFRISVMvaW1hZ2VzL2oyc2RrLWltYWdlIiBdOyB0aGVuCi0gICAgVEhJU19KMlNESz0iJFRISVMvaW1hZ2VzL2oyc2RrLWltYWdlIgotICAgIFRISVNfSjJSRT0iJFRISVMvaW1hZ2VzL2oycmUtaW1hZ2UiCi1maQotaWYgWyAtZCAiJFRISVMvaW1hZ2VzL2oyc2RrLW92ZXJsYXktaW1hZ2UiIF07IHRoZW4KLSAgICBUSElTX0oyU0RLX09WRVJMQVk9IiRUSElTL2ltYWdlcy9qMnNkay1vdmVybGF5LWltYWdlIgotICAgIFRISVNfSjJSRV9PVkVSTEFZPSIkVEhJUy9pbWFnZXMvajJyZS1vdmVybGF5LWltYWdlIgotZmkKLQotIyBGaWd1cmUgb3V0IHRoZSBsYXlvdXQgb2YgdGhlIG90aGVyIGJ1aWxkIChvbGQgb3IgbmV3LCBub3JtYWwgb3Igb3ZlcmxheSBpbWFnZSkKLWlmIFsgLWQgIiRPVEhFUi9qMnNkay1pbWFnZSIgXTsgdGhlbgotICAgIGlmIFsgLWYgIiRPVEhFUi9qMnNkay1pbWFnZS9MSUNFTlNFIiBdOyB0aGVuCi0gICAgICAgIE9USEVSX0oyU0RLPSIkT1RIRVIvajJzZGstaW1hZ2UiCi0gICAgICAgIE9USEVSX0oyUkU9IiRPVEhFUi9qMnJlLWltYWdlIgotICAgIGVsc2UKLSAgICAgICAgT1RIRVJfSjJTREtfT1ZFUkxBWT0iJE9USEVSL2oyc2RrLWltYWdlIgotICAgICAgICBPVEhFUl9KMlJFX09WRVJMQVk9IiRPVEhFUi9qMnJlLWltYWdlIgotICAgIGZpCi0KLWZpCi0KLWlmIFsgLXogIiRPVEhFUl9KMlNESyIgXSAmJiBbIC1uICIkT1RIRVJfSjJTREtfT1ZFUkxBWSIgXSAmJiBbIC16ICIkVEhJU19KMlNES19PVkVSTEFZIiBdOyB0aGVuCi0gICAgZWNobyAiT1RIRVIgYnVpbGQgb25seSBoYXMgYW4gb3ZlcmxheSBpbWFnZSB3aGlsZSB0aGlzIGJ1aWxkIGRvZXMgbm90LiBOb3RoaW5nIHRvIGNvbXBhcmUhIgorIyBOb3cgbG9jYXRlIHRoZSBtYWluIHNjcmlwdCBhbmQgcnVuIGl0LgorUkVBTF9DT01QQVJFX1NDUklQVD0iJFNSQ19ST09UL2NvbW1vbi9iaW4vY29tcGFyZS5zaCIKK2lmIFsgISAtZSAiJFJFQUxfQ09NUEFSRV9TQ1JJUFQiIF07IHRoZW4KKyAgICBlY2hvICJFcnJvcjogQ2Fubm90IGxvY2F0ZSBjb21wYXJlIHNjcmlwdCwgaXQgc2hvdWxkIGhhdmUgYmVlbiBpbiAkUkVBTF9DT01QQVJFX1NDUklQVCIKICAgICBleGl0IDEKIGZpCiAKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIERvIHRoZSB3b3JrCi0KLWlmIFsgIiRDTVBfTkFNRVMiID0gInRydWUiIF07IHRoZW4KLSAgICBpZiBbIC1uICIkVEhJU19KMlNESyIgXSAmJiBbIC1uICIkT1RIRVJfSjJTREsiIF07IHRoZW4KLSAgICAgICAgZWNobyAtbiAiSjJTREsgIgotICAgICAgICBjb21wYXJlX2RpcnMgJFRISVNfSjJTREsgJE9USEVSX0oyU0RLICRDT01QQVJFX1JPT1QvajJzZGsKLSAgICAgICAgZWNobyAtbiAiSjJSRSAgIgotICAgICAgICBjb21wYXJlX2RpcnMgJFRISVNfSjJSRSAkT1RIRVJfSjJSRSAkQ09NUEFSRV9ST09UL2oycmUKLSAgICAgICAgCi0gICAgICAgIGVjaG8gLW4gIkoyU0RLICIKLSAgICAgICAgY29tcGFyZV9maWxlcyAkVEhJU19KMlNESyAkT1RIRVJfSjJTREsgJENPTVBBUkVfUk9PVC9qMnNkawotICAgICAgICBlY2hvIC1uICJKMlJFICAiCi0gICAgICAgIGNvbXBhcmVfZmlsZXMgJFRISVNfSjJSRSAkT1RIRVJfSjJSRSAkQ09NUEFSRV9ST09UL2oycmUKLSAgICBmaQotICAgIGlmIFsgLW4gIiRUSElTX0oyU0RLX09WRVJMQVkiIF0gJiYgWyAtbiAiJE9USEVSX0oyU0RLX09WRVJMQVkiIF07IHRoZW4KLSAgICAgICAgZWNobyAtbiAiSjJTREsgT3ZlcmxheSAiCi0gICAgICAgIGNvbXBhcmVfZGlycyAkVEhJU19KMlNES19PVkVSTEFZICRPVEhFUl9KMlNES19PVkVSTEFZICRDT01QQVJFX1JPT1QvajJzZGstb3ZlcmxheQotICAgICAgICBlY2hvIC1uICJKMlJFICBPdmVybGF5ICIKLSAgICAgICAgY29tcGFyZV9kaXJzICRUSElTX0oyUkVfT1ZFUkxBWSAkT1RIRVJfSjJSRV9PVkVSTEFZICRDT01QQVJFX1JPT1QvajJyZS1vdmVybGF5Ci0gICAgICAgIAotICAgICAgICBlY2hvIC1uICJKMlNESyBPdmVybGF5ICIKLSAgICAgICAgY29tcGFyZV9maWxlcyAkVEhJU19KMlNES19PVkVSTEFZICRPVEhFUl9KMlNES19PVkVSTEFZICRDT01QQVJFX1JPT1QvajJzZGstb3ZlcmxheQotICAgICAgICBlY2hvIC1uICJKMlJFICBPdmVybGF5ICIKLSAgICAgICAgY29tcGFyZV9maWxlcyAkVEhJU19KMlJFX09WRVJMQVkgJE9USEVSX0oyUkVfT1ZFUkxBWSAkQ09NUEFSRV9ST09UL2oycmUtb3ZlcmxheQotICAgIGZpCi1maQotCi1pZiBbICIkQ01QX1BFUk1TIiA9ICJ0cnVlIiBdOyB0aGVuCi0gICAgaWYgWyAtbiAiJFRISVNfSjJTREsiIF0gJiYgWyAtbiAiJE9USEVSX0oyU0RLIiBdOyB0aGVuCi0gICAgICAgIGVjaG8gLW4gIkoyU0RLICIKLSAgICAgICAgY29tcGFyZV9wZXJtaXNzaW9ucyAkVEhJU19KMlNESyAkT1RIRVJfSjJTREsgJENPTVBBUkVfUk9PVC9qMnNkawotICAgICAgICBlY2hvIC1uICJKMlJFICAiCi0gICAgICAgIGNvbXBhcmVfcGVybWlzc2lvbnMgJFRISVNfSjJSRSAkT1RIRVJfSjJSRSAkQ09NUEFSRV9ST09UL2oycmUKLSAgICBmaQotICAgIGlmIFsgLW4gIiRUSElTX0oyU0RLX09WRVJMQVkiIF0gJiYgWyAtbiAiJE9USEVSX0oyU0RLX09WRVJMQVkiIF07IHRoZW4KLSAgICAgICAgZWNobyAtbiAiSjJTREsgT3ZlcmxheSAiCi0gICAgICAgIGNvbXBhcmVfcGVybWlzc2lvbnMgJFRISVNfSjJTREtfT1ZFUkxBWSAkT1RIRVJfSjJTREtfT1ZFUkxBWSAkQ09NUEFSRV9ST09UL2oyc2RrLW92ZXJsYXkKLSAgICAgICAgZWNobyAtbiAiSjJSRSAgT3ZlcmxheSAiCi0gICAgICAgIGNvbXBhcmVfcGVybWlzc2lvbnMgJFRISVNfSjJSRV9PVkVSTEFZICRPVEhFUl9KMlJFX09WRVJMQVkgJENPTVBBUkVfUk9PVC9qMnJlLW92ZXJsYXkKLSAgICBmaQotZmkKLQotaWYgWyAiJENNUF9UWVBFUyIgPSAidHJ1ZSIgXTsgdGhlbgotICAgIGlmIFsgLW4gIiRUSElTX0oyU0RLIiBdICYmIFsgLW4gIiRPVEhFUl9KMlNESyIgXTsgdGhlbgotICAgICAgICBlY2hvIC1uICJKMlNESyAiCi0gICAgICAgIGNvbXBhcmVfZmlsZV90eXBlcyAkVEhJU19KMlNESyAkT1RIRVJfSjJTREsgJENPTVBBUkVfUk9PVC9qMnNkawotICAgICAgICBlY2hvIC1uICJKMlJFICAiCi0gICAgICAgIGNvbXBhcmVfZmlsZV90eXBlcyAkVEhJU19KMlJFICRPVEhFUl9KMlJFICRDT01QQVJFX1JPT1QvajJyZQotICAgIGZpCi0gICAgaWYgWyAtbiAiJFRISVNfSjJTREtfT1ZFUkxBWSIgXSAmJiBbIC1uICIkT1RIRVJfSjJTREtfT1ZFUkxBWSIgXTsgdGhlbgotICAgICAgICBlY2hvIC1uICJKMlNESyBPdmVybGF5ICIKLSAgICAgICAgY29tcGFyZV9maWxlX3R5cGVzICRUSElTX0oyU0RLX09WRVJMQVkgJE9USEVSX0oyU0RLX09WRVJMQVkgJENPTVBBUkVfUk9PVC9qMnNkay1vdmVybGF5Ci0gICAgICAgIGVjaG8gLW4gIkoyUkUgIE92ZXJsYXkgIgotICAgICAgICBjb21wYXJlX2ZpbGVfdHlwZXMgJFRISVNfSjJSRV9PVkVSTEFZICRPVEhFUl9KMlJFX09WRVJMQVkgJENPTVBBUkVfUk9PVC9qMnJlLW92ZXJsYXkKLSAgICBmaQotZmkKLQotaWYgWyAiJENNUF9HRU5FUkFMIiA9ICJ0cnVlIiBdOyB0aGVuCi0gICAgaWYgWyAtbiAiJFRISVNfSjJTREsiIF0gJiYgWyAtbiAiJE9USEVSX0oyU0RLIiBdOyB0aGVuCi0gICAgICAgIGVjaG8gLW4gIkoyU0RLICIKLSAgICAgICAgY29tcGFyZV9nZW5lcmFsX2ZpbGVzICRUSElTX0oyU0RLICRPVEhFUl9KMlNESyAkQ09NUEFSRV9ST09UL2oyc2RrCi0gICAgICAgIGVjaG8gLW4gIkoyUkUgICIKLSAgICAgICAgY29tcGFyZV9nZW5lcmFsX2ZpbGVzICRUSElTX0oyUkUgJE9USEVSX0oyUkUgJENPTVBBUkVfUk9PVC9qMnJlCi0gICAgZmkKLSAgICBpZiBbIC1uICIkVEhJU19KMlNES19PVkVSTEFZIiBdICYmIFsgLW4gIiRPVEhFUl9KMlNES19PVkVSTEFZIiBdOyB0aGVuCi0gICAgICAgIGVjaG8gLW4gIkoyU0RLIE92ZXJsYXkgIgotICAgICAgICBjb21wYXJlX2dlbmVyYWxfZmlsZXMgJFRISVNfSjJTREtfT1ZFUkxBWSAkT1RIRVJfSjJTREtfT1ZFUkxBWSAkQ09NUEFSRV9ST09UL2oyc2RrLW92ZXJsYXkKLSAgICAgICAgZWNobyAtbiAiSjJSRSAgT3ZlcmxheSAiCi0gICAgICAgIGNvbXBhcmVfZ2VuZXJhbF9maWxlcyAkVEhJU19KMlJFX09WRVJMQVkgJE9USEVSX0oyUkVfT1ZFUkxBWSAkQ09NUEFSRV9ST09UL2oycmUtb3ZlcmxheQotICAgIGZpCi1maQotCi1pZiBbICIkQ01QX1pJUFMiID0gInRydWUiIF07IHRoZW4KLSAgICBpZiBbIC1uICIkVEhJU19KMlNESyIgXSAmJiBbIC1uICIkT1RIRVJfSjJTREsiIF07IHRoZW4KLSAgICAgICAgY29tcGFyZV9hbGxfemlwX2ZpbGVzICRUSElTX0oyU0RLICRPVEhFUl9KMlNESyAkQ09NUEFSRV9ST09UL2oyc2RrCi0gICAgZmkKLWZpCi0KLWlmIFsgIiRDTVBfSkFSUyIgPSAidHJ1ZSIgXTsgdGhlbgotICAgIGlmIFsgLW4gIiRUSElTX0oyU0RLIiBdICYmIFsgLW4gIiRPVEhFUl9KMlNESyIgXTsgdGhlbgotICAgICAgICBjb21wYXJlX2FsbF9qYXJfZmlsZXMgJFRISVNfSjJTREsgJE9USEVSX0oyU0RLICRDT01QQVJFX1JPT1QvajJzZGsKLSAgICBmaQotZmkKLQotaWYgWyAiJENNUF9MSUJTIiA9ICJ0cnVlIiBdOyB0aGVuCi0gICAgaWYgWyAtbiAiJFRISVNfSjJTREsiIF0gJiYgWyAtbiAiJE9USEVSX0oyU0RLIiBdOyB0aGVuCi0gICAgICAgIGNvbXBhcmVfYWxsX2xpYnMgJFRISVNfSjJTREsgJE9USEVSX0oyU0RLICRDT01QQVJFX1JPT1QvajJzZGsKLSAgICBmaQotICAgIGlmIFsgLW4gIiRUSElTX0oyU0RLX09WRVJMQVkiIF0gJiYgWyAtbiAiJE9USEVSX0oyU0RLX09WRVJMQVkiIF07IHRoZW4KLSAgICAgICAgZWNobyAtbiAiT3ZlcmxheSAiCi0gICAgICAgIGNvbXBhcmVfYWxsX2xpYnMgJFRISVNfSjJTREtfT1ZFUkxBWSAkT1RIRVJfSjJTREtfT1ZFUkxBWSAkQ09NUEFSRV9ST09UL2oyc2RrLW92ZXJsYXkKLSAgICBmaQotZmkKLQotaWYgWyAiJENNUF9FWEVDUyIgPSAidHJ1ZSIgXTsgdGhlbgotICAgIGlmIFsgLW4gIiRUSElTX0oyU0RLIiBdICYmIFsgLW4gIiRPVEhFUl9KMlNESyIgXTsgdGhlbgotICAgICAgICBjb21wYXJlX2FsbF9leGVjcyAkVEhJU19KMlNESyAkT1RIRVJfSjJTREsgJENPTVBBUkVfUk9PVC9qMnNkawotICAgIGZpCi0gICAgaWYgWyAtbiAiJFRISVNfSjJTREtfT1ZFUkxBWSIgXSAmJiBbIC1uICIkT1RIRVJfSjJTREtfT1ZFUkxBWSIgXTsgdGhlbgotICAgICAgICBlY2hvIC1uICJPdmVybGF5ICIKLSAgICAgICAgY29tcGFyZV9hbGxfZXhlY3MgJFRISVNfSjJTREtfT1ZFUkxBWSAkT1RIRVJfSjJTREtfT1ZFUkxBWSAkQ09NUEFSRV9ST09UL2oyc2RrLW92ZXJsYXkKLSAgICBmaQotZmkKLQotZWNobwotCi1pZiBbIC1uICIkUkVHUkVTU0lPTlMiIF07IHRoZW4KLSAgICBlY2hvICJSRUdSRVNTSU9OUyBGT1VORCEiCi0gICAgZWNobwotICAgIGV4aXQgMQotZWxzZQotICAgIGVjaG8gIk5vIHJlZ3Jlc3Npb25zIGZvdW5kIgotICAgIGVjaG8KLSAgICBleGl0IDAKLWZpCisuICIkUkVBTF9DT01QQVJFX1NDUklQVCIgIiRAIgpkaWZmIC0tZ2l0IGEvY29tbW9uL2F1dG9jb25mL2NvbmZpZ3VyZSBiL2NvbW1vbi9hdXRvY29uZi9jb25maWd1cmUKaW5kZXggNTAwN2E2MS4uOGU0NTYwZCAxMDA2NDQKLS0tIGEvY29tbW9uL2F1dG9jb25mL2NvbmZpZ3VyZQorKysgYi9jb21tb24vYXV0b2NvbmYvY29uZmlndXJlCkBAIC0xLDQgKzEsMzIgQEAKLSMhL2Jpbi9zaAorIyEvYmluL2Jhc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisjCisjIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIworIyBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisjIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorIyBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisjIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorIworIyBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQorIyBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CisjIHF1ZXN0aW9ucy4KKyMKKworaWYgdGVzdCAieCRCQVNIX1ZFUlNJT04iID0geDsgdGhlbgorICBlY2hvIFRoaXMgc2NyaXB0IG5lZWRzIGJhc2ggdG8gcnVuLgorICBlY2hvIEl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSB0aGUgY29uZmlndXJlIHNjcmlwdCBpbiB0aGUgc291cmNlIHRyZWUgcm9vdCBpbnN0ZWFkLgorICBleGl0IDEKK2ZpCiAKIENPTkZJR1VSRV9DT01NQU5EX0xJTkU9IiRAIgogY29uZl9zY3JpcHRfZGlyPWBkaXJuYW1lICQwYApAQCAtMTMsNTggKzQxLDgxIEBACiAjIyMgVGVzdCB0aGF0IHRoZSBnZW5lcmF0ZWQgY29uZmlndXJlIGlzIHVwLXRvLWRhdGUKICMjIwogCi0jIE9uIFNvbGFyaXMgL2Jpbi9zaCBkb2Vzbid0IHN1cHBvcnQgdGVzdCAtbnQgYnV0IC91c3IvYmluL3Rlc3QgZG9lcy4KLVRFU1Q9YHdoaWNoIHRlc3RgCi0KLXByaW50X2Vycm9yX25vdF91cF90b19kYXRlKCkgewotICBlY2hvICJFcnJvcjogVGhlIGNvbmZpZ3VyZSBzb3VyY2UgZmlsZXMgaXMgbmV3ZXIgdGhhbiB0aGUgZ2VuZXJhdGVkIGZpbGVzLiIKLSAgZWNobyAiUGxlYXNlIHJ1biAnc2ggYXV0b2dlbi5zaCcgdG8gdXBkYXRlIHRoZSBnZW5lcmF0ZWQgZmlsZXMuIgotICBlY2hvICJOb3RlIHRoYXQgdGhpcyB0ZXN0IG1pZ2h0IHRyaWdnZXIgaW5jb3JyZWN0bHkgc29tZXRpbWVzIGR1ZSB0byBoZyB0aW1lc3RhbXBzIi4KK3J1bl9hdXRvZ2VuX29yX2ZhaWwoKSB7CisgIGlmIHRlc3QgInhgd2hpY2ggYXV0b2NvbmYgMj4gL2Rldi9udWxsYCIgPSB4OyB0aGVuCisgICAgZWNobyAiQ2Fubm90IGxvY2F0ZSBhdXRvY29uZiwgdW5hYmxlIHRvIGNvcnJlY3Qgc2l0dWF0aW9uLiIKKyAgICBlY2hvICJQbGVhc2UgaW5zdGFsbCBhdXRvY29uZiBhbmQgcnVuICdiYXNoIGF1dG9nZW4uc2gnIHRvIHVwZGF0ZSB0aGUgZ2VuZXJhdGVkIGZpbGVzLiIKKyAgICBlY2hvICJFcnJvcjogQ2Fubm90IGNvbnRpbnVlIiAxPiYyCisgICAgZXhpdCAxCisgIGVsc2UKKyAgICBlY2hvICJSdW5uaW5nIGF1dG9nZW4uc2ggdG8gY29ycmVjdCB0aGUgc2l0dWF0aW9uIgorICAgIGJhc2ggJGNvbmZfc2NyaXB0X2Rpci9hdXRvZ2VuLnNoCisgIGZpCiB9CiAKLSMgTk9URTogVGhpcyB0ZXN0IGNhbiBvY2Nhc2lvbmFsbHkgZ28gd3JvbmcgZHVlIHRvIHRoZSB3YXkgbWVyY3VyaWFsIGhhbmRsZXMKLSMgdGltZXN0YW1wcy4gSXQgaXQgc3VwcG9zZWQgdG8gYWlkIGR1cmluZyBkZXZlbG9wbWVudCBvZiBidWlsZC1pbmZyYSwgYnV0IHNob3VsZAotIyBnbyBhd2F5IGJlZm9yZSBtYWtpbmcgdGhpcyB0aGUgZGVmYXVsdCBidWlsZCBzeXN0ZW0uCi1mb3IgZmlsZSBpbiBjb25maWd1cmUuYWMgKi5tNCA7IGRvCi0gIGlmICRURVNUICRmaWxlIC1udCBnZW5lcmF0ZWQtY29uZmlndXJlLnNoOyB0aGVuCi0gICAgcHJpbnRfZXJyb3Jfbm90X3VwX3RvX2RhdGUKLSAgICBleGl0IDEKLSAgZmkKLWRvbmUKLQotaWYgJFRFU1QgLWUgJGNvbmZfY3VzdG9tX3NjcmlwdF9kaXIvZ2VuZXJhdGVkLWNvbmZpZ3VyZS5zaDsgdGhlbgotICAjIElmIGN1c3RvbSBzb3VyY2UgY29uZmlndXJlIGlzIGF2YWlsYWJsZSwgbWFrZSBzdXJlIGl0IGlzIHVwLXRvLWRhdGUgYXMgd2VsbC4KLSAgZm9yIGZpbGUgaW4gY29uZmlndXJlLmFjICoubTQgJGNvbmZfY3VzdG9tX3NjcmlwdF9kaXIvKi5tNDsgZG8KLSAgICBpZiAkVEVTVCAkZmlsZSAtbnQgJGNvbmZfY3VzdG9tX3NjcmlwdF9kaXIvZ2VuZXJhdGVkLWNvbmZpZ3VyZS5zaDsgdGhlbgotICAgICAgcHJpbnRfZXJyb3Jfbm90X3VwX3RvX2RhdGUKLSAgICAgIGV4aXQgMQorY2hlY2tfYXV0b2NvbmZfdGltZXN0YW1wcygpIHsKKyAgZm9yIGZpbGUgaW4gJGNvbmZfc2NyaXB0X2Rpci9jb25maWd1cmUuYWMgJGNvbmZfc2NyaXB0X2Rpci8qLm00IDsgZG8KKyAgICBpZiB0ZXN0ICRmaWxlIC1udCAkY29uZl9zY3JpcHRfZGlyL2dlbmVyYXRlZC1jb25maWd1cmUuc2g7IHRoZW4KKyAgICAgIGVjaG8gIldhcm5pbmc6IFRoZSBjb25maWd1cmUgc291cmNlIGZpbGVzIGlzIG5ld2VyIHRoYW4gdGhlIGdlbmVyYXRlZCBmaWxlcy4iCisgICAgICBydW5fYXV0b2dlbl9vcl9mYWlsCiAgICAgZmkKICAgZG9uZQogCisgIGlmIHRlc3QgLWUgJGNvbmZfY3VzdG9tX3NjcmlwdF9kaXIvZ2VuZXJhdGVkLWNvbmZpZ3VyZS5zaDsgdGhlbgorICAgICMgSWYgY3VzdG9tIHNvdXJjZSBjb25maWd1cmUgaXMgYXZhaWxhYmxlLCBtYWtlIHN1cmUgaXQgaXMgdXAtdG8tZGF0ZSBhcyB3ZWxsLgorICAgIGZvciBmaWxlIGluICRjb25mX3NjcmlwdF9kaXIvY29uZmlndXJlLmFjICRjb25mX3NjcmlwdF9kaXIvKi5tNCAkY29uZl9jdXN0b21fc2NyaXB0X2Rpci8qLm00OyBkbworICAgICAgaWYgdGVzdCAkZmlsZSAtbnQgJGNvbmZfY3VzdG9tX3NjcmlwdF9kaXIvZ2VuZXJhdGVkLWNvbmZpZ3VyZS5zaDsgdGhlbgorICAgICAgICBlY2hvICJXYXJuaW5nOiBUaGUgY29uZmlndXJlIHNvdXJjZSBmaWxlcyBpcyBuZXdlciB0aGFuIHRoZSBjdXN0b20gZ2VuZXJhdGVkIGZpbGVzLiIKKyAgICAgICAgcnVuX2F1dG9nZW5fb3JfZmFpbAorICAgICAgZmkKKyAgICBkb25lCisgIGZpCit9CisKK2NoZWNrX2hnX3VwZGF0ZXMoKSB7CisgIGlmIHRlc3QgInhgd2hpY2ggaGcgMj4gL2Rldi9udWxsYCIgIT0geDsgdGhlbgorICAgIGNvbmZfdXBkYXRlZF9hdXRvY29uZl9maWxlcz1gY2QgJGNvbmZfc2NyaXB0X2RpciAmJiBoZyBzdGF0dXMgLW1hcmQgMj4gL2Rldi9udWxsIHwgZ3JlcCBhdXRvY29uZmAKKyAgICBpZiB0ZXN0ICJ4JGNvbmZfdXBkYXRlZF9hdXRvY29uZl9maWxlcyIgIT0geDsgdGhlbgorICAgICAgZWNobyAiQ29uZmlndXJlIHNvdXJjZSBjb2RlIGhhcyBiZWVuIHVwZGF0ZWQsIGNoZWNraW5nIHRpbWUgc3RhbXBzIgorICAgICAgY2hlY2tfYXV0b2NvbmZfdGltZXN0YW1wcworICAgIGZpCisKKyAgICBpZiB0ZXN0IC1lICRjb25mX2N1c3RvbV9zY3JpcHRfZGlyOyB0aGVuCisgICAgICAjIElmIGN1c3RvbSBzb3VyY2UgY29uZmlndXJlIGlzIGF2YWlsYWJsZSwgbWFrZSBzdXJlIGl0IGlzIHVwLXRvLWRhdGUgYXMgd2VsbC4KKyAgICAgIGNvbmZfY3VzdG9tX3VwZGF0ZWRfYXV0b2NvbmZfZmlsZXM9YGNkICRjb25mX2N1c3RvbV9zY3JpcHRfZGlyICYmIGhnIHN0YXR1cyAtbWFyZCAyPiAvZGV2L251bGwgfCBncmVwIGF1dG9jb25mYAorICAgICAgaWYgdGVzdCAieCRjb25mX2N1c3RvbV91cGRhdGVkX2F1dG9jb25mX2ZpbGVzIiAhPSB4OyB0aGVuCisgICAgICAgIGVjaG8gIkNvbmZpZ3VyZSBjdXN0b20gc291cmNlIGNvZGUgaGFzIGJlZW4gdXBkYXRlZCwgY2hlY2tpbmcgdGltZSBzdGFtcHMiCisgICAgICAgIGNoZWNrX2F1dG9jb25mX3RpbWVzdGFtcHMKKyAgICAgIGZpCisgICAgZmkKKyAgICAKKyAgZmkKK30KKworIyBDaGVjayBmb3IgbG9jYWwgY2hhbmdlcworY2hlY2tfaGdfdXBkYXRlcworCitpZiB0ZXN0IC1lICRjb25mX2N1c3RvbV9zY3JpcHRfZGlyL2dlbmVyYXRlZC1jb25maWd1cmUuc2g7IHRoZW4KICAgIyBUZXN0IGlmIG9wZW4gY29uZmlndXJlIGlzIG5ld2VyIHRoYW4gY3VzdG9tIGNvbmZpZ3VyZSwgaWYgc28sIGN1c3RvbSBuZWVkcyB0bwogICAjIGJlIHJlZ2VuZXJhdGVkLiBUaGlzIHRlc3QgaXMgcmVxdWlyZWQgdG8gZW5zdXJlIGNvbnNpc3RlbmN5IHdpdGggY3VzdG9tIHNvdXJjZS4KLSAgY29uZl9vcGVuX2NvbmZpZ3VyZV90aW1lc3RhbXA9YGdyZXAgREFURV9XSEVOX0dFTkVSQVRFRDogJGNvbmZfc2NyaXB0X2Rpci9nZW5lcmF0ZWQtY29uZmlndXJlLnNoICB8IGN1dCAtZCIgIiAtZiAzYAotICBjb25mX2N1c3RvbV9jb25maWd1cmVfdGltZXN0YW1wPWBncmVwIERBVEVfV0hFTl9HRU5FUkFURUQ6ICRjb25mX2N1c3RvbV9zY3JpcHRfZGlyL2dlbmVyYXRlZC1jb25maWd1cmUuc2ggIHwgY3V0IC1kIiAiIC1mIDNgCi0gIGlmICRURVNUICRjb25mX29wZW5fY29uZmlndXJlX3RpbWVzdGFtcCAtZ3QgJGNvbmZfY3VzdG9tX2NvbmZpZ3VyZV90aW1lc3RhbXA7IHRoZW4KLSAgICBlY2hvICJFcnJvcjogVGhlIGdlbmVyYXRlZCBjb25maWd1cmUgZmlsZSBjb250YWlucyBjaGFuZ2VzIG5vdCBwcmVzZW50IGluIHRoZSBjdXN0b20gZ2VuZXJhdGVkIGZpbGUuIgotICAgIGVjaG8gIlBsZWFzZSBydW4gJ3NoIGF1dG9nZW4uc2gnIHRvIHVwZGF0ZSB0aGUgZ2VuZXJhdGVkIGZpbGVzLiIKLSAgICBleGl0IDEKKyAgY29uZl9vcGVuX2NvbmZpZ3VyZV90aW1lc3RhbXA9YGdyZXAgREFURV9XSEVOX0dFTkVSQVRFRD0gJGNvbmZfc2NyaXB0X2Rpci9nZW5lcmF0ZWQtY29uZmlndXJlLnNoICB8IGN1dCAtZCI9IiAtZiAyYAorICBjb25mX2N1c3RvbV9jb25maWd1cmVfdGltZXN0YW1wPWBncmVwIERBVEVfV0hFTl9HRU5FUkFURUQ9ICRjb25mX2N1c3RvbV9zY3JpcHRfZGlyL2dlbmVyYXRlZC1jb25maWd1cmUuc2ggIHwgY3V0IC1kIj0iIC1mIDJgCisgIGlmIHRlc3QgJGNvbmZfb3Blbl9jb25maWd1cmVfdGltZXN0YW1wIC1ndCAkY29uZl9jdXN0b21fY29uZmlndXJlX3RpbWVzdGFtcDsgdGhlbgorICAgIGVjaG8gIldhcm5pbmc6IFRoZSBnZW5lcmF0ZWQgY29uZmlndXJlIGZpbGUgY29udGFpbnMgY2hhbmdlcyBub3QgcHJlc2VudCBpbiB0aGUgY3VzdG9tIGdlbmVyYXRlZCBmaWxlLiIKKyAgICBydW5fYXV0b2dlbl9vcl9mYWlsCiAgIGZpCi0gIAogZmkKIAogIyBBdXRvY29uZiBjYWxscyB0aGUgY29uZmlndXJlIHNjcmlwdCByZWN1cnNpdmVseSBzb21ldGltZXMuIAogIyBEb24ndCBzdGFydCBsb2dnaW5nIHR3aWNlIGluIHRoYXQgY2FzZQotaWYgJFRFU1QgIngkY29uZl9kZWJ1Z19jb25maWd1cmUiID0geHRydWU7IHRoZW4KK2lmIHRlc3QgIngkY29uZl9kZWJ1Z19jb25maWd1cmUiID0geHRydWU7IHRoZW4KICAgY29uZl9kZWJ1Z19jb25maWd1cmU9cmVjdXJzaXZlCiBmaQogIyMjCiAjIyMgUHJvY2VzcyBjb21tYW5kLWxpbmUgYXJndW1lbnRzCiAjIyMKLWNvbmZfcHJvY2Vzc2VkX2FyZ3VtZW50cz0KK2NvbmZfcHJvY2Vzc2VkX2FyZ3VtZW50cz0oKQogY29uZl9vcGVuamRrX3RhcmdldD0KLWNvbmZfZXh0cmFfY2ZsYWdzPQotY29uZl9leHRyYV9jeHhmbGFncz0KIAogZm9yIGNvbmZfb3B0aW9uCiBkbwpAQCAtNzIsMjAgKzEyMywxNCBAQAogICAtLW9wZW5qZGstdGFyZ2V0PSopCiAgICAgY29uZl9vcGVuamRrX3RhcmdldD1gZXhwciAiWCRjb25mX29wdGlvbiIgOiAnW149XSo9XCguKlwpJ2AKICAgICBjb250aW51ZSA7OwotICAtLXdpdGgtZXh0cmEtY2ZsYWdzPSopCi0gICAgY29uZl9leHRyYV9jZmxhZ3M9YGV4cHIgIlgkY29uZl9vcHRpb24iIDogJ1tePV0qPVwoLipcKSdgCi0gICAgY29udGludWUgOzsKLSAgLS13aXRoLWV4dHJhLWN4eGZsYWdzPSopCi0gICAgY29uZl9leHRyYV9jeHhmbGFncz1gZXhwciAiWCRjb25mX29wdGlvbiIgOiAnW149XSo9XCguKlwpJ2AKLSAgICBjb250aW51ZSA7OwogICAtLWRlYnVnLWNvbmZpZ3VyZSkKLSAgICBpZiAkVEVTVCAieCRjb25mX2RlYnVnX2NvbmZpZ3VyZSIgIT0geHJlY3Vyc2l2ZTsgdGhlbgorICAgIGlmIHRlc3QgIngkY29uZl9kZWJ1Z19jb25maWd1cmUiICE9IHhyZWN1cnNpdmU7IHRoZW4KICAgICAgIGNvbmZfZGVidWdfY29uZmlndXJlPXRydWUKICAgICAgIGV4cG9ydCBjb25mX2RlYnVnX2NvbmZpZ3VyZQogICAgIGZpCiAgICAgY29udGludWUgOzsKICAgKikKLSAgICBjb25mX3Byb2Nlc3NlZF9hcmd1bWVudHM9IiRjb25mX3Byb2Nlc3NlZF9hcmd1bWVudHMgJGNvbmZfb3B0aW9uIiA7OworICAgIGNvbmZfcHJvY2Vzc2VkX2FyZ3VtZW50cz0oIiR7Y29uZl9wcm9jZXNzZWRfYXJndW1lbnRzW0BdfSIgIiRjb25mX29wdGlvbiIpIDs7CiAgIGVzYWMKIAogICBjYXNlICRjb25mX29wdGlvbiBpbgpAQCAtOTUsMTEgKzE0MCwxMyBAQAogICAgIGNvbmZfbGVnYWN5X2Nyb3NzY29tcGlsZT0iJGNvbmZfbGVnYWN5X2Nyb3NzY29tcGlsZSAkY29uZl9vcHRpb24iIDs7CiAgIC1ob3N0IHwgLS1ob3N0IHwgLS1ob3MgfCAtLWhvIHwgLWhvc3Q9KiB8IC0taG9zdD0qIHwgLS1ob3M9KiB8IC0taG89KikKICAgICBjb25mX2xlZ2FjeV9jcm9zc2NvbXBpbGU9IiRjb25mX2xlZ2FjeV9jcm9zc2NvbXBpbGUgJGNvbmZfb3B0aW9uIiA7OworICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSB8IC1oKQorICAgIGNvbmZfcHJpbnRfaGVscD10cnVlIDs7CiAgIGVzYWMKIGRvbmUKIAotaWYgJFRFU1QgIngkY29uZl9sZWdhY3lfY3Jvc3Njb21waWxlIiAhPSAieCI7IHRoZW4KLSAgaWYgJFRFU1QgIngkY29uZl9vcGVuamRrX3RhcmdldCIgIT0gIngiOyB0aGVuCitpZiB0ZXN0ICJ4JGNvbmZfbGVnYWN5X2Nyb3NzY29tcGlsZSIgIT0gIngiOyB0aGVuCisgIGlmIHRlc3QgIngkY29uZl9vcGVuamRrX3RhcmdldCIgIT0gIngiOyB0aGVuCiAgICAgZWNobyAiRXJyb3I6IFNwZWNpZnlpbmcgLS1vcGVuamRrLXRhcmdldCB0b2dldGhlciB3aXRoIGF1dG9jb25mIgogICAgIGVjaG8gImxlZ2FjeSBjcm9zcy1jb21waWxhdGlvbiBmbGFncyBpcyBub3Qgc3VwcG9ydGVkLiIKICAgICBlY2hvICJZb3Ugc3BlY2lmaWVkOiAtLW9wZW5qZGstdGFyZ2V0PSRjb25mX29wZW5qZGtfdGFyZ2V0IGFuZCAkY29uZl9sZWdhY3lfY3Jvc3Njb21waWxlLiIKQEAgLTExMiwyMCArMTU5LDIwIEBACiAgIGZpCiBmaQogCi1pZiAkVEVTVCAieCRjb25mX29wZW5qZGtfdGFyZ2V0IiAhPSAieCI7IHRoZW4KK2lmIHRlc3QgIngkY29uZl9vcGVuamRrX3RhcmdldCIgIT0gIngiOyB0aGVuCiAgIGNvbmZfYnVpbGRfcGxhdGZvcm09YHNoICRjb25mX3NjcmlwdF9kaXIvYnVpbGQtYXV4L2NvbmZpZy5ndWVzc2AKLSAgY29uZl9wcm9jZXNzZWRfYXJndW1lbnRzPSItLWJ1aWxkPSRjb25mX2J1aWxkX3BsYXRmb3JtIC0taG9zdD0kY29uZl9vcGVuamRrX3RhcmdldCAtLXRhcmdldD0kY29uZl9vcGVuamRrX3RhcmdldCAkY29uZl9wcm9jZXNzZWRfYXJndW1lbnRzIgorICBjb25mX3Byb2Nlc3NlZF9hcmd1bWVudHM9KCItLWJ1aWxkPSRjb25mX2J1aWxkX3BsYXRmb3JtIiAiLS1ob3N0PSRjb25mX29wZW5qZGtfdGFyZ2V0IiAiLS10YXJnZXQ9JGNvbmZfb3Blbmpka190YXJnZXQiICIke2NvbmZfcHJvY2Vzc2VkX2FyZ3VtZW50c1tAXX0iKQogZmkKIAogIyBNYWtlIGNvbmZpZ3VyZSBleGl0IHdpdGggZXJyb3Igb24gaW52YWxpZCBvcHRpb25zIGFzIGRlZmF1bHQuCiAjIENhbiBiZSBvdmVycmlkZGVuIGJ5IC0tZGlzYWJsZS1vcHRpb24tY2hlY2tpbmcsIHNpbmNlIHdlIHByZXBlbmQgb3VyIGFyZ3VtZW50CiAjIGFuZCBsYXRlciBvcHRpb25zIG92ZXJyaWRlIGVhcmxpZXIuCi1jb25mX3Byb2Nlc3NlZF9hcmd1bWVudHM9Ii0tZW5hYmxlLW9wdGlvbi1jaGVja2luZz1mYXRhbCAkY29uZl9wcm9jZXNzZWRfYXJndW1lbnRzIgorY29uZl9wcm9jZXNzZWRfYXJndW1lbnRzPSgiLS1lbmFibGUtb3B0aW9uLWNoZWNraW5nPWZhdGFsIiAiJHtjb25mX3Byb2Nlc3NlZF9hcmd1bWVudHNbQF19IikKIAogIyMjCiAjIyMgQ2FsbCB0aGUgY29uZmlndXJlIHNjcmlwdAogIyMjCi1pZiAkVEVTVCAtZSAkY29uZl9jdXN0b21fc2NyaXB0X2Rpci9nZW5lcmF0ZWQtY29uZmlndXJlLnNoOyB0aGVuCitpZiB0ZXN0IC1lICRjb25mX2N1c3RvbV9zY3JpcHRfZGlyL2dlbmVyYXRlZC1jb25maWd1cmUuc2g7IHRoZW4KICAgIyBDdXN0b20gc291cmNlIGNvbmZpZ3VyZSBhdmFpbGFibGU7IHJ1biB0aGF0IGluc3RlYWQKICAgZWNobyBSdW5uaW5nIGN1c3RvbSBnZW5lcmF0ZWQtY29uZmlndXJlLnNoCiAgIGNvbmZfc2NyaXB0X3RvX3J1bj0kY29uZl9jdXN0b21fc2NyaXB0X2Rpci9nZW5lcmF0ZWQtY29uZmlndXJlLnNoCkBAIC0xMzQsMTcgKzE4MSwxNyBAQAogICBjb25mX3NjcmlwdF90b19ydW49JGNvbmZfc2NyaXB0X2Rpci9nZW5lcmF0ZWQtY29uZmlndXJlLnNoCiBmaSAgCiAKLWlmICRURVNUICJ4JGNvbmZfZGVidWdfY29uZmlndXJlIiAhPSB4OyB0aGVuCitpZiB0ZXN0ICJ4JGNvbmZfZGVidWdfY29uZmlndXJlIiAhPSB4OyB0aGVuCiAgICMgVHVybiBvbiBzaGVsbCBkZWJ1ZyBvdXRwdXQgaWYgcmVxdWVzdGVkIChpbml0aWFsIG9yIHJlY3Vyc2l2ZSkKICAgc2V0IC14CiBmaQogCi1pZiAkVEVTVCAieCRjb25mX2RlYnVnX2NvbmZpZ3VyZSIgPSB4dHJ1ZTsgdGhlbgoraWYgdGVzdCAieCRjb25mX2RlYnVnX2NvbmZpZ3VyZSIgPSB4dHJ1ZTsgdGhlbgogICAjIFR1cm4gb24gbG9nZ2luZywgYnV0IGRvbid0IHR1cm4gb24gdHdpY2Ugd2hlbiBjYWxsZWQgcmVjdXJzaXZlCiAgIGNvbmZfZGVidWdfbG9nZmlsZT0uL2RlYnVnLWNvbmZpZ3VyZS5sb2cKLSAgKGV4ZWMgMz4mMSA7ICguICRjb25mX3NjcmlwdF90b19ydW4gJGNvbmZfcHJvY2Vzc2VkX2FyZ3VtZW50cyAtLXdpdGgtZXh0cmEtY2ZsYWdzPSIkY29uZl9leHRyYV9jZmxhZ3MiIC0td2l0aC1leHRyYS1jeHhmbGFncz0iJGNvbmZfZXh0cmFfY3h4ZmxhZ3MiIDI+JjEgMT4mMyApIHwgdGVlIC1hICRjb25mX2RlYnVnX2xvZ2ZpbGUgMT4mMiA7IGV4ZWMgMz4mLSkgfCB0ZWUgLWEgJGNvbmZfZGVidWdfbG9nZmlsZQorICAoZXhlYyAzPiYxIDsgKC4gJGNvbmZfc2NyaXB0X3RvX3J1biAiJHtjb25mX3Byb2Nlc3NlZF9hcmd1bWVudHNbQF19IiAyPiYxIDE+JjMgKSB8IHRlZSAtYSAkY29uZl9kZWJ1Z19sb2dmaWxlIDE+JjIgOyBleGVjIDM+Ji0pIHwgdGVlIC1hICRjb25mX2RlYnVnX2xvZ2ZpbGUKIGVsc2UKLSAgLiAkY29uZl9zY3JpcHRfdG9fcnVuICRjb25mX3Byb2Nlc3NlZF9hcmd1bWVudHMgLS13aXRoLWV4dHJhLWNmbGFncz0iJGNvbmZfZXh0cmFfY2ZsYWdzIiAtLXdpdGgtZXh0cmEtY3h4ZmxhZ3M9IiRjb25mX2V4dHJhX2N4eGZsYWdzIgorICAoIC4gJGNvbmZfc2NyaXB0X3RvX3J1biAiJHtjb25mX3Byb2Nlc3NlZF9hcmd1bWVudHNbQF19IiApCiBmaQogCiBjb25mX3Jlc3VsdF9jb2RlPSQ/CkBAIC0xNTIsOCArMTk5LDI4IEBACiAjIyMgUG9zdC1wcm9jZXNzaW5nCiAjIyMKIAoraWYgdGVzdCAkY29uZl9yZXN1bHRfY29kZSAtZXEgMDsgdGhlbgorICBpZiB0ZXN0ICJ4JGNvbmZfcHJpbnRfaGVscCIgPSB4dHJ1ZTsgdGhlbgorICAgIGNhdCA8PEVPVAorCitBZGRpdGlvbmFsIChub24tYXV0b2NvbmYpIE9wZW5KREsgT3B0aW9uczoKKyAgLS1vcGVuamRrLXRhcmdldD1UQVJHRVQgY3Jvc3MtY29tcGlsZSB3aXRoIFRBUkdFVCBhcyB0YXJnZXQgcGxhdGZvcm0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGkuZS4gdGhlIG9uZSB5b3Ugd2lsbCBydW4gdGhlIHJlc3VsdGluZyBiaW5hcnkgb24pLgorICAgICAgICAgICAgICAgICAgICAgICAgICBFcXVpdmFsZW50IHRvIC0taG9zdD1UQVJHRVQgLS10YXJnZXQ9VEFSR0VUCisgICAgICAgICAgICAgICAgICAgICAgICAgIC0tYnVpbGQ9PGN1cnJlbnQgcGxhdGZvcm0+CisgIC0tZGVidWctY29uZmlndXJlICAgICAgIFJ1biB0aGUgY29uZmlndXJlIHNjcmlwdCB3aXRoIGFkZGl0aW9uYWwgZGVidWcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2luZyBlbmFibGVkLgorCitQbGVhc2UgYmUgYXdhcmUgdGhhdCwgd2hlbiBjcm9zcy1jb21waWxpbmcsIHRoZSBPcGVuSkRLIGNvbmZpZ3VyZSBzY3JpcHQgd2lsbAorZ2VuZXJhbGx5IHVzZSAndGFyZ2V0JyB3aGVyZSBhdXRvY29uZiB0cmFkaXRpb25hbGx5IHVzZXMgJ2hvc3QnLgorRU9UCisgIGZpCitlbHNlCisgIGVjaG8gY29uZmlndXJlIGV4aXRpbmcgd2l0aCByZXN1bHQgY29kZSAkY29uZl9yZXN1bHRfY29kZQorZmkKKwogIyBNb3ZlIHRoZSBsb2cgZmlsZSB0byB0aGUgb3V0cHV0IHJvb3QsIGlmIHRoaXMgd2FzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkCi1pZiAkVEVTVCAtZCAiJE9VVFBVVF9ST09UIjsgdGhlbgoraWYgdGVzdCAtZCAiJE9VVFBVVF9ST09UIjsgdGhlbgogICBtdiAtZiBjb25maWcubG9nICIkT1VUUFVUX1JPT1QiIDI+IC9kZXYvbnVsbAogZmkKIApkaWZmIC0tZ2l0IGEvY29tbW9uL2F1dG9jb25mL2NvbmZpZ3VyZS5hYyBiL2NvbW1vbi9hdXRvY29uZi9jb25maWd1cmUuYWMKaW5kZXggZDliMWY2Yi4uMGRjMjM1NSAxMDA2NDQKLS0tIGEvY29tbW9uL2F1dG9jb25mL2NvbmZpZ3VyZS5hYworKysgYi9jb21tb24vYXV0b2NvbmYvY29uZmlndXJlLmFjCkBAIC0zMSwxNiArMzEsMTQgQEAKIAogCiBBQ19QUkVSRVEoWzIuNjFdKQotQUNfSU5JVChvcGVuamRrLCBqZGs4LCBidWlsZC1kZXZAb3Blbmpkay5qYXZhLm5ldCkKLQotIyBEbyBub3QgY2hhbmdlIG9yIHJlbW92ZSB0aGUgZm9sbG93aW5nIGxpbmUsIGl0IGlzIG5lZWRlZCBmb3IgY29uc2lzdGVuY3kgY2hlY2tzOgotIyBEQVRFX1dIRU5fR0VORVJBVEVEOiBAREFURV9XSEVOX0dFTkVSQVRFREAKK0FDX0lOSVQoT3BlbkpESywgamRrOCwgYnVpbGQtZGV2QG9wZW5qZGsuamF2YS5uZXQsLGh0dHA6Ly9vcGVuamRrLmphdmEubmV0KQogCiBBQ19DT05GSUdfQVVYX0RJUihbYnVpbGQtYXV4XSkKIG00X2luY2x1ZGUoW2J1aWxkLWF1eC9wa2cubTRdKQogCiAjIEluY2x1ZGUgdGhlc2UgZmlyc3QuLi4KIG00X2luY2x1ZGUoW2Jhc2ljcy5tNF0pCittNF9pbmNsdWRlKFtiYXNpY3Nfd2luZG93cy5tNF0pCiBtNF9pbmNsdWRlKFtidWlsZGRlcHMubTRdKQogIyAuLi4gdGhlbiB0aGUgcmVzdAogbTRfaW5jbHVkZShbYm9vdC1qZGsubTRdKQpAQCAtNTEsMzUgKzQ5LDU3IEBACiBtNF9pbmNsdWRlKFtwbGF0Zm9ybS5tNF0pCiBtNF9pbmNsdWRlKFtzb3VyY2UtZGlycy5tNF0pCiBtNF9pbmNsdWRlKFt0b29sY2hhaW4ubTRdKQorbTRfaW5jbHVkZShbdG9vbGNoYWluX3dpbmRvd3MubTRdKQogCi0jIFRoaXMgbGluZSBuZWVkcyB0byBiZSBoZXJlLCB2ZXJiYXRpbSwgYWZ0ZXIgYWxsIGluY2x1ZGVzLgotIyBJdCBpcyByZXBsYWNlZCB3aXRoIGN1c3RvbSBmdW5jdGlvbmFsaXR5IHdoZW4gYnVpbGRpbmcKK0FDX0RFRlVOX09OQ0UoW0NVU1RPTV9FQVJMWV9IT09LXSkKK0FDX0RFRlVOX09OQ0UoW0NVU1RPTV9MQVRFX0hPT0tdKQorCisjIFRoaXMgbGluZSBuZWVkcyB0byBiZSBoZXJlLCB2ZXJiYXRpbSwgYWZ0ZXIgYWxsIGluY2x1ZGVzIGFuZCB0aGUgZHVtbXkgaG9vaworIyBkZWZpbml0aW9ucy4gSXQgaXMgcmVwbGFjZWQgd2l0aCBjdXN0b20gZnVuY3Rpb25hbGl0eSB3aGVuIGJ1aWxkaW5nCiAjIGN1c3RvbSBzb3VyY2VzLgotQUNfREVGVU5fT05DRShbQ1VTVE9NX0hPT0tdKQorI0NVU1RPTV9BVVRPQ09ORl9JTkNMVURFCisKKyMgRG8gbm90IGNoYW5nZSBvciByZW1vdmUgdGhlIGZvbGxvd2luZyBsaW5lLCBpdCBpcyBuZWVkZWQgZm9yIGNvbnNpc3RlbmN5IGNoZWNrczoKK0RBVEVfV0hFTl9HRU5FUkFURUQ9QERBVEVfV0hFTl9HRU5FUkFURURACiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMKLSMgSW5pdGlhbGl6YXRpb24KKyMgSW5pdGlhbGl6YXRpb24gLyBCb290LXN0cmFwcGluZworIworIyBUaGUgYm9vdHN0cmFwcGluZyBwcm9jZXNzIG5lZWRzIHRvIHNvbHZlIHRoZSAiY2hpY2tlbiBvciB0aGUgZWdnIiBwcm9ibGVtLAorIyB0aHVzIGl0IGp1bXBzIGJhY2sgYW5kIGZvcnRoLCBlYWNoIHRpbWUgZ2FpbmluZyBzb21ldGhpbmcgbmVlZGVkIGxhdGVyIG9uLgogIwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCiAjIEJhc2ljIGluaXRpYWxpemF0aW9uIHRoYXQgbXVzdCBoYXBwZW4gZmlyc3Qgb2YgYWxsCiBCQVNJQ19JTklUCitCQVNJQ19TRVRVUF9GVU5EQU1FTlRBTF9UT09MUwogCiAjIE5vdyB3ZSBjYW4gZGV0ZXJtaW5lIE9wZW5KREsgYnVpbGQgYW5kIHRhcmdldCBwbGF0Zm9ybXMuIFRoaXMgaXMgcmVxdWlyZWQgdG8KICMgaGF2ZSBlYXJseSBvbi4KIFBMQVRGT1JNX1NFVFVQX09QRU5KREtfQlVJTERfQU5EX1RBUkdFVAogCi0jIENvbnRpbnVlIHNldHRpbmcgdXAgYmFzaWMgc3R1ZmYuCisjIENvbnRpbnVlIHNldHRpbmcgdXAgYmFzaWMgc3R1ZmYuIE1vc3QgcmVtYWluaW5nIGNvZGUgcmVxdWlyZSBmdW5kYW1lbnRhbCB0b29scy4KIEJBU0lDX1NFVFVQX1BBVEhTCiBCQVNJQ19TRVRVUF9MT0dHSU5HCiAKKyMgVGhlc2UgYXJlIG5lZWRlZCB0byBiZSBhYmxlIHRvIGNyZWF0ZSBhIGNvbmZpZ3VyYXRpb24gbmFtZSAoYW5kIHRodXMgdGhlIG91dHB1dCBkaXJlY3RvcnkpCitKREtPUFRfU0VUVVBfSkRLX1ZBUklBTlQKK0pES09QVF9TRVRVUF9KVk1fVkFSSUFOVFMKK0pES09QVF9TRVRVUF9ERUJVR19MRVZFTAorCisjIFdpdGggYmFzaWMgc2V0dXAgZG9uZSwgY2FsbCB0aGUgY3VzdG9tIGVhcmx5IGhvb2suCitDVVNUT01fRUFSTFlfSE9PSworCisjIFRvIHByb3Blcmx5IGNyZWF0ZSBhIGNvbmZpZ3VyYXRpb24gbmFtZSwgd2UgbmVlZCB0byBoYXZlIHRoZSBPcGVuSkRLIHRhcmdldAorIyBhbmQgb3B0aW9ucyAodmFyaWFudHMgYW5kIGRlYnVnIGxldmVsKSBwYXJzZWQuCitCQVNJQ19TRVRVUF9PVVRQVVRfRElSCisKICMgTXVzdCBiZSBkb25lIGJlZm9yZSB3ZSBjYW4gY2FsbCBIRUxQX01TR19NSVNTSU5HX0RFUEVOREVOQ1kuCiBIRUxQX1NFVFVQX0RFUEVOREVOQ1lfSEVMUAogCi0jIFNldHVwIHNpbXBsZSB0b29scywgdGhhdCBkbyBub3QgbmVlZCBoYXZlIGNyb3NzIGNvbXBpbGF0aW9uIHN1cHBvcnQuCi0jIFdpdGhvdXQgdGhlc2UsIHdlIGNhbid0IHByb3Blcmx5IHJ1biB0aGUgcmVzdCBvZiB0aGUgY29uZmlndXJlIHNjcmlwdC4KLUJBU0lDX1NFVFVQX1RPT0xTCisjIFNldHVwIHRvb2xzIHRoYXQgcmVxdWlyZXMgbW9yZSBjb21wbGV4IGhhbmRsaW5nLCBvciB0aGF0IGlzIG5vdCBuZWVkZWQgYnkgdGhlIGNvbmZpZ3VyZSBzY3JpcHQuCitCQVNJQ19TRVRVUF9DT01QTEVYX1RPT0xTCiAKICMgQ2hlY2sgaWYgcGtnLWNvbmZpZyBpcyBhdmFpbGFibGUuCiBQS0dfUFJPR19QS0dfQ09ORklHCkBAIC0xMDAsMTYgKzEyMCw5IEBACiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKICMgV2UgbmVlZCBidWlsZCAmIHRhcmdldCBmb3IgdGhpcy4KLUpES09QVF9TRVRVUF9KREtfVkFSSUFOVAotSkRLT1BUX1NFVFVQX0pWTV9WQVJJQU5UUwotSkRLT1BUX1NFVFVQX0RFQlVHX0xFVkVMCiBKREtPUFRfU0VUVVBfSkRLX09QVElPTlMKIEpES09QVF9TRVRVUF9KREtfVkVSU0lPTl9OVU1CRVJTCiAKLSMgVG8gcHJvcGVybHkgY3JlYXRlIGEgY29uZmlndXJhdGlvbiBuYW1lLCB3ZSBuZWVkIHRvIGhhdmUgdGhlIE9wZW5KREsgdGFyZ2V0Ci0jIGFuZCBvcHRpb25zICh2YXJpYW50cyBhbmQgZGVidWcgbGV2ZWwpIHBhcnNlZC4KLUJBU0lDX1NFVFVQX09VVFBVVF9ESVIKLQogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIwogIyBTZXR1cCBCb290SkRLLCB1c2VkIHRvIGJvb3RzdHJhcCB0aGUgYnVpbGQuCkBAIC0xMzcsNyArMTUwLDYgQEAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAogVE9PTENIQUlOX1NFVFVQX1NZU1JPT1RfQU5EX09VVF9PUFRJT05TCi1UT09MQ0hBSU5fU0VUVVBfVklTVUFMX1NUVURJT19FTlYKICMgTG9jYXRlIHRoZSBhY3R1YWwgdG9vbHMKIFRPT0xDSEFJTl9TRVRVUF9QQVRIUwogCkBAIC0xNTIsMTAgKzE2NCw2IEBACiBUT09MQ0hBSU5fU0VUVVBfQ09NUElMRVJfRkxBR1NfRk9SX09QVElNSVpBVElPTgogVE9PTENIQUlOX1NFVFVQX0NPTVBJTEVSX0ZMQUdTX0ZPUl9KREsKIAotIyBBZnRlciB3ZSBoYXZlIHRvb2xjaGFpbiwgd2UgY2FuIGNvbXBpbGUgdGhlIHVuY3lnZHJpdmUgaGVscGVyCi1CQVNJQ19DT01QSUxFX1VOQ1lHRFJJVkUKLQotCiAjIFNldHVwIGRlYnVnIHN5bWJvbHMgKG5lZWQgb2JqY29weSBmcm9tIHRoZSB0b29sY2hhaW4gZm9yIHRoYXQpCiBKREtPUFRfU0VUVVBfREVCVUdfU1lNQk9MUwogCkBAIC0xNzMsNiArMTgxLDkgQEAKIExJQl9TRVRVUF9NSVNDX0xJQlMKIExJQl9TRVRVUF9TVEFUSUNfTElOS19MSUJTVERDUFAKIAorIyBBZnRlciB3ZSBoYXZlIHRvb2xjaGFpbiBhbmQgdGhlIHBhdGhzIHRvIGFsbCBsaWJyYXJpZXMgKG5lZWRlZCBieSBtc3lzKSwgd2UgY2FuIGNvbXBpbGUgdGhlIGZpeHBhdGggaGVscGVyCitCQVNJQ19DT01QSUxFX0ZJWFBBVEgKKwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIwogIyBXZSBuZWVkIHRvIGRvIHNvbWUgZmluYWwgdHdlYWtpbmcsIHdoZW4gZXZlcnl0aGluZyBlbHNlIGlzIGRvbmUuCkBAIC0yMTAsNyArMjIxLDcgQEAKIEJBU0lDX1RFU1RfVVNBQklMSVRZX0lTU1VFUwogCiAjIEF0IHRoZSBlbmQsIGNhbGwgdGhlIGN1c3RvbSBob29rLiAoRHVtbXkgbWFjcm8gaWYgbm8gY3VzdG9tIHNvdXJjZXMgYXZhaWxhYmxlKQotQ1VTVE9NX0hPT0sKK0NVU1RPTV9MQVRFX0hPT0sKIAogIyBXZSdyZSBtZXNzaW5nIGEgYml0IHdpdGggaW50ZXJuYWwgYXV0b2NvbmYgdmFyaWFibGVzIHRvIHB1dCB0aGUgY29uZmlnLnN0YXR1cwogIyBpbiB0aGUgb3V0cHV0IGRpcmVjdG9yeSBpbnN0ZWFkIG9mIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KZGlmZiAtLWdpdCBhL2NvbW1vbi9hdXRvY29uZi9nZW5lcmF0ZWQtY29uZmlndXJlLnNoIGIvY29tbW9uL2F1dG9jb25mL2dlbmVyYXRlZC1jb25maWd1cmUuc2gKaW5kZXggOWRjNDU2MS4uOTQyN2I3OSAxMDA2NDQKLS0tIGEvY29tbW9uL2F1dG9jb25mL2dlbmVyYXRlZC1jb25maWd1cmUuc2gKKysrIGIvY29tbW9uL2F1dG9jb25mL2dlbmVyYXRlZC1jb25maWd1cmUuc2gKQEAgLTEsNiArMSw2IEBACiAjISAvYmluL3NoCiAjIEd1ZXNzIHZhbHVlcyBmb3Igc3lzdGVtLWRlcGVuZGVudCB2YXJpYWJsZXMgYW5kIGNyZWF0ZSBNYWtlZmlsZXMuCi0jIEdlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42NyBmb3Igb3BlbmpkayBqZGs4LgorIyBHZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjcgZm9yIE9wZW5KREsgamRrOC4KICMKICMgUmVwb3J0IGJ1Z3MgdG8gPGJ1aWxkLWRldkBvcGVuamRrLmphdmEubmV0Pi4KICMKQEAgLTU1MCwxMiArNTUwLDEyIEBACiBNQUtFRkxBR1M9CiAKICMgSWRlbnRpdHkgb2YgdGhpcyBwYWNrYWdlLgotUEFDS0FHRV9OQU1FPSdvcGVuamRrJworUEFDS0FHRV9OQU1FPSdPcGVuSkRLJwogUEFDS0FHRV9UQVJOQU1FPSdvcGVuamRrJwogUEFDS0FHRV9WRVJTSU9OPSdqZGs4JwotUEFDS0FHRV9TVFJJTkc9J29wZW5qZGsgamRrOCcKK1BBQ0tBR0VfU1RSSU5HPSdPcGVuSkRLIGpkazgnCiBQQUNLQUdFX0JVR1JFUE9SVD0nYnVpbGQtZGV2QG9wZW5qZGsuamF2YS5uZXQnCi1QQUNLQUdFX1VSTD0nJworUEFDS0FHRV9VUkw9J2h0dHA6Ly9vcGVuamRrLmphdmEubmV0JwogCiAjIEZhY3RvcmluZyBkZWZhdWx0IGhlYWRlcnMgZm9yIG1vc3QgdGVzdHMuCiBhY19pbmNsdWRlc19kZWZhdWx0PSJcCkBAIC02MDYsNyArNjA2LDkgQEAKIE5VTV9DT1JFUwogU0FMSUJfTkFNRQogSE9UU1BPVF9NQUtFX0FSR1MKK0ZJWFBBVEgKIExJQkNYWAorU1RBVElDX0NYWF9TRVRUSU5HCiBMSUJETAogTElCTQogTElCWklQX0NBTl9VU0VfTU1BUApAQCAtNjE5LDcgKzYyMSw2IEBACiBVU0lOR19TWVNURU1fRlRfTElCCiBGUkVFVFlQRTJfTElCUwogRlJFRVRZUEUyX0NGTEFHUwotQ1VQU19MSUJTCiBDVVBTX0NGTEFHUwogT1BFTldJTl9IT01FCiBYX0VYVFJBX0xJQlMKQEAgLTYzMSw3ICs2MzIsNiBAQAogQ0ZMQUdTX0RFQlVHX1NZTUJPTFMKIFpJUF9ERUJVR0lORk9fRklMRVMKIEVOQUJMRV9ERUJVR19TWU1CT0xTCi1VTkNZR0RSSVZFCiBMREZMQUdTX0NYWF9KREsKIExERkxBR1NfSkRLRVhFX1NVRkZJWAogTERGTEFHU19KREtMSUJfU1VGRklYCkBAIC02NzIsNiArNjcyLDkgQEAKIFNIQVJFRF9MSUJSQVJZCiBPQkpfU1VGRklYCiBMSVBPCithY19jdF9PQkpEVU1QCitPQkpEVU1QCithY19jdF9PQkpDT1BZCiBPQkpDT1BZCiBNQ1MKIFNUUklQCkBAIC02ODMsOSArNjg2LDEzIEBACiBSQ19GTEFHUwogRFVNUEJJTgogV0lOQVIKK0hPVFNQT1RfUkMKK0hPVFNQT1RfTVQKIFJDCiBNVAogV0lOTEQKK0hPVFNQT1RfTEQKK0hPVFNQT1RfQ1hYCiBBUkZMQUdTCiBBUgogTERFWEVDWFgKQEAgLTY5OCw2ICs3MDUsOSBAQAogYWNfY3RfQ1hYCiBDWFhGTEFHUwogQ1hYCithY19jdF9QUk9QRVJfQ09NUElMRVJfQ1hYCitQUk9QRVJfQ09NUElMRVJfQ1hYCitQT1RFTlRJQUxfQ1hYCiBPQkpFWFQKIEVYRUVYVAogYWNfY3RfQ0MKQEAgLTcwNSwxMiArNzE1LDE2IEBACiBMREZMQUdTCiBDRkxBR1MKIENDCithY19jdF9QUk9QRVJfQ09NUElMRVJfQ0MKK1BST1BFUl9DT01QSUxFUl9DQworUE9URU5USUFMX0NDCiBCVUlMRF9MRAogQlVJTERfQ1hYCiBCVUlMRF9DQwotTVNWQ1IxMDBETEwKLUNIRUNLX0ZPUl9WQ0lOU1RBTExESVIKLVNFVFVQREVWRU5WCitNU1ZDUl9ETEwKK1ZTX1BBVEgKK1ZTX0xJQgorVlNfSU5DTFVERQogQ1lHV0lOX0xJTksKIEFSX09VVF9PUFRJT04KIExEX09VVF9PUFRJT04KQEAgLTczMywxNSArNzQ3LDE0IEBACiBCT09UX1JUSkFSCiBKQVZBX0NIRUNLCiBKQVZBQ19DSEVDSwotT1VUUFVUX1JPT1QKLUNPTkZfTkFNRQotU1BFQwogQ09PS0VEX0JVSUxEX05VTUJFUgogRlVMTF9WRVJTSU9OCiBSRUxFQVNFCiBKREtfVkVSU0lPTgogUlVOVElNRV9OQU1FCiBDT1BZUklHSFRfWUVBUgorTUFDT1NYX0JVTkRMRV9JRF9CQVNFCitNQUNPU1hfQlVORExFX05BTUVfQkFTRQogQ09NUEFOWV9OQU1FCiBKREtfUkNfUExBVEZPUk1fTkFNRQogUFJPRFVDVF9TVUZGSVgKQEAgLTc1MywxNiArNzY2LDM5IEBACiBKREtfTUlDUk9fVkVSU0lPTgogSkRLX01JTk9SX1ZFUlNJT04KIEpES19NQUpPUl9WRVJTSU9OCi1FTkFCTEVfSkZSCiBDT01QUkVTU19KQVJTCitVTkxJTUlURURfQ1JZUFRPCiBDQUNFUlRTX0ZJTEUKIFRFU1RfSU5fQlVJTEQKLURJU0FCTEVfTklNQlVTCiBCVUlMRF9IRUFETEVTUwogU1VQUE9SVF9IRUFERlVMCiBTVVBQT1JUX0hFQURMRVNTCi1KSUdTQVcKIFNFVF9PUEVOSkRLCitCREVQU19GVFAKK0JERVBTX1VOWklQCitPU19WRVJTSU9OX01JQ1JPCitPU19WRVJTSU9OX01JTk9SCitPU19WRVJTSU9OX01BSk9SCitQS0dfQ09ORklHCitDT01NCitUSU1FCitTVEFUCitIRworUkVBREVMRgorT1RPT0wKK0xERAorWklQCitVTlpJUAorRklORF9ERUxFVEUKK01BS0UKK0NIRUNLX1RPT0xTRElSX01BS0UKK0NIRUNLX1RPT0xTRElSX0dNQUtFCitDSEVDS19NQUtFCitDSEVDS19HTUFLRQorUEtHSEFORExFUgorT1VUUFVUX1JPT1QKK0NPTkZfTkFNRQorU1BFQwogQlVJTERfVkFSSUFOVF9SRUxFQVNFCiBERUJVR19DTEFTU0ZJTEVTCiBGQVNUREVCVUcKQEAgLTc3Niw3MiArODEyLDEyIEBACiBKVk1fVkFSSUFOVF9TRVJWRVIKIEpWTV9WQVJJQU5UUwogSkRLX1ZBUklBTlQKLUJERVBTX0ZUUAotQkRFUFNfVU5aSVAKLU9TX1ZFUlNJT05fTUlDUk8KLU9TX1ZFUlNJT05fTUlOT1IKLU9TX1ZFUlNJT05fTUFKT1IKLVBLR19DT05GSUcKLUhHCi1PQkpEVU1QCi1SRUFERUxGCi1PVE9PTAotTERECi1USEVQV0RDTUQKLUZJTkRfREVMRVRFCi1STQotTUFLRQotQ0hFQ0tfVE9PTFNESVJfTUFLRQotQ0hFQ0tfVE9PTFNESVJfR01BS0UKLUNIRUNLX01BS0UKLUNIRUNLX0dNQUtFCi1OQVdLCi1TRUQKLUZHUkVQCi1FR1JFUAotR1JFUAotQVdLCi1aSVAKLVhBUkdTCi1XQwotVU5aSVAKLVVOSVEKLVRSCi1UT1VDSAotVEVFCi1UQVIKLVRBSUwKLVNPUlQKLVNICi1QUklOVEYKLU1WCi1NS0RJUgotTFMKLUxOCi1IRUFECi1GSU5ECi1GSUxFCi1FWFBSCi1FQ0hPCi1ESUZGCi1ERgotREFURQotQ1VUCi1DUElPCi1DUAotQ01QCi1DSE1PRAotQ0FUCi1CQVNFTkFNRQotUEtHSEFORExFUgogQlVJTERfTE9HX1dSQVBQRVIKIEJVSUxEX0xPR19QUkVWSU9VUwogQlVJTERfTE9HCiBTWVNfUk9PVAogUEFUSF9TRVAKLUNZR1BBVEgKIFNSQ19ST09UCi1SRUFETElOSwogREVGSU5FX0NST1NTX0NPTVBJTEVfQVJDSAogTFA2NAogT1BFTkpES19UQVJHRVRfT1NfQVBJX0RJUgpAQCAtODU0LDE4ICs4MzAsMTggQEAKIFJFUVVJUkVEX09TX1ZFUlNJT04KIFJFUVVJUkVEX09TX05BTUUKIENPTVBJTEVfVFlQRQotT1BFTkpES19CVUlMRF9DUFVfRU5ESUFOCi1PUEVOSkRLX0JVSUxEX0NQVV9CSVRTCi1PUEVOSkRLX0JVSUxEX0NQVV9BUkNICi1PUEVOSkRLX0JVSUxEX0NQVQotT1BFTkpES19CVUlMRF9PU19BUEkKLU9QRU5KREtfQlVJTERfT1MKIE9QRU5KREtfVEFSR0VUX0NQVV9FTkRJQU4KIE9QRU5KREtfVEFSR0VUX0NQVV9CSVRTCiBPUEVOSkRLX1RBUkdFVF9DUFVfQVJDSAogT1BFTkpES19UQVJHRVRfQ1BVCiBPUEVOSkRLX1RBUkdFVF9PU19BUEkKIE9QRU5KREtfVEFSR0VUX09TCitPUEVOSkRLX0JVSUxEX0NQVV9FTkRJQU4KK09QRU5KREtfQlVJTERfQ1BVX0JJVFMKK09QRU5KREtfQlVJTERfQ1BVX0FSQ0gKK09QRU5KREtfQlVJTERfQ1BVCitPUEVOSkRLX0JVSUxEX09TX0FQSQorT1BFTkpES19CVUlMRF9PUwogT1BFTkpES19CVUlMRF9BVVRPQ09ORl9OQU1FCiBPUEVOSkRLX1RBUkdFVF9BVVRPQ09ORl9OQU1FCiB0YXJnZXRfb3MKQEAgLTg4MCw2ICs4NTYsNTEgQEAKIGJ1aWxkX3ZlbmRvcgogYnVpbGRfY3B1CiBidWlsZAorU0VURklMRQorREYKK1JFQURMSU5LCitDWUdQQVRICitOQVdLCitTRUQKK0ZHUkVQCitFR1JFUAorR1JFUAorQVdLCitYQVJHUworV0hJQ0gKK1dDCitVTklRCitVTkFNRQorVFIKK1RPVUNICitURUUKK1RBUgorVEFJTAorU09SVAorU0gKK1JNCitUSEVQV0RDTUQKK1BSSU5URgorTVYKK01LVEVNUAorTUtESVIKK0xTCitMTgorSEVBRAorRklORAorRklMRQorRVhQUgorRUNITworRElSTkFNRQorRElGRgorREFURQorQ1VUCitDUAorQ01QCitDSE1PRAorQ0FUCitCQVNICitCQVNFTkFNRQogREFURV9XSEVOX0NPTkZJR1VSRUQKIENPTkZJR1VSRV9DT01NQU5EX0xJTkUKIENVU1RPTV9NQUtFX0RJUgpAQCAtOTI5LDIzICs5NTAsMjAgQEAKIHdpdGhfc3lzX3Jvb3QKIHdpdGhfdG9vbHNfZGlyCiB3aXRoX2RldmtpdAotd2l0aF9idWlsZGRlcHNfY29uZgotd2l0aF9idWlsZGRlcHNfc2VydmVyCi13aXRoX2J1aWxkZGVwc19kaXIKLXdpdGhfYnVpbGRkZXBzX2dyb3VwCi1lbmFibGVfbGlzdF9idWlsZGRlcHMKIHdpdGhfamRrX3ZhcmlhbnQKIHdpdGhfanZtX3ZhcmlhbnRzCiBlbmFibGVfZGVidWcKIHdpdGhfZGVidWdfbGV2ZWwKK3dpdGhfY29uZl9uYW1lCit3aXRoX2J1aWxkZGVwc19jb25mCit3aXRoX2J1aWxkZGVwc19zZXJ2ZXIKK3dpdGhfYnVpbGRkZXBzX2Rpcgord2l0aF9idWlsZGRlcHNfZ3JvdXAKIGVuYWJsZV9vcGVuamRrX29ubHkKLWVuYWJsZV9qaWdzYXcKIGVuYWJsZV9oZWFkZnVsCi1lbmFibGVfbmltYnVzCiBlbmFibGVfaG90c3BvdF90ZXN0X2luX2J1aWxkCiB3aXRoX2NhY2VydHNfZmlsZQotZW5hYmxlX2pmcgotd2l0aF9jb25mX25hbWUKK2VuYWJsZV91bmxpbWl0ZWRfY3J5cHRvCiB3aXRoX2Jvb3RfamRrCiB3aXRoX2Jvb3RfamRrX2p2bWFyZ3MKIHdpdGhfYWRkX3NvdXJjZV9yb290CkBAIC05NTcsNyArOTc1LDcgQEAKIHdpdGhfb3ZlcnJpZGVfamF4d3MKIHdpdGhfb3ZlcnJpZGVfaG90c3BvdAogd2l0aF9vdmVycmlkZV9qZGsKLXdpdGhfbXN2Y3IxMDBkbGwKK3dpdGhfbXN2Y3JfZGxsCiB3aXRoX2V4dHJhX2NmbGFncwogd2l0aF9leHRyYV9jeHhmbGFncwogd2l0aF9leHRyYV9sZGZsYWdzCkBAIC05NjcsNyArOTg1LDYgQEAKIHdpdGhfeAogd2l0aF9jdXBzCiB3aXRoX2N1cHNfaW5jbHVkZQotd2l0aF9jdXBzX2xpYgogd2l0aF9mcmVldHlwZQogd2l0aF9hbHNhCiB3aXRoX2Fsc2FfaW5jbHVkZQpAQCAtMTU0Niw3ICsxNTYzLDcgQEAKICAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCiAgICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KICAgY2F0IDw8X0FDRU9GCi1cYGNvbmZpZ3VyZScgY29uZmlndXJlcyBvcGVuamRrIGpkazggdG8gYWRhcHQgdG8gbWFueSBraW5kcyBvZiBzeXN0ZW1zLgorXGBjb25maWd1cmUnIGNvbmZpZ3VyZXMgT3BlbkpESyBqZGs4IHRvIGFkYXB0IHRvIG1hbnkga2luZHMgb2Ygc3lzdGVtcy4KIAogVXNhZ2U6ICQwIFtPUFRJT05dLi4uIFtWQVI9VkFMVUVdLi4uCiAKQEAgLTE2MTYsNyArMTYzMyw3IEBACiAKIGlmIHRlc3QgLW4gIiRhY19pbml0X2hlbHAiOyB0aGVuCiAgIGNhc2UgJGFjX2luaXRfaGVscCBpbgotICAgICBzaG9ydCB8IHJlY3Vyc2l2ZSApIGVjaG8gIkNvbmZpZ3VyYXRpb24gb2Ygb3BlbmpkayBqZGs4OiI7OworICAgICBzaG9ydCB8IHJlY3Vyc2l2ZSApIGVjaG8gIkNvbmZpZ3VyYXRpb24gb2YgT3BlbkpESyBqZGs4OiI7OwogICAgZXNhYwogICBjYXQgPDxcX0FDRU9GCiAKQEAgLTE2MjQsMjQgKzE2NDEsMTkgQEAKICAgLS1kaXNhYmxlLW9wdGlvbi1jaGVja2luZyAgaWdub3JlIHVucmVjb2duaXplZCAtLWVuYWJsZS8tLXdpdGggb3B0aW9ucwogICAtLWRpc2FibGUtRkVBVFVSRSAgICAgICBkbyBub3QgaW5jbHVkZSBGRUFUVVJFIChzYW1lIGFzIC0tZW5hYmxlLUZFQVRVUkU9bm8pCiAgIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KLSAgLS1lbmFibGUtbGlzdC1idWlsZGRlcHMgbGlzdCBhbGwgYnVpbGQgZGVwZW5kZW5jaWVzIGtub3duIHRvIHRoZSBjb25maWd1cmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0CiAgIC0tZW5hYmxlLWRlYnVnICAgICAgICAgIHNldCB0aGUgZGVidWcgbGV2ZWwgdG8gZmFzdGRlYnVnIChzaG9ydGhhbmQgZm9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgIC0td2l0aC1kZWJ1Zy1sZXZlbD1mYXN0ZGVidWcpIFtkaXNhYmxlZF0KLSAgLS1lbmFibGUtb3Blbmpkay1vbmx5ICAgYnVpbGQgT3BlbkpESyByZWdhcmRsZXNzIG9mIHRoZSBwcmVzZW5jZSBvZiBjbG9zZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3NpdG9yaWVzIFtkaXNhYmxlZF0KLSAgLS1lbmFibGUtamlnc2F3ICAgICAgICAgYnVpbGQgSmlnc2F3IGltYWdlcyAobm90IHlldCBhdmFpbGFibGUpIFtkaXNhYmxlZF0KLSAgLS1kaXNhYmxlLWhlYWRmdWwgICAgICAgYnVpbGQgaGVhZGZ1bCBzdXBwb3J0IChncmFwaGljYWwgVUkgc3VwcG9ydCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW2VuYWJsZWRdCi0gIC0tZGlzYWJsZS1uaW1idXMgICAgICAgIGRpc2FibGUgTmltYnVzIEwmRiBbZW5hYmxlZF0KKyAgLS1lbmFibGUtb3Blbmpkay1vbmx5ICAgc3VwcmVzcyBidWlsZGluZyBjbG9zZWQgc291cmNlIGV2ZW4gaWYgcHJlc2VudAorICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdCisgIC0tZGlzYWJsZS1oZWFkZnVsICAgICAgIGRpc2FibGUgYnVpbGRpbmcgaGVhZGZ1bCBzdXBwb3J0IChncmFwaGljYWwgVUkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydCkgW2VuYWJsZWRdCiAgIC0tZW5hYmxlLWhvdHNwb3QtdGVzdC1pbi1idWlsZAotICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGUgcnVubmluZyBvZiBRdWVlbnMgdGVzdCBhZnRlciBIb3RzcG90IGJ1aWxkCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChub3QgeWV0IGF2YWlsYWJsZSkgW2Rpc2FibGVkXQotICAtLWVuYWJsZS1qZnIgICAgICAgICAgICBlbmFibGUgamZyIChkZWZhdWx0IGlzIG5vKQotCUVOQUJMRV9KRlI9IiR7ZW5hYmxldmFsfSIKLSAgLS1kaXNhYmxlLWRlYnVnLXN5bWJvbHMgZGlzYWJsZSBnZW5lcmF0aW9uIG9mIGRlYnVnIHN5bWJvbHMgKFtlbmFibGVkXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuIHRoZSBRdWVlbnMgdGVzdCBhZnRlciBIb3RzcG90IGJ1aWxkIFtkaXNhYmxlZF0KKyAgLS1lbmFibGUtdW5saW1pdGVkLWNyeXB0bworICAgICAgICAgICAgICAgICAgICAgICAgICBFbmFibGUgdW5saW1pdGVkIGNyeXB0byBwb2xpY3kgW2Rpc2FibGVkXQorICAtLWRpc2FibGUtZGVidWctc3ltYm9scyBkaXNhYmxlIGdlbmVyYXRpb24gb2YgZGVidWcgc3ltYm9scyBbZW5hYmxlZF0KICAgLS1kaXNhYmxlLXppcC1kZWJ1Zy1pbmZvCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGRvbid0IHppcCBkZWJ1Zy1pbmZvIGZpbGVzIChbZW5hYmxlZEA6QCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZSB6aXBwaW5nIG9mIGRlYnVnLWluZm8gZmlsZXMgW2VuYWJsZWRdCiAgIC0tZGlzYWJsZS1tYWNvc3gtcnVudGltZS1zdXBwb3J0CiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGUgdGhlIHVzZSBvZiBNYWNPU1ggSmF2YSBydW50aW1lIHN1cHBvcnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWV3b3JrIFtlbmFibGVkXQpAQCAtMTY1MSwzOCArMTY2MywzOCBAQAogICAtLWVuYWJsZS1zamF2YWMgICAgICAgICB1c2Ugc2phdmFjIHRvIGRvIGZhc3QgaW5jcmVtZW50YWwgY29tcGlsZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXQogICAtLWRpc2FibGUtcHJlY29tcGlsZWQtaGVhZGVycwotICAgICAgICAgICAgICAgICAgICAgICAgICB1c2UgcHJlY29tcGlsZWQgaGVhZGVycyB3aGVuIGNvbXBpbGluZyBDKysgW2VuYWJsZWRdCi0gIC0tZGlzYWJsZS1jY2FjaGUgICAgICAgIHVzZSBjY2FjaGUgdG8gc3BlZWQgdXAgcmVjb21waWxhdGlvbnMgW2VuYWJsZWRdCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGUgdXNpbmcgcHJlY29tcGlsZWQgaGVhZGVycyB3aGVuIGNvbXBpbGluZyBDKysKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2VuYWJsZWRdCisgIC0tZGlzYWJsZS1jY2FjaGUgICAgICAgIGRpc2FibGUgdXNpbmcgY2NhY2hlIHRvIHNwZWVkIHVwIHJlY29tcGlsYXRpb25zCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtlbmFibGVkXQogCiBPcHRpb25hbCBQYWNrYWdlczoKICAgLS13aXRoLVBBQ0tBR0VbPUFSR10gICAgdXNlIFBBQ0tBR0UgW0FSRz15ZXNdCiAgIC0td2l0aG91dC1QQUNLQUdFICAgICAgIGRvIG5vdCB1c2UgUEFDS0FHRSAoc2FtZSBhcyAtLXdpdGgtUEFDS0FHRT1ubykKLSAgLS13aXRoLWN1c3RvbS1tYWtlLWRpciAgZGlyZWN0b3J5IGNvbnRhaW5pbmcgY3VzdG9tIGJ1aWxkL21ha2UgZmlsZXMKKyAgLS13aXRoLWN1c3RvbS1tYWtlLWRpciAgdXNlIHRoaXMgZGlyZWN0b3J5IGZvciBjdXN0b20gYnVpbGQvbWFrZSBmaWxlcwogICAtLXdpdGgtdGFyZ2V0LWJpdHMgICAgICBidWlsZCAzMi1iaXQgb3IgNjQtYml0IGJpbmFyaWVzIChmb3IgcGxhdGZvcm1zIHRoYXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydCBpdCksIGUuZy4gLS13aXRoLXRhcmdldC1iaXRzPTMyIFtndWVzc2VkXQotICAtLXdpdGgtc3lzLXJvb3QgICAgICAgICBwYXNzIHRoaXMgc3lzLXJvb3QgdG8gdGhlIGNvbXBpbGVycyBhbmQgbGlua2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICh1c2VmdWwgaWYgdGhlIHN5cy1yb290IGVuY29kZWQgaW4gdGhlIGNyb3NzCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVyIHRvb2xzIGlzIGluY29ycmVjdCkKLSAgLS13aXRoLXRvb2xzLWRpciAgICAgICAgc2VhcmNoIHRoaXMgZGlyZWN0b3J5IGZvciAoY3Jvc3MtY29tcGlsaW5nKQotICAgICAgICAgICAgICAgICAgICAgICAgICBjb21waWxlcnMgYW5kIHRvb2xzCisgIC0td2l0aC1zeXMtcm9vdCAgICAgICAgIHBhc3MgdGhpcyBzeXMtcm9vdCB0byB0aGUgY29tcGlsZXJzIGFuZCB0b29scyAoZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNyb3NzLWNvbXBpbGluZykKKyAgLS13aXRoLXRvb2xzLWRpciAgICAgICAgc2VhcmNoIHRoaXMgZGlyZWN0b3J5IGZvciBjb21waWxlcnMgYW5kIHRvb2xzIChmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY3Jvc3MtY29tcGlsaW5nKQogICAtLXdpdGgtZGV2a2l0ICAgICAgICAgICB1c2UgdGhpcyBkaXJlY3RvcnkgYXMgYmFzZSBmb3IgdG9vbHMtZGlyIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgICBzeXMtcm9vdCAoZm9yIGNyb3NzLWNvbXBpbGluZykKLSAgLS13aXRoLWJ1aWxkZGVwcy1jb25mICAgdXNlIHRoaXMgY29uZmlndXJhdGlvbiBmaWxlIGZvciB0aGUgYnVpbGRkZXBzCi0gIC0td2l0aC1idWlsZGRlcHMtc2VydmVyIGRvd25sb2FkIGFuZCB1c2UgYnVpbGQgZGVwZW5kZW5jaWVzIGZyb20gdGhpcyBzZXJ2ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsLCBlLmcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC0td2l0aC1idWlsZGRlcHMtc2VydmVyPWZ0cDovL2V4YW1wbGUuY29tL2RpcgotICAtLXdpdGgtYnVpbGRkZXBzLWRpciAgICBzdG9yZSBkb3dubG9hZGVkIGJ1aWxkIGRlcGVuZGVuY2llcyBoZXJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtkL2xvY2FsaG9tZS9idWlsZGRlcHNdCi0gIC0td2l0aC1idWlsZGRlcHMtZ3JvdXAgIGNoZ3JwIHRoZSBkb3dubG9hZGVkIGJ1aWxkIGRlcGVuZGVuY2llcyB0byB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwCiAgIC0td2l0aC1qZGstdmFyaWFudCAgICAgIEpESyB2YXJpYW50IHRvIGJ1aWxkIChub3JtYWwpIFtub3JtYWxdCiAgIC0td2l0aC1qdm0tdmFyaWFudHMgICAgIEpWTSB2YXJpYW50cyAoc2VwYXJhdGVkIGJ5IGNvbW1hcykgdG8gYnVpbGQgKHNlcnZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LCBrZXJuZWwsIHplcm8sIHplcm9zaGFyaykgW3NlcnZlcl0KICAgLS13aXRoLWRlYnVnLWxldmVsICAgICAgc2V0IHRoZSBkZWJ1ZyBsZXZlbCAocmVsZWFzZSwgZmFzdGRlYnVnLCBzbG93ZGVidWcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWxlYXNlXQorICAtLXdpdGgtY29uZi1uYW1lICAgICAgICB1c2UgdGhpcyBhcyB0aGUgbmFtZSBvZiB0aGUgY29uZmlndXJhdGlvbiBbZ2VuZXJhdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gaW1wb3J0YW50IGNvbmZpZ3VyYXRpb24gb3B0aW9uc10KKyAgLS13aXRoLWJ1aWxkZGVwcy1jb25mICAgdXNlIHRoaXMgY29uZmlndXJhdGlvbiBmaWxlIGZvciB0aGUgYnVpbGRkZXBzCisgIC0td2l0aC1idWlsZGRlcHMtc2VydmVyIGRvd25sb2FkIGFuZCB1c2UgYnVpbGQgZGVwZW5kZW5jaWVzIGZyb20gdGhpcyBzZXJ2ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsCisgIC0td2l0aC1idWlsZGRlcHMtZGlyICAgIHN0b3JlIGRvd25sb2FkZWQgYnVpbGQgZGVwZW5kZW5jaWVzIGhlcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWy9sb2NhbGhvbWUvYnVpbGRkZXBzXQorICAtLXdpdGgtYnVpbGRkZXBzLWdyb3VwICBjaGdycCB0aGUgZG93bmxvYWRlZCBidWlsZCBkZXBlbmRlbmNpZXMgdG8gdGhpcworICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cAogICAtLXdpdGgtY2FjZXJ0cy1maWxlICAgICBzcGVjaWZ5IGFsdGVybmF0aXZlIGNhY2VydHMgZmlsZQotICAtLXdpdGgtY29uZi1uYW1lICAgICAgICB1c2UgdGhpcyBhcyB0aGUgbmFtZSBvZiB0aGUgY29uZmlndXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcnJpZGluZyB0aGUgZ2VuZXJhdGVkIGRlZmF1bHQKICAgLS13aXRoLWJvb3QtamRrICAgICAgICAgcGF0aCB0byBCb290IEpESyAodXNlZCB0byBib290c3RyYXAgYnVpbGQpIFtwcm9iZWRdCiAgIC0td2l0aC1ib290LWpkay1qdm1hcmdzIHNwZWNpZnkgSlZNIGFyZ3VtZW50cyB0byBiZSBwYXNzZWQgdG8gYWxsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGludm9jYXRpb25zIG9mIHRoZSBCb290IEpESywgb3ZlcnJpZGluZyB0aGUgZGVmYXVsdApAQCAtMTcwNywxNiArMTcxOSwxNSBAQAogICAtLXdpdGgtb3ZlcnJpZGUtamF4d3MgICB1c2UgdGhpcyBqYXh3cyBkaXIgZm9yIHRoZSBidWlsZAogICAtLXdpdGgtb3ZlcnJpZGUtaG90c3BvdCB1c2UgdGhpcyBob3RzcG90IGRpciBmb3IgdGhlIGJ1aWxkCiAgIC0td2l0aC1vdmVycmlkZS1qZGsgICAgIHVzZSB0aGlzIGpkayBkaXIgZm9yIHRoZSBidWlsZAotICAtLXdpdGgtbXN2Y3IxMDBkbGwgICAgICBjb3B5IHRoaXMgbXN2Y3IxMDAuZGxsIGludG8gdGhlIGJ1aWx0IEpESworICAtLXdpdGgtbXN2Y3ItZGxsICAgICAgICBjb3B5IHRoaXMgbXN2Y3IxMDAuZGxsIGludG8gdGhlIGJ1aWx0IEpESyAoV2luZG93cworICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5KSBbcHJvYmVkXQogICAtLXdpdGgtZXh0cmEtY2ZsYWdzICAgICBleHRyYSBmbGFncyB0byBiZSB1c2VkIHdoZW4gY29tcGlsaW5nIGpkayBjLWZpbGVzCiAgIC0td2l0aC1leHRyYS1jeHhmbGFncyAgIGV4dHJhIGZsYWdzIHRvIGJlIHVzZWQgd2hlbiBjb21waWxpbmcgamRrIGMrKy1maWxlcwogICAtLXdpdGgtZXh0cmEtbGRmbGFncyAgICBleHRyYSBmbGFncyB0byBiZSB1c2VkIHdoZW4gbGlua2luZyBqZGsKICAgLS13aXRoLXggICAgICAgICAgICAgICAgdXNlIHRoZSBYIFdpbmRvdyBTeXN0ZW0KICAgLS13aXRoLWN1cHMgICAgICAgICAgICAgc3BlY2lmeSBwcmVmaXggZGlyZWN0b3J5IGZvciB0aGUgY3VwcyBwYWNrYWdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChleHBlY3RpbmcgdGhlIGxpYnJhcmllcyB1bmRlciBQQVRIL2xpYiBhbmQgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnMgdW5kZXIgUEFUSC9pbmNsdWRlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAoZXhwZWN0aW5nIHRoZSBoZWFkZXJzIHVuZGVyIFBBVEgvaW5jbHVkZSkKICAgLS13aXRoLWN1cHMtaW5jbHVkZSAgICAgc3BlY2lmeSBkaXJlY3RvcnkgZm9yIHRoZSBjdXBzIGluY2x1ZGUgZmlsZXMKLSAgLS13aXRoLWN1cHMtbGliICAgICAgICAgc3BlY2lmeSBkaXJlY3RvcnkgZm9yIHRoZSBjdXBzIGxpYnJhcnkKICAgLS13aXRoLWZyZWV0eXBlICAgICAgICAgc3BlY2lmeSBwcmVmaXggZGlyZWN0b3J5IGZvciB0aGUgZnJlZXR5cGUyIHBhY2thZ2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgKGV4cGVjdGluZyB0aGUgbGlicmFyaWVzIHVuZGVyIFBBVEgvbGliIGFuZCB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycyB1bmRlciBQQVRIL2luY2x1ZGUpCkBAIC0xNzMzLDEwICsxNzQ0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgLS13aXRoLW1lbW9yeS1zaXplPTEwMjQgW3Byb2JlZF0KICAgLS13aXRoLXNqYXZhYy1zZXJ2ZXItamF2YQogICAgICAgICAgICAgICAgICAgICAgICAgICB1c2UgdGhpcyBqYXZhIGJpbmFyeSBmb3IgcnVubmluZyB0aGUgc2phdmFjCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQgc2VydmVyIGFuZCBvdGhlciBsb25nIHJ1bm5pbmcgamF2YSB0YXNrcwotICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgYnVpbGQgcHJvY2VzcywgZS5nLgotICAgICAgICAgICAgICAgICAgICAgICAgICAtLS13aXRoLXNqYXZhYy1zZXJ2ZXItamF2YT0iL29wdC9qcm9ja2l0L2Jpbi9qYXZhCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC1zZXJ2ZXIiCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQgc2VydmVyIFtCb290IEpESyBqYXZhXQogICAtLXdpdGgtc2phdmFjLXNlcnZlci1jb3JlcwogICAgICAgICAgICAgICAgICAgICAgICAgICB1c2UgYXQgbW9zdCB0aGlzIG51bWJlciBvZiBjb25jdXJyZW50IHRocmVhZHMgb24gdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNqYXZhYyBzZXJ2ZXIgW3Byb2JlZF0KQEAgLTE3NjksNiArMTc3Nyw3IEBACiBpdCB0byBmaW5kIGxpYnJhcmllcyBhbmQgcHJvZ3JhbXMgd2l0aCBub25zdGFuZGFyZCBuYW1lcy9sb2NhdGlvbnMuCiAKIFJlcG9ydCBidWdzIHRvIDxidWlsZC1kZXZAb3Blbmpkay5qYXZhLm5ldD4uCitPcGVuSkRLIGhvbWUgcGFnZTogPGh0dHA6Ly9vcGVuamRrLmphdmEubmV0Pi4KIF9BQ0VPRgogYWNfc3RhdHVzPSQ/CiBmaQpAQCAtMTgzMSw3ICsxODQwLDcgQEAKIHRlc3QgLW4gIiRhY19pbml0X2hlbHAiICYmIGV4aXQgJGFjX3N0YXR1cwogaWYgJGFjX2luaXRfdmVyc2lvbjsgdGhlbgogICBjYXQgPDxcX0FDRU9GCi1vcGVuamRrIGNvbmZpZ3VyZSBqZGs4CitPcGVuSkRLIGNvbmZpZ3VyZSBqZGs4CiBnZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjcKIAogQ29weXJpZ2h0IChDKSAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgpAQCAtMjQ4OCwxMDEgKzI0OTcsNDEgQEAKIAogfSAjIGFjX2ZuX2N4eF9jaGVja19mdW5jCiAKLSMgYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCBMSU5FTk8gSEVBREVSIFZBUiBJTkNMVURFUworIyBhY19mbl9jX2NoZWNrX2hlYWRlcl9jb21waWxlIExJTkVOTyBIRUFERVIgVkFSIElOQ0xVREVTCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgVGVzdHMgd2hldGhlciBIRUFERVIgZXhpc3RzLCBnaXZpbmcgYSB3YXJuaW5nIGlmIGl0IGNhbm5vdCBiZSBjb21waWxlZCB1c2luZwotIyB0aGUgaW5jbHVkZSBmaWxlcyBpbiBJTkNMVURFUyBhbmQgc2V0dGluZyB0aGUgY2FjaGUgdmFyaWFibGUgVkFSCi0jIGFjY29yZGluZ2x5LgotYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAoKQorIyBUZXN0cyB3aGV0aGVyIEhFQURFUiBleGlzdHMgYW5kIGNhbiBiZSBjb21waWxlZCB1c2luZyB0aGUgaW5jbHVkZSBmaWxlcyBpbgorIyBJTkNMVURFUywgc2V0dGluZyB0aGUgY2FjaGUgdmFyaWFibGUgVkFSIGFjY29yZGluZ2x5LgorYWNfZm5fY19jaGVja19oZWFkZXJfY29tcGlsZSAoKQogewogICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCi0gIGlmIGV2YWwgInRlc3QgXCJcJHskMytzZXR9XCIiID0gc2V0OyB0aGVuIDoKICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJDIiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICQyLi4uICIgPiY2OyB9CiBpZiBldmFsICJ0ZXN0IFwiXCR7JDMrc2V0fVwiIiA9IHNldDsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1maQotZXZhbCBhY19yZXM9XCQkMwotCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1Ci0kYXNfZWNobyAiJGFjX3JlcyIgPiY2OyB9CiBlbHNlCi0gICMgSXMgdGhlIGhlYWRlciBjb21waWxhYmxlPwoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyAkMiB1c2FiaWxpdHkiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgJDIgdXNhYmlsaXR5Li4uICIgPiY2OyB9Ci1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKIC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KICQ0CiAjaW5jbHVkZSA8JDI+CiBfQUNFT0YKIGlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKLSAgYWNfaGVhZGVyX2NvbXBpbGVyPXllcworICBldmFsICIkMz15ZXMiCiBlbHNlCi0gIGFjX2hlYWRlcl9jb21waWxlcj1ubworICBldmFsICIkMz1ubyIKIGZpCiBybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfaGVhZGVyX2NvbXBpbGVyIiA+JjUKLSRhc19lY2hvICIkYWNfaGVhZGVyX2NvbXBpbGVyIiA+JjY7IH0KLQotIyBJcyB0aGUgaGVhZGVyIHByZXNlbnQ/Ci17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nICQyIHByZXNlbmNlIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nICQyIHByZXNlbmNlLi4uICIgPiY2OyB9Ci1jYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0Ci0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8JDI+Ci1fQUNFT0YKLWlmIGFjX2ZuX2NfdHJ5X2NwcCAiJExJTkVOTyI7IHRoZW4gOgotICBhY19oZWFkZXJfcHJlcHJvYz15ZXMKLWVsc2UKLSAgYWNfaGVhZGVyX3ByZXByb2M9bm8KLWZpCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuaSBjb25mdGVzdC4kYWNfZXh0Ci17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2hlYWRlcl9wcmVwcm9jIiA+JjUKLSRhc19lY2hvICIkYWNfaGVhZGVyX3ByZXByb2MiID4mNjsgfQotCi0jIFNvPyAgV2hhdCBhYm91dCB0aGlzIGhlYWRlcj8KLWNhc2UgJGFjX2hlYWRlcl9jb21waWxlcjokYWNfaGVhZGVyX3ByZXByb2M6JGFjX2NfcHJlcHJvY193YXJuX2ZsYWcgaW4gIygoCi0gIHllczpubzogKQotICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogJDI6IGFjY2VwdGVkIGJ5IHRoZSBjb21waWxlciwgcmVqZWN0ZWQgYnkgdGhlIHByZXByb2Nlc3NvciEiID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJDI6IGFjY2VwdGVkIGJ5IHRoZSBjb21waWxlciwgcmVqZWN0ZWQgYnkgdGhlIHByZXByb2Nlc3NvciEiID4mMjt9Ci0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiAkMjogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkMjogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiYyO30KLSAgICA7OwotICBubzp5ZXM6KiApCi0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiAkMjogcHJlc2VudCBidXQgY2Fubm90IGJlIGNvbXBpbGVkIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICQyOiBwcmVzZW50IGJ1dCBjYW5ub3QgYmUgY29tcGlsZWQiID4mMjt9Ci0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiAkMjogICAgIGNoZWNrIGZvciBtaXNzaW5nIHByZXJlcXVpc2l0ZSBoZWFkZXJzPyIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkMjogICAgIGNoZWNrIGZvciBtaXNzaW5nIHByZXJlcXVpc2l0ZSBoZWFkZXJzPyIgPiYyO30KLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICQyOiBzZWUgdGhlIEF1dG9jb25mIGRvY3VtZW50YXRpb24iID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJDI6IHNlZSB0aGUgQXV0b2NvbmYgZG9jdW1lbnRhdGlvbiIgPiYyO30KLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICQyOiAgICAgc2VjdGlvbiBcIlByZXNlbnQgQnV0IENhbm5vdCBCZSBDb21waWxlZFwiIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICQyOiAgICAgc2VjdGlvbiBcIlByZXNlbnQgQnV0IENhbm5vdCBCZSBDb21waWxlZFwiIiA+JjI7fQotICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogJDI6IHByb2NlZWRpbmcgd2l0aCB0aGUgY29tcGlsZXIncyByZXN1bHQiID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJDI6IHByb2NlZWRpbmcgd2l0aCB0aGUgY29tcGlsZXIncyByZXN1bHQiID4mMjt9Ci0oICRhc19lY2hvICIjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwotIyMgUmVwb3J0IHRoaXMgdG8gYnVpbGQtZGV2QG9wZW5qZGsuamF2YS5uZXQgIyMKLSMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjIgotICAgICApIHwgc2VkICJzL14vJGFzX21lOiBXQVJOSU5HOiAgICAgLyIgPiYyCi0gICAgOzsKLWVzYWMKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJDIiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICQyLi4uICIgPiY2OyB9Ci1pZiBldmFsICJ0ZXN0IFwiXCR7JDMrc2V0fVwiIiA9IHNldDsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGV2YWwgIiQzPVwkYWNfaGVhZGVyX2NvbXBpbGVyIgogZmkKIGV2YWwgYWNfcmVzPVwkJDMKIAkgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19yZXMiID4mNQogJGFzX2VjaG8gIiRhY19yZXMiID4mNjsgfQotZmkKICAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyB0ZXN0ICJ4JGFzX2xpbmVub19zdGFjayIgPSB4ICYmIHsgYXNfbGluZW5vPTsgdW5zZXQgYXNfbGluZW5vO30KIAotfSAjIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwKK30gIyBhY19mbl9jX2NoZWNrX2hlYWRlcl9jb21waWxlCiBjYXQgPmNvbmZpZy5sb2cgPDxfQUNFT0YKIFRoaXMgZmlsZSBjb250YWlucyBhbnkgbWVzc2FnZXMgcHJvZHVjZWQgYnkgY29tcGlsZXJzIHdoaWxlCiBydW5uaW5nIGNvbmZpZ3VyZSwgdG8gYWlkIGRlYnVnZ2luZyBpZiBjb25maWd1cmUgbWFrZXMgYSBtaXN0YWtlLgogCi1JdCB3YXMgY3JlYXRlZCBieSBvcGVuamRrICRhc19tZSBqZGs4LCB3aGljaCB3YXMKK0l0IHdhcyBjcmVhdGVkIGJ5IE9wZW5KREsgJGFzX21lIGpkazgsIHdoaWNoIHdhcwogZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjY3LiAgSW52b2NhdGlvbiBjb21tYW5kIGxpbmUgd2FzCiAKICAgJCAkMCAkQApAQCAtMjkzMSw5ICsyODgwLDYgQEAKIAogCiAKLSMgRG8gbm90IGNoYW5nZSBvciByZW1vdmUgdGhlIGZvbGxvd2luZyBsaW5lLCBpdCBpcyBuZWVkZWQgZm9yIGNvbnNpc3RlbmN5IGNoZWNrczoKLSMgREFURV9XSEVOX0dFTkVSQVRFRDogMTM0Nzk2MzA2MAotCiBhY19hdXhfZGlyPQogZm9yIGFjX2RpciBpbiBidWlsZC1hdXggIiRzcmNkaXIiL2J1aWxkLWF1eDsgZG8KICAgaWYgdGVzdCAtZiAiJGFjX2Rpci9pbnN0YWxsLXNoIjsgdGhlbgpAQCAtMzA1MywxNCArMjk5OSw0NiBAQAogCiAKIAorIyBUaGlzIHdpbGwgbWFrZSBzdXJlIHRoZSBnaXZlbiB2YXJpYWJsZSBwb2ludHMgdG8gYSBmdWxsIGFuZCBwcm9wZXIKKyMgcGF0aC4gVGhpcyBtZWFuczoKKyMgMSkgVGhlcmUgd2lsbCBiZSBubyBzcGFjZXMgaW4gdGhlIHBhdGguIE9uIHBvc2l4IHBsYXRmb3JtcywKKyMgICAgc3BhY2VzIGluIHRoZSBwYXRoIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yLiBPbiBXaW5kb3dzLAorIyAgICB0aGUgcGF0aCB3aWxsIGJlIHJld3JpdHRlbiB1c2luZyBzaG9ydC1zdHlsZSB0byBiZSBzcGFjZS1mcmVlLgorIyAyKSBUaGUgcGF0aCB3aWxsIGJlIGFic29sdXRlLCBhbmQgaXQgd2lsbCBiZSBpbiB1bml4LXN0eWxlIChvbgorIyAgICAgY3lnd2luKS4KKyMgJDE6IFRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSB0byBmaXgKKworCisjIFRoaXMgd2lsbCBtYWtlIHN1cmUgdGhlIGdpdmVuIHZhcmlhYmxlIHBvaW50cyB0byBhIGV4ZWN1dGFibGUKKyMgd2l0aCBhIGZ1bGwgYW5kIHByb3BlciBwYXRoLiBUaGlzIG1lYW5zOgorIyAxKSBUaGVyZSB3aWxsIGJlIG5vIHNwYWNlcyBpbiB0aGUgcGF0aC4gT24gcG9zaXggcGxhdGZvcm1zLAorIyAgICBzcGFjZXMgaW4gdGhlIHBhdGggd2lsbCByZXN1bHQgaW4gYW4gZXJyb3IuIE9uIFdpbmRvd3MsCisjICAgIHRoZSBwYXRoIHdpbGwgYmUgcmV3cml0dGVuIHVzaW5nIHNob3J0LXN0eWxlIHRvIGJlIHNwYWNlLWZyZWUuCisjIDIpIFRoZSBwYXRoIHdpbGwgYmUgYWJzb2x1dGUsIGFuZCBpdCB3aWxsIGJlIGluIHVuaXgtc3R5bGUgKG9uCisjICAgICBjeWd3aW4pLgorIyBBbnkgYXJndW1lbnRzIGdpdmVuIHRvIHRoZSBleGVjdXRhYmxlIGlzIHByZXNlcnZlZC4KKyMgSWYgdGhlIGlucHV0IHZhcmlhYmxlIGRvZXMgbm90IGhhdmUgYSBkaXJlY3Rvcnkgc3BlY2lmaWNhdGlvbiwgdGhlbgorIyBpdCBuZWVkIHRvIGJlIGluIHRoZSBQQVRILgorIyAkMTogVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIGZpeAogCiAKIAogCiAKIAorIyBUZXN0IHRoYXQgdmFyaWFibGUgJDEgZGVub3RpbmcgYSBwcm9ncmFtIGlzIG5vdCBlbXB0eS4gSWYgZW1wdHksIGV4aXQgd2l0aCBhbiBlcnJvci4KKyMgJDE6IHZhcmlhYmxlIHRvIGNoZWNrCisjICQyOiBleGVjdXRhYmxlIG5hbWUgdG8gcHJpbnQgaW4gd2FybmluZyAob3B0aW9uYWwpCiAKIAorIyBEb2VzIEFDX1BBVEhfUFJPRyBmb2xsb3dlZCBieSBCQVNJQ19DSEVDS19OT05FTVBUWS4KKyMgQXJndW1lbnRzIGFzIEFDX1BBVEhfUFJPRzoKKyMgJDE6IHZhcmlhYmxlIHRvIHNldAorIyAkMjogZXhlY3V0YWJsZSBuYW1lIHRvIGxvb2sgZm9yCisKKworIyBTZXR1cCB0aGUgbW9zdCBmdW5kYW1lbnRhbCB0b29scyB0aGF0IHJlbGllcyBvbiBub3QgbXVjaCBlbHNlIHRvIHNldCB1cCwKKyMgYnV0IGlzIHVzZWQgYnkgbXVjaCBvZiB0aGUgZWFybHkgYm9vdHN0cmFwIGNvZGUuCiAKIAogIyBTZXR1cCBiYXNpYyBjb25maWd1cmF0aW9uIHBhdGhzLCBhbmQgcGxhdGZvcm0tc3BlY2lmaWMgc3R1ZmYgcmVsYXRlZCB0byBQQVRIcy4KQEAgLTMwODMsMjMgKzMwNjEsMTAgQEAKIAogCiAKLSMgVGVzdCB0aGF0IHZhcmlhYmxlICQxIGRlbm90aW5nIGEgcHJvZ3JhbSBpcyBub3QgZW1wdHkuIElmIGVtcHR5LCBleGl0IHdpdGggYW4gZXJyb3IuCi0jICQxOiB2YXJpYWJsZSB0byBjaGVjawotIyAkMjogZXhlY3V0YWJsZSBuYW1lIHRvIHByaW50IGluIHdhcm5pbmcgKG9wdGlvbmFsKQogCiAKLSMgRG9lcyBBQ19QQVRIX1BST0cgZm9sbG93ZWQgYnkgQ0hFQ0tfTk9ORU1QVFkuCi0jIEFyZ3VtZW50cyBhcyBBQ19QQVRIX1BST0c6Ci0jICQxOiB2YXJpYWJsZSB0byBzZXQKLSMgJDI6IGV4ZWN1dGFibGUgbmFtZSB0byBsb29rIGZvcgotCi0KLQotCi0KLQotCi0jIENoZWNrIGlmIGJ1aWxkIGRpcmVjdG9yeSBpcyBvbiBsb2NhbCBkaXNrLgorIyBDaGVjayBpZiBidWlsZCBkaXJlY3RvcnkgaXMgb24gbG9jYWwgZGlzay4gSWYgbm90IHBvc3NpYmxlIHRvIGRldGVybWluZSwKKyMgd2UgcHJlZmVyIHRvIGNsYWltIGl0J3MgbG9jYWwuCiAjIEFyZ3VtZW50IDE6IGRpcmVjdG9yeSB0byB0ZXN0CiAjIEFyZ3VtZW50IDI6IHdoYXQgdG8gZG8gaWYgaXQgaXMgb24gbG9jYWwgZGlzawogIyBBcmd1bWVudCAzOiB3aGF0IHRvIGRvIG90aGVyd2lzZSAocmVtb3RlIGRpc2sgb3IgZmFpbHVyZSkKQEAgLTMxMzYsNiArMzEwMSw2NCBAQAogCiAKIAorIyBIZWxwZXIgZnVuY3Rpb24gd2hpY2ggcG9zc2libHkgY29udmVydHMgYSBwYXRoIHVzaW5nIERPUy1zdHlsZSBzaG9ydCBtb2RlLgorIyBJZiBzbywgdGhlIHVwZGF0ZWQgcGF0aCBpcyBzdG9yZWQgaW4gJG5ld19wYXRoLgorIyAkMTogVGhlIHBhdGggdG8gY2hlY2sKKworCisjIEhlbHBlciBmdW5jdGlvbiB3aGljaCBwb3NzaWJseSBjb252ZXJ0cyBhIHBhdGggdXNpbmcgRE9TLXN0eWxlIHNob3J0IG1vZGUuCisjIElmIHNvLCB0aGUgdXBkYXRlZCBwYXRoIGlzIHN0b3JlZCBpbiAkbmV3X3BhdGguCisjICQxOiBUaGUgcGF0aCB0byBjaGVjaworCisKKyMgRklYTUU6IFRoZSBCQVNJQ19GSVhVUF8qX0NZR1dJTi9NU1lTIGlzIG1vc3QgbGlrZWx5IHRvbyBjb252b2x1dGVkCisjIGFuZCBjb3VsZCBwcm9iYWJseSBiZSBoZWF2aWx5IHNpbXBsaWZpZWQuIEhvd2V2ZXIsIGFsbCBjaGFuZ2VzIGluIHRoaXMKKyMgYXJlYSB0ZW5kIHRvIG5lZWQgbG90IG9mIHRlc3RpbmcgaW4gZGlmZmVyZW50IHNjZW5hcmlvcywgYW5kIGluIGxhY2sgb2YKKyMgcHJvcGVyIHVuaXQgdGVzdGluZywgY2xlYW5pbmcgdGhpcyB1cCBoYXMgbm90IGJlZW4gZGVlbWVkIHdvcnRoIHRoZSBlZmZvcnQKKyMgYXQgdGhlIG1vbWVudC4KKworCisKKworCisKKworCisKKyMgU2V0dXAgYmFzaWMgY29uZmlndXJhdGlvbiBwYXRocywgYW5kIHBsYXRmb3JtLXNwZWNpZmljIHN0dWZmIHJlbGF0ZWQgdG8gUEFUSHMuCisKKworCisKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDExLCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisjCisjIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcworIyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisjIGJ5IE9yYWNsZSBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorIworIyBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisjIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorIyBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisjIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorIworIyBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQorIyBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CisjIHF1ZXN0aW9ucy4KKyMKKworCisKKworCiAKIAogCkBAIC0zMjg3LDYgKzMzMTAsMTkgQEAKIAogCiAKK2N5Z3dpbl9oZWxwKCkgeworICAgIGNhc2UgJDEgaW4KKyAgICB1bnppcCkKKyAgICAgICAgUEtHSEFORExFUl9DT01NQU5EPSJjZCA8bG9jYXRpb24gb2YgY3lnd2luIHNldHVwLmV4ZT4gJiYgY21kIC9jIHNldHVwIC1xIC1QIHVuemlwIiA7OworICAgIHppcCkKKyAgICAgICAgUEtHSEFORExFUl9DT01NQU5EPSJjZCA8bG9jYXRpb24gb2YgY3lnd2luIHNldHVwLmV4ZT4gJiYgY21kIC9jIHNldHVwIC1xIC1QIHppcCIgOzsKKyAgICBtYWtlKQorICAgICAgICBQS0dIQU5ETEVSX0NPTU1BTkQ9ImNkIDxsb2NhdGlvbiBvZiBjeWd3aW4gc2V0dXAuZXhlPiAmJiBjbWQgL2Mgc2V0dXAgLXEgLVAgbWFrZSIgOzsKKyAgICAqICkKKyAgICAgICBicmVhayA7OworICAgIGVzYWMKK30KKwogYXB0X2hlbHAoKSB7CiAgICAgY2FzZSAkMSBpbgogICAgIGRldmtpdCkKQEAgLTM1NjEsNiArMzU5NywxNiBAQAogIyBxdWVzdGlvbnMuCiAjCiAKKyMgJDEgPSBjb21waWxlciB0byB0ZXN0IChDQyBvciBDWFgpCisjICQyID0gaHVtYW4gcmVhZGFibGUgbmFtZSBvZiBjb21waWxlciAoQyBvciBDKyspCisKKworCisKKworIyAkMSA9IGNvbXBpbGVyIHRvIHRlc3QgKENDIG9yIENYWCkKKyMgJDIgPSBodW1hbiByZWFkYWJsZSBuYW1lIG9mIGNvbXBpbGVyIChDIG9yIEMrKykKKyMgJDMgPSBsaXN0IG9mIGNvbXBpbGVyIG5hbWVzIHRvIHNlYXJjaCBmb3IKIAogCiAKQEAgLTM1NzMsMTYgKzM2MTksNjAgQEAKIAogCiAKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDExLCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisjCisjIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcworIyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisjIGJ5IE9yYWNsZSBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorIworIyBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisjIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorIyBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisjIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorIworIyBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQorIyBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CisjIHF1ZXN0aW9ucy4KKyMKIAogCi0jIFRoaXMgbGluZSBuZWVkcyB0byBiZSBoZXJlLCB2ZXJiYXRpbSwgYWZ0ZXIgYWxsIGluY2x1ZGVzLgotIyBJdCBpcyByZXBsYWNlZCB3aXRoIGN1c3RvbSBmdW5jdGlvbmFsaXR5IHdoZW4gYnVpbGRpbmcKKworCisKKworCisjIENoZWNrIGlmIHRoZSBWUyBlbnYgdmFyaWFibGVzIHdlcmUgc2V0dXAgcHJpb3IgdG8gcnVubmluZyBjb25maWd1cmUuCisjIElmIG5vdCwgdGhlbiBmaW5kIHZjdmFyc2FsbC5iYXQgYW5kIHJ1biBpdCBhdXRvbWF0aWNhbGx5LCBhbmQgaW50ZWdyYXRlCisjIHRoZSBzZXQgZW52IHZhcmlhYmxlcyBpbnRvIHRoZSBzcGVjIGZpbGUuCisKKworCisKKworCisjIFRoaXMgbGluZSBuZWVkcyB0byBiZSBoZXJlLCB2ZXJiYXRpbSwgYWZ0ZXIgYWxsIGluY2x1ZGVzIGFuZCB0aGUgZHVtbXkgaG9vaworIyBkZWZpbml0aW9ucy4gSXQgaXMgcmVwbGFjZWQgd2l0aCBjdXN0b20gZnVuY3Rpb25hbGl0eSB3aGVuIGJ1aWxkaW5nCiAjIGN1c3RvbSBzb3VyY2VzLgorI0NVU1RPTV9BVVRPQ09ORl9JTkNMVURFCiAKKyMgRG8gbm90IGNoYW5nZSBvciByZW1vdmUgdGhlIGZvbGxvd2luZyBsaW5lLCBpdCBpcyBuZWVkZWQgZm9yIGNvbnNpc3RlbmN5IGNoZWNrczoKK0RBVEVfV0hFTl9HRU5FUkFURUQ9MTM1MTUzOTMxNQogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjCi0jIEluaXRpYWxpemF0aW9uCisjIEluaXRpYWxpemF0aW9uIC8gQm9vdC1zdHJhcHBpbmcKKyMKKyMgVGhlIGJvb3RzdHJhcHBpbmcgcHJvY2VzcyBuZWVkcyB0byBzb2x2ZSB0aGUgImNoaWNrZW4gb3IgdGhlIGVnZyIgcHJvYmxlbSwKKyMgdGh1cyBpdCBqdW1wcyBiYWNrIGFuZCBmb3J0aCwgZWFjaCB0aW1lIGdhaW5pbmcgc29tZXRoaW5nIG5lZWRlZCBsYXRlciBvbi4KICMKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIApAQCAtMzU5Miw3ODkgKzM2ODIsMTIgQEAKIAogREFURV9XSEVOX0NPTkZJR1VSRUQ9YExBTkc9QyBkYXRlYAogCi0KLQotIyBOb3cgd2UgY2FuIGRldGVybWluZSBPcGVuSkRLIGJ1aWxkIGFuZCB0YXJnZXQgcGxhdGZvcm1zLiBUaGlzIGlzIHJlcXVpcmVkIHRvCi0jIGhhdmUgZWFybHkgb24uCi0jIE1ha2Ugc3VyZSB3ZSBjYW4gcnVuIGNvbmZpZy5zdWIuCi0kU0hFTEwgIiRhY19hdXhfZGlyL2NvbmZpZy5zdWIiIHN1bjQgPi9kZXYvbnVsbCAyPiYxIHx8Ci0gIGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgcnVuICRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViIiAiJExJTkVOTyIgNQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2J1aWxkK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgYWNfYnVpbGRfYWxpYXM9JGJ1aWxkX2FsaWFzCi10ZXN0ICJ4JGFjX2J1aWxkX2FsaWFzIiA9IHggJiYKLSAgYWNfYnVpbGRfYWxpYXM9YCRTSEVMTCAiJGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzImAKLXRlc3QgIngkYWNfYnVpbGRfYWxpYXMiID0geCAmJgotICBhc19mbl9lcnJvciAkPyAiY2Fubm90IGd1ZXNzIGJ1aWxkIHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiAiJExJTkVOTyIgNQotYWNfY3ZfYnVpbGQ9YCRTSEVMTCAiJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgJGFjX2J1aWxkX2FsaWFzYCB8fAotICBhc19mbl9lcnJvciAkPyAiJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIgJGFjX2J1aWxkX2FsaWFzIGZhaWxlZCIgIiRMSU5FTk8iIDUKLQotZmkKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfYnVpbGQiID4mNQotJGFzX2VjaG8gIiRhY19jdl9idWlsZCIgPiY2OyB9Ci1jYXNlICRhY19jdl9idWlsZCBpbgotKi0qLSopIDs7Ci0qKSBhc19mbl9lcnJvciAkPyAiaW52YWxpZCB2YWx1ZSBvZiBjYW5vbmljYWwgYnVpbGQiICIkTElORU5PIiA1IDs7Ci1lc2FjCi1idWlsZD0kYWNfY3ZfYnVpbGQKLWFjX3NhdmVfSUZTPSRJRlM7IElGUz0nLScKLXNldCB4ICRhY19jdl9idWlsZAotc2hpZnQKLWJ1aWxkX2NwdT0kMQotYnVpbGRfdmVuZG9yPSQyCi1zaGlmdDsgc2hpZnQKLSMgUmVtZW1iZXIsIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgSUZTIGlzIHVzZWQgdG8gY3JlYXRlICQqLAotIyBleGNlcHQgd2l0aCBvbGQgc2hlbGxzOgotYnVpbGRfb3M9JCoKLUlGUz0kYWNfc2F2ZV9JRlMKLWNhc2UgJGJ1aWxkX29zIGluICpcICopIGJ1aWxkX29zPWBlY2hvICIkYnVpbGRfb3MiIHwgc2VkICdzLyAvLS9nJ2A7OyBlc2FjCi0KLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfaG9zdCtzZXR9IiA9IHNldDsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIngkaG9zdF9hbGlhcyIgPSB4OyB0aGVuCi0gIGFjX2N2X2hvc3Q9JGFjX2N2X2J1aWxkCi1lbHNlCi0gIGFjX2N2X2hvc3Q9YCRTSEVMTCAiJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgJGhvc3RfYWxpYXNgIHx8Ci0gICAgYXNfZm5fZXJyb3IgJD8gIiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViICRob3N0X2FsaWFzIGZhaWxlZCIgIiRMSU5FTk8iIDUKLWZpCi0KLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2hvc3QiID4mNQotJGFzX2VjaG8gIiRhY19jdl9ob3N0IiA+JjY7IH0KLWNhc2UgJGFjX2N2X2hvc3QgaW4KLSotKi0qKSA7OwotKikgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgdmFsdWUgb2YgY2Fub25pY2FsIGhvc3QiICIkTElORU5PIiA1IDs7Ci1lc2FjCi1ob3N0PSRhY19jdl9ob3N0Ci1hY19zYXZlX0lGUz0kSUZTOyBJRlM9Jy0nCi1zZXQgeCAkYWNfY3ZfaG9zdAotc2hpZnQKLWhvc3RfY3B1PSQxCi1ob3N0X3ZlbmRvcj0kMgotc2hpZnQ7IHNoaWZ0Ci0jIFJlbWVtYmVyLCB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIElGUyBpcyB1c2VkIHRvIGNyZWF0ZSAkKiwKLSMgZXhjZXB0IHdpdGggb2xkIHNoZWxsczoKLWhvc3Rfb3M9JCoKLUlGUz0kYWNfc2F2ZV9JRlMKLWNhc2UgJGhvc3Rfb3MgaW4gKlwgKikgaG9zdF9vcz1gZWNobyAiJGhvc3Rfb3MiIHwgc2VkICdzLyAvLS9nJ2A7OyBlc2FjCi0KLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3RhcmdldCtzZXR9IiA9IHNldDsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIngkdGFyZ2V0X2FsaWFzIiA9IHg7IHRoZW4KLSAgYWNfY3ZfdGFyZ2V0PSRhY19jdl9ob3N0Ci1lbHNlCi0gIGFjX2N2X3RhcmdldD1gJFNIRUxMICIkYWNfYXV4X2Rpci9jb25maWcuc3ViIiAkdGFyZ2V0X2FsaWFzYCB8fAotICAgIGFzX2ZuX2Vycm9yICQ/ICIkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiAkdGFyZ2V0X2FsaWFzIGZhaWxlZCIgIiRMSU5FTk8iIDUKLWZpCi0KLWZpCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3RhcmdldCIgPiY1Ci0kYXNfZWNobyAiJGFjX2N2X3RhcmdldCIgPiY2OyB9Ci1jYXNlICRhY19jdl90YXJnZXQgaW4KLSotKi0qKSA7OwotKikgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgdmFsdWUgb2YgY2Fub25pY2FsIHRhcmdldCIgIiRMSU5FTk8iIDUgOzsKLWVzYWMKLXRhcmdldD0kYWNfY3ZfdGFyZ2V0Ci1hY19zYXZlX0lGUz0kSUZTOyBJRlM9Jy0nCi1zZXQgeCAkYWNfY3ZfdGFyZ2V0Ci1zaGlmdAotdGFyZ2V0X2NwdT0kMQotdGFyZ2V0X3ZlbmRvcj0kMgotc2hpZnQ7IHNoaWZ0Ci0jIFJlbWVtYmVyLCB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIElGUyBpcyB1c2VkIHRvIGNyZWF0ZSAkKiwKLSMgZXhjZXB0IHdpdGggb2xkIHNoZWxsczoKLXRhcmdldF9vcz0kKgotSUZTPSRhY19zYXZlX0lGUwotY2FzZSAkdGFyZ2V0X29zIGluICpcICopIHRhcmdldF9vcz1gZWNobyAiJHRhcmdldF9vcyIgfCBzZWQgJ3MvIC8tL2cnYDs7IGVzYWMKLQotCi0jIFRoZSBhbGlhc2VzIHNhdmUgdGhlIG5hbWVzIHRoZSB1c2VyIHN1cHBsaWVkLCB3aGlsZSAkaG9zdCBldGMuCi0jIHdpbGwgZ2V0IGNhbm9uaWNhbGl6ZWQuCi10ZXN0IC1uICIkdGFyZ2V0X2FsaWFzIiAmJgotICB0ZXN0ICIkcHJvZ3JhbV9wcmVmaXgkcHJvZ3JhbV9zdWZmaXgkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSBcCi0gICAgTk9ORU5PTkVzLHgseCwgJiYKLSAgcHJvZ3JhbV9wcmVmaXg9JHt0YXJnZXRfYWxpYXN9LQotCi0jIEZpZ3VyZSBvdXQgdGhlIGJ1aWxkIGFuZCB0YXJnZXQgc3lzdGVtcy4gIyBOb3RlIHRoYXQgaW4gYXV0b2NvbmYgdGVybWlub2xvZ3ksICJidWlsZCIgaXMgb2J2aW91cywgYnV0ICJ0YXJnZXQiCi0jIGlzIGNvbmZ1c2luZzsgaXQgYXNzdW1lcyB5b3UgYXJlIGNyb3NzLWNvbXBpbGluZyBhIGNyb3NzLWNvbXBpbGVyICghKSAgYW5kICJ0YXJnZXQiIGlzIHRodXMgdGhlIHRhcmdldCBvZiB0aGUKLSMgcHJvZHVjdCB5b3UncmUgYnVpbGRpbmcuIFRoZSB0YXJnZXQgb2YgdGhpcyBidWlsZCBpcyBjYWxsZWQgImhvc3QiLiBTaW5jZSB0aGlzIGlzIGNvbmZ1c2luZyB0byBtb3N0IHBlb3BsZSwgd2UKLSMgaGF2ZSBub3QgYWRvcHRlZCB0aGF0IHN5c3RlbSwgYnV0IHVzZSAidGFyZ2V0IiBhcyB0aGUgcGxhdGZvcm0gd2UgYXJlIGJ1aWxkaW5nIGZvci4gSW4gc29tZSBwbGFjZXMgdGhvdWdoIHdlIG5lZWQKLSMgdG8gdXNlIHRoZSBjb25maWd1cmUgbmFtaW5nIHN0eWxlLgotCi0KLQotCi0KLSAgICAjIENvcHkgdGhlIGF1dG9jb25mIHRyaXAvcXVhZHJ1cGxldCB2ZXJiYXRpbSB0byBPUEVOSkRLX1RBUkdFVF9BVVRPQ09ORl9OQU1FCi0gICAgIyAoZnJvbSB0aGUgYXV0b2NvbmYgImhvc3QiKSBhbmQgT1BFTkpES19CVUlMRF9BVVRPQ09ORl9OQU1FCi0gICAgIyBOb3RlIHRoYXQgd2UgbWlnaHQgbGF0ZXIgb24gcmV3cml0ZSBlLmcuIE9QRU5KREtfVEFSR0VUX0NQVSBkdWUgdG8gcmVkdWNlZCBidWlsZCwKLSAgICAjIGJ1dCB0aGlzIHdpbGwgbm90IGNoYW5nZSB0aGUgdmFsdWUgb2YgT1BFTkpES19UQVJHRVRfQVVUT0NPTkZfTkFNRS4KLSAgICBPUEVOSkRLX1RBUkdFVF9BVVRPQ09ORl9OQU1FPSIkaG9zdCIKLSAgICBPUEVOSkRLX0JVSUxEX0FVVE9DT05GX05BTUU9IiRidWlsZCIKLQotCi0KLSAgICAjIENvbnZlcnQgdGhlIGF1dG9jb25mIE9TL0NQVSB2YWx1ZSB0byBvdXIgb3duIGRhdGEsIGludG8gdGhlIFZBUl9PUy9DUFUgdmFyaWFibGVzLgotCi0gIGNhc2UgIiRob3N0X29zIiBpbgotICAgICpsaW51eCopCi0gICAgICBWQVJfT1M9bGludXgKLSAgICAgIFZBUl9PU19BUEk9cG9zaXgKLSAgICAgIDs7Ci0gICAgKnNvbGFyaXMqKQotICAgICAgVkFSX09TPXNvbGFyaXMKLSAgICAgIFZBUl9PU19BUEk9cG9zaXgKLSAgICAgIDs7Ci0gICAgKmRhcndpbiopCi0gICAgICBWQVJfT1M9bWFjb3N4Ci0gICAgICBWQVJfT1NfQVBJPXBvc2l4Ci0gICAgICA7OwotICAgICpic2QqKQotICAgICAgVkFSX09TPWJzZAotICAgICAgVkFSX09TX0FQST1wb3NpeAotICAgICAgOzsKLSAgICAqY3lnd2luKnwqd2luZG93cyopCi0gICAgICBWQVJfT1M9d2luZG93cwotICAgICAgVkFSX09TX0FQST13aW5hcGkKLSAgICAgIDs7Ci0gICAgKikKLSAgICAgIGFzX2ZuX2Vycm9yICQ/ICJ1bnN1cHBvcnRlZCBvcGVyYXRpbmcgc3lzdGVtICRob3N0X29zIiAiJExJTkVOTyIgNQotICAgICAgOzsKLSAgZXNhYwotCi0KLSAgIyBGaXJzdCBhcmd1bWVudCBpcyB0aGUgY3B1IG5hbWUgZnJvbSB0aGUgdHJpcC9xdWFkCi0gIGNhc2UgIiRob3N0X2NwdSIgaW4KLSAgICB4ODZfNjQpCi0gICAgICBWQVJfQ1BVPXg4Nl82NAotICAgICAgVkFSX0NQVV9BUkNIPXg4NgotICAgICAgVkFSX0NQVV9CSVRTPTY0Ci0gICAgICBWQVJfQ1BVX0VORElBTj1saXR0bGUKLSAgICAgIDs7Ci0gICAgaT84NikKLSAgICAgIFZBUl9DUFU9eDg2Ci0gICAgICBWQVJfQ1BVX0FSQ0g9eDg2Ci0gICAgICBWQVJfQ1BVX0JJVFM9MzIKLSAgICAgIFZBUl9DUFVfRU5ESUFOPWxpdHRsZQotICAgICAgOzsKLSAgICBhcm0qKQotICAgICAgVkFSX0NQVT1hcm0KLSAgICAgIFZBUl9DUFVfQVJDSD1hcm0KLSAgICAgIFZBUl9DUFVfQklUUz0zMgotICAgICAgVkFSX0NQVV9FTkRJQU49bGl0dGxlCi0gICAgICA7OwotICAgIHBvd2VycGMpCi0gICAgICBWQVJfQ1BVPXBwYwotICAgICAgVkFSX0NQVV9BUkNIPXBwYwotICAgICAgVkFSX0NQVV9CSVRTPTMyCi0gICAgICBWQVJfQ1BVX0VORElBTj1iaWcKLSAgICAgICA7OwotICAgIHBvd2VycGM2NCkKLSAgICAgIFZBUl9DUFU9cHBjNjQKLSAgICAgIFZBUl9DUFVfQVJDSD1wcGMKLSAgICAgIFZBUl9DUFVfQklUUz02NAotICAgICAgVkFSX0NQVV9FTkRJQU49YmlnCi0gICAgICAgOzsKLSAgICBzcGFyYykKLSAgICAgIFZBUl9DUFU9c3BhcmMKLSAgICAgIFZBUl9DUFVfQVJDSD1zcGFyYwotICAgICAgVkFSX0NQVV9CSVRTPTMyCi0gICAgICBWQVJfQ1BVX0VORElBTj1iaWcKLSAgICAgICA7OwotICAgIHNwYXJjdjkpCi0gICAgICBWQVJfQ1BVPXNwYXJjdjkKLSAgICAgIFZBUl9DUFVfQVJDSD1zcGFyYwotICAgICAgVkFSX0NQVV9CSVRTPTY0Ci0gICAgICBWQVJfQ1BVX0VORElBTj1iaWcKLSAgICAgICA7OwotICAgICopCi0gICAgICBhc19mbl9lcnJvciAkPyAidW5zdXBwb3J0ZWQgY3B1ICRob3N0X2NwdSIgIiRMSU5FTk8iIDUKLSAgICAgIDs7Ci0gIGVzYWMKLQotICAgICMgLi4uIGFuZCBzZXR1cCBvdXIgb3duIHZhcmlhYmxlcy4gKERvIHRoaXMgZXhwbGljaXRlbHkgdG8gZmFjaWxpdGF0ZSBzZWFyY2hpbmcpCi0gICAgT1BFTkpES19UQVJHRVRfT1M9IiRWQVJfT1MiCi0gICAgT1BFTkpES19UQVJHRVRfT1NfQVBJPSIkVkFSX09TX0FQSSIKLSAgICBPUEVOSkRLX1RBUkdFVF9DUFU9IiRWQVJfQ1BVIgotICAgIE9QRU5KREtfVEFSR0VUX0NQVV9BUkNIPSIkVkFSX0NQVV9BUkNIIgotICAgIE9QRU5KREtfVEFSR0VUX0NQVV9CSVRTPSIkVkFSX0NQVV9CSVRTIgotICAgIE9QRU5KREtfVEFSR0VUX0NQVV9FTkRJQU49IiRWQVJfQ1BVX0VORElBTiIKLQotCi0KLQotCi0KLQotICAgICMgQ29udmVydCB0aGUgYXV0b2NvbmYgT1MvQ1BVIHZhbHVlIHRvIG91ciBvd24gZGF0YSwgaW50byB0aGUgVkFSX09TL0NQVSB2YXJpYWJsZXMuCi0KLSAgY2FzZSAiJGJ1aWxkX29zIiBpbgotICAgICpsaW51eCopCi0gICAgICBWQVJfT1M9bGludXgKLSAgICAgIFZBUl9PU19BUEk9cG9zaXgKLSAgICAgIDs7Ci0gICAgKnNvbGFyaXMqKQotICAgICAgVkFSX09TPXNvbGFyaXMKLSAgICAgIFZBUl9PU19BUEk9cG9zaXgKLSAgICAgIDs7Ci0gICAgKmRhcndpbiopCi0gICAgICBWQVJfT1M9bWFjb3N4Ci0gICAgICBWQVJfT1NfQVBJPXBvc2l4Ci0gICAgICA7OwotICAgICpic2QqKQotICAgICAgVkFSX09TPWJzZAotICAgICAgVkFSX09TX0FQST1wb3NpeAotICAgICAgOzsKLSAgICAqY3lnd2luKnwqd2luZG93cyopCi0gICAgICBWQVJfT1M9d2luZG93cwotICAgICAgVkFSX09TX0FQST13aW5hcGkKLSAgICAgIDs7Ci0gICAgKikKLSAgICAgIGFzX2ZuX2Vycm9yICQ/ICJ1bnN1cHBvcnRlZCBvcGVyYXRpbmcgc3lzdGVtICRidWlsZF9vcyIgIiRMSU5FTk8iIDUKLSAgICAgIDs7Ci0gIGVzYWMKLQotCi0gICMgRmlyc3QgYXJndW1lbnQgaXMgdGhlIGNwdSBuYW1lIGZyb20gdGhlIHRyaXAvcXVhZAotICBjYXNlICIkYnVpbGRfY3B1IiBpbgotICAgIHg4Nl82NCkKLSAgICAgIFZBUl9DUFU9eDg2XzY0Ci0gICAgICBWQVJfQ1BVX0FSQ0g9eDg2Ci0gICAgICBWQVJfQ1BVX0JJVFM9NjQKLSAgICAgIFZBUl9DUFVfRU5ESUFOPWxpdHRsZQotICAgICAgOzsKLSAgICBpPzg2KQotICAgICAgVkFSX0NQVT14ODYKLSAgICAgIFZBUl9DUFVfQVJDSD14ODYKLSAgICAgIFZBUl9DUFVfQklUUz0zMgotICAgICAgVkFSX0NQVV9FTkRJQU49bGl0dGxlCi0gICAgICA7OwotICAgIGFybSopCi0gICAgICBWQVJfQ1BVPWFybQotICAgICAgVkFSX0NQVV9BUkNIPWFybQotICAgICAgVkFSX0NQVV9CSVRTPTMyCi0gICAgICBWQVJfQ1BVX0VORElBTj1saXR0bGUKLSAgICAgIDs7Ci0gICAgcG93ZXJwYykKLSAgICAgIFZBUl9DUFU9cHBjCi0gICAgICBWQVJfQ1BVX0FSQ0g9cHBjCi0gICAgICBWQVJfQ1BVX0JJVFM9MzIKLSAgICAgIFZBUl9DUFVfRU5ESUFOPWJpZwotICAgICAgIDs7Ci0gICAgcG93ZXJwYzY0KQotICAgICAgVkFSX0NQVT1wcGM2NAotICAgICAgVkFSX0NQVV9BUkNIPXBwYwotICAgICAgVkFSX0NQVV9CSVRTPTY0Ci0gICAgICBWQVJfQ1BVX0VORElBTj1iaWcKLSAgICAgICA7OwotICAgIHNwYXJjKQotICAgICAgVkFSX0NQVT1zcGFyYwotICAgICAgVkFSX0NQVV9BUkNIPXNwYXJjCi0gICAgICBWQVJfQ1BVX0JJVFM9MzIKLSAgICAgIFZBUl9DUFVfRU5ESUFOPWJpZwotICAgICAgIDs7Ci0gICAgc3BhcmN2OSkKLSAgICAgIFZBUl9DUFU9c3BhcmN2OQotICAgICAgVkFSX0NQVV9BUkNIPXNwYXJjCi0gICAgICBWQVJfQ1BVX0JJVFM9NjQKLSAgICAgIFZBUl9DUFVfRU5ESUFOPWJpZwotICAgICAgIDs7Ci0gICAgKikKLSAgICAgIGFzX2ZuX2Vycm9yICQ/ICJ1bnN1cHBvcnRlZCBjcHUgJGJ1aWxkX2NwdSIgIiRMSU5FTk8iIDUKLSAgICAgIDs7Ci0gIGVzYWMKLQotICAgICMgLi5hbmQgc2V0dXAgb3VyIG93biB2YXJpYWJsZXMuIChEbyB0aGlzIGV4cGxpY2l0ZWx5IHRvIGZhY2lsaXRhdGUgc2VhcmNoaW5nKQotICAgIE9QRU5KREtfQlVJTERfT1M9IiRWQVJfT1MiCi0gICAgT1BFTkpES19CVUlMRF9PU19BUEk9IiRWQVJfT1NfQVBJIgotICAgIE9QRU5KREtfQlVJTERfQ1BVPSIkVkFSX0NQVSIKLSAgICBPUEVOSkRLX0JVSUxEX0NQVV9BUkNIPSIkVkFSX0NQVV9BUkNIIgotICAgIE9QRU5KREtfQlVJTERfQ1BVX0JJVFM9IiRWQVJfQ1BVX0JJVFMiCi0gICAgT1BFTkpES19CVUlMRF9DUFVfRU5ESUFOPSIkVkFSX0NQVV9FTkRJQU4iCi0KLQotCi0KLQotCi0KLQotCi0jIENoZWNrIHdoZXRoZXIgLS13aXRoLXRhcmdldC1iaXRzIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF90YXJnZXRfYml0cytzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfdGFyZ2V0X2JpdHM7Ci1maQotCi0KLSAgIyBXZSBoYXZlIHRocmVlIHR5cGVzIG9mIGNvbXBpbGVzOgotICAjIG5hdGl2ZSAgPT0gbm9ybWFsIGNvbXBpbGF0aW9uLCB0YXJnZXQgc3lzdGVtID09IGJ1aWxkIHN5c3RlbQotICAjIGNyb3NzICAgPT0gdHJhZGl0aW9uYWwgY3Jvc3MgY29tcGlsYXRpb24sIHRhcmdldCBzeXN0ZW0gIT0gYnVpbGQgc3lzdGVtOyBzcGVjaWFsIHRvb2xjaGFpbiBuZWVkZWQKLSAgIyByZWR1Y2VkID09IHVzaW5nIG5hdGl2ZSBjb21waWxlcnMsIGJ1dCB3aXRoIHNwZWNpYWwgZmxhZ3MgKGUuZy4gLW0zMikgdG8gcHJvZHVjZSAzMi1iaXQgYnVpbGRzIG9uIDY0LWJpdCBtYWNoaW5lcwotICAjCi0gIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9BVVRPQ09ORl9OQU1FIiAhPSAieCRPUEVOSkRLX1RBUkdFVF9BVVRPQ09ORl9OQU1FIjsgdGhlbgotICAgICMgV2UncmUgZG9pbmcgYSBwcm9wZXIgY3Jvc3MtY29tcGlsYXRpb24KLSAgICBDT01QSUxFX1RZUEU9ImNyb3NzIgotICBlbHNlCi0gICAgQ09NUElMRV9UWVBFPSJuYXRpdmUiCi0gIGZpCi0KLSAgaWYgdGVzdCAieCR3aXRoX3RhcmdldF9iaXRzIiAhPSB4OyB0aGVuCi0gICAgaWYgdGVzdCAieCRDT01QSUxFX1RZUEUiID0gInhjcm9zcyI7IHRoZW4KLSAgICAgIGFzX2ZuX2Vycm9yICQ/ICJJdCBpcyBub3QgcG9zc2libGUgdG8gY29tYmluZSAtLXdpdGgtdGFyZ2V0LWJpdHM9WCBhbmQgcHJvcGVyIGNyb3NzLWNvbXBpbGF0aW9uLiBDaG9vc2UgZWl0aGVyLiIgIiRMSU5FTk8iIDUKLSAgICBmaQotCi0gICAgaWYgdGVzdCAieCR3aXRoX3RhcmdldF9iaXRzIiA9IHgzMiAmJiB0ZXN0ICJ4JE9QRU5KREtfVEFSR0VUX0NQVV9CSVRTIiA9IHg2NDsgdGhlbgotICAgICAgIyBBIHJlZHVjZWQgYnVpbGQgaXMgcmVxdWVzdGVkCi0gICAgICBDT01QSUxFX1RZUEU9InJlZHVjZWQiCi0gICAgICBPUEVOSkRLX1RBUkdFVF9DUFVfQklUUz0zMgotICAgICAgaWYgdGVzdCAieCRPUEVOSkRLX1RBUkdFVF9DUFVfQVJDSCIgPSAieHg4NiI7IHRoZW4KLSAgICAgICAgT1BFTkpES19UQVJHRVRfQ1BVPXg4NgotICAgICAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfVEFSR0VUX0NQVV9BUkNIIiA9ICJ4c3BhcmMiOyB0aGVuCi0gICAgICAgIE9QRU5KREtfVEFSR0VUX0NQVT1zcGFyYwotICAgICAgZWxzZQotICAgICAgICBhc19mbl9lcnJvciAkPyAiUmVkdWNlZCBidWlsZCAoLS13aXRoLXRhcmdldC1iaXRzPTMyKSBpcyBvbmx5IHN1cHBvcnRlZCBvbiB4ODZfNjQgYW5kIHNwYXJjdjkiICIkTElORU5PIiA1Ci0gICAgICBmaQotICAgIGVsaWYgdGVzdCAieCR3aXRoX3RhcmdldF9iaXRzIiA9IHg2NCAmJiB0ZXN0ICJ4JE9QRU5KREtfVEFSR0VUX0NQVV9CSVRTIiA9IHgzMjsgdGhlbgotICAgICAgYXNfZm5fZXJyb3IgJD8gIkl0IGlzIG5vdCBwb3NzaWJsZSB0byB1c2UgLS13aXRoLXRhcmdldC1iaXRzPTY0IG9uIGEgMzIgYml0IHN5c3RlbS4gVXNlIHByb3BlciBjcm9zcy1jb21waWxhdGlvbiBpbnN0ZWFkLiIgIiRMSU5FTk8iIDUKLSAgICBlbGlmIHRlc3QgIngkd2l0aF90YXJnZXRfYml0cyIgPSAieCRPUEVOSkRLX1RBUkdFVF9DUFVfQklUUyI7IHRoZW4KLSAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogLS13aXRoLXRhcmdldC1iaXRzIGFyZSBzZXQgdG8gYnVpbGQgcGxhdGZvcm0gYWRkcmVzcyBzaXplOyBhcmd1bWVudCBoYXMgbm8gbWVhbmluZyIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiAtLXdpdGgtdGFyZ2V0LWJpdHMgYXJlIHNldCB0byBidWlsZCBwbGF0Zm9ybSBhZGRyZXNzIHNpemU7IGFyZ3VtZW50IGhhcyBubyBtZWFuaW5nIiA+JjY7fQotICAgIGVsc2UKLSAgICAgIGFzX2ZuX2Vycm9yICQ/ICItLXdpdGgtdGFyZ2V0LWJpdHMgY2FuIG9ubHkgYmUgMzIgb3IgNjQsIHlvdSBzcGVjaWZpZWQgJHdpdGhfdGFyZ2V0X2JpdHMhIiAiJExJTkVOTyIgNQotICAgIGZpCi0gIGZpCi0KLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgY29tcGlsYXRpb24gdHlwZSIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgY29tcGlsYXRpb24gdHlwZS4uLiAiID4mNjsgfQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRDT01QSUxFX1RZUEUiID4mNQotJGFzX2VjaG8gIiRDT01QSUxFX1RZUEUiID4mNjsgfQotCi0KLSAgICBpZiB0ZXN0ICJ4JE9QRU5KREtfVEFSR0VUX09TIiA9ICJ4c29sYXJpcyI7IHRoZW4KLSAgICAgICBSRVFVSVJFRF9PU19OQU1FPVN1bk9TCi0gICAgICAgUkVRVUlSRURfT1NfVkVSU0lPTj01LjEwCi0gICAgZmkKLSAgICBpZiB0ZXN0ICJ4JE9QRU5KREtfVEFSR0VUX09TIiA9ICJ4bGludXgiOyB0aGVuCi0gICAgICAgUkVRVUlSRURfT1NfTkFNRT1MaW51eAotICAgICAgIFJFUVVJUkVEX09TX1ZFUlNJT049Mi42Ci0gICAgZmkKLSAgICBpZiB0ZXN0ICJ4JE9QRU5KREtfVEFSR0VUX09TIiA9ICJ4d2luZG93cyI7IHRoZW4KLSAgICAgICAgUkVRVUlSRURfT1NfTkFNRT1XaW5kb3dzCi0gICAgICAgIGlmIHRlc3QgIngkT1BFTkpES19UQVJHRVRfQ1BVX0JJVFMiID0gIng2NCI7IHRoZW4KLSAgICAgICAgICAgIFJFUVVJUkVEX09TX1ZFUlNJT049NS4yCi0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIFJFUVVJUkVEX09TX1ZFUlNJT049NS4xCi0gICAgICAgIGZpCi0gICAgZmkKLSAgICBpZiB0ZXN0ICJ4JE9QRU5KREtfVEFSR0VUX09TIiA9ICJ4bWFjb3N4IjsgdGhlbgotICAgICAgICBSRVFVSVJFRF9PU19OQU1FPURhcndpbgotICAgICAgICBSRVFVSVJFRF9PU19WRVJTSU9OPTExLjIKLSAgICBmaQotCi0KLQotCi0KLSAgICAjIEFsc28gc3RvcmUgdGhlIGxlZ2FjeSBuYW1pbmcgb2YgdGhlIGNwdS4KLSAgICAjIEllIGk1ODYgYW5kIGFtZDY0IGluc3RlYWQgb2YgeDg2IGFuZCB4ODZfNjQKLSAgICBPUEVOSkRLX1RBUkdFVF9DUFVfTEVHQUNZPSIkT1BFTkpES19UQVJHRVRfQ1BVIgotICAgIGlmIHRlc3QgIngkT1BFTkpES19UQVJHRVRfQ1BVIiA9IHh4ODY7IHRoZW4KLSAgICAgIE9QRU5KREtfVEFSR0VUX0NQVV9MRUdBQ1k9Imk1ODYiCi0gICAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfVEFSR0VUX09TIiAhPSB4bWFjb3N4ICYmIHRlc3QgIngkT1BFTkpES19UQVJHRVRfQ1BVIiA9IHh4ODZfNjQ7IHRoZW4KLSAgICAgICMgT24gYWxsIHBsYXRmb3JtcyBleGNlcHQgTWFjT1NYIHJlcGxhY2UgeDg2XzY0IHdpdGggYW1kNjQuCi0gICAgICBPUEVOSkRLX1RBUkdFVF9DUFVfTEVHQUNZPSJhbWQ2NCIKLSAgICBmaQotCi0KLSAgICAjIEFuZCB0aGUgc2Vjb25kIGxlZ2FjeSBuYW1pbmcgb2YgdGhlIGNwdS4KLSAgICAjIEllIGkzODYgYW5kIGFtZDY0IGluc3RlYWQgb2YgeDg2IGFuZCB4ODZfNjQuCi0gICAgT1BFTkpES19UQVJHRVRfQ1BVX0xFR0FDWV9MSUI9IiRPUEVOSkRLX1RBUkdFVF9DUFUiCi0gICAgaWYgdGVzdCAieCRPUEVOSkRLX1RBUkdFVF9DUFUiID0geHg4NjsgdGhlbgotICAgICAgT1BFTkpES19UQVJHRVRfQ1BVX0xFR0FDWV9MSUI9ImkzODYiCi0gICAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfVEFSR0VUX0NQVSIgPSB4eDg2XzY0OyB0aGVuCi0gICAgICBPUEVOSkRLX1RBUkdFVF9DUFVfTEVHQUNZX0xJQj0iYW1kNjQiCi0gICAgZmkKLQotCi0gICAgIyBUaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBjcHUgKGJ1dCB1c2luZyBpMzg2IGFuZCBhbWQ2NCBpbnN0ZWFkIG9mCi0gICAgIyB4ODYgYW5kIHg4Nl82NCwgcmVzcGVjdGl2ZWx5KSwgcHJlY2VlZGVkIGJ5IGEgLywgdG8gYmUgdXNlZCB3aGVuCi0gICAgIyBsb2NhdGluZyBsaWJyYXJpZXMuIE9uIG1hY29zeCwgaXQncyBlbXB0eSwgdGhvdWdoLgotICAgIE9QRU5KREtfVEFSR0VUX0NQVV9MSUJESVI9Ii8kT1BFTkpES19UQVJHRVRfQ1BVX0xFR0FDWV9MSUIiCi0gICAgaWYgdGVzdCAieCRPUEVOSkRLX1RBUkdFVF9PUyIgPSB4bWFjb3N4OyB0aGVuCi0gICAgICAgIE9QRU5KREtfVEFSR0VUX0NQVV9MSUJESVI9IiIKLSAgICBmaQotCi0KLSAgICAjIE9QRU5KREtfVEFSR0VUX0NQVV9JU0FESVIgaXMgbm9ybWFsbHkgZW1wdHkuIE9uIDY0LWJpdCBTb2xhcmlzIHN5c3RlbXMsIGl0IGlzIHNldCB0bwotICAgICMgL2FtZDY0IG9yIC9zcGFyY3Y5LiBUaGlzIHN0cmluZyBpcyBhcHBlbmRlZCB0byBzb21lIGxpYnJhcnkgcGF0aHMsIGxpa2UgdGhpczoKLSAgICAjIC91c3IvbGliJHtPUEVOSkRLX1RBUkdFVF9DUFVfSVNBRElSfS9saWJleGFtcGxlLnNvCi0gICAgT1BFTkpES19UQVJHRVRfQ1BVX0lTQURJUj0iIgotICAgIGlmIHRlc3QgIngkT1BFTkpES19UQVJHRVRfT1MiID0geHNvbGFyaXM7IHRoZW4KLSAgICAgIGlmIHRlc3QgIngkT1BFTkpES19UQVJHRVRfQ1BVIiA9IHh4ODZfNjQ7IHRoZW4KLSAgICAgICAgICBPUEVOSkRLX1RBUkdFVF9DUFVfSVNBRElSPSIvYW1kNjQiCi0gICAgICBlbGlmIHRlc3QgIngkT1BFTkpES19UQVJHRVRfQ1BVIiA9IHhzcGFyY3Y5OyB0aGVuCi0gICAgICAgICAgT1BFTkpES19UQVJHRVRfQ1BVX0lTQURJUj0iL3NwYXJjdjkiCi0gICAgICBmaQotICAgIGZpCi0KLQotICAgICMgU2V0dXAgT1BFTkpES19UQVJHRVRfQ1BVX09TQVJDSCwgd2hpY2ggaXMgdXNlZCB0byBzZXQgdGhlIG9zLmFyY2ggSmF2YSBzeXN0ZW0gcHJvcGVydHkKLSAgICBPUEVOSkRLX1RBUkdFVF9DUFVfT1NBUkNIPSIkT1BFTkpES19UQVJHRVRfQ1BVIgotICAgIGlmIHRlc3QgIngkT1BFTkpES19UQVJHRVRfT1MiID0geGxpbnV4ICYmIHRlc3QgIngkT1BFTkpES19UQVJHRVRfQ1BVIiA9IHh4ODY7IHRoZW4KLSAgICAgICMgT24gbGludXggb25seSwgd2UgcmVwbGFjZSB4ODYgd2l0aCBpMzg2LgotICAgICAgT1BFTkpES19UQVJHRVRfQ1BVX09TQVJDSD0iaTM4NiIKLSAgICBlbGlmIHRlc3QgIngkT1BFTkpES19UQVJHRVRfT1MiICE9IHhtYWNvc3ggJiYgdGVzdCAieCRPUEVOSkRLX1RBUkdFVF9DUFUiID0geHg4Nl82NDsgdGhlbgotICAgICAgIyBPbiBhbGwgcGxhdGZvcm1zIGV4Y2VwdCBtYWNvc3gsIHdlIHJlcGxhY2UgeDg2XzY0IHdpdGggYW1kNjQuCi0gICAgICBPUEVOSkRLX1RBUkdFVF9DUFVfT1NBUkNIPSJhbWQ2NCIKLSAgICBmaQotCi0KLSAgICBPUEVOSkRLX1RBUkdFVF9DUFVfSkxJPSIkT1BFTkpES19UQVJHRVRfQ1BVIgotICAgIGlmIHRlc3QgIngkT1BFTkpES19UQVJHRVRfQ1BVIiA9IHh4ODY7IHRoZW4KLSAgICAgIE9QRU5KREtfVEFSR0VUX0NQVV9KTEk9ImkzODYiCi0gICAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfVEFSR0VUX09TIiAhPSB4bWFjb3N4ICYmIHRlc3QgIngkT1BFTkpES19UQVJHRVRfQ1BVIiA9IHh4ODZfNjQ7IHRoZW4KLSAgICAgICMgT24gYWxsIHBsYXRmb3JtcyBleGNlcHQgbWFjb3N4LCB3ZSByZXBsYWNlIHg4Nl82NCB3aXRoIGFtZDY0LgotICAgICAgT1BFTkpES19UQVJHRVRfQ1BVX0pMST0iYW1kNjQiCi0gICAgZmkKLSAgICAjIE5vdyBzZXR1cCB0aGUgLUQgZmxhZ3MgZm9yIGJ1aWxkaW5nIGxpYmpsaS4KLSAgICBPUEVOSkRLX1RBUkdFVF9DUFVfSkxJX0NGTEFHUz0iLURMSUJBUkNITkFNRT0nXCIkT1BFTkpES19UQVJHRVRfQ1BVX0pMSVwiJyIKLSAgICBpZiB0ZXN0ICJ4JE9QRU5KREtfVEFSR0VUX09TIiA9IHhzb2xhcmlzOyB0aGVuCi0gICAgICBpZiB0ZXN0ICJ4JE9QRU5KREtfVEFSR0VUX0NQVV9BUkNIIiA9IHhzcGFyYzsgdGhlbgotICAgICAgICBPUEVOSkRLX1RBUkdFVF9DUFVfSkxJX0NGTEFHUz0iJE9QRU5KREtfVEFSR0VUX0NQVV9KTElfQ0ZMQUdTIC1ETElCQVJDSDMyTkFNRT0nXCJzcGFyY1wiJyAtRExJQkFSQ0g2NE5BTUU9J1wic3BhcmN2OVwiJyIKLSAgICAgIGVsaWYgdGVzdCAieCRPUEVOSkRLX1RBUkdFVF9DUFVfQVJDSCIgPSB4eDg2OyB0aGVuCi0gICAgICAgIE9QRU5KREtfVEFSR0VUX0NQVV9KTElfQ0ZMQUdTPSIkT1BFTkpES19UQVJHRVRfQ1BVX0pMSV9DRkxBR1MgLURMSUJBUkNIMzJOQU1FPSdcImkzODZcIicgLURMSUJBUkNINjROQU1FPSdcImFtZDY0XCInIgotICAgICAgZmkKLSAgICBmaQotCi0KLSAgICAjIFNldHVwIE9QRU5KREtfVEFSR0VUX09TX0FQSV9ESVIsIHVzZWQgaW4gc291cmNlIHBhdGhzLgotICAgIGlmIHRlc3QgIngkT1BFTkpES19UQVJHRVRfT1NfQVBJIiA9IHhwb3NpeDsgdGhlbgotICAgICAgICBPUEVOSkRLX1RBUkdFVF9PU19BUElfRElSPSJzb2xhcmlzIgotICAgIGZpCi0gICAgaWYgdGVzdCAieCRPUEVOSkRLX1RBUkdFVF9PU19BUEkiID0geHdpbmFwaTsgdGhlbgotICAgICAgICBPUEVOSkRLX1RBUkdFVF9PU19BUElfRElSPSJ3aW5kb3dzIgotICAgIGZpCi0KLQotICAgIGlmIHRlc3QgIngkT1BFTkpES19UQVJHRVRfQ1BVX0JJVFMiID0geDY0OyB0aGVuCi0gICAgICAgIEFfTFA2ND0iTFA2NDo9IgotICAgICAgICBBRERfTFA2ND0iLURfTFA2ND0xIgotICAgIGZpCi0gICAgTFA2ND0kQV9MUDY0Ci0KLQotICAgIGlmIHRlc3QgIngkQ09NUElMRV9UWVBFIiA9ICJ4Y3Jvc3MiOyB0aGVuCi0gICAgICAjIEZJWE1FOiAuLi4gb3Igc2hvdWxkIHRoaXMgaW5jbHVkZSByZWR1Y2VkIGJ1aWxkcy4uPwotICAgICAgREVGSU5FX0NST1NTX0NPTVBJTEVfQVJDSD0iQ1JPU1NfQ09NUElMRV9BUkNIOj0kT1BFTkpES19UQVJHRVRfQ1BVX0xFR0FDWSIKLSAgICBlbHNlCi0gICAgICBERUZJTkVfQ1JPU1NfQ09NUElMRV9BUkNIPSIiCi0gICAgZmkKLQotCi0KLQotIyBDb250aW51ZSBzZXR0aW5nIHVwIGJhc2ljIHN0dWZmLgotCi0jIExvY2F0ZSB0aGUgZGlyZWN0b3J5IG9mIHRoaXMgc2NyaXB0LgotU0NSSVBUPSIkMCIKLQotICAgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PUyIgIT0geHdpbmRvd3M7IHRoZW4KLSAgICAgICAgIyBGb2xsb3cgYSBjaGFpbiBvZiBzeW1ib2xpYyBsaW5rcy4gVXNlIHJlYWRsaW5rCi0gICAgICAgICMgd2hlcmUgaXQgZXhpc3RzLCBlbHNlIGZhbGwgYmFjayB0byBob3JyaWJseQotICAgICAgICAjIGNvbXBsaWNhdGVkIHNoZWxsIGNvZGUuCi0gICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicmVhZGxpbmsiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHJlYWRsaW5rOyBhY193b3JkPSQyCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9SRUFETElOSytzZXR9IiA9IHNldDsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGNhc2UgJFJFQURMSU5LIGluCi0gIFtcXC9dKiB8ID86W1xcL10qKQotICBhY19jdl9wYXRoX1JFQURMSU5LPSIkUkVBRExJTksiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBhY19jdl9wYXRoX1JFQURMSU5LPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi0gIDs7Ci1lc2FjCi1maQotUkVBRExJTks9JGFjX2N2X3BhdGhfUkVBRExJTksKLWlmIHRlc3QgLW4gIiRSRUFETElOSyI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRSRUFETElOSyIgPiY1Ci0kYXNfZWNobyAiJFJFQURMSU5LIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotCi0KLSAgICAgICAgaWYgdGVzdCAieCRSRUFETElOS19URVNURUQiICE9IHllczsgdGhlbgotICAgICAgICAgICAgIyBPbiBNYWNPU1ggdGhlcmUgaXMgYSByZWFkbGluayB0b29sIHdpdGggYSBkaWZmZXJlbnQKLSAgICAgICAgICAgICMgcHVycG9zZSB0aGFuIHRoZSBHTlUgcmVhZGxpbmsgdG9vbC4gQ2hlY2sgdGhlIGZvdW5kIHJlYWRsaW5rLgotICAgICAgICAgICAgSVNHTlU9YCRSRUFETElOSyAtLWhlbHAgMj4mMSB8IGdyZXAgR05VYAotICAgICAgICAgICAgaWYgdGVzdCAieCRJU0dOVSIgPSB4OyB0aGVuCi0gICAgICAgICAgICAgICAgICMgQSByZWFkbGluayB0aGF0IHdlIGRvIG5vdCBrbm93IGhvdyB0byB1c2UuCi0gICAgICAgICAgICAgICAgICMgQXJlIHRoZXJlIG90aGVyIG5vbi1HTlUgcmVhZGxpbmtzIG91dCB0aGVyZT8KLSAgICAgICAgICAgICAgICAgUkVBRExJTktfVEVTVEVEPXllcwotICAgICAgICAgICAgICAgICBSRUFETElOSz0KLSAgICAgICAgICAgIGZpCi0gICAgICAgIGZpCi0KLSAgICAgICAgaWYgdGVzdCAieCRSRUFETElOSyIgIT0geDsgdGhlbgotICAgICAgICAgICAgU0NSSVBUPWAkUkVBRExJTksgLWYgJFNDUklQVGAKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgU1RBUlRESVI9JFBXRAotICAgICAgICAgICAgQ09VTlRFUj0wCi0gICAgICAgICAgICBESVI9YGRpcm5hbWUgJFNDUklQVGAKLSAgICAgICAgICAgIEZJTD1gYmFzZW5hbWUgJFNDUklQVGAKLSAgICAgICAgICAgIHdoaWxlIHRlc3QgJENPVU5URVIgLWx0IDIwOyBkbwotICAgICAgICAgICAgICAgIElTTElOSz1gbHMgLWwgJERJUi8kRklMIHwgZ3JlcCAnXC0+JyB8IHNlZCAtZSAncy8uKi0+IFwoLipcKS9cMS8nYAotICAgICAgICAgICAgICAgIGlmIHRlc3QgIngkSVNMSU5LIiA9PSB4OyB0aGVuCi0gICAgICAgICAgICAgICAgICAgICMgVGhpcyBpcyBub3QgYSBzeW1ib2xpYyBsaW5rISBXZSBhcmUgZG9uZSEKLSAgICAgICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgICAgICBmaQotICAgICAgICAgICAgICAgICMgVGhlIGxpbmsgbWlnaHQgYmUgcmVsYXRpdmUhIFdlIGhhdmUgdG8gdXNlIGNkIHRvIHRyYXZlbCBzYWZlbHkuCi0gICAgICAgICAgICAgICAgY2QgJERJUgotICAgICAgICAgICAgICAgIGNkIGBkaXJuYW1lICRJU0xJTktgCi0gICAgICAgICAgICAgICAgRElSPWBwd2RgCi0gICAgICAgICAgICAgICAgRklMPWBiYXNlbmFtZSAkSVNMSU5LYAotICAgICAgICAgICAgICAgIGxldCBDT1VOVEVSPUNPVU5URVIrMQotICAgICAgICAgICAgZG9uZQotICAgICAgICAgICAgY2QgJFNUQVJURElSCi0gICAgICAgICAgICBTQ1JJUFQ9JERJUi8kRklMCi0gICAgICAgIGZpCi0gICAgZmkKLQotQVVUT0NPTkZfRElSPWBkaXJuYW1lICQwYAotCi0jIFdoZXJlIGlzIHRoZSBzb3VyY2U/IEl0IGlzIGxvY2F0ZWQgdHdvIGxldmVscyBhYm92ZSB0aGUgY29uZmlndXJlIHNjcmlwdC4KLUNVUkRJUj0iJFBXRCIKLWNkICIkQVVUT0NPTkZfRElSLy4uLy4uIgotU1JDX1JPT1Q9ImBwd2RgIgotaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TIiA9ICJ4d2luZG93cyI7IHRoZW4KLSAgICBTUkNfUk9PVF9MRU5HVEg9YHB3ZHx3YyAtbWAKLSAgICBpZiB0ZXN0ICRTUkNfUk9PVF9MRU5HVEggLWd0IDEwMDsgdGhlbgotICAgICAgICBhc19mbl9lcnJvciAkPyAiWW91ciBiYXNlIHBhdGggaXMgdG9vIGxvbmcuIEl0IGlzICRTUkNfUk9PVF9MRU5HVEggY2hhcmFjdGVycyBsb25nLCBidXQgb25seSAxMDAgaXMgc3VwcG9ydGVkIiAiJExJTkVOTyIgNQotICAgIGZpCi1maQotCi1jZCAiJENVUkRJUiIKLQotCi0gICAgIyBGYWlsIHdpdGggbWVzc2FnZSB0aGUgcGF0aCB0byB0aGUgc291cmNlIHJvb3QgaWYgdmFyIFNSQ19ST09UIGNvbnRhaW5zIGEgcGF0aCB3aXRoIG5vIHNwYWNlcyBpbiBpdC4KLSAgICAjIFVubGVzcyBvbiBXaW5kb3dzLCB3aGVyZSB3ZSBjYW4gcmV3cml0ZSB0aGUgcGF0aC4KLSAgICBIQVNfU1BBQ0U9YGVjaG8gIiRTUkNfUk9PVCIgfCBncmVwICIgImAKLSAgICBpZiB0ZXN0ICJ4JEhBU19TUEFDRSIgIT0geDsgdGhlbgotICAgICAgICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1MiID0gInh3aW5kb3dzIjsgdGhlbgotICAgICAgICAgICAgIyBGaXJzdCBjb252ZXJ0IGl0IHRvIERPUy1zdHlsZSwgc2hvcnQgbW9kZSAobm8gc3BhY2VzKQotICAgICAgICAgICAgU1JDX1JPT1Q9YCRDWUdQQVRIIC1zIC1tIC1hICIkU1JDX1JPT1QiYAotICAgICAgICAgICAgIyBOb3cgaXQncyBjYXNlIGluc2Vuc2l0aXZlOyBsZXQncyBtYWtlIGl0IGxvd2VyY2FzZSB0byBpbXByb3ZlIHJlYWRhYmlsaXR5Ci0gICAgICAgICAgICBTUkNfUk9PVD1gJEVDSE8gIiRTUkNfUk9PVCIgfCAkVFIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnF4eXonYAotICAgICAgICAgICAgIyBOb3cgY29udmVydCBpdCBiYWNrIHRvIFVuaXgtc3RpbGUgKGN5Z3BhdGgpCi0gICAgICAgICAgICBTUkNfUk9PVD1gJENZR1BBVEggLXUgIiRTUkNfUk9PVCJgCi0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGFzX2ZuX2Vycm9yICQ/ICJZb3UgY2Fubm90IGhhdmUgc3BhY2VzIGluIHRoZSBwYXRoIHRvIHRoZSBzb3VyY2Ugcm9vdCEgXCIkU1JDX1JPT1RcIiIgIiRMSU5FTk8iIDUKLSAgICAgICAgZmkKLSAgICBmaQotCi0KLSAgICAjIEZhaWwgd2l0aCBtZXNzYWdlIHRoZSBwYXRoIHRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBpZiB2YXIgQ1VSRElSIGNvbnRhaW5zIGEgcGF0aCB3aXRoIG5vIHNwYWNlcyBpbiBpdC4KLSAgICAjIFVubGVzcyBvbiBXaW5kb3dzLCB3aGVyZSB3ZSBjYW4gcmV3cml0ZSB0aGUgcGF0aC4KLSAgICBIQVNfU1BBQ0U9YGVjaG8gIiRDVVJESVIiIHwgZ3JlcCAiICJgCi0gICAgaWYgdGVzdCAieCRIQVNfU1BBQ0UiICE9IHg7IHRoZW4KLSAgICAgICAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TIiA9ICJ4d2luZG93cyI7IHRoZW4KLSAgICAgICAgICAgICMgRmlyc3QgY29udmVydCBpdCB0byBET1Mtc3R5bGUsIHNob3J0IG1vZGUgKG5vIHNwYWNlcykKLSAgICAgICAgICAgIENVUkRJUj1gJENZR1BBVEggLXMgLW0gLWEgIiRDVVJESVIiYAotICAgICAgICAgICAgIyBOb3cgaXQncyBjYXNlIGluc2Vuc2l0aXZlOyBsZXQncyBtYWtlIGl0IGxvd2VyY2FzZSB0byBpbXByb3ZlIHJlYWRhYmlsaXR5Ci0gICAgICAgICAgICBDVVJESVI9YCRFQ0hPICIkQ1VSRElSIiB8ICRUUiAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2cXh5eidgCi0gICAgICAgICAgICAjIE5vdyBjb252ZXJ0IGl0IGJhY2sgdG8gVW5peC1zdGlsZSAoY3lncGF0aCkKLSAgICAgICAgICAgIENVUkRJUj1gJENZR1BBVEggLXUgIiRDVVJESVIiYAotICAgICAgICBlbHNlCi0gICAgICAgICAgICBhc19mbl9lcnJvciAkPyAiWW91IGNhbm5vdCBoYXZlIHNwYWNlcyBpbiB0aGUgcGF0aCB0byB0aGUgY3VycmVudCBkaXJlY3RvcnkhIFwiJENVUkRJUlwiIiAiJExJTkVOTyIgNQotICAgICAgICBmaQotICAgIGZpCi0KLQotaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TIiA9ICJ4c29sYXJpcyI7IHRoZW4KLSAgICAjIEFkZCBleHRyYSBzZWFyY2ggcGF0aHMgb24gc29sYXJpcyBmb3IgdXRpbGl0aWVzIGxpa2UgYXIgYW5kIGFzIGV0Yy4uLgotICAgIFBBVEg9IiRQQVRIOi91c3IvY2NzL2JpbjovdXNyL3Nmdy9iaW46L29wdC9jc3cvYmluIgotZmkKLQotIyBGb3IgY3lnd2luIHdlIG5lZWQgY3lncGF0aCBmaXJzdCwgc2luY2UgaXQgaXMgdXNlZCBldmVyeXdoZXJlLgotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjeWdwYXRoIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjeWdwYXRoOyBhY193b3JkPSQyCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9DWUdQQVRIK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgY2FzZSAkQ1lHUEFUSCBpbgotICBbXFwvXSogfCA/OltcXC9dKikKLSAgYWNfY3ZfcGF0aF9DWUdQQVRIPSIkQ1lHUEFUSCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3BhdGhfQ1lHUEFUSD0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotICA7OwotZXNhYwotZmkKLUNZR1BBVEg9JGFjX2N2X3BhdGhfQ1lHUEFUSAotaWYgdGVzdCAtbiAiJENZR1BBVEgiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ1lHUEFUSCIgPiY1Ci0kYXNfZWNobyAiJENZR1BBVEgiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLQotUEFUSF9TRVA9IjoiCi1pZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1MiID0gInh3aW5kb3dzIjsgdGhlbgotICAgIGlmIHRlc3QgIngkQ1lHUEFUSCIgPSB4OyB0aGVuCi0gICAgICAgIGFzX2ZuX2Vycm9yICQ/ICJTb21ldGhpbmcgaXMgd3Jvbmcgd2l0aCB5b3VyIGN5Z3dpbiBpbnN0YWxsYXRpb24gc2luY2UgSSBjYW5ub3QgZmluZCBjeWdwYXRoLmV4ZSBpbiB5b3VyIHBhdGgiICIkTElORU5PIiA1Ci0gICAgZmkKLSAgICBQQVRIX1NFUD0iOyIKLWZpCi0KLQotIyBZb3UgY2FuIGZvcmNlIHRoZSBzeXMtcm9vdCBpZiB0aGUgc3lzLXJvb3QgZW5jb2RlZCBpbnRvIHRoZSBjcm9zcyBjb21waWxlciB0b29scwotIyBpcyBub3QgY29ycmVjdC4KLQotIyBDaGVjayB3aGV0aGVyIC0td2l0aC1zeXMtcm9vdCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfc3lzX3Jvb3Qrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICB3aXRodmFsPSR3aXRoX3N5c19yb290OwotZmkKLQotCi1pZiB0ZXN0ICJ4JHdpdGhfc3lzX3Jvb3QiICE9IHg7IHRoZW4KLSAgU1lTX1JPT1Q9JHdpdGhfc3lzX3Jvb3QKLWVsc2UKLSAgU1lTX1JPT1Q9LwotZmkKLQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtdG9vbHMtZGlyIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF90b29sc19kaXIrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICB3aXRodmFsPSR3aXRoX3Rvb2xzX2RpcjsgVE9PTFNfRElSPSR3aXRoX3Rvb2xzX2RpcgotZmkKLQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtZGV2a2l0IHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9kZXZraXQrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICB3aXRodmFsPSR3aXRoX2RldmtpdDsKLSAgICBpZiB0ZXN0ICJ4JHdpdGhfc3lzX3Jvb3QiICE9IHg7IHRoZW4KLSAgICAgIGFzX2ZuX2Vycm9yICQ/ICJDYW5ub3Qgc3BlY2lmeSBib3RoIC0td2l0aC1kZXZraXQgYW5kIC0td2l0aC1zeXMtcm9vdCBhdCB0aGUgc2FtZSB0aW1lIiAiJExJTkVOTyIgNQotICAgIGZpCi0gICAgaWYgdGVzdCAieCR3aXRoX3Rvb2xzX2RpciIgIT0geDsgdGhlbgotICAgICAgYXNfZm5fZXJyb3IgJD8gIkNhbm5vdCBzcGVjaWZ5IGJvdGggLS13aXRoLWRldmtpdCBhbmQgLS13aXRoLXRvb2xzLWRpciBhdCB0aGUgc2FtZSB0aW1lIiAiJExJTkVOTyIgNQotICAgIGZpCi0gICAgVE9PTFNfRElSPSR3aXRoX2RldmtpdC9iaW4KLSAgICBTWVNfUk9PVD0kd2l0aF9kZXZraXQvJGhvc3RfYWxpYXMvbGliYwotCi1maQotCi0KLQotCi0jIFNldHVwIGRlZmF1bHQgbG9nZ2luZyBvZiBzdGRvdXQgYW5kIHN0ZGVyciB0byBidWlsZC5sb2cgaW4gdGhlIG91dHB1dCByb290LgotQlVJTERfTE9HPSckKE9VVFBVVF9ST09UKS9idWlsZC5sb2cnCi1CVUlMRF9MT0dfUFJFVklPVVM9JyQoT1VUUFVUX1JPT1QpL2J1aWxkLmxvZy5vbGQnCi1CVUlMRF9MT0dfV1JBUFBFUj0nJChTSCkgJChTUkNfUk9PVCkvY29tbW9uL2Jpbi9sb2dnZXIuc2ggJChCVUlMRF9MT0cpJwotCi0KLQotCi0KLSMgTXVzdCBiZSBkb25lIGJlZm9yZSB3ZSBjYW4gY2FsbCBIRUxQX01TR19NSVNTSU5HX0RFUEVOREVOQ1kuCi0KLSAgICBmb3IgYWNfcHJvZyBpbiBhcHQtZ2V0IHl1bSBwb3J0IHBrZ3V0aWwgcGtnYWRkCi1kbwotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfUEtHSEFORExFUitzZXR9IiA9IHNldDsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRQS0dIQU5ETEVSIjsgdGhlbgotICBhY19jdl9wcm9nX1BLR0hBTkRMRVI9IiRQS0dIQU5ETEVSIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3Byb2dfUEtHSEFORExFUj0iJGFjX3Byb2ciCi0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLWZpCi1maQotUEtHSEFORExFUj0kYWNfY3ZfcHJvZ19QS0dIQU5ETEVSCi1pZiB0ZXN0IC1uICIkUEtHSEFORExFUiI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRQS0dIQU5ETEVSIiA+JjUKLSRhc19lY2hvICIkUEtHSEFORExFUiIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotCi0gIHRlc3QgLW4gIiRQS0dIQU5ETEVSIiAmJiBicmVhawotZG9uZQotCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IENvbmZpZ3VyYXRpb24gY3JlYXRlZCBhdCAkREFURV9XSEVOX0NPTkZJR1VSRUQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IENvbmZpZ3VyYXRpb24gY3JlYXRlZCBhdCAkREFURV9XSEVOX0NPTkZJR1VSRUQuIiA+JjY7fQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjb25maWd1cmUgc2NyaXB0IGdlbmVyYXRlZCBhdCB0aW1lc3RhbXAgJERBVEVfV0hFTl9HRU5FUkFURUQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGNvbmZpZ3VyZSBzY3JpcHQgZ2VuZXJhdGVkIGF0IHRpbWVzdGFtcCAkREFURV9XSEVOX0dFTkVSQVRFRC4iID4mNjt9CiAKIAotIyBTZXR1cCBzaW1wbGUgdG9vbHMsIHRoYXQgZG8gbm90IG5lZWQgaGF2ZSBjcm9zcyBjb21waWxhdGlvbiBzdXBwb3J0LgotIyBXaXRob3V0IHRoZXNlLCB3ZSBjYW4ndCBwcm9wZXJseSBydW4gdGhlIHJlc3Qgb2YgdGhlIGNvbmZpZ3VyZSBzY3JpcHQuCiAKICMgU3RhcnQgd2l0aCB0b29scyB0aGF0IGRvIG5vdCBuZWVkIGhhdmUgY3Jvc3MgY29tcGlsYXRpb24gc3VwcG9ydAogIyBhbmQgY2FuIGJlIGV4cGVjdGVkIHRvIGJlIGZvdW5kIGluIHRoZSBkZWZhdWx0IFBBVEguIFRoZXNlIHRvb2xzIGFyZQpAQCAtNDQ0Myw2ICszNzU2LDY1IEBACiAKIAogCisgICAgZm9yIGFjX3Byb2cgaW4gYmFzaAorZG8KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9wYXRoX0JBU0grc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXNlICRCQVNIIGluCisgIFtcXC9dKiB8ID86W1xcL10qKQorICBhY19jdl9wYXRoX0JBU0g9IiRCQVNIIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcGF0aF9CQVNIPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCisgIDs7Citlc2FjCitmaQorQkFTSD0kYWNfY3ZfcGF0aF9CQVNICitpZiB0ZXN0IC1uICIkQkFTSCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRCQVNIIiA+JjUKKyRhc19lY2hvICIkQkFTSCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCisgIHRlc3QgLW4gIiRCQVNIIiAmJiBicmVhaworZG9uZQorCisKKyAgICBpZiB0ZXN0ICJ4JEJBU0giID0geDsgdGhlbgorICAgICAgICBpZiB0ZXN0ICJ4YmFzaCIgPSB4OyB0aGVuCisgICAgICAgICAgUFJPR19OQU1FPWJhc2gKKyAgICAgICAgZWxzZQorICAgICAgICAgIFBST0dfTkFNRT1iYXNoCisgICAgICAgIGZpCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogQ291bGQgbm90IGZpbmQgJFBST0dfTkFNRSEiID4mNQorJGFzX2VjaG8gIiRhc19tZTogQ291bGQgbm90IGZpbmQgJFBST0dfTkFNRSEiID4mNjt9CisgICAgICAgIGFzX2ZuX2Vycm9yICQ/ICJDYW5ub3QgY29udGludWUiICIkTElORU5PIiA1CisgICAgZmkKKworCisKICAgICBmb3IgYWNfcHJvZyBpbiBjYXQKIGRvCiAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgpAQCAtNDY3OSw2NSArNDA1MSw2IEBACiAKIAogCi0gICAgZm9yIGFjX3Byb2cgaW4gY3BpbwotZG8KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wYXRoX0NQSU8rc2V0fSIgPSBzZXQ7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBjYXNlICRDUElPIGluCi0gIFtcXC9dKiB8ID86W1xcL10qKQotICBhY19jdl9wYXRoX0NQSU89IiRDUElPIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcGF0aF9DUElPPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi0gIDs7Ci1lc2FjCi1maQotQ1BJTz0kYWNfY3ZfcGF0aF9DUElPCi1pZiB0ZXN0IC1uICIkQ1BJTyI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRDUElPIiA+JjUKLSRhc19lY2hvICIkQ1BJTyIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotCi0gIHRlc3QgLW4gIiRDUElPIiAmJiBicmVhawotZG9uZQotCi0KLSAgICBpZiB0ZXN0ICJ4JENQSU8iID0geDsgdGhlbgotICAgICAgICBpZiB0ZXN0ICJ4Y3BpbyIgPSB4OyB0aGVuCi0gICAgICAgICAgUFJPR19OQU1FPWNwaW8KLSAgICAgICAgZWxzZQotICAgICAgICAgIFBST0dfTkFNRT1jcGlvCi0gICAgICAgIGZpCi0gICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogQ291bGQgbm90IGZpbmQgJFBST0dfTkFNRSEiID4mNQotJGFzX2VjaG8gIiRhc19tZTogQ291bGQgbm90IGZpbmQgJFBST0dfTkFNRSEiID4mNjt9Ci0gICAgICAgIGFzX2ZuX2Vycm9yICQ/ICJDYW5ub3QgY29udGludWUiICIkTElORU5PIiA1Ci0gICAgZmkKLQotCi0KICAgICBmb3IgYWNfcHJvZyBpbiBjdXQKIGRvCiAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgpAQCAtNDg1Niw2NSArNDE2OSw2IEBACiAKIAogCi0gICAgZm9yIGFjX3Byb2cgaW4gZGYKLWRvCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9ERitzZXR9IiA9IHNldDsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGNhc2UgJERGIGluCi0gIFtcXC9dKiB8ID86W1xcL10qKQotICBhY19jdl9wYXRoX0RGPSIkREYiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBhY19jdl9wYXRoX0RGPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi0gIDs7Ci1lc2FjCi1maQotREY9JGFjX2N2X3BhdGhfREYKLWlmIHRlc3QgLW4gIiRERiI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRERiIgPiY1Ci0kYXNfZWNobyAiJERGIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotCi0KLSAgdGVzdCAtbiAiJERGIiAmJiBicmVhawotZG9uZQotCi0KLSAgICBpZiB0ZXN0ICJ4JERGIiA9IHg7IHRoZW4KLSAgICAgICAgaWYgdGVzdCAieGRmIiA9IHg7IHRoZW4KLSAgICAgICAgICBQUk9HX05BTUU9ZGYKLSAgICAgICAgZWxzZQotICAgICAgICAgIFBST0dfTkFNRT1kZgotICAgICAgICBmaQotICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IENvdWxkIG5vdCBmaW5kICRQUk9HX05BTUUhIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IENvdWxkIG5vdCBmaW5kICRQUk9HX05BTUUhIiA+JjY7fQotICAgICAgICBhc19mbl9lcnJvciAkPyAiQ2Fubm90IGNvbnRpbnVlIiAiJExJTkVOTyIgNQotICAgIGZpCi0KLQotCiAgICAgZm9yIGFjX3Byb2cgaW4gZ2RpZmYgZGlmZgogZG8KICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCkBAIC00OTc0LDYgKzQyMjgsNjUgQEAKIAogCiAKKyAgICBmb3IgYWNfcHJvZyBpbiBkaXJuYW1lCitkbworICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3BhdGhfRElSTkFNRStzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhc2UgJERJUk5BTUUgaW4KKyAgW1xcL10qIHwgPzpbXFwvXSopCisgIGFjX2N2X3BhdGhfRElSTkFNRT0iJERJUk5BTUUiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wYXRoX0RJUk5BTUU9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKKyAgOzsKK2VzYWMKK2ZpCitESVJOQU1FPSRhY19jdl9wYXRoX0RJUk5BTUUKK2lmIHRlc3QgLW4gIiRESVJOQU1FIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJERJUk5BTUUiID4mNQorJGFzX2VjaG8gIiRESVJOQU1FIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKyAgdGVzdCAtbiAiJERJUk5BTUUiICYmIGJyZWFrCitkb25lCisKKworICAgIGlmIHRlc3QgIngkRElSTkFNRSIgPSB4OyB0aGVuCisgICAgICAgIGlmIHRlc3QgInhkaXJuYW1lIiA9IHg7IHRoZW4KKyAgICAgICAgICBQUk9HX05BTUU9ZGlybmFtZQorICAgICAgICBlbHNlCisgICAgICAgICAgUFJPR19OQU1FPWRpcm5hbWUKKyAgICAgICAgZmkKKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBDb3VsZCBub3QgZmluZCAkUFJPR19OQU1FISIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBDb3VsZCBub3QgZmluZCAkUFJPR19OQU1FISIgPiY2O30KKyAgICAgICAgYXNfZm5fZXJyb3IgJD8gIkNhbm5vdCBjb250aW51ZSIgIiRMSU5FTk8iIDUKKyAgICBmaQorCisKKwogICAgIGZvciBhY19wcm9nIGluIGVjaG8KIGRvCiAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgpAQCAtNTQ0Niw2ICs0NzU5LDY1IEBACiAKIAogCisgICAgZm9yIGFjX3Byb2cgaW4gbWt0ZW1wCitkbworICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3BhdGhfTUtURU1QK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2FzZSAkTUtURU1QIGluCisgIFtcXC9dKiB8ID86W1xcL10qKQorICBhY19jdl9wYXRoX01LVEVNUD0iJE1LVEVNUCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3BhdGhfTUtURU1QPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCisgIDs7Citlc2FjCitmaQorTUtURU1QPSRhY19jdl9wYXRoX01LVEVNUAoraWYgdGVzdCAtbiAiJE1LVEVNUCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRNS1RFTVAiID4mNQorJGFzX2VjaG8gIiRNS1RFTVAiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworICB0ZXN0IC1uICIkTUtURU1QIiAmJiBicmVhaworZG9uZQorCisKKyAgICBpZiB0ZXN0ICJ4JE1LVEVNUCIgPSB4OyB0aGVuCisgICAgICAgIGlmIHRlc3QgInhta3RlbXAiID0geDsgdGhlbgorICAgICAgICAgIFBST0dfTkFNRT1ta3RlbXAKKyAgICAgICAgZWxzZQorICAgICAgICAgIFBST0dfTkFNRT1ta3RlbXAKKyAgICAgICAgZmkKKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBDb3VsZCBub3QgZmluZCAkUFJPR19OQU1FISIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBDb3VsZCBub3QgZmluZCAkUFJPR19OQU1FISIgPiY2O30KKyAgICAgICAgYXNfZm5fZXJyb3IgJD8gIkNhbm5vdCBjb250aW51ZSIgIiRMSU5FTk8iIDUKKyAgICBmaQorCisKKwogICAgIGZvciBhY19wcm9nIGluIG12CiBkbwogICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KQEAgLTU1NjQsNiArNDkzNiwxMjQgQEAKIAogCiAKKyAgICBmb3IgYWNfcHJvZyBpbiBwd2QKK2RvCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcGF0aF9USEVQV0RDTUQrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXNlICRUSEVQV0RDTUQgaW4KKyAgW1xcL10qIHwgPzpbXFwvXSopCisgIGFjX2N2X3BhdGhfVEhFUFdEQ01EPSIkVEhFUFdEQ01EIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcGF0aF9USEVQV0RDTUQ9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKKyAgOzsKK2VzYWMKK2ZpCitUSEVQV0RDTUQ9JGFjX2N2X3BhdGhfVEhFUFdEQ01ECitpZiB0ZXN0IC1uICIkVEhFUFdEQ01EIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFRIRVBXRENNRCIgPiY1CiskYXNfZWNobyAiJFRIRVBXRENNRCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCisgIHRlc3QgLW4gIiRUSEVQV0RDTUQiICYmIGJyZWFrCitkb25lCisKKworICAgIGlmIHRlc3QgIngkVEhFUFdEQ01EIiA9IHg7IHRoZW4KKyAgICAgICAgaWYgdGVzdCAieHB3ZCIgPSB4OyB0aGVuCisgICAgICAgICAgUFJPR19OQU1FPXRoZXB3ZGNtZAorICAgICAgICBlbHNlCisgICAgICAgICAgUFJPR19OQU1FPXB3ZAorICAgICAgICBmaQorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IENvdWxkIG5vdCBmaW5kICRQUk9HX05BTUUhIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IENvdWxkIG5vdCBmaW5kICRQUk9HX05BTUUhIiA+JjY7fQorICAgICAgICBhc19mbl9lcnJvciAkPyAiQ2Fubm90IGNvbnRpbnVlIiAiJExJTkVOTyIgNQorICAgIGZpCisKKworCisgICAgZm9yIGFjX3Byb2cgaW4gcm0KK2RvCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcGF0aF9STStzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhc2UgJFJNIGluCisgIFtcXC9dKiB8ID86W1xcL10qKQorICBhY19jdl9wYXRoX1JNPSIkUk0iICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wYXRoX1JNPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCisgIDs7Citlc2FjCitmaQorUk09JGFjX2N2X3BhdGhfUk0KK2lmIHRlc3QgLW4gIiRSTSI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRSTSIgPiY1CiskYXNfZWNobyAiJFJNIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKyAgdGVzdCAtbiAiJFJNIiAmJiBicmVhaworZG9uZQorCisKKyAgICBpZiB0ZXN0ICJ4JFJNIiA9IHg7IHRoZW4KKyAgICAgICAgaWYgdGVzdCAieHJtIiA9IHg7IHRoZW4KKyAgICAgICAgICBQUk9HX05BTUU9cm0KKyAgICAgICAgZWxzZQorICAgICAgICAgIFBST0dfTkFNRT1ybQorICAgICAgICBmaQorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IENvdWxkIG5vdCBmaW5kICRQUk9HX05BTUUhIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IENvdWxkIG5vdCBmaW5kICRQUk9HX05BTUUhIiA+JjY7fQorICAgICAgICBhc19mbl9lcnJvciAkPyAiQ2Fubm90IGNvbnRpbnVlIiAiJExJTkVOTyIgNQorICAgIGZpCisKKworCiAgICAgZm9yIGFjX3Byb2cgaW4gc2gKIGRvCiAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgpAQCAtNTk3Nyw2ICs1NDY3LDY1IEBACiAKIAogCisgICAgZm9yIGFjX3Byb2cgaW4gdW5hbWUKK2RvCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcGF0aF9VTkFNRStzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhc2UgJFVOQU1FIGluCisgIFtcXC9dKiB8ID86W1xcL10qKQorICBhY19jdl9wYXRoX1VOQU1FPSIkVU5BTUUiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wYXRoX1VOQU1FPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCisgIDs7Citlc2FjCitmaQorVU5BTUU9JGFjX2N2X3BhdGhfVU5BTUUKK2lmIHRlc3QgLW4gIiRVTkFNRSI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRVTkFNRSIgPiY1CiskYXNfZWNobyAiJFVOQU1FIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKyAgdGVzdCAtbiAiJFVOQU1FIiAmJiBicmVhaworZG9uZQorCisKKyAgICBpZiB0ZXN0ICJ4JFVOQU1FIiA9IHg7IHRoZW4KKyAgICAgICAgaWYgdGVzdCAieHVuYW1lIiA9IHg7IHRoZW4KKyAgICAgICAgICBQUk9HX05BTUU9dW5hbWUKKyAgICAgICAgZWxzZQorICAgICAgICAgIFBST0dfTkFNRT11bmFtZQorICAgICAgICBmaQorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IENvdWxkIG5vdCBmaW5kICRQUk9HX05BTUUhIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IENvdWxkIG5vdCBmaW5kICRQUk9HX05BTUUhIiA+JjY7fQorICAgICAgICBhc19mbl9lcnJvciAkPyAiQ2Fubm90IGNvbnRpbnVlIiAiJExJTkVOTyIgNQorICAgIGZpCisKKworCiAgICAgZm9yIGFjX3Byb2cgaW4gdW5pcQogZG8KICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCkBAIC02MDM2LDY1ICs1NTg1LDYgQEAKIAogCiAKLSAgICBmb3IgYWNfcHJvZyBpbiB1bnppcAotZG8KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wYXRoX1VOWklQK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgY2FzZSAkVU5aSVAgaW4KLSAgW1xcL10qIHwgPzpbXFwvXSopCi0gIGFjX2N2X3BhdGhfVU5aSVA9IiRVTlpJUCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3BhdGhfVU5aSVA9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCi0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLSAgOzsKLWVzYWMKLWZpCi1VTlpJUD0kYWNfY3ZfcGF0aF9VTlpJUAotaWYgdGVzdCAtbiAiJFVOWklQIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFVOWklQIiA+JjUKLSRhc19lY2hvICIkVU5aSVAiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLQotICB0ZXN0IC1uICIkVU5aSVAiICYmIGJyZWFrCi1kb25lCi0KLQotICAgIGlmIHRlc3QgIngkVU5aSVAiID0geDsgdGhlbgotICAgICAgICBpZiB0ZXN0ICJ4dW56aXAiID0geDsgdGhlbgotICAgICAgICAgIFBST0dfTkFNRT11bnppcAotICAgICAgICBlbHNlCi0gICAgICAgICAgUFJPR19OQU1FPXVuemlwCi0gICAgICAgIGZpCi0gICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogQ291bGQgbm90IGZpbmQgJFBST0dfTkFNRSEiID4mNQotJGFzX2VjaG8gIiRhc19tZTogQ291bGQgbm90IGZpbmQgJFBST0dfTkFNRSEiID4mNjt9Ci0gICAgICAgIGFzX2ZuX2Vycm9yICQ/ICJDYW5ub3QgY29udGludWUiICIkTElORU5PIiA1Ci0gICAgZmkKLQotCi0KICAgICBmb3IgYWNfcHJvZyBpbiB3YwogZG8KICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCkBAIC02MTU0LDYgKzU2NDQsNjUgQEAKIAogCiAKKyAgICBmb3IgYWNfcHJvZyBpbiB3aGljaAorZG8KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9wYXRoX1dISUNIK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2FzZSAkV0hJQ0ggaW4KKyAgW1xcL10qIHwgPzpbXFwvXSopCisgIGFjX2N2X3BhdGhfV0hJQ0g9IiRXSElDSCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3BhdGhfV0hJQ0g9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKKyAgOzsKK2VzYWMKK2ZpCitXSElDSD0kYWNfY3ZfcGF0aF9XSElDSAoraWYgdGVzdCAtbiAiJFdISUNIIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFdISUNIIiA+JjUKKyRhc19lY2hvICIkV0hJQ0giID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworICB0ZXN0IC1uICIkV0hJQ0giICYmIGJyZWFrCitkb25lCisKKworICAgIGlmIHRlc3QgIngkV0hJQ0giID0geDsgdGhlbgorICAgICAgICBpZiB0ZXN0ICJ4d2hpY2giID0geDsgdGhlbgorICAgICAgICAgIFBST0dfTkFNRT13aGljaAorICAgICAgICBlbHNlCisgICAgICAgICAgUFJPR19OQU1FPXdoaWNoCisgICAgICAgIGZpCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogQ291bGQgbm90IGZpbmQgJFBST0dfTkFNRSEiID4mNQorJGFzX2VjaG8gIiRhc19tZTogQ291bGQgbm90IGZpbmQgJFBST0dfTkFNRSEiID4mNjt9CisgICAgICAgIGFzX2ZuX2Vycm9yICQ/ICJDYW5ub3QgY29udGludWUiICIkTElORU5PIiA1CisgICAgZmkKKworCisKICAgICBmb3IgYWNfcHJvZyBpbiB4YXJncwogZG8KICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCkBAIC02MjEzLDY1ICs1NzYyLDYgQEAKIAogCiAKLSAgICBmb3IgYWNfcHJvZyBpbiB6aXAKLWRvCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9aSVArc2V0fSIgPSBzZXQ7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBjYXNlICRaSVAgaW4KLSAgW1xcL10qIHwgPzpbXFwvXSopCi0gIGFjX2N2X3BhdGhfWklQPSIkWklQIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcGF0aF9aSVA9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCi0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLSAgOzsKLWVzYWMKLWZpCi1aSVA9JGFjX2N2X3BhdGhfWklQCi1pZiB0ZXN0IC1uICIkWklQIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFpJUCIgPiY1Ci0kYXNfZWNobyAiJFpJUCIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotCi0gIHRlc3QgLW4gIiRaSVAiICYmIGJyZWFrCi1kb25lCi0KLQotICAgIGlmIHRlc3QgIngkWklQIiA9IHg7IHRoZW4KLSAgICAgICAgaWYgdGVzdCAieHppcCIgPSB4OyB0aGVuCi0gICAgICAgICAgUFJPR19OQU1FPXppcAotICAgICAgICBlbHNlCi0gICAgICAgICAgUFJPR19OQU1FPXppcAotICAgICAgICBmaQotICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IENvdWxkIG5vdCBmaW5kICRQUk9HX05BTUUhIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IENvdWxkIG5vdCBmaW5kICRQUk9HX05BTUUhIiA+JjY7fQotICAgICAgICBhc19mbl9lcnJvciAkPyAiQ2Fubm90IGNvbnRpbnVlIiAiJExJTkVOTyIgNQotICAgIGZpCi0KLQotCiAjIFRoZW4gcmVxdWlyZWQgdG9vbHMgdGhhdCByZXF1aXJlIHNvbWUgc3BlY2lhbCB0cmVhdG1lbnQuCiBmb3IgYWNfcHJvZyBpbiBnYXdrIG1hd2sgbmF3ayBhd2sKIGRvCkBAIC02NzAwLDY0NyArNjE5MCwyMCBAQAogICAgIGZpCiAKIAotCi0gICMgV2UgbmVlZCB0byBmaW5kIGEgcmVjZW50IHZlcnNpb24gb2YgR05VIG1ha2UuIEVzcGVjaWFsbHkgb24gU29sYXJpcywgdGhpcyBjYW4gYmUgdHJpY2t5LgotICBpZiB0ZXN0ICJ4JE1BS0UiICE9IHg7IHRoZW4KLSAgICAjIFVzZXIgaGFzIHN1cHBsaWVkIGEgbWFrZSwgdGVzdCBpdC4KLSAgICBpZiB0ZXN0ICEgLWYgIiRNQUtFIjsgdGhlbgotICAgICAgYXNfZm5fZXJyb3IgJD8gIlRoZSBzcGVjaWZpZWQgbWFrZSAoYnkgTUFLRT0kTUFLRSkgaXMgbm90IGZvdW5kLiIgIiRMSU5FTk8iIDUKLSAgICBmaQotCi0gIE1BS0VfQ0FORElEQVRFPSIiJE1BS0UiIgotICBERVNDUklQVElPTj0idXNlciBzdXBwbGllZCBNQUtFPSIKLSAgaWYgdGVzdCAieCRNQUtFX0NBTkRJREFURSIgIT0geDsgdGhlbgotICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGVzdGluZyBwb3RlbnRpYWwgbWFrZSBhdCAkTUFLRV9DQU5ESURBVEUsIGZvdW5kIHVzaW5nICRERVNDUklQVElPTiIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBUZXN0aW5nIHBvdGVudGlhbCBtYWtlIGF0ICRNQUtFX0NBTkRJREFURSwgZm91bmQgdXNpbmcgJERFU0NSSVBUSU9OIiA+JjY7fQotCi0gICAgIyBUcmFuc2xhdGUgImdjYyAtRSIgaW50byAiYHdoaWNoIGdjY2AgLUUiIGllCi0gICAgIyBleHRyYWN0IHRoZSBmdWxsIHBhdGggdG8gdGhlIGJpbmFyeSBhbmQgYXQgdGhlCi0gICAgIyBzYW1lIHRpbWUgbWFpbnRhaW4gYW55IGFyZ3VtZW50cyBwYXNzZWQgdG8gaXQuCi0gICAgIyBUaGUgY29tbWFuZCBNVVNUIGV4aXN0IGluIHRoZSBwYXRoLCBvciBlbHNlIQotICAgIHRtcD0iJE1BS0VfQ0FORElEQVRFIgotICAgIGNhcj0iJHt0bXAlJSAqfSIKLSAgICB0bXA9IiRNQUtFX0NBTkRJREFURSBFT0wiCi0gICAgY2RyPSIke3RtcCMqIH0iCi0gICAgIyBPbiB3aW5kb3dzIHdlIHdhbnQgcGF0aHMgd2l0aG91dCBzcGFjZXMuCi0gICAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TIiA9ICJ4d2luZG93cyI7IHRoZW4KLQotICAgICMgVHJhbnNsYXRlIGxvbmcgY3lnZHJpdmUgb3IgQzpcc2Rmc2YgcGF0aAotICAgICMgaW50byBhIHNob3J0IG1peGVkIG1vZGUgcGF0aCB0aGF0IGhhcyBubwotICAgICMgc3BhY2VzIGluIGl0LgotICAgIHRtcD0iJGNhciIKLQotICAgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PUyIgPSAieHdpbmRvd3MiOyB0aGVuCi0gICAgICAgIHRtcD1gJENZR1BBVEggLXUgIiRjYXIiYAotICAgICAgICB0bXA9YHdoaWNoICIkdG1wImAKLSAgICAgICAgIyBJZiBmaWxlIGV4aXN0cyB3aXRoIC5leGUgYXBwZW5kZWQsIHRoYXQncyB0aGUgcmVhbCBmaWxlbmFtZQotICAgICAgICAjIGFuZCBjeWdwYXRoIG5lZWRzIHRoYXQgdG8gY29udmVydCB0byBzaG9ydCBzdHlsZSBwYXRoLgotICAgICAgICBpZiB0ZXN0IC1mICIke3RtcH0uZXhlIjsgdGhlbgotICAgICAgICAgICB0bXA9IiR7dG1wfS5leGUiCi0gICAgICAgIGVsaWYgdGVzdCAtZiAiJHt0bXB9LmNtZCI7IHRoZW4KLSAgICAgICAgICAgdG1wPSIke3RtcH0uY21kIgotICAgICAgICBmaQotICAgICAgICAjIENvbnZlcnQgdG8gQzovIG1peGVkIHN0eWxlIHBhdGggd2l0aG91dCBzcGFjZXMuCi0gICAgICAgICB0bXA9YCRDWUdQQVRIIC1zIC1tICIkdG1wImAKLSAgICBmaQotICAgIGNhcj0iJHRtcCIKLQotICAgIGVsc2UKLSAgICAgICAgIyAid2hpY2giIGlzIG5vdCBwb3J0YWJsZSwgYnV0IGlzIHVzZWQgaGVyZQotICAgICAgICAjIGJlY2F1c2Ugd2Uga25vdyB0aGF0IHRoZSBjb21tYW5kIGV4aXN0cyEKLSAgICAgICAgY2FyPWB3aGljaCAkY2FyYAotICAgIGZpCi0gICAgaWYgdGVzdCAieCRjZHIiICE9IHhFT0w7IHRoZW4KLSAgICAgICAgTUFLRV9DQU5ESURBVEU9IiRjYXIgJHtjZHIlICp9IgotICAgIGVsc2UKLSAgICAgICAgTUFLRV9DQU5ESURBVEU9IiRjYXIiCi0gICAgZmkKLQotICAgIE1BS0VfVkVSU0lPTl9TVFJJTkc9YCRNQUtFX0NBTkRJREFURSAtLXZlcnNpb24gfCAkSEVBRCAtbiAxYAotICAgIElTX0dOVV9NQUtFPWAkRUNITyAkTUFLRV9WRVJTSU9OX1NUUklORyB8ICRHUkVQICdHTlUgTWFrZSdgCi0gICAgaWYgdGVzdCAieCRJU19HTlVfTUFLRSIgPSB4OyB0aGVuCi0gICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IEZvdW5kIHBvdGVudGlhbCBtYWtlIGF0ICRNQUtFX0NBTkRJREFURSwgaG93ZXZlciwgdGhpcyBpcyBub3QgR05VIE1ha2UuIElnbm9yaW5nLiIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBGb3VuZCBwb3RlbnRpYWwgbWFrZSBhdCAkTUFLRV9DQU5ESURBVEUsIGhvd2V2ZXIsIHRoaXMgaXMgbm90IEdOVSBNYWtlLiBJZ25vcmluZy4iID4mNjt9Ci0gICAgZWxzZQotICAgICAgSVNfTU9ERVJOX01BS0U9YCRFQ0hPICRNQUtFX1ZFUlNJT05fU1RSSU5HIHwgJEdSRVAgJzMuOFsxMjM0Njc4OV0nYAotICAgICAgaWYgdGVzdCAieCRJU19NT0RFUk5fTUFLRSIgPSB4OyB0aGVuCi0gICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogRm91bmQgR05VIG1ha2UgYXQgJE1BS0VfQ0FORElEQVRFLCBob3dldmVyIHRoaXMgaXMgbm90IHZlcnNpb24gMy44MSBvciBsYXRlci4gKGl0IGlzOiAkTUFLRV9WRVJTSU9OX1NUUklORykuIElnbm9yaW5nLiIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBGb3VuZCBHTlUgbWFrZSBhdCAkTUFLRV9DQU5ESURBVEUsIGhvd2V2ZXIgdGhpcyBpcyBub3QgdmVyc2lvbiAzLjgxIG9yIGxhdGVyLiAoaXQgaXM6ICRNQUtFX1ZFUlNJT05fU1RSSU5HKS4gSWdub3JpbmcuIiA+JjY7fQotICAgICAgZWxzZQotICAgICAgICBGT1VORF9NQUtFPSRNQUtFX0NBTkRJREFURQotICAgICAgZmkKLSAgICBmaQotICBmaQotCi0gICAgaWYgdGVzdCAieCRGT1VORF9NQUtFIiA9IHg7IHRoZW4KLSAgICAgIGFzX2ZuX2Vycm9yICQ/ICJUaGUgc3BlY2lmaWVkIG1ha2UgKGJ5IE1BS0U9JE1BS0UpIGlzIG5vdCBHTlUgbWFrZSAzLjgxIG9yIG5ld2VyLiIgIiRMSU5FTk8iIDUKLSAgICBmaQotICBlbHNlCi0gICAgIyBUcnkgb3VyIGhhcmRlc3QgdG8gbG9jYXRlIGEgY29ycmVjdCB2ZXJzaW9uIG9mIEdOVSBtYWtlCi0gICAgZm9yIGFjX3Byb2cgaW4gZ21ha2UKLWRvCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9DSEVDS19HTUFLRStzZXR9IiA9IHNldDsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGNhc2UgJENIRUNLX0dNQUtFIGluCi0gIFtcXC9dKiB8ID86W1xcL10qKQotICBhY19jdl9wYXRoX0NIRUNLX0dNQUtFPSIkQ0hFQ0tfR01BS0UiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBhY19jdl9wYXRoX0NIRUNLX0dNQUtFPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi0gIDs7Ci1lc2FjCi1maQotQ0hFQ0tfR01BS0U9JGFjX2N2X3BhdGhfQ0hFQ0tfR01BS0UKLWlmIHRlc3QgLW4gIiRDSEVDS19HTUFLRSI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRDSEVDS19HTUFLRSIgPiY1Ci0kYXNfZWNobyAiJENIRUNLX0dNQUtFIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotCi0KLSAgdGVzdCAtbiAiJENIRUNLX0dNQUtFIiAmJiBicmVhawotZG9uZQotCi0KLSAgTUFLRV9DQU5ESURBVEU9IiIkQ0hFQ0tfR01BS0UiIgotICBERVNDUklQVElPTj0iZ21ha2UgaW4gUEFUSCIKLSAgaWYgdGVzdCAieCRNQUtFX0NBTkRJREFURSIgIT0geDsgdGhlbgotICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGVzdGluZyBwb3RlbnRpYWwgbWFrZSBhdCAkTUFLRV9DQU5ESURBVEUsIGZvdW5kIHVzaW5nICRERVNDUklQVElPTiIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBUZXN0aW5nIHBvdGVudGlhbCBtYWtlIGF0ICRNQUtFX0NBTkRJREFURSwgZm91bmQgdXNpbmcgJERFU0NSSVBUSU9OIiA+JjY7fQotCi0gICAgIyBUcmFuc2xhdGUgImdjYyAtRSIgaW50byAiYHdoaWNoIGdjY2AgLUUiIGllCi0gICAgIyBleHRyYWN0IHRoZSBmdWxsIHBhdGggdG8gdGhlIGJpbmFyeSBhbmQgYXQgdGhlCi0gICAgIyBzYW1lIHRpbWUgbWFpbnRhaW4gYW55IGFyZ3VtZW50cyBwYXNzZWQgdG8gaXQuCi0gICAgIyBUaGUgY29tbWFuZCBNVVNUIGV4aXN0IGluIHRoZSBwYXRoLCBvciBlbHNlIQotICAgIHRtcD0iJE1BS0VfQ0FORElEQVRFIgotICAgIGNhcj0iJHt0bXAlJSAqfSIKLSAgICB0bXA9IiRNQUtFX0NBTkRJREFURSBFT0wiCi0gICAgY2RyPSIke3RtcCMqIH0iCi0gICAgIyBPbiB3aW5kb3dzIHdlIHdhbnQgcGF0aHMgd2l0aG91dCBzcGFjZXMuCi0gICAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TIiA9ICJ4d2luZG93cyI7IHRoZW4KLQotICAgICMgVHJhbnNsYXRlIGxvbmcgY3lnZHJpdmUgb3IgQzpcc2Rmc2YgcGF0aAotICAgICMgaW50byBhIHNob3J0IG1peGVkIG1vZGUgcGF0aCB0aGF0IGhhcyBubwotICAgICMgc3BhY2VzIGluIGl0LgotICAgIHRtcD0iJGNhciIKLQotICAgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PUyIgPSAieHdpbmRvd3MiOyB0aGVuCi0gICAgICAgIHRtcD1gJENZR1BBVEggLXUgIiRjYXIiYAotICAgICAgICB0bXA9YHdoaWNoICIkdG1wImAKLSAgICAgICAgIyBJZiBmaWxlIGV4aXN0cyB3aXRoIC5leGUgYXBwZW5kZWQsIHRoYXQncyB0aGUgcmVhbCBmaWxlbmFtZQotICAgICAgICAjIGFuZCBjeWdwYXRoIG5lZWRzIHRoYXQgdG8gY29udmVydCB0byBzaG9ydCBzdHlsZSBwYXRoLgotICAgICAgICBpZiB0ZXN0IC1mICIke3RtcH0uZXhlIjsgdGhlbgotICAgICAgICAgICB0bXA9IiR7dG1wfS5leGUiCi0gICAgICAgIGVsaWYgdGVzdCAtZiAiJHt0bXB9LmNtZCI7IHRoZW4KLSAgICAgICAgICAgdG1wPSIke3RtcH0uY21kIgotICAgICAgICBmaQotICAgICAgICAjIENvbnZlcnQgdG8gQzovIG1peGVkIHN0eWxlIHBhdGggd2l0aG91dCBzcGFjZXMuCi0gICAgICAgICB0bXA9YCRDWUdQQVRIIC1zIC1tICIkdG1wImAKLSAgICBmaQotICAgIGNhcj0iJHRtcCIKLQotICAgIGVsc2UKLSAgICAgICAgIyAid2hpY2giIGlzIG5vdCBwb3J0YWJsZSwgYnV0IGlzIHVzZWQgaGVyZQotICAgICAgICAjIGJlY2F1c2Ugd2Uga25vdyB0aGF0IHRoZSBjb21tYW5kIGV4aXN0cyEKLSAgICAgICAgY2FyPWB3aGljaCAkY2FyYAotICAgIGZpCi0gICAgaWYgdGVzdCAieCRjZHIiICE9IHhFT0w7IHRoZW4KLSAgICAgICAgTUFLRV9DQU5ESURBVEU9IiRjYXIgJHtjZHIlICp9IgotICAgIGVsc2UKLSAgICAgICAgTUFLRV9DQU5ESURBVEU9IiRjYXIiCi0gICAgZmkKLQotICAgIE1BS0VfVkVSU0lPTl9TVFJJTkc9YCRNQUtFX0NBTkRJREFURSAtLXZlcnNpb24gfCAkSEVBRCAtbiAxYAotICAgIElTX0dOVV9NQUtFPWAkRUNITyAkTUFLRV9WRVJTSU9OX1NUUklORyB8ICRHUkVQICdHTlUgTWFrZSdgCi0gICAgaWYgdGVzdCAieCRJU19HTlVfTUFLRSIgPSB4OyB0aGVuCi0gICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IEZvdW5kIHBvdGVudGlhbCBtYWtlIGF0ICRNQUtFX0NBTkRJREFURSwgaG93ZXZlciwgdGhpcyBpcyBub3QgR05VIE1ha2UuIElnbm9yaW5nLiIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBGb3VuZCBwb3RlbnRpYWwgbWFrZSBhdCAkTUFLRV9DQU5ESURBVEUsIGhvd2V2ZXIsIHRoaXMgaXMgbm90IEdOVSBNYWtlLiBJZ25vcmluZy4iID4mNjt9Ci0gICAgZWxzZQotICAgICAgSVNfTU9ERVJOX01BS0U9YCRFQ0hPICRNQUtFX1ZFUlNJT05fU1RSSU5HIHwgJEdSRVAgJzMuOFsxMjM0Njc4OV0nYAotICAgICAgaWYgdGVzdCAieCRJU19NT0RFUk5fTUFLRSIgPSB4OyB0aGVuCi0gICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogRm91bmQgR05VIG1ha2UgYXQgJE1BS0VfQ0FORElEQVRFLCBob3dldmVyIHRoaXMgaXMgbm90IHZlcnNpb24gMy44MSBvciBsYXRlci4gKGl0IGlzOiAkTUFLRV9WRVJTSU9OX1NUUklORykuIElnbm9yaW5nLiIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBGb3VuZCBHTlUgbWFrZSBhdCAkTUFLRV9DQU5ESURBVEUsIGhvd2V2ZXIgdGhpcyBpcyBub3QgdmVyc2lvbiAzLjgxIG9yIGxhdGVyLiAoaXQgaXM6ICRNQUtFX1ZFUlNJT05fU1RSSU5HKS4gSWdub3JpbmcuIiA+JjY7fQotICAgICAgZWxzZQotICAgICAgICBGT1VORF9NQUtFPSRNQUtFX0NBTkRJREFURQotICAgICAgZmkKLSAgICBmaQotICBmaQotCi0KLSAgICBpZiB0ZXN0ICJ4JEZPVU5EX01BS0UiID0geDsgdGhlbgotICAgICAgZm9yIGFjX3Byb2cgaW4gbWFrZQotZG8KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wYXRoX0NIRUNLX01BS0Urc2V0fSIgPSBzZXQ7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBjYXNlICRDSEVDS19NQUtFIGluCi0gIFtcXC9dKiB8ID86W1xcL10qKQotICBhY19jdl9wYXRoX0NIRUNLX01BS0U9IiRDSEVDS19NQUtFIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcGF0aF9DSEVDS19NQUtFPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi0gIDs7Ci1lc2FjCi1maQotQ0hFQ0tfTUFLRT0kYWNfY3ZfcGF0aF9DSEVDS19NQUtFCi1pZiB0ZXN0IC1uICIkQ0hFQ0tfTUFLRSI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRDSEVDS19NQUtFIiA+JjUKLSRhc19lY2hvICIkQ0hFQ0tfTUFLRSIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotCi0gIHRlc3QgLW4gIiRDSEVDS19NQUtFIiAmJiBicmVhawotZG9uZQotCi0KLSAgTUFLRV9DQU5ESURBVEU9IiIkQ0hFQ0tfTUFLRSIiCi0gIERFU0NSSVBUSU9OPSJtYWtlIGluIFBBVEgiCi0gIGlmIHRlc3QgIngkTUFLRV9DQU5ESURBVEUiICE9IHg7IHRoZW4KLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRlc3RpbmcgcG90ZW50aWFsIG1ha2UgYXQgJE1BS0VfQ0FORElEQVRFLCBmb3VuZCB1c2luZyAkREVTQ1JJUFRJT04iID4mNQotJGFzX2VjaG8gIiRhc19tZTogVGVzdGluZyBwb3RlbnRpYWwgbWFrZSBhdCAkTUFLRV9DQU5ESURBVEUsIGZvdW5kIHVzaW5nICRERVNDUklQVElPTiIgPiY2O30KLQotICAgICMgVHJhbnNsYXRlICJnY2MgLUUiIGludG8gImB3aGljaCBnY2NgIC1FIiBpZQotICAgICMgZXh0cmFjdCB0aGUgZnVsbCBwYXRoIHRvIHRoZSBiaW5hcnkgYW5kIGF0IHRoZQotICAgICMgc2FtZSB0aW1lIG1haW50YWluIGFueSBhcmd1bWVudHMgcGFzc2VkIHRvIGl0LgotICAgICMgVGhlIGNvbW1hbmQgTVVTVCBleGlzdCBpbiB0aGUgcGF0aCwgb3IgZWxzZSEKLSAgICB0bXA9IiRNQUtFX0NBTkRJREFURSIKLSAgICBjYXI9IiR7dG1wJSUgKn0iCi0gICAgdG1wPSIkTUFLRV9DQU5ESURBVEUgRU9MIgotICAgIGNkcj0iJHt0bXAjKiB9IgotICAgICMgT24gd2luZG93cyB3ZSB3YW50IHBhdGhzIHdpdGhvdXQgc3BhY2VzLgotICAgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PUyIgPSAieHdpbmRvd3MiOyB0aGVuCi0KLSAgICAjIFRyYW5zbGF0ZSBsb25nIGN5Z2RyaXZlIG9yIEM6XHNkZnNmIHBhdGgKLSAgICAjIGludG8gYSBzaG9ydCBtaXhlZCBtb2RlIHBhdGggdGhhdCBoYXMgbm8KLSAgICAjIHNwYWNlcyBpbiBpdC4KLSAgICB0bXA9IiRjYXIiCi0KLSAgICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1MiID0gInh3aW5kb3dzIjsgdGhlbgotICAgICAgICB0bXA9YCRDWUdQQVRIIC11ICIkY2FyImAKLSAgICAgICAgdG1wPWB3aGljaCAiJHRtcCJgCi0gICAgICAgICMgSWYgZmlsZSBleGlzdHMgd2l0aCAuZXhlIGFwcGVuZGVkLCB0aGF0J3MgdGhlIHJlYWwgZmlsZW5hbWUKLSAgICAgICAgIyBhbmQgY3lncGF0aCBuZWVkcyB0aGF0IHRvIGNvbnZlcnQgdG8gc2hvcnQgc3R5bGUgcGF0aC4KLSAgICAgICAgaWYgdGVzdCAtZiAiJHt0bXB9LmV4ZSI7IHRoZW4KLSAgICAgICAgICAgdG1wPSIke3RtcH0uZXhlIgotICAgICAgICBlbGlmIHRlc3QgLWYgIiR7dG1wfS5jbWQiOyB0aGVuCi0gICAgICAgICAgIHRtcD0iJHt0bXB9LmNtZCIKLSAgICAgICAgZmkKLSAgICAgICAgIyBDb252ZXJ0IHRvIEM6LyBtaXhlZCBzdHlsZSBwYXRoIHdpdGhvdXQgc3BhY2VzLgotICAgICAgICAgdG1wPWAkQ1lHUEFUSCAtcyAtbSAiJHRtcCJgCi0gICAgZmkKLSAgICBjYXI9IiR0bXAiCi0KLSAgICBlbHNlCi0gICAgICAgICMgIndoaWNoIiBpcyBub3QgcG9ydGFibGUsIGJ1dCBpcyB1c2VkIGhlcmUKLSAgICAgICAgIyBiZWNhdXNlIHdlIGtub3cgdGhhdCB0aGUgY29tbWFuZCBleGlzdHMhCi0gICAgICAgIGNhcj1gd2hpY2ggJGNhcmAKLSAgICBmaQotICAgIGlmIHRlc3QgIngkY2RyIiAhPSB4RU9MOyB0aGVuCi0gICAgICAgIE1BS0VfQ0FORElEQVRFPSIkY2FyICR7Y2RyJSAqfSIKLSAgICBlbHNlCi0gICAgICAgIE1BS0VfQ0FORElEQVRFPSIkY2FyIgotICAgIGZpCi0KLSAgICBNQUtFX1ZFUlNJT05fU1RSSU5HPWAkTUFLRV9DQU5ESURBVEUgLS12ZXJzaW9uIHwgJEhFQUQgLW4gMWAKLSAgICBJU19HTlVfTUFLRT1gJEVDSE8gJE1BS0VfVkVSU0lPTl9TVFJJTkcgfCAkR1JFUCAnR05VIE1ha2UnYAotICAgIGlmIHRlc3QgIngkSVNfR05VX01BS0UiID0geDsgdGhlbgotICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBGb3VuZCBwb3RlbnRpYWwgbWFrZSBhdCAkTUFLRV9DQU5ESURBVEUsIGhvd2V2ZXIsIHRoaXMgaXMgbm90IEdOVSBNYWtlLiBJZ25vcmluZy4iID4mNQotJGFzX2VjaG8gIiRhc19tZTogRm91bmQgcG90ZW50aWFsIG1ha2UgYXQgJE1BS0VfQ0FORElEQVRFLCBob3dldmVyLCB0aGlzIGlzIG5vdCBHTlUgTWFrZS4gSWdub3JpbmcuIiA+JjY7fQotICAgIGVsc2UKLSAgICAgIElTX01PREVSTl9NQUtFPWAkRUNITyAkTUFLRV9WRVJTSU9OX1NUUklORyB8ICRHUkVQICczLjhbMTIzNDY3ODldJ2AKLSAgICAgIGlmIHRlc3QgIngkSVNfTU9ERVJOX01BS0UiID0geDsgdGhlbgotICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IEZvdW5kIEdOVSBtYWtlIGF0ICRNQUtFX0NBTkRJREFURSwgaG93ZXZlciB0aGlzIGlzIG5vdCB2ZXJzaW9uIDMuODEgb3IgbGF0ZXIuIChpdCBpczogJE1BS0VfVkVSU0lPTl9TVFJJTkcpLiBJZ25vcmluZy4iID4mNQotJGFzX2VjaG8gIiRhc19tZTogRm91bmQgR05VIG1ha2UgYXQgJE1BS0VfQ0FORElEQVRFLCBob3dldmVyIHRoaXMgaXMgbm90IHZlcnNpb24gMy44MSBvciBsYXRlci4gKGl0IGlzOiAkTUFLRV9WRVJTSU9OX1NUUklORykuIElnbm9yaW5nLiIgPiY2O30KLSAgICAgIGVsc2UKLSAgICAgICAgRk9VTkRfTUFLRT0kTUFLRV9DQU5ESURBVEUKLSAgICAgIGZpCi0gICAgZmkKLSAgZmkKLQotICAgIGZpCi0KLSAgICBpZiB0ZXN0ICJ4JEZPVU5EX01BS0UiID0geDsgdGhlbgotICAgICAgaWYgdGVzdCAieCRUT09MU19ESVIiICE9IHg7IHRoZW4KLSAgICAgICAgIyBXZSBoYXZlIGEgdG9vbHMtZGlyLCBjaGVjayB0aGF0IGFzIHdlbGwgYmVmb3JlIGdpdmluZyB1cC4KLSAgICAgICAgT0xEX1BBVEg9JFBBVEgKLSAgICAgICAgUEFUSD0kVE9PTFNfRElSOiRQQVRICi0gICAgICAgIGZvciBhY19wcm9nIGluIGdtYWtlCi1kbwotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3BhdGhfQ0hFQ0tfVE9PTFNESVJfR01BS0Urc2V0fSIgPSBzZXQ7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBjYXNlICRDSEVDS19UT09MU0RJUl9HTUFLRSBpbgotICBbXFwvXSogfCA/OltcXC9dKikKLSAgYWNfY3ZfcGF0aF9DSEVDS19UT09MU0RJUl9HTUFLRT0iJENIRUNLX1RPT0xTRElSX0dNQUtFIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcGF0aF9DSEVDS19UT09MU0RJUl9HTUFLRT0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotICA7OwotZXNhYwotZmkKLUNIRUNLX1RPT0xTRElSX0dNQUtFPSRhY19jdl9wYXRoX0NIRUNLX1RPT0xTRElSX0dNQUtFCi1pZiB0ZXN0IC1uICIkQ0hFQ0tfVE9PTFNESVJfR01BS0UiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ0hFQ0tfVE9PTFNESVJfR01BS0UiID4mNQotJGFzX2VjaG8gIiRDSEVDS19UT09MU0RJUl9HTUFLRSIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotCi0gIHRlc3QgLW4gIiRDSEVDS19UT09MU0RJUl9HTUFLRSIgJiYgYnJlYWsKLWRvbmUKLQotCi0gIE1BS0VfQ0FORElEQVRFPSIiJENIRUNLX1RPT0xTRElSX0dNQUtFIiIKLSAgREVTQ1JJUFRJT049ImdtYWtlIGluIHRvb2xzLWRpciIKLSAgaWYgdGVzdCAieCRNQUtFX0NBTkRJREFURSIgIT0geDsgdGhlbgotICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGVzdGluZyBwb3RlbnRpYWwgbWFrZSBhdCAkTUFLRV9DQU5ESURBVEUsIGZvdW5kIHVzaW5nICRERVNDUklQVElPTiIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBUZXN0aW5nIHBvdGVudGlhbCBtYWtlIGF0ICRNQUtFX0NBTkRJREFURSwgZm91bmQgdXNpbmcgJERFU0NSSVBUSU9OIiA+JjY7fQotCi0gICAgIyBUcmFuc2xhdGUgImdjYyAtRSIgaW50byAiYHdoaWNoIGdjY2AgLUUiIGllCi0gICAgIyBleHRyYWN0IHRoZSBmdWxsIHBhdGggdG8gdGhlIGJpbmFyeSBhbmQgYXQgdGhlCi0gICAgIyBzYW1lIHRpbWUgbWFpbnRhaW4gYW55IGFyZ3VtZW50cyBwYXNzZWQgdG8gaXQuCi0gICAgIyBUaGUgY29tbWFuZCBNVVNUIGV4aXN0IGluIHRoZSBwYXRoLCBvciBlbHNlIQotICAgIHRtcD0iJE1BS0VfQ0FORElEQVRFIgotICAgIGNhcj0iJHt0bXAlJSAqfSIKLSAgICB0bXA9IiRNQUtFX0NBTkRJREFURSBFT0wiCi0gICAgY2RyPSIke3RtcCMqIH0iCi0gICAgIyBPbiB3aW5kb3dzIHdlIHdhbnQgcGF0aHMgd2l0aG91dCBzcGFjZXMuCi0gICAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TIiA9ICJ4d2luZG93cyI7IHRoZW4KLQotICAgICMgVHJhbnNsYXRlIGxvbmcgY3lnZHJpdmUgb3IgQzpcc2Rmc2YgcGF0aAotICAgICMgaW50byBhIHNob3J0IG1peGVkIG1vZGUgcGF0aCB0aGF0IGhhcyBubwotICAgICMgc3BhY2VzIGluIGl0LgotICAgIHRtcD0iJGNhciIKLQotICAgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PUyIgPSAieHdpbmRvd3MiOyB0aGVuCi0gICAgICAgIHRtcD1gJENZR1BBVEggLXUgIiRjYXIiYAotICAgICAgICB0bXA9YHdoaWNoICIkdG1wImAKLSAgICAgICAgIyBJZiBmaWxlIGV4aXN0cyB3aXRoIC5leGUgYXBwZW5kZWQsIHRoYXQncyB0aGUgcmVhbCBmaWxlbmFtZQotICAgICAgICAjIGFuZCBjeWdwYXRoIG5lZWRzIHRoYXQgdG8gY29udmVydCB0byBzaG9ydCBzdHlsZSBwYXRoLgotICAgICAgICBpZiB0ZXN0IC1mICIke3RtcH0uZXhlIjsgdGhlbgotICAgICAgICAgICB0bXA9IiR7dG1wfS5leGUiCi0gICAgICAgIGVsaWYgdGVzdCAtZiAiJHt0bXB9LmNtZCI7IHRoZW4KLSAgICAgICAgICAgdG1wPSIke3RtcH0uY21kIgotICAgICAgICBmaQotICAgICAgICAjIENvbnZlcnQgdG8gQzovIG1peGVkIHN0eWxlIHBhdGggd2l0aG91dCBzcGFjZXMuCi0gICAgICAgICB0bXA9YCRDWUdQQVRIIC1zIC1tICIkdG1wImAKLSAgICBmaQotICAgIGNhcj0iJHRtcCIKLQotICAgIGVsc2UKLSAgICAgICAgIyAid2hpY2giIGlzIG5vdCBwb3J0YWJsZSwgYnV0IGlzIHVzZWQgaGVyZQotICAgICAgICAjIGJlY2F1c2Ugd2Uga25vdyB0aGF0IHRoZSBjb21tYW5kIGV4aXN0cyEKLSAgICAgICAgY2FyPWB3aGljaCAkY2FyYAotICAgIGZpCi0gICAgaWYgdGVzdCAieCRjZHIiICE9IHhFT0w7IHRoZW4KLSAgICAgICAgTUFLRV9DQU5ESURBVEU9IiRjYXIgJHtjZHIlICp9IgotICAgIGVsc2UKLSAgICAgICAgTUFLRV9DQU5ESURBVEU9IiRjYXIiCi0gICAgZmkKLQotICAgIE1BS0VfVkVSU0lPTl9TVFJJTkc9YCRNQUtFX0NBTkRJREFURSAtLXZlcnNpb24gfCAkSEVBRCAtbiAxYAotICAgIElTX0dOVV9NQUtFPWAkRUNITyAkTUFLRV9WRVJTSU9OX1NUUklORyB8ICRHUkVQICdHTlUgTWFrZSdgCi0gICAgaWYgdGVzdCAieCRJU19HTlVfTUFLRSIgPSB4OyB0aGVuCi0gICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IEZvdW5kIHBvdGVudGlhbCBtYWtlIGF0ICRNQUtFX0NBTkRJREFURSwgaG93ZXZlciwgdGhpcyBpcyBub3QgR05VIE1ha2UuIElnbm9yaW5nLiIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBGb3VuZCBwb3RlbnRpYWwgbWFrZSBhdCAkTUFLRV9DQU5ESURBVEUsIGhvd2V2ZXIsIHRoaXMgaXMgbm90IEdOVSBNYWtlLiBJZ25vcmluZy4iID4mNjt9Ci0gICAgZWxzZQotICAgICAgSVNfTU9ERVJOX01BS0U9YCRFQ0hPICRNQUtFX1ZFUlNJT05fU1RSSU5HIHwgJEdSRVAgJzMuOFsxMjM0Njc4OV0nYAotICAgICAgaWYgdGVzdCAieCRJU19NT0RFUk5fTUFLRSIgPSB4OyB0aGVuCi0gICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogRm91bmQgR05VIG1ha2UgYXQgJE1BS0VfQ0FORElEQVRFLCBob3dldmVyIHRoaXMgaXMgbm90IHZlcnNpb24gMy44MSBvciBsYXRlci4gKGl0IGlzOiAkTUFLRV9WRVJTSU9OX1NUUklORykuIElnbm9yaW5nLiIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBGb3VuZCBHTlUgbWFrZSBhdCAkTUFLRV9DQU5ESURBVEUsIGhvd2V2ZXIgdGhpcyBpcyBub3QgdmVyc2lvbiAzLjgxIG9yIGxhdGVyLiAoaXQgaXM6ICRNQUtFX1ZFUlNJT05fU1RSSU5HKS4gSWdub3JpbmcuIiA+JjY7fQotICAgICAgZWxzZQotICAgICAgICBGT1VORF9NQUtFPSRNQUtFX0NBTkRJREFURQotICAgICAgZmkKLSAgICBmaQotICBmaQotCi0gICAgICAgIGlmIHRlc3QgIngkRk9VTkRfTUFLRSIgPSB4OyB0aGVuCi0gICAgICAgICAgZm9yIGFjX3Byb2cgaW4gbWFrZQotZG8KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wYXRoX0NIRUNLX1RPT0xTRElSX01BS0Urc2V0fSIgPSBzZXQ7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBjYXNlICRDSEVDS19UT09MU0RJUl9NQUtFIGluCi0gIFtcXC9dKiB8ID86W1xcL10qKQotICBhY19jdl9wYXRoX0NIRUNLX1RPT0xTRElSX01BS0U9IiRDSEVDS19UT09MU0RJUl9NQUtFIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcGF0aF9DSEVDS19UT09MU0RJUl9NQUtFPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi0gIDs7Ci1lc2FjCi1maQotQ0hFQ0tfVE9PTFNESVJfTUFLRT0kYWNfY3ZfcGF0aF9DSEVDS19UT09MU0RJUl9NQUtFCi1pZiB0ZXN0IC1uICIkQ0hFQ0tfVE9PTFNESVJfTUFLRSI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRDSEVDS19UT09MU0RJUl9NQUtFIiA+JjUKLSRhc19lY2hvICIkQ0hFQ0tfVE9PTFNESVJfTUFLRSIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotCi0gIHRlc3QgLW4gIiRDSEVDS19UT09MU0RJUl9NQUtFIiAmJiBicmVhawotZG9uZQotCi0KLSAgTUFLRV9DQU5ESURBVEU9IiIkQ0hFQ0tfVE9PTFNESVJfTUFLRSIiCi0gIERFU0NSSVBUSU9OPSJtYWtlIGluIHRvb2xzLWRpciIKLSAgaWYgdGVzdCAieCRNQUtFX0NBTkRJREFURSIgIT0geDsgdGhlbgotICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGVzdGluZyBwb3RlbnRpYWwgbWFrZSBhdCAkTUFLRV9DQU5ESURBVEUsIGZvdW5kIHVzaW5nICRERVNDUklQVElPTiIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBUZXN0aW5nIHBvdGVudGlhbCBtYWtlIGF0ICRNQUtFX0NBTkRJREFURSwgZm91bmQgdXNpbmcgJERFU0NSSVBUSU9OIiA+JjY7fQotCi0gICAgIyBUcmFuc2xhdGUgImdjYyAtRSIgaW50byAiYHdoaWNoIGdjY2AgLUUiIGllCi0gICAgIyBleHRyYWN0IHRoZSBmdWxsIHBhdGggdG8gdGhlIGJpbmFyeSBhbmQgYXQgdGhlCi0gICAgIyBzYW1lIHRpbWUgbWFpbnRhaW4gYW55IGFyZ3VtZW50cyBwYXNzZWQgdG8gaXQuCi0gICAgIyBUaGUgY29tbWFuZCBNVVNUIGV4aXN0IGluIHRoZSBwYXRoLCBvciBlbHNlIQotICAgIHRtcD0iJE1BS0VfQ0FORElEQVRFIgotICAgIGNhcj0iJHt0bXAlJSAqfSIKLSAgICB0bXA9IiRNQUtFX0NBTkRJREFURSBFT0wiCi0gICAgY2RyPSIke3RtcCMqIH0iCi0gICAgIyBPbiB3aW5kb3dzIHdlIHdhbnQgcGF0aHMgd2l0aG91dCBzcGFjZXMuCi0gICAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TIiA9ICJ4d2luZG93cyI7IHRoZW4KLQotICAgICMgVHJhbnNsYXRlIGxvbmcgY3lnZHJpdmUgb3IgQzpcc2Rmc2YgcGF0aAotICAgICMgaW50byBhIHNob3J0IG1peGVkIG1vZGUgcGF0aCB0aGF0IGhhcyBubwotICAgICMgc3BhY2VzIGluIGl0LgotICAgIHRtcD0iJGNhciIKLQotICAgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PUyIgPSAieHdpbmRvd3MiOyB0aGVuCi0gICAgICAgIHRtcD1gJENZR1BBVEggLXUgIiRjYXIiYAotICAgICAgICB0bXA9YHdoaWNoICIkdG1wImAKLSAgICAgICAgIyBJZiBmaWxlIGV4aXN0cyB3aXRoIC5leGUgYXBwZW5kZWQsIHRoYXQncyB0aGUgcmVhbCBmaWxlbmFtZQotICAgICAgICAjIGFuZCBjeWdwYXRoIG5lZWRzIHRoYXQgdG8gY29udmVydCB0byBzaG9ydCBzdHlsZSBwYXRoLgotICAgICAgICBpZiB0ZXN0IC1mICIke3RtcH0uZXhlIjsgdGhlbgotICAgICAgICAgICB0bXA9IiR7dG1wfS5leGUiCi0gICAgICAgIGVsaWYgdGVzdCAtZiAiJHt0bXB9LmNtZCI7IHRoZW4KLSAgICAgICAgICAgdG1wPSIke3RtcH0uY21kIgotICAgICAgICBmaQotICAgICAgICAjIENvbnZlcnQgdG8gQzovIG1peGVkIHN0eWxlIHBhdGggd2l0aG91dCBzcGFjZXMuCi0gICAgICAgICB0bXA9YCRDWUdQQVRIIC1zIC1tICIkdG1wImAKLSAgICBmaQotICAgIGNhcj0iJHRtcCIKLQotICAgIGVsc2UKLSAgICAgICAgIyAid2hpY2giIGlzIG5vdCBwb3J0YWJsZSwgYnV0IGlzIHVzZWQgaGVyZQotICAgICAgICAjIGJlY2F1c2Ugd2Uga25vdyB0aGF0IHRoZSBjb21tYW5kIGV4aXN0cyEKLSAgICAgICAgY2FyPWB3aGljaCAkY2FyYAotICAgIGZpCi0gICAgaWYgdGVzdCAieCRjZHIiICE9IHhFT0w7IHRoZW4KLSAgICAgICAgTUFLRV9DQU5ESURBVEU9IiRjYXIgJHtjZHIlICp9IgotICAgIGVsc2UKLSAgICAgICAgTUFLRV9DQU5ESURBVEU9IiRjYXIiCi0gICAgZmkKLQotICAgIE1BS0VfVkVSU0lPTl9TVFJJTkc9YCRNQUtFX0NBTkRJREFURSAtLXZlcnNpb24gfCAkSEVBRCAtbiAxYAotICAgIElTX0dOVV9NQUtFPWAkRUNITyAkTUFLRV9WRVJTSU9OX1NUUklORyB8ICRHUkVQICdHTlUgTWFrZSdgCi0gICAgaWYgdGVzdCAieCRJU19HTlVfTUFLRSIgPSB4OyB0aGVuCi0gICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IEZvdW5kIHBvdGVudGlhbCBtYWtlIGF0ICRNQUtFX0NBTkRJREFURSwgaG93ZXZlciwgdGhpcyBpcyBub3QgR05VIE1ha2UuIElnbm9yaW5nLiIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBGb3VuZCBwb3RlbnRpYWwgbWFrZSBhdCAkTUFLRV9DQU5ESURBVEUsIGhvd2V2ZXIsIHRoaXMgaXMgbm90IEdOVSBNYWtlLiBJZ25vcmluZy4iID4mNjt9Ci0gICAgZWxzZQotICAgICAgSVNfTU9ERVJOX01BS0U9YCRFQ0hPICRNQUtFX1ZFUlNJT05fU1RSSU5HIHwgJEdSRVAgJzMuOFsxMjM0Njc4OV0nYAotICAgICAgaWYgdGVzdCAieCRJU19NT0RFUk5fTUFLRSIgPSB4OyB0aGVuCi0gICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogRm91bmQgR05VIG1ha2UgYXQgJE1BS0VfQ0FORElEQVRFLCBob3dldmVyIHRoaXMgaXMgbm90IHZlcnNpb24gMy44MSBvciBsYXRlci4gKGl0IGlzOiAkTUFLRV9WRVJTSU9OX1NUUklORykuIElnbm9yaW5nLiIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBGb3VuZCBHTlUgbWFrZSBhdCAkTUFLRV9DQU5ESURBVEUsIGhvd2V2ZXIgdGhpcyBpcyBub3QgdmVyc2lvbiAzLjgxIG9yIGxhdGVyLiAoaXQgaXM6ICRNQUtFX1ZFUlNJT05fU1RSSU5HKS4gSWdub3JpbmcuIiA+JjY7fQotICAgICAgZWxzZQotICAgICAgICBGT1VORF9NQUtFPSRNQUtFX0NBTkRJREFURQotICAgICAgZmkKLSAgICBmaQotICBmaQotCi0gICAgICAgIGZpCi0gICAgICAgIFBBVEg9JE9MRF9QQVRICi0gICAgICBmaQotICAgIGZpCi0KLSAgICBpZiB0ZXN0ICJ4JEZPVU5EX01BS0UiID0geDsgdGhlbgotICAgICAgYXNfZm5fZXJyb3IgJD8gIkNhbm5vdCBmaW5kIEdOVSBtYWtlIDMuODEgb3IgbmV3ZXIhIFBsZWFzZSBwdXQgaXQgaW4gdGhlIHBhdGgsIG9yIGFkZCBlLmcuIE1BS0U9L29wdC9nbWFrZTMuODEvbWFrZSBhcyBhcmd1bWVudCB0byBjb25maWd1cmUuIiAiJExJTkVOTyIgNQotICAgIGZpCi0gIGZpCi0KLSAgTUFLRT0kRk9VTkRfTUFLRQotCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVXNpbmcgR05VIG1ha2UgMy44MSAob3IgbGF0ZXIpIGF0ICRGT1VORF9NQUtFICh2ZXJzaW9uOiAkTUFLRV9WRVJTSU9OX1NUUklORykiID4mNQotJGFzX2VjaG8gIiRhc19tZTogVXNpbmcgR05VIG1ha2UgMy44MSAob3IgbGF0ZXIpIGF0ICRGT1VORF9NQUtFICh2ZXJzaW9uOiAkTUFLRV9WRVJTSU9OX1NUUklORykiID4mNjt9Ci0KLQotCi0gICAgZm9yIGFjX3Byb2cgaW4gcm0KLWRvCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9STStzZXR9IiA9IHNldDsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGNhc2UgJFJNIGluCi0gIFtcXC9dKiB8ID86W1xcL10qKQotICBhY19jdl9wYXRoX1JNPSIkUk0iICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBhY19jdl9wYXRoX1JNPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi0gIDs7Ci1lc2FjCi1maQotUk09JGFjX2N2X3BhdGhfUk0KLWlmIHRlc3QgLW4gIiRSTSI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRSTSIgPiY1Ci0kYXNfZWNobyAiJFJNIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotCi0KLSAgdGVzdCAtbiAiJFJNIiAmJiBicmVhawotZG9uZQotCi0KLSAgICBpZiB0ZXN0ICJ4JFJNIiA9IHg7IHRoZW4KLSAgICAgICAgaWYgdGVzdCAieHJtIiA9IHg7IHRoZW4KLSAgICAgICAgICBQUk9HX05BTUU9cm0KLSAgICAgICAgZWxzZQotICAgICAgICAgIFBST0dfTkFNRT1ybQotICAgICAgICBmaQotICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IENvdWxkIG5vdCBmaW5kICRQUk9HX05BTUUhIiA+JjUKLSRhc19lY2hvICIkYXNfbWU6IENvdWxkIG5vdCBmaW5kICRQUk9HX05BTUUhIiA+JjY7fQotICAgICAgICBhc19mbl9lcnJvciAkPyAiQ2Fubm90IGNvbnRpbnVlIiAiJExJTkVOTyIgNQotICAgIGZpCi0KLQorIyBBbHdheXMgZm9yY2Ugcm0uCiBSTT0iJFJNIC1mIgogCi0KLSAgICAjIFRlc3QgaWYgZmluZCBzdXBwb3J0cyAtZGVsZXRlCi0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiBmaW5kIHN1cHBvcnRzIC1kZWxldGUiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgZmluZCBzdXBwb3J0cyAtZGVsZXRlLi4uICIgPiY2OyB9Ci0gICAgRklORF9ERUxFVEU9Ii1kZWxldGUiCi0KLSAgICBERUxFVEVESVI9YG1rdGVtcCAtZCB0bXAuWFhYWFhYWFhYWGAgfHwgKGVjaG8gQ291bGQgbm90IGNyZWF0ZSB0ZW1wb3JhcnkgZGlyZWN0b3J5ITsgZXhpdCAkPykKLQotICAgIGVjaG8gSGVqc2FuID4gJERFTEVURURJUi9UZXN0SWZGaW5kU3VwcG9ydHNEZWxldGUKLQotICAgIFRFU1RfREVMRVRFPWAkRklORCAiJERFTEVURURJUiIgLW5hbWUgVGVzdElmRmluZFN1cHBvcnRzRGVsZXRlICRGSU5EX0RFTEVURSAyPiYxYAotICAgIGlmIHRlc3QgLWYgJERFTEVURURJUi9UZXN0SWZGaW5kU3VwcG9ydHNEZWxldGU7IHRoZW4KLSAgICAgICAgIyBObywgaXQgZG9lcyBub3QuCi0gICAgICAgIHJtICRERUxFVEVESVIvVGVzdElmRmluZFN1cHBvcnRzRGVsZXRlCi0gICAgICAgIEZJTkRfREVMRVRFPSItZXhlYyBybSBce1x9IFwrIgotICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLSAgICBlbHNlCi0gICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQotJGFzX2VjaG8gInllcyIgPiY2OyB9Ci0gICAgZmkKLSAgICBybWRpciAkREVMRVRFRElSCi0KLQotCi0jIE5vbi1yZXF1aXJlZCBiYXNpYyB0b29scwotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInB3ZCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgcHdkOyBhY193b3JkPSQyCisjIFRoZXNlIGFyZSBub3QgcmVxdWlyZWQgb24gYWxsIHBsYXRmb3JtcworIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjeWdwYXRoIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBjeWdwYXRoOyBhY193b3JkPSQyCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9USEVQV0RDTUQrc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgdGVzdCAiJHthY19jdl9wYXRoX0NZR1BBVEgrc2V0fSIgPSBzZXQ7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQotICBjYXNlICRUSEVQV0RDTUQgaW4KKyAgY2FzZSAkQ1lHUEFUSCBpbgogICBbXFwvXSogfCA/OltcXC9dKikKLSAgYWNfY3ZfcGF0aF9USEVQV0RDTUQ9IiRUSEVQV0RDTUQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICBhY19jdl9wYXRoX0NZR1BBVEg9IiRDWUdQQVRIIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KICAgOzsKICAgKikKICAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgpAQCAtNzM1MCw3ICs2MjEzLDcgQEAKICAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KICAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KICAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3BhdGhfVEhFUFdEQ01EPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgorICAgIGFjX2N2X3BhdGhfQ1lHUEFUSD0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKICAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKICAgICBicmVhayAyCiAgIGZpCkBAIC03MzYxLDI2ICs2MjI0LDI2IEBACiAgIDs7CiBlc2FjCiBmaQotVEhFUFdEQ01EPSRhY19jdl9wYXRoX1RIRVBXRENNRAotaWYgdGVzdCAtbiAiJFRIRVBXRENNRCI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRUSEVQV0RDTUQiID4mNQotJGFzX2VjaG8gIiRUSEVQV0RDTUQiID4mNjsgfQorQ1lHUEFUSD0kYWNfY3ZfcGF0aF9DWUdQQVRICitpZiB0ZXN0IC1uICIkQ1lHUEFUSCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRDWUdQQVRIIiA+JjUKKyRhc19lY2hvICIkQ1lHUEFUSCIgPiY2OyB9CiBlbHNlCiAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiAkYXNfZWNobyAibm8iID4mNjsgfQogZmkKIAogCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImxkZCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgbGRkOyBhY193b3JkPSQyCisjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInJlYWRsaW5rIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSByZWFkbGluazsgYWNfd29yZD0kMgogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3BhdGhfTEREK3NldH0iID0gc2V0OyB0aGVuIDoKK2lmIHRlc3QgIiR7YWNfY3ZfcGF0aF9SRUFETElOSytzZXR9IiA9IHNldDsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCi0gIGNhc2UgJExERCBpbgorICBjYXNlICRSRUFETElOSyBpbgogICBbXFwvXSogfCA/OltcXC9dKikKLSAgYWNfY3ZfcGF0aF9MREQ9IiRMREQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICBhY19jdl9wYXRoX1JFQURMSU5LPSIkUkVBRExJTksiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgogICA7OwogICAqKQogICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCkBAIC03MzkwLDcgKzYyNTMsNyBAQAogICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgogICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwogICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcGF0aF9MREQ9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCisgICAgYWNfY3ZfcGF0aF9SRUFETElOSz0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKICAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKICAgICBicmVhayAyCiAgIGZpCkBAIC03NDAxLDMyICs2MjY0LDI2IEBACiAgIDs7CiBlc2FjCiBmaQotTEREPSRhY19jdl9wYXRoX0xERAotaWYgdGVzdCAtbiAiJExERCI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRMREQiID4mNQotJGFzX2VjaG8gIiRMREQiID4mNjsgfQorUkVBRExJTks9JGFjX2N2X3BhdGhfUkVBRExJTksKK2lmIHRlc3QgLW4gIiRSRUFETElOSyI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRSRUFETElOSyIgPiY1CiskYXNfZWNobyAiJFJFQURMSU5LIiA+JjY7IH0KIGVsc2UKICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKICRhc19lY2hvICJubyIgPiY2OyB9CiBmaQogCiAKLWlmIHRlc3QgIngkTEREIiA9ICJ4IjsgdGhlbgotICAgICMgTGlzdCBzaGFyZWQgbGliIGRlcGVuZGVuY2llcyBpcyB1c2VkIGZvcgotICAgICMgZGVidWcgb3V0cHV0IGFuZCBjaGVja2luZyBmb3IgZm9yYmlkZGVuIGRlcGVuZGVuY2llcy4KLSAgICAjIFdlIGNhbiBidWlsZCB3aXRob3V0IGl0LgotICAgIExERD0idHJ1ZSIKLWZpCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm90b29sIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBvdG9vbDsgYWNfd29yZD0kMgorIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJkZiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgZGY7IGFjX3dvcmQ9JDIKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wYXRoX09UT09MK3NldH0iID0gc2V0OyB0aGVuIDoKK2lmIHRlc3QgIiR7YWNfY3ZfcGF0aF9ERitzZXR9IiA9IHNldDsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCi0gIGNhc2UgJE9UT09MIGluCisgIGNhc2UgJERGIGluCiAgIFtcXC9dKiB8ID86W1xcL10qKQotICBhY19jdl9wYXRoX09UT09MPSIkT1RPT0wiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICBhY19jdl9wYXRoX0RGPSIkREYiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgogICA7OwogICAqKQogICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCkBAIC03NDM2LDcgKzYyOTMsNyBAQAogICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgogICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwogICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcGF0aF9PVE9PTD0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKKyAgICBhY19jdl9wYXRoX0RGPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgogICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQogICAgIGJyZWFrIDIKICAgZmkKQEAgLTc0NDcsMzEgKzYzMDQsMjYgQEAKICAgOzsKIGVzYWMKIGZpCi1PVE9PTD0kYWNfY3ZfcGF0aF9PVE9PTAotaWYgdGVzdCAtbiAiJE9UT09MIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJE9UT09MIiA+JjUKLSRhc19lY2hvICIkT1RPT0wiID4mNjsgfQorREY9JGFjX2N2X3BhdGhfREYKK2lmIHRlc3QgLW4gIiRERiI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRERiIgPiY1CiskYXNfZWNobyAiJERGIiA+JjY7IH0KIGVsc2UKICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKICRhc19lY2hvICJubyIgPiY2OyB9CiBmaQogCiAKLWlmIHRlc3QgIngkT1RPT0wiID0gIngiOyB0aGVuCi0gICBPVE9PTD0idHJ1ZSIKLWZpCi1mb3IgYWNfcHJvZyBpbiByZWFkZWxmIGdyZWFkZWxmCi1kbwotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgorIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJTZXRGaWxlIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBTZXRGaWxlOyBhY193b3JkPSQyCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9SRUFERUxGK3NldH0iID0gc2V0OyB0aGVuIDoKK2lmIHRlc3QgIiR7YWNfY3ZfcGF0aF9TRVRGSUxFK3NldH0iID0gc2V0OyB0aGVuIDoKICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKIGVsc2UKLSAgY2FzZSAkUkVBREVMRiBpbgorICBjYXNlICRTRVRGSUxFIGluCiAgIFtcXC9dKiB8ID86W1xcL10qKQotICBhY19jdl9wYXRoX1JFQURFTEY9IiRSRUFERUxGIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgYWNfY3ZfcGF0aF9TRVRGSUxFPSIkU0VURklMRSIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCiAgIDs7CiAgICopCiAgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKQEAgLTc0ODEsNyArNjMzMyw3IEBACiAgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCiAgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCiAgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBhY19jdl9wYXRoX1JFQURFTEY9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCisgICAgYWNfY3ZfcGF0aF9TRVRGSUxFPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgogICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQogICAgIGJyZWFrIDIKICAgZmkKQEAgLTc0OTIsNDM5ICs2MzQ0LDk5NiBAQAogICA7OwogZXNhYwogZmkKLVJFQURFTEY9JGFjX2N2X3BhdGhfUkVBREVMRgotaWYgdGVzdCAtbiAiJFJFQURFTEYiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkUkVBREVMRiIgPiY1Ci0kYXNfZWNobyAiJFJFQURFTEYiID4mNjsgfQorU0VURklMRT0kYWNfY3ZfcGF0aF9TRVRGSUxFCitpZiB0ZXN0IC1uICIkU0VURklMRSI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRTRVRGSUxFIiA+JjUKKyRhc19lY2hvICIkU0VURklMRSIgPiY2OyB9CiBlbHNlCiAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiAkYXNfZWNobyAibm8iID4mNjsgfQogZmkKIAogCi0gIHRlc3QgLW4gIiRSRUFERUxGIiAmJiBicmVhawotZG9uZQogCi1mb3IgYWNfcHJvZyBpbiBvYmpkdW1wIGdvYmpkdW1wCi1kbwotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3BhdGhfT0JKRFVNUCtzZXR9IiA9IHNldDsgdGhlbiA6CisKKyMgTm93IHdlIGNhbiBkZXRlcm1pbmUgT3BlbkpESyBidWlsZCBhbmQgdGFyZ2V0IHBsYXRmb3Jtcy4gVGhpcyBpcyByZXF1aXJlZCB0bworIyBoYXZlIGVhcmx5IG9uLgorIyBNYWtlIHN1cmUgd2UgY2FuIHJ1biBjb25maWcuc3ViLgorJFNIRUxMICIkYWNfYXV4X2Rpci9jb25maWcuc3ViIiBzdW40ID4vZGV2L251bGwgMj4mMSB8fAorICBhc19mbl9lcnJvciAkPyAiY2Fubm90IHJ1biAkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgIiRMSU5FTk8iIDUKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZS4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9idWlsZCtzZXR9IiA9IHNldDsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCi0gIGNhc2UgJE9CSkRVTVAgaW4KLSAgW1xcL10qIHwgPzpbXFwvXSopCi0gIGFjX2N2X3BhdGhfT0JKRFVNUD0iJE9CSkRVTVAiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBhY19jdl9wYXRoX09CSkRVTVA9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCi0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCisgIGFjX2J1aWxkX2FsaWFzPSRidWlsZF9hbGlhcwordGVzdCAieCRhY19idWlsZF9hbGlhcyIgPSB4ICYmCisgIGFjX2J1aWxkX2FsaWFzPWAkU0hFTEwgIiRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcyJgCit0ZXN0ICJ4JGFjX2J1aWxkX2FsaWFzIiA9IHggJiYKKyAgYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBndWVzcyBidWlsZCB0eXBlOyB5b3UgbXVzdCBzcGVjaWZ5IG9uZSIgIiRMSU5FTk8iIDUKK2FjX2N2X2J1aWxkPWAkU0hFTEwgIiRhY19hdXhfZGlyL2NvbmZpZy5zdWIiICRhY19idWlsZF9hbGlhc2AgfHwKKyAgYXNfZm5fZXJyb3IgJD8gIiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViICRhY19idWlsZF9hbGlhcyBmYWlsZWQiICIkTElORU5PIiA1CiAKLSAgOzsKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2J1aWxkIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfYnVpbGQiID4mNjsgfQorY2FzZSAkYWNfY3ZfYnVpbGQgaW4KKyotKi0qKSA7OworKikgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgdmFsdWUgb2YgY2Fub25pY2FsIGJ1aWxkIiAiJExJTkVOTyIgNSA7OwogZXNhYwotZmkKLU9CSkRVTVA9JGFjX2N2X3BhdGhfT0JKRFVNUAotaWYgdGVzdCAtbiAiJE9CSkRVTVAiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkT0JKRFVNUCIgPiY1Ci0kYXNfZWNobyAiJE9CSkRVTVAiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCitidWlsZD0kYWNfY3ZfYnVpbGQKK2FjX3NhdmVfSUZTPSRJRlM7IElGUz0nLScKK3NldCB4ICRhY19jdl9idWlsZAorc2hpZnQKK2J1aWxkX2NwdT0kMQorYnVpbGRfdmVuZG9yPSQyCitzaGlmdDsgc2hpZnQKKyMgUmVtZW1iZXIsIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgSUZTIGlzIHVzZWQgdG8gY3JlYXRlICQqLAorIyBleGNlcHQgd2l0aCBvbGQgc2hlbGxzOgorYnVpbGRfb3M9JCoKK0lGUz0kYWNfc2F2ZV9JRlMKK2Nhc2UgJGJ1aWxkX29zIGluICpcICopIGJ1aWxkX29zPWBlY2hvICIkYnVpbGRfb3MiIHwgc2VkICdzLyAvLS9nJ2A7OyBlc2FjCiAKIAotICB0ZXN0IC1uICIkT0JKRFVNUCIgJiYgYnJlYWsKLWRvbmUKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJoZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgaGc7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wYXRoX0hHK3NldH0iID0gc2V0OyB0aGVuIDoKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X2hvc3Qrc2V0fSIgPSBzZXQ7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQotICBjYXNlICRIRyBpbgotICBbXFwvXSogfCA/OltcXC9dKikKLSAgYWNfY3ZfcGF0aF9IRz0iJEhHIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcGF0aF9IRz0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotICA7OwotZXNhYwotZmkKLUhHPSRhY19jdl9wYXRoX0hHCi1pZiB0ZXN0IC1uICIkSEciOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkSEciID4mNQotJGFzX2VjaG8gIiRIRyIgPiY2OyB9CisgIGlmIHRlc3QgIngkaG9zdF9hbGlhcyIgPSB4OyB0aGVuCisgIGFjX2N2X2hvc3Q9JGFjX2N2X2J1aWxkCiBlbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQorICBhY19jdl9ob3N0PWAkU0hFTEwgIiRhY19hdXhfZGlyL2NvbmZpZy5zdWIiICRob3N0X2FsaWFzYCB8fAorICAgIGFzX2ZuX2Vycm9yICQ/ICIkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiAkaG9zdF9hbGlhcyBmYWlsZWQiICIkTElORU5PIiA1CiBmaQogCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9ob3N0IiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfaG9zdCIgPiY2OyB9CitjYXNlICRhY19jdl9ob3N0IGluCisqLSotKikgOzsKKyopIGFzX2ZuX2Vycm9yICQ/ICJpbnZhbGlkIHZhbHVlIG9mIGNhbm9uaWNhbCBob3N0IiAiJExJTkVOTyIgNSA7OworZXNhYworaG9zdD0kYWNfY3ZfaG9zdAorYWNfc2F2ZV9JRlM9JElGUzsgSUZTPSctJworc2V0IHggJGFjX2N2X2hvc3QKK3NoaWZ0Citob3N0X2NwdT0kMQoraG9zdF92ZW5kb3I9JDIKK3NoaWZ0OyBzaGlmdAorIyBSZW1lbWJlciwgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBJRlMgaXMgdXNlZCB0byBjcmVhdGUgJCosCisjIGV4Y2VwdCB3aXRoIG9sZCBzaGVsbHM6Citob3N0X29zPSQqCitJRlM9JGFjX3NhdmVfSUZTCitjYXNlICRob3N0X29zIGluICpcICopIGhvc3Rfb3M9YGVjaG8gIiRob3N0X29zIiB8IHNlZCAncy8gLy0vZydgOzsgZXNhYwogCiAKLQotIyBDaGVjayBpZiBwa2ctY29uZmlnIGlzIGF2YWlsYWJsZS4KLQotCi1pZiB0ZXN0ICJ4JGFjX2N2X2Vudl9QS0dfQ09ORklHX3NldCIgIT0gInhzZXQiOyB0aGVuCi0JaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9cGtnLWNvbmZpZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1wa2ctY29uZmlnOyBhY193b3JkPSQyCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9QS0dfQ09ORklHK3NldH0iID0gc2V0OyB0aGVuIDoKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZS4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl90YXJnZXQrc2V0fSIgPSBzZXQ7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQotICBjYXNlICRQS0dfQ09ORklHIGluCi0gIFtcXC9dKiB8ID86W1xcL10qKQotICBhY19jdl9wYXRoX1BLR19DT05GSUc9IiRQS0dfQ09ORklHIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcGF0aF9QS0dfQ09ORklHPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgotICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLSAgZG9uZQotSUZTPSRhc19zYXZlX0lGUworICBpZiB0ZXN0ICJ4JHRhcmdldF9hbGlhcyIgPSB4OyB0aGVuCisgIGFjX2N2X3RhcmdldD0kYWNfY3ZfaG9zdAorZWxzZQorICBhY19jdl90YXJnZXQ9YCRTSEVMTCAiJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgJHRhcmdldF9hbGlhc2AgfHwKKyAgICBhc19mbl9lcnJvciAkPyAiJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIgJHRhcmdldF9hbGlhcyBmYWlsZWQiICIkTElORU5PIiA1CitmaQogCi0gIDs7CitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl90YXJnZXQiID4mNQorJGFzX2VjaG8gIiRhY19jdl90YXJnZXQiID4mNjsgfQorY2FzZSAkYWNfY3ZfdGFyZ2V0IGluCisqLSotKikgOzsKKyopIGFzX2ZuX2Vycm9yICQ/ICJpbnZhbGlkIHZhbHVlIG9mIGNhbm9uaWNhbCB0YXJnZXQiICIkTElORU5PIiA1IDs7CiBlc2FjCi1maQotUEtHX0NPTkZJRz0kYWNfY3ZfcGF0aF9QS0dfQ09ORklHCi1pZiB0ZXN0IC1uICIkUEtHX0NPTkZJRyI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRQS0dfQ09ORklHIiA+JjUKLSRhc19lY2hvICIkUEtHX0NPTkZJRyIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQordGFyZ2V0PSRhY19jdl90YXJnZXQKK2FjX3NhdmVfSUZTPSRJRlM7IElGUz0nLScKK3NldCB4ICRhY19jdl90YXJnZXQKK3NoaWZ0Cit0YXJnZXRfY3B1PSQxCit0YXJnZXRfdmVuZG9yPSQyCitzaGlmdDsgc2hpZnQKKyMgUmVtZW1iZXIsIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgSUZTIGlzIHVzZWQgdG8gY3JlYXRlICQqLAorIyBleGNlcHQgd2l0aCBvbGQgc2hlbGxzOgordGFyZ2V0X29zPSQqCitJRlM9JGFjX3NhdmVfSUZTCitjYXNlICR0YXJnZXRfb3MgaW4gKlwgKikgdGFyZ2V0X29zPWBlY2hvICIkdGFyZ2V0X29zIiB8IHNlZCAncy8gLy0vZydgOzsgZXNhYworCisKKyMgVGhlIGFsaWFzZXMgc2F2ZSB0aGUgbmFtZXMgdGhlIHVzZXIgc3VwcGxpZWQsIHdoaWxlICRob3N0IGV0Yy4KKyMgd2lsbCBnZXQgY2Fub25pY2FsaXplZC4KK3Rlc3QgLW4gIiR0YXJnZXRfYWxpYXMiICYmCisgIHRlc3QgIiRwcm9ncmFtX3ByZWZpeCRwcm9ncmFtX3N1ZmZpeCRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IFwKKyAgICBOT05FTk9ORXMseCx4LCAmJgorICBwcm9ncmFtX3ByZWZpeD0ke3RhcmdldF9hbGlhc30tCisKKyMgRmlndXJlIG91dCB0aGUgYnVpbGQgYW5kIHRhcmdldCBzeXN0ZW1zLiAjIE5vdGUgdGhhdCBpbiBhdXRvY29uZiB0ZXJtaW5vbG9neSwgImJ1aWxkIiBpcyBvYnZpb3VzLCBidXQgInRhcmdldCIKKyMgaXMgY29uZnVzaW5nOyBpdCBhc3N1bWVzIHlvdSBhcmUgY3Jvc3MtY29tcGlsaW5nIGEgY3Jvc3MtY29tcGlsZXIgKCEpICBhbmQgInRhcmdldCIgaXMgdGh1cyB0aGUgdGFyZ2V0IG9mIHRoZQorIyBwcm9kdWN0IHlvdSdyZSBidWlsZGluZy4gVGhlIHRhcmdldCBvZiB0aGlzIGJ1aWxkIGlzIGNhbGxlZCAiaG9zdCIuIFNpbmNlIHRoaXMgaXMgY29uZnVzaW5nIHRvIG1vc3QgcGVvcGxlLCB3ZQorIyBoYXZlIG5vdCBhZG9wdGVkIHRoYXQgc3lzdGVtLCBidXQgdXNlICJ0YXJnZXQiIGFzIHRoZSBwbGF0Zm9ybSB3ZSBhcmUgYnVpbGRpbmcgZm9yLiBJbiBzb21lIHBsYWNlcyB0aG91Z2ggd2UgbmVlZAorIyB0byB1c2UgdGhlIGNvbmZpZ3VyZSBuYW1pbmcgc3R5bGUuCisKKworCisKKworICAgICMgQ29weSB0aGUgYXV0b2NvbmYgdHJpcC9xdWFkcnVwbGV0IHZlcmJhdGltIHRvIE9QRU5KREtfVEFSR0VUX0FVVE9DT05GX05BTUUKKyAgICAjIChmcm9tIHRoZSBhdXRvY29uZiAiaG9zdCIpIGFuZCBPUEVOSkRLX0JVSUxEX0FVVE9DT05GX05BTUUKKyAgICAjIE5vdGUgdGhhdCB3ZSBtaWdodCBsYXRlciBvbiByZXdyaXRlIGUuZy4gT1BFTkpES19UQVJHRVRfQ1BVIGR1ZSB0byByZWR1Y2VkIGJ1aWxkLAorICAgICMgYnV0IHRoaXMgd2lsbCBub3QgY2hhbmdlIHRoZSB2YWx1ZSBvZiBPUEVOSkRLX1RBUkdFVF9BVVRPQ09ORl9OQU1FLgorICAgIE9QRU5KREtfVEFSR0VUX0FVVE9DT05GX05BTUU9IiRob3N0IgorICAgIE9QRU5KREtfQlVJTERfQVVUT0NPTkZfTkFNRT0iJGJ1aWxkIgorCisKKworICAgICMgQ29udmVydCB0aGUgYXV0b2NvbmYgT1MvQ1BVIHZhbHVlIHRvIG91ciBvd24gZGF0YSwgaW50byB0aGUgVkFSX09TL0NQVSB2YXJpYWJsZXMuCisKKyAgY2FzZSAiJGJ1aWxkX29zIiBpbgorICAgICpsaW51eCopCisgICAgICBWQVJfT1M9bGludXgKKyAgICAgIFZBUl9PU19BUEk9cG9zaXgKKyAgICAgIFZBUl9PU19FTlY9bGludXgKKyAgICAgIDs7CisgICAgKnNvbGFyaXMqKQorICAgICAgVkFSX09TPXNvbGFyaXMKKyAgICAgIFZBUl9PU19BUEk9cG9zaXgKKyAgICAgIFZBUl9PU19FTlY9c29sYXJpcworICAgICAgOzsKKyAgICAqZGFyd2luKikKKyAgICAgIFZBUl9PUz1tYWNvc3gKKyAgICAgIFZBUl9PU19BUEk9cG9zaXgKKyAgICAgIFZBUl9PU19FTlY9bWFjb3N4CisgICAgICA7OworICAgICpic2QqKQorICAgICAgVkFSX09TPWJzZAorICAgICAgVkFSX09TX0FQST1wb3NpeAorICAgICAgVkFSX09TX0VOVj1ic2QKKyAgICAgIDs7CisgICAgKmN5Z3dpbiopCisgICAgICBWQVJfT1M9d2luZG93cworICAgICAgVkFSX09TX0FQST13aW5hcGkKKyAgICAgIFZBUl9PU19FTlY9d2luZG93cy5jeWd3aW4KKyAgICAgIDs7CisgICAgKm1pbmd3KikKKyAgICAgIFZBUl9PUz13aW5kb3dzCisgICAgICBWQVJfT1NfQVBJPXdpbmFwaQorICAgICAgVkFSX09TX0VOVj13aW5kb3dzLm1zeXMKKyAgICAgIDs7CisgICAgKikKKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJ1bnN1cHBvcnRlZCBvcGVyYXRpbmcgc3lzdGVtICRidWlsZF9vcyIgIiRMSU5FTk8iIDUKKyAgICAgIDs7CisgIGVzYWMKKworCisgICMgRmlyc3QgYXJndW1lbnQgaXMgdGhlIGNwdSBuYW1lIGZyb20gdGhlIHRyaXAvcXVhZAorICBjYXNlICIkYnVpbGRfY3B1IiBpbgorICAgIHg4Nl82NCkKKyAgICAgIFZBUl9DUFU9eDg2XzY0CisgICAgICBWQVJfQ1BVX0FSQ0g9eDg2CisgICAgICBWQVJfQ1BVX0JJVFM9NjQKKyAgICAgIFZBUl9DUFVfRU5ESUFOPWxpdHRsZQorICAgICAgOzsKKyAgICBpPzg2KQorICAgICAgVkFSX0NQVT14ODYKKyAgICAgIFZBUl9DUFVfQVJDSD14ODYKKyAgICAgIFZBUl9DUFVfQklUUz0zMgorICAgICAgVkFSX0NQVV9FTkRJQU49bGl0dGxlCisgICAgICA7OworICAgIGFybSopCisgICAgICBWQVJfQ1BVPWFybQorICAgICAgVkFSX0NQVV9BUkNIPWFybQorICAgICAgVkFSX0NQVV9CSVRTPTMyCisgICAgICBWQVJfQ1BVX0VORElBTj1saXR0bGUKKyAgICAgIDs7CisgICAgcG93ZXJwYykKKyAgICAgIFZBUl9DUFU9cHBjCisgICAgICBWQVJfQ1BVX0FSQ0g9cHBjCisgICAgICBWQVJfQ1BVX0JJVFM9MzIKKyAgICAgIFZBUl9DUFVfRU5ESUFOPWJpZworICAgICAgIDs7CisgICAgcG93ZXJwYzY0KQorICAgICAgVkFSX0NQVT1wcGM2NAorICAgICAgVkFSX0NQVV9BUkNIPXBwYworICAgICAgVkFSX0NQVV9CSVRTPTY0CisgICAgICBWQVJfQ1BVX0VORElBTj1iaWcKKyAgICAgICA7OworICAgIHNwYXJjKQorICAgICAgVkFSX0NQVT1zcGFyYworICAgICAgVkFSX0NQVV9BUkNIPXNwYXJjCisgICAgICBWQVJfQ1BVX0JJVFM9MzIKKyAgICAgIFZBUl9DUFVfRU5ESUFOPWJpZworICAgICAgIDs7CisgICAgc3BhcmN2OSkKKyAgICAgIFZBUl9DUFU9c3BhcmN2OQorICAgICAgVkFSX0NQVV9BUkNIPXNwYXJjCisgICAgICBWQVJfQ1BVX0JJVFM9NjQKKyAgICAgIFZBUl9DUFVfRU5ESUFOPWJpZworICAgICAgIDs7CisgICAgKikKKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJ1bnN1cHBvcnRlZCBjcHUgJGJ1aWxkX2NwdSIgIiRMSU5FTk8iIDUKKyAgICAgIDs7CisgIGVzYWMKKworICAgICMgLi5hbmQgc2V0dXAgb3VyIG93biB2YXJpYWJsZXMuIChEbyB0aGlzIGV4cGxpY2l0ZWx5IHRvIGZhY2lsaXRhdGUgc2VhcmNoaW5nKQorICAgIE9QRU5KREtfQlVJTERfT1M9IiRWQVJfT1MiCisgICAgT1BFTkpES19CVUlMRF9PU19BUEk9IiRWQVJfT1NfQVBJIgorICAgIE9QRU5KREtfQlVJTERfT1NfRU5WPSIkVkFSX09TX0VOViIKKyAgICBPUEVOSkRLX0JVSUxEX0NQVT0iJFZBUl9DUFUiCisgICAgT1BFTkpES19CVUlMRF9DUFVfQVJDSD0iJFZBUl9DUFVfQVJDSCIKKyAgICBPUEVOSkRLX0JVSUxEX0NQVV9CSVRTPSIkVkFSX0NQVV9CSVRTIgorICAgIE9QRU5KREtfQlVJTERfQ1BVX0VORElBTj0iJFZBUl9DUFVfRU5ESUFOIgorCisKKworCisKKworCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBvcGVuamRrLWJ1aWxkIG9zLWNwdSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBvcGVuamRrLWJ1aWxkIG9zLWNwdS4uLiAiID4mNjsgfQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkT1BFTkpES19CVUlMRF9PUy0kT1BFTkpES19CVUlMRF9DUFUiID4mNQorJGFzX2VjaG8gIiRPUEVOSkRLX0JVSUxEX09TLSRPUEVOSkRLX0JVSUxEX0NQVSIgPiY2OyB9CisKKyAgICAjIENvbnZlcnQgdGhlIGF1dG9jb25mIE9TL0NQVSB2YWx1ZSB0byBvdXIgb3duIGRhdGEsIGludG8gdGhlIFZBUl9PUy9DUFUgdmFyaWFibGVzLgorCisgIGNhc2UgIiRob3N0X29zIiBpbgorICAgICpsaW51eCopCisgICAgICBWQVJfT1M9bGludXgKKyAgICAgIFZBUl9PU19BUEk9cG9zaXgKKyAgICAgIFZBUl9PU19FTlY9bGludXgKKyAgICAgIDs7CisgICAgKnNvbGFyaXMqKQorICAgICAgVkFSX09TPXNvbGFyaXMKKyAgICAgIFZBUl9PU19BUEk9cG9zaXgKKyAgICAgIFZBUl9PU19FTlY9c29sYXJpcworICAgICAgOzsKKyAgICAqZGFyd2luKikKKyAgICAgIFZBUl9PUz1tYWNvc3gKKyAgICAgIFZBUl9PU19BUEk9cG9zaXgKKyAgICAgIFZBUl9PU19FTlY9bWFjb3N4CisgICAgICA7OworICAgICpic2QqKQorICAgICAgVkFSX09TPWJzZAorICAgICAgVkFSX09TX0FQST1wb3NpeAorICAgICAgVkFSX09TX0VOVj1ic2QKKyAgICAgIDs7CisgICAgKmN5Z3dpbiopCisgICAgICBWQVJfT1M9d2luZG93cworICAgICAgVkFSX09TX0FQST13aW5hcGkKKyAgICAgIFZBUl9PU19FTlY9d2luZG93cy5jeWd3aW4KKyAgICAgIDs7CisgICAgKm1pbmd3KikKKyAgICAgIFZBUl9PUz13aW5kb3dzCisgICAgICBWQVJfT1NfQVBJPXdpbmFwaQorICAgICAgVkFSX09TX0VOVj13aW5kb3dzLm1zeXMKKyAgICAgIDs7CisgICAgKikKKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJ1bnN1cHBvcnRlZCBvcGVyYXRpbmcgc3lzdGVtICRob3N0X29zIiAiJExJTkVOTyIgNQorICAgICAgOzsKKyAgZXNhYworCisKKyAgIyBGaXJzdCBhcmd1bWVudCBpcyB0aGUgY3B1IG5hbWUgZnJvbSB0aGUgdHJpcC9xdWFkCisgIGNhc2UgIiRob3N0X2NwdSIgaW4KKyAgICB4ODZfNjQpCisgICAgICBWQVJfQ1BVPXg4Nl82NAorICAgICAgVkFSX0NQVV9BUkNIPXg4NgorICAgICAgVkFSX0NQVV9CSVRTPTY0CisgICAgICBWQVJfQ1BVX0VORElBTj1saXR0bGUKKyAgICAgIDs7CisgICAgaT84NikKKyAgICAgIFZBUl9DUFU9eDg2CisgICAgICBWQVJfQ1BVX0FSQ0g9eDg2CisgICAgICBWQVJfQ1BVX0JJVFM9MzIKKyAgICAgIFZBUl9DUFVfRU5ESUFOPWxpdHRsZQorICAgICAgOzsKKyAgICBhcm0qKQorICAgICAgVkFSX0NQVT1hcm0KKyAgICAgIFZBUl9DUFVfQVJDSD1hcm0KKyAgICAgIFZBUl9DUFVfQklUUz0zMgorICAgICAgVkFSX0NQVV9FTkRJQU49bGl0dGxlCisgICAgICA7OworICAgIHBvd2VycGMpCisgICAgICBWQVJfQ1BVPXBwYworICAgICAgVkFSX0NQVV9BUkNIPXBwYworICAgICAgVkFSX0NQVV9CSVRTPTMyCisgICAgICBWQVJfQ1BVX0VORElBTj1iaWcKKyAgICAgICA7OworICAgIHBvd2VycGM2NCkKKyAgICAgIFZBUl9DUFU9cHBjNjQKKyAgICAgIFZBUl9DUFVfQVJDSD1wcGMKKyAgICAgIFZBUl9DUFVfQklUUz02NAorICAgICAgVkFSX0NQVV9FTkRJQU49YmlnCisgICAgICAgOzsKKyAgICBzcGFyYykKKyAgICAgIFZBUl9DUFU9c3BhcmMKKyAgICAgIFZBUl9DUFVfQVJDSD1zcGFyYworICAgICAgVkFSX0NQVV9CSVRTPTMyCisgICAgICBWQVJfQ1BVX0VORElBTj1iaWcKKyAgICAgICA7OworICAgIHNwYXJjdjkpCisgICAgICBWQVJfQ1BVPXNwYXJjdjkKKyAgICAgIFZBUl9DUFVfQVJDSD1zcGFyYworICAgICAgVkFSX0NQVV9CSVRTPTY0CisgICAgICBWQVJfQ1BVX0VORElBTj1iaWcKKyAgICAgICA7OworICAgICopCisgICAgICBhc19mbl9lcnJvciAkPyAidW5zdXBwb3J0ZWQgY3B1ICRob3N0X2NwdSIgIiRMSU5FTk8iIDUKKyAgICAgIDs7CisgIGVzYWMKKworICAgICMgLi4uIGFuZCBzZXR1cCBvdXIgb3duIHZhcmlhYmxlcy4gKERvIHRoaXMgZXhwbGljaXRlbHkgdG8gZmFjaWxpdGF0ZSBzZWFyY2hpbmcpCisgICAgT1BFTkpES19UQVJHRVRfT1M9IiRWQVJfT1MiCisgICAgT1BFTkpES19UQVJHRVRfT1NfQVBJPSIkVkFSX09TX0FQSSIKKyAgICBPUEVOSkRLX1RBUkdFVF9PU19FTlY9IiRWQVJfT1NfRU5WIgorICAgIE9QRU5KREtfVEFSR0VUX0NQVT0iJFZBUl9DUFUiCisgICAgT1BFTkpES19UQVJHRVRfQ1BVX0FSQ0g9IiRWQVJfQ1BVX0FSQ0giCisgICAgT1BFTkpES19UQVJHRVRfQ1BVX0JJVFM9IiRWQVJfQ1BVX0JJVFMiCisgICAgT1BFTkpES19UQVJHRVRfQ1BVX0VORElBTj0iJFZBUl9DUFVfRU5ESUFOIgorCisKKworCisKKworCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBvcGVuamRrLXRhcmdldCBvcy1jcHUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgb3Blbmpkay10YXJnZXQgb3MtY3B1Li4uICIgPiY2OyB9CisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRPUEVOSkRLX1RBUkdFVF9PUy0kT1BFTkpES19UQVJHRVRfQ1BVIiA+JjUKKyRhc19lY2hvICIkT1BFTkpES19UQVJHRVRfT1MtJE9QRU5KREtfVEFSR0VUX0NQVSIgPiY2OyB9CisKKworCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLXRhcmdldC1iaXRzIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF90YXJnZXRfYml0cytzZXR9IiA9IHNldDsgdGhlbiA6CisgIHdpdGh2YWw9JHdpdGhfdGFyZ2V0X2JpdHM7CiBmaQogCiAKLWZpCi1pZiB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9QS0dfQ09ORklHIjsgdGhlbgotICBhY19wdF9QS0dfQ09ORklHPSRQS0dfQ09ORklHCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicGtnLWNvbmZpZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgcGtnLWNvbmZpZzsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3BhdGhfYWNfcHRfUEtHX0NPTkZJRytzZXR9IiA9IHNldDsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGNhc2UgJGFjX3B0X1BLR19DT05GSUcgaW4KLSAgW1xcL10qIHwgPzpbXFwvXSopCi0gIGFjX2N2X3BhdGhfYWNfcHRfUEtHX0NPTkZJRz0iJGFjX3B0X1BLR19DT05GSUciICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBhY19jdl9wYXRoX2FjX3B0X1BLR19DT05GSUc9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCi0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLSAgOzsKLWVzYWMKLWZpCi1hY19wdF9QS0dfQ09ORklHPSRhY19jdl9wYXRoX2FjX3B0X1BLR19DT05GSUcKLWlmIHRlc3QgLW4gIiRhY19wdF9QS0dfQ09ORklHIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3B0X1BLR19DT05GSUciID4mNQotJGFzX2VjaG8gIiRhY19wdF9QS0dfQ09ORklHIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotCi0gIGlmIHRlc3QgIngkYWNfcHRfUEtHX0NPTkZJRyIgPSB4OyB0aGVuCi0gICAgUEtHX0NPTkZJRz0iIgorICAjIFdlIGhhdmUgdGhyZWUgdHlwZXMgb2YgY29tcGlsZXM6CisgICMgbmF0aXZlICA9PSBub3JtYWwgY29tcGlsYXRpb24sIHRhcmdldCBzeXN0ZW0gPT0gYnVpbGQgc3lzdGVtCisgICMgY3Jvc3MgICA9PSB0cmFkaXRpb25hbCBjcm9zcyBjb21waWxhdGlvbiwgdGFyZ2V0IHN5c3RlbSAhPSBidWlsZCBzeXN0ZW07IHNwZWNpYWwgdG9vbGNoYWluIG5lZWRlZAorICAjIHJlZHVjZWQgPT0gdXNpbmcgbmF0aXZlIGNvbXBpbGVycywgYnV0IHdpdGggc3BlY2lhbCBmbGFncyAoZS5nLiAtbTMyKSB0byBwcm9kdWNlIDMyLWJpdCBidWlsZHMgb24gNjQtYml0IG1hY2hpbmVzCisgICMKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX0FVVE9DT05GX05BTUUiICE9ICJ4JE9QRU5KREtfVEFSR0VUX0FVVE9DT05GX05BTUUiOyB0aGVuCisgICAgIyBXZSdyZSBkb2luZyBhIHByb3BlciBjcm9zcy1jb21waWxhdGlvbgorICAgIENPTVBJTEVfVFlQRT0iY3Jvc3MiCiAgIGVsc2UKLSAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCi15ZXM6KQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQotJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQotYWNfdG9vbF93YXJuZWQ9eWVzIDs7Ci1lc2FjCi0gICAgUEtHX0NPTkZJRz0kYWNfcHRfUEtHX0NPTkZJRworICAgIENPTVBJTEVfVFlQRT0ibmF0aXZlIgogICBmaQotZWxzZQotICBQS0dfQ09ORklHPSIkYWNfY3ZfcGF0aF9QS0dfQ09ORklHIgotZmkKIAotZmkKLWlmIHRlc3QgLW4gIiRQS0dfQ09ORklHIjsgdGhlbgotCV9wa2dfbWluX3ZlcnNpb249MC45LjAKLQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHBrZy1jb25maWcgaXMgYXQgbGVhc3QgdmVyc2lvbiAkX3BrZ19taW5fdmVyc2lvbiIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBwa2ctY29uZmlnIGlzIGF0IGxlYXN0IHZlcnNpb24gJF9wa2dfbWluX3ZlcnNpb24uLi4gIiA+JjY7IH0KLQlpZiAkUEtHX0NPTkZJRyAtLWF0bGVhc3QtcGtnY29uZmlnLXZlcnNpb24gJF9wa2dfbWluX3ZlcnNpb247IHRoZW4KLQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1Ci0kYXNfZWNobyAieWVzIiA+JjY7IH0KLQllbHNlCi0JCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotCQlQS0dfQ09ORklHPSIiCi0JZmkKLQotZmkKLQotIyBBZnRlciBiYXNpYyB0b29scyBoYXZlIGJlZW4gc2V0dXAsIHdlIGNhbiBjaGVjayBidWlsZCBvcyBzcGVjaWZpYyBkZXRhaWxzLgotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgTm90ZSB0aGF0IHRoaXMgaXMgdGhlIGJ1aWxkIHBsYXRmb3JtIE9TIHZlcnNpb24hCi0KLU9TX1ZFUlNJT049ImB1bmFtZSAtciB8ICR7U0VEfSAncyFcLiEgIWcnIHwgJHtTRUR9ICdzIS0hICFnJ2AiCi1PU19WRVJTSU9OX01BSk9SPSJgJHtFQ0hPfSAke09TX1ZFUlNJT059IHwgJHtDVVR9IC1mIDEgLWQgJyAnYCIKLU9TX1ZFUlNJT05fTUlOT1I9ImAke0VDSE99ICR7T1NfVkVSU0lPTn0gfCAke0NVVH0gLWYgMiAtZCAnICdgIgotT1NfVkVSU0lPTl9NSUNSTz0iYCR7RUNIT30gJHtPU19WRVJTSU9OfSB8ICR7Q1VUfSAtZiAzIC1kICcgJ2AiCi0KLQotCi0KLQotIyBTZXR1cCBidWlsZGRlcHMsIGZvciBhdXRvbWF0aWMgZG93bmxvYWRpbmcgb2YgdG9vbHMgd2UgbmVlZC4KLSMgVGhpcyBpcyBuZWVkZWQgYmVmb3JlIHdlIGNhbiBjYWxsIEJERVBTX0NIRUNLX01PRFVMRSwgd2hpY2ggaXMgZG9uZSBpbgotIyBib290LWpkayBzZXR1cCwgYnV0IHdlIG5lZWQgdG8gaGF2ZSBiYXNpYyB0b29scyBzZXR1cCBmaXJzdC4KLQotCi0jIENoZWNrIHdoZXRoZXIgLS13aXRoLWJ1aWxkZGVwcy1jb25mIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9idWlsZGRlcHNfY29uZitzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfYnVpbGRkZXBzX2NvbmY7Ci1maQotCi0KLQotIyBDaGVjayB3aGV0aGVyIC0td2l0aC1idWlsZGRlcHMtc2VydmVyIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9idWlsZGRlcHNfc2VydmVyK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgd2l0aHZhbD0kd2l0aF9idWlsZGRlcHNfc2VydmVyOwotZmkKLQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtYnVpbGRkZXBzLWRpciB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfYnVpbGRkZXBzX2RpcitzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfYnVpbGRkZXBzX2RpcjsKLWVsc2UKLSAgd2l0aF9idWlsZGRlcHNfZGlyPS9sb2NhbGhvbWUvYnVpbGRkZXBzCi1maQotCi0KLQotIyBDaGVjayB3aGV0aGVyIC0td2l0aC1idWlsZGRlcHMtZ3JvdXAgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX2J1aWxkZGVwc19ncm91cCtzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIHdpdGh2YWw9JHdpdGhfYnVpbGRkZXBzX2dyb3VwOwotZmkKLQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbGlzdC1idWlsZGRlcHMgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfbGlzdF9idWlsZGRlcHMrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICBlbmFibGV2YWw9JGVuYWJsZV9saXN0X2J1aWxkZGVwczsgTElTVF9CVUlMRERFUFM9IiR7ZW5hYmxldmFsfSIKLWVsc2UKLSAgTElTVF9CVUlMRERFUFM9J25vJwotZmkKLQotCi1pZiB0ZXN0ICJ4JExJU1RfQlVJTERERVBTIiA9IHh5ZXM7IHRoZW4KLSAgICBlY2hvCi0gICAgZWNobyBMaXN0IG9mIGJ1aWxkIGRlcGVuZGVuY2llcyBrbm93biB0byB0aGUgY29uZmlndXJlIHNjcmlwdCwKLSAgICBlY2hvIHRoYXQgY2FuIGJlIHVzZWQgaW4gYnVpbGRkZXBzLmNvbmYgZmlsZXM6Ci0gICAgY2F0ICRBVVRPQ09ORl9ESVIvKi5hYyAkQVVUT0NPTkZfRElSLyoubTQgfCBncmVwIEJERVBTX0NIRUNLX01PRFVMRVwoIHwgY3V0IC1mIDIgLWQgJywnIHwgdHIgLWQgJyAnIHwgc29ydAotICAgIGVjaG8KLSAgICBleGl0IDEKLWZpCi0KLQotCi0gICAgaWYgdGVzdCAieCR3aXRoX2J1aWxkZGVwc19zZXJ2ZXIiICE9IHggfHwgdGVzdCAieCR3aXRoX2J1aWxkZGVwc19jb25mIiAhPSB4OyB0aGVuCi0gICAgICAgIGlmIHRlc3QgIngkd2l0aF9idWlsZGRlcHNfY29uZiIgIT0geDsgdGhlbgotICAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3Igc3VwcGxpZWQgYnVpbGRkZXBzIGNvbmZpZ3VyYXRpb24gZmlsZSIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3Igc3VwcGxpZWQgYnVpbGRkZXBzIGNvbmZpZ3VyYXRpb24gZmlsZS4uLiAiID4mNjsgfQotICAgICAgICAgICAgYnVpbGRkZXBzZmlsZT0kd2l0aF9idWlsZGRlcHNfY29uZgotICAgICAgICAgICAgaWYgdGVzdCAtcyAkYnVpbGRkZXBzZmlsZTsgdGhlbgotICAgICAgICAgICAgICAgIC4gJGJ1aWxkZGVwc2ZpbGUKLSAgICAgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbG9hZGVkISIgPiY1Ci0kYXNfZWNobyAibG9hZGVkISIgPiY2OyB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICBhc19mbl9lcnJvciAkPyAiVGhlIGdpdmVuIGJ1aWxkZGVwcyBjb25mIGZpbGUgJHdpdGhfYnVpbGRkZXBzX2NvbmYgY291bGQgbm90IGJlIGxvYWRlZCEiICIkTElORU5PIiA1Ci0gICAgICAgICAgIGZpCi0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGJ1aWxkZGVwcy5jb25mIGZpbGVzIGluIHNvdXJjZXMuLi4iID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGJ1aWxkZGVwcy5jb25mIGZpbGVzIGluIHNvdXJjZXMuLi4uLi4gIiA+JjY7IH0KLSAgICAgICAgICAgIGJ1aWxkZGVwc2ZpbGU9YG1rdGVtcGAKLSAgICAgICAgICAgIHRvdWNoICRidWlsZGRlcHNmaWxlCi0gICAgICAgICAgICAjIFB1dCBhbGwgZm91bmQgY29uZnMgaW50byBhIHNpbmdsZSBmaWxlLgotICAgICAgICAgICAgZmluZCAke1NSQ19ST09UfSAtbmFtZSBidWlsZGRlcHMuY29uZiAtZXhlYyBjYXQgXHtcfSBcOyA+PiAkYnVpbGRkZXBzZmlsZQotICAgICAgICAgICAgIyBTb3VyY2UgdGhlIGZpbGUgdG8gYWNxdWlyZSB0aGUgdmFyaWFibGVzCi0gICAgICAgICAgICBpZiB0ZXN0IC1zICRidWlsZGRlcHNmaWxlOyB0aGVuCi0gICAgICAgICAgICAgICAgLiAkYnVpbGRkZXBzZmlsZQotICAgICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBmb3VuZCBhdCBsZWFzdCBvbmUhIiA+JjUKLSRhc19lY2hvICJmb3VuZCBhdCBsZWFzdCBvbmUhIiA+JjY7IH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgIGFzX2ZuX2Vycm9yICQ/ICJDb3VsZCBub3QgZmluZCBhbnkgYnVpbGRkZXBzLmNvbmYgYXQgYWxsISIgIiRMSU5FTk8iIDUKLSAgICAgICAgICAgZmkKLSAgICAgICAgZmkKLSAgICAgICAgIyBDcmVhdGUgYnVpbGQgYW5kIHRhcmdldCBuYW1lcyB0aGF0IHVzZSBfIGluc3RlYWQgb2YgIi0iIGFuZCAiLiIuCi0gICAgICAgICMgVGhpcyBpcyBuZWNlc3NhcnkgdG8gdXNlIHRoZW0gaW4gdmFyaWFibGUgbmFtZXMuCi0gICAgICAgIGJ1aWxkX3Zhcj1gZWNobyAke09QRU5KREtfQlVJTERfQVVUT0NPTkZfTkFNRX0gfCB0ciAnLScgJ18nIHwgdHIgJy4nICdfJ2AKLSAgICAgICAgdGFyZ2V0X3Zhcj1gZWNobyAke09QRU5KREtfVEFSR0VUX0FVVE9DT05GX05BTUV9IHwgdHIgJy0nICdfJyB8IHRyICcuJyAnXydgCi0gICAgICAgICMgRXh0cmFjdCByZXdyaXRlIGluZm9ybWF0aW9uIGZvciBidWlsZCBhbmQgdGFyZ2V0Ci0gICAgICAgIGV2YWwgcmV3cml0dGVuX2J1aWxkPVwke1JFV1JJVEVfJHtidWlsZF92YXJ9fQotICAgICAgICBpZiB0ZXN0ICJ4JHJld3JpdHRlbl9idWlsZCIgPSB4OyB0aGVuCi0gICAgICAgICAgICByZXdyaXR0ZW5fYnVpbGQ9JHtPUEVOSkRLX0JVSUxEX0FVVE9DT05GX05BTUV9Ci0gICAgICAgICAgICBlY2hvIEJ1aWxkIHN0YXlzIHRoZSBzYW1lICRyZXdyaXR0ZW5fYnVpbGQKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZWNobyBSZXdyaXRpbmcgYnVpbGQgZm9yIGJ1aWxkZGVwcyBpbnRvICRyZXdyaXR0ZW5fYnVpbGQKLSAgICAgICAgZmkKLSAgICAgICAgZXZhbCByZXdyaXR0ZW5fdGFyZ2V0PVwke1JFV1JJVEVfJHt0YXJnZXRfdmFyfX0KLSAgICAgICAgaWYgdGVzdCAieCRyZXdyaXR0ZW5fdGFyZ2V0IiA9IHg7IHRoZW4KLSAgICAgICAgICAgIHJld3JpdHRlbl90YXJnZXQ9JHtPUEVOSkRLX1RBUkdFVF9BVVRPQ09ORl9OQU1FfQotICAgICAgICAgICAgZWNobyBUYXJnZXQgc3RheXMgdGhlIHNhbWUgJHJld3JpdHRlbl90YXJnZXQKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZWNobyBSZXdyaXRpbmcgdGFyZ2V0IGZvciBidWlsZGRlcHMgaW50byAkcmV3cml0dGVuX3RhcmdldAotICAgICAgICBmaQotICAgICAgICByZXdyaXR0ZW5fYnVpbGRfdmFyPWBlY2hvICR7cmV3cml0dGVuX2J1aWxkfSB8IHRyICctJyAnXycgfCB0ciAnLicgJ18nYAotICAgICAgICByZXdyaXR0ZW5fdGFyZ2V0X3Zhcj1gZWNobyAke3Jld3JpdHRlbl90YXJnZXR9IHwgdHIgJy0nICdfJyB8IHRyICcuJyAnXydgCi0gICAgZmkKLSAgICBmb3IgYWNfcHJvZyBpbiA3eiB1bnppcAotZG8KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX0JERVBTX1VOWklQK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJEJERVBTX1VOWklQIjsgdGhlbgotICBhY19jdl9wcm9nX0JERVBTX1VOWklQPSIkQkRFUFNfVU5aSVAiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19CREVQU19VTlpJUD0iJGFjX3Byb2ciCi0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLWZpCi1maQotQkRFUFNfVU5aSVA9JGFjX2N2X3Byb2dfQkRFUFNfVU5aSVAKLWlmIHRlc3QgLW4gIiRCREVQU19VTlpJUCI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRCREVQU19VTlpJUCIgPiY1Ci0kYXNfZWNobyAiJEJERVBTX1VOWklQIiA+JjY7IH0KLWVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci1maQotCi0KLSAgdGVzdCAtbiAiJEJERVBTX1VOWklQIiAmJiBicmVhawotZG9uZQotCi0gICAgaWYgdGVzdCAieCRCREVQU19VTlpJUCIgPSB4N3o7IHRoZW4KLSAgICAgICAgQkRFUFNfVU5aSVA9Ijd6IHgiCisgIGlmIHRlc3QgIngkd2l0aF90YXJnZXRfYml0cyIgIT0geDsgdGhlbgorICAgIGlmIHRlc3QgIngkQ09NUElMRV9UWVBFIiA9ICJ4Y3Jvc3MiOyB0aGVuCisgICAgICBhc19mbl9lcnJvciAkPyAiSXQgaXMgbm90IHBvc3NpYmxlIHRvIGNvbWJpbmUgLS13aXRoLXRhcmdldC1iaXRzPVggYW5kIHByb3BlciBjcm9zcy1jb21waWxhdGlvbi4gQ2hvb3NlIGVpdGhlci4iICIkTElORU5PIiA1CiAgICAgZmkKIAotICAgIGZvciBhY19wcm9nIGluIHdnZXQgbGZ0cCBmdHAKLWRvCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19CREVQU19GVFArc2V0fSIgPSBzZXQ7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQkRFUFNfRlRQIjsgdGhlbgotICBhY19jdl9wcm9nX0JERVBTX0ZUUD0iJEJERVBTX0ZUUCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBhY19jdl9wcm9nX0JERVBTX0ZUUD0iJGFjX3Byb2ciCi0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgorICAgIGlmIHRlc3QgIngkd2l0aF90YXJnZXRfYml0cyIgPSB4MzIgJiYgdGVzdCAieCRPUEVOSkRLX1RBUkdFVF9DUFVfQklUUyIgPSB4NjQ7IHRoZW4KKyAgICAgICMgQSByZWR1Y2VkIGJ1aWxkIGlzIHJlcXVlc3RlZAorICAgICAgQ09NUElMRV9UWVBFPSJyZWR1Y2VkIgorICAgICAgT1BFTkpES19UQVJHRVRfQ1BVX0JJVFM9MzIKKyAgICAgIGlmIHRlc3QgIngkT1BFTkpES19UQVJHRVRfQ1BVX0FSQ0giID0gInh4ODYiOyB0aGVuCisgICAgICAgIE9QRU5KREtfVEFSR0VUX0NQVT14ODYKKyAgICAgIGVsaWYgdGVzdCAieCRPUEVOSkRLX1RBUkdFVF9DUFVfQVJDSCIgPSAieHNwYXJjIjsgdGhlbgorICAgICAgICBPUEVOSkRLX1RBUkdFVF9DUFU9c3BhcmMKKyAgICAgIGVsc2UKKyAgICAgICAgYXNfZm5fZXJyb3IgJD8gIlJlZHVjZWQgYnVpbGQgKC0td2l0aC10YXJnZXQtYml0cz0zMikgaXMgb25seSBzdXBwb3J0ZWQgb24geDg2XzY0IGFuZCBzcGFyY3Y5IiAiJExJTkVOTyIgNQorICAgICAgZmkKKyAgICBlbGlmIHRlc3QgIngkd2l0aF90YXJnZXRfYml0cyIgPSB4NjQgJiYgdGVzdCAieCRPUEVOSkRLX1RBUkdFVF9DUFVfQklUUyIgPSB4MzI7IHRoZW4KKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJJdCBpcyBub3QgcG9zc2libGUgdG8gdXNlIC0td2l0aC10YXJnZXQtYml0cz02NCBvbiBhIDMyIGJpdCBzeXN0ZW0uIFVzZSBwcm9wZXIgY3Jvc3MtY29tcGlsYXRpb24gaW5zdGVhZC4iICIkTElORU5PIiA1CisgICAgZWxpZiB0ZXN0ICJ4JHdpdGhfdGFyZ2V0X2JpdHMiID0gIngkT1BFTkpES19UQVJHRVRfQ1BVX0JJVFMiOyB0aGVuCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IC0td2l0aC10YXJnZXQtYml0cyBhcmUgc2V0IHRvIGJ1aWxkIHBsYXRmb3JtIGFkZHJlc3Mgc2l6ZTsgYXJndW1lbnQgaGFzIG5vIG1lYW5pbmciID4mNQorJGFzX2VjaG8gIiRhc19tZTogLS13aXRoLXRhcmdldC1iaXRzIGFyZSBzZXQgdG8gYnVpbGQgcGxhdGZvcm0gYWRkcmVzcyBzaXplOyBhcmd1bWVudCBoYXMgbm8gbWVhbmluZyIgPiY2O30KKyAgICBlbHNlCisgICAgICBhc19mbl9lcnJvciAkPyAiLS13aXRoLXRhcmdldC1iaXRzIGNhbiBvbmx5IGJlIDMyIG9yIDY0LCB5b3Ugc3BlY2lmaWVkICR3aXRoX3RhcmdldF9iaXRzISIgIiRMSU5FTk8iIDUKKyAgICBmaQogICBmaQotZG9uZQotICBkb25lCi1JRlM9JGFzX3NhdmVfSUZTCiAKLWZpCi1maQotQkRFUFNfRlRQPSRhY19jdl9wcm9nX0JERVBTX0ZUUAotaWYgdGVzdCAtbiAiJEJERVBTX0ZUUCI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRCREVQU19GVFAiID4mNQotJGFzX2VjaG8gIiRCREVQU19GVFAiID4mNjsgfQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGNvbXBpbGF0aW9uIHR5cGUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgY29tcGlsYXRpb24gdHlwZS4uLiAiID4mNjsgfQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRDT01QSUxFX1RZUEUiID4mNQorJGFzX2VjaG8gIiRDT01QSUxFX1RZUEUiID4mNjsgfQorCisKKyAgICBpZiB0ZXN0ICJ4JE9QRU5KREtfVEFSR0VUX09TIiA9ICJ4c29sYXJpcyI7IHRoZW4KKyAgICAgICBSRVFVSVJFRF9PU19OQU1FPVN1bk9TCisgICAgICAgUkVRVUlSRURfT1NfVkVSU0lPTj01LjEwCisgICAgZmkKKyAgICBpZiB0ZXN0ICJ4JE9QRU5KREtfVEFSR0VUX09TIiA9ICJ4bGludXgiOyB0aGVuCisgICAgICAgUkVRVUlSRURfT1NfTkFNRT1MaW51eAorICAgICAgIFJFUVVJUkVEX09TX1ZFUlNJT049Mi42CisgICAgZmkKKyAgICBpZiB0ZXN0ICJ4JE9QRU5KREtfVEFSR0VUX09TIiA9ICJ4d2luZG93cyI7IHRoZW4KKyAgICAgICAgUkVRVUlSRURfT1NfTkFNRT1XaW5kb3dzCisgICAgICAgIGlmIHRlc3QgIngkT1BFTkpES19UQVJHRVRfQ1BVX0JJVFMiID0gIng2NCI7IHRoZW4KKyAgICAgICAgICAgIFJFUVVJUkVEX09TX1ZFUlNJT049NS4yCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFJFUVVJUkVEX09TX1ZFUlNJT049NS4xCisgICAgICAgIGZpCisgICAgZmkKKyAgICBpZiB0ZXN0ICJ4JE9QRU5KREtfVEFSR0VUX09TIiA9ICJ4bWFjb3N4IjsgdGhlbgorICAgICAgICBSRVFVSVJFRF9PU19OQU1FPURhcndpbgorICAgICAgICBSRVFVSVJFRF9PU19WRVJTSU9OPTExLjIKKyAgICBmaQorCisKKworCisKKyAgICAjIEFsc28gc3RvcmUgdGhlIGxlZ2FjeSBuYW1pbmcgb2YgdGhlIGNwdS4KKyAgICAjIEllIGk1ODYgYW5kIGFtZDY0IGluc3RlYWQgb2YgeDg2IGFuZCB4ODZfNjQKKyAgICBPUEVOSkRLX1RBUkdFVF9DUFVfTEVHQUNZPSIkT1BFTkpES19UQVJHRVRfQ1BVIgorICAgIGlmIHRlc3QgIngkT1BFTkpES19UQVJHRVRfQ1BVIiA9IHh4ODY7IHRoZW4KKyAgICAgIE9QRU5KREtfVEFSR0VUX0NQVV9MRUdBQ1k9Imk1ODYiCisgICAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfVEFSR0VUX09TIiAhPSB4bWFjb3N4ICYmIHRlc3QgIngkT1BFTkpES19UQVJHRVRfQ1BVIiA9IHh4ODZfNjQ7IHRoZW4KKyAgICAgICMgT24gYWxsIHBsYXRmb3JtcyBleGNlcHQgTWFjT1NYIHJlcGxhY2UgeDg2XzY0IHdpdGggYW1kNjQuCisgICAgICBPUEVOSkRLX1RBUkdFVF9DUFVfTEVHQUNZPSJhbWQ2NCIKKyAgICBmaQorCisKKyAgICAjIEFuZCB0aGUgc2Vjb25kIGxlZ2FjeSBuYW1pbmcgb2YgdGhlIGNwdS4KKyAgICAjIEllIGkzODYgYW5kIGFtZDY0IGluc3RlYWQgb2YgeDg2IGFuZCB4ODZfNjQuCisgICAgT1BFTkpES19UQVJHRVRfQ1BVX0xFR0FDWV9MSUI9IiRPUEVOSkRLX1RBUkdFVF9DUFUiCisgICAgaWYgdGVzdCAieCRPUEVOSkRLX1RBUkdFVF9DUFUiID0geHg4NjsgdGhlbgorICAgICAgT1BFTkpES19UQVJHRVRfQ1BVX0xFR0FDWV9MSUI9ImkzODYiCisgICAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfVEFSR0VUX0NQVSIgPSB4eDg2XzY0OyB0aGVuCisgICAgICBPUEVOSkRLX1RBUkdFVF9DUFVfTEVHQUNZX0xJQj0iYW1kNjQiCisgICAgZmkKKworCisgICAgIyBUaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBjcHUgKGJ1dCB1c2luZyBpMzg2IGFuZCBhbWQ2NCBpbnN0ZWFkIG9mCisgICAgIyB4ODYgYW5kIHg4Nl82NCwgcmVzcGVjdGl2ZWx5KSwgcHJlY2VlZGVkIGJ5IGEgLywgdG8gYmUgdXNlZCB3aGVuCisgICAgIyBsb2NhdGluZyBsaWJyYXJpZXMuIE9uIG1hY29zeCwgaXQncyBlbXB0eSwgdGhvdWdoLgorICAgIE9QRU5KREtfVEFSR0VUX0NQVV9MSUJESVI9Ii8kT1BFTkpES19UQVJHRVRfQ1BVX0xFR0FDWV9MSUIiCisgICAgaWYgdGVzdCAieCRPUEVOSkRLX1RBUkdFVF9PUyIgPSB4bWFjb3N4OyB0aGVuCisgICAgICAgIE9QRU5KREtfVEFSR0VUX0NQVV9MSUJESVI9IiIKKyAgICBmaQorCisKKyAgICAjIE9QRU5KREtfVEFSR0VUX0NQVV9JU0FESVIgaXMgbm9ybWFsbHkgZW1wdHkuIE9uIDY0LWJpdCBTb2xhcmlzIHN5c3RlbXMsIGl0IGlzIHNldCB0bworICAgICMgL2FtZDY0IG9yIC9zcGFyY3Y5LiBUaGlzIHN0cmluZyBpcyBhcHBlbmRlZCB0byBzb21lIGxpYnJhcnkgcGF0aHMsIGxpa2UgdGhpczoKKyAgICAjIC91c3IvbGliJHtPUEVOSkRLX1RBUkdFVF9DUFVfSVNBRElSfS9saWJleGFtcGxlLnNvCisgICAgT1BFTkpES19UQVJHRVRfQ1BVX0lTQURJUj0iIgorICAgIGlmIHRlc3QgIngkT1BFTkpES19UQVJHRVRfT1MiID0geHNvbGFyaXM7IHRoZW4KKyAgICAgIGlmIHRlc3QgIngkT1BFTkpES19UQVJHRVRfQ1BVIiA9IHh4ODZfNjQ7IHRoZW4KKyAgICAgICAgICBPUEVOSkRLX1RBUkdFVF9DUFVfSVNBRElSPSIvYW1kNjQiCisgICAgICBlbGlmIHRlc3QgIngkT1BFTkpES19UQVJHRVRfQ1BVIiA9IHhzcGFyY3Y5OyB0aGVuCisgICAgICAgICAgT1BFTkpES19UQVJHRVRfQ1BVX0lTQURJUj0iL3NwYXJjdjkiCisgICAgICBmaQorICAgIGZpCisKKworICAgICMgU2V0dXAgT1BFTkpES19UQVJHRVRfQ1BVX09TQVJDSCwgd2hpY2ggaXMgdXNlZCB0byBzZXQgdGhlIG9zLmFyY2ggSmF2YSBzeXN0ZW0gcHJvcGVydHkKKyAgICBPUEVOSkRLX1RBUkdFVF9DUFVfT1NBUkNIPSIkT1BFTkpES19UQVJHRVRfQ1BVIgorICAgIGlmIHRlc3QgIngkT1BFTkpES19UQVJHRVRfT1MiID0geGxpbnV4ICYmIHRlc3QgIngkT1BFTkpES19UQVJHRVRfQ1BVIiA9IHh4ODY7IHRoZW4KKyAgICAgICMgT24gbGludXggb25seSwgd2UgcmVwbGFjZSB4ODYgd2l0aCBpMzg2LgorICAgICAgT1BFTkpES19UQVJHRVRfQ1BVX09TQVJDSD0iaTM4NiIKKyAgICBlbGlmIHRlc3QgIngkT1BFTkpES19UQVJHRVRfT1MiICE9IHhtYWNvc3ggJiYgdGVzdCAieCRPUEVOSkRLX1RBUkdFVF9DUFUiID0geHg4Nl82NDsgdGhlbgorICAgICAgIyBPbiBhbGwgcGxhdGZvcm1zIGV4Y2VwdCBtYWNvc3gsIHdlIHJlcGxhY2UgeDg2XzY0IHdpdGggYW1kNjQuCisgICAgICBPUEVOSkRLX1RBUkdFVF9DUFVfT1NBUkNIPSJhbWQ2NCIKKyAgICBmaQorCisKKyAgICBPUEVOSkRLX1RBUkdFVF9DUFVfSkxJPSIkT1BFTkpES19UQVJHRVRfQ1BVIgorICAgIGlmIHRlc3QgIngkT1BFTkpES19UQVJHRVRfQ1BVIiA9IHh4ODY7IHRoZW4KKyAgICAgIE9QRU5KREtfVEFSR0VUX0NQVV9KTEk9ImkzODYiCisgICAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfVEFSR0VUX09TIiAhPSB4bWFjb3N4ICYmIHRlc3QgIngkT1BFTkpES19UQVJHRVRfQ1BVIiA9IHh4ODZfNjQ7IHRoZW4KKyAgICAgICMgT24gYWxsIHBsYXRmb3JtcyBleGNlcHQgbWFjb3N4LCB3ZSByZXBsYWNlIHg4Nl82NCB3aXRoIGFtZDY0LgorICAgICAgT1BFTkpES19UQVJHRVRfQ1BVX0pMST0iYW1kNjQiCisgICAgZmkKKyAgICAjIE5vdyBzZXR1cCB0aGUgLUQgZmxhZ3MgZm9yIGJ1aWxkaW5nIGxpYmpsaS4KKyAgICBPUEVOSkRLX1RBUkdFVF9DUFVfSkxJX0NGTEFHUz0iLURMSUJBUkNITkFNRT0nXCIkT1BFTkpES19UQVJHRVRfQ1BVX0pMSVwiJyIKKyAgICBpZiB0ZXN0ICJ4JE9QRU5KREtfVEFSR0VUX09TIiA9IHhzb2xhcmlzOyB0aGVuCisgICAgICBpZiB0ZXN0ICJ4JE9QRU5KREtfVEFSR0VUX0NQVV9BUkNIIiA9IHhzcGFyYzsgdGhlbgorICAgICAgICBPUEVOSkRLX1RBUkdFVF9DUFVfSkxJX0NGTEFHUz0iJE9QRU5KREtfVEFSR0VUX0NQVV9KTElfQ0ZMQUdTIC1ETElCQVJDSDMyTkFNRT0nXCJzcGFyY1wiJyAtRExJQkFSQ0g2NE5BTUU9J1wic3BhcmN2OVwiJyIKKyAgICAgIGVsaWYgdGVzdCAieCRPUEVOSkRLX1RBUkdFVF9DUFVfQVJDSCIgPSB4eDg2OyB0aGVuCisgICAgICAgIE9QRU5KREtfVEFSR0VUX0NQVV9KTElfQ0ZMQUdTPSIkT1BFTkpES19UQVJHRVRfQ1BVX0pMSV9DRkxBR1MgLURMSUJBUkNIMzJOQU1FPSdcImkzODZcIicgLURMSUJBUkNINjROQU1FPSdcImFtZDY0XCInIgorICAgICAgZmkKKyAgICBmaQorCisKKyAgICAjIFNldHVwIE9QRU5KREtfVEFSR0VUX09TX0FQSV9ESVIsIHVzZWQgaW4gc291cmNlIHBhdGhzLgorICAgIGlmIHRlc3QgIngkT1BFTkpES19UQVJHRVRfT1NfQVBJIiA9IHhwb3NpeDsgdGhlbgorICAgICAgICBPUEVOSkRLX1RBUkdFVF9PU19BUElfRElSPSJzb2xhcmlzIgorICAgIGZpCisgICAgaWYgdGVzdCAieCRPUEVOSkRLX1RBUkdFVF9PU19BUEkiID0geHdpbmFwaTsgdGhlbgorICAgICAgICBPUEVOSkRLX1RBUkdFVF9PU19BUElfRElSPSJ3aW5kb3dzIgorICAgIGZpCisKKworICAgIGlmIHRlc3QgIngkT1BFTkpES19UQVJHRVRfQ1BVX0JJVFMiID0geDY0OyB0aGVuCisgICAgICAgIEFfTFA2ND0iTFA2NDo9IgorICAgICAgICAjIC1EX0xQNjQ9MSBpcyBvbmx5IHNldCBvbiBsaW51eCBhbmQgbWFjLiBTZXR0aW5nIG9uIHdpbmRvd3MgY2F1c2VzIGRpZmYgaW4KKyAgICAgICAgIyB1bnBhY2syMDAuZXhlCisgICAgICAgIGlmIHRlc3QgIngkT1BFTkpES19UQVJHRVRfT1MiID0geGxpbnV4IHx8IHRlc3QgIngkT1BFTkpES19UQVJHRVRfT1MiID0geG1hY29zeDsgdGhlbgorICAgICAgICAgICAgQUREX0xQNjQ9Ii1EX0xQNjQ9MSIKKyAgICAgICAgZmkKKyAgICBmaQorICAgIExQNjQ9JEFfTFA2NAorCisKKyAgICBpZiB0ZXN0ICJ4JENPTVBJTEVfVFlQRSIgPSAieGNyb3NzIjsgdGhlbgorICAgICAgIyBGSVhNRTogLi4uIG9yIHNob3VsZCB0aGlzIGluY2x1ZGUgcmVkdWNlZCBidWlsZHMuLj8KKyAgICAgIERFRklORV9DUk9TU19DT01QSUxFX0FSQ0g9IkNST1NTX0NPTVBJTEVfQVJDSDo9JE9QRU5KREtfVEFSR0VUX0NQVV9MRUdBQ1kiCisgICAgZWxzZQorICAgICAgREVGSU5FX0NST1NTX0NPTVBJTEVfQVJDSD0iIgorICAgIGZpCisKKworCisKKyMgQ29udGludWUgc2V0dGluZyB1cCBiYXNpYyBzdHVmZi4gTW9zdCByZW1haW5pbmcgY29kZSByZXF1aXJlIGZ1bmRhbWVudGFsIHRvb2xzLgorCisjIExvY2F0ZSB0aGUgZGlyZWN0b3J5IG9mIHRoaXMgc2NyaXB0LgorU0NSSVBUPSIkMCIKKworICAgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PUyIgIT0geHdpbmRvd3M7IHRoZW4KKyAgICAgICAgIyBGb2xsb3cgYSBjaGFpbiBvZiBzeW1ib2xpYyBsaW5rcy4gVXNlIHJlYWRsaW5rCisgICAgICAgICMgd2hlcmUgaXQgZXhpc3RzLCBlbHNlIGZhbGwgYmFjayB0byBob3JyaWJseQorICAgICAgICAjIGNvbXBsaWNhdGVkIHNoZWxsIGNvZGUuCisgICAgICAgIGlmIHRlc3QgIngkUkVBRExJTktfVEVTVEVEIiAhPSB5ZXM7IHRoZW4KKyAgICAgICAgICAgICMgT24gTWFjT1NYIHRoZXJlIGlzIGEgcmVhZGxpbmsgdG9vbCB3aXRoIGEgZGlmZmVyZW50CisgICAgICAgICAgICAjIHB1cnBvc2UgdGhhbiB0aGUgR05VIHJlYWRsaW5rIHRvb2wuIENoZWNrIHRoZSBmb3VuZCByZWFkbGluay4KKyAgICAgICAgICAgIElTR05VPWAkUkVBRExJTksgLS1oZWxwIDI+JjEgfCAkR1JFUCBHTlVgCisgICAgICAgICAgICBpZiB0ZXN0ICJ4JElTR05VIiA9IHg7IHRoZW4KKyAgICAgICAgICAgICAgICAgIyBBIHJlYWRsaW5rIHRoYXQgd2UgZG8gbm90IGtub3cgaG93IHRvIHVzZS4KKyAgICAgICAgICAgICAgICAgIyBBcmUgdGhlcmUgb3RoZXIgbm9uLUdOVSByZWFkbGlua3Mgb3V0IHRoZXJlPworICAgICAgICAgICAgICAgICBSRUFETElOS19URVNURUQ9eWVzCisgICAgICAgICAgICAgICAgIFJFQURMSU5LPQorICAgICAgICAgICAgZmkKKyAgICAgICAgZmkKKworICAgICAgICBpZiB0ZXN0ICJ4JFJFQURMSU5LIiAhPSB4OyB0aGVuCisgICAgICAgICAgICBTQ1JJUFQ9YCRSRUFETElOSyAtZiAkU0NSSVBUYAorICAgICAgICBlbHNlCisgICAgICAgICAgICBTVEFSVERJUj0kUFdECisgICAgICAgICAgICBDT1VOVEVSPTAKKyAgICAgICAgICAgIHN5bV9saW5rX2Rpcj1gJERJUk5BTUUgJFNDUklQVGAKKyAgICAgICAgICAgIHN5bV9saW5rX2ZpbGU9YCRCQVNFTkFNRSAkU0NSSVBUYAorICAgICAgICAgICAgd2hpbGUgdGVzdCAkQ09VTlRFUiAtbHQgMjA7IGRvCisgICAgICAgICAgICAgICAgSVNMSU5LPWAkTFMgLWwgJHN5bV9saW5rX2Rpci8kc3ltX2xpbmtfZmlsZSB8ICRHUkVQICdcLT4nIHwgJFNFRCAtZSAncy8uKi0+IFwoLipcKS9cMS8nYAorICAgICAgICAgICAgICAgIGlmIHRlc3QgIngkSVNMSU5LIiA9PSB4OyB0aGVuCisgICAgICAgICAgICAgICAgICAgICMgVGhpcyBpcyBub3QgYSBzeW1ib2xpYyBsaW5rISBXZSBhcmUgZG9uZSEKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICMgVGhlIGxpbmsgbWlnaHQgYmUgcmVsYXRpdmUhIFdlIGhhdmUgdG8gdXNlIGNkIHRvIHRyYXZlbCBzYWZlbHkuCisgICAgICAgICAgICAgICAgY2QgJHN5bV9saW5rX2RpcgorICAgICAgICAgICAgICAgICMgLi4uIGFuZCB3ZSBtdXN0IGdldCB0aGUgdG8gdGhlIGFic29sdXRlIHBhdGgsIG5vdCBvbmUgdXNpbmcgc3ltYm9saWMgbGlua3MuCisgICAgICAgICAgICAgICAgY2QgYHB3ZCAtUGAKKyAgICAgICAgICAgICAgICBjZCBgJERJUk5BTUUgJElTTElOS2AKKyAgICAgICAgICAgICAgICBzeW1fbGlua19kaXI9YCRUSEVQV0RDTURgCisgICAgICAgICAgICAgICAgc3ltX2xpbmtfZmlsZT1gJEJBU0VOQU1FICRJU0xJTktgCisgICAgICAgICAgICAgICAgbGV0IENPVU5URVI9Q09VTlRFUisxCisgICAgICAgICAgICBkb25lCisgICAgICAgICAgICBjZCAkU1RBUlRESVIKKyAgICAgICAgICAgIFNDUklQVD0kc3ltX2xpbmtfZGlyLyRzeW1fbGlua19maWxlCisgICAgICAgIGZpCisgICAgZmkKKworQVVUT0NPTkZfRElSPWBjZCBcYCRESVJOQU1FICRTQ1JJUFRcYDsgJFRIRVBXRENNRGAKKworIyBXaGVyZSBpcyB0aGUgc291cmNlPyBJdCBpcyBsb2NhdGVkIHR3byBsZXZlbHMgYWJvdmUgdGhlIGNvbmZpZ3VyZSBzY3JpcHQuCitDVVJESVI9IiRQV0QiCitjZCAiJEFVVE9DT05GX0RJUi8uLi8uLiIKK1NSQ19ST09UPSJgcHdkYCIKKworaWYgdGVzdCAieCRPUEVOSkRLX1RBUkdFVF9PUyIgPSAieHdpbmRvd3MiOyB0aGVuCisgIFBBVEhfU0VQPSI7IgorCisgIFNSQ19ST09UX0xFTkdUSD1gJFRIRVBXRENNRHwkV0MgLW1gCisgIGlmIHRlc3QgJFNSQ19ST09UX0xFTkdUSCAtZ3QgMTAwOyB0aGVuCisgICAgICBhc19mbl9lcnJvciAkPyAiWW91ciBiYXNlIHBhdGggaXMgdG9vIGxvbmcuIEl0IGlzICRTUkNfUk9PVF9MRU5HVEggY2hhcmFjdGVycyBsb25nLCBidXQgb25seSAxMDAgaXMgc3VwcG9ydGVkIiAiJExJTkVOTyIgNQorICBmaQorCisgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLmN5Z3dpbiI7IHRoZW4KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGN5Z3dpbiByZWxlYXNlIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGN5Z3dpbiByZWxlYXNlLi4uICIgPiY2OyB9CisgICAgQ1lHV0lOX1ZFUlNJT049YCRVTkFNRSAtcmAKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJENZR1dJTl9WRVJTSU9OIiA+JjUKKyRhc19lY2hvICIkQ1lHV0lOX1ZFUlNJT04iID4mNjsgfQorICAgIFdJTkRPV1NfRU5WX1ZFTkRPUj0nY3lnd2luJworICAgIFdJTkRPV1NfRU5WX1ZFUlNJT049IiRDWUdXSU5fVkVSU0lPTiIKKworICAgIENZR1dJTl9WRVJTSU9OX09LPWAkRUNITyAkQ1lHV0lOX1ZFUlNJT04gfCAkR1JFUCBeMS43LmAKKyAgICBpZiB0ZXN0ICJ4JENZR1dJTl9WRVJTSU9OX09LIiA9IHg7IHRoZW4KKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogWW91ciBjeWd3aW4gaXMgdG9vIG9sZC4gWW91IGFyZSBydW5uaW5nICRDWUdXSU5fVkVSU0lPTiwgYnV0IGF0IGxlYXN0IGN5Z3dpbiAxLjcgaXMgcmVxdWlyZWQuIFBsZWFzZSB1cGdyYWRlLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBZb3VyIGN5Z3dpbiBpcyB0b28gb2xkLiBZb3UgYXJlIHJ1bm5pbmcgJENZR1dJTl9WRVJTSU9OLCBidXQgYXQgbGVhc3QgY3lnd2luIDEuNyBpcyByZXF1aXJlZC4gUGxlYXNlIHVwZ3JhZGUuIiA+JjY7fQorICAgICAgYXNfZm5fZXJyb3IgJD8gIkNhbm5vdCBjb250aW51ZSIgIiRMSU5FTk8iIDUKKyAgICBmaQorICAgIGlmIHRlc3QgIngkQ1lHUEFUSCIgPSB4OyB0aGVuCisgICAgICAgIGFzX2ZuX2Vycm9yICQ/ICJTb21ldGhpbmcgaXMgd3Jvbmcgd2l0aCB5b3VyIGN5Z3dpbiBpbnN0YWxsYXRpb24gc2luY2UgSSBjYW5ub3QgZmluZCBjeWdwYXRoLmV4ZSBpbiB5b3VyIHBhdGgiICIkTElORU5PIiA1CisgICAgZmkKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGN5Z3dpbiByb290IGRpcmVjdG9yeSBhcyB1bml4LXN0eWxlIHBhdGgiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgY3lnd2luIHJvb3QgZGlyZWN0b3J5IGFzIHVuaXgtc3R5bGUgcGF0aC4uLiAiID4mNjsgfQorICAgICMgVGhlIGNtZCBvdXRwdXQgZW5kcyB3aXRoIFdpbmRvd3MgbGluZSBlbmRpbmdzIChDUi9MRiksIHRoZSBncmVwIGNvbW1hbmQgd2lsbCBzdHJpcCB0aGF0IGF3YXkKKyAgICBjeWd3aW5fd2lucGF0aF9yb290PWBjZCAvIDsgY21kIC9jIGNkIHwgZ3JlcCAiLioiYAorICAgICMgRm9yY2UgY3lncGF0aCB0byByZXBvcnQgdGhlIHByb3BlciByb290IGJ5IGluY2x1ZGluZyBhIHRyYWlsaW5nIHNwYWNlLCBhbmQgdGhlbiBzdHJpcHBpbmcgaXQgb2ZmIGFnYWluLgorICAgIENZR1dJTl9ST09UX1BBVEg9YCRDWUdQQVRIIC11ICIkY3lnd2luX3dpbnBhdGhfcm9vdCAiIHwgJENVVCAtZiAxIC1kICIgImAKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJENZR1dJTl9ST09UX1BBVEgiID4mNQorJGFzX2VjaG8gIiRDWUdXSU5fUk9PVF9QQVRIIiA+JjY7IH0KKyAgICBXSU5ET1dTX0VOVl9ST09UX1BBVEg9IiRDWUdXSU5fUk9PVF9QQVRIIgorICAgIHRlc3RfY3lnZHJpdmVfcHJlZml4PWAkRUNITyAkQ1lHV0lOX1JPT1RfUEFUSCB8ICRHUkVQIF4vY3lnZHJpdmUvYAorICAgIGlmIHRlc3QgIngkdGVzdF9jeWdkcml2ZV9wcmVmaXgiID0geDsgdGhlbgorICAgICAgICBhc19mbl9lcnJvciAkPyAiWW91ciBjeWdkcml2ZSBwcmVmaXggaXMgbm90IC9jeWdkcml2ZS4gVGhpcyBpcyBjdXJyZW50bHkgbm90IHN1cHBvcnRlZC4gQ2hhbmdlIHdpdGggbW91bnQgLWMuIiAiJExJTkVOTyIgNQorICAgIGZpCisgIGVsaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MubXN5cyI7IHRoZW4KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIG1zeXMgcmVsZWFzZSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBtc3lzIHJlbGVhc2UuLi4gIiA+JjY7IH0KKyAgICBNU1lTX1ZFUlNJT049YCRVTkFNRSAtcmAKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJE1TWVNfVkVSU0lPTiIgPiY1CiskYXNfZWNobyAiJE1TWVNfVkVSU0lPTiIgPiY2OyB9CisKKyAgICBXSU5ET1dTX0VOVl9WRU5ET1I9J21zeXMnCisgICAgV0lORE9XU19FTlZfVkVSU0lPTj0iJE1TWVNfVkVSU0lPTiIKKworICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgbXN5cyByb290IGRpcmVjdG9yeSBhcyB1bml4LXN0eWxlIHBhdGgiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgbXN5cyByb290IGRpcmVjdG9yeSBhcyB1bml4LXN0eWxlIHBhdGguLi4gIiA+JjY7IH0KKyAgICAjIFRoZSBjbWQgb3V0cHV0IGVuZHMgd2l0aCBXaW5kb3dzIGxpbmUgZW5kaW5ncyAoQ1IvTEYpLCB0aGUgZ3JlcCBjb21tYW5kIHdpbGwgc3RyaXAgdGhhdCBhd2F5CisgICAgTVNZU19ST09UX1BBVEg9YGNkIC8gOyBjbWQgL2MgY2QgfCBncmVwICIuKiJgCisKKyAgd2luZG93c19wYXRoPSIkTVNZU19ST09UX1BBVEgiCisgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLmN5Z3dpbiI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRDWUdQQVRIIC11ICIkd2luZG93c19wYXRoImAKKyAgICBNU1lTX1JPT1RfUEFUSD0iJHVuaXhfcGF0aCIKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJEVDSE8gIiR3aW5kb3dzX3BhdGgiIHwgJFNFRCAtZSAncyxeXFwoLlxcKTosL1xcMSxnJyAtZSAncyxcXFxcLC8sZydgCisgICAgTVNZU19ST09UX1BBVEg9IiR1bml4X3BhdGgiCisgIGZpCisKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJE1TWVNfUk9PVF9QQVRIIiA+JjUKKyRhc19lY2hvICIkTVNZU19ST09UX1BBVEgiID4mNjsgfQorICAgIFdJTkRPV1NfRU5WX1JPT1RfUEFUSD0iJE1TWVNfUk9PVF9QQVRIIgorICBlbHNlCisgICAgYXNfZm5fZXJyb3IgJD8gIlVua25vd24gV2luZG93cyBlbnZpcm9ubWVudC4gTmVpdGhlciBjeWd3aW4gbm9yIG1zeXMgd2FzIGRldGVjdGVkLiIgIiRMSU5FTk8iIDUKKyAgZmkKKworICAjIFRlc3QgaWYgd2luZG93cyBvciB1bml4IChjeWd3aW4vbXN5cykgZmluZCBpcyBmaXJzdCBpbiBwYXRoLgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoYXQga2luZCBvZiAnZmluZCcgaXMgZmlyc3Qgb24gdGhlIFBBVEgiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hhdCBraW5kIG9mICdmaW5kJyBpcyBmaXJzdCBvbiB0aGUgUEFUSC4uLiAiID4mNjsgfQorICBGSU5EX0JJTkFSWV9PVVRQVVQ9YGZpbmQgLS12ZXJzaW9uIDI+JjFgCisgIGlmIHRlc3QgInhgZWNobyAkRklORF9CSU5BUllfT1VUUFVUIHwgJEdSRVAgR05VYCIgIT0geDsgdGhlbgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB1bml4IHN0eWxlIiA+JjUKKyRhc19lY2hvICJ1bml4IHN0eWxlIiA+JjY7IH0KKyAgZWxpZiB0ZXN0ICJ4YGVjaG8gJEZJTkRfQklOQVJZX09VVFBVVCB8ICRHUkVQIEZJTkRgIiAhPSB4OyB0aGVuCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IFdpbmRvd3MiID4mNQorJGFzX2VjaG8gIldpbmRvd3MiID4mNjsgfQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogWW91ciBwYXRoIGNvbnRhaW5zIFdpbmRvd3MgdG9vbHMgKEM6XFdpbmRvd3Ncc3lzdGVtMzIpIGJlZm9yZSB5b3VyIHVuaXggKGN5Z3dpbiBvciBtc3lzKSB0b29scy4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogWW91ciBwYXRoIGNvbnRhaW5zIFdpbmRvd3MgdG9vbHMgKEM6XFdpbmRvd3Ncc3lzdGVtMzIpIGJlZm9yZSB5b3VyIHVuaXggKGN5Z3dpbiBvciBtc3lzKSB0b29scy4iID4mNjt9CisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUaGlzIHdpbGwgbm90IHdvcmsuIFBsZWFzZSBjb3JyZWN0IGFuZCBtYWtlIHN1cmUgL3Vzci9iaW4gKG9yIHNpbWlsYXIpIGlzIGZpcnN0IGluIHBhdGguIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoaXMgd2lsbCBub3Qgd29yay4gUGxlYXNlIGNvcnJlY3QgYW5kIG1ha2Ugc3VyZSAvdXNyL2JpbiAob3Igc2ltaWxhcikgaXMgZmlyc3QgaW4gcGF0aC4iID4mNjt9CisgICAgYXNfZm5fZXJyb3IgJD8gIkNhbm5vdCBjb250aW51ZSIgIiRMSU5FTk8iIDUKKyAgZWxzZQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB1bmtub3duIiA+JjUKKyRhc19lY2hvICJ1bmtub3duIiA+JjY7IH0KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IEl0IHNlZW1zIHRoYXQgeW91ciBmaW5kIHV0aWxpdHkgaXMgbm9uLXN0YW5kYXJkLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBJdCBzZWVtcyB0aGF0IHlvdXIgZmluZCB1dGlsaXR5IGlzIG5vbi1zdGFuZGFyZC4iID4mMjt9CisgIGZpCisKIGVsc2UKLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9CisgIFBBVEhfU0VQPSI6IgogZmkKIAogCi0gIHRlc3QgLW4gIiRCREVQU19GVFAiICYmIGJyZWFrCi1kb25lCisKK2NkICIkQ1VSRElSIgorCisKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorCisgICMgSW5wdXQgbWlnaHQgYmUgZ2l2ZW4gYXMgV2luZG93cyBmb3JtYXQsIHN0YXJ0IGJ5IGNvbnZlcnRpbmcgdG8KKyAgIyB1bml4IGZvcm1hdC4KKyAgcGF0aD0iJFNSQ19ST09UIgorICBuZXdfcGF0aD1gJENZR1BBVEggLXUgIiRwYXRoImAKKworICAjIEN5Z3dpbiB0cmllcyB0byBoaWRlIHNvbWUgYXNwZWN0cyBvZiB0aGUgV2luZG93cyBmaWxlIHN5c3RlbSwgc3VjaCB0aGF0IGJpbmFyaWVzIGFyZQorICAjIG5hbWVkIC5leGUgYnV0IGNhbGxlZCB3aXRob3V0IHRoYXQgc3VmZml4LiBUaGVyZWZvcmUsICJmb28iIGFuZCAiZm9vLmV4ZSIgYXJlIGNvbnNpZGVyZWQKKyAgIyB0aGUgc2FtZSBmaWxlLCBtb3N0IG9mIHRoZSB0aW1lIChhcyBpbiAidGVzdCAtZiIpLiBCdXQgbm90IHdoZW4gcnVubmluZyBjeWdwYXRoIC1zLCB0aGVuCisgICMgImZvby5leGUiIGlzIE9LIGJ1dCAiZm9vIiBpcyBhbiBlcnJvci4KKyAgIworICAjIFRoaXMgdGVzdCBpcyB0aGVyZWZvcmUgc2xpZ2h0bHkgbW9yZSBhY2N1cmF0ZSB0aGFuICJ0ZXN0IC1mIiB0byBjaGVjayBmb3IgZmlsZSBwcmVjZW5zZS4KKyAgIyBJdCBpcyBhbHNvIGEgd2F5IHRvIG1ha2Ugc3VyZSB3ZSBnb3QgdGhlIHByb3BlciBmaWxlIG5hbWUgZm9yIHRoZSByZWFsIHRlc3QgbGF0ZXIgb24uCisgIHRlc3Rfc2hvcnRwYXRoPWAkQ1lHUEFUSCAtcyAtbSAiJG5ld19wYXRoIiAyPiAvZGV2L251bGxgCisgIGlmIHRlc3QgIngkdGVzdF9zaG9ydHBhdGgiID0geDsgdGhlbgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGhlIHBhdGggb2YgU1JDX1JPT1QsIHdoaWNoIHJlc29sdmVzIGFzIFwiJHBhdGhcIiwgaXMgaW52YWxpZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhlIHBhdGggb2YgU1JDX1JPT1QsIHdoaWNoIHJlc29sdmVzIGFzIFwiJHBhdGhcIiwgaXMgaW52YWxpZC4iID4mNjt9CisgICAgYXNfZm5fZXJyb3IgJD8gIkNhbm5vdCBsb2NhdGUgdGhlIHRoZSBwYXRoIG9mIFNSQ19ST09UIiAiJExJTkVOTyIgNQorICBmaQorCisgICMgQ2FsbCBoZWxwZXIgZnVuY3Rpb24gd2hpY2ggcG9zc2libHkgY29udmVydHMgdGhpcyB1c2luZyBET1Mtc3R5bGUgc2hvcnQgbW9kZS4KKyAgIyBJZiBzbywgdGhlIHVwZGF0ZWQgcGF0aCBpcyBzdG9yZWQgaW4gJG5ld19wYXRoLgorCisgIGlucHV0X3BhdGg9IiRuZXdfcGF0aCIKKyAgIyBDaGVjayBpZiB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhpcyB1c2luZyBET1Mtc3R5bGUgc2hvcnQgbW9kZS4gSWYgdGhlIHBhdGgKKyAgIyBjb250YWlucyBqdXN0IHNpbXBsZSBjaGFyYWN0ZXJzLCB1c2UgaXQuIE90aGVyd2lzZSAoc3BhY2VzLCB3ZWlyZCBjaGFyYWN0ZXJzKSwKKyAgIyB0YWtlIG5vIGNoYW5jZXMgYW5kIHJld3JpdGUgaXQuCisgICMgTm90ZTogbTQgZWF0cyBvdXIgW10sIHNvIHdlIG5lZWQgdG8gdXNlIFsgYW5kIF0gaW5zdGVhZC4KKyAgaGFzX2ZvcmJpZGRlbl9jaGFycz1gJEVDSE8gIiRpbnB1dF9wYXRoIiB8ICRHUkVQIFteLS5fL2EtekEtWjAtOV1gCisgIGlmIHRlc3QgIngkaGFzX2ZvcmJpZGRlbl9jaGFycyIgIT0geDsgdGhlbgorICAgICMgTm93IGNvbnZlcnQgaXQgdG8gbWl4ZWQgRE9TLXN0eWxlLCBzaG9ydCBtb2RlIChubyBzcGFjZXMsIGFuZCAvIGluc3RlYWQgb2YgXCkKKyAgICBzaG9ydG1vZGVfcGF0aD1gJENZR1BBVEggLXMgLW0gLWEgIiRpbnB1dF9wYXRoImAKKyAgICBwYXRoX2FmdGVyX3Nob3J0bW9kZT1gJENZR1BBVEggLXUgIiRzaG9ydG1vZGVfcGF0aCJgCisgICAgaWYgdGVzdCAieCRwYXRoX2FmdGVyX3Nob3J0bW9kZSIgIT0gIngkaW5wdXRfdG9fc2hvcnRwYXRoIjsgdGhlbgorICAgICAgIyBHb2luZyB0byBzaG9ydCBtb2RlIGFuZCBiYWNrIGFnYWluIGRpZCBpbmRlZWQgbWF0dGVyLiBTaW5jZSBzaG9ydCBtb2RlIGlzCisgICAgICAjIGNhc2UgaW5zZW5zaXRpdmUsIGxldCdzIG1ha2UgaXQgbG93ZXJjYXNlIHRvIGltcHJvdmUgcmVhZGFiaWxpdHkuCisgICAgICBzaG9ydG1vZGVfcGF0aD1gJEVDSE8gIiRzaG9ydG1vZGVfcGF0aCIgfCAkVFIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAorICAgICAgIyBOb3cgY29udmVydCBpdCBiYWNrIHRvIFVuaXgtc3RpbGUgKGN5Z3BhdGgpCisgICAgICBpbnB1dF9wYXRoPWAkQ1lHUEFUSCAtdSAiJHNob3J0bW9kZV9wYXRoImAKKyAgICAgIG5ld19wYXRoPSIkaW5wdXRfcGF0aCIKKyAgICBmaQorICBmaQorCisgIHRlc3RfY3lnZHJpdmVfcHJlZml4PWAkRUNITyAkaW5wdXRfcGF0aCB8ICRHUkVQIF4vY3lnZHJpdmUvYAorICBpZiB0ZXN0ICJ4JHRlc3RfY3lnZHJpdmVfcHJlZml4IiA9IHg7IHRoZW4KKyAgICAjIEFzIGEgc2ltcGxlIGZpeCwgZXhjbHVkZSAvdXNyL2JpbiBzaW5jZSBpdCdzIG5vdCBhIHJlYWwgcGF0aC4KKyAgICBpZiB0ZXN0ICJ4YCRFQ0hPICRuZXdfcGF0aCB8ICRHUkVQIF4vdXNyL2Jpbi9gIiA9IHg7IHRoZW4KKyAgICAgICMgVGhlIHBhdGggaXMgaW4gYSBDeWd3aW4gc3BlY2lhbCBkaXJlY3RvcnkgKGUuZy4gL2hvbWUpLiBXZSBuZWVkIHRoaXMgY29udmVydGVkIHRvCisgICAgICAjIGEgcGF0aCBwcmVmaXhlZCBieSAvY3lnZHJpdmUgZm9yIGZpeHBhdGggdG8gd29yay4KKyAgICAgIG5ld19wYXRoPSIkQ1lHV0lOX1JPT1RfUEFUSCRpbnB1dF9wYXRoIgorICAgIGZpCisgIGZpCisKKworICBpZiB0ZXN0ICJ4JHBhdGgiICE9ICJ4JG5ld19wYXRoIjsgdGhlbgorICAgIFNSQ19ST09UPSIkbmV3X3BhdGgiCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBSZXdyaXRpbmcgU1JDX1JPT1QgdG8gXCIkbmV3X3BhdGhcIiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBSZXdyaXRpbmcgU1JDX1JPT1QgdG8gXCIkbmV3X3BhdGhcIiIgPiY2O30KKyAgZmkKKworICBlbGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLm1zeXMiOyB0aGVuCisKKyAgcGF0aD0iJFNSQ19ST09UIgorICBoYXNfY29sb249YCRFQ0hPICRwYXRoIHwgJEdSRVAgXi46YAorICBuZXdfcGF0aD0iJHBhdGgiCisgIGlmIHRlc3QgIngkaGFzX2NvbG9uIiA9IHg7IHRoZW4KKyAgICAjIE5vdCBpbiBtaXhlZCBvciBXaW5kb3dzIHN0eWxlLCBzdGFydCBieSB0aGF0LgorICAgIG5ld19wYXRoPWBjbWQgLy9jIGVjaG8gJHBhdGhgCisgIGZpCisKKworICBpbnB1dF9wYXRoPSIkbmV3X3BhdGgiCisgICMgQ2hlY2sgaWYgd2UgbmVlZCB0byBjb252ZXJ0IHRoaXMgdXNpbmcgRE9TLXN0eWxlIHNob3J0IG1vZGUuIElmIHRoZSBwYXRoCisgICMgY29udGFpbnMganVzdCBzaW1wbGUgY2hhcmFjdGVycywgdXNlIGl0LiBPdGhlcndpc2UgKHNwYWNlcywgd2VpcmQgY2hhcmFjdGVycyksCisgICMgdGFrZSBubyBjaGFuY2VzIGFuZCByZXdyaXRlIGl0LgorICAjIE5vdGU6IG00IGVhdHMgb3VyIFtdLCBzbyB3ZSBuZWVkIHRvIHVzZSBbIGFuZCBdIGluc3RlYWQuCisgIGhhc19mb3JiaWRkZW5fY2hhcnM9YCRFQ0hPICIkaW5wdXRfcGF0aCIgfCAkR1JFUCBbXi1fLzphLXpBLVowLTldYAorICBpZiB0ZXN0ICJ4JGhhc19mb3JiaWRkZW5fY2hhcnMiICE9IHg7IHRoZW4KKyAgICAjIE5vdyBjb252ZXJ0IGl0IHRvIG1peGVkIERPUy1zdHlsZSwgc2hvcnQgbW9kZSAobm8gc3BhY2VzLCBhbmQgLyBpbnN0ZWFkIG9mIFwpCisgICAgbmV3X3BhdGg9YGNtZCAvYyAiZm9yICVBIGluIChcIiRpbnB1dF9wYXRoXCIpIGRvIEBlY2hvICV+c0EifCRUUiBcXFxcXFxcXCAvIHwgJFRSICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J2AKKyAgZmkKKworCisgIHdpbmRvd3NfcGF0aD0iJG5ld19wYXRoIgorICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5jeWd3aW4iOyB0aGVuCisgICAgdW5peF9wYXRoPWAkQ1lHUEFUSCAtdSAiJHdpbmRvd3NfcGF0aCJgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGVsaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MubXN5cyI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRFQ0hPICIkd2luZG93c19wYXRoIiB8ICRTRUQgLWUgJ3MsXlxcKC5cXCk6LC9cXDEsZycgLWUgJ3MsXFxcXCwvLGcnYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBmaQorCisgIGlmIHRlc3QgIngkcGF0aCIgIT0gIngkbmV3X3BhdGgiOyB0aGVuCisgICAgU1JDX1JPT1Q9IiRuZXdfcGF0aCIKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFJld3JpdGluZyBTUkNfUk9PVCB0byBcIiRuZXdfcGF0aFwiIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFJld3JpdGluZyBTUkNfUk9PVCB0byBcIiRuZXdfcGF0aFwiIiA+JjY7fQorICBmaQorCisgICMgU2F2ZSB0aGUgZmlyc3QgMTAgYnl0ZXMgb2YgdGhpcyBwYXRoIHRvIHRoZSBzdG9yYWdlLCBzbyBmaXhwYXRoIGNhbiB3b3JrLgorICBhbGxfZml4cGF0aF9wcmVmaXhlcz0oIiR7YWxsX2ZpeHBhdGhfcHJlZml4ZXNbQF19IiAiJHtuZXdfcGF0aDowOjEwfSIpCisKKyAgZWxzZQorICAgICMgV2UncmUgb24gYSBwb3NpeCBwbGF0Zm9ybS4gSG9vcmF5ISA6KQorICAgIHBhdGg9IiRTUkNfUk9PVCIKKworICAgIGlmIHRlc3QgISAtZiAiJHBhdGgiICYmIHRlc3QgISAtZCAiJHBhdGgiOyB0aGVuCisgICAgICBhc19mbl9lcnJvciAkPyAiVGhlIHBhdGggb2YgU1JDX1JPT1QsIHdoaWNoIHJlc29sdmVzIGFzIFwiJHBhdGhcIiwgaXMgbm90IGZvdW5kLiIgIiRMSU5FTk8iIDUKKyAgICBmaQorCisgICAgaGFzX3NwYWNlPWAkRUNITyAiJHBhdGgiIHwgJEdSRVAgIiAiYAorICAgIGlmIHRlc3QgIngkaGFzX3NwYWNlIiAhPSB4OyB0aGVuCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSBwYXRoIG9mIFNSQ19ST09ULCB3aGljaCByZXNvbHZlcyBhcyBcIiRwYXRoXCIsIGlzIGludmFsaWQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoZSBwYXRoIG9mIFNSQ19ST09ULCB3aGljaCByZXNvbHZlcyBhcyBcIiRwYXRoXCIsIGlzIGludmFsaWQuIiA+JjY7fQorICAgICAgYXNfZm5fZXJyb3IgJD8gIlNwYWNlcyBhcmUgbm90IGFsbG93ZWQgaW4gdGhpcyBwYXRoLiIgIiRMSU5FTk8iIDUKKyAgICBmaQorICBmaQorCisKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorCisgICMgSW5wdXQgbWlnaHQgYmUgZ2l2ZW4gYXMgV2luZG93cyBmb3JtYXQsIHN0YXJ0IGJ5IGNvbnZlcnRpbmcgdG8KKyAgIyB1bml4IGZvcm1hdC4KKyAgcGF0aD0iJENVUkRJUiIKKyAgbmV3X3BhdGg9YCRDWUdQQVRIIC11ICIkcGF0aCJgCisKKyAgIyBDeWd3aW4gdHJpZXMgdG8gaGlkZSBzb21lIGFzcGVjdHMgb2YgdGhlIFdpbmRvd3MgZmlsZSBzeXN0ZW0sIHN1Y2ggdGhhdCBiaW5hcmllcyBhcmUKKyAgIyBuYW1lZCAuZXhlIGJ1dCBjYWxsZWQgd2l0aG91dCB0aGF0IHN1ZmZpeC4gVGhlcmVmb3JlLCAiZm9vIiBhbmQgImZvby5leGUiIGFyZSBjb25zaWRlcmVkCisgICMgdGhlIHNhbWUgZmlsZSwgbW9zdCBvZiB0aGUgdGltZSAoYXMgaW4gInRlc3QgLWYiKS4gQnV0IG5vdCB3aGVuIHJ1bm5pbmcgY3lncGF0aCAtcywgdGhlbgorICAjICJmb28uZXhlIiBpcyBPSyBidXQgImZvbyIgaXMgYW4gZXJyb3IuCisgICMKKyAgIyBUaGlzIHRlc3QgaXMgdGhlcmVmb3JlIHNsaWdodGx5IG1vcmUgYWNjdXJhdGUgdGhhbiAidGVzdCAtZiIgdG8gY2hlY2sgZm9yIGZpbGUgcHJlY2Vuc2UuCisgICMgSXQgaXMgYWxzbyBhIHdheSB0byBtYWtlIHN1cmUgd2UgZ290IHRoZSBwcm9wZXIgZmlsZSBuYW1lIGZvciB0aGUgcmVhbCB0ZXN0IGxhdGVyIG9uLgorICB0ZXN0X3Nob3J0cGF0aD1gJENZR1BBVEggLXMgLW0gIiRuZXdfcGF0aCIgMj4gL2Rldi9udWxsYAorICBpZiB0ZXN0ICJ4JHRlc3Rfc2hvcnRwYXRoIiA9IHg7IHRoZW4KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSBwYXRoIG9mIENVUkRJUiwgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkcGF0aFwiLCBpcyBpbnZhbGlkLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUaGUgcGF0aCBvZiBDVVJESVIsIHdoaWNoIHJlc29sdmVzIGFzIFwiJHBhdGhcIiwgaXMgaW52YWxpZC4iID4mNjt9CisgICAgYXNfZm5fZXJyb3IgJD8gIkNhbm5vdCBsb2NhdGUgdGhlIHRoZSBwYXRoIG9mIENVUkRJUiIgIiRMSU5FTk8iIDUKKyAgZmkKKworICAjIENhbGwgaGVscGVyIGZ1bmN0aW9uIHdoaWNoIHBvc3NpYmx5IGNvbnZlcnRzIHRoaXMgdXNpbmcgRE9TLXN0eWxlIHNob3J0IG1vZGUuCisgICMgSWYgc28sIHRoZSB1cGRhdGVkIHBhdGggaXMgc3RvcmVkIGluICRuZXdfcGF0aC4KKworICBpbnB1dF9wYXRoPSIkbmV3X3BhdGgiCisgICMgQ2hlY2sgaWYgd2UgbmVlZCB0byBjb252ZXJ0IHRoaXMgdXNpbmcgRE9TLXN0eWxlIHNob3J0IG1vZGUuIElmIHRoZSBwYXRoCisgICMgY29udGFpbnMganVzdCBzaW1wbGUgY2hhcmFjdGVycywgdXNlIGl0LiBPdGhlcndpc2UgKHNwYWNlcywgd2VpcmQgY2hhcmFjdGVycyksCisgICMgdGFrZSBubyBjaGFuY2VzIGFuZCByZXdyaXRlIGl0LgorICAjIE5vdGU6IG00IGVhdHMgb3VyIFtdLCBzbyB3ZSBuZWVkIHRvIHVzZSBbIGFuZCBdIGluc3RlYWQuCisgIGhhc19mb3JiaWRkZW5fY2hhcnM9YCRFQ0hPICIkaW5wdXRfcGF0aCIgfCAkR1JFUCBbXi0uXy9hLXpBLVowLTldYAorICBpZiB0ZXN0ICJ4JGhhc19mb3JiaWRkZW5fY2hhcnMiICE9IHg7IHRoZW4KKyAgICAjIE5vdyBjb252ZXJ0IGl0IHRvIG1peGVkIERPUy1zdHlsZSwgc2hvcnQgbW9kZSAobm8gc3BhY2VzLCBhbmQgLyBpbnN0ZWFkIG9mIFwpCisgICAgc2hvcnRtb2RlX3BhdGg9YCRDWUdQQVRIIC1zIC1tIC1hICIkaW5wdXRfcGF0aCJgCisgICAgcGF0aF9hZnRlcl9zaG9ydG1vZGU9YCRDWUdQQVRIIC11ICIkc2hvcnRtb2RlX3BhdGgiYAorICAgIGlmIHRlc3QgIngkcGF0aF9hZnRlcl9zaG9ydG1vZGUiICE9ICJ4JGlucHV0X3RvX3Nob3J0cGF0aCI7IHRoZW4KKyAgICAgICMgR29pbmcgdG8gc2hvcnQgbW9kZSBhbmQgYmFjayBhZ2FpbiBkaWQgaW5kZWVkIG1hdHRlci4gU2luY2Ugc2hvcnQgbW9kZSBpcworICAgICAgIyBjYXNlIGluc2Vuc2l0aXZlLCBsZXQncyBtYWtlIGl0IGxvd2VyY2FzZSB0byBpbXByb3ZlIHJlYWRhYmlsaXR5LgorICAgICAgc2hvcnRtb2RlX3BhdGg9YCRFQ0hPICIkc2hvcnRtb2RlX3BhdGgiIHwgJFRSICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J2AKKyAgICAgICMgTm93IGNvbnZlcnQgaXQgYmFjayB0byBVbml4LXN0aWxlIChjeWdwYXRoKQorICAgICAgaW5wdXRfcGF0aD1gJENZR1BBVEggLXUgIiRzaG9ydG1vZGVfcGF0aCJgCisgICAgICBuZXdfcGF0aD0iJGlucHV0X3BhdGgiCisgICAgZmkKKyAgZmkKKworICB0ZXN0X2N5Z2RyaXZlX3ByZWZpeD1gJEVDSE8gJGlucHV0X3BhdGggfCAkR1JFUCBeL2N5Z2RyaXZlL2AKKyAgaWYgdGVzdCAieCR0ZXN0X2N5Z2RyaXZlX3ByZWZpeCIgPSB4OyB0aGVuCisgICAgIyBBcyBhIHNpbXBsZSBmaXgsIGV4Y2x1ZGUgL3Vzci9iaW4gc2luY2UgaXQncyBub3QgYSByZWFsIHBhdGguCisgICAgaWYgdGVzdCAieGAkRUNITyAkbmV3X3BhdGggfCAkR1JFUCBeL3Vzci9iaW4vYCIgPSB4OyB0aGVuCisgICAgICAjIFRoZSBwYXRoIGlzIGluIGEgQ3lnd2luIHNwZWNpYWwgZGlyZWN0b3J5IChlLmcuIC9ob21lKS4gV2UgbmVlZCB0aGlzIGNvbnZlcnRlZCB0bworICAgICAgIyBhIHBhdGggcHJlZml4ZWQgYnkgL2N5Z2RyaXZlIGZvciBmaXhwYXRoIHRvIHdvcmsuCisgICAgICBuZXdfcGF0aD0iJENZR1dJTl9ST09UX1BBVEgkaW5wdXRfcGF0aCIKKyAgICBmaQorICBmaQorCisKKyAgaWYgdGVzdCAieCRwYXRoIiAhPSAieCRuZXdfcGF0aCI7IHRoZW4KKyAgICBDVVJESVI9IiRuZXdfcGF0aCIKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFJld3JpdGluZyBDVVJESVIgdG8gXCIkbmV3X3BhdGhcIiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBSZXdyaXRpbmcgQ1VSRElSIHRvIFwiJG5ld19wYXRoXCIiID4mNjt9CisgIGZpCisKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorCisgIHBhdGg9IiRDVVJESVIiCisgIGhhc19jb2xvbj1gJEVDSE8gJHBhdGggfCAkR1JFUCBeLjpgCisgIG5ld19wYXRoPSIkcGF0aCIKKyAgaWYgdGVzdCAieCRoYXNfY29sb24iID0geDsgdGhlbgorICAgICMgTm90IGluIG1peGVkIG9yIFdpbmRvd3Mgc3R5bGUsIHN0YXJ0IGJ5IHRoYXQuCisgICAgbmV3X3BhdGg9YGNtZCAvL2MgZWNobyAkcGF0aGAKKyAgZmkKKworCisgIGlucHV0X3BhdGg9IiRuZXdfcGF0aCIKKyAgIyBDaGVjayBpZiB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhpcyB1c2luZyBET1Mtc3R5bGUgc2hvcnQgbW9kZS4gSWYgdGhlIHBhdGgKKyAgIyBjb250YWlucyBqdXN0IHNpbXBsZSBjaGFyYWN0ZXJzLCB1c2UgaXQuIE90aGVyd2lzZSAoc3BhY2VzLCB3ZWlyZCBjaGFyYWN0ZXJzKSwKKyAgIyB0YWtlIG5vIGNoYW5jZXMgYW5kIHJld3JpdGUgaXQuCisgICMgTm90ZTogbTQgZWF0cyBvdXIgW10sIHNvIHdlIG5lZWQgdG8gdXNlIFsgYW5kIF0gaW5zdGVhZC4KKyAgaGFzX2ZvcmJpZGRlbl9jaGFycz1gJEVDSE8gIiRpbnB1dF9wYXRoIiB8ICRHUkVQIFteLV8vOmEtekEtWjAtOV1gCisgIGlmIHRlc3QgIngkaGFzX2ZvcmJpZGRlbl9jaGFycyIgIT0geDsgdGhlbgorICAgICMgTm93IGNvbnZlcnQgaXQgdG8gbWl4ZWQgRE9TLXN0eWxlLCBzaG9ydCBtb2RlIChubyBzcGFjZXMsIGFuZCAvIGluc3RlYWQgb2YgXCkKKyAgICBuZXdfcGF0aD1gY21kIC9jICJmb3IgJUEgaW4gKFwiJGlucHV0X3BhdGhcIikgZG8gQGVjaG8gJX5zQSJ8JFRSIFxcXFxcXFxcIC8gfCAkVFIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAorICBmaQorCisKKyAgd2luZG93c19wYXRoPSIkbmV3X3BhdGgiCisgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLmN5Z3dpbiI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRDWUdQQVRIIC11ICIkd2luZG93c19wYXRoImAKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJEVDSE8gIiR3aW5kb3dzX3BhdGgiIHwgJFNFRCAtZSAncyxeXFwoLlxcKTosL1xcMSxnJyAtZSAncyxcXFxcLC8sZydgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGZpCisKKyAgaWYgdGVzdCAieCRwYXRoIiAhPSAieCRuZXdfcGF0aCI7IHRoZW4KKyAgICBDVVJESVI9IiRuZXdfcGF0aCIKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFJld3JpdGluZyBDVVJESVIgdG8gXCIkbmV3X3BhdGhcIiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBSZXdyaXRpbmcgQ1VSRElSIHRvIFwiJG5ld19wYXRoXCIiID4mNjt9CisgIGZpCisKKyAgIyBTYXZlIHRoZSBmaXJzdCAxMCBieXRlcyBvZiB0aGlzIHBhdGggdG8gdGhlIHN0b3JhZ2UsIHNvIGZpeHBhdGggY2FuIHdvcmsuCisgIGFsbF9maXhwYXRoX3ByZWZpeGVzPSgiJHthbGxfZml4cGF0aF9wcmVmaXhlc1tAXX0iICIke25ld19wYXRoOjA6MTB9IikKKworICBlbHNlCisgICAgIyBXZSdyZSBvbiBhIHBvc2l4IHBsYXRmb3JtLiBIb29yYXkhIDopCisgICAgcGF0aD0iJENVUkRJUiIKKworICAgIGlmIHRlc3QgISAtZiAiJHBhdGgiICYmIHRlc3QgISAtZCAiJHBhdGgiOyB0aGVuCisgICAgICBhc19mbl9lcnJvciAkPyAiVGhlIHBhdGggb2YgQ1VSRElSLCB3aGljaCByZXNvbHZlcyBhcyBcIiRwYXRoXCIsIGlzIG5vdCBmb3VuZC4iICIkTElORU5PIiA1CisgICAgZmkKKworICAgIGhhc19zcGFjZT1gJEVDSE8gIiRwYXRoIiB8ICRHUkVQICIgImAKKyAgICBpZiB0ZXN0ICJ4JGhhc19zcGFjZSIgIT0geDsgdGhlbgorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUaGUgcGF0aCBvZiBDVVJESVIsIHdoaWNoIHJlc29sdmVzIGFzIFwiJHBhdGhcIiwgaXMgaW52YWxpZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhlIHBhdGggb2YgQ1VSRElSLCB3aGljaCByZXNvbHZlcyBhcyBcIiRwYXRoXCIsIGlzIGludmFsaWQuIiA+JjY7fQorICAgICAgYXNfZm5fZXJyb3IgJD8gIlNwYWNlcyBhcmUgbm90IGFsbG93ZWQgaW4gdGhpcyBwYXRoLiIgIiRMSU5FTk8iIDUKKyAgICBmaQorICBmaQorCisKK2lmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PUyIgPSAieHNvbGFyaXMiOyB0aGVuCisgICAgIyBBZGQgZXh0cmEgc2VhcmNoIHBhdGhzIG9uIHNvbGFyaXMgZm9yIHV0aWxpdGllcyBsaWtlIGFyIGFuZCBhcyBldGMuLi4KKyAgICBQQVRIPSIkUEFUSDovdXNyL2Njcy9iaW46L3Vzci9zZncvYmluOi9vcHQvY3N3L2JpbiIKK2ZpCisKKyMgWW91IGNhbiBmb3JjZSB0aGUgc3lzLXJvb3QgaWYgdGhlIHN5cy1yb290IGVuY29kZWQgaW50byB0aGUgY3Jvc3MgY29tcGlsZXIgdG9vbHMKKyMgaXMgbm90IGNvcnJlY3QuCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtc3lzLXJvb3Qgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX3N5c19yb290K3NldH0iID0gc2V0OyB0aGVuIDoKKyAgd2l0aHZhbD0kd2l0aF9zeXNfcm9vdDsKK2ZpCisKKworaWYgdGVzdCAieCR3aXRoX3N5c19yb290IiAhPSB4OyB0aGVuCisgIFNZU19ST09UPSR3aXRoX3N5c19yb290CitlbHNlCisgIFNZU19ST09UPS8KK2ZpCiAKIAogCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jIERldGVybWluZSBPcGVuSkRLIHZhcmlhbnRzLCBvcHRpb25zIGFuZCB2ZXJzaW9uIG51bWJlcnMuCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLXRvb2xzLWRpciB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfdG9vbHNfZGlyK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgd2l0aHZhbD0kd2l0aF90b29sc19kaXI7IFRPT0xTX0RJUj0kd2l0aF90b29sc19kaXIKK2ZpCiAKLSMgV2UgbmVlZCBidWlsZCAmIHRhcmdldCBmb3IgdGhpcy4KKworCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLWRldmtpdCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfZGV2a2l0K3NldH0iID0gc2V0OyB0aGVuIDoKKyAgd2l0aHZhbD0kd2l0aF9kZXZraXQ7CisgICAgaWYgdGVzdCAieCR3aXRoX3N5c19yb290IiAhPSB4OyB0aGVuCisgICAgICBhc19mbl9lcnJvciAkPyAiQ2Fubm90IHNwZWNpZnkgYm90aCAtLXdpdGgtZGV2a2l0IGFuZCAtLXdpdGgtc3lzLXJvb3QgYXQgdGhlIHNhbWUgdGltZSIgIiRMSU5FTk8iIDUKKyAgICBmaQorICAgIGlmIHRlc3QgIngkd2l0aF90b29sc19kaXIiICE9IHg7IHRoZW4KKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJDYW5ub3Qgc3BlY2lmeSBib3RoIC0td2l0aC1kZXZraXQgYW5kIC0td2l0aC10b29scy1kaXIgYXQgdGhlIHNhbWUgdGltZSIgIiRMSU5FTk8iIDUKKyAgICBmaQorICAgIFRPT0xTX0RJUj0kd2l0aF9kZXZraXQvYmluCisgICAgU1lTX1JPT1Q9JHdpdGhfZGV2a2l0LyRob3N0X2FsaWFzL2xpYmMKKworZmkKKworCisKKworIyBTZXR1cCBkZWZhdWx0IGxvZ2dpbmcgb2Ygc3Rkb3V0IGFuZCBzdGRlcnIgdG8gYnVpbGQubG9nIGluIHRoZSBvdXRwdXQgcm9vdC4KK0JVSUxEX0xPRz0nJChPVVRQVVRfUk9PVCkvYnVpbGQubG9nJworQlVJTERfTE9HX1BSRVZJT1VTPSckKE9VVFBVVF9ST09UKS9idWlsZC5sb2cub2xkJworQlVJTERfTE9HX1dSQVBQRVI9JyQoQkFTSCkgJChTUkNfUk9PVCkvY29tbW9uL2Jpbi9sb2dnZXIuc2ggJChCVUlMRF9MT0cpJworCisKKworCisKKyMgVGhlc2UgYXJlIG5lZWRlZCB0byBiZSBhYmxlIHRvIGNyZWF0ZSBhIGNvbmZpZ3VyYXRpb24gbmFtZSAoYW5kIHRodXMgdGhlIG91dHB1dCBkaXJlY3RvcnkpCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMKQEAgLTc5NjksOCArNzM3OCw4IEBACiAjICAgICAgICAgICAgIGllIG5vcm1hbCBpbnRlcnByZXRlciBhbmQgQzEsIG9ubHkgdGhlIHNlcmlhbCBHQywga2VybmVsIGp2bXRpIGV0YwogIyAgICB6ZXJvOiBubyBtYWNoaW5lIGNvZGUgaW50ZXJwcmV0ZXIsIG5vIGNvbXBpbGVyCiAjICAgIHplcm9zaGFyazogemVybyBpbnRlcnByZXRlciBhbmQgc2hhcmsvbGx2bSBjb21waWxlciBiYWNrZW5kCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoaWNoIHZhcmlhbnRzIG9mIHRoZSBKVk0gdGhhdCBzaG91bGQgYmUgYnVpbHQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hpY2ggdmFyaWFudHMgb2YgdGhlIEpWTSB0aGF0IHNob3VsZCBiZSBidWlsdC4uLiAiID4mNjsgfQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGljaCB2YXJpYW50cyBvZiB0aGUgSlZNIHRvIGJ1aWxkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoaWNoIHZhcmlhbnRzIG9mIHRoZSBKVk0gdG8gYnVpbGQuLi4gIiA+JjY7IH0KIAogIyBDaGVjayB3aGV0aGVyIC0td2l0aC1qdm0tdmFyaWFudHMgd2FzIGdpdmVuLgogaWYgdGVzdCAiJHt3aXRoX2p2bV92YXJpYW50cytzZXR9IiA9IHNldDsgdGhlbiA6CkBAIC04MTUxLDYgKzc1NjAsMjY4NyBAQAogCiAKIAorIyBXaXRoIGJhc2ljIHNldHVwIGRvbmUsIGNhbGwgdGhlIGN1c3RvbSBlYXJseSBob29rLgorCisKKyMgVG8gcHJvcGVybHkgY3JlYXRlIGEgY29uZmlndXJhdGlvbiBuYW1lLCB3ZSBuZWVkIHRvIGhhdmUgdGhlIE9wZW5KREsgdGFyZ2V0CisjIGFuZCBvcHRpb25zICh2YXJpYW50cyBhbmQgZGVidWcgbGV2ZWwpIHBhcnNlZC4KKworCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtY29uZi1uYW1lIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9jb25mX25hbWUrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICB3aXRodmFsPSR3aXRoX2NvbmZfbmFtZTsgIENPTkZfTkFNRT0ke3dpdGhfY29uZl9uYW1lfQorZmkKKworCisjIFRlc3QgZnJvbSB3aGVyZSB3ZSBhcmUgcnVubmluZyBjb25maWd1cmUsIGluIG9yIG91dHNpZGUgb2Ygc3JjIHJvb3QuCitpZiB0ZXN0ICJ4JENVUkRJUiIgPSAieCRTUkNfUk9PVCIgfHwgdGVzdCAieCRDVVJESVIiID0gIngkU1JDX1JPT1QvY29tbW9uIiB8fCB0ZXN0ICJ4JENVUkRJUiIgPSAieCRTUkNfUk9PVC9jb21tb24vYXV0b2NvbmYiIHx8IHRlc3QgIngkQ1VSRElSIiA9ICJ4JFNSQ19ST09UL2NvbW1vbi9tYWtlZmlsZXMiIDsgdGhlbgorICAgICMgV2UgYXJlIHJ1bm5pbmcgY29uZmlndXJlIGZyb20gdGhlIHNyYyByb290LgorICAgICMgQ3JlYXRlIGEgZGVmYXVsdCAuL2J1aWxkL3RhcmdldC12YXJpYW50LWRlYnVnbGV2ZWwgb3V0cHV0IHJvb3QuCisgICAgaWYgdGVzdCAieCR7Q09ORl9OQU1FfSIgPSB4OyB0aGVuCisgICAgICAgIENPTkZfTkFNRT0iJHtPUEVOSkRLX1RBUkdFVF9PU30tJHtPUEVOSkRLX1RBUkdFVF9DUFV9LSR7SkRLX1ZBUklBTlR9LSR7QU5ERURfSlZNX1ZBUklBTlRTfS0ke0RFQlVHX0xFVkVMfSIKKyAgICBmaQorICAgIE9VVFBVVF9ST09UPSIkU1JDX1JPT1QvYnVpbGQvJHtDT05GX05BTUV9IgorICAgICRNS0RJUiAtcCAiJE9VVFBVVF9ST09UIgorICAgIGlmIHRlc3QgISAtZCAiJE9VVFBVVF9ST09UIjsgdGhlbgorICAgICAgICBhc19mbl9lcnJvciAkPyAiQ291bGQgbm90IGNyZWF0ZSBidWlsZCBkaXJlY3RvcnkgJE9VVFBVVF9ST09UIiAiJExJTkVOTyIgNQorICAgIGZpCitlbHNlCisgICAgIyBXZSBhcmUgcnVubmluZyBjb25maWd1cmUgZnJvbSBvdXRzaWRlIG9mIHRoZSBzcmMgZGlyLgorICAgICMgVGhlbiB1c2UgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGFzIG91dHB1dCBkaXIhCisgICAgIyBJZiBjb25maWd1cmF0aW9uIGlzIHNpdHVhdGVkIGluIG5vcm1hbCBidWlsZCBkaXJlY3RvcnksIGp1c3QgdXNlIHRoZSBidWlsZAorICAgICMgZGlyZWN0b3J5IG5hbWUgYXMgY29uZmlndXJhdGlvbiBuYW1lLCBvdGhlcndpc2UgdXNlIHRoZSBjb21wbGV0ZSBwYXRoLgorICAgIGlmIHRlc3QgIngke0NPTkZfTkFNRX0iID0geDsgdGhlbgorICAgICAgICBDT05GX05BTUU9YCRFQ0hPICRDVVJESVIgfCAkU0VEIC1lICJzIV4ke1NSQ19ST09UfS9idWlsZC8hISJgCisgICAgZmkKKyAgICBPVVRQVVRfUk9PVD0iJENVUkRJUiIKKworICAgICMgV0FSTklORzogVGhpcyBtaWdodCBiZSBhIGJhZCB0aGluZyB0byBkby4gWW91IG5lZWQgdG8gYmUgc3VyZSB5b3Ugd2FudCB0bworICAgICMgaGF2ZSBhIGNvbmZpZ3VyYXRpb24gaW4gdGhpcyBkaXJlY3RvcnkuIERvIHNvbWUgc2FuaXR5IGNoZWNrcyEKKworICAgIGlmIHRlc3QgISAtZSAiJE9VVFBVVF9ST09UL3NwZWMuZ21rIjsgdGhlbgorICAgICAgIyBJZiB3ZSBoYXZlIGEgc3BlYy5nbWssIHdlIGhhdmUgcnVuIGhlcmUgYmVmb3JlIGFuZCB3ZSBhcmUgT0suIE90aGVyd2lzZSwgY2hlY2sgZm9yCisgICAgICAjIG90aGVyIGZpbGVzCisgICAgICBmaWxlc19wcmVzZW50PWAkTFMgJE9VVFBVVF9ST09UYAorICAgICAgaWYgdGVzdCAieCRmaWxlc19wcmVzZW50IiAhPSB4OyB0aGVuCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogQ3VycmVudCBkaXJlY3RvcnkgaXMgJENVUkRJUi4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogQ3VycmVudCBkaXJlY3RvcnkgaXMgJENVUkRJUi4iID4mNjt9CisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogU2luY2UgdGhpcyBpcyBub3QgdGhlIHNvdXJjZSByb290LCBjb25maWd1cmUgd2lsbCBvdXRwdXQgdGhlIGNvbmZpZ3VyYXRpb24gaGVyZSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBTaW5jZSB0aGlzIGlzIG5vdCB0aGUgc291cmNlIHJvb3QsIGNvbmZpZ3VyZSB3aWxsIG91dHB1dCB0aGUgY29uZmlndXJhdGlvbiBoZXJlIiA+JjY7fQorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IChhcyBvcHBvc2VkIHRvIGNyZWF0aW5nIGEgY29uZmlndXJhdGlvbiBpbiA8c3JjX3Jvb3Q+L2J1aWxkLzxjb25mLW5hbWU+KS4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogKGFzIG9wcG9zZWQgdG8gY3JlYXRpbmcgYSBjb25maWd1cmF0aW9uIGluIDxzcmNfcm9vdD4vYnVpbGQvPGNvbmYtbmFtZT4pLiIgPiY2O30KKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBIb3dldmVyLCB0aGlzIGRpcmVjdG9yeSBpcyBub3QgZW1wdHkuIFRoaXMgaXMgbm90IGFsbG93ZWQsIHNpbmNlIGl0IGNvdWxkIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IEhvd2V2ZXIsIHRoaXMgZGlyZWN0b3J5IGlzIG5vdCBlbXB0eS4gVGhpcyBpcyBub3QgYWxsb3dlZCwgc2luY2UgaXQgY291bGQiID4mNjt9CisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogc2VyaW91c2x5IG1lc3MgdXAganVzdCBhYm91dCBldmVyeXRoaW5nLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBzZXJpb3VzbHkgbWVzcyB1cCBqdXN0IGFib3V0IGV2ZXJ5dGhpbmcuIiA+JjY7fQorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRyeSAnY2QgJFNSQ19ST09UJyBhbmQgcmVzdGFydCBjb25maWd1cmUiID4mNQorJGFzX2VjaG8gIiRhc19tZTogVHJ5ICdjZCAkU1JDX1JPT1QnIGFuZCByZXN0YXJ0IGNvbmZpZ3VyZSIgPiY2O30KKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAob3IgY3JlYXRlIGEgbmV3IGVtcHR5IGRpcmVjdG9yeSBhbmQgY2QgdG8gaXQpLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiAob3IgY3JlYXRlIGEgbmV3IGVtcHR5IGRpcmVjdG9yeSBhbmQgY2QgdG8gaXQpLiIgPiY2O30KKyAgICAgICAgYXNfZm5fZXJyb3IgJD8gIldpbGwgbm90IGNvbnRpbnVlIGNyZWF0aW5nIGNvbmZpZ3VyYXRpb24gaW4gJENVUkRJUiIgIiRMSU5FTk8iIDUKKyAgICAgIGZpCisgICAgZmkKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoYXQgY29uZmlndXJhdGlvbiBuYW1lIHRvIHVzZSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGF0IGNvbmZpZ3VyYXRpb24gbmFtZSB0byB1c2UuLi4gIiA+JjY7IH0KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ09ORl9OQU1FIiA+JjUKKyRhc19lY2hvICIkQ09ORl9OQU1FIiA+JjY7IH0KKworCisgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLmN5Z3dpbiI7IHRoZW4KKworICAjIElucHV0IG1pZ2h0IGJlIGdpdmVuIGFzIFdpbmRvd3MgZm9ybWF0LCBzdGFydCBieSBjb252ZXJ0aW5nIHRvCisgICMgdW5peCBmb3JtYXQuCisgIHBhdGg9IiRPVVRQVVRfUk9PVCIKKyAgbmV3X3BhdGg9YCRDWUdQQVRIIC11ICIkcGF0aCJgCisKKyAgIyBDeWd3aW4gdHJpZXMgdG8gaGlkZSBzb21lIGFzcGVjdHMgb2YgdGhlIFdpbmRvd3MgZmlsZSBzeXN0ZW0sIHN1Y2ggdGhhdCBiaW5hcmllcyBhcmUKKyAgIyBuYW1lZCAuZXhlIGJ1dCBjYWxsZWQgd2l0aG91dCB0aGF0IHN1ZmZpeC4gVGhlcmVmb3JlLCAiZm9vIiBhbmQgImZvby5leGUiIGFyZSBjb25zaWRlcmVkCisgICMgdGhlIHNhbWUgZmlsZSwgbW9zdCBvZiB0aGUgdGltZSAoYXMgaW4gInRlc3QgLWYiKS4gQnV0IG5vdCB3aGVuIHJ1bm5pbmcgY3lncGF0aCAtcywgdGhlbgorICAjICJmb28uZXhlIiBpcyBPSyBidXQgImZvbyIgaXMgYW4gZXJyb3IuCisgICMKKyAgIyBUaGlzIHRlc3QgaXMgdGhlcmVmb3JlIHNsaWdodGx5IG1vcmUgYWNjdXJhdGUgdGhhbiAidGVzdCAtZiIgdG8gY2hlY2sgZm9yIGZpbGUgcHJlY2Vuc2UuCisgICMgSXQgaXMgYWxzbyBhIHdheSB0byBtYWtlIHN1cmUgd2UgZ290IHRoZSBwcm9wZXIgZmlsZSBuYW1lIGZvciB0aGUgcmVhbCB0ZXN0IGxhdGVyIG9uLgorICB0ZXN0X3Nob3J0cGF0aD1gJENZR1BBVEggLXMgLW0gIiRuZXdfcGF0aCIgMj4gL2Rldi9udWxsYAorICBpZiB0ZXN0ICJ4JHRlc3Rfc2hvcnRwYXRoIiA9IHg7IHRoZW4KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSBwYXRoIG9mIE9VVFBVVF9ST09ULCB3aGljaCByZXNvbHZlcyBhcyBcIiRwYXRoXCIsIGlzIGludmFsaWQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoZSBwYXRoIG9mIE9VVFBVVF9ST09ULCB3aGljaCByZXNvbHZlcyBhcyBcIiRwYXRoXCIsIGlzIGludmFsaWQuIiA+JjY7fQorICAgIGFzX2ZuX2Vycm9yICQ/ICJDYW5ub3QgbG9jYXRlIHRoZSB0aGUgcGF0aCBvZiBPVVRQVVRfUk9PVCIgIiRMSU5FTk8iIDUKKyAgZmkKKworICAjIENhbGwgaGVscGVyIGZ1bmN0aW9uIHdoaWNoIHBvc3NpYmx5IGNvbnZlcnRzIHRoaXMgdXNpbmcgRE9TLXN0eWxlIHNob3J0IG1vZGUuCisgICMgSWYgc28sIHRoZSB1cGRhdGVkIHBhdGggaXMgc3RvcmVkIGluICRuZXdfcGF0aC4KKworICBpbnB1dF9wYXRoPSIkbmV3X3BhdGgiCisgICMgQ2hlY2sgaWYgd2UgbmVlZCB0byBjb252ZXJ0IHRoaXMgdXNpbmcgRE9TLXN0eWxlIHNob3J0IG1vZGUuIElmIHRoZSBwYXRoCisgICMgY29udGFpbnMganVzdCBzaW1wbGUgY2hhcmFjdGVycywgdXNlIGl0LiBPdGhlcndpc2UgKHNwYWNlcywgd2VpcmQgY2hhcmFjdGVycyksCisgICMgdGFrZSBubyBjaGFuY2VzIGFuZCByZXdyaXRlIGl0LgorICAjIE5vdGU6IG00IGVhdHMgb3VyIFtdLCBzbyB3ZSBuZWVkIHRvIHVzZSBbIGFuZCBdIGluc3RlYWQuCisgIGhhc19mb3JiaWRkZW5fY2hhcnM9YCRFQ0hPICIkaW5wdXRfcGF0aCIgfCAkR1JFUCBbXi0uXy9hLXpBLVowLTldYAorICBpZiB0ZXN0ICJ4JGhhc19mb3JiaWRkZW5fY2hhcnMiICE9IHg7IHRoZW4KKyAgICAjIE5vdyBjb252ZXJ0IGl0IHRvIG1peGVkIERPUy1zdHlsZSwgc2hvcnQgbW9kZSAobm8gc3BhY2VzLCBhbmQgLyBpbnN0ZWFkIG9mIFwpCisgICAgc2hvcnRtb2RlX3BhdGg9YCRDWUdQQVRIIC1zIC1tIC1hICIkaW5wdXRfcGF0aCJgCisgICAgcGF0aF9hZnRlcl9zaG9ydG1vZGU9YCRDWUdQQVRIIC11ICIkc2hvcnRtb2RlX3BhdGgiYAorICAgIGlmIHRlc3QgIngkcGF0aF9hZnRlcl9zaG9ydG1vZGUiICE9ICJ4JGlucHV0X3RvX3Nob3J0cGF0aCI7IHRoZW4KKyAgICAgICMgR29pbmcgdG8gc2hvcnQgbW9kZSBhbmQgYmFjayBhZ2FpbiBkaWQgaW5kZWVkIG1hdHRlci4gU2luY2Ugc2hvcnQgbW9kZSBpcworICAgICAgIyBjYXNlIGluc2Vuc2l0aXZlLCBsZXQncyBtYWtlIGl0IGxvd2VyY2FzZSB0byBpbXByb3ZlIHJlYWRhYmlsaXR5LgorICAgICAgc2hvcnRtb2RlX3BhdGg9YCRFQ0hPICIkc2hvcnRtb2RlX3BhdGgiIHwgJFRSICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J2AKKyAgICAgICMgTm93IGNvbnZlcnQgaXQgYmFjayB0byBVbml4LXN0aWxlIChjeWdwYXRoKQorICAgICAgaW5wdXRfcGF0aD1gJENZR1BBVEggLXUgIiRzaG9ydG1vZGVfcGF0aCJgCisgICAgICBuZXdfcGF0aD0iJGlucHV0X3BhdGgiCisgICAgZmkKKyAgZmkKKworICB0ZXN0X2N5Z2RyaXZlX3ByZWZpeD1gJEVDSE8gJGlucHV0X3BhdGggfCAkR1JFUCBeL2N5Z2RyaXZlL2AKKyAgaWYgdGVzdCAieCR0ZXN0X2N5Z2RyaXZlX3ByZWZpeCIgPSB4OyB0aGVuCisgICAgIyBBcyBhIHNpbXBsZSBmaXgsIGV4Y2x1ZGUgL3Vzci9iaW4gc2luY2UgaXQncyBub3QgYSByZWFsIHBhdGguCisgICAgaWYgdGVzdCAieGAkRUNITyAkbmV3X3BhdGggfCAkR1JFUCBeL3Vzci9iaW4vYCIgPSB4OyB0aGVuCisgICAgICAjIFRoZSBwYXRoIGlzIGluIGEgQ3lnd2luIHNwZWNpYWwgZGlyZWN0b3J5IChlLmcuIC9ob21lKS4gV2UgbmVlZCB0aGlzIGNvbnZlcnRlZCB0bworICAgICAgIyBhIHBhdGggcHJlZml4ZWQgYnkgL2N5Z2RyaXZlIGZvciBmaXhwYXRoIHRvIHdvcmsuCisgICAgICBuZXdfcGF0aD0iJENZR1dJTl9ST09UX1BBVEgkaW5wdXRfcGF0aCIKKyAgICBmaQorICBmaQorCisKKyAgaWYgdGVzdCAieCRwYXRoIiAhPSAieCRuZXdfcGF0aCI7IHRoZW4KKyAgICBPVVRQVVRfUk9PVD0iJG5ld19wYXRoIgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogUmV3cml0aW5nIE9VVFBVVF9ST09UIHRvIFwiJG5ld19wYXRoXCIiID4mNQorJGFzX2VjaG8gIiRhc19tZTogUmV3cml0aW5nIE9VVFBVVF9ST09UIHRvIFwiJG5ld19wYXRoXCIiID4mNjt9CisgIGZpCisKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorCisgIHBhdGg9IiRPVVRQVVRfUk9PVCIKKyAgaGFzX2NvbG9uPWAkRUNITyAkcGF0aCB8ICRHUkVQIF4uOmAKKyAgbmV3X3BhdGg9IiRwYXRoIgorICBpZiB0ZXN0ICJ4JGhhc19jb2xvbiIgPSB4OyB0aGVuCisgICAgIyBOb3QgaW4gbWl4ZWQgb3IgV2luZG93cyBzdHlsZSwgc3RhcnQgYnkgdGhhdC4KKyAgICBuZXdfcGF0aD1gY21kIC8vYyBlY2hvICRwYXRoYAorICBmaQorCisKKyAgaW5wdXRfcGF0aD0iJG5ld19wYXRoIgorICAjIENoZWNrIGlmIHdlIG5lZWQgdG8gY29udmVydCB0aGlzIHVzaW5nIERPUy1zdHlsZSBzaG9ydCBtb2RlLiBJZiB0aGUgcGF0aAorICAjIGNvbnRhaW5zIGp1c3Qgc2ltcGxlIGNoYXJhY3RlcnMsIHVzZSBpdC4gT3RoZXJ3aXNlIChzcGFjZXMsIHdlaXJkIGNoYXJhY3RlcnMpLAorICAjIHRha2Ugbm8gY2hhbmNlcyBhbmQgcmV3cml0ZSBpdC4KKyAgIyBOb3RlOiBtNCBlYXRzIG91ciBbXSwgc28gd2UgbmVlZCB0byB1c2UgWyBhbmQgXSBpbnN0ZWFkLgorICBoYXNfZm9yYmlkZGVuX2NoYXJzPWAkRUNITyAiJGlucHV0X3BhdGgiIHwgJEdSRVAgW14tXy86YS16QS1aMC05XWAKKyAgaWYgdGVzdCAieCRoYXNfZm9yYmlkZGVuX2NoYXJzIiAhPSB4OyB0aGVuCisgICAgIyBOb3cgY29udmVydCBpdCB0byBtaXhlZCBET1Mtc3R5bGUsIHNob3J0IG1vZGUgKG5vIHNwYWNlcywgYW5kIC8gaW5zdGVhZCBvZiBcKQorICAgIG5ld19wYXRoPWBjbWQgL2MgImZvciAlQSBpbiAoXCIkaW5wdXRfcGF0aFwiKSBkbyBAZWNobyAlfnNBInwkVFIgXFxcXFxcXFwgLyB8ICRUUiAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidgCisgIGZpCisKKworICB3aW5kb3dzX3BhdGg9IiRuZXdfcGF0aCIKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJENZR1BBVEggLXUgIiR3aW5kb3dzX3BhdGgiYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBlbGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLm1zeXMiOyB0aGVuCisgICAgdW5peF9wYXRoPWAkRUNITyAiJHdpbmRvd3NfcGF0aCIgfCAkU0VEIC1lICdzLF5cXCguXFwpOiwvXFwxLGcnIC1lICdzLFxcXFwsLyxnJ2AKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZmkKKworICBpZiB0ZXN0ICJ4JHBhdGgiICE9ICJ4JG5ld19wYXRoIjsgdGhlbgorICAgIE9VVFBVVF9ST09UPSIkbmV3X3BhdGgiCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBSZXdyaXRpbmcgT1VUUFVUX1JPT1QgdG8gXCIkbmV3X3BhdGhcIiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBSZXdyaXRpbmcgT1VUUFVUX1JPT1QgdG8gXCIkbmV3X3BhdGhcIiIgPiY2O30KKyAgZmkKKworICAjIFNhdmUgdGhlIGZpcnN0IDEwIGJ5dGVzIG9mIHRoaXMgcGF0aCB0byB0aGUgc3RvcmFnZSwgc28gZml4cGF0aCBjYW4gd29yay4KKyAgYWxsX2ZpeHBhdGhfcHJlZml4ZXM9KCIke2FsbF9maXhwYXRoX3ByZWZpeGVzW0BdfSIgIiR7bmV3X3BhdGg6MDoxMH0iKQorCisgIGVsc2UKKyAgICAjIFdlJ3JlIG9uIGEgcG9zaXggcGxhdGZvcm0uIEhvb3JheSEgOikKKyAgICBwYXRoPSIkT1VUUFVUX1JPT1QiCisKKyAgICBpZiB0ZXN0ICEgLWYgIiRwYXRoIiAmJiB0ZXN0ICEgLWQgIiRwYXRoIjsgdGhlbgorICAgICAgYXNfZm5fZXJyb3IgJD8gIlRoZSBwYXRoIG9mIE9VVFBVVF9ST09ULCB3aGljaCByZXNvbHZlcyBhcyBcIiRwYXRoXCIsIGlzIG5vdCBmb3VuZC4iICIkTElORU5PIiA1CisgICAgZmkKKworICAgIGhhc19zcGFjZT1gJEVDSE8gIiRwYXRoIiB8ICRHUkVQICIgImAKKyAgICBpZiB0ZXN0ICJ4JGhhc19zcGFjZSIgIT0geDsgdGhlbgorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUaGUgcGF0aCBvZiBPVVRQVVRfUk9PVCwgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkcGF0aFwiLCBpcyBpbnZhbGlkLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUaGUgcGF0aCBvZiBPVVRQVVRfUk9PVCwgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkcGF0aFwiLCBpcyBpbnZhbGlkLiIgPiY2O30KKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJTcGFjZXMgYXJlIG5vdCBhbGxvd2VkIGluIHRoaXMgcGF0aC4iICIkTElORU5PIiA1CisgICAgZmkKKyAgZmkKKworCitTUEVDPSRPVVRQVVRfUk9PVC9zcGVjLmdtaworCitDT05GX05BTUU9JENPTkZfTkFNRQorCitPVVRQVVRfUk9PVD0kT1VUUFVUX1JPT1QKKworCisjIE1vc3Qgb2YgdGhlIHByb2JlZCBkZWZpbmVzIGFyZSBwdXQgaW50byBjb25maWcuaAorYWNfY29uZmlnX2hlYWRlcnM9IiRhY19jb25maWdfaGVhZGVycyAkT1VUUFVUX1JPT1QvY29uZmlnLmg6JEFVVE9DT05GX0RJUi9jb25maWcuaC5pbiIKKworIyBUaGUgc3BlYy5nbWsgZmlsZSBjb250YWlucyBhbGwgdmFyaWFibGVzIGZvciB0aGUgbWFrZSBzeXN0ZW0uCithY19jb25maWdfZmlsZXM9IiRhY19jb25maWdfZmlsZXMgJE9VVFBVVF9ST09UL3NwZWMuZ21rOiRBVVRPQ09ORl9ESVIvc3BlYy5nbWsuaW4iCisKKyMgVGhlIGhvdHNwb3Qtc3BlYy5nbWsgZmlsZSBjb250YWlucyBsZWdhY3kgdmFyaWFibGVzIGZvciB0aGUgaG90c3BvdCBtYWtlIHN5c3RlbS4KK2FjX2NvbmZpZ19maWxlcz0iJGFjX2NvbmZpZ19maWxlcyAkT1VUUFVUX1JPT1QvaG90c3BvdC1zcGVjLmdtazokQVVUT0NPTkZfRElSL2hvdHNwb3Qtc3BlYy5nbWsuaW4iCisKKyMgVGhlIGJvb3RjeWNsZS1zcGVjLmdtayBmaWxlIGNvbnRhaW5zIHN1cHBvcnQgZm9yIGJvb3QgY3ljbGUgYnVpbGRzLgorYWNfY29uZmlnX2ZpbGVzPSIkYWNfY29uZmlnX2ZpbGVzICRPVVRQVVRfUk9PVC9ib290Y3ljbGUtc3BlYy5nbWs6JEFVVE9DT05GX0RJUi9ib290Y3ljbGUtc3BlYy5nbWsuaW4iCisKKyMgVGhlIGNvbXBhcmUuc2ggaXMgdXNlZCB0byBjb21wYXJlIHRoZSBidWlsZCBvdXRwdXQgdG8gb3RoZXIgYnVpbGRzLgorYWNfY29uZmlnX2ZpbGVzPSIkYWNfY29uZmlnX2ZpbGVzICRPVVRQVVRfUk9PVC9jb21wYXJlLnNoOiRBVVRPQ09ORl9ESVIvY29tcGFyZS5zaC5pbiIKKworIyBTcGVjLnNoIGlzIGN1cnJlbnRseSB1c2VkIGJ5IGNvbXBhcmUtb2JqZWN0cy5zaAorYWNfY29uZmlnX2ZpbGVzPSIkYWNfY29uZmlnX2ZpbGVzICRPVVRQVVRfUk9PVC9zcGVjLnNoOiRBVVRPQ09ORl9ESVIvc3BlYy5zaC5pbiIKKworIyBUaGUgZ2VuZXJhdGVkIE1ha2VmaWxlIGtub3dzIHdoZXJlIHRoZSBzcGVjLmdtayBpcyBhbmQgd2hlcmUgdGhlIHNvdXJjZSBpcy4KKyMgWW91IGNhbiBydW4gbWFrZSBmcm9tIHRoZSBPVVRQVVRfUk9PVCwgb3IgZnJvbSB0aGUgdG9wLWxldmVsIE1ha2VmaWxlCisjIHdoaWNoIHdpbGwgbG9vayBmb3IgZ2VuZXJhdGVkIGNvbmZpZ3VyYXRpb25zCithY19jb25maWdfZmlsZXM9IiRhY19jb25maWdfZmlsZXMgJE9VVFBVVF9ST09UL01ha2VmaWxlOiRBVVRPQ09ORl9ESVIvTWFrZWZpbGUuaW4iCisKKworIyBTYXZlIHRoZSBhcmd1bWVudHMgZ2l2ZW4gdG8gdXMKK2VjaG8gIiRDT05GSUdVUkVfQ09NTUFORF9MSU5FIiA+ICRPVVRQVVRfUk9PVC9jb25maWd1cmUtYXJndW1lbnRzCisKKworIyBNdXN0IGJlIGRvbmUgYmVmb3JlIHdlIGNhbiBjYWxsIEhFTFBfTVNHX01JU1NJTkdfREVQRU5ERU5DWS4KKworICAgIGZvciBhY19wcm9nIGluIGFwdC1nZXQgeXVtIHBvcnQgcGtndXRpbCBwa2dhZGQKK2RvCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19QS0dIQU5ETEVSK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJFBLR0hBTkRMRVIiOyB0aGVuCisgIGFjX2N2X3Byb2dfUEtHSEFORExFUj0iJFBLR0hBTkRMRVIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19QS0dIQU5ETEVSPSIkYWNfcHJvZyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitQS0dIQU5ETEVSPSRhY19jdl9wcm9nX1BLR0hBTkRMRVIKK2lmIHRlc3QgLW4gIiRQS0dIQU5ETEVSIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFBLR0hBTkRMRVIiID4mNQorJGFzX2VjaG8gIiRQS0dIQU5ETEVSIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKyAgdGVzdCAtbiAiJFBLR0hBTkRMRVIiICYmIGJyZWFrCitkb25lCisKKworCisjIFNldHVwIHRvb2xzIHRoYXQgcmVxdWlyZXMgbW9yZSBjb21wbGV4IGhhbmRsaW5nLCBvciB0aGF0IGlzIG5vdCBuZWVkZWQgYnkgdGhlIGNvbmZpZ3VyZSBzY3JpcHQuCisKKworICAjIFdlIG5lZWQgdG8gZmluZCBhIHJlY2VudCB2ZXJzaW9uIG9mIEdOVSBtYWtlLiBFc3BlY2lhbGx5IG9uIFNvbGFyaXMsIHRoaXMgY2FuIGJlIHRyaWNreS4KKyAgaWYgdGVzdCAieCRNQUtFIiAhPSB4OyB0aGVuCisgICAgIyBVc2VyIGhhcyBzdXBwbGllZCBhIG1ha2UsIHRlc3QgaXQuCisgICAgaWYgdGVzdCAhIC1mICIkTUFLRSI7IHRoZW4KKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJUaGUgc3BlY2lmaWVkIG1ha2UgKGJ5IE1BS0U9JE1BS0UpIGlzIG5vdCBmb3VuZC4iICIkTElORU5PIiA1CisgICAgZmkKKworICBNQUtFX0NBTkRJREFURT0iIiRNQUtFIiIKKyAgREVTQ1JJUFRJT049InVzZXIgc3VwcGxpZWQgTUFLRT0kTUFLRSIKKyAgaWYgdGVzdCAieCRNQUtFX0NBTkRJREFURSIgIT0geDsgdGhlbgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGVzdGluZyBwb3RlbnRpYWwgbWFrZSBhdCAkTUFLRV9DQU5ESURBVEUsIGZvdW5kIHVzaW5nICRERVNDUklQVElPTiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUZXN0aW5nIHBvdGVudGlhbCBtYWtlIGF0ICRNQUtFX0NBTkRJREFURSwgZm91bmQgdXNpbmcgJERFU0NSSVBUSU9OIiA+JjY7fQorICAgIE1BS0VfVkVSU0lPTl9TVFJJTkc9YCRNQUtFX0NBTkRJREFURSAtLXZlcnNpb24gfCAkSEVBRCAtbiAxYAorICAgIElTX0dOVV9NQUtFPWAkRUNITyAkTUFLRV9WRVJTSU9OX1NUUklORyB8ICRHUkVQICdHTlUgTWFrZSdgCisgICAgaWYgdGVzdCAieCRJU19HTlVfTUFLRSIgPSB4OyB0aGVuCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IEZvdW5kIHBvdGVudGlhbCBtYWtlIGF0ICRNQUtFX0NBTkRJREFURSwgaG93ZXZlciwgdGhpcyBpcyBub3QgR05VIE1ha2UuIElnbm9yaW5nLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBGb3VuZCBwb3RlbnRpYWwgbWFrZSBhdCAkTUFLRV9DQU5ESURBVEUsIGhvd2V2ZXIsIHRoaXMgaXMgbm90IEdOVSBNYWtlLiBJZ25vcmluZy4iID4mNjt9CisgICAgZWxzZQorICAgICAgSVNfTU9ERVJOX01BS0U9YCRFQ0hPICRNQUtFX1ZFUlNJT05fU1RSSU5HIHwgJEdSRVAgJzMuOFsxMjM0Njc4OV0nYAorICAgICAgaWYgdGVzdCAieCRJU19NT0RFUk5fTUFLRSIgPSB4OyB0aGVuCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogRm91bmQgR05VIG1ha2UgYXQgJE1BS0VfQ0FORElEQVRFLCBob3dldmVyIHRoaXMgaXMgbm90IHZlcnNpb24gMy44MSBvciBsYXRlci4gKGl0IGlzOiAkTUFLRV9WRVJTSU9OX1NUUklORykuIElnbm9yaW5nLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBGb3VuZCBHTlUgbWFrZSBhdCAkTUFLRV9DQU5ESURBVEUsIGhvd2V2ZXIgdGhpcyBpcyBub3QgdmVyc2lvbiAzLjgxIG9yIGxhdGVyLiAoaXQgaXM6ICRNQUtFX1ZFUlNJT05fU1RSSU5HKS4gSWdub3JpbmcuIiA+JjY7fQorICAgICAgZWxzZQorICAgICAgICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1MiID0gInh3aW5kb3dzIjsgdGhlbgorICAgICAgICAgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLmN5Z3dpbiI7IHRoZW4KKyAgICAgICAgICAgIE1BS0VfRVhQRUNURURfRU5WPSdjeWd3aW4nCisgICAgICAgICAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorICAgICAgICAgICAgTUFLRV9FWFBFQ1RFRF9FTlY9J21zeXMnCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgYXNfZm5fZXJyb3IgJD8gIlVua25vd24gV2luZG93cyBlbnZpcm9ubWVudCIgIiRMSU5FTk8iIDUKKyAgICAgICAgICBmaQorICAgICAgICAgIE1BS0VfQlVJTFRfRk9SPWAkTUFLRV9DQU5ESURBVEUgLS12ZXJzaW9uIHwgJEdSRVAgLWkgJ2J1aWx0IGZvcidgCisgICAgICAgICAgSVNfTUFLRV9DT1JSRUNUX0VOVj1gJEVDSE8gJE1BS0VfQlVJTFRfRk9SIHwgJEdSRVAgJE1BS0VfRVhQRUNURURfRU5WYAorICAgICAgICBlbHNlCisgICAgICAgICAgIyBOb3QgcmVsZXZhbnQgZm9yIG5vbi1XaW5kb3dzCisgICAgICAgICAgSVNfTUFLRV9DT1JSRUNUX0VOVj10cnVlCisgICAgICAgIGZpCisgICAgICAgIGlmIHRlc3QgIngkSVNfTUFLRV9DT1JSRUNUX0VOViIgPSB4OyB0aGVuCisgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBGb3VuZCBHTlUgbWFrZSB2ZXJzaW9uICRNQUtFX1ZFUlNJT05fU1RSSU5HIGF0ICRNQUtFX0NBTkRJREFURSwgYnV0IGl0IGlzIG5vdCBmb3IgJE1BS0VfRVhQRUNURURfRU5WIChpdCBzYXlzOiAkTUFLRV9CVUlMVF9GT1IpLiBJZ25vcmluZy4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogRm91bmQgR05VIG1ha2UgdmVyc2lvbiAkTUFLRV9WRVJTSU9OX1NUUklORyBhdCAkTUFLRV9DQU5ESURBVEUsIGJ1dCBpdCBpcyBub3QgZm9yICRNQUtFX0VYUEVDVEVEX0VOViAoaXQgc2F5czogJE1BS0VfQlVJTFRfRk9SKS4gSWdub3JpbmcuIiA+JjY7fQorICAgICAgICBlbHNlCisgICAgICAgICAgRk9VTkRfTUFLRT0kTUFLRV9DQU5ESURBVEUKKworICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5jeWd3aW4iOyB0aGVuCisKKyAgIyBGaXJzdCBzZXBhcmF0ZSB0aGUgcGF0aCBmcm9tIHRoZSBhcmd1bWVudHMuIFRoaXMgd2lsbCBzcGxpdCBhdCB0aGUgZmlyc3QKKyAgIyBzcGFjZS4KKyAgY29tcGxldGU9IiRGT1VORF9NQUtFIgorICBwYXRoPSIke2NvbXBsZXRlJSUgKn0iCisgIHRtcD0iJGNvbXBsZXRlIEVPTCIKKyAgYXJndW1lbnRzPSIke3RtcCMqIH0iCisKKyAgIyBJbnB1dCBtaWdodCBiZSBnaXZlbiBhcyBXaW5kb3dzIGZvcm1hdCwgc3RhcnQgYnkgY29udmVydGluZyB0bworICAjIHVuaXggZm9ybWF0LgorICBuZXdfcGF0aD1gJENZR1BBVEggLXUgIiRwYXRoImAKKworICAjIE5vdyB0cnkgdG8gbG9jYXRlIGV4ZWN1dGFibGUgdXNpbmcgd2hpY2gKKyAgbmV3X3BhdGg9YCRXSElDSCAiJG5ld19wYXRoIiAyPiAvZGV2L251bGxgCisgIGlmIHRlc3QgIngkbmV3X3BhdGgiID0geDsgdGhlbgorICAgICMgT29wcy4gV2hpY2ggZGlkbid0IGZpbmQgdGhlIGV4ZWN1dGFibGUuCisgICAgIyBUaGUgc3BsaXR0aW5nIG9mIGFyZ3VtZW50cyBmcm9tIHRoZSBleGVjdXRhYmxlIGF0IGEgc3BhY2UgbWlnaHQgaGF2ZSBiZWVuIGluY29ycmVjdCwKKyAgICAjIHNpbmNlIHBhdGhzIHdpdGggc3BhY2UgYXJlIG1vcmUgbGlrZWx5IGluIFdpbmRvd3MuIEdpdmUgaXQgYW5vdGhlciB0cnkgd2l0aCB0aGUgd2hvbGUKKyAgICAjIGFyZ3VtZW50LgorICAgIHBhdGg9IiRjb21wbGV0ZSIKKyAgICBhcmd1bWVudHM9IkVPTCIKKyAgICBuZXdfcGF0aD1gJENZR1BBVEggLXUgIiRwYXRoImAKKyAgICBuZXdfcGF0aD1gJFdISUNIICIkbmV3X3BhdGgiIDI+IC9kZXYvbnVsbGAKKyAgICBpZiB0ZXN0ICJ4JG5ld19wYXRoIiA9IHg7IHRoZW4KKyAgICAgICMgSXQncyBzdGlsbCBub3QgZm91bmQuIE5vdyB0aGlzIGlzIGFuIHVucmVjb3ZlcmFibGUgZXJyb3IuCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSBwYXRoIG9mIEZPVU5EX01BS0UsIHdoaWNoIHJlc29sdmVzIGFzIFwiJGNvbXBsZXRlXCIsIGlzIG5vdCBmb3VuZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhlIHBhdGggb2YgRk9VTkRfTUFLRSwgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkY29tcGxldGVcIiwgaXMgbm90IGZvdW5kLiIgPiY2O30KKyAgICAgIGhhc19zcGFjZT1gJEVDSE8gIiRjb21wbGV0ZSIgfCAkR1JFUCAiICJgCisgICAgICBpZiB0ZXN0ICJ4JGhhc19zcGFjZSIgIT0geDsgdGhlbgorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFlvdSBtaWdodCBiZSBtaXhpbmcgc3BhY2VzIGluIHRoZSBwYXRoIGFuZCBleHRyYSBhcmd1bWVudHMsIHdoaWNoIGlzIG5vdCBhbGxvd2VkLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBZb3UgbWlnaHQgYmUgbWl4aW5nIHNwYWNlcyBpbiB0aGUgcGF0aCBhbmQgZXh0cmEgYXJndW1lbnRzLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iID4mNjt9CisgICAgICBmaQorICAgICAgYXNfZm5fZXJyb3IgJD8gIkNhbm5vdCBsb2NhdGUgdGhlIHRoZSBwYXRoIG9mIEZPVU5EX01BS0UiICIkTElORU5PIiA1CisgICAgZmkKKyAgZmkKKworICAjIEN5Z3dpbiB0cmllcyB0byBoaWRlIHNvbWUgYXNwZWN0cyBvZiB0aGUgV2luZG93cyBmaWxlIHN5c3RlbSwgc3VjaCB0aGF0IGJpbmFyaWVzIGFyZQorICAjIG5hbWVkIC5leGUgYnV0IGNhbGxlZCB3aXRob3V0IHRoYXQgc3VmZml4LiBUaGVyZWZvcmUsICJmb28iIGFuZCAiZm9vLmV4ZSIgYXJlIGNvbnNpZGVyZWQKKyAgIyB0aGUgc2FtZSBmaWxlLCBtb3N0IG9mIHRoZSB0aW1lIChhcyBpbiAidGVzdCAtZiIpLiBCdXQgbm90IHdoZW4gcnVubmluZyBjeWdwYXRoIC1zLCB0aGVuCisgICMgImZvby5leGUiIGlzIE9LIGJ1dCAiZm9vIiBpcyBhbiBlcnJvci4KKyAgIworICAjIFRoaXMgdGVzdCBpcyB0aGVyZWZvcmUgc2xpZ2h0bHkgbW9yZSBhY2N1cmF0ZSB0aGFuICJ0ZXN0IC1mIiB0byBjaGVjayBmb3IgZmlsZSBwcmVjZW5zZS4KKyAgIyBJdCBpcyBhbHNvIGEgd2F5IHRvIG1ha2Ugc3VyZSB3ZSBnb3QgdGhlIHByb3BlciBmaWxlIG5hbWUgZm9yIHRoZSByZWFsIHRlc3QgbGF0ZXIgb24uCisgIHRlc3Rfc2hvcnRwYXRoPWAkQ1lHUEFUSCAtcyAtbSAiJG5ld19wYXRoIiAyPiAvZGV2L251bGxgCisgIGlmIHRlc3QgIngkdGVzdF9zaG9ydHBhdGgiID0geDsgdGhlbgorICAgICMgU2hvcnQgcGF0aCBmYWlsZWQsIGZpbGUgZG9lcyBub3QgZXhpc3QgYXMgc3BlY2lmaWVkLgorICAgICMgVHJ5IGFkZGluZyAuZXhlIG9yIC5jbWQKKyAgICBpZiB0ZXN0IC1mICIke25ld19wYXRofS5leGUiOyB0aGVuCisgICAgICAgaW5wdXRfdG9fc2hvcnRwYXRoPSIke25ld19wYXRofS5leGUiCisgICAgZWxpZiB0ZXN0IC1mICIke25ld19wYXRofS5jbWQiOyB0aGVuCisgICAgICAgaW5wdXRfdG9fc2hvcnRwYXRoPSIke25ld19wYXRofS5jbWQiCisgICAgZWxzZQorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUaGUgcGF0aCBvZiBGT1VORF9NQUtFLCB3aGljaCByZXNvbHZlcyBhcyBcIiRuZXdfcGF0aFwiLCBpcyBpbnZhbGlkLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUaGUgcGF0aCBvZiBGT1VORF9NQUtFLCB3aGljaCByZXNvbHZlcyBhcyBcIiRuZXdfcGF0aFwiLCBpcyBpbnZhbGlkLiIgPiY2O30KKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogTmVpdGhlciBcIiRuZXdfcGF0aFwiIG5vciBcIiRuZXdfcGF0aC5leGUvY21kXCIgY2FuIGJlIGZvdW5kIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IE5laXRoZXIgXCIkbmV3X3BhdGhcIiBub3IgXCIkbmV3X3BhdGguZXhlL2NtZFwiIGNhbiBiZSBmb3VuZCIgPiY2O30KKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJDYW5ub3QgbG9jYXRlIHRoZSB0aGUgcGF0aCBvZiBGT1VORF9NQUtFIiAiJExJTkVOTyIgNQorICAgIGZpCisgIGVsc2UKKyAgICBpbnB1dF90b19zaG9ydHBhdGg9IiRuZXdfcGF0aCIKKyAgZmkKKworICAjIENhbGwgaGVscGVyIGZ1bmN0aW9uIHdoaWNoIHBvc3NpYmx5IGNvbnZlcnRzIHRoaXMgdXNpbmcgRE9TLXN0eWxlIHNob3J0IG1vZGUuCisgICMgSWYgc28sIHRoZSB1cGRhdGVkIHBhdGggaXMgc3RvcmVkIGluICRuZXdfcGF0aC4KKyAgbmV3X3BhdGg9IiRpbnB1dF90b19zaG9ydHBhdGgiCisKKyAgaW5wdXRfcGF0aD0iJGlucHV0X3RvX3Nob3J0cGF0aCIKKyAgIyBDaGVjayBpZiB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhpcyB1c2luZyBET1Mtc3R5bGUgc2hvcnQgbW9kZS4gSWYgdGhlIHBhdGgKKyAgIyBjb250YWlucyBqdXN0IHNpbXBsZSBjaGFyYWN0ZXJzLCB1c2UgaXQuIE90aGVyd2lzZSAoc3BhY2VzLCB3ZWlyZCBjaGFyYWN0ZXJzKSwKKyAgIyB0YWtlIG5vIGNoYW5jZXMgYW5kIHJld3JpdGUgaXQuCisgICMgTm90ZTogbTQgZWF0cyBvdXIgW10sIHNvIHdlIG5lZWQgdG8gdXNlIFsgYW5kIF0gaW5zdGVhZC4KKyAgaGFzX2ZvcmJpZGRlbl9jaGFycz1gJEVDSE8gIiRpbnB1dF9wYXRoIiB8ICRHUkVQIFteLS5fL2EtekEtWjAtOV1gCisgIGlmIHRlc3QgIngkaGFzX2ZvcmJpZGRlbl9jaGFycyIgIT0geDsgdGhlbgorICAgICMgTm93IGNvbnZlcnQgaXQgdG8gbWl4ZWQgRE9TLXN0eWxlLCBzaG9ydCBtb2RlIChubyBzcGFjZXMsIGFuZCAvIGluc3RlYWQgb2YgXCkKKyAgICBzaG9ydG1vZGVfcGF0aD1gJENZR1BBVEggLXMgLW0gLWEgIiRpbnB1dF9wYXRoImAKKyAgICBwYXRoX2FmdGVyX3Nob3J0bW9kZT1gJENZR1BBVEggLXUgIiRzaG9ydG1vZGVfcGF0aCJgCisgICAgaWYgdGVzdCAieCRwYXRoX2FmdGVyX3Nob3J0bW9kZSIgIT0gIngkaW5wdXRfdG9fc2hvcnRwYXRoIjsgdGhlbgorICAgICAgIyBHb2luZyB0byBzaG9ydCBtb2RlIGFuZCBiYWNrIGFnYWluIGRpZCBpbmRlZWQgbWF0dGVyLiBTaW5jZSBzaG9ydCBtb2RlIGlzCisgICAgICAjIGNhc2UgaW5zZW5zaXRpdmUsIGxldCdzIG1ha2UgaXQgbG93ZXJjYXNlIHRvIGltcHJvdmUgcmVhZGFiaWxpdHkuCisgICAgICBzaG9ydG1vZGVfcGF0aD1gJEVDSE8gIiRzaG9ydG1vZGVfcGF0aCIgfCAkVFIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAorICAgICAgIyBOb3cgY29udmVydCBpdCBiYWNrIHRvIFVuaXgtc3RpbGUgKGN5Z3BhdGgpCisgICAgICBpbnB1dF9wYXRoPWAkQ1lHUEFUSCAtdSAiJHNob3J0bW9kZV9wYXRoImAKKyAgICAgIG5ld19wYXRoPSIkaW5wdXRfcGF0aCIKKyAgICBmaQorICBmaQorCisgIHRlc3RfY3lnZHJpdmVfcHJlZml4PWAkRUNITyAkaW5wdXRfcGF0aCB8ICRHUkVQIF4vY3lnZHJpdmUvYAorICBpZiB0ZXN0ICJ4JHRlc3RfY3lnZHJpdmVfcHJlZml4IiA9IHg7IHRoZW4KKyAgICAjIEFzIGEgc2ltcGxlIGZpeCwgZXhjbHVkZSAvdXNyL2JpbiBzaW5jZSBpdCdzIG5vdCBhIHJlYWwgcGF0aC4KKyAgICBpZiB0ZXN0ICJ4YCRFQ0hPICRpbnB1dF90b19zaG9ydHBhdGggfCAkR1JFUCBeL3Vzci9iaW4vYCIgPSB4OyB0aGVuCisgICAgICAjIFRoZSBwYXRoIGlzIGluIGEgQ3lnd2luIHNwZWNpYWwgZGlyZWN0b3J5IChlLmcuIC9ob21lKS4gV2UgbmVlZCB0aGlzIGNvbnZlcnRlZCB0bworICAgICAgIyBhIHBhdGggcHJlZml4ZWQgYnkgL2N5Z2RyaXZlIGZvciBmaXhwYXRoIHRvIHdvcmsuCisgICAgICBuZXdfcGF0aD0iJENZR1dJTl9ST09UX1BBVEgkaW5wdXRfcGF0aCIKKyAgICBmaQorICBmaQorCisgICMgcmVtb3ZlIHRyYWlsaW5nIC5leGUgaWYgYW55CisgIG5ld19wYXRoPSIke25ld19wYXRoLyUuZXhlL30iCisKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorCisgICMgRmlyc3Qgc2VwYXJhdGUgdGhlIHBhdGggZnJvbSB0aGUgYXJndW1lbnRzLiBUaGlzIHdpbGwgc3BsaXQgYXQgdGhlIGZpcnN0CisgICMgc3BhY2UuCisgIGNvbXBsZXRlPSIkRk9VTkRfTUFLRSIKKyAgcGF0aD0iJHtjb21wbGV0ZSUlICp9IgorICB0bXA9IiRjb21wbGV0ZSBFT0wiCisgIGFyZ3VtZW50cz0iJHt0bXAjKiB9IgorCisgICMgSW5wdXQgbWlnaHQgYmUgZ2l2ZW4gYXMgV2luZG93cyBmb3JtYXQsIHN0YXJ0IGJ5IGNvbnZlcnRpbmcgdG8KKyAgIyB1bml4IGZvcm1hdC4KKyAgbmV3X3BhdGg9IiRwYXRoIgorCisgIHdpbmRvd3NfcGF0aD0iJG5ld19wYXRoIgorICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5jeWd3aW4iOyB0aGVuCisgICAgdW5peF9wYXRoPWAkQ1lHUEFUSCAtdSAiJHdpbmRvd3NfcGF0aCJgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGVsaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MubXN5cyI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRFQ0hPICIkd2luZG93c19wYXRoIiB8ICRTRUQgLWUgJ3MsXlxcKC5cXCk6LC9cXDEsZycgLWUgJ3MsXFxcXCwvLGcnYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBmaQorCisKKyAgIyBOb3cgdHJ5IHRvIGxvY2F0ZSBleGVjdXRhYmxlIHVzaW5nIHdoaWNoCisgIG5ld19wYXRoPWAkV0hJQ0ggIiRuZXdfcGF0aCIgMj4gL2Rldi9udWxsYAorCisgIGlmIHRlc3QgIngkbmV3X3BhdGgiID0geDsgdGhlbgorICAgICMgT29wcy4gV2hpY2ggZGlkbid0IGZpbmQgdGhlIGV4ZWN1dGFibGUuCisgICAgIyBUaGUgc3BsaXR0aW5nIG9mIGFyZ3VtZW50cyBmcm9tIHRoZSBleGVjdXRhYmxlIGF0IGEgc3BhY2UgbWlnaHQgaGF2ZSBiZWVuIGluY29ycmVjdCwKKyAgICAjIHNpbmNlIHBhdGhzIHdpdGggc3BhY2UgYXJlIG1vcmUgbGlrZWx5IGluIFdpbmRvd3MuIEdpdmUgaXQgYW5vdGhlciB0cnkgd2l0aCB0aGUgd2hvbGUKKyAgICAjIGFyZ3VtZW50LgorICAgIHBhdGg9IiRjb21wbGV0ZSIKKyAgICBhcmd1bWVudHM9IkVPTCIKKyAgICBuZXdfcGF0aD0iJHBhdGgiCisKKyAgd2luZG93c19wYXRoPSIkbmV3X3BhdGgiCisgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLmN5Z3dpbiI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRDWUdQQVRIIC11ICIkd2luZG93c19wYXRoImAKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJEVDSE8gIiR3aW5kb3dzX3BhdGgiIHwgJFNFRCAtZSAncyxeXFwoLlxcKTosL1xcMSxnJyAtZSAncyxcXFxcLC8sZydgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGZpCisKKworICAgIG5ld19wYXRoPWAkV0hJQ0ggIiRuZXdfcGF0aCIgMj4gL2Rldi9udWxsYAorCisgICAgaWYgdGVzdCAieCRuZXdfcGF0aCIgPSB4OyB0aGVuCisgICAgICAjIEl0J3Mgc3RpbGwgbm90IGZvdW5kLiBOb3cgdGhpcyBpcyBhbiB1bnJlY292ZXJhYmxlIGVycm9yLgorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUaGUgcGF0aCBvZiBGT1VORF9NQUtFLCB3aGljaCByZXNvbHZlcyBhcyBcIiRjb21wbGV0ZVwiLCBpcyBub3QgZm91bmQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoZSBwYXRoIG9mIEZPVU5EX01BS0UsIHdoaWNoIHJlc29sdmVzIGFzIFwiJGNvbXBsZXRlXCIsIGlzIG5vdCBmb3VuZC4iID4mNjt9CisgICAgICBoYXNfc3BhY2U9YCRFQ0hPICIkY29tcGxldGUiIHwgJEdSRVAgIiAiYAorICAgICAgaWYgdGVzdCAieCRoYXNfc3BhY2UiICE9IHg7IHRoZW4KKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBZb3UgbWlnaHQgYmUgbWl4aW5nIHNwYWNlcyBpbiB0aGUgcGF0aCBhbmQgZXh0cmEgYXJndW1lbnRzLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogWW91IG1pZ2h0IGJlIG1peGluZyBzcGFjZXMgaW4gdGhlIHBhdGggYW5kIGV4dHJhIGFyZ3VtZW50cywgd2hpY2ggaXMgbm90IGFsbG93ZWQuIiA+JjY7fQorICAgICAgZmkKKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJDYW5ub3QgbG9jYXRlIHRoZSB0aGUgcGF0aCBvZiBGT1VORF9NQUtFIiAiJExJTkVOTyIgNQorICAgIGZpCisgIGZpCisKKyAgIyBOb3cgbmV3X3BhdGggaGFzIGEgY29tcGxldGUgdW5peCBwYXRoIHRvIHRoZSBiaW5hcnkKKyAgaWYgdGVzdCAieGAkRUNITyAkbmV3X3BhdGggfCAkR1JFUCBeL2Jpbi9gIiAhPSB4OyB0aGVuCisgICAgIyBLZWVwIHBhdGhzIGluIC9iaW4gYXMtaXMsIGJ1dCByZW1vdmUgdHJhaWxpbmcgLmV4ZSBpZiBhbnkKKyAgICBuZXdfcGF0aD0iJHtuZXdfcGF0aC8lLmV4ZS99IgorICAgICMgRG8gbm90IHNhdmUgL2JpbiBwYXRocyB0byBhbGxfZml4cGF0aF9wcmVmaXhlcyEKKyAgZWxzZQorICAgICMgTm90IGluIG1peGVkIG9yIFdpbmRvd3Mgc3R5bGUsIHN0YXJ0IGJ5IHRoYXQuCisgICAgbmV3X3BhdGg9YGNtZCAvL2MgZWNobyAkbmV3X3BhdGhgCisKKyAgaW5wdXRfcGF0aD0iJG5ld19wYXRoIgorICAjIENoZWNrIGlmIHdlIG5lZWQgdG8gY29udmVydCB0aGlzIHVzaW5nIERPUy1zdHlsZSBzaG9ydCBtb2RlLiBJZiB0aGUgcGF0aAorICAjIGNvbnRhaW5zIGp1c3Qgc2ltcGxlIGNoYXJhY3RlcnMsIHVzZSBpdC4gT3RoZXJ3aXNlIChzcGFjZXMsIHdlaXJkIGNoYXJhY3RlcnMpLAorICAjIHRha2Ugbm8gY2hhbmNlcyBhbmQgcmV3cml0ZSBpdC4KKyAgIyBOb3RlOiBtNCBlYXRzIG91ciBbXSwgc28gd2UgbmVlZCB0byB1c2UgWyBhbmQgXSBpbnN0ZWFkLgorICBoYXNfZm9yYmlkZGVuX2NoYXJzPWAkRUNITyAiJGlucHV0X3BhdGgiIHwgJEdSRVAgW14tXy86YS16QS1aMC05XWAKKyAgaWYgdGVzdCAieCRoYXNfZm9yYmlkZGVuX2NoYXJzIiAhPSB4OyB0aGVuCisgICAgIyBOb3cgY29udmVydCBpdCB0byBtaXhlZCBET1Mtc3R5bGUsIHNob3J0IG1vZGUgKG5vIHNwYWNlcywgYW5kIC8gaW5zdGVhZCBvZiBcKQorICAgIG5ld19wYXRoPWBjbWQgL2MgImZvciAlQSBpbiAoXCIkaW5wdXRfcGF0aFwiKSBkbyBAZWNobyAlfnNBInwkVFIgXFxcXFxcXFwgLyB8ICRUUiAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidgCisgIGZpCisKKyAgICAjIE91dHB1dCBpcyBpbiAkbmV3X3BhdGgKKworICB3aW5kb3dzX3BhdGg9IiRuZXdfcGF0aCIKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJENZR1BBVEggLXUgIiR3aW5kb3dzX3BhdGgiYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBlbGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLm1zeXMiOyB0aGVuCisgICAgdW5peF9wYXRoPWAkRUNITyAiJHdpbmRvd3NfcGF0aCIgfCAkU0VEIC1lICdzLF5cXCguXFwpOiwvXFwxLGcnIC1lICdzLFxcXFwsLyxnJ2AKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZmkKKworICAgICMgcmVtb3ZlIHRyYWlsaW5nIC5leGUgaWYgYW55CisgICAgbmV3X3BhdGg9IiR7bmV3X3BhdGgvJS5leGUvfSIKKworICAgICMgU2F2ZSB0aGUgZmlyc3QgMTAgYnl0ZXMgb2YgdGhpcyBwYXRoIHRvIHRoZSBzdG9yYWdlLCBzbyBmaXhwYXRoIGNhbiB3b3JrLgorICAgIGFsbF9maXhwYXRoX3ByZWZpeGVzPSgiJHthbGxfZml4cGF0aF9wcmVmaXhlc1tAXX0iICIke25ld19wYXRoOjA6MTB9IikKKyAgZmkKKworICBlbHNlCisgICAgIyBXZSdyZSBvbiBhIHBvc2l4IHBsYXRmb3JtLiBIb29yYXkhIDopCisgICAgIyBGaXJzdCBzZXBhcmF0ZSB0aGUgcGF0aCBmcm9tIHRoZSBhcmd1bWVudHMuIFRoaXMgd2lsbCBzcGxpdCBhdCB0aGUgZmlyc3QKKyAgICAjIHNwYWNlLgorICAgIGNvbXBsZXRlPSIkRk9VTkRfTUFLRSIKKyAgICBwYXRoPSIke2NvbXBsZXRlJSUgKn0iCisgICAgdG1wPSIkY29tcGxldGUgRU9MIgorICAgIGFyZ3VtZW50cz0iJHt0bXAjKiB9IgorCisgICAgbmV3X3BhdGg9YCRXSElDSCAkcGF0aCAyPiAvZGV2L251bGxgCisgICAgaWYgdGVzdCAieCRuZXdfcGF0aCIgPSB4OyB0aGVuCisgICAgICBpc19hYnNvbHV0ZV9wYXRoPWAkRUNITyAiJHBhdGgiIHwgJEdSRVAgXi9gCisgICAgICBpZiB0ZXN0ICJ4JGlzX2Fic29sdXRlX3BhdGgiICE9IHg7IHRoZW4KKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBSZXNvbHZpbmcgRk9VTkRfTUFLRSAoYXMgJHBhdGgpIHdpdGggJ3doaWNoJyBmYWlsZWQsIHVzaW5nICRwYXRoIGRpcmVjdGx5LiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBSZXNvbHZpbmcgRk9VTkRfTUFLRSAoYXMgJHBhdGgpIHdpdGggJ3doaWNoJyBmYWlsZWQsIHVzaW5nICRwYXRoIGRpcmVjdGx5LiIgPiY2O30KKyAgICAgICAgbmV3X3BhdGg9IiRwYXRoIgorICAgICAgZWxzZQorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSBwYXRoIG9mIEZPVU5EX01BS0UsIHdoaWNoIHJlc29sdmVzIGFzIFwiJGNvbXBsZXRlXCIsIGlzIG5vdCBmb3VuZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhlIHBhdGggb2YgRk9VTkRfTUFLRSwgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkY29tcGxldGVcIiwgaXMgbm90IGZvdW5kLiIgPiY2O30KKyAgICAgICAgaGFzX3NwYWNlPWAkRUNITyAiJGNvbXBsZXRlIiB8ICRHUkVQICIgImAKKyAgICAgICAgaWYgdGVzdCAieCRoYXNfc3BhY2UiICE9IHg7IHRoZW4KKyAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoaXMgbWlnaHQgYmUgY2F1c2VkIGJ5IHNwYWNlcyBpbiB0aGUgcGF0aCwgd2hpY2ggaXMgbm90IGFsbG93ZWQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoaXMgbWlnaHQgYmUgY2F1c2VkIGJ5IHNwYWNlcyBpbiB0aGUgcGF0aCwgd2hpY2ggaXMgbm90IGFsbG93ZWQuIiA+JjY7fQorICAgICAgICBmaQorICAgICAgICBhc19mbl9lcnJvciAkPyAiQ2Fubm90IGxvY2F0ZSB0aGUgdGhlIHBhdGggb2YgRk9VTkRfTUFLRSIgIiRMSU5FTk8iIDUKKyAgICAgIGZpCisgICAgZmkKKyAgZmkKKworICAjIE5vdyBqb2luIHRvZ2V0aGVyIHRoZSBwYXRoIGFuZCB0aGUgYXJndW1lbnRzIG9uY2UgYWdhaW4KKyAgaWYgdGVzdCAieCRhcmd1bWVudHMiICE9IHhFT0w7IHRoZW4KKyAgICAgIG5ld19jb21wbGV0ZT0iJG5ld19wYXRoICR7YXJndW1lbnRzJSAqfSIKKyAgZWxzZQorICAgICAgbmV3X2NvbXBsZXRlPSIkbmV3X3BhdGgiCisgIGZpCisKKyAgaWYgdGVzdCAieCRjb21wbGV0ZSIgIT0gIngkbmV3X2NvbXBsZXRlIjsgdGhlbgorICAgIEZPVU5EX01BS0U9IiRuZXdfY29tcGxldGUiCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBSZXdyaXRpbmcgRk9VTkRfTUFLRSB0byBcIiRuZXdfY29tcGxldGVcIiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBSZXdyaXRpbmcgRk9VTkRfTUFLRSB0byBcIiRuZXdfY29tcGxldGVcIiIgPiY2O30KKyAgZmkKKworICAgICAgICBmaQorICAgICAgZmkKKyAgICBmaQorICBmaQorCisgICAgaWYgdGVzdCAieCRGT1VORF9NQUtFIiA9IHg7IHRoZW4KKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJUaGUgc3BlY2lmaWVkIG1ha2UgKGJ5IE1BS0U9JE1BS0UpIGlzIG5vdCBHTlUgbWFrZSAzLjgxIG9yIG5ld2VyLiIgIiRMSU5FTk8iIDUKKyAgICBmaQorICBlbHNlCisgICAgIyBUcnkgb3VyIGhhcmRlc3QgdG8gbG9jYXRlIGEgY29ycmVjdCB2ZXJzaW9uIG9mIEdOVSBtYWtlCisgICAgZm9yIGFjX3Byb2cgaW4gZ21ha2UKK2RvCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcGF0aF9DSEVDS19HTUFLRStzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhc2UgJENIRUNLX0dNQUtFIGluCisgIFtcXC9dKiB8ID86W1xcL10qKQorICBhY19jdl9wYXRoX0NIRUNLX0dNQUtFPSIkQ0hFQ0tfR01BS0UiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wYXRoX0NIRUNLX0dNQUtFPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCisgIDs7Citlc2FjCitmaQorQ0hFQ0tfR01BS0U9JGFjX2N2X3BhdGhfQ0hFQ0tfR01BS0UKK2lmIHRlc3QgLW4gIiRDSEVDS19HTUFLRSI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRDSEVDS19HTUFLRSIgPiY1CiskYXNfZWNobyAiJENIRUNLX0dNQUtFIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKyAgdGVzdCAtbiAiJENIRUNLX0dNQUtFIiAmJiBicmVhaworZG9uZQorCisKKyAgTUFLRV9DQU5ESURBVEU9IiIkQ0hFQ0tfR01BS0UiIgorICBERVNDUklQVElPTj0iZ21ha2UgaW4gUEFUSCIKKyAgaWYgdGVzdCAieCRNQUtFX0NBTkRJREFURSIgIT0geDsgdGhlbgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGVzdGluZyBwb3RlbnRpYWwgbWFrZSBhdCAkTUFLRV9DQU5ESURBVEUsIGZvdW5kIHVzaW5nICRERVNDUklQVElPTiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUZXN0aW5nIHBvdGVudGlhbCBtYWtlIGF0ICRNQUtFX0NBTkRJREFURSwgZm91bmQgdXNpbmcgJERFU0NSSVBUSU9OIiA+JjY7fQorICAgIE1BS0VfVkVSU0lPTl9TVFJJTkc9YCRNQUtFX0NBTkRJREFURSAtLXZlcnNpb24gfCAkSEVBRCAtbiAxYAorICAgIElTX0dOVV9NQUtFPWAkRUNITyAkTUFLRV9WRVJTSU9OX1NUUklORyB8ICRHUkVQICdHTlUgTWFrZSdgCisgICAgaWYgdGVzdCAieCRJU19HTlVfTUFLRSIgPSB4OyB0aGVuCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IEZvdW5kIHBvdGVudGlhbCBtYWtlIGF0ICRNQUtFX0NBTkRJREFURSwgaG93ZXZlciwgdGhpcyBpcyBub3QgR05VIE1ha2UuIElnbm9yaW5nLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBGb3VuZCBwb3RlbnRpYWwgbWFrZSBhdCAkTUFLRV9DQU5ESURBVEUsIGhvd2V2ZXIsIHRoaXMgaXMgbm90IEdOVSBNYWtlLiBJZ25vcmluZy4iID4mNjt9CisgICAgZWxzZQorICAgICAgSVNfTU9ERVJOX01BS0U9YCRFQ0hPICRNQUtFX1ZFUlNJT05fU1RSSU5HIHwgJEdSRVAgJzMuOFsxMjM0Njc4OV0nYAorICAgICAgaWYgdGVzdCAieCRJU19NT0RFUk5fTUFLRSIgPSB4OyB0aGVuCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogRm91bmQgR05VIG1ha2UgYXQgJE1BS0VfQ0FORElEQVRFLCBob3dldmVyIHRoaXMgaXMgbm90IHZlcnNpb24gMy44MSBvciBsYXRlci4gKGl0IGlzOiAkTUFLRV9WRVJTSU9OX1NUUklORykuIElnbm9yaW5nLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBGb3VuZCBHTlUgbWFrZSBhdCAkTUFLRV9DQU5ESURBVEUsIGhvd2V2ZXIgdGhpcyBpcyBub3QgdmVyc2lvbiAzLjgxIG9yIGxhdGVyLiAoaXQgaXM6ICRNQUtFX1ZFUlNJT05fU1RSSU5HKS4gSWdub3JpbmcuIiA+JjY7fQorICAgICAgZWxzZQorICAgICAgICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1MiID0gInh3aW5kb3dzIjsgdGhlbgorICAgICAgICAgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLmN5Z3dpbiI7IHRoZW4KKyAgICAgICAgICAgIE1BS0VfRVhQRUNURURfRU5WPSdjeWd3aW4nCisgICAgICAgICAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorICAgICAgICAgICAgTUFLRV9FWFBFQ1RFRF9FTlY9J21zeXMnCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgYXNfZm5fZXJyb3IgJD8gIlVua25vd24gV2luZG93cyBlbnZpcm9ubWVudCIgIiRMSU5FTk8iIDUKKyAgICAgICAgICBmaQorICAgICAgICAgIE1BS0VfQlVJTFRfRk9SPWAkTUFLRV9DQU5ESURBVEUgLS12ZXJzaW9uIHwgJEdSRVAgLWkgJ2J1aWx0IGZvcidgCisgICAgICAgICAgSVNfTUFLRV9DT1JSRUNUX0VOVj1gJEVDSE8gJE1BS0VfQlVJTFRfRk9SIHwgJEdSRVAgJE1BS0VfRVhQRUNURURfRU5WYAorICAgICAgICBlbHNlCisgICAgICAgICAgIyBOb3QgcmVsZXZhbnQgZm9yIG5vbi1XaW5kb3dzCisgICAgICAgICAgSVNfTUFLRV9DT1JSRUNUX0VOVj10cnVlCisgICAgICAgIGZpCisgICAgICAgIGlmIHRlc3QgIngkSVNfTUFLRV9DT1JSRUNUX0VOViIgPSB4OyB0aGVuCisgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBGb3VuZCBHTlUgbWFrZSB2ZXJzaW9uICRNQUtFX1ZFUlNJT05fU1RSSU5HIGF0ICRNQUtFX0NBTkRJREFURSwgYnV0IGl0IGlzIG5vdCBmb3IgJE1BS0VfRVhQRUNURURfRU5WIChpdCBzYXlzOiAkTUFLRV9CVUlMVF9GT1IpLiBJZ25vcmluZy4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogRm91bmQgR05VIG1ha2UgdmVyc2lvbiAkTUFLRV9WRVJTSU9OX1NUUklORyBhdCAkTUFLRV9DQU5ESURBVEUsIGJ1dCBpdCBpcyBub3QgZm9yICRNQUtFX0VYUEVDVEVEX0VOViAoaXQgc2F5czogJE1BS0VfQlVJTFRfRk9SKS4gSWdub3JpbmcuIiA+JjY7fQorICAgICAgICBlbHNlCisgICAgICAgICAgRk9VTkRfTUFLRT0kTUFLRV9DQU5ESURBVEUKKworICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5jeWd3aW4iOyB0aGVuCisKKyAgIyBGaXJzdCBzZXBhcmF0ZSB0aGUgcGF0aCBmcm9tIHRoZSBhcmd1bWVudHMuIFRoaXMgd2lsbCBzcGxpdCBhdCB0aGUgZmlyc3QKKyAgIyBzcGFjZS4KKyAgY29tcGxldGU9IiRGT1VORF9NQUtFIgorICBwYXRoPSIke2NvbXBsZXRlJSUgKn0iCisgIHRtcD0iJGNvbXBsZXRlIEVPTCIKKyAgYXJndW1lbnRzPSIke3RtcCMqIH0iCisKKyAgIyBJbnB1dCBtaWdodCBiZSBnaXZlbiBhcyBXaW5kb3dzIGZvcm1hdCwgc3RhcnQgYnkgY29udmVydGluZyB0bworICAjIHVuaXggZm9ybWF0LgorICBuZXdfcGF0aD1gJENZR1BBVEggLXUgIiRwYXRoImAKKworICAjIE5vdyB0cnkgdG8gbG9jYXRlIGV4ZWN1dGFibGUgdXNpbmcgd2hpY2gKKyAgbmV3X3BhdGg9YCRXSElDSCAiJG5ld19wYXRoIiAyPiAvZGV2L251bGxgCisgIGlmIHRlc3QgIngkbmV3X3BhdGgiID0geDsgdGhlbgorICAgICMgT29wcy4gV2hpY2ggZGlkbid0IGZpbmQgdGhlIGV4ZWN1dGFibGUuCisgICAgIyBUaGUgc3BsaXR0aW5nIG9mIGFyZ3VtZW50cyBmcm9tIHRoZSBleGVjdXRhYmxlIGF0IGEgc3BhY2UgbWlnaHQgaGF2ZSBiZWVuIGluY29ycmVjdCwKKyAgICAjIHNpbmNlIHBhdGhzIHdpdGggc3BhY2UgYXJlIG1vcmUgbGlrZWx5IGluIFdpbmRvd3MuIEdpdmUgaXQgYW5vdGhlciB0cnkgd2l0aCB0aGUgd2hvbGUKKyAgICAjIGFyZ3VtZW50LgorICAgIHBhdGg9IiRjb21wbGV0ZSIKKyAgICBhcmd1bWVudHM9IkVPTCIKKyAgICBuZXdfcGF0aD1gJENZR1BBVEggLXUgIiRwYXRoImAKKyAgICBuZXdfcGF0aD1gJFdISUNIICIkbmV3X3BhdGgiIDI+IC9kZXYvbnVsbGAKKyAgICBpZiB0ZXN0ICJ4JG5ld19wYXRoIiA9IHg7IHRoZW4KKyAgICAgICMgSXQncyBzdGlsbCBub3QgZm91bmQuIE5vdyB0aGlzIGlzIGFuIHVucmVjb3ZlcmFibGUgZXJyb3IuCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSBwYXRoIG9mIEZPVU5EX01BS0UsIHdoaWNoIHJlc29sdmVzIGFzIFwiJGNvbXBsZXRlXCIsIGlzIG5vdCBmb3VuZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhlIHBhdGggb2YgRk9VTkRfTUFLRSwgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkY29tcGxldGVcIiwgaXMgbm90IGZvdW5kLiIgPiY2O30KKyAgICAgIGhhc19zcGFjZT1gJEVDSE8gIiRjb21wbGV0ZSIgfCAkR1JFUCAiICJgCisgICAgICBpZiB0ZXN0ICJ4JGhhc19zcGFjZSIgIT0geDsgdGhlbgorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFlvdSBtaWdodCBiZSBtaXhpbmcgc3BhY2VzIGluIHRoZSBwYXRoIGFuZCBleHRyYSBhcmd1bWVudHMsIHdoaWNoIGlzIG5vdCBhbGxvd2VkLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBZb3UgbWlnaHQgYmUgbWl4aW5nIHNwYWNlcyBpbiB0aGUgcGF0aCBhbmQgZXh0cmEgYXJndW1lbnRzLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iID4mNjt9CisgICAgICBmaQorICAgICAgYXNfZm5fZXJyb3IgJD8gIkNhbm5vdCBsb2NhdGUgdGhlIHRoZSBwYXRoIG9mIEZPVU5EX01BS0UiICIkTElORU5PIiA1CisgICAgZmkKKyAgZmkKKworICAjIEN5Z3dpbiB0cmllcyB0byBoaWRlIHNvbWUgYXNwZWN0cyBvZiB0aGUgV2luZG93cyBmaWxlIHN5c3RlbSwgc3VjaCB0aGF0IGJpbmFyaWVzIGFyZQorICAjIG5hbWVkIC5leGUgYnV0IGNhbGxlZCB3aXRob3V0IHRoYXQgc3VmZml4LiBUaGVyZWZvcmUsICJmb28iIGFuZCAiZm9vLmV4ZSIgYXJlIGNvbnNpZGVyZWQKKyAgIyB0aGUgc2FtZSBmaWxlLCBtb3N0IG9mIHRoZSB0aW1lIChhcyBpbiAidGVzdCAtZiIpLiBCdXQgbm90IHdoZW4gcnVubmluZyBjeWdwYXRoIC1zLCB0aGVuCisgICMgImZvby5leGUiIGlzIE9LIGJ1dCAiZm9vIiBpcyBhbiBlcnJvci4KKyAgIworICAjIFRoaXMgdGVzdCBpcyB0aGVyZWZvcmUgc2xpZ2h0bHkgbW9yZSBhY2N1cmF0ZSB0aGFuICJ0ZXN0IC1mIiB0byBjaGVjayBmb3IgZmlsZSBwcmVjZW5zZS4KKyAgIyBJdCBpcyBhbHNvIGEgd2F5IHRvIG1ha2Ugc3VyZSB3ZSBnb3QgdGhlIHByb3BlciBmaWxlIG5hbWUgZm9yIHRoZSByZWFsIHRlc3QgbGF0ZXIgb24uCisgIHRlc3Rfc2hvcnRwYXRoPWAkQ1lHUEFUSCAtcyAtbSAiJG5ld19wYXRoIiAyPiAvZGV2L251bGxgCisgIGlmIHRlc3QgIngkdGVzdF9zaG9ydHBhdGgiID0geDsgdGhlbgorICAgICMgU2hvcnQgcGF0aCBmYWlsZWQsIGZpbGUgZG9lcyBub3QgZXhpc3QgYXMgc3BlY2lmaWVkLgorICAgICMgVHJ5IGFkZGluZyAuZXhlIG9yIC5jbWQKKyAgICBpZiB0ZXN0IC1mICIke25ld19wYXRofS5leGUiOyB0aGVuCisgICAgICAgaW5wdXRfdG9fc2hvcnRwYXRoPSIke25ld19wYXRofS5leGUiCisgICAgZWxpZiB0ZXN0IC1mICIke25ld19wYXRofS5jbWQiOyB0aGVuCisgICAgICAgaW5wdXRfdG9fc2hvcnRwYXRoPSIke25ld19wYXRofS5jbWQiCisgICAgZWxzZQorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUaGUgcGF0aCBvZiBGT1VORF9NQUtFLCB3aGljaCByZXNvbHZlcyBhcyBcIiRuZXdfcGF0aFwiLCBpcyBpbnZhbGlkLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUaGUgcGF0aCBvZiBGT1VORF9NQUtFLCB3aGljaCByZXNvbHZlcyBhcyBcIiRuZXdfcGF0aFwiLCBpcyBpbnZhbGlkLiIgPiY2O30KKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogTmVpdGhlciBcIiRuZXdfcGF0aFwiIG5vciBcIiRuZXdfcGF0aC5leGUvY21kXCIgY2FuIGJlIGZvdW5kIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IE5laXRoZXIgXCIkbmV3X3BhdGhcIiBub3IgXCIkbmV3X3BhdGguZXhlL2NtZFwiIGNhbiBiZSBmb3VuZCIgPiY2O30KKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJDYW5ub3QgbG9jYXRlIHRoZSB0aGUgcGF0aCBvZiBGT1VORF9NQUtFIiAiJExJTkVOTyIgNQorICAgIGZpCisgIGVsc2UKKyAgICBpbnB1dF90b19zaG9ydHBhdGg9IiRuZXdfcGF0aCIKKyAgZmkKKworICAjIENhbGwgaGVscGVyIGZ1bmN0aW9uIHdoaWNoIHBvc3NpYmx5IGNvbnZlcnRzIHRoaXMgdXNpbmcgRE9TLXN0eWxlIHNob3J0IG1vZGUuCisgICMgSWYgc28sIHRoZSB1cGRhdGVkIHBhdGggaXMgc3RvcmVkIGluICRuZXdfcGF0aC4KKyAgbmV3X3BhdGg9IiRpbnB1dF90b19zaG9ydHBhdGgiCisKKyAgaW5wdXRfcGF0aD0iJGlucHV0X3RvX3Nob3J0cGF0aCIKKyAgIyBDaGVjayBpZiB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhpcyB1c2luZyBET1Mtc3R5bGUgc2hvcnQgbW9kZS4gSWYgdGhlIHBhdGgKKyAgIyBjb250YWlucyBqdXN0IHNpbXBsZSBjaGFyYWN0ZXJzLCB1c2UgaXQuIE90aGVyd2lzZSAoc3BhY2VzLCB3ZWlyZCBjaGFyYWN0ZXJzKSwKKyAgIyB0YWtlIG5vIGNoYW5jZXMgYW5kIHJld3JpdGUgaXQuCisgICMgTm90ZTogbTQgZWF0cyBvdXIgW10sIHNvIHdlIG5lZWQgdG8gdXNlIFsgYW5kIF0gaW5zdGVhZC4KKyAgaGFzX2ZvcmJpZGRlbl9jaGFycz1gJEVDSE8gIiRpbnB1dF9wYXRoIiB8ICRHUkVQIFteLS5fL2EtekEtWjAtOV1gCisgIGlmIHRlc3QgIngkaGFzX2ZvcmJpZGRlbl9jaGFycyIgIT0geDsgdGhlbgorICAgICMgTm93IGNvbnZlcnQgaXQgdG8gbWl4ZWQgRE9TLXN0eWxlLCBzaG9ydCBtb2RlIChubyBzcGFjZXMsIGFuZCAvIGluc3RlYWQgb2YgXCkKKyAgICBzaG9ydG1vZGVfcGF0aD1gJENZR1BBVEggLXMgLW0gLWEgIiRpbnB1dF9wYXRoImAKKyAgICBwYXRoX2FmdGVyX3Nob3J0bW9kZT1gJENZR1BBVEggLXUgIiRzaG9ydG1vZGVfcGF0aCJgCisgICAgaWYgdGVzdCAieCRwYXRoX2FmdGVyX3Nob3J0bW9kZSIgIT0gIngkaW5wdXRfdG9fc2hvcnRwYXRoIjsgdGhlbgorICAgICAgIyBHb2luZyB0byBzaG9ydCBtb2RlIGFuZCBiYWNrIGFnYWluIGRpZCBpbmRlZWQgbWF0dGVyLiBTaW5jZSBzaG9ydCBtb2RlIGlzCisgICAgICAjIGNhc2UgaW5zZW5zaXRpdmUsIGxldCdzIG1ha2UgaXQgbG93ZXJjYXNlIHRvIGltcHJvdmUgcmVhZGFiaWxpdHkuCisgICAgICBzaG9ydG1vZGVfcGF0aD1gJEVDSE8gIiRzaG9ydG1vZGVfcGF0aCIgfCAkVFIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAorICAgICAgIyBOb3cgY29udmVydCBpdCBiYWNrIHRvIFVuaXgtc3RpbGUgKGN5Z3BhdGgpCisgICAgICBpbnB1dF9wYXRoPWAkQ1lHUEFUSCAtdSAiJHNob3J0bW9kZV9wYXRoImAKKyAgICAgIG5ld19wYXRoPSIkaW5wdXRfcGF0aCIKKyAgICBmaQorICBmaQorCisgIHRlc3RfY3lnZHJpdmVfcHJlZml4PWAkRUNITyAkaW5wdXRfcGF0aCB8ICRHUkVQIF4vY3lnZHJpdmUvYAorICBpZiB0ZXN0ICJ4JHRlc3RfY3lnZHJpdmVfcHJlZml4IiA9IHg7IHRoZW4KKyAgICAjIEFzIGEgc2ltcGxlIGZpeCwgZXhjbHVkZSAvdXNyL2JpbiBzaW5jZSBpdCdzIG5vdCBhIHJlYWwgcGF0aC4KKyAgICBpZiB0ZXN0ICJ4YCRFQ0hPICRpbnB1dF90b19zaG9ydHBhdGggfCAkR1JFUCBeL3Vzci9iaW4vYCIgPSB4OyB0aGVuCisgICAgICAjIFRoZSBwYXRoIGlzIGluIGEgQ3lnd2luIHNwZWNpYWwgZGlyZWN0b3J5IChlLmcuIC9ob21lKS4gV2UgbmVlZCB0aGlzIGNvbnZlcnRlZCB0bworICAgICAgIyBhIHBhdGggcHJlZml4ZWQgYnkgL2N5Z2RyaXZlIGZvciBmaXhwYXRoIHRvIHdvcmsuCisgICAgICBuZXdfcGF0aD0iJENZR1dJTl9ST09UX1BBVEgkaW5wdXRfcGF0aCIKKyAgICBmaQorICBmaQorCisgICMgcmVtb3ZlIHRyYWlsaW5nIC5leGUgaWYgYW55CisgIG5ld19wYXRoPSIke25ld19wYXRoLyUuZXhlL30iCisKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorCisgICMgRmlyc3Qgc2VwYXJhdGUgdGhlIHBhdGggZnJvbSB0aGUgYXJndW1lbnRzLiBUaGlzIHdpbGwgc3BsaXQgYXQgdGhlIGZpcnN0CisgICMgc3BhY2UuCisgIGNvbXBsZXRlPSIkRk9VTkRfTUFLRSIKKyAgcGF0aD0iJHtjb21wbGV0ZSUlICp9IgorICB0bXA9IiRjb21wbGV0ZSBFT0wiCisgIGFyZ3VtZW50cz0iJHt0bXAjKiB9IgorCisgICMgSW5wdXQgbWlnaHQgYmUgZ2l2ZW4gYXMgV2luZG93cyBmb3JtYXQsIHN0YXJ0IGJ5IGNvbnZlcnRpbmcgdG8KKyAgIyB1bml4IGZvcm1hdC4KKyAgbmV3X3BhdGg9IiRwYXRoIgorCisgIHdpbmRvd3NfcGF0aD0iJG5ld19wYXRoIgorICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5jeWd3aW4iOyB0aGVuCisgICAgdW5peF9wYXRoPWAkQ1lHUEFUSCAtdSAiJHdpbmRvd3NfcGF0aCJgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGVsaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MubXN5cyI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRFQ0hPICIkd2luZG93c19wYXRoIiB8ICRTRUQgLWUgJ3MsXlxcKC5cXCk6LC9cXDEsZycgLWUgJ3MsXFxcXCwvLGcnYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBmaQorCisKKyAgIyBOb3cgdHJ5IHRvIGxvY2F0ZSBleGVjdXRhYmxlIHVzaW5nIHdoaWNoCisgIG5ld19wYXRoPWAkV0hJQ0ggIiRuZXdfcGF0aCIgMj4gL2Rldi9udWxsYAorCisgIGlmIHRlc3QgIngkbmV3X3BhdGgiID0geDsgdGhlbgorICAgICMgT29wcy4gV2hpY2ggZGlkbid0IGZpbmQgdGhlIGV4ZWN1dGFibGUuCisgICAgIyBUaGUgc3BsaXR0aW5nIG9mIGFyZ3VtZW50cyBmcm9tIHRoZSBleGVjdXRhYmxlIGF0IGEgc3BhY2UgbWlnaHQgaGF2ZSBiZWVuIGluY29ycmVjdCwKKyAgICAjIHNpbmNlIHBhdGhzIHdpdGggc3BhY2UgYXJlIG1vcmUgbGlrZWx5IGluIFdpbmRvd3MuIEdpdmUgaXQgYW5vdGhlciB0cnkgd2l0aCB0aGUgd2hvbGUKKyAgICAjIGFyZ3VtZW50LgorICAgIHBhdGg9IiRjb21wbGV0ZSIKKyAgICBhcmd1bWVudHM9IkVPTCIKKyAgICBuZXdfcGF0aD0iJHBhdGgiCisKKyAgd2luZG93c19wYXRoPSIkbmV3X3BhdGgiCisgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLmN5Z3dpbiI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRDWUdQQVRIIC11ICIkd2luZG93c19wYXRoImAKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJEVDSE8gIiR3aW5kb3dzX3BhdGgiIHwgJFNFRCAtZSAncyxeXFwoLlxcKTosL1xcMSxnJyAtZSAncyxcXFxcLC8sZydgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGZpCisKKworICAgIG5ld19wYXRoPWAkV0hJQ0ggIiRuZXdfcGF0aCIgMj4gL2Rldi9udWxsYAorCisgICAgaWYgdGVzdCAieCRuZXdfcGF0aCIgPSB4OyB0aGVuCisgICAgICAjIEl0J3Mgc3RpbGwgbm90IGZvdW5kLiBOb3cgdGhpcyBpcyBhbiB1bnJlY292ZXJhYmxlIGVycm9yLgorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUaGUgcGF0aCBvZiBGT1VORF9NQUtFLCB3aGljaCByZXNvbHZlcyBhcyBcIiRjb21wbGV0ZVwiLCBpcyBub3QgZm91bmQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoZSBwYXRoIG9mIEZPVU5EX01BS0UsIHdoaWNoIHJlc29sdmVzIGFzIFwiJGNvbXBsZXRlXCIsIGlzIG5vdCBmb3VuZC4iID4mNjt9CisgICAgICBoYXNfc3BhY2U9YCRFQ0hPICIkY29tcGxldGUiIHwgJEdSRVAgIiAiYAorICAgICAgaWYgdGVzdCAieCRoYXNfc3BhY2UiICE9IHg7IHRoZW4KKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBZb3UgbWlnaHQgYmUgbWl4aW5nIHNwYWNlcyBpbiB0aGUgcGF0aCBhbmQgZXh0cmEgYXJndW1lbnRzLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogWW91IG1pZ2h0IGJlIG1peGluZyBzcGFjZXMgaW4gdGhlIHBhdGggYW5kIGV4dHJhIGFyZ3VtZW50cywgd2hpY2ggaXMgbm90IGFsbG93ZWQuIiA+JjY7fQorICAgICAgZmkKKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJDYW5ub3QgbG9jYXRlIHRoZSB0aGUgcGF0aCBvZiBGT1VORF9NQUtFIiAiJExJTkVOTyIgNQorICAgIGZpCisgIGZpCisKKyAgIyBOb3cgbmV3X3BhdGggaGFzIGEgY29tcGxldGUgdW5peCBwYXRoIHRvIHRoZSBiaW5hcnkKKyAgaWYgdGVzdCAieGAkRUNITyAkbmV3X3BhdGggfCAkR1JFUCBeL2Jpbi9gIiAhPSB4OyB0aGVuCisgICAgIyBLZWVwIHBhdGhzIGluIC9iaW4gYXMtaXMsIGJ1dCByZW1vdmUgdHJhaWxpbmcgLmV4ZSBpZiBhbnkKKyAgICBuZXdfcGF0aD0iJHtuZXdfcGF0aC8lLmV4ZS99IgorICAgICMgRG8gbm90IHNhdmUgL2JpbiBwYXRocyB0byBhbGxfZml4cGF0aF9wcmVmaXhlcyEKKyAgZWxzZQorICAgICMgTm90IGluIG1peGVkIG9yIFdpbmRvd3Mgc3R5bGUsIHN0YXJ0IGJ5IHRoYXQuCisgICAgbmV3X3BhdGg9YGNtZCAvL2MgZWNobyAkbmV3X3BhdGhgCisKKyAgaW5wdXRfcGF0aD0iJG5ld19wYXRoIgorICAjIENoZWNrIGlmIHdlIG5lZWQgdG8gY29udmVydCB0aGlzIHVzaW5nIERPUy1zdHlsZSBzaG9ydCBtb2RlLiBJZiB0aGUgcGF0aAorICAjIGNvbnRhaW5zIGp1c3Qgc2ltcGxlIGNoYXJhY3RlcnMsIHVzZSBpdC4gT3RoZXJ3aXNlIChzcGFjZXMsIHdlaXJkIGNoYXJhY3RlcnMpLAorICAjIHRha2Ugbm8gY2hhbmNlcyBhbmQgcmV3cml0ZSBpdC4KKyAgIyBOb3RlOiBtNCBlYXRzIG91ciBbXSwgc28gd2UgbmVlZCB0byB1c2UgWyBhbmQgXSBpbnN0ZWFkLgorICBoYXNfZm9yYmlkZGVuX2NoYXJzPWAkRUNITyAiJGlucHV0X3BhdGgiIHwgJEdSRVAgW14tXy86YS16QS1aMC05XWAKKyAgaWYgdGVzdCAieCRoYXNfZm9yYmlkZGVuX2NoYXJzIiAhPSB4OyB0aGVuCisgICAgIyBOb3cgY29udmVydCBpdCB0byBtaXhlZCBET1Mtc3R5bGUsIHNob3J0IG1vZGUgKG5vIHNwYWNlcywgYW5kIC8gaW5zdGVhZCBvZiBcKQorICAgIG5ld19wYXRoPWBjbWQgL2MgImZvciAlQSBpbiAoXCIkaW5wdXRfcGF0aFwiKSBkbyBAZWNobyAlfnNBInwkVFIgXFxcXFxcXFwgLyB8ICRUUiAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidgCisgIGZpCisKKyAgICAjIE91dHB1dCBpcyBpbiAkbmV3X3BhdGgKKworICB3aW5kb3dzX3BhdGg9IiRuZXdfcGF0aCIKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJENZR1BBVEggLXUgIiR3aW5kb3dzX3BhdGgiYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBlbGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLm1zeXMiOyB0aGVuCisgICAgdW5peF9wYXRoPWAkRUNITyAiJHdpbmRvd3NfcGF0aCIgfCAkU0VEIC1lICdzLF5cXCguXFwpOiwvXFwxLGcnIC1lICdzLFxcXFwsLyxnJ2AKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZmkKKworICAgICMgcmVtb3ZlIHRyYWlsaW5nIC5leGUgaWYgYW55CisgICAgbmV3X3BhdGg9IiR7bmV3X3BhdGgvJS5leGUvfSIKKworICAgICMgU2F2ZSB0aGUgZmlyc3QgMTAgYnl0ZXMgb2YgdGhpcyBwYXRoIHRvIHRoZSBzdG9yYWdlLCBzbyBmaXhwYXRoIGNhbiB3b3JrLgorICAgIGFsbF9maXhwYXRoX3ByZWZpeGVzPSgiJHthbGxfZml4cGF0aF9wcmVmaXhlc1tAXX0iICIke25ld19wYXRoOjA6MTB9IikKKyAgZmkKKworICBlbHNlCisgICAgIyBXZSdyZSBvbiBhIHBvc2l4IHBsYXRmb3JtLiBIb29yYXkhIDopCisgICAgIyBGaXJzdCBzZXBhcmF0ZSB0aGUgcGF0aCBmcm9tIHRoZSBhcmd1bWVudHMuIFRoaXMgd2lsbCBzcGxpdCBhdCB0aGUgZmlyc3QKKyAgICAjIHNwYWNlLgorICAgIGNvbXBsZXRlPSIkRk9VTkRfTUFLRSIKKyAgICBwYXRoPSIke2NvbXBsZXRlJSUgKn0iCisgICAgdG1wPSIkY29tcGxldGUgRU9MIgorICAgIGFyZ3VtZW50cz0iJHt0bXAjKiB9IgorCisgICAgbmV3X3BhdGg9YCRXSElDSCAkcGF0aCAyPiAvZGV2L251bGxgCisgICAgaWYgdGVzdCAieCRuZXdfcGF0aCIgPSB4OyB0aGVuCisgICAgICBpc19hYnNvbHV0ZV9wYXRoPWAkRUNITyAiJHBhdGgiIHwgJEdSRVAgXi9gCisgICAgICBpZiB0ZXN0ICJ4JGlzX2Fic29sdXRlX3BhdGgiICE9IHg7IHRoZW4KKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBSZXNvbHZpbmcgRk9VTkRfTUFLRSAoYXMgJHBhdGgpIHdpdGggJ3doaWNoJyBmYWlsZWQsIHVzaW5nICRwYXRoIGRpcmVjdGx5LiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBSZXNvbHZpbmcgRk9VTkRfTUFLRSAoYXMgJHBhdGgpIHdpdGggJ3doaWNoJyBmYWlsZWQsIHVzaW5nICRwYXRoIGRpcmVjdGx5LiIgPiY2O30KKyAgICAgICAgbmV3X3BhdGg9IiRwYXRoIgorICAgICAgZWxzZQorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSBwYXRoIG9mIEZPVU5EX01BS0UsIHdoaWNoIHJlc29sdmVzIGFzIFwiJGNvbXBsZXRlXCIsIGlzIG5vdCBmb3VuZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhlIHBhdGggb2YgRk9VTkRfTUFLRSwgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkY29tcGxldGVcIiwgaXMgbm90IGZvdW5kLiIgPiY2O30KKyAgICAgICAgaGFzX3NwYWNlPWAkRUNITyAiJGNvbXBsZXRlIiB8ICRHUkVQICIgImAKKyAgICAgICAgaWYgdGVzdCAieCRoYXNfc3BhY2UiICE9IHg7IHRoZW4KKyAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoaXMgbWlnaHQgYmUgY2F1c2VkIGJ5IHNwYWNlcyBpbiB0aGUgcGF0aCwgd2hpY2ggaXMgbm90IGFsbG93ZWQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoaXMgbWlnaHQgYmUgY2F1c2VkIGJ5IHNwYWNlcyBpbiB0aGUgcGF0aCwgd2hpY2ggaXMgbm90IGFsbG93ZWQuIiA+JjY7fQorICAgICAgICBmaQorICAgICAgICBhc19mbl9lcnJvciAkPyAiQ2Fubm90IGxvY2F0ZSB0aGUgdGhlIHBhdGggb2YgRk9VTkRfTUFLRSIgIiRMSU5FTk8iIDUKKyAgICAgIGZpCisgICAgZmkKKyAgZmkKKworICAjIE5vdyBqb2luIHRvZ2V0aGVyIHRoZSBwYXRoIGFuZCB0aGUgYXJndW1lbnRzIG9uY2UgYWdhaW4KKyAgaWYgdGVzdCAieCRhcmd1bWVudHMiICE9IHhFT0w7IHRoZW4KKyAgICAgIG5ld19jb21wbGV0ZT0iJG5ld19wYXRoICR7YXJndW1lbnRzJSAqfSIKKyAgZWxzZQorICAgICAgbmV3X2NvbXBsZXRlPSIkbmV3X3BhdGgiCisgIGZpCisKKyAgaWYgdGVzdCAieCRjb21wbGV0ZSIgIT0gIngkbmV3X2NvbXBsZXRlIjsgdGhlbgorICAgIEZPVU5EX01BS0U9IiRuZXdfY29tcGxldGUiCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBSZXdyaXRpbmcgRk9VTkRfTUFLRSB0byBcIiRuZXdfY29tcGxldGVcIiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBSZXdyaXRpbmcgRk9VTkRfTUFLRSB0byBcIiRuZXdfY29tcGxldGVcIiIgPiY2O30KKyAgZmkKKworICAgICAgICBmaQorICAgICAgZmkKKyAgICBmaQorICBmaQorCisKKyAgICBpZiB0ZXN0ICJ4JEZPVU5EX01BS0UiID0geDsgdGhlbgorICAgICAgZm9yIGFjX3Byb2cgaW4gbWFrZQorZG8KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9wYXRoX0NIRUNLX01BS0Urc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXNlICRDSEVDS19NQUtFIGluCisgIFtcXC9dKiB8ID86W1xcL10qKQorICBhY19jdl9wYXRoX0NIRUNLX01BS0U9IiRDSEVDS19NQUtFIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcGF0aF9DSEVDS19NQUtFPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCisgIDs7Citlc2FjCitmaQorQ0hFQ0tfTUFLRT0kYWNfY3ZfcGF0aF9DSEVDS19NQUtFCitpZiB0ZXN0IC1uICIkQ0hFQ0tfTUFLRSI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRDSEVDS19NQUtFIiA+JjUKKyRhc19lY2hvICIkQ0hFQ0tfTUFLRSIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCisgIHRlc3QgLW4gIiRDSEVDS19NQUtFIiAmJiBicmVhaworZG9uZQorCisKKyAgTUFLRV9DQU5ESURBVEU9IiIkQ0hFQ0tfTUFLRSIiCisgIERFU0NSSVBUSU9OPSJtYWtlIGluIFBBVEgiCisgIGlmIHRlc3QgIngkTUFLRV9DQU5ESURBVEUiICE9IHg7IHRoZW4KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRlc3RpbmcgcG90ZW50aWFsIG1ha2UgYXQgJE1BS0VfQ0FORElEQVRFLCBmb3VuZCB1c2luZyAkREVTQ1JJUFRJT04iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGVzdGluZyBwb3RlbnRpYWwgbWFrZSBhdCAkTUFLRV9DQU5ESURBVEUsIGZvdW5kIHVzaW5nICRERVNDUklQVElPTiIgPiY2O30KKyAgICBNQUtFX1ZFUlNJT05fU1RSSU5HPWAkTUFLRV9DQU5ESURBVEUgLS12ZXJzaW9uIHwgJEhFQUQgLW4gMWAKKyAgICBJU19HTlVfTUFLRT1gJEVDSE8gJE1BS0VfVkVSU0lPTl9TVFJJTkcgfCAkR1JFUCAnR05VIE1ha2UnYAorICAgIGlmIHRlc3QgIngkSVNfR05VX01BS0UiID0geDsgdGhlbgorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBGb3VuZCBwb3RlbnRpYWwgbWFrZSBhdCAkTUFLRV9DQU5ESURBVEUsIGhvd2V2ZXIsIHRoaXMgaXMgbm90IEdOVSBNYWtlLiBJZ25vcmluZy4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogRm91bmQgcG90ZW50aWFsIG1ha2UgYXQgJE1BS0VfQ0FORElEQVRFLCBob3dldmVyLCB0aGlzIGlzIG5vdCBHTlUgTWFrZS4gSWdub3JpbmcuIiA+JjY7fQorICAgIGVsc2UKKyAgICAgIElTX01PREVSTl9NQUtFPWAkRUNITyAkTUFLRV9WRVJTSU9OX1NUUklORyB8ICRHUkVQICczLjhbMTIzNDY3ODldJ2AKKyAgICAgIGlmIHRlc3QgIngkSVNfTU9ERVJOX01BS0UiID0geDsgdGhlbgorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IEZvdW5kIEdOVSBtYWtlIGF0ICRNQUtFX0NBTkRJREFURSwgaG93ZXZlciB0aGlzIGlzIG5vdCB2ZXJzaW9uIDMuODEgb3IgbGF0ZXIuIChpdCBpczogJE1BS0VfVkVSU0lPTl9TVFJJTkcpLiBJZ25vcmluZy4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogRm91bmQgR05VIG1ha2UgYXQgJE1BS0VfQ0FORElEQVRFLCBob3dldmVyIHRoaXMgaXMgbm90IHZlcnNpb24gMy44MSBvciBsYXRlci4gKGl0IGlzOiAkTUFLRV9WRVJTSU9OX1NUUklORykuIElnbm9yaW5nLiIgPiY2O30KKyAgICAgIGVsc2UKKyAgICAgICAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TIiA9ICJ4d2luZG93cyI7IHRoZW4KKyAgICAgICAgICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5jeWd3aW4iOyB0aGVuCisgICAgICAgICAgICBNQUtFX0VYUEVDVEVEX0VOVj0nY3lnd2luJworICAgICAgICAgIGVsaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MubXN5cyI7IHRoZW4KKyAgICAgICAgICAgIE1BS0VfRVhQRUNURURfRU5WPSdtc3lzJworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGFzX2ZuX2Vycm9yICQ/ICJVbmtub3duIFdpbmRvd3MgZW52aXJvbm1lbnQiICIkTElORU5PIiA1CisgICAgICAgICAgZmkKKyAgICAgICAgICBNQUtFX0JVSUxUX0ZPUj1gJE1BS0VfQ0FORElEQVRFIC0tdmVyc2lvbiB8ICRHUkVQIC1pICdidWlsdCBmb3InYAorICAgICAgICAgIElTX01BS0VfQ09SUkVDVF9FTlY9YCRFQ0hPICRNQUtFX0JVSUxUX0ZPUiB8ICRHUkVQICRNQUtFX0VYUEVDVEVEX0VOVmAKKyAgICAgICAgZWxzZQorICAgICAgICAgICMgTm90IHJlbGV2YW50IGZvciBub24tV2luZG93cworICAgICAgICAgIElTX01BS0VfQ09SUkVDVF9FTlY9dHJ1ZQorICAgICAgICBmaQorICAgICAgICBpZiB0ZXN0ICJ4JElTX01BS0VfQ09SUkVDVF9FTlYiID0geDsgdGhlbgorICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogRm91bmQgR05VIG1ha2UgdmVyc2lvbiAkTUFLRV9WRVJTSU9OX1NUUklORyBhdCAkTUFLRV9DQU5ESURBVEUsIGJ1dCBpdCBpcyBub3QgZm9yICRNQUtFX0VYUEVDVEVEX0VOViAoaXQgc2F5czogJE1BS0VfQlVJTFRfRk9SKS4gSWdub3JpbmcuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IEZvdW5kIEdOVSBtYWtlIHZlcnNpb24gJE1BS0VfVkVSU0lPTl9TVFJJTkcgYXQgJE1BS0VfQ0FORElEQVRFLCBidXQgaXQgaXMgbm90IGZvciAkTUFLRV9FWFBFQ1RFRF9FTlYgKGl0IHNheXM6ICRNQUtFX0JVSUxUX0ZPUikuIElnbm9yaW5nLiIgPiY2O30KKyAgICAgICAgZWxzZQorICAgICAgICAgIEZPVU5EX01BS0U9JE1BS0VfQ0FORElEQVRFCisKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorCisgICMgRmlyc3Qgc2VwYXJhdGUgdGhlIHBhdGggZnJvbSB0aGUgYXJndW1lbnRzLiBUaGlzIHdpbGwgc3BsaXQgYXQgdGhlIGZpcnN0CisgICMgc3BhY2UuCisgIGNvbXBsZXRlPSIkRk9VTkRfTUFLRSIKKyAgcGF0aD0iJHtjb21wbGV0ZSUlICp9IgorICB0bXA9IiRjb21wbGV0ZSBFT0wiCisgIGFyZ3VtZW50cz0iJHt0bXAjKiB9IgorCisgICMgSW5wdXQgbWlnaHQgYmUgZ2l2ZW4gYXMgV2luZG93cyBmb3JtYXQsIHN0YXJ0IGJ5IGNvbnZlcnRpbmcgdG8KKyAgIyB1bml4IGZvcm1hdC4KKyAgbmV3X3BhdGg9YCRDWUdQQVRIIC11ICIkcGF0aCJgCisKKyAgIyBOb3cgdHJ5IHRvIGxvY2F0ZSBleGVjdXRhYmxlIHVzaW5nIHdoaWNoCisgIG5ld19wYXRoPWAkV0hJQ0ggIiRuZXdfcGF0aCIgMj4gL2Rldi9udWxsYAorICBpZiB0ZXN0ICJ4JG5ld19wYXRoIiA9IHg7IHRoZW4KKyAgICAjIE9vcHMuIFdoaWNoIGRpZG4ndCBmaW5kIHRoZSBleGVjdXRhYmxlLgorICAgICMgVGhlIHNwbGl0dGluZyBvZiBhcmd1bWVudHMgZnJvbSB0aGUgZXhlY3V0YWJsZSBhdCBhIHNwYWNlIG1pZ2h0IGhhdmUgYmVlbiBpbmNvcnJlY3QsCisgICAgIyBzaW5jZSBwYXRocyB3aXRoIHNwYWNlIGFyZSBtb3JlIGxpa2VseSBpbiBXaW5kb3dzLiBHaXZlIGl0IGFub3RoZXIgdHJ5IHdpdGggdGhlIHdob2xlCisgICAgIyBhcmd1bWVudC4KKyAgICBwYXRoPSIkY29tcGxldGUiCisgICAgYXJndW1lbnRzPSJFT0wiCisgICAgbmV3X3BhdGg9YCRDWUdQQVRIIC11ICIkcGF0aCJgCisgICAgbmV3X3BhdGg9YCRXSElDSCAiJG5ld19wYXRoIiAyPiAvZGV2L251bGxgCisgICAgaWYgdGVzdCAieCRuZXdfcGF0aCIgPSB4OyB0aGVuCisgICAgICAjIEl0J3Mgc3RpbGwgbm90IGZvdW5kLiBOb3cgdGhpcyBpcyBhbiB1bnJlY292ZXJhYmxlIGVycm9yLgorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUaGUgcGF0aCBvZiBGT1VORF9NQUtFLCB3aGljaCByZXNvbHZlcyBhcyBcIiRjb21wbGV0ZVwiLCBpcyBub3QgZm91bmQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoZSBwYXRoIG9mIEZPVU5EX01BS0UsIHdoaWNoIHJlc29sdmVzIGFzIFwiJGNvbXBsZXRlXCIsIGlzIG5vdCBmb3VuZC4iID4mNjt9CisgICAgICBoYXNfc3BhY2U9YCRFQ0hPICIkY29tcGxldGUiIHwgJEdSRVAgIiAiYAorICAgICAgaWYgdGVzdCAieCRoYXNfc3BhY2UiICE9IHg7IHRoZW4KKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBZb3UgbWlnaHQgYmUgbWl4aW5nIHNwYWNlcyBpbiB0aGUgcGF0aCBhbmQgZXh0cmEgYXJndW1lbnRzLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogWW91IG1pZ2h0IGJlIG1peGluZyBzcGFjZXMgaW4gdGhlIHBhdGggYW5kIGV4dHJhIGFyZ3VtZW50cywgd2hpY2ggaXMgbm90IGFsbG93ZWQuIiA+JjY7fQorICAgICAgZmkKKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJDYW5ub3QgbG9jYXRlIHRoZSB0aGUgcGF0aCBvZiBGT1VORF9NQUtFIiAiJExJTkVOTyIgNQorICAgIGZpCisgIGZpCisKKyAgIyBDeWd3aW4gdHJpZXMgdG8gaGlkZSBzb21lIGFzcGVjdHMgb2YgdGhlIFdpbmRvd3MgZmlsZSBzeXN0ZW0sIHN1Y2ggdGhhdCBiaW5hcmllcyBhcmUKKyAgIyBuYW1lZCAuZXhlIGJ1dCBjYWxsZWQgd2l0aG91dCB0aGF0IHN1ZmZpeC4gVGhlcmVmb3JlLCAiZm9vIiBhbmQgImZvby5leGUiIGFyZSBjb25zaWRlcmVkCisgICMgdGhlIHNhbWUgZmlsZSwgbW9zdCBvZiB0aGUgdGltZSAoYXMgaW4gInRlc3QgLWYiKS4gQnV0IG5vdCB3aGVuIHJ1bm5pbmcgY3lncGF0aCAtcywgdGhlbgorICAjICJmb28uZXhlIiBpcyBPSyBidXQgImZvbyIgaXMgYW4gZXJyb3IuCisgICMKKyAgIyBUaGlzIHRlc3QgaXMgdGhlcmVmb3JlIHNsaWdodGx5IG1vcmUgYWNjdXJhdGUgdGhhbiAidGVzdCAtZiIgdG8gY2hlY2sgZm9yIGZpbGUgcHJlY2Vuc2UuCisgICMgSXQgaXMgYWxzbyBhIHdheSB0byBtYWtlIHN1cmUgd2UgZ290IHRoZSBwcm9wZXIgZmlsZSBuYW1lIGZvciB0aGUgcmVhbCB0ZXN0IGxhdGVyIG9uLgorICB0ZXN0X3Nob3J0cGF0aD1gJENZR1BBVEggLXMgLW0gIiRuZXdfcGF0aCIgMj4gL2Rldi9udWxsYAorICBpZiB0ZXN0ICJ4JHRlc3Rfc2hvcnRwYXRoIiA9IHg7IHRoZW4KKyAgICAjIFNob3J0IHBhdGggZmFpbGVkLCBmaWxlIGRvZXMgbm90IGV4aXN0IGFzIHNwZWNpZmllZC4KKyAgICAjIFRyeSBhZGRpbmcgLmV4ZSBvciAuY21kCisgICAgaWYgdGVzdCAtZiAiJHtuZXdfcGF0aH0uZXhlIjsgdGhlbgorICAgICAgIGlucHV0X3RvX3Nob3J0cGF0aD0iJHtuZXdfcGF0aH0uZXhlIgorICAgIGVsaWYgdGVzdCAtZiAiJHtuZXdfcGF0aH0uY21kIjsgdGhlbgorICAgICAgIGlucHV0X3RvX3Nob3J0cGF0aD0iJHtuZXdfcGF0aH0uY21kIgorICAgIGVsc2UKKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGhlIHBhdGggb2YgRk9VTkRfTUFLRSwgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkbmV3X3BhdGhcIiwgaXMgaW52YWxpZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhlIHBhdGggb2YgRk9VTkRfTUFLRSwgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkbmV3X3BhdGhcIiwgaXMgaW52YWxpZC4iID4mNjt9CisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IE5laXRoZXIgXCIkbmV3X3BhdGhcIiBub3IgXCIkbmV3X3BhdGguZXhlL2NtZFwiIGNhbiBiZSBmb3VuZCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBOZWl0aGVyIFwiJG5ld19wYXRoXCIgbm9yIFwiJG5ld19wYXRoLmV4ZS9jbWRcIiBjYW4gYmUgZm91bmQiID4mNjt9CisgICAgICBhc19mbl9lcnJvciAkPyAiQ2Fubm90IGxvY2F0ZSB0aGUgdGhlIHBhdGggb2YgRk9VTkRfTUFLRSIgIiRMSU5FTk8iIDUKKyAgICBmaQorICBlbHNlCisgICAgaW5wdXRfdG9fc2hvcnRwYXRoPSIkbmV3X3BhdGgiCisgIGZpCisKKyAgIyBDYWxsIGhlbHBlciBmdW5jdGlvbiB3aGljaCBwb3NzaWJseSBjb252ZXJ0cyB0aGlzIHVzaW5nIERPUy1zdHlsZSBzaG9ydCBtb2RlLgorICAjIElmIHNvLCB0aGUgdXBkYXRlZCBwYXRoIGlzIHN0b3JlZCBpbiAkbmV3X3BhdGguCisgIG5ld19wYXRoPSIkaW5wdXRfdG9fc2hvcnRwYXRoIgorCisgIGlucHV0X3BhdGg9IiRpbnB1dF90b19zaG9ydHBhdGgiCisgICMgQ2hlY2sgaWYgd2UgbmVlZCB0byBjb252ZXJ0IHRoaXMgdXNpbmcgRE9TLXN0eWxlIHNob3J0IG1vZGUuIElmIHRoZSBwYXRoCisgICMgY29udGFpbnMganVzdCBzaW1wbGUgY2hhcmFjdGVycywgdXNlIGl0LiBPdGhlcndpc2UgKHNwYWNlcywgd2VpcmQgY2hhcmFjdGVycyksCisgICMgdGFrZSBubyBjaGFuY2VzIGFuZCByZXdyaXRlIGl0LgorICAjIE5vdGU6IG00IGVhdHMgb3VyIFtdLCBzbyB3ZSBuZWVkIHRvIHVzZSBbIGFuZCBdIGluc3RlYWQuCisgIGhhc19mb3JiaWRkZW5fY2hhcnM9YCRFQ0hPICIkaW5wdXRfcGF0aCIgfCAkR1JFUCBbXi0uXy9hLXpBLVowLTldYAorICBpZiB0ZXN0ICJ4JGhhc19mb3JiaWRkZW5fY2hhcnMiICE9IHg7IHRoZW4KKyAgICAjIE5vdyBjb252ZXJ0IGl0IHRvIG1peGVkIERPUy1zdHlsZSwgc2hvcnQgbW9kZSAobm8gc3BhY2VzLCBhbmQgLyBpbnN0ZWFkIG9mIFwpCisgICAgc2hvcnRtb2RlX3BhdGg9YCRDWUdQQVRIIC1zIC1tIC1hICIkaW5wdXRfcGF0aCJgCisgICAgcGF0aF9hZnRlcl9zaG9ydG1vZGU9YCRDWUdQQVRIIC11ICIkc2hvcnRtb2RlX3BhdGgiYAorICAgIGlmIHRlc3QgIngkcGF0aF9hZnRlcl9zaG9ydG1vZGUiICE9ICJ4JGlucHV0X3RvX3Nob3J0cGF0aCI7IHRoZW4KKyAgICAgICMgR29pbmcgdG8gc2hvcnQgbW9kZSBhbmQgYmFjayBhZ2FpbiBkaWQgaW5kZWVkIG1hdHRlci4gU2luY2Ugc2hvcnQgbW9kZSBpcworICAgICAgIyBjYXNlIGluc2Vuc2l0aXZlLCBsZXQncyBtYWtlIGl0IGxvd2VyY2FzZSB0byBpbXByb3ZlIHJlYWRhYmlsaXR5LgorICAgICAgc2hvcnRtb2RlX3BhdGg9YCRFQ0hPICIkc2hvcnRtb2RlX3BhdGgiIHwgJFRSICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J2AKKyAgICAgICMgTm93IGNvbnZlcnQgaXQgYmFjayB0byBVbml4LXN0aWxlIChjeWdwYXRoKQorICAgICAgaW5wdXRfcGF0aD1gJENZR1BBVEggLXUgIiRzaG9ydG1vZGVfcGF0aCJgCisgICAgICBuZXdfcGF0aD0iJGlucHV0X3BhdGgiCisgICAgZmkKKyAgZmkKKworICB0ZXN0X2N5Z2RyaXZlX3ByZWZpeD1gJEVDSE8gJGlucHV0X3BhdGggfCAkR1JFUCBeL2N5Z2RyaXZlL2AKKyAgaWYgdGVzdCAieCR0ZXN0X2N5Z2RyaXZlX3ByZWZpeCIgPSB4OyB0aGVuCisgICAgIyBBcyBhIHNpbXBsZSBmaXgsIGV4Y2x1ZGUgL3Vzci9iaW4gc2luY2UgaXQncyBub3QgYSByZWFsIHBhdGguCisgICAgaWYgdGVzdCAieGAkRUNITyAkaW5wdXRfdG9fc2hvcnRwYXRoIHwgJEdSRVAgXi91c3IvYmluL2AiID0geDsgdGhlbgorICAgICAgIyBUaGUgcGF0aCBpcyBpbiBhIEN5Z3dpbiBzcGVjaWFsIGRpcmVjdG9yeSAoZS5nLiAvaG9tZSkuIFdlIG5lZWQgdGhpcyBjb252ZXJ0ZWQgdG8KKyAgICAgICMgYSBwYXRoIHByZWZpeGVkIGJ5IC9jeWdkcml2ZSBmb3IgZml4cGF0aCB0byB3b3JrLgorICAgICAgbmV3X3BhdGg9IiRDWUdXSU5fUk9PVF9QQVRIJGlucHV0X3BhdGgiCisgICAgZmkKKyAgZmkKKworICAjIHJlbW92ZSB0cmFpbGluZyAuZXhlIGlmIGFueQorICBuZXdfcGF0aD0iJHtuZXdfcGF0aC8lLmV4ZS99IgorCisgIGVsaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MubXN5cyI7IHRoZW4KKworICAjIEZpcnN0IHNlcGFyYXRlIHRoZSBwYXRoIGZyb20gdGhlIGFyZ3VtZW50cy4gVGhpcyB3aWxsIHNwbGl0IGF0IHRoZSBmaXJzdAorICAjIHNwYWNlLgorICBjb21wbGV0ZT0iJEZPVU5EX01BS0UiCisgIHBhdGg9IiR7Y29tcGxldGUlJSAqfSIKKyAgdG1wPSIkY29tcGxldGUgRU9MIgorICBhcmd1bWVudHM9IiR7dG1wIyogfSIKKworICAjIElucHV0IG1pZ2h0IGJlIGdpdmVuIGFzIFdpbmRvd3MgZm9ybWF0LCBzdGFydCBieSBjb252ZXJ0aW5nIHRvCisgICMgdW5peCBmb3JtYXQuCisgIG5ld19wYXRoPSIkcGF0aCIKKworICB3aW5kb3dzX3BhdGg9IiRuZXdfcGF0aCIKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJENZR1BBVEggLXUgIiR3aW5kb3dzX3BhdGgiYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBlbGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLm1zeXMiOyB0aGVuCisgICAgdW5peF9wYXRoPWAkRUNITyAiJHdpbmRvd3NfcGF0aCIgfCAkU0VEIC1lICdzLF5cXCguXFwpOiwvXFwxLGcnIC1lICdzLFxcXFwsLyxnJ2AKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZmkKKworCisgICMgTm93IHRyeSB0byBsb2NhdGUgZXhlY3V0YWJsZSB1c2luZyB3aGljaAorICBuZXdfcGF0aD1gJFdISUNIICIkbmV3X3BhdGgiIDI+IC9kZXYvbnVsbGAKKworICBpZiB0ZXN0ICJ4JG5ld19wYXRoIiA9IHg7IHRoZW4KKyAgICAjIE9vcHMuIFdoaWNoIGRpZG4ndCBmaW5kIHRoZSBleGVjdXRhYmxlLgorICAgICMgVGhlIHNwbGl0dGluZyBvZiBhcmd1bWVudHMgZnJvbSB0aGUgZXhlY3V0YWJsZSBhdCBhIHNwYWNlIG1pZ2h0IGhhdmUgYmVlbiBpbmNvcnJlY3QsCisgICAgIyBzaW5jZSBwYXRocyB3aXRoIHNwYWNlIGFyZSBtb3JlIGxpa2VseSBpbiBXaW5kb3dzLiBHaXZlIGl0IGFub3RoZXIgdHJ5IHdpdGggdGhlIHdob2xlCisgICAgIyBhcmd1bWVudC4KKyAgICBwYXRoPSIkY29tcGxldGUiCisgICAgYXJndW1lbnRzPSJFT0wiCisgICAgbmV3X3BhdGg9IiRwYXRoIgorCisgIHdpbmRvd3NfcGF0aD0iJG5ld19wYXRoIgorICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5jeWd3aW4iOyB0aGVuCisgICAgdW5peF9wYXRoPWAkQ1lHUEFUSCAtdSAiJHdpbmRvd3NfcGF0aCJgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGVsaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MubXN5cyI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRFQ0hPICIkd2luZG93c19wYXRoIiB8ICRTRUQgLWUgJ3MsXlxcKC5cXCk6LC9cXDEsZycgLWUgJ3MsXFxcXCwvLGcnYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBmaQorCisKKyAgICBuZXdfcGF0aD1gJFdISUNIICIkbmV3X3BhdGgiIDI+IC9kZXYvbnVsbGAKKworICAgIGlmIHRlc3QgIngkbmV3X3BhdGgiID0geDsgdGhlbgorICAgICAgIyBJdCdzIHN0aWxsIG5vdCBmb3VuZC4gTm93IHRoaXMgaXMgYW4gdW5yZWNvdmVyYWJsZSBlcnJvci4KKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGhlIHBhdGggb2YgRk9VTkRfTUFLRSwgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkY29tcGxldGVcIiwgaXMgbm90IGZvdW5kLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUaGUgcGF0aCBvZiBGT1VORF9NQUtFLCB3aGljaCByZXNvbHZlcyBhcyBcIiRjb21wbGV0ZVwiLCBpcyBub3QgZm91bmQuIiA+JjY7fQorICAgICAgaGFzX3NwYWNlPWAkRUNITyAiJGNvbXBsZXRlIiB8ICRHUkVQICIgImAKKyAgICAgIGlmIHRlc3QgIngkaGFzX3NwYWNlIiAhPSB4OyB0aGVuCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogWW91IG1pZ2h0IGJlIG1peGluZyBzcGFjZXMgaW4gdGhlIHBhdGggYW5kIGV4dHJhIGFyZ3VtZW50cywgd2hpY2ggaXMgbm90IGFsbG93ZWQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFlvdSBtaWdodCBiZSBtaXhpbmcgc3BhY2VzIGluIHRoZSBwYXRoIGFuZCBleHRyYSBhcmd1bWVudHMsIHdoaWNoIGlzIG5vdCBhbGxvd2VkLiIgPiY2O30KKyAgICAgIGZpCisgICAgICBhc19mbl9lcnJvciAkPyAiQ2Fubm90IGxvY2F0ZSB0aGUgdGhlIHBhdGggb2YgRk9VTkRfTUFLRSIgIiRMSU5FTk8iIDUKKyAgICBmaQorICBmaQorCisgICMgTm93IG5ld19wYXRoIGhhcyBhIGNvbXBsZXRlIHVuaXggcGF0aCB0byB0aGUgYmluYXJ5CisgIGlmIHRlc3QgInhgJEVDSE8gJG5ld19wYXRoIHwgJEdSRVAgXi9iaW4vYCIgIT0geDsgdGhlbgorICAgICMgS2VlcCBwYXRocyBpbiAvYmluIGFzLWlzLCBidXQgcmVtb3ZlIHRyYWlsaW5nIC5leGUgaWYgYW55CisgICAgbmV3X3BhdGg9IiR7bmV3X3BhdGgvJS5leGUvfSIKKyAgICAjIERvIG5vdCBzYXZlIC9iaW4gcGF0aHMgdG8gYWxsX2ZpeHBhdGhfcHJlZml4ZXMhCisgIGVsc2UKKyAgICAjIE5vdCBpbiBtaXhlZCBvciBXaW5kb3dzIHN0eWxlLCBzdGFydCBieSB0aGF0LgorICAgIG5ld19wYXRoPWBjbWQgLy9jIGVjaG8gJG5ld19wYXRoYAorCisgIGlucHV0X3BhdGg9IiRuZXdfcGF0aCIKKyAgIyBDaGVjayBpZiB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhpcyB1c2luZyBET1Mtc3R5bGUgc2hvcnQgbW9kZS4gSWYgdGhlIHBhdGgKKyAgIyBjb250YWlucyBqdXN0IHNpbXBsZSBjaGFyYWN0ZXJzLCB1c2UgaXQuIE90aGVyd2lzZSAoc3BhY2VzLCB3ZWlyZCBjaGFyYWN0ZXJzKSwKKyAgIyB0YWtlIG5vIGNoYW5jZXMgYW5kIHJld3JpdGUgaXQuCisgICMgTm90ZTogbTQgZWF0cyBvdXIgW10sIHNvIHdlIG5lZWQgdG8gdXNlIFsgYW5kIF0gaW5zdGVhZC4KKyAgaGFzX2ZvcmJpZGRlbl9jaGFycz1gJEVDSE8gIiRpbnB1dF9wYXRoIiB8ICRHUkVQIFteLV8vOmEtekEtWjAtOV1gCisgIGlmIHRlc3QgIngkaGFzX2ZvcmJpZGRlbl9jaGFycyIgIT0geDsgdGhlbgorICAgICMgTm93IGNvbnZlcnQgaXQgdG8gbWl4ZWQgRE9TLXN0eWxlLCBzaG9ydCBtb2RlIChubyBzcGFjZXMsIGFuZCAvIGluc3RlYWQgb2YgXCkKKyAgICBuZXdfcGF0aD1gY21kIC9jICJmb3IgJUEgaW4gKFwiJGlucHV0X3BhdGhcIikgZG8gQGVjaG8gJX5zQSJ8JFRSIFxcXFxcXFxcIC8gfCAkVFIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAorICBmaQorCisgICAgIyBPdXRwdXQgaXMgaW4gJG5ld19wYXRoCisKKyAgd2luZG93c19wYXRoPSIkbmV3X3BhdGgiCisgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLmN5Z3dpbiI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRDWUdQQVRIIC11ICIkd2luZG93c19wYXRoImAKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJEVDSE8gIiR3aW5kb3dzX3BhdGgiIHwgJFNFRCAtZSAncyxeXFwoLlxcKTosL1xcMSxnJyAtZSAncyxcXFxcLC8sZydgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGZpCisKKyAgICAjIHJlbW92ZSB0cmFpbGluZyAuZXhlIGlmIGFueQorICAgIG5ld19wYXRoPSIke25ld19wYXRoLyUuZXhlL30iCisKKyAgICAjIFNhdmUgdGhlIGZpcnN0IDEwIGJ5dGVzIG9mIHRoaXMgcGF0aCB0byB0aGUgc3RvcmFnZSwgc28gZml4cGF0aCBjYW4gd29yay4KKyAgICBhbGxfZml4cGF0aF9wcmVmaXhlcz0oIiR7YWxsX2ZpeHBhdGhfcHJlZml4ZXNbQF19IiAiJHtuZXdfcGF0aDowOjEwfSIpCisgIGZpCisKKyAgZWxzZQorICAgICMgV2UncmUgb24gYSBwb3NpeCBwbGF0Zm9ybS4gSG9vcmF5ISA6KQorICAgICMgRmlyc3Qgc2VwYXJhdGUgdGhlIHBhdGggZnJvbSB0aGUgYXJndW1lbnRzLiBUaGlzIHdpbGwgc3BsaXQgYXQgdGhlIGZpcnN0CisgICAgIyBzcGFjZS4KKyAgICBjb21wbGV0ZT0iJEZPVU5EX01BS0UiCisgICAgcGF0aD0iJHtjb21wbGV0ZSUlICp9IgorICAgIHRtcD0iJGNvbXBsZXRlIEVPTCIKKyAgICBhcmd1bWVudHM9IiR7dG1wIyogfSIKKworICAgIG5ld19wYXRoPWAkV0hJQ0ggJHBhdGggMj4gL2Rldi9udWxsYAorICAgIGlmIHRlc3QgIngkbmV3X3BhdGgiID0geDsgdGhlbgorICAgICAgaXNfYWJzb2x1dGVfcGF0aD1gJEVDSE8gIiRwYXRoIiB8ICRHUkVQIF4vYAorICAgICAgaWYgdGVzdCAieCRpc19hYnNvbHV0ZV9wYXRoIiAhPSB4OyB0aGVuCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogUmVzb2x2aW5nIEZPVU5EX01BS0UgKGFzICRwYXRoKSB3aXRoICd3aGljaCcgZmFpbGVkLCB1c2luZyAkcGF0aCBkaXJlY3RseS4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogUmVzb2x2aW5nIEZPVU5EX01BS0UgKGFzICRwYXRoKSB3aXRoICd3aGljaCcgZmFpbGVkLCB1c2luZyAkcGF0aCBkaXJlY3RseS4iID4mNjt9CisgICAgICAgIG5ld19wYXRoPSIkcGF0aCIKKyAgICAgIGVsc2UKKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUaGUgcGF0aCBvZiBGT1VORF9NQUtFLCB3aGljaCByZXNvbHZlcyBhcyBcIiRjb21wbGV0ZVwiLCBpcyBub3QgZm91bmQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoZSBwYXRoIG9mIEZPVU5EX01BS0UsIHdoaWNoIHJlc29sdmVzIGFzIFwiJGNvbXBsZXRlXCIsIGlzIG5vdCBmb3VuZC4iID4mNjt9CisgICAgICAgIGhhc19zcGFjZT1gJEVDSE8gIiRjb21wbGV0ZSIgfCAkR1JFUCAiICJgCisgICAgICAgIGlmIHRlc3QgIngkaGFzX3NwYWNlIiAhPSB4OyB0aGVuCisgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUaGlzIG1pZ2h0IGJlIGNhdXNlZCBieSBzcGFjZXMgaW4gdGhlIHBhdGgsIHdoaWNoIGlzIG5vdCBhbGxvd2VkLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUaGlzIG1pZ2h0IGJlIGNhdXNlZCBieSBzcGFjZXMgaW4gdGhlIHBhdGgsIHdoaWNoIGlzIG5vdCBhbGxvd2VkLiIgPiY2O30KKyAgICAgICAgZmkKKyAgICAgICAgYXNfZm5fZXJyb3IgJD8gIkNhbm5vdCBsb2NhdGUgdGhlIHRoZSBwYXRoIG9mIEZPVU5EX01BS0UiICIkTElORU5PIiA1CisgICAgICBmaQorICAgIGZpCisgIGZpCisKKyAgIyBOb3cgam9pbiB0b2dldGhlciB0aGUgcGF0aCBhbmQgdGhlIGFyZ3VtZW50cyBvbmNlIGFnYWluCisgIGlmIHRlc3QgIngkYXJndW1lbnRzIiAhPSB4RU9MOyB0aGVuCisgICAgICBuZXdfY29tcGxldGU9IiRuZXdfcGF0aCAke2FyZ3VtZW50cyUgKn0iCisgIGVsc2UKKyAgICAgIG5ld19jb21wbGV0ZT0iJG5ld19wYXRoIgorICBmaQorCisgIGlmIHRlc3QgIngkY29tcGxldGUiICE9ICJ4JG5ld19jb21wbGV0ZSI7IHRoZW4KKyAgICBGT1VORF9NQUtFPSIkbmV3X2NvbXBsZXRlIgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogUmV3cml0aW5nIEZPVU5EX01BS0UgdG8gXCIkbmV3X2NvbXBsZXRlXCIiID4mNQorJGFzX2VjaG8gIiRhc19tZTogUmV3cml0aW5nIEZPVU5EX01BS0UgdG8gXCIkbmV3X2NvbXBsZXRlXCIiID4mNjt9CisgIGZpCisKKyAgICAgICAgZmkKKyAgICAgIGZpCisgICAgZmkKKyAgZmkKKworICAgIGZpCisKKyAgICBpZiB0ZXN0ICJ4JEZPVU5EX01BS0UiID0geDsgdGhlbgorICAgICAgaWYgdGVzdCAieCRUT09MU19ESVIiICE9IHg7IHRoZW4KKyAgICAgICAgIyBXZSBoYXZlIGEgdG9vbHMtZGlyLCBjaGVjayB0aGF0IGFzIHdlbGwgYmVmb3JlIGdpdmluZyB1cC4KKyAgICAgICAgT0xEX1BBVEg9JFBBVEgKKyAgICAgICAgUEFUSD0kVE9PTFNfRElSOiRQQVRICisgICAgICAgIGZvciBhY19wcm9nIGluIGdtYWtlCitkbworICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3BhdGhfQ0hFQ0tfVE9PTFNESVJfR01BS0Urc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXNlICRDSEVDS19UT09MU0RJUl9HTUFLRSBpbgorICBbXFwvXSogfCA/OltcXC9dKikKKyAgYWNfY3ZfcGF0aF9DSEVDS19UT09MU0RJUl9HTUFLRT0iJENIRUNLX1RPT0xTRElSX0dNQUtFIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcGF0aF9DSEVDS19UT09MU0RJUl9HTUFLRT0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworICA7OworZXNhYworZmkKK0NIRUNLX1RPT0xTRElSX0dNQUtFPSRhY19jdl9wYXRoX0NIRUNLX1RPT0xTRElSX0dNQUtFCitpZiB0ZXN0IC1uICIkQ0hFQ0tfVE9PTFNESVJfR01BS0UiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQ0hFQ0tfVE9PTFNESVJfR01BS0UiID4mNQorJGFzX2VjaG8gIiRDSEVDS19UT09MU0RJUl9HTUFLRSIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCisgIHRlc3QgLW4gIiRDSEVDS19UT09MU0RJUl9HTUFLRSIgJiYgYnJlYWsKK2RvbmUKKworCisgIE1BS0VfQ0FORElEQVRFPSIiJENIRUNLX1RPT0xTRElSX0dNQUtFIiIKKyAgREVTQ1JJUFRJT049ImdtYWtlIGluIHRvb2xzLWRpciIKKyAgaWYgdGVzdCAieCRNQUtFX0NBTkRJREFURSIgIT0geDsgdGhlbgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGVzdGluZyBwb3RlbnRpYWwgbWFrZSBhdCAkTUFLRV9DQU5ESURBVEUsIGZvdW5kIHVzaW5nICRERVNDUklQVElPTiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUZXN0aW5nIHBvdGVudGlhbCBtYWtlIGF0ICRNQUtFX0NBTkRJREFURSwgZm91bmQgdXNpbmcgJERFU0NSSVBUSU9OIiA+JjY7fQorICAgIE1BS0VfVkVSU0lPTl9TVFJJTkc9YCRNQUtFX0NBTkRJREFURSAtLXZlcnNpb24gfCAkSEVBRCAtbiAxYAorICAgIElTX0dOVV9NQUtFPWAkRUNITyAkTUFLRV9WRVJTSU9OX1NUUklORyB8ICRHUkVQICdHTlUgTWFrZSdgCisgICAgaWYgdGVzdCAieCRJU19HTlVfTUFLRSIgPSB4OyB0aGVuCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IEZvdW5kIHBvdGVudGlhbCBtYWtlIGF0ICRNQUtFX0NBTkRJREFURSwgaG93ZXZlciwgdGhpcyBpcyBub3QgR05VIE1ha2UuIElnbm9yaW5nLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBGb3VuZCBwb3RlbnRpYWwgbWFrZSBhdCAkTUFLRV9DQU5ESURBVEUsIGhvd2V2ZXIsIHRoaXMgaXMgbm90IEdOVSBNYWtlLiBJZ25vcmluZy4iID4mNjt9CisgICAgZWxzZQorICAgICAgSVNfTU9ERVJOX01BS0U9YCRFQ0hPICRNQUtFX1ZFUlNJT05fU1RSSU5HIHwgJEdSRVAgJzMuOFsxMjM0Njc4OV0nYAorICAgICAgaWYgdGVzdCAieCRJU19NT0RFUk5fTUFLRSIgPSB4OyB0aGVuCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogRm91bmQgR05VIG1ha2UgYXQgJE1BS0VfQ0FORElEQVRFLCBob3dldmVyIHRoaXMgaXMgbm90IHZlcnNpb24gMy44MSBvciBsYXRlci4gKGl0IGlzOiAkTUFLRV9WRVJTSU9OX1NUUklORykuIElnbm9yaW5nLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBGb3VuZCBHTlUgbWFrZSBhdCAkTUFLRV9DQU5ESURBVEUsIGhvd2V2ZXIgdGhpcyBpcyBub3QgdmVyc2lvbiAzLjgxIG9yIGxhdGVyLiAoaXQgaXM6ICRNQUtFX1ZFUlNJT05fU1RSSU5HKS4gSWdub3JpbmcuIiA+JjY7fQorICAgICAgZWxzZQorICAgICAgICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1MiID0gInh3aW5kb3dzIjsgdGhlbgorICAgICAgICAgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLmN5Z3dpbiI7IHRoZW4KKyAgICAgICAgICAgIE1BS0VfRVhQRUNURURfRU5WPSdjeWd3aW4nCisgICAgICAgICAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorICAgICAgICAgICAgTUFLRV9FWFBFQ1RFRF9FTlY9J21zeXMnCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgYXNfZm5fZXJyb3IgJD8gIlVua25vd24gV2luZG93cyBlbnZpcm9ubWVudCIgIiRMSU5FTk8iIDUKKyAgICAgICAgICBmaQorICAgICAgICAgIE1BS0VfQlVJTFRfRk9SPWAkTUFLRV9DQU5ESURBVEUgLS12ZXJzaW9uIHwgJEdSRVAgLWkgJ2J1aWx0IGZvcidgCisgICAgICAgICAgSVNfTUFLRV9DT1JSRUNUX0VOVj1gJEVDSE8gJE1BS0VfQlVJTFRfRk9SIHwgJEdSRVAgJE1BS0VfRVhQRUNURURfRU5WYAorICAgICAgICBlbHNlCisgICAgICAgICAgIyBOb3QgcmVsZXZhbnQgZm9yIG5vbi1XaW5kb3dzCisgICAgICAgICAgSVNfTUFLRV9DT1JSRUNUX0VOVj10cnVlCisgICAgICAgIGZpCisgICAgICAgIGlmIHRlc3QgIngkSVNfTUFLRV9DT1JSRUNUX0VOViIgPSB4OyB0aGVuCisgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBGb3VuZCBHTlUgbWFrZSB2ZXJzaW9uICRNQUtFX1ZFUlNJT05fU1RSSU5HIGF0ICRNQUtFX0NBTkRJREFURSwgYnV0IGl0IGlzIG5vdCBmb3IgJE1BS0VfRVhQRUNURURfRU5WIChpdCBzYXlzOiAkTUFLRV9CVUlMVF9GT1IpLiBJZ25vcmluZy4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogRm91bmQgR05VIG1ha2UgdmVyc2lvbiAkTUFLRV9WRVJTSU9OX1NUUklORyBhdCAkTUFLRV9DQU5ESURBVEUsIGJ1dCBpdCBpcyBub3QgZm9yICRNQUtFX0VYUEVDVEVEX0VOViAoaXQgc2F5czogJE1BS0VfQlVJTFRfRk9SKS4gSWdub3JpbmcuIiA+JjY7fQorICAgICAgICBlbHNlCisgICAgICAgICAgRk9VTkRfTUFLRT0kTUFLRV9DQU5ESURBVEUKKworICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5jeWd3aW4iOyB0aGVuCisKKyAgIyBGaXJzdCBzZXBhcmF0ZSB0aGUgcGF0aCBmcm9tIHRoZSBhcmd1bWVudHMuIFRoaXMgd2lsbCBzcGxpdCBhdCB0aGUgZmlyc3QKKyAgIyBzcGFjZS4KKyAgY29tcGxldGU9IiRGT1VORF9NQUtFIgorICBwYXRoPSIke2NvbXBsZXRlJSUgKn0iCisgIHRtcD0iJGNvbXBsZXRlIEVPTCIKKyAgYXJndW1lbnRzPSIke3RtcCMqIH0iCisKKyAgIyBJbnB1dCBtaWdodCBiZSBnaXZlbiBhcyBXaW5kb3dzIGZvcm1hdCwgc3RhcnQgYnkgY29udmVydGluZyB0bworICAjIHVuaXggZm9ybWF0LgorICBuZXdfcGF0aD1gJENZR1BBVEggLXUgIiRwYXRoImAKKworICAjIE5vdyB0cnkgdG8gbG9jYXRlIGV4ZWN1dGFibGUgdXNpbmcgd2hpY2gKKyAgbmV3X3BhdGg9YCRXSElDSCAiJG5ld19wYXRoIiAyPiAvZGV2L251bGxgCisgIGlmIHRlc3QgIngkbmV3X3BhdGgiID0geDsgdGhlbgorICAgICMgT29wcy4gV2hpY2ggZGlkbid0IGZpbmQgdGhlIGV4ZWN1dGFibGUuCisgICAgIyBUaGUgc3BsaXR0aW5nIG9mIGFyZ3VtZW50cyBmcm9tIHRoZSBleGVjdXRhYmxlIGF0IGEgc3BhY2UgbWlnaHQgaGF2ZSBiZWVuIGluY29ycmVjdCwKKyAgICAjIHNpbmNlIHBhdGhzIHdpdGggc3BhY2UgYXJlIG1vcmUgbGlrZWx5IGluIFdpbmRvd3MuIEdpdmUgaXQgYW5vdGhlciB0cnkgd2l0aCB0aGUgd2hvbGUKKyAgICAjIGFyZ3VtZW50LgorICAgIHBhdGg9IiRjb21wbGV0ZSIKKyAgICBhcmd1bWVudHM9IkVPTCIKKyAgICBuZXdfcGF0aD1gJENZR1BBVEggLXUgIiRwYXRoImAKKyAgICBuZXdfcGF0aD1gJFdISUNIICIkbmV3X3BhdGgiIDI+IC9kZXYvbnVsbGAKKyAgICBpZiB0ZXN0ICJ4JG5ld19wYXRoIiA9IHg7IHRoZW4KKyAgICAgICMgSXQncyBzdGlsbCBub3QgZm91bmQuIE5vdyB0aGlzIGlzIGFuIHVucmVjb3ZlcmFibGUgZXJyb3IuCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSBwYXRoIG9mIEZPVU5EX01BS0UsIHdoaWNoIHJlc29sdmVzIGFzIFwiJGNvbXBsZXRlXCIsIGlzIG5vdCBmb3VuZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhlIHBhdGggb2YgRk9VTkRfTUFLRSwgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkY29tcGxldGVcIiwgaXMgbm90IGZvdW5kLiIgPiY2O30KKyAgICAgIGhhc19zcGFjZT1gJEVDSE8gIiRjb21wbGV0ZSIgfCAkR1JFUCAiICJgCisgICAgICBpZiB0ZXN0ICJ4JGhhc19zcGFjZSIgIT0geDsgdGhlbgorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFlvdSBtaWdodCBiZSBtaXhpbmcgc3BhY2VzIGluIHRoZSBwYXRoIGFuZCBleHRyYSBhcmd1bWVudHMsIHdoaWNoIGlzIG5vdCBhbGxvd2VkLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBZb3UgbWlnaHQgYmUgbWl4aW5nIHNwYWNlcyBpbiB0aGUgcGF0aCBhbmQgZXh0cmEgYXJndW1lbnRzLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iID4mNjt9CisgICAgICBmaQorICAgICAgYXNfZm5fZXJyb3IgJD8gIkNhbm5vdCBsb2NhdGUgdGhlIHRoZSBwYXRoIG9mIEZPVU5EX01BS0UiICIkTElORU5PIiA1CisgICAgZmkKKyAgZmkKKworICAjIEN5Z3dpbiB0cmllcyB0byBoaWRlIHNvbWUgYXNwZWN0cyBvZiB0aGUgV2luZG93cyBmaWxlIHN5c3RlbSwgc3VjaCB0aGF0IGJpbmFyaWVzIGFyZQorICAjIG5hbWVkIC5leGUgYnV0IGNhbGxlZCB3aXRob3V0IHRoYXQgc3VmZml4LiBUaGVyZWZvcmUsICJmb28iIGFuZCAiZm9vLmV4ZSIgYXJlIGNvbnNpZGVyZWQKKyAgIyB0aGUgc2FtZSBmaWxlLCBtb3N0IG9mIHRoZSB0aW1lIChhcyBpbiAidGVzdCAtZiIpLiBCdXQgbm90IHdoZW4gcnVubmluZyBjeWdwYXRoIC1zLCB0aGVuCisgICMgImZvby5leGUiIGlzIE9LIGJ1dCAiZm9vIiBpcyBhbiBlcnJvci4KKyAgIworICAjIFRoaXMgdGVzdCBpcyB0aGVyZWZvcmUgc2xpZ2h0bHkgbW9yZSBhY2N1cmF0ZSB0aGFuICJ0ZXN0IC1mIiB0byBjaGVjayBmb3IgZmlsZSBwcmVjZW5zZS4KKyAgIyBJdCBpcyBhbHNvIGEgd2F5IHRvIG1ha2Ugc3VyZSB3ZSBnb3QgdGhlIHByb3BlciBmaWxlIG5hbWUgZm9yIHRoZSByZWFsIHRlc3QgbGF0ZXIgb24uCisgIHRlc3Rfc2hvcnRwYXRoPWAkQ1lHUEFUSCAtcyAtbSAiJG5ld19wYXRoIiAyPiAvZGV2L251bGxgCisgIGlmIHRlc3QgIngkdGVzdF9zaG9ydHBhdGgiID0geDsgdGhlbgorICAgICMgU2hvcnQgcGF0aCBmYWlsZWQsIGZpbGUgZG9lcyBub3QgZXhpc3QgYXMgc3BlY2lmaWVkLgorICAgICMgVHJ5IGFkZGluZyAuZXhlIG9yIC5jbWQKKyAgICBpZiB0ZXN0IC1mICIke25ld19wYXRofS5leGUiOyB0aGVuCisgICAgICAgaW5wdXRfdG9fc2hvcnRwYXRoPSIke25ld19wYXRofS5leGUiCisgICAgZWxpZiB0ZXN0IC1mICIke25ld19wYXRofS5jbWQiOyB0aGVuCisgICAgICAgaW5wdXRfdG9fc2hvcnRwYXRoPSIke25ld19wYXRofS5jbWQiCisgICAgZWxzZQorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUaGUgcGF0aCBvZiBGT1VORF9NQUtFLCB3aGljaCByZXNvbHZlcyBhcyBcIiRuZXdfcGF0aFwiLCBpcyBpbnZhbGlkLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUaGUgcGF0aCBvZiBGT1VORF9NQUtFLCB3aGljaCByZXNvbHZlcyBhcyBcIiRuZXdfcGF0aFwiLCBpcyBpbnZhbGlkLiIgPiY2O30KKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogTmVpdGhlciBcIiRuZXdfcGF0aFwiIG5vciBcIiRuZXdfcGF0aC5leGUvY21kXCIgY2FuIGJlIGZvdW5kIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IE5laXRoZXIgXCIkbmV3X3BhdGhcIiBub3IgXCIkbmV3X3BhdGguZXhlL2NtZFwiIGNhbiBiZSBmb3VuZCIgPiY2O30KKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJDYW5ub3QgbG9jYXRlIHRoZSB0aGUgcGF0aCBvZiBGT1VORF9NQUtFIiAiJExJTkVOTyIgNQorICAgIGZpCisgIGVsc2UKKyAgICBpbnB1dF90b19zaG9ydHBhdGg9IiRuZXdfcGF0aCIKKyAgZmkKKworICAjIENhbGwgaGVscGVyIGZ1bmN0aW9uIHdoaWNoIHBvc3NpYmx5IGNvbnZlcnRzIHRoaXMgdXNpbmcgRE9TLXN0eWxlIHNob3J0IG1vZGUuCisgICMgSWYgc28sIHRoZSB1cGRhdGVkIHBhdGggaXMgc3RvcmVkIGluICRuZXdfcGF0aC4KKyAgbmV3X3BhdGg9IiRpbnB1dF90b19zaG9ydHBhdGgiCisKKyAgaW5wdXRfcGF0aD0iJGlucHV0X3RvX3Nob3J0cGF0aCIKKyAgIyBDaGVjayBpZiB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhpcyB1c2luZyBET1Mtc3R5bGUgc2hvcnQgbW9kZS4gSWYgdGhlIHBhdGgKKyAgIyBjb250YWlucyBqdXN0IHNpbXBsZSBjaGFyYWN0ZXJzLCB1c2UgaXQuIE90aGVyd2lzZSAoc3BhY2VzLCB3ZWlyZCBjaGFyYWN0ZXJzKSwKKyAgIyB0YWtlIG5vIGNoYW5jZXMgYW5kIHJld3JpdGUgaXQuCisgICMgTm90ZTogbTQgZWF0cyBvdXIgW10sIHNvIHdlIG5lZWQgdG8gdXNlIFsgYW5kIF0gaW5zdGVhZC4KKyAgaGFzX2ZvcmJpZGRlbl9jaGFycz1gJEVDSE8gIiRpbnB1dF9wYXRoIiB8ICRHUkVQIFteLS5fL2EtekEtWjAtOV1gCisgIGlmIHRlc3QgIngkaGFzX2ZvcmJpZGRlbl9jaGFycyIgIT0geDsgdGhlbgorICAgICMgTm93IGNvbnZlcnQgaXQgdG8gbWl4ZWQgRE9TLXN0eWxlLCBzaG9ydCBtb2RlIChubyBzcGFjZXMsIGFuZCAvIGluc3RlYWQgb2YgXCkKKyAgICBzaG9ydG1vZGVfcGF0aD1gJENZR1BBVEggLXMgLW0gLWEgIiRpbnB1dF9wYXRoImAKKyAgICBwYXRoX2FmdGVyX3Nob3J0bW9kZT1gJENZR1BBVEggLXUgIiRzaG9ydG1vZGVfcGF0aCJgCisgICAgaWYgdGVzdCAieCRwYXRoX2FmdGVyX3Nob3J0bW9kZSIgIT0gIngkaW5wdXRfdG9fc2hvcnRwYXRoIjsgdGhlbgorICAgICAgIyBHb2luZyB0byBzaG9ydCBtb2RlIGFuZCBiYWNrIGFnYWluIGRpZCBpbmRlZWQgbWF0dGVyLiBTaW5jZSBzaG9ydCBtb2RlIGlzCisgICAgICAjIGNhc2UgaW5zZW5zaXRpdmUsIGxldCdzIG1ha2UgaXQgbG93ZXJjYXNlIHRvIGltcHJvdmUgcmVhZGFiaWxpdHkuCisgICAgICBzaG9ydG1vZGVfcGF0aD1gJEVDSE8gIiRzaG9ydG1vZGVfcGF0aCIgfCAkVFIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAorICAgICAgIyBOb3cgY29udmVydCBpdCBiYWNrIHRvIFVuaXgtc3RpbGUgKGN5Z3BhdGgpCisgICAgICBpbnB1dF9wYXRoPWAkQ1lHUEFUSCAtdSAiJHNob3J0bW9kZV9wYXRoImAKKyAgICAgIG5ld19wYXRoPSIkaW5wdXRfcGF0aCIKKyAgICBmaQorICBmaQorCisgIHRlc3RfY3lnZHJpdmVfcHJlZml4PWAkRUNITyAkaW5wdXRfcGF0aCB8ICRHUkVQIF4vY3lnZHJpdmUvYAorICBpZiB0ZXN0ICJ4JHRlc3RfY3lnZHJpdmVfcHJlZml4IiA9IHg7IHRoZW4KKyAgICAjIEFzIGEgc2ltcGxlIGZpeCwgZXhjbHVkZSAvdXNyL2JpbiBzaW5jZSBpdCdzIG5vdCBhIHJlYWwgcGF0aC4KKyAgICBpZiB0ZXN0ICJ4YCRFQ0hPICRpbnB1dF90b19zaG9ydHBhdGggfCAkR1JFUCBeL3Vzci9iaW4vYCIgPSB4OyB0aGVuCisgICAgICAjIFRoZSBwYXRoIGlzIGluIGEgQ3lnd2luIHNwZWNpYWwgZGlyZWN0b3J5IChlLmcuIC9ob21lKS4gV2UgbmVlZCB0aGlzIGNvbnZlcnRlZCB0bworICAgICAgIyBhIHBhdGggcHJlZml4ZWQgYnkgL2N5Z2RyaXZlIGZvciBmaXhwYXRoIHRvIHdvcmsuCisgICAgICBuZXdfcGF0aD0iJENZR1dJTl9ST09UX1BBVEgkaW5wdXRfcGF0aCIKKyAgICBmaQorICBmaQorCisgICMgcmVtb3ZlIHRyYWlsaW5nIC5leGUgaWYgYW55CisgIG5ld19wYXRoPSIke25ld19wYXRoLyUuZXhlL30iCisKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorCisgICMgRmlyc3Qgc2VwYXJhdGUgdGhlIHBhdGggZnJvbSB0aGUgYXJndW1lbnRzLiBUaGlzIHdpbGwgc3BsaXQgYXQgdGhlIGZpcnN0CisgICMgc3BhY2UuCisgIGNvbXBsZXRlPSIkRk9VTkRfTUFLRSIKKyAgcGF0aD0iJHtjb21wbGV0ZSUlICp9IgorICB0bXA9IiRjb21wbGV0ZSBFT0wiCisgIGFyZ3VtZW50cz0iJHt0bXAjKiB9IgorCisgICMgSW5wdXQgbWlnaHQgYmUgZ2l2ZW4gYXMgV2luZG93cyBmb3JtYXQsIHN0YXJ0IGJ5IGNvbnZlcnRpbmcgdG8KKyAgIyB1bml4IGZvcm1hdC4KKyAgbmV3X3BhdGg9IiRwYXRoIgorCisgIHdpbmRvd3NfcGF0aD0iJG5ld19wYXRoIgorICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5jeWd3aW4iOyB0aGVuCisgICAgdW5peF9wYXRoPWAkQ1lHUEFUSCAtdSAiJHdpbmRvd3NfcGF0aCJgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGVsaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MubXN5cyI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRFQ0hPICIkd2luZG93c19wYXRoIiB8ICRTRUQgLWUgJ3MsXlxcKC5cXCk6LC9cXDEsZycgLWUgJ3MsXFxcXCwvLGcnYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBmaQorCisKKyAgIyBOb3cgdHJ5IHRvIGxvY2F0ZSBleGVjdXRhYmxlIHVzaW5nIHdoaWNoCisgIG5ld19wYXRoPWAkV0hJQ0ggIiRuZXdfcGF0aCIgMj4gL2Rldi9udWxsYAorCisgIGlmIHRlc3QgIngkbmV3X3BhdGgiID0geDsgdGhlbgorICAgICMgT29wcy4gV2hpY2ggZGlkbid0IGZpbmQgdGhlIGV4ZWN1dGFibGUuCisgICAgIyBUaGUgc3BsaXR0aW5nIG9mIGFyZ3VtZW50cyBmcm9tIHRoZSBleGVjdXRhYmxlIGF0IGEgc3BhY2UgbWlnaHQgaGF2ZSBiZWVuIGluY29ycmVjdCwKKyAgICAjIHNpbmNlIHBhdGhzIHdpdGggc3BhY2UgYXJlIG1vcmUgbGlrZWx5IGluIFdpbmRvd3MuIEdpdmUgaXQgYW5vdGhlciB0cnkgd2l0aCB0aGUgd2hvbGUKKyAgICAjIGFyZ3VtZW50LgorICAgIHBhdGg9IiRjb21wbGV0ZSIKKyAgICBhcmd1bWVudHM9IkVPTCIKKyAgICBuZXdfcGF0aD0iJHBhdGgiCisKKyAgd2luZG93c19wYXRoPSIkbmV3X3BhdGgiCisgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLmN5Z3dpbiI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRDWUdQQVRIIC11ICIkd2luZG93c19wYXRoImAKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJEVDSE8gIiR3aW5kb3dzX3BhdGgiIHwgJFNFRCAtZSAncyxeXFwoLlxcKTosL1xcMSxnJyAtZSAncyxcXFxcLC8sZydgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGZpCisKKworICAgIG5ld19wYXRoPWAkV0hJQ0ggIiRuZXdfcGF0aCIgMj4gL2Rldi9udWxsYAorCisgICAgaWYgdGVzdCAieCRuZXdfcGF0aCIgPSB4OyB0aGVuCisgICAgICAjIEl0J3Mgc3RpbGwgbm90IGZvdW5kLiBOb3cgdGhpcyBpcyBhbiB1bnJlY292ZXJhYmxlIGVycm9yLgorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUaGUgcGF0aCBvZiBGT1VORF9NQUtFLCB3aGljaCByZXNvbHZlcyBhcyBcIiRjb21wbGV0ZVwiLCBpcyBub3QgZm91bmQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoZSBwYXRoIG9mIEZPVU5EX01BS0UsIHdoaWNoIHJlc29sdmVzIGFzIFwiJGNvbXBsZXRlXCIsIGlzIG5vdCBmb3VuZC4iID4mNjt9CisgICAgICBoYXNfc3BhY2U9YCRFQ0hPICIkY29tcGxldGUiIHwgJEdSRVAgIiAiYAorICAgICAgaWYgdGVzdCAieCRoYXNfc3BhY2UiICE9IHg7IHRoZW4KKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBZb3UgbWlnaHQgYmUgbWl4aW5nIHNwYWNlcyBpbiB0aGUgcGF0aCBhbmQgZXh0cmEgYXJndW1lbnRzLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogWW91IG1pZ2h0IGJlIG1peGluZyBzcGFjZXMgaW4gdGhlIHBhdGggYW5kIGV4dHJhIGFyZ3VtZW50cywgd2hpY2ggaXMgbm90IGFsbG93ZWQuIiA+JjY7fQorICAgICAgZmkKKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJDYW5ub3QgbG9jYXRlIHRoZSB0aGUgcGF0aCBvZiBGT1VORF9NQUtFIiAiJExJTkVOTyIgNQorICAgIGZpCisgIGZpCisKKyAgIyBOb3cgbmV3X3BhdGggaGFzIGEgY29tcGxldGUgdW5peCBwYXRoIHRvIHRoZSBiaW5hcnkKKyAgaWYgdGVzdCAieGAkRUNITyAkbmV3X3BhdGggfCAkR1JFUCBeL2Jpbi9gIiAhPSB4OyB0aGVuCisgICAgIyBLZWVwIHBhdGhzIGluIC9iaW4gYXMtaXMsIGJ1dCByZW1vdmUgdHJhaWxpbmcgLmV4ZSBpZiBhbnkKKyAgICBuZXdfcGF0aD0iJHtuZXdfcGF0aC8lLmV4ZS99IgorICAgICMgRG8gbm90IHNhdmUgL2JpbiBwYXRocyB0byBhbGxfZml4cGF0aF9wcmVmaXhlcyEKKyAgZWxzZQorICAgICMgTm90IGluIG1peGVkIG9yIFdpbmRvd3Mgc3R5bGUsIHN0YXJ0IGJ5IHRoYXQuCisgICAgbmV3X3BhdGg9YGNtZCAvL2MgZWNobyAkbmV3X3BhdGhgCisKKyAgaW5wdXRfcGF0aD0iJG5ld19wYXRoIgorICAjIENoZWNrIGlmIHdlIG5lZWQgdG8gY29udmVydCB0aGlzIHVzaW5nIERPUy1zdHlsZSBzaG9ydCBtb2RlLiBJZiB0aGUgcGF0aAorICAjIGNvbnRhaW5zIGp1c3Qgc2ltcGxlIGNoYXJhY3RlcnMsIHVzZSBpdC4gT3RoZXJ3aXNlIChzcGFjZXMsIHdlaXJkIGNoYXJhY3RlcnMpLAorICAjIHRha2Ugbm8gY2hhbmNlcyBhbmQgcmV3cml0ZSBpdC4KKyAgIyBOb3RlOiBtNCBlYXRzIG91ciBbXSwgc28gd2UgbmVlZCB0byB1c2UgWyBhbmQgXSBpbnN0ZWFkLgorICBoYXNfZm9yYmlkZGVuX2NoYXJzPWAkRUNITyAiJGlucHV0X3BhdGgiIHwgJEdSRVAgW14tXy86YS16QS1aMC05XWAKKyAgaWYgdGVzdCAieCRoYXNfZm9yYmlkZGVuX2NoYXJzIiAhPSB4OyB0aGVuCisgICAgIyBOb3cgY29udmVydCBpdCB0byBtaXhlZCBET1Mtc3R5bGUsIHNob3J0IG1vZGUgKG5vIHNwYWNlcywgYW5kIC8gaW5zdGVhZCBvZiBcKQorICAgIG5ld19wYXRoPWBjbWQgL2MgImZvciAlQSBpbiAoXCIkaW5wdXRfcGF0aFwiKSBkbyBAZWNobyAlfnNBInwkVFIgXFxcXFxcXFwgLyB8ICRUUiAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidgCisgIGZpCisKKyAgICAjIE91dHB1dCBpcyBpbiAkbmV3X3BhdGgKKworICB3aW5kb3dzX3BhdGg9IiRuZXdfcGF0aCIKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJENZR1BBVEggLXUgIiR3aW5kb3dzX3BhdGgiYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBlbGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLm1zeXMiOyB0aGVuCisgICAgdW5peF9wYXRoPWAkRUNITyAiJHdpbmRvd3NfcGF0aCIgfCAkU0VEIC1lICdzLF5cXCguXFwpOiwvXFwxLGcnIC1lICdzLFxcXFwsLyxnJ2AKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZmkKKworICAgICMgcmVtb3ZlIHRyYWlsaW5nIC5leGUgaWYgYW55CisgICAgbmV3X3BhdGg9IiR7bmV3X3BhdGgvJS5leGUvfSIKKworICAgICMgU2F2ZSB0aGUgZmlyc3QgMTAgYnl0ZXMgb2YgdGhpcyBwYXRoIHRvIHRoZSBzdG9yYWdlLCBzbyBmaXhwYXRoIGNhbiB3b3JrLgorICAgIGFsbF9maXhwYXRoX3ByZWZpeGVzPSgiJHthbGxfZml4cGF0aF9wcmVmaXhlc1tAXX0iICIke25ld19wYXRoOjA6MTB9IikKKyAgZmkKKworICBlbHNlCisgICAgIyBXZSdyZSBvbiBhIHBvc2l4IHBsYXRmb3JtLiBIb29yYXkhIDopCisgICAgIyBGaXJzdCBzZXBhcmF0ZSB0aGUgcGF0aCBmcm9tIHRoZSBhcmd1bWVudHMuIFRoaXMgd2lsbCBzcGxpdCBhdCB0aGUgZmlyc3QKKyAgICAjIHNwYWNlLgorICAgIGNvbXBsZXRlPSIkRk9VTkRfTUFLRSIKKyAgICBwYXRoPSIke2NvbXBsZXRlJSUgKn0iCisgICAgdG1wPSIkY29tcGxldGUgRU9MIgorICAgIGFyZ3VtZW50cz0iJHt0bXAjKiB9IgorCisgICAgbmV3X3BhdGg9YCRXSElDSCAkcGF0aCAyPiAvZGV2L251bGxgCisgICAgaWYgdGVzdCAieCRuZXdfcGF0aCIgPSB4OyB0aGVuCisgICAgICBpc19hYnNvbHV0ZV9wYXRoPWAkRUNITyAiJHBhdGgiIHwgJEdSRVAgXi9gCisgICAgICBpZiB0ZXN0ICJ4JGlzX2Fic29sdXRlX3BhdGgiICE9IHg7IHRoZW4KKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBSZXNvbHZpbmcgRk9VTkRfTUFLRSAoYXMgJHBhdGgpIHdpdGggJ3doaWNoJyBmYWlsZWQsIHVzaW5nICRwYXRoIGRpcmVjdGx5LiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBSZXNvbHZpbmcgRk9VTkRfTUFLRSAoYXMgJHBhdGgpIHdpdGggJ3doaWNoJyBmYWlsZWQsIHVzaW5nICRwYXRoIGRpcmVjdGx5LiIgPiY2O30KKyAgICAgICAgbmV3X3BhdGg9IiRwYXRoIgorICAgICAgZWxzZQorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSBwYXRoIG9mIEZPVU5EX01BS0UsIHdoaWNoIHJlc29sdmVzIGFzIFwiJGNvbXBsZXRlXCIsIGlzIG5vdCBmb3VuZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhlIHBhdGggb2YgRk9VTkRfTUFLRSwgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkY29tcGxldGVcIiwgaXMgbm90IGZvdW5kLiIgPiY2O30KKyAgICAgICAgaGFzX3NwYWNlPWAkRUNITyAiJGNvbXBsZXRlIiB8ICRHUkVQICIgImAKKyAgICAgICAgaWYgdGVzdCAieCRoYXNfc3BhY2UiICE9IHg7IHRoZW4KKyAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoaXMgbWlnaHQgYmUgY2F1c2VkIGJ5IHNwYWNlcyBpbiB0aGUgcGF0aCwgd2hpY2ggaXMgbm90IGFsbG93ZWQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoaXMgbWlnaHQgYmUgY2F1c2VkIGJ5IHNwYWNlcyBpbiB0aGUgcGF0aCwgd2hpY2ggaXMgbm90IGFsbG93ZWQuIiA+JjY7fQorICAgICAgICBmaQorICAgICAgICBhc19mbl9lcnJvciAkPyAiQ2Fubm90IGxvY2F0ZSB0aGUgdGhlIHBhdGggb2YgRk9VTkRfTUFLRSIgIiRMSU5FTk8iIDUKKyAgICAgIGZpCisgICAgZmkKKyAgZmkKKworICAjIE5vdyBqb2luIHRvZ2V0aGVyIHRoZSBwYXRoIGFuZCB0aGUgYXJndW1lbnRzIG9uY2UgYWdhaW4KKyAgaWYgdGVzdCAieCRhcmd1bWVudHMiICE9IHhFT0w7IHRoZW4KKyAgICAgIG5ld19jb21wbGV0ZT0iJG5ld19wYXRoICR7YXJndW1lbnRzJSAqfSIKKyAgZWxzZQorICAgICAgbmV3X2NvbXBsZXRlPSIkbmV3X3BhdGgiCisgIGZpCisKKyAgaWYgdGVzdCAieCRjb21wbGV0ZSIgIT0gIngkbmV3X2NvbXBsZXRlIjsgdGhlbgorICAgIEZPVU5EX01BS0U9IiRuZXdfY29tcGxldGUiCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBSZXdyaXRpbmcgRk9VTkRfTUFLRSB0byBcIiRuZXdfY29tcGxldGVcIiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBSZXdyaXRpbmcgRk9VTkRfTUFLRSB0byBcIiRuZXdfY29tcGxldGVcIiIgPiY2O30KKyAgZmkKKworICAgICAgICBmaQorICAgICAgZmkKKyAgICBmaQorICBmaQorCisgICAgICAgIGlmIHRlc3QgIngkRk9VTkRfTUFLRSIgPSB4OyB0aGVuCisgICAgICAgICAgZm9yIGFjX3Byb2cgaW4gbWFrZQorZG8KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9wYXRoX0NIRUNLX1RPT0xTRElSX01BS0Urc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXNlICRDSEVDS19UT09MU0RJUl9NQUtFIGluCisgIFtcXC9dKiB8ID86W1xcL10qKQorICBhY19jdl9wYXRoX0NIRUNLX1RPT0xTRElSX01BS0U9IiRDSEVDS19UT09MU0RJUl9NQUtFIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcGF0aF9DSEVDS19UT09MU0RJUl9NQUtFPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCisgIDs7Citlc2FjCitmaQorQ0hFQ0tfVE9PTFNESVJfTUFLRT0kYWNfY3ZfcGF0aF9DSEVDS19UT09MU0RJUl9NQUtFCitpZiB0ZXN0IC1uICIkQ0hFQ0tfVE9PTFNESVJfTUFLRSI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRDSEVDS19UT09MU0RJUl9NQUtFIiA+JjUKKyRhc19lY2hvICIkQ0hFQ0tfVE9PTFNESVJfTUFLRSIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCisgIHRlc3QgLW4gIiRDSEVDS19UT09MU0RJUl9NQUtFIiAmJiBicmVhaworZG9uZQorCisKKyAgTUFLRV9DQU5ESURBVEU9IiIkQ0hFQ0tfVE9PTFNESVJfTUFLRSIiCisgIERFU0NSSVBUSU9OPSJtYWtlIGluIHRvb2xzLWRpciIKKyAgaWYgdGVzdCAieCRNQUtFX0NBTkRJREFURSIgIT0geDsgdGhlbgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGVzdGluZyBwb3RlbnRpYWwgbWFrZSBhdCAkTUFLRV9DQU5ESURBVEUsIGZvdW5kIHVzaW5nICRERVNDUklQVElPTiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUZXN0aW5nIHBvdGVudGlhbCBtYWtlIGF0ICRNQUtFX0NBTkRJREFURSwgZm91bmQgdXNpbmcgJERFU0NSSVBUSU9OIiA+JjY7fQorICAgIE1BS0VfVkVSU0lPTl9TVFJJTkc9YCRNQUtFX0NBTkRJREFURSAtLXZlcnNpb24gfCAkSEVBRCAtbiAxYAorICAgIElTX0dOVV9NQUtFPWAkRUNITyAkTUFLRV9WRVJTSU9OX1NUUklORyB8ICRHUkVQICdHTlUgTWFrZSdgCisgICAgaWYgdGVzdCAieCRJU19HTlVfTUFLRSIgPSB4OyB0aGVuCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IEZvdW5kIHBvdGVudGlhbCBtYWtlIGF0ICRNQUtFX0NBTkRJREFURSwgaG93ZXZlciwgdGhpcyBpcyBub3QgR05VIE1ha2UuIElnbm9yaW5nLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBGb3VuZCBwb3RlbnRpYWwgbWFrZSBhdCAkTUFLRV9DQU5ESURBVEUsIGhvd2V2ZXIsIHRoaXMgaXMgbm90IEdOVSBNYWtlLiBJZ25vcmluZy4iID4mNjt9CisgICAgZWxzZQorICAgICAgSVNfTU9ERVJOX01BS0U9YCRFQ0hPICRNQUtFX1ZFUlNJT05fU1RSSU5HIHwgJEdSRVAgJzMuOFsxMjM0Njc4OV0nYAorICAgICAgaWYgdGVzdCAieCRJU19NT0RFUk5fTUFLRSIgPSB4OyB0aGVuCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogRm91bmQgR05VIG1ha2UgYXQgJE1BS0VfQ0FORElEQVRFLCBob3dldmVyIHRoaXMgaXMgbm90IHZlcnNpb24gMy44MSBvciBsYXRlci4gKGl0IGlzOiAkTUFLRV9WRVJTSU9OX1NUUklORykuIElnbm9yaW5nLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBGb3VuZCBHTlUgbWFrZSBhdCAkTUFLRV9DQU5ESURBVEUsIGhvd2V2ZXIgdGhpcyBpcyBub3QgdmVyc2lvbiAzLjgxIG9yIGxhdGVyLiAoaXQgaXM6ICRNQUtFX1ZFUlNJT05fU1RSSU5HKS4gSWdub3JpbmcuIiA+JjY7fQorICAgICAgZWxzZQorICAgICAgICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1MiID0gInh3aW5kb3dzIjsgdGhlbgorICAgICAgICAgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLmN5Z3dpbiI7IHRoZW4KKyAgICAgICAgICAgIE1BS0VfRVhQRUNURURfRU5WPSdjeWd3aW4nCisgICAgICAgICAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorICAgICAgICAgICAgTUFLRV9FWFBFQ1RFRF9FTlY9J21zeXMnCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgYXNfZm5fZXJyb3IgJD8gIlVua25vd24gV2luZG93cyBlbnZpcm9ubWVudCIgIiRMSU5FTk8iIDUKKyAgICAgICAgICBmaQorICAgICAgICAgIE1BS0VfQlVJTFRfRk9SPWAkTUFLRV9DQU5ESURBVEUgLS12ZXJzaW9uIHwgJEdSRVAgLWkgJ2J1aWx0IGZvcidgCisgICAgICAgICAgSVNfTUFLRV9DT1JSRUNUX0VOVj1gJEVDSE8gJE1BS0VfQlVJTFRfRk9SIHwgJEdSRVAgJE1BS0VfRVhQRUNURURfRU5WYAorICAgICAgICBlbHNlCisgICAgICAgICAgIyBOb3QgcmVsZXZhbnQgZm9yIG5vbi1XaW5kb3dzCisgICAgICAgICAgSVNfTUFLRV9DT1JSRUNUX0VOVj10cnVlCisgICAgICAgIGZpCisgICAgICAgIGlmIHRlc3QgIngkSVNfTUFLRV9DT1JSRUNUX0VOViIgPSB4OyB0aGVuCisgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBGb3VuZCBHTlUgbWFrZSB2ZXJzaW9uICRNQUtFX1ZFUlNJT05fU1RSSU5HIGF0ICRNQUtFX0NBTkRJREFURSwgYnV0IGl0IGlzIG5vdCBmb3IgJE1BS0VfRVhQRUNURURfRU5WIChpdCBzYXlzOiAkTUFLRV9CVUlMVF9GT1IpLiBJZ25vcmluZy4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogRm91bmQgR05VIG1ha2UgdmVyc2lvbiAkTUFLRV9WRVJTSU9OX1NUUklORyBhdCAkTUFLRV9DQU5ESURBVEUsIGJ1dCBpdCBpcyBub3QgZm9yICRNQUtFX0VYUEVDVEVEX0VOViAoaXQgc2F5czogJE1BS0VfQlVJTFRfRk9SKS4gSWdub3JpbmcuIiA+JjY7fQorICAgICAgICBlbHNlCisgICAgICAgICAgRk9VTkRfTUFLRT0kTUFLRV9DQU5ESURBVEUKKworICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5jeWd3aW4iOyB0aGVuCisKKyAgIyBGaXJzdCBzZXBhcmF0ZSB0aGUgcGF0aCBmcm9tIHRoZSBhcmd1bWVudHMuIFRoaXMgd2lsbCBzcGxpdCBhdCB0aGUgZmlyc3QKKyAgIyBzcGFjZS4KKyAgY29tcGxldGU9IiRGT1VORF9NQUtFIgorICBwYXRoPSIke2NvbXBsZXRlJSUgKn0iCisgIHRtcD0iJGNvbXBsZXRlIEVPTCIKKyAgYXJndW1lbnRzPSIke3RtcCMqIH0iCisKKyAgIyBJbnB1dCBtaWdodCBiZSBnaXZlbiBhcyBXaW5kb3dzIGZvcm1hdCwgc3RhcnQgYnkgY29udmVydGluZyB0bworICAjIHVuaXggZm9ybWF0LgorICBuZXdfcGF0aD1gJENZR1BBVEggLXUgIiRwYXRoImAKKworICAjIE5vdyB0cnkgdG8gbG9jYXRlIGV4ZWN1dGFibGUgdXNpbmcgd2hpY2gKKyAgbmV3X3BhdGg9YCRXSElDSCAiJG5ld19wYXRoIiAyPiAvZGV2L251bGxgCisgIGlmIHRlc3QgIngkbmV3X3BhdGgiID0geDsgdGhlbgorICAgICMgT29wcy4gV2hpY2ggZGlkbid0IGZpbmQgdGhlIGV4ZWN1dGFibGUuCisgICAgIyBUaGUgc3BsaXR0aW5nIG9mIGFyZ3VtZW50cyBmcm9tIHRoZSBleGVjdXRhYmxlIGF0IGEgc3BhY2UgbWlnaHQgaGF2ZSBiZWVuIGluY29ycmVjdCwKKyAgICAjIHNpbmNlIHBhdGhzIHdpdGggc3BhY2UgYXJlIG1vcmUgbGlrZWx5IGluIFdpbmRvd3MuIEdpdmUgaXQgYW5vdGhlciB0cnkgd2l0aCB0aGUgd2hvbGUKKyAgICAjIGFyZ3VtZW50LgorICAgIHBhdGg9IiRjb21wbGV0ZSIKKyAgICBhcmd1bWVudHM9IkVPTCIKKyAgICBuZXdfcGF0aD1gJENZR1BBVEggLXUgIiRwYXRoImAKKyAgICBuZXdfcGF0aD1gJFdISUNIICIkbmV3X3BhdGgiIDI+IC9kZXYvbnVsbGAKKyAgICBpZiB0ZXN0ICJ4JG5ld19wYXRoIiA9IHg7IHRoZW4KKyAgICAgICMgSXQncyBzdGlsbCBub3QgZm91bmQuIE5vdyB0aGlzIGlzIGFuIHVucmVjb3ZlcmFibGUgZXJyb3IuCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSBwYXRoIG9mIEZPVU5EX01BS0UsIHdoaWNoIHJlc29sdmVzIGFzIFwiJGNvbXBsZXRlXCIsIGlzIG5vdCBmb3VuZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhlIHBhdGggb2YgRk9VTkRfTUFLRSwgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkY29tcGxldGVcIiwgaXMgbm90IGZvdW5kLiIgPiY2O30KKyAgICAgIGhhc19zcGFjZT1gJEVDSE8gIiRjb21wbGV0ZSIgfCAkR1JFUCAiICJgCisgICAgICBpZiB0ZXN0ICJ4JGhhc19zcGFjZSIgIT0geDsgdGhlbgorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFlvdSBtaWdodCBiZSBtaXhpbmcgc3BhY2VzIGluIHRoZSBwYXRoIGFuZCBleHRyYSBhcmd1bWVudHMsIHdoaWNoIGlzIG5vdCBhbGxvd2VkLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBZb3UgbWlnaHQgYmUgbWl4aW5nIHNwYWNlcyBpbiB0aGUgcGF0aCBhbmQgZXh0cmEgYXJndW1lbnRzLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iID4mNjt9CisgICAgICBmaQorICAgICAgYXNfZm5fZXJyb3IgJD8gIkNhbm5vdCBsb2NhdGUgdGhlIHRoZSBwYXRoIG9mIEZPVU5EX01BS0UiICIkTElORU5PIiA1CisgICAgZmkKKyAgZmkKKworICAjIEN5Z3dpbiB0cmllcyB0byBoaWRlIHNvbWUgYXNwZWN0cyBvZiB0aGUgV2luZG93cyBmaWxlIHN5c3RlbSwgc3VjaCB0aGF0IGJpbmFyaWVzIGFyZQorICAjIG5hbWVkIC5leGUgYnV0IGNhbGxlZCB3aXRob3V0IHRoYXQgc3VmZml4LiBUaGVyZWZvcmUsICJmb28iIGFuZCAiZm9vLmV4ZSIgYXJlIGNvbnNpZGVyZWQKKyAgIyB0aGUgc2FtZSBmaWxlLCBtb3N0IG9mIHRoZSB0aW1lIChhcyBpbiAidGVzdCAtZiIpLiBCdXQgbm90IHdoZW4gcnVubmluZyBjeWdwYXRoIC1zLCB0aGVuCisgICMgImZvby5leGUiIGlzIE9LIGJ1dCAiZm9vIiBpcyBhbiBlcnJvci4KKyAgIworICAjIFRoaXMgdGVzdCBpcyB0aGVyZWZvcmUgc2xpZ2h0bHkgbW9yZSBhY2N1cmF0ZSB0aGFuICJ0ZXN0IC1mIiB0byBjaGVjayBmb3IgZmlsZSBwcmVjZW5zZS4KKyAgIyBJdCBpcyBhbHNvIGEgd2F5IHRvIG1ha2Ugc3VyZSB3ZSBnb3QgdGhlIHByb3BlciBmaWxlIG5hbWUgZm9yIHRoZSByZWFsIHRlc3QgbGF0ZXIgb24uCisgIHRlc3Rfc2hvcnRwYXRoPWAkQ1lHUEFUSCAtcyAtbSAiJG5ld19wYXRoIiAyPiAvZGV2L251bGxgCisgIGlmIHRlc3QgIngkdGVzdF9zaG9ydHBhdGgiID0geDsgdGhlbgorICAgICMgU2hvcnQgcGF0aCBmYWlsZWQsIGZpbGUgZG9lcyBub3QgZXhpc3QgYXMgc3BlY2lmaWVkLgorICAgICMgVHJ5IGFkZGluZyAuZXhlIG9yIC5jbWQKKyAgICBpZiB0ZXN0IC1mICIke25ld19wYXRofS5leGUiOyB0aGVuCisgICAgICAgaW5wdXRfdG9fc2hvcnRwYXRoPSIke25ld19wYXRofS5leGUiCisgICAgZWxpZiB0ZXN0IC1mICIke25ld19wYXRofS5jbWQiOyB0aGVuCisgICAgICAgaW5wdXRfdG9fc2hvcnRwYXRoPSIke25ld19wYXRofS5jbWQiCisgICAgZWxzZQorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUaGUgcGF0aCBvZiBGT1VORF9NQUtFLCB3aGljaCByZXNvbHZlcyBhcyBcIiRuZXdfcGF0aFwiLCBpcyBpbnZhbGlkLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUaGUgcGF0aCBvZiBGT1VORF9NQUtFLCB3aGljaCByZXNvbHZlcyBhcyBcIiRuZXdfcGF0aFwiLCBpcyBpbnZhbGlkLiIgPiY2O30KKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogTmVpdGhlciBcIiRuZXdfcGF0aFwiIG5vciBcIiRuZXdfcGF0aC5leGUvY21kXCIgY2FuIGJlIGZvdW5kIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IE5laXRoZXIgXCIkbmV3X3BhdGhcIiBub3IgXCIkbmV3X3BhdGguZXhlL2NtZFwiIGNhbiBiZSBmb3VuZCIgPiY2O30KKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJDYW5ub3QgbG9jYXRlIHRoZSB0aGUgcGF0aCBvZiBGT1VORF9NQUtFIiAiJExJTkVOTyIgNQorICAgIGZpCisgIGVsc2UKKyAgICBpbnB1dF90b19zaG9ydHBhdGg9IiRuZXdfcGF0aCIKKyAgZmkKKworICAjIENhbGwgaGVscGVyIGZ1bmN0aW9uIHdoaWNoIHBvc3NpYmx5IGNvbnZlcnRzIHRoaXMgdXNpbmcgRE9TLXN0eWxlIHNob3J0IG1vZGUuCisgICMgSWYgc28sIHRoZSB1cGRhdGVkIHBhdGggaXMgc3RvcmVkIGluICRuZXdfcGF0aC4KKyAgbmV3X3BhdGg9IiRpbnB1dF90b19zaG9ydHBhdGgiCisKKyAgaW5wdXRfcGF0aD0iJGlucHV0X3RvX3Nob3J0cGF0aCIKKyAgIyBDaGVjayBpZiB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhpcyB1c2luZyBET1Mtc3R5bGUgc2hvcnQgbW9kZS4gSWYgdGhlIHBhdGgKKyAgIyBjb250YWlucyBqdXN0IHNpbXBsZSBjaGFyYWN0ZXJzLCB1c2UgaXQuIE90aGVyd2lzZSAoc3BhY2VzLCB3ZWlyZCBjaGFyYWN0ZXJzKSwKKyAgIyB0YWtlIG5vIGNoYW5jZXMgYW5kIHJld3JpdGUgaXQuCisgICMgTm90ZTogbTQgZWF0cyBvdXIgW10sIHNvIHdlIG5lZWQgdG8gdXNlIFsgYW5kIF0gaW5zdGVhZC4KKyAgaGFzX2ZvcmJpZGRlbl9jaGFycz1gJEVDSE8gIiRpbnB1dF9wYXRoIiB8ICRHUkVQIFteLS5fL2EtekEtWjAtOV1gCisgIGlmIHRlc3QgIngkaGFzX2ZvcmJpZGRlbl9jaGFycyIgIT0geDsgdGhlbgorICAgICMgTm93IGNvbnZlcnQgaXQgdG8gbWl4ZWQgRE9TLXN0eWxlLCBzaG9ydCBtb2RlIChubyBzcGFjZXMsIGFuZCAvIGluc3RlYWQgb2YgXCkKKyAgICBzaG9ydG1vZGVfcGF0aD1gJENZR1BBVEggLXMgLW0gLWEgIiRpbnB1dF9wYXRoImAKKyAgICBwYXRoX2FmdGVyX3Nob3J0bW9kZT1gJENZR1BBVEggLXUgIiRzaG9ydG1vZGVfcGF0aCJgCisgICAgaWYgdGVzdCAieCRwYXRoX2FmdGVyX3Nob3J0bW9kZSIgIT0gIngkaW5wdXRfdG9fc2hvcnRwYXRoIjsgdGhlbgorICAgICAgIyBHb2luZyB0byBzaG9ydCBtb2RlIGFuZCBiYWNrIGFnYWluIGRpZCBpbmRlZWQgbWF0dGVyLiBTaW5jZSBzaG9ydCBtb2RlIGlzCisgICAgICAjIGNhc2UgaW5zZW5zaXRpdmUsIGxldCdzIG1ha2UgaXQgbG93ZXJjYXNlIHRvIGltcHJvdmUgcmVhZGFiaWxpdHkuCisgICAgICBzaG9ydG1vZGVfcGF0aD1gJEVDSE8gIiRzaG9ydG1vZGVfcGF0aCIgfCAkVFIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAorICAgICAgIyBOb3cgY29udmVydCBpdCBiYWNrIHRvIFVuaXgtc3RpbGUgKGN5Z3BhdGgpCisgICAgICBpbnB1dF9wYXRoPWAkQ1lHUEFUSCAtdSAiJHNob3J0bW9kZV9wYXRoImAKKyAgICAgIG5ld19wYXRoPSIkaW5wdXRfcGF0aCIKKyAgICBmaQorICBmaQorCisgIHRlc3RfY3lnZHJpdmVfcHJlZml4PWAkRUNITyAkaW5wdXRfcGF0aCB8ICRHUkVQIF4vY3lnZHJpdmUvYAorICBpZiB0ZXN0ICJ4JHRlc3RfY3lnZHJpdmVfcHJlZml4IiA9IHg7IHRoZW4KKyAgICAjIEFzIGEgc2ltcGxlIGZpeCwgZXhjbHVkZSAvdXNyL2JpbiBzaW5jZSBpdCdzIG5vdCBhIHJlYWwgcGF0aC4KKyAgICBpZiB0ZXN0ICJ4YCRFQ0hPICRpbnB1dF90b19zaG9ydHBhdGggfCAkR1JFUCBeL3Vzci9iaW4vYCIgPSB4OyB0aGVuCisgICAgICAjIFRoZSBwYXRoIGlzIGluIGEgQ3lnd2luIHNwZWNpYWwgZGlyZWN0b3J5IChlLmcuIC9ob21lKS4gV2UgbmVlZCB0aGlzIGNvbnZlcnRlZCB0bworICAgICAgIyBhIHBhdGggcHJlZml4ZWQgYnkgL2N5Z2RyaXZlIGZvciBmaXhwYXRoIHRvIHdvcmsuCisgICAgICBuZXdfcGF0aD0iJENZR1dJTl9ST09UX1BBVEgkaW5wdXRfcGF0aCIKKyAgICBmaQorICBmaQorCisgICMgcmVtb3ZlIHRyYWlsaW5nIC5leGUgaWYgYW55CisgIG5ld19wYXRoPSIke25ld19wYXRoLyUuZXhlL30iCisKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorCisgICMgRmlyc3Qgc2VwYXJhdGUgdGhlIHBhdGggZnJvbSB0aGUgYXJndW1lbnRzLiBUaGlzIHdpbGwgc3BsaXQgYXQgdGhlIGZpcnN0CisgICMgc3BhY2UuCisgIGNvbXBsZXRlPSIkRk9VTkRfTUFLRSIKKyAgcGF0aD0iJHtjb21wbGV0ZSUlICp9IgorICB0bXA9IiRjb21wbGV0ZSBFT0wiCisgIGFyZ3VtZW50cz0iJHt0bXAjKiB9IgorCisgICMgSW5wdXQgbWlnaHQgYmUgZ2l2ZW4gYXMgV2luZG93cyBmb3JtYXQsIHN0YXJ0IGJ5IGNvbnZlcnRpbmcgdG8KKyAgIyB1bml4IGZvcm1hdC4KKyAgbmV3X3BhdGg9IiRwYXRoIgorCisgIHdpbmRvd3NfcGF0aD0iJG5ld19wYXRoIgorICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5jeWd3aW4iOyB0aGVuCisgICAgdW5peF9wYXRoPWAkQ1lHUEFUSCAtdSAiJHdpbmRvd3NfcGF0aCJgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGVsaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MubXN5cyI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRFQ0hPICIkd2luZG93c19wYXRoIiB8ICRTRUQgLWUgJ3MsXlxcKC5cXCk6LC9cXDEsZycgLWUgJ3MsXFxcXCwvLGcnYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBmaQorCisKKyAgIyBOb3cgdHJ5IHRvIGxvY2F0ZSBleGVjdXRhYmxlIHVzaW5nIHdoaWNoCisgIG5ld19wYXRoPWAkV0hJQ0ggIiRuZXdfcGF0aCIgMj4gL2Rldi9udWxsYAorCisgIGlmIHRlc3QgIngkbmV3X3BhdGgiID0geDsgdGhlbgorICAgICMgT29wcy4gV2hpY2ggZGlkbid0IGZpbmQgdGhlIGV4ZWN1dGFibGUuCisgICAgIyBUaGUgc3BsaXR0aW5nIG9mIGFyZ3VtZW50cyBmcm9tIHRoZSBleGVjdXRhYmxlIGF0IGEgc3BhY2UgbWlnaHQgaGF2ZSBiZWVuIGluY29ycmVjdCwKKyAgICAjIHNpbmNlIHBhdGhzIHdpdGggc3BhY2UgYXJlIG1vcmUgbGlrZWx5IGluIFdpbmRvd3MuIEdpdmUgaXQgYW5vdGhlciB0cnkgd2l0aCB0aGUgd2hvbGUKKyAgICAjIGFyZ3VtZW50LgorICAgIHBhdGg9IiRjb21wbGV0ZSIKKyAgICBhcmd1bWVudHM9IkVPTCIKKyAgICBuZXdfcGF0aD0iJHBhdGgiCisKKyAgd2luZG93c19wYXRoPSIkbmV3X3BhdGgiCisgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLmN5Z3dpbiI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRDWUdQQVRIIC11ICIkd2luZG93c19wYXRoImAKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJEVDSE8gIiR3aW5kb3dzX3BhdGgiIHwgJFNFRCAtZSAncyxeXFwoLlxcKTosL1xcMSxnJyAtZSAncyxcXFxcLC8sZydgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGZpCisKKworICAgIG5ld19wYXRoPWAkV0hJQ0ggIiRuZXdfcGF0aCIgMj4gL2Rldi9udWxsYAorCisgICAgaWYgdGVzdCAieCRuZXdfcGF0aCIgPSB4OyB0aGVuCisgICAgICAjIEl0J3Mgc3RpbGwgbm90IGZvdW5kLiBOb3cgdGhpcyBpcyBhbiB1bnJlY292ZXJhYmxlIGVycm9yLgorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUaGUgcGF0aCBvZiBGT1VORF9NQUtFLCB3aGljaCByZXNvbHZlcyBhcyBcIiRjb21wbGV0ZVwiLCBpcyBub3QgZm91bmQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoZSBwYXRoIG9mIEZPVU5EX01BS0UsIHdoaWNoIHJlc29sdmVzIGFzIFwiJGNvbXBsZXRlXCIsIGlzIG5vdCBmb3VuZC4iID4mNjt9CisgICAgICBoYXNfc3BhY2U9YCRFQ0hPICIkY29tcGxldGUiIHwgJEdSRVAgIiAiYAorICAgICAgaWYgdGVzdCAieCRoYXNfc3BhY2UiICE9IHg7IHRoZW4KKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBZb3UgbWlnaHQgYmUgbWl4aW5nIHNwYWNlcyBpbiB0aGUgcGF0aCBhbmQgZXh0cmEgYXJndW1lbnRzLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogWW91IG1pZ2h0IGJlIG1peGluZyBzcGFjZXMgaW4gdGhlIHBhdGggYW5kIGV4dHJhIGFyZ3VtZW50cywgd2hpY2ggaXMgbm90IGFsbG93ZWQuIiA+JjY7fQorICAgICAgZmkKKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJDYW5ub3QgbG9jYXRlIHRoZSB0aGUgcGF0aCBvZiBGT1VORF9NQUtFIiAiJExJTkVOTyIgNQorICAgIGZpCisgIGZpCisKKyAgIyBOb3cgbmV3X3BhdGggaGFzIGEgY29tcGxldGUgdW5peCBwYXRoIHRvIHRoZSBiaW5hcnkKKyAgaWYgdGVzdCAieGAkRUNITyAkbmV3X3BhdGggfCAkR1JFUCBeL2Jpbi9gIiAhPSB4OyB0aGVuCisgICAgIyBLZWVwIHBhdGhzIGluIC9iaW4gYXMtaXMsIGJ1dCByZW1vdmUgdHJhaWxpbmcgLmV4ZSBpZiBhbnkKKyAgICBuZXdfcGF0aD0iJHtuZXdfcGF0aC8lLmV4ZS99IgorICAgICMgRG8gbm90IHNhdmUgL2JpbiBwYXRocyB0byBhbGxfZml4cGF0aF9wcmVmaXhlcyEKKyAgZWxzZQorICAgICMgTm90IGluIG1peGVkIG9yIFdpbmRvd3Mgc3R5bGUsIHN0YXJ0IGJ5IHRoYXQuCisgICAgbmV3X3BhdGg9YGNtZCAvL2MgZWNobyAkbmV3X3BhdGhgCisKKyAgaW5wdXRfcGF0aD0iJG5ld19wYXRoIgorICAjIENoZWNrIGlmIHdlIG5lZWQgdG8gY29udmVydCB0aGlzIHVzaW5nIERPUy1zdHlsZSBzaG9ydCBtb2RlLiBJZiB0aGUgcGF0aAorICAjIGNvbnRhaW5zIGp1c3Qgc2ltcGxlIGNoYXJhY3RlcnMsIHVzZSBpdC4gT3RoZXJ3aXNlIChzcGFjZXMsIHdlaXJkIGNoYXJhY3RlcnMpLAorICAjIHRha2Ugbm8gY2hhbmNlcyBhbmQgcmV3cml0ZSBpdC4KKyAgIyBOb3RlOiBtNCBlYXRzIG91ciBbXSwgc28gd2UgbmVlZCB0byB1c2UgWyBhbmQgXSBpbnN0ZWFkLgorICBoYXNfZm9yYmlkZGVuX2NoYXJzPWAkRUNITyAiJGlucHV0X3BhdGgiIHwgJEdSRVAgW14tXy86YS16QS1aMC05XWAKKyAgaWYgdGVzdCAieCRoYXNfZm9yYmlkZGVuX2NoYXJzIiAhPSB4OyB0aGVuCisgICAgIyBOb3cgY29udmVydCBpdCB0byBtaXhlZCBET1Mtc3R5bGUsIHNob3J0IG1vZGUgKG5vIHNwYWNlcywgYW5kIC8gaW5zdGVhZCBvZiBcKQorICAgIG5ld19wYXRoPWBjbWQgL2MgImZvciAlQSBpbiAoXCIkaW5wdXRfcGF0aFwiKSBkbyBAZWNobyAlfnNBInwkVFIgXFxcXFxcXFwgLyB8ICRUUiAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidgCisgIGZpCisKKyAgICAjIE91dHB1dCBpcyBpbiAkbmV3X3BhdGgKKworICB3aW5kb3dzX3BhdGg9IiRuZXdfcGF0aCIKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJENZR1BBVEggLXUgIiR3aW5kb3dzX3BhdGgiYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBlbGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLm1zeXMiOyB0aGVuCisgICAgdW5peF9wYXRoPWAkRUNITyAiJHdpbmRvd3NfcGF0aCIgfCAkU0VEIC1lICdzLF5cXCguXFwpOiwvXFwxLGcnIC1lICdzLFxcXFwsLyxnJ2AKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZmkKKworICAgICMgcmVtb3ZlIHRyYWlsaW5nIC5leGUgaWYgYW55CisgICAgbmV3X3BhdGg9IiR7bmV3X3BhdGgvJS5leGUvfSIKKworICAgICMgU2F2ZSB0aGUgZmlyc3QgMTAgYnl0ZXMgb2YgdGhpcyBwYXRoIHRvIHRoZSBzdG9yYWdlLCBzbyBmaXhwYXRoIGNhbiB3b3JrLgorICAgIGFsbF9maXhwYXRoX3ByZWZpeGVzPSgiJHthbGxfZml4cGF0aF9wcmVmaXhlc1tAXX0iICIke25ld19wYXRoOjA6MTB9IikKKyAgZmkKKworICBlbHNlCisgICAgIyBXZSdyZSBvbiBhIHBvc2l4IHBsYXRmb3JtLiBIb29yYXkhIDopCisgICAgIyBGaXJzdCBzZXBhcmF0ZSB0aGUgcGF0aCBmcm9tIHRoZSBhcmd1bWVudHMuIFRoaXMgd2lsbCBzcGxpdCBhdCB0aGUgZmlyc3QKKyAgICAjIHNwYWNlLgorICAgIGNvbXBsZXRlPSIkRk9VTkRfTUFLRSIKKyAgICBwYXRoPSIke2NvbXBsZXRlJSUgKn0iCisgICAgdG1wPSIkY29tcGxldGUgRU9MIgorICAgIGFyZ3VtZW50cz0iJHt0bXAjKiB9IgorCisgICAgbmV3X3BhdGg9YCRXSElDSCAkcGF0aCAyPiAvZGV2L251bGxgCisgICAgaWYgdGVzdCAieCRuZXdfcGF0aCIgPSB4OyB0aGVuCisgICAgICBpc19hYnNvbHV0ZV9wYXRoPWAkRUNITyAiJHBhdGgiIHwgJEdSRVAgXi9gCisgICAgICBpZiB0ZXN0ICJ4JGlzX2Fic29sdXRlX3BhdGgiICE9IHg7IHRoZW4KKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBSZXNvbHZpbmcgRk9VTkRfTUFLRSAoYXMgJHBhdGgpIHdpdGggJ3doaWNoJyBmYWlsZWQsIHVzaW5nICRwYXRoIGRpcmVjdGx5LiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBSZXNvbHZpbmcgRk9VTkRfTUFLRSAoYXMgJHBhdGgpIHdpdGggJ3doaWNoJyBmYWlsZWQsIHVzaW5nICRwYXRoIGRpcmVjdGx5LiIgPiY2O30KKyAgICAgICAgbmV3X3BhdGg9IiRwYXRoIgorICAgICAgZWxzZQorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSBwYXRoIG9mIEZPVU5EX01BS0UsIHdoaWNoIHJlc29sdmVzIGFzIFwiJGNvbXBsZXRlXCIsIGlzIG5vdCBmb3VuZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhlIHBhdGggb2YgRk9VTkRfTUFLRSwgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkY29tcGxldGVcIiwgaXMgbm90IGZvdW5kLiIgPiY2O30KKyAgICAgICAgaGFzX3NwYWNlPWAkRUNITyAiJGNvbXBsZXRlIiB8ICRHUkVQICIgImAKKyAgICAgICAgaWYgdGVzdCAieCRoYXNfc3BhY2UiICE9IHg7IHRoZW4KKyAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoaXMgbWlnaHQgYmUgY2F1c2VkIGJ5IHNwYWNlcyBpbiB0aGUgcGF0aCwgd2hpY2ggaXMgbm90IGFsbG93ZWQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoaXMgbWlnaHQgYmUgY2F1c2VkIGJ5IHNwYWNlcyBpbiB0aGUgcGF0aCwgd2hpY2ggaXMgbm90IGFsbG93ZWQuIiA+JjY7fQorICAgICAgICBmaQorICAgICAgICBhc19mbl9lcnJvciAkPyAiQ2Fubm90IGxvY2F0ZSB0aGUgdGhlIHBhdGggb2YgRk9VTkRfTUFLRSIgIiRMSU5FTk8iIDUKKyAgICAgIGZpCisgICAgZmkKKyAgZmkKKworICAjIE5vdyBqb2luIHRvZ2V0aGVyIHRoZSBwYXRoIGFuZCB0aGUgYXJndW1lbnRzIG9uY2UgYWdhaW4KKyAgaWYgdGVzdCAieCRhcmd1bWVudHMiICE9IHhFT0w7IHRoZW4KKyAgICAgIG5ld19jb21wbGV0ZT0iJG5ld19wYXRoICR7YXJndW1lbnRzJSAqfSIKKyAgZWxzZQorICAgICAgbmV3X2NvbXBsZXRlPSIkbmV3X3BhdGgiCisgIGZpCisKKyAgaWYgdGVzdCAieCRjb21wbGV0ZSIgIT0gIngkbmV3X2NvbXBsZXRlIjsgdGhlbgorICAgIEZPVU5EX01BS0U9IiRuZXdfY29tcGxldGUiCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBSZXdyaXRpbmcgRk9VTkRfTUFLRSB0byBcIiRuZXdfY29tcGxldGVcIiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBSZXdyaXRpbmcgRk9VTkRfTUFLRSB0byBcIiRuZXdfY29tcGxldGVcIiIgPiY2O30KKyAgZmkKKworICAgICAgICBmaQorICAgICAgZmkKKyAgICBmaQorICBmaQorCisgICAgICAgIGZpCisgICAgICAgIFBBVEg9JE9MRF9QQVRICisgICAgICBmaQorICAgIGZpCisKKyAgICBpZiB0ZXN0ICJ4JEZPVU5EX01BS0UiID0geDsgdGhlbgorICAgICAgYXNfZm5fZXJyb3IgJD8gIkNhbm5vdCBmaW5kIEdOVSBtYWtlIDMuODEgb3IgbmV3ZXIhIFBsZWFzZSBwdXQgaXQgaW4gdGhlIHBhdGgsIG9yIGFkZCBlLmcuIE1BS0U9L29wdC9nbWFrZTMuODEvbWFrZSBhcyBhcmd1bWVudCB0byBjb25maWd1cmUuIiAiJExJTkVOTyIgNQorICAgIGZpCisgIGZpCisKKyAgTUFLRT0kRk9VTkRfTUFLRQorCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVXNpbmcgR05VIG1ha2UgMy44MSAob3IgbGF0ZXIpIGF0ICRGT1VORF9NQUtFICh2ZXJzaW9uOiAkTUFLRV9WRVJTSU9OX1NUUklORykiID4mNQorJGFzX2VjaG8gIiRhc19tZTogVXNpbmcgR05VIG1ha2UgMy44MSAob3IgbGF0ZXIpIGF0ICRGT1VORF9NQUtFICh2ZXJzaW9uOiAkTUFLRV9WRVJTSU9OX1NUUklORykiID4mNjt9CisKKworCisgICAgIyBUZXN0IGlmIGZpbmQgc3VwcG9ydHMgLWRlbGV0ZQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgZmluZCBzdXBwb3J0cyAtZGVsZXRlIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGlmIGZpbmQgc3VwcG9ydHMgLWRlbGV0ZS4uLiAiID4mNjsgfQorICAgIEZJTkRfREVMRVRFPSItZGVsZXRlIgorCisgICAgREVMRVRFRElSPWAkTUtURU1QIC1kIHRtcC5YWFhYWFhYWFhYYCB8fCAoZWNobyBDb3VsZCBub3QgY3JlYXRlIHRlbXBvcmFyeSBkaXJlY3RvcnkhOyBleGl0ICQ/KQorCisgICAgZWNobyBIZWpzYW4gPiAkREVMRVRFRElSL1Rlc3RJZkZpbmRTdXBwb3J0c0RlbGV0ZQorCisgICAgVEVTVF9ERUxFVEU9YCRGSU5EICIkREVMRVRFRElSIiAtbmFtZSBUZXN0SWZGaW5kU3VwcG9ydHNEZWxldGUgJEZJTkRfREVMRVRFIDI+JjFgCisgICAgaWYgdGVzdCAtZiAkREVMRVRFRElSL1Rlc3RJZkZpbmRTdXBwb3J0c0RlbGV0ZTsgdGhlbgorICAgICAgICAjIE5vLCBpdCBkb2VzIG5vdC4KKyAgICAgICAgcm0gJERFTEVURURJUi9UZXN0SWZGaW5kU3VwcG9ydHNEZWxldGUKKyAgICAgICAgRklORF9ERUxFVEU9Ii1leGVjIHJtIFx7XH0gXCsiCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorICAgIGVsc2UKKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KKyAgICBmaQorICAgIHJtZGlyICRERUxFVEVESVIKKworCisKKyMgVGhlc2UgdG9vbHMgbWlnaHQgbm90IGJlIGluc3RhbGxlZCBieSBkZWZhdWx0LAorIyBuZWVkIGhpbnQgb24gaG93IHRvIGluc3RhbGwgdGhlbS4KKworICAgIGZvciBhY19wcm9nIGluIHVuemlwCitkbworICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3BhdGhfVU5aSVArc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXNlICRVTlpJUCBpbgorICBbXFwvXSogfCA/OltcXC9dKikKKyAgYWNfY3ZfcGF0aF9VTlpJUD0iJFVOWklQIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcGF0aF9VTlpJUD0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworICA7OworZXNhYworZmkKK1VOWklQPSRhY19jdl9wYXRoX1VOWklQCitpZiB0ZXN0IC1uICIkVU5aSVAiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkVU5aSVAiID4mNQorJGFzX2VjaG8gIiRVTlpJUCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCisgIHRlc3QgLW4gIiRVTlpJUCIgJiYgYnJlYWsKK2RvbmUKKworCisgICAgaWYgdGVzdCAieCRVTlpJUCIgPSB4OyB0aGVuCisgICAgICAgIGlmIHRlc3QgInh1bnppcCIgPSB4OyB0aGVuCisgICAgICAgICAgUFJPR19OQU1FPXVuemlwCisgICAgICAgIGVsc2UKKyAgICAgICAgICBQUk9HX05BTUU9dW56aXAKKyAgICAgICAgZmkKKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBDb3VsZCBub3QgZmluZCAkUFJPR19OQU1FISIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBDb3VsZCBub3QgZmluZCAkUFJPR19OQU1FISIgPiY2O30KKyAgICAgICAgYXNfZm5fZXJyb3IgJD8gIkNhbm5vdCBjb250aW51ZSIgIiRMSU5FTk8iIDUKKyAgICBmaQorCisKKworICAgIGZvciBhY19wcm9nIGluIHppcAorZG8KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9wYXRoX1pJUCtzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhc2UgJFpJUCBpbgorICBbXFwvXSogfCA/OltcXC9dKikKKyAgYWNfY3ZfcGF0aF9aSVA9IiRaSVAiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wYXRoX1pJUD0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworICA7OworZXNhYworZmkKK1pJUD0kYWNfY3ZfcGF0aF9aSVAKK2lmIHRlc3QgLW4gIiRaSVAiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkWklQIiA+JjUKKyRhc19lY2hvICIkWklQIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKyAgdGVzdCAtbiAiJFpJUCIgJiYgYnJlYWsKK2RvbmUKKworCisgICAgaWYgdGVzdCAieCRaSVAiID0geDsgdGhlbgorICAgICAgICBpZiB0ZXN0ICJ4emlwIiA9IHg7IHRoZW4KKyAgICAgICAgICBQUk9HX05BTUU9emlwCisgICAgICAgIGVsc2UKKyAgICAgICAgICBQUk9HX05BTUU9emlwCisgICAgICAgIGZpCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogQ291bGQgbm90IGZpbmQgJFBST0dfTkFNRSEiID4mNQorJGFzX2VjaG8gIiRhc19tZTogQ291bGQgbm90IGZpbmQgJFBST0dfTkFNRSEiID4mNjt9CisgICAgICAgIGFzX2ZuX2Vycm9yICQ/ICJDYW5ub3QgY29udGludWUiICIkTElORU5PIiA1CisgICAgZmkKKworCisKKyMgTm9uLXJlcXVpcmVkIGJhc2ljIHRvb2xzCisKKyMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibGRkIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBsZGQ7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9wYXRoX0xERCtzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhc2UgJExERCBpbgorICBbXFwvXSogfCA/OltcXC9dKikKKyAgYWNfY3ZfcGF0aF9MREQ9IiRMREQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wYXRoX0xERD0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworICA7OworZXNhYworZmkKK0xERD0kYWNfY3ZfcGF0aF9MREQKK2lmIHRlc3QgLW4gIiRMREQiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkTEREIiA+JjUKKyRhc19lY2hvICIkTEREIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKK2lmIHRlc3QgIngkTEREIiA9ICJ4IjsgdGhlbgorICAgICMgTGlzdCBzaGFyZWQgbGliIGRlcGVuZGVuY2llcyBpcyB1c2VkIGZvcgorICAgICMgZGVidWcgb3V0cHV0IGFuZCBjaGVja2luZyBmb3IgZm9yYmlkZGVuIGRlcGVuZGVuY2llcy4KKyAgICAjIFdlIGNhbiBidWlsZCB3aXRob3V0IGl0LgorICAgIExERD0idHJ1ZSIKK2ZpCisjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm90b29sIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBvdG9vbDsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3BhdGhfT1RPT0wrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXNlICRPVE9PTCBpbgorICBbXFwvXSogfCA/OltcXC9dKikKKyAgYWNfY3ZfcGF0aF9PVE9PTD0iJE9UT09MIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcGF0aF9PVE9PTD0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworICA7OworZXNhYworZmkKK09UT09MPSRhY19jdl9wYXRoX09UT09MCitpZiB0ZXN0IC1uICIkT1RPT0wiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkT1RPT0wiID4mNQorJGFzX2VjaG8gIiRPVE9PTCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCitpZiB0ZXN0ICJ4JE9UT09MIiA9ICJ4IjsgdGhlbgorICAgT1RPT0w9InRydWUiCitmaQorZm9yIGFjX3Byb2cgaW4gcmVhZGVsZiBncmVhZGVsZgorZG8KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9wYXRoX1JFQURFTEYrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXNlICRSRUFERUxGIGluCisgIFtcXC9dKiB8ID86W1xcL10qKQorICBhY19jdl9wYXRoX1JFQURFTEY9IiRSRUFERUxGIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcGF0aF9SRUFERUxGPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCisgIDs7Citlc2FjCitmaQorUkVBREVMRj0kYWNfY3ZfcGF0aF9SRUFERUxGCitpZiB0ZXN0IC1uICIkUkVBREVMRiI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRSRUFERUxGIiA+JjUKKyRhc19lY2hvICIkUkVBREVMRiIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCisgIHRlc3QgLW4gIiRSRUFERUxGIiAmJiBicmVhaworZG9uZQorCisjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImhnIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBoZzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3BhdGhfSEcrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXNlICRIRyBpbgorICBbXFwvXSogfCA/OltcXC9dKikKKyAgYWNfY3ZfcGF0aF9IRz0iJEhHIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcGF0aF9IRz0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworICA7OworZXNhYworZmkKK0hHPSRhY19jdl9wYXRoX0hHCitpZiB0ZXN0IC1uICIkSEciOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkSEciID4mNQorJGFzX2VjaG8gIiRIRyIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCisjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInN0YXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IHN0YXQ7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9wYXRoX1NUQVQrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXNlICRTVEFUIGluCisgIFtcXC9dKiB8ID86W1xcL10qKQorICBhY19jdl9wYXRoX1NUQVQ9IiRTVEFUIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcGF0aF9TVEFUPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCisgIDs7Citlc2FjCitmaQorU1RBVD0kYWNfY3ZfcGF0aF9TVEFUCitpZiB0ZXN0IC1uICIkU1RBVCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRTVEFUIiA+JjUKKyRhc19lY2hvICIkU1RBVCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCisjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInRpbWUiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IHRpbWU7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9wYXRoX1RJTUUrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXNlICRUSU1FIGluCisgIFtcXC9dKiB8ID86W1xcL10qKQorICBhY19jdl9wYXRoX1RJTUU9IiRUSU1FIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcGF0aF9USU1FPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCisgIDs7Citlc2FjCitmaQorVElNRT0kYWNfY3ZfcGF0aF9USU1FCitpZiB0ZXN0IC1uICIkVElNRSI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRUSU1FIiA+JjUKKyRhc19lY2hvICIkVElNRSIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCisKK2lmIHRlc3QgIngkT1BFTkpES19UQVJHRVRfT1MiID0gInh3aW5kb3dzIjsgdGhlbgorCisgICAgZm9yIGFjX3Byb2cgaW4gY29tbQorZG8KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9wYXRoX0NPTU0rc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXNlICRDT01NIGluCisgIFtcXC9dKiB8ID86W1xcL10qKQorICBhY19jdl9wYXRoX0NPTU09IiRDT01NIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcGF0aF9DT01NPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCisgIDs7Citlc2FjCitmaQorQ09NTT0kYWNfY3ZfcGF0aF9DT01NCitpZiB0ZXN0IC1uICIkQ09NTSI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRDT01NIiA+JjUKKyRhc19lY2hvICIkQ09NTSIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCisgIHRlc3QgLW4gIiRDT01NIiAmJiBicmVhaworZG9uZQorCisKKyAgICBpZiB0ZXN0ICJ4JENPTU0iID0geDsgdGhlbgorICAgICAgICBpZiB0ZXN0ICJ4Y29tbSIgPSB4OyB0aGVuCisgICAgICAgICAgUFJPR19OQU1FPWNvbW0KKyAgICAgICAgZWxzZQorICAgICAgICAgIFBST0dfTkFNRT1jb21tCisgICAgICAgIGZpCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogQ291bGQgbm90IGZpbmQgJFBST0dfTkFNRSEiID4mNQorJGFzX2VjaG8gIiRhc19tZTogQ291bGQgbm90IGZpbmQgJFBST0dfTkFNRSEiID4mNjt9CisgICAgICAgIGFzX2ZuX2Vycm9yICQ/ICJDYW5ub3QgY29udGludWUiICIkTElORU5PIiA1CisgICAgZmkKKworCitmaQorCisKKyMgQ2hlY2sgaWYgcGtnLWNvbmZpZyBpcyBhdmFpbGFibGUuCisKKworaWYgdGVzdCAieCRhY19jdl9lbnZfUEtHX0NPTkZJR19zZXQiICE9ICJ4c2V0IjsgdGhlbgorCWlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fXBrZy1jb25maWciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9cGtnLWNvbmZpZzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3BhdGhfUEtHX0NPTkZJRytzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhc2UgJFBLR19DT05GSUcgaW4KKyAgW1xcL10qIHwgPzpbXFwvXSopCisgIGFjX2N2X3BhdGhfUEtHX0NPTkZJRz0iJFBLR19DT05GSUciICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wYXRoX1BLR19DT05GSUc9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKKyAgOzsKK2VzYWMKK2ZpCitQS0dfQ09ORklHPSRhY19jdl9wYXRoX1BLR19DT05GSUcKK2lmIHRlc3QgLW4gIiRQS0dfQ09ORklHIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFBLR19DT05GSUciID4mNQorJGFzX2VjaG8gIiRQS0dfQ09ORklHIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKK2ZpCitpZiB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9QS0dfQ09ORklHIjsgdGhlbgorICBhY19wdF9QS0dfQ09ORklHPSRQS0dfQ09ORklHCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicGtnLWNvbmZpZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgcGtnLWNvbmZpZzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3BhdGhfYWNfcHRfUEtHX0NPTkZJRytzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhc2UgJGFjX3B0X1BLR19DT05GSUcgaW4KKyAgW1xcL10qIHwgPzpbXFwvXSopCisgIGFjX2N2X3BhdGhfYWNfcHRfUEtHX0NPTkZJRz0iJGFjX3B0X1BLR19DT05GSUciICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICA7OworICAqKQorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wYXRoX2FjX3B0X1BLR19DT05GSUc9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKKyAgOzsKK2VzYWMKK2ZpCithY19wdF9QS0dfQ09ORklHPSRhY19jdl9wYXRoX2FjX3B0X1BLR19DT05GSUcKK2lmIHRlc3QgLW4gIiRhY19wdF9QS0dfQ09ORklHIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3B0X1BLR19DT05GSUciID4mNQorJGFzX2VjaG8gIiRhY19wdF9QS0dfQ09ORklHIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisgIGlmIHRlc3QgIngkYWNfcHRfUEtHX0NPTkZJRyIgPSB4OyB0aGVuCisgICAgUEtHX0NPTkZJRz0iIgorICBlbHNlCisgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoreWVzOikKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KK2FjX3Rvb2xfd2FybmVkPXllcyA7OworZXNhYworICAgIFBLR19DT05GSUc9JGFjX3B0X1BLR19DT05GSUcKKyAgZmkKK2Vsc2UKKyAgUEtHX0NPTkZJRz0iJGFjX2N2X3BhdGhfUEtHX0NPTkZJRyIKK2ZpCisKK2ZpCitpZiB0ZXN0IC1uICIkUEtHX0NPTkZJRyI7IHRoZW4KKwlfcGtnX21pbl92ZXJzaW9uPTAuOS4wCisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBwa2ctY29uZmlnIGlzIGF0IGxlYXN0IHZlcnNpb24gJF9wa2dfbWluX3ZlcnNpb24iID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgcGtnLWNvbmZpZyBpcyBhdCBsZWFzdCB2ZXJzaW9uICRfcGtnX21pbl92ZXJzaW9uLi4uICIgPiY2OyB9CisJaWYgJFBLR19DT05GSUcgLS1hdGxlYXN0LXBrZ2NvbmZpZy12ZXJzaW9uICRfcGtnX21pbl92ZXJzaW9uOyB0aGVuCisJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CisJZWxzZQorCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KKwkJUEtHX0NPTkZJRz0iIgorCWZpCisKK2ZpCisKKyMgQWZ0ZXIgYmFzaWMgdG9vbHMgaGF2ZSBiZWVuIHNldHVwLCB3ZSBjYW4gY2hlY2sgYnVpbGQgb3Mgc3BlY2lmaWMgZGV0YWlscy4KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIE5vdGUgdGhhdCB0aGlzIGlzIHRoZSBidWlsZCBwbGF0Zm9ybSBPUyB2ZXJzaW9uIQorCitPU19WRVJTSU9OPSJgdW5hbWUgLXIgfCAke1NFRH0gJ3MhXC4hICFnJyB8ICR7U0VEfSAncyEtISAhZydgIgorT1NfVkVSU0lPTl9NQUpPUj0iYCR7RUNIT30gJHtPU19WRVJTSU9OfSB8ICR7Q1VUfSAtZiAxIC1kICcgJ2AiCitPU19WRVJTSU9OX01JTk9SPSJgJHtFQ0hPfSAke09TX1ZFUlNJT059IHwgJHtDVVR9IC1mIDIgLWQgJyAnYCIKK09TX1ZFUlNJT05fTUlDUk89ImAke0VDSE99ICR7T1NfVkVSU0lPTn0gfCAke0NVVH0gLWYgMyAtZCAnICdgIgorCisKKworCisKKyMgU2V0dXAgYnVpbGRkZXBzLCBmb3IgYXV0b21hdGljIGRvd25sb2FkaW5nIG9mIHRvb2xzIHdlIG5lZWQuCisjIFRoaXMgaXMgbmVlZGVkIGJlZm9yZSB3ZSBjYW4gY2FsbCBCREVQU19DSEVDS19NT0RVTEUsIHdoaWNoIGlzIGRvbmUgaW4KKyMgYm9vdC1qZGsgc2V0dXAsIGJ1dCB3ZSBuZWVkIHRvIGhhdmUgYmFzaWMgdG9vbHMgc2V0dXAgZmlyc3QuCisKKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC1idWlsZGRlcHMtY29uZiB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfYnVpbGRkZXBzX2NvbmYrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICB3aXRodmFsPSR3aXRoX2J1aWxkZGVwc19jb25mOworZmkKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtYnVpbGRkZXBzLXNlcnZlciB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfYnVpbGRkZXBzX3NlcnZlcitzZXR9IiA9IHNldDsgdGhlbiA6CisgIHdpdGh2YWw9JHdpdGhfYnVpbGRkZXBzX3NlcnZlcjsKK2ZpCisKKworCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLWJ1aWxkZGVwcy1kaXIgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX2J1aWxkZGVwc19kaXIrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICB3aXRodmFsPSR3aXRoX2J1aWxkZGVwc19kaXI7CitlbHNlCisgIHdpdGhfYnVpbGRkZXBzX2Rpcj0vbG9jYWxob21lL2J1aWxkZGVwcworZmkKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtYnVpbGRkZXBzLWdyb3VwIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9idWlsZGRlcHNfZ3JvdXArc2V0fSIgPSBzZXQ7IHRoZW4gOgorICB3aXRodmFsPSR3aXRoX2J1aWxkZGVwc19ncm91cDsKK2ZpCisKKworCisKKyAgICBpZiB0ZXN0ICJ4JHdpdGhfYnVpbGRkZXBzX3NlcnZlciIgIT0geCB8fCB0ZXN0ICJ4JHdpdGhfYnVpbGRkZXBzX2NvbmYiICE9IHg7IHRoZW4KKyAgICAgICAgaWYgdGVzdCAieCR3aXRoX2J1aWxkZGVwc19jb25mIiAhPSB4OyB0aGVuCisgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBzdXBwbGllZCBidWlsZGRlcHMgY29uZmlndXJhdGlvbiBmaWxlIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBzdXBwbGllZCBidWlsZGRlcHMgY29uZmlndXJhdGlvbiBmaWxlLi4uICIgPiY2OyB9CisgICAgICAgICAgICBidWlsZGRlcHNmaWxlPSR3aXRoX2J1aWxkZGVwc19jb25mCisgICAgICAgICAgICBpZiB0ZXN0IC1zICRidWlsZGRlcHNmaWxlOyB0aGVuCisgICAgICAgICAgICAgICAgLiAkYnVpbGRkZXBzZmlsZQorICAgICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBsb2FkZWQhIiA+JjUKKyRhc19lY2hvICJsb2FkZWQhIiA+JjY7IH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgIGFzX2ZuX2Vycm9yICQ/ICJUaGUgZ2l2ZW4gYnVpbGRkZXBzIGNvbmYgZmlsZSAkd2l0aF9idWlsZGRlcHNfY29uZiBjb3VsZCBub3QgYmUgbG9hZGVkISIgIiRMSU5FTk8iIDUKKyAgICAgICAgICAgZmkKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgYnVpbGRkZXBzLmNvbmYgZmlsZXMgaW4gc291cmNlcy4uLiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgYnVpbGRkZXBzLmNvbmYgZmlsZXMgaW4gc291cmNlcy4uLi4uLiAiID4mNjsgfQorICAgICAgICAgICAgYnVpbGRkZXBzZmlsZT1gbWt0ZW1wYAorICAgICAgICAgICAgdG91Y2ggJGJ1aWxkZGVwc2ZpbGUKKyAgICAgICAgICAgICMgUHV0IGFsbCBmb3VuZCBjb25mcyBpbnRvIGEgc2luZ2xlIGZpbGUuCisgICAgICAgICAgICBmaW5kICR7U1JDX1JPT1R9IC1uYW1lIGJ1aWxkZGVwcy5jb25mIC1leGVjIGNhdCBce1x9IFw7ID4+ICRidWlsZGRlcHNmaWxlCisgICAgICAgICAgICAjIFNvdXJjZSB0aGUgZmlsZSB0byBhY3F1aXJlIHRoZSB2YXJpYWJsZXMKKyAgICAgICAgICAgIGlmIHRlc3QgLXMgJGJ1aWxkZGVwc2ZpbGU7IHRoZW4KKyAgICAgICAgICAgICAgICAuICRidWlsZGRlcHNmaWxlCisgICAgICAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IGZvdW5kIGF0IGxlYXN0IG9uZSEiID4mNQorJGFzX2VjaG8gImZvdW5kIGF0IGxlYXN0IG9uZSEiID4mNjsgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgYXNfZm5fZXJyb3IgJD8gIkNvdWxkIG5vdCBmaW5kIGFueSBidWlsZGRlcHMuY29uZiBhdCBhbGwhIiAiJExJTkVOTyIgNQorICAgICAgICAgICBmaQorICAgICAgICBmaQorICAgICAgICAjIENyZWF0ZSBidWlsZCBhbmQgdGFyZ2V0IG5hbWVzIHRoYXQgdXNlIF8gaW5zdGVhZCBvZiAiLSIgYW5kICIuIi4KKyAgICAgICAgIyBUaGlzIGlzIG5lY2Vzc2FyeSB0byB1c2UgdGhlbSBpbiB2YXJpYWJsZSBuYW1lcy4KKyAgICAgICAgYnVpbGRfdmFyPWBlY2hvICR7T1BFTkpES19CVUlMRF9BVVRPQ09ORl9OQU1FfSB8IHRyICctJyAnXycgfCB0ciAnLicgJ18nYAorICAgICAgICB0YXJnZXRfdmFyPWBlY2hvICR7T1BFTkpES19UQVJHRVRfQVVUT0NPTkZfTkFNRX0gfCB0ciAnLScgJ18nIHwgdHIgJy4nICdfJ2AKKyAgICAgICAgIyBFeHRyYWN0IHJld3JpdGUgaW5mb3JtYXRpb24gZm9yIGJ1aWxkIGFuZCB0YXJnZXQKKyAgICAgICAgZXZhbCByZXdyaXR0ZW5fYnVpbGQ9XCR7UkVXUklURV8ke2J1aWxkX3Zhcn19CisgICAgICAgIGlmIHRlc3QgIngkcmV3cml0dGVuX2J1aWxkIiA9IHg7IHRoZW4KKyAgICAgICAgICAgIHJld3JpdHRlbl9idWlsZD0ke09QRU5KREtfQlVJTERfQVVUT0NPTkZfTkFNRX0KKyAgICAgICAgICAgIGVjaG8gQnVpbGQgc3RheXMgdGhlIHNhbWUgJHJld3JpdHRlbl9idWlsZAorICAgICAgICBlbHNlCisgICAgICAgICAgICBlY2hvIFJld3JpdGluZyBidWlsZCBmb3IgYnVpbGRkZXBzIGludG8gJHJld3JpdHRlbl9idWlsZAorICAgICAgICBmaQorICAgICAgICBldmFsIHJld3JpdHRlbl90YXJnZXQ9XCR7UkVXUklURV8ke3RhcmdldF92YXJ9fQorICAgICAgICBpZiB0ZXN0ICJ4JHJld3JpdHRlbl90YXJnZXQiID0geDsgdGhlbgorICAgICAgICAgICAgcmV3cml0dGVuX3RhcmdldD0ke09QRU5KREtfVEFSR0VUX0FVVE9DT05GX05BTUV9CisgICAgICAgICAgICBlY2hvIFRhcmdldCBzdGF5cyB0aGUgc2FtZSAkcmV3cml0dGVuX3RhcmdldAorICAgICAgICBlbHNlCisgICAgICAgICAgICBlY2hvIFJld3JpdGluZyB0YXJnZXQgZm9yIGJ1aWxkZGVwcyBpbnRvICRyZXdyaXR0ZW5fdGFyZ2V0CisgICAgICAgIGZpCisgICAgICAgIHJld3JpdHRlbl9idWlsZF92YXI9YGVjaG8gJHtyZXdyaXR0ZW5fYnVpbGR9IHwgdHIgJy0nICdfJyB8IHRyICcuJyAnXydgCisgICAgICAgIHJld3JpdHRlbl90YXJnZXRfdmFyPWBlY2hvICR7cmV3cml0dGVuX3RhcmdldH0gfCB0ciAnLScgJ18nIHwgdHIgJy4nICdfJ2AKKyAgICBmaQorICAgIGZvciBhY19wcm9nIGluIDd6IHVuemlwCitkbworICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfQkRFUFNfVU5aSVArc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQkRFUFNfVU5aSVAiOyB0aGVuCisgIGFjX2N2X3Byb2dfQkRFUFNfVU5aSVA9IiRCREVQU19VTlpJUCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX0JERVBTX1VOWklQPSIkYWNfcHJvZyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitCREVQU19VTlpJUD0kYWNfY3ZfcHJvZ19CREVQU19VTlpJUAoraWYgdGVzdCAtbiAiJEJERVBTX1VOWklQIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJEJERVBTX1VOWklQIiA+JjUKKyRhc19lY2hvICIkQkRFUFNfVU5aSVAiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworICB0ZXN0IC1uICIkQkRFUFNfVU5aSVAiICYmIGJyZWFrCitkb25lCisKKyAgICBpZiB0ZXN0ICJ4JEJERVBTX1VOWklQIiA9IHg3ejsgdGhlbgorICAgICAgICBCREVQU19VTlpJUD0iN3ogeCIKKyAgICBmaQorCisgICAgZm9yIGFjX3Byb2cgaW4gd2dldCBsZnRwIGZ0cAorZG8KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9wcm9nX0JERVBTX0ZUUCtzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRCREVQU19GVFAiOyB0aGVuCisgIGFjX2N2X3Byb2dfQkRFUFNfRlRQPSIkQkRFUFNfRlRQIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfQkRFUFNfRlRQPSIkYWNfcHJvZyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitCREVQU19GVFA9JGFjX2N2X3Byb2dfQkRFUFNfRlRQCitpZiB0ZXN0IC1uICIkQkRFUFNfRlRQIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJEJERVBTX0ZUUCIgPiY1CiskYXNfZWNobyAiJEJERVBTX0ZUUCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCisgIHRlc3QgLW4gIiRCREVQU19GVFAiICYmIGJyZWFrCitkb25lCisKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIERldGVybWluZSBPcGVuSkRLIHZhcmlhbnRzLCBvcHRpb25zIGFuZCB2ZXJzaW9uIG51bWJlcnMuCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgV2UgbmVlZCBidWlsZCAmIHRhcmdldCBmb3IgdGhpcy4KKwogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjCkBAIC04MTU5LDQ2ICsxMDI0OSw0OSBAQAogIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW9wZW5qZGstb25seSB3YXMgZ2l2ZW4uCiBpZiB0ZXN0ICIke2VuYWJsZV9vcGVuamRrX29ubHkrc2V0fSIgPSBzZXQ7IHRoZW4gOgogICBlbmFibGV2YWw9JGVuYWJsZV9vcGVuamRrX29ubHk7CitlbHNlCisgIGVuYWJsZV9vcGVuamRrX29ubHk9Im5vIgogZmkKIAogCi1pZiB0ZXN0ICJ4JGVuYWJsZV9vcGVuamRrX29ubHkiID0gInh5ZXMiOyB0aGVuCi0gICAgT1BFTkpESz10cnVlCi1lbGlmIHRlc3QgIngkZW5hYmxlX29wZW5qZGtfb25seSIgPSAieG5vIjsgdGhlbgotICAgIE9QRU5KREs9ZmFsc2UKLWVsaWYgdGVzdCAtZCAiJFNSQ19ST09UL2pkay9zcmMvY2xvc2VkIjsgdGhlbgotICAgIE9QRU5KREs9ZmFsc2UKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHByZXNlbmNlIG9mIGNsb3NlZCBzb3VyY2VzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBwcmVzZW5jZSBvZiBjbG9zZWQgc291cmNlcy4uLiAiID4mNjsgfQoraWYgdGVzdCAtZCAiJFNSQ19ST09UL2pkay9zcmMvY2xvc2VkIjsgdGhlbgorICAgIENMT1NFRF9TT1VSQ0VfUFJFU0VOVD15ZXMKIGVsc2UKKyAgICBDTE9TRURfU09VUkNFX1BSRVNFTlQ9bm8KK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJENMT1NFRF9TT1VSQ0VfUFJFU0VOVCIgPiY1CiskYXNfZWNobyAiJENMT1NFRF9TT1VSQ0VfUFJFU0VOVCIgPiY2OyB9CisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgY2xvc2VkIHNvdXJjZSBpcyBzdXByZXNzZWQgKG9wZW5qZGstb25seSkiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgY2xvc2VkIHNvdXJjZSBpcyBzdXByZXNzZWQgKG9wZW5qZGstb25seSkuLi4gIiA+JjY7IH0KK1NVUFJFU1NfQ0xPU0VEX1NPVVJDRT0iJGVuYWJsZV9vcGVuamRrX29ubHkiCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFNVUFJFU1NfQ0xPU0VEX1NPVVJDRSIgPiY1CiskYXNfZWNobyAiJFNVUFJFU1NfQ0xPU0VEX1NPVVJDRSIgPiY2OyB9CisKK2lmIHRlc3QgIngkQ0xPU0VEX1NPVVJDRV9QUkVTRU5UIiA9IHhubzsgdGhlbgorICBPUEVOSkRLPXRydWUKKyAgaWYgdGVzdCAieCRTVVBSRVNTX0NMT1NFRF9TT1VSQ0UiID0gInh5ZXMiOyB0aGVuCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBObyBjbG9zZWQgc291cmNlIHByZXNlbnQsIC0tZW5hYmxlLW9wZW5qZGstb25seSBtYWtlcyBubyBzZW5zZSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBObyBjbG9zZWQgc291cmNlIHByZXNlbnQsIC0tZW5hYmxlLW9wZW5qZGstb25seSBtYWtlcyBubyBzZW5zZSIgPiYyO30KKyAgZmkKK2Vsc2UKKyAgaWYgdGVzdCAieCRTVVBSRVNTX0NMT1NFRF9TT1VSQ0UiID0gInh5ZXMiOyB0aGVuCiAgICAgT1BFTkpESz10cnVlCisgIGVsc2UKKyAgICBPUEVOSkRLPWZhbHNlCisgIGZpCiBmaQogCiBpZiB0ZXN0ICJ4JE9QRU5KREsiID0gInh0cnVlIjsgdGhlbgotICAgIFNFVF9PUEVOSkRLPU9QRU5KREs9dHJ1ZQorICAgIFNFVF9PUEVOSkRLPSJPUEVOSkRLPXRydWUiCiBmaQogCiAKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIwotIyBKSUdTQVcgb3Igbm90LiAgVGhlIEpJR1NBVyB2YXJpYWJsZSBpcyB1c2VkIGR1cmluZyB0aGUgaW50ZXJtZWRpYXRlCi0jIHN0YWdlIHdoZW4gd2UgYXJlIGJ1aWxkaW5nIGJvdGggdGhlIG9sZCBzdHlsZSBKREsgYW5kIHRoZSBuZXcgc3R5bGUgbW9kdWxhcml6ZWQgSkRLLgotIyBXaGVuIHRoZSBtb2R1bGFyaXplZCBKREsgaXMgZmluYWxpemVkLCB0aGlzIG9wdGlvbiB3aWxsIGdvIGF3YXkuCi0jCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtamlnc2F3IHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX2ppZ3NhdytzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIGVuYWJsZXZhbD0kZW5hYmxlX2ppZ3NhdzsKLWZpCi0KLQotaWYgdGVzdCAieCRlbmFibGVfamlnc2F3IiA9ICJ4eWVzIjsgdGhlbgotICAgIEpJR1NBVz10cnVlCi1lbHNlCi0gICAgSklHU0FXPWZhbHNlCi1maQotCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKICMgU2hvdWxkIHdlIGJ1aWxkIGEgSkRLL0pWTSB3aXRoIGhlYWRmdWwgc3VwcG9ydCAoaWUgYSBncmFwaGljYWwgdWkpPwogIyBXZSBhbHdheXMgYnVpbGQgaGVhZGxlc3Mgc3VwcG9ydC4KICMKQEAgLTgyMzMsMjggKzEwMzI2LDYgQEAKIAogCiAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgU2hvdWxkIHdlIGNvbXBpbGUgbmltYnVzIHN3aW5nIEwmRj8gV2UgY2FuIHByb2JhYmx5IHJlbW92ZSB0aGlzIG9wdGlvbgotIyBzaW5jZSBuaW1idXMgaXMgb2ZmaWNpYWxseSBwYXJ0IG9mIGphdmF4IG5vdy4KLSMKLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBuaW1idXMgTCZGIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgbmltYnVzIEwmRi4uLiAiID4mNjsgfQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW5pbWJ1cyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9uaW1idXMrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICBlbmFibGV2YWw9JGVuYWJsZV9uaW1idXM7IEVOQUJMRV9OSU1CVVM9IiR7ZW5hYmxldmFsfSIKLWVsc2UKLSAgRU5BQkxFX05JTUJVUz0neWVzJwotZmkKLQoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRFTkFCTEVfTklNQlVTIiA+JjUKLSRhc19lY2hvICIkRU5BQkxFX05JTUJVUyIgPiY2OyB9Ci1ESVNBQkxFX05JTUJVUz0KLWlmIHRlc3QgIngkRU5BQkxFX05JTUJVUyIgPSB4bm87IHRoZW4KLSAgICBESVNBQkxFX05JTUJVUz10cnVlCi1maQotCi0KICMgQ29udHJvbCB3ZXRoZXIgSG90c3BvdCBydW5zIFF1ZWVucyB0ZXN0IGFmdGVyIGJ1aWxkLgogIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWhvdHNwb3QtdGVzdC1pbi1idWlsZCB3YXMgZ2l2ZW4uCiBpZiB0ZXN0ICIke2VuYWJsZV9ob3RzcG90X3Rlc3RfaW5fYnVpbGQrc2V0fSIgPSBzZXQ7IHRoZW4gOgpAQCAtODI5Myw0NSArMTAzNjQsMjcgQEAKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIwotIyBDb21wcmVzcyBqYXJzCisjIEVuYWJsZSBvciBkaXNhYmxlIHVubGltaXRlZCBjcnlwdG8KICMKLUNPTVBSRVNTX0pBUlM9ZmFsc2UKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS11bmxpbWl0ZWQtY3J5cHRvIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3VubGltaXRlZF9jcnlwdG8rc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV91bmxpbWl0ZWRfY3J5cHRvOworZWxzZQorICBlbmFibGVfdW5saW1pdGVkX2NyeXB0bz1ubworZmkKIAoraWYgdGVzdCAieCRlbmFibGVfdW5saW1pdGVkX2NyeXB0byIgPSAieHllcyI7IHRoZW4KKyAgICBVTkxJTUlURURfQ1JZUFRPPXRydWUKK2Vsc2UKKyAgICBVTkxJTUlURURfQ1JZUFRPPWZhbHNlCitmaQogCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMKLSMgU2hvdWxkIHdlIGNvbXBpbGUgSkZSCi0jICAgZGVmYXVsdCBubywgZXhjZXB0IGZvciBvbiBjbG9zZWQtamRrCisjIENvbXByZXNzIGphcnMKICMKLUVOQUJMRV9KRlI9bm8KLQotIyBJcyB0aGUgSkZSIHNvdXJjZSBwcmVzZW50Ci0KLSMKLSMgRm9yIGNsb3NlZCBkZWZhdWx0IGlzIHllcwotIwotaWYgdGVzdCAieCR7T1BFTkpES30iICE9ICJ4dHJ1ZSI7IHRoZW4KLSAgIEVOQUJMRV9KRlI9eWVzCi1maQotCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgamZyIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgamZyLi4uICIgPiY2OyB9Ci0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtamZyIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX2pmcitzZXR9IiA9IHNldDsgdGhlbiA6Ci0gIGVuYWJsZXZhbD0kZW5hYmxlX2pmcjsKLWZpCi0KLXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAke0VOQUJMRV9KRlJ9IiA+JjUKLSRhc19lY2hvICIke0VOQUJMRV9KRlJ9IiA+JjY7IH0KLQotaWYgdGVzdCAieCRFTkFCTEVfSkZSIiA9ICJ4eWVzIjsgdGhlbgotICAgIEVOQUJMRV9KRlI9dHJ1ZQotZWxpZiB0ZXN0ICJ4JEVOQUJMRV9KRlIiID0gInhubyI7IHRoZW4KLSAgICBFTkFCTEVfSkZSPWZhbHNlCi1lbHNlCi0gICBhc19mbl9lcnJvciAkPyAiSW52YWxpZCBhcmd1bWVudCB0byAtLWVuYWJsZS1qZnIiICIkTElORU5PIiA1Ci1maQorQ09NUFJFU1NfSkFSUz1mYWxzZQogCiAKIApAQCAtODM1NCw2ICsxMDQwNyw4IEBACiAKIAogCisKKwogQ09QWVJJR0hUX1lFQVI9YGRhdGUgKyclWSdgCiAKIApAQCAtODM4MSw3ICsxMDQzNiw3IEBACiAgICAgQlVJTERfREFURT1gZGF0ZSAnKyVZXyVtXyVkXyVIXyVNJ2AKICAgICAjIEF2b2lkIFs6YWxudW06XSBzaW5jZSBpdCBkZXBlbmRzIG9uIHRoZSBsb2NhbGUuCiAgICAgQ0xFQU5fVVNFUk5BTUU9YGVjaG8gIiRVU0VSIiB8ICRUUiAtZCAtYyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnF4eXowMTIzNDU2Nzg5J2AKLSAgICBVU0VSX1JFTEVBU0VfU1VGRklYPWBlY2hvICIke0NMRUFOX1VTRVJOQU1FfV8ke0JVSUxEX0RBVEV9IiB8ICRUUiAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2cXh5eidgCisgICAgVVNFUl9SRUxFQVNFX1NVRkZJWD1gZWNobyAiJHtDTEVBTl9VU0VSTkFNRX1fJHtCVUlMRF9EQVRFfSIgfCAkVFIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAogICAgIEZVTExfVkVSU0lPTj0iJHtSRUxFQVNFfS0ke1VTRVJfUkVMRUFTRV9TVUZGSVh9LSR7SkRLX0JVSUxEX05VTUJFUn0iCiBmaQogCkBAIC04Mzg5LDkzICsxMDQ0NCw2IEBACiAKIAogCi0jIFRvIHByb3Blcmx5IGNyZWF0ZSBhIGNvbmZpZ3VyYXRpb24gbmFtZSwgd2UgbmVlZCB0byBoYXZlIHRoZSBPcGVuSkRLIHRhcmdldAotIyBhbmQgb3B0aW9ucyAodmFyaWFudHMgYW5kIGRlYnVnIGxldmVsKSBwYXJzZWQuCi0KLQotCi0jIENoZWNrIHdoZXRoZXIgLS13aXRoLWNvbmYtbmFtZSB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfY29uZl9uYW1lK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgd2l0aHZhbD0kd2l0aF9jb25mX25hbWU7ICBDT05GX05BTUU9JHt3aXRoX2NvbmZfbmFtZX0KLWZpCi0KLQotIyBUZXN0IGZyb20gd2hlcmUgd2UgYXJlIHJ1bm5pbmcgY29uZmlndXJlLCBpbiBvciBvdXRzaWRlIG9mIHNyYyByb290LgotaWYgdGVzdCAieCRDVVJESVIiID0gIngkU1JDX1JPT1QiIHx8IHRlc3QgIngkQ1VSRElSIiA9ICJ4JFNSQ19ST09UL2NvbW1vbiIgfHwgdGVzdCAieCRDVVJESVIiID0gIngkU1JDX1JPT1QvY29tbW9uL2F1dG9jb25mIiB8fCB0ZXN0ICJ4JENVUkRJUiIgPSAieCRTUkNfUk9PVC9jb21tb24vbWFrZWZpbGVzIiA7IHRoZW4KLSAgICAjIFdlIGFyZSBydW5uaW5nIGNvbmZpZ3VyZSBmcm9tIHRoZSBzcmMgcm9vdC4KLSAgICAjIENyZWF0ZSBhIGRlZmF1bHQgLi9idWlsZC90YXJnZXQtdmFyaWFudC1kZWJ1Z2xldmVsIG91dHB1dCByb290LgotICAgIGlmIHRlc3QgIngke0NPTkZfTkFNRX0iID0geDsgdGhlbgotICAgICAgICBDT05GX05BTUU9IiR7T1BFTkpES19UQVJHRVRfT1N9LSR7T1BFTkpES19UQVJHRVRfQ1BVfS0ke0pES19WQVJJQU5UfS0ke0FOREVEX0pWTV9WQVJJQU5UU30tJHtERUJVR19MRVZFTH0iCi0gICAgZmkKLSAgICBPVVRQVVRfUk9PVD0iJFNSQ19ST09UL2J1aWxkLyR7Q09ORl9OQU1FfSIKLSAgICBta2RpciAtcCAiJE9VVFBVVF9ST09UIgotICAgIGlmIHRlc3QgISAtZCAiJE9VVFBVVF9ST09UIjsgdGhlbgotICAgICAgICBhc19mbl9lcnJvciAkPyAiQ291bGQgbm90IGNyZWF0ZSBidWlsZCBkaXJlY3RvcnkgJE9VVFBVVF9ST09UIiAiJExJTkVOTyIgNQotICAgIGZpCi1lbHNlCi0gICAgIyBXZSBhcmUgcnVubmluZyBjb25maWd1cmUgZnJvbSBvdXRzaWRlIG9mIHRoZSBzcmMgZGlyLgotICAgICMgVGhlbiB1c2UgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGFzIG91dHB1dCBkaXIhCi0gICAgIyBJZiBjb25maWd1cmF0aW9uIGlzIHNpdHVhdGVkIGluIG5vcm1hbCBidWlsZCBkaXJlY3RvcnksIGp1c3QgdXNlIHRoZSBidWlsZAotICAgICMgZGlyZWN0b3J5IG5hbWUgYXMgY29uZmlndXJhdGlvbiBuYW1lLCBvdGhlcndpc2UgdXNlIHRoZSBjb21wbGV0ZSBwYXRoLgotICAgIGlmIHRlc3QgIngke0NPTkZfTkFNRX0iID0geDsgdGhlbgotICAgICAgICBDT05GX05BTUU9YCRFQ0hPICRDVVJESVIgfCAkU0VEIC1lICJzIV4ke1NSQ19ST09UfS9idWlsZC8hISJgCi0gICAgZmkKLSAgICBPVVRQVVRfUk9PVD0iJENVUkRJUiIKLWZpCi0KLQotICAgICMgRmFpbCB3aXRoIG1lc3NhZ2UgdGhlIHBhdGggdG8gdGhlIG91dHB1dCByb290IGlmIHZhciBPVVRQVVRfUk9PVCBjb250YWlucyBhIHBhdGggd2l0aCBubyBzcGFjZXMgaW4gaXQuCi0gICAgIyBVbmxlc3Mgb24gV2luZG93cywgd2hlcmUgd2UgY2FuIHJld3JpdGUgdGhlIHBhdGguCi0gICAgSEFTX1NQQUNFPWBlY2hvICIkT1VUUFVUX1JPT1QiIHwgZ3JlcCAiICJgCi0gICAgaWYgdGVzdCAieCRIQVNfU1BBQ0UiICE9IHg7IHRoZW4KLSAgICAgICAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TIiA9ICJ4d2luZG93cyI7IHRoZW4KLSAgICAgICAgICAgICMgRmlyc3QgY29udmVydCBpdCB0byBET1Mtc3R5bGUsIHNob3J0IG1vZGUgKG5vIHNwYWNlcykKLSAgICAgICAgICAgIE9VVFBVVF9ST09UPWAkQ1lHUEFUSCAtcyAtbSAtYSAiJE9VVFBVVF9ST09UImAKLSAgICAgICAgICAgICMgTm93IGl0J3MgY2FzZSBpbnNlbnNpdGl2ZTsgbGV0J3MgbWFrZSBpdCBsb3dlcmNhc2UgdG8gaW1wcm92ZSByZWFkYWJpbGl0eQotICAgICAgICAgICAgT1VUUFVUX1JPT1Q9YCRFQ0hPICIkT1VUUFVUX1JPT1QiIHwgJFRSICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZxeHl6J2AKLSAgICAgICAgICAgICMgTm93IGNvbnZlcnQgaXQgYmFjayB0byBVbml4LXN0aWxlIChjeWdwYXRoKQotICAgICAgICAgICAgT1VUUFVUX1JPT1Q9YCRDWUdQQVRIIC11ICIkT1VUUFVUX1JPT1QiYAotICAgICAgICBlbHNlCi0gICAgICAgICAgICBhc19mbl9lcnJvciAkPyAiWW91IGNhbm5vdCBoYXZlIHNwYWNlcyBpbiB0aGUgcGF0aCB0byB0aGUgb3V0cHV0IHJvb3QhIFwiJE9VVFBVVF9ST09UXCIiICIkTElORU5PIiA1Ci0gICAgICAgIGZpCi0gICAgZmkKLQotCi1TUEVDPSRPVVRQVVRfUk9PVC9zcGVjLmdtawotCi1DT05GX05BTUU9JENPTkZfTkFNRQotCi1PVVRQVVRfUk9PVD0kT1VUUFVUX1JPT1QKLQotCi0jIE1vc3Qgb2YgdGhlIHByb2JlZCBkZWZpbmVzIGFyZSBwdXQgaW50byBjb25maWcuaAotYWNfY29uZmlnX2hlYWRlcnM9IiRhY19jb25maWdfaGVhZGVycyAkT1VUUFVUX1JPT1QvY29uZmlnLmg6JEFVVE9DT05GX0RJUi9jb25maWcuaC5pbiIKLQotIyBUaGUgc3BlYy5nbWsgZmlsZSBjb250YWlucyBhbGwgdmFyaWFibGVzIGZvciB0aGUgbWFrZSBzeXN0ZW0uCi1hY19jb25maWdfZmlsZXM9IiRhY19jb25maWdfZmlsZXMgJE9VVFBVVF9ST09UL3NwZWMuZ21rOiRBVVRPQ09ORl9ESVIvc3BlYy5nbWsuaW4iCi0KLSMgVGhlIGhvdHNwb3Qtc3BlYy5nbWsgZmlsZSBjb250YWlucyBsZWdhY3kgdmFyaWFibGVzIGZvciB0aGUgaG90c3BvdCBtYWtlIHN5c3RlbS4KLWFjX2NvbmZpZ19maWxlcz0iJGFjX2NvbmZpZ19maWxlcyAkT1VUUFVUX1JPT1QvaG90c3BvdC1zcGVjLmdtazokQVVUT0NPTkZfRElSL2hvdHNwb3Qtc3BlYy5nbWsuaW4iCi0KLSMgVGhlIGJvb3RjeWNsZS1zcGVjLmdtayBmaWxlIGNvbnRhaW5zIHN1cHBvcnQgZm9yIGJvb3QgY3ljbGUgYnVpbGRzLgotYWNfY29uZmlnX2ZpbGVzPSIkYWNfY29uZmlnX2ZpbGVzICRPVVRQVVRfUk9PVC9ib290Y3ljbGUtc3BlYy5nbWs6JEFVVE9DT05GX0RJUi9ib290Y3ljbGUtc3BlYy5nbWsuaW4iCi0KLSMgVGhlIGNvbXBhcmUuc2ggaXMgdXNlZCB0byBjb21wYXJlIHRoZSBidWlsZCBvdXRwdXQgdG8gb3RoZXIgYnVpbGRzLgotYWNfY29uZmlnX2ZpbGVzPSIkYWNfY29uZmlnX2ZpbGVzICRPVVRQVVRfUk9PVC9jb21wYXJlLnNoOiRBVVRPQ09ORl9ESVIvY29tcGFyZS5zaC5pbiIKLQotIyBTcGVjLnNoIGlzIGN1cnJlbnRseSB1c2VkIGJ5IGNvbXBhcmUtb2JqZWN0cy5zaAotYWNfY29uZmlnX2ZpbGVzPSIkYWNfY29uZmlnX2ZpbGVzICRPVVRQVVRfUk9PVC9zcGVjLnNoOiRBVVRPQ09ORl9ESVIvc3BlYy5zaC5pbiIKLQotIyBUaGUgZ2VuZXJhdGVkIE1ha2VmaWxlIGtub3dzIHdoZXJlIHRoZSBzcGVjLmdtayBpcyBhbmQgd2hlcmUgdGhlIHNvdXJjZSBpcy4KLSMgWW91IGNhbiBydW4gbWFrZSBmcm9tIHRoZSBPVVRQVVRfUk9PVCwgb3IgZnJvbSB0aGUgdG9wLWxldmVsIE1ha2VmaWxlCi0jIHdoaWNoIHdpbGwgbG9vayBmb3IgZ2VuZXJhdGVkIGNvbmZpZ3VyYXRpb25zCi1hY19jb25maWdfZmlsZXM9IiRhY19jb25maWdfZmlsZXMgJE9VVFBVVF9ST09UL01ha2VmaWxlOiRBVVRPQ09ORl9ESVIvTWFrZWZpbGUuaW4iCi0KLQotIyBTYXZlIHRoZSBhcmd1bWVudHMgZ2l2ZW4gdG8gdXMKLWVjaG8gIiRDT05GSUdVUkVfQ09NTUFORF9MSU5FIiA+ICRPVVRQVVRfUk9PVC9jb25maWd1cmUtYXJndW1lbnRzCi0KLQogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIwogIyBTZXR1cCBCb290SkRLLCB1c2VkIHRvIGJvb3RzdHJhcCB0aGUgYnVpbGQuCkBAIC04NTQ2LDI2ICsxMDUxNCwxMzMgQEAKICAgICAgICAgICAgICAgIyBXZSdyZSBkb25lISA6LSkKICAgICAgICAgICAgICAgQk9PVF9KREtfRk9VTkQ9eWVzCiAKLSAgICAjIEZhaWwgd2l0aCBtZXNzYWdlIHRoZSBwYXRoIHRvIHRoZSBCb290IEpESyBpZiB2YXIgQk9PVF9KREsgY29udGFpbnMgYSBwYXRoIHdpdGggbm8gc3BhY2VzIGluIGl0LgotICAgICMgVW5sZXNzIG9uIFdpbmRvd3MsIHdoZXJlIHdlIGNhbiByZXdyaXRlIHRoZSBwYXRoLgotICAgIEhBU19TUEFDRT1gZWNobyAiJEJPT1RfSkRLIiB8IGdyZXAgIiAiYAotICAgIGlmIHRlc3QgIngkSEFTX1NQQUNFIiAhPSB4OyB0aGVuCi0gICAgICAgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PUyIgPSAieHdpbmRvd3MiOyB0aGVuCi0gICAgICAgICAgICAjIEZpcnN0IGNvbnZlcnQgaXQgdG8gRE9TLXN0eWxlLCBzaG9ydCBtb2RlIChubyBzcGFjZXMpCi0gICAgICAgICAgICBCT09UX0pESz1gJENZR1BBVEggLXMgLW0gLWEgIiRCT09UX0pESyJgCi0gICAgICAgICAgICAjIE5vdyBpdCdzIGNhc2UgaW5zZW5zaXRpdmU7IGxldCdzIG1ha2UgaXQgbG93ZXJjYXNlIHRvIGltcHJvdmUgcmVhZGFiaWxpdHkKLSAgICAgICAgICAgIEJPT1RfSkRLPWAkRUNITyAiJEJPT1RfSkRLIiB8ICRUUiAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2cXh5eidgCi0gICAgICAgICAgICAjIE5vdyBjb252ZXJ0IGl0IGJhY2sgdG8gVW5peC1zdGlsZSAoY3lncGF0aCkKLSAgICAgICAgICAgIEJPT1RfSkRLPWAkQ1lHUEFUSCAtdSAiJEJPT1RfSkRLImAKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgYXNfZm5fZXJyb3IgJD8gIllvdSBjYW5ub3QgaGF2ZSBzcGFjZXMgaW4gdGhlIHBhdGggdG8gdGhlIEJvb3QgSkRLISBcIiRCT09UX0pES1wiIiAiJExJTkVOTyIgNQotICAgICAgICBmaQorICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5jeWd3aW4iOyB0aGVuCisKKyAgIyBJbnB1dCBtaWdodCBiZSBnaXZlbiBhcyBXaW5kb3dzIGZvcm1hdCwgc3RhcnQgYnkgY29udmVydGluZyB0bworICAjIHVuaXggZm9ybWF0LgorICBwYXRoPSIkQk9PVF9KREsiCisgIG5ld19wYXRoPWAkQ1lHUEFUSCAtdSAiJHBhdGgiYAorCisgICMgQ3lnd2luIHRyaWVzIHRvIGhpZGUgc29tZSBhc3BlY3RzIG9mIHRoZSBXaW5kb3dzIGZpbGUgc3lzdGVtLCBzdWNoIHRoYXQgYmluYXJpZXMgYXJlCisgICMgbmFtZWQgLmV4ZSBidXQgY2FsbGVkIHdpdGhvdXQgdGhhdCBzdWZmaXguIFRoZXJlZm9yZSwgImZvbyIgYW5kICJmb28uZXhlIiBhcmUgY29uc2lkZXJlZAorICAjIHRoZSBzYW1lIGZpbGUsIG1vc3Qgb2YgdGhlIHRpbWUgKGFzIGluICJ0ZXN0IC1mIikuIEJ1dCBub3Qgd2hlbiBydW5uaW5nIGN5Z3BhdGggLXMsIHRoZW4KKyAgIyAiZm9vLmV4ZSIgaXMgT0sgYnV0ICJmb28iIGlzIGFuIGVycm9yLgorICAjCisgICMgVGhpcyB0ZXN0IGlzIHRoZXJlZm9yZSBzbGlnaHRseSBtb3JlIGFjY3VyYXRlIHRoYW4gInRlc3QgLWYiIHRvIGNoZWNrIGZvciBmaWxlIHByZWNlbnNlLgorICAjIEl0IGlzIGFsc28gYSB3YXkgdG8gbWFrZSBzdXJlIHdlIGdvdCB0aGUgcHJvcGVyIGZpbGUgbmFtZSBmb3IgdGhlIHJlYWwgdGVzdCBsYXRlciBvbi4KKyAgdGVzdF9zaG9ydHBhdGg9YCRDWUdQQVRIIC1zIC1tICIkbmV3X3BhdGgiIDI+IC9kZXYvbnVsbGAKKyAgaWYgdGVzdCAieCR0ZXN0X3Nob3J0cGF0aCIgPSB4OyB0aGVuCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUaGUgcGF0aCBvZiBCT09UX0pESywgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkcGF0aFwiLCBpcyBpbnZhbGlkLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUaGUgcGF0aCBvZiBCT09UX0pESywgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkcGF0aFwiLCBpcyBpbnZhbGlkLiIgPiY2O30KKyAgICBhc19mbl9lcnJvciAkPyAiQ2Fubm90IGxvY2F0ZSB0aGUgdGhlIHBhdGggb2YgQk9PVF9KREsiICIkTElORU5PIiA1CisgIGZpCisKKyAgIyBDYWxsIGhlbHBlciBmdW5jdGlvbiB3aGljaCBwb3NzaWJseSBjb252ZXJ0cyB0aGlzIHVzaW5nIERPUy1zdHlsZSBzaG9ydCBtb2RlLgorICAjIElmIHNvLCB0aGUgdXBkYXRlZCBwYXRoIGlzIHN0b3JlZCBpbiAkbmV3X3BhdGguCisKKyAgaW5wdXRfcGF0aD0iJG5ld19wYXRoIgorICAjIENoZWNrIGlmIHdlIG5lZWQgdG8gY29udmVydCB0aGlzIHVzaW5nIERPUy1zdHlsZSBzaG9ydCBtb2RlLiBJZiB0aGUgcGF0aAorICAjIGNvbnRhaW5zIGp1c3Qgc2ltcGxlIGNoYXJhY3RlcnMsIHVzZSBpdC4gT3RoZXJ3aXNlIChzcGFjZXMsIHdlaXJkIGNoYXJhY3RlcnMpLAorICAjIHRha2Ugbm8gY2hhbmNlcyBhbmQgcmV3cml0ZSBpdC4KKyAgIyBOb3RlOiBtNCBlYXRzIG91ciBbXSwgc28gd2UgbmVlZCB0byB1c2UgWyBhbmQgXSBpbnN0ZWFkLgorICBoYXNfZm9yYmlkZGVuX2NoYXJzPWAkRUNITyAiJGlucHV0X3BhdGgiIHwgJEdSRVAgW14tLl8vYS16QS1aMC05XWAKKyAgaWYgdGVzdCAieCRoYXNfZm9yYmlkZGVuX2NoYXJzIiAhPSB4OyB0aGVuCisgICAgIyBOb3cgY29udmVydCBpdCB0byBtaXhlZCBET1Mtc3R5bGUsIHNob3J0IG1vZGUgKG5vIHNwYWNlcywgYW5kIC8gaW5zdGVhZCBvZiBcKQorICAgIHNob3J0bW9kZV9wYXRoPWAkQ1lHUEFUSCAtcyAtbSAtYSAiJGlucHV0X3BhdGgiYAorICAgIHBhdGhfYWZ0ZXJfc2hvcnRtb2RlPWAkQ1lHUEFUSCAtdSAiJHNob3J0bW9kZV9wYXRoImAKKyAgICBpZiB0ZXN0ICJ4JHBhdGhfYWZ0ZXJfc2hvcnRtb2RlIiAhPSAieCRpbnB1dF90b19zaG9ydHBhdGgiOyB0aGVuCisgICAgICAjIEdvaW5nIHRvIHNob3J0IG1vZGUgYW5kIGJhY2sgYWdhaW4gZGlkIGluZGVlZCBtYXR0ZXIuIFNpbmNlIHNob3J0IG1vZGUgaXMKKyAgICAgICMgY2FzZSBpbnNlbnNpdGl2ZSwgbGV0J3MgbWFrZSBpdCBsb3dlcmNhc2UgdG8gaW1wcm92ZSByZWFkYWJpbGl0eS4KKyAgICAgIHNob3J0bW9kZV9wYXRoPWAkRUNITyAiJHNob3J0bW9kZV9wYXRoIiB8ICRUUiAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidgCisgICAgICAjIE5vdyBjb252ZXJ0IGl0IGJhY2sgdG8gVW5peC1zdGlsZSAoY3lncGF0aCkKKyAgICAgIGlucHV0X3BhdGg9YCRDWUdQQVRIIC11ICIkc2hvcnRtb2RlX3BhdGgiYAorICAgICAgbmV3X3BhdGg9IiRpbnB1dF9wYXRoIgogICAgIGZpCisgIGZpCisKKyAgdGVzdF9jeWdkcml2ZV9wcmVmaXg9YCRFQ0hPICRpbnB1dF9wYXRoIHwgJEdSRVAgXi9jeWdkcml2ZS9gCisgIGlmIHRlc3QgIngkdGVzdF9jeWdkcml2ZV9wcmVmaXgiID0geDsgdGhlbgorICAgICMgQXMgYSBzaW1wbGUgZml4LCBleGNsdWRlIC91c3IvYmluIHNpbmNlIGl0J3Mgbm90IGEgcmVhbCBwYXRoLgorICAgIGlmIHRlc3QgInhgJEVDSE8gJG5ld19wYXRoIHwgJEdSRVAgXi91c3IvYmluL2AiID0geDsgdGhlbgorICAgICAgIyBUaGUgcGF0aCBpcyBpbiBhIEN5Z3dpbiBzcGVjaWFsIGRpcmVjdG9yeSAoZS5nLiAvaG9tZSkuIFdlIG5lZWQgdGhpcyBjb252ZXJ0ZWQgdG8KKyAgICAgICMgYSBwYXRoIHByZWZpeGVkIGJ5IC9jeWdkcml2ZSBmb3IgZml4cGF0aCB0byB3b3JrLgorICAgICAgbmV3X3BhdGg9IiRDWUdXSU5fUk9PVF9QQVRIJGlucHV0X3BhdGgiCisgICAgZmkKKyAgZmkKKworCisgIGlmIHRlc3QgIngkcGF0aCIgIT0gIngkbmV3X3BhdGgiOyB0aGVuCisgICAgQk9PVF9KREs9IiRuZXdfcGF0aCIKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFJld3JpdGluZyBCT09UX0pESyB0byBcIiRuZXdfcGF0aFwiIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFJld3JpdGluZyBCT09UX0pESyB0byBcIiRuZXdfcGF0aFwiIiA+JjY7fQorICBmaQorCisgIGVsaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MubXN5cyI7IHRoZW4KKworICBwYXRoPSIkQk9PVF9KREsiCisgIGhhc19jb2xvbj1gJEVDSE8gJHBhdGggfCAkR1JFUCBeLjpgCisgIG5ld19wYXRoPSIkcGF0aCIKKyAgaWYgdGVzdCAieCRoYXNfY29sb24iID0geDsgdGhlbgorICAgICMgTm90IGluIG1peGVkIG9yIFdpbmRvd3Mgc3R5bGUsIHN0YXJ0IGJ5IHRoYXQuCisgICAgbmV3X3BhdGg9YGNtZCAvL2MgZWNobyAkcGF0aGAKKyAgZmkKKworCisgIGlucHV0X3BhdGg9IiRuZXdfcGF0aCIKKyAgIyBDaGVjayBpZiB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhpcyB1c2luZyBET1Mtc3R5bGUgc2hvcnQgbW9kZS4gSWYgdGhlIHBhdGgKKyAgIyBjb250YWlucyBqdXN0IHNpbXBsZSBjaGFyYWN0ZXJzLCB1c2UgaXQuIE90aGVyd2lzZSAoc3BhY2VzLCB3ZWlyZCBjaGFyYWN0ZXJzKSwKKyAgIyB0YWtlIG5vIGNoYW5jZXMgYW5kIHJld3JpdGUgaXQuCisgICMgTm90ZTogbTQgZWF0cyBvdXIgW10sIHNvIHdlIG5lZWQgdG8gdXNlIFsgYW5kIF0gaW5zdGVhZC4KKyAgaGFzX2ZvcmJpZGRlbl9jaGFycz1gJEVDSE8gIiRpbnB1dF9wYXRoIiB8ICRHUkVQIFteLV8vOmEtekEtWjAtOV1gCisgIGlmIHRlc3QgIngkaGFzX2ZvcmJpZGRlbl9jaGFycyIgIT0geDsgdGhlbgorICAgICMgTm93IGNvbnZlcnQgaXQgdG8gbWl4ZWQgRE9TLXN0eWxlLCBzaG9ydCBtb2RlIChubyBzcGFjZXMsIGFuZCAvIGluc3RlYWQgb2YgXCkKKyAgICBuZXdfcGF0aD1gY21kIC9jICJmb3IgJUEgaW4gKFwiJGlucHV0X3BhdGhcIikgZG8gQGVjaG8gJX5zQSJ8JFRSIFxcXFxcXFxcIC8gfCAkVFIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAorICBmaQorCisKKyAgd2luZG93c19wYXRoPSIkbmV3X3BhdGgiCisgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLmN5Z3dpbiI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRDWUdQQVRIIC11ICIkd2luZG93c19wYXRoImAKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJEVDSE8gIiR3aW5kb3dzX3BhdGgiIHwgJFNFRCAtZSAncyxeXFwoLlxcKTosL1xcMSxnJyAtZSAncyxcXFxcLC8sZydgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGZpCisKKyAgaWYgdGVzdCAieCRwYXRoIiAhPSAieCRuZXdfcGF0aCI7IHRoZW4KKyAgICBCT09UX0pESz0iJG5ld19wYXRoIgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogUmV3cml0aW5nIEJPT1RfSkRLIHRvIFwiJG5ld19wYXRoXCIiID4mNQorJGFzX2VjaG8gIiRhc19tZTogUmV3cml0aW5nIEJPT1RfSkRLIHRvIFwiJG5ld19wYXRoXCIiID4mNjt9CisgIGZpCisKKyAgIyBTYXZlIHRoZSBmaXJzdCAxMCBieXRlcyBvZiB0aGlzIHBhdGggdG8gdGhlIHN0b3JhZ2UsIHNvIGZpeHBhdGggY2FuIHdvcmsuCisgIGFsbF9maXhwYXRoX3ByZWZpeGVzPSgiJHthbGxfZml4cGF0aF9wcmVmaXhlc1tAXX0iICIke25ld19wYXRoOjA6MTB9IikKKworICBlbHNlCisgICAgIyBXZSdyZSBvbiBhIHBvc2l4IHBsYXRmb3JtLiBIb29yYXkhIDopCisgICAgcGF0aD0iJEJPT1RfSkRLIgorCisgICAgaWYgdGVzdCAhIC1mICIkcGF0aCIgJiYgdGVzdCAhIC1kICIkcGF0aCI7IHRoZW4KKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJUaGUgcGF0aCBvZiBCT09UX0pESywgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkcGF0aFwiLCBpcyBub3QgZm91bmQuIiAiJExJTkVOTyIgNQorICAgIGZpCisKKyAgICBoYXNfc3BhY2U9YCRFQ0hPICIkcGF0aCIgfCAkR1JFUCAiICJgCisgICAgaWYgdGVzdCAieCRoYXNfc3BhY2UiICE9IHg7IHRoZW4KKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGhlIHBhdGggb2YgQk9PVF9KREssIHdoaWNoIHJlc29sdmVzIGFzIFwiJHBhdGhcIiwgaXMgaW52YWxpZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhlIHBhdGggb2YgQk9PVF9KREssIHdoaWNoIHJlc29sdmVzIGFzIFwiJHBhdGhcIiwgaXMgaW52YWxpZC4iID4mNjt9CisgICAgICBhc19mbl9lcnJvciAkPyAiU3BhY2VzIGFyZSBub3QgYWxsb3dlZCBpbiB0aGlzIHBhdGguIiAiJExJTkVOTyIgNQorICAgIGZpCisgIGZpCiAKICAgICAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgQm9vdCBKREsiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIEJvb3QgSkRLLi4uICIgPiY2OyB9Ci0gICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQk9PVF9KREsgKCRCT09UX0pES19WRVJTSU9OKSIgPiY1Ci0kYXNfZWNobyAiJEJPT1RfSkRLICgkQk9PVF9KREtfVkVSU0lPTikiID4mNjsgfQorICAgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJEJPT1RfSkRLIiA+JjUKKyRhc19lY2hvICIkQk9PVF9KREsiID4mNjsgfQorICAgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIEJvb3QgSkRLIHZlcnNpb24iID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgQm9vdCBKREsgdmVyc2lvbi4uLiAiID4mNjsgfQorICAgICAgICAgICAgICBCT09UX0pES19WRVJTSU9OPWAiJEJPT1RfSkRLL2Jpbi9qYXZhIiAtdmVyc2lvbiAyPiYxIHwgJFRSICdcblxyJyAnICAnYAorICAgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJEJPT1RfSkRLX1ZFUlNJT04iID4mNQorJGFzX2VjaG8gIiRCT09UX0pES19WRVJTSU9OIiA+JjY7IH0KICAgICAgICAgICAgIGZpICMgZW5kIGNoZWNrIGpkayB2ZXJzaW9uCiAgICAgICAgICAgZmkgIyBlbmQgY2hlY2sgcnQuamFyCiAgICAgICAgIGZpICMgZW5kIGNoZWNrIGphdmFjCkBAIC04NzY4LDI2ICsxMDg0MywxMzMgQEAKICAgICAgICAgICAgICAgIyBXZSdyZSBkb25lISA6LSkKICAgICAgICAgICAgICAgQk9PVF9KREtfRk9VTkQ9eWVzCiAKLSAgICAjIEZhaWwgd2l0aCBtZXNzYWdlIHRoZSBwYXRoIHRvIHRoZSBCb290IEpESyBpZiB2YXIgQk9PVF9KREsgY29udGFpbnMgYSBwYXRoIHdpdGggbm8gc3BhY2VzIGluIGl0LgotICAgICMgVW5sZXNzIG9uIFdpbmRvd3MsIHdoZXJlIHdlIGNhbiByZXdyaXRlIHRoZSBwYXRoLgotICAgIEhBU19TUEFDRT1gZWNobyAiJEJPT1RfSkRLIiB8IGdyZXAgIiAiYAotICAgIGlmIHRlc3QgIngkSEFTX1NQQUNFIiAhPSB4OyB0aGVuCi0gICAgICAgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PUyIgPSAieHdpbmRvd3MiOyB0aGVuCi0gICAgICAgICAgICAjIEZpcnN0IGNvbnZlcnQgaXQgdG8gRE9TLXN0eWxlLCBzaG9ydCBtb2RlIChubyBzcGFjZXMpCi0gICAgICAgICAgICBCT09UX0pESz1gJENZR1BBVEggLXMgLW0gLWEgIiRCT09UX0pESyJgCi0gICAgICAgICAgICAjIE5vdyBpdCdzIGNhc2UgaW5zZW5zaXRpdmU7IGxldCdzIG1ha2UgaXQgbG93ZXJjYXNlIHRvIGltcHJvdmUgcmVhZGFiaWxpdHkKLSAgICAgICAgICAgIEJPT1RfSkRLPWAkRUNITyAiJEJPT1RfSkRLIiB8ICRUUiAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2cXh5eidgCi0gICAgICAgICAgICAjIE5vdyBjb252ZXJ0IGl0IGJhY2sgdG8gVW5peC1zdGlsZSAoY3lncGF0aCkKLSAgICAgICAgICAgIEJPT1RfSkRLPWAkQ1lHUEFUSCAtdSAiJEJPT1RfSkRLImAKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgYXNfZm5fZXJyb3IgJD8gIllvdSBjYW5ub3QgaGF2ZSBzcGFjZXMgaW4gdGhlIHBhdGggdG8gdGhlIEJvb3QgSkRLISBcIiRCT09UX0pES1wiIiAiJExJTkVOTyIgNQotICAgICAgICBmaQorICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5jeWd3aW4iOyB0aGVuCisKKyAgIyBJbnB1dCBtaWdodCBiZSBnaXZlbiBhcyBXaW5kb3dzIGZvcm1hdCwgc3RhcnQgYnkgY29udmVydGluZyB0bworICAjIHVuaXggZm9ybWF0LgorICBwYXRoPSIkQk9PVF9KREsiCisgIG5ld19wYXRoPWAkQ1lHUEFUSCAtdSAiJHBhdGgiYAorCisgICMgQ3lnd2luIHRyaWVzIHRvIGhpZGUgc29tZSBhc3BlY3RzIG9mIHRoZSBXaW5kb3dzIGZpbGUgc3lzdGVtLCBzdWNoIHRoYXQgYmluYXJpZXMgYXJlCisgICMgbmFtZWQgLmV4ZSBidXQgY2FsbGVkIHdpdGhvdXQgdGhhdCBzdWZmaXguIFRoZXJlZm9yZSwgImZvbyIgYW5kICJmb28uZXhlIiBhcmUgY29uc2lkZXJlZAorICAjIHRoZSBzYW1lIGZpbGUsIG1vc3Qgb2YgdGhlIHRpbWUgKGFzIGluICJ0ZXN0IC1mIikuIEJ1dCBub3Qgd2hlbiBydW5uaW5nIGN5Z3BhdGggLXMsIHRoZW4KKyAgIyAiZm9vLmV4ZSIgaXMgT0sgYnV0ICJmb28iIGlzIGFuIGVycm9yLgorICAjCisgICMgVGhpcyB0ZXN0IGlzIHRoZXJlZm9yZSBzbGlnaHRseSBtb3JlIGFjY3VyYXRlIHRoYW4gInRlc3QgLWYiIHRvIGNoZWNrIGZvciBmaWxlIHByZWNlbnNlLgorICAjIEl0IGlzIGFsc28gYSB3YXkgdG8gbWFrZSBzdXJlIHdlIGdvdCB0aGUgcHJvcGVyIGZpbGUgbmFtZSBmb3IgdGhlIHJlYWwgdGVzdCBsYXRlciBvbi4KKyAgdGVzdF9zaG9ydHBhdGg9YCRDWUdQQVRIIC1zIC1tICIkbmV3X3BhdGgiIDI+IC9kZXYvbnVsbGAKKyAgaWYgdGVzdCAieCR0ZXN0X3Nob3J0cGF0aCIgPSB4OyB0aGVuCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUaGUgcGF0aCBvZiBCT09UX0pESywgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkcGF0aFwiLCBpcyBpbnZhbGlkLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUaGUgcGF0aCBvZiBCT09UX0pESywgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkcGF0aFwiLCBpcyBpbnZhbGlkLiIgPiY2O30KKyAgICBhc19mbl9lcnJvciAkPyAiQ2Fubm90IGxvY2F0ZSB0aGUgdGhlIHBhdGggb2YgQk9PVF9KREsiICIkTElORU5PIiA1CisgIGZpCisKKyAgIyBDYWxsIGhlbHBlciBmdW5jdGlvbiB3aGljaCBwb3NzaWJseSBjb252ZXJ0cyB0aGlzIHVzaW5nIERPUy1zdHlsZSBzaG9ydCBtb2RlLgorICAjIElmIHNvLCB0aGUgdXBkYXRlZCBwYXRoIGlzIHN0b3JlZCBpbiAkbmV3X3BhdGguCisKKyAgaW5wdXRfcGF0aD0iJG5ld19wYXRoIgorICAjIENoZWNrIGlmIHdlIG5lZWQgdG8gY29udmVydCB0aGlzIHVzaW5nIERPUy1zdHlsZSBzaG9ydCBtb2RlLiBJZiB0aGUgcGF0aAorICAjIGNvbnRhaW5zIGp1c3Qgc2ltcGxlIGNoYXJhY3RlcnMsIHVzZSBpdC4gT3RoZXJ3aXNlIChzcGFjZXMsIHdlaXJkIGNoYXJhY3RlcnMpLAorICAjIHRha2Ugbm8gY2hhbmNlcyBhbmQgcmV3cml0ZSBpdC4KKyAgIyBOb3RlOiBtNCBlYXRzIG91ciBbXSwgc28gd2UgbmVlZCB0byB1c2UgWyBhbmQgXSBpbnN0ZWFkLgorICBoYXNfZm9yYmlkZGVuX2NoYXJzPWAkRUNITyAiJGlucHV0X3BhdGgiIHwgJEdSRVAgW14tLl8vYS16QS1aMC05XWAKKyAgaWYgdGVzdCAieCRoYXNfZm9yYmlkZGVuX2NoYXJzIiAhPSB4OyB0aGVuCisgICAgIyBOb3cgY29udmVydCBpdCB0byBtaXhlZCBET1Mtc3R5bGUsIHNob3J0IG1vZGUgKG5vIHNwYWNlcywgYW5kIC8gaW5zdGVhZCBvZiBcKQorICAgIHNob3J0bW9kZV9wYXRoPWAkQ1lHUEFUSCAtcyAtbSAtYSAiJGlucHV0X3BhdGgiYAorICAgIHBhdGhfYWZ0ZXJfc2hvcnRtb2RlPWAkQ1lHUEFUSCAtdSAiJHNob3J0bW9kZV9wYXRoImAKKyAgICBpZiB0ZXN0ICJ4JHBhdGhfYWZ0ZXJfc2hvcnRtb2RlIiAhPSAieCRpbnB1dF90b19zaG9ydHBhdGgiOyB0aGVuCisgICAgICAjIEdvaW5nIHRvIHNob3J0IG1vZGUgYW5kIGJhY2sgYWdhaW4gZGlkIGluZGVlZCBtYXR0ZXIuIFNpbmNlIHNob3J0IG1vZGUgaXMKKyAgICAgICMgY2FzZSBpbnNlbnNpdGl2ZSwgbGV0J3MgbWFrZSBpdCBsb3dlcmNhc2UgdG8gaW1wcm92ZSByZWFkYWJpbGl0eS4KKyAgICAgIHNob3J0bW9kZV9wYXRoPWAkRUNITyAiJHNob3J0bW9kZV9wYXRoIiB8ICRUUiAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidgCisgICAgICAjIE5vdyBjb252ZXJ0IGl0IGJhY2sgdG8gVW5peC1zdGlsZSAoY3lncGF0aCkKKyAgICAgIGlucHV0X3BhdGg9YCRDWUdQQVRIIC11ICIkc2hvcnRtb2RlX3BhdGgiYAorICAgICAgbmV3X3BhdGg9IiRpbnB1dF9wYXRoIgogICAgIGZpCisgIGZpCisKKyAgdGVzdF9jeWdkcml2ZV9wcmVmaXg9YCRFQ0hPICRpbnB1dF9wYXRoIHwgJEdSRVAgXi9jeWdkcml2ZS9gCisgIGlmIHRlc3QgIngkdGVzdF9jeWdkcml2ZV9wcmVmaXgiID0geDsgdGhlbgorICAgICMgQXMgYSBzaW1wbGUgZml4LCBleGNsdWRlIC91c3IvYmluIHNpbmNlIGl0J3Mgbm90IGEgcmVhbCBwYXRoLgorICAgIGlmIHRlc3QgInhgJEVDSE8gJG5ld19wYXRoIHwgJEdSRVAgXi91c3IvYmluL2AiID0geDsgdGhlbgorICAgICAgIyBUaGUgcGF0aCBpcyBpbiBhIEN5Z3dpbiBzcGVjaWFsIGRpcmVjdG9yeSAoZS5nLiAvaG9tZSkuIFdlIG5lZWQgdGhpcyBjb252ZXJ0ZWQgdG8KKyAgICAgICMgYSBwYXRoIHByZWZpeGVkIGJ5IC9jeWdkcml2ZSBmb3IgZml4cGF0aCB0byB3b3JrLgorICAgICAgbmV3X3BhdGg9IiRDWUdXSU5fUk9PVF9QQVRIJGlucHV0X3BhdGgiCisgICAgZmkKKyAgZmkKKworCisgIGlmIHRlc3QgIngkcGF0aCIgIT0gIngkbmV3X3BhdGgiOyB0aGVuCisgICAgQk9PVF9KREs9IiRuZXdfcGF0aCIKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFJld3JpdGluZyBCT09UX0pESyB0byBcIiRuZXdfcGF0aFwiIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFJld3JpdGluZyBCT09UX0pESyB0byBcIiRuZXdfcGF0aFwiIiA+JjY7fQorICBmaQorCisgIGVsaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MubXN5cyI7IHRoZW4KKworICBwYXRoPSIkQk9PVF9KREsiCisgIGhhc19jb2xvbj1gJEVDSE8gJHBhdGggfCAkR1JFUCBeLjpgCisgIG5ld19wYXRoPSIkcGF0aCIKKyAgaWYgdGVzdCAieCRoYXNfY29sb24iID0geDsgdGhlbgorICAgICMgTm90IGluIG1peGVkIG9yIFdpbmRvd3Mgc3R5bGUsIHN0YXJ0IGJ5IHRoYXQuCisgICAgbmV3X3BhdGg9YGNtZCAvL2MgZWNobyAkcGF0aGAKKyAgZmkKKworCisgIGlucHV0X3BhdGg9IiRuZXdfcGF0aCIKKyAgIyBDaGVjayBpZiB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhpcyB1c2luZyBET1Mtc3R5bGUgc2hvcnQgbW9kZS4gSWYgdGhlIHBhdGgKKyAgIyBjb250YWlucyBqdXN0IHNpbXBsZSBjaGFyYWN0ZXJzLCB1c2UgaXQuIE90aGVyd2lzZSAoc3BhY2VzLCB3ZWlyZCBjaGFyYWN0ZXJzKSwKKyAgIyB0YWtlIG5vIGNoYW5jZXMgYW5kIHJld3JpdGUgaXQuCisgICMgTm90ZTogbTQgZWF0cyBvdXIgW10sIHNvIHdlIG5lZWQgdG8gdXNlIFsgYW5kIF0gaW5zdGVhZC4KKyAgaGFzX2ZvcmJpZGRlbl9jaGFycz1gJEVDSE8gIiRpbnB1dF9wYXRoIiB8ICRHUkVQIFteLV8vOmEtekEtWjAtOV1gCisgIGlmIHRlc3QgIngkaGFzX2ZvcmJpZGRlbl9jaGFycyIgIT0geDsgdGhlbgorICAgICMgTm93IGNvbnZlcnQgaXQgdG8gbWl4ZWQgRE9TLXN0eWxlLCBzaG9ydCBtb2RlIChubyBzcGFjZXMsIGFuZCAvIGluc3RlYWQgb2YgXCkKKyAgICBuZXdfcGF0aD1gY21kIC9jICJmb3IgJUEgaW4gKFwiJGlucHV0X3BhdGhcIikgZG8gQGVjaG8gJX5zQSJ8JFRSIFxcXFxcXFxcIC8gfCAkVFIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAorICBmaQorCisKKyAgd2luZG93c19wYXRoPSIkbmV3X3BhdGgiCisgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLmN5Z3dpbiI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRDWUdQQVRIIC11ICIkd2luZG93c19wYXRoImAKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJEVDSE8gIiR3aW5kb3dzX3BhdGgiIHwgJFNFRCAtZSAncyxeXFwoLlxcKTosL1xcMSxnJyAtZSAncyxcXFxcLC8sZydgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGZpCisKKyAgaWYgdGVzdCAieCRwYXRoIiAhPSAieCRuZXdfcGF0aCI7IHRoZW4KKyAgICBCT09UX0pESz0iJG5ld19wYXRoIgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogUmV3cml0aW5nIEJPT1RfSkRLIHRvIFwiJG5ld19wYXRoXCIiID4mNQorJGFzX2VjaG8gIiRhc19tZTogUmV3cml0aW5nIEJPT1RfSkRLIHRvIFwiJG5ld19wYXRoXCIiID4mNjt9CisgIGZpCisKKyAgIyBTYXZlIHRoZSBmaXJzdCAxMCBieXRlcyBvZiB0aGlzIHBhdGggdG8gdGhlIHN0b3JhZ2UsIHNvIGZpeHBhdGggY2FuIHdvcmsuCisgIGFsbF9maXhwYXRoX3ByZWZpeGVzPSgiJHthbGxfZml4cGF0aF9wcmVmaXhlc1tAXX0iICIke25ld19wYXRoOjA6MTB9IikKKworICBlbHNlCisgICAgIyBXZSdyZSBvbiBhIHBvc2l4IHBsYXRmb3JtLiBIb29yYXkhIDopCisgICAgcGF0aD0iJEJPT1RfSkRLIgorCisgICAgaWYgdGVzdCAhIC1mICIkcGF0aCIgJiYgdGVzdCAhIC1kICIkcGF0aCI7IHRoZW4KKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJUaGUgcGF0aCBvZiBCT09UX0pESywgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkcGF0aFwiLCBpcyBub3QgZm91bmQuIiAiJExJTkVOTyIgNQorICAgIGZpCisKKyAgICBoYXNfc3BhY2U9YCRFQ0hPICIkcGF0aCIgfCAkR1JFUCAiICJgCisgICAgaWYgdGVzdCAieCRoYXNfc3BhY2UiICE9IHg7IHRoZW4KKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGhlIHBhdGggb2YgQk9PVF9KREssIHdoaWNoIHJlc29sdmVzIGFzIFwiJHBhdGhcIiwgaXMgaW52YWxpZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhlIHBhdGggb2YgQk9PVF9KREssIHdoaWNoIHJlc29sdmVzIGFzIFwiJHBhdGhcIiwgaXMgaW52YWxpZC4iID4mNjt9CisgICAgICBhc19mbl9lcnJvciAkPyAiU3BhY2VzIGFyZSBub3QgYWxsb3dlZCBpbiB0aGlzIHBhdGguIiAiJExJTkVOTyIgNQorICAgIGZpCisgIGZpCiAKICAgICAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgQm9vdCBKREsiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIEJvb3QgSkRLLi4uICIgPiY2OyB9Ci0gICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQk9PVF9KREsgKCRCT09UX0pES19WRVJTSU9OKSIgPiY1Ci0kYXNfZWNobyAiJEJPT1RfSkRLICgkQk9PVF9KREtfVkVSU0lPTikiID4mNjsgfQorICAgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJEJPT1RfSkRLIiA+JjUKKyRhc19lY2hvICIkQk9PVF9KREsiID4mNjsgfQorICAgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIEJvb3QgSkRLIHZlcnNpb24iID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgQm9vdCBKREsgdmVyc2lvbi4uLiAiID4mNjsgfQorICAgICAgICAgICAgICBCT09UX0pES19WRVJTSU9OPWAiJEJPT1RfSkRLL2Jpbi9qYXZhIiAtdmVyc2lvbiAyPiYxIHwgJFRSICdcblxyJyAnICAnYAorICAgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJEJPT1RfSkRLX1ZFUlNJT04iID4mNQorJGFzX2VjaG8gIiRCT09UX0pES19WRVJTSU9OIiA+JjY7IH0KICAgICAgICAgICAgIGZpICMgZW5kIGNoZWNrIGpkayB2ZXJzaW9uCiAgICAgICAgICAgZmkgIyBlbmQgY2hlY2sgcnQuamFyCiAgICAgICAgIGZpICMgZW5kIGNoZWNrIGphdmFjCkBAIC04ODAyLDEyICsxMDk4NCwxMjYgQEAKICAgICAjIE5vdyBleGVjdXRlIHRoZSB0ZXN0CiAKICAgICBpZiB0ZXN0ICJ4JEpBVkFfSE9NRSIgIT0geDsgdGhlbgotICAgICAgICBpZiB0ZXN0ICJ4JE9QRU5KREtfVEFSR0VUX09TIiA9IHh3aW5kb3dzOyB0aGVuCi0gICAgICAgICAgIyBPbiBXaW5kb3dzLCBKQVZBX0hPTUUgaXMgbGlrZWx5IGluIERPUy1zdHlsZQotICAgICAgICAgIEpBVkFfSE9NRV9QUk9DRVNTRUQ9ImAkQ1lHUEFUSCAtdSAiJEpBVkFfSE9NRSJgIgotICAgICAgICBlbHNlCi0gICAgICAgICAgSkFWQV9IT01FX1BST0NFU1NFRD0iJEpBVkFfSE9NRSIKLSAgICAgICAgZmkKKyAgICAgICAgSkFWQV9IT01FX1BST0NFU1NFRD0iJEpBVkFfSE9NRSIKKworICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5jeWd3aW4iOyB0aGVuCisKKyAgIyBJbnB1dCBtaWdodCBiZSBnaXZlbiBhcyBXaW5kb3dzIGZvcm1hdCwgc3RhcnQgYnkgY29udmVydGluZyB0bworICAjIHVuaXggZm9ybWF0LgorICBwYXRoPSIkSkFWQV9IT01FX1BST0NFU1NFRCIKKyAgbmV3X3BhdGg9YCRDWUdQQVRIIC11ICIkcGF0aCJgCisKKyAgIyBDeWd3aW4gdHJpZXMgdG8gaGlkZSBzb21lIGFzcGVjdHMgb2YgdGhlIFdpbmRvd3MgZmlsZSBzeXN0ZW0sIHN1Y2ggdGhhdCBiaW5hcmllcyBhcmUKKyAgIyBuYW1lZCAuZXhlIGJ1dCBjYWxsZWQgd2l0aG91dCB0aGF0IHN1ZmZpeC4gVGhlcmVmb3JlLCAiZm9vIiBhbmQgImZvby5leGUiIGFyZSBjb25zaWRlcmVkCisgICMgdGhlIHNhbWUgZmlsZSwgbW9zdCBvZiB0aGUgdGltZSAoYXMgaW4gInRlc3QgLWYiKS4gQnV0IG5vdCB3aGVuIHJ1bm5pbmcgY3lncGF0aCAtcywgdGhlbgorICAjICJmb28uZXhlIiBpcyBPSyBidXQgImZvbyIgaXMgYW4gZXJyb3IuCisgICMKKyAgIyBUaGlzIHRlc3QgaXMgdGhlcmVmb3JlIHNsaWdodGx5IG1vcmUgYWNjdXJhdGUgdGhhbiAidGVzdCAtZiIgdG8gY2hlY2sgZm9yIGZpbGUgcHJlY2Vuc2UuCisgICMgSXQgaXMgYWxzbyBhIHdheSB0byBtYWtlIHN1cmUgd2UgZ290IHRoZSBwcm9wZXIgZmlsZSBuYW1lIGZvciB0aGUgcmVhbCB0ZXN0IGxhdGVyIG9uLgorICB0ZXN0X3Nob3J0cGF0aD1gJENZR1BBVEggLXMgLW0gIiRuZXdfcGF0aCIgMj4gL2Rldi9udWxsYAorICBpZiB0ZXN0ICJ4JHRlc3Rfc2hvcnRwYXRoIiA9IHg7IHRoZW4KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSBwYXRoIG9mIEpBVkFfSE9NRV9QUk9DRVNTRUQsIHdoaWNoIHJlc29sdmVzIGFzIFwiJHBhdGhcIiwgaXMgaW52YWxpZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhlIHBhdGggb2YgSkFWQV9IT01FX1BST0NFU1NFRCwgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkcGF0aFwiLCBpcyBpbnZhbGlkLiIgPiY2O30KKyAgICBhc19mbl9lcnJvciAkPyAiQ2Fubm90IGxvY2F0ZSB0aGUgdGhlIHBhdGggb2YgSkFWQV9IT01FX1BST0NFU1NFRCIgIiRMSU5FTk8iIDUKKyAgZmkKKworICAjIENhbGwgaGVscGVyIGZ1bmN0aW9uIHdoaWNoIHBvc3NpYmx5IGNvbnZlcnRzIHRoaXMgdXNpbmcgRE9TLXN0eWxlIHNob3J0IG1vZGUuCisgICMgSWYgc28sIHRoZSB1cGRhdGVkIHBhdGggaXMgc3RvcmVkIGluICRuZXdfcGF0aC4KKworICBpbnB1dF9wYXRoPSIkbmV3X3BhdGgiCisgICMgQ2hlY2sgaWYgd2UgbmVlZCB0byBjb252ZXJ0IHRoaXMgdXNpbmcgRE9TLXN0eWxlIHNob3J0IG1vZGUuIElmIHRoZSBwYXRoCisgICMgY29udGFpbnMganVzdCBzaW1wbGUgY2hhcmFjdGVycywgdXNlIGl0LiBPdGhlcndpc2UgKHNwYWNlcywgd2VpcmQgY2hhcmFjdGVycyksCisgICMgdGFrZSBubyBjaGFuY2VzIGFuZCByZXdyaXRlIGl0LgorICAjIE5vdGU6IG00IGVhdHMgb3VyIFtdLCBzbyB3ZSBuZWVkIHRvIHVzZSBbIGFuZCBdIGluc3RlYWQuCisgIGhhc19mb3JiaWRkZW5fY2hhcnM9YCRFQ0hPICIkaW5wdXRfcGF0aCIgfCAkR1JFUCBbXi0uXy9hLXpBLVowLTldYAorICBpZiB0ZXN0ICJ4JGhhc19mb3JiaWRkZW5fY2hhcnMiICE9IHg7IHRoZW4KKyAgICAjIE5vdyBjb252ZXJ0IGl0IHRvIG1peGVkIERPUy1zdHlsZSwgc2hvcnQgbW9kZSAobm8gc3BhY2VzLCBhbmQgLyBpbnN0ZWFkIG9mIFwpCisgICAgc2hvcnRtb2RlX3BhdGg9YCRDWUdQQVRIIC1zIC1tIC1hICIkaW5wdXRfcGF0aCJgCisgICAgcGF0aF9hZnRlcl9zaG9ydG1vZGU9YCRDWUdQQVRIIC11ICIkc2hvcnRtb2RlX3BhdGgiYAorICAgIGlmIHRlc3QgIngkcGF0aF9hZnRlcl9zaG9ydG1vZGUiICE9ICJ4JGlucHV0X3RvX3Nob3J0cGF0aCI7IHRoZW4KKyAgICAgICMgR29pbmcgdG8gc2hvcnQgbW9kZSBhbmQgYmFjayBhZ2FpbiBkaWQgaW5kZWVkIG1hdHRlci4gU2luY2Ugc2hvcnQgbW9kZSBpcworICAgICAgIyBjYXNlIGluc2Vuc2l0aXZlLCBsZXQncyBtYWtlIGl0IGxvd2VyY2FzZSB0byBpbXByb3ZlIHJlYWRhYmlsaXR5LgorICAgICAgc2hvcnRtb2RlX3BhdGg9YCRFQ0hPICIkc2hvcnRtb2RlX3BhdGgiIHwgJFRSICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J2AKKyAgICAgICMgTm93IGNvbnZlcnQgaXQgYmFjayB0byBVbml4LXN0aWxlIChjeWdwYXRoKQorICAgICAgaW5wdXRfcGF0aD1gJENZR1BBVEggLXUgIiRzaG9ydG1vZGVfcGF0aCJgCisgICAgICBuZXdfcGF0aD0iJGlucHV0X3BhdGgiCisgICAgZmkKKyAgZmkKKworICB0ZXN0X2N5Z2RyaXZlX3ByZWZpeD1gJEVDSE8gJGlucHV0X3BhdGggfCAkR1JFUCBeL2N5Z2RyaXZlL2AKKyAgaWYgdGVzdCAieCR0ZXN0X2N5Z2RyaXZlX3ByZWZpeCIgPSB4OyB0aGVuCisgICAgIyBBcyBhIHNpbXBsZSBmaXgsIGV4Y2x1ZGUgL3Vzci9iaW4gc2luY2UgaXQncyBub3QgYSByZWFsIHBhdGguCisgICAgaWYgdGVzdCAieGAkRUNITyAkbmV3X3BhdGggfCAkR1JFUCBeL3Vzci9iaW4vYCIgPSB4OyB0aGVuCisgICAgICAjIFRoZSBwYXRoIGlzIGluIGEgQ3lnd2luIHNwZWNpYWwgZGlyZWN0b3J5IChlLmcuIC9ob21lKS4gV2UgbmVlZCB0aGlzIGNvbnZlcnRlZCB0bworICAgICAgIyBhIHBhdGggcHJlZml4ZWQgYnkgL2N5Z2RyaXZlIGZvciBmaXhwYXRoIHRvIHdvcmsuCisgICAgICBuZXdfcGF0aD0iJENZR1dJTl9ST09UX1BBVEgkaW5wdXRfcGF0aCIKKyAgICBmaQorICBmaQorCisKKyAgaWYgdGVzdCAieCRwYXRoIiAhPSAieCRuZXdfcGF0aCI7IHRoZW4KKyAgICBKQVZBX0hPTUVfUFJPQ0VTU0VEPSIkbmV3X3BhdGgiCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBSZXdyaXRpbmcgSkFWQV9IT01FX1BST0NFU1NFRCB0byBcIiRuZXdfcGF0aFwiIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFJld3JpdGluZyBKQVZBX0hPTUVfUFJPQ0VTU0VEIHRvIFwiJG5ld19wYXRoXCIiID4mNjt9CisgIGZpCisKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorCisgIHBhdGg9IiRKQVZBX0hPTUVfUFJPQ0VTU0VEIgorICBoYXNfY29sb249YCRFQ0hPICRwYXRoIHwgJEdSRVAgXi46YAorICBuZXdfcGF0aD0iJHBhdGgiCisgIGlmIHRlc3QgIngkaGFzX2NvbG9uIiA9IHg7IHRoZW4KKyAgICAjIE5vdCBpbiBtaXhlZCBvciBXaW5kb3dzIHN0eWxlLCBzdGFydCBieSB0aGF0LgorICAgIG5ld19wYXRoPWBjbWQgLy9jIGVjaG8gJHBhdGhgCisgIGZpCisKKworICBpbnB1dF9wYXRoPSIkbmV3X3BhdGgiCisgICMgQ2hlY2sgaWYgd2UgbmVlZCB0byBjb252ZXJ0IHRoaXMgdXNpbmcgRE9TLXN0eWxlIHNob3J0IG1vZGUuIElmIHRoZSBwYXRoCisgICMgY29udGFpbnMganVzdCBzaW1wbGUgY2hhcmFjdGVycywgdXNlIGl0LiBPdGhlcndpc2UgKHNwYWNlcywgd2VpcmQgY2hhcmFjdGVycyksCisgICMgdGFrZSBubyBjaGFuY2VzIGFuZCByZXdyaXRlIGl0LgorICAjIE5vdGU6IG00IGVhdHMgb3VyIFtdLCBzbyB3ZSBuZWVkIHRvIHVzZSBbIGFuZCBdIGluc3RlYWQuCisgIGhhc19mb3JiaWRkZW5fY2hhcnM9YCRFQ0hPICIkaW5wdXRfcGF0aCIgfCAkR1JFUCBbXi1fLzphLXpBLVowLTldYAorICBpZiB0ZXN0ICJ4JGhhc19mb3JiaWRkZW5fY2hhcnMiICE9IHg7IHRoZW4KKyAgICAjIE5vdyBjb252ZXJ0IGl0IHRvIG1peGVkIERPUy1zdHlsZSwgc2hvcnQgbW9kZSAobm8gc3BhY2VzLCBhbmQgLyBpbnN0ZWFkIG9mIFwpCisgICAgbmV3X3BhdGg9YGNtZCAvYyAiZm9yICVBIGluIChcIiRpbnB1dF9wYXRoXCIpIGRvIEBlY2hvICV+c0EifCRUUiBcXFxcXFxcXCAvIHwgJFRSICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J2AKKyAgZmkKKworCisgIHdpbmRvd3NfcGF0aD0iJG5ld19wYXRoIgorICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5jeWd3aW4iOyB0aGVuCisgICAgdW5peF9wYXRoPWAkQ1lHUEFUSCAtdSAiJHdpbmRvd3NfcGF0aCJgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGVsaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MubXN5cyI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRFQ0hPICIkd2luZG93c19wYXRoIiB8ICRTRUQgLWUgJ3MsXlxcKC5cXCk6LC9cXDEsZycgLWUgJ3MsXFxcXCwvLGcnYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBmaQorCisgIGlmIHRlc3QgIngkcGF0aCIgIT0gIngkbmV3X3BhdGgiOyB0aGVuCisgICAgSkFWQV9IT01FX1BST0NFU1NFRD0iJG5ld19wYXRoIgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogUmV3cml0aW5nIEpBVkFfSE9NRV9QUk9DRVNTRUQgdG8gXCIkbmV3X3BhdGhcIiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBSZXdyaXRpbmcgSkFWQV9IT01FX1BST0NFU1NFRCB0byBcIiRuZXdfcGF0aFwiIiA+JjY7fQorICBmaQorCisgICMgU2F2ZSB0aGUgZmlyc3QgMTAgYnl0ZXMgb2YgdGhpcyBwYXRoIHRvIHRoZSBzdG9yYWdlLCBzbyBmaXhwYXRoIGNhbiB3b3JrLgorICBhbGxfZml4cGF0aF9wcmVmaXhlcz0oIiR7YWxsX2ZpeHBhdGhfcHJlZml4ZXNbQF19IiAiJHtuZXdfcGF0aDowOjEwfSIpCisKKyAgZWxzZQorICAgICMgV2UncmUgb24gYSBwb3NpeCBwbGF0Zm9ybS4gSG9vcmF5ISA6KQorICAgIHBhdGg9IiRKQVZBX0hPTUVfUFJPQ0VTU0VEIgorCisgICAgaWYgdGVzdCAhIC1mICIkcGF0aCIgJiYgdGVzdCAhIC1kICIkcGF0aCI7IHRoZW4KKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJUaGUgcGF0aCBvZiBKQVZBX0hPTUVfUFJPQ0VTU0VELCB3aGljaCByZXNvbHZlcyBhcyBcIiRwYXRoXCIsIGlzIG5vdCBmb3VuZC4iICIkTElORU5PIiA1CisgICAgZmkKKworICAgIGhhc19zcGFjZT1gJEVDSE8gIiRwYXRoIiB8ICRHUkVQICIgImAKKyAgICBpZiB0ZXN0ICJ4JGhhc19zcGFjZSIgIT0geDsgdGhlbgorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUaGUgcGF0aCBvZiBKQVZBX0hPTUVfUFJPQ0VTU0VELCB3aGljaCByZXNvbHZlcyBhcyBcIiRwYXRoXCIsIGlzIGludmFsaWQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoZSBwYXRoIG9mIEpBVkFfSE9NRV9QUk9DRVNTRUQsIHdoaWNoIHJlc29sdmVzIGFzIFwiJHBhdGhcIiwgaXMgaW52YWxpZC4iID4mNjt9CisgICAgICBhc19mbl9lcnJvciAkPyAiU3BhY2VzIGFyZSBub3QgYWxsb3dlZCBpbiB0aGlzIHBhdGguIiAiJExJTkVOTyIgNQorICAgIGZpCisgIGZpCisKICAgICAgICAgaWYgdGVzdCAhIC1kICIkSkFWQV9IT01FX1BST0NFU1NFRCI7IHRoZW4KICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogWW91ciBKQVZBX0hPTUUgcG9pbnRzIHRvIGEgbm9uLWV4aXN0aW5nIGRpcmVjdG9yeSEiID4mNQogJGFzX2VjaG8gIiRhc19tZTogWW91ciBKQVZBX0hPTUUgcG9pbnRzIHRvIGEgbm9uLWV4aXN0aW5nIGRpcmVjdG9yeSEiID4mNjt9CkBAIC04ODU5LDI2ICsxMTE1NSwxMzMgQEAKICAgICAgICAgICAgICAgIyBXZSdyZSBkb25lISA6LSkKICAgICAgICAgICAgICAgQk9PVF9KREtfRk9VTkQ9eWVzCiAKLSAgICAjIEZhaWwgd2l0aCBtZXNzYWdlIHRoZSBwYXRoIHRvIHRoZSBCb290IEpESyBpZiB2YXIgQk9PVF9KREsgY29udGFpbnMgYSBwYXRoIHdpdGggbm8gc3BhY2VzIGluIGl0LgotICAgICMgVW5sZXNzIG9uIFdpbmRvd3MsIHdoZXJlIHdlIGNhbiByZXdyaXRlIHRoZSBwYXRoLgotICAgIEhBU19TUEFDRT1gZWNobyAiJEJPT1RfSkRLIiB8IGdyZXAgIiAiYAotICAgIGlmIHRlc3QgIngkSEFTX1NQQUNFIiAhPSB4OyB0aGVuCi0gICAgICAgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PUyIgPSAieHdpbmRvd3MiOyB0aGVuCi0gICAgICAgICAgICAjIEZpcnN0IGNvbnZlcnQgaXQgdG8gRE9TLXN0eWxlLCBzaG9ydCBtb2RlIChubyBzcGFjZXMpCi0gICAgICAgICAgICBCT09UX0pESz1gJENZR1BBVEggLXMgLW0gLWEgIiRCT09UX0pESyJgCi0gICAgICAgICAgICAjIE5vdyBpdCdzIGNhc2UgaW5zZW5zaXRpdmU7IGxldCdzIG1ha2UgaXQgbG93ZXJjYXNlIHRvIGltcHJvdmUgcmVhZGFiaWxpdHkKLSAgICAgICAgICAgIEJPT1RfSkRLPWAkRUNITyAiJEJPT1RfSkRLIiB8ICRUUiAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2cXh5eidgCi0gICAgICAgICAgICAjIE5vdyBjb252ZXJ0IGl0IGJhY2sgdG8gVW5peC1zdGlsZSAoY3lncGF0aCkKLSAgICAgICAgICAgIEJPT1RfSkRLPWAkQ1lHUEFUSCAtdSAiJEJPT1RfSkRLImAKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgYXNfZm5fZXJyb3IgJD8gIllvdSBjYW5ub3QgaGF2ZSBzcGFjZXMgaW4gdGhlIHBhdGggdG8gdGhlIEJvb3QgSkRLISBcIiRCT09UX0pES1wiIiAiJExJTkVOTyIgNQotICAgICAgICBmaQorICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5jeWd3aW4iOyB0aGVuCisKKyAgIyBJbnB1dCBtaWdodCBiZSBnaXZlbiBhcyBXaW5kb3dzIGZvcm1hdCwgc3RhcnQgYnkgY29udmVydGluZyB0bworICAjIHVuaXggZm9ybWF0LgorICBwYXRoPSIkQk9PVF9KREsiCisgIG5ld19wYXRoPWAkQ1lHUEFUSCAtdSAiJHBhdGgiYAorCisgICMgQ3lnd2luIHRyaWVzIHRvIGhpZGUgc29tZSBhc3BlY3RzIG9mIHRoZSBXaW5kb3dzIGZpbGUgc3lzdGVtLCBzdWNoIHRoYXQgYmluYXJpZXMgYXJlCisgICMgbmFtZWQgLmV4ZSBidXQgY2FsbGVkIHdpdGhvdXQgdGhhdCBzdWZmaXguIFRoZXJlZm9yZSwgImZvbyIgYW5kICJmb28uZXhlIiBhcmUgY29uc2lkZXJlZAorICAjIHRoZSBzYW1lIGZpbGUsIG1vc3Qgb2YgdGhlIHRpbWUgKGFzIGluICJ0ZXN0IC1mIikuIEJ1dCBub3Qgd2hlbiBydW5uaW5nIGN5Z3BhdGggLXMsIHRoZW4KKyAgIyAiZm9vLmV4ZSIgaXMgT0sgYnV0ICJmb28iIGlzIGFuIGVycm9yLgorICAjCisgICMgVGhpcyB0ZXN0IGlzIHRoZXJlZm9yZSBzbGlnaHRseSBtb3JlIGFjY3VyYXRlIHRoYW4gInRlc3QgLWYiIHRvIGNoZWNrIGZvciBmaWxlIHByZWNlbnNlLgorICAjIEl0IGlzIGFsc28gYSB3YXkgdG8gbWFrZSBzdXJlIHdlIGdvdCB0aGUgcHJvcGVyIGZpbGUgbmFtZSBmb3IgdGhlIHJlYWwgdGVzdCBsYXRlciBvbi4KKyAgdGVzdF9zaG9ydHBhdGg9YCRDWUdQQVRIIC1zIC1tICIkbmV3X3BhdGgiIDI+IC9kZXYvbnVsbGAKKyAgaWYgdGVzdCAieCR0ZXN0X3Nob3J0cGF0aCIgPSB4OyB0aGVuCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUaGUgcGF0aCBvZiBCT09UX0pESywgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkcGF0aFwiLCBpcyBpbnZhbGlkLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUaGUgcGF0aCBvZiBCT09UX0pESywgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkcGF0aFwiLCBpcyBpbnZhbGlkLiIgPiY2O30KKyAgICBhc19mbl9lcnJvciAkPyAiQ2Fubm90IGxvY2F0ZSB0aGUgdGhlIHBhdGggb2YgQk9PVF9KREsiICIkTElORU5PIiA1CisgIGZpCisKKyAgIyBDYWxsIGhlbHBlciBmdW5jdGlvbiB3aGljaCBwb3NzaWJseSBjb252ZXJ0cyB0aGlzIHVzaW5nIERPUy1zdHlsZSBzaG9ydCBtb2RlLgorICAjIElmIHNvLCB0aGUgdXBkYXRlZCBwYXRoIGlzIHN0b3JlZCBpbiAkbmV3X3BhdGguCisKKyAgaW5wdXRfcGF0aD0iJG5ld19wYXRoIgorICAjIENoZWNrIGlmIHdlIG5lZWQgdG8gY29udmVydCB0aGlzIHVzaW5nIERPUy1zdHlsZSBzaG9ydCBtb2RlLiBJZiB0aGUgcGF0aAorICAjIGNvbnRhaW5zIGp1c3Qgc2ltcGxlIGNoYXJhY3RlcnMsIHVzZSBpdC4gT3RoZXJ3aXNlIChzcGFjZXMsIHdlaXJkIGNoYXJhY3RlcnMpLAorICAjIHRha2Ugbm8gY2hhbmNlcyBhbmQgcmV3cml0ZSBpdC4KKyAgIyBOb3RlOiBtNCBlYXRzIG91ciBbXSwgc28gd2UgbmVlZCB0byB1c2UgWyBhbmQgXSBpbnN0ZWFkLgorICBoYXNfZm9yYmlkZGVuX2NoYXJzPWAkRUNITyAiJGlucHV0X3BhdGgiIHwgJEdSRVAgW14tLl8vYS16QS1aMC05XWAKKyAgaWYgdGVzdCAieCRoYXNfZm9yYmlkZGVuX2NoYXJzIiAhPSB4OyB0aGVuCisgICAgIyBOb3cgY29udmVydCBpdCB0byBtaXhlZCBET1Mtc3R5bGUsIHNob3J0IG1vZGUgKG5vIHNwYWNlcywgYW5kIC8gaW5zdGVhZCBvZiBcKQorICAgIHNob3J0bW9kZV9wYXRoPWAkQ1lHUEFUSCAtcyAtbSAtYSAiJGlucHV0X3BhdGgiYAorICAgIHBhdGhfYWZ0ZXJfc2hvcnRtb2RlPWAkQ1lHUEFUSCAtdSAiJHNob3J0bW9kZV9wYXRoImAKKyAgICBpZiB0ZXN0ICJ4JHBhdGhfYWZ0ZXJfc2hvcnRtb2RlIiAhPSAieCRpbnB1dF90b19zaG9ydHBhdGgiOyB0aGVuCisgICAgICAjIEdvaW5nIHRvIHNob3J0IG1vZGUgYW5kIGJhY2sgYWdhaW4gZGlkIGluZGVlZCBtYXR0ZXIuIFNpbmNlIHNob3J0IG1vZGUgaXMKKyAgICAgICMgY2FzZSBpbnNlbnNpdGl2ZSwgbGV0J3MgbWFrZSBpdCBsb3dlcmNhc2UgdG8gaW1wcm92ZSByZWFkYWJpbGl0eS4KKyAgICAgIHNob3J0bW9kZV9wYXRoPWAkRUNITyAiJHNob3J0bW9kZV9wYXRoIiB8ICRUUiAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidgCisgICAgICAjIE5vdyBjb252ZXJ0IGl0IGJhY2sgdG8gVW5peC1zdGlsZSAoY3lncGF0aCkKKyAgICAgIGlucHV0X3BhdGg9YCRDWUdQQVRIIC11ICIkc2hvcnRtb2RlX3BhdGgiYAorICAgICAgbmV3X3BhdGg9IiRpbnB1dF9wYXRoIgogICAgIGZpCisgIGZpCisKKyAgdGVzdF9jeWdkcml2ZV9wcmVmaXg9YCRFQ0hPICRpbnB1dF9wYXRoIHwgJEdSRVAgXi9jeWdkcml2ZS9gCisgIGlmIHRlc3QgIngkdGVzdF9jeWdkcml2ZV9wcmVmaXgiID0geDsgdGhlbgorICAgICMgQXMgYSBzaW1wbGUgZml4LCBleGNsdWRlIC91c3IvYmluIHNpbmNlIGl0J3Mgbm90IGEgcmVhbCBwYXRoLgorICAgIGlmIHRlc3QgInhgJEVDSE8gJG5ld19wYXRoIHwgJEdSRVAgXi91c3IvYmluL2AiID0geDsgdGhlbgorICAgICAgIyBUaGUgcGF0aCBpcyBpbiBhIEN5Z3dpbiBzcGVjaWFsIGRpcmVjdG9yeSAoZS5nLiAvaG9tZSkuIFdlIG5lZWQgdGhpcyBjb252ZXJ0ZWQgdG8KKyAgICAgICMgYSBwYXRoIHByZWZpeGVkIGJ5IC9jeWdkcml2ZSBmb3IgZml4cGF0aCB0byB3b3JrLgorICAgICAgbmV3X3BhdGg9IiRDWUdXSU5fUk9PVF9QQVRIJGlucHV0X3BhdGgiCisgICAgZmkKKyAgZmkKKworCisgIGlmIHRlc3QgIngkcGF0aCIgIT0gIngkbmV3X3BhdGgiOyB0aGVuCisgICAgQk9PVF9KREs9IiRuZXdfcGF0aCIKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFJld3JpdGluZyBCT09UX0pESyB0byBcIiRuZXdfcGF0aFwiIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFJld3JpdGluZyBCT09UX0pESyB0byBcIiRuZXdfcGF0aFwiIiA+JjY7fQorICBmaQorCisgIGVsaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MubXN5cyI7IHRoZW4KKworICBwYXRoPSIkQk9PVF9KREsiCisgIGhhc19jb2xvbj1gJEVDSE8gJHBhdGggfCAkR1JFUCBeLjpgCisgIG5ld19wYXRoPSIkcGF0aCIKKyAgaWYgdGVzdCAieCRoYXNfY29sb24iID0geDsgdGhlbgorICAgICMgTm90IGluIG1peGVkIG9yIFdpbmRvd3Mgc3R5bGUsIHN0YXJ0IGJ5IHRoYXQuCisgICAgbmV3X3BhdGg9YGNtZCAvL2MgZWNobyAkcGF0aGAKKyAgZmkKKworCisgIGlucHV0X3BhdGg9IiRuZXdfcGF0aCIKKyAgIyBDaGVjayBpZiB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhpcyB1c2luZyBET1Mtc3R5bGUgc2hvcnQgbW9kZS4gSWYgdGhlIHBhdGgKKyAgIyBjb250YWlucyBqdXN0IHNpbXBsZSBjaGFyYWN0ZXJzLCB1c2UgaXQuIE90aGVyd2lzZSAoc3BhY2VzLCB3ZWlyZCBjaGFyYWN0ZXJzKSwKKyAgIyB0YWtlIG5vIGNoYW5jZXMgYW5kIHJld3JpdGUgaXQuCisgICMgTm90ZTogbTQgZWF0cyBvdXIgW10sIHNvIHdlIG5lZWQgdG8gdXNlIFsgYW5kIF0gaW5zdGVhZC4KKyAgaGFzX2ZvcmJpZGRlbl9jaGFycz1gJEVDSE8gIiRpbnB1dF9wYXRoIiB8ICRHUkVQIFteLV8vOmEtekEtWjAtOV1gCisgIGlmIHRlc3QgIngkaGFzX2ZvcmJpZGRlbl9jaGFycyIgIT0geDsgdGhlbgorICAgICMgTm93IGNvbnZlcnQgaXQgdG8gbWl4ZWQgRE9TLXN0eWxlLCBzaG9ydCBtb2RlIChubyBzcGFjZXMsIGFuZCAvIGluc3RlYWQgb2YgXCkKKyAgICBuZXdfcGF0aD1gY21kIC9jICJmb3IgJUEgaW4gKFwiJGlucHV0X3BhdGhcIikgZG8gQGVjaG8gJX5zQSJ8JFRSIFxcXFxcXFxcIC8gfCAkVFIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAorICBmaQorCisKKyAgd2luZG93c19wYXRoPSIkbmV3X3BhdGgiCisgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLmN5Z3dpbiI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRDWUdQQVRIIC11ICIkd2luZG93c19wYXRoImAKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJEVDSE8gIiR3aW5kb3dzX3BhdGgiIHwgJFNFRCAtZSAncyxeXFwoLlxcKTosL1xcMSxnJyAtZSAncyxcXFxcLC8sZydgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGZpCisKKyAgaWYgdGVzdCAieCRwYXRoIiAhPSAieCRuZXdfcGF0aCI7IHRoZW4KKyAgICBCT09UX0pESz0iJG5ld19wYXRoIgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogUmV3cml0aW5nIEJPT1RfSkRLIHRvIFwiJG5ld19wYXRoXCIiID4mNQorJGFzX2VjaG8gIiRhc19tZTogUmV3cml0aW5nIEJPT1RfSkRLIHRvIFwiJG5ld19wYXRoXCIiID4mNjt9CisgIGZpCisKKyAgIyBTYXZlIHRoZSBmaXJzdCAxMCBieXRlcyBvZiB0aGlzIHBhdGggdG8gdGhlIHN0b3JhZ2UsIHNvIGZpeHBhdGggY2FuIHdvcmsuCisgIGFsbF9maXhwYXRoX3ByZWZpeGVzPSgiJHthbGxfZml4cGF0aF9wcmVmaXhlc1tAXX0iICIke25ld19wYXRoOjA6MTB9IikKKworICBlbHNlCisgICAgIyBXZSdyZSBvbiBhIHBvc2l4IHBsYXRmb3JtLiBIb29yYXkhIDopCisgICAgcGF0aD0iJEJPT1RfSkRLIgorCisgICAgaWYgdGVzdCAhIC1mICIkcGF0aCIgJiYgdGVzdCAhIC1kICIkcGF0aCI7IHRoZW4KKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJUaGUgcGF0aCBvZiBCT09UX0pESywgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkcGF0aFwiLCBpcyBub3QgZm91bmQuIiAiJExJTkVOTyIgNQorICAgIGZpCisKKyAgICBoYXNfc3BhY2U9YCRFQ0hPICIkcGF0aCIgfCAkR1JFUCAiICJgCisgICAgaWYgdGVzdCAieCRoYXNfc3BhY2UiICE9IHg7IHRoZW4KKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGhlIHBhdGggb2YgQk9PVF9KREssIHdoaWNoIHJlc29sdmVzIGFzIFwiJHBhdGhcIiwgaXMgaW52YWxpZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhlIHBhdGggb2YgQk9PVF9KREssIHdoaWNoIHJlc29sdmVzIGFzIFwiJHBhdGhcIiwgaXMgaW52YWxpZC4iID4mNjt9CisgICAgICBhc19mbl9lcnJvciAkPyAiU3BhY2VzIGFyZSBub3QgYWxsb3dlZCBpbiB0aGlzIHBhdGguIiAiJExJTkVOTyIgNQorICAgIGZpCisgIGZpCiAKICAgICAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgQm9vdCBKREsiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIEJvb3QgSkRLLi4uICIgPiY2OyB9Ci0gICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQk9PVF9KREsgKCRCT09UX0pES19WRVJTSU9OKSIgPiY1Ci0kYXNfZWNobyAiJEJPT1RfSkRLICgkQk9PVF9KREtfVkVSU0lPTikiID4mNjsgfQorICAgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJEJPT1RfSkRLIiA+JjUKKyRhc19lY2hvICIkQk9PVF9KREsiID4mNjsgfQorICAgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIEJvb3QgSkRLIHZlcnNpb24iID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgQm9vdCBKREsgdmVyc2lvbi4uLiAiID4mNjsgfQorICAgICAgICAgICAgICBCT09UX0pES19WRVJTSU9OPWAiJEJPT1RfSkRLL2Jpbi9qYXZhIiAtdmVyc2lvbiAyPiYxIHwgJFRSICdcblxyJyAnICAnYAorICAgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJEJPT1RfSkRLX1ZFUlNJT04iID4mNQorJGFzX2VjaG8gIiRCT09UX0pES19WRVJTSU9OIiA+JjY7IH0KICAgICAgICAgICAgIGZpICMgZW5kIGNoZWNrIGpkayB2ZXJzaW9uCiAgICAgICAgICAgZmkgIyBlbmQgY2hlY2sgcnQuamFyCiAgICAgICAgIGZpICMgZW5kIGNoZWNrIGphdmFjCkBAIC04OTM3LDI2ICsxMTM0MCwxMzMgQEAKICAgICAgICAgICAgICAgIyBXZSdyZSBkb25lISA6LSkKICAgICAgICAgICAgICAgQk9PVF9KREtfRk9VTkQ9eWVzCiAKLSAgICAjIEZhaWwgd2l0aCBtZXNzYWdlIHRoZSBwYXRoIHRvIHRoZSBCb290IEpESyBpZiB2YXIgQk9PVF9KREsgY29udGFpbnMgYSBwYXRoIHdpdGggbm8gc3BhY2VzIGluIGl0LgotICAgICMgVW5sZXNzIG9uIFdpbmRvd3MsIHdoZXJlIHdlIGNhbiByZXdyaXRlIHRoZSBwYXRoLgotICAgIEhBU19TUEFDRT1gZWNobyAiJEJPT1RfSkRLIiB8IGdyZXAgIiAiYAotICAgIGlmIHRlc3QgIngkSEFTX1NQQUNFIiAhPSB4OyB0aGVuCi0gICAgICAgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PUyIgPSAieHdpbmRvd3MiOyB0aGVuCi0gICAgICAgICAgICAjIEZpcnN0IGNvbnZlcnQgaXQgdG8gRE9TLXN0eWxlLCBzaG9ydCBtb2RlIChubyBzcGFjZXMpCi0gICAgICAgICAgICBCT09UX0pESz1gJENZR1BBVEggLXMgLW0gLWEgIiRCT09UX0pESyJgCi0gICAgICAgICAgICAjIE5vdyBpdCdzIGNhc2UgaW5zZW5zaXRpdmU7IGxldCdzIG1ha2UgaXQgbG93ZXJjYXNlIHRvIGltcHJvdmUgcmVhZGFiaWxpdHkKLSAgICAgICAgICAgIEJPT1RfSkRLPWAkRUNITyAiJEJPT1RfSkRLIiB8ICRUUiAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2cXh5eidgCi0gICAgICAgICAgICAjIE5vdyBjb252ZXJ0IGl0IGJhY2sgdG8gVW5peC1zdGlsZSAoY3lncGF0aCkKLSAgICAgICAgICAgIEJPT1RfSkRLPWAkQ1lHUEFUSCAtdSAiJEJPT1RfSkRLImAKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgYXNfZm5fZXJyb3IgJD8gIllvdSBjYW5ub3QgaGF2ZSBzcGFjZXMgaW4gdGhlIHBhdGggdG8gdGhlIEJvb3QgSkRLISBcIiRCT09UX0pES1wiIiAiJExJTkVOTyIgNQotICAgICAgICBmaQorICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5jeWd3aW4iOyB0aGVuCisKKyAgIyBJbnB1dCBtaWdodCBiZSBnaXZlbiBhcyBXaW5kb3dzIGZvcm1hdCwgc3RhcnQgYnkgY29udmVydGluZyB0bworICAjIHVuaXggZm9ybWF0LgorICBwYXRoPSIkQk9PVF9KREsiCisgIG5ld19wYXRoPWAkQ1lHUEFUSCAtdSAiJHBhdGgiYAorCisgICMgQ3lnd2luIHRyaWVzIHRvIGhpZGUgc29tZSBhc3BlY3RzIG9mIHRoZSBXaW5kb3dzIGZpbGUgc3lzdGVtLCBzdWNoIHRoYXQgYmluYXJpZXMgYXJlCisgICMgbmFtZWQgLmV4ZSBidXQgY2FsbGVkIHdpdGhvdXQgdGhhdCBzdWZmaXguIFRoZXJlZm9yZSwgImZvbyIgYW5kICJmb28uZXhlIiBhcmUgY29uc2lkZXJlZAorICAjIHRoZSBzYW1lIGZpbGUsIG1vc3Qgb2YgdGhlIHRpbWUgKGFzIGluICJ0ZXN0IC1mIikuIEJ1dCBub3Qgd2hlbiBydW5uaW5nIGN5Z3BhdGggLXMsIHRoZW4KKyAgIyAiZm9vLmV4ZSIgaXMgT0sgYnV0ICJmb28iIGlzIGFuIGVycm9yLgorICAjCisgICMgVGhpcyB0ZXN0IGlzIHRoZXJlZm9yZSBzbGlnaHRseSBtb3JlIGFjY3VyYXRlIHRoYW4gInRlc3QgLWYiIHRvIGNoZWNrIGZvciBmaWxlIHByZWNlbnNlLgorICAjIEl0IGlzIGFsc28gYSB3YXkgdG8gbWFrZSBzdXJlIHdlIGdvdCB0aGUgcHJvcGVyIGZpbGUgbmFtZSBmb3IgdGhlIHJlYWwgdGVzdCBsYXRlciBvbi4KKyAgdGVzdF9zaG9ydHBhdGg9YCRDWUdQQVRIIC1zIC1tICIkbmV3X3BhdGgiIDI+IC9kZXYvbnVsbGAKKyAgaWYgdGVzdCAieCR0ZXN0X3Nob3J0cGF0aCIgPSB4OyB0aGVuCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUaGUgcGF0aCBvZiBCT09UX0pESywgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkcGF0aFwiLCBpcyBpbnZhbGlkLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUaGUgcGF0aCBvZiBCT09UX0pESywgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkcGF0aFwiLCBpcyBpbnZhbGlkLiIgPiY2O30KKyAgICBhc19mbl9lcnJvciAkPyAiQ2Fubm90IGxvY2F0ZSB0aGUgdGhlIHBhdGggb2YgQk9PVF9KREsiICIkTElORU5PIiA1CisgIGZpCisKKyAgIyBDYWxsIGhlbHBlciBmdW5jdGlvbiB3aGljaCBwb3NzaWJseSBjb252ZXJ0cyB0aGlzIHVzaW5nIERPUy1zdHlsZSBzaG9ydCBtb2RlLgorICAjIElmIHNvLCB0aGUgdXBkYXRlZCBwYXRoIGlzIHN0b3JlZCBpbiAkbmV3X3BhdGguCisKKyAgaW5wdXRfcGF0aD0iJG5ld19wYXRoIgorICAjIENoZWNrIGlmIHdlIG5lZWQgdG8gY29udmVydCB0aGlzIHVzaW5nIERPUy1zdHlsZSBzaG9ydCBtb2RlLiBJZiB0aGUgcGF0aAorICAjIGNvbnRhaW5zIGp1c3Qgc2ltcGxlIGNoYXJhY3RlcnMsIHVzZSBpdC4gT3RoZXJ3aXNlIChzcGFjZXMsIHdlaXJkIGNoYXJhY3RlcnMpLAorICAjIHRha2Ugbm8gY2hhbmNlcyBhbmQgcmV3cml0ZSBpdC4KKyAgIyBOb3RlOiBtNCBlYXRzIG91ciBbXSwgc28gd2UgbmVlZCB0byB1c2UgWyBhbmQgXSBpbnN0ZWFkLgorICBoYXNfZm9yYmlkZGVuX2NoYXJzPWAkRUNITyAiJGlucHV0X3BhdGgiIHwgJEdSRVAgW14tLl8vYS16QS1aMC05XWAKKyAgaWYgdGVzdCAieCRoYXNfZm9yYmlkZGVuX2NoYXJzIiAhPSB4OyB0aGVuCisgICAgIyBOb3cgY29udmVydCBpdCB0byBtaXhlZCBET1Mtc3R5bGUsIHNob3J0IG1vZGUgKG5vIHNwYWNlcywgYW5kIC8gaW5zdGVhZCBvZiBcKQorICAgIHNob3J0bW9kZV9wYXRoPWAkQ1lHUEFUSCAtcyAtbSAtYSAiJGlucHV0X3BhdGgiYAorICAgIHBhdGhfYWZ0ZXJfc2hvcnRtb2RlPWAkQ1lHUEFUSCAtdSAiJHNob3J0bW9kZV9wYXRoImAKKyAgICBpZiB0ZXN0ICJ4JHBhdGhfYWZ0ZXJfc2hvcnRtb2RlIiAhPSAieCRpbnB1dF90b19zaG9ydHBhdGgiOyB0aGVuCisgICAgICAjIEdvaW5nIHRvIHNob3J0IG1vZGUgYW5kIGJhY2sgYWdhaW4gZGlkIGluZGVlZCBtYXR0ZXIuIFNpbmNlIHNob3J0IG1vZGUgaXMKKyAgICAgICMgY2FzZSBpbnNlbnNpdGl2ZSwgbGV0J3MgbWFrZSBpdCBsb3dlcmNhc2UgdG8gaW1wcm92ZSByZWFkYWJpbGl0eS4KKyAgICAgIHNob3J0bW9kZV9wYXRoPWAkRUNITyAiJHNob3J0bW9kZV9wYXRoIiB8ICRUUiAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidgCisgICAgICAjIE5vdyBjb252ZXJ0IGl0IGJhY2sgdG8gVW5peC1zdGlsZSAoY3lncGF0aCkKKyAgICAgIGlucHV0X3BhdGg9YCRDWUdQQVRIIC11ICIkc2hvcnRtb2RlX3BhdGgiYAorICAgICAgbmV3X3BhdGg9IiRpbnB1dF9wYXRoIgogICAgIGZpCisgIGZpCisKKyAgdGVzdF9jeWdkcml2ZV9wcmVmaXg9YCRFQ0hPICRpbnB1dF9wYXRoIHwgJEdSRVAgXi9jeWdkcml2ZS9gCisgIGlmIHRlc3QgIngkdGVzdF9jeWdkcml2ZV9wcmVmaXgiID0geDsgdGhlbgorICAgICMgQXMgYSBzaW1wbGUgZml4LCBleGNsdWRlIC91c3IvYmluIHNpbmNlIGl0J3Mgbm90IGEgcmVhbCBwYXRoLgorICAgIGlmIHRlc3QgInhgJEVDSE8gJG5ld19wYXRoIHwgJEdSRVAgXi91c3IvYmluL2AiID0geDsgdGhlbgorICAgICAgIyBUaGUgcGF0aCBpcyBpbiBhIEN5Z3dpbiBzcGVjaWFsIGRpcmVjdG9yeSAoZS5nLiAvaG9tZSkuIFdlIG5lZWQgdGhpcyBjb252ZXJ0ZWQgdG8KKyAgICAgICMgYSBwYXRoIHByZWZpeGVkIGJ5IC9jeWdkcml2ZSBmb3IgZml4cGF0aCB0byB3b3JrLgorICAgICAgbmV3X3BhdGg9IiRDWUdXSU5fUk9PVF9QQVRIJGlucHV0X3BhdGgiCisgICAgZmkKKyAgZmkKKworCisgIGlmIHRlc3QgIngkcGF0aCIgIT0gIngkbmV3X3BhdGgiOyB0aGVuCisgICAgQk9PVF9KREs9IiRuZXdfcGF0aCIKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFJld3JpdGluZyBCT09UX0pESyB0byBcIiRuZXdfcGF0aFwiIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFJld3JpdGluZyBCT09UX0pESyB0byBcIiRuZXdfcGF0aFwiIiA+JjY7fQorICBmaQorCisgIGVsaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MubXN5cyI7IHRoZW4KKworICBwYXRoPSIkQk9PVF9KREsiCisgIGhhc19jb2xvbj1gJEVDSE8gJHBhdGggfCAkR1JFUCBeLjpgCisgIG5ld19wYXRoPSIkcGF0aCIKKyAgaWYgdGVzdCAieCRoYXNfY29sb24iID0geDsgdGhlbgorICAgICMgTm90IGluIG1peGVkIG9yIFdpbmRvd3Mgc3R5bGUsIHN0YXJ0IGJ5IHRoYXQuCisgICAgbmV3X3BhdGg9YGNtZCAvL2MgZWNobyAkcGF0aGAKKyAgZmkKKworCisgIGlucHV0X3BhdGg9IiRuZXdfcGF0aCIKKyAgIyBDaGVjayBpZiB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhpcyB1c2luZyBET1Mtc3R5bGUgc2hvcnQgbW9kZS4gSWYgdGhlIHBhdGgKKyAgIyBjb250YWlucyBqdXN0IHNpbXBsZSBjaGFyYWN0ZXJzLCB1c2UgaXQuIE90aGVyd2lzZSAoc3BhY2VzLCB3ZWlyZCBjaGFyYWN0ZXJzKSwKKyAgIyB0YWtlIG5vIGNoYW5jZXMgYW5kIHJld3JpdGUgaXQuCisgICMgTm90ZTogbTQgZWF0cyBvdXIgW10sIHNvIHdlIG5lZWQgdG8gdXNlIFsgYW5kIF0gaW5zdGVhZC4KKyAgaGFzX2ZvcmJpZGRlbl9jaGFycz1gJEVDSE8gIiRpbnB1dF9wYXRoIiB8ICRHUkVQIFteLV8vOmEtekEtWjAtOV1gCisgIGlmIHRlc3QgIngkaGFzX2ZvcmJpZGRlbl9jaGFycyIgIT0geDsgdGhlbgorICAgICMgTm93IGNvbnZlcnQgaXQgdG8gbWl4ZWQgRE9TLXN0eWxlLCBzaG9ydCBtb2RlIChubyBzcGFjZXMsIGFuZCAvIGluc3RlYWQgb2YgXCkKKyAgICBuZXdfcGF0aD1gY21kIC9jICJmb3IgJUEgaW4gKFwiJGlucHV0X3BhdGhcIikgZG8gQGVjaG8gJX5zQSJ8JFRSIFxcXFxcXFxcIC8gfCAkVFIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAorICBmaQorCisKKyAgd2luZG93c19wYXRoPSIkbmV3X3BhdGgiCisgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLmN5Z3dpbiI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRDWUdQQVRIIC11ICIkd2luZG93c19wYXRoImAKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJEVDSE8gIiR3aW5kb3dzX3BhdGgiIHwgJFNFRCAtZSAncyxeXFwoLlxcKTosL1xcMSxnJyAtZSAncyxcXFxcLC8sZydgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGZpCisKKyAgaWYgdGVzdCAieCRwYXRoIiAhPSAieCRuZXdfcGF0aCI7IHRoZW4KKyAgICBCT09UX0pESz0iJG5ld19wYXRoIgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogUmV3cml0aW5nIEJPT1RfSkRLIHRvIFwiJG5ld19wYXRoXCIiID4mNQorJGFzX2VjaG8gIiRhc19tZTogUmV3cml0aW5nIEJPT1RfSkRLIHRvIFwiJG5ld19wYXRoXCIiID4mNjt9CisgIGZpCisKKyAgIyBTYXZlIHRoZSBmaXJzdCAxMCBieXRlcyBvZiB0aGlzIHBhdGggdG8gdGhlIHN0b3JhZ2UsIHNvIGZpeHBhdGggY2FuIHdvcmsuCisgIGFsbF9maXhwYXRoX3ByZWZpeGVzPSgiJHthbGxfZml4cGF0aF9wcmVmaXhlc1tAXX0iICIke25ld19wYXRoOjA6MTB9IikKKworICBlbHNlCisgICAgIyBXZSdyZSBvbiBhIHBvc2l4IHBsYXRmb3JtLiBIb29yYXkhIDopCisgICAgcGF0aD0iJEJPT1RfSkRLIgorCisgICAgaWYgdGVzdCAhIC1mICIkcGF0aCIgJiYgdGVzdCAhIC1kICIkcGF0aCI7IHRoZW4KKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJUaGUgcGF0aCBvZiBCT09UX0pESywgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkcGF0aFwiLCBpcyBub3QgZm91bmQuIiAiJExJTkVOTyIgNQorICAgIGZpCisKKyAgICBoYXNfc3BhY2U9YCRFQ0hPICIkcGF0aCIgfCAkR1JFUCAiICJgCisgICAgaWYgdGVzdCAieCRoYXNfc3BhY2UiICE9IHg7IHRoZW4KKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGhlIHBhdGggb2YgQk9PVF9KREssIHdoaWNoIHJlc29sdmVzIGFzIFwiJHBhdGhcIiwgaXMgaW52YWxpZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhlIHBhdGggb2YgQk9PVF9KREssIHdoaWNoIHJlc29sdmVzIGFzIFwiJHBhdGhcIiwgaXMgaW52YWxpZC4iID4mNjt9CisgICAgICBhc19mbl9lcnJvciAkPyAiU3BhY2VzIGFyZSBub3QgYWxsb3dlZCBpbiB0aGlzIHBhdGguIiAiJExJTkVOTyIgNQorICAgIGZpCisgIGZpCiAKICAgICAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgQm9vdCBKREsiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIEJvb3QgSkRLLi4uICIgPiY2OyB9Ci0gICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQk9PVF9KREsgKCRCT09UX0pES19WRVJTSU9OKSIgPiY1Ci0kYXNfZWNobyAiJEJPT1RfSkRLICgkQk9PVF9KREtfVkVSU0lPTikiID4mNjsgfQorICAgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJEJPT1RfSkRLIiA+JjUKKyRhc19lY2hvICIkQk9PVF9KREsiID4mNjsgfQorICAgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIEJvb3QgSkRLIHZlcnNpb24iID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgQm9vdCBKREsgdmVyc2lvbi4uLiAiID4mNjsgfQorICAgICAgICAgICAgICBCT09UX0pES19WRVJTSU9OPWAiJEJPT1RfSkRLL2Jpbi9qYXZhIiAtdmVyc2lvbiAyPiYxIHwgJFRSICdcblxyJyAnICAnYAorICAgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJEJPT1RfSkRLX1ZFUlNJT04iID4mNQorJGFzX2VjaG8gIiRCT09UX0pES19WRVJTSU9OIiA+JjY7IH0KICAgICAgICAgICAgIGZpICMgZW5kIGNoZWNrIGpkayB2ZXJzaW9uCiAgICAgICAgICAgZmkgIyBlbmQgY2hlY2sgcnQuamFyCiAgICAgICAgIGZpICMgZW5kIGNoZWNrIGphdmFjCkBAIC05MDYwLDc1ICsxMTU3MCwxNCBAQAogICAgICAgICAjIExpbnV4L0dOVSBzeXN0ZW1zIG9mdGVuIGhhdmUgbGlua3MgZnJvbSAvdXNyL2Jpbi9qYXZhIHRvCiAgICAgICAgICMgL2V0Yy9hbHRlcm5hdGl2ZXMvamF2YSB0byB0aGUgcmVhbCBKREsgYmluYXJ5LgogCi0gICAgIyBUcmFuc2xhdGUgbG9uZyBjeWdkcml2ZSBvciBDOlxzZGZzZiBwYXRoCi0gICAgIyBpbnRvIGEgc2hvcnQgbWl4ZWQgbW9kZSBwYXRoIHRoYXQgaGFzIG5vCi0gICAgIyBzcGFjZXMgaW4gaXQuCi0gICAgdG1wPSIkQklOQVJZIgotCi0gICAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TIiA9ICJ4d2luZG93cyI7IHRoZW4KLSAgICAgICAgdG1wPWAkQ1lHUEFUSCAtdSAiJEJJTkFSWSJgCi0gICAgICAgIHRtcD1gd2hpY2ggIiR0bXAiYAotICAgICAgICAjIElmIGZpbGUgZXhpc3RzIHdpdGggLmV4ZSBhcHBlbmRlZCwgdGhhdCdzIHRoZSByZWFsIGZpbGVuYW1lCi0gICAgICAgICMgYW5kIGN5Z3BhdGggbmVlZHMgdGhhdCB0byBjb252ZXJ0IHRvIHNob3J0IHN0eWxlIHBhdGguCi0gICAgICAgIGlmIHRlc3QgLWYgIiR7dG1wfS5leGUiOyB0aGVuCi0gICAgICAgICAgIHRtcD0iJHt0bXB9LmV4ZSIKLSAgICAgICAgZWxpZiB0ZXN0IC1mICIke3RtcH0uY21kIjsgdGhlbgotICAgICAgICAgICB0bXA9IiR7dG1wfS5jbWQiCi0gICAgICAgIGZpCi0gICAgICAgICMgQ29udmVydCB0byBDOi8gbWl4ZWQgc3R5bGUgcGF0aCB3aXRob3V0IHNwYWNlcy4KLSAgICAgICAgIHRtcD1gJENZR1BBVEggLXMgLW0gIiR0bXAiYAotICAgIGZpCi0gICAgQklOQVJZPSIkdG1wIgotCi0KICAgICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1MiICE9IHh3aW5kb3dzOyB0aGVuCiAgICAgICAgICMgRm9sbG93IGEgY2hhaW4gb2Ygc3ltYm9saWMgbGlua3MuIFVzZSByZWFkbGluawogICAgICAgICAjIHdoZXJlIGl0IGV4aXN0cywgZWxzZSBmYWxsIGJhY2sgdG8gaG9ycmlibHkKICAgICAgICAgIyBjb21wbGljYXRlZCBzaGVsbCBjb2RlLgotICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInJlYWRsaW5rIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSByZWFkbGluazsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3BhdGhfUkVBRExJTksrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgotZWxzZQotICBjYXNlICRSRUFETElOSyBpbgotICBbXFwvXSogfCA/OltcXC9dKikKLSAgYWNfY3ZfcGF0aF9SRUFETElOSz0iJFJFQURMSU5LIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCi0gICAgYWNfY3ZfcGF0aF9SRUFETElOSz0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotICA7OwotZXNhYwotZmkKLVJFQURMSU5LPSRhY19jdl9wYXRoX1JFQURMSU5LCi1pZiB0ZXN0IC1uICIkUkVBRExJTksiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkUkVBRExJTksiID4mNQotJGFzX2VjaG8gIiRSRUFETElOSyIgPiY2OyB9Ci1lbHNlCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotZmkKLQotCiAgICAgICAgIGlmIHRlc3QgIngkUkVBRExJTktfVEVTVEVEIiAhPSB5ZXM7IHRoZW4KICAgICAgICAgICAgICMgT24gTWFjT1NYIHRoZXJlIGlzIGEgcmVhZGxpbmsgdG9vbCB3aXRoIGEgZGlmZmVyZW50CiAgICAgICAgICAgICAjIHB1cnBvc2UgdGhhbiB0aGUgR05VIHJlYWRsaW5rIHRvb2wuIENoZWNrIHRoZSBmb3VuZCByZWFkbGluay4KLSAgICAgICAgICAgIElTR05VPWAkUkVBRExJTksgLS1oZWxwIDI+JjEgfCBncmVwIEdOVWAKKyAgICAgICAgICAgIElTR05VPWAkUkVBRExJTksgLS1oZWxwIDI+JjEgfCAkR1JFUCBHTlVgCiAgICAgICAgICAgICBpZiB0ZXN0ICJ4JElTR05VIiA9IHg7IHRoZW4KICAgICAgICAgICAgICAgICAgIyBBIHJlYWRsaW5rIHRoYXQgd2UgZG8gbm90IGtub3cgaG93IHRvIHVzZS4KICAgICAgICAgICAgICAgICAgIyBBcmUgdGhlcmUgb3RoZXIgbm9uLUdOVSByZWFkbGlua3Mgb3V0IHRoZXJlPwpAQCAtOTE0MiwyMyArMTE1OTEsMjUgQEAKICAgICAgICAgZWxzZQogICAgICAgICAgICAgU1RBUlRESVI9JFBXRAogICAgICAgICAgICAgQ09VTlRFUj0wCi0gICAgICAgICAgICBESVI9YGRpcm5hbWUgJEJJTkFSWWAKLSAgICAgICAgICAgIEZJTD1gYmFzZW5hbWUgJEJJTkFSWWAKKyAgICAgICAgICAgIHN5bV9saW5rX2Rpcj1gJERJUk5BTUUgJEJJTkFSWWAKKyAgICAgICAgICAgIHN5bV9saW5rX2ZpbGU9YCRCQVNFTkFNRSAkQklOQVJZYAogICAgICAgICAgICAgd2hpbGUgdGVzdCAkQ09VTlRFUiAtbHQgMjA7IGRvCi0gICAgICAgICAgICAgICAgSVNMSU5LPWBscyAtbCAkRElSLyRGSUwgfCBncmVwICdcLT4nIHwgc2VkIC1lICdzLy4qLT4gXCguKlwpL1wxLydgCisgICAgICAgICAgICAgICAgSVNMSU5LPWAkTFMgLWwgJHN5bV9saW5rX2Rpci8kc3ltX2xpbmtfZmlsZSB8ICRHUkVQICdcLT4nIHwgJFNFRCAtZSAncy8uKi0+IFwoLipcKS9cMS8nYAogICAgICAgICAgICAgICAgIGlmIHRlc3QgIngkSVNMSU5LIiA9PSB4OyB0aGVuCiAgICAgICAgICAgICAgICAgICAgICMgVGhpcyBpcyBub3QgYSBzeW1ib2xpYyBsaW5rISBXZSBhcmUgZG9uZSEKICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgICBmaQogICAgICAgICAgICAgICAgICMgVGhlIGxpbmsgbWlnaHQgYmUgcmVsYXRpdmUhIFdlIGhhdmUgdG8gdXNlIGNkIHRvIHRyYXZlbCBzYWZlbHkuCi0gICAgICAgICAgICAgICAgY2QgJERJUgotICAgICAgICAgICAgICAgIGNkIGBkaXJuYW1lICRJU0xJTktgCi0gICAgICAgICAgICAgICAgRElSPWBwd2RgCi0gICAgICAgICAgICAgICAgRklMPWBiYXNlbmFtZSAkSVNMSU5LYAorICAgICAgICAgICAgICAgIGNkICRzeW1fbGlua19kaXIKKyAgICAgICAgICAgICAgICAjIC4uLiBhbmQgd2UgbXVzdCBnZXQgdGhlIHRvIHRoZSBhYnNvbHV0ZSBwYXRoLCBub3Qgb25lIHVzaW5nIHN5bWJvbGljIGxpbmtzLgorICAgICAgICAgICAgICAgIGNkIGBwd2QgLVBgCisgICAgICAgICAgICAgICAgY2QgYCRESVJOQU1FICRJU0xJTktgCisgICAgICAgICAgICAgICAgc3ltX2xpbmtfZGlyPWAkVEhFUFdEQ01EYAorICAgICAgICAgICAgICAgIHN5bV9saW5rX2ZpbGU9YCRCQVNFTkFNRSAkSVNMSU5LYAogICAgICAgICAgICAgICAgIGxldCBDT1VOVEVSPUNPVU5URVIrMQogICAgICAgICAgICAgZG9uZQogICAgICAgICAgICAgY2QgJFNUQVJURElSCi0gICAgICAgICAgICBCSU5BUlk9JERJUi8kRklMCisgICAgICAgICAgICBCSU5BUlk9JHN5bV9saW5rX2Rpci8kc3ltX2xpbmtfZmlsZQogICAgICAgICBmaQogICAgIGZpCiAKQEAgLTkyMTAsMjYgKzExNjYxLDEzMyBAQAogICAgICAgICAgICAgICAjIFdlJ3JlIGRvbmUhIDotKQogICAgICAgICAgICAgICBCT09UX0pES19GT1VORD15ZXMKIAotICAgICMgRmFpbCB3aXRoIG1lc3NhZ2UgdGhlIHBhdGggdG8gdGhlIEJvb3QgSkRLIGlmIHZhciBCT09UX0pESyBjb250YWlucyBhIHBhdGggd2l0aCBubyBzcGFjZXMgaW4gaXQuCi0gICAgIyBVbmxlc3Mgb24gV2luZG93cywgd2hlcmUgd2UgY2FuIHJld3JpdGUgdGhlIHBhdGguCi0gICAgSEFTX1NQQUNFPWBlY2hvICIkQk9PVF9KREsiIHwgZ3JlcCAiICJgCi0gICAgaWYgdGVzdCAieCRIQVNfU1BBQ0UiICE9IHg7IHRoZW4KLSAgICAgICAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TIiA9ICJ4d2luZG93cyI7IHRoZW4KLSAgICAgICAgICAgICMgRmlyc3QgY29udmVydCBpdCB0byBET1Mtc3R5bGUsIHNob3J0IG1vZGUgKG5vIHNwYWNlcykKLSAgICAgICAgICAgIEJPT1RfSkRLPWAkQ1lHUEFUSCAtcyAtbSAtYSAiJEJPT1RfSkRLImAKLSAgICAgICAgICAgICMgTm93IGl0J3MgY2FzZSBpbnNlbnNpdGl2ZTsgbGV0J3MgbWFrZSBpdCBsb3dlcmNhc2UgdG8gaW1wcm92ZSByZWFkYWJpbGl0eQotICAgICAgICAgICAgQk9PVF9KREs9YCRFQ0hPICIkQk9PVF9KREsiIHwgJFRSICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZxeHl6J2AKLSAgICAgICAgICAgICMgTm93IGNvbnZlcnQgaXQgYmFjayB0byBVbml4LXN0aWxlIChjeWdwYXRoKQotICAgICAgICAgICAgQk9PVF9KREs9YCRDWUdQQVRIIC11ICIkQk9PVF9KREsiYAotICAgICAgICBlbHNlCi0gICAgICAgICAgICBhc19mbl9lcnJvciAkPyAiWW91IGNhbm5vdCBoYXZlIHNwYWNlcyBpbiB0aGUgcGF0aCB0byB0aGUgQm9vdCBKREshIFwiJEJPT1RfSkRLXCIiICIkTElORU5PIiA1Ci0gICAgICAgIGZpCisgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLmN5Z3dpbiI7IHRoZW4KKworICAjIElucHV0IG1pZ2h0IGJlIGdpdmVuIGFzIFdpbmRvd3MgZm9ybWF0LCBzdGFydCBieSBjb252ZXJ0aW5nIHRvCisgICMgdW5peCBmb3JtYXQuCisgIHBhdGg9IiRCT09UX0pESyIKKyAgbmV3X3BhdGg9YCRDWUdQQVRIIC11ICIkcGF0aCJgCisKKyAgIyBDeWd3aW4gdHJpZXMgdG8gaGlkZSBzb21lIGFzcGVjdHMgb2YgdGhlIFdpbmRvd3MgZmlsZSBzeXN0ZW0sIHN1Y2ggdGhhdCBiaW5hcmllcyBhcmUKKyAgIyBuYW1lZCAuZXhlIGJ1dCBjYWxsZWQgd2l0aG91dCB0aGF0IHN1ZmZpeC4gVGhlcmVmb3JlLCAiZm9vIiBhbmQgImZvby5leGUiIGFyZSBjb25zaWRlcmVkCisgICMgdGhlIHNhbWUgZmlsZSwgbW9zdCBvZiB0aGUgdGltZSAoYXMgaW4gInRlc3QgLWYiKS4gQnV0IG5vdCB3aGVuIHJ1bm5pbmcgY3lncGF0aCAtcywgdGhlbgorICAjICJmb28uZXhlIiBpcyBPSyBidXQgImZvbyIgaXMgYW4gZXJyb3IuCisgICMKKyAgIyBUaGlzIHRlc3QgaXMgdGhlcmVmb3JlIHNsaWdodGx5IG1vcmUgYWNjdXJhdGUgdGhhbiAidGVzdCAtZiIgdG8gY2hlY2sgZm9yIGZpbGUgcHJlY2Vuc2UuCisgICMgSXQgaXMgYWxzbyBhIHdheSB0byBtYWtlIHN1cmUgd2UgZ290IHRoZSBwcm9wZXIgZmlsZSBuYW1lIGZvciB0aGUgcmVhbCB0ZXN0IGxhdGVyIG9uLgorICB0ZXN0X3Nob3J0cGF0aD1gJENZR1BBVEggLXMgLW0gIiRuZXdfcGF0aCIgMj4gL2Rldi9udWxsYAorICBpZiB0ZXN0ICJ4JHRlc3Rfc2hvcnRwYXRoIiA9IHg7IHRoZW4KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSBwYXRoIG9mIEJPT1RfSkRLLCB3aGljaCByZXNvbHZlcyBhcyBcIiRwYXRoXCIsIGlzIGludmFsaWQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoZSBwYXRoIG9mIEJPT1RfSkRLLCB3aGljaCByZXNvbHZlcyBhcyBcIiRwYXRoXCIsIGlzIGludmFsaWQuIiA+JjY7fQorICAgIGFzX2ZuX2Vycm9yICQ/ICJDYW5ub3QgbG9jYXRlIHRoZSB0aGUgcGF0aCBvZiBCT09UX0pESyIgIiRMSU5FTk8iIDUKKyAgZmkKKworICAjIENhbGwgaGVscGVyIGZ1bmN0aW9uIHdoaWNoIHBvc3NpYmx5IGNvbnZlcnRzIHRoaXMgdXNpbmcgRE9TLXN0eWxlIHNob3J0IG1vZGUuCisgICMgSWYgc28sIHRoZSB1cGRhdGVkIHBhdGggaXMgc3RvcmVkIGluICRuZXdfcGF0aC4KKworICBpbnB1dF9wYXRoPSIkbmV3X3BhdGgiCisgICMgQ2hlY2sgaWYgd2UgbmVlZCB0byBjb252ZXJ0IHRoaXMgdXNpbmcgRE9TLXN0eWxlIHNob3J0IG1vZGUuIElmIHRoZSBwYXRoCisgICMgY29udGFpbnMganVzdCBzaW1wbGUgY2hhcmFjdGVycywgdXNlIGl0LiBPdGhlcndpc2UgKHNwYWNlcywgd2VpcmQgY2hhcmFjdGVycyksCisgICMgdGFrZSBubyBjaGFuY2VzIGFuZCByZXdyaXRlIGl0LgorICAjIE5vdGU6IG00IGVhdHMgb3VyIFtdLCBzbyB3ZSBuZWVkIHRvIHVzZSBbIGFuZCBdIGluc3RlYWQuCisgIGhhc19mb3JiaWRkZW5fY2hhcnM9YCRFQ0hPICIkaW5wdXRfcGF0aCIgfCAkR1JFUCBbXi0uXy9hLXpBLVowLTldYAorICBpZiB0ZXN0ICJ4JGhhc19mb3JiaWRkZW5fY2hhcnMiICE9IHg7IHRoZW4KKyAgICAjIE5vdyBjb252ZXJ0IGl0IHRvIG1peGVkIERPUy1zdHlsZSwgc2hvcnQgbW9kZSAobm8gc3BhY2VzLCBhbmQgLyBpbnN0ZWFkIG9mIFwpCisgICAgc2hvcnRtb2RlX3BhdGg9YCRDWUdQQVRIIC1zIC1tIC1hICIkaW5wdXRfcGF0aCJgCisgICAgcGF0aF9hZnRlcl9zaG9ydG1vZGU9YCRDWUdQQVRIIC11ICIkc2hvcnRtb2RlX3BhdGgiYAorICAgIGlmIHRlc3QgIngkcGF0aF9hZnRlcl9zaG9ydG1vZGUiICE9ICJ4JGlucHV0X3RvX3Nob3J0cGF0aCI7IHRoZW4KKyAgICAgICMgR29pbmcgdG8gc2hvcnQgbW9kZSBhbmQgYmFjayBhZ2FpbiBkaWQgaW5kZWVkIG1hdHRlci4gU2luY2Ugc2hvcnQgbW9kZSBpcworICAgICAgIyBjYXNlIGluc2Vuc2l0aXZlLCBsZXQncyBtYWtlIGl0IGxvd2VyY2FzZSB0byBpbXByb3ZlIHJlYWRhYmlsaXR5LgorICAgICAgc2hvcnRtb2RlX3BhdGg9YCRFQ0hPICIkc2hvcnRtb2RlX3BhdGgiIHwgJFRSICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J2AKKyAgICAgICMgTm93IGNvbnZlcnQgaXQgYmFjayB0byBVbml4LXN0aWxlIChjeWdwYXRoKQorICAgICAgaW5wdXRfcGF0aD1gJENZR1BBVEggLXUgIiRzaG9ydG1vZGVfcGF0aCJgCisgICAgICBuZXdfcGF0aD0iJGlucHV0X3BhdGgiCiAgICAgZmkKKyAgZmkKKworICB0ZXN0X2N5Z2RyaXZlX3ByZWZpeD1gJEVDSE8gJGlucHV0X3BhdGggfCAkR1JFUCBeL2N5Z2RyaXZlL2AKKyAgaWYgdGVzdCAieCR0ZXN0X2N5Z2RyaXZlX3ByZWZpeCIgPSB4OyB0aGVuCisgICAgIyBBcyBhIHNpbXBsZSBmaXgsIGV4Y2x1ZGUgL3Vzci9iaW4gc2luY2UgaXQncyBub3QgYSByZWFsIHBhdGguCisgICAgaWYgdGVzdCAieGAkRUNITyAkbmV3X3BhdGggfCAkR1JFUCBeL3Vzci9iaW4vYCIgPSB4OyB0aGVuCisgICAgICAjIFRoZSBwYXRoIGlzIGluIGEgQ3lnd2luIHNwZWNpYWwgZGlyZWN0b3J5IChlLmcuIC9ob21lKS4gV2UgbmVlZCB0aGlzIGNvbnZlcnRlZCB0bworICAgICAgIyBhIHBhdGggcHJlZml4ZWQgYnkgL2N5Z2RyaXZlIGZvciBmaXhwYXRoIHRvIHdvcmsuCisgICAgICBuZXdfcGF0aD0iJENZR1dJTl9ST09UX1BBVEgkaW5wdXRfcGF0aCIKKyAgICBmaQorICBmaQorCisKKyAgaWYgdGVzdCAieCRwYXRoIiAhPSAieCRuZXdfcGF0aCI7IHRoZW4KKyAgICBCT09UX0pESz0iJG5ld19wYXRoIgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogUmV3cml0aW5nIEJPT1RfSkRLIHRvIFwiJG5ld19wYXRoXCIiID4mNQorJGFzX2VjaG8gIiRhc19tZTogUmV3cml0aW5nIEJPT1RfSkRLIHRvIFwiJG5ld19wYXRoXCIiID4mNjt9CisgIGZpCisKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorCisgIHBhdGg9IiRCT09UX0pESyIKKyAgaGFzX2NvbG9uPWAkRUNITyAkcGF0aCB8ICRHUkVQIF4uOmAKKyAgbmV3X3BhdGg9IiRwYXRoIgorICBpZiB0ZXN0ICJ4JGhhc19jb2xvbiIgPSB4OyB0aGVuCisgICAgIyBOb3QgaW4gbWl4ZWQgb3IgV2luZG93cyBzdHlsZSwgc3RhcnQgYnkgdGhhdC4KKyAgICBuZXdfcGF0aD1gY21kIC8vYyBlY2hvICRwYXRoYAorICBmaQorCisKKyAgaW5wdXRfcGF0aD0iJG5ld19wYXRoIgorICAjIENoZWNrIGlmIHdlIG5lZWQgdG8gY29udmVydCB0aGlzIHVzaW5nIERPUy1zdHlsZSBzaG9ydCBtb2RlLiBJZiB0aGUgcGF0aAorICAjIGNvbnRhaW5zIGp1c3Qgc2ltcGxlIGNoYXJhY3RlcnMsIHVzZSBpdC4gT3RoZXJ3aXNlIChzcGFjZXMsIHdlaXJkIGNoYXJhY3RlcnMpLAorICAjIHRha2Ugbm8gY2hhbmNlcyBhbmQgcmV3cml0ZSBpdC4KKyAgIyBOb3RlOiBtNCBlYXRzIG91ciBbXSwgc28gd2UgbmVlZCB0byB1c2UgWyBhbmQgXSBpbnN0ZWFkLgorICBoYXNfZm9yYmlkZGVuX2NoYXJzPWAkRUNITyAiJGlucHV0X3BhdGgiIHwgJEdSRVAgW14tXy86YS16QS1aMC05XWAKKyAgaWYgdGVzdCAieCRoYXNfZm9yYmlkZGVuX2NoYXJzIiAhPSB4OyB0aGVuCisgICAgIyBOb3cgY29udmVydCBpdCB0byBtaXhlZCBET1Mtc3R5bGUsIHNob3J0IG1vZGUgKG5vIHNwYWNlcywgYW5kIC8gaW5zdGVhZCBvZiBcKQorICAgIG5ld19wYXRoPWBjbWQgL2MgImZvciAlQSBpbiAoXCIkaW5wdXRfcGF0aFwiKSBkbyBAZWNobyAlfnNBInwkVFIgXFxcXFxcXFwgLyB8ICRUUiAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidgCisgIGZpCisKKworICB3aW5kb3dzX3BhdGg9IiRuZXdfcGF0aCIKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJENZR1BBVEggLXUgIiR3aW5kb3dzX3BhdGgiYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBlbGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLm1zeXMiOyB0aGVuCisgICAgdW5peF9wYXRoPWAkRUNITyAiJHdpbmRvd3NfcGF0aCIgfCAkU0VEIC1lICdzLF5cXCguXFwpOiwvXFwxLGcnIC1lICdzLFxcXFwsLyxnJ2AKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZmkKKworICBpZiB0ZXN0ICJ4JHBhdGgiICE9ICJ4JG5ld19wYXRoIjsgdGhlbgorICAgIEJPT1RfSkRLPSIkbmV3X3BhdGgiCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBSZXdyaXRpbmcgQk9PVF9KREsgdG8gXCIkbmV3X3BhdGhcIiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBSZXdyaXRpbmcgQk9PVF9KREsgdG8gXCIkbmV3X3BhdGhcIiIgPiY2O30KKyAgZmkKKworICAjIFNhdmUgdGhlIGZpcnN0IDEwIGJ5dGVzIG9mIHRoaXMgcGF0aCB0byB0aGUgc3RvcmFnZSwgc28gZml4cGF0aCBjYW4gd29yay4KKyAgYWxsX2ZpeHBhdGhfcHJlZml4ZXM9KCIke2FsbF9maXhwYXRoX3ByZWZpeGVzW0BdfSIgIiR7bmV3X3BhdGg6MDoxMH0iKQorCisgIGVsc2UKKyAgICAjIFdlJ3JlIG9uIGEgcG9zaXggcGxhdGZvcm0uIEhvb3JheSEgOikKKyAgICBwYXRoPSIkQk9PVF9KREsiCisKKyAgICBpZiB0ZXN0ICEgLWYgIiRwYXRoIiAmJiB0ZXN0ICEgLWQgIiRwYXRoIjsgdGhlbgorICAgICAgYXNfZm5fZXJyb3IgJD8gIlRoZSBwYXRoIG9mIEJPT1RfSkRLLCB3aGljaCByZXNvbHZlcyBhcyBcIiRwYXRoXCIsIGlzIG5vdCBmb3VuZC4iICIkTElORU5PIiA1CisgICAgZmkKKworICAgIGhhc19zcGFjZT1gJEVDSE8gIiRwYXRoIiB8ICRHUkVQICIgImAKKyAgICBpZiB0ZXN0ICJ4JGhhc19zcGFjZSIgIT0geDsgdGhlbgorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUaGUgcGF0aCBvZiBCT09UX0pESywgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkcGF0aFwiLCBpcyBpbnZhbGlkLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUaGUgcGF0aCBvZiBCT09UX0pESywgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkcGF0aFwiLCBpcyBpbnZhbGlkLiIgPiY2O30KKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJTcGFjZXMgYXJlIG5vdCBhbGxvd2VkIGluIHRoaXMgcGF0aC4iICIkTElORU5PIiA1CisgICAgZmkKKyAgZmkKIAogICAgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBCb290IEpESyIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgQm9vdCBKREsuLi4gIiA+JjY7IH0KLSAgICAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRCT09UX0pESyAoJEJPT1RfSkRLX1ZFUlNJT04pIiA+JjUKLSRhc19lY2hvICIkQk9PVF9KREsgKCRCT09UX0pES19WRVJTSU9OKSIgPiY2OyB9CisgICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQk9PVF9KREsiID4mNQorJGFzX2VjaG8gIiRCT09UX0pESyIgPiY2OyB9CisgICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgQm9vdCBKREsgdmVyc2lvbiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBCb290IEpESyB2ZXJzaW9uLi4uICIgPiY2OyB9CisgICAgICAgICAgICAgIEJPT1RfSkRLX1ZFUlNJT049YCIkQk9PVF9KREsvYmluL2phdmEiIC12ZXJzaW9uIDI+JjEgfCAkVFIgJ1xuXHInICcgICdgCisgICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQk9PVF9KREtfVkVSU0lPTiIgPiY1CiskYXNfZWNobyAiJEJPT1RfSkRLX1ZFUlNJT04iID4mNjsgfQogICAgICAgICAgICAgZmkgIyBlbmQgY2hlY2sgamRrIHZlcnNpb24KICAgICAgICAgICBmaSAjIGVuZCBjaGVjayBydC5qYXIKICAgICAgICAgZmkgIyBlbmQgY2hlY2sgamF2YWMKQEAgLTkyNDksMTkgKzExODA3LDIwOSBAQAogICAgICMgTm93IGV4ZWN1dGUgdGhlIHRlc3QKIAogICBpZiB0ZXN0ICJ4JFByb2dyYW1XNjQzMiIgIT0geDsgdGhlbgorICAgIFZJUlRVQUxfRElSPSIkUHJvZ3JhbVc2NDMyL0phdmEiCiAKLSAgQk9PVF9KREtfUFJFRklYPSJgJENZR1BBVEggLXUgIiRQcm9ncmFtVzY0MzIiYC9KYXZhIgorICB3aW5kb3dzX3BhdGg9IiRWSVJUVUFMX0RJUiIKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJENZR1BBVEggLXUgIiR3aW5kb3dzX3BhdGgiYAorICAgIFZJUlRVQUxfRElSPSIkdW5peF9wYXRoIgorICBlbGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLm1zeXMiOyB0aGVuCisgICAgdW5peF9wYXRoPWAkRUNITyAiJHdpbmRvd3NfcGF0aCIgfCAkU0VEIC1lICdzLF5cXCguXFwpOiwvXFwxLGcnIC1lICdzLFxcXFwsLyxnJ2AKKyAgICBWSVJUVUFMX0RJUj0iJHVuaXhfcGF0aCIKKyAgZmkKKworCisgIEJPT1RfSkRLX1BSRUZJWD0iJFZJUlRVQUxfRElSIgogICBCT09UX0pES19TVUZGSVg9IiIKLSAgQkVTVF9KREtfRk9VTkQ9YCRMUyAiJEJPT1RfSkRLX1BSRUZJWCIgMj4gL2Rldi9udWxsIHwgJEdSRVAgamRrIHwgJFNPUlQgLXIgfCAkSEVBRCAtbiAxIGAKLSAgaWYgdGVzdCAieCRCRVNUX0pES19GT1VORCIgIT0geDsgdGhlbgotICAgIEJPT1RfSkRLPSIke0JPT1RfSkRLX1BSRUZJWH0vJHtCRVNUX0pES19GT1VORH0ke0JPT1RfSkRLX1NVRkZJWH0iCi0gICAgaWYgdGVzdCAtZCAiJEJPT1RfSkRLIjsgdGhlbgotICAgICAgQk9PVF9KREtfRk9VTkQ9bWF5YmUKLSAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogRm91bmQgcG90ZW50aWFsIEJvb3QgSkRLIHVzaW5nIHdlbGwta25vd24gbG9jYXRpb25zIChpbiAkQk9PVF9KREtfUFJFRklYKSIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBGb3VuZCBwb3RlbnRpYWwgQm9vdCBKREsgdXNpbmcgd2VsbC1rbm93biBsb2NhdGlvbnMgKGluICRCT09UX0pES19QUkVGSVgpIiA+JjY7fQorICBBTExfSkRLU19GT1VORD1gJExTICIkQk9PVF9KREtfUFJFRklYIiAyPiAvZGV2L251bGwgfCAkU09SVCAtcmAKKyAgaWYgdGVzdCAieCRBTExfSkRLU19GT1VORCIgIT0geDsgdGhlbgorICAgIGZvciBKREtfVE9fVFJZIGluICRBTExfSkRLU19GT1VORCA7IGRvCisKKyAgaWYgdGVzdCAieCRCT09UX0pES19GT1VORCIgPSB4bm87IHRoZW4KKyAgICAjIE5vdyBleGVjdXRlIHRoZSB0ZXN0CisKKyAgICAgICAgQk9PVF9KREs9IiR7Qk9PVF9KREtfUFJFRklYfS8ke0pES19UT19UUll9JHtCT09UX0pES19TVUZGSVh9IgorICAgICAgICBpZiB0ZXN0IC1kICIkQk9PVF9KREsiOyB0aGVuCisgICAgICAgICAgQk9PVF9KREtfRk9VTkQ9bWF5YmUKKyAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IEZvdW5kIHBvdGVudGlhbCBCb290IEpESyB1c2luZyB3ZWxsLWtub3duIGxvY2F0aW9ucyAoaW4gJEJPT1RfSkRLX1BSRUZJWC8kSkRLX1RPX1RSWSkiID4mNQorJGFzX2VjaG8gIiRhc19tZTogRm91bmQgcG90ZW50aWFsIEJvb3QgSkRLIHVzaW5nIHdlbGwta25vd24gbG9jYXRpb25zIChpbiAkQk9PVF9KREtfUFJFRklYLyRKREtfVE9fVFJZKSIgPiY2O30KKyAgICAgICAgZmkKKworCisgICAgIyBJZiBwcmV2aW91cyBzdGVwIGNsYWltZWQgdG8gaGF2ZSBmb3VuZCBhIEpESywgY2hlY2sgaXQgdG8gc2VlIGlmIGl0IHNlZW1zIHRvIGJlIHZhbGlkLgorICAgIGlmIHRlc3QgIngkQk9PVF9KREtfRk9VTkQiID0geG1heWJlOyB0aGVuCisgICAgICAjIERvIHdlIGhhdmUgYSBiaW4vamF2YT8KKyAgICAgIGlmIHRlc3QgISAteCAiJEJPT1RfSkRLL2Jpbi9qYXZhIjsgdGhlbgorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFBvdGVudGlhbCBCb290IEpESyBmb3VuZCBhdCAkQk9PVF9KREsgZGlkIG5vdCBjb250YWluIGJpbi9qYXZhOyBpZ25vcmluZyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBQb3RlbnRpYWwgQm9vdCBKREsgZm91bmQgYXQgJEJPT1RfSkRLIGRpZCBub3QgY29udGFpbiBiaW4vamF2YTsgaWdub3JpbmciID4mNjt9CisgICAgICAgIEJPT1RfSkRLX0ZPVU5EPW5vCisgICAgICBlbHNlCisgICAgICAgICMgRG8gd2UgaGF2ZSBhIGJpbi9qYXZhYz8KKyAgICAgICAgaWYgdGVzdCAhIC14ICIkQk9PVF9KREsvYmluL2phdmFjIjsgdGhlbgorICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogUG90ZW50aWFsIEJvb3QgSkRLIGZvdW5kIGF0ICRCT09UX0pESyBkaWQgbm90IGNvbnRhaW4gYmluL2phdmFjOyBpZ25vcmluZyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBQb3RlbnRpYWwgQm9vdCBKREsgZm91bmQgYXQgJEJPT1RfSkRLIGRpZCBub3QgY29udGFpbiBiaW4vamF2YWM7IGlnbm9yaW5nIiA+JjY7fQorICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogKFRoaXMgbWlnaHQgYmUgYW4gSlJFIGluc3RlYWQgb2YgYW4gSkRLKSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiAoVGhpcyBtaWdodCBiZSBhbiBKUkUgaW5zdGVhZCBvZiBhbiBKREspIiA+JjY7fQorICAgICAgICAgIEJPT1RfSkRLX0ZPVU5EPW5vCisgICAgICAgIGVsc2UKKyAgICAgICAgICAjIERvIHdlIGhhdmUgYW4gcnQuamFyPyAoT24gTWFjT1NYIGl0IGlzIGNhbGxlZCBjbGFzc2VzLmphcikKKyAgICAgICAgICBpZiB0ZXN0ICEgLWYgIiRCT09UX0pESy9qcmUvbGliL3J0LmphciIgJiYgdGVzdCAhIC1mICIkQk9PVF9KREsvLi4vQ2xhc3Nlcy9jbGFzc2VzLmphciI7IHRoZW4KKyAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogUG90ZW50aWFsIEJvb3QgSkRLIGZvdW5kIGF0ICRCT09UX0pESyBkaWQgbm90IGNvbnRhaW4gYW4gcnQuamFyOyBpZ25vcmluZyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBQb3RlbnRpYWwgQm9vdCBKREsgZm91bmQgYXQgJEJPT1RfSkRLIGRpZCBub3QgY29udGFpbiBhbiBydC5qYXI7IGlnbm9yaW5nIiA+JjY7fQorICAgICAgICAgICAgQk9PVF9KREtfRk9VTkQ9bm8KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICAjIE9oLCB0aGlzIGlzIGxvb2tpbmcgZ29vZCEgV2UgcHJvYmFibHkgaGF2ZSBmb3VuZCBhIHByb3BlciBKREsuIElzIGl0IHRoZSBjb3JyZWN0IHZlcnNpb24/CisgICAgICAgICAgICBCT09UX0pES19WRVJTSU9OPWAiJEJPT1RfSkRLL2Jpbi9qYXZhIiAtdmVyc2lvbiAyPiYxIHwgaGVhZCAtbiAxYAorCisgICAgICAgICAgICAjIEV4dHJhIE00IHF1b3RlIG5lZWRlZCB0byBwcm90ZWN0IFtdIGluIGdyZXAgZXhwcmVzc2lvbi4KKyAgICAgICAgICAgIEZPVU5EX1ZFUlNJT05fNzg9YGVjaG8gJEJPT1RfSkRLX1ZFUlNJT04gfCBncmVwICAnXCIxXC5bNzhdXC4nYAorICAgICAgICAgICAgaWYgdGVzdCAieCRGT1VORF9WRVJTSU9OXzc4IiA9IHg7IHRoZW4KKyAgICAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBQb3RlbnRpYWwgQm9vdCBKREsgZm91bmQgYXQgJEJPT1RfSkRLIGlzIGluY29ycmVjdCBKREsgdmVyc2lvbiAoJEJPT1RfSkRLX1ZFUlNJT04pOyBpZ25vcmluZyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBQb3RlbnRpYWwgQm9vdCBKREsgZm91bmQgYXQgJEJPT1RfSkRLIGlzIGluY29ycmVjdCBKREsgdmVyc2lvbiAoJEJPT1RfSkRLX1ZFUlNJT04pOyBpZ25vcmluZyIgPiY2O30KKyAgICAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAoWW91ciBCb290IEpESyBtdXN0IGJlIHZlcnNpb24gNyBvciA4KSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiAoWW91ciBCb290IEpESyBtdXN0IGJlIHZlcnNpb24gNyBvciA4KSIgPiY2O30KKyAgICAgICAgICAgICAgQk9PVF9KREtfRk9VTkQ9bm8KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgIyBXZSdyZSBkb25lISA6LSkKKyAgICAgICAgICAgICAgQk9PVF9KREtfRk9VTkQ9eWVzCisKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorCisgICMgSW5wdXQgbWlnaHQgYmUgZ2l2ZW4gYXMgV2luZG93cyBmb3JtYXQsIHN0YXJ0IGJ5IGNvbnZlcnRpbmcgdG8KKyAgIyB1bml4IGZvcm1hdC4KKyAgcGF0aD0iJEJPT1RfSkRLIgorICBuZXdfcGF0aD1gJENZR1BBVEggLXUgIiRwYXRoImAKKworICAjIEN5Z3dpbiB0cmllcyB0byBoaWRlIHNvbWUgYXNwZWN0cyBvZiB0aGUgV2luZG93cyBmaWxlIHN5c3RlbSwgc3VjaCB0aGF0IGJpbmFyaWVzIGFyZQorICAjIG5hbWVkIC5leGUgYnV0IGNhbGxlZCB3aXRob3V0IHRoYXQgc3VmZml4LiBUaGVyZWZvcmUsICJmb28iIGFuZCAiZm9vLmV4ZSIgYXJlIGNvbnNpZGVyZWQKKyAgIyB0aGUgc2FtZSBmaWxlLCBtb3N0IG9mIHRoZSB0aW1lIChhcyBpbiAidGVzdCAtZiIpLiBCdXQgbm90IHdoZW4gcnVubmluZyBjeWdwYXRoIC1zLCB0aGVuCisgICMgImZvby5leGUiIGlzIE9LIGJ1dCAiZm9vIiBpcyBhbiBlcnJvci4KKyAgIworICAjIFRoaXMgdGVzdCBpcyB0aGVyZWZvcmUgc2xpZ2h0bHkgbW9yZSBhY2N1cmF0ZSB0aGFuICJ0ZXN0IC1mIiB0byBjaGVjayBmb3IgZmlsZSBwcmVjZW5zZS4KKyAgIyBJdCBpcyBhbHNvIGEgd2F5IHRvIG1ha2Ugc3VyZSB3ZSBnb3QgdGhlIHByb3BlciBmaWxlIG5hbWUgZm9yIHRoZSByZWFsIHRlc3QgbGF0ZXIgb24uCisgIHRlc3Rfc2hvcnRwYXRoPWAkQ1lHUEFUSCAtcyAtbSAiJG5ld19wYXRoIiAyPiAvZGV2L251bGxgCisgIGlmIHRlc3QgIngkdGVzdF9zaG9ydHBhdGgiID0geDsgdGhlbgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGhlIHBhdGggb2YgQk9PVF9KREssIHdoaWNoIHJlc29sdmVzIGFzIFwiJHBhdGhcIiwgaXMgaW52YWxpZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhlIHBhdGggb2YgQk9PVF9KREssIHdoaWNoIHJlc29sdmVzIGFzIFwiJHBhdGhcIiwgaXMgaW52YWxpZC4iID4mNjt9CisgICAgYXNfZm5fZXJyb3IgJD8gIkNhbm5vdCBsb2NhdGUgdGhlIHRoZSBwYXRoIG9mIEJPT1RfSkRLIiAiJExJTkVOTyIgNQorICBmaQorCisgICMgQ2FsbCBoZWxwZXIgZnVuY3Rpb24gd2hpY2ggcG9zc2libHkgY29udmVydHMgdGhpcyB1c2luZyBET1Mtc3R5bGUgc2hvcnQgbW9kZS4KKyAgIyBJZiBzbywgdGhlIHVwZGF0ZWQgcGF0aCBpcyBzdG9yZWQgaW4gJG5ld19wYXRoLgorCisgIGlucHV0X3BhdGg9IiRuZXdfcGF0aCIKKyAgIyBDaGVjayBpZiB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhpcyB1c2luZyBET1Mtc3R5bGUgc2hvcnQgbW9kZS4gSWYgdGhlIHBhdGgKKyAgIyBjb250YWlucyBqdXN0IHNpbXBsZSBjaGFyYWN0ZXJzLCB1c2UgaXQuIE90aGVyd2lzZSAoc3BhY2VzLCB3ZWlyZCBjaGFyYWN0ZXJzKSwKKyAgIyB0YWtlIG5vIGNoYW5jZXMgYW5kIHJld3JpdGUgaXQuCisgICMgTm90ZTogbTQgZWF0cyBvdXIgW10sIHNvIHdlIG5lZWQgdG8gdXNlIFsgYW5kIF0gaW5zdGVhZC4KKyAgaGFzX2ZvcmJpZGRlbl9jaGFycz1gJEVDSE8gIiRpbnB1dF9wYXRoIiB8ICRHUkVQIFteLS5fL2EtekEtWjAtOV1gCisgIGlmIHRlc3QgIngkaGFzX2ZvcmJpZGRlbl9jaGFycyIgIT0geDsgdGhlbgorICAgICMgTm93IGNvbnZlcnQgaXQgdG8gbWl4ZWQgRE9TLXN0eWxlLCBzaG9ydCBtb2RlIChubyBzcGFjZXMsIGFuZCAvIGluc3RlYWQgb2YgXCkKKyAgICBzaG9ydG1vZGVfcGF0aD1gJENZR1BBVEggLXMgLW0gLWEgIiRpbnB1dF9wYXRoImAKKyAgICBwYXRoX2FmdGVyX3Nob3J0bW9kZT1gJENZR1BBVEggLXUgIiRzaG9ydG1vZGVfcGF0aCJgCisgICAgaWYgdGVzdCAieCRwYXRoX2FmdGVyX3Nob3J0bW9kZSIgIT0gIngkaW5wdXRfdG9fc2hvcnRwYXRoIjsgdGhlbgorICAgICAgIyBHb2luZyB0byBzaG9ydCBtb2RlIGFuZCBiYWNrIGFnYWluIGRpZCBpbmRlZWQgbWF0dGVyLiBTaW5jZSBzaG9ydCBtb2RlIGlzCisgICAgICAjIGNhc2UgaW5zZW5zaXRpdmUsIGxldCdzIG1ha2UgaXQgbG93ZXJjYXNlIHRvIGltcHJvdmUgcmVhZGFiaWxpdHkuCisgICAgICBzaG9ydG1vZGVfcGF0aD1gJEVDSE8gIiRzaG9ydG1vZGVfcGF0aCIgfCAkVFIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAorICAgICAgIyBOb3cgY29udmVydCBpdCBiYWNrIHRvIFVuaXgtc3RpbGUgKGN5Z3BhdGgpCisgICAgICBpbnB1dF9wYXRoPWAkQ1lHUEFUSCAtdSAiJHNob3J0bW9kZV9wYXRoImAKKyAgICAgIG5ld19wYXRoPSIkaW5wdXRfcGF0aCIKICAgICBmaQogICBmaQogCisgIHRlc3RfY3lnZHJpdmVfcHJlZml4PWAkRUNITyAkaW5wdXRfcGF0aCB8ICRHUkVQIF4vY3lnZHJpdmUvYAorICBpZiB0ZXN0ICJ4JHRlc3RfY3lnZHJpdmVfcHJlZml4IiA9IHg7IHRoZW4KKyAgICAjIEFzIGEgc2ltcGxlIGZpeCwgZXhjbHVkZSAvdXNyL2JpbiBzaW5jZSBpdCdzIG5vdCBhIHJlYWwgcGF0aC4KKyAgICBpZiB0ZXN0ICJ4YCRFQ0hPICRuZXdfcGF0aCB8ICRHUkVQIF4vdXNyL2Jpbi9gIiA9IHg7IHRoZW4KKyAgICAgICMgVGhlIHBhdGggaXMgaW4gYSBDeWd3aW4gc3BlY2lhbCBkaXJlY3RvcnkgKGUuZy4gL2hvbWUpLiBXZSBuZWVkIHRoaXMgY29udmVydGVkIHRvCisgICAgICAjIGEgcGF0aCBwcmVmaXhlZCBieSAvY3lnZHJpdmUgZm9yIGZpeHBhdGggdG8gd29yay4KKyAgICAgIG5ld19wYXRoPSIkQ1lHV0lOX1JPT1RfUEFUSCRpbnB1dF9wYXRoIgorICAgIGZpCisgIGZpCisKKworICBpZiB0ZXN0ICJ4JHBhdGgiICE9ICJ4JG5ld19wYXRoIjsgdGhlbgorICAgIEJPT1RfSkRLPSIkbmV3X3BhdGgiCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBSZXdyaXRpbmcgQk9PVF9KREsgdG8gXCIkbmV3X3BhdGhcIiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBSZXdyaXRpbmcgQk9PVF9KREsgdG8gXCIkbmV3X3BhdGhcIiIgPiY2O30KKyAgZmkKKworICBlbGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLm1zeXMiOyB0aGVuCisKKyAgcGF0aD0iJEJPT1RfSkRLIgorICBoYXNfY29sb249YCRFQ0hPICRwYXRoIHwgJEdSRVAgXi46YAorICBuZXdfcGF0aD0iJHBhdGgiCisgIGlmIHRlc3QgIngkaGFzX2NvbG9uIiA9IHg7IHRoZW4KKyAgICAjIE5vdCBpbiBtaXhlZCBvciBXaW5kb3dzIHN0eWxlLCBzdGFydCBieSB0aGF0LgorICAgIG5ld19wYXRoPWBjbWQgLy9jIGVjaG8gJHBhdGhgCisgIGZpCisKKworICBpbnB1dF9wYXRoPSIkbmV3X3BhdGgiCisgICMgQ2hlY2sgaWYgd2UgbmVlZCB0byBjb252ZXJ0IHRoaXMgdXNpbmcgRE9TLXN0eWxlIHNob3J0IG1vZGUuIElmIHRoZSBwYXRoCisgICMgY29udGFpbnMganVzdCBzaW1wbGUgY2hhcmFjdGVycywgdXNlIGl0LiBPdGhlcndpc2UgKHNwYWNlcywgd2VpcmQgY2hhcmFjdGVycyksCisgICMgdGFrZSBubyBjaGFuY2VzIGFuZCByZXdyaXRlIGl0LgorICAjIE5vdGU6IG00IGVhdHMgb3VyIFtdLCBzbyB3ZSBuZWVkIHRvIHVzZSBbIGFuZCBdIGluc3RlYWQuCisgIGhhc19mb3JiaWRkZW5fY2hhcnM9YCRFQ0hPICIkaW5wdXRfcGF0aCIgfCAkR1JFUCBbXi1fLzphLXpBLVowLTldYAorICBpZiB0ZXN0ICJ4JGhhc19mb3JiaWRkZW5fY2hhcnMiICE9IHg7IHRoZW4KKyAgICAjIE5vdyBjb252ZXJ0IGl0IHRvIG1peGVkIERPUy1zdHlsZSwgc2hvcnQgbW9kZSAobm8gc3BhY2VzLCBhbmQgLyBpbnN0ZWFkIG9mIFwpCisgICAgbmV3X3BhdGg9YGNtZCAvYyAiZm9yICVBIGluIChcIiRpbnB1dF9wYXRoXCIpIGRvIEBlY2hvICV+c0EifCRUUiBcXFxcXFxcXCAvIHwgJFRSICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J2AKKyAgZmkKKworCisgIHdpbmRvd3NfcGF0aD0iJG5ld19wYXRoIgorICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5jeWd3aW4iOyB0aGVuCisgICAgdW5peF9wYXRoPWAkQ1lHUEFUSCAtdSAiJHdpbmRvd3NfcGF0aCJgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGVsaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MubXN5cyI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRFQ0hPICIkd2luZG93c19wYXRoIiB8ICRTRUQgLWUgJ3MsXlxcKC5cXCk6LC9cXDEsZycgLWUgJ3MsXFxcXCwvLGcnYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBmaQorCisgIGlmIHRlc3QgIngkcGF0aCIgIT0gIngkbmV3X3BhdGgiOyB0aGVuCisgICAgQk9PVF9KREs9IiRuZXdfcGF0aCIKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFJld3JpdGluZyBCT09UX0pESyB0byBcIiRuZXdfcGF0aFwiIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFJld3JpdGluZyBCT09UX0pESyB0byBcIiRuZXdfcGF0aFwiIiA+JjY7fQorICBmaQorCisgICMgU2F2ZSB0aGUgZmlyc3QgMTAgYnl0ZXMgb2YgdGhpcyBwYXRoIHRvIHRoZSBzdG9yYWdlLCBzbyBmaXhwYXRoIGNhbiB3b3JrLgorICBhbGxfZml4cGF0aF9wcmVmaXhlcz0oIiR7YWxsX2ZpeHBhdGhfcHJlZml4ZXNbQF19IiAiJHtuZXdfcGF0aDowOjEwfSIpCisKKyAgZWxzZQorICAgICMgV2UncmUgb24gYSBwb3NpeCBwbGF0Zm9ybS4gSG9vcmF5ISA6KQorICAgIHBhdGg9IiRCT09UX0pESyIKKworICAgIGlmIHRlc3QgISAtZiAiJHBhdGgiICYmIHRlc3QgISAtZCAiJHBhdGgiOyB0aGVuCisgICAgICBhc19mbl9lcnJvciAkPyAiVGhlIHBhdGggb2YgQk9PVF9KREssIHdoaWNoIHJlc29sdmVzIGFzIFwiJHBhdGhcIiwgaXMgbm90IGZvdW5kLiIgIiRMSU5FTk8iIDUKKyAgICBmaQorCisgICAgaGFzX3NwYWNlPWAkRUNITyAiJHBhdGgiIHwgJEdSRVAgIiAiYAorICAgIGlmIHRlc3QgIngkaGFzX3NwYWNlIiAhPSB4OyB0aGVuCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSBwYXRoIG9mIEJPT1RfSkRLLCB3aGljaCByZXNvbHZlcyBhcyBcIiRwYXRoXCIsIGlzIGludmFsaWQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoZSBwYXRoIG9mIEJPT1RfSkRLLCB3aGljaCByZXNvbHZlcyBhcyBcIiRwYXRoXCIsIGlzIGludmFsaWQuIiA+JjY7fQorICAgICAgYXNfZm5fZXJyb3IgJD8gIlNwYWNlcyBhcmUgbm90IGFsbG93ZWQgaW4gdGhpcyBwYXRoLiIgIiRMSU5FTk8iIDUKKyAgICBmaQorICBmaQorCisgICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIEJvb3QgSkRLIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBCb290IEpESy4uLiAiID4mNjsgfQorICAgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJEJPT1RfSkRLIiA+JjUKKyRhc19lY2hvICIkQk9PVF9KREsiID4mNjsgfQorICAgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIEJvb3QgSkRLIHZlcnNpb24iID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgQm9vdCBKREsgdmVyc2lvbi4uLiAiID4mNjsgfQorICAgICAgICAgICAgICBCT09UX0pES19WRVJTSU9OPWAiJEJPT1RfSkRLL2Jpbi9qYXZhIiAtdmVyc2lvbiAyPiYxIHwgJFRSICdcblxyJyAnICAnYAorICAgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJEJPT1RfSkRLX1ZFUlNJT04iID4mNQorJGFzX2VjaG8gIiRCT09UX0pES19WRVJTSU9OIiA+JjY7IH0KKyAgICAgICAgICAgIGZpICMgZW5kIGNoZWNrIGpkayB2ZXJzaW9uCisgICAgICAgICAgZmkgIyBlbmQgY2hlY2sgcnQuamFyCisgICAgICAgIGZpICMgZW5kIGNoZWNrIGphdmFjCisgICAgICBmaSAjIGVuZCBjaGVjayBqYXZhCisgICAgZmkgIyBlbmQgY2hlY2sgYm9vdCBqZGsgZm91bmQKKyAgZmkKKworICAgIGRvbmUKKyAgZmkKKwogICBmaQogCiAKQEAgLTkzMDIsMjYgKzEyMDUwLDEzMyBAQAogICAgICAgICAgICAgICAjIFdlJ3JlIGRvbmUhIDotKQogICAgICAgICAgICAgICBCT09UX0pES19GT1VORD15ZXMKIAotICAgICMgRmFpbCB3aXRoIG1lc3NhZ2UgdGhlIHBhdGggdG8gdGhlIEJvb3QgSkRLIGlmIHZhciBCT09UX0pESyBjb250YWlucyBhIHBhdGggd2l0aCBubyBzcGFjZXMgaW4gaXQuCi0gICAgIyBVbmxlc3Mgb24gV2luZG93cywgd2hlcmUgd2UgY2FuIHJld3JpdGUgdGhlIHBhdGguCi0gICAgSEFTX1NQQUNFPWBlY2hvICIkQk9PVF9KREsiIHwgZ3JlcCAiICJgCi0gICAgaWYgdGVzdCAieCRIQVNfU1BBQ0UiICE9IHg7IHRoZW4KLSAgICAgICAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TIiA9ICJ4d2luZG93cyI7IHRoZW4KLSAgICAgICAgICAgICMgRmlyc3QgY29udmVydCBpdCB0byBET1Mtc3R5bGUsIHNob3J0IG1vZGUgKG5vIHNwYWNlcykKLSAgICAgICAgICAgIEJPT1RfSkRLPWAkQ1lHUEFUSCAtcyAtbSAtYSAiJEJPT1RfSkRLImAKLSAgICAgICAgICAgICMgTm93IGl0J3MgY2FzZSBpbnNlbnNpdGl2ZTsgbGV0J3MgbWFrZSBpdCBsb3dlcmNhc2UgdG8gaW1wcm92ZSByZWFkYWJpbGl0eQotICAgICAgICAgICAgQk9PVF9KREs9YCRFQ0hPICIkQk9PVF9KREsiIHwgJFRSICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZxeHl6J2AKLSAgICAgICAgICAgICMgTm93IGNvbnZlcnQgaXQgYmFjayB0byBVbml4LXN0aWxlIChjeWdwYXRoKQotICAgICAgICAgICAgQk9PVF9KREs9YCRDWUdQQVRIIC11ICIkQk9PVF9KREsiYAotICAgICAgICBlbHNlCi0gICAgICAgICAgICBhc19mbl9lcnJvciAkPyAiWW91IGNhbm5vdCBoYXZlIHNwYWNlcyBpbiB0aGUgcGF0aCB0byB0aGUgQm9vdCBKREshIFwiJEJPT1RfSkRLXCIiICIkTElORU5PIiA1Ci0gICAgICAgIGZpCisgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLmN5Z3dpbiI7IHRoZW4KKworICAjIElucHV0IG1pZ2h0IGJlIGdpdmVuIGFzIFdpbmRvd3MgZm9ybWF0LCBzdGFydCBieSBjb252ZXJ0aW5nIHRvCisgICMgdW5peCBmb3JtYXQuCisgIHBhdGg9IiRCT09UX0pESyIKKyAgbmV3X3BhdGg9YCRDWUdQQVRIIC11ICIkcGF0aCJgCisKKyAgIyBDeWd3aW4gdHJpZXMgdG8gaGlkZSBzb21lIGFzcGVjdHMgb2YgdGhlIFdpbmRvd3MgZmlsZSBzeXN0ZW0sIHN1Y2ggdGhhdCBiaW5hcmllcyBhcmUKKyAgIyBuYW1lZCAuZXhlIGJ1dCBjYWxsZWQgd2l0aG91dCB0aGF0IHN1ZmZpeC4gVGhlcmVmb3JlLCAiZm9vIiBhbmQgImZvby5leGUiIGFyZSBjb25zaWRlcmVkCisgICMgdGhlIHNhbWUgZmlsZSwgbW9zdCBvZiB0aGUgdGltZSAoYXMgaW4gInRlc3QgLWYiKS4gQnV0IG5vdCB3aGVuIHJ1bm5pbmcgY3lncGF0aCAtcywgdGhlbgorICAjICJmb28uZXhlIiBpcyBPSyBidXQgImZvbyIgaXMgYW4gZXJyb3IuCisgICMKKyAgIyBUaGlzIHRlc3QgaXMgdGhlcmVmb3JlIHNsaWdodGx5IG1vcmUgYWNjdXJhdGUgdGhhbiAidGVzdCAtZiIgdG8gY2hlY2sgZm9yIGZpbGUgcHJlY2Vuc2UuCisgICMgSXQgaXMgYWxzbyBhIHdheSB0byBtYWtlIHN1cmUgd2UgZ290IHRoZSBwcm9wZXIgZmlsZSBuYW1lIGZvciB0aGUgcmVhbCB0ZXN0IGxhdGVyIG9uLgorICB0ZXN0X3Nob3J0cGF0aD1gJENZR1BBVEggLXMgLW0gIiRuZXdfcGF0aCIgMj4gL2Rldi9udWxsYAorICBpZiB0ZXN0ICJ4JHRlc3Rfc2hvcnRwYXRoIiA9IHg7IHRoZW4KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSBwYXRoIG9mIEJPT1RfSkRLLCB3aGljaCByZXNvbHZlcyBhcyBcIiRwYXRoXCIsIGlzIGludmFsaWQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoZSBwYXRoIG9mIEJPT1RfSkRLLCB3aGljaCByZXNvbHZlcyBhcyBcIiRwYXRoXCIsIGlzIGludmFsaWQuIiA+JjY7fQorICAgIGFzX2ZuX2Vycm9yICQ/ICJDYW5ub3QgbG9jYXRlIHRoZSB0aGUgcGF0aCBvZiBCT09UX0pESyIgIiRMSU5FTk8iIDUKKyAgZmkKKworICAjIENhbGwgaGVscGVyIGZ1bmN0aW9uIHdoaWNoIHBvc3NpYmx5IGNvbnZlcnRzIHRoaXMgdXNpbmcgRE9TLXN0eWxlIHNob3J0IG1vZGUuCisgICMgSWYgc28sIHRoZSB1cGRhdGVkIHBhdGggaXMgc3RvcmVkIGluICRuZXdfcGF0aC4KKworICBpbnB1dF9wYXRoPSIkbmV3X3BhdGgiCisgICMgQ2hlY2sgaWYgd2UgbmVlZCB0byBjb252ZXJ0IHRoaXMgdXNpbmcgRE9TLXN0eWxlIHNob3J0IG1vZGUuIElmIHRoZSBwYXRoCisgICMgY29udGFpbnMganVzdCBzaW1wbGUgY2hhcmFjdGVycywgdXNlIGl0LiBPdGhlcndpc2UgKHNwYWNlcywgd2VpcmQgY2hhcmFjdGVycyksCisgICMgdGFrZSBubyBjaGFuY2VzIGFuZCByZXdyaXRlIGl0LgorICAjIE5vdGU6IG00IGVhdHMgb3VyIFtdLCBzbyB3ZSBuZWVkIHRvIHVzZSBbIGFuZCBdIGluc3RlYWQuCisgIGhhc19mb3JiaWRkZW5fY2hhcnM9YCRFQ0hPICIkaW5wdXRfcGF0aCIgfCAkR1JFUCBbXi0uXy9hLXpBLVowLTldYAorICBpZiB0ZXN0ICJ4JGhhc19mb3JiaWRkZW5fY2hhcnMiICE9IHg7IHRoZW4KKyAgICAjIE5vdyBjb252ZXJ0IGl0IHRvIG1peGVkIERPUy1zdHlsZSwgc2hvcnQgbW9kZSAobm8gc3BhY2VzLCBhbmQgLyBpbnN0ZWFkIG9mIFwpCisgICAgc2hvcnRtb2RlX3BhdGg9YCRDWUdQQVRIIC1zIC1tIC1hICIkaW5wdXRfcGF0aCJgCisgICAgcGF0aF9hZnRlcl9zaG9ydG1vZGU9YCRDWUdQQVRIIC11ICIkc2hvcnRtb2RlX3BhdGgiYAorICAgIGlmIHRlc3QgIngkcGF0aF9hZnRlcl9zaG9ydG1vZGUiICE9ICJ4JGlucHV0X3RvX3Nob3J0cGF0aCI7IHRoZW4KKyAgICAgICMgR29pbmcgdG8gc2hvcnQgbW9kZSBhbmQgYmFjayBhZ2FpbiBkaWQgaW5kZWVkIG1hdHRlci4gU2luY2Ugc2hvcnQgbW9kZSBpcworICAgICAgIyBjYXNlIGluc2Vuc2l0aXZlLCBsZXQncyBtYWtlIGl0IGxvd2VyY2FzZSB0byBpbXByb3ZlIHJlYWRhYmlsaXR5LgorICAgICAgc2hvcnRtb2RlX3BhdGg9YCRFQ0hPICIkc2hvcnRtb2RlX3BhdGgiIHwgJFRSICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J2AKKyAgICAgICMgTm93IGNvbnZlcnQgaXQgYmFjayB0byBVbml4LXN0aWxlIChjeWdwYXRoKQorICAgICAgaW5wdXRfcGF0aD1gJENZR1BBVEggLXUgIiRzaG9ydG1vZGVfcGF0aCJgCisgICAgICBuZXdfcGF0aD0iJGlucHV0X3BhdGgiCiAgICAgZmkKKyAgZmkKKworICB0ZXN0X2N5Z2RyaXZlX3ByZWZpeD1gJEVDSE8gJGlucHV0X3BhdGggfCAkR1JFUCBeL2N5Z2RyaXZlL2AKKyAgaWYgdGVzdCAieCR0ZXN0X2N5Z2RyaXZlX3ByZWZpeCIgPSB4OyB0aGVuCisgICAgIyBBcyBhIHNpbXBsZSBmaXgsIGV4Y2x1ZGUgL3Vzci9iaW4gc2luY2UgaXQncyBub3QgYSByZWFsIHBhdGguCisgICAgaWYgdGVzdCAieGAkRUNITyAkbmV3X3BhdGggfCAkR1JFUCBeL3Vzci9iaW4vYCIgPSB4OyB0aGVuCisgICAgICAjIFRoZSBwYXRoIGlzIGluIGEgQ3lnd2luIHNwZWNpYWwgZGlyZWN0b3J5IChlLmcuIC9ob21lKS4gV2UgbmVlZCB0aGlzIGNvbnZlcnRlZCB0bworICAgICAgIyBhIHBhdGggcHJlZml4ZWQgYnkgL2N5Z2RyaXZlIGZvciBmaXhwYXRoIHRvIHdvcmsuCisgICAgICBuZXdfcGF0aD0iJENZR1dJTl9ST09UX1BBVEgkaW5wdXRfcGF0aCIKKyAgICBmaQorICBmaQorCisKKyAgaWYgdGVzdCAieCRwYXRoIiAhPSAieCRuZXdfcGF0aCI7IHRoZW4KKyAgICBCT09UX0pESz0iJG5ld19wYXRoIgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogUmV3cml0aW5nIEJPT1RfSkRLIHRvIFwiJG5ld19wYXRoXCIiID4mNQorJGFzX2VjaG8gIiRhc19tZTogUmV3cml0aW5nIEJPT1RfSkRLIHRvIFwiJG5ld19wYXRoXCIiID4mNjt9CisgIGZpCisKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorCisgIHBhdGg9IiRCT09UX0pESyIKKyAgaGFzX2NvbG9uPWAkRUNITyAkcGF0aCB8ICRHUkVQIF4uOmAKKyAgbmV3X3BhdGg9IiRwYXRoIgorICBpZiB0ZXN0ICJ4JGhhc19jb2xvbiIgPSB4OyB0aGVuCisgICAgIyBOb3QgaW4gbWl4ZWQgb3IgV2luZG93cyBzdHlsZSwgc3RhcnQgYnkgdGhhdC4KKyAgICBuZXdfcGF0aD1gY21kIC8vYyBlY2hvICRwYXRoYAorICBmaQorCisKKyAgaW5wdXRfcGF0aD0iJG5ld19wYXRoIgorICAjIENoZWNrIGlmIHdlIG5lZWQgdG8gY29udmVydCB0aGlzIHVzaW5nIERPUy1zdHlsZSBzaG9ydCBtb2RlLiBJZiB0aGUgcGF0aAorICAjIGNvbnRhaW5zIGp1c3Qgc2ltcGxlIGNoYXJhY3RlcnMsIHVzZSBpdC4gT3RoZXJ3aXNlIChzcGFjZXMsIHdlaXJkIGNoYXJhY3RlcnMpLAorICAjIHRha2Ugbm8gY2hhbmNlcyBhbmQgcmV3cml0ZSBpdC4KKyAgIyBOb3RlOiBtNCBlYXRzIG91ciBbXSwgc28gd2UgbmVlZCB0byB1c2UgWyBhbmQgXSBpbnN0ZWFkLgorICBoYXNfZm9yYmlkZGVuX2NoYXJzPWAkRUNITyAiJGlucHV0X3BhdGgiIHwgJEdSRVAgW14tXy86YS16QS1aMC05XWAKKyAgaWYgdGVzdCAieCRoYXNfZm9yYmlkZGVuX2NoYXJzIiAhPSB4OyB0aGVuCisgICAgIyBOb3cgY29udmVydCBpdCB0byBtaXhlZCBET1Mtc3R5bGUsIHNob3J0IG1vZGUgKG5vIHNwYWNlcywgYW5kIC8gaW5zdGVhZCBvZiBcKQorICAgIG5ld19wYXRoPWBjbWQgL2MgImZvciAlQSBpbiAoXCIkaW5wdXRfcGF0aFwiKSBkbyBAZWNobyAlfnNBInwkVFIgXFxcXFxcXFwgLyB8ICRUUiAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidgCisgIGZpCisKKworICB3aW5kb3dzX3BhdGg9IiRuZXdfcGF0aCIKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJENZR1BBVEggLXUgIiR3aW5kb3dzX3BhdGgiYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBlbGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLm1zeXMiOyB0aGVuCisgICAgdW5peF9wYXRoPWAkRUNITyAiJHdpbmRvd3NfcGF0aCIgfCAkU0VEIC1lICdzLF5cXCguXFwpOiwvXFwxLGcnIC1lICdzLFxcXFwsLyxnJ2AKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZmkKKworICBpZiB0ZXN0ICJ4JHBhdGgiICE9ICJ4JG5ld19wYXRoIjsgdGhlbgorICAgIEJPT1RfSkRLPSIkbmV3X3BhdGgiCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBSZXdyaXRpbmcgQk9PVF9KREsgdG8gXCIkbmV3X3BhdGhcIiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBSZXdyaXRpbmcgQk9PVF9KREsgdG8gXCIkbmV3X3BhdGhcIiIgPiY2O30KKyAgZmkKKworICAjIFNhdmUgdGhlIGZpcnN0IDEwIGJ5dGVzIG9mIHRoaXMgcGF0aCB0byB0aGUgc3RvcmFnZSwgc28gZml4cGF0aCBjYW4gd29yay4KKyAgYWxsX2ZpeHBhdGhfcHJlZml4ZXM9KCIke2FsbF9maXhwYXRoX3ByZWZpeGVzW0BdfSIgIiR7bmV3X3BhdGg6MDoxMH0iKQorCisgIGVsc2UKKyAgICAjIFdlJ3JlIG9uIGEgcG9zaXggcGxhdGZvcm0uIEhvb3JheSEgOikKKyAgICBwYXRoPSIkQk9PVF9KREsiCisKKyAgICBpZiB0ZXN0ICEgLWYgIiRwYXRoIiAmJiB0ZXN0ICEgLWQgIiRwYXRoIjsgdGhlbgorICAgICAgYXNfZm5fZXJyb3IgJD8gIlRoZSBwYXRoIG9mIEJPT1RfSkRLLCB3aGljaCByZXNvbHZlcyBhcyBcIiRwYXRoXCIsIGlzIG5vdCBmb3VuZC4iICIkTElORU5PIiA1CisgICAgZmkKKworICAgIGhhc19zcGFjZT1gJEVDSE8gIiRwYXRoIiB8ICRHUkVQICIgImAKKyAgICBpZiB0ZXN0ICJ4JGhhc19zcGFjZSIgIT0geDsgdGhlbgorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUaGUgcGF0aCBvZiBCT09UX0pESywgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkcGF0aFwiLCBpcyBpbnZhbGlkLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUaGUgcGF0aCBvZiBCT09UX0pESywgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkcGF0aFwiLCBpcyBpbnZhbGlkLiIgPiY2O30KKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJTcGFjZXMgYXJlIG5vdCBhbGxvd2VkIGluIHRoaXMgcGF0aC4iICIkTElORU5PIiA1CisgICAgZmkKKyAgZmkKIAogICAgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBCb290IEpESyIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgQm9vdCBKREsuLi4gIiA+JjY7IH0KLSAgICAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRCT09UX0pESyAoJEJPT1RfSkRLX1ZFUlNJT04pIiA+JjUKLSRhc19lY2hvICIkQk9PVF9KREsgKCRCT09UX0pES19WRVJTSU9OKSIgPiY2OyB9CisgICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQk9PVF9KREsiID4mNQorJGFzX2VjaG8gIiRCT09UX0pESyIgPiY2OyB9CisgICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgQm9vdCBKREsgdmVyc2lvbiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBCb290IEpESyB2ZXJzaW9uLi4uICIgPiY2OyB9CisgICAgICAgICAgICAgIEJPT1RfSkRLX1ZFUlNJT049YCIkQk9PVF9KREsvYmluL2phdmEiIC12ZXJzaW9uIDI+JjEgfCAkVFIgJ1xuXHInICcgICdgCisgICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQk9PVF9KREtfVkVSU0lPTiIgPiY1CiskYXNfZWNobyAiJEJPT1RfSkRLX1ZFUlNJT04iID4mNjsgfQogICAgICAgICAgICAgZmkgIyBlbmQgY2hlY2sgamRrIHZlcnNpb24KICAgICAgICAgICBmaSAjIGVuZCBjaGVjayBydC5qYXIKICAgICAgICAgZmkgIyBlbmQgY2hlY2sgamF2YWMKQEAgLTkzMzQsMTkgKzEyMTg5LDIwOSBAQAogICAgICMgTm93IGV4ZWN1dGUgdGhlIHRlc3QKIAogICBpZiB0ZXN0ICJ4JFBST0dSQU1XNjQzMiIgIT0geDsgdGhlbgorICAgIFZJUlRVQUxfRElSPSIkUFJPR1JBTVc2NDMyL0phdmEiCiAKLSAgQk9PVF9KREtfUFJFRklYPSJgJENZR1BBVEggLXUgIiRQUk9HUkFNVzY0MzIiYC9KYXZhIgorICB3aW5kb3dzX3BhdGg9IiRWSVJUVUFMX0RJUiIKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJENZR1BBVEggLXUgIiR3aW5kb3dzX3BhdGgiYAorICAgIFZJUlRVQUxfRElSPSIkdW5peF9wYXRoIgorICBlbGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLm1zeXMiOyB0aGVuCisgICAgdW5peF9wYXRoPWAkRUNITyAiJHdpbmRvd3NfcGF0aCIgfCAkU0VEIC1lICdzLF5cXCguXFwpOiwvXFwxLGcnIC1lICdzLFxcXFwsLyxnJ2AKKyAgICBWSVJUVUFMX0RJUj0iJHVuaXhfcGF0aCIKKyAgZmkKKworCisgIEJPT1RfSkRLX1BSRUZJWD0iJFZJUlRVQUxfRElSIgogICBCT09UX0pES19TVUZGSVg9IiIKLSAgQkVTVF9KREtfRk9VTkQ9YCRMUyAiJEJPT1RfSkRLX1BSRUZJWCIgMj4gL2Rldi9udWxsIHwgJEdSRVAgamRrIHwgJFNPUlQgLXIgfCAkSEVBRCAtbiAxIGAKLSAgaWYgdGVzdCAieCRCRVNUX0pES19GT1VORCIgIT0geDsgdGhlbgotICAgIEJPT1RfSkRLPSIke0JPT1RfSkRLX1BSRUZJWH0vJHtCRVNUX0pES19GT1VORH0ke0JPT1RfSkRLX1NVRkZJWH0iCi0gICAgaWYgdGVzdCAtZCAiJEJPT1RfSkRLIjsgdGhlbgotICAgICAgQk9PVF9KREtfRk9VTkQ9bWF5YmUKLSAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogRm91bmQgcG90ZW50aWFsIEJvb3QgSkRLIHVzaW5nIHdlbGwta25vd24gbG9jYXRpb25zIChpbiAkQk9PVF9KREtfUFJFRklYKSIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBGb3VuZCBwb3RlbnRpYWwgQm9vdCBKREsgdXNpbmcgd2VsbC1rbm93biBsb2NhdGlvbnMgKGluICRCT09UX0pES19QUkVGSVgpIiA+JjY7fQorICBBTExfSkRLU19GT1VORD1gJExTICIkQk9PVF9KREtfUFJFRklYIiAyPiAvZGV2L251bGwgfCAkU09SVCAtcmAKKyAgaWYgdGVzdCAieCRBTExfSkRLU19GT1VORCIgIT0geDsgdGhlbgorICAgIGZvciBKREtfVE9fVFJZIGluICRBTExfSkRLU19GT1VORCA7IGRvCisKKyAgaWYgdGVzdCAieCRCT09UX0pES19GT1VORCIgPSB4bm87IHRoZW4KKyAgICAjIE5vdyBleGVjdXRlIHRoZSB0ZXN0CisKKyAgICAgICAgQk9PVF9KREs9IiR7Qk9PVF9KREtfUFJFRklYfS8ke0pES19UT19UUll9JHtCT09UX0pES19TVUZGSVh9IgorICAgICAgICBpZiB0ZXN0IC1kICIkQk9PVF9KREsiOyB0aGVuCisgICAgICAgICAgQk9PVF9KREtfRk9VTkQ9bWF5YmUKKyAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IEZvdW5kIHBvdGVudGlhbCBCb290IEpESyB1c2luZyB3ZWxsLWtub3duIGxvY2F0aW9ucyAoaW4gJEJPT1RfSkRLX1BSRUZJWC8kSkRLX1RPX1RSWSkiID4mNQorJGFzX2VjaG8gIiRhc19tZTogRm91bmQgcG90ZW50aWFsIEJvb3QgSkRLIHVzaW5nIHdlbGwta25vd24gbG9jYXRpb25zIChpbiAkQk9PVF9KREtfUFJFRklYLyRKREtfVE9fVFJZKSIgPiY2O30KKyAgICAgICAgZmkKKworCisgICAgIyBJZiBwcmV2aW91cyBzdGVwIGNsYWltZWQgdG8gaGF2ZSBmb3VuZCBhIEpESywgY2hlY2sgaXQgdG8gc2VlIGlmIGl0IHNlZW1zIHRvIGJlIHZhbGlkLgorICAgIGlmIHRlc3QgIngkQk9PVF9KREtfRk9VTkQiID0geG1heWJlOyB0aGVuCisgICAgICAjIERvIHdlIGhhdmUgYSBiaW4vamF2YT8KKyAgICAgIGlmIHRlc3QgISAteCAiJEJPT1RfSkRLL2Jpbi9qYXZhIjsgdGhlbgorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFBvdGVudGlhbCBCb290IEpESyBmb3VuZCBhdCAkQk9PVF9KREsgZGlkIG5vdCBjb250YWluIGJpbi9qYXZhOyBpZ25vcmluZyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBQb3RlbnRpYWwgQm9vdCBKREsgZm91bmQgYXQgJEJPT1RfSkRLIGRpZCBub3QgY29udGFpbiBiaW4vamF2YTsgaWdub3JpbmciID4mNjt9CisgICAgICAgIEJPT1RfSkRLX0ZPVU5EPW5vCisgICAgICBlbHNlCisgICAgICAgICMgRG8gd2UgaGF2ZSBhIGJpbi9qYXZhYz8KKyAgICAgICAgaWYgdGVzdCAhIC14ICIkQk9PVF9KREsvYmluL2phdmFjIjsgdGhlbgorICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogUG90ZW50aWFsIEJvb3QgSkRLIGZvdW5kIGF0ICRCT09UX0pESyBkaWQgbm90IGNvbnRhaW4gYmluL2phdmFjOyBpZ25vcmluZyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBQb3RlbnRpYWwgQm9vdCBKREsgZm91bmQgYXQgJEJPT1RfSkRLIGRpZCBub3QgY29udGFpbiBiaW4vamF2YWM7IGlnbm9yaW5nIiA+JjY7fQorICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogKFRoaXMgbWlnaHQgYmUgYW4gSlJFIGluc3RlYWQgb2YgYW4gSkRLKSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiAoVGhpcyBtaWdodCBiZSBhbiBKUkUgaW5zdGVhZCBvZiBhbiBKREspIiA+JjY7fQorICAgICAgICAgIEJPT1RfSkRLX0ZPVU5EPW5vCisgICAgICAgIGVsc2UKKyAgICAgICAgICAjIERvIHdlIGhhdmUgYW4gcnQuamFyPyAoT24gTWFjT1NYIGl0IGlzIGNhbGxlZCBjbGFzc2VzLmphcikKKyAgICAgICAgICBpZiB0ZXN0ICEgLWYgIiRCT09UX0pESy9qcmUvbGliL3J0LmphciIgJiYgdGVzdCAhIC1mICIkQk9PVF9KREsvLi4vQ2xhc3Nlcy9jbGFzc2VzLmphciI7IHRoZW4KKyAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogUG90ZW50aWFsIEJvb3QgSkRLIGZvdW5kIGF0ICRCT09UX0pESyBkaWQgbm90IGNvbnRhaW4gYW4gcnQuamFyOyBpZ25vcmluZyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBQb3RlbnRpYWwgQm9vdCBKREsgZm91bmQgYXQgJEJPT1RfSkRLIGRpZCBub3QgY29udGFpbiBhbiBydC5qYXI7IGlnbm9yaW5nIiA+JjY7fQorICAgICAgICAgICAgQk9PVF9KREtfRk9VTkQ9bm8KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICAjIE9oLCB0aGlzIGlzIGxvb2tpbmcgZ29vZCEgV2UgcHJvYmFibHkgaGF2ZSBmb3VuZCBhIHByb3BlciBKREsuIElzIGl0IHRoZSBjb3JyZWN0IHZlcnNpb24/CisgICAgICAgICAgICBCT09UX0pES19WRVJTSU9OPWAiJEJPT1RfSkRLL2Jpbi9qYXZhIiAtdmVyc2lvbiAyPiYxIHwgaGVhZCAtbiAxYAorCisgICAgICAgICAgICAjIEV4dHJhIE00IHF1b3RlIG5lZWRlZCB0byBwcm90ZWN0IFtdIGluIGdyZXAgZXhwcmVzc2lvbi4KKyAgICAgICAgICAgIEZPVU5EX1ZFUlNJT05fNzg9YGVjaG8gJEJPT1RfSkRLX1ZFUlNJT04gfCBncmVwICAnXCIxXC5bNzhdXC4nYAorICAgICAgICAgICAgaWYgdGVzdCAieCRGT1VORF9WRVJTSU9OXzc4IiA9IHg7IHRoZW4KKyAgICAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBQb3RlbnRpYWwgQm9vdCBKREsgZm91bmQgYXQgJEJPT1RfSkRLIGlzIGluY29ycmVjdCBKREsgdmVyc2lvbiAoJEJPT1RfSkRLX1ZFUlNJT04pOyBpZ25vcmluZyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBQb3RlbnRpYWwgQm9vdCBKREsgZm91bmQgYXQgJEJPT1RfSkRLIGlzIGluY29ycmVjdCBKREsgdmVyc2lvbiAoJEJPT1RfSkRLX1ZFUlNJT04pOyBpZ25vcmluZyIgPiY2O30KKyAgICAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAoWW91ciBCb290IEpESyBtdXN0IGJlIHZlcnNpb24gNyBvciA4KSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiAoWW91ciBCb290IEpESyBtdXN0IGJlIHZlcnNpb24gNyBvciA4KSIgPiY2O30KKyAgICAgICAgICAgICAgQk9PVF9KREtfRk9VTkQ9bm8KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgIyBXZSdyZSBkb25lISA6LSkKKyAgICAgICAgICAgICAgQk9PVF9KREtfRk9VTkQ9eWVzCisKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorCisgICMgSW5wdXQgbWlnaHQgYmUgZ2l2ZW4gYXMgV2luZG93cyBmb3JtYXQsIHN0YXJ0IGJ5IGNvbnZlcnRpbmcgdG8KKyAgIyB1bml4IGZvcm1hdC4KKyAgcGF0aD0iJEJPT1RfSkRLIgorICBuZXdfcGF0aD1gJENZR1BBVEggLXUgIiRwYXRoImAKKworICAjIEN5Z3dpbiB0cmllcyB0byBoaWRlIHNvbWUgYXNwZWN0cyBvZiB0aGUgV2luZG93cyBmaWxlIHN5c3RlbSwgc3VjaCB0aGF0IGJpbmFyaWVzIGFyZQorICAjIG5hbWVkIC5leGUgYnV0IGNhbGxlZCB3aXRob3V0IHRoYXQgc3VmZml4LiBUaGVyZWZvcmUsICJmb28iIGFuZCAiZm9vLmV4ZSIgYXJlIGNvbnNpZGVyZWQKKyAgIyB0aGUgc2FtZSBmaWxlLCBtb3N0IG9mIHRoZSB0aW1lIChhcyBpbiAidGVzdCAtZiIpLiBCdXQgbm90IHdoZW4gcnVubmluZyBjeWdwYXRoIC1zLCB0aGVuCisgICMgImZvby5leGUiIGlzIE9LIGJ1dCAiZm9vIiBpcyBhbiBlcnJvci4KKyAgIworICAjIFRoaXMgdGVzdCBpcyB0aGVyZWZvcmUgc2xpZ2h0bHkgbW9yZSBhY2N1cmF0ZSB0aGFuICJ0ZXN0IC1mIiB0byBjaGVjayBmb3IgZmlsZSBwcmVjZW5zZS4KKyAgIyBJdCBpcyBhbHNvIGEgd2F5IHRvIG1ha2Ugc3VyZSB3ZSBnb3QgdGhlIHByb3BlciBmaWxlIG5hbWUgZm9yIHRoZSByZWFsIHRlc3QgbGF0ZXIgb24uCisgIHRlc3Rfc2hvcnRwYXRoPWAkQ1lHUEFUSCAtcyAtbSAiJG5ld19wYXRoIiAyPiAvZGV2L251bGxgCisgIGlmIHRlc3QgIngkdGVzdF9zaG9ydHBhdGgiID0geDsgdGhlbgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGhlIHBhdGggb2YgQk9PVF9KREssIHdoaWNoIHJlc29sdmVzIGFzIFwiJHBhdGhcIiwgaXMgaW52YWxpZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhlIHBhdGggb2YgQk9PVF9KREssIHdoaWNoIHJlc29sdmVzIGFzIFwiJHBhdGhcIiwgaXMgaW52YWxpZC4iID4mNjt9CisgICAgYXNfZm5fZXJyb3IgJD8gIkNhbm5vdCBsb2NhdGUgdGhlIHRoZSBwYXRoIG9mIEJPT1RfSkRLIiAiJExJTkVOTyIgNQorICBmaQorCisgICMgQ2FsbCBoZWxwZXIgZnVuY3Rpb24gd2hpY2ggcG9zc2libHkgY29udmVydHMgdGhpcyB1c2luZyBET1Mtc3R5bGUgc2hvcnQgbW9kZS4KKyAgIyBJZiBzbywgdGhlIHVwZGF0ZWQgcGF0aCBpcyBzdG9yZWQgaW4gJG5ld19wYXRoLgorCisgIGlucHV0X3BhdGg9IiRuZXdfcGF0aCIKKyAgIyBDaGVjayBpZiB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhpcyB1c2luZyBET1Mtc3R5bGUgc2hvcnQgbW9kZS4gSWYgdGhlIHBhdGgKKyAgIyBjb250YWlucyBqdXN0IHNpbXBsZSBjaGFyYWN0ZXJzLCB1c2UgaXQuIE90aGVyd2lzZSAoc3BhY2VzLCB3ZWlyZCBjaGFyYWN0ZXJzKSwKKyAgIyB0YWtlIG5vIGNoYW5jZXMgYW5kIHJld3JpdGUgaXQuCisgICMgTm90ZTogbTQgZWF0cyBvdXIgW10sIHNvIHdlIG5lZWQgdG8gdXNlIFsgYW5kIF0gaW5zdGVhZC4KKyAgaGFzX2ZvcmJpZGRlbl9jaGFycz1gJEVDSE8gIiRpbnB1dF9wYXRoIiB8ICRHUkVQIFteLS5fL2EtekEtWjAtOV1gCisgIGlmIHRlc3QgIngkaGFzX2ZvcmJpZGRlbl9jaGFycyIgIT0geDsgdGhlbgorICAgICMgTm93IGNvbnZlcnQgaXQgdG8gbWl4ZWQgRE9TLXN0eWxlLCBzaG9ydCBtb2RlIChubyBzcGFjZXMsIGFuZCAvIGluc3RlYWQgb2YgXCkKKyAgICBzaG9ydG1vZGVfcGF0aD1gJENZR1BBVEggLXMgLW0gLWEgIiRpbnB1dF9wYXRoImAKKyAgICBwYXRoX2FmdGVyX3Nob3J0bW9kZT1gJENZR1BBVEggLXUgIiRzaG9ydG1vZGVfcGF0aCJgCisgICAgaWYgdGVzdCAieCRwYXRoX2FmdGVyX3Nob3J0bW9kZSIgIT0gIngkaW5wdXRfdG9fc2hvcnRwYXRoIjsgdGhlbgorICAgICAgIyBHb2luZyB0byBzaG9ydCBtb2RlIGFuZCBiYWNrIGFnYWluIGRpZCBpbmRlZWQgbWF0dGVyLiBTaW5jZSBzaG9ydCBtb2RlIGlzCisgICAgICAjIGNhc2UgaW5zZW5zaXRpdmUsIGxldCdzIG1ha2UgaXQgbG93ZXJjYXNlIHRvIGltcHJvdmUgcmVhZGFiaWxpdHkuCisgICAgICBzaG9ydG1vZGVfcGF0aD1gJEVDSE8gIiRzaG9ydG1vZGVfcGF0aCIgfCAkVFIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAorICAgICAgIyBOb3cgY29udmVydCBpdCBiYWNrIHRvIFVuaXgtc3RpbGUgKGN5Z3BhdGgpCisgICAgICBpbnB1dF9wYXRoPWAkQ1lHUEFUSCAtdSAiJHNob3J0bW9kZV9wYXRoImAKKyAgICAgIG5ld19wYXRoPSIkaW5wdXRfcGF0aCIKICAgICBmaQogICBmaQogCisgIHRlc3RfY3lnZHJpdmVfcHJlZml4PWAkRUNITyAkaW5wdXRfcGF0aCB8ICRHUkVQIF4vY3lnZHJpdmUvYAorICBpZiB0ZXN0ICJ4JHRlc3RfY3lnZHJpdmVfcHJlZml4IiA9IHg7IHRoZW4KKyAgICAjIEFzIGEgc2ltcGxlIGZpeCwgZXhjbHVkZSAvdXNyL2JpbiBzaW5jZSBpdCdzIG5vdCBhIHJlYWwgcGF0aC4KKyAgICBpZiB0ZXN0ICJ4YCRFQ0hPICRuZXdfcGF0aCB8ICRHUkVQIF4vdXNyL2Jpbi9gIiA9IHg7IHRoZW4KKyAgICAgICMgVGhlIHBhdGggaXMgaW4gYSBDeWd3aW4gc3BlY2lhbCBkaXJlY3RvcnkgKGUuZy4gL2hvbWUpLiBXZSBuZWVkIHRoaXMgY29udmVydGVkIHRvCisgICAgICAjIGEgcGF0aCBwcmVmaXhlZCBieSAvY3lnZHJpdmUgZm9yIGZpeHBhdGggdG8gd29yay4KKyAgICAgIG5ld19wYXRoPSIkQ1lHV0lOX1JPT1RfUEFUSCRpbnB1dF9wYXRoIgorICAgIGZpCisgIGZpCisKKworICBpZiB0ZXN0ICJ4JHBhdGgiICE9ICJ4JG5ld19wYXRoIjsgdGhlbgorICAgIEJPT1RfSkRLPSIkbmV3X3BhdGgiCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBSZXdyaXRpbmcgQk9PVF9KREsgdG8gXCIkbmV3X3BhdGhcIiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBSZXdyaXRpbmcgQk9PVF9KREsgdG8gXCIkbmV3X3BhdGhcIiIgPiY2O30KKyAgZmkKKworICBlbGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLm1zeXMiOyB0aGVuCisKKyAgcGF0aD0iJEJPT1RfSkRLIgorICBoYXNfY29sb249YCRFQ0hPICRwYXRoIHwgJEdSRVAgXi46YAorICBuZXdfcGF0aD0iJHBhdGgiCisgIGlmIHRlc3QgIngkaGFzX2NvbG9uIiA9IHg7IHRoZW4KKyAgICAjIE5vdCBpbiBtaXhlZCBvciBXaW5kb3dzIHN0eWxlLCBzdGFydCBieSB0aGF0LgorICAgIG5ld19wYXRoPWBjbWQgLy9jIGVjaG8gJHBhdGhgCisgIGZpCisKKworICBpbnB1dF9wYXRoPSIkbmV3X3BhdGgiCisgICMgQ2hlY2sgaWYgd2UgbmVlZCB0byBjb252ZXJ0IHRoaXMgdXNpbmcgRE9TLXN0eWxlIHNob3J0IG1vZGUuIElmIHRoZSBwYXRoCisgICMgY29udGFpbnMganVzdCBzaW1wbGUgY2hhcmFjdGVycywgdXNlIGl0LiBPdGhlcndpc2UgKHNwYWNlcywgd2VpcmQgY2hhcmFjdGVycyksCisgICMgdGFrZSBubyBjaGFuY2VzIGFuZCByZXdyaXRlIGl0LgorICAjIE5vdGU6IG00IGVhdHMgb3VyIFtdLCBzbyB3ZSBuZWVkIHRvIHVzZSBbIGFuZCBdIGluc3RlYWQuCisgIGhhc19mb3JiaWRkZW5fY2hhcnM9YCRFQ0hPICIkaW5wdXRfcGF0aCIgfCAkR1JFUCBbXi1fLzphLXpBLVowLTldYAorICBpZiB0ZXN0ICJ4JGhhc19mb3JiaWRkZW5fY2hhcnMiICE9IHg7IHRoZW4KKyAgICAjIE5vdyBjb252ZXJ0IGl0IHRvIG1peGVkIERPUy1zdHlsZSwgc2hvcnQgbW9kZSAobm8gc3BhY2VzLCBhbmQgLyBpbnN0ZWFkIG9mIFwpCisgICAgbmV3X3BhdGg9YGNtZCAvYyAiZm9yICVBIGluIChcIiRpbnB1dF9wYXRoXCIpIGRvIEBlY2hvICV+c0EifCRUUiBcXFxcXFxcXCAvIHwgJFRSICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J2AKKyAgZmkKKworCisgIHdpbmRvd3NfcGF0aD0iJG5ld19wYXRoIgorICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5jeWd3aW4iOyB0aGVuCisgICAgdW5peF9wYXRoPWAkQ1lHUEFUSCAtdSAiJHdpbmRvd3NfcGF0aCJgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGVsaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MubXN5cyI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRFQ0hPICIkd2luZG93c19wYXRoIiB8ICRTRUQgLWUgJ3MsXlxcKC5cXCk6LC9cXDEsZycgLWUgJ3MsXFxcXCwvLGcnYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBmaQorCisgIGlmIHRlc3QgIngkcGF0aCIgIT0gIngkbmV3X3BhdGgiOyB0aGVuCisgICAgQk9PVF9KREs9IiRuZXdfcGF0aCIKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFJld3JpdGluZyBCT09UX0pESyB0byBcIiRuZXdfcGF0aFwiIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFJld3JpdGluZyBCT09UX0pESyB0byBcIiRuZXdfcGF0aFwiIiA+JjY7fQorICBmaQorCisgICMgU2F2ZSB0aGUgZmlyc3QgMTAgYnl0ZXMgb2YgdGhpcyBwYXRoIHRvIHRoZSBzdG9yYWdlLCBzbyBmaXhwYXRoIGNhbiB3b3JrLgorICBhbGxfZml4cGF0aF9wcmVmaXhlcz0oIiR7YWxsX2ZpeHBhdGhfcHJlZml4ZXNbQF19IiAiJHtuZXdfcGF0aDowOjEwfSIpCisKKyAgZWxzZQorICAgICMgV2UncmUgb24gYSBwb3NpeCBwbGF0Zm9ybS4gSG9vcmF5ISA6KQorICAgIHBhdGg9IiRCT09UX0pESyIKKworICAgIGlmIHRlc3QgISAtZiAiJHBhdGgiICYmIHRlc3QgISAtZCAiJHBhdGgiOyB0aGVuCisgICAgICBhc19mbl9lcnJvciAkPyAiVGhlIHBhdGggb2YgQk9PVF9KREssIHdoaWNoIHJlc29sdmVzIGFzIFwiJHBhdGhcIiwgaXMgbm90IGZvdW5kLiIgIiRMSU5FTk8iIDUKKyAgICBmaQorCisgICAgaGFzX3NwYWNlPWAkRUNITyAiJHBhdGgiIHwgJEdSRVAgIiAiYAorICAgIGlmIHRlc3QgIngkaGFzX3NwYWNlIiAhPSB4OyB0aGVuCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSBwYXRoIG9mIEJPT1RfSkRLLCB3aGljaCByZXNvbHZlcyBhcyBcIiRwYXRoXCIsIGlzIGludmFsaWQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoZSBwYXRoIG9mIEJPT1RfSkRLLCB3aGljaCByZXNvbHZlcyBhcyBcIiRwYXRoXCIsIGlzIGludmFsaWQuIiA+JjY7fQorICAgICAgYXNfZm5fZXJyb3IgJD8gIlNwYWNlcyBhcmUgbm90IGFsbG93ZWQgaW4gdGhpcyBwYXRoLiIgIiRMSU5FTk8iIDUKKyAgICBmaQorICBmaQorCisgICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIEJvb3QgSkRLIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBCb290IEpESy4uLiAiID4mNjsgfQorICAgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJEJPT1RfSkRLIiA+JjUKKyRhc19lY2hvICIkQk9PVF9KREsiID4mNjsgfQorICAgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIEJvb3QgSkRLIHZlcnNpb24iID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgQm9vdCBKREsgdmVyc2lvbi4uLiAiID4mNjsgfQorICAgICAgICAgICAgICBCT09UX0pES19WRVJTSU9OPWAiJEJPT1RfSkRLL2Jpbi9qYXZhIiAtdmVyc2lvbiAyPiYxIHwgJFRSICdcblxyJyAnICAnYAorICAgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJEJPT1RfSkRLX1ZFUlNJT04iID4mNQorJGFzX2VjaG8gIiRCT09UX0pES19WRVJTSU9OIiA+JjY7IH0KKyAgICAgICAgICAgIGZpICMgZW5kIGNoZWNrIGpkayB2ZXJzaW9uCisgICAgICAgICAgZmkgIyBlbmQgY2hlY2sgcnQuamFyCisgICAgICAgIGZpICMgZW5kIGNoZWNrIGphdmFjCisgICAgICBmaSAjIGVuZCBjaGVjayBqYXZhCisgICAgZmkgIyBlbmQgY2hlY2sgYm9vdCBqZGsgZm91bmQKKyAgZmkKKworICAgIGRvbmUKKyAgZmkKKwogICBmaQogCiAKQEAgLTkzODcsMjYgKzEyNDMyLDEzMyBAQAogICAgICAgICAgICAgICAjIFdlJ3JlIGRvbmUhIDotKQogICAgICAgICAgICAgICBCT09UX0pES19GT1VORD15ZXMKIAotICAgICMgRmFpbCB3aXRoIG1lc3NhZ2UgdGhlIHBhdGggdG8gdGhlIEJvb3QgSkRLIGlmIHZhciBCT09UX0pESyBjb250YWlucyBhIHBhdGggd2l0aCBubyBzcGFjZXMgaW4gaXQuCi0gICAgIyBVbmxlc3Mgb24gV2luZG93cywgd2hlcmUgd2UgY2FuIHJld3JpdGUgdGhlIHBhdGguCi0gICAgSEFTX1NQQUNFPWBlY2hvICIkQk9PVF9KREsiIHwgZ3JlcCAiICJgCi0gICAgaWYgdGVzdCAieCRIQVNfU1BBQ0UiICE9IHg7IHRoZW4KLSAgICAgICAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TIiA9ICJ4d2luZG93cyI7IHRoZW4KLSAgICAgICAgICAgICMgRmlyc3QgY29udmVydCBpdCB0byBET1Mtc3R5bGUsIHNob3J0IG1vZGUgKG5vIHNwYWNlcykKLSAgICAgICAgICAgIEJPT1RfSkRLPWAkQ1lHUEFUSCAtcyAtbSAtYSAiJEJPT1RfSkRLImAKLSAgICAgICAgICAgICMgTm93IGl0J3MgY2FzZSBpbnNlbnNpdGl2ZTsgbGV0J3MgbWFrZSBpdCBsb3dlcmNhc2UgdG8gaW1wcm92ZSByZWFkYWJpbGl0eQotICAgICAgICAgICAgQk9PVF9KREs9YCRFQ0hPICIkQk9PVF9KREsiIHwgJFRSICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZxeHl6J2AKLSAgICAgICAgICAgICMgTm93IGNvbnZlcnQgaXQgYmFjayB0byBVbml4LXN0aWxlIChjeWdwYXRoKQotICAgICAgICAgICAgQk9PVF9KREs9YCRDWUdQQVRIIC11ICIkQk9PVF9KREsiYAotICAgICAgICBlbHNlCi0gICAgICAgICAgICBhc19mbl9lcnJvciAkPyAiWW91IGNhbm5vdCBoYXZlIHNwYWNlcyBpbiB0aGUgcGF0aCB0byB0aGUgQm9vdCBKREshIFwiJEJPT1RfSkRLXCIiICIkTElORU5PIiA1Ci0gICAgICAgIGZpCisgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLmN5Z3dpbiI7IHRoZW4KKworICAjIElucHV0IG1pZ2h0IGJlIGdpdmVuIGFzIFdpbmRvd3MgZm9ybWF0LCBzdGFydCBieSBjb252ZXJ0aW5nIHRvCisgICMgdW5peCBmb3JtYXQuCisgIHBhdGg9IiRCT09UX0pESyIKKyAgbmV3X3BhdGg9YCRDWUdQQVRIIC11ICIkcGF0aCJgCisKKyAgIyBDeWd3aW4gdHJpZXMgdG8gaGlkZSBzb21lIGFzcGVjdHMgb2YgdGhlIFdpbmRvd3MgZmlsZSBzeXN0ZW0sIHN1Y2ggdGhhdCBiaW5hcmllcyBhcmUKKyAgIyBuYW1lZCAuZXhlIGJ1dCBjYWxsZWQgd2l0aG91dCB0aGF0IHN1ZmZpeC4gVGhlcmVmb3JlLCAiZm9vIiBhbmQgImZvby5leGUiIGFyZSBjb25zaWRlcmVkCisgICMgdGhlIHNhbWUgZmlsZSwgbW9zdCBvZiB0aGUgdGltZSAoYXMgaW4gInRlc3QgLWYiKS4gQnV0IG5vdCB3aGVuIHJ1bm5pbmcgY3lncGF0aCAtcywgdGhlbgorICAjICJmb28uZXhlIiBpcyBPSyBidXQgImZvbyIgaXMgYW4gZXJyb3IuCisgICMKKyAgIyBUaGlzIHRlc3QgaXMgdGhlcmVmb3JlIHNsaWdodGx5IG1vcmUgYWNjdXJhdGUgdGhhbiAidGVzdCAtZiIgdG8gY2hlY2sgZm9yIGZpbGUgcHJlY2Vuc2UuCisgICMgSXQgaXMgYWxzbyBhIHdheSB0byBtYWtlIHN1cmUgd2UgZ290IHRoZSBwcm9wZXIgZmlsZSBuYW1lIGZvciB0aGUgcmVhbCB0ZXN0IGxhdGVyIG9uLgorICB0ZXN0X3Nob3J0cGF0aD1gJENZR1BBVEggLXMgLW0gIiRuZXdfcGF0aCIgMj4gL2Rldi9udWxsYAorICBpZiB0ZXN0ICJ4JHRlc3Rfc2hvcnRwYXRoIiA9IHg7IHRoZW4KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSBwYXRoIG9mIEJPT1RfSkRLLCB3aGljaCByZXNvbHZlcyBhcyBcIiRwYXRoXCIsIGlzIGludmFsaWQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoZSBwYXRoIG9mIEJPT1RfSkRLLCB3aGljaCByZXNvbHZlcyBhcyBcIiRwYXRoXCIsIGlzIGludmFsaWQuIiA+JjY7fQorICAgIGFzX2ZuX2Vycm9yICQ/ICJDYW5ub3QgbG9jYXRlIHRoZSB0aGUgcGF0aCBvZiBCT09UX0pESyIgIiRMSU5FTk8iIDUKKyAgZmkKKworICAjIENhbGwgaGVscGVyIGZ1bmN0aW9uIHdoaWNoIHBvc3NpYmx5IGNvbnZlcnRzIHRoaXMgdXNpbmcgRE9TLXN0eWxlIHNob3J0IG1vZGUuCisgICMgSWYgc28sIHRoZSB1cGRhdGVkIHBhdGggaXMgc3RvcmVkIGluICRuZXdfcGF0aC4KKworICBpbnB1dF9wYXRoPSIkbmV3X3BhdGgiCisgICMgQ2hlY2sgaWYgd2UgbmVlZCB0byBjb252ZXJ0IHRoaXMgdXNpbmcgRE9TLXN0eWxlIHNob3J0IG1vZGUuIElmIHRoZSBwYXRoCisgICMgY29udGFpbnMganVzdCBzaW1wbGUgY2hhcmFjdGVycywgdXNlIGl0LiBPdGhlcndpc2UgKHNwYWNlcywgd2VpcmQgY2hhcmFjdGVycyksCisgICMgdGFrZSBubyBjaGFuY2VzIGFuZCByZXdyaXRlIGl0LgorICAjIE5vdGU6IG00IGVhdHMgb3VyIFtdLCBzbyB3ZSBuZWVkIHRvIHVzZSBbIGFuZCBdIGluc3RlYWQuCisgIGhhc19mb3JiaWRkZW5fY2hhcnM9YCRFQ0hPICIkaW5wdXRfcGF0aCIgfCAkR1JFUCBbXi0uXy9hLXpBLVowLTldYAorICBpZiB0ZXN0ICJ4JGhhc19mb3JiaWRkZW5fY2hhcnMiICE9IHg7IHRoZW4KKyAgICAjIE5vdyBjb252ZXJ0IGl0IHRvIG1peGVkIERPUy1zdHlsZSwgc2hvcnQgbW9kZSAobm8gc3BhY2VzLCBhbmQgLyBpbnN0ZWFkIG9mIFwpCisgICAgc2hvcnRtb2RlX3BhdGg9YCRDWUdQQVRIIC1zIC1tIC1hICIkaW5wdXRfcGF0aCJgCisgICAgcGF0aF9hZnRlcl9zaG9ydG1vZGU9YCRDWUdQQVRIIC11ICIkc2hvcnRtb2RlX3BhdGgiYAorICAgIGlmIHRlc3QgIngkcGF0aF9hZnRlcl9zaG9ydG1vZGUiICE9ICJ4JGlucHV0X3RvX3Nob3J0cGF0aCI7IHRoZW4KKyAgICAgICMgR29pbmcgdG8gc2hvcnQgbW9kZSBhbmQgYmFjayBhZ2FpbiBkaWQgaW5kZWVkIG1hdHRlci4gU2luY2Ugc2hvcnQgbW9kZSBpcworICAgICAgIyBjYXNlIGluc2Vuc2l0aXZlLCBsZXQncyBtYWtlIGl0IGxvd2VyY2FzZSB0byBpbXByb3ZlIHJlYWRhYmlsaXR5LgorICAgICAgc2hvcnRtb2RlX3BhdGg9YCRFQ0hPICIkc2hvcnRtb2RlX3BhdGgiIHwgJFRSICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J2AKKyAgICAgICMgTm93IGNvbnZlcnQgaXQgYmFjayB0byBVbml4LXN0aWxlIChjeWdwYXRoKQorICAgICAgaW5wdXRfcGF0aD1gJENZR1BBVEggLXUgIiRzaG9ydG1vZGVfcGF0aCJgCisgICAgICBuZXdfcGF0aD0iJGlucHV0X3BhdGgiCiAgICAgZmkKKyAgZmkKKworICB0ZXN0X2N5Z2RyaXZlX3ByZWZpeD1gJEVDSE8gJGlucHV0X3BhdGggfCAkR1JFUCBeL2N5Z2RyaXZlL2AKKyAgaWYgdGVzdCAieCR0ZXN0X2N5Z2RyaXZlX3ByZWZpeCIgPSB4OyB0aGVuCisgICAgIyBBcyBhIHNpbXBsZSBmaXgsIGV4Y2x1ZGUgL3Vzci9iaW4gc2luY2UgaXQncyBub3QgYSByZWFsIHBhdGguCisgICAgaWYgdGVzdCAieGAkRUNITyAkbmV3X3BhdGggfCAkR1JFUCBeL3Vzci9iaW4vYCIgPSB4OyB0aGVuCisgICAgICAjIFRoZSBwYXRoIGlzIGluIGEgQ3lnd2luIHNwZWNpYWwgZGlyZWN0b3J5IChlLmcuIC9ob21lKS4gV2UgbmVlZCB0aGlzIGNvbnZlcnRlZCB0bworICAgICAgIyBhIHBhdGggcHJlZml4ZWQgYnkgL2N5Z2RyaXZlIGZvciBmaXhwYXRoIHRvIHdvcmsuCisgICAgICBuZXdfcGF0aD0iJENZR1dJTl9ST09UX1BBVEgkaW5wdXRfcGF0aCIKKyAgICBmaQorICBmaQorCisKKyAgaWYgdGVzdCAieCRwYXRoIiAhPSAieCRuZXdfcGF0aCI7IHRoZW4KKyAgICBCT09UX0pESz0iJG5ld19wYXRoIgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogUmV3cml0aW5nIEJPT1RfSkRLIHRvIFwiJG5ld19wYXRoXCIiID4mNQorJGFzX2VjaG8gIiRhc19tZTogUmV3cml0aW5nIEJPT1RfSkRLIHRvIFwiJG5ld19wYXRoXCIiID4mNjt9CisgIGZpCisKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorCisgIHBhdGg9IiRCT09UX0pESyIKKyAgaGFzX2NvbG9uPWAkRUNITyAkcGF0aCB8ICRHUkVQIF4uOmAKKyAgbmV3X3BhdGg9IiRwYXRoIgorICBpZiB0ZXN0ICJ4JGhhc19jb2xvbiIgPSB4OyB0aGVuCisgICAgIyBOb3QgaW4gbWl4ZWQgb3IgV2luZG93cyBzdHlsZSwgc3RhcnQgYnkgdGhhdC4KKyAgICBuZXdfcGF0aD1gY21kIC8vYyBlY2hvICRwYXRoYAorICBmaQorCisKKyAgaW5wdXRfcGF0aD0iJG5ld19wYXRoIgorICAjIENoZWNrIGlmIHdlIG5lZWQgdG8gY29udmVydCB0aGlzIHVzaW5nIERPUy1zdHlsZSBzaG9ydCBtb2RlLiBJZiB0aGUgcGF0aAorICAjIGNvbnRhaW5zIGp1c3Qgc2ltcGxlIGNoYXJhY3RlcnMsIHVzZSBpdC4gT3RoZXJ3aXNlIChzcGFjZXMsIHdlaXJkIGNoYXJhY3RlcnMpLAorICAjIHRha2Ugbm8gY2hhbmNlcyBhbmQgcmV3cml0ZSBpdC4KKyAgIyBOb3RlOiBtNCBlYXRzIG91ciBbXSwgc28gd2UgbmVlZCB0byB1c2UgWyBhbmQgXSBpbnN0ZWFkLgorICBoYXNfZm9yYmlkZGVuX2NoYXJzPWAkRUNITyAiJGlucHV0X3BhdGgiIHwgJEdSRVAgW14tXy86YS16QS1aMC05XWAKKyAgaWYgdGVzdCAieCRoYXNfZm9yYmlkZGVuX2NoYXJzIiAhPSB4OyB0aGVuCisgICAgIyBOb3cgY29udmVydCBpdCB0byBtaXhlZCBET1Mtc3R5bGUsIHNob3J0IG1vZGUgKG5vIHNwYWNlcywgYW5kIC8gaW5zdGVhZCBvZiBcKQorICAgIG5ld19wYXRoPWBjbWQgL2MgImZvciAlQSBpbiAoXCIkaW5wdXRfcGF0aFwiKSBkbyBAZWNobyAlfnNBInwkVFIgXFxcXFxcXFwgLyB8ICRUUiAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidgCisgIGZpCisKKworICB3aW5kb3dzX3BhdGg9IiRuZXdfcGF0aCIKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJENZR1BBVEggLXUgIiR3aW5kb3dzX3BhdGgiYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBlbGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLm1zeXMiOyB0aGVuCisgICAgdW5peF9wYXRoPWAkRUNITyAiJHdpbmRvd3NfcGF0aCIgfCAkU0VEIC1lICdzLF5cXCguXFwpOiwvXFwxLGcnIC1lICdzLFxcXFwsLyxnJ2AKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZmkKKworICBpZiB0ZXN0ICJ4JHBhdGgiICE9ICJ4JG5ld19wYXRoIjsgdGhlbgorICAgIEJPT1RfSkRLPSIkbmV3X3BhdGgiCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBSZXdyaXRpbmcgQk9PVF9KREsgdG8gXCIkbmV3X3BhdGhcIiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBSZXdyaXRpbmcgQk9PVF9KREsgdG8gXCIkbmV3X3BhdGhcIiIgPiY2O30KKyAgZmkKKworICAjIFNhdmUgdGhlIGZpcnN0IDEwIGJ5dGVzIG9mIHRoaXMgcGF0aCB0byB0aGUgc3RvcmFnZSwgc28gZml4cGF0aCBjYW4gd29yay4KKyAgYWxsX2ZpeHBhdGhfcHJlZml4ZXM9KCIke2FsbF9maXhwYXRoX3ByZWZpeGVzW0BdfSIgIiR7bmV3X3BhdGg6MDoxMH0iKQorCisgIGVsc2UKKyAgICAjIFdlJ3JlIG9uIGEgcG9zaXggcGxhdGZvcm0uIEhvb3JheSEgOikKKyAgICBwYXRoPSIkQk9PVF9KREsiCisKKyAgICBpZiB0ZXN0ICEgLWYgIiRwYXRoIiAmJiB0ZXN0ICEgLWQgIiRwYXRoIjsgdGhlbgorICAgICAgYXNfZm5fZXJyb3IgJD8gIlRoZSBwYXRoIG9mIEJPT1RfSkRLLCB3aGljaCByZXNvbHZlcyBhcyBcIiRwYXRoXCIsIGlzIG5vdCBmb3VuZC4iICIkTElORU5PIiA1CisgICAgZmkKKworICAgIGhhc19zcGFjZT1gJEVDSE8gIiRwYXRoIiB8ICRHUkVQICIgImAKKyAgICBpZiB0ZXN0ICJ4JGhhc19zcGFjZSIgIT0geDsgdGhlbgorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUaGUgcGF0aCBvZiBCT09UX0pESywgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkcGF0aFwiLCBpcyBpbnZhbGlkLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUaGUgcGF0aCBvZiBCT09UX0pESywgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkcGF0aFwiLCBpcyBpbnZhbGlkLiIgPiY2O30KKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJTcGFjZXMgYXJlIG5vdCBhbGxvd2VkIGluIHRoaXMgcGF0aC4iICIkTElORU5PIiA1CisgICAgZmkKKyAgZmkKIAogICAgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBCb290IEpESyIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgQm9vdCBKREsuLi4gIiA+JjY7IH0KLSAgICAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRCT09UX0pESyAoJEJPT1RfSkRLX1ZFUlNJT04pIiA+JjUKLSRhc19lY2hvICIkQk9PVF9KREsgKCRCT09UX0pES19WRVJTSU9OKSIgPiY2OyB9CisgICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQk9PVF9KREsiID4mNQorJGFzX2VjaG8gIiRCT09UX0pESyIgPiY2OyB9CisgICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgQm9vdCBKREsgdmVyc2lvbiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBCb290IEpESyB2ZXJzaW9uLi4uICIgPiY2OyB9CisgICAgICAgICAgICAgIEJPT1RfSkRLX1ZFUlNJT049YCIkQk9PVF9KREsvYmluL2phdmEiIC12ZXJzaW9uIDI+JjEgfCAkVFIgJ1xuXHInICcgICdgCisgICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQk9PVF9KREtfVkVSU0lPTiIgPiY1CiskYXNfZWNobyAiJEJPT1RfSkRLX1ZFUlNJT04iID4mNjsgfQogICAgICAgICAgICAgZmkgIyBlbmQgY2hlY2sgamRrIHZlcnNpb24KICAgICAgICAgICBmaSAjIGVuZCBjaGVjayBydC5qYXIKICAgICAgICAgZmkgIyBlbmQgY2hlY2sgamF2YWMKQEAgLTk0MTksMTkgKzEyNTcxLDIwOSBAQAogICAgICMgTm93IGV4ZWN1dGUgdGhlIHRlc3QKIAogICBpZiB0ZXN0ICJ4JFBST0dSQU1GSUxFUyIgIT0geDsgdGhlbgorICAgIFZJUlRVQUxfRElSPSIkUFJPR1JBTUZJTEVTL0phdmEiCiAKLSAgQk9PVF9KREtfUFJFRklYPSJgJENZR1BBVEggLXUgIiRQUk9HUkFNRklMRVMiYC9KYXZhIgorICB3aW5kb3dzX3BhdGg9IiRWSVJUVUFMX0RJUiIKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJENZR1BBVEggLXUgIiR3aW5kb3dzX3BhdGgiYAorICAgIFZJUlRVQUxfRElSPSIkdW5peF9wYXRoIgorICBlbGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLm1zeXMiOyB0aGVuCisgICAgdW5peF9wYXRoPWAkRUNITyAiJHdpbmRvd3NfcGF0aCIgfCAkU0VEIC1lICdzLF5cXCguXFwpOiwvXFwxLGcnIC1lICdzLFxcXFwsLyxnJ2AKKyAgICBWSVJUVUFMX0RJUj0iJHVuaXhfcGF0aCIKKyAgZmkKKworCisgIEJPT1RfSkRLX1BSRUZJWD0iJFZJUlRVQUxfRElSIgogICBCT09UX0pES19TVUZGSVg9IiIKLSAgQkVTVF9KREtfRk9VTkQ9YCRMUyAiJEJPT1RfSkRLX1BSRUZJWCIgMj4gL2Rldi9udWxsIHwgJEdSRVAgamRrIHwgJFNPUlQgLXIgfCAkSEVBRCAtbiAxIGAKLSAgaWYgdGVzdCAieCRCRVNUX0pES19GT1VORCIgIT0geDsgdGhlbgotICAgIEJPT1RfSkRLPSIke0JPT1RfSkRLX1BSRUZJWH0vJHtCRVNUX0pES19GT1VORH0ke0JPT1RfSkRLX1NVRkZJWH0iCi0gICAgaWYgdGVzdCAtZCAiJEJPT1RfSkRLIjsgdGhlbgotICAgICAgQk9PVF9KREtfRk9VTkQ9bWF5YmUKLSAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogRm91bmQgcG90ZW50aWFsIEJvb3QgSkRLIHVzaW5nIHdlbGwta25vd24gbG9jYXRpb25zIChpbiAkQk9PVF9KREtfUFJFRklYKSIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBGb3VuZCBwb3RlbnRpYWwgQm9vdCBKREsgdXNpbmcgd2VsbC1rbm93biBsb2NhdGlvbnMgKGluICRCT09UX0pES19QUkVGSVgpIiA+JjY7fQorICBBTExfSkRLU19GT1VORD1gJExTICIkQk9PVF9KREtfUFJFRklYIiAyPiAvZGV2L251bGwgfCAkU09SVCAtcmAKKyAgaWYgdGVzdCAieCRBTExfSkRLU19GT1VORCIgIT0geDsgdGhlbgorICAgIGZvciBKREtfVE9fVFJZIGluICRBTExfSkRLU19GT1VORCA7IGRvCisKKyAgaWYgdGVzdCAieCRCT09UX0pES19GT1VORCIgPSB4bm87IHRoZW4KKyAgICAjIE5vdyBleGVjdXRlIHRoZSB0ZXN0CisKKyAgICAgICAgQk9PVF9KREs9IiR7Qk9PVF9KREtfUFJFRklYfS8ke0pES19UT19UUll9JHtCT09UX0pES19TVUZGSVh9IgorICAgICAgICBpZiB0ZXN0IC1kICIkQk9PVF9KREsiOyB0aGVuCisgICAgICAgICAgQk9PVF9KREtfRk9VTkQ9bWF5YmUKKyAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IEZvdW5kIHBvdGVudGlhbCBCb290IEpESyB1c2luZyB3ZWxsLWtub3duIGxvY2F0aW9ucyAoaW4gJEJPT1RfSkRLX1BSRUZJWC8kSkRLX1RPX1RSWSkiID4mNQorJGFzX2VjaG8gIiRhc19tZTogRm91bmQgcG90ZW50aWFsIEJvb3QgSkRLIHVzaW5nIHdlbGwta25vd24gbG9jYXRpb25zIChpbiAkQk9PVF9KREtfUFJFRklYLyRKREtfVE9fVFJZKSIgPiY2O30KKyAgICAgICAgZmkKKworCisgICAgIyBJZiBwcmV2aW91cyBzdGVwIGNsYWltZWQgdG8gaGF2ZSBmb3VuZCBhIEpESywgY2hlY2sgaXQgdG8gc2VlIGlmIGl0IHNlZW1zIHRvIGJlIHZhbGlkLgorICAgIGlmIHRlc3QgIngkQk9PVF9KREtfRk9VTkQiID0geG1heWJlOyB0aGVuCisgICAgICAjIERvIHdlIGhhdmUgYSBiaW4vamF2YT8KKyAgICAgIGlmIHRlc3QgISAteCAiJEJPT1RfSkRLL2Jpbi9qYXZhIjsgdGhlbgorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFBvdGVudGlhbCBCb290IEpESyBmb3VuZCBhdCAkQk9PVF9KREsgZGlkIG5vdCBjb250YWluIGJpbi9qYXZhOyBpZ25vcmluZyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBQb3RlbnRpYWwgQm9vdCBKREsgZm91bmQgYXQgJEJPT1RfSkRLIGRpZCBub3QgY29udGFpbiBiaW4vamF2YTsgaWdub3JpbmciID4mNjt9CisgICAgICAgIEJPT1RfSkRLX0ZPVU5EPW5vCisgICAgICBlbHNlCisgICAgICAgICMgRG8gd2UgaGF2ZSBhIGJpbi9qYXZhYz8KKyAgICAgICAgaWYgdGVzdCAhIC14ICIkQk9PVF9KREsvYmluL2phdmFjIjsgdGhlbgorICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogUG90ZW50aWFsIEJvb3QgSkRLIGZvdW5kIGF0ICRCT09UX0pESyBkaWQgbm90IGNvbnRhaW4gYmluL2phdmFjOyBpZ25vcmluZyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBQb3RlbnRpYWwgQm9vdCBKREsgZm91bmQgYXQgJEJPT1RfSkRLIGRpZCBub3QgY29udGFpbiBiaW4vamF2YWM7IGlnbm9yaW5nIiA+JjY7fQorICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogKFRoaXMgbWlnaHQgYmUgYW4gSlJFIGluc3RlYWQgb2YgYW4gSkRLKSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiAoVGhpcyBtaWdodCBiZSBhbiBKUkUgaW5zdGVhZCBvZiBhbiBKREspIiA+JjY7fQorICAgICAgICAgIEJPT1RfSkRLX0ZPVU5EPW5vCisgICAgICAgIGVsc2UKKyAgICAgICAgICAjIERvIHdlIGhhdmUgYW4gcnQuamFyPyAoT24gTWFjT1NYIGl0IGlzIGNhbGxlZCBjbGFzc2VzLmphcikKKyAgICAgICAgICBpZiB0ZXN0ICEgLWYgIiRCT09UX0pESy9qcmUvbGliL3J0LmphciIgJiYgdGVzdCAhIC1mICIkQk9PVF9KREsvLi4vQ2xhc3Nlcy9jbGFzc2VzLmphciI7IHRoZW4KKyAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogUG90ZW50aWFsIEJvb3QgSkRLIGZvdW5kIGF0ICRCT09UX0pESyBkaWQgbm90IGNvbnRhaW4gYW4gcnQuamFyOyBpZ25vcmluZyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBQb3RlbnRpYWwgQm9vdCBKREsgZm91bmQgYXQgJEJPT1RfSkRLIGRpZCBub3QgY29udGFpbiBhbiBydC5qYXI7IGlnbm9yaW5nIiA+JjY7fQorICAgICAgICAgICAgQk9PVF9KREtfRk9VTkQ9bm8KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICAjIE9oLCB0aGlzIGlzIGxvb2tpbmcgZ29vZCEgV2UgcHJvYmFibHkgaGF2ZSBmb3VuZCBhIHByb3BlciBKREsuIElzIGl0IHRoZSBjb3JyZWN0IHZlcnNpb24/CisgICAgICAgICAgICBCT09UX0pES19WRVJTSU9OPWAiJEJPT1RfSkRLL2Jpbi9qYXZhIiAtdmVyc2lvbiAyPiYxIHwgaGVhZCAtbiAxYAorCisgICAgICAgICAgICAjIEV4dHJhIE00IHF1b3RlIG5lZWRlZCB0byBwcm90ZWN0IFtdIGluIGdyZXAgZXhwcmVzc2lvbi4KKyAgICAgICAgICAgIEZPVU5EX1ZFUlNJT05fNzg9YGVjaG8gJEJPT1RfSkRLX1ZFUlNJT04gfCBncmVwICAnXCIxXC5bNzhdXC4nYAorICAgICAgICAgICAgaWYgdGVzdCAieCRGT1VORF9WRVJTSU9OXzc4IiA9IHg7IHRoZW4KKyAgICAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBQb3RlbnRpYWwgQm9vdCBKREsgZm91bmQgYXQgJEJPT1RfSkRLIGlzIGluY29ycmVjdCBKREsgdmVyc2lvbiAoJEJPT1RfSkRLX1ZFUlNJT04pOyBpZ25vcmluZyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBQb3RlbnRpYWwgQm9vdCBKREsgZm91bmQgYXQgJEJPT1RfSkRLIGlzIGluY29ycmVjdCBKREsgdmVyc2lvbiAoJEJPT1RfSkRLX1ZFUlNJT04pOyBpZ25vcmluZyIgPiY2O30KKyAgICAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAoWW91ciBCb290IEpESyBtdXN0IGJlIHZlcnNpb24gNyBvciA4KSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiAoWW91ciBCb290IEpESyBtdXN0IGJlIHZlcnNpb24gNyBvciA4KSIgPiY2O30KKyAgICAgICAgICAgICAgQk9PVF9KREtfRk9VTkQ9bm8KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgIyBXZSdyZSBkb25lISA6LSkKKyAgICAgICAgICAgICAgQk9PVF9KREtfRk9VTkQ9eWVzCisKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorCisgICMgSW5wdXQgbWlnaHQgYmUgZ2l2ZW4gYXMgV2luZG93cyBmb3JtYXQsIHN0YXJ0IGJ5IGNvbnZlcnRpbmcgdG8KKyAgIyB1bml4IGZvcm1hdC4KKyAgcGF0aD0iJEJPT1RfSkRLIgorICBuZXdfcGF0aD1gJENZR1BBVEggLXUgIiRwYXRoImAKKworICAjIEN5Z3dpbiB0cmllcyB0byBoaWRlIHNvbWUgYXNwZWN0cyBvZiB0aGUgV2luZG93cyBmaWxlIHN5c3RlbSwgc3VjaCB0aGF0IGJpbmFyaWVzIGFyZQorICAjIG5hbWVkIC5leGUgYnV0IGNhbGxlZCB3aXRob3V0IHRoYXQgc3VmZml4LiBUaGVyZWZvcmUsICJmb28iIGFuZCAiZm9vLmV4ZSIgYXJlIGNvbnNpZGVyZWQKKyAgIyB0aGUgc2FtZSBmaWxlLCBtb3N0IG9mIHRoZSB0aW1lIChhcyBpbiAidGVzdCAtZiIpLiBCdXQgbm90IHdoZW4gcnVubmluZyBjeWdwYXRoIC1zLCB0aGVuCisgICMgImZvby5leGUiIGlzIE9LIGJ1dCAiZm9vIiBpcyBhbiBlcnJvci4KKyAgIworICAjIFRoaXMgdGVzdCBpcyB0aGVyZWZvcmUgc2xpZ2h0bHkgbW9yZSBhY2N1cmF0ZSB0aGFuICJ0ZXN0IC1mIiB0byBjaGVjayBmb3IgZmlsZSBwcmVjZW5zZS4KKyAgIyBJdCBpcyBhbHNvIGEgd2F5IHRvIG1ha2Ugc3VyZSB3ZSBnb3QgdGhlIHByb3BlciBmaWxlIG5hbWUgZm9yIHRoZSByZWFsIHRlc3QgbGF0ZXIgb24uCisgIHRlc3Rfc2hvcnRwYXRoPWAkQ1lHUEFUSCAtcyAtbSAiJG5ld19wYXRoIiAyPiAvZGV2L251bGxgCisgIGlmIHRlc3QgIngkdGVzdF9zaG9ydHBhdGgiID0geDsgdGhlbgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGhlIHBhdGggb2YgQk9PVF9KREssIHdoaWNoIHJlc29sdmVzIGFzIFwiJHBhdGhcIiwgaXMgaW52YWxpZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhlIHBhdGggb2YgQk9PVF9KREssIHdoaWNoIHJlc29sdmVzIGFzIFwiJHBhdGhcIiwgaXMgaW52YWxpZC4iID4mNjt9CisgICAgYXNfZm5fZXJyb3IgJD8gIkNhbm5vdCBsb2NhdGUgdGhlIHRoZSBwYXRoIG9mIEJPT1RfSkRLIiAiJExJTkVOTyIgNQorICBmaQorCisgICMgQ2FsbCBoZWxwZXIgZnVuY3Rpb24gd2hpY2ggcG9zc2libHkgY29udmVydHMgdGhpcyB1c2luZyBET1Mtc3R5bGUgc2hvcnQgbW9kZS4KKyAgIyBJZiBzbywgdGhlIHVwZGF0ZWQgcGF0aCBpcyBzdG9yZWQgaW4gJG5ld19wYXRoLgorCisgIGlucHV0X3BhdGg9IiRuZXdfcGF0aCIKKyAgIyBDaGVjayBpZiB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhpcyB1c2luZyBET1Mtc3R5bGUgc2hvcnQgbW9kZS4gSWYgdGhlIHBhdGgKKyAgIyBjb250YWlucyBqdXN0IHNpbXBsZSBjaGFyYWN0ZXJzLCB1c2UgaXQuIE90aGVyd2lzZSAoc3BhY2VzLCB3ZWlyZCBjaGFyYWN0ZXJzKSwKKyAgIyB0YWtlIG5vIGNoYW5jZXMgYW5kIHJld3JpdGUgaXQuCisgICMgTm90ZTogbTQgZWF0cyBvdXIgW10sIHNvIHdlIG5lZWQgdG8gdXNlIFsgYW5kIF0gaW5zdGVhZC4KKyAgaGFzX2ZvcmJpZGRlbl9jaGFycz1gJEVDSE8gIiRpbnB1dF9wYXRoIiB8ICRHUkVQIFteLS5fL2EtekEtWjAtOV1gCisgIGlmIHRlc3QgIngkaGFzX2ZvcmJpZGRlbl9jaGFycyIgIT0geDsgdGhlbgorICAgICMgTm93IGNvbnZlcnQgaXQgdG8gbWl4ZWQgRE9TLXN0eWxlLCBzaG9ydCBtb2RlIChubyBzcGFjZXMsIGFuZCAvIGluc3RlYWQgb2YgXCkKKyAgICBzaG9ydG1vZGVfcGF0aD1gJENZR1BBVEggLXMgLW0gLWEgIiRpbnB1dF9wYXRoImAKKyAgICBwYXRoX2FmdGVyX3Nob3J0bW9kZT1gJENZR1BBVEggLXUgIiRzaG9ydG1vZGVfcGF0aCJgCisgICAgaWYgdGVzdCAieCRwYXRoX2FmdGVyX3Nob3J0bW9kZSIgIT0gIngkaW5wdXRfdG9fc2hvcnRwYXRoIjsgdGhlbgorICAgICAgIyBHb2luZyB0byBzaG9ydCBtb2RlIGFuZCBiYWNrIGFnYWluIGRpZCBpbmRlZWQgbWF0dGVyLiBTaW5jZSBzaG9ydCBtb2RlIGlzCisgICAgICAjIGNhc2UgaW5zZW5zaXRpdmUsIGxldCdzIG1ha2UgaXQgbG93ZXJjYXNlIHRvIGltcHJvdmUgcmVhZGFiaWxpdHkuCisgICAgICBzaG9ydG1vZGVfcGF0aD1gJEVDSE8gIiRzaG9ydG1vZGVfcGF0aCIgfCAkVFIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAorICAgICAgIyBOb3cgY29udmVydCBpdCBiYWNrIHRvIFVuaXgtc3RpbGUgKGN5Z3BhdGgpCisgICAgICBpbnB1dF9wYXRoPWAkQ1lHUEFUSCAtdSAiJHNob3J0bW9kZV9wYXRoImAKKyAgICAgIG5ld19wYXRoPSIkaW5wdXRfcGF0aCIKICAgICBmaQogICBmaQogCisgIHRlc3RfY3lnZHJpdmVfcHJlZml4PWAkRUNITyAkaW5wdXRfcGF0aCB8ICRHUkVQIF4vY3lnZHJpdmUvYAorICBpZiB0ZXN0ICJ4JHRlc3RfY3lnZHJpdmVfcHJlZml4IiA9IHg7IHRoZW4KKyAgICAjIEFzIGEgc2ltcGxlIGZpeCwgZXhjbHVkZSAvdXNyL2JpbiBzaW5jZSBpdCdzIG5vdCBhIHJlYWwgcGF0aC4KKyAgICBpZiB0ZXN0ICJ4YCRFQ0hPICRuZXdfcGF0aCB8ICRHUkVQIF4vdXNyL2Jpbi9gIiA9IHg7IHRoZW4KKyAgICAgICMgVGhlIHBhdGggaXMgaW4gYSBDeWd3aW4gc3BlY2lhbCBkaXJlY3RvcnkgKGUuZy4gL2hvbWUpLiBXZSBuZWVkIHRoaXMgY29udmVydGVkIHRvCisgICAgICAjIGEgcGF0aCBwcmVmaXhlZCBieSAvY3lnZHJpdmUgZm9yIGZpeHBhdGggdG8gd29yay4KKyAgICAgIG5ld19wYXRoPSIkQ1lHV0lOX1JPT1RfUEFUSCRpbnB1dF9wYXRoIgorICAgIGZpCisgIGZpCisKKworICBpZiB0ZXN0ICJ4JHBhdGgiICE9ICJ4JG5ld19wYXRoIjsgdGhlbgorICAgIEJPT1RfSkRLPSIkbmV3X3BhdGgiCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBSZXdyaXRpbmcgQk9PVF9KREsgdG8gXCIkbmV3X3BhdGhcIiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBSZXdyaXRpbmcgQk9PVF9KREsgdG8gXCIkbmV3X3BhdGhcIiIgPiY2O30KKyAgZmkKKworICBlbGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLm1zeXMiOyB0aGVuCisKKyAgcGF0aD0iJEJPT1RfSkRLIgorICBoYXNfY29sb249YCRFQ0hPICRwYXRoIHwgJEdSRVAgXi46YAorICBuZXdfcGF0aD0iJHBhdGgiCisgIGlmIHRlc3QgIngkaGFzX2NvbG9uIiA9IHg7IHRoZW4KKyAgICAjIE5vdCBpbiBtaXhlZCBvciBXaW5kb3dzIHN0eWxlLCBzdGFydCBieSB0aGF0LgorICAgIG5ld19wYXRoPWBjbWQgLy9jIGVjaG8gJHBhdGhgCisgIGZpCisKKworICBpbnB1dF9wYXRoPSIkbmV3X3BhdGgiCisgICMgQ2hlY2sgaWYgd2UgbmVlZCB0byBjb252ZXJ0IHRoaXMgdXNpbmcgRE9TLXN0eWxlIHNob3J0IG1vZGUuIElmIHRoZSBwYXRoCisgICMgY29udGFpbnMganVzdCBzaW1wbGUgY2hhcmFjdGVycywgdXNlIGl0LiBPdGhlcndpc2UgKHNwYWNlcywgd2VpcmQgY2hhcmFjdGVycyksCisgICMgdGFrZSBubyBjaGFuY2VzIGFuZCByZXdyaXRlIGl0LgorICAjIE5vdGU6IG00IGVhdHMgb3VyIFtdLCBzbyB3ZSBuZWVkIHRvIHVzZSBbIGFuZCBdIGluc3RlYWQuCisgIGhhc19mb3JiaWRkZW5fY2hhcnM9YCRFQ0hPICIkaW5wdXRfcGF0aCIgfCAkR1JFUCBbXi1fLzphLXpBLVowLTldYAorICBpZiB0ZXN0ICJ4JGhhc19mb3JiaWRkZW5fY2hhcnMiICE9IHg7IHRoZW4KKyAgICAjIE5vdyBjb252ZXJ0IGl0IHRvIG1peGVkIERPUy1zdHlsZSwgc2hvcnQgbW9kZSAobm8gc3BhY2VzLCBhbmQgLyBpbnN0ZWFkIG9mIFwpCisgICAgbmV3X3BhdGg9YGNtZCAvYyAiZm9yICVBIGluIChcIiRpbnB1dF9wYXRoXCIpIGRvIEBlY2hvICV+c0EifCRUUiBcXFxcXFxcXCAvIHwgJFRSICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J2AKKyAgZmkKKworCisgIHdpbmRvd3NfcGF0aD0iJG5ld19wYXRoIgorICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5jeWd3aW4iOyB0aGVuCisgICAgdW5peF9wYXRoPWAkQ1lHUEFUSCAtdSAiJHdpbmRvd3NfcGF0aCJgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGVsaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MubXN5cyI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRFQ0hPICIkd2luZG93c19wYXRoIiB8ICRTRUQgLWUgJ3MsXlxcKC5cXCk6LC9cXDEsZycgLWUgJ3MsXFxcXCwvLGcnYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBmaQorCisgIGlmIHRlc3QgIngkcGF0aCIgIT0gIngkbmV3X3BhdGgiOyB0aGVuCisgICAgQk9PVF9KREs9IiRuZXdfcGF0aCIKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFJld3JpdGluZyBCT09UX0pESyB0byBcIiRuZXdfcGF0aFwiIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFJld3JpdGluZyBCT09UX0pESyB0byBcIiRuZXdfcGF0aFwiIiA+JjY7fQorICBmaQorCisgICMgU2F2ZSB0aGUgZmlyc3QgMTAgYnl0ZXMgb2YgdGhpcyBwYXRoIHRvIHRoZSBzdG9yYWdlLCBzbyBmaXhwYXRoIGNhbiB3b3JrLgorICBhbGxfZml4cGF0aF9wcmVmaXhlcz0oIiR7YWxsX2ZpeHBhdGhfcHJlZml4ZXNbQF19IiAiJHtuZXdfcGF0aDowOjEwfSIpCisKKyAgZWxzZQorICAgICMgV2UncmUgb24gYSBwb3NpeCBwbGF0Zm9ybS4gSG9vcmF5ISA6KQorICAgIHBhdGg9IiRCT09UX0pESyIKKworICAgIGlmIHRlc3QgISAtZiAiJHBhdGgiICYmIHRlc3QgISAtZCAiJHBhdGgiOyB0aGVuCisgICAgICBhc19mbl9lcnJvciAkPyAiVGhlIHBhdGggb2YgQk9PVF9KREssIHdoaWNoIHJlc29sdmVzIGFzIFwiJHBhdGhcIiwgaXMgbm90IGZvdW5kLiIgIiRMSU5FTk8iIDUKKyAgICBmaQorCisgICAgaGFzX3NwYWNlPWAkRUNITyAiJHBhdGgiIHwgJEdSRVAgIiAiYAorICAgIGlmIHRlc3QgIngkaGFzX3NwYWNlIiAhPSB4OyB0aGVuCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSBwYXRoIG9mIEJPT1RfSkRLLCB3aGljaCByZXNvbHZlcyBhcyBcIiRwYXRoXCIsIGlzIGludmFsaWQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoZSBwYXRoIG9mIEJPT1RfSkRLLCB3aGljaCByZXNvbHZlcyBhcyBcIiRwYXRoXCIsIGlzIGludmFsaWQuIiA+JjY7fQorICAgICAgYXNfZm5fZXJyb3IgJD8gIlNwYWNlcyBhcmUgbm90IGFsbG93ZWQgaW4gdGhpcyBwYXRoLiIgIiRMSU5FTk8iIDUKKyAgICBmaQorICBmaQorCisgICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIEJvb3QgSkRLIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBCb290IEpESy4uLiAiID4mNjsgfQorICAgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJEJPT1RfSkRLIiA+JjUKKyRhc19lY2hvICIkQk9PVF9KREsiID4mNjsgfQorICAgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIEJvb3QgSkRLIHZlcnNpb24iID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgQm9vdCBKREsgdmVyc2lvbi4uLiAiID4mNjsgfQorICAgICAgICAgICAgICBCT09UX0pES19WRVJTSU9OPWAiJEJPT1RfSkRLL2Jpbi9qYXZhIiAtdmVyc2lvbiAyPiYxIHwgJFRSICdcblxyJyAnICAnYAorICAgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJEJPT1RfSkRLX1ZFUlNJT04iID4mNQorJGFzX2VjaG8gIiRCT09UX0pES19WRVJTSU9OIiA+JjY7IH0KKyAgICAgICAgICAgIGZpICMgZW5kIGNoZWNrIGpkayB2ZXJzaW9uCisgICAgICAgICAgZmkgIyBlbmQgY2hlY2sgcnQuamFyCisgICAgICAgIGZpICMgZW5kIGNoZWNrIGphdmFjCisgICAgICBmaSAjIGVuZCBjaGVjayBqYXZhCisgICAgZmkgIyBlbmQgY2hlY2sgYm9vdCBqZGsgZm91bmQKKyAgZmkKKworICAgIGRvbmUKKyAgZmkKKwogICBmaQogCiAKQEAgLTk0NzIsMjYgKzEyODE0LDEzMyBAQAogICAgICAgICAgICAgICAjIFdlJ3JlIGRvbmUhIDotKQogICAgICAgICAgICAgICBCT09UX0pES19GT1VORD15ZXMKIAotICAgICMgRmFpbCB3aXRoIG1lc3NhZ2UgdGhlIHBhdGggdG8gdGhlIEJvb3QgSkRLIGlmIHZhciBCT09UX0pESyBjb250YWlucyBhIHBhdGggd2l0aCBubyBzcGFjZXMgaW4gaXQuCi0gICAgIyBVbmxlc3Mgb24gV2luZG93cywgd2hlcmUgd2UgY2FuIHJld3JpdGUgdGhlIHBhdGguCi0gICAgSEFTX1NQQUNFPWBlY2hvICIkQk9PVF9KREsiIHwgZ3JlcCAiICJgCi0gICAgaWYgdGVzdCAieCRIQVNfU1BBQ0UiICE9IHg7IHRoZW4KLSAgICAgICAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TIiA9ICJ4d2luZG93cyI7IHRoZW4KLSAgICAgICAgICAgICMgRmlyc3QgY29udmVydCBpdCB0byBET1Mtc3R5bGUsIHNob3J0IG1vZGUgKG5vIHNwYWNlcykKLSAgICAgICAgICAgIEJPT1RfSkRLPWAkQ1lHUEFUSCAtcyAtbSAtYSAiJEJPT1RfSkRLImAKLSAgICAgICAgICAgICMgTm93IGl0J3MgY2FzZSBpbnNlbnNpdGl2ZTsgbGV0J3MgbWFrZSBpdCBsb3dlcmNhc2UgdG8gaW1wcm92ZSByZWFkYWJpbGl0eQotICAgICAgICAgICAgQk9PVF9KREs9YCRFQ0hPICIkQk9PVF9KREsiIHwgJFRSICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZxeHl6J2AKLSAgICAgICAgICAgICMgTm93IGNvbnZlcnQgaXQgYmFjayB0byBVbml4LXN0aWxlIChjeWdwYXRoKQotICAgICAgICAgICAgQk9PVF9KREs9YCRDWUdQQVRIIC11ICIkQk9PVF9KREsiYAotICAgICAgICBlbHNlCi0gICAgICAgICAgICBhc19mbl9lcnJvciAkPyAiWW91IGNhbm5vdCBoYXZlIHNwYWNlcyBpbiB0aGUgcGF0aCB0byB0aGUgQm9vdCBKREshIFwiJEJPT1RfSkRLXCIiICIkTElORU5PIiA1Ci0gICAgICAgIGZpCisgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLmN5Z3dpbiI7IHRoZW4KKworICAjIElucHV0IG1pZ2h0IGJlIGdpdmVuIGFzIFdpbmRvd3MgZm9ybWF0LCBzdGFydCBieSBjb252ZXJ0aW5nIHRvCisgICMgdW5peCBmb3JtYXQuCisgIHBhdGg9IiRCT09UX0pESyIKKyAgbmV3X3BhdGg9YCRDWUdQQVRIIC11ICIkcGF0aCJgCisKKyAgIyBDeWd3aW4gdHJpZXMgdG8gaGlkZSBzb21lIGFzcGVjdHMgb2YgdGhlIFdpbmRvd3MgZmlsZSBzeXN0ZW0sIHN1Y2ggdGhhdCBiaW5hcmllcyBhcmUKKyAgIyBuYW1lZCAuZXhlIGJ1dCBjYWxsZWQgd2l0aG91dCB0aGF0IHN1ZmZpeC4gVGhlcmVmb3JlLCAiZm9vIiBhbmQgImZvby5leGUiIGFyZSBjb25zaWRlcmVkCisgICMgdGhlIHNhbWUgZmlsZSwgbW9zdCBvZiB0aGUgdGltZSAoYXMgaW4gInRlc3QgLWYiKS4gQnV0IG5vdCB3aGVuIHJ1bm5pbmcgY3lncGF0aCAtcywgdGhlbgorICAjICJmb28uZXhlIiBpcyBPSyBidXQgImZvbyIgaXMgYW4gZXJyb3IuCisgICMKKyAgIyBUaGlzIHRlc3QgaXMgdGhlcmVmb3JlIHNsaWdodGx5IG1vcmUgYWNjdXJhdGUgdGhhbiAidGVzdCAtZiIgdG8gY2hlY2sgZm9yIGZpbGUgcHJlY2Vuc2UuCisgICMgSXQgaXMgYWxzbyBhIHdheSB0byBtYWtlIHN1cmUgd2UgZ290IHRoZSBwcm9wZXIgZmlsZSBuYW1lIGZvciB0aGUgcmVhbCB0ZXN0IGxhdGVyIG9uLgorICB0ZXN0X3Nob3J0cGF0aD1gJENZR1BBVEggLXMgLW0gIiRuZXdfcGF0aCIgMj4gL2Rldi9udWxsYAorICBpZiB0ZXN0ICJ4JHRlc3Rfc2hvcnRwYXRoIiA9IHg7IHRoZW4KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSBwYXRoIG9mIEJPT1RfSkRLLCB3aGljaCByZXNvbHZlcyBhcyBcIiRwYXRoXCIsIGlzIGludmFsaWQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoZSBwYXRoIG9mIEJPT1RfSkRLLCB3aGljaCByZXNvbHZlcyBhcyBcIiRwYXRoXCIsIGlzIGludmFsaWQuIiA+JjY7fQorICAgIGFzX2ZuX2Vycm9yICQ/ICJDYW5ub3QgbG9jYXRlIHRoZSB0aGUgcGF0aCBvZiBCT09UX0pESyIgIiRMSU5FTk8iIDUKKyAgZmkKKworICAjIENhbGwgaGVscGVyIGZ1bmN0aW9uIHdoaWNoIHBvc3NpYmx5IGNvbnZlcnRzIHRoaXMgdXNpbmcgRE9TLXN0eWxlIHNob3J0IG1vZGUuCisgICMgSWYgc28sIHRoZSB1cGRhdGVkIHBhdGggaXMgc3RvcmVkIGluICRuZXdfcGF0aC4KKworICBpbnB1dF9wYXRoPSIkbmV3X3BhdGgiCisgICMgQ2hlY2sgaWYgd2UgbmVlZCB0byBjb252ZXJ0IHRoaXMgdXNpbmcgRE9TLXN0eWxlIHNob3J0IG1vZGUuIElmIHRoZSBwYXRoCisgICMgY29udGFpbnMganVzdCBzaW1wbGUgY2hhcmFjdGVycywgdXNlIGl0LiBPdGhlcndpc2UgKHNwYWNlcywgd2VpcmQgY2hhcmFjdGVycyksCisgICMgdGFrZSBubyBjaGFuY2VzIGFuZCByZXdyaXRlIGl0LgorICAjIE5vdGU6IG00IGVhdHMgb3VyIFtdLCBzbyB3ZSBuZWVkIHRvIHVzZSBbIGFuZCBdIGluc3RlYWQuCisgIGhhc19mb3JiaWRkZW5fY2hhcnM9YCRFQ0hPICIkaW5wdXRfcGF0aCIgfCAkR1JFUCBbXi0uXy9hLXpBLVowLTldYAorICBpZiB0ZXN0ICJ4JGhhc19mb3JiaWRkZW5fY2hhcnMiICE9IHg7IHRoZW4KKyAgICAjIE5vdyBjb252ZXJ0IGl0IHRvIG1peGVkIERPUy1zdHlsZSwgc2hvcnQgbW9kZSAobm8gc3BhY2VzLCBhbmQgLyBpbnN0ZWFkIG9mIFwpCisgICAgc2hvcnRtb2RlX3BhdGg9YCRDWUdQQVRIIC1zIC1tIC1hICIkaW5wdXRfcGF0aCJgCisgICAgcGF0aF9hZnRlcl9zaG9ydG1vZGU9YCRDWUdQQVRIIC11ICIkc2hvcnRtb2RlX3BhdGgiYAorICAgIGlmIHRlc3QgIngkcGF0aF9hZnRlcl9zaG9ydG1vZGUiICE9ICJ4JGlucHV0X3RvX3Nob3J0cGF0aCI7IHRoZW4KKyAgICAgICMgR29pbmcgdG8gc2hvcnQgbW9kZSBhbmQgYmFjayBhZ2FpbiBkaWQgaW5kZWVkIG1hdHRlci4gU2luY2Ugc2hvcnQgbW9kZSBpcworICAgICAgIyBjYXNlIGluc2Vuc2l0aXZlLCBsZXQncyBtYWtlIGl0IGxvd2VyY2FzZSB0byBpbXByb3ZlIHJlYWRhYmlsaXR5LgorICAgICAgc2hvcnRtb2RlX3BhdGg9YCRFQ0hPICIkc2hvcnRtb2RlX3BhdGgiIHwgJFRSICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J2AKKyAgICAgICMgTm93IGNvbnZlcnQgaXQgYmFjayB0byBVbml4LXN0aWxlIChjeWdwYXRoKQorICAgICAgaW5wdXRfcGF0aD1gJENZR1BBVEggLXUgIiRzaG9ydG1vZGVfcGF0aCJgCisgICAgICBuZXdfcGF0aD0iJGlucHV0X3BhdGgiCiAgICAgZmkKKyAgZmkKKworICB0ZXN0X2N5Z2RyaXZlX3ByZWZpeD1gJEVDSE8gJGlucHV0X3BhdGggfCAkR1JFUCBeL2N5Z2RyaXZlL2AKKyAgaWYgdGVzdCAieCR0ZXN0X2N5Z2RyaXZlX3ByZWZpeCIgPSB4OyB0aGVuCisgICAgIyBBcyBhIHNpbXBsZSBmaXgsIGV4Y2x1ZGUgL3Vzci9iaW4gc2luY2UgaXQncyBub3QgYSByZWFsIHBhdGguCisgICAgaWYgdGVzdCAieGAkRUNITyAkbmV3X3BhdGggfCAkR1JFUCBeL3Vzci9iaW4vYCIgPSB4OyB0aGVuCisgICAgICAjIFRoZSBwYXRoIGlzIGluIGEgQ3lnd2luIHNwZWNpYWwgZGlyZWN0b3J5IChlLmcuIC9ob21lKS4gV2UgbmVlZCB0aGlzIGNvbnZlcnRlZCB0bworICAgICAgIyBhIHBhdGggcHJlZml4ZWQgYnkgL2N5Z2RyaXZlIGZvciBmaXhwYXRoIHRvIHdvcmsuCisgICAgICBuZXdfcGF0aD0iJENZR1dJTl9ST09UX1BBVEgkaW5wdXRfcGF0aCIKKyAgICBmaQorICBmaQorCisKKyAgaWYgdGVzdCAieCRwYXRoIiAhPSAieCRuZXdfcGF0aCI7IHRoZW4KKyAgICBCT09UX0pESz0iJG5ld19wYXRoIgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogUmV3cml0aW5nIEJPT1RfSkRLIHRvIFwiJG5ld19wYXRoXCIiID4mNQorJGFzX2VjaG8gIiRhc19tZTogUmV3cml0aW5nIEJPT1RfSkRLIHRvIFwiJG5ld19wYXRoXCIiID4mNjt9CisgIGZpCisKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorCisgIHBhdGg9IiRCT09UX0pESyIKKyAgaGFzX2NvbG9uPWAkRUNITyAkcGF0aCB8ICRHUkVQIF4uOmAKKyAgbmV3X3BhdGg9IiRwYXRoIgorICBpZiB0ZXN0ICJ4JGhhc19jb2xvbiIgPSB4OyB0aGVuCisgICAgIyBOb3QgaW4gbWl4ZWQgb3IgV2luZG93cyBzdHlsZSwgc3RhcnQgYnkgdGhhdC4KKyAgICBuZXdfcGF0aD1gY21kIC8vYyBlY2hvICRwYXRoYAorICBmaQorCisKKyAgaW5wdXRfcGF0aD0iJG5ld19wYXRoIgorICAjIENoZWNrIGlmIHdlIG5lZWQgdG8gY29udmVydCB0aGlzIHVzaW5nIERPUy1zdHlsZSBzaG9ydCBtb2RlLiBJZiB0aGUgcGF0aAorICAjIGNvbnRhaW5zIGp1c3Qgc2ltcGxlIGNoYXJhY3RlcnMsIHVzZSBpdC4gT3RoZXJ3aXNlIChzcGFjZXMsIHdlaXJkIGNoYXJhY3RlcnMpLAorICAjIHRha2Ugbm8gY2hhbmNlcyBhbmQgcmV3cml0ZSBpdC4KKyAgIyBOb3RlOiBtNCBlYXRzIG91ciBbXSwgc28gd2UgbmVlZCB0byB1c2UgWyBhbmQgXSBpbnN0ZWFkLgorICBoYXNfZm9yYmlkZGVuX2NoYXJzPWAkRUNITyAiJGlucHV0X3BhdGgiIHwgJEdSRVAgW14tXy86YS16QS1aMC05XWAKKyAgaWYgdGVzdCAieCRoYXNfZm9yYmlkZGVuX2NoYXJzIiAhPSB4OyB0aGVuCisgICAgIyBOb3cgY29udmVydCBpdCB0byBtaXhlZCBET1Mtc3R5bGUsIHNob3J0IG1vZGUgKG5vIHNwYWNlcywgYW5kIC8gaW5zdGVhZCBvZiBcKQorICAgIG5ld19wYXRoPWBjbWQgL2MgImZvciAlQSBpbiAoXCIkaW5wdXRfcGF0aFwiKSBkbyBAZWNobyAlfnNBInwkVFIgXFxcXFxcXFwgLyB8ICRUUiAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidgCisgIGZpCisKKworICB3aW5kb3dzX3BhdGg9IiRuZXdfcGF0aCIKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJENZR1BBVEggLXUgIiR3aW5kb3dzX3BhdGgiYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBlbGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLm1zeXMiOyB0aGVuCisgICAgdW5peF9wYXRoPWAkRUNITyAiJHdpbmRvd3NfcGF0aCIgfCAkU0VEIC1lICdzLF5cXCguXFwpOiwvXFwxLGcnIC1lICdzLFxcXFwsLyxnJ2AKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZmkKKworICBpZiB0ZXN0ICJ4JHBhdGgiICE9ICJ4JG5ld19wYXRoIjsgdGhlbgorICAgIEJPT1RfSkRLPSIkbmV3X3BhdGgiCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBSZXdyaXRpbmcgQk9PVF9KREsgdG8gXCIkbmV3X3BhdGhcIiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBSZXdyaXRpbmcgQk9PVF9KREsgdG8gXCIkbmV3X3BhdGhcIiIgPiY2O30KKyAgZmkKKworICAjIFNhdmUgdGhlIGZpcnN0IDEwIGJ5dGVzIG9mIHRoaXMgcGF0aCB0byB0aGUgc3RvcmFnZSwgc28gZml4cGF0aCBjYW4gd29yay4KKyAgYWxsX2ZpeHBhdGhfcHJlZml4ZXM9KCIke2FsbF9maXhwYXRoX3ByZWZpeGVzW0BdfSIgIiR7bmV3X3BhdGg6MDoxMH0iKQorCisgIGVsc2UKKyAgICAjIFdlJ3JlIG9uIGEgcG9zaXggcGxhdGZvcm0uIEhvb3JheSEgOikKKyAgICBwYXRoPSIkQk9PVF9KREsiCisKKyAgICBpZiB0ZXN0ICEgLWYgIiRwYXRoIiAmJiB0ZXN0ICEgLWQgIiRwYXRoIjsgdGhlbgorICAgICAgYXNfZm5fZXJyb3IgJD8gIlRoZSBwYXRoIG9mIEJPT1RfSkRLLCB3aGljaCByZXNvbHZlcyBhcyBcIiRwYXRoXCIsIGlzIG5vdCBmb3VuZC4iICIkTElORU5PIiA1CisgICAgZmkKKworICAgIGhhc19zcGFjZT1gJEVDSE8gIiRwYXRoIiB8ICRHUkVQICIgImAKKyAgICBpZiB0ZXN0ICJ4JGhhc19zcGFjZSIgIT0geDsgdGhlbgorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUaGUgcGF0aCBvZiBCT09UX0pESywgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkcGF0aFwiLCBpcyBpbnZhbGlkLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUaGUgcGF0aCBvZiBCT09UX0pESywgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkcGF0aFwiLCBpcyBpbnZhbGlkLiIgPiY2O30KKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJTcGFjZXMgYXJlIG5vdCBhbGxvd2VkIGluIHRoaXMgcGF0aC4iICIkTElORU5PIiA1CisgICAgZmkKKyAgZmkKIAogICAgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBCb290IEpESyIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgQm9vdCBKREsuLi4gIiA+JjY7IH0KLSAgICAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRCT09UX0pESyAoJEJPT1RfSkRLX1ZFUlNJT04pIiA+JjUKLSRhc19lY2hvICIkQk9PVF9KREsgKCRCT09UX0pES19WRVJTSU9OKSIgPiY2OyB9CisgICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQk9PVF9KREsiID4mNQorJGFzX2VjaG8gIiRCT09UX0pESyIgPiY2OyB9CisgICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgQm9vdCBKREsgdmVyc2lvbiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBCb290IEpESyB2ZXJzaW9uLi4uICIgPiY2OyB9CisgICAgICAgICAgICAgIEJPT1RfSkRLX1ZFUlNJT049YCIkQk9PVF9KREsvYmluL2phdmEiIC12ZXJzaW9uIDI+JjEgfCAkVFIgJ1xuXHInICcgICdgCisgICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQk9PVF9KREtfVkVSU0lPTiIgPiY1CiskYXNfZWNobyAiJEJPT1RfSkRLX1ZFUlNJT04iID4mNjsgfQogICAgICAgICAgICAgZmkgIyBlbmQgY2hlY2sgamRrIHZlcnNpb24KICAgICAgICAgICBmaSAjIGVuZCBjaGVjayBydC5qYXIKICAgICAgICAgZmkgIyBlbmQgY2hlY2sgamF2YWMKQEAgLTk1MDQsMTkgKzEyOTUzLDIwOSBAQAogICAgICMgTm93IGV4ZWN1dGUgdGhlIHRlc3QKIAogICBpZiB0ZXN0ICJ4JFByb2dyYW1GaWxlcyIgIT0geDsgdGhlbgorICAgIFZJUlRVQUxfRElSPSIkUHJvZ3JhbUZpbGVzL0phdmEiCiAKLSAgQk9PVF9KREtfUFJFRklYPSJgJENZR1BBVEggLXUgIiRQcm9ncmFtRmlsZXMiYC9KYXZhIgorICB3aW5kb3dzX3BhdGg9IiRWSVJUVUFMX0RJUiIKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJENZR1BBVEggLXUgIiR3aW5kb3dzX3BhdGgiYAorICAgIFZJUlRVQUxfRElSPSIkdW5peF9wYXRoIgorICBlbGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLm1zeXMiOyB0aGVuCisgICAgdW5peF9wYXRoPWAkRUNITyAiJHdpbmRvd3NfcGF0aCIgfCAkU0VEIC1lICdzLF5cXCguXFwpOiwvXFwxLGcnIC1lICdzLFxcXFwsLyxnJ2AKKyAgICBWSVJUVUFMX0RJUj0iJHVuaXhfcGF0aCIKKyAgZmkKKworCisgIEJPT1RfSkRLX1BSRUZJWD0iJFZJUlRVQUxfRElSIgogICBCT09UX0pES19TVUZGSVg9IiIKLSAgQkVTVF9KREtfRk9VTkQ9YCRMUyAiJEJPT1RfSkRLX1BSRUZJWCIgMj4gL2Rldi9udWxsIHwgJEdSRVAgamRrIHwgJFNPUlQgLXIgfCAkSEVBRCAtbiAxIGAKLSAgaWYgdGVzdCAieCRCRVNUX0pES19GT1VORCIgIT0geDsgdGhlbgotICAgIEJPT1RfSkRLPSIke0JPT1RfSkRLX1BSRUZJWH0vJHtCRVNUX0pES19GT1VORH0ke0JPT1RfSkRLX1NVRkZJWH0iCi0gICAgaWYgdGVzdCAtZCAiJEJPT1RfSkRLIjsgdGhlbgotICAgICAgQk9PVF9KREtfRk9VTkQ9bWF5YmUKLSAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogRm91bmQgcG90ZW50aWFsIEJvb3QgSkRLIHVzaW5nIHdlbGwta25vd24gbG9jYXRpb25zIChpbiAkQk9PVF9KREtfUFJFRklYKSIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBGb3VuZCBwb3RlbnRpYWwgQm9vdCBKREsgdXNpbmcgd2VsbC1rbm93biBsb2NhdGlvbnMgKGluICRCT09UX0pES19QUkVGSVgpIiA+JjY7fQorICBBTExfSkRLU19GT1VORD1gJExTICIkQk9PVF9KREtfUFJFRklYIiAyPiAvZGV2L251bGwgfCAkU09SVCAtcmAKKyAgaWYgdGVzdCAieCRBTExfSkRLU19GT1VORCIgIT0geDsgdGhlbgorICAgIGZvciBKREtfVE9fVFJZIGluICRBTExfSkRLU19GT1VORCA7IGRvCisKKyAgaWYgdGVzdCAieCRCT09UX0pES19GT1VORCIgPSB4bm87IHRoZW4KKyAgICAjIE5vdyBleGVjdXRlIHRoZSB0ZXN0CisKKyAgICAgICAgQk9PVF9KREs9IiR7Qk9PVF9KREtfUFJFRklYfS8ke0pES19UT19UUll9JHtCT09UX0pES19TVUZGSVh9IgorICAgICAgICBpZiB0ZXN0IC1kICIkQk9PVF9KREsiOyB0aGVuCisgICAgICAgICAgQk9PVF9KREtfRk9VTkQ9bWF5YmUKKyAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IEZvdW5kIHBvdGVudGlhbCBCb290IEpESyB1c2luZyB3ZWxsLWtub3duIGxvY2F0aW9ucyAoaW4gJEJPT1RfSkRLX1BSRUZJWC8kSkRLX1RPX1RSWSkiID4mNQorJGFzX2VjaG8gIiRhc19tZTogRm91bmQgcG90ZW50aWFsIEJvb3QgSkRLIHVzaW5nIHdlbGwta25vd24gbG9jYXRpb25zIChpbiAkQk9PVF9KREtfUFJFRklYLyRKREtfVE9fVFJZKSIgPiY2O30KKyAgICAgICAgZmkKKworCisgICAgIyBJZiBwcmV2aW91cyBzdGVwIGNsYWltZWQgdG8gaGF2ZSBmb3VuZCBhIEpESywgY2hlY2sgaXQgdG8gc2VlIGlmIGl0IHNlZW1zIHRvIGJlIHZhbGlkLgorICAgIGlmIHRlc3QgIngkQk9PVF9KREtfRk9VTkQiID0geG1heWJlOyB0aGVuCisgICAgICAjIERvIHdlIGhhdmUgYSBiaW4vamF2YT8KKyAgICAgIGlmIHRlc3QgISAteCAiJEJPT1RfSkRLL2Jpbi9qYXZhIjsgdGhlbgorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFBvdGVudGlhbCBCb290IEpESyBmb3VuZCBhdCAkQk9PVF9KREsgZGlkIG5vdCBjb250YWluIGJpbi9qYXZhOyBpZ25vcmluZyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBQb3RlbnRpYWwgQm9vdCBKREsgZm91bmQgYXQgJEJPT1RfSkRLIGRpZCBub3QgY29udGFpbiBiaW4vamF2YTsgaWdub3JpbmciID4mNjt9CisgICAgICAgIEJPT1RfSkRLX0ZPVU5EPW5vCisgICAgICBlbHNlCisgICAgICAgICMgRG8gd2UgaGF2ZSBhIGJpbi9qYXZhYz8KKyAgICAgICAgaWYgdGVzdCAhIC14ICIkQk9PVF9KREsvYmluL2phdmFjIjsgdGhlbgorICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogUG90ZW50aWFsIEJvb3QgSkRLIGZvdW5kIGF0ICRCT09UX0pESyBkaWQgbm90IGNvbnRhaW4gYmluL2phdmFjOyBpZ25vcmluZyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBQb3RlbnRpYWwgQm9vdCBKREsgZm91bmQgYXQgJEJPT1RfSkRLIGRpZCBub3QgY29udGFpbiBiaW4vamF2YWM7IGlnbm9yaW5nIiA+JjY7fQorICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogKFRoaXMgbWlnaHQgYmUgYW4gSlJFIGluc3RlYWQgb2YgYW4gSkRLKSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiAoVGhpcyBtaWdodCBiZSBhbiBKUkUgaW5zdGVhZCBvZiBhbiBKREspIiA+JjY7fQorICAgICAgICAgIEJPT1RfSkRLX0ZPVU5EPW5vCisgICAgICAgIGVsc2UKKyAgICAgICAgICAjIERvIHdlIGhhdmUgYW4gcnQuamFyPyAoT24gTWFjT1NYIGl0IGlzIGNhbGxlZCBjbGFzc2VzLmphcikKKyAgICAgICAgICBpZiB0ZXN0ICEgLWYgIiRCT09UX0pESy9qcmUvbGliL3J0LmphciIgJiYgdGVzdCAhIC1mICIkQk9PVF9KREsvLi4vQ2xhc3Nlcy9jbGFzc2VzLmphciI7IHRoZW4KKyAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogUG90ZW50aWFsIEJvb3QgSkRLIGZvdW5kIGF0ICRCT09UX0pESyBkaWQgbm90IGNvbnRhaW4gYW4gcnQuamFyOyBpZ25vcmluZyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBQb3RlbnRpYWwgQm9vdCBKREsgZm91bmQgYXQgJEJPT1RfSkRLIGRpZCBub3QgY29udGFpbiBhbiBydC5qYXI7IGlnbm9yaW5nIiA+JjY7fQorICAgICAgICAgICAgQk9PVF9KREtfRk9VTkQ9bm8KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICAjIE9oLCB0aGlzIGlzIGxvb2tpbmcgZ29vZCEgV2UgcHJvYmFibHkgaGF2ZSBmb3VuZCBhIHByb3BlciBKREsuIElzIGl0IHRoZSBjb3JyZWN0IHZlcnNpb24/CisgICAgICAgICAgICBCT09UX0pES19WRVJTSU9OPWAiJEJPT1RfSkRLL2Jpbi9qYXZhIiAtdmVyc2lvbiAyPiYxIHwgaGVhZCAtbiAxYAorCisgICAgICAgICAgICAjIEV4dHJhIE00IHF1b3RlIG5lZWRlZCB0byBwcm90ZWN0IFtdIGluIGdyZXAgZXhwcmVzc2lvbi4KKyAgICAgICAgICAgIEZPVU5EX1ZFUlNJT05fNzg9YGVjaG8gJEJPT1RfSkRLX1ZFUlNJT04gfCBncmVwICAnXCIxXC5bNzhdXC4nYAorICAgICAgICAgICAgaWYgdGVzdCAieCRGT1VORF9WRVJTSU9OXzc4IiA9IHg7IHRoZW4KKyAgICAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBQb3RlbnRpYWwgQm9vdCBKREsgZm91bmQgYXQgJEJPT1RfSkRLIGlzIGluY29ycmVjdCBKREsgdmVyc2lvbiAoJEJPT1RfSkRLX1ZFUlNJT04pOyBpZ25vcmluZyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBQb3RlbnRpYWwgQm9vdCBKREsgZm91bmQgYXQgJEJPT1RfSkRLIGlzIGluY29ycmVjdCBKREsgdmVyc2lvbiAoJEJPT1RfSkRLX1ZFUlNJT04pOyBpZ25vcmluZyIgPiY2O30KKyAgICAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAoWW91ciBCb290IEpESyBtdXN0IGJlIHZlcnNpb24gNyBvciA4KSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiAoWW91ciBCb290IEpESyBtdXN0IGJlIHZlcnNpb24gNyBvciA4KSIgPiY2O30KKyAgICAgICAgICAgICAgQk9PVF9KREtfRk9VTkQ9bm8KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgIyBXZSdyZSBkb25lISA6LSkKKyAgICAgICAgICAgICAgQk9PVF9KREtfRk9VTkQ9eWVzCisKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorCisgICMgSW5wdXQgbWlnaHQgYmUgZ2l2ZW4gYXMgV2luZG93cyBmb3JtYXQsIHN0YXJ0IGJ5IGNvbnZlcnRpbmcgdG8KKyAgIyB1bml4IGZvcm1hdC4KKyAgcGF0aD0iJEJPT1RfSkRLIgorICBuZXdfcGF0aD1gJENZR1BBVEggLXUgIiRwYXRoImAKKworICAjIEN5Z3dpbiB0cmllcyB0byBoaWRlIHNvbWUgYXNwZWN0cyBvZiB0aGUgV2luZG93cyBmaWxlIHN5c3RlbSwgc3VjaCB0aGF0IGJpbmFyaWVzIGFyZQorICAjIG5hbWVkIC5leGUgYnV0IGNhbGxlZCB3aXRob3V0IHRoYXQgc3VmZml4LiBUaGVyZWZvcmUsICJmb28iIGFuZCAiZm9vLmV4ZSIgYXJlIGNvbnNpZGVyZWQKKyAgIyB0aGUgc2FtZSBmaWxlLCBtb3N0IG9mIHRoZSB0aW1lIChhcyBpbiAidGVzdCAtZiIpLiBCdXQgbm90IHdoZW4gcnVubmluZyBjeWdwYXRoIC1zLCB0aGVuCisgICMgImZvby5leGUiIGlzIE9LIGJ1dCAiZm9vIiBpcyBhbiBlcnJvci4KKyAgIworICAjIFRoaXMgdGVzdCBpcyB0aGVyZWZvcmUgc2xpZ2h0bHkgbW9yZSBhY2N1cmF0ZSB0aGFuICJ0ZXN0IC1mIiB0byBjaGVjayBmb3IgZmlsZSBwcmVjZW5zZS4KKyAgIyBJdCBpcyBhbHNvIGEgd2F5IHRvIG1ha2Ugc3VyZSB3ZSBnb3QgdGhlIHByb3BlciBmaWxlIG5hbWUgZm9yIHRoZSByZWFsIHRlc3QgbGF0ZXIgb24uCisgIHRlc3Rfc2hvcnRwYXRoPWAkQ1lHUEFUSCAtcyAtbSAiJG5ld19wYXRoIiAyPiAvZGV2L251bGxgCisgIGlmIHRlc3QgIngkdGVzdF9zaG9ydHBhdGgiID0geDsgdGhlbgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGhlIHBhdGggb2YgQk9PVF9KREssIHdoaWNoIHJlc29sdmVzIGFzIFwiJHBhdGhcIiwgaXMgaW52YWxpZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhlIHBhdGggb2YgQk9PVF9KREssIHdoaWNoIHJlc29sdmVzIGFzIFwiJHBhdGhcIiwgaXMgaW52YWxpZC4iID4mNjt9CisgICAgYXNfZm5fZXJyb3IgJD8gIkNhbm5vdCBsb2NhdGUgdGhlIHRoZSBwYXRoIG9mIEJPT1RfSkRLIiAiJExJTkVOTyIgNQorICBmaQorCisgICMgQ2FsbCBoZWxwZXIgZnVuY3Rpb24gd2hpY2ggcG9zc2libHkgY29udmVydHMgdGhpcyB1c2luZyBET1Mtc3R5bGUgc2hvcnQgbW9kZS4KKyAgIyBJZiBzbywgdGhlIHVwZGF0ZWQgcGF0aCBpcyBzdG9yZWQgaW4gJG5ld19wYXRoLgorCisgIGlucHV0X3BhdGg9IiRuZXdfcGF0aCIKKyAgIyBDaGVjayBpZiB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhpcyB1c2luZyBET1Mtc3R5bGUgc2hvcnQgbW9kZS4gSWYgdGhlIHBhdGgKKyAgIyBjb250YWlucyBqdXN0IHNpbXBsZSBjaGFyYWN0ZXJzLCB1c2UgaXQuIE90aGVyd2lzZSAoc3BhY2VzLCB3ZWlyZCBjaGFyYWN0ZXJzKSwKKyAgIyB0YWtlIG5vIGNoYW5jZXMgYW5kIHJld3JpdGUgaXQuCisgICMgTm90ZTogbTQgZWF0cyBvdXIgW10sIHNvIHdlIG5lZWQgdG8gdXNlIFsgYW5kIF0gaW5zdGVhZC4KKyAgaGFzX2ZvcmJpZGRlbl9jaGFycz1gJEVDSE8gIiRpbnB1dF9wYXRoIiB8ICRHUkVQIFteLS5fL2EtekEtWjAtOV1gCisgIGlmIHRlc3QgIngkaGFzX2ZvcmJpZGRlbl9jaGFycyIgIT0geDsgdGhlbgorICAgICMgTm93IGNvbnZlcnQgaXQgdG8gbWl4ZWQgRE9TLXN0eWxlLCBzaG9ydCBtb2RlIChubyBzcGFjZXMsIGFuZCAvIGluc3RlYWQgb2YgXCkKKyAgICBzaG9ydG1vZGVfcGF0aD1gJENZR1BBVEggLXMgLW0gLWEgIiRpbnB1dF9wYXRoImAKKyAgICBwYXRoX2FmdGVyX3Nob3J0bW9kZT1gJENZR1BBVEggLXUgIiRzaG9ydG1vZGVfcGF0aCJgCisgICAgaWYgdGVzdCAieCRwYXRoX2FmdGVyX3Nob3J0bW9kZSIgIT0gIngkaW5wdXRfdG9fc2hvcnRwYXRoIjsgdGhlbgorICAgICAgIyBHb2luZyB0byBzaG9ydCBtb2RlIGFuZCBiYWNrIGFnYWluIGRpZCBpbmRlZWQgbWF0dGVyLiBTaW5jZSBzaG9ydCBtb2RlIGlzCisgICAgICAjIGNhc2UgaW5zZW5zaXRpdmUsIGxldCdzIG1ha2UgaXQgbG93ZXJjYXNlIHRvIGltcHJvdmUgcmVhZGFiaWxpdHkuCisgICAgICBzaG9ydG1vZGVfcGF0aD1gJEVDSE8gIiRzaG9ydG1vZGVfcGF0aCIgfCAkVFIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAorICAgICAgIyBOb3cgY29udmVydCBpdCBiYWNrIHRvIFVuaXgtc3RpbGUgKGN5Z3BhdGgpCisgICAgICBpbnB1dF9wYXRoPWAkQ1lHUEFUSCAtdSAiJHNob3J0bW9kZV9wYXRoImAKKyAgICAgIG5ld19wYXRoPSIkaW5wdXRfcGF0aCIKICAgICBmaQogICBmaQogCisgIHRlc3RfY3lnZHJpdmVfcHJlZml4PWAkRUNITyAkaW5wdXRfcGF0aCB8ICRHUkVQIF4vY3lnZHJpdmUvYAorICBpZiB0ZXN0ICJ4JHRlc3RfY3lnZHJpdmVfcHJlZml4IiA9IHg7IHRoZW4KKyAgICAjIEFzIGEgc2ltcGxlIGZpeCwgZXhjbHVkZSAvdXNyL2JpbiBzaW5jZSBpdCdzIG5vdCBhIHJlYWwgcGF0aC4KKyAgICBpZiB0ZXN0ICJ4YCRFQ0hPICRuZXdfcGF0aCB8ICRHUkVQIF4vdXNyL2Jpbi9gIiA9IHg7IHRoZW4KKyAgICAgICMgVGhlIHBhdGggaXMgaW4gYSBDeWd3aW4gc3BlY2lhbCBkaXJlY3RvcnkgKGUuZy4gL2hvbWUpLiBXZSBuZWVkIHRoaXMgY29udmVydGVkIHRvCisgICAgICAjIGEgcGF0aCBwcmVmaXhlZCBieSAvY3lnZHJpdmUgZm9yIGZpeHBhdGggdG8gd29yay4KKyAgICAgIG5ld19wYXRoPSIkQ1lHV0lOX1JPT1RfUEFUSCRpbnB1dF9wYXRoIgorICAgIGZpCisgIGZpCisKKworICBpZiB0ZXN0ICJ4JHBhdGgiICE9ICJ4JG5ld19wYXRoIjsgdGhlbgorICAgIEJPT1RfSkRLPSIkbmV3X3BhdGgiCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBSZXdyaXRpbmcgQk9PVF9KREsgdG8gXCIkbmV3X3BhdGhcIiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBSZXdyaXRpbmcgQk9PVF9KREsgdG8gXCIkbmV3X3BhdGhcIiIgPiY2O30KKyAgZmkKKworICBlbGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLm1zeXMiOyB0aGVuCisKKyAgcGF0aD0iJEJPT1RfSkRLIgorICBoYXNfY29sb249YCRFQ0hPICRwYXRoIHwgJEdSRVAgXi46YAorICBuZXdfcGF0aD0iJHBhdGgiCisgIGlmIHRlc3QgIngkaGFzX2NvbG9uIiA9IHg7IHRoZW4KKyAgICAjIE5vdCBpbiBtaXhlZCBvciBXaW5kb3dzIHN0eWxlLCBzdGFydCBieSB0aGF0LgorICAgIG5ld19wYXRoPWBjbWQgLy9jIGVjaG8gJHBhdGhgCisgIGZpCisKKworICBpbnB1dF9wYXRoPSIkbmV3X3BhdGgiCisgICMgQ2hlY2sgaWYgd2UgbmVlZCB0byBjb252ZXJ0IHRoaXMgdXNpbmcgRE9TLXN0eWxlIHNob3J0IG1vZGUuIElmIHRoZSBwYXRoCisgICMgY29udGFpbnMganVzdCBzaW1wbGUgY2hhcmFjdGVycywgdXNlIGl0LiBPdGhlcndpc2UgKHNwYWNlcywgd2VpcmQgY2hhcmFjdGVycyksCisgICMgdGFrZSBubyBjaGFuY2VzIGFuZCByZXdyaXRlIGl0LgorICAjIE5vdGU6IG00IGVhdHMgb3VyIFtdLCBzbyB3ZSBuZWVkIHRvIHVzZSBbIGFuZCBdIGluc3RlYWQuCisgIGhhc19mb3JiaWRkZW5fY2hhcnM9YCRFQ0hPICIkaW5wdXRfcGF0aCIgfCAkR1JFUCBbXi1fLzphLXpBLVowLTldYAorICBpZiB0ZXN0ICJ4JGhhc19mb3JiaWRkZW5fY2hhcnMiICE9IHg7IHRoZW4KKyAgICAjIE5vdyBjb252ZXJ0IGl0IHRvIG1peGVkIERPUy1zdHlsZSwgc2hvcnQgbW9kZSAobm8gc3BhY2VzLCBhbmQgLyBpbnN0ZWFkIG9mIFwpCisgICAgbmV3X3BhdGg9YGNtZCAvYyAiZm9yICVBIGluIChcIiRpbnB1dF9wYXRoXCIpIGRvIEBlY2hvICV+c0EifCRUUiBcXFxcXFxcXCAvIHwgJFRSICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J2AKKyAgZmkKKworCisgIHdpbmRvd3NfcGF0aD0iJG5ld19wYXRoIgorICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5jeWd3aW4iOyB0aGVuCisgICAgdW5peF9wYXRoPWAkQ1lHUEFUSCAtdSAiJHdpbmRvd3NfcGF0aCJgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGVsaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MubXN5cyI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRFQ0hPICIkd2luZG93c19wYXRoIiB8ICRTRUQgLWUgJ3MsXlxcKC5cXCk6LC9cXDEsZycgLWUgJ3MsXFxcXCwvLGcnYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBmaQorCisgIGlmIHRlc3QgIngkcGF0aCIgIT0gIngkbmV3X3BhdGgiOyB0aGVuCisgICAgQk9PVF9KREs9IiRuZXdfcGF0aCIKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFJld3JpdGluZyBCT09UX0pESyB0byBcIiRuZXdfcGF0aFwiIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFJld3JpdGluZyBCT09UX0pESyB0byBcIiRuZXdfcGF0aFwiIiA+JjY7fQorICBmaQorCisgICMgU2F2ZSB0aGUgZmlyc3QgMTAgYnl0ZXMgb2YgdGhpcyBwYXRoIHRvIHRoZSBzdG9yYWdlLCBzbyBmaXhwYXRoIGNhbiB3b3JrLgorICBhbGxfZml4cGF0aF9wcmVmaXhlcz0oIiR7YWxsX2ZpeHBhdGhfcHJlZml4ZXNbQF19IiAiJHtuZXdfcGF0aDowOjEwfSIpCisKKyAgZWxzZQorICAgICMgV2UncmUgb24gYSBwb3NpeCBwbGF0Zm9ybS4gSG9vcmF5ISA6KQorICAgIHBhdGg9IiRCT09UX0pESyIKKworICAgIGlmIHRlc3QgISAtZiAiJHBhdGgiICYmIHRlc3QgISAtZCAiJHBhdGgiOyB0aGVuCisgICAgICBhc19mbl9lcnJvciAkPyAiVGhlIHBhdGggb2YgQk9PVF9KREssIHdoaWNoIHJlc29sdmVzIGFzIFwiJHBhdGhcIiwgaXMgbm90IGZvdW5kLiIgIiRMSU5FTk8iIDUKKyAgICBmaQorCisgICAgaGFzX3NwYWNlPWAkRUNITyAiJHBhdGgiIHwgJEdSRVAgIiAiYAorICAgIGlmIHRlc3QgIngkaGFzX3NwYWNlIiAhPSB4OyB0aGVuCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSBwYXRoIG9mIEJPT1RfSkRLLCB3aGljaCByZXNvbHZlcyBhcyBcIiRwYXRoXCIsIGlzIGludmFsaWQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoZSBwYXRoIG9mIEJPT1RfSkRLLCB3aGljaCByZXNvbHZlcyBhcyBcIiRwYXRoXCIsIGlzIGludmFsaWQuIiA+JjY7fQorICAgICAgYXNfZm5fZXJyb3IgJD8gIlNwYWNlcyBhcmUgbm90IGFsbG93ZWQgaW4gdGhpcyBwYXRoLiIgIiRMSU5FTk8iIDUKKyAgICBmaQorICBmaQorCisgICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIEJvb3QgSkRLIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBCb290IEpESy4uLiAiID4mNjsgfQorICAgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJEJPT1RfSkRLIiA+JjUKKyRhc19lY2hvICIkQk9PVF9KREsiID4mNjsgfQorICAgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIEJvb3QgSkRLIHZlcnNpb24iID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgQm9vdCBKREsgdmVyc2lvbi4uLiAiID4mNjsgfQorICAgICAgICAgICAgICBCT09UX0pES19WRVJTSU9OPWAiJEJPT1RfSkRLL2Jpbi9qYXZhIiAtdmVyc2lvbiAyPiYxIHwgJFRSICdcblxyJyAnICAnYAorICAgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJEJPT1RfSkRLX1ZFUlNJT04iID4mNQorJGFzX2VjaG8gIiRCT09UX0pES19WRVJTSU9OIiA+JjY7IH0KKyAgICAgICAgICAgIGZpICMgZW5kIGNoZWNrIGpkayB2ZXJzaW9uCisgICAgICAgICAgZmkgIyBlbmQgY2hlY2sgcnQuamFyCisgICAgICAgIGZpICMgZW5kIGNoZWNrIGphdmFjCisgICAgICBmaSAjIGVuZCBjaGVjayBqYXZhCisgICAgZmkgIyBlbmQgY2hlY2sgYm9vdCBqZGsgZm91bmQKKyAgZmkKKworICAgIGRvbmUKKyAgZmkKKwogICBmaQogCiAKQEAgLTk1NTcsMjYgKzEzMTk2LDEzMyBAQAogICAgICAgICAgICAgICAjIFdlJ3JlIGRvbmUhIDotKQogICAgICAgICAgICAgICBCT09UX0pES19GT1VORD15ZXMKIAotICAgICMgRmFpbCB3aXRoIG1lc3NhZ2UgdGhlIHBhdGggdG8gdGhlIEJvb3QgSkRLIGlmIHZhciBCT09UX0pESyBjb250YWlucyBhIHBhdGggd2l0aCBubyBzcGFjZXMgaW4gaXQuCi0gICAgIyBVbmxlc3Mgb24gV2luZG93cywgd2hlcmUgd2UgY2FuIHJld3JpdGUgdGhlIHBhdGguCi0gICAgSEFTX1NQQUNFPWBlY2hvICIkQk9PVF9KREsiIHwgZ3JlcCAiICJgCi0gICAgaWYgdGVzdCAieCRIQVNfU1BBQ0UiICE9IHg7IHRoZW4KLSAgICAgICAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TIiA9ICJ4d2luZG93cyI7IHRoZW4KLSAgICAgICAgICAgICMgRmlyc3QgY29udmVydCBpdCB0byBET1Mtc3R5bGUsIHNob3J0IG1vZGUgKG5vIHNwYWNlcykKLSAgICAgICAgICAgIEJPT1RfSkRLPWAkQ1lHUEFUSCAtcyAtbSAtYSAiJEJPT1RfSkRLImAKLSAgICAgICAgICAgICMgTm93IGl0J3MgY2FzZSBpbnNlbnNpdGl2ZTsgbGV0J3MgbWFrZSBpdCBsb3dlcmNhc2UgdG8gaW1wcm92ZSByZWFkYWJpbGl0eQotICAgICAgICAgICAgQk9PVF9KREs9YCRFQ0hPICIkQk9PVF9KREsiIHwgJFRSICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZxeHl6J2AKLSAgICAgICAgICAgICMgTm93IGNvbnZlcnQgaXQgYmFjayB0byBVbml4LXN0aWxlIChjeWdwYXRoKQotICAgICAgICAgICAgQk9PVF9KREs9YCRDWUdQQVRIIC11ICIkQk9PVF9KREsiYAotICAgICAgICBlbHNlCi0gICAgICAgICAgICBhc19mbl9lcnJvciAkPyAiWW91IGNhbm5vdCBoYXZlIHNwYWNlcyBpbiB0aGUgcGF0aCB0byB0aGUgQm9vdCBKREshIFwiJEJPT1RfSkRLXCIiICIkTElORU5PIiA1Ci0gICAgICAgIGZpCisgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLmN5Z3dpbiI7IHRoZW4KKworICAjIElucHV0IG1pZ2h0IGJlIGdpdmVuIGFzIFdpbmRvd3MgZm9ybWF0LCBzdGFydCBieSBjb252ZXJ0aW5nIHRvCisgICMgdW5peCBmb3JtYXQuCisgIHBhdGg9IiRCT09UX0pESyIKKyAgbmV3X3BhdGg9YCRDWUdQQVRIIC11ICIkcGF0aCJgCisKKyAgIyBDeWd3aW4gdHJpZXMgdG8gaGlkZSBzb21lIGFzcGVjdHMgb2YgdGhlIFdpbmRvd3MgZmlsZSBzeXN0ZW0sIHN1Y2ggdGhhdCBiaW5hcmllcyBhcmUKKyAgIyBuYW1lZCAuZXhlIGJ1dCBjYWxsZWQgd2l0aG91dCB0aGF0IHN1ZmZpeC4gVGhlcmVmb3JlLCAiZm9vIiBhbmQgImZvby5leGUiIGFyZSBjb25zaWRlcmVkCisgICMgdGhlIHNhbWUgZmlsZSwgbW9zdCBvZiB0aGUgdGltZSAoYXMgaW4gInRlc3QgLWYiKS4gQnV0IG5vdCB3aGVuIHJ1bm5pbmcgY3lncGF0aCAtcywgdGhlbgorICAjICJmb28uZXhlIiBpcyBPSyBidXQgImZvbyIgaXMgYW4gZXJyb3IuCisgICMKKyAgIyBUaGlzIHRlc3QgaXMgdGhlcmVmb3JlIHNsaWdodGx5IG1vcmUgYWNjdXJhdGUgdGhhbiAidGVzdCAtZiIgdG8gY2hlY2sgZm9yIGZpbGUgcHJlY2Vuc2UuCisgICMgSXQgaXMgYWxzbyBhIHdheSB0byBtYWtlIHN1cmUgd2UgZ290IHRoZSBwcm9wZXIgZmlsZSBuYW1lIGZvciB0aGUgcmVhbCB0ZXN0IGxhdGVyIG9uLgorICB0ZXN0X3Nob3J0cGF0aD1gJENZR1BBVEggLXMgLW0gIiRuZXdfcGF0aCIgMj4gL2Rldi9udWxsYAorICBpZiB0ZXN0ICJ4JHRlc3Rfc2hvcnRwYXRoIiA9IHg7IHRoZW4KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSBwYXRoIG9mIEJPT1RfSkRLLCB3aGljaCByZXNvbHZlcyBhcyBcIiRwYXRoXCIsIGlzIGludmFsaWQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoZSBwYXRoIG9mIEJPT1RfSkRLLCB3aGljaCByZXNvbHZlcyBhcyBcIiRwYXRoXCIsIGlzIGludmFsaWQuIiA+JjY7fQorICAgIGFzX2ZuX2Vycm9yICQ/ICJDYW5ub3QgbG9jYXRlIHRoZSB0aGUgcGF0aCBvZiBCT09UX0pESyIgIiRMSU5FTk8iIDUKKyAgZmkKKworICAjIENhbGwgaGVscGVyIGZ1bmN0aW9uIHdoaWNoIHBvc3NpYmx5IGNvbnZlcnRzIHRoaXMgdXNpbmcgRE9TLXN0eWxlIHNob3J0IG1vZGUuCisgICMgSWYgc28sIHRoZSB1cGRhdGVkIHBhdGggaXMgc3RvcmVkIGluICRuZXdfcGF0aC4KKworICBpbnB1dF9wYXRoPSIkbmV3X3BhdGgiCisgICMgQ2hlY2sgaWYgd2UgbmVlZCB0byBjb252ZXJ0IHRoaXMgdXNpbmcgRE9TLXN0eWxlIHNob3J0IG1vZGUuIElmIHRoZSBwYXRoCisgICMgY29udGFpbnMganVzdCBzaW1wbGUgY2hhcmFjdGVycywgdXNlIGl0LiBPdGhlcndpc2UgKHNwYWNlcywgd2VpcmQgY2hhcmFjdGVycyksCisgICMgdGFrZSBubyBjaGFuY2VzIGFuZCByZXdyaXRlIGl0LgorICAjIE5vdGU6IG00IGVhdHMgb3VyIFtdLCBzbyB3ZSBuZWVkIHRvIHVzZSBbIGFuZCBdIGluc3RlYWQuCisgIGhhc19mb3JiaWRkZW5fY2hhcnM9YCRFQ0hPICIkaW5wdXRfcGF0aCIgfCAkR1JFUCBbXi0uXy9hLXpBLVowLTldYAorICBpZiB0ZXN0ICJ4JGhhc19mb3JiaWRkZW5fY2hhcnMiICE9IHg7IHRoZW4KKyAgICAjIE5vdyBjb252ZXJ0IGl0IHRvIG1peGVkIERPUy1zdHlsZSwgc2hvcnQgbW9kZSAobm8gc3BhY2VzLCBhbmQgLyBpbnN0ZWFkIG9mIFwpCisgICAgc2hvcnRtb2RlX3BhdGg9YCRDWUdQQVRIIC1zIC1tIC1hICIkaW5wdXRfcGF0aCJgCisgICAgcGF0aF9hZnRlcl9zaG9ydG1vZGU9YCRDWUdQQVRIIC11ICIkc2hvcnRtb2RlX3BhdGgiYAorICAgIGlmIHRlc3QgIngkcGF0aF9hZnRlcl9zaG9ydG1vZGUiICE9ICJ4JGlucHV0X3RvX3Nob3J0cGF0aCI7IHRoZW4KKyAgICAgICMgR29pbmcgdG8gc2hvcnQgbW9kZSBhbmQgYmFjayBhZ2FpbiBkaWQgaW5kZWVkIG1hdHRlci4gU2luY2Ugc2hvcnQgbW9kZSBpcworICAgICAgIyBjYXNlIGluc2Vuc2l0aXZlLCBsZXQncyBtYWtlIGl0IGxvd2VyY2FzZSB0byBpbXByb3ZlIHJlYWRhYmlsaXR5LgorICAgICAgc2hvcnRtb2RlX3BhdGg9YCRFQ0hPICIkc2hvcnRtb2RlX3BhdGgiIHwgJFRSICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J2AKKyAgICAgICMgTm93IGNvbnZlcnQgaXQgYmFjayB0byBVbml4LXN0aWxlIChjeWdwYXRoKQorICAgICAgaW5wdXRfcGF0aD1gJENZR1BBVEggLXUgIiRzaG9ydG1vZGVfcGF0aCJgCisgICAgICBuZXdfcGF0aD0iJGlucHV0X3BhdGgiCiAgICAgZmkKKyAgZmkKKworICB0ZXN0X2N5Z2RyaXZlX3ByZWZpeD1gJEVDSE8gJGlucHV0X3BhdGggfCAkR1JFUCBeL2N5Z2RyaXZlL2AKKyAgaWYgdGVzdCAieCR0ZXN0X2N5Z2RyaXZlX3ByZWZpeCIgPSB4OyB0aGVuCisgICAgIyBBcyBhIHNpbXBsZSBmaXgsIGV4Y2x1ZGUgL3Vzci9iaW4gc2luY2UgaXQncyBub3QgYSByZWFsIHBhdGguCisgICAgaWYgdGVzdCAieGAkRUNITyAkbmV3X3BhdGggfCAkR1JFUCBeL3Vzci9iaW4vYCIgPSB4OyB0aGVuCisgICAgICAjIFRoZSBwYXRoIGlzIGluIGEgQ3lnd2luIHNwZWNpYWwgZGlyZWN0b3J5IChlLmcuIC9ob21lKS4gV2UgbmVlZCB0aGlzIGNvbnZlcnRlZCB0bworICAgICAgIyBhIHBhdGggcHJlZml4ZWQgYnkgL2N5Z2RyaXZlIGZvciBmaXhwYXRoIHRvIHdvcmsuCisgICAgICBuZXdfcGF0aD0iJENZR1dJTl9ST09UX1BBVEgkaW5wdXRfcGF0aCIKKyAgICBmaQorICBmaQorCisKKyAgaWYgdGVzdCAieCRwYXRoIiAhPSAieCRuZXdfcGF0aCI7IHRoZW4KKyAgICBCT09UX0pESz0iJG5ld19wYXRoIgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogUmV3cml0aW5nIEJPT1RfSkRLIHRvIFwiJG5ld19wYXRoXCIiID4mNQorJGFzX2VjaG8gIiRhc19tZTogUmV3cml0aW5nIEJPT1RfSkRLIHRvIFwiJG5ld19wYXRoXCIiID4mNjt9CisgIGZpCisKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorCisgIHBhdGg9IiRCT09UX0pESyIKKyAgaGFzX2NvbG9uPWAkRUNITyAkcGF0aCB8ICRHUkVQIF4uOmAKKyAgbmV3X3BhdGg9IiRwYXRoIgorICBpZiB0ZXN0ICJ4JGhhc19jb2xvbiIgPSB4OyB0aGVuCisgICAgIyBOb3QgaW4gbWl4ZWQgb3IgV2luZG93cyBzdHlsZSwgc3RhcnQgYnkgdGhhdC4KKyAgICBuZXdfcGF0aD1gY21kIC8vYyBlY2hvICRwYXRoYAorICBmaQorCisKKyAgaW5wdXRfcGF0aD0iJG5ld19wYXRoIgorICAjIENoZWNrIGlmIHdlIG5lZWQgdG8gY29udmVydCB0aGlzIHVzaW5nIERPUy1zdHlsZSBzaG9ydCBtb2RlLiBJZiB0aGUgcGF0aAorICAjIGNvbnRhaW5zIGp1c3Qgc2ltcGxlIGNoYXJhY3RlcnMsIHVzZSBpdC4gT3RoZXJ3aXNlIChzcGFjZXMsIHdlaXJkIGNoYXJhY3RlcnMpLAorICAjIHRha2Ugbm8gY2hhbmNlcyBhbmQgcmV3cml0ZSBpdC4KKyAgIyBOb3RlOiBtNCBlYXRzIG91ciBbXSwgc28gd2UgbmVlZCB0byB1c2UgWyBhbmQgXSBpbnN0ZWFkLgorICBoYXNfZm9yYmlkZGVuX2NoYXJzPWAkRUNITyAiJGlucHV0X3BhdGgiIHwgJEdSRVAgW14tXy86YS16QS1aMC05XWAKKyAgaWYgdGVzdCAieCRoYXNfZm9yYmlkZGVuX2NoYXJzIiAhPSB4OyB0aGVuCisgICAgIyBOb3cgY29udmVydCBpdCB0byBtaXhlZCBET1Mtc3R5bGUsIHNob3J0IG1vZGUgKG5vIHNwYWNlcywgYW5kIC8gaW5zdGVhZCBvZiBcKQorICAgIG5ld19wYXRoPWBjbWQgL2MgImZvciAlQSBpbiAoXCIkaW5wdXRfcGF0aFwiKSBkbyBAZWNobyAlfnNBInwkVFIgXFxcXFxcXFwgLyB8ICRUUiAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidgCisgIGZpCisKKworICB3aW5kb3dzX3BhdGg9IiRuZXdfcGF0aCIKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJENZR1BBVEggLXUgIiR3aW5kb3dzX3BhdGgiYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBlbGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLm1zeXMiOyB0aGVuCisgICAgdW5peF9wYXRoPWAkRUNITyAiJHdpbmRvd3NfcGF0aCIgfCAkU0VEIC1lICdzLF5cXCguXFwpOiwvXFwxLGcnIC1lICdzLFxcXFwsLyxnJ2AKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZmkKKworICBpZiB0ZXN0ICJ4JHBhdGgiICE9ICJ4JG5ld19wYXRoIjsgdGhlbgorICAgIEJPT1RfSkRLPSIkbmV3X3BhdGgiCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBSZXdyaXRpbmcgQk9PVF9KREsgdG8gXCIkbmV3X3BhdGhcIiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBSZXdyaXRpbmcgQk9PVF9KREsgdG8gXCIkbmV3X3BhdGhcIiIgPiY2O30KKyAgZmkKKworICAjIFNhdmUgdGhlIGZpcnN0IDEwIGJ5dGVzIG9mIHRoaXMgcGF0aCB0byB0aGUgc3RvcmFnZSwgc28gZml4cGF0aCBjYW4gd29yay4KKyAgYWxsX2ZpeHBhdGhfcHJlZml4ZXM9KCIke2FsbF9maXhwYXRoX3ByZWZpeGVzW0BdfSIgIiR7bmV3X3BhdGg6MDoxMH0iKQorCisgIGVsc2UKKyAgICAjIFdlJ3JlIG9uIGEgcG9zaXggcGxhdGZvcm0uIEhvb3JheSEgOikKKyAgICBwYXRoPSIkQk9PVF9KREsiCisKKyAgICBpZiB0ZXN0ICEgLWYgIiRwYXRoIiAmJiB0ZXN0ICEgLWQgIiRwYXRoIjsgdGhlbgorICAgICAgYXNfZm5fZXJyb3IgJD8gIlRoZSBwYXRoIG9mIEJPT1RfSkRLLCB3aGljaCByZXNvbHZlcyBhcyBcIiRwYXRoXCIsIGlzIG5vdCBmb3VuZC4iICIkTElORU5PIiA1CisgICAgZmkKKworICAgIGhhc19zcGFjZT1gJEVDSE8gIiRwYXRoIiB8ICRHUkVQICIgImAKKyAgICBpZiB0ZXN0ICJ4JGhhc19zcGFjZSIgIT0geDsgdGhlbgorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUaGUgcGF0aCBvZiBCT09UX0pESywgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkcGF0aFwiLCBpcyBpbnZhbGlkLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUaGUgcGF0aCBvZiBCT09UX0pESywgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkcGF0aFwiLCBpcyBpbnZhbGlkLiIgPiY2O30KKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJTcGFjZXMgYXJlIG5vdCBhbGxvd2VkIGluIHRoaXMgcGF0aC4iICIkTElORU5PIiA1CisgICAgZmkKKyAgZmkKIAogICAgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBCb290IEpESyIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgQm9vdCBKREsuLi4gIiA+JjY7IH0KLSAgICAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRCT09UX0pESyAoJEJPT1RfSkRLX1ZFUlNJT04pIiA+JjUKLSRhc19lY2hvICIkQk9PVF9KREsgKCRCT09UX0pES19WRVJTSU9OKSIgPiY2OyB9CisgICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQk9PVF9KREsiID4mNQorJGFzX2VjaG8gIiRCT09UX0pESyIgPiY2OyB9CisgICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgQm9vdCBKREsgdmVyc2lvbiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBCb290IEpESyB2ZXJzaW9uLi4uICIgPiY2OyB9CisgICAgICAgICAgICAgIEJPT1RfSkRLX1ZFUlNJT049YCIkQk9PVF9KREsvYmluL2phdmEiIC12ZXJzaW9uIDI+JjEgfCAkVFIgJ1xuXHInICcgICdgCisgICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQk9PVF9KREtfVkVSU0lPTiIgPiY1CiskYXNfZWNobyAiJEJPT1RfSkRLX1ZFUlNJT04iID4mNjsgfQogICAgICAgICAgICAgZmkgIyBlbmQgY2hlY2sgamRrIHZlcnNpb24KICAgICAgICAgICBmaSAjIGVuZCBjaGVjayBydC5qYXIKICAgICAgICAgZmkgIyBlbmQgY2hlY2sgamF2YWMKQEAgLTk1OTAsMTYgKzEzMzM2LDE5NSBAQAogCiAgIEJPT1RfSkRLX1BSRUZJWD0iL2N5Z2RyaXZlL2MvUHJvZ3JhbSBGaWxlcy9KYXZhIgogICBCT09UX0pES19TVUZGSVg9IiIKLSAgQkVTVF9KREtfRk9VTkQ9YCRMUyAiJEJPT1RfSkRLX1BSRUZJWCIgMj4gL2Rldi9udWxsIHwgJEdSRVAgamRrIHwgJFNPUlQgLXIgfCAkSEVBRCAtbiAxIGAKLSAgaWYgdGVzdCAieCRCRVNUX0pES19GT1VORCIgIT0geDsgdGhlbgotICAgIEJPT1RfSkRLPSIke0JPT1RfSkRLX1BSRUZJWH0vJHtCRVNUX0pES19GT1VORH0ke0JPT1RfSkRLX1NVRkZJWH0iCi0gICAgaWYgdGVzdCAtZCAiJEJPT1RfSkRLIjsgdGhlbgotICAgICAgQk9PVF9KREtfRk9VTkQ9bWF5YmUKLSAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogRm91bmQgcG90ZW50aWFsIEJvb3QgSkRLIHVzaW5nIHdlbGwta25vd24gbG9jYXRpb25zIChpbiAkQk9PVF9KREtfUFJFRklYKSIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBGb3VuZCBwb3RlbnRpYWwgQm9vdCBKREsgdXNpbmcgd2VsbC1rbm93biBsb2NhdGlvbnMgKGluICRCT09UX0pES19QUkVGSVgpIiA+JjY7fQorICBBTExfSkRLU19GT1VORD1gJExTICIkQk9PVF9KREtfUFJFRklYIiAyPiAvZGV2L251bGwgfCAkU09SVCAtcmAKKyAgaWYgdGVzdCAieCRBTExfSkRLU19GT1VORCIgIT0geDsgdGhlbgorICAgIGZvciBKREtfVE9fVFJZIGluICRBTExfSkRLU19GT1VORCA7IGRvCisKKyAgaWYgdGVzdCAieCRCT09UX0pES19GT1VORCIgPSB4bm87IHRoZW4KKyAgICAjIE5vdyBleGVjdXRlIHRoZSB0ZXN0CisKKyAgICAgICAgQk9PVF9KREs9IiR7Qk9PVF9KREtfUFJFRklYfS8ke0pES19UT19UUll9JHtCT09UX0pES19TVUZGSVh9IgorICAgICAgICBpZiB0ZXN0IC1kICIkQk9PVF9KREsiOyB0aGVuCisgICAgICAgICAgQk9PVF9KREtfRk9VTkQ9bWF5YmUKKyAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IEZvdW5kIHBvdGVudGlhbCBCb290IEpESyB1c2luZyB3ZWxsLWtub3duIGxvY2F0aW9ucyAoaW4gJEJPT1RfSkRLX1BSRUZJWC8kSkRLX1RPX1RSWSkiID4mNQorJGFzX2VjaG8gIiRhc19tZTogRm91bmQgcG90ZW50aWFsIEJvb3QgSkRLIHVzaW5nIHdlbGwta25vd24gbG9jYXRpb25zIChpbiAkQk9PVF9KREtfUFJFRklYLyRKREtfVE9fVFJZKSIgPiY2O30KKyAgICAgICAgZmkKKworCisgICAgIyBJZiBwcmV2aW91cyBzdGVwIGNsYWltZWQgdG8gaGF2ZSBmb3VuZCBhIEpESywgY2hlY2sgaXQgdG8gc2VlIGlmIGl0IHNlZW1zIHRvIGJlIHZhbGlkLgorICAgIGlmIHRlc3QgIngkQk9PVF9KREtfRk9VTkQiID0geG1heWJlOyB0aGVuCisgICAgICAjIERvIHdlIGhhdmUgYSBiaW4vamF2YT8KKyAgICAgIGlmIHRlc3QgISAteCAiJEJPT1RfSkRLL2Jpbi9qYXZhIjsgdGhlbgorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFBvdGVudGlhbCBCb290IEpESyBmb3VuZCBhdCAkQk9PVF9KREsgZGlkIG5vdCBjb250YWluIGJpbi9qYXZhOyBpZ25vcmluZyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBQb3RlbnRpYWwgQm9vdCBKREsgZm91bmQgYXQgJEJPT1RfSkRLIGRpZCBub3QgY29udGFpbiBiaW4vamF2YTsgaWdub3JpbmciID4mNjt9CisgICAgICAgIEJPT1RfSkRLX0ZPVU5EPW5vCisgICAgICBlbHNlCisgICAgICAgICMgRG8gd2UgaGF2ZSBhIGJpbi9qYXZhYz8KKyAgICAgICAgaWYgdGVzdCAhIC14ICIkQk9PVF9KREsvYmluL2phdmFjIjsgdGhlbgorICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogUG90ZW50aWFsIEJvb3QgSkRLIGZvdW5kIGF0ICRCT09UX0pESyBkaWQgbm90IGNvbnRhaW4gYmluL2phdmFjOyBpZ25vcmluZyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBQb3RlbnRpYWwgQm9vdCBKREsgZm91bmQgYXQgJEJPT1RfSkRLIGRpZCBub3QgY29udGFpbiBiaW4vamF2YWM7IGlnbm9yaW5nIiA+JjY7fQorICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogKFRoaXMgbWlnaHQgYmUgYW4gSlJFIGluc3RlYWQgb2YgYW4gSkRLKSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiAoVGhpcyBtaWdodCBiZSBhbiBKUkUgaW5zdGVhZCBvZiBhbiBKREspIiA+JjY7fQorICAgICAgICAgIEJPT1RfSkRLX0ZPVU5EPW5vCisgICAgICAgIGVsc2UKKyAgICAgICAgICAjIERvIHdlIGhhdmUgYW4gcnQuamFyPyAoT24gTWFjT1NYIGl0IGlzIGNhbGxlZCBjbGFzc2VzLmphcikKKyAgICAgICAgICBpZiB0ZXN0ICEgLWYgIiRCT09UX0pESy9qcmUvbGliL3J0LmphciIgJiYgdGVzdCAhIC1mICIkQk9PVF9KREsvLi4vQ2xhc3Nlcy9jbGFzc2VzLmphciI7IHRoZW4KKyAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogUG90ZW50aWFsIEJvb3QgSkRLIGZvdW5kIGF0ICRCT09UX0pESyBkaWQgbm90IGNvbnRhaW4gYW4gcnQuamFyOyBpZ25vcmluZyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBQb3RlbnRpYWwgQm9vdCBKREsgZm91bmQgYXQgJEJPT1RfSkRLIGRpZCBub3QgY29udGFpbiBhbiBydC5qYXI7IGlnbm9yaW5nIiA+JjY7fQorICAgICAgICAgICAgQk9PVF9KREtfRk9VTkQ9bm8KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICAjIE9oLCB0aGlzIGlzIGxvb2tpbmcgZ29vZCEgV2UgcHJvYmFibHkgaGF2ZSBmb3VuZCBhIHByb3BlciBKREsuIElzIGl0IHRoZSBjb3JyZWN0IHZlcnNpb24/CisgICAgICAgICAgICBCT09UX0pES19WRVJTSU9OPWAiJEJPT1RfSkRLL2Jpbi9qYXZhIiAtdmVyc2lvbiAyPiYxIHwgaGVhZCAtbiAxYAorCisgICAgICAgICAgICAjIEV4dHJhIE00IHF1b3RlIG5lZWRlZCB0byBwcm90ZWN0IFtdIGluIGdyZXAgZXhwcmVzc2lvbi4KKyAgICAgICAgICAgIEZPVU5EX1ZFUlNJT05fNzg9YGVjaG8gJEJPT1RfSkRLX1ZFUlNJT04gfCBncmVwICAnXCIxXC5bNzhdXC4nYAorICAgICAgICAgICAgaWYgdGVzdCAieCRGT1VORF9WRVJTSU9OXzc4IiA9IHg7IHRoZW4KKyAgICAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBQb3RlbnRpYWwgQm9vdCBKREsgZm91bmQgYXQgJEJPT1RfSkRLIGlzIGluY29ycmVjdCBKREsgdmVyc2lvbiAoJEJPT1RfSkRLX1ZFUlNJT04pOyBpZ25vcmluZyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBQb3RlbnRpYWwgQm9vdCBKREsgZm91bmQgYXQgJEJPT1RfSkRLIGlzIGluY29ycmVjdCBKREsgdmVyc2lvbiAoJEJPT1RfSkRLX1ZFUlNJT04pOyBpZ25vcmluZyIgPiY2O30KKyAgICAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAoWW91ciBCb290IEpESyBtdXN0IGJlIHZlcnNpb24gNyBvciA4KSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiAoWW91ciBCb290IEpESyBtdXN0IGJlIHZlcnNpb24gNyBvciA4KSIgPiY2O30KKyAgICAgICAgICAgICAgQk9PVF9KREtfRk9VTkQ9bm8KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgIyBXZSdyZSBkb25lISA6LSkKKyAgICAgICAgICAgICAgQk9PVF9KREtfRk9VTkQ9eWVzCisKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorCisgICMgSW5wdXQgbWlnaHQgYmUgZ2l2ZW4gYXMgV2luZG93cyBmb3JtYXQsIHN0YXJ0IGJ5IGNvbnZlcnRpbmcgdG8KKyAgIyB1bml4IGZvcm1hdC4KKyAgcGF0aD0iJEJPT1RfSkRLIgorICBuZXdfcGF0aD1gJENZR1BBVEggLXUgIiRwYXRoImAKKworICAjIEN5Z3dpbiB0cmllcyB0byBoaWRlIHNvbWUgYXNwZWN0cyBvZiB0aGUgV2luZG93cyBmaWxlIHN5c3RlbSwgc3VjaCB0aGF0IGJpbmFyaWVzIGFyZQorICAjIG5hbWVkIC5leGUgYnV0IGNhbGxlZCB3aXRob3V0IHRoYXQgc3VmZml4LiBUaGVyZWZvcmUsICJmb28iIGFuZCAiZm9vLmV4ZSIgYXJlIGNvbnNpZGVyZWQKKyAgIyB0aGUgc2FtZSBmaWxlLCBtb3N0IG9mIHRoZSB0aW1lIChhcyBpbiAidGVzdCAtZiIpLiBCdXQgbm90IHdoZW4gcnVubmluZyBjeWdwYXRoIC1zLCB0aGVuCisgICMgImZvby5leGUiIGlzIE9LIGJ1dCAiZm9vIiBpcyBhbiBlcnJvci4KKyAgIworICAjIFRoaXMgdGVzdCBpcyB0aGVyZWZvcmUgc2xpZ2h0bHkgbW9yZSBhY2N1cmF0ZSB0aGFuICJ0ZXN0IC1mIiB0byBjaGVjayBmb3IgZmlsZSBwcmVjZW5zZS4KKyAgIyBJdCBpcyBhbHNvIGEgd2F5IHRvIG1ha2Ugc3VyZSB3ZSBnb3QgdGhlIHByb3BlciBmaWxlIG5hbWUgZm9yIHRoZSByZWFsIHRlc3QgbGF0ZXIgb24uCisgIHRlc3Rfc2hvcnRwYXRoPWAkQ1lHUEFUSCAtcyAtbSAiJG5ld19wYXRoIiAyPiAvZGV2L251bGxgCisgIGlmIHRlc3QgIngkdGVzdF9zaG9ydHBhdGgiID0geDsgdGhlbgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGhlIHBhdGggb2YgQk9PVF9KREssIHdoaWNoIHJlc29sdmVzIGFzIFwiJHBhdGhcIiwgaXMgaW52YWxpZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhlIHBhdGggb2YgQk9PVF9KREssIHdoaWNoIHJlc29sdmVzIGFzIFwiJHBhdGhcIiwgaXMgaW52YWxpZC4iID4mNjt9CisgICAgYXNfZm5fZXJyb3IgJD8gIkNhbm5vdCBsb2NhdGUgdGhlIHRoZSBwYXRoIG9mIEJPT1RfSkRLIiAiJExJTkVOTyIgNQorICBmaQorCisgICMgQ2FsbCBoZWxwZXIgZnVuY3Rpb24gd2hpY2ggcG9zc2libHkgY29udmVydHMgdGhpcyB1c2luZyBET1Mtc3R5bGUgc2hvcnQgbW9kZS4KKyAgIyBJZiBzbywgdGhlIHVwZGF0ZWQgcGF0aCBpcyBzdG9yZWQgaW4gJG5ld19wYXRoLgorCisgIGlucHV0X3BhdGg9IiRuZXdfcGF0aCIKKyAgIyBDaGVjayBpZiB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhpcyB1c2luZyBET1Mtc3R5bGUgc2hvcnQgbW9kZS4gSWYgdGhlIHBhdGgKKyAgIyBjb250YWlucyBqdXN0IHNpbXBsZSBjaGFyYWN0ZXJzLCB1c2UgaXQuIE90aGVyd2lzZSAoc3BhY2VzLCB3ZWlyZCBjaGFyYWN0ZXJzKSwKKyAgIyB0YWtlIG5vIGNoYW5jZXMgYW5kIHJld3JpdGUgaXQuCisgICMgTm90ZTogbTQgZWF0cyBvdXIgW10sIHNvIHdlIG5lZWQgdG8gdXNlIFsgYW5kIF0gaW5zdGVhZC4KKyAgaGFzX2ZvcmJpZGRlbl9jaGFycz1gJEVDSE8gIiRpbnB1dF9wYXRoIiB8ICRHUkVQIFteLS5fL2EtekEtWjAtOV1gCisgIGlmIHRlc3QgIngkaGFzX2ZvcmJpZGRlbl9jaGFycyIgIT0geDsgdGhlbgorICAgICMgTm93IGNvbnZlcnQgaXQgdG8gbWl4ZWQgRE9TLXN0eWxlLCBzaG9ydCBtb2RlIChubyBzcGFjZXMsIGFuZCAvIGluc3RlYWQgb2YgXCkKKyAgICBzaG9ydG1vZGVfcGF0aD1gJENZR1BBVEggLXMgLW0gLWEgIiRpbnB1dF9wYXRoImAKKyAgICBwYXRoX2FmdGVyX3Nob3J0bW9kZT1gJENZR1BBVEggLXUgIiRzaG9ydG1vZGVfcGF0aCJgCisgICAgaWYgdGVzdCAieCRwYXRoX2FmdGVyX3Nob3J0bW9kZSIgIT0gIngkaW5wdXRfdG9fc2hvcnRwYXRoIjsgdGhlbgorICAgICAgIyBHb2luZyB0byBzaG9ydCBtb2RlIGFuZCBiYWNrIGFnYWluIGRpZCBpbmRlZWQgbWF0dGVyLiBTaW5jZSBzaG9ydCBtb2RlIGlzCisgICAgICAjIGNhc2UgaW5zZW5zaXRpdmUsIGxldCdzIG1ha2UgaXQgbG93ZXJjYXNlIHRvIGltcHJvdmUgcmVhZGFiaWxpdHkuCisgICAgICBzaG9ydG1vZGVfcGF0aD1gJEVDSE8gIiRzaG9ydG1vZGVfcGF0aCIgfCAkVFIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAorICAgICAgIyBOb3cgY29udmVydCBpdCBiYWNrIHRvIFVuaXgtc3RpbGUgKGN5Z3BhdGgpCisgICAgICBpbnB1dF9wYXRoPWAkQ1lHUEFUSCAtdSAiJHNob3J0bW9kZV9wYXRoImAKKyAgICAgIG5ld19wYXRoPSIkaW5wdXRfcGF0aCIKICAgICBmaQogICBmaQogCisgIHRlc3RfY3lnZHJpdmVfcHJlZml4PWAkRUNITyAkaW5wdXRfcGF0aCB8ICRHUkVQIF4vY3lnZHJpdmUvYAorICBpZiB0ZXN0ICJ4JHRlc3RfY3lnZHJpdmVfcHJlZml4IiA9IHg7IHRoZW4KKyAgICAjIEFzIGEgc2ltcGxlIGZpeCwgZXhjbHVkZSAvdXNyL2JpbiBzaW5jZSBpdCdzIG5vdCBhIHJlYWwgcGF0aC4KKyAgICBpZiB0ZXN0ICJ4YCRFQ0hPICRuZXdfcGF0aCB8ICRHUkVQIF4vdXNyL2Jpbi9gIiA9IHg7IHRoZW4KKyAgICAgICMgVGhlIHBhdGggaXMgaW4gYSBDeWd3aW4gc3BlY2lhbCBkaXJlY3RvcnkgKGUuZy4gL2hvbWUpLiBXZSBuZWVkIHRoaXMgY29udmVydGVkIHRvCisgICAgICAjIGEgcGF0aCBwcmVmaXhlZCBieSAvY3lnZHJpdmUgZm9yIGZpeHBhdGggdG8gd29yay4KKyAgICAgIG5ld19wYXRoPSIkQ1lHV0lOX1JPT1RfUEFUSCRpbnB1dF9wYXRoIgorICAgIGZpCisgIGZpCisKKworICBpZiB0ZXN0ICJ4JHBhdGgiICE9ICJ4JG5ld19wYXRoIjsgdGhlbgorICAgIEJPT1RfSkRLPSIkbmV3X3BhdGgiCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBSZXdyaXRpbmcgQk9PVF9KREsgdG8gXCIkbmV3X3BhdGhcIiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBSZXdyaXRpbmcgQk9PVF9KREsgdG8gXCIkbmV3X3BhdGhcIiIgPiY2O30KKyAgZmkKKworICBlbGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLm1zeXMiOyB0aGVuCisKKyAgcGF0aD0iJEJPT1RfSkRLIgorICBoYXNfY29sb249YCRFQ0hPICRwYXRoIHwgJEdSRVAgXi46YAorICBuZXdfcGF0aD0iJHBhdGgiCisgIGlmIHRlc3QgIngkaGFzX2NvbG9uIiA9IHg7IHRoZW4KKyAgICAjIE5vdCBpbiBtaXhlZCBvciBXaW5kb3dzIHN0eWxlLCBzdGFydCBieSB0aGF0LgorICAgIG5ld19wYXRoPWBjbWQgLy9jIGVjaG8gJHBhdGhgCisgIGZpCisKKworICBpbnB1dF9wYXRoPSIkbmV3X3BhdGgiCisgICMgQ2hlY2sgaWYgd2UgbmVlZCB0byBjb252ZXJ0IHRoaXMgdXNpbmcgRE9TLXN0eWxlIHNob3J0IG1vZGUuIElmIHRoZSBwYXRoCisgICMgY29udGFpbnMganVzdCBzaW1wbGUgY2hhcmFjdGVycywgdXNlIGl0LiBPdGhlcndpc2UgKHNwYWNlcywgd2VpcmQgY2hhcmFjdGVycyksCisgICMgdGFrZSBubyBjaGFuY2VzIGFuZCByZXdyaXRlIGl0LgorICAjIE5vdGU6IG00IGVhdHMgb3VyIFtdLCBzbyB3ZSBuZWVkIHRvIHVzZSBbIGFuZCBdIGluc3RlYWQuCisgIGhhc19mb3JiaWRkZW5fY2hhcnM9YCRFQ0hPICIkaW5wdXRfcGF0aCIgfCAkR1JFUCBbXi1fLzphLXpBLVowLTldYAorICBpZiB0ZXN0ICJ4JGhhc19mb3JiaWRkZW5fY2hhcnMiICE9IHg7IHRoZW4KKyAgICAjIE5vdyBjb252ZXJ0IGl0IHRvIG1peGVkIERPUy1zdHlsZSwgc2hvcnQgbW9kZSAobm8gc3BhY2VzLCBhbmQgLyBpbnN0ZWFkIG9mIFwpCisgICAgbmV3X3BhdGg9YGNtZCAvYyAiZm9yICVBIGluIChcIiRpbnB1dF9wYXRoXCIpIGRvIEBlY2hvICV+c0EifCRUUiBcXFxcXFxcXCAvIHwgJFRSICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J2AKKyAgZmkKKworCisgIHdpbmRvd3NfcGF0aD0iJG5ld19wYXRoIgorICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5jeWd3aW4iOyB0aGVuCisgICAgdW5peF9wYXRoPWAkQ1lHUEFUSCAtdSAiJHdpbmRvd3NfcGF0aCJgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGVsaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MubXN5cyI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRFQ0hPICIkd2luZG93c19wYXRoIiB8ICRTRUQgLWUgJ3MsXlxcKC5cXCk6LC9cXDEsZycgLWUgJ3MsXFxcXCwvLGcnYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBmaQorCisgIGlmIHRlc3QgIngkcGF0aCIgIT0gIngkbmV3X3BhdGgiOyB0aGVuCisgICAgQk9PVF9KREs9IiRuZXdfcGF0aCIKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFJld3JpdGluZyBCT09UX0pESyB0byBcIiRuZXdfcGF0aFwiIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFJld3JpdGluZyBCT09UX0pESyB0byBcIiRuZXdfcGF0aFwiIiA+JjY7fQorICBmaQorCisgICMgU2F2ZSB0aGUgZmlyc3QgMTAgYnl0ZXMgb2YgdGhpcyBwYXRoIHRvIHRoZSBzdG9yYWdlLCBzbyBmaXhwYXRoIGNhbiB3b3JrLgorICBhbGxfZml4cGF0aF9wcmVmaXhlcz0oIiR7YWxsX2ZpeHBhdGhfcHJlZml4ZXNbQF19IiAiJHtuZXdfcGF0aDowOjEwfSIpCisKKyAgZWxzZQorICAgICMgV2UncmUgb24gYSBwb3NpeCBwbGF0Zm9ybS4gSG9vcmF5ISA6KQorICAgIHBhdGg9IiRCT09UX0pESyIKKworICAgIGlmIHRlc3QgISAtZiAiJHBhdGgiICYmIHRlc3QgISAtZCAiJHBhdGgiOyB0aGVuCisgICAgICBhc19mbl9lcnJvciAkPyAiVGhlIHBhdGggb2YgQk9PVF9KREssIHdoaWNoIHJlc29sdmVzIGFzIFwiJHBhdGhcIiwgaXMgbm90IGZvdW5kLiIgIiRMSU5FTk8iIDUKKyAgICBmaQorCisgICAgaGFzX3NwYWNlPWAkRUNITyAiJHBhdGgiIHwgJEdSRVAgIiAiYAorICAgIGlmIHRlc3QgIngkaGFzX3NwYWNlIiAhPSB4OyB0aGVuCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSBwYXRoIG9mIEJPT1RfSkRLLCB3aGljaCByZXNvbHZlcyBhcyBcIiRwYXRoXCIsIGlzIGludmFsaWQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoZSBwYXRoIG9mIEJPT1RfSkRLLCB3aGljaCByZXNvbHZlcyBhcyBcIiRwYXRoXCIsIGlzIGludmFsaWQuIiA+JjY7fQorICAgICAgYXNfZm5fZXJyb3IgJD8gIlNwYWNlcyBhcmUgbm90IGFsbG93ZWQgaW4gdGhpcyBwYXRoLiIgIiRMSU5FTk8iIDUKKyAgICBmaQorICBmaQorCisgICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIEJvb3QgSkRLIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBCb290IEpESy4uLiAiID4mNjsgfQorICAgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJEJPT1RfSkRLIiA+JjUKKyRhc19lY2hvICIkQk9PVF9KREsiID4mNjsgfQorICAgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIEJvb3QgSkRLIHZlcnNpb24iID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgQm9vdCBKREsgdmVyc2lvbi4uLiAiID4mNjsgfQorICAgICAgICAgICAgICBCT09UX0pES19WRVJTSU9OPWAiJEJPT1RfSkRLL2Jpbi9qYXZhIiAtdmVyc2lvbiAyPiYxIHwgJFRSICdcblxyJyAnICAnYAorICAgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJEJPT1RfSkRLX1ZFUlNJT04iID4mNQorJGFzX2VjaG8gIiRCT09UX0pES19WRVJTSU9OIiA+JjY7IH0KKyAgICAgICAgICAgIGZpICMgZW5kIGNoZWNrIGpkayB2ZXJzaW9uCisgICAgICAgICAgZmkgIyBlbmQgY2hlY2sgcnQuamFyCisgICAgICAgIGZpICMgZW5kIGNoZWNrIGphdmFjCisgICAgICBmaSAjIGVuZCBjaGVjayBqYXZhCisgICAgZmkgIyBlbmQgY2hlY2sgYm9vdCBqZGsgZm91bmQKKyAgZmkKKworICAgIGRvbmUKKyAgZmkKKwogCiAgICAgIyBJZiBwcmV2aW91cyBzdGVwIGNsYWltZWQgdG8gaGF2ZSBmb3VuZCBhIEpESywgY2hlY2sgaXQgdG8gc2VlIGlmIGl0IHNlZW1zIHRvIGJlIHZhbGlkLgogICAgIGlmIHRlc3QgIngkQk9PVF9KREtfRk9VTkQiID0geG1heWJlOyB0aGVuCkBAIC05NjM4LDI2ICsxMzU2MywxMzMgQEAKICAgICAgICAgICAgICAgIyBXZSdyZSBkb25lISA6LSkKICAgICAgICAgICAgICAgQk9PVF9KREtfRk9VTkQ9eWVzCiAKLSAgICAjIEZhaWwgd2l0aCBtZXNzYWdlIHRoZSBwYXRoIHRvIHRoZSBCb290IEpESyBpZiB2YXIgQk9PVF9KREsgY29udGFpbnMgYSBwYXRoIHdpdGggbm8gc3BhY2VzIGluIGl0LgotICAgICMgVW5sZXNzIG9uIFdpbmRvd3MsIHdoZXJlIHdlIGNhbiByZXdyaXRlIHRoZSBwYXRoLgotICAgIEhBU19TUEFDRT1gZWNobyAiJEJPT1RfSkRLIiB8IGdyZXAgIiAiYAotICAgIGlmIHRlc3QgIngkSEFTX1NQQUNFIiAhPSB4OyB0aGVuCi0gICAgICAgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PUyIgPSAieHdpbmRvd3MiOyB0aGVuCi0gICAgICAgICAgICAjIEZpcnN0IGNvbnZlcnQgaXQgdG8gRE9TLXN0eWxlLCBzaG9ydCBtb2RlIChubyBzcGFjZXMpCi0gICAgICAgICAgICBCT09UX0pESz1gJENZR1BBVEggLXMgLW0gLWEgIiRCT09UX0pESyJgCi0gICAgICAgICAgICAjIE5vdyBpdCdzIGNhc2UgaW5zZW5zaXRpdmU7IGxldCdzIG1ha2UgaXQgbG93ZXJjYXNlIHRvIGltcHJvdmUgcmVhZGFiaWxpdHkKLSAgICAgICAgICAgIEJPT1RfSkRLPWAkRUNITyAiJEJPT1RfSkRLIiB8ICRUUiAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2cXh5eidgCi0gICAgICAgICAgICAjIE5vdyBjb252ZXJ0IGl0IGJhY2sgdG8gVW5peC1zdGlsZSAoY3lncGF0aCkKLSAgICAgICAgICAgIEJPT1RfSkRLPWAkQ1lHUEFUSCAtdSAiJEJPT1RfSkRLImAKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgYXNfZm5fZXJyb3IgJD8gIllvdSBjYW5ub3QgaGF2ZSBzcGFjZXMgaW4gdGhlIHBhdGggdG8gdGhlIEJvb3QgSkRLISBcIiRCT09UX0pES1wiIiAiJExJTkVOTyIgNQotICAgICAgICBmaQorICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5jeWd3aW4iOyB0aGVuCisKKyAgIyBJbnB1dCBtaWdodCBiZSBnaXZlbiBhcyBXaW5kb3dzIGZvcm1hdCwgc3RhcnQgYnkgY29udmVydGluZyB0bworICAjIHVuaXggZm9ybWF0LgorICBwYXRoPSIkQk9PVF9KREsiCisgIG5ld19wYXRoPWAkQ1lHUEFUSCAtdSAiJHBhdGgiYAorCisgICMgQ3lnd2luIHRyaWVzIHRvIGhpZGUgc29tZSBhc3BlY3RzIG9mIHRoZSBXaW5kb3dzIGZpbGUgc3lzdGVtLCBzdWNoIHRoYXQgYmluYXJpZXMgYXJlCisgICMgbmFtZWQgLmV4ZSBidXQgY2FsbGVkIHdpdGhvdXQgdGhhdCBzdWZmaXguIFRoZXJlZm9yZSwgImZvbyIgYW5kICJmb28uZXhlIiBhcmUgY29uc2lkZXJlZAorICAjIHRoZSBzYW1lIGZpbGUsIG1vc3Qgb2YgdGhlIHRpbWUgKGFzIGluICJ0ZXN0IC1mIikuIEJ1dCBub3Qgd2hlbiBydW5uaW5nIGN5Z3BhdGggLXMsIHRoZW4KKyAgIyAiZm9vLmV4ZSIgaXMgT0sgYnV0ICJmb28iIGlzIGFuIGVycm9yLgorICAjCisgICMgVGhpcyB0ZXN0IGlzIHRoZXJlZm9yZSBzbGlnaHRseSBtb3JlIGFjY3VyYXRlIHRoYW4gInRlc3QgLWYiIHRvIGNoZWNrIGZvciBmaWxlIHByZWNlbnNlLgorICAjIEl0IGlzIGFsc28gYSB3YXkgdG8gbWFrZSBzdXJlIHdlIGdvdCB0aGUgcHJvcGVyIGZpbGUgbmFtZSBmb3IgdGhlIHJlYWwgdGVzdCBsYXRlciBvbi4KKyAgdGVzdF9zaG9ydHBhdGg9YCRDWUdQQVRIIC1zIC1tICIkbmV3X3BhdGgiIDI+IC9kZXYvbnVsbGAKKyAgaWYgdGVzdCAieCR0ZXN0X3Nob3J0cGF0aCIgPSB4OyB0aGVuCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUaGUgcGF0aCBvZiBCT09UX0pESywgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkcGF0aFwiLCBpcyBpbnZhbGlkLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUaGUgcGF0aCBvZiBCT09UX0pESywgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkcGF0aFwiLCBpcyBpbnZhbGlkLiIgPiY2O30KKyAgICBhc19mbl9lcnJvciAkPyAiQ2Fubm90IGxvY2F0ZSB0aGUgdGhlIHBhdGggb2YgQk9PVF9KREsiICIkTElORU5PIiA1CisgIGZpCisKKyAgIyBDYWxsIGhlbHBlciBmdW5jdGlvbiB3aGljaCBwb3NzaWJseSBjb252ZXJ0cyB0aGlzIHVzaW5nIERPUy1zdHlsZSBzaG9ydCBtb2RlLgorICAjIElmIHNvLCB0aGUgdXBkYXRlZCBwYXRoIGlzIHN0b3JlZCBpbiAkbmV3X3BhdGguCisKKyAgaW5wdXRfcGF0aD0iJG5ld19wYXRoIgorICAjIENoZWNrIGlmIHdlIG5lZWQgdG8gY29udmVydCB0aGlzIHVzaW5nIERPUy1zdHlsZSBzaG9ydCBtb2RlLiBJZiB0aGUgcGF0aAorICAjIGNvbnRhaW5zIGp1c3Qgc2ltcGxlIGNoYXJhY3RlcnMsIHVzZSBpdC4gT3RoZXJ3aXNlIChzcGFjZXMsIHdlaXJkIGNoYXJhY3RlcnMpLAorICAjIHRha2Ugbm8gY2hhbmNlcyBhbmQgcmV3cml0ZSBpdC4KKyAgIyBOb3RlOiBtNCBlYXRzIG91ciBbXSwgc28gd2UgbmVlZCB0byB1c2UgWyBhbmQgXSBpbnN0ZWFkLgorICBoYXNfZm9yYmlkZGVuX2NoYXJzPWAkRUNITyAiJGlucHV0X3BhdGgiIHwgJEdSRVAgW14tLl8vYS16QS1aMC05XWAKKyAgaWYgdGVzdCAieCRoYXNfZm9yYmlkZGVuX2NoYXJzIiAhPSB4OyB0aGVuCisgICAgIyBOb3cgY29udmVydCBpdCB0byBtaXhlZCBET1Mtc3R5bGUsIHNob3J0IG1vZGUgKG5vIHNwYWNlcywgYW5kIC8gaW5zdGVhZCBvZiBcKQorICAgIHNob3J0bW9kZV9wYXRoPWAkQ1lHUEFUSCAtcyAtbSAtYSAiJGlucHV0X3BhdGgiYAorICAgIHBhdGhfYWZ0ZXJfc2hvcnRtb2RlPWAkQ1lHUEFUSCAtdSAiJHNob3J0bW9kZV9wYXRoImAKKyAgICBpZiB0ZXN0ICJ4JHBhdGhfYWZ0ZXJfc2hvcnRtb2RlIiAhPSAieCRpbnB1dF90b19zaG9ydHBhdGgiOyB0aGVuCisgICAgICAjIEdvaW5nIHRvIHNob3J0IG1vZGUgYW5kIGJhY2sgYWdhaW4gZGlkIGluZGVlZCBtYXR0ZXIuIFNpbmNlIHNob3J0IG1vZGUgaXMKKyAgICAgICMgY2FzZSBpbnNlbnNpdGl2ZSwgbGV0J3MgbWFrZSBpdCBsb3dlcmNhc2UgdG8gaW1wcm92ZSByZWFkYWJpbGl0eS4KKyAgICAgIHNob3J0bW9kZV9wYXRoPWAkRUNITyAiJHNob3J0bW9kZV9wYXRoIiB8ICRUUiAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidgCisgICAgICAjIE5vdyBjb252ZXJ0IGl0IGJhY2sgdG8gVW5peC1zdGlsZSAoY3lncGF0aCkKKyAgICAgIGlucHV0X3BhdGg9YCRDWUdQQVRIIC11ICIkc2hvcnRtb2RlX3BhdGgiYAorICAgICAgbmV3X3BhdGg9IiRpbnB1dF9wYXRoIgogICAgIGZpCisgIGZpCisKKyAgdGVzdF9jeWdkcml2ZV9wcmVmaXg9YCRFQ0hPICRpbnB1dF9wYXRoIHwgJEdSRVAgXi9jeWdkcml2ZS9gCisgIGlmIHRlc3QgIngkdGVzdF9jeWdkcml2ZV9wcmVmaXgiID0geDsgdGhlbgorICAgICMgQXMgYSBzaW1wbGUgZml4LCBleGNsdWRlIC91c3IvYmluIHNpbmNlIGl0J3Mgbm90IGEgcmVhbCBwYXRoLgorICAgIGlmIHRlc3QgInhgJEVDSE8gJG5ld19wYXRoIHwgJEdSRVAgXi91c3IvYmluL2AiID0geDsgdGhlbgorICAgICAgIyBUaGUgcGF0aCBpcyBpbiBhIEN5Z3dpbiBzcGVjaWFsIGRpcmVjdG9yeSAoZS5nLiAvaG9tZSkuIFdlIG5lZWQgdGhpcyBjb252ZXJ0ZWQgdG8KKyAgICAgICMgYSBwYXRoIHByZWZpeGVkIGJ5IC9jeWdkcml2ZSBmb3IgZml4cGF0aCB0byB3b3JrLgorICAgICAgbmV3X3BhdGg9IiRDWUdXSU5fUk9PVF9QQVRIJGlucHV0X3BhdGgiCisgICAgZmkKKyAgZmkKKworCisgIGlmIHRlc3QgIngkcGF0aCIgIT0gIngkbmV3X3BhdGgiOyB0aGVuCisgICAgQk9PVF9KREs9IiRuZXdfcGF0aCIKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFJld3JpdGluZyBCT09UX0pESyB0byBcIiRuZXdfcGF0aFwiIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFJld3JpdGluZyBCT09UX0pESyB0byBcIiRuZXdfcGF0aFwiIiA+JjY7fQorICBmaQorCisgIGVsaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MubXN5cyI7IHRoZW4KKworICBwYXRoPSIkQk9PVF9KREsiCisgIGhhc19jb2xvbj1gJEVDSE8gJHBhdGggfCAkR1JFUCBeLjpgCisgIG5ld19wYXRoPSIkcGF0aCIKKyAgaWYgdGVzdCAieCRoYXNfY29sb24iID0geDsgdGhlbgorICAgICMgTm90IGluIG1peGVkIG9yIFdpbmRvd3Mgc3R5bGUsIHN0YXJ0IGJ5IHRoYXQuCisgICAgbmV3X3BhdGg9YGNtZCAvL2MgZWNobyAkcGF0aGAKKyAgZmkKKworCisgIGlucHV0X3BhdGg9IiRuZXdfcGF0aCIKKyAgIyBDaGVjayBpZiB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhpcyB1c2luZyBET1Mtc3R5bGUgc2hvcnQgbW9kZS4gSWYgdGhlIHBhdGgKKyAgIyBjb250YWlucyBqdXN0IHNpbXBsZSBjaGFyYWN0ZXJzLCB1c2UgaXQuIE90aGVyd2lzZSAoc3BhY2VzLCB3ZWlyZCBjaGFyYWN0ZXJzKSwKKyAgIyB0YWtlIG5vIGNoYW5jZXMgYW5kIHJld3JpdGUgaXQuCisgICMgTm90ZTogbTQgZWF0cyBvdXIgW10sIHNvIHdlIG5lZWQgdG8gdXNlIFsgYW5kIF0gaW5zdGVhZC4KKyAgaGFzX2ZvcmJpZGRlbl9jaGFycz1gJEVDSE8gIiRpbnB1dF9wYXRoIiB8ICRHUkVQIFteLV8vOmEtekEtWjAtOV1gCisgIGlmIHRlc3QgIngkaGFzX2ZvcmJpZGRlbl9jaGFycyIgIT0geDsgdGhlbgorICAgICMgTm93IGNvbnZlcnQgaXQgdG8gbWl4ZWQgRE9TLXN0eWxlLCBzaG9ydCBtb2RlIChubyBzcGFjZXMsIGFuZCAvIGluc3RlYWQgb2YgXCkKKyAgICBuZXdfcGF0aD1gY21kIC9jICJmb3IgJUEgaW4gKFwiJGlucHV0X3BhdGhcIikgZG8gQGVjaG8gJX5zQSJ8JFRSIFxcXFxcXFxcIC8gfCAkVFIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAorICBmaQorCisKKyAgd2luZG93c19wYXRoPSIkbmV3X3BhdGgiCisgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLmN5Z3dpbiI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRDWUdQQVRIIC11ICIkd2luZG93c19wYXRoImAKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJEVDSE8gIiR3aW5kb3dzX3BhdGgiIHwgJFNFRCAtZSAncyxeXFwoLlxcKTosL1xcMSxnJyAtZSAncyxcXFxcLC8sZydgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGZpCisKKyAgaWYgdGVzdCAieCRwYXRoIiAhPSAieCRuZXdfcGF0aCI7IHRoZW4KKyAgICBCT09UX0pESz0iJG5ld19wYXRoIgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogUmV3cml0aW5nIEJPT1RfSkRLIHRvIFwiJG5ld19wYXRoXCIiID4mNQorJGFzX2VjaG8gIiRhc19tZTogUmV3cml0aW5nIEJPT1RfSkRLIHRvIFwiJG5ld19wYXRoXCIiID4mNjt9CisgIGZpCisKKyAgIyBTYXZlIHRoZSBmaXJzdCAxMCBieXRlcyBvZiB0aGlzIHBhdGggdG8gdGhlIHN0b3JhZ2UsIHNvIGZpeHBhdGggY2FuIHdvcmsuCisgIGFsbF9maXhwYXRoX3ByZWZpeGVzPSgiJHthbGxfZml4cGF0aF9wcmVmaXhlc1tAXX0iICIke25ld19wYXRoOjA6MTB9IikKKworICBlbHNlCisgICAgIyBXZSdyZSBvbiBhIHBvc2l4IHBsYXRmb3JtLiBIb29yYXkhIDopCisgICAgcGF0aD0iJEJPT1RfSkRLIgorCisgICAgaWYgdGVzdCAhIC1mICIkcGF0aCIgJiYgdGVzdCAhIC1kICIkcGF0aCI7IHRoZW4KKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJUaGUgcGF0aCBvZiBCT09UX0pESywgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkcGF0aFwiLCBpcyBub3QgZm91bmQuIiAiJExJTkVOTyIgNQorICAgIGZpCisKKyAgICBoYXNfc3BhY2U9YCRFQ0hPICIkcGF0aCIgfCAkR1JFUCAiICJgCisgICAgaWYgdGVzdCAieCRoYXNfc3BhY2UiICE9IHg7IHRoZW4KKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGhlIHBhdGggb2YgQk9PVF9KREssIHdoaWNoIHJlc29sdmVzIGFzIFwiJHBhdGhcIiwgaXMgaW52YWxpZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhlIHBhdGggb2YgQk9PVF9KREssIHdoaWNoIHJlc29sdmVzIGFzIFwiJHBhdGhcIiwgaXMgaW52YWxpZC4iID4mNjt9CisgICAgICBhc19mbl9lcnJvciAkPyAiU3BhY2VzIGFyZSBub3QgYWxsb3dlZCBpbiB0aGlzIHBhdGguIiAiJExJTkVOTyIgNQorICAgIGZpCisgIGZpCiAKICAgICAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgQm9vdCBKREsiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIEJvb3QgSkRLLi4uICIgPiY2OyB9Ci0gICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQk9PVF9KREsgKCRCT09UX0pES19WRVJTSU9OKSIgPiY1Ci0kYXNfZWNobyAiJEJPT1RfSkRLICgkQk9PVF9KREtfVkVSU0lPTikiID4mNjsgfQorICAgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJEJPT1RfSkRLIiA+JjUKKyRhc19lY2hvICIkQk9PVF9KREsiID4mNjsgfQorICAgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIEJvb3QgSkRLIHZlcnNpb24iID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgQm9vdCBKREsgdmVyc2lvbi4uLiAiID4mNjsgfQorICAgICAgICAgICAgICBCT09UX0pES19WRVJTSU9OPWAiJEJPT1RfSkRLL2Jpbi9qYXZhIiAtdmVyc2lvbiAyPiYxIHwgJFRSICdcblxyJyAnICAnYAorICAgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJEJPT1RfSkRLX1ZFUlNJT04iID4mNQorJGFzX2VjaG8gIiRCT09UX0pES19WRVJTSU9OIiA+JjY7IH0KICAgICAgICAgICAgIGZpICMgZW5kIGNoZWNrIGpkayB2ZXJzaW9uCiAgICAgICAgICAgZmkgIyBlbmQgY2hlY2sgcnQuamFyCiAgICAgICAgIGZpICMgZW5kIGNoZWNrIGphdmFjCkBAIC05NjcyLDE2ICsxMzcwNCwxOTUgQEAKIAogICBCT09UX0pES19QUkVGSVg9Ii9MaWJyYXJ5L0phdmEvSmF2YVZpcnR1YWxNYWNoaW5lcyIKICAgQk9PVF9KREtfU1VGRklYPSIvQ29udGVudHMvSG9tZSIKLSAgQkVTVF9KREtfRk9VTkQ9YCRMUyAiJEJPT1RfSkRLX1BSRUZJWCIgMj4gL2Rldi9udWxsIHwgJEdSRVAgamRrIHwgJFNPUlQgLXIgfCAkSEVBRCAtbiAxIGAKLSAgaWYgdGVzdCAieCRCRVNUX0pES19GT1VORCIgIT0geDsgdGhlbgotICAgIEJPT1RfSkRLPSIke0JPT1RfSkRLX1BSRUZJWH0vJHtCRVNUX0pES19GT1VORH0ke0JPT1RfSkRLX1NVRkZJWH0iCi0gICAgaWYgdGVzdCAtZCAiJEJPT1RfSkRLIjsgdGhlbgotICAgICAgQk9PVF9KREtfRk9VTkQ9bWF5YmUKLSAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogRm91bmQgcG90ZW50aWFsIEJvb3QgSkRLIHVzaW5nIHdlbGwta25vd24gbG9jYXRpb25zIChpbiAkQk9PVF9KREtfUFJFRklYKSIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBGb3VuZCBwb3RlbnRpYWwgQm9vdCBKREsgdXNpbmcgd2VsbC1rbm93biBsb2NhdGlvbnMgKGluICRCT09UX0pES19QUkVGSVgpIiA+JjY7fQorICBBTExfSkRLU19GT1VORD1gJExTICIkQk9PVF9KREtfUFJFRklYIiAyPiAvZGV2L251bGwgfCAkU09SVCAtcmAKKyAgaWYgdGVzdCAieCRBTExfSkRLU19GT1VORCIgIT0geDsgdGhlbgorICAgIGZvciBKREtfVE9fVFJZIGluICRBTExfSkRLU19GT1VORCA7IGRvCisKKyAgaWYgdGVzdCAieCRCT09UX0pES19GT1VORCIgPSB4bm87IHRoZW4KKyAgICAjIE5vdyBleGVjdXRlIHRoZSB0ZXN0CisKKyAgICAgICAgQk9PVF9KREs9IiR7Qk9PVF9KREtfUFJFRklYfS8ke0pES19UT19UUll9JHtCT09UX0pES19TVUZGSVh9IgorICAgICAgICBpZiB0ZXN0IC1kICIkQk9PVF9KREsiOyB0aGVuCisgICAgICAgICAgQk9PVF9KREtfRk9VTkQ9bWF5YmUKKyAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IEZvdW5kIHBvdGVudGlhbCBCb290IEpESyB1c2luZyB3ZWxsLWtub3duIGxvY2F0aW9ucyAoaW4gJEJPT1RfSkRLX1BSRUZJWC8kSkRLX1RPX1RSWSkiID4mNQorJGFzX2VjaG8gIiRhc19tZTogRm91bmQgcG90ZW50aWFsIEJvb3QgSkRLIHVzaW5nIHdlbGwta25vd24gbG9jYXRpb25zIChpbiAkQk9PVF9KREtfUFJFRklYLyRKREtfVE9fVFJZKSIgPiY2O30KKyAgICAgICAgZmkKKworCisgICAgIyBJZiBwcmV2aW91cyBzdGVwIGNsYWltZWQgdG8gaGF2ZSBmb3VuZCBhIEpESywgY2hlY2sgaXQgdG8gc2VlIGlmIGl0IHNlZW1zIHRvIGJlIHZhbGlkLgorICAgIGlmIHRlc3QgIngkQk9PVF9KREtfRk9VTkQiID0geG1heWJlOyB0aGVuCisgICAgICAjIERvIHdlIGhhdmUgYSBiaW4vamF2YT8KKyAgICAgIGlmIHRlc3QgISAteCAiJEJPT1RfSkRLL2Jpbi9qYXZhIjsgdGhlbgorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFBvdGVudGlhbCBCb290IEpESyBmb3VuZCBhdCAkQk9PVF9KREsgZGlkIG5vdCBjb250YWluIGJpbi9qYXZhOyBpZ25vcmluZyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBQb3RlbnRpYWwgQm9vdCBKREsgZm91bmQgYXQgJEJPT1RfSkRLIGRpZCBub3QgY29udGFpbiBiaW4vamF2YTsgaWdub3JpbmciID4mNjt9CisgICAgICAgIEJPT1RfSkRLX0ZPVU5EPW5vCisgICAgICBlbHNlCisgICAgICAgICMgRG8gd2UgaGF2ZSBhIGJpbi9qYXZhYz8KKyAgICAgICAgaWYgdGVzdCAhIC14ICIkQk9PVF9KREsvYmluL2phdmFjIjsgdGhlbgorICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogUG90ZW50aWFsIEJvb3QgSkRLIGZvdW5kIGF0ICRCT09UX0pESyBkaWQgbm90IGNvbnRhaW4gYmluL2phdmFjOyBpZ25vcmluZyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBQb3RlbnRpYWwgQm9vdCBKREsgZm91bmQgYXQgJEJPT1RfSkRLIGRpZCBub3QgY29udGFpbiBiaW4vamF2YWM7IGlnbm9yaW5nIiA+JjY7fQorICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogKFRoaXMgbWlnaHQgYmUgYW4gSlJFIGluc3RlYWQgb2YgYW4gSkRLKSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiAoVGhpcyBtaWdodCBiZSBhbiBKUkUgaW5zdGVhZCBvZiBhbiBKREspIiA+JjY7fQorICAgICAgICAgIEJPT1RfSkRLX0ZPVU5EPW5vCisgICAgICAgIGVsc2UKKyAgICAgICAgICAjIERvIHdlIGhhdmUgYW4gcnQuamFyPyAoT24gTWFjT1NYIGl0IGlzIGNhbGxlZCBjbGFzc2VzLmphcikKKyAgICAgICAgICBpZiB0ZXN0ICEgLWYgIiRCT09UX0pESy9qcmUvbGliL3J0LmphciIgJiYgdGVzdCAhIC1mICIkQk9PVF9KREsvLi4vQ2xhc3Nlcy9jbGFzc2VzLmphciI7IHRoZW4KKyAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogUG90ZW50aWFsIEJvb3QgSkRLIGZvdW5kIGF0ICRCT09UX0pESyBkaWQgbm90IGNvbnRhaW4gYW4gcnQuamFyOyBpZ25vcmluZyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBQb3RlbnRpYWwgQm9vdCBKREsgZm91bmQgYXQgJEJPT1RfSkRLIGRpZCBub3QgY29udGFpbiBhbiBydC5qYXI7IGlnbm9yaW5nIiA+JjY7fQorICAgICAgICAgICAgQk9PVF9KREtfRk9VTkQ9bm8KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICAjIE9oLCB0aGlzIGlzIGxvb2tpbmcgZ29vZCEgV2UgcHJvYmFibHkgaGF2ZSBmb3VuZCBhIHByb3BlciBKREsuIElzIGl0IHRoZSBjb3JyZWN0IHZlcnNpb24/CisgICAgICAgICAgICBCT09UX0pES19WRVJTSU9OPWAiJEJPT1RfSkRLL2Jpbi9qYXZhIiAtdmVyc2lvbiAyPiYxIHwgaGVhZCAtbiAxYAorCisgICAgICAgICAgICAjIEV4dHJhIE00IHF1b3RlIG5lZWRlZCB0byBwcm90ZWN0IFtdIGluIGdyZXAgZXhwcmVzc2lvbi4KKyAgICAgICAgICAgIEZPVU5EX1ZFUlNJT05fNzg9YGVjaG8gJEJPT1RfSkRLX1ZFUlNJT04gfCBncmVwICAnXCIxXC5bNzhdXC4nYAorICAgICAgICAgICAgaWYgdGVzdCAieCRGT1VORF9WRVJTSU9OXzc4IiA9IHg7IHRoZW4KKyAgICAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBQb3RlbnRpYWwgQm9vdCBKREsgZm91bmQgYXQgJEJPT1RfSkRLIGlzIGluY29ycmVjdCBKREsgdmVyc2lvbiAoJEJPT1RfSkRLX1ZFUlNJT04pOyBpZ25vcmluZyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBQb3RlbnRpYWwgQm9vdCBKREsgZm91bmQgYXQgJEJPT1RfSkRLIGlzIGluY29ycmVjdCBKREsgdmVyc2lvbiAoJEJPT1RfSkRLX1ZFUlNJT04pOyBpZ25vcmluZyIgPiY2O30KKyAgICAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAoWW91ciBCb290IEpESyBtdXN0IGJlIHZlcnNpb24gNyBvciA4KSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiAoWW91ciBCb290IEpESyBtdXN0IGJlIHZlcnNpb24gNyBvciA4KSIgPiY2O30KKyAgICAgICAgICAgICAgQk9PVF9KREtfRk9VTkQ9bm8KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgIyBXZSdyZSBkb25lISA6LSkKKyAgICAgICAgICAgICAgQk9PVF9KREtfRk9VTkQ9eWVzCisKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorCisgICMgSW5wdXQgbWlnaHQgYmUgZ2l2ZW4gYXMgV2luZG93cyBmb3JtYXQsIHN0YXJ0IGJ5IGNvbnZlcnRpbmcgdG8KKyAgIyB1bml4IGZvcm1hdC4KKyAgcGF0aD0iJEJPT1RfSkRLIgorICBuZXdfcGF0aD1gJENZR1BBVEggLXUgIiRwYXRoImAKKworICAjIEN5Z3dpbiB0cmllcyB0byBoaWRlIHNvbWUgYXNwZWN0cyBvZiB0aGUgV2luZG93cyBmaWxlIHN5c3RlbSwgc3VjaCB0aGF0IGJpbmFyaWVzIGFyZQorICAjIG5hbWVkIC5leGUgYnV0IGNhbGxlZCB3aXRob3V0IHRoYXQgc3VmZml4LiBUaGVyZWZvcmUsICJmb28iIGFuZCAiZm9vLmV4ZSIgYXJlIGNvbnNpZGVyZWQKKyAgIyB0aGUgc2FtZSBmaWxlLCBtb3N0IG9mIHRoZSB0aW1lIChhcyBpbiAidGVzdCAtZiIpLiBCdXQgbm90IHdoZW4gcnVubmluZyBjeWdwYXRoIC1zLCB0aGVuCisgICMgImZvby5leGUiIGlzIE9LIGJ1dCAiZm9vIiBpcyBhbiBlcnJvci4KKyAgIworICAjIFRoaXMgdGVzdCBpcyB0aGVyZWZvcmUgc2xpZ2h0bHkgbW9yZSBhY2N1cmF0ZSB0aGFuICJ0ZXN0IC1mIiB0byBjaGVjayBmb3IgZmlsZSBwcmVjZW5zZS4KKyAgIyBJdCBpcyBhbHNvIGEgd2F5IHRvIG1ha2Ugc3VyZSB3ZSBnb3QgdGhlIHByb3BlciBmaWxlIG5hbWUgZm9yIHRoZSByZWFsIHRlc3QgbGF0ZXIgb24uCisgIHRlc3Rfc2hvcnRwYXRoPWAkQ1lHUEFUSCAtcyAtbSAiJG5ld19wYXRoIiAyPiAvZGV2L251bGxgCisgIGlmIHRlc3QgIngkdGVzdF9zaG9ydHBhdGgiID0geDsgdGhlbgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGhlIHBhdGggb2YgQk9PVF9KREssIHdoaWNoIHJlc29sdmVzIGFzIFwiJHBhdGhcIiwgaXMgaW52YWxpZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhlIHBhdGggb2YgQk9PVF9KREssIHdoaWNoIHJlc29sdmVzIGFzIFwiJHBhdGhcIiwgaXMgaW52YWxpZC4iID4mNjt9CisgICAgYXNfZm5fZXJyb3IgJD8gIkNhbm5vdCBsb2NhdGUgdGhlIHRoZSBwYXRoIG9mIEJPT1RfSkRLIiAiJExJTkVOTyIgNQorICBmaQorCisgICMgQ2FsbCBoZWxwZXIgZnVuY3Rpb24gd2hpY2ggcG9zc2libHkgY29udmVydHMgdGhpcyB1c2luZyBET1Mtc3R5bGUgc2hvcnQgbW9kZS4KKyAgIyBJZiBzbywgdGhlIHVwZGF0ZWQgcGF0aCBpcyBzdG9yZWQgaW4gJG5ld19wYXRoLgorCisgIGlucHV0X3BhdGg9IiRuZXdfcGF0aCIKKyAgIyBDaGVjayBpZiB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhpcyB1c2luZyBET1Mtc3R5bGUgc2hvcnQgbW9kZS4gSWYgdGhlIHBhdGgKKyAgIyBjb250YWlucyBqdXN0IHNpbXBsZSBjaGFyYWN0ZXJzLCB1c2UgaXQuIE90aGVyd2lzZSAoc3BhY2VzLCB3ZWlyZCBjaGFyYWN0ZXJzKSwKKyAgIyB0YWtlIG5vIGNoYW5jZXMgYW5kIHJld3JpdGUgaXQuCisgICMgTm90ZTogbTQgZWF0cyBvdXIgW10sIHNvIHdlIG5lZWQgdG8gdXNlIFsgYW5kIF0gaW5zdGVhZC4KKyAgaGFzX2ZvcmJpZGRlbl9jaGFycz1gJEVDSE8gIiRpbnB1dF9wYXRoIiB8ICRHUkVQIFteLS5fL2EtekEtWjAtOV1gCisgIGlmIHRlc3QgIngkaGFzX2ZvcmJpZGRlbl9jaGFycyIgIT0geDsgdGhlbgorICAgICMgTm93IGNvbnZlcnQgaXQgdG8gbWl4ZWQgRE9TLXN0eWxlLCBzaG9ydCBtb2RlIChubyBzcGFjZXMsIGFuZCAvIGluc3RlYWQgb2YgXCkKKyAgICBzaG9ydG1vZGVfcGF0aD1gJENZR1BBVEggLXMgLW0gLWEgIiRpbnB1dF9wYXRoImAKKyAgICBwYXRoX2FmdGVyX3Nob3J0bW9kZT1gJENZR1BBVEggLXUgIiRzaG9ydG1vZGVfcGF0aCJgCisgICAgaWYgdGVzdCAieCRwYXRoX2FmdGVyX3Nob3J0bW9kZSIgIT0gIngkaW5wdXRfdG9fc2hvcnRwYXRoIjsgdGhlbgorICAgICAgIyBHb2luZyB0byBzaG9ydCBtb2RlIGFuZCBiYWNrIGFnYWluIGRpZCBpbmRlZWQgbWF0dGVyLiBTaW5jZSBzaG9ydCBtb2RlIGlzCisgICAgICAjIGNhc2UgaW5zZW5zaXRpdmUsIGxldCdzIG1ha2UgaXQgbG93ZXJjYXNlIHRvIGltcHJvdmUgcmVhZGFiaWxpdHkuCisgICAgICBzaG9ydG1vZGVfcGF0aD1gJEVDSE8gIiRzaG9ydG1vZGVfcGF0aCIgfCAkVFIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAorICAgICAgIyBOb3cgY29udmVydCBpdCBiYWNrIHRvIFVuaXgtc3RpbGUgKGN5Z3BhdGgpCisgICAgICBpbnB1dF9wYXRoPWAkQ1lHUEFUSCAtdSAiJHNob3J0bW9kZV9wYXRoImAKKyAgICAgIG5ld19wYXRoPSIkaW5wdXRfcGF0aCIKICAgICBmaQogICBmaQogCisgIHRlc3RfY3lnZHJpdmVfcHJlZml4PWAkRUNITyAkaW5wdXRfcGF0aCB8ICRHUkVQIF4vY3lnZHJpdmUvYAorICBpZiB0ZXN0ICJ4JHRlc3RfY3lnZHJpdmVfcHJlZml4IiA9IHg7IHRoZW4KKyAgICAjIEFzIGEgc2ltcGxlIGZpeCwgZXhjbHVkZSAvdXNyL2JpbiBzaW5jZSBpdCdzIG5vdCBhIHJlYWwgcGF0aC4KKyAgICBpZiB0ZXN0ICJ4YCRFQ0hPICRuZXdfcGF0aCB8ICRHUkVQIF4vdXNyL2Jpbi9gIiA9IHg7IHRoZW4KKyAgICAgICMgVGhlIHBhdGggaXMgaW4gYSBDeWd3aW4gc3BlY2lhbCBkaXJlY3RvcnkgKGUuZy4gL2hvbWUpLiBXZSBuZWVkIHRoaXMgY29udmVydGVkIHRvCisgICAgICAjIGEgcGF0aCBwcmVmaXhlZCBieSAvY3lnZHJpdmUgZm9yIGZpeHBhdGggdG8gd29yay4KKyAgICAgIG5ld19wYXRoPSIkQ1lHV0lOX1JPT1RfUEFUSCRpbnB1dF9wYXRoIgorICAgIGZpCisgIGZpCisKKworICBpZiB0ZXN0ICJ4JHBhdGgiICE9ICJ4JG5ld19wYXRoIjsgdGhlbgorICAgIEJPT1RfSkRLPSIkbmV3X3BhdGgiCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBSZXdyaXRpbmcgQk9PVF9KREsgdG8gXCIkbmV3X3BhdGhcIiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBSZXdyaXRpbmcgQk9PVF9KREsgdG8gXCIkbmV3X3BhdGhcIiIgPiY2O30KKyAgZmkKKworICBlbGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLm1zeXMiOyB0aGVuCisKKyAgcGF0aD0iJEJPT1RfSkRLIgorICBoYXNfY29sb249YCRFQ0hPICRwYXRoIHwgJEdSRVAgXi46YAorICBuZXdfcGF0aD0iJHBhdGgiCisgIGlmIHRlc3QgIngkaGFzX2NvbG9uIiA9IHg7IHRoZW4KKyAgICAjIE5vdCBpbiBtaXhlZCBvciBXaW5kb3dzIHN0eWxlLCBzdGFydCBieSB0aGF0LgorICAgIG5ld19wYXRoPWBjbWQgLy9jIGVjaG8gJHBhdGhgCisgIGZpCisKKworICBpbnB1dF9wYXRoPSIkbmV3X3BhdGgiCisgICMgQ2hlY2sgaWYgd2UgbmVlZCB0byBjb252ZXJ0IHRoaXMgdXNpbmcgRE9TLXN0eWxlIHNob3J0IG1vZGUuIElmIHRoZSBwYXRoCisgICMgY29udGFpbnMganVzdCBzaW1wbGUgY2hhcmFjdGVycywgdXNlIGl0LiBPdGhlcndpc2UgKHNwYWNlcywgd2VpcmQgY2hhcmFjdGVycyksCisgICMgdGFrZSBubyBjaGFuY2VzIGFuZCByZXdyaXRlIGl0LgorICAjIE5vdGU6IG00IGVhdHMgb3VyIFtdLCBzbyB3ZSBuZWVkIHRvIHVzZSBbIGFuZCBdIGluc3RlYWQuCisgIGhhc19mb3JiaWRkZW5fY2hhcnM9YCRFQ0hPICIkaW5wdXRfcGF0aCIgfCAkR1JFUCBbXi1fLzphLXpBLVowLTldYAorICBpZiB0ZXN0ICJ4JGhhc19mb3JiaWRkZW5fY2hhcnMiICE9IHg7IHRoZW4KKyAgICAjIE5vdyBjb252ZXJ0IGl0IHRvIG1peGVkIERPUy1zdHlsZSwgc2hvcnQgbW9kZSAobm8gc3BhY2VzLCBhbmQgLyBpbnN0ZWFkIG9mIFwpCisgICAgbmV3X3BhdGg9YGNtZCAvYyAiZm9yICVBIGluIChcIiRpbnB1dF9wYXRoXCIpIGRvIEBlY2hvICV+c0EifCRUUiBcXFxcXFxcXCAvIHwgJFRSICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J2AKKyAgZmkKKworCisgIHdpbmRvd3NfcGF0aD0iJG5ld19wYXRoIgorICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5jeWd3aW4iOyB0aGVuCisgICAgdW5peF9wYXRoPWAkQ1lHUEFUSCAtdSAiJHdpbmRvd3NfcGF0aCJgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGVsaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MubXN5cyI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRFQ0hPICIkd2luZG93c19wYXRoIiB8ICRTRUQgLWUgJ3MsXlxcKC5cXCk6LC9cXDEsZycgLWUgJ3MsXFxcXCwvLGcnYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBmaQorCisgIGlmIHRlc3QgIngkcGF0aCIgIT0gIngkbmV3X3BhdGgiOyB0aGVuCisgICAgQk9PVF9KREs9IiRuZXdfcGF0aCIKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFJld3JpdGluZyBCT09UX0pESyB0byBcIiRuZXdfcGF0aFwiIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFJld3JpdGluZyBCT09UX0pESyB0byBcIiRuZXdfcGF0aFwiIiA+JjY7fQorICBmaQorCisgICMgU2F2ZSB0aGUgZmlyc3QgMTAgYnl0ZXMgb2YgdGhpcyBwYXRoIHRvIHRoZSBzdG9yYWdlLCBzbyBmaXhwYXRoIGNhbiB3b3JrLgorICBhbGxfZml4cGF0aF9wcmVmaXhlcz0oIiR7YWxsX2ZpeHBhdGhfcHJlZml4ZXNbQF19IiAiJHtuZXdfcGF0aDowOjEwfSIpCisKKyAgZWxzZQorICAgICMgV2UncmUgb24gYSBwb3NpeCBwbGF0Zm9ybS4gSG9vcmF5ISA6KQorICAgIHBhdGg9IiRCT09UX0pESyIKKworICAgIGlmIHRlc3QgISAtZiAiJHBhdGgiICYmIHRlc3QgISAtZCAiJHBhdGgiOyB0aGVuCisgICAgICBhc19mbl9lcnJvciAkPyAiVGhlIHBhdGggb2YgQk9PVF9KREssIHdoaWNoIHJlc29sdmVzIGFzIFwiJHBhdGhcIiwgaXMgbm90IGZvdW5kLiIgIiRMSU5FTk8iIDUKKyAgICBmaQorCisgICAgaGFzX3NwYWNlPWAkRUNITyAiJHBhdGgiIHwgJEdSRVAgIiAiYAorICAgIGlmIHRlc3QgIngkaGFzX3NwYWNlIiAhPSB4OyB0aGVuCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSBwYXRoIG9mIEJPT1RfSkRLLCB3aGljaCByZXNvbHZlcyBhcyBcIiRwYXRoXCIsIGlzIGludmFsaWQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoZSBwYXRoIG9mIEJPT1RfSkRLLCB3aGljaCByZXNvbHZlcyBhcyBcIiRwYXRoXCIsIGlzIGludmFsaWQuIiA+JjY7fQorICAgICAgYXNfZm5fZXJyb3IgJD8gIlNwYWNlcyBhcmUgbm90IGFsbG93ZWQgaW4gdGhpcyBwYXRoLiIgIiRMSU5FTk8iIDUKKyAgICBmaQorICBmaQorCisgICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIEJvb3QgSkRLIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBCb290IEpESy4uLiAiID4mNjsgfQorICAgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJEJPT1RfSkRLIiA+JjUKKyRhc19lY2hvICIkQk9PVF9KREsiID4mNjsgfQorICAgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIEJvb3QgSkRLIHZlcnNpb24iID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgQm9vdCBKREsgdmVyc2lvbi4uLiAiID4mNjsgfQorICAgICAgICAgICAgICBCT09UX0pES19WRVJTSU9OPWAiJEJPT1RfSkRLL2Jpbi9qYXZhIiAtdmVyc2lvbiAyPiYxIHwgJFRSICdcblxyJyAnICAnYAorICAgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJEJPT1RfSkRLX1ZFUlNJT04iID4mNQorJGFzX2VjaG8gIiRCT09UX0pES19WRVJTSU9OIiA+JjY7IH0KKyAgICAgICAgICAgIGZpICMgZW5kIGNoZWNrIGpkayB2ZXJzaW9uCisgICAgICAgICAgZmkgIyBlbmQgY2hlY2sgcnQuamFyCisgICAgICAgIGZpICMgZW5kIGNoZWNrIGphdmFjCisgICAgICBmaSAjIGVuZCBjaGVjayBqYXZhCisgICAgZmkgIyBlbmQgY2hlY2sgYm9vdCBqZGsgZm91bmQKKyAgZmkKKworICAgIGRvbmUKKyAgZmkKKwogCiAgICAgIyBJZiBwcmV2aW91cyBzdGVwIGNsYWltZWQgdG8gaGF2ZSBmb3VuZCBhIEpESywgY2hlY2sgaXQgdG8gc2VlIGlmIGl0IHNlZW1zIHRvIGJlIHZhbGlkLgogICAgIGlmIHRlc3QgIngkQk9PVF9KREtfRk9VTkQiID0geG1heWJlOyB0aGVuCkBAIC05NzIwLDI2ICsxMzkzMSwxMzMgQEAKICAgICAgICAgICAgICAgIyBXZSdyZSBkb25lISA6LSkKICAgICAgICAgICAgICAgQk9PVF9KREtfRk9VTkQ9eWVzCiAKLSAgICAjIEZhaWwgd2l0aCBtZXNzYWdlIHRoZSBwYXRoIHRvIHRoZSBCb290IEpESyBpZiB2YXIgQk9PVF9KREsgY29udGFpbnMgYSBwYXRoIHdpdGggbm8gc3BhY2VzIGluIGl0LgotICAgICMgVW5sZXNzIG9uIFdpbmRvd3MsIHdoZXJlIHdlIGNhbiByZXdyaXRlIHRoZSBwYXRoLgotICAgIEhBU19TUEFDRT1gZWNobyAiJEJPT1RfSkRLIiB8IGdyZXAgIiAiYAotICAgIGlmIHRlc3QgIngkSEFTX1NQQUNFIiAhPSB4OyB0aGVuCi0gICAgICAgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PUyIgPSAieHdpbmRvd3MiOyB0aGVuCi0gICAgICAgICAgICAjIEZpcnN0IGNvbnZlcnQgaXQgdG8gRE9TLXN0eWxlLCBzaG9ydCBtb2RlIChubyBzcGFjZXMpCi0gICAgICAgICAgICBCT09UX0pESz1gJENZR1BBVEggLXMgLW0gLWEgIiRCT09UX0pESyJgCi0gICAgICAgICAgICAjIE5vdyBpdCdzIGNhc2UgaW5zZW5zaXRpdmU7IGxldCdzIG1ha2UgaXQgbG93ZXJjYXNlIHRvIGltcHJvdmUgcmVhZGFiaWxpdHkKLSAgICAgICAgICAgIEJPT1RfSkRLPWAkRUNITyAiJEJPT1RfSkRLIiB8ICRUUiAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2cXh5eidgCi0gICAgICAgICAgICAjIE5vdyBjb252ZXJ0IGl0IGJhY2sgdG8gVW5peC1zdGlsZSAoY3lncGF0aCkKLSAgICAgICAgICAgIEJPT1RfSkRLPWAkQ1lHUEFUSCAtdSAiJEJPT1RfSkRLImAKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgYXNfZm5fZXJyb3IgJD8gIllvdSBjYW5ub3QgaGF2ZSBzcGFjZXMgaW4gdGhlIHBhdGggdG8gdGhlIEJvb3QgSkRLISBcIiRCT09UX0pES1wiIiAiJExJTkVOTyIgNQotICAgICAgICBmaQorICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5jeWd3aW4iOyB0aGVuCisKKyAgIyBJbnB1dCBtaWdodCBiZSBnaXZlbiBhcyBXaW5kb3dzIGZvcm1hdCwgc3RhcnQgYnkgY29udmVydGluZyB0bworICAjIHVuaXggZm9ybWF0LgorICBwYXRoPSIkQk9PVF9KREsiCisgIG5ld19wYXRoPWAkQ1lHUEFUSCAtdSAiJHBhdGgiYAorCisgICMgQ3lnd2luIHRyaWVzIHRvIGhpZGUgc29tZSBhc3BlY3RzIG9mIHRoZSBXaW5kb3dzIGZpbGUgc3lzdGVtLCBzdWNoIHRoYXQgYmluYXJpZXMgYXJlCisgICMgbmFtZWQgLmV4ZSBidXQgY2FsbGVkIHdpdGhvdXQgdGhhdCBzdWZmaXguIFRoZXJlZm9yZSwgImZvbyIgYW5kICJmb28uZXhlIiBhcmUgY29uc2lkZXJlZAorICAjIHRoZSBzYW1lIGZpbGUsIG1vc3Qgb2YgdGhlIHRpbWUgKGFzIGluICJ0ZXN0IC1mIikuIEJ1dCBub3Qgd2hlbiBydW5uaW5nIGN5Z3BhdGggLXMsIHRoZW4KKyAgIyAiZm9vLmV4ZSIgaXMgT0sgYnV0ICJmb28iIGlzIGFuIGVycm9yLgorICAjCisgICMgVGhpcyB0ZXN0IGlzIHRoZXJlZm9yZSBzbGlnaHRseSBtb3JlIGFjY3VyYXRlIHRoYW4gInRlc3QgLWYiIHRvIGNoZWNrIGZvciBmaWxlIHByZWNlbnNlLgorICAjIEl0IGlzIGFsc28gYSB3YXkgdG8gbWFrZSBzdXJlIHdlIGdvdCB0aGUgcHJvcGVyIGZpbGUgbmFtZSBmb3IgdGhlIHJlYWwgdGVzdCBsYXRlciBvbi4KKyAgdGVzdF9zaG9ydHBhdGg9YCRDWUdQQVRIIC1zIC1tICIkbmV3X3BhdGgiIDI+IC9kZXYvbnVsbGAKKyAgaWYgdGVzdCAieCR0ZXN0X3Nob3J0cGF0aCIgPSB4OyB0aGVuCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUaGUgcGF0aCBvZiBCT09UX0pESywgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkcGF0aFwiLCBpcyBpbnZhbGlkLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUaGUgcGF0aCBvZiBCT09UX0pESywgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkcGF0aFwiLCBpcyBpbnZhbGlkLiIgPiY2O30KKyAgICBhc19mbl9lcnJvciAkPyAiQ2Fubm90IGxvY2F0ZSB0aGUgdGhlIHBhdGggb2YgQk9PVF9KREsiICIkTElORU5PIiA1CisgIGZpCisKKyAgIyBDYWxsIGhlbHBlciBmdW5jdGlvbiB3aGljaCBwb3NzaWJseSBjb252ZXJ0cyB0aGlzIHVzaW5nIERPUy1zdHlsZSBzaG9ydCBtb2RlLgorICAjIElmIHNvLCB0aGUgdXBkYXRlZCBwYXRoIGlzIHN0b3JlZCBpbiAkbmV3X3BhdGguCisKKyAgaW5wdXRfcGF0aD0iJG5ld19wYXRoIgorICAjIENoZWNrIGlmIHdlIG5lZWQgdG8gY29udmVydCB0aGlzIHVzaW5nIERPUy1zdHlsZSBzaG9ydCBtb2RlLiBJZiB0aGUgcGF0aAorICAjIGNvbnRhaW5zIGp1c3Qgc2ltcGxlIGNoYXJhY3RlcnMsIHVzZSBpdC4gT3RoZXJ3aXNlIChzcGFjZXMsIHdlaXJkIGNoYXJhY3RlcnMpLAorICAjIHRha2Ugbm8gY2hhbmNlcyBhbmQgcmV3cml0ZSBpdC4KKyAgIyBOb3RlOiBtNCBlYXRzIG91ciBbXSwgc28gd2UgbmVlZCB0byB1c2UgWyBhbmQgXSBpbnN0ZWFkLgorICBoYXNfZm9yYmlkZGVuX2NoYXJzPWAkRUNITyAiJGlucHV0X3BhdGgiIHwgJEdSRVAgW14tLl8vYS16QS1aMC05XWAKKyAgaWYgdGVzdCAieCRoYXNfZm9yYmlkZGVuX2NoYXJzIiAhPSB4OyB0aGVuCisgICAgIyBOb3cgY29udmVydCBpdCB0byBtaXhlZCBET1Mtc3R5bGUsIHNob3J0IG1vZGUgKG5vIHNwYWNlcywgYW5kIC8gaW5zdGVhZCBvZiBcKQorICAgIHNob3J0bW9kZV9wYXRoPWAkQ1lHUEFUSCAtcyAtbSAtYSAiJGlucHV0X3BhdGgiYAorICAgIHBhdGhfYWZ0ZXJfc2hvcnRtb2RlPWAkQ1lHUEFUSCAtdSAiJHNob3J0bW9kZV9wYXRoImAKKyAgICBpZiB0ZXN0ICJ4JHBhdGhfYWZ0ZXJfc2hvcnRtb2RlIiAhPSAieCRpbnB1dF90b19zaG9ydHBhdGgiOyB0aGVuCisgICAgICAjIEdvaW5nIHRvIHNob3J0IG1vZGUgYW5kIGJhY2sgYWdhaW4gZGlkIGluZGVlZCBtYXR0ZXIuIFNpbmNlIHNob3J0IG1vZGUgaXMKKyAgICAgICMgY2FzZSBpbnNlbnNpdGl2ZSwgbGV0J3MgbWFrZSBpdCBsb3dlcmNhc2UgdG8gaW1wcm92ZSByZWFkYWJpbGl0eS4KKyAgICAgIHNob3J0bW9kZV9wYXRoPWAkRUNITyAiJHNob3J0bW9kZV9wYXRoIiB8ICRUUiAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidgCisgICAgICAjIE5vdyBjb252ZXJ0IGl0IGJhY2sgdG8gVW5peC1zdGlsZSAoY3lncGF0aCkKKyAgICAgIGlucHV0X3BhdGg9YCRDWUdQQVRIIC11ICIkc2hvcnRtb2RlX3BhdGgiYAorICAgICAgbmV3X3BhdGg9IiRpbnB1dF9wYXRoIgogICAgIGZpCisgIGZpCisKKyAgdGVzdF9jeWdkcml2ZV9wcmVmaXg9YCRFQ0hPICRpbnB1dF9wYXRoIHwgJEdSRVAgXi9jeWdkcml2ZS9gCisgIGlmIHRlc3QgIngkdGVzdF9jeWdkcml2ZV9wcmVmaXgiID0geDsgdGhlbgorICAgICMgQXMgYSBzaW1wbGUgZml4LCBleGNsdWRlIC91c3IvYmluIHNpbmNlIGl0J3Mgbm90IGEgcmVhbCBwYXRoLgorICAgIGlmIHRlc3QgInhgJEVDSE8gJG5ld19wYXRoIHwgJEdSRVAgXi91c3IvYmluL2AiID0geDsgdGhlbgorICAgICAgIyBUaGUgcGF0aCBpcyBpbiBhIEN5Z3dpbiBzcGVjaWFsIGRpcmVjdG9yeSAoZS5nLiAvaG9tZSkuIFdlIG5lZWQgdGhpcyBjb252ZXJ0ZWQgdG8KKyAgICAgICMgYSBwYXRoIHByZWZpeGVkIGJ5IC9jeWdkcml2ZSBmb3IgZml4cGF0aCB0byB3b3JrLgorICAgICAgbmV3X3BhdGg9IiRDWUdXSU5fUk9PVF9QQVRIJGlucHV0X3BhdGgiCisgICAgZmkKKyAgZmkKKworCisgIGlmIHRlc3QgIngkcGF0aCIgIT0gIngkbmV3X3BhdGgiOyB0aGVuCisgICAgQk9PVF9KREs9IiRuZXdfcGF0aCIKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFJld3JpdGluZyBCT09UX0pESyB0byBcIiRuZXdfcGF0aFwiIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFJld3JpdGluZyBCT09UX0pESyB0byBcIiRuZXdfcGF0aFwiIiA+JjY7fQorICBmaQorCisgIGVsaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MubXN5cyI7IHRoZW4KKworICBwYXRoPSIkQk9PVF9KREsiCisgIGhhc19jb2xvbj1gJEVDSE8gJHBhdGggfCAkR1JFUCBeLjpgCisgIG5ld19wYXRoPSIkcGF0aCIKKyAgaWYgdGVzdCAieCRoYXNfY29sb24iID0geDsgdGhlbgorICAgICMgTm90IGluIG1peGVkIG9yIFdpbmRvd3Mgc3R5bGUsIHN0YXJ0IGJ5IHRoYXQuCisgICAgbmV3X3BhdGg9YGNtZCAvL2MgZWNobyAkcGF0aGAKKyAgZmkKKworCisgIGlucHV0X3BhdGg9IiRuZXdfcGF0aCIKKyAgIyBDaGVjayBpZiB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhpcyB1c2luZyBET1Mtc3R5bGUgc2hvcnQgbW9kZS4gSWYgdGhlIHBhdGgKKyAgIyBjb250YWlucyBqdXN0IHNpbXBsZSBjaGFyYWN0ZXJzLCB1c2UgaXQuIE90aGVyd2lzZSAoc3BhY2VzLCB3ZWlyZCBjaGFyYWN0ZXJzKSwKKyAgIyB0YWtlIG5vIGNoYW5jZXMgYW5kIHJld3JpdGUgaXQuCisgICMgTm90ZTogbTQgZWF0cyBvdXIgW10sIHNvIHdlIG5lZWQgdG8gdXNlIFsgYW5kIF0gaW5zdGVhZC4KKyAgaGFzX2ZvcmJpZGRlbl9jaGFycz1gJEVDSE8gIiRpbnB1dF9wYXRoIiB8ICRHUkVQIFteLV8vOmEtekEtWjAtOV1gCisgIGlmIHRlc3QgIngkaGFzX2ZvcmJpZGRlbl9jaGFycyIgIT0geDsgdGhlbgorICAgICMgTm93IGNvbnZlcnQgaXQgdG8gbWl4ZWQgRE9TLXN0eWxlLCBzaG9ydCBtb2RlIChubyBzcGFjZXMsIGFuZCAvIGluc3RlYWQgb2YgXCkKKyAgICBuZXdfcGF0aD1gY21kIC9jICJmb3IgJUEgaW4gKFwiJGlucHV0X3BhdGhcIikgZG8gQGVjaG8gJX5zQSJ8JFRSIFxcXFxcXFxcIC8gfCAkVFIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAorICBmaQorCisKKyAgd2luZG93c19wYXRoPSIkbmV3X3BhdGgiCisgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLmN5Z3dpbiI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRDWUdQQVRIIC11ICIkd2luZG93c19wYXRoImAKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJEVDSE8gIiR3aW5kb3dzX3BhdGgiIHwgJFNFRCAtZSAncyxeXFwoLlxcKTosL1xcMSxnJyAtZSAncyxcXFxcLC8sZydgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGZpCisKKyAgaWYgdGVzdCAieCRwYXRoIiAhPSAieCRuZXdfcGF0aCI7IHRoZW4KKyAgICBCT09UX0pESz0iJG5ld19wYXRoIgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogUmV3cml0aW5nIEJPT1RfSkRLIHRvIFwiJG5ld19wYXRoXCIiID4mNQorJGFzX2VjaG8gIiRhc19tZTogUmV3cml0aW5nIEJPT1RfSkRLIHRvIFwiJG5ld19wYXRoXCIiID4mNjt9CisgIGZpCisKKyAgIyBTYXZlIHRoZSBmaXJzdCAxMCBieXRlcyBvZiB0aGlzIHBhdGggdG8gdGhlIHN0b3JhZ2UsIHNvIGZpeHBhdGggY2FuIHdvcmsuCisgIGFsbF9maXhwYXRoX3ByZWZpeGVzPSgiJHthbGxfZml4cGF0aF9wcmVmaXhlc1tAXX0iICIke25ld19wYXRoOjA6MTB9IikKKworICBlbHNlCisgICAgIyBXZSdyZSBvbiBhIHBvc2l4IHBsYXRmb3JtLiBIb29yYXkhIDopCisgICAgcGF0aD0iJEJPT1RfSkRLIgorCisgICAgaWYgdGVzdCAhIC1mICIkcGF0aCIgJiYgdGVzdCAhIC1kICIkcGF0aCI7IHRoZW4KKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJUaGUgcGF0aCBvZiBCT09UX0pESywgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkcGF0aFwiLCBpcyBub3QgZm91bmQuIiAiJExJTkVOTyIgNQorICAgIGZpCisKKyAgICBoYXNfc3BhY2U9YCRFQ0hPICIkcGF0aCIgfCAkR1JFUCAiICJgCisgICAgaWYgdGVzdCAieCRoYXNfc3BhY2UiICE9IHg7IHRoZW4KKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGhlIHBhdGggb2YgQk9PVF9KREssIHdoaWNoIHJlc29sdmVzIGFzIFwiJHBhdGhcIiwgaXMgaW52YWxpZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhlIHBhdGggb2YgQk9PVF9KREssIHdoaWNoIHJlc29sdmVzIGFzIFwiJHBhdGhcIiwgaXMgaW52YWxpZC4iID4mNjt9CisgICAgICBhc19mbl9lcnJvciAkPyAiU3BhY2VzIGFyZSBub3QgYWxsb3dlZCBpbiB0aGlzIHBhdGguIiAiJExJTkVOTyIgNQorICAgIGZpCisgIGZpCiAKICAgICAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgQm9vdCBKREsiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIEJvb3QgSkRLLi4uICIgPiY2OyB9Ci0gICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQk9PVF9KREsgKCRCT09UX0pES19WRVJTSU9OKSIgPiY1Ci0kYXNfZWNobyAiJEJPT1RfSkRLICgkQk9PVF9KREtfVkVSU0lPTikiID4mNjsgfQorICAgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJEJPT1RfSkRLIiA+JjUKKyRhc19lY2hvICIkQk9PVF9KREsiID4mNjsgfQorICAgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIEJvb3QgSkRLIHZlcnNpb24iID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgQm9vdCBKREsgdmVyc2lvbi4uLiAiID4mNjsgfQorICAgICAgICAgICAgICBCT09UX0pES19WRVJTSU9OPWAiJEJPT1RfSkRLL2Jpbi9qYXZhIiAtdmVyc2lvbiAyPiYxIHwgJFRSICdcblxyJyAnICAnYAorICAgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJEJPT1RfSkRLX1ZFUlNJT04iID4mNQorJGFzX2VjaG8gIiRCT09UX0pES19WRVJTSU9OIiA+JjY7IH0KICAgICAgICAgICAgIGZpICMgZW5kIGNoZWNrIGpkayB2ZXJzaW9uCiAgICAgICAgICAgZmkgIyBlbmQgY2hlY2sgcnQuamFyCiAgICAgICAgIGZpICMgZW5kIGNoZWNrIGphdmFjCkBAIC05NzUzLDE2ICsxNDA3MSwxOTUgQEAKIAogICBCT09UX0pES19QUkVGSVg9Ii9TeXN0ZW0vTGlicmFyeS9KYXZhL0phdmFWaXJ0dWFsTWFjaGluZXMiCiAgIEJPT1RfSkRLX1NVRkZJWD0iL0NvbnRlbnRzL0hvbWUiCi0gIEJFU1RfSkRLX0ZPVU5EPWAkTFMgIiRCT09UX0pES19QUkVGSVgiIDI+IC9kZXYvbnVsbCB8ICRHUkVQIGpkayB8ICRTT1JUIC1yIHwgJEhFQUQgLW4gMSBgCi0gIGlmIHRlc3QgIngkQkVTVF9KREtfRk9VTkQiICE9IHg7IHRoZW4KLSAgICBCT09UX0pESz0iJHtCT09UX0pES19QUkVGSVh9LyR7QkVTVF9KREtfRk9VTkR9JHtCT09UX0pES19TVUZGSVh9IgotICAgIGlmIHRlc3QgLWQgIiRCT09UX0pESyI7IHRoZW4KLSAgICAgIEJPT1RfSkRLX0ZPVU5EPW1heWJlCi0gICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IEZvdW5kIHBvdGVudGlhbCBCb290IEpESyB1c2luZyB3ZWxsLWtub3duIGxvY2F0aW9ucyAoaW4gJEJPT1RfSkRLX1BSRUZJWCkiID4mNQotJGFzX2VjaG8gIiRhc19tZTogRm91bmQgcG90ZW50aWFsIEJvb3QgSkRLIHVzaW5nIHdlbGwta25vd24gbG9jYXRpb25zIChpbiAkQk9PVF9KREtfUFJFRklYKSIgPiY2O30KKyAgQUxMX0pES1NfRk9VTkQ9YCRMUyAiJEJPT1RfSkRLX1BSRUZJWCIgMj4gL2Rldi9udWxsIHwgJFNPUlQgLXJgCisgIGlmIHRlc3QgIngkQUxMX0pES1NfRk9VTkQiICE9IHg7IHRoZW4KKyAgICBmb3IgSkRLX1RPX1RSWSBpbiAkQUxMX0pES1NfRk9VTkQgOyBkbworCisgIGlmIHRlc3QgIngkQk9PVF9KREtfRk9VTkQiID0geG5vOyB0aGVuCisgICAgIyBOb3cgZXhlY3V0ZSB0aGUgdGVzdAorCisgICAgICAgIEJPT1RfSkRLPSIke0JPT1RfSkRLX1BSRUZJWH0vJHtKREtfVE9fVFJZfSR7Qk9PVF9KREtfU1VGRklYfSIKKyAgICAgICAgaWYgdGVzdCAtZCAiJEJPT1RfSkRLIjsgdGhlbgorICAgICAgICAgIEJPT1RfSkRLX0ZPVU5EPW1heWJlCisgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBGb3VuZCBwb3RlbnRpYWwgQm9vdCBKREsgdXNpbmcgd2VsbC1rbm93biBsb2NhdGlvbnMgKGluICRCT09UX0pES19QUkVGSVgvJEpES19UT19UUlkpIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IEZvdW5kIHBvdGVudGlhbCBCb290IEpESyB1c2luZyB3ZWxsLWtub3duIGxvY2F0aW9ucyAoaW4gJEJPT1RfSkRLX1BSRUZJWC8kSkRLX1RPX1RSWSkiID4mNjt9CisgICAgICAgIGZpCisKKworICAgICMgSWYgcHJldmlvdXMgc3RlcCBjbGFpbWVkIHRvIGhhdmUgZm91bmQgYSBKREssIGNoZWNrIGl0IHRvIHNlZSBpZiBpdCBzZWVtcyB0byBiZSB2YWxpZC4KKyAgICBpZiB0ZXN0ICJ4JEJPT1RfSkRLX0ZPVU5EIiA9IHhtYXliZTsgdGhlbgorICAgICAgIyBEbyB3ZSBoYXZlIGEgYmluL2phdmE/CisgICAgICBpZiB0ZXN0ICEgLXggIiRCT09UX0pESy9iaW4vamF2YSI7IHRoZW4KKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBQb3RlbnRpYWwgQm9vdCBKREsgZm91bmQgYXQgJEJPT1RfSkRLIGRpZCBub3QgY29udGFpbiBiaW4vamF2YTsgaWdub3JpbmciID4mNQorJGFzX2VjaG8gIiRhc19tZTogUG90ZW50aWFsIEJvb3QgSkRLIGZvdW5kIGF0ICRCT09UX0pESyBkaWQgbm90IGNvbnRhaW4gYmluL2phdmE7IGlnbm9yaW5nIiA+JjY7fQorICAgICAgICBCT09UX0pES19GT1VORD1ubworICAgICAgZWxzZQorICAgICAgICAjIERvIHdlIGhhdmUgYSBiaW4vamF2YWM/CisgICAgICAgIGlmIHRlc3QgISAteCAiJEJPT1RfSkRLL2Jpbi9qYXZhYyI7IHRoZW4KKyAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFBvdGVudGlhbCBCb290IEpESyBmb3VuZCBhdCAkQk9PVF9KREsgZGlkIG5vdCBjb250YWluIGJpbi9qYXZhYzsgaWdub3JpbmciID4mNQorJGFzX2VjaG8gIiRhc19tZTogUG90ZW50aWFsIEJvb3QgSkRLIGZvdW5kIGF0ICRCT09UX0pESyBkaWQgbm90IGNvbnRhaW4gYmluL2phdmFjOyBpZ25vcmluZyIgPiY2O30KKyAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IChUaGlzIG1pZ2h0IGJlIGFuIEpSRSBpbnN0ZWFkIG9mIGFuIEpESykiID4mNQorJGFzX2VjaG8gIiRhc19tZTogKFRoaXMgbWlnaHQgYmUgYW4gSlJFIGluc3RlYWQgb2YgYW4gSkRLKSIgPiY2O30KKyAgICAgICAgICBCT09UX0pES19GT1VORD1ubworICAgICAgICBlbHNlCisgICAgICAgICAgIyBEbyB3ZSBoYXZlIGFuIHJ0Lmphcj8gKE9uIE1hY09TWCBpdCBpcyBjYWxsZWQgY2xhc3Nlcy5qYXIpCisgICAgICAgICAgaWYgdGVzdCAhIC1mICIkQk9PVF9KREsvanJlL2xpYi9ydC5qYXIiICYmIHRlc3QgISAtZiAiJEJPT1RfSkRLLy4uL0NsYXNzZXMvY2xhc3Nlcy5qYXIiOyB0aGVuCisgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFBvdGVudGlhbCBCb290IEpESyBmb3VuZCBhdCAkQk9PVF9KREsgZGlkIG5vdCBjb250YWluIGFuIHJ0LmphcjsgaWdub3JpbmciID4mNQorJGFzX2VjaG8gIiRhc19tZTogUG90ZW50aWFsIEJvb3QgSkRLIGZvdW5kIGF0ICRCT09UX0pESyBkaWQgbm90IGNvbnRhaW4gYW4gcnQuamFyOyBpZ25vcmluZyIgPiY2O30KKyAgICAgICAgICAgIEJPT1RfSkRLX0ZPVU5EPW5vCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgIyBPaCwgdGhpcyBpcyBsb29raW5nIGdvb2QhIFdlIHByb2JhYmx5IGhhdmUgZm91bmQgYSBwcm9wZXIgSkRLLiBJcyBpdCB0aGUgY29ycmVjdCB2ZXJzaW9uPworICAgICAgICAgICAgQk9PVF9KREtfVkVSU0lPTj1gIiRCT09UX0pESy9iaW4vamF2YSIgLXZlcnNpb24gMj4mMSB8IGhlYWQgLW4gMWAKKworICAgICAgICAgICAgIyBFeHRyYSBNNCBxdW90ZSBuZWVkZWQgdG8gcHJvdGVjdCBbXSBpbiBncmVwIGV4cHJlc3Npb24uCisgICAgICAgICAgICBGT1VORF9WRVJTSU9OXzc4PWBlY2hvICRCT09UX0pES19WRVJTSU9OIHwgZ3JlcCAgJ1wiMVwuWzc4XVwuJ2AKKyAgICAgICAgICAgIGlmIHRlc3QgIngkRk9VTkRfVkVSU0lPTl83OCIgPSB4OyB0aGVuCisgICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogUG90ZW50aWFsIEJvb3QgSkRLIGZvdW5kIGF0ICRCT09UX0pESyBpcyBpbmNvcnJlY3QgSkRLIHZlcnNpb24gKCRCT09UX0pES19WRVJTSU9OKTsgaWdub3JpbmciID4mNQorJGFzX2VjaG8gIiRhc19tZTogUG90ZW50aWFsIEJvb3QgSkRLIGZvdW5kIGF0ICRCT09UX0pESyBpcyBpbmNvcnJlY3QgSkRLIHZlcnNpb24gKCRCT09UX0pES19WRVJTSU9OKTsgaWdub3JpbmciID4mNjt9CisgICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogKFlvdXIgQm9vdCBKREsgbXVzdCBiZSB2ZXJzaW9uIDcgb3IgOCkiID4mNQorJGFzX2VjaG8gIiRhc19tZTogKFlvdXIgQm9vdCBKREsgbXVzdCBiZSB2ZXJzaW9uIDcgb3IgOCkiID4mNjt9CisgICAgICAgICAgICAgIEJPT1RfSkRLX0ZPVU5EPW5vCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICMgV2UncmUgZG9uZSEgOi0pCisgICAgICAgICAgICAgIEJPT1RfSkRLX0ZPVU5EPXllcworCisgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLmN5Z3dpbiI7IHRoZW4KKworICAjIElucHV0IG1pZ2h0IGJlIGdpdmVuIGFzIFdpbmRvd3MgZm9ybWF0LCBzdGFydCBieSBjb252ZXJ0aW5nIHRvCisgICMgdW5peCBmb3JtYXQuCisgIHBhdGg9IiRCT09UX0pESyIKKyAgbmV3X3BhdGg9YCRDWUdQQVRIIC11ICIkcGF0aCJgCisKKyAgIyBDeWd3aW4gdHJpZXMgdG8gaGlkZSBzb21lIGFzcGVjdHMgb2YgdGhlIFdpbmRvd3MgZmlsZSBzeXN0ZW0sIHN1Y2ggdGhhdCBiaW5hcmllcyBhcmUKKyAgIyBuYW1lZCAuZXhlIGJ1dCBjYWxsZWQgd2l0aG91dCB0aGF0IHN1ZmZpeC4gVGhlcmVmb3JlLCAiZm9vIiBhbmQgImZvby5leGUiIGFyZSBjb25zaWRlcmVkCisgICMgdGhlIHNhbWUgZmlsZSwgbW9zdCBvZiB0aGUgdGltZSAoYXMgaW4gInRlc3QgLWYiKS4gQnV0IG5vdCB3aGVuIHJ1bm5pbmcgY3lncGF0aCAtcywgdGhlbgorICAjICJmb28uZXhlIiBpcyBPSyBidXQgImZvbyIgaXMgYW4gZXJyb3IuCisgICMKKyAgIyBUaGlzIHRlc3QgaXMgdGhlcmVmb3JlIHNsaWdodGx5IG1vcmUgYWNjdXJhdGUgdGhhbiAidGVzdCAtZiIgdG8gY2hlY2sgZm9yIGZpbGUgcHJlY2Vuc2UuCisgICMgSXQgaXMgYWxzbyBhIHdheSB0byBtYWtlIHN1cmUgd2UgZ290IHRoZSBwcm9wZXIgZmlsZSBuYW1lIGZvciB0aGUgcmVhbCB0ZXN0IGxhdGVyIG9uLgorICB0ZXN0X3Nob3J0cGF0aD1gJENZR1BBVEggLXMgLW0gIiRuZXdfcGF0aCIgMj4gL2Rldi9udWxsYAorICBpZiB0ZXN0ICJ4JHRlc3Rfc2hvcnRwYXRoIiA9IHg7IHRoZW4KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSBwYXRoIG9mIEJPT1RfSkRLLCB3aGljaCByZXNvbHZlcyBhcyBcIiRwYXRoXCIsIGlzIGludmFsaWQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoZSBwYXRoIG9mIEJPT1RfSkRLLCB3aGljaCByZXNvbHZlcyBhcyBcIiRwYXRoXCIsIGlzIGludmFsaWQuIiA+JjY7fQorICAgIGFzX2ZuX2Vycm9yICQ/ICJDYW5ub3QgbG9jYXRlIHRoZSB0aGUgcGF0aCBvZiBCT09UX0pESyIgIiRMSU5FTk8iIDUKKyAgZmkKKworICAjIENhbGwgaGVscGVyIGZ1bmN0aW9uIHdoaWNoIHBvc3NpYmx5IGNvbnZlcnRzIHRoaXMgdXNpbmcgRE9TLXN0eWxlIHNob3J0IG1vZGUuCisgICMgSWYgc28sIHRoZSB1cGRhdGVkIHBhdGggaXMgc3RvcmVkIGluICRuZXdfcGF0aC4KKworICBpbnB1dF9wYXRoPSIkbmV3X3BhdGgiCisgICMgQ2hlY2sgaWYgd2UgbmVlZCB0byBjb252ZXJ0IHRoaXMgdXNpbmcgRE9TLXN0eWxlIHNob3J0IG1vZGUuIElmIHRoZSBwYXRoCisgICMgY29udGFpbnMganVzdCBzaW1wbGUgY2hhcmFjdGVycywgdXNlIGl0LiBPdGhlcndpc2UgKHNwYWNlcywgd2VpcmQgY2hhcmFjdGVycyksCisgICMgdGFrZSBubyBjaGFuY2VzIGFuZCByZXdyaXRlIGl0LgorICAjIE5vdGU6IG00IGVhdHMgb3VyIFtdLCBzbyB3ZSBuZWVkIHRvIHVzZSBbIGFuZCBdIGluc3RlYWQuCisgIGhhc19mb3JiaWRkZW5fY2hhcnM9YCRFQ0hPICIkaW5wdXRfcGF0aCIgfCAkR1JFUCBbXi0uXy9hLXpBLVowLTldYAorICBpZiB0ZXN0ICJ4JGhhc19mb3JiaWRkZW5fY2hhcnMiICE9IHg7IHRoZW4KKyAgICAjIE5vdyBjb252ZXJ0IGl0IHRvIG1peGVkIERPUy1zdHlsZSwgc2hvcnQgbW9kZSAobm8gc3BhY2VzLCBhbmQgLyBpbnN0ZWFkIG9mIFwpCisgICAgc2hvcnRtb2RlX3BhdGg9YCRDWUdQQVRIIC1zIC1tIC1hICIkaW5wdXRfcGF0aCJgCisgICAgcGF0aF9hZnRlcl9zaG9ydG1vZGU9YCRDWUdQQVRIIC11ICIkc2hvcnRtb2RlX3BhdGgiYAorICAgIGlmIHRlc3QgIngkcGF0aF9hZnRlcl9zaG9ydG1vZGUiICE9ICJ4JGlucHV0X3RvX3Nob3J0cGF0aCI7IHRoZW4KKyAgICAgICMgR29pbmcgdG8gc2hvcnQgbW9kZSBhbmQgYmFjayBhZ2FpbiBkaWQgaW5kZWVkIG1hdHRlci4gU2luY2Ugc2hvcnQgbW9kZSBpcworICAgICAgIyBjYXNlIGluc2Vuc2l0aXZlLCBsZXQncyBtYWtlIGl0IGxvd2VyY2FzZSB0byBpbXByb3ZlIHJlYWRhYmlsaXR5LgorICAgICAgc2hvcnRtb2RlX3BhdGg9YCRFQ0hPICIkc2hvcnRtb2RlX3BhdGgiIHwgJFRSICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J2AKKyAgICAgICMgTm93IGNvbnZlcnQgaXQgYmFjayB0byBVbml4LXN0aWxlIChjeWdwYXRoKQorICAgICAgaW5wdXRfcGF0aD1gJENZR1BBVEggLXUgIiRzaG9ydG1vZGVfcGF0aCJgCisgICAgICBuZXdfcGF0aD0iJGlucHV0X3BhdGgiCiAgICAgZmkKICAgZmkKIAorICB0ZXN0X2N5Z2RyaXZlX3ByZWZpeD1gJEVDSE8gJGlucHV0X3BhdGggfCAkR1JFUCBeL2N5Z2RyaXZlL2AKKyAgaWYgdGVzdCAieCR0ZXN0X2N5Z2RyaXZlX3ByZWZpeCIgPSB4OyB0aGVuCisgICAgIyBBcyBhIHNpbXBsZSBmaXgsIGV4Y2x1ZGUgL3Vzci9iaW4gc2luY2UgaXQncyBub3QgYSByZWFsIHBhdGguCisgICAgaWYgdGVzdCAieGAkRUNITyAkbmV3X3BhdGggfCAkR1JFUCBeL3Vzci9iaW4vYCIgPSB4OyB0aGVuCisgICAgICAjIFRoZSBwYXRoIGlzIGluIGEgQ3lnd2luIHNwZWNpYWwgZGlyZWN0b3J5IChlLmcuIC9ob21lKS4gV2UgbmVlZCB0aGlzIGNvbnZlcnRlZCB0bworICAgICAgIyBhIHBhdGggcHJlZml4ZWQgYnkgL2N5Z2RyaXZlIGZvciBmaXhwYXRoIHRvIHdvcmsuCisgICAgICBuZXdfcGF0aD0iJENZR1dJTl9ST09UX1BBVEgkaW5wdXRfcGF0aCIKKyAgICBmaQorICBmaQorCisKKyAgaWYgdGVzdCAieCRwYXRoIiAhPSAieCRuZXdfcGF0aCI7IHRoZW4KKyAgICBCT09UX0pESz0iJG5ld19wYXRoIgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogUmV3cml0aW5nIEJPT1RfSkRLIHRvIFwiJG5ld19wYXRoXCIiID4mNQorJGFzX2VjaG8gIiRhc19tZTogUmV3cml0aW5nIEJPT1RfSkRLIHRvIFwiJG5ld19wYXRoXCIiID4mNjt9CisgIGZpCisKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorCisgIHBhdGg9IiRCT09UX0pESyIKKyAgaGFzX2NvbG9uPWAkRUNITyAkcGF0aCB8ICRHUkVQIF4uOmAKKyAgbmV3X3BhdGg9IiRwYXRoIgorICBpZiB0ZXN0ICJ4JGhhc19jb2xvbiIgPSB4OyB0aGVuCisgICAgIyBOb3QgaW4gbWl4ZWQgb3IgV2luZG93cyBzdHlsZSwgc3RhcnQgYnkgdGhhdC4KKyAgICBuZXdfcGF0aD1gY21kIC8vYyBlY2hvICRwYXRoYAorICBmaQorCisKKyAgaW5wdXRfcGF0aD0iJG5ld19wYXRoIgorICAjIENoZWNrIGlmIHdlIG5lZWQgdG8gY29udmVydCB0aGlzIHVzaW5nIERPUy1zdHlsZSBzaG9ydCBtb2RlLiBJZiB0aGUgcGF0aAorICAjIGNvbnRhaW5zIGp1c3Qgc2ltcGxlIGNoYXJhY3RlcnMsIHVzZSBpdC4gT3RoZXJ3aXNlIChzcGFjZXMsIHdlaXJkIGNoYXJhY3RlcnMpLAorICAjIHRha2Ugbm8gY2hhbmNlcyBhbmQgcmV3cml0ZSBpdC4KKyAgIyBOb3RlOiBtNCBlYXRzIG91ciBbXSwgc28gd2UgbmVlZCB0byB1c2UgWyBhbmQgXSBpbnN0ZWFkLgorICBoYXNfZm9yYmlkZGVuX2NoYXJzPWAkRUNITyAiJGlucHV0X3BhdGgiIHwgJEdSRVAgW14tXy86YS16QS1aMC05XWAKKyAgaWYgdGVzdCAieCRoYXNfZm9yYmlkZGVuX2NoYXJzIiAhPSB4OyB0aGVuCisgICAgIyBOb3cgY29udmVydCBpdCB0byBtaXhlZCBET1Mtc3R5bGUsIHNob3J0IG1vZGUgKG5vIHNwYWNlcywgYW5kIC8gaW5zdGVhZCBvZiBcKQorICAgIG5ld19wYXRoPWBjbWQgL2MgImZvciAlQSBpbiAoXCIkaW5wdXRfcGF0aFwiKSBkbyBAZWNobyAlfnNBInwkVFIgXFxcXFxcXFwgLyB8ICRUUiAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidgCisgIGZpCisKKworICB3aW5kb3dzX3BhdGg9IiRuZXdfcGF0aCIKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJENZR1BBVEggLXUgIiR3aW5kb3dzX3BhdGgiYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBlbGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLm1zeXMiOyB0aGVuCisgICAgdW5peF9wYXRoPWAkRUNITyAiJHdpbmRvd3NfcGF0aCIgfCAkU0VEIC1lICdzLF5cXCguXFwpOiwvXFwxLGcnIC1lICdzLFxcXFwsLyxnJ2AKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZmkKKworICBpZiB0ZXN0ICJ4JHBhdGgiICE9ICJ4JG5ld19wYXRoIjsgdGhlbgorICAgIEJPT1RfSkRLPSIkbmV3X3BhdGgiCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBSZXdyaXRpbmcgQk9PVF9KREsgdG8gXCIkbmV3X3BhdGhcIiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBSZXdyaXRpbmcgQk9PVF9KREsgdG8gXCIkbmV3X3BhdGhcIiIgPiY2O30KKyAgZmkKKworICAjIFNhdmUgdGhlIGZpcnN0IDEwIGJ5dGVzIG9mIHRoaXMgcGF0aCB0byB0aGUgc3RvcmFnZSwgc28gZml4cGF0aCBjYW4gd29yay4KKyAgYWxsX2ZpeHBhdGhfcHJlZml4ZXM9KCIke2FsbF9maXhwYXRoX3ByZWZpeGVzW0BdfSIgIiR7bmV3X3BhdGg6MDoxMH0iKQorCisgIGVsc2UKKyAgICAjIFdlJ3JlIG9uIGEgcG9zaXggcGxhdGZvcm0uIEhvb3JheSEgOikKKyAgICBwYXRoPSIkQk9PVF9KREsiCisKKyAgICBpZiB0ZXN0ICEgLWYgIiRwYXRoIiAmJiB0ZXN0ICEgLWQgIiRwYXRoIjsgdGhlbgorICAgICAgYXNfZm5fZXJyb3IgJD8gIlRoZSBwYXRoIG9mIEJPT1RfSkRLLCB3aGljaCByZXNvbHZlcyBhcyBcIiRwYXRoXCIsIGlzIG5vdCBmb3VuZC4iICIkTElORU5PIiA1CisgICAgZmkKKworICAgIGhhc19zcGFjZT1gJEVDSE8gIiRwYXRoIiB8ICRHUkVQICIgImAKKyAgICBpZiB0ZXN0ICJ4JGhhc19zcGFjZSIgIT0geDsgdGhlbgorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUaGUgcGF0aCBvZiBCT09UX0pESywgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkcGF0aFwiLCBpcyBpbnZhbGlkLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUaGUgcGF0aCBvZiBCT09UX0pESywgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkcGF0aFwiLCBpcyBpbnZhbGlkLiIgPiY2O30KKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJTcGFjZXMgYXJlIG5vdCBhbGxvd2VkIGluIHRoaXMgcGF0aC4iICIkTElORU5PIiA1CisgICAgZmkKKyAgZmkKKworICAgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBCb290IEpESyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgQm9vdCBKREsuLi4gIiA+JjY7IH0KKyAgICAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRCT09UX0pESyIgPiY1CiskYXNfZWNobyAiJEJPT1RfSkRLIiA+JjY7IH0KKyAgICAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBCb290IEpESyB2ZXJzaW9uIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIEJvb3QgSkRLIHZlcnNpb24uLi4gIiA+JjY7IH0KKyAgICAgICAgICAgICAgQk9PVF9KREtfVkVSU0lPTj1gIiRCT09UX0pESy9iaW4vamF2YSIgLXZlcnNpb24gMj4mMSB8ICRUUiAnXG5ccicgJyAgJ2AKKyAgICAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRCT09UX0pES19WRVJTSU9OIiA+JjUKKyRhc19lY2hvICIkQk9PVF9KREtfVkVSU0lPTiIgPiY2OyB9CisgICAgICAgICAgICBmaSAjIGVuZCBjaGVjayBqZGsgdmVyc2lvbgorICAgICAgICAgIGZpICMgZW5kIGNoZWNrIHJ0LmphcgorICAgICAgICBmaSAjIGVuZCBjaGVjayBqYXZhYworICAgICAgZmkgIyBlbmQgY2hlY2sgamF2YQorICAgIGZpICMgZW5kIGNoZWNrIGJvb3QgamRrIGZvdW5kCisgIGZpCisKKyAgICBkb25lCisgIGZpCisKIAogICAgICMgSWYgcHJldmlvdXMgc3RlcCBjbGFpbWVkIHRvIGhhdmUgZm91bmQgYSBKREssIGNoZWNrIGl0IHRvIHNlZSBpZiBpdCBzZWVtcyB0byBiZSB2YWxpZC4KICAgICBpZiB0ZXN0ICJ4JEJPT1RfSkRLX0ZPVU5EIiA9IHhtYXliZTsgdGhlbgpAQCAtOTgwMSwyNiArMTQyOTgsNTAxIEBACiAgICAgICAgICAgICAgICMgV2UncmUgZG9uZSEgOi0pCiAgICAgICAgICAgICAgIEJPT1RfSkRLX0ZPVU5EPXllcwogCi0gICAgIyBGYWlsIHdpdGggbWVzc2FnZSB0aGUgcGF0aCB0byB0aGUgQm9vdCBKREsgaWYgdmFyIEJPT1RfSkRLIGNvbnRhaW5zIGEgcGF0aCB3aXRoIG5vIHNwYWNlcyBpbiBpdC4KLSAgICAjIFVubGVzcyBvbiBXaW5kb3dzLCB3aGVyZSB3ZSBjYW4gcmV3cml0ZSB0aGUgcGF0aC4KLSAgICBIQVNfU1BBQ0U9YGVjaG8gIiRCT09UX0pESyIgfCBncmVwICIgImAKLSAgICBpZiB0ZXN0ICJ4JEhBU19TUEFDRSIgIT0geDsgdGhlbgotICAgICAgICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1MiID0gInh3aW5kb3dzIjsgdGhlbgotICAgICAgICAgICAgIyBGaXJzdCBjb252ZXJ0IGl0IHRvIERPUy1zdHlsZSwgc2hvcnQgbW9kZSAobm8gc3BhY2VzKQotICAgICAgICAgICAgQk9PVF9KREs9YCRDWUdQQVRIIC1zIC1tIC1hICIkQk9PVF9KREsiYAotICAgICAgICAgICAgIyBOb3cgaXQncyBjYXNlIGluc2Vuc2l0aXZlOyBsZXQncyBtYWtlIGl0IGxvd2VyY2FzZSB0byBpbXByb3ZlIHJlYWRhYmlsaXR5Ci0gICAgICAgICAgICBCT09UX0pESz1gJEVDSE8gIiRCT09UX0pESyIgfCAkVFIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnF4eXonYAotICAgICAgICAgICAgIyBOb3cgY29udmVydCBpdCBiYWNrIHRvIFVuaXgtc3RpbGUgKGN5Z3BhdGgpCi0gICAgICAgICAgICBCT09UX0pESz1gJENZR1BBVEggLXUgIiRCT09UX0pESyJgCi0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGFzX2ZuX2Vycm9yICQ/ICJZb3UgY2Fubm90IGhhdmUgc3BhY2VzIGluIHRoZSBwYXRoIHRvIHRoZSBCb290IEpESyEgXCIkQk9PVF9KREtcIiIgIiRMSU5FTk8iIDUKLSAgICAgICAgZmkKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorCisgICMgSW5wdXQgbWlnaHQgYmUgZ2l2ZW4gYXMgV2luZG93cyBmb3JtYXQsIHN0YXJ0IGJ5IGNvbnZlcnRpbmcgdG8KKyAgIyB1bml4IGZvcm1hdC4KKyAgcGF0aD0iJEJPT1RfSkRLIgorICBuZXdfcGF0aD1gJENZR1BBVEggLXUgIiRwYXRoImAKKworICAjIEN5Z3dpbiB0cmllcyB0byBoaWRlIHNvbWUgYXNwZWN0cyBvZiB0aGUgV2luZG93cyBmaWxlIHN5c3RlbSwgc3VjaCB0aGF0IGJpbmFyaWVzIGFyZQorICAjIG5hbWVkIC5leGUgYnV0IGNhbGxlZCB3aXRob3V0IHRoYXQgc3VmZml4LiBUaGVyZWZvcmUsICJmb28iIGFuZCAiZm9vLmV4ZSIgYXJlIGNvbnNpZGVyZWQKKyAgIyB0aGUgc2FtZSBmaWxlLCBtb3N0IG9mIHRoZSB0aW1lIChhcyBpbiAidGVzdCAtZiIpLiBCdXQgbm90IHdoZW4gcnVubmluZyBjeWdwYXRoIC1zLCB0aGVuCisgICMgImZvby5leGUiIGlzIE9LIGJ1dCAiZm9vIiBpcyBhbiBlcnJvci4KKyAgIworICAjIFRoaXMgdGVzdCBpcyB0aGVyZWZvcmUgc2xpZ2h0bHkgbW9yZSBhY2N1cmF0ZSB0aGFuICJ0ZXN0IC1mIiB0byBjaGVjayBmb3IgZmlsZSBwcmVjZW5zZS4KKyAgIyBJdCBpcyBhbHNvIGEgd2F5IHRvIG1ha2Ugc3VyZSB3ZSBnb3QgdGhlIHByb3BlciBmaWxlIG5hbWUgZm9yIHRoZSByZWFsIHRlc3QgbGF0ZXIgb24uCisgIHRlc3Rfc2hvcnRwYXRoPWAkQ1lHUEFUSCAtcyAtbSAiJG5ld19wYXRoIiAyPiAvZGV2L251bGxgCisgIGlmIHRlc3QgIngkdGVzdF9zaG9ydHBhdGgiID0geDsgdGhlbgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGhlIHBhdGggb2YgQk9PVF9KREssIHdoaWNoIHJlc29sdmVzIGFzIFwiJHBhdGhcIiwgaXMgaW52YWxpZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhlIHBhdGggb2YgQk9PVF9KREssIHdoaWNoIHJlc29sdmVzIGFzIFwiJHBhdGhcIiwgaXMgaW52YWxpZC4iID4mNjt9CisgICAgYXNfZm5fZXJyb3IgJD8gIkNhbm5vdCBsb2NhdGUgdGhlIHRoZSBwYXRoIG9mIEJPT1RfSkRLIiAiJExJTkVOTyIgNQorICBmaQorCisgICMgQ2FsbCBoZWxwZXIgZnVuY3Rpb24gd2hpY2ggcG9zc2libHkgY29udmVydHMgdGhpcyB1c2luZyBET1Mtc3R5bGUgc2hvcnQgbW9kZS4KKyAgIyBJZiBzbywgdGhlIHVwZGF0ZWQgcGF0aCBpcyBzdG9yZWQgaW4gJG5ld19wYXRoLgorCisgIGlucHV0X3BhdGg9IiRuZXdfcGF0aCIKKyAgIyBDaGVjayBpZiB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhpcyB1c2luZyBET1Mtc3R5bGUgc2hvcnQgbW9kZS4gSWYgdGhlIHBhdGgKKyAgIyBjb250YWlucyBqdXN0IHNpbXBsZSBjaGFyYWN0ZXJzLCB1c2UgaXQuIE90aGVyd2lzZSAoc3BhY2VzLCB3ZWlyZCBjaGFyYWN0ZXJzKSwKKyAgIyB0YWtlIG5vIGNoYW5jZXMgYW5kIHJld3JpdGUgaXQuCisgICMgTm90ZTogbTQgZWF0cyBvdXIgW10sIHNvIHdlIG5lZWQgdG8gdXNlIFsgYW5kIF0gaW5zdGVhZC4KKyAgaGFzX2ZvcmJpZGRlbl9jaGFycz1gJEVDSE8gIiRpbnB1dF9wYXRoIiB8ICRHUkVQIFteLS5fL2EtekEtWjAtOV1gCisgIGlmIHRlc3QgIngkaGFzX2ZvcmJpZGRlbl9jaGFycyIgIT0geDsgdGhlbgorICAgICMgTm93IGNvbnZlcnQgaXQgdG8gbWl4ZWQgRE9TLXN0eWxlLCBzaG9ydCBtb2RlIChubyBzcGFjZXMsIGFuZCAvIGluc3RlYWQgb2YgXCkKKyAgICBzaG9ydG1vZGVfcGF0aD1gJENZR1BBVEggLXMgLW0gLWEgIiRpbnB1dF9wYXRoImAKKyAgICBwYXRoX2FmdGVyX3Nob3J0bW9kZT1gJENZR1BBVEggLXUgIiRzaG9ydG1vZGVfcGF0aCJgCisgICAgaWYgdGVzdCAieCRwYXRoX2FmdGVyX3Nob3J0bW9kZSIgIT0gIngkaW5wdXRfdG9fc2hvcnRwYXRoIjsgdGhlbgorICAgICAgIyBHb2luZyB0byBzaG9ydCBtb2RlIGFuZCBiYWNrIGFnYWluIGRpZCBpbmRlZWQgbWF0dGVyLiBTaW5jZSBzaG9ydCBtb2RlIGlzCisgICAgICAjIGNhc2UgaW5zZW5zaXRpdmUsIGxldCdzIG1ha2UgaXQgbG93ZXJjYXNlIHRvIGltcHJvdmUgcmVhZGFiaWxpdHkuCisgICAgICBzaG9ydG1vZGVfcGF0aD1gJEVDSE8gIiRzaG9ydG1vZGVfcGF0aCIgfCAkVFIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAorICAgICAgIyBOb3cgY29udmVydCBpdCBiYWNrIHRvIFVuaXgtc3RpbGUgKGN5Z3BhdGgpCisgICAgICBpbnB1dF9wYXRoPWAkQ1lHUEFUSCAtdSAiJHNob3J0bW9kZV9wYXRoImAKKyAgICAgIG5ld19wYXRoPSIkaW5wdXRfcGF0aCIKICAgICBmaQorICBmaQorCisgIHRlc3RfY3lnZHJpdmVfcHJlZml4PWAkRUNITyAkaW5wdXRfcGF0aCB8ICRHUkVQIF4vY3lnZHJpdmUvYAorICBpZiB0ZXN0ICJ4JHRlc3RfY3lnZHJpdmVfcHJlZml4IiA9IHg7IHRoZW4KKyAgICAjIEFzIGEgc2ltcGxlIGZpeCwgZXhjbHVkZSAvdXNyL2JpbiBzaW5jZSBpdCdzIG5vdCBhIHJlYWwgcGF0aC4KKyAgICBpZiB0ZXN0ICJ4YCRFQ0hPICRuZXdfcGF0aCB8ICRHUkVQIF4vdXNyL2Jpbi9gIiA9IHg7IHRoZW4KKyAgICAgICMgVGhlIHBhdGggaXMgaW4gYSBDeWd3aW4gc3BlY2lhbCBkaXJlY3RvcnkgKGUuZy4gL2hvbWUpLiBXZSBuZWVkIHRoaXMgY29udmVydGVkIHRvCisgICAgICAjIGEgcGF0aCBwcmVmaXhlZCBieSAvY3lnZHJpdmUgZm9yIGZpeHBhdGggdG8gd29yay4KKyAgICAgIG5ld19wYXRoPSIkQ1lHV0lOX1JPT1RfUEFUSCRpbnB1dF9wYXRoIgorICAgIGZpCisgIGZpCisKKworICBpZiB0ZXN0ICJ4JHBhdGgiICE9ICJ4JG5ld19wYXRoIjsgdGhlbgorICAgIEJPT1RfSkRLPSIkbmV3X3BhdGgiCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBSZXdyaXRpbmcgQk9PVF9KREsgdG8gXCIkbmV3X3BhdGhcIiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBSZXdyaXRpbmcgQk9PVF9KREsgdG8gXCIkbmV3X3BhdGhcIiIgPiY2O30KKyAgZmkKKworICBlbGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLm1zeXMiOyB0aGVuCisKKyAgcGF0aD0iJEJPT1RfSkRLIgorICBoYXNfY29sb249YCRFQ0hPICRwYXRoIHwgJEdSRVAgXi46YAorICBuZXdfcGF0aD0iJHBhdGgiCisgIGlmIHRlc3QgIngkaGFzX2NvbG9uIiA9IHg7IHRoZW4KKyAgICAjIE5vdCBpbiBtaXhlZCBvciBXaW5kb3dzIHN0eWxlLCBzdGFydCBieSB0aGF0LgorICAgIG5ld19wYXRoPWBjbWQgLy9jIGVjaG8gJHBhdGhgCisgIGZpCisKKworICBpbnB1dF9wYXRoPSIkbmV3X3BhdGgiCisgICMgQ2hlY2sgaWYgd2UgbmVlZCB0byBjb252ZXJ0IHRoaXMgdXNpbmcgRE9TLXN0eWxlIHNob3J0IG1vZGUuIElmIHRoZSBwYXRoCisgICMgY29udGFpbnMganVzdCBzaW1wbGUgY2hhcmFjdGVycywgdXNlIGl0LiBPdGhlcndpc2UgKHNwYWNlcywgd2VpcmQgY2hhcmFjdGVycyksCisgICMgdGFrZSBubyBjaGFuY2VzIGFuZCByZXdyaXRlIGl0LgorICAjIE5vdGU6IG00IGVhdHMgb3VyIFtdLCBzbyB3ZSBuZWVkIHRvIHVzZSBbIGFuZCBdIGluc3RlYWQuCisgIGhhc19mb3JiaWRkZW5fY2hhcnM9YCRFQ0hPICIkaW5wdXRfcGF0aCIgfCAkR1JFUCBbXi1fLzphLXpBLVowLTldYAorICBpZiB0ZXN0ICJ4JGhhc19mb3JiaWRkZW5fY2hhcnMiICE9IHg7IHRoZW4KKyAgICAjIE5vdyBjb252ZXJ0IGl0IHRvIG1peGVkIERPUy1zdHlsZSwgc2hvcnQgbW9kZSAobm8gc3BhY2VzLCBhbmQgLyBpbnN0ZWFkIG9mIFwpCisgICAgbmV3X3BhdGg9YGNtZCAvYyAiZm9yICVBIGluIChcIiRpbnB1dF9wYXRoXCIpIGRvIEBlY2hvICV+c0EifCRUUiBcXFxcXFxcXCAvIHwgJFRSICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J2AKKyAgZmkKKworCisgIHdpbmRvd3NfcGF0aD0iJG5ld19wYXRoIgorICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5jeWd3aW4iOyB0aGVuCisgICAgdW5peF9wYXRoPWAkQ1lHUEFUSCAtdSAiJHdpbmRvd3NfcGF0aCJgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGVsaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MubXN5cyI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRFQ0hPICIkd2luZG93c19wYXRoIiB8ICRTRUQgLWUgJ3MsXlxcKC5cXCk6LC9cXDEsZycgLWUgJ3MsXFxcXCwvLGcnYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBmaQorCisgIGlmIHRlc3QgIngkcGF0aCIgIT0gIngkbmV3X3BhdGgiOyB0aGVuCisgICAgQk9PVF9KREs9IiRuZXdfcGF0aCIKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFJld3JpdGluZyBCT09UX0pESyB0byBcIiRuZXdfcGF0aFwiIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFJld3JpdGluZyBCT09UX0pESyB0byBcIiRuZXdfcGF0aFwiIiA+JjY7fQorICBmaQorCisgICMgU2F2ZSB0aGUgZmlyc3QgMTAgYnl0ZXMgb2YgdGhpcyBwYXRoIHRvIHRoZSBzdG9yYWdlLCBzbyBmaXhwYXRoIGNhbiB3b3JrLgorICBhbGxfZml4cGF0aF9wcmVmaXhlcz0oIiR7YWxsX2ZpeHBhdGhfcHJlZml4ZXNbQF19IiAiJHtuZXdfcGF0aDowOjEwfSIpCisKKyAgZWxzZQorICAgICMgV2UncmUgb24gYSBwb3NpeCBwbGF0Zm9ybS4gSG9vcmF5ISA6KQorICAgIHBhdGg9IiRCT09UX0pESyIKKworICAgIGlmIHRlc3QgISAtZiAiJHBhdGgiICYmIHRlc3QgISAtZCAiJHBhdGgiOyB0aGVuCisgICAgICBhc19mbl9lcnJvciAkPyAiVGhlIHBhdGggb2YgQk9PVF9KREssIHdoaWNoIHJlc29sdmVzIGFzIFwiJHBhdGhcIiwgaXMgbm90IGZvdW5kLiIgIiRMSU5FTk8iIDUKKyAgICBmaQorCisgICAgaGFzX3NwYWNlPWAkRUNITyAiJHBhdGgiIHwgJEdSRVAgIiAiYAorICAgIGlmIHRlc3QgIngkaGFzX3NwYWNlIiAhPSB4OyB0aGVuCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSBwYXRoIG9mIEJPT1RfSkRLLCB3aGljaCByZXNvbHZlcyBhcyBcIiRwYXRoXCIsIGlzIGludmFsaWQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoZSBwYXRoIG9mIEJPT1RfSkRLLCB3aGljaCByZXNvbHZlcyBhcyBcIiRwYXRoXCIsIGlzIGludmFsaWQuIiA+JjY7fQorICAgICAgYXNfZm5fZXJyb3IgJD8gIlNwYWNlcyBhcmUgbm90IGFsbG93ZWQgaW4gdGhpcyBwYXRoLiIgIiRMSU5FTk8iIDUKKyAgICBmaQorICBmaQogCiAgICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIEJvb3QgSkRLIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGZvciBCb290IEpESy4uLiAiID4mNjsgfQotICAgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJEJPT1RfSkRLICgkQk9PVF9KREtfVkVSU0lPTikiID4mNQotJGFzX2VjaG8gIiRCT09UX0pESyAoJEJPT1RfSkRLX1ZFUlNJT04pIiA+JjY7IH0KKyAgICAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRCT09UX0pESyIgPiY1CiskYXNfZWNobyAiJEJPT1RfSkRLIiA+JjY7IH0KKyAgICAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBCb290IEpESyB2ZXJzaW9uIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIEJvb3QgSkRLIHZlcnNpb24uLi4gIiA+JjY7IH0KKyAgICAgICAgICAgICAgQk9PVF9KREtfVkVSU0lPTj1gIiRCT09UX0pESy9iaW4vamF2YSIgLXZlcnNpb24gMj4mMSB8ICRUUiAnXG5ccicgJyAgJ2AKKyAgICAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRCT09UX0pES19WRVJTSU9OIiA+JjUKKyRhc19lY2hvICIkQk9PVF9KREtfVkVSU0lPTiIgPiY2OyB9CisgICAgICAgICAgICBmaSAjIGVuZCBjaGVjayBqZGsgdmVyc2lvbgorICAgICAgICAgIGZpICMgZW5kIGNoZWNrIHJ0LmphcgorICAgICAgICBmaSAjIGVuZCBjaGVjayBqYXZhYworICAgICAgZmkgIyBlbmQgY2hlY2sgamF2YQorICAgIGZpICMgZW5kIGNoZWNrIGJvb3QgamRrIGZvdW5kCisgIGZpCisKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfVEFSR0VUX09TIiA9IHhsaW51eDsgdGhlbgorCisgIGlmIHRlc3QgIngkQk9PVF9KREtfRk9VTkQiID0geG5vOyB0aGVuCisgICAgIyBOb3cgZXhlY3V0ZSB0aGUgdGVzdAorCisgIEJPT1RfSkRLX1BSRUZJWD0iL3Vzci9saWIvanZtIgorICBCT09UX0pES19TVUZGSVg9IiIKKyAgQUxMX0pES1NfRk9VTkQ9YCRMUyAiJEJPT1RfSkRLX1BSRUZJWCIgMj4gL2Rldi9udWxsIHwgJFNPUlQgLXJgCisgIGlmIHRlc3QgIngkQUxMX0pES1NfRk9VTkQiICE9IHg7IHRoZW4KKyAgICBmb3IgSkRLX1RPX1RSWSBpbiAkQUxMX0pES1NfRk9VTkQgOyBkbworCisgIGlmIHRlc3QgIngkQk9PVF9KREtfRk9VTkQiID0geG5vOyB0aGVuCisgICAgIyBOb3cgZXhlY3V0ZSB0aGUgdGVzdAorCisgICAgICAgIEJPT1RfSkRLPSIke0JPT1RfSkRLX1BSRUZJWH0vJHtKREtfVE9fVFJZfSR7Qk9PVF9KREtfU1VGRklYfSIKKyAgICAgICAgaWYgdGVzdCAtZCAiJEJPT1RfSkRLIjsgdGhlbgorICAgICAgICAgIEJPT1RfSkRLX0ZPVU5EPW1heWJlCisgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBGb3VuZCBwb3RlbnRpYWwgQm9vdCBKREsgdXNpbmcgd2VsbC1rbm93biBsb2NhdGlvbnMgKGluICRCT09UX0pES19QUkVGSVgvJEpES19UT19UUlkpIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IEZvdW5kIHBvdGVudGlhbCBCb290IEpESyB1c2luZyB3ZWxsLWtub3duIGxvY2F0aW9ucyAoaW4gJEJPT1RfSkRLX1BSRUZJWC8kSkRLX1RPX1RSWSkiID4mNjt9CisgICAgICAgIGZpCisKKworICAgICMgSWYgcHJldmlvdXMgc3RlcCBjbGFpbWVkIHRvIGhhdmUgZm91bmQgYSBKREssIGNoZWNrIGl0IHRvIHNlZSBpZiBpdCBzZWVtcyB0byBiZSB2YWxpZC4KKyAgICBpZiB0ZXN0ICJ4JEJPT1RfSkRLX0ZPVU5EIiA9IHhtYXliZTsgdGhlbgorICAgICAgIyBEbyB3ZSBoYXZlIGEgYmluL2phdmE/CisgICAgICBpZiB0ZXN0ICEgLXggIiRCT09UX0pESy9iaW4vamF2YSI7IHRoZW4KKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBQb3RlbnRpYWwgQm9vdCBKREsgZm91bmQgYXQgJEJPT1RfSkRLIGRpZCBub3QgY29udGFpbiBiaW4vamF2YTsgaWdub3JpbmciID4mNQorJGFzX2VjaG8gIiRhc19tZTogUG90ZW50aWFsIEJvb3QgSkRLIGZvdW5kIGF0ICRCT09UX0pESyBkaWQgbm90IGNvbnRhaW4gYmluL2phdmE7IGlnbm9yaW5nIiA+JjY7fQorICAgICAgICBCT09UX0pES19GT1VORD1ubworICAgICAgZWxzZQorICAgICAgICAjIERvIHdlIGhhdmUgYSBiaW4vamF2YWM/CisgICAgICAgIGlmIHRlc3QgISAteCAiJEJPT1RfSkRLL2Jpbi9qYXZhYyI7IHRoZW4KKyAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFBvdGVudGlhbCBCb290IEpESyBmb3VuZCBhdCAkQk9PVF9KREsgZGlkIG5vdCBjb250YWluIGJpbi9qYXZhYzsgaWdub3JpbmciID4mNQorJGFzX2VjaG8gIiRhc19tZTogUG90ZW50aWFsIEJvb3QgSkRLIGZvdW5kIGF0ICRCT09UX0pESyBkaWQgbm90IGNvbnRhaW4gYmluL2phdmFjOyBpZ25vcmluZyIgPiY2O30KKyAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IChUaGlzIG1pZ2h0IGJlIGFuIEpSRSBpbnN0ZWFkIG9mIGFuIEpESykiID4mNQorJGFzX2VjaG8gIiRhc19tZTogKFRoaXMgbWlnaHQgYmUgYW4gSlJFIGluc3RlYWQgb2YgYW4gSkRLKSIgPiY2O30KKyAgICAgICAgICBCT09UX0pES19GT1VORD1ubworICAgICAgICBlbHNlCisgICAgICAgICAgIyBEbyB3ZSBoYXZlIGFuIHJ0Lmphcj8gKE9uIE1hY09TWCBpdCBpcyBjYWxsZWQgY2xhc3Nlcy5qYXIpCisgICAgICAgICAgaWYgdGVzdCAhIC1mICIkQk9PVF9KREsvanJlL2xpYi9ydC5qYXIiICYmIHRlc3QgISAtZiAiJEJPT1RfSkRLLy4uL0NsYXNzZXMvY2xhc3Nlcy5qYXIiOyB0aGVuCisgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFBvdGVudGlhbCBCb290IEpESyBmb3VuZCBhdCAkQk9PVF9KREsgZGlkIG5vdCBjb250YWluIGFuIHJ0LmphcjsgaWdub3JpbmciID4mNQorJGFzX2VjaG8gIiRhc19tZTogUG90ZW50aWFsIEJvb3QgSkRLIGZvdW5kIGF0ICRCT09UX0pESyBkaWQgbm90IGNvbnRhaW4gYW4gcnQuamFyOyBpZ25vcmluZyIgPiY2O30KKyAgICAgICAgICAgIEJPT1RfSkRLX0ZPVU5EPW5vCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgIyBPaCwgdGhpcyBpcyBsb29raW5nIGdvb2QhIFdlIHByb2JhYmx5IGhhdmUgZm91bmQgYSBwcm9wZXIgSkRLLiBJcyBpdCB0aGUgY29ycmVjdCB2ZXJzaW9uPworICAgICAgICAgICAgQk9PVF9KREtfVkVSU0lPTj1gIiRCT09UX0pESy9iaW4vamF2YSIgLXZlcnNpb24gMj4mMSB8IGhlYWQgLW4gMWAKKworICAgICAgICAgICAgIyBFeHRyYSBNNCBxdW90ZSBuZWVkZWQgdG8gcHJvdGVjdCBbXSBpbiBncmVwIGV4cHJlc3Npb24uCisgICAgICAgICAgICBGT1VORF9WRVJTSU9OXzc4PWBlY2hvICRCT09UX0pES19WRVJTSU9OIHwgZ3JlcCAgJ1wiMVwuWzc4XVwuJ2AKKyAgICAgICAgICAgIGlmIHRlc3QgIngkRk9VTkRfVkVSU0lPTl83OCIgPSB4OyB0aGVuCisgICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogUG90ZW50aWFsIEJvb3QgSkRLIGZvdW5kIGF0ICRCT09UX0pESyBpcyBpbmNvcnJlY3QgSkRLIHZlcnNpb24gKCRCT09UX0pES19WRVJTSU9OKTsgaWdub3JpbmciID4mNQorJGFzX2VjaG8gIiRhc19tZTogUG90ZW50aWFsIEJvb3QgSkRLIGZvdW5kIGF0ICRCT09UX0pESyBpcyBpbmNvcnJlY3QgSkRLIHZlcnNpb24gKCRCT09UX0pES19WRVJTSU9OKTsgaWdub3JpbmciID4mNjt9CisgICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogKFlvdXIgQm9vdCBKREsgbXVzdCBiZSB2ZXJzaW9uIDcgb3IgOCkiID4mNQorJGFzX2VjaG8gIiRhc19tZTogKFlvdXIgQm9vdCBKREsgbXVzdCBiZSB2ZXJzaW9uIDcgb3IgOCkiID4mNjt9CisgICAgICAgICAgICAgIEJPT1RfSkRLX0ZPVU5EPW5vCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICMgV2UncmUgZG9uZSEgOi0pCisgICAgICAgICAgICAgIEJPT1RfSkRLX0ZPVU5EPXllcworCisgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLmN5Z3dpbiI7IHRoZW4KKworICAjIElucHV0IG1pZ2h0IGJlIGdpdmVuIGFzIFdpbmRvd3MgZm9ybWF0LCBzdGFydCBieSBjb252ZXJ0aW5nIHRvCisgICMgdW5peCBmb3JtYXQuCisgIHBhdGg9IiRCT09UX0pESyIKKyAgbmV3X3BhdGg9YCRDWUdQQVRIIC11ICIkcGF0aCJgCisKKyAgIyBDeWd3aW4gdHJpZXMgdG8gaGlkZSBzb21lIGFzcGVjdHMgb2YgdGhlIFdpbmRvd3MgZmlsZSBzeXN0ZW0sIHN1Y2ggdGhhdCBiaW5hcmllcyBhcmUKKyAgIyBuYW1lZCAuZXhlIGJ1dCBjYWxsZWQgd2l0aG91dCB0aGF0IHN1ZmZpeC4gVGhlcmVmb3JlLCAiZm9vIiBhbmQgImZvby5leGUiIGFyZSBjb25zaWRlcmVkCisgICMgdGhlIHNhbWUgZmlsZSwgbW9zdCBvZiB0aGUgdGltZSAoYXMgaW4gInRlc3QgLWYiKS4gQnV0IG5vdCB3aGVuIHJ1bm5pbmcgY3lncGF0aCAtcywgdGhlbgorICAjICJmb28uZXhlIiBpcyBPSyBidXQgImZvbyIgaXMgYW4gZXJyb3IuCisgICMKKyAgIyBUaGlzIHRlc3QgaXMgdGhlcmVmb3JlIHNsaWdodGx5IG1vcmUgYWNjdXJhdGUgdGhhbiAidGVzdCAtZiIgdG8gY2hlY2sgZm9yIGZpbGUgcHJlY2Vuc2UuCisgICMgSXQgaXMgYWxzbyBhIHdheSB0byBtYWtlIHN1cmUgd2UgZ290IHRoZSBwcm9wZXIgZmlsZSBuYW1lIGZvciB0aGUgcmVhbCB0ZXN0IGxhdGVyIG9uLgorICB0ZXN0X3Nob3J0cGF0aD1gJENZR1BBVEggLXMgLW0gIiRuZXdfcGF0aCIgMj4gL2Rldi9udWxsYAorICBpZiB0ZXN0ICJ4JHRlc3Rfc2hvcnRwYXRoIiA9IHg7IHRoZW4KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSBwYXRoIG9mIEJPT1RfSkRLLCB3aGljaCByZXNvbHZlcyBhcyBcIiRwYXRoXCIsIGlzIGludmFsaWQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoZSBwYXRoIG9mIEJPT1RfSkRLLCB3aGljaCByZXNvbHZlcyBhcyBcIiRwYXRoXCIsIGlzIGludmFsaWQuIiA+JjY7fQorICAgIGFzX2ZuX2Vycm9yICQ/ICJDYW5ub3QgbG9jYXRlIHRoZSB0aGUgcGF0aCBvZiBCT09UX0pESyIgIiRMSU5FTk8iIDUKKyAgZmkKKworICAjIENhbGwgaGVscGVyIGZ1bmN0aW9uIHdoaWNoIHBvc3NpYmx5IGNvbnZlcnRzIHRoaXMgdXNpbmcgRE9TLXN0eWxlIHNob3J0IG1vZGUuCisgICMgSWYgc28sIHRoZSB1cGRhdGVkIHBhdGggaXMgc3RvcmVkIGluICRuZXdfcGF0aC4KKworICBpbnB1dF9wYXRoPSIkbmV3X3BhdGgiCisgICMgQ2hlY2sgaWYgd2UgbmVlZCB0byBjb252ZXJ0IHRoaXMgdXNpbmcgRE9TLXN0eWxlIHNob3J0IG1vZGUuIElmIHRoZSBwYXRoCisgICMgY29udGFpbnMganVzdCBzaW1wbGUgY2hhcmFjdGVycywgdXNlIGl0LiBPdGhlcndpc2UgKHNwYWNlcywgd2VpcmQgY2hhcmFjdGVycyksCisgICMgdGFrZSBubyBjaGFuY2VzIGFuZCByZXdyaXRlIGl0LgorICAjIE5vdGU6IG00IGVhdHMgb3VyIFtdLCBzbyB3ZSBuZWVkIHRvIHVzZSBbIGFuZCBdIGluc3RlYWQuCisgIGhhc19mb3JiaWRkZW5fY2hhcnM9YCRFQ0hPICIkaW5wdXRfcGF0aCIgfCAkR1JFUCBbXi0uXy9hLXpBLVowLTldYAorICBpZiB0ZXN0ICJ4JGhhc19mb3JiaWRkZW5fY2hhcnMiICE9IHg7IHRoZW4KKyAgICAjIE5vdyBjb252ZXJ0IGl0IHRvIG1peGVkIERPUy1zdHlsZSwgc2hvcnQgbW9kZSAobm8gc3BhY2VzLCBhbmQgLyBpbnN0ZWFkIG9mIFwpCisgICAgc2hvcnRtb2RlX3BhdGg9YCRDWUdQQVRIIC1zIC1tIC1hICIkaW5wdXRfcGF0aCJgCisgICAgcGF0aF9hZnRlcl9zaG9ydG1vZGU9YCRDWUdQQVRIIC11ICIkc2hvcnRtb2RlX3BhdGgiYAorICAgIGlmIHRlc3QgIngkcGF0aF9hZnRlcl9zaG9ydG1vZGUiICE9ICJ4JGlucHV0X3RvX3Nob3J0cGF0aCI7IHRoZW4KKyAgICAgICMgR29pbmcgdG8gc2hvcnQgbW9kZSBhbmQgYmFjayBhZ2FpbiBkaWQgaW5kZWVkIG1hdHRlci4gU2luY2Ugc2hvcnQgbW9kZSBpcworICAgICAgIyBjYXNlIGluc2Vuc2l0aXZlLCBsZXQncyBtYWtlIGl0IGxvd2VyY2FzZSB0byBpbXByb3ZlIHJlYWRhYmlsaXR5LgorICAgICAgc2hvcnRtb2RlX3BhdGg9YCRFQ0hPICIkc2hvcnRtb2RlX3BhdGgiIHwgJFRSICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J2AKKyAgICAgICMgTm93IGNvbnZlcnQgaXQgYmFjayB0byBVbml4LXN0aWxlIChjeWdwYXRoKQorICAgICAgaW5wdXRfcGF0aD1gJENZR1BBVEggLXUgIiRzaG9ydG1vZGVfcGF0aCJgCisgICAgICBuZXdfcGF0aD0iJGlucHV0X3BhdGgiCisgICAgZmkKKyAgZmkKKworICB0ZXN0X2N5Z2RyaXZlX3ByZWZpeD1gJEVDSE8gJGlucHV0X3BhdGggfCAkR1JFUCBeL2N5Z2RyaXZlL2AKKyAgaWYgdGVzdCAieCR0ZXN0X2N5Z2RyaXZlX3ByZWZpeCIgPSB4OyB0aGVuCisgICAgIyBBcyBhIHNpbXBsZSBmaXgsIGV4Y2x1ZGUgL3Vzci9iaW4gc2luY2UgaXQncyBub3QgYSByZWFsIHBhdGguCisgICAgaWYgdGVzdCAieGAkRUNITyAkbmV3X3BhdGggfCAkR1JFUCBeL3Vzci9iaW4vYCIgPSB4OyB0aGVuCisgICAgICAjIFRoZSBwYXRoIGlzIGluIGEgQ3lnd2luIHNwZWNpYWwgZGlyZWN0b3J5IChlLmcuIC9ob21lKS4gV2UgbmVlZCB0aGlzIGNvbnZlcnRlZCB0bworICAgICAgIyBhIHBhdGggcHJlZml4ZWQgYnkgL2N5Z2RyaXZlIGZvciBmaXhwYXRoIHRvIHdvcmsuCisgICAgICBuZXdfcGF0aD0iJENZR1dJTl9ST09UX1BBVEgkaW5wdXRfcGF0aCIKKyAgICBmaQorICBmaQorCisKKyAgaWYgdGVzdCAieCRwYXRoIiAhPSAieCRuZXdfcGF0aCI7IHRoZW4KKyAgICBCT09UX0pESz0iJG5ld19wYXRoIgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogUmV3cml0aW5nIEJPT1RfSkRLIHRvIFwiJG5ld19wYXRoXCIiID4mNQorJGFzX2VjaG8gIiRhc19tZTogUmV3cml0aW5nIEJPT1RfSkRLIHRvIFwiJG5ld19wYXRoXCIiID4mNjt9CisgIGZpCisKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorCisgIHBhdGg9IiRCT09UX0pESyIKKyAgaGFzX2NvbG9uPWAkRUNITyAkcGF0aCB8ICRHUkVQIF4uOmAKKyAgbmV3X3BhdGg9IiRwYXRoIgorICBpZiB0ZXN0ICJ4JGhhc19jb2xvbiIgPSB4OyB0aGVuCisgICAgIyBOb3QgaW4gbWl4ZWQgb3IgV2luZG93cyBzdHlsZSwgc3RhcnQgYnkgdGhhdC4KKyAgICBuZXdfcGF0aD1gY21kIC8vYyBlY2hvICRwYXRoYAorICBmaQorCisKKyAgaW5wdXRfcGF0aD0iJG5ld19wYXRoIgorICAjIENoZWNrIGlmIHdlIG5lZWQgdG8gY29udmVydCB0aGlzIHVzaW5nIERPUy1zdHlsZSBzaG9ydCBtb2RlLiBJZiB0aGUgcGF0aAorICAjIGNvbnRhaW5zIGp1c3Qgc2ltcGxlIGNoYXJhY3RlcnMsIHVzZSBpdC4gT3RoZXJ3aXNlIChzcGFjZXMsIHdlaXJkIGNoYXJhY3RlcnMpLAorICAjIHRha2Ugbm8gY2hhbmNlcyBhbmQgcmV3cml0ZSBpdC4KKyAgIyBOb3RlOiBtNCBlYXRzIG91ciBbXSwgc28gd2UgbmVlZCB0byB1c2UgWyBhbmQgXSBpbnN0ZWFkLgorICBoYXNfZm9yYmlkZGVuX2NoYXJzPWAkRUNITyAiJGlucHV0X3BhdGgiIHwgJEdSRVAgW14tXy86YS16QS1aMC05XWAKKyAgaWYgdGVzdCAieCRoYXNfZm9yYmlkZGVuX2NoYXJzIiAhPSB4OyB0aGVuCisgICAgIyBOb3cgY29udmVydCBpdCB0byBtaXhlZCBET1Mtc3R5bGUsIHNob3J0IG1vZGUgKG5vIHNwYWNlcywgYW5kIC8gaW5zdGVhZCBvZiBcKQorICAgIG5ld19wYXRoPWBjbWQgL2MgImZvciAlQSBpbiAoXCIkaW5wdXRfcGF0aFwiKSBkbyBAZWNobyAlfnNBInwkVFIgXFxcXFxcXFwgLyB8ICRUUiAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidgCisgIGZpCisKKworICB3aW5kb3dzX3BhdGg9IiRuZXdfcGF0aCIKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJENZR1BBVEggLXUgIiR3aW5kb3dzX3BhdGgiYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBlbGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLm1zeXMiOyB0aGVuCisgICAgdW5peF9wYXRoPWAkRUNITyAiJHdpbmRvd3NfcGF0aCIgfCAkU0VEIC1lICdzLF5cXCguXFwpOiwvXFwxLGcnIC1lICdzLFxcXFwsLyxnJ2AKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZmkKKworICBpZiB0ZXN0ICJ4JHBhdGgiICE9ICJ4JG5ld19wYXRoIjsgdGhlbgorICAgIEJPT1RfSkRLPSIkbmV3X3BhdGgiCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBSZXdyaXRpbmcgQk9PVF9KREsgdG8gXCIkbmV3X3BhdGhcIiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBSZXdyaXRpbmcgQk9PVF9KREsgdG8gXCIkbmV3X3BhdGhcIiIgPiY2O30KKyAgZmkKKworICAjIFNhdmUgdGhlIGZpcnN0IDEwIGJ5dGVzIG9mIHRoaXMgcGF0aCB0byB0aGUgc3RvcmFnZSwgc28gZml4cGF0aCBjYW4gd29yay4KKyAgYWxsX2ZpeHBhdGhfcHJlZml4ZXM9KCIke2FsbF9maXhwYXRoX3ByZWZpeGVzW0BdfSIgIiR7bmV3X3BhdGg6MDoxMH0iKQorCisgIGVsc2UKKyAgICAjIFdlJ3JlIG9uIGEgcG9zaXggcGxhdGZvcm0uIEhvb3JheSEgOikKKyAgICBwYXRoPSIkQk9PVF9KREsiCisKKyAgICBpZiB0ZXN0ICEgLWYgIiRwYXRoIiAmJiB0ZXN0ICEgLWQgIiRwYXRoIjsgdGhlbgorICAgICAgYXNfZm5fZXJyb3IgJD8gIlRoZSBwYXRoIG9mIEJPT1RfSkRLLCB3aGljaCByZXNvbHZlcyBhcyBcIiRwYXRoXCIsIGlzIG5vdCBmb3VuZC4iICIkTElORU5PIiA1CisgICAgZmkKKworICAgIGhhc19zcGFjZT1gJEVDSE8gIiRwYXRoIiB8ICRHUkVQICIgImAKKyAgICBpZiB0ZXN0ICJ4JGhhc19zcGFjZSIgIT0geDsgdGhlbgorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUaGUgcGF0aCBvZiBCT09UX0pESywgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkcGF0aFwiLCBpcyBpbnZhbGlkLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUaGUgcGF0aCBvZiBCT09UX0pESywgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkcGF0aFwiLCBpcyBpbnZhbGlkLiIgPiY2O30KKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJTcGFjZXMgYXJlIG5vdCBhbGxvd2VkIGluIHRoaXMgcGF0aC4iICIkTElORU5PIiA1CisgICAgZmkKKyAgZmkKKworICAgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBCb290IEpESyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgQm9vdCBKREsuLi4gIiA+JjY7IH0KKyAgICAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRCT09UX0pESyIgPiY1CiskYXNfZWNobyAiJEJPT1RfSkRLIiA+JjY7IH0KKyAgICAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBCb290IEpESyB2ZXJzaW9uIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIEJvb3QgSkRLIHZlcnNpb24uLi4gIiA+JjY7IH0KKyAgICAgICAgICAgICAgQk9PVF9KREtfVkVSU0lPTj1gIiRCT09UX0pESy9iaW4vamF2YSIgLXZlcnNpb24gMj4mMSB8ICRUUiAnXG5ccicgJyAgJ2AKKyAgICAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRCT09UX0pES19WRVJTSU9OIiA+JjUKKyRhc19lY2hvICIkQk9PVF9KREtfVkVSU0lPTiIgPiY2OyB9CisgICAgICAgICAgICBmaSAjIGVuZCBjaGVjayBqZGsgdmVyc2lvbgorICAgICAgICAgIGZpICMgZW5kIGNoZWNrIHJ0LmphcgorICAgICAgICBmaSAjIGVuZCBjaGVjayBqYXZhYworICAgICAgZmkgIyBlbmQgY2hlY2sgamF2YQorICAgIGZpICMgZW5kIGNoZWNrIGJvb3QgamRrIGZvdW5kCisgIGZpCisKKyAgICBkb25lCisgIGZpCisKKworICAgICMgSWYgcHJldmlvdXMgc3RlcCBjbGFpbWVkIHRvIGhhdmUgZm91bmQgYSBKREssIGNoZWNrIGl0IHRvIHNlZSBpZiBpdCBzZWVtcyB0byBiZSB2YWxpZC4KKyAgICBpZiB0ZXN0ICJ4JEJPT1RfSkRLX0ZPVU5EIiA9IHhtYXliZTsgdGhlbgorICAgICAgIyBEbyB3ZSBoYXZlIGEgYmluL2phdmE/CisgICAgICBpZiB0ZXN0ICEgLXggIiRCT09UX0pESy9iaW4vamF2YSI7IHRoZW4KKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBQb3RlbnRpYWwgQm9vdCBKREsgZm91bmQgYXQgJEJPT1RfSkRLIGRpZCBub3QgY29udGFpbiBiaW4vamF2YTsgaWdub3JpbmciID4mNQorJGFzX2VjaG8gIiRhc19tZTogUG90ZW50aWFsIEJvb3QgSkRLIGZvdW5kIGF0ICRCT09UX0pESyBkaWQgbm90IGNvbnRhaW4gYmluL2phdmE7IGlnbm9yaW5nIiA+JjY7fQorICAgICAgICBCT09UX0pES19GT1VORD1ubworICAgICAgZWxzZQorICAgICAgICAjIERvIHdlIGhhdmUgYSBiaW4vamF2YWM/CisgICAgICAgIGlmIHRlc3QgISAteCAiJEJPT1RfSkRLL2Jpbi9qYXZhYyI7IHRoZW4KKyAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFBvdGVudGlhbCBCb290IEpESyBmb3VuZCBhdCAkQk9PVF9KREsgZGlkIG5vdCBjb250YWluIGJpbi9qYXZhYzsgaWdub3JpbmciID4mNQorJGFzX2VjaG8gIiRhc19tZTogUG90ZW50aWFsIEJvb3QgSkRLIGZvdW5kIGF0ICRCT09UX0pESyBkaWQgbm90IGNvbnRhaW4gYmluL2phdmFjOyBpZ25vcmluZyIgPiY2O30KKyAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IChUaGlzIG1pZ2h0IGJlIGFuIEpSRSBpbnN0ZWFkIG9mIGFuIEpESykiID4mNQorJGFzX2VjaG8gIiRhc19tZTogKFRoaXMgbWlnaHQgYmUgYW4gSlJFIGluc3RlYWQgb2YgYW4gSkRLKSIgPiY2O30KKyAgICAgICAgICBCT09UX0pES19GT1VORD1ubworICAgICAgICBlbHNlCisgICAgICAgICAgIyBEbyB3ZSBoYXZlIGFuIHJ0Lmphcj8gKE9uIE1hY09TWCBpdCBpcyBjYWxsZWQgY2xhc3Nlcy5qYXIpCisgICAgICAgICAgaWYgdGVzdCAhIC1mICIkQk9PVF9KREsvanJlL2xpYi9ydC5qYXIiICYmIHRlc3QgISAtZiAiJEJPT1RfSkRLLy4uL0NsYXNzZXMvY2xhc3Nlcy5qYXIiOyB0aGVuCisgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFBvdGVudGlhbCBCb290IEpESyBmb3VuZCBhdCAkQk9PVF9KREsgZGlkIG5vdCBjb250YWluIGFuIHJ0LmphcjsgaWdub3JpbmciID4mNQorJGFzX2VjaG8gIiRhc19tZTogUG90ZW50aWFsIEJvb3QgSkRLIGZvdW5kIGF0ICRCT09UX0pESyBkaWQgbm90IGNvbnRhaW4gYW4gcnQuamFyOyBpZ25vcmluZyIgPiY2O30KKyAgICAgICAgICAgIEJPT1RfSkRLX0ZPVU5EPW5vCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgIyBPaCwgdGhpcyBpcyBsb29raW5nIGdvb2QhIFdlIHByb2JhYmx5IGhhdmUgZm91bmQgYSBwcm9wZXIgSkRLLiBJcyBpdCB0aGUgY29ycmVjdCB2ZXJzaW9uPworICAgICAgICAgICAgQk9PVF9KREtfVkVSU0lPTj1gIiRCT09UX0pESy9iaW4vamF2YSIgLXZlcnNpb24gMj4mMSB8IGhlYWQgLW4gMWAKKworICAgICAgICAgICAgIyBFeHRyYSBNNCBxdW90ZSBuZWVkZWQgdG8gcHJvdGVjdCBbXSBpbiBncmVwIGV4cHJlc3Npb24uCisgICAgICAgICAgICBGT1VORF9WRVJTSU9OXzc4PWBlY2hvICRCT09UX0pES19WRVJTSU9OIHwgZ3JlcCAgJ1wiMVwuWzc4XVwuJ2AKKyAgICAgICAgICAgIGlmIHRlc3QgIngkRk9VTkRfVkVSU0lPTl83OCIgPSB4OyB0aGVuCisgICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogUG90ZW50aWFsIEJvb3QgSkRLIGZvdW5kIGF0ICRCT09UX0pESyBpcyBpbmNvcnJlY3QgSkRLIHZlcnNpb24gKCRCT09UX0pES19WRVJTSU9OKTsgaWdub3JpbmciID4mNQorJGFzX2VjaG8gIiRhc19tZTogUG90ZW50aWFsIEJvb3QgSkRLIGZvdW5kIGF0ICRCT09UX0pESyBpcyBpbmNvcnJlY3QgSkRLIHZlcnNpb24gKCRCT09UX0pES19WRVJTSU9OKTsgaWdub3JpbmciID4mNjt9CisgICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogKFlvdXIgQm9vdCBKREsgbXVzdCBiZSB2ZXJzaW9uIDcgb3IgOCkiID4mNQorJGFzX2VjaG8gIiRhc19tZTogKFlvdXIgQm9vdCBKREsgbXVzdCBiZSB2ZXJzaW9uIDcgb3IgOCkiID4mNjt9CisgICAgICAgICAgICAgIEJPT1RfSkRLX0ZPVU5EPW5vCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICMgV2UncmUgZG9uZSEgOi0pCisgICAgICAgICAgICAgIEJPT1RfSkRLX0ZPVU5EPXllcworCisgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLmN5Z3dpbiI7IHRoZW4KKworICAjIElucHV0IG1pZ2h0IGJlIGdpdmVuIGFzIFdpbmRvd3MgZm9ybWF0LCBzdGFydCBieSBjb252ZXJ0aW5nIHRvCisgICMgdW5peCBmb3JtYXQuCisgIHBhdGg9IiRCT09UX0pESyIKKyAgbmV3X3BhdGg9YCRDWUdQQVRIIC11ICIkcGF0aCJgCisKKyAgIyBDeWd3aW4gdHJpZXMgdG8gaGlkZSBzb21lIGFzcGVjdHMgb2YgdGhlIFdpbmRvd3MgZmlsZSBzeXN0ZW0sIHN1Y2ggdGhhdCBiaW5hcmllcyBhcmUKKyAgIyBuYW1lZCAuZXhlIGJ1dCBjYWxsZWQgd2l0aG91dCB0aGF0IHN1ZmZpeC4gVGhlcmVmb3JlLCAiZm9vIiBhbmQgImZvby5leGUiIGFyZSBjb25zaWRlcmVkCisgICMgdGhlIHNhbWUgZmlsZSwgbW9zdCBvZiB0aGUgdGltZSAoYXMgaW4gInRlc3QgLWYiKS4gQnV0IG5vdCB3aGVuIHJ1bm5pbmcgY3lncGF0aCAtcywgdGhlbgorICAjICJmb28uZXhlIiBpcyBPSyBidXQgImZvbyIgaXMgYW4gZXJyb3IuCisgICMKKyAgIyBUaGlzIHRlc3QgaXMgdGhlcmVmb3JlIHNsaWdodGx5IG1vcmUgYWNjdXJhdGUgdGhhbiAidGVzdCAtZiIgdG8gY2hlY2sgZm9yIGZpbGUgcHJlY2Vuc2UuCisgICMgSXQgaXMgYWxzbyBhIHdheSB0byBtYWtlIHN1cmUgd2UgZ290IHRoZSBwcm9wZXIgZmlsZSBuYW1lIGZvciB0aGUgcmVhbCB0ZXN0IGxhdGVyIG9uLgorICB0ZXN0X3Nob3J0cGF0aD1gJENZR1BBVEggLXMgLW0gIiRuZXdfcGF0aCIgMj4gL2Rldi9udWxsYAorICBpZiB0ZXN0ICJ4JHRlc3Rfc2hvcnRwYXRoIiA9IHg7IHRoZW4KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSBwYXRoIG9mIEJPT1RfSkRLLCB3aGljaCByZXNvbHZlcyBhcyBcIiRwYXRoXCIsIGlzIGludmFsaWQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoZSBwYXRoIG9mIEJPT1RfSkRLLCB3aGljaCByZXNvbHZlcyBhcyBcIiRwYXRoXCIsIGlzIGludmFsaWQuIiA+JjY7fQorICAgIGFzX2ZuX2Vycm9yICQ/ICJDYW5ub3QgbG9jYXRlIHRoZSB0aGUgcGF0aCBvZiBCT09UX0pESyIgIiRMSU5FTk8iIDUKKyAgZmkKKworICAjIENhbGwgaGVscGVyIGZ1bmN0aW9uIHdoaWNoIHBvc3NpYmx5IGNvbnZlcnRzIHRoaXMgdXNpbmcgRE9TLXN0eWxlIHNob3J0IG1vZGUuCisgICMgSWYgc28sIHRoZSB1cGRhdGVkIHBhdGggaXMgc3RvcmVkIGluICRuZXdfcGF0aC4KKworICBpbnB1dF9wYXRoPSIkbmV3X3BhdGgiCisgICMgQ2hlY2sgaWYgd2UgbmVlZCB0byBjb252ZXJ0IHRoaXMgdXNpbmcgRE9TLXN0eWxlIHNob3J0IG1vZGUuIElmIHRoZSBwYXRoCisgICMgY29udGFpbnMganVzdCBzaW1wbGUgY2hhcmFjdGVycywgdXNlIGl0LiBPdGhlcndpc2UgKHNwYWNlcywgd2VpcmQgY2hhcmFjdGVycyksCisgICMgdGFrZSBubyBjaGFuY2VzIGFuZCByZXdyaXRlIGl0LgorICAjIE5vdGU6IG00IGVhdHMgb3VyIFtdLCBzbyB3ZSBuZWVkIHRvIHVzZSBbIGFuZCBdIGluc3RlYWQuCisgIGhhc19mb3JiaWRkZW5fY2hhcnM9YCRFQ0hPICIkaW5wdXRfcGF0aCIgfCAkR1JFUCBbXi0uXy9hLXpBLVowLTldYAorICBpZiB0ZXN0ICJ4JGhhc19mb3JiaWRkZW5fY2hhcnMiICE9IHg7IHRoZW4KKyAgICAjIE5vdyBjb252ZXJ0IGl0IHRvIG1peGVkIERPUy1zdHlsZSwgc2hvcnQgbW9kZSAobm8gc3BhY2VzLCBhbmQgLyBpbnN0ZWFkIG9mIFwpCisgICAgc2hvcnRtb2RlX3BhdGg9YCRDWUdQQVRIIC1zIC1tIC1hICIkaW5wdXRfcGF0aCJgCisgICAgcGF0aF9hZnRlcl9zaG9ydG1vZGU9YCRDWUdQQVRIIC11ICIkc2hvcnRtb2RlX3BhdGgiYAorICAgIGlmIHRlc3QgIngkcGF0aF9hZnRlcl9zaG9ydG1vZGUiICE9ICJ4JGlucHV0X3RvX3Nob3J0cGF0aCI7IHRoZW4KKyAgICAgICMgR29pbmcgdG8gc2hvcnQgbW9kZSBhbmQgYmFjayBhZ2FpbiBkaWQgaW5kZWVkIG1hdHRlci4gU2luY2Ugc2hvcnQgbW9kZSBpcworICAgICAgIyBjYXNlIGluc2Vuc2l0aXZlLCBsZXQncyBtYWtlIGl0IGxvd2VyY2FzZSB0byBpbXByb3ZlIHJlYWRhYmlsaXR5LgorICAgICAgc2hvcnRtb2RlX3BhdGg9YCRFQ0hPICIkc2hvcnRtb2RlX3BhdGgiIHwgJFRSICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J2AKKyAgICAgICMgTm93IGNvbnZlcnQgaXQgYmFjayB0byBVbml4LXN0aWxlIChjeWdwYXRoKQorICAgICAgaW5wdXRfcGF0aD1gJENZR1BBVEggLXUgIiRzaG9ydG1vZGVfcGF0aCJgCisgICAgICBuZXdfcGF0aD0iJGlucHV0X3BhdGgiCisgICAgZmkKKyAgZmkKKworICB0ZXN0X2N5Z2RyaXZlX3ByZWZpeD1gJEVDSE8gJGlucHV0X3BhdGggfCAkR1JFUCBeL2N5Z2RyaXZlL2AKKyAgaWYgdGVzdCAieCR0ZXN0X2N5Z2RyaXZlX3ByZWZpeCIgPSB4OyB0aGVuCisgICAgIyBBcyBhIHNpbXBsZSBmaXgsIGV4Y2x1ZGUgL3Vzci9iaW4gc2luY2UgaXQncyBub3QgYSByZWFsIHBhdGguCisgICAgaWYgdGVzdCAieGAkRUNITyAkbmV3X3BhdGggfCAkR1JFUCBeL3Vzci9iaW4vYCIgPSB4OyB0aGVuCisgICAgICAjIFRoZSBwYXRoIGlzIGluIGEgQ3lnd2luIHNwZWNpYWwgZGlyZWN0b3J5IChlLmcuIC9ob21lKS4gV2UgbmVlZCB0aGlzIGNvbnZlcnRlZCB0bworICAgICAgIyBhIHBhdGggcHJlZml4ZWQgYnkgL2N5Z2RyaXZlIGZvciBmaXhwYXRoIHRvIHdvcmsuCisgICAgICBuZXdfcGF0aD0iJENZR1dJTl9ST09UX1BBVEgkaW5wdXRfcGF0aCIKKyAgICBmaQorICBmaQorCisKKyAgaWYgdGVzdCAieCRwYXRoIiAhPSAieCRuZXdfcGF0aCI7IHRoZW4KKyAgICBCT09UX0pESz0iJG5ld19wYXRoIgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogUmV3cml0aW5nIEJPT1RfSkRLIHRvIFwiJG5ld19wYXRoXCIiID4mNQorJGFzX2VjaG8gIiRhc19tZTogUmV3cml0aW5nIEJPT1RfSkRLIHRvIFwiJG5ld19wYXRoXCIiID4mNjt9CisgIGZpCisKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorCisgIHBhdGg9IiRCT09UX0pESyIKKyAgaGFzX2NvbG9uPWAkRUNITyAkcGF0aCB8ICRHUkVQIF4uOmAKKyAgbmV3X3BhdGg9IiRwYXRoIgorICBpZiB0ZXN0ICJ4JGhhc19jb2xvbiIgPSB4OyB0aGVuCisgICAgIyBOb3QgaW4gbWl4ZWQgb3IgV2luZG93cyBzdHlsZSwgc3RhcnQgYnkgdGhhdC4KKyAgICBuZXdfcGF0aD1gY21kIC8vYyBlY2hvICRwYXRoYAorICBmaQorCisKKyAgaW5wdXRfcGF0aD0iJG5ld19wYXRoIgorICAjIENoZWNrIGlmIHdlIG5lZWQgdG8gY29udmVydCB0aGlzIHVzaW5nIERPUy1zdHlsZSBzaG9ydCBtb2RlLiBJZiB0aGUgcGF0aAorICAjIGNvbnRhaW5zIGp1c3Qgc2ltcGxlIGNoYXJhY3RlcnMsIHVzZSBpdC4gT3RoZXJ3aXNlIChzcGFjZXMsIHdlaXJkIGNoYXJhY3RlcnMpLAorICAjIHRha2Ugbm8gY2hhbmNlcyBhbmQgcmV3cml0ZSBpdC4KKyAgIyBOb3RlOiBtNCBlYXRzIG91ciBbXSwgc28gd2UgbmVlZCB0byB1c2UgWyBhbmQgXSBpbnN0ZWFkLgorICBoYXNfZm9yYmlkZGVuX2NoYXJzPWAkRUNITyAiJGlucHV0X3BhdGgiIHwgJEdSRVAgW14tXy86YS16QS1aMC05XWAKKyAgaWYgdGVzdCAieCRoYXNfZm9yYmlkZGVuX2NoYXJzIiAhPSB4OyB0aGVuCisgICAgIyBOb3cgY29udmVydCBpdCB0byBtaXhlZCBET1Mtc3R5bGUsIHNob3J0IG1vZGUgKG5vIHNwYWNlcywgYW5kIC8gaW5zdGVhZCBvZiBcKQorICAgIG5ld19wYXRoPWBjbWQgL2MgImZvciAlQSBpbiAoXCIkaW5wdXRfcGF0aFwiKSBkbyBAZWNobyAlfnNBInwkVFIgXFxcXFxcXFwgLyB8ICRUUiAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidgCisgIGZpCisKKworICB3aW5kb3dzX3BhdGg9IiRuZXdfcGF0aCIKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJENZR1BBVEggLXUgIiR3aW5kb3dzX3BhdGgiYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBlbGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLm1zeXMiOyB0aGVuCisgICAgdW5peF9wYXRoPWAkRUNITyAiJHdpbmRvd3NfcGF0aCIgfCAkU0VEIC1lICdzLF5cXCguXFwpOiwvXFwxLGcnIC1lICdzLFxcXFwsLyxnJ2AKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZmkKKworICBpZiB0ZXN0ICJ4JHBhdGgiICE9ICJ4JG5ld19wYXRoIjsgdGhlbgorICAgIEJPT1RfSkRLPSIkbmV3X3BhdGgiCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBSZXdyaXRpbmcgQk9PVF9KREsgdG8gXCIkbmV3X3BhdGhcIiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBSZXdyaXRpbmcgQk9PVF9KREsgdG8gXCIkbmV3X3BhdGhcIiIgPiY2O30KKyAgZmkKKworICAjIFNhdmUgdGhlIGZpcnN0IDEwIGJ5dGVzIG9mIHRoaXMgcGF0aCB0byB0aGUgc3RvcmFnZSwgc28gZml4cGF0aCBjYW4gd29yay4KKyAgYWxsX2ZpeHBhdGhfcHJlZml4ZXM9KCIke2FsbF9maXhwYXRoX3ByZWZpeGVzW0BdfSIgIiR7bmV3X3BhdGg6MDoxMH0iKQorCisgIGVsc2UKKyAgICAjIFdlJ3JlIG9uIGEgcG9zaXggcGxhdGZvcm0uIEhvb3JheSEgOikKKyAgICBwYXRoPSIkQk9PVF9KREsiCisKKyAgICBpZiB0ZXN0ICEgLWYgIiRwYXRoIiAmJiB0ZXN0ICEgLWQgIiRwYXRoIjsgdGhlbgorICAgICAgYXNfZm5fZXJyb3IgJD8gIlRoZSBwYXRoIG9mIEJPT1RfSkRLLCB3aGljaCByZXNvbHZlcyBhcyBcIiRwYXRoXCIsIGlzIG5vdCBmb3VuZC4iICIkTElORU5PIiA1CisgICAgZmkKKworICAgIGhhc19zcGFjZT1gJEVDSE8gIiRwYXRoIiB8ICRHUkVQICIgImAKKyAgICBpZiB0ZXN0ICJ4JGhhc19zcGFjZSIgIT0geDsgdGhlbgorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUaGUgcGF0aCBvZiBCT09UX0pESywgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkcGF0aFwiLCBpcyBpbnZhbGlkLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUaGUgcGF0aCBvZiBCT09UX0pESywgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkcGF0aFwiLCBpcyBpbnZhbGlkLiIgPiY2O30KKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJTcGFjZXMgYXJlIG5vdCBhbGxvd2VkIGluIHRoaXMgcGF0aC4iICIkTElORU5PIiA1CisgICAgZmkKKyAgZmkKKworICAgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBCb290IEpESyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgQm9vdCBKREsuLi4gIiA+JjY7IH0KKyAgICAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRCT09UX0pESyIgPiY1CiskYXNfZWNobyAiJEJPT1RfSkRLIiA+JjY7IH0KKyAgICAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBCb290IEpESyB2ZXJzaW9uIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIEJvb3QgSkRLIHZlcnNpb24uLi4gIiA+JjY7IH0KKyAgICAgICAgICAgICAgQk9PVF9KREtfVkVSU0lPTj1gIiRCT09UX0pESy9iaW4vamF2YSIgLXZlcnNpb24gMj4mMSB8ICRUUiAnXG5ccicgJyAgJ2AKKyAgICAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRCT09UX0pES19WRVJTSU9OIiA+JjUKKyRhc19lY2hvICIkQk9PVF9KREtfVkVSU0lPTiIgPiY2OyB9CiAgICAgICAgICAgICBmaSAjIGVuZCBjaGVjayBqZGsgdmVyc2lvbgogICAgICAgICAgIGZpICMgZW5kIGNoZWNrIHJ0LmphcgogICAgICAgICBmaSAjIGVuZCBjaGVjayBqYXZhYwpAQCAtOTg2OCwyNiArMTQ4NDAsMTMzIEBACiAgICAgICAgICAgICAgICMgV2UncmUgZG9uZSEgOi0pCiAgICAgICAgICAgICAgIEJPT1RfSkRLX0ZPVU5EPXllcwogCi0gICAgIyBGYWlsIHdpdGggbWVzc2FnZSB0aGUgcGF0aCB0byB0aGUgQm9vdCBKREsgaWYgdmFyIEJPT1RfSkRLIGNvbnRhaW5zIGEgcGF0aCB3aXRoIG5vIHNwYWNlcyBpbiBpdC4KLSAgICAjIFVubGVzcyBvbiBXaW5kb3dzLCB3aGVyZSB3ZSBjYW4gcmV3cml0ZSB0aGUgcGF0aC4KLSAgICBIQVNfU1BBQ0U9YGVjaG8gIiRCT09UX0pESyIgfCBncmVwICIgImAKLSAgICBpZiB0ZXN0ICJ4JEhBU19TUEFDRSIgIT0geDsgdGhlbgotICAgICAgICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1MiID0gInh3aW5kb3dzIjsgdGhlbgotICAgICAgICAgICAgIyBGaXJzdCBjb252ZXJ0IGl0IHRvIERPUy1zdHlsZSwgc2hvcnQgbW9kZSAobm8gc3BhY2VzKQotICAgICAgICAgICAgQk9PVF9KREs9YCRDWUdQQVRIIC1zIC1tIC1hICIkQk9PVF9KREsiYAotICAgICAgICAgICAgIyBOb3cgaXQncyBjYXNlIGluc2Vuc2l0aXZlOyBsZXQncyBtYWtlIGl0IGxvd2VyY2FzZSB0byBpbXByb3ZlIHJlYWRhYmlsaXR5Ci0gICAgICAgICAgICBCT09UX0pESz1gJEVDSE8gIiRCT09UX0pESyIgfCAkVFIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnF4eXonYAotICAgICAgICAgICAgIyBOb3cgY29udmVydCBpdCBiYWNrIHRvIFVuaXgtc3RpbGUgKGN5Z3BhdGgpCi0gICAgICAgICAgICBCT09UX0pESz1gJENZR1BBVEggLXUgIiRCT09UX0pESyJgCi0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGFzX2ZuX2Vycm9yICQ/ICJZb3UgY2Fubm90IGhhdmUgc3BhY2VzIGluIHRoZSBwYXRoIHRvIHRoZSBCb290IEpESyEgXCIkQk9PVF9KREtcIiIgIiRMSU5FTk8iIDUKLSAgICAgICAgZmkKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorCisgICMgSW5wdXQgbWlnaHQgYmUgZ2l2ZW4gYXMgV2luZG93cyBmb3JtYXQsIHN0YXJ0IGJ5IGNvbnZlcnRpbmcgdG8KKyAgIyB1bml4IGZvcm1hdC4KKyAgcGF0aD0iJEJPT1RfSkRLIgorICBuZXdfcGF0aD1gJENZR1BBVEggLXUgIiRwYXRoImAKKworICAjIEN5Z3dpbiB0cmllcyB0byBoaWRlIHNvbWUgYXNwZWN0cyBvZiB0aGUgV2luZG93cyBmaWxlIHN5c3RlbSwgc3VjaCB0aGF0IGJpbmFyaWVzIGFyZQorICAjIG5hbWVkIC5leGUgYnV0IGNhbGxlZCB3aXRob3V0IHRoYXQgc3VmZml4LiBUaGVyZWZvcmUsICJmb28iIGFuZCAiZm9vLmV4ZSIgYXJlIGNvbnNpZGVyZWQKKyAgIyB0aGUgc2FtZSBmaWxlLCBtb3N0IG9mIHRoZSB0aW1lIChhcyBpbiAidGVzdCAtZiIpLiBCdXQgbm90IHdoZW4gcnVubmluZyBjeWdwYXRoIC1zLCB0aGVuCisgICMgImZvby5leGUiIGlzIE9LIGJ1dCAiZm9vIiBpcyBhbiBlcnJvci4KKyAgIworICAjIFRoaXMgdGVzdCBpcyB0aGVyZWZvcmUgc2xpZ2h0bHkgbW9yZSBhY2N1cmF0ZSB0aGFuICJ0ZXN0IC1mIiB0byBjaGVjayBmb3IgZmlsZSBwcmVjZW5zZS4KKyAgIyBJdCBpcyBhbHNvIGEgd2F5IHRvIG1ha2Ugc3VyZSB3ZSBnb3QgdGhlIHByb3BlciBmaWxlIG5hbWUgZm9yIHRoZSByZWFsIHRlc3QgbGF0ZXIgb24uCisgIHRlc3Rfc2hvcnRwYXRoPWAkQ1lHUEFUSCAtcyAtbSAiJG5ld19wYXRoIiAyPiAvZGV2L251bGxgCisgIGlmIHRlc3QgIngkdGVzdF9zaG9ydHBhdGgiID0geDsgdGhlbgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGhlIHBhdGggb2YgQk9PVF9KREssIHdoaWNoIHJlc29sdmVzIGFzIFwiJHBhdGhcIiwgaXMgaW52YWxpZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhlIHBhdGggb2YgQk9PVF9KREssIHdoaWNoIHJlc29sdmVzIGFzIFwiJHBhdGhcIiwgaXMgaW52YWxpZC4iID4mNjt9CisgICAgYXNfZm5fZXJyb3IgJD8gIkNhbm5vdCBsb2NhdGUgdGhlIHRoZSBwYXRoIG9mIEJPT1RfSkRLIiAiJExJTkVOTyIgNQorICBmaQorCisgICMgQ2FsbCBoZWxwZXIgZnVuY3Rpb24gd2hpY2ggcG9zc2libHkgY29udmVydHMgdGhpcyB1c2luZyBET1Mtc3R5bGUgc2hvcnQgbW9kZS4KKyAgIyBJZiBzbywgdGhlIHVwZGF0ZWQgcGF0aCBpcyBzdG9yZWQgaW4gJG5ld19wYXRoLgorCisgIGlucHV0X3BhdGg9IiRuZXdfcGF0aCIKKyAgIyBDaGVjayBpZiB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhpcyB1c2luZyBET1Mtc3R5bGUgc2hvcnQgbW9kZS4gSWYgdGhlIHBhdGgKKyAgIyBjb250YWlucyBqdXN0IHNpbXBsZSBjaGFyYWN0ZXJzLCB1c2UgaXQuIE90aGVyd2lzZSAoc3BhY2VzLCB3ZWlyZCBjaGFyYWN0ZXJzKSwKKyAgIyB0YWtlIG5vIGNoYW5jZXMgYW5kIHJld3JpdGUgaXQuCisgICMgTm90ZTogbTQgZWF0cyBvdXIgW10sIHNvIHdlIG5lZWQgdG8gdXNlIFsgYW5kIF0gaW5zdGVhZC4KKyAgaGFzX2ZvcmJpZGRlbl9jaGFycz1gJEVDSE8gIiRpbnB1dF9wYXRoIiB8ICRHUkVQIFteLS5fL2EtekEtWjAtOV1gCisgIGlmIHRlc3QgIngkaGFzX2ZvcmJpZGRlbl9jaGFycyIgIT0geDsgdGhlbgorICAgICMgTm93IGNvbnZlcnQgaXQgdG8gbWl4ZWQgRE9TLXN0eWxlLCBzaG9ydCBtb2RlIChubyBzcGFjZXMsIGFuZCAvIGluc3RlYWQgb2YgXCkKKyAgICBzaG9ydG1vZGVfcGF0aD1gJENZR1BBVEggLXMgLW0gLWEgIiRpbnB1dF9wYXRoImAKKyAgICBwYXRoX2FmdGVyX3Nob3J0bW9kZT1gJENZR1BBVEggLXUgIiRzaG9ydG1vZGVfcGF0aCJgCisgICAgaWYgdGVzdCAieCRwYXRoX2FmdGVyX3Nob3J0bW9kZSIgIT0gIngkaW5wdXRfdG9fc2hvcnRwYXRoIjsgdGhlbgorICAgICAgIyBHb2luZyB0byBzaG9ydCBtb2RlIGFuZCBiYWNrIGFnYWluIGRpZCBpbmRlZWQgbWF0dGVyLiBTaW5jZSBzaG9ydCBtb2RlIGlzCisgICAgICAjIGNhc2UgaW5zZW5zaXRpdmUsIGxldCdzIG1ha2UgaXQgbG93ZXJjYXNlIHRvIGltcHJvdmUgcmVhZGFiaWxpdHkuCisgICAgICBzaG9ydG1vZGVfcGF0aD1gJEVDSE8gIiRzaG9ydG1vZGVfcGF0aCIgfCAkVFIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAorICAgICAgIyBOb3cgY29udmVydCBpdCBiYWNrIHRvIFVuaXgtc3RpbGUgKGN5Z3BhdGgpCisgICAgICBpbnB1dF9wYXRoPWAkQ1lHUEFUSCAtdSAiJHNob3J0bW9kZV9wYXRoImAKKyAgICAgIG5ld19wYXRoPSIkaW5wdXRfcGF0aCIKICAgICBmaQorICBmaQorCisgIHRlc3RfY3lnZHJpdmVfcHJlZml4PWAkRUNITyAkaW5wdXRfcGF0aCB8ICRHUkVQIF4vY3lnZHJpdmUvYAorICBpZiB0ZXN0ICJ4JHRlc3RfY3lnZHJpdmVfcHJlZml4IiA9IHg7IHRoZW4KKyAgICAjIEFzIGEgc2ltcGxlIGZpeCwgZXhjbHVkZSAvdXNyL2JpbiBzaW5jZSBpdCdzIG5vdCBhIHJlYWwgcGF0aC4KKyAgICBpZiB0ZXN0ICJ4YCRFQ0hPICRuZXdfcGF0aCB8ICRHUkVQIF4vdXNyL2Jpbi9gIiA9IHg7IHRoZW4KKyAgICAgICMgVGhlIHBhdGggaXMgaW4gYSBDeWd3aW4gc3BlY2lhbCBkaXJlY3RvcnkgKGUuZy4gL2hvbWUpLiBXZSBuZWVkIHRoaXMgY29udmVydGVkIHRvCisgICAgICAjIGEgcGF0aCBwcmVmaXhlZCBieSAvY3lnZHJpdmUgZm9yIGZpeHBhdGggdG8gd29yay4KKyAgICAgIG5ld19wYXRoPSIkQ1lHV0lOX1JPT1RfUEFUSCRpbnB1dF9wYXRoIgorICAgIGZpCisgIGZpCisKKworICBpZiB0ZXN0ICJ4JHBhdGgiICE9ICJ4JG5ld19wYXRoIjsgdGhlbgorICAgIEJPT1RfSkRLPSIkbmV3X3BhdGgiCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBSZXdyaXRpbmcgQk9PVF9KREsgdG8gXCIkbmV3X3BhdGhcIiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBSZXdyaXRpbmcgQk9PVF9KREsgdG8gXCIkbmV3X3BhdGhcIiIgPiY2O30KKyAgZmkKKworICBlbGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLm1zeXMiOyB0aGVuCisKKyAgcGF0aD0iJEJPT1RfSkRLIgorICBoYXNfY29sb249YCRFQ0hPICRwYXRoIHwgJEdSRVAgXi46YAorICBuZXdfcGF0aD0iJHBhdGgiCisgIGlmIHRlc3QgIngkaGFzX2NvbG9uIiA9IHg7IHRoZW4KKyAgICAjIE5vdCBpbiBtaXhlZCBvciBXaW5kb3dzIHN0eWxlLCBzdGFydCBieSB0aGF0LgorICAgIG5ld19wYXRoPWBjbWQgLy9jIGVjaG8gJHBhdGhgCisgIGZpCisKKworICBpbnB1dF9wYXRoPSIkbmV3X3BhdGgiCisgICMgQ2hlY2sgaWYgd2UgbmVlZCB0byBjb252ZXJ0IHRoaXMgdXNpbmcgRE9TLXN0eWxlIHNob3J0IG1vZGUuIElmIHRoZSBwYXRoCisgICMgY29udGFpbnMganVzdCBzaW1wbGUgY2hhcmFjdGVycywgdXNlIGl0LiBPdGhlcndpc2UgKHNwYWNlcywgd2VpcmQgY2hhcmFjdGVycyksCisgICMgdGFrZSBubyBjaGFuY2VzIGFuZCByZXdyaXRlIGl0LgorICAjIE5vdGU6IG00IGVhdHMgb3VyIFtdLCBzbyB3ZSBuZWVkIHRvIHVzZSBbIGFuZCBdIGluc3RlYWQuCisgIGhhc19mb3JiaWRkZW5fY2hhcnM9YCRFQ0hPICIkaW5wdXRfcGF0aCIgfCAkR1JFUCBbXi1fLzphLXpBLVowLTldYAorICBpZiB0ZXN0ICJ4JGhhc19mb3JiaWRkZW5fY2hhcnMiICE9IHg7IHRoZW4KKyAgICAjIE5vdyBjb252ZXJ0IGl0IHRvIG1peGVkIERPUy1zdHlsZSwgc2hvcnQgbW9kZSAobm8gc3BhY2VzLCBhbmQgLyBpbnN0ZWFkIG9mIFwpCisgICAgbmV3X3BhdGg9YGNtZCAvYyAiZm9yICVBIGluIChcIiRpbnB1dF9wYXRoXCIpIGRvIEBlY2hvICV+c0EifCRUUiBcXFxcXFxcXCAvIHwgJFRSICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J2AKKyAgZmkKKworCisgIHdpbmRvd3NfcGF0aD0iJG5ld19wYXRoIgorICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5jeWd3aW4iOyB0aGVuCisgICAgdW5peF9wYXRoPWAkQ1lHUEFUSCAtdSAiJHdpbmRvd3NfcGF0aCJgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGVsaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MubXN5cyI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRFQ0hPICIkd2luZG93c19wYXRoIiB8ICRTRUQgLWUgJ3MsXlxcKC5cXCk6LC9cXDEsZycgLWUgJ3MsXFxcXCwvLGcnYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBmaQorCisgIGlmIHRlc3QgIngkcGF0aCIgIT0gIngkbmV3X3BhdGgiOyB0aGVuCisgICAgQk9PVF9KREs9IiRuZXdfcGF0aCIKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFJld3JpdGluZyBCT09UX0pESyB0byBcIiRuZXdfcGF0aFwiIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFJld3JpdGluZyBCT09UX0pESyB0byBcIiRuZXdfcGF0aFwiIiA+JjY7fQorICBmaQorCisgICMgU2F2ZSB0aGUgZmlyc3QgMTAgYnl0ZXMgb2YgdGhpcyBwYXRoIHRvIHRoZSBzdG9yYWdlLCBzbyBmaXhwYXRoIGNhbiB3b3JrLgorICBhbGxfZml4cGF0aF9wcmVmaXhlcz0oIiR7YWxsX2ZpeHBhdGhfcHJlZml4ZXNbQF19IiAiJHtuZXdfcGF0aDowOjEwfSIpCisKKyAgZWxzZQorICAgICMgV2UncmUgb24gYSBwb3NpeCBwbGF0Zm9ybS4gSG9vcmF5ISA6KQorICAgIHBhdGg9IiRCT09UX0pESyIKKworICAgIGlmIHRlc3QgISAtZiAiJHBhdGgiICYmIHRlc3QgISAtZCAiJHBhdGgiOyB0aGVuCisgICAgICBhc19mbl9lcnJvciAkPyAiVGhlIHBhdGggb2YgQk9PVF9KREssIHdoaWNoIHJlc29sdmVzIGFzIFwiJHBhdGhcIiwgaXMgbm90IGZvdW5kLiIgIiRMSU5FTk8iIDUKKyAgICBmaQorCisgICAgaGFzX3NwYWNlPWAkRUNITyAiJHBhdGgiIHwgJEdSRVAgIiAiYAorICAgIGlmIHRlc3QgIngkaGFzX3NwYWNlIiAhPSB4OyB0aGVuCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSBwYXRoIG9mIEJPT1RfSkRLLCB3aGljaCByZXNvbHZlcyBhcyBcIiRwYXRoXCIsIGlzIGludmFsaWQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoZSBwYXRoIG9mIEJPT1RfSkRLLCB3aGljaCByZXNvbHZlcyBhcyBcIiRwYXRoXCIsIGlzIGludmFsaWQuIiA+JjY7fQorICAgICAgYXNfZm5fZXJyb3IgJD8gIlNwYWNlcyBhcmUgbm90IGFsbG93ZWQgaW4gdGhpcyBwYXRoLiIgIiRMSU5FTk8iIDUKKyAgICBmaQorICBmaQogCiAgICAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIEJvb3QgSkRLIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGZvciBCb290IEpESy4uLiAiID4mNjsgfQotICAgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJEJPT1RfSkRLICgkQk9PVF9KREtfVkVSU0lPTikiID4mNQotJGFzX2VjaG8gIiRCT09UX0pESyAoJEJPT1RfSkRLX1ZFUlNJT04pIiA+JjY7IH0KKyAgICAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRCT09UX0pESyIgPiY1CiskYXNfZWNobyAiJEJPT1RfSkRLIiA+JjY7IH0KKyAgICAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBCb290IEpESyB2ZXJzaW9uIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIEJvb3QgSkRLIHZlcnNpb24uLi4gIiA+JjY7IH0KKyAgICAgICAgICAgICAgQk9PVF9KREtfVkVSU0lPTj1gIiRCT09UX0pESy9iaW4vamF2YSIgLXZlcnNpb24gMj4mMSB8ICRUUiAnXG5ccicgJyAgJ2AKKyAgICAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRCT09UX0pES19WRVJTSU9OIiA+JjUKKyRhc19lY2hvICIkQk9PVF9KREtfVkVSU0lPTiIgPiY2OyB9CiAgICAgICAgICAgICBmaSAjIGVuZCBjaGVjayBqZGsgdmVyc2lvbgogICAgICAgICAgIGZpICMgZW5kIGNoZWNrIHJ0LmphcgogICAgICAgICBmaSAjIGVuZCBjaGVjayBqYXZhYwpAQCAtMTA0NjUsMTYgKzE1NTQ0LDEzIEBACiAKIAogCisjIExvY2F0ZSB0aGUgYWN0dWFsIHRvb2xzCiAKK2lmIHRlc3QgIngkT1BFTkpES19UQVJHRVRfT1MiID0gInh3aW5kb3dzIjsgdGhlbgogCi0jIENoZWNrIGlmIHRoZSBWUyBlbnYgdmFyaWFibGVzIHdlcmUgc2V0dXAgcHJpb3IgdG8gcnVubmluZyBjb25maWd1cmUuCi0jIElmIG5vdCwgdGhlbiBmaW5kIHZjdmFyc2FsbC5iYXQgYW5kIHJ1biBpdCBhdXRvbWF0aWNhbGx5LCBhbmQgaW50ZWdyYXRlCi0jIHRoZSBzZXQgZW52IHZhcmlhYmxlcyBpbnRvIHRoZSBzcGVjIGZpbGUuCi1TRVRVUERFVkVOVj0iIyBObyBzcGVjaWFsIHZhcnMiCi1pZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1MiID0gInh3aW5kb3dzIjsgdGhlbgotICAgICMgU3RvcmUgcGF0aCB0byBjeWd3aW4gbGluay5leGUgdG8gaGVscCBleGNsdWRpbmcgaXQgd2hlbiBzZWFyY2hpbmcgZm9yCi0gICAgIyBWUyBsaW5rZXIuCi0gICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJsaW5rIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KKyAgIyBTdG9yZSBwYXRoIHRvIGN5Z3dpbiBsaW5rLmV4ZSB0byBoZWxwIGV4Y2x1ZGluZyBpdCB3aGVuIHNlYXJjaGluZyBmb3IKKyAgIyBWUyBsaW5rZXIuIFRoaXMgbXVzdCBiZSBkb25lIGJlZm9yZSBjaGFuZ2luZyB0aGUgUEFUSCB3aGVuIGxvb2tpbmcgZm9yIFZTLgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImxpbmsiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgogc2V0IGR1bW15IGxpbms7IGFjX3dvcmQ9JDIKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQpAQCAtMTA1MTQsNiArMTU1OTAsNyBAQAogZmkKIAogCisgIGlmIHRlc3QgIngkQ1lHV0lOX0xJTksiICE9IHg7IHRoZW4KICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmIHRoZSBmaXJzdCBmb3VuZCBsaW5rLmV4ZSBpcyBhY3R1YWxseSB0aGUgQ3lnd2luIGxpbmsgdG9vbCIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBpZiB0aGUgZmlyc3QgZm91bmQgbGluay5leGUgaXMgYWN0dWFsbHkgdGhlIEN5Z3dpbiBsaW5rIHRvb2wuLi4gIiA+JjY7IH0KICAgICAiJENZR1dJTl9MSU5LIiAtLXZlcnNpb24gPiAvZGV2L251bGwKQEAgLTEwNTI2LDEyNCArMTU2MDMsODYyIEBACiAgICAgICAjIFRoaXMgbWlnaHQgYmUgdGhlIFZTIGxpbmtlci4gRG9uJ3QgZXhjbHVkZSBpdCBsYXRlciBvbi4KICAgICAgIENZR1dJTl9MSU5LPSIiCiAgICAgZmkKKyAgZmkKIAotICAgICMgSWYgdmN2YXJzYWxsLmJhdCBoYXMgYmVlbiBydW4sIHRoZW4gVkNJTlNUQUxMRElSIGlzIHNldC4KLSAgICBpZiB0ZXN0ICJ4JFZDSU5TVEFMTERJUiIgIT0geDsgdGhlbgotICAgICAgICAjIE5vIGZ1cnRoZXIgc2V0dXAgaXMgbmVlZGVkLiBUaGUgYnVpbGQgd2lsbCBoYXBwZW4gZnJvbSB0aGlzIGtpbmQKLSAgICAgICAgIyBvZiBzaGVsbC4KLSAgICAgICAgU0VUVVBERVZFTlY9IiMgVGhpcyBzcGVjIGZpbGUgZXhwZWN0cyB0aGF0IHlvdSBhcmUgcnVubmluZyBiYXNoIGZyb20gd2l0aGluIGEgVlMgY29tbWFuZCBwcm9tcHQuIgotICAgICAgICAjIE1ha2Ugc3VyZSB0byByZW1pbmQgeW91LCBpZiB5b3UgZm9yZ2V0IHRvIHJ1biBtYWtlIGZyb20gYSBjeWd3aW4gYmFzaCBzaGVsbAotICAgICAgICAjIHRoYXQgaXMgc3Bhd25lZCAiYmFzaCAtbCIgZnJvbSBhIFZTIGNvbW1hbmQgcHJvbXB0LgotICAgICAgICBDSEVDS19GT1JfVkNJTlNUQUxMRElSPXllcwotICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmIHlvdSBhcmUgcnVubmluZyBmcm9tIHdpdGhpbiBhIFZTIGNvbW1hbmQgcHJvbXB0IiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGlmIHlvdSBhcmUgcnVubmluZyBmcm9tIHdpdGhpbiBhIFZTIGNvbW1hbmQgcHJvbXB0Li4uICIgPiY2OyB9Ci0gICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQotJGFzX2VjaG8gInllcyIgPiY2OyB9CisgICMgRmlyc3QtaGFuZCBjaG9pY2UgaXMgdG8gbG9jYXRlIGFuZCBydW4gdGhlIHZzdmFycyBiYXQgZmlsZS4KKworICBpZiB0ZXN0ICJ4JE9QRU5KREtfVEFSR0VUX0NQVV9CSVRTIiA9IHgzMjsgdGhlbgorICAgIFZDVkFSU0ZJTEU9InZjL2Jpbi92Y3ZhcnMzMi5iYXQiCisgIGVsc2UKKyAgICBWQ1ZBUlNGSUxFPSJ2Yy9iaW4vYW1kNjQvdmN2YXJzNjQuYmF0IgorICBmaQorCisgIFZTX0VOVl9DTUQ9IiIKKyAgVlNfRU5WX0FSR1M9IiIKKyAgaWYgdGVzdCAieCR3aXRoX3Rvb2xzZGlyIiAhPSB4OyB0aGVuCisKKyAgaWYgdGVzdCAieCRWU19FTlZfQ01EIiA9IHg7IHRoZW4KKyAgICBWUzEwMEJBU0U9IiR3aXRoX3Rvb2xzZGlyLy4uLy4uIgorICAgIE1FVEhPRD0iLS13aXRoLXRvb2xzLWRpciIKKworICB3aW5kb3dzX3BhdGg9IiRWUzEwMEJBU0UiCisgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLmN5Z3dpbiI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRDWUdQQVRIIC11ICIkd2luZG93c19wYXRoImAKKyAgICBWUzEwMEJBU0U9IiR1bml4X3BhdGgiCisgIGVsaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MubXN5cyI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRFQ0hPICIkd2luZG93c19wYXRoIiB8ICRTRUQgLWUgJ3MsXlxcKC5cXCk6LC9cXDEsZycgLWUgJ3MsXFxcXCwvLGcnYAorICAgIFZTMTAwQkFTRT0iJHVuaXhfcGF0aCIKKyAgZmkKKworICAgIGlmIHRlc3QgLWQgIiRWUzEwMEJBU0UiOyB0aGVuCisgICAgICBpZiB0ZXN0IC1mICIkVlMxMDBCQVNFLyRWQ1ZBUlNGSUxFIjsgdGhlbgorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IEZvdW5kIFZpc3VhbCBTdHVkaW8gaW5zdGFsbGF0aW9uIGF0ICRWUzEwMEJBU0UgdXNpbmcgJE1FVEhPRCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBGb3VuZCBWaXN1YWwgU3R1ZGlvIGluc3RhbGxhdGlvbiBhdCAkVlMxMDBCQVNFIHVzaW5nICRNRVRIT0QiID4mNjt9CisgICAgICAgIFZTX0VOVl9DTUQ9IiRWUzEwMEJBU0UvJFZDVkFSU0ZJTEUiCisgICAgICBlbHNlCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogRm91bmQgVmlzdWFsIFN0dWRpbyBpbnN0YWxsYXRpb24gYXQgJFZTMTAwQkFTRSB1c2luZyAkTUVUSE9EIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IEZvdW5kIFZpc3VhbCBTdHVkaW8gaW5zdGFsbGF0aW9uIGF0ICRWUzEwMEJBU0UgdXNpbmcgJE1FVEhPRCIgPiY2O30KKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXYXJuaW5nOiAkVkNWQVJTRklMRSBpcyBtaXNzaW5nLCB0aGlzIGlzIHByb2JhYmx5IFZpc3VhbCBTdHVkaW8gRXhwcmVzcy4gSWdub3JpbmciID4mNQorJGFzX2VjaG8gIiRhc19tZTogV2FybmluZzogJFZDVkFSU0ZJTEUgaXMgbWlzc2luZywgdGhpcyBpcyBwcm9iYWJseSBWaXN1YWwgU3R1ZGlvIEV4cHJlc3MuIElnbm9yaW5nIiA+JjY7fQorICAgICAgZmkKKyAgICBmaQorICBmaQorCisgIGZpCisKKyAgaWYgdGVzdCAieCR3aXRoX3Rvb2xzZGlyIiAhPSB4ICYmIHRlc3QgIngkVlNfRU5WX0NNRCIgPSB4OyB0aGVuCisgICAgIyBIYXZpbmcgc3BlY2lmaWVkIGFuIGFyZ3VtZW50IHdoaWNoIGlzIGluY29ycmVjdCB3aWxsIHByb2R1Y2UgYW4gaW5zdGFudCBmYWlsdXJlOworICAgICMgd2Ugc2hvdWxkIG5vdCBnbyBvbiBsb29raW5nCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUaGUgcGF0aCBnaXZlbiBieSAtLXdpdGgtdG9vbHMtZGlyIGRvZXMgbm90IGNvbnRhaW4gYSB2YWxpZCBWaXN1YWwgU3R1ZGlvIGluc3RhbGxhdGlvbiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUaGUgcGF0aCBnaXZlbiBieSAtLXdpdGgtdG9vbHMtZGlyIGRvZXMgbm90IGNvbnRhaW4gYSB2YWxpZCBWaXN1YWwgU3R1ZGlvIGluc3RhbGxhdGlvbiIgPiY2O30KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFBsZWFzZSBwb2ludCB0byB0aGUgVkMvYmluIGRpcmVjdG9yeSB3aXRoaW4gdGhlIFZpc3VhbCBTdHVkaW8gaW5zdGFsbGF0aW9uIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFBsZWFzZSBwb2ludCB0byB0aGUgVkMvYmluIGRpcmVjdG9yeSB3aXRoaW4gdGhlIFZpc3VhbCBTdHVkaW8gaW5zdGFsbGF0aW9uIiA+JjY7fQorICAgIGFzX2ZuX2Vycm9yICQ/ICJDYW5ub3QgbG9jYXRlIGEgdmFsaWQgVmlzdWFsIFN0dWRpbyBpbnN0YWxsYXRpb24iICIkTElORU5PIiA1CisgIGZpCisKKyAgaWYgdGVzdCAieCRQcm9ncmFtVzY0MzIiICE9IHg7IHRoZW4KKworICBpZiB0ZXN0ICJ4JFZTX0VOVl9DTUQiID0geDsgdGhlbgorICAgIFdJTl9TREtfQkFTRT0iJFByb2dyYW1XNjQzMi9NaWNyb3NvZnQgU0RLcy9XaW5kb3dzL3Y3LjEvQmluIgorICAgIE1FVEhPRD0id2VsbC1rbm93biBuYW1lIgorCisgIHdpbmRvd3NfcGF0aD0iJFdJTl9TREtfQkFTRSIKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJENZR1BBVEggLXUgIiR3aW5kb3dzX3BhdGgiYAorICAgIFdJTl9TREtfQkFTRT0iJHVuaXhfcGF0aCIKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJEVDSE8gIiR3aW5kb3dzX3BhdGgiIHwgJFNFRCAtZSAncyxeXFwoLlxcKTosL1xcMSxnJyAtZSAncyxcXFxcLC8sZydgCisgICAgV0lOX1NES19CQVNFPSIkdW5peF9wYXRoIgorICBmaQorCisgICAgaWYgdGVzdCAtZCAiJFdJTl9TREtfQkFTRSI7IHRoZW4KKyAgICAgIGlmIHRlc3QgLWYgIiRXSU5fU0RLX0JBU0UvU2V0RW52LkNtZCI7IHRoZW4KKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBGb3VuZCBXaW5kb3dzIFNESyBpbnN0YWxsYXRpb24gYXQgJFdJTl9TREtfQkFTRSB1c2luZyAkTUVUSE9EIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IEZvdW5kIFdpbmRvd3MgU0RLIGluc3RhbGxhdGlvbiBhdCAkV0lOX1NES19CQVNFIHVzaW5nICRNRVRIT0QiID4mNjt9CisgICAgICAgIFZTX0VOVl9DTUQ9IiRXSU5fU0RLX0JBU0UvU2V0RW52LkNtZCIKKyAgICAgICAgaWYgdGVzdCAieCRPUEVOSkRLX1RBUkdFVF9DUFVfQklUUyIgPSB4MzI7IHRoZW4KKyAgICAgICAgICBWU19FTlZfQVJHUz0iL3g4NiIKKyAgICAgICAgZWxzZQorICAgICAgICAgIFZTX0VOVl9BUkdTPSIveDY0IgorICAgICAgICBmaQorICAgICAgZWxzZQorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IEZvdW5kIFdpbmRvd3MgU0RLIGluc3RhbGxhdGlvbiBhdCAkV0lOX1NES19CQVNFIHVzaW5nICRNRVRIT0QiID4mNQorJGFzX2VjaG8gIiRhc19tZTogRm91bmQgV2luZG93cyBTREsgaW5zdGFsbGF0aW9uIGF0ICRXSU5fU0RLX0JBU0UgdXNpbmcgJE1FVEhPRCIgPiY2O30KKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXYXJuaW5nOiBJbnN0YWxsYXRpb24gaXMgYnJva2VuLCBTZXRFbnYuQ21kIGlzIG1pc3NpbmcuIElnbm9yaW5nIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdhcm5pbmc6IEluc3RhbGxhdGlvbiBpcyBicm9rZW4sIFNldEVudi5DbWQgaXMgbWlzc2luZy4gSWdub3JpbmciID4mNjt9CisgICAgICBmaQorICAgIGZpCisgIGZpCisKKyAgZmkKKyAgaWYgdGVzdCAieCRQUk9HUkFNVzY0MzIiICE9IHg7IHRoZW4KKworICBpZiB0ZXN0ICJ4JFZTX0VOVl9DTUQiID0geDsgdGhlbgorICAgIFdJTl9TREtfQkFTRT0iJFBST0dSQU1XNjQzMi9NaWNyb3NvZnQgU0RLcy9XaW5kb3dzL3Y3LjEvQmluIgorICAgIE1FVEhPRD0id2VsbC1rbm93biBuYW1lIgorCisgIHdpbmRvd3NfcGF0aD0iJFdJTl9TREtfQkFTRSIKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJENZR1BBVEggLXUgIiR3aW5kb3dzX3BhdGgiYAorICAgIFdJTl9TREtfQkFTRT0iJHVuaXhfcGF0aCIKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJEVDSE8gIiR3aW5kb3dzX3BhdGgiIHwgJFNFRCAtZSAncyxeXFwoLlxcKTosL1xcMSxnJyAtZSAncyxcXFxcLC8sZydgCisgICAgV0lOX1NES19CQVNFPSIkdW5peF9wYXRoIgorICBmaQorCisgICAgaWYgdGVzdCAtZCAiJFdJTl9TREtfQkFTRSI7IHRoZW4KKyAgICAgIGlmIHRlc3QgLWYgIiRXSU5fU0RLX0JBU0UvU2V0RW52LkNtZCI7IHRoZW4KKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBGb3VuZCBXaW5kb3dzIFNESyBpbnN0YWxsYXRpb24gYXQgJFdJTl9TREtfQkFTRSB1c2luZyAkTUVUSE9EIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IEZvdW5kIFdpbmRvd3MgU0RLIGluc3RhbGxhdGlvbiBhdCAkV0lOX1NES19CQVNFIHVzaW5nICRNRVRIT0QiID4mNjt9CisgICAgICAgIFZTX0VOVl9DTUQ9IiRXSU5fU0RLX0JBU0UvU2V0RW52LkNtZCIKKyAgICAgICAgaWYgdGVzdCAieCRPUEVOSkRLX1RBUkdFVF9DUFVfQklUUyIgPSB4MzI7IHRoZW4KKyAgICAgICAgICBWU19FTlZfQVJHUz0iL3g4NiIKKyAgICAgICAgZWxzZQorICAgICAgICAgIFZTX0VOVl9BUkdTPSIveDY0IgorICAgICAgICBmaQorICAgICAgZWxzZQorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IEZvdW5kIFdpbmRvd3MgU0RLIGluc3RhbGxhdGlvbiBhdCAkV0lOX1NES19CQVNFIHVzaW5nICRNRVRIT0QiID4mNQorJGFzX2VjaG8gIiRhc19tZTogRm91bmQgV2luZG93cyBTREsgaW5zdGFsbGF0aW9uIGF0ICRXSU5fU0RLX0JBU0UgdXNpbmcgJE1FVEhPRCIgPiY2O30KKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXYXJuaW5nOiBJbnN0YWxsYXRpb24gaXMgYnJva2VuLCBTZXRFbnYuQ21kIGlzIG1pc3NpbmcuIElnbm9yaW5nIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdhcm5pbmc6IEluc3RhbGxhdGlvbiBpcyBicm9rZW4sIFNldEVudi5DbWQgaXMgbWlzc2luZy4gSWdub3JpbmciID4mNjt9CisgICAgICBmaQorICAgIGZpCisgIGZpCisKKyAgZmkKKyAgaWYgdGVzdCAieCRQUk9HUkFNRklMRVMiICE9IHg7IHRoZW4KKworICBpZiB0ZXN0ICJ4JFZTX0VOVl9DTUQiID0geDsgdGhlbgorICAgIFdJTl9TREtfQkFTRT0iJFBST0dSQU1GSUxFUy9NaWNyb3NvZnQgU0RLcy9XaW5kb3dzL3Y3LjEvQmluIgorICAgIE1FVEhPRD0id2VsbC1rbm93biBuYW1lIgorCisgIHdpbmRvd3NfcGF0aD0iJFdJTl9TREtfQkFTRSIKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJENZR1BBVEggLXUgIiR3aW5kb3dzX3BhdGgiYAorICAgIFdJTl9TREtfQkFTRT0iJHVuaXhfcGF0aCIKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJEVDSE8gIiR3aW5kb3dzX3BhdGgiIHwgJFNFRCAtZSAncyxeXFwoLlxcKTosL1xcMSxnJyAtZSAncyxcXFxcLC8sZydgCisgICAgV0lOX1NES19CQVNFPSIkdW5peF9wYXRoIgorICBmaQorCisgICAgaWYgdGVzdCAtZCAiJFdJTl9TREtfQkFTRSI7IHRoZW4KKyAgICAgIGlmIHRlc3QgLWYgIiRXSU5fU0RLX0JBU0UvU2V0RW52LkNtZCI7IHRoZW4KKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBGb3VuZCBXaW5kb3dzIFNESyBpbnN0YWxsYXRpb24gYXQgJFdJTl9TREtfQkFTRSB1c2luZyAkTUVUSE9EIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IEZvdW5kIFdpbmRvd3MgU0RLIGluc3RhbGxhdGlvbiBhdCAkV0lOX1NES19CQVNFIHVzaW5nICRNRVRIT0QiID4mNjt9CisgICAgICAgIFZTX0VOVl9DTUQ9IiRXSU5fU0RLX0JBU0UvU2V0RW52LkNtZCIKKyAgICAgICAgaWYgdGVzdCAieCRPUEVOSkRLX1RBUkdFVF9DUFVfQklUUyIgPSB4MzI7IHRoZW4KKyAgICAgICAgICBWU19FTlZfQVJHUz0iL3g4NiIKKyAgICAgICAgZWxzZQorICAgICAgICAgIFZTX0VOVl9BUkdTPSIveDY0IgorICAgICAgICBmaQorICAgICAgZWxzZQorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IEZvdW5kIFdpbmRvd3MgU0RLIGluc3RhbGxhdGlvbiBhdCAkV0lOX1NES19CQVNFIHVzaW5nICRNRVRIT0QiID4mNQorJGFzX2VjaG8gIiRhc19tZTogRm91bmQgV2luZG93cyBTREsgaW5zdGFsbGF0aW9uIGF0ICRXSU5fU0RLX0JBU0UgdXNpbmcgJE1FVEhPRCIgPiY2O30KKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXYXJuaW5nOiBJbnN0YWxsYXRpb24gaXMgYnJva2VuLCBTZXRFbnYuQ21kIGlzIG1pc3NpbmcuIElnbm9yaW5nIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdhcm5pbmc6IEluc3RhbGxhdGlvbiBpcyBicm9rZW4sIFNldEVudi5DbWQgaXMgbWlzc2luZy4gSWdub3JpbmciID4mNjt9CisgICAgICBmaQorICAgIGZpCisgIGZpCisKKyAgZmkKKworICBpZiB0ZXN0ICJ4JFZTX0VOVl9DTUQiID0geDsgdGhlbgorICAgIFdJTl9TREtfQkFTRT0iQzovUHJvZ3JhbSBGaWxlcy9NaWNyb3NvZnQgU0RLcy9XaW5kb3dzL3Y3LjEvQmluIgorICAgIE1FVEhPRD0id2VsbC1rbm93biBuYW1lIgorCisgIHdpbmRvd3NfcGF0aD0iJFdJTl9TREtfQkFTRSIKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJENZR1BBVEggLXUgIiR3aW5kb3dzX3BhdGgiYAorICAgIFdJTl9TREtfQkFTRT0iJHVuaXhfcGF0aCIKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJEVDSE8gIiR3aW5kb3dzX3BhdGgiIHwgJFNFRCAtZSAncyxeXFwoLlxcKTosL1xcMSxnJyAtZSAncyxcXFxcLC8sZydgCisgICAgV0lOX1NES19CQVNFPSIkdW5peF9wYXRoIgorICBmaQorCisgICAgaWYgdGVzdCAtZCAiJFdJTl9TREtfQkFTRSI7IHRoZW4KKyAgICAgIGlmIHRlc3QgLWYgIiRXSU5fU0RLX0JBU0UvU2V0RW52LkNtZCI7IHRoZW4KKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBGb3VuZCBXaW5kb3dzIFNESyBpbnN0YWxsYXRpb24gYXQgJFdJTl9TREtfQkFTRSB1c2luZyAkTUVUSE9EIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IEZvdW5kIFdpbmRvd3MgU0RLIGluc3RhbGxhdGlvbiBhdCAkV0lOX1NES19CQVNFIHVzaW5nICRNRVRIT0QiID4mNjt9CisgICAgICAgIFZTX0VOVl9DTUQ9IiRXSU5fU0RLX0JBU0UvU2V0RW52LkNtZCIKKyAgICAgICAgaWYgdGVzdCAieCRPUEVOSkRLX1RBUkdFVF9DUFVfQklUUyIgPSB4MzI7IHRoZW4KKyAgICAgICAgICBWU19FTlZfQVJHUz0iL3g4NiIKKyAgICAgICAgZWxzZQorICAgICAgICAgIFZTX0VOVl9BUkdTPSIveDY0IgorICAgICAgICBmaQorICAgICAgZWxzZQorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IEZvdW5kIFdpbmRvd3MgU0RLIGluc3RhbGxhdGlvbiBhdCAkV0lOX1NES19CQVNFIHVzaW5nICRNRVRIT0QiID4mNQorJGFzX2VjaG8gIiRhc19tZTogRm91bmQgV2luZG93cyBTREsgaW5zdGFsbGF0aW9uIGF0ICRXSU5fU0RLX0JBU0UgdXNpbmcgJE1FVEhPRCIgPiY2O30KKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXYXJuaW5nOiBJbnN0YWxsYXRpb24gaXMgYnJva2VuLCBTZXRFbnYuQ21kIGlzIG1pc3NpbmcuIElnbm9yaW5nIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdhcm5pbmc6IEluc3RhbGxhdGlvbiBpcyBicm9rZW4sIFNldEVudi5DbWQgaXMgbWlzc2luZy4gSWdub3JpbmciID4mNjt9CisgICAgICBmaQorICAgIGZpCisgIGZpCisKKworICBpZiB0ZXN0ICJ4JFZTX0VOVl9DTUQiID0geDsgdGhlbgorICAgIFdJTl9TREtfQkFTRT0iQzovUHJvZ3JhbSBGaWxlcyAoeDg2KS9NaWNyb3NvZnQgU0RLcy9XaW5kb3dzL3Y3LjEvQmluIgorICAgIE1FVEhPRD0id2VsbC1rbm93biBuYW1lIgorCisgIHdpbmRvd3NfcGF0aD0iJFdJTl9TREtfQkFTRSIKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJENZR1BBVEggLXUgIiR3aW5kb3dzX3BhdGgiYAorICAgIFdJTl9TREtfQkFTRT0iJHVuaXhfcGF0aCIKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJEVDSE8gIiR3aW5kb3dzX3BhdGgiIHwgJFNFRCAtZSAncyxeXFwoLlxcKTosL1xcMSxnJyAtZSAncyxcXFxcLC8sZydgCisgICAgV0lOX1NES19CQVNFPSIkdW5peF9wYXRoIgorICBmaQorCisgICAgaWYgdGVzdCAtZCAiJFdJTl9TREtfQkFTRSI7IHRoZW4KKyAgICAgIGlmIHRlc3QgLWYgIiRXSU5fU0RLX0JBU0UvU2V0RW52LkNtZCI7IHRoZW4KKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBGb3VuZCBXaW5kb3dzIFNESyBpbnN0YWxsYXRpb24gYXQgJFdJTl9TREtfQkFTRSB1c2luZyAkTUVUSE9EIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IEZvdW5kIFdpbmRvd3MgU0RLIGluc3RhbGxhdGlvbiBhdCAkV0lOX1NES19CQVNFIHVzaW5nICRNRVRIT0QiID4mNjt9CisgICAgICAgIFZTX0VOVl9DTUQ9IiRXSU5fU0RLX0JBU0UvU2V0RW52LkNtZCIKKyAgICAgICAgaWYgdGVzdCAieCRPUEVOSkRLX1RBUkdFVF9DUFVfQklUUyIgPSB4MzI7IHRoZW4KKyAgICAgICAgICBWU19FTlZfQVJHUz0iL3g4NiIKKyAgICAgICAgZWxzZQorICAgICAgICAgIFZTX0VOVl9BUkdTPSIveDY0IgorICAgICAgICBmaQorICAgICAgZWxzZQorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IEZvdW5kIFdpbmRvd3MgU0RLIGluc3RhbGxhdGlvbiBhdCAkV0lOX1NES19CQVNFIHVzaW5nICRNRVRIT0QiID4mNQorJGFzX2VjaG8gIiRhc19tZTogRm91bmQgV2luZG93cyBTREsgaW5zdGFsbGF0aW9uIGF0ICRXSU5fU0RLX0JBU0UgdXNpbmcgJE1FVEhPRCIgPiY2O30KKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXYXJuaW5nOiBJbnN0YWxsYXRpb24gaXMgYnJva2VuLCBTZXRFbnYuQ21kIGlzIG1pc3NpbmcuIElnbm9yaW5nIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdhcm5pbmc6IEluc3RhbGxhdGlvbiBpcyBicm9rZW4sIFNldEVudi5DbWQgaXMgbWlzc2luZy4gSWdub3JpbmciID4mNjt9CisgICAgICBmaQorICAgIGZpCisgIGZpCisKKworICBpZiB0ZXN0ICJ4JFZTMTAwQ09NTlRPT0xTIiAhPSB4OyB0aGVuCisKKyAgaWYgdGVzdCAieCRWU19FTlZfQ01EIiA9IHg7IHRoZW4KKyAgICBWUzEwMEJBU0U9IiRWUzEwMENPTU5UT09MUy8uLi8uLiIKKyAgICBNRVRIT0Q9IlZTMTAwQ09NTlRPT0xTIHZhcmlhYmxlIgorCisgIHdpbmRvd3NfcGF0aD0iJFZTMTAwQkFTRSIKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJENZR1BBVEggLXUgIiR3aW5kb3dzX3BhdGgiYAorICAgIFZTMTAwQkFTRT0iJHVuaXhfcGF0aCIKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJEVDSE8gIiR3aW5kb3dzX3BhdGgiIHwgJFNFRCAtZSAncyxeXFwoLlxcKTosL1xcMSxnJyAtZSAncyxcXFxcLC8sZydgCisgICAgVlMxMDBCQVNFPSIkdW5peF9wYXRoIgorICBmaQorCisgICAgaWYgdGVzdCAtZCAiJFZTMTAwQkFTRSI7IHRoZW4KKyAgICAgIGlmIHRlc3QgLWYgIiRWUzEwMEJBU0UvJFZDVkFSU0ZJTEUiOyB0aGVuCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogRm91bmQgVmlzdWFsIFN0dWRpbyBpbnN0YWxsYXRpb24gYXQgJFZTMTAwQkFTRSB1c2luZyAkTUVUSE9EIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IEZvdW5kIFZpc3VhbCBTdHVkaW8gaW5zdGFsbGF0aW9uIGF0ICRWUzEwMEJBU0UgdXNpbmcgJE1FVEhPRCIgPiY2O30KKyAgICAgICAgVlNfRU5WX0NNRD0iJFZTMTAwQkFTRS8kVkNWQVJTRklMRSIKKyAgICAgIGVsc2UKKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBGb3VuZCBWaXN1YWwgU3R1ZGlvIGluc3RhbGxhdGlvbiBhdCAkVlMxMDBCQVNFIHVzaW5nICRNRVRIT0QiID4mNQorJGFzX2VjaG8gIiRhc19tZTogRm91bmQgVmlzdWFsIFN0dWRpbyBpbnN0YWxsYXRpb24gYXQgJFZTMTAwQkFTRSB1c2luZyAkTUVUSE9EIiA+JjY7fQorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdhcm5pbmc6ICRWQ1ZBUlNGSUxFIGlzIG1pc3NpbmcsIHRoaXMgaXMgcHJvYmFibHkgVmlzdWFsIFN0dWRpbyBFeHByZXNzLiBJZ25vcmluZyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXYXJuaW5nOiAkVkNWQVJTRklMRSBpcyBtaXNzaW5nLCB0aGlzIGlzIHByb2JhYmx5IFZpc3VhbCBTdHVkaW8gRXhwcmVzcy4gSWdub3JpbmciID4mNjt9CisgICAgICBmaQorICAgIGZpCisgIGZpCisKKyAgZmkKKyAgaWYgdGVzdCAieCRQUk9HUkFNRklMRVMiICE9IHg7IHRoZW4KKworICBpZiB0ZXN0ICJ4JFZTX0VOVl9DTUQiID0geDsgdGhlbgorICAgIFZTMTAwQkFTRT0iJFBST0dSQU1GSUxFUy9NaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyAxMC4wIgorICAgIE1FVEhPRD0id2VsbC1rbm93biBuYW1lIgorCisgIHdpbmRvd3NfcGF0aD0iJFZTMTAwQkFTRSIKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJENZR1BBVEggLXUgIiR3aW5kb3dzX3BhdGgiYAorICAgIFZTMTAwQkFTRT0iJHVuaXhfcGF0aCIKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJEVDSE8gIiR3aW5kb3dzX3BhdGgiIHwgJFNFRCAtZSAncyxeXFwoLlxcKTosL1xcMSxnJyAtZSAncyxcXFxcLC8sZydgCisgICAgVlMxMDBCQVNFPSIkdW5peF9wYXRoIgorICBmaQorCisgICAgaWYgdGVzdCAtZCAiJFZTMTAwQkFTRSI7IHRoZW4KKyAgICAgIGlmIHRlc3QgLWYgIiRWUzEwMEJBU0UvJFZDVkFSU0ZJTEUiOyB0aGVuCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogRm91bmQgVmlzdWFsIFN0dWRpbyBpbnN0YWxsYXRpb24gYXQgJFZTMTAwQkFTRSB1c2luZyAkTUVUSE9EIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IEZvdW5kIFZpc3VhbCBTdHVkaW8gaW5zdGFsbGF0aW9uIGF0ICRWUzEwMEJBU0UgdXNpbmcgJE1FVEhPRCIgPiY2O30KKyAgICAgICAgVlNfRU5WX0NNRD0iJFZTMTAwQkFTRS8kVkNWQVJTRklMRSIKKyAgICAgIGVsc2UKKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBGb3VuZCBWaXN1YWwgU3R1ZGlvIGluc3RhbGxhdGlvbiBhdCAkVlMxMDBCQVNFIHVzaW5nICRNRVRIT0QiID4mNQorJGFzX2VjaG8gIiRhc19tZTogRm91bmQgVmlzdWFsIFN0dWRpbyBpbnN0YWxsYXRpb24gYXQgJFZTMTAwQkFTRSB1c2luZyAkTUVUSE9EIiA+JjY7fQorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdhcm5pbmc6ICRWQ1ZBUlNGSUxFIGlzIG1pc3NpbmcsIHRoaXMgaXMgcHJvYmFibHkgVmlzdWFsIFN0dWRpbyBFeHByZXNzLiBJZ25vcmluZyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXYXJuaW5nOiAkVkNWQVJTRklMRSBpcyBtaXNzaW5nLCB0aGlzIGlzIHByb2JhYmx5IFZpc3VhbCBTdHVkaW8gRXhwcmVzcy4gSWdub3JpbmciID4mNjt9CisgICAgICBmaQorICAgIGZpCisgIGZpCisKKyAgZmkKKworICBpZiB0ZXN0ICJ4JFZTX0VOVl9DTUQiID0geDsgdGhlbgorICAgIFZTMTAwQkFTRT0iQzovUHJvZ3JhbSBGaWxlcy9NaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyAxMC4wIgorICAgIE1FVEhPRD0id2VsbC1rbm93biBuYW1lIgorCisgIHdpbmRvd3NfcGF0aD0iJFZTMTAwQkFTRSIKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJENZR1BBVEggLXUgIiR3aW5kb3dzX3BhdGgiYAorICAgIFZTMTAwQkFTRT0iJHVuaXhfcGF0aCIKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJEVDSE8gIiR3aW5kb3dzX3BhdGgiIHwgJFNFRCAtZSAncyxeXFwoLlxcKTosL1xcMSxnJyAtZSAncyxcXFxcLC8sZydgCisgICAgVlMxMDBCQVNFPSIkdW5peF9wYXRoIgorICBmaQorCisgICAgaWYgdGVzdCAtZCAiJFZTMTAwQkFTRSI7IHRoZW4KKyAgICAgIGlmIHRlc3QgLWYgIiRWUzEwMEJBU0UvJFZDVkFSU0ZJTEUiOyB0aGVuCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogRm91bmQgVmlzdWFsIFN0dWRpbyBpbnN0YWxsYXRpb24gYXQgJFZTMTAwQkFTRSB1c2luZyAkTUVUSE9EIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IEZvdW5kIFZpc3VhbCBTdHVkaW8gaW5zdGFsbGF0aW9uIGF0ICRWUzEwMEJBU0UgdXNpbmcgJE1FVEhPRCIgPiY2O30KKyAgICAgICAgVlNfRU5WX0NNRD0iJFZTMTAwQkFTRS8kVkNWQVJTRklMRSIKKyAgICAgIGVsc2UKKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBGb3VuZCBWaXN1YWwgU3R1ZGlvIGluc3RhbGxhdGlvbiBhdCAkVlMxMDBCQVNFIHVzaW5nICRNRVRIT0QiID4mNQorJGFzX2VjaG8gIiRhc19tZTogRm91bmQgVmlzdWFsIFN0dWRpbyBpbnN0YWxsYXRpb24gYXQgJFZTMTAwQkFTRSB1c2luZyAkTUVUSE9EIiA+JjY7fQorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdhcm5pbmc6ICRWQ1ZBUlNGSUxFIGlzIG1pc3NpbmcsIHRoaXMgaXMgcHJvYmFibHkgVmlzdWFsIFN0dWRpbyBFeHByZXNzLiBJZ25vcmluZyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXYXJuaW5nOiAkVkNWQVJTRklMRSBpcyBtaXNzaW5nLCB0aGlzIGlzIHByb2JhYmx5IFZpc3VhbCBTdHVkaW8gRXhwcmVzcy4gSWdub3JpbmciID4mNjt9CisgICAgICBmaQorICAgIGZpCisgIGZpCisKKworICBpZiB0ZXN0ICJ4JFZTX0VOVl9DTUQiID0geDsgdGhlbgorICAgIFZTMTAwQkFTRT0iQzovUHJvZ3JhbSBGaWxlcyAoeDg2KS9NaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyAxMC4wIgorICAgIE1FVEhPRD0id2VsbC1rbm93biBuYW1lIgorCisgIHdpbmRvd3NfcGF0aD0iJFZTMTAwQkFTRSIKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJENZR1BBVEggLXUgIiR3aW5kb3dzX3BhdGgiYAorICAgIFZTMTAwQkFTRT0iJHVuaXhfcGF0aCIKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJEVDSE8gIiR3aW5kb3dzX3BhdGgiIHwgJFNFRCAtZSAncyxeXFwoLlxcKTosL1xcMSxnJyAtZSAncyxcXFxcLC8sZydgCisgICAgVlMxMDBCQVNFPSIkdW5peF9wYXRoIgorICBmaQorCisgICAgaWYgdGVzdCAtZCAiJFZTMTAwQkFTRSI7IHRoZW4KKyAgICAgIGlmIHRlc3QgLWYgIiRWUzEwMEJBU0UvJFZDVkFSU0ZJTEUiOyB0aGVuCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogRm91bmQgVmlzdWFsIFN0dWRpbyBpbnN0YWxsYXRpb24gYXQgJFZTMTAwQkFTRSB1c2luZyAkTUVUSE9EIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IEZvdW5kIFZpc3VhbCBTdHVkaW8gaW5zdGFsbGF0aW9uIGF0ICRWUzEwMEJBU0UgdXNpbmcgJE1FVEhPRCIgPiY2O30KKyAgICAgICAgVlNfRU5WX0NNRD0iJFZTMTAwQkFTRS8kVkNWQVJTRklMRSIKKyAgICAgIGVsc2UKKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBGb3VuZCBWaXN1YWwgU3R1ZGlvIGluc3RhbGxhdGlvbiBhdCAkVlMxMDBCQVNFIHVzaW5nICRNRVRIT0QiID4mNQorJGFzX2VjaG8gIiRhc19tZTogRm91bmQgVmlzdWFsIFN0dWRpbyBpbnN0YWxsYXRpb24gYXQgJFZTMTAwQkFTRSB1c2luZyAkTUVUSE9EIiA+JjY7fQorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdhcm5pbmc6ICRWQ1ZBUlNGSUxFIGlzIG1pc3NpbmcsIHRoaXMgaXMgcHJvYmFibHkgVmlzdWFsIFN0dWRpbyBFeHByZXNzLiBJZ25vcmluZyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXYXJuaW5nOiAkVkNWQVJTRklMRSBpcyBtaXNzaW5nLCB0aGlzIGlzIHByb2JhYmx5IFZpc3VhbCBTdHVkaW8gRXhwcmVzcy4gSWdub3JpbmciID4mNjt9CisgICAgICBmaQorICAgIGZpCisgIGZpCisKKworICBpZiB0ZXN0ICJ4JFZTX0VOVl9DTUQiICE9IHg7IHRoZW4KKyAgICAjIFdlIGhhdmUgZm91bmQgYSBWaXN1YWwgU3R1ZGlvIGVudmlyb25tZW50IG9uIGRpc2ssIGxldCdzIGV4dHJhY3QgdmFyaWFibGVzIGZyb20gdGhlIHZzdmFycyBiYXQgZmlsZS4KKworICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5jeWd3aW4iOyB0aGVuCisKKyAgIyBGaXJzdCBzZXBhcmF0ZSB0aGUgcGF0aCBmcm9tIHRoZSBhcmd1bWVudHMuIFRoaXMgd2lsbCBzcGxpdCBhdCB0aGUgZmlyc3QKKyAgIyBzcGFjZS4KKyAgY29tcGxldGU9IiRWU19FTlZfQ01EIgorICBwYXRoPSIke2NvbXBsZXRlJSUgKn0iCisgIHRtcD0iJGNvbXBsZXRlIEVPTCIKKyAgYXJndW1lbnRzPSIke3RtcCMqIH0iCisKKyAgIyBJbnB1dCBtaWdodCBiZSBnaXZlbiBhcyBXaW5kb3dzIGZvcm1hdCwgc3RhcnQgYnkgY29udmVydGluZyB0bworICAjIHVuaXggZm9ybWF0LgorICBuZXdfcGF0aD1gJENZR1BBVEggLXUgIiRwYXRoImAKKworICAjIE5vdyB0cnkgdG8gbG9jYXRlIGV4ZWN1dGFibGUgdXNpbmcgd2hpY2gKKyAgbmV3X3BhdGg9YCRXSElDSCAiJG5ld19wYXRoIiAyPiAvZGV2L251bGxgCisgIGlmIHRlc3QgIngkbmV3X3BhdGgiID0geDsgdGhlbgorICAgICMgT29wcy4gV2hpY2ggZGlkbid0IGZpbmQgdGhlIGV4ZWN1dGFibGUuCisgICAgIyBUaGUgc3BsaXR0aW5nIG9mIGFyZ3VtZW50cyBmcm9tIHRoZSBleGVjdXRhYmxlIGF0IGEgc3BhY2UgbWlnaHQgaGF2ZSBiZWVuIGluY29ycmVjdCwKKyAgICAjIHNpbmNlIHBhdGhzIHdpdGggc3BhY2UgYXJlIG1vcmUgbGlrZWx5IGluIFdpbmRvd3MuIEdpdmUgaXQgYW5vdGhlciB0cnkgd2l0aCB0aGUgd2hvbGUKKyAgICAjIGFyZ3VtZW50LgorICAgIHBhdGg9IiRjb21wbGV0ZSIKKyAgICBhcmd1bWVudHM9IkVPTCIKKyAgICBuZXdfcGF0aD1gJENZR1BBVEggLXUgIiRwYXRoImAKKyAgICBuZXdfcGF0aD1gJFdISUNIICIkbmV3X3BhdGgiIDI+IC9kZXYvbnVsbGAKKyAgICBpZiB0ZXN0ICJ4JG5ld19wYXRoIiA9IHg7IHRoZW4KKyAgICAgICMgSXQncyBzdGlsbCBub3QgZm91bmQuIE5vdyB0aGlzIGlzIGFuIHVucmVjb3ZlcmFibGUgZXJyb3IuCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSBwYXRoIG9mIFZTX0VOVl9DTUQsIHdoaWNoIHJlc29sdmVzIGFzIFwiJGNvbXBsZXRlXCIsIGlzIG5vdCBmb3VuZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhlIHBhdGggb2YgVlNfRU5WX0NNRCwgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkY29tcGxldGVcIiwgaXMgbm90IGZvdW5kLiIgPiY2O30KKyAgICAgIGhhc19zcGFjZT1gJEVDSE8gIiRjb21wbGV0ZSIgfCAkR1JFUCAiICJgCisgICAgICBpZiB0ZXN0ICJ4JGhhc19zcGFjZSIgIT0geDsgdGhlbgorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFlvdSBtaWdodCBiZSBtaXhpbmcgc3BhY2VzIGluIHRoZSBwYXRoIGFuZCBleHRyYSBhcmd1bWVudHMsIHdoaWNoIGlzIG5vdCBhbGxvd2VkLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBZb3UgbWlnaHQgYmUgbWl4aW5nIHNwYWNlcyBpbiB0aGUgcGF0aCBhbmQgZXh0cmEgYXJndW1lbnRzLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iID4mNjt9CisgICAgICBmaQorICAgICAgYXNfZm5fZXJyb3IgJD8gIkNhbm5vdCBsb2NhdGUgdGhlIHRoZSBwYXRoIG9mIFZTX0VOVl9DTUQiICIkTElORU5PIiA1CisgICAgZmkKKyAgZmkKKworICAjIEN5Z3dpbiB0cmllcyB0byBoaWRlIHNvbWUgYXNwZWN0cyBvZiB0aGUgV2luZG93cyBmaWxlIHN5c3RlbSwgc3VjaCB0aGF0IGJpbmFyaWVzIGFyZQorICAjIG5hbWVkIC5leGUgYnV0IGNhbGxlZCB3aXRob3V0IHRoYXQgc3VmZml4LiBUaGVyZWZvcmUsICJmb28iIGFuZCAiZm9vLmV4ZSIgYXJlIGNvbnNpZGVyZWQKKyAgIyB0aGUgc2FtZSBmaWxlLCBtb3N0IG9mIHRoZSB0aW1lIChhcyBpbiAidGVzdCAtZiIpLiBCdXQgbm90IHdoZW4gcnVubmluZyBjeWdwYXRoIC1zLCB0aGVuCisgICMgImZvby5leGUiIGlzIE9LIGJ1dCAiZm9vIiBpcyBhbiBlcnJvci4KKyAgIworICAjIFRoaXMgdGVzdCBpcyB0aGVyZWZvcmUgc2xpZ2h0bHkgbW9yZSBhY2N1cmF0ZSB0aGFuICJ0ZXN0IC1mIiB0byBjaGVjayBmb3IgZmlsZSBwcmVjZW5zZS4KKyAgIyBJdCBpcyBhbHNvIGEgd2F5IHRvIG1ha2Ugc3VyZSB3ZSBnb3QgdGhlIHByb3BlciBmaWxlIG5hbWUgZm9yIHRoZSByZWFsIHRlc3QgbGF0ZXIgb24uCisgIHRlc3Rfc2hvcnRwYXRoPWAkQ1lHUEFUSCAtcyAtbSAiJG5ld19wYXRoIiAyPiAvZGV2L251bGxgCisgIGlmIHRlc3QgIngkdGVzdF9zaG9ydHBhdGgiID0geDsgdGhlbgorICAgICMgU2hvcnQgcGF0aCBmYWlsZWQsIGZpbGUgZG9lcyBub3QgZXhpc3QgYXMgc3BlY2lmaWVkLgorICAgICMgVHJ5IGFkZGluZyAuZXhlIG9yIC5jbWQKKyAgICBpZiB0ZXN0IC1mICIke25ld19wYXRofS5leGUiOyB0aGVuCisgICAgICAgaW5wdXRfdG9fc2hvcnRwYXRoPSIke25ld19wYXRofS5leGUiCisgICAgZWxpZiB0ZXN0IC1mICIke25ld19wYXRofS5jbWQiOyB0aGVuCisgICAgICAgaW5wdXRfdG9fc2hvcnRwYXRoPSIke25ld19wYXRofS5jbWQiCiAgICAgZWxzZQotICAgICAgICAjIEFoLCB3ZSBoYXZlIG5vdCB5ZXQgcnVuIHZjdmFyc2FsbC5iYXQvdnN2YXJzMzIuYmF0L3ZzdmFyczY0LmJhdC4gTGV0cyBkbyB0aGF0LiBGaXJzdCBmaW5kIGl0LgotICAgICAgICBpZiB0ZXN0ICJ4JFZTMTAwQ09NTlRPT0xTIiAhPSB4OyB0aGVuCi0gICAgICAgICAgICBWQVJTQkFUPWBmaW5kICIkVlMxMDBDT01OVE9PTFMvLi4vLi4iIC1uYW1lIHZjdmFyc2FsbC5iYXRgCi0JICAgIFNFQVJDSF9ST09UPSIkVlMxMDBDT01OVE9PTFMiCi0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIFZBUlNCQVQ9YGZpbmQgIiRQUk9HUkFNRklMRVMiIC1uYW1lIHZjdmFyc2FsbC5iYXRgCi0JICAgIFNFQVJDSF9ST09UPSIkUFJPR1JBTUZJTEVTIgotICAgICAgICBmaQotICAgICAgICBWQ1BBVEg9YGRpcm5hbWUgIiRWQVJTQkFUImAKLSAgICAgICAgVkNQQVRIPWBjeWdwYXRoIC13ICIkVkNQQVRIImAKLQlpZiB0ZXN0ICJ4JFZBUlNCQVQiID0geCB8fCB0ZXN0ICEgLWQgIiRWQ1BBVEgiOyB0aGVuCi0gICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmIHdlIGNhbiBmaW5kIHRoZSBWUyBpbnN0YWxsYXRpb24iID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgd2UgY2FuIGZpbmQgdGhlIFZTIGluc3RhbGxhdGlvbi4uLiAiID4mNjsgfQotICAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKLSRhc19lY2hvICJubyIgPiY2OyB9Ci0gICAgICAgICAgICBhc19mbl9lcnJvciAkPyAiVHJpZWQgdG8gZmluZCBhIFZTIGluc3RhbGxhdGlvbiB1c2luZyBib3RoICRTRUFSQ0hfUk9PVCBidXQgZmFpbGVkLiBQbGVhc2UgcnVuIFwiYzpcXGN5Z3dpblxcYmluXFxiYXNoLmV4ZSAtbFwiIGZyb20gYSBWUyBjb21tYW5kIHByb21wdCBhbmQgdGhlbiBydW4gY29uZmlndXJlL21ha2UgZnJvbSB0aGVyZS4iICIkTElORU5PIiA1Ci0gICAgICAgIGZpCi0gICAgICAgIGNhc2UgIiRPUEVOSkRLX1RBUkdFVF9DUFUiIGluCi0gICAgICAgICAgeDg2KQotICAgICAgICAgICAgVkFSU0JBVF9BUkNIPXg4NgotICAgICAgICAgICAgOzsKLSAgICAgICAgICB4ODZfNjQpCi0gICAgICAgICAgICBWQVJTQkFUX0FSQ0g9YW1kNjQKLSAgICAgICAgICAgIDs7Ci0gICAgICAgIGVzYWMKLSAgICAgICAgIyBMZXRzIGV4dHJhY3QgdGhlIHZhcmlhYmxlcyB0aGF0IGFyZSBzZXQgYnkgdmN2YXJzYWxsLmJhdC92c3ZhcnMzMi5iYXQvdnN2YXJzNjQuYmF0Ci0gICAgICAgIGNkICRPVVRQVVRfUk9PVAotICAgICAgICBiYXNoICRTUkNfUk9PVC9jb21tb24vYmluL2V4dHJhY3R2Y3ZhcnMuc2ggIiRWQVJTQkFUIiAiJFZBUlNCQVRfQVJDSCIKLQljZCAkQ1VSRElSCi0JaWYgdGVzdCAhIC1zICRPVVRQVVRfUk9PVC9sb2NhbGRldmVudi5zaCB8fCB0ZXN0ICEgLXMgJE9VVFBVVF9ST09UL2xvY2FsZGV2ZW52LmdtazsgdGhlbgotICAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiB3ZSBjYW4gZXh0cmFjdCB0aGUgbmVlZGVkIGVudiB2YXJpYWJsZXMiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgd2UgY2FuIGV4dHJhY3QgdGhlIG5lZWRlZCBlbnYgdmFyaWFibGVzLi4uICIgPiY2OyB9Ci0gICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLSAgICAgICAgICAgIGFzX2ZuX2Vycm9yICQ/ICJDb3VsZCBub3Qgc3VjY2VzZnVsbHkgZXh0cmFjdCB0aGUgZW52IHZhcmlhYmxlcyBuZWVkZWQgZm9yIHRoZSBWUyBzZXR1cC4gUGxlYXNlIHJ1biBcImM6XFxjeWd3aW5cXGJpblxcYmFzaC5leGUgLWxcIiBmcm9tIGEgVlMgY29tbWFuZCBwcm9tcHQgYW5kIHRoZW4gcnVuIGNvbmZpZ3VyZS9tYWtlIGZyb20gdGhlcmUuIiAiJExJTkVOTyIgNQotICAgICAgICBmaQotICAgICAgICAjIE5vdyBzZXQgYWxsIHBhdGhzIGFuZCBvdGhlciBlbnYgdmFyaWFibGVzLiBUaGlzIHdpbGwgYWxsb3cgdGhlIHJlc3Qgb2YKLSAgICAgICAgIyB0aGUgY29uZmlndXJlIHNjcmlwdCB0byBmaW5kIGFuZCBydW4gdGhlIGNvbXBpbGVyIGluIHRoZSBwcm9wZXIgd2F5LgotICAgICAgICAuICRPVVRQVVRfUk9PVC9sb2NhbGRldmVudi5zaAotICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmIHdlIGNhbiBmaW5kIHRoZSBWUyBpbnN0YWxsYXRpb24iID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgd2UgY2FuIGZpbmQgdGhlIFZTIGluc3RhbGxhdGlvbi4uLiAiID4mNjsgfQotCWlmIHRlc3QgIngkVkNJTlNUQUxMRElSIiAhPSB4OyB0aGVuCi0gICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFZDSU5TVEFMTERJUiIgPiY1Ci0kYXNfZWNobyAiJFZDSU5TVEFMTERJUiIgPiY2OyB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotICAgICAgICAgICAgYXNfZm5fZXJyb3IgJD8gIkNvdWxkIG5vdCBmaW5kIFZTIGluc3RhbGxhdGlvbi4gUGxlYXNlIGluc3RhbGwuIElmIHlvdSBhcmUgc3VyZSB5b3UgaGF2ZSBpbnN0YWxsZWQgVlMsIHRoZW4gcGxlYXNlIHJ1biBcImM6XFxjeWd3aW5cXGJpblxcYmFzaC5leGUgLWxcIiBmcm9tIGEgVlMgY29tbWFuZCBwcm9tcHQgYW5kIHRoZW4gcnVuIGNvbmZpZ3VyZS9tYWtlIGZyb20gdGhlcmUuIiAiJExJTkVOTyIgNQotICAgICAgICBmaQotICAgICAgICBDSEVDS19GT1JfVkNJTlNUQUxMRElSPW5vCi0JU0VUVVBERVZFTlY9ImluY2x1ZGUgJE9VVFBVVF9ST09UL2xvY2FsZGV2ZW52LmdtayIKKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGhlIHBhdGggb2YgVlNfRU5WX0NNRCwgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkbmV3X3BhdGhcIiwgaXMgaW52YWxpZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhlIHBhdGggb2YgVlNfRU5WX0NNRCwgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkbmV3X3BhdGhcIiwgaXMgaW52YWxpZC4iID4mNjt9CisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IE5laXRoZXIgXCIkbmV3X3BhdGhcIiBub3IgXCIkbmV3X3BhdGguZXhlL2NtZFwiIGNhbiBiZSBmb3VuZCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBOZWl0aGVyIFwiJG5ld19wYXRoXCIgbm9yIFwiJG5ld19wYXRoLmV4ZS9jbWRcIiBjYW4gYmUgZm91bmQiID4mNjt9CisgICAgICBhc19mbl9lcnJvciAkPyAiQ2Fubm90IGxvY2F0ZSB0aGUgdGhlIHBhdGggb2YgVlNfRU5WX0NNRCIgIiRMSU5FTk8iIDUKKyAgICBmaQorICBlbHNlCisgICAgaW5wdXRfdG9fc2hvcnRwYXRoPSIkbmV3X3BhdGgiCisgIGZpCiAKLQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBtc3ZjcjEwMC5kbGwiID4mNQorICAjIENhbGwgaGVscGVyIGZ1bmN0aW9uIHdoaWNoIHBvc3NpYmx5IGNvbnZlcnRzIHRoaXMgdXNpbmcgRE9TLXN0eWxlIHNob3J0IG1vZGUuCisgICMgSWYgc28sIHRoZSB1cGRhdGVkIHBhdGggaXMgc3RvcmVkIGluICRuZXdfcGF0aC4KKyAgbmV3X3BhdGg9IiRpbnB1dF90b19zaG9ydHBhdGgiCisKKyAgaW5wdXRfcGF0aD0iJGlucHV0X3RvX3Nob3J0cGF0aCIKKyAgIyBDaGVjayBpZiB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhpcyB1c2luZyBET1Mtc3R5bGUgc2hvcnQgbW9kZS4gSWYgdGhlIHBhdGgKKyAgIyBjb250YWlucyBqdXN0IHNpbXBsZSBjaGFyYWN0ZXJzLCB1c2UgaXQuIE90aGVyd2lzZSAoc3BhY2VzLCB3ZWlyZCBjaGFyYWN0ZXJzKSwKKyAgIyB0YWtlIG5vIGNoYW5jZXMgYW5kIHJld3JpdGUgaXQuCisgICMgTm90ZTogbTQgZWF0cyBvdXIgW10sIHNvIHdlIG5lZWQgdG8gdXNlIFsgYW5kIF0gaW5zdGVhZC4KKyAgaGFzX2ZvcmJpZGRlbl9jaGFycz1gJEVDSE8gIiRpbnB1dF9wYXRoIiB8ICRHUkVQIFteLS5fL2EtekEtWjAtOV1gCisgIGlmIHRlc3QgIngkaGFzX2ZvcmJpZGRlbl9jaGFycyIgIT0geDsgdGhlbgorICAgICMgTm93IGNvbnZlcnQgaXQgdG8gbWl4ZWQgRE9TLXN0eWxlLCBzaG9ydCBtb2RlIChubyBzcGFjZXMsIGFuZCAvIGluc3RlYWQgb2YgXCkKKyAgICBzaG9ydG1vZGVfcGF0aD1gJENZR1BBVEggLXMgLW0gLWEgIiRpbnB1dF9wYXRoImAKKyAgICBwYXRoX2FmdGVyX3Nob3J0bW9kZT1gJENZR1BBVEggLXUgIiRzaG9ydG1vZGVfcGF0aCJgCisgICAgaWYgdGVzdCAieCRwYXRoX2FmdGVyX3Nob3J0bW9kZSIgIT0gIngkaW5wdXRfdG9fc2hvcnRwYXRoIjsgdGhlbgorICAgICAgIyBHb2luZyB0byBzaG9ydCBtb2RlIGFuZCBiYWNrIGFnYWluIGRpZCBpbmRlZWQgbWF0dGVyLiBTaW5jZSBzaG9ydCBtb2RlIGlzCisgICAgICAjIGNhc2UgaW5zZW5zaXRpdmUsIGxldCdzIG1ha2UgaXQgbG93ZXJjYXNlIHRvIGltcHJvdmUgcmVhZGFiaWxpdHkuCisgICAgICBzaG9ydG1vZGVfcGF0aD1gJEVDSE8gIiRzaG9ydG1vZGVfcGF0aCIgfCAkVFIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAorICAgICAgIyBOb3cgY29udmVydCBpdCBiYWNrIHRvIFVuaXgtc3RpbGUgKGN5Z3BhdGgpCisgICAgICBpbnB1dF9wYXRoPWAkQ1lHUEFUSCAtdSAiJHNob3J0bW9kZV9wYXRoImAKKyAgICAgIG5ld19wYXRoPSIkaW5wdXRfcGF0aCIKKyAgICBmaQorICBmaQorCisgIHRlc3RfY3lnZHJpdmVfcHJlZml4PWAkRUNITyAkaW5wdXRfcGF0aCB8ICRHUkVQIF4vY3lnZHJpdmUvYAorICBpZiB0ZXN0ICJ4JHRlc3RfY3lnZHJpdmVfcHJlZml4IiA9IHg7IHRoZW4KKyAgICAjIEFzIGEgc2ltcGxlIGZpeCwgZXhjbHVkZSAvdXNyL2JpbiBzaW5jZSBpdCdzIG5vdCBhIHJlYWwgcGF0aC4KKyAgICBpZiB0ZXN0ICJ4YCRFQ0hPICRpbnB1dF90b19zaG9ydHBhdGggfCAkR1JFUCBeL3Vzci9iaW4vYCIgPSB4OyB0aGVuCisgICAgICAjIFRoZSBwYXRoIGlzIGluIGEgQ3lnd2luIHNwZWNpYWwgZGlyZWN0b3J5IChlLmcuIC9ob21lKS4gV2UgbmVlZCB0aGlzIGNvbnZlcnRlZCB0bworICAgICAgIyBhIHBhdGggcHJlZml4ZWQgYnkgL2N5Z2RyaXZlIGZvciBmaXhwYXRoIHRvIHdvcmsuCisgICAgICBuZXdfcGF0aD0iJENZR1dJTl9ST09UX1BBVEgkaW5wdXRfcGF0aCIKKyAgICBmaQorICBmaQorCisgICMgcmVtb3ZlIHRyYWlsaW5nIC5leGUgaWYgYW55CisgIG5ld19wYXRoPSIke25ld19wYXRoLyUuZXhlL30iCisKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorCisgICMgRmlyc3Qgc2VwYXJhdGUgdGhlIHBhdGggZnJvbSB0aGUgYXJndW1lbnRzLiBUaGlzIHdpbGwgc3BsaXQgYXQgdGhlIGZpcnN0CisgICMgc3BhY2UuCisgIGNvbXBsZXRlPSIkVlNfRU5WX0NNRCIKKyAgcGF0aD0iJHtjb21wbGV0ZSUlICp9IgorICB0bXA9IiRjb21wbGV0ZSBFT0wiCisgIGFyZ3VtZW50cz0iJHt0bXAjKiB9IgorCisgICMgSW5wdXQgbWlnaHQgYmUgZ2l2ZW4gYXMgV2luZG93cyBmb3JtYXQsIHN0YXJ0IGJ5IGNvbnZlcnRpbmcgdG8KKyAgIyB1bml4IGZvcm1hdC4KKyAgbmV3X3BhdGg9IiRwYXRoIgorCisgIHdpbmRvd3NfcGF0aD0iJG5ld19wYXRoIgorICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5jeWd3aW4iOyB0aGVuCisgICAgdW5peF9wYXRoPWAkQ1lHUEFUSCAtdSAiJHdpbmRvd3NfcGF0aCJgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGVsaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MubXN5cyI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRFQ0hPICIkd2luZG93c19wYXRoIiB8ICRTRUQgLWUgJ3MsXlxcKC5cXCk6LC9cXDEsZycgLWUgJ3MsXFxcXCwvLGcnYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBmaQorCisKKyAgIyBOb3cgdHJ5IHRvIGxvY2F0ZSBleGVjdXRhYmxlIHVzaW5nIHdoaWNoCisgIG5ld19wYXRoPWAkV0hJQ0ggIiRuZXdfcGF0aCIgMj4gL2Rldi9udWxsYAorCisgIGlmIHRlc3QgIngkbmV3X3BhdGgiID0geDsgdGhlbgorICAgICMgT29wcy4gV2hpY2ggZGlkbid0IGZpbmQgdGhlIGV4ZWN1dGFibGUuCisgICAgIyBUaGUgc3BsaXR0aW5nIG9mIGFyZ3VtZW50cyBmcm9tIHRoZSBleGVjdXRhYmxlIGF0IGEgc3BhY2UgbWlnaHQgaGF2ZSBiZWVuIGluY29ycmVjdCwKKyAgICAjIHNpbmNlIHBhdGhzIHdpdGggc3BhY2UgYXJlIG1vcmUgbGlrZWx5IGluIFdpbmRvd3MuIEdpdmUgaXQgYW5vdGhlciB0cnkgd2l0aCB0aGUgd2hvbGUKKyAgICAjIGFyZ3VtZW50LgorICAgIHBhdGg9IiRjb21wbGV0ZSIKKyAgICBhcmd1bWVudHM9IkVPTCIKKyAgICBuZXdfcGF0aD0iJHBhdGgiCisKKyAgd2luZG93c19wYXRoPSIkbmV3X3BhdGgiCisgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLmN5Z3dpbiI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRDWUdQQVRIIC11ICIkd2luZG93c19wYXRoImAKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJEVDSE8gIiR3aW5kb3dzX3BhdGgiIHwgJFNFRCAtZSAncyxeXFwoLlxcKTosL1xcMSxnJyAtZSAncyxcXFxcLC8sZydgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGZpCisKKworICAgIG5ld19wYXRoPWAkV0hJQ0ggIiRuZXdfcGF0aCIgMj4gL2Rldi9udWxsYAorCisgICAgaWYgdGVzdCAieCRuZXdfcGF0aCIgPSB4OyB0aGVuCisgICAgICAjIEl0J3Mgc3RpbGwgbm90IGZvdW5kLiBOb3cgdGhpcyBpcyBhbiB1bnJlY292ZXJhYmxlIGVycm9yLgorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUaGUgcGF0aCBvZiBWU19FTlZfQ01ELCB3aGljaCByZXNvbHZlcyBhcyBcIiRjb21wbGV0ZVwiLCBpcyBub3QgZm91bmQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoZSBwYXRoIG9mIFZTX0VOVl9DTUQsIHdoaWNoIHJlc29sdmVzIGFzIFwiJGNvbXBsZXRlXCIsIGlzIG5vdCBmb3VuZC4iID4mNjt9CisgICAgICBoYXNfc3BhY2U9YCRFQ0hPICIkY29tcGxldGUiIHwgJEdSRVAgIiAiYAorICAgICAgaWYgdGVzdCAieCRoYXNfc3BhY2UiICE9IHg7IHRoZW4KKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBZb3UgbWlnaHQgYmUgbWl4aW5nIHNwYWNlcyBpbiB0aGUgcGF0aCBhbmQgZXh0cmEgYXJndW1lbnRzLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogWW91IG1pZ2h0IGJlIG1peGluZyBzcGFjZXMgaW4gdGhlIHBhdGggYW5kIGV4dHJhIGFyZ3VtZW50cywgd2hpY2ggaXMgbm90IGFsbG93ZWQuIiA+JjY7fQorICAgICAgZmkKKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJDYW5ub3QgbG9jYXRlIHRoZSB0aGUgcGF0aCBvZiBWU19FTlZfQ01EIiAiJExJTkVOTyIgNQorICAgIGZpCisgIGZpCisKKyAgIyBOb3cgbmV3X3BhdGggaGFzIGEgY29tcGxldGUgdW5peCBwYXRoIHRvIHRoZSBiaW5hcnkKKyAgaWYgdGVzdCAieGAkRUNITyAkbmV3X3BhdGggfCAkR1JFUCBeL2Jpbi9gIiAhPSB4OyB0aGVuCisgICAgIyBLZWVwIHBhdGhzIGluIC9iaW4gYXMtaXMsIGJ1dCByZW1vdmUgdHJhaWxpbmcgLmV4ZSBpZiBhbnkKKyAgICBuZXdfcGF0aD0iJHtuZXdfcGF0aC8lLmV4ZS99IgorICAgICMgRG8gbm90IHNhdmUgL2JpbiBwYXRocyB0byBhbGxfZml4cGF0aF9wcmVmaXhlcyEKKyAgZWxzZQorICAgICMgTm90IGluIG1peGVkIG9yIFdpbmRvd3Mgc3R5bGUsIHN0YXJ0IGJ5IHRoYXQuCisgICAgbmV3X3BhdGg9YGNtZCAvL2MgZWNobyAkbmV3X3BhdGhgCisKKyAgaW5wdXRfcGF0aD0iJG5ld19wYXRoIgorICAjIENoZWNrIGlmIHdlIG5lZWQgdG8gY29udmVydCB0aGlzIHVzaW5nIERPUy1zdHlsZSBzaG9ydCBtb2RlLiBJZiB0aGUgcGF0aAorICAjIGNvbnRhaW5zIGp1c3Qgc2ltcGxlIGNoYXJhY3RlcnMsIHVzZSBpdC4gT3RoZXJ3aXNlIChzcGFjZXMsIHdlaXJkIGNoYXJhY3RlcnMpLAorICAjIHRha2Ugbm8gY2hhbmNlcyBhbmQgcmV3cml0ZSBpdC4KKyAgIyBOb3RlOiBtNCBlYXRzIG91ciBbXSwgc28gd2UgbmVlZCB0byB1c2UgWyBhbmQgXSBpbnN0ZWFkLgorICBoYXNfZm9yYmlkZGVuX2NoYXJzPWAkRUNITyAiJGlucHV0X3BhdGgiIHwgJEdSRVAgW14tXy86YS16QS1aMC05XWAKKyAgaWYgdGVzdCAieCRoYXNfZm9yYmlkZGVuX2NoYXJzIiAhPSB4OyB0aGVuCisgICAgIyBOb3cgY29udmVydCBpdCB0byBtaXhlZCBET1Mtc3R5bGUsIHNob3J0IG1vZGUgKG5vIHNwYWNlcywgYW5kIC8gaW5zdGVhZCBvZiBcKQorICAgIG5ld19wYXRoPWBjbWQgL2MgImZvciAlQSBpbiAoXCIkaW5wdXRfcGF0aFwiKSBkbyBAZWNobyAlfnNBInwkVFIgXFxcXFxcXFwgLyB8ICRUUiAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidgCisgIGZpCisKKyAgICAjIE91dHB1dCBpcyBpbiAkbmV3X3BhdGgKKworICB3aW5kb3dzX3BhdGg9IiRuZXdfcGF0aCIKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJENZR1BBVEggLXUgIiR3aW5kb3dzX3BhdGgiYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBlbGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLm1zeXMiOyB0aGVuCisgICAgdW5peF9wYXRoPWAkRUNITyAiJHdpbmRvd3NfcGF0aCIgfCAkU0VEIC1lICdzLF5cXCguXFwpOiwvXFwxLGcnIC1lICdzLFxcXFwsLyxnJ2AKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZmkKKworICAgICMgcmVtb3ZlIHRyYWlsaW5nIC5leGUgaWYgYW55CisgICAgbmV3X3BhdGg9IiR7bmV3X3BhdGgvJS5leGUvfSIKKworICAgICMgU2F2ZSB0aGUgZmlyc3QgMTAgYnl0ZXMgb2YgdGhpcyBwYXRoIHRvIHRoZSBzdG9yYWdlLCBzbyBmaXhwYXRoIGNhbiB3b3JrLgorICAgIGFsbF9maXhwYXRoX3ByZWZpeGVzPSgiJHthbGxfZml4cGF0aF9wcmVmaXhlc1tAXX0iICIke25ld19wYXRoOjA6MTB9IikKKyAgZmkKKworICBlbHNlCisgICAgIyBXZSdyZSBvbiBhIHBvc2l4IHBsYXRmb3JtLiBIb29yYXkhIDopCisgICAgIyBGaXJzdCBzZXBhcmF0ZSB0aGUgcGF0aCBmcm9tIHRoZSBhcmd1bWVudHMuIFRoaXMgd2lsbCBzcGxpdCBhdCB0aGUgZmlyc3QKKyAgICAjIHNwYWNlLgorICAgIGNvbXBsZXRlPSIkVlNfRU5WX0NNRCIKKyAgICBwYXRoPSIke2NvbXBsZXRlJSUgKn0iCisgICAgdG1wPSIkY29tcGxldGUgRU9MIgorICAgIGFyZ3VtZW50cz0iJHt0bXAjKiB9IgorCisgICAgbmV3X3BhdGg9YCRXSElDSCAkcGF0aCAyPiAvZGV2L251bGxgCisgICAgaWYgdGVzdCAieCRuZXdfcGF0aCIgPSB4OyB0aGVuCisgICAgICBpc19hYnNvbHV0ZV9wYXRoPWAkRUNITyAiJHBhdGgiIHwgJEdSRVAgXi9gCisgICAgICBpZiB0ZXN0ICJ4JGlzX2Fic29sdXRlX3BhdGgiICE9IHg7IHRoZW4KKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBSZXNvbHZpbmcgVlNfRU5WX0NNRCAoYXMgJHBhdGgpIHdpdGggJ3doaWNoJyBmYWlsZWQsIHVzaW5nICRwYXRoIGRpcmVjdGx5LiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBSZXNvbHZpbmcgVlNfRU5WX0NNRCAoYXMgJHBhdGgpIHdpdGggJ3doaWNoJyBmYWlsZWQsIHVzaW5nICRwYXRoIGRpcmVjdGx5LiIgPiY2O30KKyAgICAgICAgbmV3X3BhdGg9IiRwYXRoIgorICAgICAgZWxzZQorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSBwYXRoIG9mIFZTX0VOVl9DTUQsIHdoaWNoIHJlc29sdmVzIGFzIFwiJGNvbXBsZXRlXCIsIGlzIG5vdCBmb3VuZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhlIHBhdGggb2YgVlNfRU5WX0NNRCwgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkY29tcGxldGVcIiwgaXMgbm90IGZvdW5kLiIgPiY2O30KKyAgICAgICAgaGFzX3NwYWNlPWAkRUNITyAiJGNvbXBsZXRlIiB8ICRHUkVQICIgImAKKyAgICAgICAgaWYgdGVzdCAieCRoYXNfc3BhY2UiICE9IHg7IHRoZW4KKyAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoaXMgbWlnaHQgYmUgY2F1c2VkIGJ5IHNwYWNlcyBpbiB0aGUgcGF0aCwgd2hpY2ggaXMgbm90IGFsbG93ZWQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoaXMgbWlnaHQgYmUgY2F1c2VkIGJ5IHNwYWNlcyBpbiB0aGUgcGF0aCwgd2hpY2ggaXMgbm90IGFsbG93ZWQuIiA+JjY7fQorICAgICAgICBmaQorICAgICAgICBhc19mbl9lcnJvciAkPyAiQ2Fubm90IGxvY2F0ZSB0aGUgdGhlIHBhdGggb2YgVlNfRU5WX0NNRCIgIiRMSU5FTk8iIDUKKyAgICAgIGZpCisgICAgZmkKKyAgZmkKKworICAjIE5vdyBqb2luIHRvZ2V0aGVyIHRoZSBwYXRoIGFuZCB0aGUgYXJndW1lbnRzIG9uY2UgYWdhaW4KKyAgaWYgdGVzdCAieCRhcmd1bWVudHMiICE9IHhFT0w7IHRoZW4KKyAgICAgIG5ld19jb21wbGV0ZT0iJG5ld19wYXRoICR7YXJndW1lbnRzJSAqfSIKKyAgZWxzZQorICAgICAgbmV3X2NvbXBsZXRlPSIkbmV3X3BhdGgiCisgIGZpCisKKyAgaWYgdGVzdCAieCRjb21wbGV0ZSIgIT0gIngkbmV3X2NvbXBsZXRlIjsgdGhlbgorICAgIFZTX0VOVl9DTUQ9IiRuZXdfY29tcGxldGUiCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBSZXdyaXRpbmcgVlNfRU5WX0NNRCB0byBcIiRuZXdfY29tcGxldGVcIiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBSZXdyaXRpbmcgVlNfRU5WX0NNRCB0byBcIiRuZXdfY29tcGxldGVcIiIgPiY2O30KKyAgZmkKKworCisgICAgIyBMZXRzIGV4dHJhY3QgdGhlIHZhcmlhYmxlcyB0aGF0IGFyZSBzZXQgYnkgdmN2YXJzYWxsLmJhdC92c3ZhcnMzMi5iYXQvdnN2YXJzNjQuYmF0CisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUcnlpbmcgdG8gZXh0cmFjdCBWaXN1YWwgU3R1ZGlvIGVudmlyb25tZW50IHZhcmlhYmxlcyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUcnlpbmcgdG8gZXh0cmFjdCBWaXN1YWwgU3R1ZGlvIGVudmlyb25tZW50IHZhcmlhYmxlcyIgPiY2O30KKyAgICBjZCAkT1VUUFVUX1JPT1QKKyAgICAjIEZJWE1FOiBUaGUgY29kZSBiZXR3ZWVlbiAtLS0tIHdhcyBpbmxpbmVkIGZyb20gYSBzZXBhcmF0ZSBzY3JpcHQgYW5kIGlzIG5vdCBwcm9wZXJseSBhZGFwdGVkCisgICAgIyB0byBhdXRvY29uZiBzdGFuZGFyZHMuCisKKyAgICAjLS0tLQorCisgICAgIyBDYW5ub3QgdXNlIHRoZSBWUzEwIHNldHVwIHNjcmlwdCBkaXJlY3RseSAoc2luY2UgaXQgb25seSB1cGRhdGVzIHRoZSBET1Mgc3Vic2hlbGwgZW52aXJvbm1lbnQpCisgICAgIyBidXQgY2FsY3VsYXRlIHRoZSBkaWZmZXJlbmNlIGluIEN5Z3dpbiBlbnZpcm9ubWVudCBiZWZvcmUvYWZ0ZXIgcnVubmluZyBpdCBhbmQgdGhlbgorICAgICMgYXBwbHkgdGhlIGRpZmYuCisKKyAgICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9IHh3aW5kb3dzLmN5Z3dpbjsgdGhlbgorICAgICAgX3ZzMTB2YXJzYWxsPWBjeWdwYXRoIC1hIC1tIC1zICIkVlNfRU5WX0NNRCJgCisgICAgICBfZG9zdnMxMHZhcnNhbGw9YGN5Z3BhdGggLWEgLXcgLXMgJF92czEwdmFyc2FsbGAKKyAgICAgIF9kb3NiYXNoPWBjeWdwYXRoIC1hIC13IC1zIFxgd2hpY2ggYmFzaFxgLipgCisgICAgZWxzZQorICAgICAgX2Rvc3ZzMTB2YXJzYWxsPWBjbWQgLy9jIGVjaG8gJFZTX0VOVl9DTURgCisgICAgICBfZG9zYmFzaD1gY21kIC8vYyBlY2hvIFxgd2hpY2ggYmFzaFxgYAorICAgIGZpCisKKyAgICAjIGdlbmVyYXRlIHRoZSBzZXQgb2YgZXhwb3J0ZWQgdmFycyBiZWZvcmUvYWZ0ZXIgdGhlIHZzMTAgc2V0dXAKKyAgICAkRUNITyAiQGVjaG8gb2ZmIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+ICBsb2NhbGRldmVudnRtcC5iYXQKKyAgICAkRUNITyAiJF9kb3NiYXNoIC1jIFwiZXhwb3J0IC1wXCIgPiBsb2NhbGRldmVudnRtcC5leHBvcnQwIiA+PiBsb2NhbGRldmVudnRtcC5iYXQKKyAgICAkRUNITyAiY2FsbCAkX2Rvc3ZzMTB2YXJzYWxsICRWU19FTlZfQVJHUyIgICAgICAgICAgICAgICAgICA+PiBsb2NhbGRldmVudnRtcC5iYXQKKyAgICAkRUNITyAiJF9kb3NiYXNoIC1jIFwiZXhwb3J0IC1wXCIgPiBsb2NhbGRldmVudnRtcC5leHBvcnQxIiA+PiBsb2NhbGRldmVudnRtcC5iYXQKKworICAgICMgTm93IGV4ZWN1dGUgdGhlIG5ld2x5IGNyZWF0ZWQgYmF0IGZpbGUuCisgICAgIyBUaGUgfCBjYXQgaXMgdG8gc3RvcCBTZXRFbnYuQ21kIHRvIG1lc3Mgd2l0aCBzeXN0ZW0gY29sb3JzIG9uIG1zeXMKKyAgICBjbWQgL2MgbG9jYWxkZXZlbnZ0bXAuYmF0IHwgY2F0CisKKyAgICAjIGFwcGx5IHRoZSBkaWZmIChsZXNzIHNvbWUgbm9uLXZzMTAgdmFycyBuYW1lZCBieSAiISIpCisgICAgJFNPUlQgbG9jYWxkZXZlbnZ0bXAuZXhwb3J0MCB8ICRHUkVQIC12ICIhIiA+IGxvY2FsZGV2ZW52dG1wLmV4cG9ydDAuc29ydAorICAgICRTT1JUIGxvY2FsZGV2ZW52dG1wLmV4cG9ydDEgfCAkR1JFUCAtdiAiISIgPiBsb2NhbGRldmVudnRtcC5leHBvcnQxLnNvcnQKKyAgICAkQ09NTSAtMSAtMyBsb2NhbGRldmVudnRtcC5leHBvcnQwLnNvcnQgbG9jYWxkZXZlbnZ0bXAuZXhwb3J0MS5zb3J0ID4gbG9jYWxkZXZlbnYuc2gKKworICAgICMgY2xlYW51cAorICAgICRSTSBsb2NhbGRldmVudnRtcCoKKyAgICAjLS0tLQorICAgIGNkICRDVVJESVIKKyAgICBpZiB0ZXN0ICEgLXMgJE9VVFBVVF9ST09UL2xvY2FsZGV2ZW52LnNoOyB0aGVuCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogQ291bGQgbm90IHN1Y2Nlc2Z1bGx5IGV4dHJhY3QgdGhlIGVudmlvbm1lbnQgdmFyaWFibGVzIG5lZWRlZCBmb3IgdGhlIFZTIHNldHVwLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBDb3VsZCBub3Qgc3VjY2VzZnVsbHkgZXh0cmFjdCB0aGUgZW52aW9ubWVudCB2YXJpYWJsZXMgbmVlZGVkIGZvciB0aGUgVlMgc2V0dXAuIiA+JjY7fQorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUcnkgc2V0dGluZyAtLXdpdGgtdG9vbHMtZGlyIHRvIHRoZSBWQy9iaW4gZGlyZWN0b3J5IHdpdGhpbiB0aGUgVlMgaW5zdGFsbGF0aW9uIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRyeSBzZXR0aW5nIC0td2l0aC10b29scy1kaXIgdG8gdGhlIFZDL2JpbiBkaXJlY3Rvcnkgd2l0aGluIHRoZSBWUyBpbnN0YWxsYXRpb24iID4mNjt9CisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IG9yIHJ1biBcImJhc2guZXhlIC1sXCIgZnJvbSBhIFZTIGNvbW1hbmQgcHJvbXB0IGFuZCB0aGVuIHJ1biBjb25maWd1cmUgZnJvbSB0aGVyZS4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogb3IgcnVuIFwiYmFzaC5leGUgLWxcIiBmcm9tIGEgVlMgY29tbWFuZCBwcm9tcHQgYW5kIHRoZW4gcnVuIGNvbmZpZ3VyZSBmcm9tIHRoZXJlLiIgPiY2O30KKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJDYW5ub3QgY29udGludWUiICIkTElORU5PIiA1CisgICAgZmkKKworICAgICMgTm93IHNldCBhbGwgcGF0aHMgYW5kIG90aGVyIGVudiB2YXJpYWJsZXMuIFRoaXMgd2lsbCBhbGxvdyB0aGUgcmVzdCBvZgorICAgICMgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdG8gZmluZCBhbmQgcnVuIHRoZSBjb21waWxlciBpbiB0aGUgcHJvcGVyIHdheS4KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFNldHRpbmcgZXh0cmFjdGVkIGVudmlyb25tZW50IHZhcmlhYmxlcyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBTZXR0aW5nIGV4dHJhY3RlZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMiID4mNjt9CisgICAgLiAkT1VUUFVUX1JPT1QvbG9jYWxkZXZlbnYuc2gKKyAgZWxzZQorICAgICMgV2UgZGlkIG5vdCBmaW5kIGEgdnN2YXJzIGJhdCBmaWxlLCBsZXQncyBob3BlIHdlIGFyZSBydW4gZnJvbSBhIFZTIGNvbW1hbmQgcHJvbXB0LgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogQ2Fubm90IGxvY2F0ZSBhIHZhbGlkIFZpc3VhbCBTdHVkaW8gaW5zdGFsbGF0aW9uLCBjaGVja2luZyBjdXJyZW50IGVudmlyb25tZW50IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IENhbm5vdCBsb2NhdGUgYSB2YWxpZCBWaXN1YWwgU3R1ZGlvIGluc3RhbGxhdGlvbiwgY2hlY2tpbmcgY3VycmVudCBlbnZpcm9ubWVudCIgPiY2O30KKyAgZmkKKworICAjIEF0IHRoaXMgcG9pbnQsIHdlIHNob3VsZCBoYXZlIGNvcnJlbnQgdmFyaWFibGVzIGluIHRoZSBlbnZpcm9ubWVudCwgb3Igd2UgY2FuJ3QgY29udGludWUuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIFZpc3VhbCBTdHVkaW8gdmFyaWFibGVzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBWaXN1YWwgU3R1ZGlvIHZhcmlhYmxlcy4uLiAiID4mNjsgfQorCisgIGlmIHRlc3QgIngkVkNJTlNUQUxMRElSIiAhPSB4IHx8IHRlc3QgIngkV2luZG93c1NES0RpciIgIT0geCB8fCB0ZXN0ICJ4JFdJTkRPV1NTREtESVIiICE9IHg7IHRoZW4KKyAgICBpZiB0ZXN0ICJ4JElOQ0xVREUiID0geCB8fCB0ZXN0ICJ4JExJQiIgPSB4OyB0aGVuCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogcHJlc2VudCBidXQgYnJva2VuIiA+JjUKKyRhc19lY2hvICJwcmVzZW50IGJ1dCBicm9rZW4iID4mNjsgfQorICAgICAgYXNfZm5fZXJyb3IgJD8gIllvdXIgVkMgY29tbWFuZCBwcm9tcHQgc2VlbXMgYnJva2VuLCBJTkNMVURFIGFuZC9vciBMSUIgaXMgbWlzc2luZy4iICIkTElORU5PIiA1CisgICAgZWxzZQorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG9rIiA+JjUKKyRhc19lY2hvICJvayIgPiY2OyB9CisgICAgICBWU19JTkNMVURFPSIkSU5DTFVERSIKKyAgICAgIFZTX0xJQj0iJExJQiIKKyAgICAgIFZTX1BBVEg9IiRQQVRIIgorCisKKworICAgIGZpCisgIGVsc2UKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm90IGZvdW5kIiA+JjUKKyRhc19lY2hvICJub3QgZm91bmQiID4mNjsgfQorCisgICAgaWYgdGVzdCAieCRWU19FTlZfQ01EIiA9IHg7IHRoZW4KKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogQ2Fubm90IGxvY2F0ZSBhIHZhbGlkIFZpc3VhbCBTdHVkaW8gb3IgV2luZG93cyBTREsgaW5zdGFsbGF0aW9uIG9uIGRpc2ssIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IENhbm5vdCBsb2NhdGUgYSB2YWxpZCBWaXN1YWwgU3R1ZGlvIG9yIFdpbmRvd3MgU0RLIGluc3RhbGxhdGlvbiBvbiBkaXNrLCIgPiY2O30KKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogbm9yIGlzIHRoaXMgc2NyaXB0IHJ1biBmcm9tIGEgVmlzdWFsIFN0dWRpbyBjb21tYW5kIHByb21wdC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogbm9yIGlzIHRoaXMgc2NyaXB0IHJ1biBmcm9tIGEgVmlzdWFsIFN0dWRpbyBjb21tYW5kIHByb21wdC4iID4mNjt9CisgICAgZWxzZQorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBSdW5uaW5nIHRoZSBleHRyYWN0aW9uIHNjcmlwdCBmYWlsZWQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFJ1bm5pbmcgdGhlIGV4dHJhY3Rpb24gc2NyaXB0IGZhaWxlZC4iID4mNjt9CisgICAgZmkKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRyeSBzZXR0aW5nIC0td2l0aC10b29scy1kaXIgdG8gdGhlIFZDL2JpbiBkaXJlY3Rvcnkgd2l0aGluIHRoZSBWUyBpbnN0YWxsYXRpb24iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVHJ5IHNldHRpbmcgLS13aXRoLXRvb2xzLWRpciB0byB0aGUgVkMvYmluIGRpcmVjdG9yeSB3aXRoaW4gdGhlIFZTIGluc3RhbGxhdGlvbiIgPiY2O30KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IG9yIHJ1biBcImJhc2guZXhlIC1sXCIgZnJvbSBhIFZTIGNvbW1hbmQgcHJvbXB0IGFuZCB0aGVuIHJ1biBjb25maWd1cmUgZnJvbSB0aGVyZS4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogb3IgcnVuIFwiYmFzaC5leGUgLWxcIiBmcm9tIGEgVlMgY29tbWFuZCBwcm9tcHQgYW5kIHRoZW4gcnVuIGNvbmZpZ3VyZSBmcm9tIHRoZXJlLiIgPiY2O30KKyAgICBhc19mbl9lcnJvciAkPyAiQ2Fubm90IGNvbnRpbnVlIiAiJExJTkVOTyIgNQorICBmaQorCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIG1zdmNyMTAwLmRsbCIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgbXN2Y3IxMDAuZGxsLi4uICIgPiY2OyB9CiAKLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtbXN2Y3IxMDBkbGwgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX21zdmNyMTAwZGxsK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgd2l0aHZhbD0kd2l0aF9tc3ZjcjEwMGRsbDsKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtbXN2Y3ItZGxsIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9tc3Zjcl9kbGwrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICB3aXRodmFsPSR3aXRoX21zdmNyX2RsbDsKIGZpCiAKLSAgICAgICAgaWYgdGVzdCAieCR3aXRoX21zdmNyMTAwZGxsIiAhPSB4OyB0aGVuCi0gICAgICAgICAgICBNU1ZDUjEwMERMTD0iJHdpdGhfbXN2Y3IxMDBkbGwiCi0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGlmIHRlc3QgIngkT1BFTkpES19UQVJHRVRfQ1BVX0JJVFMiID0geDY0OyB0aGVuCi0gICAgICAgICAgICAgICAgTVNWQ1IxMDBETEw9YGZpbmQgIiRWQ0lOU1RBTExESVIvLi4iIC1uYW1lIG1zdmNyMTAwLmRsbCB8IGdyZXAgeDY0IHwgaGVhZCAtLWxpbmVzIDFgCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgTVNWQ1IxMDBETEw9YGZpbmQgIiRWQ0lOU1RBTExESVIvLi4iIC1uYW1lIG1zdmNyMTAwLmRsbCB8IGdyZXAgeDg2IHwgZ3JlcCAtdiBpYTY0IHwgZ3JlcCAtdiB4NjQgfCBoZWFkIC0tbGluZXMgMWAKLSAgICAgICAgICAgICAgICBpZiB0ZXN0ICJ4JE1TVkNSMTAwRExMIiA9IHg7IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgTVNWQ1IxMDBETEw9YGZpbmQgIiRWQ0lOU1RBTExESVIvLi4iIC1uYW1lIG1zdmNyMTAwLmRsbCB8IGhlYWQgLS1saW5lcyAxYAotICAgICAgICAgICAgICAgIGZpCi0gICAgICAgICAgICBmaQorICBpZiB0ZXN0ICJ4JHdpdGhfbXN2Y3JfZGxsIiAhPSB4OyB0aGVuCisgICAgTVNWQ1JfRExMPSIkd2l0aF9tc3Zjcl9kbGwiCisgIGVsc2UKKyAgICBpZiB0ZXN0ICJ4JFZDSU5TVEFMTERJUiIgIT0geDsgdGhlbgorICAgICAgaWYgdGVzdCAieCRPUEVOSkRLX1RBUkdFVF9DUFVfQklUUyIgPSB4NjQ7IHRoZW4KKyAgICAgICAgTVNWQ1JfRExMPWBmaW5kICIkVkNJTlNUQUxMRElSIiAtbmFtZSBtc3ZjcjEwMC5kbGwgfCBncmVwIHg2NCB8IGhlYWQgLS1saW5lcyAxYAorICAgICAgZWxzZQorICAgICAgICBNU1ZDUl9ETEw9YGZpbmQgIiRWQ0lOU1RBTExESVIiIC1uYW1lIG1zdmNyMTAwLmRsbCB8IGdyZXAgeDg2IHwgZ3JlcCAtdiBpYTY0IHwgZ3JlcCAtdiB4NjQgfCBoZWFkIC0tbGluZXMgMWAKKyAgICAgICAgaWYgdGVzdCAieCRNU1ZDUl9ETEwiID0geDsgdGhlbgorICAgICAgICAgIE1TVkNSX0RMTD1gZmluZCAiJFZDSU5TVEFMTERJUiIgLW5hbWUgbXN2Y3IxMDAuZGxsIHwgaGVhZCAtLWxpbmVzIDFgCiAgICAgICAgIGZpCi0JaWYgdGVzdCAieCRNU1ZDUjEwMERMTCIgPSB4OyB0aGVuCi0gICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CisgICAgICBmaQorICAgICAgaWYgdGVzdCAieCRNU1ZDUl9ETEwiICE9IHg7IHRoZW4KKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBtc3ZjcjEwMC5kbGwgZm91bmQgaW4gVkNJTlNUQUxMRElSOiAkVkNJTlNUQUxMRElSIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IG1zdmNyMTAwLmRsbCBmb3VuZCBpbiBWQ0lOU1RBTExESVI6ICRWQ0lOU1RBTExESVIiID4mNjt9CisgICAgICBlbHNlCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV2FybmluZzogbXN2Y3IxMDAuZGxsIG5vdCBmb3VuZCBpbiBWQ0lOU1RBTExESVI6ICRWQ0lOU1RBTExESVIiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV2FybmluZzogbXN2Y3IxMDAuZGxsIG5vdCBmb3VuZCBpbiBWQ0lOU1RBTExESVI6ICRWQ0lOU1RBTExESVIiID4mNjt9CisgICAgICBmaQorICAgIGZpCisgICAgaWYgdGVzdCAieCRNU1ZDUl9ETEwiID0geDsgdGhlbgorICAgICAgaWYgdGVzdCAtZiAiJFNZU1RFTVJPT1Qvc3lzdGVtMzIvbXN2Y3IxMDAuZGxsIjsgdGhlbgorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IG1zdmNyMTAwLmRsbCBmb3VuZCBpbiAkU1lTVEVNUk9PVC9zeXN0ZW0zMiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBtc3ZjcjEwMC5kbGwgZm91bmQgaW4gJFNZU1RFTVJPT1Qvc3lzdGVtMzIiID4mNjt9CisgICAgICAgIE1TVkNSX0RMTD0iJFNZU1RFTVJPT1Qvc3lzdGVtMzIvbXN2Y3IxMDAuZGxsIgorICAgICAgZmkKKyAgICBmaQorICBmaQorICBpZiB0ZXN0ICJ4JE1TVkNSX0RMTCIgPSB4OyB0aGVuCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKICRhc19lY2hvICJubyIgPiY2OyB9Ci0JICAgYXNfZm5fZXJyb3IgJD8gIkNvdWxkIG5vdCBmaW5kIG1zdmNyMTAwLmRsbCAhIiAiJExJTkVOTyIgNQotICAgICAgICBmaQotICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJE1TVkNSMTAwRExMIiA+JjUKLSRhc19lY2hvICIkTVNWQ1IxMDBETEwiID4mNjsgfQorICAgIGFzX2ZuX2Vycm9yICQ/ICJDb3VsZCBub3QgZmluZCBtc3ZjcjEwMC5kbGwgISIgIiRMSU5FTk8iIDUKKyAgZmkKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRNU1ZDUl9ETEwiID4mNQorJGFzX2VjaG8gIiRNU1ZDUl9ETEwiID4mNjsgfQogCi0gICAgIyBGYWlsIHdpdGggbWVzc2FnZSB0aGUgcGF0aCB0byBtc3ZjcjEwMC5kbGwgaWYgdmFyIE1TVkNSMTAwRExMIGNvbnRhaW5zIGEgcGF0aCB3aXRoIG5vIHNwYWNlcyBpbiBpdC4KLSAgICAjIFVubGVzcyBvbiBXaW5kb3dzLCB3aGVyZSB3ZSBjYW4gcmV3cml0ZSB0aGUgcGF0aC4KLSAgICBIQVNfU1BBQ0U9YGVjaG8gIiRNU1ZDUjEwMERMTCIgfCBncmVwICIgImAKLSAgICBpZiB0ZXN0ICJ4JEhBU19TUEFDRSIgIT0geDsgdGhlbgotICAgICAgICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1MiID0gInh3aW5kb3dzIjsgdGhlbgotICAgICAgICAgICAgIyBGaXJzdCBjb252ZXJ0IGl0IHRvIERPUy1zdHlsZSwgc2hvcnQgbW9kZSAobm8gc3BhY2VzKQotICAgICAgICAgICAgTVNWQ1IxMDBETEw9YCRDWUdQQVRIIC1zIC1tIC1hICIkTVNWQ1IxMDBETEwiYAotICAgICAgICAgICAgIyBOb3cgaXQncyBjYXNlIGluc2Vuc2l0aXZlOyBsZXQncyBtYWtlIGl0IGxvd2VyY2FzZSB0byBpbXByb3ZlIHJlYWRhYmlsaXR5Ci0gICAgICAgICAgICBNU1ZDUjEwMERMTD1gJEVDSE8gIiRNU1ZDUjEwMERMTCIgfCAkVFIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnF4eXonYAotICAgICAgICAgICAgIyBOb3cgY29udmVydCBpdCBiYWNrIHRvIFVuaXgtc3RpbGUgKGN5Z3BhdGgpCi0gICAgICAgICAgICBNU1ZDUjEwMERMTD1gJENZR1BBVEggLXUgIiRNU1ZDUjEwMERMTCJgCi0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGFzX2ZuX2Vycm9yICQ/ICJZb3UgY2Fubm90IGhhdmUgc3BhY2VzIGluIHRoZSBwYXRoIHRvIG1zdmNyMTAwLmRsbCEgXCIkTVNWQ1IxMDBETExcIiIgIiRMSU5FTk8iIDUKLSAgICAgICAgZmkKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorCisgICMgSW5wdXQgbWlnaHQgYmUgZ2l2ZW4gYXMgV2luZG93cyBmb3JtYXQsIHN0YXJ0IGJ5IGNvbnZlcnRpbmcgdG8KKyAgIyB1bml4IGZvcm1hdC4KKyAgcGF0aD0iJE1TVkNSX0RMTCIKKyAgbmV3X3BhdGg9YCRDWUdQQVRIIC11ICIkcGF0aCJgCisKKyAgIyBDeWd3aW4gdHJpZXMgdG8gaGlkZSBzb21lIGFzcGVjdHMgb2YgdGhlIFdpbmRvd3MgZmlsZSBzeXN0ZW0sIHN1Y2ggdGhhdCBiaW5hcmllcyBhcmUKKyAgIyBuYW1lZCAuZXhlIGJ1dCBjYWxsZWQgd2l0aG91dCB0aGF0IHN1ZmZpeC4gVGhlcmVmb3JlLCAiZm9vIiBhbmQgImZvby5leGUiIGFyZSBjb25zaWRlcmVkCisgICMgdGhlIHNhbWUgZmlsZSwgbW9zdCBvZiB0aGUgdGltZSAoYXMgaW4gInRlc3QgLWYiKS4gQnV0IG5vdCB3aGVuIHJ1bm5pbmcgY3lncGF0aCAtcywgdGhlbgorICAjICJmb28uZXhlIiBpcyBPSyBidXQgImZvbyIgaXMgYW4gZXJyb3IuCisgICMKKyAgIyBUaGlzIHRlc3QgaXMgdGhlcmVmb3JlIHNsaWdodGx5IG1vcmUgYWNjdXJhdGUgdGhhbiAidGVzdCAtZiIgdG8gY2hlY2sgZm9yIGZpbGUgcHJlY2Vuc2UuCisgICMgSXQgaXMgYWxzbyBhIHdheSB0byBtYWtlIHN1cmUgd2UgZ290IHRoZSBwcm9wZXIgZmlsZSBuYW1lIGZvciB0aGUgcmVhbCB0ZXN0IGxhdGVyIG9uLgorICB0ZXN0X3Nob3J0cGF0aD1gJENZR1BBVEggLXMgLW0gIiRuZXdfcGF0aCIgMj4gL2Rldi9udWxsYAorICBpZiB0ZXN0ICJ4JHRlc3Rfc2hvcnRwYXRoIiA9IHg7IHRoZW4KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSBwYXRoIG9mIE1TVkNSX0RMTCwgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkcGF0aFwiLCBpcyBpbnZhbGlkLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUaGUgcGF0aCBvZiBNU1ZDUl9ETEwsIHdoaWNoIHJlc29sdmVzIGFzIFwiJHBhdGhcIiwgaXMgaW52YWxpZC4iID4mNjt9CisgICAgYXNfZm5fZXJyb3IgJD8gIkNhbm5vdCBsb2NhdGUgdGhlIHRoZSBwYXRoIG9mIE1TVkNSX0RMTCIgIiRMSU5FTk8iIDUKKyAgZmkKKworICAjIENhbGwgaGVscGVyIGZ1bmN0aW9uIHdoaWNoIHBvc3NpYmx5IGNvbnZlcnRzIHRoaXMgdXNpbmcgRE9TLXN0eWxlIHNob3J0IG1vZGUuCisgICMgSWYgc28sIHRoZSB1cGRhdGVkIHBhdGggaXMgc3RvcmVkIGluICRuZXdfcGF0aC4KKworICBpbnB1dF9wYXRoPSIkbmV3X3BhdGgiCisgICMgQ2hlY2sgaWYgd2UgbmVlZCB0byBjb252ZXJ0IHRoaXMgdXNpbmcgRE9TLXN0eWxlIHNob3J0IG1vZGUuIElmIHRoZSBwYXRoCisgICMgY29udGFpbnMganVzdCBzaW1wbGUgY2hhcmFjdGVycywgdXNlIGl0LiBPdGhlcndpc2UgKHNwYWNlcywgd2VpcmQgY2hhcmFjdGVycyksCisgICMgdGFrZSBubyBjaGFuY2VzIGFuZCByZXdyaXRlIGl0LgorICAjIE5vdGU6IG00IGVhdHMgb3VyIFtdLCBzbyB3ZSBuZWVkIHRvIHVzZSBbIGFuZCBdIGluc3RlYWQuCisgIGhhc19mb3JiaWRkZW5fY2hhcnM9YCRFQ0hPICIkaW5wdXRfcGF0aCIgfCAkR1JFUCBbXi0uXy9hLXpBLVowLTldYAorICBpZiB0ZXN0ICJ4JGhhc19mb3JiaWRkZW5fY2hhcnMiICE9IHg7IHRoZW4KKyAgICAjIE5vdyBjb252ZXJ0IGl0IHRvIG1peGVkIERPUy1zdHlsZSwgc2hvcnQgbW9kZSAobm8gc3BhY2VzLCBhbmQgLyBpbnN0ZWFkIG9mIFwpCisgICAgc2hvcnRtb2RlX3BhdGg9YCRDWUdQQVRIIC1zIC1tIC1hICIkaW5wdXRfcGF0aCJgCisgICAgcGF0aF9hZnRlcl9zaG9ydG1vZGU9YCRDWUdQQVRIIC11ICIkc2hvcnRtb2RlX3BhdGgiYAorICAgIGlmIHRlc3QgIngkcGF0aF9hZnRlcl9zaG9ydG1vZGUiICE9ICJ4JGlucHV0X3RvX3Nob3J0cGF0aCI7IHRoZW4KKyAgICAgICMgR29pbmcgdG8gc2hvcnQgbW9kZSBhbmQgYmFjayBhZ2FpbiBkaWQgaW5kZWVkIG1hdHRlci4gU2luY2Ugc2hvcnQgbW9kZSBpcworICAgICAgIyBjYXNlIGluc2Vuc2l0aXZlLCBsZXQncyBtYWtlIGl0IGxvd2VyY2FzZSB0byBpbXByb3ZlIHJlYWRhYmlsaXR5LgorICAgICAgc2hvcnRtb2RlX3BhdGg9YCRFQ0hPICIkc2hvcnRtb2RlX3BhdGgiIHwgJFRSICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J2AKKyAgICAgICMgTm93IGNvbnZlcnQgaXQgYmFjayB0byBVbml4LXN0aWxlIChjeWdwYXRoKQorICAgICAgaW5wdXRfcGF0aD1gJENZR1BBVEggLXUgIiRzaG9ydG1vZGVfcGF0aCJgCisgICAgICBuZXdfcGF0aD0iJGlucHV0X3BhdGgiCisgICAgZmkKKyAgZmkKKworICB0ZXN0X2N5Z2RyaXZlX3ByZWZpeD1gJEVDSE8gJGlucHV0X3BhdGggfCAkR1JFUCBeL2N5Z2RyaXZlL2AKKyAgaWYgdGVzdCAieCR0ZXN0X2N5Z2RyaXZlX3ByZWZpeCIgPSB4OyB0aGVuCisgICAgIyBBcyBhIHNpbXBsZSBmaXgsIGV4Y2x1ZGUgL3Vzci9iaW4gc2luY2UgaXQncyBub3QgYSByZWFsIHBhdGguCisgICAgaWYgdGVzdCAieGAkRUNITyAkbmV3X3BhdGggfCAkR1JFUCBeL3Vzci9iaW4vYCIgPSB4OyB0aGVuCisgICAgICAjIFRoZSBwYXRoIGlzIGluIGEgQ3lnd2luIHNwZWNpYWwgZGlyZWN0b3J5IChlLmcuIC9ob21lKS4gV2UgbmVlZCB0aGlzIGNvbnZlcnRlZCB0bworICAgICAgIyBhIHBhdGggcHJlZml4ZWQgYnkgL2N5Z2RyaXZlIGZvciBmaXhwYXRoIHRvIHdvcmsuCisgICAgICBuZXdfcGF0aD0iJENZR1dJTl9ST09UX1BBVEgkaW5wdXRfcGF0aCIKKyAgICBmaQorICBmaQorCisKKyAgaWYgdGVzdCAieCRwYXRoIiAhPSAieCRuZXdfcGF0aCI7IHRoZW4KKyAgICBNU1ZDUl9ETEw9IiRuZXdfcGF0aCIKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFJld3JpdGluZyBNU1ZDUl9ETEwgdG8gXCIkbmV3X3BhdGhcIiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBSZXdyaXRpbmcgTVNWQ1JfRExMIHRvIFwiJG5ld19wYXRoXCIiID4mNjt9CisgIGZpCisKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorCisgIHBhdGg9IiRNU1ZDUl9ETEwiCisgIGhhc19jb2xvbj1gJEVDSE8gJHBhdGggfCAkR1JFUCBeLjpgCisgIG5ld19wYXRoPSIkcGF0aCIKKyAgaWYgdGVzdCAieCRoYXNfY29sb24iID0geDsgdGhlbgorICAgICMgTm90IGluIG1peGVkIG9yIFdpbmRvd3Mgc3R5bGUsIHN0YXJ0IGJ5IHRoYXQuCisgICAgbmV3X3BhdGg9YGNtZCAvL2MgZWNobyAkcGF0aGAKKyAgZmkKKworCisgIGlucHV0X3BhdGg9IiRuZXdfcGF0aCIKKyAgIyBDaGVjayBpZiB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhpcyB1c2luZyBET1Mtc3R5bGUgc2hvcnQgbW9kZS4gSWYgdGhlIHBhdGgKKyAgIyBjb250YWlucyBqdXN0IHNpbXBsZSBjaGFyYWN0ZXJzLCB1c2UgaXQuIE90aGVyd2lzZSAoc3BhY2VzLCB3ZWlyZCBjaGFyYWN0ZXJzKSwKKyAgIyB0YWtlIG5vIGNoYW5jZXMgYW5kIHJld3JpdGUgaXQuCisgICMgTm90ZTogbTQgZWF0cyBvdXIgW10sIHNvIHdlIG5lZWQgdG8gdXNlIFsgYW5kIF0gaW5zdGVhZC4KKyAgaGFzX2ZvcmJpZGRlbl9jaGFycz1gJEVDSE8gIiRpbnB1dF9wYXRoIiB8ICRHUkVQIFteLV8vOmEtekEtWjAtOV1gCisgIGlmIHRlc3QgIngkaGFzX2ZvcmJpZGRlbl9jaGFycyIgIT0geDsgdGhlbgorICAgICMgTm93IGNvbnZlcnQgaXQgdG8gbWl4ZWQgRE9TLXN0eWxlLCBzaG9ydCBtb2RlIChubyBzcGFjZXMsIGFuZCAvIGluc3RlYWQgb2YgXCkKKyAgICBuZXdfcGF0aD1gY21kIC9jICJmb3IgJUEgaW4gKFwiJGlucHV0X3BhdGhcIikgZG8gQGVjaG8gJX5zQSJ8JFRSIFxcXFxcXFxcIC8gfCAkVFIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAorICBmaQorCisKKyAgd2luZG93c19wYXRoPSIkbmV3X3BhdGgiCisgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLmN5Z3dpbiI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRDWUdQQVRIIC11ICIkd2luZG93c19wYXRoImAKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJEVDSE8gIiR3aW5kb3dzX3BhdGgiIHwgJFNFRCAtZSAncyxeXFwoLlxcKTosL1xcMSxnJyAtZSAncyxcXFxcLC8sZydgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGZpCisKKyAgaWYgdGVzdCAieCRwYXRoIiAhPSAieCRuZXdfcGF0aCI7IHRoZW4KKyAgICBNU1ZDUl9ETEw9IiRuZXdfcGF0aCIKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFJld3JpdGluZyBNU1ZDUl9ETEwgdG8gXCIkbmV3X3BhdGhcIiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBSZXdyaXRpbmcgTVNWQ1JfRExMIHRvIFwiJG5ld19wYXRoXCIiID4mNjt9CisgIGZpCisKKyAgIyBTYXZlIHRoZSBmaXJzdCAxMCBieXRlcyBvZiB0aGlzIHBhdGggdG8gdGhlIHN0b3JhZ2UsIHNvIGZpeHBhdGggY2FuIHdvcmsuCisgIGFsbF9maXhwYXRoX3ByZWZpeGVzPSgiJHthbGxfZml4cGF0aF9wcmVmaXhlc1tAXX0iICIke25ld19wYXRoOjA6MTB9IikKKworICBlbHNlCisgICAgIyBXZSdyZSBvbiBhIHBvc2l4IHBsYXRmb3JtLiBIb29yYXkhIDopCisgICAgcGF0aD0iJE1TVkNSX0RMTCIKKworICAgIGlmIHRlc3QgISAtZiAiJHBhdGgiICYmIHRlc3QgISAtZCAiJHBhdGgiOyB0aGVuCisgICAgICBhc19mbl9lcnJvciAkPyAiVGhlIHBhdGggb2YgTVNWQ1JfRExMLCB3aGljaCByZXNvbHZlcyBhcyBcIiRwYXRoXCIsIGlzIG5vdCBmb3VuZC4iICIkTElORU5PIiA1CiAgICAgZmkKIAorICAgIGhhc19zcGFjZT1gJEVDSE8gIiRwYXRoIiB8ICRHUkVQICIgImAKKyAgICBpZiB0ZXN0ICJ4JGhhc19zcGFjZSIgIT0geDsgdGhlbgorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUaGUgcGF0aCBvZiBNU1ZDUl9ETEwsIHdoaWNoIHJlc29sdmVzIGFzIFwiJHBhdGhcIiwgaXMgaW52YWxpZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhlIHBhdGggb2YgTVNWQ1JfRExMLCB3aGljaCByZXNvbHZlcyBhcyBcIiRwYXRoXCIsIGlzIGludmFsaWQuIiA+JjY7fQorICAgICAgYXNfZm5fZXJyb3IgJD8gIlNwYWNlcyBhcmUgbm90IGFsbG93ZWQgaW4gdGhpcyBwYXRoLiIgIiRMSU5FTk8iIDUKICAgICBmaQorICBmaQorCisKIGZpCiAKIAogCi0KLSMgTG9jYXRlIHRoZSBhY3R1YWwgdG9vbHMKLQogIyBJZiAtLWJ1aWxkIEFORCAtLWhvc3QgaXMgc2V0LCB0aGVuIHRoZSBjb25maWd1cmUgc2NyaXB0IHdpbGwgZmluZCBhbnkKICMgY3Jvc3MgY29tcGlsYXRpb24gdG9vbHMgaW4gdGhlIFBBVEguIENyb3NzIGNvbXBpbGF0aW9uIHRvb2xzCiAjIGZvbGxvd3MgdGhlIGNyb3NzIGNvbXBpbGF0aW9uIHN0YW5kYXJkIHdoZXJlIHRoZXkgYXJlIHByZWZpeGVkIHdpdGggJHtob3N0fS4KQEAgLTEwNzA3LDQ3ICsxNjUyMiwyNDUgQEAKIGRvbmUKIAogCi0gICAgIyBUcmFuc2xhdGUgImdjYyAtRSIgaW50byAiYHdoaWNoIGdjY2AgLUUiIGllCi0gICAgIyBleHRyYWN0IHRoZSBmdWxsIHBhdGggdG8gdGhlIGJpbmFyeSBhbmQgYXQgdGhlCi0gICAgIyBzYW1lIHRpbWUgbWFpbnRhaW4gYW55IGFyZ3VtZW50cyBwYXNzZWQgdG8gaXQuCi0gICAgIyBUaGUgY29tbWFuZCBNVVNUIGV4aXN0IGluIHRoZSBwYXRoLCBvciBlbHNlIQotICAgIHRtcD0iJEJVSUxEX0NDIgotICAgIGNhcj0iJHt0bXAlJSAqfSIKLSAgICB0bXA9IiRCVUlMRF9DQyBFT0wiCi0gICAgY2RyPSIke3RtcCMqIH0iCi0gICAgIyBPbiB3aW5kb3dzIHdlIHdhbnQgcGF0aHMgd2l0aG91dCBzcGFjZXMuCi0gICAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TIiA9ICJ4d2luZG93cyI7IHRoZW4KKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgogCi0gICAgIyBUcmFuc2xhdGUgbG9uZyBjeWdkcml2ZSBvciBDOlxzZGZzZiBwYXRoCi0gICAgIyBpbnRvIGEgc2hvcnQgbWl4ZWQgbW9kZSBwYXRoIHRoYXQgaGFzIG5vCi0gICAgIyBzcGFjZXMgaW4gaXQuCi0gICAgdG1wPSIkY2FyIgorICAjIEZpcnN0IHNlcGFyYXRlIHRoZSBwYXRoIGZyb20gdGhlIGFyZ3VtZW50cy4gVGhpcyB3aWxsIHNwbGl0IGF0IHRoZSBmaXJzdAorICAjIHNwYWNlLgorICBjb21wbGV0ZT0iJEJVSUxEX0NDIgorICBwYXRoPSIke2NvbXBsZXRlJSUgKn0iCisgIHRtcD0iJGNvbXBsZXRlIEVPTCIKKyAgYXJndW1lbnRzPSIke3RtcCMqIH0iCiAKLSAgICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1MiID0gInh3aW5kb3dzIjsgdGhlbgotICAgICAgICB0bXA9YCRDWUdQQVRIIC11ICIkY2FyImAKLSAgICAgICAgdG1wPWB3aGljaCAiJHRtcCJgCi0gICAgICAgICMgSWYgZmlsZSBleGlzdHMgd2l0aCAuZXhlIGFwcGVuZGVkLCB0aGF0J3MgdGhlIHJlYWwgZmlsZW5hbWUKLSAgICAgICAgIyBhbmQgY3lncGF0aCBuZWVkcyB0aGF0IHRvIGNvbnZlcnQgdG8gc2hvcnQgc3R5bGUgcGF0aC4KLSAgICAgICAgaWYgdGVzdCAtZiAiJHt0bXB9LmV4ZSI7IHRoZW4KLSAgICAgICAgICAgdG1wPSIke3RtcH0uZXhlIgotICAgICAgICBlbGlmIHRlc3QgLWYgIiR7dG1wfS5jbWQiOyB0aGVuCi0gICAgICAgICAgIHRtcD0iJHt0bXB9LmNtZCIKKyAgIyBJbnB1dCBtaWdodCBiZSBnaXZlbiBhcyBXaW5kb3dzIGZvcm1hdCwgc3RhcnQgYnkgY29udmVydGluZyB0bworICAjIHVuaXggZm9ybWF0LgorICBuZXdfcGF0aD1gJENZR1BBVEggLXUgIiRwYXRoImAKKworICAjIE5vdyB0cnkgdG8gbG9jYXRlIGV4ZWN1dGFibGUgdXNpbmcgd2hpY2gKKyAgbmV3X3BhdGg9YCRXSElDSCAiJG5ld19wYXRoIiAyPiAvZGV2L251bGxgCisgIGlmIHRlc3QgIngkbmV3X3BhdGgiID0geDsgdGhlbgorICAgICMgT29wcy4gV2hpY2ggZGlkbid0IGZpbmQgdGhlIGV4ZWN1dGFibGUuCisgICAgIyBUaGUgc3BsaXR0aW5nIG9mIGFyZ3VtZW50cyBmcm9tIHRoZSBleGVjdXRhYmxlIGF0IGEgc3BhY2UgbWlnaHQgaGF2ZSBiZWVuIGluY29ycmVjdCwKKyAgICAjIHNpbmNlIHBhdGhzIHdpdGggc3BhY2UgYXJlIG1vcmUgbGlrZWx5IGluIFdpbmRvd3MuIEdpdmUgaXQgYW5vdGhlciB0cnkgd2l0aCB0aGUgd2hvbGUKKyAgICAjIGFyZ3VtZW50LgorICAgIHBhdGg9IiRjb21wbGV0ZSIKKyAgICBhcmd1bWVudHM9IkVPTCIKKyAgICBuZXdfcGF0aD1gJENZR1BBVEggLXUgIiRwYXRoImAKKyAgICBuZXdfcGF0aD1gJFdISUNIICIkbmV3X3BhdGgiIDI+IC9kZXYvbnVsbGAKKyAgICBpZiB0ZXN0ICJ4JG5ld19wYXRoIiA9IHg7IHRoZW4KKyAgICAgICMgSXQncyBzdGlsbCBub3QgZm91bmQuIE5vdyB0aGlzIGlzIGFuIHVucmVjb3ZlcmFibGUgZXJyb3IuCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSBwYXRoIG9mIEJVSUxEX0NDLCB3aGljaCByZXNvbHZlcyBhcyBcIiRjb21wbGV0ZVwiLCBpcyBub3QgZm91bmQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoZSBwYXRoIG9mIEJVSUxEX0NDLCB3aGljaCByZXNvbHZlcyBhcyBcIiRjb21wbGV0ZVwiLCBpcyBub3QgZm91bmQuIiA+JjY7fQorICAgICAgaGFzX3NwYWNlPWAkRUNITyAiJGNvbXBsZXRlIiB8ICRHUkVQICIgImAKKyAgICAgIGlmIHRlc3QgIngkaGFzX3NwYWNlIiAhPSB4OyB0aGVuCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogWW91IG1pZ2h0IGJlIG1peGluZyBzcGFjZXMgaW4gdGhlIHBhdGggYW5kIGV4dHJhIGFyZ3VtZW50cywgd2hpY2ggaXMgbm90IGFsbG93ZWQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFlvdSBtaWdodCBiZSBtaXhpbmcgc3BhY2VzIGluIHRoZSBwYXRoIGFuZCBleHRyYSBhcmd1bWVudHMsIHdoaWNoIGlzIG5vdCBhbGxvd2VkLiIgPiY2O30KKyAgICAgIGZpCisgICAgICBhc19mbl9lcnJvciAkPyAiQ2Fubm90IGxvY2F0ZSB0aGUgdGhlIHBhdGggb2YgQlVJTERfQ0MiICIkTElORU5PIiA1CisgICAgZmkKKyAgZmkKKworICAjIEN5Z3dpbiB0cmllcyB0byBoaWRlIHNvbWUgYXNwZWN0cyBvZiB0aGUgV2luZG93cyBmaWxlIHN5c3RlbSwgc3VjaCB0aGF0IGJpbmFyaWVzIGFyZQorICAjIG5hbWVkIC5leGUgYnV0IGNhbGxlZCB3aXRob3V0IHRoYXQgc3VmZml4LiBUaGVyZWZvcmUsICJmb28iIGFuZCAiZm9vLmV4ZSIgYXJlIGNvbnNpZGVyZWQKKyAgIyB0aGUgc2FtZSBmaWxlLCBtb3N0IG9mIHRoZSB0aW1lIChhcyBpbiAidGVzdCAtZiIpLiBCdXQgbm90IHdoZW4gcnVubmluZyBjeWdwYXRoIC1zLCB0aGVuCisgICMgImZvby5leGUiIGlzIE9LIGJ1dCAiZm9vIiBpcyBhbiBlcnJvci4KKyAgIworICAjIFRoaXMgdGVzdCBpcyB0aGVyZWZvcmUgc2xpZ2h0bHkgbW9yZSBhY2N1cmF0ZSB0aGFuICJ0ZXN0IC1mIiB0byBjaGVjayBmb3IgZmlsZSBwcmVjZW5zZS4KKyAgIyBJdCBpcyBhbHNvIGEgd2F5IHRvIG1ha2Ugc3VyZSB3ZSBnb3QgdGhlIHByb3BlciBmaWxlIG5hbWUgZm9yIHRoZSByZWFsIHRlc3QgbGF0ZXIgb24uCisgIHRlc3Rfc2hvcnRwYXRoPWAkQ1lHUEFUSCAtcyAtbSAiJG5ld19wYXRoIiAyPiAvZGV2L251bGxgCisgIGlmIHRlc3QgIngkdGVzdF9zaG9ydHBhdGgiID0geDsgdGhlbgorICAgICMgU2hvcnQgcGF0aCBmYWlsZWQsIGZpbGUgZG9lcyBub3QgZXhpc3QgYXMgc3BlY2lmaWVkLgorICAgICMgVHJ5IGFkZGluZyAuZXhlIG9yIC5jbWQKKyAgICBpZiB0ZXN0IC1mICIke25ld19wYXRofS5leGUiOyB0aGVuCisgICAgICAgaW5wdXRfdG9fc2hvcnRwYXRoPSIke25ld19wYXRofS5leGUiCisgICAgZWxpZiB0ZXN0IC1mICIke25ld19wYXRofS5jbWQiOyB0aGVuCisgICAgICAgaW5wdXRfdG9fc2hvcnRwYXRoPSIke25ld19wYXRofS5jbWQiCisgICAgZWxzZQorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUaGUgcGF0aCBvZiBCVUlMRF9DQywgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkbmV3X3BhdGhcIiwgaXMgaW52YWxpZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhlIHBhdGggb2YgQlVJTERfQ0MsIHdoaWNoIHJlc29sdmVzIGFzIFwiJG5ld19wYXRoXCIsIGlzIGludmFsaWQuIiA+JjY7fQorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBOZWl0aGVyIFwiJG5ld19wYXRoXCIgbm9yIFwiJG5ld19wYXRoLmV4ZS9jbWRcIiBjYW4gYmUgZm91bmQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogTmVpdGhlciBcIiRuZXdfcGF0aFwiIG5vciBcIiRuZXdfcGF0aC5leGUvY21kXCIgY2FuIGJlIGZvdW5kIiA+JjY7fQorICAgICAgYXNfZm5fZXJyb3IgJD8gIkNhbm5vdCBsb2NhdGUgdGhlIHRoZSBwYXRoIG9mIEJVSUxEX0NDIiAiJExJTkVOTyIgNQorICAgIGZpCisgIGVsc2UKKyAgICBpbnB1dF90b19zaG9ydHBhdGg9IiRuZXdfcGF0aCIKKyAgZmkKKworICAjIENhbGwgaGVscGVyIGZ1bmN0aW9uIHdoaWNoIHBvc3NpYmx5IGNvbnZlcnRzIHRoaXMgdXNpbmcgRE9TLXN0eWxlIHNob3J0IG1vZGUuCisgICMgSWYgc28sIHRoZSB1cGRhdGVkIHBhdGggaXMgc3RvcmVkIGluICRuZXdfcGF0aC4KKyAgbmV3X3BhdGg9IiRpbnB1dF90b19zaG9ydHBhdGgiCisKKyAgaW5wdXRfcGF0aD0iJGlucHV0X3RvX3Nob3J0cGF0aCIKKyAgIyBDaGVjayBpZiB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhpcyB1c2luZyBET1Mtc3R5bGUgc2hvcnQgbW9kZS4gSWYgdGhlIHBhdGgKKyAgIyBjb250YWlucyBqdXN0IHNpbXBsZSBjaGFyYWN0ZXJzLCB1c2UgaXQuIE90aGVyd2lzZSAoc3BhY2VzLCB3ZWlyZCBjaGFyYWN0ZXJzKSwKKyAgIyB0YWtlIG5vIGNoYW5jZXMgYW5kIHJld3JpdGUgaXQuCisgICMgTm90ZTogbTQgZWF0cyBvdXIgW10sIHNvIHdlIG5lZWQgdG8gdXNlIFsgYW5kIF0gaW5zdGVhZC4KKyAgaGFzX2ZvcmJpZGRlbl9jaGFycz1gJEVDSE8gIiRpbnB1dF9wYXRoIiB8ICRHUkVQIFteLS5fL2EtekEtWjAtOV1gCisgIGlmIHRlc3QgIngkaGFzX2ZvcmJpZGRlbl9jaGFycyIgIT0geDsgdGhlbgorICAgICMgTm93IGNvbnZlcnQgaXQgdG8gbWl4ZWQgRE9TLXN0eWxlLCBzaG9ydCBtb2RlIChubyBzcGFjZXMsIGFuZCAvIGluc3RlYWQgb2YgXCkKKyAgICBzaG9ydG1vZGVfcGF0aD1gJENZR1BBVEggLXMgLW0gLWEgIiRpbnB1dF9wYXRoImAKKyAgICBwYXRoX2FmdGVyX3Nob3J0bW9kZT1gJENZR1BBVEggLXUgIiRzaG9ydG1vZGVfcGF0aCJgCisgICAgaWYgdGVzdCAieCRwYXRoX2FmdGVyX3Nob3J0bW9kZSIgIT0gIngkaW5wdXRfdG9fc2hvcnRwYXRoIjsgdGhlbgorICAgICAgIyBHb2luZyB0byBzaG9ydCBtb2RlIGFuZCBiYWNrIGFnYWluIGRpZCBpbmRlZWQgbWF0dGVyLiBTaW5jZSBzaG9ydCBtb2RlIGlzCisgICAgICAjIGNhc2UgaW5zZW5zaXRpdmUsIGxldCdzIG1ha2UgaXQgbG93ZXJjYXNlIHRvIGltcHJvdmUgcmVhZGFiaWxpdHkuCisgICAgICBzaG9ydG1vZGVfcGF0aD1gJEVDSE8gIiRzaG9ydG1vZGVfcGF0aCIgfCAkVFIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAorICAgICAgIyBOb3cgY29udmVydCBpdCBiYWNrIHRvIFVuaXgtc3RpbGUgKGN5Z3BhdGgpCisgICAgICBpbnB1dF9wYXRoPWAkQ1lHUEFUSCAtdSAiJHNob3J0bW9kZV9wYXRoImAKKyAgICAgIG5ld19wYXRoPSIkaW5wdXRfcGF0aCIKKyAgICBmaQorICBmaQorCisgIHRlc3RfY3lnZHJpdmVfcHJlZml4PWAkRUNITyAkaW5wdXRfcGF0aCB8ICRHUkVQIF4vY3lnZHJpdmUvYAorICBpZiB0ZXN0ICJ4JHRlc3RfY3lnZHJpdmVfcHJlZml4IiA9IHg7IHRoZW4KKyAgICAjIEFzIGEgc2ltcGxlIGZpeCwgZXhjbHVkZSAvdXNyL2JpbiBzaW5jZSBpdCdzIG5vdCBhIHJlYWwgcGF0aC4KKyAgICBpZiB0ZXN0ICJ4YCRFQ0hPICRpbnB1dF90b19zaG9ydHBhdGggfCAkR1JFUCBeL3Vzci9iaW4vYCIgPSB4OyB0aGVuCisgICAgICAjIFRoZSBwYXRoIGlzIGluIGEgQ3lnd2luIHNwZWNpYWwgZGlyZWN0b3J5IChlLmcuIC9ob21lKS4gV2UgbmVlZCB0aGlzIGNvbnZlcnRlZCB0bworICAgICAgIyBhIHBhdGggcHJlZml4ZWQgYnkgL2N5Z2RyaXZlIGZvciBmaXhwYXRoIHRvIHdvcmsuCisgICAgICBuZXdfcGF0aD0iJENZR1dJTl9ST09UX1BBVEgkaW5wdXRfcGF0aCIKKyAgICBmaQorICBmaQorCisgICMgcmVtb3ZlIHRyYWlsaW5nIC5leGUgaWYgYW55CisgIG5ld19wYXRoPSIke25ld19wYXRoLyUuZXhlL30iCisKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorCisgICMgRmlyc3Qgc2VwYXJhdGUgdGhlIHBhdGggZnJvbSB0aGUgYXJndW1lbnRzLiBUaGlzIHdpbGwgc3BsaXQgYXQgdGhlIGZpcnN0CisgICMgc3BhY2UuCisgIGNvbXBsZXRlPSIkQlVJTERfQ0MiCisgIHBhdGg9IiR7Y29tcGxldGUlJSAqfSIKKyAgdG1wPSIkY29tcGxldGUgRU9MIgorICBhcmd1bWVudHM9IiR7dG1wIyogfSIKKworICAjIElucHV0IG1pZ2h0IGJlIGdpdmVuIGFzIFdpbmRvd3MgZm9ybWF0LCBzdGFydCBieSBjb252ZXJ0aW5nIHRvCisgICMgdW5peCBmb3JtYXQuCisgIG5ld19wYXRoPSIkcGF0aCIKKworICB3aW5kb3dzX3BhdGg9IiRuZXdfcGF0aCIKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJENZR1BBVEggLXUgIiR3aW5kb3dzX3BhdGgiYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBlbGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLm1zeXMiOyB0aGVuCisgICAgdW5peF9wYXRoPWAkRUNITyAiJHdpbmRvd3NfcGF0aCIgfCAkU0VEIC1lICdzLF5cXCguXFwpOiwvXFwxLGcnIC1lICdzLFxcXFwsLyxnJ2AKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZmkKKworCisgICMgTm93IHRyeSB0byBsb2NhdGUgZXhlY3V0YWJsZSB1c2luZyB3aGljaAorICBuZXdfcGF0aD1gJFdISUNIICIkbmV3X3BhdGgiIDI+IC9kZXYvbnVsbGAKKworICBpZiB0ZXN0ICJ4JG5ld19wYXRoIiA9IHg7IHRoZW4KKyAgICAjIE9vcHMuIFdoaWNoIGRpZG4ndCBmaW5kIHRoZSBleGVjdXRhYmxlLgorICAgICMgVGhlIHNwbGl0dGluZyBvZiBhcmd1bWVudHMgZnJvbSB0aGUgZXhlY3V0YWJsZSBhdCBhIHNwYWNlIG1pZ2h0IGhhdmUgYmVlbiBpbmNvcnJlY3QsCisgICAgIyBzaW5jZSBwYXRocyB3aXRoIHNwYWNlIGFyZSBtb3JlIGxpa2VseSBpbiBXaW5kb3dzLiBHaXZlIGl0IGFub3RoZXIgdHJ5IHdpdGggdGhlIHdob2xlCisgICAgIyBhcmd1bWVudC4KKyAgICBwYXRoPSIkY29tcGxldGUiCisgICAgYXJndW1lbnRzPSJFT0wiCisgICAgbmV3X3BhdGg9IiRwYXRoIgorCisgIHdpbmRvd3NfcGF0aD0iJG5ld19wYXRoIgorICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5jeWd3aW4iOyB0aGVuCisgICAgdW5peF9wYXRoPWAkQ1lHUEFUSCAtdSAiJHdpbmRvd3NfcGF0aCJgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGVsaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MubXN5cyI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRFQ0hPICIkd2luZG93c19wYXRoIiB8ICRTRUQgLWUgJ3MsXlxcKC5cXCk6LC9cXDEsZycgLWUgJ3MsXFxcXCwvLGcnYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBmaQorCisKKyAgICBuZXdfcGF0aD1gJFdISUNIICIkbmV3X3BhdGgiIDI+IC9kZXYvbnVsbGAKKworICAgIGlmIHRlc3QgIngkbmV3X3BhdGgiID0geDsgdGhlbgorICAgICAgIyBJdCdzIHN0aWxsIG5vdCBmb3VuZC4gTm93IHRoaXMgaXMgYW4gdW5yZWNvdmVyYWJsZSBlcnJvci4KKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGhlIHBhdGggb2YgQlVJTERfQ0MsIHdoaWNoIHJlc29sdmVzIGFzIFwiJGNvbXBsZXRlXCIsIGlzIG5vdCBmb3VuZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhlIHBhdGggb2YgQlVJTERfQ0MsIHdoaWNoIHJlc29sdmVzIGFzIFwiJGNvbXBsZXRlXCIsIGlzIG5vdCBmb3VuZC4iID4mNjt9CisgICAgICBoYXNfc3BhY2U9YCRFQ0hPICIkY29tcGxldGUiIHwgJEdSRVAgIiAiYAorICAgICAgaWYgdGVzdCAieCRoYXNfc3BhY2UiICE9IHg7IHRoZW4KKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBZb3UgbWlnaHQgYmUgbWl4aW5nIHNwYWNlcyBpbiB0aGUgcGF0aCBhbmQgZXh0cmEgYXJndW1lbnRzLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogWW91IG1pZ2h0IGJlIG1peGluZyBzcGFjZXMgaW4gdGhlIHBhdGggYW5kIGV4dHJhIGFyZ3VtZW50cywgd2hpY2ggaXMgbm90IGFsbG93ZWQuIiA+JjY7fQorICAgICAgZmkKKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJDYW5ub3QgbG9jYXRlIHRoZSB0aGUgcGF0aCBvZiBCVUlMRF9DQyIgIiRMSU5FTk8iIDUKKyAgICBmaQorICBmaQorCisgICMgTm93IG5ld19wYXRoIGhhcyBhIGNvbXBsZXRlIHVuaXggcGF0aCB0byB0aGUgYmluYXJ5CisgIGlmIHRlc3QgInhgJEVDSE8gJG5ld19wYXRoIHwgJEdSRVAgXi9iaW4vYCIgIT0geDsgdGhlbgorICAgICMgS2VlcCBwYXRocyBpbiAvYmluIGFzLWlzLCBidXQgcmVtb3ZlIHRyYWlsaW5nIC5leGUgaWYgYW55CisgICAgbmV3X3BhdGg9IiR7bmV3X3BhdGgvJS5leGUvfSIKKyAgICAjIERvIG5vdCBzYXZlIC9iaW4gcGF0aHMgdG8gYWxsX2ZpeHBhdGhfcHJlZml4ZXMhCisgIGVsc2UKKyAgICAjIE5vdCBpbiBtaXhlZCBvciBXaW5kb3dzIHN0eWxlLCBzdGFydCBieSB0aGF0LgorICAgIG5ld19wYXRoPWBjbWQgLy9jIGVjaG8gJG5ld19wYXRoYAorCisgIGlucHV0X3BhdGg9IiRuZXdfcGF0aCIKKyAgIyBDaGVjayBpZiB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhpcyB1c2luZyBET1Mtc3R5bGUgc2hvcnQgbW9kZS4gSWYgdGhlIHBhdGgKKyAgIyBjb250YWlucyBqdXN0IHNpbXBsZSBjaGFyYWN0ZXJzLCB1c2UgaXQuIE90aGVyd2lzZSAoc3BhY2VzLCB3ZWlyZCBjaGFyYWN0ZXJzKSwKKyAgIyB0YWtlIG5vIGNoYW5jZXMgYW5kIHJld3JpdGUgaXQuCisgICMgTm90ZTogbTQgZWF0cyBvdXIgW10sIHNvIHdlIG5lZWQgdG8gdXNlIFsgYW5kIF0gaW5zdGVhZC4KKyAgaGFzX2ZvcmJpZGRlbl9jaGFycz1gJEVDSE8gIiRpbnB1dF9wYXRoIiB8ICRHUkVQIFteLV8vOmEtekEtWjAtOV1gCisgIGlmIHRlc3QgIngkaGFzX2ZvcmJpZGRlbl9jaGFycyIgIT0geDsgdGhlbgorICAgICMgTm93IGNvbnZlcnQgaXQgdG8gbWl4ZWQgRE9TLXN0eWxlLCBzaG9ydCBtb2RlIChubyBzcGFjZXMsIGFuZCAvIGluc3RlYWQgb2YgXCkKKyAgICBuZXdfcGF0aD1gY21kIC9jICJmb3IgJUEgaW4gKFwiJGlucHV0X3BhdGhcIikgZG8gQGVjaG8gJX5zQSJ8JFRSIFxcXFxcXFxcIC8gfCAkVFIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAorICBmaQorCisgICAgIyBPdXRwdXQgaXMgaW4gJG5ld19wYXRoCisKKyAgd2luZG93c19wYXRoPSIkbmV3X3BhdGgiCisgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLmN5Z3dpbiI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRDWUdQQVRIIC11ICIkd2luZG93c19wYXRoImAKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJEVDSE8gIiR3aW5kb3dzX3BhdGgiIHwgJFNFRCAtZSAncyxeXFwoLlxcKTosL1xcMSxnJyAtZSAncyxcXFxcLC8sZydgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGZpCisKKyAgICAjIHJlbW92ZSB0cmFpbGluZyAuZXhlIGlmIGFueQorICAgIG5ld19wYXRoPSIke25ld19wYXRoLyUuZXhlL30iCisKKyAgICAjIFNhdmUgdGhlIGZpcnN0IDEwIGJ5dGVzIG9mIHRoaXMgcGF0aCB0byB0aGUgc3RvcmFnZSwgc28gZml4cGF0aCBjYW4gd29yay4KKyAgICBhbGxfZml4cGF0aF9wcmVmaXhlcz0oIiR7YWxsX2ZpeHBhdGhfcHJlZml4ZXNbQF19IiAiJHtuZXdfcGF0aDowOjEwfSIpCisgIGZpCisKKyAgZWxzZQorICAgICMgV2UncmUgb24gYSBwb3NpeCBwbGF0Zm9ybS4gSG9vcmF5ISA6KQorICAgICMgRmlyc3Qgc2VwYXJhdGUgdGhlIHBhdGggZnJvbSB0aGUgYXJndW1lbnRzLiBUaGlzIHdpbGwgc3BsaXQgYXQgdGhlIGZpcnN0CisgICAgIyBzcGFjZS4KKyAgICBjb21wbGV0ZT0iJEJVSUxEX0NDIgorICAgIHBhdGg9IiR7Y29tcGxldGUlJSAqfSIKKyAgICB0bXA9IiRjb21wbGV0ZSBFT0wiCisgICAgYXJndW1lbnRzPSIke3RtcCMqIH0iCisKKyAgICBuZXdfcGF0aD1gJFdISUNIICRwYXRoIDI+IC9kZXYvbnVsbGAKKyAgICBpZiB0ZXN0ICJ4JG5ld19wYXRoIiA9IHg7IHRoZW4KKyAgICAgIGlzX2Fic29sdXRlX3BhdGg9YCRFQ0hPICIkcGF0aCIgfCAkR1JFUCBeL2AKKyAgICAgIGlmIHRlc3QgIngkaXNfYWJzb2x1dGVfcGF0aCIgIT0geDsgdGhlbgorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFJlc29sdmluZyBCVUlMRF9DQyAoYXMgJHBhdGgpIHdpdGggJ3doaWNoJyBmYWlsZWQsIHVzaW5nICRwYXRoIGRpcmVjdGx5LiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBSZXNvbHZpbmcgQlVJTERfQ0MgKGFzICRwYXRoKSB3aXRoICd3aGljaCcgZmFpbGVkLCB1c2luZyAkcGF0aCBkaXJlY3RseS4iID4mNjt9CisgICAgICAgIG5ld19wYXRoPSIkcGF0aCIKKyAgICAgIGVsc2UKKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUaGUgcGF0aCBvZiBCVUlMRF9DQywgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkY29tcGxldGVcIiwgaXMgbm90IGZvdW5kLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUaGUgcGF0aCBvZiBCVUlMRF9DQywgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkY29tcGxldGVcIiwgaXMgbm90IGZvdW5kLiIgPiY2O30KKyAgICAgICAgaGFzX3NwYWNlPWAkRUNITyAiJGNvbXBsZXRlIiB8ICRHUkVQICIgImAKKyAgICAgICAgaWYgdGVzdCAieCRoYXNfc3BhY2UiICE9IHg7IHRoZW4KKyAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoaXMgbWlnaHQgYmUgY2F1c2VkIGJ5IHNwYWNlcyBpbiB0aGUgcGF0aCwgd2hpY2ggaXMgbm90IGFsbG93ZWQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoaXMgbWlnaHQgYmUgY2F1c2VkIGJ5IHNwYWNlcyBpbiB0aGUgcGF0aCwgd2hpY2ggaXMgbm90IGFsbG93ZWQuIiA+JjY7fQogICAgICAgICBmaQotICAgICAgICAjIENvbnZlcnQgdG8gQzovIG1peGVkIHN0eWxlIHBhdGggd2l0aG91dCBzcGFjZXMuCi0gICAgICAgICB0bXA9YCRDWUdQQVRIIC1zIC1tICIkdG1wImAKKyAgICAgICAgYXNfZm5fZXJyb3IgJD8gIkNhbm5vdCBsb2NhdGUgdGhlIHRoZSBwYXRoIG9mIEJVSUxEX0NDIiAiJExJTkVOTyIgNQorICAgICAgZmkKICAgICBmaQotICAgIGNhcj0iJHRtcCIKKyAgZmkKIAotICAgIGVsc2UKLSAgICAgICAgIyAid2hpY2giIGlzIG5vdCBwb3J0YWJsZSwgYnV0IGlzIHVzZWQgaGVyZQotICAgICAgICAjIGJlY2F1c2Ugd2Uga25vdyB0aGF0IHRoZSBjb21tYW5kIGV4aXN0cyEKLSAgICAgICAgY2FyPWB3aGljaCAkY2FyYAotICAgIGZpCi0gICAgaWYgdGVzdCAieCRjZHIiICE9IHhFT0w7IHRoZW4KLSAgICAgICAgQlVJTERfQ0M9IiRjYXIgJHtjZHIlICp9IgotICAgIGVsc2UKLSAgICAgICAgQlVJTERfQ0M9IiRjYXIiCi0gICAgZmkKKyAgIyBOb3cgam9pbiB0b2dldGhlciB0aGUgcGF0aCBhbmQgdGhlIGFyZ3VtZW50cyBvbmNlIGFnYWluCisgIGlmIHRlc3QgIngkYXJndW1lbnRzIiAhPSB4RU9MOyB0aGVuCisgICAgICBuZXdfY29tcGxldGU9IiRuZXdfcGF0aCAke2FyZ3VtZW50cyUgKn0iCisgIGVsc2UKKyAgICAgIG5ld19jb21wbGV0ZT0iJG5ld19wYXRoIgorICBmaQorCisgIGlmIHRlc3QgIngkY29tcGxldGUiICE9ICJ4JG5ld19jb21wbGV0ZSI7IHRoZW4KKyAgICBCVUlMRF9DQz0iJG5ld19jb21wbGV0ZSIKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFJld3JpdGluZyBCVUlMRF9DQyB0byBcIiRuZXdfY29tcGxldGVcIiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBSZXdyaXRpbmcgQlVJTERfQ0MgdG8gXCIkbmV3X2NvbXBsZXRlXCIiID4mNjt9CisgIGZpCiAKICAgICBmb3IgYWNfcHJvZyBpbiBjbCBDQyBnKysKIGRvCkBAIC0xMDc5NSw0NyArMTY4MDgsMjQ1IEBACiBkb25lCiAKIAotICAgICMgVHJhbnNsYXRlICJnY2MgLUUiIGludG8gImB3aGljaCBnY2NgIC1FIiBpZQotICAgICMgZXh0cmFjdCB0aGUgZnVsbCBwYXRoIHRvIHRoZSBiaW5hcnkgYW5kIGF0IHRoZQotICAgICMgc2FtZSB0aW1lIG1haW50YWluIGFueSBhcmd1bWVudHMgcGFzc2VkIHRvIGl0LgotICAgICMgVGhlIGNvbW1hbmQgTVVTVCBleGlzdCBpbiB0aGUgcGF0aCwgb3IgZWxzZSEKLSAgICB0bXA9IiRCVUlMRF9DWFgiCi0gICAgY2FyPSIke3RtcCUlICp9IgotICAgIHRtcD0iJEJVSUxEX0NYWCBFT0wiCi0gICAgY2RyPSIke3RtcCMqIH0iCi0gICAgIyBPbiB3aW5kb3dzIHdlIHdhbnQgcGF0aHMgd2l0aG91dCBzcGFjZXMuCi0gICAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TIiA9ICJ4d2luZG93cyI7IHRoZW4KKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgogCi0gICAgIyBUcmFuc2xhdGUgbG9uZyBjeWdkcml2ZSBvciBDOlxzZGZzZiBwYXRoCi0gICAgIyBpbnRvIGEgc2hvcnQgbWl4ZWQgbW9kZSBwYXRoIHRoYXQgaGFzIG5vCi0gICAgIyBzcGFjZXMgaW4gaXQuCi0gICAgdG1wPSIkY2FyIgorICAjIEZpcnN0IHNlcGFyYXRlIHRoZSBwYXRoIGZyb20gdGhlIGFyZ3VtZW50cy4gVGhpcyB3aWxsIHNwbGl0IGF0IHRoZSBmaXJzdAorICAjIHNwYWNlLgorICBjb21wbGV0ZT0iJEJVSUxEX0NYWCIKKyAgcGF0aD0iJHtjb21wbGV0ZSUlICp9IgorICB0bXA9IiRjb21wbGV0ZSBFT0wiCisgIGFyZ3VtZW50cz0iJHt0bXAjKiB9IgogCi0gICAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TIiA9ICJ4d2luZG93cyI7IHRoZW4KLSAgICAgICAgdG1wPWAkQ1lHUEFUSCAtdSAiJGNhciJgCi0gICAgICAgIHRtcD1gd2hpY2ggIiR0bXAiYAotICAgICAgICAjIElmIGZpbGUgZXhpc3RzIHdpdGggLmV4ZSBhcHBlbmRlZCwgdGhhdCdzIHRoZSByZWFsIGZpbGVuYW1lCi0gICAgICAgICMgYW5kIGN5Z3BhdGggbmVlZHMgdGhhdCB0byBjb252ZXJ0IHRvIHNob3J0IHN0eWxlIHBhdGguCi0gICAgICAgIGlmIHRlc3QgLWYgIiR7dG1wfS5leGUiOyB0aGVuCi0gICAgICAgICAgIHRtcD0iJHt0bXB9LmV4ZSIKLSAgICAgICAgZWxpZiB0ZXN0IC1mICIke3RtcH0uY21kIjsgdGhlbgotICAgICAgICAgICB0bXA9IiR7dG1wfS5jbWQiCisgICMgSW5wdXQgbWlnaHQgYmUgZ2l2ZW4gYXMgV2luZG93cyBmb3JtYXQsIHN0YXJ0IGJ5IGNvbnZlcnRpbmcgdG8KKyAgIyB1bml4IGZvcm1hdC4KKyAgbmV3X3BhdGg9YCRDWUdQQVRIIC11ICIkcGF0aCJgCisKKyAgIyBOb3cgdHJ5IHRvIGxvY2F0ZSBleGVjdXRhYmxlIHVzaW5nIHdoaWNoCisgIG5ld19wYXRoPWAkV0hJQ0ggIiRuZXdfcGF0aCIgMj4gL2Rldi9udWxsYAorICBpZiB0ZXN0ICJ4JG5ld19wYXRoIiA9IHg7IHRoZW4KKyAgICAjIE9vcHMuIFdoaWNoIGRpZG4ndCBmaW5kIHRoZSBleGVjdXRhYmxlLgorICAgICMgVGhlIHNwbGl0dGluZyBvZiBhcmd1bWVudHMgZnJvbSB0aGUgZXhlY3V0YWJsZSBhdCBhIHNwYWNlIG1pZ2h0IGhhdmUgYmVlbiBpbmNvcnJlY3QsCisgICAgIyBzaW5jZSBwYXRocyB3aXRoIHNwYWNlIGFyZSBtb3JlIGxpa2VseSBpbiBXaW5kb3dzLiBHaXZlIGl0IGFub3RoZXIgdHJ5IHdpdGggdGhlIHdob2xlCisgICAgIyBhcmd1bWVudC4KKyAgICBwYXRoPSIkY29tcGxldGUiCisgICAgYXJndW1lbnRzPSJFT0wiCisgICAgbmV3X3BhdGg9YCRDWUdQQVRIIC11ICIkcGF0aCJgCisgICAgbmV3X3BhdGg9YCRXSElDSCAiJG5ld19wYXRoIiAyPiAvZGV2L251bGxgCisgICAgaWYgdGVzdCAieCRuZXdfcGF0aCIgPSB4OyB0aGVuCisgICAgICAjIEl0J3Mgc3RpbGwgbm90IGZvdW5kLiBOb3cgdGhpcyBpcyBhbiB1bnJlY292ZXJhYmxlIGVycm9yLgorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUaGUgcGF0aCBvZiBCVUlMRF9DWFgsIHdoaWNoIHJlc29sdmVzIGFzIFwiJGNvbXBsZXRlXCIsIGlzIG5vdCBmb3VuZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhlIHBhdGggb2YgQlVJTERfQ1hYLCB3aGljaCByZXNvbHZlcyBhcyBcIiRjb21wbGV0ZVwiLCBpcyBub3QgZm91bmQuIiA+JjY7fQorICAgICAgaGFzX3NwYWNlPWAkRUNITyAiJGNvbXBsZXRlIiB8ICRHUkVQICIgImAKKyAgICAgIGlmIHRlc3QgIngkaGFzX3NwYWNlIiAhPSB4OyB0aGVuCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogWW91IG1pZ2h0IGJlIG1peGluZyBzcGFjZXMgaW4gdGhlIHBhdGggYW5kIGV4dHJhIGFyZ3VtZW50cywgd2hpY2ggaXMgbm90IGFsbG93ZWQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFlvdSBtaWdodCBiZSBtaXhpbmcgc3BhY2VzIGluIHRoZSBwYXRoIGFuZCBleHRyYSBhcmd1bWVudHMsIHdoaWNoIGlzIG5vdCBhbGxvd2VkLiIgPiY2O30KKyAgICAgIGZpCisgICAgICBhc19mbl9lcnJvciAkPyAiQ2Fubm90IGxvY2F0ZSB0aGUgdGhlIHBhdGggb2YgQlVJTERfQ1hYIiAiJExJTkVOTyIgNQorICAgIGZpCisgIGZpCisKKyAgIyBDeWd3aW4gdHJpZXMgdG8gaGlkZSBzb21lIGFzcGVjdHMgb2YgdGhlIFdpbmRvd3MgZmlsZSBzeXN0ZW0sIHN1Y2ggdGhhdCBiaW5hcmllcyBhcmUKKyAgIyBuYW1lZCAuZXhlIGJ1dCBjYWxsZWQgd2l0aG91dCB0aGF0IHN1ZmZpeC4gVGhlcmVmb3JlLCAiZm9vIiBhbmQgImZvby5leGUiIGFyZSBjb25zaWRlcmVkCisgICMgdGhlIHNhbWUgZmlsZSwgbW9zdCBvZiB0aGUgdGltZSAoYXMgaW4gInRlc3QgLWYiKS4gQnV0IG5vdCB3aGVuIHJ1bm5pbmcgY3lncGF0aCAtcywgdGhlbgorICAjICJmb28uZXhlIiBpcyBPSyBidXQgImZvbyIgaXMgYW4gZXJyb3IuCisgICMKKyAgIyBUaGlzIHRlc3QgaXMgdGhlcmVmb3JlIHNsaWdodGx5IG1vcmUgYWNjdXJhdGUgdGhhbiAidGVzdCAtZiIgdG8gY2hlY2sgZm9yIGZpbGUgcHJlY2Vuc2UuCisgICMgSXQgaXMgYWxzbyBhIHdheSB0byBtYWtlIHN1cmUgd2UgZ290IHRoZSBwcm9wZXIgZmlsZSBuYW1lIGZvciB0aGUgcmVhbCB0ZXN0IGxhdGVyIG9uLgorICB0ZXN0X3Nob3J0cGF0aD1gJENZR1BBVEggLXMgLW0gIiRuZXdfcGF0aCIgMj4gL2Rldi9udWxsYAorICBpZiB0ZXN0ICJ4JHRlc3Rfc2hvcnRwYXRoIiA9IHg7IHRoZW4KKyAgICAjIFNob3J0IHBhdGggZmFpbGVkLCBmaWxlIGRvZXMgbm90IGV4aXN0IGFzIHNwZWNpZmllZC4KKyAgICAjIFRyeSBhZGRpbmcgLmV4ZSBvciAuY21kCisgICAgaWYgdGVzdCAtZiAiJHtuZXdfcGF0aH0uZXhlIjsgdGhlbgorICAgICAgIGlucHV0X3RvX3Nob3J0cGF0aD0iJHtuZXdfcGF0aH0uZXhlIgorICAgIGVsaWYgdGVzdCAtZiAiJHtuZXdfcGF0aH0uY21kIjsgdGhlbgorICAgICAgIGlucHV0X3RvX3Nob3J0cGF0aD0iJHtuZXdfcGF0aH0uY21kIgorICAgIGVsc2UKKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGhlIHBhdGggb2YgQlVJTERfQ1hYLCB3aGljaCByZXNvbHZlcyBhcyBcIiRuZXdfcGF0aFwiLCBpcyBpbnZhbGlkLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUaGUgcGF0aCBvZiBCVUlMRF9DWFgsIHdoaWNoIHJlc29sdmVzIGFzIFwiJG5ld19wYXRoXCIsIGlzIGludmFsaWQuIiA+JjY7fQorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBOZWl0aGVyIFwiJG5ld19wYXRoXCIgbm9yIFwiJG5ld19wYXRoLmV4ZS9jbWRcIiBjYW4gYmUgZm91bmQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogTmVpdGhlciBcIiRuZXdfcGF0aFwiIG5vciBcIiRuZXdfcGF0aC5leGUvY21kXCIgY2FuIGJlIGZvdW5kIiA+JjY7fQorICAgICAgYXNfZm5fZXJyb3IgJD8gIkNhbm5vdCBsb2NhdGUgdGhlIHRoZSBwYXRoIG9mIEJVSUxEX0NYWCIgIiRMSU5FTk8iIDUKKyAgICBmaQorICBlbHNlCisgICAgaW5wdXRfdG9fc2hvcnRwYXRoPSIkbmV3X3BhdGgiCisgIGZpCisKKyAgIyBDYWxsIGhlbHBlciBmdW5jdGlvbiB3aGljaCBwb3NzaWJseSBjb252ZXJ0cyB0aGlzIHVzaW5nIERPUy1zdHlsZSBzaG9ydCBtb2RlLgorICAjIElmIHNvLCB0aGUgdXBkYXRlZCBwYXRoIGlzIHN0b3JlZCBpbiAkbmV3X3BhdGguCisgIG5ld19wYXRoPSIkaW5wdXRfdG9fc2hvcnRwYXRoIgorCisgIGlucHV0X3BhdGg9IiRpbnB1dF90b19zaG9ydHBhdGgiCisgICMgQ2hlY2sgaWYgd2UgbmVlZCB0byBjb252ZXJ0IHRoaXMgdXNpbmcgRE9TLXN0eWxlIHNob3J0IG1vZGUuIElmIHRoZSBwYXRoCisgICMgY29udGFpbnMganVzdCBzaW1wbGUgY2hhcmFjdGVycywgdXNlIGl0LiBPdGhlcndpc2UgKHNwYWNlcywgd2VpcmQgY2hhcmFjdGVycyksCisgICMgdGFrZSBubyBjaGFuY2VzIGFuZCByZXdyaXRlIGl0LgorICAjIE5vdGU6IG00IGVhdHMgb3VyIFtdLCBzbyB3ZSBuZWVkIHRvIHVzZSBbIGFuZCBdIGluc3RlYWQuCisgIGhhc19mb3JiaWRkZW5fY2hhcnM9YCRFQ0hPICIkaW5wdXRfcGF0aCIgfCAkR1JFUCBbXi0uXy9hLXpBLVowLTldYAorICBpZiB0ZXN0ICJ4JGhhc19mb3JiaWRkZW5fY2hhcnMiICE9IHg7IHRoZW4KKyAgICAjIE5vdyBjb252ZXJ0IGl0IHRvIG1peGVkIERPUy1zdHlsZSwgc2hvcnQgbW9kZSAobm8gc3BhY2VzLCBhbmQgLyBpbnN0ZWFkIG9mIFwpCisgICAgc2hvcnRtb2RlX3BhdGg9YCRDWUdQQVRIIC1zIC1tIC1hICIkaW5wdXRfcGF0aCJgCisgICAgcGF0aF9hZnRlcl9zaG9ydG1vZGU9YCRDWUdQQVRIIC11ICIkc2hvcnRtb2RlX3BhdGgiYAorICAgIGlmIHRlc3QgIngkcGF0aF9hZnRlcl9zaG9ydG1vZGUiICE9ICJ4JGlucHV0X3RvX3Nob3J0cGF0aCI7IHRoZW4KKyAgICAgICMgR29pbmcgdG8gc2hvcnQgbW9kZSBhbmQgYmFjayBhZ2FpbiBkaWQgaW5kZWVkIG1hdHRlci4gU2luY2Ugc2hvcnQgbW9kZSBpcworICAgICAgIyBjYXNlIGluc2Vuc2l0aXZlLCBsZXQncyBtYWtlIGl0IGxvd2VyY2FzZSB0byBpbXByb3ZlIHJlYWRhYmlsaXR5LgorICAgICAgc2hvcnRtb2RlX3BhdGg9YCRFQ0hPICIkc2hvcnRtb2RlX3BhdGgiIHwgJFRSICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J2AKKyAgICAgICMgTm93IGNvbnZlcnQgaXQgYmFjayB0byBVbml4LXN0aWxlIChjeWdwYXRoKQorICAgICAgaW5wdXRfcGF0aD1gJENZR1BBVEggLXUgIiRzaG9ydG1vZGVfcGF0aCJgCisgICAgICBuZXdfcGF0aD0iJGlucHV0X3BhdGgiCisgICAgZmkKKyAgZmkKKworICB0ZXN0X2N5Z2RyaXZlX3ByZWZpeD1gJEVDSE8gJGlucHV0X3BhdGggfCAkR1JFUCBeL2N5Z2RyaXZlL2AKKyAgaWYgdGVzdCAieCR0ZXN0X2N5Z2RyaXZlX3ByZWZpeCIgPSB4OyB0aGVuCisgICAgIyBBcyBhIHNpbXBsZSBmaXgsIGV4Y2x1ZGUgL3Vzci9iaW4gc2luY2UgaXQncyBub3QgYSByZWFsIHBhdGguCisgICAgaWYgdGVzdCAieGAkRUNITyAkaW5wdXRfdG9fc2hvcnRwYXRoIHwgJEdSRVAgXi91c3IvYmluL2AiID0geDsgdGhlbgorICAgICAgIyBUaGUgcGF0aCBpcyBpbiBhIEN5Z3dpbiBzcGVjaWFsIGRpcmVjdG9yeSAoZS5nLiAvaG9tZSkuIFdlIG5lZWQgdGhpcyBjb252ZXJ0ZWQgdG8KKyAgICAgICMgYSBwYXRoIHByZWZpeGVkIGJ5IC9jeWdkcml2ZSBmb3IgZml4cGF0aCB0byB3b3JrLgorICAgICAgbmV3X3BhdGg9IiRDWUdXSU5fUk9PVF9QQVRIJGlucHV0X3BhdGgiCisgICAgZmkKKyAgZmkKKworICAjIHJlbW92ZSB0cmFpbGluZyAuZXhlIGlmIGFueQorICBuZXdfcGF0aD0iJHtuZXdfcGF0aC8lLmV4ZS99IgorCisgIGVsaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MubXN5cyI7IHRoZW4KKworICAjIEZpcnN0IHNlcGFyYXRlIHRoZSBwYXRoIGZyb20gdGhlIGFyZ3VtZW50cy4gVGhpcyB3aWxsIHNwbGl0IGF0IHRoZSBmaXJzdAorICAjIHNwYWNlLgorICBjb21wbGV0ZT0iJEJVSUxEX0NYWCIKKyAgcGF0aD0iJHtjb21wbGV0ZSUlICp9IgorICB0bXA9IiRjb21wbGV0ZSBFT0wiCisgIGFyZ3VtZW50cz0iJHt0bXAjKiB9IgorCisgICMgSW5wdXQgbWlnaHQgYmUgZ2l2ZW4gYXMgV2luZG93cyBmb3JtYXQsIHN0YXJ0IGJ5IGNvbnZlcnRpbmcgdG8KKyAgIyB1bml4IGZvcm1hdC4KKyAgbmV3X3BhdGg9IiRwYXRoIgorCisgIHdpbmRvd3NfcGF0aD0iJG5ld19wYXRoIgorICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5jeWd3aW4iOyB0aGVuCisgICAgdW5peF9wYXRoPWAkQ1lHUEFUSCAtdSAiJHdpbmRvd3NfcGF0aCJgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGVsaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MubXN5cyI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRFQ0hPICIkd2luZG93c19wYXRoIiB8ICRTRUQgLWUgJ3MsXlxcKC5cXCk6LC9cXDEsZycgLWUgJ3MsXFxcXCwvLGcnYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBmaQorCisKKyAgIyBOb3cgdHJ5IHRvIGxvY2F0ZSBleGVjdXRhYmxlIHVzaW5nIHdoaWNoCisgIG5ld19wYXRoPWAkV0hJQ0ggIiRuZXdfcGF0aCIgMj4gL2Rldi9udWxsYAorCisgIGlmIHRlc3QgIngkbmV3X3BhdGgiID0geDsgdGhlbgorICAgICMgT29wcy4gV2hpY2ggZGlkbid0IGZpbmQgdGhlIGV4ZWN1dGFibGUuCisgICAgIyBUaGUgc3BsaXR0aW5nIG9mIGFyZ3VtZW50cyBmcm9tIHRoZSBleGVjdXRhYmxlIGF0IGEgc3BhY2UgbWlnaHQgaGF2ZSBiZWVuIGluY29ycmVjdCwKKyAgICAjIHNpbmNlIHBhdGhzIHdpdGggc3BhY2UgYXJlIG1vcmUgbGlrZWx5IGluIFdpbmRvd3MuIEdpdmUgaXQgYW5vdGhlciB0cnkgd2l0aCB0aGUgd2hvbGUKKyAgICAjIGFyZ3VtZW50LgorICAgIHBhdGg9IiRjb21wbGV0ZSIKKyAgICBhcmd1bWVudHM9IkVPTCIKKyAgICBuZXdfcGF0aD0iJHBhdGgiCisKKyAgd2luZG93c19wYXRoPSIkbmV3X3BhdGgiCisgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLmN5Z3dpbiI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRDWUdQQVRIIC11ICIkd2luZG93c19wYXRoImAKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJEVDSE8gIiR3aW5kb3dzX3BhdGgiIHwgJFNFRCAtZSAncyxeXFwoLlxcKTosL1xcMSxnJyAtZSAncyxcXFxcLC8sZydgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGZpCisKKworICAgIG5ld19wYXRoPWAkV0hJQ0ggIiRuZXdfcGF0aCIgMj4gL2Rldi9udWxsYAorCisgICAgaWYgdGVzdCAieCRuZXdfcGF0aCIgPSB4OyB0aGVuCisgICAgICAjIEl0J3Mgc3RpbGwgbm90IGZvdW5kLiBOb3cgdGhpcyBpcyBhbiB1bnJlY292ZXJhYmxlIGVycm9yLgorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUaGUgcGF0aCBvZiBCVUlMRF9DWFgsIHdoaWNoIHJlc29sdmVzIGFzIFwiJGNvbXBsZXRlXCIsIGlzIG5vdCBmb3VuZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhlIHBhdGggb2YgQlVJTERfQ1hYLCB3aGljaCByZXNvbHZlcyBhcyBcIiRjb21wbGV0ZVwiLCBpcyBub3QgZm91bmQuIiA+JjY7fQorICAgICAgaGFzX3NwYWNlPWAkRUNITyAiJGNvbXBsZXRlIiB8ICRHUkVQICIgImAKKyAgICAgIGlmIHRlc3QgIngkaGFzX3NwYWNlIiAhPSB4OyB0aGVuCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogWW91IG1pZ2h0IGJlIG1peGluZyBzcGFjZXMgaW4gdGhlIHBhdGggYW5kIGV4dHJhIGFyZ3VtZW50cywgd2hpY2ggaXMgbm90IGFsbG93ZWQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFlvdSBtaWdodCBiZSBtaXhpbmcgc3BhY2VzIGluIHRoZSBwYXRoIGFuZCBleHRyYSBhcmd1bWVudHMsIHdoaWNoIGlzIG5vdCBhbGxvd2VkLiIgPiY2O30KKyAgICAgIGZpCisgICAgICBhc19mbl9lcnJvciAkPyAiQ2Fubm90IGxvY2F0ZSB0aGUgdGhlIHBhdGggb2YgQlVJTERfQ1hYIiAiJExJTkVOTyIgNQorICAgIGZpCisgIGZpCisKKyAgIyBOb3cgbmV3X3BhdGggaGFzIGEgY29tcGxldGUgdW5peCBwYXRoIHRvIHRoZSBiaW5hcnkKKyAgaWYgdGVzdCAieGAkRUNITyAkbmV3X3BhdGggfCAkR1JFUCBeL2Jpbi9gIiAhPSB4OyB0aGVuCisgICAgIyBLZWVwIHBhdGhzIGluIC9iaW4gYXMtaXMsIGJ1dCByZW1vdmUgdHJhaWxpbmcgLmV4ZSBpZiBhbnkKKyAgICBuZXdfcGF0aD0iJHtuZXdfcGF0aC8lLmV4ZS99IgorICAgICMgRG8gbm90IHNhdmUgL2JpbiBwYXRocyB0byBhbGxfZml4cGF0aF9wcmVmaXhlcyEKKyAgZWxzZQorICAgICMgTm90IGluIG1peGVkIG9yIFdpbmRvd3Mgc3R5bGUsIHN0YXJ0IGJ5IHRoYXQuCisgICAgbmV3X3BhdGg9YGNtZCAvL2MgZWNobyAkbmV3X3BhdGhgCisKKyAgaW5wdXRfcGF0aD0iJG5ld19wYXRoIgorICAjIENoZWNrIGlmIHdlIG5lZWQgdG8gY29udmVydCB0aGlzIHVzaW5nIERPUy1zdHlsZSBzaG9ydCBtb2RlLiBJZiB0aGUgcGF0aAorICAjIGNvbnRhaW5zIGp1c3Qgc2ltcGxlIGNoYXJhY3RlcnMsIHVzZSBpdC4gT3RoZXJ3aXNlIChzcGFjZXMsIHdlaXJkIGNoYXJhY3RlcnMpLAorICAjIHRha2Ugbm8gY2hhbmNlcyBhbmQgcmV3cml0ZSBpdC4KKyAgIyBOb3RlOiBtNCBlYXRzIG91ciBbXSwgc28gd2UgbmVlZCB0byB1c2UgWyBhbmQgXSBpbnN0ZWFkLgorICBoYXNfZm9yYmlkZGVuX2NoYXJzPWAkRUNITyAiJGlucHV0X3BhdGgiIHwgJEdSRVAgW14tXy86YS16QS1aMC05XWAKKyAgaWYgdGVzdCAieCRoYXNfZm9yYmlkZGVuX2NoYXJzIiAhPSB4OyB0aGVuCisgICAgIyBOb3cgY29udmVydCBpdCB0byBtaXhlZCBET1Mtc3R5bGUsIHNob3J0IG1vZGUgKG5vIHNwYWNlcywgYW5kIC8gaW5zdGVhZCBvZiBcKQorICAgIG5ld19wYXRoPWBjbWQgL2MgImZvciAlQSBpbiAoXCIkaW5wdXRfcGF0aFwiKSBkbyBAZWNobyAlfnNBInwkVFIgXFxcXFxcXFwgLyB8ICRUUiAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidgCisgIGZpCisKKyAgICAjIE91dHB1dCBpcyBpbiAkbmV3X3BhdGgKKworICB3aW5kb3dzX3BhdGg9IiRuZXdfcGF0aCIKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJENZR1BBVEggLXUgIiR3aW5kb3dzX3BhdGgiYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBlbGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLm1zeXMiOyB0aGVuCisgICAgdW5peF9wYXRoPWAkRUNITyAiJHdpbmRvd3NfcGF0aCIgfCAkU0VEIC1lICdzLF5cXCguXFwpOiwvXFwxLGcnIC1lICdzLFxcXFwsLyxnJ2AKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZmkKKworICAgICMgcmVtb3ZlIHRyYWlsaW5nIC5leGUgaWYgYW55CisgICAgbmV3X3BhdGg9IiR7bmV3X3BhdGgvJS5leGUvfSIKKworICAgICMgU2F2ZSB0aGUgZmlyc3QgMTAgYnl0ZXMgb2YgdGhpcyBwYXRoIHRvIHRoZSBzdG9yYWdlLCBzbyBmaXhwYXRoIGNhbiB3b3JrLgorICAgIGFsbF9maXhwYXRoX3ByZWZpeGVzPSgiJHthbGxfZml4cGF0aF9wcmVmaXhlc1tAXX0iICIke25ld19wYXRoOjA6MTB9IikKKyAgZmkKKworICBlbHNlCisgICAgIyBXZSdyZSBvbiBhIHBvc2l4IHBsYXRmb3JtLiBIb29yYXkhIDopCisgICAgIyBGaXJzdCBzZXBhcmF0ZSB0aGUgcGF0aCBmcm9tIHRoZSBhcmd1bWVudHMuIFRoaXMgd2lsbCBzcGxpdCBhdCB0aGUgZmlyc3QKKyAgICAjIHNwYWNlLgorICAgIGNvbXBsZXRlPSIkQlVJTERfQ1hYIgorICAgIHBhdGg9IiR7Y29tcGxldGUlJSAqfSIKKyAgICB0bXA9IiRjb21wbGV0ZSBFT0wiCisgICAgYXJndW1lbnRzPSIke3RtcCMqIH0iCisKKyAgICBuZXdfcGF0aD1gJFdISUNIICRwYXRoIDI+IC9kZXYvbnVsbGAKKyAgICBpZiB0ZXN0ICJ4JG5ld19wYXRoIiA9IHg7IHRoZW4KKyAgICAgIGlzX2Fic29sdXRlX3BhdGg9YCRFQ0hPICIkcGF0aCIgfCAkR1JFUCBeL2AKKyAgICAgIGlmIHRlc3QgIngkaXNfYWJzb2x1dGVfcGF0aCIgIT0geDsgdGhlbgorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFJlc29sdmluZyBCVUlMRF9DWFggKGFzICRwYXRoKSB3aXRoICd3aGljaCcgZmFpbGVkLCB1c2luZyAkcGF0aCBkaXJlY3RseS4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogUmVzb2x2aW5nIEJVSUxEX0NYWCAoYXMgJHBhdGgpIHdpdGggJ3doaWNoJyBmYWlsZWQsIHVzaW5nICRwYXRoIGRpcmVjdGx5LiIgPiY2O30KKyAgICAgICAgbmV3X3BhdGg9IiRwYXRoIgorICAgICAgZWxzZQorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSBwYXRoIG9mIEJVSUxEX0NYWCwgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkY29tcGxldGVcIiwgaXMgbm90IGZvdW5kLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUaGUgcGF0aCBvZiBCVUlMRF9DWFgsIHdoaWNoIHJlc29sdmVzIGFzIFwiJGNvbXBsZXRlXCIsIGlzIG5vdCBmb3VuZC4iID4mNjt9CisgICAgICAgIGhhc19zcGFjZT1gJEVDSE8gIiRjb21wbGV0ZSIgfCAkR1JFUCAiICJgCisgICAgICAgIGlmIHRlc3QgIngkaGFzX3NwYWNlIiAhPSB4OyB0aGVuCisgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUaGlzIG1pZ2h0IGJlIGNhdXNlZCBieSBzcGFjZXMgaW4gdGhlIHBhdGgsIHdoaWNoIGlzIG5vdCBhbGxvd2VkLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUaGlzIG1pZ2h0IGJlIGNhdXNlZCBieSBzcGFjZXMgaW4gdGhlIHBhdGgsIHdoaWNoIGlzIG5vdCBhbGxvd2VkLiIgPiY2O30KICAgICAgICAgZmkKLSAgICAgICAgIyBDb252ZXJ0IHRvIEM6LyBtaXhlZCBzdHlsZSBwYXRoIHdpdGhvdXQgc3BhY2VzLgotICAgICAgICAgdG1wPWAkQ1lHUEFUSCAtcyAtbSAiJHRtcCJgCisgICAgICAgIGFzX2ZuX2Vycm9yICQ/ICJDYW5ub3QgbG9jYXRlIHRoZSB0aGUgcGF0aCBvZiBCVUlMRF9DWFgiICIkTElORU5PIiA1CisgICAgICBmaQogICAgIGZpCi0gICAgY2FyPSIkdG1wIgorICBmaQogCi0gICAgZWxzZQotICAgICAgICAjICJ3aGljaCIgaXMgbm90IHBvcnRhYmxlLCBidXQgaXMgdXNlZCBoZXJlCi0gICAgICAgICMgYmVjYXVzZSB3ZSBrbm93IHRoYXQgdGhlIGNvbW1hbmQgZXhpc3RzIQotICAgICAgICBjYXI9YHdoaWNoICRjYXJgCi0gICAgZmkKLSAgICBpZiB0ZXN0ICJ4JGNkciIgIT0geEVPTDsgdGhlbgotICAgICAgICBCVUlMRF9DWFg9IiRjYXIgJHtjZHIlICp9IgotICAgIGVsc2UKLSAgICAgICAgQlVJTERfQ1hYPSIkY2FyIgotICAgIGZpCisgICMgTm93IGpvaW4gdG9nZXRoZXIgdGhlIHBhdGggYW5kIHRoZSBhcmd1bWVudHMgb25jZSBhZ2FpbgorICBpZiB0ZXN0ICJ4JGFyZ3VtZW50cyIgIT0geEVPTDsgdGhlbgorICAgICAgbmV3X2NvbXBsZXRlPSIkbmV3X3BhdGggJHthcmd1bWVudHMlICp9IgorICBlbHNlCisgICAgICBuZXdfY29tcGxldGU9IiRuZXdfcGF0aCIKKyAgZmkKKworICBpZiB0ZXN0ICJ4JGNvbXBsZXRlIiAhPSAieCRuZXdfY29tcGxldGUiOyB0aGVuCisgICAgQlVJTERfQ1hYPSIkbmV3X2NvbXBsZXRlIgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogUmV3cml0aW5nIEJVSUxEX0NYWCB0byBcIiRuZXdfY29tcGxldGVcIiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBSZXdyaXRpbmcgQlVJTERfQ1hYIHRvIFwiJG5ld19jb21wbGV0ZVwiIiA+JjY7fQorICBmaQogCiAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJsZCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCiBzZXQgZHVtbXkgbGQ7IGFjX3dvcmQ9JDIKQEAgLTEwODc4LDQ3ICsxNzA4OSwyNDUgQEAKIAogCiAKLSAgICAjIFRyYW5zbGF0ZSAiZ2NjIC1FIiBpbnRvICJgd2hpY2ggZ2NjYCAtRSIgaWUKLSAgICAjIGV4dHJhY3QgdGhlIGZ1bGwgcGF0aCB0byB0aGUgYmluYXJ5IGFuZCBhdCB0aGUKLSAgICAjIHNhbWUgdGltZSBtYWludGFpbiBhbnkgYXJndW1lbnRzIHBhc3NlZCB0byBpdC4KLSAgICAjIFRoZSBjb21tYW5kIE1VU1QgZXhpc3QgaW4gdGhlIHBhdGgsIG9yIGVsc2UhCi0gICAgdG1wPSIkQlVJTERfTEQiCi0gICAgY2FyPSIke3RtcCUlICp9IgotICAgIHRtcD0iJEJVSUxEX0xEIEVPTCIKLSAgICBjZHI9IiR7dG1wIyogfSIKLSAgICAjIE9uIHdpbmRvd3Mgd2Ugd2FudCBwYXRocyB3aXRob3V0IHNwYWNlcy4KLSAgICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1MiID0gInh3aW5kb3dzIjsgdGhlbgorICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5jeWd3aW4iOyB0aGVuCiAKLSAgICAjIFRyYW5zbGF0ZSBsb25nIGN5Z2RyaXZlIG9yIEM6XHNkZnNmIHBhdGgKLSAgICAjIGludG8gYSBzaG9ydCBtaXhlZCBtb2RlIHBhdGggdGhhdCBoYXMgbm8KLSAgICAjIHNwYWNlcyBpbiBpdC4KLSAgICB0bXA9IiRjYXIiCisgICMgRmlyc3Qgc2VwYXJhdGUgdGhlIHBhdGggZnJvbSB0aGUgYXJndW1lbnRzLiBUaGlzIHdpbGwgc3BsaXQgYXQgdGhlIGZpcnN0CisgICMgc3BhY2UuCisgIGNvbXBsZXRlPSIkQlVJTERfTEQiCisgIHBhdGg9IiR7Y29tcGxldGUlJSAqfSIKKyAgdG1wPSIkY29tcGxldGUgRU9MIgorICBhcmd1bWVudHM9IiR7dG1wIyogfSIKIAotICAgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PUyIgPSAieHdpbmRvd3MiOyB0aGVuCi0gICAgICAgIHRtcD1gJENZR1BBVEggLXUgIiRjYXIiYAotICAgICAgICB0bXA9YHdoaWNoICIkdG1wImAKLSAgICAgICAgIyBJZiBmaWxlIGV4aXN0cyB3aXRoIC5leGUgYXBwZW5kZWQsIHRoYXQncyB0aGUgcmVhbCBmaWxlbmFtZQotICAgICAgICAjIGFuZCBjeWdwYXRoIG5lZWRzIHRoYXQgdG8gY29udmVydCB0byBzaG9ydCBzdHlsZSBwYXRoLgotICAgICAgICBpZiB0ZXN0IC1mICIke3RtcH0uZXhlIjsgdGhlbgotICAgICAgICAgICB0bXA9IiR7dG1wfS5leGUiCi0gICAgICAgIGVsaWYgdGVzdCAtZiAiJHt0bXB9LmNtZCI7IHRoZW4KLSAgICAgICAgICAgdG1wPSIke3RtcH0uY21kIgorICAjIElucHV0IG1pZ2h0IGJlIGdpdmVuIGFzIFdpbmRvd3MgZm9ybWF0LCBzdGFydCBieSBjb252ZXJ0aW5nIHRvCisgICMgdW5peCBmb3JtYXQuCisgIG5ld19wYXRoPWAkQ1lHUEFUSCAtdSAiJHBhdGgiYAorCisgICMgTm93IHRyeSB0byBsb2NhdGUgZXhlY3V0YWJsZSB1c2luZyB3aGljaAorICBuZXdfcGF0aD1gJFdISUNIICIkbmV3X3BhdGgiIDI+IC9kZXYvbnVsbGAKKyAgaWYgdGVzdCAieCRuZXdfcGF0aCIgPSB4OyB0aGVuCisgICAgIyBPb3BzLiBXaGljaCBkaWRuJ3QgZmluZCB0aGUgZXhlY3V0YWJsZS4KKyAgICAjIFRoZSBzcGxpdHRpbmcgb2YgYXJndW1lbnRzIGZyb20gdGhlIGV4ZWN1dGFibGUgYXQgYSBzcGFjZSBtaWdodCBoYXZlIGJlZW4gaW5jb3JyZWN0LAorICAgICMgc2luY2UgcGF0aHMgd2l0aCBzcGFjZSBhcmUgbW9yZSBsaWtlbHkgaW4gV2luZG93cy4gR2l2ZSBpdCBhbm90aGVyIHRyeSB3aXRoIHRoZSB3aG9sZQorICAgICMgYXJndW1lbnQuCisgICAgcGF0aD0iJGNvbXBsZXRlIgorICAgIGFyZ3VtZW50cz0iRU9MIgorICAgIG5ld19wYXRoPWAkQ1lHUEFUSCAtdSAiJHBhdGgiYAorICAgIG5ld19wYXRoPWAkV0hJQ0ggIiRuZXdfcGF0aCIgMj4gL2Rldi9udWxsYAorICAgIGlmIHRlc3QgIngkbmV3X3BhdGgiID0geDsgdGhlbgorICAgICAgIyBJdCdzIHN0aWxsIG5vdCBmb3VuZC4gTm93IHRoaXMgaXMgYW4gdW5yZWNvdmVyYWJsZSBlcnJvci4KKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGhlIHBhdGggb2YgQlVJTERfTEQsIHdoaWNoIHJlc29sdmVzIGFzIFwiJGNvbXBsZXRlXCIsIGlzIG5vdCBmb3VuZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhlIHBhdGggb2YgQlVJTERfTEQsIHdoaWNoIHJlc29sdmVzIGFzIFwiJGNvbXBsZXRlXCIsIGlzIG5vdCBmb3VuZC4iID4mNjt9CisgICAgICBoYXNfc3BhY2U9YCRFQ0hPICIkY29tcGxldGUiIHwgJEdSRVAgIiAiYAorICAgICAgaWYgdGVzdCAieCRoYXNfc3BhY2UiICE9IHg7IHRoZW4KKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBZb3UgbWlnaHQgYmUgbWl4aW5nIHNwYWNlcyBpbiB0aGUgcGF0aCBhbmQgZXh0cmEgYXJndW1lbnRzLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogWW91IG1pZ2h0IGJlIG1peGluZyBzcGFjZXMgaW4gdGhlIHBhdGggYW5kIGV4dHJhIGFyZ3VtZW50cywgd2hpY2ggaXMgbm90IGFsbG93ZWQuIiA+JjY7fQorICAgICAgZmkKKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJDYW5ub3QgbG9jYXRlIHRoZSB0aGUgcGF0aCBvZiBCVUlMRF9MRCIgIiRMSU5FTk8iIDUKKyAgICBmaQorICBmaQorCisgICMgQ3lnd2luIHRyaWVzIHRvIGhpZGUgc29tZSBhc3BlY3RzIG9mIHRoZSBXaW5kb3dzIGZpbGUgc3lzdGVtLCBzdWNoIHRoYXQgYmluYXJpZXMgYXJlCisgICMgbmFtZWQgLmV4ZSBidXQgY2FsbGVkIHdpdGhvdXQgdGhhdCBzdWZmaXguIFRoZXJlZm9yZSwgImZvbyIgYW5kICJmb28uZXhlIiBhcmUgY29uc2lkZXJlZAorICAjIHRoZSBzYW1lIGZpbGUsIG1vc3Qgb2YgdGhlIHRpbWUgKGFzIGluICJ0ZXN0IC1mIikuIEJ1dCBub3Qgd2hlbiBydW5uaW5nIGN5Z3BhdGggLXMsIHRoZW4KKyAgIyAiZm9vLmV4ZSIgaXMgT0sgYnV0ICJmb28iIGlzIGFuIGVycm9yLgorICAjCisgICMgVGhpcyB0ZXN0IGlzIHRoZXJlZm9yZSBzbGlnaHRseSBtb3JlIGFjY3VyYXRlIHRoYW4gInRlc3QgLWYiIHRvIGNoZWNrIGZvciBmaWxlIHByZWNlbnNlLgorICAjIEl0IGlzIGFsc28gYSB3YXkgdG8gbWFrZSBzdXJlIHdlIGdvdCB0aGUgcHJvcGVyIGZpbGUgbmFtZSBmb3IgdGhlIHJlYWwgdGVzdCBsYXRlciBvbi4KKyAgdGVzdF9zaG9ydHBhdGg9YCRDWUdQQVRIIC1zIC1tICIkbmV3X3BhdGgiIDI+IC9kZXYvbnVsbGAKKyAgaWYgdGVzdCAieCR0ZXN0X3Nob3J0cGF0aCIgPSB4OyB0aGVuCisgICAgIyBTaG9ydCBwYXRoIGZhaWxlZCwgZmlsZSBkb2VzIG5vdCBleGlzdCBhcyBzcGVjaWZpZWQuCisgICAgIyBUcnkgYWRkaW5nIC5leGUgb3IgLmNtZAorICAgIGlmIHRlc3QgLWYgIiR7bmV3X3BhdGh9LmV4ZSI7IHRoZW4KKyAgICAgICBpbnB1dF90b19zaG9ydHBhdGg9IiR7bmV3X3BhdGh9LmV4ZSIKKyAgICBlbGlmIHRlc3QgLWYgIiR7bmV3X3BhdGh9LmNtZCI7IHRoZW4KKyAgICAgICBpbnB1dF90b19zaG9ydHBhdGg9IiR7bmV3X3BhdGh9LmNtZCIKKyAgICBlbHNlCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSBwYXRoIG9mIEJVSUxEX0xELCB3aGljaCByZXNvbHZlcyBhcyBcIiRuZXdfcGF0aFwiLCBpcyBpbnZhbGlkLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUaGUgcGF0aCBvZiBCVUlMRF9MRCwgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkbmV3X3BhdGhcIiwgaXMgaW52YWxpZC4iID4mNjt9CisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IE5laXRoZXIgXCIkbmV3X3BhdGhcIiBub3IgXCIkbmV3X3BhdGguZXhlL2NtZFwiIGNhbiBiZSBmb3VuZCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBOZWl0aGVyIFwiJG5ld19wYXRoXCIgbm9yIFwiJG5ld19wYXRoLmV4ZS9jbWRcIiBjYW4gYmUgZm91bmQiID4mNjt9CisgICAgICBhc19mbl9lcnJvciAkPyAiQ2Fubm90IGxvY2F0ZSB0aGUgdGhlIHBhdGggb2YgQlVJTERfTEQiICIkTElORU5PIiA1CisgICAgZmkKKyAgZWxzZQorICAgIGlucHV0X3RvX3Nob3J0cGF0aD0iJG5ld19wYXRoIgorICBmaQorCisgICMgQ2FsbCBoZWxwZXIgZnVuY3Rpb24gd2hpY2ggcG9zc2libHkgY29udmVydHMgdGhpcyB1c2luZyBET1Mtc3R5bGUgc2hvcnQgbW9kZS4KKyAgIyBJZiBzbywgdGhlIHVwZGF0ZWQgcGF0aCBpcyBzdG9yZWQgaW4gJG5ld19wYXRoLgorICBuZXdfcGF0aD0iJGlucHV0X3RvX3Nob3J0cGF0aCIKKworICBpbnB1dF9wYXRoPSIkaW5wdXRfdG9fc2hvcnRwYXRoIgorICAjIENoZWNrIGlmIHdlIG5lZWQgdG8gY29udmVydCB0aGlzIHVzaW5nIERPUy1zdHlsZSBzaG9ydCBtb2RlLiBJZiB0aGUgcGF0aAorICAjIGNvbnRhaW5zIGp1c3Qgc2ltcGxlIGNoYXJhY3RlcnMsIHVzZSBpdC4gT3RoZXJ3aXNlIChzcGFjZXMsIHdlaXJkIGNoYXJhY3RlcnMpLAorICAjIHRha2Ugbm8gY2hhbmNlcyBhbmQgcmV3cml0ZSBpdC4KKyAgIyBOb3RlOiBtNCBlYXRzIG91ciBbXSwgc28gd2UgbmVlZCB0byB1c2UgWyBhbmQgXSBpbnN0ZWFkLgorICBoYXNfZm9yYmlkZGVuX2NoYXJzPWAkRUNITyAiJGlucHV0X3BhdGgiIHwgJEdSRVAgW14tLl8vYS16QS1aMC05XWAKKyAgaWYgdGVzdCAieCRoYXNfZm9yYmlkZGVuX2NoYXJzIiAhPSB4OyB0aGVuCisgICAgIyBOb3cgY29udmVydCBpdCB0byBtaXhlZCBET1Mtc3R5bGUsIHNob3J0IG1vZGUgKG5vIHNwYWNlcywgYW5kIC8gaW5zdGVhZCBvZiBcKQorICAgIHNob3J0bW9kZV9wYXRoPWAkQ1lHUEFUSCAtcyAtbSAtYSAiJGlucHV0X3BhdGgiYAorICAgIHBhdGhfYWZ0ZXJfc2hvcnRtb2RlPWAkQ1lHUEFUSCAtdSAiJHNob3J0bW9kZV9wYXRoImAKKyAgICBpZiB0ZXN0ICJ4JHBhdGhfYWZ0ZXJfc2hvcnRtb2RlIiAhPSAieCRpbnB1dF90b19zaG9ydHBhdGgiOyB0aGVuCisgICAgICAjIEdvaW5nIHRvIHNob3J0IG1vZGUgYW5kIGJhY2sgYWdhaW4gZGlkIGluZGVlZCBtYXR0ZXIuIFNpbmNlIHNob3J0IG1vZGUgaXMKKyAgICAgICMgY2FzZSBpbnNlbnNpdGl2ZSwgbGV0J3MgbWFrZSBpdCBsb3dlcmNhc2UgdG8gaW1wcm92ZSByZWFkYWJpbGl0eS4KKyAgICAgIHNob3J0bW9kZV9wYXRoPWAkRUNITyAiJHNob3J0bW9kZV9wYXRoIiB8ICRUUiAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidgCisgICAgICAjIE5vdyBjb252ZXJ0IGl0IGJhY2sgdG8gVW5peC1zdGlsZSAoY3lncGF0aCkKKyAgICAgIGlucHV0X3BhdGg9YCRDWUdQQVRIIC11ICIkc2hvcnRtb2RlX3BhdGgiYAorICAgICAgbmV3X3BhdGg9IiRpbnB1dF9wYXRoIgorICAgIGZpCisgIGZpCisKKyAgdGVzdF9jeWdkcml2ZV9wcmVmaXg9YCRFQ0hPICRpbnB1dF9wYXRoIHwgJEdSRVAgXi9jeWdkcml2ZS9gCisgIGlmIHRlc3QgIngkdGVzdF9jeWdkcml2ZV9wcmVmaXgiID0geDsgdGhlbgorICAgICMgQXMgYSBzaW1wbGUgZml4LCBleGNsdWRlIC91c3IvYmluIHNpbmNlIGl0J3Mgbm90IGEgcmVhbCBwYXRoLgorICAgIGlmIHRlc3QgInhgJEVDSE8gJGlucHV0X3RvX3Nob3J0cGF0aCB8ICRHUkVQIF4vdXNyL2Jpbi9gIiA9IHg7IHRoZW4KKyAgICAgICMgVGhlIHBhdGggaXMgaW4gYSBDeWd3aW4gc3BlY2lhbCBkaXJlY3RvcnkgKGUuZy4gL2hvbWUpLiBXZSBuZWVkIHRoaXMgY29udmVydGVkIHRvCisgICAgICAjIGEgcGF0aCBwcmVmaXhlZCBieSAvY3lnZHJpdmUgZm9yIGZpeHBhdGggdG8gd29yay4KKyAgICAgIG5ld19wYXRoPSIkQ1lHV0lOX1JPT1RfUEFUSCRpbnB1dF9wYXRoIgorICAgIGZpCisgIGZpCisKKyAgIyByZW1vdmUgdHJhaWxpbmcgLmV4ZSBpZiBhbnkKKyAgbmV3X3BhdGg9IiR7bmV3X3BhdGgvJS5leGUvfSIKKworICBlbGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLm1zeXMiOyB0aGVuCisKKyAgIyBGaXJzdCBzZXBhcmF0ZSB0aGUgcGF0aCBmcm9tIHRoZSBhcmd1bWVudHMuIFRoaXMgd2lsbCBzcGxpdCBhdCB0aGUgZmlyc3QKKyAgIyBzcGFjZS4KKyAgY29tcGxldGU9IiRCVUlMRF9MRCIKKyAgcGF0aD0iJHtjb21wbGV0ZSUlICp9IgorICB0bXA9IiRjb21wbGV0ZSBFT0wiCisgIGFyZ3VtZW50cz0iJHt0bXAjKiB9IgorCisgICMgSW5wdXQgbWlnaHQgYmUgZ2l2ZW4gYXMgV2luZG93cyBmb3JtYXQsIHN0YXJ0IGJ5IGNvbnZlcnRpbmcgdG8KKyAgIyB1bml4IGZvcm1hdC4KKyAgbmV3X3BhdGg9IiRwYXRoIgorCisgIHdpbmRvd3NfcGF0aD0iJG5ld19wYXRoIgorICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5jeWd3aW4iOyB0aGVuCisgICAgdW5peF9wYXRoPWAkQ1lHUEFUSCAtdSAiJHdpbmRvd3NfcGF0aCJgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGVsaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MubXN5cyI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRFQ0hPICIkd2luZG93c19wYXRoIiB8ICRTRUQgLWUgJ3MsXlxcKC5cXCk6LC9cXDEsZycgLWUgJ3MsXFxcXCwvLGcnYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBmaQorCisKKyAgIyBOb3cgdHJ5IHRvIGxvY2F0ZSBleGVjdXRhYmxlIHVzaW5nIHdoaWNoCisgIG5ld19wYXRoPWAkV0hJQ0ggIiRuZXdfcGF0aCIgMj4gL2Rldi9udWxsYAorCisgIGlmIHRlc3QgIngkbmV3X3BhdGgiID0geDsgdGhlbgorICAgICMgT29wcy4gV2hpY2ggZGlkbid0IGZpbmQgdGhlIGV4ZWN1dGFibGUuCisgICAgIyBUaGUgc3BsaXR0aW5nIG9mIGFyZ3VtZW50cyBmcm9tIHRoZSBleGVjdXRhYmxlIGF0IGEgc3BhY2UgbWlnaHQgaGF2ZSBiZWVuIGluY29ycmVjdCwKKyAgICAjIHNpbmNlIHBhdGhzIHdpdGggc3BhY2UgYXJlIG1vcmUgbGlrZWx5IGluIFdpbmRvd3MuIEdpdmUgaXQgYW5vdGhlciB0cnkgd2l0aCB0aGUgd2hvbGUKKyAgICAjIGFyZ3VtZW50LgorICAgIHBhdGg9IiRjb21wbGV0ZSIKKyAgICBhcmd1bWVudHM9IkVPTCIKKyAgICBuZXdfcGF0aD0iJHBhdGgiCisKKyAgd2luZG93c19wYXRoPSIkbmV3X3BhdGgiCisgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLmN5Z3dpbiI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRDWUdQQVRIIC11ICIkd2luZG93c19wYXRoImAKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJEVDSE8gIiR3aW5kb3dzX3BhdGgiIHwgJFNFRCAtZSAncyxeXFwoLlxcKTosL1xcMSxnJyAtZSAncyxcXFxcLC8sZydgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGZpCisKKworICAgIG5ld19wYXRoPWAkV0hJQ0ggIiRuZXdfcGF0aCIgMj4gL2Rldi9udWxsYAorCisgICAgaWYgdGVzdCAieCRuZXdfcGF0aCIgPSB4OyB0aGVuCisgICAgICAjIEl0J3Mgc3RpbGwgbm90IGZvdW5kLiBOb3cgdGhpcyBpcyBhbiB1bnJlY292ZXJhYmxlIGVycm9yLgorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUaGUgcGF0aCBvZiBCVUlMRF9MRCwgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkY29tcGxldGVcIiwgaXMgbm90IGZvdW5kLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUaGUgcGF0aCBvZiBCVUlMRF9MRCwgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkY29tcGxldGVcIiwgaXMgbm90IGZvdW5kLiIgPiY2O30KKyAgICAgIGhhc19zcGFjZT1gJEVDSE8gIiRjb21wbGV0ZSIgfCAkR1JFUCAiICJgCisgICAgICBpZiB0ZXN0ICJ4JGhhc19zcGFjZSIgIT0geDsgdGhlbgorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFlvdSBtaWdodCBiZSBtaXhpbmcgc3BhY2VzIGluIHRoZSBwYXRoIGFuZCBleHRyYSBhcmd1bWVudHMsIHdoaWNoIGlzIG5vdCBhbGxvd2VkLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBZb3UgbWlnaHQgYmUgbWl4aW5nIHNwYWNlcyBpbiB0aGUgcGF0aCBhbmQgZXh0cmEgYXJndW1lbnRzLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iID4mNjt9CisgICAgICBmaQorICAgICAgYXNfZm5fZXJyb3IgJD8gIkNhbm5vdCBsb2NhdGUgdGhlIHRoZSBwYXRoIG9mIEJVSUxEX0xEIiAiJExJTkVOTyIgNQorICAgIGZpCisgIGZpCisKKyAgIyBOb3cgbmV3X3BhdGggaGFzIGEgY29tcGxldGUgdW5peCBwYXRoIHRvIHRoZSBiaW5hcnkKKyAgaWYgdGVzdCAieGAkRUNITyAkbmV3X3BhdGggfCAkR1JFUCBeL2Jpbi9gIiAhPSB4OyB0aGVuCisgICAgIyBLZWVwIHBhdGhzIGluIC9iaW4gYXMtaXMsIGJ1dCByZW1vdmUgdHJhaWxpbmcgLmV4ZSBpZiBhbnkKKyAgICBuZXdfcGF0aD0iJHtuZXdfcGF0aC8lLmV4ZS99IgorICAgICMgRG8gbm90IHNhdmUgL2JpbiBwYXRocyB0byBhbGxfZml4cGF0aF9wcmVmaXhlcyEKKyAgZWxzZQorICAgICMgTm90IGluIG1peGVkIG9yIFdpbmRvd3Mgc3R5bGUsIHN0YXJ0IGJ5IHRoYXQuCisgICAgbmV3X3BhdGg9YGNtZCAvL2MgZWNobyAkbmV3X3BhdGhgCisKKyAgaW5wdXRfcGF0aD0iJG5ld19wYXRoIgorICAjIENoZWNrIGlmIHdlIG5lZWQgdG8gY29udmVydCB0aGlzIHVzaW5nIERPUy1zdHlsZSBzaG9ydCBtb2RlLiBJZiB0aGUgcGF0aAorICAjIGNvbnRhaW5zIGp1c3Qgc2ltcGxlIGNoYXJhY3RlcnMsIHVzZSBpdC4gT3RoZXJ3aXNlIChzcGFjZXMsIHdlaXJkIGNoYXJhY3RlcnMpLAorICAjIHRha2Ugbm8gY2hhbmNlcyBhbmQgcmV3cml0ZSBpdC4KKyAgIyBOb3RlOiBtNCBlYXRzIG91ciBbXSwgc28gd2UgbmVlZCB0byB1c2UgWyBhbmQgXSBpbnN0ZWFkLgorICBoYXNfZm9yYmlkZGVuX2NoYXJzPWAkRUNITyAiJGlucHV0X3BhdGgiIHwgJEdSRVAgW14tXy86YS16QS1aMC05XWAKKyAgaWYgdGVzdCAieCRoYXNfZm9yYmlkZGVuX2NoYXJzIiAhPSB4OyB0aGVuCisgICAgIyBOb3cgY29udmVydCBpdCB0byBtaXhlZCBET1Mtc3R5bGUsIHNob3J0IG1vZGUgKG5vIHNwYWNlcywgYW5kIC8gaW5zdGVhZCBvZiBcKQorICAgIG5ld19wYXRoPWBjbWQgL2MgImZvciAlQSBpbiAoXCIkaW5wdXRfcGF0aFwiKSBkbyBAZWNobyAlfnNBInwkVFIgXFxcXFxcXFwgLyB8ICRUUiAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidgCisgIGZpCisKKyAgICAjIE91dHB1dCBpcyBpbiAkbmV3X3BhdGgKKworICB3aW5kb3dzX3BhdGg9IiRuZXdfcGF0aCIKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJENZR1BBVEggLXUgIiR3aW5kb3dzX3BhdGgiYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBlbGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLm1zeXMiOyB0aGVuCisgICAgdW5peF9wYXRoPWAkRUNITyAiJHdpbmRvd3NfcGF0aCIgfCAkU0VEIC1lICdzLF5cXCguXFwpOiwvXFwxLGcnIC1lICdzLFxcXFwsLyxnJ2AKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZmkKKworICAgICMgcmVtb3ZlIHRyYWlsaW5nIC5leGUgaWYgYW55CisgICAgbmV3X3BhdGg9IiR7bmV3X3BhdGgvJS5leGUvfSIKKworICAgICMgU2F2ZSB0aGUgZmlyc3QgMTAgYnl0ZXMgb2YgdGhpcyBwYXRoIHRvIHRoZSBzdG9yYWdlLCBzbyBmaXhwYXRoIGNhbiB3b3JrLgorICAgIGFsbF9maXhwYXRoX3ByZWZpeGVzPSgiJHthbGxfZml4cGF0aF9wcmVmaXhlc1tAXX0iICIke25ld19wYXRoOjA6MTB9IikKKyAgZmkKKworICBlbHNlCisgICAgIyBXZSdyZSBvbiBhIHBvc2l4IHBsYXRmb3JtLiBIb29yYXkhIDopCisgICAgIyBGaXJzdCBzZXBhcmF0ZSB0aGUgcGF0aCBmcm9tIHRoZSBhcmd1bWVudHMuIFRoaXMgd2lsbCBzcGxpdCBhdCB0aGUgZmlyc3QKKyAgICAjIHNwYWNlLgorICAgIGNvbXBsZXRlPSIkQlVJTERfTEQiCisgICAgcGF0aD0iJHtjb21wbGV0ZSUlICp9IgorICAgIHRtcD0iJGNvbXBsZXRlIEVPTCIKKyAgICBhcmd1bWVudHM9IiR7dG1wIyogfSIKKworICAgIG5ld19wYXRoPWAkV0hJQ0ggJHBhdGggMj4gL2Rldi9udWxsYAorICAgIGlmIHRlc3QgIngkbmV3X3BhdGgiID0geDsgdGhlbgorICAgICAgaXNfYWJzb2x1dGVfcGF0aD1gJEVDSE8gIiRwYXRoIiB8ICRHUkVQIF4vYAorICAgICAgaWYgdGVzdCAieCRpc19hYnNvbHV0ZV9wYXRoIiAhPSB4OyB0aGVuCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogUmVzb2x2aW5nIEJVSUxEX0xEIChhcyAkcGF0aCkgd2l0aCAnd2hpY2gnIGZhaWxlZCwgdXNpbmcgJHBhdGggZGlyZWN0bHkuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFJlc29sdmluZyBCVUlMRF9MRCAoYXMgJHBhdGgpIHdpdGggJ3doaWNoJyBmYWlsZWQsIHVzaW5nICRwYXRoIGRpcmVjdGx5LiIgPiY2O30KKyAgICAgICAgbmV3X3BhdGg9IiRwYXRoIgorICAgICAgZWxzZQorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSBwYXRoIG9mIEJVSUxEX0xELCB3aGljaCByZXNvbHZlcyBhcyBcIiRjb21wbGV0ZVwiLCBpcyBub3QgZm91bmQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoZSBwYXRoIG9mIEJVSUxEX0xELCB3aGljaCByZXNvbHZlcyBhcyBcIiRjb21wbGV0ZVwiLCBpcyBub3QgZm91bmQuIiA+JjY7fQorICAgICAgICBoYXNfc3BhY2U9YCRFQ0hPICIkY29tcGxldGUiIHwgJEdSRVAgIiAiYAorICAgICAgICBpZiB0ZXN0ICJ4JGhhc19zcGFjZSIgIT0geDsgdGhlbgorICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGhpcyBtaWdodCBiZSBjYXVzZWQgYnkgc3BhY2VzIGluIHRoZSBwYXRoLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhpcyBtaWdodCBiZSBjYXVzZWQgYnkgc3BhY2VzIGluIHRoZSBwYXRoLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iID4mNjt9CiAgICAgICAgIGZpCi0gICAgICAgICMgQ29udmVydCB0byBDOi8gbWl4ZWQgc3R5bGUgcGF0aCB3aXRob3V0IHNwYWNlcy4KLSAgICAgICAgIHRtcD1gJENZR1BBVEggLXMgLW0gIiR0bXAiYAorICAgICAgICBhc19mbl9lcnJvciAkPyAiQ2Fubm90IGxvY2F0ZSB0aGUgdGhlIHBhdGggb2YgQlVJTERfTEQiICIkTElORU5PIiA1CisgICAgICBmaQogICAgIGZpCi0gICAgY2FyPSIkdG1wIgorICBmaQogCi0gICAgZWxzZQotICAgICAgICAjICJ3aGljaCIgaXMgbm90IHBvcnRhYmxlLCBidXQgaXMgdXNlZCBoZXJlCi0gICAgICAgICMgYmVjYXVzZSB3ZSBrbm93IHRoYXQgdGhlIGNvbW1hbmQgZXhpc3RzIQotICAgICAgICBjYXI9YHdoaWNoICRjYXJgCi0gICAgZmkKLSAgICBpZiB0ZXN0ICJ4JGNkciIgIT0geEVPTDsgdGhlbgotICAgICAgICBCVUlMRF9MRD0iJGNhciAke2NkciUgKn0iCi0gICAgZWxzZQotICAgICAgICBCVUlMRF9MRD0iJGNhciIKLSAgICBmaQorICAjIE5vdyBqb2luIHRvZ2V0aGVyIHRoZSBwYXRoIGFuZCB0aGUgYXJndW1lbnRzIG9uY2UgYWdhaW4KKyAgaWYgdGVzdCAieCRhcmd1bWVudHMiICE9IHhFT0w7IHRoZW4KKyAgICAgIG5ld19jb21wbGV0ZT0iJG5ld19wYXRoICR7YXJndW1lbnRzJSAqfSIKKyAgZWxzZQorICAgICAgbmV3X2NvbXBsZXRlPSIkbmV3X3BhdGgiCisgIGZpCisKKyAgaWYgdGVzdCAieCRjb21wbGV0ZSIgIT0gIngkbmV3X2NvbXBsZXRlIjsgdGhlbgorICAgIEJVSUxEX0xEPSIkbmV3X2NvbXBsZXRlIgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogUmV3cml0aW5nIEJVSUxEX0xEIHRvIFwiJG5ld19jb21wbGV0ZVwiIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFJld3JpdGluZyBCVUlMRF9MRCB0byBcIiRuZXdfY29tcGxldGVcIiIgPiY2O30KKyAgZmkKIAogZmkKIApAQCAtMTExMDIsMTYgKzE3NTExLDg3NCBAQAogICBQQVRIPSRUT09MU19ESVI6JFBBVEgKIGZpCiAKKworIyMjIExvY2F0ZSBDIGNvbXBpbGVyIChDQykKKwogIyBnY2MgaXMgYWxtb3N0IGFsd2F5cyBwcmVzZW50LCBidXQgb24gV2luZG93cyB3ZQogIyBwcmVmZXIgY2wuZXhlIGFuZCBvbiBTb2xhcmlzIHdlIHByZWZlciBDQy4KICMgVGh1cyB0ZXN0IGZvciB0aGVtIGluIHRoaXMgb3JkZXIuCitpZiB0ZXN0ICJ4JE9QRU5KREtfVEFSR0VUX09TIiA9IHhtYWNvc3g7IHRoZW4KKyAgIyBEbyBub3QgcHJvYmUgZm9yIGNjIG9uIE1hY09TWC4KKyAgQ09NUElMRVJfQ0hFQ0tfTElTVD0iY2wgZ2NjIgorZWxzZQorICBDT01QSUxFUl9DSEVDS19MSVNUPSJjbCBjYyBnY2MiCitmaQorCisKKyAgQ09NUElMRVJfTkFNRT1DCisKKyAgIyBEbyBhIGZpcnN0IGluaXRpYWwgYXR0ZW1wdCBhdCBzZWFyY2hpbmcgdGhlIGxpc3Qgb2YgY29tcGlsZXIgbmFtZXMuCisgICMgQUNfUEFUSF9QUk9HUyBjYW4ndCBiZSBydW4gbXVsdGlwbGUgdGltZXMgd2l0aCB0aGUgc2FtZSB2YXJpYWJsZSwKKyAgIyBzbyBjcmVhdGUgYSBuZXcgbmFtZSBmb3IgdGhpcyBydW4uCisgIGZvciBhY19wcm9nIGluICRDT01QSUxFUl9DSEVDS19MSVNUCitkbworICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3BhdGhfUE9URU5USUFMX0NDK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2FzZSAkUE9URU5USUFMX0NDIGluCisgIFtcXC9dKiB8ID86W1xcL10qKQorICBhY19jdl9wYXRoX1BPVEVOVElBTF9DQz0iJFBPVEVOVElBTF9DQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisgICopCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3BhdGhfUE9URU5USUFMX0NDPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCisgIDs7Citlc2FjCitmaQorUE9URU5USUFMX0NDPSRhY19jdl9wYXRoX1BPVEVOVElBTF9DQworaWYgdGVzdCAtbiAiJFBPVEVOVElBTF9DQyI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRQT1RFTlRJQUxfQ0MiID4mNQorJGFzX2VjaG8gIiRQT1RFTlRJQUxfQ0MiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworICB0ZXN0IC1uICIkUE9URU5USUFMX0NDIiAmJiBicmVhaworZG9uZQorCisgIENDPSRQT1RFTlRJQUxfQ0MKKworICBpZiB0ZXN0ICJ4JCRDQyIgPSB4OyB0aGVuCisKKyAgICAjIFByaW50IGEgaGVscGZ1bCBtZXNzYWdlIG9uIGhvdyB0byBhY3F1aXJlIHRoZSBuZWNlc3NhcnkgYnVpbGQgZGVwZW5kZW5jeS4KKyAgICAjIGRldmtpdCBpcyB0aGUgaGVscCB0YWc6IGZyZWV0eXAyLCBjdXBzLCBwdWxzZSwgYWxzYSBldGMKKyAgICBNSVNTSU5HX0RFUEVOREVOQ1k9ZGV2a2l0CisgICAgUEtHSEFORExFUl9DT01NQU5EPQorCisgICAgY2FzZSAkUEtHSEFORExFUiBpbgorCWFwdC1nZXQpCisgICAgICAgICAgICAgICAgYXB0X2hlbHAgICAgICRNSVNTSU5HX0RFUEVOREVOQ1kgOzsKKyAgICB5dW0pCisgICAgICAgICAgICAgICAgeXVtX2hlbHAgICAgICRNSVNTSU5HX0RFUEVOREVOQ1kgOzsKKwlwb3J0KQorICAgICAgICAgICAgICAgIHBvcnRfaGVscCAgICAkTUlTU0lOR19ERVBFTkRFTkNZIDs7CisJcGtndXRpbCkKKyAgICAgICAgICAgICAgICBwa2d1dGlsX2hlbHAgJE1JU1NJTkdfREVQRU5ERU5DWSA7OworCXBrZ2FkZCkKKyAgICAgICAgICAgICAgICBwa2dhZGRfaGVscCAgJE1JU1NJTkdfREVQRU5ERU5DWSA7OworICAgICogKQorICAgICAgYnJlYWsgOzsKKyAgICBlc2FjCisKKyAgICBpZiB0ZXN0ICJ4JFBLR0hBTkRMRVJfQ09NTUFORCIgIT0geDsgdGhlbgorICAgICAgICBIRUxQX01TRz0iWW91IG1pZ2h0IGJlIGFibGUgdG8gZml4IHRoaXMgYnkgcnVubmluZyAnJFBLR0hBTkRMRVJfQ09NTUFORCcuIgorICAgIGZpCisKKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJDb3VsZCBub3QgZmluZCBhICRDT01QSUxFUl9OQU1FIGNvbXBpbGVyLiAkSEVMUF9NU0ciICIkTElORU5PIiA1CisgIGZpCisKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorCisgICMgRmlyc3Qgc2VwYXJhdGUgdGhlIHBhdGggZnJvbSB0aGUgYXJndW1lbnRzLiBUaGlzIHdpbGwgc3BsaXQgYXQgdGhlIGZpcnN0CisgICMgc3BhY2UuCisgIGNvbXBsZXRlPSIkQ0MiCisgIHBhdGg9IiR7Y29tcGxldGUlJSAqfSIKKyAgdG1wPSIkY29tcGxldGUgRU9MIgorICBhcmd1bWVudHM9IiR7dG1wIyogfSIKKworICAjIElucHV0IG1pZ2h0IGJlIGdpdmVuIGFzIFdpbmRvd3MgZm9ybWF0LCBzdGFydCBieSBjb252ZXJ0aW5nIHRvCisgICMgdW5peCBmb3JtYXQuCisgIG5ld19wYXRoPWAkQ1lHUEFUSCAtdSAiJHBhdGgiYAorCisgICMgTm93IHRyeSB0byBsb2NhdGUgZXhlY3V0YWJsZSB1c2luZyB3aGljaAorICBuZXdfcGF0aD1gJFdISUNIICIkbmV3X3BhdGgiIDI+IC9kZXYvbnVsbGAKKyAgaWYgdGVzdCAieCRuZXdfcGF0aCIgPSB4OyB0aGVuCisgICAgIyBPb3BzLiBXaGljaCBkaWRuJ3QgZmluZCB0aGUgZXhlY3V0YWJsZS4KKyAgICAjIFRoZSBzcGxpdHRpbmcgb2YgYXJndW1lbnRzIGZyb20gdGhlIGV4ZWN1dGFibGUgYXQgYSBzcGFjZSBtaWdodCBoYXZlIGJlZW4gaW5jb3JyZWN0LAorICAgICMgc2luY2UgcGF0aHMgd2l0aCBzcGFjZSBhcmUgbW9yZSBsaWtlbHkgaW4gV2luZG93cy4gR2l2ZSBpdCBhbm90aGVyIHRyeSB3aXRoIHRoZSB3aG9sZQorICAgICMgYXJndW1lbnQuCisgICAgcGF0aD0iJGNvbXBsZXRlIgorICAgIGFyZ3VtZW50cz0iRU9MIgorICAgIG5ld19wYXRoPWAkQ1lHUEFUSCAtdSAiJHBhdGgiYAorICAgIG5ld19wYXRoPWAkV0hJQ0ggIiRuZXdfcGF0aCIgMj4gL2Rldi9udWxsYAorICAgIGlmIHRlc3QgIngkbmV3X3BhdGgiID0geDsgdGhlbgorICAgICAgIyBJdCdzIHN0aWxsIG5vdCBmb3VuZC4gTm93IHRoaXMgaXMgYW4gdW5yZWNvdmVyYWJsZSBlcnJvci4KKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGhlIHBhdGggb2YgQ0MsIHdoaWNoIHJlc29sdmVzIGFzIFwiJGNvbXBsZXRlXCIsIGlzIG5vdCBmb3VuZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhlIHBhdGggb2YgQ0MsIHdoaWNoIHJlc29sdmVzIGFzIFwiJGNvbXBsZXRlXCIsIGlzIG5vdCBmb3VuZC4iID4mNjt9CisgICAgICBoYXNfc3BhY2U9YCRFQ0hPICIkY29tcGxldGUiIHwgJEdSRVAgIiAiYAorICAgICAgaWYgdGVzdCAieCRoYXNfc3BhY2UiICE9IHg7IHRoZW4KKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBZb3UgbWlnaHQgYmUgbWl4aW5nIHNwYWNlcyBpbiB0aGUgcGF0aCBhbmQgZXh0cmEgYXJndW1lbnRzLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogWW91IG1pZ2h0IGJlIG1peGluZyBzcGFjZXMgaW4gdGhlIHBhdGggYW5kIGV4dHJhIGFyZ3VtZW50cywgd2hpY2ggaXMgbm90IGFsbG93ZWQuIiA+JjY7fQorICAgICAgZmkKKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJDYW5ub3QgbG9jYXRlIHRoZSB0aGUgcGF0aCBvZiBDQyIgIiRMSU5FTk8iIDUKKyAgICBmaQorICBmaQorCisgICMgQ3lnd2luIHRyaWVzIHRvIGhpZGUgc29tZSBhc3BlY3RzIG9mIHRoZSBXaW5kb3dzIGZpbGUgc3lzdGVtLCBzdWNoIHRoYXQgYmluYXJpZXMgYXJlCisgICMgbmFtZWQgLmV4ZSBidXQgY2FsbGVkIHdpdGhvdXQgdGhhdCBzdWZmaXguIFRoZXJlZm9yZSwgImZvbyIgYW5kICJmb28uZXhlIiBhcmUgY29uc2lkZXJlZAorICAjIHRoZSBzYW1lIGZpbGUsIG1vc3Qgb2YgdGhlIHRpbWUgKGFzIGluICJ0ZXN0IC1mIikuIEJ1dCBub3Qgd2hlbiBydW5uaW5nIGN5Z3BhdGggLXMsIHRoZW4KKyAgIyAiZm9vLmV4ZSIgaXMgT0sgYnV0ICJmb28iIGlzIGFuIGVycm9yLgorICAjCisgICMgVGhpcyB0ZXN0IGlzIHRoZXJlZm9yZSBzbGlnaHRseSBtb3JlIGFjY3VyYXRlIHRoYW4gInRlc3QgLWYiIHRvIGNoZWNrIGZvciBmaWxlIHByZWNlbnNlLgorICAjIEl0IGlzIGFsc28gYSB3YXkgdG8gbWFrZSBzdXJlIHdlIGdvdCB0aGUgcHJvcGVyIGZpbGUgbmFtZSBmb3IgdGhlIHJlYWwgdGVzdCBsYXRlciBvbi4KKyAgdGVzdF9zaG9ydHBhdGg9YCRDWUdQQVRIIC1zIC1tICIkbmV3X3BhdGgiIDI+IC9kZXYvbnVsbGAKKyAgaWYgdGVzdCAieCR0ZXN0X3Nob3J0cGF0aCIgPSB4OyB0aGVuCisgICAgIyBTaG9ydCBwYXRoIGZhaWxlZCwgZmlsZSBkb2VzIG5vdCBleGlzdCBhcyBzcGVjaWZpZWQuCisgICAgIyBUcnkgYWRkaW5nIC5leGUgb3IgLmNtZAorICAgIGlmIHRlc3QgLWYgIiR7bmV3X3BhdGh9LmV4ZSI7IHRoZW4KKyAgICAgICBpbnB1dF90b19zaG9ydHBhdGg9IiR7bmV3X3BhdGh9LmV4ZSIKKyAgICBlbGlmIHRlc3QgLWYgIiR7bmV3X3BhdGh9LmNtZCI7IHRoZW4KKyAgICAgICBpbnB1dF90b19zaG9ydHBhdGg9IiR7bmV3X3BhdGh9LmNtZCIKKyAgICBlbHNlCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSBwYXRoIG9mIENDLCB3aGljaCByZXNvbHZlcyBhcyBcIiRuZXdfcGF0aFwiLCBpcyBpbnZhbGlkLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUaGUgcGF0aCBvZiBDQywgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkbmV3X3BhdGhcIiwgaXMgaW52YWxpZC4iID4mNjt9CisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IE5laXRoZXIgXCIkbmV3X3BhdGhcIiBub3IgXCIkbmV3X3BhdGguZXhlL2NtZFwiIGNhbiBiZSBmb3VuZCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBOZWl0aGVyIFwiJG5ld19wYXRoXCIgbm9yIFwiJG5ld19wYXRoLmV4ZS9jbWRcIiBjYW4gYmUgZm91bmQiID4mNjt9CisgICAgICBhc19mbl9lcnJvciAkPyAiQ2Fubm90IGxvY2F0ZSB0aGUgdGhlIHBhdGggb2YgQ0MiICIkTElORU5PIiA1CisgICAgZmkKKyAgZWxzZQorICAgIGlucHV0X3RvX3Nob3J0cGF0aD0iJG5ld19wYXRoIgorICBmaQorCisgICMgQ2FsbCBoZWxwZXIgZnVuY3Rpb24gd2hpY2ggcG9zc2libHkgY29udmVydHMgdGhpcyB1c2luZyBET1Mtc3R5bGUgc2hvcnQgbW9kZS4KKyAgIyBJZiBzbywgdGhlIHVwZGF0ZWQgcGF0aCBpcyBzdG9yZWQgaW4gJG5ld19wYXRoLgorICBuZXdfcGF0aD0iJGlucHV0X3RvX3Nob3J0cGF0aCIKKworICBpbnB1dF9wYXRoPSIkaW5wdXRfdG9fc2hvcnRwYXRoIgorICAjIENoZWNrIGlmIHdlIG5lZWQgdG8gY29udmVydCB0aGlzIHVzaW5nIERPUy1zdHlsZSBzaG9ydCBtb2RlLiBJZiB0aGUgcGF0aAorICAjIGNvbnRhaW5zIGp1c3Qgc2ltcGxlIGNoYXJhY3RlcnMsIHVzZSBpdC4gT3RoZXJ3aXNlIChzcGFjZXMsIHdlaXJkIGNoYXJhY3RlcnMpLAorICAjIHRha2Ugbm8gY2hhbmNlcyBhbmQgcmV3cml0ZSBpdC4KKyAgIyBOb3RlOiBtNCBlYXRzIG91ciBbXSwgc28gd2UgbmVlZCB0byB1c2UgWyBhbmQgXSBpbnN0ZWFkLgorICBoYXNfZm9yYmlkZGVuX2NoYXJzPWAkRUNITyAiJGlucHV0X3BhdGgiIHwgJEdSRVAgW14tLl8vYS16QS1aMC05XWAKKyAgaWYgdGVzdCAieCRoYXNfZm9yYmlkZGVuX2NoYXJzIiAhPSB4OyB0aGVuCisgICAgIyBOb3cgY29udmVydCBpdCB0byBtaXhlZCBET1Mtc3R5bGUsIHNob3J0IG1vZGUgKG5vIHNwYWNlcywgYW5kIC8gaW5zdGVhZCBvZiBcKQorICAgIHNob3J0bW9kZV9wYXRoPWAkQ1lHUEFUSCAtcyAtbSAtYSAiJGlucHV0X3BhdGgiYAorICAgIHBhdGhfYWZ0ZXJfc2hvcnRtb2RlPWAkQ1lHUEFUSCAtdSAiJHNob3J0bW9kZV9wYXRoImAKKyAgICBpZiB0ZXN0ICJ4JHBhdGhfYWZ0ZXJfc2hvcnRtb2RlIiAhPSAieCRpbnB1dF90b19zaG9ydHBhdGgiOyB0aGVuCisgICAgICAjIEdvaW5nIHRvIHNob3J0IG1vZGUgYW5kIGJhY2sgYWdhaW4gZGlkIGluZGVlZCBtYXR0ZXIuIFNpbmNlIHNob3J0IG1vZGUgaXMKKyAgICAgICMgY2FzZSBpbnNlbnNpdGl2ZSwgbGV0J3MgbWFrZSBpdCBsb3dlcmNhc2UgdG8gaW1wcm92ZSByZWFkYWJpbGl0eS4KKyAgICAgIHNob3J0bW9kZV9wYXRoPWAkRUNITyAiJHNob3J0bW9kZV9wYXRoIiB8ICRUUiAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidgCisgICAgICAjIE5vdyBjb252ZXJ0IGl0IGJhY2sgdG8gVW5peC1zdGlsZSAoY3lncGF0aCkKKyAgICAgIGlucHV0X3BhdGg9YCRDWUdQQVRIIC11ICIkc2hvcnRtb2RlX3BhdGgiYAorICAgICAgbmV3X3BhdGg9IiRpbnB1dF9wYXRoIgorICAgIGZpCisgIGZpCisKKyAgdGVzdF9jeWdkcml2ZV9wcmVmaXg9YCRFQ0hPICRpbnB1dF9wYXRoIHwgJEdSRVAgXi9jeWdkcml2ZS9gCisgIGlmIHRlc3QgIngkdGVzdF9jeWdkcml2ZV9wcmVmaXgiID0geDsgdGhlbgorICAgICMgQXMgYSBzaW1wbGUgZml4LCBleGNsdWRlIC91c3IvYmluIHNpbmNlIGl0J3Mgbm90IGEgcmVhbCBwYXRoLgorICAgIGlmIHRlc3QgInhgJEVDSE8gJGlucHV0X3RvX3Nob3J0cGF0aCB8ICRHUkVQIF4vdXNyL2Jpbi9gIiA9IHg7IHRoZW4KKyAgICAgICMgVGhlIHBhdGggaXMgaW4gYSBDeWd3aW4gc3BlY2lhbCBkaXJlY3RvcnkgKGUuZy4gL2hvbWUpLiBXZSBuZWVkIHRoaXMgY29udmVydGVkIHRvCisgICAgICAjIGEgcGF0aCBwcmVmaXhlZCBieSAvY3lnZHJpdmUgZm9yIGZpeHBhdGggdG8gd29yay4KKyAgICAgIG5ld19wYXRoPSIkQ1lHV0lOX1JPT1RfUEFUSCRpbnB1dF9wYXRoIgorICAgIGZpCisgIGZpCisKKyAgIyByZW1vdmUgdHJhaWxpbmcgLmV4ZSBpZiBhbnkKKyAgbmV3X3BhdGg9IiR7bmV3X3BhdGgvJS5leGUvfSIKKworICBlbGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLm1zeXMiOyB0aGVuCisKKyAgIyBGaXJzdCBzZXBhcmF0ZSB0aGUgcGF0aCBmcm9tIHRoZSBhcmd1bWVudHMuIFRoaXMgd2lsbCBzcGxpdCBhdCB0aGUgZmlyc3QKKyAgIyBzcGFjZS4KKyAgY29tcGxldGU9IiRDQyIKKyAgcGF0aD0iJHtjb21wbGV0ZSUlICp9IgorICB0bXA9IiRjb21wbGV0ZSBFT0wiCisgIGFyZ3VtZW50cz0iJHt0bXAjKiB9IgorCisgICMgSW5wdXQgbWlnaHQgYmUgZ2l2ZW4gYXMgV2luZG93cyBmb3JtYXQsIHN0YXJ0IGJ5IGNvbnZlcnRpbmcgdG8KKyAgIyB1bml4IGZvcm1hdC4KKyAgbmV3X3BhdGg9IiRwYXRoIgorCisgIHdpbmRvd3NfcGF0aD0iJG5ld19wYXRoIgorICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5jeWd3aW4iOyB0aGVuCisgICAgdW5peF9wYXRoPWAkQ1lHUEFUSCAtdSAiJHdpbmRvd3NfcGF0aCJgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGVsaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MubXN5cyI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRFQ0hPICIkd2luZG93c19wYXRoIiB8ICRTRUQgLWUgJ3MsXlxcKC5cXCk6LC9cXDEsZycgLWUgJ3MsXFxcXCwvLGcnYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBmaQorCisKKyAgIyBOb3cgdHJ5IHRvIGxvY2F0ZSBleGVjdXRhYmxlIHVzaW5nIHdoaWNoCisgIG5ld19wYXRoPWAkV0hJQ0ggIiRuZXdfcGF0aCIgMj4gL2Rldi9udWxsYAorCisgIGlmIHRlc3QgIngkbmV3X3BhdGgiID0geDsgdGhlbgorICAgICMgT29wcy4gV2hpY2ggZGlkbid0IGZpbmQgdGhlIGV4ZWN1dGFibGUuCisgICAgIyBUaGUgc3BsaXR0aW5nIG9mIGFyZ3VtZW50cyBmcm9tIHRoZSBleGVjdXRhYmxlIGF0IGEgc3BhY2UgbWlnaHQgaGF2ZSBiZWVuIGluY29ycmVjdCwKKyAgICAjIHNpbmNlIHBhdGhzIHdpdGggc3BhY2UgYXJlIG1vcmUgbGlrZWx5IGluIFdpbmRvd3MuIEdpdmUgaXQgYW5vdGhlciB0cnkgd2l0aCB0aGUgd2hvbGUKKyAgICAjIGFyZ3VtZW50LgorICAgIHBhdGg9IiRjb21wbGV0ZSIKKyAgICBhcmd1bWVudHM9IkVPTCIKKyAgICBuZXdfcGF0aD0iJHBhdGgiCisKKyAgd2luZG93c19wYXRoPSIkbmV3X3BhdGgiCisgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLmN5Z3dpbiI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRDWUdQQVRIIC11ICIkd2luZG93c19wYXRoImAKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJEVDSE8gIiR3aW5kb3dzX3BhdGgiIHwgJFNFRCAtZSAncyxeXFwoLlxcKTosL1xcMSxnJyAtZSAncyxcXFxcLC8sZydgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGZpCisKKworICAgIG5ld19wYXRoPWAkV0hJQ0ggIiRuZXdfcGF0aCIgMj4gL2Rldi9udWxsYAorCisgICAgaWYgdGVzdCAieCRuZXdfcGF0aCIgPSB4OyB0aGVuCisgICAgICAjIEl0J3Mgc3RpbGwgbm90IGZvdW5kLiBOb3cgdGhpcyBpcyBhbiB1bnJlY292ZXJhYmxlIGVycm9yLgorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUaGUgcGF0aCBvZiBDQywgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkY29tcGxldGVcIiwgaXMgbm90IGZvdW5kLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUaGUgcGF0aCBvZiBDQywgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkY29tcGxldGVcIiwgaXMgbm90IGZvdW5kLiIgPiY2O30KKyAgICAgIGhhc19zcGFjZT1gJEVDSE8gIiRjb21wbGV0ZSIgfCAkR1JFUCAiICJgCisgICAgICBpZiB0ZXN0ICJ4JGhhc19zcGFjZSIgIT0geDsgdGhlbgorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFlvdSBtaWdodCBiZSBtaXhpbmcgc3BhY2VzIGluIHRoZSBwYXRoIGFuZCBleHRyYSBhcmd1bWVudHMsIHdoaWNoIGlzIG5vdCBhbGxvd2VkLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBZb3UgbWlnaHQgYmUgbWl4aW5nIHNwYWNlcyBpbiB0aGUgcGF0aCBhbmQgZXh0cmEgYXJndW1lbnRzLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iID4mNjt9CisgICAgICBmaQorICAgICAgYXNfZm5fZXJyb3IgJD8gIkNhbm5vdCBsb2NhdGUgdGhlIHRoZSBwYXRoIG9mIENDIiAiJExJTkVOTyIgNQorICAgIGZpCisgIGZpCisKKyAgIyBOb3cgbmV3X3BhdGggaGFzIGEgY29tcGxldGUgdW5peCBwYXRoIHRvIHRoZSBiaW5hcnkKKyAgaWYgdGVzdCAieGAkRUNITyAkbmV3X3BhdGggfCAkR1JFUCBeL2Jpbi9gIiAhPSB4OyB0aGVuCisgICAgIyBLZWVwIHBhdGhzIGluIC9iaW4gYXMtaXMsIGJ1dCByZW1vdmUgdHJhaWxpbmcgLmV4ZSBpZiBhbnkKKyAgICBuZXdfcGF0aD0iJHtuZXdfcGF0aC8lLmV4ZS99IgorICAgICMgRG8gbm90IHNhdmUgL2JpbiBwYXRocyB0byBhbGxfZml4cGF0aF9wcmVmaXhlcyEKKyAgZWxzZQorICAgICMgTm90IGluIG1peGVkIG9yIFdpbmRvd3Mgc3R5bGUsIHN0YXJ0IGJ5IHRoYXQuCisgICAgbmV3X3BhdGg9YGNtZCAvL2MgZWNobyAkbmV3X3BhdGhgCisKKyAgaW5wdXRfcGF0aD0iJG5ld19wYXRoIgorICAjIENoZWNrIGlmIHdlIG5lZWQgdG8gY29udmVydCB0aGlzIHVzaW5nIERPUy1zdHlsZSBzaG9ydCBtb2RlLiBJZiB0aGUgcGF0aAorICAjIGNvbnRhaW5zIGp1c3Qgc2ltcGxlIGNoYXJhY3RlcnMsIHVzZSBpdC4gT3RoZXJ3aXNlIChzcGFjZXMsIHdlaXJkIGNoYXJhY3RlcnMpLAorICAjIHRha2Ugbm8gY2hhbmNlcyBhbmQgcmV3cml0ZSBpdC4KKyAgIyBOb3RlOiBtNCBlYXRzIG91ciBbXSwgc28gd2UgbmVlZCB0byB1c2UgWyBhbmQgXSBpbnN0ZWFkLgorICBoYXNfZm9yYmlkZGVuX2NoYXJzPWAkRUNITyAiJGlucHV0X3BhdGgiIHwgJEdSRVAgW14tXy86YS16QS1aMC05XWAKKyAgaWYgdGVzdCAieCRoYXNfZm9yYmlkZGVuX2NoYXJzIiAhPSB4OyB0aGVuCisgICAgIyBOb3cgY29udmVydCBpdCB0byBtaXhlZCBET1Mtc3R5bGUsIHNob3J0IG1vZGUgKG5vIHNwYWNlcywgYW5kIC8gaW5zdGVhZCBvZiBcKQorICAgIG5ld19wYXRoPWBjbWQgL2MgImZvciAlQSBpbiAoXCIkaW5wdXRfcGF0aFwiKSBkbyBAZWNobyAlfnNBInwkVFIgXFxcXFxcXFwgLyB8ICRUUiAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidgCisgIGZpCisKKyAgICAjIE91dHB1dCBpcyBpbiAkbmV3X3BhdGgKKworICB3aW5kb3dzX3BhdGg9IiRuZXdfcGF0aCIKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJENZR1BBVEggLXUgIiR3aW5kb3dzX3BhdGgiYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBlbGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLm1zeXMiOyB0aGVuCisgICAgdW5peF9wYXRoPWAkRUNITyAiJHdpbmRvd3NfcGF0aCIgfCAkU0VEIC1lICdzLF5cXCguXFwpOiwvXFwxLGcnIC1lICdzLFxcXFwsLyxnJ2AKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZmkKKworICAgICMgcmVtb3ZlIHRyYWlsaW5nIC5leGUgaWYgYW55CisgICAgbmV3X3BhdGg9IiR7bmV3X3BhdGgvJS5leGUvfSIKKworICAgICMgU2F2ZSB0aGUgZmlyc3QgMTAgYnl0ZXMgb2YgdGhpcyBwYXRoIHRvIHRoZSBzdG9yYWdlLCBzbyBmaXhwYXRoIGNhbiB3b3JrLgorICAgIGFsbF9maXhwYXRoX3ByZWZpeGVzPSgiJHthbGxfZml4cGF0aF9wcmVmaXhlc1tAXX0iICIke25ld19wYXRoOjA6MTB9IikKKyAgZmkKKworICBlbHNlCisgICAgIyBXZSdyZSBvbiBhIHBvc2l4IHBsYXRmb3JtLiBIb29yYXkhIDopCisgICAgIyBGaXJzdCBzZXBhcmF0ZSB0aGUgcGF0aCBmcm9tIHRoZSBhcmd1bWVudHMuIFRoaXMgd2lsbCBzcGxpdCBhdCB0aGUgZmlyc3QKKyAgICAjIHNwYWNlLgorICAgIGNvbXBsZXRlPSIkQ0MiCisgICAgcGF0aD0iJHtjb21wbGV0ZSUlICp9IgorICAgIHRtcD0iJGNvbXBsZXRlIEVPTCIKKyAgICBhcmd1bWVudHM9IiR7dG1wIyogfSIKKworICAgIG5ld19wYXRoPWAkV0hJQ0ggJHBhdGggMj4gL2Rldi9udWxsYAorICAgIGlmIHRlc3QgIngkbmV3X3BhdGgiID0geDsgdGhlbgorICAgICAgaXNfYWJzb2x1dGVfcGF0aD1gJEVDSE8gIiRwYXRoIiB8ICRHUkVQIF4vYAorICAgICAgaWYgdGVzdCAieCRpc19hYnNvbHV0ZV9wYXRoIiAhPSB4OyB0aGVuCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogUmVzb2x2aW5nIENDIChhcyAkcGF0aCkgd2l0aCAnd2hpY2gnIGZhaWxlZCwgdXNpbmcgJHBhdGggZGlyZWN0bHkuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFJlc29sdmluZyBDQyAoYXMgJHBhdGgpIHdpdGggJ3doaWNoJyBmYWlsZWQsIHVzaW5nICRwYXRoIGRpcmVjdGx5LiIgPiY2O30KKyAgICAgICAgbmV3X3BhdGg9IiRwYXRoIgorICAgICAgZWxzZQorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSBwYXRoIG9mIENDLCB3aGljaCByZXNvbHZlcyBhcyBcIiRjb21wbGV0ZVwiLCBpcyBub3QgZm91bmQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoZSBwYXRoIG9mIENDLCB3aGljaCByZXNvbHZlcyBhcyBcIiRjb21wbGV0ZVwiLCBpcyBub3QgZm91bmQuIiA+JjY7fQorICAgICAgICBoYXNfc3BhY2U9YCRFQ0hPICIkY29tcGxldGUiIHwgJEdSRVAgIiAiYAorICAgICAgICBpZiB0ZXN0ICJ4JGhhc19zcGFjZSIgIT0geDsgdGhlbgorICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGhpcyBtaWdodCBiZSBjYXVzZWQgYnkgc3BhY2VzIGluIHRoZSBwYXRoLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhpcyBtaWdodCBiZSBjYXVzZWQgYnkgc3BhY2VzIGluIHRoZSBwYXRoLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iID4mNjt9CisgICAgICAgIGZpCisgICAgICAgIGFzX2ZuX2Vycm9yICQ/ICJDYW5ub3QgbG9jYXRlIHRoZSB0aGUgcGF0aCBvZiBDQyIgIiRMSU5FTk8iIDUKKyAgICAgIGZpCisgICAgZmkKKyAgZmkKKworICAjIE5vdyBqb2luIHRvZ2V0aGVyIHRoZSBwYXRoIGFuZCB0aGUgYXJndW1lbnRzIG9uY2UgYWdhaW4KKyAgaWYgdGVzdCAieCRhcmd1bWVudHMiICE9IHhFT0w7IHRoZW4KKyAgICAgIG5ld19jb21wbGV0ZT0iJG5ld19wYXRoICR7YXJndW1lbnRzJSAqfSIKKyAgZWxzZQorICAgICAgbmV3X2NvbXBsZXRlPSIkbmV3X3BhdGgiCisgIGZpCisKKyAgaWYgdGVzdCAieCRjb21wbGV0ZSIgIT0gIngkbmV3X2NvbXBsZXRlIjsgdGhlbgorICAgIENDPSIkbmV3X2NvbXBsZXRlIgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogUmV3cml0aW5nIENDIHRvIFwiJG5ld19jb21wbGV0ZVwiIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFJld3JpdGluZyBDQyB0byBcIiRuZXdfY29tcGxldGVcIiIgPiY2O30KKyAgZmkKKworICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHJlc29sdmVkIHN5bWJvbGljIGxpbmtzIGZvciBDQyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyByZXNvbHZlZCBzeW1ib2xpYyBsaW5rcyBmb3IgQ0MuLi4gIiA+JjY7IH0KKyAgVEVTVF9DT01QSUxFUj0iJENDIgorCisgICAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TIiAhPSB4d2luZG93czsgdGhlbgorICAgICAgICAjIEZvbGxvdyBhIGNoYWluIG9mIHN5bWJvbGljIGxpbmtzLiBVc2UgcmVhZGxpbmsKKyAgICAgICAgIyB3aGVyZSBpdCBleGlzdHMsIGVsc2UgZmFsbCBiYWNrIHRvIGhvcnJpYmx5CisgICAgICAgICMgY29tcGxpY2F0ZWQgc2hlbGwgY29kZS4KKyAgICAgICAgaWYgdGVzdCAieCRSRUFETElOS19URVNURUQiICE9IHllczsgdGhlbgorICAgICAgICAgICAgIyBPbiBNYWNPU1ggdGhlcmUgaXMgYSByZWFkbGluayB0b29sIHdpdGggYSBkaWZmZXJlbnQKKyAgICAgICAgICAgICMgcHVycG9zZSB0aGFuIHRoZSBHTlUgcmVhZGxpbmsgdG9vbC4gQ2hlY2sgdGhlIGZvdW5kIHJlYWRsaW5rLgorICAgICAgICAgICAgSVNHTlU9YCRSRUFETElOSyAtLWhlbHAgMj4mMSB8ICRHUkVQIEdOVWAKKyAgICAgICAgICAgIGlmIHRlc3QgIngkSVNHTlUiID0geDsgdGhlbgorICAgICAgICAgICAgICAgICAjIEEgcmVhZGxpbmsgdGhhdCB3ZSBkbyBub3Qga25vdyBob3cgdG8gdXNlLgorICAgICAgICAgICAgICAgICAjIEFyZSB0aGVyZSBvdGhlciBub24tR05VIHJlYWRsaW5rcyBvdXQgdGhlcmU/CisgICAgICAgICAgICAgICAgIFJFQURMSU5LX1RFU1RFRD15ZXMKKyAgICAgICAgICAgICAgICAgUkVBRExJTks9CisgICAgICAgICAgICBmaQorICAgICAgICBmaQorCisgICAgICAgIGlmIHRlc3QgIngkUkVBRExJTksiICE9IHg7IHRoZW4KKyAgICAgICAgICAgIFRFU1RfQ09NUElMRVI9YCRSRUFETElOSyAtZiAkVEVTVF9DT01QSUxFUmAKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgU1RBUlRESVI9JFBXRAorICAgICAgICAgICAgQ09VTlRFUj0wCisgICAgICAgICAgICBzeW1fbGlua19kaXI9YCRESVJOQU1FICRURVNUX0NPTVBJTEVSYAorICAgICAgICAgICAgc3ltX2xpbmtfZmlsZT1gJEJBU0VOQU1FICRURVNUX0NPTVBJTEVSYAorICAgICAgICAgICAgd2hpbGUgdGVzdCAkQ09VTlRFUiAtbHQgMjA7IGRvCisgICAgICAgICAgICAgICAgSVNMSU5LPWAkTFMgLWwgJHN5bV9saW5rX2Rpci8kc3ltX2xpbmtfZmlsZSB8ICRHUkVQICdcLT4nIHwgJFNFRCAtZSAncy8uKi0+IFwoLipcKS9cMS8nYAorICAgICAgICAgICAgICAgIGlmIHRlc3QgIngkSVNMSU5LIiA9PSB4OyB0aGVuCisgICAgICAgICAgICAgICAgICAgICMgVGhpcyBpcyBub3QgYSBzeW1ib2xpYyBsaW5rISBXZSBhcmUgZG9uZSEKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICMgVGhlIGxpbmsgbWlnaHQgYmUgcmVsYXRpdmUhIFdlIGhhdmUgdG8gdXNlIGNkIHRvIHRyYXZlbCBzYWZlbHkuCisgICAgICAgICAgICAgICAgY2QgJHN5bV9saW5rX2RpcgorICAgICAgICAgICAgICAgICMgLi4uIGFuZCB3ZSBtdXN0IGdldCB0aGUgdG8gdGhlIGFic29sdXRlIHBhdGgsIG5vdCBvbmUgdXNpbmcgc3ltYm9saWMgbGlua3MuCisgICAgICAgICAgICAgICAgY2QgYHB3ZCAtUGAKKyAgICAgICAgICAgICAgICBjZCBgJERJUk5BTUUgJElTTElOS2AKKyAgICAgICAgICAgICAgICBzeW1fbGlua19kaXI9YCRUSEVQV0RDTURgCisgICAgICAgICAgICAgICAgc3ltX2xpbmtfZmlsZT1gJEJBU0VOQU1FICRJU0xJTktgCisgICAgICAgICAgICAgICAgbGV0IENPVU5URVI9Q09VTlRFUisxCisgICAgICAgICAgICBkb25lCisgICAgICAgICAgICBjZCAkU1RBUlRESVIKKyAgICAgICAgICAgIFRFU1RfQ09NUElMRVI9JHN5bV9saW5rX2Rpci8kc3ltX2xpbmtfZmlsZQorICAgICAgICBmaQorICAgIGZpCisKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRURVNUX0NPTVBJTEVSIiA+JjUKKyRhc19lY2hvICIkVEVTVF9DT01QSUxFUiIgPiY2OyB9CisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgQ0MgaXMgZGlzZ3Vpc2VkIGNjYWNoZSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBpZiBDQyBpcyBkaXNndWlzZWQgY2NhY2hlLi4uICIgPiY2OyB9CisKKyAgQ09NUElMRVJfQkFTRU5BTUU9YCRCQVNFTkFNRSAiJFRFU1RfQ09NUElMRVIiYAorICBpZiB0ZXN0ICJ4JENPTVBJTEVSX0JBU0VOQU1FIiA9ICJ4Y2NhY2hlIjsgdGhlbgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMsIHRyeWluZyB0byBmaW5kIHByb3BlciAkQ09NUElMRVJfTkFNRSBjb21waWxlciIgPiY1CiskYXNfZWNobyAieWVzLCB0cnlpbmcgdG8gZmluZCBwcm9wZXIgJENPTVBJTEVSX05BTUUgY29tcGlsZXIiID4mNjsgfQorICAgICMgV2UgL3Vzci9saWIvY2NhY2hlIGluIHRoZSBwYXRoLCBzbyBjYyBpcyBhIHN5bWxpbmsgdG8gL3Vzci9iaW4vY2NhY2hlLgorICAgICMgV2Ugd2FudCB0byBjb250cm9sIGNjYWNoZSBpbnZvY2F0aW9uIG91cnNlbHZlcywgc28gaWdub3JlIHRoaXMgY2MgYW5kIHRyeQorICAgICMgc2VhcmNoaW5nIGFnYWluLgorCisgICAgIyBSZW1vdmUgdGhlIHBhdGggdG8gdGhlIGZha2UgY2NhY2hlIGNjIGZyb20gdGhlIFBBVEgKKyAgICBSRVRSWV9DT01QSUxFUl9TQVZFRF9QQVRIPSIkUEFUSCIKKyAgICBDT01QSUxFUl9ESVJOQU1FPWAkRElSTkFNRSAkQ0NgCisgICAgUEFUSD0iYCRFQ0hPICRQQVRIIHwgJFNFRCAtZSAicywkQ09NUElMRVJfRElSTkFNRSwsZyIgLWUgInMsOjosOixnIiAtZSAicyxeOiwsZyJgIgorCisgICAgIyBUcnkgYWdhaW4gbG9va2luZyBmb3Igb3VyIGNvbXBpbGVyCisgICAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICBmb3IgYWNfcHJvZyBpbiAkQ09NUElMRVJfQ0hFQ0tfTElTVAorICBkbworICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICRhY190b29sX3ByZWZpeCRhY19wcm9nOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19QUk9QRVJfQ09NUElMRVJfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkUFJPUEVSX0NPTVBJTEVSX0NDIjsgdGhlbgorICBhY19jdl9wcm9nX1BST1BFUl9DT01QSUxFUl9DQz0iJFBST1BFUl9DT01QSUxFUl9DQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX1BST1BFUl9DT01QSUxFUl9DQz0iJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2ciCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorUFJPUEVSX0NPTVBJTEVSX0NDPSRhY19jdl9wcm9nX1BST1BFUl9DT01QSUxFUl9DQworaWYgdGVzdCAtbiAiJFBST1BFUl9DT01QSUxFUl9DQyI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRQUk9QRVJfQ09NUElMRVJfQ0MiID4mNQorJGFzX2VjaG8gIiRQUk9QRVJfQ09NUElMRVJfQ0MiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworICAgIHRlc3QgLW4gIiRQUk9QRVJfQ09NUElMRVJfQ0MiICYmIGJyZWFrCisgIGRvbmUKK2ZpCitpZiB0ZXN0IC16ICIkUFJPUEVSX0NPTVBJTEVSX0NDIjsgdGhlbgorICBhY19jdF9QUk9QRVJfQ09NUElMRVJfQ0M9JFBST1BFUl9DT01QSUxFUl9DQworICBmb3IgYWNfcHJvZyBpbiAkQ09NUElMRVJfQ0hFQ0tfTElTVAorZG8KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9wcm9nX2FjX2N0X1BST1BFUl9DT01QSUxFUl9DQytzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9QUk9QRVJfQ09NUElMRVJfQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfUFJPUEVSX0NPTVBJTEVSX0NDPSIkYWNfY3RfUFJPUEVSX0NPTVBJTEVSX0NDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWNfY3RfUFJPUEVSX0NPTVBJTEVSX0NDPSIkYWNfcHJvZyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCithY19jdF9QUk9QRVJfQ09NUElMRVJfQ0M9JGFjX2N2X3Byb2dfYWNfY3RfUFJPUEVSX0NPTVBJTEVSX0NDCitpZiB0ZXN0IC1uICIkYWNfY3RfUFJPUEVSX0NPTVBJTEVSX0NDIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X1BST1BFUl9DT01QSUxFUl9DQyIgPiY1CiskYXNfZWNobyAiJGFjX2N0X1BST1BFUl9DT01QSUxFUl9DQyIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCisgIHRlc3QgLW4gIiRhY19jdF9QUk9QRVJfQ09NUElMRVJfQ0MiICYmIGJyZWFrCitkb25lCisKKyAgaWYgdGVzdCAieCRhY19jdF9QUk9QRVJfQ09NUElMRVJfQ0MiID0geDsgdGhlbgorICAgIFBST1BFUl9DT01QSUxFUl9DQz0iIgorICBlbHNlCisgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoreWVzOikKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KK2FjX3Rvb2xfd2FybmVkPXllcyA7OworZXNhYworICAgIFBST1BFUl9DT01QSUxFUl9DQz0kYWNfY3RfUFJPUEVSX0NPTVBJTEVSX0NDCisgIGZpCitmaQorCisKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorCisgICMgRmlyc3Qgc2VwYXJhdGUgdGhlIHBhdGggZnJvbSB0aGUgYXJndW1lbnRzLiBUaGlzIHdpbGwgc3BsaXQgYXQgdGhlIGZpcnN0CisgICMgc3BhY2UuCisgIGNvbXBsZXRlPSIkUFJPUEVSX0NPTVBJTEVSX0NDIgorICBwYXRoPSIke2NvbXBsZXRlJSUgKn0iCisgIHRtcD0iJGNvbXBsZXRlIEVPTCIKKyAgYXJndW1lbnRzPSIke3RtcCMqIH0iCisKKyAgIyBJbnB1dCBtaWdodCBiZSBnaXZlbiBhcyBXaW5kb3dzIGZvcm1hdCwgc3RhcnQgYnkgY29udmVydGluZyB0bworICAjIHVuaXggZm9ybWF0LgorICBuZXdfcGF0aD1gJENZR1BBVEggLXUgIiRwYXRoImAKKworICAjIE5vdyB0cnkgdG8gbG9jYXRlIGV4ZWN1dGFibGUgdXNpbmcgd2hpY2gKKyAgbmV3X3BhdGg9YCRXSElDSCAiJG5ld19wYXRoIiAyPiAvZGV2L251bGxgCisgIGlmIHRlc3QgIngkbmV3X3BhdGgiID0geDsgdGhlbgorICAgICMgT29wcy4gV2hpY2ggZGlkbid0IGZpbmQgdGhlIGV4ZWN1dGFibGUuCisgICAgIyBUaGUgc3BsaXR0aW5nIG9mIGFyZ3VtZW50cyBmcm9tIHRoZSBleGVjdXRhYmxlIGF0IGEgc3BhY2UgbWlnaHQgaGF2ZSBiZWVuIGluY29ycmVjdCwKKyAgICAjIHNpbmNlIHBhdGhzIHdpdGggc3BhY2UgYXJlIG1vcmUgbGlrZWx5IGluIFdpbmRvd3MuIEdpdmUgaXQgYW5vdGhlciB0cnkgd2l0aCB0aGUgd2hvbGUKKyAgICAjIGFyZ3VtZW50LgorICAgIHBhdGg9IiRjb21wbGV0ZSIKKyAgICBhcmd1bWVudHM9IkVPTCIKKyAgICBuZXdfcGF0aD1gJENZR1BBVEggLXUgIiRwYXRoImAKKyAgICBuZXdfcGF0aD1gJFdISUNIICIkbmV3X3BhdGgiIDI+IC9kZXYvbnVsbGAKKyAgICBpZiB0ZXN0ICJ4JG5ld19wYXRoIiA9IHg7IHRoZW4KKyAgICAgICMgSXQncyBzdGlsbCBub3QgZm91bmQuIE5vdyB0aGlzIGlzIGFuIHVucmVjb3ZlcmFibGUgZXJyb3IuCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSBwYXRoIG9mIFBST1BFUl9DT01QSUxFUl9DQywgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkY29tcGxldGVcIiwgaXMgbm90IGZvdW5kLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUaGUgcGF0aCBvZiBQUk9QRVJfQ09NUElMRVJfQ0MsIHdoaWNoIHJlc29sdmVzIGFzIFwiJGNvbXBsZXRlXCIsIGlzIG5vdCBmb3VuZC4iID4mNjt9CisgICAgICBoYXNfc3BhY2U9YCRFQ0hPICIkY29tcGxldGUiIHwgJEdSRVAgIiAiYAorICAgICAgaWYgdGVzdCAieCRoYXNfc3BhY2UiICE9IHg7IHRoZW4KKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBZb3UgbWlnaHQgYmUgbWl4aW5nIHNwYWNlcyBpbiB0aGUgcGF0aCBhbmQgZXh0cmEgYXJndW1lbnRzLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogWW91IG1pZ2h0IGJlIG1peGluZyBzcGFjZXMgaW4gdGhlIHBhdGggYW5kIGV4dHJhIGFyZ3VtZW50cywgd2hpY2ggaXMgbm90IGFsbG93ZWQuIiA+JjY7fQorICAgICAgZmkKKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJDYW5ub3QgbG9jYXRlIHRoZSB0aGUgcGF0aCBvZiBQUk9QRVJfQ09NUElMRVJfQ0MiICIkTElORU5PIiA1CisgICAgZmkKKyAgZmkKKworICAjIEN5Z3dpbiB0cmllcyB0byBoaWRlIHNvbWUgYXNwZWN0cyBvZiB0aGUgV2luZG93cyBmaWxlIHN5c3RlbSwgc3VjaCB0aGF0IGJpbmFyaWVzIGFyZQorICAjIG5hbWVkIC5leGUgYnV0IGNhbGxlZCB3aXRob3V0IHRoYXQgc3VmZml4LiBUaGVyZWZvcmUsICJmb28iIGFuZCAiZm9vLmV4ZSIgYXJlIGNvbnNpZGVyZWQKKyAgIyB0aGUgc2FtZSBmaWxlLCBtb3N0IG9mIHRoZSB0aW1lIChhcyBpbiAidGVzdCAtZiIpLiBCdXQgbm90IHdoZW4gcnVubmluZyBjeWdwYXRoIC1zLCB0aGVuCisgICMgImZvby5leGUiIGlzIE9LIGJ1dCAiZm9vIiBpcyBhbiBlcnJvci4KKyAgIworICAjIFRoaXMgdGVzdCBpcyB0aGVyZWZvcmUgc2xpZ2h0bHkgbW9yZSBhY2N1cmF0ZSB0aGFuICJ0ZXN0IC1mIiB0byBjaGVjayBmb3IgZmlsZSBwcmVjZW5zZS4KKyAgIyBJdCBpcyBhbHNvIGEgd2F5IHRvIG1ha2Ugc3VyZSB3ZSBnb3QgdGhlIHByb3BlciBmaWxlIG5hbWUgZm9yIHRoZSByZWFsIHRlc3QgbGF0ZXIgb24uCisgIHRlc3Rfc2hvcnRwYXRoPWAkQ1lHUEFUSCAtcyAtbSAiJG5ld19wYXRoIiAyPiAvZGV2L251bGxgCisgIGlmIHRlc3QgIngkdGVzdF9zaG9ydHBhdGgiID0geDsgdGhlbgorICAgICMgU2hvcnQgcGF0aCBmYWlsZWQsIGZpbGUgZG9lcyBub3QgZXhpc3QgYXMgc3BlY2lmaWVkLgorICAgICMgVHJ5IGFkZGluZyAuZXhlIG9yIC5jbWQKKyAgICBpZiB0ZXN0IC1mICIke25ld19wYXRofS5leGUiOyB0aGVuCisgICAgICAgaW5wdXRfdG9fc2hvcnRwYXRoPSIke25ld19wYXRofS5leGUiCisgICAgZWxpZiB0ZXN0IC1mICIke25ld19wYXRofS5jbWQiOyB0aGVuCisgICAgICAgaW5wdXRfdG9fc2hvcnRwYXRoPSIke25ld19wYXRofS5jbWQiCisgICAgZWxzZQorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUaGUgcGF0aCBvZiBQUk9QRVJfQ09NUElMRVJfQ0MsIHdoaWNoIHJlc29sdmVzIGFzIFwiJG5ld19wYXRoXCIsIGlzIGludmFsaWQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoZSBwYXRoIG9mIFBST1BFUl9DT01QSUxFUl9DQywgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkbmV3X3BhdGhcIiwgaXMgaW52YWxpZC4iID4mNjt9CisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IE5laXRoZXIgXCIkbmV3X3BhdGhcIiBub3IgXCIkbmV3X3BhdGguZXhlL2NtZFwiIGNhbiBiZSBmb3VuZCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBOZWl0aGVyIFwiJG5ld19wYXRoXCIgbm9yIFwiJG5ld19wYXRoLmV4ZS9jbWRcIiBjYW4gYmUgZm91bmQiID4mNjt9CisgICAgICBhc19mbl9lcnJvciAkPyAiQ2Fubm90IGxvY2F0ZSB0aGUgdGhlIHBhdGggb2YgUFJPUEVSX0NPTVBJTEVSX0NDIiAiJExJTkVOTyIgNQorICAgIGZpCisgIGVsc2UKKyAgICBpbnB1dF90b19zaG9ydHBhdGg9IiRuZXdfcGF0aCIKKyAgZmkKKworICAjIENhbGwgaGVscGVyIGZ1bmN0aW9uIHdoaWNoIHBvc3NpYmx5IGNvbnZlcnRzIHRoaXMgdXNpbmcgRE9TLXN0eWxlIHNob3J0IG1vZGUuCisgICMgSWYgc28sIHRoZSB1cGRhdGVkIHBhdGggaXMgc3RvcmVkIGluICRuZXdfcGF0aC4KKyAgbmV3X3BhdGg9IiRpbnB1dF90b19zaG9ydHBhdGgiCisKKyAgaW5wdXRfcGF0aD0iJGlucHV0X3RvX3Nob3J0cGF0aCIKKyAgIyBDaGVjayBpZiB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhpcyB1c2luZyBET1Mtc3R5bGUgc2hvcnQgbW9kZS4gSWYgdGhlIHBhdGgKKyAgIyBjb250YWlucyBqdXN0IHNpbXBsZSBjaGFyYWN0ZXJzLCB1c2UgaXQuIE90aGVyd2lzZSAoc3BhY2VzLCB3ZWlyZCBjaGFyYWN0ZXJzKSwKKyAgIyB0YWtlIG5vIGNoYW5jZXMgYW5kIHJld3JpdGUgaXQuCisgICMgTm90ZTogbTQgZWF0cyBvdXIgW10sIHNvIHdlIG5lZWQgdG8gdXNlIFsgYW5kIF0gaW5zdGVhZC4KKyAgaGFzX2ZvcmJpZGRlbl9jaGFycz1gJEVDSE8gIiRpbnB1dF9wYXRoIiB8ICRHUkVQIFteLS5fL2EtekEtWjAtOV1gCisgIGlmIHRlc3QgIngkaGFzX2ZvcmJpZGRlbl9jaGFycyIgIT0geDsgdGhlbgorICAgICMgTm93IGNvbnZlcnQgaXQgdG8gbWl4ZWQgRE9TLXN0eWxlLCBzaG9ydCBtb2RlIChubyBzcGFjZXMsIGFuZCAvIGluc3RlYWQgb2YgXCkKKyAgICBzaG9ydG1vZGVfcGF0aD1gJENZR1BBVEggLXMgLW0gLWEgIiRpbnB1dF9wYXRoImAKKyAgICBwYXRoX2FmdGVyX3Nob3J0bW9kZT1gJENZR1BBVEggLXUgIiRzaG9ydG1vZGVfcGF0aCJgCisgICAgaWYgdGVzdCAieCRwYXRoX2FmdGVyX3Nob3J0bW9kZSIgIT0gIngkaW5wdXRfdG9fc2hvcnRwYXRoIjsgdGhlbgorICAgICAgIyBHb2luZyB0byBzaG9ydCBtb2RlIGFuZCBiYWNrIGFnYWluIGRpZCBpbmRlZWQgbWF0dGVyLiBTaW5jZSBzaG9ydCBtb2RlIGlzCisgICAgICAjIGNhc2UgaW5zZW5zaXRpdmUsIGxldCdzIG1ha2UgaXQgbG93ZXJjYXNlIHRvIGltcHJvdmUgcmVhZGFiaWxpdHkuCisgICAgICBzaG9ydG1vZGVfcGF0aD1gJEVDSE8gIiRzaG9ydG1vZGVfcGF0aCIgfCAkVFIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAorICAgICAgIyBOb3cgY29udmVydCBpdCBiYWNrIHRvIFVuaXgtc3RpbGUgKGN5Z3BhdGgpCisgICAgICBpbnB1dF9wYXRoPWAkQ1lHUEFUSCAtdSAiJHNob3J0bW9kZV9wYXRoImAKKyAgICAgIG5ld19wYXRoPSIkaW5wdXRfcGF0aCIKKyAgICBmaQorICBmaQorCisgIHRlc3RfY3lnZHJpdmVfcHJlZml4PWAkRUNITyAkaW5wdXRfcGF0aCB8ICRHUkVQIF4vY3lnZHJpdmUvYAorICBpZiB0ZXN0ICJ4JHRlc3RfY3lnZHJpdmVfcHJlZml4IiA9IHg7IHRoZW4KKyAgICAjIEFzIGEgc2ltcGxlIGZpeCwgZXhjbHVkZSAvdXNyL2JpbiBzaW5jZSBpdCdzIG5vdCBhIHJlYWwgcGF0aC4KKyAgICBpZiB0ZXN0ICJ4YCRFQ0hPICRpbnB1dF90b19zaG9ydHBhdGggfCAkR1JFUCBeL3Vzci9iaW4vYCIgPSB4OyB0aGVuCisgICAgICAjIFRoZSBwYXRoIGlzIGluIGEgQ3lnd2luIHNwZWNpYWwgZGlyZWN0b3J5IChlLmcuIC9ob21lKS4gV2UgbmVlZCB0aGlzIGNvbnZlcnRlZCB0bworICAgICAgIyBhIHBhdGggcHJlZml4ZWQgYnkgL2N5Z2RyaXZlIGZvciBmaXhwYXRoIHRvIHdvcmsuCisgICAgICBuZXdfcGF0aD0iJENZR1dJTl9ST09UX1BBVEgkaW5wdXRfcGF0aCIKKyAgICBmaQorICBmaQorCisgICMgcmVtb3ZlIHRyYWlsaW5nIC5leGUgaWYgYW55CisgIG5ld19wYXRoPSIke25ld19wYXRoLyUuZXhlL30iCisKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorCisgICMgRmlyc3Qgc2VwYXJhdGUgdGhlIHBhdGggZnJvbSB0aGUgYXJndW1lbnRzLiBUaGlzIHdpbGwgc3BsaXQgYXQgdGhlIGZpcnN0CisgICMgc3BhY2UuCisgIGNvbXBsZXRlPSIkUFJPUEVSX0NPTVBJTEVSX0NDIgorICBwYXRoPSIke2NvbXBsZXRlJSUgKn0iCisgIHRtcD0iJGNvbXBsZXRlIEVPTCIKKyAgYXJndW1lbnRzPSIke3RtcCMqIH0iCisKKyAgIyBJbnB1dCBtaWdodCBiZSBnaXZlbiBhcyBXaW5kb3dzIGZvcm1hdCwgc3RhcnQgYnkgY29udmVydGluZyB0bworICAjIHVuaXggZm9ybWF0LgorICBuZXdfcGF0aD0iJHBhdGgiCisKKyAgd2luZG93c19wYXRoPSIkbmV3X3BhdGgiCisgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLmN5Z3dpbiI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRDWUdQQVRIIC11ICIkd2luZG93c19wYXRoImAKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJEVDSE8gIiR3aW5kb3dzX3BhdGgiIHwgJFNFRCAtZSAncyxeXFwoLlxcKTosL1xcMSxnJyAtZSAncyxcXFxcLC8sZydgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGZpCisKKworICAjIE5vdyB0cnkgdG8gbG9jYXRlIGV4ZWN1dGFibGUgdXNpbmcgd2hpY2gKKyAgbmV3X3BhdGg9YCRXSElDSCAiJG5ld19wYXRoIiAyPiAvZGV2L251bGxgCisKKyAgaWYgdGVzdCAieCRuZXdfcGF0aCIgPSB4OyB0aGVuCisgICAgIyBPb3BzLiBXaGljaCBkaWRuJ3QgZmluZCB0aGUgZXhlY3V0YWJsZS4KKyAgICAjIFRoZSBzcGxpdHRpbmcgb2YgYXJndW1lbnRzIGZyb20gdGhlIGV4ZWN1dGFibGUgYXQgYSBzcGFjZSBtaWdodCBoYXZlIGJlZW4gaW5jb3JyZWN0LAorICAgICMgc2luY2UgcGF0aHMgd2l0aCBzcGFjZSBhcmUgbW9yZSBsaWtlbHkgaW4gV2luZG93cy4gR2l2ZSBpdCBhbm90aGVyIHRyeSB3aXRoIHRoZSB3aG9sZQorICAgICMgYXJndW1lbnQuCisgICAgcGF0aD0iJGNvbXBsZXRlIgorICAgIGFyZ3VtZW50cz0iRU9MIgorICAgIG5ld19wYXRoPSIkcGF0aCIKKworICB3aW5kb3dzX3BhdGg9IiRuZXdfcGF0aCIKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJENZR1BBVEggLXUgIiR3aW5kb3dzX3BhdGgiYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBlbGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLm1zeXMiOyB0aGVuCisgICAgdW5peF9wYXRoPWAkRUNITyAiJHdpbmRvd3NfcGF0aCIgfCAkU0VEIC1lICdzLF5cXCguXFwpOiwvXFwxLGcnIC1lICdzLFxcXFwsLyxnJ2AKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZmkKKworCisgICAgbmV3X3BhdGg9YCRXSElDSCAiJG5ld19wYXRoIiAyPiAvZGV2L251bGxgCisKKyAgICBpZiB0ZXN0ICJ4JG5ld19wYXRoIiA9IHg7IHRoZW4KKyAgICAgICMgSXQncyBzdGlsbCBub3QgZm91bmQuIE5vdyB0aGlzIGlzIGFuIHVucmVjb3ZlcmFibGUgZXJyb3IuCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSBwYXRoIG9mIFBST1BFUl9DT01QSUxFUl9DQywgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkY29tcGxldGVcIiwgaXMgbm90IGZvdW5kLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUaGUgcGF0aCBvZiBQUk9QRVJfQ09NUElMRVJfQ0MsIHdoaWNoIHJlc29sdmVzIGFzIFwiJGNvbXBsZXRlXCIsIGlzIG5vdCBmb3VuZC4iID4mNjt9CisgICAgICBoYXNfc3BhY2U9YCRFQ0hPICIkY29tcGxldGUiIHwgJEdSRVAgIiAiYAorICAgICAgaWYgdGVzdCAieCRoYXNfc3BhY2UiICE9IHg7IHRoZW4KKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBZb3UgbWlnaHQgYmUgbWl4aW5nIHNwYWNlcyBpbiB0aGUgcGF0aCBhbmQgZXh0cmEgYXJndW1lbnRzLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogWW91IG1pZ2h0IGJlIG1peGluZyBzcGFjZXMgaW4gdGhlIHBhdGggYW5kIGV4dHJhIGFyZ3VtZW50cywgd2hpY2ggaXMgbm90IGFsbG93ZWQuIiA+JjY7fQorICAgICAgZmkKKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJDYW5ub3QgbG9jYXRlIHRoZSB0aGUgcGF0aCBvZiBQUk9QRVJfQ09NUElMRVJfQ0MiICIkTElORU5PIiA1CisgICAgZmkKKyAgZmkKKworICAjIE5vdyBuZXdfcGF0aCBoYXMgYSBjb21wbGV0ZSB1bml4IHBhdGggdG8gdGhlIGJpbmFyeQorICBpZiB0ZXN0ICJ4YCRFQ0hPICRuZXdfcGF0aCB8ICRHUkVQIF4vYmluL2AiICE9IHg7IHRoZW4KKyAgICAjIEtlZXAgcGF0aHMgaW4gL2JpbiBhcy1pcywgYnV0IHJlbW92ZSB0cmFpbGluZyAuZXhlIGlmIGFueQorICAgIG5ld19wYXRoPSIke25ld19wYXRoLyUuZXhlL30iCisgICAgIyBEbyBub3Qgc2F2ZSAvYmluIHBhdGhzIHRvIGFsbF9maXhwYXRoX3ByZWZpeGVzIQorICBlbHNlCisgICAgIyBOb3QgaW4gbWl4ZWQgb3IgV2luZG93cyBzdHlsZSwgc3RhcnQgYnkgdGhhdC4KKyAgICBuZXdfcGF0aD1gY21kIC8vYyBlY2hvICRuZXdfcGF0aGAKKworICBpbnB1dF9wYXRoPSIkbmV3X3BhdGgiCisgICMgQ2hlY2sgaWYgd2UgbmVlZCB0byBjb252ZXJ0IHRoaXMgdXNpbmcgRE9TLXN0eWxlIHNob3J0IG1vZGUuIElmIHRoZSBwYXRoCisgICMgY29udGFpbnMganVzdCBzaW1wbGUgY2hhcmFjdGVycywgdXNlIGl0LiBPdGhlcndpc2UgKHNwYWNlcywgd2VpcmQgY2hhcmFjdGVycyksCisgICMgdGFrZSBubyBjaGFuY2VzIGFuZCByZXdyaXRlIGl0LgorICAjIE5vdGU6IG00IGVhdHMgb3VyIFtdLCBzbyB3ZSBuZWVkIHRvIHVzZSBbIGFuZCBdIGluc3RlYWQuCisgIGhhc19mb3JiaWRkZW5fY2hhcnM9YCRFQ0hPICIkaW5wdXRfcGF0aCIgfCAkR1JFUCBbXi1fLzphLXpBLVowLTldYAorICBpZiB0ZXN0ICJ4JGhhc19mb3JiaWRkZW5fY2hhcnMiICE9IHg7IHRoZW4KKyAgICAjIE5vdyBjb252ZXJ0IGl0IHRvIG1peGVkIERPUy1zdHlsZSwgc2hvcnQgbW9kZSAobm8gc3BhY2VzLCBhbmQgLyBpbnN0ZWFkIG9mIFwpCisgICAgbmV3X3BhdGg9YGNtZCAvYyAiZm9yICVBIGluIChcIiRpbnB1dF9wYXRoXCIpIGRvIEBlY2hvICV+c0EifCRUUiBcXFxcXFxcXCAvIHwgJFRSICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J2AKKyAgZmkKKworICAgICMgT3V0cHV0IGlzIGluICRuZXdfcGF0aAorCisgIHdpbmRvd3NfcGF0aD0iJG5ld19wYXRoIgorICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5jeWd3aW4iOyB0aGVuCisgICAgdW5peF9wYXRoPWAkQ1lHUEFUSCAtdSAiJHdpbmRvd3NfcGF0aCJgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGVsaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MubXN5cyI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRFQ0hPICIkd2luZG93c19wYXRoIiB8ICRTRUQgLWUgJ3MsXlxcKC5cXCk6LC9cXDEsZycgLWUgJ3MsXFxcXCwvLGcnYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBmaQorCisgICAgIyByZW1vdmUgdHJhaWxpbmcgLmV4ZSBpZiBhbnkKKyAgICBuZXdfcGF0aD0iJHtuZXdfcGF0aC8lLmV4ZS99IgorCisgICAgIyBTYXZlIHRoZSBmaXJzdCAxMCBieXRlcyBvZiB0aGlzIHBhdGggdG8gdGhlIHN0b3JhZ2UsIHNvIGZpeHBhdGggY2FuIHdvcmsuCisgICAgYWxsX2ZpeHBhdGhfcHJlZml4ZXM9KCIke2FsbF9maXhwYXRoX3ByZWZpeGVzW0BdfSIgIiR7bmV3X3BhdGg6MDoxMH0iKQorICBmaQorCisgIGVsc2UKKyAgICAjIFdlJ3JlIG9uIGEgcG9zaXggcGxhdGZvcm0uIEhvb3JheSEgOikKKyAgICAjIEZpcnN0IHNlcGFyYXRlIHRoZSBwYXRoIGZyb20gdGhlIGFyZ3VtZW50cy4gVGhpcyB3aWxsIHNwbGl0IGF0IHRoZSBmaXJzdAorICAgICMgc3BhY2UuCisgICAgY29tcGxldGU9IiRQUk9QRVJfQ09NUElMRVJfQ0MiCisgICAgcGF0aD0iJHtjb21wbGV0ZSUlICp9IgorICAgIHRtcD0iJGNvbXBsZXRlIEVPTCIKKyAgICBhcmd1bWVudHM9IiR7dG1wIyogfSIKKworICAgIG5ld19wYXRoPWAkV0hJQ0ggJHBhdGggMj4gL2Rldi9udWxsYAorICAgIGlmIHRlc3QgIngkbmV3X3BhdGgiID0geDsgdGhlbgorICAgICAgaXNfYWJzb2x1dGVfcGF0aD1gJEVDSE8gIiRwYXRoIiB8ICRHUkVQIF4vYAorICAgICAgaWYgdGVzdCAieCRpc19hYnNvbHV0ZV9wYXRoIiAhPSB4OyB0aGVuCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogUmVzb2x2aW5nIFBST1BFUl9DT01QSUxFUl9DQyAoYXMgJHBhdGgpIHdpdGggJ3doaWNoJyBmYWlsZWQsIHVzaW5nICRwYXRoIGRpcmVjdGx5LiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBSZXNvbHZpbmcgUFJPUEVSX0NPTVBJTEVSX0NDIChhcyAkcGF0aCkgd2l0aCAnd2hpY2gnIGZhaWxlZCwgdXNpbmcgJHBhdGggZGlyZWN0bHkuIiA+JjY7fQorICAgICAgICBuZXdfcGF0aD0iJHBhdGgiCisgICAgICBlbHNlCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGhlIHBhdGggb2YgUFJPUEVSX0NPTVBJTEVSX0NDLCB3aGljaCByZXNvbHZlcyBhcyBcIiRjb21wbGV0ZVwiLCBpcyBub3QgZm91bmQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoZSBwYXRoIG9mIFBST1BFUl9DT01QSUxFUl9DQywgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkY29tcGxldGVcIiwgaXMgbm90IGZvdW5kLiIgPiY2O30KKyAgICAgICAgaGFzX3NwYWNlPWAkRUNITyAiJGNvbXBsZXRlIiB8ICRHUkVQICIgImAKKyAgICAgICAgaWYgdGVzdCAieCRoYXNfc3BhY2UiICE9IHg7IHRoZW4KKyAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoaXMgbWlnaHQgYmUgY2F1c2VkIGJ5IHNwYWNlcyBpbiB0aGUgcGF0aCwgd2hpY2ggaXMgbm90IGFsbG93ZWQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoaXMgbWlnaHQgYmUgY2F1c2VkIGJ5IHNwYWNlcyBpbiB0aGUgcGF0aCwgd2hpY2ggaXMgbm90IGFsbG93ZWQuIiA+JjY7fQorICAgICAgICBmaQorICAgICAgICBhc19mbl9lcnJvciAkPyAiQ2Fubm90IGxvY2F0ZSB0aGUgdGhlIHBhdGggb2YgUFJPUEVSX0NPTVBJTEVSX0NDIiAiJExJTkVOTyIgNQorICAgICAgZmkKKyAgICBmaQorICBmaQorCisgICMgTm93IGpvaW4gdG9nZXRoZXIgdGhlIHBhdGggYW5kIHRoZSBhcmd1bWVudHMgb25jZSBhZ2FpbgorICBpZiB0ZXN0ICJ4JGFyZ3VtZW50cyIgIT0geEVPTDsgdGhlbgorICAgICAgbmV3X2NvbXBsZXRlPSIkbmV3X3BhdGggJHthcmd1bWVudHMlICp9IgorICBlbHNlCisgICAgICBuZXdfY29tcGxldGU9IiRuZXdfcGF0aCIKKyAgZmkKKworICBpZiB0ZXN0ICJ4JGNvbXBsZXRlIiAhPSAieCRuZXdfY29tcGxldGUiOyB0aGVuCisgICAgUFJPUEVSX0NPTVBJTEVSX0NDPSIkbmV3X2NvbXBsZXRlIgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogUmV3cml0aW5nIFBST1BFUl9DT01QSUxFUl9DQyB0byBcIiRuZXdfY29tcGxldGVcIiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBSZXdyaXRpbmcgUFJPUEVSX0NPTVBJTEVSX0NDIHRvIFwiJG5ld19jb21wbGV0ZVwiIiA+JjY7fQorICBmaQorCisgICAgUEFUSD0iJFJFVFJZX0NPTVBJTEVSX1NBVkVEX1BBVEgiCisKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciByZXNvbHZlZCBzeW1ib2xpYyBsaW5rcyBmb3IgQ0MiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHJlc29sdmVkIHN5bWJvbGljIGxpbmtzIGZvciBDQy4uLiAiID4mNjsgfQorCisgICAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TIiAhPSB4d2luZG93czsgdGhlbgorICAgICAgICAjIEZvbGxvdyBhIGNoYWluIG9mIHN5bWJvbGljIGxpbmtzLiBVc2UgcmVhZGxpbmsKKyAgICAgICAgIyB3aGVyZSBpdCBleGlzdHMsIGVsc2UgZmFsbCBiYWNrIHRvIGhvcnJpYmx5CisgICAgICAgICMgY29tcGxpY2F0ZWQgc2hlbGwgY29kZS4KKyAgICAgICAgaWYgdGVzdCAieCRSRUFETElOS19URVNURUQiICE9IHllczsgdGhlbgorICAgICAgICAgICAgIyBPbiBNYWNPU1ggdGhlcmUgaXMgYSByZWFkbGluayB0b29sIHdpdGggYSBkaWZmZXJlbnQKKyAgICAgICAgICAgICMgcHVycG9zZSB0aGFuIHRoZSBHTlUgcmVhZGxpbmsgdG9vbC4gQ2hlY2sgdGhlIGZvdW5kIHJlYWRsaW5rLgorICAgICAgICAgICAgSVNHTlU9YCRSRUFETElOSyAtLWhlbHAgMj4mMSB8ICRHUkVQIEdOVWAKKyAgICAgICAgICAgIGlmIHRlc3QgIngkSVNHTlUiID0geDsgdGhlbgorICAgICAgICAgICAgICAgICAjIEEgcmVhZGxpbmsgdGhhdCB3ZSBkbyBub3Qga25vdyBob3cgdG8gdXNlLgorICAgICAgICAgICAgICAgICAjIEFyZSB0aGVyZSBvdGhlciBub24tR05VIHJlYWRsaW5rcyBvdXQgdGhlcmU/CisgICAgICAgICAgICAgICAgIFJFQURMSU5LX1RFU1RFRD15ZXMKKyAgICAgICAgICAgICAgICAgUkVBRExJTks9CisgICAgICAgICAgICBmaQorICAgICAgICBmaQorCisgICAgICAgIGlmIHRlc3QgIngkUkVBRExJTksiICE9IHg7IHRoZW4KKyAgICAgICAgICAgIFBST1BFUl9DT01QSUxFUl9DQz1gJFJFQURMSU5LIC1mICRQUk9QRVJfQ09NUElMRVJfQ0NgCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFNUQVJURElSPSRQV0QKKyAgICAgICAgICAgIENPVU5URVI9MAorICAgICAgICAgICAgc3ltX2xpbmtfZGlyPWAkRElSTkFNRSAkUFJPUEVSX0NPTVBJTEVSX0NDYAorICAgICAgICAgICAgc3ltX2xpbmtfZmlsZT1gJEJBU0VOQU1FICRQUk9QRVJfQ09NUElMRVJfQ0NgCisgICAgICAgICAgICB3aGlsZSB0ZXN0ICRDT1VOVEVSIC1sdCAyMDsgZG8KKyAgICAgICAgICAgICAgICBJU0xJTks9YCRMUyAtbCAkc3ltX2xpbmtfZGlyLyRzeW1fbGlua19maWxlIHwgJEdSRVAgJ1wtPicgfCAkU0VEIC1lICdzLy4qLT4gXCguKlwpL1wxLydgCisgICAgICAgICAgICAgICAgaWYgdGVzdCAieCRJU0xJTksiID09IHg7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgIyBUaGlzIGlzIG5vdCBhIHN5bWJvbGljIGxpbmshIFdlIGFyZSBkb25lIQorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgIyBUaGUgbGluayBtaWdodCBiZSByZWxhdGl2ZSEgV2UgaGF2ZSB0byB1c2UgY2QgdG8gdHJhdmVsIHNhZmVseS4KKyAgICAgICAgICAgICAgICBjZCAkc3ltX2xpbmtfZGlyCisgICAgICAgICAgICAgICAgIyAuLi4gYW5kIHdlIG11c3QgZ2V0IHRoZSB0byB0aGUgYWJzb2x1dGUgcGF0aCwgbm90IG9uZSB1c2luZyBzeW1ib2xpYyBsaW5rcy4KKyAgICAgICAgICAgICAgICBjZCBgcHdkIC1QYAorICAgICAgICAgICAgICAgIGNkIGAkRElSTkFNRSAkSVNMSU5LYAorICAgICAgICAgICAgICAgIHN5bV9saW5rX2Rpcj1gJFRIRVBXRENNRGAKKyAgICAgICAgICAgICAgICBzeW1fbGlua19maWxlPWAkQkFTRU5BTUUgJElTTElOS2AKKyAgICAgICAgICAgICAgICBsZXQgQ09VTlRFUj1DT1VOVEVSKzEKKyAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICAgIGNkICRTVEFSVERJUgorICAgICAgICAgICAgUFJPUEVSX0NPTVBJTEVSX0NDPSRzeW1fbGlua19kaXIvJHN5bV9saW5rX2ZpbGUKKyAgICAgICAgZmkKKyAgICBmaQorCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRQUk9QRVJfQ09NUElMRVJfQ0MiID4mNQorJGFzX2VjaG8gIiRQUk9QRVJfQ09NUElMRVJfQ0MiID4mNjsgfQorICAgIENDPSIkUFJPUEVSX0NPTVBJTEVSX0NDIgorICBlbHNlCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vLCBrZWVwaW5nIENDIiA+JjUKKyRhc19lY2hvICJubywga2VlcGluZyBDQyIgPiY2OyB9CisgICAgQ0M9IiRURVNUX0NPTVBJTEVSIgorICBmaQorCisgIENPTVBJTEVSPSRDQworICBDT01QSUxFUl9OQU1FPSRDT01QSUxFUl9OQU1FCisKKyAgaWYgdGVzdCAieCRPUEVOSkRLX1RBUkdFVF9PUyIgPSB4c29sYXJpczsgdGhlbgorICAgICMgTWFrZSBzdXJlIHdlIHVzZSB0aGUgU3VuIFN0dWRpbyBjb21waWxlciBhbmQgbm90IGdjYyBvbiBTb2xhcmlzLCB3aGljaCB3b24ndCB3b3JrCisgICAgQ09NUElMRVJfVkVSU0lPTl9URVNUPWAkQ09NUElMRVIgLVYgMj4mMSB8ICRIRUFEIC1uIDFgCisgICAgJEVDSE8gJENPTVBJTEVSX1ZFUlNJT05fVEVTVCB8ICRHUkVQICJeLio6IFN1biAkQ09NUElMRVJfTkFNRSIgPiAvZGV2L251bGwKKyAgICBpZiB0ZXN0ICQ/IC1uZSAwOyB0aGVuCisgICAgICBHQ0NfVkVSU0lPTl9URVNUPWAkQ09NUElMRVIgLS12ZXJzaW9uIDI+JjEgfCAkSEVBRCAtbiAxYAorCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSAkQ09NUElMRVJfTkFNRSBjb21waWxlciAobG9jYXRlZCBhcyAkQ09NUElMRVIpIGRvZXMgbm90IHNlZW0gdG8gYmUgdGhlIHJlcXVpcmVkIFN1biBTdHVkaW8gY29tcGlsZXIuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoZSAkQ09NUElMRVJfTkFNRSBjb21waWxlciAobG9jYXRlZCBhcyAkQ09NUElMRVIpIGRvZXMgbm90IHNlZW0gdG8gYmUgdGhlIHJlcXVpcmVkIFN1biBTdHVkaW8gY29tcGlsZXIuIiA+JjY7fQorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUaGUgcmVzdWx0IGZyb20gcnVubmluZyB3aXRoIC1WIHdhczogXCIkQ09NUElMRVJfVkVSU0lPTl9URVNUXCIgYW5kIHdpdGggLS12ZXJzaW9uOiBcIiRHQ0NfVkVSU0lPTl9URVNUXCIiID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhlIHJlc3VsdCBmcm9tIHJ1bm5pbmcgd2l0aCAtViB3YXM6IFwiJENPTVBJTEVSX1ZFUlNJT05fVEVTVFwiIGFuZCB3aXRoIC0tdmVyc2lvbjogXCIkR0NDX1ZFUlNJT05fVEVTVFwiIiA+JjY7fQorICAgICAgYXNfZm5fZXJyb3IgJD8gIlN1biBTdHVkaW8gY29tcGlsZXIgaXMgcmVxdWlyZWQuIFRyeSBzZXR0aW5nIC0td2l0aC10b29scy1kaXIuIiAiJExJTkVOTyIgNQorICAgIGVsc2UKKyAgICAgIENPTVBJTEVSX1ZFUlNJT049YCRFQ0hPICRDT01QSUxFUl9WRVJTSU9OX1RFU1QgfCAkU0VEIC1uICJzL14uKlsgLFx0XSRDT01QSUxFUl9OQU1FWyAsXHRdXChbMS05XVwuWzAtOV1bMC05XSpcKS4qL1wxL3AiYAorICAgICAgQ09NUElMRVJfVkVORE9SPSJTdW4gU3R1ZGlvIgorICAgIGZpCisgIGVsaWYgdGVzdCAgIngkT1BFTkpES19UQVJHRVRfT1MiID0geHdpbmRvd3M7IHRoZW4KKyAgICAjIEZpcnN0IGxpbmUgdHlwaWNhbGx5IGxvb2tzIHNvbWV0aGluZyBsaWtlOgorICAgICMgTWljcm9zb2Z0IChSKSAzMi1iaXQgQy9DKysgT3B0aW1pemluZyBDb21waWxlciBWZXJzaW9uIDE2LjAwLjMwMzE5LjAxIGZvciA4MHg4NgorICAgIENPTVBJTEVSX1ZFUlNJT05fVEVTVD1gJENPTVBJTEVSIDI+JjEgfCAkSEVBRCAtbiAxYAorICAgIENPTVBJTEVSX1ZFUlNJT049YCRFQ0hPICRDT01QSUxFUl9WRVJTSU9OX1RFU1QgfCAkU0VEIC1uICJzL14uKlZlcnNpb24gXChbMS05XVswLTkuXSpcKSAuKi9cMS9wImAKKyAgICBDT01QSUxFUl9WRU5ET1I9Ik1pY3Jvc29mdCBDTC5FWEUiCisgICAgQ09NUElMRVJfQ1BVX1RFU1Q9YCRFQ0hPICRDT01QSUxFUl9WRVJTSU9OX1RFU1QgfCAkU0VEIC1uICJzL14uKiBmb3IgXCguKlwpJC9cMS9wImAKKyAgICBpZiB0ZXN0ICJ4JE9QRU5KREtfVEFSR0VUX0NQVSIgPSAieHg4NiI7IHRoZW4KKyAgICAgIGlmIHRlc3QgIngkQ09NUElMRVJfQ1BVX1RFU1QiICE9ICJ4ODB4ODYiOyB0aGVuCisgICAgICAgIGFzX2ZuX2Vycm9yICQ/ICJUYXJnZXQgQ1BVIG1pc21hdGNoLiBXZSBhcmUgYnVpbGRpbmcgZm9yICRPUEVOSkRLX1RBUkdFVF9DUFUgYnV0IENMIGlzIGZvciBcIiRDT01QSUxFUl9DUFVfVEVTVFwiOyBleHBlY3RlZCBcIjgweDg2XCIuIiAiJExJTkVOTyIgNQorICAgICAgZmkKKyAgICBlbGlmIHRlc3QgIngkT1BFTkpES19UQVJHRVRfQ1BVIiA9ICJ4eDg2XzY0IjsgdGhlbgorICAgICAgaWYgdGVzdCAieCRDT01QSUxFUl9DUFVfVEVTVCIgIT0gInh4NjQiOyB0aGVuCisgICAgICAgIGFzX2ZuX2Vycm9yICQ/ICJUYXJnZXQgQ1BVIG1pc21hdGNoLiBXZSBhcmUgYnVpbGRpbmcgZm9yICRPUEVOSkRLX1RBUkdFVF9DUFUgYnV0IENMIGlzIGZvciBcIiRDT01QSUxFUl9DUFVfVEVTVFwiOyBleHBlY3RlZCBcIng2NFwiLiIgIiRMSU5FTk8iIDUKKyAgICAgIGZpCisgICAgZmkKKyAgZWxzZQorICAgIENPTVBJTEVSX1ZFUlNJT05fVEVTVD1gJENPTVBJTEVSIC0tdmVyc2lvbiAyPiYxIHwgJEhFQUQgLW4gMWAKKyAgICAjIENoZWNrIHRoYXQgdGhpcyBpcyBsaWtlbHkgdG8gYmUgR0NDLgorICAgICRDT01QSUxFUiAtLXZlcnNpb24gMj4mMSB8ICRHUkVQICJGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24iID4gL2Rldi9udWxsCisgICAgaWYgdGVzdCAkPyAtbmUgMDsgdGhlbgorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUaGUgJENPTVBJTEVSX05BTUUgY29tcGlsZXIgKGxvY2F0ZWQgYXMgJENPTVBJTEVSKSBkb2VzIG5vdCBzZWVtIHRvIGJlIHRoZSByZXF1aXJlZCBHQ0MgY29tcGlsZXIuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoZSAkQ09NUElMRVJfTkFNRSBjb21waWxlciAobG9jYXRlZCBhcyAkQ09NUElMRVIpIGRvZXMgbm90IHNlZW0gdG8gYmUgdGhlIHJlcXVpcmVkIEdDQyBjb21waWxlci4iID4mNjt9CisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSByZXN1bHQgZnJvbSBydW5uaW5nIHdpdGggLS12ZXJzaW9uIHdhczogXCIkQ09NUElMRVJfVkVSU0lPTl9URVNUXCIiID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhlIHJlc3VsdCBmcm9tIHJ1bm5pbmcgd2l0aCAtLXZlcnNpb24gd2FzOiBcIiRDT01QSUxFUl9WRVJTSU9OX1RFU1RcIiIgPiY2O30KKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJHQ0MgY29tcGlsZXIgaXMgcmVxdWlyZWQuIFRyeSBzZXR0aW5nIC0td2l0aC10b29scy1kaXIuIiAiJExJTkVOTyIgNQorICAgIGZpCisKKyAgICAjIEZpcnN0IGxpbmUgdHlwaWNhbGx5IGxvb2tzIHNvbWV0aGluZyBsaWtlOgorICAgICMgZ2NjIChVYnVudHUvTGluYXJvIDQuNS4yLTh1YnVudHU0KSA0LjUuMgorICAgIENPTVBJTEVSX1ZFUlNJT049YCRFQ0hPICRDT01QSUxFUl9WRVJTSU9OX1RFU1QgfCAkU0VEIC1uICJzL14uKiBcKFsxLTldWzAtOS5dKlwpL1wxL3AiYAorICAgIENPTVBJTEVSX1ZFTkRPUj1gJEVDSE8gJENPTVBJTEVSX1ZFUlNJT05fVEVTVCB8ICRTRUQgLW4gInMvXlwoLipcKSBbMS05XVswLTkuXSovXDEvcCJgCisgIGZpCisgICMgVGhpcyBzZXRzIENDX1ZFUlNJT04gb3IgQ1hYX1ZFUlNJT04uIChUaGlzIGNvbW1lbnQgaXMgYSBncmVwIG1hcmtlcikKKyAgQ0NfVkVSU0lPTj0iJENPTVBJTEVSX1ZFUlNJT04iCisgICMgVGhpcyBzZXRzIENDX1ZFTkRPUiBvciBDWFhfVkVORE9SLiAoVGhpcyBjb21tZW50IGlzIGEgZ3JlcCBtYXJrZXIpCisgIENDX1ZFTkRPUj0iJENPTVBJTEVSX1ZFTkRPUiIKKworICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFVzaW5nICRDT01QSUxFUl9WRU5ET1IgJENPTVBJTEVSX05BTUUgY29tcGlsZXIgdmVyc2lvbiAkQ09NUElMRVJfVkVSU0lPTiAobG9jYXRlZCBhdCAkQ09NUElMRVIpIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFVzaW5nICRDT01QSUxFUl9WRU5ET1IgJENPTVBJTEVSX05BTUUgY29tcGlsZXIgdmVyc2lvbiAkQ09NUElMRVJfVkVSU0lPTiAobG9jYXRlZCBhdCAkQ09NUElMRVIpIiA+JjY7fQorCisKKyMgTm93IHRoYXQgd2UgaGF2ZSByZXNvbHZlZCBDQyBvdXJzZWxmLCBsZXQgYXV0b2NvbmYgaGF2ZSBpdCdzIGdvIGF0IGl0CiBhY19leHQ9YwogYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKIGFjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKIGFjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCiBhY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CiBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gIGZvciBhY19wcm9nIGluIGNsIGNjIGdjYworICBmb3IgYWNfcHJvZyBpbiAkQ0MKICAgZG8KICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY190b29sX3ByZWZpeCRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KIHNldCBkdW1teSAkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZzsgYWNfd29yZD0kMgpAQCAtMTExNTUsNyArMTg0MjIsNyBAQAogZmkKIGlmIHRlc3QgLXogIiRDQyI7IHRoZW4KICAgYWNfY3RfQ0M9JENDCi0gIGZvciBhY19wcm9nIGluIGNsIGNjIGdjYworICBmb3IgYWNfcHJvZyBpbiAkQ0MKIGRvCiAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgogc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCkBAIC0xMTcwMyw3ICsxODk3MCw2OSBAQAogYWNfbGluaz0nJENYWCAtbyBjb25mdGVzdCRhY19leGVleHQgJENYWEZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKIGFjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY3h4X2NvbXBpbGVyX2dudQogCi1pZiB0ZXN0ICJ4JENDIiA9IHg7IHRoZW4KKworIyMjIExvY2F0ZSBDKysgY29tcGlsZXIgKENYWCkKKworaWYgdGVzdCAieCRPUEVOSkRLX1RBUkdFVF9PUyIgPSB4bWFjb3N4OyB0aGVuCisgICMgRG8gbm90IHByb2JlIGZvciBDQyBvbiBNYWNPU1guCisgIENPTVBJTEVSX0NIRUNLX0xJU1Q9ImNsIGcrKyIKK2Vsc2UKKyAgQ09NUElMRVJfQ0hFQ0tfTElTVD0iY2wgQ0MgZysrIgorZmkKKworICBDT01QSUxFUl9OQU1FPUMrKworCisgICMgRG8gYSBmaXJzdCBpbml0aWFsIGF0dGVtcHQgYXQgc2VhcmNoaW5nIHRoZSBsaXN0IG9mIGNvbXBpbGVyIG5hbWVzLgorICAjIEFDX1BBVEhfUFJPR1MgY2FuJ3QgYmUgcnVuIG11bHRpcGxlIHRpbWVzIHdpdGggdGhlIHNhbWUgdmFyaWFibGUsCisgICMgc28gY3JlYXRlIGEgbmV3IG5hbWUgZm9yIHRoaXMgcnVuLgorICBmb3IgYWNfcHJvZyBpbiAkQ09NUElMRVJfQ0hFQ0tfTElTVAorZG8KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9wYXRoX1BPVEVOVElBTF9DWFgrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXNlICRQT1RFTlRJQUxfQ1hYIGluCisgIFtcXC9dKiB8ID86W1xcL10qKQorICBhY19jdl9wYXRoX1BPVEVOVElBTF9DWFg9IiRQT1RFTlRJQUxfQ1hYIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgOzsKKyAgKikKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcGF0aF9QT1RFTlRJQUxfQ1hYPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCisgIDs7Citlc2FjCitmaQorUE9URU5USUFMX0NYWD0kYWNfY3ZfcGF0aF9QT1RFTlRJQUxfQ1hYCitpZiB0ZXN0IC1uICIkUE9URU5USUFMX0NYWCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRQT1RFTlRJQUxfQ1hYIiA+JjUKKyRhc19lY2hvICIkUE9URU5USUFMX0NYWCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCisgIHRlc3QgLW4gIiRQT1RFTlRJQUxfQ1hYIiAmJiBicmVhaworZG9uZQorCisgIENYWD0kUE9URU5USUFMX0NYWAorCisgIGlmIHRlc3QgIngkJENYWCIgPSB4OyB0aGVuCiAKICAgICAjIFByaW50IGEgaGVscGZ1bCBtZXNzYWdlIG9uIGhvdyB0byBhY3F1aXJlIHRoZSBuZWNlc3NhcnkgYnVpbGQgZGVwZW5kZW5jeS4KICAgICAjIGRldmtpdCBpcyB0aGUgaGVscCB0YWc6IGZyZWV0eXAyLCBjdXBzLCBwdWxzZSwgYWxzYSBldGMKQEAgLTExNzI5LDU2ICsxOTA1OCw3NzUgQEAKICAgICAgICAgSEVMUF9NU0c9IllvdSBtaWdodCBiZSBhYmxlIHRvIGZpeCB0aGlzIGJ5IHJ1bm5pbmcgJyRQS0dIQU5ETEVSX0NPTU1BTkQnLiIKICAgICBmaQogCi0gICAgYXNfZm5fZXJyb3IgJD8gIkNvdWxkIG5vdCBmaW5kIGEgY29tcGlsZXIuICRIRUxQX01TRyIgIiRMSU5FTk8iIDUKLWZpCi1pZiB0ZXN0ICJ4JENDIiA9IHhjYyAmJiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1MiID0geG1hY29zeDsgdGhlbgotICAgICMgRG8gbm90IHVzZSBjYyBvbiBNYWNPU1ggdXNlIGdjYyBpbnN0ZWFkLgotICAgIENDPSJnY2MiCi1maQorICAgICAgYXNfZm5fZXJyb3IgJD8gIkNvdWxkIG5vdCBmaW5kIGEgJENPTVBJTEVSX05BTUUgY29tcGlsZXIuICRIRUxQX01TRyIgIiRMSU5FTk8iIDUKKyAgZmkKIAotICAgICMgVHJhbnNsYXRlICJnY2MgLUUiIGludG8gImB3aGljaCBnY2NgIC1FIiBpZQotICAgICMgZXh0cmFjdCB0aGUgZnVsbCBwYXRoIHRvIHRoZSBiaW5hcnkgYW5kIGF0IHRoZQotICAgICMgc2FtZSB0aW1lIG1haW50YWluIGFueSBhcmd1bWVudHMgcGFzc2VkIHRvIGl0LgotICAgICMgVGhlIGNvbW1hbmQgTVVTVCBleGlzdCBpbiB0aGUgcGF0aCwgb3IgZWxzZSEKLSAgICB0bXA9IiRDQyIKLSAgICBjYXI9IiR7dG1wJSUgKn0iCi0gICAgdG1wPSIkQ0MgRU9MIgotICAgIGNkcj0iJHt0bXAjKiB9IgotICAgICMgT24gd2luZG93cyB3ZSB3YW50IHBhdGhzIHdpdGhvdXQgc3BhY2VzLgotICAgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PUyIgPSAieHdpbmRvd3MiOyB0aGVuCisgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLmN5Z3dpbiI7IHRoZW4KIAotICAgICMgVHJhbnNsYXRlIGxvbmcgY3lnZHJpdmUgb3IgQzpcc2Rmc2YgcGF0aAotICAgICMgaW50byBhIHNob3J0IG1peGVkIG1vZGUgcGF0aCB0aGF0IGhhcyBubwotICAgICMgc3BhY2VzIGluIGl0LgotICAgIHRtcD0iJGNhciIKKyAgIyBGaXJzdCBzZXBhcmF0ZSB0aGUgcGF0aCBmcm9tIHRoZSBhcmd1bWVudHMuIFRoaXMgd2lsbCBzcGxpdCBhdCB0aGUgZmlyc3QKKyAgIyBzcGFjZS4KKyAgY29tcGxldGU9IiRDWFgiCisgIHBhdGg9IiR7Y29tcGxldGUlJSAqfSIKKyAgdG1wPSIkY29tcGxldGUgRU9MIgorICBhcmd1bWVudHM9IiR7dG1wIyogfSIKIAotICAgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PUyIgPSAieHdpbmRvd3MiOyB0aGVuCi0gICAgICAgIHRtcD1gJENZR1BBVEggLXUgIiRjYXIiYAotICAgICAgICB0bXA9YHdoaWNoICIkdG1wImAKLSAgICAgICAgIyBJZiBmaWxlIGV4aXN0cyB3aXRoIC5leGUgYXBwZW5kZWQsIHRoYXQncyB0aGUgcmVhbCBmaWxlbmFtZQotICAgICAgICAjIGFuZCBjeWdwYXRoIG5lZWRzIHRoYXQgdG8gY29udmVydCB0byBzaG9ydCBzdHlsZSBwYXRoLgotICAgICAgICBpZiB0ZXN0IC1mICIke3RtcH0uZXhlIjsgdGhlbgotICAgICAgICAgICB0bXA9IiR7dG1wfS5leGUiCi0gICAgICAgIGVsaWYgdGVzdCAtZiAiJHt0bXB9LmNtZCI7IHRoZW4KLSAgICAgICAgICAgdG1wPSIke3RtcH0uY21kIgorICAjIElucHV0IG1pZ2h0IGJlIGdpdmVuIGFzIFdpbmRvd3MgZm9ybWF0LCBzdGFydCBieSBjb252ZXJ0aW5nIHRvCisgICMgdW5peCBmb3JtYXQuCisgIG5ld19wYXRoPWAkQ1lHUEFUSCAtdSAiJHBhdGgiYAorCisgICMgTm93IHRyeSB0byBsb2NhdGUgZXhlY3V0YWJsZSB1c2luZyB3aGljaAorICBuZXdfcGF0aD1gJFdISUNIICIkbmV3X3BhdGgiIDI+IC9kZXYvbnVsbGAKKyAgaWYgdGVzdCAieCRuZXdfcGF0aCIgPSB4OyB0aGVuCisgICAgIyBPb3BzLiBXaGljaCBkaWRuJ3QgZmluZCB0aGUgZXhlY3V0YWJsZS4KKyAgICAjIFRoZSBzcGxpdHRpbmcgb2YgYXJndW1lbnRzIGZyb20gdGhlIGV4ZWN1dGFibGUgYXQgYSBzcGFjZSBtaWdodCBoYXZlIGJlZW4gaW5jb3JyZWN0LAorICAgICMgc2luY2UgcGF0aHMgd2l0aCBzcGFjZSBhcmUgbW9yZSBsaWtlbHkgaW4gV2luZG93cy4gR2l2ZSBpdCBhbm90aGVyIHRyeSB3aXRoIHRoZSB3aG9sZQorICAgICMgYXJndW1lbnQuCisgICAgcGF0aD0iJGNvbXBsZXRlIgorICAgIGFyZ3VtZW50cz0iRU9MIgorICAgIG5ld19wYXRoPWAkQ1lHUEFUSCAtdSAiJHBhdGgiYAorICAgIG5ld19wYXRoPWAkV0hJQ0ggIiRuZXdfcGF0aCIgMj4gL2Rldi9udWxsYAorICAgIGlmIHRlc3QgIngkbmV3X3BhdGgiID0geDsgdGhlbgorICAgICAgIyBJdCdzIHN0aWxsIG5vdCBmb3VuZC4gTm93IHRoaXMgaXMgYW4gdW5yZWNvdmVyYWJsZSBlcnJvci4KKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGhlIHBhdGggb2YgQ1hYLCB3aGljaCByZXNvbHZlcyBhcyBcIiRjb21wbGV0ZVwiLCBpcyBub3QgZm91bmQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoZSBwYXRoIG9mIENYWCwgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkY29tcGxldGVcIiwgaXMgbm90IGZvdW5kLiIgPiY2O30KKyAgICAgIGhhc19zcGFjZT1gJEVDSE8gIiRjb21wbGV0ZSIgfCAkR1JFUCAiICJgCisgICAgICBpZiB0ZXN0ICJ4JGhhc19zcGFjZSIgIT0geDsgdGhlbgorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFlvdSBtaWdodCBiZSBtaXhpbmcgc3BhY2VzIGluIHRoZSBwYXRoIGFuZCBleHRyYSBhcmd1bWVudHMsIHdoaWNoIGlzIG5vdCBhbGxvd2VkLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBZb3UgbWlnaHQgYmUgbWl4aW5nIHNwYWNlcyBpbiB0aGUgcGF0aCBhbmQgZXh0cmEgYXJndW1lbnRzLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iID4mNjt9CisgICAgICBmaQorICAgICAgYXNfZm5fZXJyb3IgJD8gIkNhbm5vdCBsb2NhdGUgdGhlIHRoZSBwYXRoIG9mIENYWCIgIiRMSU5FTk8iIDUKKyAgICBmaQorICBmaQorCisgICMgQ3lnd2luIHRyaWVzIHRvIGhpZGUgc29tZSBhc3BlY3RzIG9mIHRoZSBXaW5kb3dzIGZpbGUgc3lzdGVtLCBzdWNoIHRoYXQgYmluYXJpZXMgYXJlCisgICMgbmFtZWQgLmV4ZSBidXQgY2FsbGVkIHdpdGhvdXQgdGhhdCBzdWZmaXguIFRoZXJlZm9yZSwgImZvbyIgYW5kICJmb28uZXhlIiBhcmUgY29uc2lkZXJlZAorICAjIHRoZSBzYW1lIGZpbGUsIG1vc3Qgb2YgdGhlIHRpbWUgKGFzIGluICJ0ZXN0IC1mIikuIEJ1dCBub3Qgd2hlbiBydW5uaW5nIGN5Z3BhdGggLXMsIHRoZW4KKyAgIyAiZm9vLmV4ZSIgaXMgT0sgYnV0ICJmb28iIGlzIGFuIGVycm9yLgorICAjCisgICMgVGhpcyB0ZXN0IGlzIHRoZXJlZm9yZSBzbGlnaHRseSBtb3JlIGFjY3VyYXRlIHRoYW4gInRlc3QgLWYiIHRvIGNoZWNrIGZvciBmaWxlIHByZWNlbnNlLgorICAjIEl0IGlzIGFsc28gYSB3YXkgdG8gbWFrZSBzdXJlIHdlIGdvdCB0aGUgcHJvcGVyIGZpbGUgbmFtZSBmb3IgdGhlIHJlYWwgdGVzdCBsYXRlciBvbi4KKyAgdGVzdF9zaG9ydHBhdGg9YCRDWUdQQVRIIC1zIC1tICIkbmV3X3BhdGgiIDI+IC9kZXYvbnVsbGAKKyAgaWYgdGVzdCAieCR0ZXN0X3Nob3J0cGF0aCIgPSB4OyB0aGVuCisgICAgIyBTaG9ydCBwYXRoIGZhaWxlZCwgZmlsZSBkb2VzIG5vdCBleGlzdCBhcyBzcGVjaWZpZWQuCisgICAgIyBUcnkgYWRkaW5nIC5leGUgb3IgLmNtZAorICAgIGlmIHRlc3QgLWYgIiR7bmV3X3BhdGh9LmV4ZSI7IHRoZW4KKyAgICAgICBpbnB1dF90b19zaG9ydHBhdGg9IiR7bmV3X3BhdGh9LmV4ZSIKKyAgICBlbGlmIHRlc3QgLWYgIiR7bmV3X3BhdGh9LmNtZCI7IHRoZW4KKyAgICAgICBpbnB1dF90b19zaG9ydHBhdGg9IiR7bmV3X3BhdGh9LmNtZCIKKyAgICBlbHNlCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSBwYXRoIG9mIENYWCwgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkbmV3X3BhdGhcIiwgaXMgaW52YWxpZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhlIHBhdGggb2YgQ1hYLCB3aGljaCByZXNvbHZlcyBhcyBcIiRuZXdfcGF0aFwiLCBpcyBpbnZhbGlkLiIgPiY2O30KKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogTmVpdGhlciBcIiRuZXdfcGF0aFwiIG5vciBcIiRuZXdfcGF0aC5leGUvY21kXCIgY2FuIGJlIGZvdW5kIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IE5laXRoZXIgXCIkbmV3X3BhdGhcIiBub3IgXCIkbmV3X3BhdGguZXhlL2NtZFwiIGNhbiBiZSBmb3VuZCIgPiY2O30KKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJDYW5ub3QgbG9jYXRlIHRoZSB0aGUgcGF0aCBvZiBDWFgiICIkTElORU5PIiA1CisgICAgZmkKKyAgZWxzZQorICAgIGlucHV0X3RvX3Nob3J0cGF0aD0iJG5ld19wYXRoIgorICBmaQorCisgICMgQ2FsbCBoZWxwZXIgZnVuY3Rpb24gd2hpY2ggcG9zc2libHkgY29udmVydHMgdGhpcyB1c2luZyBET1Mtc3R5bGUgc2hvcnQgbW9kZS4KKyAgIyBJZiBzbywgdGhlIHVwZGF0ZWQgcGF0aCBpcyBzdG9yZWQgaW4gJG5ld19wYXRoLgorICBuZXdfcGF0aD0iJGlucHV0X3RvX3Nob3J0cGF0aCIKKworICBpbnB1dF9wYXRoPSIkaW5wdXRfdG9fc2hvcnRwYXRoIgorICAjIENoZWNrIGlmIHdlIG5lZWQgdG8gY29udmVydCB0aGlzIHVzaW5nIERPUy1zdHlsZSBzaG9ydCBtb2RlLiBJZiB0aGUgcGF0aAorICAjIGNvbnRhaW5zIGp1c3Qgc2ltcGxlIGNoYXJhY3RlcnMsIHVzZSBpdC4gT3RoZXJ3aXNlIChzcGFjZXMsIHdlaXJkIGNoYXJhY3RlcnMpLAorICAjIHRha2Ugbm8gY2hhbmNlcyBhbmQgcmV3cml0ZSBpdC4KKyAgIyBOb3RlOiBtNCBlYXRzIG91ciBbXSwgc28gd2UgbmVlZCB0byB1c2UgWyBhbmQgXSBpbnN0ZWFkLgorICBoYXNfZm9yYmlkZGVuX2NoYXJzPWAkRUNITyAiJGlucHV0X3BhdGgiIHwgJEdSRVAgW14tLl8vYS16QS1aMC05XWAKKyAgaWYgdGVzdCAieCRoYXNfZm9yYmlkZGVuX2NoYXJzIiAhPSB4OyB0aGVuCisgICAgIyBOb3cgY29udmVydCBpdCB0byBtaXhlZCBET1Mtc3R5bGUsIHNob3J0IG1vZGUgKG5vIHNwYWNlcywgYW5kIC8gaW5zdGVhZCBvZiBcKQorICAgIHNob3J0bW9kZV9wYXRoPWAkQ1lHUEFUSCAtcyAtbSAtYSAiJGlucHV0X3BhdGgiYAorICAgIHBhdGhfYWZ0ZXJfc2hvcnRtb2RlPWAkQ1lHUEFUSCAtdSAiJHNob3J0bW9kZV9wYXRoImAKKyAgICBpZiB0ZXN0ICJ4JHBhdGhfYWZ0ZXJfc2hvcnRtb2RlIiAhPSAieCRpbnB1dF90b19zaG9ydHBhdGgiOyB0aGVuCisgICAgICAjIEdvaW5nIHRvIHNob3J0IG1vZGUgYW5kIGJhY2sgYWdhaW4gZGlkIGluZGVlZCBtYXR0ZXIuIFNpbmNlIHNob3J0IG1vZGUgaXMKKyAgICAgICMgY2FzZSBpbnNlbnNpdGl2ZSwgbGV0J3MgbWFrZSBpdCBsb3dlcmNhc2UgdG8gaW1wcm92ZSByZWFkYWJpbGl0eS4KKyAgICAgIHNob3J0bW9kZV9wYXRoPWAkRUNITyAiJHNob3J0bW9kZV9wYXRoIiB8ICRUUiAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidgCisgICAgICAjIE5vdyBjb252ZXJ0IGl0IGJhY2sgdG8gVW5peC1zdGlsZSAoY3lncGF0aCkKKyAgICAgIGlucHV0X3BhdGg9YCRDWUdQQVRIIC11ICIkc2hvcnRtb2RlX3BhdGgiYAorICAgICAgbmV3X3BhdGg9IiRpbnB1dF9wYXRoIgorICAgIGZpCisgIGZpCisKKyAgdGVzdF9jeWdkcml2ZV9wcmVmaXg9YCRFQ0hPICRpbnB1dF9wYXRoIHwgJEdSRVAgXi9jeWdkcml2ZS9gCisgIGlmIHRlc3QgIngkdGVzdF9jeWdkcml2ZV9wcmVmaXgiID0geDsgdGhlbgorICAgICMgQXMgYSBzaW1wbGUgZml4LCBleGNsdWRlIC91c3IvYmluIHNpbmNlIGl0J3Mgbm90IGEgcmVhbCBwYXRoLgorICAgIGlmIHRlc3QgInhgJEVDSE8gJGlucHV0X3RvX3Nob3J0cGF0aCB8ICRHUkVQIF4vdXNyL2Jpbi9gIiA9IHg7IHRoZW4KKyAgICAgICMgVGhlIHBhdGggaXMgaW4gYSBDeWd3aW4gc3BlY2lhbCBkaXJlY3RvcnkgKGUuZy4gL2hvbWUpLiBXZSBuZWVkIHRoaXMgY29udmVydGVkIHRvCisgICAgICAjIGEgcGF0aCBwcmVmaXhlZCBieSAvY3lnZHJpdmUgZm9yIGZpeHBhdGggdG8gd29yay4KKyAgICAgIG5ld19wYXRoPSIkQ1lHV0lOX1JPT1RfUEFUSCRpbnB1dF9wYXRoIgorICAgIGZpCisgIGZpCisKKyAgIyByZW1vdmUgdHJhaWxpbmcgLmV4ZSBpZiBhbnkKKyAgbmV3X3BhdGg9IiR7bmV3X3BhdGgvJS5leGUvfSIKKworICBlbGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLm1zeXMiOyB0aGVuCisKKyAgIyBGaXJzdCBzZXBhcmF0ZSB0aGUgcGF0aCBmcm9tIHRoZSBhcmd1bWVudHMuIFRoaXMgd2lsbCBzcGxpdCBhdCB0aGUgZmlyc3QKKyAgIyBzcGFjZS4KKyAgY29tcGxldGU9IiRDWFgiCisgIHBhdGg9IiR7Y29tcGxldGUlJSAqfSIKKyAgdG1wPSIkY29tcGxldGUgRU9MIgorICBhcmd1bWVudHM9IiR7dG1wIyogfSIKKworICAjIElucHV0IG1pZ2h0IGJlIGdpdmVuIGFzIFdpbmRvd3MgZm9ybWF0LCBzdGFydCBieSBjb252ZXJ0aW5nIHRvCisgICMgdW5peCBmb3JtYXQuCisgIG5ld19wYXRoPSIkcGF0aCIKKworICB3aW5kb3dzX3BhdGg9IiRuZXdfcGF0aCIKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJENZR1BBVEggLXUgIiR3aW5kb3dzX3BhdGgiYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBlbGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLm1zeXMiOyB0aGVuCisgICAgdW5peF9wYXRoPWAkRUNITyAiJHdpbmRvd3NfcGF0aCIgfCAkU0VEIC1lICdzLF5cXCguXFwpOiwvXFwxLGcnIC1lICdzLFxcXFwsLyxnJ2AKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZmkKKworCisgICMgTm93IHRyeSB0byBsb2NhdGUgZXhlY3V0YWJsZSB1c2luZyB3aGljaAorICBuZXdfcGF0aD1gJFdISUNIICIkbmV3X3BhdGgiIDI+IC9kZXYvbnVsbGAKKworICBpZiB0ZXN0ICJ4JG5ld19wYXRoIiA9IHg7IHRoZW4KKyAgICAjIE9vcHMuIFdoaWNoIGRpZG4ndCBmaW5kIHRoZSBleGVjdXRhYmxlLgorICAgICMgVGhlIHNwbGl0dGluZyBvZiBhcmd1bWVudHMgZnJvbSB0aGUgZXhlY3V0YWJsZSBhdCBhIHNwYWNlIG1pZ2h0IGhhdmUgYmVlbiBpbmNvcnJlY3QsCisgICAgIyBzaW5jZSBwYXRocyB3aXRoIHNwYWNlIGFyZSBtb3JlIGxpa2VseSBpbiBXaW5kb3dzLiBHaXZlIGl0IGFub3RoZXIgdHJ5IHdpdGggdGhlIHdob2xlCisgICAgIyBhcmd1bWVudC4KKyAgICBwYXRoPSIkY29tcGxldGUiCisgICAgYXJndW1lbnRzPSJFT0wiCisgICAgbmV3X3BhdGg9IiRwYXRoIgorCisgIHdpbmRvd3NfcGF0aD0iJG5ld19wYXRoIgorICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5jeWd3aW4iOyB0aGVuCisgICAgdW5peF9wYXRoPWAkQ1lHUEFUSCAtdSAiJHdpbmRvd3NfcGF0aCJgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGVsaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MubXN5cyI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRFQ0hPICIkd2luZG93c19wYXRoIiB8ICRTRUQgLWUgJ3MsXlxcKC5cXCk6LC9cXDEsZycgLWUgJ3MsXFxcXCwvLGcnYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBmaQorCisKKyAgICBuZXdfcGF0aD1gJFdISUNIICIkbmV3X3BhdGgiIDI+IC9kZXYvbnVsbGAKKworICAgIGlmIHRlc3QgIngkbmV3X3BhdGgiID0geDsgdGhlbgorICAgICAgIyBJdCdzIHN0aWxsIG5vdCBmb3VuZC4gTm93IHRoaXMgaXMgYW4gdW5yZWNvdmVyYWJsZSBlcnJvci4KKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGhlIHBhdGggb2YgQ1hYLCB3aGljaCByZXNvbHZlcyBhcyBcIiRjb21wbGV0ZVwiLCBpcyBub3QgZm91bmQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoZSBwYXRoIG9mIENYWCwgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkY29tcGxldGVcIiwgaXMgbm90IGZvdW5kLiIgPiY2O30KKyAgICAgIGhhc19zcGFjZT1gJEVDSE8gIiRjb21wbGV0ZSIgfCAkR1JFUCAiICJgCisgICAgICBpZiB0ZXN0ICJ4JGhhc19zcGFjZSIgIT0geDsgdGhlbgorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFlvdSBtaWdodCBiZSBtaXhpbmcgc3BhY2VzIGluIHRoZSBwYXRoIGFuZCBleHRyYSBhcmd1bWVudHMsIHdoaWNoIGlzIG5vdCBhbGxvd2VkLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBZb3UgbWlnaHQgYmUgbWl4aW5nIHNwYWNlcyBpbiB0aGUgcGF0aCBhbmQgZXh0cmEgYXJndW1lbnRzLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iID4mNjt9CisgICAgICBmaQorICAgICAgYXNfZm5fZXJyb3IgJD8gIkNhbm5vdCBsb2NhdGUgdGhlIHRoZSBwYXRoIG9mIENYWCIgIiRMSU5FTk8iIDUKKyAgICBmaQorICBmaQorCisgICMgTm93IG5ld19wYXRoIGhhcyBhIGNvbXBsZXRlIHVuaXggcGF0aCB0byB0aGUgYmluYXJ5CisgIGlmIHRlc3QgInhgJEVDSE8gJG5ld19wYXRoIHwgJEdSRVAgXi9iaW4vYCIgIT0geDsgdGhlbgorICAgICMgS2VlcCBwYXRocyBpbiAvYmluIGFzLWlzLCBidXQgcmVtb3ZlIHRyYWlsaW5nIC5leGUgaWYgYW55CisgICAgbmV3X3BhdGg9IiR7bmV3X3BhdGgvJS5leGUvfSIKKyAgICAjIERvIG5vdCBzYXZlIC9iaW4gcGF0aHMgdG8gYWxsX2ZpeHBhdGhfcHJlZml4ZXMhCisgIGVsc2UKKyAgICAjIE5vdCBpbiBtaXhlZCBvciBXaW5kb3dzIHN0eWxlLCBzdGFydCBieSB0aGF0LgorICAgIG5ld19wYXRoPWBjbWQgLy9jIGVjaG8gJG5ld19wYXRoYAorCisgIGlucHV0X3BhdGg9IiRuZXdfcGF0aCIKKyAgIyBDaGVjayBpZiB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhpcyB1c2luZyBET1Mtc3R5bGUgc2hvcnQgbW9kZS4gSWYgdGhlIHBhdGgKKyAgIyBjb250YWlucyBqdXN0IHNpbXBsZSBjaGFyYWN0ZXJzLCB1c2UgaXQuIE90aGVyd2lzZSAoc3BhY2VzLCB3ZWlyZCBjaGFyYWN0ZXJzKSwKKyAgIyB0YWtlIG5vIGNoYW5jZXMgYW5kIHJld3JpdGUgaXQuCisgICMgTm90ZTogbTQgZWF0cyBvdXIgW10sIHNvIHdlIG5lZWQgdG8gdXNlIFsgYW5kIF0gaW5zdGVhZC4KKyAgaGFzX2ZvcmJpZGRlbl9jaGFycz1gJEVDSE8gIiRpbnB1dF9wYXRoIiB8ICRHUkVQIFteLV8vOmEtekEtWjAtOV1gCisgIGlmIHRlc3QgIngkaGFzX2ZvcmJpZGRlbl9jaGFycyIgIT0geDsgdGhlbgorICAgICMgTm93IGNvbnZlcnQgaXQgdG8gbWl4ZWQgRE9TLXN0eWxlLCBzaG9ydCBtb2RlIChubyBzcGFjZXMsIGFuZCAvIGluc3RlYWQgb2YgXCkKKyAgICBuZXdfcGF0aD1gY21kIC9jICJmb3IgJUEgaW4gKFwiJGlucHV0X3BhdGhcIikgZG8gQGVjaG8gJX5zQSJ8JFRSIFxcXFxcXFxcIC8gfCAkVFIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAorICBmaQorCisgICAgIyBPdXRwdXQgaXMgaW4gJG5ld19wYXRoCisKKyAgd2luZG93c19wYXRoPSIkbmV3X3BhdGgiCisgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLmN5Z3dpbiI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRDWUdQQVRIIC11ICIkd2luZG93c19wYXRoImAKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJEVDSE8gIiR3aW5kb3dzX3BhdGgiIHwgJFNFRCAtZSAncyxeXFwoLlxcKTosL1xcMSxnJyAtZSAncyxcXFxcLC8sZydgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGZpCisKKyAgICAjIHJlbW92ZSB0cmFpbGluZyAuZXhlIGlmIGFueQorICAgIG5ld19wYXRoPSIke25ld19wYXRoLyUuZXhlL30iCisKKyAgICAjIFNhdmUgdGhlIGZpcnN0IDEwIGJ5dGVzIG9mIHRoaXMgcGF0aCB0byB0aGUgc3RvcmFnZSwgc28gZml4cGF0aCBjYW4gd29yay4KKyAgICBhbGxfZml4cGF0aF9wcmVmaXhlcz0oIiR7YWxsX2ZpeHBhdGhfcHJlZml4ZXNbQF19IiAiJHtuZXdfcGF0aDowOjEwfSIpCisgIGZpCisKKyAgZWxzZQorICAgICMgV2UncmUgb24gYSBwb3NpeCBwbGF0Zm9ybS4gSG9vcmF5ISA6KQorICAgICMgRmlyc3Qgc2VwYXJhdGUgdGhlIHBhdGggZnJvbSB0aGUgYXJndW1lbnRzLiBUaGlzIHdpbGwgc3BsaXQgYXQgdGhlIGZpcnN0CisgICAgIyBzcGFjZS4KKyAgICBjb21wbGV0ZT0iJENYWCIKKyAgICBwYXRoPSIke2NvbXBsZXRlJSUgKn0iCisgICAgdG1wPSIkY29tcGxldGUgRU9MIgorICAgIGFyZ3VtZW50cz0iJHt0bXAjKiB9IgorCisgICAgbmV3X3BhdGg9YCRXSElDSCAkcGF0aCAyPiAvZGV2L251bGxgCisgICAgaWYgdGVzdCAieCRuZXdfcGF0aCIgPSB4OyB0aGVuCisgICAgICBpc19hYnNvbHV0ZV9wYXRoPWAkRUNITyAiJHBhdGgiIHwgJEdSRVAgXi9gCisgICAgICBpZiB0ZXN0ICJ4JGlzX2Fic29sdXRlX3BhdGgiICE9IHg7IHRoZW4KKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBSZXNvbHZpbmcgQ1hYIChhcyAkcGF0aCkgd2l0aCAnd2hpY2gnIGZhaWxlZCwgdXNpbmcgJHBhdGggZGlyZWN0bHkuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFJlc29sdmluZyBDWFggKGFzICRwYXRoKSB3aXRoICd3aGljaCcgZmFpbGVkLCB1c2luZyAkcGF0aCBkaXJlY3RseS4iID4mNjt9CisgICAgICAgIG5ld19wYXRoPSIkcGF0aCIKKyAgICAgIGVsc2UKKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUaGUgcGF0aCBvZiBDWFgsIHdoaWNoIHJlc29sdmVzIGFzIFwiJGNvbXBsZXRlXCIsIGlzIG5vdCBmb3VuZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhlIHBhdGggb2YgQ1hYLCB3aGljaCByZXNvbHZlcyBhcyBcIiRjb21wbGV0ZVwiLCBpcyBub3QgZm91bmQuIiA+JjY7fQorICAgICAgICBoYXNfc3BhY2U9YCRFQ0hPICIkY29tcGxldGUiIHwgJEdSRVAgIiAiYAorICAgICAgICBpZiB0ZXN0ICJ4JGhhc19zcGFjZSIgIT0geDsgdGhlbgorICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGhpcyBtaWdodCBiZSBjYXVzZWQgYnkgc3BhY2VzIGluIHRoZSBwYXRoLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhpcyBtaWdodCBiZSBjYXVzZWQgYnkgc3BhY2VzIGluIHRoZSBwYXRoLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iID4mNjt9CiAgICAgICAgIGZpCi0gICAgICAgICMgQ29udmVydCB0byBDOi8gbWl4ZWQgc3R5bGUgcGF0aCB3aXRob3V0IHNwYWNlcy4KLSAgICAgICAgIHRtcD1gJENZR1BBVEggLXMgLW0gIiR0bXAiYAorICAgICAgICBhc19mbl9lcnJvciAkPyAiQ2Fubm90IGxvY2F0ZSB0aGUgdGhlIHBhdGggb2YgQ1hYIiAiJExJTkVOTyIgNQorICAgICAgZmkKICAgICBmaQotICAgIGNhcj0iJHRtcCIKKyAgZmkKIAorICAjIE5vdyBqb2luIHRvZ2V0aGVyIHRoZSBwYXRoIGFuZCB0aGUgYXJndW1lbnRzIG9uY2UgYWdhaW4KKyAgaWYgdGVzdCAieCRhcmd1bWVudHMiICE9IHhFT0w7IHRoZW4KKyAgICAgIG5ld19jb21wbGV0ZT0iJG5ld19wYXRoICR7YXJndW1lbnRzJSAqfSIKKyAgZWxzZQorICAgICAgbmV3X2NvbXBsZXRlPSIkbmV3X3BhdGgiCisgIGZpCisKKyAgaWYgdGVzdCAieCRjb21wbGV0ZSIgIT0gIngkbmV3X2NvbXBsZXRlIjsgdGhlbgorICAgIENYWD0iJG5ld19jb21wbGV0ZSIKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFJld3JpdGluZyBDWFggdG8gXCIkbmV3X2NvbXBsZXRlXCIiID4mNQorJGFzX2VjaG8gIiRhc19tZTogUmV3cml0aW5nIENYWCB0byBcIiRuZXdfY29tcGxldGVcIiIgPiY2O30KKyAgZmkKKworICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHJlc29sdmVkIHN5bWJvbGljIGxpbmtzIGZvciBDWFgiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgcmVzb2x2ZWQgc3ltYm9saWMgbGlua3MgZm9yIENYWC4uLiAiID4mNjsgfQorICBURVNUX0NPTVBJTEVSPSIkQ1hYIgorCisgICAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TIiAhPSB4d2luZG93czsgdGhlbgorICAgICAgICAjIEZvbGxvdyBhIGNoYWluIG9mIHN5bWJvbGljIGxpbmtzLiBVc2UgcmVhZGxpbmsKKyAgICAgICAgIyB3aGVyZSBpdCBleGlzdHMsIGVsc2UgZmFsbCBiYWNrIHRvIGhvcnJpYmx5CisgICAgICAgICMgY29tcGxpY2F0ZWQgc2hlbGwgY29kZS4KKyAgICAgICAgaWYgdGVzdCAieCRSRUFETElOS19URVNURUQiICE9IHllczsgdGhlbgorICAgICAgICAgICAgIyBPbiBNYWNPU1ggdGhlcmUgaXMgYSByZWFkbGluayB0b29sIHdpdGggYSBkaWZmZXJlbnQKKyAgICAgICAgICAgICMgcHVycG9zZSB0aGFuIHRoZSBHTlUgcmVhZGxpbmsgdG9vbC4gQ2hlY2sgdGhlIGZvdW5kIHJlYWRsaW5rLgorICAgICAgICAgICAgSVNHTlU9YCRSRUFETElOSyAtLWhlbHAgMj4mMSB8ICRHUkVQIEdOVWAKKyAgICAgICAgICAgIGlmIHRlc3QgIngkSVNHTlUiID0geDsgdGhlbgorICAgICAgICAgICAgICAgICAjIEEgcmVhZGxpbmsgdGhhdCB3ZSBkbyBub3Qga25vdyBob3cgdG8gdXNlLgorICAgICAgICAgICAgICAgICAjIEFyZSB0aGVyZSBvdGhlciBub24tR05VIHJlYWRsaW5rcyBvdXQgdGhlcmU/CisgICAgICAgICAgICAgICAgIFJFQURMSU5LX1RFU1RFRD15ZXMKKyAgICAgICAgICAgICAgICAgUkVBRExJTks9CisgICAgICAgICAgICBmaQorICAgICAgICBmaQorCisgICAgICAgIGlmIHRlc3QgIngkUkVBRExJTksiICE9IHg7IHRoZW4KKyAgICAgICAgICAgIFRFU1RfQ09NUElMRVI9YCRSRUFETElOSyAtZiAkVEVTVF9DT01QSUxFUmAKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgU1RBUlRESVI9JFBXRAorICAgICAgICAgICAgQ09VTlRFUj0wCisgICAgICAgICAgICBzeW1fbGlua19kaXI9YCRESVJOQU1FICRURVNUX0NPTVBJTEVSYAorICAgICAgICAgICAgc3ltX2xpbmtfZmlsZT1gJEJBU0VOQU1FICRURVNUX0NPTVBJTEVSYAorICAgICAgICAgICAgd2hpbGUgdGVzdCAkQ09VTlRFUiAtbHQgMjA7IGRvCisgICAgICAgICAgICAgICAgSVNMSU5LPWAkTFMgLWwgJHN5bV9saW5rX2Rpci8kc3ltX2xpbmtfZmlsZSB8ICRHUkVQICdcLT4nIHwgJFNFRCAtZSAncy8uKi0+IFwoLipcKS9cMS8nYAorICAgICAgICAgICAgICAgIGlmIHRlc3QgIngkSVNMSU5LIiA9PSB4OyB0aGVuCisgICAgICAgICAgICAgICAgICAgICMgVGhpcyBpcyBub3QgYSBzeW1ib2xpYyBsaW5rISBXZSBhcmUgZG9uZSEKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICMgVGhlIGxpbmsgbWlnaHQgYmUgcmVsYXRpdmUhIFdlIGhhdmUgdG8gdXNlIGNkIHRvIHRyYXZlbCBzYWZlbHkuCisgICAgICAgICAgICAgICAgY2QgJHN5bV9saW5rX2RpcgorICAgICAgICAgICAgICAgICMgLi4uIGFuZCB3ZSBtdXN0IGdldCB0aGUgdG8gdGhlIGFic29sdXRlIHBhdGgsIG5vdCBvbmUgdXNpbmcgc3ltYm9saWMgbGlua3MuCisgICAgICAgICAgICAgICAgY2QgYHB3ZCAtUGAKKyAgICAgICAgICAgICAgICBjZCBgJERJUk5BTUUgJElTTElOS2AKKyAgICAgICAgICAgICAgICBzeW1fbGlua19kaXI9YCRUSEVQV0RDTURgCisgICAgICAgICAgICAgICAgc3ltX2xpbmtfZmlsZT1gJEJBU0VOQU1FICRJU0xJTktgCisgICAgICAgICAgICAgICAgbGV0IENPVU5URVI9Q09VTlRFUisxCisgICAgICAgICAgICBkb25lCisgICAgICAgICAgICBjZCAkU1RBUlRESVIKKyAgICAgICAgICAgIFRFU1RfQ09NUElMRVI9JHN5bV9saW5rX2Rpci8kc3ltX2xpbmtfZmlsZQorICAgICAgICBmaQorICAgIGZpCisKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRURVNUX0NPTVBJTEVSIiA+JjUKKyRhc19lY2hvICIkVEVTVF9DT01QSUxFUiIgPiY2OyB9CisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgQ1hYIGlzIGRpc2d1aXNlZCBjY2FjaGUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgQ1hYIGlzIGRpc2d1aXNlZCBjY2FjaGUuLi4gIiA+JjY7IH0KKworICBDT01QSUxFUl9CQVNFTkFNRT1gJEJBU0VOQU1FICIkVEVTVF9DT01QSUxFUiJgCisgIGlmIHRlc3QgIngkQ09NUElMRVJfQkFTRU5BTUUiID0gInhjY2FjaGUiOyB0aGVuCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcywgdHJ5aW5nIHRvIGZpbmQgcHJvcGVyICRDT01QSUxFUl9OQU1FIGNvbXBpbGVyIiA+JjUKKyRhc19lY2hvICJ5ZXMsIHRyeWluZyB0byBmaW5kIHByb3BlciAkQ09NUElMRVJfTkFNRSBjb21waWxlciIgPiY2OyB9CisgICAgIyBXZSAvdXNyL2xpYi9jY2FjaGUgaW4gdGhlIHBhdGgsIHNvIGNjIGlzIGEgc3ltbGluayB0byAvdXNyL2Jpbi9jY2FjaGUuCisgICAgIyBXZSB3YW50IHRvIGNvbnRyb2wgY2NhY2hlIGludm9jYXRpb24gb3Vyc2VsdmVzLCBzbyBpZ25vcmUgdGhpcyBjYyBhbmQgdHJ5CisgICAgIyBzZWFyY2hpbmcgYWdhaW4uCisKKyAgICAjIFJlbW92ZSB0aGUgcGF0aCB0byB0aGUgZmFrZSBjY2FjaGUgY2MgZnJvbSB0aGUgUEFUSAorICAgIFJFVFJZX0NPTVBJTEVSX1NBVkVEX1BBVEg9IiRQQVRIIgorICAgIENPTVBJTEVSX0RJUk5BTUU9YCRESVJOQU1FICRDWFhgCisgICAgUEFUSD0iYCRFQ0hPICRQQVRIIHwgJFNFRCAtZSAicywkQ09NUElMRVJfRElSTkFNRSwsZyIgLWUgInMsOjosOixnIiAtZSAicyxeOiwsZyJgIgorCisgICAgIyBUcnkgYWdhaW4gbG9va2luZyBmb3Igb3VyIGNvbXBpbGVyCisgICAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICBmb3IgYWNfcHJvZyBpbiAkQ09NUElMRVJfQ0hFQ0tfTElTVAorICBkbworICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICRhY190b29sX3ByZWZpeCRhY19wcm9nOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19QUk9QRVJfQ09NUElMRVJfQ1hYK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJFBST1BFUl9DT01QSUxFUl9DWFgiOyB0aGVuCisgIGFjX2N2X3Byb2dfUFJPUEVSX0NPTVBJTEVSX0NYWD0iJFBST1BFUl9DT01QSUxFUl9DWFgiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19QUk9QRVJfQ09NUElMRVJfQ1hYPSIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitQUk9QRVJfQ09NUElMRVJfQ1hYPSRhY19jdl9wcm9nX1BST1BFUl9DT01QSUxFUl9DWFgKK2lmIHRlc3QgLW4gIiRQUk9QRVJfQ09NUElMRVJfQ1hYIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFBST1BFUl9DT01QSUxFUl9DWFgiID4mNQorJGFzX2VjaG8gIiRQUk9QRVJfQ09NUElMRVJfQ1hYIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKyAgICB0ZXN0IC1uICIkUFJPUEVSX0NPTVBJTEVSX0NYWCIgJiYgYnJlYWsKKyAgZG9uZQorZmkKK2lmIHRlc3QgLXogIiRQUk9QRVJfQ09NUElMRVJfQ1hYIjsgdGhlbgorICBhY19jdF9QUk9QRVJfQ09NUElMRVJfQ1hYPSRQUk9QRVJfQ09NUElMRVJfQ1hYCisgIGZvciBhY19wcm9nIGluICRDT01QSUxFUl9DSEVDS19MSVNUCitkbworICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfUFJPUEVSX0NPTVBJTEVSX0NYWCtzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9QUk9QRVJfQ09NUElMRVJfQ1hYIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X1BST1BFUl9DT01QSUxFUl9DWFg9IiRhY19jdF9QUk9QRVJfQ09NUElMRVJfQ1hYIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWNfY3RfUFJPUEVSX0NPTVBJTEVSX0NYWD0iJGFjX3Byb2ciCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorYWNfY3RfUFJPUEVSX0NPTVBJTEVSX0NYWD0kYWNfY3ZfcHJvZ19hY19jdF9QUk9QRVJfQ09NUElMRVJfQ1hYCitpZiB0ZXN0IC1uICIkYWNfY3RfUFJPUEVSX0NPTVBJTEVSX0NYWCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9QUk9QRVJfQ09NUElMRVJfQ1hYIiA+JjUKKyRhc19lY2hvICIkYWNfY3RfUFJPUEVSX0NPTVBJTEVSX0NYWCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCisgIHRlc3QgLW4gIiRhY19jdF9QUk9QRVJfQ09NUElMRVJfQ1hYIiAmJiBicmVhaworZG9uZQorCisgIGlmIHRlc3QgIngkYWNfY3RfUFJPUEVSX0NPTVBJTEVSX0NYWCIgPSB4OyB0aGVuCisgICAgUFJPUEVSX0NPTVBJTEVSX0NYWD0iIgorICBlbHNlCisgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoreWVzOikKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KK2FjX3Rvb2xfd2FybmVkPXllcyA7OworZXNhYworICAgIFBST1BFUl9DT01QSUxFUl9DWFg9JGFjX2N0X1BST1BFUl9DT01QSUxFUl9DWFgKKyAgZmkKK2ZpCisKKworICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5jeWd3aW4iOyB0aGVuCisKKyAgIyBGaXJzdCBzZXBhcmF0ZSB0aGUgcGF0aCBmcm9tIHRoZSBhcmd1bWVudHMuIFRoaXMgd2lsbCBzcGxpdCBhdCB0aGUgZmlyc3QKKyAgIyBzcGFjZS4KKyAgY29tcGxldGU9IiRQUk9QRVJfQ09NUElMRVJfQ1hYIgorICBwYXRoPSIke2NvbXBsZXRlJSUgKn0iCisgIHRtcD0iJGNvbXBsZXRlIEVPTCIKKyAgYXJndW1lbnRzPSIke3RtcCMqIH0iCisKKyAgIyBJbnB1dCBtaWdodCBiZSBnaXZlbiBhcyBXaW5kb3dzIGZvcm1hdCwgc3RhcnQgYnkgY29udmVydGluZyB0bworICAjIHVuaXggZm9ybWF0LgorICBuZXdfcGF0aD1gJENZR1BBVEggLXUgIiRwYXRoImAKKworICAjIE5vdyB0cnkgdG8gbG9jYXRlIGV4ZWN1dGFibGUgdXNpbmcgd2hpY2gKKyAgbmV3X3BhdGg9YCRXSElDSCAiJG5ld19wYXRoIiAyPiAvZGV2L251bGxgCisgIGlmIHRlc3QgIngkbmV3X3BhdGgiID0geDsgdGhlbgorICAgICMgT29wcy4gV2hpY2ggZGlkbid0IGZpbmQgdGhlIGV4ZWN1dGFibGUuCisgICAgIyBUaGUgc3BsaXR0aW5nIG9mIGFyZ3VtZW50cyBmcm9tIHRoZSBleGVjdXRhYmxlIGF0IGEgc3BhY2UgbWlnaHQgaGF2ZSBiZWVuIGluY29ycmVjdCwKKyAgICAjIHNpbmNlIHBhdGhzIHdpdGggc3BhY2UgYXJlIG1vcmUgbGlrZWx5IGluIFdpbmRvd3MuIEdpdmUgaXQgYW5vdGhlciB0cnkgd2l0aCB0aGUgd2hvbGUKKyAgICAjIGFyZ3VtZW50LgorICAgIHBhdGg9IiRjb21wbGV0ZSIKKyAgICBhcmd1bWVudHM9IkVPTCIKKyAgICBuZXdfcGF0aD1gJENZR1BBVEggLXUgIiRwYXRoImAKKyAgICBuZXdfcGF0aD1gJFdISUNIICIkbmV3X3BhdGgiIDI+IC9kZXYvbnVsbGAKKyAgICBpZiB0ZXN0ICJ4JG5ld19wYXRoIiA9IHg7IHRoZW4KKyAgICAgICMgSXQncyBzdGlsbCBub3QgZm91bmQuIE5vdyB0aGlzIGlzIGFuIHVucmVjb3ZlcmFibGUgZXJyb3IuCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSBwYXRoIG9mIFBST1BFUl9DT01QSUxFUl9DWFgsIHdoaWNoIHJlc29sdmVzIGFzIFwiJGNvbXBsZXRlXCIsIGlzIG5vdCBmb3VuZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhlIHBhdGggb2YgUFJPUEVSX0NPTVBJTEVSX0NYWCwgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkY29tcGxldGVcIiwgaXMgbm90IGZvdW5kLiIgPiY2O30KKyAgICAgIGhhc19zcGFjZT1gJEVDSE8gIiRjb21wbGV0ZSIgfCAkR1JFUCAiICJgCisgICAgICBpZiB0ZXN0ICJ4JGhhc19zcGFjZSIgIT0geDsgdGhlbgorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFlvdSBtaWdodCBiZSBtaXhpbmcgc3BhY2VzIGluIHRoZSBwYXRoIGFuZCBleHRyYSBhcmd1bWVudHMsIHdoaWNoIGlzIG5vdCBhbGxvd2VkLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBZb3UgbWlnaHQgYmUgbWl4aW5nIHNwYWNlcyBpbiB0aGUgcGF0aCBhbmQgZXh0cmEgYXJndW1lbnRzLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iID4mNjt9CisgICAgICBmaQorICAgICAgYXNfZm5fZXJyb3IgJD8gIkNhbm5vdCBsb2NhdGUgdGhlIHRoZSBwYXRoIG9mIFBST1BFUl9DT01QSUxFUl9DWFgiICIkTElORU5PIiA1CisgICAgZmkKKyAgZmkKKworICAjIEN5Z3dpbiB0cmllcyB0byBoaWRlIHNvbWUgYXNwZWN0cyBvZiB0aGUgV2luZG93cyBmaWxlIHN5c3RlbSwgc3VjaCB0aGF0IGJpbmFyaWVzIGFyZQorICAjIG5hbWVkIC5leGUgYnV0IGNhbGxlZCB3aXRob3V0IHRoYXQgc3VmZml4LiBUaGVyZWZvcmUsICJmb28iIGFuZCAiZm9vLmV4ZSIgYXJlIGNvbnNpZGVyZWQKKyAgIyB0aGUgc2FtZSBmaWxlLCBtb3N0IG9mIHRoZSB0aW1lIChhcyBpbiAidGVzdCAtZiIpLiBCdXQgbm90IHdoZW4gcnVubmluZyBjeWdwYXRoIC1zLCB0aGVuCisgICMgImZvby5leGUiIGlzIE9LIGJ1dCAiZm9vIiBpcyBhbiBlcnJvci4KKyAgIworICAjIFRoaXMgdGVzdCBpcyB0aGVyZWZvcmUgc2xpZ2h0bHkgbW9yZSBhY2N1cmF0ZSB0aGFuICJ0ZXN0IC1mIiB0byBjaGVjayBmb3IgZmlsZSBwcmVjZW5zZS4KKyAgIyBJdCBpcyBhbHNvIGEgd2F5IHRvIG1ha2Ugc3VyZSB3ZSBnb3QgdGhlIHByb3BlciBmaWxlIG5hbWUgZm9yIHRoZSByZWFsIHRlc3QgbGF0ZXIgb24uCisgIHRlc3Rfc2hvcnRwYXRoPWAkQ1lHUEFUSCAtcyAtbSAiJG5ld19wYXRoIiAyPiAvZGV2L251bGxgCisgIGlmIHRlc3QgIngkdGVzdF9zaG9ydHBhdGgiID0geDsgdGhlbgorICAgICMgU2hvcnQgcGF0aCBmYWlsZWQsIGZpbGUgZG9lcyBub3QgZXhpc3QgYXMgc3BlY2lmaWVkLgorICAgICMgVHJ5IGFkZGluZyAuZXhlIG9yIC5jbWQKKyAgICBpZiB0ZXN0IC1mICIke25ld19wYXRofS5leGUiOyB0aGVuCisgICAgICAgaW5wdXRfdG9fc2hvcnRwYXRoPSIke25ld19wYXRofS5leGUiCisgICAgZWxpZiB0ZXN0IC1mICIke25ld19wYXRofS5jbWQiOyB0aGVuCisgICAgICAgaW5wdXRfdG9fc2hvcnRwYXRoPSIke25ld19wYXRofS5jbWQiCiAgICAgZWxzZQotICAgICAgICAjICJ3aGljaCIgaXMgbm90IHBvcnRhYmxlLCBidXQgaXMgdXNlZCBoZXJlCi0gICAgICAgICMgYmVjYXVzZSB3ZSBrbm93IHRoYXQgdGhlIGNvbW1hbmQgZXhpc3RzIQotICAgICAgICBjYXI9YHdoaWNoICRjYXJgCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSBwYXRoIG9mIFBST1BFUl9DT01QSUxFUl9DWFgsIHdoaWNoIHJlc29sdmVzIGFzIFwiJG5ld19wYXRoXCIsIGlzIGludmFsaWQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoZSBwYXRoIG9mIFBST1BFUl9DT01QSUxFUl9DWFgsIHdoaWNoIHJlc29sdmVzIGFzIFwiJG5ld19wYXRoXCIsIGlzIGludmFsaWQuIiA+JjY7fQorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBOZWl0aGVyIFwiJG5ld19wYXRoXCIgbm9yIFwiJG5ld19wYXRoLmV4ZS9jbWRcIiBjYW4gYmUgZm91bmQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogTmVpdGhlciBcIiRuZXdfcGF0aFwiIG5vciBcIiRuZXdfcGF0aC5leGUvY21kXCIgY2FuIGJlIGZvdW5kIiA+JjY7fQorICAgICAgYXNfZm5fZXJyb3IgJD8gIkNhbm5vdCBsb2NhdGUgdGhlIHRoZSBwYXRoIG9mIFBST1BFUl9DT01QSUxFUl9DWFgiICIkTElORU5PIiA1CiAgICAgZmkKLSAgICBpZiB0ZXN0ICJ4JGNkciIgIT0geEVPTDsgdGhlbgotICAgICAgICBDQz0iJGNhciAke2NkciUgKn0iCisgIGVsc2UKKyAgICBpbnB1dF90b19zaG9ydHBhdGg9IiRuZXdfcGF0aCIKKyAgZmkKKworICAjIENhbGwgaGVscGVyIGZ1bmN0aW9uIHdoaWNoIHBvc3NpYmx5IGNvbnZlcnRzIHRoaXMgdXNpbmcgRE9TLXN0eWxlIHNob3J0IG1vZGUuCisgICMgSWYgc28sIHRoZSB1cGRhdGVkIHBhdGggaXMgc3RvcmVkIGluICRuZXdfcGF0aC4KKyAgbmV3X3BhdGg9IiRpbnB1dF90b19zaG9ydHBhdGgiCisKKyAgaW5wdXRfcGF0aD0iJGlucHV0X3RvX3Nob3J0cGF0aCIKKyAgIyBDaGVjayBpZiB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhpcyB1c2luZyBET1Mtc3R5bGUgc2hvcnQgbW9kZS4gSWYgdGhlIHBhdGgKKyAgIyBjb250YWlucyBqdXN0IHNpbXBsZSBjaGFyYWN0ZXJzLCB1c2UgaXQuIE90aGVyd2lzZSAoc3BhY2VzLCB3ZWlyZCBjaGFyYWN0ZXJzKSwKKyAgIyB0YWtlIG5vIGNoYW5jZXMgYW5kIHJld3JpdGUgaXQuCisgICMgTm90ZTogbTQgZWF0cyBvdXIgW10sIHNvIHdlIG5lZWQgdG8gdXNlIFsgYW5kIF0gaW5zdGVhZC4KKyAgaGFzX2ZvcmJpZGRlbl9jaGFycz1gJEVDSE8gIiRpbnB1dF9wYXRoIiB8ICRHUkVQIFteLS5fL2EtekEtWjAtOV1gCisgIGlmIHRlc3QgIngkaGFzX2ZvcmJpZGRlbl9jaGFycyIgIT0geDsgdGhlbgorICAgICMgTm93IGNvbnZlcnQgaXQgdG8gbWl4ZWQgRE9TLXN0eWxlLCBzaG9ydCBtb2RlIChubyBzcGFjZXMsIGFuZCAvIGluc3RlYWQgb2YgXCkKKyAgICBzaG9ydG1vZGVfcGF0aD1gJENZR1BBVEggLXMgLW0gLWEgIiRpbnB1dF9wYXRoImAKKyAgICBwYXRoX2FmdGVyX3Nob3J0bW9kZT1gJENZR1BBVEggLXUgIiRzaG9ydG1vZGVfcGF0aCJgCisgICAgaWYgdGVzdCAieCRwYXRoX2FmdGVyX3Nob3J0bW9kZSIgIT0gIngkaW5wdXRfdG9fc2hvcnRwYXRoIjsgdGhlbgorICAgICAgIyBHb2luZyB0byBzaG9ydCBtb2RlIGFuZCBiYWNrIGFnYWluIGRpZCBpbmRlZWQgbWF0dGVyLiBTaW5jZSBzaG9ydCBtb2RlIGlzCisgICAgICAjIGNhc2UgaW5zZW5zaXRpdmUsIGxldCdzIG1ha2UgaXQgbG93ZXJjYXNlIHRvIGltcHJvdmUgcmVhZGFiaWxpdHkuCisgICAgICBzaG9ydG1vZGVfcGF0aD1gJEVDSE8gIiRzaG9ydG1vZGVfcGF0aCIgfCAkVFIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAorICAgICAgIyBOb3cgY29udmVydCBpdCBiYWNrIHRvIFVuaXgtc3RpbGUgKGN5Z3BhdGgpCisgICAgICBpbnB1dF9wYXRoPWAkQ1lHUEFUSCAtdSAiJHNob3J0bW9kZV9wYXRoImAKKyAgICAgIG5ld19wYXRoPSIkaW5wdXRfcGF0aCIKKyAgICBmaQorICBmaQorCisgIHRlc3RfY3lnZHJpdmVfcHJlZml4PWAkRUNITyAkaW5wdXRfcGF0aCB8ICRHUkVQIF4vY3lnZHJpdmUvYAorICBpZiB0ZXN0ICJ4JHRlc3RfY3lnZHJpdmVfcHJlZml4IiA9IHg7IHRoZW4KKyAgICAjIEFzIGEgc2ltcGxlIGZpeCwgZXhjbHVkZSAvdXNyL2JpbiBzaW5jZSBpdCdzIG5vdCBhIHJlYWwgcGF0aC4KKyAgICBpZiB0ZXN0ICJ4YCRFQ0hPICRpbnB1dF90b19zaG9ydHBhdGggfCAkR1JFUCBeL3Vzci9iaW4vYCIgPSB4OyB0aGVuCisgICAgICAjIFRoZSBwYXRoIGlzIGluIGEgQ3lnd2luIHNwZWNpYWwgZGlyZWN0b3J5IChlLmcuIC9ob21lKS4gV2UgbmVlZCB0aGlzIGNvbnZlcnRlZCB0bworICAgICAgIyBhIHBhdGggcHJlZml4ZWQgYnkgL2N5Z2RyaXZlIGZvciBmaXhwYXRoIHRvIHdvcmsuCisgICAgICBuZXdfcGF0aD0iJENZR1dJTl9ST09UX1BBVEgkaW5wdXRfcGF0aCIKKyAgICBmaQorICBmaQorCisgICMgcmVtb3ZlIHRyYWlsaW5nIC5leGUgaWYgYW55CisgIG5ld19wYXRoPSIke25ld19wYXRoLyUuZXhlL30iCisKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorCisgICMgRmlyc3Qgc2VwYXJhdGUgdGhlIHBhdGggZnJvbSB0aGUgYXJndW1lbnRzLiBUaGlzIHdpbGwgc3BsaXQgYXQgdGhlIGZpcnN0CisgICMgc3BhY2UuCisgIGNvbXBsZXRlPSIkUFJPUEVSX0NPTVBJTEVSX0NYWCIKKyAgcGF0aD0iJHtjb21wbGV0ZSUlICp9IgorICB0bXA9IiRjb21wbGV0ZSBFT0wiCisgIGFyZ3VtZW50cz0iJHt0bXAjKiB9IgorCisgICMgSW5wdXQgbWlnaHQgYmUgZ2l2ZW4gYXMgV2luZG93cyBmb3JtYXQsIHN0YXJ0IGJ5IGNvbnZlcnRpbmcgdG8KKyAgIyB1bml4IGZvcm1hdC4KKyAgbmV3X3BhdGg9IiRwYXRoIgorCisgIHdpbmRvd3NfcGF0aD0iJG5ld19wYXRoIgorICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5jeWd3aW4iOyB0aGVuCisgICAgdW5peF9wYXRoPWAkQ1lHUEFUSCAtdSAiJHdpbmRvd3NfcGF0aCJgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGVsaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MubXN5cyI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRFQ0hPICIkd2luZG93c19wYXRoIiB8ICRTRUQgLWUgJ3MsXlxcKC5cXCk6LC9cXDEsZycgLWUgJ3MsXFxcXCwvLGcnYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBmaQorCisKKyAgIyBOb3cgdHJ5IHRvIGxvY2F0ZSBleGVjdXRhYmxlIHVzaW5nIHdoaWNoCisgIG5ld19wYXRoPWAkV0hJQ0ggIiRuZXdfcGF0aCIgMj4gL2Rldi9udWxsYAorCisgIGlmIHRlc3QgIngkbmV3X3BhdGgiID0geDsgdGhlbgorICAgICMgT29wcy4gV2hpY2ggZGlkbid0IGZpbmQgdGhlIGV4ZWN1dGFibGUuCisgICAgIyBUaGUgc3BsaXR0aW5nIG9mIGFyZ3VtZW50cyBmcm9tIHRoZSBleGVjdXRhYmxlIGF0IGEgc3BhY2UgbWlnaHQgaGF2ZSBiZWVuIGluY29ycmVjdCwKKyAgICAjIHNpbmNlIHBhdGhzIHdpdGggc3BhY2UgYXJlIG1vcmUgbGlrZWx5IGluIFdpbmRvd3MuIEdpdmUgaXQgYW5vdGhlciB0cnkgd2l0aCB0aGUgd2hvbGUKKyAgICAjIGFyZ3VtZW50LgorICAgIHBhdGg9IiRjb21wbGV0ZSIKKyAgICBhcmd1bWVudHM9IkVPTCIKKyAgICBuZXdfcGF0aD0iJHBhdGgiCisKKyAgd2luZG93c19wYXRoPSIkbmV3X3BhdGgiCisgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLmN5Z3dpbiI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRDWUdQQVRIIC11ICIkd2luZG93c19wYXRoImAKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJEVDSE8gIiR3aW5kb3dzX3BhdGgiIHwgJFNFRCAtZSAncyxeXFwoLlxcKTosL1xcMSxnJyAtZSAncyxcXFxcLC8sZydgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGZpCisKKworICAgIG5ld19wYXRoPWAkV0hJQ0ggIiRuZXdfcGF0aCIgMj4gL2Rldi9udWxsYAorCisgICAgaWYgdGVzdCAieCRuZXdfcGF0aCIgPSB4OyB0aGVuCisgICAgICAjIEl0J3Mgc3RpbGwgbm90IGZvdW5kLiBOb3cgdGhpcyBpcyBhbiB1bnJlY292ZXJhYmxlIGVycm9yLgorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUaGUgcGF0aCBvZiBQUk9QRVJfQ09NUElMRVJfQ1hYLCB3aGljaCByZXNvbHZlcyBhcyBcIiRjb21wbGV0ZVwiLCBpcyBub3QgZm91bmQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoZSBwYXRoIG9mIFBST1BFUl9DT01QSUxFUl9DWFgsIHdoaWNoIHJlc29sdmVzIGFzIFwiJGNvbXBsZXRlXCIsIGlzIG5vdCBmb3VuZC4iID4mNjt9CisgICAgICBoYXNfc3BhY2U9YCRFQ0hPICIkY29tcGxldGUiIHwgJEdSRVAgIiAiYAorICAgICAgaWYgdGVzdCAieCRoYXNfc3BhY2UiICE9IHg7IHRoZW4KKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBZb3UgbWlnaHQgYmUgbWl4aW5nIHNwYWNlcyBpbiB0aGUgcGF0aCBhbmQgZXh0cmEgYXJndW1lbnRzLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogWW91IG1pZ2h0IGJlIG1peGluZyBzcGFjZXMgaW4gdGhlIHBhdGggYW5kIGV4dHJhIGFyZ3VtZW50cywgd2hpY2ggaXMgbm90IGFsbG93ZWQuIiA+JjY7fQorICAgICAgZmkKKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJDYW5ub3QgbG9jYXRlIHRoZSB0aGUgcGF0aCBvZiBQUk9QRVJfQ09NUElMRVJfQ1hYIiAiJExJTkVOTyIgNQorICAgIGZpCisgIGZpCisKKyAgIyBOb3cgbmV3X3BhdGggaGFzIGEgY29tcGxldGUgdW5peCBwYXRoIHRvIHRoZSBiaW5hcnkKKyAgaWYgdGVzdCAieGAkRUNITyAkbmV3X3BhdGggfCAkR1JFUCBeL2Jpbi9gIiAhPSB4OyB0aGVuCisgICAgIyBLZWVwIHBhdGhzIGluIC9iaW4gYXMtaXMsIGJ1dCByZW1vdmUgdHJhaWxpbmcgLmV4ZSBpZiBhbnkKKyAgICBuZXdfcGF0aD0iJHtuZXdfcGF0aC8lLmV4ZS99IgorICAgICMgRG8gbm90IHNhdmUgL2JpbiBwYXRocyB0byBhbGxfZml4cGF0aF9wcmVmaXhlcyEKKyAgZWxzZQorICAgICMgTm90IGluIG1peGVkIG9yIFdpbmRvd3Mgc3R5bGUsIHN0YXJ0IGJ5IHRoYXQuCisgICAgbmV3X3BhdGg9YGNtZCAvL2MgZWNobyAkbmV3X3BhdGhgCisKKyAgaW5wdXRfcGF0aD0iJG5ld19wYXRoIgorICAjIENoZWNrIGlmIHdlIG5lZWQgdG8gY29udmVydCB0aGlzIHVzaW5nIERPUy1zdHlsZSBzaG9ydCBtb2RlLiBJZiB0aGUgcGF0aAorICAjIGNvbnRhaW5zIGp1c3Qgc2ltcGxlIGNoYXJhY3RlcnMsIHVzZSBpdC4gT3RoZXJ3aXNlIChzcGFjZXMsIHdlaXJkIGNoYXJhY3RlcnMpLAorICAjIHRha2Ugbm8gY2hhbmNlcyBhbmQgcmV3cml0ZSBpdC4KKyAgIyBOb3RlOiBtNCBlYXRzIG91ciBbXSwgc28gd2UgbmVlZCB0byB1c2UgWyBhbmQgXSBpbnN0ZWFkLgorICBoYXNfZm9yYmlkZGVuX2NoYXJzPWAkRUNITyAiJGlucHV0X3BhdGgiIHwgJEdSRVAgW14tXy86YS16QS1aMC05XWAKKyAgaWYgdGVzdCAieCRoYXNfZm9yYmlkZGVuX2NoYXJzIiAhPSB4OyB0aGVuCisgICAgIyBOb3cgY29udmVydCBpdCB0byBtaXhlZCBET1Mtc3R5bGUsIHNob3J0IG1vZGUgKG5vIHNwYWNlcywgYW5kIC8gaW5zdGVhZCBvZiBcKQorICAgIG5ld19wYXRoPWBjbWQgL2MgImZvciAlQSBpbiAoXCIkaW5wdXRfcGF0aFwiKSBkbyBAZWNobyAlfnNBInwkVFIgXFxcXFxcXFwgLyB8ICRUUiAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidgCisgIGZpCisKKyAgICAjIE91dHB1dCBpcyBpbiAkbmV3X3BhdGgKKworICB3aW5kb3dzX3BhdGg9IiRuZXdfcGF0aCIKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJENZR1BBVEggLXUgIiR3aW5kb3dzX3BhdGgiYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBlbGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLm1zeXMiOyB0aGVuCisgICAgdW5peF9wYXRoPWAkRUNITyAiJHdpbmRvd3NfcGF0aCIgfCAkU0VEIC1lICdzLF5cXCguXFwpOiwvXFwxLGcnIC1lICdzLFxcXFwsLyxnJ2AKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZmkKKworICAgICMgcmVtb3ZlIHRyYWlsaW5nIC5leGUgaWYgYW55CisgICAgbmV3X3BhdGg9IiR7bmV3X3BhdGgvJS5leGUvfSIKKworICAgICMgU2F2ZSB0aGUgZmlyc3QgMTAgYnl0ZXMgb2YgdGhpcyBwYXRoIHRvIHRoZSBzdG9yYWdlLCBzbyBmaXhwYXRoIGNhbiB3b3JrLgorICAgIGFsbF9maXhwYXRoX3ByZWZpeGVzPSgiJHthbGxfZml4cGF0aF9wcmVmaXhlc1tAXX0iICIke25ld19wYXRoOjA6MTB9IikKKyAgZmkKKworICBlbHNlCisgICAgIyBXZSdyZSBvbiBhIHBvc2l4IHBsYXRmb3JtLiBIb29yYXkhIDopCisgICAgIyBGaXJzdCBzZXBhcmF0ZSB0aGUgcGF0aCBmcm9tIHRoZSBhcmd1bWVudHMuIFRoaXMgd2lsbCBzcGxpdCBhdCB0aGUgZmlyc3QKKyAgICAjIHNwYWNlLgorICAgIGNvbXBsZXRlPSIkUFJPUEVSX0NPTVBJTEVSX0NYWCIKKyAgICBwYXRoPSIke2NvbXBsZXRlJSUgKn0iCisgICAgdG1wPSIkY29tcGxldGUgRU9MIgorICAgIGFyZ3VtZW50cz0iJHt0bXAjKiB9IgorCisgICAgbmV3X3BhdGg9YCRXSElDSCAkcGF0aCAyPiAvZGV2L251bGxgCisgICAgaWYgdGVzdCAieCRuZXdfcGF0aCIgPSB4OyB0aGVuCisgICAgICBpc19hYnNvbHV0ZV9wYXRoPWAkRUNITyAiJHBhdGgiIHwgJEdSRVAgXi9gCisgICAgICBpZiB0ZXN0ICJ4JGlzX2Fic29sdXRlX3BhdGgiICE9IHg7IHRoZW4KKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBSZXNvbHZpbmcgUFJPUEVSX0NPTVBJTEVSX0NYWCAoYXMgJHBhdGgpIHdpdGggJ3doaWNoJyBmYWlsZWQsIHVzaW5nICRwYXRoIGRpcmVjdGx5LiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBSZXNvbHZpbmcgUFJPUEVSX0NPTVBJTEVSX0NYWCAoYXMgJHBhdGgpIHdpdGggJ3doaWNoJyBmYWlsZWQsIHVzaW5nICRwYXRoIGRpcmVjdGx5LiIgPiY2O30KKyAgICAgICAgbmV3X3BhdGg9IiRwYXRoIgorICAgICAgZWxzZQorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSBwYXRoIG9mIFBST1BFUl9DT01QSUxFUl9DWFgsIHdoaWNoIHJlc29sdmVzIGFzIFwiJGNvbXBsZXRlXCIsIGlzIG5vdCBmb3VuZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhlIHBhdGggb2YgUFJPUEVSX0NPTVBJTEVSX0NYWCwgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkY29tcGxldGVcIiwgaXMgbm90IGZvdW5kLiIgPiY2O30KKyAgICAgICAgaGFzX3NwYWNlPWAkRUNITyAiJGNvbXBsZXRlIiB8ICRHUkVQICIgImAKKyAgICAgICAgaWYgdGVzdCAieCRoYXNfc3BhY2UiICE9IHg7IHRoZW4KKyAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoaXMgbWlnaHQgYmUgY2F1c2VkIGJ5IHNwYWNlcyBpbiB0aGUgcGF0aCwgd2hpY2ggaXMgbm90IGFsbG93ZWQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoaXMgbWlnaHQgYmUgY2F1c2VkIGJ5IHNwYWNlcyBpbiB0aGUgcGF0aCwgd2hpY2ggaXMgbm90IGFsbG93ZWQuIiA+JjY7fQorICAgICAgICBmaQorICAgICAgICBhc19mbl9lcnJvciAkPyAiQ2Fubm90IGxvY2F0ZSB0aGUgdGhlIHBhdGggb2YgUFJPUEVSX0NPTVBJTEVSX0NYWCIgIiRMSU5FTk8iIDUKKyAgICAgIGZpCisgICAgZmkKKyAgZmkKKworICAjIE5vdyBqb2luIHRvZ2V0aGVyIHRoZSBwYXRoIGFuZCB0aGUgYXJndW1lbnRzIG9uY2UgYWdhaW4KKyAgaWYgdGVzdCAieCRhcmd1bWVudHMiICE9IHhFT0w7IHRoZW4KKyAgICAgIG5ld19jb21wbGV0ZT0iJG5ld19wYXRoICR7YXJndW1lbnRzJSAqfSIKKyAgZWxzZQorICAgICAgbmV3X2NvbXBsZXRlPSIkbmV3X3BhdGgiCisgIGZpCisKKyAgaWYgdGVzdCAieCRjb21wbGV0ZSIgIT0gIngkbmV3X2NvbXBsZXRlIjsgdGhlbgorICAgIFBST1BFUl9DT01QSUxFUl9DWFg9IiRuZXdfY29tcGxldGUiCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBSZXdyaXRpbmcgUFJPUEVSX0NPTVBJTEVSX0NYWCB0byBcIiRuZXdfY29tcGxldGVcIiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBSZXdyaXRpbmcgUFJPUEVSX0NPTVBJTEVSX0NYWCB0byBcIiRuZXdfY29tcGxldGVcIiIgPiY2O30KKyAgZmkKKworICAgIFBBVEg9IiRSRVRSWV9DT01QSUxFUl9TQVZFRF9QQVRIIgorCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgcmVzb2x2ZWQgc3ltYm9saWMgbGlua3MgZm9yIENYWCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgcmVzb2x2ZWQgc3ltYm9saWMgbGlua3MgZm9yIENYWC4uLiAiID4mNjsgfQorCisgICAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TIiAhPSB4d2luZG93czsgdGhlbgorICAgICAgICAjIEZvbGxvdyBhIGNoYWluIG9mIHN5bWJvbGljIGxpbmtzLiBVc2UgcmVhZGxpbmsKKyAgICAgICAgIyB3aGVyZSBpdCBleGlzdHMsIGVsc2UgZmFsbCBiYWNrIHRvIGhvcnJpYmx5CisgICAgICAgICMgY29tcGxpY2F0ZWQgc2hlbGwgY29kZS4KKyAgICAgICAgaWYgdGVzdCAieCRSRUFETElOS19URVNURUQiICE9IHllczsgdGhlbgorICAgICAgICAgICAgIyBPbiBNYWNPU1ggdGhlcmUgaXMgYSByZWFkbGluayB0b29sIHdpdGggYSBkaWZmZXJlbnQKKyAgICAgICAgICAgICMgcHVycG9zZSB0aGFuIHRoZSBHTlUgcmVhZGxpbmsgdG9vbC4gQ2hlY2sgdGhlIGZvdW5kIHJlYWRsaW5rLgorICAgICAgICAgICAgSVNHTlU9YCRSRUFETElOSyAtLWhlbHAgMj4mMSB8ICRHUkVQIEdOVWAKKyAgICAgICAgICAgIGlmIHRlc3QgIngkSVNHTlUiID0geDsgdGhlbgorICAgICAgICAgICAgICAgICAjIEEgcmVhZGxpbmsgdGhhdCB3ZSBkbyBub3Qga25vdyBob3cgdG8gdXNlLgorICAgICAgICAgICAgICAgICAjIEFyZSB0aGVyZSBvdGhlciBub24tR05VIHJlYWRsaW5rcyBvdXQgdGhlcmU/CisgICAgICAgICAgICAgICAgIFJFQURMSU5LX1RFU1RFRD15ZXMKKyAgICAgICAgICAgICAgICAgUkVBRExJTks9CisgICAgICAgICAgICBmaQorICAgICAgICBmaQorCisgICAgICAgIGlmIHRlc3QgIngkUkVBRExJTksiICE9IHg7IHRoZW4KKyAgICAgICAgICAgIFBST1BFUl9DT01QSUxFUl9DWFg9YCRSRUFETElOSyAtZiAkUFJPUEVSX0NPTVBJTEVSX0NYWGAKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgU1RBUlRESVI9JFBXRAorICAgICAgICAgICAgQ09VTlRFUj0wCisgICAgICAgICAgICBzeW1fbGlua19kaXI9YCRESVJOQU1FICRQUk9QRVJfQ09NUElMRVJfQ1hYYAorICAgICAgICAgICAgc3ltX2xpbmtfZmlsZT1gJEJBU0VOQU1FICRQUk9QRVJfQ09NUElMRVJfQ1hYYAorICAgICAgICAgICAgd2hpbGUgdGVzdCAkQ09VTlRFUiAtbHQgMjA7IGRvCisgICAgICAgICAgICAgICAgSVNMSU5LPWAkTFMgLWwgJHN5bV9saW5rX2Rpci8kc3ltX2xpbmtfZmlsZSB8ICRHUkVQICdcLT4nIHwgJFNFRCAtZSAncy8uKi0+IFwoLipcKS9cMS8nYAorICAgICAgICAgICAgICAgIGlmIHRlc3QgIngkSVNMSU5LIiA9PSB4OyB0aGVuCisgICAgICAgICAgICAgICAgICAgICMgVGhpcyBpcyBub3QgYSBzeW1ib2xpYyBsaW5rISBXZSBhcmUgZG9uZSEKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICMgVGhlIGxpbmsgbWlnaHQgYmUgcmVsYXRpdmUhIFdlIGhhdmUgdG8gdXNlIGNkIHRvIHRyYXZlbCBzYWZlbHkuCisgICAgICAgICAgICAgICAgY2QgJHN5bV9saW5rX2RpcgorICAgICAgICAgICAgICAgICMgLi4uIGFuZCB3ZSBtdXN0IGdldCB0aGUgdG8gdGhlIGFic29sdXRlIHBhdGgsIG5vdCBvbmUgdXNpbmcgc3ltYm9saWMgbGlua3MuCisgICAgICAgICAgICAgICAgY2QgYHB3ZCAtUGAKKyAgICAgICAgICAgICAgICBjZCBgJERJUk5BTUUgJElTTElOS2AKKyAgICAgICAgICAgICAgICBzeW1fbGlua19kaXI9YCRUSEVQV0RDTURgCisgICAgICAgICAgICAgICAgc3ltX2xpbmtfZmlsZT1gJEJBU0VOQU1FICRJU0xJTktgCisgICAgICAgICAgICAgICAgbGV0IENPVU5URVI9Q09VTlRFUisxCisgICAgICAgICAgICBkb25lCisgICAgICAgICAgICBjZCAkU1RBUlRESVIKKyAgICAgICAgICAgIFBST1BFUl9DT01QSUxFUl9DWFg9JHN5bV9saW5rX2Rpci8kc3ltX2xpbmtfZmlsZQorICAgICAgICBmaQorICAgIGZpCisKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFBST1BFUl9DT01QSUxFUl9DWFgiID4mNQorJGFzX2VjaG8gIiRQUk9QRVJfQ09NUElMRVJfQ1hYIiA+JjY7IH0KKyAgICBDWFg9IiRQUk9QRVJfQ09NUElMRVJfQ1hYIgorICBlbHNlCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vLCBrZWVwaW5nIENYWCIgPiY1CiskYXNfZWNobyAibm8sIGtlZXBpbmcgQ1hYIiA+JjY7IH0KKyAgICBDWFg9IiRURVNUX0NPTVBJTEVSIgorICBmaQorCisgIENPTVBJTEVSPSRDWFgKKyAgQ09NUElMRVJfTkFNRT0kQ09NUElMRVJfTkFNRQorCisgIGlmIHRlc3QgIngkT1BFTkpES19UQVJHRVRfT1MiID0geHNvbGFyaXM7IHRoZW4KKyAgICAjIE1ha2Ugc3VyZSB3ZSB1c2UgdGhlIFN1biBTdHVkaW8gY29tcGlsZXIgYW5kIG5vdCBnY2Mgb24gU29sYXJpcywgd2hpY2ggd29uJ3Qgd29yaworICAgIENPTVBJTEVSX1ZFUlNJT05fVEVTVD1gJENPTVBJTEVSIC1WIDI+JjEgfCAkSEVBRCAtbiAxYAorICAgICRFQ0hPICRDT01QSUxFUl9WRVJTSU9OX1RFU1QgfCAkR1JFUCAiXi4qOiBTdW4gJENPTVBJTEVSX05BTUUiID4gL2Rldi9udWxsCisgICAgaWYgdGVzdCAkPyAtbmUgMDsgdGhlbgorICAgICAgR0NDX1ZFUlNJT05fVEVTVD1gJENPTVBJTEVSIC0tdmVyc2lvbiAyPiYxIHwgJEhFQUQgLW4gMWAKKworICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUaGUgJENPTVBJTEVSX05BTUUgY29tcGlsZXIgKGxvY2F0ZWQgYXMgJENPTVBJTEVSKSBkb2VzIG5vdCBzZWVtIHRvIGJlIHRoZSByZXF1aXJlZCBTdW4gU3R1ZGlvIGNvbXBpbGVyLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUaGUgJENPTVBJTEVSX05BTUUgY29tcGlsZXIgKGxvY2F0ZWQgYXMgJENPTVBJTEVSKSBkb2VzIG5vdCBzZWVtIHRvIGJlIHRoZSByZXF1aXJlZCBTdW4gU3R1ZGlvIGNvbXBpbGVyLiIgPiY2O30KKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGhlIHJlc3VsdCBmcm9tIHJ1bm5pbmcgd2l0aCAtViB3YXM6IFwiJENPTVBJTEVSX1ZFUlNJT05fVEVTVFwiIGFuZCB3aXRoIC0tdmVyc2lvbjogXCIkR0NDX1ZFUlNJT05fVEVTVFwiIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoZSByZXN1bHQgZnJvbSBydW5uaW5nIHdpdGggLVYgd2FzOiBcIiRDT01QSUxFUl9WRVJTSU9OX1RFU1RcIiBhbmQgd2l0aCAtLXZlcnNpb246IFwiJEdDQ19WRVJTSU9OX1RFU1RcIiIgPiY2O30KKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJTdW4gU3R1ZGlvIGNvbXBpbGVyIGlzIHJlcXVpcmVkLiBUcnkgc2V0dGluZyAtLXdpdGgtdG9vbHMtZGlyLiIgIiRMSU5FTk8iIDUKICAgICBlbHNlCi0gICAgICAgIENDPSIkY2FyIgorICAgICAgQ09NUElMRVJfVkVSU0lPTj1gJEVDSE8gJENPTVBJTEVSX1ZFUlNJT05fVEVTVCB8ICRTRUQgLW4gInMvXi4qWyAsXHRdJENPTVBJTEVSX05BTUVbICxcdF1cKFsxLTldXC5bMC05XVswLTldKlwpLiovXDEvcCJgCisgICAgICBDT01QSUxFUl9WRU5ET1I9IlN1biBTdHVkaW8iCisgICAgZmkKKyAgZWxpZiB0ZXN0ICAieCRPUEVOSkRLX1RBUkdFVF9PUyIgPSB4d2luZG93czsgdGhlbgorICAgICMgRmlyc3QgbGluZSB0eXBpY2FsbHkgbG9va3Mgc29tZXRoaW5nIGxpa2U6CisgICAgIyBNaWNyb3NvZnQgKFIpIDMyLWJpdCBDL0MrKyBPcHRpbWl6aW5nIENvbXBpbGVyIFZlcnNpb24gMTYuMDAuMzAzMTkuMDEgZm9yIDgweDg2CisgICAgQ09NUElMRVJfVkVSU0lPTl9URVNUPWAkQ09NUElMRVIgMj4mMSB8ICRIRUFEIC1uIDFgCisgICAgQ09NUElMRVJfVkVSU0lPTj1gJEVDSE8gJENPTVBJTEVSX1ZFUlNJT05fVEVTVCB8ICRTRUQgLW4gInMvXi4qVmVyc2lvbiBcKFsxLTldWzAtOS5dKlwpIC4qL1wxL3AiYAorICAgIENPTVBJTEVSX1ZFTkRPUj0iTWljcm9zb2Z0IENMLkVYRSIKKyAgICBDT01QSUxFUl9DUFVfVEVTVD1gJEVDSE8gJENPTVBJTEVSX1ZFUlNJT05fVEVTVCB8ICRTRUQgLW4gInMvXi4qIGZvciBcKC4qXCkkL1wxL3AiYAorICAgIGlmIHRlc3QgIngkT1BFTkpES19UQVJHRVRfQ1BVIiA9ICJ4eDg2IjsgdGhlbgorICAgICAgaWYgdGVzdCAieCRDT01QSUxFUl9DUFVfVEVTVCIgIT0gIng4MHg4NiI7IHRoZW4KKyAgICAgICAgYXNfZm5fZXJyb3IgJD8gIlRhcmdldCBDUFUgbWlzbWF0Y2guIFdlIGFyZSBidWlsZGluZyBmb3IgJE9QRU5KREtfVEFSR0VUX0NQVSBidXQgQ0wgaXMgZm9yIFwiJENPTVBJTEVSX0NQVV9URVNUXCI7IGV4cGVjdGVkIFwiODB4ODZcIi4iICIkTElORU5PIiA1CisgICAgICBmaQorICAgIGVsaWYgdGVzdCAieCRPUEVOSkRLX1RBUkdFVF9DUFUiID0gInh4ODZfNjQiOyB0aGVuCisgICAgICBpZiB0ZXN0ICJ4JENPTVBJTEVSX0NQVV9URVNUIiAhPSAieHg2NCI7IHRoZW4KKyAgICAgICAgYXNfZm5fZXJyb3IgJD8gIlRhcmdldCBDUFUgbWlzbWF0Y2guIFdlIGFyZSBidWlsZGluZyBmb3IgJE9QRU5KREtfVEFSR0VUX0NQVSBidXQgQ0wgaXMgZm9yIFwiJENPTVBJTEVSX0NQVV9URVNUXCI7IGV4cGVjdGVkIFwieDY0XCIuIiAiJExJTkVOTyIgNQorICAgICAgZmkKKyAgICBmaQorICBlbHNlCisgICAgQ09NUElMRVJfVkVSU0lPTl9URVNUPWAkQ09NUElMRVIgLS12ZXJzaW9uIDI+JjEgfCAkSEVBRCAtbiAxYAorICAgICMgQ2hlY2sgdGhhdCB0aGlzIGlzIGxpa2VseSB0byBiZSBHQ0MuCisgICAgJENPTVBJTEVSIC0tdmVyc2lvbiAyPiYxIHwgJEdSRVAgIkZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiIgPiAvZGV2L251bGwKKyAgICBpZiB0ZXN0ICQ/IC1uZSAwOyB0aGVuCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSAkQ09NUElMRVJfTkFNRSBjb21waWxlciAobG9jYXRlZCBhcyAkQ09NUElMRVIpIGRvZXMgbm90IHNlZW0gdG8gYmUgdGhlIHJlcXVpcmVkIEdDQyBjb21waWxlci4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhlICRDT01QSUxFUl9OQU1FIGNvbXBpbGVyIChsb2NhdGVkIGFzICRDT01QSUxFUikgZG9lcyBub3Qgc2VlbSB0byBiZSB0aGUgcmVxdWlyZWQgR0NDIGNvbXBpbGVyLiIgPiY2O30KKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGhlIHJlc3VsdCBmcm9tIHJ1bm5pbmcgd2l0aCAtLXZlcnNpb24gd2FzOiBcIiRDT01QSUxFUl9WRVJTSU9OX1RFU1RcIiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUaGUgcmVzdWx0IGZyb20gcnVubmluZyB3aXRoIC0tdmVyc2lvbiB3YXM6IFwiJENPTVBJTEVSX1ZFUlNJT05fVEVTVFwiIiA+JjY7fQorICAgICAgYXNfZm5fZXJyb3IgJD8gIkdDQyBjb21waWxlciBpcyByZXF1aXJlZC4gVHJ5IHNldHRpbmcgLS13aXRoLXRvb2xzLWRpci4iICIkTElORU5PIiA1CiAgICAgZmkKIAorICAgICMgRmlyc3QgbGluZSB0eXBpY2FsbHkgbG9va3Mgc29tZXRoaW5nIGxpa2U6CisgICAgIyBnY2MgKFVidW50dS9MaW5hcm8gNC41LjItOHVidW50dTQpIDQuNS4yCisgICAgQ09NUElMRVJfVkVSU0lPTj1gJEVDSE8gJENPTVBJTEVSX1ZFUlNJT05fVEVTVCB8ICRTRUQgLW4gInMvXi4qIFwoWzEtOV1bMC05Ll0qXCkvXDEvcCJgCisgICAgQ09NUElMRVJfVkVORE9SPWAkRUNITyAkQ09NUElMRVJfVkVSU0lPTl9URVNUIHwgJFNFRCAtbiAicy9eXCguKlwpIFsxLTldWzAtOS5dKi9cMS9wImAKKyAgZmkKKyAgIyBUaGlzIHNldHMgQ0NfVkVSU0lPTiBvciBDWFhfVkVSU0lPTi4gKFRoaXMgY29tbWVudCBpcyBhIGdyZXAgbWFya2VyKQorICBDWFhfVkVSU0lPTj0iJENPTVBJTEVSX1ZFUlNJT04iCisgICMgVGhpcyBzZXRzIENDX1ZFTkRPUiBvciBDWFhfVkVORE9SLiAoVGhpcyBjb21tZW50IGlzIGEgZ3JlcCBtYXJrZXIpCisgIENYWF9WRU5ET1I9IiRDT01QSUxFUl9WRU5ET1IiCiAKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBVc2luZyAkQ09NUElMRVJfVkVORE9SICRDT01QSUxFUl9OQU1FIGNvbXBpbGVyIHZlcnNpb24gJENPTVBJTEVSX1ZFUlNJT04gKGxvY2F0ZWQgYXQgJENPTVBJTEVSKSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBVc2luZyAkQ09NUElMRVJfVkVORE9SICRDT01QSUxFUl9OQU1FIGNvbXBpbGVyIHZlcnNpb24gJENPTVBJTEVSX1ZFUlNJT04gKGxvY2F0ZWQgYXQgJENPTVBJTEVSKSIgPiY2O30KKworCisjIE5vdyB0aGF0IHdlIGhhdmUgcmVzb2x2ZWQgQ1hYIG91cnNlbGYsIGxldCBhdXRvY29uZiBoYXZlIGl0J3MgZ28gYXQgaXQKIGFjX2V4dD1jcHAKIGFjX2NwcD0nJENYWENQUCAkQ1BQRkxBR1MnCiBhY19jb21waWxlPSckQ1hYIC1jICRDWFhGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCkBAIC0xMTc4OSw3ICsxOTgzNyw3IEBACiAgICAgQ1hYPSRDQ0MKICAgZWxzZQogICAgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgZm9yIGFjX3Byb2cgaW4gY2wgQ0MgZysrCisgIGZvciBhY19wcm9nIGluICRDWFgKICAgZG8KICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY190b29sX3ByZWZpeCRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KIHNldCBkdW1teSAkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZzsgYWNfd29yZD0kMgpAQCAtMTE4MzMsNyArMTk4ODEsNyBAQAogZmkKIGlmIHRlc3QgLXogIiRDWFgiOyB0aGVuCiAgIGFjX2N0X0NYWD0kQ1hYCi0gIGZvciBhY19wcm9nIGluIGNsIENDIGcrKworICBmb3IgYWNfcHJvZyBpbiAkQ1hYCiBkbwogICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KIHNldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgpAQCAtMTIwMzYsODUgKzIwMDg0LDEwIEBACiBhY19saW5rPSckQ1hYIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ1hYRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwogYWNfY29tcGlsZXJfZ251PSRhY19jdl9jeHhfY29tcGlsZXJfZ251CiAKLWlmIHRlc3QgIngkQ1hYIiA9IHhDQyAmJiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1MiID0geG1hY29zeDsgdGhlbgotICAgICMgVGhlIGZvdW5kIENDLCBldmVuIHRob3VnaCBpdCBzZWVtcyB0byBiZSBhIGcrKyBkZXJpdmF0ZSwgY2Fubm90IGNvbXBpbGUKLSAgICAjIGMrKyBjb2RlLiBPdmVycmlkZS4KLSAgICBDWFg9ImcrKyIKLWZpCiAKLSAgICAjIFRyYW5zbGF0ZSAiZ2NjIC1FIiBpbnRvICJgd2hpY2ggZ2NjYCAtRSIgaWUKLSAgICAjIGV4dHJhY3QgdGhlIGZ1bGwgcGF0aCB0byB0aGUgYmluYXJ5IGFuZCBhdCB0aGUKLSAgICAjIHNhbWUgdGltZSBtYWludGFpbiBhbnkgYXJndW1lbnRzIHBhc3NlZCB0byBpdC4KLSAgICAjIFRoZSBjb21tYW5kIE1VU1QgZXhpc3QgaW4gdGhlIHBhdGgsIG9yIGVsc2UhCi0gICAgdG1wPSIkQ1hYIgotICAgIGNhcj0iJHt0bXAlJSAqfSIKLSAgICB0bXA9IiRDWFggRU9MIgotICAgIGNkcj0iJHt0bXAjKiB9IgotICAgICMgT24gd2luZG93cyB3ZSB3YW50IHBhdGhzIHdpdGhvdXQgc3BhY2VzLgotICAgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PUyIgPSAieHdpbmRvd3MiOyB0aGVuCisjIyMgTG9jYXRlIG90aGVyIHRvb2xzCiAKLSAgICAjIFRyYW5zbGF0ZSBsb25nIGN5Z2RyaXZlIG9yIEM6XHNkZnNmIHBhdGgKLSAgICAjIGludG8gYSBzaG9ydCBtaXhlZCBtb2RlIHBhdGggdGhhdCBoYXMgbm8KLSAgICAjIHNwYWNlcyBpbiBpdC4KLSAgICB0bXA9IiRjYXIiCi0KLSAgICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1MiID0gInh3aW5kb3dzIjsgdGhlbgotICAgICAgICB0bXA9YCRDWUdQQVRIIC11ICIkY2FyImAKLSAgICAgICAgdG1wPWB3aGljaCAiJHRtcCJgCi0gICAgICAgICMgSWYgZmlsZSBleGlzdHMgd2l0aCAuZXhlIGFwcGVuZGVkLCB0aGF0J3MgdGhlIHJlYWwgZmlsZW5hbWUKLSAgICAgICAgIyBhbmQgY3lncGF0aCBuZWVkcyB0aGF0IHRvIGNvbnZlcnQgdG8gc2hvcnQgc3R5bGUgcGF0aC4KLSAgICAgICAgaWYgdGVzdCAtZiAiJHt0bXB9LmV4ZSI7IHRoZW4KLSAgICAgICAgICAgdG1wPSIke3RtcH0uZXhlIgotICAgICAgICBlbGlmIHRlc3QgLWYgIiR7dG1wfS5jbWQiOyB0aGVuCi0gICAgICAgICAgIHRtcD0iJHt0bXB9LmNtZCIKLSAgICAgICAgZmkKLSAgICAgICAgIyBDb252ZXJ0IHRvIEM6LyBtaXhlZCBzdHlsZSBwYXRoIHdpdGhvdXQgc3BhY2VzLgotICAgICAgICAgdG1wPWAkQ1lHUEFUSCAtcyAtbSAiJHRtcCJgCi0gICAgZmkKLSAgICBjYXI9IiR0bXAiCi0KLSAgICBlbHNlCi0gICAgICAgICMgIndoaWNoIiBpcyBub3QgcG9ydGFibGUsIGJ1dCBpcyB1c2VkIGhlcmUKLSAgICAgICAgIyBiZWNhdXNlIHdlIGtub3cgdGhhdCB0aGUgY29tbWFuZCBleGlzdHMhCi0gICAgICAgIGNhcj1gd2hpY2ggJGNhcmAKLSAgICBmaQotICAgIGlmIHRlc3QgIngkY2RyIiAhPSB4RU9MOyB0aGVuCi0gICAgICAgIENYWD0iJGNhciAke2NkciUgKn0iCi0gICAgZWxzZQotICAgICAgICBDWFg9IiRjYXIiCi0gICAgZmkKLQotCi1pZiB0ZXN0ICJ4JENYWCIgPSB4IHx8IHRlc3QgIngkQ0MiID0geDsgdGhlbgotCi0gICAgIyBQcmludCBhIGhlbHBmdWwgbWVzc2FnZSBvbiBob3cgdG8gYWNxdWlyZSB0aGUgbmVjZXNzYXJ5IGJ1aWxkIGRlcGVuZGVuY3kuCi0gICAgIyBkZXZraXQgaXMgdGhlIGhlbHAgdGFnOiBmcmVldHlwMiwgY3VwcywgcHVsc2UsIGFsc2EgZXRjCi0gICAgTUlTU0lOR19ERVBFTkRFTkNZPWRldmtpdAotICAgIFBLR0hBTkRMRVJfQ09NTUFORD0KLQotICAgIGNhc2UgJFBLR0hBTkRMRVIgaW4KLQlhcHQtZ2V0KQotICAgICAgICAgICAgICAgIGFwdF9oZWxwICAgICAkTUlTU0lOR19ERVBFTkRFTkNZIDs7Ci0gICAgeXVtKQotICAgICAgICAgICAgICAgIHl1bV9oZWxwICAgICAkTUlTU0lOR19ERVBFTkRFTkNZIDs7Ci0JcG9ydCkKLSAgICAgICAgICAgICAgICBwb3J0X2hlbHAgICAgJE1JU1NJTkdfREVQRU5ERU5DWSA7OwotCXBrZ3V0aWwpCi0gICAgICAgICAgICAgICAgcGtndXRpbF9oZWxwICRNSVNTSU5HX0RFUEVOREVOQ1kgOzsKLQlwa2dhZGQpCi0gICAgICAgICAgICAgICAgcGtnYWRkX2hlbHAgICRNSVNTSU5HX0RFUEVOREVOQ1kgOzsKLSAgICAqICkKLSAgICAgIGJyZWFrIDs7Ci0gICAgZXNhYwotCi0gICAgaWYgdGVzdCAieCRQS0dIQU5ETEVSX0NPTU1BTkQiICE9IHg7IHRoZW4KLSAgICAgICAgSEVMUF9NU0c9IllvdSBtaWdodCBiZSBhYmxlIHRvIGZpeCB0aGlzIGJ5IHJ1bm5pbmcgJyRQS0dIQU5ETEVSX0NPTU1BTkQnLiIKLSAgICBmaQotCi0gICAgYXNfZm5fZXJyb3IgJD8gIkNvdWxkIG5vdCBmaW5kIHRoZSBuZWVkZWQgY29tcGlsZXJzISAkSEVMUF9NU0cgIiAiJExJTkVOTyIgNQotZmkKLQotaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TIiAhPSB4d2luZG93czsgdGhlbgoraWYgdGVzdCAieCRPUEVOSkRLX1RBUkdFVF9PUyIgPSB4bWFjb3N4OyB0aGVuCiAgICAgYWNfZXh0PW0KIGFjX2NwcD0nJE9CSkNQUCAkQ1BQRkxBR1MnCiBhY19jb21waWxlPSckT0JKQyAtYyAkT0JKQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKQEAgLTEyMzY3LDQ3ICsyMDM0MCwyNDUgQEAKIGFjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY3h4X2NvbXBpbGVyX2dudQogCiAKLSAgICAjIFRyYW5zbGF0ZSAiZ2NjIC1FIiBpbnRvICJgd2hpY2ggZ2NjYCAtRSIgaWUKLSAgICAjIGV4dHJhY3QgdGhlIGZ1bGwgcGF0aCB0byB0aGUgYmluYXJ5IGFuZCBhdCB0aGUKLSAgICAjIHNhbWUgdGltZSBtYWludGFpbiBhbnkgYXJndW1lbnRzIHBhc3NlZCB0byBpdC4KLSAgICAjIFRoZSBjb21tYW5kIE1VU1QgZXhpc3QgaW4gdGhlIHBhdGgsIG9yIGVsc2UhCi0gICAgdG1wPSIkT0JKQyIKLSAgICBjYXI9IiR7dG1wJSUgKn0iCi0gICAgdG1wPSIkT0JKQyBFT0wiCi0gICAgY2RyPSIke3RtcCMqIH0iCi0gICAgIyBPbiB3aW5kb3dzIHdlIHdhbnQgcGF0aHMgd2l0aG91dCBzcGFjZXMuCi0gICAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TIiA9ICJ4d2luZG93cyI7IHRoZW4KKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgogCi0gICAgIyBUcmFuc2xhdGUgbG9uZyBjeWdkcml2ZSBvciBDOlxzZGZzZiBwYXRoCi0gICAgIyBpbnRvIGEgc2hvcnQgbWl4ZWQgbW9kZSBwYXRoIHRoYXQgaGFzIG5vCi0gICAgIyBzcGFjZXMgaW4gaXQuCi0gICAgdG1wPSIkY2FyIgorICAjIEZpcnN0IHNlcGFyYXRlIHRoZSBwYXRoIGZyb20gdGhlIGFyZ3VtZW50cy4gVGhpcyB3aWxsIHNwbGl0IGF0IHRoZSBmaXJzdAorICAjIHNwYWNlLgorICBjb21wbGV0ZT0iJE9CSkMiCisgIHBhdGg9IiR7Y29tcGxldGUlJSAqfSIKKyAgdG1wPSIkY29tcGxldGUgRU9MIgorICBhcmd1bWVudHM9IiR7dG1wIyogfSIKIAotICAgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PUyIgPSAieHdpbmRvd3MiOyB0aGVuCi0gICAgICAgIHRtcD1gJENZR1BBVEggLXUgIiRjYXIiYAotICAgICAgICB0bXA9YHdoaWNoICIkdG1wImAKLSAgICAgICAgIyBJZiBmaWxlIGV4aXN0cyB3aXRoIC5leGUgYXBwZW5kZWQsIHRoYXQncyB0aGUgcmVhbCBmaWxlbmFtZQotICAgICAgICAjIGFuZCBjeWdwYXRoIG5lZWRzIHRoYXQgdG8gY29udmVydCB0byBzaG9ydCBzdHlsZSBwYXRoLgotICAgICAgICBpZiB0ZXN0IC1mICIke3RtcH0uZXhlIjsgdGhlbgotICAgICAgICAgICB0bXA9IiR7dG1wfS5leGUiCi0gICAgICAgIGVsaWYgdGVzdCAtZiAiJHt0bXB9LmNtZCI7IHRoZW4KLSAgICAgICAgICAgdG1wPSIke3RtcH0uY21kIgorICAjIElucHV0IG1pZ2h0IGJlIGdpdmVuIGFzIFdpbmRvd3MgZm9ybWF0LCBzdGFydCBieSBjb252ZXJ0aW5nIHRvCisgICMgdW5peCBmb3JtYXQuCisgIG5ld19wYXRoPWAkQ1lHUEFUSCAtdSAiJHBhdGgiYAorCisgICMgTm93IHRyeSB0byBsb2NhdGUgZXhlY3V0YWJsZSB1c2luZyB3aGljaAorICBuZXdfcGF0aD1gJFdISUNIICIkbmV3X3BhdGgiIDI+IC9kZXYvbnVsbGAKKyAgaWYgdGVzdCAieCRuZXdfcGF0aCIgPSB4OyB0aGVuCisgICAgIyBPb3BzLiBXaGljaCBkaWRuJ3QgZmluZCB0aGUgZXhlY3V0YWJsZS4KKyAgICAjIFRoZSBzcGxpdHRpbmcgb2YgYXJndW1lbnRzIGZyb20gdGhlIGV4ZWN1dGFibGUgYXQgYSBzcGFjZSBtaWdodCBoYXZlIGJlZW4gaW5jb3JyZWN0LAorICAgICMgc2luY2UgcGF0aHMgd2l0aCBzcGFjZSBhcmUgbW9yZSBsaWtlbHkgaW4gV2luZG93cy4gR2l2ZSBpdCBhbm90aGVyIHRyeSB3aXRoIHRoZSB3aG9sZQorICAgICMgYXJndW1lbnQuCisgICAgcGF0aD0iJGNvbXBsZXRlIgorICAgIGFyZ3VtZW50cz0iRU9MIgorICAgIG5ld19wYXRoPWAkQ1lHUEFUSCAtdSAiJHBhdGgiYAorICAgIG5ld19wYXRoPWAkV0hJQ0ggIiRuZXdfcGF0aCIgMj4gL2Rldi9udWxsYAorICAgIGlmIHRlc3QgIngkbmV3X3BhdGgiID0geDsgdGhlbgorICAgICAgIyBJdCdzIHN0aWxsIG5vdCBmb3VuZC4gTm93IHRoaXMgaXMgYW4gdW5yZWNvdmVyYWJsZSBlcnJvci4KKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGhlIHBhdGggb2YgT0JKQywgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkY29tcGxldGVcIiwgaXMgbm90IGZvdW5kLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUaGUgcGF0aCBvZiBPQkpDLCB3aGljaCByZXNvbHZlcyBhcyBcIiRjb21wbGV0ZVwiLCBpcyBub3QgZm91bmQuIiA+JjY7fQorICAgICAgaGFzX3NwYWNlPWAkRUNITyAiJGNvbXBsZXRlIiB8ICRHUkVQICIgImAKKyAgICAgIGlmIHRlc3QgIngkaGFzX3NwYWNlIiAhPSB4OyB0aGVuCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogWW91IG1pZ2h0IGJlIG1peGluZyBzcGFjZXMgaW4gdGhlIHBhdGggYW5kIGV4dHJhIGFyZ3VtZW50cywgd2hpY2ggaXMgbm90IGFsbG93ZWQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFlvdSBtaWdodCBiZSBtaXhpbmcgc3BhY2VzIGluIHRoZSBwYXRoIGFuZCBleHRyYSBhcmd1bWVudHMsIHdoaWNoIGlzIG5vdCBhbGxvd2VkLiIgPiY2O30KKyAgICAgIGZpCisgICAgICBhc19mbl9lcnJvciAkPyAiQ2Fubm90IGxvY2F0ZSB0aGUgdGhlIHBhdGggb2YgT0JKQyIgIiRMSU5FTk8iIDUKKyAgICBmaQorICBmaQorCisgICMgQ3lnd2luIHRyaWVzIHRvIGhpZGUgc29tZSBhc3BlY3RzIG9mIHRoZSBXaW5kb3dzIGZpbGUgc3lzdGVtLCBzdWNoIHRoYXQgYmluYXJpZXMgYXJlCisgICMgbmFtZWQgLmV4ZSBidXQgY2FsbGVkIHdpdGhvdXQgdGhhdCBzdWZmaXguIFRoZXJlZm9yZSwgImZvbyIgYW5kICJmb28uZXhlIiBhcmUgY29uc2lkZXJlZAorICAjIHRoZSBzYW1lIGZpbGUsIG1vc3Qgb2YgdGhlIHRpbWUgKGFzIGluICJ0ZXN0IC1mIikuIEJ1dCBub3Qgd2hlbiBydW5uaW5nIGN5Z3BhdGggLXMsIHRoZW4KKyAgIyAiZm9vLmV4ZSIgaXMgT0sgYnV0ICJmb28iIGlzIGFuIGVycm9yLgorICAjCisgICMgVGhpcyB0ZXN0IGlzIHRoZXJlZm9yZSBzbGlnaHRseSBtb3JlIGFjY3VyYXRlIHRoYW4gInRlc3QgLWYiIHRvIGNoZWNrIGZvciBmaWxlIHByZWNlbnNlLgorICAjIEl0IGlzIGFsc28gYSB3YXkgdG8gbWFrZSBzdXJlIHdlIGdvdCB0aGUgcHJvcGVyIGZpbGUgbmFtZSBmb3IgdGhlIHJlYWwgdGVzdCBsYXRlciBvbi4KKyAgdGVzdF9zaG9ydHBhdGg9YCRDWUdQQVRIIC1zIC1tICIkbmV3X3BhdGgiIDI+IC9kZXYvbnVsbGAKKyAgaWYgdGVzdCAieCR0ZXN0X3Nob3J0cGF0aCIgPSB4OyB0aGVuCisgICAgIyBTaG9ydCBwYXRoIGZhaWxlZCwgZmlsZSBkb2VzIG5vdCBleGlzdCBhcyBzcGVjaWZpZWQuCisgICAgIyBUcnkgYWRkaW5nIC5leGUgb3IgLmNtZAorICAgIGlmIHRlc3QgLWYgIiR7bmV3X3BhdGh9LmV4ZSI7IHRoZW4KKyAgICAgICBpbnB1dF90b19zaG9ydHBhdGg9IiR7bmV3X3BhdGh9LmV4ZSIKKyAgICBlbGlmIHRlc3QgLWYgIiR7bmV3X3BhdGh9LmNtZCI7IHRoZW4KKyAgICAgICBpbnB1dF90b19zaG9ydHBhdGg9IiR7bmV3X3BhdGh9LmNtZCIKKyAgICBlbHNlCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSBwYXRoIG9mIE9CSkMsIHdoaWNoIHJlc29sdmVzIGFzIFwiJG5ld19wYXRoXCIsIGlzIGludmFsaWQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoZSBwYXRoIG9mIE9CSkMsIHdoaWNoIHJlc29sdmVzIGFzIFwiJG5ld19wYXRoXCIsIGlzIGludmFsaWQuIiA+JjY7fQorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBOZWl0aGVyIFwiJG5ld19wYXRoXCIgbm9yIFwiJG5ld19wYXRoLmV4ZS9jbWRcIiBjYW4gYmUgZm91bmQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogTmVpdGhlciBcIiRuZXdfcGF0aFwiIG5vciBcIiRuZXdfcGF0aC5leGUvY21kXCIgY2FuIGJlIGZvdW5kIiA+JjY7fQorICAgICAgYXNfZm5fZXJyb3IgJD8gIkNhbm5vdCBsb2NhdGUgdGhlIHRoZSBwYXRoIG9mIE9CSkMiICIkTElORU5PIiA1CisgICAgZmkKKyAgZWxzZQorICAgIGlucHV0X3RvX3Nob3J0cGF0aD0iJG5ld19wYXRoIgorICBmaQorCisgICMgQ2FsbCBoZWxwZXIgZnVuY3Rpb24gd2hpY2ggcG9zc2libHkgY29udmVydHMgdGhpcyB1c2luZyBET1Mtc3R5bGUgc2hvcnQgbW9kZS4KKyAgIyBJZiBzbywgdGhlIHVwZGF0ZWQgcGF0aCBpcyBzdG9yZWQgaW4gJG5ld19wYXRoLgorICBuZXdfcGF0aD0iJGlucHV0X3RvX3Nob3J0cGF0aCIKKworICBpbnB1dF9wYXRoPSIkaW5wdXRfdG9fc2hvcnRwYXRoIgorICAjIENoZWNrIGlmIHdlIG5lZWQgdG8gY29udmVydCB0aGlzIHVzaW5nIERPUy1zdHlsZSBzaG9ydCBtb2RlLiBJZiB0aGUgcGF0aAorICAjIGNvbnRhaW5zIGp1c3Qgc2ltcGxlIGNoYXJhY3RlcnMsIHVzZSBpdC4gT3RoZXJ3aXNlIChzcGFjZXMsIHdlaXJkIGNoYXJhY3RlcnMpLAorICAjIHRha2Ugbm8gY2hhbmNlcyBhbmQgcmV3cml0ZSBpdC4KKyAgIyBOb3RlOiBtNCBlYXRzIG91ciBbXSwgc28gd2UgbmVlZCB0byB1c2UgWyBhbmQgXSBpbnN0ZWFkLgorICBoYXNfZm9yYmlkZGVuX2NoYXJzPWAkRUNITyAiJGlucHV0X3BhdGgiIHwgJEdSRVAgW14tLl8vYS16QS1aMC05XWAKKyAgaWYgdGVzdCAieCRoYXNfZm9yYmlkZGVuX2NoYXJzIiAhPSB4OyB0aGVuCisgICAgIyBOb3cgY29udmVydCBpdCB0byBtaXhlZCBET1Mtc3R5bGUsIHNob3J0IG1vZGUgKG5vIHNwYWNlcywgYW5kIC8gaW5zdGVhZCBvZiBcKQorICAgIHNob3J0bW9kZV9wYXRoPWAkQ1lHUEFUSCAtcyAtbSAtYSAiJGlucHV0X3BhdGgiYAorICAgIHBhdGhfYWZ0ZXJfc2hvcnRtb2RlPWAkQ1lHUEFUSCAtdSAiJHNob3J0bW9kZV9wYXRoImAKKyAgICBpZiB0ZXN0ICJ4JHBhdGhfYWZ0ZXJfc2hvcnRtb2RlIiAhPSAieCRpbnB1dF90b19zaG9ydHBhdGgiOyB0aGVuCisgICAgICAjIEdvaW5nIHRvIHNob3J0IG1vZGUgYW5kIGJhY2sgYWdhaW4gZGlkIGluZGVlZCBtYXR0ZXIuIFNpbmNlIHNob3J0IG1vZGUgaXMKKyAgICAgICMgY2FzZSBpbnNlbnNpdGl2ZSwgbGV0J3MgbWFrZSBpdCBsb3dlcmNhc2UgdG8gaW1wcm92ZSByZWFkYWJpbGl0eS4KKyAgICAgIHNob3J0bW9kZV9wYXRoPWAkRUNITyAiJHNob3J0bW9kZV9wYXRoIiB8ICRUUiAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidgCisgICAgICAjIE5vdyBjb252ZXJ0IGl0IGJhY2sgdG8gVW5peC1zdGlsZSAoY3lncGF0aCkKKyAgICAgIGlucHV0X3BhdGg9YCRDWUdQQVRIIC11ICIkc2hvcnRtb2RlX3BhdGgiYAorICAgICAgbmV3X3BhdGg9IiRpbnB1dF9wYXRoIgorICAgIGZpCisgIGZpCisKKyAgdGVzdF9jeWdkcml2ZV9wcmVmaXg9YCRFQ0hPICRpbnB1dF9wYXRoIHwgJEdSRVAgXi9jeWdkcml2ZS9gCisgIGlmIHRlc3QgIngkdGVzdF9jeWdkcml2ZV9wcmVmaXgiID0geDsgdGhlbgorICAgICMgQXMgYSBzaW1wbGUgZml4LCBleGNsdWRlIC91c3IvYmluIHNpbmNlIGl0J3Mgbm90IGEgcmVhbCBwYXRoLgorICAgIGlmIHRlc3QgInhgJEVDSE8gJGlucHV0X3RvX3Nob3J0cGF0aCB8ICRHUkVQIF4vdXNyL2Jpbi9gIiA9IHg7IHRoZW4KKyAgICAgICMgVGhlIHBhdGggaXMgaW4gYSBDeWd3aW4gc3BlY2lhbCBkaXJlY3RvcnkgKGUuZy4gL2hvbWUpLiBXZSBuZWVkIHRoaXMgY29udmVydGVkIHRvCisgICAgICAjIGEgcGF0aCBwcmVmaXhlZCBieSAvY3lnZHJpdmUgZm9yIGZpeHBhdGggdG8gd29yay4KKyAgICAgIG5ld19wYXRoPSIkQ1lHV0lOX1JPT1RfUEFUSCRpbnB1dF9wYXRoIgorICAgIGZpCisgIGZpCisKKyAgIyByZW1vdmUgdHJhaWxpbmcgLmV4ZSBpZiBhbnkKKyAgbmV3X3BhdGg9IiR7bmV3X3BhdGgvJS5leGUvfSIKKworICBlbGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLm1zeXMiOyB0aGVuCisKKyAgIyBGaXJzdCBzZXBhcmF0ZSB0aGUgcGF0aCBmcm9tIHRoZSBhcmd1bWVudHMuIFRoaXMgd2lsbCBzcGxpdCBhdCB0aGUgZmlyc3QKKyAgIyBzcGFjZS4KKyAgY29tcGxldGU9IiRPQkpDIgorICBwYXRoPSIke2NvbXBsZXRlJSUgKn0iCisgIHRtcD0iJGNvbXBsZXRlIEVPTCIKKyAgYXJndW1lbnRzPSIke3RtcCMqIH0iCisKKyAgIyBJbnB1dCBtaWdodCBiZSBnaXZlbiBhcyBXaW5kb3dzIGZvcm1hdCwgc3RhcnQgYnkgY29udmVydGluZyB0bworICAjIHVuaXggZm9ybWF0LgorICBuZXdfcGF0aD0iJHBhdGgiCisKKyAgd2luZG93c19wYXRoPSIkbmV3X3BhdGgiCisgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLmN5Z3dpbiI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRDWUdQQVRIIC11ICIkd2luZG93c19wYXRoImAKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJEVDSE8gIiR3aW5kb3dzX3BhdGgiIHwgJFNFRCAtZSAncyxeXFwoLlxcKTosL1xcMSxnJyAtZSAncyxcXFxcLC8sZydgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGZpCisKKworICAjIE5vdyB0cnkgdG8gbG9jYXRlIGV4ZWN1dGFibGUgdXNpbmcgd2hpY2gKKyAgbmV3X3BhdGg9YCRXSElDSCAiJG5ld19wYXRoIiAyPiAvZGV2L251bGxgCisKKyAgaWYgdGVzdCAieCRuZXdfcGF0aCIgPSB4OyB0aGVuCisgICAgIyBPb3BzLiBXaGljaCBkaWRuJ3QgZmluZCB0aGUgZXhlY3V0YWJsZS4KKyAgICAjIFRoZSBzcGxpdHRpbmcgb2YgYXJndW1lbnRzIGZyb20gdGhlIGV4ZWN1dGFibGUgYXQgYSBzcGFjZSBtaWdodCBoYXZlIGJlZW4gaW5jb3JyZWN0LAorICAgICMgc2luY2UgcGF0aHMgd2l0aCBzcGFjZSBhcmUgbW9yZSBsaWtlbHkgaW4gV2luZG93cy4gR2l2ZSBpdCBhbm90aGVyIHRyeSB3aXRoIHRoZSB3aG9sZQorICAgICMgYXJndW1lbnQuCisgICAgcGF0aD0iJGNvbXBsZXRlIgorICAgIGFyZ3VtZW50cz0iRU9MIgorICAgIG5ld19wYXRoPSIkcGF0aCIKKworICB3aW5kb3dzX3BhdGg9IiRuZXdfcGF0aCIKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJENZR1BBVEggLXUgIiR3aW5kb3dzX3BhdGgiYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBlbGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLm1zeXMiOyB0aGVuCisgICAgdW5peF9wYXRoPWAkRUNITyAiJHdpbmRvd3NfcGF0aCIgfCAkU0VEIC1lICdzLF5cXCguXFwpOiwvXFwxLGcnIC1lICdzLFxcXFwsLyxnJ2AKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZmkKKworCisgICAgbmV3X3BhdGg9YCRXSElDSCAiJG5ld19wYXRoIiAyPiAvZGV2L251bGxgCisKKyAgICBpZiB0ZXN0ICJ4JG5ld19wYXRoIiA9IHg7IHRoZW4KKyAgICAgICMgSXQncyBzdGlsbCBub3QgZm91bmQuIE5vdyB0aGlzIGlzIGFuIHVucmVjb3ZlcmFibGUgZXJyb3IuCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSBwYXRoIG9mIE9CSkMsIHdoaWNoIHJlc29sdmVzIGFzIFwiJGNvbXBsZXRlXCIsIGlzIG5vdCBmb3VuZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhlIHBhdGggb2YgT0JKQywgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkY29tcGxldGVcIiwgaXMgbm90IGZvdW5kLiIgPiY2O30KKyAgICAgIGhhc19zcGFjZT1gJEVDSE8gIiRjb21wbGV0ZSIgfCAkR1JFUCAiICJgCisgICAgICBpZiB0ZXN0ICJ4JGhhc19zcGFjZSIgIT0geDsgdGhlbgorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFlvdSBtaWdodCBiZSBtaXhpbmcgc3BhY2VzIGluIHRoZSBwYXRoIGFuZCBleHRyYSBhcmd1bWVudHMsIHdoaWNoIGlzIG5vdCBhbGxvd2VkLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBZb3UgbWlnaHQgYmUgbWl4aW5nIHNwYWNlcyBpbiB0aGUgcGF0aCBhbmQgZXh0cmEgYXJndW1lbnRzLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iID4mNjt9CisgICAgICBmaQorICAgICAgYXNfZm5fZXJyb3IgJD8gIkNhbm5vdCBsb2NhdGUgdGhlIHRoZSBwYXRoIG9mIE9CSkMiICIkTElORU5PIiA1CisgICAgZmkKKyAgZmkKKworICAjIE5vdyBuZXdfcGF0aCBoYXMgYSBjb21wbGV0ZSB1bml4IHBhdGggdG8gdGhlIGJpbmFyeQorICBpZiB0ZXN0ICJ4YCRFQ0hPICRuZXdfcGF0aCB8ICRHUkVQIF4vYmluL2AiICE9IHg7IHRoZW4KKyAgICAjIEtlZXAgcGF0aHMgaW4gL2JpbiBhcy1pcywgYnV0IHJlbW92ZSB0cmFpbGluZyAuZXhlIGlmIGFueQorICAgIG5ld19wYXRoPSIke25ld19wYXRoLyUuZXhlL30iCisgICAgIyBEbyBub3Qgc2F2ZSAvYmluIHBhdGhzIHRvIGFsbF9maXhwYXRoX3ByZWZpeGVzIQorICBlbHNlCisgICAgIyBOb3QgaW4gbWl4ZWQgb3IgV2luZG93cyBzdHlsZSwgc3RhcnQgYnkgdGhhdC4KKyAgICBuZXdfcGF0aD1gY21kIC8vYyBlY2hvICRuZXdfcGF0aGAKKworICBpbnB1dF9wYXRoPSIkbmV3X3BhdGgiCisgICMgQ2hlY2sgaWYgd2UgbmVlZCB0byBjb252ZXJ0IHRoaXMgdXNpbmcgRE9TLXN0eWxlIHNob3J0IG1vZGUuIElmIHRoZSBwYXRoCisgICMgY29udGFpbnMganVzdCBzaW1wbGUgY2hhcmFjdGVycywgdXNlIGl0LiBPdGhlcndpc2UgKHNwYWNlcywgd2VpcmQgY2hhcmFjdGVycyksCisgICMgdGFrZSBubyBjaGFuY2VzIGFuZCByZXdyaXRlIGl0LgorICAjIE5vdGU6IG00IGVhdHMgb3VyIFtdLCBzbyB3ZSBuZWVkIHRvIHVzZSBbIGFuZCBdIGluc3RlYWQuCisgIGhhc19mb3JiaWRkZW5fY2hhcnM9YCRFQ0hPICIkaW5wdXRfcGF0aCIgfCAkR1JFUCBbXi1fLzphLXpBLVowLTldYAorICBpZiB0ZXN0ICJ4JGhhc19mb3JiaWRkZW5fY2hhcnMiICE9IHg7IHRoZW4KKyAgICAjIE5vdyBjb252ZXJ0IGl0IHRvIG1peGVkIERPUy1zdHlsZSwgc2hvcnQgbW9kZSAobm8gc3BhY2VzLCBhbmQgLyBpbnN0ZWFkIG9mIFwpCisgICAgbmV3X3BhdGg9YGNtZCAvYyAiZm9yICVBIGluIChcIiRpbnB1dF9wYXRoXCIpIGRvIEBlY2hvICV+c0EifCRUUiBcXFxcXFxcXCAvIHwgJFRSICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J2AKKyAgZmkKKworICAgICMgT3V0cHV0IGlzIGluICRuZXdfcGF0aAorCisgIHdpbmRvd3NfcGF0aD0iJG5ld19wYXRoIgorICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5jeWd3aW4iOyB0aGVuCisgICAgdW5peF9wYXRoPWAkQ1lHUEFUSCAtdSAiJHdpbmRvd3NfcGF0aCJgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGVsaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MubXN5cyI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRFQ0hPICIkd2luZG93c19wYXRoIiB8ICRTRUQgLWUgJ3MsXlxcKC5cXCk6LC9cXDEsZycgLWUgJ3MsXFxcXCwvLGcnYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBmaQorCisgICAgIyByZW1vdmUgdHJhaWxpbmcgLmV4ZSBpZiBhbnkKKyAgICBuZXdfcGF0aD0iJHtuZXdfcGF0aC8lLmV4ZS99IgorCisgICAgIyBTYXZlIHRoZSBmaXJzdCAxMCBieXRlcyBvZiB0aGlzIHBhdGggdG8gdGhlIHN0b3JhZ2UsIHNvIGZpeHBhdGggY2FuIHdvcmsuCisgICAgYWxsX2ZpeHBhdGhfcHJlZml4ZXM9KCIke2FsbF9maXhwYXRoX3ByZWZpeGVzW0BdfSIgIiR7bmV3X3BhdGg6MDoxMH0iKQorICBmaQorCisgIGVsc2UKKyAgICAjIFdlJ3JlIG9uIGEgcG9zaXggcGxhdGZvcm0uIEhvb3JheSEgOikKKyAgICAjIEZpcnN0IHNlcGFyYXRlIHRoZSBwYXRoIGZyb20gdGhlIGFyZ3VtZW50cy4gVGhpcyB3aWxsIHNwbGl0IGF0IHRoZSBmaXJzdAorICAgICMgc3BhY2UuCisgICAgY29tcGxldGU9IiRPQkpDIgorICAgIHBhdGg9IiR7Y29tcGxldGUlJSAqfSIKKyAgICB0bXA9IiRjb21wbGV0ZSBFT0wiCisgICAgYXJndW1lbnRzPSIke3RtcCMqIH0iCisKKyAgICBuZXdfcGF0aD1gJFdISUNIICRwYXRoIDI+IC9kZXYvbnVsbGAKKyAgICBpZiB0ZXN0ICJ4JG5ld19wYXRoIiA9IHg7IHRoZW4KKyAgICAgIGlzX2Fic29sdXRlX3BhdGg9YCRFQ0hPICIkcGF0aCIgfCAkR1JFUCBeL2AKKyAgICAgIGlmIHRlc3QgIngkaXNfYWJzb2x1dGVfcGF0aCIgIT0geDsgdGhlbgorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFJlc29sdmluZyBPQkpDIChhcyAkcGF0aCkgd2l0aCAnd2hpY2gnIGZhaWxlZCwgdXNpbmcgJHBhdGggZGlyZWN0bHkuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFJlc29sdmluZyBPQkpDIChhcyAkcGF0aCkgd2l0aCAnd2hpY2gnIGZhaWxlZCwgdXNpbmcgJHBhdGggZGlyZWN0bHkuIiA+JjY7fQorICAgICAgICBuZXdfcGF0aD0iJHBhdGgiCisgICAgICBlbHNlCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGhlIHBhdGggb2YgT0JKQywgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkY29tcGxldGVcIiwgaXMgbm90IGZvdW5kLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUaGUgcGF0aCBvZiBPQkpDLCB3aGljaCByZXNvbHZlcyBhcyBcIiRjb21wbGV0ZVwiLCBpcyBub3QgZm91bmQuIiA+JjY7fQorICAgICAgICBoYXNfc3BhY2U9YCRFQ0hPICIkY29tcGxldGUiIHwgJEdSRVAgIiAiYAorICAgICAgICBpZiB0ZXN0ICJ4JGhhc19zcGFjZSIgIT0geDsgdGhlbgorICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGhpcyBtaWdodCBiZSBjYXVzZWQgYnkgc3BhY2VzIGluIHRoZSBwYXRoLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhpcyBtaWdodCBiZSBjYXVzZWQgYnkgc3BhY2VzIGluIHRoZSBwYXRoLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iID4mNjt9CiAgICAgICAgIGZpCi0gICAgICAgICMgQ29udmVydCB0byBDOi8gbWl4ZWQgc3R5bGUgcGF0aCB3aXRob3V0IHNwYWNlcy4KLSAgICAgICAgIHRtcD1gJENZR1BBVEggLXMgLW0gIiR0bXAiYAorICAgICAgICBhc19mbl9lcnJvciAkPyAiQ2Fubm90IGxvY2F0ZSB0aGUgdGhlIHBhdGggb2YgT0JKQyIgIiRMSU5FTk8iIDUKKyAgICAgIGZpCiAgICAgZmkKLSAgICBjYXI9IiR0bXAiCisgIGZpCiAKLSAgICBlbHNlCi0gICAgICAgICMgIndoaWNoIiBpcyBub3QgcG9ydGFibGUsIGJ1dCBpcyB1c2VkIGhlcmUKLSAgICAgICAgIyBiZWNhdXNlIHdlIGtub3cgdGhhdCB0aGUgY29tbWFuZCBleGlzdHMhCi0gICAgICAgIGNhcj1gd2hpY2ggJGNhcmAKLSAgICBmaQotICAgIGlmIHRlc3QgIngkY2RyIiAhPSB4RU9MOyB0aGVuCi0gICAgICAgIE9CSkM9IiRjYXIgJHtjZHIlICp9IgotICAgIGVsc2UKLSAgICAgICAgT0JKQz0iJGNhciIKLSAgICBmaQorICAjIE5vdyBqb2luIHRvZ2V0aGVyIHRoZSBwYXRoIGFuZCB0aGUgYXJndW1lbnRzIG9uY2UgYWdhaW4KKyAgaWYgdGVzdCAieCRhcmd1bWVudHMiICE9IHhFT0w7IHRoZW4KKyAgICAgIG5ld19jb21wbGV0ZT0iJG5ld19wYXRoICR7YXJndW1lbnRzJSAqfSIKKyAgZWxzZQorICAgICAgbmV3X2NvbXBsZXRlPSIkbmV3X3BhdGgiCisgIGZpCisKKyAgaWYgdGVzdCAieCRjb21wbGV0ZSIgIT0gIngkbmV3X2NvbXBsZXRlIjsgdGhlbgorICAgIE9CSkM9IiRuZXdfY29tcGxldGUiCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBSZXdyaXRpbmcgT0JKQyB0byBcIiRuZXdfY29tcGxldGVcIiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBSZXdyaXRpbmcgT0JKQyB0byBcIiRuZXdfY29tcGxldGVcIiIgPiY2O30KKyAgZmkKIAogZWxzZQogICAgIE9CSkM9CkBAIC0xMjQzMSw3ICsyMDYwMiw3IEBACiAjIExpbmtpbmcgQysrIGV4ZWN1dGFibGVzLgogCiAKLWlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PUyIgIT0geHdpbmRvd3M7IHRoZW4KK2lmIHRlc3QgIngkT1BFTkpES19UQVJHRVRfT1MiICE9IHh3aW5kb3dzOyB0aGVuCiAgICAgaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgogICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9YXIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgogc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9YXI7IGFjX3dvcmQ9JDIKQEAgLTEyNTI1LDU5ICsyMDY5NiwyNjMgQEAKIGZpCiAKIAotICAgICMgVHJhbnNsYXRlICJnY2MgLUUiIGludG8gImB3aGljaCBnY2NgIC1FIiBpZQotICAgICMgZXh0cmFjdCB0aGUgZnVsbCBwYXRoIHRvIHRoZSBiaW5hcnkgYW5kIGF0IHRoZQotICAgICMgc2FtZSB0aW1lIG1haW50YWluIGFueSBhcmd1bWVudHMgcGFzc2VkIHRvIGl0LgotICAgICMgVGhlIGNvbW1hbmQgTVVTVCBleGlzdCBpbiB0aGUgcGF0aCwgb3IgZWxzZSEKLSAgICB0bXA9IiRBUiIKLSAgICBjYXI9IiR7dG1wJSUgKn0iCi0gICAgdG1wPSIkQVIgRU9MIgotICAgIGNkcj0iJHt0bXAjKiB9IgotICAgICMgT24gd2luZG93cyB3ZSB3YW50IHBhdGhzIHdpdGhvdXQgc3BhY2VzLgotICAgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PUyIgPSAieHdpbmRvd3MiOyB0aGVuCisgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLmN5Z3dpbiI7IHRoZW4KIAotICAgICMgVHJhbnNsYXRlIGxvbmcgY3lnZHJpdmUgb3IgQzpcc2Rmc2YgcGF0aAotICAgICMgaW50byBhIHNob3J0IG1peGVkIG1vZGUgcGF0aCB0aGF0IGhhcyBubwotICAgICMgc3BhY2VzIGluIGl0LgotICAgIHRtcD0iJGNhciIKKyAgIyBGaXJzdCBzZXBhcmF0ZSB0aGUgcGF0aCBmcm9tIHRoZSBhcmd1bWVudHMuIFRoaXMgd2lsbCBzcGxpdCBhdCB0aGUgZmlyc3QKKyAgIyBzcGFjZS4KKyAgY29tcGxldGU9IiRBUiIKKyAgcGF0aD0iJHtjb21wbGV0ZSUlICp9IgorICB0bXA9IiRjb21wbGV0ZSBFT0wiCisgIGFyZ3VtZW50cz0iJHt0bXAjKiB9IgogCi0gICAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TIiA9ICJ4d2luZG93cyI7IHRoZW4KLSAgICAgICAgdG1wPWAkQ1lHUEFUSCAtdSAiJGNhciJgCi0gICAgICAgIHRtcD1gd2hpY2ggIiR0bXAiYAotICAgICAgICAjIElmIGZpbGUgZXhpc3RzIHdpdGggLmV4ZSBhcHBlbmRlZCwgdGhhdCdzIHRoZSByZWFsIGZpbGVuYW1lCi0gICAgICAgICMgYW5kIGN5Z3BhdGggbmVlZHMgdGhhdCB0byBjb252ZXJ0IHRvIHNob3J0IHN0eWxlIHBhdGguCi0gICAgICAgIGlmIHRlc3QgLWYgIiR7dG1wfS5leGUiOyB0aGVuCi0gICAgICAgICAgIHRtcD0iJHt0bXB9LmV4ZSIKLSAgICAgICAgZWxpZiB0ZXN0IC1mICIke3RtcH0uY21kIjsgdGhlbgotICAgICAgICAgICB0bXA9IiR7dG1wfS5jbWQiCisgICMgSW5wdXQgbWlnaHQgYmUgZ2l2ZW4gYXMgV2luZG93cyBmb3JtYXQsIHN0YXJ0IGJ5IGNvbnZlcnRpbmcgdG8KKyAgIyB1bml4IGZvcm1hdC4KKyAgbmV3X3BhdGg9YCRDWUdQQVRIIC11ICIkcGF0aCJgCisKKyAgIyBOb3cgdHJ5IHRvIGxvY2F0ZSBleGVjdXRhYmxlIHVzaW5nIHdoaWNoCisgIG5ld19wYXRoPWAkV0hJQ0ggIiRuZXdfcGF0aCIgMj4gL2Rldi9udWxsYAorICBpZiB0ZXN0ICJ4JG5ld19wYXRoIiA9IHg7IHRoZW4KKyAgICAjIE9vcHMuIFdoaWNoIGRpZG4ndCBmaW5kIHRoZSBleGVjdXRhYmxlLgorICAgICMgVGhlIHNwbGl0dGluZyBvZiBhcmd1bWVudHMgZnJvbSB0aGUgZXhlY3V0YWJsZSBhdCBhIHNwYWNlIG1pZ2h0IGhhdmUgYmVlbiBpbmNvcnJlY3QsCisgICAgIyBzaW5jZSBwYXRocyB3aXRoIHNwYWNlIGFyZSBtb3JlIGxpa2VseSBpbiBXaW5kb3dzLiBHaXZlIGl0IGFub3RoZXIgdHJ5IHdpdGggdGhlIHdob2xlCisgICAgIyBhcmd1bWVudC4KKyAgICBwYXRoPSIkY29tcGxldGUiCisgICAgYXJndW1lbnRzPSJFT0wiCisgICAgbmV3X3BhdGg9YCRDWUdQQVRIIC11ICIkcGF0aCJgCisgICAgbmV3X3BhdGg9YCRXSElDSCAiJG5ld19wYXRoIiAyPiAvZGV2L251bGxgCisgICAgaWYgdGVzdCAieCRuZXdfcGF0aCIgPSB4OyB0aGVuCisgICAgICAjIEl0J3Mgc3RpbGwgbm90IGZvdW5kLiBOb3cgdGhpcyBpcyBhbiB1bnJlY292ZXJhYmxlIGVycm9yLgorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUaGUgcGF0aCBvZiBBUiwgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkY29tcGxldGVcIiwgaXMgbm90IGZvdW5kLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUaGUgcGF0aCBvZiBBUiwgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkY29tcGxldGVcIiwgaXMgbm90IGZvdW5kLiIgPiY2O30KKyAgICAgIGhhc19zcGFjZT1gJEVDSE8gIiRjb21wbGV0ZSIgfCAkR1JFUCAiICJgCisgICAgICBpZiB0ZXN0ICJ4JGhhc19zcGFjZSIgIT0geDsgdGhlbgorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFlvdSBtaWdodCBiZSBtaXhpbmcgc3BhY2VzIGluIHRoZSBwYXRoIGFuZCBleHRyYSBhcmd1bWVudHMsIHdoaWNoIGlzIG5vdCBhbGxvd2VkLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBZb3UgbWlnaHQgYmUgbWl4aW5nIHNwYWNlcyBpbiB0aGUgcGF0aCBhbmQgZXh0cmEgYXJndW1lbnRzLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iID4mNjt9CisgICAgICBmaQorICAgICAgYXNfZm5fZXJyb3IgJD8gIkNhbm5vdCBsb2NhdGUgdGhlIHRoZSBwYXRoIG9mIEFSIiAiJExJTkVOTyIgNQorICAgIGZpCisgIGZpCisKKyAgIyBDeWd3aW4gdHJpZXMgdG8gaGlkZSBzb21lIGFzcGVjdHMgb2YgdGhlIFdpbmRvd3MgZmlsZSBzeXN0ZW0sIHN1Y2ggdGhhdCBiaW5hcmllcyBhcmUKKyAgIyBuYW1lZCAuZXhlIGJ1dCBjYWxsZWQgd2l0aG91dCB0aGF0IHN1ZmZpeC4gVGhlcmVmb3JlLCAiZm9vIiBhbmQgImZvby5leGUiIGFyZSBjb25zaWRlcmVkCisgICMgdGhlIHNhbWUgZmlsZSwgbW9zdCBvZiB0aGUgdGltZSAoYXMgaW4gInRlc3QgLWYiKS4gQnV0IG5vdCB3aGVuIHJ1bm5pbmcgY3lncGF0aCAtcywgdGhlbgorICAjICJmb28uZXhlIiBpcyBPSyBidXQgImZvbyIgaXMgYW4gZXJyb3IuCisgICMKKyAgIyBUaGlzIHRlc3QgaXMgdGhlcmVmb3JlIHNsaWdodGx5IG1vcmUgYWNjdXJhdGUgdGhhbiAidGVzdCAtZiIgdG8gY2hlY2sgZm9yIGZpbGUgcHJlY2Vuc2UuCisgICMgSXQgaXMgYWxzbyBhIHdheSB0byBtYWtlIHN1cmUgd2UgZ290IHRoZSBwcm9wZXIgZmlsZSBuYW1lIGZvciB0aGUgcmVhbCB0ZXN0IGxhdGVyIG9uLgorICB0ZXN0X3Nob3J0cGF0aD1gJENZR1BBVEggLXMgLW0gIiRuZXdfcGF0aCIgMj4gL2Rldi9udWxsYAorICBpZiB0ZXN0ICJ4JHRlc3Rfc2hvcnRwYXRoIiA9IHg7IHRoZW4KKyAgICAjIFNob3J0IHBhdGggZmFpbGVkLCBmaWxlIGRvZXMgbm90IGV4aXN0IGFzIHNwZWNpZmllZC4KKyAgICAjIFRyeSBhZGRpbmcgLmV4ZSBvciAuY21kCisgICAgaWYgdGVzdCAtZiAiJHtuZXdfcGF0aH0uZXhlIjsgdGhlbgorICAgICAgIGlucHV0X3RvX3Nob3J0cGF0aD0iJHtuZXdfcGF0aH0uZXhlIgorICAgIGVsaWYgdGVzdCAtZiAiJHtuZXdfcGF0aH0uY21kIjsgdGhlbgorICAgICAgIGlucHV0X3RvX3Nob3J0cGF0aD0iJHtuZXdfcGF0aH0uY21kIgorICAgIGVsc2UKKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGhlIHBhdGggb2YgQVIsIHdoaWNoIHJlc29sdmVzIGFzIFwiJG5ld19wYXRoXCIsIGlzIGludmFsaWQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoZSBwYXRoIG9mIEFSLCB3aGljaCByZXNvbHZlcyBhcyBcIiRuZXdfcGF0aFwiLCBpcyBpbnZhbGlkLiIgPiY2O30KKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogTmVpdGhlciBcIiRuZXdfcGF0aFwiIG5vciBcIiRuZXdfcGF0aC5leGUvY21kXCIgY2FuIGJlIGZvdW5kIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IE5laXRoZXIgXCIkbmV3X3BhdGhcIiBub3IgXCIkbmV3X3BhdGguZXhlL2NtZFwiIGNhbiBiZSBmb3VuZCIgPiY2O30KKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJDYW5ub3QgbG9jYXRlIHRoZSB0aGUgcGF0aCBvZiBBUiIgIiRMSU5FTk8iIDUKKyAgICBmaQorICBlbHNlCisgICAgaW5wdXRfdG9fc2hvcnRwYXRoPSIkbmV3X3BhdGgiCisgIGZpCisKKyAgIyBDYWxsIGhlbHBlciBmdW5jdGlvbiB3aGljaCBwb3NzaWJseSBjb252ZXJ0cyB0aGlzIHVzaW5nIERPUy1zdHlsZSBzaG9ydCBtb2RlLgorICAjIElmIHNvLCB0aGUgdXBkYXRlZCBwYXRoIGlzIHN0b3JlZCBpbiAkbmV3X3BhdGguCisgIG5ld19wYXRoPSIkaW5wdXRfdG9fc2hvcnRwYXRoIgorCisgIGlucHV0X3BhdGg9IiRpbnB1dF90b19zaG9ydHBhdGgiCisgICMgQ2hlY2sgaWYgd2UgbmVlZCB0byBjb252ZXJ0IHRoaXMgdXNpbmcgRE9TLXN0eWxlIHNob3J0IG1vZGUuIElmIHRoZSBwYXRoCisgICMgY29udGFpbnMganVzdCBzaW1wbGUgY2hhcmFjdGVycywgdXNlIGl0LiBPdGhlcndpc2UgKHNwYWNlcywgd2VpcmQgY2hhcmFjdGVycyksCisgICMgdGFrZSBubyBjaGFuY2VzIGFuZCByZXdyaXRlIGl0LgorICAjIE5vdGU6IG00IGVhdHMgb3VyIFtdLCBzbyB3ZSBuZWVkIHRvIHVzZSBbIGFuZCBdIGluc3RlYWQuCisgIGhhc19mb3JiaWRkZW5fY2hhcnM9YCRFQ0hPICIkaW5wdXRfcGF0aCIgfCAkR1JFUCBbXi0uXy9hLXpBLVowLTldYAorICBpZiB0ZXN0ICJ4JGhhc19mb3JiaWRkZW5fY2hhcnMiICE9IHg7IHRoZW4KKyAgICAjIE5vdyBjb252ZXJ0IGl0IHRvIG1peGVkIERPUy1zdHlsZSwgc2hvcnQgbW9kZSAobm8gc3BhY2VzLCBhbmQgLyBpbnN0ZWFkIG9mIFwpCisgICAgc2hvcnRtb2RlX3BhdGg9YCRDWUdQQVRIIC1zIC1tIC1hICIkaW5wdXRfcGF0aCJgCisgICAgcGF0aF9hZnRlcl9zaG9ydG1vZGU9YCRDWUdQQVRIIC11ICIkc2hvcnRtb2RlX3BhdGgiYAorICAgIGlmIHRlc3QgIngkcGF0aF9hZnRlcl9zaG9ydG1vZGUiICE9ICJ4JGlucHV0X3RvX3Nob3J0cGF0aCI7IHRoZW4KKyAgICAgICMgR29pbmcgdG8gc2hvcnQgbW9kZSBhbmQgYmFjayBhZ2FpbiBkaWQgaW5kZWVkIG1hdHRlci4gU2luY2Ugc2hvcnQgbW9kZSBpcworICAgICAgIyBjYXNlIGluc2Vuc2l0aXZlLCBsZXQncyBtYWtlIGl0IGxvd2VyY2FzZSB0byBpbXByb3ZlIHJlYWRhYmlsaXR5LgorICAgICAgc2hvcnRtb2RlX3BhdGg9YCRFQ0hPICIkc2hvcnRtb2RlX3BhdGgiIHwgJFRSICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J2AKKyAgICAgICMgTm93IGNvbnZlcnQgaXQgYmFjayB0byBVbml4LXN0aWxlIChjeWdwYXRoKQorICAgICAgaW5wdXRfcGF0aD1gJENZR1BBVEggLXUgIiRzaG9ydG1vZGVfcGF0aCJgCisgICAgICBuZXdfcGF0aD0iJGlucHV0X3BhdGgiCisgICAgZmkKKyAgZmkKKworICB0ZXN0X2N5Z2RyaXZlX3ByZWZpeD1gJEVDSE8gJGlucHV0X3BhdGggfCAkR1JFUCBeL2N5Z2RyaXZlL2AKKyAgaWYgdGVzdCAieCR0ZXN0X2N5Z2RyaXZlX3ByZWZpeCIgPSB4OyB0aGVuCisgICAgIyBBcyBhIHNpbXBsZSBmaXgsIGV4Y2x1ZGUgL3Vzci9iaW4gc2luY2UgaXQncyBub3QgYSByZWFsIHBhdGguCisgICAgaWYgdGVzdCAieGAkRUNITyAkaW5wdXRfdG9fc2hvcnRwYXRoIHwgJEdSRVAgXi91c3IvYmluL2AiID0geDsgdGhlbgorICAgICAgIyBUaGUgcGF0aCBpcyBpbiBhIEN5Z3dpbiBzcGVjaWFsIGRpcmVjdG9yeSAoZS5nLiAvaG9tZSkuIFdlIG5lZWQgdGhpcyBjb252ZXJ0ZWQgdG8KKyAgICAgICMgYSBwYXRoIHByZWZpeGVkIGJ5IC9jeWdkcml2ZSBmb3IgZml4cGF0aCB0byB3b3JrLgorICAgICAgbmV3X3BhdGg9IiRDWUdXSU5fUk9PVF9QQVRIJGlucHV0X3BhdGgiCisgICAgZmkKKyAgZmkKKworICAjIHJlbW92ZSB0cmFpbGluZyAuZXhlIGlmIGFueQorICBuZXdfcGF0aD0iJHtuZXdfcGF0aC8lLmV4ZS99IgorCisgIGVsaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MubXN5cyI7IHRoZW4KKworICAjIEZpcnN0IHNlcGFyYXRlIHRoZSBwYXRoIGZyb20gdGhlIGFyZ3VtZW50cy4gVGhpcyB3aWxsIHNwbGl0IGF0IHRoZSBmaXJzdAorICAjIHNwYWNlLgorICBjb21wbGV0ZT0iJEFSIgorICBwYXRoPSIke2NvbXBsZXRlJSUgKn0iCisgIHRtcD0iJGNvbXBsZXRlIEVPTCIKKyAgYXJndW1lbnRzPSIke3RtcCMqIH0iCisKKyAgIyBJbnB1dCBtaWdodCBiZSBnaXZlbiBhcyBXaW5kb3dzIGZvcm1hdCwgc3RhcnQgYnkgY29udmVydGluZyB0bworICAjIHVuaXggZm9ybWF0LgorICBuZXdfcGF0aD0iJHBhdGgiCisKKyAgd2luZG93c19wYXRoPSIkbmV3X3BhdGgiCisgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLmN5Z3dpbiI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRDWUdQQVRIIC11ICIkd2luZG93c19wYXRoImAKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJEVDSE8gIiR3aW5kb3dzX3BhdGgiIHwgJFNFRCAtZSAncyxeXFwoLlxcKTosL1xcMSxnJyAtZSAncyxcXFxcLC8sZydgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGZpCisKKworICAjIE5vdyB0cnkgdG8gbG9jYXRlIGV4ZWN1dGFibGUgdXNpbmcgd2hpY2gKKyAgbmV3X3BhdGg9YCRXSElDSCAiJG5ld19wYXRoIiAyPiAvZGV2L251bGxgCisKKyAgaWYgdGVzdCAieCRuZXdfcGF0aCIgPSB4OyB0aGVuCisgICAgIyBPb3BzLiBXaGljaCBkaWRuJ3QgZmluZCB0aGUgZXhlY3V0YWJsZS4KKyAgICAjIFRoZSBzcGxpdHRpbmcgb2YgYXJndW1lbnRzIGZyb20gdGhlIGV4ZWN1dGFibGUgYXQgYSBzcGFjZSBtaWdodCBoYXZlIGJlZW4gaW5jb3JyZWN0LAorICAgICMgc2luY2UgcGF0aHMgd2l0aCBzcGFjZSBhcmUgbW9yZSBsaWtlbHkgaW4gV2luZG93cy4gR2l2ZSBpdCBhbm90aGVyIHRyeSB3aXRoIHRoZSB3aG9sZQorICAgICMgYXJndW1lbnQuCisgICAgcGF0aD0iJGNvbXBsZXRlIgorICAgIGFyZ3VtZW50cz0iRU9MIgorICAgIG5ld19wYXRoPSIkcGF0aCIKKworICB3aW5kb3dzX3BhdGg9IiRuZXdfcGF0aCIKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJENZR1BBVEggLXUgIiR3aW5kb3dzX3BhdGgiYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBlbGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLm1zeXMiOyB0aGVuCisgICAgdW5peF9wYXRoPWAkRUNITyAiJHdpbmRvd3NfcGF0aCIgfCAkU0VEIC1lICdzLF5cXCguXFwpOiwvXFwxLGcnIC1lICdzLFxcXFwsLyxnJ2AKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZmkKKworCisgICAgbmV3X3BhdGg9YCRXSElDSCAiJG5ld19wYXRoIiAyPiAvZGV2L251bGxgCisKKyAgICBpZiB0ZXN0ICJ4JG5ld19wYXRoIiA9IHg7IHRoZW4KKyAgICAgICMgSXQncyBzdGlsbCBub3QgZm91bmQuIE5vdyB0aGlzIGlzIGFuIHVucmVjb3ZlcmFibGUgZXJyb3IuCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSBwYXRoIG9mIEFSLCB3aGljaCByZXNvbHZlcyBhcyBcIiRjb21wbGV0ZVwiLCBpcyBub3QgZm91bmQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoZSBwYXRoIG9mIEFSLCB3aGljaCByZXNvbHZlcyBhcyBcIiRjb21wbGV0ZVwiLCBpcyBub3QgZm91bmQuIiA+JjY7fQorICAgICAgaGFzX3NwYWNlPWAkRUNITyAiJGNvbXBsZXRlIiB8ICRHUkVQICIgImAKKyAgICAgIGlmIHRlc3QgIngkaGFzX3NwYWNlIiAhPSB4OyB0aGVuCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogWW91IG1pZ2h0IGJlIG1peGluZyBzcGFjZXMgaW4gdGhlIHBhdGggYW5kIGV4dHJhIGFyZ3VtZW50cywgd2hpY2ggaXMgbm90IGFsbG93ZWQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFlvdSBtaWdodCBiZSBtaXhpbmcgc3BhY2VzIGluIHRoZSBwYXRoIGFuZCBleHRyYSBhcmd1bWVudHMsIHdoaWNoIGlzIG5vdCBhbGxvd2VkLiIgPiY2O30KKyAgICAgIGZpCisgICAgICBhc19mbl9lcnJvciAkPyAiQ2Fubm90IGxvY2F0ZSB0aGUgdGhlIHBhdGggb2YgQVIiICIkTElORU5PIiA1CisgICAgZmkKKyAgZmkKKworICAjIE5vdyBuZXdfcGF0aCBoYXMgYSBjb21wbGV0ZSB1bml4IHBhdGggdG8gdGhlIGJpbmFyeQorICBpZiB0ZXN0ICJ4YCRFQ0hPICRuZXdfcGF0aCB8ICRHUkVQIF4vYmluL2AiICE9IHg7IHRoZW4KKyAgICAjIEtlZXAgcGF0aHMgaW4gL2JpbiBhcy1pcywgYnV0IHJlbW92ZSB0cmFpbGluZyAuZXhlIGlmIGFueQorICAgIG5ld19wYXRoPSIke25ld19wYXRoLyUuZXhlL30iCisgICAgIyBEbyBub3Qgc2F2ZSAvYmluIHBhdGhzIHRvIGFsbF9maXhwYXRoX3ByZWZpeGVzIQorICBlbHNlCisgICAgIyBOb3QgaW4gbWl4ZWQgb3IgV2luZG93cyBzdHlsZSwgc3RhcnQgYnkgdGhhdC4KKyAgICBuZXdfcGF0aD1gY21kIC8vYyBlY2hvICRuZXdfcGF0aGAKKworICBpbnB1dF9wYXRoPSIkbmV3X3BhdGgiCisgICMgQ2hlY2sgaWYgd2UgbmVlZCB0byBjb252ZXJ0IHRoaXMgdXNpbmcgRE9TLXN0eWxlIHNob3J0IG1vZGUuIElmIHRoZSBwYXRoCisgICMgY29udGFpbnMganVzdCBzaW1wbGUgY2hhcmFjdGVycywgdXNlIGl0LiBPdGhlcndpc2UgKHNwYWNlcywgd2VpcmQgY2hhcmFjdGVycyksCisgICMgdGFrZSBubyBjaGFuY2VzIGFuZCByZXdyaXRlIGl0LgorICAjIE5vdGU6IG00IGVhdHMgb3VyIFtdLCBzbyB3ZSBuZWVkIHRvIHVzZSBbIGFuZCBdIGluc3RlYWQuCisgIGhhc19mb3JiaWRkZW5fY2hhcnM9YCRFQ0hPICIkaW5wdXRfcGF0aCIgfCAkR1JFUCBbXi1fLzphLXpBLVowLTldYAorICBpZiB0ZXN0ICJ4JGhhc19mb3JiaWRkZW5fY2hhcnMiICE9IHg7IHRoZW4KKyAgICAjIE5vdyBjb252ZXJ0IGl0IHRvIG1peGVkIERPUy1zdHlsZSwgc2hvcnQgbW9kZSAobm8gc3BhY2VzLCBhbmQgLyBpbnN0ZWFkIG9mIFwpCisgICAgbmV3X3BhdGg9YGNtZCAvYyAiZm9yICVBIGluIChcIiRpbnB1dF9wYXRoXCIpIGRvIEBlY2hvICV+c0EifCRUUiBcXFxcXFxcXCAvIHwgJFRSICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J2AKKyAgZmkKKworICAgICMgT3V0cHV0IGlzIGluICRuZXdfcGF0aAorCisgIHdpbmRvd3NfcGF0aD0iJG5ld19wYXRoIgorICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5jeWd3aW4iOyB0aGVuCisgICAgdW5peF9wYXRoPWAkQ1lHUEFUSCAtdSAiJHdpbmRvd3NfcGF0aCJgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGVsaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MubXN5cyI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRFQ0hPICIkd2luZG93c19wYXRoIiB8ICRTRUQgLWUgJ3MsXlxcKC5cXCk6LC9cXDEsZycgLWUgJ3MsXFxcXCwvLGcnYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBmaQorCisgICAgIyByZW1vdmUgdHJhaWxpbmcgLmV4ZSBpZiBhbnkKKyAgICBuZXdfcGF0aD0iJHtuZXdfcGF0aC8lLmV4ZS99IgorCisgICAgIyBTYXZlIHRoZSBmaXJzdCAxMCBieXRlcyBvZiB0aGlzIHBhdGggdG8gdGhlIHN0b3JhZ2UsIHNvIGZpeHBhdGggY2FuIHdvcmsuCisgICAgYWxsX2ZpeHBhdGhfcHJlZml4ZXM9KCIke2FsbF9maXhwYXRoX3ByZWZpeGVzW0BdfSIgIiR7bmV3X3BhdGg6MDoxMH0iKQorICBmaQorCisgIGVsc2UKKyAgICAjIFdlJ3JlIG9uIGEgcG9zaXggcGxhdGZvcm0uIEhvb3JheSEgOikKKyAgICAjIEZpcnN0IHNlcGFyYXRlIHRoZSBwYXRoIGZyb20gdGhlIGFyZ3VtZW50cy4gVGhpcyB3aWxsIHNwbGl0IGF0IHRoZSBmaXJzdAorICAgICMgc3BhY2UuCisgICAgY29tcGxldGU9IiRBUiIKKyAgICBwYXRoPSIke2NvbXBsZXRlJSUgKn0iCisgICAgdG1wPSIkY29tcGxldGUgRU9MIgorICAgIGFyZ3VtZW50cz0iJHt0bXAjKiB9IgorCisgICAgbmV3X3BhdGg9YCRXSElDSCAkcGF0aCAyPiAvZGV2L251bGxgCisgICAgaWYgdGVzdCAieCRuZXdfcGF0aCIgPSB4OyB0aGVuCisgICAgICBpc19hYnNvbHV0ZV9wYXRoPWAkRUNITyAiJHBhdGgiIHwgJEdSRVAgXi9gCisgICAgICBpZiB0ZXN0ICJ4JGlzX2Fic29sdXRlX3BhdGgiICE9IHg7IHRoZW4KKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBSZXNvbHZpbmcgQVIgKGFzICRwYXRoKSB3aXRoICd3aGljaCcgZmFpbGVkLCB1c2luZyAkcGF0aCBkaXJlY3RseS4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogUmVzb2x2aW5nIEFSIChhcyAkcGF0aCkgd2l0aCAnd2hpY2gnIGZhaWxlZCwgdXNpbmcgJHBhdGggZGlyZWN0bHkuIiA+JjY7fQorICAgICAgICBuZXdfcGF0aD0iJHBhdGgiCisgICAgICBlbHNlCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGhlIHBhdGggb2YgQVIsIHdoaWNoIHJlc29sdmVzIGFzIFwiJGNvbXBsZXRlXCIsIGlzIG5vdCBmb3VuZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhlIHBhdGggb2YgQVIsIHdoaWNoIHJlc29sdmVzIGFzIFwiJGNvbXBsZXRlXCIsIGlzIG5vdCBmb3VuZC4iID4mNjt9CisgICAgICAgIGhhc19zcGFjZT1gJEVDSE8gIiRjb21wbGV0ZSIgfCAkR1JFUCAiICJgCisgICAgICAgIGlmIHRlc3QgIngkaGFzX3NwYWNlIiAhPSB4OyB0aGVuCisgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUaGlzIG1pZ2h0IGJlIGNhdXNlZCBieSBzcGFjZXMgaW4gdGhlIHBhdGgsIHdoaWNoIGlzIG5vdCBhbGxvd2VkLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUaGlzIG1pZ2h0IGJlIGNhdXNlZCBieSBzcGFjZXMgaW4gdGhlIHBhdGgsIHdoaWNoIGlzIG5vdCBhbGxvd2VkLiIgPiY2O30KICAgICAgICAgZmkKLSAgICAgICAgIyBDb252ZXJ0IHRvIEM6LyBtaXhlZCBzdHlsZSBwYXRoIHdpdGhvdXQgc3BhY2VzLgotICAgICAgICAgdG1wPWAkQ1lHUEFUSCAtcyAtbSAiJHRtcCJgCisgICAgICAgIGFzX2ZuX2Vycm9yICQ/ICJDYW5ub3QgbG9jYXRlIHRoZSB0aGUgcGF0aCBvZiBBUiIgIiRMSU5FTk8iIDUKKyAgICAgIGZpCiAgICAgZmkKLSAgICBjYXI9IiR0bXAiCisgIGZpCiAKLSAgICBlbHNlCi0gICAgICAgICMgIndoaWNoIiBpcyBub3QgcG9ydGFibGUsIGJ1dCBpcyB1c2VkIGhlcmUKLSAgICAgICAgIyBiZWNhdXNlIHdlIGtub3cgdGhhdCB0aGUgY29tbWFuZCBleGlzdHMhCi0gICAgICAgIGNhcj1gd2hpY2ggJGNhcmAKLSAgICBmaQotICAgIGlmIHRlc3QgIngkY2RyIiAhPSB4RU9MOyB0aGVuCi0gICAgICAgIEFSPSIkY2FyICR7Y2RyJSAqfSIKLSAgICBlbHNlCi0gICAgICAgIEFSPSIkY2FyIgotICAgIGZpCisgICMgTm93IGpvaW4gdG9nZXRoZXIgdGhlIHBhdGggYW5kIHRoZSBhcmd1bWVudHMgb25jZSBhZ2FpbgorICBpZiB0ZXN0ICJ4JGFyZ3VtZW50cyIgIT0geEVPTDsgdGhlbgorICAgICAgbmV3X2NvbXBsZXRlPSIkbmV3X3BhdGggJHthcmd1bWVudHMlICp9IgorICBlbHNlCisgICAgICBuZXdfY29tcGxldGU9IiRuZXdfcGF0aCIKKyAgZmkKKworICBpZiB0ZXN0ICJ4JGNvbXBsZXRlIiAhPSAieCRuZXdfY29tcGxldGUiOyB0aGVuCisgICAgQVI9IiRuZXdfY29tcGxldGUiCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBSZXdyaXRpbmcgQVIgdG8gXCIkbmV3X2NvbXBsZXRlXCIiID4mNQorJGFzX2VjaG8gIiRhc19tZTogUmV3cml0aW5nIEFSIHRvIFwiJG5ld19jb21wbGV0ZVwiIiA+JjY7fQorICBmaQogCiBmaQotaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TIiA9IHhtYWNvc3g7IHRoZW4KK2lmIHRlc3QgIngkT1BFTkpES19UQVJHRVRfT1MiID0geG1hY29zeDsgdGhlbgogICAgIEFSRkxBR1M9Ii1yIgogZWxzZQogICAgIEFSRkxBR1M9IiIKIGZpCiAKIAorIyBGb3IgaG90c3BvdCwgd2UgbmVlZCB0aGVzZSBpbiBXaW5kb3dzIG1peGVkIHBhdGg7IG90aGVyIHBsYXRmb3JtcyBrZWVwIHRoZW0gdGhlIHNhbWUKK0hPVFNQT1RfQ1hYPSIkQ1hYIgorSE9UU1BPVF9MRD0iJExEIgorCisKKwogQ09NUElMRVJfTkFNRT1nY2MKIENPTVBJTEVSX1RZUEU9Q0MKLWlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PUyIgPSB4d2luZG93czsgdGhlbiA6CitpZiB0ZXN0ICJ4JE9QRU5KREtfVEFSR0VUX09TIiA9IHh3aW5kb3dzOyB0aGVuIDoKIAogICAgICMgRm9yIG5vdywgYXNzdW1lIHRoYXQgd2UgYXJlIGFsd2F5cyBjb21waWxpbmcgdXNpbmcgY2wuZXhlLgogICAgIENDX09VVF9PUFRJT049LUZvCkBAIC0xMjY0MywyNSArMjEwMTgsMjQ1IEBACiAgICAgIyBTaW5jZSB3ZSBtdXN0IGlnbm9yZSB0aGUgZmlyc3QgZm91bmQgbGluaywgV0lOTEQgd2lsbCBjb250YWluCiAgICAgIyB0aGUgZnVsbCBwYXRoIHRvIHRoZSBsaW5rLmV4ZSBwcm9ncmFtLgogCi0gICAgIyBUcmFuc2xhdGUgbG9uZyBjeWdkcml2ZSBvciBDOlxzZGZzZiBwYXRoCi0gICAgIyBpbnRvIGEgc2hvcnQgbWl4ZWQgbW9kZSBwYXRoIHRoYXQgaGFzIG5vCi0gICAgIyBzcGFjZXMgaW4gaXQuCi0gICAgdG1wPSIkV0lOTEQiCisgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLmN5Z3dpbiI7IHRoZW4KIAotICAgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PUyIgPSAieHdpbmRvd3MiOyB0aGVuCi0gICAgICAgIHRtcD1gJENZR1BBVEggLXUgIiRXSU5MRCJgCi0gICAgICAgIHRtcD1gd2hpY2ggIiR0bXAiYAotICAgICAgICAjIElmIGZpbGUgZXhpc3RzIHdpdGggLmV4ZSBhcHBlbmRlZCwgdGhhdCdzIHRoZSByZWFsIGZpbGVuYW1lCi0gICAgICAgICMgYW5kIGN5Z3BhdGggbmVlZHMgdGhhdCB0byBjb252ZXJ0IHRvIHNob3J0IHN0eWxlIHBhdGguCi0gICAgICAgIGlmIHRlc3QgLWYgIiR7dG1wfS5leGUiOyB0aGVuCi0gICAgICAgICAgIHRtcD0iJHt0bXB9LmV4ZSIKLSAgICAgICAgZWxpZiB0ZXN0IC1mICIke3RtcH0uY21kIjsgdGhlbgotICAgICAgICAgICB0bXA9IiR7dG1wfS5jbWQiCi0gICAgICAgIGZpCi0gICAgICAgICMgQ29udmVydCB0byBDOi8gbWl4ZWQgc3R5bGUgcGF0aCB3aXRob3V0IHNwYWNlcy4KLSAgICAgICAgIHRtcD1gJENZR1BBVEggLXMgLW0gIiR0bXAiYAorICAjIEZpcnN0IHNlcGFyYXRlIHRoZSBwYXRoIGZyb20gdGhlIGFyZ3VtZW50cy4gVGhpcyB3aWxsIHNwbGl0IGF0IHRoZSBmaXJzdAorICAjIHNwYWNlLgorICBjb21wbGV0ZT0iJFdJTkxEIgorICBwYXRoPSIke2NvbXBsZXRlJSUgKn0iCisgIHRtcD0iJGNvbXBsZXRlIEVPTCIKKyAgYXJndW1lbnRzPSIke3RtcCMqIH0iCisKKyAgIyBJbnB1dCBtaWdodCBiZSBnaXZlbiBhcyBXaW5kb3dzIGZvcm1hdCwgc3RhcnQgYnkgY29udmVydGluZyB0bworICAjIHVuaXggZm9ybWF0LgorICBuZXdfcGF0aD1gJENZR1BBVEggLXUgIiRwYXRoImAKKworICAjIE5vdyB0cnkgdG8gbG9jYXRlIGV4ZWN1dGFibGUgdXNpbmcgd2hpY2gKKyAgbmV3X3BhdGg9YCRXSElDSCAiJG5ld19wYXRoIiAyPiAvZGV2L251bGxgCisgIGlmIHRlc3QgIngkbmV3X3BhdGgiID0geDsgdGhlbgorICAgICMgT29wcy4gV2hpY2ggZGlkbid0IGZpbmQgdGhlIGV4ZWN1dGFibGUuCisgICAgIyBUaGUgc3BsaXR0aW5nIG9mIGFyZ3VtZW50cyBmcm9tIHRoZSBleGVjdXRhYmxlIGF0IGEgc3BhY2UgbWlnaHQgaGF2ZSBiZWVuIGluY29ycmVjdCwKKyAgICAjIHNpbmNlIHBhdGhzIHdpdGggc3BhY2UgYXJlIG1vcmUgbGlrZWx5IGluIFdpbmRvd3MuIEdpdmUgaXQgYW5vdGhlciB0cnkgd2l0aCB0aGUgd2hvbGUKKyAgICAjIGFyZ3VtZW50LgorICAgIHBhdGg9IiRjb21wbGV0ZSIKKyAgICBhcmd1bWVudHM9IkVPTCIKKyAgICBuZXdfcGF0aD1gJENZR1BBVEggLXUgIiRwYXRoImAKKyAgICBuZXdfcGF0aD1gJFdISUNIICIkbmV3X3BhdGgiIDI+IC9kZXYvbnVsbGAKKyAgICBpZiB0ZXN0ICJ4JG5ld19wYXRoIiA9IHg7IHRoZW4KKyAgICAgICMgSXQncyBzdGlsbCBub3QgZm91bmQuIE5vdyB0aGlzIGlzIGFuIHVucmVjb3ZlcmFibGUgZXJyb3IuCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSBwYXRoIG9mIFdJTkxELCB3aGljaCByZXNvbHZlcyBhcyBcIiRjb21wbGV0ZVwiLCBpcyBub3QgZm91bmQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoZSBwYXRoIG9mIFdJTkxELCB3aGljaCByZXNvbHZlcyBhcyBcIiRjb21wbGV0ZVwiLCBpcyBub3QgZm91bmQuIiA+JjY7fQorICAgICAgaGFzX3NwYWNlPWAkRUNITyAiJGNvbXBsZXRlIiB8ICRHUkVQICIgImAKKyAgICAgIGlmIHRlc3QgIngkaGFzX3NwYWNlIiAhPSB4OyB0aGVuCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogWW91IG1pZ2h0IGJlIG1peGluZyBzcGFjZXMgaW4gdGhlIHBhdGggYW5kIGV4dHJhIGFyZ3VtZW50cywgd2hpY2ggaXMgbm90IGFsbG93ZWQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFlvdSBtaWdodCBiZSBtaXhpbmcgc3BhY2VzIGluIHRoZSBwYXRoIGFuZCBleHRyYSBhcmd1bWVudHMsIHdoaWNoIGlzIG5vdCBhbGxvd2VkLiIgPiY2O30KKyAgICAgIGZpCisgICAgICBhc19mbl9lcnJvciAkPyAiQ2Fubm90IGxvY2F0ZSB0aGUgdGhlIHBhdGggb2YgV0lOTEQiICIkTElORU5PIiA1CiAgICAgZmkKLSAgICBXSU5MRD0iJHRtcCIKKyAgZmkKKworICAjIEN5Z3dpbiB0cmllcyB0byBoaWRlIHNvbWUgYXNwZWN0cyBvZiB0aGUgV2luZG93cyBmaWxlIHN5c3RlbSwgc3VjaCB0aGF0IGJpbmFyaWVzIGFyZQorICAjIG5hbWVkIC5leGUgYnV0IGNhbGxlZCB3aXRob3V0IHRoYXQgc3VmZml4LiBUaGVyZWZvcmUsICJmb28iIGFuZCAiZm9vLmV4ZSIgYXJlIGNvbnNpZGVyZWQKKyAgIyB0aGUgc2FtZSBmaWxlLCBtb3N0IG9mIHRoZSB0aW1lIChhcyBpbiAidGVzdCAtZiIpLiBCdXQgbm90IHdoZW4gcnVubmluZyBjeWdwYXRoIC1zLCB0aGVuCisgICMgImZvby5leGUiIGlzIE9LIGJ1dCAiZm9vIiBpcyBhbiBlcnJvci4KKyAgIworICAjIFRoaXMgdGVzdCBpcyB0aGVyZWZvcmUgc2xpZ2h0bHkgbW9yZSBhY2N1cmF0ZSB0aGFuICJ0ZXN0IC1mIiB0byBjaGVjayBmb3IgZmlsZSBwcmVjZW5zZS4KKyAgIyBJdCBpcyBhbHNvIGEgd2F5IHRvIG1ha2Ugc3VyZSB3ZSBnb3QgdGhlIHByb3BlciBmaWxlIG5hbWUgZm9yIHRoZSByZWFsIHRlc3QgbGF0ZXIgb24uCisgIHRlc3Rfc2hvcnRwYXRoPWAkQ1lHUEFUSCAtcyAtbSAiJG5ld19wYXRoIiAyPiAvZGV2L251bGxgCisgIGlmIHRlc3QgIngkdGVzdF9zaG9ydHBhdGgiID0geDsgdGhlbgorICAgICMgU2hvcnQgcGF0aCBmYWlsZWQsIGZpbGUgZG9lcyBub3QgZXhpc3QgYXMgc3BlY2lmaWVkLgorICAgICMgVHJ5IGFkZGluZyAuZXhlIG9yIC5jbWQKKyAgICBpZiB0ZXN0IC1mICIke25ld19wYXRofS5leGUiOyB0aGVuCisgICAgICAgaW5wdXRfdG9fc2hvcnRwYXRoPSIke25ld19wYXRofS5leGUiCisgICAgZWxpZiB0ZXN0IC1mICIke25ld19wYXRofS5jbWQiOyB0aGVuCisgICAgICAgaW5wdXRfdG9fc2hvcnRwYXRoPSIke25ld19wYXRofS5jbWQiCisgICAgZWxzZQorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUaGUgcGF0aCBvZiBXSU5MRCwgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkbmV3X3BhdGhcIiwgaXMgaW52YWxpZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhlIHBhdGggb2YgV0lOTEQsIHdoaWNoIHJlc29sdmVzIGFzIFwiJG5ld19wYXRoXCIsIGlzIGludmFsaWQuIiA+JjY7fQorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBOZWl0aGVyIFwiJG5ld19wYXRoXCIgbm9yIFwiJG5ld19wYXRoLmV4ZS9jbWRcIiBjYW4gYmUgZm91bmQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogTmVpdGhlciBcIiRuZXdfcGF0aFwiIG5vciBcIiRuZXdfcGF0aC5leGUvY21kXCIgY2FuIGJlIGZvdW5kIiA+JjY7fQorICAgICAgYXNfZm5fZXJyb3IgJD8gIkNhbm5vdCBsb2NhdGUgdGhlIHRoZSBwYXRoIG9mIFdJTkxEIiAiJExJTkVOTyIgNQorICAgIGZpCisgIGVsc2UKKyAgICBpbnB1dF90b19zaG9ydHBhdGg9IiRuZXdfcGF0aCIKKyAgZmkKKworICAjIENhbGwgaGVscGVyIGZ1bmN0aW9uIHdoaWNoIHBvc3NpYmx5IGNvbnZlcnRzIHRoaXMgdXNpbmcgRE9TLXN0eWxlIHNob3J0IG1vZGUuCisgICMgSWYgc28sIHRoZSB1cGRhdGVkIHBhdGggaXMgc3RvcmVkIGluICRuZXdfcGF0aC4KKyAgbmV3X3BhdGg9IiRpbnB1dF90b19zaG9ydHBhdGgiCisKKyAgaW5wdXRfcGF0aD0iJGlucHV0X3RvX3Nob3J0cGF0aCIKKyAgIyBDaGVjayBpZiB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhpcyB1c2luZyBET1Mtc3R5bGUgc2hvcnQgbW9kZS4gSWYgdGhlIHBhdGgKKyAgIyBjb250YWlucyBqdXN0IHNpbXBsZSBjaGFyYWN0ZXJzLCB1c2UgaXQuIE90aGVyd2lzZSAoc3BhY2VzLCB3ZWlyZCBjaGFyYWN0ZXJzKSwKKyAgIyB0YWtlIG5vIGNoYW5jZXMgYW5kIHJld3JpdGUgaXQuCisgICMgTm90ZTogbTQgZWF0cyBvdXIgW10sIHNvIHdlIG5lZWQgdG8gdXNlIFsgYW5kIF0gaW5zdGVhZC4KKyAgaGFzX2ZvcmJpZGRlbl9jaGFycz1gJEVDSE8gIiRpbnB1dF9wYXRoIiB8ICRHUkVQIFteLS5fL2EtekEtWjAtOV1gCisgIGlmIHRlc3QgIngkaGFzX2ZvcmJpZGRlbl9jaGFycyIgIT0geDsgdGhlbgorICAgICMgTm93IGNvbnZlcnQgaXQgdG8gbWl4ZWQgRE9TLXN0eWxlLCBzaG9ydCBtb2RlIChubyBzcGFjZXMsIGFuZCAvIGluc3RlYWQgb2YgXCkKKyAgICBzaG9ydG1vZGVfcGF0aD1gJENZR1BBVEggLXMgLW0gLWEgIiRpbnB1dF9wYXRoImAKKyAgICBwYXRoX2FmdGVyX3Nob3J0bW9kZT1gJENZR1BBVEggLXUgIiRzaG9ydG1vZGVfcGF0aCJgCisgICAgaWYgdGVzdCAieCRwYXRoX2FmdGVyX3Nob3J0bW9kZSIgIT0gIngkaW5wdXRfdG9fc2hvcnRwYXRoIjsgdGhlbgorICAgICAgIyBHb2luZyB0byBzaG9ydCBtb2RlIGFuZCBiYWNrIGFnYWluIGRpZCBpbmRlZWQgbWF0dGVyLiBTaW5jZSBzaG9ydCBtb2RlIGlzCisgICAgICAjIGNhc2UgaW5zZW5zaXRpdmUsIGxldCdzIG1ha2UgaXQgbG93ZXJjYXNlIHRvIGltcHJvdmUgcmVhZGFiaWxpdHkuCisgICAgICBzaG9ydG1vZGVfcGF0aD1gJEVDSE8gIiRzaG9ydG1vZGVfcGF0aCIgfCAkVFIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAorICAgICAgIyBOb3cgY29udmVydCBpdCBiYWNrIHRvIFVuaXgtc3RpbGUgKGN5Z3BhdGgpCisgICAgICBpbnB1dF9wYXRoPWAkQ1lHUEFUSCAtdSAiJHNob3J0bW9kZV9wYXRoImAKKyAgICAgIG5ld19wYXRoPSIkaW5wdXRfcGF0aCIKKyAgICBmaQorICBmaQorCisgIHRlc3RfY3lnZHJpdmVfcHJlZml4PWAkRUNITyAkaW5wdXRfcGF0aCB8ICRHUkVQIF4vY3lnZHJpdmUvYAorICBpZiB0ZXN0ICJ4JHRlc3RfY3lnZHJpdmVfcHJlZml4IiA9IHg7IHRoZW4KKyAgICAjIEFzIGEgc2ltcGxlIGZpeCwgZXhjbHVkZSAvdXNyL2JpbiBzaW5jZSBpdCdzIG5vdCBhIHJlYWwgcGF0aC4KKyAgICBpZiB0ZXN0ICJ4YCRFQ0hPICRpbnB1dF90b19zaG9ydHBhdGggfCAkR1JFUCBeL3Vzci9iaW4vYCIgPSB4OyB0aGVuCisgICAgICAjIFRoZSBwYXRoIGlzIGluIGEgQ3lnd2luIHNwZWNpYWwgZGlyZWN0b3J5IChlLmcuIC9ob21lKS4gV2UgbmVlZCB0aGlzIGNvbnZlcnRlZCB0bworICAgICAgIyBhIHBhdGggcHJlZml4ZWQgYnkgL2N5Z2RyaXZlIGZvciBmaXhwYXRoIHRvIHdvcmsuCisgICAgICBuZXdfcGF0aD0iJENZR1dJTl9ST09UX1BBVEgkaW5wdXRfcGF0aCIKKyAgICBmaQorICBmaQorCisgICMgcmVtb3ZlIHRyYWlsaW5nIC5leGUgaWYgYW55CisgIG5ld19wYXRoPSIke25ld19wYXRoLyUuZXhlL30iCisKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorCisgICMgRmlyc3Qgc2VwYXJhdGUgdGhlIHBhdGggZnJvbSB0aGUgYXJndW1lbnRzLiBUaGlzIHdpbGwgc3BsaXQgYXQgdGhlIGZpcnN0CisgICMgc3BhY2UuCisgIGNvbXBsZXRlPSIkV0lOTEQiCisgIHBhdGg9IiR7Y29tcGxldGUlJSAqfSIKKyAgdG1wPSIkY29tcGxldGUgRU9MIgorICBhcmd1bWVudHM9IiR7dG1wIyogfSIKKworICAjIElucHV0IG1pZ2h0IGJlIGdpdmVuIGFzIFdpbmRvd3MgZm9ybWF0LCBzdGFydCBieSBjb252ZXJ0aW5nIHRvCisgICMgdW5peCBmb3JtYXQuCisgIG5ld19wYXRoPSIkcGF0aCIKKworICB3aW5kb3dzX3BhdGg9IiRuZXdfcGF0aCIKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJENZR1BBVEggLXUgIiR3aW5kb3dzX3BhdGgiYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBlbGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLm1zeXMiOyB0aGVuCisgICAgdW5peF9wYXRoPWAkRUNITyAiJHdpbmRvd3NfcGF0aCIgfCAkU0VEIC1lICdzLF5cXCguXFwpOiwvXFwxLGcnIC1lICdzLFxcXFwsLyxnJ2AKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZmkKKworCisgICMgTm93IHRyeSB0byBsb2NhdGUgZXhlY3V0YWJsZSB1c2luZyB3aGljaAorICBuZXdfcGF0aD1gJFdISUNIICIkbmV3X3BhdGgiIDI+IC9kZXYvbnVsbGAKKworICBpZiB0ZXN0ICJ4JG5ld19wYXRoIiA9IHg7IHRoZW4KKyAgICAjIE9vcHMuIFdoaWNoIGRpZG4ndCBmaW5kIHRoZSBleGVjdXRhYmxlLgorICAgICMgVGhlIHNwbGl0dGluZyBvZiBhcmd1bWVudHMgZnJvbSB0aGUgZXhlY3V0YWJsZSBhdCBhIHNwYWNlIG1pZ2h0IGhhdmUgYmVlbiBpbmNvcnJlY3QsCisgICAgIyBzaW5jZSBwYXRocyB3aXRoIHNwYWNlIGFyZSBtb3JlIGxpa2VseSBpbiBXaW5kb3dzLiBHaXZlIGl0IGFub3RoZXIgdHJ5IHdpdGggdGhlIHdob2xlCisgICAgIyBhcmd1bWVudC4KKyAgICBwYXRoPSIkY29tcGxldGUiCisgICAgYXJndW1lbnRzPSJFT0wiCisgICAgbmV3X3BhdGg9IiRwYXRoIgorCisgIHdpbmRvd3NfcGF0aD0iJG5ld19wYXRoIgorICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5jeWd3aW4iOyB0aGVuCisgICAgdW5peF9wYXRoPWAkQ1lHUEFUSCAtdSAiJHdpbmRvd3NfcGF0aCJgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGVsaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MubXN5cyI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRFQ0hPICIkd2luZG93c19wYXRoIiB8ICRTRUQgLWUgJ3MsXlxcKC5cXCk6LC9cXDEsZycgLWUgJ3MsXFxcXCwvLGcnYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBmaQorCisKKyAgICBuZXdfcGF0aD1gJFdISUNIICIkbmV3X3BhdGgiIDI+IC9kZXYvbnVsbGAKKworICAgIGlmIHRlc3QgIngkbmV3X3BhdGgiID0geDsgdGhlbgorICAgICAgIyBJdCdzIHN0aWxsIG5vdCBmb3VuZC4gTm93IHRoaXMgaXMgYW4gdW5yZWNvdmVyYWJsZSBlcnJvci4KKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGhlIHBhdGggb2YgV0lOTEQsIHdoaWNoIHJlc29sdmVzIGFzIFwiJGNvbXBsZXRlXCIsIGlzIG5vdCBmb3VuZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhlIHBhdGggb2YgV0lOTEQsIHdoaWNoIHJlc29sdmVzIGFzIFwiJGNvbXBsZXRlXCIsIGlzIG5vdCBmb3VuZC4iID4mNjt9CisgICAgICBoYXNfc3BhY2U9YCRFQ0hPICIkY29tcGxldGUiIHwgJEdSRVAgIiAiYAorICAgICAgaWYgdGVzdCAieCRoYXNfc3BhY2UiICE9IHg7IHRoZW4KKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBZb3UgbWlnaHQgYmUgbWl4aW5nIHNwYWNlcyBpbiB0aGUgcGF0aCBhbmQgZXh0cmEgYXJndW1lbnRzLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogWW91IG1pZ2h0IGJlIG1peGluZyBzcGFjZXMgaW4gdGhlIHBhdGggYW5kIGV4dHJhIGFyZ3VtZW50cywgd2hpY2ggaXMgbm90IGFsbG93ZWQuIiA+JjY7fQorICAgICAgZmkKKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJDYW5ub3QgbG9jYXRlIHRoZSB0aGUgcGF0aCBvZiBXSU5MRCIgIiRMSU5FTk8iIDUKKyAgICBmaQorICBmaQorCisgICMgTm93IG5ld19wYXRoIGhhcyBhIGNvbXBsZXRlIHVuaXggcGF0aCB0byB0aGUgYmluYXJ5CisgIGlmIHRlc3QgInhgJEVDSE8gJG5ld19wYXRoIHwgJEdSRVAgXi9iaW4vYCIgIT0geDsgdGhlbgorICAgICMgS2VlcCBwYXRocyBpbiAvYmluIGFzLWlzLCBidXQgcmVtb3ZlIHRyYWlsaW5nIC5leGUgaWYgYW55CisgICAgbmV3X3BhdGg9IiR7bmV3X3BhdGgvJS5leGUvfSIKKyAgICAjIERvIG5vdCBzYXZlIC9iaW4gcGF0aHMgdG8gYWxsX2ZpeHBhdGhfcHJlZml4ZXMhCisgIGVsc2UKKyAgICAjIE5vdCBpbiBtaXhlZCBvciBXaW5kb3dzIHN0eWxlLCBzdGFydCBieSB0aGF0LgorICAgIG5ld19wYXRoPWBjbWQgLy9jIGVjaG8gJG5ld19wYXRoYAorCisgIGlucHV0X3BhdGg9IiRuZXdfcGF0aCIKKyAgIyBDaGVjayBpZiB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhpcyB1c2luZyBET1Mtc3R5bGUgc2hvcnQgbW9kZS4gSWYgdGhlIHBhdGgKKyAgIyBjb250YWlucyBqdXN0IHNpbXBsZSBjaGFyYWN0ZXJzLCB1c2UgaXQuIE90aGVyd2lzZSAoc3BhY2VzLCB3ZWlyZCBjaGFyYWN0ZXJzKSwKKyAgIyB0YWtlIG5vIGNoYW5jZXMgYW5kIHJld3JpdGUgaXQuCisgICMgTm90ZTogbTQgZWF0cyBvdXIgW10sIHNvIHdlIG5lZWQgdG8gdXNlIFsgYW5kIF0gaW5zdGVhZC4KKyAgaGFzX2ZvcmJpZGRlbl9jaGFycz1gJEVDSE8gIiRpbnB1dF9wYXRoIiB8ICRHUkVQIFteLV8vOmEtekEtWjAtOV1gCisgIGlmIHRlc3QgIngkaGFzX2ZvcmJpZGRlbl9jaGFycyIgIT0geDsgdGhlbgorICAgICMgTm93IGNvbnZlcnQgaXQgdG8gbWl4ZWQgRE9TLXN0eWxlLCBzaG9ydCBtb2RlIChubyBzcGFjZXMsIGFuZCAvIGluc3RlYWQgb2YgXCkKKyAgICBuZXdfcGF0aD1gY21kIC9jICJmb3IgJUEgaW4gKFwiJGlucHV0X3BhdGhcIikgZG8gQGVjaG8gJX5zQSJ8JFRSIFxcXFxcXFxcIC8gfCAkVFIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAorICBmaQorCisgICAgIyBPdXRwdXQgaXMgaW4gJG5ld19wYXRoCisKKyAgd2luZG93c19wYXRoPSIkbmV3X3BhdGgiCisgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLmN5Z3dpbiI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRDWUdQQVRIIC11ICIkd2luZG93c19wYXRoImAKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJEVDSE8gIiR3aW5kb3dzX3BhdGgiIHwgJFNFRCAtZSAncyxeXFwoLlxcKTosL1xcMSxnJyAtZSAncyxcXFxcLC8sZydgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGZpCisKKyAgICAjIHJlbW92ZSB0cmFpbGluZyAuZXhlIGlmIGFueQorICAgIG5ld19wYXRoPSIke25ld19wYXRoLyUuZXhlL30iCisKKyAgICAjIFNhdmUgdGhlIGZpcnN0IDEwIGJ5dGVzIG9mIHRoaXMgcGF0aCB0byB0aGUgc3RvcmFnZSwgc28gZml4cGF0aCBjYW4gd29yay4KKyAgICBhbGxfZml4cGF0aF9wcmVmaXhlcz0oIiR7YWxsX2ZpeHBhdGhfcHJlZml4ZXNbQF19IiAiJHtuZXdfcGF0aDowOjEwfSIpCisgIGZpCisKKyAgZWxzZQorICAgICMgV2UncmUgb24gYSBwb3NpeCBwbGF0Zm9ybS4gSG9vcmF5ISA6KQorICAgICMgRmlyc3Qgc2VwYXJhdGUgdGhlIHBhdGggZnJvbSB0aGUgYXJndW1lbnRzLiBUaGlzIHdpbGwgc3BsaXQgYXQgdGhlIGZpcnN0CisgICAgIyBzcGFjZS4KKyAgICBjb21wbGV0ZT0iJFdJTkxEIgorICAgIHBhdGg9IiR7Y29tcGxldGUlJSAqfSIKKyAgICB0bXA9IiRjb21wbGV0ZSBFT0wiCisgICAgYXJndW1lbnRzPSIke3RtcCMqIH0iCisKKyAgICBuZXdfcGF0aD1gJFdISUNIICRwYXRoIDI+IC9kZXYvbnVsbGAKKyAgICBpZiB0ZXN0ICJ4JG5ld19wYXRoIiA9IHg7IHRoZW4KKyAgICAgIGlzX2Fic29sdXRlX3BhdGg9YCRFQ0hPICIkcGF0aCIgfCAkR1JFUCBeL2AKKyAgICAgIGlmIHRlc3QgIngkaXNfYWJzb2x1dGVfcGF0aCIgIT0geDsgdGhlbgorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFJlc29sdmluZyBXSU5MRCAoYXMgJHBhdGgpIHdpdGggJ3doaWNoJyBmYWlsZWQsIHVzaW5nICRwYXRoIGRpcmVjdGx5LiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBSZXNvbHZpbmcgV0lOTEQgKGFzICRwYXRoKSB3aXRoICd3aGljaCcgZmFpbGVkLCB1c2luZyAkcGF0aCBkaXJlY3RseS4iID4mNjt9CisgICAgICAgIG5ld19wYXRoPSIkcGF0aCIKKyAgICAgIGVsc2UKKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUaGUgcGF0aCBvZiBXSU5MRCwgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkY29tcGxldGVcIiwgaXMgbm90IGZvdW5kLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUaGUgcGF0aCBvZiBXSU5MRCwgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkY29tcGxldGVcIiwgaXMgbm90IGZvdW5kLiIgPiY2O30KKyAgICAgICAgaGFzX3NwYWNlPWAkRUNITyAiJGNvbXBsZXRlIiB8ICRHUkVQICIgImAKKyAgICAgICAgaWYgdGVzdCAieCRoYXNfc3BhY2UiICE9IHg7IHRoZW4KKyAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoaXMgbWlnaHQgYmUgY2F1c2VkIGJ5IHNwYWNlcyBpbiB0aGUgcGF0aCwgd2hpY2ggaXMgbm90IGFsbG93ZWQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoaXMgbWlnaHQgYmUgY2F1c2VkIGJ5IHNwYWNlcyBpbiB0aGUgcGF0aCwgd2hpY2ggaXMgbm90IGFsbG93ZWQuIiA+JjY7fQorICAgICAgICBmaQorICAgICAgICBhc19mbl9lcnJvciAkPyAiQ2Fubm90IGxvY2F0ZSB0aGUgdGhlIHBhdGggb2YgV0lOTEQiICIkTElORU5PIiA1CisgICAgICBmaQorICAgIGZpCisgIGZpCisKKyAgIyBOb3cgam9pbiB0b2dldGhlciB0aGUgcGF0aCBhbmQgdGhlIGFyZ3VtZW50cyBvbmNlIGFnYWluCisgIGlmIHRlc3QgIngkYXJndW1lbnRzIiAhPSB4RU9MOyB0aGVuCisgICAgICBuZXdfY29tcGxldGU9IiRuZXdfcGF0aCAke2FyZ3VtZW50cyUgKn0iCisgIGVsc2UKKyAgICAgIG5ld19jb21wbGV0ZT0iJG5ld19wYXRoIgorICBmaQorCisgIGlmIHRlc3QgIngkY29tcGxldGUiICE9ICJ4JG5ld19jb21wbGV0ZSI7IHRoZW4KKyAgICBXSU5MRD0iJG5ld19jb21wbGV0ZSIKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFJld3JpdGluZyBXSU5MRCB0byBcIiRuZXdfY29tcGxldGVcIiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBSZXdyaXRpbmcgV0lOTEQgdG8gXCIkbmV3X2NvbXBsZXRlXCIiID4mNjt9CisgIGZpCiAKICAgICBwcmludGYgIldpbmRvd3MgbGlua2VyIHdhcyBmb3VuZCBhdCAkV0lOTERcbiIKICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmIHRoZSBmb3VuZCBsaW5rLmV4ZSBpcyBhY3R1YWxseSB0aGUgVmlzdWFsIFN0dWRpbyBsaW5rZXIiID4mNQpAQCAtMTI3MzUsMjUgKzIxMzMwLDI0NSBAQAogCiAKIAotICAgICMgVHJhbnNsYXRlIGxvbmcgY3lnZHJpdmUgb3IgQzpcc2Rmc2YgcGF0aAotICAgICMgaW50byBhIHNob3J0IG1peGVkIG1vZGUgcGF0aCB0aGF0IGhhcyBubwotICAgICMgc3BhY2VzIGluIGl0LgotICAgIHRtcD0iJE1UIgorICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5jeWd3aW4iOyB0aGVuCiAKLSAgICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1MiID0gInh3aW5kb3dzIjsgdGhlbgotICAgICAgICB0bXA9YCRDWUdQQVRIIC11ICIkTVQiYAotICAgICAgICB0bXA9YHdoaWNoICIkdG1wImAKLSAgICAgICAgIyBJZiBmaWxlIGV4aXN0cyB3aXRoIC5leGUgYXBwZW5kZWQsIHRoYXQncyB0aGUgcmVhbCBmaWxlbmFtZQotICAgICAgICAjIGFuZCBjeWdwYXRoIG5lZWRzIHRoYXQgdG8gY29udmVydCB0byBzaG9ydCBzdHlsZSBwYXRoLgotICAgICAgICBpZiB0ZXN0IC1mICIke3RtcH0uZXhlIjsgdGhlbgotICAgICAgICAgICB0bXA9IiR7dG1wfS5leGUiCi0gICAgICAgIGVsaWYgdGVzdCAtZiAiJHt0bXB9LmNtZCI7IHRoZW4KLSAgICAgICAgICAgdG1wPSIke3RtcH0uY21kIgotICAgICAgICBmaQotICAgICAgICAjIENvbnZlcnQgdG8gQzovIG1peGVkIHN0eWxlIHBhdGggd2l0aG91dCBzcGFjZXMuCi0gICAgICAgICB0bXA9YCRDWUdQQVRIIC1zIC1tICIkdG1wImAKKyAgIyBGaXJzdCBzZXBhcmF0ZSB0aGUgcGF0aCBmcm9tIHRoZSBhcmd1bWVudHMuIFRoaXMgd2lsbCBzcGxpdCBhdCB0aGUgZmlyc3QKKyAgIyBzcGFjZS4KKyAgY29tcGxldGU9IiRNVCIKKyAgcGF0aD0iJHtjb21wbGV0ZSUlICp9IgorICB0bXA9IiRjb21wbGV0ZSBFT0wiCisgIGFyZ3VtZW50cz0iJHt0bXAjKiB9IgorCisgICMgSW5wdXQgbWlnaHQgYmUgZ2l2ZW4gYXMgV2luZG93cyBmb3JtYXQsIHN0YXJ0IGJ5IGNvbnZlcnRpbmcgdG8KKyAgIyB1bml4IGZvcm1hdC4KKyAgbmV3X3BhdGg9YCRDWUdQQVRIIC11ICIkcGF0aCJgCisKKyAgIyBOb3cgdHJ5IHRvIGxvY2F0ZSBleGVjdXRhYmxlIHVzaW5nIHdoaWNoCisgIG5ld19wYXRoPWAkV0hJQ0ggIiRuZXdfcGF0aCIgMj4gL2Rldi9udWxsYAorICBpZiB0ZXN0ICJ4JG5ld19wYXRoIiA9IHg7IHRoZW4KKyAgICAjIE9vcHMuIFdoaWNoIGRpZG4ndCBmaW5kIHRoZSBleGVjdXRhYmxlLgorICAgICMgVGhlIHNwbGl0dGluZyBvZiBhcmd1bWVudHMgZnJvbSB0aGUgZXhlY3V0YWJsZSBhdCBhIHNwYWNlIG1pZ2h0IGhhdmUgYmVlbiBpbmNvcnJlY3QsCisgICAgIyBzaW5jZSBwYXRocyB3aXRoIHNwYWNlIGFyZSBtb3JlIGxpa2VseSBpbiBXaW5kb3dzLiBHaXZlIGl0IGFub3RoZXIgdHJ5IHdpdGggdGhlIHdob2xlCisgICAgIyBhcmd1bWVudC4KKyAgICBwYXRoPSIkY29tcGxldGUiCisgICAgYXJndW1lbnRzPSJFT0wiCisgICAgbmV3X3BhdGg9YCRDWUdQQVRIIC11ICIkcGF0aCJgCisgICAgbmV3X3BhdGg9YCRXSElDSCAiJG5ld19wYXRoIiAyPiAvZGV2L251bGxgCisgICAgaWYgdGVzdCAieCRuZXdfcGF0aCIgPSB4OyB0aGVuCisgICAgICAjIEl0J3Mgc3RpbGwgbm90IGZvdW5kLiBOb3cgdGhpcyBpcyBhbiB1bnJlY292ZXJhYmxlIGVycm9yLgorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUaGUgcGF0aCBvZiBNVCwgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkY29tcGxldGVcIiwgaXMgbm90IGZvdW5kLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUaGUgcGF0aCBvZiBNVCwgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkY29tcGxldGVcIiwgaXMgbm90IGZvdW5kLiIgPiY2O30KKyAgICAgIGhhc19zcGFjZT1gJEVDSE8gIiRjb21wbGV0ZSIgfCAkR1JFUCAiICJgCisgICAgICBpZiB0ZXN0ICJ4JGhhc19zcGFjZSIgIT0geDsgdGhlbgorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFlvdSBtaWdodCBiZSBtaXhpbmcgc3BhY2VzIGluIHRoZSBwYXRoIGFuZCBleHRyYSBhcmd1bWVudHMsIHdoaWNoIGlzIG5vdCBhbGxvd2VkLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBZb3UgbWlnaHQgYmUgbWl4aW5nIHNwYWNlcyBpbiB0aGUgcGF0aCBhbmQgZXh0cmEgYXJndW1lbnRzLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iID4mNjt9CisgICAgICBmaQorICAgICAgYXNfZm5fZXJyb3IgJD8gIkNhbm5vdCBsb2NhdGUgdGhlIHRoZSBwYXRoIG9mIE1UIiAiJExJTkVOTyIgNQogICAgIGZpCi0gICAgTVQ9IiR0bXAiCisgIGZpCisKKyAgIyBDeWd3aW4gdHJpZXMgdG8gaGlkZSBzb21lIGFzcGVjdHMgb2YgdGhlIFdpbmRvd3MgZmlsZSBzeXN0ZW0sIHN1Y2ggdGhhdCBiaW5hcmllcyBhcmUKKyAgIyBuYW1lZCAuZXhlIGJ1dCBjYWxsZWQgd2l0aG91dCB0aGF0IHN1ZmZpeC4gVGhlcmVmb3JlLCAiZm9vIiBhbmQgImZvby5leGUiIGFyZSBjb25zaWRlcmVkCisgICMgdGhlIHNhbWUgZmlsZSwgbW9zdCBvZiB0aGUgdGltZSAoYXMgaW4gInRlc3QgLWYiKS4gQnV0IG5vdCB3aGVuIHJ1bm5pbmcgY3lncGF0aCAtcywgdGhlbgorICAjICJmb28uZXhlIiBpcyBPSyBidXQgImZvbyIgaXMgYW4gZXJyb3IuCisgICMKKyAgIyBUaGlzIHRlc3QgaXMgdGhlcmVmb3JlIHNsaWdodGx5IG1vcmUgYWNjdXJhdGUgdGhhbiAidGVzdCAtZiIgdG8gY2hlY2sgZm9yIGZpbGUgcHJlY2Vuc2UuCisgICMgSXQgaXMgYWxzbyBhIHdheSB0byBtYWtlIHN1cmUgd2UgZ290IHRoZSBwcm9wZXIgZmlsZSBuYW1lIGZvciB0aGUgcmVhbCB0ZXN0IGxhdGVyIG9uLgorICB0ZXN0X3Nob3J0cGF0aD1gJENZR1BBVEggLXMgLW0gIiRuZXdfcGF0aCIgMj4gL2Rldi9udWxsYAorICBpZiB0ZXN0ICJ4JHRlc3Rfc2hvcnRwYXRoIiA9IHg7IHRoZW4KKyAgICAjIFNob3J0IHBhdGggZmFpbGVkLCBmaWxlIGRvZXMgbm90IGV4aXN0IGFzIHNwZWNpZmllZC4KKyAgICAjIFRyeSBhZGRpbmcgLmV4ZSBvciAuY21kCisgICAgaWYgdGVzdCAtZiAiJHtuZXdfcGF0aH0uZXhlIjsgdGhlbgorICAgICAgIGlucHV0X3RvX3Nob3J0cGF0aD0iJHtuZXdfcGF0aH0uZXhlIgorICAgIGVsaWYgdGVzdCAtZiAiJHtuZXdfcGF0aH0uY21kIjsgdGhlbgorICAgICAgIGlucHV0X3RvX3Nob3J0cGF0aD0iJHtuZXdfcGF0aH0uY21kIgorICAgIGVsc2UKKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGhlIHBhdGggb2YgTVQsIHdoaWNoIHJlc29sdmVzIGFzIFwiJG5ld19wYXRoXCIsIGlzIGludmFsaWQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoZSBwYXRoIG9mIE1ULCB3aGljaCByZXNvbHZlcyBhcyBcIiRuZXdfcGF0aFwiLCBpcyBpbnZhbGlkLiIgPiY2O30KKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogTmVpdGhlciBcIiRuZXdfcGF0aFwiIG5vciBcIiRuZXdfcGF0aC5leGUvY21kXCIgY2FuIGJlIGZvdW5kIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IE5laXRoZXIgXCIkbmV3X3BhdGhcIiBub3IgXCIkbmV3X3BhdGguZXhlL2NtZFwiIGNhbiBiZSBmb3VuZCIgPiY2O30KKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJDYW5ub3QgbG9jYXRlIHRoZSB0aGUgcGF0aCBvZiBNVCIgIiRMSU5FTk8iIDUKKyAgICBmaQorICBlbHNlCisgICAgaW5wdXRfdG9fc2hvcnRwYXRoPSIkbmV3X3BhdGgiCisgIGZpCisKKyAgIyBDYWxsIGhlbHBlciBmdW5jdGlvbiB3aGljaCBwb3NzaWJseSBjb252ZXJ0cyB0aGlzIHVzaW5nIERPUy1zdHlsZSBzaG9ydCBtb2RlLgorICAjIElmIHNvLCB0aGUgdXBkYXRlZCBwYXRoIGlzIHN0b3JlZCBpbiAkbmV3X3BhdGguCisgIG5ld19wYXRoPSIkaW5wdXRfdG9fc2hvcnRwYXRoIgorCisgIGlucHV0X3BhdGg9IiRpbnB1dF90b19zaG9ydHBhdGgiCisgICMgQ2hlY2sgaWYgd2UgbmVlZCB0byBjb252ZXJ0IHRoaXMgdXNpbmcgRE9TLXN0eWxlIHNob3J0IG1vZGUuIElmIHRoZSBwYXRoCisgICMgY29udGFpbnMganVzdCBzaW1wbGUgY2hhcmFjdGVycywgdXNlIGl0LiBPdGhlcndpc2UgKHNwYWNlcywgd2VpcmQgY2hhcmFjdGVycyksCisgICMgdGFrZSBubyBjaGFuY2VzIGFuZCByZXdyaXRlIGl0LgorICAjIE5vdGU6IG00IGVhdHMgb3VyIFtdLCBzbyB3ZSBuZWVkIHRvIHVzZSBbIGFuZCBdIGluc3RlYWQuCisgIGhhc19mb3JiaWRkZW5fY2hhcnM9YCRFQ0hPICIkaW5wdXRfcGF0aCIgfCAkR1JFUCBbXi0uXy9hLXpBLVowLTldYAorICBpZiB0ZXN0ICJ4JGhhc19mb3JiaWRkZW5fY2hhcnMiICE9IHg7IHRoZW4KKyAgICAjIE5vdyBjb252ZXJ0IGl0IHRvIG1peGVkIERPUy1zdHlsZSwgc2hvcnQgbW9kZSAobm8gc3BhY2VzLCBhbmQgLyBpbnN0ZWFkIG9mIFwpCisgICAgc2hvcnRtb2RlX3BhdGg9YCRDWUdQQVRIIC1zIC1tIC1hICIkaW5wdXRfcGF0aCJgCisgICAgcGF0aF9hZnRlcl9zaG9ydG1vZGU9YCRDWUdQQVRIIC11ICIkc2hvcnRtb2RlX3BhdGgiYAorICAgIGlmIHRlc3QgIngkcGF0aF9hZnRlcl9zaG9ydG1vZGUiICE9ICJ4JGlucHV0X3RvX3Nob3J0cGF0aCI7IHRoZW4KKyAgICAgICMgR29pbmcgdG8gc2hvcnQgbW9kZSBhbmQgYmFjayBhZ2FpbiBkaWQgaW5kZWVkIG1hdHRlci4gU2luY2Ugc2hvcnQgbW9kZSBpcworICAgICAgIyBjYXNlIGluc2Vuc2l0aXZlLCBsZXQncyBtYWtlIGl0IGxvd2VyY2FzZSB0byBpbXByb3ZlIHJlYWRhYmlsaXR5LgorICAgICAgc2hvcnRtb2RlX3BhdGg9YCRFQ0hPICIkc2hvcnRtb2RlX3BhdGgiIHwgJFRSICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J2AKKyAgICAgICMgTm93IGNvbnZlcnQgaXQgYmFjayB0byBVbml4LXN0aWxlIChjeWdwYXRoKQorICAgICAgaW5wdXRfcGF0aD1gJENZR1BBVEggLXUgIiRzaG9ydG1vZGVfcGF0aCJgCisgICAgICBuZXdfcGF0aD0iJGlucHV0X3BhdGgiCisgICAgZmkKKyAgZmkKKworICB0ZXN0X2N5Z2RyaXZlX3ByZWZpeD1gJEVDSE8gJGlucHV0X3BhdGggfCAkR1JFUCBeL2N5Z2RyaXZlL2AKKyAgaWYgdGVzdCAieCR0ZXN0X2N5Z2RyaXZlX3ByZWZpeCIgPSB4OyB0aGVuCisgICAgIyBBcyBhIHNpbXBsZSBmaXgsIGV4Y2x1ZGUgL3Vzci9iaW4gc2luY2UgaXQncyBub3QgYSByZWFsIHBhdGguCisgICAgaWYgdGVzdCAieGAkRUNITyAkaW5wdXRfdG9fc2hvcnRwYXRoIHwgJEdSRVAgXi91c3IvYmluL2AiID0geDsgdGhlbgorICAgICAgIyBUaGUgcGF0aCBpcyBpbiBhIEN5Z3dpbiBzcGVjaWFsIGRpcmVjdG9yeSAoZS5nLiAvaG9tZSkuIFdlIG5lZWQgdGhpcyBjb252ZXJ0ZWQgdG8KKyAgICAgICMgYSBwYXRoIHByZWZpeGVkIGJ5IC9jeWdkcml2ZSBmb3IgZml4cGF0aCB0byB3b3JrLgorICAgICAgbmV3X3BhdGg9IiRDWUdXSU5fUk9PVF9QQVRIJGlucHV0X3BhdGgiCisgICAgZmkKKyAgZmkKKworICAjIHJlbW92ZSB0cmFpbGluZyAuZXhlIGlmIGFueQorICBuZXdfcGF0aD0iJHtuZXdfcGF0aC8lLmV4ZS99IgorCisgIGVsaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MubXN5cyI7IHRoZW4KKworICAjIEZpcnN0IHNlcGFyYXRlIHRoZSBwYXRoIGZyb20gdGhlIGFyZ3VtZW50cy4gVGhpcyB3aWxsIHNwbGl0IGF0IHRoZSBmaXJzdAorICAjIHNwYWNlLgorICBjb21wbGV0ZT0iJE1UIgorICBwYXRoPSIke2NvbXBsZXRlJSUgKn0iCisgIHRtcD0iJGNvbXBsZXRlIEVPTCIKKyAgYXJndW1lbnRzPSIke3RtcCMqIH0iCisKKyAgIyBJbnB1dCBtaWdodCBiZSBnaXZlbiBhcyBXaW5kb3dzIGZvcm1hdCwgc3RhcnQgYnkgY29udmVydGluZyB0bworICAjIHVuaXggZm9ybWF0LgorICBuZXdfcGF0aD0iJHBhdGgiCisKKyAgd2luZG93c19wYXRoPSIkbmV3X3BhdGgiCisgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLmN5Z3dpbiI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRDWUdQQVRIIC11ICIkd2luZG93c19wYXRoImAKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJEVDSE8gIiR3aW5kb3dzX3BhdGgiIHwgJFNFRCAtZSAncyxeXFwoLlxcKTosL1xcMSxnJyAtZSAncyxcXFxcLC8sZydgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGZpCisKKworICAjIE5vdyB0cnkgdG8gbG9jYXRlIGV4ZWN1dGFibGUgdXNpbmcgd2hpY2gKKyAgbmV3X3BhdGg9YCRXSElDSCAiJG5ld19wYXRoIiAyPiAvZGV2L251bGxgCisKKyAgaWYgdGVzdCAieCRuZXdfcGF0aCIgPSB4OyB0aGVuCisgICAgIyBPb3BzLiBXaGljaCBkaWRuJ3QgZmluZCB0aGUgZXhlY3V0YWJsZS4KKyAgICAjIFRoZSBzcGxpdHRpbmcgb2YgYXJndW1lbnRzIGZyb20gdGhlIGV4ZWN1dGFibGUgYXQgYSBzcGFjZSBtaWdodCBoYXZlIGJlZW4gaW5jb3JyZWN0LAorICAgICMgc2luY2UgcGF0aHMgd2l0aCBzcGFjZSBhcmUgbW9yZSBsaWtlbHkgaW4gV2luZG93cy4gR2l2ZSBpdCBhbm90aGVyIHRyeSB3aXRoIHRoZSB3aG9sZQorICAgICMgYXJndW1lbnQuCisgICAgcGF0aD0iJGNvbXBsZXRlIgorICAgIGFyZ3VtZW50cz0iRU9MIgorICAgIG5ld19wYXRoPSIkcGF0aCIKKworICB3aW5kb3dzX3BhdGg9IiRuZXdfcGF0aCIKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJENZR1BBVEggLXUgIiR3aW5kb3dzX3BhdGgiYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBlbGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLm1zeXMiOyB0aGVuCisgICAgdW5peF9wYXRoPWAkRUNITyAiJHdpbmRvd3NfcGF0aCIgfCAkU0VEIC1lICdzLF5cXCguXFwpOiwvXFwxLGcnIC1lICdzLFxcXFwsLyxnJ2AKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZmkKKworCisgICAgbmV3X3BhdGg9YCRXSElDSCAiJG5ld19wYXRoIiAyPiAvZGV2L251bGxgCisKKyAgICBpZiB0ZXN0ICJ4JG5ld19wYXRoIiA9IHg7IHRoZW4KKyAgICAgICMgSXQncyBzdGlsbCBub3QgZm91bmQuIE5vdyB0aGlzIGlzIGFuIHVucmVjb3ZlcmFibGUgZXJyb3IuCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSBwYXRoIG9mIE1ULCB3aGljaCByZXNvbHZlcyBhcyBcIiRjb21wbGV0ZVwiLCBpcyBub3QgZm91bmQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoZSBwYXRoIG9mIE1ULCB3aGljaCByZXNvbHZlcyBhcyBcIiRjb21wbGV0ZVwiLCBpcyBub3QgZm91bmQuIiA+JjY7fQorICAgICAgaGFzX3NwYWNlPWAkRUNITyAiJGNvbXBsZXRlIiB8ICRHUkVQICIgImAKKyAgICAgIGlmIHRlc3QgIngkaGFzX3NwYWNlIiAhPSB4OyB0aGVuCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogWW91IG1pZ2h0IGJlIG1peGluZyBzcGFjZXMgaW4gdGhlIHBhdGggYW5kIGV4dHJhIGFyZ3VtZW50cywgd2hpY2ggaXMgbm90IGFsbG93ZWQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFlvdSBtaWdodCBiZSBtaXhpbmcgc3BhY2VzIGluIHRoZSBwYXRoIGFuZCBleHRyYSBhcmd1bWVudHMsIHdoaWNoIGlzIG5vdCBhbGxvd2VkLiIgPiY2O30KKyAgICAgIGZpCisgICAgICBhc19mbl9lcnJvciAkPyAiQ2Fubm90IGxvY2F0ZSB0aGUgdGhlIHBhdGggb2YgTVQiICIkTElORU5PIiA1CisgICAgZmkKKyAgZmkKKworICAjIE5vdyBuZXdfcGF0aCBoYXMgYSBjb21wbGV0ZSB1bml4IHBhdGggdG8gdGhlIGJpbmFyeQorICBpZiB0ZXN0ICJ4YCRFQ0hPICRuZXdfcGF0aCB8ICRHUkVQIF4vYmluL2AiICE9IHg7IHRoZW4KKyAgICAjIEtlZXAgcGF0aHMgaW4gL2JpbiBhcy1pcywgYnV0IHJlbW92ZSB0cmFpbGluZyAuZXhlIGlmIGFueQorICAgIG5ld19wYXRoPSIke25ld19wYXRoLyUuZXhlL30iCisgICAgIyBEbyBub3Qgc2F2ZSAvYmluIHBhdGhzIHRvIGFsbF9maXhwYXRoX3ByZWZpeGVzIQorICBlbHNlCisgICAgIyBOb3QgaW4gbWl4ZWQgb3IgV2luZG93cyBzdHlsZSwgc3RhcnQgYnkgdGhhdC4KKyAgICBuZXdfcGF0aD1gY21kIC8vYyBlY2hvICRuZXdfcGF0aGAKKworICBpbnB1dF9wYXRoPSIkbmV3X3BhdGgiCisgICMgQ2hlY2sgaWYgd2UgbmVlZCB0byBjb252ZXJ0IHRoaXMgdXNpbmcgRE9TLXN0eWxlIHNob3J0IG1vZGUuIElmIHRoZSBwYXRoCisgICMgY29udGFpbnMganVzdCBzaW1wbGUgY2hhcmFjdGVycywgdXNlIGl0LiBPdGhlcndpc2UgKHNwYWNlcywgd2VpcmQgY2hhcmFjdGVycyksCisgICMgdGFrZSBubyBjaGFuY2VzIGFuZCByZXdyaXRlIGl0LgorICAjIE5vdGU6IG00IGVhdHMgb3VyIFtdLCBzbyB3ZSBuZWVkIHRvIHVzZSBbIGFuZCBdIGluc3RlYWQuCisgIGhhc19mb3JiaWRkZW5fY2hhcnM9YCRFQ0hPICIkaW5wdXRfcGF0aCIgfCAkR1JFUCBbXi1fLzphLXpBLVowLTldYAorICBpZiB0ZXN0ICJ4JGhhc19mb3JiaWRkZW5fY2hhcnMiICE9IHg7IHRoZW4KKyAgICAjIE5vdyBjb252ZXJ0IGl0IHRvIG1peGVkIERPUy1zdHlsZSwgc2hvcnQgbW9kZSAobm8gc3BhY2VzLCBhbmQgLyBpbnN0ZWFkIG9mIFwpCisgICAgbmV3X3BhdGg9YGNtZCAvYyAiZm9yICVBIGluIChcIiRpbnB1dF9wYXRoXCIpIGRvIEBlY2hvICV+c0EifCRUUiBcXFxcXFxcXCAvIHwgJFRSICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J2AKKyAgZmkKKworICAgICMgT3V0cHV0IGlzIGluICRuZXdfcGF0aAorCisgIHdpbmRvd3NfcGF0aD0iJG5ld19wYXRoIgorICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5jeWd3aW4iOyB0aGVuCisgICAgdW5peF9wYXRoPWAkQ1lHUEFUSCAtdSAiJHdpbmRvd3NfcGF0aCJgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGVsaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MubXN5cyI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRFQ0hPICIkd2luZG93c19wYXRoIiB8ICRTRUQgLWUgJ3MsXlxcKC5cXCk6LC9cXDEsZycgLWUgJ3MsXFxcXCwvLGcnYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBmaQorCisgICAgIyByZW1vdmUgdHJhaWxpbmcgLmV4ZSBpZiBhbnkKKyAgICBuZXdfcGF0aD0iJHtuZXdfcGF0aC8lLmV4ZS99IgorCisgICAgIyBTYXZlIHRoZSBmaXJzdCAxMCBieXRlcyBvZiB0aGlzIHBhdGggdG8gdGhlIHN0b3JhZ2UsIHNvIGZpeHBhdGggY2FuIHdvcmsuCisgICAgYWxsX2ZpeHBhdGhfcHJlZml4ZXM9KCIke2FsbF9maXhwYXRoX3ByZWZpeGVzW0BdfSIgIiR7bmV3X3BhdGg6MDoxMH0iKQorICBmaQorCisgIGVsc2UKKyAgICAjIFdlJ3JlIG9uIGEgcG9zaXggcGxhdGZvcm0uIEhvb3JheSEgOikKKyAgICAjIEZpcnN0IHNlcGFyYXRlIHRoZSBwYXRoIGZyb20gdGhlIGFyZ3VtZW50cy4gVGhpcyB3aWxsIHNwbGl0IGF0IHRoZSBmaXJzdAorICAgICMgc3BhY2UuCisgICAgY29tcGxldGU9IiRNVCIKKyAgICBwYXRoPSIke2NvbXBsZXRlJSUgKn0iCisgICAgdG1wPSIkY29tcGxldGUgRU9MIgorICAgIGFyZ3VtZW50cz0iJHt0bXAjKiB9IgorCisgICAgbmV3X3BhdGg9YCRXSElDSCAkcGF0aCAyPiAvZGV2L251bGxgCisgICAgaWYgdGVzdCAieCRuZXdfcGF0aCIgPSB4OyB0aGVuCisgICAgICBpc19hYnNvbHV0ZV9wYXRoPWAkRUNITyAiJHBhdGgiIHwgJEdSRVAgXi9gCisgICAgICBpZiB0ZXN0ICJ4JGlzX2Fic29sdXRlX3BhdGgiICE9IHg7IHRoZW4KKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBSZXNvbHZpbmcgTVQgKGFzICRwYXRoKSB3aXRoICd3aGljaCcgZmFpbGVkLCB1c2luZyAkcGF0aCBkaXJlY3RseS4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogUmVzb2x2aW5nIE1UIChhcyAkcGF0aCkgd2l0aCAnd2hpY2gnIGZhaWxlZCwgdXNpbmcgJHBhdGggZGlyZWN0bHkuIiA+JjY7fQorICAgICAgICBuZXdfcGF0aD0iJHBhdGgiCisgICAgICBlbHNlCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGhlIHBhdGggb2YgTVQsIHdoaWNoIHJlc29sdmVzIGFzIFwiJGNvbXBsZXRlXCIsIGlzIG5vdCBmb3VuZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhlIHBhdGggb2YgTVQsIHdoaWNoIHJlc29sdmVzIGFzIFwiJGNvbXBsZXRlXCIsIGlzIG5vdCBmb3VuZC4iID4mNjt9CisgICAgICAgIGhhc19zcGFjZT1gJEVDSE8gIiRjb21wbGV0ZSIgfCAkR1JFUCAiICJgCisgICAgICAgIGlmIHRlc3QgIngkaGFzX3NwYWNlIiAhPSB4OyB0aGVuCisgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUaGlzIG1pZ2h0IGJlIGNhdXNlZCBieSBzcGFjZXMgaW4gdGhlIHBhdGgsIHdoaWNoIGlzIG5vdCBhbGxvd2VkLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUaGlzIG1pZ2h0IGJlIGNhdXNlZCBieSBzcGFjZXMgaW4gdGhlIHBhdGgsIHdoaWNoIGlzIG5vdCBhbGxvd2VkLiIgPiY2O30KKyAgICAgICAgZmkKKyAgICAgICAgYXNfZm5fZXJyb3IgJD8gIkNhbm5vdCBsb2NhdGUgdGhlIHRoZSBwYXRoIG9mIE1UIiAiJExJTkVOTyIgNQorICAgICAgZmkKKyAgICBmaQorICBmaQorCisgICMgTm93IGpvaW4gdG9nZXRoZXIgdGhlIHBhdGggYW5kIHRoZSBhcmd1bWVudHMgb25jZSBhZ2FpbgorICBpZiB0ZXN0ICJ4JGFyZ3VtZW50cyIgIT0geEVPTDsgdGhlbgorICAgICAgbmV3X2NvbXBsZXRlPSIkbmV3X3BhdGggJHthcmd1bWVudHMlICp9IgorICBlbHNlCisgICAgICBuZXdfY29tcGxldGU9IiRuZXdfcGF0aCIKKyAgZmkKKworICBpZiB0ZXN0ICJ4JGNvbXBsZXRlIiAhPSAieCRuZXdfY29tcGxldGUiOyB0aGVuCisgICAgTVQ9IiRuZXdfY29tcGxldGUiCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBSZXdyaXRpbmcgTVQgdG8gXCIkbmV3X2NvbXBsZXRlXCIiID4mNQorJGFzX2VjaG8gIiRhc19tZTogUmV3cml0aW5nIE1UIHRvIFwiJG5ld19jb21wbGV0ZVwiIiA+JjY7fQorICBmaQogCiAgICAgIyBUaGUgcmVzb3VyY2UgY29tcGlsZXIKICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInJjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KQEAgLTEyODExLDI4ICsyMTYyNiwyOTcgQEAKIAogCiAKLSAgICAjIFRyYW5zbGF0ZSBsb25nIGN5Z2RyaXZlIG9yIEM6XHNkZnNmIHBhdGgKLSAgICAjIGludG8gYSBzaG9ydCBtaXhlZCBtb2RlIHBhdGggdGhhdCBoYXMgbm8KLSAgICAjIHNwYWNlcyBpbiBpdC4KLSAgICB0bXA9IiRSQyIKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgogCi0gICAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TIiA9ICJ4d2luZG93cyI7IHRoZW4KLSAgICAgICAgdG1wPWAkQ1lHUEFUSCAtdSAiJFJDImAKLSAgICAgICAgdG1wPWB3aGljaCAiJHRtcCJgCi0gICAgICAgICMgSWYgZmlsZSBleGlzdHMgd2l0aCAuZXhlIGFwcGVuZGVkLCB0aGF0J3MgdGhlIHJlYWwgZmlsZW5hbWUKLSAgICAgICAgIyBhbmQgY3lncGF0aCBuZWVkcyB0aGF0IHRvIGNvbnZlcnQgdG8gc2hvcnQgc3R5bGUgcGF0aC4KLSAgICAgICAgaWYgdGVzdCAtZiAiJHt0bXB9LmV4ZSI7IHRoZW4KLSAgICAgICAgICAgdG1wPSIke3RtcH0uZXhlIgotICAgICAgICBlbGlmIHRlc3QgLWYgIiR7dG1wfS5jbWQiOyB0aGVuCi0gICAgICAgICAgIHRtcD0iJHt0bXB9LmNtZCIKLSAgICAgICAgZmkKLSAgICAgICAgIyBDb252ZXJ0IHRvIEM6LyBtaXhlZCBzdHlsZSBwYXRoIHdpdGhvdXQgc3BhY2VzLgotICAgICAgICAgdG1wPWAkQ1lHUEFUSCAtcyAtbSAiJHRtcCJgCisgICMgRmlyc3Qgc2VwYXJhdGUgdGhlIHBhdGggZnJvbSB0aGUgYXJndW1lbnRzLiBUaGlzIHdpbGwgc3BsaXQgYXQgdGhlIGZpcnN0CisgICMgc3BhY2UuCisgIGNvbXBsZXRlPSIkUkMiCisgIHBhdGg9IiR7Y29tcGxldGUlJSAqfSIKKyAgdG1wPSIkY29tcGxldGUgRU9MIgorICBhcmd1bWVudHM9IiR7dG1wIyogfSIKKworICAjIElucHV0IG1pZ2h0IGJlIGdpdmVuIGFzIFdpbmRvd3MgZm9ybWF0LCBzdGFydCBieSBjb252ZXJ0aW5nIHRvCisgICMgdW5peCBmb3JtYXQuCisgIG5ld19wYXRoPWAkQ1lHUEFUSCAtdSAiJHBhdGgiYAorCisgICMgTm93IHRyeSB0byBsb2NhdGUgZXhlY3V0YWJsZSB1c2luZyB3aGljaAorICBuZXdfcGF0aD1gJFdISUNIICIkbmV3X3BhdGgiIDI+IC9kZXYvbnVsbGAKKyAgaWYgdGVzdCAieCRuZXdfcGF0aCIgPSB4OyB0aGVuCisgICAgIyBPb3BzLiBXaGljaCBkaWRuJ3QgZmluZCB0aGUgZXhlY3V0YWJsZS4KKyAgICAjIFRoZSBzcGxpdHRpbmcgb2YgYXJndW1lbnRzIGZyb20gdGhlIGV4ZWN1dGFibGUgYXQgYSBzcGFjZSBtaWdodCBoYXZlIGJlZW4gaW5jb3JyZWN0LAorICAgICMgc2luY2UgcGF0aHMgd2l0aCBzcGFjZSBhcmUgbW9yZSBsaWtlbHkgaW4gV2luZG93cy4gR2l2ZSBpdCBhbm90aGVyIHRyeSB3aXRoIHRoZSB3aG9sZQorICAgICMgYXJndW1lbnQuCisgICAgcGF0aD0iJGNvbXBsZXRlIgorICAgIGFyZ3VtZW50cz0iRU9MIgorICAgIG5ld19wYXRoPWAkQ1lHUEFUSCAtdSAiJHBhdGgiYAorICAgIG5ld19wYXRoPWAkV0hJQ0ggIiRuZXdfcGF0aCIgMj4gL2Rldi9udWxsYAorICAgIGlmIHRlc3QgIngkbmV3X3BhdGgiID0geDsgdGhlbgorICAgICAgIyBJdCdzIHN0aWxsIG5vdCBmb3VuZC4gTm93IHRoaXMgaXMgYW4gdW5yZWNvdmVyYWJsZSBlcnJvci4KKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGhlIHBhdGggb2YgUkMsIHdoaWNoIHJlc29sdmVzIGFzIFwiJGNvbXBsZXRlXCIsIGlzIG5vdCBmb3VuZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhlIHBhdGggb2YgUkMsIHdoaWNoIHJlc29sdmVzIGFzIFwiJGNvbXBsZXRlXCIsIGlzIG5vdCBmb3VuZC4iID4mNjt9CisgICAgICBoYXNfc3BhY2U9YCRFQ0hPICIkY29tcGxldGUiIHwgJEdSRVAgIiAiYAorICAgICAgaWYgdGVzdCAieCRoYXNfc3BhY2UiICE9IHg7IHRoZW4KKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBZb3UgbWlnaHQgYmUgbWl4aW5nIHNwYWNlcyBpbiB0aGUgcGF0aCBhbmQgZXh0cmEgYXJndW1lbnRzLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogWW91IG1pZ2h0IGJlIG1peGluZyBzcGFjZXMgaW4gdGhlIHBhdGggYW5kIGV4dHJhIGFyZ3VtZW50cywgd2hpY2ggaXMgbm90IGFsbG93ZWQuIiA+JjY7fQorICAgICAgZmkKKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJDYW5ub3QgbG9jYXRlIHRoZSB0aGUgcGF0aCBvZiBSQyIgIiRMSU5FTk8iIDUKICAgICBmaQotICAgIFJDPSIkdG1wIgorICBmaQorCisgICMgQ3lnd2luIHRyaWVzIHRvIGhpZGUgc29tZSBhc3BlY3RzIG9mIHRoZSBXaW5kb3dzIGZpbGUgc3lzdGVtLCBzdWNoIHRoYXQgYmluYXJpZXMgYXJlCisgICMgbmFtZWQgLmV4ZSBidXQgY2FsbGVkIHdpdGhvdXQgdGhhdCBzdWZmaXguIFRoZXJlZm9yZSwgImZvbyIgYW5kICJmb28uZXhlIiBhcmUgY29uc2lkZXJlZAorICAjIHRoZSBzYW1lIGZpbGUsIG1vc3Qgb2YgdGhlIHRpbWUgKGFzIGluICJ0ZXN0IC1mIikuIEJ1dCBub3Qgd2hlbiBydW5uaW5nIGN5Z3BhdGggLXMsIHRoZW4KKyAgIyAiZm9vLmV4ZSIgaXMgT0sgYnV0ICJmb28iIGlzIGFuIGVycm9yLgorICAjCisgICMgVGhpcyB0ZXN0IGlzIHRoZXJlZm9yZSBzbGlnaHRseSBtb3JlIGFjY3VyYXRlIHRoYW4gInRlc3QgLWYiIHRvIGNoZWNrIGZvciBmaWxlIHByZWNlbnNlLgorICAjIEl0IGlzIGFsc28gYSB3YXkgdG8gbWFrZSBzdXJlIHdlIGdvdCB0aGUgcHJvcGVyIGZpbGUgbmFtZSBmb3IgdGhlIHJlYWwgdGVzdCBsYXRlciBvbi4KKyAgdGVzdF9zaG9ydHBhdGg9YCRDWUdQQVRIIC1zIC1tICIkbmV3X3BhdGgiIDI+IC9kZXYvbnVsbGAKKyAgaWYgdGVzdCAieCR0ZXN0X3Nob3J0cGF0aCIgPSB4OyB0aGVuCisgICAgIyBTaG9ydCBwYXRoIGZhaWxlZCwgZmlsZSBkb2VzIG5vdCBleGlzdCBhcyBzcGVjaWZpZWQuCisgICAgIyBUcnkgYWRkaW5nIC5leGUgb3IgLmNtZAorICAgIGlmIHRlc3QgLWYgIiR7bmV3X3BhdGh9LmV4ZSI7IHRoZW4KKyAgICAgICBpbnB1dF90b19zaG9ydHBhdGg9IiR7bmV3X3BhdGh9LmV4ZSIKKyAgICBlbGlmIHRlc3QgLWYgIiR7bmV3X3BhdGh9LmNtZCI7IHRoZW4KKyAgICAgICBpbnB1dF90b19zaG9ydHBhdGg9IiR7bmV3X3BhdGh9LmNtZCIKKyAgICBlbHNlCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSBwYXRoIG9mIFJDLCB3aGljaCByZXNvbHZlcyBhcyBcIiRuZXdfcGF0aFwiLCBpcyBpbnZhbGlkLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUaGUgcGF0aCBvZiBSQywgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkbmV3X3BhdGhcIiwgaXMgaW52YWxpZC4iID4mNjt9CisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IE5laXRoZXIgXCIkbmV3X3BhdGhcIiBub3IgXCIkbmV3X3BhdGguZXhlL2NtZFwiIGNhbiBiZSBmb3VuZCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBOZWl0aGVyIFwiJG5ld19wYXRoXCIgbm9yIFwiJG5ld19wYXRoLmV4ZS9jbWRcIiBjYW4gYmUgZm91bmQiID4mNjt9CisgICAgICBhc19mbl9lcnJvciAkPyAiQ2Fubm90IGxvY2F0ZSB0aGUgdGhlIHBhdGggb2YgUkMiICIkTElORU5PIiA1CisgICAgZmkKKyAgZWxzZQorICAgIGlucHV0X3RvX3Nob3J0cGF0aD0iJG5ld19wYXRoIgorICBmaQorCisgICMgQ2FsbCBoZWxwZXIgZnVuY3Rpb24gd2hpY2ggcG9zc2libHkgY29udmVydHMgdGhpcyB1c2luZyBET1Mtc3R5bGUgc2hvcnQgbW9kZS4KKyAgIyBJZiBzbywgdGhlIHVwZGF0ZWQgcGF0aCBpcyBzdG9yZWQgaW4gJG5ld19wYXRoLgorICBuZXdfcGF0aD0iJGlucHV0X3RvX3Nob3J0cGF0aCIKKworICBpbnB1dF9wYXRoPSIkaW5wdXRfdG9fc2hvcnRwYXRoIgorICAjIENoZWNrIGlmIHdlIG5lZWQgdG8gY29udmVydCB0aGlzIHVzaW5nIERPUy1zdHlsZSBzaG9ydCBtb2RlLiBJZiB0aGUgcGF0aAorICAjIGNvbnRhaW5zIGp1c3Qgc2ltcGxlIGNoYXJhY3RlcnMsIHVzZSBpdC4gT3RoZXJ3aXNlIChzcGFjZXMsIHdlaXJkIGNoYXJhY3RlcnMpLAorICAjIHRha2Ugbm8gY2hhbmNlcyBhbmQgcmV3cml0ZSBpdC4KKyAgIyBOb3RlOiBtNCBlYXRzIG91ciBbXSwgc28gd2UgbmVlZCB0byB1c2UgWyBhbmQgXSBpbnN0ZWFkLgorICBoYXNfZm9yYmlkZGVuX2NoYXJzPWAkRUNITyAiJGlucHV0X3BhdGgiIHwgJEdSRVAgW14tLl8vYS16QS1aMC05XWAKKyAgaWYgdGVzdCAieCRoYXNfZm9yYmlkZGVuX2NoYXJzIiAhPSB4OyB0aGVuCisgICAgIyBOb3cgY29udmVydCBpdCB0byBtaXhlZCBET1Mtc3R5bGUsIHNob3J0IG1vZGUgKG5vIHNwYWNlcywgYW5kIC8gaW5zdGVhZCBvZiBcKQorICAgIHNob3J0bW9kZV9wYXRoPWAkQ1lHUEFUSCAtcyAtbSAtYSAiJGlucHV0X3BhdGgiYAorICAgIHBhdGhfYWZ0ZXJfc2hvcnRtb2RlPWAkQ1lHUEFUSCAtdSAiJHNob3J0bW9kZV9wYXRoImAKKyAgICBpZiB0ZXN0ICJ4JHBhdGhfYWZ0ZXJfc2hvcnRtb2RlIiAhPSAieCRpbnB1dF90b19zaG9ydHBhdGgiOyB0aGVuCisgICAgICAjIEdvaW5nIHRvIHNob3J0IG1vZGUgYW5kIGJhY2sgYWdhaW4gZGlkIGluZGVlZCBtYXR0ZXIuIFNpbmNlIHNob3J0IG1vZGUgaXMKKyAgICAgICMgY2FzZSBpbnNlbnNpdGl2ZSwgbGV0J3MgbWFrZSBpdCBsb3dlcmNhc2UgdG8gaW1wcm92ZSByZWFkYWJpbGl0eS4KKyAgICAgIHNob3J0bW9kZV9wYXRoPWAkRUNITyAiJHNob3J0bW9kZV9wYXRoIiB8ICRUUiAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidgCisgICAgICAjIE5vdyBjb252ZXJ0IGl0IGJhY2sgdG8gVW5peC1zdGlsZSAoY3lncGF0aCkKKyAgICAgIGlucHV0X3BhdGg9YCRDWUdQQVRIIC11ICIkc2hvcnRtb2RlX3BhdGgiYAorICAgICAgbmV3X3BhdGg9IiRpbnB1dF9wYXRoIgorICAgIGZpCisgIGZpCisKKyAgdGVzdF9jeWdkcml2ZV9wcmVmaXg9YCRFQ0hPICRpbnB1dF9wYXRoIHwgJEdSRVAgXi9jeWdkcml2ZS9gCisgIGlmIHRlc3QgIngkdGVzdF9jeWdkcml2ZV9wcmVmaXgiID0geDsgdGhlbgorICAgICMgQXMgYSBzaW1wbGUgZml4LCBleGNsdWRlIC91c3IvYmluIHNpbmNlIGl0J3Mgbm90IGEgcmVhbCBwYXRoLgorICAgIGlmIHRlc3QgInhgJEVDSE8gJGlucHV0X3RvX3Nob3J0cGF0aCB8ICRHUkVQIF4vdXNyL2Jpbi9gIiA9IHg7IHRoZW4KKyAgICAgICMgVGhlIHBhdGggaXMgaW4gYSBDeWd3aW4gc3BlY2lhbCBkaXJlY3RvcnkgKGUuZy4gL2hvbWUpLiBXZSBuZWVkIHRoaXMgY29udmVydGVkIHRvCisgICAgICAjIGEgcGF0aCBwcmVmaXhlZCBieSAvY3lnZHJpdmUgZm9yIGZpeHBhdGggdG8gd29yay4KKyAgICAgIG5ld19wYXRoPSIkQ1lHV0lOX1JPT1RfUEFUSCRpbnB1dF9wYXRoIgorICAgIGZpCisgIGZpCisKKyAgIyByZW1vdmUgdHJhaWxpbmcgLmV4ZSBpZiBhbnkKKyAgbmV3X3BhdGg9IiR7bmV3X3BhdGgvJS5leGUvfSIKKworICBlbGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLm1zeXMiOyB0aGVuCisKKyAgIyBGaXJzdCBzZXBhcmF0ZSB0aGUgcGF0aCBmcm9tIHRoZSBhcmd1bWVudHMuIFRoaXMgd2lsbCBzcGxpdCBhdCB0aGUgZmlyc3QKKyAgIyBzcGFjZS4KKyAgY29tcGxldGU9IiRSQyIKKyAgcGF0aD0iJHtjb21wbGV0ZSUlICp9IgorICB0bXA9IiRjb21wbGV0ZSBFT0wiCisgIGFyZ3VtZW50cz0iJHt0bXAjKiB9IgorCisgICMgSW5wdXQgbWlnaHQgYmUgZ2l2ZW4gYXMgV2luZG93cyBmb3JtYXQsIHN0YXJ0IGJ5IGNvbnZlcnRpbmcgdG8KKyAgIyB1bml4IGZvcm1hdC4KKyAgbmV3X3BhdGg9IiRwYXRoIgorCisgIHdpbmRvd3NfcGF0aD0iJG5ld19wYXRoIgorICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5jeWd3aW4iOyB0aGVuCisgICAgdW5peF9wYXRoPWAkQ1lHUEFUSCAtdSAiJHdpbmRvd3NfcGF0aCJgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGVsaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MubXN5cyI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRFQ0hPICIkd2luZG93c19wYXRoIiB8ICRTRUQgLWUgJ3MsXlxcKC5cXCk6LC9cXDEsZycgLWUgJ3MsXFxcXCwvLGcnYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBmaQogCiAKLSAgICBSQ19GTEFHUz0iLW5vbG9nbyAvbCAweDQwOSAvciIKKyAgIyBOb3cgdHJ5IHRvIGxvY2F0ZSBleGVjdXRhYmxlIHVzaW5nIHdoaWNoCisgIG5ld19wYXRoPWAkV0hJQ0ggIiRuZXdfcGF0aCIgMj4gL2Rldi9udWxsYAorCisgIGlmIHRlc3QgIngkbmV3X3BhdGgiID0geDsgdGhlbgorICAgICMgT29wcy4gV2hpY2ggZGlkbid0IGZpbmQgdGhlIGV4ZWN1dGFibGUuCisgICAgIyBUaGUgc3BsaXR0aW5nIG9mIGFyZ3VtZW50cyBmcm9tIHRoZSBleGVjdXRhYmxlIGF0IGEgc3BhY2UgbWlnaHQgaGF2ZSBiZWVuIGluY29ycmVjdCwKKyAgICAjIHNpbmNlIHBhdGhzIHdpdGggc3BhY2UgYXJlIG1vcmUgbGlrZWx5IGluIFdpbmRvd3MuIEdpdmUgaXQgYW5vdGhlciB0cnkgd2l0aCB0aGUgd2hvbGUKKyAgICAjIGFyZ3VtZW50LgorICAgIHBhdGg9IiRjb21wbGV0ZSIKKyAgICBhcmd1bWVudHM9IkVPTCIKKyAgICBuZXdfcGF0aD0iJHBhdGgiCisKKyAgd2luZG93c19wYXRoPSIkbmV3X3BhdGgiCisgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLmN5Z3dpbiI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRDWUdQQVRIIC11ICIkd2luZG93c19wYXRoImAKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJEVDSE8gIiR3aW5kb3dzX3BhdGgiIHwgJFNFRCAtZSAncyxeXFwoLlxcKTosL1xcMSxnJyAtZSAncyxcXFxcLC8sZydgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGZpCisKKworICAgIG5ld19wYXRoPWAkV0hJQ0ggIiRuZXdfcGF0aCIgMj4gL2Rldi9udWxsYAorCisgICAgaWYgdGVzdCAieCRuZXdfcGF0aCIgPSB4OyB0aGVuCisgICAgICAjIEl0J3Mgc3RpbGwgbm90IGZvdW5kLiBOb3cgdGhpcyBpcyBhbiB1bnJlY292ZXJhYmxlIGVycm9yLgorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUaGUgcGF0aCBvZiBSQywgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkY29tcGxldGVcIiwgaXMgbm90IGZvdW5kLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUaGUgcGF0aCBvZiBSQywgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkY29tcGxldGVcIiwgaXMgbm90IGZvdW5kLiIgPiY2O30KKyAgICAgIGhhc19zcGFjZT1gJEVDSE8gIiRjb21wbGV0ZSIgfCAkR1JFUCAiICJgCisgICAgICBpZiB0ZXN0ICJ4JGhhc19zcGFjZSIgIT0geDsgdGhlbgorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFlvdSBtaWdodCBiZSBtaXhpbmcgc3BhY2VzIGluIHRoZSBwYXRoIGFuZCBleHRyYSBhcmd1bWVudHMsIHdoaWNoIGlzIG5vdCBhbGxvd2VkLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBZb3UgbWlnaHQgYmUgbWl4aW5nIHNwYWNlcyBpbiB0aGUgcGF0aCBhbmQgZXh0cmEgYXJndW1lbnRzLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iID4mNjt9CisgICAgICBmaQorICAgICAgYXNfZm5fZXJyb3IgJD8gIkNhbm5vdCBsb2NhdGUgdGhlIHRoZSBwYXRoIG9mIFJDIiAiJExJTkVOTyIgNQorICAgIGZpCisgIGZpCisKKyAgIyBOb3cgbmV3X3BhdGggaGFzIGEgY29tcGxldGUgdW5peCBwYXRoIHRvIHRoZSBiaW5hcnkKKyAgaWYgdGVzdCAieGAkRUNITyAkbmV3X3BhdGggfCAkR1JFUCBeL2Jpbi9gIiAhPSB4OyB0aGVuCisgICAgIyBLZWVwIHBhdGhzIGluIC9iaW4gYXMtaXMsIGJ1dCByZW1vdmUgdHJhaWxpbmcgLmV4ZSBpZiBhbnkKKyAgICBuZXdfcGF0aD0iJHtuZXdfcGF0aC8lLmV4ZS99IgorICAgICMgRG8gbm90IHNhdmUgL2JpbiBwYXRocyB0byBhbGxfZml4cGF0aF9wcmVmaXhlcyEKKyAgZWxzZQorICAgICMgTm90IGluIG1peGVkIG9yIFdpbmRvd3Mgc3R5bGUsIHN0YXJ0IGJ5IHRoYXQuCisgICAgbmV3X3BhdGg9YGNtZCAvL2MgZWNobyAkbmV3X3BhdGhgCisKKyAgaW5wdXRfcGF0aD0iJG5ld19wYXRoIgorICAjIENoZWNrIGlmIHdlIG5lZWQgdG8gY29udmVydCB0aGlzIHVzaW5nIERPUy1zdHlsZSBzaG9ydCBtb2RlLiBJZiB0aGUgcGF0aAorICAjIGNvbnRhaW5zIGp1c3Qgc2ltcGxlIGNoYXJhY3RlcnMsIHVzZSBpdC4gT3RoZXJ3aXNlIChzcGFjZXMsIHdlaXJkIGNoYXJhY3RlcnMpLAorICAjIHRha2Ugbm8gY2hhbmNlcyBhbmQgcmV3cml0ZSBpdC4KKyAgIyBOb3RlOiBtNCBlYXRzIG91ciBbXSwgc28gd2UgbmVlZCB0byB1c2UgWyBhbmQgXSBpbnN0ZWFkLgorICBoYXNfZm9yYmlkZGVuX2NoYXJzPWAkRUNITyAiJGlucHV0X3BhdGgiIHwgJEdSRVAgW14tXy86YS16QS1aMC05XWAKKyAgaWYgdGVzdCAieCRoYXNfZm9yYmlkZGVuX2NoYXJzIiAhPSB4OyB0aGVuCisgICAgIyBOb3cgY29udmVydCBpdCB0byBtaXhlZCBET1Mtc3R5bGUsIHNob3J0IG1vZGUgKG5vIHNwYWNlcywgYW5kIC8gaW5zdGVhZCBvZiBcKQorICAgIG5ld19wYXRoPWBjbWQgL2MgImZvciAlQSBpbiAoXCIkaW5wdXRfcGF0aFwiKSBkbyBAZWNobyAlfnNBInwkVFIgXFxcXFxcXFwgLyB8ICRUUiAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidgCisgIGZpCisKKyAgICAjIE91dHB1dCBpcyBpbiAkbmV3X3BhdGgKKworICB3aW5kb3dzX3BhdGg9IiRuZXdfcGF0aCIKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJENZR1BBVEggLXUgIiR3aW5kb3dzX3BhdGgiYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBlbGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLm1zeXMiOyB0aGVuCisgICAgdW5peF9wYXRoPWAkRUNITyAiJHdpbmRvd3NfcGF0aCIgfCAkU0VEIC1lICdzLF5cXCguXFwpOiwvXFwxLGcnIC1lICdzLFxcXFwsLyxnJ2AKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZmkKKworICAgICMgcmVtb3ZlIHRyYWlsaW5nIC5leGUgaWYgYW55CisgICAgbmV3X3BhdGg9IiR7bmV3X3BhdGgvJS5leGUvfSIKKworICAgICMgU2F2ZSB0aGUgZmlyc3QgMTAgYnl0ZXMgb2YgdGhpcyBwYXRoIHRvIHRoZSBzdG9yYWdlLCBzbyBmaXhwYXRoIGNhbiB3b3JrLgorICAgIGFsbF9maXhwYXRoX3ByZWZpeGVzPSgiJHthbGxfZml4cGF0aF9wcmVmaXhlc1tAXX0iICIke25ld19wYXRoOjA6MTB9IikKKyAgZmkKKworICBlbHNlCisgICAgIyBXZSdyZSBvbiBhIHBvc2l4IHBsYXRmb3JtLiBIb29yYXkhIDopCisgICAgIyBGaXJzdCBzZXBhcmF0ZSB0aGUgcGF0aCBmcm9tIHRoZSBhcmd1bWVudHMuIFRoaXMgd2lsbCBzcGxpdCBhdCB0aGUgZmlyc3QKKyAgICAjIHNwYWNlLgorICAgIGNvbXBsZXRlPSIkUkMiCisgICAgcGF0aD0iJHtjb21wbGV0ZSUlICp9IgorICAgIHRtcD0iJGNvbXBsZXRlIEVPTCIKKyAgICBhcmd1bWVudHM9IiR7dG1wIyogfSIKKworICAgIG5ld19wYXRoPWAkV0hJQ0ggJHBhdGggMj4gL2Rldi9udWxsYAorICAgIGlmIHRlc3QgIngkbmV3X3BhdGgiID0geDsgdGhlbgorICAgICAgaXNfYWJzb2x1dGVfcGF0aD1gJEVDSE8gIiRwYXRoIiB8ICRHUkVQIF4vYAorICAgICAgaWYgdGVzdCAieCRpc19hYnNvbHV0ZV9wYXRoIiAhPSB4OyB0aGVuCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogUmVzb2x2aW5nIFJDIChhcyAkcGF0aCkgd2l0aCAnd2hpY2gnIGZhaWxlZCwgdXNpbmcgJHBhdGggZGlyZWN0bHkuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFJlc29sdmluZyBSQyAoYXMgJHBhdGgpIHdpdGggJ3doaWNoJyBmYWlsZWQsIHVzaW5nICRwYXRoIGRpcmVjdGx5LiIgPiY2O30KKyAgICAgICAgbmV3X3BhdGg9IiRwYXRoIgorICAgICAgZWxzZQorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSBwYXRoIG9mIFJDLCB3aGljaCByZXNvbHZlcyBhcyBcIiRjb21wbGV0ZVwiLCBpcyBub3QgZm91bmQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoZSBwYXRoIG9mIFJDLCB3aGljaCByZXNvbHZlcyBhcyBcIiRjb21wbGV0ZVwiLCBpcyBub3QgZm91bmQuIiA+JjY7fQorICAgICAgICBoYXNfc3BhY2U9YCRFQ0hPICIkY29tcGxldGUiIHwgJEdSRVAgIiAiYAorICAgICAgICBpZiB0ZXN0ICJ4JGhhc19zcGFjZSIgIT0geDsgdGhlbgorICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGhpcyBtaWdodCBiZSBjYXVzZWQgYnkgc3BhY2VzIGluIHRoZSBwYXRoLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhpcyBtaWdodCBiZSBjYXVzZWQgYnkgc3BhY2VzIGluIHRoZSBwYXRoLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iID4mNjt9CisgICAgICAgIGZpCisgICAgICAgIGFzX2ZuX2Vycm9yICQ/ICJDYW5ub3QgbG9jYXRlIHRoZSB0aGUgcGF0aCBvZiBSQyIgIiRMSU5FTk8iIDUKKyAgICAgIGZpCisgICAgZmkKKyAgZmkKKworICAjIE5vdyBqb2luIHRvZ2V0aGVyIHRoZSBwYXRoIGFuZCB0aGUgYXJndW1lbnRzIG9uY2UgYWdhaW4KKyAgaWYgdGVzdCAieCRhcmd1bWVudHMiICE9IHhFT0w7IHRoZW4KKyAgICAgIG5ld19jb21wbGV0ZT0iJG5ld19wYXRoICR7YXJndW1lbnRzJSAqfSIKKyAgZWxzZQorICAgICAgbmV3X2NvbXBsZXRlPSIkbmV3X3BhdGgiCisgIGZpCisKKyAgaWYgdGVzdCAieCRjb21wbGV0ZSIgIT0gIngkbmV3X2NvbXBsZXRlIjsgdGhlbgorICAgIFJDPSIkbmV3X2NvbXBsZXRlIgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogUmV3cml0aW5nIFJDIHRvIFwiJG5ld19jb21wbGV0ZVwiIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFJld3JpdGluZyBSQyB0byBcIiRuZXdfY29tcGxldGVcIiIgPiY2O30KKyAgZmkKKworCisgICAgIyBGb3IgaG90c3BvdCwgd2UgbmVlZCB0aGVzZSBpbiBXaW5kb3dzIG1peGVkIHBhdGgsCisgICAgIyBzbyByZXdyaXRlIHRoZW0gYWxsLiBOZWVkIGFkZGVkIC5leGUgc3VmZml4LgorICAgIEhPVFNQT1RfQ1hYPSIkQ1hYLmV4ZSIKKyAgICBIT1RTUE9UX0xEPSIkTEQuZXhlIgorICAgIEhPVFNQT1RfTVQ9IiRNVC5leGUiCisgICAgSE9UU1BPVF9SQz0iJFJDLmV4ZSIKKworICB1bml4X3BhdGg9IiRIT1RTUE9UX0NYWCIKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorICAgIHdpbmRvd3NfcGF0aD1gJENZR1BBVEggLW0gIiR1bml4X3BhdGgiYAorICAgIEhPVFNQT1RfQ1hYPSIkd2luZG93c19wYXRoIgorICBlbGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLm1zeXMiOyB0aGVuCisgICAgd2luZG93c19wYXRoPWBjbWQgLy9jIGVjaG8gJHVuaXhfcGF0aGAKKyAgICBIT1RTUE9UX0NYWD0iJHdpbmRvd3NfcGF0aCIKKyAgZmkKKworCisgIHVuaXhfcGF0aD0iJEhPVFNQT1RfTEQiCisgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLmN5Z3dpbiI7IHRoZW4KKyAgICB3aW5kb3dzX3BhdGg9YCRDWUdQQVRIIC1tICIkdW5peF9wYXRoImAKKyAgICBIT1RTUE9UX0xEPSIkd2luZG93c19wYXRoIgorICBlbGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLm1zeXMiOyB0aGVuCisgICAgd2luZG93c19wYXRoPWBjbWQgLy9jIGVjaG8gJHVuaXhfcGF0aGAKKyAgICBIT1RTUE9UX0xEPSIkd2luZG93c19wYXRoIgorICBmaQorCisKKyAgdW5peF9wYXRoPSIkSE9UU1BPVF9NVCIKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorICAgIHdpbmRvd3NfcGF0aD1gJENZR1BBVEggLW0gIiR1bml4X3BhdGgiYAorICAgIEhPVFNQT1RfTVQ9IiR3aW5kb3dzX3BhdGgiCisgIGVsaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MubXN5cyI7IHRoZW4KKyAgICB3aW5kb3dzX3BhdGg9YGNtZCAvL2MgZWNobyAkdW5peF9wYXRoYAorICAgIEhPVFNQT1RfTVQ9IiR3aW5kb3dzX3BhdGgiCisgIGZpCisKKworICB1bml4X3BhdGg9IiRIT1RTUE9UX1JDIgorICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5jeWd3aW4iOyB0aGVuCisgICAgd2luZG93c19wYXRoPWAkQ1lHUEFUSCAtbSAiJHVuaXhfcGF0aCJgCisgICAgSE9UU1BPVF9SQz0iJHdpbmRvd3NfcGF0aCIKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorICAgIHdpbmRvd3NfcGF0aD1gY21kIC8vYyBlY2hvICR1bml4X3BhdGhgCisgICAgSE9UU1BPVF9SQz0iJHdpbmRvd3NfcGF0aCIKKyAgZmkKKworCisKKworICAgIFJDX0ZMQUdTPSItbm9sb2dvIC1sIDB4NDA5IC1yIgogICAgIGlmIHRlc3QgIngkVkFSSUFOVCIgPSB4T1BUOyB0aGVuIDoKIAogICAgICAgICBSQ19GTEFHUz0iJFJDX0ZMQUdTIC1kIE5ERUJVRyIKQEAgLTEyODkxLDI1ICsyMTk3NSwyNDUgQEAKIAogCiAKLSAgICAjIFRyYW5zbGF0ZSBsb25nIGN5Z2RyaXZlIG9yIEM6XHNkZnNmIHBhdGgKLSAgICAjIGludG8gYSBzaG9ydCBtaXhlZCBtb2RlIHBhdGggdGhhdCBoYXMgbm8KLSAgICAjIHNwYWNlcyBpbiBpdC4KLSAgICB0bXA9IiRXSU5BUiIKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgogCi0gICAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TIiA9ICJ4d2luZG93cyI7IHRoZW4KLSAgICAgICAgdG1wPWAkQ1lHUEFUSCAtdSAiJFdJTkFSImAKLSAgICAgICAgdG1wPWB3aGljaCAiJHRtcCJgCi0gICAgICAgICMgSWYgZmlsZSBleGlzdHMgd2l0aCAuZXhlIGFwcGVuZGVkLCB0aGF0J3MgdGhlIHJlYWwgZmlsZW5hbWUKLSAgICAgICAgIyBhbmQgY3lncGF0aCBuZWVkcyB0aGF0IHRvIGNvbnZlcnQgdG8gc2hvcnQgc3R5bGUgcGF0aC4KLSAgICAgICAgaWYgdGVzdCAtZiAiJHt0bXB9LmV4ZSI7IHRoZW4KLSAgICAgICAgICAgdG1wPSIke3RtcH0uZXhlIgotICAgICAgICBlbGlmIHRlc3QgLWYgIiR7dG1wfS5jbWQiOyB0aGVuCi0gICAgICAgICAgIHRtcD0iJHt0bXB9LmNtZCIKLSAgICAgICAgZmkKLSAgICAgICAgIyBDb252ZXJ0IHRvIEM6LyBtaXhlZCBzdHlsZSBwYXRoIHdpdGhvdXQgc3BhY2VzLgotICAgICAgICAgdG1wPWAkQ1lHUEFUSCAtcyAtbSAiJHRtcCJgCisgICMgRmlyc3Qgc2VwYXJhdGUgdGhlIHBhdGggZnJvbSB0aGUgYXJndW1lbnRzLiBUaGlzIHdpbGwgc3BsaXQgYXQgdGhlIGZpcnN0CisgICMgc3BhY2UuCisgIGNvbXBsZXRlPSIkV0lOQVIiCisgIHBhdGg9IiR7Y29tcGxldGUlJSAqfSIKKyAgdG1wPSIkY29tcGxldGUgRU9MIgorICBhcmd1bWVudHM9IiR7dG1wIyogfSIKKworICAjIElucHV0IG1pZ2h0IGJlIGdpdmVuIGFzIFdpbmRvd3MgZm9ybWF0LCBzdGFydCBieSBjb252ZXJ0aW5nIHRvCisgICMgdW5peCBmb3JtYXQuCisgIG5ld19wYXRoPWAkQ1lHUEFUSCAtdSAiJHBhdGgiYAorCisgICMgTm93IHRyeSB0byBsb2NhdGUgZXhlY3V0YWJsZSB1c2luZyB3aGljaAorICBuZXdfcGF0aD1gJFdISUNIICIkbmV3X3BhdGgiIDI+IC9kZXYvbnVsbGAKKyAgaWYgdGVzdCAieCRuZXdfcGF0aCIgPSB4OyB0aGVuCisgICAgIyBPb3BzLiBXaGljaCBkaWRuJ3QgZmluZCB0aGUgZXhlY3V0YWJsZS4KKyAgICAjIFRoZSBzcGxpdHRpbmcgb2YgYXJndW1lbnRzIGZyb20gdGhlIGV4ZWN1dGFibGUgYXQgYSBzcGFjZSBtaWdodCBoYXZlIGJlZW4gaW5jb3JyZWN0LAorICAgICMgc2luY2UgcGF0aHMgd2l0aCBzcGFjZSBhcmUgbW9yZSBsaWtlbHkgaW4gV2luZG93cy4gR2l2ZSBpdCBhbm90aGVyIHRyeSB3aXRoIHRoZSB3aG9sZQorICAgICMgYXJndW1lbnQuCisgICAgcGF0aD0iJGNvbXBsZXRlIgorICAgIGFyZ3VtZW50cz0iRU9MIgorICAgIG5ld19wYXRoPWAkQ1lHUEFUSCAtdSAiJHBhdGgiYAorICAgIG5ld19wYXRoPWAkV0hJQ0ggIiRuZXdfcGF0aCIgMj4gL2Rldi9udWxsYAorICAgIGlmIHRlc3QgIngkbmV3X3BhdGgiID0geDsgdGhlbgorICAgICAgIyBJdCdzIHN0aWxsIG5vdCBmb3VuZC4gTm93IHRoaXMgaXMgYW4gdW5yZWNvdmVyYWJsZSBlcnJvci4KKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGhlIHBhdGggb2YgV0lOQVIsIHdoaWNoIHJlc29sdmVzIGFzIFwiJGNvbXBsZXRlXCIsIGlzIG5vdCBmb3VuZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhlIHBhdGggb2YgV0lOQVIsIHdoaWNoIHJlc29sdmVzIGFzIFwiJGNvbXBsZXRlXCIsIGlzIG5vdCBmb3VuZC4iID4mNjt9CisgICAgICBoYXNfc3BhY2U9YCRFQ0hPICIkY29tcGxldGUiIHwgJEdSRVAgIiAiYAorICAgICAgaWYgdGVzdCAieCRoYXNfc3BhY2UiICE9IHg7IHRoZW4KKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBZb3UgbWlnaHQgYmUgbWl4aW5nIHNwYWNlcyBpbiB0aGUgcGF0aCBhbmQgZXh0cmEgYXJndW1lbnRzLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogWW91IG1pZ2h0IGJlIG1peGluZyBzcGFjZXMgaW4gdGhlIHBhdGggYW5kIGV4dHJhIGFyZ3VtZW50cywgd2hpY2ggaXMgbm90IGFsbG93ZWQuIiA+JjY7fQorICAgICAgZmkKKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJDYW5ub3QgbG9jYXRlIHRoZSB0aGUgcGF0aCBvZiBXSU5BUiIgIiRMSU5FTk8iIDUKICAgICBmaQotICAgIFdJTkFSPSIkdG1wIgorICBmaQorCisgICMgQ3lnd2luIHRyaWVzIHRvIGhpZGUgc29tZSBhc3BlY3RzIG9mIHRoZSBXaW5kb3dzIGZpbGUgc3lzdGVtLCBzdWNoIHRoYXQgYmluYXJpZXMgYXJlCisgICMgbmFtZWQgLmV4ZSBidXQgY2FsbGVkIHdpdGhvdXQgdGhhdCBzdWZmaXguIFRoZXJlZm9yZSwgImZvbyIgYW5kICJmb28uZXhlIiBhcmUgY29uc2lkZXJlZAorICAjIHRoZSBzYW1lIGZpbGUsIG1vc3Qgb2YgdGhlIHRpbWUgKGFzIGluICJ0ZXN0IC1mIikuIEJ1dCBub3Qgd2hlbiBydW5uaW5nIGN5Z3BhdGggLXMsIHRoZW4KKyAgIyAiZm9vLmV4ZSIgaXMgT0sgYnV0ICJmb28iIGlzIGFuIGVycm9yLgorICAjCisgICMgVGhpcyB0ZXN0IGlzIHRoZXJlZm9yZSBzbGlnaHRseSBtb3JlIGFjY3VyYXRlIHRoYW4gInRlc3QgLWYiIHRvIGNoZWNrIGZvciBmaWxlIHByZWNlbnNlLgorICAjIEl0IGlzIGFsc28gYSB3YXkgdG8gbWFrZSBzdXJlIHdlIGdvdCB0aGUgcHJvcGVyIGZpbGUgbmFtZSBmb3IgdGhlIHJlYWwgdGVzdCBsYXRlciBvbi4KKyAgdGVzdF9zaG9ydHBhdGg9YCRDWUdQQVRIIC1zIC1tICIkbmV3X3BhdGgiIDI+IC9kZXYvbnVsbGAKKyAgaWYgdGVzdCAieCR0ZXN0X3Nob3J0cGF0aCIgPSB4OyB0aGVuCisgICAgIyBTaG9ydCBwYXRoIGZhaWxlZCwgZmlsZSBkb2VzIG5vdCBleGlzdCBhcyBzcGVjaWZpZWQuCisgICAgIyBUcnkgYWRkaW5nIC5leGUgb3IgLmNtZAorICAgIGlmIHRlc3QgLWYgIiR7bmV3X3BhdGh9LmV4ZSI7IHRoZW4KKyAgICAgICBpbnB1dF90b19zaG9ydHBhdGg9IiR7bmV3X3BhdGh9LmV4ZSIKKyAgICBlbGlmIHRlc3QgLWYgIiR7bmV3X3BhdGh9LmNtZCI7IHRoZW4KKyAgICAgICBpbnB1dF90b19zaG9ydHBhdGg9IiR7bmV3X3BhdGh9LmNtZCIKKyAgICBlbHNlCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSBwYXRoIG9mIFdJTkFSLCB3aGljaCByZXNvbHZlcyBhcyBcIiRuZXdfcGF0aFwiLCBpcyBpbnZhbGlkLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUaGUgcGF0aCBvZiBXSU5BUiwgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkbmV3X3BhdGhcIiwgaXMgaW52YWxpZC4iID4mNjt9CisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IE5laXRoZXIgXCIkbmV3X3BhdGhcIiBub3IgXCIkbmV3X3BhdGguZXhlL2NtZFwiIGNhbiBiZSBmb3VuZCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBOZWl0aGVyIFwiJG5ld19wYXRoXCIgbm9yIFwiJG5ld19wYXRoLmV4ZS9jbWRcIiBjYW4gYmUgZm91bmQiID4mNjt9CisgICAgICBhc19mbl9lcnJvciAkPyAiQ2Fubm90IGxvY2F0ZSB0aGUgdGhlIHBhdGggb2YgV0lOQVIiICIkTElORU5PIiA1CisgICAgZmkKKyAgZWxzZQorICAgIGlucHV0X3RvX3Nob3J0cGF0aD0iJG5ld19wYXRoIgorICBmaQorCisgICMgQ2FsbCBoZWxwZXIgZnVuY3Rpb24gd2hpY2ggcG9zc2libHkgY29udmVydHMgdGhpcyB1c2luZyBET1Mtc3R5bGUgc2hvcnQgbW9kZS4KKyAgIyBJZiBzbywgdGhlIHVwZGF0ZWQgcGF0aCBpcyBzdG9yZWQgaW4gJG5ld19wYXRoLgorICBuZXdfcGF0aD0iJGlucHV0X3RvX3Nob3J0cGF0aCIKKworICBpbnB1dF9wYXRoPSIkaW5wdXRfdG9fc2hvcnRwYXRoIgorICAjIENoZWNrIGlmIHdlIG5lZWQgdG8gY29udmVydCB0aGlzIHVzaW5nIERPUy1zdHlsZSBzaG9ydCBtb2RlLiBJZiB0aGUgcGF0aAorICAjIGNvbnRhaW5zIGp1c3Qgc2ltcGxlIGNoYXJhY3RlcnMsIHVzZSBpdC4gT3RoZXJ3aXNlIChzcGFjZXMsIHdlaXJkIGNoYXJhY3RlcnMpLAorICAjIHRha2Ugbm8gY2hhbmNlcyBhbmQgcmV3cml0ZSBpdC4KKyAgIyBOb3RlOiBtNCBlYXRzIG91ciBbXSwgc28gd2UgbmVlZCB0byB1c2UgWyBhbmQgXSBpbnN0ZWFkLgorICBoYXNfZm9yYmlkZGVuX2NoYXJzPWAkRUNITyAiJGlucHV0X3BhdGgiIHwgJEdSRVAgW14tLl8vYS16QS1aMC05XWAKKyAgaWYgdGVzdCAieCRoYXNfZm9yYmlkZGVuX2NoYXJzIiAhPSB4OyB0aGVuCisgICAgIyBOb3cgY29udmVydCBpdCB0byBtaXhlZCBET1Mtc3R5bGUsIHNob3J0IG1vZGUgKG5vIHNwYWNlcywgYW5kIC8gaW5zdGVhZCBvZiBcKQorICAgIHNob3J0bW9kZV9wYXRoPWAkQ1lHUEFUSCAtcyAtbSAtYSAiJGlucHV0X3BhdGgiYAorICAgIHBhdGhfYWZ0ZXJfc2hvcnRtb2RlPWAkQ1lHUEFUSCAtdSAiJHNob3J0bW9kZV9wYXRoImAKKyAgICBpZiB0ZXN0ICJ4JHBhdGhfYWZ0ZXJfc2hvcnRtb2RlIiAhPSAieCRpbnB1dF90b19zaG9ydHBhdGgiOyB0aGVuCisgICAgICAjIEdvaW5nIHRvIHNob3J0IG1vZGUgYW5kIGJhY2sgYWdhaW4gZGlkIGluZGVlZCBtYXR0ZXIuIFNpbmNlIHNob3J0IG1vZGUgaXMKKyAgICAgICMgY2FzZSBpbnNlbnNpdGl2ZSwgbGV0J3MgbWFrZSBpdCBsb3dlcmNhc2UgdG8gaW1wcm92ZSByZWFkYWJpbGl0eS4KKyAgICAgIHNob3J0bW9kZV9wYXRoPWAkRUNITyAiJHNob3J0bW9kZV9wYXRoIiB8ICRUUiAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidgCisgICAgICAjIE5vdyBjb252ZXJ0IGl0IGJhY2sgdG8gVW5peC1zdGlsZSAoY3lncGF0aCkKKyAgICAgIGlucHV0X3BhdGg9YCRDWUdQQVRIIC11ICIkc2hvcnRtb2RlX3BhdGgiYAorICAgICAgbmV3X3BhdGg9IiRpbnB1dF9wYXRoIgorICAgIGZpCisgIGZpCisKKyAgdGVzdF9jeWdkcml2ZV9wcmVmaXg9YCRFQ0hPICRpbnB1dF9wYXRoIHwgJEdSRVAgXi9jeWdkcml2ZS9gCisgIGlmIHRlc3QgIngkdGVzdF9jeWdkcml2ZV9wcmVmaXgiID0geDsgdGhlbgorICAgICMgQXMgYSBzaW1wbGUgZml4LCBleGNsdWRlIC91c3IvYmluIHNpbmNlIGl0J3Mgbm90IGEgcmVhbCBwYXRoLgorICAgIGlmIHRlc3QgInhgJEVDSE8gJGlucHV0X3RvX3Nob3J0cGF0aCB8ICRHUkVQIF4vdXNyL2Jpbi9gIiA9IHg7IHRoZW4KKyAgICAgICMgVGhlIHBhdGggaXMgaW4gYSBDeWd3aW4gc3BlY2lhbCBkaXJlY3RvcnkgKGUuZy4gL2hvbWUpLiBXZSBuZWVkIHRoaXMgY29udmVydGVkIHRvCisgICAgICAjIGEgcGF0aCBwcmVmaXhlZCBieSAvY3lnZHJpdmUgZm9yIGZpeHBhdGggdG8gd29yay4KKyAgICAgIG5ld19wYXRoPSIkQ1lHV0lOX1JPT1RfUEFUSCRpbnB1dF9wYXRoIgorICAgIGZpCisgIGZpCisKKyAgIyByZW1vdmUgdHJhaWxpbmcgLmV4ZSBpZiBhbnkKKyAgbmV3X3BhdGg9IiR7bmV3X3BhdGgvJS5leGUvfSIKKworICBlbGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLm1zeXMiOyB0aGVuCisKKyAgIyBGaXJzdCBzZXBhcmF0ZSB0aGUgcGF0aCBmcm9tIHRoZSBhcmd1bWVudHMuIFRoaXMgd2lsbCBzcGxpdCBhdCB0aGUgZmlyc3QKKyAgIyBzcGFjZS4KKyAgY29tcGxldGU9IiRXSU5BUiIKKyAgcGF0aD0iJHtjb21wbGV0ZSUlICp9IgorICB0bXA9IiRjb21wbGV0ZSBFT0wiCisgIGFyZ3VtZW50cz0iJHt0bXAjKiB9IgorCisgICMgSW5wdXQgbWlnaHQgYmUgZ2l2ZW4gYXMgV2luZG93cyBmb3JtYXQsIHN0YXJ0IGJ5IGNvbnZlcnRpbmcgdG8KKyAgIyB1bml4IGZvcm1hdC4KKyAgbmV3X3BhdGg9IiRwYXRoIgorCisgIHdpbmRvd3NfcGF0aD0iJG5ld19wYXRoIgorICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5jeWd3aW4iOyB0aGVuCisgICAgdW5peF9wYXRoPWAkQ1lHUEFUSCAtdSAiJHdpbmRvd3NfcGF0aCJgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGVsaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MubXN5cyI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRFQ0hPICIkd2luZG93c19wYXRoIiB8ICRTRUQgLWUgJ3MsXlxcKC5cXCk6LC9cXDEsZycgLWUgJ3MsXFxcXCwvLGcnYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBmaQorCisKKyAgIyBOb3cgdHJ5IHRvIGxvY2F0ZSBleGVjdXRhYmxlIHVzaW5nIHdoaWNoCisgIG5ld19wYXRoPWAkV0hJQ0ggIiRuZXdfcGF0aCIgMj4gL2Rldi9udWxsYAorCisgIGlmIHRlc3QgIngkbmV3X3BhdGgiID0geDsgdGhlbgorICAgICMgT29wcy4gV2hpY2ggZGlkbid0IGZpbmQgdGhlIGV4ZWN1dGFibGUuCisgICAgIyBUaGUgc3BsaXR0aW5nIG9mIGFyZ3VtZW50cyBmcm9tIHRoZSBleGVjdXRhYmxlIGF0IGEgc3BhY2UgbWlnaHQgaGF2ZSBiZWVuIGluY29ycmVjdCwKKyAgICAjIHNpbmNlIHBhdGhzIHdpdGggc3BhY2UgYXJlIG1vcmUgbGlrZWx5IGluIFdpbmRvd3MuIEdpdmUgaXQgYW5vdGhlciB0cnkgd2l0aCB0aGUgd2hvbGUKKyAgICAjIGFyZ3VtZW50LgorICAgIHBhdGg9IiRjb21wbGV0ZSIKKyAgICBhcmd1bWVudHM9IkVPTCIKKyAgICBuZXdfcGF0aD0iJHBhdGgiCisKKyAgd2luZG93c19wYXRoPSIkbmV3X3BhdGgiCisgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLmN5Z3dpbiI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRDWUdQQVRIIC11ICIkd2luZG93c19wYXRoImAKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJEVDSE8gIiR3aW5kb3dzX3BhdGgiIHwgJFNFRCAtZSAncyxeXFwoLlxcKTosL1xcMSxnJyAtZSAncyxcXFxcLC8sZydgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGZpCisKKworICAgIG5ld19wYXRoPWAkV0hJQ0ggIiRuZXdfcGF0aCIgMj4gL2Rldi9udWxsYAorCisgICAgaWYgdGVzdCAieCRuZXdfcGF0aCIgPSB4OyB0aGVuCisgICAgICAjIEl0J3Mgc3RpbGwgbm90IGZvdW5kLiBOb3cgdGhpcyBpcyBhbiB1bnJlY292ZXJhYmxlIGVycm9yLgorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUaGUgcGF0aCBvZiBXSU5BUiwgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkY29tcGxldGVcIiwgaXMgbm90IGZvdW5kLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUaGUgcGF0aCBvZiBXSU5BUiwgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkY29tcGxldGVcIiwgaXMgbm90IGZvdW5kLiIgPiY2O30KKyAgICAgIGhhc19zcGFjZT1gJEVDSE8gIiRjb21wbGV0ZSIgfCAkR1JFUCAiICJgCisgICAgICBpZiB0ZXN0ICJ4JGhhc19zcGFjZSIgIT0geDsgdGhlbgorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFlvdSBtaWdodCBiZSBtaXhpbmcgc3BhY2VzIGluIHRoZSBwYXRoIGFuZCBleHRyYSBhcmd1bWVudHMsIHdoaWNoIGlzIG5vdCBhbGxvd2VkLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBZb3UgbWlnaHQgYmUgbWl4aW5nIHNwYWNlcyBpbiB0aGUgcGF0aCBhbmQgZXh0cmEgYXJndW1lbnRzLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iID4mNjt9CisgICAgICBmaQorICAgICAgYXNfZm5fZXJyb3IgJD8gIkNhbm5vdCBsb2NhdGUgdGhlIHRoZSBwYXRoIG9mIFdJTkFSIiAiJExJTkVOTyIgNQorICAgIGZpCisgIGZpCisKKyAgIyBOb3cgbmV3X3BhdGggaGFzIGEgY29tcGxldGUgdW5peCBwYXRoIHRvIHRoZSBiaW5hcnkKKyAgaWYgdGVzdCAieGAkRUNITyAkbmV3X3BhdGggfCAkR1JFUCBeL2Jpbi9gIiAhPSB4OyB0aGVuCisgICAgIyBLZWVwIHBhdGhzIGluIC9iaW4gYXMtaXMsIGJ1dCByZW1vdmUgdHJhaWxpbmcgLmV4ZSBpZiBhbnkKKyAgICBuZXdfcGF0aD0iJHtuZXdfcGF0aC8lLmV4ZS99IgorICAgICMgRG8gbm90IHNhdmUgL2JpbiBwYXRocyB0byBhbGxfZml4cGF0aF9wcmVmaXhlcyEKKyAgZWxzZQorICAgICMgTm90IGluIG1peGVkIG9yIFdpbmRvd3Mgc3R5bGUsIHN0YXJ0IGJ5IHRoYXQuCisgICAgbmV3X3BhdGg9YGNtZCAvL2MgZWNobyAkbmV3X3BhdGhgCisKKyAgaW5wdXRfcGF0aD0iJG5ld19wYXRoIgorICAjIENoZWNrIGlmIHdlIG5lZWQgdG8gY29udmVydCB0aGlzIHVzaW5nIERPUy1zdHlsZSBzaG9ydCBtb2RlLiBJZiB0aGUgcGF0aAorICAjIGNvbnRhaW5zIGp1c3Qgc2ltcGxlIGNoYXJhY3RlcnMsIHVzZSBpdC4gT3RoZXJ3aXNlIChzcGFjZXMsIHdlaXJkIGNoYXJhY3RlcnMpLAorICAjIHRha2Ugbm8gY2hhbmNlcyBhbmQgcmV3cml0ZSBpdC4KKyAgIyBOb3RlOiBtNCBlYXRzIG91ciBbXSwgc28gd2UgbmVlZCB0byB1c2UgWyBhbmQgXSBpbnN0ZWFkLgorICBoYXNfZm9yYmlkZGVuX2NoYXJzPWAkRUNITyAiJGlucHV0X3BhdGgiIHwgJEdSRVAgW14tXy86YS16QS1aMC05XWAKKyAgaWYgdGVzdCAieCRoYXNfZm9yYmlkZGVuX2NoYXJzIiAhPSB4OyB0aGVuCisgICAgIyBOb3cgY29udmVydCBpdCB0byBtaXhlZCBET1Mtc3R5bGUsIHNob3J0IG1vZGUgKG5vIHNwYWNlcywgYW5kIC8gaW5zdGVhZCBvZiBcKQorICAgIG5ld19wYXRoPWBjbWQgL2MgImZvciAlQSBpbiAoXCIkaW5wdXRfcGF0aFwiKSBkbyBAZWNobyAlfnNBInwkVFIgXFxcXFxcXFwgLyB8ICRUUiAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidgCisgIGZpCisKKyAgICAjIE91dHB1dCBpcyBpbiAkbmV3X3BhdGgKKworICB3aW5kb3dzX3BhdGg9IiRuZXdfcGF0aCIKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJENZR1BBVEggLXUgIiR3aW5kb3dzX3BhdGgiYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBlbGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLm1zeXMiOyB0aGVuCisgICAgdW5peF9wYXRoPWAkRUNITyAiJHdpbmRvd3NfcGF0aCIgfCAkU0VEIC1lICdzLF5cXCguXFwpOiwvXFwxLGcnIC1lICdzLFxcXFwsLyxnJ2AKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZmkKKworICAgICMgcmVtb3ZlIHRyYWlsaW5nIC5leGUgaWYgYW55CisgICAgbmV3X3BhdGg9IiR7bmV3X3BhdGgvJS5leGUvfSIKKworICAgICMgU2F2ZSB0aGUgZmlyc3QgMTAgYnl0ZXMgb2YgdGhpcyBwYXRoIHRvIHRoZSBzdG9yYWdlLCBzbyBmaXhwYXRoIGNhbiB3b3JrLgorICAgIGFsbF9maXhwYXRoX3ByZWZpeGVzPSgiJHthbGxfZml4cGF0aF9wcmVmaXhlc1tAXX0iICIke25ld19wYXRoOjA6MTB9IikKKyAgZmkKKworICBlbHNlCisgICAgIyBXZSdyZSBvbiBhIHBvc2l4IHBsYXRmb3JtLiBIb29yYXkhIDopCisgICAgIyBGaXJzdCBzZXBhcmF0ZSB0aGUgcGF0aCBmcm9tIHRoZSBhcmd1bWVudHMuIFRoaXMgd2lsbCBzcGxpdCBhdCB0aGUgZmlyc3QKKyAgICAjIHNwYWNlLgorICAgIGNvbXBsZXRlPSIkV0lOQVIiCisgICAgcGF0aD0iJHtjb21wbGV0ZSUlICp9IgorICAgIHRtcD0iJGNvbXBsZXRlIEVPTCIKKyAgICBhcmd1bWVudHM9IiR7dG1wIyogfSIKKworICAgIG5ld19wYXRoPWAkV0hJQ0ggJHBhdGggMj4gL2Rldi9udWxsYAorICAgIGlmIHRlc3QgIngkbmV3X3BhdGgiID0geDsgdGhlbgorICAgICAgaXNfYWJzb2x1dGVfcGF0aD1gJEVDSE8gIiRwYXRoIiB8ICRHUkVQIF4vYAorICAgICAgaWYgdGVzdCAieCRpc19hYnNvbHV0ZV9wYXRoIiAhPSB4OyB0aGVuCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogUmVzb2x2aW5nIFdJTkFSIChhcyAkcGF0aCkgd2l0aCAnd2hpY2gnIGZhaWxlZCwgdXNpbmcgJHBhdGggZGlyZWN0bHkuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFJlc29sdmluZyBXSU5BUiAoYXMgJHBhdGgpIHdpdGggJ3doaWNoJyBmYWlsZWQsIHVzaW5nICRwYXRoIGRpcmVjdGx5LiIgPiY2O30KKyAgICAgICAgbmV3X3BhdGg9IiRwYXRoIgorICAgICAgZWxzZQorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSBwYXRoIG9mIFdJTkFSLCB3aGljaCByZXNvbHZlcyBhcyBcIiRjb21wbGV0ZVwiLCBpcyBub3QgZm91bmQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoZSBwYXRoIG9mIFdJTkFSLCB3aGljaCByZXNvbHZlcyBhcyBcIiRjb21wbGV0ZVwiLCBpcyBub3QgZm91bmQuIiA+JjY7fQorICAgICAgICBoYXNfc3BhY2U9YCRFQ0hPICIkY29tcGxldGUiIHwgJEdSRVAgIiAiYAorICAgICAgICBpZiB0ZXN0ICJ4JGhhc19zcGFjZSIgIT0geDsgdGhlbgorICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGhpcyBtaWdodCBiZSBjYXVzZWQgYnkgc3BhY2VzIGluIHRoZSBwYXRoLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhpcyBtaWdodCBiZSBjYXVzZWQgYnkgc3BhY2VzIGluIHRoZSBwYXRoLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iID4mNjt9CisgICAgICAgIGZpCisgICAgICAgIGFzX2ZuX2Vycm9yICQ/ICJDYW5ub3QgbG9jYXRlIHRoZSB0aGUgcGF0aCBvZiBXSU5BUiIgIiRMSU5FTk8iIDUKKyAgICAgIGZpCisgICAgZmkKKyAgZmkKKworICAjIE5vdyBqb2luIHRvZ2V0aGVyIHRoZSBwYXRoIGFuZCB0aGUgYXJndW1lbnRzIG9uY2UgYWdhaW4KKyAgaWYgdGVzdCAieCRhcmd1bWVudHMiICE9IHhFT0w7IHRoZW4KKyAgICAgIG5ld19jb21wbGV0ZT0iJG5ld19wYXRoICR7YXJndW1lbnRzJSAqfSIKKyAgZWxzZQorICAgICAgbmV3X2NvbXBsZXRlPSIkbmV3X3BhdGgiCisgIGZpCisKKyAgaWYgdGVzdCAieCRjb21wbGV0ZSIgIT0gIngkbmV3X2NvbXBsZXRlIjsgdGhlbgorICAgIFdJTkFSPSIkbmV3X2NvbXBsZXRlIgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogUmV3cml0aW5nIFdJTkFSIHRvIFwiJG5ld19jb21wbGV0ZVwiIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFJld3JpdGluZyBXSU5BUiB0byBcIiRuZXdfY29tcGxldGVcIiIgPiY2O30KKyAgZmkKIAogICAgIEFSPSIkV0lOQVIiCiAgICAgQVJGTEFHUz0iLW5vbG9nbyAtTk9ERUZBVUxUTElCOk1TVkNSVCIKQEAgLTEyOTUyLDI1ICsyMjI1NiwyNDUgQEAKIAogCiAKLSAgICAjIFRyYW5zbGF0ZSBsb25nIGN5Z2RyaXZlIG9yIEM6XHNkZnNmIHBhdGgKLSAgICAjIGludG8gYSBzaG9ydCBtaXhlZCBtb2RlIHBhdGggdGhhdCBoYXMgbm8KLSAgICAjIHNwYWNlcyBpbiBpdC4KLSAgICB0bXA9IiREVU1QQklOIgorICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5jeWd3aW4iOyB0aGVuCiAKLSAgICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1MiID0gInh3aW5kb3dzIjsgdGhlbgotICAgICAgICB0bXA9YCRDWUdQQVRIIC11ICIkRFVNUEJJTiJgCi0gICAgICAgIHRtcD1gd2hpY2ggIiR0bXAiYAotICAgICAgICAjIElmIGZpbGUgZXhpc3RzIHdpdGggLmV4ZSBhcHBlbmRlZCwgdGhhdCdzIHRoZSByZWFsIGZpbGVuYW1lCi0gICAgICAgICMgYW5kIGN5Z3BhdGggbmVlZHMgdGhhdCB0byBjb252ZXJ0IHRvIHNob3J0IHN0eWxlIHBhdGguCi0gICAgICAgIGlmIHRlc3QgLWYgIiR7dG1wfS5leGUiOyB0aGVuCi0gICAgICAgICAgIHRtcD0iJHt0bXB9LmV4ZSIKLSAgICAgICAgZWxpZiB0ZXN0IC1mICIke3RtcH0uY21kIjsgdGhlbgotICAgICAgICAgICB0bXA9IiR7dG1wfS5jbWQiCi0gICAgICAgIGZpCi0gICAgICAgICMgQ29udmVydCB0byBDOi8gbWl4ZWQgc3R5bGUgcGF0aCB3aXRob3V0IHNwYWNlcy4KLSAgICAgICAgIHRtcD1gJENZR1BBVEggLXMgLW0gIiR0bXAiYAorICAjIEZpcnN0IHNlcGFyYXRlIHRoZSBwYXRoIGZyb20gdGhlIGFyZ3VtZW50cy4gVGhpcyB3aWxsIHNwbGl0IGF0IHRoZSBmaXJzdAorICAjIHNwYWNlLgorICBjb21wbGV0ZT0iJERVTVBCSU4iCisgIHBhdGg9IiR7Y29tcGxldGUlJSAqfSIKKyAgdG1wPSIkY29tcGxldGUgRU9MIgorICBhcmd1bWVudHM9IiR7dG1wIyogfSIKKworICAjIElucHV0IG1pZ2h0IGJlIGdpdmVuIGFzIFdpbmRvd3MgZm9ybWF0LCBzdGFydCBieSBjb252ZXJ0aW5nIHRvCisgICMgdW5peCBmb3JtYXQuCisgIG5ld19wYXRoPWAkQ1lHUEFUSCAtdSAiJHBhdGgiYAorCisgICMgTm93IHRyeSB0byBsb2NhdGUgZXhlY3V0YWJsZSB1c2luZyB3aGljaAorICBuZXdfcGF0aD1gJFdISUNIICIkbmV3X3BhdGgiIDI+IC9kZXYvbnVsbGAKKyAgaWYgdGVzdCAieCRuZXdfcGF0aCIgPSB4OyB0aGVuCisgICAgIyBPb3BzLiBXaGljaCBkaWRuJ3QgZmluZCB0aGUgZXhlY3V0YWJsZS4KKyAgICAjIFRoZSBzcGxpdHRpbmcgb2YgYXJndW1lbnRzIGZyb20gdGhlIGV4ZWN1dGFibGUgYXQgYSBzcGFjZSBtaWdodCBoYXZlIGJlZW4gaW5jb3JyZWN0LAorICAgICMgc2luY2UgcGF0aHMgd2l0aCBzcGFjZSBhcmUgbW9yZSBsaWtlbHkgaW4gV2luZG93cy4gR2l2ZSBpdCBhbm90aGVyIHRyeSB3aXRoIHRoZSB3aG9sZQorICAgICMgYXJndW1lbnQuCisgICAgcGF0aD0iJGNvbXBsZXRlIgorICAgIGFyZ3VtZW50cz0iRU9MIgorICAgIG5ld19wYXRoPWAkQ1lHUEFUSCAtdSAiJHBhdGgiYAorICAgIG5ld19wYXRoPWAkV0hJQ0ggIiRuZXdfcGF0aCIgMj4gL2Rldi9udWxsYAorICAgIGlmIHRlc3QgIngkbmV3X3BhdGgiID0geDsgdGhlbgorICAgICAgIyBJdCdzIHN0aWxsIG5vdCBmb3VuZC4gTm93IHRoaXMgaXMgYW4gdW5yZWNvdmVyYWJsZSBlcnJvci4KKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGhlIHBhdGggb2YgRFVNUEJJTiwgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkY29tcGxldGVcIiwgaXMgbm90IGZvdW5kLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUaGUgcGF0aCBvZiBEVU1QQklOLCB3aGljaCByZXNvbHZlcyBhcyBcIiRjb21wbGV0ZVwiLCBpcyBub3QgZm91bmQuIiA+JjY7fQorICAgICAgaGFzX3NwYWNlPWAkRUNITyAiJGNvbXBsZXRlIiB8ICRHUkVQICIgImAKKyAgICAgIGlmIHRlc3QgIngkaGFzX3NwYWNlIiAhPSB4OyB0aGVuCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogWW91IG1pZ2h0IGJlIG1peGluZyBzcGFjZXMgaW4gdGhlIHBhdGggYW5kIGV4dHJhIGFyZ3VtZW50cywgd2hpY2ggaXMgbm90IGFsbG93ZWQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFlvdSBtaWdodCBiZSBtaXhpbmcgc3BhY2VzIGluIHRoZSBwYXRoIGFuZCBleHRyYSBhcmd1bWVudHMsIHdoaWNoIGlzIG5vdCBhbGxvd2VkLiIgPiY2O30KKyAgICAgIGZpCisgICAgICBhc19mbl9lcnJvciAkPyAiQ2Fubm90IGxvY2F0ZSB0aGUgdGhlIHBhdGggb2YgRFVNUEJJTiIgIiRMSU5FTk8iIDUKICAgICBmaQotICAgIERVTVBCSU49IiR0bXAiCisgIGZpCisKKyAgIyBDeWd3aW4gdHJpZXMgdG8gaGlkZSBzb21lIGFzcGVjdHMgb2YgdGhlIFdpbmRvd3MgZmlsZSBzeXN0ZW0sIHN1Y2ggdGhhdCBiaW5hcmllcyBhcmUKKyAgIyBuYW1lZCAuZXhlIGJ1dCBjYWxsZWQgd2l0aG91dCB0aGF0IHN1ZmZpeC4gVGhlcmVmb3JlLCAiZm9vIiBhbmQgImZvby5leGUiIGFyZSBjb25zaWRlcmVkCisgICMgdGhlIHNhbWUgZmlsZSwgbW9zdCBvZiB0aGUgdGltZSAoYXMgaW4gInRlc3QgLWYiKS4gQnV0IG5vdCB3aGVuIHJ1bm5pbmcgY3lncGF0aCAtcywgdGhlbgorICAjICJmb28uZXhlIiBpcyBPSyBidXQgImZvbyIgaXMgYW4gZXJyb3IuCisgICMKKyAgIyBUaGlzIHRlc3QgaXMgdGhlcmVmb3JlIHNsaWdodGx5IG1vcmUgYWNjdXJhdGUgdGhhbiAidGVzdCAtZiIgdG8gY2hlY2sgZm9yIGZpbGUgcHJlY2Vuc2UuCisgICMgSXQgaXMgYWxzbyBhIHdheSB0byBtYWtlIHN1cmUgd2UgZ290IHRoZSBwcm9wZXIgZmlsZSBuYW1lIGZvciB0aGUgcmVhbCB0ZXN0IGxhdGVyIG9uLgorICB0ZXN0X3Nob3J0cGF0aD1gJENZR1BBVEggLXMgLW0gIiRuZXdfcGF0aCIgMj4gL2Rldi9udWxsYAorICBpZiB0ZXN0ICJ4JHRlc3Rfc2hvcnRwYXRoIiA9IHg7IHRoZW4KKyAgICAjIFNob3J0IHBhdGggZmFpbGVkLCBmaWxlIGRvZXMgbm90IGV4aXN0IGFzIHNwZWNpZmllZC4KKyAgICAjIFRyeSBhZGRpbmcgLmV4ZSBvciAuY21kCisgICAgaWYgdGVzdCAtZiAiJHtuZXdfcGF0aH0uZXhlIjsgdGhlbgorICAgICAgIGlucHV0X3RvX3Nob3J0cGF0aD0iJHtuZXdfcGF0aH0uZXhlIgorICAgIGVsaWYgdGVzdCAtZiAiJHtuZXdfcGF0aH0uY21kIjsgdGhlbgorICAgICAgIGlucHV0X3RvX3Nob3J0cGF0aD0iJHtuZXdfcGF0aH0uY21kIgorICAgIGVsc2UKKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGhlIHBhdGggb2YgRFVNUEJJTiwgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkbmV3X3BhdGhcIiwgaXMgaW52YWxpZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhlIHBhdGggb2YgRFVNUEJJTiwgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkbmV3X3BhdGhcIiwgaXMgaW52YWxpZC4iID4mNjt9CisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IE5laXRoZXIgXCIkbmV3X3BhdGhcIiBub3IgXCIkbmV3X3BhdGguZXhlL2NtZFwiIGNhbiBiZSBmb3VuZCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBOZWl0aGVyIFwiJG5ld19wYXRoXCIgbm9yIFwiJG5ld19wYXRoLmV4ZS9jbWRcIiBjYW4gYmUgZm91bmQiID4mNjt9CisgICAgICBhc19mbl9lcnJvciAkPyAiQ2Fubm90IGxvY2F0ZSB0aGUgdGhlIHBhdGggb2YgRFVNUEJJTiIgIiRMSU5FTk8iIDUKKyAgICBmaQorICBlbHNlCisgICAgaW5wdXRfdG9fc2hvcnRwYXRoPSIkbmV3X3BhdGgiCisgIGZpCisKKyAgIyBDYWxsIGhlbHBlciBmdW5jdGlvbiB3aGljaCBwb3NzaWJseSBjb252ZXJ0cyB0aGlzIHVzaW5nIERPUy1zdHlsZSBzaG9ydCBtb2RlLgorICAjIElmIHNvLCB0aGUgdXBkYXRlZCBwYXRoIGlzIHN0b3JlZCBpbiAkbmV3X3BhdGguCisgIG5ld19wYXRoPSIkaW5wdXRfdG9fc2hvcnRwYXRoIgorCisgIGlucHV0X3BhdGg9IiRpbnB1dF90b19zaG9ydHBhdGgiCisgICMgQ2hlY2sgaWYgd2UgbmVlZCB0byBjb252ZXJ0IHRoaXMgdXNpbmcgRE9TLXN0eWxlIHNob3J0IG1vZGUuIElmIHRoZSBwYXRoCisgICMgY29udGFpbnMganVzdCBzaW1wbGUgY2hhcmFjdGVycywgdXNlIGl0LiBPdGhlcndpc2UgKHNwYWNlcywgd2VpcmQgY2hhcmFjdGVycyksCisgICMgdGFrZSBubyBjaGFuY2VzIGFuZCByZXdyaXRlIGl0LgorICAjIE5vdGU6IG00IGVhdHMgb3VyIFtdLCBzbyB3ZSBuZWVkIHRvIHVzZSBbIGFuZCBdIGluc3RlYWQuCisgIGhhc19mb3JiaWRkZW5fY2hhcnM9YCRFQ0hPICIkaW5wdXRfcGF0aCIgfCAkR1JFUCBbXi0uXy9hLXpBLVowLTldYAorICBpZiB0ZXN0ICJ4JGhhc19mb3JiaWRkZW5fY2hhcnMiICE9IHg7IHRoZW4KKyAgICAjIE5vdyBjb252ZXJ0IGl0IHRvIG1peGVkIERPUy1zdHlsZSwgc2hvcnQgbW9kZSAobm8gc3BhY2VzLCBhbmQgLyBpbnN0ZWFkIG9mIFwpCisgICAgc2hvcnRtb2RlX3BhdGg9YCRDWUdQQVRIIC1zIC1tIC1hICIkaW5wdXRfcGF0aCJgCisgICAgcGF0aF9hZnRlcl9zaG9ydG1vZGU9YCRDWUdQQVRIIC11ICIkc2hvcnRtb2RlX3BhdGgiYAorICAgIGlmIHRlc3QgIngkcGF0aF9hZnRlcl9zaG9ydG1vZGUiICE9ICJ4JGlucHV0X3RvX3Nob3J0cGF0aCI7IHRoZW4KKyAgICAgICMgR29pbmcgdG8gc2hvcnQgbW9kZSBhbmQgYmFjayBhZ2FpbiBkaWQgaW5kZWVkIG1hdHRlci4gU2luY2Ugc2hvcnQgbW9kZSBpcworICAgICAgIyBjYXNlIGluc2Vuc2l0aXZlLCBsZXQncyBtYWtlIGl0IGxvd2VyY2FzZSB0byBpbXByb3ZlIHJlYWRhYmlsaXR5LgorICAgICAgc2hvcnRtb2RlX3BhdGg9YCRFQ0hPICIkc2hvcnRtb2RlX3BhdGgiIHwgJFRSICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J2AKKyAgICAgICMgTm93IGNvbnZlcnQgaXQgYmFjayB0byBVbml4LXN0aWxlIChjeWdwYXRoKQorICAgICAgaW5wdXRfcGF0aD1gJENZR1BBVEggLXUgIiRzaG9ydG1vZGVfcGF0aCJgCisgICAgICBuZXdfcGF0aD0iJGlucHV0X3BhdGgiCisgICAgZmkKKyAgZmkKKworICB0ZXN0X2N5Z2RyaXZlX3ByZWZpeD1gJEVDSE8gJGlucHV0X3BhdGggfCAkR1JFUCBeL2N5Z2RyaXZlL2AKKyAgaWYgdGVzdCAieCR0ZXN0X2N5Z2RyaXZlX3ByZWZpeCIgPSB4OyB0aGVuCisgICAgIyBBcyBhIHNpbXBsZSBmaXgsIGV4Y2x1ZGUgL3Vzci9iaW4gc2luY2UgaXQncyBub3QgYSByZWFsIHBhdGguCisgICAgaWYgdGVzdCAieGAkRUNITyAkaW5wdXRfdG9fc2hvcnRwYXRoIHwgJEdSRVAgXi91c3IvYmluL2AiID0geDsgdGhlbgorICAgICAgIyBUaGUgcGF0aCBpcyBpbiBhIEN5Z3dpbiBzcGVjaWFsIGRpcmVjdG9yeSAoZS5nLiAvaG9tZSkuIFdlIG5lZWQgdGhpcyBjb252ZXJ0ZWQgdG8KKyAgICAgICMgYSBwYXRoIHByZWZpeGVkIGJ5IC9jeWdkcml2ZSBmb3IgZml4cGF0aCB0byB3b3JrLgorICAgICAgbmV3X3BhdGg9IiRDWUdXSU5fUk9PVF9QQVRIJGlucHV0X3BhdGgiCisgICAgZmkKKyAgZmkKKworICAjIHJlbW92ZSB0cmFpbGluZyAuZXhlIGlmIGFueQorICBuZXdfcGF0aD0iJHtuZXdfcGF0aC8lLmV4ZS99IgorCisgIGVsaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MubXN5cyI7IHRoZW4KKworICAjIEZpcnN0IHNlcGFyYXRlIHRoZSBwYXRoIGZyb20gdGhlIGFyZ3VtZW50cy4gVGhpcyB3aWxsIHNwbGl0IGF0IHRoZSBmaXJzdAorICAjIHNwYWNlLgorICBjb21wbGV0ZT0iJERVTVBCSU4iCisgIHBhdGg9IiR7Y29tcGxldGUlJSAqfSIKKyAgdG1wPSIkY29tcGxldGUgRU9MIgorICBhcmd1bWVudHM9IiR7dG1wIyogfSIKKworICAjIElucHV0IG1pZ2h0IGJlIGdpdmVuIGFzIFdpbmRvd3MgZm9ybWF0LCBzdGFydCBieSBjb252ZXJ0aW5nIHRvCisgICMgdW5peCBmb3JtYXQuCisgIG5ld19wYXRoPSIkcGF0aCIKKworICB3aW5kb3dzX3BhdGg9IiRuZXdfcGF0aCIKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJENZR1BBVEggLXUgIiR3aW5kb3dzX3BhdGgiYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBlbGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLm1zeXMiOyB0aGVuCisgICAgdW5peF9wYXRoPWAkRUNITyAiJHdpbmRvd3NfcGF0aCIgfCAkU0VEIC1lICdzLF5cXCguXFwpOiwvXFwxLGcnIC1lICdzLFxcXFwsLyxnJ2AKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZmkKKworCisgICMgTm93IHRyeSB0byBsb2NhdGUgZXhlY3V0YWJsZSB1c2luZyB3aGljaAorICBuZXdfcGF0aD1gJFdISUNIICIkbmV3X3BhdGgiIDI+IC9kZXYvbnVsbGAKKworICBpZiB0ZXN0ICJ4JG5ld19wYXRoIiA9IHg7IHRoZW4KKyAgICAjIE9vcHMuIFdoaWNoIGRpZG4ndCBmaW5kIHRoZSBleGVjdXRhYmxlLgorICAgICMgVGhlIHNwbGl0dGluZyBvZiBhcmd1bWVudHMgZnJvbSB0aGUgZXhlY3V0YWJsZSBhdCBhIHNwYWNlIG1pZ2h0IGhhdmUgYmVlbiBpbmNvcnJlY3QsCisgICAgIyBzaW5jZSBwYXRocyB3aXRoIHNwYWNlIGFyZSBtb3JlIGxpa2VseSBpbiBXaW5kb3dzLiBHaXZlIGl0IGFub3RoZXIgdHJ5IHdpdGggdGhlIHdob2xlCisgICAgIyBhcmd1bWVudC4KKyAgICBwYXRoPSIkY29tcGxldGUiCisgICAgYXJndW1lbnRzPSJFT0wiCisgICAgbmV3X3BhdGg9IiRwYXRoIgorCisgIHdpbmRvd3NfcGF0aD0iJG5ld19wYXRoIgorICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5jeWd3aW4iOyB0aGVuCisgICAgdW5peF9wYXRoPWAkQ1lHUEFUSCAtdSAiJHdpbmRvd3NfcGF0aCJgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGVsaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MubXN5cyI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRFQ0hPICIkd2luZG93c19wYXRoIiB8ICRTRUQgLWUgJ3MsXlxcKC5cXCk6LC9cXDEsZycgLWUgJ3MsXFxcXCwvLGcnYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBmaQorCisKKyAgICBuZXdfcGF0aD1gJFdISUNIICIkbmV3X3BhdGgiIDI+IC9kZXYvbnVsbGAKKworICAgIGlmIHRlc3QgIngkbmV3X3BhdGgiID0geDsgdGhlbgorICAgICAgIyBJdCdzIHN0aWxsIG5vdCBmb3VuZC4gTm93IHRoaXMgaXMgYW4gdW5yZWNvdmVyYWJsZSBlcnJvci4KKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGhlIHBhdGggb2YgRFVNUEJJTiwgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkY29tcGxldGVcIiwgaXMgbm90IGZvdW5kLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUaGUgcGF0aCBvZiBEVU1QQklOLCB3aGljaCByZXNvbHZlcyBhcyBcIiRjb21wbGV0ZVwiLCBpcyBub3QgZm91bmQuIiA+JjY7fQorICAgICAgaGFzX3NwYWNlPWAkRUNITyAiJGNvbXBsZXRlIiB8ICRHUkVQICIgImAKKyAgICAgIGlmIHRlc3QgIngkaGFzX3NwYWNlIiAhPSB4OyB0aGVuCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogWW91IG1pZ2h0IGJlIG1peGluZyBzcGFjZXMgaW4gdGhlIHBhdGggYW5kIGV4dHJhIGFyZ3VtZW50cywgd2hpY2ggaXMgbm90IGFsbG93ZWQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFlvdSBtaWdodCBiZSBtaXhpbmcgc3BhY2VzIGluIHRoZSBwYXRoIGFuZCBleHRyYSBhcmd1bWVudHMsIHdoaWNoIGlzIG5vdCBhbGxvd2VkLiIgPiY2O30KKyAgICAgIGZpCisgICAgICBhc19mbl9lcnJvciAkPyAiQ2Fubm90IGxvY2F0ZSB0aGUgdGhlIHBhdGggb2YgRFVNUEJJTiIgIiRMSU5FTk8iIDUKKyAgICBmaQorICBmaQorCisgICMgTm93IG5ld19wYXRoIGhhcyBhIGNvbXBsZXRlIHVuaXggcGF0aCB0byB0aGUgYmluYXJ5CisgIGlmIHRlc3QgInhgJEVDSE8gJG5ld19wYXRoIHwgJEdSRVAgXi9iaW4vYCIgIT0geDsgdGhlbgorICAgICMgS2VlcCBwYXRocyBpbiAvYmluIGFzLWlzLCBidXQgcmVtb3ZlIHRyYWlsaW5nIC5leGUgaWYgYW55CisgICAgbmV3X3BhdGg9IiR7bmV3X3BhdGgvJS5leGUvfSIKKyAgICAjIERvIG5vdCBzYXZlIC9iaW4gcGF0aHMgdG8gYWxsX2ZpeHBhdGhfcHJlZml4ZXMhCisgIGVsc2UKKyAgICAjIE5vdCBpbiBtaXhlZCBvciBXaW5kb3dzIHN0eWxlLCBzdGFydCBieSB0aGF0LgorICAgIG5ld19wYXRoPWBjbWQgLy9jIGVjaG8gJG5ld19wYXRoYAorCisgIGlucHV0X3BhdGg9IiRuZXdfcGF0aCIKKyAgIyBDaGVjayBpZiB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhpcyB1c2luZyBET1Mtc3R5bGUgc2hvcnQgbW9kZS4gSWYgdGhlIHBhdGgKKyAgIyBjb250YWlucyBqdXN0IHNpbXBsZSBjaGFyYWN0ZXJzLCB1c2UgaXQuIE90aGVyd2lzZSAoc3BhY2VzLCB3ZWlyZCBjaGFyYWN0ZXJzKSwKKyAgIyB0YWtlIG5vIGNoYW5jZXMgYW5kIHJld3JpdGUgaXQuCisgICMgTm90ZTogbTQgZWF0cyBvdXIgW10sIHNvIHdlIG5lZWQgdG8gdXNlIFsgYW5kIF0gaW5zdGVhZC4KKyAgaGFzX2ZvcmJpZGRlbl9jaGFycz1gJEVDSE8gIiRpbnB1dF9wYXRoIiB8ICRHUkVQIFteLV8vOmEtekEtWjAtOV1gCisgIGlmIHRlc3QgIngkaGFzX2ZvcmJpZGRlbl9jaGFycyIgIT0geDsgdGhlbgorICAgICMgTm93IGNvbnZlcnQgaXQgdG8gbWl4ZWQgRE9TLXN0eWxlLCBzaG9ydCBtb2RlIChubyBzcGFjZXMsIGFuZCAvIGluc3RlYWQgb2YgXCkKKyAgICBuZXdfcGF0aD1gY21kIC9jICJmb3IgJUEgaW4gKFwiJGlucHV0X3BhdGhcIikgZG8gQGVjaG8gJX5zQSJ8JFRSIFxcXFxcXFxcIC8gfCAkVFIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAorICBmaQorCisgICAgIyBPdXRwdXQgaXMgaW4gJG5ld19wYXRoCisKKyAgd2luZG93c19wYXRoPSIkbmV3X3BhdGgiCisgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLmN5Z3dpbiI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRDWUdQQVRIIC11ICIkd2luZG93c19wYXRoImAKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJEVDSE8gIiR3aW5kb3dzX3BhdGgiIHwgJFNFRCAtZSAncyxeXFwoLlxcKTosL1xcMSxnJyAtZSAncyxcXFxcLC8sZydgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGZpCisKKyAgICAjIHJlbW92ZSB0cmFpbGluZyAuZXhlIGlmIGFueQorICAgIG5ld19wYXRoPSIke25ld19wYXRoLyUuZXhlL30iCisKKyAgICAjIFNhdmUgdGhlIGZpcnN0IDEwIGJ5dGVzIG9mIHRoaXMgcGF0aCB0byB0aGUgc3RvcmFnZSwgc28gZml4cGF0aCBjYW4gd29yay4KKyAgICBhbGxfZml4cGF0aF9wcmVmaXhlcz0oIiR7YWxsX2ZpeHBhdGhfcHJlZml4ZXNbQF19IiAiJHtuZXdfcGF0aDowOjEwfSIpCisgIGZpCisKKyAgZWxzZQorICAgICMgV2UncmUgb24gYSBwb3NpeCBwbGF0Zm9ybS4gSG9vcmF5ISA6KQorICAgICMgRmlyc3Qgc2VwYXJhdGUgdGhlIHBhdGggZnJvbSB0aGUgYXJndW1lbnRzLiBUaGlzIHdpbGwgc3BsaXQgYXQgdGhlIGZpcnN0CisgICAgIyBzcGFjZS4KKyAgICBjb21wbGV0ZT0iJERVTVBCSU4iCisgICAgcGF0aD0iJHtjb21wbGV0ZSUlICp9IgorICAgIHRtcD0iJGNvbXBsZXRlIEVPTCIKKyAgICBhcmd1bWVudHM9IiR7dG1wIyogfSIKKworICAgIG5ld19wYXRoPWAkV0hJQ0ggJHBhdGggMj4gL2Rldi9udWxsYAorICAgIGlmIHRlc3QgIngkbmV3X3BhdGgiID0geDsgdGhlbgorICAgICAgaXNfYWJzb2x1dGVfcGF0aD1gJEVDSE8gIiRwYXRoIiB8ICRHUkVQIF4vYAorICAgICAgaWYgdGVzdCAieCRpc19hYnNvbHV0ZV9wYXRoIiAhPSB4OyB0aGVuCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogUmVzb2x2aW5nIERVTVBCSU4gKGFzICRwYXRoKSB3aXRoICd3aGljaCcgZmFpbGVkLCB1c2luZyAkcGF0aCBkaXJlY3RseS4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogUmVzb2x2aW5nIERVTVBCSU4gKGFzICRwYXRoKSB3aXRoICd3aGljaCcgZmFpbGVkLCB1c2luZyAkcGF0aCBkaXJlY3RseS4iID4mNjt9CisgICAgICAgIG5ld19wYXRoPSIkcGF0aCIKKyAgICAgIGVsc2UKKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUaGUgcGF0aCBvZiBEVU1QQklOLCB3aGljaCByZXNvbHZlcyBhcyBcIiRjb21wbGV0ZVwiLCBpcyBub3QgZm91bmQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoZSBwYXRoIG9mIERVTVBCSU4sIHdoaWNoIHJlc29sdmVzIGFzIFwiJGNvbXBsZXRlXCIsIGlzIG5vdCBmb3VuZC4iID4mNjt9CisgICAgICAgIGhhc19zcGFjZT1gJEVDSE8gIiRjb21wbGV0ZSIgfCAkR1JFUCAiICJgCisgICAgICAgIGlmIHRlc3QgIngkaGFzX3NwYWNlIiAhPSB4OyB0aGVuCisgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUaGlzIG1pZ2h0IGJlIGNhdXNlZCBieSBzcGFjZXMgaW4gdGhlIHBhdGgsIHdoaWNoIGlzIG5vdCBhbGxvd2VkLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUaGlzIG1pZ2h0IGJlIGNhdXNlZCBieSBzcGFjZXMgaW4gdGhlIHBhdGgsIHdoaWNoIGlzIG5vdCBhbGxvd2VkLiIgPiY2O30KKyAgICAgICAgZmkKKyAgICAgICAgYXNfZm5fZXJyb3IgJD8gIkNhbm5vdCBsb2NhdGUgdGhlIHRoZSBwYXRoIG9mIERVTVBCSU4iICIkTElORU5PIiA1CisgICAgICBmaQorICAgIGZpCisgIGZpCisKKyAgIyBOb3cgam9pbiB0b2dldGhlciB0aGUgcGF0aCBhbmQgdGhlIGFyZ3VtZW50cyBvbmNlIGFnYWluCisgIGlmIHRlc3QgIngkYXJndW1lbnRzIiAhPSB4RU9MOyB0aGVuCisgICAgICBuZXdfY29tcGxldGU9IiRuZXdfcGF0aCAke2FyZ3VtZW50cyUgKn0iCisgIGVsc2UKKyAgICAgIG5ld19jb21wbGV0ZT0iJG5ld19wYXRoIgorICBmaQorCisgIGlmIHRlc3QgIngkY29tcGxldGUiICE9ICJ4JG5ld19jb21wbGV0ZSI7IHRoZW4KKyAgICBEVU1QQklOPSIkbmV3X2NvbXBsZXRlIgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogUmV3cml0aW5nIERVTVBCSU4gdG8gXCIkbmV3X2NvbXBsZXRlXCIiID4mNQorJGFzX2VjaG8gIiRhc19tZTogUmV3cml0aW5nIERVTVBCSU4gdG8gXCIkbmV3X2NvbXBsZXRlXCIiID4mNjt9CisgIGZpCiAKIAogICAgIENPTVBJTEVSX1RZUEU9Q0wKQEAgLTEzMTE4LDQ3ICsyMjY0MiwyNDUgQEAKIGFjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY3h4X2NvbXBpbGVyX2dudQogCiAKLSAgICAjIFRyYW5zbGF0ZSAiZ2NjIC1FIiBpbnRvICJgd2hpY2ggZ2NjYCAtRSIgaWUKLSAgICAjIGV4dHJhY3QgdGhlIGZ1bGwgcGF0aCB0byB0aGUgYmluYXJ5IGFuZCBhdCB0aGUKLSAgICAjIHNhbWUgdGltZSBtYWludGFpbiBhbnkgYXJndW1lbnRzIHBhc3NlZCB0byBpdC4KLSAgICAjIFRoZSBjb21tYW5kIE1VU1QgZXhpc3QgaW4gdGhlIHBhdGgsIG9yIGVsc2UhCi0gICAgdG1wPSIkQ1BQIgotICAgIGNhcj0iJHt0bXAlJSAqfSIKLSAgICB0bXA9IiRDUFAgRU9MIgotICAgIGNkcj0iJHt0bXAjKiB9IgotICAgICMgT24gd2luZG93cyB3ZSB3YW50IHBhdGhzIHdpdGhvdXQgc3BhY2VzLgotICAgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PUyIgPSAieHdpbmRvd3MiOyB0aGVuCisgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLmN5Z3dpbiI7IHRoZW4KIAotICAgICMgVHJhbnNsYXRlIGxvbmcgY3lnZHJpdmUgb3IgQzpcc2Rmc2YgcGF0aAotICAgICMgaW50byBhIHNob3J0IG1peGVkIG1vZGUgcGF0aCB0aGF0IGhhcyBubwotICAgICMgc3BhY2VzIGluIGl0LgotICAgIHRtcD0iJGNhciIKKyAgIyBGaXJzdCBzZXBhcmF0ZSB0aGUgcGF0aCBmcm9tIHRoZSBhcmd1bWVudHMuIFRoaXMgd2lsbCBzcGxpdCBhdCB0aGUgZmlyc3QKKyAgIyBzcGFjZS4KKyAgY29tcGxldGU9IiRDUFAiCisgIHBhdGg9IiR7Y29tcGxldGUlJSAqfSIKKyAgdG1wPSIkY29tcGxldGUgRU9MIgorICBhcmd1bWVudHM9IiR7dG1wIyogfSIKIAotICAgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PUyIgPSAieHdpbmRvd3MiOyB0aGVuCi0gICAgICAgIHRtcD1gJENZR1BBVEggLXUgIiRjYXIiYAotICAgICAgICB0bXA9YHdoaWNoICIkdG1wImAKLSAgICAgICAgIyBJZiBmaWxlIGV4aXN0cyB3aXRoIC5leGUgYXBwZW5kZWQsIHRoYXQncyB0aGUgcmVhbCBmaWxlbmFtZQotICAgICAgICAjIGFuZCBjeWdwYXRoIG5lZWRzIHRoYXQgdG8gY29udmVydCB0byBzaG9ydCBzdHlsZSBwYXRoLgotICAgICAgICBpZiB0ZXN0IC1mICIke3RtcH0uZXhlIjsgdGhlbgotICAgICAgICAgICB0bXA9IiR7dG1wfS5leGUiCi0gICAgICAgIGVsaWYgdGVzdCAtZiAiJHt0bXB9LmNtZCI7IHRoZW4KLSAgICAgICAgICAgdG1wPSIke3RtcH0uY21kIgorICAjIElucHV0IG1pZ2h0IGJlIGdpdmVuIGFzIFdpbmRvd3MgZm9ybWF0LCBzdGFydCBieSBjb252ZXJ0aW5nIHRvCisgICMgdW5peCBmb3JtYXQuCisgIG5ld19wYXRoPWAkQ1lHUEFUSCAtdSAiJHBhdGgiYAorCisgICMgTm93IHRyeSB0byBsb2NhdGUgZXhlY3V0YWJsZSB1c2luZyB3aGljaAorICBuZXdfcGF0aD1gJFdISUNIICIkbmV3X3BhdGgiIDI+IC9kZXYvbnVsbGAKKyAgaWYgdGVzdCAieCRuZXdfcGF0aCIgPSB4OyB0aGVuCisgICAgIyBPb3BzLiBXaGljaCBkaWRuJ3QgZmluZCB0aGUgZXhlY3V0YWJsZS4KKyAgICAjIFRoZSBzcGxpdHRpbmcgb2YgYXJndW1lbnRzIGZyb20gdGhlIGV4ZWN1dGFibGUgYXQgYSBzcGFjZSBtaWdodCBoYXZlIGJlZW4gaW5jb3JyZWN0LAorICAgICMgc2luY2UgcGF0aHMgd2l0aCBzcGFjZSBhcmUgbW9yZSBsaWtlbHkgaW4gV2luZG93cy4gR2l2ZSBpdCBhbm90aGVyIHRyeSB3aXRoIHRoZSB3aG9sZQorICAgICMgYXJndW1lbnQuCisgICAgcGF0aD0iJGNvbXBsZXRlIgorICAgIGFyZ3VtZW50cz0iRU9MIgorICAgIG5ld19wYXRoPWAkQ1lHUEFUSCAtdSAiJHBhdGgiYAorICAgIG5ld19wYXRoPWAkV0hJQ0ggIiRuZXdfcGF0aCIgMj4gL2Rldi9udWxsYAorICAgIGlmIHRlc3QgIngkbmV3X3BhdGgiID0geDsgdGhlbgorICAgICAgIyBJdCdzIHN0aWxsIG5vdCBmb3VuZC4gTm93IHRoaXMgaXMgYW4gdW5yZWNvdmVyYWJsZSBlcnJvci4KKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGhlIHBhdGggb2YgQ1BQLCB3aGljaCByZXNvbHZlcyBhcyBcIiRjb21wbGV0ZVwiLCBpcyBub3QgZm91bmQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoZSBwYXRoIG9mIENQUCwgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkY29tcGxldGVcIiwgaXMgbm90IGZvdW5kLiIgPiY2O30KKyAgICAgIGhhc19zcGFjZT1gJEVDSE8gIiRjb21wbGV0ZSIgfCAkR1JFUCAiICJgCisgICAgICBpZiB0ZXN0ICJ4JGhhc19zcGFjZSIgIT0geDsgdGhlbgorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFlvdSBtaWdodCBiZSBtaXhpbmcgc3BhY2VzIGluIHRoZSBwYXRoIGFuZCBleHRyYSBhcmd1bWVudHMsIHdoaWNoIGlzIG5vdCBhbGxvd2VkLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBZb3UgbWlnaHQgYmUgbWl4aW5nIHNwYWNlcyBpbiB0aGUgcGF0aCBhbmQgZXh0cmEgYXJndW1lbnRzLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iID4mNjt9CisgICAgICBmaQorICAgICAgYXNfZm5fZXJyb3IgJD8gIkNhbm5vdCBsb2NhdGUgdGhlIHRoZSBwYXRoIG9mIENQUCIgIiRMSU5FTk8iIDUKKyAgICBmaQorICBmaQorCisgICMgQ3lnd2luIHRyaWVzIHRvIGhpZGUgc29tZSBhc3BlY3RzIG9mIHRoZSBXaW5kb3dzIGZpbGUgc3lzdGVtLCBzdWNoIHRoYXQgYmluYXJpZXMgYXJlCisgICMgbmFtZWQgLmV4ZSBidXQgY2FsbGVkIHdpdGhvdXQgdGhhdCBzdWZmaXguIFRoZXJlZm9yZSwgImZvbyIgYW5kICJmb28uZXhlIiBhcmUgY29uc2lkZXJlZAorICAjIHRoZSBzYW1lIGZpbGUsIG1vc3Qgb2YgdGhlIHRpbWUgKGFzIGluICJ0ZXN0IC1mIikuIEJ1dCBub3Qgd2hlbiBydW5uaW5nIGN5Z3BhdGggLXMsIHRoZW4KKyAgIyAiZm9vLmV4ZSIgaXMgT0sgYnV0ICJmb28iIGlzIGFuIGVycm9yLgorICAjCisgICMgVGhpcyB0ZXN0IGlzIHRoZXJlZm9yZSBzbGlnaHRseSBtb3JlIGFjY3VyYXRlIHRoYW4gInRlc3QgLWYiIHRvIGNoZWNrIGZvciBmaWxlIHByZWNlbnNlLgorICAjIEl0IGlzIGFsc28gYSB3YXkgdG8gbWFrZSBzdXJlIHdlIGdvdCB0aGUgcHJvcGVyIGZpbGUgbmFtZSBmb3IgdGhlIHJlYWwgdGVzdCBsYXRlciBvbi4KKyAgdGVzdF9zaG9ydHBhdGg9YCRDWUdQQVRIIC1zIC1tICIkbmV3X3BhdGgiIDI+IC9kZXYvbnVsbGAKKyAgaWYgdGVzdCAieCR0ZXN0X3Nob3J0cGF0aCIgPSB4OyB0aGVuCisgICAgIyBTaG9ydCBwYXRoIGZhaWxlZCwgZmlsZSBkb2VzIG5vdCBleGlzdCBhcyBzcGVjaWZpZWQuCisgICAgIyBUcnkgYWRkaW5nIC5leGUgb3IgLmNtZAorICAgIGlmIHRlc3QgLWYgIiR7bmV3X3BhdGh9LmV4ZSI7IHRoZW4KKyAgICAgICBpbnB1dF90b19zaG9ydHBhdGg9IiR7bmV3X3BhdGh9LmV4ZSIKKyAgICBlbGlmIHRlc3QgLWYgIiR7bmV3X3BhdGh9LmNtZCI7IHRoZW4KKyAgICAgICBpbnB1dF90b19zaG9ydHBhdGg9IiR7bmV3X3BhdGh9LmNtZCIKKyAgICBlbHNlCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSBwYXRoIG9mIENQUCwgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkbmV3X3BhdGhcIiwgaXMgaW52YWxpZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhlIHBhdGggb2YgQ1BQLCB3aGljaCByZXNvbHZlcyBhcyBcIiRuZXdfcGF0aFwiLCBpcyBpbnZhbGlkLiIgPiY2O30KKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogTmVpdGhlciBcIiRuZXdfcGF0aFwiIG5vciBcIiRuZXdfcGF0aC5leGUvY21kXCIgY2FuIGJlIGZvdW5kIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IE5laXRoZXIgXCIkbmV3X3BhdGhcIiBub3IgXCIkbmV3X3BhdGguZXhlL2NtZFwiIGNhbiBiZSBmb3VuZCIgPiY2O30KKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJDYW5ub3QgbG9jYXRlIHRoZSB0aGUgcGF0aCBvZiBDUFAiICIkTElORU5PIiA1CisgICAgZmkKKyAgZWxzZQorICAgIGlucHV0X3RvX3Nob3J0cGF0aD0iJG5ld19wYXRoIgorICBmaQorCisgICMgQ2FsbCBoZWxwZXIgZnVuY3Rpb24gd2hpY2ggcG9zc2libHkgY29udmVydHMgdGhpcyB1c2luZyBET1Mtc3R5bGUgc2hvcnQgbW9kZS4KKyAgIyBJZiBzbywgdGhlIHVwZGF0ZWQgcGF0aCBpcyBzdG9yZWQgaW4gJG5ld19wYXRoLgorICBuZXdfcGF0aD0iJGlucHV0X3RvX3Nob3J0cGF0aCIKKworICBpbnB1dF9wYXRoPSIkaW5wdXRfdG9fc2hvcnRwYXRoIgorICAjIENoZWNrIGlmIHdlIG5lZWQgdG8gY29udmVydCB0aGlzIHVzaW5nIERPUy1zdHlsZSBzaG9ydCBtb2RlLiBJZiB0aGUgcGF0aAorICAjIGNvbnRhaW5zIGp1c3Qgc2ltcGxlIGNoYXJhY3RlcnMsIHVzZSBpdC4gT3RoZXJ3aXNlIChzcGFjZXMsIHdlaXJkIGNoYXJhY3RlcnMpLAorICAjIHRha2Ugbm8gY2hhbmNlcyBhbmQgcmV3cml0ZSBpdC4KKyAgIyBOb3RlOiBtNCBlYXRzIG91ciBbXSwgc28gd2UgbmVlZCB0byB1c2UgWyBhbmQgXSBpbnN0ZWFkLgorICBoYXNfZm9yYmlkZGVuX2NoYXJzPWAkRUNITyAiJGlucHV0X3BhdGgiIHwgJEdSRVAgW14tLl8vYS16QS1aMC05XWAKKyAgaWYgdGVzdCAieCRoYXNfZm9yYmlkZGVuX2NoYXJzIiAhPSB4OyB0aGVuCisgICAgIyBOb3cgY29udmVydCBpdCB0byBtaXhlZCBET1Mtc3R5bGUsIHNob3J0IG1vZGUgKG5vIHNwYWNlcywgYW5kIC8gaW5zdGVhZCBvZiBcKQorICAgIHNob3J0bW9kZV9wYXRoPWAkQ1lHUEFUSCAtcyAtbSAtYSAiJGlucHV0X3BhdGgiYAorICAgIHBhdGhfYWZ0ZXJfc2hvcnRtb2RlPWAkQ1lHUEFUSCAtdSAiJHNob3J0bW9kZV9wYXRoImAKKyAgICBpZiB0ZXN0ICJ4JHBhdGhfYWZ0ZXJfc2hvcnRtb2RlIiAhPSAieCRpbnB1dF90b19zaG9ydHBhdGgiOyB0aGVuCisgICAgICAjIEdvaW5nIHRvIHNob3J0IG1vZGUgYW5kIGJhY2sgYWdhaW4gZGlkIGluZGVlZCBtYXR0ZXIuIFNpbmNlIHNob3J0IG1vZGUgaXMKKyAgICAgICMgY2FzZSBpbnNlbnNpdGl2ZSwgbGV0J3MgbWFrZSBpdCBsb3dlcmNhc2UgdG8gaW1wcm92ZSByZWFkYWJpbGl0eS4KKyAgICAgIHNob3J0bW9kZV9wYXRoPWAkRUNITyAiJHNob3J0bW9kZV9wYXRoIiB8ICRUUiAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidgCisgICAgICAjIE5vdyBjb252ZXJ0IGl0IGJhY2sgdG8gVW5peC1zdGlsZSAoY3lncGF0aCkKKyAgICAgIGlucHV0X3BhdGg9YCRDWUdQQVRIIC11ICIkc2hvcnRtb2RlX3BhdGgiYAorICAgICAgbmV3X3BhdGg9IiRpbnB1dF9wYXRoIgorICAgIGZpCisgIGZpCisKKyAgdGVzdF9jeWdkcml2ZV9wcmVmaXg9YCRFQ0hPICRpbnB1dF9wYXRoIHwgJEdSRVAgXi9jeWdkcml2ZS9gCisgIGlmIHRlc3QgIngkdGVzdF9jeWdkcml2ZV9wcmVmaXgiID0geDsgdGhlbgorICAgICMgQXMgYSBzaW1wbGUgZml4LCBleGNsdWRlIC91c3IvYmluIHNpbmNlIGl0J3Mgbm90IGEgcmVhbCBwYXRoLgorICAgIGlmIHRlc3QgInhgJEVDSE8gJGlucHV0X3RvX3Nob3J0cGF0aCB8ICRHUkVQIF4vdXNyL2Jpbi9gIiA9IHg7IHRoZW4KKyAgICAgICMgVGhlIHBhdGggaXMgaW4gYSBDeWd3aW4gc3BlY2lhbCBkaXJlY3RvcnkgKGUuZy4gL2hvbWUpLiBXZSBuZWVkIHRoaXMgY29udmVydGVkIHRvCisgICAgICAjIGEgcGF0aCBwcmVmaXhlZCBieSAvY3lnZHJpdmUgZm9yIGZpeHBhdGggdG8gd29yay4KKyAgICAgIG5ld19wYXRoPSIkQ1lHV0lOX1JPT1RfUEFUSCRpbnB1dF9wYXRoIgorICAgIGZpCisgIGZpCisKKyAgIyByZW1vdmUgdHJhaWxpbmcgLmV4ZSBpZiBhbnkKKyAgbmV3X3BhdGg9IiR7bmV3X3BhdGgvJS5leGUvfSIKKworICBlbGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLm1zeXMiOyB0aGVuCisKKyAgIyBGaXJzdCBzZXBhcmF0ZSB0aGUgcGF0aCBmcm9tIHRoZSBhcmd1bWVudHMuIFRoaXMgd2lsbCBzcGxpdCBhdCB0aGUgZmlyc3QKKyAgIyBzcGFjZS4KKyAgY29tcGxldGU9IiRDUFAiCisgIHBhdGg9IiR7Y29tcGxldGUlJSAqfSIKKyAgdG1wPSIkY29tcGxldGUgRU9MIgorICBhcmd1bWVudHM9IiR7dG1wIyogfSIKKworICAjIElucHV0IG1pZ2h0IGJlIGdpdmVuIGFzIFdpbmRvd3MgZm9ybWF0LCBzdGFydCBieSBjb252ZXJ0aW5nIHRvCisgICMgdW5peCBmb3JtYXQuCisgIG5ld19wYXRoPSIkcGF0aCIKKworICB3aW5kb3dzX3BhdGg9IiRuZXdfcGF0aCIKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJENZR1BBVEggLXUgIiR3aW5kb3dzX3BhdGgiYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBlbGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLm1zeXMiOyB0aGVuCisgICAgdW5peF9wYXRoPWAkRUNITyAiJHdpbmRvd3NfcGF0aCIgfCAkU0VEIC1lICdzLF5cXCguXFwpOiwvXFwxLGcnIC1lICdzLFxcXFwsLyxnJ2AKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZmkKKworCisgICMgTm93IHRyeSB0byBsb2NhdGUgZXhlY3V0YWJsZSB1c2luZyB3aGljaAorICBuZXdfcGF0aD1gJFdISUNIICIkbmV3X3BhdGgiIDI+IC9kZXYvbnVsbGAKKworICBpZiB0ZXN0ICJ4JG5ld19wYXRoIiA9IHg7IHRoZW4KKyAgICAjIE9vcHMuIFdoaWNoIGRpZG4ndCBmaW5kIHRoZSBleGVjdXRhYmxlLgorICAgICMgVGhlIHNwbGl0dGluZyBvZiBhcmd1bWVudHMgZnJvbSB0aGUgZXhlY3V0YWJsZSBhdCBhIHNwYWNlIG1pZ2h0IGhhdmUgYmVlbiBpbmNvcnJlY3QsCisgICAgIyBzaW5jZSBwYXRocyB3aXRoIHNwYWNlIGFyZSBtb3JlIGxpa2VseSBpbiBXaW5kb3dzLiBHaXZlIGl0IGFub3RoZXIgdHJ5IHdpdGggdGhlIHdob2xlCisgICAgIyBhcmd1bWVudC4KKyAgICBwYXRoPSIkY29tcGxldGUiCisgICAgYXJndW1lbnRzPSJFT0wiCisgICAgbmV3X3BhdGg9IiRwYXRoIgorCisgIHdpbmRvd3NfcGF0aD0iJG5ld19wYXRoIgorICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5jeWd3aW4iOyB0aGVuCisgICAgdW5peF9wYXRoPWAkQ1lHUEFUSCAtdSAiJHdpbmRvd3NfcGF0aCJgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGVsaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MubXN5cyI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRFQ0hPICIkd2luZG93c19wYXRoIiB8ICRTRUQgLWUgJ3MsXlxcKC5cXCk6LC9cXDEsZycgLWUgJ3MsXFxcXCwvLGcnYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBmaQorCisKKyAgICBuZXdfcGF0aD1gJFdISUNIICIkbmV3X3BhdGgiIDI+IC9kZXYvbnVsbGAKKworICAgIGlmIHRlc3QgIngkbmV3X3BhdGgiID0geDsgdGhlbgorICAgICAgIyBJdCdzIHN0aWxsIG5vdCBmb3VuZC4gTm93IHRoaXMgaXMgYW4gdW5yZWNvdmVyYWJsZSBlcnJvci4KKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGhlIHBhdGggb2YgQ1BQLCB3aGljaCByZXNvbHZlcyBhcyBcIiRjb21wbGV0ZVwiLCBpcyBub3QgZm91bmQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoZSBwYXRoIG9mIENQUCwgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkY29tcGxldGVcIiwgaXMgbm90IGZvdW5kLiIgPiY2O30KKyAgICAgIGhhc19zcGFjZT1gJEVDSE8gIiRjb21wbGV0ZSIgfCAkR1JFUCAiICJgCisgICAgICBpZiB0ZXN0ICJ4JGhhc19zcGFjZSIgIT0geDsgdGhlbgorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFlvdSBtaWdodCBiZSBtaXhpbmcgc3BhY2VzIGluIHRoZSBwYXRoIGFuZCBleHRyYSBhcmd1bWVudHMsIHdoaWNoIGlzIG5vdCBhbGxvd2VkLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBZb3UgbWlnaHQgYmUgbWl4aW5nIHNwYWNlcyBpbiB0aGUgcGF0aCBhbmQgZXh0cmEgYXJndW1lbnRzLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iID4mNjt9CisgICAgICBmaQorICAgICAgYXNfZm5fZXJyb3IgJD8gIkNhbm5vdCBsb2NhdGUgdGhlIHRoZSBwYXRoIG9mIENQUCIgIiRMSU5FTk8iIDUKKyAgICBmaQorICBmaQorCisgICMgTm93IG5ld19wYXRoIGhhcyBhIGNvbXBsZXRlIHVuaXggcGF0aCB0byB0aGUgYmluYXJ5CisgIGlmIHRlc3QgInhgJEVDSE8gJG5ld19wYXRoIHwgJEdSRVAgXi9iaW4vYCIgIT0geDsgdGhlbgorICAgICMgS2VlcCBwYXRocyBpbiAvYmluIGFzLWlzLCBidXQgcmVtb3ZlIHRyYWlsaW5nIC5leGUgaWYgYW55CisgICAgbmV3X3BhdGg9IiR7bmV3X3BhdGgvJS5leGUvfSIKKyAgICAjIERvIG5vdCBzYXZlIC9iaW4gcGF0aHMgdG8gYWxsX2ZpeHBhdGhfcHJlZml4ZXMhCisgIGVsc2UKKyAgICAjIE5vdCBpbiBtaXhlZCBvciBXaW5kb3dzIHN0eWxlLCBzdGFydCBieSB0aGF0LgorICAgIG5ld19wYXRoPWBjbWQgLy9jIGVjaG8gJG5ld19wYXRoYAorCisgIGlucHV0X3BhdGg9IiRuZXdfcGF0aCIKKyAgIyBDaGVjayBpZiB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhpcyB1c2luZyBET1Mtc3R5bGUgc2hvcnQgbW9kZS4gSWYgdGhlIHBhdGgKKyAgIyBjb250YWlucyBqdXN0IHNpbXBsZSBjaGFyYWN0ZXJzLCB1c2UgaXQuIE90aGVyd2lzZSAoc3BhY2VzLCB3ZWlyZCBjaGFyYWN0ZXJzKSwKKyAgIyB0YWtlIG5vIGNoYW5jZXMgYW5kIHJld3JpdGUgaXQuCisgICMgTm90ZTogbTQgZWF0cyBvdXIgW10sIHNvIHdlIG5lZWQgdG8gdXNlIFsgYW5kIF0gaW5zdGVhZC4KKyAgaGFzX2ZvcmJpZGRlbl9jaGFycz1gJEVDSE8gIiRpbnB1dF9wYXRoIiB8ICRHUkVQIFteLV8vOmEtekEtWjAtOV1gCisgIGlmIHRlc3QgIngkaGFzX2ZvcmJpZGRlbl9jaGFycyIgIT0geDsgdGhlbgorICAgICMgTm93IGNvbnZlcnQgaXQgdG8gbWl4ZWQgRE9TLXN0eWxlLCBzaG9ydCBtb2RlIChubyBzcGFjZXMsIGFuZCAvIGluc3RlYWQgb2YgXCkKKyAgICBuZXdfcGF0aD1gY21kIC9jICJmb3IgJUEgaW4gKFwiJGlucHV0X3BhdGhcIikgZG8gQGVjaG8gJX5zQSJ8JFRSIFxcXFxcXFxcIC8gfCAkVFIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAorICBmaQorCisgICAgIyBPdXRwdXQgaXMgaW4gJG5ld19wYXRoCisKKyAgd2luZG93c19wYXRoPSIkbmV3X3BhdGgiCisgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLmN5Z3dpbiI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRDWUdQQVRIIC11ICIkd2luZG93c19wYXRoImAKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJEVDSE8gIiR3aW5kb3dzX3BhdGgiIHwgJFNFRCAtZSAncyxeXFwoLlxcKTosL1xcMSxnJyAtZSAncyxcXFxcLC8sZydgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGZpCisKKyAgICAjIHJlbW92ZSB0cmFpbGluZyAuZXhlIGlmIGFueQorICAgIG5ld19wYXRoPSIke25ld19wYXRoLyUuZXhlL30iCisKKyAgICAjIFNhdmUgdGhlIGZpcnN0IDEwIGJ5dGVzIG9mIHRoaXMgcGF0aCB0byB0aGUgc3RvcmFnZSwgc28gZml4cGF0aCBjYW4gd29yay4KKyAgICBhbGxfZml4cGF0aF9wcmVmaXhlcz0oIiR7YWxsX2ZpeHBhdGhfcHJlZml4ZXNbQF19IiAiJHtuZXdfcGF0aDowOjEwfSIpCisgIGZpCisKKyAgZWxzZQorICAgICMgV2UncmUgb24gYSBwb3NpeCBwbGF0Zm9ybS4gSG9vcmF5ISA6KQorICAgICMgRmlyc3Qgc2VwYXJhdGUgdGhlIHBhdGggZnJvbSB0aGUgYXJndW1lbnRzLiBUaGlzIHdpbGwgc3BsaXQgYXQgdGhlIGZpcnN0CisgICAgIyBzcGFjZS4KKyAgICBjb21wbGV0ZT0iJENQUCIKKyAgICBwYXRoPSIke2NvbXBsZXRlJSUgKn0iCisgICAgdG1wPSIkY29tcGxldGUgRU9MIgorICAgIGFyZ3VtZW50cz0iJHt0bXAjKiB9IgorCisgICAgbmV3X3BhdGg9YCRXSElDSCAkcGF0aCAyPiAvZGV2L251bGxgCisgICAgaWYgdGVzdCAieCRuZXdfcGF0aCIgPSB4OyB0aGVuCisgICAgICBpc19hYnNvbHV0ZV9wYXRoPWAkRUNITyAiJHBhdGgiIHwgJEdSRVAgXi9gCisgICAgICBpZiB0ZXN0ICJ4JGlzX2Fic29sdXRlX3BhdGgiICE9IHg7IHRoZW4KKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBSZXNvbHZpbmcgQ1BQIChhcyAkcGF0aCkgd2l0aCAnd2hpY2gnIGZhaWxlZCwgdXNpbmcgJHBhdGggZGlyZWN0bHkuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFJlc29sdmluZyBDUFAgKGFzICRwYXRoKSB3aXRoICd3aGljaCcgZmFpbGVkLCB1c2luZyAkcGF0aCBkaXJlY3RseS4iID4mNjt9CisgICAgICAgIG5ld19wYXRoPSIkcGF0aCIKKyAgICAgIGVsc2UKKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUaGUgcGF0aCBvZiBDUFAsIHdoaWNoIHJlc29sdmVzIGFzIFwiJGNvbXBsZXRlXCIsIGlzIG5vdCBmb3VuZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhlIHBhdGggb2YgQ1BQLCB3aGljaCByZXNvbHZlcyBhcyBcIiRjb21wbGV0ZVwiLCBpcyBub3QgZm91bmQuIiA+JjY7fQorICAgICAgICBoYXNfc3BhY2U9YCRFQ0hPICIkY29tcGxldGUiIHwgJEdSRVAgIiAiYAorICAgICAgICBpZiB0ZXN0ICJ4JGhhc19zcGFjZSIgIT0geDsgdGhlbgorICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGhpcyBtaWdodCBiZSBjYXVzZWQgYnkgc3BhY2VzIGluIHRoZSBwYXRoLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhpcyBtaWdodCBiZSBjYXVzZWQgYnkgc3BhY2VzIGluIHRoZSBwYXRoLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iID4mNjt9CiAgICAgICAgIGZpCi0gICAgICAgICMgQ29udmVydCB0byBDOi8gbWl4ZWQgc3R5bGUgcGF0aCB3aXRob3V0IHNwYWNlcy4KLSAgICAgICAgIHRtcD1gJENZR1BBVEggLXMgLW0gIiR0bXAiYAorICAgICAgICBhc19mbl9lcnJvciAkPyAiQ2Fubm90IGxvY2F0ZSB0aGUgdGhlIHBhdGggb2YgQ1BQIiAiJExJTkVOTyIgNQorICAgICAgZmkKICAgICBmaQotICAgIGNhcj0iJHRtcCIKKyAgZmkKIAotICAgIGVsc2UKLSAgICAgICAgIyAid2hpY2giIGlzIG5vdCBwb3J0YWJsZSwgYnV0IGlzIHVzZWQgaGVyZQotICAgICAgICAjIGJlY2F1c2Ugd2Uga25vdyB0aGF0IHRoZSBjb21tYW5kIGV4aXN0cyEKLSAgICAgICAgY2FyPWB3aGljaCAkY2FyYAotICAgIGZpCi0gICAgaWYgdGVzdCAieCRjZHIiICE9IHhFT0w7IHRoZW4KLSAgICAgICAgQ1BQPSIkY2FyICR7Y2RyJSAqfSIKLSAgICBlbHNlCi0gICAgICAgIENQUD0iJGNhciIKLSAgICBmaQorICAjIE5vdyBqb2luIHRvZ2V0aGVyIHRoZSBwYXRoIGFuZCB0aGUgYXJndW1lbnRzIG9uY2UgYWdhaW4KKyAgaWYgdGVzdCAieCRhcmd1bWVudHMiICE9IHhFT0w7IHRoZW4KKyAgICAgIG5ld19jb21wbGV0ZT0iJG5ld19wYXRoICR7YXJndW1lbnRzJSAqfSIKKyAgZWxzZQorICAgICAgbmV3X2NvbXBsZXRlPSIkbmV3X3BhdGgiCisgIGZpCisKKyAgaWYgdGVzdCAieCRjb21wbGV0ZSIgIT0gIngkbmV3X2NvbXBsZXRlIjsgdGhlbgorICAgIENQUD0iJG5ld19jb21wbGV0ZSIKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFJld3JpdGluZyBDUFAgdG8gXCIkbmV3X2NvbXBsZXRlXCIiID4mNQorJGFzX2VjaG8gIiRhc19tZTogUmV3cml0aW5nIENQUCB0byBcIiRuZXdfY29tcGxldGVcIiIgPiY2O30KKyAgZmkKIAogCiBhY19leHQ9Y3BwCkBAIC0xMzI5NSw0NyArMjMwMTcsMjQ1IEBACiBhY19jb21waWxlcl9nbnU9JGFjX2N2X2N4eF9jb21waWxlcl9nbnUKIAogCi0gICAgIyBUcmFuc2xhdGUgImdjYyAtRSIgaW50byAiYHdoaWNoIGdjY2AgLUUiIGllCi0gICAgIyBleHRyYWN0IHRoZSBmdWxsIHBhdGggdG8gdGhlIGJpbmFyeSBhbmQgYXQgdGhlCi0gICAgIyBzYW1lIHRpbWUgbWFpbnRhaW4gYW55IGFyZ3VtZW50cyBwYXNzZWQgdG8gaXQuCi0gICAgIyBUaGUgY29tbWFuZCBNVVNUIGV4aXN0IGluIHRoZSBwYXRoLCBvciBlbHNlIQotICAgIHRtcD0iJENYWENQUCIKLSAgICBjYXI9IiR7dG1wJSUgKn0iCi0gICAgdG1wPSIkQ1hYQ1BQIEVPTCIKLSAgICBjZHI9IiR7dG1wIyogfSIKLSAgICAjIE9uIHdpbmRvd3Mgd2Ugd2FudCBwYXRocyB3aXRob3V0IHNwYWNlcy4KLSAgICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1MiID0gInh3aW5kb3dzIjsgdGhlbgorICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5jeWd3aW4iOyB0aGVuCiAKLSAgICAjIFRyYW5zbGF0ZSBsb25nIGN5Z2RyaXZlIG9yIEM6XHNkZnNmIHBhdGgKLSAgICAjIGludG8gYSBzaG9ydCBtaXhlZCBtb2RlIHBhdGggdGhhdCBoYXMgbm8KLSAgICAjIHNwYWNlcyBpbiBpdC4KLSAgICB0bXA9IiRjYXIiCisgICMgRmlyc3Qgc2VwYXJhdGUgdGhlIHBhdGggZnJvbSB0aGUgYXJndW1lbnRzLiBUaGlzIHdpbGwgc3BsaXQgYXQgdGhlIGZpcnN0CisgICMgc3BhY2UuCisgIGNvbXBsZXRlPSIkQ1hYQ1BQIgorICBwYXRoPSIke2NvbXBsZXRlJSUgKn0iCisgIHRtcD0iJGNvbXBsZXRlIEVPTCIKKyAgYXJndW1lbnRzPSIke3RtcCMqIH0iCiAKLSAgICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1MiID0gInh3aW5kb3dzIjsgdGhlbgotICAgICAgICB0bXA9YCRDWUdQQVRIIC11ICIkY2FyImAKLSAgICAgICAgdG1wPWB3aGljaCAiJHRtcCJgCi0gICAgICAgICMgSWYgZmlsZSBleGlzdHMgd2l0aCAuZXhlIGFwcGVuZGVkLCB0aGF0J3MgdGhlIHJlYWwgZmlsZW5hbWUKLSAgICAgICAgIyBhbmQgY3lncGF0aCBuZWVkcyB0aGF0IHRvIGNvbnZlcnQgdG8gc2hvcnQgc3R5bGUgcGF0aC4KLSAgICAgICAgaWYgdGVzdCAtZiAiJHt0bXB9LmV4ZSI7IHRoZW4KLSAgICAgICAgICAgdG1wPSIke3RtcH0uZXhlIgotICAgICAgICBlbGlmIHRlc3QgLWYgIiR7dG1wfS5jbWQiOyB0aGVuCi0gICAgICAgICAgIHRtcD0iJHt0bXB9LmNtZCIKKyAgIyBJbnB1dCBtaWdodCBiZSBnaXZlbiBhcyBXaW5kb3dzIGZvcm1hdCwgc3RhcnQgYnkgY29udmVydGluZyB0bworICAjIHVuaXggZm9ybWF0LgorICBuZXdfcGF0aD1gJENZR1BBVEggLXUgIiRwYXRoImAKKworICAjIE5vdyB0cnkgdG8gbG9jYXRlIGV4ZWN1dGFibGUgdXNpbmcgd2hpY2gKKyAgbmV3X3BhdGg9YCRXSElDSCAiJG5ld19wYXRoIiAyPiAvZGV2L251bGxgCisgIGlmIHRlc3QgIngkbmV3X3BhdGgiID0geDsgdGhlbgorICAgICMgT29wcy4gV2hpY2ggZGlkbid0IGZpbmQgdGhlIGV4ZWN1dGFibGUuCisgICAgIyBUaGUgc3BsaXR0aW5nIG9mIGFyZ3VtZW50cyBmcm9tIHRoZSBleGVjdXRhYmxlIGF0IGEgc3BhY2UgbWlnaHQgaGF2ZSBiZWVuIGluY29ycmVjdCwKKyAgICAjIHNpbmNlIHBhdGhzIHdpdGggc3BhY2UgYXJlIG1vcmUgbGlrZWx5IGluIFdpbmRvd3MuIEdpdmUgaXQgYW5vdGhlciB0cnkgd2l0aCB0aGUgd2hvbGUKKyAgICAjIGFyZ3VtZW50LgorICAgIHBhdGg9IiRjb21wbGV0ZSIKKyAgICBhcmd1bWVudHM9IkVPTCIKKyAgICBuZXdfcGF0aD1gJENZR1BBVEggLXUgIiRwYXRoImAKKyAgICBuZXdfcGF0aD1gJFdISUNIICIkbmV3X3BhdGgiIDI+IC9kZXYvbnVsbGAKKyAgICBpZiB0ZXN0ICJ4JG5ld19wYXRoIiA9IHg7IHRoZW4KKyAgICAgICMgSXQncyBzdGlsbCBub3QgZm91bmQuIE5vdyB0aGlzIGlzIGFuIHVucmVjb3ZlcmFibGUgZXJyb3IuCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSBwYXRoIG9mIENYWENQUCwgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkY29tcGxldGVcIiwgaXMgbm90IGZvdW5kLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUaGUgcGF0aCBvZiBDWFhDUFAsIHdoaWNoIHJlc29sdmVzIGFzIFwiJGNvbXBsZXRlXCIsIGlzIG5vdCBmb3VuZC4iID4mNjt9CisgICAgICBoYXNfc3BhY2U9YCRFQ0hPICIkY29tcGxldGUiIHwgJEdSRVAgIiAiYAorICAgICAgaWYgdGVzdCAieCRoYXNfc3BhY2UiICE9IHg7IHRoZW4KKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBZb3UgbWlnaHQgYmUgbWl4aW5nIHNwYWNlcyBpbiB0aGUgcGF0aCBhbmQgZXh0cmEgYXJndW1lbnRzLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogWW91IG1pZ2h0IGJlIG1peGluZyBzcGFjZXMgaW4gdGhlIHBhdGggYW5kIGV4dHJhIGFyZ3VtZW50cywgd2hpY2ggaXMgbm90IGFsbG93ZWQuIiA+JjY7fQorICAgICAgZmkKKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJDYW5ub3QgbG9jYXRlIHRoZSB0aGUgcGF0aCBvZiBDWFhDUFAiICIkTElORU5PIiA1CisgICAgZmkKKyAgZmkKKworICAjIEN5Z3dpbiB0cmllcyB0byBoaWRlIHNvbWUgYXNwZWN0cyBvZiB0aGUgV2luZG93cyBmaWxlIHN5c3RlbSwgc3VjaCB0aGF0IGJpbmFyaWVzIGFyZQorICAjIG5hbWVkIC5leGUgYnV0IGNhbGxlZCB3aXRob3V0IHRoYXQgc3VmZml4LiBUaGVyZWZvcmUsICJmb28iIGFuZCAiZm9vLmV4ZSIgYXJlIGNvbnNpZGVyZWQKKyAgIyB0aGUgc2FtZSBmaWxlLCBtb3N0IG9mIHRoZSB0aW1lIChhcyBpbiAidGVzdCAtZiIpLiBCdXQgbm90IHdoZW4gcnVubmluZyBjeWdwYXRoIC1zLCB0aGVuCisgICMgImZvby5leGUiIGlzIE9LIGJ1dCAiZm9vIiBpcyBhbiBlcnJvci4KKyAgIworICAjIFRoaXMgdGVzdCBpcyB0aGVyZWZvcmUgc2xpZ2h0bHkgbW9yZSBhY2N1cmF0ZSB0aGFuICJ0ZXN0IC1mIiB0byBjaGVjayBmb3IgZmlsZSBwcmVjZW5zZS4KKyAgIyBJdCBpcyBhbHNvIGEgd2F5IHRvIG1ha2Ugc3VyZSB3ZSBnb3QgdGhlIHByb3BlciBmaWxlIG5hbWUgZm9yIHRoZSByZWFsIHRlc3QgbGF0ZXIgb24uCisgIHRlc3Rfc2hvcnRwYXRoPWAkQ1lHUEFUSCAtcyAtbSAiJG5ld19wYXRoIiAyPiAvZGV2L251bGxgCisgIGlmIHRlc3QgIngkdGVzdF9zaG9ydHBhdGgiID0geDsgdGhlbgorICAgICMgU2hvcnQgcGF0aCBmYWlsZWQsIGZpbGUgZG9lcyBub3QgZXhpc3QgYXMgc3BlY2lmaWVkLgorICAgICMgVHJ5IGFkZGluZyAuZXhlIG9yIC5jbWQKKyAgICBpZiB0ZXN0IC1mICIke25ld19wYXRofS5leGUiOyB0aGVuCisgICAgICAgaW5wdXRfdG9fc2hvcnRwYXRoPSIke25ld19wYXRofS5leGUiCisgICAgZWxpZiB0ZXN0IC1mICIke25ld19wYXRofS5jbWQiOyB0aGVuCisgICAgICAgaW5wdXRfdG9fc2hvcnRwYXRoPSIke25ld19wYXRofS5jbWQiCisgICAgZWxzZQorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUaGUgcGF0aCBvZiBDWFhDUFAsIHdoaWNoIHJlc29sdmVzIGFzIFwiJG5ld19wYXRoXCIsIGlzIGludmFsaWQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoZSBwYXRoIG9mIENYWENQUCwgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkbmV3X3BhdGhcIiwgaXMgaW52YWxpZC4iID4mNjt9CisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IE5laXRoZXIgXCIkbmV3X3BhdGhcIiBub3IgXCIkbmV3X3BhdGguZXhlL2NtZFwiIGNhbiBiZSBmb3VuZCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBOZWl0aGVyIFwiJG5ld19wYXRoXCIgbm9yIFwiJG5ld19wYXRoLmV4ZS9jbWRcIiBjYW4gYmUgZm91bmQiID4mNjt9CisgICAgICBhc19mbl9lcnJvciAkPyAiQ2Fubm90IGxvY2F0ZSB0aGUgdGhlIHBhdGggb2YgQ1hYQ1BQIiAiJExJTkVOTyIgNQorICAgIGZpCisgIGVsc2UKKyAgICBpbnB1dF90b19zaG9ydHBhdGg9IiRuZXdfcGF0aCIKKyAgZmkKKworICAjIENhbGwgaGVscGVyIGZ1bmN0aW9uIHdoaWNoIHBvc3NpYmx5IGNvbnZlcnRzIHRoaXMgdXNpbmcgRE9TLXN0eWxlIHNob3J0IG1vZGUuCisgICMgSWYgc28sIHRoZSB1cGRhdGVkIHBhdGggaXMgc3RvcmVkIGluICRuZXdfcGF0aC4KKyAgbmV3X3BhdGg9IiRpbnB1dF90b19zaG9ydHBhdGgiCisKKyAgaW5wdXRfcGF0aD0iJGlucHV0X3RvX3Nob3J0cGF0aCIKKyAgIyBDaGVjayBpZiB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhpcyB1c2luZyBET1Mtc3R5bGUgc2hvcnQgbW9kZS4gSWYgdGhlIHBhdGgKKyAgIyBjb250YWlucyBqdXN0IHNpbXBsZSBjaGFyYWN0ZXJzLCB1c2UgaXQuIE90aGVyd2lzZSAoc3BhY2VzLCB3ZWlyZCBjaGFyYWN0ZXJzKSwKKyAgIyB0YWtlIG5vIGNoYW5jZXMgYW5kIHJld3JpdGUgaXQuCisgICMgTm90ZTogbTQgZWF0cyBvdXIgW10sIHNvIHdlIG5lZWQgdG8gdXNlIFsgYW5kIF0gaW5zdGVhZC4KKyAgaGFzX2ZvcmJpZGRlbl9jaGFycz1gJEVDSE8gIiRpbnB1dF9wYXRoIiB8ICRHUkVQIFteLS5fL2EtekEtWjAtOV1gCisgIGlmIHRlc3QgIngkaGFzX2ZvcmJpZGRlbl9jaGFycyIgIT0geDsgdGhlbgorICAgICMgTm93IGNvbnZlcnQgaXQgdG8gbWl4ZWQgRE9TLXN0eWxlLCBzaG9ydCBtb2RlIChubyBzcGFjZXMsIGFuZCAvIGluc3RlYWQgb2YgXCkKKyAgICBzaG9ydG1vZGVfcGF0aD1gJENZR1BBVEggLXMgLW0gLWEgIiRpbnB1dF9wYXRoImAKKyAgICBwYXRoX2FmdGVyX3Nob3J0bW9kZT1gJENZR1BBVEggLXUgIiRzaG9ydG1vZGVfcGF0aCJgCisgICAgaWYgdGVzdCAieCRwYXRoX2FmdGVyX3Nob3J0bW9kZSIgIT0gIngkaW5wdXRfdG9fc2hvcnRwYXRoIjsgdGhlbgorICAgICAgIyBHb2luZyB0byBzaG9ydCBtb2RlIGFuZCBiYWNrIGFnYWluIGRpZCBpbmRlZWQgbWF0dGVyLiBTaW5jZSBzaG9ydCBtb2RlIGlzCisgICAgICAjIGNhc2UgaW5zZW5zaXRpdmUsIGxldCdzIG1ha2UgaXQgbG93ZXJjYXNlIHRvIGltcHJvdmUgcmVhZGFiaWxpdHkuCisgICAgICBzaG9ydG1vZGVfcGF0aD1gJEVDSE8gIiRzaG9ydG1vZGVfcGF0aCIgfCAkVFIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAorICAgICAgIyBOb3cgY29udmVydCBpdCBiYWNrIHRvIFVuaXgtc3RpbGUgKGN5Z3BhdGgpCisgICAgICBpbnB1dF9wYXRoPWAkQ1lHUEFUSCAtdSAiJHNob3J0bW9kZV9wYXRoImAKKyAgICAgIG5ld19wYXRoPSIkaW5wdXRfcGF0aCIKKyAgICBmaQorICBmaQorCisgIHRlc3RfY3lnZHJpdmVfcHJlZml4PWAkRUNITyAkaW5wdXRfcGF0aCB8ICRHUkVQIF4vY3lnZHJpdmUvYAorICBpZiB0ZXN0ICJ4JHRlc3RfY3lnZHJpdmVfcHJlZml4IiA9IHg7IHRoZW4KKyAgICAjIEFzIGEgc2ltcGxlIGZpeCwgZXhjbHVkZSAvdXNyL2JpbiBzaW5jZSBpdCdzIG5vdCBhIHJlYWwgcGF0aC4KKyAgICBpZiB0ZXN0ICJ4YCRFQ0hPICRpbnB1dF90b19zaG9ydHBhdGggfCAkR1JFUCBeL3Vzci9iaW4vYCIgPSB4OyB0aGVuCisgICAgICAjIFRoZSBwYXRoIGlzIGluIGEgQ3lnd2luIHNwZWNpYWwgZGlyZWN0b3J5IChlLmcuIC9ob21lKS4gV2UgbmVlZCB0aGlzIGNvbnZlcnRlZCB0bworICAgICAgIyBhIHBhdGggcHJlZml4ZWQgYnkgL2N5Z2RyaXZlIGZvciBmaXhwYXRoIHRvIHdvcmsuCisgICAgICBuZXdfcGF0aD0iJENZR1dJTl9ST09UX1BBVEgkaW5wdXRfcGF0aCIKKyAgICBmaQorICBmaQorCisgICMgcmVtb3ZlIHRyYWlsaW5nIC5leGUgaWYgYW55CisgIG5ld19wYXRoPSIke25ld19wYXRoLyUuZXhlL30iCisKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorCisgICMgRmlyc3Qgc2VwYXJhdGUgdGhlIHBhdGggZnJvbSB0aGUgYXJndW1lbnRzLiBUaGlzIHdpbGwgc3BsaXQgYXQgdGhlIGZpcnN0CisgICMgc3BhY2UuCisgIGNvbXBsZXRlPSIkQ1hYQ1BQIgorICBwYXRoPSIke2NvbXBsZXRlJSUgKn0iCisgIHRtcD0iJGNvbXBsZXRlIEVPTCIKKyAgYXJndW1lbnRzPSIke3RtcCMqIH0iCisKKyAgIyBJbnB1dCBtaWdodCBiZSBnaXZlbiBhcyBXaW5kb3dzIGZvcm1hdCwgc3RhcnQgYnkgY29udmVydGluZyB0bworICAjIHVuaXggZm9ybWF0LgorICBuZXdfcGF0aD0iJHBhdGgiCisKKyAgd2luZG93c19wYXRoPSIkbmV3X3BhdGgiCisgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLmN5Z3dpbiI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRDWUdQQVRIIC11ICIkd2luZG93c19wYXRoImAKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJEVDSE8gIiR3aW5kb3dzX3BhdGgiIHwgJFNFRCAtZSAncyxeXFwoLlxcKTosL1xcMSxnJyAtZSAncyxcXFxcLC8sZydgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGZpCisKKworICAjIE5vdyB0cnkgdG8gbG9jYXRlIGV4ZWN1dGFibGUgdXNpbmcgd2hpY2gKKyAgbmV3X3BhdGg9YCRXSElDSCAiJG5ld19wYXRoIiAyPiAvZGV2L251bGxgCisKKyAgaWYgdGVzdCAieCRuZXdfcGF0aCIgPSB4OyB0aGVuCisgICAgIyBPb3BzLiBXaGljaCBkaWRuJ3QgZmluZCB0aGUgZXhlY3V0YWJsZS4KKyAgICAjIFRoZSBzcGxpdHRpbmcgb2YgYXJndW1lbnRzIGZyb20gdGhlIGV4ZWN1dGFibGUgYXQgYSBzcGFjZSBtaWdodCBoYXZlIGJlZW4gaW5jb3JyZWN0LAorICAgICMgc2luY2UgcGF0aHMgd2l0aCBzcGFjZSBhcmUgbW9yZSBsaWtlbHkgaW4gV2luZG93cy4gR2l2ZSBpdCBhbm90aGVyIHRyeSB3aXRoIHRoZSB3aG9sZQorICAgICMgYXJndW1lbnQuCisgICAgcGF0aD0iJGNvbXBsZXRlIgorICAgIGFyZ3VtZW50cz0iRU9MIgorICAgIG5ld19wYXRoPSIkcGF0aCIKKworICB3aW5kb3dzX3BhdGg9IiRuZXdfcGF0aCIKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJENZR1BBVEggLXUgIiR3aW5kb3dzX3BhdGgiYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBlbGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLm1zeXMiOyB0aGVuCisgICAgdW5peF9wYXRoPWAkRUNITyAiJHdpbmRvd3NfcGF0aCIgfCAkU0VEIC1lICdzLF5cXCguXFwpOiwvXFwxLGcnIC1lICdzLFxcXFwsLyxnJ2AKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZmkKKworCisgICAgbmV3X3BhdGg9YCRXSElDSCAiJG5ld19wYXRoIiAyPiAvZGV2L251bGxgCisKKyAgICBpZiB0ZXN0ICJ4JG5ld19wYXRoIiA9IHg7IHRoZW4KKyAgICAgICMgSXQncyBzdGlsbCBub3QgZm91bmQuIE5vdyB0aGlzIGlzIGFuIHVucmVjb3ZlcmFibGUgZXJyb3IuCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSBwYXRoIG9mIENYWENQUCwgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkY29tcGxldGVcIiwgaXMgbm90IGZvdW5kLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUaGUgcGF0aCBvZiBDWFhDUFAsIHdoaWNoIHJlc29sdmVzIGFzIFwiJGNvbXBsZXRlXCIsIGlzIG5vdCBmb3VuZC4iID4mNjt9CisgICAgICBoYXNfc3BhY2U9YCRFQ0hPICIkY29tcGxldGUiIHwgJEdSRVAgIiAiYAorICAgICAgaWYgdGVzdCAieCRoYXNfc3BhY2UiICE9IHg7IHRoZW4KKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBZb3UgbWlnaHQgYmUgbWl4aW5nIHNwYWNlcyBpbiB0aGUgcGF0aCBhbmQgZXh0cmEgYXJndW1lbnRzLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogWW91IG1pZ2h0IGJlIG1peGluZyBzcGFjZXMgaW4gdGhlIHBhdGggYW5kIGV4dHJhIGFyZ3VtZW50cywgd2hpY2ggaXMgbm90IGFsbG93ZWQuIiA+JjY7fQorICAgICAgZmkKKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJDYW5ub3QgbG9jYXRlIHRoZSB0aGUgcGF0aCBvZiBDWFhDUFAiICIkTElORU5PIiA1CisgICAgZmkKKyAgZmkKKworICAjIE5vdyBuZXdfcGF0aCBoYXMgYSBjb21wbGV0ZSB1bml4IHBhdGggdG8gdGhlIGJpbmFyeQorICBpZiB0ZXN0ICJ4YCRFQ0hPICRuZXdfcGF0aCB8ICRHUkVQIF4vYmluL2AiICE9IHg7IHRoZW4KKyAgICAjIEtlZXAgcGF0aHMgaW4gL2JpbiBhcy1pcywgYnV0IHJlbW92ZSB0cmFpbGluZyAuZXhlIGlmIGFueQorICAgIG5ld19wYXRoPSIke25ld19wYXRoLyUuZXhlL30iCisgICAgIyBEbyBub3Qgc2F2ZSAvYmluIHBhdGhzIHRvIGFsbF9maXhwYXRoX3ByZWZpeGVzIQorICBlbHNlCisgICAgIyBOb3QgaW4gbWl4ZWQgb3IgV2luZG93cyBzdHlsZSwgc3RhcnQgYnkgdGhhdC4KKyAgICBuZXdfcGF0aD1gY21kIC8vYyBlY2hvICRuZXdfcGF0aGAKKworICBpbnB1dF9wYXRoPSIkbmV3X3BhdGgiCisgICMgQ2hlY2sgaWYgd2UgbmVlZCB0byBjb252ZXJ0IHRoaXMgdXNpbmcgRE9TLXN0eWxlIHNob3J0IG1vZGUuIElmIHRoZSBwYXRoCisgICMgY29udGFpbnMganVzdCBzaW1wbGUgY2hhcmFjdGVycywgdXNlIGl0LiBPdGhlcndpc2UgKHNwYWNlcywgd2VpcmQgY2hhcmFjdGVycyksCisgICMgdGFrZSBubyBjaGFuY2VzIGFuZCByZXdyaXRlIGl0LgorICAjIE5vdGU6IG00IGVhdHMgb3VyIFtdLCBzbyB3ZSBuZWVkIHRvIHVzZSBbIGFuZCBdIGluc3RlYWQuCisgIGhhc19mb3JiaWRkZW5fY2hhcnM9YCRFQ0hPICIkaW5wdXRfcGF0aCIgfCAkR1JFUCBbXi1fLzphLXpBLVowLTldYAorICBpZiB0ZXN0ICJ4JGhhc19mb3JiaWRkZW5fY2hhcnMiICE9IHg7IHRoZW4KKyAgICAjIE5vdyBjb252ZXJ0IGl0IHRvIG1peGVkIERPUy1zdHlsZSwgc2hvcnQgbW9kZSAobm8gc3BhY2VzLCBhbmQgLyBpbnN0ZWFkIG9mIFwpCisgICAgbmV3X3BhdGg9YGNtZCAvYyAiZm9yICVBIGluIChcIiRpbnB1dF9wYXRoXCIpIGRvIEBlY2hvICV+c0EifCRUUiBcXFxcXFxcXCAvIHwgJFRSICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J2AKKyAgZmkKKworICAgICMgT3V0cHV0IGlzIGluICRuZXdfcGF0aAorCisgIHdpbmRvd3NfcGF0aD0iJG5ld19wYXRoIgorICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5jeWd3aW4iOyB0aGVuCisgICAgdW5peF9wYXRoPWAkQ1lHUEFUSCAtdSAiJHdpbmRvd3NfcGF0aCJgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGVsaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MubXN5cyI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRFQ0hPICIkd2luZG93c19wYXRoIiB8ICRTRUQgLWUgJ3MsXlxcKC5cXCk6LC9cXDEsZycgLWUgJ3MsXFxcXCwvLGcnYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBmaQorCisgICAgIyByZW1vdmUgdHJhaWxpbmcgLmV4ZSBpZiBhbnkKKyAgICBuZXdfcGF0aD0iJHtuZXdfcGF0aC8lLmV4ZS99IgorCisgICAgIyBTYXZlIHRoZSBmaXJzdCAxMCBieXRlcyBvZiB0aGlzIHBhdGggdG8gdGhlIHN0b3JhZ2UsIHNvIGZpeHBhdGggY2FuIHdvcmsuCisgICAgYWxsX2ZpeHBhdGhfcHJlZml4ZXM9KCIke2FsbF9maXhwYXRoX3ByZWZpeGVzW0BdfSIgIiR7bmV3X3BhdGg6MDoxMH0iKQorICBmaQorCisgIGVsc2UKKyAgICAjIFdlJ3JlIG9uIGEgcG9zaXggcGxhdGZvcm0uIEhvb3JheSEgOikKKyAgICAjIEZpcnN0IHNlcGFyYXRlIHRoZSBwYXRoIGZyb20gdGhlIGFyZ3VtZW50cy4gVGhpcyB3aWxsIHNwbGl0IGF0IHRoZSBmaXJzdAorICAgICMgc3BhY2UuCisgICAgY29tcGxldGU9IiRDWFhDUFAiCisgICAgcGF0aD0iJHtjb21wbGV0ZSUlICp9IgorICAgIHRtcD0iJGNvbXBsZXRlIEVPTCIKKyAgICBhcmd1bWVudHM9IiR7dG1wIyogfSIKKworICAgIG5ld19wYXRoPWAkV0hJQ0ggJHBhdGggMj4gL2Rldi9udWxsYAorICAgIGlmIHRlc3QgIngkbmV3X3BhdGgiID0geDsgdGhlbgorICAgICAgaXNfYWJzb2x1dGVfcGF0aD1gJEVDSE8gIiRwYXRoIiB8ICRHUkVQIF4vYAorICAgICAgaWYgdGVzdCAieCRpc19hYnNvbHV0ZV9wYXRoIiAhPSB4OyB0aGVuCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogUmVzb2x2aW5nIENYWENQUCAoYXMgJHBhdGgpIHdpdGggJ3doaWNoJyBmYWlsZWQsIHVzaW5nICRwYXRoIGRpcmVjdGx5LiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBSZXNvbHZpbmcgQ1hYQ1BQIChhcyAkcGF0aCkgd2l0aCAnd2hpY2gnIGZhaWxlZCwgdXNpbmcgJHBhdGggZGlyZWN0bHkuIiA+JjY7fQorICAgICAgICBuZXdfcGF0aD0iJHBhdGgiCisgICAgICBlbHNlCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGhlIHBhdGggb2YgQ1hYQ1BQLCB3aGljaCByZXNvbHZlcyBhcyBcIiRjb21wbGV0ZVwiLCBpcyBub3QgZm91bmQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoZSBwYXRoIG9mIENYWENQUCwgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkY29tcGxldGVcIiwgaXMgbm90IGZvdW5kLiIgPiY2O30KKyAgICAgICAgaGFzX3NwYWNlPWAkRUNITyAiJGNvbXBsZXRlIiB8ICRHUkVQICIgImAKKyAgICAgICAgaWYgdGVzdCAieCRoYXNfc3BhY2UiICE9IHg7IHRoZW4KKyAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoaXMgbWlnaHQgYmUgY2F1c2VkIGJ5IHNwYWNlcyBpbiB0aGUgcGF0aCwgd2hpY2ggaXMgbm90IGFsbG93ZWQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoaXMgbWlnaHQgYmUgY2F1c2VkIGJ5IHNwYWNlcyBpbiB0aGUgcGF0aCwgd2hpY2ggaXMgbm90IGFsbG93ZWQuIiA+JjY7fQogICAgICAgICBmaQotICAgICAgICAjIENvbnZlcnQgdG8gQzovIG1peGVkIHN0eWxlIHBhdGggd2l0aG91dCBzcGFjZXMuCi0gICAgICAgICB0bXA9YCRDWUdQQVRIIC1zIC1tICIkdG1wImAKKyAgICAgICAgYXNfZm5fZXJyb3IgJD8gIkNhbm5vdCBsb2NhdGUgdGhlIHRoZSBwYXRoIG9mIENYWENQUCIgIiRMSU5FTk8iIDUKKyAgICAgIGZpCiAgICAgZmkKLSAgICBjYXI9IiR0bXAiCisgIGZpCiAKLSAgICBlbHNlCi0gICAgICAgICMgIndoaWNoIiBpcyBub3QgcG9ydGFibGUsIGJ1dCBpcyB1c2VkIGhlcmUKLSAgICAgICAgIyBiZWNhdXNlIHdlIGtub3cgdGhhdCB0aGUgY29tbWFuZCBleGlzdHMhCi0gICAgICAgIGNhcj1gd2hpY2ggJGNhcmAKLSAgICBmaQotICAgIGlmIHRlc3QgIngkY2RyIiAhPSB4RU9MOyB0aGVuCi0gICAgICAgIENYWENQUD0iJGNhciAke2NkciUgKn0iCi0gICAgZWxzZQotICAgICAgICBDWFhDUFA9IiRjYXIiCi0gICAgZmkKKyAgIyBOb3cgam9pbiB0b2dldGhlciB0aGUgcGF0aCBhbmQgdGhlIGFyZ3VtZW50cyBvbmNlIGFnYWluCisgIGlmIHRlc3QgIngkYXJndW1lbnRzIiAhPSB4RU9MOyB0aGVuCisgICAgICBuZXdfY29tcGxldGU9IiRuZXdfcGF0aCAke2FyZ3VtZW50cyUgKn0iCisgIGVsc2UKKyAgICAgIG5ld19jb21wbGV0ZT0iJG5ld19wYXRoIgorICBmaQorCisgIGlmIHRlc3QgIngkY29tcGxldGUiICE9ICJ4JG5ld19jb21wbGV0ZSI7IHRoZW4KKyAgICBDWFhDUFA9IiRuZXdfY29tcGxldGUiCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBSZXdyaXRpbmcgQ1hYQ1BQIHRvIFwiJG5ld19jb21wbGV0ZVwiIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFJld3JpdGluZyBDWFhDUFAgdG8gXCIkbmV3X2NvbXBsZXRlXCIiID4mNjt9CisgIGZpCiAKIAogaWYgdGVzdCAieCRDT01QSUxFX1RZUEUiICE9ICJ4Y3Jvc3MiOyB0aGVuCkBAIC0xMzM1OSw3ICsyMzI3OSw3IEBACiBmaQogCiAjIEZpbmQgdGhlIHJpZ2h0IGFzc2VtYmxlci4KLWlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PUyIgPSB4c29sYXJpczsgdGhlbgoraWYgdGVzdCAieCRPUEVOSkRLX1RBUkdFVF9PUyIgPSB4c29sYXJpczsgdGhlbgogICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiYXMiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgogc2V0IGR1bW15IGFzOyBhY193b3JkPSQyCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CkBAIC0xMzQwMSw1NCArMjMzMjEsMjUyIEBACiAKIAogCi0gICAgIyBUcmFuc2xhdGUgImdjYyAtRSIgaW50byAiYHdoaWNoIGdjY2AgLUUiIGllCi0gICAgIyBleHRyYWN0IHRoZSBmdWxsIHBhdGggdG8gdGhlIGJpbmFyeSBhbmQgYXQgdGhlCi0gICAgIyBzYW1lIHRpbWUgbWFpbnRhaW4gYW55IGFyZ3VtZW50cyBwYXNzZWQgdG8gaXQuCi0gICAgIyBUaGUgY29tbWFuZCBNVVNUIGV4aXN0IGluIHRoZSBwYXRoLCBvciBlbHNlIQotICAgIHRtcD0iJEFTIgotICAgIGNhcj0iJHt0bXAlJSAqfSIKLSAgICB0bXA9IiRBUyBFT0wiCi0gICAgY2RyPSIke3RtcCMqIH0iCi0gICAgIyBPbiB3aW5kb3dzIHdlIHdhbnQgcGF0aHMgd2l0aG91dCBzcGFjZXMuCi0gICAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TIiA9ICJ4d2luZG93cyI7IHRoZW4KKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgogCi0gICAgIyBUcmFuc2xhdGUgbG9uZyBjeWdkcml2ZSBvciBDOlxzZGZzZiBwYXRoCi0gICAgIyBpbnRvIGEgc2hvcnQgbWl4ZWQgbW9kZSBwYXRoIHRoYXQgaGFzIG5vCi0gICAgIyBzcGFjZXMgaW4gaXQuCi0gICAgdG1wPSIkY2FyIgorICAjIEZpcnN0IHNlcGFyYXRlIHRoZSBwYXRoIGZyb20gdGhlIGFyZ3VtZW50cy4gVGhpcyB3aWxsIHNwbGl0IGF0IHRoZSBmaXJzdAorICAjIHNwYWNlLgorICBjb21wbGV0ZT0iJEFTIgorICBwYXRoPSIke2NvbXBsZXRlJSUgKn0iCisgIHRtcD0iJGNvbXBsZXRlIEVPTCIKKyAgYXJndW1lbnRzPSIke3RtcCMqIH0iCiAKLSAgICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1MiID0gInh3aW5kb3dzIjsgdGhlbgotICAgICAgICB0bXA9YCRDWUdQQVRIIC11ICIkY2FyImAKLSAgICAgICAgdG1wPWB3aGljaCAiJHRtcCJgCi0gICAgICAgICMgSWYgZmlsZSBleGlzdHMgd2l0aCAuZXhlIGFwcGVuZGVkLCB0aGF0J3MgdGhlIHJlYWwgZmlsZW5hbWUKLSAgICAgICAgIyBhbmQgY3lncGF0aCBuZWVkcyB0aGF0IHRvIGNvbnZlcnQgdG8gc2hvcnQgc3R5bGUgcGF0aC4KLSAgICAgICAgaWYgdGVzdCAtZiAiJHt0bXB9LmV4ZSI7IHRoZW4KLSAgICAgICAgICAgdG1wPSIke3RtcH0uZXhlIgotICAgICAgICBlbGlmIHRlc3QgLWYgIiR7dG1wfS5jbWQiOyB0aGVuCi0gICAgICAgICAgIHRtcD0iJHt0bXB9LmNtZCIKKyAgIyBJbnB1dCBtaWdodCBiZSBnaXZlbiBhcyBXaW5kb3dzIGZvcm1hdCwgc3RhcnQgYnkgY29udmVydGluZyB0bworICAjIHVuaXggZm9ybWF0LgorICBuZXdfcGF0aD1gJENZR1BBVEggLXUgIiRwYXRoImAKKworICAjIE5vdyB0cnkgdG8gbG9jYXRlIGV4ZWN1dGFibGUgdXNpbmcgd2hpY2gKKyAgbmV3X3BhdGg9YCRXSElDSCAiJG5ld19wYXRoIiAyPiAvZGV2L251bGxgCisgIGlmIHRlc3QgIngkbmV3X3BhdGgiID0geDsgdGhlbgorICAgICMgT29wcy4gV2hpY2ggZGlkbid0IGZpbmQgdGhlIGV4ZWN1dGFibGUuCisgICAgIyBUaGUgc3BsaXR0aW5nIG9mIGFyZ3VtZW50cyBmcm9tIHRoZSBleGVjdXRhYmxlIGF0IGEgc3BhY2UgbWlnaHQgaGF2ZSBiZWVuIGluY29ycmVjdCwKKyAgICAjIHNpbmNlIHBhdGhzIHdpdGggc3BhY2UgYXJlIG1vcmUgbGlrZWx5IGluIFdpbmRvd3MuIEdpdmUgaXQgYW5vdGhlciB0cnkgd2l0aCB0aGUgd2hvbGUKKyAgICAjIGFyZ3VtZW50LgorICAgIHBhdGg9IiRjb21wbGV0ZSIKKyAgICBhcmd1bWVudHM9IkVPTCIKKyAgICBuZXdfcGF0aD1gJENZR1BBVEggLXUgIiRwYXRoImAKKyAgICBuZXdfcGF0aD1gJFdISUNIICIkbmV3X3BhdGgiIDI+IC9kZXYvbnVsbGAKKyAgICBpZiB0ZXN0ICJ4JG5ld19wYXRoIiA9IHg7IHRoZW4KKyAgICAgICMgSXQncyBzdGlsbCBub3QgZm91bmQuIE5vdyB0aGlzIGlzIGFuIHVucmVjb3ZlcmFibGUgZXJyb3IuCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSBwYXRoIG9mIEFTLCB3aGljaCByZXNvbHZlcyBhcyBcIiRjb21wbGV0ZVwiLCBpcyBub3QgZm91bmQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoZSBwYXRoIG9mIEFTLCB3aGljaCByZXNvbHZlcyBhcyBcIiRjb21wbGV0ZVwiLCBpcyBub3QgZm91bmQuIiA+JjY7fQorICAgICAgaGFzX3NwYWNlPWAkRUNITyAiJGNvbXBsZXRlIiB8ICRHUkVQICIgImAKKyAgICAgIGlmIHRlc3QgIngkaGFzX3NwYWNlIiAhPSB4OyB0aGVuCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogWW91IG1pZ2h0IGJlIG1peGluZyBzcGFjZXMgaW4gdGhlIHBhdGggYW5kIGV4dHJhIGFyZ3VtZW50cywgd2hpY2ggaXMgbm90IGFsbG93ZWQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFlvdSBtaWdodCBiZSBtaXhpbmcgc3BhY2VzIGluIHRoZSBwYXRoIGFuZCBleHRyYSBhcmd1bWVudHMsIHdoaWNoIGlzIG5vdCBhbGxvd2VkLiIgPiY2O30KKyAgICAgIGZpCisgICAgICBhc19mbl9lcnJvciAkPyAiQ2Fubm90IGxvY2F0ZSB0aGUgdGhlIHBhdGggb2YgQVMiICIkTElORU5PIiA1CisgICAgZmkKKyAgZmkKKworICAjIEN5Z3dpbiB0cmllcyB0byBoaWRlIHNvbWUgYXNwZWN0cyBvZiB0aGUgV2luZG93cyBmaWxlIHN5c3RlbSwgc3VjaCB0aGF0IGJpbmFyaWVzIGFyZQorICAjIG5hbWVkIC5leGUgYnV0IGNhbGxlZCB3aXRob3V0IHRoYXQgc3VmZml4LiBUaGVyZWZvcmUsICJmb28iIGFuZCAiZm9vLmV4ZSIgYXJlIGNvbnNpZGVyZWQKKyAgIyB0aGUgc2FtZSBmaWxlLCBtb3N0IG9mIHRoZSB0aW1lIChhcyBpbiAidGVzdCAtZiIpLiBCdXQgbm90IHdoZW4gcnVubmluZyBjeWdwYXRoIC1zLCB0aGVuCisgICMgImZvby5leGUiIGlzIE9LIGJ1dCAiZm9vIiBpcyBhbiBlcnJvci4KKyAgIworICAjIFRoaXMgdGVzdCBpcyB0aGVyZWZvcmUgc2xpZ2h0bHkgbW9yZSBhY2N1cmF0ZSB0aGFuICJ0ZXN0IC1mIiB0byBjaGVjayBmb3IgZmlsZSBwcmVjZW5zZS4KKyAgIyBJdCBpcyBhbHNvIGEgd2F5IHRvIG1ha2Ugc3VyZSB3ZSBnb3QgdGhlIHByb3BlciBmaWxlIG5hbWUgZm9yIHRoZSByZWFsIHRlc3QgbGF0ZXIgb24uCisgIHRlc3Rfc2hvcnRwYXRoPWAkQ1lHUEFUSCAtcyAtbSAiJG5ld19wYXRoIiAyPiAvZGV2L251bGxgCisgIGlmIHRlc3QgIngkdGVzdF9zaG9ydHBhdGgiID0geDsgdGhlbgorICAgICMgU2hvcnQgcGF0aCBmYWlsZWQsIGZpbGUgZG9lcyBub3QgZXhpc3QgYXMgc3BlY2lmaWVkLgorICAgICMgVHJ5IGFkZGluZyAuZXhlIG9yIC5jbWQKKyAgICBpZiB0ZXN0IC1mICIke25ld19wYXRofS5leGUiOyB0aGVuCisgICAgICAgaW5wdXRfdG9fc2hvcnRwYXRoPSIke25ld19wYXRofS5leGUiCisgICAgZWxpZiB0ZXN0IC1mICIke25ld19wYXRofS5jbWQiOyB0aGVuCisgICAgICAgaW5wdXRfdG9fc2hvcnRwYXRoPSIke25ld19wYXRofS5jbWQiCisgICAgZWxzZQorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUaGUgcGF0aCBvZiBBUywgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkbmV3X3BhdGhcIiwgaXMgaW52YWxpZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhlIHBhdGggb2YgQVMsIHdoaWNoIHJlc29sdmVzIGFzIFwiJG5ld19wYXRoXCIsIGlzIGludmFsaWQuIiA+JjY7fQorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBOZWl0aGVyIFwiJG5ld19wYXRoXCIgbm9yIFwiJG5ld19wYXRoLmV4ZS9jbWRcIiBjYW4gYmUgZm91bmQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogTmVpdGhlciBcIiRuZXdfcGF0aFwiIG5vciBcIiRuZXdfcGF0aC5leGUvY21kXCIgY2FuIGJlIGZvdW5kIiA+JjY7fQorICAgICAgYXNfZm5fZXJyb3IgJD8gIkNhbm5vdCBsb2NhdGUgdGhlIHRoZSBwYXRoIG9mIEFTIiAiJExJTkVOTyIgNQorICAgIGZpCisgIGVsc2UKKyAgICBpbnB1dF90b19zaG9ydHBhdGg9IiRuZXdfcGF0aCIKKyAgZmkKKworICAjIENhbGwgaGVscGVyIGZ1bmN0aW9uIHdoaWNoIHBvc3NpYmx5IGNvbnZlcnRzIHRoaXMgdXNpbmcgRE9TLXN0eWxlIHNob3J0IG1vZGUuCisgICMgSWYgc28sIHRoZSB1cGRhdGVkIHBhdGggaXMgc3RvcmVkIGluICRuZXdfcGF0aC4KKyAgbmV3X3BhdGg9IiRpbnB1dF90b19zaG9ydHBhdGgiCisKKyAgaW5wdXRfcGF0aD0iJGlucHV0X3RvX3Nob3J0cGF0aCIKKyAgIyBDaGVjayBpZiB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhpcyB1c2luZyBET1Mtc3R5bGUgc2hvcnQgbW9kZS4gSWYgdGhlIHBhdGgKKyAgIyBjb250YWlucyBqdXN0IHNpbXBsZSBjaGFyYWN0ZXJzLCB1c2UgaXQuIE90aGVyd2lzZSAoc3BhY2VzLCB3ZWlyZCBjaGFyYWN0ZXJzKSwKKyAgIyB0YWtlIG5vIGNoYW5jZXMgYW5kIHJld3JpdGUgaXQuCisgICMgTm90ZTogbTQgZWF0cyBvdXIgW10sIHNvIHdlIG5lZWQgdG8gdXNlIFsgYW5kIF0gaW5zdGVhZC4KKyAgaGFzX2ZvcmJpZGRlbl9jaGFycz1gJEVDSE8gIiRpbnB1dF9wYXRoIiB8ICRHUkVQIFteLS5fL2EtekEtWjAtOV1gCisgIGlmIHRlc3QgIngkaGFzX2ZvcmJpZGRlbl9jaGFycyIgIT0geDsgdGhlbgorICAgICMgTm93IGNvbnZlcnQgaXQgdG8gbWl4ZWQgRE9TLXN0eWxlLCBzaG9ydCBtb2RlIChubyBzcGFjZXMsIGFuZCAvIGluc3RlYWQgb2YgXCkKKyAgICBzaG9ydG1vZGVfcGF0aD1gJENZR1BBVEggLXMgLW0gLWEgIiRpbnB1dF9wYXRoImAKKyAgICBwYXRoX2FmdGVyX3Nob3J0bW9kZT1gJENZR1BBVEggLXUgIiRzaG9ydG1vZGVfcGF0aCJgCisgICAgaWYgdGVzdCAieCRwYXRoX2FmdGVyX3Nob3J0bW9kZSIgIT0gIngkaW5wdXRfdG9fc2hvcnRwYXRoIjsgdGhlbgorICAgICAgIyBHb2luZyB0byBzaG9ydCBtb2RlIGFuZCBiYWNrIGFnYWluIGRpZCBpbmRlZWQgbWF0dGVyLiBTaW5jZSBzaG9ydCBtb2RlIGlzCisgICAgICAjIGNhc2UgaW5zZW5zaXRpdmUsIGxldCdzIG1ha2UgaXQgbG93ZXJjYXNlIHRvIGltcHJvdmUgcmVhZGFiaWxpdHkuCisgICAgICBzaG9ydG1vZGVfcGF0aD1gJEVDSE8gIiRzaG9ydG1vZGVfcGF0aCIgfCAkVFIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAorICAgICAgIyBOb3cgY29udmVydCBpdCBiYWNrIHRvIFVuaXgtc3RpbGUgKGN5Z3BhdGgpCisgICAgICBpbnB1dF9wYXRoPWAkQ1lHUEFUSCAtdSAiJHNob3J0bW9kZV9wYXRoImAKKyAgICAgIG5ld19wYXRoPSIkaW5wdXRfcGF0aCIKKyAgICBmaQorICBmaQorCisgIHRlc3RfY3lnZHJpdmVfcHJlZml4PWAkRUNITyAkaW5wdXRfcGF0aCB8ICRHUkVQIF4vY3lnZHJpdmUvYAorICBpZiB0ZXN0ICJ4JHRlc3RfY3lnZHJpdmVfcHJlZml4IiA9IHg7IHRoZW4KKyAgICAjIEFzIGEgc2ltcGxlIGZpeCwgZXhjbHVkZSAvdXNyL2JpbiBzaW5jZSBpdCdzIG5vdCBhIHJlYWwgcGF0aC4KKyAgICBpZiB0ZXN0ICJ4YCRFQ0hPICRpbnB1dF90b19zaG9ydHBhdGggfCAkR1JFUCBeL3Vzci9iaW4vYCIgPSB4OyB0aGVuCisgICAgICAjIFRoZSBwYXRoIGlzIGluIGEgQ3lnd2luIHNwZWNpYWwgZGlyZWN0b3J5IChlLmcuIC9ob21lKS4gV2UgbmVlZCB0aGlzIGNvbnZlcnRlZCB0bworICAgICAgIyBhIHBhdGggcHJlZml4ZWQgYnkgL2N5Z2RyaXZlIGZvciBmaXhwYXRoIHRvIHdvcmsuCisgICAgICBuZXdfcGF0aD0iJENZR1dJTl9ST09UX1BBVEgkaW5wdXRfcGF0aCIKKyAgICBmaQorICBmaQorCisgICMgcmVtb3ZlIHRyYWlsaW5nIC5leGUgaWYgYW55CisgIG5ld19wYXRoPSIke25ld19wYXRoLyUuZXhlL30iCisKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorCisgICMgRmlyc3Qgc2VwYXJhdGUgdGhlIHBhdGggZnJvbSB0aGUgYXJndW1lbnRzLiBUaGlzIHdpbGwgc3BsaXQgYXQgdGhlIGZpcnN0CisgICMgc3BhY2UuCisgIGNvbXBsZXRlPSIkQVMiCisgIHBhdGg9IiR7Y29tcGxldGUlJSAqfSIKKyAgdG1wPSIkY29tcGxldGUgRU9MIgorICBhcmd1bWVudHM9IiR7dG1wIyogfSIKKworICAjIElucHV0IG1pZ2h0IGJlIGdpdmVuIGFzIFdpbmRvd3MgZm9ybWF0LCBzdGFydCBieSBjb252ZXJ0aW5nIHRvCisgICMgdW5peCBmb3JtYXQuCisgIG5ld19wYXRoPSIkcGF0aCIKKworICB3aW5kb3dzX3BhdGg9IiRuZXdfcGF0aCIKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJENZR1BBVEggLXUgIiR3aW5kb3dzX3BhdGgiYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBlbGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLm1zeXMiOyB0aGVuCisgICAgdW5peF9wYXRoPWAkRUNITyAiJHdpbmRvd3NfcGF0aCIgfCAkU0VEIC1lICdzLF5cXCguXFwpOiwvXFwxLGcnIC1lICdzLFxcXFwsLyxnJ2AKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZmkKKworCisgICMgTm93IHRyeSB0byBsb2NhdGUgZXhlY3V0YWJsZSB1c2luZyB3aGljaAorICBuZXdfcGF0aD1gJFdISUNIICIkbmV3X3BhdGgiIDI+IC9kZXYvbnVsbGAKKworICBpZiB0ZXN0ICJ4JG5ld19wYXRoIiA9IHg7IHRoZW4KKyAgICAjIE9vcHMuIFdoaWNoIGRpZG4ndCBmaW5kIHRoZSBleGVjdXRhYmxlLgorICAgICMgVGhlIHNwbGl0dGluZyBvZiBhcmd1bWVudHMgZnJvbSB0aGUgZXhlY3V0YWJsZSBhdCBhIHNwYWNlIG1pZ2h0IGhhdmUgYmVlbiBpbmNvcnJlY3QsCisgICAgIyBzaW5jZSBwYXRocyB3aXRoIHNwYWNlIGFyZSBtb3JlIGxpa2VseSBpbiBXaW5kb3dzLiBHaXZlIGl0IGFub3RoZXIgdHJ5IHdpdGggdGhlIHdob2xlCisgICAgIyBhcmd1bWVudC4KKyAgICBwYXRoPSIkY29tcGxldGUiCisgICAgYXJndW1lbnRzPSJFT0wiCisgICAgbmV3X3BhdGg9IiRwYXRoIgorCisgIHdpbmRvd3NfcGF0aD0iJG5ld19wYXRoIgorICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5jeWd3aW4iOyB0aGVuCisgICAgdW5peF9wYXRoPWAkQ1lHUEFUSCAtdSAiJHdpbmRvd3NfcGF0aCJgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGVsaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MubXN5cyI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRFQ0hPICIkd2luZG93c19wYXRoIiB8ICRTRUQgLWUgJ3MsXlxcKC5cXCk6LC9cXDEsZycgLWUgJ3MsXFxcXCwvLGcnYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBmaQorCisKKyAgICBuZXdfcGF0aD1gJFdISUNIICIkbmV3X3BhdGgiIDI+IC9kZXYvbnVsbGAKKworICAgIGlmIHRlc3QgIngkbmV3X3BhdGgiID0geDsgdGhlbgorICAgICAgIyBJdCdzIHN0aWxsIG5vdCBmb3VuZC4gTm93IHRoaXMgaXMgYW4gdW5yZWNvdmVyYWJsZSBlcnJvci4KKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGhlIHBhdGggb2YgQVMsIHdoaWNoIHJlc29sdmVzIGFzIFwiJGNvbXBsZXRlXCIsIGlzIG5vdCBmb3VuZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhlIHBhdGggb2YgQVMsIHdoaWNoIHJlc29sdmVzIGFzIFwiJGNvbXBsZXRlXCIsIGlzIG5vdCBmb3VuZC4iID4mNjt9CisgICAgICBoYXNfc3BhY2U9YCRFQ0hPICIkY29tcGxldGUiIHwgJEdSRVAgIiAiYAorICAgICAgaWYgdGVzdCAieCRoYXNfc3BhY2UiICE9IHg7IHRoZW4KKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBZb3UgbWlnaHQgYmUgbWl4aW5nIHNwYWNlcyBpbiB0aGUgcGF0aCBhbmQgZXh0cmEgYXJndW1lbnRzLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogWW91IG1pZ2h0IGJlIG1peGluZyBzcGFjZXMgaW4gdGhlIHBhdGggYW5kIGV4dHJhIGFyZ3VtZW50cywgd2hpY2ggaXMgbm90IGFsbG93ZWQuIiA+JjY7fQorICAgICAgZmkKKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJDYW5ub3QgbG9jYXRlIHRoZSB0aGUgcGF0aCBvZiBBUyIgIiRMSU5FTk8iIDUKKyAgICBmaQorICBmaQorCisgICMgTm93IG5ld19wYXRoIGhhcyBhIGNvbXBsZXRlIHVuaXggcGF0aCB0byB0aGUgYmluYXJ5CisgIGlmIHRlc3QgInhgJEVDSE8gJG5ld19wYXRoIHwgJEdSRVAgXi9iaW4vYCIgIT0geDsgdGhlbgorICAgICMgS2VlcCBwYXRocyBpbiAvYmluIGFzLWlzLCBidXQgcmVtb3ZlIHRyYWlsaW5nIC5leGUgaWYgYW55CisgICAgbmV3X3BhdGg9IiR7bmV3X3BhdGgvJS5leGUvfSIKKyAgICAjIERvIG5vdCBzYXZlIC9iaW4gcGF0aHMgdG8gYWxsX2ZpeHBhdGhfcHJlZml4ZXMhCisgIGVsc2UKKyAgICAjIE5vdCBpbiBtaXhlZCBvciBXaW5kb3dzIHN0eWxlLCBzdGFydCBieSB0aGF0LgorICAgIG5ld19wYXRoPWBjbWQgLy9jIGVjaG8gJG5ld19wYXRoYAorCisgIGlucHV0X3BhdGg9IiRuZXdfcGF0aCIKKyAgIyBDaGVjayBpZiB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhpcyB1c2luZyBET1Mtc3R5bGUgc2hvcnQgbW9kZS4gSWYgdGhlIHBhdGgKKyAgIyBjb250YWlucyBqdXN0IHNpbXBsZSBjaGFyYWN0ZXJzLCB1c2UgaXQuIE90aGVyd2lzZSAoc3BhY2VzLCB3ZWlyZCBjaGFyYWN0ZXJzKSwKKyAgIyB0YWtlIG5vIGNoYW5jZXMgYW5kIHJld3JpdGUgaXQuCisgICMgTm90ZTogbTQgZWF0cyBvdXIgW10sIHNvIHdlIG5lZWQgdG8gdXNlIFsgYW5kIF0gaW5zdGVhZC4KKyAgaGFzX2ZvcmJpZGRlbl9jaGFycz1gJEVDSE8gIiRpbnB1dF9wYXRoIiB8ICRHUkVQIFteLV8vOmEtekEtWjAtOV1gCisgIGlmIHRlc3QgIngkaGFzX2ZvcmJpZGRlbl9jaGFycyIgIT0geDsgdGhlbgorICAgICMgTm93IGNvbnZlcnQgaXQgdG8gbWl4ZWQgRE9TLXN0eWxlLCBzaG9ydCBtb2RlIChubyBzcGFjZXMsIGFuZCAvIGluc3RlYWQgb2YgXCkKKyAgICBuZXdfcGF0aD1gY21kIC9jICJmb3IgJUEgaW4gKFwiJGlucHV0X3BhdGhcIikgZG8gQGVjaG8gJX5zQSJ8JFRSIFxcXFxcXFxcIC8gfCAkVFIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAorICBmaQorCisgICAgIyBPdXRwdXQgaXMgaW4gJG5ld19wYXRoCisKKyAgd2luZG93c19wYXRoPSIkbmV3X3BhdGgiCisgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLmN5Z3dpbiI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRDWUdQQVRIIC11ICIkd2luZG93c19wYXRoImAKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJEVDSE8gIiR3aW5kb3dzX3BhdGgiIHwgJFNFRCAtZSAncyxeXFwoLlxcKTosL1xcMSxnJyAtZSAncyxcXFxcLC8sZydgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGZpCisKKyAgICAjIHJlbW92ZSB0cmFpbGluZyAuZXhlIGlmIGFueQorICAgIG5ld19wYXRoPSIke25ld19wYXRoLyUuZXhlL30iCisKKyAgICAjIFNhdmUgdGhlIGZpcnN0IDEwIGJ5dGVzIG9mIHRoaXMgcGF0aCB0byB0aGUgc3RvcmFnZSwgc28gZml4cGF0aCBjYW4gd29yay4KKyAgICBhbGxfZml4cGF0aF9wcmVmaXhlcz0oIiR7YWxsX2ZpeHBhdGhfcHJlZml4ZXNbQF19IiAiJHtuZXdfcGF0aDowOjEwfSIpCisgIGZpCisKKyAgZWxzZQorICAgICMgV2UncmUgb24gYSBwb3NpeCBwbGF0Zm9ybS4gSG9vcmF5ISA6KQorICAgICMgRmlyc3Qgc2VwYXJhdGUgdGhlIHBhdGggZnJvbSB0aGUgYXJndW1lbnRzLiBUaGlzIHdpbGwgc3BsaXQgYXQgdGhlIGZpcnN0CisgICAgIyBzcGFjZS4KKyAgICBjb21wbGV0ZT0iJEFTIgorICAgIHBhdGg9IiR7Y29tcGxldGUlJSAqfSIKKyAgICB0bXA9IiRjb21wbGV0ZSBFT0wiCisgICAgYXJndW1lbnRzPSIke3RtcCMqIH0iCisKKyAgICBuZXdfcGF0aD1gJFdISUNIICRwYXRoIDI+IC9kZXYvbnVsbGAKKyAgICBpZiB0ZXN0ICJ4JG5ld19wYXRoIiA9IHg7IHRoZW4KKyAgICAgIGlzX2Fic29sdXRlX3BhdGg9YCRFQ0hPICIkcGF0aCIgfCAkR1JFUCBeL2AKKyAgICAgIGlmIHRlc3QgIngkaXNfYWJzb2x1dGVfcGF0aCIgIT0geDsgdGhlbgorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFJlc29sdmluZyBBUyAoYXMgJHBhdGgpIHdpdGggJ3doaWNoJyBmYWlsZWQsIHVzaW5nICRwYXRoIGRpcmVjdGx5LiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBSZXNvbHZpbmcgQVMgKGFzICRwYXRoKSB3aXRoICd3aGljaCcgZmFpbGVkLCB1c2luZyAkcGF0aCBkaXJlY3RseS4iID4mNjt9CisgICAgICAgIG5ld19wYXRoPSIkcGF0aCIKKyAgICAgIGVsc2UKKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUaGUgcGF0aCBvZiBBUywgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkY29tcGxldGVcIiwgaXMgbm90IGZvdW5kLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUaGUgcGF0aCBvZiBBUywgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkY29tcGxldGVcIiwgaXMgbm90IGZvdW5kLiIgPiY2O30KKyAgICAgICAgaGFzX3NwYWNlPWAkRUNITyAiJGNvbXBsZXRlIiB8ICRHUkVQICIgImAKKyAgICAgICAgaWYgdGVzdCAieCRoYXNfc3BhY2UiICE9IHg7IHRoZW4KKyAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoaXMgbWlnaHQgYmUgY2F1c2VkIGJ5IHNwYWNlcyBpbiB0aGUgcGF0aCwgd2hpY2ggaXMgbm90IGFsbG93ZWQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoaXMgbWlnaHQgYmUgY2F1c2VkIGJ5IHNwYWNlcyBpbiB0aGUgcGF0aCwgd2hpY2ggaXMgbm90IGFsbG93ZWQuIiA+JjY7fQogICAgICAgICBmaQotICAgICAgICAjIENvbnZlcnQgdG8gQzovIG1peGVkIHN0eWxlIHBhdGggd2l0aG91dCBzcGFjZXMuCi0gICAgICAgICB0bXA9YCRDWUdQQVRIIC1zIC1tICIkdG1wImAKKyAgICAgICAgYXNfZm5fZXJyb3IgJD8gIkNhbm5vdCBsb2NhdGUgdGhlIHRoZSBwYXRoIG9mIEFTIiAiJExJTkVOTyIgNQorICAgICAgZmkKICAgICBmaQotICAgIGNhcj0iJHRtcCIKKyAgZmkKIAotICAgIGVsc2UKLSAgICAgICAgIyAid2hpY2giIGlzIG5vdCBwb3J0YWJsZSwgYnV0IGlzIHVzZWQgaGVyZQotICAgICAgICAjIGJlY2F1c2Ugd2Uga25vdyB0aGF0IHRoZSBjb21tYW5kIGV4aXN0cyEKLSAgICAgICAgY2FyPWB3aGljaCAkY2FyYAotICAgIGZpCi0gICAgaWYgdGVzdCAieCRjZHIiICE9IHhFT0w7IHRoZW4KLSAgICAgICAgQVM9IiRjYXIgJHtjZHIlICp9IgotICAgIGVsc2UKLSAgICAgICAgQVM9IiRjYXIiCi0gICAgZmkKKyAgIyBOb3cgam9pbiB0b2dldGhlciB0aGUgcGF0aCBhbmQgdGhlIGFyZ3VtZW50cyBvbmNlIGFnYWluCisgIGlmIHRlc3QgIngkYXJndW1lbnRzIiAhPSB4RU9MOyB0aGVuCisgICAgICBuZXdfY29tcGxldGU9IiRuZXdfcGF0aCAke2FyZ3VtZW50cyUgKn0iCisgIGVsc2UKKyAgICAgIG5ld19jb21wbGV0ZT0iJG5ld19wYXRoIgorICBmaQorCisgIGlmIHRlc3QgIngkY29tcGxldGUiICE9ICJ4JG5ld19jb21wbGV0ZSI7IHRoZW4KKyAgICBBUz0iJG5ld19jb21wbGV0ZSIKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFJld3JpdGluZyBBUyB0byBcIiRuZXdfY29tcGxldGVcIiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBSZXdyaXRpbmcgQVMgdG8gXCIkbmV3X2NvbXBsZXRlXCIiID4mNjt9CisgIGZpCiAKIGVsc2UKICAgICBBUz0iJENDIC1jIgogZmkKIAogCi1pZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1MiID0geHNvbGFyaXM7IHRoZW4KK2lmIHRlc3QgIngkT1BFTkpES19UQVJHRVRfT1MiID0geHNvbGFyaXM7IHRoZW4KICAgICBmb3IgYWNfcHJvZyBpbiBnbm0gbm0KIGRvCiAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgpAQCAtMTM0OTUsNDcgKzIzNjEzLDI0NSBAQAogZG9uZQogCiAKLSAgICAjIFRyYW5zbGF0ZSAiZ2NjIC1FIiBpbnRvICJgd2hpY2ggZ2NjYCAtRSIgaWUKLSAgICAjIGV4dHJhY3QgdGhlIGZ1bGwgcGF0aCB0byB0aGUgYmluYXJ5IGFuZCBhdCB0aGUKLSAgICAjIHNhbWUgdGltZSBtYWludGFpbiBhbnkgYXJndW1lbnRzIHBhc3NlZCB0byBpdC4KLSAgICAjIFRoZSBjb21tYW5kIE1VU1QgZXhpc3QgaW4gdGhlIHBhdGgsIG9yIGVsc2UhCi0gICAgdG1wPSIkTk0iCi0gICAgY2FyPSIke3RtcCUlICp9IgotICAgIHRtcD0iJE5NIEVPTCIKLSAgICBjZHI9IiR7dG1wIyogfSIKLSAgICAjIE9uIHdpbmRvd3Mgd2Ugd2FudCBwYXRocyB3aXRob3V0IHNwYWNlcy4KLSAgICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1MiID0gInh3aW5kb3dzIjsgdGhlbgorICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5jeWd3aW4iOyB0aGVuCiAKLSAgICAjIFRyYW5zbGF0ZSBsb25nIGN5Z2RyaXZlIG9yIEM6XHNkZnNmIHBhdGgKLSAgICAjIGludG8gYSBzaG9ydCBtaXhlZCBtb2RlIHBhdGggdGhhdCBoYXMgbm8KLSAgICAjIHNwYWNlcyBpbiBpdC4KLSAgICB0bXA9IiRjYXIiCisgICMgRmlyc3Qgc2VwYXJhdGUgdGhlIHBhdGggZnJvbSB0aGUgYXJndW1lbnRzLiBUaGlzIHdpbGwgc3BsaXQgYXQgdGhlIGZpcnN0CisgICMgc3BhY2UuCisgIGNvbXBsZXRlPSIkTk0iCisgIHBhdGg9IiR7Y29tcGxldGUlJSAqfSIKKyAgdG1wPSIkY29tcGxldGUgRU9MIgorICBhcmd1bWVudHM9IiR7dG1wIyogfSIKIAotICAgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PUyIgPSAieHdpbmRvd3MiOyB0aGVuCi0gICAgICAgIHRtcD1gJENZR1BBVEggLXUgIiRjYXIiYAotICAgICAgICB0bXA9YHdoaWNoICIkdG1wImAKLSAgICAgICAgIyBJZiBmaWxlIGV4aXN0cyB3aXRoIC5leGUgYXBwZW5kZWQsIHRoYXQncyB0aGUgcmVhbCBmaWxlbmFtZQotICAgICAgICAjIGFuZCBjeWdwYXRoIG5lZWRzIHRoYXQgdG8gY29udmVydCB0byBzaG9ydCBzdHlsZSBwYXRoLgotICAgICAgICBpZiB0ZXN0IC1mICIke3RtcH0uZXhlIjsgdGhlbgotICAgICAgICAgICB0bXA9IiR7dG1wfS5leGUiCi0gICAgICAgIGVsaWYgdGVzdCAtZiAiJHt0bXB9LmNtZCI7IHRoZW4KLSAgICAgICAgICAgdG1wPSIke3RtcH0uY21kIgorICAjIElucHV0IG1pZ2h0IGJlIGdpdmVuIGFzIFdpbmRvd3MgZm9ybWF0LCBzdGFydCBieSBjb252ZXJ0aW5nIHRvCisgICMgdW5peCBmb3JtYXQuCisgIG5ld19wYXRoPWAkQ1lHUEFUSCAtdSAiJHBhdGgiYAorCisgICMgTm93IHRyeSB0byBsb2NhdGUgZXhlY3V0YWJsZSB1c2luZyB3aGljaAorICBuZXdfcGF0aD1gJFdISUNIICIkbmV3X3BhdGgiIDI+IC9kZXYvbnVsbGAKKyAgaWYgdGVzdCAieCRuZXdfcGF0aCIgPSB4OyB0aGVuCisgICAgIyBPb3BzLiBXaGljaCBkaWRuJ3QgZmluZCB0aGUgZXhlY3V0YWJsZS4KKyAgICAjIFRoZSBzcGxpdHRpbmcgb2YgYXJndW1lbnRzIGZyb20gdGhlIGV4ZWN1dGFibGUgYXQgYSBzcGFjZSBtaWdodCBoYXZlIGJlZW4gaW5jb3JyZWN0LAorICAgICMgc2luY2UgcGF0aHMgd2l0aCBzcGFjZSBhcmUgbW9yZSBsaWtlbHkgaW4gV2luZG93cy4gR2l2ZSBpdCBhbm90aGVyIHRyeSB3aXRoIHRoZSB3aG9sZQorICAgICMgYXJndW1lbnQuCisgICAgcGF0aD0iJGNvbXBsZXRlIgorICAgIGFyZ3VtZW50cz0iRU9MIgorICAgIG5ld19wYXRoPWAkQ1lHUEFUSCAtdSAiJHBhdGgiYAorICAgIG5ld19wYXRoPWAkV0hJQ0ggIiRuZXdfcGF0aCIgMj4gL2Rldi9udWxsYAorICAgIGlmIHRlc3QgIngkbmV3X3BhdGgiID0geDsgdGhlbgorICAgICAgIyBJdCdzIHN0aWxsIG5vdCBmb3VuZC4gTm93IHRoaXMgaXMgYW4gdW5yZWNvdmVyYWJsZSBlcnJvci4KKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGhlIHBhdGggb2YgTk0sIHdoaWNoIHJlc29sdmVzIGFzIFwiJGNvbXBsZXRlXCIsIGlzIG5vdCBmb3VuZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhlIHBhdGggb2YgTk0sIHdoaWNoIHJlc29sdmVzIGFzIFwiJGNvbXBsZXRlXCIsIGlzIG5vdCBmb3VuZC4iID4mNjt9CisgICAgICBoYXNfc3BhY2U9YCRFQ0hPICIkY29tcGxldGUiIHwgJEdSRVAgIiAiYAorICAgICAgaWYgdGVzdCAieCRoYXNfc3BhY2UiICE9IHg7IHRoZW4KKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBZb3UgbWlnaHQgYmUgbWl4aW5nIHNwYWNlcyBpbiB0aGUgcGF0aCBhbmQgZXh0cmEgYXJndW1lbnRzLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogWW91IG1pZ2h0IGJlIG1peGluZyBzcGFjZXMgaW4gdGhlIHBhdGggYW5kIGV4dHJhIGFyZ3VtZW50cywgd2hpY2ggaXMgbm90IGFsbG93ZWQuIiA+JjY7fQorICAgICAgZmkKKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJDYW5ub3QgbG9jYXRlIHRoZSB0aGUgcGF0aCBvZiBOTSIgIiRMSU5FTk8iIDUKKyAgICBmaQorICBmaQorCisgICMgQ3lnd2luIHRyaWVzIHRvIGhpZGUgc29tZSBhc3BlY3RzIG9mIHRoZSBXaW5kb3dzIGZpbGUgc3lzdGVtLCBzdWNoIHRoYXQgYmluYXJpZXMgYXJlCisgICMgbmFtZWQgLmV4ZSBidXQgY2FsbGVkIHdpdGhvdXQgdGhhdCBzdWZmaXguIFRoZXJlZm9yZSwgImZvbyIgYW5kICJmb28uZXhlIiBhcmUgY29uc2lkZXJlZAorICAjIHRoZSBzYW1lIGZpbGUsIG1vc3Qgb2YgdGhlIHRpbWUgKGFzIGluICJ0ZXN0IC1mIikuIEJ1dCBub3Qgd2hlbiBydW5uaW5nIGN5Z3BhdGggLXMsIHRoZW4KKyAgIyAiZm9vLmV4ZSIgaXMgT0sgYnV0ICJmb28iIGlzIGFuIGVycm9yLgorICAjCisgICMgVGhpcyB0ZXN0IGlzIHRoZXJlZm9yZSBzbGlnaHRseSBtb3JlIGFjY3VyYXRlIHRoYW4gInRlc3QgLWYiIHRvIGNoZWNrIGZvciBmaWxlIHByZWNlbnNlLgorICAjIEl0IGlzIGFsc28gYSB3YXkgdG8gbWFrZSBzdXJlIHdlIGdvdCB0aGUgcHJvcGVyIGZpbGUgbmFtZSBmb3IgdGhlIHJlYWwgdGVzdCBsYXRlciBvbi4KKyAgdGVzdF9zaG9ydHBhdGg9YCRDWUdQQVRIIC1zIC1tICIkbmV3X3BhdGgiIDI+IC9kZXYvbnVsbGAKKyAgaWYgdGVzdCAieCR0ZXN0X3Nob3J0cGF0aCIgPSB4OyB0aGVuCisgICAgIyBTaG9ydCBwYXRoIGZhaWxlZCwgZmlsZSBkb2VzIG5vdCBleGlzdCBhcyBzcGVjaWZpZWQuCisgICAgIyBUcnkgYWRkaW5nIC5leGUgb3IgLmNtZAorICAgIGlmIHRlc3QgLWYgIiR7bmV3X3BhdGh9LmV4ZSI7IHRoZW4KKyAgICAgICBpbnB1dF90b19zaG9ydHBhdGg9IiR7bmV3X3BhdGh9LmV4ZSIKKyAgICBlbGlmIHRlc3QgLWYgIiR7bmV3X3BhdGh9LmNtZCI7IHRoZW4KKyAgICAgICBpbnB1dF90b19zaG9ydHBhdGg9IiR7bmV3X3BhdGh9LmNtZCIKKyAgICBlbHNlCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSBwYXRoIG9mIE5NLCB3aGljaCByZXNvbHZlcyBhcyBcIiRuZXdfcGF0aFwiLCBpcyBpbnZhbGlkLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUaGUgcGF0aCBvZiBOTSwgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkbmV3X3BhdGhcIiwgaXMgaW52YWxpZC4iID4mNjt9CisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IE5laXRoZXIgXCIkbmV3X3BhdGhcIiBub3IgXCIkbmV3X3BhdGguZXhlL2NtZFwiIGNhbiBiZSBmb3VuZCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBOZWl0aGVyIFwiJG5ld19wYXRoXCIgbm9yIFwiJG5ld19wYXRoLmV4ZS9jbWRcIiBjYW4gYmUgZm91bmQiID4mNjt9CisgICAgICBhc19mbl9lcnJvciAkPyAiQ2Fubm90IGxvY2F0ZSB0aGUgdGhlIHBhdGggb2YgTk0iICIkTElORU5PIiA1CisgICAgZmkKKyAgZWxzZQorICAgIGlucHV0X3RvX3Nob3J0cGF0aD0iJG5ld19wYXRoIgorICBmaQorCisgICMgQ2FsbCBoZWxwZXIgZnVuY3Rpb24gd2hpY2ggcG9zc2libHkgY29udmVydHMgdGhpcyB1c2luZyBET1Mtc3R5bGUgc2hvcnQgbW9kZS4KKyAgIyBJZiBzbywgdGhlIHVwZGF0ZWQgcGF0aCBpcyBzdG9yZWQgaW4gJG5ld19wYXRoLgorICBuZXdfcGF0aD0iJGlucHV0X3RvX3Nob3J0cGF0aCIKKworICBpbnB1dF9wYXRoPSIkaW5wdXRfdG9fc2hvcnRwYXRoIgorICAjIENoZWNrIGlmIHdlIG5lZWQgdG8gY29udmVydCB0aGlzIHVzaW5nIERPUy1zdHlsZSBzaG9ydCBtb2RlLiBJZiB0aGUgcGF0aAorICAjIGNvbnRhaW5zIGp1c3Qgc2ltcGxlIGNoYXJhY3RlcnMsIHVzZSBpdC4gT3RoZXJ3aXNlIChzcGFjZXMsIHdlaXJkIGNoYXJhY3RlcnMpLAorICAjIHRha2Ugbm8gY2hhbmNlcyBhbmQgcmV3cml0ZSBpdC4KKyAgIyBOb3RlOiBtNCBlYXRzIG91ciBbXSwgc28gd2UgbmVlZCB0byB1c2UgWyBhbmQgXSBpbnN0ZWFkLgorICBoYXNfZm9yYmlkZGVuX2NoYXJzPWAkRUNITyAiJGlucHV0X3BhdGgiIHwgJEdSRVAgW14tLl8vYS16QS1aMC05XWAKKyAgaWYgdGVzdCAieCRoYXNfZm9yYmlkZGVuX2NoYXJzIiAhPSB4OyB0aGVuCisgICAgIyBOb3cgY29udmVydCBpdCB0byBtaXhlZCBET1Mtc3R5bGUsIHNob3J0IG1vZGUgKG5vIHNwYWNlcywgYW5kIC8gaW5zdGVhZCBvZiBcKQorICAgIHNob3J0bW9kZV9wYXRoPWAkQ1lHUEFUSCAtcyAtbSAtYSAiJGlucHV0X3BhdGgiYAorICAgIHBhdGhfYWZ0ZXJfc2hvcnRtb2RlPWAkQ1lHUEFUSCAtdSAiJHNob3J0bW9kZV9wYXRoImAKKyAgICBpZiB0ZXN0ICJ4JHBhdGhfYWZ0ZXJfc2hvcnRtb2RlIiAhPSAieCRpbnB1dF90b19zaG9ydHBhdGgiOyB0aGVuCisgICAgICAjIEdvaW5nIHRvIHNob3J0IG1vZGUgYW5kIGJhY2sgYWdhaW4gZGlkIGluZGVlZCBtYXR0ZXIuIFNpbmNlIHNob3J0IG1vZGUgaXMKKyAgICAgICMgY2FzZSBpbnNlbnNpdGl2ZSwgbGV0J3MgbWFrZSBpdCBsb3dlcmNhc2UgdG8gaW1wcm92ZSByZWFkYWJpbGl0eS4KKyAgICAgIHNob3J0bW9kZV9wYXRoPWAkRUNITyAiJHNob3J0bW9kZV9wYXRoIiB8ICRUUiAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidgCisgICAgICAjIE5vdyBjb252ZXJ0IGl0IGJhY2sgdG8gVW5peC1zdGlsZSAoY3lncGF0aCkKKyAgICAgIGlucHV0X3BhdGg9YCRDWUdQQVRIIC11ICIkc2hvcnRtb2RlX3BhdGgiYAorICAgICAgbmV3X3BhdGg9IiRpbnB1dF9wYXRoIgorICAgIGZpCisgIGZpCisKKyAgdGVzdF9jeWdkcml2ZV9wcmVmaXg9YCRFQ0hPICRpbnB1dF9wYXRoIHwgJEdSRVAgXi9jeWdkcml2ZS9gCisgIGlmIHRlc3QgIngkdGVzdF9jeWdkcml2ZV9wcmVmaXgiID0geDsgdGhlbgorICAgICMgQXMgYSBzaW1wbGUgZml4LCBleGNsdWRlIC91c3IvYmluIHNpbmNlIGl0J3Mgbm90IGEgcmVhbCBwYXRoLgorICAgIGlmIHRlc3QgInhgJEVDSE8gJGlucHV0X3RvX3Nob3J0cGF0aCB8ICRHUkVQIF4vdXNyL2Jpbi9gIiA9IHg7IHRoZW4KKyAgICAgICMgVGhlIHBhdGggaXMgaW4gYSBDeWd3aW4gc3BlY2lhbCBkaXJlY3RvcnkgKGUuZy4gL2hvbWUpLiBXZSBuZWVkIHRoaXMgY29udmVydGVkIHRvCisgICAgICAjIGEgcGF0aCBwcmVmaXhlZCBieSAvY3lnZHJpdmUgZm9yIGZpeHBhdGggdG8gd29yay4KKyAgICAgIG5ld19wYXRoPSIkQ1lHV0lOX1JPT1RfUEFUSCRpbnB1dF9wYXRoIgorICAgIGZpCisgIGZpCisKKyAgIyByZW1vdmUgdHJhaWxpbmcgLmV4ZSBpZiBhbnkKKyAgbmV3X3BhdGg9IiR7bmV3X3BhdGgvJS5leGUvfSIKKworICBlbGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLm1zeXMiOyB0aGVuCisKKyAgIyBGaXJzdCBzZXBhcmF0ZSB0aGUgcGF0aCBmcm9tIHRoZSBhcmd1bWVudHMuIFRoaXMgd2lsbCBzcGxpdCBhdCB0aGUgZmlyc3QKKyAgIyBzcGFjZS4KKyAgY29tcGxldGU9IiROTSIKKyAgcGF0aD0iJHtjb21wbGV0ZSUlICp9IgorICB0bXA9IiRjb21wbGV0ZSBFT0wiCisgIGFyZ3VtZW50cz0iJHt0bXAjKiB9IgorCisgICMgSW5wdXQgbWlnaHQgYmUgZ2l2ZW4gYXMgV2luZG93cyBmb3JtYXQsIHN0YXJ0IGJ5IGNvbnZlcnRpbmcgdG8KKyAgIyB1bml4IGZvcm1hdC4KKyAgbmV3X3BhdGg9IiRwYXRoIgorCisgIHdpbmRvd3NfcGF0aD0iJG5ld19wYXRoIgorICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5jeWd3aW4iOyB0aGVuCisgICAgdW5peF9wYXRoPWAkQ1lHUEFUSCAtdSAiJHdpbmRvd3NfcGF0aCJgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGVsaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MubXN5cyI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRFQ0hPICIkd2luZG93c19wYXRoIiB8ICRTRUQgLWUgJ3MsXlxcKC5cXCk6LC9cXDEsZycgLWUgJ3MsXFxcXCwvLGcnYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBmaQorCisKKyAgIyBOb3cgdHJ5IHRvIGxvY2F0ZSBleGVjdXRhYmxlIHVzaW5nIHdoaWNoCisgIG5ld19wYXRoPWAkV0hJQ0ggIiRuZXdfcGF0aCIgMj4gL2Rldi9udWxsYAorCisgIGlmIHRlc3QgIngkbmV3X3BhdGgiID0geDsgdGhlbgorICAgICMgT29wcy4gV2hpY2ggZGlkbid0IGZpbmQgdGhlIGV4ZWN1dGFibGUuCisgICAgIyBUaGUgc3BsaXR0aW5nIG9mIGFyZ3VtZW50cyBmcm9tIHRoZSBleGVjdXRhYmxlIGF0IGEgc3BhY2UgbWlnaHQgaGF2ZSBiZWVuIGluY29ycmVjdCwKKyAgICAjIHNpbmNlIHBhdGhzIHdpdGggc3BhY2UgYXJlIG1vcmUgbGlrZWx5IGluIFdpbmRvd3MuIEdpdmUgaXQgYW5vdGhlciB0cnkgd2l0aCB0aGUgd2hvbGUKKyAgICAjIGFyZ3VtZW50LgorICAgIHBhdGg9IiRjb21wbGV0ZSIKKyAgICBhcmd1bWVudHM9IkVPTCIKKyAgICBuZXdfcGF0aD0iJHBhdGgiCisKKyAgd2luZG93c19wYXRoPSIkbmV3X3BhdGgiCisgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLmN5Z3dpbiI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRDWUdQQVRIIC11ICIkd2luZG93c19wYXRoImAKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJEVDSE8gIiR3aW5kb3dzX3BhdGgiIHwgJFNFRCAtZSAncyxeXFwoLlxcKTosL1xcMSxnJyAtZSAncyxcXFxcLC8sZydgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGZpCisKKworICAgIG5ld19wYXRoPWAkV0hJQ0ggIiRuZXdfcGF0aCIgMj4gL2Rldi9udWxsYAorCisgICAgaWYgdGVzdCAieCRuZXdfcGF0aCIgPSB4OyB0aGVuCisgICAgICAjIEl0J3Mgc3RpbGwgbm90IGZvdW5kLiBOb3cgdGhpcyBpcyBhbiB1bnJlY292ZXJhYmxlIGVycm9yLgorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUaGUgcGF0aCBvZiBOTSwgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkY29tcGxldGVcIiwgaXMgbm90IGZvdW5kLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUaGUgcGF0aCBvZiBOTSwgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkY29tcGxldGVcIiwgaXMgbm90IGZvdW5kLiIgPiY2O30KKyAgICAgIGhhc19zcGFjZT1gJEVDSE8gIiRjb21wbGV0ZSIgfCAkR1JFUCAiICJgCisgICAgICBpZiB0ZXN0ICJ4JGhhc19zcGFjZSIgIT0geDsgdGhlbgorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFlvdSBtaWdodCBiZSBtaXhpbmcgc3BhY2VzIGluIHRoZSBwYXRoIGFuZCBleHRyYSBhcmd1bWVudHMsIHdoaWNoIGlzIG5vdCBhbGxvd2VkLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBZb3UgbWlnaHQgYmUgbWl4aW5nIHNwYWNlcyBpbiB0aGUgcGF0aCBhbmQgZXh0cmEgYXJndW1lbnRzLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iID4mNjt9CisgICAgICBmaQorICAgICAgYXNfZm5fZXJyb3IgJD8gIkNhbm5vdCBsb2NhdGUgdGhlIHRoZSBwYXRoIG9mIE5NIiAiJExJTkVOTyIgNQorICAgIGZpCisgIGZpCisKKyAgIyBOb3cgbmV3X3BhdGggaGFzIGEgY29tcGxldGUgdW5peCBwYXRoIHRvIHRoZSBiaW5hcnkKKyAgaWYgdGVzdCAieGAkRUNITyAkbmV3X3BhdGggfCAkR1JFUCBeL2Jpbi9gIiAhPSB4OyB0aGVuCisgICAgIyBLZWVwIHBhdGhzIGluIC9iaW4gYXMtaXMsIGJ1dCByZW1vdmUgdHJhaWxpbmcgLmV4ZSBpZiBhbnkKKyAgICBuZXdfcGF0aD0iJHtuZXdfcGF0aC8lLmV4ZS99IgorICAgICMgRG8gbm90IHNhdmUgL2JpbiBwYXRocyB0byBhbGxfZml4cGF0aF9wcmVmaXhlcyEKKyAgZWxzZQorICAgICMgTm90IGluIG1peGVkIG9yIFdpbmRvd3Mgc3R5bGUsIHN0YXJ0IGJ5IHRoYXQuCisgICAgbmV3X3BhdGg9YGNtZCAvL2MgZWNobyAkbmV3X3BhdGhgCisKKyAgaW5wdXRfcGF0aD0iJG5ld19wYXRoIgorICAjIENoZWNrIGlmIHdlIG5lZWQgdG8gY29udmVydCB0aGlzIHVzaW5nIERPUy1zdHlsZSBzaG9ydCBtb2RlLiBJZiB0aGUgcGF0aAorICAjIGNvbnRhaW5zIGp1c3Qgc2ltcGxlIGNoYXJhY3RlcnMsIHVzZSBpdC4gT3RoZXJ3aXNlIChzcGFjZXMsIHdlaXJkIGNoYXJhY3RlcnMpLAorICAjIHRha2Ugbm8gY2hhbmNlcyBhbmQgcmV3cml0ZSBpdC4KKyAgIyBOb3RlOiBtNCBlYXRzIG91ciBbXSwgc28gd2UgbmVlZCB0byB1c2UgWyBhbmQgXSBpbnN0ZWFkLgorICBoYXNfZm9yYmlkZGVuX2NoYXJzPWAkRUNITyAiJGlucHV0X3BhdGgiIHwgJEdSRVAgW14tXy86YS16QS1aMC05XWAKKyAgaWYgdGVzdCAieCRoYXNfZm9yYmlkZGVuX2NoYXJzIiAhPSB4OyB0aGVuCisgICAgIyBOb3cgY29udmVydCBpdCB0byBtaXhlZCBET1Mtc3R5bGUsIHNob3J0IG1vZGUgKG5vIHNwYWNlcywgYW5kIC8gaW5zdGVhZCBvZiBcKQorICAgIG5ld19wYXRoPWBjbWQgL2MgImZvciAlQSBpbiAoXCIkaW5wdXRfcGF0aFwiKSBkbyBAZWNobyAlfnNBInwkVFIgXFxcXFxcXFwgLyB8ICRUUiAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidgCisgIGZpCisKKyAgICAjIE91dHB1dCBpcyBpbiAkbmV3X3BhdGgKKworICB3aW5kb3dzX3BhdGg9IiRuZXdfcGF0aCIKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJENZR1BBVEggLXUgIiR3aW5kb3dzX3BhdGgiYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBlbGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLm1zeXMiOyB0aGVuCisgICAgdW5peF9wYXRoPWAkRUNITyAiJHdpbmRvd3NfcGF0aCIgfCAkU0VEIC1lICdzLF5cXCguXFwpOiwvXFwxLGcnIC1lICdzLFxcXFwsLyxnJ2AKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZmkKKworICAgICMgcmVtb3ZlIHRyYWlsaW5nIC5leGUgaWYgYW55CisgICAgbmV3X3BhdGg9IiR7bmV3X3BhdGgvJS5leGUvfSIKKworICAgICMgU2F2ZSB0aGUgZmlyc3QgMTAgYnl0ZXMgb2YgdGhpcyBwYXRoIHRvIHRoZSBzdG9yYWdlLCBzbyBmaXhwYXRoIGNhbiB3b3JrLgorICAgIGFsbF9maXhwYXRoX3ByZWZpeGVzPSgiJHthbGxfZml4cGF0aF9wcmVmaXhlc1tAXX0iICIke25ld19wYXRoOjA6MTB9IikKKyAgZmkKKworICBlbHNlCisgICAgIyBXZSdyZSBvbiBhIHBvc2l4IHBsYXRmb3JtLiBIb29yYXkhIDopCisgICAgIyBGaXJzdCBzZXBhcmF0ZSB0aGUgcGF0aCBmcm9tIHRoZSBhcmd1bWVudHMuIFRoaXMgd2lsbCBzcGxpdCBhdCB0aGUgZmlyc3QKKyAgICAjIHNwYWNlLgorICAgIGNvbXBsZXRlPSIkTk0iCisgICAgcGF0aD0iJHtjb21wbGV0ZSUlICp9IgorICAgIHRtcD0iJGNvbXBsZXRlIEVPTCIKKyAgICBhcmd1bWVudHM9IiR7dG1wIyogfSIKKworICAgIG5ld19wYXRoPWAkV0hJQ0ggJHBhdGggMj4gL2Rldi9udWxsYAorICAgIGlmIHRlc3QgIngkbmV3X3BhdGgiID0geDsgdGhlbgorICAgICAgaXNfYWJzb2x1dGVfcGF0aD1gJEVDSE8gIiRwYXRoIiB8ICRHUkVQIF4vYAorICAgICAgaWYgdGVzdCAieCRpc19hYnNvbHV0ZV9wYXRoIiAhPSB4OyB0aGVuCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogUmVzb2x2aW5nIE5NIChhcyAkcGF0aCkgd2l0aCAnd2hpY2gnIGZhaWxlZCwgdXNpbmcgJHBhdGggZGlyZWN0bHkuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFJlc29sdmluZyBOTSAoYXMgJHBhdGgpIHdpdGggJ3doaWNoJyBmYWlsZWQsIHVzaW5nICRwYXRoIGRpcmVjdGx5LiIgPiY2O30KKyAgICAgICAgbmV3X3BhdGg9IiRwYXRoIgorICAgICAgZWxzZQorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSBwYXRoIG9mIE5NLCB3aGljaCByZXNvbHZlcyBhcyBcIiRjb21wbGV0ZVwiLCBpcyBub3QgZm91bmQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoZSBwYXRoIG9mIE5NLCB3aGljaCByZXNvbHZlcyBhcyBcIiRjb21wbGV0ZVwiLCBpcyBub3QgZm91bmQuIiA+JjY7fQorICAgICAgICBoYXNfc3BhY2U9YCRFQ0hPICIkY29tcGxldGUiIHwgJEdSRVAgIiAiYAorICAgICAgICBpZiB0ZXN0ICJ4JGhhc19zcGFjZSIgIT0geDsgdGhlbgorICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGhpcyBtaWdodCBiZSBjYXVzZWQgYnkgc3BhY2VzIGluIHRoZSBwYXRoLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhpcyBtaWdodCBiZSBjYXVzZWQgYnkgc3BhY2VzIGluIHRoZSBwYXRoLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iID4mNjt9CiAgICAgICAgIGZpCi0gICAgICAgICMgQ29udmVydCB0byBDOi8gbWl4ZWQgc3R5bGUgcGF0aCB3aXRob3V0IHNwYWNlcy4KLSAgICAgICAgIHRtcD1gJENZR1BBVEggLXMgLW0gIiR0bXAiYAorICAgICAgICBhc19mbl9lcnJvciAkPyAiQ2Fubm90IGxvY2F0ZSB0aGUgdGhlIHBhdGggb2YgTk0iICIkTElORU5PIiA1CisgICAgICBmaQogICAgIGZpCi0gICAgY2FyPSIkdG1wIgorICBmaQogCi0gICAgZWxzZQotICAgICAgICAjICJ3aGljaCIgaXMgbm90IHBvcnRhYmxlLCBidXQgaXMgdXNlZCBoZXJlCi0gICAgICAgICMgYmVjYXVzZSB3ZSBrbm93IHRoYXQgdGhlIGNvbW1hbmQgZXhpc3RzIQotICAgICAgICBjYXI9YHdoaWNoICRjYXJgCi0gICAgZmkKLSAgICBpZiB0ZXN0ICJ4JGNkciIgIT0geEVPTDsgdGhlbgotICAgICAgICBOTT0iJGNhciAke2NkciUgKn0iCi0gICAgZWxzZQotICAgICAgICBOTT0iJGNhciIKLSAgICBmaQorICAjIE5vdyBqb2luIHRvZ2V0aGVyIHRoZSBwYXRoIGFuZCB0aGUgYXJndW1lbnRzIG9uY2UgYWdhaW4KKyAgaWYgdGVzdCAieCRhcmd1bWVudHMiICE9IHhFT0w7IHRoZW4KKyAgICAgIG5ld19jb21wbGV0ZT0iJG5ld19wYXRoICR7YXJndW1lbnRzJSAqfSIKKyAgZWxzZQorICAgICAgbmV3X2NvbXBsZXRlPSIkbmV3X3BhdGgiCisgIGZpCisKKyAgaWYgdGVzdCAieCRjb21wbGV0ZSIgIT0gIngkbmV3X2NvbXBsZXRlIjsgdGhlbgorICAgIE5NPSIkbmV3X2NvbXBsZXRlIgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogUmV3cml0aW5nIE5NIHRvIFwiJG5ld19jb21wbGV0ZVwiIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFJld3JpdGluZyBOTSB0byBcIiRuZXdfY29tcGxldGVcIiIgPiY2O30KKyAgZmkKIAogICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAic3RyaXAiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgogc2V0IGR1bW15IHN0cmlwOyBhY193b3JkPSQyCkBAIC0xMzU3OCw0NyArMjM4OTQsMjQ1IEBACiAKIAogCi0gICAgIyBUcmFuc2xhdGUgImdjYyAtRSIgaW50byAiYHdoaWNoIGdjY2AgLUUiIGllCi0gICAgIyBleHRyYWN0IHRoZSBmdWxsIHBhdGggdG8gdGhlIGJpbmFyeSBhbmQgYXQgdGhlCi0gICAgIyBzYW1lIHRpbWUgbWFpbnRhaW4gYW55IGFyZ3VtZW50cyBwYXNzZWQgdG8gaXQuCi0gICAgIyBUaGUgY29tbWFuZCBNVVNUIGV4aXN0IGluIHRoZSBwYXRoLCBvciBlbHNlIQotICAgIHRtcD0iJFNUUklQIgotICAgIGNhcj0iJHt0bXAlJSAqfSIKLSAgICB0bXA9IiRTVFJJUCBFT0wiCi0gICAgY2RyPSIke3RtcCMqIH0iCi0gICAgIyBPbiB3aW5kb3dzIHdlIHdhbnQgcGF0aHMgd2l0aG91dCBzcGFjZXMuCi0gICAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TIiA9ICJ4d2luZG93cyI7IHRoZW4KKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgogCi0gICAgIyBUcmFuc2xhdGUgbG9uZyBjeWdkcml2ZSBvciBDOlxzZGZzZiBwYXRoCi0gICAgIyBpbnRvIGEgc2hvcnQgbWl4ZWQgbW9kZSBwYXRoIHRoYXQgaGFzIG5vCi0gICAgIyBzcGFjZXMgaW4gaXQuCi0gICAgdG1wPSIkY2FyIgorICAjIEZpcnN0IHNlcGFyYXRlIHRoZSBwYXRoIGZyb20gdGhlIGFyZ3VtZW50cy4gVGhpcyB3aWxsIHNwbGl0IGF0IHRoZSBmaXJzdAorICAjIHNwYWNlLgorICBjb21wbGV0ZT0iJFNUUklQIgorICBwYXRoPSIke2NvbXBsZXRlJSUgKn0iCisgIHRtcD0iJGNvbXBsZXRlIEVPTCIKKyAgYXJndW1lbnRzPSIke3RtcCMqIH0iCiAKLSAgICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1MiID0gInh3aW5kb3dzIjsgdGhlbgotICAgICAgICB0bXA9YCRDWUdQQVRIIC11ICIkY2FyImAKLSAgICAgICAgdG1wPWB3aGljaCAiJHRtcCJgCi0gICAgICAgICMgSWYgZmlsZSBleGlzdHMgd2l0aCAuZXhlIGFwcGVuZGVkLCB0aGF0J3MgdGhlIHJlYWwgZmlsZW5hbWUKLSAgICAgICAgIyBhbmQgY3lncGF0aCBuZWVkcyB0aGF0IHRvIGNvbnZlcnQgdG8gc2hvcnQgc3R5bGUgcGF0aC4KLSAgICAgICAgaWYgdGVzdCAtZiAiJHt0bXB9LmV4ZSI7IHRoZW4KLSAgICAgICAgICAgdG1wPSIke3RtcH0uZXhlIgotICAgICAgICBlbGlmIHRlc3QgLWYgIiR7dG1wfS5jbWQiOyB0aGVuCi0gICAgICAgICAgIHRtcD0iJHt0bXB9LmNtZCIKKyAgIyBJbnB1dCBtaWdodCBiZSBnaXZlbiBhcyBXaW5kb3dzIGZvcm1hdCwgc3RhcnQgYnkgY29udmVydGluZyB0bworICAjIHVuaXggZm9ybWF0LgorICBuZXdfcGF0aD1gJENZR1BBVEggLXUgIiRwYXRoImAKKworICAjIE5vdyB0cnkgdG8gbG9jYXRlIGV4ZWN1dGFibGUgdXNpbmcgd2hpY2gKKyAgbmV3X3BhdGg9YCRXSElDSCAiJG5ld19wYXRoIiAyPiAvZGV2L251bGxgCisgIGlmIHRlc3QgIngkbmV3X3BhdGgiID0geDsgdGhlbgorICAgICMgT29wcy4gV2hpY2ggZGlkbid0IGZpbmQgdGhlIGV4ZWN1dGFibGUuCisgICAgIyBUaGUgc3BsaXR0aW5nIG9mIGFyZ3VtZW50cyBmcm9tIHRoZSBleGVjdXRhYmxlIGF0IGEgc3BhY2UgbWlnaHQgaGF2ZSBiZWVuIGluY29ycmVjdCwKKyAgICAjIHNpbmNlIHBhdGhzIHdpdGggc3BhY2UgYXJlIG1vcmUgbGlrZWx5IGluIFdpbmRvd3MuIEdpdmUgaXQgYW5vdGhlciB0cnkgd2l0aCB0aGUgd2hvbGUKKyAgICAjIGFyZ3VtZW50LgorICAgIHBhdGg9IiRjb21wbGV0ZSIKKyAgICBhcmd1bWVudHM9IkVPTCIKKyAgICBuZXdfcGF0aD1gJENZR1BBVEggLXUgIiRwYXRoImAKKyAgICBuZXdfcGF0aD1gJFdISUNIICIkbmV3X3BhdGgiIDI+IC9kZXYvbnVsbGAKKyAgICBpZiB0ZXN0ICJ4JG5ld19wYXRoIiA9IHg7IHRoZW4KKyAgICAgICMgSXQncyBzdGlsbCBub3QgZm91bmQuIE5vdyB0aGlzIGlzIGFuIHVucmVjb3ZlcmFibGUgZXJyb3IuCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSBwYXRoIG9mIFNUUklQLCB3aGljaCByZXNvbHZlcyBhcyBcIiRjb21wbGV0ZVwiLCBpcyBub3QgZm91bmQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoZSBwYXRoIG9mIFNUUklQLCB3aGljaCByZXNvbHZlcyBhcyBcIiRjb21wbGV0ZVwiLCBpcyBub3QgZm91bmQuIiA+JjY7fQorICAgICAgaGFzX3NwYWNlPWAkRUNITyAiJGNvbXBsZXRlIiB8ICRHUkVQICIgImAKKyAgICAgIGlmIHRlc3QgIngkaGFzX3NwYWNlIiAhPSB4OyB0aGVuCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogWW91IG1pZ2h0IGJlIG1peGluZyBzcGFjZXMgaW4gdGhlIHBhdGggYW5kIGV4dHJhIGFyZ3VtZW50cywgd2hpY2ggaXMgbm90IGFsbG93ZWQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFlvdSBtaWdodCBiZSBtaXhpbmcgc3BhY2VzIGluIHRoZSBwYXRoIGFuZCBleHRyYSBhcmd1bWVudHMsIHdoaWNoIGlzIG5vdCBhbGxvd2VkLiIgPiY2O30KKyAgICAgIGZpCisgICAgICBhc19mbl9lcnJvciAkPyAiQ2Fubm90IGxvY2F0ZSB0aGUgdGhlIHBhdGggb2YgU1RSSVAiICIkTElORU5PIiA1CisgICAgZmkKKyAgZmkKKworICAjIEN5Z3dpbiB0cmllcyB0byBoaWRlIHNvbWUgYXNwZWN0cyBvZiB0aGUgV2luZG93cyBmaWxlIHN5c3RlbSwgc3VjaCB0aGF0IGJpbmFyaWVzIGFyZQorICAjIG5hbWVkIC5leGUgYnV0IGNhbGxlZCB3aXRob3V0IHRoYXQgc3VmZml4LiBUaGVyZWZvcmUsICJmb28iIGFuZCAiZm9vLmV4ZSIgYXJlIGNvbnNpZGVyZWQKKyAgIyB0aGUgc2FtZSBmaWxlLCBtb3N0IG9mIHRoZSB0aW1lIChhcyBpbiAidGVzdCAtZiIpLiBCdXQgbm90IHdoZW4gcnVubmluZyBjeWdwYXRoIC1zLCB0aGVuCisgICMgImZvby5leGUiIGlzIE9LIGJ1dCAiZm9vIiBpcyBhbiBlcnJvci4KKyAgIworICAjIFRoaXMgdGVzdCBpcyB0aGVyZWZvcmUgc2xpZ2h0bHkgbW9yZSBhY2N1cmF0ZSB0aGFuICJ0ZXN0IC1mIiB0byBjaGVjayBmb3IgZmlsZSBwcmVjZW5zZS4KKyAgIyBJdCBpcyBhbHNvIGEgd2F5IHRvIG1ha2Ugc3VyZSB3ZSBnb3QgdGhlIHByb3BlciBmaWxlIG5hbWUgZm9yIHRoZSByZWFsIHRlc3QgbGF0ZXIgb24uCisgIHRlc3Rfc2hvcnRwYXRoPWAkQ1lHUEFUSCAtcyAtbSAiJG5ld19wYXRoIiAyPiAvZGV2L251bGxgCisgIGlmIHRlc3QgIngkdGVzdF9zaG9ydHBhdGgiID0geDsgdGhlbgorICAgICMgU2hvcnQgcGF0aCBmYWlsZWQsIGZpbGUgZG9lcyBub3QgZXhpc3QgYXMgc3BlY2lmaWVkLgorICAgICMgVHJ5IGFkZGluZyAuZXhlIG9yIC5jbWQKKyAgICBpZiB0ZXN0IC1mICIke25ld19wYXRofS5leGUiOyB0aGVuCisgICAgICAgaW5wdXRfdG9fc2hvcnRwYXRoPSIke25ld19wYXRofS5leGUiCisgICAgZWxpZiB0ZXN0IC1mICIke25ld19wYXRofS5jbWQiOyB0aGVuCisgICAgICAgaW5wdXRfdG9fc2hvcnRwYXRoPSIke25ld19wYXRofS5jbWQiCisgICAgZWxzZQorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUaGUgcGF0aCBvZiBTVFJJUCwgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkbmV3X3BhdGhcIiwgaXMgaW52YWxpZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhlIHBhdGggb2YgU1RSSVAsIHdoaWNoIHJlc29sdmVzIGFzIFwiJG5ld19wYXRoXCIsIGlzIGludmFsaWQuIiA+JjY7fQorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBOZWl0aGVyIFwiJG5ld19wYXRoXCIgbm9yIFwiJG5ld19wYXRoLmV4ZS9jbWRcIiBjYW4gYmUgZm91bmQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogTmVpdGhlciBcIiRuZXdfcGF0aFwiIG5vciBcIiRuZXdfcGF0aC5leGUvY21kXCIgY2FuIGJlIGZvdW5kIiA+JjY7fQorICAgICAgYXNfZm5fZXJyb3IgJD8gIkNhbm5vdCBsb2NhdGUgdGhlIHRoZSBwYXRoIG9mIFNUUklQIiAiJExJTkVOTyIgNQorICAgIGZpCisgIGVsc2UKKyAgICBpbnB1dF90b19zaG9ydHBhdGg9IiRuZXdfcGF0aCIKKyAgZmkKKworICAjIENhbGwgaGVscGVyIGZ1bmN0aW9uIHdoaWNoIHBvc3NpYmx5IGNvbnZlcnRzIHRoaXMgdXNpbmcgRE9TLXN0eWxlIHNob3J0IG1vZGUuCisgICMgSWYgc28sIHRoZSB1cGRhdGVkIHBhdGggaXMgc3RvcmVkIGluICRuZXdfcGF0aC4KKyAgbmV3X3BhdGg9IiRpbnB1dF90b19zaG9ydHBhdGgiCisKKyAgaW5wdXRfcGF0aD0iJGlucHV0X3RvX3Nob3J0cGF0aCIKKyAgIyBDaGVjayBpZiB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhpcyB1c2luZyBET1Mtc3R5bGUgc2hvcnQgbW9kZS4gSWYgdGhlIHBhdGgKKyAgIyBjb250YWlucyBqdXN0IHNpbXBsZSBjaGFyYWN0ZXJzLCB1c2UgaXQuIE90aGVyd2lzZSAoc3BhY2VzLCB3ZWlyZCBjaGFyYWN0ZXJzKSwKKyAgIyB0YWtlIG5vIGNoYW5jZXMgYW5kIHJld3JpdGUgaXQuCisgICMgTm90ZTogbTQgZWF0cyBvdXIgW10sIHNvIHdlIG5lZWQgdG8gdXNlIFsgYW5kIF0gaW5zdGVhZC4KKyAgaGFzX2ZvcmJpZGRlbl9jaGFycz1gJEVDSE8gIiRpbnB1dF9wYXRoIiB8ICRHUkVQIFteLS5fL2EtekEtWjAtOV1gCisgIGlmIHRlc3QgIngkaGFzX2ZvcmJpZGRlbl9jaGFycyIgIT0geDsgdGhlbgorICAgICMgTm93IGNvbnZlcnQgaXQgdG8gbWl4ZWQgRE9TLXN0eWxlLCBzaG9ydCBtb2RlIChubyBzcGFjZXMsIGFuZCAvIGluc3RlYWQgb2YgXCkKKyAgICBzaG9ydG1vZGVfcGF0aD1gJENZR1BBVEggLXMgLW0gLWEgIiRpbnB1dF9wYXRoImAKKyAgICBwYXRoX2FmdGVyX3Nob3J0bW9kZT1gJENZR1BBVEggLXUgIiRzaG9ydG1vZGVfcGF0aCJgCisgICAgaWYgdGVzdCAieCRwYXRoX2FmdGVyX3Nob3J0bW9kZSIgIT0gIngkaW5wdXRfdG9fc2hvcnRwYXRoIjsgdGhlbgorICAgICAgIyBHb2luZyB0byBzaG9ydCBtb2RlIGFuZCBiYWNrIGFnYWluIGRpZCBpbmRlZWQgbWF0dGVyLiBTaW5jZSBzaG9ydCBtb2RlIGlzCisgICAgICAjIGNhc2UgaW5zZW5zaXRpdmUsIGxldCdzIG1ha2UgaXQgbG93ZXJjYXNlIHRvIGltcHJvdmUgcmVhZGFiaWxpdHkuCisgICAgICBzaG9ydG1vZGVfcGF0aD1gJEVDSE8gIiRzaG9ydG1vZGVfcGF0aCIgfCAkVFIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAorICAgICAgIyBOb3cgY29udmVydCBpdCBiYWNrIHRvIFVuaXgtc3RpbGUgKGN5Z3BhdGgpCisgICAgICBpbnB1dF9wYXRoPWAkQ1lHUEFUSCAtdSAiJHNob3J0bW9kZV9wYXRoImAKKyAgICAgIG5ld19wYXRoPSIkaW5wdXRfcGF0aCIKKyAgICBmaQorICBmaQorCisgIHRlc3RfY3lnZHJpdmVfcHJlZml4PWAkRUNITyAkaW5wdXRfcGF0aCB8ICRHUkVQIF4vY3lnZHJpdmUvYAorICBpZiB0ZXN0ICJ4JHRlc3RfY3lnZHJpdmVfcHJlZml4IiA9IHg7IHRoZW4KKyAgICAjIEFzIGEgc2ltcGxlIGZpeCwgZXhjbHVkZSAvdXNyL2JpbiBzaW5jZSBpdCdzIG5vdCBhIHJlYWwgcGF0aC4KKyAgICBpZiB0ZXN0ICJ4YCRFQ0hPICRpbnB1dF90b19zaG9ydHBhdGggfCAkR1JFUCBeL3Vzci9iaW4vYCIgPSB4OyB0aGVuCisgICAgICAjIFRoZSBwYXRoIGlzIGluIGEgQ3lnd2luIHNwZWNpYWwgZGlyZWN0b3J5IChlLmcuIC9ob21lKS4gV2UgbmVlZCB0aGlzIGNvbnZlcnRlZCB0bworICAgICAgIyBhIHBhdGggcHJlZml4ZWQgYnkgL2N5Z2RyaXZlIGZvciBmaXhwYXRoIHRvIHdvcmsuCisgICAgICBuZXdfcGF0aD0iJENZR1dJTl9ST09UX1BBVEgkaW5wdXRfcGF0aCIKKyAgICBmaQorICBmaQorCisgICMgcmVtb3ZlIHRyYWlsaW5nIC5leGUgaWYgYW55CisgIG5ld19wYXRoPSIke25ld19wYXRoLyUuZXhlL30iCisKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorCisgICMgRmlyc3Qgc2VwYXJhdGUgdGhlIHBhdGggZnJvbSB0aGUgYXJndW1lbnRzLiBUaGlzIHdpbGwgc3BsaXQgYXQgdGhlIGZpcnN0CisgICMgc3BhY2UuCisgIGNvbXBsZXRlPSIkU1RSSVAiCisgIHBhdGg9IiR7Y29tcGxldGUlJSAqfSIKKyAgdG1wPSIkY29tcGxldGUgRU9MIgorICBhcmd1bWVudHM9IiR7dG1wIyogfSIKKworICAjIElucHV0IG1pZ2h0IGJlIGdpdmVuIGFzIFdpbmRvd3MgZm9ybWF0LCBzdGFydCBieSBjb252ZXJ0aW5nIHRvCisgICMgdW5peCBmb3JtYXQuCisgIG5ld19wYXRoPSIkcGF0aCIKKworICB3aW5kb3dzX3BhdGg9IiRuZXdfcGF0aCIKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJENZR1BBVEggLXUgIiR3aW5kb3dzX3BhdGgiYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBlbGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLm1zeXMiOyB0aGVuCisgICAgdW5peF9wYXRoPWAkRUNITyAiJHdpbmRvd3NfcGF0aCIgfCAkU0VEIC1lICdzLF5cXCguXFwpOiwvXFwxLGcnIC1lICdzLFxcXFwsLyxnJ2AKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZmkKKworCisgICMgTm93IHRyeSB0byBsb2NhdGUgZXhlY3V0YWJsZSB1c2luZyB3aGljaAorICBuZXdfcGF0aD1gJFdISUNIICIkbmV3X3BhdGgiIDI+IC9kZXYvbnVsbGAKKworICBpZiB0ZXN0ICJ4JG5ld19wYXRoIiA9IHg7IHRoZW4KKyAgICAjIE9vcHMuIFdoaWNoIGRpZG4ndCBmaW5kIHRoZSBleGVjdXRhYmxlLgorICAgICMgVGhlIHNwbGl0dGluZyBvZiBhcmd1bWVudHMgZnJvbSB0aGUgZXhlY3V0YWJsZSBhdCBhIHNwYWNlIG1pZ2h0IGhhdmUgYmVlbiBpbmNvcnJlY3QsCisgICAgIyBzaW5jZSBwYXRocyB3aXRoIHNwYWNlIGFyZSBtb3JlIGxpa2VseSBpbiBXaW5kb3dzLiBHaXZlIGl0IGFub3RoZXIgdHJ5IHdpdGggdGhlIHdob2xlCisgICAgIyBhcmd1bWVudC4KKyAgICBwYXRoPSIkY29tcGxldGUiCisgICAgYXJndW1lbnRzPSJFT0wiCisgICAgbmV3X3BhdGg9IiRwYXRoIgorCisgIHdpbmRvd3NfcGF0aD0iJG5ld19wYXRoIgorICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5jeWd3aW4iOyB0aGVuCisgICAgdW5peF9wYXRoPWAkQ1lHUEFUSCAtdSAiJHdpbmRvd3NfcGF0aCJgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGVsaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MubXN5cyI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRFQ0hPICIkd2luZG93c19wYXRoIiB8ICRTRUQgLWUgJ3MsXlxcKC5cXCk6LC9cXDEsZycgLWUgJ3MsXFxcXCwvLGcnYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBmaQorCisKKyAgICBuZXdfcGF0aD1gJFdISUNIICIkbmV3X3BhdGgiIDI+IC9kZXYvbnVsbGAKKworICAgIGlmIHRlc3QgIngkbmV3X3BhdGgiID0geDsgdGhlbgorICAgICAgIyBJdCdzIHN0aWxsIG5vdCBmb3VuZC4gTm93IHRoaXMgaXMgYW4gdW5yZWNvdmVyYWJsZSBlcnJvci4KKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGhlIHBhdGggb2YgU1RSSVAsIHdoaWNoIHJlc29sdmVzIGFzIFwiJGNvbXBsZXRlXCIsIGlzIG5vdCBmb3VuZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhlIHBhdGggb2YgU1RSSVAsIHdoaWNoIHJlc29sdmVzIGFzIFwiJGNvbXBsZXRlXCIsIGlzIG5vdCBmb3VuZC4iID4mNjt9CisgICAgICBoYXNfc3BhY2U9YCRFQ0hPICIkY29tcGxldGUiIHwgJEdSRVAgIiAiYAorICAgICAgaWYgdGVzdCAieCRoYXNfc3BhY2UiICE9IHg7IHRoZW4KKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBZb3UgbWlnaHQgYmUgbWl4aW5nIHNwYWNlcyBpbiB0aGUgcGF0aCBhbmQgZXh0cmEgYXJndW1lbnRzLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogWW91IG1pZ2h0IGJlIG1peGluZyBzcGFjZXMgaW4gdGhlIHBhdGggYW5kIGV4dHJhIGFyZ3VtZW50cywgd2hpY2ggaXMgbm90IGFsbG93ZWQuIiA+JjY7fQorICAgICAgZmkKKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJDYW5ub3QgbG9jYXRlIHRoZSB0aGUgcGF0aCBvZiBTVFJJUCIgIiRMSU5FTk8iIDUKKyAgICBmaQorICBmaQorCisgICMgTm93IG5ld19wYXRoIGhhcyBhIGNvbXBsZXRlIHVuaXggcGF0aCB0byB0aGUgYmluYXJ5CisgIGlmIHRlc3QgInhgJEVDSE8gJG5ld19wYXRoIHwgJEdSRVAgXi9iaW4vYCIgIT0geDsgdGhlbgorICAgICMgS2VlcCBwYXRocyBpbiAvYmluIGFzLWlzLCBidXQgcmVtb3ZlIHRyYWlsaW5nIC5leGUgaWYgYW55CisgICAgbmV3X3BhdGg9IiR7bmV3X3BhdGgvJS5leGUvfSIKKyAgICAjIERvIG5vdCBzYXZlIC9iaW4gcGF0aHMgdG8gYWxsX2ZpeHBhdGhfcHJlZml4ZXMhCisgIGVsc2UKKyAgICAjIE5vdCBpbiBtaXhlZCBvciBXaW5kb3dzIHN0eWxlLCBzdGFydCBieSB0aGF0LgorICAgIG5ld19wYXRoPWBjbWQgLy9jIGVjaG8gJG5ld19wYXRoYAorCisgIGlucHV0X3BhdGg9IiRuZXdfcGF0aCIKKyAgIyBDaGVjayBpZiB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhpcyB1c2luZyBET1Mtc3R5bGUgc2hvcnQgbW9kZS4gSWYgdGhlIHBhdGgKKyAgIyBjb250YWlucyBqdXN0IHNpbXBsZSBjaGFyYWN0ZXJzLCB1c2UgaXQuIE90aGVyd2lzZSAoc3BhY2VzLCB3ZWlyZCBjaGFyYWN0ZXJzKSwKKyAgIyB0YWtlIG5vIGNoYW5jZXMgYW5kIHJld3JpdGUgaXQuCisgICMgTm90ZTogbTQgZWF0cyBvdXIgW10sIHNvIHdlIG5lZWQgdG8gdXNlIFsgYW5kIF0gaW5zdGVhZC4KKyAgaGFzX2ZvcmJpZGRlbl9jaGFycz1gJEVDSE8gIiRpbnB1dF9wYXRoIiB8ICRHUkVQIFteLV8vOmEtekEtWjAtOV1gCisgIGlmIHRlc3QgIngkaGFzX2ZvcmJpZGRlbl9jaGFycyIgIT0geDsgdGhlbgorICAgICMgTm93IGNvbnZlcnQgaXQgdG8gbWl4ZWQgRE9TLXN0eWxlLCBzaG9ydCBtb2RlIChubyBzcGFjZXMsIGFuZCAvIGluc3RlYWQgb2YgXCkKKyAgICBuZXdfcGF0aD1gY21kIC9jICJmb3IgJUEgaW4gKFwiJGlucHV0X3BhdGhcIikgZG8gQGVjaG8gJX5zQSJ8JFRSIFxcXFxcXFxcIC8gfCAkVFIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAorICBmaQorCisgICAgIyBPdXRwdXQgaXMgaW4gJG5ld19wYXRoCisKKyAgd2luZG93c19wYXRoPSIkbmV3X3BhdGgiCisgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLmN5Z3dpbiI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRDWUdQQVRIIC11ICIkd2luZG93c19wYXRoImAKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJEVDSE8gIiR3aW5kb3dzX3BhdGgiIHwgJFNFRCAtZSAncyxeXFwoLlxcKTosL1xcMSxnJyAtZSAncyxcXFxcLC8sZydgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGZpCisKKyAgICAjIHJlbW92ZSB0cmFpbGluZyAuZXhlIGlmIGFueQorICAgIG5ld19wYXRoPSIke25ld19wYXRoLyUuZXhlL30iCisKKyAgICAjIFNhdmUgdGhlIGZpcnN0IDEwIGJ5dGVzIG9mIHRoaXMgcGF0aCB0byB0aGUgc3RvcmFnZSwgc28gZml4cGF0aCBjYW4gd29yay4KKyAgICBhbGxfZml4cGF0aF9wcmVmaXhlcz0oIiR7YWxsX2ZpeHBhdGhfcHJlZml4ZXNbQF19IiAiJHtuZXdfcGF0aDowOjEwfSIpCisgIGZpCisKKyAgZWxzZQorICAgICMgV2UncmUgb24gYSBwb3NpeCBwbGF0Zm9ybS4gSG9vcmF5ISA6KQorICAgICMgRmlyc3Qgc2VwYXJhdGUgdGhlIHBhdGggZnJvbSB0aGUgYXJndW1lbnRzLiBUaGlzIHdpbGwgc3BsaXQgYXQgdGhlIGZpcnN0CisgICAgIyBzcGFjZS4KKyAgICBjb21wbGV0ZT0iJFNUUklQIgorICAgIHBhdGg9IiR7Y29tcGxldGUlJSAqfSIKKyAgICB0bXA9IiRjb21wbGV0ZSBFT0wiCisgICAgYXJndW1lbnRzPSIke3RtcCMqIH0iCisKKyAgICBuZXdfcGF0aD1gJFdISUNIICRwYXRoIDI+IC9kZXYvbnVsbGAKKyAgICBpZiB0ZXN0ICJ4JG5ld19wYXRoIiA9IHg7IHRoZW4KKyAgICAgIGlzX2Fic29sdXRlX3BhdGg9YCRFQ0hPICIkcGF0aCIgfCAkR1JFUCBeL2AKKyAgICAgIGlmIHRlc3QgIngkaXNfYWJzb2x1dGVfcGF0aCIgIT0geDsgdGhlbgorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFJlc29sdmluZyBTVFJJUCAoYXMgJHBhdGgpIHdpdGggJ3doaWNoJyBmYWlsZWQsIHVzaW5nICRwYXRoIGRpcmVjdGx5LiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBSZXNvbHZpbmcgU1RSSVAgKGFzICRwYXRoKSB3aXRoICd3aGljaCcgZmFpbGVkLCB1c2luZyAkcGF0aCBkaXJlY3RseS4iID4mNjt9CisgICAgICAgIG5ld19wYXRoPSIkcGF0aCIKKyAgICAgIGVsc2UKKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUaGUgcGF0aCBvZiBTVFJJUCwgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkY29tcGxldGVcIiwgaXMgbm90IGZvdW5kLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUaGUgcGF0aCBvZiBTVFJJUCwgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkY29tcGxldGVcIiwgaXMgbm90IGZvdW5kLiIgPiY2O30KKyAgICAgICAgaGFzX3NwYWNlPWAkRUNITyAiJGNvbXBsZXRlIiB8ICRHUkVQICIgImAKKyAgICAgICAgaWYgdGVzdCAieCRoYXNfc3BhY2UiICE9IHg7IHRoZW4KKyAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoaXMgbWlnaHQgYmUgY2F1c2VkIGJ5IHNwYWNlcyBpbiB0aGUgcGF0aCwgd2hpY2ggaXMgbm90IGFsbG93ZWQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoaXMgbWlnaHQgYmUgY2F1c2VkIGJ5IHNwYWNlcyBpbiB0aGUgcGF0aCwgd2hpY2ggaXMgbm90IGFsbG93ZWQuIiA+JjY7fQogICAgICAgICBmaQotICAgICAgICAjIENvbnZlcnQgdG8gQzovIG1peGVkIHN0eWxlIHBhdGggd2l0aG91dCBzcGFjZXMuCi0gICAgICAgICB0bXA9YCRDWUdQQVRIIC1zIC1tICIkdG1wImAKKyAgICAgICAgYXNfZm5fZXJyb3IgJD8gIkNhbm5vdCBsb2NhdGUgdGhlIHRoZSBwYXRoIG9mIFNUUklQIiAiJExJTkVOTyIgNQorICAgICAgZmkKICAgICBmaQotICAgIGNhcj0iJHRtcCIKKyAgZmkKIAotICAgIGVsc2UKLSAgICAgICAgIyAid2hpY2giIGlzIG5vdCBwb3J0YWJsZSwgYnV0IGlzIHVzZWQgaGVyZQotICAgICAgICAjIGJlY2F1c2Ugd2Uga25vdyB0aGF0IHRoZSBjb21tYW5kIGV4aXN0cyEKLSAgICAgICAgY2FyPWB3aGljaCAkY2FyYAotICAgIGZpCi0gICAgaWYgdGVzdCAieCRjZHIiICE9IHhFT0w7IHRoZW4KLSAgICAgICAgU1RSSVA9IiRjYXIgJHtjZHIlICp9IgotICAgIGVsc2UKLSAgICAgICAgU1RSSVA9IiRjYXIiCi0gICAgZmkKKyAgIyBOb3cgam9pbiB0b2dldGhlciB0aGUgcGF0aCBhbmQgdGhlIGFyZ3VtZW50cyBvbmNlIGFnYWluCisgIGlmIHRlc3QgIngkYXJndW1lbnRzIiAhPSB4RU9MOyB0aGVuCisgICAgICBuZXdfY29tcGxldGU9IiRuZXdfcGF0aCAke2FyZ3VtZW50cyUgKn0iCisgIGVsc2UKKyAgICAgIG5ld19jb21wbGV0ZT0iJG5ld19wYXRoIgorICBmaQorCisgIGlmIHRlc3QgIngkY29tcGxldGUiICE9ICJ4JG5ld19jb21wbGV0ZSI7IHRoZW4KKyAgICBTVFJJUD0iJG5ld19jb21wbGV0ZSIKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFJld3JpdGluZyBTVFJJUCB0byBcIiRuZXdfY29tcGxldGVcIiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBSZXdyaXRpbmcgU1RSSVAgdG8gXCIkbmV3X2NvbXBsZXRlXCIiID4mNjt9CisgIGZpCiAKICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm1jcyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCiBzZXQgZHVtbXkgbWNzOyBhY193b3JkPSQyCkBAIC0xMzY2MSw0OSArMjQxNzUsMjQ3IEBACiAKIAogCi0gICAgIyBUcmFuc2xhdGUgImdjYyAtRSIgaW50byAiYHdoaWNoIGdjY2AgLUUiIGllCi0gICAgIyBleHRyYWN0IHRoZSBmdWxsIHBhdGggdG8gdGhlIGJpbmFyeSBhbmQgYXQgdGhlCi0gICAgIyBzYW1lIHRpbWUgbWFpbnRhaW4gYW55IGFyZ3VtZW50cyBwYXNzZWQgdG8gaXQuCi0gICAgIyBUaGUgY29tbWFuZCBNVVNUIGV4aXN0IGluIHRoZSBwYXRoLCBvciBlbHNlIQotICAgIHRtcD0iJE1DUyIKLSAgICBjYXI9IiR7dG1wJSUgKn0iCi0gICAgdG1wPSIkTUNTIEVPTCIKLSAgICBjZHI9IiR7dG1wIyogfSIKLSAgICAjIE9uIHdpbmRvd3Mgd2Ugd2FudCBwYXRocyB3aXRob3V0IHNwYWNlcy4KLSAgICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1MiID0gInh3aW5kb3dzIjsgdGhlbgorICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5jeWd3aW4iOyB0aGVuCiAKLSAgICAjIFRyYW5zbGF0ZSBsb25nIGN5Z2RyaXZlIG9yIEM6XHNkZnNmIHBhdGgKLSAgICAjIGludG8gYSBzaG9ydCBtaXhlZCBtb2RlIHBhdGggdGhhdCBoYXMgbm8KLSAgICAjIHNwYWNlcyBpbiBpdC4KLSAgICB0bXA9IiRjYXIiCisgICMgRmlyc3Qgc2VwYXJhdGUgdGhlIHBhdGggZnJvbSB0aGUgYXJndW1lbnRzLiBUaGlzIHdpbGwgc3BsaXQgYXQgdGhlIGZpcnN0CisgICMgc3BhY2UuCisgIGNvbXBsZXRlPSIkTUNTIgorICBwYXRoPSIke2NvbXBsZXRlJSUgKn0iCisgIHRtcD0iJGNvbXBsZXRlIEVPTCIKKyAgYXJndW1lbnRzPSIke3RtcCMqIH0iCiAKLSAgICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1MiID0gInh3aW5kb3dzIjsgdGhlbgotICAgICAgICB0bXA9YCRDWUdQQVRIIC11ICIkY2FyImAKLSAgICAgICAgdG1wPWB3aGljaCAiJHRtcCJgCi0gICAgICAgICMgSWYgZmlsZSBleGlzdHMgd2l0aCAuZXhlIGFwcGVuZGVkLCB0aGF0J3MgdGhlIHJlYWwgZmlsZW5hbWUKLSAgICAgICAgIyBhbmQgY3lncGF0aCBuZWVkcyB0aGF0IHRvIGNvbnZlcnQgdG8gc2hvcnQgc3R5bGUgcGF0aC4KLSAgICAgICAgaWYgdGVzdCAtZiAiJHt0bXB9LmV4ZSI7IHRoZW4KLSAgICAgICAgICAgdG1wPSIke3RtcH0uZXhlIgotICAgICAgICBlbGlmIHRlc3QgLWYgIiR7dG1wfS5jbWQiOyB0aGVuCi0gICAgICAgICAgIHRtcD0iJHt0bXB9LmNtZCIKKyAgIyBJbnB1dCBtaWdodCBiZSBnaXZlbiBhcyBXaW5kb3dzIGZvcm1hdCwgc3RhcnQgYnkgY29udmVydGluZyB0bworICAjIHVuaXggZm9ybWF0LgorICBuZXdfcGF0aD1gJENZR1BBVEggLXUgIiRwYXRoImAKKworICAjIE5vdyB0cnkgdG8gbG9jYXRlIGV4ZWN1dGFibGUgdXNpbmcgd2hpY2gKKyAgbmV3X3BhdGg9YCRXSElDSCAiJG5ld19wYXRoIiAyPiAvZGV2L251bGxgCisgIGlmIHRlc3QgIngkbmV3X3BhdGgiID0geDsgdGhlbgorICAgICMgT29wcy4gV2hpY2ggZGlkbid0IGZpbmQgdGhlIGV4ZWN1dGFibGUuCisgICAgIyBUaGUgc3BsaXR0aW5nIG9mIGFyZ3VtZW50cyBmcm9tIHRoZSBleGVjdXRhYmxlIGF0IGEgc3BhY2UgbWlnaHQgaGF2ZSBiZWVuIGluY29ycmVjdCwKKyAgICAjIHNpbmNlIHBhdGhzIHdpdGggc3BhY2UgYXJlIG1vcmUgbGlrZWx5IGluIFdpbmRvd3MuIEdpdmUgaXQgYW5vdGhlciB0cnkgd2l0aCB0aGUgd2hvbGUKKyAgICAjIGFyZ3VtZW50LgorICAgIHBhdGg9IiRjb21wbGV0ZSIKKyAgICBhcmd1bWVudHM9IkVPTCIKKyAgICBuZXdfcGF0aD1gJENZR1BBVEggLXUgIiRwYXRoImAKKyAgICBuZXdfcGF0aD1gJFdISUNIICIkbmV3X3BhdGgiIDI+IC9kZXYvbnVsbGAKKyAgICBpZiB0ZXN0ICJ4JG5ld19wYXRoIiA9IHg7IHRoZW4KKyAgICAgICMgSXQncyBzdGlsbCBub3QgZm91bmQuIE5vdyB0aGlzIGlzIGFuIHVucmVjb3ZlcmFibGUgZXJyb3IuCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSBwYXRoIG9mIE1DUywgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkY29tcGxldGVcIiwgaXMgbm90IGZvdW5kLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUaGUgcGF0aCBvZiBNQ1MsIHdoaWNoIHJlc29sdmVzIGFzIFwiJGNvbXBsZXRlXCIsIGlzIG5vdCBmb3VuZC4iID4mNjt9CisgICAgICBoYXNfc3BhY2U9YCRFQ0hPICIkY29tcGxldGUiIHwgJEdSRVAgIiAiYAorICAgICAgaWYgdGVzdCAieCRoYXNfc3BhY2UiICE9IHg7IHRoZW4KKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBZb3UgbWlnaHQgYmUgbWl4aW5nIHNwYWNlcyBpbiB0aGUgcGF0aCBhbmQgZXh0cmEgYXJndW1lbnRzLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogWW91IG1pZ2h0IGJlIG1peGluZyBzcGFjZXMgaW4gdGhlIHBhdGggYW5kIGV4dHJhIGFyZ3VtZW50cywgd2hpY2ggaXMgbm90IGFsbG93ZWQuIiA+JjY7fQorICAgICAgZmkKKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJDYW5ub3QgbG9jYXRlIHRoZSB0aGUgcGF0aCBvZiBNQ1MiICIkTElORU5PIiA1CisgICAgZmkKKyAgZmkKKworICAjIEN5Z3dpbiB0cmllcyB0byBoaWRlIHNvbWUgYXNwZWN0cyBvZiB0aGUgV2luZG93cyBmaWxlIHN5c3RlbSwgc3VjaCB0aGF0IGJpbmFyaWVzIGFyZQorICAjIG5hbWVkIC5leGUgYnV0IGNhbGxlZCB3aXRob3V0IHRoYXQgc3VmZml4LiBUaGVyZWZvcmUsICJmb28iIGFuZCAiZm9vLmV4ZSIgYXJlIGNvbnNpZGVyZWQKKyAgIyB0aGUgc2FtZSBmaWxlLCBtb3N0IG9mIHRoZSB0aW1lIChhcyBpbiAidGVzdCAtZiIpLiBCdXQgbm90IHdoZW4gcnVubmluZyBjeWdwYXRoIC1zLCB0aGVuCisgICMgImZvby5leGUiIGlzIE9LIGJ1dCAiZm9vIiBpcyBhbiBlcnJvci4KKyAgIworICAjIFRoaXMgdGVzdCBpcyB0aGVyZWZvcmUgc2xpZ2h0bHkgbW9yZSBhY2N1cmF0ZSB0aGFuICJ0ZXN0IC1mIiB0byBjaGVjayBmb3IgZmlsZSBwcmVjZW5zZS4KKyAgIyBJdCBpcyBhbHNvIGEgd2F5IHRvIG1ha2Ugc3VyZSB3ZSBnb3QgdGhlIHByb3BlciBmaWxlIG5hbWUgZm9yIHRoZSByZWFsIHRlc3QgbGF0ZXIgb24uCisgIHRlc3Rfc2hvcnRwYXRoPWAkQ1lHUEFUSCAtcyAtbSAiJG5ld19wYXRoIiAyPiAvZGV2L251bGxgCisgIGlmIHRlc3QgIngkdGVzdF9zaG9ydHBhdGgiID0geDsgdGhlbgorICAgICMgU2hvcnQgcGF0aCBmYWlsZWQsIGZpbGUgZG9lcyBub3QgZXhpc3QgYXMgc3BlY2lmaWVkLgorICAgICMgVHJ5IGFkZGluZyAuZXhlIG9yIC5jbWQKKyAgICBpZiB0ZXN0IC1mICIke25ld19wYXRofS5leGUiOyB0aGVuCisgICAgICAgaW5wdXRfdG9fc2hvcnRwYXRoPSIke25ld19wYXRofS5leGUiCisgICAgZWxpZiB0ZXN0IC1mICIke25ld19wYXRofS5jbWQiOyB0aGVuCisgICAgICAgaW5wdXRfdG9fc2hvcnRwYXRoPSIke25ld19wYXRofS5jbWQiCisgICAgZWxzZQorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUaGUgcGF0aCBvZiBNQ1MsIHdoaWNoIHJlc29sdmVzIGFzIFwiJG5ld19wYXRoXCIsIGlzIGludmFsaWQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoZSBwYXRoIG9mIE1DUywgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkbmV3X3BhdGhcIiwgaXMgaW52YWxpZC4iID4mNjt9CisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IE5laXRoZXIgXCIkbmV3X3BhdGhcIiBub3IgXCIkbmV3X3BhdGguZXhlL2NtZFwiIGNhbiBiZSBmb3VuZCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBOZWl0aGVyIFwiJG5ld19wYXRoXCIgbm9yIFwiJG5ld19wYXRoLmV4ZS9jbWRcIiBjYW4gYmUgZm91bmQiID4mNjt9CisgICAgICBhc19mbl9lcnJvciAkPyAiQ2Fubm90IGxvY2F0ZSB0aGUgdGhlIHBhdGggb2YgTUNTIiAiJExJTkVOTyIgNQorICAgIGZpCisgIGVsc2UKKyAgICBpbnB1dF90b19zaG9ydHBhdGg9IiRuZXdfcGF0aCIKKyAgZmkKKworICAjIENhbGwgaGVscGVyIGZ1bmN0aW9uIHdoaWNoIHBvc3NpYmx5IGNvbnZlcnRzIHRoaXMgdXNpbmcgRE9TLXN0eWxlIHNob3J0IG1vZGUuCisgICMgSWYgc28sIHRoZSB1cGRhdGVkIHBhdGggaXMgc3RvcmVkIGluICRuZXdfcGF0aC4KKyAgbmV3X3BhdGg9IiRpbnB1dF90b19zaG9ydHBhdGgiCisKKyAgaW5wdXRfcGF0aD0iJGlucHV0X3RvX3Nob3J0cGF0aCIKKyAgIyBDaGVjayBpZiB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhpcyB1c2luZyBET1Mtc3R5bGUgc2hvcnQgbW9kZS4gSWYgdGhlIHBhdGgKKyAgIyBjb250YWlucyBqdXN0IHNpbXBsZSBjaGFyYWN0ZXJzLCB1c2UgaXQuIE90aGVyd2lzZSAoc3BhY2VzLCB3ZWlyZCBjaGFyYWN0ZXJzKSwKKyAgIyB0YWtlIG5vIGNoYW5jZXMgYW5kIHJld3JpdGUgaXQuCisgICMgTm90ZTogbTQgZWF0cyBvdXIgW10sIHNvIHdlIG5lZWQgdG8gdXNlIFsgYW5kIF0gaW5zdGVhZC4KKyAgaGFzX2ZvcmJpZGRlbl9jaGFycz1gJEVDSE8gIiRpbnB1dF9wYXRoIiB8ICRHUkVQIFteLS5fL2EtekEtWjAtOV1gCisgIGlmIHRlc3QgIngkaGFzX2ZvcmJpZGRlbl9jaGFycyIgIT0geDsgdGhlbgorICAgICMgTm93IGNvbnZlcnQgaXQgdG8gbWl4ZWQgRE9TLXN0eWxlLCBzaG9ydCBtb2RlIChubyBzcGFjZXMsIGFuZCAvIGluc3RlYWQgb2YgXCkKKyAgICBzaG9ydG1vZGVfcGF0aD1gJENZR1BBVEggLXMgLW0gLWEgIiRpbnB1dF9wYXRoImAKKyAgICBwYXRoX2FmdGVyX3Nob3J0bW9kZT1gJENZR1BBVEggLXUgIiRzaG9ydG1vZGVfcGF0aCJgCisgICAgaWYgdGVzdCAieCRwYXRoX2FmdGVyX3Nob3J0bW9kZSIgIT0gIngkaW5wdXRfdG9fc2hvcnRwYXRoIjsgdGhlbgorICAgICAgIyBHb2luZyB0byBzaG9ydCBtb2RlIGFuZCBiYWNrIGFnYWluIGRpZCBpbmRlZWQgbWF0dGVyLiBTaW5jZSBzaG9ydCBtb2RlIGlzCisgICAgICAjIGNhc2UgaW5zZW5zaXRpdmUsIGxldCdzIG1ha2UgaXQgbG93ZXJjYXNlIHRvIGltcHJvdmUgcmVhZGFiaWxpdHkuCisgICAgICBzaG9ydG1vZGVfcGF0aD1gJEVDSE8gIiRzaG9ydG1vZGVfcGF0aCIgfCAkVFIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAorICAgICAgIyBOb3cgY29udmVydCBpdCBiYWNrIHRvIFVuaXgtc3RpbGUgKGN5Z3BhdGgpCisgICAgICBpbnB1dF9wYXRoPWAkQ1lHUEFUSCAtdSAiJHNob3J0bW9kZV9wYXRoImAKKyAgICAgIG5ld19wYXRoPSIkaW5wdXRfcGF0aCIKKyAgICBmaQorICBmaQorCisgIHRlc3RfY3lnZHJpdmVfcHJlZml4PWAkRUNITyAkaW5wdXRfcGF0aCB8ICRHUkVQIF4vY3lnZHJpdmUvYAorICBpZiB0ZXN0ICJ4JHRlc3RfY3lnZHJpdmVfcHJlZml4IiA9IHg7IHRoZW4KKyAgICAjIEFzIGEgc2ltcGxlIGZpeCwgZXhjbHVkZSAvdXNyL2JpbiBzaW5jZSBpdCdzIG5vdCBhIHJlYWwgcGF0aC4KKyAgICBpZiB0ZXN0ICJ4YCRFQ0hPICRpbnB1dF90b19zaG9ydHBhdGggfCAkR1JFUCBeL3Vzci9iaW4vYCIgPSB4OyB0aGVuCisgICAgICAjIFRoZSBwYXRoIGlzIGluIGEgQ3lnd2luIHNwZWNpYWwgZGlyZWN0b3J5IChlLmcuIC9ob21lKS4gV2UgbmVlZCB0aGlzIGNvbnZlcnRlZCB0bworICAgICAgIyBhIHBhdGggcHJlZml4ZWQgYnkgL2N5Z2RyaXZlIGZvciBmaXhwYXRoIHRvIHdvcmsuCisgICAgICBuZXdfcGF0aD0iJENZR1dJTl9ST09UX1BBVEgkaW5wdXRfcGF0aCIKKyAgICBmaQorICBmaQorCisgICMgcmVtb3ZlIHRyYWlsaW5nIC5leGUgaWYgYW55CisgIG5ld19wYXRoPSIke25ld19wYXRoLyUuZXhlL30iCisKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorCisgICMgRmlyc3Qgc2VwYXJhdGUgdGhlIHBhdGggZnJvbSB0aGUgYXJndW1lbnRzLiBUaGlzIHdpbGwgc3BsaXQgYXQgdGhlIGZpcnN0CisgICMgc3BhY2UuCisgIGNvbXBsZXRlPSIkTUNTIgorICBwYXRoPSIke2NvbXBsZXRlJSUgKn0iCisgIHRtcD0iJGNvbXBsZXRlIEVPTCIKKyAgYXJndW1lbnRzPSIke3RtcCMqIH0iCisKKyAgIyBJbnB1dCBtaWdodCBiZSBnaXZlbiBhcyBXaW5kb3dzIGZvcm1hdCwgc3RhcnQgYnkgY29udmVydGluZyB0bworICAjIHVuaXggZm9ybWF0LgorICBuZXdfcGF0aD0iJHBhdGgiCisKKyAgd2luZG93c19wYXRoPSIkbmV3X3BhdGgiCisgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLmN5Z3dpbiI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRDWUdQQVRIIC11ICIkd2luZG93c19wYXRoImAKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJEVDSE8gIiR3aW5kb3dzX3BhdGgiIHwgJFNFRCAtZSAncyxeXFwoLlxcKTosL1xcMSxnJyAtZSAncyxcXFxcLC8sZydgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGZpCisKKworICAjIE5vdyB0cnkgdG8gbG9jYXRlIGV4ZWN1dGFibGUgdXNpbmcgd2hpY2gKKyAgbmV3X3BhdGg9YCRXSElDSCAiJG5ld19wYXRoIiAyPiAvZGV2L251bGxgCisKKyAgaWYgdGVzdCAieCRuZXdfcGF0aCIgPSB4OyB0aGVuCisgICAgIyBPb3BzLiBXaGljaCBkaWRuJ3QgZmluZCB0aGUgZXhlY3V0YWJsZS4KKyAgICAjIFRoZSBzcGxpdHRpbmcgb2YgYXJndW1lbnRzIGZyb20gdGhlIGV4ZWN1dGFibGUgYXQgYSBzcGFjZSBtaWdodCBoYXZlIGJlZW4gaW5jb3JyZWN0LAorICAgICMgc2luY2UgcGF0aHMgd2l0aCBzcGFjZSBhcmUgbW9yZSBsaWtlbHkgaW4gV2luZG93cy4gR2l2ZSBpdCBhbm90aGVyIHRyeSB3aXRoIHRoZSB3aG9sZQorICAgICMgYXJndW1lbnQuCisgICAgcGF0aD0iJGNvbXBsZXRlIgorICAgIGFyZ3VtZW50cz0iRU9MIgorICAgIG5ld19wYXRoPSIkcGF0aCIKKworICB3aW5kb3dzX3BhdGg9IiRuZXdfcGF0aCIKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJENZR1BBVEggLXUgIiR3aW5kb3dzX3BhdGgiYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBlbGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLm1zeXMiOyB0aGVuCisgICAgdW5peF9wYXRoPWAkRUNITyAiJHdpbmRvd3NfcGF0aCIgfCAkU0VEIC1lICdzLF5cXCguXFwpOiwvXFwxLGcnIC1lICdzLFxcXFwsLyxnJ2AKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZmkKKworCisgICAgbmV3X3BhdGg9YCRXSElDSCAiJG5ld19wYXRoIiAyPiAvZGV2L251bGxgCisKKyAgICBpZiB0ZXN0ICJ4JG5ld19wYXRoIiA9IHg7IHRoZW4KKyAgICAgICMgSXQncyBzdGlsbCBub3QgZm91bmQuIE5vdyB0aGlzIGlzIGFuIHVucmVjb3ZlcmFibGUgZXJyb3IuCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSBwYXRoIG9mIE1DUywgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkY29tcGxldGVcIiwgaXMgbm90IGZvdW5kLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUaGUgcGF0aCBvZiBNQ1MsIHdoaWNoIHJlc29sdmVzIGFzIFwiJGNvbXBsZXRlXCIsIGlzIG5vdCBmb3VuZC4iID4mNjt9CisgICAgICBoYXNfc3BhY2U9YCRFQ0hPICIkY29tcGxldGUiIHwgJEdSRVAgIiAiYAorICAgICAgaWYgdGVzdCAieCRoYXNfc3BhY2UiICE9IHg7IHRoZW4KKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBZb3UgbWlnaHQgYmUgbWl4aW5nIHNwYWNlcyBpbiB0aGUgcGF0aCBhbmQgZXh0cmEgYXJndW1lbnRzLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogWW91IG1pZ2h0IGJlIG1peGluZyBzcGFjZXMgaW4gdGhlIHBhdGggYW5kIGV4dHJhIGFyZ3VtZW50cywgd2hpY2ggaXMgbm90IGFsbG93ZWQuIiA+JjY7fQorICAgICAgZmkKKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJDYW5ub3QgbG9jYXRlIHRoZSB0aGUgcGF0aCBvZiBNQ1MiICIkTElORU5PIiA1CisgICAgZmkKKyAgZmkKKworICAjIE5vdyBuZXdfcGF0aCBoYXMgYSBjb21wbGV0ZSB1bml4IHBhdGggdG8gdGhlIGJpbmFyeQorICBpZiB0ZXN0ICJ4YCRFQ0hPICRuZXdfcGF0aCB8ICRHUkVQIF4vYmluL2AiICE9IHg7IHRoZW4KKyAgICAjIEtlZXAgcGF0aHMgaW4gL2JpbiBhcy1pcywgYnV0IHJlbW92ZSB0cmFpbGluZyAuZXhlIGlmIGFueQorICAgIG5ld19wYXRoPSIke25ld19wYXRoLyUuZXhlL30iCisgICAgIyBEbyBub3Qgc2F2ZSAvYmluIHBhdGhzIHRvIGFsbF9maXhwYXRoX3ByZWZpeGVzIQorICBlbHNlCisgICAgIyBOb3QgaW4gbWl4ZWQgb3IgV2luZG93cyBzdHlsZSwgc3RhcnQgYnkgdGhhdC4KKyAgICBuZXdfcGF0aD1gY21kIC8vYyBlY2hvICRuZXdfcGF0aGAKKworICBpbnB1dF9wYXRoPSIkbmV3X3BhdGgiCisgICMgQ2hlY2sgaWYgd2UgbmVlZCB0byBjb252ZXJ0IHRoaXMgdXNpbmcgRE9TLXN0eWxlIHNob3J0IG1vZGUuIElmIHRoZSBwYXRoCisgICMgY29udGFpbnMganVzdCBzaW1wbGUgY2hhcmFjdGVycywgdXNlIGl0LiBPdGhlcndpc2UgKHNwYWNlcywgd2VpcmQgY2hhcmFjdGVycyksCisgICMgdGFrZSBubyBjaGFuY2VzIGFuZCByZXdyaXRlIGl0LgorICAjIE5vdGU6IG00IGVhdHMgb3VyIFtdLCBzbyB3ZSBuZWVkIHRvIHVzZSBbIGFuZCBdIGluc3RlYWQuCisgIGhhc19mb3JiaWRkZW5fY2hhcnM9YCRFQ0hPICIkaW5wdXRfcGF0aCIgfCAkR1JFUCBbXi1fLzphLXpBLVowLTldYAorICBpZiB0ZXN0ICJ4JGhhc19mb3JiaWRkZW5fY2hhcnMiICE9IHg7IHRoZW4KKyAgICAjIE5vdyBjb252ZXJ0IGl0IHRvIG1peGVkIERPUy1zdHlsZSwgc2hvcnQgbW9kZSAobm8gc3BhY2VzLCBhbmQgLyBpbnN0ZWFkIG9mIFwpCisgICAgbmV3X3BhdGg9YGNtZCAvYyAiZm9yICVBIGluIChcIiRpbnB1dF9wYXRoXCIpIGRvIEBlY2hvICV+c0EifCRUUiBcXFxcXFxcXCAvIHwgJFRSICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J2AKKyAgZmkKKworICAgICMgT3V0cHV0IGlzIGluICRuZXdfcGF0aAorCisgIHdpbmRvd3NfcGF0aD0iJG5ld19wYXRoIgorICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5jeWd3aW4iOyB0aGVuCisgICAgdW5peF9wYXRoPWAkQ1lHUEFUSCAtdSAiJHdpbmRvd3NfcGF0aCJgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGVsaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MubXN5cyI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRFQ0hPICIkd2luZG93c19wYXRoIiB8ICRTRUQgLWUgJ3MsXlxcKC5cXCk6LC9cXDEsZycgLWUgJ3MsXFxcXCwvLGcnYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBmaQorCisgICAgIyByZW1vdmUgdHJhaWxpbmcgLmV4ZSBpZiBhbnkKKyAgICBuZXdfcGF0aD0iJHtuZXdfcGF0aC8lLmV4ZS99IgorCisgICAgIyBTYXZlIHRoZSBmaXJzdCAxMCBieXRlcyBvZiB0aGlzIHBhdGggdG8gdGhlIHN0b3JhZ2UsIHNvIGZpeHBhdGggY2FuIHdvcmsuCisgICAgYWxsX2ZpeHBhdGhfcHJlZml4ZXM9KCIke2FsbF9maXhwYXRoX3ByZWZpeGVzW0BdfSIgIiR7bmV3X3BhdGg6MDoxMH0iKQorICBmaQorCisgIGVsc2UKKyAgICAjIFdlJ3JlIG9uIGEgcG9zaXggcGxhdGZvcm0uIEhvb3JheSEgOikKKyAgICAjIEZpcnN0IHNlcGFyYXRlIHRoZSBwYXRoIGZyb20gdGhlIGFyZ3VtZW50cy4gVGhpcyB3aWxsIHNwbGl0IGF0IHRoZSBmaXJzdAorICAgICMgc3BhY2UuCisgICAgY29tcGxldGU9IiRNQ1MiCisgICAgcGF0aD0iJHtjb21wbGV0ZSUlICp9IgorICAgIHRtcD0iJGNvbXBsZXRlIEVPTCIKKyAgICBhcmd1bWVudHM9IiR7dG1wIyogfSIKKworICAgIG5ld19wYXRoPWAkV0hJQ0ggJHBhdGggMj4gL2Rldi9udWxsYAorICAgIGlmIHRlc3QgIngkbmV3X3BhdGgiID0geDsgdGhlbgorICAgICAgaXNfYWJzb2x1dGVfcGF0aD1gJEVDSE8gIiRwYXRoIiB8ICRHUkVQIF4vYAorICAgICAgaWYgdGVzdCAieCRpc19hYnNvbHV0ZV9wYXRoIiAhPSB4OyB0aGVuCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogUmVzb2x2aW5nIE1DUyAoYXMgJHBhdGgpIHdpdGggJ3doaWNoJyBmYWlsZWQsIHVzaW5nICRwYXRoIGRpcmVjdGx5LiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBSZXNvbHZpbmcgTUNTIChhcyAkcGF0aCkgd2l0aCAnd2hpY2gnIGZhaWxlZCwgdXNpbmcgJHBhdGggZGlyZWN0bHkuIiA+JjY7fQorICAgICAgICBuZXdfcGF0aD0iJHBhdGgiCisgICAgICBlbHNlCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGhlIHBhdGggb2YgTUNTLCB3aGljaCByZXNvbHZlcyBhcyBcIiRjb21wbGV0ZVwiLCBpcyBub3QgZm91bmQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoZSBwYXRoIG9mIE1DUywgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkY29tcGxldGVcIiwgaXMgbm90IGZvdW5kLiIgPiY2O30KKyAgICAgICAgaGFzX3NwYWNlPWAkRUNITyAiJGNvbXBsZXRlIiB8ICRHUkVQICIgImAKKyAgICAgICAgaWYgdGVzdCAieCRoYXNfc3BhY2UiICE9IHg7IHRoZW4KKyAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoaXMgbWlnaHQgYmUgY2F1c2VkIGJ5IHNwYWNlcyBpbiB0aGUgcGF0aCwgd2hpY2ggaXMgbm90IGFsbG93ZWQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoaXMgbWlnaHQgYmUgY2F1c2VkIGJ5IHNwYWNlcyBpbiB0aGUgcGF0aCwgd2hpY2ggaXMgbm90IGFsbG93ZWQuIiA+JjY7fQogICAgICAgICBmaQotICAgICAgICAjIENvbnZlcnQgdG8gQzovIG1peGVkIHN0eWxlIHBhdGggd2l0aG91dCBzcGFjZXMuCi0gICAgICAgICB0bXA9YCRDWUdQQVRIIC1zIC1tICIkdG1wImAKKyAgICAgICAgYXNfZm5fZXJyb3IgJD8gIkNhbm5vdCBsb2NhdGUgdGhlIHRoZSBwYXRoIG9mIE1DUyIgIiRMSU5FTk8iIDUKKyAgICAgIGZpCiAgICAgZmkKLSAgICBjYXI9IiR0bXAiCisgIGZpCiAKLSAgICBlbHNlCi0gICAgICAgICMgIndoaWNoIiBpcyBub3QgcG9ydGFibGUsIGJ1dCBpcyB1c2VkIGhlcmUKLSAgICAgICAgIyBiZWNhdXNlIHdlIGtub3cgdGhhdCB0aGUgY29tbWFuZCBleGlzdHMhCi0gICAgICAgIGNhcj1gd2hpY2ggJGNhcmAKLSAgICBmaQotICAgIGlmIHRlc3QgIngkY2RyIiAhPSB4RU9MOyB0aGVuCi0gICAgICAgIE1DUz0iJGNhciAke2NkciUgKn0iCi0gICAgZWxzZQotICAgICAgICBNQ1M9IiRjYXIiCi0gICAgZmkKKyAgIyBOb3cgam9pbiB0b2dldGhlciB0aGUgcGF0aCBhbmQgdGhlIGFyZ3VtZW50cyBvbmNlIGFnYWluCisgIGlmIHRlc3QgIngkYXJndW1lbnRzIiAhPSB4RU9MOyB0aGVuCisgICAgICBuZXdfY29tcGxldGU9IiRuZXdfcGF0aCAke2FyZ3VtZW50cyUgKn0iCisgIGVsc2UKKyAgICAgIG5ld19jb21wbGV0ZT0iJG5ld19wYXRoIgorICBmaQogCi1lbGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PUyIgIT0geHdpbmRvd3M7IHRoZW4KKyAgaWYgdGVzdCAieCRjb21wbGV0ZSIgIT0gIngkbmV3X2NvbXBsZXRlIjsgdGhlbgorICAgIE1DUz0iJG5ld19jb21wbGV0ZSIKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFJld3JpdGluZyBNQ1MgdG8gXCIkbmV3X2NvbXBsZXRlXCIiID4mNQorJGFzX2VjaG8gIiRhc19tZTogUmV3cml0aW5nIE1DUyB0byBcIiRuZXdfY29tcGxldGVcIiIgPiY2O30KKyAgZmkKKworZWxpZiB0ZXN0ICJ4JE9QRU5KREtfVEFSR0VUX09TIiAhPSB4d2luZG93czsgdGhlbgogICAgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fW5tIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KIHNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fW5tOyBhY193b3JkPSQyCkBAIC0xMzc5Nyw0NyArMjQ1MDksMjQ1IEBACiBmaQogCiAKLSAgICAjIFRyYW5zbGF0ZSAiZ2NjIC1FIiBpbnRvICJgd2hpY2ggZ2NjYCAtRSIgaWUKLSAgICAjIGV4dHJhY3QgdGhlIGZ1bGwgcGF0aCB0byB0aGUgYmluYXJ5IGFuZCBhdCB0aGUKLSAgICAjIHNhbWUgdGltZSBtYWludGFpbiBhbnkgYXJndW1lbnRzIHBhc3NlZCB0byBpdC4KLSAgICAjIFRoZSBjb21tYW5kIE1VU1QgZXhpc3QgaW4gdGhlIHBhdGgsIG9yIGVsc2UhCi0gICAgdG1wPSIkTk0iCi0gICAgY2FyPSIke3RtcCUlICp9IgotICAgIHRtcD0iJE5NIEVPTCIKLSAgICBjZHI9IiR7dG1wIyogfSIKLSAgICAjIE9uIHdpbmRvd3Mgd2Ugd2FudCBwYXRocyB3aXRob3V0IHNwYWNlcy4KLSAgICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1MiID0gInh3aW5kb3dzIjsgdGhlbgorICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5jeWd3aW4iOyB0aGVuCiAKLSAgICAjIFRyYW5zbGF0ZSBsb25nIGN5Z2RyaXZlIG9yIEM6XHNkZnNmIHBhdGgKLSAgICAjIGludG8gYSBzaG9ydCBtaXhlZCBtb2RlIHBhdGggdGhhdCBoYXMgbm8KLSAgICAjIHNwYWNlcyBpbiBpdC4KLSAgICB0bXA9IiRjYXIiCisgICMgRmlyc3Qgc2VwYXJhdGUgdGhlIHBhdGggZnJvbSB0aGUgYXJndW1lbnRzLiBUaGlzIHdpbGwgc3BsaXQgYXQgdGhlIGZpcnN0CisgICMgc3BhY2UuCisgIGNvbXBsZXRlPSIkTk0iCisgIHBhdGg9IiR7Y29tcGxldGUlJSAqfSIKKyAgdG1wPSIkY29tcGxldGUgRU9MIgorICBhcmd1bWVudHM9IiR7dG1wIyogfSIKIAotICAgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PUyIgPSAieHdpbmRvd3MiOyB0aGVuCi0gICAgICAgIHRtcD1gJENZR1BBVEggLXUgIiRjYXIiYAotICAgICAgICB0bXA9YHdoaWNoICIkdG1wImAKLSAgICAgICAgIyBJZiBmaWxlIGV4aXN0cyB3aXRoIC5leGUgYXBwZW5kZWQsIHRoYXQncyB0aGUgcmVhbCBmaWxlbmFtZQotICAgICAgICAjIGFuZCBjeWdwYXRoIG5lZWRzIHRoYXQgdG8gY29udmVydCB0byBzaG9ydCBzdHlsZSBwYXRoLgotICAgICAgICBpZiB0ZXN0IC1mICIke3RtcH0uZXhlIjsgdGhlbgotICAgICAgICAgICB0bXA9IiR7dG1wfS5leGUiCi0gICAgICAgIGVsaWYgdGVzdCAtZiAiJHt0bXB9LmNtZCI7IHRoZW4KLSAgICAgICAgICAgdG1wPSIke3RtcH0uY21kIgorICAjIElucHV0IG1pZ2h0IGJlIGdpdmVuIGFzIFdpbmRvd3MgZm9ybWF0LCBzdGFydCBieSBjb252ZXJ0aW5nIHRvCisgICMgdW5peCBmb3JtYXQuCisgIG5ld19wYXRoPWAkQ1lHUEFUSCAtdSAiJHBhdGgiYAorCisgICMgTm93IHRyeSB0byBsb2NhdGUgZXhlY3V0YWJsZSB1c2luZyB3aGljaAorICBuZXdfcGF0aD1gJFdISUNIICIkbmV3X3BhdGgiIDI+IC9kZXYvbnVsbGAKKyAgaWYgdGVzdCAieCRuZXdfcGF0aCIgPSB4OyB0aGVuCisgICAgIyBPb3BzLiBXaGljaCBkaWRuJ3QgZmluZCB0aGUgZXhlY3V0YWJsZS4KKyAgICAjIFRoZSBzcGxpdHRpbmcgb2YgYXJndW1lbnRzIGZyb20gdGhlIGV4ZWN1dGFibGUgYXQgYSBzcGFjZSBtaWdodCBoYXZlIGJlZW4gaW5jb3JyZWN0LAorICAgICMgc2luY2UgcGF0aHMgd2l0aCBzcGFjZSBhcmUgbW9yZSBsaWtlbHkgaW4gV2luZG93cy4gR2l2ZSBpdCBhbm90aGVyIHRyeSB3aXRoIHRoZSB3aG9sZQorICAgICMgYXJndW1lbnQuCisgICAgcGF0aD0iJGNvbXBsZXRlIgorICAgIGFyZ3VtZW50cz0iRU9MIgorICAgIG5ld19wYXRoPWAkQ1lHUEFUSCAtdSAiJHBhdGgiYAorICAgIG5ld19wYXRoPWAkV0hJQ0ggIiRuZXdfcGF0aCIgMj4gL2Rldi9udWxsYAorICAgIGlmIHRlc3QgIngkbmV3X3BhdGgiID0geDsgdGhlbgorICAgICAgIyBJdCdzIHN0aWxsIG5vdCBmb3VuZC4gTm93IHRoaXMgaXMgYW4gdW5yZWNvdmVyYWJsZSBlcnJvci4KKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGhlIHBhdGggb2YgTk0sIHdoaWNoIHJlc29sdmVzIGFzIFwiJGNvbXBsZXRlXCIsIGlzIG5vdCBmb3VuZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhlIHBhdGggb2YgTk0sIHdoaWNoIHJlc29sdmVzIGFzIFwiJGNvbXBsZXRlXCIsIGlzIG5vdCBmb3VuZC4iID4mNjt9CisgICAgICBoYXNfc3BhY2U9YCRFQ0hPICIkY29tcGxldGUiIHwgJEdSRVAgIiAiYAorICAgICAgaWYgdGVzdCAieCRoYXNfc3BhY2UiICE9IHg7IHRoZW4KKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBZb3UgbWlnaHQgYmUgbWl4aW5nIHNwYWNlcyBpbiB0aGUgcGF0aCBhbmQgZXh0cmEgYXJndW1lbnRzLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogWW91IG1pZ2h0IGJlIG1peGluZyBzcGFjZXMgaW4gdGhlIHBhdGggYW5kIGV4dHJhIGFyZ3VtZW50cywgd2hpY2ggaXMgbm90IGFsbG93ZWQuIiA+JjY7fQorICAgICAgZmkKKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJDYW5ub3QgbG9jYXRlIHRoZSB0aGUgcGF0aCBvZiBOTSIgIiRMSU5FTk8iIDUKKyAgICBmaQorICBmaQorCisgICMgQ3lnd2luIHRyaWVzIHRvIGhpZGUgc29tZSBhc3BlY3RzIG9mIHRoZSBXaW5kb3dzIGZpbGUgc3lzdGVtLCBzdWNoIHRoYXQgYmluYXJpZXMgYXJlCisgICMgbmFtZWQgLmV4ZSBidXQgY2FsbGVkIHdpdGhvdXQgdGhhdCBzdWZmaXguIFRoZXJlZm9yZSwgImZvbyIgYW5kICJmb28uZXhlIiBhcmUgY29uc2lkZXJlZAorICAjIHRoZSBzYW1lIGZpbGUsIG1vc3Qgb2YgdGhlIHRpbWUgKGFzIGluICJ0ZXN0IC1mIikuIEJ1dCBub3Qgd2hlbiBydW5uaW5nIGN5Z3BhdGggLXMsIHRoZW4KKyAgIyAiZm9vLmV4ZSIgaXMgT0sgYnV0ICJmb28iIGlzIGFuIGVycm9yLgorICAjCisgICMgVGhpcyB0ZXN0IGlzIHRoZXJlZm9yZSBzbGlnaHRseSBtb3JlIGFjY3VyYXRlIHRoYW4gInRlc3QgLWYiIHRvIGNoZWNrIGZvciBmaWxlIHByZWNlbnNlLgorICAjIEl0IGlzIGFsc28gYSB3YXkgdG8gbWFrZSBzdXJlIHdlIGdvdCB0aGUgcHJvcGVyIGZpbGUgbmFtZSBmb3IgdGhlIHJlYWwgdGVzdCBsYXRlciBvbi4KKyAgdGVzdF9zaG9ydHBhdGg9YCRDWUdQQVRIIC1zIC1tICIkbmV3X3BhdGgiIDI+IC9kZXYvbnVsbGAKKyAgaWYgdGVzdCAieCR0ZXN0X3Nob3J0cGF0aCIgPSB4OyB0aGVuCisgICAgIyBTaG9ydCBwYXRoIGZhaWxlZCwgZmlsZSBkb2VzIG5vdCBleGlzdCBhcyBzcGVjaWZpZWQuCisgICAgIyBUcnkgYWRkaW5nIC5leGUgb3IgLmNtZAorICAgIGlmIHRlc3QgLWYgIiR7bmV3X3BhdGh9LmV4ZSI7IHRoZW4KKyAgICAgICBpbnB1dF90b19zaG9ydHBhdGg9IiR7bmV3X3BhdGh9LmV4ZSIKKyAgICBlbGlmIHRlc3QgLWYgIiR7bmV3X3BhdGh9LmNtZCI7IHRoZW4KKyAgICAgICBpbnB1dF90b19zaG9ydHBhdGg9IiR7bmV3X3BhdGh9LmNtZCIKKyAgICBlbHNlCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSBwYXRoIG9mIE5NLCB3aGljaCByZXNvbHZlcyBhcyBcIiRuZXdfcGF0aFwiLCBpcyBpbnZhbGlkLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUaGUgcGF0aCBvZiBOTSwgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkbmV3X3BhdGhcIiwgaXMgaW52YWxpZC4iID4mNjt9CisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IE5laXRoZXIgXCIkbmV3X3BhdGhcIiBub3IgXCIkbmV3X3BhdGguZXhlL2NtZFwiIGNhbiBiZSBmb3VuZCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBOZWl0aGVyIFwiJG5ld19wYXRoXCIgbm9yIFwiJG5ld19wYXRoLmV4ZS9jbWRcIiBjYW4gYmUgZm91bmQiID4mNjt9CisgICAgICBhc19mbl9lcnJvciAkPyAiQ2Fubm90IGxvY2F0ZSB0aGUgdGhlIHBhdGggb2YgTk0iICIkTElORU5PIiA1CisgICAgZmkKKyAgZWxzZQorICAgIGlucHV0X3RvX3Nob3J0cGF0aD0iJG5ld19wYXRoIgorICBmaQorCisgICMgQ2FsbCBoZWxwZXIgZnVuY3Rpb24gd2hpY2ggcG9zc2libHkgY29udmVydHMgdGhpcyB1c2luZyBET1Mtc3R5bGUgc2hvcnQgbW9kZS4KKyAgIyBJZiBzbywgdGhlIHVwZGF0ZWQgcGF0aCBpcyBzdG9yZWQgaW4gJG5ld19wYXRoLgorICBuZXdfcGF0aD0iJGlucHV0X3RvX3Nob3J0cGF0aCIKKworICBpbnB1dF9wYXRoPSIkaW5wdXRfdG9fc2hvcnRwYXRoIgorICAjIENoZWNrIGlmIHdlIG5lZWQgdG8gY29udmVydCB0aGlzIHVzaW5nIERPUy1zdHlsZSBzaG9ydCBtb2RlLiBJZiB0aGUgcGF0aAorICAjIGNvbnRhaW5zIGp1c3Qgc2ltcGxlIGNoYXJhY3RlcnMsIHVzZSBpdC4gT3RoZXJ3aXNlIChzcGFjZXMsIHdlaXJkIGNoYXJhY3RlcnMpLAorICAjIHRha2Ugbm8gY2hhbmNlcyBhbmQgcmV3cml0ZSBpdC4KKyAgIyBOb3RlOiBtNCBlYXRzIG91ciBbXSwgc28gd2UgbmVlZCB0byB1c2UgWyBhbmQgXSBpbnN0ZWFkLgorICBoYXNfZm9yYmlkZGVuX2NoYXJzPWAkRUNITyAiJGlucHV0X3BhdGgiIHwgJEdSRVAgW14tLl8vYS16QS1aMC05XWAKKyAgaWYgdGVzdCAieCRoYXNfZm9yYmlkZGVuX2NoYXJzIiAhPSB4OyB0aGVuCisgICAgIyBOb3cgY29udmVydCBpdCB0byBtaXhlZCBET1Mtc3R5bGUsIHNob3J0IG1vZGUgKG5vIHNwYWNlcywgYW5kIC8gaW5zdGVhZCBvZiBcKQorICAgIHNob3J0bW9kZV9wYXRoPWAkQ1lHUEFUSCAtcyAtbSAtYSAiJGlucHV0X3BhdGgiYAorICAgIHBhdGhfYWZ0ZXJfc2hvcnRtb2RlPWAkQ1lHUEFUSCAtdSAiJHNob3J0bW9kZV9wYXRoImAKKyAgICBpZiB0ZXN0ICJ4JHBhdGhfYWZ0ZXJfc2hvcnRtb2RlIiAhPSAieCRpbnB1dF90b19zaG9ydHBhdGgiOyB0aGVuCisgICAgICAjIEdvaW5nIHRvIHNob3J0IG1vZGUgYW5kIGJhY2sgYWdhaW4gZGlkIGluZGVlZCBtYXR0ZXIuIFNpbmNlIHNob3J0IG1vZGUgaXMKKyAgICAgICMgY2FzZSBpbnNlbnNpdGl2ZSwgbGV0J3MgbWFrZSBpdCBsb3dlcmNhc2UgdG8gaW1wcm92ZSByZWFkYWJpbGl0eS4KKyAgICAgIHNob3J0bW9kZV9wYXRoPWAkRUNITyAiJHNob3J0bW9kZV9wYXRoIiB8ICRUUiAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidgCisgICAgICAjIE5vdyBjb252ZXJ0IGl0IGJhY2sgdG8gVW5peC1zdGlsZSAoY3lncGF0aCkKKyAgICAgIGlucHV0X3BhdGg9YCRDWUdQQVRIIC11ICIkc2hvcnRtb2RlX3BhdGgiYAorICAgICAgbmV3X3BhdGg9IiRpbnB1dF9wYXRoIgorICAgIGZpCisgIGZpCisKKyAgdGVzdF9jeWdkcml2ZV9wcmVmaXg9YCRFQ0hPICRpbnB1dF9wYXRoIHwgJEdSRVAgXi9jeWdkcml2ZS9gCisgIGlmIHRlc3QgIngkdGVzdF9jeWdkcml2ZV9wcmVmaXgiID0geDsgdGhlbgorICAgICMgQXMgYSBzaW1wbGUgZml4LCBleGNsdWRlIC91c3IvYmluIHNpbmNlIGl0J3Mgbm90IGEgcmVhbCBwYXRoLgorICAgIGlmIHRlc3QgInhgJEVDSE8gJGlucHV0X3RvX3Nob3J0cGF0aCB8ICRHUkVQIF4vdXNyL2Jpbi9gIiA9IHg7IHRoZW4KKyAgICAgICMgVGhlIHBhdGggaXMgaW4gYSBDeWd3aW4gc3BlY2lhbCBkaXJlY3RvcnkgKGUuZy4gL2hvbWUpLiBXZSBuZWVkIHRoaXMgY29udmVydGVkIHRvCisgICAgICAjIGEgcGF0aCBwcmVmaXhlZCBieSAvY3lnZHJpdmUgZm9yIGZpeHBhdGggdG8gd29yay4KKyAgICAgIG5ld19wYXRoPSIkQ1lHV0lOX1JPT1RfUEFUSCRpbnB1dF9wYXRoIgorICAgIGZpCisgIGZpCisKKyAgIyByZW1vdmUgdHJhaWxpbmcgLmV4ZSBpZiBhbnkKKyAgbmV3X3BhdGg9IiR7bmV3X3BhdGgvJS5leGUvfSIKKworICBlbGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLm1zeXMiOyB0aGVuCisKKyAgIyBGaXJzdCBzZXBhcmF0ZSB0aGUgcGF0aCBmcm9tIHRoZSBhcmd1bWVudHMuIFRoaXMgd2lsbCBzcGxpdCBhdCB0aGUgZmlyc3QKKyAgIyBzcGFjZS4KKyAgY29tcGxldGU9IiROTSIKKyAgcGF0aD0iJHtjb21wbGV0ZSUlICp9IgorICB0bXA9IiRjb21wbGV0ZSBFT0wiCisgIGFyZ3VtZW50cz0iJHt0bXAjKiB9IgorCisgICMgSW5wdXQgbWlnaHQgYmUgZ2l2ZW4gYXMgV2luZG93cyBmb3JtYXQsIHN0YXJ0IGJ5IGNvbnZlcnRpbmcgdG8KKyAgIyB1bml4IGZvcm1hdC4KKyAgbmV3X3BhdGg9IiRwYXRoIgorCisgIHdpbmRvd3NfcGF0aD0iJG5ld19wYXRoIgorICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5jeWd3aW4iOyB0aGVuCisgICAgdW5peF9wYXRoPWAkQ1lHUEFUSCAtdSAiJHdpbmRvd3NfcGF0aCJgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGVsaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MubXN5cyI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRFQ0hPICIkd2luZG93c19wYXRoIiB8ICRTRUQgLWUgJ3MsXlxcKC5cXCk6LC9cXDEsZycgLWUgJ3MsXFxcXCwvLGcnYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBmaQorCisKKyAgIyBOb3cgdHJ5IHRvIGxvY2F0ZSBleGVjdXRhYmxlIHVzaW5nIHdoaWNoCisgIG5ld19wYXRoPWAkV0hJQ0ggIiRuZXdfcGF0aCIgMj4gL2Rldi9udWxsYAorCisgIGlmIHRlc3QgIngkbmV3X3BhdGgiID0geDsgdGhlbgorICAgICMgT29wcy4gV2hpY2ggZGlkbid0IGZpbmQgdGhlIGV4ZWN1dGFibGUuCisgICAgIyBUaGUgc3BsaXR0aW5nIG9mIGFyZ3VtZW50cyBmcm9tIHRoZSBleGVjdXRhYmxlIGF0IGEgc3BhY2UgbWlnaHQgaGF2ZSBiZWVuIGluY29ycmVjdCwKKyAgICAjIHNpbmNlIHBhdGhzIHdpdGggc3BhY2UgYXJlIG1vcmUgbGlrZWx5IGluIFdpbmRvd3MuIEdpdmUgaXQgYW5vdGhlciB0cnkgd2l0aCB0aGUgd2hvbGUKKyAgICAjIGFyZ3VtZW50LgorICAgIHBhdGg9IiRjb21wbGV0ZSIKKyAgICBhcmd1bWVudHM9IkVPTCIKKyAgICBuZXdfcGF0aD0iJHBhdGgiCisKKyAgd2luZG93c19wYXRoPSIkbmV3X3BhdGgiCisgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLmN5Z3dpbiI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRDWUdQQVRIIC11ICIkd2luZG93c19wYXRoImAKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJEVDSE8gIiR3aW5kb3dzX3BhdGgiIHwgJFNFRCAtZSAncyxeXFwoLlxcKTosL1xcMSxnJyAtZSAncyxcXFxcLC8sZydgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGZpCisKKworICAgIG5ld19wYXRoPWAkV0hJQ0ggIiRuZXdfcGF0aCIgMj4gL2Rldi9udWxsYAorCisgICAgaWYgdGVzdCAieCRuZXdfcGF0aCIgPSB4OyB0aGVuCisgICAgICAjIEl0J3Mgc3RpbGwgbm90IGZvdW5kLiBOb3cgdGhpcyBpcyBhbiB1bnJlY292ZXJhYmxlIGVycm9yLgorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUaGUgcGF0aCBvZiBOTSwgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkY29tcGxldGVcIiwgaXMgbm90IGZvdW5kLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUaGUgcGF0aCBvZiBOTSwgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkY29tcGxldGVcIiwgaXMgbm90IGZvdW5kLiIgPiY2O30KKyAgICAgIGhhc19zcGFjZT1gJEVDSE8gIiRjb21wbGV0ZSIgfCAkR1JFUCAiICJgCisgICAgICBpZiB0ZXN0ICJ4JGhhc19zcGFjZSIgIT0geDsgdGhlbgorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFlvdSBtaWdodCBiZSBtaXhpbmcgc3BhY2VzIGluIHRoZSBwYXRoIGFuZCBleHRyYSBhcmd1bWVudHMsIHdoaWNoIGlzIG5vdCBhbGxvd2VkLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBZb3UgbWlnaHQgYmUgbWl4aW5nIHNwYWNlcyBpbiB0aGUgcGF0aCBhbmQgZXh0cmEgYXJndW1lbnRzLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iID4mNjt9CisgICAgICBmaQorICAgICAgYXNfZm5fZXJyb3IgJD8gIkNhbm5vdCBsb2NhdGUgdGhlIHRoZSBwYXRoIG9mIE5NIiAiJExJTkVOTyIgNQorICAgIGZpCisgIGZpCisKKyAgIyBOb3cgbmV3X3BhdGggaGFzIGEgY29tcGxldGUgdW5peCBwYXRoIHRvIHRoZSBiaW5hcnkKKyAgaWYgdGVzdCAieGAkRUNITyAkbmV3X3BhdGggfCAkR1JFUCBeL2Jpbi9gIiAhPSB4OyB0aGVuCisgICAgIyBLZWVwIHBhdGhzIGluIC9iaW4gYXMtaXMsIGJ1dCByZW1vdmUgdHJhaWxpbmcgLmV4ZSBpZiBhbnkKKyAgICBuZXdfcGF0aD0iJHtuZXdfcGF0aC8lLmV4ZS99IgorICAgICMgRG8gbm90IHNhdmUgL2JpbiBwYXRocyB0byBhbGxfZml4cGF0aF9wcmVmaXhlcyEKKyAgZWxzZQorICAgICMgTm90IGluIG1peGVkIG9yIFdpbmRvd3Mgc3R5bGUsIHN0YXJ0IGJ5IHRoYXQuCisgICAgbmV3X3BhdGg9YGNtZCAvL2MgZWNobyAkbmV3X3BhdGhgCisKKyAgaW5wdXRfcGF0aD0iJG5ld19wYXRoIgorICAjIENoZWNrIGlmIHdlIG5lZWQgdG8gY29udmVydCB0aGlzIHVzaW5nIERPUy1zdHlsZSBzaG9ydCBtb2RlLiBJZiB0aGUgcGF0aAorICAjIGNvbnRhaW5zIGp1c3Qgc2ltcGxlIGNoYXJhY3RlcnMsIHVzZSBpdC4gT3RoZXJ3aXNlIChzcGFjZXMsIHdlaXJkIGNoYXJhY3RlcnMpLAorICAjIHRha2Ugbm8gY2hhbmNlcyBhbmQgcmV3cml0ZSBpdC4KKyAgIyBOb3RlOiBtNCBlYXRzIG91ciBbXSwgc28gd2UgbmVlZCB0byB1c2UgWyBhbmQgXSBpbnN0ZWFkLgorICBoYXNfZm9yYmlkZGVuX2NoYXJzPWAkRUNITyAiJGlucHV0X3BhdGgiIHwgJEdSRVAgW14tXy86YS16QS1aMC05XWAKKyAgaWYgdGVzdCAieCRoYXNfZm9yYmlkZGVuX2NoYXJzIiAhPSB4OyB0aGVuCisgICAgIyBOb3cgY29udmVydCBpdCB0byBtaXhlZCBET1Mtc3R5bGUsIHNob3J0IG1vZGUgKG5vIHNwYWNlcywgYW5kIC8gaW5zdGVhZCBvZiBcKQorICAgIG5ld19wYXRoPWBjbWQgL2MgImZvciAlQSBpbiAoXCIkaW5wdXRfcGF0aFwiKSBkbyBAZWNobyAlfnNBInwkVFIgXFxcXFxcXFwgLyB8ICRUUiAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidgCisgIGZpCisKKyAgICAjIE91dHB1dCBpcyBpbiAkbmV3X3BhdGgKKworICB3aW5kb3dzX3BhdGg9IiRuZXdfcGF0aCIKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJENZR1BBVEggLXUgIiR3aW5kb3dzX3BhdGgiYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBlbGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLm1zeXMiOyB0aGVuCisgICAgdW5peF9wYXRoPWAkRUNITyAiJHdpbmRvd3NfcGF0aCIgfCAkU0VEIC1lICdzLF5cXCguXFwpOiwvXFwxLGcnIC1lICdzLFxcXFwsLyxnJ2AKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZmkKKworICAgICMgcmVtb3ZlIHRyYWlsaW5nIC5leGUgaWYgYW55CisgICAgbmV3X3BhdGg9IiR7bmV3X3BhdGgvJS5leGUvfSIKKworICAgICMgU2F2ZSB0aGUgZmlyc3QgMTAgYnl0ZXMgb2YgdGhpcyBwYXRoIHRvIHRoZSBzdG9yYWdlLCBzbyBmaXhwYXRoIGNhbiB3b3JrLgorICAgIGFsbF9maXhwYXRoX3ByZWZpeGVzPSgiJHthbGxfZml4cGF0aF9wcmVmaXhlc1tAXX0iICIke25ld19wYXRoOjA6MTB9IikKKyAgZmkKKworICBlbHNlCisgICAgIyBXZSdyZSBvbiBhIHBvc2l4IHBsYXRmb3JtLiBIb29yYXkhIDopCisgICAgIyBGaXJzdCBzZXBhcmF0ZSB0aGUgcGF0aCBmcm9tIHRoZSBhcmd1bWVudHMuIFRoaXMgd2lsbCBzcGxpdCBhdCB0aGUgZmlyc3QKKyAgICAjIHNwYWNlLgorICAgIGNvbXBsZXRlPSIkTk0iCisgICAgcGF0aD0iJHtjb21wbGV0ZSUlICp9IgorICAgIHRtcD0iJGNvbXBsZXRlIEVPTCIKKyAgICBhcmd1bWVudHM9IiR7dG1wIyogfSIKKworICAgIG5ld19wYXRoPWAkV0hJQ0ggJHBhdGggMj4gL2Rldi9udWxsYAorICAgIGlmIHRlc3QgIngkbmV3X3BhdGgiID0geDsgdGhlbgorICAgICAgaXNfYWJzb2x1dGVfcGF0aD1gJEVDSE8gIiRwYXRoIiB8ICRHUkVQIF4vYAorICAgICAgaWYgdGVzdCAieCRpc19hYnNvbHV0ZV9wYXRoIiAhPSB4OyB0aGVuCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogUmVzb2x2aW5nIE5NIChhcyAkcGF0aCkgd2l0aCAnd2hpY2gnIGZhaWxlZCwgdXNpbmcgJHBhdGggZGlyZWN0bHkuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFJlc29sdmluZyBOTSAoYXMgJHBhdGgpIHdpdGggJ3doaWNoJyBmYWlsZWQsIHVzaW5nICRwYXRoIGRpcmVjdGx5LiIgPiY2O30KKyAgICAgICAgbmV3X3BhdGg9IiRwYXRoIgorICAgICAgZWxzZQorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSBwYXRoIG9mIE5NLCB3aGljaCByZXNvbHZlcyBhcyBcIiRjb21wbGV0ZVwiLCBpcyBub3QgZm91bmQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoZSBwYXRoIG9mIE5NLCB3aGljaCByZXNvbHZlcyBhcyBcIiRjb21wbGV0ZVwiLCBpcyBub3QgZm91bmQuIiA+JjY7fQorICAgICAgICBoYXNfc3BhY2U9YCRFQ0hPICIkY29tcGxldGUiIHwgJEdSRVAgIiAiYAorICAgICAgICBpZiB0ZXN0ICJ4JGhhc19zcGFjZSIgIT0geDsgdGhlbgorICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGhpcyBtaWdodCBiZSBjYXVzZWQgYnkgc3BhY2VzIGluIHRoZSBwYXRoLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhpcyBtaWdodCBiZSBjYXVzZWQgYnkgc3BhY2VzIGluIHRoZSBwYXRoLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iID4mNjt9CiAgICAgICAgIGZpCi0gICAgICAgICMgQ29udmVydCB0byBDOi8gbWl4ZWQgc3R5bGUgcGF0aCB3aXRob3V0IHNwYWNlcy4KLSAgICAgICAgIHRtcD1gJENZR1BBVEggLXMgLW0gIiR0bXAiYAorICAgICAgICBhc19mbl9lcnJvciAkPyAiQ2Fubm90IGxvY2F0ZSB0aGUgdGhlIHBhdGggb2YgTk0iICIkTElORU5PIiA1CisgICAgICBmaQogICAgIGZpCi0gICAgY2FyPSIkdG1wIgorICBmaQogCi0gICAgZWxzZQotICAgICAgICAjICJ3aGljaCIgaXMgbm90IHBvcnRhYmxlLCBidXQgaXMgdXNlZCBoZXJlCi0gICAgICAgICMgYmVjYXVzZSB3ZSBrbm93IHRoYXQgdGhlIGNvbW1hbmQgZXhpc3RzIQotICAgICAgICBjYXI9YHdoaWNoICRjYXJgCi0gICAgZmkKLSAgICBpZiB0ZXN0ICJ4JGNkciIgIT0geEVPTDsgdGhlbgotICAgICAgICBOTT0iJGNhciAke2NkciUgKn0iCi0gICAgZWxzZQotICAgICAgICBOTT0iJGNhciIKLSAgICBmaQorICAjIE5vdyBqb2luIHRvZ2V0aGVyIHRoZSBwYXRoIGFuZCB0aGUgYXJndW1lbnRzIG9uY2UgYWdhaW4KKyAgaWYgdGVzdCAieCRhcmd1bWVudHMiICE9IHhFT0w7IHRoZW4KKyAgICAgIG5ld19jb21wbGV0ZT0iJG5ld19wYXRoICR7YXJndW1lbnRzJSAqfSIKKyAgZWxzZQorICAgICAgbmV3X2NvbXBsZXRlPSIkbmV3X3BhdGgiCisgIGZpCisKKyAgaWYgdGVzdCAieCRjb21wbGV0ZSIgIT0gIngkbmV3X2NvbXBsZXRlIjsgdGhlbgorICAgIE5NPSIkbmV3X2NvbXBsZXRlIgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogUmV3cml0aW5nIE5NIHRvIFwiJG5ld19jb21wbGV0ZVwiIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFJld3JpdGluZyBOTSB0byBcIiRuZXdfY29tcGxldGVcIiIgPiY2O30KKyAgZmkKIAogICAgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fXN0cmlwIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KQEAgLTEzOTMyLDc4ICsyNDg0Miw2MTUgQEAKIGZpCiAKIAotICAgICMgVHJhbnNsYXRlICJnY2MgLUUiIGludG8gImB3aGljaCBnY2NgIC1FIiBpZQotICAgICMgZXh0cmFjdCB0aGUgZnVsbCBwYXRoIHRvIHRoZSBiaW5hcnkgYW5kIGF0IHRoZQotICAgICMgc2FtZSB0aW1lIG1haW50YWluIGFueSBhcmd1bWVudHMgcGFzc2VkIHRvIGl0LgotICAgICMgVGhlIGNvbW1hbmQgTVVTVCBleGlzdCBpbiB0aGUgcGF0aCwgb3IgZWxzZSEKLSAgICB0bXA9IiRTVFJJUCIKLSAgICBjYXI9IiR7dG1wJSUgKn0iCi0gICAgdG1wPSIkU1RSSVAgRU9MIgotICAgIGNkcj0iJHt0bXAjKiB9IgotICAgICMgT24gd2luZG93cyB3ZSB3YW50IHBhdGhzIHdpdGhvdXQgc3BhY2VzLgotICAgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PUyIgPSAieHdpbmRvd3MiOyB0aGVuCisgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLmN5Z3dpbiI7IHRoZW4KIAotICAgICMgVHJhbnNsYXRlIGxvbmcgY3lnZHJpdmUgb3IgQzpcc2Rmc2YgcGF0aAotICAgICMgaW50byBhIHNob3J0IG1peGVkIG1vZGUgcGF0aCB0aGF0IGhhcyBubwotICAgICMgc3BhY2VzIGluIGl0LgotICAgIHRtcD0iJGNhciIKKyAgIyBGaXJzdCBzZXBhcmF0ZSB0aGUgcGF0aCBmcm9tIHRoZSBhcmd1bWVudHMuIFRoaXMgd2lsbCBzcGxpdCBhdCB0aGUgZmlyc3QKKyAgIyBzcGFjZS4KKyAgY29tcGxldGU9IiRTVFJJUCIKKyAgcGF0aD0iJHtjb21wbGV0ZSUlICp9IgorICB0bXA9IiRjb21wbGV0ZSBFT0wiCisgIGFyZ3VtZW50cz0iJHt0bXAjKiB9IgogCi0gICAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TIiA9ICJ4d2luZG93cyI7IHRoZW4KLSAgICAgICAgdG1wPWAkQ1lHUEFUSCAtdSAiJGNhciJgCi0gICAgICAgIHRtcD1gd2hpY2ggIiR0bXAiYAotICAgICAgICAjIElmIGZpbGUgZXhpc3RzIHdpdGggLmV4ZSBhcHBlbmRlZCwgdGhhdCdzIHRoZSByZWFsIGZpbGVuYW1lCi0gICAgICAgICMgYW5kIGN5Z3BhdGggbmVlZHMgdGhhdCB0byBjb252ZXJ0IHRvIHNob3J0IHN0eWxlIHBhdGguCi0gICAgICAgIGlmIHRlc3QgLWYgIiR7dG1wfS5leGUiOyB0aGVuCi0gICAgICAgICAgIHRtcD0iJHt0bXB9LmV4ZSIKLSAgICAgICAgZWxpZiB0ZXN0IC1mICIke3RtcH0uY21kIjsgdGhlbgotICAgICAgICAgICB0bXA9IiR7dG1wfS5jbWQiCisgICMgSW5wdXQgbWlnaHQgYmUgZ2l2ZW4gYXMgV2luZG93cyBmb3JtYXQsIHN0YXJ0IGJ5IGNvbnZlcnRpbmcgdG8KKyAgIyB1bml4IGZvcm1hdC4KKyAgbmV3X3BhdGg9YCRDWUdQQVRIIC11ICIkcGF0aCJgCisKKyAgIyBOb3cgdHJ5IHRvIGxvY2F0ZSBleGVjdXRhYmxlIHVzaW5nIHdoaWNoCisgIG5ld19wYXRoPWAkV0hJQ0ggIiRuZXdfcGF0aCIgMj4gL2Rldi9udWxsYAorICBpZiB0ZXN0ICJ4JG5ld19wYXRoIiA9IHg7IHRoZW4KKyAgICAjIE9vcHMuIFdoaWNoIGRpZG4ndCBmaW5kIHRoZSBleGVjdXRhYmxlLgorICAgICMgVGhlIHNwbGl0dGluZyBvZiBhcmd1bWVudHMgZnJvbSB0aGUgZXhlY3V0YWJsZSBhdCBhIHNwYWNlIG1pZ2h0IGhhdmUgYmVlbiBpbmNvcnJlY3QsCisgICAgIyBzaW5jZSBwYXRocyB3aXRoIHNwYWNlIGFyZSBtb3JlIGxpa2VseSBpbiBXaW5kb3dzLiBHaXZlIGl0IGFub3RoZXIgdHJ5IHdpdGggdGhlIHdob2xlCisgICAgIyBhcmd1bWVudC4KKyAgICBwYXRoPSIkY29tcGxldGUiCisgICAgYXJndW1lbnRzPSJFT0wiCisgICAgbmV3X3BhdGg9YCRDWUdQQVRIIC11ICIkcGF0aCJgCisgICAgbmV3X3BhdGg9YCRXSElDSCAiJG5ld19wYXRoIiAyPiAvZGV2L251bGxgCisgICAgaWYgdGVzdCAieCRuZXdfcGF0aCIgPSB4OyB0aGVuCisgICAgICAjIEl0J3Mgc3RpbGwgbm90IGZvdW5kLiBOb3cgdGhpcyBpcyBhbiB1bnJlY292ZXJhYmxlIGVycm9yLgorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUaGUgcGF0aCBvZiBTVFJJUCwgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkY29tcGxldGVcIiwgaXMgbm90IGZvdW5kLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUaGUgcGF0aCBvZiBTVFJJUCwgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkY29tcGxldGVcIiwgaXMgbm90IGZvdW5kLiIgPiY2O30KKyAgICAgIGhhc19zcGFjZT1gJEVDSE8gIiRjb21wbGV0ZSIgfCAkR1JFUCAiICJgCisgICAgICBpZiB0ZXN0ICJ4JGhhc19zcGFjZSIgIT0geDsgdGhlbgorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFlvdSBtaWdodCBiZSBtaXhpbmcgc3BhY2VzIGluIHRoZSBwYXRoIGFuZCBleHRyYSBhcmd1bWVudHMsIHdoaWNoIGlzIG5vdCBhbGxvd2VkLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBZb3UgbWlnaHQgYmUgbWl4aW5nIHNwYWNlcyBpbiB0aGUgcGF0aCBhbmQgZXh0cmEgYXJndW1lbnRzLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iID4mNjt9CisgICAgICBmaQorICAgICAgYXNfZm5fZXJyb3IgJD8gIkNhbm5vdCBsb2NhdGUgdGhlIHRoZSBwYXRoIG9mIFNUUklQIiAiJExJTkVOTyIgNQorICAgIGZpCisgIGZpCisKKyAgIyBDeWd3aW4gdHJpZXMgdG8gaGlkZSBzb21lIGFzcGVjdHMgb2YgdGhlIFdpbmRvd3MgZmlsZSBzeXN0ZW0sIHN1Y2ggdGhhdCBiaW5hcmllcyBhcmUKKyAgIyBuYW1lZCAuZXhlIGJ1dCBjYWxsZWQgd2l0aG91dCB0aGF0IHN1ZmZpeC4gVGhlcmVmb3JlLCAiZm9vIiBhbmQgImZvby5leGUiIGFyZSBjb25zaWRlcmVkCisgICMgdGhlIHNhbWUgZmlsZSwgbW9zdCBvZiB0aGUgdGltZSAoYXMgaW4gInRlc3QgLWYiKS4gQnV0IG5vdCB3aGVuIHJ1bm5pbmcgY3lncGF0aCAtcywgdGhlbgorICAjICJmb28uZXhlIiBpcyBPSyBidXQgImZvbyIgaXMgYW4gZXJyb3IuCisgICMKKyAgIyBUaGlzIHRlc3QgaXMgdGhlcmVmb3JlIHNsaWdodGx5IG1vcmUgYWNjdXJhdGUgdGhhbiAidGVzdCAtZiIgdG8gY2hlY2sgZm9yIGZpbGUgcHJlY2Vuc2UuCisgICMgSXQgaXMgYWxzbyBhIHdheSB0byBtYWtlIHN1cmUgd2UgZ290IHRoZSBwcm9wZXIgZmlsZSBuYW1lIGZvciB0aGUgcmVhbCB0ZXN0IGxhdGVyIG9uLgorICB0ZXN0X3Nob3J0cGF0aD1gJENZR1BBVEggLXMgLW0gIiRuZXdfcGF0aCIgMj4gL2Rldi9udWxsYAorICBpZiB0ZXN0ICJ4JHRlc3Rfc2hvcnRwYXRoIiA9IHg7IHRoZW4KKyAgICAjIFNob3J0IHBhdGggZmFpbGVkLCBmaWxlIGRvZXMgbm90IGV4aXN0IGFzIHNwZWNpZmllZC4KKyAgICAjIFRyeSBhZGRpbmcgLmV4ZSBvciAuY21kCisgICAgaWYgdGVzdCAtZiAiJHtuZXdfcGF0aH0uZXhlIjsgdGhlbgorICAgICAgIGlucHV0X3RvX3Nob3J0cGF0aD0iJHtuZXdfcGF0aH0uZXhlIgorICAgIGVsaWYgdGVzdCAtZiAiJHtuZXdfcGF0aH0uY21kIjsgdGhlbgorICAgICAgIGlucHV0X3RvX3Nob3J0cGF0aD0iJHtuZXdfcGF0aH0uY21kIgorICAgIGVsc2UKKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGhlIHBhdGggb2YgU1RSSVAsIHdoaWNoIHJlc29sdmVzIGFzIFwiJG5ld19wYXRoXCIsIGlzIGludmFsaWQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoZSBwYXRoIG9mIFNUUklQLCB3aGljaCByZXNvbHZlcyBhcyBcIiRuZXdfcGF0aFwiLCBpcyBpbnZhbGlkLiIgPiY2O30KKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogTmVpdGhlciBcIiRuZXdfcGF0aFwiIG5vciBcIiRuZXdfcGF0aC5leGUvY21kXCIgY2FuIGJlIGZvdW5kIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IE5laXRoZXIgXCIkbmV3X3BhdGhcIiBub3IgXCIkbmV3X3BhdGguZXhlL2NtZFwiIGNhbiBiZSBmb3VuZCIgPiY2O30KKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJDYW5ub3QgbG9jYXRlIHRoZSB0aGUgcGF0aCBvZiBTVFJJUCIgIiRMSU5FTk8iIDUKKyAgICBmaQorICBlbHNlCisgICAgaW5wdXRfdG9fc2hvcnRwYXRoPSIkbmV3X3BhdGgiCisgIGZpCisKKyAgIyBDYWxsIGhlbHBlciBmdW5jdGlvbiB3aGljaCBwb3NzaWJseSBjb252ZXJ0cyB0aGlzIHVzaW5nIERPUy1zdHlsZSBzaG9ydCBtb2RlLgorICAjIElmIHNvLCB0aGUgdXBkYXRlZCBwYXRoIGlzIHN0b3JlZCBpbiAkbmV3X3BhdGguCisgIG5ld19wYXRoPSIkaW5wdXRfdG9fc2hvcnRwYXRoIgorCisgIGlucHV0X3BhdGg9IiRpbnB1dF90b19zaG9ydHBhdGgiCisgICMgQ2hlY2sgaWYgd2UgbmVlZCB0byBjb252ZXJ0IHRoaXMgdXNpbmcgRE9TLXN0eWxlIHNob3J0IG1vZGUuIElmIHRoZSBwYXRoCisgICMgY29udGFpbnMganVzdCBzaW1wbGUgY2hhcmFjdGVycywgdXNlIGl0LiBPdGhlcndpc2UgKHNwYWNlcywgd2VpcmQgY2hhcmFjdGVycyksCisgICMgdGFrZSBubyBjaGFuY2VzIGFuZCByZXdyaXRlIGl0LgorICAjIE5vdGU6IG00IGVhdHMgb3VyIFtdLCBzbyB3ZSBuZWVkIHRvIHVzZSBbIGFuZCBdIGluc3RlYWQuCisgIGhhc19mb3JiaWRkZW5fY2hhcnM9YCRFQ0hPICIkaW5wdXRfcGF0aCIgfCAkR1JFUCBbXi0uXy9hLXpBLVowLTldYAorICBpZiB0ZXN0ICJ4JGhhc19mb3JiaWRkZW5fY2hhcnMiICE9IHg7IHRoZW4KKyAgICAjIE5vdyBjb252ZXJ0IGl0IHRvIG1peGVkIERPUy1zdHlsZSwgc2hvcnQgbW9kZSAobm8gc3BhY2VzLCBhbmQgLyBpbnN0ZWFkIG9mIFwpCisgICAgc2hvcnRtb2RlX3BhdGg9YCRDWUdQQVRIIC1zIC1tIC1hICIkaW5wdXRfcGF0aCJgCisgICAgcGF0aF9hZnRlcl9zaG9ydG1vZGU9YCRDWUdQQVRIIC11ICIkc2hvcnRtb2RlX3BhdGgiYAorICAgIGlmIHRlc3QgIngkcGF0aF9hZnRlcl9zaG9ydG1vZGUiICE9ICJ4JGlucHV0X3RvX3Nob3J0cGF0aCI7IHRoZW4KKyAgICAgICMgR29pbmcgdG8gc2hvcnQgbW9kZSBhbmQgYmFjayBhZ2FpbiBkaWQgaW5kZWVkIG1hdHRlci4gU2luY2Ugc2hvcnQgbW9kZSBpcworICAgICAgIyBjYXNlIGluc2Vuc2l0aXZlLCBsZXQncyBtYWtlIGl0IGxvd2VyY2FzZSB0byBpbXByb3ZlIHJlYWRhYmlsaXR5LgorICAgICAgc2hvcnRtb2RlX3BhdGg9YCRFQ0hPICIkc2hvcnRtb2RlX3BhdGgiIHwgJFRSICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J2AKKyAgICAgICMgTm93IGNvbnZlcnQgaXQgYmFjayB0byBVbml4LXN0aWxlIChjeWdwYXRoKQorICAgICAgaW5wdXRfcGF0aD1gJENZR1BBVEggLXUgIiRzaG9ydG1vZGVfcGF0aCJgCisgICAgICBuZXdfcGF0aD0iJGlucHV0X3BhdGgiCisgICAgZmkKKyAgZmkKKworICB0ZXN0X2N5Z2RyaXZlX3ByZWZpeD1gJEVDSE8gJGlucHV0X3BhdGggfCAkR1JFUCBeL2N5Z2RyaXZlL2AKKyAgaWYgdGVzdCAieCR0ZXN0X2N5Z2RyaXZlX3ByZWZpeCIgPSB4OyB0aGVuCisgICAgIyBBcyBhIHNpbXBsZSBmaXgsIGV4Y2x1ZGUgL3Vzci9iaW4gc2luY2UgaXQncyBub3QgYSByZWFsIHBhdGguCisgICAgaWYgdGVzdCAieGAkRUNITyAkaW5wdXRfdG9fc2hvcnRwYXRoIHwgJEdSRVAgXi91c3IvYmluL2AiID0geDsgdGhlbgorICAgICAgIyBUaGUgcGF0aCBpcyBpbiBhIEN5Z3dpbiBzcGVjaWFsIGRpcmVjdG9yeSAoZS5nLiAvaG9tZSkuIFdlIG5lZWQgdGhpcyBjb252ZXJ0ZWQgdG8KKyAgICAgICMgYSBwYXRoIHByZWZpeGVkIGJ5IC9jeWdkcml2ZSBmb3IgZml4cGF0aCB0byB3b3JrLgorICAgICAgbmV3X3BhdGg9IiRDWUdXSU5fUk9PVF9QQVRIJGlucHV0X3BhdGgiCisgICAgZmkKKyAgZmkKKworICAjIHJlbW92ZSB0cmFpbGluZyAuZXhlIGlmIGFueQorICBuZXdfcGF0aD0iJHtuZXdfcGF0aC8lLmV4ZS99IgorCisgIGVsaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MubXN5cyI7IHRoZW4KKworICAjIEZpcnN0IHNlcGFyYXRlIHRoZSBwYXRoIGZyb20gdGhlIGFyZ3VtZW50cy4gVGhpcyB3aWxsIHNwbGl0IGF0IHRoZSBmaXJzdAorICAjIHNwYWNlLgorICBjb21wbGV0ZT0iJFNUUklQIgorICBwYXRoPSIke2NvbXBsZXRlJSUgKn0iCisgIHRtcD0iJGNvbXBsZXRlIEVPTCIKKyAgYXJndW1lbnRzPSIke3RtcCMqIH0iCisKKyAgIyBJbnB1dCBtaWdodCBiZSBnaXZlbiBhcyBXaW5kb3dzIGZvcm1hdCwgc3RhcnQgYnkgY29udmVydGluZyB0bworICAjIHVuaXggZm9ybWF0LgorICBuZXdfcGF0aD0iJHBhdGgiCisKKyAgd2luZG93c19wYXRoPSIkbmV3X3BhdGgiCisgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLmN5Z3dpbiI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRDWUdQQVRIIC11ICIkd2luZG93c19wYXRoImAKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJEVDSE8gIiR3aW5kb3dzX3BhdGgiIHwgJFNFRCAtZSAncyxeXFwoLlxcKTosL1xcMSxnJyAtZSAncyxcXFxcLC8sZydgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGZpCisKKworICAjIE5vdyB0cnkgdG8gbG9jYXRlIGV4ZWN1dGFibGUgdXNpbmcgd2hpY2gKKyAgbmV3X3BhdGg9YCRXSElDSCAiJG5ld19wYXRoIiAyPiAvZGV2L251bGxgCisKKyAgaWYgdGVzdCAieCRuZXdfcGF0aCIgPSB4OyB0aGVuCisgICAgIyBPb3BzLiBXaGljaCBkaWRuJ3QgZmluZCB0aGUgZXhlY3V0YWJsZS4KKyAgICAjIFRoZSBzcGxpdHRpbmcgb2YgYXJndW1lbnRzIGZyb20gdGhlIGV4ZWN1dGFibGUgYXQgYSBzcGFjZSBtaWdodCBoYXZlIGJlZW4gaW5jb3JyZWN0LAorICAgICMgc2luY2UgcGF0aHMgd2l0aCBzcGFjZSBhcmUgbW9yZSBsaWtlbHkgaW4gV2luZG93cy4gR2l2ZSBpdCBhbm90aGVyIHRyeSB3aXRoIHRoZSB3aG9sZQorICAgICMgYXJndW1lbnQuCisgICAgcGF0aD0iJGNvbXBsZXRlIgorICAgIGFyZ3VtZW50cz0iRU9MIgorICAgIG5ld19wYXRoPSIkcGF0aCIKKworICB3aW5kb3dzX3BhdGg9IiRuZXdfcGF0aCIKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJENZR1BBVEggLXUgIiR3aW5kb3dzX3BhdGgiYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBlbGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLm1zeXMiOyB0aGVuCisgICAgdW5peF9wYXRoPWAkRUNITyAiJHdpbmRvd3NfcGF0aCIgfCAkU0VEIC1lICdzLF5cXCguXFwpOiwvXFwxLGcnIC1lICdzLFxcXFwsLyxnJ2AKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZmkKKworCisgICAgbmV3X3BhdGg9YCRXSElDSCAiJG5ld19wYXRoIiAyPiAvZGV2L251bGxgCisKKyAgICBpZiB0ZXN0ICJ4JG5ld19wYXRoIiA9IHg7IHRoZW4KKyAgICAgICMgSXQncyBzdGlsbCBub3QgZm91bmQuIE5vdyB0aGlzIGlzIGFuIHVucmVjb3ZlcmFibGUgZXJyb3IuCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSBwYXRoIG9mIFNUUklQLCB3aGljaCByZXNvbHZlcyBhcyBcIiRjb21wbGV0ZVwiLCBpcyBub3QgZm91bmQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoZSBwYXRoIG9mIFNUUklQLCB3aGljaCByZXNvbHZlcyBhcyBcIiRjb21wbGV0ZVwiLCBpcyBub3QgZm91bmQuIiA+JjY7fQorICAgICAgaGFzX3NwYWNlPWAkRUNITyAiJGNvbXBsZXRlIiB8ICRHUkVQICIgImAKKyAgICAgIGlmIHRlc3QgIngkaGFzX3NwYWNlIiAhPSB4OyB0aGVuCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogWW91IG1pZ2h0IGJlIG1peGluZyBzcGFjZXMgaW4gdGhlIHBhdGggYW5kIGV4dHJhIGFyZ3VtZW50cywgd2hpY2ggaXMgbm90IGFsbG93ZWQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFlvdSBtaWdodCBiZSBtaXhpbmcgc3BhY2VzIGluIHRoZSBwYXRoIGFuZCBleHRyYSBhcmd1bWVudHMsIHdoaWNoIGlzIG5vdCBhbGxvd2VkLiIgPiY2O30KKyAgICAgIGZpCisgICAgICBhc19mbl9lcnJvciAkPyAiQ2Fubm90IGxvY2F0ZSB0aGUgdGhlIHBhdGggb2YgU1RSSVAiICIkTElORU5PIiA1CisgICAgZmkKKyAgZmkKKworICAjIE5vdyBuZXdfcGF0aCBoYXMgYSBjb21wbGV0ZSB1bml4IHBhdGggdG8gdGhlIGJpbmFyeQorICBpZiB0ZXN0ICJ4YCRFQ0hPICRuZXdfcGF0aCB8ICRHUkVQIF4vYmluL2AiICE9IHg7IHRoZW4KKyAgICAjIEtlZXAgcGF0aHMgaW4gL2JpbiBhcy1pcywgYnV0IHJlbW92ZSB0cmFpbGluZyAuZXhlIGlmIGFueQorICAgIG5ld19wYXRoPSIke25ld19wYXRoLyUuZXhlL30iCisgICAgIyBEbyBub3Qgc2F2ZSAvYmluIHBhdGhzIHRvIGFsbF9maXhwYXRoX3ByZWZpeGVzIQorICBlbHNlCisgICAgIyBOb3QgaW4gbWl4ZWQgb3IgV2luZG93cyBzdHlsZSwgc3RhcnQgYnkgdGhhdC4KKyAgICBuZXdfcGF0aD1gY21kIC8vYyBlY2hvICRuZXdfcGF0aGAKKworICBpbnB1dF9wYXRoPSIkbmV3X3BhdGgiCisgICMgQ2hlY2sgaWYgd2UgbmVlZCB0byBjb252ZXJ0IHRoaXMgdXNpbmcgRE9TLXN0eWxlIHNob3J0IG1vZGUuIElmIHRoZSBwYXRoCisgICMgY29udGFpbnMganVzdCBzaW1wbGUgY2hhcmFjdGVycywgdXNlIGl0LiBPdGhlcndpc2UgKHNwYWNlcywgd2VpcmQgY2hhcmFjdGVycyksCisgICMgdGFrZSBubyBjaGFuY2VzIGFuZCByZXdyaXRlIGl0LgorICAjIE5vdGU6IG00IGVhdHMgb3VyIFtdLCBzbyB3ZSBuZWVkIHRvIHVzZSBbIGFuZCBdIGluc3RlYWQuCisgIGhhc19mb3JiaWRkZW5fY2hhcnM9YCRFQ0hPICIkaW5wdXRfcGF0aCIgfCAkR1JFUCBbXi1fLzphLXpBLVowLTldYAorICBpZiB0ZXN0ICJ4JGhhc19mb3JiaWRkZW5fY2hhcnMiICE9IHg7IHRoZW4KKyAgICAjIE5vdyBjb252ZXJ0IGl0IHRvIG1peGVkIERPUy1zdHlsZSwgc2hvcnQgbW9kZSAobm8gc3BhY2VzLCBhbmQgLyBpbnN0ZWFkIG9mIFwpCisgICAgbmV3X3BhdGg9YGNtZCAvYyAiZm9yICVBIGluIChcIiRpbnB1dF9wYXRoXCIpIGRvIEBlY2hvICV+c0EifCRUUiBcXFxcXFxcXCAvIHwgJFRSICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J2AKKyAgZmkKKworICAgICMgT3V0cHV0IGlzIGluICRuZXdfcGF0aAorCisgIHdpbmRvd3NfcGF0aD0iJG5ld19wYXRoIgorICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5jeWd3aW4iOyB0aGVuCisgICAgdW5peF9wYXRoPWAkQ1lHUEFUSCAtdSAiJHdpbmRvd3NfcGF0aCJgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGVsaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MubXN5cyI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRFQ0hPICIkd2luZG93c19wYXRoIiB8ICRTRUQgLWUgJ3MsXlxcKC5cXCk6LC9cXDEsZycgLWUgJ3MsXFxcXCwvLGcnYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBmaQorCisgICAgIyByZW1vdmUgdHJhaWxpbmcgLmV4ZSBpZiBhbnkKKyAgICBuZXdfcGF0aD0iJHtuZXdfcGF0aC8lLmV4ZS99IgorCisgICAgIyBTYXZlIHRoZSBmaXJzdCAxMCBieXRlcyBvZiB0aGlzIHBhdGggdG8gdGhlIHN0b3JhZ2UsIHNvIGZpeHBhdGggY2FuIHdvcmsuCisgICAgYWxsX2ZpeHBhdGhfcHJlZml4ZXM9KCIke2FsbF9maXhwYXRoX3ByZWZpeGVzW0BdfSIgIiR7bmV3X3BhdGg6MDoxMH0iKQorICBmaQorCisgIGVsc2UKKyAgICAjIFdlJ3JlIG9uIGEgcG9zaXggcGxhdGZvcm0uIEhvb3JheSEgOikKKyAgICAjIEZpcnN0IHNlcGFyYXRlIHRoZSBwYXRoIGZyb20gdGhlIGFyZ3VtZW50cy4gVGhpcyB3aWxsIHNwbGl0IGF0IHRoZSBmaXJzdAorICAgICMgc3BhY2UuCisgICAgY29tcGxldGU9IiRTVFJJUCIKKyAgICBwYXRoPSIke2NvbXBsZXRlJSUgKn0iCisgICAgdG1wPSIkY29tcGxldGUgRU9MIgorICAgIGFyZ3VtZW50cz0iJHt0bXAjKiB9IgorCisgICAgbmV3X3BhdGg9YCRXSElDSCAkcGF0aCAyPiAvZGV2L251bGxgCisgICAgaWYgdGVzdCAieCRuZXdfcGF0aCIgPSB4OyB0aGVuCisgICAgICBpc19hYnNvbHV0ZV9wYXRoPWAkRUNITyAiJHBhdGgiIHwgJEdSRVAgXi9gCisgICAgICBpZiB0ZXN0ICJ4JGlzX2Fic29sdXRlX3BhdGgiICE9IHg7IHRoZW4KKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBSZXNvbHZpbmcgU1RSSVAgKGFzICRwYXRoKSB3aXRoICd3aGljaCcgZmFpbGVkLCB1c2luZyAkcGF0aCBkaXJlY3RseS4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogUmVzb2x2aW5nIFNUUklQIChhcyAkcGF0aCkgd2l0aCAnd2hpY2gnIGZhaWxlZCwgdXNpbmcgJHBhdGggZGlyZWN0bHkuIiA+JjY7fQorICAgICAgICBuZXdfcGF0aD0iJHBhdGgiCisgICAgICBlbHNlCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGhlIHBhdGggb2YgU1RSSVAsIHdoaWNoIHJlc29sdmVzIGFzIFwiJGNvbXBsZXRlXCIsIGlzIG5vdCBmb3VuZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhlIHBhdGggb2YgU1RSSVAsIHdoaWNoIHJlc29sdmVzIGFzIFwiJGNvbXBsZXRlXCIsIGlzIG5vdCBmb3VuZC4iID4mNjt9CisgICAgICAgIGhhc19zcGFjZT1gJEVDSE8gIiRjb21wbGV0ZSIgfCAkR1JFUCAiICJgCisgICAgICAgIGlmIHRlc3QgIngkaGFzX3NwYWNlIiAhPSB4OyB0aGVuCisgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUaGlzIG1pZ2h0IGJlIGNhdXNlZCBieSBzcGFjZXMgaW4gdGhlIHBhdGgsIHdoaWNoIGlzIG5vdCBhbGxvd2VkLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUaGlzIG1pZ2h0IGJlIGNhdXNlZCBieSBzcGFjZXMgaW4gdGhlIHBhdGgsIHdoaWNoIGlzIG5vdCBhbGxvd2VkLiIgPiY2O30KICAgICAgICAgZmkKLSAgICAgICAgIyBDb252ZXJ0IHRvIEM6LyBtaXhlZCBzdHlsZSBwYXRoIHdpdGhvdXQgc3BhY2VzLgotICAgICAgICAgdG1wPWAkQ1lHUEFUSCAtcyAtbSAiJHRtcCJgCisgICAgICAgIGFzX2ZuX2Vycm9yICQ/ICJDYW5ub3QgbG9jYXRlIHRoZSB0aGUgcGF0aCBvZiBTVFJJUCIgIiRMSU5FTk8iIDUKKyAgICAgIGZpCiAgICAgZmkKLSAgICBjYXI9IiR0bXAiCisgIGZpCiAKLSAgICBlbHNlCi0gICAgICAgICMgIndoaWNoIiBpcyBub3QgcG9ydGFibGUsIGJ1dCBpcyB1c2VkIGhlcmUKLSAgICAgICAgIyBiZWNhdXNlIHdlIGtub3cgdGhhdCB0aGUgY29tbWFuZCBleGlzdHMhCi0gICAgICAgIGNhcj1gd2hpY2ggJGNhcmAKLSAgICBmaQotICAgIGlmIHRlc3QgIngkY2RyIiAhPSB4RU9MOyB0aGVuCi0gICAgICAgIFNUUklQPSIkY2FyICR7Y2RyJSAqfSIKLSAgICBlbHNlCi0gICAgICAgIFNUUklQPSIkY2FyIgotICAgIGZpCisgICMgTm93IGpvaW4gdG9nZXRoZXIgdGhlIHBhdGggYW5kIHRoZSBhcmd1bWVudHMgb25jZSBhZ2FpbgorICBpZiB0ZXN0ICJ4JGFyZ3VtZW50cyIgIT0geEVPTDsgdGhlbgorICAgICAgbmV3X2NvbXBsZXRlPSIkbmV3X3BhdGggJHthcmd1bWVudHMlICp9IgorICBlbHNlCisgICAgICBuZXdfY29tcGxldGU9IiRuZXdfcGF0aCIKKyAgZmkKKworICBpZiB0ZXN0ICJ4JGNvbXBsZXRlIiAhPSAieCRuZXdfY29tcGxldGUiOyB0aGVuCisgICAgU1RSSVA9IiRuZXdfY29tcGxldGUiCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBSZXdyaXRpbmcgU1RSSVAgdG8gXCIkbmV3X2NvbXBsZXRlXCIiID4mNQorJGFzX2VjaG8gIiRhc19tZTogUmV3cml0aW5nIFNUUklQIHRvIFwiJG5ld19jb21wbGV0ZVwiIiA+JjY7fQorICBmaQogCiBmaQogCi0jIyMKLSMKLSMgQ2hlY2sgZm9yIG9iamNvcHkKLSMKLSMgICBidXQgc2VhcmNoIGZvciBnb2JqY29weSBmaXJzdC4uLgotIyAgIHNpbmNlIEkgb24gc29sYXJpcyBmb3VuZCBhIGJyb2tlbiBvYmpjb3B5Li4uYnVoaAotIworIyBvYmpjb3B5IGlzIHVzZWQgZm9yIG1vdmluZyBkZWJ1ZyBzeW1ib2xzIHRvIHNlcGFyYXRlIGZpbGVzIHdoZW4KKyMgZnVsbCBkZWJ1ZyBzeW1ib2xzIGFyZSBlbmFibGVkLgoraWYgdGVzdCAieCRPUEVOSkRLX1RBUkdFVF9PUyIgPSB4c29sYXJpcyB8fCB0ZXN0ICJ4JE9QRU5KREtfVEFSR0VUX09TIiA9IHhsaW51eDsgdGhlbgorICAgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgZm9yIGFjX3Byb2cgaW4gZ29iamNvcHkgb2JqY29weQorICBkbworICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICRhY190b29sX3ByZWZpeCRhY19wcm9nOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19PQkpDT1BZK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJE9CSkNPUFkiOyB0aGVuCisgIGFjX2N2X3Byb2dfT0JKQ09QWT0iJE9CSkNPUFkiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19PQkpDT1BZPSIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitPQkpDT1BZPSRhY19jdl9wcm9nX09CSkNPUFkKK2lmIHRlc3QgLW4gIiRPQkpDT1BZIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJE9CSkNPUFkiID4mNQorJGFzX2VjaG8gIiRPQkpDT1BZIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKyAgICB0ZXN0IC1uICIkT0JKQ09QWSIgJiYgYnJlYWsKKyAgZG9uZQorZmkKK2lmIHRlc3QgLXogIiRPQkpDT1BZIjsgdGhlbgorICBhY19jdF9PQkpDT1BZPSRPQkpDT1BZCisgIGZvciBhY19wcm9nIGluIGdvYmpjb3B5IG9iamNvcHkKK2RvCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9PQkpDT1BZK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJGFjX2N0X09CSkNPUFkiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfT0JKQ09QWT0iJGFjX2N0X09CSkNPUFkiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19hY19jdF9PQkpDT1BZPSIkYWNfcHJvZyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCithY19jdF9PQkpDT1BZPSRhY19jdl9wcm9nX2FjX2N0X09CSkNPUFkKK2lmIHRlc3QgLW4gIiRhY19jdF9PQkpDT1BZIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X09CSkNPUFkiID4mNQorJGFzX2VjaG8gIiRhY19jdF9PQkpDT1BZIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKyAgdGVzdCAtbiAiJGFjX2N0X09CSkNPUFkiICYmIGJyZWFrCitkb25lCisKKyAgaWYgdGVzdCAieCRhY19jdF9PQkpDT1BZIiA9IHg7IHRoZW4KKyAgICBPQkpDT1BZPSIiCisgIGVsc2UKKyAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCit5ZXM6KQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQorYWNfdG9vbF93YXJuZWQ9eWVzIDs7Citlc2FjCisgICAgT0JKQ09QWT0kYWNfY3RfT0JKQ09QWQorICBmaQorZmkKKworCisgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLmN5Z3dpbiI7IHRoZW4KKworICAjIEZpcnN0IHNlcGFyYXRlIHRoZSBwYXRoIGZyb20gdGhlIGFyZ3VtZW50cy4gVGhpcyB3aWxsIHNwbGl0IGF0IHRoZSBmaXJzdAorICAjIHNwYWNlLgorICBjb21wbGV0ZT0iJE9CSkNPUFkiCisgIHBhdGg9IiR7Y29tcGxldGUlJSAqfSIKKyAgdG1wPSIkY29tcGxldGUgRU9MIgorICBhcmd1bWVudHM9IiR7dG1wIyogfSIKKworICAjIElucHV0IG1pZ2h0IGJlIGdpdmVuIGFzIFdpbmRvd3MgZm9ybWF0LCBzdGFydCBieSBjb252ZXJ0aW5nIHRvCisgICMgdW5peCBmb3JtYXQuCisgIG5ld19wYXRoPWAkQ1lHUEFUSCAtdSAiJHBhdGgiYAorCisgICMgTm93IHRyeSB0byBsb2NhdGUgZXhlY3V0YWJsZSB1c2luZyB3aGljaAorICBuZXdfcGF0aD1gJFdISUNIICIkbmV3X3BhdGgiIDI+IC9kZXYvbnVsbGAKKyAgaWYgdGVzdCAieCRuZXdfcGF0aCIgPSB4OyB0aGVuCisgICAgIyBPb3BzLiBXaGljaCBkaWRuJ3QgZmluZCB0aGUgZXhlY3V0YWJsZS4KKyAgICAjIFRoZSBzcGxpdHRpbmcgb2YgYXJndW1lbnRzIGZyb20gdGhlIGV4ZWN1dGFibGUgYXQgYSBzcGFjZSBtaWdodCBoYXZlIGJlZW4gaW5jb3JyZWN0LAorICAgICMgc2luY2UgcGF0aHMgd2l0aCBzcGFjZSBhcmUgbW9yZSBsaWtlbHkgaW4gV2luZG93cy4gR2l2ZSBpdCBhbm90aGVyIHRyeSB3aXRoIHRoZSB3aG9sZQorICAgICMgYXJndW1lbnQuCisgICAgcGF0aD0iJGNvbXBsZXRlIgorICAgIGFyZ3VtZW50cz0iRU9MIgorICAgIG5ld19wYXRoPWAkQ1lHUEFUSCAtdSAiJHBhdGgiYAorICAgIG5ld19wYXRoPWAkV0hJQ0ggIiRuZXdfcGF0aCIgMj4gL2Rldi9udWxsYAorICAgIGlmIHRlc3QgIngkbmV3X3BhdGgiID0geDsgdGhlbgorICAgICAgIyBJdCdzIHN0aWxsIG5vdCBmb3VuZC4gTm93IHRoaXMgaXMgYW4gdW5yZWNvdmVyYWJsZSBlcnJvci4KKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGhlIHBhdGggb2YgT0JKQ09QWSwgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkY29tcGxldGVcIiwgaXMgbm90IGZvdW5kLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUaGUgcGF0aCBvZiBPQkpDT1BZLCB3aGljaCByZXNvbHZlcyBhcyBcIiRjb21wbGV0ZVwiLCBpcyBub3QgZm91bmQuIiA+JjY7fQorICAgICAgaGFzX3NwYWNlPWAkRUNITyAiJGNvbXBsZXRlIiB8ICRHUkVQICIgImAKKyAgICAgIGlmIHRlc3QgIngkaGFzX3NwYWNlIiAhPSB4OyB0aGVuCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogWW91IG1pZ2h0IGJlIG1peGluZyBzcGFjZXMgaW4gdGhlIHBhdGggYW5kIGV4dHJhIGFyZ3VtZW50cywgd2hpY2ggaXMgbm90IGFsbG93ZWQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFlvdSBtaWdodCBiZSBtaXhpbmcgc3BhY2VzIGluIHRoZSBwYXRoIGFuZCBleHRyYSBhcmd1bWVudHMsIHdoaWNoIGlzIG5vdCBhbGxvd2VkLiIgPiY2O30KKyAgICAgIGZpCisgICAgICBhc19mbl9lcnJvciAkPyAiQ2Fubm90IGxvY2F0ZSB0aGUgdGhlIHBhdGggb2YgT0JKQ09QWSIgIiRMSU5FTk8iIDUKKyAgICBmaQorICBmaQorCisgICMgQ3lnd2luIHRyaWVzIHRvIGhpZGUgc29tZSBhc3BlY3RzIG9mIHRoZSBXaW5kb3dzIGZpbGUgc3lzdGVtLCBzdWNoIHRoYXQgYmluYXJpZXMgYXJlCisgICMgbmFtZWQgLmV4ZSBidXQgY2FsbGVkIHdpdGhvdXQgdGhhdCBzdWZmaXguIFRoZXJlZm9yZSwgImZvbyIgYW5kICJmb28uZXhlIiBhcmUgY29uc2lkZXJlZAorICAjIHRoZSBzYW1lIGZpbGUsIG1vc3Qgb2YgdGhlIHRpbWUgKGFzIGluICJ0ZXN0IC1mIikuIEJ1dCBub3Qgd2hlbiBydW5uaW5nIGN5Z3BhdGggLXMsIHRoZW4KKyAgIyAiZm9vLmV4ZSIgaXMgT0sgYnV0ICJmb28iIGlzIGFuIGVycm9yLgorICAjCisgICMgVGhpcyB0ZXN0IGlzIHRoZXJlZm9yZSBzbGlnaHRseSBtb3JlIGFjY3VyYXRlIHRoYW4gInRlc3QgLWYiIHRvIGNoZWNrIGZvciBmaWxlIHByZWNlbnNlLgorICAjIEl0IGlzIGFsc28gYSB3YXkgdG8gbWFrZSBzdXJlIHdlIGdvdCB0aGUgcHJvcGVyIGZpbGUgbmFtZSBmb3IgdGhlIHJlYWwgdGVzdCBsYXRlciBvbi4KKyAgdGVzdF9zaG9ydHBhdGg9YCRDWUdQQVRIIC1zIC1tICIkbmV3X3BhdGgiIDI+IC9kZXYvbnVsbGAKKyAgaWYgdGVzdCAieCR0ZXN0X3Nob3J0cGF0aCIgPSB4OyB0aGVuCisgICAgIyBTaG9ydCBwYXRoIGZhaWxlZCwgZmlsZSBkb2VzIG5vdCBleGlzdCBhcyBzcGVjaWZpZWQuCisgICAgIyBUcnkgYWRkaW5nIC5leGUgb3IgLmNtZAorICAgIGlmIHRlc3QgLWYgIiR7bmV3X3BhdGh9LmV4ZSI7IHRoZW4KKyAgICAgICBpbnB1dF90b19zaG9ydHBhdGg9IiR7bmV3X3BhdGh9LmV4ZSIKKyAgICBlbGlmIHRlc3QgLWYgIiR7bmV3X3BhdGh9LmNtZCI7IHRoZW4KKyAgICAgICBpbnB1dF90b19zaG9ydHBhdGg9IiR7bmV3X3BhdGh9LmNtZCIKKyAgICBlbHNlCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSBwYXRoIG9mIE9CSkNPUFksIHdoaWNoIHJlc29sdmVzIGFzIFwiJG5ld19wYXRoXCIsIGlzIGludmFsaWQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoZSBwYXRoIG9mIE9CSkNPUFksIHdoaWNoIHJlc29sdmVzIGFzIFwiJG5ld19wYXRoXCIsIGlzIGludmFsaWQuIiA+JjY7fQorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBOZWl0aGVyIFwiJG5ld19wYXRoXCIgbm9yIFwiJG5ld19wYXRoLmV4ZS9jbWRcIiBjYW4gYmUgZm91bmQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogTmVpdGhlciBcIiRuZXdfcGF0aFwiIG5vciBcIiRuZXdfcGF0aC5leGUvY21kXCIgY2FuIGJlIGZvdW5kIiA+JjY7fQorICAgICAgYXNfZm5fZXJyb3IgJD8gIkNhbm5vdCBsb2NhdGUgdGhlIHRoZSBwYXRoIG9mIE9CSkNPUFkiICIkTElORU5PIiA1CisgICAgZmkKKyAgZWxzZQorICAgIGlucHV0X3RvX3Nob3J0cGF0aD0iJG5ld19wYXRoIgorICBmaQorCisgICMgQ2FsbCBoZWxwZXIgZnVuY3Rpb24gd2hpY2ggcG9zc2libHkgY29udmVydHMgdGhpcyB1c2luZyBET1Mtc3R5bGUgc2hvcnQgbW9kZS4KKyAgIyBJZiBzbywgdGhlIHVwZGF0ZWQgcGF0aCBpcyBzdG9yZWQgaW4gJG5ld19wYXRoLgorICBuZXdfcGF0aD0iJGlucHV0X3RvX3Nob3J0cGF0aCIKKworICBpbnB1dF9wYXRoPSIkaW5wdXRfdG9fc2hvcnRwYXRoIgorICAjIENoZWNrIGlmIHdlIG5lZWQgdG8gY29udmVydCB0aGlzIHVzaW5nIERPUy1zdHlsZSBzaG9ydCBtb2RlLiBJZiB0aGUgcGF0aAorICAjIGNvbnRhaW5zIGp1c3Qgc2ltcGxlIGNoYXJhY3RlcnMsIHVzZSBpdC4gT3RoZXJ3aXNlIChzcGFjZXMsIHdlaXJkIGNoYXJhY3RlcnMpLAorICAjIHRha2Ugbm8gY2hhbmNlcyBhbmQgcmV3cml0ZSBpdC4KKyAgIyBOb3RlOiBtNCBlYXRzIG91ciBbXSwgc28gd2UgbmVlZCB0byB1c2UgWyBhbmQgXSBpbnN0ZWFkLgorICBoYXNfZm9yYmlkZGVuX2NoYXJzPWAkRUNITyAiJGlucHV0X3BhdGgiIHwgJEdSRVAgW14tLl8vYS16QS1aMC05XWAKKyAgaWYgdGVzdCAieCRoYXNfZm9yYmlkZGVuX2NoYXJzIiAhPSB4OyB0aGVuCisgICAgIyBOb3cgY29udmVydCBpdCB0byBtaXhlZCBET1Mtc3R5bGUsIHNob3J0IG1vZGUgKG5vIHNwYWNlcywgYW5kIC8gaW5zdGVhZCBvZiBcKQorICAgIHNob3J0bW9kZV9wYXRoPWAkQ1lHUEFUSCAtcyAtbSAtYSAiJGlucHV0X3BhdGgiYAorICAgIHBhdGhfYWZ0ZXJfc2hvcnRtb2RlPWAkQ1lHUEFUSCAtdSAiJHNob3J0bW9kZV9wYXRoImAKKyAgICBpZiB0ZXN0ICJ4JHBhdGhfYWZ0ZXJfc2hvcnRtb2RlIiAhPSAieCRpbnB1dF90b19zaG9ydHBhdGgiOyB0aGVuCisgICAgICAjIEdvaW5nIHRvIHNob3J0IG1vZGUgYW5kIGJhY2sgYWdhaW4gZGlkIGluZGVlZCBtYXR0ZXIuIFNpbmNlIHNob3J0IG1vZGUgaXMKKyAgICAgICMgY2FzZSBpbnNlbnNpdGl2ZSwgbGV0J3MgbWFrZSBpdCBsb3dlcmNhc2UgdG8gaW1wcm92ZSByZWFkYWJpbGl0eS4KKyAgICAgIHNob3J0bW9kZV9wYXRoPWAkRUNITyAiJHNob3J0bW9kZV9wYXRoIiB8ICRUUiAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidgCisgICAgICAjIE5vdyBjb252ZXJ0IGl0IGJhY2sgdG8gVW5peC1zdGlsZSAoY3lncGF0aCkKKyAgICAgIGlucHV0X3BhdGg9YCRDWUdQQVRIIC11ICIkc2hvcnRtb2RlX3BhdGgiYAorICAgICAgbmV3X3BhdGg9IiRpbnB1dF9wYXRoIgorICAgIGZpCisgIGZpCisKKyAgdGVzdF9jeWdkcml2ZV9wcmVmaXg9YCRFQ0hPICRpbnB1dF9wYXRoIHwgJEdSRVAgXi9jeWdkcml2ZS9gCisgIGlmIHRlc3QgIngkdGVzdF9jeWdkcml2ZV9wcmVmaXgiID0geDsgdGhlbgorICAgICMgQXMgYSBzaW1wbGUgZml4LCBleGNsdWRlIC91c3IvYmluIHNpbmNlIGl0J3Mgbm90IGEgcmVhbCBwYXRoLgorICAgIGlmIHRlc3QgInhgJEVDSE8gJGlucHV0X3RvX3Nob3J0cGF0aCB8ICRHUkVQIF4vdXNyL2Jpbi9gIiA9IHg7IHRoZW4KKyAgICAgICMgVGhlIHBhdGggaXMgaW4gYSBDeWd3aW4gc3BlY2lhbCBkaXJlY3RvcnkgKGUuZy4gL2hvbWUpLiBXZSBuZWVkIHRoaXMgY29udmVydGVkIHRvCisgICAgICAjIGEgcGF0aCBwcmVmaXhlZCBieSAvY3lnZHJpdmUgZm9yIGZpeHBhdGggdG8gd29yay4KKyAgICAgIG5ld19wYXRoPSIkQ1lHV0lOX1JPT1RfUEFUSCRpbnB1dF9wYXRoIgorICAgIGZpCisgIGZpCisKKyAgIyByZW1vdmUgdHJhaWxpbmcgLmV4ZSBpZiBhbnkKKyAgbmV3X3BhdGg9IiR7bmV3X3BhdGgvJS5leGUvfSIKKworICBlbGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLm1zeXMiOyB0aGVuCisKKyAgIyBGaXJzdCBzZXBhcmF0ZSB0aGUgcGF0aCBmcm9tIHRoZSBhcmd1bWVudHMuIFRoaXMgd2lsbCBzcGxpdCBhdCB0aGUgZmlyc3QKKyAgIyBzcGFjZS4KKyAgY29tcGxldGU9IiRPQkpDT1BZIgorICBwYXRoPSIke2NvbXBsZXRlJSUgKn0iCisgIHRtcD0iJGNvbXBsZXRlIEVPTCIKKyAgYXJndW1lbnRzPSIke3RtcCMqIH0iCisKKyAgIyBJbnB1dCBtaWdodCBiZSBnaXZlbiBhcyBXaW5kb3dzIGZvcm1hdCwgc3RhcnQgYnkgY29udmVydGluZyB0bworICAjIHVuaXggZm9ybWF0LgorICBuZXdfcGF0aD0iJHBhdGgiCisKKyAgd2luZG93c19wYXRoPSIkbmV3X3BhdGgiCisgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLmN5Z3dpbiI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRDWUdQQVRIIC11ICIkd2luZG93c19wYXRoImAKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJEVDSE8gIiR3aW5kb3dzX3BhdGgiIHwgJFNFRCAtZSAncyxeXFwoLlxcKTosL1xcMSxnJyAtZSAncyxcXFxcLC8sZydgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGZpCisKKworICAjIE5vdyB0cnkgdG8gbG9jYXRlIGV4ZWN1dGFibGUgdXNpbmcgd2hpY2gKKyAgbmV3X3BhdGg9YCRXSElDSCAiJG5ld19wYXRoIiAyPiAvZGV2L251bGxgCisKKyAgaWYgdGVzdCAieCRuZXdfcGF0aCIgPSB4OyB0aGVuCisgICAgIyBPb3BzLiBXaGljaCBkaWRuJ3QgZmluZCB0aGUgZXhlY3V0YWJsZS4KKyAgICAjIFRoZSBzcGxpdHRpbmcgb2YgYXJndW1lbnRzIGZyb20gdGhlIGV4ZWN1dGFibGUgYXQgYSBzcGFjZSBtaWdodCBoYXZlIGJlZW4gaW5jb3JyZWN0LAorICAgICMgc2luY2UgcGF0aHMgd2l0aCBzcGFjZSBhcmUgbW9yZSBsaWtlbHkgaW4gV2luZG93cy4gR2l2ZSBpdCBhbm90aGVyIHRyeSB3aXRoIHRoZSB3aG9sZQorICAgICMgYXJndW1lbnQuCisgICAgcGF0aD0iJGNvbXBsZXRlIgorICAgIGFyZ3VtZW50cz0iRU9MIgorICAgIG5ld19wYXRoPSIkcGF0aCIKKworICB3aW5kb3dzX3BhdGg9IiRuZXdfcGF0aCIKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJENZR1BBVEggLXUgIiR3aW5kb3dzX3BhdGgiYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBlbGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLm1zeXMiOyB0aGVuCisgICAgdW5peF9wYXRoPWAkRUNITyAiJHdpbmRvd3NfcGF0aCIgfCAkU0VEIC1lICdzLF5cXCguXFwpOiwvXFwxLGcnIC1lICdzLFxcXFwsLyxnJ2AKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZmkKKworCisgICAgbmV3X3BhdGg9YCRXSElDSCAiJG5ld19wYXRoIiAyPiAvZGV2L251bGxgCisKKyAgICBpZiB0ZXN0ICJ4JG5ld19wYXRoIiA9IHg7IHRoZW4KKyAgICAgICMgSXQncyBzdGlsbCBub3QgZm91bmQuIE5vdyB0aGlzIGlzIGFuIHVucmVjb3ZlcmFibGUgZXJyb3IuCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSBwYXRoIG9mIE9CSkNPUFksIHdoaWNoIHJlc29sdmVzIGFzIFwiJGNvbXBsZXRlXCIsIGlzIG5vdCBmb3VuZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhlIHBhdGggb2YgT0JKQ09QWSwgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkY29tcGxldGVcIiwgaXMgbm90IGZvdW5kLiIgPiY2O30KKyAgICAgIGhhc19zcGFjZT1gJEVDSE8gIiRjb21wbGV0ZSIgfCAkR1JFUCAiICJgCisgICAgICBpZiB0ZXN0ICJ4JGhhc19zcGFjZSIgIT0geDsgdGhlbgorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFlvdSBtaWdodCBiZSBtaXhpbmcgc3BhY2VzIGluIHRoZSBwYXRoIGFuZCBleHRyYSBhcmd1bWVudHMsIHdoaWNoIGlzIG5vdCBhbGxvd2VkLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBZb3UgbWlnaHQgYmUgbWl4aW5nIHNwYWNlcyBpbiB0aGUgcGF0aCBhbmQgZXh0cmEgYXJndW1lbnRzLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iID4mNjt9CisgICAgICBmaQorICAgICAgYXNfZm5fZXJyb3IgJD8gIkNhbm5vdCBsb2NhdGUgdGhlIHRoZSBwYXRoIG9mIE9CSkNPUFkiICIkTElORU5PIiA1CisgICAgZmkKKyAgZmkKKworICAjIE5vdyBuZXdfcGF0aCBoYXMgYSBjb21wbGV0ZSB1bml4IHBhdGggdG8gdGhlIGJpbmFyeQorICBpZiB0ZXN0ICJ4YCRFQ0hPICRuZXdfcGF0aCB8ICRHUkVQIF4vYmluL2AiICE9IHg7IHRoZW4KKyAgICAjIEtlZXAgcGF0aHMgaW4gL2JpbiBhcy1pcywgYnV0IHJlbW92ZSB0cmFpbGluZyAuZXhlIGlmIGFueQorICAgIG5ld19wYXRoPSIke25ld19wYXRoLyUuZXhlL30iCisgICAgIyBEbyBub3Qgc2F2ZSAvYmluIHBhdGhzIHRvIGFsbF9maXhwYXRoX3ByZWZpeGVzIQorICBlbHNlCisgICAgIyBOb3QgaW4gbWl4ZWQgb3IgV2luZG93cyBzdHlsZSwgc3RhcnQgYnkgdGhhdC4KKyAgICBuZXdfcGF0aD1gY21kIC8vYyBlY2hvICRuZXdfcGF0aGAKKworICBpbnB1dF9wYXRoPSIkbmV3X3BhdGgiCisgICMgQ2hlY2sgaWYgd2UgbmVlZCB0byBjb252ZXJ0IHRoaXMgdXNpbmcgRE9TLXN0eWxlIHNob3J0IG1vZGUuIElmIHRoZSBwYXRoCisgICMgY29udGFpbnMganVzdCBzaW1wbGUgY2hhcmFjdGVycywgdXNlIGl0LiBPdGhlcndpc2UgKHNwYWNlcywgd2VpcmQgY2hhcmFjdGVycyksCisgICMgdGFrZSBubyBjaGFuY2VzIGFuZCByZXdyaXRlIGl0LgorICAjIE5vdGU6IG00IGVhdHMgb3VyIFtdLCBzbyB3ZSBuZWVkIHRvIHVzZSBbIGFuZCBdIGluc3RlYWQuCisgIGhhc19mb3JiaWRkZW5fY2hhcnM9YCRFQ0hPICIkaW5wdXRfcGF0aCIgfCAkR1JFUCBbXi1fLzphLXpBLVowLTldYAorICBpZiB0ZXN0ICJ4JGhhc19mb3JiaWRkZW5fY2hhcnMiICE9IHg7IHRoZW4KKyAgICAjIE5vdyBjb252ZXJ0IGl0IHRvIG1peGVkIERPUy1zdHlsZSwgc2hvcnQgbW9kZSAobm8gc3BhY2VzLCBhbmQgLyBpbnN0ZWFkIG9mIFwpCisgICAgbmV3X3BhdGg9YGNtZCAvYyAiZm9yICVBIGluIChcIiRpbnB1dF9wYXRoXCIpIGRvIEBlY2hvICV+c0EifCRUUiBcXFxcXFxcXCAvIHwgJFRSICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J2AKKyAgZmkKKworICAgICMgT3V0cHV0IGlzIGluICRuZXdfcGF0aAorCisgIHdpbmRvd3NfcGF0aD0iJG5ld19wYXRoIgorICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5jeWd3aW4iOyB0aGVuCisgICAgdW5peF9wYXRoPWAkQ1lHUEFUSCAtdSAiJHdpbmRvd3NfcGF0aCJgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGVsaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MubXN5cyI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRFQ0hPICIkd2luZG93c19wYXRoIiB8ICRTRUQgLWUgJ3MsXlxcKC5cXCk6LC9cXDEsZycgLWUgJ3MsXFxcXCwvLGcnYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBmaQorCisgICAgIyByZW1vdmUgdHJhaWxpbmcgLmV4ZSBpZiBhbnkKKyAgICBuZXdfcGF0aD0iJHtuZXdfcGF0aC8lLmV4ZS99IgorCisgICAgIyBTYXZlIHRoZSBmaXJzdCAxMCBieXRlcyBvZiB0aGlzIHBhdGggdG8gdGhlIHN0b3JhZ2UsIHNvIGZpeHBhdGggY2FuIHdvcmsuCisgICAgYWxsX2ZpeHBhdGhfcHJlZml4ZXM9KCIke2FsbF9maXhwYXRoX3ByZWZpeGVzW0BdfSIgIiR7bmV3X3BhdGg6MDoxMH0iKQorICBmaQorCisgIGVsc2UKKyAgICAjIFdlJ3JlIG9uIGEgcG9zaXggcGxhdGZvcm0uIEhvb3JheSEgOikKKyAgICAjIEZpcnN0IHNlcGFyYXRlIHRoZSBwYXRoIGZyb20gdGhlIGFyZ3VtZW50cy4gVGhpcyB3aWxsIHNwbGl0IGF0IHRoZSBmaXJzdAorICAgICMgc3BhY2UuCisgICAgY29tcGxldGU9IiRPQkpDT1BZIgorICAgIHBhdGg9IiR7Y29tcGxldGUlJSAqfSIKKyAgICB0bXA9IiRjb21wbGV0ZSBFT0wiCisgICAgYXJndW1lbnRzPSIke3RtcCMqIH0iCisKKyAgICBuZXdfcGF0aD1gJFdISUNIICRwYXRoIDI+IC9kZXYvbnVsbGAKKyAgICBpZiB0ZXN0ICJ4JG5ld19wYXRoIiA9IHg7IHRoZW4KKyAgICAgIGlzX2Fic29sdXRlX3BhdGg9YCRFQ0hPICIkcGF0aCIgfCAkR1JFUCBeL2AKKyAgICAgIGlmIHRlc3QgIngkaXNfYWJzb2x1dGVfcGF0aCIgIT0geDsgdGhlbgorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFJlc29sdmluZyBPQkpDT1BZIChhcyAkcGF0aCkgd2l0aCAnd2hpY2gnIGZhaWxlZCwgdXNpbmcgJHBhdGggZGlyZWN0bHkuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFJlc29sdmluZyBPQkpDT1BZIChhcyAkcGF0aCkgd2l0aCAnd2hpY2gnIGZhaWxlZCwgdXNpbmcgJHBhdGggZGlyZWN0bHkuIiA+JjY7fQorICAgICAgICBuZXdfcGF0aD0iJHBhdGgiCisgICAgICBlbHNlCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGhlIHBhdGggb2YgT0JKQ09QWSwgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkY29tcGxldGVcIiwgaXMgbm90IGZvdW5kLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUaGUgcGF0aCBvZiBPQkpDT1BZLCB3aGljaCByZXNvbHZlcyBhcyBcIiRjb21wbGV0ZVwiLCBpcyBub3QgZm91bmQuIiA+JjY7fQorICAgICAgICBoYXNfc3BhY2U9YCRFQ0hPICIkY29tcGxldGUiIHwgJEdSRVAgIiAiYAorICAgICAgICBpZiB0ZXN0ICJ4JGhhc19zcGFjZSIgIT0geDsgdGhlbgorICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGhpcyBtaWdodCBiZSBjYXVzZWQgYnkgc3BhY2VzIGluIHRoZSBwYXRoLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhpcyBtaWdodCBiZSBjYXVzZWQgYnkgc3BhY2VzIGluIHRoZSBwYXRoLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iID4mNjt9CisgICAgICAgIGZpCisgICAgICAgIGFzX2ZuX2Vycm9yICQ/ICJDYW5ub3QgbG9jYXRlIHRoZSB0aGUgcGF0aCBvZiBPQkpDT1BZIiAiJExJTkVOTyIgNQorICAgICAgZmkKKyAgICBmaQorICBmaQorCisgICMgTm93IGpvaW4gdG9nZXRoZXIgdGhlIHBhdGggYW5kIHRoZSBhcmd1bWVudHMgb25jZSBhZ2FpbgorICBpZiB0ZXN0ICJ4JGFyZ3VtZW50cyIgIT0geEVPTDsgdGhlbgorICAgICAgbmV3X2NvbXBsZXRlPSIkbmV3X3BhdGggJHthcmd1bWVudHMlICp9IgorICBlbHNlCisgICAgICBuZXdfY29tcGxldGU9IiRuZXdfcGF0aCIKKyAgZmkKKworICBpZiB0ZXN0ICJ4JGNvbXBsZXRlIiAhPSAieCRuZXdfY29tcGxldGUiOyB0aGVuCisgICAgT0JKQ09QWT0iJG5ld19jb21wbGV0ZSIKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFJld3JpdGluZyBPQkpDT1BZIHRvIFwiJG5ld19jb21wbGV0ZVwiIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFJld3JpdGluZyBPQkpDT1BZIHRvIFwiJG5ld19jb21wbGV0ZVwiIiA+JjY7fQorICBmaQorCitmaQorCiBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1nb2JqY29weSIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1nb2JqY29weTsgYWNfd29yZD0kMgorICBmb3IgYWNfcHJvZyBpbiBnb2JqZHVtcCBvYmpkdW1wCisgIGRvCisgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2c7IGFjX3dvcmQ9JDIKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wYXRoX09CSkNPUFkrc2V0fSIgPSBzZXQ7IHRoZW4gOgoraWYgdGVzdCAiJHthY19jdl9wcm9nX09CSkRVTVArc2V0fSIgPSBzZXQ7IHRoZW4gOgogICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgogZWxzZQotICBjYXNlICRPQkpDT1BZIGluCi0gIFtcXC9dKiB8ID86W1xcL10qKQotICBhY19jdl9wYXRoX09CSkNPUFk9IiRPQkpDT1BZIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorICBpZiB0ZXN0IC1uICIkT0JKRFVNUCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19PQkpEVU1QPSIkT0JKRFVNUCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCiBmb3IgYXNfZGlyIGluICRQQVRICiBkbwogICBJRlM9JGFzX3NhdmVfSUZTCiAgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCiAgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCiAgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBhY19jdl9wYXRoX09CSkNPUFk9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCisgICAgYWNfY3ZfcHJvZ19PQkpEVU1QPSIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIKICAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKICAgICBicmVhayAyCiAgIGZpCkBAIC0xNDAxMSw0MiArMjU0NTgsNDMgQEAKICAgZG9uZQogSUZTPSRhc19zYXZlX0lGUwogCi0gIDs7Ci1lc2FjCiBmaQotT0JKQ09QWT0kYWNfY3ZfcGF0aF9PQkpDT1BZCi1pZiB0ZXN0IC1uICIkT0JKQ09QWSI7IHRoZW4KLSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRPQkpDT1BZIiA+JjUKLSRhc19lY2hvICIkT0JKQ09QWSIgPiY2OyB9CitmaQorT0JKRFVNUD0kYWNfY3ZfcHJvZ19PQkpEVU1QCitpZiB0ZXN0IC1uICIkT0JKRFVNUCI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRPQkpEVU1QIiA+JjUKKyRhc19lY2hvICIkT0JKRFVNUCIgPiY2OyB9CiBlbHNlCiAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiAkYXNfZWNobyAibm8iID4mNjsgfQogZmkKIAogCisgICAgdGVzdCAtbiAiJE9CSkRVTVAiICYmIGJyZWFrCisgIGRvbmUKIGZpCi1pZiB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9PQkpDT1BZIjsgdGhlbgotICBhY19wdF9PQkpDT1BZPSRPQkpDT1BZCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ29iamNvcHkiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdvYmpjb3B5OyBhY193b3JkPSQyCitpZiB0ZXN0IC16ICIkT0JKRFVNUCI7IHRoZW4KKyAgYWNfY3RfT0JKRFVNUD0kT0JKRFVNUAorICBmb3IgYWNfcHJvZyBpbiBnb2JqZHVtcCBvYmpkdW1wCitkbworICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQogJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3BhdGhfYWNfcHRfT0JKQ09QWStzZXR9IiA9IHNldDsgdGhlbiA6CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfT0JKRFVNUCtzZXR9IiA9IHNldDsgdGhlbiA6CiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiBlbHNlCi0gIGNhc2UgJGFjX3B0X09CSkNPUFkgaW4KLSAgW1xcL10qIHwgPzpbXFwvXSopCi0gIGFjX2N2X3BhdGhfYWNfcHRfT0JKQ09QWT0iJGFjX3B0X09CSkNPUFkiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCisgIGlmIHRlc3QgLW4gIiRhY19jdF9PQkpEVU1QIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X09CSkRVTVA9IiRhY19jdF9PQkpEVU1QIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKIGZvciBhc19kaXIgaW4gJFBBVEgKIGRvCiAgIElGUz0kYXNfc2F2ZV9JRlMKICAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KICAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KICAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3BhdGhfYWNfcHRfT0JKQ09QWT0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKKyAgICBhY19jdl9wcm9nX2FjX2N0X09CSkRVTVA9IiRhY19wcm9nIgogICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQogICAgIGJyZWFrIDIKICAgZmkKQEAgLTE0MDU0LDIwICsyNTUwMiwyMyBAQAogICBkb25lCiBJRlM9JGFzX3NhdmVfSUZTCiAKLSAgOzsKLWVzYWMKIGZpCi1hY19wdF9PQkpDT1BZPSRhY19jdl9wYXRoX2FjX3B0X09CSkNPUFkKLWlmIHRlc3QgLW4gIiRhY19wdF9PQkpDT1BZIjsgdGhlbgotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3B0X09CSkNPUFkiID4mNQotJGFzX2VjaG8gIiRhY19wdF9PQkpDT1BZIiA+JjY7IH0KK2ZpCithY19jdF9PQkpEVU1QPSRhY19jdl9wcm9nX2FjX2N0X09CSkRVTVAKK2lmIHRlc3QgLW4gIiRhY19jdF9PQkpEVU1QIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X09CSkRVTVAiID4mNQorJGFzX2VjaG8gIiRhY19jdF9PQkpEVU1QIiA+JjY7IH0KIGVsc2UKICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKICRhc19lY2hvICJubyIgPiY2OyB9CiBmaQogCi0gIGlmIHRlc3QgIngkYWNfcHRfT0JKQ09QWSIgPSB4OyB0aGVuCi0gICAgT0JKQ09QWT0iIgorCisgIHRlc3QgLW4gIiRhY19jdF9PQkpEVU1QIiAmJiBicmVhaworZG9uZQorCisgIGlmIHRlc3QgIngkYWNfY3RfT0JKRFVNUCIgPSB4OyB0aGVuCisgICAgT0JKRFVNUD0iIgogICBlbHNlCiAgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgogeWVzOikKQEAgLTE0MDc1LDExMCArMjU1MjYsMjUyIEBACiAkYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9CiBhY190b29sX3dhcm5lZD15ZXMgOzsKIGVzYWMKLSAgICBPQkpDT1BZPSRhY19wdF9PQkpDT1BZCisgICAgT0JKRFVNUD0kYWNfY3RfT0JKRFVNUAogICBmaQotZWxzZQotICBPQkpDT1BZPSIkYWNfY3ZfcGF0aF9PQkpDT1BZIgogZmkKIAotaWYgdGVzdCAieCRPQkpDT1BZIiA9IHg7IHRoZW4KLSAgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fW9iamNvcHkiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9b2JqY29weTsgYWNfd29yZD0kMgoteyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3BhdGhfT0JKQ09QWStzZXR9IiA9IHNldDsgdGhlbiA6Ci0gICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Ci1lbHNlCi0gIGNhc2UgJE9CSkNPUFkgaW4KLSAgW1xcL10qIHwgPzpbXFwvXSopCi0gIGFjX2N2X3BhdGhfT0JKQ09QWT0iJE9CSkNPUFkiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBhY19jdl9wYXRoX09CSkNPUFk9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCi0gICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgoraWYgdGVzdCAieCRPQkpEVU1QIiAhPSB4OyB0aGVuCisgICMgT25seSB1c2VkIGZvciBjb21wYXJlLnNoOyB3ZSBjYW4gbGl2ZSB3aXRob3V0IGl0LiBCQVNJQ19GSVhVUF9FWEVDVVRBQkxFIGJhaWxzIGlmIGFyZ3VtZW50IGlzIG1pc3NpbmcuCisKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorCisgICMgRmlyc3Qgc2VwYXJhdGUgdGhlIHBhdGggZnJvbSB0aGUgYXJndW1lbnRzLiBUaGlzIHdpbGwgc3BsaXQgYXQgdGhlIGZpcnN0CisgICMgc3BhY2UuCisgIGNvbXBsZXRlPSIkT0JKRFVNUCIKKyAgcGF0aD0iJHtjb21wbGV0ZSUlICp9IgorICB0bXA9IiRjb21wbGV0ZSBFT0wiCisgIGFyZ3VtZW50cz0iJHt0bXAjKiB9IgorCisgICMgSW5wdXQgbWlnaHQgYmUgZ2l2ZW4gYXMgV2luZG93cyBmb3JtYXQsIHN0YXJ0IGJ5IGNvbnZlcnRpbmcgdG8KKyAgIyB1bml4IGZvcm1hdC4KKyAgbmV3X3BhdGg9YCRDWUdQQVRIIC11ICIkcGF0aCJgCisKKyAgIyBOb3cgdHJ5IHRvIGxvY2F0ZSBleGVjdXRhYmxlIHVzaW5nIHdoaWNoCisgIG5ld19wYXRoPWAkV0hJQ0ggIiRuZXdfcGF0aCIgMj4gL2Rldi9udWxsYAorICBpZiB0ZXN0ICJ4JG5ld19wYXRoIiA9IHg7IHRoZW4KKyAgICAjIE9vcHMuIFdoaWNoIGRpZG4ndCBmaW5kIHRoZSBleGVjdXRhYmxlLgorICAgICMgVGhlIHNwbGl0dGluZyBvZiBhcmd1bWVudHMgZnJvbSB0aGUgZXhlY3V0YWJsZSBhdCBhIHNwYWNlIG1pZ2h0IGhhdmUgYmVlbiBpbmNvcnJlY3QsCisgICAgIyBzaW5jZSBwYXRocyB3aXRoIHNwYWNlIGFyZSBtb3JlIGxpa2VseSBpbiBXaW5kb3dzLiBHaXZlIGl0IGFub3RoZXIgdHJ5IHdpdGggdGhlIHdob2xlCisgICAgIyBhcmd1bWVudC4KKyAgICBwYXRoPSIkY29tcGxldGUiCisgICAgYXJndW1lbnRzPSJFT0wiCisgICAgbmV3X3BhdGg9YCRDWUdQQVRIIC11ICIkcGF0aCJgCisgICAgbmV3X3BhdGg9YCRXSElDSCAiJG5ld19wYXRoIiAyPiAvZGV2L251bGxgCisgICAgaWYgdGVzdCAieCRuZXdfcGF0aCIgPSB4OyB0aGVuCisgICAgICAjIEl0J3Mgc3RpbGwgbm90IGZvdW5kLiBOb3cgdGhpcyBpcyBhbiB1bnJlY292ZXJhYmxlIGVycm9yLgorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUaGUgcGF0aCBvZiBPQkpEVU1QLCB3aGljaCByZXNvbHZlcyBhcyBcIiRjb21wbGV0ZVwiLCBpcyBub3QgZm91bmQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoZSBwYXRoIG9mIE9CSkRVTVAsIHdoaWNoIHJlc29sdmVzIGFzIFwiJGNvbXBsZXRlXCIsIGlzIG5vdCBmb3VuZC4iID4mNjt9CisgICAgICBoYXNfc3BhY2U9YCRFQ0hPICIkY29tcGxldGUiIHwgJEdSRVAgIiAiYAorICAgICAgaWYgdGVzdCAieCRoYXNfc3BhY2UiICE9IHg7IHRoZW4KKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBZb3UgbWlnaHQgYmUgbWl4aW5nIHNwYWNlcyBpbiB0aGUgcGF0aCBhbmQgZXh0cmEgYXJndW1lbnRzLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogWW91IG1pZ2h0IGJlIG1peGluZyBzcGFjZXMgaW4gdGhlIHBhdGggYW5kIGV4dHJhIGFyZ3VtZW50cywgd2hpY2ggaXMgbm90IGFsbG93ZWQuIiA+JjY7fQorICAgICAgZmkKKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJDYW5ub3QgbG9jYXRlIHRoZSB0aGUgcGF0aCBvZiBPQkpEVU1QIiAiJExJTkVOTyIgNQorICAgIGZpCiAgIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKIAotICA7OwotZXNhYwotZmkKLU9CSkNPUFk9JGFjX2N2X3BhdGhfT0JKQ09QWQotaWYgdGVzdCAtbiAiJE9CSkNPUFkiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkT0JKQ09QWSIgPiY1Ci0kYXNfZWNobyAiJE9CSkNPUFkiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLQotZmkKLWlmIHRlc3QgLXogIiRhY19jdl9wYXRoX09CSkNPUFkiOyB0aGVuCi0gIGFjX3B0X09CSkNPUFk9JE9CSkNPUFkKLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJvYmpjb3B5Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBvYmpjb3B5OyBhY193b3JkPSQyCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9hY19wdF9PQkpDT1BZK3NldH0iID0gc2V0OyB0aGVuIDoKLSAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKLWVsc2UKLSAgY2FzZSAkYWNfcHRfT0JKQ09QWSBpbgotICBbXFwvXSogfCA/OltcXC9dKikKLSAgYWNfY3ZfcGF0aF9hY19wdF9PQkpDT1BZPSIkYWNfcHRfT0JKQ09QWSIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3BhdGhfYWNfcHRfT0JKQ09QWT0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKLSAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi0gIGRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotICA7OwotZXNhYwotZmkKLWFjX3B0X09CSkNPUFk9JGFjX2N2X3BhdGhfYWNfcHRfT0JKQ09QWQotaWYgdGVzdCAtbiAiJGFjX3B0X09CSkNPUFkiOyB0aGVuCi0gIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfcHRfT0JKQ09QWSIgPiY1Ci0kYXNfZWNobyAiJGFjX3B0X09CSkNPUFkiID4mNjsgfQotZWxzZQotICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQotJGFzX2VjaG8gIm5vIiA+JjY7IH0KLWZpCi0KLSAgaWYgdGVzdCAieCRhY19wdF9PQkpDT1BZIiA9IHg7IHRoZW4KLSAgICBPQkpDT1BZPSIiCisgICMgQ3lnd2luIHRyaWVzIHRvIGhpZGUgc29tZSBhc3BlY3RzIG9mIHRoZSBXaW5kb3dzIGZpbGUgc3lzdGVtLCBzdWNoIHRoYXQgYmluYXJpZXMgYXJlCisgICMgbmFtZWQgLmV4ZSBidXQgY2FsbGVkIHdpdGhvdXQgdGhhdCBzdWZmaXguIFRoZXJlZm9yZSwgImZvbyIgYW5kICJmb28uZXhlIiBhcmUgY29uc2lkZXJlZAorICAjIHRoZSBzYW1lIGZpbGUsIG1vc3Qgb2YgdGhlIHRpbWUgKGFzIGluICJ0ZXN0IC1mIikuIEJ1dCBub3Qgd2hlbiBydW5uaW5nIGN5Z3BhdGggLXMsIHRoZW4KKyAgIyAiZm9vLmV4ZSIgaXMgT0sgYnV0ICJmb28iIGlzIGFuIGVycm9yLgorICAjCisgICMgVGhpcyB0ZXN0IGlzIHRoZXJlZm9yZSBzbGlnaHRseSBtb3JlIGFjY3VyYXRlIHRoYW4gInRlc3QgLWYiIHRvIGNoZWNrIGZvciBmaWxlIHByZWNlbnNlLgorICAjIEl0IGlzIGFsc28gYSB3YXkgdG8gbWFrZSBzdXJlIHdlIGdvdCB0aGUgcHJvcGVyIGZpbGUgbmFtZSBmb3IgdGhlIHJlYWwgdGVzdCBsYXRlciBvbi4KKyAgdGVzdF9zaG9ydHBhdGg9YCRDWUdQQVRIIC1zIC1tICIkbmV3X3BhdGgiIDI+IC9kZXYvbnVsbGAKKyAgaWYgdGVzdCAieCR0ZXN0X3Nob3J0cGF0aCIgPSB4OyB0aGVuCisgICAgIyBTaG9ydCBwYXRoIGZhaWxlZCwgZmlsZSBkb2VzIG5vdCBleGlzdCBhcyBzcGVjaWZpZWQuCisgICAgIyBUcnkgYWRkaW5nIC5leGUgb3IgLmNtZAorICAgIGlmIHRlc3QgLWYgIiR7bmV3X3BhdGh9LmV4ZSI7IHRoZW4KKyAgICAgICBpbnB1dF90b19zaG9ydHBhdGg9IiR7bmV3X3BhdGh9LmV4ZSIKKyAgICBlbGlmIHRlc3QgLWYgIiR7bmV3X3BhdGh9LmNtZCI7IHRoZW4KKyAgICAgICBpbnB1dF90b19zaG9ydHBhdGg9IiR7bmV3X3BhdGh9LmNtZCIKKyAgICBlbHNlCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSBwYXRoIG9mIE9CSkRVTVAsIHdoaWNoIHJlc29sdmVzIGFzIFwiJG5ld19wYXRoXCIsIGlzIGludmFsaWQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoZSBwYXRoIG9mIE9CSkRVTVAsIHdoaWNoIHJlc29sdmVzIGFzIFwiJG5ld19wYXRoXCIsIGlzIGludmFsaWQuIiA+JjY7fQorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBOZWl0aGVyIFwiJG5ld19wYXRoXCIgbm9yIFwiJG5ld19wYXRoLmV4ZS9jbWRcIiBjYW4gYmUgZm91bmQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogTmVpdGhlciBcIiRuZXdfcGF0aFwiIG5vciBcIiRuZXdfcGF0aC5leGUvY21kXCIgY2FuIGJlIGZvdW5kIiA+JjY7fQorICAgICAgYXNfZm5fZXJyb3IgJD8gIkNhbm5vdCBsb2NhdGUgdGhlIHRoZSBwYXRoIG9mIE9CSkRVTVAiICIkTElORU5PIiA1CisgICAgZmkKICAgZWxzZQotICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KLXllczopCi17ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1Ci0kYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9Ci1hY190b29sX3dhcm5lZD15ZXMgOzsKLWVzYWMKLSAgICBPQkpDT1BZPSRhY19wdF9PQkpDT1BZCisgICAgaW5wdXRfdG9fc2hvcnRwYXRoPSIkbmV3X3BhdGgiCiAgIGZpCi1lbHNlCi0gIE9CSkNPUFk9IiRhY19jdl9wYXRoX09CSkNPUFkiCi1maQorCisgICMgQ2FsbCBoZWxwZXIgZnVuY3Rpb24gd2hpY2ggcG9zc2libHkgY29udmVydHMgdGhpcyB1c2luZyBET1Mtc3R5bGUgc2hvcnQgbW9kZS4KKyAgIyBJZiBzbywgdGhlIHVwZGF0ZWQgcGF0aCBpcyBzdG9yZWQgaW4gJG5ld19wYXRoLgorICBuZXdfcGF0aD0iJGlucHV0X3RvX3Nob3J0cGF0aCIKKworICBpbnB1dF9wYXRoPSIkaW5wdXRfdG9fc2hvcnRwYXRoIgorICAjIENoZWNrIGlmIHdlIG5lZWQgdG8gY29udmVydCB0aGlzIHVzaW5nIERPUy1zdHlsZSBzaG9ydCBtb2RlLiBJZiB0aGUgcGF0aAorICAjIGNvbnRhaW5zIGp1c3Qgc2ltcGxlIGNoYXJhY3RlcnMsIHVzZSBpdC4gT3RoZXJ3aXNlIChzcGFjZXMsIHdlaXJkIGNoYXJhY3RlcnMpLAorICAjIHRha2Ugbm8gY2hhbmNlcyBhbmQgcmV3cml0ZSBpdC4KKyAgIyBOb3RlOiBtNCBlYXRzIG91ciBbXSwgc28gd2UgbmVlZCB0byB1c2UgWyBhbmQgXSBpbnN0ZWFkLgorICBoYXNfZm9yYmlkZGVuX2NoYXJzPWAkRUNITyAiJGlucHV0X3BhdGgiIHwgJEdSRVAgW14tLl8vYS16QS1aMC05XWAKKyAgaWYgdGVzdCAieCRoYXNfZm9yYmlkZGVuX2NoYXJzIiAhPSB4OyB0aGVuCisgICAgIyBOb3cgY29udmVydCBpdCB0byBtaXhlZCBET1Mtc3R5bGUsIHNob3J0IG1vZGUgKG5vIHNwYWNlcywgYW5kIC8gaW5zdGVhZCBvZiBcKQorICAgIHNob3J0bW9kZV9wYXRoPWAkQ1lHUEFUSCAtcyAtbSAtYSAiJGlucHV0X3BhdGgiYAorICAgIHBhdGhfYWZ0ZXJfc2hvcnRtb2RlPWAkQ1lHUEFUSCAtdSAiJHNob3J0bW9kZV9wYXRoImAKKyAgICBpZiB0ZXN0ICJ4JHBhdGhfYWZ0ZXJfc2hvcnRtb2RlIiAhPSAieCRpbnB1dF90b19zaG9ydHBhdGgiOyB0aGVuCisgICAgICAjIEdvaW5nIHRvIHNob3J0IG1vZGUgYW5kIGJhY2sgYWdhaW4gZGlkIGluZGVlZCBtYXR0ZXIuIFNpbmNlIHNob3J0IG1vZGUgaXMKKyAgICAgICMgY2FzZSBpbnNlbnNpdGl2ZSwgbGV0J3MgbWFrZSBpdCBsb3dlcmNhc2UgdG8gaW1wcm92ZSByZWFkYWJpbGl0eS4KKyAgICAgIHNob3J0bW9kZV9wYXRoPWAkRUNITyAiJHNob3J0bW9kZV9wYXRoIiB8ICRUUiAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidgCisgICAgICAjIE5vdyBjb252ZXJ0IGl0IGJhY2sgdG8gVW5peC1zdGlsZSAoY3lncGF0aCkKKyAgICAgIGlucHV0X3BhdGg9YCRDWUdQQVRIIC11ICIkc2hvcnRtb2RlX3BhdGgiYAorICAgICAgbmV3X3BhdGg9IiRpbnB1dF9wYXRoIgorICAgIGZpCisgIGZpCisKKyAgdGVzdF9jeWdkcml2ZV9wcmVmaXg9YCRFQ0hPICRpbnB1dF9wYXRoIHwgJEdSRVAgXi9jeWdkcml2ZS9gCisgIGlmIHRlc3QgIngkdGVzdF9jeWdkcml2ZV9wcmVmaXgiID0geDsgdGhlbgorICAgICMgQXMgYSBzaW1wbGUgZml4LCBleGNsdWRlIC91c3IvYmluIHNpbmNlIGl0J3Mgbm90IGEgcmVhbCBwYXRoLgorICAgIGlmIHRlc3QgInhgJEVDSE8gJGlucHV0X3RvX3Nob3J0cGF0aCB8ICRHUkVQIF4vdXNyL2Jpbi9gIiA9IHg7IHRoZW4KKyAgICAgICMgVGhlIHBhdGggaXMgaW4gYSBDeWd3aW4gc3BlY2lhbCBkaXJlY3RvcnkgKGUuZy4gL2hvbWUpLiBXZSBuZWVkIHRoaXMgY29udmVydGVkIHRvCisgICAgICAjIGEgcGF0aCBwcmVmaXhlZCBieSAvY3lnZHJpdmUgZm9yIGZpeHBhdGggdG8gd29yay4KKyAgICAgIG5ld19wYXRoPSIkQ1lHV0lOX1JPT1RfUEFUSCRpbnB1dF9wYXRoIgorICAgIGZpCisgIGZpCisKKyAgIyByZW1vdmUgdHJhaWxpbmcgLmV4ZSBpZiBhbnkKKyAgbmV3X3BhdGg9IiR7bmV3X3BhdGgvJS5leGUvfSIKKworICBlbGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLm1zeXMiOyB0aGVuCisKKyAgIyBGaXJzdCBzZXBhcmF0ZSB0aGUgcGF0aCBmcm9tIHRoZSBhcmd1bWVudHMuIFRoaXMgd2lsbCBzcGxpdCBhdCB0aGUgZmlyc3QKKyAgIyBzcGFjZS4KKyAgY29tcGxldGU9IiRPQkpEVU1QIgorICBwYXRoPSIke2NvbXBsZXRlJSUgKn0iCisgIHRtcD0iJGNvbXBsZXRlIEVPTCIKKyAgYXJndW1lbnRzPSIke3RtcCMqIH0iCisKKyAgIyBJbnB1dCBtaWdodCBiZSBnaXZlbiBhcyBXaW5kb3dzIGZvcm1hdCwgc3RhcnQgYnkgY29udmVydGluZyB0bworICAjIHVuaXggZm9ybWF0LgorICBuZXdfcGF0aD0iJHBhdGgiCisKKyAgd2luZG93c19wYXRoPSIkbmV3X3BhdGgiCisgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLmN5Z3dpbiI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRDWUdQQVRIIC11ICIkd2luZG93c19wYXRoImAKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJEVDSE8gIiR3aW5kb3dzX3BhdGgiIHwgJFNFRCAtZSAncyxeXFwoLlxcKTosL1xcMSxnJyAtZSAncyxcXFxcLC8sZydgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGZpCisKKworICAjIE5vdyB0cnkgdG8gbG9jYXRlIGV4ZWN1dGFibGUgdXNpbmcgd2hpY2gKKyAgbmV3X3BhdGg9YCRXSElDSCAiJG5ld19wYXRoIiAyPiAvZGV2L251bGxgCisKKyAgaWYgdGVzdCAieCRuZXdfcGF0aCIgPSB4OyB0aGVuCisgICAgIyBPb3BzLiBXaGljaCBkaWRuJ3QgZmluZCB0aGUgZXhlY3V0YWJsZS4KKyAgICAjIFRoZSBzcGxpdHRpbmcgb2YgYXJndW1lbnRzIGZyb20gdGhlIGV4ZWN1dGFibGUgYXQgYSBzcGFjZSBtaWdodCBoYXZlIGJlZW4gaW5jb3JyZWN0LAorICAgICMgc2luY2UgcGF0aHMgd2l0aCBzcGFjZSBhcmUgbW9yZSBsaWtlbHkgaW4gV2luZG93cy4gR2l2ZSBpdCBhbm90aGVyIHRyeSB3aXRoIHRoZSB3aG9sZQorICAgICMgYXJndW1lbnQuCisgICAgcGF0aD0iJGNvbXBsZXRlIgorICAgIGFyZ3VtZW50cz0iRU9MIgorICAgIG5ld19wYXRoPSIkcGF0aCIKKworICB3aW5kb3dzX3BhdGg9IiRuZXdfcGF0aCIKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJENZR1BBVEggLXUgIiR3aW5kb3dzX3BhdGgiYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBlbGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLm1zeXMiOyB0aGVuCisgICAgdW5peF9wYXRoPWAkRUNITyAiJHdpbmRvd3NfcGF0aCIgfCAkU0VEIC1lICdzLF5cXCguXFwpOiwvXFwxLGcnIC1lICdzLFxcXFwsLyxnJ2AKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZmkKKworCisgICAgbmV3X3BhdGg9YCRXSElDSCAiJG5ld19wYXRoIiAyPiAvZGV2L251bGxgCisKKyAgICBpZiB0ZXN0ICJ4JG5ld19wYXRoIiA9IHg7IHRoZW4KKyAgICAgICMgSXQncyBzdGlsbCBub3QgZm91bmQuIE5vdyB0aGlzIGlzIGFuIHVucmVjb3ZlcmFibGUgZXJyb3IuCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSBwYXRoIG9mIE9CSkRVTVAsIHdoaWNoIHJlc29sdmVzIGFzIFwiJGNvbXBsZXRlXCIsIGlzIG5vdCBmb3VuZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhlIHBhdGggb2YgT0JKRFVNUCwgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkY29tcGxldGVcIiwgaXMgbm90IGZvdW5kLiIgPiY2O30KKyAgICAgIGhhc19zcGFjZT1gJEVDSE8gIiRjb21wbGV0ZSIgfCAkR1JFUCAiICJgCisgICAgICBpZiB0ZXN0ICJ4JGhhc19zcGFjZSIgIT0geDsgdGhlbgorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFlvdSBtaWdodCBiZSBtaXhpbmcgc3BhY2VzIGluIHRoZSBwYXRoIGFuZCBleHRyYSBhcmd1bWVudHMsIHdoaWNoIGlzIG5vdCBhbGxvd2VkLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBZb3UgbWlnaHQgYmUgbWl4aW5nIHNwYWNlcyBpbiB0aGUgcGF0aCBhbmQgZXh0cmEgYXJndW1lbnRzLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iID4mNjt9CisgICAgICBmaQorICAgICAgYXNfZm5fZXJyb3IgJD8gIkNhbm5vdCBsb2NhdGUgdGhlIHRoZSBwYXRoIG9mIE9CSkRVTVAiICIkTElORU5PIiA1CisgICAgZmkKKyAgZmkKKworICAjIE5vdyBuZXdfcGF0aCBoYXMgYSBjb21wbGV0ZSB1bml4IHBhdGggdG8gdGhlIGJpbmFyeQorICBpZiB0ZXN0ICJ4YCRFQ0hPICRuZXdfcGF0aCB8ICRHUkVQIF4vYmluL2AiICE9IHg7IHRoZW4KKyAgICAjIEtlZXAgcGF0aHMgaW4gL2JpbiBhcy1pcywgYnV0IHJlbW92ZSB0cmFpbGluZyAuZXhlIGlmIGFueQorICAgIG5ld19wYXRoPSIke25ld19wYXRoLyUuZXhlL30iCisgICAgIyBEbyBub3Qgc2F2ZSAvYmluIHBhdGhzIHRvIGFsbF9maXhwYXRoX3ByZWZpeGVzIQorICBlbHNlCisgICAgIyBOb3QgaW4gbWl4ZWQgb3IgV2luZG93cyBzdHlsZSwgc3RhcnQgYnkgdGhhdC4KKyAgICBuZXdfcGF0aD1gY21kIC8vYyBlY2hvICRuZXdfcGF0aGAKKworICBpbnB1dF9wYXRoPSIkbmV3X3BhdGgiCisgICMgQ2hlY2sgaWYgd2UgbmVlZCB0byBjb252ZXJ0IHRoaXMgdXNpbmcgRE9TLXN0eWxlIHNob3J0IG1vZGUuIElmIHRoZSBwYXRoCisgICMgY29udGFpbnMganVzdCBzaW1wbGUgY2hhcmFjdGVycywgdXNlIGl0LiBPdGhlcndpc2UgKHNwYWNlcywgd2VpcmQgY2hhcmFjdGVycyksCisgICMgdGFrZSBubyBjaGFuY2VzIGFuZCByZXdyaXRlIGl0LgorICAjIE5vdGU6IG00IGVhdHMgb3VyIFtdLCBzbyB3ZSBuZWVkIHRvIHVzZSBbIGFuZCBdIGluc3RlYWQuCisgIGhhc19mb3JiaWRkZW5fY2hhcnM9YCRFQ0hPICIkaW5wdXRfcGF0aCIgfCAkR1JFUCBbXi1fLzphLXpBLVowLTldYAorICBpZiB0ZXN0ICJ4JGhhc19mb3JiaWRkZW5fY2hhcnMiICE9IHg7IHRoZW4KKyAgICAjIE5vdyBjb252ZXJ0IGl0IHRvIG1peGVkIERPUy1zdHlsZSwgc2hvcnQgbW9kZSAobm8gc3BhY2VzLCBhbmQgLyBpbnN0ZWFkIG9mIFwpCisgICAgbmV3X3BhdGg9YGNtZCAvYyAiZm9yICVBIGluIChcIiRpbnB1dF9wYXRoXCIpIGRvIEBlY2hvICV+c0EifCRUUiBcXFxcXFxcXCAvIHwgJFRSICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J2AKKyAgZmkKKworICAgICMgT3V0cHV0IGlzIGluICRuZXdfcGF0aAorCisgIHdpbmRvd3NfcGF0aD0iJG5ld19wYXRoIgorICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5jeWd3aW4iOyB0aGVuCisgICAgdW5peF9wYXRoPWAkQ1lHUEFUSCAtdSAiJHdpbmRvd3NfcGF0aCJgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGVsaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MubXN5cyI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRFQ0hPICIkd2luZG93c19wYXRoIiB8ICRTRUQgLWUgJ3MsXlxcKC5cXCk6LC9cXDEsZycgLWUgJ3MsXFxcXCwvLGcnYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBmaQorCisgICAgIyByZW1vdmUgdHJhaWxpbmcgLmV4ZSBpZiBhbnkKKyAgICBuZXdfcGF0aD0iJHtuZXdfcGF0aC8lLmV4ZS99IgorCisgICAgIyBTYXZlIHRoZSBmaXJzdCAxMCBieXRlcyBvZiB0aGlzIHBhdGggdG8gdGhlIHN0b3JhZ2UsIHNvIGZpeHBhdGggY2FuIHdvcmsuCisgICAgYWxsX2ZpeHBhdGhfcHJlZml4ZXM9KCIke2FsbF9maXhwYXRoX3ByZWZpeGVzW0BdfSIgIiR7bmV3X3BhdGg6MDoxMH0iKQorICBmaQorCisgIGVsc2UKKyAgICAjIFdlJ3JlIG9uIGEgcG9zaXggcGxhdGZvcm0uIEhvb3JheSEgOikKKyAgICAjIEZpcnN0IHNlcGFyYXRlIHRoZSBwYXRoIGZyb20gdGhlIGFyZ3VtZW50cy4gVGhpcyB3aWxsIHNwbGl0IGF0IHRoZSBmaXJzdAorICAgICMgc3BhY2UuCisgICAgY29tcGxldGU9IiRPQkpEVU1QIgorICAgIHBhdGg9IiR7Y29tcGxldGUlJSAqfSIKKyAgICB0bXA9IiRjb21wbGV0ZSBFT0wiCisgICAgYXJndW1lbnRzPSIke3RtcCMqIH0iCisKKyAgICBuZXdfcGF0aD1gJFdISUNIICRwYXRoIDI+IC9kZXYvbnVsbGAKKyAgICBpZiB0ZXN0ICJ4JG5ld19wYXRoIiA9IHg7IHRoZW4KKyAgICAgIGlzX2Fic29sdXRlX3BhdGg9YCRFQ0hPICIkcGF0aCIgfCAkR1JFUCBeL2AKKyAgICAgIGlmIHRlc3QgIngkaXNfYWJzb2x1dGVfcGF0aCIgIT0geDsgdGhlbgorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFJlc29sdmluZyBPQkpEVU1QIChhcyAkcGF0aCkgd2l0aCAnd2hpY2gnIGZhaWxlZCwgdXNpbmcgJHBhdGggZGlyZWN0bHkuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFJlc29sdmluZyBPQkpEVU1QIChhcyAkcGF0aCkgd2l0aCAnd2hpY2gnIGZhaWxlZCwgdXNpbmcgJHBhdGggZGlyZWN0bHkuIiA+JjY7fQorICAgICAgICBuZXdfcGF0aD0iJHBhdGgiCisgICAgICBlbHNlCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGhlIHBhdGggb2YgT0JKRFVNUCwgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkY29tcGxldGVcIiwgaXMgbm90IGZvdW5kLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUaGUgcGF0aCBvZiBPQkpEVU1QLCB3aGljaCByZXNvbHZlcyBhcyBcIiRjb21wbGV0ZVwiLCBpcyBub3QgZm91bmQuIiA+JjY7fQorICAgICAgICBoYXNfc3BhY2U9YCRFQ0hPICIkY29tcGxldGUiIHwgJEdSRVAgIiAiYAorICAgICAgICBpZiB0ZXN0ICJ4JGhhc19zcGFjZSIgIT0geDsgdGhlbgorICAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGhpcyBtaWdodCBiZSBjYXVzZWQgYnkgc3BhY2VzIGluIHRoZSBwYXRoLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhpcyBtaWdodCBiZSBjYXVzZWQgYnkgc3BhY2VzIGluIHRoZSBwYXRoLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iID4mNjt9CisgICAgICAgIGZpCisgICAgICAgIGFzX2ZuX2Vycm9yICQ/ICJDYW5ub3QgbG9jYXRlIHRoZSB0aGUgcGF0aCBvZiBPQkpEVU1QIiAiJExJTkVOTyIgNQorICAgICAgZmkKKyAgICBmaQorICBmaQorCisgICMgTm93IGpvaW4gdG9nZXRoZXIgdGhlIHBhdGggYW5kIHRoZSBhcmd1bWVudHMgb25jZSBhZ2FpbgorICBpZiB0ZXN0ICJ4JGFyZ3VtZW50cyIgIT0geEVPTDsgdGhlbgorICAgICAgbmV3X2NvbXBsZXRlPSIkbmV3X3BhdGggJHthcmd1bWVudHMlICp9IgorICBlbHNlCisgICAgICBuZXdfY29tcGxldGU9IiRuZXdfcGF0aCIKKyAgZmkKKworICBpZiB0ZXN0ICJ4JGNvbXBsZXRlIiAhPSAieCRuZXdfY29tcGxldGUiOyB0aGVuCisgICAgT0JKRFVNUD0iJG5ld19jb21wbGV0ZSIKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFJld3JpdGluZyBPQkpEVU1QIHRvIFwiJG5ld19jb21wbGV0ZVwiIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFJld3JpdGluZyBPQkpEVU1QIHRvIFwiJG5ld19jb21wbGV0ZVwiIiA+JjY7fQorICBmaQogCiBmaQogCkBAIC0xNDIyNCw0NyArMjU4MTcsMjQ1IEBACiAKIAogCi0gICAgIyBUcmFuc2xhdGUgImdjYyAtRSIgaW50byAiYHdoaWNoIGdjY2AgLUUiIGllCi0gICAgIyBleHRyYWN0IHRoZSBmdWxsIHBhdGggdG8gdGhlIGJpbmFyeSBhbmQgYXQgdGhlCi0gICAgIyBzYW1lIHRpbWUgbWFpbnRhaW4gYW55IGFyZ3VtZW50cyBwYXNzZWQgdG8gaXQuCi0gICAgIyBUaGUgY29tbWFuZCBNVVNUIGV4aXN0IGluIHRoZSBwYXRoLCBvciBlbHNlIQotICAgIHRtcD0iJExJUE8iCi0gICAgY2FyPSIke3RtcCUlICp9IgotICAgIHRtcD0iJExJUE8gRU9MIgotICAgIGNkcj0iJHt0bXAjKiB9IgotICAgICMgT24gd2luZG93cyB3ZSB3YW50IHBhdGhzIHdpdGhvdXQgc3BhY2VzLgotICAgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PUyIgPSAieHdpbmRvd3MiOyB0aGVuCisgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLmN5Z3dpbiI7IHRoZW4KIAotICAgICMgVHJhbnNsYXRlIGxvbmcgY3lnZHJpdmUgb3IgQzpcc2Rmc2YgcGF0aAotICAgICMgaW50byBhIHNob3J0IG1peGVkIG1vZGUgcGF0aCB0aGF0IGhhcyBubwotICAgICMgc3BhY2VzIGluIGl0LgotICAgIHRtcD0iJGNhciIKKyAgIyBGaXJzdCBzZXBhcmF0ZSB0aGUgcGF0aCBmcm9tIHRoZSBhcmd1bWVudHMuIFRoaXMgd2lsbCBzcGxpdCBhdCB0aGUgZmlyc3QKKyAgIyBzcGFjZS4KKyAgY29tcGxldGU9IiRMSVBPIgorICBwYXRoPSIke2NvbXBsZXRlJSUgKn0iCisgIHRtcD0iJGNvbXBsZXRlIEVPTCIKKyAgYXJndW1lbnRzPSIke3RtcCMqIH0iCiAKLSAgICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1MiID0gInh3aW5kb3dzIjsgdGhlbgotICAgICAgICB0bXA9YCRDWUdQQVRIIC11ICIkY2FyImAKLSAgICAgICAgdG1wPWB3aGljaCAiJHRtcCJgCi0gICAgICAgICMgSWYgZmlsZSBleGlzdHMgd2l0aCAuZXhlIGFwcGVuZGVkLCB0aGF0J3MgdGhlIHJlYWwgZmlsZW5hbWUKLSAgICAgICAgIyBhbmQgY3lncGF0aCBuZWVkcyB0aGF0IHRvIGNvbnZlcnQgdG8gc2hvcnQgc3R5bGUgcGF0aC4KLSAgICAgICAgaWYgdGVzdCAtZiAiJHt0bXB9LmV4ZSI7IHRoZW4KLSAgICAgICAgICAgdG1wPSIke3RtcH0uZXhlIgotICAgICAgICBlbGlmIHRlc3QgLWYgIiR7dG1wfS5jbWQiOyB0aGVuCi0gICAgICAgICAgIHRtcD0iJHt0bXB9LmNtZCIKKyAgIyBJbnB1dCBtaWdodCBiZSBnaXZlbiBhcyBXaW5kb3dzIGZvcm1hdCwgc3RhcnQgYnkgY29udmVydGluZyB0bworICAjIHVuaXggZm9ybWF0LgorICBuZXdfcGF0aD1gJENZR1BBVEggLXUgIiRwYXRoImAKKworICAjIE5vdyB0cnkgdG8gbG9jYXRlIGV4ZWN1dGFibGUgdXNpbmcgd2hpY2gKKyAgbmV3X3BhdGg9YCRXSElDSCAiJG5ld19wYXRoIiAyPiAvZGV2L251bGxgCisgIGlmIHRlc3QgIngkbmV3X3BhdGgiID0geDsgdGhlbgorICAgICMgT29wcy4gV2hpY2ggZGlkbid0IGZpbmQgdGhlIGV4ZWN1dGFibGUuCisgICAgIyBUaGUgc3BsaXR0aW5nIG9mIGFyZ3VtZW50cyBmcm9tIHRoZSBleGVjdXRhYmxlIGF0IGEgc3BhY2UgbWlnaHQgaGF2ZSBiZWVuIGluY29ycmVjdCwKKyAgICAjIHNpbmNlIHBhdGhzIHdpdGggc3BhY2UgYXJlIG1vcmUgbGlrZWx5IGluIFdpbmRvd3MuIEdpdmUgaXQgYW5vdGhlciB0cnkgd2l0aCB0aGUgd2hvbGUKKyAgICAjIGFyZ3VtZW50LgorICAgIHBhdGg9IiRjb21wbGV0ZSIKKyAgICBhcmd1bWVudHM9IkVPTCIKKyAgICBuZXdfcGF0aD1gJENZR1BBVEggLXUgIiRwYXRoImAKKyAgICBuZXdfcGF0aD1gJFdISUNIICIkbmV3X3BhdGgiIDI+IC9kZXYvbnVsbGAKKyAgICBpZiB0ZXN0ICJ4JG5ld19wYXRoIiA9IHg7IHRoZW4KKyAgICAgICMgSXQncyBzdGlsbCBub3QgZm91bmQuIE5vdyB0aGlzIGlzIGFuIHVucmVjb3ZlcmFibGUgZXJyb3IuCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSBwYXRoIG9mIExJUE8sIHdoaWNoIHJlc29sdmVzIGFzIFwiJGNvbXBsZXRlXCIsIGlzIG5vdCBmb3VuZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhlIHBhdGggb2YgTElQTywgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkY29tcGxldGVcIiwgaXMgbm90IGZvdW5kLiIgPiY2O30KKyAgICAgIGhhc19zcGFjZT1gJEVDSE8gIiRjb21wbGV0ZSIgfCAkR1JFUCAiICJgCisgICAgICBpZiB0ZXN0ICJ4JGhhc19zcGFjZSIgIT0geDsgdGhlbgorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFlvdSBtaWdodCBiZSBtaXhpbmcgc3BhY2VzIGluIHRoZSBwYXRoIGFuZCBleHRyYSBhcmd1bWVudHMsIHdoaWNoIGlzIG5vdCBhbGxvd2VkLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBZb3UgbWlnaHQgYmUgbWl4aW5nIHNwYWNlcyBpbiB0aGUgcGF0aCBhbmQgZXh0cmEgYXJndW1lbnRzLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iID4mNjt9CisgICAgICBmaQorICAgICAgYXNfZm5fZXJyb3IgJD8gIkNhbm5vdCBsb2NhdGUgdGhlIHRoZSBwYXRoIG9mIExJUE8iICIkTElORU5PIiA1CisgICAgZmkKKyAgZmkKKworICAjIEN5Z3dpbiB0cmllcyB0byBoaWRlIHNvbWUgYXNwZWN0cyBvZiB0aGUgV2luZG93cyBmaWxlIHN5c3RlbSwgc3VjaCB0aGF0IGJpbmFyaWVzIGFyZQorICAjIG5hbWVkIC5leGUgYnV0IGNhbGxlZCB3aXRob3V0IHRoYXQgc3VmZml4LiBUaGVyZWZvcmUsICJmb28iIGFuZCAiZm9vLmV4ZSIgYXJlIGNvbnNpZGVyZWQKKyAgIyB0aGUgc2FtZSBmaWxlLCBtb3N0IG9mIHRoZSB0aW1lIChhcyBpbiAidGVzdCAtZiIpLiBCdXQgbm90IHdoZW4gcnVubmluZyBjeWdwYXRoIC1zLCB0aGVuCisgICMgImZvby5leGUiIGlzIE9LIGJ1dCAiZm9vIiBpcyBhbiBlcnJvci4KKyAgIworICAjIFRoaXMgdGVzdCBpcyB0aGVyZWZvcmUgc2xpZ2h0bHkgbW9yZSBhY2N1cmF0ZSB0aGFuICJ0ZXN0IC1mIiB0byBjaGVjayBmb3IgZmlsZSBwcmVjZW5zZS4KKyAgIyBJdCBpcyBhbHNvIGEgd2F5IHRvIG1ha2Ugc3VyZSB3ZSBnb3QgdGhlIHByb3BlciBmaWxlIG5hbWUgZm9yIHRoZSByZWFsIHRlc3QgbGF0ZXIgb24uCisgIHRlc3Rfc2hvcnRwYXRoPWAkQ1lHUEFUSCAtcyAtbSAiJG5ld19wYXRoIiAyPiAvZGV2L251bGxgCisgIGlmIHRlc3QgIngkdGVzdF9zaG9ydHBhdGgiID0geDsgdGhlbgorICAgICMgU2hvcnQgcGF0aCBmYWlsZWQsIGZpbGUgZG9lcyBub3QgZXhpc3QgYXMgc3BlY2lmaWVkLgorICAgICMgVHJ5IGFkZGluZyAuZXhlIG9yIC5jbWQKKyAgICBpZiB0ZXN0IC1mICIke25ld19wYXRofS5leGUiOyB0aGVuCisgICAgICAgaW5wdXRfdG9fc2hvcnRwYXRoPSIke25ld19wYXRofS5leGUiCisgICAgZWxpZiB0ZXN0IC1mICIke25ld19wYXRofS5jbWQiOyB0aGVuCisgICAgICAgaW5wdXRfdG9fc2hvcnRwYXRoPSIke25ld19wYXRofS5jbWQiCisgICAgZWxzZQorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUaGUgcGF0aCBvZiBMSVBPLCB3aGljaCByZXNvbHZlcyBhcyBcIiRuZXdfcGF0aFwiLCBpcyBpbnZhbGlkLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUaGUgcGF0aCBvZiBMSVBPLCB3aGljaCByZXNvbHZlcyBhcyBcIiRuZXdfcGF0aFwiLCBpcyBpbnZhbGlkLiIgPiY2O30KKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogTmVpdGhlciBcIiRuZXdfcGF0aFwiIG5vciBcIiRuZXdfcGF0aC5leGUvY21kXCIgY2FuIGJlIGZvdW5kIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IE5laXRoZXIgXCIkbmV3X3BhdGhcIiBub3IgXCIkbmV3X3BhdGguZXhlL2NtZFwiIGNhbiBiZSBmb3VuZCIgPiY2O30KKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJDYW5ub3QgbG9jYXRlIHRoZSB0aGUgcGF0aCBvZiBMSVBPIiAiJExJTkVOTyIgNQorICAgIGZpCisgIGVsc2UKKyAgICBpbnB1dF90b19zaG9ydHBhdGg9IiRuZXdfcGF0aCIKKyAgZmkKKworICAjIENhbGwgaGVscGVyIGZ1bmN0aW9uIHdoaWNoIHBvc3NpYmx5IGNvbnZlcnRzIHRoaXMgdXNpbmcgRE9TLXN0eWxlIHNob3J0IG1vZGUuCisgICMgSWYgc28sIHRoZSB1cGRhdGVkIHBhdGggaXMgc3RvcmVkIGluICRuZXdfcGF0aC4KKyAgbmV3X3BhdGg9IiRpbnB1dF90b19zaG9ydHBhdGgiCisKKyAgaW5wdXRfcGF0aD0iJGlucHV0X3RvX3Nob3J0cGF0aCIKKyAgIyBDaGVjayBpZiB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhpcyB1c2luZyBET1Mtc3R5bGUgc2hvcnQgbW9kZS4gSWYgdGhlIHBhdGgKKyAgIyBjb250YWlucyBqdXN0IHNpbXBsZSBjaGFyYWN0ZXJzLCB1c2UgaXQuIE90aGVyd2lzZSAoc3BhY2VzLCB3ZWlyZCBjaGFyYWN0ZXJzKSwKKyAgIyB0YWtlIG5vIGNoYW5jZXMgYW5kIHJld3JpdGUgaXQuCisgICMgTm90ZTogbTQgZWF0cyBvdXIgW10sIHNvIHdlIG5lZWQgdG8gdXNlIFsgYW5kIF0gaW5zdGVhZC4KKyAgaGFzX2ZvcmJpZGRlbl9jaGFycz1gJEVDSE8gIiRpbnB1dF9wYXRoIiB8ICRHUkVQIFteLS5fL2EtekEtWjAtOV1gCisgIGlmIHRlc3QgIngkaGFzX2ZvcmJpZGRlbl9jaGFycyIgIT0geDsgdGhlbgorICAgICMgTm93IGNvbnZlcnQgaXQgdG8gbWl4ZWQgRE9TLXN0eWxlLCBzaG9ydCBtb2RlIChubyBzcGFjZXMsIGFuZCAvIGluc3RlYWQgb2YgXCkKKyAgICBzaG9ydG1vZGVfcGF0aD1gJENZR1BBVEggLXMgLW0gLWEgIiRpbnB1dF9wYXRoImAKKyAgICBwYXRoX2FmdGVyX3Nob3J0bW9kZT1gJENZR1BBVEggLXUgIiRzaG9ydG1vZGVfcGF0aCJgCisgICAgaWYgdGVzdCAieCRwYXRoX2FmdGVyX3Nob3J0bW9kZSIgIT0gIngkaW5wdXRfdG9fc2hvcnRwYXRoIjsgdGhlbgorICAgICAgIyBHb2luZyB0byBzaG9ydCBtb2RlIGFuZCBiYWNrIGFnYWluIGRpZCBpbmRlZWQgbWF0dGVyLiBTaW5jZSBzaG9ydCBtb2RlIGlzCisgICAgICAjIGNhc2UgaW5zZW5zaXRpdmUsIGxldCdzIG1ha2UgaXQgbG93ZXJjYXNlIHRvIGltcHJvdmUgcmVhZGFiaWxpdHkuCisgICAgICBzaG9ydG1vZGVfcGF0aD1gJEVDSE8gIiRzaG9ydG1vZGVfcGF0aCIgfCAkVFIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAorICAgICAgIyBOb3cgY29udmVydCBpdCBiYWNrIHRvIFVuaXgtc3RpbGUgKGN5Z3BhdGgpCisgICAgICBpbnB1dF9wYXRoPWAkQ1lHUEFUSCAtdSAiJHNob3J0bW9kZV9wYXRoImAKKyAgICAgIG5ld19wYXRoPSIkaW5wdXRfcGF0aCIKKyAgICBmaQorICBmaQorCisgIHRlc3RfY3lnZHJpdmVfcHJlZml4PWAkRUNITyAkaW5wdXRfcGF0aCB8ICRHUkVQIF4vY3lnZHJpdmUvYAorICBpZiB0ZXN0ICJ4JHRlc3RfY3lnZHJpdmVfcHJlZml4IiA9IHg7IHRoZW4KKyAgICAjIEFzIGEgc2ltcGxlIGZpeCwgZXhjbHVkZSAvdXNyL2JpbiBzaW5jZSBpdCdzIG5vdCBhIHJlYWwgcGF0aC4KKyAgICBpZiB0ZXN0ICJ4YCRFQ0hPICRpbnB1dF90b19zaG9ydHBhdGggfCAkR1JFUCBeL3Vzci9iaW4vYCIgPSB4OyB0aGVuCisgICAgICAjIFRoZSBwYXRoIGlzIGluIGEgQ3lnd2luIHNwZWNpYWwgZGlyZWN0b3J5IChlLmcuIC9ob21lKS4gV2UgbmVlZCB0aGlzIGNvbnZlcnRlZCB0bworICAgICAgIyBhIHBhdGggcHJlZml4ZWQgYnkgL2N5Z2RyaXZlIGZvciBmaXhwYXRoIHRvIHdvcmsuCisgICAgICBuZXdfcGF0aD0iJENZR1dJTl9ST09UX1BBVEgkaW5wdXRfcGF0aCIKKyAgICBmaQorICBmaQorCisgICMgcmVtb3ZlIHRyYWlsaW5nIC5leGUgaWYgYW55CisgIG5ld19wYXRoPSIke25ld19wYXRoLyUuZXhlL30iCisKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorCisgICMgRmlyc3Qgc2VwYXJhdGUgdGhlIHBhdGggZnJvbSB0aGUgYXJndW1lbnRzLiBUaGlzIHdpbGwgc3BsaXQgYXQgdGhlIGZpcnN0CisgICMgc3BhY2UuCisgIGNvbXBsZXRlPSIkTElQTyIKKyAgcGF0aD0iJHtjb21wbGV0ZSUlICp9IgorICB0bXA9IiRjb21wbGV0ZSBFT0wiCisgIGFyZ3VtZW50cz0iJHt0bXAjKiB9IgorCisgICMgSW5wdXQgbWlnaHQgYmUgZ2l2ZW4gYXMgV2luZG93cyBmb3JtYXQsIHN0YXJ0IGJ5IGNvbnZlcnRpbmcgdG8KKyAgIyB1bml4IGZvcm1hdC4KKyAgbmV3X3BhdGg9IiRwYXRoIgorCisgIHdpbmRvd3NfcGF0aD0iJG5ld19wYXRoIgorICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5jeWd3aW4iOyB0aGVuCisgICAgdW5peF9wYXRoPWAkQ1lHUEFUSCAtdSAiJHdpbmRvd3NfcGF0aCJgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGVsaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MubXN5cyI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRFQ0hPICIkd2luZG93c19wYXRoIiB8ICRTRUQgLWUgJ3MsXlxcKC5cXCk6LC9cXDEsZycgLWUgJ3MsXFxcXCwvLGcnYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBmaQorCisKKyAgIyBOb3cgdHJ5IHRvIGxvY2F0ZSBleGVjdXRhYmxlIHVzaW5nIHdoaWNoCisgIG5ld19wYXRoPWAkV0hJQ0ggIiRuZXdfcGF0aCIgMj4gL2Rldi9udWxsYAorCisgIGlmIHRlc3QgIngkbmV3X3BhdGgiID0geDsgdGhlbgorICAgICMgT29wcy4gV2hpY2ggZGlkbid0IGZpbmQgdGhlIGV4ZWN1dGFibGUuCisgICAgIyBUaGUgc3BsaXR0aW5nIG9mIGFyZ3VtZW50cyBmcm9tIHRoZSBleGVjdXRhYmxlIGF0IGEgc3BhY2UgbWlnaHQgaGF2ZSBiZWVuIGluY29ycmVjdCwKKyAgICAjIHNpbmNlIHBhdGhzIHdpdGggc3BhY2UgYXJlIG1vcmUgbGlrZWx5IGluIFdpbmRvd3MuIEdpdmUgaXQgYW5vdGhlciB0cnkgd2l0aCB0aGUgd2hvbGUKKyAgICAjIGFyZ3VtZW50LgorICAgIHBhdGg9IiRjb21wbGV0ZSIKKyAgICBhcmd1bWVudHM9IkVPTCIKKyAgICBuZXdfcGF0aD0iJHBhdGgiCisKKyAgd2luZG93c19wYXRoPSIkbmV3X3BhdGgiCisgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLmN5Z3dpbiI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRDWUdQQVRIIC11ICIkd2luZG93c19wYXRoImAKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJEVDSE8gIiR3aW5kb3dzX3BhdGgiIHwgJFNFRCAtZSAncyxeXFwoLlxcKTosL1xcMSxnJyAtZSAncyxcXFxcLC8sZydgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGZpCisKKworICAgIG5ld19wYXRoPWAkV0hJQ0ggIiRuZXdfcGF0aCIgMj4gL2Rldi9udWxsYAorCisgICAgaWYgdGVzdCAieCRuZXdfcGF0aCIgPSB4OyB0aGVuCisgICAgICAjIEl0J3Mgc3RpbGwgbm90IGZvdW5kLiBOb3cgdGhpcyBpcyBhbiB1bnJlY292ZXJhYmxlIGVycm9yLgorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUaGUgcGF0aCBvZiBMSVBPLCB3aGljaCByZXNvbHZlcyBhcyBcIiRjb21wbGV0ZVwiLCBpcyBub3QgZm91bmQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoZSBwYXRoIG9mIExJUE8sIHdoaWNoIHJlc29sdmVzIGFzIFwiJGNvbXBsZXRlXCIsIGlzIG5vdCBmb3VuZC4iID4mNjt9CisgICAgICBoYXNfc3BhY2U9YCRFQ0hPICIkY29tcGxldGUiIHwgJEdSRVAgIiAiYAorICAgICAgaWYgdGVzdCAieCRoYXNfc3BhY2UiICE9IHg7IHRoZW4KKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBZb3UgbWlnaHQgYmUgbWl4aW5nIHNwYWNlcyBpbiB0aGUgcGF0aCBhbmQgZXh0cmEgYXJndW1lbnRzLCB3aGljaCBpcyBub3QgYWxsb3dlZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogWW91IG1pZ2h0IGJlIG1peGluZyBzcGFjZXMgaW4gdGhlIHBhdGggYW5kIGV4dHJhIGFyZ3VtZW50cywgd2hpY2ggaXMgbm90IGFsbG93ZWQuIiA+JjY7fQorICAgICAgZmkKKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJDYW5ub3QgbG9jYXRlIHRoZSB0aGUgcGF0aCBvZiBMSVBPIiAiJExJTkVOTyIgNQorICAgIGZpCisgIGZpCisKKyAgIyBOb3cgbmV3X3BhdGggaGFzIGEgY29tcGxldGUgdW5peCBwYXRoIHRvIHRoZSBiaW5hcnkKKyAgaWYgdGVzdCAieGAkRUNITyAkbmV3X3BhdGggfCAkR1JFUCBeL2Jpbi9gIiAhPSB4OyB0aGVuCisgICAgIyBLZWVwIHBhdGhzIGluIC9iaW4gYXMtaXMsIGJ1dCByZW1vdmUgdHJhaWxpbmcgLmV4ZSBpZiBhbnkKKyAgICBuZXdfcGF0aD0iJHtuZXdfcGF0aC8lLmV4ZS99IgorICAgICMgRG8gbm90IHNhdmUgL2JpbiBwYXRocyB0byBhbGxfZml4cGF0aF9wcmVmaXhlcyEKKyAgZWxzZQorICAgICMgTm90IGluIG1peGVkIG9yIFdpbmRvd3Mgc3R5bGUsIHN0YXJ0IGJ5IHRoYXQuCisgICAgbmV3X3BhdGg9YGNtZCAvL2MgZWNobyAkbmV3X3BhdGhgCisKKyAgaW5wdXRfcGF0aD0iJG5ld19wYXRoIgorICAjIENoZWNrIGlmIHdlIG5lZWQgdG8gY29udmVydCB0aGlzIHVzaW5nIERPUy1zdHlsZSBzaG9ydCBtb2RlLiBJZiB0aGUgcGF0aAorICAjIGNvbnRhaW5zIGp1c3Qgc2ltcGxlIGNoYXJhY3RlcnMsIHVzZSBpdC4gT3RoZXJ3aXNlIChzcGFjZXMsIHdlaXJkIGNoYXJhY3RlcnMpLAorICAjIHRha2Ugbm8gY2hhbmNlcyBhbmQgcmV3cml0ZSBpdC4KKyAgIyBOb3RlOiBtNCBlYXRzIG91ciBbXSwgc28gd2UgbmVlZCB0byB1c2UgWyBhbmQgXSBpbnN0ZWFkLgorICBoYXNfZm9yYmlkZGVuX2NoYXJzPWAkRUNITyAiJGlucHV0X3BhdGgiIHwgJEdSRVAgW14tXy86YS16QS1aMC05XWAKKyAgaWYgdGVzdCAieCRoYXNfZm9yYmlkZGVuX2NoYXJzIiAhPSB4OyB0aGVuCisgICAgIyBOb3cgY29udmVydCBpdCB0byBtaXhlZCBET1Mtc3R5bGUsIHNob3J0IG1vZGUgKG5vIHNwYWNlcywgYW5kIC8gaW5zdGVhZCBvZiBcKQorICAgIG5ld19wYXRoPWBjbWQgL2MgImZvciAlQSBpbiAoXCIkaW5wdXRfcGF0aFwiKSBkbyBAZWNobyAlfnNBInwkVFIgXFxcXFxcXFwgLyB8ICRUUiAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidgCisgIGZpCisKKyAgICAjIE91dHB1dCBpcyBpbiAkbmV3X3BhdGgKKworICB3aW5kb3dzX3BhdGg9IiRuZXdfcGF0aCIKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJENZR1BBVEggLXUgIiR3aW5kb3dzX3BhdGgiYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBlbGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLm1zeXMiOyB0aGVuCisgICAgdW5peF9wYXRoPWAkRUNITyAiJHdpbmRvd3NfcGF0aCIgfCAkU0VEIC1lICdzLF5cXCguXFwpOiwvXFwxLGcnIC1lICdzLFxcXFwsLyxnJ2AKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZmkKKworICAgICMgcmVtb3ZlIHRyYWlsaW5nIC5leGUgaWYgYW55CisgICAgbmV3X3BhdGg9IiR7bmV3X3BhdGgvJS5leGUvfSIKKworICAgICMgU2F2ZSB0aGUgZmlyc3QgMTAgYnl0ZXMgb2YgdGhpcyBwYXRoIHRvIHRoZSBzdG9yYWdlLCBzbyBmaXhwYXRoIGNhbiB3b3JrLgorICAgIGFsbF9maXhwYXRoX3ByZWZpeGVzPSgiJHthbGxfZml4cGF0aF9wcmVmaXhlc1tAXX0iICIke25ld19wYXRoOjA6MTB9IikKKyAgZmkKKworICBlbHNlCisgICAgIyBXZSdyZSBvbiBhIHBvc2l4IHBsYXRmb3JtLiBIb29yYXkhIDopCisgICAgIyBGaXJzdCBzZXBhcmF0ZSB0aGUgcGF0aCBmcm9tIHRoZSBhcmd1bWVudHMuIFRoaXMgd2lsbCBzcGxpdCBhdCB0aGUgZmlyc3QKKyAgICAjIHNwYWNlLgorICAgIGNvbXBsZXRlPSIkTElQTyIKKyAgICBwYXRoPSIke2NvbXBsZXRlJSUgKn0iCisgICAgdG1wPSIkY29tcGxldGUgRU9MIgorICAgIGFyZ3VtZW50cz0iJHt0bXAjKiB9IgorCisgICAgbmV3X3BhdGg9YCRXSElDSCAkcGF0aCAyPiAvZGV2L251bGxgCisgICAgaWYgdGVzdCAieCRuZXdfcGF0aCIgPSB4OyB0aGVuCisgICAgICBpc19hYnNvbHV0ZV9wYXRoPWAkRUNITyAiJHBhdGgiIHwgJEdSRVAgXi9gCisgICAgICBpZiB0ZXN0ICJ4JGlzX2Fic29sdXRlX3BhdGgiICE9IHg7IHRoZW4KKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBSZXNvbHZpbmcgTElQTyAoYXMgJHBhdGgpIHdpdGggJ3doaWNoJyBmYWlsZWQsIHVzaW5nICRwYXRoIGRpcmVjdGx5LiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBSZXNvbHZpbmcgTElQTyAoYXMgJHBhdGgpIHdpdGggJ3doaWNoJyBmYWlsZWQsIHVzaW5nICRwYXRoIGRpcmVjdGx5LiIgPiY2O30KKyAgICAgICAgbmV3X3BhdGg9IiRwYXRoIgorICAgICAgZWxzZQorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSBwYXRoIG9mIExJUE8sIHdoaWNoIHJlc29sdmVzIGFzIFwiJGNvbXBsZXRlXCIsIGlzIG5vdCBmb3VuZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhlIHBhdGggb2YgTElQTywgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkY29tcGxldGVcIiwgaXMgbm90IGZvdW5kLiIgPiY2O30KKyAgICAgICAgaGFzX3NwYWNlPWAkRUNITyAiJGNvbXBsZXRlIiB8ICRHUkVQICIgImAKKyAgICAgICAgaWYgdGVzdCAieCRoYXNfc3BhY2UiICE9IHg7IHRoZW4KKyAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoaXMgbWlnaHQgYmUgY2F1c2VkIGJ5IHNwYWNlcyBpbiB0aGUgcGF0aCwgd2hpY2ggaXMgbm90IGFsbG93ZWQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoaXMgbWlnaHQgYmUgY2F1c2VkIGJ5IHNwYWNlcyBpbiB0aGUgcGF0aCwgd2hpY2ggaXMgbm90IGFsbG93ZWQuIiA+JjY7fQogICAgICAgICBmaQotICAgICAgICAjIENvbnZlcnQgdG8gQzovIG1peGVkIHN0eWxlIHBhdGggd2l0aG91dCBzcGFjZXMuCi0gICAgICAgICB0bXA9YCRDWUdQQVRIIC1zIC1tICIkdG1wImAKKyAgICAgICAgYXNfZm5fZXJyb3IgJD8gIkNhbm5vdCBsb2NhdGUgdGhlIHRoZSBwYXRoIG9mIExJUE8iICIkTElORU5PIiA1CisgICAgICBmaQogICAgIGZpCi0gICAgY2FyPSIkdG1wIgorICBmaQogCi0gICAgZWxzZQotICAgICAgICAjICJ3aGljaCIgaXMgbm90IHBvcnRhYmxlLCBidXQgaXMgdXNlZCBoZXJlCi0gICAgICAgICMgYmVjYXVzZSB3ZSBrbm93IHRoYXQgdGhlIGNvbW1hbmQgZXhpc3RzIQotICAgICAgICBjYXI9YHdoaWNoICRjYXJgCi0gICAgZmkKLSAgICBpZiB0ZXN0ICJ4JGNkciIgIT0geEVPTDsgdGhlbgotICAgICAgICBMSVBPPSIkY2FyICR7Y2RyJSAqfSIKLSAgICBlbHNlCi0gICAgICAgIExJUE89IiRjYXIiCi0gICAgZmkKKyAgIyBOb3cgam9pbiB0b2dldGhlciB0aGUgcGF0aCBhbmQgdGhlIGFyZ3VtZW50cyBvbmNlIGFnYWluCisgIGlmIHRlc3QgIngkYXJndW1lbnRzIiAhPSB4RU9MOyB0aGVuCisgICAgICBuZXdfY29tcGxldGU9IiRuZXdfcGF0aCAke2FyZ3VtZW50cyUgKn0iCisgIGVsc2UKKyAgICAgIG5ld19jb21wbGV0ZT0iJG5ld19wYXRoIgorICBmaQorCisgIGlmIHRlc3QgIngkY29tcGxldGUiICE9ICJ4JG5ld19jb21wbGV0ZSI7IHRoZW4KKyAgICBMSVBPPSIkbmV3X2NvbXBsZXRlIgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogUmV3cml0aW5nIExJUE8gdG8gXCIkbmV3X2NvbXBsZXRlXCIiID4mNQorJGFzX2VjaG8gIiRhc19tZTogUmV3cml0aW5nIExJUE8gdG8gXCIkbmV3X2NvbXBsZXRlXCIiID4mNjt9CisgIGZpCiAKIGZpCiAKQEAgLTE0ODAwLDcgKzI2NTkxLDcgQEAKICAgICBQT1NUX1NUUklQX0NNRD0iJFNUUklQIC1nIgogCiAgICAgIyBMaW5raW5nIGlzIGRpZmZlcmVudCBvbiBNYWNPU1gKLSAgICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1MiID0geG1hY29zeDsgdGhlbgorICAgIGlmIHRlc3QgIngkT1BFTkpES19UQVJHRVRfT1MiID0geG1hY29zeDsgdGhlbgogICAgICAgICAjIE1pZ2h0IGNoYW5nZSBpbiB0aGUgZnV0dXJlIHRvIGNsYW5nLgogICAgICAgICBDT01QSUxFUl9OQU1FPWdjYwogICAgICAgICBTSEFSRURfTElCUkFSWT0nbGliJDEuZHlsaWInCkBAIC0xNDgxNCw3ICsyNjYwNSw3IEBACiAgICAgICAgIFBPU1RfU1RSSVBfQ01EPSIkU1RSSVAgLVMiCiAgICAgZmkKIGVsc2UKLSAgICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1MiID0geHNvbGFyaXM7IHRoZW4KKyAgICBpZiB0ZXN0ICJ4JE9QRU5KREtfVEFSR0VUX09TIiA9IHhzb2xhcmlzOyB0aGVuCiAgICAgICAgICMgSWYgaXQgaXMgbm90IGdjYywgdGhlbiBhc3N1bWUgaXQgaXMgdGhlIE9yYWNsZSBTb2xhcmlzIFN0dWRpbyBDb21waWxlcgogICAgICAgICBDT01QSUxFUl9OQU1FPW9zc2MKICAgICAgICAgUElDRkxBRz0iLUtQSUMiCkBAIC0xNDgzOCw3ICsyNjYyOSw3IEBACiAgICAgICAgIFBPU1RfU1RSSVBfQ01EPSIkU1RSSVAgLXgiCiAgICAgICAgIFBPU1RfTUNTX0NNRD0iJE1DUyAtZCAtYSBcIkpESyAkRlVMTF9WRVJTSU9OXCIiCiAgICAgZmkKLSAgICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1MiID0geHdpbmRvd3M7IHRoZW4KKyAgICBpZiB0ZXN0ICJ4JE9QRU5KREtfVEFSR0VUX09TIiA9IHh3aW5kb3dzOyB0aGVuCiAgICAgICAgICMgSWYgaXQgaXMgbm90IGdjYywgdGhlbiBhc3N1bWUgaXQgaXMgdGhlIE1TIFZpc3VhbCBTdHVkaW8gY29tcGlsZXIKICAgICAgICAgQ09NUElMRVJfTkFNRT1jbAogICAgICAgICBQSUNGTEFHPSIiCkBAIC0xNDk4Niw2ICsyNjc3NywxMSBAQAogICAgICAgICAjICBDYW4gY2F1c2UgdW5kZWZpbmVkIGV4dGVybmFsIG9uIFNvbGFyaXMgOCBYODYgb24gX19zaW5jb3MsIHJlbW92aW5nIGZvciBub3cKICAgICAgICAgI0NDX0hJR0hFU1Q9IiRDQ19ISUdIRVNUIC14bGlibW9wdCIKIAorICAgICAgICBpZiB0ZXN0ICJ4JE9QRU5KREtfVEFSR0VUX0NQVSIgPSB4c3BhcmM7IHRoZW4KKyAgICAgICAgICBDRkxBR1NfSkRLPSIke0NGTEFHU19KREt9IC14bWVtYWxpZ249NHMiCisgICAgICAgICAgQ1hYRkxBR1NfSkRLPSIke0NYWEZMQUdTX0pES30gLXhtZW1hbGlnbj00cyIKKyAgICAgICAgZmkKKwogICAgICAgICBjYXNlICRPUEVOSkRLX1RBUkdFVF9DUFVfQVJDSCBpbgogICAgICAgICAgIHg4NikKICAgICAgICAgICAgIENfT19GTEFHX0hJR0hFU1Q9Ii14TzQgLVd1LC1PNH55eiAkQ0NfSElHSEVTVCAteHJlZ3M9bm8lZnJhbWVwdHIiCkBAIC0xNTAwMiw4ICsyNjc5OCw2IEBACiAgICAgICAgICAgICBmaQogICAgICAgICAgICAgOzsKICAgICAgICAgICBzcGFyYykKLSAgICAgICAgICAgIENGTEFHU19KREs9IiR7Q0ZMQUdTX0pES30gLXhtZW1hbGlnbj00cyIKLSAgICAgICAgICAgIENYWEZMQUdTX0pESz0iJHtDWFhGTEFHU19KREt9IC14bWVtYWxpZ249NHMiCiAgICAgICAgICAgICBDRkxBR1NfSkRLTElCX0VYVFJBPSIke0NGTEFHU19KREtMSUJfRVhUUkF9IC14cmVncz1ubyVhcHBsIgogICAgICAgICAgICAgQ1hYRkxBR1NfSkRLTElCX0VYVFJBPSIke0NYWEZMQUdTX0pES0xJQl9FWFRSQX0gLXhyZWdzPW5vJWFwcGwiCiAgICAgICAgICAgICBDX09fRkxBR19ISUdIRVNUPSIteE80IC1XYywtUXJtLXMgLVdjLC1RaXNlbGVjdC1UMCAkQ0NfSElHSEVTVCAteHByZWZldGNoPWF1dG8sZXhwbGljaXQgLXhjaGlwPXVsdHJhIgpAQCAtMTUxMzIsNyArMjY5MjYsNyBAQAogICAgICAgICAgIENDWFhGTEFHU19KREs9IiRDQ1hYRkxBR1MgJENDWFhGTEFHU19KREsgLURUUkFDSU5HIC1ETUFDUk9fTUVNU1lTX09QUyAtREJSRUFLUFRTIgogICAgICAgICAgIGNhc2UgJE9QRU5KREtfVEFSR0VUX0NQVV9BUkNIIGluCiAgICAgICAgICAgeDg2ICkKLSAgICAgICAgICAgIENDWFhGTEFHU19KREs9IiRDQ1hYRkxBR1NfSkRLIC1EY3B1SW50ZWwgLURpNTg2IC1EaTM4NiIKKyAgICAgICAgICAgIENDWFhGTEFHU19KREs9IiRDQ1hYRkxBR1NfSkRLIC1EY3B1SW50ZWwgLURpNTg2IC1EJE9QRU5KREtfVEFSR0VUX0NQVV9MRUdBQ1lfTElCIgogICAgICAgIAkgICAgQ0ZMQUdTX0pESz0iJENGTEFHU19KREsgLWVycm9mZj1FX0JBRF9QUkFHTUFfUEFDS19WQUxVRSIKICAgICAgICAgICA7OwogICAgICAgICAgIGVzYWMKQEAgLTE1MjMyLDcgKzI3MDI2LDcgQEAKICMgbGlicmFyaWVzIHdpbGwgbGluayB0byB3aGF0ZXZlciBpcyBpbiBtZW1vcnkuIFl1Y2suCiAjCiAjIFRodXMgd2Ugb2ZmZXIgdGhlIGNvbXBpbGVyIHRvIGZpbmQgbGlianZtLnNvIGZpcnN0IGluIHNlcnZlciB0aGVuIGluIGNsaWVudC4gSXQgd29ya3MuIFVnaC4KLWlmIHRlc3QgIngkQ09NUElMRVJfVFlQRSIgPSB4Q0w7IHRoZW4KK2lmIHRlc3QgIngkQ09NUElMRVJfTkFNRSIgPSB4Y2w7IHRoZW4KICAgICBMREZMQUdTX0pESz0iJExERkxBR1NfSkRLIC1ub2xvZ28gLW9wdDpyZWYgLWluY3JlbWVudGFsOm5vIgogICAgIGlmIHRlc3QgIngkT1BFTkpES19UQVJHRVRfQ1BVIiA9IHh4ODY7IHRoZW4KICAgICAgICAgTERGTEFHU19KREs9IiRMREZMQUdTX0pESyAtc2FmZXNlaCIKQEAgLTE1MjQ4LDE5ICsyNzA0MiwyMyBAQAogICAgIGZpCiAgICAgTERGTEFHU19KREtFWEU9IiR7TERGTEFHU19KREt9IC9TVEFDSzokTERGTEFHU19TVEFDS19TSVpFIgogZWxzZQotICAgICMgSWYgdGhpcyBpcyBhIC0taGFzaC1zdHlsZT1nbnUgc3lzdGVtLCB1c2UgLS1oYXNoLXN0eWxlPWJvdGgsIHdoeT8KLSAgICBIQVNfR05VX0hBU0g9YCRDQyAtZHVtcHNwZWNzIDI+L2Rldi9udWxsIHwgJEdSRVAgJ2hhc2gtc3R5bGU9Z251J2AKLSAgICBpZiB0ZXN0IC1uICIkSEFTX0dOVV9IQVNIIjsgdGhlbgotICAgICAgICAjIEFuZCBzaW5jZSB3ZSBub3cga25vdyB0aGF0IHRoZSBsaW5rZXIgaXMgZ251LCB0aGVuIGFkZCAteiBkZWZzLCB0byBmb3JiaWQKLSAgICAgICAgIyB1bmRlZmluZWQgc3ltYm9scyBpbiBvYmplY3QgZmlsZXMuCi0gICAgICAgIExERkxBR1NfSkRLPSIke0xERkxBR1NfSkRLfSAtWGxpbmtlciAtLWhhc2gtc3R5bGU9Ym90aCAtWGxpbmtlciAteiAtWGxpbmtlciBkZWZzIgotICAgICAgICBpZiB0ZXN0ICJ4JERFQlVHX0xFVkVMIiA9PSAieHJlbGVhc2UiOyB0aGVuCi0gICAgICAgICAgICAjIFdoZW4gYnVpbGRpbmcgcmVsZWFzZSBsaWJyYXJpZXMsIHRlbGwgdGhlIGxpbmtlciBvcHRpbWl6ZSB0aGVtLgotICAgICAgICAgICAgIyBTaG91bGQgdGhpcyBiZSBzdXBwbGllZCB0byB0aGUgT1NTIGxpbmtlciBhcyB3ZWxsPwotICAgICAgICAgICAgTERGTEFHU19KREs9IiR7TERGTEFHU19KREt9IC1YbGlua2VyIC1PMSIKKyAgICBpZiB0ZXN0ICJ4JENPTVBJTEVSX05BTUUiID0geGdjYzsgdGhlbgorICAgICAgICAjIElmIHRoaXMgaXMgYSAtLWhhc2gtc3R5bGU9Z251IHN5c3RlbSwgdXNlIC0taGFzaC1zdHlsZT1ib3RoLCB3aHk/CisgICAgICAgIEhBU19HTlVfSEFTSD1gJENDIC1kdW1wc3BlY3MgMj4vZGV2L251bGwgfCAkR1JFUCAnaGFzaC1zdHlsZT1nbnUnYAorICAgICAgICBpZiB0ZXN0IC1uICIkSEFTX0dOVV9IQVNIIjsgdGhlbgorICAgICAgICAgICAgTERGTEFHU19KREs9IiR7TERGTEFHU19KREt9IC1YbGlua2VyIC0taGFzaC1zdHlsZT1ib3RoICIKKyAgICAgICAgZmkKKyAgICAgICAgaWYgdGVzdCAieCRPUEVOSkRLX1RBUkdFVF9PUyIgPSB4bGludXg7IHRoZW4KKyAgICAgICAgICAjIEFuZCBzaW5jZSB3ZSBub3cga25vdyB0aGF0IHRoZSBsaW5rZXIgaXMgZ251LCB0aGVuIGFkZCAteiBkZWZzLCB0byBmb3JiaWQKKyAgICAgICAgICAjIHVuZGVmaW5lZCBzeW1ib2xzIGluIG9iamVjdCBmaWxlcy4KKyAgICAgICAgICBMREZMQUdTX0pESz0iJHtMREZMQUdTX0pES30gLVhsaW5rZXIgLXogLVhsaW5rZXIgZGVmcyIKKyAgICAgICAgICBpZiB0ZXN0ICJ4JERFQlVHX0xFVkVMIiA9ICJ4cmVsZWFzZSI7IHRoZW4KKyAgICAgICAgICAgICAgIyBXaGVuIGJ1aWxkaW5nIHJlbGVhc2UgbGlicmFyaWVzLCB0ZWxsIHRoZSBsaW5rZXIgb3B0aW1pemUgdGhlbS4KKyAgICAgICAgICAgICAgIyBTaG91bGQgdGhpcyBiZSBzdXBwbGllZCB0byB0aGUgT1NTIGxpbmtlciBhcyB3ZWxsPworICAgICAgICAgICAgICBMREZMQUdTX0pESz0iJHtMREZMQUdTX0pES30gLVhsaW5rZXIgLU8xIgorICAgICAgICAgIGZpCiAgICAgICAgIGZpCiAgICAgZmkKLQogICAgIExERkxBR1NfSkRLTElCPSIke0xERkxBR1NfSkRLfSAkU0hBUkVEX0xJQlJBUllfRkxBR1MgXAogICAgICAgICAgICAgICAgICAgICAtTCR7SkRLX09VVFBVVERJUn0vbGliJHtPUEVOSkRLX1RBUkdFVF9DUFVfTElCRElSfS9zZXJ2ZXIgXAogICAgICAgICAgICAgICAgICAgICAtTCR7SkRLX09VVFBVVERJUn0vbGliJHtPUEVOSkRLX1RBUkdFVF9DUFVfTElCRElSfS9jbGllbnQgXApAQCAtMTUzMDcsNTMgKzI3MTA1LDYgQEAKIAogCiAKLSMgQWZ0ZXIgd2UgaGF2ZSB0b29sY2hhaW4sIHdlIGNhbiBjb21waWxlIHRoZSB1bmN5Z2RyaXZlIGhlbHBlcgotCi0jIFdoZW4gdXNpbmcgY3lnd2luLCB3ZSBuZWVkIGEgd3JhcHBlciBiaW5hcnkgdGhhdCByZW5hbWVzCi0jIC9jeWdkcml2ZS9jLyBhcmd1bWVudHMgaW50byBjOi8gYXJndW1lbnRzIGFuZCBwZWVrcyBpbnRvCi0jIEBmaWxlcyBhbmQgcmV3cml0ZXMgdGhlc2UgdG9vISBUaGlzIHdyYXBwZXIgYmluYXJ5IGlzCi0jIGNhbGxlZCB1bmN5Z2RyaXZlLmV4ZS4KLVVOQ1lHRFJJVkU9Ci1pZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1MiID0geHdpbmRvd3M7IHRoZW4KLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmIHVuY3lnZHJpdmUgY2FuIGJlIGNyZWF0ZWQiID4mNQotJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgdW5jeWdkcml2ZSBjYW4gYmUgY3JlYXRlZC4uLiAiID4mNjsgfQotICAgIFVOQ1lHRFJJVkVfU1JDPWAkQ1lHUEFUSCAtbSAkU1JDX1JPT1QvY29tbW9uL3NyYy91bmN5Z2RyaXZlLmNgCi0gICAgcm0gLWYgJE9VVFBVVF9ST09UL3VuY3lnZHJpdmUqCi0gICAgVU5DWUdEUklWRT1gJENZR1BBVEggLW0gJE9VVFBVVF9ST09UL3VuY3lnZHJpdmUuZXhlYAotICAgIGNkICRPVVRQVVRfUk9PVAotICAgICRDQyAkVU5DWUdEUklWRV9TUkMgL0ZlJFVOQ1lHRFJJVkUgPiAkT1VUUFVUX1JPT1QvdW5jeWdkcml2ZTEubG9nIDI+JjEKLSAgICBjZCAkQ1VSRElSCi0KLSAgICBpZiB0ZXN0ICEgLXggJE9VVFBVVF9ST09UL3VuY3lnZHJpdmUuZXhlOyB0aGVuCi0gICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotICAgICAgICBjYXQgJE9VVFBVVF9ST09UL3VuY3lnZHJpdmUxLmxvZwotICAgICAgICBhc19mbl9lcnJvciAkPyAiQ291bGQgbm90IGNyZWF0ZSAkT1VUUFVUX1JPT1QvdW5jeWdkcml2ZS5leGUiICIkTElORU5PIiA1Ci0gICAgZmkKLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFVOQ1lHRFJJVkUiID4mNQotJGFzX2VjaG8gIiRVTkNZR0RSSVZFIiA+JjY7IH0KLSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmIHVuY3lnZHJpdmUuZXhlIHdvcmtzIiA+JjUKLSRhc19lY2hvX24gImNoZWNraW5nIGlmIHVuY3lnZHJpdmUuZXhlIHdvcmtzLi4uICIgPiY2OyB9Ci0gICAgY2QgJE9VVFBVVF9ST09UCi0gICAgJFVOQ1lHRFJJVkUgJENDICRTUkNfUk9PVC9jb21tb24vc3JjL3VuY3lnZHJpdmUuYyAvRmUkT1VUUFVUX1JPT1QvdW5jeWdkcml2ZTIuZXhlID4gJE9VVFBVVF9ST09UL3VuY3lnZHJpdmUyLmxvZyAyPiYxCi0gICAgY2QgJENVUkRJUgotICAgIGlmIHRlc3QgISAteCAkT1VUUFVUX1JPT1QvdW5jeWdkcml2ZTIuZXhlOyB0aGVuCi0gICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1Ci0kYXNfZWNobyAibm8iID4mNjsgfQotICAgICAgICBjYXQgJE9VVFBVVF9ST09UL3VuY3lnZHJpdmUyLmxvZwotICAgICAgICBhc19mbl9lcnJvciAkPyAiVW5jeWdkcml2ZSBkaWQgbm90IHdvcmshIiAiJExJTkVOTyIgNQotICAgIGZpCi0gICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1Ci0kYXNfZWNobyAieWVzIiA+JjY7IH0KLSAgICBybSAtZiAkT1VUUFVUX1JPT1QvdW5jeWdkcml2ZT8uPz8/ICRPVVRQVVRfUk9PVC91bmN5Z2RyaXZlLm9iagotICAgICMgVGhlIHBhdGggdG8gdW5jeWdkcml2ZSB0byB1c2Ugc2hvdWxkIGJlIFVuaXgtc3R5bGUKLSAgICBVTkNZR0RSSVZFPSIkT1VUUFVUX1JPT1QvdW5jeWdkcml2ZS5leGUiCi1maQotCi0KLQotCi0KICMgU2V0dXAgZGVidWcgc3ltYm9scyAobmVlZCBvYmpjb3B5IGZyb20gdGhlIHRvb2xjaGFpbiBmb3IgdGhhdCkKIAogIwpAQCAtMTUzODQsNyArMjcxMzUsNyBAQAogCiBpZiB0ZXN0ICJ4JEVOQUJMRV9ERUJVR19TWU1CT0xTIiA9ICJ4ZGVmYXVsdCI7IHRoZW4KICAgIyBEZWZhdWx0IGlzIG9uIGlmIG9iamNvcHkgaXMgZm91bmQsIG90aGVyd2lzZSBvZmYKLSAgaWYgdGVzdCAieCRPQkpDT1BZIiAhPSB4OyB0aGVuCisgIGlmIHRlc3QgIngkT0JKQ09QWSIgIT0geCB8fCB0ZXN0ICJ4JE9QRU5KREtfVEFSR0VUX09TIiA9IHh3aW5kb3dzOyB0aGVuCiAgICAgIEVOQUJMRV9ERUJVR19TWU1CT0xTPXllcwogICBlbHNlCiAgICAgIEVOQUJMRV9ERUJVR19TWU1CT0xTPW5vCkBAIC0xNTUzNiw3ICsyNzI4Nyw2IEBACiAKIAogCi0KICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMKICMgQ2hlY2sgZm9yIFggV2luZG93cwpAQCAtMTYzMDgsMTAgKzI4MDU4LDE1IEBACiAKIE9MRF9DRkxBR1M9IiRDRkxBR1MiCiBDRkxBR1M9IiRDRkxBR1MgJFhfQ0ZMQUdTIgorCisjIE5lZWQgdG8gaW5jbHVkZSBYbGliLmggYW5kIFh1dGlsLmggdG8gYXZvaWQgInByZXNlbnQgYnV0IGNhbm5vdCBiZSBjb21waWxlZCIgd2FybmluZ3Mgb24gU29sYXJpcyAxMAogZm9yIGFjX2hlYWRlciBpbiBYMTEvZXh0ZW5zaW9ucy9zaGFwZS5oIFgxMS9leHRlbnNpb25zL1hyZW5kZXIuaCBYMTEvZXh0ZW5zaW9ucy9YVGVzdC5oCiBkbyA6CiAgIGFzX2FjX0hlYWRlcj1gJGFzX2VjaG8gImFjX2N2X2hlYWRlcl8kYWNfaGVhZGVyIiB8ICRhc190cl9zaGAKLWFjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICIkYWNfaGVhZGVyIiAiJGFzX2FjX0hlYWRlciIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgorYWNfZm5fY19jaGVja19oZWFkZXJfY29tcGlsZSAiJExJTkVOTyIgIiRhY19oZWFkZXIiICIkYXNfYWNfSGVhZGVyIiAiICMgaW5jbHVkZSA8WDExL1hsaWIuaD4KKyAgICAgICAgICAgICAgICAgICAjIGluY2x1ZGUgPFgxMS9YdXRpbC5oPgorCisiCiBpZiBldmFsIHRlc3QgXCJ4XCQiJGFzX2FjX0hlYWRlciJcIiA9IHgieWVzIjsgdGhlbiA6CiAgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKICNkZWZpbmUgYCRhc19lY2hvICJIQVZFXyRhY19oZWFkZXIiIHwgJGFzX3RyX2NwcGAgMQpAQCAtMTYzMjMsNiArMjgwNzgsNyBAQAogCiBkb25lCiAKKwogQ0ZMQUdTPSIkT0xEX0NGTEFHUyIKIGFjX2V4dD1jcHAKIGFjX2NwcD0nJENYWENQUCAkQ1BQRkxBR1MnCkBAIC0xNjM4MiwyOCArMjgxMzgsMjAgQEAKIGZpCiAKIAotIyBDaGVjayB3aGV0aGVyIC0td2l0aC1jdXBzLWxpYiB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfY3Vwc19saWIrc2V0fSIgPSBzZXQ7IHRoZW4gOgotICB3aXRodmFsPSR3aXRoX2N1cHNfbGliOwotZmkKLQotCiBpZiB0ZXN0ICJ4JENVUFNfTk9UX05FRURFRCIgPSB4eWVzOyB0aGVuCi0JaWYgdGVzdCAieCR7d2l0aF9jdXBzfSIgIT0geCB8fCB0ZXN0ICJ4JHt3aXRoX2N1cHNfaW5jbHVkZX0iICE9IHggfHwgdGVzdCAieCR7d2l0aF9jdXBzX2xpYn0iICE9IHg7IHRoZW4KKwlpZiB0ZXN0ICJ4JHt3aXRoX2N1cHN9IiAhPSB4IHx8IHRlc3QgIngke3dpdGhfY3Vwc19pbmNsdWRlfSIgIT0geDsgdGhlbgogCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IGN1cHMgbm90IHVzZWQsIHNvIC0td2l0aC1jdXBzIGlzIGlnbm9yZWQiID4mNQogJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogY3VwcyBub3QgdXNlZCwgc28gLS13aXRoLWN1cHMgaXMgaWdub3JlZCIgPiYyO30KIAlmaQogCUNVUFNfQ0ZMQUdTPQotCUNVUFNfTElCUz0KIGVsc2UKIAlDVVBTX0ZPVU5EPW5vCiAKLQlpZiB0ZXN0ICJ4JHt3aXRoX2N1cHN9IiA9IHhubyB8fCB0ZXN0ICJ4JHt3aXRoX2N1cHNfaW5jbHVkZX0iID0geG5vIHx8IHRlc3QgIngke3dpdGhfY3Vwc19saWJ9IiA9IHhubzsgdGhlbgorCWlmIHRlc3QgIngke3dpdGhfY3Vwc30iID0geG5vIHx8IHRlc3QgIngke3dpdGhfY3Vwc19pbmNsdWRlfSIgPSB4bm87IHRoZW4KIAkgICAgYXNfZm5fZXJyb3IgJD8gIkl0IGlzIG5vdCBwb3NzaWJsZSB0byBkaXNhYmxlIHRoZSB1c2Ugb2YgY3Vwcy4gUmVtb3ZlIHRoZSAtLXdpdGhvdXQtY3VwcyBvcHRpb24uIiAiJExJTkVOTyIgNQogCWZpCiAKIAlpZiB0ZXN0ICJ4JHt3aXRoX2N1cHN9IiAhPSB4OyB0aGVuCi0JICAgIENVUFNfTElCUz0iLUwke3dpdGhfY3Vwc30vbGliIC1sY3VwcyIKIAkgICAgQ1VQU19DRkxBR1M9Ii1JJHt3aXRoX2N1cHN9L2luY2x1ZGUiCiAJICAgIENVUFNfRk9VTkQ9eWVzCiAJZmkKQEAgLTE2NDExLDEwICsyODE1OSw2IEBACiAJICAgIENVUFNfQ0ZMQUdTPSItSSR7d2l0aF9jdXBzX2luY2x1ZGV9IgogCSAgICBDVVBTX0ZPVU5EPXllcwogCWZpCi0JaWYgdGVzdCAieCR7d2l0aF9jdXBzX2xpYn0iICE9IHg7IHRoZW4KLQkgICAgQ1VQU19MSUJTPSItTCR7d2l0aF9jdXBzX2xpYn0gLWxjdXBzIgotCSAgICBDVVBTX0ZPVU5EPXllcwotCWZpCiAJaWYgdGVzdCAieCRDVVBTX0ZPVU5EIiA9IHhubzsgdGhlbgogCiAKQEAgLTE2NTcyLDcgKzI4MzE2LDYgQEAKIF9BQ0VPRgogIENVUFNfRk9VTkQ9eWVzCiAJICAgICAgICAgICAgICAgICAgICAgIENVUFNfQ0ZMQUdTPQotCSAgICAgICAgICAgICAgICAgICAgICBDVVBTX0xJQlM9Ii1sY3VwcyIKIAkgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9DVVBTPXllcwogZmkKIApAQCAtMTY1ODIsMTggKzI4MzI1LDE2IEBACiAJaWYgdGVzdCAieCRDVVBTX0ZPVU5EIiA9IHhubzsgdGhlbgogCSAgICAjIEdldHRpbmcgbmVydm91cyBub3c/IExldHMgcG9rZSBhcm91bmQgZm9yIHN0YW5kYXJkIFNvbGFyaXMgdGhpcmQtcGFydHkKIAkgICAgIyBwYWNrYWdlIGluc3RhbGxhdGlvbiBsb2NhdGlvbnMuCi0JICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGN1cHMgaGVhZGVycyBhbmQgbGlicyIgPiY1Ci0kYXNfZWNob19uICJjaGVja2luZyBmb3IgY3VwcyBoZWFkZXJzIGFuZCBsaWJzLi4uICIgPiY2OyB9CisJICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGN1cHMgaGVhZGVycyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgY3VwcyBoZWFkZXJzLi4uICIgPiY2OyB9CiAJICAgIGlmIHRlc3QgLXMgL29wdC9zZncvY3Vwcy9pbmNsdWRlL2N1cHMvY3Vwcy5oOyB0aGVuCiAJICAgICAgICMgQW4gU0ZXIHBhY2thZ2Ugc2VlbXMgdG8gYmUgaW5zdGFsbGVkIQogCSAgICAgICBDVVBTX0ZPVU5EPXllcwogCSAgICAgICBDVVBTX0NGTEFHUz0iLUkvb3B0L3Nmdy9jdXBzL2luY2x1ZGUiCi0JICAgICAgIENVUFNfTElCUz0iLUwvb3B0L3Nmdy9jdXBzL2xpYiAtbGN1cHMiCiAJICAgIGVsaWYgdGVzdCAtcyAvb3B0L2Nzdy9pbmNsdWRlL2N1cHMvY3Vwcy5oOyB0aGVuCiAJICAgICAgICMgQSBDU1cgcGFja2FnZSBzZWVtcyB0byBiZSBpbnN0YWxsZWQhCiAJICAgICAgIENVUFNfRk9VTkQ9eWVzCiAJICAgICAgIENVUFNfQ0ZMQUdTPSItSS9vcHQvY3N3L2luY2x1ZGUiCi0JICAgICAgIENVUFNfTElCUz0iLUwvb3B0L2Nzdy9saWIgLWxjdXBzIgogCSAgICBmaQogCSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJENVUFNfRk9VTkQiID4mNQogJGFzX2VjaG8gIiRDVVBTX0ZPVU5EIiA+JjY7IH0KQEAgLTE2NjMzLDcgKzI4Mzc0LDYgQEAKIAogCiAKLQogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIwogIyBUaGUgdWJpcXVpdG91cyBmcmVldHlwZTIgbGlicmFyeSBpcyB1c2VkIHRvIHJlbmRlciBmb250cy4KQEAgLTE2NjYxLDMyICsyODQwMSwxMzggQEAKIAogCWlmIHRlc3QgIngkd2l0aF9mcmVldHlwZSIgIT0geDsgdGhlbgogCi0gICAgIyBGYWlsIHdpdGggbWVzc2FnZSB0aGUgcGF0aCB0byBmcmVldHlwZSBpZiB2YXIgd2l0aF9mcmVldHlwZSBjb250YWlucyBhIHBhdGggd2l0aCBubyBzcGFjZXMgaW4gaXQuCi0gICAgIyBVbmxlc3Mgb24gV2luZG93cywgd2hlcmUgd2UgY2FuIHJld3JpdGUgdGhlIHBhdGguCi0gICAgSEFTX1NQQUNFPWBlY2hvICIkd2l0aF9mcmVldHlwZSIgfCBncmVwICIgImAKLSAgICBpZiB0ZXN0ICJ4JEhBU19TUEFDRSIgIT0geDsgdGhlbgotICAgICAgICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1MiID0gInh3aW5kb3dzIjsgdGhlbgotICAgICAgICAgICAgIyBGaXJzdCBjb252ZXJ0IGl0IHRvIERPUy1zdHlsZSwgc2hvcnQgbW9kZSAobm8gc3BhY2VzKQotICAgICAgICAgICAgd2l0aF9mcmVldHlwZT1gJENZR1BBVEggLXMgLW0gLWEgIiR3aXRoX2ZyZWV0eXBlImAKLSAgICAgICAgICAgICMgTm93IGl0J3MgY2FzZSBpbnNlbnNpdGl2ZTsgbGV0J3MgbWFrZSBpdCBsb3dlcmNhc2UgdG8gaW1wcm92ZSByZWFkYWJpbGl0eQotICAgICAgICAgICAgd2l0aF9mcmVldHlwZT1gJEVDSE8gIiR3aXRoX2ZyZWV0eXBlIiB8ICRUUiAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2cXh5eidgCi0gICAgICAgICAgICAjIE5vdyBjb252ZXJ0IGl0IGJhY2sgdG8gVW5peC1zdGlsZSAoY3lncGF0aCkKLSAgICAgICAgICAgIHdpdGhfZnJlZXR5cGU9YCRDWUdQQVRIIC11ICIkd2l0aF9mcmVldHlwZSJgCi0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGFzX2ZuX2Vycm9yICQ/ICJZb3UgY2Fubm90IGhhdmUgc3BhY2VzIGluIHRoZSBwYXRoIHRvIGZyZWV0eXBlISBcIiR3aXRoX2ZyZWV0eXBlXCIiICIkTElORU5PIiA1Ci0gICAgICAgIGZpCisgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLmN5Z3dpbiI7IHRoZW4KKworICAjIElucHV0IG1pZ2h0IGJlIGdpdmVuIGFzIFdpbmRvd3MgZm9ybWF0LCBzdGFydCBieSBjb252ZXJ0aW5nIHRvCisgICMgdW5peCBmb3JtYXQuCisgIHBhdGg9IiR3aXRoX2ZyZWV0eXBlIgorICBuZXdfcGF0aD1gJENZR1BBVEggLXUgIiRwYXRoImAKKworICAjIEN5Z3dpbiB0cmllcyB0byBoaWRlIHNvbWUgYXNwZWN0cyBvZiB0aGUgV2luZG93cyBmaWxlIHN5c3RlbSwgc3VjaCB0aGF0IGJpbmFyaWVzIGFyZQorICAjIG5hbWVkIC5leGUgYnV0IGNhbGxlZCB3aXRob3V0IHRoYXQgc3VmZml4LiBUaGVyZWZvcmUsICJmb28iIGFuZCAiZm9vLmV4ZSIgYXJlIGNvbnNpZGVyZWQKKyAgIyB0aGUgc2FtZSBmaWxlLCBtb3N0IG9mIHRoZSB0aW1lIChhcyBpbiAidGVzdCAtZiIpLiBCdXQgbm90IHdoZW4gcnVubmluZyBjeWdwYXRoIC1zLCB0aGVuCisgICMgImZvby5leGUiIGlzIE9LIGJ1dCAiZm9vIiBpcyBhbiBlcnJvci4KKyAgIworICAjIFRoaXMgdGVzdCBpcyB0aGVyZWZvcmUgc2xpZ2h0bHkgbW9yZSBhY2N1cmF0ZSB0aGFuICJ0ZXN0IC1mIiB0byBjaGVjayBmb3IgZmlsZSBwcmVjZW5zZS4KKyAgIyBJdCBpcyBhbHNvIGEgd2F5IHRvIG1ha2Ugc3VyZSB3ZSBnb3QgdGhlIHByb3BlciBmaWxlIG5hbWUgZm9yIHRoZSByZWFsIHRlc3QgbGF0ZXIgb24uCisgIHRlc3Rfc2hvcnRwYXRoPWAkQ1lHUEFUSCAtcyAtbSAiJG5ld19wYXRoIiAyPiAvZGV2L251bGxgCisgIGlmIHRlc3QgIngkdGVzdF9zaG9ydHBhdGgiID0geDsgdGhlbgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGhlIHBhdGggb2Ygd2l0aF9mcmVldHlwZSwgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkcGF0aFwiLCBpcyBpbnZhbGlkLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUaGUgcGF0aCBvZiB3aXRoX2ZyZWV0eXBlLCB3aGljaCByZXNvbHZlcyBhcyBcIiRwYXRoXCIsIGlzIGludmFsaWQuIiA+JjY7fQorICAgIGFzX2ZuX2Vycm9yICQ/ICJDYW5ub3QgbG9jYXRlIHRoZSB0aGUgcGF0aCBvZiB3aXRoX2ZyZWV0eXBlIiAiJExJTkVOTyIgNQorICBmaQorCisgICMgQ2FsbCBoZWxwZXIgZnVuY3Rpb24gd2hpY2ggcG9zc2libHkgY29udmVydHMgdGhpcyB1c2luZyBET1Mtc3R5bGUgc2hvcnQgbW9kZS4KKyAgIyBJZiBzbywgdGhlIHVwZGF0ZWQgcGF0aCBpcyBzdG9yZWQgaW4gJG5ld19wYXRoLgorCisgIGlucHV0X3BhdGg9IiRuZXdfcGF0aCIKKyAgIyBDaGVjayBpZiB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhpcyB1c2luZyBET1Mtc3R5bGUgc2hvcnQgbW9kZS4gSWYgdGhlIHBhdGgKKyAgIyBjb250YWlucyBqdXN0IHNpbXBsZSBjaGFyYWN0ZXJzLCB1c2UgaXQuIE90aGVyd2lzZSAoc3BhY2VzLCB3ZWlyZCBjaGFyYWN0ZXJzKSwKKyAgIyB0YWtlIG5vIGNoYW5jZXMgYW5kIHJld3JpdGUgaXQuCisgICMgTm90ZTogbTQgZWF0cyBvdXIgW10sIHNvIHdlIG5lZWQgdG8gdXNlIFsgYW5kIF0gaW5zdGVhZC4KKyAgaGFzX2ZvcmJpZGRlbl9jaGFycz1gJEVDSE8gIiRpbnB1dF9wYXRoIiB8ICRHUkVQIFteLS5fL2EtekEtWjAtOV1gCisgIGlmIHRlc3QgIngkaGFzX2ZvcmJpZGRlbl9jaGFycyIgIT0geDsgdGhlbgorICAgICMgTm93IGNvbnZlcnQgaXQgdG8gbWl4ZWQgRE9TLXN0eWxlLCBzaG9ydCBtb2RlIChubyBzcGFjZXMsIGFuZCAvIGluc3RlYWQgb2YgXCkKKyAgICBzaG9ydG1vZGVfcGF0aD1gJENZR1BBVEggLXMgLW0gLWEgIiRpbnB1dF9wYXRoImAKKyAgICBwYXRoX2FmdGVyX3Nob3J0bW9kZT1gJENZR1BBVEggLXUgIiRzaG9ydG1vZGVfcGF0aCJgCisgICAgaWYgdGVzdCAieCRwYXRoX2FmdGVyX3Nob3J0bW9kZSIgIT0gIngkaW5wdXRfdG9fc2hvcnRwYXRoIjsgdGhlbgorICAgICAgIyBHb2luZyB0byBzaG9ydCBtb2RlIGFuZCBiYWNrIGFnYWluIGRpZCBpbmRlZWQgbWF0dGVyLiBTaW5jZSBzaG9ydCBtb2RlIGlzCisgICAgICAjIGNhc2UgaW5zZW5zaXRpdmUsIGxldCdzIG1ha2UgaXQgbG93ZXJjYXNlIHRvIGltcHJvdmUgcmVhZGFiaWxpdHkuCisgICAgICBzaG9ydG1vZGVfcGF0aD1gJEVDSE8gIiRzaG9ydG1vZGVfcGF0aCIgfCAkVFIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAorICAgICAgIyBOb3cgY29udmVydCBpdCBiYWNrIHRvIFVuaXgtc3RpbGUgKGN5Z3BhdGgpCisgICAgICBpbnB1dF9wYXRoPWAkQ1lHUEFUSCAtdSAiJHNob3J0bW9kZV9wYXRoImAKKyAgICAgIG5ld19wYXRoPSIkaW5wdXRfcGF0aCIKKyAgICBmaQorICBmaQorCisgIHRlc3RfY3lnZHJpdmVfcHJlZml4PWAkRUNITyAkaW5wdXRfcGF0aCB8ICRHUkVQIF4vY3lnZHJpdmUvYAorICBpZiB0ZXN0ICJ4JHRlc3RfY3lnZHJpdmVfcHJlZml4IiA9IHg7IHRoZW4KKyAgICAjIEFzIGEgc2ltcGxlIGZpeCwgZXhjbHVkZSAvdXNyL2JpbiBzaW5jZSBpdCdzIG5vdCBhIHJlYWwgcGF0aC4KKyAgICBpZiB0ZXN0ICJ4YCRFQ0hPICRuZXdfcGF0aCB8ICRHUkVQIF4vdXNyL2Jpbi9gIiA9IHg7IHRoZW4KKyAgICAgICMgVGhlIHBhdGggaXMgaW4gYSBDeWd3aW4gc3BlY2lhbCBkaXJlY3RvcnkgKGUuZy4gL2hvbWUpLiBXZSBuZWVkIHRoaXMgY29udmVydGVkIHRvCisgICAgICAjIGEgcGF0aCBwcmVmaXhlZCBieSAvY3lnZHJpdmUgZm9yIGZpeHBhdGggdG8gd29yay4KKyAgICAgIG5ld19wYXRoPSIkQ1lHV0lOX1JPT1RfUEFUSCRpbnB1dF9wYXRoIgorICAgIGZpCisgIGZpCisKKworICBpZiB0ZXN0ICJ4JHBhdGgiICE9ICJ4JG5ld19wYXRoIjsgdGhlbgorICAgIHdpdGhfZnJlZXR5cGU9IiRuZXdfcGF0aCIKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFJld3JpdGluZyB3aXRoX2ZyZWV0eXBlIHRvIFwiJG5ld19wYXRoXCIiID4mNQorJGFzX2VjaG8gIiRhc19tZTogUmV3cml0aW5nIHdpdGhfZnJlZXR5cGUgdG8gXCIkbmV3X3BhdGhcIiIgPiY2O30KKyAgZmkKKworICBlbGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLm1zeXMiOyB0aGVuCisKKyAgcGF0aD0iJHdpdGhfZnJlZXR5cGUiCisgIGhhc19jb2xvbj1gJEVDSE8gJHBhdGggfCAkR1JFUCBeLjpgCisgIG5ld19wYXRoPSIkcGF0aCIKKyAgaWYgdGVzdCAieCRoYXNfY29sb24iID0geDsgdGhlbgorICAgICMgTm90IGluIG1peGVkIG9yIFdpbmRvd3Mgc3R5bGUsIHN0YXJ0IGJ5IHRoYXQuCisgICAgbmV3X3BhdGg9YGNtZCAvL2MgZWNobyAkcGF0aGAKKyAgZmkKKworCisgIGlucHV0X3BhdGg9IiRuZXdfcGF0aCIKKyAgIyBDaGVjayBpZiB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhpcyB1c2luZyBET1Mtc3R5bGUgc2hvcnQgbW9kZS4gSWYgdGhlIHBhdGgKKyAgIyBjb250YWlucyBqdXN0IHNpbXBsZSBjaGFyYWN0ZXJzLCB1c2UgaXQuIE90aGVyd2lzZSAoc3BhY2VzLCB3ZWlyZCBjaGFyYWN0ZXJzKSwKKyAgIyB0YWtlIG5vIGNoYW5jZXMgYW5kIHJld3JpdGUgaXQuCisgICMgTm90ZTogbTQgZWF0cyBvdXIgW10sIHNvIHdlIG5lZWQgdG8gdXNlIFsgYW5kIF0gaW5zdGVhZC4KKyAgaGFzX2ZvcmJpZGRlbl9jaGFycz1gJEVDSE8gIiRpbnB1dF9wYXRoIiB8ICRHUkVQIFteLV8vOmEtekEtWjAtOV1gCisgIGlmIHRlc3QgIngkaGFzX2ZvcmJpZGRlbl9jaGFycyIgIT0geDsgdGhlbgorICAgICMgTm93IGNvbnZlcnQgaXQgdG8gbWl4ZWQgRE9TLXN0eWxlLCBzaG9ydCBtb2RlIChubyBzcGFjZXMsIGFuZCAvIGluc3RlYWQgb2YgXCkKKyAgICBuZXdfcGF0aD1gY21kIC9jICJmb3IgJUEgaW4gKFwiJGlucHV0X3BhdGhcIikgZG8gQGVjaG8gJX5zQSJ8JFRSIFxcXFxcXFxcIC8gfCAkVFIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAorICBmaQorCisKKyAgd2luZG93c19wYXRoPSIkbmV3X3BhdGgiCisgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLmN5Z3dpbiI7IHRoZW4KKyAgICB1bml4X3BhdGg9YCRDWUdQQVRIIC11ICIkd2luZG93c19wYXRoImAKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9ICJ4d2luZG93cy5tc3lzIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJEVDSE8gIiR3aW5kb3dzX3BhdGgiIHwgJFNFRCAtZSAncyxeXFwoLlxcKTosL1xcMSxnJyAtZSAncyxcXFxcLC8sZydgCisgICAgbmV3X3BhdGg9IiR1bml4X3BhdGgiCisgIGZpCisKKyAgaWYgdGVzdCAieCRwYXRoIiAhPSAieCRuZXdfcGF0aCI7IHRoZW4KKyAgICB3aXRoX2ZyZWV0eXBlPSIkbmV3X3BhdGgiCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBSZXdyaXRpbmcgd2l0aF9mcmVldHlwZSB0byBcIiRuZXdfcGF0aFwiIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFJld3JpdGluZyB3aXRoX2ZyZWV0eXBlIHRvIFwiJG5ld19wYXRoXCIiID4mNjt9CisgIGZpCisKKyAgIyBTYXZlIHRoZSBmaXJzdCAxMCBieXRlcyBvZiB0aGlzIHBhdGggdG8gdGhlIHN0b3JhZ2UsIHNvIGZpeHBhdGggY2FuIHdvcmsuCisgIGFsbF9maXhwYXRoX3ByZWZpeGVzPSgiJHthbGxfZml4cGF0aF9wcmVmaXhlc1tAXX0iICIke25ld19wYXRoOjA6MTB9IikKKworICBlbHNlCisgICAgIyBXZSdyZSBvbiBhIHBvc2l4IHBsYXRmb3JtLiBIb29yYXkhIDopCisgICAgcGF0aD0iJHdpdGhfZnJlZXR5cGUiCisKKyAgICBpZiB0ZXN0ICEgLWYgIiRwYXRoIiAmJiB0ZXN0ICEgLWQgIiRwYXRoIjsgdGhlbgorICAgICAgYXNfZm5fZXJyb3IgJD8gIlRoZSBwYXRoIG9mIHdpdGhfZnJlZXR5cGUsIHdoaWNoIHJlc29sdmVzIGFzIFwiJHBhdGhcIiwgaXMgbm90IGZvdW5kLiIgIiRMSU5FTk8iIDUKICAgICBmaQogCisgICAgaGFzX3NwYWNlPWAkRUNITyAiJHBhdGgiIHwgJEdSRVAgIiAiYAorICAgIGlmIHRlc3QgIngkaGFzX3NwYWNlIiAhPSB4OyB0aGVuCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFRoZSBwYXRoIG9mIHdpdGhfZnJlZXR5cGUsIHdoaWNoIHJlc29sdmVzIGFzIFwiJHBhdGhcIiwgaXMgaW52YWxpZC4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogVGhlIHBhdGggb2Ygd2l0aF9mcmVldHlwZSwgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkcGF0aFwiLCBpcyBpbnZhbGlkLiIgPiY2O30KKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJTcGFjZXMgYXJlIG5vdCBhbGxvd2VkIGluIHRoaXMgcGF0aC4iICIkTElORU5PIiA1CisgICAgZmkKKyAgZmkKKwogCSAgICBGUkVFVFlQRTJfTElCUz0iLUwkd2l0aF9mcmVldHlwZS9saWIgLWxmcmVldHlwZSIKKyAgICAgICAgICAgIEZSRUVUWVBFMl9MSUJfUEFUSD0iJHdpdGhfZnJlZXR5cGUvbGliIgorICAgICAgICAgICAgaWYgdGVzdCAieCRPUEVOSkRLX1RBUkdFVF9PUyIgPSB4c29sYXJpcyAmJiB0ZXN0ICJ4JE9QRU5KREtfVEFSR0VUX0NQVSIgPSB4eDg2XzY0ICYmIHRlc3QgLWQgIiR3aXRoX2ZyZWV0eXBlL2xpYi9hbWQ2NCI7IHRoZW4KKyAgICAgICAgICAgICAgICBGUkVFVFlQRTJfTElCUz0iLUwkd2l0aF9mcmVldHlwZS9saWIvYW1kNjQgLWxmcmVldHlwZSIKKyAgICAgICAgICAgICAgICBGUkVFVFlQRTJfTElCX1BBVEg9IiR3aXRoX2ZyZWV0eXBlL2xpYi9hbWQ2NCIKKyAgICAgICAgICAgIGZpCiAgICAgICAgICAgICBpZiB0ZXN0ICJ4JE9QRU5KREtfVEFSR0VUX09TIiA9IHh3aW5kb3dzOyB0aGVuCiAgICAgICAgICAgICAgICAgRlJFRVRZUEUyX0xJQlM9IiR3aXRoX2ZyZWV0eXBlL2xpYi9mcmVldHlwZS5saWIiCiAgICAgICAgICAgICBmaQotICAgICAgICAgICAgRlJFRVRZUEUyX0xJQl9QQVRIPSIkd2l0aF9mcmVldHlwZS9saWIiCiAJICAgIEZSRUVUWVBFMl9DRkxBR1M9Ii1JJHdpdGhfZnJlZXR5cGUvaW5jbHVkZSIKICAgICAgICAgICAgIGlmIHRlc3QgLXMgJHdpdGhfZnJlZXR5cGUvaW5jbHVkZS9mdDJidWlsZC5oICYmIHRlc3QgLWQgJHdpdGhfZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZTIvZnJlZXR5cGU7IHRoZW4KICAgICAgICAgICAgICAgICBGUkVFVFlQRTJfQ0ZMQUdTPSItSSR3aXRoX2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUyIC1JJHdpdGhfZnJlZXR5cGUvaW5jbHVkZSIKICAgICAgICAgICAgIGZpCi0JICAgIEZSRUVUWVBFMl9GT1VORD15ZXMKKyAJICAgIEZSRUVUWVBFMl9GT1VORD15ZXMKICAgIAkgICAgaWYgdGVzdCAieCRGUkVFVFlQRTJfRk9VTkQiID0geHllczsgdGhlbgogCSAgICAgICAgIyBWZXJpZnkgdGhhdCB0aGUgZGlyZWN0b3JpZXMgZXhpc3QKICAgICAgICAgICAgICAgICBpZiAhIHRlc3QgLWQgIiR3aXRoX2ZyZWV0eXBlL2xpYiIgfHwgISB0ZXN0IC1kICIkd2l0aF9mcmVldHlwZS9pbmNsdWRlIjsgdGhlbgpAQCAtMTY2OTUsNyArMjg1NDEsNyBAQAogCSAgICAgICAgIyBMaXN0IHRoZSBjb250ZW50cyBvZiB0aGUgbGliLgogCQlGUkVFVFlQRUxJQj1gbHMgJHdpdGhfZnJlZXR5cGUvbGliL2xpYmZyZWV0eXBlLnNvICR3aXRoX2ZyZWV0eXBlL2xpYi9mcmVldHlwZS5kbGwgMj4gL2Rldi9udWxsYAogICAgICAgICAgICAgICAgIGlmIHRlc3QgIngkRlJFRVRZUEVMSUIiID0geDsgdGhlbgotCQkgICBhc19mbl9lcnJvciAkPyAiQ291bGQgbm90IGZpbmQgbGliZnJlZXR5cGUuc2Ugbm9yIGZyZWV0eXBlLmRsbCBpbiAkd2l0aF9mcmVldHlwZS9saWIiICIkTElORU5PIiA1CisJCSAgIGFzX2ZuX2Vycm9yICQ/ICJDb3VsZCBub3QgZmluZCBsaWJmcmVldHlwZS5zbyBub3IgZnJlZXR5cGUuZGxsIGluICR3aXRoX2ZyZWV0eXBlL2xpYiIgIiRMSU5FTk8iIDUKIAkJZmkKIAkgICAgICAgICMgQ2hlY2sgb25lIGgtZmlsZQogICAgICAgICAgICAgICAgIGlmICEgdGVzdCAtcyAiJHdpdGhfZnJlZXR5cGUvaW5jbHVkZS9mdDJidWlsZC5oIjsgdGhlbgpAQCAtMTY4NTEsNiArMjg2OTcsMTQ1IEBACiAKICAgICAgICAgICAgIFVTSU5HX1NZU1RFTV9GVF9MSUI9dHJ1ZQogCWZpCisJaWYgdGVzdCAieCRGUkVFVFlQRTJfRk9VTkQiID0geG5vICYmIHRlc3QgIngkT1BFTkpES19UQVJHRVRfT1MiID0geHdpbmRvd3M7IHRoZW4KKyAgICAgICAgICAgIEZSRUVUWVBFTE9DQVRJT049IiRQUk9HUkFNRklMRVMvR251V2luMzIiCisKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorCisgICMgSW5wdXQgbWlnaHQgYmUgZ2l2ZW4gYXMgV2luZG93cyBmb3JtYXQsIHN0YXJ0IGJ5IGNvbnZlcnRpbmcgdG8KKyAgIyB1bml4IGZvcm1hdC4KKyAgcGF0aD0iJEZSRUVUWVBFTE9DQVRJT04iCisgIG5ld19wYXRoPWAkQ1lHUEFUSCAtdSAiJHBhdGgiYAorCisgICMgQ3lnd2luIHRyaWVzIHRvIGhpZGUgc29tZSBhc3BlY3RzIG9mIHRoZSBXaW5kb3dzIGZpbGUgc3lzdGVtLCBzdWNoIHRoYXQgYmluYXJpZXMgYXJlCisgICMgbmFtZWQgLmV4ZSBidXQgY2FsbGVkIHdpdGhvdXQgdGhhdCBzdWZmaXguIFRoZXJlZm9yZSwgImZvbyIgYW5kICJmb28uZXhlIiBhcmUgY29uc2lkZXJlZAorICAjIHRoZSBzYW1lIGZpbGUsIG1vc3Qgb2YgdGhlIHRpbWUgKGFzIGluICJ0ZXN0IC1mIikuIEJ1dCBub3Qgd2hlbiBydW5uaW5nIGN5Z3BhdGggLXMsIHRoZW4KKyAgIyAiZm9vLmV4ZSIgaXMgT0sgYnV0ICJmb28iIGlzIGFuIGVycm9yLgorICAjCisgICMgVGhpcyB0ZXN0IGlzIHRoZXJlZm9yZSBzbGlnaHRseSBtb3JlIGFjY3VyYXRlIHRoYW4gInRlc3QgLWYiIHRvIGNoZWNrIGZvciBmaWxlIHByZWNlbnNlLgorICAjIEl0IGlzIGFsc28gYSB3YXkgdG8gbWFrZSBzdXJlIHdlIGdvdCB0aGUgcHJvcGVyIGZpbGUgbmFtZSBmb3IgdGhlIHJlYWwgdGVzdCBsYXRlciBvbi4KKyAgdGVzdF9zaG9ydHBhdGg9YCRDWUdQQVRIIC1zIC1tICIkbmV3X3BhdGgiIDI+IC9kZXYvbnVsbGAKKyAgaWYgdGVzdCAieCR0ZXN0X3Nob3J0cGF0aCIgPSB4OyB0aGVuCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBUaGUgcGF0aCBvZiBGUkVFVFlQRUxPQ0FUSU9OLCB3aGljaCByZXNvbHZlcyBhcyBcIiRwYXRoXCIsIGlzIGludmFsaWQuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFRoZSBwYXRoIG9mIEZSRUVUWVBFTE9DQVRJT04sIHdoaWNoIHJlc29sdmVzIGFzIFwiJHBhdGhcIiwgaXMgaW52YWxpZC4iID4mNjt9CisgICAgYXNfZm5fZXJyb3IgJD8gIkNhbm5vdCBsb2NhdGUgdGhlIHRoZSBwYXRoIG9mIEZSRUVUWVBFTE9DQVRJT04iICIkTElORU5PIiA1CisgIGZpCisKKyAgIyBDYWxsIGhlbHBlciBmdW5jdGlvbiB3aGljaCBwb3NzaWJseSBjb252ZXJ0cyB0aGlzIHVzaW5nIERPUy1zdHlsZSBzaG9ydCBtb2RlLgorICAjIElmIHNvLCB0aGUgdXBkYXRlZCBwYXRoIGlzIHN0b3JlZCBpbiAkbmV3X3BhdGguCisKKyAgaW5wdXRfcGF0aD0iJG5ld19wYXRoIgorICAjIENoZWNrIGlmIHdlIG5lZWQgdG8gY29udmVydCB0aGlzIHVzaW5nIERPUy1zdHlsZSBzaG9ydCBtb2RlLiBJZiB0aGUgcGF0aAorICAjIGNvbnRhaW5zIGp1c3Qgc2ltcGxlIGNoYXJhY3RlcnMsIHVzZSBpdC4gT3RoZXJ3aXNlIChzcGFjZXMsIHdlaXJkIGNoYXJhY3RlcnMpLAorICAjIHRha2Ugbm8gY2hhbmNlcyBhbmQgcmV3cml0ZSBpdC4KKyAgIyBOb3RlOiBtNCBlYXRzIG91ciBbXSwgc28gd2UgbmVlZCB0byB1c2UgWyBhbmQgXSBpbnN0ZWFkLgorICBoYXNfZm9yYmlkZGVuX2NoYXJzPWAkRUNITyAiJGlucHV0X3BhdGgiIHwgJEdSRVAgW14tLl8vYS16QS1aMC05XWAKKyAgaWYgdGVzdCAieCRoYXNfZm9yYmlkZGVuX2NoYXJzIiAhPSB4OyB0aGVuCisgICAgIyBOb3cgY29udmVydCBpdCB0byBtaXhlZCBET1Mtc3R5bGUsIHNob3J0IG1vZGUgKG5vIHNwYWNlcywgYW5kIC8gaW5zdGVhZCBvZiBcKQorICAgIHNob3J0bW9kZV9wYXRoPWAkQ1lHUEFUSCAtcyAtbSAtYSAiJGlucHV0X3BhdGgiYAorICAgIHBhdGhfYWZ0ZXJfc2hvcnRtb2RlPWAkQ1lHUEFUSCAtdSAiJHNob3J0bW9kZV9wYXRoImAKKyAgICBpZiB0ZXN0ICJ4JHBhdGhfYWZ0ZXJfc2hvcnRtb2RlIiAhPSAieCRpbnB1dF90b19zaG9ydHBhdGgiOyB0aGVuCisgICAgICAjIEdvaW5nIHRvIHNob3J0IG1vZGUgYW5kIGJhY2sgYWdhaW4gZGlkIGluZGVlZCBtYXR0ZXIuIFNpbmNlIHNob3J0IG1vZGUgaXMKKyAgICAgICMgY2FzZSBpbnNlbnNpdGl2ZSwgbGV0J3MgbWFrZSBpdCBsb3dlcmNhc2UgdG8gaW1wcm92ZSByZWFkYWJpbGl0eS4KKyAgICAgIHNob3J0bW9kZV9wYXRoPWAkRUNITyAiJHNob3J0bW9kZV9wYXRoIiB8ICRUUiAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidgCisgICAgICAjIE5vdyBjb252ZXJ0IGl0IGJhY2sgdG8gVW5peC1zdGlsZSAoY3lncGF0aCkKKyAgICAgIGlucHV0X3BhdGg9YCRDWUdQQVRIIC11ICIkc2hvcnRtb2RlX3BhdGgiYAorICAgICAgbmV3X3BhdGg9IiRpbnB1dF9wYXRoIgorICAgIGZpCisgIGZpCisKKyAgdGVzdF9jeWdkcml2ZV9wcmVmaXg9YCRFQ0hPICRpbnB1dF9wYXRoIHwgJEdSRVAgXi9jeWdkcml2ZS9gCisgIGlmIHRlc3QgIngkdGVzdF9jeWdkcml2ZV9wcmVmaXgiID0geDsgdGhlbgorICAgICMgQXMgYSBzaW1wbGUgZml4LCBleGNsdWRlIC91c3IvYmluIHNpbmNlIGl0J3Mgbm90IGEgcmVhbCBwYXRoLgorICAgIGlmIHRlc3QgInhgJEVDSE8gJG5ld19wYXRoIHwgJEdSRVAgXi91c3IvYmluL2AiID0geDsgdGhlbgorICAgICAgIyBUaGUgcGF0aCBpcyBpbiBhIEN5Z3dpbiBzcGVjaWFsIGRpcmVjdG9yeSAoZS5nLiAvaG9tZSkuIFdlIG5lZWQgdGhpcyBjb252ZXJ0ZWQgdG8KKyAgICAgICMgYSBwYXRoIHByZWZpeGVkIGJ5IC9jeWdkcml2ZSBmb3IgZml4cGF0aCB0byB3b3JrLgorICAgICAgbmV3X3BhdGg9IiRDWUdXSU5fUk9PVF9QQVRIJGlucHV0X3BhdGgiCisgICAgZmkKKyAgZmkKKworCisgIGlmIHRlc3QgIngkcGF0aCIgIT0gIngkbmV3X3BhdGgiOyB0aGVuCisgICAgRlJFRVRZUEVMT0NBVElPTj0iJG5ld19wYXRoIgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogUmV3cml0aW5nIEZSRUVUWVBFTE9DQVRJT04gdG8gXCIkbmV3X3BhdGhcIiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBSZXdyaXRpbmcgRlJFRVRZUEVMT0NBVElPTiB0byBcIiRuZXdfcGF0aFwiIiA+JjY7fQorICBmaQorCisgIGVsaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MubXN5cyI7IHRoZW4KKworICBwYXRoPSIkRlJFRVRZUEVMT0NBVElPTiIKKyAgaGFzX2NvbG9uPWAkRUNITyAkcGF0aCB8ICRHUkVQIF4uOmAKKyAgbmV3X3BhdGg9IiRwYXRoIgorICBpZiB0ZXN0ICJ4JGhhc19jb2xvbiIgPSB4OyB0aGVuCisgICAgIyBOb3QgaW4gbWl4ZWQgb3IgV2luZG93cyBzdHlsZSwgc3RhcnQgYnkgdGhhdC4KKyAgICBuZXdfcGF0aD1gY21kIC8vYyBlY2hvICRwYXRoYAorICBmaQorCisKKyAgaW5wdXRfcGF0aD0iJG5ld19wYXRoIgorICAjIENoZWNrIGlmIHdlIG5lZWQgdG8gY29udmVydCB0aGlzIHVzaW5nIERPUy1zdHlsZSBzaG9ydCBtb2RlLiBJZiB0aGUgcGF0aAorICAjIGNvbnRhaW5zIGp1c3Qgc2ltcGxlIGNoYXJhY3RlcnMsIHVzZSBpdC4gT3RoZXJ3aXNlIChzcGFjZXMsIHdlaXJkIGNoYXJhY3RlcnMpLAorICAjIHRha2Ugbm8gY2hhbmNlcyBhbmQgcmV3cml0ZSBpdC4KKyAgIyBOb3RlOiBtNCBlYXRzIG91ciBbXSwgc28gd2UgbmVlZCB0byB1c2UgWyBhbmQgXSBpbnN0ZWFkLgorICBoYXNfZm9yYmlkZGVuX2NoYXJzPWAkRUNITyAiJGlucHV0X3BhdGgiIHwgJEdSRVAgW14tXy86YS16QS1aMC05XWAKKyAgaWYgdGVzdCAieCRoYXNfZm9yYmlkZGVuX2NoYXJzIiAhPSB4OyB0aGVuCisgICAgIyBOb3cgY29udmVydCBpdCB0byBtaXhlZCBET1Mtc3R5bGUsIHNob3J0IG1vZGUgKG5vIHNwYWNlcywgYW5kIC8gaW5zdGVhZCBvZiBcKQorICAgIG5ld19wYXRoPWBjbWQgL2MgImZvciAlQSBpbiAoXCIkaW5wdXRfcGF0aFwiKSBkbyBAZWNobyAlfnNBInwkVFIgXFxcXFxcXFwgLyB8ICRUUiAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidgCisgIGZpCisKKworICB3aW5kb3dzX3BhdGg9IiRuZXdfcGF0aCIKKyAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MuY3lnd2luIjsgdGhlbgorICAgIHVuaXhfcGF0aD1gJENZR1BBVEggLXUgIiR3aW5kb3dzX3BhdGgiYAorICAgIG5ld19wYXRoPSIkdW5peF9wYXRoIgorICBlbGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PU19FTlYiID0gInh3aW5kb3dzLm1zeXMiOyB0aGVuCisgICAgdW5peF9wYXRoPWAkRUNITyAiJHdpbmRvd3NfcGF0aCIgfCAkU0VEIC1lICdzLF5cXCguXFwpOiwvXFwxLGcnIC1lICdzLFxcXFwsLyxnJ2AKKyAgICBuZXdfcGF0aD0iJHVuaXhfcGF0aCIKKyAgZmkKKworICBpZiB0ZXN0ICJ4JHBhdGgiICE9ICJ4JG5ld19wYXRoIjsgdGhlbgorICAgIEZSRUVUWVBFTE9DQVRJT049IiRuZXdfcGF0aCIKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFJld3JpdGluZyBGUkVFVFlQRUxPQ0FUSU9OIHRvIFwiJG5ld19wYXRoXCIiID4mNQorJGFzX2VjaG8gIiRhc19tZTogUmV3cml0aW5nIEZSRUVUWVBFTE9DQVRJT04gdG8gXCIkbmV3X3BhdGhcIiIgPiY2O30KKyAgZmkKKworICAjIFNhdmUgdGhlIGZpcnN0IDEwIGJ5dGVzIG9mIHRoaXMgcGF0aCB0byB0aGUgc3RvcmFnZSwgc28gZml4cGF0aCBjYW4gd29yay4KKyAgYWxsX2ZpeHBhdGhfcHJlZml4ZXM9KCIke2FsbF9maXhwYXRoX3ByZWZpeGVzW0BdfSIgIiR7bmV3X3BhdGg6MDoxMH0iKQorCisgIGVsc2UKKyAgICAjIFdlJ3JlIG9uIGEgcG9zaXggcGxhdGZvcm0uIEhvb3JheSEgOikKKyAgICBwYXRoPSIkRlJFRVRZUEVMT0NBVElPTiIKKworICAgIGlmIHRlc3QgISAtZiAiJHBhdGgiICYmIHRlc3QgISAtZCAiJHBhdGgiOyB0aGVuCisgICAgICBhc19mbl9lcnJvciAkPyAiVGhlIHBhdGggb2YgRlJFRVRZUEVMT0NBVElPTiwgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkcGF0aFwiLCBpcyBub3QgZm91bmQuIiAiJExJTkVOTyIgNQorICAgIGZpCisKKyAgICBoYXNfc3BhY2U9YCRFQ0hPICIkcGF0aCIgfCAkR1JFUCAiICJgCisgICAgaWYgdGVzdCAieCRoYXNfc3BhY2UiICE9IHg7IHRoZW4KKyAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogVGhlIHBhdGggb2YgRlJFRVRZUEVMT0NBVElPTiwgd2hpY2ggcmVzb2x2ZXMgYXMgXCIkcGF0aFwiLCBpcyBpbnZhbGlkLiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBUaGUgcGF0aCBvZiBGUkVFVFlQRUxPQ0FUSU9OLCB3aGljaCByZXNvbHZlcyBhcyBcIiRwYXRoXCIsIGlzIGludmFsaWQuIiA+JjY7fQorICAgICAgYXNfZm5fZXJyb3IgJD8gIlNwYWNlcyBhcmUgbm90IGFsbG93ZWQgaW4gdGhpcyBwYXRoLiIgIiRMSU5FTk8iIDUKKyAgICBmaQorICBmaQorCisJICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGZyZWV0eXBlIGluIHNvbWUgc3RhbmRhcmQgd2luZG93cyBsb2NhdGlvbnMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGZyZWV0eXBlIGluIHNvbWUgc3RhbmRhcmQgd2luZG93cyBsb2NhdGlvbnMuLi4gIiA+JjY7IH0KKwkgICAgaWYgdGVzdCAtcyAiJEZSRUVUWVBFTE9DQVRJT04vaW5jbHVkZS9mdDJidWlsZC5oIiAmJiB0ZXN0IC1kICIkRlJFRVRZUEVMT0NBVElPTi9pbmNsdWRlL2ZyZWV0eXBlMi9mcmVldHlwZSI7IHRoZW4KKwkgICAgICAgIEZSRUVUWVBFMl9DRkxBR1M9Ii1JJEZSRUVUWVBFTE9DQVRJT04vaW5jbHVkZS9mcmVldHlwZTIgLUkkRlJFRVRZUEVMT0NBVElPTi9pbmNsdWRlIgorCSAgICAgICAgRlJFRVRZUEUyX0xJQlM9IiRGUkVFVFlQRUxPQ0FUSU9OL2xpYi9mcmVldHlwZS5saWIiCisgCSAgICAgICAgRlJFRVRZUEUyX0xJQl9QQVRIPSIkRlJFRVRZUEVMT0NBVElPTi9saWIiCisgICAgICAgICAgICAgICAgaWYgISB0ZXN0IC1zICIkRlJFRVRZUEUyX0xJQlMiOyB0aGVuCisJCSAgIGFzX2ZuX2Vycm9yICQ/ICJDb3VsZCBub3QgZmluZCAkRlJFRVRZUEUyX0xJQlMiICIkTElORU5PIiA1CisJCWZpCisgICAgICAgICAgICAgICAgaWYgISB0ZXN0IC1zICIkRlJFRVRZUEUyX0xJQl9QQVRIL2ZyZWV0eXBlLmRsbCI7IHRoZW4KKwkJICAgYXNfZm5fZXJyb3IgJD8gIkNvdWxkIG5vdCBmaW5kICRGUkVFVFlQRTJfTElCX1BBVEgvZnJlZXR5cGUuZGxsIiAiJExJTkVOTyIgNQorCQlmaQorICAgICAgICAgICAgICAgIFVTSU5HX1NZU1RFTV9GVF9MSUI9dHJ1ZQorICAgICAgICAgICAgICAgIEZSRUVUWVBFMl9GT1VORD15ZXMKKwkgICAgZmkKKwkgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRGUkVFVFlQRTJfRk9VTkQiID4mNQorJGFzX2VjaG8gIiRGUkVFVFlQRTJfRk9VTkQiID4mNjsgfQorICAgICAgICBmaQogCWlmIHRlc3QgIngkRlJFRVRZUEUyX0ZPVU5EIiA9IHhubzsgdGhlbgogCiBwa2dfZmFpbGVkPW5vCkBAIC0xNjkxOSw3ICsyODkwNCwxMyBAQAogJGFzX2VjaG8gInllcyIgPiY2OyB9CiAJRlJFRVRZUEUyX0ZPVU5EPXllcwogZmkKKyAgICAgICAgICAgICMgT24gc29sYXJpcywgcGtnX2NoZWNrIGFkZHMgLWx6IHRvIGZyZWV0eXBlIGxpYnMsIHdoaWNoIGlzbid0IG5lY2Vzc2FyeSBmb3IgdXMuCisgICAgICAgICAgICBGUkVFVFlQRTJfTElCUz1gJEVDSE8gJEZSRUVUWVBFMl9MSUJTIHwgJFNFRCAncy8tbHovL2cnYAogICAgICAgICAgICAgVVNJTkdfU1lTVEVNX0ZUX0xJQj10cnVlCisgICAgICAgICAgICAjIDY0LWJpdCBsaWJzIGZvciBTb2xhcmlzIHg4NiBhcmUgaW5zdGFsbGVkIGluIHRoZSBhbWQ2NCBzdWJkaXJlY3RvcnksIGNoYW5nZSBsaWIgdG8gbGliL2FtZDY0CisgICAgICAgICAgICBpZiB0ZXN0ICJ4JEZSRUVUWVBFMl9GT1VORCIgPSB4eWVzICYmIHRlc3QgIngkT1BFTkpES19UQVJHRVRfT1MiID0geHNvbGFyaXMgJiYgdGVzdCAieCRPUEVOSkRLX1RBUkdFVF9DUFUiID0geHg4Nl82NDsgdGhlbgorICAgICAgICAgICAgICBGUkVFVFlQRTJfTElCUz1gJEVDSE8gJEZSRUVUWVBFMl9MSUJTIHwgJFNFRCAncz8vbGliPy9saWIvYW1kNjQ/ZydgCisgICAgICAgICAgICBmaQogCWZpCiAJaWYgdGVzdCAieCRGUkVFVFlQRTJfRk9VTkQiID0geG5vOyB0aGVuCiAJICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGZyZWV0eXBlIGluIHNvbWUgc3RhbmRhcmQgbG9jYXRpb25zIiA+JjUKQEAgLTE2OTkzLDYgKzI4OTg0LDYwIEBACiAKIAkJYXNfZm5fZXJyb3IgJD8gIkNvdWxkIG5vdCBmaW5kIGZyZWV0eXBlMiEgJEhFTFBfTVNHICIgIiRMSU5FTk8iIDUKIAlmaQorCisgICAgICAgIGlmIHRlc3QgIngkT1BFTkpES19UQVJHRVRfT1MiICE9IHh3aW5kb3dzOyB0aGVuCisgICAgICAgICAgICAjIEFDX0NIRUNLX0xJQiBkb2VzIG5vdCBzdXBwb3J0IHVzZSBvZiBjbC5leGUKKyAgICAgICAgICAgIFBSRVZfTERGTEFHUz0iJExERkxBR1MiCisgICAgICAgICAgICBMREZMQUdTPSIkRlJFRVRZUEUyX0xJQlMiCisgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBGVF9Jbml0X0ZyZWVUeXBlIGluIC1sZnJlZXR5cGUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIEZUX0luaXRfRnJlZVR5cGUgaW4gLWxmcmVldHlwZS4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9saWJfZnJlZXR5cGVfRlRfSW5pdF9GcmVlVHlwZStzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKK0xJQlM9Ii1sZnJlZXR5cGUgICRMSUJTIgorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIEZUX0luaXRfRnJlZVR5cGUgKCk7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBGVF9Jbml0X0ZyZWVUeXBlICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jeHhfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfbGliX2ZyZWV0eXBlX0ZUX0luaXRfRnJlZVR5cGU9eWVzCitlbHNlCisgIGFjX2N2X2xpYl9mcmVldHlwZV9GVF9Jbml0X0ZyZWVUeXBlPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9mcmVldHlwZV9GVF9Jbml0X0ZyZWVUeXBlIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfbGliX2ZyZWV0eXBlX0ZUX0luaXRfRnJlZVR5cGUiID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9saWJfZnJlZXR5cGVfRlRfSW5pdF9GcmVlVHlwZSIgPSB4IiJ5ZXM7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfTElCRlJFRVRZUEUgMQorX0FDRU9GCisKKyAgTElCUz0iLWxmcmVldHlwZSAkTElCUyIKKworZWxzZQorICBhc19mbl9lcnJvciAkPyAiQ291bGQgbm90IGZpbmQgZnJlZXR5cGUyISAkSEVMUF9NU0cgIiAiJExJTkVOTyIgNQorZmkKKworICAgICAgICAgICAgTERGTEFHUz0iJFBSRVZfTERGTEFHUyIKKyAgICAgICAgZmkKIGZpCiAKIApAQCAtMTc3OTUsMTYgKzI5ODQwLDE5IEBACiAgICAgaWYgdGVzdCAieCRlbmFibGVfc3RhdGljX2xpbmtfc3RkY19fIiA9IHh5ZXM7IHRoZW4KICAgICAgICAgTElCQ1hYPSIkTElCQ1hYICRTVEFUSUNfU1REQ1hYX0ZMQUdTIgogICAgICAgICBMRENYWD0iJENDIgorICAgICAgICBTVEFUSUNfQ1hYX1NFVFRJTkc9IlNUQVRJQ19DWFg9dHJ1ZSIKICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHN0YXRpYyIgPiY1CiAkYXNfZWNobyAic3RhdGljIiA+JjY7IH0KICAgICBlbHNlCiAgICAgICAgIExJQkNYWD0iJExJQkNYWCAtbHN0ZGMrKyIKICAgICAgICAgTERDWFg9IiRDWFgiCisgICAgICAgIFNUQVRJQ19DWFhfU0VUVElORz0iU1RBVElDX0NYWD1mYWxzZSIKICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IGR5bmFtaWMiID4mNQogJGFzX2VjaG8gImR5bmFtaWMiID4mNjsgfQogICAgIGZpCiBmaQogCisKICMgbGliQ3J1biBpcyB0aGUgYysrIHJ1bnRpbWUtbGlicmFyeSB3aXRoIFN1blN0dWRpbyAocm91Z2hseSB0aGUgZXF1aXZhbGVudCBvZiBnY2MncyBsaWJzdGRjKysuc28pCiBpZiB0ZXN0ICJ4JE9QRU5KREtfVEFSR0VUX09TIiA9IHhzb2xhcmlzICYmIHRlc3QgIngkTElCQ1hYIiA9IHg7IHRoZW4KICAgICBMSUJDWFg9Ii91c3IvbGliJHtPUEVOSkRLX1RBUkdFVF9DUFVfSVNBRElSfS9saWJDcnVuLnNvLjEiCkBAIC0xNzgxOSw2ICsyOTg2Nyw2NiBAQAogCiAKIAorIyBBZnRlciB3ZSBoYXZlIHRvb2xjaGFpbiBhbmQgdGhlIHBhdGhzIHRvIGFsbCBsaWJyYXJpZXMgKG5lZWRlZCBieSBtc3lzKSwgd2UgY2FuIGNvbXBpbGUgdGhlIGZpeHBhdGggaGVscGVyCisKKyMgV2hlbiB1c2luZyBjeWd3aW4gb3IgbXN5cywgd2UgbmVlZCBhIHdyYXBwZXIgYmluYXJ5IHRoYXQgcmVuYW1lcworIyAvY3lnZHJpdmUvYy8gYXJndW1lbnRzIGludG8gYzovIGFyZ3VtZW50cyBhbmQgcGVla3MgaW50bworIyBAZmlsZXMgYW5kIHJld3JpdGVzIHRoZXNlIHRvbyEgVGhpcyB3cmFwcGVyIGJpbmFyeSBpcworIyBjYWxsZWQgZml4cGF0aC4KK0ZJWFBBVEg9CitpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1MiID0geHdpbmRvd3M7IHRoZW4KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmIGZpeHBhdGggY2FuIGJlIGNyZWF0ZWQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgZml4cGF0aCBjYW4gYmUgY3JlYXRlZC4uLiAiID4mNjsgfQorICAgIEZJWFBBVEhfU1JDPSIkU1JDX1JPT1QvY29tbW9uL3NyYy9maXhwYXRoLmMiCisgICAgRklYUEFUSF9CSU49IiRPVVRQVVRfUk9PVC9maXhwYXRoLmV4ZSIKKyAgICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9IHh3aW5kb3dzLmN5Z3dpbjsgdGhlbgorICAgICAgRklYUEFUSF9TUkM9YCRDWUdQQVRIIC1tICRGSVhQQVRIX1NSQ2AKKyAgICAgIEZJWFBBVEhfQklOPWAkQ1lHUEFUSCAtbSAkRklYUEFUSF9CSU5gCisgICAgICAjIEltcG9ydGFudCB0byBrZWVwIHRoZSAuZXhlIHN1ZmZpeCBvbiBDeWd3aW4gZm9yIEhvdHNwb3QgbWFrZWZpbGVzCisgICAgICBGSVhQQVRIPSIkT1VUUFVUX1JPT1QvZml4cGF0aC5leGUgLWMiCisgICAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9IHh3aW5kb3dzLm1zeXM7IHRoZW4KKyAgICAgIEZJWFBBVEhfU1JDPWBjbWQgLy9jIGVjaG8gJEZJWFBBVEhfU1JDYAorICAgICAgRklYUEFUSF9CSU49YGNtZCAvL2MgZWNobyAkRklYUEFUSF9CSU5gCisKKyAgICAgICMgVGFrZSBhbGwgY29sbGVjdGVkIHByZWZpeGVzIGFuZCB0dXJuIHRoZW0gaW50byBhIC1tL2MvZm9vQC9jL2JhckAuLi4gY29tbWFuZCBsaW5lCisgICAgICAjIEAgd2FzIGNob3NlbiBhcyBzZXBhcmF0b3IgdG8gbWluaW1pemUgcmlzayBvZiBvdGhlciB0b29scyBtZXNzaW5nIGFyb3VuZCB3aXRoIGl0CisgICAgICBhbGxfdW5pcXVlX3ByZWZpeGVzPWBlY2hvICIke2FsbF9maXhwYXRoX3ByZWZpeGVzW0BdfSIgfCB0ciAnICcgJ1xuJyB8IGdyZXAgJ14vLi8nIHwgc29ydCB8IHVuaXFgCisgICAgICBmaXhwYXRoX2FyZ3VtZW50X2xpc3Q9YGVjaG8gJGFsbF91bmlxdWVfcHJlZml4ZXMgIHwgdHIgJyAnICdAJ2AKKworICAgICAgRklYUEFUSD0iJE9VVFBVVF9ST09UL2ZpeHBhdGggLW0kZml4cGF0aF9hcmd1bWVudF9saXN0IgorICAgIGZpCisgICAgcm0gLWYgJE9VVFBVVF9ST09UL2ZpeHBhdGgqCisgICAgY2QgJE9VVFBVVF9ST09UCisgICAgJENDICRGSVhQQVRIX1NSQyAtRmUkRklYUEFUSF9CSU4gPiAkT1VUUFVUX1JPT1QvZml4cGF0aDEubG9nIDI+JjEKKyAgICBjZCAkQ1VSRElSCisKKyAgICBpZiB0ZXN0ICEgLXggJE9VVFBVVF9ST09UL2ZpeHBhdGguZXhlOyB0aGVuCisgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorICAgICAgICBjYXQgJE9VVFBVVF9ST09UL2ZpeHBhdGgxLmxvZworICAgICAgICBhc19mbl9lcnJvciAkPyAiQ291bGQgbm90IGNyZWF0ZSAkT1VUUFVUX1JPT1QvZml4cGF0aC5leGUiICIkTElORU5PIiA1CisgICAgZmkKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaWYgZml4cGF0aC5leGUgd29ya3MiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgZml4cGF0aC5leGUgd29ya3MuLi4gIiA+JjY7IH0KKyAgICBjZCAkT1VUUFVUX1JPT1QKKyAgICAkRklYUEFUSCAkQ0MgJFNSQ19ST09UL2NvbW1vbi9zcmMvZml4cGF0aC5jIC1GZSRPVVRQVVRfUk9PVC9maXhwYXRoMi5leGUgPiAkT1VUUFVUX1JPT1QvZml4cGF0aDIubG9nIDI+JjEKKyAgICBjZCAkQ1VSRElSCisgICAgaWYgdGVzdCAhIC14ICRPVVRQVVRfUk9PVC9maXhwYXRoMi5leGU7IHRoZW4KKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisgICAgICAgIGNhdCAkT1VUUFVUX1JPT1QvZml4cGF0aDIubG9nCisgICAgICAgIGFzX2ZuX2Vycm9yICQ/ICJmaXhwYXRoIGRpZCBub3Qgd29yayEiICIkTElORU5PIiA1CisgICAgZmkKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorICAgIHJtIC1mICRPVVRQVVRfUk9PVC9maXhwYXRoPy4/Pz8gJE9VVFBVVF9ST09UL2ZpeHBhdGgub2JqCitmaQorCisKKworCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjCiAjIFdlIG5lZWQgdG8gZG8gc29tZSBmaW5hbCB0d2Vha2luZywgd2hlbiBldmVyeXRoaW5nIGVsc2UgaXMgZG9uZS4KQEAgLTE3ODczLDYgKzI5OTgxLDEwIEBACiAgICAgICAgICMgTG9va3MgbGlrZSBhIE1hY09TWCBzeXN0ZW0KICAgICAgICAgTlVNX0NPUkVTPWAvdXNyL3NiaW4vc3lzdGVtX3Byb2ZpbGVyIC1kZXRhaWxMZXZlbCBmdWxsIFNQSGFyZHdhcmVEYXRhVHlwZSB8IGdyZXAgJ0NvcmVzJyB8IGF3ayAgJ3twcmludCAkNX0nYAogICAgICAgICBGT1VORF9DT1JFUz15ZXMKKyAgICBlbGlmIHRlc3QgLW4gIiROVU1CRVJfT0ZfUFJPQ0VTU09SUyI7IHRoZW4KKyAgICAgICAgIyBPbiB3aW5kb3dzLCBsb29rIGluIHRoZSBlbnYKKyAgICAgICAgTlVNX0NPUkVTPSROVU1CRVJfT0ZfUFJPQ0VTU09SUworICAgICAgICBGT1VORF9DT1JFUz15ZXMKICAgICBmaQogCiAgICAgIyBGb3IgYy9jKysgY29kZSB3ZSBydW4gdHdpY2UgYXMgbWFueSBjb25jdXJyZW50IGJ1aWxkCkBAIC0xNzg4Myw4ICsyOTk5NSwxMCBAQAogICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJE5VTV9DT1JFUyIgPiY1CiAkYXNfZWNobyAiJE5VTV9DT1JFUyIgPiY2OyB9CiAgICAgZWxzZQotICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogY291bGQgbm90IGRldGVjdCBudW1iZXIgb2YgY29yZXMsIGRlZmF1bHRpbmcgdG8gMSEiID4mNQotJGFzX2VjaG8gImNvdWxkIG5vdCBkZXRlY3QgbnVtYmVyIG9mIGNvcmVzLCBkZWZhdWx0aW5nIHRvIDEhIiA+JjY7IH0KKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IGNvdWxkIG5vdCBkZXRlY3QgbnVtYmVyIG9mIGNvcmVzLCBkZWZhdWx0aW5nIHRvIDEiID4mNQorJGFzX2VjaG8gImNvdWxkIG5vdCBkZXRlY3QgbnVtYmVyIG9mIGNvcmVzLCBkZWZhdWx0aW5nIHRvIDEiID4mNjsgfQorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IFRoaXMgd2lsbCBkaXNhYmxlIGFsbCBwYXJhbGxlbGlzbSBmcm9tIGJ1aWxkISIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBUaGlzIHdpbGwgZGlzYWJsZSBhbGwgcGFyYWxsZWxpc20gZnJvbSBidWlsZCEiID4mMjt9CiAgICAgZmkKIAogCkBAIC0xNzkyNiw5ICszMDA0MCwxMCBAQAogICAgICAgICBNRU1PUllfU0laRT1gL3Vzci9zYmluL3N5c3RlbV9wcm9maWxlciAtZGV0YWlsTGV2ZWwgZnVsbCBTUEhhcmR3YXJlRGF0YVR5cGUgfCBncmVwICdNZW1vcnknIHwgYXdrICAne3ByaW50ICQyfSdgCiAgICAgICAgIE1FTU9SWV9TSVpFPWBleHByICRNRU1PUllfU0laRSBcKiAxMDI0YAogICAgICAgICBGT1VORF9NRU09eWVzCi0gICAgZWxpZiB0ZXN0ICJ4JGJ1aWxkX29zIiA9IHh3aW5kb3dzOyB0aGVuCisgICAgZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1MiID0geHdpbmRvd3M7IHRoZW4KICAgICAgICAgIyBXaW5kb3dzLCBidXQgd2l0aG91dCBjeWd3aW4KLSAgICAgICAgTUVNT1JZX1NJWkU9YHN5c3RlbWluZm8gfCBncmVwICdUb3RhbCBQaHlzaWNhbCBNZW1vcnk6JyB8IGF3ayAneyBwcmludCAkNCB9JyB8IHNlZCAncy8sLy8nYAorICAgICAgICBNRU1PUllfU0laRT1gd21pYyBjb21wdXRlcnN5c3RlbSBnZXQgdG90YWxwaHlzaWNhbG1lbW9yeSAtdmFsdWUgfCBncmVwID0gfCBjdXQgLWQgIj0iIC1mIDItYAorICAgICAgICBNRU1PUllfU0laRT1gZXhwciAkTUVNT1JZX1NJWkUgLyAxMDI0IC8gMTAyNGAKICAgICAgICAgRk9VTkRfTUVNPXllcwogICAgIGZpCiAKQEAgLTE3OTM2LDggKzMwMDUxLDEwIEBACiAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkTUVNT1JZX1NJWkUgTUIiID4mNQogJGFzX2VjaG8gIiRNRU1PUllfU0laRSBNQiIgPiY2OyB9CiAgICAgZWxzZQotICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogY291bGQgbm90IGRldGVjdCBtZW1vcnkgc2l6ZSBkZWZhdWx0aW5nIHRvIDEwMjQgTUIhIiA+JjUKLSRhc19lY2hvICJjb3VsZCBub3QgZGV0ZWN0IG1lbW9yeSBzaXplIGRlZmF1bHRpbmcgdG8gMTAyNCBNQiEiID4mNjsgfQorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogY291bGQgbm90IGRldGVjdCBtZW1vcnkgc2l6ZSwgZGVmYXVsdGluZyB0byAxMDI0IE1CIiA+JjUKKyRhc19lY2hvICJjb3VsZCBub3QgZGV0ZWN0IG1lbW9yeSBzaXplLCBkZWZhdWx0aW5nIHRvIDEwMjQgTUIiID4mNjsgfQorICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IFRoaXMgbWlnaHQgc2VyaW91c2x5IGltcGFjdCBidWlsZCBwZXJmb3JtYW5jZSEiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogVGhpcyBtaWdodCBzZXJpb3VzbHkgaW1wYWN0IGJ1aWxkIHBlcmZvcm1hbmNlISIgPiYyO30KICAgICBmaQogCiBlbHNlCkBAIC0xODM2NiwxMSArMzA0ODMsMjYgQEAKIAogCSMgZGYgLWwgbGlzdHMgb25seSBsb2NhbCBkaXNrczsgaWYgdGhlIGdpdmVuIGRpcmVjdG9yeSBpcyBub3QgZm91bmQgdGhlbgogCSMgYSBub24temVybyBleGl0IGNvZGUgaXMgZ2l2ZW4KLQlpZiAkREYgLWwgJE9VVFBVVF9ST09UID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICAgICAgICBPVVRQVVRfRElSX0lTX0xPQ0FMPSJ5ZXMiCi0gICAgICAgIGVsc2UKLSAgICAgICAgICBPVVRQVVRfRElSX0lTX0xPQ0FMPSJubyIKLSAgICAgICAgZmkKKyAgaWYgdGVzdCAieCRERiIgPSB4OyB0aGVuCisgICAgaWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TX0VOViIgPSAieHdpbmRvd3MubXN5cyI7IHRoZW4KKyAgICAgICMgbXN5cyBkb2VzIG5vdCBoYXZlIGRmOyB1c2UgV2luZG93cyAibmV0IHVzZSIgaW5zdGVhZC4KKyAgICAgIElTX05FVFdPUktfRElTSz1gbmV0IHVzZSB8IGdyZXAgXGBwd2QgLVcgfCBjdXQgLWQgIjoiIC1mIDEgfCB0ciBhLXogQS1aXGA6YAorICAgICAgaWYgdGVzdCAieCRJU19ORVRXT1JLX0RJU0siID0geDsgdGhlbgorICAgICAgICBPVVRQVVRfRElSX0lTX0xPQ0FMPSJ5ZXMiCisgICAgICBlbHNlCisgICAgICAgIE9VVFBVVF9ESVJfSVNfTE9DQUw9Im5vIgorICAgICAgZmkKKyAgICBlbHNlCisgICAgICAjIE5vIGRmIGhlcmUsIHNheSBpdCdzIGxvY2FsCisgICAgICBPVVRQVVRfRElSX0lTX0xPQ0FMPSJ5ZXMiCisgICAgZmkKKyAgZWxzZQorICAgIGlmICRERiAtbCAkT1VUUFVUX1JPT1QgPiAvZGV2L251bGwgMj4mMTsgdGhlbgorICAgICAgT1VUUFVUX0RJUl9JU19MT0NBTD0ieWVzIgorICAgIGVsc2UKKyAgICAgIE9VVFBVVF9ESVJfSVNfTE9DQUw9Im5vIgorICAgIGZpCisgIGZpCiAKIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkT1VUUFVUX0RJUl9JU19MT0NBTCIgPiY1CiAkYXNfZWNobyAiJE9VVFBVVF9ESVJfSVNfTE9DQUwiID4mNjsgfQpAQCAtMTg5MDksNyArMzEwNDEsNyBAQAogIyByZXBvcnQgYWN0dWFsIGlucHV0IHZhbHVlcyBvZiBDT05GSUdfRklMRVMgZXRjLiBpbnN0ZWFkIG9mIHRoZWlyCiAjIHZhbHVlcyBhZnRlciBvcHRpb25zIGhhbmRsaW5nLgogYWNfbG9nPSIKLVRoaXMgZmlsZSB3YXMgZXh0ZW5kZWQgYnkgb3BlbmpkayAkYXNfbWUgamRrOCwgd2hpY2ggd2FzCitUaGlzIGZpbGUgd2FzIGV4dGVuZGVkIGJ5IE9wZW5KREsgJGFzX21lIGpkazgsIHdoaWNoIHdhcwogZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjY3LiAgSW52b2NhdGlvbiBjb21tYW5kIGxpbmUgd2FzCiAKICAgQ09ORklHX0ZJTEVTICAgID0gJENPTkZJR19GSUxFUwpAQCAtMTg5NjUsMTMgKzMxMDk3LDE0IEBACiBDb25maWd1cmF0aW9uIGhlYWRlcnM6CiAkY29uZmlnX2hlYWRlcnMKIAotUmVwb3J0IGJ1Z3MgdG8gPGJ1aWxkLWRldkBvcGVuamRrLmphdmEubmV0Pi4iCitSZXBvcnQgYnVncyB0byA8YnVpbGQtZGV2QG9wZW5qZGsuamF2YS5uZXQ+LgorT3BlbkpESyBob21lIHBhZ2U6IDxodHRwOi8vb3Blbmpkay5qYXZhLm5ldD4uIgogCiBfQUNFT0YKIGNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQogYWNfY3NfY29uZmlnPSJgJGFzX2VjaG8gIiRhY19jb25maWd1cmVfYXJncyIgfCBzZWQgJ3MvXiAvLzsgcy9bXFwiIlxgXCRdL1xcXFwmL2cnYCIKIGFjX2NzX3ZlcnNpb249IlxcCi1vcGVuamRrIGNvbmZpZy5zdGF0dXMgamRrOAorT3BlbkpESyBjb25maWcuc3RhdHVzIGpkazgKIGNvbmZpZ3VyZWQgYnkgJDAsIGdlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42NywKICAgd2l0aCBvcHRpb25zIFxcIlwkYWNfY3NfY29uZmlnXFwiCiAKQEAgLTE5NzE4LDcgKzMxODUxLDE1IEBACiBwcmludGYgIiogSkRLIHZhcmlhbnQ6ICAgICRKREtfVkFSSUFOVFxuIgogcHJpbnRmICIqIEpWTSB2YXJpYW50czogICAkd2l0aF9qdm1fdmFyaWFudHNcbiIKIHByaW50ZiAiKiBPcGVuSkRLIHRhcmdldDogT1M6ICRPUEVOSkRLX1RBUkdFVF9PUywgQ1BVIGFyY2hpdGVjdHVyZTogJE9QRU5KREtfVEFSR0VUX0NQVV9BUkNILCBhZGRyZXNzIGxlbmd0aDogJE9QRU5KREtfVEFSR0VUX0NQVV9CSVRTXG4iCi1wcmludGYgIiogQm9vdCBKREs6ICAgICAgICRCT09UX0pES1xuIgorCitwcmludGYgIlxuIgorcHJpbnRmICJUb29scyBzdW1tYXJ5OlxuIgoraWYgdGVzdCAieCRPUEVOSkRLX0JVSUxEX09TIiA9ICJ4d2luZG93cyI7IHRoZW4KKyAgcHJpbnRmICIqIEVudmlyb25tZW50OiAgICAkV0lORE9XU19FTlZfVkVORE9SIHZlcnNpb24gJFdJTkRPV1NfRU5WX1ZFUlNJT04gKHJvb3QgYXQgJFdJTkRPV1NfRU5WX1JPT1RfUEFUSClcbiIKK2ZpCitwcmludGYgIiogQm9vdCBKREs6ICAgICAgICRCT09UX0pES19WRVJTSU9OIChhdCAkQk9PVF9KREspXG4iCitwcmludGYgIiogQyBDb21waWxlcjogICAgICRDQ19WRU5ET1IgdmVyc2lvbiAkQ0NfVkVSU0lPTiAoYXQgJENDKVxuIgorcHJpbnRmICIqIEMrKyBDb21waWxlcjogICAkQ1hYX1ZFTkRPUiB2ZXJzaW9uICRDWFhfVkVSU0lPTiAoYXQgJENYWClcbiIKIAogcHJpbnRmICJcbiIKIHByaW50ZiAiQnVpbGQgcGVyZm9ybWFuY2Ugc3VtbWFyeTpcbiIKZGlmZiAtLWdpdCBhL2NvbW1vbi9hdXRvY29uZi9oZWxwLm00IGIvY29tbW9uL2F1dG9jb25mL2hlbHAubTQKaW5kZXggMDFiNDgxNy4uMTJmZjM3MSAxMDA2NDQKLS0tIGEvY29tbW9uL2F1dG9jb25mL2hlbHAubTQKKysrIGIvY29tbW9uL2F1dG9jb25mL2hlbHAubTQKQEAgLTU1LDYgKzU1LDE5IEBACiAgICAgZmkKIF0pCiAKK2N5Z3dpbl9oZWxwKCkgeworICAgIGNhc2UgJDEgaW4KKyAgICB1bnppcCkKKyAgICAgICAgUEtHSEFORExFUl9DT01NQU5EPSJjZCA8bG9jYXRpb24gb2YgY3lnd2luIHNldHVwLmV4ZT4gJiYgY21kIC9jIHNldHVwIC1xIC1QIHVuemlwIiA7OworICAgIHppcCkKKyAgICAgICAgUEtHSEFORExFUl9DT01NQU5EPSJjZCA8bG9jYXRpb24gb2YgY3lnd2luIHNldHVwLmV4ZT4gJiYgY21kIC9jIHNldHVwIC1xIC1QIHppcCIgOzsKKyAgICBtYWtlKQorICAgICAgICBQS0dIQU5ETEVSX0NPTU1BTkQ9ImNkIDxsb2NhdGlvbiBvZiBjeWd3aW4gc2V0dXAuZXhlPiAmJiBjbWQgL2Mgc2V0dXAgLXEgLVAgbWFrZSIgOzsKKyAgICAqICkKKyAgICAgICBicmVhayA7OworICAgIGVzYWMKK30KKwogYXB0X2hlbHAoKSB7CiAgICAgY2FzZSAkMSBpbgogICAgIGRldmtpdCkKQEAgLTE0OSw3ICsxNjIsMTUgQEAKIHByaW50ZiAiKiBKREsgdmFyaWFudDogICAgJEpES19WQVJJQU5UXG4iCiBwcmludGYgIiogSlZNIHZhcmlhbnRzOiAgICR3aXRoX2p2bV92YXJpYW50c1xuIgogcHJpbnRmICIqIE9wZW5KREsgdGFyZ2V0OiBPUzogJE9QRU5KREtfVEFSR0VUX09TLCBDUFUgYXJjaGl0ZWN0dXJlOiAkT1BFTkpES19UQVJHRVRfQ1BVX0FSQ0gsIGFkZHJlc3MgbGVuZ3RoOiAkT1BFTkpES19UQVJHRVRfQ1BVX0JJVFNcbiIKLXByaW50ZiAiKiBCb290IEpESzogICAgICAgJEJPT1RfSkRLXG4iCisKK3ByaW50ZiAiXG4iCitwcmludGYgIlRvb2xzIHN1bW1hcnk6XG4iCitpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1MiID0gInh3aW5kb3dzIjsgdGhlbgorICBwcmludGYgIiogRW52aXJvbm1lbnQ6ICAgICRXSU5ET1dTX0VOVl9WRU5ET1IgdmVyc2lvbiAkV0lORE9XU19FTlZfVkVSU0lPTiAocm9vdCBhdCAkV0lORE9XU19FTlZfUk9PVF9QQVRIKVxuIgorZmkKK3ByaW50ZiAiKiBCb290IEpESzogICAgICAgJEJPT1RfSkRLX1ZFUlNJT04gKGF0ICRCT09UX0pESylcbiIKK3ByaW50ZiAiKiBDIENvbXBpbGVyOiAgICAgJENDX1ZFTkRPUiB2ZXJzaW9uICRDQ19WRVJTSU9OIChhdCAkQ0MpXG4iCitwcmludGYgIiogQysrIENvbXBpbGVyOiAgICRDWFhfVkVORE9SIHZlcnNpb24gJENYWF9WRVJTSU9OIChhdCAkQ1hYKVxuIgogCiBwcmludGYgIlxuIgogcHJpbnRmICJCdWlsZCBwZXJmb3JtYW5jZSBzdW1tYXJ5OlxuIgpkaWZmIC0tZ2l0IGEvY29tbW9uL2F1dG9jb25mL2hvdHNwb3Qtc3BlYy5nbWsuaW4gYi9jb21tb24vYXV0b2NvbmYvaG90c3BvdC1zcGVjLmdtay5pbgppbmRleCBiNGU5ZDVjLi42OGNjOGU0IDEwMDY0NAotLS0gYS9jb21tb24vYXV0b2NvbmYvaG90c3BvdC1zcGVjLmdtay5pbgorKysgYi9jb21tb24vYXV0b2NvbmYvaG90c3BvdC1zcGVjLmdtay5pbgpAQCAtNDgsOCArNDgsOCBAQAogCiAjIFRoZSBIT1NUQ0MvSE9TVENYWCBpcyBIb3RzcG90IHRlcm1pbm9sb2d5IGZvciB0aGUgQlVJTERfQ0MvQlVJTERfQ1hYLCBpLmUuIHRoZQogIyBjb21waWxlciB0aGF0IHByb2R1Y2VzIGNvZGUgdGhhdCBjYW4gYmUgcnVuIG9uIHRoZSBidWlsZCBwbGF0Zm9ybS4KLUhPU1RDQzo9QFVOQ1lHRFJJVkVAIEBCVUlMRF9DQ0AKLUhPU1RDWFg6PUBVTkNZR0RSSVZFQCBAQlVJTERfQ1hYQAorSE9TVENDOj1ARklYUEFUSEAgQEJVSUxEX0NDQAorSE9TVENYWDo9QEZJWFBBVEhAIEBCVUlMRF9DWFhACiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMKQEAgLTc4LDEzICs3OCwyMyBAQAogQUxUX09VVFBVVERJUj0kKEhPVFNQT1RfT1VUUFVURElSKQogQUxUX0VYUE9SVF9QQVRIPSQoSE9UU1BPVF9ESVNUKQogCi1IT1RTUE9UX01BS0VfQVJHUzo9QEhPVFNQT1RfTUFLRV9BUkdTQAorSE9UU1BPVF9NQUtFX0FSR1M6PUBIT1RTUE9UX01BS0VfQVJHU0AgQFNUQVRJQ19DWFhfU0VUVElOR0AKICMgVGhpcyBpcyB1c2VkIGZyb20gdGhlIGxpYmp2bSBidWlsZCBmb3IgQy9DKysgY29kZS4KIEhPVFNQT1RfQlVJTERfSk9CUzo9QENPTkNVUlJFTlRfQlVJTERfSk9CU0AKICMgQ29udHJvbCB3ZXRoZXIgSG90c3BvdCBydW5zIFF1ZWVucyB0ZXN0IGFmdGVyIGJ1aWxkaW5nCiBURVNUX0lOX0JVSUxEPUBURVNUX0lOX0JVSUxEQAogCisjIEZvciBob3RzcG90LCBvdmVycmlkZSBjb21waWxlci90b29scyBkZWZpbml0aW9uIHRvIG5vdCBpbmNsdWRlIEZJWFBBVEggcHJlZml4LgorIyBIb3RzcG90IGhhcyBpdHMgb3duIGhhbmRsaW5nIG9uIHRoZSBXaW5kb3dzIHBhdGggc2l0dWF0aW9uLgorQ1hYOj1AQ0NBQ0hFQCBASE9UU1BPVF9DWFhACitMRDo9QEhPVFNQT1RfTERACitNVDo9QEhPVFNQT1RfTVRACitSQzo9QEhPVFNQT1RfUkNACiAKIEVYVFJBX0NGTEFHUz1ATEVHQUNZX0VYVFJBX0NGTEFHU0AKIEVYVFJBX0NYWEZMQUdTPUBMRUdBQ1lfRVhUUkFfQ1hYRkxBR1NACiBFWFRSQV9MREZMQUdTPUBMRUdBQ1lfRVhUUkFfTERGTEFHU0AKKworIyBTbmVhayB0aGlzIGluIHZpYSB0aGUgc3BlYy5nbWsgZmlsZSwgc2luY2Ugd2UgZG9uJ3Qgd2FudCB0byBtZXNzIGFyb3VuZCB0b28gbXVjaCB3aXRoIHRoZSBIb3RzcG90IG1ha2UgZmlsZXMuCisjIFRoaXMgaXMgbmVlZGVkIHRvIGdldCB0aGUgTE9HIHNldHRpbmcgdG8gd29yayBwcm9wZXJseS4KK2luY2x1ZGUgJChTUkNfUk9PVCkvY29tbW9uL21ha2VmaWxlcy9NYWtlQmFzZS5nbWsKZGlmZiAtLWdpdCBhL2NvbW1vbi9hdXRvY29uZi9qZGstb3B0aW9ucy5tNCBiL2NvbW1vbi9hdXRvY29uZi9qZGstb3B0aW9ucy5tNAppbmRleCA5MmQ5N2UyLi4zOWUwMDNmIDEwMDY0NAotLS0gYS9jb21tb24vYXV0b2NvbmYvamRrLW9wdGlvbnMubTQKKysrIGIvY29tbW9uL2F1dG9jb25mL2pkay1vcHRpb25zLm00CkBAIC02NCw3ICs2NCw3IEBACiAjICAgICAgICAgICAgIGllIG5vcm1hbCBpbnRlcnByZXRlciBhbmQgQzEsIG9ubHkgdGhlIHNlcmlhbCBHQywga2VybmVsIGp2bXRpIGV0YwogIyAgICB6ZXJvOiBubyBtYWNoaW5lIGNvZGUgaW50ZXJwcmV0ZXIsIG5vIGNvbXBpbGVyCiAjICAgIHplcm9zaGFyazogemVybyBpbnRlcnByZXRlciBhbmQgc2hhcmsvbGx2bSBjb21waWxlciBiYWNrZW5kCi1BQ19NU0dfQ0hFQ0tJTkcoW3doaWNoIHZhcmlhbnRzIG9mIHRoZSBKVk0gdGhhdCBzaG91bGQgYmUgYnVpbHRdKQorQUNfTVNHX0NIRUNLSU5HKFt3aGljaCB2YXJpYW50cyBvZiB0aGUgSlZNIHRvIGJ1aWxkXSkKIEFDX0FSR19XSVRIKFtqdm0tdmFyaWFudHNdLCBbQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1qdm0tdmFyaWFudHNdLAogCVtKVk0gdmFyaWFudHMgKHNlcGFyYXRlZCBieSBjb21tYXMpIHRvIGJ1aWxkIChzZXJ2ZXIsIGNsaWVudCwga2VybmVsLCB6ZXJvLCB6ZXJvc2hhcmspIEA8OkBzZXJ2ZXJAOj5AXSldKQogCkBAIC0yNDEsNDggKzI0MSw0NyBAQAogIyBTaG91bGQgd2UgYnVpbGQgb25seSBPcGVuSkRLIGV2ZW4gaWYgY2xvc2VkIHNvdXJjZXMgYXJlIHByZXNlbnQ/CiAjCiBBQ19BUkdfRU5BQkxFKFtvcGVuamRrLW9ubHldLCBbQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLW9wZW5qZGstb25seV0sCi0gICAgW2J1aWxkIE9wZW5KREsgcmVnYXJkbGVzcyBvZiB0aGUgcHJlc2VuY2Ugb2YgY2xvc2VkIHJlcG9zaXRvcmllcyBAPDpAZGlzYWJsZWRAOj5AXSldLCwpCisgICAgW3N1cHJlc3MgYnVpbGRpbmcgY2xvc2VkIHNvdXJjZSBldmVuIGlmIHByZXNlbnQgQDw6QGRpc2FibGVkQDo+QF0pXSwsW2VuYWJsZV9vcGVuamRrX29ubHk9Im5vIl0pCiAKLWlmIHRlc3QgIngkZW5hYmxlX29wZW5qZGtfb25seSIgPSAieHllcyI7IHRoZW4KLSAgICBPUEVOSkRLPXRydWUKLWVsaWYgdGVzdCAieCRlbmFibGVfb3Blbmpka19vbmx5IiA9ICJ4bm8iOyB0aGVuCi0gICAgT1BFTkpESz1mYWxzZQotZWxpZiB0ZXN0IC1kICIkU1JDX1JPT1QvamRrL3NyYy9jbG9zZWQiOyB0aGVuCi0gICAgT1BFTkpESz1mYWxzZQorQUNfTVNHX0NIRUNLSU5HKFtmb3IgcHJlc2VuY2Ugb2YgY2xvc2VkIHNvdXJjZXNdKQoraWYgdGVzdCAtZCAiJFNSQ19ST09UL2pkay9zcmMvY2xvc2VkIjsgdGhlbgorICAgIENMT1NFRF9TT1VSQ0VfUFJFU0VOVD15ZXMKIGVsc2UKKyAgICBDTE9TRURfU09VUkNFX1BSRVNFTlQ9bm8KK2ZpCitBQ19NU0dfUkVTVUxUKFskQ0xPU0VEX1NPVVJDRV9QUkVTRU5UXSkKKworQUNfTVNHX0NIRUNLSU5HKFtpZiBjbG9zZWQgc291cmNlIGlzIHN1cHJlc3NlZCAob3Blbmpkay1vbmx5KV0pCitTVVBSRVNTX0NMT1NFRF9TT1VSQ0U9IiRlbmFibGVfb3Blbmpka19vbmx5IgorQUNfTVNHX1JFU1VMVChbJFNVUFJFU1NfQ0xPU0VEX1NPVVJDRV0pCisKK2lmIHRlc3QgIngkQ0xPU0VEX1NPVVJDRV9QUkVTRU5UIiA9IHhubzsgdGhlbgorICBPUEVOSkRLPXRydWUKKyAgaWYgdGVzdCAieCRTVVBSRVNTX0NMT1NFRF9TT1VSQ0UiID0gInh5ZXMiOyB0aGVuCisgICAgQUNfTVNHX1dBUk4oW05vIGNsb3NlZCBzb3VyY2UgcHJlc2VudCwgLS1lbmFibGUtb3Blbmpkay1vbmx5IG1ha2VzIG5vIHNlbnNlXSkKKyAgZmkKK2Vsc2UKKyAgaWYgdGVzdCAieCRTVVBSRVNTX0NMT1NFRF9TT1VSQ0UiID0gInh5ZXMiOyB0aGVuCiAgICAgT1BFTkpESz10cnVlCisgIGVsc2UKKyAgICBPUEVOSkRLPWZhbHNlCisgIGZpCiBmaQogCiBpZiB0ZXN0ICJ4JE9QRU5KREsiID0gInh0cnVlIjsgdGhlbgotICAgIFNFVF9PUEVOSkRLPU9QRU5KREs9dHJ1ZQorICAgIFNFVF9PUEVOSkRLPSJPUEVOSkRLPXRydWUiCiBmaQogCiBBQ19TVUJTVChTRVRfT1BFTkpESykKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIwotIyBKSUdTQVcgb3Igbm90LiAgVGhlIEpJR1NBVyB2YXJpYWJsZSBpcyB1c2VkIGR1cmluZyB0aGUgaW50ZXJtZWRpYXRlCi0jIHN0YWdlIHdoZW4gd2UgYXJlIGJ1aWxkaW5nIGJvdGggdGhlIG9sZCBzdHlsZSBKREsgYW5kIHRoZSBuZXcgc3R5bGUgbW9kdWxhcml6ZWQgSkRLLgotIyBXaGVuIHRoZSBtb2R1bGFyaXplZCBKREsgaXMgZmluYWxpemVkLCB0aGlzIG9wdGlvbiB3aWxsIGdvIGF3YXkuCi0jCi1BQ19BUkdfRU5BQkxFKFtqaWdzYXddLCBbQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWppZ3Nhd10sCi0gICAgW2J1aWxkIEppZ3NhdyBpbWFnZXMgKG5vdCB5ZXQgYXZhaWxhYmxlKSBAPDpAZGlzYWJsZWRAOj5AXSldLCwpCi0KLWlmIHRlc3QgIngkZW5hYmxlX2ppZ3NhdyIgPSAieHllcyI7IHRoZW4KLSAgICBKSUdTQVc9dHJ1ZQotZWxzZQotICAgIEpJR1NBVz1mYWxzZQotZmkKLUFDX1NVQlNUKEpJR1NBVykKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwogIyBTaG91bGQgd2UgYnVpbGQgYSBKREsvSlZNIHdpdGggaGVhZGZ1bCBzdXBwb3J0IChpZSBhIGdyYXBoaWNhbCB1aSk/CiAjIFdlIGFsd2F5cyBidWlsZCBoZWFkbGVzcyBzdXBwb3J0LgogIwogQUNfTVNHX0NIRUNLSU5HKFtoZWFkZnVsIHN1cHBvcnRdKQogQUNfQVJHX0VOQUJMRShbaGVhZGZ1bF0sIFtBU19IRUxQX1NUUklORyhbLS1kaXNhYmxlLWhlYWRmdWxdLAotCVtidWlsZCBoZWFkZnVsIHN1cHBvcnQgKGdyYXBoaWNhbCBVSSBzdXBwb3J0KSBAPDpAZW5hYmxlZEA6PkBdKV0sCisJW2Rpc2FibGUgYnVpbGRpbmcgaGVhZGZ1bCBzdXBwb3J0IChncmFwaGljYWwgVUkgc3VwcG9ydCkgQDw6QGVuYWJsZWRAOj5AXSldLAogICAgIFtTVVBQT1JUX0hFQURGVUw9JHtlbmFibGVfaGVhZGZ1bH1dLCBbU1VQUE9SVF9IRUFERlVMPXllc10pCiAKIFNVUFBPUlRfSEVBRExFU1M9eWVzCkBAIC0zMDUsMjUgKzMwNCw5IEBACiBBQ19TVUJTVChTVVBQT1JUX0hFQURGVUwpCiBBQ19TVUJTVChCVUlMRF9IRUFETEVTUykKIAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyBTaG91bGQgd2UgY29tcGlsZSBuaW1idXMgc3dpbmcgTCZGPyBXZSBjYW4gcHJvYmFibHkgcmVtb3ZlIHRoaXMgb3B0aW9uCi0jIHNpbmNlIG5pbWJ1cyBpcyBvZmZpY2lhbGx5IHBhcnQgb2YgamF2YXggbm93LgotIwotQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGJ1aWxkIG5pbWJ1cyBMJkZdKQotQUNfQVJHX0VOQUJMRShbbmltYnVzXSwgW0FTX0hFTFBfU1RSSU5HKFstLWRpc2FibGUtbmltYnVzXSwKLQlbZGlzYWJsZSBOaW1idXMgTCZGIEA8OkBlbmFibGVkQDo+QF0pXSwKLQlbRU5BQkxFX05JTUJVUz0iJHtlbmFibGV2YWx9Il0sIFtFTkFCTEVfTklNQlVTPSd5ZXMnXSkKLUFDX01TR19SRVNVTFQoWyRFTkFCTEVfTklNQlVTXSkKLURJU0FCTEVfTklNQlVTPQotaWYgdGVzdCAieCRFTkFCTEVfTklNQlVTIiA9IHhubzsgdGhlbgotICAgIERJU0FCTEVfTklNQlVTPXRydWUKLWZpCi1BQ19TVUJTVChESVNBQkxFX05JTUJVUykKLQogIyBDb250cm9sIHdldGhlciBIb3RzcG90IHJ1bnMgUXVlZW5zIHRlc3QgYWZ0ZXIgYnVpbGQuCiBBQ19BUkdfRU5BQkxFKFtob3RzcG90LXRlc3QtaW4tYnVpbGRdLCBbQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWhvdHNwb3QtdGVzdC1pbi1idWlsZF0sCi0JW2VuYWJsZSBydW5uaW5nIG9mIFF1ZWVucyB0ZXN0IGFmdGVyIEhvdHNwb3QgYnVpbGQgKG5vdCB5ZXQgYXZhaWxhYmxlKSBAPDpAZGlzYWJsZWRAOj5AXSldLCwKKwlbcnVuIHRoZSBRdWVlbnMgdGVzdCBhZnRlciBIb3RzcG90IGJ1aWxkIEA8OkBkaXNhYmxlZEA6PkBdKV0sLAogICAgIFtlbmFibGVfaG90c3BvdF90ZXN0X2luX2J1aWxkPW5vXSkKIGlmIHRlc3QgIngkZW5hYmxlX2hvdHNwb3RfdGVzdF9pbl9idWlsZCIgPSAieHllcyI7IHRoZW4KICAgICBURVNUX0lOX0JVSUxEPXRydWUKQEAgLTM1MSw0MyArMzM0LDI1IEBACiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMKKyMgRW5hYmxlIG9yIGRpc2FibGUgdW5saW1pdGVkIGNyeXB0bworIworQUNfQVJHX0VOQUJMRSh1bmxpbWl0ZWQtY3J5cHRvLCBbQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXVubGltaXRlZC1jcnlwdG9dLAorICAgICAgICBbRW5hYmxlIHVubGltaXRlZCBjcnlwdG8gcG9saWN5IEA8OkBkaXNhYmxlZEA6PkBdKV0sLAorICAgIFtlbmFibGVfdW5saW1pdGVkX2NyeXB0bz1ub10pCitpZiB0ZXN0ICJ4JGVuYWJsZV91bmxpbWl0ZWRfY3J5cHRvIiA9ICJ4eWVzIjsgdGhlbgorICAgIFVOTElNSVRFRF9DUllQVE89dHJ1ZQorZWxzZQorICAgIFVOTElNSVRFRF9DUllQVE89ZmFsc2UKK2ZpCitBQ19TVUJTVChVTkxJTUlURURfQ1JZUFRPKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCiAjIENvbXByZXNzIGphcnMKICMKIENPTVBSRVNTX0pBUlM9ZmFsc2UKIAogQUNfU1VCU1QoQ09NUFJFU1NfSkFSUykKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyBTaG91bGQgd2UgY29tcGlsZSBKRlIKLSMgICBkZWZhdWx0IG5vLCBleGNlcHQgZm9yIG9uIGNsb3NlZC1qZGsKLSMKLUVOQUJMRV9KRlI9bm8KLQotIyBJcyB0aGUgSkZSIHNvdXJjZSBwcmVzZW50Ci0KLSMKLSMgRm9yIGNsb3NlZCBkZWZhdWx0IGlzIHllcwotIwotaWYgdGVzdCAieCR7T1BFTkpES30iICE9ICJ4dHJ1ZSI7IHRoZW4KLSAgIEVOQUJMRV9KRlI9eWVzCi1maQotCi1BQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gYnVpbGQgamZyXSkKLUFDX0FSR19FTkFCTEUoW2pmcl0sIFtBU19IRUxQX1NUUklORyhbLS1lbmFibGUtamZyXSwKLQlbZW5hYmxlIGpmciAoZGVmYXVsdCBpcyBubyldKV0KLQlbRU5BQkxFX0pGUj0iJHtlbmFibGV2YWx9Il0pCi1BQ19NU0dfUkVTVUxUKFske0VOQUJMRV9KRlJ9XSkKLQotaWYgdGVzdCAieCRFTkFCTEVfSkZSIiA9ICJ4eWVzIjsgdGhlbgotICAgIEVOQUJMRV9KRlI9dHJ1ZQotZWxpZiB0ZXN0ICJ4JEVOQUJMRV9KRlIiID0gInhubyI7IHRoZW4KLSAgICBFTkFCTEVfSkZSPWZhbHNlCi1lbHNlCi0gICBBQ19NU0dfRVJST1IoW0ludmFsaWQgYXJndW1lbnQgdG8gLS1lbmFibGUtamZyXSkKLWZpCi0KLUFDX1NVQlNUKEVOQUJMRV9KRlIpCiBdKQogCiBBQ19ERUZVTl9PTkNFKFtKREtPUFRfU0VUVVBfSkRLX1ZFUlNJT05fTlVNQkVSU10sCkBAIC00MDksNiArMzc0LDggQEAKIEFDX1NVQlNUKFBST0RVQ1RfU1VGRklYKQogQUNfU1VCU1QoSkRLX1JDX1BMQVRGT1JNX05BTUUpCiBBQ19TVUJTVChDT01QQU5ZX05BTUUpCitBQ19TVUJTVChNQUNPU1hfQlVORExFX05BTUVfQkFTRSkKK0FDX1NVQlNUKE1BQ09TWF9CVU5ETEVfSURfQkFTRSkKIAogQ09QWVJJR0hUX1lFQVI9YGRhdGUgKyclWSdgCiBBQ19TVUJTVChDT1BZUklHSFRfWUVBUikKQEAgLTQzNyw3ICs0MDQsNyBAQAogICAgIEJVSUxEX0RBVEU9YGRhdGUgJyslWV8lbV8lZF8lSF8lTSdgCiAgICAgIyBBdm9pZCBbOmFsbnVtOl0gc2luY2UgaXQgZGVwZW5kcyBvbiB0aGUgbG9jYWxlLgogICAgIENMRUFOX1VTRVJOQU1FPWBlY2hvICIkVVNFUiIgfCAkVFIgLWQgLWMgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZxeHl6MDEyMzQ1Njc4OSdgCi0gICAgVVNFUl9SRUxFQVNFX1NVRkZJWD1gZWNobyAiJHtDTEVBTl9VU0VSTkFNRX1fJHtCVUlMRF9EQVRFfSIgfCAkVFIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnF4eXonYAorICAgIFVTRVJfUkVMRUFTRV9TVUZGSVg9YGVjaG8gIiR7Q0xFQU5fVVNFUk5BTUV9XyR7QlVJTERfREFURX0iIHwgJFRSICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J2AKICAgICBGVUxMX1ZFUlNJT049IiR7UkVMRUFTRX0tJHtVU0VSX1JFTEVBU0VfU1VGRklYfS0ke0pES19CVUlMRF9OVU1CRVJ9IgogZmkKIEFDX1NVQlNUKEZVTExfVkVSU0lPTikKQEAgLTQ3Myw3ICs0NDAsNyBAQAogZmkKIAogQUNfQVJHX0VOQUJMRShbZGVidWctc3ltYm9sc10sCi0gICAgICAgICAgICAgIFtBU19IRUxQX1NUUklORyhbLS1kaXNhYmxlLWRlYnVnLXN5bWJvbHNdLFtkaXNhYmxlIGdlbmVyYXRpb24gb2YgZGVidWcgc3ltYm9scyAoQDw6QGVuYWJsZWRAOj5AKV0pXSwKKyAgICAgICAgICAgICAgW0FTX0hFTFBfU1RSSU5HKFstLWRpc2FibGUtZGVidWctc3ltYm9sc10sW2Rpc2FibGUgZ2VuZXJhdGlvbiBvZiBkZWJ1ZyBzeW1ib2xzIEA8OkBlbmFibGVkQDo+QF0pXSwKICAgICAgICAgICAgICAgW0VOQUJMRV9ERUJVR19TWU1CT0xTPSR7ZW5hYmxlX2RlYnVnX3N5bWJvbHN9XSwKICkKIApAQCAtNDg3LDcgKzQ1NCw3IEBACiAKIGlmIHRlc3QgIngkRU5BQkxFX0RFQlVHX1NZTUJPTFMiID0gInhkZWZhdWx0IjsgdGhlbgogICAjIERlZmF1bHQgaXMgb24gaWYgb2JqY29weSBpcyBmb3VuZCwgb3RoZXJ3aXNlIG9mZgotICBpZiB0ZXN0ICJ4JE9CSkNPUFkiICE9IHg7IHRoZW4KKyAgaWYgdGVzdCAieCRPQkpDT1BZIiAhPSB4IHx8IHRlc3QgIngkT1BFTkpES19UQVJHRVRfT1MiID0geHdpbmRvd3M7IHRoZW4KICAgICAgRU5BQkxFX0RFQlVHX1NZTUJPTFM9eWVzCiAgIGVsc2UKICAgICAgRU5BQkxFX0RFQlVHX1NZTUJPTFM9bm8KQEAgLTUwMiw3ICs0NjksNyBAQAogWklQX0RFQlVHSU5GT19GSUxFUz15ZXMKIAogQUNfQVJHX0VOQUJMRShbemlwLWRlYnVnLWluZm9dLAotICAgICAgICAgICAgICBbQVNfSEVMUF9TVFJJTkcoWy0tZGlzYWJsZS16aXAtZGVidWctaW5mb10sW2Rvbid0IHppcCBkZWJ1Zy1pbmZvIGZpbGVzIChAPDpAZW5hYmxlZEA6QCldKV0sCisgICAgICAgICAgICAgIFtBU19IRUxQX1NUUklORyhbLS1kaXNhYmxlLXppcC1kZWJ1Zy1pbmZvXSxbZGlzYWJsZSB6aXBwaW5nIG9mIGRlYnVnLWluZm8gZmlsZXMgQDw6QGVuYWJsZWRAOj5AXSldLAogICAgICAgICAgICAgICBbWklQX0RFQlVHSU5GT19GSUxFUz0ke2VuYWJsZV96aXBfZGVidWdfaW5mb31dLAogKQogCkBAIC01MjgsNSArNDk1LDUgQEAKICMgZm9yIGEgZGVncmVlIG9mIGN1c3RvbWl6YXRpb24gb2YgdGhlIGJ1aWxkIHRhcmdldHMgYW5kIHRoZSBydWxlcy9yZWNpcGVzCiAjIHRvIGNyZWF0ZSB0aGVtCiBBQ19BUkdfV0lUSChbY3VzdG9tLW1ha2UtZGlyXSwgW0FTX0hFTFBfU1RSSU5HKFstLXdpdGgtY3VzdG9tLW1ha2UtZGlyXSwKLSAgICBbZGlyZWN0b3J5IGNvbnRhaW5pbmcgY3VzdG9tIGJ1aWxkL21ha2UgZmlsZXNdKV0sIFtDVVNUT01fTUFLRV9ESVI9JHdpdGhfY3VzdG9tX21ha2VfZGlyXSkKKyAgICBbdXNlIHRoaXMgZGlyZWN0b3J5IGZvciBjdXN0b20gYnVpbGQvbWFrZSBmaWxlc10pXSwgW0NVU1RPTV9NQUtFX0RJUj0kd2l0aF9jdXN0b21fbWFrZV9kaXJdKQogQUNfU1VCU1QoQ1VTVE9NX01BS0VfRElSKQpkaWZmIC0tZ2l0IGEvY29tbW9uL2F1dG9jb25mL2xpYnJhcmllcy5tNCBiL2NvbW1vbi9hdXRvY29uZi9saWJyYXJpZXMubTQKaW5kZXggOGMwOTc0NC4uMzJhNjJiYSAxMDA2NDQKLS0tIGEvY29tbW9uL2F1dG9jb25mL2xpYnJhcmllcy5tNAorKysgYi9jb21tb24vYXV0b2NvbmYvbGlicmFyaWVzLm00CkBAIC0xNzIsOSArMTcyLDE1IEBACiBBQ19MQU5HX1BVU0goQykKIE9MRF9DRkxBR1M9IiRDRkxBR1MiCiBDRkxBR1M9IiRDRkxBR1MgJFhfQ0ZMQUdTIgorCisjIE5lZWQgdG8gaW5jbHVkZSBYbGliLmggYW5kIFh1dGlsLmggdG8gYXZvaWQgInByZXNlbnQgYnV0IGNhbm5vdCBiZSBjb21waWxlZCIgd2FybmluZ3Mgb24gU29sYXJpcyAxMAogQUNfQ0hFQ0tfSEVBREVSUyhbWDExL2V4dGVuc2lvbnMvc2hhcGUuaCBYMTEvZXh0ZW5zaW9ucy9YcmVuZGVyLmggWDExL2V4dGVuc2lvbnMvWFRlc3QuaF0sCi0gICAgICAgICAgICAgICAgW1gxMV9BX09LPXllc10sCi0gICAgICAgICAgICAgICAgW1gxMV9BX09LPW5vXSkKKyAgICAgICAgICAgICAgICAgW1gxMV9BX09LPXllc10sCisgICAgICAgICAgICAgICAgIFtYMTFfQV9PSz1ub10sCisgICAgICAgICAgICAgICAgIFsgIyBpbmNsdWRlIDxYMTEvWGxpYi5oPgorICAgICAgICAgICAgICAgICAgICMgaW5jbHVkZSA8WDExL1h1dGlsLmg+CisgICAgICAgICAgICAgICAgIF0pCisKIENGTEFHUz0iJE9MRF9DRkxBR1MiCiBBQ19MQU5HX1BPUChDKQogCkBAIC0xOTYsMjcgKzIwMiwyMyBAQAogIwogQUNfQVJHX1dJVEgoY3VwcywgW0FTX0hFTFBfU1RSSU5HKFstLXdpdGgtY3Vwc10sCiAgICAgW3NwZWNpZnkgcHJlZml4IGRpcmVjdG9yeSBmb3IgdGhlIGN1cHMgcGFja2FnZQotCSAoZXhwZWN0aW5nIHRoZSBsaWJyYXJpZXMgdW5kZXIgUEFUSC9saWIgYW5kIHRoZSBoZWFkZXJzIHVuZGVyIFBBVEgvaW5jbHVkZSldKV0pCisJIChleHBlY3RpbmcgdGhlIGhlYWRlcnMgdW5kZXIgUEFUSC9pbmNsdWRlKV0pXSkKIEFDX0FSR19XSVRIKGN1cHMtaW5jbHVkZSwgW0FTX0hFTFBfU1RSSU5HKFstLXdpdGgtY3Vwcy1pbmNsdWRlXSwKIAlbc3BlY2lmeSBkaXJlY3RvcnkgZm9yIHRoZSBjdXBzIGluY2x1ZGUgZmlsZXNdKV0pCi1BQ19BUkdfV0lUSChjdXBzLWxpYiwgW0FTX0hFTFBfU1RSSU5HKFstLXdpdGgtY3Vwcy1saWJdLAotCVtzcGVjaWZ5IGRpcmVjdG9yeSBmb3IgdGhlIGN1cHMgbGlicmFyeV0pXSkKIAogaWYgdGVzdCAieCRDVVBTX05PVF9ORUVERUQiID0geHllczsgdGhlbgotCWlmIHRlc3QgIngke3dpdGhfY3Vwc30iICE9IHggfHwgdGVzdCAieCR7d2l0aF9jdXBzX2luY2x1ZGV9IiAhPSB4IHx8IHRlc3QgIngke3dpdGhfY3Vwc19saWJ9IiAhPSB4OyB0aGVuCisJaWYgdGVzdCAieCR7d2l0aF9jdXBzfSIgIT0geCB8fCB0ZXN0ICJ4JHt3aXRoX2N1cHNfaW5jbHVkZX0iICE9IHg7IHRoZW4KIAkJQUNfTVNHX1dBUk4oW2N1cHMgbm90IHVzZWQsIHNvIC0td2l0aC1jdXBzIGlzIGlnbm9yZWRdKQogCWZpCiAJQ1VQU19DRkxBR1M9Ci0JQ1VQU19MSUJTPQogZWxzZQogCUNVUFNfRk9VTkQ9bm8KIAotCWlmIHRlc3QgIngke3dpdGhfY3Vwc30iID0geG5vIHx8IHRlc3QgIngke3dpdGhfY3Vwc19pbmNsdWRlfSIgPSB4bm8gfHwgdGVzdCAieCR7d2l0aF9jdXBzX2xpYn0iID0geG5vOyB0aGVuCisJaWYgdGVzdCAieCR7d2l0aF9jdXBzfSIgPSB4bm8gfHwgdGVzdCAieCR7d2l0aF9jdXBzX2luY2x1ZGV9IiA9IHhubzsgdGhlbgogCSAgICBBQ19NU0dfRVJST1IoW0l0IGlzIG5vdCBwb3NzaWJsZSB0byBkaXNhYmxlIHRoZSB1c2Ugb2YgY3Vwcy4gUmVtb3ZlIHRoZSAtLXdpdGhvdXQtY3VwcyBvcHRpb24uXSkKIAlmaQogCiAJaWYgdGVzdCAieCR7d2l0aF9jdXBzfSIgIT0geDsgdGhlbgotCSAgICBDVVBTX0xJQlM9Ii1MJHt3aXRoX2N1cHN9L2xpYiAtbGN1cHMiCiAJICAgIENVUFNfQ0ZMQUdTPSItSSR7d2l0aF9jdXBzfS9pbmNsdWRlIgogCSAgICBDVVBTX0ZPVU5EPXllcwogCWZpCkBAIC0yMjQsMTAgKzIyNiw2IEBACiAJICAgIENVUFNfQ0ZMQUdTPSItSSR7d2l0aF9jdXBzX2luY2x1ZGV9IgogCSAgICBDVVBTX0ZPVU5EPXllcwogCWZpCi0JaWYgdGVzdCAieCR7d2l0aF9jdXBzX2xpYn0iICE9IHg7IHRoZW4KLQkgICAgQ1VQU19MSUJTPSItTCR7d2l0aF9jdXBzX2xpYn0gLWxjdXBzIgotCSAgICBDVVBTX0ZPVU5EPXllcwotCWZpCiAJaWYgdGVzdCAieCRDVVBTX0ZPVU5EIiA9IHhubzsgdGhlbgogCSAgICBCREVQU19DSEVDS19NT0RVTEUoQ1VQUywgY3VwcywgeHh4LCBbQ1VQU19GT1VORD15ZXNdKQogCWZpCkBAIC0yMzYsMjMgKzIzNCwyMCBAQAogCSAgICBBQ19DSEVDS19IRUFERVJTKFtjdXBzL2N1cHMuaCBjdXBzL3BwZC5oXSwKIAkgICAgICAgICAgICAgICAgICAgICBbQ1VQU19GT1VORD15ZXMKIAkgICAgICAgICAgICAgICAgICAgICAgQ1VQU19DRkxBR1M9Ci0JICAgICAgICAgICAgICAgICAgICAgIENVUFNfTElCUz0iLWxjdXBzIgogCSAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0NVUFM9eWVzXSkKIAlmaQogCWlmIHRlc3QgIngkQ1VQU19GT1VORCIgPSB4bm87IHRoZW4KIAkgICAgIyBHZXR0aW5nIG5lcnZvdXMgbm93PyBMZXRzIHBva2UgYXJvdW5kIGZvciBzdGFuZGFyZCBTb2xhcmlzIHRoaXJkLXBhcnR5CiAJICAgICMgcGFja2FnZSBpbnN0YWxsYXRpb24gbG9jYXRpb25zLgotCSAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBjdXBzIGhlYWRlcnMgYW5kIGxpYnNdKQorCSAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBjdXBzIGhlYWRlcnNdKQogCSAgICBpZiB0ZXN0IC1zIC9vcHQvc2Z3L2N1cHMvaW5jbHVkZS9jdXBzL2N1cHMuaDsgdGhlbgogCSAgICAgICAjIEFuIFNGVyBwYWNrYWdlIHNlZW1zIHRvIGJlIGluc3RhbGxlZCEKIAkgICAgICAgQ1VQU19GT1VORD15ZXMKIAkgICAgICAgQ1VQU19DRkxBR1M9Ii1JL29wdC9zZncvY3Vwcy9pbmNsdWRlIgotCSAgICAgICBDVVBTX0xJQlM9Ii1ML29wdC9zZncvY3Vwcy9saWIgLWxjdXBzIgogCSAgICBlbGlmIHRlc3QgLXMgL29wdC9jc3cvaW5jbHVkZS9jdXBzL2N1cHMuaDsgdGhlbgogCSAgICAgICAjIEEgQ1NXIHBhY2thZ2Ugc2VlbXMgdG8gYmUgaW5zdGFsbGVkIQogCSAgICAgICBDVVBTX0ZPVU5EPXllcwogCSAgICAgICBDVVBTX0NGTEFHUz0iLUkvb3B0L2Nzdy9pbmNsdWRlIgotCSAgICAgICBDVVBTX0xJQlM9Ii1ML29wdC9jc3cvbGliIC1sY3VwcyIKIAkgICAgZmkKIAkgICAgQUNfTVNHX1JFU1VMVChbJENVUFNfRk9VTkRdKQogCWZpCkBAIC0yNjMsNyArMjU4LDYgQEAKIGZpCiAKIEFDX1NVQlNUKENVUFNfQ0ZMQUdTKQotQUNfU1VCU1QoQ1VQU19MSUJTKQogCiBdKQogCkBAIC0yOTIsMTcgKzI4NiwyMSBAQAogCUZSRUVUWVBFMl9GT1VORD1ubwogCiAJaWYgdGVzdCAieCR3aXRoX2ZyZWV0eXBlIiAhPSB4OyB0aGVuCi0gICAgICAgICAgICBTUEFDRVNBRkUod2l0aF9mcmVldHlwZSxbdGhlIHBhdGggdG8gZnJlZXR5cGVdKQorICAgICAgICAgICAgQkFTSUNfRklYVVBfUEFUSCh3aXRoX2ZyZWV0eXBlKQogCSAgICBGUkVFVFlQRTJfTElCUz0iLUwkd2l0aF9mcmVldHlwZS9saWIgLWxmcmVldHlwZSIKKyAgICAgICAgICAgIEZSRUVUWVBFMl9MSUJfUEFUSD0iJHdpdGhfZnJlZXR5cGUvbGliIgorICAgICAgICAgICAgaWYgdGVzdCAieCRPUEVOSkRLX1RBUkdFVF9PUyIgPSB4c29sYXJpcyAmJiB0ZXN0ICJ4JE9QRU5KREtfVEFSR0VUX0NQVSIgPSB4eDg2XzY0ICYmIHRlc3QgLWQgIiR3aXRoX2ZyZWV0eXBlL2xpYi9hbWQ2NCI7IHRoZW4KKyAgICAgICAgICAgICAgICBGUkVFVFlQRTJfTElCUz0iLUwkd2l0aF9mcmVldHlwZS9saWIvYW1kNjQgLWxmcmVldHlwZSIKKyAgICAgICAgICAgICAgICBGUkVFVFlQRTJfTElCX1BBVEg9IiR3aXRoX2ZyZWV0eXBlL2xpYi9hbWQ2NCIKKyAgICAgICAgICAgIGZpCiAgICAgICAgICAgICBpZiB0ZXN0ICJ4JE9QRU5KREtfVEFSR0VUX09TIiA9IHh3aW5kb3dzOyB0aGVuCiAgICAgICAgICAgICAgICAgRlJFRVRZUEUyX0xJQlM9IiR3aXRoX2ZyZWV0eXBlL2xpYi9mcmVldHlwZS5saWIiCiAgICAgICAgICAgICBmaQotICAgICAgICAgICAgRlJFRVRZUEUyX0xJQl9QQVRIPSIkd2l0aF9mcmVldHlwZS9saWIiCiAJICAgIEZSRUVUWVBFMl9DRkxBR1M9Ii1JJHdpdGhfZnJlZXR5cGUvaW5jbHVkZSIKICAgICAgICAgICAgIGlmIHRlc3QgLXMgJHdpdGhfZnJlZXR5cGUvaW5jbHVkZS9mdDJidWlsZC5oICYmIHRlc3QgLWQgJHdpdGhfZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZTIvZnJlZXR5cGU7IHRoZW4KICAgICAgICAgICAgICAgICBGUkVFVFlQRTJfQ0ZMQUdTPSItSSR3aXRoX2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUyIC1JJHdpdGhfZnJlZXR5cGUvaW5jbHVkZSIKICAgICAgICAgICAgIGZpCi0JICAgIEZSRUVUWVBFMl9GT1VORD15ZXMKKyAJICAgIEZSRUVUWVBFMl9GT1VORD15ZXMKICAgIAkgICAgaWYgdGVzdCAieCRGUkVFVFlQRTJfRk9VTkQiID0geHllczsgdGhlbgogCSAgICAgICAgIyBWZXJpZnkgdGhhdCB0aGUgZGlyZWN0b3JpZXMgZXhpc3QgCiAgICAgICAgICAgICAgICAgaWYgISB0ZXN0IC1kICIkd2l0aF9mcmVldHlwZS9saWIiIHx8ICEgdGVzdCAtZCAiJHdpdGhfZnJlZXR5cGUvaW5jbHVkZSI7IHRoZW4KQEAgLTMxMSw3ICszMDksNyBAQAogCSAgICAgICAgIyBMaXN0IHRoZSBjb250ZW50cyBvZiB0aGUgbGliLgogCQlGUkVFVFlQRUxJQj1gbHMgJHdpdGhfZnJlZXR5cGUvbGliL2xpYmZyZWV0eXBlLnNvICR3aXRoX2ZyZWV0eXBlL2xpYi9mcmVldHlwZS5kbGwgMj4gL2Rldi9udWxsYAogICAgICAgICAgICAgICAgIGlmIHRlc3QgIngkRlJFRVRZUEVMSUIiID0geDsgdGhlbgotCQkgICBBQ19NU0dfRVJST1IoW0NvdWxkIG5vdCBmaW5kIGxpYmZyZWV0eXBlLnNlIG5vciBmcmVldHlwZS5kbGwgaW4gJHdpdGhfZnJlZXR5cGUvbGliXSkKKwkJICAgQUNfTVNHX0VSUk9SKFtDb3VsZCBub3QgZmluZCBsaWJmcmVldHlwZS5zbyBub3IgZnJlZXR5cGUuZGxsIGluICR3aXRoX2ZyZWV0eXBlL2xpYl0pCiAJCWZpCiAJICAgICAgICAjIENoZWNrIG9uZSBoLWZpbGUKICAgICAgICAgICAgICAgICBpZiAhIHRlc3QgLXMgIiR3aXRoX2ZyZWV0eXBlL2luY2x1ZGUvZnQyYnVpbGQuaCI7IHRoZW4KQEAgLTMyMyw5ICszMjEsMzQgQEAKIAkgICAgQkRFUFNfQ0hFQ0tfTU9EVUxFKEZSRUVUWVBFMiwgZnJlZXR5cGUyLCB4eHgsIFtGUkVFVFlQRTJfRk9VTkQ9eWVzXSwgW0ZSRUVUWVBFMl9GT1VORD1ub10pCiAgICAgICAgICAgICBVU0lOR19TWVNURU1fRlRfTElCPXRydWUKIAlmaQorCWlmIHRlc3QgIngkRlJFRVRZUEUyX0ZPVU5EIiA9IHhubyAmJiB0ZXN0ICJ4JE9QRU5KREtfVEFSR0VUX09TIiA9IHh3aW5kb3dzOyB0aGVuCisgICAgICAgICAgICBGUkVFVFlQRUxPQ0FUSU9OPSIkUFJPR1JBTUZJTEVTL0dudVdpbjMyIgorICAgICAgICAgICAgQkFTSUNfRklYVVBfUEFUSChGUkVFVFlQRUxPQ0FUSU9OKQorCSAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBmcmVldHlwZSBpbiBzb21lIHN0YW5kYXJkIHdpbmRvd3MgbG9jYXRpb25zXSkKKwkgICAgaWYgdGVzdCAtcyAiJEZSRUVUWVBFTE9DQVRJT04vaW5jbHVkZS9mdDJidWlsZC5oIiAmJiB0ZXN0IC1kICIkRlJFRVRZUEVMT0NBVElPTi9pbmNsdWRlL2ZyZWV0eXBlMi9mcmVldHlwZSI7IHRoZW4KKwkgICAgICAgIEZSRUVUWVBFMl9DRkxBR1M9Ii1JJEZSRUVUWVBFTE9DQVRJT04vaW5jbHVkZS9mcmVldHlwZTIgLUkkRlJFRVRZUEVMT0NBVElPTi9pbmNsdWRlIgorCSAgICAgICAgRlJFRVRZUEUyX0xJQlM9IiRGUkVFVFlQRUxPQ0FUSU9OL2xpYi9mcmVldHlwZS5saWIiCisgCSAgICAgICAgRlJFRVRZUEUyX0xJQl9QQVRIPSIkRlJFRVRZUEVMT0NBVElPTi9saWIiCisgICAgICAgICAgICAgICAgaWYgISB0ZXN0IC1zICIkRlJFRVRZUEUyX0xJQlMiOyB0aGVuCisJCSAgIEFDX01TR19FUlJPUihbQ291bGQgbm90IGZpbmQgJEZSRUVUWVBFMl9MSUJTXSkKKwkJZmkKKyAgICAgICAgICAgICAgICBpZiAhIHRlc3QgLXMgIiRGUkVFVFlQRTJfTElCX1BBVEgvZnJlZXR5cGUuZGxsIjsgdGhlbgorCQkgICBBQ19NU0dfRVJST1IoW0NvdWxkIG5vdCBmaW5kICRGUkVFVFlQRTJfTElCX1BBVEgvZnJlZXR5cGUuZGxsXSkKKwkJZmkKKyAgICAgICAgICAgICAgICBVU0lOR19TWVNURU1fRlRfTElCPXRydWUKKyAgICAgICAgICAgICAgICBGUkVFVFlQRTJfRk9VTkQ9eWVzCisJICAgIGZpCisJICAgIEFDX01TR19SRVNVTFQoWyRGUkVFVFlQRTJfRk9VTkRdKSAgICAgICAgIAorICAgICAgICBmaQogCWlmIHRlc3QgIngkRlJFRVRZUEUyX0ZPVU5EIiA9IHhubzsgdGhlbgogCSAgICBQS0dfQ0hFQ0tfTU9EVUxFUyhGUkVFVFlQRTIsIGZyZWV0eXBlMiwgW0ZSRUVUWVBFMl9GT1VORD15ZXNdLCBbRlJFRVRZUEUyX0ZPVU5EPW5vXSkKKyAgICAgICAgICAgICMgT24gc29sYXJpcywgcGtnX2NoZWNrIGFkZHMgLWx6IHRvIGZyZWV0eXBlIGxpYnMsIHdoaWNoIGlzbid0IG5lY2Vzc2FyeSBmb3IgdXMuCisgICAgICAgICAgICBGUkVFVFlQRTJfTElCUz1gJEVDSE8gJEZSRUVUWVBFMl9MSUJTIHwgJFNFRCAncy8tbHovL2cnYCAKICAgICAgICAgICAgIFVTSU5HX1NZU1RFTV9GVF9MSUI9dHJ1ZQorICAgICAgICAgICAgIyA2NC1iaXQgbGlicyBmb3IgU29sYXJpcyB4ODYgYXJlIGluc3RhbGxlZCBpbiB0aGUgYW1kNjQgc3ViZGlyZWN0b3J5LCBjaGFuZ2UgbGliIHRvIGxpYi9hbWQ2NAorICAgICAgICAgICAgaWYgdGVzdCAieCRGUkVFVFlQRTJfRk9VTkQiID0geHllcyAmJiB0ZXN0ICJ4JE9QRU5KREtfVEFSR0VUX09TIiA9IHhzb2xhcmlzICYmIHRlc3QgIngkT1BFTkpES19UQVJHRVRfQ1BVIiA9IHh4ODZfNjQ7IHRoZW4KKyAgICAgICAgICAgICAgRlJFRVRZUEUyX0xJQlM9YCRFQ0hPICRGUkVFVFlQRTJfTElCUyB8ICRTRUQgJ3M/L2xpYj8vbGliL2FtZDY0P2cnYAorICAgICAgICAgICAgZmkKIAlmaQogCWlmIHRlc3QgIngkRlJFRVRZUEUyX0ZPVU5EIiA9IHhubzsgdGhlbgogCSAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBmcmVldHlwZSBpbiBzb21lIHN0YW5kYXJkIGxvY2F0aW9uc10pCkBAIC0zNjQsNyArMzg3LDE1IEBACiAJaWYgdGVzdCAieCRGUkVFVFlQRTJfRk9VTkQiID0geG5vOyB0aGVuCiAJCUhFTFBfTVNHX01JU1NJTkdfREVQRU5ERU5DWShbZnJlZXR5cGUyXSkKIAkJQUNfTVNHX0VSUk9SKFtDb3VsZCBub3QgZmluZCBmcmVldHlwZTIhICRIRUxQX01TRyBdKQotCWZpICAgIAorCWZpCisKKyAgICAgICAgaWYgdGVzdCAieCRPUEVOSkRLX1RBUkdFVF9PUyIgIT0geHdpbmRvd3M7IHRoZW4KKyAgICAgICAgICAgICMgQUNfQ0hFQ0tfTElCIGRvZXMgbm90IHN1cHBvcnQgdXNlIG9mIGNsLmV4ZQorICAgICAgICAgICAgUFJFVl9MREZMQUdTPSIkTERGTEFHUyIKKyAgICAgICAgICAgIExERkxBR1M9IiRGUkVFVFlQRTJfTElCUyIKKyAgICAgICAgICAgIEFDX0NIRUNLX0xJQihmcmVldHlwZSwgRlRfSW5pdF9GcmVlVHlwZSwgW10sIEFDX01TR19FUlJPUihbQ291bGQgbm90IGZpbmQgZnJlZXR5cGUyISAkSEVMUF9NU0cgXSkpCisgICAgICAgICAgICBMREZMQUdTPSIkUFJFVl9MREZMQUdTIgorICAgICAgICBmaQogZmkKIAogQUNfU1VCU1QoVVNJTkdfU1lTVEVNX0ZUX0xJQikKQEAgLTYyMSwxMyArNjUyLDE2IEBACiAgICAgaWYgdGVzdCAieCRlbmFibGVfc3RhdGljX2xpbmtfc3RkY19fIiA9IHh5ZXM7IHRoZW4KICAgICAgICAgTElCQ1hYPSIkTElCQ1hYICRTVEFUSUNfU1REQ1hYX0ZMQUdTIgogICAgICAgICBMRENYWD0iJENDIgorICAgICAgICBTVEFUSUNfQ1hYX1NFVFRJTkc9IlNUQVRJQ19DWFg9dHJ1ZSIKICAgICAgICAgQUNfTVNHX1JFU1VMVChbc3RhdGljXSkKICAgICBlbHNlCiAgICAgICAgIExJQkNYWD0iJExJQkNYWCAtbHN0ZGMrKyIKICAgICAgICAgTERDWFg9IiRDWFgiCisgICAgICAgIFNUQVRJQ19DWFhfU0VUVElORz0iU1RBVElDX0NYWD1mYWxzZSIKICAgICAgICAgQUNfTVNHX1JFU1VMVChbZHluYW1pY10pCiAgICAgZmkKIGZpCitBQ19TVUJTVChTVEFUSUNfQ1hYX1NFVFRJTkcpCiAKICMgbGliQ3J1biBpcyB0aGUgYysrIHJ1bnRpbWUtbGlicmFyeSB3aXRoIFN1blN0dWRpbyAocm91Z2hseSB0aGUgZXF1aXZhbGVudCBvZiBnY2MncyBsaWJzdGRjKysuc28pCiBpZiB0ZXN0ICJ4JE9QRU5KREtfVEFSR0VUX09TIiA9IHhzb2xhcmlzICYmIHRlc3QgIngkTElCQ1hYIiA9IHg7IHRoZW4KZGlmZiAtLWdpdCBhL2NvbW1vbi9hdXRvY29uZi9wbGF0Zm9ybS5tNCBiL2NvbW1vbi9hdXRvY29uZi9wbGF0Zm9ybS5tNAppbmRleCBhZmEzMmFkLi4yOTc3NjA2IDEwMDY0NAotLS0gYS9jb21tb24vYXV0b2NvbmYvcGxhdGZvcm0ubTQKKysrIGIvY29tbW9uL2F1dG9jb25mL3BsYXRmb3JtLm00CkBAIC04NywyMiArODcsMzIgQEAKICAgICAqbGludXgqKQogICAgICAgVkFSX09TPWxpbnV4CiAgICAgICBWQVJfT1NfQVBJPXBvc2l4CisgICAgICBWQVJfT1NfRU5WPWxpbnV4CiAgICAgICA7OwogICAgICpzb2xhcmlzKikKICAgICAgIFZBUl9PUz1zb2xhcmlzCiAgICAgICBWQVJfT1NfQVBJPXBvc2l4CisgICAgICBWQVJfT1NfRU5WPXNvbGFyaXMKICAgICAgIDs7CiAgICAgKmRhcndpbiopCiAgICAgICBWQVJfT1M9bWFjb3N4CiAgICAgICBWQVJfT1NfQVBJPXBvc2l4CisgICAgICBWQVJfT1NfRU5WPW1hY29zeAogICAgICAgOzsKICAgICAqYnNkKikKICAgICAgIFZBUl9PUz1ic2QKICAgICAgIFZBUl9PU19BUEk9cG9zaXgKKyAgICAgIFZBUl9PU19FTlY9YnNkCiAgICAgICA7OwotICAgICpjeWd3aW4qfCp3aW5kb3dzKikKKyAgICAqY3lnd2luKikKICAgICAgIFZBUl9PUz13aW5kb3dzCiAgICAgICBWQVJfT1NfQVBJPXdpbmFwaQorICAgICAgVkFSX09TX0VOVj13aW5kb3dzLmN5Z3dpbgorICAgICAgOzsKKyAgICAqbWluZ3cqKQorICAgICAgVkFSX09TPXdpbmRvd3MKKyAgICAgIFZBUl9PU19BUEk9d2luYXBpCisgICAgICBWQVJfT1NfRU5WPXdpbmRvd3MubXN5cwogICAgICAgOzsKICAgICAqKQogICAgICAgQUNfTVNHX0VSUk9SKFt1bnN1cHBvcnRlZCBvcGVyYXRpbmcgc3lzdGVtICQxXSkKQEAgLTEyOCwxMSArMTM4LDMzIEBACiAgICAgQUNfU1VCU1QoT1BFTkpES19CVUlMRF9BVVRPQ09ORl9OQU1FKQogCiAgICAgIyBDb252ZXJ0IHRoZSBhdXRvY29uZiBPUy9DUFUgdmFsdWUgdG8gb3VyIG93biBkYXRhLCBpbnRvIHRoZSBWQVJfT1MvQ1BVIHZhcmlhYmxlcy4KKyAgICBQTEFURk9STV9FWFRSQUNUX1ZBUlNfRlJPTV9PUygkYnVpbGRfb3MpCisgICAgUExBVEZPUk1fRVhUUkFDVF9WQVJTX0ZST01fQ1BVKCRidWlsZF9jcHUpCisgICAgIyAuLmFuZCBzZXR1cCBvdXIgb3duIHZhcmlhYmxlcy4gKERvIHRoaXMgZXhwbGljaXRlbHkgdG8gZmFjaWxpdGF0ZSBzZWFyY2hpbmcpCisgICAgT1BFTkpES19CVUlMRF9PUz0iJFZBUl9PUyIKKyAgICBPUEVOSkRLX0JVSUxEX09TX0FQST0iJFZBUl9PU19BUEkiCisgICAgT1BFTkpES19CVUlMRF9PU19FTlY9IiRWQVJfT1NfRU5WIgorICAgIE9QRU5KREtfQlVJTERfQ1BVPSIkVkFSX0NQVSIKKyAgICBPUEVOSkRLX0JVSUxEX0NQVV9BUkNIPSIkVkFSX0NQVV9BUkNIIgorICAgIE9QRU5KREtfQlVJTERfQ1BVX0JJVFM9IiRWQVJfQ1BVX0JJVFMiCisgICAgT1BFTkpES19CVUlMRF9DUFVfRU5ESUFOPSIkVkFSX0NQVV9FTkRJQU4iCisgICAgQUNfU1VCU1QoT1BFTkpES19CVUlMRF9PUykKKyAgICBBQ19TVUJTVChPUEVOSkRLX0JVSUxEX09TX0FQSSkKKyAgICBBQ19TVUJTVChPUEVOSkRLX0JVSUxEX0NQVSkKKyAgICBBQ19TVUJTVChPUEVOSkRLX0JVSUxEX0NQVV9BUkNIKQorICAgIEFDX1NVQlNUKE9QRU5KREtfQlVJTERfQ1BVX0JJVFMpCisgICAgQUNfU1VCU1QoT1BFTkpES19CVUlMRF9DUFVfRU5ESUFOKQorCisgICAgQUNfTVNHX0NIRUNLSU5HKFtvcGVuamRrLWJ1aWxkIG9zLWNwdV0pCisgICAgQUNfTVNHX1JFU1VMVChbJE9QRU5KREtfQlVJTERfT1MtJE9QRU5KREtfQlVJTERfQ1BVXSkKKworICAgICMgQ29udmVydCB0aGUgYXV0b2NvbmYgT1MvQ1BVIHZhbHVlIHRvIG91ciBvd24gZGF0YSwgaW50byB0aGUgVkFSX09TL0NQVSB2YXJpYWJsZXMuCiAgICAgUExBVEZPUk1fRVhUUkFDVF9WQVJTX0ZST01fT1MoJGhvc3Rfb3MpCiAgICAgUExBVEZPUk1fRVhUUkFDVF9WQVJTX0ZST01fQ1BVKCRob3N0X2NwdSkKICAgICAjIC4uLiBhbmQgc2V0dXAgb3VyIG93biB2YXJpYWJsZXMuIChEbyB0aGlzIGV4cGxpY2l0ZWx5IHRvIGZhY2lsaXRhdGUgc2VhcmNoaW5nKQogICAgIE9QRU5KREtfVEFSR0VUX09TPSIkVkFSX09TIgogICAgIE9QRU5KREtfVEFSR0VUX09TX0FQST0iJFZBUl9PU19BUEkiCisgICAgT1BFTkpES19UQVJHRVRfT1NfRU5WPSIkVkFSX09TX0VOViIKICAgICBPUEVOSkRLX1RBUkdFVF9DUFU9IiRWQVJfQ1BVIgogICAgIE9QRU5KREtfVEFSR0VUX0NQVV9BUkNIPSIkVkFSX0NQVV9BUkNIIgogICAgIE9QRU5KREtfVEFSR0VUX0NQVV9CSVRTPSIkVkFSX0NQVV9CSVRTIgpAQCAtMTQ0LDIyICsxNzYsOCBAQAogICAgIEFDX1NVQlNUKE9QRU5KREtfVEFSR0VUX0NQVV9CSVRTKQogICAgIEFDX1NVQlNUKE9QRU5KREtfVEFSR0VUX0NQVV9FTkRJQU4pCiAKLSAgICAjIENvbnZlcnQgdGhlIGF1dG9jb25mIE9TL0NQVSB2YWx1ZSB0byBvdXIgb3duIGRhdGEsIGludG8gdGhlIFZBUl9PUy9DUFUgdmFyaWFibGVzLgotICAgIFBMQVRGT1JNX0VYVFJBQ1RfVkFSU19GUk9NX09TKCRidWlsZF9vcykKLSAgICBQTEFURk9STV9FWFRSQUNUX1ZBUlNfRlJPTV9DUFUoJGJ1aWxkX2NwdSkKLSAgICAjIC4uYW5kIHNldHVwIG91ciBvd24gdmFyaWFibGVzLiAoRG8gdGhpcyBleHBsaWNpdGVseSB0byBmYWNpbGl0YXRlIHNlYXJjaGluZykKLSAgICBPUEVOSkRLX0JVSUxEX09TPSIkVkFSX09TIgotICAgIE9QRU5KREtfQlVJTERfT1NfQVBJPSIkVkFSX09TX0FQSSIKLSAgICBPUEVOSkRLX0JVSUxEX0NQVT0iJFZBUl9DUFUiCi0gICAgT1BFTkpES19CVUlMRF9DUFVfQVJDSD0iJFZBUl9DUFVfQVJDSCIKLSAgICBPUEVOSkRLX0JVSUxEX0NQVV9CSVRTPSIkVkFSX0NQVV9CSVRTIgotICAgIE9QRU5KREtfQlVJTERfQ1BVX0VORElBTj0iJFZBUl9DUFVfRU5ESUFOIgotICAgIEFDX1NVQlNUKE9QRU5KREtfQlVJTERfT1MpCi0gICAgQUNfU1VCU1QoT1BFTkpES19CVUlMRF9PU19BUEkpCi0gICAgQUNfU1VCU1QoT1BFTkpES19CVUlMRF9DUFUpCi0gICAgQUNfU1VCU1QoT1BFTkpES19CVUlMRF9DUFVfQVJDSCkKLSAgICBBQ19TVUJTVChPUEVOSkRLX0JVSUxEX0NQVV9CSVRTKQotICAgIEFDX1NVQlNUKE9QRU5KREtfQlVJTERfQ1BVX0VORElBTikKKyAgICBBQ19NU0dfQ0hFQ0tJTkcoW29wZW5qZGstdGFyZ2V0IG9zLWNwdV0pCisgICAgQUNfTVNHX1JFU1VMVChbJE9QRU5KREtfVEFSR0VUX09TLSRPUEVOSkRLX1RBUkdFVF9DUFVdKQogXSkKIAogIyBDaGVjayBpZiBhIHJlZHVjZWQgYnVpbGQgKDMyLWJpdCBvbiA2NC1iaXQgcGxhdGZvcm1zKSBpcyByZXF1ZXN0ZWQsIGFuZCBtb2RpZnkgYmVoYXZpb3VyCkBAIC0yMDgsNyArMjI2LDcgQEAKICAgZmkKICAgQUNfU1VCU1QoQ09NUElMRV9UWVBFKQogCi1BQ19NU0dfQ0hFQ0tJTkcoW2ZvciBjb21waWxhdGlvbiB0eXBlXSkKK0FDX01TR19DSEVDS0lORyhbY29tcGlsYXRpb24gdHlwZV0pCiBBQ19NU0dfUkVTVUxUKFskQ09NUElMRV9UWVBFXSkKIF0pCiAKQEAgLTI5OSw3ICszMTcsMTEgQEAKIAogICAgIGlmIHRlc3QgIngkT1BFTkpES19UQVJHRVRfQ1BVX0JJVFMiID0geDY0OyB0aGVuCiAgICAgICAgIEFfTFA2ND0iTFA2NDo9IgotICAgICAgICBBRERfTFA2ND0iLURfTFA2ND0xIgorICAgICAgICAjIC1EX0xQNjQ9MSBpcyBvbmx5IHNldCBvbiBsaW51eCBhbmQgbWFjLiBTZXR0aW5nIG9uIHdpbmRvd3MgY2F1c2VzIGRpZmYgaW4gCisgICAgICAgICMgdW5wYWNrMjAwLmV4ZQorICAgICAgICBpZiB0ZXN0ICJ4JE9QRU5KREtfVEFSR0VUX09TIiA9IHhsaW51eCB8fCB0ZXN0ICJ4JE9QRU5KREtfVEFSR0VUX09TIiA9IHhtYWNvc3g7IHRoZW4KKyAgICAgICAgICAgIEFERF9MUDY0PSItRF9MUDY0PTEiCisgICAgICAgIGZpCiAgICAgZmkKICAgICBBQ19TVUJTVChMUDY0LCRBX0xQNjQpCiAKZGlmZiAtLWdpdCBhL2NvbW1vbi9hdXRvY29uZi9zcGVjLmdtay5pbiBiL2NvbW1vbi9hdXRvY29uZi9zcGVjLmdtay5pbgppbmRleCAyMTUwMjM0Li5iOGQzZTEwIDEwMDY0NAotLS0gYS9jb21tb24vYXV0b2NvbmYvc3BlYy5nbWsuaW4KKysrIGIvY29tbW9uL2F1dG9jb25mL3NwZWMuZ21rLmluCkBAIC00MSw3ICs0MSw5IEBACiAjJwogRFFVT1RFOj0iCiAjIgotZGVmaW5lIE5FV0xJTkU6PQorZGVmaW5lIE5FV0xJTkUKKworCiBlbmRlZgogCiAjIEEgc2VsZi1yZWZlcmVudGlhbCByZWZlcmVuY2UgdG8gdGhpcyBmaWxlLgpAQCAtNTAsMTEgKzUyLDcgQEAKICMgU3BlY2lmeSB3aGVyZSB0aGUgc3BlYyBmaWxlIGlzLgogTUFLRV9BUkdTPSJTUEVDPSQoU1BFQykiCiAKLSMgVE9ETyBUaGUgbG9naWMgZm9yIGZpbmRpbmcgYW5kIHNldHRpbmcgTUFLRSBpcyBjdXJyZW50bHkgbm90IHdvcmtpbmcgCi0jIHdlbGwgb24gd2luZG93cy4gRGlzYWJsZSBpdCBURU1QT1JBUklMWSB0aGVyZSBmb3Igbm93LgotaWZuZXEgKEBPUEVOSkRLX1RBUkdFVF9PU0Asd2luZG93cykKLSAgICBNQUtFOj1ATUFLRUAKLWVuZGlmCitNQUtFOj1ATUFLRUAKIAogIyBQYXNzIGFsb25nIHRoZSB2ZXJib3NpdHkgc2V0dGluZy4KIGlmZXEgKCwkKGZpbmRzdHJpbmcgVkVSQk9TRT0sJChNQUtFKSkpCkBAIC03Nyw2ICs3NSw3IEBACiAjIFRoZSBidWlsdCBqZGsgd2lsbCBydW4gaW4gdGhpcyB0YXJnZXQgc3lzdGVtLgogT1BFTkpES19UQVJHRVRfT1M6PUBPUEVOSkRLX1RBUkdFVF9PU0AKIE9QRU5KREtfVEFSR0VUX09TX0FQSTo9QE9QRU5KREtfVEFSR0VUX09TX0FQSUAKK09QRU5KREtfVEFSR0VUX09TX0VOVjo9QE9QRU5KREtfVEFSR0VUX09TX0VOVkAKIAogT1BFTkpES19UQVJHRVRfQ1BVOj1AT1BFTkpES19UQVJHRVRfQ1BVQAogT1BFTkpES19UQVJHRVRfQ1BVX0FSQ0g6PUBPUEVOSkRLX1RBUkdFVF9DUFVfQVJDSEAKQEAgLTEwOSwxNiArMTA4LDIxIEBACiBSRVFVSVJFRF9PU19WRVJTSU9OOj1AUkVRVUlSRURfT1NfVkVSU0lPTkAKIAogQFNFVF9PUEVOSkRLQAotSklHU0FXOj1ASklHU0FXQAogTElCTTo9LWxtCiBMSUJETDo9QExJQkRMQAogCiAjIGNvbG9uIG9yIHNlbWljb2xvbgogUEFUSF9TRVA6PUBQQVRIX1NFUEAKIAotIyBTZXQgc3BlY2lhbCBlbnYgdmFyaWFibGVzLCB0byBiZSBwYXNzZWQgdG8gZXh0ZXJuYWwgdG9vbHMuCi0jIFVzZWQgZm9yIGN5Z3dpbiBzZXR1cHMuCi1AU0VUVVBERVZFTlZACitpZmVxICgkKE9QRU5KREtfVEFSR0VUX09TKSwgd2luZG93cykKKyAgIyBPbiBXaW5kb3dzLCB0aGUgVmlzdWFsIFN0dWRpbyB0b29sY2hhaW4gbmVlZHMgdGhlIExJQiBhbmQgSU5DTFVERQorICAjIGVudmlyb25tZW50IHZhcmlhYmxlcyAoaW4gV2luZG93cyBwYXRoIHN0eWxlKSwgYW5kIHRoZSBQQVRIIG5lZWRzIHRvCisgICMgYmUgYWRqdXN0ZWQgdG8gaW5jbHVkZSBWaXN1YWwgU3R1ZGlvIHRvb2xzIChidXQgdGhpcyBuZWVkcyB0byBiZSBpbgorICAjIGN5Z3dpbi9tc3lzIHN0eWxlKS4KKyAgZXhwb3J0IFBBVEg6PUBWU19QQVRIQAorICBleHBvcnQgSU5DTFVERTo9QFZTX0lOQ0xVREVACisgIGV4cG9ydCBMSUI6PUBWU19MSUJACitlbmRpZgogCiAjIFRoZSBzeXMgcm9vdCB3aGVyZSBzdGFuZGFyZCBoZWFkZXJzIGFuZCBsaWJyYXJpZXMgYXJlIGZvdW5kLgogIyBVc3VhbGx5IG5vdCBuZWVkZWQgc2luY2UgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgc2hvdWxkIGhhdmUKQEAgLTEzMSw3ICsxMzUsNiBAQAogT1ZFUlJJREVfU1JDX1JPT1Q6PUBPVkVSUklERV9TUkNfUk9PVEAKIFRPUERJUjo9QFNSQ19ST09UQAogT1VUUFVUX1JPT1Q6PUBPVVRQVVRfUk9PVEAKLUpES19NQUtFX1NIQVJFRF9ESVI6PUBKREtfVE9QRElSQC9tYWtlZmlsZXMvY29tbW9uL3NoYXJlZAogSkRLX1RPUERJUjo9QEpES19UT1BESVJACiBMQU5HVE9PTFNfVE9QRElSOj1ATEFOR1RPT0xTX1RPUERJUkAKIENPUkJBX1RPUERJUjo9QENPUkJBX1RPUERJUkAKQEAgLTE1NSw2ICsxNTgsOCBAQAogUFJPRFVDVF9TVUZGSVg6PUBQUk9EVUNUX1NVRkZJWEAKIEpES19SQ19QTEFURk9STV9OQU1FOj1ASkRLX1JDX1BMQVRGT1JNX05BTUVACiBDT01QQU5ZX05BTUU6PUBDT01QQU5ZX05BTUVACitNQUNPU1hfQlVORExFX05BTUVfQkFTRT1ATUFDT1NYX0JVTkRMRV9OQU1FX0JBU0VACitNQUNPU1hfQlVORExFX0lEX0JBU0U9QE1BQ09TWF9CVU5ETEVfSURfQkFTRUAKIAogIyBEaWZmZXJlbnQgdmVyc2lvbiBzdHJpbmdzIGdlbmVyYXRlZCBmcm9tIHRoZSBhYm92ZSBpbmZvcm1hdGlvbi4KIEpES19WRVJTSU9OOj1ASkRLX1ZFUlNJT05ACkBAIC0yNjAsNiArMjY1LDkgQEAKICMgU291cmNlIGZpbGUgZm9yIGNhY2VydHMKIENBQ0VSVFNfRklMRT1AQ0FDRVJUU19GSUxFQAogCisjIEVuYWJsZSB1bmxpbWl0ZWQgY3J5cHRvIHBvbGljeQorVU5MSU1JVEVEX0NSWVBUTz1AVU5MSU1JVEVEX0NSWVBUT0AKKwogIyBOZWNlc3NhcnkgYWRkaXRpb25hbCBjb21waWxlciBmbGFncyB0byBjb21waWxlIFgxMSAKIFhfQ0ZMQUdTOj1AWF9DRkxBR1NACiBYX0xJQlM6PUBYX0xJQlNACkBAIC0yODksNyArMjk3LDcgQEAKIENYWF9GTEFHX0RFUFM6PUBDWFhfRkxBR19ERVBTQAogCiAjIFRvb2xzIHRoYXQgcG90ZW50aWFsbHkgbmVlZCB0byBiZSBjcm9zcyBjb21waWxhdGlvbiBhd2FyZS4KLUNDOj1AVU5DWUdEUklWRUAgQENDQUNIRUAgQENDQAorQ0M6PUBGSVhQQVRIQCBAQ0NBQ0hFQCBAQ0NACiAKICMgQ0ZMQUdTIHVzZWQgdG8gY29tcGlsZSB0aGUgamRrIG5hdGl2ZSBsaWJyYXJpZXMgKEMtY29kZSkKIENGTEFHU19KREtMSUI6PUBDRkxBR1NfSkRLTElCQApAQCAtMjk5LDE3ICszMDcsMTcgQEAKIENGTEFHU19KREtFWEU6PUBDRkxBR1NfSkRLRVhFQAogQ1hYRkxBR1NfSkRLRVhFOj1AQ1hYRkxBR1NfSkRLRVhFQAogCi1DWFg6PUBVTkNZR0RSSVZFQCBAQ0NBQ0hFQCBAQ1hYQAorQ1hYOj1ARklYUEFUSEAgQENDQUNIRUAgQENYWEAKICNDWFhGTEFHUzo9QENYWEZMQUdTQAogCiBPQkpDOj1AQ0NBQ0hFQCBAT0JKQ0AKICNPQkpDRkxBR1M6PUBPQkpDRkxBR1NACiAKLUNQUDo9QFVOQ1lHRFJJVkVAIEBDUFBACitDUFA6PUBGSVhQQVRIQCBAQ1BQQAogI0NQUEZMQUdTOj1AQ1BQRkxBR1NACiAKICMgVGhlIGxpbmtlciBjYW4gYmUgZ2NjIG9yIGxkIG9uIHBvc2l4IHN5c3RlbXMsIG9yIGxpbmsuZXhlIG9uIHdpbmRvd3Mgc3lzdGVtcy4KLUxEOj1AVU5DWUdEUklWRUAgQExEQAorTEQ6PUBGSVhQQVRIQCBATERACiAKICMgTERGTEFHUyB1c2VkIHRvIGxpbmsgdGhlIGpkayBuYXRpdmUgbGlicmFyaWVzIChDLWNvZGUpCiBMREZMQUdTX0pES0xJQjo9QExERkxBR1NfSkRLTElCQApAQCAtMzE3LDcgKzMyNSw3IEBACiAKICMgT24gc29tZSBwbGF0Zm9ybXMgdGhlIGxpbmtlciBjYW5ub3QgYmUgdXNlZCB0byBjcmVhdGUgZXhlY3V0YWJsZXMsIHRodXMKICMgdGhlIG5lZWQgZm9yIGEgc2VwYXJhdGUgTERFWEUgY29tbWFuZC4KLUxERVhFOj1AVU5DWUdEUklWRUAgQExERVhFQAorTERFWEU6PUBGSVhQQVRIQCBATERFWEVACiAKICMgTERGTEFHUyB1c2VkIHRvIGxpbmsgdGhlIGpkayBuYXRpdmUgbGF1bmNoZXJzIChDLWNvZGUpCiBMREZMQUdTX0pES0VYRTo9QExERkxBR1NfSkRLRVhFQApAQCAtMzI3LDIyICszMzUsMjIgQEAKIExERkxBR1NfQ1hYX0pESzo9QExERkxBR1NfQ1hYX0pES0AKIAogIyBTb21ldGltZXMgYSBkaWZmZXJlbnQgbGlua2VyIGlzIG5lZWRlZCBmb3IgYysrIGxpYnMKLUxEQ1hYOj1AVU5DWUdEUklWRUAgQExEQ1hYQAorTERDWFg6PUBGSVhQQVRIQCBATERDWFhACiAjIFRoZSBmbGFncyBmb3IgbGlua2luZyBsaWJzdGRjKysgbGlua2VyLgogTElCQ1hYOj1ATElCQ1hYQAogCiAjIFNvbWV0aW1lcyBhIGRpZmZlcmVudCBsaW5rZXIgaXMgbmVlZGVkIGZvciBjKysgZXhlY3V0YWJsZXMKLUxERVhFQ1hYOj1AVU5DWUdEUklWRUAgQExERVhFQ1hYQAorTERFWEVDWFg6PUBGSVhQQVRIQCBATERFWEVDWFhACiAKICMgQlVJTERfQ0MvQlVJTERfTEQgaXMgYSBjb21waWxlci9saW5rZXIgdGhhdCBnZW5lcmF0ZXMgY29kZSB0aGF0IGlzIHJ1bm5hYmxlIG9uIHRoZQogIyBidWlsZCBwbGF0Zm9ybS4KLUJVSUxEX0NDOj1AVU5DWUdEUklWRUAgQEJVSUxEX0NDQAotQlVJTERfTEQ6PUBVTkNZR0RSSVZFQCBAQlVJTERfTERACitCVUlMRF9DQzo9QEZJWFBBVEhAIEBCVUlMRF9DQ0AKK0JVSUxEX0xEOj1ARklYUEFUSEAgQEJVSUxEX0xEQAogCi1BUzo9QFVOQ1lHRFJJVkVAIEBBU0AKK0FTOj1ARklYUEFUSEAgQEFTQAogCiAjIEFSIGlzIHVzZWQgdG8gY3JlYXRlIGEgc3RhdGljIGxpYnJhcnkgKGlzIGFyIGluIHBvc2l4LCBsaWIuZXhlIGluIHdpbmRvd3MpCi1BUjo9QFVOQ1lHRFJJVkVAIEBBUkAKK0FSOj1ARklYUEFUSEAgQEFSQAogQVJGTEFHUzo9QEFSRkxBR1NACiAKIE5NOj1ATk1ACkBAIC00MDAsMjAgKzQwOCwyMCBAQAogCiBKQVZBX0ZMQUdTOj1AQk9PVF9KREtfSlZNQVJHU0AKIAotSkFWQT1AVU5DWUdEUklWRUAgJChCT09UX0pESykvYmluL2phdmEgJChKQVZBX0ZMQUdTKQorSkFWQT1ARklYUEFUSEAgJChCT09UX0pESykvYmluL2phdmEgJChKQVZBX0ZMQUdTKQogCi1KQVZBQz1AVU5DWUdEUklWRUAgJChCT09UX0pESykvYmluL2phdmFjCitKQVZBQz1ARklYUEFUSEAgJChCT09UX0pESykvYmluL2phdmFjCiAjIEhvdHNwb3Qgc2V0cyB0aGlzIHZhcmlhYmxlIGJlZm9yZSByZWFkaW5nIHRoZSBTUEVDIHdoZW4gY29tcGlsaW5nIHNhLWpkaS5qYXIuIEF2b2lkCiAjIG92ZXJyaWRpbmcgdGhhdCB2YWx1ZSBieSB1c2luZyA/PS4KIEpBVkFDX0ZMQUdTPz1ASkFWQUNfRkxBR1NACiAKLUpBVkFIPUBVTkNZR0RSSVZFQCAkKEJPT1RfSkRLKS9iaW4vamF2YWgKK0pBVkFIPUBGSVhQQVRIQCAkKEJPT1RfSkRLKS9iaW4vamF2YWgKIAotSkFSPUBVTkNZR0RSSVZFQCAkKEJPT1RfSkRLKS9iaW4vamFyCitKQVI9QEZJWFBBVEhAICQoQk9PVF9KREspL2Jpbi9qYXIKIAotUk1JQz1AVU5DWUdEUklWRUAgJChCT09UX0pESykvYmluL3JtaWMKK1JNSUM9QEZJWFBBVEhAICQoQk9PVF9KREspL2Jpbi9ybWljCiAKLU5BVElWRTJBU0NJST1AVU5DWUdEUklWRUAgJChCT09UX0pESykvYmluL25hdGl2ZTJhc2NpaQorTkFUSVZFMkFTQ0lJPUBGSVhQQVRIQCAkKEJPT1RfSkRLKS9iaW4vbmF0aXZlMmFzY2lpCiAKICMgQmFzZSBmbGFncyBmb3IgUkMKICMgR3VhcmRpbmcgdGhpcyBhZ2FpbnN0IHJlc2V0dGluZyB2YWx1ZS4gTGVnYWN5IG1ha2UgZmlsZXMgaW5jbHVkZSBzcGVjIG11bHRpcGxlCkBAIC00MjQsMjEgKzQzMiwyMCBAQAogCiAjIEEgc3BlY2lmaWMgamF2YSBiaW5hcnkgd2l0aCBzcGVjaWZpYyBvcHRpb25zIGNhbiBiZSB1c2VkIHRvIHJ1bgogIyB0aGUgbG9uZyBydW5uaW5nIGJhY2tncm91bmQgc2phdmFjIHNlcnZlcnMgYW5kIG90aGVyIGxvbmcgcnVubmluZyB0YXNrcy4KLVNKQVZBQ19TRVJWRVJfSkFWQTo9QFVOQ1lHRFJJVkVAIEBTSkFWQUNfU0VSVkVSX0pBVkFACitTSkFWQUNfU0VSVkVSX0pBVkE6PUBGSVhQQVRIQCBAU0pBVkFDX1NFUlZFUl9KQVZBQAogCiAjIFRvb2xzIGFkaGVyaW5nIHRvIGEgbWluaW1hbCBhbmQgY29tbW9uIHN0YW5kYXJkIG9mIHBvc2l4IGNvbXBsaWFuY2UuCiBBV0s6PUBBV0tACiBCQVNFTkFNRTo9QEJBU0VOQU1FQAorQkFTSDo9QEJBU0hACiBDQVQ6PUBDQVRACiBDQ0FDSEU6PUBDQ0FDSEVACiAjIENEIGlzIGdvaW5nIGF3YXksIGJ1dCByZW1haW5zIHRvIGNhdGVyIGZvciBsZWdhY3kgbWFrZWZpbGVzLgogQ0Q6PWNkCiBDSE1PRDo9QENITU9EQAogQ1A6PUBDUEAKLUNQSU86PUBDUElPQAogQ1VUOj1AQ1VUQAogREFURTo9QERBVEVACi1ERjo9QERGQAogRElGRjo9QERJRkZACiBGSU5EOj1ARklOREAKIEZJTkRfREVMRVRFOj1ARklORF9ERUxFVEVACkBAIC00NjEsNiArNDY4LDcgQEAKIFRBUjo9QFRBUkAKIFRBSUw6PUBUQUlMQAogVEVFOj1AVEVFQAorVElNRTo9QFRJTUVACiBUUjo9QFRSQAogVE9VQ0g6PUBUT1VDSEAKIFdDOj1AV0NACkBAIC00NjgsOSArNDc2LDkgQEAKIFpJUEVYRTo9QFpJUEAKIFpJUDo9QFpJUEAKIFVOWklQOj1AVU5aSVBACi1NVDo9QFVOQ1lHRFJJVkVAIEBNVEAKLVJDOj1AVU5DWUdEUklWRUAgQFJDQAotRFVNUEJJTjo9QFVOQ1lHRFJJVkVAIEBEVU1QQklOQAorTVQ6PUBGSVhQQVRIQCBATVRACitSQzo9QEZJWFBBVEhAIEBSQ0AKK0RVTVBCSU46PUBGSVhQQVRIQCBARFVNUEJJTkAKIENZR1BBVEg6PUBDWUdQQVRIQAogTEREOj1ATEREQAogT1RPT0w6PUBPVE9PTEAKQEAgLTQ3OSw4ICs0ODcsOSBAQAogRklMRTo9QEZJTEVACiBIRzo9QEhHQAogT0JKQ09QWTo9QE9CSkNPUFlACitTRVRGSUxFOj1AU0VURklMRUAKIAotVU5DWUdEUklWRTo9QFVOQ1lHRFJJVkVACitGSVhQQVRIOj1ARklYUEFUSEAKIAogIyBXaGVyZSB0aGUgYnVpbGQgb3V0cHV0IGlzIHN0b3JlZCBmb3IgeW91ciBjb252ZW5pZW5jZS4KIEJVSUxEX0xPRzo9QEJVSUxEX0xPR0AKQEAgLTQ4OCwxNCArNDk3LDEyIEBACiBCVUlMRF9MT0dfV1JBUFBFUjo9QEJVSUxEX0xPR19XUkFQUEVSQAogCiAjIEJ1aWxkIHNldHVwCi1ESVNBQkxFX05JTUJVUzo9QERJU0FCTEVfTklNQlVTQAogRU5BQkxFX0pGUj1ARU5BQkxFX0pGUkAKIFVTRV9FWFRFUk5BTF9MSUJKUEVHOj1AVVNFX0VYVEVSTkFMX0xJQkpQRUdACiBVU0VfRVhURVJOQUxfTElCR0lGOj1AVVNFX0VYVEVSTkFMX0xJQkdJRkAKIFVTRV9FWFRFUk5BTF9MSUJaOj1AVVNFX0VYVEVSTkFMX0xJQlpACiBMSUJaSVBfQ0FOX1VTRV9NTUFQOj1ATElCWklQX0NBTl9VU0VfTU1BUEAKLUNIRUNLX0ZPUl9WQ0lOU1RBTExESVI9QENIRUNLX0ZPUl9WQ0lOU1RBTExESVJACi1NU1ZDUk5OX0RMTDo9QE1TVkNSMTAwRExMQAorTVNWQ1JfRExMOj1ATVNWQ1JfRExMQAogCiAKICMgQUREX1NSQ1MgdGFrZXMgYSBzaW5nbGUgYXJndW1lbnQgd2l0aCBzb3VyY2Ugcm9vdHMKZGlmZiAtLWdpdCBhL2NvbW1vbi9hdXRvY29uZi90b29sY2hhaW4ubTQgYi9jb21tb24vYXV0b2NvbmYvdG9vbGNoYWluLm00CmluZGV4IDQ1YzM3NmYuLmViOGQyYjEgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9hdXRvY29uZi90b29sY2hhaW4ubTQKKysrIGIvY29tbW9uL2F1dG9jb25mL3Rvb2xjaGFpbi5tNApAQCAtMjMsMTExICsyMyw2NyBAQAogIyBxdWVzdGlvbnMuCiAjCiAKLUFDX0RFRlVOX09OQ0UoW1RPT0xDSEFJTl9TRVRVUF9WSVNVQUxfU1RVRElPX0VOVl0sCisjICQxID0gY29tcGlsZXIgdG8gdGVzdCAoQ0Mgb3IgQ1hYKQorIyAkMiA9IGh1bWFuIHJlYWRhYmxlIG5hbWUgb2YgY29tcGlsZXIgKEMgb3IgQysrKQorQUNfREVGVU4oW1RPT0xDSEFJTl9DSEVDS19DT01QSUxFUl9WRVJTSU9OXSwKIFsKKyAgQ09NUElMRVI9WyRdJDEKKyAgQ09NUElMRVJfTkFNRT0kMgogCi0jIENoZWNrIGlmIHRoZSBWUyBlbnYgdmFyaWFibGVzIHdlcmUgc2V0dXAgcHJpb3IgdG8gcnVubmluZyBjb25maWd1cmUuCi0jIElmIG5vdCwgdGhlbiBmaW5kIHZjdmFyc2FsbC5iYXQgYW5kIHJ1biBpdCBhdXRvbWF0aWNhbGx5LCBhbmQgaW50ZWdyYXRlCi0jIHRoZSBzZXQgZW52IHZhcmlhYmxlcyBpbnRvIHRoZSBzcGVjIGZpbGUuCi1TRVRVUERFVkVOVj0iIyBObyBzcGVjaWFsIHZhcnMiCi1pZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1MiID0gInh3aW5kb3dzIjsgdGhlbgotICAgICMgU3RvcmUgcGF0aCB0byBjeWd3aW4gbGluay5leGUgdG8gaGVscCBleGNsdWRpbmcgaXQgd2hlbiBzZWFyY2hpbmcgZm9yIAotICAgICMgVlMgbGlua2VyLgotICAgIEFDX1BBVEhfUFJPRyhDWUdXSU5fTElOSywgbGluaykKLSAgICBBQ19NU0dfQ0hFQ0tJTkcoW2lmIHRoZSBmaXJzdCBmb3VuZCBsaW5rLmV4ZSBpcyBhY3R1YWxseSB0aGUgQ3lnd2luIGxpbmsgdG9vbF0pCi0gICAgIiRDWUdXSU5fTElOSyIgLS12ZXJzaW9uID4gL2Rldi9udWxsCi0gICAgaWYgdGVzdCAkPyAtZXEgMCA7IHRoZW4KLSAgICAgIEFDX01TR19SRVNVTFQoW3llc10pCisgIGlmIHRlc3QgIngkT1BFTkpES19UQVJHRVRfT1MiID0geHNvbGFyaXM7IHRoZW4KKyAgICAjIE1ha2Ugc3VyZSB3ZSB1c2UgdGhlIFN1biBTdHVkaW8gY29tcGlsZXIgYW5kIG5vdCBnY2Mgb24gU29sYXJpcywgd2hpY2ggd29uJ3Qgd29yaworICAgIENPTVBJTEVSX1ZFUlNJT05fVEVTVD1gJENPTVBJTEVSIC1WIDI+JjEgfCAkSEVBRCAtbiAxYAorICAgICRFQ0hPICRDT01QSUxFUl9WRVJTSU9OX1RFU1QgfCAkR1JFUCAiXi4qOiBTdW4gJENPTVBJTEVSX05BTUUiID4gL2Rldi9udWxsCisgICAgaWYgdGVzdCAkPyAtbmUgMDsgdGhlbgorICAgICAgR0NDX1ZFUlNJT05fVEVTVD1gJENPTVBJTEVSIC0tdmVyc2lvbiAyPiYxIHwgJEhFQUQgLW4gMWAKKyAgICAgIAorICAgICAgQUNfTVNHX05PVElDRShbVGhlICRDT01QSUxFUl9OQU1FIGNvbXBpbGVyIChsb2NhdGVkIGFzICRDT01QSUxFUikgZG9lcyBub3Qgc2VlbSB0byBiZSB0aGUgcmVxdWlyZWQgU3VuIFN0dWRpbyBjb21waWxlci5dKQorICAgICAgQUNfTVNHX05PVElDRShbVGhlIHJlc3VsdCBmcm9tIHJ1bm5pbmcgd2l0aCAtViB3YXM6ICIkQ09NUElMRVJfVkVSU0lPTl9URVNUIiBhbmQgd2l0aCAtLXZlcnNpb246ICIkR0NDX1ZFUlNJT05fVEVTVCJdKQorICAgICAgQUNfTVNHX0VSUk9SKFtTdW4gU3R1ZGlvIGNvbXBpbGVyIGlzIHJlcXVpcmVkLiBUcnkgc2V0dGluZyAtLXdpdGgtdG9vbHMtZGlyLl0pCiAgICAgZWxzZQotICAgICAgQUNfTVNHX1JFU1VMVChbbm9dKQotICAgICAgIyBUaGlzIG1pZ2h0IGJlIHRoZSBWUyBsaW5rZXIuIERvbid0IGV4Y2x1ZGUgaXQgbGF0ZXIgb24uCi0gICAgICBDWUdXSU5fTElOSz0iIgorICAgICAgQ09NUElMRVJfVkVSU0lPTj1gJEVDSE8gJENPTVBJTEVSX1ZFUlNJT05fVEVTVCB8ICRTRUQgLW4gInMvXi4qQDw6QCAsXHRAOj5AJENPTVBJTEVSX05BTUVAPDpAICxcdEA6PkBcKEA8OkAxLTlAOj5AXC5APDpAMC05QDo+QEA8OkAwLTlAOj5AKlwpLiovXDEvcCJgCisgICAgICBDT01QSUxFUl9WRU5ET1I9IlN1biBTdHVkaW8iCisgICAgZmkKKyAgZWxpZiB0ZXN0ICAieCRPUEVOSkRLX1RBUkdFVF9PUyIgPSB4d2luZG93czsgdGhlbgorICAgICMgRmlyc3QgbGluZSB0eXBpY2FsbHkgbG9va3Mgc29tZXRoaW5nIGxpa2U6CisgICAgIyBNaWNyb3NvZnQgKFIpIDMyLWJpdCBDL0MrKyBPcHRpbWl6aW5nIENvbXBpbGVyIFZlcnNpb24gMTYuMDAuMzAzMTkuMDEgZm9yIDgweDg2CisgICAgQ09NUElMRVJfVkVSU0lPTl9URVNUPWAkQ09NUElMRVIgMj4mMSB8ICRIRUFEIC1uIDFgCisgICAgQ09NUElMRVJfVkVSU0lPTj1gJEVDSE8gJENPTVBJTEVSX1ZFUlNJT05fVEVTVCB8ICRTRUQgLW4gInMvXi4qVmVyc2lvbiBcKEA8OkAxLTlAOj5AQDw6QDAtOS5AOj5AKlwpIC4qL1wxL3AiYAorICAgIENPTVBJTEVSX1ZFTkRPUj0iTWljcm9zb2Z0IENMLkVYRSIKKyAgICBDT01QSUxFUl9DUFVfVEVTVD1gJEVDSE8gJENPTVBJTEVSX1ZFUlNJT05fVEVTVCB8ICRTRUQgLW4gInMvXi4qIGZvciBcKC4qXCkkL1wxL3AiYAorICAgIGlmIHRlc3QgIngkT1BFTkpES19UQVJHRVRfQ1BVIiA9ICJ4eDg2IjsgdGhlbgorICAgICAgaWYgdGVzdCAieCRDT01QSUxFUl9DUFVfVEVTVCIgIT0gIng4MHg4NiI7IHRoZW4KKyAgICAgICAgQUNfTVNHX0VSUk9SKFtUYXJnZXQgQ1BVIG1pc21hdGNoLiBXZSBhcmUgYnVpbGRpbmcgZm9yICRPUEVOSkRLX1RBUkdFVF9DUFUgYnV0IENMIGlzIGZvciAiJENPTVBJTEVSX0NQVV9URVNUIjsgZXhwZWN0ZWQgIjgweDg2Ii5dKQorICAgICAgZmkKKyAgICBlbGlmIHRlc3QgIngkT1BFTkpES19UQVJHRVRfQ1BVIiA9ICJ4eDg2XzY0IjsgdGhlbgorICAgICAgaWYgdGVzdCAieCRDT01QSUxFUl9DUFVfVEVTVCIgIT0gInh4NjQiOyB0aGVuCisgICAgICAgIEFDX01TR19FUlJPUihbVGFyZ2V0IENQVSBtaXNtYXRjaC4gV2UgYXJlIGJ1aWxkaW5nIGZvciAkT1BFTkpES19UQVJHRVRfQ1BVIGJ1dCBDTCBpcyBmb3IgIiRDT01QSUxFUl9DUFVfVEVTVCI7IGV4cGVjdGVkICJ4NjQiLl0pCisgICAgICBmaQorICAgIGZpCisgIGVsc2UKKyAgICBDT01QSUxFUl9WRVJTSU9OX1RFU1Q9YCRDT01QSUxFUiAtLXZlcnNpb24gMj4mMSB8ICRIRUFEIC1uIDFgCisgICAgIyBDaGVjayB0aGF0IHRoaXMgaXMgbGlrZWx5IHRvIGJlIEdDQy4KKyAgICAkQ09NUElMRVIgLS12ZXJzaW9uIDI+JjEgfCAkR1JFUCAiRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiA+IC9kZXYvbnVsbAorICAgIGlmIHRlc3QgJD8gLW5lIDA7IHRoZW4KKyAgICAgIEFDX01TR19OT1RJQ0UoW1RoZSAkQ09NUElMRVJfTkFNRSBjb21waWxlciAobG9jYXRlZCBhcyAkQ09NUElMRVIpIGRvZXMgbm90IHNlZW0gdG8gYmUgdGhlIHJlcXVpcmVkIEdDQyBjb21waWxlci5dKQorICAgICAgQUNfTVNHX05PVElDRShbVGhlIHJlc3VsdCBmcm9tIHJ1bm5pbmcgd2l0aCAtLXZlcnNpb24gd2FzOiAiJENPTVBJTEVSX1ZFUlNJT05fVEVTVCJdKQorICAgICAgQUNfTVNHX0VSUk9SKFtHQ0MgY29tcGlsZXIgaXMgcmVxdWlyZWQuIFRyeSBzZXR0aW5nIC0td2l0aC10b29scy1kaXIuXSkKICAgICBmaQogICAgIAotICAgICMgSWYgdmN2YXJzYWxsLmJhdCBoYXMgYmVlbiBydW4sIHRoZW4gVkNJTlNUQUxMRElSIGlzIHNldC4KLSAgICBpZiB0ZXN0ICJ4JFZDSU5TVEFMTERJUiIgIT0geDsgdGhlbgotICAgICAgICAjIE5vIGZ1cnRoZXIgc2V0dXAgaXMgbmVlZGVkLiBUaGUgYnVpbGQgd2lsbCBoYXBwZW4gZnJvbSB0aGlzIGtpbmQKLSAgICAgICAgIyBvZiBzaGVsbC4KLSAgICAgICAgU0VUVVBERVZFTlY9IiMgVGhpcyBzcGVjIGZpbGUgZXhwZWN0cyB0aGF0IHlvdSBhcmUgcnVubmluZyBiYXNoIGZyb20gd2l0aGluIGEgVlMgY29tbWFuZCBwcm9tcHQuIgotICAgICAgICAjIE1ha2Ugc3VyZSB0byByZW1pbmQgeW91LCBpZiB5b3UgZm9yZ2V0IHRvIHJ1biBtYWtlIGZyb20gYSBjeWd3aW4gYmFzaCBzaGVsbAotICAgICAgICAjIHRoYXQgaXMgc3Bhd25lZCAiYmFzaCAtbCIgZnJvbSBhIFZTIGNvbW1hbmQgcHJvbXB0LgotICAgICAgICBDSEVDS19GT1JfVkNJTlNUQUxMRElSPXllcwotICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW2lmIHlvdSBhcmUgcnVubmluZyBmcm9tIHdpdGhpbiBhIFZTIGNvbW1hbmQgcHJvbXB0XSkKLSAgICAgICAgQUNfTVNHX1JFU1VMVChbeWVzXSkKLSAgICBlbHNlCi0gICAgICAgICMgQWgsIHdlIGhhdmUgbm90IHlldCBydW4gdmN2YXJzYWxsLmJhdC92c3ZhcnMzMi5iYXQvdnN2YXJzNjQuYmF0LiBMZXRzIGRvIHRoYXQuIEZpcnN0IGZpbmQgaXQuCi0gICAgICAgIGlmIHRlc3QgIngkVlMxMDBDT01OVE9PTFMiICE9IHg7IHRoZW4KLSAgICAgICAgICAgIFZBUlNCQVQ9YGZpbmQgIiRWUzEwMENPTU5UT09MUy8uLi8uLiIgLW5hbWUgdmN2YXJzYWxsLmJhdGAKLQkgICAgU0VBUkNIX1JPT1Q9IiRWUzEwMENPTU5UT09MUyIKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgVkFSU0JBVD1gZmluZCAiJFBST0dSQU1GSUxFUyIgLW5hbWUgdmN2YXJzYWxsLmJhdGAKLQkgICAgU0VBUkNIX1JPT1Q9IiRQUk9HUkFNRklMRVMiCi0gICAgICAgIGZpCi0gICAgICAgIFZDUEFUSD1gZGlybmFtZSAiJFZBUlNCQVQiYAotICAgICAgICBWQ1BBVEg9YGN5Z3BhdGggLXcgIiRWQ1BBVEgiYAotCWlmIHRlc3QgIngkVkFSU0JBVCIgPSB4IHx8IHRlc3QgISAtZCAiJFZDUEFUSCI7IHRoZW4KLSAgICAgICAgICAgIEFDX01TR19DSEVDS0lORyhbaWYgd2UgY2FuIGZpbmQgdGhlIFZTIGluc3RhbGxhdGlvbl0pCi0gICAgICAgICAgICBBQ19NU0dfUkVTVUxUKFtub10pCi0gICAgICAgICAgICBBQ19NU0dfRVJST1IoW1RyaWVkIHRvIGZpbmQgYSBWUyBpbnN0YWxsYXRpb24gdXNpbmcgYm90aCAkU0VBUkNIX1JPT1QgYnV0IGZhaWxlZC4gUGxlYXNlIHJ1biAiYzpcXGN5Z3dpblxcYmluXFxiYXNoLmV4ZSAtbCIgZnJvbSBhIFZTIGNvbW1hbmQgcHJvbXB0IGFuZCB0aGVuIHJ1biBjb25maWd1cmUvbWFrZSBmcm9tIHRoZXJlLl0pCi0gICAgICAgIGZpCi0gICAgICAgIGNhc2UgIiRPUEVOSkRLX1RBUkdFVF9DUFUiIGluCi0gICAgICAgICAgeDg2KQotICAgICAgICAgICAgVkFSU0JBVF9BUkNIPXg4NgotICAgICAgICAgICAgOzsKLSAgICAgICAgICB4ODZfNjQpCi0gICAgICAgICAgICBWQVJTQkFUX0FSQ0g9YW1kNjQKLSAgICAgICAgICAgIDs7Ci0gICAgICAgIGVzYWMKLSAgICAgICAgIyBMZXRzIGV4dHJhY3QgdGhlIHZhcmlhYmxlcyB0aGF0IGFyZSBzZXQgYnkgdmN2YXJzYWxsLmJhdC92c3ZhcnMzMi5iYXQvdnN2YXJzNjQuYmF0Ci0gICAgICAgIGNkICRPVVRQVVRfUk9PVAotICAgICAgICBiYXNoICRTUkNfUk9PVC9jb21tb24vYmluL2V4dHJhY3R2Y3ZhcnMuc2ggIiRWQVJTQkFUIiAiJFZBUlNCQVRfQVJDSCIKLQljZCAkQ1VSRElSCi0JaWYgdGVzdCAhIC1zICRPVVRQVVRfUk9PVC9sb2NhbGRldmVudi5zaCB8fCB0ZXN0ICEgLXMgJE9VVFBVVF9ST09UL2xvY2FsZGV2ZW52LmdtazsgdGhlbgotICAgICAgICAgICAgQUNfTVNHX0NIRUNLSU5HKFtpZiB3ZSBjYW4gZXh0cmFjdCB0aGUgbmVlZGVkIGVudiB2YXJpYWJsZXNdKQotICAgICAgICAgICAgQUNfTVNHX1JFU1VMVChbbm9dKQotICAgICAgICAgICAgQUNfTVNHX0VSUk9SKFtDb3VsZCBub3Qgc3VjY2VzZnVsbHkgZXh0cmFjdCB0aGUgZW52IHZhcmlhYmxlcyBuZWVkZWQgZm9yIHRoZSBWUyBzZXR1cC4gUGxlYXNlIHJ1biAiYzpcXGN5Z3dpblxcYmluXFxiYXNoLmV4ZSAtbCIgZnJvbSBhIFZTIGNvbW1hbmQgcHJvbXB0IGFuZCB0aGVuIHJ1biBjb25maWd1cmUvbWFrZSBmcm9tIHRoZXJlLl0pCi0gICAgICAgIGZpIAotICAgICAgICAjIE5vdyBzZXQgYWxsIHBhdGhzIGFuZCBvdGhlciBlbnYgdmFyaWFibGVzLiBUaGlzIHdpbGwgYWxsb3cgdGhlIHJlc3Qgb2YgCi0gICAgICAgICMgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdG8gZmluZCBhbmQgcnVuIHRoZSBjb21waWxlciBpbiB0aGUgcHJvcGVyIHdheS4KLSAgICAgICAgLiAkT1VUUFVUX1JPT1QvbG9jYWxkZXZlbnYuc2gKLSAgICAgICAgQUNfTVNHX0NIRUNLSU5HKFtpZiB3ZSBjYW4gZmluZCB0aGUgVlMgaW5zdGFsbGF0aW9uXSkKLQlpZiB0ZXN0ICJ4JFZDSU5TVEFMTERJUiIgIT0geDsgdGhlbiAKLSAgICAgICAgICAgIEFDX01TR19SRVNVTFQoWyRWQ0lOU1RBTExESVJdKQotICAgICAgICBlbHNlIAotICAgICAgICAgICAgQUNfTVNHX1JFU1VMVChbbm9dKQotICAgICAgICAgICAgQUNfTVNHX0VSUk9SKFtDb3VsZCBub3QgZmluZCBWUyBpbnN0YWxsYXRpb24uIFBsZWFzZSBpbnN0YWxsLiBJZiB5b3UgYXJlIHN1cmUgeW91IGhhdmUgaW5zdGFsbGVkIFZTLCB0aGVuIHBsZWFzZSBydW4gImM6XFxjeWd3aW5cXGJpblxcYmFzaC5leGUgLWwiIGZyb20gYSBWUyBjb21tYW5kIHByb21wdCBhbmQgdGhlbiBydW4gY29uZmlndXJlL21ha2UgZnJvbSB0aGVyZS5dKQotICAgICAgICBmaQotICAgICAgICBDSEVDS19GT1JfVkNJTlNUQUxMRElSPW5vCi0JU0VUVVBERVZFTlY9ImluY2x1ZGUgJE9VVFBVVF9ST09UL2xvY2FsZGV2ZW52LmdtayIKKyAgICAjIEZpcnN0IGxpbmUgdHlwaWNhbGx5IGxvb2tzIHNvbWV0aGluZyBsaWtlOgorICAgICMgZ2NjIChVYnVudHUvTGluYXJvIDQuNS4yLTh1YnVudHU0KSA0LjUuMgorICAgIENPTVBJTEVSX1ZFUlNJT049YCRFQ0hPICRDT01QSUxFUl9WRVJTSU9OX1RFU1QgfCAkU0VEIC1uICJzL14uKiBcKEA8OkAxLTlAOj5AQDw6QDAtOS5AOj5AKlwpL1wxL3AiYAorICAgIENPTVBJTEVSX1ZFTkRPUj1gJEVDSE8gJENPTVBJTEVSX1ZFUlNJT05fVEVTVCB8ICRTRUQgLW4gInMvXlwoLipcKSBAPDpAMS05QDo+QEA8OkAwLTkuQDo+QCovXDEvcCJgCisgIGZpCisgICMgVGhpcyBzZXRzIENDX1ZFUlNJT04gb3IgQ1hYX1ZFUlNJT04uIChUaGlzIGNvbW1lbnQgaXMgYSBncmVwIG1hcmtlcikKKyAgJDFfVkVSU0lPTj0iJENPTVBJTEVSX1ZFUlNJT04iCisgICMgVGhpcyBzZXRzIENDX1ZFTkRPUiBvciBDWFhfVkVORE9SLiAoVGhpcyBjb21tZW50IGlzIGEgZ3JlcCBtYXJrZXIpCisgICQxX1ZFTkRPUj0iJENPTVBJTEVSX1ZFTkRPUiIKIAotCUFDX01TR19DSEVDS0lORyhbZm9yIG1zdmNyMTAwLmRsbF0pCi0gICAgICAgIEFDX0FSR19XSVRIKG1zdmNyMTAwZGxsLCBbQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1tc3ZjcjEwMGRsbF0sCi0gICAgICAgICAgICBbY29weSB0aGlzIG1zdmNyMTAwLmRsbCBpbnRvIHRoZSBidWlsdCBKREtdKV0pCi0gICAgICAgIGlmIHRlc3QgIngkd2l0aF9tc3ZjcjEwMGRsbCIgIT0geDsgdGhlbgotICAgICAgICAgICAgTVNWQ1IxMDBETEw9IiR3aXRoX21zdmNyMTAwZGxsIgotICAgICAgICBlbHNlCi0gICAgICAgICAgICBpZiB0ZXN0ICJ4JE9QRU5KREtfVEFSR0VUX0NQVV9CSVRTIiA9IHg2NDsgdGhlbgotICAgICAgICAgICAgICAgIE1TVkNSMTAwRExMPWBmaW5kICIkVkNJTlNUQUxMRElSLy4uIiAtbmFtZSBtc3ZjcjEwMC5kbGwgfCBncmVwIHg2NCB8IGhlYWQgLS1saW5lcyAxYAotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIE1TVkNSMTAwRExMPWBmaW5kICIkVkNJTlNUQUxMRElSLy4uIiAtbmFtZSBtc3ZjcjEwMC5kbGwgfCBncmVwIHg4NiB8IGdyZXAgLXYgaWE2NCB8IGdyZXAgLXYgeDY0IHwgaGVhZCAtLWxpbmVzIDFgCi0gICAgICAgICAgICAgICAgaWYgdGVzdCAieCRNU1ZDUjEwMERMTCIgPSB4OyB0aGVuCi0gICAgICAgICAgICAgICAgICAgIE1TVkNSMTAwRExMPWBmaW5kICIkVkNJTlNUQUxMRElSLy4uIiAtbmFtZSBtc3ZjcjEwMC5kbGwgfCBoZWFkIC0tbGluZXMgMWAKLSAgICAgICAgICAgICAgICBmaQotICAgICAgICAgICAgZmkKLSAgICAgICAgZmkKLQlpZiB0ZXN0ICJ4JE1TVkNSMTAwRExMIiA9IHg7IHRoZW4KLSAgICAgICAgICAgQUNfTVNHX1JFU1VMVChbbm9dKQotCSAgIEFDX01TR19FUlJPUihbQ291bGQgbm90IGZpbmQgbXN2Y3IxMDAuZGxsICFdKQotICAgICAgICBmaQotICAgICAgICBBQ19NU0dfUkVTVUxUKFskTVNWQ1IxMDBETExdKQotCVNQQUNFU0FGRShNU1ZDUjEwMERMTCxbdGhlIHBhdGggdG8gbXN2Y3IxMDAuZGxsXSkKLSAgICBmaQotZmkKLUFDX1NVQlNUKFNFVFVQREVWRU5WKQotQUNfU1VCU1QoQ0hFQ0tfRk9SX1ZDSU5TVEFMTERJUikKLUFDX1NVQlNUKE1TVkNSMTAwRExMKQorICBBQ19NU0dfTk9USUNFKFtVc2luZyAkQ09NUElMRVJfVkVORE9SICRDT01QSUxFUl9OQU1FIGNvbXBpbGVyIHZlcnNpb24gJENPTVBJTEVSX1ZFUlNJT04gKGxvY2F0ZWQgYXQgJENPTVBJTEVSKV0pCiBdKQogCisKIEFDX0RFRlVOX09OQ0UoW1RPT0xDSEFJTl9TRVRVUF9TWVNST09UX0FORF9PVVRfT1BUSU9OU10sCiBbCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCkBAIC0xNTEsOCArMTA3LDY3IEBACiBBQ19TVUJTVChBUl9PVVRfT1BUSU9OKQogXSkKIAotQUNfREVGVU5fT05DRShbVE9PTENIQUlOX1NFVFVQX1BBVEhTXSwKKyMgJDEgPSBjb21waWxlciB0byB0ZXN0IChDQyBvciBDWFgpCisjICQyID0gaHVtYW4gcmVhZGFibGUgbmFtZSBvZiBjb21waWxlciAoQyBvciBDKyspCisjICQzID0gbGlzdCBvZiBjb21waWxlciBuYW1lcyB0byBzZWFyY2ggZm9yCitBQ19ERUZVTihbVE9PTENIQUlOX0ZJTkRfQ09NUElMRVJdLAogWworICBDT01QSUxFUl9OQU1FPSQyCisKKyAgIyBEbyBhIGZpcnN0IGluaXRpYWwgYXR0ZW1wdCBhdCBzZWFyY2hpbmcgdGhlIGxpc3Qgb2YgY29tcGlsZXIgbmFtZXMuCisgICMgQUNfUEFUSF9QUk9HUyBjYW4ndCBiZSBydW4gbXVsdGlwbGUgdGltZXMgd2l0aCB0aGUgc2FtZSB2YXJpYWJsZSwKKyAgIyBzbyBjcmVhdGUgYSBuZXcgbmFtZSBmb3IgdGhpcyBydW4uCisgIEFDX1BBVEhfUFJPR1MoUE9URU5USUFMXyQxLCAkMykKKyAgJDE9JFBPVEVOVElBTF8kMQorCisgIGlmIHRlc3QgIngkWyRdJDEiID0geDsgdGhlbgorICAgICAgSEVMUF9NU0dfTUlTU0lOR19ERVBFTkRFTkNZKFtkZXZraXRdKQorICAgICAgQUNfTVNHX0VSUk9SKFtDb3VsZCBub3QgZmluZCBhICRDT01QSUxFUl9OQU1FIGNvbXBpbGVyLiAkSEVMUF9NU0ddKQorICBmaQorICBCQVNJQ19GSVhVUF9FWEVDVVRBQkxFKCQxKQorICBBQ19NU0dfQ0hFQ0tJTkcoW3Jlc29sdmVkIHN5bWJvbGljIGxpbmtzIGZvciAkMV0pCisgIFRFU1RfQ09NUElMRVI9IlskXSQxIgorICBCQVNJQ19SRU1PVkVfU1lNQk9MSUNfTElOS1MoVEVTVF9DT01QSUxFUikKKyAgQUNfTVNHX1JFU1VMVChbJFRFU1RfQ09NUElMRVJdKQorICBBQ19NU0dfQ0hFQ0tJTkcoW2lmICQxIGlzIGRpc2d1aXNlZCBjY2FjaGVdKQorICAKKyAgQ09NUElMRVJfQkFTRU5BTUU9YCRCQVNFTkFNRSAiJFRFU1RfQ09NUElMRVIiYAorICBpZiB0ZXN0ICJ4JENPTVBJTEVSX0JBU0VOQU1FIiA9ICJ4Y2NhY2hlIjsgdGhlbgorICAgIEFDX01TR19SRVNVTFQoW3llcywgdHJ5aW5nIHRvIGZpbmQgcHJvcGVyICRDT01QSUxFUl9OQU1FIGNvbXBpbGVyXSkKKyAgICAjIFdlIC91c3IvbGliL2NjYWNoZSBpbiB0aGUgcGF0aCwgc28gY2MgaXMgYSBzeW1saW5rIHRvIC91c3IvYmluL2NjYWNoZS4KKyAgICAjIFdlIHdhbnQgdG8gY29udHJvbCBjY2FjaGUgaW52b2NhdGlvbiBvdXJzZWx2ZXMsIHNvIGlnbm9yZSB0aGlzIGNjIGFuZCB0cnkKKyAgICAjIHNlYXJjaGluZyBhZ2Fpbi4KKworICAgICMgUmVtb3ZlIHRoZSBwYXRoIHRvIHRoZSBmYWtlIGNjYWNoZSBjYyBmcm9tIHRoZSBQQVRICisgICAgUkVUUllfQ09NUElMRVJfU0FWRURfUEFUSD0iJFBBVEgiCisgICAgQ09NUElMRVJfRElSTkFNRT1gJERJUk5BTUUgWyRdJDFgCisgICAgUEFUSD0iYCRFQ0hPICRQQVRIIHwgJFNFRCAtZSAicywkQ09NUElMRVJfRElSTkFNRSwsZyIgLWUgInMsOjosOixnIiAtZSAicyxeOiwsZyJgIgorCisgICAgIyBUcnkgYWdhaW4gbG9va2luZyBmb3Igb3VyIGNvbXBpbGVyCisgICAgQUNfQ0hFQ0tfVE9PTFMoUFJPUEVSX0NPTVBJTEVSXyQxLCAkMykKKyAgICBCQVNJQ19GSVhVUF9FWEVDVVRBQkxFKFBST1BFUl9DT01QSUxFUl8kMSkKKyAgICBQQVRIPSIkUkVUUllfQ09NUElMRVJfU0FWRURfUEFUSCIKKworICAgIEFDX01TR19DSEVDS0lORyhbZm9yIHJlc29sdmVkIHN5bWJvbGljIGxpbmtzIGZvciAkMV0pCisgICAgQkFTSUNfUkVNT1ZFX1NZTUJPTElDX0xJTktTKFBST1BFUl9DT01QSUxFUl8kMSkKKyAgICBBQ19NU0dfUkVTVUxUKFskUFJPUEVSX0NPTVBJTEVSXyQxXSkKKyAgICAkMT0iJFBST1BFUl9DT01QSUxFUl8kMSIKKyAgZWxzZQorICAgIEFDX01TR19SRVNVTFQoW25vLCBrZWVwaW5nICQxXSkKKyAgICAkMT0iJFRFU1RfQ09NUElMRVIiCisgIGZpCisgIFRPT0xDSEFJTl9DSEVDS19DT01QSUxFUl9WRVJTSU9OKFskMV0sIFskQ09NUElMRVJfTkFNRV0pCitdKQorCisKK0FDX0RFRlVOKFtUT09MQ0hBSU5fU0VUVVBfUEFUSFNdLAorWworaWYgdGVzdCAieCRPUEVOSkRLX1RBUkdFVF9PUyIgPSAieHdpbmRvd3MiOyB0aGVuCisgIFRPT0xDSEFJTl9TRVRVUF9WSVNVQUxfU1RVRElPX0VOVgorZmkKKworQUNfU1VCU1QoTVNWQ1JfRExMKQorCiAjIElmIC0tYnVpbGQgQU5EIC0taG9zdCBpcyBzZXQsIHRoZW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgd2lsbCBmaW5kIGFueQogIyBjcm9zcyBjb21waWxhdGlvbiB0b29scyBpbiB0aGUgUEFUSC4gQ3Jvc3MgY29tcGlsYXRpb24gdG9vbHMKICMgZm9sbG93cyB0aGUgY3Jvc3MgY29tcGlsYXRpb24gc3RhbmRhcmQgd2hlcmUgdGhleSBhcmUgcHJlZml4ZWQgd2l0aCAke2hvc3R9LgpAQCAtMTcxLDExICsxODYsMTEgQEAKICAgICAjIE90aGVyd2lzZSwgd2UnbGwgc2V0IHRoZSBCVUlMRF90b29scyB0byB0aGUgbmF0aXZlIHRvb2xzLCBidXQgdGhhdCdsbCBoYXZlCiAgICAgIyB0byB3YWl0IHVudGlsIHRoZXkgYXJlIHByb3Blcmx5IGRpc2NvdmVyZWQuCiAgICAgQUNfUEFUSF9QUk9HUyhCVUlMRF9DQywgW2NsIGNjIGdjY10pCi0gICAgU0VUX0ZVTExfUEFUSChCVUlMRF9DQykKKyAgICBCQVNJQ19GSVhVUF9FWEVDVVRBQkxFKEJVSUxEX0NDKQogICAgIEFDX1BBVEhfUFJPR1MoQlVJTERfQ1hYLCBbY2wgQ0MgZysrXSkKLSAgICBTRVRfRlVMTF9QQVRIKEJVSUxEX0NYWCkKKyAgICBCQVNJQ19GSVhVUF9FWEVDVVRBQkxFKEJVSUxEX0NYWCkKICAgICBBQ19QQVRIX1BST0coQlVJTERfTEQsIGxkKQotICAgIFNFVF9GVUxMX1BBVEgoQlVJTERfTEQpCisgICAgQkFTSUNfRklYVVBfRVhFQ1VUQUJMRShCVUlMRF9MRCkKIGZpCiBBQ19TVUJTVChCVUlMRF9DQykKIEFDX1NVQlNUKEJVSUxEX0NYWCkKQEAgLTIxOCwzNiArMjMzLDQwIEBACiAgIFBBVEg9JFRPT0xTX0RJUjokUEFUSAogZmkKIAorCisjIyMgTG9jYXRlIEMgY29tcGlsZXIgKENDKQorCiAjIGdjYyBpcyBhbG1vc3QgYWx3YXlzIHByZXNlbnQsIGJ1dCBvbiBXaW5kb3dzIHdlCiAjIHByZWZlciBjbC5leGUgYW5kIG9uIFNvbGFyaXMgd2UgcHJlZmVyIENDLgogIyBUaHVzIHRlc3QgZm9yIHRoZW0gaW4gdGhpcyBvcmRlci4KLUFDX1BST0dfQ0MoW2NsIGNjIGdjY10pCi1pZiB0ZXN0ICJ4JENDIiA9IHg7IHRoZW4KLSAgICBIRUxQX01TR19NSVNTSU5HX0RFUEVOREVOQ1koW2RldmtpdF0pCi0gICAgQUNfTVNHX0VSUk9SKFtDb3VsZCBub3QgZmluZCBhIGNvbXBpbGVyLiAkSEVMUF9NU0ddKQotZmkKLWlmIHRlc3QgIngkQ0MiID0geGNjICYmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PUyIgPSB4bWFjb3N4OyB0aGVuCi0gICAgIyBEbyBub3QgdXNlIGNjIG9uIE1hY09TWCB1c2UgZ2NjIGluc3RlYWQuCi0gICAgQ0M9ImdjYyIKLWZpCi1TRVRfRlVMTF9QQVRIKENDKQotCi1BQ19QUk9HX0NYWChbY2wgQ0MgZysrXSkKLWlmIHRlc3QgIngkQ1hYIiA9IHhDQyAmJiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1MiID0geG1hY29zeDsgdGhlbgotICAgICMgVGhlIGZvdW5kIENDLCBldmVuIHRob3VnaCBpdCBzZWVtcyB0byBiZSBhIGcrKyBkZXJpdmF0ZSwgY2Fubm90IGNvbXBpbGUKLSAgICAjIGMrKyBjb2RlLiBPdmVycmlkZS4KLSAgICBDWFg9ImcrKyIKLWZpCi1TRVRfRlVMTF9QQVRIKENYWCkKLQotaWYgdGVzdCAieCRDWFgiID0geCB8fCB0ZXN0ICJ4JENDIiA9IHg7IHRoZW4KLSAgICBIRUxQX01TR19NSVNTSU5HX0RFUEVOREVOQ1koW2RldmtpdF0pCi0gICAgQUNfTVNHX0VSUk9SKFtDb3VsZCBub3QgZmluZCB0aGUgbmVlZGVkIGNvbXBpbGVycyEgJEhFTFBfTVNHIF0pCitpZiB0ZXN0ICJ4JE9QRU5KREtfVEFSR0VUX09TIiA9IHhtYWNvc3g7IHRoZW4KKyAgIyBEbyBub3QgcHJvYmUgZm9yIGNjIG9uIE1hY09TWC4KKyAgQ09NUElMRVJfQ0hFQ0tfTElTVD0iY2wgZ2NjIgorZWxzZQorICBDT01QSUxFUl9DSEVDS19MSVNUPSJjbCBjYyBnY2MiCiBmaQogCi1pZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1MiICE9IHh3aW5kb3dzOyB0aGVuCitUT09MQ0hBSU5fRklORF9DT01QSUxFUihbQ0NdLFtDXSxbJENPTVBJTEVSX0NIRUNLX0xJU1RdKQorIyBOb3cgdGhhdCB3ZSBoYXZlIHJlc29sdmVkIENDIG91cnNlbGYsIGxldCBhdXRvY29uZiBoYXZlIGl0J3MgZ28gYXQgaXQKK0FDX1BST0dfQ0MoWyRDQ10pCisKKyMjIyBMb2NhdGUgQysrIGNvbXBpbGVyIChDWFgpCisKK2lmIHRlc3QgIngkT1BFTkpES19UQVJHRVRfT1MiID0geG1hY29zeDsgdGhlbgorICAjIERvIG5vdCBwcm9iZSBmb3IgQ0Mgb24gTWFjT1NYLgorICBDT01QSUxFUl9DSEVDS19MSVNUPSJjbCBnKysiCitlbHNlCisgIENPTVBJTEVSX0NIRUNLX0xJU1Q9ImNsIENDIGcrKyIKK2ZpCitUT09MQ0hBSU5fRklORF9DT01QSUxFUihbQ1hYXSxbQysrXSxbJENPTVBJTEVSX0NIRUNLX0xJU1RdKQorIyBOb3cgdGhhdCB3ZSBoYXZlIHJlc29sdmVkIENYWCBvdXJzZWxmLCBsZXQgYXV0b2NvbmYgaGF2ZSBpdCdzIGdvIGF0IGl0CitBQ19QUk9HX0NYWChbJENYWF0pCisKKyMjIyBMb2NhdGUgb3RoZXIgdG9vbHMKKworaWYgdGVzdCAieCRPUEVOSkRLX1RBUkdFVF9PUyIgPSB4bWFjb3N4OyB0aGVuCiAgICAgQUNfUFJPR19PQkpDCi0gICAgU0VUX0ZVTExfUEFUSChPQkpDKQorICAgIEJBU0lDX0ZJWFVQX0VYRUNVVEFCTEUoT0JKQykKIGVsc2UKICAgICBPQkpDPQogZmkKQEAgLTI3MCwyMCArMjg5LDI2IEBACiAjIExpbmtpbmcgQysrIGV4ZWN1dGFibGVzLgogQUNfU1VCU1QoTERFWEVDWFgpCiAKLWlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PUyIgIT0geHdpbmRvd3M7IHRoZW4KK2lmIHRlc3QgIngkT1BFTkpES19UQVJHRVRfT1MiICE9IHh3aW5kb3dzOyB0aGVuCiAgICAgQUNfQ0hFQ0tfVE9PTChBUiwgYXIpCi0gICAgU0VUX0ZVTExfUEFUSChBUikKKyAgICBCQVNJQ19GSVhVUF9FWEVDVVRBQkxFKEFSKQogZmkKLWlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PUyIgPSB4bWFjb3N4OyB0aGVuCitpZiB0ZXN0ICJ4JE9QRU5KREtfVEFSR0VUX09TIiA9IHhtYWNvc3g7IHRoZW4KICAgICBBUkZMQUdTPSItciIKIGVsc2UKICAgICBBUkZMQUdTPSIiCiBmaQogQUNfU1VCU1QoQVJGTEFHUykKIAorIyBGb3IgaG90c3BvdCwgd2UgbmVlZCB0aGVzZSBpbiBXaW5kb3dzIG1peGVkIHBhdGg7IG90aGVyIHBsYXRmb3JtcyBrZWVwIHRoZW0gdGhlIHNhbWUKK0hPVFNQT1RfQ1hYPSIkQ1hYIgorSE9UU1BPVF9MRD0iJExEIgorQUNfU1VCU1QoSE9UU1BPVF9DWFgpCitBQ19TVUJTVChIT1RTUE9UX0xEKQorCiBDT01QSUxFUl9OQU1FPWdjYwogQ09NUElMRVJfVFlQRT1DQwotQVNfSUYoW3Rlc3QgIngkT1BFTkpES19CVUlMRF9PUyIgPSB4d2luZG93c10sIFsKK0FTX0lGKFt0ZXN0ICJ4JE9QRU5KREtfVEFSR0VUX09TIiA9IHh3aW5kb3dzXSwgWwogICAgICMgRm9yIG5vdywgYXNzdW1lIHRoYXQgd2UgYXJlIGFsd2F5cyBjb21waWxpbmcgdXNpbmcgY2wuZXhlLiAKICAgICBDQ19PVVRfT1BUSU9OPS1GbwogICAgIEVYRV9PVVRfT1BUSU9OPS1vdXQ6CkBAIC0yOTQsNyArMzE5LDcgQEAKICAgICBBQ19DSEVDS19QUk9HKFtXSU5MRF0sIFtsaW5rXSxbbGlua10sLCwgWyRDWUdXSU5fTElOS10pCiAgICAgIyBTaW5jZSB3ZSBtdXN0IGlnbm9yZSB0aGUgZmlyc3QgZm91bmQgbGluaywgV0lOTEQgd2lsbCBjb250YWluCiAgICAgIyB0aGUgZnVsbCBwYXRoIHRvIHRoZSBsaW5rLmV4ZSBwcm9ncmFtLgotICAgIFNFVF9GVUxMX1BBVEhfU1BBQ0VTQUZFKFtXSU5MRF0pCisgICAgQkFTSUNfRklYVVBfRVhFQ1VUQUJMRShXSU5MRCkKICAgICBwcmludGYgIldpbmRvd3MgbGlua2VyIHdhcyBmb3VuZCBhdCAkV0lOTERcbiIKICAgICBBQ19NU0dfQ0hFQ0tJTkcoW2lmIHRoZSBmb3VuZCBsaW5rLmV4ZSBpcyBhY3R1YWxseSB0aGUgVmlzdWFsIFN0dWRpbyBsaW5rZXJdKQogICAgICIkV0lOTEQiIC0tdmVyc2lvbiA+IC9kZXYvbnVsbApAQCAtMzEwLDEyICszMzUsMjUgQEAKICAgICBMREVYRUNYWD0iJFdJTkxEIgogCiAgICAgQUNfQ0hFQ0tfUFJPRyhbTVRdLCBbbXRdLCBbbXRdLCwsIFsvdXNyL2Jpbi9tdF0pCi0gICAgU0VUX0ZVTExfUEFUSF9TUEFDRVNBRkUoW01UXSkKKyAgICBCQVNJQ19GSVhVUF9FWEVDVVRBQkxFKE1UKQogICAgICMgVGhlIHJlc291cmNlIGNvbXBpbGVyCiAgICAgQUNfQ0hFQ0tfUFJPRyhbUkNdLCBbcmNdLCBbcmNdLCwsIFsvdXNyL2Jpbi9yY10pCi0gICAgU0VUX0ZVTExfUEFUSF9TUEFDRVNBRkUoW1JDXSkKKyAgICBCQVNJQ19GSVhVUF9FWEVDVVRBQkxFKFJDKQogCi0gICAgUkNfRkxBR1M9Ii1ub2xvZ28gL2wgMHg0MDkgL3IiCisgICAgIyBGb3IgaG90c3BvdCwgd2UgbmVlZCB0aGVzZSBpbiBXaW5kb3dzIG1peGVkIHBhdGgsCisgICAgIyBzbyByZXdyaXRlIHRoZW0gYWxsLiBOZWVkIGFkZGVkIC5leGUgc3VmZml4LgorICAgIEhPVFNQT1RfQ1hYPSIkQ1hYLmV4ZSIKKyAgICBIT1RTUE9UX0xEPSIkTEQuZXhlIgorICAgIEhPVFNQT1RfTVQ9IiRNVC5leGUiCisgICAgSE9UU1BPVF9SQz0iJFJDLmV4ZSIKKyAgICBCQVNJQ19XSU5ET1dTX1JFV1JJVEVfQVNfV0lORE9XU19NSVhFRF9QQVRIKEhPVFNQT1RfQ1hYKQorICAgIEJBU0lDX1dJTkRPV1NfUkVXUklURV9BU19XSU5ET1dTX01JWEVEX1BBVEgoSE9UU1BPVF9MRCkKKyAgICBCQVNJQ19XSU5ET1dTX1JFV1JJVEVfQVNfV0lORE9XU19NSVhFRF9QQVRIKEhPVFNQT1RfTVQpCisgICAgQkFTSUNfV0lORE9XU19SRVdSSVRFX0FTX1dJTkRPV1NfTUlYRURfUEFUSChIT1RTUE9UX1JDKQorICAgIEFDX1NVQlNUKEhPVFNQT1RfTVQpCisgICAgQUNfU1VCU1QoSE9UU1BPVF9SQykKKworICAgIFJDX0ZMQUdTPSItbm9sb2dvIC1sIDB4NDA5IC1yIgogICAgIEFTX0lGKFt0ZXN0ICJ4JFZBUklBTlQiID0geE9QVF0sIFsKICAgICAgICAgUkNfRkxBR1M9IiRSQ19GTEFHUyAtZCBOREVCVUciCiAgICAgXSkKQEAgLTMzMywxMiArMzcxLDEyIEBACiAKICAgICAjIGxpYi5leGUgaXMgdXNlZCB0byBjcmVhdGUgc3RhdGljIGxpYnJhcmllcy4KICAgICBBQ19DSEVDS19QUk9HKFtXSU5BUl0sIFtsaWJdLFtsaWJdLCwsKQotICAgIFNFVF9GVUxMX1BBVEhfU1BBQ0VTQUZFKFtXSU5BUl0pCisgICAgQkFTSUNfRklYVVBfRVhFQ1VUQUJMRShXSU5BUikKICAgICBBUj0iJFdJTkFSIgogICAgIEFSRkxBR1M9Ii1ub2xvZ28gLU5PREVGQVVMVExJQjpNU1ZDUlQiCiAKICAgICBBQ19DSEVDS19QUk9HKFtEVU1QQklOXSwgW2R1bXBiaW5dLCBbZHVtcGJpbl0sLCwpCi0gICAgU0VUX0ZVTExfUEFUSF9TUEFDRVNBRkUoW0RVTVBCSU5dKQorICAgIEJBU0lDX0ZJWFVQX0VYRUNVVEFCTEUoRFVNUEJJTikKIAogICAgIENPTVBJTEVSX1RZUEU9Q0wKICAgICBDQ1hYRkxBR1M9IiRDQ1hYRkxBR1MgLW5vbG9nbyIKQEAgLTM0NywxMCArMzg1LDEwIEBACiBBQ19TVUJTVChDT01QSUxFUl9UWVBFKQogCiBBQ19QUk9HX0NQUAotU0VUX0ZVTExfUEFUSChDUFApCitCQVNJQ19GSVhVUF9FWEVDVVRBQkxFKENQUCkKIAogQUNfUFJPR19DWFhDUFAKLVNFVF9GVUxMX1BBVEgoQ1hYQ1BQKQorQkFTSUNfRklYVVBfRVhFQ1VUQUJMRShDWFhDUFApCiAKIGlmIHRlc3QgIngkQ09NUElMRV9UWVBFIiAhPSAieGNyb3NzIjsgdGhlbgogICAgICMgSWYgd2UgYXJlIG5vdCBjcm9zcyBjb21waWxpbmcsIHVzZSB0aGUgc2FtZSBjb21waWxlcnMgZm9yCkBAIC0zNzMsNDMgKzQxMSw0NCBAQAogZmkKIAogIyBGaW5kIHRoZSByaWdodCBhc3NlbWJsZXIuCi1pZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1MiID0geHNvbGFyaXM7IHRoZW4KK2lmIHRlc3QgIngkT1BFTkpES19UQVJHRVRfT1MiID0geHNvbGFyaXM7IHRoZW4KICAgICBBQ19QQVRIX1BST0coQVMsIGFzKQotICAgIFNFVF9GVUxMX1BBVEgoQVMpCisgICAgQkFTSUNfRklYVVBfRVhFQ1VUQUJMRShBUykKIGVsc2UKICAgICBBUz0iJENDIC1jIgogZmkKIEFDX1NVQlNUKEFTKQogCi1pZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1MiID0geHNvbGFyaXM7IHRoZW4KK2lmIHRlc3QgIngkT1BFTkpES19UQVJHRVRfT1MiID0geHNvbGFyaXM7IHRoZW4KICAgICBBQ19QQVRIX1BST0dTKE5NLCBbZ25tIG5tXSkKLSAgICBTRVRfRlVMTF9QQVRIKE5NKQorICAgIEJBU0lDX0ZJWFVQX0VYRUNVVEFCTEUoTk0pCiAgICAgQUNfUEFUSF9QUk9HKFNUUklQLCBzdHJpcCkKLSAgICBTRVRfRlVMTF9QQVRIKFNUUklQKQorICAgIEJBU0lDX0ZJWFVQX0VYRUNVVEFCTEUoU1RSSVApCiAgICAgQUNfUEFUSF9QUk9HKE1DUywgbWNzKQotICAgIFNFVF9GVUxMX1BBVEgoTUNTKQotZWxpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1MiICE9IHh3aW5kb3dzOyB0aGVuCisgICAgQkFTSUNfRklYVVBfRVhFQ1VUQUJMRShNQ1MpCitlbGlmIHRlc3QgIngkT1BFTkpES19UQVJHRVRfT1MiICE9IHh3aW5kb3dzOyB0aGVuCiAgICAgQUNfQ0hFQ0tfVE9PTChOTSwgbm0pCi0gICAgU0VUX0ZVTExfUEFUSChOTSkKKyAgICBCQVNJQ19GSVhVUF9FWEVDVVRBQkxFKE5NKQogICAgIEFDX0NIRUNLX1RPT0woU1RSSVAsIHN0cmlwKQotICAgIFNFVF9GVUxMX1BBVEgoU1RSSVApCisgICAgQkFTSUNfRklYVVBfRVhFQ1VUQUJMRShTVFJJUCkKIGZpCiAKLSMjIwotIwotIyBDaGVjayBmb3Igb2JqY29weQotIwotIyAgIGJ1dCBzZWFyY2ggZm9yIGdvYmpjb3B5IGZpcnN0Li4uCi0jICAgc2luY2UgSSBvbiBzb2xhcmlzIGZvdW5kIGEgYnJva2VuIG9iamNvcHkuLi5idWhoCi0jCi1BQ19QQVRIX1RPT0woT0JKQ09QWSwgZ29iamNvcHkpCi1pZiB0ZXN0ICJ4JE9CSkNPUFkiID0geDsgdGhlbgotICAgQUNfUEFUSF9UT09MKE9CSkNPUFksIG9iamNvcHkpCisjIG9iamNvcHkgaXMgdXNlZCBmb3IgbW92aW5nIGRlYnVnIHN5bWJvbHMgdG8gc2VwYXJhdGUgZmlsZXMgd2hlbgorIyBmdWxsIGRlYnVnIHN5bWJvbHMgYXJlIGVuYWJsZWQuCitpZiB0ZXN0ICJ4JE9QRU5KREtfVEFSR0VUX09TIiA9IHhzb2xhcmlzIHx8IHRlc3QgIngkT1BFTkpES19UQVJHRVRfT1MiID0geGxpbnV4OyB0aGVuCisgICAgQUNfQ0hFQ0tfVE9PTFMoT0JKQ09QWSwgW2dvYmpjb3B5IG9iamNvcHldKQorICAgIEJBU0lDX0ZJWFVQX0VYRUNVVEFCTEUoT0JKQ09QWSkKK2ZpCisKK0FDX0NIRUNLX1RPT0xTKE9CSkRVTVAsIFtnb2JqZHVtcCBvYmpkdW1wXSkKK2lmIHRlc3QgIngkT0JKRFVNUCIgIT0geDsgdGhlbgorICAjIE9ubHkgdXNlZCBmb3IgY29tcGFyZS5zaDsgd2UgY2FuIGxpdmUgd2l0aG91dCBpdC4gQkFTSUNfRklYVVBfRVhFQ1VUQUJMRSBiYWlscyBpZiBhcmd1bWVudCBpcyBtaXNzaW5nLgorICBCQVNJQ19GSVhVUF9FWEVDVVRBQkxFKE9CSkRVTVApCiBmaQogCiBpZiB0ZXN0ICJ4JE9QRU5KREtfVEFSR0VUX09TIiA9ICJ4bWFjb3N4IjsgdGhlbgogICAgQUNfUEFUSF9QUk9HKExJUE8sIGxpcG8pCi0gICBTRVRfRlVMTF9QQVRIKExJUE8pCisgICBCQVNJQ19GSVhVUF9FWEVDVVRBQkxFKExJUE8pCiBmaQogCiAjIFJlc3RvcmUgb2xkIHBhdGggd2l0aG91dCB0b29scyBkaXIKQEAgLTQ0OSw3ICs0ODgsNyBAQAogICAgIFBPU1RfU1RSSVBfQ01EPSIkU1RSSVAgLWciCiAKICAgICAjIExpbmtpbmcgaXMgZGlmZmVyZW50IG9uIE1hY09TWAotICAgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PUyIgPSB4bWFjb3N4OyB0aGVuCisgICAgaWYgdGVzdCAieCRPUEVOSkRLX1RBUkdFVF9PUyIgPSB4bWFjb3N4OyB0aGVuCiAgICAgICAgICMgTWlnaHQgY2hhbmdlIGluIHRoZSBmdXR1cmUgdG8gY2xhbmcuCiAgICAgICAgIENPTVBJTEVSX05BTUU9Z2NjCiAgICAgICAgIFNIQVJFRF9MSUJSQVJZPSdsaWJbJF0xLmR5bGliJwpAQCAtNDYzLDcgKzUwMiw3IEBACiAgICAgICAgIFBPU1RfU1RSSVBfQ01EPSIkU1RSSVAgLVMiCiAgICAgZmkKIGVsc2UKLSAgICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1MiID0geHNvbGFyaXM7IHRoZW4KKyAgICBpZiB0ZXN0ICJ4JE9QRU5KREtfVEFSR0VUX09TIiA9IHhzb2xhcmlzOyB0aGVuCiAgICAgICAgICMgSWYgaXQgaXMgbm90IGdjYywgdGhlbiBhc3N1bWUgaXQgaXMgdGhlIE9yYWNsZSBTb2xhcmlzIFN0dWRpbyBDb21waWxlcgogICAgICAgICBDT01QSUxFUl9OQU1FPW9zc2MKICAgICAgICAgUElDRkxBRz0iLUtQSUMiCkBAIC00ODcsNyArNTI2LDcgQEAKICAgICAgICAgUE9TVF9TVFJJUF9DTUQ9IiRTVFJJUCAteCIKICAgICAgICAgUE9TVF9NQ1NfQ01EPSIkTUNTIC1kIC1hIFwiSkRLICRGVUxMX1ZFUlNJT05cIiIKICAgICBmaQotICAgIGlmIHRlc3QgIngkT1BFTkpES19CVUlMRF9PUyIgPSB4d2luZG93czsgdGhlbgorICAgIGlmIHRlc3QgIngkT1BFTkpES19UQVJHRVRfT1MiID0geHdpbmRvd3M7IHRoZW4KICAgICAgICAgIyBJZiBpdCBpcyBub3QgZ2NjLCB0aGVuIGFzc3VtZSBpdCBpcyB0aGUgTVMgVmlzdWFsIFN0dWRpbyBjb21waWxlcgogICAgICAgICBDT01QSUxFUl9OQU1FPWNsCiAgICAgICAgIFBJQ0ZMQUc9IiIKQEAgLTYyNiw2ICs2NjUsMTEgQEAKICAgICAgICAgIyAgQ2FuIGNhdXNlIHVuZGVmaW5lZCBleHRlcm5hbCBvbiBTb2xhcmlzIDggWDg2IG9uIF9fc2luY29zLCByZW1vdmluZyBmb3Igbm93CiAgICAgICAgICNDQ19ISUdIRVNUPSIkQ0NfSElHSEVTVCAteGxpYm1vcHQiCiAKKyAgICAgICAgaWYgdGVzdCAieCRPUEVOSkRLX1RBUkdFVF9DUFUiID0geHNwYXJjOyB0aGVuCisgICAgICAgICAgQ0ZMQUdTX0pESz0iJHtDRkxBR1NfSkRLfSAteG1lbWFsaWduPTRzIgorICAgICAgICAgIENYWEZMQUdTX0pESz0iJHtDWFhGTEFHU19KREt9IC14bWVtYWxpZ249NHMiCisgICAgICAgIGZpCisKICAgICAgICAgY2FzZSAkT1BFTkpES19UQVJHRVRfQ1BVX0FSQ0ggaW4KICAgICAgICAgICB4ODYpCiAgICAgICAgICAgICBDX09fRkxBR19ISUdIRVNUPSIteE80IC1XdSwtTzR+eXogJENDX0hJR0hFU1QgLXhyZWdzPW5vJWZyYW1lcHRyIgpAQCAtNjQyLDggKzY4Niw2IEBACiAgICAgICAgICAgICBmaQogICAgICAgICAgICAgOzsKICAgICAgICAgICBzcGFyYykKLSAgICAgICAgICAgIENGTEFHU19KREs9IiR7Q0ZMQUdTX0pES30gLXhtZW1hbGlnbj00cyIKLSAgICAgICAgICAgIENYWEZMQUdTX0pESz0iJHtDWFhGTEFHU19KREt9IC14bWVtYWxpZ249NHMiCiAgICAgICAgICAgICBDRkxBR1NfSkRLTElCX0VYVFJBPSIke0NGTEFHU19KREtMSUJfRVhUUkF9IC14cmVncz1ubyVhcHBsIgogICAgICAgICAgICAgQ1hYRkxBR1NfSkRLTElCX0VYVFJBPSIke0NYWEZMQUdTX0pES0xJQl9FWFRSQX0gLXhyZWdzPW5vJWFwcGwiCiAgICAgICAgICAgICBDX09fRkxBR19ISUdIRVNUPSIteE80IC1XYywtUXJtLXMgLVdjLC1RaXNlbGVjdC1UMCAkQ0NfSElHSEVTVCAteHByZWZldGNoPWF1dG8sZXhwbGljaXQgLXhjaGlwPXVsdHJhIgpAQCAtNzU5LDcgKzgwMSw3IEBACiAgICAgICAgICAgQ0NYWEZMQUdTX0pESz0iJENDWFhGTEFHUyAkQ0NYWEZMQUdTX0pESyAtRFRSQUNJTkcgLURNQUNST19NRU1TWVNfT1BTIC1EQlJFQUtQVFMiCiAgICAgICAgICAgY2FzZSAkT1BFTkpES19UQVJHRVRfQ1BVX0FSQ0ggaW4KICAgICAgICAgICB4ODYgKQotICAgICAgICAgICAgQ0NYWEZMQUdTX0pESz0iJENDWFhGTEFHU19KREsgLURjcHVJbnRlbCAtRGk1ODYgLURpMzg2IgorICAgICAgICAgICAgQ0NYWEZMQUdTX0pESz0iJENDWFhGTEFHU19KREsgLURjcHVJbnRlbCAtRGk1ODYgLUQkT1BFTkpES19UQVJHRVRfQ1BVX0xFR0FDWV9MSUIiCiAgICAgICAgCSAgICBDRkxBR1NfSkRLPSIkQ0ZMQUdTX0pESyAtZXJyb2ZmPUVfQkFEX1BSQUdNQV9QQUNLX1ZBTFVFIgogICAgICAgICAgIDs7CiAgICAgICAgICAgZXNhYwpAQCAtODU5LDcgKzkwMSw3IEBACiAjIGxpYnJhcmllcyB3aWxsIGxpbmsgdG8gd2hhdGV2ZXIgaXMgaW4gbWVtb3J5LiBZdWNrLiAKICMKICMgVGh1cyB3ZSBvZmZlciB0aGUgY29tcGlsZXIgdG8gZmluZCBsaWJqdm0uc28gZmlyc3QgaW4gc2VydmVyIHRoZW4gaW4gY2xpZW50LiBJdCB3b3Jrcy4gVWdoLgotaWYgdGVzdCAieCRDT01QSUxFUl9UWVBFIiA9IHhDTDsgdGhlbgoraWYgdGVzdCAieCRDT01QSUxFUl9OQU1FIiA9IHhjbDsgdGhlbgogICAgIExERkxBR1NfSkRLPSIkTERGTEFHU19KREsgLW5vbG9nbyAtb3B0OnJlZiAtaW5jcmVtZW50YWw6bm8iCiAgICAgaWYgdGVzdCAieCRPUEVOSkRLX1RBUkdFVF9DUFUiID0geHg4NjsgdGhlbiAKICAgICAgICAgTERGTEFHU19KREs9IiRMREZMQUdTX0pESyAtc2FmZXNlaCIKQEAgLTg3NSwxOSArOTE3LDIzIEBACiAgICAgZmkKICAgICBMREZMQUdTX0pES0VYRT0iJHtMREZMQUdTX0pES30gL1NUQUNLOiRMREZMQUdTX1NUQUNLX1NJWkUiCiBlbHNlCi0gICAgIyBJZiB0aGlzIGlzIGEgLS1oYXNoLXN0eWxlPWdudSBzeXN0ZW0sIHVzZSAtLWhhc2gtc3R5bGU9Ym90aCwgd2h5PwotICAgIEhBU19HTlVfSEFTSD1gJENDIC1kdW1wc3BlY3MgMj4vZGV2L251bGwgfCAkR1JFUCAnaGFzaC1zdHlsZT1nbnUnYAotICAgIGlmIHRlc3QgLW4gIiRIQVNfR05VX0hBU0giOyB0aGVuCi0gICAgICAgICMgQW5kIHNpbmNlIHdlIG5vdyBrbm93IHRoYXQgdGhlIGxpbmtlciBpcyBnbnUsIHRoZW4gYWRkIC16IGRlZnMsIHRvIGZvcmJpZAotICAgICAgICAjIHVuZGVmaW5lZCBzeW1ib2xzIGluIG9iamVjdCBmaWxlcy4KLSAgICAgICAgTERGTEFHU19KREs9IiR7TERGTEFHU19KREt9IC1YbGlua2VyIC0taGFzaC1zdHlsZT1ib3RoIC1YbGlua2VyIC16IC1YbGlua2VyIGRlZnMiCi0gICAgICAgIGlmIHRlc3QgIngkREVCVUdfTEVWRUwiID09ICJ4cmVsZWFzZSI7IHRoZW4KLSAgICAgICAgICAgICMgV2hlbiBidWlsZGluZyByZWxlYXNlIGxpYnJhcmllcywgdGVsbCB0aGUgbGlua2VyIG9wdGltaXplIHRoZW0uCi0gICAgICAgICAgICAjIFNob3VsZCB0aGlzIGJlIHN1cHBsaWVkIHRvIHRoZSBPU1MgbGlua2VyIGFzIHdlbGw/Ci0gICAgICAgICAgICBMREZMQUdTX0pESz0iJHtMREZMQUdTX0pES30gLVhsaW5rZXIgLU8xIgorICAgIGlmIHRlc3QgIngkQ09NUElMRVJfTkFNRSIgPSB4Z2NjOyB0aGVuCisgICAgICAgICMgSWYgdGhpcyBpcyBhIC0taGFzaC1zdHlsZT1nbnUgc3lzdGVtLCB1c2UgLS1oYXNoLXN0eWxlPWJvdGgsIHdoeT8KKyAgICAgICAgSEFTX0dOVV9IQVNIPWAkQ0MgLWR1bXBzcGVjcyAyPi9kZXYvbnVsbCB8ICRHUkVQICdoYXNoLXN0eWxlPWdudSdgCisgICAgICAgIGlmIHRlc3QgLW4gIiRIQVNfR05VX0hBU0giOyB0aGVuCisgICAgICAgICAgICBMREZMQUdTX0pESz0iJHtMREZMQUdTX0pES30gLVhsaW5rZXIgLS1oYXNoLXN0eWxlPWJvdGggIgorICAgICAgICBmaQorICAgICAgICBpZiB0ZXN0ICJ4JE9QRU5KREtfVEFSR0VUX09TIiA9IHhsaW51eDsgdGhlbiAKKyAgICAgICAgICAjIEFuZCBzaW5jZSB3ZSBub3cga25vdyB0aGF0IHRoZSBsaW5rZXIgaXMgZ251LCB0aGVuIGFkZCAteiBkZWZzLCB0byBmb3JiaWQKKyAgICAgICAgICAjIHVuZGVmaW5lZCBzeW1ib2xzIGluIG9iamVjdCBmaWxlcy4KKyAgICAgICAgICBMREZMQUdTX0pESz0iJHtMREZMQUdTX0pES30gLVhsaW5rZXIgLXogLVhsaW5rZXIgZGVmcyIKKyAgICAgICAgICBpZiB0ZXN0ICJ4JERFQlVHX0xFVkVMIiA9ICJ4cmVsZWFzZSI7IHRoZW4KKyAgICAgICAgICAgICAgIyBXaGVuIGJ1aWxkaW5nIHJlbGVhc2UgbGlicmFyaWVzLCB0ZWxsIHRoZSBsaW5rZXIgb3B0aW1pemUgdGhlbS4KKyAgICAgICAgICAgICAgIyBTaG91bGQgdGhpcyBiZSBzdXBwbGllZCB0byB0aGUgT1NTIGxpbmtlciBhcyB3ZWxsPworICAgICAgICAgICAgICBMREZMQUdTX0pESz0iJHtMREZMQUdTX0pES30gLVhsaW5rZXIgLU8xIgorICAgICAgICAgIGZpCiAgICAgICAgIGZpCiAgICAgZmkKLQogICAgIExERkxBR1NfSkRLTElCPSIke0xERkxBR1NfSkRLfSAkU0hBUkVEX0xJQlJBUllfRkxBR1MgXAogICAgICAgICAgICAgICAgICAgICAtTCR7SkRLX09VVFBVVERJUn0vbGliJHtPUEVOSkRLX1RBUkdFVF9DUFVfTElCRElSfS9zZXJ2ZXIgXAogICAgICAgICAgICAgICAgICAgICAtTCR7SkRLX09VVFBVVERJUn0vbGliJHtPUEVOSkRLX1RBUkdFVF9DUFVfTElCRElSfS9jbGllbnQgXApkaWZmIC0tZ2l0IGEvY29tbW9uL2F1dG9jb25mL3Rvb2xjaGFpbl93aW5kb3dzLm00IGIvY29tbW9uL2F1dG9jb25mL3Rvb2xjaGFpbl93aW5kb3dzLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwMzRkZWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vYXV0b2NvbmYvdG9vbGNoYWluX3dpbmRvd3MubTQKQEAgLTAsMCArMSwyNTggQEAKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDExLCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisjCisjIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcworIyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisjIGJ5IE9yYWNsZSBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorIworIyBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisjIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorIyBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisjIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorIworIyBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQorIyBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CisjIHF1ZXN0aW9ucy4KKyMKKworQUNfREVGVU4oW1RPT0xDSEFJTl9DSEVDS19QT1NTSUJMRV9WSVNVQUxfU1RVRElPX1JPT1RdLAorWworICBpZiB0ZXN0ICJ4JFZTX0VOVl9DTUQiID0geDsgdGhlbgorICAgIFZTMTAwQkFTRT0iJDEiCisgICAgTUVUSE9EPSIkMiIKKyAgICBCQVNJQ19XSU5ET1dTX1JFV1JJVEVfQVNfVU5JWF9QQVRIKFZTMTAwQkFTRSkKKyAgICBpZiB0ZXN0IC1kICIkVlMxMDBCQVNFIjsgdGhlbgorICAgICAgaWYgdGVzdCAtZiAiJFZTMTAwQkFTRS8kVkNWQVJTRklMRSI7IHRoZW4KKyAgICAgICAgQUNfTVNHX05PVElDRShbRm91bmQgVmlzdWFsIFN0dWRpbyBpbnN0YWxsYXRpb24gYXQgJFZTMTAwQkFTRSB1c2luZyAkTUVUSE9EXSkKKyAgICAgICAgVlNfRU5WX0NNRD0iJFZTMTAwQkFTRS8kVkNWQVJTRklMRSIKKyAgICAgIGVsc2UKKyAgICAgICAgQUNfTVNHX05PVElDRShbRm91bmQgVmlzdWFsIFN0dWRpbyBpbnN0YWxsYXRpb24gYXQgJFZTMTAwQkFTRSB1c2luZyAkTUVUSE9EXSkKKyAgICAgICAgQUNfTVNHX05PVElDRShbV2FybmluZzogJFZDVkFSU0ZJTEUgaXMgbWlzc2luZywgdGhpcyBpcyBwcm9iYWJseSBWaXN1YWwgU3R1ZGlvIEV4cHJlc3MuIElnbm9yaW5nXSkKKyAgICAgIGZpCisgICAgZmkKKyAgZmkKK10pCisKK0FDX0RFRlVOKFtUT09MQ0hBSU5fQ0hFQ0tfUE9TU0lCTEVfV0lOX1NES19ST09UXSwKK1sKKyAgaWYgdGVzdCAieCRWU19FTlZfQ01EIiA9IHg7IHRoZW4KKyAgICBXSU5fU0RLX0JBU0U9IiQxIgorICAgIE1FVEhPRD0iJDIiCisgICAgQkFTSUNfV0lORE9XU19SRVdSSVRFX0FTX1VOSVhfUEFUSChXSU5fU0RLX0JBU0UpCisgICAgaWYgdGVzdCAtZCAiJFdJTl9TREtfQkFTRSI7IHRoZW4KKyAgICAgIGlmIHRlc3QgLWYgIiRXSU5fU0RLX0JBU0UvU2V0RW52LkNtZCI7IHRoZW4KKyAgICAgICAgQUNfTVNHX05PVElDRShbRm91bmQgV2luZG93cyBTREsgaW5zdGFsbGF0aW9uIGF0ICRXSU5fU0RLX0JBU0UgdXNpbmcgJE1FVEhPRF0pCisgICAgICAgIFZTX0VOVl9DTUQ9IiRXSU5fU0RLX0JBU0UvU2V0RW52LkNtZCIKKyAgICAgICAgaWYgdGVzdCAieCRPUEVOSkRLX1RBUkdFVF9DUFVfQklUUyIgPSB4MzI7IHRoZW4KKyAgICAgICAgICBWU19FTlZfQVJHUz0iL3g4NiIKKyAgICAgICAgZWxzZQorICAgICAgICAgIFZTX0VOVl9BUkdTPSIveDY0IgorICAgICAgICBmaQorICAgICAgZWxzZQorICAgICAgICBBQ19NU0dfTk9USUNFKFtGb3VuZCBXaW5kb3dzIFNESyBpbnN0YWxsYXRpb24gYXQgJFdJTl9TREtfQkFTRSB1c2luZyAkTUVUSE9EXSkKKyAgICAgICAgQUNfTVNHX05PVElDRShbV2FybmluZzogSW5zdGFsbGF0aW9uIGlzIGJyb2tlbiwgU2V0RW52LkNtZCBpcyBtaXNzaW5nLiBJZ25vcmluZ10pCisgICAgICBmaQorICAgIGZpCisgIGZpCitdKQorCitBQ19ERUZVTihbVE9PTENIQUlOX0ZJTkRfVklTVUFMX1NUVURJT19CQVRfRklMRV0sCitbCisgIGlmIHRlc3QgIngkT1BFTkpES19UQVJHRVRfQ1BVX0JJVFMiID0geDMyOyB0aGVuCisgICAgVkNWQVJTRklMRT0idmMvYmluL3ZjdmFyczMyLmJhdCIKKyAgZWxzZQorICAgIFZDVkFSU0ZJTEU9InZjL2Jpbi9hbWQ2NC92Y3ZhcnM2NC5iYXQiCisgIGZpIAorCisgIFZTX0VOVl9DTUQ9IiIKKyAgVlNfRU5WX0FSR1M9IiIKKyAgaWYgdGVzdCAieCR3aXRoX3Rvb2xzZGlyIiAhPSB4OyB0aGVuCisgICAgVE9PTENIQUlOX0NIRUNLX1BPU1NJQkxFX1ZJU1VBTF9TVFVESU9fUk9PVChbJHdpdGhfdG9vbHNkaXIvLi4vLi5dLCBbLS13aXRoLXRvb2xzLWRpcl0pCisgIGZpCisKKyAgaWYgdGVzdCAieCR3aXRoX3Rvb2xzZGlyIiAhPSB4ICYmIHRlc3QgIngkVlNfRU5WX0NNRCIgPSB4OyB0aGVuCisgICAgIyBIYXZpbmcgc3BlY2lmaWVkIGFuIGFyZ3VtZW50IHdoaWNoIGlzIGluY29ycmVjdCB3aWxsIHByb2R1Y2UgYW4gaW5zdGFudCBmYWlsdXJlOworICAgICMgd2Ugc2hvdWxkIG5vdCBnbyBvbiBsb29raW5nCisgICAgQUNfTVNHX05PVElDRShbVGhlIHBhdGggZ2l2ZW4gYnkgLS13aXRoLXRvb2xzLWRpciBkb2VzIG5vdCBjb250YWluIGEgdmFsaWQgVmlzdWFsIFN0dWRpbyBpbnN0YWxsYXRpb25dKQorICAgIEFDX01TR19OT1RJQ0UoW1BsZWFzZSBwb2ludCB0byB0aGUgVkMvYmluIGRpcmVjdG9yeSB3aXRoaW4gdGhlIFZpc3VhbCBTdHVkaW8gaW5zdGFsbGF0aW9uXSkKKyAgICBBQ19NU0dfRVJST1IoW0Nhbm5vdCBsb2NhdGUgYSB2YWxpZCBWaXN1YWwgU3R1ZGlvIGluc3RhbGxhdGlvbl0pCisgIGZpICAKKworICBpZiB0ZXN0ICJ4JFByb2dyYW1XNjQzMiIgIT0geDsgdGhlbgorICAgIFRPT0xDSEFJTl9DSEVDS19QT1NTSUJMRV9XSU5fU0RLX1JPT1QoWyRQcm9ncmFtVzY0MzIvTWljcm9zb2Z0IFNES3MvV2luZG93cy92Ny4xL0Jpbl0sIFt3ZWxsLWtub3duIG5hbWVdKQorICBmaQorICBpZiB0ZXN0ICJ4JFBST0dSQU1XNjQzMiIgIT0geDsgdGhlbgorICAgIFRPT0xDSEFJTl9DSEVDS19QT1NTSUJMRV9XSU5fU0RLX1JPT1QoWyRQUk9HUkFNVzY0MzIvTWljcm9zb2Z0IFNES3MvV2luZG93cy92Ny4xL0Jpbl0sIFt3ZWxsLWtub3duIG5hbWVdKQorICBmaQorICBpZiB0ZXN0ICJ4JFBST0dSQU1GSUxFUyIgIT0geDsgdGhlbgorICAgIFRPT0xDSEFJTl9DSEVDS19QT1NTSUJMRV9XSU5fU0RLX1JPT1QoWyRQUk9HUkFNRklMRVMvTWljcm9zb2Z0IFNES3MvV2luZG93cy92Ny4xL0Jpbl0sIFt3ZWxsLWtub3duIG5hbWVdKQorICBmaQorICBUT09MQ0hBSU5fQ0hFQ0tfUE9TU0lCTEVfV0lOX1NES19ST09UKFtDOi9Qcm9ncmFtIEZpbGVzL01pY3Jvc29mdCBTREtzL1dpbmRvd3MvdjcuMS9CaW5dLCBbd2VsbC1rbm93biBuYW1lXSkKKyAgVE9PTENIQUlOX0NIRUNLX1BPU1NJQkxFX1dJTl9TREtfUk9PVChbQzovUHJvZ3JhbSBGaWxlcyAoeDg2KS9NaWNyb3NvZnQgU0RLcy9XaW5kb3dzL3Y3LjEvQmluXSwgW3dlbGwta25vd24gbmFtZV0pCisKKyAgaWYgdGVzdCAieCRWUzEwMENPTU5UT09MUyIgIT0geDsgdGhlbgorICAgIFRPT0xDSEFJTl9DSEVDS19QT1NTSUJMRV9WSVNVQUxfU1RVRElPX1JPT1QoWyRWUzEwMENPTU5UT09MUy8uLi8uLl0sIFtWUzEwMENPTU5UT09MUyB2YXJpYWJsZV0pCisgIGZpCisgIGlmIHRlc3QgIngkUFJPR1JBTUZJTEVTIiAhPSB4OyB0aGVuCisgICAgVE9PTENIQUlOX0NIRUNLX1BPU1NJQkxFX1ZJU1VBTF9TVFVESU9fUk9PVChbJFBST0dSQU1GSUxFUy9NaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyAxMC4wXSwgW3dlbGwta25vd24gbmFtZV0pCisgIGZpCisgIFRPT0xDSEFJTl9DSEVDS19QT1NTSUJMRV9WSVNVQUxfU1RVRElPX1JPT1QoW0M6L1Byb2dyYW0gRmlsZXMvTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gMTAuMF0sIFt3ZWxsLWtub3duIG5hbWVdKQorICBUT09MQ0hBSU5fQ0hFQ0tfUE9TU0lCTEVfVklTVUFMX1NUVURJT19ST09UKFtDOi9Qcm9ncmFtIEZpbGVzICh4ODYpL01pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIDEwLjBdLCBbd2VsbC1rbm93biBuYW1lXSkKK10pCisKKyMgQ2hlY2sgaWYgdGhlIFZTIGVudiB2YXJpYWJsZXMgd2VyZSBzZXR1cCBwcmlvciB0byBydW5uaW5nIGNvbmZpZ3VyZS4KKyMgSWYgbm90LCB0aGVuIGZpbmQgdmN2YXJzYWxsLmJhdCBhbmQgcnVuIGl0IGF1dG9tYXRpY2FsbHksIGFuZCBpbnRlZ3JhdGUKKyMgdGhlIHNldCBlbnYgdmFyaWFibGVzIGludG8gdGhlIHNwZWMgZmlsZS4KK0FDX0RFRlVOKFtUT09MQ0hBSU5fU0VUVVBfVklTVUFMX1NUVURJT19FTlZdLAorWworICAjIFN0b3JlIHBhdGggdG8gY3lnd2luIGxpbmsuZXhlIHRvIGhlbHAgZXhjbHVkaW5nIGl0IHdoZW4gc2VhcmNoaW5nIGZvciAKKyAgIyBWUyBsaW5rZXIuIFRoaXMgbXVzdCBiZSBkb25lIGJlZm9yZSBjaGFuZ2luZyB0aGUgUEFUSCB3aGVuIGxvb2tpbmcgZm9yIFZTLgorICBBQ19QQVRIX1BST0coQ1lHV0lOX0xJTkssIGxpbmspCisgIGlmIHRlc3QgIngkQ1lHV0lOX0xJTksiICE9IHg7IHRoZW4KKyAgICBBQ19NU0dfQ0hFQ0tJTkcoW2lmIHRoZSBmaXJzdCBmb3VuZCBsaW5rLmV4ZSBpcyBhY3R1YWxseSB0aGUgQ3lnd2luIGxpbmsgdG9vbF0pCisgICAgIiRDWUdXSU5fTElOSyIgLS12ZXJzaW9uID4gL2Rldi9udWxsCisgICAgaWYgdGVzdCAkPyAtZXEgMCA7IHRoZW4KKyAgICAgIEFDX01TR19SRVNVTFQoW3llc10pCisgICAgZWxzZQorICAgICAgQUNfTVNHX1JFU1VMVChbbm9dKQorICAgICAgIyBUaGlzIG1pZ2h0IGJlIHRoZSBWUyBsaW5rZXIuIERvbid0IGV4Y2x1ZGUgaXQgbGF0ZXIgb24uCisgICAgICBDWUdXSU5fTElOSz0iIgorICAgIGZpCisgIGZpCisKKyAgIyBGaXJzdC1oYW5kIGNob2ljZSBpcyB0byBsb2NhdGUgYW5kIHJ1biB0aGUgdnN2YXJzIGJhdCBmaWxlLgorICBUT09MQ0hBSU5fRklORF9WSVNVQUxfU1RVRElPX0JBVF9GSUxFCisgIGlmIHRlc3QgIngkVlNfRU5WX0NNRCIgIT0geDsgdGhlbgorICAgICMgV2UgaGF2ZSBmb3VuZCBhIFZpc3VhbCBTdHVkaW8gZW52aXJvbm1lbnQgb24gZGlzaywgbGV0J3MgZXh0cmFjdCB2YXJpYWJsZXMgZnJvbSB0aGUgdnN2YXJzIGJhdCBmaWxlLgorICAgIEJBU0lDX0ZJWFVQX0VYRUNVVEFCTEUoVlNfRU5WX0NNRCkKKworICAgICMgTGV0cyBleHRyYWN0IHRoZSB2YXJpYWJsZXMgdGhhdCBhcmUgc2V0IGJ5IHZjdmFyc2FsbC5iYXQvdnN2YXJzMzIuYmF0L3ZzdmFyczY0LmJhdAorICAgIEFDX01TR19OT1RJQ0UoW1RyeWluZyB0byBleHRyYWN0IFZpc3VhbCBTdHVkaW8gZW52aXJvbm1lbnQgdmFyaWFibGVzXSkKKyAgICBjZCAkT1VUUFVUX1JPT1QKKyAgICAjIEZJWE1FOiBUaGUgY29kZSBiZXR3ZWVlbiAtLS0tIHdhcyBpbmxpbmVkIGZyb20gYSBzZXBhcmF0ZSBzY3JpcHQgYW5kIGlzIG5vdCBwcm9wZXJseSBhZGFwdGVkCisgICAgIyB0byBhdXRvY29uZiBzdGFuZGFyZHMuCisKKyAgICAjLS0tLQorCisgICAgIyBDYW5ub3QgdXNlIHRoZSBWUzEwIHNldHVwIHNjcmlwdCBkaXJlY3RseSAoc2luY2UgaXQgb25seSB1cGRhdGVzIHRoZSBET1Mgc3Vic2hlbGwgZW52aXJvbm1lbnQpCisgICAgIyBidXQgY2FsY3VsYXRlIHRoZSBkaWZmZXJlbmNlIGluIEN5Z3dpbiBlbnZpcm9ubWVudCBiZWZvcmUvYWZ0ZXIgcnVubmluZyBpdCBhbmQgdGhlbgorICAgICMgYXBwbHkgdGhlIGRpZmYuCisKKyAgICBpZiB0ZXN0ICJ4JE9QRU5KREtfQlVJTERfT1NfRU5WIiA9IHh3aW5kb3dzLmN5Z3dpbjsgdGhlbgorICAgICAgX3ZzMTB2YXJzYWxsPWBjeWdwYXRoIC1hIC1tIC1zICIkVlNfRU5WX0NNRCJgCisgICAgICBfZG9zdnMxMHZhcnNhbGw9YGN5Z3BhdGggLWEgLXcgLXMgJF92czEwdmFyc2FsbGAKKyAgICAgIF9kb3NiYXNoPWBjeWdwYXRoIC1hIC13IC1zIFxgd2hpY2ggYmFzaFxgLipgCisgICAgZWxzZQorICAgICAgX2Rvc3ZzMTB2YXJzYWxsPWBjbWQgLy9jIGVjaG8gJFZTX0VOVl9DTURgCisgICAgICBfZG9zYmFzaD1gY21kIC8vYyBlY2hvIFxgd2hpY2ggYmFzaFxgYAorICAgIGZpCisKKyAgICAjIGdlbmVyYXRlIHRoZSBzZXQgb2YgZXhwb3J0ZWQgdmFycyBiZWZvcmUvYWZ0ZXIgdGhlIHZzMTAgc2V0dXAKKyAgICAkRUNITyAiQGVjaG8gb2ZmIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+ICBsb2NhbGRldmVudnRtcC5iYXQKKyAgICAkRUNITyAiJF9kb3NiYXNoIC1jIFwiZXhwb3J0IC1wXCIgPiBsb2NhbGRldmVudnRtcC5leHBvcnQwIiA+PiBsb2NhbGRldmVudnRtcC5iYXQKKyAgICAkRUNITyAiY2FsbCAkX2Rvc3ZzMTB2YXJzYWxsICRWU19FTlZfQVJHUyIgICAgICAgICAgICAgICAgICA+PiBsb2NhbGRldmVudnRtcC5iYXQKKyAgICAkRUNITyAiJF9kb3NiYXNoIC1jIFwiZXhwb3J0IC1wXCIgPiBsb2NhbGRldmVudnRtcC5leHBvcnQxIiA+PiBsb2NhbGRldmVudnRtcC5iYXQKKworICAgICMgTm93IGV4ZWN1dGUgdGhlIG5ld2x5IGNyZWF0ZWQgYmF0IGZpbGUuCisgICAgIyBUaGUgfCBjYXQgaXMgdG8gc3RvcCBTZXRFbnYuQ21kIHRvIG1lc3Mgd2l0aCBzeXN0ZW0gY29sb3JzIG9uIG1zeXMKKyAgICBjbWQgL2MgbG9jYWxkZXZlbnZ0bXAuYmF0IHwgY2F0CisKKyAgICAjIGFwcGx5IHRoZSBkaWZmIChsZXNzIHNvbWUgbm9uLXZzMTAgdmFycyBuYW1lZCBieSAiISIpCisgICAgJFNPUlQgbG9jYWxkZXZlbnZ0bXAuZXhwb3J0MCB8ICRHUkVQIC12ICIhIiA+IGxvY2FsZGV2ZW52dG1wLmV4cG9ydDAuc29ydAorICAgICRTT1JUIGxvY2FsZGV2ZW52dG1wLmV4cG9ydDEgfCAkR1JFUCAtdiAiISIgPiBsb2NhbGRldmVudnRtcC5leHBvcnQxLnNvcnQKKyAgICAkQ09NTSAtMSAtMyBsb2NhbGRldmVudnRtcC5leHBvcnQwLnNvcnQgbG9jYWxkZXZlbnZ0bXAuZXhwb3J0MS5zb3J0ID4gbG9jYWxkZXZlbnYuc2gKKworICAgICMgY2xlYW51cAorICAgICRSTSBsb2NhbGRldmVudnRtcCoKKyAgICAjLS0tLQorICAgIGNkICRDVVJESVIKKyAgICBpZiB0ZXN0ICEgLXMgJE9VVFBVVF9ST09UL2xvY2FsZGV2ZW52LnNoOyB0aGVuCisgICAgICBBQ19NU0dfUkVTVUxUKFtub10pCisgICAgICBBQ19NU0dfTk9USUNFKFtDb3VsZCBub3Qgc3VjY2VzZnVsbHkgZXh0cmFjdCB0aGUgZW52aW9ubWVudCB2YXJpYWJsZXMgbmVlZGVkIGZvciB0aGUgVlMgc2V0dXAuXSkKKyAgICAgIEFDX01TR19OT1RJQ0UoW1RyeSBzZXR0aW5nIC0td2l0aC10b29scy1kaXIgdG8gdGhlIFZDL2JpbiBkaXJlY3Rvcnkgd2l0aGluIHRoZSBWUyBpbnN0YWxsYXRpb25dKQorICAgICAgQUNfTVNHX05PVElDRShbb3IgcnVuICJiYXNoLmV4ZSAtbCIgZnJvbSBhIFZTIGNvbW1hbmQgcHJvbXB0IGFuZCB0aGVuIHJ1biBjb25maWd1cmUgZnJvbSB0aGVyZS5dKQorICAgICAgQUNfTVNHX0VSUk9SKFtDYW5ub3QgY29udGludWVdKQorICAgIGZpCisKKyAgICAjIE5vdyBzZXQgYWxsIHBhdGhzIGFuZCBvdGhlciBlbnYgdmFyaWFibGVzLiBUaGlzIHdpbGwgYWxsb3cgdGhlIHJlc3Qgb2YgCisgICAgIyB0aGUgY29uZmlndXJlIHNjcmlwdCB0byBmaW5kIGFuZCBydW4gdGhlIGNvbXBpbGVyIGluIHRoZSBwcm9wZXIgd2F5LgorICAgIEFDX01TR19OT1RJQ0UoW1NldHRpbmcgZXh0cmFjdGVkIGVudmlyb25tZW50IHZhcmlhYmxlc10pCisgICAgLiAkT1VUUFVUX1JPT1QvbG9jYWxkZXZlbnYuc2gKKyAgZWxzZQorICAgICMgV2UgZGlkIG5vdCBmaW5kIGEgdnN2YXJzIGJhdCBmaWxlLCBsZXQncyBob3BlIHdlIGFyZSBydW4gZnJvbSBhIFZTIGNvbW1hbmQgcHJvbXB0LgorICAgIEFDX01TR19OT1RJQ0UoW0Nhbm5vdCBsb2NhdGUgYSB2YWxpZCBWaXN1YWwgU3R1ZGlvIGluc3RhbGxhdGlvbiwgY2hlY2tpbmcgY3VycmVudCBlbnZpcm9ubWVudF0pCisgIGZpCisKKyAgIyBBdCB0aGlzIHBvaW50LCB3ZSBzaG91bGQgaGF2ZSBjb3JyZW50IHZhcmlhYmxlcyBpbiB0aGUgZW52aXJvbm1lbnQsIG9yIHdlIGNhbid0IGNvbnRpbnVlLgorICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBWaXN1YWwgU3R1ZGlvIHZhcmlhYmxlc10pCisgIAorICBpZiB0ZXN0ICJ4JFZDSU5TVEFMTERJUiIgIT0geCB8fCB0ZXN0ICJ4JFdpbmRvd3NTREtEaXIiICE9IHggfHwgdGVzdCAieCRXSU5ET1dTU0RLRElSIiAhPSB4OyB0aGVuCisgICAgaWYgdGVzdCAieCRJTkNMVURFIiA9IHggfHwgdGVzdCAieCRMSUIiID0geDsgdGhlbgorICAgICAgQUNfTVNHX1JFU1VMVChbcHJlc2VudCBidXQgYnJva2VuXSkKKyAgICAgIEFDX01TR19FUlJPUihbWW91ciBWQyBjb21tYW5kIHByb21wdCBzZWVtcyBicm9rZW4sIElOQ0xVREUgYW5kL29yIExJQiBpcyBtaXNzaW5nLl0pCisgICAgZWxzZQorICAgICAgQUNfTVNHX1JFU1VMVChbb2tdKQorICAgICAgVlNfSU5DTFVERT0iJElOQ0xVREUiCisgICAgICBWU19MSUI9IiRMSUIiCisgICAgICBWU19QQVRIPSIkUEFUSCIKKyAgICAgIEFDX1NVQlNUKFZTX0lOQ0xVREUpCisgICAgICBBQ19TVUJTVChWU19MSUIpCisgICAgICBBQ19TVUJTVChWU19QQVRIKQorICAgIGZpCisgIGVsc2UKKyAgICBBQ19NU0dfUkVTVUxUKFtub3QgZm91bmRdKQorCisgICAgaWYgdGVzdCAieCRWU19FTlZfQ01EIiA9IHg7IHRoZW4KKyAgICAgIEFDX01TR19OT1RJQ0UoW0Nhbm5vdCBsb2NhdGUgYSB2YWxpZCBWaXN1YWwgU3R1ZGlvIG9yIFdpbmRvd3MgU0RLIGluc3RhbGxhdGlvbiBvbiBkaXNrLF0pCisgICAgICBBQ19NU0dfTk9USUNFKFtub3IgaXMgdGhpcyBzY3JpcHQgcnVuIGZyb20gYSBWaXN1YWwgU3R1ZGlvIGNvbW1hbmQgcHJvbXB0Ll0pCisgICAgZWxzZQorICAgICAgQUNfTVNHX05PVElDRShbUnVubmluZyB0aGUgZXh0cmFjdGlvbiBzY3JpcHQgZmFpbGVkLl0pCisgICAgZmkKKyAgICBBQ19NU0dfTk9USUNFKFtUcnkgc2V0dGluZyAtLXdpdGgtdG9vbHMtZGlyIHRvIHRoZSBWQy9iaW4gZGlyZWN0b3J5IHdpdGhpbiB0aGUgVlMgaW5zdGFsbGF0aW9uXSkKKyAgICBBQ19NU0dfTk9USUNFKFtvciBydW4gImJhc2guZXhlIC1sIiBmcm9tIGEgVlMgY29tbWFuZCBwcm9tcHQgYW5kIHRoZW4gcnVuIGNvbmZpZ3VyZSBmcm9tIHRoZXJlLl0pCisgICAgQUNfTVNHX0VSUk9SKFtDYW5ub3QgY29udGludWVdKQorICBmaQorICAKKyAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgbXN2Y3IxMDAuZGxsXSkKKyAgQUNfQVJHX1dJVEgobXN2Y3ItZGxsLCBbQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1tc3Zjci1kbGxdLAorICAgICAgW2NvcHkgdGhpcyBtc3ZjcjEwMC5kbGwgaW50byB0aGUgYnVpbHQgSkRLIChXaW5kb3dzIG9ubHkpIEA8OkBwcm9iZWRAOj5AXSldKQorICBpZiB0ZXN0ICJ4JHdpdGhfbXN2Y3JfZGxsIiAhPSB4OyB0aGVuCisgICAgTVNWQ1JfRExMPSIkd2l0aF9tc3Zjcl9kbGwiCisgIGVsc2UKKyAgICBpZiB0ZXN0ICJ4JFZDSU5TVEFMTERJUiIgIT0geDsgdGhlbgorICAgICAgaWYgdGVzdCAieCRPUEVOSkRLX1RBUkdFVF9DUFVfQklUUyIgPSB4NjQ7IHRoZW4KKyAgICAgICAgTVNWQ1JfRExMPWBmaW5kICIkVkNJTlNUQUxMRElSIiAtbmFtZSBtc3ZjcjEwMC5kbGwgfCBncmVwIHg2NCB8IGhlYWQgLS1saW5lcyAxYAorICAgICAgZWxzZQorICAgICAgICBNU1ZDUl9ETEw9YGZpbmQgIiRWQ0lOU1RBTExESVIiIC1uYW1lIG1zdmNyMTAwLmRsbCB8IGdyZXAgeDg2IHwgZ3JlcCAtdiBpYTY0IHwgZ3JlcCAtdiB4NjQgfCBoZWFkIC0tbGluZXMgMWAKKyAgICAgICAgaWYgdGVzdCAieCRNU1ZDUl9ETEwiID0geDsgdGhlbgorICAgICAgICAgIE1TVkNSX0RMTD1gZmluZCAiJFZDSU5TVEFMTERJUiIgLW5hbWUgbXN2Y3IxMDAuZGxsIHwgaGVhZCAtLWxpbmVzIDFgCisgICAgICAgIGZpCisgICAgICBmaQorICAgICAgaWYgdGVzdCAieCRNU1ZDUl9ETEwiICE9IHg7IHRoZW4KKyAgICAgICAgQUNfTVNHX05PVElDRShbbXN2Y3IxMDAuZGxsIGZvdW5kIGluIFZDSU5TVEFMTERJUjogJFZDSU5TVEFMTERJUl0pCisgICAgICBlbHNlCisgICAgICAgIEFDX01TR19OT1RJQ0UoW1dhcm5pbmc6IG1zdmNyMTAwLmRsbCBub3QgZm91bmQgaW4gVkNJTlNUQUxMRElSOiAkVkNJTlNUQUxMRElSXSkKKyAgICAgIGZpCisgICAgZmkKKyAgICBpZiB0ZXN0ICJ4JE1TVkNSX0RMTCIgPSB4OyB0aGVuCisgICAgICBpZiB0ZXN0IC1mICIkU1lTVEVNUk9PVC9zeXN0ZW0zMi9tc3ZjcjEwMC5kbGwiOyB0aGVuCisgICAgICAgIEFDX01TR19OT1RJQ0UoW21zdmNyMTAwLmRsbCBmb3VuZCBpbiAkU1lTVEVNUk9PVC9zeXN0ZW0zMl0pCisgICAgICAgIE1TVkNSX0RMTD0iJFNZU1RFTVJPT1Qvc3lzdGVtMzIvbXN2Y3IxMDAuZGxsIgorICAgICAgZmkKKyAgICBmaQorICBmaQorICBpZiB0ZXN0ICJ4JE1TVkNSX0RMTCIgPSB4OyB0aGVuCisgICAgQUNfTVNHX1JFU1VMVChbbm9dKQorICAgIEFDX01TR19FUlJPUihbQ291bGQgbm90IGZpbmQgbXN2Y3IxMDAuZGxsICFdKQorICBmaQorICBBQ19NU0dfUkVTVUxUKFskTVNWQ1JfRExMXSkKKyAgQkFTSUNfRklYVVBfUEFUSChNU1ZDUl9ETEwpCitdKQpkaWZmIC0tZ2l0IGEvY29tbW9uL2F1dG9jb25mL3ZlcnNpb24ubnVtYmVycyBiL2NvbW1vbi9hdXRvY29uZi92ZXJzaW9uLm51bWJlcnMKaW5kZXggZmM1NThjMjIuLmYxNzRlZDQgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9hdXRvY29uZi92ZXJzaW9uLm51bWJlcnMKKysrIGIvY29tbW9uL2F1dG9jb25mL3ZlcnNpb24ubnVtYmVycwpAQCAtMzQsMyArMzQsNyBAQAogUFJPRFVDVF9TVUZGSVg9IlJ1bnRpbWUgRW52aXJvbm1lbnQiCiBKREtfUkNfUExBVEZPUk1fTkFNRT1QbGF0Zm9ybQogQ09NUEFOWV9OQU1FPU4vQQorCisjIE1pZ2h0IG5lZWQgYmV0dGVyIG5hbWVzIGZvciB0aGVzZQorTUFDT1NYX0JVTkRMRV9OQU1FX0JBU0U9Ik9wZW5KREsiCitNQUNPU1hfQlVORExFX0lEX0JBU0U9Im5ldC5qYXZhLm9wZW5qZGsiCmRpZmYgLS1naXQgYS9jb21tb24vYmluL2NvbXBhcmUuc2ggYi9jb21tb24vYmluL2NvbXBhcmUuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYzZTgwZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9iaW4vY29tcGFyZS5zaApAQCAtMCwwICsxLDEyMjAgQEAKKyMhL2Jpbi9iYXNoCisjCisjIENvcHlyaWdodCAoYykgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorIworIyBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisjIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorIyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyMgYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorIyAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyMKKyMgUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyMgb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQorIyBxdWVzdGlvbnMuCisjCisKKyMgVGhpcyBzY3JpcHQgaXMgcHJvY2Vzc2VkIGJ5IGNvbmZpZ3VyZSBiZWZvcmUgaXQncyB1c2FibGUuIEl0IGlzIHJ1biBmcm9tIAorIyB0aGUgcm9vdCBvZiB0aGUgYnVpbGQgZGlyZWN0b3J5LgorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIENoZWNrIHRoYXQgd2UgYXJlIHJ1biB2aWEgdGhlIHdyYXBwZXIgZ2VuZXJhdGVkIGJ5IGNvbmZpZ3VyZQoraWYgWyAteiAiJFNSQ19ST09UIiBdOyB0aGVuCisgICAgZWNobyAiRXJyb3I6IFlvdSBtdXN0IHJ1biB0aGlzIHNjcmlwdCB1c2luZyBidWlsZC9bY29uZl0vY29tcGFyZS5zaCIKKyAgICBleGl0IDEKK2ZpCisKK2lmIFsgIiRPUEVOSkRLX1RBUkdFVF9PUyIgPSAibWFjb3N4IiBdOyB0aGVuCisgICAgRlVMTERVTVBfQ01EPSIkT1RPT0wgLXYgLVYgLWggLVggLXQgLWQiCisgICAgTEREX0NNRD0iJE9UT09MIC1MIgorICAgIERJU19DTUQ9IiRPVE9PTCAtdiAtdCIKKyAgICBTVEFUX1BSSU5UX1NJWkU9Ii1mICV6IgorZWxpZiBbICIkT1BFTkpES19UQVJHRVRfT1MiID0gIndpbmRvd3MiIF07IHRoZW4KKyAgICBGVUxMRFVNUF9DTUQ9IiREVU1QQklOIC1hbGwiCisgICAgTEREX0NNRD0iJERVTVBCSU4gLWRlcGVuZGFudHMgfCAkR1JFUCAuZGxsIgorICAgIERJU19DTUQ9IiREVU1QQklOIC1kaXNhc206bm9ieXRlcyIKKyAgICBTVEFUX1BSSU5UX1NJWkU9Ii1jICVzIgorZWxzZQorICAgIEZVTExEVU1QX0NNRD0iJFJFQURFTEYgLWEiCisgICAgTEREX0NNRD0iJExERCIKKyAgICBESVNfQ01EPSIkT0JKRFVNUCAtZCIKKyAgICBTVEFUX1BSSU5UX1NJWkU9Ii1jICVzIgorZmkKKworVU5BUkNISVZFPSIkVU5aSVAgLXEiCisKK0NPTVBBUkVfRVhDRVBUSU9OU19JTkNMVURFPSIkU1JDX1JPT1QvY29tbW9uL2Jpbi9jb21wYXJlX2V4Y2VwdGlvbnMuc2guaW5jbCIKK2lmIFsgISAtZSAiJENPTVBBUkVfRVhDRVBUSU9OU19JTkNMVURFIiBdOyB0aGVuCisgICAgZWNobyAiRXJyb3I6IENhbm5vdCBsb2NhdGUgdGhlIGV4Y2VwdGlvbnMgZmlsZSwgaXQgc2hvdWxkIGhhdmUgYmVlbiBoZXJlOiAkQ09NUEFSRV9FWENFUFRJT05TX0lOQ0xVREUiCisgICAgZXhpdCAxCitmaQorIyBJbmNsdWRlIGV4Y2VwdGlvbiBkZWZpbml0aW9ucworLiAiJENPTVBBUkVfRVhDRVBUSU9OU19JTkNMVURFIgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ29tcGFyZSB0ZXh0IGZpbGVzIGFuZCBpZ25vcmUgc3BlY2lmaWMgZGlmZmVyZW5jZXM6CisjCisjICAqIFRpbWVzdGFtcHMgaW4gSmF2YSBzb3VyY2VzIGdlbmVyYXRlZCBieSBpZGwyamF2YQorIyAgKiBTb3J0aW5nIG9yZGVyIGFuZCBjbGVhbnVwIHN0eWxlIGluIC5wcm9wZXJ0aWVzIGZpbGVzCisKK2RpZmZfdGV4dCgpIHsKKyAgICBPVEhFUl9GSUxFPSQxCisgICAgVEhJU19GSUxFPSQyCisKKyAgICBTVUZGSVg9IiR7VEhJU19GSUxFIyMqLn0iCisKKyAgICBUTVA9MQorCisgICAgaWYgW1sgIiRUSElTX0ZJTEUiID0gKiJNRVRBLUlORi9NQU5JRkVTVC5NRiIgXV07IHRoZW4KKyAgICAgICAgVE1QPSQoTEFORz1DICRESUZGICRPVEhFUl9GSUxFICRUSElTX0ZJTEUgfCBcCisgICAgICAgICAgICAkR1JFUCAnXls8Pl0nIHwgXAorICAgICAgICAgICAgJFNFRCAtZSAnL1s8Pl0gQW50LVZlcnNpb246IEFwYWNoZSBBbnQgLiovZCcgXAorCSAgICAgICAgIC1lICcvWzw+XSBDcmVhdGVkLUJ5OiAuKiAoT3JhY2xlIENvcnBvcmF0aW9uKS4qL2QnKQorICAgIGZpCisgICAgaWYgdGVzdCAieCRTVUZGSVgiID0gInhqYXZhIjsgdGhlbgorICAgICAgICBUTVA9JChMQU5HPUMgJERJRkYgJE9USEVSX0ZJTEUgJFRISVNfRklMRSB8IFwKKyAgICAgICAgICAgICRHUkVQICdeWzw+XScgfCBcCisgICAgICAgICAgICAkU0VEIC1lICcvWzw+XSBcKiBmcm9tLipcLmlkbC9kJyBcCisgICAgICAgICAgICAgICAgIC1lICcvWzw+XSBcKi4qWzAtOV1cezRcfV9bMC05XVx7Mlx9X1swLTldXHsyXH1fWzAtOV1cezJcfV9bMC05XVx7Mlx9LWJbMC05XVx7Mlx9LiovZCcgXAorICAgICAgICAgICAgICAgICAtZSAnL1s8Pl0gXCouKlswLTldXHs0XH0gWzAtOV1bMC05XSo6WzAtOV1cezJcfTpbMC05XVx7Mlx9LiovZCcgXAorICAgICAgICAgICAgICAgICAtZSAnL1wvXC8gR2VuZXJhdGVkIGZyb20gaW5wdXQgZmlsZS4qL2QnIFwKKyAgICAgICAgICAgICAgICAgLWUgJy9cL1wvIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIEFVVE9NQVRJQ0FMTFkgZnJvbSBhIHRlbXBsYXRlIGZpbGUuKi9kJyBcCisgICAgICAgICAgICAgICAgIC1lICcvXC9cLyBqYXZhIEdlbmVyYXRlQ2hhcmFjdGVyLiovZCcpCisgICAgZmkKKyAgICAjIElnbm9yZSBkYXRlIHN0cmluZ3MgaW4gY2xhc3MgZmlsZXMuCisgICAgIyBPbiBNYWNvc3ggdGhlIHN5c3RlbSBzb3VyY2VzIGZvciBnZW5lcmF0ZWQgamF2YSBjbGFzc2VzIHByb2R1Y2UgZGlmZmVyZW50IG91dHB1dCBvbiAKKyAgICAjIGNvbnNlcXV0aXZlIGludm9rYXRpb25zIHNlZW1pbmdseSByYW5kb21seS4KKyAgICAjIEZvciBleGFtcGxlIGEgbWV0aG9kIHBhcmFtZXRlciByYW5kb21seSBuYW1lZCAidGhlUG9pbnQiIG9yICJhUG9pbnQiLiBJZ25vcmUgdGhpcy4KKyAgICBpZiB0ZXN0ICJ4JFNVRkZJWCIgPSAieGNsYXNzIjsgdGhlbgorICAgICAgICAjIFRvIGltcHJvdmUgcGVyZm9ybWFuY2Ugd2hlbiBsYXJnZSBkaWZmcyBhcmUgZm91bmQsIGRvIGEgcm91Z2ggZmlsdGVyaW5nIG9mIGNsYXNzZXMKKyAgICAgICAgIyBlbGliZWJsZSBmb3IgdGhlc2UgZXhjZXB0aW9ucworICAgICAgICBpZiAkR1JFUCAtUiAtZSAnWzAtOV1cezRcfV9bMC05XVx7Mlx9X1swLTldXHsyXH1fWzAtOV1cezJcfV9bMC05XVx7Mlx9LWJbMC05XVx7Mlx9JyAtZSB0aGVQb2ludCAtZSBhUG9pbnQgLWUgc2V0SXRlbXNQdHIgJHtUSElTX0ZJTEV9ID4gL2Rldi9udWxsOyB0aGVuCisgICAgICAgICAgICAkSkFWQVAgLWMgLWNvbnN0YW50cyAtbCAtcCAke09USEVSX0ZJTEV9ID4gICR7T1RIRVJfRklMRX0uamF2YXAKKyAgICAgICAgICAgICRKQVZBUCAtYyAtY29uc3RhbnRzIC1sIC1wICR7VEhJU19GSUxFfSA+ICR7VEhJU19GSUxFfS5qYXZhcAorICAgICAgICAgICAgVE1QPSQoJERJRkYgJHtPVEhFUl9GSUxFfS5qYXZhcCAke1RISVNfRklMRX0uamF2YXAgfCBcCisgICAgICAgICAgICAgICAgJEdSRVAgJ15bPD5dJyB8IFwKKyAgICAgICAgICAgICAgICAkU0VEIC1lICcvWzw+XS4qWzAtOV1cezRcfV9bMC05XVx7Mlx9X1swLTldXHsyXH1fWzAtOV1cezJcfV9bMC05XVx7Mlx9LWJbMC05XVx7Mlx9LiovZCcgXAorIAkgICAgICAgICAgICAgLWUgJy9bPD5dLipQb2ludCAgIExjb21cL2FwcGxlXC9qb2JqY1wvZm91bmRhdGlvblwvTlNQb2ludDsvZCcgXAorCSAgICAgICAgICAgICAtZSAnL1s8Pl0uKnB1YmxpYyBjb21cLmFwcGxlXC5qb2JqY1wuUG9pbnRlcjxjb21cLmFwcGxlXC5qb2JqY1wuLippdGVtc1B0cigpOy9kJyBcCisJICAgICAgICAgICAgIC1lICcvWzw+XS4qcHVibGljIHZvaWQgc2V0SXRlbXNQdHIoY29tXC5hcHBsZVwuam9iamNcLlBvaW50ZXI8Y29tXC5hcHBsZVwuam9iamNcLi4qKTsvZCcpCisgICAgICAgIGZpCisgICAgZmkKKyAgICBpZiB0ZXN0ICJ4JFNVRkZJWCIgPSAieHByb3BlcnRpZXMiOyB0aGVuCisgICAgICAgICRDQVQgJE9USEVSX0ZJTEUgfCAkU0VEIC1lICdzL1woW15cXF1cKTovXDFcXDovZycgLWUgICdzL1woW15cXF1cKT0vXDFcXD0vZycgLWUgJ3MvIy4qLyMvZycgXAorICAgICAgICAgICAgfCAkU0VEIC1mICIkU1JDX1JPT1QvY29tbW9uL21ha2VmaWxlcy9zdXBwb3J0L3VuaWNvZGUyeC5zZWQiIFwKKyAgCSAgICB8ICRTRUQgLWUgJy9eIy9kJyAtZSAnL14kL2QnIFwKKyAgICAgICAgICAgIC1lIDphIC1lICcvXFwkL047IHMvXFxcbi8vOyB0YScgXAorICAJICAgIC1lICdzL15bIFx0XSovLztzL1sgXHRdKiQvLycgXAorCSAgICAtZSAncy9cXD0vPS8nIHwgTEFORz1DICRTT1JUID4gJE9USEVSX0ZJTEUuY2xlYW5lZAorICAgICAgICBUTVA9JChMQU5HPUMgJERJRkYgJE9USEVSX0ZJTEUuY2xlYW5lZCAkVEhJU19GSUxFKQorICAgIGZpCisgICAgaWYgdGVzdCAtbiAiJFRNUCI7IHRoZW4KKyAgICAgICAgZWNobyBGaWxlcyAkT1RIRVJfRklMRSBhbmQgJFRISVNfRklMRSBkaWZmZXIKKyAgICAgICAgcmV0dXJuIDEKKyAgICBmaQorCisgICAgcmV0dXJuIDAKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENvbXBhcmUgZGlyZWN0b3J5IHN0cnVjdHVyZQorCitjb21wYXJlX2RpcnMoKSB7CisgICAgVEhJU19ESVI9JDEKKyAgICBPVEhFUl9ESVI9JDIKKyAgICBXT1JLX0RJUj0kMworCisgICAgbWtkaXIgLXAgJFdPUktfRElSCisKKyAgICAoY2QgJE9USEVSX0RJUiAmJiAkRklORCAuIC10eXBlIGQgfCAkU09SVCA+ICRXT1JLX0RJUi9kaXJzX290aGVyKQorICAgIChjZCAkVEhJU19ESVIgJiYgJEZJTkQgLiAtdHlwZSBkIHwgJFNPUlQgPiAkV09SS19ESVIvZGlyc190aGlzKQorCisgICAgJERJRkYgJFdPUktfRElSL2RpcnNfb3RoZXIgJFdPUktfRElSL2RpcnNfb3RoZXIgPiAkV09SS19ESVIvZGlyc19kaWZmCisgICAgCisgICAgZWNobyAtbiBEaXJlY3Rvcnkgc3RydWN0dXJlLi4uCisgICAgaWYgWyAtcyAkV09SS19ESVIvZGlyc19kaWZmIF07IHRoZW4KKyAgICAgICAgZWNobyBEaWZmZXJlbmNlcyBmb3VuZC4KKyAgICAgICAgUkVHUkVTU0lPTlM9dHJ1ZQorICAgICAgICAjIERpZmZlcmVuY2VzIGluIGRpcmVjdG9yaWVzIGZvdW5kLgorICAgICAgICBPTkxZX09USEVSPSQoJEdSRVAgJzwnICRXT1JLX0RJUi9kaXJzX2RpZmYpCisgICAgICAgIGlmIFsgIiRPTkxZX09USEVSIiBdOyB0aGVuCisgICAgICAgICAgICBlY2hvIE9ubHkgaW4gJE9USEVSCisgICAgICAgICAgICAkR1JFUCAnPCcgJFdPUktfRElSL2RpcnNfZGlmZiB8ICRTRUQgJ3N8PCAuL3wgICAgfGcnCisgICAgICAgIGZpCisgICAgICAgIE9OTFlfVEhJUz0kKCRHUkVQICc+JyAkV09SS19ESVIvZGlyc19kaWZmKQorICAgICAgICBpZiBbICIkT05MWV9USElTIiBdOyB0aGVuCisgICAgICAgICAgICBlY2hvIE9ubHkgaW4gJFRISVMKKyAgICAgICAgICAgICRHUkVQICc+JyAkV09SS19ESVIvZGlyc19kaWZmIHwgJFNFRCAnc3w+IC4vfCAgICB8ZycKKyAgICAgICAgZmkKKyAgICBlbHNlCisgICAgICAgIGVjaG8gSWRlbnRpY2FsIQorICAgIGZpCit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENvbXBhcmUgZmlsZSBzdHJ1Y3R1cmUKKworY29tcGFyZV9maWxlcygpIHsKKyAgICBUSElTX0RJUj0kMQorICAgIE9USEVSX0RJUj0kMgorICAgIFdPUktfRElSPSQzCisKKyAgICAkTUtESVIgLXAgJFdPUktfRElSCisKKyAgICAoY2QgJE9USEVSX0RJUiAmJiAkRklORCAuICEgLXR5cGUgZCB8ICRTT1JUID4gJFdPUktfRElSL2ZpbGVzX290aGVyKQorICAgIChjZCAkVEhJU19ESVIgJiYgJEZJTkQgLiAhIC10eXBlIGQgfCAkU09SVCA+ICRXT1JLX0RJUi9maWxlc190aGlzKQorICAgIAorICAgICRESUZGICRXT1JLX0RJUi9maWxlc19vdGhlciAkV09SS19ESVIvZmlsZXNfdGhpcyA+ICRXT1JLX0RJUi9maWxlc19kaWZmCisKKyAgICBlY2hvIC1uIEZpbGUgbmFtZXMuLi4KKyAgICBpZiBbIC1zICRXT1JLX0RJUi9maWxlc19kaWZmIF07IHRoZW4KKyAgICAgICAgZWNobyBEaWZmZXJlbmNlcyBmb3VuZC4KKyAgICAgICAgUkVHUkVTU0lPTlM9dHJ1ZQorICAgICAgICAjIERpZmZlcmVuY2VzIGluIGZpbGVzIGZvdW5kLgorICAgICAgICBPTkxZX09USEVSPSQoJEdSRVAgJzwnICRXT1JLX0RJUi9maWxlc19kaWZmKQorICAgICAgICBpZiBbICIkT05MWV9PVEhFUiIgXTsgdGhlbgorICAgICAgICAgICAgZWNobyBPbmx5IGluICRPVEhFUgorICAgICAgICAgICAgJEdSRVAgJzwnICRXT1JLX0RJUi9maWxlc19kaWZmIHwgJFNFRCAnc3w8IC4vfCAgICB8ZycKKyAgICAgICAgZmkKKyAgICAgICAgT05MWV9USElTPSQoJEdSRVAgJz4nICRXT1JLX0RJUi9maWxlc19kaWZmKQorICAgICAgICBpZiBbICIkT05MWV9USElTIiBdOyB0aGVuCisgICAgICAgICAgICBlY2hvIE9ubHkgaW4gJFRISVMKKyAgICAgICAgICAgICRHUkVQICc+JyAkV09SS19ESVIvZmlsZXNfZGlmZiB8ICRTRUQgJ3N8PiAuL3wgICAgfGcnCisgICAgICAgIGZpCisgICAgZWxzZQorICAgICAgICBlY2hvIElkZW50aWNhbCEKKyAgICBmaQorfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDb21wYXJlIHBlcm1pc3Npb25zCisKK2NvbXBhcmVfcGVybWlzc2lvbnMoKSB7CisgICAgVEhJU19ESVI9JDEKKyAgICBPVEhFUl9ESVI9JDIKKyAgICBXT1JLX0RJUj0kMworCisgICAgbWtkaXIgLXAgJFdPUktfRElSCisKKyAgICBlY2hvIC1uIFBlcm1pc3Npb25zLi4uCisgICAgZm91bmQ9IiIKKyAgICBmb3IgZiBpbiBgY2QgJE9USEVSX0RJUiAmJiAkRklORCAuIC10eXBlIGZgCisgICAgZG8KKyAgICAgICAgaWYgWyAhIC1mICR7T1RIRVJfRElSfS8kZiBdOyB0aGVuIGNvbnRpbnVlOyBmaQorICAgICAgICBpZiBbICEgLWYgJHtUSElTX0RJUn0vJGYgXTsgdGhlbiBjb250aW51ZTsgZmkKKyAgICAgICAgT1A9YGxzIC1sICR7T1RIRVJfRElSfS8kZiB8IGF3ayAne3ByaW50ZigiJS4xMHNcbiIsICQxKTt9J2AKKyAgICAgICAgVFA9YGxzIC1sICR7VEhJU19ESVJ9LyRmIHwgYXdrICd7cHJpbnRmKCIlLjEwc1xuIiwgJDEpO30nYAorICAgICAgICBpZiBbICIkT1AiICE9ICIkVFAiIF0KKyAgICAgICAgdGhlbgorCSAgICBpZiBbIC16ICIkZm91bmQiIF07IHRoZW4gZWNobyA7IGZvdW5kPSJ5ZXMiOyBmaQorCSAgICAkUFJJTlRGICJcdG9sZDogJHtPUH0gbmV3OiAke1RQfVx0JGZcbiIKKyAgICAgICAgZmkKKyAgICBkb25lCisgICAgaWYgWyAteiAiJGZvdW5kIiBdOyB0aGVuIAorICAgICAgICBlY2hvICJJZGVudGljYWwhIgorICAgIGVsc2UKKyAgICAgICAgUkVHUkVTU0lPTlM9dHJ1ZQorICAgIGZpCit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDb21wYXJlIGZpbGUgY29tbWFuZCBvdXRwdXQKKworY29tcGFyZV9maWxlX3R5cGVzKCkgeworICAgIFRISVNfRElSPSQxCisgICAgT1RIRVJfRElSPSQyCisgICAgV09SS19ESVI9JDMKKworICAgICRNS0RJUiAtcCAkV09SS19ESVIKKworICAgIGVjaG8gLW4gRmlsZSB0eXBlcy4uLgorICAgIGZvdW5kPSIiCisgICAgZm9yIGYgaW4gYGNkICRPVEhFUl9ESVIgJiYgJEZJTkQgLiAhIC10eXBlIGRgCisgICAgZG8KKyAgICAgICAgaWYgWyAhIC1mICR7T1RIRVJfRElSfS8kZiBdOyB0aGVuIGNvbnRpbnVlOyBmaQorICAgICAgICBpZiBbICEgLWYgJHtUSElTX0RJUn0vJGYgXTsgdGhlbiBjb250aW51ZTsgZmkKKyAgICAgICAgT0Y9YGNkICR7T1RIRVJfRElSfSAmJiAkRklMRSAtaCAkZmAKKyAgICAgICAgVEY9YGNkICR7VEhJU19ESVJ9ICYmICRGSUxFIC1oICRmYAorICAgICAgICBpZiBbICIkZiIgPSAiLi9zcmMuemlwIiBdIHx8IFtbICIkZiIgPSAqIi9Ib21lL3NyYy56aXAiIF1dIHx8IFtbICIkZiIgPSAqIi9saWIvSk9iakMuamFyIiBdXQorICAgICAgICB0aGVuCisJICAgIGlmIFsgImBlY2hvICRPRiB8ICRHUkVQIC1pYyB6aXBgIiAtZ3QgMCAtYSAiYGVjaG8gJFRGIHwgJEdSRVAgLWljIHppcGAiIC1ndCAwIF0KKwkgICAgdGhlbgorCSAgICAgICAgIyB0aGUgd2F5IHdlIHByb2R1Y2VzIHppcC1maWxlcyBtYWtlIGl0IHNvIHRoYXQgZGlyZWN0b3JpZXMgYXJlIHN0b3JlZCBpbiBvbGQgZmlsZQorCSAgICAgICAgIyBidXQgbm90IGluIG5ldyAob25seSBmaWxlcyB3aXRoIGZ1bGwtcGF0aCkKKwkgICAgICAgICMgdGhpcyBtYWtlcyBmaWxlLTUuMDkgcmVwb3J0IHRoZW0gYXMgZGlmZmVyZW50CisJICAgICAgICBjb250aW51ZTsKKwkgICAgZmkKKyAgICAgICAgZmkKKyAgICAgICAgCisgICAgICAgIGlmIFsgIiRPRiIgIT0gIiRURiIgXQorICAgICAgICB0aGVuCisJICAgIGlmIFsgLXogIiRmb3VuZCIgXTsgdGhlbiBlY2hvIDsgZm91bmQ9InllcyI7IGZpCisJICAgICRQUklOVEYgIlx0b3RoZXI6ICR7T0Z9XG5cdHRoaXMgOiAke1RGfVxuIgorICAgICAgICBmaQorICAgIGRvbmUKKyAgICBpZiBbIC16ICIkZm91bmQiIF07IHRoZW4gCisgICAgICAgIGVjaG8gIklkZW50aWNhbCEiCisgICAgZWxzZQorICAgICAgICBSRUdSRVNTSU9OUz10cnVlCisgICAgZmkKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENvbXBhcmUgdGhlIHJlc3Qgb2YgdGhlIGZpbGVzCisKK2NvbXBhcmVfZ2VuZXJhbF9maWxlcygpIHsKKyAgICBUSElTX0RJUj0kMQorICAgIE9USEVSX0RJUj0kMgorICAgIFdPUktfRElSPSQzCisgICAgCisgICAgR0VORVJBTF9GSUxFUz0kKGNkICRUSElTX0RJUiAmJiAkRklORCAuIC10eXBlIGYgISAtbmFtZSAiKi5zbyIgISAtbmFtZSAiKi5qYXIiICEgLW5hbWUgIiouemlwIiBcCisgICAgICAgICEgLW5hbWUgIiouZGVidWdpbmZvIiAhIC1uYW1lICIqLmR5bGliIiAhIC1uYW1lICJqZXhlYyIgXAorICAgICAgICAhIC1uYW1lICJjdC5zeW0iICEgLW5hbWUgIiouZGl6IiAhIC1uYW1lICIqLmRsbCIgXAorICAgICAgICAhIC1uYW1lICIqLnBkYiIgISAtbmFtZSAiKi5leHAiICEgLW5hbWUgIiouaWxrIiBcCisgICAgICAgICEgLW5hbWUgIioubGliIiAhIC1uYW1lICIqLndhciIgXAorICAgICAgICB8ICRHUkVQIC12ICIuL2Jpbi8iICB8ICRTT1JUIHwgJEZJTFRFUikKKworICAgIGVjaG8gR2VuZXJhbCBmaWxlcy4uLgorICAgIGZvciBmIGluICRHRU5FUkFMX0ZJTEVTCisgICAgZG8KKyAgICAgICAgaWYgWyAtZSAkT1RIRVJfRElSLyRmIF07IHRoZW4KKyAgICAgICAgICAgIGlmIFsgIiQoYmFzZW5hbWUgJGYpIiA9ICJyZWxlYXNlIiBdOyB0aGVuCisgICAgICAgICAgICAgICAgIyBJZ25vcmUgZGlmZmVyZW5jZXMgaW4gY2hhbmdlIG51bWJlcnMgaW4gcmVsZWFzZSBmaWxlLgorICAgICAgICAgICAgICAgIE9USEVSX0ZJTEU9JFdPUktfRElSLyRmLm90aGVyCisgICAgICAgICAgICAgICAgVEhJU19GSUxFPSRXT1JLX0RJUi8kZi50aGlzCisgICAgICAgICAgICAgICAgJE1LRElSIC1wICQoZGlybmFtZSAkT1RIRVJfRklMRSkKKyAgICAgICAgICAgICAgICAkTUtESVIgLXAgJChkaXJuYW1lICRUSElTX0ZJTEUpCisgICAgICAgICAgICAgICAgJENBVCAkT1RIRVJfRElSLyRmIHwgJFNFRCAncy9cOlswLTlhLWZdXHsxMiwxMlx9LzpDSEFOR0UvZycgPiAkT1RIRVJfRklMRQorICAgICAgICAgICAgICAgICRDQVQgJFRISVNfRElSLyRmICB8ICRTRUQgJ3MvXDpbMC05YS1mXVx7MTIsMTJcfS86Q0hBTkdFL2cnID4gJFRISVNfRklMRQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIE9USEVSX0ZJTEU9JE9USEVSX0RJUi8kZgorICAgICAgICAgICAgICAgIFRISVNfRklMRT0kVEhJU19ESVIvJGYKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgICBESUZGX09VVD0kKCRESUZGICRPVEhFUl9GSUxFICRUSElTX0ZJTEUgMj4mMSkKKyAgICAgICAgICAgIGlmIFsgLW4gIiRESUZGX09VVCIgXTsgdGhlbgorICAgICAgICAgICAgICAgIGVjaG8gJGYKKyAgICAgICAgICAgICAgICBSRUdSRVNTSU9OUz10cnVlCisgICAgICAgICAgICAgICAgaWYgWyAiJFNIT1dfRElGRlMiID0gInRydWUiIF07IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgZWNobyAiJERJRkZfT1VUIgorICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICBmaQorICAgICAgICBmaQorICAgIGRvbmUKKworCit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDb21wYXJlIHppcCBmaWxlCisKK2NvbXBhcmVfemlwX2ZpbGUoKSB7CisgICAgVEhJU19ESVI9JDEKKyAgICBPVEhFUl9ESVI9JDIKKyAgICBXT1JLX0RJUj0kMworICAgIFpJUF9GSUxFPSQ0CisKKyAgICBUSElTX1pJUD0kVEhJU19ESVIvJFpJUF9GSUxFCisgICAgT1RIRVJfWklQPSRPVEhFUl9ESVIvJFpJUF9GSUxFCisKKyAgICBUSElTX1NVRkZJWD0iJHtUSElTX1pJUCMjKi59IgorICAgIE9USEVSX1NVRkZJWD0iJHtPVEhFUl9aSVAjIyoufSIKKyAgICBpZiBbICIkVEhJU19TVUZGSVgiICE9ICIkT1RIRVJfU1VGRklYIiBdOyB0aGVuCisgICAgICAgIGVjaG8gVGhlIGZpbGVzIGRvIG5vdCBoYXZlIHRoZSBzYW1lIHN1ZmZpeCB0eXBlIQorICAgICAgICByZXR1cm4gMgorICAgIGZpCisKKyAgICBUWVBFPSIkVEhJU19TVUZGSVgiCisKKyAgICBpZiAkQ01QICRPVEhFUl9aSVAgJFRISVNfWklQID4gL2Rldi9udWxsCisgICAgdGhlbgorICAgICAgICByZXR1cm4gMAorICAgIGZpCisgICAgIyBOb3QgcXVpdGUgaWRlbnRpY2FsLCB0aGUgbWlnaHQgc3RpbGwgY29udGFpbiB0aGUgc2FtZSBkYXRhLgorICAgICMgVW5wYWNrIHRoZSBqYXIvemlwIGZpbGVzIGluIHRlbXAgZGlycworICAgIAorICAgIFRISVNfVU5aSVBESVI9JFdPUktfRElSLyRaSVBfRklMRS50aGlzCisgICAgT1RIRVJfVU5aSVBESVI9JFdPUktfRElSLyRaSVBfRklMRS5vdGhlcgorICAgICRSTSAtcmYgJFRISVNfVU5aSVBESVIgJE9USEVSX1VOWklQRElSCisgICAgJE1LRElSIC1wICRUSElTX1VOWklQRElSCisgICAgJE1LRElSIC1wICRPVEhFUl9VTlpJUERJUgorICAgIChjZCAkVEhJU19VTlpJUERJUiAmJiAkVU5BUkNISVZFICRUSElTX1pJUCkKKyAgICAoY2QgJE9USEVSX1VOWklQRElSICYmICRVTkFSQ0hJVkUgJE9USEVSX1pJUCkKKworICAgIENPTlRFTlRTX0RJRkZfRklMRT0kV09SS19ESVIvJFpJUF9GSUxFLmRpZmYKKyAgICAjIE9uIHNvbGFyaXMsIHRoZXJlIGlzIG5vIC1xIG9wdGlvbi4KKyAgICBpZiBbICIkT1BFTkpES19UQVJHRVRfT1MiID0gInNvbGFyaXMiIF07IHRoZW4KKyAgICAgICAgTEFORz1DICRESUZGIC1yICRPVEhFUl9VTlpJUERJUiAkVEhJU19VTlpJUERJUiBcCisgICAgICAgICAgICB8ICRHUkVQIC12IC1lICJePCIgLWUgIl4+IiAtZSAiXkNvbW1vbiBzdWJkaXJlY3RvcmllczoiIFwKKyAgICAgICAgICAgID4gJENPTlRFTlRTX0RJRkZfRklMRQorICAgIGVsc2UKKyAgICAgICAgTEFORz1DICRESUZGIC1ycSAkT1RIRVJfVU5aSVBESVIgJFRISVNfVU5aSVBESVIgPiAkQ09OVEVOVFNfRElGRl9GSUxFCisgICAgZmkKKworICAgIE9OTFlfT1RIRVI9JCgkR1JFUCAiXk9ubHkgaW4gJE9USEVSX1VOWklQRElSIiAkQ09OVEVOVFNfRElGRl9GSUxFKQorICAgIE9OTFlfVEhJUz0kKCRHUkVQICJeT25seSBpbiAkVEhJU19VTlpJUERJUiIgJENPTlRFTlRTX0RJRkZfRklMRSkKKworICAgIHJldHVybl92YWx1ZT0wCisKKyAgICBpZiBbIC1uICIkT05MWV9PVEhFUiIgXTsgdGhlbgorICAgICAgICBlY2hvICIgICAgICAgIE9ubHkgT1RIRVIgJFpJUF9GSUxFIGNvbnRhaW5zOiIKKyAgICAgICAgZWNobyAiJE9OTFlfT1RIRVIiIHwgc2VkICJzfE9ubHkgaW4gJE9USEVSX1VOWklQRElSfCAgICAgICAgICAgIHwiZyB8IHNlZCAnc3w6IHwvfGcnCisgICAgICAgIHJldHVybl92YWx1ZT0xCisgICAgZmkKKworICAgIGlmIFsgLW4gIiRPTkxZX1RISVMiIF07IHRoZW4KKyAgICAgICAgZWNobyAiICAgICAgICBPbmx5IFRISVMgJFpJUF9GSUxFIGNvbnRhaW5zOiIKKyAgICAgICAgZWNobyAiJE9OTFlfVEhJUyIgfCBzZWQgInN8T25seSBpbiAkVEhJU19VTlpJUERJUnwgICAgICAgICAgICB8ImcgfCBzZWQgJ3N8OiB8L3xnJworICAgICAgICByZXR1cm5fdmFsdWU9MQorICAgIGZpCisKKyAgICBpZiBbICIkT1BFTkpES19UQVJHRVRfT1MiID0gInNvbGFyaXMiIF07IHRoZW4KKyAgICAgICAgRElGRklOR19GSUxFUz0kKCRHUkVQIC1lICJkaWZmZXIkIiAtZSAiXmRpZmYgIiAkQ09OVEVOVFNfRElGRl9GSUxFIFwKKyAgICAgICAgICAgIHwgJENVVCAtZiAzIC1kICcgJyB8ICRTRUQgInN8JE9USEVSX1VOWklQRElSL3x8ZyIpCisgICAgZWxzZQorICAgICAgICBESUZGSU5HX0ZJTEVTPSQoJEdSRVAgLWUgImRpZmZlciQiICRDT05URU5UU19ESUZGX0ZJTEUgXAorICAgICAgICAgICAgfCAkQ1VUIC1mIDIgLWQgJyAnIHwgJFNFRCAic3wkT1RIRVJfVU5aSVBESVIvfHxnIikKKyAgICBmaQorCisgICAgJFJNIC1mICRXT1JLX0RJUi8kWklQX0ZJTEUuZGlmZnMKKyAgICBmb3IgZmlsZSBpbiAkRElGRklOR19GSUxFUzsgZG8KKwlpZiBbWyAiJEFDQ0VQVEVEX0pBUlpJUF9DT05URU5UUyIgIT0gKiIkZmlsZSIqIF1dOyB0aGVuCisgICAgICAgICAgICBkaWZmX3RleHQgJE9USEVSX1VOWklQRElSLyRmaWxlICRUSElTX1VOWklQRElSLyRmaWxlID4+ICRXT1JLX0RJUi8kWklQX0ZJTEUuZGlmZnMKKwlmaQorICAgIGRvbmUKKworICAgIGlmIFsgLXMgIiRXT1JLX0RJUi8kWklQX0ZJTEUuZGlmZnMiIF07IHRoZW4KKyAgICAgICAgcmV0dXJuX3ZhbHVlPTEKKyAgICAgICAgZWNobyAiICAgICAgICBEaWZmZXJpbmcgZmlsZXMgaW4gJFpJUF9GSUxFIgorICAgICAgICAkQ0FUICRXT1JLX0RJUi8kWklQX0ZJTEUuZGlmZnMgfCAkR1JFUCBkaWZmZXIgfCBjdXQgLWYgMiAtZCAnICcgfCBcCisgICAgICAgICAgICAkU0VEICJzfCRPVEhFUl9VTlpJUERJUnwgICAgICAgICAgICB8ZyIgPiAkV09SS19ESVIvJFpJUF9GSUxFLmRpZmZsaXN0CisgICAgICAgICRDQVQgJFdPUktfRElSLyRaSVBfRklMRS5kaWZmbGlzdAorCisgICAgICAgIGlmIFsgLW4gIiRTSE9XX0RJRkZTIiBdOyB0aGVuCisgICAgICAgICAgICBmb3IgaSBpbiAkKGNhdCAkV09SS19ESVIvJFpJUF9GSUxFLmRpZmZsaXN0KSA7IGRvCisgICAgICAgICAgICAgICAgaWYgWyAtZiAiJHtPVEhFUl9VTlpJUERJUn0vJGkuamF2YXAiIF07IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgTEFORz1DICRESUZGICR7T1RIRVJfVU5aSVBESVJ9LyRpLmphdmFwICR7VEhJU19VTlpJUERJUn0vJGkuamF2YXAKKyAgICAgICAgICAgICAgICBlbGlmIFsgLWYgIiR7T1RIRVJfVU5aSVBESVJ9LyRpLmNsZWFuZWQiIF07IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgTEFORz1DICRESUZGICR7T1RIRVJfVU5aSVBESVJ9LyRpLmNsZWFuZWQgJHtUSElTX1VOWklQRElSfS8kaQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgTEFORz1DICRESUZGICR7T1RIRVJfVU5aSVBESVJ9LyRpICR7VEhJU19VTlpJUERJUn0vJGkKKyAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgZG9uZQorICAgICAgICBmaQorICAgIGZpCisKKyAgICByZXR1cm4gJHJldHVybl92YWx1ZQorfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDb21wYXJlIGFsbCB6aXAgZmlsZXMKKworY29tcGFyZV9hbGxfemlwX2ZpbGVzKCkgeworICAgIFRISVNfRElSPSQxCisgICAgT1RIRVJfRElSPSQyCisgICAgV09SS19ESVI9JDMKKworICAgIFpJUFM9JChjZCAkVEhJU19ESVIgJiYgJEZJTkQgLiAtdHlwZSBmIC1uYW1lICIqLnppcCIgfCAkU09SVCB8ICRGSUxURVIgKQorCisgICAgaWYgWyAtbiAiJFpJUFMiIF07IHRoZW4KKyAgICAgICAgZWNobyBaaXAgZmlsZXMuLi4KKworICAgICAgICByZXR1cm5fdmFsdWU9MAorICAgICAgICBmb3IgZiBpbiAkWklQUzsgZG8KKyAgICAgICAgICAgIGlmIFsgLWYgIiRPVEhFUl9ESVIvJGYiIF07IHRoZW4KKyAgICAgICAgICAgICAgICBjb21wYXJlX3ppcF9maWxlICRUSElTX0RJUiAkT1RIRVJfRElSICRXT1JLX0RJUiAkZgorICAgICAgICAgICAgICAgIGlmIFsgIiQ/IiAhPSAiMCIgXTsgdGhlbgorICAgICAgICAgICAgICAgICAgICByZXR1cm5fdmFsdWU9MQorICAgICAgICAgICAgICAgICAgICBSRUdSRVNTSU9OUz10cnVlCisgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIGZpCisgICAgICAgIGRvbmUKKyAgICBmaQorCisgICAgcmV0dXJuICRyZXR1cm5fdmFsdWUKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENvbXBhcmUgYWxsIGphciBmaWxlcworCitjb21wYXJlX2FsbF9qYXJfZmlsZXMoKSB7CisgICAgVEhJU19ESVI9JDEKKyAgICBPVEhFUl9ESVI9JDIKKyAgICBXT1JLX0RJUj0kMworCisgICAgIyBUT0RPIGZpbHRlcj8KKyAgICBaSVBTPSQoY2QgJFRISVNfRElSICYmICRGSU5EIC4gLXR5cGUgZiAtbmFtZSAiKi5qYXIiIC1vIC1uYW1lICIqLndhciIgfCAkU09SVCB8ICRGSUxURVIpCisKKyAgICBpZiBbIC1uICIkWklQUyIgXTsgdGhlbgorICAgICAgICBlY2hvIEphciBmaWxlcy4uLgorCisgICAgICAgIHJldHVybl92YWx1ZT0wCisgICAgICAgIGZvciBmIGluICRaSVBTOyBkbworICAgICAgICAgICAgaWYgWyAtZiAiJE9USEVSX0RJUi8kZiIgXTsgdGhlbgorICAgICAgICAgICAgICAgIGNvbXBhcmVfemlwX2ZpbGUgJFRISVNfRElSICRPVEhFUl9ESVIgJFdPUktfRElSICRmCisgICAgICAgICAgICAgICAgaWYgWyAiJD8iICE9ICIwIiBdOyB0aGVuCisgICAgICAgICAgICAgICAgICAgIHJldHVybl92YWx1ZT0xCisgICAgICAgICAgICAgICAgICAgIFJFR1JFU1NJT05TPXRydWUKKyAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgZmkKKyAgICAgICAgZG9uZQorICAgIGZpCisKKyAgICByZXR1cm4gJHJldHVybl92YWx1ZQorfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ29tcGFyZSBiaW5hcnkgKGV4ZWN1dGFibGUvbGlicmFyeSkgZmlsZQorCitjb21wYXJlX2Jpbl9maWxlKCkgeworICAgIFRISVNfRElSPSQxCisgICAgT1RIRVJfRElSPSQyCisgICAgV09SS19ESVI9JDMKKyAgICBCSU5fRklMRT0kNAorCisgICAgVEhJU19GSUxFPSRUSElTX0RJUi8kQklOX0ZJTEUKKyAgICBPVEhFUl9GSUxFPSRPVEhFUl9ESVIvJEJJTl9GSUxFCisgICAgTkFNRT0kKGJhc2VuYW1lICRCSU5fRklMRSkKKyAgICBXT1JLX0ZJTEVfQkFTRT0kV09SS19ESVIvJEJJTl9GSUxFCisgICAgRklMRV9XT1JLX0RJUj0kKGRpcm5hbWUgJFdPUktfRklMRV9CQVNFKQorCisgICAgJE1LRElSIC1wICRGSUxFX1dPUktfRElSCisKKyAgICBPUklHX1RISVNfRklMRT0iJFRISVNfRklMRSIKKyAgICBPUklHX09USEVSX0ZJTEU9IiRPVEhFUl9GSUxFIgorCisgICAgaWYgW1sgIiRTVFJJUF9CRUZPUkVfQ09NUEFSRSIgPSAqIiRCSU5fRklMRSIqIF1dOyB0aGVuCisgICAgICAgIFRISVNfU1RSSVBQRURfRklMRT0kRklMRV9XT1JLX0RJUi90aGlzLyROQU1FCisgICAgICAgIE9USEVSX1NUUklQUEVEX0ZJTEU9JEZJTEVfV09SS19ESVIvb3RoZXIvJE5BTUUKKyAgICAgICAgJE1LRElSIC1wICRGSUxFX1dPUktfRElSL3RoaXMgJEZJTEVfV09SS19ESVIvb3RoZXIKKyAgICAgICAgJENQICRUSElTX0ZJTEUgJFRISVNfU1RSSVBQRURfRklMRQorICAgICAgICAkQ1AgJE9USEVSX0ZJTEUgJE9USEVSX1NUUklQUEVEX0ZJTEUKKyAgICAgICAgJFNUUklQICRUSElTX1NUUklQUEVEX0ZJTEUKKyAgICAgICAgJFNUUklQICRPVEhFUl9TVFJJUFBFRF9GSUxFCisgICAgICAgIFRISVNfRklMRT0iJFRISVNfU1RSSVBQRURfRklMRSIKKyAgICAgICAgT1RIRVJfRklMRT0iJE9USEVSX1NUUklQUEVEX0ZJTEUiCisgICAgZmkKKworICAgIGlmIFsgIiRPUEVOSkRLX1RBUkdFVF9PUyIgPSAid2luZG93cyIgXTsgdGhlbgorCXVuc2V0IF9OVF9TWU1CT0xfUEFUSAorCSMgT24gd2luZG93cyB3ZSBuZWVkIHRvIHVuemlwIHRoZSBkZWJ1ZyBzeW1ib2xzLCBpZiBwcmVzZW50CisJT1RIRVJfRklMRV9CQVNFPSR7T1RIRVJfRklMRS8uZGxsL30KKwlPVEhFUl9GSUxFX0JBU0U9JHtPVEhFUl9GSUxFX0JBU0UvLmV4ZS99CisJRElaX05BTUU9JChiYXNlbmFtZSAkT1RIRVJfRklMRV9CQVNFKS5kaXoKKyAgICAgICAgIyBqYXZhLmV4ZSBhbmQgamF2YS5kbGwgZGl6IGZpbGVzIHdpbGwgaGF2ZSB0aGUgc2FtZSBuYW1lLiBIYXZlIHRvCisJIyBtYWtlIHN1cmUgamF2YS5leGUgZ2V0cyB0aGUgcmlnaHQgb25lLiBUaGlzIGlzIG9ubHkgbmVlZGVkIGZvciAKKwkjIE9USEVSIHNpbmNlIGluIHRoZSBuZXcgYnVpbGQsIGFsbCBwZGIgZmlsZXMgYXJlIGxlZnQgYXJvdW5kLgorCWlmIFsgIiROQU1FIiA9ICJqYXZhLmV4ZSIgXSAmJiBbIC1mICIkT1RIRVIvdG1wL2phdmEvamF2YS9vYmo2NC9qYXZhLmRpeiIgXTsgdGhlbgorCSAgICBPVEhFUl9ESVpfRklMRT0iJE9USEVSL3RtcC9qYXZhL2phdmEvb2JqNjQvamF2YS5kaXoiCisJZWxpZiBbIC1mICIke09USEVSX0ZJTEVfQkFTRX0uZGl6IiBdOyB0aGVuCisJICAgIE9USEVSX0RJWl9GSUxFPSR7T1RIRVJfRklMRV9CQVNFfS5kaXoKKwllbHNlCisgICAgICAgICAgICAjIFNvbWUgZmlsZXMsIGpsaS5kbGwsIGFwcGVhcnMgdHdpY2UgaW4gdGhlIGltYWdlIGJ1dCBvbmx5IG9uZSBvZgorCSAgICAjIHRobWUgaGFzIGEgZGl6IGZpbGUgbmV4dCB0byBpdC4KKwkgICAgT1RIRVJfRElaX0ZJTEU9IiQoJEZJTkQgJE9USEVSX0RJUiAtbmFtZSAkRElaX05BTUUgfCAkU0VEIDFxKSIKKwkgICAgaWYgWyAhIC1mICIkT1RIRVJfRElaX0ZJTEUiIF07IHRoZW4KKwkJIyBBcyBhIGxhc3QgcmVzb3J0LCBsb29rIGZvciBkaXogZmlsZSBpbiB0aGUgd2hvbGUgYnVpbGQgb3V0cHV0CisJCSMgZGlyLgorCQlPVEhFUl9ESVpfRklMRT0iJCgkRklORCAkT1RIRVIgLW5hbWUgJERJWl9OQU1FIHwgJFNFRCAxcSkiCisJICAgIGZpCisJZmkKKwlpZiBbIC1uICIkT1RIRVJfRElaX0ZJTEUiIF07IHRoZW4KKwkgICAgJE1LRElSIC1wICRGSUxFX1dPUktfRElSL290aGVyCisJICAgIChjZCAkRklMRV9XT1JLX0RJUi9vdGhlciA7ICRVTkFSQ0hJVkUgLW8gJE9USEVSX0RJWl9GSUxFKQorCSAgICBleHBvcnQgX05UX1NZTUJPTF9QQVRIPSIkRklMRV9XT1JLX0RJUi9vdGhlciIKKwlmaQorCVRISVNfRklMRV9CQVNFPSR7VEhJU19GSUxFLy5kbGwvfQorCVRISVNfRklMRV9CQVNFPSR7VEhJU19GSUxFX0JBU0UvLmV4ZS99CisJaWYgWyAtZiAiJHtUSElTX0ZJTEUvLmRsbC99LmRpeiIgXTsgdGhlbgorCSAgICBUSElTX0RJWl9GSUxFPSR7VEhJU19GSUxFLy5kbGwvfS5kaXoKKwllbHNlCisJICAgIFRISVNfRElaX0ZJTEU9IiQoJEZJTkQgJFRISVNfRElSIC1uYW1lICRESVpfTkFNRSB8ICRTRUQgMXEpIgorCSAgICBpZiBbICEgLWYgIiRUSElTX0RJWl9GSUxFIiBdOyB0aGVuCisJCSMgQXMgYSBsYXN0IHJlc29ydCwgbG9vayBmb3IgZGl6IGZpbGUgaW4gdGhlIHdob2xlIGJ1aWxkIG91dHB1dAorCQkjIGRpci4KKwkJVEhJU19ESVpfRklMRT0iJCgkRklORCAkVEhJUyAtbmFtZSAkRElaX05BTUUgfCAkU0VEIDFxKSIKKwkgICAgZmkKKwlmaQorCWlmIFsgLW4gIiRUSElTX0RJWl9GSUxFIiBdOyB0aGVuCisJICAgICRNS0RJUiAtcCAkRklMRV9XT1JLX0RJUi90aGlzCisJICAgIChjZCAkRklMRV9XT1JLX0RJUi90aGlzIDsgJFVOQVJDSElWRSAtbyAkVEhJU19ESVpfRklMRSkKKwkgICAgZXhwb3J0IF9OVF9TWU1CT0xfUEFUSD0iJF9OVF9TWU1CT0xfUEFUSDskRklMRV9XT1JLX0RJUi90aGlzIgorCWZpCisgICAgZmkKKworICAgIGlmIFsgLXogIiRTS0lQX0JJTl9ESUZGIiBdOyB0aGVuCisgICAgICAgIGlmIGNtcCAkT1RIRVJfRklMRSAkVEhJU19GSUxFID4gL2Rldi9udWxsOyB0aGVuCisgICAgICAgICMgVGhlIGZpbGVzIHdlcmUgYnl0ZXdpc2UgaWRlbnRpY2FsLgorICAgICAgICAgICAgaWYgWyAtbiAiJFZFUkJPU0UiIF07IHRoZW4KKyAgICAgICAgICAgICAgICBlY2hvICIgICAgICAgIDogICAgICAgICAgIDogICAgICAgICA6ICAgICAgICAgOiAgICAgICAgICA6ICRCSU5fRklMRSIKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICBmaQorICAgICAgICBCSU5fTVNHPSIgZGlmZiAiCisgICAgICAgIGlmIFtbICIkQUNDRVBURURfQklOX0RJRkYiICE9ICoiJEJJTl9GSUxFIiogXV07IHRoZW4KKyAgICAgICAgICAgIERJRkZfQklOPXRydWUKKyAgICAgICAgICAgIGlmIFtbICIkS05PV05fQklOX0RJRkYiICE9ICoiJEJJTl9GSUxFIiogXV07IHRoZW4KKyAgICAgICAgICAgICAgICBCSU5fTVNHPSIqJEJJTl9NU0cqIgorICAgICAgICAgICAgICAgIFJFR1JFU1NJT05TPXRydWUKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBCSU5fTVNHPSIgJEJJTl9NU0cgIgorICAgICAgICAgICAgZmkKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgQklOX01TRz0iKCRCSU5fTVNHKSIKKyAgICAgICAgICAgIERJRkZfQklOPQorICAgICAgICBmaQorICAgIGZpCisKKyAgICBpZiBbIC1uICIkU1RBVCIgXTsgdGhlbgorICAgICAgICBUSElTX1NJWkU9JCgkU1RBVCAkU1RBVF9QUklOVF9TSVpFICIkVEhJU19GSUxFIikKKyAgICAgICAgT1RIRVJfU0laRT0kKCRTVEFUICRTVEFUX1BSSU5UX1NJWkUgIiRPVEhFUl9GSUxFIikKKyAgICBlbHNlCisgICAgICAgIFRISVNfU0laRT0kKGxzIC1sICIkVEhJU19GSUxFIiB8IGF3ayAneyBwcmludCAkNSB9JykKKyAgICAgICAgT1RIRVJfU0laRT0kKGxzIC1sICIkT1RIRVJfRklMRSIgfCBhd2sgJ3sgcHJpbnQgJDUgfScpCisgICAgZmkKKyAgICBpZiBbICRUSElTX1NJWkUgLW5lICRPVEhFUl9TSVpFIF07IHRoZW4KKyAgICAgICAgRElGRl9TSVpFX05VTT0kKCRFWFBSICRUSElTX1NJWkUgLSAkT1RIRVJfU0laRSkKKyAgICAgICAgRElGRl9TSVpFX1JFTD0kKCRFWFBSICRUSElTX1NJWkUgXCogMTAwIC8gJE9USEVSX1NJWkUpCisgICAgICAgIFNJWkVfTVNHPSQoJFBSSU5URiAiJTNkJSUgJTRkIiAkRElGRl9TSVpFX1JFTCAkRElGRl9TSVpFX05VTSkKKyAgICAgICAgaWYgW1sgIiRBQ0NFUFRFRF9TTUFMTF9TSVpFX0RJRkYiID0gKiIkQklOX0ZJTEUiKiBdXSAmJiBbICIkRElGRl9TSVpFX1JFTCIgLWd0IDk4IF0gJiYgWyAiJERJRkZfU0laRV9SRUwiIC1sdCAxMDIgXTsgdGhlbgorICAgICAgICAgICAgU0laRV9NU0c9IigkU0laRV9NU0cpIgorICAgICAgICAgICAgRElGRl9TSVpFPQorICAgICAgICBlbGlmIFtbICIkQUNDRVBURURfU01BTExfU0laRV9ESUZGIiA9ICoiJEJJTl9GSUxFIiogXV0gJiYgWyAiJERJRkZfU0laRV9OVU0iID0gNTEyIF07IHRoZW4KKwkgICAgIyBPbiB3aW5kb3dzLCBzaXplIG9mIGJpbmFyaWVzIGluY3JlYXNlIGluIDUxMiBpbmNyZW1lbnRzLgorICAgICAgICAgICAgU0laRV9NU0c9IigkU0laRV9NU0cpIgorICAgICAgICAgICAgRElGRl9TSVpFPQorICAgICAgICBlbHNlCisgICAgICAgICAgICBpZiBbWyAiJEFDQ0VQVEVEX1NJWkVfRElGRiIgIT0gKiIkQklOX0ZJTEUiKiBdXTsgdGhlbgorICAgICAgICAgICAgICAgIERJRkZfU0laRT10cnVlCisgICAgICAgICAgICAgICAgaWYgW1sgIiRLTk9XTl9TSVpFX0RJRkYiICE9ICoiJEJJTl9GSUxFIiogXV07IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgU0laRV9NU0c9IiokU0laRV9NU0cqIgorICAgICAgICAgICAgICAgICAgICBSRUdSRVNTSU9OUz10cnVlCisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBTSVpFX01TRz0iICRTSVpFX01TRyAiCisgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBTSVpFX01TRz0iKCRTSVpFX01TRykiCisgICAgICAgICAgICAgICAgRElGRl9TSVpFPQorICAgICAgICAgICAgZmkKKyAgICAgICAgZmkKKyAgICBlbHNlCisgICAgICAgIFNJWkVfTVNHPSIgICAgICAgICAgICIKKyAgICAgICAgRElGRl9TSVpFPQorICAgICAgICBpZiBbWyAiJEtOT1dOX1NJWkVfRElGRiAkQUNDRVBURURfU0laRV9ESUZGIiA9ICoiJEJJTl9GSUxFIiogXV07IHRoZW4KKyAgICAgICAgICAgIFNJWkVfTVNHPSIgICAgICEgICAgICIKKyAgICAgICAgZmkKKyAgICBmaQorCisgICAgaWYgW1sgIiRTT1JUX1NZTUJPTFMiID0gKiIkQklOX0ZJTEUiKiBdXTsgdGhlbgorICAgICAgICBTWU1fU09SVF9DTUQ9InNvcnQiCisgICAgZWxzZQorICAgICAgICBTWU1fU09SVF9DTUQ9ImNhdCIKKyAgICBmaQorCisgICAgIyBDaGVjayBzeW1ib2xzCisgICAgaWYgWyAiJE9QRU5KREtfVEFSR0VUX09TIiA9ICJ3aW5kb3dzIiBdOyB0aGVuCisgICAgICAgICMgVGhlIG91dHB1dCBmcm9tIGR1bXBiaW4gb24gd2luZG93cyBkaWZmZXJzIGRlcGVuZGluZyBvbiBpZiB0aGUgZGVidWcgc3ltYm9sCisgICAgICAgICMgZmlsZXMgYXJlIHN0aWxsIGFyb3VuZCBhdCB0aGUgbG9jYXRpb24gdGhlIGJpbmFyeSBpcyBwb2ludGluZyB0b28uIE5lZWQKKwkjIHRvIGZpbHRlciBvdXQgdGhhdCBleHRyYSBpbmZvcm1hdGlvbi4KKwkkRFVNUEJJTiAtZXhwb3J0cyAkT1RIRVJfRklMRSB8ICRHUkVQICAtRSAnXiArWzAtOUEtRl0rICtbMC05QS1GXSsgWzAtOUEtRl0rJyB8IHNlZCAncy8gPSAuKi8vZycgfCBjdXQgLWMyNy0gfCAkU1lNX1NPUlRfQ01EID4gJFdPUktfRklMRV9CQVNFLnN5bWJvbHMub3RoZXIKKwkkRFVNUEJJTiAtZXhwb3J0cyAkVEhJU19GSUxFICB8ICRHUkVQICAtRSAnXiArWzAtOUEtRl0rICtbMC05QS1GXSsgWzAtOUEtRl0rJyB8IHNlZCAncy8gPSAuKi8vZycgfCBjdXQgLWMyNy0gfCAkU1lNX1NPUlRfQ01EID4gJFdPUktfRklMRV9CQVNFLnN5bWJvbHMudGhpcworICAgIGVsaWYgWyAiJE9QRU5KREtfVEFSR0VUX09TIiA9ICJzb2xhcmlzIiBdOyB0aGVuCisgICAgICAgICMgU29tZSBzeW1ib2xzIGdldCBzZWVtaW5nbHkgcmFuZG9tIDE1IGNoYXJhY3RlciBwcmVmaXhlcy4gRmlsdGVyIHRoZW0gb3V0LgorICAgICAgICAkTk0gLWEgJE9SSUdfT1RIRVJfRklMRSAyPiAvZGV2L251bGwgfCAkR1JFUCAtdiAkTkFNRSB8ICRBV0sgJ3twcmludCAkMiwgJDMsICQ0LCAkNX0nIHwgJFNFRCAncy9eXChbYS16QS1aXSBbXC5cJF1cKVthLXpBLVowLTlfXCRdXHsxNSwxNVx9XC4vXDEuL2cnIHwgJFNZTV9TT1JUX0NNRCA+ICRXT1JLX0ZJTEVfQkFTRS5zeW1ib2xzLm90aGVyCisJJE5NIC1hICRPUklHX1RISVNfRklMRSAgMj4gL2Rldi9udWxsIHwgJEdSRVAgLXYgJE5BTUUgfCAkQVdLICd7cHJpbnQgJDIsICQzLCAkNCwgJDV9JyB8ICRTRUQgJ3MvXlwoW2EtekEtWl0gW1wuXCRdXClbYS16QS1aMC05X1wkXVx7MTUsMTVcfVwuL1wxLi9nJyB8ICRTWU1fU09SVF9DTUQgPiAkV09SS19GSUxFX0JBU0Uuc3ltYm9scy50aGlzCisgICAgZWxzZQorCSROTSAtYSAkT1JJR19PVEhFUl9GSUxFIDI+IC9kZXYvbnVsbCB8ICRHUkVQIC12ICROQU1FIHwgJEFXSyAne3ByaW50ICQyLCAkMywgJDQsICQ1fScgfCAkU1lNX1NPUlRfQ01EID4gJFdPUktfRklMRV9CQVNFLnN5bWJvbHMub3RoZXIKKwkkTk0gLWEgJE9SSUdfVEhJU19GSUxFICAyPiAvZGV2L251bGwgfCAkR1JFUCAtdiAkTkFNRSB8ICRBV0sgJ3twcmludCAkMiwgJDMsICQ0LCAkNX0nIHwgJFNZTV9TT1JUX0NNRCA+ICRXT1JLX0ZJTEVfQkFTRS5zeW1ib2xzLnRoaXMKKyAgICBmaQorICAgIAorICAgIExBTkc9QyAkRElGRiAkV09SS19GSUxFX0JBU0Uuc3ltYm9scy5vdGhlciAkV09SS19GSUxFX0JBU0Uuc3ltYm9scy50aGlzID4gJFdPUktfRklMRV9CQVNFLnN5bWJvbHMuZGlmZgorICAgIGlmIFsgLXMgJFdPUktfRklMRV9CQVNFLnN5bWJvbHMuZGlmZiBdOyB0aGVuCisgICAgICAgIFNZTV9NU0c9IiBkaWZmICAiCisgICAgICAgIGlmIFtbICIkQUNDRVBURURfU1lNX0RJRkYiICE9ICoiJEJJTl9GSUxFIiogXV07IHRoZW4KKyAgICAgICAgICAgIERJRkZfU1lNPXRydWUKKyAgICAgICAgICAgIGlmIFtbICIkS05PV05fU1lNX0RJRkYiICE9ICoiJEJJTl9GSUxFIiogXV07IHRoZW4KKyAgICAgICAgICAgICAgICBTWU1fTVNHPSIqJFNZTV9NU0cqIgorICAgICAgICAgICAgICAgIFJFR1JFU1NJT05TPXRydWUKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBTWU1fTVNHPSIgJFNZTV9NU0cgIgorICAgICAgICAgICAgZmkKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgU1lNX01TRz0iKCRTWU1fTVNHKSIgICAgICAgICAgICAKKyAgICAgICAgICAgIERJRkZfU1lNPQorICAgICAgICBmaQorICAgIGVsc2UKKyAgICAgICAgU1lNX01TRz0iICAgICAgICAgIgorICAgICAgICBESUZGX1NZTT0KKyAgICAgICAgaWYgW1sgIiRLTk9XTl9TWU1fRElGRiAkQUNDRVBURURfU1lNX0RJRkYiID0gKiIkQklOX0ZJTEUiKiBdXTsgdGhlbgorICAgICAgICAgICAgU1lNX01TRz0iICAgICEgICAgIgorICAgICAgICBmaQorICAgIGZpCisKKyAgICAjIENoZWNrIGRlcGVuZGVuY2llcworICAgIGlmIFsgLW4gIiRMRERfQ01EIiBdOyB0aGVuCisJKGNkICRGSUxFX1dPUktfRElSICYmICRDUCAkT1RIRVJfRklMRSAuICYmICRMRERfQ01EICROQU1FIHwgJEFXSyAneyBwcmludCAkMTt9JyB8ICRTT1JUIHwgJFRFRSAkV09SS19GSUxFX0JBU0UuZGVwcy5vdGhlciB8ICRVTklRID4gJFdPUktfRklMRV9CQVNFLmRlcHMub3RoZXIudW5pcSkKKwkoY2QgJEZJTEVfV09SS19ESVIgJiYgJENQICRUSElTX0ZJTEUgLiAmJiAkTEREX0NNRCAkTkFNRSB8ICRBV0sgJ3sgcHJpbnQgJDE7fScgfCAkU09SVCB8ICRURUUgJFdPUktfRklMRV9CQVNFLmRlcHMudGhpcyB8ICRVTklRID4gJFdPUktfRklMRV9CQVNFLmRlcHMudGhpcy51bmlxKQorCShjZCAkRklMRV9XT1JLX0RJUiAmJiAkUk0gLWYgJE5BTUUpCisJCisJTEFORz1DICRESUZGICRXT1JLX0ZJTEVfQkFTRS5kZXBzLm90aGVyICRXT1JLX0ZJTEVfQkFTRS5kZXBzLnRoaXMgPiAkV09SS19GSUxFX0JBU0UuZGVwcy5kaWZmCisJTEFORz1DICRESUZGICRXT1JLX0ZJTEVfQkFTRS5kZXBzLm90aGVyLnVuaXEgJFdPUktfRklMRV9CQVNFLmRlcHMudGhpcy51bmlxID4gJFdPUktfRklMRV9CQVNFLmRlcHMuZGlmZi51bmlxCisJCisJaWYgWyAtcyAkV09SS19GSUxFX0JBU0UuZGVwcy5kaWZmIF07IHRoZW4KKyAgICAgICAgICAgIGlmIFsgLXMgJFdPUktfRklMRV9CQVNFLmRlcHMuZGlmZi51bmlxIF07IHRoZW4KKwkJREVQX01TRz0iIGRpZmYgICIKKyAgICAgICAgICAgIGVsc2UKKwkJREVQX01TRz0iIHJlZHVuICIKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgICBpZiBbWyAiJEFDQ0VQVEVEX0RFUF9ESUZGIiAhPSAqIiRCSU5fRklMRSIqIF1dOyB0aGVuCisJCURJRkZfREVQPXRydWUKKwkJaWYgW1sgIiRLTk9XTl9ERVBfRElGRiIgIT0gKiIkQklOX0ZJTEUiKiBdXTsgdGhlbgorICAgICAgICAgICAgICAgICAgICBERVBfTVNHPSIqJERFUF9NU0cqIgorICAgICAgICAgICAgICAgICAgICBSRUdSRVNTSU9OUz10cnVlCisJCWVsc2UKKyAgICAgICAgICAgICAgICAgICAgREVQX01TRz0iICRERVBfTVNHICIKKwkJZmkKKyAgICAgICAgICAgIGVsc2UKKwkJREVQX01TRz0iKCRERVBfTVNHKSIKKwkJRElGRl9ERVA9CisgICAgICAgICAgICBmaQorCWVsc2UKKwkgICAgREVQX01TRz0iICAgICAgICAgIgorCSAgICBESUZGX0RFUD0KKyAgICAgICAgICAgIGlmIFtbICIkS05PV05fREVQX0RJRkYgJEFDQ0VQVEVEX0RFUF9ESUZGIiA9ICoiJEJJTl9GSUxFIiogXV07IHRoZW4KKyAgICAgICAgICAgICAgICBERVBfTVNHPSIgICAgICEgICAgICAiCisgICAgICAgICAgICBmaQorCWZpCisgICAgZWxzZQorCURFUF9NU0c9IiAgICAtICAgICIKKyAgICBmaQorICAgIAorICAgICMgQ29tcGFyZSBmdWxsZHVtcCBvdXRwdXQKKyAgICBpZiBbIC1uICIkRlVMTERVTVBfQ01EIiBdICYmIFsgLXogIiRTS0lQX0ZVTExEVU1QX0RJRkYiIF07IHRoZW4KKyAgICAgICAgJEZVTExEVU1QX0NNRCAkT1RIRVJfRklMRSA+ICRXT1JLX0ZJTEVfQkFTRS5mdWxsZHVtcC5vdGhlciAyPiYxCisgICAgICAgICRGVUxMRFVNUF9DTUQgJFRISVNfRklMRSA+ICRXT1JLX0ZJTEVfQkFTRS5mdWxsZHVtcC50aGlzIDI+JjEKKyAgICAgICAgTEFORz1DICRESUZGICRXT1JLX0ZJTEVfQkFTRS5mdWxsZHVtcC5vdGhlciAkV09SS19GSUxFX0JBU0UuZnVsbGR1bXAudGhpcyA+ICRXT1JLX0ZJTEVfQkFTRS5mdWxsZHVtcC5kaWZmCisgICAgICAgIAorICAgICAgICBpZiBbIC1zICRXT1JLX0ZJTEVfQkFTRS5mdWxsZHVtcC5kaWZmIF07IHRoZW4KKyAgICAgICAgICAgIEVMRl9ESUZGX1NJWkU9JChscyAtbiAkV09SS19GSUxFX0JBU0UuZnVsbGR1bXAuZGlmZiB8IGF3ayAne3ByaW50ICQ1fScpCisgICAgICAgICAgICBFTEZfTVNHPSQoJFBSSU5URiAiJThkIiAkRUxGX0RJRkZfU0laRSkKKyAgICAgICAgICAgIGlmIFtbICIkQUNDRVBURURfRUxGX0RJRkYiICE9ICoiJEJJTl9GSUxFIiogXV07IHRoZW4KKyAgICAgICAgICAgICAgICBESUZGX0VMRj10cnVlCisgICAgICAgICAgICAgICAgaWYgW1sgIiRLTk9XTl9FTEZfRElGRiIgIT0gKiIkQklOX0ZJTEUiKiBdXTsgdGhlbgorICAgICAgICAgICAgICAgICAgICBFTEZfTVNHPSIqJEVMRl9NU0cqIgorICAgICAgICAgICAgICAgICAgICBSRUdSRVNTSU9OUz10cnVlCisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBFTEZfTVNHPSIgJEVMRl9NU0cgIgorICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgRUxGX01TRz0iKCRFTEZfTVNHKSIKKyAgICAgICAgICAgICAgICBESUZGX0VMRj0KKyAgICAgICAgICAgIGZpCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIEVMRl9NU0c9IiAgICAgICAgICAiCisgICAgICAgICAgICBESUZGX0VMRj0KKyAgICAgICAgICAgIGlmIFtbICIkS05PV05fREVQX0RJRkYgJEFDQ0VQVEVEX0RFUF9ESUZGIiA9ICoiJEJJTl9GSUxFIiogXV07IHRoZW4KKyAgICAgICAgICAgICAgICBFTEZfTVNHPSIgICAgISAgICAiCisgICAgICAgICAgICBmaQorICAgICAgICBmaQorICAgIGZpCisKKyAgICAjIENvbXBhcmUgZGlzYXNzZW1ibGUgb3V0cHV0CisgICAgaWYgWyAtbiAiJERJU19DTUQiIF0gJiYgWyAteiAiJFNLSVBfRElTX0RJRkYiIF07IHRoZW4KKwlpZiBbIC16ICIkRElTX0RJRkZfRklMVEVSIiBdOyB0aGVuCisJICAgIERJU19ESUZGX0ZJTFRFUj0iJENBVCIKKwlmaQorICAgICAgICAkRElTX0NNRCAkT1RIRVJfRklMRSB8ICRHUkVQIC12ICROQU1FIHwgJERJU19ESUZGX0ZJTFRFUiA+ICRXT1JLX0ZJTEVfQkFTRS5kaXMub3RoZXIgMj4mMQorICAgICAgICAkRElTX0NNRCAkVEhJU19GSUxFICB8ICRHUkVQIC12ICROQU1FIHwgJERJU19ESUZGX0ZJTFRFUiA+ICRXT1JLX0ZJTEVfQkFTRS5kaXMudGhpcyAgMj4mMQorICAgICAgICAKKyAgICAgICAgTEFORz1DICRESUZGICRXT1JLX0ZJTEVfQkFTRS5kaXMub3RoZXIgJFdPUktfRklMRV9CQVNFLmRpcy50aGlzID4gJFdPUktfRklMRV9CQVNFLmRpcy5kaWZmCisgICAgICAgIAorICAgICAgICBpZiBbIC1zICRXT1JLX0ZJTEVfQkFTRS5kaXMuZGlmZiBdOyB0aGVuCisgICAgICAgICAgICBESVNfRElGRl9TSVpFPSQobHMgLW4gJFdPUktfRklMRV9CQVNFLmRpcy5kaWZmIHwgYXdrICd7cHJpbnQgJDV9JykKKyAgICAgICAgICAgIERJU19NU0c9JCgkUFJJTlRGICIlOGQiICRESVNfRElGRl9TSVpFKQorICAgICAgICAgICAgaWYgW1sgIiRBQ0NFUFRFRF9ESVNfRElGRiIgIT0gKiIkQklOX0ZJTEUiKiBdXTsgdGhlbgorICAgICAgICAgICAgICAgIERJRkZfRElTPXRydWUKKyAgICAgICAgICAgICAgICBpZiBbWyAiJEtOT1dOX0RJU19ESUZGIiAhPSAqIiRCSU5fRklMRSIqIF1dOyB0aGVuCisgICAgICAgICAgICAgICAgICAgIERJU19NU0c9IiokRElTX01TRyoiCisgICAgICAgICAgICAgICAgICAgIFJFR1JFU1NJT05TPXRydWUKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIERJU19NU0c9IiAkRElTX01TRyAiCisgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBESVNfTVNHPSIoJERJU19NU0cpIgorICAgICAgICAgICAgICAgIERJRkZfRElTPQorICAgICAgICAgICAgZmkKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgRElTX01TRz0iICAgICAgICAgICIKKyAgICAgICAgICAgIERJRkZfRElTPQorICAgICAgICAgICAgaWYgW1sgIiRLTk9XTl9ERVBfRElGRiAkQUNDRVBURURfREVQX0RJRkYiID0gKiIkQklOX0ZJTEUiKiBdXTsgdGhlbgorICAgICAgICAgICAgICAgIERJU19NU0c9IiAgICAhICAgICIKKyAgICAgICAgICAgIGZpCisgICAgICAgIGZpCisgICAgZmkKKworCisgICAgaWYgWyAtbiAiJERJRkZfQklOJERJRkZfU0laRSRESUZGX1NZTSRESUZGX0RFUCRESUZGX0VMRiRESUZGX0RJUyIgXSB8fCBbIC1uICIkVkVSQk9TRSIgXTsgdGhlbgorICAgICAgICBpZiBbIC1uICIkQklOX01TRyIgXTsgdGhlbiBlY2hvIC1uICIkQklOX01TRzoiOyBmaQorICAgICAgICBpZiBbIC1uICIkU0laRV9NU0ciIF07IHRoZW4gZWNobyAtbiAiJFNJWkVfTVNHOiI7IGZpCisgICAgICAgIGlmIFsgLW4gIiRTWU1fTVNHIiBdOyB0aGVuIGVjaG8gLW4gIiRTWU1fTVNHOiI7IGZpCisgICAgICAgIGlmIFsgLW4gIiRERVBfTVNHIiBdOyB0aGVuIGVjaG8gLW4gIiRERVBfTVNHOiI7IGZpCisgICAgICAgIGlmIFsgLW4gIiRFTEZfTVNHIiBdOyB0aGVuIGVjaG8gLW4gIiRFTEZfTVNHOiI7IGZpCisgICAgICAgIGlmIFsgLW4gIiRESVNfTVNHIiBdOyB0aGVuIGVjaG8gLW4gIiRESVNfTVNHOiI7IGZpCisgICAgICAgIGVjaG8gIiAkQklOX0ZJTEUiCisgICAgICAgIGlmIFsgIiRTSE9XX0RJRkZTIiA9ICJ0cnVlIiBdOyB0aGVuCisgICAgICAgICAgICBpZiBbIC1zICIkV09SS19GSUxFX0JBU0Uuc3ltYm9scy5kaWZmIiBdOyB0aGVuCisgICAgICAgICAgICAgICAgZWNobyAiU3ltYm9scyBkaWZmOiIKKyAgICAgICAgICAgICAgICAkQ0FUICRXT1JLX0ZJTEVfQkFTRS5zeW1ib2xzLmRpZmYKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgICBpZiBbIC1zICIkV09SS19GSUxFX0JBU0UuZGVwcy5kaWZmIiBdOyB0aGVuCisgICAgICAgICAgICAgICAgZWNobyAiRGVwcyBkaWZmOiIKKyAgICAgICAgICAgICAgICAkQ0FUICRXT1JLX0ZJTEVfQkFTRS5kZXBzLmRpZmYKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgICBpZiBbIC1zICIkV09SS19GSUxFX0JBU0UuZnVsbGR1bXAuZGlmZiIgXTsgdGhlbgorICAgICAgICAgICAgICAgIGVjaG8gIkZ1bGxkdW1wIGRpZmY6IgorICAgICAgICAgICAgICAgICRDQVQgJFdPUktfRklMRV9CQVNFLmZ1bGxkdW1wLmRpZmYKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgICBpZiBbIC1zICIkV09SS19GSUxFX0JBU0UuZGlzLmRpZmYiIF07IHRoZW4KKyAgICAgICAgICAgICAgICBlY2hvICJEaXNhc3NlbWJseSBkaWZmOiIKKyAgICAgICAgICAgICAgICAkQ0FUICRXT1JLX0ZJTEVfQkFTRS5kaXMuZGlmZgorICAgICAgICAgICAgZmkKKyAgICAgICAgZmkKKyAgICAgICAgcmV0dXJuIDEKKyAgICBmaQorICAgIHJldHVybiAwCit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBQcmludCBiaW5hcnkgZGlmZiBoZWFkZXIKKworcHJpbnRfYmluYXJ5X2RpZmZfaGVhZGVyKCkgeworICAgIGlmIFsgLXogIiRTS0lQX0JJTl9ESUZGIiBdOyB0aGVuIGVjaG8gLW4gIiBCaW5hcnkgOiI7IGZpCisgICAgaWYgWyAteiAiJFNLSVBfU0laRV9ESUZGIiBdOyB0aGVuIGVjaG8gLW4gIiAgIFNpemUgICAgOiI7IGZpCisgICAgaWYgWyAteiAiJFNLSVBfU1lNX0RJRkYiIF07IHRoZW4gZWNobyAtbiAiIFN5bWJvbHMgOiI7IGZpCisgICAgaWYgWyAteiAiJFNLSVBfREVQX0RJRkYiIF07IHRoZW4gZWNobyAtbiAiICBEZXBzICAgOiI7IGZpCisgICAgaWYgWyAteiAiJFNLSVBfRlVMTERVTVBfRElGRiIgXTsgdGhlbiBlY2hvIC1uICIgRnVsbGR1bXAgOiI7IGZpCisgICAgaWYgWyAteiAiJFNLSVBfRElTX0RJRkYiIF07IHRoZW4gZWNobyAtbiAiIERpc2FzcyAgIDoiOyBmaQorICAgIGVjaG8KK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENvbXBhcmUgYWxsIGxpYnJhcmllcworCitjb21wYXJlX2FsbF9saWJzKCkgeworICAgIFRISVNfRElSPSQxCisgICAgT1RIRVJfRElSPSQyCisgICAgV09SS19ESVI9JDMKKworICAgIExJQlM9JChjZCAkVEhJU19ESVIgJiYgJEZJTkQgLiAtdHlwZSBmIFwoIC1uYW1lICdsaWIqLnNvJyAtbyAtbmFtZSAnKi5keWxpYicgLW8gLW5hbWUgJyouZGxsJyBcKSB8ICRTT1JUIHwgJEZJTFRFUikKKworICAgIGlmIFsgLW4gIiRMSUJTIiBdOyB0aGVuCisgICAgICAgIGVjaG8gTGlicmFyaWVzLi4uCisgICAgICAgIHByaW50X2JpbmFyeV9kaWZmX2hlYWRlcgorICAgICAgICBmb3IgbCBpbiAkTElCUzsgZG8KKyAgICAgICAgICAgIGlmIFsgLWYgIiRPVEhFUl9ESVIvJGwiIF07IHRoZW4KKyAgICAgICAgICAgICAgICBjb21wYXJlX2Jpbl9maWxlICRUSElTX0RJUiAkT1RIRVJfRElSICRXT1JLX0RJUiAkbAorICAgICAgICAgICAgICAgIGlmIFsgIiQ/IiAhPSAiMCIgXTsgdGhlbgorICAgICAgICAgICAgICAgICAgICByZXR1cm5fdmFsdWU9MQorICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICBmaQorICAgICAgICBkb25lCisgICAgZmkKKworICAgIHJldHVybiAkcmV0dXJuX3ZhbHVlCit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDb21wYXJlIGFsbCBleGVjdXRhYmxlcworCitjb21wYXJlX2FsbF9leGVjcygpIHsKKyAgICBUSElTX0RJUj0kMQorICAgIE9USEVSX0RJUj0kMgorICAgIFdPUktfRElSPSQzCisKKyAgICBpZiBbICIkT1BFTkpES19UQVJHRVRfT1MiID0gIndpbmRvd3MiIF07IHRoZW4KKyAgICAgICAgRVhFQ1M9JChjZCAkVEhJU19ESVIgJiYgJEZJTkQgLiAtdHlwZSBmIC1uYW1lICcqLmV4ZScgfCAkU09SVCB8ICRGSUxURVIpCisgICAgZWxzZQorICAgICAgICBFWEVDUz0kKGNkICRUSElTX0RJUiAmJiAkRklORCAuIC1uYW1lIGRiIC1wcnVuZSAtbyAtdHlwZSBmIC1wZXJtIC0xMDAgXCEgXCggLW5hbWUgJyouc28nIC1vIC1uYW1lICcqLmR5bGliJyAtbyAtbmFtZSAnKi5kbGwnIC1vIC1uYW1lICcqLmNnaScgLW8gLW5hbWUgJyouamFyJyAtbyAtbmFtZSAnKi5kaXonIFwpIHwgJFNPUlQgfCAkRklMVEVSKQorICAgIGZpCisKKyAgICBpZiBbIC1uICIkRVhFQ1MiIF07IHRoZW4KKyAgICAgICAgZWNobyBFeGVjdXRhYmxlcy4uLgorICAgICAgICBwcmludF9iaW5hcnlfZGlmZl9oZWFkZXIKKyAgICAgICAgZm9yIGUgaW4gJEVYRUNTOyBkbworICAgICAgICAgICAgaWYgWyAtZiAiJE9USEVSX0RJUi8kZSIgXTsgdGhlbgorICAgICAgICAgICAgICAgIGNvbXBhcmVfYmluX2ZpbGUgJFRISVNfRElSICRPVEhFUl9ESVIgJFdPUktfRElSICRlCisgICAgICAgICAgICAgICAgaWYgWyAiJD8iICE9ICIwIiBdOyB0aGVuCisgICAgICAgICAgICAgICAgICAgIHJldHVybl92YWx1ZT0xCisgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIGZpCisgICAgICAgIGRvbmUKKyAgICBmaQorCisgICAgcmV0dXJuICRyZXR1cm5fdmFsdWUKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEluaXRpYXRlIGNvbmZpZ3VyYXRpb24KKworQ09NUEFSRV9ST09UPS90bXAvY2ltYWdlcy4kVVNFUgorJE1LRElSIC1wICRDT01QQVJFX1JPT1QKK2lmIFsgIiRPUEVOSkRLX1RBUkdFVF9PUyIgPSAid2luZG93cyIgXTsgdGhlbgorICAgIGlmIFsgIiQodW5hbWUgLW8pIiA9ICJDeWd3aW4iIF07IHRoZW4KKwlDT01QQVJFX1JPT1Q9JChjeWdwYXRoIC1tc2EgJENPTVBBUkVfUk9PVCkKKyAgICBmaQorZmkKKworVEhJUz0iJCggY2QgIiQoIGRpcm5hbWUgIiQwIiApIiAmJiBwd2QgKSIKK2VjaG8gIiRUSElTIgorVEhJU19TQ1JJUFQ9IiQwIgorCitpZiBbIC16ICIkMSIgXSB8fCBbICIkMSIgPSAiLWgiIF0gfHwgWyAiJDEiID0gIi0/IiBdIHx8IFsgIiQxIiA9ICIvaCIgXSB8fCBbICIkMSIgPSAiLz8iIF0gfHwgWyAiJDEiID0gIi1oZWxwIiBdIHx8IFsgIiQxIiA9ICItLWhlbHAiIF07IHRoZW4KKyAgICBlY2hvICJiYXNoIC4vY29tcGFyZS5zaCBbT1BUSU9OU10gW0ZJTFRFUl0iCisgICAgZWNobyAiIgorICAgIGVjaG8gIi1hbGwgICAgICAgICAgICAgICAgQ29tcGFyZSBhbGwgZmlsZXMgaW4gYWxsIGtub3duIHdheXMiCisgICAgZWNobyAiLW5hbWVzICAgICAgICAgICAgICBDb21wYXJlIHRoZSBmaWxlIG5hbWVzIGFuZCBkaXJlY3Rvcnkgc3RydWN0dXJlIgorICAgIGVjaG8gIi1wZXJtcyAgICAgICAgICAgICAgQ29tcGFyZSB0aGUgcGVybWlzc2lvbiBiaXRzIG9uIGFsbCBmaWxlcyBhbmQgZGlyZWN0b3JpZXMiCisgICAgZWNobyAiLXR5cGVzICAgICAgICAgICAgICBDb21wYXJlIHRoZSBvdXRwdXQgb2YgdGhlIGZpbGUgY29tbWFuZCBvbiBhbGwgZmlsZXMiCisgICAgZWNobyAiLWdlbmVyYWwgICAgICAgICAgICBDb21wYXJlIHRoZSBmaWxlcyBub3QgY29udmVyZWQgYnkgdGhlIHNwZWNpYWxpemVkIGNvbXBhcmlzb25zIgorICAgIGVjaG8gIi16aXBzICAgICAgICAgICAgICAgQ29tcGFyZSB0aGUgY29udGVudHMgb2YgYWxsIHppcCBmaWxlcyIKKyAgICBlY2hvICItamFycyAgICAgICAgICAgICAgIENvbXBhcmUgdGhlIGNvbnRlbnRzIG9mIGFsbCBqYXIgZmlsZXMiCisgICAgZWNobyAiLWxpYnMgICAgICAgICAgICAgICBDb21wYXJlIGFsbCBuYXRpdmUgbGlicmFyaWVzIgorICAgIGVjaG8gIi1leGVjcyAgICAgICAgICAgICAgQ29tcGFyZSBhbGwgZXhlY3V0YWJsZXMiCisgICAgZWNobyAiLXYgICAgICAgICAgICAgICAgICBWZXJib3NlIG91dHB1dCwgZG9lcyBub3QgaGlkZSBrbm93biBkaWZmZXJlbmNlcyIKKyAgICBlY2hvICItdnYgICAgICAgICAgICAgICAgIE1vcmUgdmVyYm9zZSBvdXRwdXQsIHNob3dzIGRpZmYgb3V0cHV0IG9mIGFsbCBjb21wYXJpc29ucyIKKyAgICBlY2hvICItbyBbT1RIRVJdICAgICAgICAgIENvbXBhcmUgd2l0aCBidWlsZCBpbiBvdGhlciBkaXJlY3RvcnkuIFdpbGwgZGVmYXVsdCB0byB0aGUgb2xkIGJ1aWxkIGRpcmVjdG9yeSIKKyAgICBlY2hvICIiCisgICAgZWNobyAiW0ZJTFRFUl0gICAgICAgICAgICBMaXN0IGZpbGVuYW1lcyBpbiB0aGUgaW1hZ2UgdG8gY29tcGFyZSwgd29ya3MgZm9yIGphcnMsIHppcHMsIGxpYnMgYW5kIGV4ZWNzIgorICAgIGVjaG8gIkV4YW1wbGU6IgorICAgIGVjaG8gImJhc2ggLi9jb21tb24vYmluL2NvbXBhcmVpbWFnZXMuc2ggQ29kZVBvaW50SU0uamFyIgorICAgIGV4aXQgMTAKK2ZpCisKK0NNUF9OQU1FUz1mYWxzZQorQ01QX1BFUk1TPWZhbHNlCitDTVBfVFlQRVM9ZmFsc2UKK0NNUF9HRU5FUkFMPWZhbHNlCitDTVBfWklQUz1mYWxzZQorQ01QX0pBUlM9ZmFsc2UKK0NNUF9MSUJTPWZhbHNlCitDTVBfRVhFQ1M9ZmFsc2UKKword2hpbGUgWyAtbiAiJDEiIF07IGRvCisgICAgY2FzZSAiJDEiIGluCisgICAgICAgIC12KQorICAgICAgICAgICAgVkVSQk9TRT10cnVlCisgICAgICAgICAgICA7OworICAgICAgICAtdnYpCisgICAgICAgICAgICBWRVJCT1NFPXRydWUKKyAgICAgICAgICAgIFNIT1dfRElGRlM9dHJ1ZQorICAgICAgICAgICAgOzsKKyAgICAgICAgLW8pCisgICAgICAgICAgICBPVEhFUj0iJDIiCisgICAgICAgICAgICBzaGlmdAorICAgICAgICAgICAgOzsKKyAgICAgICAgLWFsbCkKKyAgICAgICAgICAgIENNUF9OQU1FUz10cnVlCisgICAgICAgICAgICBpZiBbICIkT1BFTkpES19UQVJHRVRfT1MiICE9ICJ3aW5kb3dzIiBdOyB0aGVuCisgICAgICAgICAgICAgICAgQ01QX1BFUk1TPXRydWUKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgICBDTVBfVFlQRVM9dHJ1ZQorICAgICAgICAgICAgQ01QX0dFTkVSQUw9dHJ1ZQorICAgICAgICAgICAgQ01QX1pJUFM9dHJ1ZQorICAgICAgICAgICAgQ01QX0pBUlM9dHJ1ZQorICAgICAgICAgICAgQ01QX0xJQlM9dHJ1ZQorICAgICAgICAgICAgQ01QX0VYRUNTPXRydWUKKyAgICAgICAgICAgIDs7CisgICAgICAgIC1uYW1lcykKKyAgICAgICAgICAgIENNUF9OQU1FUz10cnVlCisgICAgICAgICAgICA7OworICAgICAgICAtcGVybXMpCisgICAgICAgICAgICBDTVBfUEVSTVM9dHJ1ZQorICAgICAgICAgICAgOzsKKyAgICAgICAgLXR5cGVzKQorICAgICAgICAgICAgQ01QX1RZUEVTPXRydWUKKyAgICAgICAgICAgIDs7CisgICAgICAgIC1nZW5lcmFsKQorICAgICAgICAgICAgQ01QX0dFTkVSQUw9dHJ1ZQorICAgICAgICAgICAgOzsKKyAgICAgICAgLXppcHMpCisgICAgICAgICAgICBDTVBfWklQUz10cnVlCisgICAgICAgICAgICA7OworICAgICAgICAtamFycykKKyAgICAgICAgICAgIENNUF9KQVJTPXRydWUKKyAgICAgICAgICAgIDs7CisgICAgICAgIC1saWJzKQorICAgICAgICAgICAgQ01QX0xJQlM9dHJ1ZQorICAgICAgICAgICAgOzsKKyAgICAgICAgLWV4ZWNzKQorICAgICAgICAgICAgQ01QX0VYRUNTPXRydWUKKyAgICAgICAgICAgIDs7CisgICAgICAgICopCisgICAgICAgICAgICBDTVBfTkFNRVM9ZmFsc2UKKyAgICAgICAgICAgIENNUF9QRVJNUz1mYWxzZQorICAgICAgICAgICAgQ01QX1RZUEVTPWZhbHNlCisgICAgICAgICAgICBDTVBfWklQUz10cnVlCisgICAgICAgICAgICBDTVBfSkFSUz10cnVlCisgICAgICAgICAgICBDTVBfTElCUz10cnVlCisgICAgICAgICAgICBDTVBfRVhFQ1M9dHJ1ZQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiBbIC16ICIkRklMVEVSIiBdOyB0aGVuCisgICAgICAgICAgICAgICAgRklMVEVSPSIkR1JFUCIKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgICBGSUxURVI9IiRGSUxURVIgLWUgJDEiCisgICAgICAgICAgICA7OworICAgIGVzYWMKKyAgICBzaGlmdAorZG9uZQorCitpZiBbICIkQ01QX05BTUVTIiA9ICJmYWxzZSIgXSAmJiBbICIkQ01QX1RZUEVTIiA9ICJmYWxzZSIgXSAmJiBbICIkQ01QX1BFUk1TIiA9ICJmYWxzZSIgXSAmJiBbICIkQ01QX0dFTkVSQUwiID0gImZhbHNlIiBdICYmIFsgIiRDTVBfWklQUyIgPSAiZmFsc2UiIF0gJiYgWyAiJENNUF9KQVJTIiA9ICJmYWxzZSIgXSAmJiBbICIkQ01QX0xJQlMiID0gImZhbHNlIiBdICYmIFsgIiRDTVBfRVhFQ1MiID0gImZhbHNlIiBdOyB0aGVuCisgICAgQ01QX05BTUVTPXRydWUKKyAgICBDTVBfUEVSTVM9dHJ1ZQorICAgIENNUF9UWVBFUz10cnVlCisgICAgQ01QX0dFTkVSQUw9dHJ1ZQorICAgIENNUF9aSVBTPXRydWUKKyAgICBDTVBfSkFSUz10cnVlCisgICAgQ01QX0xJQlM9dHJ1ZQorICAgIENNUF9FWEVDUz10cnVlCitmaQorCitpZiBbIC16ICIkRklMVEVSIiBdOyB0aGVuCisgICAgRklMVEVSPSIkQ0FUIgorZmkKKworaWYgWyAteiAiJE9USEVSIiBdOyB0aGVuCisgICAgT1RIRVI9IiRUSElTLy4uLyRMRUdBQ1lfQlVJTERfRElSIgorICAgIGlmIFsgLWQgIiRPVEhFUiIgXTsgdGhlbgorICAgICAgICBPVEhFUj0iJCggY2QgIiRPVEhFUiIgJiYgcHdkICkiCisgICAgZWxzZQorICAgICAgICBlY2hvICJEZWZhdWx0IG9sZCBidWlsZCBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3Q6IgorICAgICAgICBlY2hvICIkT1RIRVIiCisgICAgICAgIGV4aXQgMQorICAgIGZpCisgICAgZWNobyAiQ29tcGFyaW5nIHRvIGRlZmF1bHQgb2xkIGJ1aWxkOiIKKyAgICBlY2hvICIkT1RIRVIiCisgICAgZWNobworZWxzZQorICAgIGlmIFsgISAtZCAiJE9USEVSIiBdOyB0aGVuCisgICAgICAgIGVjaG8gIk90aGVyIGJ1aWxkIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdDoiCisgICAgICAgIGVjaG8gIiRPVEhFUiIKKyAgICAgICAgZXhpdCAxCisgICAgZmkKKyAgICBPVEhFUj0iJCggY2QgIiRPVEhFUiIgJiYgcHdkICkiCisgICAgZWNobyAiQ29tcGFyaW5nIHRvOiIKKyAgICBlY2hvICIkT1RIRVIiCisgICAgZWNobworZmkKKworCisjIEZpZ3VyZSBvdXQgdGhlIGxheW91dCBvZiB0aGUgdGhpcyBidWlsZC4gV2hpY2gga2luZHMgb2YgaW1hZ2VzIGhhdmUgYmVlbiBwcm9kdWNlZAoraWYgWyAtZCAiJFRISVMvZGVwbG95L2oyc2RrLWltYWdlIiBdOyB0aGVuCisgICAgVEhJU19KMlNESz0iJFRISVMvZGVwbG95L2oyc2RrLWltYWdlIgorICAgIFRISVNfSjJSRT0iJFRISVMvZGVwbG95L2oycmUtaW1hZ2UiCitlbGlmIFsgLWQgIiRUSElTL2ltYWdlcy9qMnNkay1pbWFnZSIgXTsgdGhlbgorICAgIFRISVNfSjJTREs9IiRUSElTL2ltYWdlcy9qMnNkay1pbWFnZSIKKyAgICBUSElTX0oyUkU9IiRUSElTL2ltYWdlcy9qMnJlLWltYWdlIgorZmkKK2lmIFsgLWQgIiRUSElTL2ltYWdlcy9qMnNkay1vdmVybGF5LWltYWdlIiBdOyB0aGVuCisgICAgVEhJU19KMlNES19PVkVSTEFZPSIkVEhJUy9pbWFnZXMvajJzZGstb3ZlcmxheS1pbWFnZSIKKyAgICBUSElTX0oyUkVfT1ZFUkxBWT0iJFRISVMvaW1hZ2VzL2oycmUtb3ZlcmxheS1pbWFnZSIKK2ZpCisKK2lmIFsgLWQgIiRUSElTL2ltYWdlcy9qMnNkay1idW5kbGUiIF07IHRoZW4KKyAgICBUSElTX0oyU0RLX0JVTkRMRT0iJFRISVMvaW1hZ2VzL2oyc2RrLWJ1bmRsZSIKKyAgICBUSElTX0oyUkVfQlVORExFPSIkVEhJUy9pbWFnZXMvajJyZS1idW5kbGUiCitmaQorCisjIEZpZ3VyZSBvdXQgdGhlIGxheW91dCBvZiB0aGUgb3RoZXIgYnVpbGQgKG9sZCBvciBuZXcsIG5vcm1hbCBvciBvdmVybGF5IGltYWdlKQoraWYgWyAtZCAiJE9USEVSL2oyc2RrLWltYWdlIiBdOyB0aGVuCisgICAgaWYgWyAtZiAiJE9USEVSL2oyc2RrLWltYWdlL0xJQ0VOU0UiIF07IHRoZW4KKyAgICAgICAgT1RIRVJfSjJTREs9IiRPVEhFUi9qMnNkay1pbWFnZSIKKyAgICAgICAgT1RIRVJfSjJSRT0iJE9USEVSL2oycmUtaW1hZ2UiCisgICAgZWxzZQorICAgICAgICBPVEhFUl9KMlNES19PVkVSTEFZPSIkT1RIRVIvajJzZGstaW1hZ2UiCisgICAgICAgIE9USEVSX0oyUkVfT1ZFUkxBWT0iJE9USEVSL2oycmUtaW1hZ2UiCisgICAgZmkKKworZmkKKworaWYgWyAtZCAiJE9USEVSL2oyc2RrLWJ1bmRsZSIgXTsgdGhlbgorICAgIE9USEVSX0oyU0RLX0JVTkRMRT0iJE9USEVSL2oyc2RrLWJ1bmRsZSIKKyAgICBPVEhFUl9KMlJFX0JVTkRMRT0iJE9USEVSL2oycmUtYnVuZGxlIgorZWxpZiBbIC1kICIkT1RIRVIvaW1hZ2VzL2oyc2RrLWJ1bmRsZSIgXTsgdGhlbgorICAgIE9USEVSX0oyU0RLX0JVTkRMRT0iJE9USEVSL2ltYWdlcy9qMnNkay1idW5kbGUiCisgICAgT1RIRVJfSjJSRV9CVU5ETEU9IiRPVEhFUi9pbWFnZXMvajJyZS1idW5kbGUiCitmaQorCitpZiBbIC16ICIkVEhJU19KMlNESyIgXSB8fCBbIC16ICIkVEhJU19KMlJFIiBdOyB0aGVuCisgICAgaWYgWyAteiAiJFRISVNfSjJTREtfT1ZFUkxBWSIgXTsgdGhlbgorICAgICAgICBlY2hvICJDYW5ub3QgbG9jYXRlIGltYWdlcyBmb3IgdGhpcyBidWlsZC4gQXJlIHlvdSBzdXJlIHlvdSBoYXZlIHJ1biAnbWFrZSBpbWFnZXMnPyIKKyAgICAgICAgZXhpdCAxCisgICAgZmkKK2ZpCisKK2lmIFsgLXogIiRPVEhFUl9KMlNESyIgXSAmJiBbIC1uICIkT1RIRVJfSjJTREtfT1ZFUkxBWSIgXSAmJiBbIC16ICIkVEhJU19KMlNES19PVkVSTEFZIiBdOyB0aGVuCisgICAgZWNobyAiT1RIRVIgYnVpbGQgb25seSBoYXMgYW4gb3ZlcmxheSBpbWFnZSB3aGlsZSB0aGlzIGJ1aWxkIGRvZXMgbm90LiBOb3RoaW5nIHRvIGNvbXBhcmUhIgorICAgIGV4aXQgMQorZmkKKworaWYgWyAteiAiJFRISVNfSjJTREtfQlVORExFIiBdICYmIFsgLW4gIiRPVEhFUl9KMlNES19CVU5ETEUiIF07IHRoZW4KKyAgICBlY2hvICJXQVJOSU5HISBPVEhFUiBidWlsZCBoYXMgYnVuZGxlcyBidWlsdCB3aGlsZSB0aGlzIGJ1aWxkIGRvZXMgbm90LiIKKyAgICBlY2hvICJTa2lwcGluZyBidW5kbGUgY29tcGFyZSEiCitmaQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgRG8gdGhlIHdvcmsKKworaWYgWyAiJENNUF9OQU1FUyIgPSAidHJ1ZSIgXTsgdGhlbgorICAgIGlmIFsgLW4gIiRUSElTX0oyU0RLIiBdICYmIFsgLW4gIiRPVEhFUl9KMlNESyIgXTsgdGhlbgorICAgICAgICBlY2hvIC1uICJKMlNESyAiCisgICAgICAgIGNvbXBhcmVfZGlycyAkVEhJU19KMlNESyAkT1RIRVJfSjJTREsgJENPTVBBUkVfUk9PVC9qMnNkaworICAgICAgICBlY2hvIC1uICJKMlJFICAiCisgICAgICAgIGNvbXBhcmVfZGlycyAkVEhJU19KMlJFICRPVEhFUl9KMlJFICRDT01QQVJFX1JPT1QvajJyZQorICAgICAgICAKKyAgICAgICAgZWNobyAtbiAiSjJTREsgIgorICAgICAgICBjb21wYXJlX2ZpbGVzICRUSElTX0oyU0RLICRPVEhFUl9KMlNESyAkQ09NUEFSRV9ST09UL2oyc2RrCisgICAgICAgIGVjaG8gLW4gIkoyUkUgICIKKyAgICAgICAgY29tcGFyZV9maWxlcyAkVEhJU19KMlJFICRPVEhFUl9KMlJFICRDT01QQVJFX1JPT1QvajJyZQorICAgIGZpCisgICAgaWYgWyAtbiAiJFRISVNfSjJTREtfT1ZFUkxBWSIgXSAmJiBbIC1uICIkT1RIRVJfSjJTREtfT1ZFUkxBWSIgXTsgdGhlbgorICAgICAgICBlY2hvIC1uICJKMlNESyBPdmVybGF5ICIKKyAgICAgICAgY29tcGFyZV9kaXJzICRUSElTX0oyU0RLX09WRVJMQVkgJE9USEVSX0oyU0RLX09WRVJMQVkgJENPTVBBUkVfUk9PVC9qMnNkay1vdmVybGF5CisgICAgICAgIGVjaG8gLW4gIkoyUkUgIE92ZXJsYXkgIgorICAgICAgICBjb21wYXJlX2RpcnMgJFRISVNfSjJSRV9PVkVSTEFZICRPVEhFUl9KMlJFX09WRVJMQVkgJENPTVBBUkVfUk9PVC9qMnJlLW92ZXJsYXkKKyAgICAgICAgCisgICAgICAgIGVjaG8gLW4gIkoyU0RLIE92ZXJsYXkgIgorICAgICAgICBjb21wYXJlX2ZpbGVzICRUSElTX0oyU0RLX09WRVJMQVkgJE9USEVSX0oyU0RLX09WRVJMQVkgJENPTVBBUkVfUk9PVC9qMnNkay1vdmVybGF5CisgICAgICAgIGVjaG8gLW4gIkoyUkUgIE92ZXJsYXkgIgorICAgICAgICBjb21wYXJlX2ZpbGVzICRUSElTX0oyUkVfT1ZFUkxBWSAkT1RIRVJfSjJSRV9PVkVSTEFZICRDT01QQVJFX1JPT1QvajJyZS1vdmVybGF5CisgICAgZmkKKyAgICBpZiBbIC1uICIkVEhJU19KMlNES19CVU5ETEUiIF0gJiYgWyAtbiAiJE9USEVSX0oyU0RLX0JVTkRMRSIgXTsgdGhlbgorICAgICAgICBlY2hvIC1uICJKMlNESyBCdW5kbGUgIgorICAgICAgICBjb21wYXJlX2RpcnMgJFRISVNfSjJTREtfQlVORExFICRPVEhFUl9KMlNES19CVU5ETEUgJENPTVBBUkVfUk9PVC9qMnNkay1idW5kbGUKKyAgICAgICAgZWNobyAtbiAiSjJSRSAgQnVuZGxlICIKKyAgICAgICAgY29tcGFyZV9kaXJzICRUSElTX0oyUkVfQlVORExFICRPVEhFUl9KMlJFX0JVTkRMRSAkQ09NUEFSRV9ST09UL2oycmUtYnVuZGxlCisgICAgICAgIAorICAgICAgICBlY2hvIC1uICJKMlNESyBCdW5kbGUgIgorICAgICAgICBjb21wYXJlX2ZpbGVzICRUSElTX0oyU0RLX0JVTkRMRSAkT1RIRVJfSjJTREtfQlVORExFICRDT01QQVJFX1JPT1QvajJzZGstYnVuZGxlCisgICAgICAgIGVjaG8gLW4gIkoyUkUgIEJ1bmRsZSAiCisgICAgICAgIGNvbXBhcmVfZmlsZXMgJFRISVNfSjJSRV9CVU5ETEUgJE9USEVSX0oyUkVfQlVORExFICRDT01QQVJFX1JPT1QvajJyZS1idW5kbGUKKyAgICBmaQorZmkKKworaWYgWyAiJENNUF9QRVJNUyIgPSAidHJ1ZSIgXTsgdGhlbgorICAgIGlmIFsgLW4gIiRUSElTX0oyU0RLIiBdICYmIFsgLW4gIiRPVEhFUl9KMlNESyIgXTsgdGhlbgorICAgICAgICBlY2hvIC1uICJKMlNESyAiCisgICAgICAgIGNvbXBhcmVfcGVybWlzc2lvbnMgJFRISVNfSjJTREsgJE9USEVSX0oyU0RLICRDT01QQVJFX1JPT1QvajJzZGsKKyAgICAgICAgZWNobyAtbiAiSjJSRSAgIgorICAgICAgICBjb21wYXJlX3Blcm1pc3Npb25zICRUSElTX0oyUkUgJE9USEVSX0oyUkUgJENPTVBBUkVfUk9PVC9qMnJlCisgICAgZmkKKyAgICBpZiBbIC1uICIkVEhJU19KMlNES19PVkVSTEFZIiBdICYmIFsgLW4gIiRPVEhFUl9KMlNES19PVkVSTEFZIiBdOyB0aGVuCisgICAgICAgIGVjaG8gLW4gIkoyU0RLIE92ZXJsYXkgIgorICAgICAgICBjb21wYXJlX3Blcm1pc3Npb25zICRUSElTX0oyU0RLX09WRVJMQVkgJE9USEVSX0oyU0RLX09WRVJMQVkgJENPTVBBUkVfUk9PVC9qMnNkay1vdmVybGF5CisgICAgICAgIGVjaG8gLW4gIkoyUkUgIE92ZXJsYXkgIgorICAgICAgICBjb21wYXJlX3Blcm1pc3Npb25zICRUSElTX0oyUkVfT1ZFUkxBWSAkT1RIRVJfSjJSRV9PVkVSTEFZICRDT01QQVJFX1JPT1QvajJyZS1vdmVybGF5CisgICAgZmkKKyAgICBpZiBbIC1uICIkVEhJU19KMlNES19CVU5ETEUiIF0gJiYgWyAtbiAiJE9USEVSX0oyU0RLX0JVTkRMRSIgXTsgdGhlbgorICAgICAgICBlY2hvIC1uICJKMlNESyBCdW5kbGUgIgorICAgICAgICBjb21wYXJlX3Blcm1pc3Npb25zICRUSElTX0oyU0RLX0JVTkRMRSAkT1RIRVJfSjJTREtfQlVORExFICRDT01QQVJFX1JPT1QvajJzZGstYnVuZGxlCisgICAgICAgIGVjaG8gLW4gIkoyUkUgIEJ1bmRsZSAiCisgICAgICAgIGNvbXBhcmVfcGVybWlzc2lvbnMgJFRISVNfSjJSRV9CVU5ETEUgJE9USEVSX0oyUkVfQlVORExFICRDT01QQVJFX1JPT1QvajJyZS1idW5kbGUKKyAgICBmaQorZmkKKworaWYgWyAiJENNUF9UWVBFUyIgPSAidHJ1ZSIgXTsgdGhlbgorICAgIGlmIFsgLW4gIiRUSElTX0oyU0RLIiBdICYmIFsgLW4gIiRPVEhFUl9KMlNESyIgXTsgdGhlbgorICAgICAgICBlY2hvIC1uICJKMlNESyAiCisgICAgICAgIGNvbXBhcmVfZmlsZV90eXBlcyAkVEhJU19KMlNESyAkT1RIRVJfSjJTREsgJENPTVBBUkVfUk9PVC9qMnNkaworICAgICAgICBlY2hvIC1uICJKMlJFICAiCisgICAgICAgIGNvbXBhcmVfZmlsZV90eXBlcyAkVEhJU19KMlJFICRPVEhFUl9KMlJFICRDT01QQVJFX1JPT1QvajJyZQorICAgIGZpCisgICAgaWYgWyAtbiAiJFRISVNfSjJTREtfT1ZFUkxBWSIgXSAmJiBbIC1uICIkT1RIRVJfSjJTREtfT1ZFUkxBWSIgXTsgdGhlbgorICAgICAgICBlY2hvIC1uICJKMlNESyBPdmVybGF5ICIKKyAgICAgICAgY29tcGFyZV9maWxlX3R5cGVzICRUSElTX0oyU0RLX09WRVJMQVkgJE9USEVSX0oyU0RLX09WRVJMQVkgJENPTVBBUkVfUk9PVC9qMnNkay1vdmVybGF5CisgICAgICAgIGVjaG8gLW4gIkoyUkUgIE92ZXJsYXkgIgorICAgICAgICBjb21wYXJlX2ZpbGVfdHlwZXMgJFRISVNfSjJSRV9PVkVSTEFZICRPVEhFUl9KMlJFX09WRVJMQVkgJENPTVBBUkVfUk9PVC9qMnJlLW92ZXJsYXkKKyAgICBmaQorICAgIGlmIFsgLW4gIiRUSElTX0oyU0RLX0JVTkRMRSIgXSAmJiBbIC1uICIkT1RIRVJfSjJTREtfQlVORExFIiBdOyB0aGVuCisgICAgICAgIGVjaG8gLW4gIkoyU0RLIEJ1bmRsZSAiCisgICAgICAgIGNvbXBhcmVfZmlsZV90eXBlcyAkVEhJU19KMlNES19CVU5ETEUgJE9USEVSX0oyU0RLX0JVTkRMRSAkQ09NUEFSRV9ST09UL2oyc2RrLWJ1bmRsZQorICAgICAgICBlY2hvIC1uICJKMlJFICBCdW5kbGUgIgorICAgICAgICBjb21wYXJlX2ZpbGVfdHlwZXMgJFRISVNfSjJSRV9CVU5ETEUgJE9USEVSX0oyUkVfQlVORExFICRDT01QQVJFX1JPT1QvajJyZS1idW5kbGUKKyAgICBmaQorZmkKKworaWYgWyAiJENNUF9HRU5FUkFMIiA9ICJ0cnVlIiBdOyB0aGVuCisgICAgaWYgWyAtbiAiJFRISVNfSjJTREsiIF0gJiYgWyAtbiAiJE9USEVSX0oyU0RLIiBdOyB0aGVuCisgICAgICAgIGVjaG8gLW4gIkoyU0RLICIKKyAgICAgICAgY29tcGFyZV9nZW5lcmFsX2ZpbGVzICRUSElTX0oyU0RLICRPVEhFUl9KMlNESyAkQ09NUEFSRV9ST09UL2oyc2RrCisgICAgICAgIGVjaG8gLW4gIkoyUkUgICIKKyAgICAgICAgY29tcGFyZV9nZW5lcmFsX2ZpbGVzICRUSElTX0oyUkUgJE9USEVSX0oyUkUgJENPTVBBUkVfUk9PVC9qMnJlCisgICAgZmkKKyAgICBpZiBbIC1uICIkVEhJU19KMlNES19PVkVSTEFZIiBdICYmIFsgLW4gIiRPVEhFUl9KMlNES19PVkVSTEFZIiBdOyB0aGVuCisgICAgICAgIGVjaG8gLW4gIkoyU0RLIE92ZXJsYXkgIgorICAgICAgICBjb21wYXJlX2dlbmVyYWxfZmlsZXMgJFRISVNfSjJTREtfT1ZFUkxBWSAkT1RIRVJfSjJTREtfT1ZFUkxBWSAkQ09NUEFSRV9ST09UL2oyc2RrLW92ZXJsYXkKKyAgICAgICAgZWNobyAtbiAiSjJSRSAgT3ZlcmxheSAiCisgICAgICAgIGNvbXBhcmVfZ2VuZXJhbF9maWxlcyAkVEhJU19KMlJFX09WRVJMQVkgJE9USEVSX0oyUkVfT1ZFUkxBWSAkQ09NUEFSRV9ST09UL2oycmUtb3ZlcmxheQorICAgIGZpCisgICAgaWYgWyAtbiAiJFRISVNfSjJTREtfQlVORExFIiBdICYmIFsgLW4gIiRPVEhFUl9KMlNES19CVU5ETEUiIF07IHRoZW4KKyAgICAgICAgZWNobyAtbiAiSjJTREsgQnVuZGxlICIKKyAgICAgICAgY29tcGFyZV9nZW5lcmFsX2ZpbGVzICRUSElTX0oyU0RLX0JVTkRMRSAkT1RIRVJfSjJTREtfQlVORExFICRDT01QQVJFX1JPT1QvajJzZGstYnVuZGxlCisgICAgICAgIGVjaG8gLW4gIkoyUkUgIEJ1bmRsZSAiCisgICAgICAgIGNvbXBhcmVfZ2VuZXJhbF9maWxlcyAkVEhJU19KMlJFX0JVTkRMRSAkT1RIRVJfSjJSRV9CVU5ETEUgJENPTVBBUkVfUk9PVC9qMnJlLWJ1bmRsZQorICAgIGZpCitmaQorCitpZiBbICIkQ01QX1pJUFMiID0gInRydWUiIF07IHRoZW4KKyAgICBpZiBbIC1uICIkVEhJU19KMlNESyIgXSAmJiBbIC1uICIkT1RIRVJfSjJTREsiIF07IHRoZW4KKyAgICAgICAgY29tcGFyZV9hbGxfemlwX2ZpbGVzICRUSElTX0oyU0RLICRPVEhFUl9KMlNESyAkQ09NUEFSRV9ST09UL2oyc2RrCisgICAgZmkKK2ZpCisKK2lmIFsgIiRDTVBfSkFSUyIgPSAidHJ1ZSIgXTsgdGhlbgorICAgIGlmIFsgLW4gIiRUSElTX0oyU0RLIiBdICYmIFsgLW4gIiRPVEhFUl9KMlNESyIgXTsgdGhlbgorICAgICAgICBjb21wYXJlX2FsbF9qYXJfZmlsZXMgJFRISVNfSjJTREsgJE9USEVSX0oyU0RLICRDT01QQVJFX1JPT1QvajJzZGsKKyAgICBmaQorZmkKKworaWYgWyAiJENNUF9MSUJTIiA9ICJ0cnVlIiBdOyB0aGVuCisgICAgaWYgWyAtbiAiJFRISVNfSjJTREsiIF0gJiYgWyAtbiAiJE9USEVSX0oyU0RLIiBdOyB0aGVuCisgICAgICAgIGNvbXBhcmVfYWxsX2xpYnMgJFRISVNfSjJTREsgJE9USEVSX0oyU0RLICRDT01QQVJFX1JPT1QvajJzZGsKKyAgICBmaQorICAgIGlmIFsgLW4gIiRUSElTX0oyU0RLX09WRVJMQVkiIF0gJiYgWyAtbiAiJE9USEVSX0oyU0RLX09WRVJMQVkiIF07IHRoZW4KKyAgICAgICAgZWNobyAtbiAiQnVuZGxlICAgIgorICAgICAgICBjb21wYXJlX2FsbF9saWJzICRUSElTX0oyU0RLX09WRVJMQVkgJE9USEVSX0oyU0RLX09WRVJMQVkgJENPTVBBUkVfUk9PVC9qMnNkay1vdmVybGF5CisgICAgZmkKK2ZpCisKK2lmIFsgIiRDTVBfRVhFQ1MiID0gInRydWUiIF07IHRoZW4KKyAgICBpZiBbIC1uICIkVEhJU19KMlNESyIgXSAmJiBbIC1uICIkT1RIRVJfSjJTREsiIF07IHRoZW4KKyAgICAgICAgY29tcGFyZV9hbGxfZXhlY3MgJFRISVNfSjJTREsgJE9USEVSX0oyU0RLICRDT01QQVJFX1JPT1QvajJzZGsKKyAgICBmaQorICAgIGlmIFsgLW4gIiRUSElTX0oyU0RLX09WRVJMQVkiIF0gJiYgWyAtbiAiJE9USEVSX0oyU0RLX09WRVJMQVkiIF07IHRoZW4KKyAgICAgICAgZWNobyAtbiAiT3ZlcmxheSAiCisgICAgICAgIGNvbXBhcmVfYWxsX2V4ZWNzICRUSElTX0oyU0RLX09WRVJMQVkgJE9USEVSX0oyU0RLX09WRVJMQVkgJENPTVBBUkVfUk9PVC9qMnNkay1vdmVybGF5CisgICAgZmkKK2ZpCisKK2VjaG8KKworaWYgWyAtbiAiJFJFR1JFU1NJT05TIiBdOyB0aGVuCisgICAgZWNobyAiUkVHUkVTU0lPTlMgRk9VTkQhIgorICAgIGVjaG8KKyAgICBleGl0IDEKK2Vsc2UKKyAgICBlY2hvICJObyByZWdyZXNzaW9ucyBmb3VuZCIKKyAgICBlY2hvCisgICAgZXhpdCAwCitmaQpkaWZmIC0tZ2l0IGEvY29tbW9uL2Jpbi9jb21wYXJlX2V4Y2VwdGlvbnMuc2guaW5jbCBiL2NvbW1vbi9iaW4vY29tcGFyZV9leGNlcHRpb25zLnNoLmluY2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UyOTQ2ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9iaW4vY29tcGFyZV9leGNlcHRpb25zLnNoLmluY2wKQEAgLTAsMCArMSw5MzUgQEAKKyMhL2Jpbi9iYXNoCisjCisjIENvcHlyaWdodCAoYykgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorIworIyBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisjIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorIyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyMgYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorIyAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyMKKyMgUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyMgb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQorIyBxdWVzdGlvbnMuCisjCisKKyMgVGhpcyBzY3JpcHQgaXMgbm90IHRvIGJlIHJ1biBhcyBzdGFuZC1hbG9uZSwgaXQgc2hvdWxkIGJlIGluY2x1ZGVkIGZyb20KKyMgY29tcGFyZS5zaC4KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENoZWNrIHRoYXQgd2UgYXJlIHJ1biB2aWEgaW5jbHVzaW9uIGZyb20gY29tcGFyZS5zaCBhbmQgbm90IGFzIHN0YW5kLWFsb25lLgoraWYgWyAteiAiJENPTVBBUkVfRVhDRVBUSU9OU19JTkNMVURFIiBdOyB0aGVuCisgICAgZWNobyAiRXJyb3I6IFRoaXMgc2NyaXB0IHNob3VsZCBub3QgYmUgcnVuIGFzIHN0YW5kLWFsb25lLiBJdCBpcyBpbmNsdWRlZCBieSBjb21wYXJlLnNoIgorICAgIGV4aXQgMQorZmkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIERpZmYgZXhjZXB0aW9ucworCitpZiBbICIkT1BFTkpES19UQVJHRVRfT1MiID0gImxpbnV4IiBdICYmIFsgIiRPUEVOSkRLX1RBUkdFVF9DUFUiID0gIng4NiIgXTsgdGhlbgorCitTVFJJUF9CRUZPUkVfQ09NUEFSRT0iCisuL2RlbW8vanZtdGkvY29tcGlsZWRNZXRob2RMb2FkL2xpYi9saWJjb21waWxlZE1ldGhvZExvYWQuc28KKy4vZGVtby9qdm10aS9nY3Rlc3QvbGliL2xpYmdjdGVzdC5zbworLi9kZW1vL2p2bXRpL2hlYXBUcmFja2VyL2xpYi9saWJoZWFwVHJhY2tlci5zbworLi9kZW1vL2p2bXRpL2hlYXBWaWV3ZXIvbGliL2xpYmhlYXBWaWV3ZXIuc28KKy4vZGVtby9qdm10aS9ocHJvZi9saWIvbGliaHByb2Yuc28KKy4vZGVtby9qdm10aS9taW5zdC9saWIvbGlibWluc3Quc28KKy4vZGVtby9qdm10aS9tdHJhY2UvbGliL2xpYm10cmFjZS5zbworLi9kZW1vL2p2bXRpL3ZlcnNpb25DaGVjay9saWIvbGlidmVyc2lvbkNoZWNrLnNvCisuL2RlbW8vanZtdGkvd2FpdGVycy9saWIvbGlid2FpdGVycy5zbworIgorCitBQ0NFUFRFRF9CSU5fRElGRj0iCisuL2RlbW8vanZtdGkvY29tcGlsZWRNZXRob2RMb2FkL2xpYi9saWJjb21waWxlZE1ldGhvZExvYWQuc28KKy4vZGVtby9qdm10aS9nY3Rlc3QvbGliL2xpYmdjdGVzdC5zbworLi9kZW1vL2p2bXRpL2hlYXBUcmFja2VyL2xpYi9saWJoZWFwVHJhY2tlci5zbworLi9kZW1vL2p2bXRpL2hlYXBWaWV3ZXIvbGliL2xpYmhlYXBWaWV3ZXIuc28KKy4vZGVtby9qdm10aS9ocHJvZi9saWIvbGliaHByb2Yuc28KKy4vZGVtby9qdm10aS9taW5zdC9saWIvbGlibWluc3Quc28KKy4vZGVtby9qdm10aS9tdHJhY2UvbGliL2xpYm10cmFjZS5zbworLi9kZW1vL2p2bXRpL3ZlcnNpb25DaGVjay9saWIvbGlidmVyc2lvbkNoZWNrLnNvCisuL2RlbW8vanZtdGkvd2FpdGVycy9saWIvbGlid2FpdGVycy5zbworLi9qcmUvbGliL2kzODYvY2xpZW50L2xpYmp2bS5zbworLi9qcmUvbGliL2kzODYvbGliYXR0YWNoLnNvCisuL2pyZS9saWIvaTM4Ni9saWJkdF9zb2NrZXQuc28KKy4vanJlL2xpYi9pMzg2L2xpYmhwcm9mLnNvCisuL2pyZS9saWIvaTM4Ni9saWJpbnN0cnVtZW50LnNvCisuL2pyZS9saWIvaTM4Ni9saWJqYXZhX2Nyd19kZW1vLnNvCisuL2pyZS9saWIvaTM4Ni9saWJqc2R0LnNvCisuL2pyZS9saWIvaTM4Ni9saWJtYW5hZ2VtZW50LnNvCisuL2pyZS9saWIvaTM4Ni9saWJucHQuc28KKy4vanJlL2xpYi9pMzg2L2xpYnZlcmlmeS5zbworLi9qcmUvbGliL2kzODYvc2VydmVyL2xpYmp2bS5zbworLi9iaW4vYXBwbGV0dmlld2VyCisuL2Jpbi9leHRjaGVjaworLi9iaW4vaWRsagorLi9iaW4vamFyCisuL2Jpbi9qYXJzaWduZXIKKy4vYmluL2phdmEKKy4vYmluL2phdmFjCisuL2Jpbi9qYXZhZG9jCisuL2Jpbi9qYXZhaAorLi9iaW4vamF2YXAKKy4vYmluL2pjbWQKKy4vYmluL2pjb25zb2xlCisuL2Jpbi9qZGIKKy4vYmluL2poYXQKKy4vYmluL2ppbmZvCisuL2Jpbi9qbWFwCisuL2Jpbi9qcHMKKy4vYmluL2pydW5zY3JpcHQKKy4vYmluL2pzYWRlYnVnZAorLi9iaW4vanN0YWNrCisuL2Jpbi9qc3RhdAorLi9iaW4vanN0YXRkCisuL2Jpbi9rZXl0b29sCisuL2Jpbi9uYXRpdmUyYXNjaWkKKy4vYmluL29yYmQKKy4vYmluL3BhY2syMDAKKy4vYmluL3BvbGljeXRvb2wKKy4vYmluL3JtaWMKKy4vYmluL3JtaWQKKy4vYmluL3JtaXJlZ2lzdHJ5CisuL2Jpbi9zY2hlbWFnZW4KKy4vYmluL3NlcmlhbHZlcgorLi9iaW4vc2VydmVydG9vbAorLi9iaW4vdG5hbWVzZXJ2CisuL2Jpbi93c2dlbgorLi9iaW4vd3NpbXBvcnQKKy4vYmluL3hqYworLi9qcmUvYmluL2phdmEKKy4vanJlL2Jpbi9rZXl0b29sCisuL2pyZS9iaW4vb3JiZAorLi9qcmUvYmluL3BhY2syMDAKKy4vanJlL2Jpbi9wb2xpY3l0b29sCisuL2pyZS9iaW4vcm1pZAorLi9qcmUvYmluL3JtaXJlZ2lzdHJ5CisuL2pyZS9iaW4vc2VydmVydG9vbAorLi9qcmUvYmluL3RuYW1lc2VydgorIgorCitmaQorCitpZiBbICIkT1BFTkpES19UQVJHRVRfT1MiID0gImxpbnV4IiBdICYmIFsgIiRPUEVOSkRLX1RBUkdFVF9DUFUiID0gIng4Nl82NCIgXTsgdGhlbgorCitTVFJJUF9CRUZPUkVfQ09NUEFSRT0iCisuL2RlbW8vanZtdGkvY29tcGlsZWRNZXRob2RMb2FkL2xpYi9saWJjb21waWxlZE1ldGhvZExvYWQuc28KKy4vZGVtby9qdm10aS9nY3Rlc3QvbGliL2xpYmdjdGVzdC5zbworLi9kZW1vL2p2bXRpL2hlYXBUcmFja2VyL2xpYi9saWJoZWFwVHJhY2tlci5zbworLi9kZW1vL2p2bXRpL2hlYXBWaWV3ZXIvbGliL2xpYmhlYXBWaWV3ZXIuc28KKy4vZGVtby9qdm10aS9ocHJvZi9saWIvbGliaHByb2Yuc28KKy4vZGVtby9qdm10aS9taW5zdC9saWIvbGlibWluc3Quc28KKy4vZGVtby9qdm10aS9tdHJhY2UvbGliL2xpYm10cmFjZS5zbworLi9kZW1vL2p2bXRpL3ZlcnNpb25DaGVjay9saWIvbGlidmVyc2lvbkNoZWNrLnNvCisuL2RlbW8vanZtdGkvd2FpdGVycy9saWIvbGlid2FpdGVycy5zbworIgorCitBQ0NFUFRFRF9CSU5fRElGRj0iCisuL2RlbW8vanZtdGkvY29tcGlsZWRNZXRob2RMb2FkL2xpYi9saWJjb21waWxlZE1ldGhvZExvYWQuc28KKy4vZGVtby9qdm10aS9nY3Rlc3QvbGliL2xpYmdjdGVzdC5zbworLi9kZW1vL2p2bXRpL2hlYXBUcmFja2VyL2xpYi9saWJoZWFwVHJhY2tlci5zbworLi9kZW1vL2p2bXRpL2hlYXBWaWV3ZXIvbGliL2xpYmhlYXBWaWV3ZXIuc28KKy4vZGVtby9qdm10aS9ocHJvZi9saWIvbGliaHByb2Yuc28KKy4vZGVtby9qdm10aS9taW5zdC9saWIvbGlibWluc3Quc28KKy4vZGVtby9qdm10aS9tdHJhY2UvbGliL2xpYm10cmFjZS5zbworLi9kZW1vL2p2bXRpL3ZlcnNpb25DaGVjay9saWIvbGlidmVyc2lvbkNoZWNrLnNvCisuL2RlbW8vanZtdGkvd2FpdGVycy9saWIvbGlid2FpdGVycy5zbworLi9qcmUvbGliL2FtZDY0L2xpYmF0dGFjaC5zbworLi9qcmUvbGliL2FtZDY0L2xpYmR0X3NvY2tldC5zbworLi9qcmUvbGliL2FtZDY0L2xpYmhwcm9mLnNvCisuL2pyZS9saWIvYW1kNjQvbGliaW5zdHJ1bWVudC5zbworLi9qcmUvbGliL2FtZDY0L2xpYmphdmFfY3J3X2RlbW8uc28KKy4vanJlL2xpYi9hbWQ2NC9saWJqc2R0LnNvCisuL2pyZS9saWIvYW1kNjQvbGlianNpZy5zbworLi9qcmUvbGliL2FtZDY0L2xpYm1hbmFnZW1lbnQuc28KKy4vanJlL2xpYi9hbWQ2NC9saWJucHQuc28KKy4vanJlL2xpYi9hbWQ2NC9saWJzYXByb2Muc28KKy4vanJlL2xpYi9hbWQ2NC9saWJ2ZXJpZnkuc28KKy4vanJlL2xpYi9hbWQ2NC9zZXJ2ZXIvbGlianNpZy5zbworLi9qcmUvbGliL2FtZDY0L3NlcnZlci9saWJqdm0uc28KKy4vYmluL2FwcGxldHZpZXdlcgorLi9iaW4vZXh0Y2hlY2sKKy4vYmluL2lkbGoKKy4vYmluL2phcgorLi9iaW4vamFyc2lnbmVyCisuL2Jpbi9qYXZhCisuL2Jpbi9qYXZhYworLi9iaW4vamF2YWRvYworLi9iaW4vamF2YWgKKy4vYmluL2phdmFwCisuL2Jpbi9qY21kCisuL2Jpbi9qY29uc29sZQorLi9iaW4vamRiCisuL2Jpbi9qaGF0CisuL2Jpbi9qaW5mbworLi9iaW4vam1hcAorLi9iaW4vanBzCisuL2Jpbi9qcnVuc2NyaXB0CisuL2Jpbi9qc2FkZWJ1Z2QKKy4vYmluL2pzdGFjaworLi9iaW4vanN0YXQKKy4vYmluL2pzdGF0ZAorLi9iaW4va2V5dG9vbAorLi9iaW4vbmF0aXZlMmFzY2lpCisuL2Jpbi9vcmJkCisuL2Jpbi9wYWNrMjAwCisuL2Jpbi9wb2xpY3l0b29sCisuL2Jpbi9ybWljCisuL2Jpbi9ybWlkCisuL2Jpbi9ybWlyZWdpc3RyeQorLi9iaW4vc2NoZW1hZ2VuCisuL2Jpbi9zZXJpYWx2ZXIKKy4vYmluL3NlcnZlcnRvb2wKKy4vYmluL3RuYW1lc2VydgorLi9iaW4vd3NnZW4KKy4vYmluL3dzaW1wb3J0CisuL2Jpbi94amMKKy4vanJlL2Jpbi9qYXZhCisuL2pyZS9iaW4va2V5dG9vbAorLi9qcmUvYmluL29yYmQKKy4vanJlL2Jpbi9wYWNrMjAwCisuL2pyZS9iaW4vcG9saWN5dG9vbAorLi9qcmUvYmluL3JtaWQKKy4vanJlL2Jpbi9ybWlyZWdpc3RyeQorLi9qcmUvYmluL3NlcnZlcnRvb2wKKy4vanJlL2Jpbi90bmFtZXNlcnYKKyIKKworZmkKKworaWYgWyAiJE9QRU5KREtfVEFSR0VUX09TIiA9ICJzb2xhcmlzIiBdICYmIFsgIiRPUEVOSkRLX1RBUkdFVF9DUFUiID0gIng4NiIgXTsgdGhlbgorCitTVFJJUF9CRUZPUkVfQ09NUEFSRT0iCisuL2RlbW8vam5pL1BvbGxlci9saWIvbGliUG9sbGVyLnNvCisuL2RlbW8vanZtdGkvY29tcGlsZWRNZXRob2RMb2FkL2xpYi9saWJjb21waWxlZE1ldGhvZExvYWQuc28KKy4vZGVtby9qdm10aS9nY3Rlc3QvbGliL2xpYmdjdGVzdC5zbworLi9kZW1vL2p2bXRpL2hlYXBUcmFja2VyL2xpYi9saWJoZWFwVHJhY2tlci5zbworLi9kZW1vL2p2bXRpL2hlYXBWaWV3ZXIvbGliL2xpYmhlYXBWaWV3ZXIuc28KKy4vZGVtby9qdm10aS9ocHJvZi9saWIvbGliaHByb2Yuc28KKy4vZGVtby9qdm10aS9taW5zdC9saWIvbGlibWluc3Quc28KKy4vZGVtby9qdm10aS9tdHJhY2UvbGliL2xpYm10cmFjZS5zbworLi9kZW1vL2p2bXRpL3ZlcnNpb25DaGVjay9saWIvbGlidmVyc2lvbkNoZWNrLnNvCisuL2RlbW8vanZtdGkvd2FpdGVycy9saWIvbGlid2FpdGVycy5zbworLi9qcmUvbGliL2kzODYvamV4ZWMKKyIKKworU09SVF9TWU1CT0xTPSIKKy4vanJlL2xpYi9pMzg2L2NsaWVudC9saWJqdm0uc28KKy4vanJlL2xpYi9pMzg2L2xpYnNhcHJvYy5zbworLi9qcmUvbGliL2kzODYvc2VydmVyL2xpYmp2bS5zbworIgorCitTS0lQX0JJTl9ESUZGPSJ0cnVlIgorCitBQ0NFUFRFRF9TTUFMTF9TSVpFX0RJRkY9IgorLi9kZW1vL2puaS9Qb2xsZXIvbGliL2xpYlBvbGxlci5zbworLi9kZW1vL2p2bXRpL2NvbXBpbGVkTWV0aG9kTG9hZC9saWIvbGliY29tcGlsZWRNZXRob2RMb2FkLnNvCisuL2RlbW8vanZtdGkvZ2N0ZXN0L2xpYi9saWJnY3Rlc3Quc28KKy4vZGVtby9qdm10aS9oZWFwVHJhY2tlci9saWIvbGliaGVhcFRyYWNrZXIuc28KKy4vZGVtby9qdm10aS9oZWFwVmlld2VyL2xpYi9saWJoZWFwVmlld2VyLnNvCisuL2RlbW8vanZtdGkvaHByb2YvbGliL2xpYmhwcm9mLnNvCisuL2RlbW8vanZtdGkvbWluc3QvbGliL2xpYm1pbnN0LnNvCisuL2RlbW8vanZtdGkvbXRyYWNlL2xpYi9saWJtdHJhY2Uuc28KKy4vZGVtby9qdm10aS92ZXJzaW9uQ2hlY2svbGliL2xpYnZlcnNpb25DaGVjay5zbworLi9kZW1vL2p2bXRpL3dhaXRlcnMvbGliL2xpYndhaXRlcnMuc28KKy4vanJlL2xpYi9pMzg2L2NsaWVudC9saWJqdm0uc28KKy4vanJlL2xpYi9pMzg2L2psaS9saWJqbGkuc28KKy4vanJlL2xpYi9pMzg2L2xpYkpkYmNPZGJjLnNvCisuL2pyZS9saWIvaTM4Ni9saWJhdHRhY2guc28KKy4vanJlL2xpYi9pMzg2L2xpYmF3dC5zbworLi9qcmUvbGliL2kzODYvbGliYXd0X2hlYWRsZXNzLnNvCisuL2pyZS9saWIvaTM4Ni9saWJhd3RfeGF3dC5zbworLi9qcmUvbGliL2kzODYvbGliZGNwci5zbworLi9qcmUvbGliL2kzODYvbGliZHRfc29ja2V0LnNvCisuL2pyZS9saWIvaTM4Ni9saWJmb250bWFuYWdlci5zbworLi9qcmUvbGliL2kzODYvbGliaHByb2Yuc28KKy4vanJlL2xpYi9pMzg2L2xpYmluc3RydW1lbnQuc28KKy4vanJlL2xpYi9pMzg2L2xpYmoyZ3NzLnNvCisuL2pyZS9saWIvaTM4Ni9saWJqMnBjc2Muc28KKy4vanJlL2xpYi9pMzg2L2xpYmoycGtjczExLnNvCisuL2pyZS9saWIvaTM4Ni9saWJqMnVjcnlwdG8uc28KKy4vanJlL2xpYi9pMzg2L2xpYmphYXNfdW5peC5zbworLi9qcmUvbGliL2kzODYvbGliamF2YS5zbworLi9qcmUvbGliL2kzODYvbGliamF2YV9jcndfZGVtby5zbworLi9qcmUvbGliL2kzODYvbGliamF3dC5zbworLi9qcmUvbGliL2kzODYvbGliamR3cC5zbworLi9qcmUvbGliL2kzODYvbGliamZyLnNvCisuL2pyZS9saWIvaTM4Ni9saWJqcGVnLnNvCisuL2pyZS9saWIvaTM4Ni9saWJqc2R0LnNvCisuL2pyZS9saWIvaTM4Ni9saWJqc291bmQuc28KKy4vanJlL2xpYi9pMzg2L2xpYmtjbXMuc28KKy4vanJlL2xpYi9pMzg2L2xpYmxjbXMuc28KKy4vanJlL2xpYi9pMzg2L2xpYm1hbmFnZW1lbnQuc28KKy4vanJlL2xpYi9pMzg2L2xpYm1saWJfaW1hZ2Uuc28KKy4vanJlL2xpYi9pMzg2L2xpYm5ldC5zbworLi9qcmUvbGliL2kzODYvbGlibmlvLnNvCisuL2pyZS9saWIvaTM4Ni9saWJucHQuc28KKy4vanJlL2xpYi9pMzg2L2xpYnNjdHAuc28KKy4vanJlL2xpYi9pMzg2L2xpYnNwbGFzaHNjcmVlbi5zbworLi9qcmUvbGliL2kzODYvbGlic3VuZWMuc28KKy4vanJlL2xpYi9pMzg2L2xpYnN1bndqZGdhLnNvCisuL2pyZS9saWIvaTM4Ni9saWJ0Mmsuc28KKy4vanJlL2xpYi9pMzg2L2xpYnVucGFjay5zbworLi9qcmUvbGliL2kzODYvbGlidmVyaWZ5LnNvCisuL2pyZS9saWIvaTM4Ni9saWJ6aXAuc28KKy4vanJlL2xpYi9pMzg2L3NlcnZlci9saWJqdm0uc28KKy4vYmluL2FwcGxldHZpZXdlcgorLi9iaW4vZXh0Y2hlY2sKKy4vYmluL2lkbGoKKy4vYmluL2phcgorLi9iaW4vamFyc2lnbmVyCisuL2Jpbi9qYXZhCisuL2Jpbi9qYXZhYworLi9iaW4vamF2YWRvYworLi9iaW4vamF2YWgKKy4vYmluL2phdmFwCisuL2Jpbi9qY21kCisuL2Jpbi9qY29uc29sZQorLi9iaW4vamRiCisuL2Jpbi9qaGF0CisuL2Jpbi9qaW5mbworLi9iaW4vam1hcAorLi9iaW4vanBzCisuL2Jpbi9qcnVuc2NyaXB0CisuL2Jpbi9qc2FkZWJ1Z2QKKy4vYmluL2pzdGFjaworLi9iaW4vanN0YXQKKy4vYmluL2pzdGF0ZAorLi9iaW4va2V5dG9vbAorLi9iaW4vbmF0aXZlMmFzY2lpCisuL2Jpbi9vcmJkCisuL2Jpbi9wYWNrMjAwCisuL2Jpbi9wb2xpY3l0b29sCisuL2Jpbi9ybWljCisuL2Jpbi9ybWlkCisuL2Jpbi9ybWlyZWdpc3RyeQorLi9iaW4vc2NoZW1hZ2VuCisuL2Jpbi9zZXJpYWx2ZXIKKy4vYmluL3NlcnZlcnRvb2wKKy4vYmluL3RuYW1lc2VydgorLi9iaW4vdW5wYWNrMjAwCisuL2Jpbi93c2dlbgorLi9iaW4vd3NpbXBvcnQKKy4vYmluL3hqYworLi9qcmUvYmluL2phdmEKKy4vanJlL2Jpbi9rZXl0b29sCisuL2pyZS9iaW4vb3JiZAorLi9qcmUvYmluL3BhY2syMDAKKy4vanJlL2Jpbi9wb2xpY3l0b29sCisuL2pyZS9iaW4vcm1pZAorLi9qcmUvYmluL3JtaXJlZ2lzdHJ5CisuL2pyZS9iaW4vc2VydmVydG9vbAorLi9qcmUvYmluL3RuYW1lc2VydgorLi9qcmUvYmluL3VucGFjazIwMAorLi9qcmUvbGliL2kzODYvamV4ZWMKKyIKKworU0tJUF9GVUxMRFVNUF9ESUZGPSJ0cnVlIgorCisjIEZpbHRlciByYW5kb20gQysrIHN5bWJvbCBzdHJpbmdzLgorRElTX0RJRkZfRklMVEVSPSIkU0VEIC1lIHMvXC5bYS16QS1aMC05X1wkXVx7MTUsMTVcfS88U1lNPi9nIgorCitmaQorCitpZiBbICIkT1BFTkpES19UQVJHRVRfT1MiID0gInNvbGFyaXMiIF0gJiYgWyAiJE9QRU5KREtfVEFSR0VUX0NQVSIgPSAieDg2XzY0IiBdOyB0aGVuCisKK1NUUklQX0JFRk9SRV9DT01QQVJFPSIKKy4vZGVtby9qbmkvUG9sbGVyL2xpYi9hbWQ2NC9saWJQb2xsZXIuc28KKy4vZGVtby9qdm10aS9jb21waWxlZE1ldGhvZExvYWQvbGliL2FtZDY0L2xpYmNvbXBpbGVkTWV0aG9kTG9hZC5zbworLi9kZW1vL2p2bXRpL2djdGVzdC9saWIvYW1kNjQvbGliZ2N0ZXN0LnNvCisuL2RlbW8vanZtdGkvaGVhcFRyYWNrZXIvbGliL2FtZDY0L2xpYmhlYXBUcmFja2VyLnNvCisuL2RlbW8vanZtdGkvaGVhcFZpZXdlci9saWIvYW1kNjQvbGliaGVhcFZpZXdlci5zbworLi9kZW1vL2p2bXRpL2hwcm9mL2xpYi9hbWQ2NC9saWJocHJvZi5zbworLi9kZW1vL2p2bXRpL21pbnN0L2xpYi9hbWQ2NC9saWJtaW5zdC5zbworLi9kZW1vL2p2bXRpL210cmFjZS9saWIvYW1kNjQvbGlibXRyYWNlLnNvCisuL2RlbW8vanZtdGkvdmVyc2lvbkNoZWNrL2xpYi9hbWQ2NC9saWJ2ZXJzaW9uQ2hlY2suc28KKy4vZGVtby9qdm10aS93YWl0ZXJzL2xpYi9hbWQ2NC9saWJ3YWl0ZXJzLnNvCisiCisKK1NPUlRfU1lNQk9MUz0iCisuL2pyZS9saWIvYW1kNjQvc2VydmVyL2xpYmp2bS5zbworLi9qcmUvbGliL2FtZDY0L2xpYnNhcHJvYy5zbworIgorCitTS0lQX0JJTl9ESUZGPSJ0cnVlIgorCitBQ0NFUFRFRF9TTUFMTF9TSVpFX0RJRkY9IgorLi9kZW1vL2puaS9Qb2xsZXIvbGliL2FtZDY0L2xpYlBvbGxlci5zbworLi9kZW1vL2p2bXRpL2NvbXBpbGVkTWV0aG9kTG9hZC9saWIvYW1kNjQvbGliY29tcGlsZWRNZXRob2RMb2FkLnNvCisuL2RlbW8vanZtdGkvZ2N0ZXN0L2xpYi9hbWQ2NC9saWJnY3Rlc3Quc28KKy4vZGVtby9qdm10aS9oZWFwVHJhY2tlci9saWIvYW1kNjQvbGliaGVhcFRyYWNrZXIuc28KKy4vZGVtby9qdm10aS9oZWFwVmlld2VyL2xpYi9hbWQ2NC9saWJoZWFwVmlld2VyLnNvCisuL2RlbW8vanZtdGkvaHByb2YvbGliL2FtZDY0L2xpYmhwcm9mLnNvCisuL2RlbW8vanZtdGkvbWluc3QvbGliL2FtZDY0L2xpYm1pbnN0LnNvCisuL2RlbW8vanZtdGkvbXRyYWNlL2xpYi9hbWQ2NC9saWJtdHJhY2Uuc28KKy4vZGVtby9qdm10aS92ZXJzaW9uQ2hlY2svbGliL2FtZDY0L2xpYnZlcnNpb25DaGVjay5zbworLi9kZW1vL2p2bXRpL3dhaXRlcnMvbGliL2FtZDY0L2xpYndhaXRlcnMuc28KKy4vanJlL2xpYi9hbWQ2NC9qbGkvbGliamxpLnNvCisuL2pyZS9saWIvYW1kNjQvbGliSmRiY09kYmMuc28KKy4vanJlL2xpYi9hbWQ2NC9saWJhdHRhY2guc28KKy4vanJlL2xpYi9hbWQ2NC9saWJhd3Quc28KKy4vanJlL2xpYi9hbWQ2NC9saWJhd3RfaGVhZGxlc3Muc28KKy4vanJlL2xpYi9hbWQ2NC9saWJhd3RfeGF3dC5zbworLi9qcmUvbGliL2FtZDY0L2xpYmRjcHIuc28KKy4vanJlL2xpYi9hbWQ2NC9saWJkdF9zb2NrZXQuc28KKy4vanJlL2xpYi9hbWQ2NC9saWJmb250bWFuYWdlci5zbworLi9qcmUvbGliL2FtZDY0L2xpYmhwcm9mLnNvCisuL2pyZS9saWIvYW1kNjQvbGliaW5zdHJ1bWVudC5zbworLi9qcmUvbGliL2FtZDY0L2xpYmoyZ3NzLnNvCisuL2pyZS9saWIvYW1kNjQvbGliajJwY3NjLnNvCisuL2pyZS9saWIvYW1kNjQvbGliajJwa2NzMTEuc28KKy4vanJlL2xpYi9hbWQ2NC9saWJqMnVjcnlwdG8uc28KKy4vanJlL2xpYi9hbWQ2NC9saWJqYWFzX3VuaXguc28KKy4vanJlL2xpYi9hbWQ2NC9saWJqYXZhLnNvCisuL2pyZS9saWIvYW1kNjQvbGliamF2YV9jcndfZGVtby5zbworLi9qcmUvbGliL2FtZDY0L2xpYmphd3Quc28KKy4vanJlL2xpYi9hbWQ2NC9saWJqZHdwLnNvCisuL2pyZS9saWIvYW1kNjQvbGliamZyLnNvCisuL2pyZS9saWIvYW1kNjQvbGlianBlZy5zbworLi9qcmUvbGliL2FtZDY0L2xpYmpzZHQuc28KKy4vanJlL2xpYi9hbWQ2NC9saWJqc291bmQuc28KKy4vanJlL2xpYi9hbWQ2NC9saWJrY21zLnNvCisuL2pyZS9saWIvYW1kNjQvbGlibGNtcy5zbworLi9qcmUvbGliL2FtZDY0L2xpYm1hbmFnZW1lbnQuc28KKy4vanJlL2xpYi9hbWQ2NC9saWJtbGliX2ltYWdlLnNvCisuL2pyZS9saWIvYW1kNjQvbGlibmV0LnNvCisuL2pyZS9saWIvYW1kNjQvbGlibmlvLnNvCisuL2pyZS9saWIvYW1kNjQvbGlibnB0LnNvCisuL2pyZS9saWIvYW1kNjQvbGlic2N0cC5zbworLi9qcmUvbGliL2FtZDY0L2xpYnNwbGFzaHNjcmVlbi5zbworLi9qcmUvbGliL2FtZDY0L2xpYnN1bmVjLnNvCisuL2pyZS9saWIvYW1kNjQvbGlic3Vud2pkZ2Euc28KKy4vanJlL2xpYi9hbWQ2NC9saWJ0Mmsuc28KKy4vanJlL2xpYi9hbWQ2NC9saWJ1bnBhY2suc28KKy4vanJlL2xpYi9hbWQ2NC9saWJ2ZXJpZnkuc28KKy4vanJlL2xpYi9hbWQ2NC9saWJ6aXAuc28KKy4vanJlL2xpYi9hbWQ2NC9zZXJ2ZXIvNjQvbGlianZtX2RiLnNvCisuL2pyZS9saWIvYW1kNjQvc2VydmVyLzY0L2xpYmp2bV9kdHJhY2Uuc28KKy4vYmluL2FtZDY0L2FwcGxldHZpZXdlcgorLi9iaW4vYW1kNjQvZXh0Y2hlY2sKKy4vYmluL2FtZDY0L2lkbGoKKy4vYmluL2FtZDY0L2phcgorLi9iaW4vYW1kNjQvamFyc2lnbmVyCisuL2Jpbi9hbWQ2NC9qYXZhCisuL2Jpbi9hbWQ2NC9qYXZhYworLi9iaW4vYW1kNjQvamF2YWRvYworLi9iaW4vYW1kNjQvamF2YWgKKy4vYmluL2FtZDY0L2phdmFwCisuL2Jpbi9hbWQ2NC9qY21kCisuL2Jpbi9hbWQ2NC9qY29uc29sZQorLi9iaW4vYW1kNjQvamRiCisuL2Jpbi9hbWQ2NC9qaGF0CisuL2Jpbi9hbWQ2NC9qaW5mbworLi9iaW4vYW1kNjQvam1hcAorLi9iaW4vYW1kNjQvanBzCisuL2Jpbi9hbWQ2NC9qcnVuc2NyaXB0CisuL2Jpbi9hbWQ2NC9qc2FkZWJ1Z2QKKy4vYmluL2FtZDY0L2pzdGFjaworLi9iaW4vYW1kNjQvanN0YXQKKy4vYmluL2FtZDY0L2pzdGF0ZAorLi9iaW4vYW1kNjQva2V5dG9vbAorLi9iaW4vYW1kNjQvbmF0aXZlMmFzY2lpCisuL2Jpbi9hbWQ2NC9vcmJkCisuL2Jpbi9hbWQ2NC9wYWNrMjAwCisuL2Jpbi9hbWQ2NC9wb2xpY3l0b29sCisuL2Jpbi9hbWQ2NC9ybWljCisuL2Jpbi9hbWQ2NC9ybWlkCisuL2Jpbi9hbWQ2NC9ybWlyZWdpc3RyeQorLi9iaW4vYW1kNjQvc2NoZW1hZ2VuCisuL2Jpbi9hbWQ2NC9zZXJpYWx2ZXIKKy4vYmluL2FtZDY0L3NlcnZlcnRvb2wKKy4vYmluL2FtZDY0L3RuYW1lc2VydgorLi9iaW4vYW1kNjQvdW5wYWNrMjAwCisuL2Jpbi9hbWQ2NC93c2dlbgorLi9iaW4vYW1kNjQvd3NpbXBvcnQKKy4vYmluL2FtZDY0L3hqYworLi9qcmUvYmluL2FtZDY0L2phdmEKKy4vanJlL2Jpbi9hbWQ2NC9rZXl0b29sCisuL2pyZS9iaW4vYW1kNjQvb3JiZAorLi9qcmUvYmluL2FtZDY0L3BhY2syMDAKKy4vanJlL2Jpbi9hbWQ2NC9wb2xpY3l0b29sCisuL2pyZS9iaW4vYW1kNjQvcm1pZAorLi9qcmUvYmluL2FtZDY0L3JtaXJlZ2lzdHJ5CisuL2pyZS9iaW4vYW1kNjQvc2VydmVydG9vbAorLi9qcmUvYmluL2FtZDY0L3RuYW1lc2VydgorLi9qcmUvYmluL2FtZDY0L3VucGFjazIwMAorLi9qcmUvbGliL2FtZDY0L2pleGVjCisiCisKK1NLSVBfRlVMTERVTVBfRElGRj0idHJ1ZSIKKworIyBGaWx0ZXIgcmFuZG9tIEMrKyBzeW1ib2wgc3RyaW5ncy4KK0RJU19ESUZGX0ZJTFRFUj0iJFNFRCAtZSBzL1wuW2EtekEtWjAtOV9cJF1cezE1LDE1XH0vPFNZTT4vZyIKKworZmkKKworaWYgWyAiJE9QRU5KREtfVEFSR0VUX09TIiA9ICJzb2xhcmlzIiBdICYmIFsgIiRPUEVOSkRLX1RBUkdFVF9DUFUiID0gInNwYXJjIiBdOyB0aGVuCisKK1NUUklQX0JFRk9SRV9DT01QQVJFPSIKKy4vZGVtby9qbmkvUG9sbGVyL2xpYi9saWJQb2xsZXIuc28KKy4vZGVtby9qdm10aS9jb21waWxlZE1ldGhvZExvYWQvbGliL2xpYmNvbXBpbGVkTWV0aG9kTG9hZC5zbworLi9kZW1vL2p2bXRpL2djdGVzdC9saWIvbGliZ2N0ZXN0LnNvCisuL2RlbW8vanZtdGkvaGVhcFRyYWNrZXIvbGliL2xpYmhlYXBUcmFja2VyLnNvCisuL2RlbW8vanZtdGkvaGVhcFZpZXdlci9saWIvbGliaGVhcFZpZXdlci5zbworLi9kZW1vL2p2bXRpL2hwcm9mL2xpYi9saWJocHJvZi5zbworLi9kZW1vL2p2bXRpL21pbnN0L2xpYi9saWJtaW5zdC5zbworLi9kZW1vL2p2bXRpL210cmFjZS9saWIvbGlibXRyYWNlLnNvCisuL2RlbW8vanZtdGkvdmVyc2lvbkNoZWNrL2xpYi9saWJ2ZXJzaW9uQ2hlY2suc28KKy4vZGVtby9qdm10aS93YWl0ZXJzL2xpYi9saWJ3YWl0ZXJzLnNvCisuL2pyZS9saWIvc3BhcmMvamV4ZWMKKyIKKworU09SVF9TWU1CT0xTPSIKKy4vZGVtby9qdm10aS93YWl0ZXJzL2xpYi9saWJ3YWl0ZXJzLnNvCisuL2pyZS9saWIvc3BhcmMvY2xpZW50LzY0L2xpYmp2bV9kYi5zbworLi9qcmUvbGliL3NwYXJjL2NsaWVudC82NC9saWJqdm1fZHRyYWNlLnNvCisuL2pyZS9saWIvc3BhcmMvY2xpZW50L2xpYmpzaWcuc28KKy4vanJlL2xpYi9zcGFyYy9jbGllbnQvbGlianZtLnNvCisuL2pyZS9saWIvc3BhcmMvY2xpZW50L2xpYmp2bV9kYi5zbworLi9qcmUvbGliL3NwYXJjL2NsaWVudC9saWJqdm1fZHRyYWNlLnNvCisuL2pyZS9saWIvc3BhcmMvbGlianNpZy5zbworLi9qcmUvbGliL3NwYXJjL2xpYnNhcHJvYy5zbworLi9qcmUvbGliL3NwYXJjL3NlcnZlci82NC9saWJqdm1fZGIuc28KKy4vanJlL2xpYi9zcGFyYy9zZXJ2ZXIvNjQvbGlianZtX2R0cmFjZS5zbworLi9qcmUvbGliL3NwYXJjL3NlcnZlci9saWJqc2lnLnNvCisuL2pyZS9saWIvc3BhcmMvc2VydmVyL2xpYmp2bS5zbworLi9qcmUvbGliL3NwYXJjL3NlcnZlci9saWJqdm1fZGIuc28KKy4vanJlL2xpYi9zcGFyYy9zZXJ2ZXIvbGlianZtX2R0cmFjZS5zbworIgorCitTS0lQX0JJTl9ESUZGPSJ0cnVlIgorCitBQ0NFUFRFRF9TTUFMTF9TSVpFX0RJRkY9IgorLi9kZW1vL2puaS9Qb2xsZXIvbGliL2xpYlBvbGxlci5zbworLi9kZW1vL2p2bXRpL2NvbXBpbGVkTWV0aG9kTG9hZC9saWIvbGliY29tcGlsZWRNZXRob2RMb2FkLnNvCisuL2RlbW8vanZtdGkvZ2N0ZXN0L2xpYi9saWJnY3Rlc3Quc28KKy4vZGVtby9qdm10aS9oZWFwVHJhY2tlci9saWIvbGliaGVhcFRyYWNrZXIuc28KKy4vZGVtby9qdm10aS9oZWFwVmlld2VyL2xpYi9saWJoZWFwVmlld2VyLnNvCisuL2RlbW8vanZtdGkvaHByb2YvbGliL2xpYmhwcm9mLnNvCisuL2RlbW8vanZtdGkvbWluc3QvbGliL2xpYm1pbnN0LnNvCisuL2RlbW8vanZtdGkvbXRyYWNlL2xpYi9saWJtdHJhY2Uuc28KKy4vZGVtby9qdm10aS92ZXJzaW9uQ2hlY2svbGliL2xpYnZlcnNpb25DaGVjay5zbworLi9kZW1vL2p2bXRpL3dhaXRlcnMvbGliL2xpYndhaXRlcnMuc28KKy4vanJlL2xpYi9zcGFyYy9jbGllbnQvbGlianZtLnNvCisuL2pyZS9saWIvc3BhcmMvamxpL2xpYmpsaS5zbworLi9qcmUvbGliL3NwYXJjL2xpYkpkYmNPZGJjLnNvCisuL2pyZS9saWIvc3BhcmMvbGliYXR0YWNoLnNvCisuL2pyZS9saWIvc3BhcmMvbGliYXd0LnNvCisuL2pyZS9saWIvc3BhcmMvbGliYXd0X2hlYWRsZXNzLnNvCisuL2pyZS9saWIvc3BhcmMvbGliYXd0X3hhd3Quc28KKy4vanJlL2xpYi9zcGFyYy9saWJkY3ByLnNvCisuL2pyZS9saWIvc3BhcmMvbGliZHRfc29ja2V0LnNvCisuL2pyZS9saWIvc3BhcmMvbGliZm9udG1hbmFnZXIuc28KKy4vanJlL2xpYi9zcGFyYy9saWJocHJvZi5zbworLi9qcmUvbGliL3NwYXJjL2xpYmluc3RydW1lbnQuc28KKy4vanJlL2xpYi9zcGFyYy9saWJqMmdzcy5zbworLi9qcmUvbGliL3NwYXJjL2xpYmoycGNzYy5zbworLi9qcmUvbGliL3NwYXJjL2xpYmoycGtjczExLnNvCisuL2pyZS9saWIvc3BhcmMvbGliajJ1Y3J5cHRvLnNvCisuL2pyZS9saWIvc3BhcmMvbGliamFhc191bml4LnNvCisuL2pyZS9saWIvc3BhcmMvbGliamF2YS5zbworLi9qcmUvbGliL3NwYXJjL2xpYmphdmFfY3J3X2RlbW8uc28KKy4vanJlL2xpYi9zcGFyYy9saWJqYXd0LnNvCisuL2pyZS9saWIvc3BhcmMvbGliamR3cC5zbworLi9qcmUvbGliL3NwYXJjL2xpYmpmci5zbworLi9qcmUvbGliL3NwYXJjL2xpYmpwZWcuc28KKy4vanJlL2xpYi9zcGFyYy9saWJqc2R0LnNvCisuL2pyZS9saWIvc3BhcmMvbGlianNvdW5kLnNvCisuL2pyZS9saWIvc3BhcmMvbGlia2Ntcy5zbworLi9qcmUvbGliL3NwYXJjL2xpYmxjbXMuc28KKy4vanJlL2xpYi9zcGFyYy9saWJtYW5hZ2VtZW50LnNvCisuL2pyZS9saWIvc3BhcmMvbGlibWxpYl9pbWFnZS5zbworLi9qcmUvbGliL3NwYXJjL2xpYm1saWJfaW1hZ2Vfdi5zbworLi9qcmUvbGliL3NwYXJjL2xpYm5ldC5zbworLi9qcmUvbGliL3NwYXJjL2xpYm5pby5zbworLi9qcmUvbGliL3NwYXJjL2xpYm5wdC5zbworLi9qcmUvbGliL3NwYXJjL2xpYnNjdHAuc28KKy4vanJlL2xpYi9zcGFyYy9saWJzcGxhc2hzY3JlZW4uc28KKy4vanJlL2xpYi9zcGFyYy9saWJzdW5lYy5zbworLi9qcmUvbGliL3NwYXJjL2xpYnN1bndqZGdhLnNvCisuL2pyZS9saWIvc3BhcmMvbGlidDJrLnNvCisuL2pyZS9saWIvc3BhcmMvbGlidW5wYWNrLnNvCisuL2pyZS9saWIvc3BhcmMvbGlidmVyaWZ5LnNvCisuL2pyZS9saWIvc3BhcmMvbGliemlwLnNvCisuL2pyZS9saWIvc3BhcmMvc2VydmVyL2xpYmp2bS5zbworLi9iaW4vYXBwbGV0dmlld2VyCisuL2Jpbi9leHRjaGVjaworLi9iaW4vaWRsagorLi9iaW4vamFyCisuL2Jpbi9qYXJzaWduZXIKKy4vYmluL2phdmEKKy4vYmluL2phdmFjCisuL2Jpbi9qYXZhZG9jCisuL2Jpbi9qYXZhaAorLi9iaW4vamF2YXAKKy4vYmluL2pjbWQKKy4vYmluL2pjb25zb2xlCisuL2Jpbi9qZGIKKy4vYmluL2poYXQKKy4vYmluL2ppbmZvCisuL2Jpbi9qbWFwCisuL2Jpbi9qcHMKKy4vYmluL2pydW5zY3JpcHQKKy4vYmluL2pzYWRlYnVnZAorLi9iaW4vanN0YWNrCisuL2Jpbi9qc3RhdAorLi9iaW4vanN0YXRkCisuL2Jpbi9rZXl0b29sCisuL2Jpbi9uYXRpdmUyYXNjaWkKKy4vYmluL29yYmQKKy4vYmluL3BhY2syMDAKKy4vYmluL3BvbGljeXRvb2wKKy4vYmluL3JtaWMKKy4vYmluL3JtaWQKKy4vYmluL3JtaXJlZ2lzdHJ5CisuL2Jpbi9zY2hlbWFnZW4KKy4vYmluL3NlcmlhbHZlcgorLi9iaW4vc2VydmVydG9vbAorLi9iaW4vdG5hbWVzZXJ2CisuL2Jpbi91bnBhY2syMDAKKy4vYmluL3dzZ2VuCisuL2Jpbi93c2ltcG9ydAorLi9iaW4veGpjCisuL2pyZS9iaW4vamF2YQorLi9qcmUvYmluL2tleXRvb2wKKy4vanJlL2Jpbi9vcmJkCisuL2pyZS9iaW4vcGFjazIwMAorLi9qcmUvYmluL3BvbGljeXRvb2wKKy4vanJlL2Jpbi9ybWlkCisuL2pyZS9iaW4vcm1pcmVnaXN0cnkKKy4vanJlL2Jpbi9zZXJ2ZXJ0b29sCisuL2pyZS9iaW4vdG5hbWVzZXJ2CisuL2pyZS9iaW4vdW5wYWNrMjAwCisuL2pyZS9saWIvc3BhcmMvamV4ZWMKKyIKKworIyBGaWx0ZXIgcmFuZG9tIEMrKyBzeW1ib2wgc3RyaW5ncy4KKyMgU29tZSBudW1iZXJzIGRpZmZlciByYW5kb21seS4KK0RJU19ESUZGX0ZJTFRFUj0iJFNFRCAtZSBzL1wkW2EtekEtWjAtOV9cJF1cezE1LDE1XH0vPFNZTT4vZyAtZSBzL1woWzAtOWEtZl1bMC05YS1mXS5bMC05YS1mXVswLTlhLWZdLlswLTlhLWZdWzAtOWEtZl0uXClbMC05YS1mXVswLTlhLWZdL1wxPE5VTT4vZyAtZSBzL1woJWcxLC4weFwpWzAtOWEtZl0qXCgsLiVnMVwpL1wxPEhFWD5cMi9nIC1lIHMvXCghLlwpWzAtOWEtZl0qXCguPFNVTldwcml2YXRlXzEuMSsweFwpWzAtOWEtZl0qL1wxPE5VTT5cMjxIRVg+L2ciCisKKyMgU29tZSB4b3IgaW5zdHJ1Y3Rpb25zIGVuZCB1cCB3aXRoIGRpZmZlcmVudCBhcmdzIGluIHRoZSBsaWIgYnV0IG5vdCBpbiB0aGUgb2JqZWN0IGZpbGVzLgorQUNDRVBURURfRElTX0RJRkY9IgorLi9kZW1vL2p2bXRpL3dhaXRlcnMvbGliL2xpYndhaXRlcnMuc28KKyIKKworU0tJUF9GVUxMRFVNUF9ESUZGPSJ0cnVlIgorCitmaQorCitpZiBbICIkT1BFTkpES19UQVJHRVRfT1MiID0gInNvbGFyaXMiIF0gJiYgWyAiJE9QRU5KREtfVEFSR0VUX0NQVSIgPSAic3BhcmN2OSIgXTsgdGhlbgorCitTVFJJUF9CRUZPUkVfQ09NUEFSRT0iCisuL2RlbW8vam5pL1BvbGxlci9saWIvc3BhcmN2OS9saWJQb2xsZXIuc28KKy4vZGVtby9qdm10aS9jb21waWxlZE1ldGhvZExvYWQvbGliL3NwYXJjdjkvbGliY29tcGlsZWRNZXRob2RMb2FkLnNvCisuL2RlbW8vanZtdGkvZ2N0ZXN0L2xpYi9zcGFyY3Y5L2xpYmdjdGVzdC5zbworLi9kZW1vL2p2bXRpL2hlYXBUcmFja2VyL2xpYi9zcGFyY3Y5L2xpYmhlYXBUcmFja2VyLnNvCisuL2RlbW8vanZtdGkvaGVhcFZpZXdlci9saWIvc3BhcmN2OS9saWJoZWFwVmlld2VyLnNvCisuL2RlbW8vanZtdGkvaHByb2YvbGliL3NwYXJjdjkvbGliaHByb2Yuc28KKy4vZGVtby9qdm10aS9taW5zdC9saWIvc3BhcmN2OS9saWJtaW5zdC5zbworLi9kZW1vL2p2bXRpL210cmFjZS9saWIvc3BhcmN2OS9saWJtdHJhY2Uuc28KKy4vZGVtby9qdm10aS92ZXJzaW9uQ2hlY2svbGliL3NwYXJjdjkvbGlidmVyc2lvbkNoZWNrLnNvCisuL2RlbW8vanZtdGkvd2FpdGVycy9saWIvc3BhcmN2OS9saWJ3YWl0ZXJzLnNvCisiCisKK1NPUlRfU1lNQk9MUz0iCisuL2RlbW8vanZtdGkvd2FpdGVycy9saWIvc3BhcmN2OS9saWJ3YWl0ZXJzLnNvCisuL2pyZS9saWIvc3BhcmN2OS9saWJqc2lnLnNvCisuL2pyZS9saWIvc3BhcmN2OS9saWJzYXByb2Muc28KKy4vanJlL2xpYi9zcGFyY3Y5L3NlcnZlci9saWJqdm0uc28KKy4vanJlL2xpYi9zcGFyY3Y5L3NlcnZlci9saWJqdm1fZHRyYWNlLnNvCisiCisKK1NLSVBfQklOX0RJRkY9InRydWUiCisKK0FDQ0VQVEVEX1NNQUxMX1NJWkVfRElGRj0iCisuL2RlbW8vam5pL1BvbGxlci9saWIvc3BhcmN2OS9saWJQb2xsZXIuc28KKy4vZGVtby9qdm10aS9jb21waWxlZE1ldGhvZExvYWQvbGliL3NwYXJjdjkvbGliY29tcGlsZWRNZXRob2RMb2FkLnNvCisuL2RlbW8vanZtdGkvZ2N0ZXN0L2xpYi9zcGFyY3Y5L2xpYmdjdGVzdC5zbworLi9kZW1vL2p2bXRpL2hlYXBUcmFja2VyL2xpYi9zcGFyY3Y5L2xpYmhlYXBUcmFja2VyLnNvCisuL2RlbW8vanZtdGkvaGVhcFZpZXdlci9saWIvc3BhcmN2OS9saWJoZWFwVmlld2VyLnNvCisuL2RlbW8vanZtdGkvaHByb2YvbGliL3NwYXJjdjkvbGliaHByb2Yuc28KKy4vZGVtby9qdm10aS9taW5zdC9saWIvc3BhcmN2OS9saWJtaW5zdC5zbworLi9kZW1vL2p2bXRpL210cmFjZS9saWIvc3BhcmN2OS9saWJtdHJhY2Uuc28KKy4vZGVtby9qdm10aS92ZXJzaW9uQ2hlY2svbGliL3NwYXJjdjkvbGlidmVyc2lvbkNoZWNrLnNvCisuL2RlbW8vanZtdGkvd2FpdGVycy9saWIvc3BhcmN2OS9saWJ3YWl0ZXJzLnNvCisuL2pyZS9saWIvc3BhcmN2OS9jbGllbnQvbGlianZtLnNvCisuL2pyZS9saWIvc3BhcmN2OS9qbGkvbGliamxpLnNvCisuL2pyZS9saWIvc3BhcmN2OS9saWJKZGJjT2RiYy5zbworLi9qcmUvbGliL3NwYXJjdjkvbGliYXR0YWNoLnNvCisuL2pyZS9saWIvc3BhcmN2OS9saWJhd3Quc28KKy4vanJlL2xpYi9zcGFyY3Y5L2xpYmF3dF9oZWFkbGVzcy5zbworLi9qcmUvbGliL3NwYXJjdjkvbGliYXd0X3hhd3Quc28KKy4vanJlL2xpYi9zcGFyY3Y5L2xpYmRjcHIuc28KKy4vanJlL2xpYi9zcGFyY3Y5L2xpYmR0X3NvY2tldC5zbworLi9qcmUvbGliL3NwYXJjdjkvbGliZm9udG1hbmFnZXIuc28KKy4vanJlL2xpYi9zcGFyY3Y5L2xpYmhwcm9mLnNvCisuL2pyZS9saWIvc3BhcmN2OS9saWJpbnN0cnVtZW50LnNvCisuL2pyZS9saWIvc3BhcmN2OS9saWJqMmdzcy5zbworLi9qcmUvbGliL3NwYXJjdjkvbGliajJwY3NjLnNvCisuL2pyZS9saWIvc3BhcmN2OS9saWJqMnBrY3MxMS5zbworLi9qcmUvbGliL3NwYXJjdjkvbGliajJ1Y3J5cHRvLnNvCisuL2pyZS9saWIvc3BhcmN2OS9saWJqYWFzX3VuaXguc28KKy4vanJlL2xpYi9zcGFyY3Y5L2xpYmphdmEuc28KKy4vanJlL2xpYi9zcGFyY3Y5L2xpYmphdmFfY3J3X2RlbW8uc28KKy4vanJlL2xpYi9zcGFyY3Y5L2xpYmphd3Quc28KKy4vanJlL2xpYi9zcGFyY3Y5L2xpYmpkd3Auc28KKy4vanJlL2xpYi9zcGFyY3Y5L2xpYmpmci5zbworLi9qcmUvbGliL3NwYXJjdjkvbGlianBlZy5zbworLi9qcmUvbGliL3NwYXJjdjkvbGlianNkdC5zbworLi9qcmUvbGliL3NwYXJjdjkvbGlianNvdW5kLnNvCisuL2pyZS9saWIvc3BhcmN2OS9saWJrY21zLnNvCisuL2pyZS9saWIvc3BhcmN2OS9saWJsY21zLnNvCisuL2pyZS9saWIvc3BhcmN2OS9saWJtYW5hZ2VtZW50LnNvCisuL2pyZS9saWIvc3BhcmN2OS9saWJtbGliX2ltYWdlLnNvCisuL2pyZS9saWIvc3BhcmN2OS9saWJtbGliX2ltYWdlX3Yuc28KKy4vanJlL2xpYi9zcGFyY3Y5L2xpYm5ldC5zbworLi9qcmUvbGliL3NwYXJjdjkvbGlibmlvLnNvCisuL2pyZS9saWIvc3BhcmN2OS9saWJucHQuc28KKy4vanJlL2xpYi9zcGFyY3Y5L2xpYnNjdHAuc28KKy4vanJlL2xpYi9zcGFyY3Y5L2xpYnNwbGFzaHNjcmVlbi5zbworLi9qcmUvbGliL3NwYXJjdjkvbGlic3VuZWMuc28KKy4vanJlL2xpYi9zcGFyY3Y5L2xpYnN1bndqZGdhLnNvCisuL2pyZS9saWIvc3BhcmN2OS9saWJ0Mmsuc28KKy4vanJlL2xpYi9zcGFyY3Y5L2xpYnVucGFjay5zbworLi9qcmUvbGliL3NwYXJjdjkvbGlidmVyaWZ5LnNvCisuL2pyZS9saWIvc3BhcmN2OS9saWJ6aXAuc28KKy4vanJlL2xpYi9zcGFyY3Y5L3NlcnZlci9saWJqdm0uc28KKy4vYmluL3NwYXJjdjkvYXBwbGV0dmlld2VyCisuL2Jpbi9zcGFyY3Y5L2V4dGNoZWNrCisuL2Jpbi9zcGFyY3Y5L2lkbGoKKy4vYmluL3NwYXJjdjkvamFyCisuL2Jpbi9zcGFyY3Y5L2phcnNpZ25lcgorLi9iaW4vc3BhcmN2OS9qYXZhCisuL2Jpbi9zcGFyY3Y5L2phdmFjCisuL2Jpbi9zcGFyY3Y5L2phdmFkb2MKKy4vYmluL3NwYXJjdjkvamF2YWgKKy4vYmluL3NwYXJjdjkvamF2YXAKKy4vYmluL3NwYXJjdjkvamNtZAorLi9iaW4vc3BhcmN2OS9qY29uc29sZQorLi9iaW4vc3BhcmN2OS9qZGIKKy4vYmluL3NwYXJjdjkvamhhdAorLi9iaW4vc3BhcmN2OS9qaW5mbworLi9iaW4vc3BhcmN2OS9qbWFwCisuL2Jpbi9zcGFyY3Y5L2pwcworLi9iaW4vc3BhcmN2OS9qcnVuc2NyaXB0CisuL2Jpbi9zcGFyY3Y5L2pzYWRlYnVnZAorLi9iaW4vc3BhcmN2OS9qc3RhY2sKKy4vYmluL3NwYXJjdjkvanN0YXQKKy4vYmluL3NwYXJjdjkvanN0YXRkCisuL2Jpbi9zcGFyY3Y5L2tleXRvb2wKKy4vYmluL3NwYXJjdjkvbmF0aXZlMmFzY2lpCisuL2Jpbi9zcGFyY3Y5L29yYmQKKy4vYmluL3NwYXJjdjkvcGFjazIwMAorLi9iaW4vc3BhcmN2OS9wb2xpY3l0b29sCisuL2Jpbi9zcGFyY3Y5L3JtaWMKKy4vYmluL3NwYXJjdjkvcm1pZAorLi9iaW4vc3BhcmN2OS9ybWlyZWdpc3RyeQorLi9iaW4vc3BhcmN2OS9zY2hlbWFnZW4KKy4vYmluL3NwYXJjdjkvc2VyaWFsdmVyCisuL2Jpbi9zcGFyY3Y5L3NlcnZlcnRvb2wKKy4vYmluL3NwYXJjdjkvdG5hbWVzZXJ2CisuL2Jpbi9zcGFyY3Y5L3VucGFjazIwMAorLi9iaW4vc3BhcmN2OS93c2dlbgorLi9iaW4vc3BhcmN2OS93c2ltcG9ydAorLi9iaW4vc3BhcmN2OS94amMKKy4vanJlL2Jpbi9zcGFyY3Y5L2phdmEKKy4vanJlL2Jpbi9zcGFyY3Y5L2tleXRvb2wKKy4vanJlL2Jpbi9zcGFyY3Y5L29yYmQKKy4vanJlL2Jpbi9zcGFyY3Y5L3BhY2syMDAKKy4vanJlL2Jpbi9zcGFyY3Y5L3BvbGljeXRvb2wKKy4vanJlL2Jpbi9zcGFyY3Y5L3JtaWQKKy4vanJlL2Jpbi9zcGFyY3Y5L3JtaXJlZ2lzdHJ5CisuL2pyZS9iaW4vc3BhcmN2OS9zZXJ2ZXJ0b29sCisuL2pyZS9iaW4vc3BhcmN2OS90bmFtZXNlcnYKKy4vanJlL2Jpbi9zcGFyY3Y5L3VucGFjazIwMAorIgorCisjIEZpbHRlciByYW5kb20gQysrIHN5bWJvbCBzdHJpbmdzLgorIyBTb21lIG51bWJlcnMgZGlmZmVyIHJhbmRvbWx5LgorRElTX0RJRkZfRklMVEVSPSIkU0VEIC1lIHMvXCRbYS16QS1aMC05X1wkXVx7MTUsMTVcfS88U1lNPi9nIC1lIHMvWzAtOWEtZl1bMC05YS1mXS5bMC05YS1mXVswLTlhLWZdLlswLTlhLWZdWzAtOWEtZl0uWzAtOWEtZl1bMC05YS1mXS88TlVNUz4vZyAtZSBzL1woJWcxLC4weFwpWzAtOWEtZl0qXCgsLiVnMVwpL1wxPEhFWD5cMi9nIC1lIHMvXCghLlwpWzAtOWEtZl0qXCguPFNVTldwcml2YXRlXzEuMSsweFwpWzAtOWEtZl0qL1wxPE5VTT5cMjxIRVg+L2ciCisKKyMgU29tZSB4b3IgaW5zdHJ1Y3Rpb25zIGVuZCB1cCB3aXRoIGRpZmZlcmVudCBhcmdzIGluIHRoZSBsaWIgYnV0IG5vdCBpbiB0aGUgb2JqZWN0IGZpbGVzLgorQUNDRVBURURfRElTX0RJRkY9IgorLi9kZW1vL2p2bXRpL3dhaXRlcnMvbGliL3NwYXJjdjkvbGlid2FpdGVycy5zbworIgorCitTS0lQX0ZVTExEVU1QX0RJRkY9InRydWUiCisKK2ZpCisKKworaWYgWyAiJE9QRU5KREtfVEFSR0VUX09TIiA9ICJ3aW5kb3dzIiBdOyB0aGVuCisKKyMgUHJvYmFibHkgc2hvdWxkIGFkZCBhbGwgbGlicyBoZXJlCitBQ0NFUFRFRF9TTUFMTF9TSVpFX0RJRkY9IgorLi9kZW1vL2p2bXRpL2djdGVzdC9saWIvZ2N0ZXN0LmRsbAorLi9kZW1vL2p2bXRpL2hlYXBUcmFja2VyL2xpYi9oZWFwVHJhY2tlci5kbGwKKy4vZGVtby9qdm10aS9taW5zdC9saWIvbWluc3QuZGxsCisuL2pyZS9iaW4vYXR0YWNoLmRsbAorLi9qcmUvYmluL2phdmFfY3J3X2RlbW8uZGxsCisuL2pyZS9iaW4vanNvdW5kZHMuZGxsCisuL2Jpbi9hcHBsZXR2aWV3ZXIuZXhlCisuL2Jpbi9leHRjaGVjay5leGUKKy4vYmluL2lkbGouZXhlCisuL2Jpbi9qYXIuZXhlCisuL2Jpbi9qYXJzaWduZXIuZXhlCisuL2Jpbi9qYXZhLXJtaS5leGUKKy4vYmluL2phdmEuZXhlCisuL2Jpbi9qYXZhYy5leGUKKy4vYmluL2phdmFkb2MuZXhlCisuL2Jpbi9qYXZhaC5leGUKKy4vYmluL2phdmFwLmV4ZQorLi9iaW4vamF2YXcuZXhlCisuL2Jpbi9qY21kLmV4ZQorLi9iaW4vamNvbnNvbGUuZXhlCisuL2Jpbi9qZGIuZXhlCisuL2Jpbi9qaGF0LmV4ZQorLi9iaW4vamluZm8uZXhlCisuL2Jpbi9qbWFwLmV4ZQorLi9iaW4vanBzLmV4ZQorLi9iaW4vanJ1bnNjcmlwdC5leGUKKy4vYmluL2pzYWRlYnVnZC5leGUKKy4vYmluL2pzdGFjay5leGUKKy4vYmluL2pzdGF0LmV4ZQorLi9iaW4vanN0YXRkLmV4ZQorLi9iaW4va2V5dG9vbC5leGUKKy4vYmluL2tpbml0LmV4ZQorLi9iaW4va2xpc3QuZXhlCisuL2Jpbi9rdGFiLmV4ZQorLi9iaW4vbmF0aXZlMmFzY2lpLmV4ZQorLi9iaW4vb3JiZC5leGUKKy4vYmluL3BhY2syMDAuZXhlCisuL2Jpbi9wb2xpY3l0b29sLmV4ZQorLi9iaW4vcm1pYy5leGUKKy4vYmluL3JtaWQuZXhlCisuL2Jpbi9ybWlyZWdpc3RyeS5leGUKKy4vYmluL3NjaGVtYWdlbi5leGUKKy4vYmluL3NlcmlhbHZlci5leGUKKy4vYmluL3NlcnZlcnRvb2wuZXhlCisuL2Jpbi90bmFtZXNlcnYuZXhlCisuL2Jpbi91bnBhY2syMDAuZXhlCisuL2Jpbi93c2dlbi5leGUKKy4vYmluL3dzaW1wb3J0LmV4ZQorLi9iaW4veGpjLmV4ZQorLi9qcmUvYmluL2phdmEtcm1pLmV4ZQorLi9qcmUvYmluL2phdmEuZXhlCisuL2pyZS9iaW4vamF2YXcuZXhlCisuL2pyZS9iaW4va2V5dG9vbC5leGUKKy4vanJlL2Jpbi9raW5pdC5leGUKKy4vanJlL2Jpbi9rbGlzdC5leGUKKy4vanJlL2Jpbi9rdGFiLmV4ZQorLi9qcmUvYmluL29yYmQuZXhlCisuL2pyZS9iaW4vcGFjazIwMC5leGUKKy4vanJlL2Jpbi9wb2xpY3l0b29sLmV4ZQorLi9qcmUvYmluL3JtaWQuZXhlCisuL2pyZS9iaW4vcm1pcmVnaXN0cnkuZXhlCisuL2pyZS9iaW4vc2VydmVydG9vbC5leGUKKy4vanJlL2Jpbi90bmFtZXNlcnYuZXhlCisuL2pyZS9iaW4vdW5wYWNrMjAwLmV4ZQorIgorCisjIE9uIHdpbmRvd3MsIHRoZXJlIGFyZSB1bmF2b2lkYWJsZSBhbGxpZ25tZW50IGlzc3VlcyBtYWtpbmcKKyMgYSBwZXJmZWN0IGRpc2FzbSBkaWZmIGltcG9zc2libGUuIEZpbHRlciBvdXQgdGhlIGZvbGxvd2luZzoKKyMgKiBSYW5kb20gcGFydHMgb2YgQysrIHN5bWJvbHMgKHRoaXMgaXMgYSBiaXQgZ3JlZWR5LCBidXQgZG9lcyB0aGUgdHJpY2spCisjICAgQFhYWFhYCisjICogSGV4YWRlY2ltYWwgYWRkcmVzc2VzIHRoYXQgYXJlIHNvbWV0aW1lcyBhbGxpZ25lZCBkaWZmZXJlbnRseS4KKyMgKiBEYXRlcyBpbiB2ZXJzaW9uIHN0cmluZ3MgWFhYWF9YWF9YWC4KK0RJU19ESUZGX0ZJTFRFUj0iJFNFRCAtZSBzL1tAP11bQS1aMC05X11cezEsMjVcfS88U1lNPi9nIC1lIHMvXi5cezIsMlx9WzAtOUEtRl1cezE2LDE2XH0uXHsyLDJcfS8vZyAtZSBzL1swLTlBLUZdXHs0LDE2XH1oLzxIRVhTVFI+L2cgLWUgcy9fWzAtOV1cezQsNFx9X1swLTldWzAtOV1fWzAtOV1bMC05XS88REFURT4vZyIKKworU0tJUF9CSU5fRElGRj0idHJ1ZSIKK1NLSVBfRlVMTERVTVBfRElGRj0idHJ1ZSIKKworZmkKKworCitpZiBbICIkT1BFTkpES19UQVJHRVRfT1MiID0gIm1hY29zeCIgXTsgdGhlbgorQUNDRVBURURfSkFSWklQX0NPTlRFTlRTPSIKKy9NRVRBLUlORi9JTkRFWC5MSVNUCisiCisKK0tOT1dOX0JJTl9ESUZGPSIKKy4vanJlL2xpYi9saWJKT2JqQy5keWxpYgorIgorCitBQ0NFUFRFRF9CSU5fRElGRj0iCisuL2Jpbi9hcHBsZXR2aWV3ZXIKKy4vYmluL2V4dGNoZWNrCisuL2Jpbi9pZGxqCisuL2Jpbi9qYXIKKy4vYmluL2phcnNpZ25lcgorLi9iaW4vamF2YQorLi9iaW4vamF2YWMKKy4vYmluL2phdmFkb2MKKy4vYmluL2phdmFoCisuL2Jpbi9qYXZhcAorLi9iaW4vamNtZAorLi9iaW4vamNvbnNvbGUKKy4vYmluL2pkYgorLi9iaW4vamhhdAorLi9iaW4vamluZm8KKy4vYmluL2ptYXAKKy4vYmluL2pwcworLi9iaW4vanJ1bnNjcmlwdAorLi9iaW4vanNhZGVidWdkCisuL2Jpbi9qc3RhY2sKKy4vYmluL2pzdGF0CisuL2Jpbi9qc3RhdGQKKy4vYmluL2tleXRvb2wKKy4vYmluL25hdGl2ZTJhc2NpaQorLi9iaW4vb3JiZAorLi9iaW4vcGFjazIwMAorLi9iaW4vcG9saWN5dG9vbAorLi9iaW4vcm1pYworLi9iaW4vcm1pZAorLi9iaW4vcm1pcmVnaXN0cnkKKy4vYmluL3NjaGVtYWdlbgorLi9iaW4vc2VyaWFsdmVyCisuL2Jpbi9zZXJ2ZXJ0b29sCisuL2Jpbi90bmFtZXNlcnYKKy4vYmluL3dzZ2VuCisuL2Jpbi93c2ltcG9ydAorLi9iaW4veGpjCisuL2pyZS9iaW4vamF2YQorLi9qcmUvYmluL2tleXRvb2wKKy4vanJlL2Jpbi9vcmJkCisuL2pyZS9iaW4vcGFjazIwMAorLi9qcmUvYmluL3BvbGljeXRvb2wKKy4vanJlL2Jpbi9ybWlkCisuL2pyZS9iaW4vcm1pcmVnaXN0cnkKKy4vanJlL2Jpbi9zZXJ2ZXJ0b29sCisuL2pyZS9iaW4vdG5hbWVzZXJ2CisuL2pyZS9saWIvbGlic2Fwcm9jLmR5bGliCisuL2pyZS9saWIvc2VydmVyL2xpYmp2bS5keWxpYgorIgorCitLTk9XTl9TSVpFX0RJRkY9IgorLi9qcmUvbGliL2xpYkpPYmpDLmR5bGliCisiCisKK1NPUlRfU1lNQk9MUz0iCisuL2pyZS9saWIvbGliSk9iakMuZHlsaWIKKyIKKworS05PV05fU1lNX0RJRkY9IgorLi9qcmUvbGliL2xpYkpPYmpDLmR5bGliCisiCisKK0tOT1dOX0VMRl9ESUZGPSIKKy4vanJlL2xpYi9saWJKT2JqQy5keWxpYgorIgorCitLTk9XTl9ESVNfRElGRj0iCisuL2pyZS9saWIvbGliSk9iakMuZHlsaWIKKyIKKworZmkKZGlmZiAtLWdpdCBhL2NvbW1vbi9iaW4vY29tcGFyZWltYWdlLnNoIGIvY29tbW9uL2Jpbi9jb21wYXJlaW1hZ2Uuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlNWQxZjAuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2Jpbi9jb21wYXJlaW1hZ2Uuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwzMzUgKzAsMCBAQAotIyEvYmluL2Jhc2gKLSMKLSMgQ29weXJpZ2h0IChjKSAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0jCi0jIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0jIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0jIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotIwotIyBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0jIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotIyBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0jIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSMgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotIwotIyBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQotIyBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55Ci0jIHF1ZXN0aW9ucy4KLSMKLQotIyBNQU5VQUwKLSMKLSMgLi9jb21tb24vYmluL2NvbXBhcmVpbWFnZXMuc2ggb2xkX2pka19pbWFnZSBuZXdfamRrX2ltYWdlCi0jCi0jIENvbXBhcmUgdGhlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUuCi0jIENvbXBhcmUgdGhlIGZpbGVuYW1lcyBpbiB0aGUgZGlyZWN0b3JpZXMuCi0jIENvbXBhcmUgdGhlIGNvbnRlbnRzIG9mIHRoZSB6aXAgYXJjaGl2ZXMKLSMgQ29tcGFyZSB0aGUgY29udGVudHMgb2YgdGhlIGphciBhcmNoaXZlcwotIyBDb21wYXJlIHRoZSBuYXRpdmUgbGlicmFyaWVzCi0jIENvbXBhcmUgdGhlIG5hdGl2ZSBleGVjdXRhYmxlcwotIyBDb21wYXJlIHRoZSByZW1haW5pbmcgZmlsZXMKLSMKLSMgLi9jb21tb24vYmluL2NvbXBhcmVpbWFnZXMuc2ggb2xkX2pka19pbWFnZSBuZXdfamRrX2ltYWdlIFt6aXBzIGphcnMgbGlicyBleGVjcyBvdGhlcl0KLSMKLSMgQ29tcGFyZSBvbmx5IHRoZSBzZWxlY3RlZCBzdWJzZXQgb2YgdGhlIGltYWdlcy4KLSMKLSMgLi9jb21tb24vYmluL2NvbXBhcmVpbWFnZXMuc2ggb2xkX2pka19pbWFnZSBuZXdfamRrX2ltYWdlIENvZGVQb2ludElNLmphcgotIwotIyBDb21wYXJlIG9ubHkgdGhlIENvZGVQb2ludElNLmphciBmaWxlCi0jIENhbiBiZSB1c2VkIHRvIGNvbXBhcmUgemlwcywgbGlicmFyaWVzIGFuZCBleGVjdXRhYmxlcy4KLSMKLQotaWYgWyAieCQxIiA9ICJ4LWgiIF0gfHwgWyAieCQxIiA9ICJ4LS1oZWxwIiBdIHx8IFsgIngkMSIgPT0gIngiIF07IHRoZW4KLSAgICBlY2hvICJiYXNoIC4vY29tbW9uL2Jpbi9jb21wYXJlaW1hZ2VzLnNoIG9sZF9qZGtfaW1hZ2UgbmV3X2pka19pbWFnZSIKLSAgICBlY2hvICIiCi0gICAgZWNobyAiQ29tcGFyZSB0aGUgZGlyZWN0b3J5IHN0cnVjdHVyZS4iCi0gICAgZWNobyAiQ29tcGFyZSB0aGUgZmlsZW5hbWVzIGluIHRoZSBkaXJlY3Rvcmllcy4iCi0gICAgZWNobyAiQ29tcGFyZSB0aGUgY29udGVudHMgb2YgdGhlIHppcCBhcmNoaXZlcyIKLSAgICBlY2hvICJDb21wYXJlIHRoZSBjb250ZW50cyBvZiB0aGUgamFyIGFyY2hpdmVzIgotICAgIGVjaG8gIkNvbXBhcmUgdGhlIG5hdGl2ZSBsaWJyYXJpZXMiCi0gICAgZWNobyAiQ29tcGFyZSB0aGUgbmF0aXZlIGV4ZWN1dGFibGVzIgotICAgIGVjaG8gIkNvbXBhcmUgdGhlIHJlbWFpbmluZyBmaWxlcyIKLSAgICBlY2hvICIiCi0gICAgZWNobyAiYmFzaCAuL2NvbW1vbi9iaW4vY29tcGFyZWltYWdlcy5zaCBvbGRfamRrX2ltYWdlIG5ld19qZGtfaW1hZ2UgW3ppcHMgamFycyBsaWJzIGV4ZWNzIG90aGVyXSIKLSAgICBlY2hvICIiCi0gICAgZWNobyAiQ29tcGFyZSBvbmx5IHRoZSBzZWxlY3RlZCBzdWJzZXQgb2YgdGhlIGltYWdlcy4iCi0gICAgZWNobyAiIgotICAgIGVjaG8gImJhc2ggLi9jb21tb24vYmluL2NvbXBhcmVpbWFnZXMuc2ggb2xkX2pka19pbWFnZSBuZXdfamRrX2ltYWdlIENvZGVQb2ludElNLmphciIKLSAgICBlY2hvICIiCi0gICAgZWNobyAiQ29tcGFyZSBvbmx5IHRoZSBDb2RlUG9pbnRJTS5qYXIgZmlsZSIKLSAgICBlY2hvICJDYW4gYmUgdXNlZCB0byBjb21wYXJlIHppcHMsIGxpYnJhcmllcyBhbmQgZXhlY3V0YWJsZXMuIgotICAgIGV4aXQgMTAKLWZpCi0KLU9MRD0iJDEiCi1ORVc9IiQyIgotQ01EPSIkMyIKLQotRElGRl9SRVNVTFQ9MAotCi1DTVBfWklQUz1mYWxzZQotQ01QX0pBUlM9ZmFsc2UKLUNNUF9MSUJTPWZhbHNlCi1DTVBfRVhFQ1M9ZmFsc2UKLUNNUF9PVEhFUj1mYWxzZQotCi1GSUxURVI9ImNhdCIKLQotaWYgWyAtbiAiJENNRCIgXTsgdGhlbgotICBjYXNlICIkQ01EIiBpbgotICAgIHppcHMpCi0gICAgICAgICAgQ01QX1pJUFM9dHJ1ZQotICAgICAgOzsKLSAgICBqYXJzKQotICAgICAgICAgIENNUF9KQVJTPXRydWUKLSAgICAgIDs7Ci0gICAgbGlicykKLSAgICAgICAgICBDTVBfTElCUz10cnVlCi0gICAgICA7OwotICAgIGV4ZWNzKQotICAgICAgICAgIENNUF9FWEVDUz10cnVlCi0gICAgICA7OwotICAgIG90aGVyKQotICAgICAgICAgIENNUF9PVEhFUj10cnVlCi0gICAgICA7OwotICAgICopCi0gICAgICAgICAgQ01QX1pJUFM9dHJ1ZQotICAgICAgICAgIENNUF9KQVJTPXRydWUKLSAgICAgICAgICBDTVBfTElCUz10cnVlCi0gICAgICAgICAgQ01QX0VYRUNTPXRydWUKLSAgICAgICAgICBDTVBfT1RIRVI9dHJ1ZQotICAgICAgICAgIEZJTFRFUj0iZ3JlcCAkMyIKLSAgICAgIDs7Ci0gIGVzYWMKLWVsc2UKLSAgICBDTVBfWklQUz10cnVlCi0gICAgQ01QX0pBUlM9dHJ1ZQotICAgIENNUF9MSUJTPXRydWUKLSAgICBDTVBfRVhFQ1M9dHJ1ZQotICAgIENNUF9PVEhFUj10cnVlCi1maQotCi1ESUZGSkFSWklQPSIvYmluL2Jhc2ggYGRpcm5hbWUgJDBgL2RpZmZqYXJ6aXAuc2giCi1ESUZGTElCPSIvYmluL2Jhc2ggYGRpcm5hbWUgJDBgL2RpZmZsaWIuc2giCi1ESUZGRVhFQz0iL2Jpbi9iYXNoIGBkaXJuYW1lICQwYC9kaWZmZXhlYy5zaCIKLWV4cG9ydCBDT01QQVJFX1JPT1Q9L3RtcC9jaW1hZ2VzLiRVU0VSCi1ta2RpciAtcCAkQ09NUEFSRV9ST09UCi0KLSMgTG9hZCB0aGUgY29ycmVjdCBleGNlcHRpb24gbGlzdC4KLWNhc2UgImB1bmFtZSAtc2AiIGluCi0gICAgTGludXgpCi0gICAgICAgIC4gYGRpcm5hbWUgJDBgL2V4Y2VwdGlvbl9saXN0X2xpbnV4Ci0gICAgICAgIDs7Ci1lc2FjCi0KLWVjaG8KLWVjaG8gQ29tcGFyaW5nICRPTEQgdG8gJE5FVwotZWNobwotCi0oY2QgJE9MRCAmJiBmaW5kIC4gLXR5cGUgZCB8IHNvcnQgPiAkQ09NUEFSRV9ST09UL2Zyb21fZGlycykKLShjZCAkTkVXICYmIGZpbmQgLiAtdHlwZSBkIHwgc29ydCA+ICRDT01QQVJFX1JPT1QvdG9fZGlycykKLQotZWNobyAtbiBEaXJlY3Rvcnkgc3RydWN0dXJlLi4uCi1pZiBkaWZmICRDT01QQVJFX1JPT1QvZnJvbV9kaXJzICRDT01QQVJFX1JPT1QvdG9fZGlycyA+IC9kZXYvbnVsbDsgdGhlbgotICAgIGVjaG8gSWRlbnRpY2FsIQotZWxzZQotICAgIGVjaG8gRGlmZmVyZW5jZXMgZm91bmQuCi0gICAgRElGRl9SRVNVTFQ9MQotICAgICMgRGlmZmVyZW5jZXMgaW4gZGlyZWN0b3JpZXMgZm91bmQuCi0gICAgT05MWV9PTEQ9JChkaWZmICRDT01QQVJFX1JPT1QvZnJvbV9kaXJzICRDT01QQVJFX1JPT1QvdG9fZGlycyB8IGdyZXAgJzwnKQotICAgIGlmIFsgIiRPTkxZX09MRCIgXTsgdGhlbgotICAgICAgICBlY2hvIE9ubHkgaW4gJE9MRAotICAgICAgICBlY2hvICRPTkxZX09MRCB8IHNlZCAnc3w8IC4vfFx0fGcnIHwgc2VkICdzLyAvXG4vZycKLSAgICBmaQotICAgICMgRGlmZmVyZW5jZXMgaW4gZGlyZWN0b3JpZXMgZm91bmQuCi0gICAgT05MWV9ORVc9JChkaWZmICRDT01QQVJFX1JPT1QvZnJvbV9kaXJzICRDT01QQVJFX1JPT1QvdG9fZGlycyB8IGdyZXAgJz4nKQotICAgIGlmIFsgIiRPTkxZX05FVyIgXTsgdGhlbgotICAgICAgICBlY2hvIE9ubHkgaW4gJE5FVwotICAgICAgICBlY2hvICRPTkxZX05FVyB8IHNlZCAnc3w+IC4vfFx0fGcnIHwgc2VkICdzLyAvXG4vZycKLSAgICBmaQotZmkKLQotKGNkICRPTEQgJiYgZmluZCAuIC10eXBlIGYgfCBzb3J0ID4gJENPTVBBUkVfUk9PVC9mcm9tX2ZpbGVzKQotKGNkICRORVcgJiYgZmluZCAuIC10eXBlIGYgfCBzb3J0ID4gJENPTVBBUkVfUk9PVC90b19maWxlcykKLQotZWNobyAtbiBGaWxlIG5hbWVzLi4uCi1pZiBkaWZmICRDT01QQVJFX1JPT1QvZnJvbV9maWxlcyAkQ09NUEFSRV9ST09UL3RvX2ZpbGVzID4gL2Rldi9udWxsOyB0aGVuCi0gICAgZWNobyBJZGVudGljYWwhCi1lbHNlCi0gICAgZWNobyBEaWZmZXJlbmNlcyBmb3VuZC4KLSAgICBESUZGX1JFU1VMVD0xCi0gICAgIyBEaWZmZXJlbmNlcyBpbiBkaXJlY3RvcmllcyBmb3VuZC4KLSAgICBPTkxZX09MRD0kKGRpZmYgJENPTVBBUkVfUk9PVC9mcm9tX2ZpbGVzICRDT01QQVJFX1JPT1QvdG9fZmlsZXMgfCBncmVwICc8JykKLSAgICBpZiBbICIkT05MWV9PTEQiIF07IHRoZW4KLSAgICAgICAgZWNobyBPbmx5IGluICRPTEQKLSAgICAgICAgZWNobyAiJE9OTFlfT0xEIiB8IHNlZCAnc3w8IC4vfCAgICB8ZycKLSAgICBmaQotICAgICMgRGlmZmVyZW5jZXMgaW4gZGlyZWN0b3JpZXMgZm91bmQuCi0gICAgT05MWV9ORVc9JChkaWZmICRDT01QQVJFX1JPT1QvZnJvbV9maWxlcyAkQ09NUEFSRV9ST09UL3RvX2ZpbGVzIHwgZ3JlcCAnPicpCi0gICAgaWYgWyAiJE9OTFlfTkVXIiBdOyB0aGVuCi0gICAgICAgIGVjaG8gT25seSBpbiAkTkVXCi0gICAgICAgIGVjaG8gIiRPTkxZX05FVyIgfCBzZWQgJ3N8PiAuL3wgICAgfGcnCi0gICAgZmkKLWZpCi0KLWVjaG8gLW4gUGVybWlzc2lvbnMuLi4KLWZvdW5kPSIiCi1mb3IgZiBpbiBgY2QgJE9MRCAmJiBmaW5kIC4gLXR5cGUgZmAKLWRvCi0gICAgaWYgWyAhIC1mICR7T0xEfS8kZiBdOyB0aGVuIGNvbnRpbnVlOyBmaQotICAgIGlmIFsgISAtZiAke05FV30vJGYgXTsgdGhlbiBjb250aW51ZTsgZmkKLSAgICBPUD1gbHMgLWwgJHtPTER9LyRmIHwgYXdrICd7cHJpbnRmKCIlLjEwc1xuIiwgJDEpO30nYAotICAgIE5QPWBscyAtbCAke05FV30vJGYgfCBhd2sgJ3twcmludGYoIiUuMTBzXG4iLCAkMSk7fSdgCi0gICAgaWYgWyAiJE9QIiAhPSAiJE5QIiBdCi0gICAgdGhlbgotCWlmIFsgLXogIiRmb3VuZCIgXTsgdGhlbiBlY2hvIDsgZm91bmQ9InllcyI7IGZpCi0JcHJpbnRmICJcdG9sZDogJHtPUH0gbmV3OiAke05QfVx0JGZcbiIKLSAgICBmaQotCi0gICAgT0Y9YGNkICR7T0xEfSAmJiBmaWxlICRmYAotICAgIE5GPWBjZCAke05FV30gJiYgZmlsZSAkZmAKLSAgICBpZiBbICIkZiIgPSAiLi9zcmMuemlwIiBdCi0gICAgdGhlbgotCWlmIFsgImBlY2hvICRPRiB8IGdyZXAgLWljIHppcGAiIC1ndCAwIC1hICJgZWNobyAkTkYgfCBncmVwIC1pYyB6aXBgIiAtZ3QgMCBdCi0JdGhlbgotCSAgICAjIHRoZSB3YXkgd2UgcHJvZHVjZXMgemlwLWZpbGVzIG1ha2UgaXQgc28gdGhhdCBkaXJlY3RvcmllcyBhcmUgc3RvcmVkIGluIG9sZCBmaWxlCi0JICAgICMgYnV0IG5vdCBpbiBuZXcgKG9ubHkgZmlsZXMgd2l0aCBmdWxsLXBhdGgpCi0JICAgICMgdGhpcyBtYWtlcyBmaWxlLTUuMDkgcmVwb3J0IHRoZW0gYXMgZGlmZmVyZW50Ci0JICAgIGNvbnRpbnVlOwotCWZpCi0gICAgZmkKLQotICAgIGlmIFsgIiRPRiIgIT0gIiRORiIgXQotICAgIHRoZW4KLQlpZiBbIC16ICIkZm91bmQiIF07IHRoZW4gZWNobyA7IGZvdW5kPSJ5ZXMiOyBmaQotCXByaW50ZiAiXHRGSUxFOiBvbGQ6ICR7T0Z9IG5ldzogJHtORn1cdCRmXG4iCi0gICAgZmkKLWRvbmUKLWlmIFsgLXogIiRmb3VuZCIgXTsgdGhlbiBlY2hvIDsgZm91bmQ9InllcyI7IGZpCi0KLUdFTkVSQUxfRklMRVM9JChjZCAkT0xEICYmIGZpbmQgLiAtdHlwZSBmICEgLW5hbWUgIiouc28iICEgLW5hbWUgIiouamFyIiAhIC1uYW1lICIqLnppcCIgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEgLW5hbWUgIiouZGVidWdpbmZvIiAhIC1uYW1lICIqLmR5bGliIiAhIC1uYW1lICJqZXhlYyIgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEgLW5hbWUgImN0LnN5bSIgISAtbmFtZSAiKi5kaXoiIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZ3JlcCAtdiAiLi9iaW4vIiAgfCBzb3J0IHwgJEZJTFRFUikKLWVjaG8gR2VuZXJhbCBmaWxlcy4uLgotZm9yIGYgaW4gJEdFTkVSQUxfRklMRVMKLWRvCi0gICAgaWYgWyAtZSAkTkVXLyRmIF07IHRoZW4KLSAgICAgICAgRElGRl9PVVQ9JChkaWZmICRPTEQvJGYgJE5FVy8kZiAyPiYxKQotICAgICAgICBpZiBbIC1uICIkRElGRl9PVVQiIF07IHRoZW4KLSAgICAgICAgICAgIGVjaG8gJGYKLSAgICAgICAgICAgIGVjaG8gIiRESUZGX09VVCIKLSAgICAgICAgZmkKLSAgICBmaQotZG9uZQotCi0KLWlmIFsgIngkQ01QX1pJUFMiID09ICJ4dHJ1ZSIgXTsgdGhlbgotICAgIFpJUFM9JChjZCAkT0xEICYmIGZpbmQgLiAtdHlwZSBmIC1uYW1lICIqLnppcCIgfCBzb3J0IHwgJEZJTFRFUikKLQotICAgIGlmIFsgLW4gIiRaSVBTIiBdOyB0aGVuCi0gICAgICAgIGVjaG8gWmlwIGZpbGVzLi4uCi0KLSAgICAgICAgZm9yIGYgaW4gJFpJUFMKLSAgICAgICAgZG8KLSAgICAgICAgICAgICRESUZGSkFSWklQICRPTEQvJGYgJE5FVy8kZiAkT0xEICRORVcgCi0gICAgICAgICAgICBpZiBbICIkPyIgIT0gIjAiIF07IHRoZW4KLSAgICAgICAgICAgICAgICBESUZGX1JFU1VMVD0xCi0gICAgICAgICAgICBmaQotICAgICAgICBkb25lCi0gICBmaSAgICAgICAgCi1maSAgICAKLQotaWYgWyAieCRDTVBfSkFSUyIgPT0gInh0cnVlIiBdOyB0aGVuCi0gICAgSkFSUz0kKGNkICRPTEQgJiYgZmluZCAuIC10eXBlIGYgLW5hbWUgIiouamFyIiAtbyAtbmFtZSAiY3Quc3ltIiB8IHNvcnQgfCAkRklMVEVSKQotCi0gICAgaWYgWyAtbiAiJEpBUlMiIF07IHRoZW4KLSAgICAgICAgZWNobyBKYXIgZmlsZXMuLi4KLQotICAgICAgICBmb3IgZiBpbiAkSkFSUwotICAgICAgICBkbwotICAgICAgICAgICAgRElGRkpBUl9PVVRQVVQ9YCRESUZGSkFSWklQICRPTEQvJGYgJE5FVy8kZiAkT0xEICRORVdgCi0gICAgICAgICAgICBESUZGSkFSX1JFU1VMVD0kPwotICAgICAgICAgICAgaWYgWyAiJERJRkZKQVJfUkVTVUxUIiAhPSAiMCIgXTsgdGhlbgotICAgICAgICAgICAgICAgIGZvciBkaWZmIGluICRMSVNUX0RJRkZfSkFSOyBkbwotICAgICAgICAgICAgICAgICAgICBESUZGSkFSX09VVFBVVD1gZWNobyAiJERJRkZKQVJfT1VUUFVUIiB8IGdyZXAgLXYgIiRkaWZmImAKLSAgICAgICAgICAgICAgICBkb25lCi0gICAgICAgICAgICAgICAgaWYgWyAiYGVjaG8gIiRESUZGSkFSX09VVFBVVCIgfCBncmVwIC12ICJEaWZmZXJpbmcgZmlsZXMgaW4iYCIgIT0gIiIgXTsgdGhlbgotICAgICAgICAgICAgICAgICAgICBESUZGX1JFU1VMVD0xCi0gICAgICAgICAgICAgICAgICAgIGVjaG8gIiRESUZGSkFSX09VVFBVVCIKLSAgICAgICAgICAgICAgICBmaQotICAgICAgICAgICAgZmkKLSAgICAgICAgZG9uZQotICAgIGZpCi1maQotCi1pZiBbICJ4JEZJTFRFUiIgIT0gInhjYXQiIF07IHRoZW4KLSAgICBWSUVXPXZpZXcKLWVsc2UKLSAgICBWSUVXPQotZmkKLQotaWYgWyAieCRDTVBfTElCUyIgPT0gInh0cnVlIiBdOyB0aGVuCi0gICAgTElCUz0kKGNkICRPTEQgJiYgZmluZCAuIC1uYW1lICdsaWIqLnNvJyAtbyAtbmFtZSAnKi5keWxpYicgLW8gLW5hbWUgJyouZGxsJyB8IHNvcnQgfCAkRklMVEVSKQotCi0gICAgaWYgWyAtbiAiJExJQlMiIF07IHRoZW4KLSAgICAgICAgZWNobyBMaWJyYXJpZXMuLi4KLSAgICAgICAgZm9yIGYgaW4gJExJQlMKLSAgICAgICAgZG8KLSAgICAgICAgICAgIERJRkZMSUJfT1VUUFVUPWAkRElGRkxJQiAkT0xELyRmICRORVcvJGYgJE9MRCAkTkVXICRWSUVXYAotICAgICAgICAgICAgRElGRkxJQl9SRVNVTFQ9JD8KLSAgICAgICAgICAgIGlmIFsgIiRESUZGTElCX1JFU1VMVCIgPSAiMCIgXTsgdGhlbgotICAgICAgICAgICAgICAgIDoKLSAgICAgICAgICAgICAgICAjZWNobyAiT0s6ICRESUZGTElCX09VVFBVVCIKLSAgICAgICAgICAgIGVsaWYgWyAiJERJRkZMSUJfUkVTVUxUIiA9ICIyIiBdICYmIFtbICIkTElTVF9ESUZGX1NJWkUgJExJU1RfRElGRl9CWVRFIiA9PSAqIiR7ZjoyfSIqIF1dOyB0aGVuCi0gICAgICAgICAgICAgICAgOgotICAgICAgICAgICAgICAgICNlY2hvICJPSzogJERJRkZMSUJfT1VUUFVUIgotICAgICAgICAgICAgZWxpZiBbICIkRElGRkxJQl9SRVNVTFQiID0gIjEiIF0gJiYgW1sgIiRMSVNUX0RJRkZfQllURSIgPT0gKiIke2Y6Mn0iKiBdXTsgdGhlbgotICAgICAgICAgICAgICAgIDoKLSAgICAgICAgICAgICAgICAjZWNobyAiT0s6ICRESUZGTElCX09VVFBVVCIKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBlY2hvICIkRElGRkxJQl9PVVRQVVQiCi0gICAgICAgICAgICAgICAgRElGRl9SRVNVTFQ9MQotICAgICAgICAgICAgZmkKLSAgICAgICAgZG9uZQotICAgIGZpCi1maQotCi1pZiBbICJ4JENNUF9FWEVDUyIgPT0gInh0cnVlIiBdOyB0aGVuCi0gICAgaWYgWyAkT1NUWVBFID09ICJjeWd3aW4iIF07IHRoZW4KLSAgICAgICAgRVhFQ1M9JChjZCAkT0xEICYmIGZpbmQgLiAtdHlwZSBmIC1uYW1lICcqLmV4ZScgfCBzb3J0IHwgJEZJTFRFUikKLSAgICBlbHNlCi0gICAgICAgIEVYRUNTPSQoY2QgJE9MRCAmJiBmaW5kIC4gLXR5cGUgZiAtcGVybSAtMTAwIFwhIFwoIC1uYW1lICcqLnNvJyAtbyAtbmFtZSAnKi5keWxpYicgLW8gLW5hbWUgJyouZGxsJyBcKSB8IHNvcnQgfCAkRklMVEVSKQotICAgIGZpCi0KLQotICAgIGlmIFsgLW4gIiRFWEVDUyIgXTsgdGhlbgotICAgICAgICBlY2hvIEV4ZWN1dGFibGVzLi4uCi0KLSAgICAgICAgZm9yIGYgaW4gJEVYRUNTCi0gICAgICAgIGRvCi0gICAgICAgICAgICBESUZGRVhFQ19PVVRQVVQ9YCRESUZGRVhFQyAkT0xELyRmICRORVcvJGYgJE9MRCAkTkVXICRWSUVXYAotICAgICAgICAgICAgRElGRkVYRUNfUkVTVUxUPSQ/Ci0gICAgICAgICAgICBpZiBbICIkRElGRkVYRUNfUkVTVUxUIiA9ICIwIiBdOyB0aGVuCi0gICAgICAgICAgICAgICAgOgotICAgICAgICAgICAgICAgICNlY2hvICJPSzogJERJRkZFWEVDX09VVFBVVCIKLSAgICAgICAgICAgIGVsaWYgWyAiJERJRkZFWEVDX1JFU1VMVCIgPSAiMiIgXSAmJiBbWyAiJExJU1RfRElGRl9TSVpFICRMSVNUX0RJRkZfQllURSIgPT0gKiIke2Y6Mn0iKiBdXTsgdGhlbgotICAgICAgICAgICAgICAgIDoKLSAgICAgICAgICAgICAgICAjZWNobyAiT0s6ICRESUZGRVhFQ19PVVRQVVQiCi0gICAgICAgICAgICBlbGlmIFsgIiRESUZGRVhFQ19SRVNVTFQiID0gIjEiIF0gJiYgW1sgIiRMSVNUX0RJRkZfQllURSIgPT0gKiIke2Y6Mn0iKiBdXTsgdGhlbgotICAgICAgICAgICAgICAgIDoKLSAgICAgICAgICAgICAgICAjZWNobyAiT0s6ICRESUZGRVhFQ19PVVRQVVQiCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZWNobyAiJERJRkZFWEVDX09VVFBVVCIKLSAgICAgICAgICAgICAgICBESUZGX1JFU1VMVD0xCi0gICAgICAgICAgICBmaQotICAgICAgICBkb25lCi0gICAgZmkKLWZpCi0KLWV4aXQgJERJRkZfUkVTVUxUCmRpZmYgLS1naXQgYS9jb21tb24vYmluL2RpZmZleGVjLnNoIGIvY29tbW9uL2Jpbi9kaWZmZXhlYy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVmN2I2Ny4uMDAwMDAwMAotLS0gYS9jb21tb24vYmluL2RpZmZleGVjLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLSMhL2Jpbi9iYXNoCi0jCi0jIENvcHlyaWdodCAoYykgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotIwotIyBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotIyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSMKLSMgVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0jIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotIyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSMgYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotIyAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0jIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSMKLSMgUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKLSMgb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQotIyBxdWVzdGlvbnMuCi0jCi0KLWlmIFsgJCMgLWx0IDIgXSAKLXRoZW4KLSAgZWNobyAiRGlmZiB0d28gZXhlY3V0YWJsZXMuIFJldHVybiBjb2RlczoiCi0gIGVjaG8gIjAgLSBubyBkaWZmIgotICBlY2hvICIxIC0gSWRlbnRpY2FsIHN5bWJvbHMgQU5EIHNpemUsIEJVVCBub3QgYnl0ZXdpc2UgaWRlbnRpY2FsIgotICBlY2hvICIyIC0gSWRlbnRpY2FsIHN5bWJvbHMgQlVUIE5FVyBzaXplIgotICBlY2hvICIzIC0gRGlmZmVyZW5jZXMsIGNvbnRlbnQgQlVUIFNBTUUgc2l6ZSIKLSAgZWNobyAiNCAtIERpZmZlcmVuY2VzLCBjb250ZW50IEFORCBzaXplIgotICBlY2hvICIxMCAtIENvdWxkIG5vdCBwZXJmb3JtIGRpZmYiCi0gIGVjaG8gIlVzZSAncXVpZXQnIHRvIGRpc2FibGUgYW55IG91dHB1dC4iCi0gIGVjaG8gIlN5bnRheDogJDAgZmlsZTEgZmlsZTIgW3F1aWV0XSIKLSAgZXhpdCAxMAotZmkKLQotaWYgWyAhIC1mICQxIF0KLXRoZW4KLSAgZWNobyAkMSBkb2VzIG5vdCBleGlzdAotICBleGl0IDEwCi1maQotCi1pZiBbICEgLWYgJDIgXQotdGhlbgotICBlY2hvICQyIGRvZXMgbm90IGV4aXN0Ci0gIGV4aXQgMTAKLWZpCi0KLWlmIFsgImB1bmFtZWAiID09ICJTdW5PUyIgXTsgdGhlbgotICAgIGlmIFsgLWYgImB3aGljaCBubWAiIF07IHRoZW4KLSAgICAgICAgTk09bm0KLSAgICBlbGlmIFsgLWYgImB3aGljaCBnbm1gIiBdOyB0aGVuCi0gICAgICAgIE5NPWdubQotICAgIGVsc2UKLSAgICAgICAgZWNobyAiTm8gbm0gY29tbWFuZCBmb3VuZCIKLSAgICAgICAgZXhpdCAxMAotICAgIGZpCi0gICAgTEREPWxkZAotZWxpZiBbICRPU1RZUEUgPT0gImN5Z3dpbiIgXTsgdGhlbgotICAgIE5NPSIkVlMxMDBDT01OVE9PTFMvLi4vLi4vVkMvYmluL2FtZDY0L2R1bXBiaW4uZXhlIgotICAgIE5NX0FSR1M9L2V4cG9ydHMKLSAgICBMREQ9Ci1lbGlmIFsgImB1bmFtZWAiID09ICJEYXJ3aW4iIF07IHRoZW4KLSAgICBOTT1ubQotICAgIExERD0ib3Rvb2wgLUwiCi1lbHNlCi0gICAgTk09bm0KLSAgICBMREQ9bGRkCi1maQotCi0jIFNob3VsZCB0aGUgZGlmZmVyZW5jZXMgYmUgdmlld2VkPwotVklFVz0KLSMgWW91IGNhbiBkbyBleHBvcnQgRElGRj1tZWxkIHRvIHZpZXcKLSMgYW55IGRpZmZlcmVuY2VzIHVzaW5nIG1lbGQgaW5zdGVhZC4KLWlmIFsgLW4gIiRESUZGIiBdOyB0aGVuCi0gICAgRElGRj0iJERJRkYiCi1lbHNlCi0gICAgRElGRj1kaWZmCi1maQotT0xEPSQoY2QgJChkaXJuYW1lICQxKSAmJiBwd2QpLyQoYmFzZW5hbWUgJDEpCi1ORVc9JChjZCAkKGRpcm5hbWUgJDIpICYmIHB3ZCkvJChiYXNlbmFtZSAkMikKLQotT0xEX1NJWkU9JChscyAtbCAiJE9MRCIgfCBhd2sgJ3sgcHJpbnQgJDUgfScpCi1ORVdfU0laRT0kKGxzIC1sICIkTkVXIiB8IGF3ayAneyBwcmludCAkNSB9JykKLQotaWYgWyAkIyAtZ3QgMyBdCi10aGVuCi0gICAgUk9PVDE9JChjZCAkMyAmJiBwd2QpCi0gICAgUk9PVDI9JChjZCAkNCAmJiBwd2QpCi0gICAgT0xEX05BTUU9JChlY2hvICRPTEQgfCBzZWQgInN8JFJPT1QxL3x8IikKLSAgICBORVdfTkFNRT0kKGVjaG8gJE5FVyB8IHNlZCAic3wkUk9PVDIvfHwiKQotICAgIGlmIFsgIngkNSIgPT0gInh2aWV3IiBdOyB0aGVuIFZJRVc9dmlldzsgZmkKLWVsc2UKLSAgICBST09UMT0kKGRpcm5hbWUgJE9MRCkvCi0gICAgUk9PVDI9JChkaXJuYW1lICRORVcpLwotICAgIE9MRF9OQU1FPSRPTEQKLSAgICBORVdfTkFNRT0kTkVXCi0gICAgaWYgWyAieCQzIiA9PSAieHZpZXciIF07IHRoZW4gVklFVz12aWV3OyBmaQotZmkKLQotaWYgY21wICRPTEQgJE5FVyA+IC9kZXYvbnVsbAotdGhlbgotICAgICMgVGhlIGZpbGVzIHdlcmUgYnl0ZXdpc2UgaWRlbnRpY2FsLgotICAgIGVjaG8gSWRlbnRpY2FsOiAkT0xEX05BTUUKLSAgICBleGl0IDAKLWZpCi0KLU9MRF9TWU1CT0xTPSRDT01QQVJFX1JPT1QvJE9MRF9OQU1FLm9sZAotTkVXX1NZTUJPTFM9JENPTVBBUkVfUk9PVC8kTkVXX05BTUUubmV3Ci0KLW1rZGlyIC1wICQoZGlybmFtZSAkT0xEX1NZTUJPTFMpCi1ta2RpciAtcCAkKGRpcm5hbWUgJE5FV19TWU1CT0xTKQotCi1pZiBbICRPU1RZUEUgPT0gImN5Z3dpbiIgXTsgdGhlbgotICAgICIkTk0iICROTV9BUkdTICRPTEQgfCBncmVwICIgPSAiID4gJE9MRF9TWU1CT0xTCi0gICAgIiROTSIgJE5NX0FSR1MgJE5FVyB8IGdyZXAgIiA9ICIgPiAkTkVXX1NZTUJPTFMKLSAgICAiJE5NIiAkTk1fQVJHUyAkT0xEID4gJE9MRF9TWU1CT0xTLmZ1bGwKLSAgICAiJE5NIiAkTk1fQVJHUyAkTkVXID4gJE5FV19TWU1CT0xTLmZ1bGwKLWVsc2UKLSAgICAjIFN0cmlwIHRoZSBhZGRyZXNzZXMsIGp1c3QgY29tcGFyZSB0aGUgb3JkZXJpbmcgb2YgdGhlIHN5bWJvbHMuCi0gICAgJE5NICRPTEQgfCBjdXQgLWYgMi0gLWQgJyAnID4gJE9MRF9TWU1CT0xTCi0gICAgJE5NICRORVcgfCBjdXQgLWYgMi0gLWQgJyAnID4gJE5FV19TWU1CT0xTCi0gICAgIyBCdXQgc3RvcmUgdGhlIGZ1bGwgaW5mb3JtYXRpb24gZm9yIGVhc3kgZGlmZiBhY2Nlc3MuCi0gICAgJE5NICRPTEQgID4gJE9MRF9TWU1CT0xTLmZ1bGwKLSAgICAkTk0gJE5FVyAgPiAkTkVXX1NZTUJPTFMuZnVsbAotZmkKLQotRElGRlM9JChMQU5HPUMgZGlmZiAkT0xEX1NZTUJPTFMgJE5FV19TWU1CT0xTKQotCi1pZiBbICIke0xERH0iIF0KLXRoZW4KLSAgICBOQU1FPWBiYXNlbmFtZSAkT0xEYAotICAgIFRNUD0kQ09NUEFSRV9ST09UL2xkZC9sZGQuJHtOQU1FfQotICAgIHJtIC1yZiAiJHtUTVB9IgotICAgIG1rZGlyIC1wICIke1RNUH0iCi0KLSAgICAoY2QgIiR7VE1QfSIgJiYgY3AgJE9MRCAuICYmICR7TEREfSAke05BTUV9IHwgYXdrICd7IHByaW50ICQxO30nIHwgc29ydCB8IHRlZSBkZXAub2xkIHwgdW5pcSA+IGRlcC51bmlxLm9sZCkKLSAgICAoY2QgIiR7VE1QfSIgJiYgY3AgJE5FVyAuICYmICR7TEREfSAke05BTUV9IHwgYXdrICd7IHByaW50ICQxO30nIHwgc29ydCB8IHRlZSBkZXAubmV3IHwgdW5pcSA+IGRlcC51bmlxLm5ldykKLSAgICAoY2QgIiR7VE1QfSIgJiYgcm0gLWYgJHtOQU1FfSkKLSAgICAKLSAgICBESUZGU19ERVA9JChMQU5HPUMgZGlmZiAiJHtUTVB9L2RlcC5vbGQiICIke1RNUH0vZGVwLm5ldyIpCi0gICAgRElGRlNfVU5JUV9ERVA9JChMQU5HPUMgZGlmZiAiJHtUTVB9L2RlcC51bmlxLm9sZCIgIiR7VE1QfS9kZXAudW5pcS5uZXciKQotICAgIAotICAgIERFUF9NU0c9Ci0gICAgaWYgWyAteiAiJHtESUZGU19VTklRX0RFUH0iIC1hIC16ICIke0RJRkZTX0RFUH0iIF07IHRoZW4KLSAgICAgICBERVBfTVNHPSJJZGVudGljYWwgZGVwZW5kZW5jaWVzIgotICAgIGVsaWYgWyAteiAiJHtESUZGU19VTklRX0RFUH0iIF07IHRoZW4KLSAgICAgICBERVBfTVNHPSJSZWR1bmRhbnQgZHVwbGljYXRlIGRlcGVuZGVuY2llcyBhZGRlZCIKLSAgICAgICBSRVM9MQotICAgIGVsc2UKLSAgICAgICBERVBfTVNHPSJESUZGRVJFTlQgZGVwZW5kZW5jaWVzIgotICAgICAgIFJFUz0xCi0gICAgZmkKLWZpCi0KLVJFU1VMVD0wCi0KLWlmIFsgLW4gIiRESUZGUyIgXTsgdGhlbgotICAgaWYgWyAkT0xEX1NJWkUgLW5lICRORVdfU0laRSBdCi0gICB0aGVuCi0gICAgICAgZWNobyBEaWZmZXJlbmNlcywgY29udGVudCBBTkQgc2l6ZSAgICAgOiAkREVQX01TRyA6ICRPTERfTkFNRSAKLSAgICAgICBSRVNVTFQ9NAotICAgZWxzZQotICAgICAgIGVjaG8gRGlmZmVyZW5jZXMsIGNvbnRlbnQgQlVUIFNBTUUgc2l6ZTogJERFUF9NU0cgOiAkT0xEX05BTUUgCi0gICAgICAgUkVTVUxUPTMKLSAgIGZpCi0gICBpZiBbICJ4JFZJRVciID09ICJ4dmlldyIgXTsgdGhlbgotICAgICAgIExBTkc9QyAkRElGRiAkT0xEX1NZTUJPTFMgJE5FV19TWU1CT0xTCi0gICBmaQotZWxzZQotICAgaWYgWyAkT0xEX1NJWkUgLW5lICRORVdfU0laRSBdCi0gICB0aGVuCi0gICAgICAgZWNobyBJZGVudGljYWwgc3ltYm9scyBCVVQgTkVXIHNpemUgICAgOiAkREVQX01TRyA6ICRPTERfTkFNRSAKLSAgICAgICBSRVNVTFQ9MgotICAgZWxzZQotICAgICAgIGVjaG8gSWRlbnRpY2FsIHN5bWJvbHMgQU5EIHNpemUsIEJVVCBub3QgYnl0ZXdpc2UgaWRlbnRpY2FsOiAkREVQX01TRyA6ICRPTERfTkFNRSAKLSAgICAgICBSRVNVTFQ9MQotICAgZmkKLWZpCi0KLWV4aXQgJFJFU1VMVAotCi0KLQpkaWZmIC0tZ2l0IGEvY29tbW9uL2Jpbi9kaWZmamFyemlwLnNoIGIvY29tbW9uL2Jpbi9kaWZmamFyemlwLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWQwYTQyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9iaW4vZGlmZmphcnppcC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0jIS9iaW4vYmFzaAotIwotIyBDb3B5cmlnaHQgKGMpIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSMKLSMgVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0jCi0jIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSMgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0jIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSMgMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotIyBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0jCi0jIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCi0jIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKLSMgcXVlc3Rpb25zLgotIwotCi0jIFNpbXBsZSB0b29sIHRvIGRpZmYgdHdvIGphciBvciB6aXAgZmlsZXMuIEl0IHVucGFja3MgdGhlIGphci96aXAgZmlsZXMgYW5kCi0jIHJlcG9ydHMgaWYgZmlsZXMgZGlmZmVycyBhbmQgaWYgZmlsZXMgYXJlIG5ldyBvciBtaXNzaW5nLgotIyBBc3N1bWVzIGdudSBkaWZmLgotCi0jIFRoZXJlIGFyZSBhIGZldyBzb3VyY2UgZmlsZXMgdGhhdCBoYXZlIERPUyBsaW5lIGVuZGluZ3MgaW4gdGhlCi0jIGpheHAvamF4d3Mgc291cmNlIGRyb3BzLCB3aGVuIHRoZSBzb3VyY2VzIHdlcmUgYWRkZWQgdG8gdGhlIHJlcG9zaXRvcnkKLSMgdGhlIHNvdXJjZSBmaWxlcyB3ZXJlIGNvbnZlcnRlZCB0byBVTklYIGxpbmUgZW5kaW5ncy4KLSMgRm9yIG5vdyB3ZSBpZ25vcmUgdGhlc2UgZGlmZmVyZW5jZXMuCi1ESUZGX0ZMQUdTPSItLXN0cmlwLXRyYWlsaW5nLWNyIgotI3NldCAteAotCi1pZiBbICQjIC1sdCAyIF0gCi10aGVuCi0gIGVjaG8gIkRpZmYgdHdvIGphci96aXAgZmlsZXMuIFJldHVybiBjb2RlczogMCAtIG5vIGRpZmYsIDEgLSBkaWZmLCAyIC0gY291bGRuJ3QgcGVyZm9ybSBkaWZmIgotICBlY2hvICJTeW50YXg6ICQwIG9sZF9hcmNoaXZlIG5ld19hcmNoaXZlIFtvbGRfcm9vdCBuZXdfcm9vdF0iCi0gIGV4aXQgMgotZmkKLQotaWYgWyAhIC1mICQxIF0KLXRoZW4KLSAgZWNobyAkMSBkb2VzIG5vdCBleGlzdAotICBleGl0IDIKLWZpCi0KLWlmIFsgISAtZiAkMiBdCi10aGVuCi0gIGVjaG8gJDIgZG9lcyBub3QgZXhpc3QKLSAgZXhpdCAyCi1maQotCi1JR05PUkVTPSJjYXQiCi1PTEQ9JChjZCAkKGRpcm5hbWUgJDEpICYmIHB3ZCkvJChiYXNlbmFtZSAkMSkKLU5FVz0kKGNkICQoZGlybmFtZSAkMikgJiYgcHdkKS8kKGJhc2VuYW1lICQyKQotCi1pZiBbICQjIC1ndCAzIF0KLXRoZW4KLSAgICBST09UMT0kKGNkICQzICYmIHB3ZCkKLSAgICBST09UMj0kKGNkICQ0ICYmIHB3ZCkKLSAgICBPTERfTkFNRT0kKGVjaG8gJE9MRCB8IHNlZCAic3wkUk9PVDEvfHwiKQotICAgIE5FV19OQU1FPSQoZWNobyAkTkVXIHwgc2VkICJzfCRST09UMi98fCIpCi0gICAgaWYgWyAkIyA9PSA1IF07IHRoZW4gSUdOT1JFUz0iJDUiOyBmaQotZWxzZQotICAgIFJPT1QxPSQoZGlybmFtZSAkT0xEKS8KLSAgICBST09UMj0kKGRpcm5hbWUgJE5FVykvCi0gICAgT0xEX05BTUU9JE9MRAotICAgIE5FV19OQU1FPSRORVcKLSAgICBpZiBbICQjID09IDMgXTsgdGhlbiBJR05PUkVTPSIkMyI7IGZpCi1maQotCi1pZiBbICJgdW5hbWVgIiA9PSAiU3VuT1MiIF07IHRoZW4KLSAgICBpZiBbIC1mICJgd2hpY2ggZ2RpZmZgIiBdOyB0aGVuCi0gICAgICAgIERJRkY9Z2RpZmYKLSAgICBlbHNlCi0gICAgICAgIERJRkY9ZGlmZgotICAgIGZpCi1lbHNlCi0gICAgRElGRj1kaWZmCi1maQotCi1PTERfU1VGRklYPSIke09MRCMjKi59IgotTkVXX1NVRkZJWD0iJHtORVcjIyoufSIKLWlmIFsgIiRPTERfU1VGRklYIiAhPSAiJE5FV19TVUZGSVgiIF07IHRoZW4KLSAgICBlY2hvIFRoZSBmaWxlcyBkbyBub3QgaGF2ZSB0aGUgc2FtZSBzdWZmaXggdHlwZSEKLSAgICBleGl0IDIKLWZpCi0KLWlmIFsgIiRPTERfU1VGRklYIiAhPSAiemlwIiBdICYmIFsgIiRPTERfU1VGRklYIiAhPSAiamFyIiBdICYmIFsgIiRPTERfU1VGRklYIiAhPSAic3ltIiBdOyB0aGVuCi0gICAgZWNobyBUaGUgZmlsZXMgaGF2ZSB0byBiZSB6aXAsIGphciBvciBzeW0hIFRoZXkgYXJlICRPTERfU1VGRklYCi0gICAgZXhpdCAyCi1maQotCi1VTkFSQ0hJVkU9InVuemlwIC1xIgotCi1UWVBFPSIkT0xEX1NVRkZJWCIKLQotaWYgY21wICRPTEQgJE5FVyA+IC9kZXYvbnVsbAotdGhlbgotICAgICMgVGhlIGZpbGVzIHdlcmUgYnl0ZXdpc2UgaWRlbnRpY2FsLgotICAgIGV4aXQgMAotZmkKLQotIyBOb3QgcXVpdGUgaWRlbnRpY2FsLCB0aGUgbWlnaHQgc3RpbGwgY29udGFpbiB0aGUgc2FtZSBkYXRhLgotIyBVbnBhY2sgdGhlIGphci96aXAgZmlsZXMgaW4gdGVtcCBkaXJzCi1pZiB0ZXN0ICJ4JENPTVBBUkVfUk9PVCIgPT0gIngiOyB0aGVuCi0gICAgQ09NUEFSRV9ST09UPS90bXAvY29tcGFyZV9yb290LiQkCi0gICAgUkVNT1ZFX0NPTVBBUkVfUk9PVD10cnVlCi1maQotT0xEX1RFTVBESVI9JENPTVBBUkVfUk9PVC8kT0xEX05BTUUub2xkCi1ORVdfVEVNUERJUj0kQ09NUEFSRV9ST09ULyRORVdfTkFNRS5uZXcKLW1rZGlyIC1wICRPTERfVEVNUERJUgotbWtkaXIgLXAgJE5FV19URU1QRElSCi0oY2QgJE9MRF9URU1QRElSICYmIHJtIC1yZiAqIDsgJFVOQVJDSElWRSAkT0xEKQotKGNkICRORVdfVEVNUERJUiAmJiBybSAtcmYgKiA7ICRVTkFSQ0hJVkUgJE5FVykKLQotT05MWTE9JChMQU5HPUMgJERJRkYgLXJxICRPTERfVEVNUERJUiAkTkVXX1RFTVBESVIgfCBncmVwICJeT25seSBpbiAkT0xEX1RFTVBESVIiKQotCi1pZiBbIC1uICIkT05MWTEiIF07IHRoZW4KLSAgICBlY2hvICIgICAgICAgIE9ubHkgdGhlIE9MRCAkT0xEX05BTUUgY29udGFpbnM6IgotICAgIExBTkc9QyAkRElGRiAtcnEgJERJRkZfRkxBR1MgJE9MRF9URU1QRElSICRORVdfVEVNUERJUiB8IGdyZXAgIl5Pbmx5IGluICRPTERfVEVNUERJUiIgXAotICAgICAgICB8IHNlZCAic3xPbmx5IGluICRPTERfVEVNUERJUnwgICAgICAgICAgICB8ImcgfCBzZWQgJ3N8OiB8L3xnJwotZmkKLQotT05MWTI9JChMQU5HPUMgJERJRkYgLXJxICRPTERfVEVNUERJUiAkTkVXX1RFTVBESVIgfCBncmVwICJeT25seSBpbiAkTkVXX1RFTVBESVIiKQotCi1pZiBbIC1uICIkT05MWTIiIF07IHRoZW4KLSAgICBlY2hvICIgICAgICAgIE9ubHkgdGhlIE5FVyAkTkVXX05BTUUgY29udGFpbnM6IgotICAgIExBTkc9QyAkRElGRiAtcnEgJERJRkZfRkxBR1MgJE9MRF9URU1QRElSICRORVdfVEVNUERJUiB8IGdyZXAgIl5Pbmx5IGluICRORVdfVEVNUERJUiIgXAotICAgICAgICB8IHNlZCAic3xPbmx5IGluICRORVdfVEVNUERJUnwgICAgICAgICAgICB8ImcgfCBzZWQgJ3N8OiB8L3xnJwotZmkKLQotRElGRlRFWFQ9Ii9iaW4vYmFzaCBgZGlybmFtZSAkMGAvZGlmZnRleHQuc2giCi0KLUxBTkc9QyAkRElGRiAtcnEgJERJRkZfRkxBR1MgJE9MRF9URU1QRElSICRORVdfVEVNUERJUiB8IGdyZXAgZGlmZmVyIHwgY3V0IC1mIDIsNCAtZCAnICcgfCBcCi0gICBhd2sgInsgcHJpbnQgXCIkRElGRlRFWFQgXCJcJDFcIiBcIlwkMiB9IiA+ICRDT01QQVJFX1JPT1QvZGlmZmluZwotCi0vYmluL2Jhc2ggJENPTVBBUkVfUk9PVC9kaWZmaW5nID4gJENPTVBBUkVfUk9PVC9kaWZmcwotCi1pZiBbIC1zICIkQ09NUEFSRV9ST09UL2RpZmZzIiBdOyB0aGVuCi0gICBlY2hvICIgICAgICAgIERpZmZlcmluZyBmaWxlcyBpbiAkT0xEX05BTUUiCi0gICBjYXQgJENPTVBBUkVfUk9PVC9kaWZmcyB8IGdyZXAgZGlmZmVyIHwgJElHTk9SRVMgfCBjdXQgLWYgMiAtZCAnICcgfCBcCi0gICAgICAgICAgc2VkICJzfCRPTERfVEVNUERJUnwgICAgICAgICAgICB8ZyIKLWZpCi0KLSMgQ2xlYW4gdXAKLQotaWYgWyAieCRSRU1PVkVfQ09NUEFSRV9ST09UIiA9PSB4dHJ1ZSBdOyB0aGVuCi0gICAgcm0gLXJmICRSRU1PVkVfQ09NUEFSRV9ST09UCi1maQotCi1leGl0IDEKLQpkaWZmIC0tZ2l0IGEvY29tbW9uL2Jpbi9kaWZmbGliLnNoIGIvY29tbW9uL2Jpbi9kaWZmbGliLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzVlZWQxLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9iaW4vZGlmZmxpYi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDIwNyArMCwwIEBACi0jIS9iaW4vYmFzaAotIwotIyBDb3B5cmlnaHQgKGMpIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSMKLSMgVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0jCi0jIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSMgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0jIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSMgMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotIyBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0jCi0jIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCi0jIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKLSMgcXVlc3Rpb25zLgotIwotCi0jIFNpbXBsZSB0b29sIHRvIGRpZmYgdHdvIHNoYXJlZCBsaWJyYXJpZXMuIAotIyBDcml0ZXJpYXM6IHR3byBzaGFyZWQgbGlicmFyaWVzIGFyZSBjb25zaWRlcmVkIGVxdWFsIGlmOgotIyB0aGUgZmlsZSBzaXplcyBhcmUgdGhlIHNhbWUgQU5EIHRoZSBzeW1ib2xzIG91dHB1dHMgZnJvbSB0aGUgbm0gY29tbWFuZCBhcmUgZXF1YWwKLQotaWYgWyAkIyAtbHQgMiBdIAotdGhlbgotICBlY2hvICJEaWZmIHR3byBzaGFyZWQgbGlicy4gUmV0dXJuIGNvZGVzOiIKLSAgZWNobyAiMCAtIG5vIGRpZmYiCi0gIGVjaG8gIjEgLSBJZGVudGljYWwgc3ltYm9scyBBTkQgc2l6ZSwgQlVUIG5vdCBieXRld2lzZSBpZGVudGljYWwiCi0gIGVjaG8gIjIgLSBJZGVudGljYWwgc3ltYm9scyBCVVQgTkVXIHNpemUiCi0gIGVjaG8gIjMgLSBEaWZmZXJlbmNlcywgY29udGVudCBCVVQgU0FNRSBzaXplIgotICBlY2hvICI0IC0gRGlmZmVyZW5jZXMsIGNvbnRlbnQgQU5EIHNpemUiCi0gIGVjaG8gIjEwIC0gQ291bGQgbm90IHBlcmZvcm0gZGlmZiIKLSAgZWNobyAiVXNlICdxdWlldCcgdG8gZGlzYWJsZSBhbnkgb3V0cHV0LiIKLSAgZWNobyAiU3ludGF4OiAkMCBmaWxlMSBmaWxlMiBbcXVpZXRdIgotICBleGl0IDEwCi1maQotCi1pZiBbICEgLWYgJDEgXQotdGhlbgotICBlY2hvICQxIGRvZXMgbm90IGV4aXN0Ci0gIGV4aXQgMTAKLWZpCi0KLWlmIFsgISAtZiAkMiBdCi10aGVuCi0gIGVjaG8gJDIgZG9lcyBub3QgZXhpc3QKLSAgZXhpdCAxMAotZmkKLQotaWYgWyAiYHVuYW1lYCIgPT0gIlN1bk9TIiBdOyB0aGVuCi0gICAgaWYgWyAtZiAiYHdoaWNoIGdubWAiIF07IHRoZW4KLSAgICAgICAgTk09Z25tCi0jIEpvbmFzIDIwMTItMDUtMjk6IHNvbGFyaXMgbmF0aXZlIG5tIHByb2R1Y2VzIHJhZGljYWxseSBkaWZmZXJlbnQgb3V0cHV0IHRoYW4gZ25tCi0jICAgICAgICAgICAgICAgICAgIHNvIGlmIHVzaW5nIHRoYXQuLi53ZSBuZWVkIGRpZmZlcmVudCBmaWx0ZXIgdGhhbiAiY3V0IC1mIDItIgotIwotICAgIGVsaWYgWyAtZiAiYHdoaWNoIG5tYCIgXTsgdGhlbgotICAgICAgICBOTT1ubQotICAgIGVsc2UKLSAgICAgICAgZWNobyAiTm8gbm0gY29tbWFuZCBmb3VuZCIKLSAgICAgICAgZXhpdCAxMAotICAgIGZpCi0gICAgTEREPWxkZAotZWxpZiBbICRPU1RZUEUgPT0gImN5Z3dpbiIgXTsgdGhlbgotICAgIE5NPSIkVlMxMDBDT01OVE9PTFMvLi4vLi4vVkMvYmluL2FtZDY0L2R1bXBiaW4uZXhlIgotICAgIE5NX0FSR1M9L2V4cG9ydHMKLSAgICBMREQ9Ci1lbGlmIFsgImB1bmFtZWAiID09ICJEYXJ3aW4iIF07IHRoZW4KLSAgICBOTT1ubQotICAgIExERD0ib3Rvb2wgLUwiCi1lbHNlCi0gICAgTk09bm0KLSAgICBMREQ9bGRkCi1maQotCi0jIFNob3VsZCB0aGUgZGlmZmVyZW5jZXMgYmUgdmlld2VkPwotVklFVz0KLSMgWW91IGNhbiBkbyBleHBvcnQgRElGRj1tZWxkIHRvIHZpZXcKLSMgYW55IGRpZmZlcmVuY2VzIHVzaW5nIG1lbGQgaW5zdGVhZC4KLWlmIFsgLW4gIiRESUZGIiBdOyB0aGVuCi0gICAgRElGRj0iJERJRkYiCi1lbHNlCi0gICAgRElGRj1kaWZmCi1maQotT0xEPSQoY2QgJChkaXJuYW1lICQxKSAmJiBwd2QpLyQoYmFzZW5hbWUgJDEpCi1ORVc9JChjZCAkKGRpcm5hbWUgJDIpICYmIHB3ZCkvJChiYXNlbmFtZSAkMikKLQotT0xEX1NJWkU9JChscyAtbCAiJE9MRCIgfCBhd2sgJ3sgcHJpbnQgJDUgfScpCi1ORVdfU0laRT0kKGxzIC1sICIkTkVXIiB8IGF3ayAneyBwcmludCAkNSB9JykKLQotaWYgWyAkIyAtZ3QgMyBdCi10aGVuCi0gICAgUk9PVDE9JChjZCAkMyAmJiBwd2QpCi0gICAgUk9PVDI9JChjZCAkNCAmJiBwd2QpCi0gICAgT0xEX05BTUU9JChlY2hvICRPTEQgfCBzZWQgInN8JFJPT1QxL3x8IikKLSAgICBORVdfTkFNRT0kKGVjaG8gJE5FVyB8IHNlZCAic3wkUk9PVDIvfHwiKQotICAgIGlmIFsgIngkNSIgPT0gInh2aWV3IiBdOyB0aGVuIFZJRVc9dmlldzsgZmkKLWVsc2UKLSAgICBST09UMT0kKGRpcm5hbWUgJE9MRCkvCi0gICAgUk9PVDI9JChkaXJuYW1lICRORVcpLwotICAgIE9MRF9OQU1FPSRPTEQKLSAgICBORVdfTkFNRT0kTkVXCi0gICAgaWYgWyAieCQzIiA9PSAieHZpZXciIF07IHRoZW4gVklFVz12aWV3OyBmaQotZmkKLQotT0xEX1NVRkZJWD0iJHtPTEQjIyoufSIKLU5FV19TVUZGSVg9IiR7TkVXIyMqLn0iCi1pZiBbICIkT0xEX1NVRkZJWCIgIT0gIiRORVdfU1VGRklYIiBdOyB0aGVuCi0gICAgZWNobyBUaGUgZmlsZXMgZG8gbm90IGhhdmUgdGhlIHNhbWUgc3VmZml4IHR5cGUhCi0gICAgZXhpdCAxMAotZmkKLQotaWYgWyAiJE9MRF9TVUZGSVgiICE9ICJzbyIgXSAmJiBbICIkT0xEX1NVRkZJWCIgIT0gImR5bGliIiBdICYmIFsgIiRPTERfU1VGRklYIiAhPSAiZGxsIiBdOyB0aGVuCi0gICAgZWNobyBUaGUgZmlsZXMgaGF2ZSB0byBiZSAuc28sIC5keWxpYiBvciAuZGxsISBUaGV5IGFyZSAkT0xEX1NVRkZJWAotICAgIGV4aXQgMTAKLWZpCi0KLVRZUEU9IiRPTERfU1VGRklYIgotCi1pZiBjbXAgJE9MRCAkTkVXID4gL2Rldi9udWxsCi10aGVuCi0gICAgIyBUaGUgZmlsZXMgd2VyZSBieXRld2lzZSBpZGVudGljYWwuCi0gICAgZWNobyBJZGVudGljYWw6ICRPTERfTkFNRQotICAgIGV4aXQgMAotZmkKLQotT0xEX1NZTUJPTFM9JENPTVBBUkVfUk9PVC9ubS4kT0xEX05BTUUub2xkCi1ORVdfU1lNQk9MUz0kQ09NUEFSRV9ST09UL25tLiRORVdfTkFNRS5uZXcKLQotbWtkaXIgLXAgJChkaXJuYW1lICRPTERfU1lNQk9MUykKLW1rZGlyIC1wICQoZGlybmFtZSAkTkVXX1NZTUJPTFMpCi0KLWlmIFsgJE9TVFlQRSA9PSAiY3lnd2luIiBdOyB0aGVuCi0gICAgIiROTSIgJE5NX0FSR1MgJE9MRCB8IGdyZXAgIiA9ICIgPiAkT0xEX1NZTUJPTFMKLSAgICAiJE5NIiAkTk1fQVJHUyAkTkVXIHwgZ3JlcCAiID0gIiA+ICRORVdfU1lNQk9MUwotICAgICIkTk0iICROTV9BUkdTICRPTEQgPiAkT0xEX1NZTUJPTFMuZnVsbAotICAgICIkTk0iICROTV9BUkdTICRORVcgPiAkTkVXX1NZTUJPTFMuZnVsbAotZWxzZQotICAgICMgU3RyaXAgdGhlIGFkZHJlc3NlcywganVzdCBjb21wYXJlIHRoZSBvcmRlcmluZyBvZiB0aGUgc3ltYm9scy4KLSAgICAkTk0gJE9MRCB8IGN1dCAtZiAyLSAtZCAnICcgPiAkT0xEX1NZTUJPTFMKLSAgICAkTk0gJE5FVyB8IGN1dCAtZiAyLSAtZCAnICcgPiAkTkVXX1NZTUJPTFMKLSAgICAjIEJ1dCBzdG9yZSB0aGUgZnVsbCBpbmZvcm1hdGlvbiBmb3IgZWFzeSBkaWZmIGFjY2Vzcy4KLSAgICAkTk0gJE9MRCAgPiAkT0xEX1NZTUJPTFMuZnVsbAotICAgICROTSAkTkVXICA+ICRORVdfU1lNQk9MUy5mdWxsCi1maQotCi1ESUZGUz0kKExBTkc9QyBkaWZmICRPTERfU1lNQk9MUyAkTkVXX1NZTUJPTFMpCi0KLVJFU1VMVD0wCi0KLWlmIFsgIiR7TEREfSIgXQotdGhlbgotICAgIE5BTUU9YGJhc2VuYW1lICRPTERgCi0gICAgVE1QPSRDT01QQVJFX1JPT1QvbGRkL2xkZC4ke05BTUV9Ci0gICAgcm0gLXJmICIke1RNUH0iCi0gICAgbWtkaXIgLXAgIiR7VE1QfSIKLSAgICAKLSAgICAoY2QgIiR7VE1QfSIgJiYgY3AgJE9MRCAuICYmICR7TEREfSAke05BTUV9IHwgYXdrICd7IHByaW50ICQxO30nIHwgc29ydCB8IHRlZSBkZXAub2xkIHwgdW5pcSA+IGRlcC51bmlxLm9sZCkKLSAgICAoY2QgIiR7VE1QfSIgJiYgY3AgJE5FVyAuICYmICR7TEREfSAke05BTUV9IHwgYXdrICd7IHByaW50ICQxO30nIHwgc29ydCB8IHRlZSBkZXAubmV3IHwgdW5pcSA+IGRlcC51bmlxLm5ldykKLSAgICAoY2QgIiR7VE1QfSIgJiYgcm0gLWYgJHtOQU1FfSkKLSAgICAKLSAgICBESUZGU19ERVA9JChMQU5HPUMgZGlmZiAiJHtUTVB9L2RlcC5vbGQiICIke1RNUH0vZGVwLm5ldyIpCi0gICAgRElGRlNfVU5JUV9ERVA9JChMQU5HPUMgZGlmZiAiJHtUTVB9L2RlcC51bmlxLm9sZCIgIiR7VE1QfS9kZXAudW5pcS5uZXciKQotICAgIAotICAgIERFUF9NU0c9Ci0gICAgaWYgWyAteiAiJHtESUZGU19VTklRX0RFUH0iIC1hIC16ICIke0RJRkZTX0RFUH0iIF07IHRoZW4KLSAgICAgICBERVBfTVNHPSJJZGVudGljYWwgZGVwZW5kZW5jaWVzIgotICAgIGVsaWYgWyAteiAiJHtESUZGU19VTklRX0RFUH0iIF07IHRoZW4KLSAgICAgICBERVBfTVNHPSJSZWR1bmRhbnQgZHVwbGljYXRlIGRlcGVuZGVuY2llcyBhZGRlZCIKLSAgICAgICBSRVM9MQotICAgIGVsc2UKLSAgICAgICBERVBfTVNHPSJESUZGRVJFTlQgZGVwZW5kZW5jaWVzIgotICAgICAgIFJFUz0xCi0gICAgZmkKLWZpCi0KLWlmIFsgLW4gIiRESUZGUyIgXTsgdGhlbgotICAgaWYgWyAkT0xEX1NJWkUgLW5lICRORVdfU0laRSBdCi0gICB0aGVuCi0gICAgICAgZWNobyBEaWZmZXJlbmNlcywgY29udGVudCBBTkQgc2l6ZSAgICAgOiAkREVQX01TRyA6ICRPTERfTkFNRSAKLSAgICAgICBSRVNVTFQ9NAotICAgZWxzZQotICAgICAgIGVjaG8gRGlmZmVyZW5jZXMsIGNvbnRlbnQgQlVUIFNBTUUgc2l6ZTogJERFUF9NU0cgOiAkT0xEX05BTUUgCi0gICAgICAgUkVTVUxUPTMKLSAgIGZpCi0gICBpZiBbICJ4JFZJRVciID09ICJ4dmlldyIgXTsgdGhlbgotICAgICAgIExBTkc9QyAkRElGRiAkT0xEX1NZTUJPTFMgJE5FV19TWU1CT0xTCi0gICBmaQotZWxzZQotICAgaWYgWyAkT0xEX1NJWkUgLW5lICRORVdfU0laRSBdCi0gICB0aGVuCi0gICAgICAgZWNobyBJZGVudGljYWwgc3ltYm9scyBCVVQgTkVXIHNpemUgICAgOiAkREVQX01TRyA6ICRPTERfTkFNRSAKLSAgICAgICBSRVNVTFQ9MgotICAgZWxzZQotICAgICAgIGVjaG8gSWRlbnRpY2FsIHN5bWJvbHMgQU5EIHNpemUsIEJVVCBub3QgYnl0ZXdpc2UgaWRlbnRpY2FsOiAkREVQX01TRyA6ICRPTERfTkFNRSAKLSAgICAgICBSRVNVTFQ9MQotICAgZmkKLWZpCi0KLWV4aXQgJFJFU1VMVAotCi0KLQpkaWZmIC0tZ2l0IGEvY29tbW9uL2Jpbi9kaWZmdGV4dC5zaCBiL2NvbW1vbi9iaW4vZGlmZnRleHQuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlOTAzNzMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2Jpbi9kaWZmdGV4dC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0jIS9iaW4vYmFzaAotIwotIyBDb3B5cmlnaHQgKGMpIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSMKLSMgVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0jCi0jIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSMgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0jIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSMgMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotIyBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0jCi0jIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCi0jIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKLSMgcXVlc3Rpb25zLgotIwotCi0jIFRoZSBkaWZmdGV4dC5zaCBrbm93cyBob3cgdG8gY29tcGFyZSB0ZXh0IGZpbGVzIGFuZAotIyBpZ25vcmUgc29tZSBzcGVjaWZpYyBkaWZmZXJlbmNlcy4KLSMgV2hlbiBkaWZmdGV4dC5zaCBpcyBjYWxsZWQsIHdlIGFscmVhZHkga25vdyB0aGF0IHRoZQotIyBmaWxlcyBkaWZmZXIuIEJ1dCBpZiB0aGUgdGVzdHMgYmVsb3cgdHJpZ2dlciwgdGhlbgotIyB3ZSBpZ25vcmUgZGlmZmVyZW5jZXMgY2F1c2VkIGJ5OgotIwotIyAgIFRpbWVzdGFtcHMgaW4gSmF2YSBzb3VyY2VzIGdlbmVyYXRlZCBieSBpZGwyamF2YQotIyAgIFNvcnRpbmcgb3JkZXIgYW5kIGNsZWFudXAgc3R5bGUgaW4gLnByb3BlcnRpZXMgZmlsZXMuCi0KLU9MRD0iJDEiCi1ORVc9IiQyIgotU1VGPSIke09MRCMjKi59IgotVE1QPTEKLWlmIHRlc3QgIngkU1VGIiA9PSAieGphdmEiOyB0aGVuCi0gICBUTVA9JChMQU5HPUMgZGlmZiAkT0xEICRORVcgfCBcCi0gICAgICAgZ3JlcCAnXls8Pl0nIHwgXAotICAgICAgIHNlZCAnL1s8Pl0gXCogZnJvbS4qXC5pZGwvZCcgfCBcCi0gICAgICAgc2VkICcvWzw+XSBcKi4qMjAxWzEyXS4qL2QnIHwgXAotICAgICAgIHNlZCAnL1wvXC8gR2VuZXJhdGVkIGZyb20gaW5wdXQgZmlsZS4qL2QnIHwgXAotICAgICAgIHNlZCAnL1wvXC8gVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgQVVUT01BVElDQUxMWSBmcm9tIGEgdGVtcGxhdGUgZmlsZS4qL2QnIHwgXAotICAgICAgIHNlZCAnL1wvXC8gamF2YSBHZW5lcmF0ZUNoYXJhY3Rlci4qL2QnKQotZmkKLWlmIHRlc3QgIngkU1VGIiA9PSAieHByb3BlcnRpZXMiOyB0aGVuCi0gICAgY2F0ICRPTEQgfCBzZWQgLWUgJ3MvXChbXlxcXVwpOi9cMVxcOi9nJyAtZSAgJ3MvXChbXlxcXVwpPS9cMVxcPS9nJyAtZSAncy8jLiovIy9nJyBcCi0tZSAncy9cXHUwMDIwL1x4MjAvZycgXAotLWUgJ3MvXFx1MDAzQS9ceDNBL2cnIFwKLS1lICdzL1xcdTAwNkIvXHg2Qi9nJyBcCi0tZSAncy9cXHUwMDc1L1x4NzUvZycgXAotLWUgJ3MvXFx1MDBBMC9ceEEwL2cnIFwKLS1lICdzL1xcdTAwQTMvXHhBMy9nJyBcCi0tZSAncy9cXHUwMEIwL1x4QjAvZycgXAotLWUgJ3MvXFx1MDBCNy9ceEI3L2cnIFwKLS1lICdzL1xcdTAwQkEvXHhCQS9nJyBcCi0tZSAncy9cXHUwMEJGL1x4QkYvZycgXAotLWUgJ3MvXFx1MDBDMC9ceEMwL2cnIFwKLS1lICdzL1xcdTAwQzEvXHhDMS9nJyBcCi0tZSAncy9cXHUwMEMyL1x4QzIvZycgXAotLWUgJ3MvXFx1MDBDNC9ceEM0L2cnIFwKLS1lICdzL1xcdTAwQzUvXHhDNS9nJyBcCi0tZSAncy9cXHUwMEM4L1x4QzgvZycgXAotLWUgJ3MvXFx1MDBDOS9ceEM5L2cnIFwKLS1lICdzL1xcdTAwQ0EvXHhDQS9nJyBcCi0tZSAncy9cXHUwMENEL1x4Q0QvZycgXAotLWUgJ3MvXFx1MDBDRS9ceENFL2cnIFwKLS1lICdzL1xcdTAwRDMvXHhEMy9nJyBcCi0tZSAncy9cXHUwMEQ0L1x4RDQvZycgXAotLWUgJ3MvXFx1MDBENi9ceEQ2L2cnIFwKLS1lICdzL1xcdTAwREEvXHhEQS9nJyBcCi0tZSAncy9cXHUwMERDL1x4REMvZycgXAotLWUgJ3MvXFx1MDBERC9ceEREL2cnIFwKLS1lICdzL1xcdTAwREYvXHhERi9nJyBcCi0tZSAncy9cXHUwMEUwL1x4RTAvZycgXAotLWUgJ3MvXFx1MDBFMS9ceEUxL2cnIFwKLS1lICdzL1xcdTAwRTIvXHhFMi9nJyBcCi0tZSAncy9cXHUwMEUzL1x4RTMvZycgXAotLWUgJ3MvXFx1MDBFNC9ceEU0L2cnIFwKLS1lICdzL1xcdTAwRTUvXHhFNS9nJyBcCi0tZSAncy9cXHUwMEU2L1x4RTYvZycgXAotLWUgJ3MvXFx1MDBFNy9ceEU3L2cnIFwKLS1lICdzL1xcdTAwRTgvXHhFOC9nJyBcCi0tZSAncy9cXHUwMEU5L1x4RTkvZycgXAotLWUgJ3MvXFx1MDBFQS9ceEVBL2cnIFwKLS1lICdzL1xcdTAwRUIvXHhFQi9nJyBcCi0tZSAncy9cXHUwMEVDL1x4RUMvZycgXAotLWUgJ3MvXFx1MDBFRC9ceEVEL2cnIFwKLS1lICdzL1xcdTAwRUUvXHhFRS9nJyBcCi0tZSAncy9cXHUwMEVGL1x4RUYvZycgXAotLWUgJ3MvXFx1MDBGMS9ceEYxL2cnIFwKLS1lICdzL1xcdTAwRjIvXHhGMi9nJyBcCi0tZSAncy9cXHUwMEYzL1x4RjMvZycgXAotLWUgJ3MvXFx1MDBGNC9ceEY0L2cnIFwKLS1lICdzL1xcdTAwRjUvXHhGNS9nJyBcCi0tZSAncy9cXHUwMEY2L1x4RjYvZycgXAotLWUgJ3MvXFx1MDBGOS9ceEY5L2cnIFwKLS1lICdzL1xcdTAwRkEvXHhGQS9nJyBcCi0tZSAncy9cXHUwMEZDL1x4RkMvZycgXAotLWUgJ3MvXFx1MDAyMC9ceDIwL2cnIFwKLS1lICdzL1xcdTAwM2YvXHgzZi9nJyBcCi0tZSAncy9cXHUwMDZmL1x4NmYvZycgXAotLWUgJ3MvXFx1MDA3NS9ceDc1L2cnIFwKLS1lICdzL1xcdTAwYTAvXHhhMC9nJyBcCi0tZSAncy9cXHUwMGEzL1x4YTMvZycgXAotLWUgJ3MvXFx1MDBiMC9ceGIwL2cnIFwKLS1lICdzL1xcdTAwYmEvXHhiYS9nJyBcCi0tZSAncy9cXHUwMGJmL1x4YmYvZycgXAotLWUgJ3MvXFx1MDBjMS9ceGMxL2cnIFwKLS1lICdzL1xcdTAwYzQvXHhjNC9nJyBcCi0tZSAncy9cXHUwMGM1L1x4YzUvZycgXAotLWUgJ3MvXFx1MDBjOC9ceGM4L2cnIFwKLS1lICdzL1xcdTAwYzkvXHhjOS9nJyBcCi0tZSAncy9cXHUwMGNhL1x4Y2EvZycgXAotLWUgJ3MvXFx1MDBjZC9ceGNkL2cnIFwKLS1lICdzL1xcdTAwZDYvXHhkNi9nJyBcCi0tZSAncy9cXHUwMGRjL1x4ZGMvZycgXAotLWUgJ3MvXFx1MDBkZC9ceGRkL2cnIFwKLS1lICdzL1xcdTAwZGYvXHhkZi9nJyBcCi0tZSAncy9cXHUwMGUwL1x4ZTAvZycgXAotLWUgJ3MvXFx1MDBlMS9ceGUxL2cnIFwKLS1lICdzL1xcdTAwZTIvXHhlMi9nJyBcCi0tZSAncy9cXHUwMGUzL1x4ZTMvZycgXAotLWUgJ3MvXFx1MDBlNC9ceGU0L2cnIFwKLS1lICdzL1xcdTAwZTUvXHhlNS9nJyBcCi0tZSAncy9cXHUwMGU3L1x4ZTcvZycgXAotLWUgJ3MvXFx1MDBlOC9ceGU4L2cnIFwKLS1lICdzL1xcdTAwZTkvXHhlOS9nJyBcCi0tZSAncy9cXHUwMGVhL1x4ZWEvZycgXAotLWUgJ3MvXFx1MDBlYi9ceGViL2cnIFwKLS1lICdzL1xcdTAwZWMvXHhlYy9nJyBcCi0tZSAncy9cXHUwMGVkL1x4ZWQvZycgXAotLWUgJ3MvXFx1MDBlZS9ceGVlL2cnIFwKLS1lICdzL1xcdTAwZWYvXHhlZi9nJyBcCi0tZSAncy9cXHUwMGYwL1x4ZjAvZycgXAotLWUgJ3MvXFx1MDBmMS9ceGYxL2cnIFwKLS1lICdzL1xcdTAwZjIvXHhmMi9nJyBcCi0tZSAncy9cXHUwMGYzL1x4ZjMvZycgXAotLWUgJ3MvXFx1MDBmNC9ceGY0L2cnIFwKLS1lICdzL1xcdTAwZjUvXHhmNS9nJyBcCi0tZSAncy9cXHUwMGY2L1x4ZjYvZycgXAotLWUgJ3MvXFx1MDBmNy9ceGY3L2cnIFwKLS1lICdzL1xcdTAwZjgvXHhmOC9nJyBcCi0tZSAncy9cXHUwMGY5L1x4ZjkvZycgXAotLWUgJ3MvXFx1MDBmYS9ceGZhL2cnIFwKLS1lICdzL1xcdTAwZmMvXHhmYy9nJyBcCi0tZSAncy9cXHUwMGZmL1x4ZmYvZycgXAotICAJICAgICB8IHNlZCAtZSAnL14jL2QnIC1lICcvXiQvZCcgXAotICAgICAgICAgICAgICAgICAgLWUgOmEgLWUgJy9cXCQvTjsgcy9cXFxuLy87IHRhJyBcCi0gIAkgICAgICAgICAgLWUgJ3MvXlsgXHRdKi8vO3MvWyBcdF0qJC8vJyBcCi0JCSAgLWUgJ3MvXFw9Lz0vJyB8IExBTkc9QyBzb3J0ID4gJE9MRC5jbGVhbmVkCi0gICBUTVA9JChMQU5HPUMgZGlmZiAkT0xELmNsZWFuZWQgJE5FVykKLWZpCi1pZiB0ZXN0IC1uICIkVE1QIjsgdGhlbgotICAgIGVjaG8gRmlsZXMgJE9MRCBhbmQgJE5FVyBkaWZmZXIKLWZpCmRpZmYgLS1naXQgYS9jb21tb24vYmluL2V4Y2VwdGlvbl9saXN0X2xpbnV4IGIvY29tbW9uL2Jpbi9leGNlcHRpb25fbGlzdF9saW51eApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRjZjI3Mi4uMDAwMDAwMAotLS0gYS9jb21tb24vYmluL2V4Y2VwdGlvbl9saXN0X2xpbnV4CisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IChjKSAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0jCi0jIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0jIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0jIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotIwotIyBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0jIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotIyBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0jIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSMgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotIwotIyBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQotIyBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55Ci0jIHF1ZXN0aW9ucy4KLSMKLQotIyBMaXN0IG9mIGZpbGVzIGluc2lkZSBqYXIgYXJjaGl2ZXMgdGhhdCBhcmUgb2sgaWYgdGhleSBkaWZmZXIuCi1MSVNUX0RJRkZfSkFSPSIKLS9zdW4vbWlzYy9WZXJzaW9uLmNsYXNzCi0vc3VuL3Rvb2xzL2pjb25zb2xlL1ZlcnNpb24uY2xhc3MKLS9jb20vc3VuL3Rvb2xzL2phdmFjL3Jlc291cmNlcy92ZXJzaW9uLmNsYXNzCi0vY29tL3N1bi90b29scy9qYXZhaC9yZXNvdXJjZXMvdmVyc2lvbi5jbGFzcwotL2NvbS9zdW4vdG9vbHMvamF2YXAvcmVzb3VyY2VzL3ZlcnNpb24uY2xhc3MKLSIKLQotIyBMaXN0IG9mIGJpbmFyaWVzIHRoYXQgb25seSBuZWVkIHRvIG1hdGNoIHN5bWJvbHMKLUxJU1RfRElGRl9TSVpFPSIKLWpyZS9saWIvYW1kNjQvbGliZm9udG1hbmFnZXIuc28KLWpyZS9saWIvYW1kNjQvbGliamR3cC5zbwotanJlL2xpYi9hbWQ2NC9saWJ0Mmsuc28KLWJpbi91bnBhY2syMDAKLWpyZS9iaW4vdW5wYWNrMjAwCi1qcmUvbGliL2FtZDY0L2xpYmpzaWcuZGVidWdpbmZvCi1qcmUvbGliL2FtZDY0L2xpYnNhcHJvYy5kZWJ1Z2luZm8KLWpyZS9saWIvYW1kNjQvc2VydmVyL2xpYmp2bS5kZWJ1Z2luZm8KLSIKLQotIyBMaXN0IG9mIGJpbmFyZXMgdGhhdCBuZWVkIHRvIG1hdGNoIGJvdGggc3ltYm9scyBhbmQgc2l6ZQotTElTVF9ESUZGX0JZVEU9IgotanJlL2xpYi9hbWQ2NC9saWJkdF9zb2NrZXQuc28KLWpyZS9saWIvYW1kNjQvbGliYXR0YWNoLnNvCi1qcmUvbGliL2FtZDY0L2xpYmphYXNfdW5peC5zbwotanJlL2xpYi9hbWQ2NC9saWJqYXd0LnNvCi1qcmUvbGliL2FtZDY0L2xpYmpwZWcuc28KLWpyZS9saWIvYW1kNjQvbGlianNkdC5zbwotanJlL2xpYi9hbWQ2NC9saWJqc2lnLnNvCi1qcmUvbGliL2FtZDY0L2xpYnNhcHJvYy5zbwotanJlL2xpYi9hbWQ2NC9saWJzY3RwLnNvCi1qcmUvbGliL2FtZDY0L2xpYnN1bmVjLnNvCi1qcmUvbGliL2FtZDY0L2xpYnVucGFjay5zbwotanJlL2xpYi9hbWQ2NC9saWJ2ZXJpZnkuc28KLWpyZS9saWIvYW1kNjQvbGliemlwLnNvCi1qcmUvbGliL2FtZDY0L3NlcnZlci9saWJqc2lnLnNvCi1qcmUvbGliL2FtZDY0L3NlcnZlci9saWJqdm0uc28KLWpyZS9saWIvYW1kNjQvbGlibGNtcy5zbwotZGVtby9qdm10aS9oZWFwVHJhY2tlci9saWIvbGliaGVhcFRyYWNrZXIuc28KLWRlbW8vanZtdGkvaHByb2YvbGliL2xpYmhwcm9mLnNvCi1kZW1vL2p2bXRpL21pbnN0L2xpYi9saWJtaW5zdC5zbwotZGVtby9qdm10aS9tdHJhY2UvbGliL2xpYm10cmFjZS5zbwotZGVtby9qdm10aS93YWl0ZXJzL2xpYi9saWJ3YWl0ZXJzLnNvCi1iaW4vYXBwbGV0dmlld2VyCi1iaW4vZXh0Y2hlY2sKLWJpbi9pZGxqCi1iaW4vamFyCi1iaW4vamFyc2lnbmVyCi1iaW4vamF2YQotYmluL2phdmFjCi1iaW4vamF2YWRvYwotYmluL2phdmFoCi1iaW4vamF2YXAKLWJpbi9qY21kCi1iaW4vamNvbnNvbGUKLWJpbi9qZGIKLWJpbi9qaGF0Ci1iaW4vamluZm8KLWJpbi9qbWFwCi1iaW4vanBzCi1iaW4vanJ1bnNjcmlwdAotYmluL2pzYWRlYnVnZAotYmluL2pzdGFjawotYmluL2pzdGF0Ci1iaW4vanN0YXRkCi1iaW4va2V5dG9vbAotYmluL25hdGl2ZTJhc2NpaQotYmluL29yYmQKLWJpbi9wYWNrMjAwCi1iaW4vcG9saWN5dG9vbAotYmluL3JtaWMKLWJpbi9ybWlkCi1iaW4vcm1pcmVnaXN0cnkKLWJpbi9zY2hlbWFnZW4KLWJpbi9zZXJpYWx2ZXIKLWJpbi9zZXJ2ZXJ0b29sCi1iaW4vdG5hbWVzZXJ2Ci1iaW4vd3NnZW4KLWJpbi93c2ltcG9ydAotYmluL3hqYwotanJlL2Jpbi9qYXZhCi1qcmUvYmluL2tleXRvb2wKLWpyZS9iaW4vb3JiZAotanJlL2Jpbi9wYWNrMjAwCi1qcmUvYmluL3BvbGljeXRvb2wKLWpyZS9iaW4vcm1pZAotanJlL2Jpbi9ybWlyZWdpc3RyeQotanJlL2Jpbi9zZXJ2ZXJ0b29sCi1qcmUvYmluL3RuYW1lc2VydgotIgpkaWZmIC0tZ2l0IGEvY29tbW9uL2Jpbi9leHRyYWN0dmN2YXJzLnNoIGIvY29tbW9uL2Jpbi9leHRyYWN0dmN2YXJzLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmU3ZDY5Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9iaW4vZXh0cmFjdHZjdmFycy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLSMhL2Jpbi9iYXNoCi0jCi0jIENvcHlyaWdodCAoYykgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotIwotIyBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotIyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSMKLSMgVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0jIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotIyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSMgYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotIyAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0jIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSMKLSMgUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKLSMgb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQotIyBxdWVzdGlvbnMuCi0jCi0KLSMgTXVzdCBiZSBiYXNoLCBidXQgdGhhdCBpcyBvayBzaW5jZSB3ZSBhcmUgcnVubmluZyBmcm9tIGN5Z3dpbi4KLSMgVGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSB2Y3ZhcnNhbGwuYmF0IGZpbGUgdG8gcnVuLgotIyBUaGUgc2Vjb25kIGFyZ3VtZW50IGlzIHRoZSBhcmNoIGFyZyB0byBnaXZlIHRvIHZjdmFycy4KLVZDVkFSU0FMTD0iJDEiCi1BUkNIX0FSRz0iJDIiCi0KLSMgQ2Fubm90IHVzZSB0aGUgVlMxMCBzZXR1cCBzY3JpcHQgZGlyZWN0bHkgKHNpbmNlIGl0IG9ubHkgdXBkYXRlcyB0aGUgRE9TIHN1YnNoZWxsIGVudmlyb25tZW50KQotIyBidXQgY2FsY3VsYXRlIHRoZSBkaWZmZXJlbmNlIGluIEN5Z3dpbiBlbnZpcm9ubWVudCBiZWZvcmUvYWZ0ZXIgcnVubmluZyBpdCBhbmQgdGhlbgotIyBhcHBseSB0aGUgZGlmZi4KLV92czEwdmFyc2FsbD1gY3lncGF0aCAtYSAtbSAtcyAiJFZDVkFSU0FMTCJgCi1fZG9zdnMxMHZhcnNhbGw9YGN5Z3BhdGggLWEgLXcgLXMgJF92czEwdmFyc2FsbGAKLV9kb3NiYXNoPWBjeWdwYXRoIC1hIC13IC1zIFxgd2hpY2ggYmFzaFxgLipgCi0KLSMgZ2VuZXJhdGUgdGhlIHNldCBvZiBleHBvcnRlZCB2YXJzIGJlZm9yZS9hZnRlciB0aGUgdnMxMCBzZXR1cAotZWNobyAiQGVjaG8gb2ZmIiA+IGxvY2FsZGV2ZW52dG1wLmJhdAotZWNobyAiJF9kb3NiYXNoIC1jIFwiZXhwb3J0IC1wXCIgPiBsb2NhbGRldmVudnRtcC5leHBvcnQwIiA+PiBsb2NhbGRldmVudnRtcC5iYXQKLWVjaG8gImNhbGwgJF9kb3N2czEwdmFyc2FsbCAkQVJDSF9BUkciID4+IGxvY2FsZGV2ZW52dG1wLmJhdAotZWNobyAiJF9kb3NiYXNoIC1jIFwiZXhwb3J0IC1wXCIgPiBsb2NhbGRldmVudnRtcC5leHBvcnQxIiA+PiBsb2NhbGRldmVudnRtcC5iYXQKLWNtZCAvYyBsb2NhbGRldmVudnRtcC5iYXQKLQotIyBhcHBseSB0aGUgZGlmZiAobGVzcyBzb21lIG5vbi12czEwIHZhcnMgbmFtZWQgYnkgIiEiKQotc29ydCBsb2NhbGRldmVudnRtcC5leHBvcnQwIHxncmVwIC12ICIhIiA+IGxvY2FsZGV2ZW52dG1wLmV4cG9ydDAuc29ydAotc29ydCBsb2NhbGRldmVudnRtcC5leHBvcnQxIHxncmVwIC12ICIhIiA+IGxvY2FsZGV2ZW52dG1wLmV4cG9ydDEuc29ydAotY29tbSAtMSAtMyBsb2NhbGRldmVudnRtcC5leHBvcnQwLnNvcnQgbG9jYWxkZXZlbnZ0bXAuZXhwb3J0MS5zb3J0ID4gbG9jYWxkZXZlbnYuc2gKLWNhdCBsb2NhbGRldmVudi5zaCB8IHNlZCAncy9kZWNsYXJlIC14IC9leHBvcnQgL2cnIHwgc2VkICdzLz0iLzo9Ii9nJyB8IHNlZCAncy9cXFxcL1xcL2cnIHwgc2VkICdzLyIvL2cnIHwgXAotICAgIHNlZCAncy8jL1wkXChIQVNIXCkvZycgPiBsb2NhbGRldmVudi5nbWsKLQotIyBjbGVhbnVwCi1ybSAtZiBsb2NhbGRldmVudnRtcCoKZGlmZiAtLWdpdCBhL2NvbW1vbi9iaW4vaGlkZV9pbXBvcnRhbnRfd2FybmluZ3NfZnJvbV9qYXZhYy5zaCBiL2NvbW1vbi9iaW4vaGlkZV9pbXBvcnRhbnRfd2FybmluZ3NfZnJvbV9qYXZhYy5zaAppbmRleCA0MTJjNzFhLi4wNDMzNjM1IDEwMDY0NAotLS0gYS9jb21tb24vYmluL2hpZGVfaW1wb3J0YW50X3dhcm5pbmdzX2Zyb21famF2YWMuc2gKKysrIGIvY29tbW9uL2Jpbi9oaWRlX2ltcG9ydGFudF93YXJuaW5nc19mcm9tX2phdmFjLnNoCkBAIC0xLDQgKzEsNCBAQAotIyEvYmluL3NoCisjIS9iaW4vYmFzaAogIwogIyBDb3B5cmlnaHQgKGMpIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAjIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KZGlmZiAtLWdpdCBhL2NvbW1vbi9iaW4vbG9nZ2VyLnNoIGIvY29tbW9uL2Jpbi9sb2dnZXIuc2gKaW5kZXggNzBjM2RhYi4uNDZhYjQ4YWUgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9iaW4vbG9nZ2VyLnNoCisrKyBiL2NvbW1vbi9iaW4vbG9nZ2VyLnNoCkBAIC0xLDQgKzEsNCBAQAotIyEvYmluL3NoCisjIS9iaW4vYmFzaAogIwogIyBDb3B5cmlnaHQgKGMpIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAjIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KZGlmZiAtLWdpdCBhL2NvbW1vbi9iaW4vc2hlbGwtdHJhY2VyLnNoIGIvY29tbW9uL2Jpbi9zaGVsbC10cmFjZXIuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdhOTY0YwotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1vbi9iaW4vc2hlbGwtdHJhY2VyLnNoCkBAIC0wLDAgKzEsNDcgQEAKKyMhL2Jpbi9iYXNoCisjCisjIENvcHlyaWdodCAoYykgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorIworIyBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisjIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorIyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyMgYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorIyAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyMKKyMgUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyMgb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQorIyBxdWVzdGlvbnMuCisjCisKKyMgVXNhZ2U6IHNoIHNoZWxsLXRyYWNlci5zaCA8VElNRV9DTUQ+IDxPVVRQVVRfRklMRT4gPE9MRF9TSEVMTD4gPHNoZWxsIGNvbW1hbmQgbGluZT4KKyMKKyMgVGhpcyBzaGVsbCBzY3JpcHQgaXMgc3VwcG9zZWQgdG8gYmUgc2V0IGFzIGEgcmVwbGFjZW1lbnQgZm9yIFNIRUxMIGluIG1ha2UsCisjIGNhdXNpbmcgaXQgdG8gYmUgY2FsbGVkIHdoZW5ldmVyIG1ha2Ugd2FudHMgdG8gZXhlY3V0ZSBzaGVsbCBjb21tYW5kcy4KKyMgVGhlIDxzaGVsbCBjb21tYW5kIGxpbmU+IGlzIHN1aXRhYmxlIGZvciBwYXNzaW5nIG9uIHRvIHRoZSBvbGQgc2hlbGwsIAorIyB0eXBpY2FsbHkgYmVnaW5uaW5nIHdpdGggLWMuCisjCisjIFRoaXMgc2NyaXB0IHdpbGwgbWFrZSBzdXJlIHRoZSBzaGVsbCBjb21tYW5kIGxpbmUgaXMgZXhlY3V0ZWQgd2l0aCAKKyMgT0xEX1NIRUxMIC14LCBhbmQgaXQgd2lsbCBhbHNvIHN0b3JlIGEgc2ltcGxlIGxvZyBvZiB0aGUgdGhlIHRpbWUgaXQgdGFrZXMgdG8KKyMgZXhlY3V0ZSB0aGUgY29tbWFuZCBpbiB0aGUgT1VUUFVUX0ZJTEUsIHVzaW5nIHRoZSAidGltZSIgdXRpbGl0eSBhcyBwb2ludGVkIAorIyB0byBieSBUSU1FX0NNRC4gSWYgVElNRV9DTUQgaXMgIi0iLCBubyB0aW1lc3RhbXAgd2lsbCBiZSBzdG9yZWQuCisKK1RJTUVfQ01EPSIkMSIKK09VVFBVVF9GSUxFPSIkMiIKK09MRF9TSEVMTD0iJDMiCitzaGlmdAorc2hpZnQKK3NoaWZ0CitpZiBbICIkVElNRV9DTUQiICE9ICItIiBdOyB0aGVuCisiJFRJTUVfQ01EIiAtZiAiW1RJTUU6JUVdICQqIiAtYSAtbyAiJE9VVFBVVF9GSUxFIiAiJE9MRF9TSEVMTCIgLXggIiRAIgorZWxzZQorIiRPTERfU0hFTEwiIC14ICIkQCIKK2ZpCmRpZmYgLS1naXQgYS9jb21tb24vbWFrZWZpbGVzL0hvdHNwb3RXcmFwcGVyLmdtayBiL2NvbW1vbi9tYWtlZmlsZXMvSG90c3BvdFdyYXBwZXIuZ21rCmluZGV4IDQ4ZjFjMzguLjhhMWFlNjQgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9tYWtlZmlsZXMvSG90c3BvdFdyYXBwZXIuZ21rCisrKyBiL2NvbW1vbi9tYWtlZmlsZXMvSG90c3BvdFdyYXBwZXIuZ21rCkBAIC0zNiw5ICszNiwxMiBAQAogZGVmYXVsdDogYWxsCiAKICMgR2V0IGFsbCBmaWxlcyBleGNlcHQgLmhnIGluIHRoZSBob3RzcG90IGRpcmVjdG9yeS4KLUhPVFNQT1RfRklMRVMgOj0gICQoc2hlbGwgJChGSU5EKSAkKEhPVFNQT1RfVE9QRElSKSAtbmFtZSAiLmhnIiAtcHJ1bmUgLW8gLXByaW50KQorSE9UU1BPVF9GSUxFUyA6PSAgJChzaGVsbCAkKEZJTkQpIC1MICQoSE9UU1BPVF9UT1BESVIpIC1uYW1lICIuaGciIC1wcnVuZSAtbyAtcHJpbnQpCiAKKyMgVGhlIG9sZCBidWlsZCBjcmVhdGVzIGhvdHNwb3Qgb3V0cHV0IGRpciBiZWZvcmUgY2FsbGluZyBob3RzcG90IGFuZAorIyBub3QgZG9pbmcgaXQgYnJlYWtzIGJ1aWxkcyBvbiBtc3lzLgogJChIT1RTUE9UX09VVFBVVERJUikvX2hvdHNwb3QudGltZXN0YW1wOiAkKEhPVFNQT1RfRklMRVMpCisJQCQoTUtESVIpIC1wICQoSE9UU1BPVF9PVVRQVVRESVIpCiAJQCgkKENEKSAkKEhPVFNQT1RfVE9QRElSKS9tYWtlICYmICQoTUFLRSkgLWoxICQoSE9UU1BPVF9NQUtFX0FSR1MpIFNQRUM9JChIT1RTUE9UX1NQRUMpIEJBU0VfU1BFQz0kKEJBU0VfU1BFQykpCiAJJChUT1VDSCkgJEAKIApkaWZmIC0tZ2l0IGEvY29tbW9uL21ha2VmaWxlcy9JZGxDb21waWxhdGlvbi5nbWsgYi9jb21tb24vbWFrZWZpbGVzL0lkbENvbXBpbGF0aW9uLmdtawppbmRleCA3OTljN2Q2Li4xMWY2NjFhIDEwMDY0NAotLS0gYS9jb21tb24vbWFrZWZpbGVzL0lkbENvbXBpbGF0aW9uLmdtaworKysgYi9jb21tb24vbWFrZWZpbGVzL0lkbENvbXBpbGF0aW9uLmdtawpAQCAtNTksNyArNTksNyBAQAogCSQoTUtESVIpIC1wICQzLyQkKCQ0X1RNUERJUikKIAkkKFJNKSAtcmYgJDMvJCQoJDRfVE1QRElSKQogCSQoTUtESVIpIC1wICQoZGlyICQ1KQotCSQoRUNITykgQ29tcGlsaW5nIElETCAkKHBhdHN1YnN0ICQyLyUsJSwkNCkgCisJJChFQ0hPKSAkKExPR19JTkZPKSBDb21waWxpbmcgSURMICQocGF0c3Vic3QgJDIvJSwlLCQ0KSAKIAkkOCAtdGQgJDMvJCQoJDRfVE1QRElSKSBcCiAJCS1pICQyL29yZy9vbWcvQ09SQkEgXAogCQktaSAkMi9vcmcvb21nL1BvcnRhYmxlSW50ZXJjZXB0b3IgXApAQCAtNzksMTUgKzc5LDkgQEAKICMgcGFyYW0gMSBpcyBmb3IgZXhhbXBsZSBCVUlMRF9JRExTCiAjIHBhcmFtIDIsMyw0LDUsNiw3LDggYXJlIG5hbWVkIGFyZ3MuCiAjICAgIElETEosU1JDLEJJTixJTkNMVURFUyxFWENMVURFUyxPTERJTVBMQkFTRVMsREVMRVRFUwotJChpZiAkMiwkMV8kKHN0cmlwICQyKSkKLSQoaWYgJDMsJDFfJChzdHJpcCAkMykpCi0kKGlmICQ0LCQxXyQoc3RyaXAgJDQpKQotJChpZiAkNSwkMV8kKHN0cmlwICQ1KSkKLSQoaWYgJDYsJDFfJChzdHJpcCAkNikpCi0kKGlmICQ3LCQxXyQoc3RyaXAgJDcpKQotJChpZiAkOCwkMV8kKHN0cmlwICQ4KSkKLSQoaWYgJDksJDFfJChzdHJpcCAkOSkpCi0kKGlmICQoMTApLCQoZXJyb3IgSW50ZXJuYWwgbWFrZWZpbGUgZXJyb3I6IFRvbyBtYW55IGFyZ3VtZW50cyB0byBTZXR1cElkbENvbXBpbGF0aW9uLCBwbGVhc2UgdXBkYXRlIElkbENvbXBpbGF0aW9uLmdtaykpCiskKGZvcmVhY2ggaSwyIDMgNCA1IDYgNyA4IDkgMTAgMTEgMTIgMTMgMTQgMTUsICQoaWYgJCgkaSksJDFfJChzdHJpcCAkKCRpKSkpJChORVdMSU5FKSkKKyQoY2FsbCBMb2dTZXR1cE1hY3JvRW50cnksU2V0dXBJZGxDb21waWxhdGlvbigkMSksJDIsJDMsJDQsJDUsJDYsJDcsJDgsJDksJCgxMCksJCgxMSksJCgxMiksJCgxMyksJCgxNCksJCgxNSkpCiskKGlmICQoMTYpLCQoZXJyb3IgSW50ZXJuYWwgbWFrZWZpbGUgZXJyb3I6IFRvbyBtYW55IGFyZ3VtZW50cyB0byBTZXR1cElkbENvbXBpbGF0aW9uLCBwbGVhc2UgdXBkYXRlIElkbENvbXBpbGF0aW9uLmdtaykpCiAKICMgUmVtb3ZlIGFueSByZWxhdGl2ZSBhZGRyZXNzaW5nIGluIHRoZSBwYXRocy4KICQxX1NSQyA6PSAkJChhYnNwYXRoICQkKCQxX1NSQykpCmRpZmYgLS1naXQgYS9jb21tb24vbWFrZWZpbGVzL0phdmFDb21waWxhdGlvbi5nbWsgYi9jb21tb24vbWFrZWZpbGVzL0phdmFDb21waWxhdGlvbi5nbWsKaW5kZXggMWU4NTkzZi4uOGRkODg5OSAxMDA2NDQKLS0tIGEvY29tbW9uL21ha2VmaWxlcy9KYXZhQ29tcGlsYXRpb24uZ21rCisrKyBiL2NvbW1vbi9tYWtlZmlsZXMvSmF2YUNvbXBpbGF0aW9uLmdtawpAQCAtNTAsMjcgKzUwLDE3IEBACiAgICAgIyAgIEZMQUdTOj1GbGFncyB0byBiZSBzdXBwbGllZCB0byBqYXZhYwogICAgICMgICBTRVJWRVJfRElSOj1Vc2UgYSBqYXZhYyBzZXJ2ZXIgKC1YRHNlcnZlcikgYW5kIHN0b3JlIHRoZSBzZXJ2ZXIgcmVsYXRlZCBmaWxlcyBoZXJlCiAgICAgIyAgIFNFUlZFUl9KVk06PVVzZSB0aGlzIEpWTSBmb3IgdGhlIHNlcnZlci4gRGVmYXVsdHMgdG8gdGhlIEpWTSBhYm92ZS4KLSAgICAkKGlmICQyLCQxXyQoc3RyaXAgJDIpKQotICAgICQoaWYgJDMsJDFfJChzdHJpcCAkMykpCi0gICAgJChpZiAkNCwkMV8kKHN0cmlwICQ0KSkKLSAgICAkKGlmICQ1LCQxXyQoc3RyaXAgJDUpKQotICAgICQoaWYgJDYsJDFfJChzdHJpcCAkNikpCi0gICAgJChpZiAkNywkMV8kKHN0cmlwICQ3KSkKLSAgICAkKGlmICQ4LCQxXyQoc3RyaXAgJDgpKQotICAgICQoaWYgJDksJDFfJChzdHJpcCAkOSkpCi0gICAgJChpZiAkKDEwKSwkKGVycm9yIEludGVybmFsIG1ha2VmaWxlIGVycm9yOiBUb28gbWFueSBhcmd1bWVudHMgdG8gU2V0dXBKYXZhQ29tcGlsZXIsIHBsZWFzZSB1cGRhdGUgSmF2YUNvbXBpbGF0aW9uLmdtaykpCisgICAgJChmb3JlYWNoIGksMiAzIDQgNSA2IDcgOCA5IDEwIDExIDEyIDEzIDE0IDE1LCAkKGlmICQoJGkpLCQxXyQoc3RyaXAgJCgkaSkpKSQoTkVXTElORSkpCisgICAgJChjYWxsIExvZ1NldHVwTWFjcm9FbnRyeSxTZXR1cEphdmFDb21waWxlcigkMSksJDIsJDMsJDQsJDUsJDYsJDcsJDgsJDksJCgxMCksJCgxMSksJCgxMiksJCgxMyksJCgxNCksJCgxNSkpCisgICAgJChpZiAkKDE2KSwkKGVycm9yIEludGVybmFsIG1ha2VmaWxlIGVycm9yOiBUb28gbWFueSBhcmd1bWVudHMgdG8gU2V0dXBKYXZhQ29tcGlsZXIsIHBsZWFzZSB1cGRhdGUgSmF2YUNvbXBpbGF0aW9uLmdtaykpCiAKLSAgICBpZmVxICgkJChFTkFCTEVfU0pBVkFDKSx5ZXMpCi0gICAgICAgICMgVGhlIHBvcnQgZmlsZSBjb250YWlucyB0aGUgdGNwL2lwIG9uIHdoaWNoIHRoZSBzZXJ2ZXIgbGlzdGVucwotICAgICAgICAjIGFuZCB0aGUgY29va2llIG5lY2Vzc2FyeSB0byB0YWxrIHRvIHRoZSBzZXJ2ZXIuCi0gICAgICAgICQxX0pBVkFDX1BPUlRGSUxFOj0kJCgkMV9TRVJWRVJfRElSKS9zZXJ2ZXIucG9ydAotICAgICAgICAjIFlvdSBjYW4gdXNlIGEgZGlmZmVyZW50IEpWTSB0byBydW4gdGhlIGJhY2tncm91bmQgamF2YWMgc2VydmVyLgotICAgICAgICBpZmVxICgkJCgkMV9TRVJWRVJfSlZNKSwpCi0gICAgICAgICAgICAjIEl0IGRlZmF1bHRzIHRvIHRoZSBzYW1lIEpWTSB0aGF0IGlzIHVzZWQgdG8gc3RhcnQgdGhlIGphdmFjIGNvbW1hbmQuCi0gICAgICAgICAgICAkMV9TRVJWRVJfSlZNOj0kJCgkMV9KVk0pCi0gICAgICAgIGVuZGlmCi0gICAgICAgICMgU2V0IHRoZSAkMV9SRU1PVEUgdG8gc3Bhd24gYSBiYWNrZ3JvdW5kIGphdmFjIHNlcnZlci4KLSAgICAgICAgJDFfUkVNT1RFOj0tWERzZXJ2ZXI6cG9ydGZpbGU9JCQoJDFfSkFWQUNfUE9SVEZJTEUpLHBvb2xzaXplPSQoU0pBVkFDX1NFUlZFUl9DT1JFUyksaWQ9JDEsamF2YWM9JCQoc3Vic3QgJCQoU1BBQ0UpLCUyMCwkJChzdWJzdCAkJChDT01NQSksJTJDLCQkKHN0cmlwICQkKCQxX1NFUlZFUl9KVk0pICQkKCQxX0pBVkFDKSkpKQorICAgICMgVGhlIHBvcnQgZmlsZSBjb250YWlucyB0aGUgdGNwL2lwIG9uIHdoaWNoIHRoZSBzZXJ2ZXIgbGlzdGVucworICAgICMgYW5kIHRoZSBjb29raWUgbmVjZXNzYXJ5IHRvIHRhbGsgdG8gdGhlIHNlcnZlci4KKyAgICAkMV9TSkFWQUNfUE9SVEZJTEU6PSQkKCQxX1NFUlZFUl9ESVIpL3NlcnZlci5wb3J0CisgICAgIyBZb3UgY2FuIHVzZSBhIGRpZmZlcmVudCBKVk0gdG8gcnVuIHRoZSBiYWNrZ3JvdW5kIGphdmFjIHNlcnZlci4KKyAgICBpZmVxICgkJCgkMV9TRVJWRVJfSlZNKSwpCisgICAgICAgICMgSXQgZGVmYXVsdHMgdG8gdGhlIHNhbWUgSlZNIHRoYXQgaXMgdXNlZCB0byBzdGFydCB0aGUgamF2YWMgY29tbWFuZC4KKyAgICAgICAgJDFfU0VSVkVSX0pWTTo9JCQoJDFfSlZNKQogICAgIGVuZGlmCiBlbmRlZgogCkBAIC05MiwxOSArODIsMTEgQEAKICAgICAjICAgICAgICAgICAgICAgICAgYWRkZWQgdG8gdGhlIGFyY2hpdmUuCiAgICAgIyAgICBFWFRSQV9NQU5JRkVTVF9BVFRSOj1FeHRyYSBhdHRyaWJ1dGUgdG8gYWRkIHRvIG1hbmlmZXN0LgogICAgICMgICAgQ0hFQ0tfQ09NUFJFU1NfSkFSIENoZWNrIHRoZSBDT01QUkVTU19KQVIgdmFyaWFibGUKLSAgICAkKGlmICQzLCQxXyQoc3RyaXAgJDMpKQotICAgICQoaWYgJDQsJDFfJChzdHJpcCAkNCkpCi0gICAgJChpZiAkNSwkMV8kKHN0cmlwICQ1KSkKLSAgICAkKGlmICQ2LCQxXyQoc3RyaXAgJDYpKQotICAgICQoaWYgJDcsJDFfJChzdHJpcCAkNykpCi0gICAgJChpZiAkOCwkMV8kKHN0cmlwICQ4KSkKLSAgICAkKGlmICQ5LCQxXyQoc3RyaXAgJDkpKQotICAgICQoaWYgJCgxMCksJDFfJChzdHJpcCAkKDEwKSkpCi0gICAgJChpZiAkKDExKSwkMV8kKHN0cmlwICQoMTEpKSkKLSAgICAkKGlmICQoMTIpLCQxXyQoc3RyaXAgJCgxMikpKQotICAgICQoaWYgJCgxMyksJDFfJChzdHJpcCAkKDEzKSkpCi0gICAgJChpZiAkKDE0KSwkMV8kKHN0cmlwICQoMTQpKSkKLSAgICAkKGlmICQoMTUpLCQxXyQoc3RyaXAgJCgxNSkpKQorCisgICAgIyBOT1RFOiAkMiBpcyBkZXBlbmRlbmNpZXMsIG5vdCBhIG5hbWVkIGFyZ3VtZW50IQorICAgICQoZm9yZWFjaCBpLDMgNCA1IDYgNyA4IDkgMTAgMTEgMTIgMTMgMTQgMTUsICQoaWYgJCgkaSksJDFfJChzdHJpcCAkKCRpKSkpJChORVdMSU5FKSkKKyAgICAkKGNhbGwgTG9nU2V0dXBNYWNyb0VudHJ5LFNldHVwQXJjaGl2ZSgkMSksPGRlcGVuZGVuY2llcz4sJDMsJDQsJDUsJDYsJDcsJDgsJDksJCgxMCksJCgxMSksJCgxMiksJCgxMyksJCgxNCksJCgxNSkpCisgICAgJChpZiAkKGZpbmRzdHJpbmcgJChMT0cpLGRlYnVnIHRyYWNlKSwgJChpbmZvICpbMl0gPGRlcGVuZGVuY2llcz4gPSAkKHN0cmlwICQyKSkpCiAgICAgJChpZiAkKDE2KSwkKGVycm9yIEludGVybmFsIG1ha2VmaWxlIGVycm9yOiBUb28gbWFueSBhcmd1bWVudHMgdG8gU2V0dXBBcmNoaXZlLCBwbGVhc2UgdXBkYXRlIEphdmFDb21waWxhdGlvbi5nbWspKQogCiAgICAgJDFfSkFSTUFJTjo9JChzdHJpcCAkJCgkMV9KQVJNQUlOKSkKQEAgLTEyNSwxNiArMTA3LDI4IEBACiAgICAgaWZuZXEgKCwkJCgkMV9JTkNMVURFUykpCiAgICAgICAgICQxX0dSRVBfSU5DTFVERV9QQVRURVJOUzo9JCQoZm9yZWFjaCBzcmMsJCQoJDFfU1JDUyksXAogCQkJCQkkJChhZGRwcmVmaXggJCQoc3JjKS8sJCQoJDFfSU5DTFVERVMpKSkKLSAgICAgICAgJCQoZXZhbCAkJChjYWxsIExpc3RQYXRoc1NhZmVseU5vdywkMV9HUkVQX0lOQ0xVREVfUEFUVEVSTlMsXG4sIFwKKyAgICAgICAgIyBJZiB0aGVyZSBhcmUgYSBsb3Qgb2YgaW5jbHVkZSBwYXR0ZXJucywgb3V0cHV0IHRvIGZpbGUgdG8gc2hvcnRlbiBjb21tYW5kIGxpbmVzCisgICAgICAgIGlmZXEgKCQkKHdvcmQgMjAsJCQoJDFfR1JFUF9JTkNMVURFX1BBVFRFUk5TKSksKQorICAgICAgICAgICAgJDFfR1JFUF9JTkNMVURFUzo9fCAkKEdSRVApICQkKHBhdHN1YnN0ICUsJChTUEFDRSktZSQoU1BBQ0UpJChEUVVPVEUpJSQoRFFVT1RFKSwkJCgkMV9HUkVQX0lOQ0xVREVfUEFUVEVSTlMpKQorICAgICAgICBlbHNlCisgICAgICAgICAgICAkJChzaGVsbCAkKFJNKSAkJCgkMV9CSU4pL190aGUuJCQoJDFfSkFSTkFNRSlfaW5jbHVkZSkKKyAgICAgICAgICAgICQkKGV2YWwgJCQoY2FsbCBMaXN0UGF0aHNTYWZlbHlOb3csJDFfR1JFUF9JTkNMVURFX1BBVFRFUk5TLFxuLCBcCiAJCQk+PiAkJCgkMV9CSU4pL190aGUuJCQoJDFfSkFSTkFNRSlfaW5jbHVkZSkpCi0gICAgICAgICQxX0dSRVBfSU5DTFVERVM6PXwgJChHUkVQKSAtZiAkJCgkMV9CSU4pL190aGUuJCQoJDFfSkFSTkFNRSlfaW5jbHVkZQorICAgICAgICAgICAgJDFfR1JFUF9JTkNMVURFUzo9fCAkKEdSRVApIC1mICQkKCQxX0JJTikvX3RoZS4kJCgkMV9KQVJOQU1FKV9pbmNsdWRlCisgICAgICAgIGVuZGlmCiAgICAgZW5kaWYKICAgICBpZm5lcSAoLCQkKCQxX0VYQ0xVREVTKSQkKCQxX0VYQ0xVREVfRklMRVMpKQogICAgICAgICAkMV9HUkVQX0VYQ0xVREVfUEFUVEVSTlM6PSQkKGZvcmVhY2ggc3JjLCQkKCQxX1NSQ1MpLCQkKGFkZHByZWZpeCAkJChzcmMpLyxcCiAJCSQkKCQxX0VYQ0xVREVTKSAkJCgkMV9FWENMVURFX0ZJTEVTKSkpCi0gICAgICAgICQkKGV2YWwgJCQoY2FsbCBMaXN0UGF0aHNTYWZlbHlOb3csJDFfR1JFUF9FWENMVURFX1BBVFRFUk5TLFxuLCBcCisgICAgICAgICMgSWYgdGhlcmUgYXJlIGEgbG90IG9mIGluY2x1ZGUgcGF0dGVybnMsIG91dHB1dCB0byBmaWxlIHRvIHNob3J0ZW4gY29tbWFuZCBsaW5lcworICAgICAgICBpZmVxICgkJCh3b3JkIDIwLCQkKCQxX0dSRVBfRVhDTFVERV9QQVRURVJOUykpLCkKKyAgICAgICAgICAgICQxX0dSRVBfRVhDTFVERVM6PXwgJChHUkVQKSAtdiAkJChwYXRzdWJzdCAlLCQoU1BBQ0UpLWUkKFNQQUNFKSQoRFFVT1RFKSUkKERRVU9URSksJCQoJDFfR1JFUF9FWENMVURFX1BBVFRFUk5TKSkKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgJCQoc2hlbGwgJChSTSkgJCQoJDFfQklOKS9fdGhlLiQkKCQxX0pBUk5BTUUpX2V4Y2x1ZGUpCisgICAgICAgICAgICAkJChldmFsICQkKGNhbGwgTGlzdFBhdGhzU2FmZWx5Tm93LCQxX0dSRVBfRVhDTFVERV9QQVRURVJOUyxcbiwgXAogCQkJPj4gJCQoJDFfQklOKS9fdGhlLiQkKCQxX0pBUk5BTUUpX2V4Y2x1ZGUpKQotICAgICAgICAkMV9HUkVQX0VYQ0xVREVTOj18ICQoR1JFUCkgLXYgLWYgJCQoJDFfQklOKS9fdGhlLiQkKCQxX0pBUk5BTUUpX2V4Y2x1ZGUKKyAgICAgICAgICAgICQxX0dSRVBfRVhDTFVERVM6PXwgJChHUkVQKSAtdiAtZiAkJCgkMV9CSU4pL190aGUuJCQoJDFfSkFSTkFNRSlfZXhjbHVkZQorICAgICAgICBlbmRpZgogICAgIGVuZGlmCiAKICAgICAjIENoZWNrIGlmIHRoaXMgamFyIG5lZWRzIHRvIGhhdmUgaXRzIGluZGV4IGdlbmVyYXRlZC4KQEAgLTE0OSwxMSArMTQzLDEzIEBACiAgICAgaWZuZXEgKCwkMikKICAgICAgICAgJDFfREVQUzo9JDIKICAgICBlbHNlCi0gICAgICAgICQxX0RFUFM6PSQkKGZvcmVhY2ggc3JjLCQkKCQxX1NSQ1MpLCQkKHNoZWxsICgkKEZJTkQpICQkKHNyYykgLXR5cGUgZiBcCi0JCQktYSBcKCAkJCgkMV9GSU5EX1BBVFRFUk5TKSBcKSAkJCgkMV9HUkVQX0lOQ0xVREVTKSBcCi0JCQkkJCgkMV9HUkVQX0VYQ0xVREVTKSAmJiAkKEVDSE8pICQkKGFkZHByZWZpeCAkJChzcmMpLywkJCgkMV9FWFRSQV9GSUxFUykpKSkpCisgICAgICAgICMgVGhlIHN1YnN0IG9mIFwgaXMgbmVlZGVkIGJlY2F1c2UgJCBoYXMgdG8gYmUgZXNjYXBlZCB3aXRoIFwgaW4gRVhUUkFfRklMRVMgZm9yIHRoZSBjb21tYW5kIAorICAgICAgICAjIGxpbmVzLCBidXQgbm90IGhlcmUgZm9yIHVzZSBpbiBtYWtlIGRlcGVuZGVuY2llcy4KKyAgICAgICAgJDFfREVQUzo9JCQoc2hlbGwgJChGSU5EKSAkJCgkMV9TUkNTKSAtdHlwZSBmIC1hIFwoICQkKCQxX0ZJTkRfUEFUVEVSTlMpIFwpIFwKKwkJCSAgJCQoJDFfR1JFUF9JTkNMVURFUykgJCQoJDFfR1JFUF9FWENMVURFUykpIFwKKwkJICQkKHN1YnN0IFwsLCQkKGZvcmVhY2ggc3JjLCQkKCQxX1NSQ1MpLCQkKGFkZHByZWZpeCAkJChzcmMpLywkJCgkMV9FWFRSQV9GSUxFUykpKSkKICAgICAgICAgaWZlcSAoLCQkKCQxX1NLSVBfTUVUQUlORikpCi0gICAgICAgICAgICAkMV9ERVBTKz0kJChmb3JlYWNoIHNyYywkJCgkMV9TUkNTKSwkJChzaGVsbCAkKEZJTkQpICQkKHNyYykvTUVUQS1JTkYgLXR5cGUgZiAyPiAvZGV2L251bGwpKQorICAgICAgICAgICAgJDFfREVQUys9JCQoc2hlbGwgJChGSU5EKSAkJChhZGRzdWZmaXggL01FVEEtSU5GLCQkKCQxX1NSQ1MpKSAtdHlwZSBmIDI+IC9kZXYvbnVsbCkpCiAgICAgICAgIGVuZGlmCiAgICAgZW5kaWYKIApAQCAtMTYxLDM0ICsxNTcsMzkgQEAKIAogICAgICMgVGhlIGNhcHR1cmUgY29udGVudHMgbWFjcm8gZmluZHMgYWxsIGZpbGVzIChtYXRjaGluZyB0aGUgcGF0dGVybnMsIHR5cGljYWxseQogICAgICMgLmNsYXNzIGFuZCAucHJwKSB0aGF0IGFyZSBuZXdlciB0aGFuIHRoZSBqYXItZmlsZSwgaWUgdGhlIG5ldyBjb250ZW50IHRvIGJlIHB1dCBpbnRvIHRoZSBqYXIuCi0gICAgJDFfQ0FQVFVSRV9DT05URU5UUz0kJChmb3JlYWNoIHNyYywkJCgkMV9TUkNTKSwoKCQoRklORCkgJCQoc3JjKSAtdHlwZSBmIC1hIFwoICQkKCQxX0ZJTkRfUEFUVEVSTlMpIFwpIC1hIC1uZXdlciAkJEAgJCQoJDFfR1JFUF9JTkNMVURFUykgJCQoJDFfR1JFUF9FWENMVURFUykgJiYgJChFQ0hPKSAkJCgkMV9FWFRSQV9GSUxFUykpIHwgJChTRUQpICdzfCQkKHNyYykvfHxnJyA+ICQkKHNyYykvX3RoZS4kJCgkMV9KQVJOQU1FKV9jb250ZW50cykgJiYgKQorICAgICQxX0NBUFRVUkVfQ09OVEVOVFM9JCQoZm9yZWFjaCBzcmMsJCQoJDFfU1JDUyksXAorICAgICAgICAgICAgICAgICAgICgoJChGSU5EKSAkJChzcmMpIC10eXBlIGYgLWEgXCggJCQoJDFfRklORF9QQVRURVJOUykgXCkgLWEgLW5ld2VyICQkQCAkJCgkMV9HUkVQX0lOQ0xVREVTKSBcCisgICAgICAgICAgICAgICAgICAgICAgICQkKCQxX0dSRVBfRVhDTFVERVMpIHwgJChTRUQpICdzfCQkKHNyYykvfHxnJyAmJlwKKyAgICAgICAgICAgICAgICAgICAgICAgJChFQ0hPKSAkJChzdWJzdCAkJChzcmMpLywsJCQoJDFfRVhUUkFfRklMRVMpKSkgPiBcCisgICAgICAgICAgICAgICAgICAgICAgICQkKHNyYykvX3RoZS4kJCgkMV9KQVJOQU1FKV9jb250ZW50cykgJCQoTkVXTElORSkpCiAgICAgIyBUaGUgY2FwdHVyZSBtZXRhaW5mIG1hY3JvIGZpbmRzIGFsbCBmaWxlcyBiZWxvdyB0aGUgTUVUQS1JTkYgZGlyZWN0b3J5IHRoYXQgYXJlIG5ld2VyIHRoYW4gdGhlIGphci1maWxlLgogICAgIGlmZXEgKCwkJCgkMV9TS0lQX01FVEFJTkYpKQotICAgICAgICAkMV9DQVBUVVJFX01FVEFJTkYgPSQkKGZvcmVhY2ggc3JjLCQkKCQxX1NSQ1MpLCgkKEZJTkQpICQkKHNyYykvTUVUQS1JTkYgLXR5cGUgZiAtYSAtbmV3ZXIgJCRAIDI+IC9kZXYvbnVsbCB8ICQoU0VEKSAnc3wkJChzcmMpL3x8ZycgPj4gJCQoc3JjKS9fdGhlLiQkKCQxX0pBUk5BTUUpX2NvbnRlbnRzICkgJiYgKQorICAgICAgICAkMV9DQVBUVVJFX01FVEFJTkYgPSQkKGZvcmVhY2ggc3JjLCQkKCQxX1NSQ1MpLCgkKEZJTkQpICQkKHNyYykvTUVUQS1JTkYgLXR5cGUgZiAtYSAtbmV3ZXIgJCRAIDI+IC9kZXYvbnVsbCB8ICQoU0VEKSAnc3wkJChzcmMpL3x8ZycgPj4gJCQoc3JjKS9fdGhlLiQkKCQxX0pBUk5BTUUpX2NvbnRlbnRzICkgJCQoTkVXTElORSkpCiAgICAgZW5kaWYKICAgICAjIFRoZSBjYXB0dXJlIGRlbGV0ZXMgbWFjcm8gZmluZHMgYWxsIGRlbGV0ZWQgZmlsZXMgYW5kIGNvbmNhdGVuYXRlcyB0aGVtLiBUaGUgcmVzdWx0aW5nIGZpbGUKICAgICAjIHRlbGxzIHVzIHdoYXQgdG8gcmVtb3ZlIGZyb20gdGhlIGphci1maWxlLgotICAgICQxX0NBUFRVUkVfREVMRVRFUz0kJChmb3JlYWNoIHNyYywkJCgkMV9TUkNTKSwoJChGSU5EKSAkJChzcmMpIC1uYW1lIF90aGUucGFja2FnZS5kZWxldGVkIC1uZXdlciAkJEAgLWV4ZWMgJChTRUQpICdzfCQkKHNyYyl8fGcnIFx7XH0gPj4gJCQoJDFfREVMRVRFU19GSUxFKSBcOykgJiYpCisgICAgJDFfQ0FQVFVSRV9ERUxFVEVTPSQkKGZvcmVhY2ggc3JjLCQkKCQxX1NSQ1MpLCgkKEZJTkQpICQkKHNyYykgLW5hbWUgX3RoZS5wYWNrYWdlLmRlbGV0ZWQgLW5ld2VyICQkQCAtZXhlYyAkKFNFRCkgJ3N8JCQoc3JjKXx8ZycgXHtcfSA+PiAkJCgkMV9ERUxFVEVTX0ZJTEUpIFw7KSAkJChORVdMSU5FKSkKICAgICAjIFRoZSB1cGRhdGUgY29udGVudHMgbWFjcm8gdXBkYXRlcyB0aGUgamFyIGZpbGUgd2l0aCB0aGUgcHJldmlvdXNseSBjYXB0dXJlIGNvbnRlbnRzLgogICAgICQxX1VQREFURV9DT05URU5UUz0kJChmb3JlYWNoIHNyYywkJCgkMV9TUkNTKSxcCiAgICAgICAgICAgICAgICAgICAgIChjZCAkJChzcmMpICYmIFwKICAgICAgICAgICAgICAgICAgICAgIGlmIFsgLXMgX3RoZS4kJCgkMV9KQVJOQU1FKV9jb250ZW50cyBdOyB0aGVuIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAkKEVDSE8pICIgIHVwZGF0aW5nIiBgJChXQykgLWwgX3RoZS4kJCgkMV9KQVJOQU1FKV9jb250ZW50cyB8ICQoQVdLKSAneyBwcmludCAkJCQkMSB9J2AgZmlsZXMgJiYgXAogICAgICAgICAgICAgICAgICAgICAgICAgICQoSkFSKSAkJCgkMV9KQVJfVVBEQVRFX09QVElPTlMpICQkQCBAX3RoZS4kJCgkMV9KQVJOQU1FKV9jb250ZW50czsgXAotICAgICAgICAgICAgICAgICAgICAgZmkpICYmKQorICAgICAgICAgICAgICAgICAgICAgZmkpICQkKE5FV0xJTkUpKQogICAgICMgVGhlIHMtdmFyaWFudHMgb2YgdGhlIGFib3ZlIG1hY3JvcyBhcmUgdXNlZCB3aGVuIHRoZSBqYXIgaXMgY3JlYXRlZCBmcm9tIHNjcmF0Y2guCiAgICAgJDFfU0NBUFRVUkVfQ09OVEVOVFM9JCQoZm9yZWFjaCBzcmMsJCQoJDFfU1JDUyksXAogICAgICAgICAgICAgICAgICAgICAoKCQoRklORCkgJCQoc3JjKSAtdHlwZSBmIC1hIFwoICQkKCQxX0ZJTkRfUEFUVEVSTlMpIFwpICQkKCQxX0dSRVBfSU5DTFVERVMpIFwKLQkJCSQkKCQxX0dSRVBfRVhDTFVERVMpICYmICQoRUNITykgJCQoJDFfRVhUUkFfRklMRVMpKSB8ICQoU0VEKSAnc3wkJChzcmMpL3x8ZycgPiBcCi0JCQkkJChzcmMpL190aGUuJCQoJDFfSkFSTkFNRSlfY29udGVudHMpICYmICkKKwkJCSQkKCQxX0dSRVBfRVhDTFVERVMpIHwgJChTRUQpICdzfCQkKHNyYykvfHxnJyAmJlwKKwkJCSQkKHN1YnN0ICQkKHNyYykvLCwkKEVDSE8pICQkKCQxX0VYVFJBX0ZJTEVTKSkpID4gXAorCQkJJCQoc3JjKS9fdGhlLiQkKCQxX0pBUk5BTUUpX2NvbnRlbnRzKSAkJChORVdMSU5FKSkKIAogICAgIGlmZXEgKCwkJCgkMV9TS0lQX01FVEFJTkYpKQogICAgICAgICAkMV9TQ0FQVFVSRV9NRVRBSU5GPSQkKGZvcmVhY2ggc3JjLCQkKCQxX1NSQ1MpLFwKICAgICAgICAgICAgICAgICAgICAgKCQoRklORCkgJCQoc3JjKS9NRVRBLUlORiAtdHlwZSBmIDI+IC9kZXYvbnVsbCB8ICQoU0VEKSAnc3wkJChzcmMpL3x8ZycgPj4gXAotCQkJJCQoc3JjKS9fdGhlLiQkKCQxX0pBUk5BTUUpX2NvbnRlbnRzKSAmJiApCisJCQkkJChzcmMpL190aGUuJCQoJDFfSkFSTkFNRSlfY29udGVudHMpICQkKE5FV0xJTkUpKQogICAgIGVuZGlmCiAgICAgJDFfU1VQREFURV9DT05URU5UUz0kJChmb3JlYWNoIHNyYywkJCgkMV9TUkNTKSxcCi0gICAgICAgICAgICAgICAgICAgIChjZCAkJChzcmMpICYmICQoSkFSKSAkJCgkMV9KQVJfVVBEQVRFX09QVElPTlMpICQkQCBAJCQoc3JjKS9fdGhlLiQkKCQxX0pBUk5BTUUpX2NvbnRlbnRzKSAmJikKKyAgICAgICAgICAgICAgICAgICAgKGNkICQkKHNyYykgJiYgJChKQVIpICQkKCQxX0pBUl9VUERBVEVfT1BUSU9OUykgJCRAIEAkJChzcmMpL190aGUuJCQoJDFfSkFSTkFNRSlfY29udGVudHMpICQkKE5FV0xJTkUpKQogCiAgICAgIyBVc2UgYSBzbGlnaHRseSBzaG9ydGVyIG5hbWUgZm9yIGxvZ2dpbmcsIGJ1dCB3aXRoIGVub3VnaCBwYXRoIHRvIGlkZW50aWZ5IHRoaXMgamFyLgogICAgICQxX05BTUU6PSQkKHN1YnN0ICQkKE9VVFBVVF9ST09UKS8sLCQkKCQxX0pBUikpCkBAIC0yMDgsMzggKzIwOSwzMiBAQAogICAgICMgSGVyZSBpcyB0aGUgcnVsZSB0aGF0IGNyZWF0ZXMvdXBkYXRlcyB0aGUgamFyIGZpbGUuCiAgICAgJCQoJDFfSkFSKSA6ICQkKCQxX0RFUFMpCiAJJChNS0RJUikgLXAgJCQoJDFfQklOKQotCWlmIFsgLW4gIiQkKCQxX01BTklGRVNUKSIgXTsgdGhlbiBcCisJJCQoaWYgJCQoJDFfTUFOSUZFU1QpLFwKIAkJJChTRUQpIC1lICJzI0BAUkVMRUFTRUBAIyQoUkVMRUFTRSkjIiAgICAgICAgICAgXAotCQkgICAgICAgLWUgInMjQEBDT01QQU5ZX05BTUVAQCMkKENPTVBBTllfTkFNRSkjIiAkJCgkMV9NQU5JRkVTVCkgPiAkJCgkMV9NQU5JRkVTVF9GSUxFKTsgXAotCWVsc2UgXAotCQkkKFJNKSAkJCgkMV9NQU5JRkVTVF9GSUxFKSAmJiAkKFRPVUNIKSAkJCgkMV9NQU5JRkVTVF9GSUxFKTsgXAotCWZpCi0JaWYgWyAtbiAiJCQoc3RyaXAgJCQoJDFfSkFSTUFJTikpIiBdOyB0aGVuIFwKLQkJJChFQ0hPKSAiTWFpbi1DbGFzczogJCQoc3RyaXAgJCQoJDFfSkFSTUFJTikpIiA+PiAkJCgkMV9NQU5JRkVTVF9GSUxFKTsgXAotCWZpCi0JaWYgWyAtbiAiJCQoJDFfRVhUUkFfTUFOSUZFU1RfQVRUUikiIF07IHRoZW4gXAotCQkkKFBSSU5URikgIiQkKCQxX0VYVFJBX01BTklGRVNUX0FUVFIpXG4iID4+ICQkKCQxX01BTklGRVNUX0ZJTEUpOyBcCi0JZmkKLQkraWYgWyAtcyAkJEAgXTsgdGhlbiBcCi0JCSQoRUNITykgTW9kaWZ5aW5nICQkKCQxX05BTUUpICYmIFwKKwkJICAgICAgIC1lICJzI0BAQ09NUEFOWV9OQU1FQEAjJChDT01QQU5ZX05BTUUpIyIgJCQoJDFfTUFOSUZFU1QpID4gJCQoJDFfTUFOSUZFU1RfRklMRSkgXAorCSxcCisJCSQoUk0pICQkKCQxX01BTklGRVNUX0ZJTEUpICYmICQoVE9VQ0gpICQkKCQxX01BTklGRVNUX0ZJTEUpKQorCSQkKGlmICQkKCQxX0pBUk1BSU4pLCQoRUNITykgIk1haW4tQ2xhc3M6ICQkKHN0cmlwICQkKCQxX0pBUk1BSU4pKSIgPj4gJCQoJDFfTUFOSUZFU1RfRklMRSkpCisJJCQoaWYgJCQoJDFfRVhUUkFfTUFOSUZFU1RfQVRUUiksJChQUklOVEYpICIkJCgkMV9FWFRSQV9NQU5JRkVTVF9BVFRSKVxuIiA+PiAkJCgkMV9NQU5JRkVTVF9GSUxFKSkKKwkkJChpZiAkJCh3aWxkY2FyZCAkJEApLFwKKwkJJChFQ0hPKSBNb2RpZnlpbmcgJCQoJDFfTkFNRSkgJCQoTkVXTElORSlcCiAJCSQkKCQxX0NBUFRVUkVfQ09OVEVOVFMpIFwKIAkJJCQoJDFfQ0FQVFVSRV9NRVRBSU5GKSBcCi0JCSQoUk0pICQkKCQxX0RFTEVURVNfRklMRSkgJiYgXAorCQkkKFJNKSAkJCgkMV9ERUxFVEVTX0ZJTEUpICQkKE5FV0xJTkUpXAogCQkkJCgkMV9DQVBUVVJFX0RFTEVURVMpIFwKLQkJJChDQVQpICQkKCQxX0RFTEVURVNfRklMRSkgPiAkJCgkMV9ERUxFVEVTU19GSUxFKSAmJiBcCisJCSQoQ0FUKSAkJCgkMV9ERUxFVEVTX0ZJTEUpID4gJCQoJDFfREVMRVRFU1NfRklMRSkgJCQoTkVXTElORSlcCiAJCWlmIFsgLXMgJCQoJDFfREVMRVRFU1NfRklMRSkgXTsgdGhlbiBcCiAJCQkkKEVDSE8pICIgIGRlbGV0aW5nIiBgJChXQykgLWwgJCQoJDFfREVMRVRFU1NfRklMRSkgfCAkKEFXSykgJ3sgcHJpbnQgJCQkJDEgfSdgIGZpbGVzICYmIFwKIAkgICAgICAgICAgICAgICAgICAgICAgICQoWklQKSAtcSAtZCAkJEAgYCQoQ0FUKSAkJCgkMV9ERUxFVEVTU19GSUxFKWAgOyBcCi0JCWZpICYmIFwKLQkJJCQoJDFfVVBEQVRFX0NPTlRFTlRTKSB0cnVlICYmIFwKLQkJJCQoJDFfSkFSSU5ERVgpICYmIHRydWUgOyBcCi0JZWxzZSBcCi0JCSQoRUNITykgQ3JlYXRpbmcgJCQoJDFfTkFNRSkgJiYgJChKQVIpICQkKCQxX0pBUl9DUkVBVEVfT1BUSU9OUykgJCRAICQkKCQxX01BTklGRVNUX0ZJTEUpICYmIFwKKwkJZmkgJCQoTkVXTElORSkgXAorCQkkJCgkMV9VUERBVEVfQ09OVEVOVFMpIHRydWUgJCQoTkVXTElORSkgXAorCQkkJCgkMV9KQVJJTkRFWCkgJiYgdHJ1ZSBcCisJLFwKKwkJJChFQ0hPKSBDcmVhdGluZyAkJCgkMV9OQU1FKSAmJiAkKEpBUikgJCQoJDFfSkFSX0NSRUFURV9PUFRJT05TKSAkJEAgJCQoJDFfTUFOSUZFU1RfRklMRSkgJCQoTkVXTElORSkgXAogCSAgICAgICAgJCQoJDFfU0NBUFRVUkVfQ09OVEVOVFMpIFwKIAkJJCQoJDFfU0NBUFRVUkVfTUVUQUlORikgXAogCQkkJCgkMV9TVVBEQVRFX0NPTlRFTlRTKSBcCi0JCSQkKCQxX0pBUklOREVYKSAmJiB0cnVlIDsgXAotCWZpOyAKKwkJJCQoJDFfSkFSSU5ERVgpICYmIHRydWUgKSAKIAogZW5kZWYKIApAQCAtMjQ3LDE1ICsyNDIsOSBAQAogICAgICMgcGFyYW0gMSBpcyBmb3IgZXhhbXBsZSBaSVBfTVlTT1VSQ0UKICAgICAjIHBhcmFtIDIsMyw0LDUsNiw3LDgsOSBhcmUgbmFtZWQgYXJncy4KICAgICAjICAgIFNSQyxaSVAsSU5DTFVERVMsRVhDTFVERVMsRVhDTFVERV9GSUxFUyxTVUZGSVhFUyxFWFRSQV9ERVBTCi0gICAgJChpZiAkMiwkMV8kKHN0cmlwICQyKSkKLSAgICAkKGlmICQzLCQxXyQoc3RyaXAgJDMpKQotICAgICQoaWYgJDQsJDFfJChzdHJpcCAkNCkpCi0gICAgJChpZiAkNSwkMV8kKHN0cmlwICQ1KSkKLSAgICAkKGlmICQ2LCQxXyQoc3RyaXAgJDYpKQotICAgICQoaWYgJDcsJDFfJChzdHJpcCAkNykpCi0gICAgJChpZiAkOCwkMV8kKHN0cmlwICQ4KSkKLSAgICAkKGlmICQ5LCQxXyQoc3RyaXAgJDkpKQotICAgICQoaWYgJCgxMCksJChlcnJvciBJbnRlcm5hbCBtYWtlZmlsZSBlcnJvcjogVG9vIG1hbnkgYXJndW1lbnRzIHRvIFNldHVwWmlwQXJjaGl2ZSwgcGxlYXNlIHVwZGF0ZSBKYXZhQ29tcGlsYXRpb24uZ21rKSkKKyAgICAkKGZvcmVhY2ggaSwyIDMgNCA1IDYgNyA4IDkgMTAgMTEgMTIgMTMgMTQgMTUsICQoaWYgJCgkaSksJDFfJChzdHJpcCAkKCRpKSkpJChORVdMSU5FKSkKKyAgICAkKGNhbGwgTG9nU2V0dXBNYWNyb0VudHJ5LFNldHVwWmlwQXJjaGl2ZSgkMSksJDIsJDMsJDQsJDUsJDYsJDcsJDgsJDksJCgxMCksJCgxMSksJCgxMiksJCgxMyksJCgxNCksJCgxNSkpCisgICAgJChpZiAkKDE2KSwkKGVycm9yIEludGVybmFsIG1ha2VmaWxlIGVycm9yOiBUb28gbWFueSBhcmd1bWVudHMgdG8gU2V0dXBaaXBBcmNoaXZlLCBwbGVhc2UgdXBkYXRlIEphdmFDb21waWxhdGlvbi5nbWspKQogCiAgICAgIyBGaW5kIGFsbCBmaWxlcyBpbiB0aGUgc291cmNlIHRyZWUuCiAgICAgJDFfU1VGRklYX0ZJTFRFUiA6PSAkJChwYXRzdWJzdCAlLC1vIC1uYW1lICQoRFFVT1RFKSolJChEUVVPVEUpLCQkKCQxX1NVRkZJWEVTKSkKQEAgLTI3NCw3ICsyNjMsNyBAQAogICAgIGlmbmVxICgkJCgkMV9FWENMVURFUyksKQogICAgICAgICAkMV9TUkNfRVhDTFVERVMgOj0gJCQoZm9yZWFjaCBpLCQkKCQxX1NSQyksJCQoYWRkcHJlZml4ICQkaS8sJCQoYWRkc3VmZml4IC8lLCQkKCQxX0VYQ0xVREVTKSkpKQogICAgICAgICAkMV9aSVBfRVhDTFVERVMgOj0gJCQoYWRkcHJlZml4IC14JChTUEFDRSkkKERRVU9URSksJCQoYWRkc3VmZml4IC8qJChEUVVPVEUpLCQkKCQxX0VYQ0xVREVTKSkpCi0gICAgICAgICQxX0FMTF9TUkNTICAgICA6PSAkJChmaWx0ZXItb3V0ICQkKCQxX1NSQ19FWENMVURFUyksJCQoJDFfU1JDKSkKKyAgICAgICAgJDFfQUxMX1NSQ1MgICAgIDo9ICQkKGZpbHRlci1vdXQgJCQoJDFfU1JDX0VYQ0xVREVTKSwkJCgkMV9BTExfU1JDUykpCiAgICAgZW5kaWYKIAogICAgICMgVXNlIGEgc2xpZ2h0bHkgc2hvcnRlciBuYW1lIGZvciBsb2dnaW5nLCBidXQgd2l0aCBlbm91Z2ggcGF0aCB0byBpZGVudGlmeSB0aGlzIHppcC4KQEAgLTI4OCw3ICsyNzcsNyBAQAogICAgICQkKCQxX1pJUCkgOiAkJCgkMV9BTExfU1JDUykgJCQoJDFfRVhUUkFfREVQUykKIAkJJChNS0RJUikgLXAgJCQoQEQpCiAJCSQoRUNITykgVXBkYXRpbmcgJCQoJDFfTkFNRSkKLQkJJCQoZm9yZWFjaCBpLCQkKCQxX1NSQyksKGNkICQkaSAmJiAkKFpJUCkgLXFydSAkJEAgLiAkJCgkMV9aSVBfSU5DTFVERVMpICQkKCQxX1pJUF9FWENMVURFUykgLXggXCpfdGhlLlwqICQkKGFkZHByZWZpeCAteCQoU1BBQ0UpLCQkKHBhdHN1YnN0ICQkaS8lLCUsJCQoJDFfRVhDTFVERV9GSUxFUykpKSkgOykgdHJ1ZQorCQkkJChmb3JlYWNoIGksJCQoJDFfU1JDKSwoY2QgJCRpICYmICQoWklQKSAtcXJ1ICQkQCAuICQkKCQxX1pJUF9JTkNMVURFUykgJCQoJDFfWklQX0VYQ0xVREVTKSAteCBcKl90aGUuXCogJCQoYWRkcHJlZml4IC14JChTUEFDRSksJCQocGF0c3Vic3QgJCRpLyUsJSwkJCgkMV9FWENMVURFX0ZJTEVTKSkpKSQkKE5FV0xJTkUpKSB0cnVlCiAJCSQoVE9VQ0gpICQkQAogZW5kZWYKIApAQCAtMzI0LDcgKzMxMyw3IEBACiAgICAgJCQoJDFfQklOKSQkKCQyX1RBUkdFVCkgOiAkMgogCSQoTUtESVIpIC1wICQkKEBEKQogCSQoQ0FUKSAkJDwgfCAkKFNFRCkgLWUgJ3MvXChbXlxcXVwpOi9cMVxcOi9nJyAtZSAgJ3MvXChbXlxcXVwpPS9cMVxcPS9nJyAtZSAncy8jLiovIy9nJyBcCi0gICAgICAgICAgICAgICAgICAgfCAkKFNFRCkgLWYgIiQoU1JDX1JPT1QpL2NvbW1vbi9iaW4vdW5pY29kZTJ4LnNlZCIgXAorICAgICAgICAgICAgICAgICAgIHwgJChTRUQpIC1mICIkKFNSQ19ST09UKS9jb21tb24vbWFrZWZpbGVzL3N1cHBvcnQvdW5pY29kZTJ4LnNlZCIgXAogCQkgICB8ICQoU0VEKSAtZSAnL14jL2QnIC1lICcvXiQkJCQvZCcgXAogCQkgICAgICAgICAgICAtZSA6YSAtZSAnL1xcJCQkJC9OOyBzL1xcXG4vLzsgdGEnIFwKIAkJCSAgICAtZSAncy9eWyBcdF0qLy87cy9bIFx0XSokJCQkLy8nIFwKQEAgLTM2NCwzNiArMzUzLDI3IEBACiAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdHMgb25seSBoZXJlIHVudGlsIHdlIGNsZWFudXAgc29tZSBuYXN0eSBzb3VyY2UgY29kZSBwYXN0YSBpbiB0aGUgamRrLgogICAgICMgICAgSEVBREVSUzo9cGF0aCB0byBkaXJlY3Rvcnkgd2hlcmUgYWxsIGdlbmVyYXRlZCBjLWhlYWRlcnMgYXJlIHdyaXR0ZW4uCiAgICAgIyAgICBERVBFTkRTOj1FeHRyYSBkZXBlbmRlY3kKLSAgICAkKGlmICQyLCQxXyQoc3RyaXAgJDIpKQotICAgICQoaWYgJDMsJDFfJChzdHJpcCAkMykpCi0gICAgJChpZiAkNCwkMV8kKHN0cmlwICQ0KSkKLSAgICAkKGlmICQ1LCQxXyQoc3RyaXAgJDUpKQotICAgICQoaWYgJDYsJDFfJChzdHJpcCAkNikpCi0gICAgJChpZiAkNywkMV8kKHN0cmlwICQ3KSkKLSAgICAkKGlmICQ4LCQxXyQoc3RyaXAgJDgpKQotICAgICQoaWYgJDksJDFfJChzdHJpcCAkOSkpCi0gICAgJChpZiAkKDEwKSwkMV8kKHN0cmlwICQoMTApKSkKLSAgICAkKGlmICQoMTEpLCQxXyQoc3RyaXAgJCgxMSkpKQotICAgICQoaWYgJCgxMiksJDFfJChzdHJpcCAkKDEyKSkpCi0gICAgJChpZiAkKDEzKSwkMV8kKHN0cmlwICQoMTMpKSkKLSAgICAkKGlmICQoMTQpLCQxXyQoc3RyaXAgJCgxNCkpKQotICAgICQoaWYgJCgxNSksJChlcnJvciBJbnRlcm5hbCBtYWtlZmlsZSBlcnJvcjogVG9vIG1hbnkgYXJndW1lbnRzIHRvIFNldHVwSmF2YUNvbXBpbGF0aW9uLCBwbGVhc2UgdXBkYXRlIEphdmFDb21waWxhdGlvbi5nbWspKQorICAgICQoZm9yZWFjaCBpLDIgMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxMyAxNCAxNSwgJChpZiAkKCRpKSwkMV8kKHN0cmlwICQoJGkpKSkkKE5FV0xJTkUpKQorICAgICQoY2FsbCBMb2dTZXR1cE1hY3JvRW50cnksU2V0dXBKYXZhQ29tcGlsYXRpb24oJDEpLCQyLCQzLCQ0LCQ1LCQ2LCQ3LCQ4LCQ5LCQoMTApLCQoMTEpLCQoMTIpLCQoMTMpLCQoMTQpLCQoMTUpKQorICAgICQoaWYgJCgxNiksJChlcnJvciBJbnRlcm5hbCBtYWtlZmlsZSBlcnJvcjogVG9vIG1hbnkgYXJndW1lbnRzIHRvIFNldHVwSmF2YUNvbXBpbGF0aW9uLCBwbGVhc2UgdXBkYXRlIEphdmFDb21waWxhdGlvbi5nbWspKQogCiAgICAgIyBFeHRyYWN0IHRoZSBpbmZvIGZyb20gdGhlIGphdmEgY29tcGlsZXIgc2V0dXAuCi0gICAgJDFfUkVNT1RFIDo9ICQkKCQkKCQxX1NFVFVQKV9SRU1PVEUpCiAgICAgJDFfSlZNICAgOj0gJCQoJCQoJDFfU0VUVVApX0pWTSkKICAgICAkMV9KQVZBQyA6PSAkJCgkJCgkMV9TRVRVUClfSkFWQUMpCiAgICAgJDFfRkxBR1MgOj0gJCQoJCQoJDFfU0VUVVApX0ZMQUdTKSAkKEpBVkFDX0ZMQUdTKSAkJCgkMV9BRERfSkFWQUNfRkxBR1MpCiAgICAgaWZlcSAoJCQoJDFfSkFWQUMpLCkKICAgICAgICAgJCQoZXJyb3IgVGhlIEphdmEgY29tcGlsYXRpb24gJDEgcmVmZXJzIHRvIGEgbm9uLWV4aXN0YW50IGphdmEgY29tcGlsZXIgc2V0dXAgJCQoJDFfU0VUVVApKQogICAgIGVuZGlmCisgICAgJDFfU0pBVkFDX1BPUlRGSUxFIDo9ICQkKCQkKCQxX1NFVFVQKV9TSkFWQUNfUE9SVEZJTEUpCisgICAgJDFfU0VSVkVSX0pWTSA6PSAkJCgkJCgkMV9TRVRVUClfU0VSVkVSX0pWTSkKIAogICAgICMgSGFuZGxlIGFkZG9ucyBhbmQgb3ZlcnJpZGVzLgogICAgICQxX1NSQzo9JCQoY2FsbCBBRERfU1JDUywkJCgkMV9TUkMpKQogICAgICMgTWFrZSBzdXJlIHRoZSBkaXJzIGV4aXN0LgotICAgICQkKHNoZWxsICQoTUtESVIpIC1wICQkKCQxX1NSQykgJCQoJDFfQklOKSkKKyAgICAkJChmb3JlYWNoIGQsJCQoJDFfU1JDKSwgJCQoaWYgJCQod2lsZGNhcmQgJCRkKSwsJCQoZXJyb3IgU1JDIHNwZWNpZmllZCB0byBTZXR1cEphdmFDb21waWxhdGlvbiAkMSBjb250YWlucyBtaXNzaW5nIGRpcmVjdG9yeSAkJGQpKSkKKyAgICAkJChldmFsICQkKGNhbGwgTWFrZURpciwkJCgkMV9CSU4pKSkKICAgICAjIEZpbmQgYWxsIGZpbGVzIGluIHRoZSBzb3VyY2UgdHJlZXMuCi0gICAgJDFfQUxMX1NSQ1MgOj0gJCQoZmlsdGVyLW91dCAkKE9WUl9TUkNTKSwkJChmb3JlYWNoIGksJCQoJDFfU1JDKSwkJChzaGVsbCAkKEZJTkQpICQkaSAtdHlwZSBmKSkpCisgICAgJDFfQUxMX1NSQ1MgOj0gJCQoZmlsdGVyLW91dCAkKE9WUl9TUkNTKSwkJChzaGVsbCAkKEZJTkQpICQkKCQxX1NSQykgLXR5cGUgZikpCiAgICAgIyBFeHRyYWN0IHRoZSBqYXZhIGZpbGVzLgogICAgIGlmbmVxICgkJCgkMV9FWENMVURFX0ZJTEVTKSwpCiAgICAgICAgICQxX0VYQ0xVREVfRklMRVNfUEFUVEVSTjo9JCQoYWRkcHJlZml4ICUsJCQoJDFfRVhDTFVERV9GSUxFUykpCkBAIC00MjgsNyArNDA4LDcgQEAKICAgICAgICAgIyBSZXdyaXRlIGxpc3Qgb2YgcGF0dGVybnMgaW50byBhIGZpbmQgc3RhdGVtZW50LgogICAgICAgICAkMV9DT1BZX1BBVFRFUk46PSQoRkFMU0VfRklORF9QQVRURVJOKSAkJChwYXRzdWJzdCAlLCQoU1BBQ0UpLW8kKFNQQUNFKS1uYW1lJChTUEFDRSkkKERRVU9URSkqJSQoRFFVT1RFKSwkJCgkMV9DT1BZKSkKICAgICAgICAgIyBTZWFyY2ggZm9yIGFsbCBmaWxlcyB0byBiZSBjb3BpZWQuCi0gICAgICAgICQxX0FMTF9DT1BJRVMgOj0gJCQoZm9yZWFjaCBpLCQkKCQxX1NSQyksICQkKHNoZWxsICQoRklORCkgJCRpIFwoICQkKCQxX0NPUFlfUEFUVEVSTikgXCkgLWEgLXR5cGUgZikpCisgICAgICAgICQxX0FMTF9DT1BJRVMgOj0gJCQoZmlsdGVyICQkKGFkZHByZWZpeCAlLCQkKCQxX0NPUFkpKSwkJCgkMV9BTExfU1JDUykpCiAgICAgICAgICMgQ29weSB0aGVzZSBleHBsaWNpdGx5CiAgICAgICAgICQxX0FMTF9DT1BJRVMgKz0gJCQoJDFfQ09QWV9GSUxFUykKICAgICAgICAgIyBDb3B5IG11c3QgYWxzbyByZXNwZWN0IGZpbHRlcnMuCkBAIC00NDIsNyArNDIyLDcgQEAKICAgICAgICAgICAgICQxX0FMTF9DT1BJRVMgOj0gJCQoZmlsdGVyLW91dCAkJCgkMV9FWENMVURFX0ZJTEVTX1BBVFRFUk4pLCQkKCQxX0FMTF9DT1BJRVMpKQogICAgICAgICBlbmRpZgogICAgICAgICAjIEFsbCBmaWxlcyBiZWxvdyBNRVRBLUlORiBhcmUgYWx3YXlzIGNvcGllZC4KLSAgICAgICAgJDFfQUxMX0NPUElFUyArPSAkJChmb3JlYWNoIGksJCQoJDFfU1JDKSwgJCQoc2hlbGwgJChGSU5EKSAkJGkvTUVUQS1JTkYgLXR5cGUgZiAyPiAvZGV2L251bGwpKQorICAgICAgICAkMV9BTExfQ09QSUVTICs9ICQkKGZpbHRlciAkJChhZGRzdWZmaXggL01FVEEtSU5GJSwkJCgkMV9TUkMpKSwkJCgkMV9BTExfU1JDUykpCiAgICAgICAgIGlmbmVxICgsJCQoJDFfQUxMX0NPUElFUykpCiAgICAgICAgICAgICAjIFllcCwgdGhlcmUgYXJlIGZpbGVzIHRvIGJlIGNvcGllZCEKICAgICAgICAgICAgICQxX0FMTF9DT1BZX1RBUkdFVFM6PQpAQCAtNDU2LDcgKzQzNiw3IEBACiAgICAgICAgICMgUmV3cml0ZSBsaXN0IG9mIHBhdHRlcm5zIGludG8gYSBmaW5kIHN0YXRlbWVudC4KICAgICAgICAgJDFfQ0xFQU5fUEFUVEVSTjo9JChGQUxTRV9GSU5EX1BBVFRFUk4pICQkKHBhdHN1YnN0ICUsJChTUEFDRSktbyQoU1BBQ0UpLW5hbWUkKFNQQUNFKSQoRFFVT1RFKSolJChEUVVPVEUpLCQkKCQxX0NMRUFOKSkKICAgICAgICAgIyBTZWFyY2ggZm9yIGFsbCBmaWxlcyB0byBiZSBjb3BpZWQuCi0gICAgICAgICQxX0FMTF9DTEVBTlMgOj0gJCQoZm9yZWFjaCBpLCQkKCQxX1NSQyksICQkKHNoZWxsICQoRklORCkgJCRpIFwoICQkKCQxX0NMRUFOX1BBVFRFUk4pIFwpIC1hIC10eXBlIGYpKQorICAgICAgICAkMV9BTExfQ0xFQU5TIDo9ICQkKGZpbHRlciAkJChhZGRwcmVmaXggJSwkJCgkMV9DTEVBTikpLCQkKCQxX0FMTF9TUkNTKSkKICAgICAgICAgIyBDb3B5IGFuZCBjbGVhbiBtdXN0IGFsc28gcmVzcGVjdCBmaWx0ZXJzLgogICAgICAgICBpZm5lcSAoLCQkKCQxX0lOQ0xVREVTKSkKICAgICAgICAgICAgICQxX0FMTF9DTEVBTlMgOj0gJCQoZmlsdGVyICQkKCQxX1NSQ19JTkNMVURFUyksJCQoJDFfQUxMX0NMRUFOUykpCkBAIC00ODIsMzAgKzQ2Miw1OSBAQAogICAgICAgJCQoZXZhbCAkJChjYWxsIHJlcGxhY2Vfc3BhY2Vfd2l0aF9wYXRoc2VwLCQxX1NSQ1JPT1RTQywkJCgkMV9TUkMpKSkKICAgICBlbmRpZgogCi0gICAgaWZuZXEgKCwkJCgkMV9IRUFERVJTKSkKLSAgICAgICAgJDFfSEVBREVSU19BUkcgOj0gLWggJCQoJDFfSEVBREVSUykKLSAgICBlbmRpZgotCiAgICAgIyBDcmVhdGUgYSBzZWQgZXhwcmVzc2lvbiB0byByZW1vdmUgdGhlIHNvdXJjZSByb290cyBhbmQgdG8gcmVwbGFjZSAvIHdpdGggLgogICAgICMgYW5kIHJlbW92ZSAuamF2YSBhdCB0aGUgZW5kLiAKICAgICAkMV9SRVdSSVRFX0lOVE9fQ0xBU1NFUzo9JCQoZm9yZWFjaCBpLCQkKCQxX1NSQyksLWUgJ3N8JCRpL3x8ZycpIC1lICdzfC98LnxnJyAtZSAnc3wuamF2YSQkJCR8fGcnCiAKICAgICBpZmVxICgkJCgkMV9ESVNBQkxFX1NKQVZBQyl4JCQoRU5BQkxFX1NKQVZBQykseHllcykKKyAgICAgICAgaWZuZXEgKCwkJCgkMV9IRUFERVJTKSkKKyAgICAgICAgICAgICQxX0hFQURFUlNfQVJHIDo9IC1oICQkKCQxX0hFQURFUlMpCisgICAgICAgIGVuZGlmCisKICAgICAgICAgIyBVc2luZyBzamF2YWMgdG8gY29tcGlsZS4gCiAgICAgICAgICQxIDo9ICQkKCQxX0FMTF9DT1BZX1RBUkdFVFMpICQkKCQxX0FMTF9DT1BZX0NMRUFOX1RBUkdFVFMpICQkKCQxX0JJTikvamF2YWNfc3RhdGUKIAorICAgICAgICAjIENyZWF0ZSBTSkFWQUMgdmFyaWFibGUsCisgICAgICAgICMgZXhwZWN0cyAkMV9KQVZBQyB0byBiZSAiYm9vdGNsYXNzcGF0aHByZXBlbmQgLWphciAuLi5qYXZhYy5qYXIiCisgICAgICAgICMgYW5kIGl0IGlzIHJld3JpdHRlbiBpbnRvICJib290Y2xhc3NwYXRocHJlcGVuZCBjb20uc3VuLnRvb2xzLnNqYXZhYy5NYWluIgorICAgICAgICAkMV9TSkFWQUM6PSQkKHdvcmQgMSwkJCgkMV9KQVZBQykpIC1jcCAkJCh3b3JkIDMsJCQoJDFfSkFWQUMpKSBjb20uc3VuLnRvb2xzLnNqYXZhYy5NYWluCisKKyAgICAgICAgIyBTZXQgdGhlICQxX1JFTU9URSB0byBzcGF3biBhIGJhY2tncm91bmQgamF2YWMgc2VydmVyLgorICAgICAgICAkMV9SRU1PVEU6PS0tc2VydmVyOnBvcnRmaWxlPSQkKCQxX1NKQVZBQ19QT1JURklMRSkscG9vbHNpemU9JChTSkFWQUNfU0VSVkVSX0NPUkVTKSxpZD0kMSxzamF2YWM9JCQoc3Vic3QgJCQoU1BBQ0UpLCUyMCwkJChzdWJzdCAkJChDT01NQSksJTJDLCQkKHN0cmlwICQkKCQxX1NFUlZFUl9KVk0pICQkKCQxX1NKQVZBQykpKSkKKwogICAgICAgICAkJCgkMV9CSU4pL2phdmFjX3N0YXRlOiAkJCgkMV9TUkNTKSAkJCgkMV9ERVBFTkRTKQogCQkkKE1LRElSKSAtcCAkJChARCkKIAkJJCQoY2FsbCBMaXN0UGF0aHNTYWZlbHksJDFfU1JDUyxcbiwgPj4gJCQoJDFfQklOKS9fdGhlLmJhdGNoLnRtcCkKIAkJJChFQ0hPKSBDb21waWxpbmcgJDEKLQkJJCQoJDFfSlZNKSAkJCh3b3JkIDEsJCQoJDFfSkFWQUMpKSBjb20uc3VuLnRvb2xzLnNqYXZhYy5NYWluIFwKLQkJCSQkKCQxX1JFTU9URSkgJCQoJDFfU0pBVkFDX0FSR1MpIC0tcGVybWl0LXVuaWRlbnRpZmllZC1hcnRpZmFjdHMgLW1mbCAkJCgkMV9CSU4pL190aGUuYmF0Y2gudG1wIFwKKwkJJCQoJDFfSlZNKSAkJCgkMV9TSkFWQUMpIFwKKwkJCSQkKCQxX1JFTU9URSkgJCQoJDFfU0pBVkFDX0FSR1MpIFwKKwkJCS0tcGVybWl0LXVuaWRlbnRpZmllZC1hcnRpZmFjdHMgXAorCQkJLS1wZXJtaXQtc291cmNlcy13aXRob3V0LXBhY2thZ2UgXAorCQkJLS1jb21wYXJlLWZvdW5kLXNvdXJjZXMgJCQoJDFfQklOKS9fdGhlLmJhdGNoLnRtcCBcCiAJCQkkJCgkMV9GTEFHUykgXAogCQkJLWltcGxpY2l0Om5vbmUgLWQgJCQoJDFfQklOKSAkJCgkMV9IRUFERVJTX0FSRykKICAgICBlbHNlCiAgICAgICAgICMgVXNpbmcgcGxhaW4gamF2YWMgdG8gYmF0Y2ggY29tcGlsZSBldmVyeXRoaW5nLgogICAgICAgICAkMSA6PSAkJCgkMV9BTExfQ09QWV9UQVJHRVRTKSAkJCgkMV9BTExfQ09QWV9DTEVBTl9UQVJHRVRTKSAkJCgkMV9CSU4pL190aGUuYmF0Y2gKIAorICAgICAgICAjIFdoZW4gYnVsaWRpbmcgaW4gYmF0Y2gsIHB1dCBoZWFkZXJzIGluIGEgdGVtcCBkaXIgdG8gZmlsdGVyIG91dCB0aG9zZSB0aGF0IGFjdHVhbGx5CisgICAgICAgICMgY2hhbmdlZCBiZWZvcmUgY29weWluZyB0aGVtIHRvIHRoZSByZWFsIGhlYWRlciBkaXIuCisgICAgICAgIGlmbmVxICgsJCQoJDFfSEVBREVSUykpCisgICAgICAgICAgICAkMV9IRUFERVJTX0FSRyA6PSAtaCAkJCgkMV9IRUFERVJTKS50bXAKKworICAgICAgICAgICAgJCQoJDFfSEVBREVSUykvX3RoZS5oZWFkZXJzOiAkJCgkMV9CSU4pL190aGUuYmF0Y2gKKwkJJChNS0RJUikgLXAgJCQoQEQpCisJCWZvciBmIGluIGBscyAkJCgkMV9IRUFERVJTKS50bXBgOyBkbyBcCisJCSAgaWYgWyAhIC1mICIkJCgkMV9IRUFERVJTKS8kJCQkZiIgXSB8fCBbICJgJChESUZGKSAkJCgkMV9IRUFERVJTKS8kJCQkZiAkJCgkMV9IRUFERVJTKS50bXAvJCQkJGZgIiAhPSAiIiBdOyB0aGVuIFwKKwkJICAgICQoQ1ApIC1mICQkKCQxX0hFQURFUlMpLnRtcC8kJCQkZiAkJCgkMV9IRUFERVJTKS8kJCQkZjsgXAorCQkgIGZpOyBcCisJCWRvbmUKKwkJJChSTSkgLXIgJCQoJDFfSEVBREVSUykudG1wCisJCSQoVE9VQ0gpICQkQAorCisgICAgICAgICAgICAkMSArPSAkJCgkMV9IRUFERVJTKS9fdGhlLmhlYWRlcnMKKyAgICAgICAgZW5kaWYKKwogICAgICAgICAjIFdoZW4gbm90IHVzaW5nIHNqYXZhYywgcGFzcyBhbG9uZyBhbGwgc291cmNlcyB0byBqYXZhYyB1c2luZyBhbiBAZmlsZS4KICAgICAgICAgJCQoJDFfQklOKS9fdGhlLmJhdGNoOiAkJCgkMV9TUkNTKSAkJCgkMV9ERVBFTkRTKQogCQkkKE1LRElSKSAtcCAkJChARCkKQEAgLTUxNiw2ICs1MjUsNyBAQAogCQkJLWltcGxpY2l0Om5vbmUgLXNvdXJjZXBhdGggIiQkKCQxX1NSQ1JPT1RTQykiIFwKIAkJCS1kICQkKCQxX0JJTikgJCQoJDFfSEVBREVSU19BUkcpIEAkJCgkMV9CSU4pL190aGUuYmF0Y2gudG1wICYmIFwKIAkJCSQoTVYpICQkKCQxX0JJTikvX3RoZS5iYXRjaC50bXAgJCQoJDFfQklOKS9fdGhlLmJhdGNoKQorCiAgICAgZW5kaWYKIAogICAgICMgQ2hlY2sgaWYgYSBqYXIgZmlsZSB3YXMgc3BlY2lmaWVkLCB0aGVuIHNldHVwIHRoZSBydWxlcyBmb3IgdGhlIGphci4KZGlmZiAtLWdpdCBhL2NvbW1vbi9tYWtlZmlsZXMvTWFpbi5nbWsgYi9jb21tb24vbWFrZWZpbGVzL01haW4uZ21rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5MzIyYWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb21tb24vbWFrZWZpbGVzL01haW4uZ21rCkBAIC0wLDAgKzEsMjA4IEBACisjCisjIENvcHlyaWdodCAoYykgMjAxMSwgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorIworIyBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMKKyMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorIyBieSBPcmFjbGUgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyMKKyMgVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisjIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorIyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyMgYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorIyAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyMKKyMgUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyMgb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQorIyBxdWVzdGlvbnMuCisjCisKKyMjIyBUaGlzIGlzIHRoZSBtYWluIHBhcnQgb2YgdGhlIE1ha2VmaWxlLCBmb3IgdGhlIG5vcm1hbCBjYXNlIHdpdGggU1BFQyBzcGVjaWZ5aW5nIGEgc2luZ2xlIGV4aXN0aW5nIHNwZWMuZ21rIGZpbGUuCisKKyMgTm93IGxvYWQgdGhlIHNwZWMKK2luY2x1ZGUgJChTUEVDKQorCisjIExvYWQgdGhlIHZpdGFsIHRvb2xzIGZvciBhbGwgdGhlIG1ha2VmaWxlcy4gCitpbmNsdWRlICQoU1JDX1JPT1QpL2NvbW1vbi9tYWtlZmlsZXMvTWFrZUJhc2UuZ21rCisKKyMgSW5jbHVkZSB0aGUgY29ycmVzcG9uZGluZyBjdXN0b20gZmlsZSwgaWYgcHJlc2VudC4KKy1pbmNsdWRlICQoQ1VTVE9NX01BS0VfRElSKS9NYWluLmdtaworCisjIyMgQ2xlYW4gdXAgZnJvbSBwcmV2aW91cyBydW4KKworIyBSZW1vdmUgYW55IGJ1aWxkLmxvZyBmcm9tIGEgcHJldmlvdXMgcnVuLCBpZiB0aGV5IGV4aXN0CitpZm5lcSAoLCQoQlVJTERfTE9HKSkKKyAgICBpZm5lcSAoLCQoQlVJTERfTE9HX1BSRVZJT1VTKSkKKyAgICAgICAgIyBSb3RhdGUgb2xkIGxvZworICAgICAgICAkKHNoZWxsICQoUk0pICQoQlVJTERfTE9HX1BSRVZJT1VTKSAyPiAvZGV2L251bGwpCisgICAgICAgICQoc2hlbGwgJChNVikgJChCVUlMRF9MT0cpICQoQlVJTERfTE9HX1BSRVZJT1VTKSAyPiAvZGV2L251bGwpCisgICAgZWxzZQorICAgICAgICAkKHNoZWxsICQoUk0pICQoQlVJTERfTE9HKSAyPiAvZGV2L251bGwpCisgICAgZW5kaWYKKyAgICAkKHNoZWxsICQoUk0pICQoT1VUUFVUX1JPT1QpL2J1aWxkLXRyYWNlLXRpbWUubG9nIDI+IC9kZXYvbnVsbCkKK2VuZGlmCisjIFJlbW92ZSBhbnkgamF2YWMgc2VydmVyIGxvZ3MgYW5kIHBvcnQgZmlsZXMuIFRoaXMKKyMgcHJldmVudHMgYSBuZXcgbWFrZSBydW4gdG8gcmV1c2UgdGhlIHByZXZpb3VzIHNlcnZlcnMuCitpZm5lcSAoLCQoU0pBVkFDX1NFUlZFUl9ESVIpKQorICAgICQoc2hlbGwgJChNS0RJUikgLXAgJChTSkFWQUNfU0VSVkVSX0RJUikgJiYgJChSTSkgLXJmICQoU0pBVkFDX1NFUlZFUl9ESVIpLyopCitlbmRpZgorCisjIFJlc2V0IHRoZSBidWlsZCB0aW1lcnMuCiskKGV2YWwgJChjYWxsIFJlc2V0QWxsVGltZXJzKSkKKworIyBTZXR1cCBudW1iZXIgb2Ygam9icyB0byB1c2UuIC1qTiBpcyB1bmZvcnR1bmF0ZWx5IG5vdCBhdmFpbGFibGUgZm9yIHVzIHRvIHBhcnNlIGZyb20gdGhlIGNvbW1hbmQgbGluZSwKKyMgaGVuY2UgdGhpcyB3b3JrYXJvdW5kLgoraWZlcSAoJChKT0JTKSwpCisgICAgSk9CUz0kKE5VTV9DT1JFUykKK2VuZGlmCitNQUtFX0FSR1M6PSQoTUFLRV9BUkdTKSAtaiQoSk9CUykKKworIyMjIE1haW4gdGFyZ2V0cworCithbGw6IGpkaworCitzdGFydC1tYWtlOgorCUAkKGNhbGwgQXRNYWtlU3RhcnQpCisKK2xhbmd0b29sczogbGFuZ3Rvb2xzLW9ubHkKK2xhbmd0b29scy1vbmx5OiBzdGFydC1tYWtlCisJQCQoY2FsbCBUYXJnZXRFbnRlcikKKwlAKCQoQ0QpICQoTEFOR1RPT0xTX1RPUERJUikvbWFrZWZpbGVzICYmICQoQlVJTERfTE9HX1dSQVBQRVIpICQoTUFLRSkgJChNQUtFX0FSR1MpIC1mIEJ1aWxkTGFuZ3Rvb2xzLmdtaykKKwlAJChjYWxsIFRhcmdldEV4aXQpCisKK2NvcmJhOiBsYW5ndG9vbHMgY29yYmEtb25seQorY29yYmEtb25seTogc3RhcnQtbWFrZQorCUAkKGNhbGwgVGFyZ2V0RW50ZXIpCisJQCgkKENEKSAkKENPUkJBX1RPUERJUikvbWFrZWZpbGVzICYmICQoQlVJTERfTE9HX1dSQVBQRVIpICQoTUFLRSkgJChNQUtFX0FSR1MpIC1mIEJ1aWxkQ29yYmEuZ21rKQorCUAkKGNhbGwgVGFyZ2V0RXhpdCkKKworamF4cDogbGFuZ3Rvb2xzIGpheHAtb25seQoramF4cC1vbmx5OiBzdGFydC1tYWtlCisJQCQoY2FsbCBUYXJnZXRFbnRlcikKKwlAKCQoQ0QpICQoSkFYUF9UT1BESVIpL21ha2VmaWxlcyAmJiAkKEJVSUxEX0xPR19XUkFQUEVSKSAkKE1BS0UpICQoTUFLRV9BUkdTKSAtZiBCdWlsZEpheHAuZ21rKQorCUAkKGNhbGwgVGFyZ2V0RXhpdCkKKworamF4d3M6IGxhbmd0b29scyBqYXhwIGpheHdzLW9ubHkKK2pheHdzLW9ubHk6IHN0YXJ0LW1ha2UKKwlAJChjYWxsIFRhcmdldEVudGVyKQorCUAoJChDRCkgJChKQVhXU19UT1BESVIpL21ha2VmaWxlcyAmJiAkKEJVSUxEX0xPR19XUkFQUEVSKSAkKE1BS0UpICQoTUFLRV9BUkdTKSAtZiBCdWlsZEpheHdzLmdtaykKKwlAJChjYWxsIFRhcmdldEV4aXQpCisKK2hvdHNwb3Q6IGhvdHNwb3Qtb25seQoraG90c3BvdC1vbmx5OiBzdGFydC1tYWtlCisJQCQoY2FsbCBUYXJnZXRFbnRlcikKKwlAKCQoQ0QpICQoU1JDX1JPT1QpL2NvbW1vbi9tYWtlZmlsZXMgJiYgJChCVUlMRF9MT0dfV1JBUFBFUikgJChNQUtFKSAkKE1BS0VfQVJHUykgLWYgSG90c3BvdFdyYXBwZXIuZ21rKQorCUAkKGNhbGwgVGFyZ2V0RXhpdCkKKworamRrOiBsYW5ndG9vbHMgaG90c3BvdCBjb3JiYSBqYXhwIGpheHdzIGpkay1vbmx5CitqZGstb25seTogc3RhcnQtbWFrZQorCUAkKGNhbGwgVGFyZ2V0RW50ZXIpCisJQCgkKENEKSAkKEpES19UT1BESVIpL21ha2VmaWxlcyAmJiAkKEJVSUxEX0xPR19XUkFQUEVSKSAkKE1BS0UpICQoTUFLRV9BUkdTKSAtZiBCdWlsZEpkay5nbWsgJChKREtfVEFSR0VUKSkKKwlAJChjYWxsIFRhcmdldEV4aXQpCisKK2RlbW9zOiBqZGsgZGVtb3Mtb25seQorZGVtb3Mtb25seTogc3RhcnQtbWFrZQorCUAkKGNhbGwgVGFyZ2V0RW50ZXIpCisJQCgkKENEKSAkKEpES19UT1BESVIpL21ha2VmaWxlcyAmJiAkKEJVSUxEX0xPR19XUkFQUEVSKSAkKE1BS0UpICQoTUFLRV9BUkdTKSAtZiBCdWlsZEpkay5nbWsgZGVtb3MpCisJQCQoY2FsbCBUYXJnZXRFeGl0KQorCitpbWFnZXM6IHNvdXJjZS10aXBzIGRlbW9zIGltYWdlcy1vbmx5CitpbWFnZXMtb25seTogc3RhcnQtbWFrZQorCUAkKGNhbGwgVGFyZ2V0RW50ZXIpCisJQCgkKENEKSAkKEpES19UT1BESVIpL21ha2VmaWxlcyAmJiAkKEJVSUxEX0xPR19XUkFQUEVSKSAkKE1BS0UpICQoTUFLRV9BUkdTKSAtZiBCdWlsZEpkay5nbWsgaW1hZ2VzKQorCUAkKGNhbGwgVGFyZ2V0RXhpdCkKKworb3ZlcmxheS1pbWFnZXM6IHNvdXJjZS10aXBzIGRlbW9zIG92ZXJsYXktaW1hZ2VzLW9ubHkKK292ZXJsYXktaW1hZ2VzLW9ubHk6IHN0YXJ0LW1ha2UKKwlAJChjYWxsIFRhcmdldEVudGVyKQorCUAoJChDRCkgJChKREtfVE9QRElSKS9tYWtlZmlsZXMgJiYgJChCVUlMRF9MT0dfV1JBUFBFUikgJChNQUtFKSAkKE1BS0VfQVJHUykgLWYgQnVpbGRKZGsuZ21rIG92ZXJsYXktaW1hZ2VzKQorCUAkKGNhbGwgVGFyZ2V0RXhpdCkKKworYnVuZGxlczogaW1hZ2VzIGJ1bmRsZXMtb25seQorYnVuZGxlcy1vbmx5OiBzdGFydC1tYWtlCisJQCQoY2FsbCBUYXJnZXRFbnRlcikKKwlAKCQoQ0QpICQoSkRLX1RPUERJUikvbWFrZWZpbGVzICYmICQoQlVJTERfTE9HX1dSQVBQRVIpICQoTUFLRSkgJChNQUtFX0FSR1MpIC1mIEJ1aWxkSmRrLmdtayBidW5kbGVzKQorCUAkKGNhbGwgVGFyZ2V0RXhpdCkKKworaW5zdGFsbDogaW1hZ2VzIGluc3RhbGwtb25seQoraW5zdGFsbC1vbmx5OiBzdGFydC1tYWtlCisJQCQoY2FsbCBUYXJnZXRFbnRlcikKKwlAKCQoQ0QpICQoSkRLX1RPUERJUikvbWFrZWZpbGVzICYmICQoQlVJTERfTE9HX1dSQVBQRVIpICQoTUFLRSkgJChNQUtFX0FSR1MpIC1mIEJ1aWxkSmRrLmdtayBpbnN0YWxsKQorCUAkKGNhbGwgVGFyZ2V0RXhpdCkKKworZG9jczogamRrIGRvY3Mtb25seQorZG9jcy1vbmx5OiBzdGFydC1tYWtlCisJQCQoY2FsbCBUYXJnZXRFbnRlcikKKwlAKCQoQ0QpICQoU1JDX1JPT1QpL2NvbW1vbi9tYWtlZmlsZXMvamF2YWRvYyAmJiAkKEJVSUxEX0xPR19XUkFQUEVSKSAkKE1BS0UpICQoTUFLRV9BUkdTKSAtZiBKYXZhZG9jLmdtayBkb2NzKQorCUAkKGNhbGwgVGFyZ2V0RXhpdCkKKworYm9vdGN5Y2xlLWltYWdlczoKKwlAJChFQ0hPKSBCb290IGN5Y2xlIGJ1aWxkIHN0ZXAgMTogQnVpbGRpbmcgdGhlIEpESyBpbWFnZSBub3JtYWxseQorCUAoJChDRCkgJChTUkNfUk9PVCkvY29tbW9uL21ha2VmaWxlcyAmJiAkKEJVSUxEX0xPR19XUkFQUEVSKSAkKE1BS0UpIFNQRUM9JChTUEVDKSBpbWFnZXMpCisJQCQoRUNITykgQm9vdCBjeWNsZSBidWlsZCBzdGVwIDI6IEJ1aWxkaW5nIGEgbmV3IEpESyBpbWFnZSB1c2luZyBwcmV2aW91c2x5IGJ1aWx0IGltYWdlCisJQCgkKENEKSAkKFNSQ19ST09UKS9jb21tb24vbWFrZWZpbGVzICYmICQoQlVJTERfTE9HX1dSQVBQRVIpICQoTUFLRSkgU1BFQz0kKGRpciAkKFNQRUMpKWJvb3RjeWNsZS1zcGVjLmdtayBpbWFnZXMpCisKK3Rlc3Q6IHN0YXJ0LW1ha2UKKwlAJChjYWxsIFRhcmdldEVudGVyKQorCUAoJChDRCkgJChTUkNfUk9PVCkvdGVzdCAmJiAkKEJVSUxEX0xPR19XUkFQUEVSKSAkKE1BS0UpIE1BS0VGTEFHUz0gLWoxIFBST0RVQ1RfSE9NRT0kKE9VVFBVVF9ST09UKS9qZGsgSlBSVF9KQVZBX0hPTUU9JChPVVRQVVRfUk9PVCkvamRrIEFMVF9PVVRQVVRESVI9JChPVVRQVVRfUk9PVCkgJChURVNUKSkgfHwgdHJ1ZQorCUAkKGNhbGwgVGFyZ2V0RXhpdCkKKworIyBTdG9yZXMgdGhlIHRpcHMgZm9yIGVhY2ggcmVwb3NpdG9yeS4gVGhpcyBmaWxlIGlzIGJlIHVzZWQgd2hlbiBjb25zdHJ1Y3RpbmcgdGhlIGpkayBpbWFnZSBhbmQgY2FuIGJlCisjIHVzZWQgdG8gdHJhY2sgdGhlIGV4YWN0IHNvdXJjZXMgdXNlZCB0byBidWlsZCB0aGF0IGltYWdlLgorc291cmNlLXRpcHM6ICQoT1VUUFVUX1JPT1QpL3NvdXJjZV90aXBzCiskKE9VVFBVVF9ST09UKS9zb3VyY2VfdGlwczogRlJDCisJQCQoTUtESVIpIC1wICQoQEQpCisJQCQoUk0pICRACisJQCQoaWYgJChIRyksJChjYWxsIEdldFNvdXJjZVRpcHMpLCQoRUNITykgImhnIG5vdCBpbnN0YWxsZWQiID4gJEApCisKKworIyBSZW1vdmUgZXZlcnl0aGluZywgZXhjZXB0IHRoZSBvdXRwdXQgZnJvbSBjb25maWd1cmUuCitjbGVhbjogY2xlYW4tbGFuZ3Rvb2xzIGNsZWFuLWNvcmJhIGNsZWFuLWpheHAgY2xlYW4tamF4d3MgY2xlYW4taG90c3BvdCBjbGVhbi1qZGsgY2xlYW4taW1hZ2VzIGNsZWFuLW92ZXJsYXktaW1hZ2VzIGNsZWFuLWJvb3RjeWNsZS1idWlsZAorCUAoJChDRCkgJChPVVRQVVRfUk9PVCkgJiYgJChSTSkgLXIgdG1wIHNvdXJjZV90aXBzIGJ1aWxkLmxvZyogYnVpbGQtdHJhY2UqLmxvZyopCisJQCQoRUNITykgQ2xlYW5lZCBhbGwgYnVpbGQgYXJ0aWZhY3RzLgorCisjIFJlbW92ZSBldmVyeXRoaW5nLCBpbmNsdWRpbmcgY29uZmlndXJlIGNvbmZpZ3VyYXRpb24uCisjIElmIHRoZSBvdXRwdXQgZGlyZWN0b3J5IHdhcyBjcmVhdGVkIGJ5IGNvbmZpZ3VyZSBhbmQgbm93IGJlY29tZXMgZW1wdHksIHJlbW92ZSBpdCBhcyB3ZWxsLgorIyBGSVhNRTogdG1wIHNob3VsZCBub3QgYmUgaGVyZSwgZml4IFJlc2V0VGltZXJzIGluc3RlYWQuIEFuZCByZW1vdmUgc3BlYy5zaCEKK2Rpc3QtY2xlYW46IGNsZWFuCisJQCgkKENEKSAkKE9VVFBVVF9ST09UKSAmJiAkKFJNKSAtciAqc3BlYy5nbWsgY29uZmlnLiogY29uZmlndXJlLWFyZ3VtZW50cyBNYWtlZmlsZSBjb21wYXJlLnNoIHNwZWMuc2ggdG1wKQorCUAkKGlmICQoZmlsdGVyICQoQ09ORl9OQU1FKSwkKG5vdGRpciAkKE9VVFBVVF9ST09UKSkpLCBcCisgICAgaWYgdGVzdCAieGAkKExTKSAkKE9VVFBVVF9ST09UKWAiICE9IHg7IHRoZW4gXAorICAgICAgICAkKEVDSE8pICJXYXJuaW5nOiBOb3QgcmVtb3Zpbmcgbm9uLWVtcHR5IGNvbmZpZ3VyYXRpb24gZGlyZWN0b3J5IGZvciAnJChDT05GX05BTUUpJyIgO1wKKyAgICBlbHNlIFwKKyAgICAgICAgKCQoQ0QpICQoU1JDX1JPT1QpICYmICQoRUNITykgIlJlbW92aW5nIGNvbmZpZ3VyYXRpb24gZGlyZWN0b3J5IGZvciAnJChDT05GX05BTUUpJyIgJiYgJChSTSkgLXIgJChPVVRQVVRfUk9PVCkpIFwKKyAgICBmaSBcCisgICkKKwlAJChFQ0hPKSBDbGVhbmVkIGV2ZXJ5dGhpbmcsIHlvdSB3aWxsIGhhdmUgdG8gcmUtcnVuIGNvbmZpZ3VyZS4KKworY2xlYW4tbGFuZ3Rvb2xzOgorCSQoY2FsbCBDbGVhbkNvbXBvbmVudCxsYW5ndG9vbHMpCitjbGVhbi1jb3JiYToKKwkkKGNhbGwgQ2xlYW5Db21wb25lbnQsY29yYmEpCitjbGVhbi1qYXhwOgorCSQoY2FsbCBDbGVhbkNvbXBvbmVudCxqYXhwKQorY2xlYW4tamF4d3M6CisJJChjYWxsIENsZWFuQ29tcG9uZW50LGpheHdzKQorY2xlYW4taG90c3BvdDoKKwkkKGNhbGwgQ2xlYW5Db21wb25lbnQsaG90c3BvdCkKK2NsZWFuLWpkazoKKwkkKGNhbGwgQ2xlYW5Db21wb25lbnQsamRrKQorY2xlYW4taW1hZ2VzOgorCSQoY2FsbCBDbGVhbkNvbXBvbmVudCxpbWFnZXMpCitjbGVhbi1vdmVybGF5LWltYWdlczoKKwkkKGNhbGwgQ2xlYW5Db21wb25lbnQsb3ZlcmxheS1pbWFnZXMpCitjbGVhbi1ib290Y3ljbGUtYnVpbGQ6CisJJChjYWxsIENsZWFuQ29tcG9uZW50LGJvb3RjeWNsZS1idWlsZCkKKworLlBIT05ZOiBsYW5ndG9vbHMgY29yYmEgamF4cCBqYXh3cyBob3RzcG90IGpkayBpbWFnZXMgb3ZlcmxheS1pbWFnZXMgaW5zdGFsbAorLlBIT05ZOiBsYW5ndG9vbHMtb25seSBjb3JiYS1vbmx5IGpheHAtb25seSBqYXh3cy1vbmx5IGhvdHNwb3Qtb25seSBqZGstb25seSBpbWFnZXMtb25seSBvdmVybGF5LWltYWdlcy1vbmx5IGluc3RhbGwtb25seQorLlBIT05ZOiBhbGwgdGVzdCBjbGVhbiBkaXN0LWNsZWFuIGJvb3RjeWNsZS1pbWFnZXMgc3RhcnQtbWFrZQorLlBIT05ZOiBjbGVhbi1sYW5ndG9vbHMgY2xlYW4tY29yYmEgY2xlYW4tamF4cCBjbGVhbi1qYXh3cyBjbGVhbi1ob3RzcG90IGNsZWFuLWpkayBjbGVhbi1pbWFnZXMgY2xlYW4tb3ZlcmxheS1pbWFnZXMgY2xlYW4tYm9vdGN5Y2xlLWJ1aWxkCisKK0ZSQzogIyBGb3JjZSB0YXJnZXQKZGlmZiAtLWdpdCBhL2NvbW1vbi9tYWtlZmlsZXMvTWFrZUJhc2UuZ21rIGIvY29tbW9uL21ha2VmaWxlcy9NYWtlQmFzZS5nbWsKaW5kZXggZTljYWFhOC4uYzEzOWE3NyAxMDA2NDQKLS0tIGEvY29tbW9uL21ha2VmaWxlcy9NYWtlQmFzZS5nbWsKKysrIGIvY29tbW9uL21ha2VmaWxlcy9NYWtlQmFzZS5nbWsKQEAgLTMzLDEyOSArMzMsMTMgQEAKIGlmbmRlZiBfTUFLRUJBU0VfR01LCiBfTUFLRUJBU0VfR01LIDo9IDEKIAotaWZlcSAoLCQoZmluZHN0cmluZyAzLjgxLCQoTUFLRV9WRVJTSU9OKSkpCi0gICAgaWZlcSAoLCQoZmluZHN0cmluZyAzLjgyLCQoTUFLRV9WRVJTSU9OKSkpCi0gICAgICAgICQoZXJyb3IgVGhpcyB2ZXJzaW9uIG9mIEdOVSBNYWtlIGlzIHRvbyBsb3cgKCQoTUFLRV9WRVJTSU9OKSkuIFBsZWFzZSB1cGdyYWRlIHRvIDMuODEgb3IgbmV3ZXIuKQotICAgIGVuZGlmCi1lbmRpZgotCi1pZm5lcSAoLCQoQ1lHUEFUSCkpCi0gICAgIyBDeWd3aW4gc3R5ZmYsIGlmIG5lZWRlZCBidXQgbW9zdCBpcyBnb2luZyB0byBiZQotICAgICMgZG9uZSBpbiBjb25maWd1cmUhCi0gICAgaWZlcSAoeWVzLCQoQ0hFQ0tfRk9SX1ZDSU5TVEFMTERJUikpCi0gICAgICAgIGlmZXEgKCwkKFZDSU5TVEFMTERJUikpIAotICAgICAgICAgICAgJChpbmZvIENvdWxkIG5vdCBmaW5kIGNvbXBpbGVyIHBhdGhzISkKLSAgICAgICAgICAgICQoaW5mbyBZb3UgcHJvYmFibHkgY29uZmlndXJlZCB0aGUgYnVpbGQgZnJvbSB3aXRoaW4gYSkKLSAgICAgICAgICAgICQoaW5mbyBWUyBjb21tYW5kIHByb21wdCwgYnV0IHlvdSBhcmUgbm90IHVzaW5nIHN1Y2ggYSkKLSAgICAgICAgICAgICQoaW5mbyBwcm9tcHQgcmlnaHQgbm93LikKLSAgICAgICAgICAgICQoaW5mbyBJZiB5b3UgaW5zdGVhZCBydW4gY29uZmlndXJlIGZyb20gYSBwbGFpbiBjeWd3aW4gc2hlbGwsIGl0KQotICAgICAgICAgICAgJChpbmZvIHdpbGwgYXR0ZW1wdCB0byBzZXR1cCBWUyBmb3IgeW91ISBQbGVhc2UgdHJ5IHRoYXQuKQotICAgICAgICAgICAgJChlcnJvciBHaXZpbmcgdXAgZm9yIG5vdy4pCi0gICAgICAgIGVuZGlmCi0gICAgZW5kaWYKLWVuZGlmCi0KLSMgVGhlIGJ1aWxkIHRpbWVzIHJlcG9ydCBpcyB0dXJuZWQgb2ZmIGJ5IHNldHRpbmcgUkVQT1JUX0JVSUxEX1RJTUVTIHRvIG5vdGhpbmcuCi0jIFRoaXMgaXMgbmVjZXNzYXJ5IGZvciB0aGUgdGFyZ2V0IGNsZWFuIHdoaWNoIHdpbGwgZXJhc2UgdGhlCi0jIGRpcmVjdG9yaWVzIHdoZXJlIHRoZSBidWlsZHRpbWVzIGFyZSBzdG9yZWQuCi1SRVBPUlRfQlVJTERfVElNRVM9MQotIyBTdG9yZSB0aGUgYnVpbGQgdGltZXMgaW4gdGhpcyBkaXJlY3RvcnkuCi1CVUlMRFRJTUVTRElSPSQoT1VUUFVUX1JPT1QpL3RtcC9idWlsZHRpbWVzCi0KLSMgUmVjb3JkIHN0YXJ0aW5nIHRpbWUgZm9yIGJ1aWxkIG9mIGEgc3ViIHJlcG9zaXRvcnkuCi1kZWZpbmUgUmVjb3JkU3RhcnRUaW1lCi0kKE1LRElSKSAtcCAkKEJVSUxEVElNRVNESVIpCi0kKERBVEUpICcrJVkgJW0gJWQgJUggJU0gJVMnIHwgJChOQVdLKSAneyBwcmludCAkJDEsJCQyLCQkMywkJDQsJCQ1LCQkNiwoJCQ0KjM2MDArJCQ1KjYwKyQkNikgfScgPiAkKEJVSUxEVElNRVNESVIpL2J1aWxkX3RpbWVfc3RhcnRfJDEKLSQoREFURSkgJyslWS0lbS0lZCAlSDolTTolUycgPiAkKEJVSUxEVElNRVNESVIpL2J1aWxkX3RpbWVfc3RhcnRfJDFfaHVtYW5fcmVhZGFibGUKLWVuZGVmCi0KLSMgSW5kaWNhdGUgdGhhdCB3ZSBzdGFydGVkIHRvIGJ1aWxkIGEgc3ViIHJlcG9zaXRvcnkgYW5kIHJlY29yZCBzdGFydGluZyB0aW1lLiAKLWRlZmluZSBNYWtlU3RhcnQKLSQoY2FsbCBSZWNvcmRTdGFydFRpbWUsJDEpCi0kKEJVSUxEX0xPR19XUkFQUEVSKSAkKFBSSU5URikgIlxuXG4lc1xuJXNcbiMjIyMjICUtNjAuNjBzICMjIyMjXG4lc1xuXG4iIFwKLSIjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMiIFwKLSIjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMiIFwKLSJFbnRlcmluZyAkMSBmb3IgdGFyZ2V0KHMpICQyIiBcCi0iIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIgotZW5kZWYKLQotIyBSZWNvcmQgZW5kaW5nIHRpbWUgYW5kIGNhbGN1bGF0ZSB0aGUgZGlmZmVyZW5jZSBhbmQgc3RvcmUgaXQgaW4gYQotIyBlYXN5IHRvIHJlYWQgZm9ybWF0LiBIYW5kbGVzIGJ1aWxkcyB0aGF0IGNyb3NzIG1pZG5pZ2h0LiBFeHBlY3RzCi0jIHRoYXQgYSBidWlsZCB3aWxsIG5ldmVyIHRha2UgMjQgaG91cnMgb3IgbW9yZS4gCi1kZWZpbmUgUmVjb3JkRW5kVGltZQotJChEQVRFKSAnKyVZICVtICVkICVIICVNICVTJyB8ICQoTkFXSykgJ3sgcHJpbnQgJCQxLCQkMiwkJDMsJCQ0LCQkNSwkJDYsKCQkNCozNjAwKyQkNSo2MCskJDYpIH0nID4gJChCVUlMRFRJTUVTRElSKS9idWlsZF90aW1lX2VuZF8kMQotJChEQVRFKSAnKyVZLSVtLSVkICVIOiVNOiVTJyA+ICQoQlVJTERUSU1FU0RJUikvYnVpbGRfdGltZV9lbmRfJDFfaHVtYW5fcmVhZGFibGUKLSQoRUNITykgYCQoQ0FUKSAkKEJVSUxEVElNRVNESVIpL2J1aWxkX3RpbWVfc3RhcnRfJDFgIGAkKENBVCkgJChCVUlMRFRJTUVTRElSKS9idWlsZF90aW1lX2VuZF8kMWAgJDEgfCBcCi0gICQoTkFXSykgJ3sgRj0kJDc7IFQ9JCQxNDsgaWYgKEYgPiBUKSB7IFQrPTM2MDAqMjQgfTsgRD1ULUY7IEg9aW50KEQvMzYwMCk7IFwKLSAgICAgICAgICAgICBNPWludCgoRC1IKjM2MDApLzYwKTsgUz1ELUgqMzYwMC1NKjYwOyBwcmludGYoIiUwMmQ6JTAyZDolMDJkICVzXG4iLEgsTSxTLCQkMTUpOyB9JyBcCi0gID4gJChCVUlMRFRJTUVTRElSKS9idWlsZF90aW1lX2RpZmZfJDEKLWVuZGVmCi0KLSMgQ2hlY2sgaWYgdGhlIGN1cnJlbnQgdGFyZ2V0IGlzIHRoZSBmaW5hbCB0YXJnZXQsIGFzIHNwZWNpZmllZCBieQotIyB0aGUgdXNlciBvbiB0aGUgY29tbWFuZCBsaW5lLiBJZiBzbywgY2FsbCBQcmludEVuZE1lc3NhZ2UuCi1kZWZpbmUgQ2hlY2tJZkZpbmlzaGVkCi0kKGlmICQoZmlsdGVyICRALCQoTUFLRUNNREdPQUxTKSksJChjYWxsIFByaW50RW5kTWVzc2FnZSkpCi0jIElmIG5vIHRhZ2V0IGlzIGdpdmVuLCAiYWxsIiBpcyBkZWZhdWx0LiBDaGVjayBmb3IgdGhhdCwgdG9vLgotIyBBdCBtb3N0IG9uZSBvZiB0aGUgdGVzdHMgY2FuIGJlIHRydWUuCi0kKGlmICQoTUFLRUNNREdPQUxTKSwsJChpZiAkKGZpbHRlciAkQCxhbGwpLCQoY2FsbCBQcmludEVuZE1lc3NhZ2UpKSkKLWVuZGVmCi0KLSMgSW5kaWNhdGUgdGhhdCB3ZSBhcmUgZG9uZS4KLSMgUmVjb3JkIGVuZGluZyB0aW1lIGFuZCBwcmludCBvdXQgdGhlIHRvdGFsIHRpbWUgaXQgdG9vayB0byBidWlsZC4KLWRlZmluZSBNYWtlRmluaXNoIAotJChpZiAkKFJFUE9SVF9CVUlMRF9USU1FUyksJChjYWxsIFJlY29yZEVuZFRpbWUsJDEpLCkgCi0kKEJVSUxEX0xPR19XUkFQUEVSKSAkKFBSSU5URikgIiVzXG4jIyMjIyAlLTYwLjYwcyAjIyMjI1xuJXNcbiMjIyMjICUtNjAuNjBzICMjIyMjXG4lc1xuXG4iIFwKLSIjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMiIFwKLSJMZWF2aW5nICQxIGZvciB0YXJnZXQocykgJDIiIFwKLSIjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMiIFwKLSQoaWYgJChSRVBPUlRfQlVJTERfVElNRVMpLCJCdWlsZCB0aW1lIGAkKENBVCkgJChCVUlMRFRJTUVTRElSKS9idWlsZF90aW1lX2RpZmZfJDFgIGZvciB0YXJnZXQocykgJDIiLCIiKSBcCi0iIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIgotJChjYWxsIENoZWNrSWZGaW5pc2hlZCkKLWVuZGVmCi0KLSMgRmluZCBhbGwgYnVpbGRfdGltZV8qIGZpbGVzIGFuZCBwcmludCB0aGVpciBjb250ZW50cyBpbiBhIGxpc3Qgc29ydGVkCi0jIG9uIHRoZSBuYW1lIG9mIHRoZSBzdWIgcmVwb3NpdG9yeS4KLWRlZmluZSBSZXBvcnRCdWlsZFRpbWVzCi0kKEJVSUxEX0xPR19XUkFQUEVSKSAkKFBSSU5URikgLS0gIi0tIEJ1aWxkIHRpbWVzIC0tLS0tLS0tLS1cblRhcmdldCAlc1xuU3RhcnQgJXNcbkVuZCAgICVzXG4lc1xuJXNcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIgXAotIiQxIiBcCi0iYCQoQ0FUKSAkKEJVSUxEVElNRVNESVIpL2J1aWxkX3RpbWVfc3RhcnRfVE9UQUxfaHVtYW5fcmVhZGFibGVgIiBcCi0iYCQoQ0FUKSAkKEJVSUxEVElNRVNESVIpL2J1aWxkX3RpbWVfZW5kX1RPVEFMX2h1bWFuX3JlYWRhYmxlYCIgXAotImAkKExTKSAkKEJVSUxEVElNRVNESVIpL2J1aWxkX3RpbWVfZGlmZl8qIHwgJChHUkVQKSAtdiBfVE9UQUwgfCAkKFhBUkdTKSAkKENBVCkgfCAkKFNPUlQpIC1rIDJgIiBcCi0iYCQoQ0FUKSAkKEJVSUxEVElNRVNESVIpL2J1aWxkX3RpbWVfZGlmZl9UT1RBTGAiCi1lbmRlZgotCi1kZWZpbmUgUmVzZXRUaW1lcnMKLSQkKHNoZWxsICQoTUtESVIpIC1wICQoQlVJTERUSU1FU0RJUikgJiYgICQoUk0pICQoQlVJTERUSU1FU0RJUikvYnVpbGRfdGltZV8qKQotZW5kZWYKLQotZGVmaW5lIFN0YXJ0VGltZXIKLQkkKGNhbGwgUmVjb3JkU3RhcnRUaW1lLFRPVEFMKQotZW5kZWYKLQotZGVmaW5lIFN0b3BUaW1lcgotCSQoaWYgJChSRVBPUlRfQlVJTERfVElNRVMpLCQoY2FsbCBSZWNvcmRFbmRUaW1lLFRPVEFMKSAmJiAkKGNhbGwgUmVwb3J0QnVpbGRUaW1lcywkMSksKQotZW5kZWYKLQotIyBIb29rIHRvIGJlIGNhbGxlZCBhcyB0aGUgdmVyeSBmaXJzdCB0aGluZyB3aGVuIHJ1bm5pbmcgYSBub3JtYWwgYnVpbGQKLWRlZmluZSBBdFJvb3RNYWtlU3RhcnQKLQkkKGlmICQoZmluZHN0cmluZyAtLWpvYnNlcnZlciwkKE1BS0VGTEFHUykpLCAkKGVycm9yIG1ha2UgLWogaXMgbm90IHN1cHBvcnRlZCwgdXNlIG1ha2UgSk9CUz1uKSkKLQkkKGNhbGwgUHJpbnRTdGFydE1lc3NhZ2UpCi0JJChjYWxsIFN0YXJ0VGltZXIpCi1lbmRlZgotCi0jIEhvb2sgdG8gYmUgY2FsbGVkIGFzIHRoZSB2ZXJ5IGxhc3QgdGhpbmcgZm9yIHRhcmdldHMgdGhhdCBhcmUgInRvcCBsZXZlbCIgdGFyZ2V0cwotZGVmaW5lIEF0Um9vdE1ha2VFbmQKLQkkKGNhbGwgU3RvcFRpbWVyKQotCSQoY2FsbCBDaGVja0lmRmluaXNoZWQpCi1lbmRlZgotCiAjIElmIHRoZSB2YXJpYWJsZSB0aGF0IHlvdSB3YW50IHRvIHNlbmQgdG8gc3Rkb3V0IGZvciBwaXBpbmcgaW50byBhIGZpbGUgb3Igb3RoZXJ3aXNlLAogIyBpcyBwb3RlbnRpYWxseSBsb25nLCBmb3IgZXhhbXBsZSB0aGUgYSBsaXN0IG9mIGZpbGUgcGF0aHMsIGVnIGEgbGlzdCBvZiBhbGwgcGFja2FnZSBkaXJlY3Rvcmllcy4KICMgVGhlbiB5b3UgbmVlZCB0byB1c2UgTGlzdFBhdGhzU2FmZWx5LCB3aGljaCBvcHRpbWlzdGljYWxseSBzcGxpdHMgdGhlIG91dHB1dCBpbnRvIHNldmVyYWwgc2hlbGwKICMgY2FsbHMgYXMgd2VsbCBhcyB1c2UgY29tcHJlc3Npb24gb24gcmVjdXJyZW50IGZpbGUgcGF0aHMgc2VnbWVudHMsIHRvIGdldCBhcm91bmQgdGhlIHBvdGVudGlhbAogIyBjb21tYW5kIGxpbmUgbGVuZ3RoIHByb2JsZW0gdGhhdCBleGlzdHMgaW4gY3lnd2luIGFuZCBvdGhlciBzaGVsbHMuCi1jb21wcmVzc19wcmU6PSQoc3RyaXAgJChzaGVsbCBjYXQgJChTUkNfUk9PVCkvY29tbW9uL21ha2VmaWxlcy9jb21wcmVzcy5wcmUpKQotY29tcHJlc3NfcG9zdDo9JChzdHJpcCAkKHNoZWxsIGNhdCAkKFNSQ19ST09UKS9jb21tb24vbWFrZWZpbGVzL2NvbXByZXNzLnBvc3QpKQorY29tcHJlc3NfcHJlOj0kKHN0cmlwICQoc2hlbGwgJChDQVQpICQoU1JDX1JPT1QpL2NvbW1vbi9tYWtlZmlsZXMvc3VwcG9ydC9MaXN0UGF0aHNTYWZlbHktcHJlLWNvbXByZXNzLmluY2wpKQorY29tcHJlc3NfcG9zdDo9JChzdHJpcCAkKHNoZWxsICQoQ0FUKSAkKFNSQ19ST09UKS9jb21tb24vbWFrZWZpbGVzL3N1cHBvcnQvTGlzdFBhdGhzU2FmZWx5LXBvc3QtY29tcHJlc3MuaW5jbCkpCiBjb21wcmVzc19wYXRocz0kKGNvbXByZXNzX3ByZSlcCiAkKHN1YnN0ICQoU1JDX1JPT1QpLFg5NyxcCiAkKHN1YnN0ICQoT1VUUFVUX1JPT1QpLFg5OCxcCkBAIC0xNjMsNyArNDcsNyBAQAogJChzdWJzdCAkKFNQQUNFKSxcbiwkKHN0cmlwICQxKSkpKSlcCiAkKGNvbXByZXNzX3Bvc3QpCiAKLWRlY29tcHJlc3NfcGF0aHM9c2VkIC1mICQoU1JDX1JPT1QpL2NvbW1vbi9tYWtlZmlsZXMvdW5jb21wcmVzcy5zZWQgLWUgJ3N8WDk5fFxcbnxnJyBcCitkZWNvbXByZXNzX3BhdGhzPSQoU0VEKSAtZiAkKFNSQ19ST09UKS9jb21tb24vbWFrZWZpbGVzL3N1cHBvcnQvTGlzdFBhdGhzU2FmZWx5LXVuY29tcHJlc3Muc2VkIC1lICdzfFg5OXxcXG58ZycgXAogCQkgICAgIC1lICdzfFg5OHwkKE9VVFBVVF9ST09UKXxnJyAtZSAnc3xYOTd8JChTUkNfUk9PVCl8ZycgXAogCQkgICAgIC1lICdzfFgwMHxYfGcnIHwgdHIgJ1xuJyAnJDInCiAKQEAgLTM4NCwxNCArMjY4LDY3IEBACiBlbmRlZgogCiBkZWZpbmUgU2V0dXBMb2dnaW5nCi0gICAgaWZuZXEgKCQoZmluZHN0cmluZyAkKExPRyksZGVidWcgdHJhY2UpLCkKKyAgICBpZmVxICgkJChMT0cpLCB0cmFjZSkKICAgICAgICAgIyBTaGVsbCByZWRlZmluaXRpb24gdHJpY2sgaW5zcGlyZWQgYnkgaHR0cDovL3d3dy5jbWNyb3Nzcm9hZHMuY29tL2Fzay1tci1tYWtlLzY1MzUtdHJhY2luZy1ydWxlLWV4ZWN1dGlvbi1pbi1nbnUtbWFrZQorICAgICAgICAjIEZvciBlYWNoIHRhcmdldCBleGVjdXRlZCwgd2lsbCBwcmludAorICAgICAgICAjIEJ1aWxkaW5nIDxUQVJHRVQ+IChmcm9tIDxGSVJTVCBQUkVSRVFVSVNJVEU+KSAoPEFMTCBORVdFUiBQUkVSRVFVSVNJVEVTPiBuZXdlcikKKyAgICAgICAgIyBidXQgd2l0aCBhIGxpbWl0IG9mIDIwIG9uIDxBTEwgTkVXRVIgUFJFUkVRVUlTSVRFUz4sIHRvIGF2b2lkIGNsdXR0ZXJpbmcgbG9ncyB0b28gbXVjaCAoYW5kIGNhdXNpbmcgYSBjcmFzaCBvbiBDeWd3aW4pLgogICAgICAgICBPTERfU0hFTEw6PSQkKFNIRUxMKQotICAgICAgICBTSEVMTCA9ICQkKHdhcm5pbmcgQnVpbGRpbmcgJCRAJCQoaWYgJCQ8LCAoZnJvbSAkJDwpKSQoaWYgJCQ/LCAoJCQ/IG5ld2VyKSkpJCQoT0xEX1NIRUxMKSAteAorICAgICAgICBXUkFQUEVSX1NIRUxMOj0kJChPTERfU0hFTEwpICQkKFNSQ19ST09UKS9jb21tb24vYmluL3NoZWxsLXRyYWNlci5zaCAkJChpZiAkJChUSU1FKSwkJChUSU1FKSwtKSAkJChPVVRQVVRfUk9PVCkvYnVpbGQtdHJhY2UtdGltZS5sb2cgJCQoT0xEX1NIRUxMKQorICAgICAgICBTSEVMTD0kJCh3YXJuaW5nICQkKGlmICQkQCxCdWlsZGluZyAkJEAsUnVubmluZyBzaGVsbCBjb21tYW5kKSAkJChpZiAkJDwsIChmcm9tICQkPCkpJCQoaWYgJCQ/LCAoJCQod29yZGxpc3QgMSwgMjAsICQkPykgJCQoaWYgJCQod29yZGxpc3QgMjEsIDIyLCAkJD8pLCAuLi4gW2luIHRvdGFsICQkKHdvcmRzICQkPykgZmlsZXNdKSBuZXdlcikpKSQkKFdSQVBQRVJfU0hFTEwpCisgICAgZW5kaWYKKyAgICAjIE5ldmVyIHJlbW92ZSB3YXJuaW5nIG1lc3NhZ2VzOyB0aGlzIGlzIGp1c3QgZm9yIGNvbXBsZXRlbmVzcworICAgIExPR19XQVJOPSAKKyAgICBpZm5lcSAoJCQoZmluZHN0cmluZyAkJChMT0cpLGluZm8gZGVidWcgdHJhY2UpLCkKKyAgICAgICAgTE9HX0lORk89CisgICAgZWxzZQorICAgICAgICBMT0dfSU5GTz0+IC9kZXYvbnVsbAorICAgIGVuZGlmCisgICAgaWZuZXEgKCQkKGZpbmRzdHJpbmcgJCQoTE9HKSxkZWJ1ZyB0cmFjZSksKQorICAgICAgICBMT0dfREVCVUc9CisgICAgZWxzZQorICAgICAgICBMT0dfREVCVUc9PiAvZGV2L251bGwKKyAgICBlbmRpZgorICAgIGlmbmVxICgkJChmaW5kc3RyaW5nICQkKExPRyksdHJhY2UpLCkKKyAgICAgICAgTE9HX1RSQUNFPQorICAgIGVsc2UKKyAgICAgICAgTE9HX1RSQUNFPT4gL2Rldi9udWxsCiAgICAgZW5kaWYKIGVuZGVmCiAKICMgTWFrZSBzdXJlIGxvZ2dpbmcgaXMgc2V0dXAgZm9yIGV2ZXJ5b25lIHRoYXQgaW5jbHVkZXMgTWFrZUJhc2UuZ21rLgogJChldmFsICQoY2FsbCBTZXR1cExvZ2dpbmcpKQogCisjIFRoaXMgaXMgdG8gYmUgY2FsbGVkIGJ5IGFsbCBTZXR1cEZvbyBtYWNyb3MKK2RlZmluZSBMb2dTZXR1cE1hY3JvRW50cnkKKyAgICAkKGlmICQoMjYpLCQoZXJyb3IgSW50ZXJuYWwgbWFrZWZpbGUgZXJyb3I6IFRvbyBtYW55IGFyZ3VtZW50cyB0byBMb2dTZXR1cE1hY3JvRW50cnksIHBsZWFzZSB1cGRhdGUgTWFrZUJhc2UuZ21rKSkKKyAgICAkKGlmICQoZmluZHN0cmluZyAkKExPRyksZGVidWcgdHJhY2UpLCAkKGluZm8gJDEgJChmb3JlYWNoIGksMiAzIDQgNSA2IDcgOCA5IDEwIDExIDEyIDEzIDE0IDE1IDE2IDE3IDE4IDE5IDIwIDIxIDIyIDIzIDI0IDI1LCQoaWYgJCgkaSksJChORVdMSU5FKSAkKHN0cmlwIFskaV0gJCgkaSkpKSkpKQorZW5kZWYKKworIyBNYWtlIGRpcmVjdG9yeSB3aXRob3V0IGZvcmtpbmcgbWtkaXIgaWYgbm90IG5lZWRlZAorZGVmaW5lIE1ha2VEaXIKKyAgICBpZm5lcSAoJCQod2lsZGNhcmQgJDEgJDIgJDMgJDQgJDUgJDYgJDcgJDggJDkpLCQkKHN0cmlwICQxICQyICQzICQ0ICQ1ICQ2ICQ3ICQ4ICQ5KSkKKyAgICAgICAgJCQoc2hlbGwgJChNS0RJUikgLXAgJDEgJDIgJDMgJDQgJDUgJDYgJDcgJDggJDkpCisgICAgZW5kaWYKK2VuZGVmCisKK2lmZXEgKCQoT1BFTkpES19UQVJHRVRfT1MpLHNvbGFyaXMpCisjIE9uIFNvbGFyaXMsIGlmIHRoZSB0YXJnZXQgaXMgYSBzeW1saW5rIGFuZCBleGlzdHMsIGNwIHdvbid0IG92ZXJ3cml0ZS4KK2RlZmluZSBpbnN0YWxsLWZpbGUKKwkkKE1LRElSKSAtcCAkKEBEKQorCSQoUk0pICckQCcKKwkkKENQKSAtZiAtciAtUCAnJDwnICckKEBEKScKK2VuZGVmCitlbHNlIGlmZXEgKCQoT1BFTkpES19UQVJHRVRfT1MpLG1hY29zeCkKK2RlZmluZSBpbnN0YWxsLWZpbGUKKwkkKE1LRElSKSAtcCAkKEBEKQorCSQoQ1ApIC1mcFJQICckPCcgJyRAJworZW5kZWYKK2Vsc2UKK2RlZmluZSBpbnN0YWxsLWZpbGUKKwkkKE1LRElSKSAtcCAkKEBEKQorCSQoQ1ApIC1mUCAnJDwnICckQCcKK2VuZGVmCitlbmRpZgorCiBlbmRpZiAjIF9NQUtFQkFTRV9HTUsKZGlmZiAtLWdpdCBhL2NvbW1vbi9tYWtlZmlsZXMvTWFrZUhlbHBlcnMuZ21rIGIvY29tbW9uL21ha2VmaWxlcy9NYWtlSGVscGVycy5nbWsKaW5kZXggZWY4NDQ2My4uOTkxMDMxMSAxMDA2NDQKLS0tIGEvY29tbW9uL21ha2VmaWxlcy9NYWtlSGVscGVycy5nbWsKKysrIGIvY29tbW9uL21ha2VmaWxlcy9NYWtlSGVscGVycy5nbWsKQEAgLTQ1LDEzICs0NSwxMzAgQEAKIGxpc3RfYWx0X292ZXJyaWRlc193aXRoX29yaWdpbnM9JChmaWx0ZXIgQUxUXyU9ZW52aXJvbm1lbnQgQUxUXyU9Y29tbWFuZCwkKGZvcmVhY2ggdmFyLCQoLlZBUklBQkxFUyksJCh2YXIpPSQoZmlyc3R3b3JkICQob3JpZ2luICQodmFyKSkpKSkKIGxpc3RfYWx0X292ZXJyaWRlcz0kKHN1YnN0ID1jb21tYW5kLCwkKHN1YnN0ID1lbnZpcm9ubWVudCwsJChsaXN0X2FsdF9vdmVycmlkZXNfd2l0aF9vcmlnaW5zKSkpCiAKKyMgU3RvcmUgdGhlIGJ1aWxkIHRpbWVzIGluIHRoaXMgZGlyZWN0b3J5LgorQlVJTERUSU1FU0RJUj0kKE9VVFBVVF9ST09UKS90bXAvYnVpbGR0aW1lcworCisjIEdsb2JhbCB0YXJnZXRzIGFyZSBwb3NzaWJsZSB0byBydW4gZWl0aGVyIHdpdGggb3Igd2l0aG91dCBhIFNQRUMuIFRoZSBwcm90b3R5cGljYWwKKyMgZ2xvYmFsIHRhcmdldCBpcyAiaGVscCIuIAorZ2xvYmFsX3RhcmdldHM9aGVscCBjb25maWd1cmUKKwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIEZ1bmN0aW9ucwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKLWRlZmluZSBmYXRhbC1lcnJvcgorZGVmaW5lIENoZWNrRW52aXJvbm1lbnQKKyAgICAjIEZpbmQgYWxsIGVudmlyb25tZW50IG9yIGNvbW1hbmQgbGluZSB2YXJpYWJsZXMgdGhhdCBiZWdpbiB3aXRoIEFMVC4KKyAgICAkKGlmICQobGlzdF9hbHRfb3ZlcnJpZGVzKSwKKyAgICAgICAgQCQoUFJJTlRGKSAiXG5XQVJOSU5HOiBZb3UgaGF2ZSB0aGUgZm9sbG93aW5nIEFMVF8gdmFyaWFibGVzIHNldDpcbiIKKyAgICBAJChQUklOVEYpICIkKGZvcmVhY2ggdmFyLCQobGlzdF9hbHRfb3ZlcnJpZGVzKSwkKHZhcik9JCQkKHZhcikpXG4iCisgICAgQCQoUFJJTlRGKSAiQUxUXyB2YXJpYWJsZXMgYXJlIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgaWdub3JlZC4gUGxlYXNlIGNsZWFuIHlvdXIgZW52aXJvbm1lbnQuXG5cbiIKKyAgICApCitlbmRlZgorCisjIyMgRnVuY3Rpb25zIGZvciB0aW1lcnMKKworIyBSZWNvcmQgc3RhcnRpbmcgdGltZSBmb3IgYnVpbGQgb2YgYSBzdWIgcmVwb3NpdG9yeS4KK2RlZmluZSBSZWNvcmRTdGFydFRpbWUKKyAgICAkKE1LRElSKSAtcCAkKEJVSUxEVElNRVNESVIpCisgICAgJChEQVRFKSAnKyVZICVtICVkICVIICVNICVTJyB8ICQoTkFXSykgJ3sgcHJpbnQgJCQxLCQkMiwkJDMsJCQ0LCQkNSwkJDYsKCQkNCozNjAwKyQkNSo2MCskJDYpIH0nID4gJChCVUlMRFRJTUVTRElSKS9idWlsZF90aW1lX3N0YXJ0XyQxCisgICAgJChEQVRFKSAnKyVZLSVtLSVkICVIOiVNOiVTJyA+ICQoQlVJTERUSU1FU0RJUikvYnVpbGRfdGltZV9zdGFydF8kMV9odW1hbl9yZWFkYWJsZQorZW5kZWYKKworIyBSZWNvcmQgZW5kaW5nIHRpbWUgYW5kIGNhbGN1bGF0ZSB0aGUgZGlmZmVyZW5jZSBhbmQgc3RvcmUgaXQgaW4gYQorIyBlYXN5IHRvIHJlYWQgZm9ybWF0LiBIYW5kbGVzIGJ1aWxkcyB0aGF0IGNyb3NzIG1pZG5pZ2h0LiBFeHBlY3RzCisjIHRoYXQgYSBidWlsZCB3aWxsIG5ldmVyIHRha2UgMjQgaG91cnMgb3IgbW9yZS4gCitkZWZpbmUgUmVjb3JkRW5kVGltZQorICAgICQoREFURSkgJyslWSAlbSAlZCAlSCAlTSAlUycgfCAkKE5BV0spICd7IHByaW50ICQkMSwkJDIsJCQzLCQkNCwkJDUsJCQ2LCgkJDQqMzYwMCskJDUqNjArJCQ2KSB9JyA+ICQoQlVJTERUSU1FU0RJUikvYnVpbGRfdGltZV9lbmRfJDEKKyAgICAkKERBVEUpICcrJVktJW0tJWQgJUg6JU06JVMnID4gJChCVUlMRFRJTUVTRElSKS9idWlsZF90aW1lX2VuZF8kMV9odW1hbl9yZWFkYWJsZQorICAgICQoRUNITykgYCQoQ0FUKSAkKEJVSUxEVElNRVNESVIpL2J1aWxkX3RpbWVfc3RhcnRfJDFgIGAkKENBVCkgJChCVUlMRFRJTUVTRElSKS9idWlsZF90aW1lX2VuZF8kMWAgJDEgfCBcCisgICAgICAgICQoTkFXSykgJ3sgRj0kJDc7IFQ9JCQxNDsgaWYgKEYgPiBUKSB7IFQrPTM2MDAqMjQgfTsgRD1ULUY7IEg9aW50KEQvMzYwMCk7IFwKKyAgICAgICAgTT1pbnQoKEQtSCozNjAwKS82MCk7IFM9RC1IKjM2MDAtTSo2MDsgcHJpbnRmKCIlMDJkOiUwMmQ6JTAyZCAlc1xuIixILE0sUywkJDE1KTsgfScgXAorICAgICAgICA+ICQoQlVJTERUSU1FU0RJUikvYnVpbGRfdGltZV9kaWZmXyQxCitlbmRlZgorCisjIEZpbmQgYWxsIGJ1aWxkX3RpbWVfKiBmaWxlcyBhbmQgcHJpbnQgdGhlaXIgY29udGVudHMgaW4gYSBsaXN0IHNvcnRlZAorIyBvbiB0aGUgbmFtZSBvZiB0aGUgc3ViIHJlcG9zaXRvcnkuCitkZWZpbmUgUmVwb3J0QnVpbGRUaW1lcworICAgICQoQlVJTERfTE9HX1dSQVBQRVIpICQoUFJJTlRGKSAtLSAiLS0tLS0gQnVpbGQgdGltZXMgLS0tLS0tLVxuU3RhcnQgJXNcbkVuZCAgICVzXG4lc1xuJXNcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIgXAorICAgICAgICAiYCQoQ0FUKSAkKEJVSUxEVElNRVNESVIpL2J1aWxkX3RpbWVfc3RhcnRfVE9UQUxfaHVtYW5fcmVhZGFibGVgIiBcCisgICAgICAgICJgJChDQVQpICQoQlVJTERUSU1FU0RJUikvYnVpbGRfdGltZV9lbmRfVE9UQUxfaHVtYW5fcmVhZGFibGVgIiBcCisgICAgICAgICJgJChMUykgJChCVUlMRFRJTUVTRElSKS9idWlsZF90aW1lX2RpZmZfKiB8ICQoR1JFUCkgLXYgX1RPVEFMIHwgJChYQVJHUykgJChDQVQpIHwgJChTT1JUKSAtayAyYCIgXAorICAgICAgICAiYCQoQ0FUKSAkKEJVSUxEVElNRVNESVIpL2J1aWxkX3RpbWVfZGlmZl9UT1RBTGAiCitlbmRlZgorCitkZWZpbmUgUmVzZXRBbGxUaW1lcnMKKyAgICAkJChzaGVsbCAkKE1LRElSKSAtcCAkKEJVSUxEVElNRVNESVIpICYmICAkKFJNKSAkKEJVSUxEVElNRVNESVIpL2J1aWxkX3RpbWVfKikKK2VuZGVmCisKK2RlZmluZSBTdGFydEdsb2JhbFRpbWVyCisgICAgJChjYWxsIFJlY29yZFN0YXJ0VGltZSxUT1RBTCkKK2VuZGVmCisKK2RlZmluZSBTdG9wR2xvYmFsVGltZXIKKyAgICAkKGNhbGwgUmVjb3JkRW5kVGltZSxUT1RBTCkKK2VuZGVmCisKKyMjIyBGdW5jdGlvbnMgZm9yIG1hbmFnaW5nIG1ha2VmaWxlIHN0cnVjdHVyZSAoc3RhcnQvZW5kIG9mIG1ha2VmaWxlIGFuZCBpbmRpdmlkdWFsIHRhcmdldHMpCisKKyMgRG8gbm90IGluZGVudCB0aGlzIGZ1bmN0aW9uLCB0aGlzIHdpbGwgYWRkIHdoaXRlc3BhY2UgYXQgdGhlIHN0YXJ0IHdoaWNoIHRoZSBjYWxsZXIgd29uJ3QgaGFuZGxlCitkZWZpbmUgR2V0UmVhbFRhcmdldAorJChzdHJpcCAkKGlmICQoTUFLRUNNREdPQUxTKSwkKE1BS0VDTURHT0FMUyksYWxsKSkKK2VuZGVmCisKKyMgRG8gbm90IGluZGVudCB0aGlzIGZ1bmN0aW9uLCB0aGlzIHdpbGwgYWRkIHdoaXRlc3BhY2UgYXQgdGhlIHN0YXJ0IHdoaWNoIHRoZSBjYWxsZXIgd29uJ3QgaGFuZGxlCitkZWZpbmUgTGFzdEdvYWwKKyQoc3RyaXAgJChsYXN0d29yZCAkKGNhbGwgR2V0UmVhbFRhcmdldCkpKQorZW5kZWYKKworIyBDaGVjayBpZiB0aGUgY3VycmVudCB0YXJnZXQgaXMgdGhlIGZpbmFsIHRhcmdldCwgYXMgc3BlY2lmaWVkIGJ5CisjIHRoZSB1c2VyIG9uIHRoZSBjb21tYW5kIGxpbmUuIElmIHNvLCBjYWxsIEF0Um9vdE1ha2VFbmQuCitkZWZpbmUgQ2hlY2tJZk1ha2VBdEVuZAorICAgICMgQ2hlY2sgaWYgdGhlIGN1cnJlbnQgdGFyZ2V0IGlzIHRoZSBsYXN0IGdvYWwKKyAgICAkKGlmICQoZmlsdGVyICRALCQoY2FsbCBMYXN0R29hbCkpLCQoY2FsbCBBdE1ha2VFbmQpKQorICAgICMgSWYgdGhlIHRhcmdldCBpcyAnZm9vLW9ubHknLCBjaGVjayBpZiBvdXIgZ29hbCB3YXMgc3RhdGVkIGFzICdmb28nCisgICAgJChpZiAkKGZpbHRlciAkKHBhdHN1YnN0ICUtb25seSwlLCRAKSwkKGNhbGwgTGFzdEdvYWwpKSwkKGNhbGwgQXRNYWtlRW5kKSkKKyAgICAjIElmIG5vIGdvYWwgaXMgZ2l2ZW4sICdhbGwnIGlzIGRlZmF1bHQsIGJ1dCB0aGUgbGFzdCB0YXJnZXQgZXhlY3V0ZWQgZm9yIGFsbCBpcyAnamRrLW9ubHknLiBDaGVjayBmb3IgdGhhdCwgdG9vLgorICAgICMgQXQgbW9zdCBvbmUgb2YgdGhlIHRlc3RzIGNhbiBiZSB0cnVlLgorICAgICQoaWYgJChzdWJzdCBhbGwsLCQoY2FsbCBMYXN0R29hbCkpLCwkKGlmICQoZmlsdGVyICRALGpkay1vbmx5KSwkKGNhbGwgQXRNYWtlRW5kKSkpCitlbmRlZgorCisjIEhvb2sgdG8gYmUgY2FsbGVkIHdoZW4gc3RhcnRpbmcgdG8gZXhlY3V0ZSBhIHRvcC1sZXZlbCB0YXJnZXQKK2RlZmluZSBUYXJnZXRFbnRlcgorICAgICQoQlVJTERfTE9HX1dSQVBQRVIpICQoUFJJTlRGKSAiIyMgU3RhcnRpbmcgJChwYXRzdWJzdCAlLW9ubHksJSwkQClcbiIKKyAgICAkKGNhbGwgUmVjb3JkU3RhcnRUaW1lLCQocGF0c3Vic3QgJS1vbmx5LCUsJEApKQorZW5kZWYKKworIyBIb29rIHRvIGJlIGNhbGxlZCB3aGVuIGZpbmlzaCBleGVjdXRpbmcgYSB0b3AtbGV2ZWwgdGFyZ2V0CitkZWZpbmUgVGFyZ2V0RXhpdAorICAgICQoY2FsbCBSZWNvcmRFbmRUaW1lLCQocGF0c3Vic3QgJS1vbmx5LCUsJEApKQorICAgICQoQlVJTERfTE9HX1dSQVBQRVIpICQoUFJJTlRGKSAiIyMgRmluaXNoZWQgJChwYXRzdWJzdCAlLW9ubHksJSwkQCkgKGJ1aWxkIHRpbWUgJXMpXG5cbiIgXAorICAgICAgICAiYCQoQ0FUKSAkKEJVSUxEVElNRVNESVIpL2J1aWxkX3RpbWVfZGlmZl8kKHBhdHN1YnN0ICUtb25seSwlLCRAKSB8ICQoQ1VUKSAtZiAxIC1kICIgImAiCisgICAgJChjYWxsIENoZWNrSWZNYWtlQXRFbmQpCitlbmRlZgorCisjIEhvb2sgdG8gYmUgY2FsbGVkIGFzIHRoZSB2ZXJ5IGZpcnN0IHRoaW5nIHdoZW4gcnVubmluZyBhIG5vcm1hbCBidWlsZAorZGVmaW5lIEF0TWFrZVN0YXJ0CisgICAgJChpZiAkKGZpbmRzdHJpbmcgLS1qb2JzZXJ2ZXIsJChNQUtFRkxBR1MpKSwkKGVycm9yIG1ha2UgLWogaXMgbm90IHN1cHBvcnRlZCwgdXNlIG1ha2UgSk9CUz1uKSkKKyAgICAkKGNhbGwgQ2hlY2tFbnZpcm9ubWVudCkKKyAgICBAJChQUklOVEYpICQoTE9HX0lORk8pICJSdW5uaW5nIG1ha2UgYXMgJyQoTUFLRSkgJChNRkxBR1MpICQoTUFLRV9BUkdTKSdcbiIKKyAgICBAJChQUklOVEYpICJCdWlsZGluZyAkKFBST0RVQ1RfTkFNRSkgZm9yIHRhcmdldCAnJChjYWxsIEdldFJlYWxUYXJnZXQpJyBpbiBjb25maWd1cmF0aW9uICckKENPTkZfTkFNRSknXG5cbiIKKyAgICAkKGNhbGwgU3RhcnRHbG9iYWxUaW1lcikKK2VuZGVmCisKKyMgSG9vayB0byBiZSBjYWxsZWQgYXMgdGhlIHZlcnkgbGFzdCB0aGluZyBmb3IgdGFyZ2V0cyB0aGF0IGFyZSAidG9wIGxldmVsIiB0YXJnZXRzCitkZWZpbmUgQXRNYWtlRW5kCisgICAgJChpZiAkKFNKQVZBQ19TRVJWRVJfRElSKSxAJChSTSkgLXJmICQoU0pBVkFDX1NFUlZFUl9ESVIpLyoucG9ydCkKKyAgICAkKGNhbGwgU3RvcEdsb2JhbFRpbWVyKQorICAgICQoY2FsbCBSZXBvcnRCdWlsZFRpbWVzKQorICAgIEAkKFBSSU5URikgIkZpbmlzaGVkIGJ1aWxkaW5nICQoUFJPRFVDVF9OQU1FKSBmb3IgdGFyZ2V0ICckKGNhbGwgR2V0UmVhbFRhcmdldCknXG4iCisgICAgJChjYWxsIENoZWNrRW52aXJvbm1lbnQpCitlbmRlZgorCisjIyMgRnVuY3Rpb25zIGZvciBwYXJzaW5nIGFuZCBzZXR0aW5nIHVwIG1ha2Ugb3B0aW9ucyBmcm9tIGNvbW1hbmQtbGluZQorCitkZWZpbmUgRmF0YWxFcnJvcgogICAgICMgSWYgdGhlIHVzZXIgc3BlY2lmaWNlZCBhICJnbG9iYWwiIHRhcmdldCAoZS5nLiAnaGVscCcpLCBkbyBub3QgZXhpdCBidXQgY29udGludWUgcnVubmluZwotICAgICQkKGlmICQkKGZpbmRzdHJpbmcgaGVscCwkJChNQUtFQ01ER09BTFMpKSwsJCQoZXJyb3IgQ2Fubm90IGNvbnRpbnVlKSkKKyAgICAkJChpZiAkJChmaWx0ZXItb3V0ICQoZ2xvYmFsX3RhcmdldHMpLCQkKGNhbGwgR2V0UmVhbFRhcmdldCkpLCQkKGVycm9yIENhbm5vdCBjb250aW51ZSkpCiBlbmRlZgogCiBkZWZpbmUgUGFyc2VMb2dMZXZlbApAQCAtODAsMTQgKzE5NywxNCBAQAogICAgICAgICBpZmVxICgkJChMT0cpLHdhcm4pCiAgICAgICAgICAgICBWRVJCT1NFPS1zCiAgICAgICAgIGVsc2UgaWZlcSAoJCQoTE9HKSxpbmZvKQotICAgICAgICAgICAgVkVSQk9TRT0KKyAgICAgICAgICAgIFZFUkJPU0U9LXMKICAgICAgICAgZWxzZSBpZmVxICgkJChMT0cpLGRlYnVnKQogICAgICAgICAgICAgVkVSQk9TRT0KICAgICAgICAgZWxzZSBpZmVxICgkJChMT0cpLHRyYWNlKQotICAgICAgICAgICAgVkVSQk9TRT0tZCAtcAorICAgICAgICAgICAgVkVSQk9TRT0KICAgICAgICAgZWxzZQogICAgICAgICAgICAgJCQoaW5mbyBFcnJvcjogTE9HIG11c3QgYmUgb25lIG9mOiB3YXJuLCBpbmZvLCBkZWJ1ZyBvciB0cmFjZS4pCi0gICAgICAgICAgICAkJChldmFsICQkKGNhbGwgZmF0YWwtZXJyb3IpKQorICAgICAgICAgICAgJCQoZXZhbCAkJChjYWxsIEZhdGFsRXJyb3IpKQogICAgICAgICBlbmRpZgogICAgIGVsc2UKICAgICAgICAgaWZuZXEgKCQkKExPRyksKQpAQCAtOTUsMTA4ICsyMTIsODQgQEAKICAgICAgICAgICAgICMgYnV0IGNvbXBsYWluIGlmIHRoaXMgaXMgdGhlIHRvcC1sZXZlbCBtYWtlIGNhbGwuCiAgICAgICAgICAgICBpZmVxICgkJChNQUtFTEVWRUwpLDApCiAgICAgICAgICAgICAgICAgJCQoaW5mbyBDYW5ub3QgdXNlIExPRz0kJChMT0cpIGFuZCBWRVJCT1NFPSQkKFZFUkJPU0UpIGF0IHRoZSBzYW1lIHRpbWUuIENob29zZSBvbmUuKQotICAgICAgICAgICAgICAgICQkKGV2YWwgJCQoY2FsbCBmYXRhbC1lcnJvcikpCisgICAgICAgICAgICAgICAgJCQoZXZhbCAkJChjYWxsIEZhdGFsRXJyb3IpKQogICAgICAgICAgICAgZW5kaWYKICAgICAgICAgZW5kaWYKICAgICBlbmRpZgogZW5kZWYKIAotIyBUT0RPOiBGaXggZHVwbGljYXRpb24gaW4gTWFrZUJhc2UuZ21rCi1kZWZpbmUgU2V0dXBMb2dnaW5nCi0gICAgaWZuZXEgKCQoZmluZHN0cmluZyAkKExPRyksZGVidWcgdHJhY2UpLCkKLSAgICAgICAgIyBTaGVsbCByZWRlZmluaXRpb24gdHJpY2sgaW5zcGlyZWQgYnkgaHR0cDovL3d3dy5jbWNyb3Nzcm9hZHMuY29tL2Fzay1tci1tYWtlLzY1MzUtdHJhY2luZy1ydWxlLWV4ZWN1dGlvbi1pbi1nbnUtbWFrZQotICAgICAgICBPTERfU0hFTEw6PSQkKFNIRUxMKQotICAgICAgICBTSEVMTCA9ICQkKHdhcm5pbmcgQnVpbGRpbmcgJCRAJCQoaWYgJCQ8LCAoZnJvbSAkJDwpKSQoaWYgJCQ/LCAoJCQ/IG5ld2VyKSkpJCQoT0xEX1NIRUxMKSAteAotICAgIGVuZGlmCi1lbmRlZgotCiBkZWZpbmUgUGFyc2VDb25mQW5kU3BlYwotICAgIGlmbmVxICgkJChvcmlnaW4gU1BFQyksdW5kZWZpbmVkKQotICAgICAgICAjIFdlIGhhdmUgYmVlbiBnaXZlbiBhIFNQRUMsIGNoZWNrIHRoYXQgaXQgd29ya3Mgb3V0IHByb3Blcmx5Ci0gICAgICAgIGlmZXEgKCQkKHdpbGRjYXJkICQkKFNQRUMpKSwpCi0gICAgICAgICAgICAkJChpbmZvIENhbm5vdCBsb2NhdGUgc3BlYy5nbWssIGdpdmVuIGJ5IFNQRUM9JCQoU1BFQykpCi0gICAgICAgICAgICAkJChldmFsICQkKGNhbGwgZmF0YWwtZXJyb3IpKQotICAgICAgICBlbmRpZgotICAgICAgICBpZm5lcSAoJCQob3JpZ2luIENPTkYpLHVuZGVmaW5lZCkKLSAgICAgICAgICAgICMgV2UgYWxzbyBoYXZlIGEgQ09ORiBhcmd1bWVudC4gVGhpcyBpcyBPSyBvbmx5IGlmIHRoaXMgaXMgYSByZXBlYXRlZCBjYWxsIGJ5IG91cnNlbHZlcywKLSAgICAgICAgICAgICMgYnV0IGNvbXBsYWluIGlmIHRoaXMgaXMgdGhlIHRvcC1sZXZlbCBtYWtlIGNhbGwuCi0gICAgICAgICAgICBpZmVxICgkJChNQUtFTEVWRUwpLDApCi0gICAgICAgICAgICAgICAgJCQoaW5mbyBDYW5ub3QgdXNlIENPTkY9JCQoQ09ORikgYW5kIFNQRUM9JCQoU1BFQykgYXQgdGhlIHNhbWUgdGltZS4gQ2hvb3NlIG9uZS4pCi0gICAgICAgICAgICAgICAgJCQoZXZhbCAkJChjYWxsIGZhdGFsLWVycm9yKSkKKyAgICBpZm5lcSAoJCQoZmlsdGVyLW91dCAkKGdsb2JhbF90YXJnZXRzKSwkJChjYWxsIEdldFJlYWxUYXJnZXQpKSwpCisgICAgICAgICMgSWYgd2Ugb25seSBoYXZlIGdsb2JhbCB0YXJnZXRzLCBubyBuZWVkIHRvIGJvdGhlciB3aXRoIFNQRUMgb3IgQ09ORgorICAgICAgICBpZm5lcSAoJCQob3JpZ2luIFNQRUMpLHVuZGVmaW5lZCkKKyAgICAgICAgICAgICMgV2UgaGF2ZSBiZWVuIGdpdmVuIGEgU1BFQywgY2hlY2sgdGhhdCBpdCB3b3JrcyBvdXQgcHJvcGVybHkKKyAgICAgICAgICAgIGlmZXEgKCQkKHdpbGRjYXJkICQkKFNQRUMpKSwpCisgICAgICAgICAgICAgICAgJCQoaW5mbyBDYW5ub3QgbG9jYXRlIHNwZWMuZ21rLCBnaXZlbiBieSBTUEVDPSQkKFNQRUMpKQorICAgICAgICAgICAgICAgICQkKGV2YWwgJCQoY2FsbCBGYXRhbEVycm9yKSkKICAgICAgICAgICAgIGVuZGlmCi0gICAgICAgIGVuZGlmCi0gICAgICAgICMgLi4uIE9LLCB3ZSdyZSBzYXRpc2ZpZWQsIHdlJ2xsIHVzZSB0aGlzIFNQRUMgbGF0ZXIgb24KLSAgICBlbHNlCi0gICAgICAgICMgRmluZCBhbGwgc3BlYy5nbWsgZmlsZXMgaW4gdGhlIGJ1aWxkIG91dHB1dCBkaXJlY3RvcnkKLSAgICAgICAgb3V0cHV0X2Rpcj0kJChyb290X2RpcikvYnVpbGQKLSAgICAgICAgYWxsX3NwZWNfZmlsZXM9JCQod2lsZGNhcmQgJCQob3V0cHV0X2RpcikvKi9zcGVjLmdtaykKLSAgICAgICAgaWZlcSAoJCQoYWxsX3NwZWNfZmlsZXMpLCkKLSAgICAgICAgICAgICQkKGluZm8gTm8gY29uZmlndXJhdGlvbnMgZm91bmQgZm9yICQkKHJvb3RfZGlyKSEgUGxlYXNlIHJ1biBjb25maWd1cmUgdG8gY3JlYXRlIGEgY29uZmlndXJhdGlvbi4pCi0gICAgICAgICAgICAkJChldmFsICQkKGNhbGwgZmF0YWwtZXJyb3IpKQotICAgICAgICBlbmRpZgotICAgICAgICAjIEV4dHJhY3QgdGhlIGNvbmZpZ3VyYXRpb24gbmFtZXMgZnJvbSB0aGUgcGF0aAotICAgICAgICBhbGxfY29uZnM9JCQocGF0c3Vic3QgJS9zcGVjLmdtaywlLCQkKHBhdHN1YnN0ICQkKG91dHB1dF9kaXIpLyUsJSwkJChhbGxfc3BlY19maWxlcykpKQotCi0gICAgICAgIGlmbmVxICgkJChvcmlnaW4gQ09ORiksdW5kZWZpbmVkKQotICAgICAgICAgICAgIyBVc2VyIGhhdmUgZ2l2ZW4gYSBDT05GPSBhcmd1bWVudC4KLSAgICAgICAgICAgIGlmZXEgKCQkKENPTkYpLCkKLSAgICAgICAgICAgICAgICAjIElmIGdpdmVuIENPTkY9LCBtYXRjaCBhbGwgY29uZmlndXJhdGlvbnMKLSAgICAgICAgICAgICAgICBtYXRjaGluZ19jb25mcz0kJChzdHJpcCAkJChhbGxfY29uZnMpKQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICMgT3RoZXJ3aXNlIHNlbGVjdCB0aG9zZSB0aGF0IGNvbnRhaW4gdGhlIGdpdmVuIENPTkYgc3RyaW5nCi0gICAgICAgICAgICAgICAgbWF0Y2hpbmdfY29uZnM9JCQoc3RyaXAgJCQoZm9yZWFjaCB2YXIsJCQoYWxsX2NvbmZzKSwkJChpZiAkJChmaW5kc3RyaW5nICQkKENPTkYpLCQkKHZhcikpLCQkKHZhcikpKSkKLSAgICAgICAgICAgIGVuZGlmCi0gICAgICAgICAgICBpZmVxICgkJChtYXRjaGluZ19jb25mcyksKQotICAgICAgICAgICAgICAgICQkKGluZm8gTm8gY29uZmlndXJhdGlvbnMgZm91bmQgbWF0Y2hpbmcgQ09ORj0kJChDT05GKSkKLSAgICAgICAgICAgICAgICAkJChpbmZvIEF2YWlsYWJsZSBjb25maWd1cmF0aW9uczopCi0gICAgICAgICAgICAgICAgJCQoZm9yZWFjaCB2YXIsJCQoYWxsX2NvbmZzKSwkJChpbmZvICogJCQodmFyKSkpCi0gICAgICAgICAgICAgICAgJCQoZXZhbCAkJChjYWxsIGZhdGFsLWVycm9yKSkKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBpZmVxICgkJCh3b3JkcyAkJChtYXRjaGluZ19jb25mcykpLDEpCi0gICAgICAgICAgICAgICAgICAgICQkKGluZm8gQnVpbGRpbmcgJyQkKG1hdGNoaW5nX2NvbmZzKScgKG1hdGNoaW5nIENPTkY9JCQoQ09ORikpKQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgJCQoaW5mbyBCdWlsZGluZyB0aGUgZm9sbG93aW5nIGNvbmZpZ3VyYXRpb25zIChtYXRjaGluZyBDT05GPSQkKENPTkYpKTopCi0gICAgICAgICAgICAgICAgICAgICQkKGZvcmVhY2ggdmFyLCQkKG1hdGNoaW5nX2NvbmZzKSwkJChpbmZvICogJCQodmFyKSkpCisgICAgICAgICAgICBpZm5lcSAoJCQob3JpZ2luIENPTkYpLHVuZGVmaW5lZCkKKyAgICAgICAgICAgICAgICAjIFdlIGFsc28gaGF2ZSBhIENPTkYgYXJndW1lbnQuIFRoaXMgaXMgT0sgb25seSBpZiB0aGlzIGlzIGEgcmVwZWF0ZWQgY2FsbCBieSBvdXJzZWx2ZXMsCisgICAgICAgICAgICAgICAgIyBidXQgY29tcGxhaW4gaWYgdGhpcyBpcyB0aGUgdG9wLWxldmVsIG1ha2UgY2FsbC4KKyAgICAgICAgICAgICAgICBpZmVxICgkJChNQUtFTEVWRUwpLDApCisgICAgICAgICAgICAgICAgICAgICQkKGluZm8gQ2Fubm90IHVzZSBDT05GPSQkKENPTkYpIGFuZCBTUEVDPSQkKFNQRUMpIGF0IHRoZSBzYW1lIHRpbWUuIENob29zZSBvbmUuKQorICAgICAgICAgICAgICAgICAgICAkJChldmFsICQkKGNhbGwgRmF0YWxFcnJvcikpCiAgICAgICAgICAgICAgICAgZW5kaWYKICAgICAgICAgICAgIGVuZGlmCi0KLSAgICAgICAgICAgICMgQ3JlYXRlIGEgU1BFQyBkZWZpbml0aW9uLiBUaGlzIHdpbGwgY29udGFpbiB0aGUgcGF0aCB0byBvbmUgb3IgbW9yZSBzcGVjLmdtayBmaWxlcy4KLSAgICAgICAgICAgIFNQRUM9JCQoYWRkc3VmZml4IC9zcGVjLmdtaywkJChhZGRwcmVmaXggJCQob3V0cHV0X2RpcikvLCQkKG1hdGNoaW5nX2NvbmZzKSkpCisgICAgICAgICAgICAjIC4uLiBPSywgd2UncmUgc2F0aXNmaWVkLCB3ZSdsbCB1c2UgdGhpcyBTUEVDIGxhdGVyIG9uCiAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICMgTm8gQ09ORiBvciBTUEVDIGdpdmVuLCBjaGVjayB0aGUgYXZhaWxhYmxlIGNvbmZpZ3VyYXRpb25zCi0gICAgICAgICAgICBpZm5lcSAoJCQod29yZHMgJCQoYWxsX3NwZWNfZmlsZXMpKSwxKQotICAgICAgICAgICAgICAgICQkKGluZm8gTm8gQ09ORiBvciBTUEVDIGdpdmVuLCBidXQgbW9yZSB0aGFuIG9uZSBzcGVjLmdtayBmb3VuZCBpbiAkJChvdXRwdXRfZGlyKS4pCi0gICAgICAgICAgICAgICAgJCQoaW5mbyBBdmFpbGFibGUgY29uZmlndXJhdGlvbnM6KQotICAgICAgICAgICAgICAgICQkKGZvcmVhY2ggdmFyLCQkKGFsbF9jb25mcyksJCQoaW5mbyAqICQkKHZhcikpKQotICAgICAgICAgICAgICAgICQkKGluZm8gUGxlYXNlIHJldHJ5IGJ1aWxkaW5nIHdpdGggQ09ORj08Y29uZmlnPiBvciBTUEVDPTxzcGVjZmlsZT4pCi0gICAgICAgICAgICAgICAgJCQoZXZhbCAkJChjYWxsIGZhdGFsLWVycm9yKSkKKyAgICAgICAgICAgICMgRmluZCBhbGwgc3BlYy5nbWsgZmlsZXMgaW4gdGhlIGJ1aWxkIG91dHB1dCBkaXJlY3RvcnkKKyAgICAgICAgICAgIG91dHB1dF9kaXI9JCQocm9vdF9kaXIpL2J1aWxkCisgICAgICAgICAgICBhbGxfc3BlY19maWxlcz0kJCh3aWxkY2FyZCAkJChvdXRwdXRfZGlyKS8qL3NwZWMuZ21rKQorICAgICAgICAgICAgaWZlcSAoJCQoYWxsX3NwZWNfZmlsZXMpLCkKKyAgICAgICAgICAgICAgICAkJChpbmZvIE5vIGNvbmZpZ3VyYXRpb25zIGZvdW5kIGZvciAkJChyb290X2RpcikhIFBsZWFzZSBydW4gY29uZmlndXJlIHRvIGNyZWF0ZSBhIGNvbmZpZ3VyYXRpb24uKQorICAgICAgICAgICAgICAgICQkKGV2YWwgJCQoY2FsbCBGYXRhbEVycm9yKSkKICAgICAgICAgICAgIGVuZGlmCisgICAgICAgICAgICAjIEV4dHJhY3QgdGhlIGNvbmZpZ3VyYXRpb24gbmFtZXMgZnJvbSB0aGUgcGF0aAorICAgICAgICAgICAgYWxsX2NvbmZzPSQkKHBhdHN1YnN0ICUvc3BlYy5nbWssJSwkJChwYXRzdWJzdCAkJChvdXRwdXRfZGlyKS8lLCUsJCQoYWxsX3NwZWNfZmlsZXMpKSkKIAotICAgICAgICAgICAgIyBXZSBmb3VuZCBleGFjdGx5IG9uZSBjb25maWd1cmF0aW9uLCB1c2UgaXQKLSAgICAgICAgICAgIFNQRUM9JCQoc3RyaXAgJCQoYWxsX3NwZWNfZmlsZXMpKQorICAgICAgICAgICAgaWZuZXEgKCQkKG9yaWdpbiBDT05GKSx1bmRlZmluZWQpCisgICAgICAgICAgICAgICAgIyBVc2VyIGhhdmUgZ2l2ZW4gYSBDT05GPSBhcmd1bWVudC4KKyAgICAgICAgICAgICAgICBpZmVxICgkJChDT05GKSwpCisgICAgICAgICAgICAgICAgICAgICMgSWYgZ2l2ZW4gQ09ORj0sIG1hdGNoIGFsbCBjb25maWd1cmF0aW9ucworICAgICAgICAgICAgICAgICAgICBtYXRjaGluZ19jb25mcz0kJChzdHJpcCAkJChhbGxfY29uZnMpKQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgIyBPdGhlcndpc2Ugc2VsZWN0IHRob3NlIHRoYXQgY29udGFpbiB0aGUgZ2l2ZW4gQ09ORiBzdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2hpbmdfY29uZnM9JCQoc3RyaXAgJCQoZm9yZWFjaCB2YXIsJCQoYWxsX2NvbmZzKSwkJChpZiAkJChmaW5kc3RyaW5nICQkKENPTkYpLCQkKHZhcikpLCQkKHZhcikpKSkKKyAgICAgICAgICAgICAgICBlbmRpZgorICAgICAgICAgICAgICAgIGlmZXEgKCQkKG1hdGNoaW5nX2NvbmZzKSwpCisgICAgICAgICAgICAgICAgICAgICQkKGluZm8gTm8gY29uZmlndXJhdGlvbnMgZm91bmQgbWF0Y2hpbmcgQ09ORj0kJChDT05GKSkKKyAgICAgICAgICAgICAgICAgICAgJCQoaW5mbyBBdmFpbGFibGUgY29uZmlndXJhdGlvbnM6KQorICAgICAgICAgICAgICAgICAgICAkJChmb3JlYWNoIHZhciwkJChhbGxfY29uZnMpLCQkKGluZm8gKiAkJCh2YXIpKSkKKyAgICAgICAgICAgICAgICAgICAgJCQoZXZhbCAkJChjYWxsIEZhdGFsRXJyb3IpKQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgaWZlcSAoJCQod29yZHMgJCQobWF0Y2hpbmdfY29uZnMpKSwxKQorICAgICAgICAgICAgICAgICAgICAgICAgJCQoaW5mbyBCdWlsZGluZyAnJCQobWF0Y2hpbmdfY29uZnMpJyAobWF0Y2hpbmcgQ09ORj0kJChDT05GKSkpCisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICQkKGluZm8gQnVpbGRpbmcgdGFyZ2V0ICckKGNhbGwgR2V0UmVhbFRhcmdldCknIGluIHRoZSBmb2xsb3dpbmcgY29uZmlndXJhdGlvbnMgKG1hdGNoaW5nIENPTkY9JCQoQ09ORikpOikKKyAgICAgICAgICAgICAgICAgICAgICAgICQkKGZvcmVhY2ggdmFyLCQkKG1hdGNoaW5nX2NvbmZzKSwkJChpbmZvICogJCQodmFyKSkpCisgICAgICAgICAgICAgICAgICAgIGVuZGlmCisgICAgICAgICAgICAgICAgZW5kaWYKKworICAgICAgICAgICAgICAgICMgQ3JlYXRlIGEgU1BFQyBkZWZpbml0aW9uLiBUaGlzIHdpbGwgY29udGFpbiB0aGUgcGF0aCB0byBvbmUgb3IgbW9yZSBzcGVjLmdtayBmaWxlcy4KKyAgICAgICAgICAgICAgICBTUEVDPSQkKGFkZHN1ZmZpeCAvc3BlYy5nbWssJCQoYWRkcHJlZml4ICQkKG91dHB1dF9kaXIpLywkJChtYXRjaGluZ19jb25mcykpKQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICMgTm8gQ09ORiBvciBTUEVDIGdpdmVuLCBjaGVjayB0aGUgYXZhaWxhYmxlIGNvbmZpZ3VyYXRpb25zCisgICAgICAgICAgICAgICAgaWZuZXEgKCQkKHdvcmRzICQkKGFsbF9zcGVjX2ZpbGVzKSksMSkKKyAgICAgICAgICAgICAgICAgICAgJCQoaW5mbyBObyBDT05GIGdpdmVuLCBidXQgbW9yZSB0aGFuIG9uZSBjb25maWd1cmF0aW9uIGZvdW5kIGluICQkKG91dHB1dF9kaXIpLikKKyAgICAgICAgICAgICAgICAgICAgJCQoaW5mbyBBdmFpbGFibGUgY29uZmlndXJhdGlvbnM6KQorICAgICAgICAgICAgICAgICAgICAkJChmb3JlYWNoIHZhciwkJChhbGxfY29uZnMpLCQkKGluZm8gKiAkJCh2YXIpKSkKKyAgICAgICAgICAgICAgICAgICAgJCQoaW5mbyBQbGVhc2UgcmV0cnkgYnVpbGRpbmcgd2l0aCBDT05GPTxjb25maWcgcGF0dGVybj4gKG9yIFNQRUM9PHNwZWNmaWxlPikpCisgICAgICAgICAgICAgICAgICAgICQkKGV2YWwgJCQoY2FsbCBGYXRhbEVycm9yKSkKKyAgICAgICAgICAgICAgICBlbmRpZgorCisgICAgICAgICAgICAgICAgIyBXZSBmb3VuZCBleGFjdGx5IG9uZSBjb25maWd1cmF0aW9uLCB1c2UgaXQKKyAgICAgICAgICAgICAgICBTUEVDPSQkKHN0cmlwICQkKGFsbF9zcGVjX2ZpbGVzKSkKKyAgICAgICAgICAgIGVuZGlmCiAgICAgICAgIGVuZGlmCiAgICAgZW5kaWYKIGVuZGVmCiAKLWRlZmluZSBDaGVja0Vudmlyb25tZW50Ci0gICAgIyBGaW5kIGFsbCBlbnZpcm9ubWVudCBvciBjb21tYW5kIGxpbmUgdmFyaWFibGVzIHRoYXQgYmVnaW4gd2l0aCBBTFQuCi0gICAgJChpZiAkKGxpc3RfYWx0X292ZXJyaWRlcyksCi0gICAgICAgIEAkKFBSSU5URikgIlxuV0FSTklORzogWW91IGhhdmUgdGhlIGZvbGxvd2luZyBBTFRfIHZhcmlhYmxlcyBzZXQ6XG4iCi0gICAgQCQoUFJJTlRGKSAiJChmb3JlYWNoIHZhciwkKGxpc3RfYWx0X292ZXJyaWRlcyksJCh2YXIpPSQkJCh2YXIpKVxuIgotICAgIEAkKFBSSU5URikgIkFMVF8gdmFyaWFibGVzIGFyZSBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIGlnbm9yZWQuIFBsZWFzZSBjbGVhbiB5b3VyIGVudmlyb25tZW50LlxuXG4iCi0gICAgKQotZW5kZWYKLQotZGVmaW5lIFByaW50U3RhcnRNZXNzYWdlCi0gICAgJChpZiAkKFZFUkJPU0UpLCxAJChFQ0hPKSBSdW5uaW5nIG1ha2UgYXMgJChNQUtFKSAkKE1GTEFHUykgJChNQUtFX0FSR1MpKQotICAgICQoY2FsbCBDaGVja0Vudmlyb25tZW50KQotICAgIEAkKEVDSE8pICJCdWlsZGluZyBPcGVuSkRLIGZvciB0YXJnZXQgJChpZiAkKE1BS0VDTURHT0FMUyksJyQoTUFLRUNNREdPQUxTKScsJ2FsbCcpIGluIGNvbmZpZ3VyYXRpb24gJyQoQ09ORl9OQU1FKSciCi1lbmRlZgotCi1kZWZpbmUgUHJpbnRFbmRNZXNzYWdlCi0gICAgQCQoRUNITykgIkZpbmlzaGVkIGJ1aWxkaW5nIE9wZW5KREsgZm9yIHRhcmdldCAnJEAnIgotICAgICQoY2FsbCBDaGVja0Vudmlyb25tZW50KQotZW5kZWYKKyMjIyBDb252ZW5pZW5jZSBmdW5jdGlvbnMgZnJvbSBNYWluLmdtawogCiAjIENsZWFucyB0aGUgY29tcG9uZW50IGdpdmVuIGFzICQxCiBkZWZpbmUgQ2xlYW5Db21wb25lbnQKZGlmZiAtLWdpdCBhL2NvbW1vbi9tYWtlZmlsZXMvTWFrZWZpbGUgYi9jb21tb24vbWFrZWZpbGVzL01ha2VmaWxlCmluZGV4IDk2NzJiYjQuLmNkNWE5YmYgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9tYWtlZmlsZXMvTWFrZWZpbGUKKysrIGIvY29tbW9uL21ha2VmaWxlcy9NYWtlZmlsZQpAQCAtMjQsMTMgKzI0LDI0IEBACiAjCiAKICMgVGhpcyBtdXN0IGJlIHRoZSBmaXJzdCBydWxlCi1kZWZhdWx0OiBhbGwKK2FsbDoKIAogIyBJbmNsdXNpb24gb2YgdGhpcyBwc2V1ZG8tdGFyZ2V0IHdpbGwgY2F1c2UgbWFrZSB0byBleGVjdXRlIHRoaXMgZmlsZQogIyBzZXJpYWxseSwgcmVnYXJkbGVzcyBvZiAtai4gUmVjdXJzaXZlbHkgY2FsbGVkIG1ha2VmaWxlcyB3aWxsIG5vdCBiZQogIyBhZmZlY3RlZCwgaG93ZXZlci4gVGhpcyBpcyByZXF1aXJlZCBmb3IgY29ycmVjdCBkZXBlbmRlbmN5IG1hbmFnZW1lbnQuCiAuTk9UUEFSQUxMRUw6CiAKKyMgVGhlIHNoZWxsIGNvZGUgYmVsb3cgd2lsbCBiZSBleGVjdXRlZCBvbiAvdXNyL2Njcy9iaW4vbWFrZSBvbiBTb2xhcmlzLCBidXQgbm90IGluIEdOVSBtYWtlLgorIyAvdXNyL2Njcy9iaW4vbWFrZSBsYWNrcyBiYXNpY2FsbHkgZXZlcnkgb3RoZXIgZmxvdyBjb250cm9sIG1lY2hhbmlzbS4KK1RFU1RfRk9SX05PTl9HTlVNQUtFOnNoPWVjaG8gWW91IGFyZSBub3QgdXNpbmcgR05VIG1ha2UvZ21ha2UsIHRoaXMgaXMgYSByZXF1aXJlbWVudC4gQ2hlY2sgeW91ciBwYXRoLiAxPiYyICYmIGV4aXQgMQorCisjIEFzc3VtZSB3ZSBoYXZlIEdOVSBtYWtlLCBidXQgY2hlY2sgdmVyc2lvbi4KK2lmZXEgKCwkKGZpbmRzdHJpbmcgMy44MSwkKE1BS0VfVkVSU0lPTikpKQorICAgIGlmZXEgKCwkKGZpbmRzdHJpbmcgMy44MiwkKE1BS0VfVkVSU0lPTikpKQorICAgICAgICAkKGVycm9yIFRoaXMgdmVyc2lvbiBvZiBHTlUgTWFrZSBpcyB0b28gbG93ICgkKE1BS0VfVkVSU0lPTikpLiBDaGVjayB5b3VyIHBhdGgsIG9yIHVwZ3JhZGUgdG8gMy44MSBvciBuZXdlci4pCisgICAgZW5kaWYKK2VuZGlmCisKICMgTG9jYXRlIHRoaXMgTWFrZWZpbGUKIGlmZXEgKCQoZmlsdGVyIC8lLCQobGFzdHdvcmQgJChNQUtFRklMRV9MSVNUKSkpLCkKICAgICBtYWtlZmlsZV9wYXRoOj0kKENVUkRJUikvJChsYXN0d29yZCAkKE1BS0VGSUxFX0xJU1QpKQpAQCAtNDMsMjAyICs1NCwzMiBAQAogaW5jbHVkZSAkKGRpciAkKG1ha2VmaWxlX3BhdGgpKS9NYWtlSGVscGVycy5nbWsKIAogJChldmFsICQoY2FsbCBQYXJzZUxvZ0xldmVsKSkKLSQoZXZhbCAkKGNhbGwgU2V0dXBMb2dnaW5nKSkKICQoZXZhbCAkKGNhbGwgUGFyc2VDb25mQW5kU3BlYykpCiAKLWlmbmVxICgkKHdvcmRzICQoU1BFQykpLDEpCi0jIyMgV2UgaGF2ZSBtdWx0aXBsZSBjb25maWd1cmF0aW9ucyB0byBidWlsZCwgY2FsbCBtYWtlIHJlcGVhdGVkbHkKLWFsbCBjbGVhbiBkaXN0LWNsZWFuOgotbGFuZ3Rvb2xzIGNvcmJhIGpheHAgamF4d3MgaG90c3BvdCBqZGsgaW1hZ2VzIG92ZXJsYXktaW1hZ2VzIGluc3RhbGw6Ci1sYW5ndG9vbHMtb25seSBjb3JiYS1vbmx5IGpheHAtb25seSBqYXh3cy1vbmx5IGhvdHNwb3Qtb25seSBqZGstb25seSBpbWFnZXMtb25seSBvdmVybGF5LWltYWdlcy1vbmx5IGluc3RhbGwtb25seToKLWNsZWFuLWxhbmd0b29scyBjbGVhbi1jb3JiYSBjbGVhbi1qYXhwIGNsZWFuLWpheHdzIGNsZWFuLWhvdHNwb3QgY2xlYW4tamRrIGNsZWFuLWltYWdlczoKKyMgTm93IGRldGVybWluZSBpZiB3ZSBoYXZlIHplcm8sIG9uZSBvciBzZXZlcmFsIGNvbmZpZ3VyYXRpb25zIHRvIGJ1aWxkLgoraWZlcSAoJChTUEVDKSwpCisgICAgIyBTaW5jZSB3ZSBnb3QgcGFzdCBQYXJzZUNvbmZBbmRTcGVjLCB3ZSBtdXN0IGJlIGJ1aWxkaW5nIGEgZ2xvYmFsIHRhcmdldC4gRG8gbm90aGluZy4KK2Vsc2UKKyAgICBpZmVxICgkKHdvcmRzICQoU1BFQykpLDEpCisgICAgICAgICMgV2UgYXJlIGJ1aWxkaW5nIGEgc2luZ2xlIGNvbmZpZ3VyYXRpb24uIFRoaXMgaXMgdGhlIG5vcm1hbCBjYXNlLiBFeGVjdXRlIHRoZSBNYWluLmdtayBmaWxlLgorICAgICAgICBpbmNsdWRlICQoZGlyICQobWFrZWZpbGVfcGF0aCkpL01haW4uZ21rCisgICAgZWxzZQorICAgICAgICAjIFdlIGFyZSBidWlsZGluZyBtdWx0aXBsZSBjb25maWd1cmF0aW9ucy4KKyAgICAgICAgIyBGaXJzdCwgZmluZCBvdXQgdGhlIHZhbGlkIHRhcmdldHMKKyAgICAgICAgIyBSdW4gdGhlIG1ha2VmaWxlIHdpdGggYW4gYXJiaXRyYXR5IFNQRUMgdXNpbmcgLXAgLXEgKHF1aWV0IGRyeS1ydW4gYW5kIGR1bXAgcnVsZXMpIHRvIGZpbmQKKyAgICAgICAgIyBhdmFpbGFibGUgUEhPTlkgdGFyZ2V0cy4gVXNlIHRoaXMgbGlzdCBhcyB2YWxpZCB0YXJnZXRzIHRvIHBhc3Mgb24gdG8gdGhlIHJlcGVhdGVkIGNhbGxzLgorICAgICAgICBhbGxfcGhvbnlfdGFyZ2V0cz0kKGZpbHRlci1vdXQgJChnbG9iYWxfdGFyZ2V0cyksICQoc3RyaXAgJChzaGVsbCBcCisgICAgICAgICAgICAkKE1BS0UpIC1wIC1xIC1mICAkKG1ha2VmaWxlX3BhdGgpIFNQRUM9JChmaXJzdHdvcmQgJChTUEVDKSkgfCBcCisgICAgICAgICAgICBncmVwIF4uUEhPTlk6IHwgaGVhZCAtbiAxIHwgY3V0IC1kICIgIiAtZiAyLSkpKQorCiskKGFsbF9waG9ueV90YXJnZXRzKToKIAlAJChmb3JlYWNoIHNwZWMsJChTUEVDKSwoJChNQUtFKSAtZiAkKG1ha2VmaWxlX3BhdGgpIFNQRUM9JChzcGVjKSAkKFZFUkJPU0UpIFZFUkJPU0U9JChWRVJCT1NFKSAkQCkgJiYpIHRydWUKIAotLlBIT05ZOiBhbGwgY2xlYW4gZGlzdC1jbGVhbgotLlBIT05ZOiBsYW5ndG9vbHMgY29yYmEgamF4cCBqYXh3cyBob3RzcG90IGpkayBpbWFnZXMgb3ZlcmxheS1pbWFnZXMgaW5zdGFsbAotLlBIT05ZOiBsYW5ndG9vbHMtb25seSBjb3JiYS1vbmx5IGpheHAtb25seSBqYXh3cy1vbmx5IGhvdHNwb3Qtb25seSBqZGstb25seSBpbWFnZXMtb25seSBvdmVybGF5LWltYWdlcy1vbmx5IGluc3RhbGwtb25seQotLlBIT05ZOiBjbGVhbi1sYW5ndG9vbHMgY2xlYW4tY29yYmEgY2xlYW4tamF4cCBjbGVhbi1qYXh3cyBjbGVhbi1ob3RzcG90IGNsZWFuLWpkayBjbGVhbi1pbWFnZXMKLQotZWxzZQotIyMjIFRoaXMgaXMgdGhlIG1haW4gcGFydCBvZiB0aGUgTWFrZWZpbGUsIGZvciB0aGUgbm9ybWFsIGNhc2Ugd2l0aCBTUEVDIHNwZWNpZnlpbmcgYSBzaW5nbGUgZXhpc3Rpbmcgc3BlYy5nbWsgZmlsZS4KLQotIyBOb3cgbG9hZCB0aGUgc3BlYwotaW5jbHVkZSAkKFNQRUMpCi0KLSMgTG9hZCB0aGUgdml0YWwgdG9vbHMgZm9yIGFsbCB0aGUgbWFrZWZpbGVzLiAKLWluY2x1ZGUgJChTUkNfUk9PVCkvY29tbW9uL21ha2VmaWxlcy9NYWtlQmFzZS5nbWsKLQotIyMjIENsZWFuIHVwIGZyb20gcHJldmlvdXMgcnVuCi0KLSMgUmVtb3ZlIGFueSBidWlsZC5sb2cgZnJvbSBhIHByZXZpb3VzIHJ1biwgaWYgdGhleSBleGlzdAotaWZuZXEgKCwkKEJVSUxEX0xPRykpCi0gICAgaWZuZXEgKCwkKEJVSUxEX0xPR19QUkVWSU9VUykpCi0gICAgICAgICMgUm90YXRlIG9sZCBsb2cKLSAgICAgICAgJChzaGVsbCAkKFJNKSAkKEJVSUxEX0xPR19QUkVWSU9VUykgMj4gL2Rldi9udWxsKQotICAgICAgICAkKHNoZWxsICQoTVYpICQoQlVJTERfTE9HKSAkKEJVSUxEX0xPR19QUkVWSU9VUykgMj4gL2Rldi9udWxsKQotICAgIGVsc2UKLSAgICAgICAgJChzaGVsbCAkKFJNKSAkKEJVSUxEX0xPRykgMj4gL2Rldi9udWxsKQogICAgIGVuZGlmCiBlbmRpZgotIyBSZW1vdmUgYW55IGphdmFjIHNlcnZlciBsb2dzIGFuZCBwb3J0IGZpbGVzLiBUaGlzCi0jIHByZXZlbnRzIGEgbmV3IG1ha2UgcnVuIHRvIHJldXNlIHRoZSBwcmV2aW91cyBzZXJ2ZXJzLgotaWZuZXEgKCwkKFNKQVZBQ19TRVJWRVJfRElSKSkKLSAgICAkKHNoZWxsICQoTUtESVIpIC1wICQoU0pBVkFDX1NFUlZFUl9ESVIpICYmICQoUk0pIC1yZiAkKFNKQVZBQ19TRVJWRVJfRElSKS8qKQotZW5kaWYKLSMgQ2xlYW4gb3V0IGFueSBub3RpZmljYXRpb25zIGZyb20gdGhlIHByZXZpb3VzIGJ1aWxkLgotJChzaGVsbCAkKEZJTkQpICQoT1VUUFVUX1JPT1QpIC1uYW1lICJfdGhlLioubm90aWZ5IiAkKEZJTkRfREVMRVRFKSkKLQotIyBSZXNldCB0aGUgYnVpbGQgdGltZXJzLgotJChldmFsICQoY2FsbCBSZXNldFRpbWVycykpCi0KLSMgU2V0dXAgbnVtYmVyIG9mIGpvYnMgdG8gdXNlLiAtak4gaXMgdW5mb3J0dW5hdGVseSBub3QgYXZhaWxhYmxlIGZvciB1cyB0byBwYXJzZSBmcm9tIHRoZSBjb21tYW5kIGxpbmUsCi0jIGhlbmNlIHRoaXMgd29ya2Fyb3VuZC4KLWlmZXEgKCQoSk9CUyksKQotICAgIEpPQlM9JChOVU1fQ09SRVMpCi1lbmRpZgotTUFLRV9BUkdTOj0kKE1BS0VfQVJHUykgLWokKEpPQlMpCi0KLSMjIyBNYWluIHRhcmdldHMKLQotYWxsOiBqZGsKLQlAJChpZiAkKFNKQVZBQ19TRVJWRVJfRElSKSwkKFJNKSAtcmYgJChTSkFWQUNfU0VSVkVSX0RJUikvKi5wb3J0KQotCUAkKGNhbGwgQXRSb290TWFrZUVuZCkKLS5QSE9OWTogYWxsCi0KLWxhbmd0b29sczogc3RhcnQtbWFrZSBsYW5ndG9vbHMtb25seQotbGFuZ3Rvb2xzLW9ubHk6Ci0JQCQoY2FsbCBNYWtlU3RhcnQsbGFuZ3Rvb2xzLGFsbCkKLQlAKCQoQ0QpICQoTEFOR1RPT0xTX1RPUERJUikvbWFrZWZpbGVzICYmICQoQlVJTERfTE9HX1dSQVBQRVIpICQoTUFLRSkgJChNQUtFX0FSR1MpKQotCUAkKGNhbGwgTWFrZUZpbmlzaCxsYW5ndG9vbHMsYWxsKQotCi1jb3JiYTogbGFuZ3Rvb2xzIGNvcmJhLW9ubHkKLWNvcmJhLW9ubHk6Ci0JQCQoY2FsbCBNYWtlU3RhcnQsY29yYmEsYWxsKQotCUAoJChDRCkgJChDT1JCQV9UT1BESVIpL21ha2VmaWxlcyAmJiAkKEJVSUxEX0xPR19XUkFQUEVSKSAkKE1BS0UpICQoTUFLRV9BUkdTKSkKLQlAJChjYWxsIE1ha2VGaW5pc2gsY29yYmEsYWxsKQotCi1qYXhwOiBsYW5ndG9vbHMgamF4cC1vbmx5Ci1qYXhwLW9ubHk6Ci0JQCQoY2FsbCBNYWtlU3RhcnQsamF4cCxhbGwpCi0JQCgkKENEKSAkKEpBWFBfVE9QRElSKS9tYWtlZmlsZXMgJiYgJChCVUlMRF9MT0dfV1JBUFBFUikgJChNQUtFKSAkKE1BS0VfQVJHUykpCi0JQCQoY2FsbCBNYWtlRmluaXNoLGpheHAsYWxsKQotCi1qYXh3czogbGFuZ3Rvb2xzIGpheHAgamF4d3Mtb25seQotamF4d3Mtb25seToKLQlAJChjYWxsIE1ha2VTdGFydCxqYXh3cyxhbGwpCi0JQCgkKENEKSAkKEpBWFdTX1RPUERJUikvbWFrZWZpbGVzICYmICQoQlVJTERfTE9HX1dSQVBQRVIpICQoTUFLRSkgJChNQUtFX0FSR1MpKQotCUAkKGNhbGwgTWFrZUZpbmlzaCxqYXh3cyxhbGwpCi0KLWhvdHNwb3Q6IGxhbmd0b29scyBob3RzcG90LW9ubHkKLWhvdHNwb3Qtb25seToKLQlAJChjYWxsIE1ha2VTdGFydCxob3RzcG90LGFsbCkKLQlAKCQoQ0QpICQoU1JDX1JPT1QpL2NvbW1vbi9tYWtlZmlsZXMgJiYgJChCVUlMRF9MT0dfV1JBUFBFUikgJChNQUtFKSAkKE1BS0VfQVJHUykgLWYgSG90c3BvdFdyYXBwZXIuZ21rKQotCUAkKGNhbGwgTWFrZUZpbmlzaCxob3RzcG90LGFsbCkKLQotamRrOiBsYW5ndG9vbHMgY29yYmEgamF4cCBqYXh3cyBob3RzcG90IGpkay1vbmx5Ci1qZGstb25seToKLQlAJChjYWxsIE1ha2VTdGFydCxqZGssYWxsKQotCUAoJChDRCkgJChKREtfVE9QRElSKS9tYWtlZmlsZXMgJiYgJChCVUlMRF9MT0dfV1JBUFBFUikgJChNQUtFKSAkKE1BS0VfQVJHUykgJChKREtfVEFSR0VUKSkKLQlAJChjYWxsIE1ha2VGaW5pc2gsamRrLGFsbCkKLQotaW1hZ2VzOiBzb3VyY2UtdGlwcyBzdGFydC1tYWtlIGpkayBsYW5ndG9vbHMgY29yYmEgamF4cCBqYXh3cyBob3RzcG90IGltYWdlcy1vbmx5Ci1pbWFnZXMtb25seToKLQlAJChjYWxsIE1ha2VTdGFydCxqZGstaW1hZ2VzLCRAKQotCUAoJChDRCkgJChKREtfVE9QRElSKS9tYWtlZmlsZXMgJiYgJChCVUlMRF9MT0dfV1JBUFBFUikgJChNQUtFKSAkKE1BS0VfQVJHUykgaW1hZ2VzKQotCUAkKGNhbGwgTWFrZUZpbmlzaCxqZGstaW1hZ2VzLCRAKQotCUAkKGlmICQoU0pBVkFDX1NFUlZFUl9ESVIpLCQoUk0pIC1yZiAkKFNKQVZBQ19TRVJWRVJfRElSKS8qLnBvcnQpCi0JQCQoY2FsbCBBdFJvb3RNYWtlRW5kKQotCi1vdmVybGF5LWltYWdlczogc291cmNlLXRpcHMgc3RhcnQtbWFrZSBqZGsgbGFuZ3Rvb2xzIGNvcmJhIGpheHAgamF4d3MgaG90c3BvdCBvdmVybGF5LWltYWdlcy1vbmx5Ci1vdmVybGF5LWltYWdlcy1vbmx5OgotCUAkKGNhbGwgTWFrZVN0YXJ0LGpkay1vdmVybGF5LWltYWdlcywkQCkKLQlAKCQoQ0QpICQoSkRLX1RPUERJUikvbWFrZWZpbGVzICYmICQoQlVJTERfTE9HX1dSQVBQRVIpICQoTUFLRSkgJChNQUtFX0FSR1MpIG92ZXJsYXktaW1hZ2VzKQotCUAkKGNhbGwgTWFrZUZpbmlzaCxqZGstb3ZlcmxheS1pbWFnZXMsJEApCi0JQCQoaWYgJChTSkFWQUNfU0VSVkVSX0RJUiksJChSTSkgLXJmICQoU0pBVkFDX1NFUlZFUl9ESVIpLyoucG9ydCkKLQlAJChjYWxsIEF0Um9vdE1ha2VFbmQpCi0KLWluc3RhbGw6IHNvdXJjZS10aXBzIHN0YXJ0LW1ha2UgamRrIGxhbmd0b29scyBjb3JiYSBqYXhwIGpheHdzIGhvdHNwb3QgaW5zdGFsbC1vbmx5Ci1pbnN0YWxsLW9ubHk6Ci0JQCQoY2FsbCBNYWtlU3RhcnQsamRrLWltYWdlcywkQCkKLQlAKCQoQ0QpICQoSkRLX1RPUERJUikvbWFrZWZpbGVzICYmICQoQlVJTERfTE9HX1dSQVBQRVIpICQoTUFLRSkgJChNQUtFX0FSR1MpIGluc3RhbGwpCi0JQCQoY2FsbCBNYWtlRmluaXNoLGpkay1pbWFnZXMsJEApCi0JQCQoaWYgJChTSkFWQUNfU0VSVkVSX0RJUiksJChSTSkgLXJmICQoU0pBVkFDX1NFUlZFUl9ESVIpLyoucG9ydCkKLQlAJChjYWxsIEF0Um9vdE1ha2VFbmQpCi0KLWRvY3M6IHN0YXJ0LW1ha2UgamRrIGRvY3Mtb25seQotZG9jcy1vbmx5OgotCUAkKGNhbGwgTWFrZVN0YXJ0LGRvY3MsJEApCi0JQCgkKENEKSAkKFNSQ19ST09UKS9jb21tb24vbWFrZWZpbGVzL2phdmFkb2MgJiYgJChCVUlMRF9MT0dfV1JBUFBFUikgJChNQUtFKSAkKE1BS0VfQVJHUykgLWYgSmF2YWRvYy5nbWsgZG9jcykKLQlAJChjYWxsIE1ha2VGaW5pc2gsZG9jcywkQCkKLQlAJChpZiAkKFNKQVZBQ19TRVJWRVJfRElSKSwkKFJNKSAtcmYgJChTSkFWQUNfU0VSVkVSX0RJUikvKi5wb3J0KQotCUAkKGNhbGwgQXRSb290TWFrZUVuZCkKLQotCi0uUEhPTlk6IGxhbmd0b29scyBjb3JiYSBqYXhwIGpheHdzIGhvdHNwb3QgamRrIGltYWdlcyBpbnN0YWxsCi0uUEhPTlk6IGxhbmd0b29scy1vbmx5IGNvcmJhLW9ubHkgamF4cC1vbmx5IGpheHdzLW9ubHkgaG90c3BvdC1vbmx5IGpkay1vbmx5IGltYWdlcy1vbmx5IGluc3RhbGwtb25seQotCi1zdGFydC1tYWtlOgotCUAkKGNhbGwgQXRSb290TWFrZVN0YXJ0KQotLlBIT05ZOiBzdGFydC1tYWtlCi0KLWJvb3RjeWNsZS1pbWFnZXM6Ci0JQCQoRUNITykgQm9vdCBjeWNsZSBidWlsZCBzdGVwIDE6IEJ1aWxkaW5nIHRoZSBKREsgaW1hZ2Ugbm9ybWFsbHkKLQlAKCQoQ0QpICQoU1JDX1JPT1QpL2NvbW1vbi9tYWtlZmlsZXMgJiYgJChCVUlMRF9MT0dfV1JBUFBFUikgJChNQUtFKSBTUEVDPSQoU1BFQykgaW1hZ2VzKQotCUAkKEVDSE8pIEJvb3QgY3ljbGUgYnVpbGQgc3RlcCAyOiBCdWlsZGluZyBhIG5ldyBKREsgaW1hZ2UgdXNpbmcgcHJldmlvdXNseSBidWlsdCBpbWFnZQotCUAoJChDRCkgJChTUkNfUk9PVCkvY29tbW9uL21ha2VmaWxlcyAmJiAkKEJVSUxEX0xPR19XUkFQUEVSKSAkKE1BS0UpIFNQRUM9JChkaXIgJChTUEVDKSlib290Y3ljbGUtc3BlYy5nbWsgaW1hZ2VzKQotCi10ZXN0OiBzdGFydC1tYWtlCi0JQCQoY2FsbCBNYWtlU3RhcnQsdGVzdCwkKGlmICQoVEVTVCksJChURVNUKSxhbGwpKQotCUAoJChDRCkgJChTUkNfUk9PVCkvdGVzdCAmJiAkKEJVSUxEX0xPR19XUkFQUEVSKSAkKE1BS0UpIE1BS0VGTEFHUz0gLWoxIFBST0RVQ1RfSE9NRT0kKE9VVFBVVF9ST09UKS9qZGsgSlBSVF9KQVZBX0hPTUU9JChPVVRQVVRfUk9PVCkvamRrIEFMVF9PVVRQVVRESVI9JChPVVRQVVRfUk9PVCkgJChURVNUKSkgfHwgdHJ1ZQotCUAkKGNhbGwgTWFrZUZpbmlzaCx0ZXN0LCQoaWYgJChURVNUKSwkKFRFU1QpLGFsbCkpCi0JQCQoY2FsbCBBdFJvb3RNYWtlRW5kKQotLlBIT05ZOiB0ZXN0Ci0KLQotIyBTdG9yZXMgdGhlIHRpcHMgZm9yIGVhY2ggcmVwb3NpdG9yeS4gVGhpcyBmaWxlIGlzIGJlIHVzZWQgd2hlbiBjb25zdHJ1Y3RpbmcgdGhlIGpkayBpbWFnZSBhbmQgY2FuIGJlCi0jIHVzZWQgdG8gdHJhY2sgdGhlIGV4YWN0IHNvdXJjZXMgdXNlZCB0byBidWlsZCB0aGF0IGltYWdlLgotc291cmNlLXRpcHM6ICQoT1VUUFVUX1JPT1QpL3NvdXJjZV90aXBzCi0kKE9VVFBVVF9ST09UKS9zb3VyY2VfdGlwczogRlJDCi0JQCQoTUtESVIpIC1wICQoQEQpCi0JQCQoUk0pICRACi0JQCQoY2FsbCBHZXRTb3VyY2VUaXBzKQotCi0KLSMgUmVtb3ZlIGV2ZXJ5dGhpbmcsIGV4Y2VwdCB0aGUgb3V0cHV0IGZyb20gY29uZmlndXJlLgotY2xlYW46IGNsZWFuLWxhbmd0b29scyBjbGVhbi1jb3JiYSBjbGVhbi1qYXhwIGNsZWFuLWpheHdzIGNsZWFuLWhvdHNwb3QgY2xlYW4tamRrIGNsZWFuLWltYWdlcyBjbGVhbi1ib290Y3ljbGUtYnVpbGQKLQlAKCQoQ0QpICQoT1VUUFVUX1JPT1QpICYmICQoUk0pIC1yIHRtcCBzb3VyY2VfdGlwcyBidWlsZC5sb2cqKQotCUAkKEVDSE8pIENsZWFuZWQgZXZlcnl0aGluZyBleGNlcHQgdGhlIGJ1aWxkIGNvbmZpZ3VyYXRpb24uCi0uUEhPTlk6IGNsZWFuCi0KLSMgUmVtb3ZlIGV2ZXJ5dGhpbmcsIHlvdSBoYXZlIHRvIHJlcnVuIGNvbmZpZ3VyZS4KLWRpc3QtY2xlYW46Ci0JQCQoUk0pIC1yICQoT1VUUFVUX1JPT1QpCi0JQCQoRUNITykgQ2xlYW5lZCBldmVyeXRoaW5nLCB5b3Ugd2lsbCBoYXZlIHRvIHJlLXJ1biBjb25maWd1cmUuCi0uUEhPTlk6IGRpc3QtY2xlYW4KLQotY2xlYW4tbGFuZ3Rvb2xzOgotCSQoY2FsbCBDbGVhbkNvbXBvbmVudCxsYW5ndG9vbHMpCi1jbGVhbi1jb3JiYToKLQkkKGNhbGwgQ2xlYW5Db21wb25lbnQsY29yYmEpCi1jbGVhbi1qYXhwOgotCSQoY2FsbCBDbGVhbkNvbXBvbmVudCxqYXhwKQotY2xlYW4tamF4d3M6Ci0JJChjYWxsIENsZWFuQ29tcG9uZW50LGpheHdzKQotY2xlYW4taG90c3BvdDoKLQkkKGNhbGwgQ2xlYW5Db21wb25lbnQsaG90c3BvdCkKLWNsZWFuLWpkazoKLQkkKGNhbGwgQ2xlYW5Db21wb25lbnQsamRrKQotY2xlYW4taW1hZ2VzOgotCSQoY2FsbCBDbGVhbkNvbXBvbmVudCxpbWFnZXMpCi1jbGVhbi1ib290Y3ljbGUtYnVpbGQ6Ci0JJChjYWxsIENsZWFuQ29tcG9uZW50LGJvb3RjeWNsZS1idWlsZCkKLQotLlBIT05ZOiBjbGVhbi1sYW5ndG9vbHMgY2xlYW4tY29yYmEgY2xlYW4tamF4cCBjbGVhbi1qYXh3cyBjbGVhbi1ob3RzcG90IGNsZWFuLWpkayBjbGVhbi1pbWFnZXMKLQotZW5kaWYKIAogIyBIZXJlIGFyZSAiZ2xvYmFsIiB0YXJnZXRzLCBpLmUuIHRhcmdldHMgdGhhdCBjYW4gYmUgZXhlY3V0ZWQgd2l0aG91dCBzcGVjaWZ5aW5nIGEgc2luZ2xlIGNvbmZpZ3VyYXRpb24uCi0jIElmIHlvdSBhZGRkIG1vcmUgZ2xvYmFsIHRhcmdldHMsIHBsZWFzZSB1cGRhdGUgdGhlIGZhdGFsLWVycm9yIG1hY3JvLgorIyBJZiB5b3UgYWRkZCBtb3JlIGdsb2JhbCB0YXJnZXRzLCBwbGVhc2UgdXBkYXRlIHRoZSB2YXJpYWJsZSBnbG9iYWxfdGFyZ2V0cyBpbiBNYWtlSGVscGVycy4KIAogaGVscDoKIAkkKGluZm8gKQpAQCAtMjU4LDcgKzk5LDcgQEAKIAkkKGluZm8gLiAgbWFrZSB0ZXN0ICAgICAgICAgICAgICAjIFJ1biB0ZXN0cywgZGVmYXVsdCBpcyBhbGwgdGVzdHMgKHNlZSBURVNUIGJlbG93KSkKIAkkKGluZm8gKQogCSQoaW5mbyBUYXJnZXRzIGZvciBzcGVjaWZpYyBjb21wb25lbnRzKQotCSQoaW5mbyAoQ29tcG9uZW50IGlzIGFueSBvZiBsYW5ndG9vbHMsIGNvcmJhLCBqYXhwLCBqYXh3cywgaG90c3BvdCwgamRrIG9yIGltYWdlcykpCisJJChpbmZvIChDb21wb25lbnQgaXMgYW55IG9mIGxhbmd0b29scywgY29yYmEsIGpheHAsIGpheHdzLCBob3RzcG90LCBqZGssIGltYWdlcyBvciBvdmVybGF5LWltYWdlcykpCiAJJChpbmZvIC4gIG1ha2UgPGNvbXBvbmVudD4gICAgICAgIyBCdWlsZCA8Y29tcG9uZW50PiBhbmQgZXZlcnl0aGluZyBpdCBkZXBlbmRzIG9uLiApCiAJJChpbmZvIC4gIG1ha2UgPGNvbXBvbmVudD4tb25seSAgIyBCdWlsZCA8Y29tcG9uZW50PiBvbmx5LCB3aXRob3V0IGRlcGVuZGVuY2llcy4gVGhpcykKIAkkKGluZm8gLiAgICAgICAgICAgICAgICAgICAgICAgICAjIGlzIGZhc3RlciBidXQgY2FuIHJlc3VsdCBpbiBpbmNvcnJlY3QgYnVpbGQgcmVzdWx0cyEpCkBAIC0yNzIsNyArMTEzLDcgQEAKIAkkKGluZm8gLiAgbWFrZSBMT0c9PGxvZ2xldmVsPiAgICAjIENoYW5nZSB0aGUgbG9nIGxldmVsIGZyb20gd2FybiB0byA8bG9nbGV2ZWw+KQogCSQoaW5mbyAuICAgICAgICAgICAgICAgICAgICAgICAgICMgQXZhaWxhYmxlIGxvZyBsZXZlbHMgYXJlOikKIAkkKGluZm8gLiAgICAgICAgICAgICAgICAgICAgICAgICAjICd3YXJuJyAoZGVmYXVsdCksICdpbmZvJywgJ2RlYnVnJyBhbmQgJ3RyYWNlJykKLQkkKGluZm8gLiAgICAgICAgICAgICAgICAgICAgICAgICAjIFRvIHNlZSBleGVjdXRlZCBjb21tYW5kIGxpbmVzLCB1c2UgTE9HPWluZm8pCisJJChpbmZvIC4gICAgICAgICAgICAgICAgICAgICAgICAgIyBUbyBzZWUgZXhlY3V0ZWQgY29tbWFuZCBsaW5lcywgdXNlIExPRz1kZWJ1ZykKIAkkKGluZm8gKQogCSQoaW5mbyAuICBtYWtlIEpPQlM9PG4+ICAgICAgICAgICMgUnVuIDxuPiBwYXJhbGxlbCBtYWtlIGpvYnMpCiAJJChpbmZvIC4gICAgICAgICAgICAgICAgICAgICAgICAgIyBOb3RlIHRoYXQgLWpOIGRvZXMgbm90IHdvcmsgYXMgZXhwZWN0ZWQhKQpAQCAtMjgwLDUgKzEyMSwxMSBAQAogCSQoaW5mbyAuICBtYWtlIHRlc3QgVEVTVD08dGVzdD4gICMgT25seSBydW4gdGhlIGdpdmVuIHRlc3Qgb3IgdGVzdHMsIGUuZy4pCiAJJChpbmZvIC4gICAgICAgICAgICAgICAgICAgICAgICAgIyBtYWtlIHRlc3QgVEVTVD0iamRrX2xhbmcgamRrX25ldCIpCiAJJChpbmZvICkKLS5QSE9OWTogaGVscAotRlJDOiAjIEZvcmNlIHRhcmdldAorCitjb25maWd1cmU6CisJQCQoU0hFTEwpICQocm9vdF9kaXIpL2NvbmZpZ3VyZSAkKENPTkZJR1VSRV9BUkdTKQorCUBlY2hvID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlAZWNobyAiTm90ZTogVGhpcyBpcyBhIG5vbi1yZWNvbW1lbmRlZCB3YXkgb2YgcnVubmluZyBjb25maWd1cmUuIgorCUBlY2hvICJJbnN0ZWFkLCBydW4gJ3NoIGNvbmZpZ3VyZScgaW4gdGhlIHRvcC1sZXZlbCBkaXJlY3RvcnkiCisKKy5QSE9OWTogaGVscCBjb25maWd1cmUKZGlmZiAtLWdpdCBhL2NvbW1vbi9tYWtlZmlsZXMvTmF0aXZlQ29tcGlsYXRpb24uZ21rIGIvY29tbW9uL21ha2VmaWxlcy9OYXRpdmVDb21waWxhdGlvbi5nbWsKaW5kZXggZDkzYWYwYi4uNDQxZGZhZiAxMDA2NDQKLS0tIGEvY29tbW9uL21ha2VmaWxlcy9OYXRpdmVDb21waWxhdGlvbi5nbWsKKysrIGIvY29tbW9uL21ha2VmaWxlcy9OYXRpdmVDb21waWxhdGlvbi5nbWsKQEAgLTMyLDEwICszMiwxMCBAQAogZW5kaWYKIAogaWZlcSAoJChDT01QSUxFUl9UWVBFKSxDQykKLSAgICBDT01QSUxJTkdfTVNHPWVjaG8gQ29tcGlsaW5nICQxCi0gICAgTElOS0lOR19NU0c9ZWNobyBMaW5raW5nICQxCi0gICAgTElOS0lOR19FWEVfTVNHPWVjaG8gTGlua2luZyBleGVjdXRhYmxlICQxCi0gICAgQVJDSElWSU5HX01TRz1lY2hvIEFyY2hpdmluZyAkMQorICAgIENPTVBJTElOR19NU0c9ZWNobyAkKExPR19JTkZPKSAiQ29tcGlsaW5nICQobm90ZGlyICQxKSAoZm9yICQobm90ZGlyICQyKSkiCisgICAgTElOS0lOR19NU0c9ZWNobyAkKExPR19JTkZPKSAiTGlua2luZyAkMSIKKyAgICBMSU5LSU5HX0VYRV9NU0c9ZWNobyAkKExPR19JTkZPKSAiTGlua2luZyBleGVjdXRhYmxlICQxIgorICAgIEFSQ0hJVklOR19NU0c9ZWNobyAkKExPR19JTkZPKSAiQXJjaGl2aW5nICQxIgogZWxzZQogICAgIENPTVBJTElOR19NU0c9CiAgICAgTElOS0lOR19NU0c9CkBAIC05NCw3ICs5NCw3IEBACiAKICAgICAgICAgJCQoJDFfJDJfT0JKKSA6ICQyCiAgICAgICAgIGlmZXEgKCQoQ09NUElMRVJfVFlQRSksQ0MpCi0JCSQkKGNhbGwgQ09NUElMSU5HX01TRywkJChub3RkaXIgJDIpKQorCQkkJChjYWxsIENPTVBJTElOR19NU0csJDIsJCQoJDFfVEFSR0VUKSkKIAkJJCQoJDFfJDJfQ09NUCkgJCQoJDFfJDJfRkxBR1MpICQkKCQxXyQyX0RFUF9GTEFHKSAkJCgkMV8kMl9ERVApICQoQ0NfT1VUX09QVElPTikkJCgkMV8kMl9PQkopICQyCiAgICAgICAgIGVuZGlmCiAgICAgICAgIGlmZXEgKCQoQ09NUElMRVJfVFlQRSksQ0wpCkBAIC0xMjksMzAgKzEyOSw4IEBACiAgICAgIyAgICBDQyB0aGUgY29tcGlsZXIgdG8gdXNlLCBkZWZhdWx0IGlzICQoQ0MpCiAgICAgIyAgICBMREVYRSB0aGUgbGlua2VyIHRvIHVzZSBmb3IgbGlua2luZyBleGVjdXRhYmxlcywgZGVmYXVsdCBpcyAkKExERVhFKQogICAgICMgICAgT1BUSU1JWkFUSU9OIHNldHMgb3B0aW1pemF0aW9uIGxldmVsIHRvIE5PTkUsIExPVywgSElHSCwgSElHSEVTVAotICAgICQoaWYgJDIsJDFfJChzdHJpcCAkMikpCi0gICAgJChpZiAkMywkMV8kKHN0cmlwICQzKSkKLSAgICAkKGlmICQ0LCQxXyQoc3RyaXAgJDQpKQotICAgICQoaWYgJDUsJDFfJChzdHJpcCAkNSkpCi0gICAgJChpZiAkNiwkMV8kKHN0cmlwICQ2KSkKLSAgICAkKGlmICQ3LCQxXyQoc3RyaXAgJDcpKQotICAgICQoaWYgJDgsJDFfJChzdHJpcCAkOCkpCi0gICAgJChpZiAkOSwkMV8kKHN0cmlwICQ5KSkKLSAgICAkKGlmICQoMTApLCQxXyQoc3RyaXAgJCgxMCkpKQotICAgICQoaWYgJCgxMSksJDFfJChzdHJpcCAkKDExKSkpCi0gICAgJChpZiAkKDEyKSwkMV8kKHN0cmlwICQoMTIpKSkKLSAgICAkKGlmICQoMTMpLCQxXyQoc3RyaXAgJCgxMykpKQotICAgICQoaWYgJCgxNCksJDFfJChzdHJpcCAkKDE0KSkpCi0gICAgJChpZiAkKDE1KSwkMV8kKHN0cmlwICQoMTUpKSkKLSAgICAkKGlmICQoMTYpLCQxXyQoc3RyaXAgJCgxNikpKQotICAgICQoaWYgJCgxNyksJDFfJChzdHJpcCAkKDE3KSkpCi0gICAgJChpZiAkKDE4KSwkMV8kKHN0cmlwICQoMTgpKSkKLSAgICAkKGlmICQoMTkpLCQxXyQoc3RyaXAgJCgxOSkpKQotICAgICQoaWYgJCgyMCksJDFfJChzdHJpcCAkKDIwKSkpCi0gICAgJChpZiAkKDIxKSwkMV8kKHN0cmlwICQoMjEpKSkKLSAgICAkKGlmICQoMjIpLCQxXyQoc3RyaXAgJCgyMikpKQotICAgICQoaWYgJCgyMyksJDFfJChzdHJpcCAkKDIzKSkpCi0gICAgJChpZiAkKDI0KSwkMV8kKHN0cmlwICQoMjQpKSkKLSAgICAkKGlmICQoMjUpLCQxXyQoc3RyaXAgJCgyNSkpKQorICAgICQoZm9yZWFjaCBpLDIgMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxMyAxNCAxNSAxNiAxNyAxOCAxOSAyMCAyMSAyMiAyMyAyNCAyNSwgJChpZiAkKCRpKSwkMV8kKHN0cmlwICQoJGkpKSkkKE5FV0xJTkUpKQorICAgICQoY2FsbCBMb2dTZXR1cE1hY3JvRW50cnksU2V0dXBOYXRpdmVDb21waWxhdGlvbigkMSksJDIsJDMsJDQsJDUsJDYsJDcsJDgsJDksJCgxMCksJCgxMSksJCgxMiksJCgxMyksJCgxNCksJCgxNSksJCgxNiksJCgxNyksJCgxOCksJCgxOSksJCgyMCksJCgyMSksJCgyMiksJCgyMyksJCgyNCksJCgyNSkpCiAgICAgJChpZiAkKDI2KSwkKGVycm9yIEludGVybmFsIG1ha2VmaWxlIGVycm9yOiBUb28gbWFueSBhcmd1bWVudHMgdG8gU2V0dXBOYXRpdmVDb21waWxhdGlvbiwgcGxlYXNlIHVwZGF0ZSBOYXRpdmVDb21waWxhdGlvbi5nbWspKQogCiAgICAgaWZuZXEgKCwkJCgkMV9CSU4pKQpAQCAtMjM2LDkgKzIxNCw5IEBACiAgICAgICAgICQkKGVycm9yIFlvdSBoYXZlIHRvIHNwZWNpZnkgTEFORyBmb3IgbmF0aXZlIGNvbXBpbGF0aW9uICQxKQogICAgIGVuZGlmCiAgICAgaWZlcSAoQywkJCgkMV9MQU5HKSkKLSAgICBpZmVxICgkJCgkMV9MREVYRSksKQorICAgICAgICBpZmVxICgkJCgkMV9MREVYRSksKQogCSAgICAkMV9MREVYRTo9JChMREVYRSkKLSAgICBlbmRpZgorICAgICAgICBlbmRpZgogCSQxX0xEOj0kKExEKQogICAgIGVsc2UKICAgICAgICBpZmVxIChDKyssJCQoJDFfTEFORykpCkBAIC0yNTQsOSArMjMyLDExIEBACiAgICAgZW5kaWYKIAogICAgICMgTWFrZSBzdXJlIHRoZSBkaXJzIGV4aXN0LgotICAgICQkKHNoZWxsICQoTUtESVIpIC1wICQkKCQxX1NSQykgJCQoJDFfT0JKRUNUX0RJUikgJCQoJDFfT1VUUFVUX0RJUikpCisgICAgJCQoZXZhbCAkJChjYWxsIE1ha2VEaXIsJCQoJDFfT0JKRUNUX0RJUikgJCQoJDFfT1VUUFVUX0RJUikpKQorICAgICQkKGZvcmVhY2ggZCwkJCgkMV9TUkMpLCAkJChpZiAkJCh3aWxkY2FyZCAkJGQpLCwkJChlcnJvciBTUkMgc3BlY2lmaWVkIHRvIFNldHVwTmF0aXZlQ29tcGlsYXRpb24gJDEgY29udGFpbnMgbWlzc2luZyBkaXJlY3RvcnkgJCRkKSkpCisKICAgICAjIEZpbmQgYWxsIGZpbGVzIGluIHRoZSBzb3VyY2UgdHJlZXMuIFNvcnQgdG8gcmVtb3ZlIGR1cGxpY2F0ZXMuCi0gICAgJDFfQUxMX1NSQ1MgOj0gJCQoc29ydCAkJChmb3JlYWNoIGksJCQoJDFfU1JDKSwgJCQoc2hlbGwgJChGSU5EKSAkJGkgLXR5cGUgZikpKQorICAgICQxX0FMTF9TUkNTIDo9ICQkKHNvcnQgJCQoc2hlbGwgJChGSU5EKSAkJCgkMV9TUkMpIC10eXBlIGYpKQogICAgICMgRXh0cmFjdCB0aGUgQy9DKysgZmlsZXMuCiAgICAgJDFfRVhDTFVERV9GSUxFUzo9JCQoZm9yZWFjaCBpLCQkKCQxX1NSQyksJCQoYWRkcHJlZml4ICQkaS8sJCQoJDFfRVhDTFVERV9GSUxFUykpKQogICAgICQxX0lOQ0xVREVfRklMRVM6PSQkKGZvcmVhY2ggaSwkJCgkMV9TUkMpLCQkKGFkZHByZWZpeCAkJGkvLCQkKCQxX0lOQ0xVREVfRklMRVMpKSkKQEAgLTI5MSw3ICsyNzEsOSBAQAogICAgICMgQXJlIHRoZXJlIHRvbyBtYW55IG9iamVjdCBmaWxlcyBvbiBkaXNrPyBQZXJoYXBzIGJlY2F1c2Ugc29tZSBzb3VyY2UgZmlsZSB3YXMgcmVtb3ZlZD8KICAgICAkMV9TVVBFUkZMT1VTX09CSlM6PSQkKHNvcnQgJCQoZmlsdGVyLW91dCAkJCgkMV9FWFBFQ1RFRF9PQkpTKSwkJCgkMV9CSU5TKSkpCiAgICAgIyBDbGVhbiBvdXQgdGhlIHN1cGVyZmx1b3VzIG9iamVjdCBmaWxlcy4KLSAgICAkJChzaGVsbCAkKFJNKSAtZiAkJCgkMV9TVVBFUkZMVU9VU19PQkpTKSkKKyAgICBpZm5lcSAoJCQoJDFfU1VQRVJGTFVPVVNfT0JKUyksKQorICAgICAgICAkJChzaGVsbCAkKFJNKSAtZiAkJCgkMV9TVVBFUkZMVU9VU19PQkpTKSkKKyAgICBlbmRpZgogCiAgICAgIyBQaWNrdXAgZXh0cmEgT1BFTkpES19UQVJHRVRfT1NfQVBJIGFuZC9vciBPUEVOSkRLX1RBUkdFVF9PUyBkZXBlbmRlbnQgdmFyaWFibGVzIGZvciBDRkxBR1MuCiAgICAgJDFfRVhUUkFfQ0ZMQUdTOj0kJCgkMV9DRkxBR1NfJChPUEVOSkRLX1RBUkdFVF9PU19BUEkpKSAkJCgkMV9DRkxBR1NfJChPUEVOSkRLX1RBUkdFVF9PUykpCkBAIC0zNTgsMTEgKzM0MCw2IEBACiAgICAgICAgICQkKGVycm9yIFVua25vd24gdmFsdWUgZm9yIE9QVElNSVpBVElPTjogJCQoJDFfT1BUSU1JWkFUSU9OKSkKICAgICBlbmRpZgogCi0gICAgIyBOb3cgY3JlYXRlIGEgbGlzdCBvZiB0aGUgcGFja2FnZXMgdGhhdCBhcmUgYWJvdXQgdG8gY29tcGlsZS4gVXNlZCB3aGVuIHNlbmRpbmcgc291cmNlCi0gICAgIyBpbiBhIGJhdGNoIHRvIHRoZSBjb21waWxlci4KLSAgICAkJChzaGVsbCAkKFJNKSAkJCgkMV9PQkpFQ1RfRElSKS9fdGhlLmxpc3Rfb2Zfc291cmNlcykKLSAgICAkJChldmFsICQkKGNhbGwgTGlzdFBhdGhzU2FmZWx5Tm93LCQxX1NSQ1MsXG4sID4+ICQkKCQxX09CSkVDVF9ESVIpL190aGUubGlzdF9vZl9zb3VyY2VzKSkKLQogICAgICMgTm93IGNhbGwgYWRkX25hdGl2ZV9zb3VyY2UgZm9yIGVhY2ggc291cmNlIGZpbGUgd2UgYXJlIGdvaW5nIHRvIGNvbXBpbGUuCiAgICAgJCQoZm9yZWFjaCBwLCQkKCQxX1NSQ1MpLFwKICAgICAgICAgJCQoZXZhbCAkJChjYWxsIGFkZF9uYXRpdmVfc291cmNlLCQxLCQkcCwkJCgkMV9PQkpFQ1RfRElSKSxcCkBAIC0zODUsOCArMzYyLDYgQEAKICAgICBlbmRpZgogCiAgICAgIyBtYXBmaWxlIGRvZXNudCBzZWVtIHRvIGJlIGltcGxlbWVudGVkIG9uIG1hY29zeCAoeWV0Pz8pCi0gICAgaWZuZXEgKCQoT1BFTkpES19UQVJHRVRfQ1BVKSxwcGMpCi0gICAgaWZuZXEgKCQoT1BFTkpES19UQVJHRVRfQ1BVKSxhcm0pCiAgICAgaWZuZXEgKCQoT1BFTkpES19UQVJHRVRfT1MpLG1hY29zeCkKICAgICBpZm5lcSAoJChPUEVOSkRLX1RBUkdFVF9PUyksd2luZG93cykKICAgICAgICAgJDFfUkVBTF9NQVBGSUxFOj0kJCgkMV9NQVBGSUxFKQpAQCAtNDAxLDggKzM3Niw2IEBACiAgICAgICAgIGVuZGlmCiAgICAgZW5kaWYKICAgICBlbmRpZgotICAgIGVuZGlmCi0gICAgZW5kaWYKIAogICAgICMgUGlja3VwIGV4dHJhIE9QRU5KREtfVEFSR0VUX09TX0FQSSBhbmQvb3IgT1BFTkpES19UQVJHRVRfT1MgZGVwZW5kZW50IHZhcmlhYmxlcwogICAgICMgZm9yIExERkxBR1MgYW5kIExERkxBR1NfU1VGRklYCkBAIC00NDUsOSArNDE4LDkgQEAKICAgICAgICAgICAgICAgICAgICAgJCQoJDFfT0JKRUNUX0RJUikvJCQoTElCUkFSWV9QUkVGSVgpJCQoJDFfTElCUkFSWSkuZGVidWdpbmZvIDogJCQoJDFfVEFSR0VUKSBcCiAJCQkJCSQoRklYX0VNUFRZX1NFQ19IRFJfRkxBR1MpICQoQUREX0dOVV9ERUJVR0xJTkspCiAJCQkkKFJNKSAkJEAKLQkJCSQoRklYX0VNUFRZX1NFQ19IRFJfRkxBR1MpICQkPAorCQkJJChGSVhfRU1QVFlfU0VDX0hEUl9GTEFHUykgJChMT0dfSU5GTykgJCQ8CiAJCQkkKE9CSkNPUFkpIC0tb25seS1rZWVwLWRlYnVnICQkPCAkJEAKLQkJCSQoQ0QpICQkKEBEKSAmJiAkKEFERF9HTlVfREVCVUdMSU5LKSAkJChARikgJCQ8CisJCQkkKENEKSAkJChARCkgJiYgJChBRERfR05VX0RFQlVHTElOSykgJChMT0dfSU5GTykgJCQoQEYpICQkPAogICAgICAgICAgICAgICAgIGVsc2UgIyBub3Qgc29sYXJpcwogICAgICAgICAgICAgICAgICAgICAkJCgkMV9PQkpFQ1RfRElSKS8kJChMSUJSQVJZX1BSRUZJWCkkJCgkMV9MSUJSQVJZKS5kZWJ1Z2luZm8gOiAkJCgkMV9UQVJHRVQpCiAJCQkkKFJNKSAkJEAKQEAgLTUyMyw5ICs0OTYsOSBAQAogICAgICAgICAgICAgICAgICAgICAkJCgkMV9PQkpFQ1RfRElSKS8kJCgkMV9QUk9HUkFNKS5kZWJ1Z2luZm8gOiAkJCgkMV9UQVJHRVQpIFwKIAkJCQkJJChGSVhfRU1QVFlfU0VDX0hEUl9GTEFHUykgJChBRERfR05VX0RFQlVHTElOSykKIAkJCSQoUk0pICQkQAotCQkJJChGSVhfRU1QVFlfU0VDX0hEUl9GTEFHUykgJCQ8CisJCQkkKEZJWF9FTVBUWV9TRUNfSERSX0ZMQUdTKSAkKExPR19JTkZPKSAkJDwKIAkJCSQoT0JKQ09QWSkgLS1vbmx5LWtlZXAtZGVidWcgJCQ8ICQkQAotCQkJJChDRCkgJCQoQEQpICYmICQoQUREX0dOVV9ERUJVR0xJTkspICQkKEBGKSAkJDwKKwkJCSQoQ0QpICQkKEBEKSAmJiAkKEFERF9HTlVfREVCVUdMSU5LKSAkKExPR19JTkZPKSAkJChARikgJCQ8CiAgICAgICAgICAgICAgICAgZWxzZSAjIG5vdCBzb2xhcmlzCiAgICAgICAgICAgICAgICAgICAgICQkKCQxX09CSkVDVF9ESVIpLyQkKCQxX1BST0dSQU0pLmRlYnVnaW5mbyA6ICQkKCQxX1RBUkdFVCkKIAkJCSQoUk0pICQkQApAQCAtNTY0LDcgKzUzNyw3IEBACiAJCQkkJCgkMV9FWFBFQ1RFRF9PQkpTKSAkJCgkMV9SRVMpICQkKCQxX0xERkxBR1NfU1VGRklYKSBcCiAJCQkkJCgkMV9FWFRSQV9MREZMQUdTX1NVRkZJWCkKICAgICAgICAgaWZuZXEgKCwkJCgkMV9HRU5fTUFOSUZFU1QpKQotCQkkKE1UKSAtbm9sb2dvIC9tYW5pZmVzdCAkJCgkMV9HRU5fTUFOSUZFU1QpIC9vdXRwdXRyZXNvdXJjZTokJEA7IzEKKwkJJChNVCkgLW5vbG9nbyAtbWFuaWZlc3QgJCQoJDFfR0VOX01BTklGRVNUKSAtb3V0cHV0cmVzb3VyY2U6JCRAOyMxCiAgICAgICAgIGVuZGlmCiAKICAgICBlbmRpZgpkaWZmIC0tZ2l0IGEvY29tbW9uL21ha2VmaWxlcy9STUlDb21waWxhdGlvbi5nbWsgYi9jb21tb24vbWFrZWZpbGVzL1JNSUNvbXBpbGF0aW9uLmdtawppbmRleCA2NWJhOWU2Li5mZDMzMmI0IDEwMDY0NAotLS0gYS9jb21tb24vbWFrZWZpbGVzL1JNSUNvbXBpbGF0aW9uLmdtaworKysgYi9jb21tb24vbWFrZWZpbGVzL1JNSUNvbXBpbGF0aW9uLmdtawpAQCAtMzQsMTYgKzM0LDkgQEAKICAgICAjICAgUlVOX0lJT1A6PVNldCB0byBydW4gcm1pYyB3aXRoIC1paW9wCiAgICAgIyAgIFJVTl9JSU9QX1NURFBLRzo9U2V0IHRvIHJ1biBybWljIHdpdGggLWlpb3AgLXN0YW5kYXJkUGFja2FnZQogICAgICMgICBLRUVQX0dFTkVSQVRFRDo9U2V0IHRvIGtlZXAgZ2VuZXJhdGVkIHNvdXJjZXMgYXJvdW5kCi0gICAgJChpZiAkMiwkMV8kKHN0cmlwICQyKSkKLSAgICAkKGlmICQzLCQxXyQoc3RyaXAgJDMpKQotICAgICQoaWYgJDQsJDFfJChzdHJpcCAkNCkpCi0gICAgJChpZiAkNSwkMV8kKHN0cmlwICQ1KSkKLSAgICAkKGlmICQ2LCQxXyQoc3RyaXAgJDYpKQotICAgICQoaWYgJDcsJDFfJChzdHJpcCAkNykpCi0gICAgJChpZiAkOCwkMV8kKHN0cmlwICQ4KSkKLSAgICAkKGlmICQ5LCQxXyQoc3RyaXAgJDkpKQotICAgICQoaWYgJCgxMCksJChlcnJvciBJbnRlcm5hbCBtYWtlZmlsZSBlcnJvcjogVG9vIG1hbnkgYXJndW1lbnRzIHRvIFNldHVwUk1JQ29tcGlsYXRpb24sIHBsZWFzZSB1cGRhdGUgUk1JQ29tcGlsYXRpb24uZ21rKSkKLQorICAgICQoZm9yZWFjaCBpLDIgMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxMyAxNCAxNSwgJChpZiAkKCRpKSwkMV8kKHN0cmlwICQoJGkpKSkkKE5FV0xJTkUpKQorICAgICQoY2FsbCBMb2dTZXR1cE1hY3JvRW50cnksU2V0dXBSTUlDb21waWxhdGlvbigkMSksJDIsJDMsJDQsJDUsJDYsJDcsJDgsJDksJCgxMCksJCgxMSksJCgxMiksJCgxMyksJCgxNCksJCgxNSkpCisgICAgJChpZiAkKDE2KSwkKGVycm9yIEludGVybmFsIG1ha2VmaWxlIGVycm9yOiBUb28gbWFueSBhcmd1bWVudHMgdG8gU2V0dXBSTUlDb21waWxhdGlvbiwgcGxlYXNlIHVwZGF0ZSBSTUlDb21waWxhdGlvbi5nbWspKQogCiAgICAgJDFfREVQX0ZJTEUgOj0gJCQoJDFfU1RVQl9DTEFTU0VTX0RJUikvJDFfcm1pYwogCkBAIC04NiwxMiArNzksMTIgQEAKICAgICAkJCgkMV9ERVBfRklMRSk6ICQkKCQxX0NMQVNTX0ZJTEVTKQogCSQoTUtESVIpIC1wICQkKCQxX1NUVUJfQ0xBU1NFU19ESVIpCiAJaWYgWyAieCQkKCQxX0FSR1MpIiAhPSAieCIgXTsgdGhlbiBcCi0JICAgICQoRUNITykgUnVubmluZyBybWljICQkKCQxX0FSR1MpIGZvciAkJCgkMV9ET0xMQVJfU0FGRV9DTEFTU0VTKSAmJlwKKwkgICAgJChFQ0hPKSAkKExPR19JTkZPKSBSdW5uaW5nIHJtaWMgJCQoJDFfQVJHUykgZm9yICQkKCQxX0RPTExBUl9TQUZFX0NMQVNTRVMpICYmXAogCSAgICAkKFJNSUMpICQkKCQxX0FSR1MpIC1jbGFzc3BhdGggIiQkKCQxX0NMQVNTRVNfRElSKSIgXAogCQkJLWQgJCQoJDFfU1RVQl9DTEFTU0VTX0RJUikgJCQoJDFfRE9MTEFSX1NBRkVfQ0xBU1NFUyk7XAogCWZpOwogCWlmIFsgIngkJCgkMV9BUkdTMikiICE9ICJ4IiBdOyB0aGVuIFwKLQkgICAgJChFQ0hPKSBSdW5uaW5nIHJtaWMgJCQoJDFfQVJHUzIpIGZvciAkJCgkMV9ET0xMQVJfU0FGRV9DTEFTU0VTKSAmJlwKKwkgICAgJChFQ0hPKSAkKExPR19JTkZPKSBSdW5uaW5nIHJtaWMgJCQoJDFfQVJHUzIpIGZvciAkJCgkMV9ET0xMQVJfU0FGRV9DTEFTU0VTKSAmJlwKIAkgICAgJChSTUlDKSAkJCgkMV9BUkdTMikgLWNsYXNzcGF0aCAiJCQoJDFfQ0xBU1NFU19ESVIpIiBcCiAJCQktZCAkJCgkMV9TVFVCX0NMQVNTRVNfRElSKSAkJCgkMV9ET0xMQVJfU0FGRV9DTEFTU0VTKTtcCiAJZmk7CmRpZmYgLS1naXQgYS9jb21tb24vbWFrZWZpbGVzL2NvbXByZXNzLnBvc3QgYi9jb21tb24vbWFrZWZpbGVzL3N1cHBvcnQvTGlzdFBhdGhzU2FmZWx5LXBvc3QtY29tcHJlc3MuaW5jbApzaW1pbGFyaXR5IGluZGV4IDk3JQpyZW5hbWUgZnJvbSBjb21tb24vbWFrZWZpbGVzL2NvbXByZXNzLnBvc3QKcmVuYW1lIHRvIGNvbW1vbi9tYWtlZmlsZXMvc3VwcG9ydC9MaXN0UGF0aHNTYWZlbHktcG9zdC1jb21wcmVzcy5pbmNsCmluZGV4IDA2YjQ0YzQuLmQ4Y2NmMjIgMTAwNjQ0Ci0tLSBhL2NvbW1vbi9tYWtlZmlsZXMvY29tcHJlc3MucG9zdAorKysgYi9jb21tb24vbWFrZWZpbGVzL3N1cHBvcnQvTGlzdFBhdGhzU2FmZWx5LXBvc3QtY29tcHJlc3MuaW5jbApAQCAtMSArMSBAQAotKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpCmRpZmYgLS1naXQgYS9jb21tb24vbWFrZWZpbGVzL2NvbXByZXNzLnByZSBiL2NvbW1vbi9tYWtlZmlsZXMvc3VwcG9ydC9MaXN0UGF0aHNTYWZlbHktcHJlLWNvbXByZXNzLmluY2wKc2ltaWxhcml0eSBpbmRleCA5OSUKcmVuYW1lIGZyb20gY29tbW9uL21ha2VmaWxlcy9jb21wcmVzcy5wcmUKcmVuYW1lIHRvIGNvbW1vbi9tYWtlZmlsZXMvc3VwcG9ydC9MaXN0UGF0aHNTYWZlbHktcHJlLWNvbXByZXNzLmluY2wKaW5kZXggZmY0MTEzNC4uNzIzMGM2YyAxMDA2NDQKLS0tIGEvY29tbW9uL21ha2VmaWxlcy9jb21wcmVzcy5wcmUKKysrIGIvY29tbW9uL21ha2VmaWxlcy9zdXBwb3J0L0xpc3RQYXRoc1NhZmVseS1wcmUtY29tcHJlc3MuaW5jbApAQCAtMSArMSBAQAotJChzdWJzdCBjb20sWDAxLCQoc3Vic3Qgb3JnLFgwMiwkKHN1YnN0IHN1bixYMDMsJChzdWJzdCBqYXZhLFgwNCwkKHN1YnN0IGphdmF4LFgwNSwkKHN1YnN0IHN1bi9pbyxYMDYsJChzdWJzdCBjb20vc3VuLFgwNywkKHN1YnN0IGphdmEvaW8sWDA4LCQoc3Vic3Qgb3JnL29tZyxYMDksJChzdWJzdCBvcmcvdzNjLFgxMCwkKHN1YnN0IG9yZy94bWwsWDExLCQoc3Vic3Qgc3VuL2F3dCxYMTIsJChzdWJzdCBzdW4vbmV0LFgxMywkKHN1YnN0IHN1bi9uaW8sWDE0LCQoc3Vic3Qgc3VuL3JtaSxYMTUsJChzdWJzdCBqYXZhL2F3dCxYMTYsJChzdWJzdCBqYXZhL25ldCxYMTcsJChzdWJzdCBqYXZhL25pbyxYMTgsJChzdWJzdCBqYXZhL3JtaSxYMTksJChzdWJzdCBNRVRBLUlORixYMjAsJChzdWJzdCBzdW4vZm9udCxYMjEsJChzdWJzdCBzdW4vbWlzYyxYMjIsJChzdWJzdCBzdW4vdGV4dCxYMjMsJChzdWJzdCBzdW4vdXRpbCxYMjQsJChzdWJzdCBqYXZhL2xhbmcsWDI1LCQoc3Vic3QgamF2YS9tYXRoLFgyNiwkKHN1YnN0IGphdmEvdGV4dCxYMjcsJChzdWJzdCBqYXZhL3V0aWwsWDI4LCQoc3Vic3QgamF2YXgvandzLFgyOSwkKHN1YnN0IGphdmF4L25ldCxYMzAsJChzdWJzdCBqYXZheC9ybWksWDMxLCQoc3Vic3QgamF2YXgveG1sLFgzMiwkKHN1YnN0IHN1bi9jb3JiYSxYMzMsJChzdWJzdCBzdW4vcHJpbnQsWDM0LCQoc3Vic3Qgc3VuL3N3aW5nLFgzNSwkKHN1YnN0IGphdmEvYmVhbnMsWDM2LCQoc3Vic3QgamF2YXgvbGFuZyxYMzcsJChzdWJzdCBzdW4vYXBwbGV0LFgzOCwkKHN1YnN0IHN1bi9qYXZhMmQsWDM5LCQoc3Vic3QgamF2YS9hcHBsZXQsWDQwLCQoc3Vic3QgamF2YXgvcHJpbnQsWDQxLCQoc3Vic3QgamF2YXgvc291bmQsWDQyLCQoc3Vic3QgamF2YXgvc3dpbmcsWDQzLCQoc3Vic3QgamF2YXgvdG9vbHMsWDQ0LCQoc3Vic3QgamRrL2NsYXNzZXMsWDQ1LCQoc3Vic3Qgb3JnL3JlbGF4bmcsWDQ2LCQoc3Vic3Qgc3VuL3JlZmxlY3QsWDQ3LCQoc3Vic3QgamF2YXgvY3J5cHRvLFg0OCwkKHN1YnN0IGphdmF4L25hbWluZyxYNDksJChzdWJzdCBqYXhwL2NsYXNzZXMsWDUwLCQoc3Vic3Qgc3VuL3NlY3VyaXR5LFg1MSwkKHN1YnN0IGNvcmJhL2NsYXNzZXMsWDUyLCQoc3Vic3QgamF2YS9zZWN1cml0eSxYNTMsJChzdWJzdCBqYXZheC9pbWFnZWlvLFg1NCwkKHN1YnN0IGpkay9idGNsYXNzZXMsWDU1LCQoc3Vic3QgamF2YXgvYWN0aXZpdHksWDU2LCQoc3Vic3QgamF2YXgvc2VjdXJpdHksWDU3LCQoc3Vic3QgamRrL25ld2NsYXNzZXMsWDU4LCQoc3Vic3Qgc3VuL2luc3RydW1lbnQsWDU5LCQoc3Vic3Qgc3VuL21hbmFnZW1lbnQsWDYwLCQoc3Vic3QgY29yYmEvYnRjbGFzc2VzLFg2MSwkKHN1YnN0IGpkay9kZW1vY2xhc3NlcyxYNjIsJChzdWJzdCBqYXZheC9hY3RpdmF0aW9uLFg2MywkKHN1YnN0IGphdmF4L2Fubm90YXRpb24sWDY0LCQoc3Vic3QgamF2YXgvbWFuYWdlbWVudCxYNjUsJChzdWJzdCBqYXZheC90cmFuc2FjdGlvbixYNjYsJChzdWJzdCBqYXh3cy9qYWZfY2xhc3NlcyxYNjcsJChzdWJzdCBsYW5ndG9vbHMvY2xhc3NlcyxYNjgsJChzdWJzdCBNRVRBLUlORi9zZXJ2aWNlcyxYNjksJChzdWJzdCBqZGsvbmV3ZGVtb2NsYXNzZXMsWDcwLCQoc3Vic3QgamF2YXgvYWNjZXNzaWJpbGl0eSxYNzEsJChzdWJzdCBqYXh3cy9qYXh3c19jbGFzc2VzLFg3MiwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCiskKHN1YnN0IGNvbSxYMDEsJChzdWJzdCBvcmcsWDAyLCQoc3Vic3Qgc3VuLFgwMywkKHN1YnN0IGphdmEsWDA0LCQoc3Vic3QgamF2YXgsWDA1LCQoc3Vic3Qgc3VuL2lvLFgwNiwkKHN1YnN0IGNvbS9zdW4sWDA3LCQoc3Vic3QgamF2YS9pbyxYMDgsJChzdWJzdCBvcmcvb21nLFgwOSwkKHN1YnN0IG9yZy93M2MsWDEwLCQoc3Vic3Qgb3JnL3htbCxYMTEsJChzdWJzdCBzdW4vYXd0LFgxMiwkKHN1YnN0IHN1bi9uZXQsWDEzLCQoc3Vic3Qgc3VuL25pbyxYMTQsJChzdWJzdCBzdW4vcm1pLFgxNSwkKHN1YnN0IGphdmEvYXd0LFgxNiwkKHN1YnN0IGphdmEvbmV0LFgxNywkKHN1YnN0IGphdmEvbmlvLFgxOCwkKHN1YnN0IGphdmEvcm1pLFgxOSwkKHN1YnN0IE1FVEEtSU5GLFgyMCwkKHN1YnN0IHN1bi9mb250LFgyMSwkKHN1YnN0IHN1bi9taXNjLFgyMiwkKHN1YnN0IHN1bi90ZXh0LFgyMywkKHN1YnN0IHN1bi91dGlsLFgyNCwkKHN1YnN0IGphdmEvbGFuZyxYMjUsJChzdWJzdCBqYXZhL21hdGgsWDI2LCQoc3Vic3QgamF2YS90ZXh0LFgyNywkKHN1YnN0IGphdmEvdXRpbCxYMjgsJChzdWJzdCBqYXZheC9qd3MsWDI5LCQoc3Vic3QgamF2YXgvbmV0LFgzMCwkKHN1YnN0IGphdmF4L3JtaSxYMzEsJChzdWJzdCBqYXZheC94bWwsWDMyLCQoc3Vic3Qgc3VuL2NvcmJhLFgzMywkKHN1YnN0IHN1bi9wcmludCxYMzQsJChzdWJzdCBzdW4vc3dpbmcsWDM1LCQoc3Vic3QgamF2YS9iZWFucyxYMzYsJChzdWJzdCBqYXZheC9sYW5nLFgzNywkKHN1YnN0IHN1bi9hcHBsZXQsWDM4LCQoc3Vic3Qgc3VuL2phdmEyZCxYMzksJChzdWJzdCBqYXZhL2FwcGxldCxYNDAsJChzdWJzdCBqYXZheC9wcmludCxYNDEsJChzdWJzdCBqYXZheC9zb3VuZCxYNDIsJChzdWJzdCBqYXZheC9zd2luZyxYNDMsJChzdWJzdCBqYXZheC90b29scyxYNDQsJChzdWJzdCBqZGsvY2xhc3NlcyxYNDUsJChzdWJzdCBvcmcvcmVsYXhuZyxYNDYsJChzdWJzdCBzdW4vcmVmbGVjdCxYNDcsJChzdWJzdCBqYXZheC9jcnlwdG8sWDQ4LCQoc3Vic3QgamF2YXgvbmFtaW5nLFg0OSwkKHN1YnN0IGpheHAvY2xhc3NlcyxYNTAsJChzdWJzdCBzdW4vc2VjdXJpdHksWDUxLCQoc3Vic3QgY29yYmEvY2xhc3NlcyxYNTIsJChzdWJzdCBqYXZhL3NlY3VyaXR5LFg1MywkKHN1YnN0IGphdmF4L2ltYWdlaW8sWDU0LCQoc3Vic3QgamRrL2J0Y2xhc3NlcyxYNTUsJChzdWJzdCBqYXZheC9hY3Rpdml0eSxYNTYsJChzdWJzdCBqYXZheC9zZWN1cml0eSxYNTcsJChzdWJzdCBqZGsvbmV3Y2xhc3NlcyxYNTgsJChzdWJzdCBzdW4vaW5zdHJ1bWVudCxYNTksJChzdWJzdCBzdW4vbWFuYWdlbWVudCxYNjAsJChzdWJzdCBjb3JiYS9idGNsYXNzZXMsWDYxLCQoc3Vic3QgamRrL2RlbW9jbGFzc2VzLFg2MiwkKHN1YnN0IGphdmF4L2FjdGl2YXRpb24sWDYzLCQoc3Vic3QgamF2YXgvYW5ub3RhdGlvbixYNjQsJChzdWJzdCBqYXZheC9tYW5hZ2VtZW50LFg2NSwkKHN1YnN0IGphdmF4L3RyYW5zYWN0aW9uLFg2NiwkKHN1YnN0IGpheHdzL2phZl9jbGFzc2VzLFg2NywkKHN1YnN0IGxhbmd0b29scy9jbGFzc2VzLFg2OCwkKHN1YnN0IE1FVEEtSU5GL3NlcnZpY2VzLFg2OSwkKHN1YnN0IGpkay9uZXdkZW1vY2xhc3NlcyxYNzAsJChzdWJzdCBqYXZheC9hY2Nlc3NpYmlsaXR5LFg3MSwkKHN1YnN0IGpheHdzL2pheHdzX2NsYXNzZXMsWDcyLApkaWZmIC0tZ2l0IGEvY29tbW9uL21ha2VmaWxlcy91bmNvbXByZXNzLnNlZCBiL2NvbW1vbi9tYWtlZmlsZXMvc3VwcG9ydC9MaXN0UGF0aHNTYWZlbHktdW5jb21wcmVzcy5zZWQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGNvbW1vbi9tYWtlZmlsZXMvdW5jb21wcmVzcy5zZWQKcmVuYW1lIHRvIGNvbW1vbi9tYWtlZmlsZXMvc3VwcG9ydC9MaXN0UGF0aHNTYWZlbHktdW5jb21wcmVzcy5zZWQKZGlmZiAtLWdpdCBhL2NvbW1vbi9iaW4vdW5pY29kZTJ4LnNlZCBiL2NvbW1vbi9tYWtlZmlsZXMvc3VwcG9ydC91bmljb2RlMnguc2VkCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb21tb24vYmluL3VuaWNvZGUyeC5zZWQKcmVuYW1lIHRvIGNvbW1vbi9tYWtlZmlsZXMvc3VwcG9ydC91bmljb2RlMnguc2VkCmRpZmYgLS1naXQgYS9jb21tb24vc3JjL3VuY3lnZHJpdmUuYyBiL2NvbW1vbi9zcmMvZml4cGF0aC5jCnNpbWlsYXJpdHkgaW5kZXggNjYlCnJlbmFtZSBmcm9tIGNvbW1vbi9zcmMvdW5jeWdkcml2ZS5jCnJlbmFtZSB0byBjb21tb24vc3JjL2ZpeHBhdGguYwppbmRleCA0MzhlMjE0Li44MzVmNmI3IDEwMDY0NAotLS0gYS9jb21tb24vc3JjL3VuY3lnZHJpdmUuYworKysgYi9jb21tb24vc3JjL2ZpeHBhdGguYwpAQCAtNTgsNyArNTgsNyBAQAogICogV29ya3MgaW4gcGxhY2Ugc2luY2UgZHJpdmUgbGV0dGVyIGlzIGFsd2F5cwogICogc2hvcnRlciB0aGFuIC9jeWdkcml2ZS8KICAqLwotY2hhciAqcmVwbGFjZV9jeWdkcml2ZShjaGFyICppbikKK2NoYXIgKnJlcGxhY2VfY3lnZHJpdmVfY3lnd2luKGNoYXIgKmluKQogewogICBpbnQgbGVuID0gc3RybGVuKGluKTsKICAgY2hhciAqb3V0ID0gbWFsbG9jKGxlbisxKTsKQEAgLTExOSw2ICsxMTksNjEgQEAKICAgcmV0dXJuIG91dDsKIH0KIAorY2hhciogbXN5c19wYXRoX2xpc3Q7IC8vIEAtc2VwYXJhdGVkIGxpc3Qgb2YgcGF0aHMgcHJlZml4IHRvIGxvb2sgZm9yCitjaGFyKiBtc3lzX3BhdGhfbGlzdF9lbmQ7IC8vIFBvaW50cyB0byBsYXN0IFwwIGluIG1zeXNfcGF0aF9saXN0LgorCit2b2lkIHNldHVwX21zeXNfcGF0aF9saXN0KGNoYXIqIGFyZ3VtZW50KQoreworICBjaGFyKiBwOworICBjaGFyKiBkcml2ZV9sZXR0ZXJfcG9zOworCisgIG1zeXNfcGF0aF9saXN0ID0gc3RyZHVwKCZhcmd1bWVudFsyXSk7CisgIG1zeXNfcGF0aF9saXN0X2VuZCA9ICZtc3lzX3BhdGhfbGlzdFtzdHJsZW4obXN5c19wYXRoX2xpc3QpXTsKKworICAvLyBDb252ZXJ0IGFsbCBhdC1zaWduIChAKSBpbiBwYXRoIGxpc3QgdG8gXDAuCisgIC8vIEAgd2FzIGNob3NlbiBhcyBzZXBhcmF0b3IgdG8gbWluaW1pemUgcmlzayBvZiBvdGhlciB0b29scyBtZXNzaW5nIGFyb3VuZCB3aXRoIGl0CisgIHAgPSBtc3lzX3BhdGhfbGlzdDsKKyAgZG8geworICAgIGlmIChwWzFdID09ICc6JykgeworICAgICAgLy8gbXN5cyBoYXMgbWFuZ2xlZCBvdXIgcGF0aCBsaXN0LCByZXN0b3JlIGl0IGZyb20gYzovLi4uIHRvIC9jLy4uLgorICAgICAgZHJpdmVfbGV0dGVyX3BvcyA9IHArMTsKKyAgICAgICpkcml2ZV9sZXR0ZXJfcG9zID0gKnA7CisgICAgICAqcCA9ICcvJzsKKyAgICB9CisKKyAgICAvLyBMb29rIGZvciBhbiBAIGluIHRoZSBsaXN0CisgICAgcCA9IHN0cmNocihwLCAnQCcpOworICAgIGlmIChwICE9IE5VTEwpIHsKKyAgICAgICpwID0gJ1wwJzsKKyAgICAgIHArKzsKKyAgICB9CisgIH0gd2hpbGUgKHAgIT0gTlVMTCk7Cit9CisKK2NoYXIgKnJlcGxhY2VfY3lnZHJpdmVfbXN5cyhjaGFyICppbikKK3sKKyAgY2hhciogc3RyOworICBjaGFyKiBwcmVmaXg7CisgIGNoYXIqIHA7CisKKyAgc3RyID0gc3RyZHVwKGluKTsKKworICAvLyBGb3IgZWFjaCBwcmVmaXggaW4gdGhlIHBhdGggbGlzdCwgc2VhcmNoIGZvciBpdCBhbmQgcmVwbGFjZSAvYy8uLi4gd2l0aCBjOi8uLi4KKyAgZm9yIChwcmVmaXggPSBtc3lzX3BhdGhfbGlzdDsgcHJlZml4IDwgbXN5c19wYXRoX2xpc3RfZW5kICYmIHByZWZpeCAhPSBOVUxMOyBwcmVmaXggKz0gc3RybGVuKHByZWZpeCkrMSkgeworICAgIHA9c3RyOworICAgIHdoaWxlICgocCA9IHN0cnN0cihwLCBwcmVmaXgpKSkgeworICAgICAgY2hhciogZHJpdmVfbGV0dGVyID0gcCsxOworICAgICAgKnAgPSAqZHJpdmVfbGV0dGVyOworICAgICAgKmRyaXZlX2xldHRlciA9ICc6JzsKKyAgICAgIHArKzsKKyAgICB9CisgIH0KKworICByZXR1cm4gc3RyOworfQorCitjaGFyKigqcmVwbGFjZV9jeWdkcml2ZSkoY2hhciAqaW4pID0gTlVMTDsKKwogY2hhciAqZmlsZXNfdG9fZGVsZXRlWzEwMjRdOwogaW50IG51bV9maWxlc190b19kZWxldGUgPSAwOwogCkBAIC0xNTgsNyArMjEzLDcgQEAKIAogICBhdG91dCA9IGZvcGVuKG5hbWUsICJ3Iik7CiAgIGlmIChhdG91dCA9PSBOVUxMKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBvcGVuIHRlbXBvcmFyeSBmaWxlIGZvciB3cml0aW5nISAlc1xuIiwgbmFtZSk7CisgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3Qgb3BlbiB0ZW1wb3JhcnkgZmlsZSBmb3Igd3JpdGluZyEgJXNcbiIsIG5hbWUpOwogICAgIGV4aXQoLTEpOwogICB9CiAKQEAgLTE2Nyw3ICsyMjIsMTMgQEAKICAgICBhcHBlbmQoJmJ1ZmZlciwgJmJ1ZmxlbiwgJnVzZWQsIGJsb2NrLCBibG9ja2xlbik7CiAgIH0KICAgYnVmZmVyW3VzZWRdID0gMDsKKyAgaWYgKGdldGVudigiREVCVUdfRklYUEFUSCIpICE9IE5VTEwpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgImZpeHBhdGggaW5wdXQgZnJvbSBALWZpbGUgJXM6ICVzXG4iLCAmaW5bMV0sIGJ1ZmZlcik7CisgIH0KICAgZml4ZWQgPSByZXBsYWNlX2N5Z2RyaXZlKGJ1ZmZlcik7CisgIGlmIChnZXRlbnYoIkRFQlVHX0ZJWFBBVEgiKSAhPSBOVUxMKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJmaXhwYXRoIGNvbnZlcnRlZCB0byBALWZpbGUgJXMgaXM6ICVzXG4iLCBuYW1lLCBmaXhlZCk7CisgIH0KICAgZndyaXRlKGZpeGVkLCBzdHJsZW4oZml4ZWQpLCAxLCBhdG91dCk7CiAgIGZjbG9zZShhdGluKTsKICAgZmNsb3NlKGF0b3V0KTsKQEAgLTE5NCwxMiArMjU1LDMxIEBACiAgICAgaW50IGk7CiAgICAgRFdPUkQgZXhpdENvZGU7CiAKLSAgICBpZiAoYXJnYzwyKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiVXNhZ2U6IHVuY3lnZHJpdmUuZXhlIC9jeWdkcml2ZS9jL1dJTkRPV1Mvbm90ZXBhZC5leGUgL2N5Z2RyaXZlL2MveC90ZXN0LnR4dCIpOworICAgIGlmIChhcmdjPDMgfHwgYXJndlsxXVswXSAhPSAnLScgfHwgKGFyZ3ZbMV1bMV0gIT0gJ2MnICYmIGFyZ3ZbMV1bMV0gIT0gJ20nKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiBmaXhwYXRoIC1jfG08cGF0aEBwYXRoQC4uLj4gL2N5Z2RyaXZlL2MvV0lORE9XUy9ub3RlcGFkLmV4ZSAvY3lnZHJpdmUvYy94L3Rlc3QudHh0Iik7CiAgICAgICAgIGV4aXQoMCk7CiAgICAgfQogCi0gICAgbGluZSA9IHJlcGxhY2VfY3lnZHJpdmUoc3Ryc3RyKEdldENvbW1hbmRMaW5lKCksIGFyZ3ZbMV0pKTsKKyAgICBpZiAoZ2V0ZW52KCJERUJVR19GSVhQQVRIIikgIT0gTlVMTCkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJmaXhwYXRoIGlucHV0IGxpbmUgPiVzPFxuIiwgc3Ryc3RyKEdldENvbW1hbmRMaW5lKCksIGFyZ3ZbMV0pKTsKKyAgICB9CisKKyAgICBpZiAoYXJndlsxXVsxXSA9PSAnYycgJiYgYXJndlsxXVsyXSA9PSAnXDAnKSB7CisgICAgICBpZiAoZ2V0ZW52KCJERUJVR19GSVhQQVRIIikgIT0gTlVMTCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInVzaW5nIGN5Z3dpbiBtb2RlXG4iKTsKKyAgICAgIH0KKyAgICAgIHJlcGxhY2VfY3lnZHJpdmUgPSByZXBsYWNlX2N5Z2RyaXZlX2N5Z3dpbjsKKyAgICB9IGVsc2UgaWYgKGFyZ3ZbMV1bMV0gPT0gJ20nKSB7CisgICAgICBpZiAoZ2V0ZW52KCJERUJVR19GSVhQQVRIIikgIT0gTlVMTCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInVzaW5nIG1zeXMgbW9kZSwgd2l0aCBwYXRoIGxpc3Q6ICVzXG4iLCAmYXJndlsxXVsyXSk7CisgICAgICB9CisgICAgICBzZXR1cF9tc3lzX3BhdGhfbGlzdChhcmd2WzFdKTsKKyAgICAgIHJlcGxhY2VfY3lnZHJpdmUgPSByZXBsYWNlX2N5Z2RyaXZlX21zeXM7CisgICAgfSBlbHNlIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiVW5rbm93biBtb2RlOiAlc1xuIiwgYXJndlsxXSk7CisgICAgICBleGl0KC0xKTsKKyAgICB9CisgICAgbGluZSA9IHJlcGxhY2VfY3lnZHJpdmUoc3Ryc3RyKEdldENvbW1hbmRMaW5lKCksIGFyZ3ZbMl0pKTsKIAogICAgIGZvciAoaT0xOyBpPGFyZ2M7ICsraSkgewogICAgICAgIGlmIChhcmd2W2ldWzBdID09ICdAJykgewpAQCAtMjEwLDggKzI5MCw4IEBACiAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChnZXRlbnYoIkRFQlVHX1VOQ1lHRFJJVkUiKSAhPSBOVUxMKSB7Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgInVuY3lnZHJpdmUgPiVzPFxuIiwgbGluZSk7CisgICAgaWYgKGdldGVudigiREVCVUdfRklYUEFUSCIpICE9IE5VTEwpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiZml4cGF0aCBjb252ZXJ0ZWQgbGluZSA+JXM8XG4iLCBsaW5lKTsKICAgICB9CiAKICAgICBaZXJvTWVtb3J5KCZzaSxzaXplb2Yoc2kpKTsKQEAgLTIzOCw5ICszMTgsOSBAQAogICAgIFdhaXRGb3JTaW5nbGVPYmplY3QocGkuaFByb2Nlc3MsSU5GSU5JVEUpOwogICAgIEdldEV4aXRDb2RlUHJvY2VzcyhwaS5oUHJvY2VzcywmZXhpdENvZGUpOwogCi0gICAgaWYgKGdldGVudigiREVCVUdfVU5DWUdEUklWRSIpICE9IE5VTEwpIHsKKyAgICBpZiAoZ2V0ZW52KCJERUJVR19GSVhQQVRIIikgIT0gTlVMTCkgewogICAgICAgZm9yIChpPTA7IGk8bnVtX2ZpbGVzX3RvX2RlbGV0ZTsgKytpKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiTm90IGRlbGV0aW5nIHRlbXBvcmFyeSB1bmN5Z2RyaXZlIGZpbGUgJXNcbiIsCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiTm90IGRlbGV0aW5nIHRlbXBvcmFyeSBmaXhwYXRoIGZpbGUgJXNcbiIsCiAgICAgICAgICAgICAgICAgZmlsZXNfdG9fZGVsZXRlW2ldKTsKICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9jb25maWd1cmUgYi9jb25maWd1cmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJiMWRhMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbmZpZ3VyZQpAQCAtMCwwICsxLDI5IEBACisjIS9iaW4vYmFzaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyMKKyMgVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyMgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisjIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyMgMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisjCisjIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCisjIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKKyMgcXVlc3Rpb25zLgorIworCisjIFRoaXMgaXMgYSB0aGluIHdyYXBwZXIgd2hpY2ggd2lsbCBjYWxsIHRoZSByZWFsIGNvbmZpZ3VyZSBzY3JpcHQsIGFuZAorIyBtYWtlIHN1cmUgdGhhdCBpcyBjYWxsZWQgdXNpbmcgYmFzaC4KKwordGhpc19zY3JpcHRfZGlyPWBkaXJuYW1lICQwYAorYmFzaCAkdGhpc19zY3JpcHRfZGlyL2NvbW1vbi9hdXRvY29uZi9jb25maWd1cmUgIiRAIgpkaWZmIC0tZ2l0IGEvY29yYmEvLmhndGFncyBiL2NvcmJhLy5oZ3RhZ3MKaW5kZXggNjhmYjk3NC4uMTEyMTEwYyAxMDA2NDQKLS0tIGEvY29yYmEvLmhndGFncworKysgYi9jb3JiYS8uaGd0YWdzCkBAIC0xODMsMyArMTgzLDQgQEAKIGQ1NGRjNTNlMjIzZWQ5Y2U3ZDVmNGQyY2QwMmFkOWQ1ZGVmM2MyZGIgamRrOC1iNTkKIDIwN2VmNDNiYTY5ZWFkNmNiYmFiNDE1ZDgxODM0NTQ1ZTRkNDY3NDcgamRrOC1iNjAKIDBlMDhiYTc2NDhmYjNmYWEwOTg2Y2IyMTc4ODdkN2M0OTkwOTc3ZjMgamRrOC1iNjEKKzA4YWZiOWM2ZjQ0ZjExYzM1OTViMDFmZDA5ODVkYjY0YjI5ODM0ZGQgamRrOC1iNjIKZGlmZiAtLWdpdCBhL2NvcmJhL21ha2UvY29tbW9uL0RlZnMtYnNkLmdtayBiL2NvcmJhL21ha2UvY29tbW9uL0RlZnMtYnNkLmdtawppbmRleCA0NGI1MDExLi45OWIzNzM3IDEwMDY0NAotLS0gYS9jb3JiYS9tYWtlL2NvbW1vbi9EZWZzLWJzZC5nbWsKKysrIGIvY29yYmEvbWFrZS9jb21tb24vRGVmcy1ic2QuZ21rCkBAIC0xLDUgKzEsNSBAQAogIwotIyBDb3B5cmlnaHQgKGMpIDE5OTksIDIwMTAsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIENvcHlyaWdodCAoYykgMTk5OSwgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICMgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogIwogIyBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApkaWZmIC0tZ2l0IGEvY29yYmEvbWFrZS9jb21tb24vaW50ZXJuYWwvUmVzb3VyY2VzLmdtayBiL2NvcmJhL21ha2UvY29tbW9uL2ludGVybmFsL1Jlc291cmNlcy5nbWsKaW5kZXggZDliYzk5Yi4uZTdjY2IxYiAxMDA2NDQKLS0tIGEvY29yYmEvbWFrZS9jb21tb24vaW50ZXJuYWwvUmVzb3VyY2VzLmdtaworKysgYi9jb3JiYS9tYWtlL2NvbW1vbi9pbnRlcm5hbC9SZXNvdXJjZXMuZ21rCkBAIC0xLDUgKzEsNSBAQAogIwotIyBDb3B5cmlnaHQgKGMpIDE5OTcsIDIwMDUsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIENvcHlyaWdodCAoYykgMTk5NywgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICMgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogIwogIyBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApkaWZmIC0tZ2l0IGEvY29yYmEvbWFrZS9jb21tb24vc2hhcmVkL0RlZnMtYnNkLmdtayBiL2NvcmJhL21ha2UvY29tbW9uL3NoYXJlZC9EZWZzLWJzZC5nbWsKaW5kZXggMjg2OTE0OS4uMmQ0ODk0NyAxMDA2NDQKLS0tIGEvY29yYmEvbWFrZS9jb21tb24vc2hhcmVkL0RlZnMtYnNkLmdtaworKysgYi9jb3JiYS9tYWtlL2NvbW1vbi9zaGFyZWQvRGVmcy1ic2QuZ21rCkBAIC0xLDUgKzEsNSBAQAogIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICMgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogIwogIyBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApkaWZmIC0tZ2l0IGEvY29yYmEvbWFrZS9jb21tb24vc2hhcmVkL0RlZnMtdXRpbHMuZ21rIGIvY29yYmEvbWFrZS9jb21tb24vc2hhcmVkL0RlZnMtdXRpbHMuZ21rCmluZGV4IDFkZTNkZGUuLjAwZmFiNWIgMTAwNjQ0Ci0tLSBhL2NvcmJhL21ha2UvY29tbW9uL3NoYXJlZC9EZWZzLXV0aWxzLmdtaworKysgYi9jb3JiYS9tYWtlL2NvbW1vbi9zaGFyZWQvRGVmcy11dGlscy5nbWsKQEAgLTEsNSArMSw1IEBACiAjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogIyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAjCiAjIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CmRpZmYgLS1naXQgYS9jb3JiYS9tYWtlL3Rvb2xzL3NyYy9idWlsZC90b29scy9zdHJpcHByb3BlcnRpZXMvU3RyaXBQcm9wZXJ0aWVzQ29yYmEuamF2YSBiL2NvcmJhL21ha2UvdG9vbHMvc3JjL2J1aWxkL3Rvb2xzL3N0cmlwcHJvcGVydGllcy9TdHJpcFByb3BlcnRpZXNDb3JiYS5qYXZhCmluZGV4IDRmZjFjYTEuLmI1YzdlY2IgMTAwNjQ0Ci0tLSBhL2NvcmJhL21ha2UvdG9vbHMvc3JjL2J1aWxkL3Rvb2xzL3N0cmlwcHJvcGVydGllcy9TdHJpcFByb3BlcnRpZXNDb3JiYS5qYXZhCisrKyBiL2NvcmJhL21ha2UvdG9vbHMvc3JjL2J1aWxkL3Rvb2xzL3N0cmlwcHJvcGVydGllcy9TdHJpcFByb3BlcnRpZXNDb3JiYS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApkaWZmIC0tZ2l0IGEvY29yYmEvbWFrZS90b29scy9zdHJpcF9wcm9wZXJ0aWVzL01ha2VmaWxlIGIvY29yYmEvbWFrZS90b29scy9zdHJpcF9wcm9wZXJ0aWVzL01ha2VmaWxlCmluZGV4IDc1ZWIyZjEuLmU3NGQ0NGMgMTAwNjQ0Ci0tLSBhL2NvcmJhL21ha2UvdG9vbHMvc3RyaXBfcHJvcGVydGllcy9NYWtlZmlsZQorKysgYi9jb3JiYS9tYWtlL3Rvb2xzL3N0cmlwX3Byb3BlcnRpZXMvTWFrZWZpbGUKQEAgLTEsNSArMSw1IEBACiAjCi0jIENvcHlyaWdodCAoYykgMTk5OCwgMjAwNSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgQ29weXJpZ2h0IChjKSAxOTk4LCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogIyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAjCiAjIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CmRpZmYgLS1naXQgYS9jb3JiYS9tYWtlZmlsZXMvQnVpbGRDb3JiYS5nbWsgYi9jb3JiYS9tYWtlZmlsZXMvQnVpbGRDb3JiYS5nbWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ2YzViOQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmJhL21ha2VmaWxlcy9CdWlsZENvcmJhLmdtawpAQCAtMCwwICsxLDI1MyBAQAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyMKKyMgVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzCisjIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyMgYnkgT3JhY2xlIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisjCisjIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyMgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisjIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyMgMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisjCisjIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCisjIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKKyMgcXVlc3Rpb25zLgorIworCisjCisjIE1ha2VmaWxlIGZvciBidWlsZGluZyB0aGUgY29yYmEgd29ya3NwYWNlLgorIworCisjIFRoaXMgbXVzdCBiZSB0aGUgZmlyc3QgcnVsZQorZGVmYXVsdDogYWxsCisKK2luY2x1ZGUgJChTUEVDKQoraW5jbHVkZSBNYWtlQmFzZS5nbWsKK2luY2x1ZGUgSmF2YUNvbXBpbGF0aW9uLmdtaworaW5jbHVkZSBJZGxDb21waWxhdGlvbi5nbWsKKworSkFWQUNfSkFSUyA/PSAiLVhib290Y2xhc3NwYXRoL3A6JChMQU5HVE9PTFNfT1VUUFVURElSKS9kaXN0L2Jvb3RzdHJhcC9saWIvamF2YWMuamFyIiBcCisJCS1qYXIgJChMQU5HVE9PTFNfT1VUUFVURElSKS9kaXN0L2Jvb3RzdHJhcC9saWIvamF2YWMuamFyCisjIFRoZSBDb3JiYSBzb3VyY2VzIGFyZSBvbGQgYW5kIGdlbmVyYXRlcyBhIExPVCBvZiB3YXJuaW5ncy4KKyMgRGlzYWJsZSB0aGVzZSB1c2luZyBYbGludCwgdW50aWwgc29tZW9uZSBjYXJlcyB0byBmaXggdGhlbS4gCitESVNBQkxFX0NPUkJBX1dBUk5JTkdTOj0tWGxpbnQ6YWxsLC1kZXByZWNhdGlvbiwtdW5jaGVja2VkLC1zZXJpYWwsLWZhbGx0aHJvdWdoLC1jYXN0LC1yYXd0eXBlcywtc3RhdGljLC1kZXAtYW5uCisKKyMgVGhlICJnZW5lcmF0ZSBvbGQgYnl0ZWNvZGUiIGphdmFjIHNldHVwIHVzZXMgdGhlIG5ldyBjb21waWxlciB0byBjb21waWxlIGZvciB0aGUKKyMgYm9vdCBqZGsgdG8gZ2VuZXJhdGUgdG9vbHMgdGhhdCBuZWVkIHRvIGJlIHJ1biB3aXRoIHRoZSBib290IGpkay4KKyMgVGh1cyB3ZSBmb3JjZSB0aGUgdGFyZ2V0IGJ5dGVjb2RlIHRvIHRoZSBib290IGpkayBieXRlY29kZS4KKyQoZXZhbCAkKGNhbGwgU2V0dXBKYXZhQ29tcGlsZXIsR0VORVJBVEVfT0xEQllURUNPREUsXAorICAgICBKVk06PSQoSkFWQSksXAorICAgICBKQVZBQzo9JChKQVZBQ19KQVJTKSxcCisgICAgIEZMQUdTOj0kKEJPT1RfSkRLX1NPVVJDRVRBUkdFVCkgLWJvb3RjbGFzc3BhdGggJChCT09UX1JUSkFSKSAkKERJU0FCTEVfQ09SQkFfV0FSTklOR1MpLFwKKyAgICAgU0VSVkVSX0RJUjo9JChTSkFWQUNfU0VSVkVSX0RJUiksXAorICAgICBTRVJWRVJfSlZNOj0kKFNKQVZBQ19TRVJWRVJfSkFWQSkpKQorCisjIFRoZSAiZ2VuZXJhdGUgbmV3IGJ5dGVjb2RlIiB1c2VzIHRoZSBuZXcgY29tcGlsZXIgdG8gZ2VuZXJhdGUgYnl0ZWNvZGUKKyMgZm9yIHRoZSBuZXcgamRrIHRoYXQgaXMgYmVpbmcgYnVpbHQuIFRoZSBjb2RlIGNvbXBpbGVkIGJ5IHRoaXMgc2V0dXAKKyMgY2Fubm90IG5lY2Vzc2FyaWx5IGJlIHJ1biB3aXRoIHRoZSBib290IGpkay4KKyQoZXZhbCAkKGNhbGwgU2V0dXBKYXZhQ29tcGlsZXIsR0VORVJBVEVfTkVXQllURUNPREUsXAorICAgICBKVk06PSQoSkFWQSksXAorICAgICBKQVZBQzo9JChKQVZBQ19KQVJTKSxcCisgICAgIEZMQUdTOj0tY3AgJChCT09UX1RPT0xTSkFSKSAtWERpZ25vcmUuc3ltYm9sLmZpbGU9dHJ1ZSAkKERJU0FCTEVfQ09SQkFfV0FSTklOR1MpLFwKKyAgICAgU0VSVkVSX0RJUjo9JChTSkFWQUNfU0VSVkVSX0RJUiksXAorICAgICBTRVJWRVJfSlZNOj0kKFNKQVZBQ19TRVJWRVJfSkFWQSkpKQorCiskKGV2YWwgJChjYWxsIFNldHVwSmF2YUNvbXBpbGF0aW9uLEJVSUxEX1NUUklQUFJPUCxcCisJCVNFVFVQOj1HRU5FUkFURV9PTERCWVRFQ09ERSxcCisJCVNSQzo9JChDT1JCQV9UT1BESVIpL21ha2UvdG9vbHMvc3JjLFwKKwkJQklOOj0kKENPUkJBX09VVFBVVERJUikvYnRjbGFzc2VzL3N0cmlwcHJvcF9jbGFzc2VzKSkKKworJChldmFsICQoY2FsbCBTZXR1cEFyY2hpdmUsQVJDSElWRV9TVFJJUFBST1AsJChCVUlMRF9TVFJJUFBST1ApLFwKKwkJU1JDUzo9JChDT1JCQV9PVVRQVVRESVIpL2J0Y2xhc3Nlcy9zdHJpcHByb3BfY2xhc3NlcyxcCisJCUpBUjo9JChDT1JCQV9PVVRQVVRESVIpL2J0amFycy9zdHJpcHByb3BlcnRpZXMuamFyLFwKKwkJSkFSTUFJTjo9YnVpbGQudG9vbHMuc3RyaXBwcm9wZXJ0aWVzLlN0cmlwUHJvcGVydGllc0NvcmJhKSkKKworJChldmFsICQoY2FsbCBTZXR1cEphdmFDb21waWxhdGlvbixCVUlMRF9JRExKLFwKKwkJU0VUVVA6PUdFTkVSQVRFX09MREJZVEVDT0RFLFwKKwkJU1JDOj0kKENPUkJBX1RPUERJUikvc3JjL3NoYXJlL2NsYXNzZXMsXAorCQlCSU46PSQoQ09SQkFfT1VUUFVURElSKS9idGNsYXNzZXMvaWRsal9jbGFzc2VzLFwKKwkJQ09QWTo9LnBycCxcCisJCUlOQ0xVREVTOj1jb20vc3VuL3Rvb2xzL2NvcmJhL3NlL2lkbCxcCisJCUVYQ0xVREVfRklMRVM6PVJlc291cmNlQnVuZGxlVXRpbC5qYXZhKSkKKworJChldmFsICQoY2FsbCBTZXR1cEFyY2hpdmUsQVJDSElWRV9JRExKLCQoQlVJTERfSURMSiksXAorCQlTUkNTOj0kKENPUkJBX09VVFBVVERJUikvYnRjbGFzc2VzL2lkbGpfY2xhc3NlcyxcCisJCVNVRkZJWEVTOj0uY2xhc3MgLnBycCxcCisJCUpBUjo9JChDT1JCQV9PVVRQVVRESVIpL2J0amFycy9pZGxqLmphcixcCisJCUpBUk1BSU46PWNvbS5zdW4udG9vbHMuY29yYmEuc2UuaWRsLnRvSmF2YVBvcnRhYmxlLkNvbXBpbGUpKQorCiskKGV2YWwgJChjYWxsIFNldHVwSmF2YUNvbXBpbGF0aW9uLEJVSUxEX0xPR1VUSUwsXAorCQlTRVRVUDo9R0VORVJBVEVfT0xEQllURUNPREUsXAorCQlTUkM6PSQoQ09SQkFfVE9QRElSKS9zcmMvc2hhcmUvY2xhc3NlcyxcCisJCUJJTjo9JChDT1JCQV9PVVRQVVRESVIpL2J0Y2xhc3Nlcy9sb2d1dGlsX2NsYXNzZXMsXAorCQlJTkNMVURFUzo9Y29tL3N1bi90b29scy9jb3JiYS9zZS9sb2d1dGlsKSkKKworJChldmFsICQoY2FsbCBTZXR1cEFyY2hpdmUsQVJDSElWRV9MT0dVVElMLCQoQlVJTERfTE9HVVRJTCksXAorCQlTUkNTOj0kKENPUkJBX09VVFBVVERJUikvYnRjbGFzc2VzL2xvZ3V0aWxfY2xhc3NlcyxcCisJCUpBUjo9JChDT1JCQV9PVVRQVVRESVIpL2J0amFycy9sb2d1dGlsLmphcixcCisJCUpBUk1BSU46PWNvbS5zdW4udG9vbHMuY29yYmEuc2UubG9ndXRpbC5NQykpCisKKyMgR2VuZXJhdGUgTG9nV3JhcHBlciBjbGFzc2VzIAorJChDT1JCQV9PVVRQVVRESVIpL2xvZ3dyYXBwZXJzL2NvbS9zdW4vY29yYmEvc2UvaW1wbC9sb2dnaW5nLyVTeXN0ZW1FeGNlcHRpb24uamF2YSA6IFwKKwkJCSQoQ09SQkFfVE9QRElSKS9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvcmJhL3NlL3NwaS9sb2dnaW5nL2RhdGEvJS5tYyBcCisJCQkkKENPUkJBX09VVFBVVERJUikvYnRqYXJzL2xvZ3V0aWwuamFyCisJJChNS0RJUikgLXAgJChARCkKKwkkKFJNKSAtZiAkKEBEKS9fdGhlX3dyYXBwZXJzLmQKKwkkKEVDSE8pICQoTE9HX0lORk8pIEdlbmVyYXRpbmcgY2xhc3MgZmlsZSBmcm9tICQqLm1jIAorCSQoSkFWQSkgLWphciAkKENPUkJBX09VVFBVVERJUikvYnRqYXJzL2xvZ3V0aWwuamFyIG1ha2UtY2xhc3MgJDwgJChARCkKKworIyBHZW5lcmF0ZSBMb2dXcmFwcGVyIHByb3BlcnRpZXMgZmlsZSBieSBjb25jYXRlbmluZyByZXNvdXJjZSBmaWxlcyAKKyQoQ09SQkFfT1VUUFVURElSKS9sb2d3cmFwcGVycy9jb20vc3VuL2NvcmJhL3NlL2ltcGwvbG9nZ2luZy9Mb2dTdHJpbmdzLnByb3BlcnRpZXM6IFwKKwkJJChDT1JCQV9PVVRQVVRESVIpL2xvZ3dyYXBwZXJzL0FjdGl2YXRpb25TeXN0ZW1FeGNlcHRpb24ucmVzb3VyY2UgXAorCQkkKENPUkJBX09VVFBVVERJUikvbG9nd3JhcHBlcnMvSU9SU3lzdGVtRXhjZXB0aW9uLnJlc291cmNlIFwKKwkJJChDT1JCQV9PVVRQVVRESVIpL2xvZ3dyYXBwZXJzL0ludGVyY2VwdG9yc1N5c3RlbUV4Y2VwdGlvbi5yZXNvdXJjZSBcCisJCSQoQ09SQkFfT1VUUFVURElSKS9sb2d3cmFwcGVycy9OYW1pbmdTeXN0ZW1FeGNlcHRpb24ucmVzb3VyY2UgXAorCQkkKENPUkJBX09VVFBVVERJUikvbG9nd3JhcHBlcnMvT01HU3lzdGVtRXhjZXB0aW9uLnJlc291cmNlIFwKKwkJJChDT1JCQV9PVVRQVVRESVIpL2xvZ3dyYXBwZXJzL09SQlV0aWxTeXN0ZW1FeGNlcHRpb24ucmVzb3VyY2UgXAorCQkkKENPUkJBX09VVFBVVERJUikvbG9nd3JhcHBlcnMvUE9BU3lzdGVtRXhjZXB0aW9uLnJlc291cmNlIFwKKwkJJChDT1JCQV9PVVRQVVRESVIpL2xvZ3dyYXBwZXJzL1V0aWxTeXN0ZW1FeGNlcHRpb24ucmVzb3VyY2UKKwkkKE1LRElSKSAtcCAkKEBEKQorCSQoRUNITykgJChMT0dfSU5GTykgQ29uY2F0ZW5hdGluZyA4IHJlc291cmNlIGZpbGVzIGludG8gJChARikKKwkkKENBVCkgJF4gPiAkQAorCisjIFRoZSByZXNvdXJjZXMgZmlsZXMgYXJlIGdlbmVyYXRlZCBmcm9tIGxpc3AtbGlrZSAubWMgZmlsZXMuCiskKENPUkJBX09VVFBVVERJUikvbG9nd3JhcHBlcnMvJVN5c3RlbUV4Y2VwdGlvbi5yZXNvdXJjZSA6ICQoQ09SQkFfVE9QRElSKS9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvcmJhL3NlL3NwaS9sb2dnaW5nL2RhdGEvJS5tYyAkKENPUkJBX09VVFBVVERJUikvYnRqYXJzL2xvZ3V0aWwuamFyCisJJChNS0RJUikgLXAgJChARCkKKwkkKFJNKSAtZiAkKEBEKS9fdGhlX3dyYXBwZXJzLmQKKwkkKEVDSE8pICQoTE9HX0lORk8pIEdlbmVyYXRpbmcgcmVzb3VyY2UgZmlsZSBmcm9tICQqLm1jIAorCSQoSkFWQSkgLWphciAkKENPUkJBX09VVFBVVERJUikvYnRqYXJzL2xvZ3V0aWwuamFyIG1ha2UtcmVzb3VyY2UgJDwgJChARCkKKworCiskKENPUkJBX09VVFBVVERJUikvbG9nd3JhcHBlcnMvX3RoZV93cmFwcGVycy5kIDogJChDT1JCQV9PVVRQVVRESVIpL2J0amFycy9sb2d1dGlsLmphciBcCisJJChDT1JCQV9PVVRQVVRESVIpL2xvZ3dyYXBwZXJzL2NvbS9zdW4vY29yYmEvc2UvaW1wbC9sb2dnaW5nL0FjdGl2YXRpb25TeXN0ZW1FeGNlcHRpb24uamF2YSBcCisJJChDT1JCQV9PVVRQVVRESVIpL2xvZ3dyYXBwZXJzL2NvbS9zdW4vY29yYmEvc2UvaW1wbC9sb2dnaW5nL0lPUlN5c3RlbUV4Y2VwdGlvbi5qYXZhIFwKKwkkKENPUkJBX09VVFBVVERJUikvbG9nd3JhcHBlcnMvY29tL3N1bi9jb3JiYS9zZS9pbXBsL2xvZ2dpbmcvSW50ZXJjZXB0b3JzU3lzdGVtRXhjZXB0aW9uLmphdmEgXAorCSQoQ09SQkFfT1VUUFVURElSKS9sb2d3cmFwcGVycy9jb20vc3VuL2NvcmJhL3NlL2ltcGwvbG9nZ2luZy9OYW1pbmdTeXN0ZW1FeGNlcHRpb24uamF2YSBcCisJJChDT1JCQV9PVVRQVVRESVIpL2xvZ3dyYXBwZXJzL2NvbS9zdW4vY29yYmEvc2UvaW1wbC9sb2dnaW5nL09NR1N5c3RlbUV4Y2VwdGlvbi5qYXZhIFwKKwkkKENPUkJBX09VVFBVVERJUikvbG9nd3JhcHBlcnMvY29tL3N1bi9jb3JiYS9zZS9pbXBsL2xvZ2dpbmcvT1JCVXRpbFN5c3RlbUV4Y2VwdGlvbi5qYXZhIFwKKwkkKENPUkJBX09VVFBVVERJUikvbG9nd3JhcHBlcnMvY29tL3N1bi9jb3JiYS9zZS9pbXBsL2xvZ2dpbmcvUE9BU3lzdGVtRXhjZXB0aW9uLmphdmEgXAorCSQoQ09SQkFfT1VUUFVURElSKS9sb2d3cmFwcGVycy9jb20vc3VuL2NvcmJhL3NlL2ltcGwvbG9nZ2luZy9VdGlsU3lzdGVtRXhjZXB0aW9uLmphdmEgXAorCSQoQ09SQkFfT1VUUFVURElSKS9sb2d3cmFwcGVycy9jb20vc3VuL2NvcmJhL3NlL2ltcGwvbG9nZ2luZy9Mb2dTdHJpbmdzLnByb3BlcnRpZXMKKwkkKE1LRElSKSAtcCAkKEBEKSAKKwkkKEVDSE8pIExPR1dSQVBQRVJTX0FSRV9DUkVBVEVEPXllcyA+ICRACisKKyMgVHJpZ2dlciB0aGUgZ2VuZXJhdGlvbiBvZiB0aGUgbG9nd3JhcHBlcnMuIEFmdGVyIHRoZSBsb2d3cmFwcGVyIGNsYXNzZXMgYW5kCisjIHJlc291cmNlcyBoYXZlIGJlZW4gY3JlYXRlZCwgdGhlbiB0aGUgbWFrZWZpbGUgd2lsbCByZXN0YXJ0IGFuZCB0aGUgbmV3bHkKKyMgY3JlYXRlZCBqYXZhIGZpbGVzIHdpbGwgYmVjb21lIHBhcnQgb2YgdGhlIGJ1aWxkIGZ1cnRoZXIgYWxvbmcgaW4gdGhlIG1ha2VmaWxlLgorLWluY2x1ZGUgJChDT1JCQV9PVVRQVVRESVIpL2xvZ3dyYXBwZXJzL190aGVfd3JhcHBlcnMuZAorCitpZmVxICgkKExPR1dSQVBQRVJTX0FSRV9DUkVBVEVEKSx5ZXMpCisgICAgICAgICQoZXZhbCAkKGNhbGwgU2V0dXBJZGxDb21waWxhdGlvbixCVUlMRF9JRExTLFwKKyAgICAgICAgICAgICAgICBJRExKOj0kKEpBVkEpIC1qYXIgJChDT1JCQV9PVVRQVVRESVIpL2J0amFycy9pZGxqLmphcixcCisJCVNSQzo9JChDT1JCQV9UT1BESVIpL3NyYy9zaGFyZS9jbGFzc2VzLFwKKwkJQklOOj0kKENPUkJBX09VVFBVVERJUikvZ2Vuc3JjLFwKKwkJRVhDTFVERVM6PWNvbS9zdW4vdG9vbHMvY29yYmEvc2UvaWRsLyUgXAorCQkJb3JnL29tZy9DT1JCQS8lIFwKKwkJCWNvbS9zdW4vY29yYmEvc2UvR2lvcElETC8lIFwKKwkJCW9yZy9vbWcvUG9ydGFibGVTZXJ2ZXIvY29yYmEuaWRsLFwKKwkJSU5DTFVERVM6PSUsXAorCQlPTERJTVBMQkFTRVM6PWNvbS9zdW4vY29yYmEvc2UvUG9ydGFibGVBY3RpdmF0aW9uSURML2FjdGl2YXRpb24uaWRsIFwKKwkJCSAgICAgIGNvbS9zdW4vY29yYmEvc2Uvc3BpL2FjdGl2YXRpb24vYWN0aXZhdGlvbi5pZGwsXAorCQlERUxFVEVTOj1EWU5BTllERUxFVEVGSUxFUyBvcmcvb21nL0R5bmFtaWNBbnkvKlBPQSogb3JnL29tZy9EeW5hbWljQW55LypIb2xkZXIqIG9yZy9vbWcvRHluYW1pY0FueS9EeW5WYWx1ZUJveEhlbHBlci5qYXZhIG9yZy9vbWcvRHluYW1pY0FueS9EeW5WYWx1ZUNvbW1vbkhlbHBlci5qYXZhIG9yZy9vbWcvRHluYW1pY0FueS9fRHluVmFsdWVDb21tb25TdHViLmphdmEgb3JnL29tZy9EeW5hbWljQW55L19EeW5WYWx1ZUJveFN0dWIuamF2YSBvcmcvb21nL0R5bmFtaWNBbnkvRHluQW55UGFja2FnZS9UeXBlTWlzbWF0Y2hIb2xkZXIuamF2YSBvcmcvb21nL0R5bmFtaWNBbnkvRHluQW55UGFja2FnZS9JbnZhbGlkVmFsdWVIb2xkZXIuamF2YSBvcmcvb21nL0R5bmFtaWNBbnkvRHluQW55RmFjdG9yeVBhY2thZ2UvSW5jb25zaXN0ZW50VHlwZUNvZGVIb2xkZXIuamF2YSBJT1BERUxFVEVGSUxFUyBvcmcvb21nL0lPUC9CSV9ESVJfSUlPUC5qYXZhIG9yZy9vbWcvSU9QL0NoYWluQnlwYXNzQ2hlY2suamF2YSBvcmcvb21nL0lPUC9DaGFpbkJ5cGFzc0luZm8uamF2YSBvcmcvb21nL0lPUC9GT1JXQVJERURfSURFTlRJVFkuamF2YSBvcmcvb21nL0lPUC9JTlZPQ0FUSU9OX1BPTElDSUVTLmphdmEgb3JnL29tZy9JT1AvTG9naWNhbFRocmVhZElkLmphdmEgb3JnL29tZy9JT1AvU2VuZGluZ0NvbnRleHRSdW5UaW1lLmphdmEgb3JnL29tZy9JT1AvVW5rbm93bkV4Y2VwdGlvbkluZm8uamF2YSBvcmcvb21nL0lPUC9UYWdnZWRDb21wb25lbnRTZXFIb2xkZXIuamF2YSBQT0FIRUxIT0xGSUxFUyBvcmcvb21nL1BvcnRhYmxlU2VydmVyL0N1cnJlbnRQYWNrYWdlL05vQ29udGV4dEhvbGRlci5qYXZhIG9yZy9vbWcvUG9ydGFibGVTZXJ2ZXIvRm9yd2FyZFJlcXVlc3RIb2xkZXIuamF2YSBvcmcvb21nL1BvcnRhYmxlU2VydmVyL0lkQXNzaWdubWVudFBvbGljeVZhbHVlSGVscGVyLmphdmEgb3JnL29tZy9Qb3J0YWJsZVNlcnZlci9JZEFzc2lnbm1lbnRQb2xpY3lWYWx1ZUhvbGRlci5qYXZhIG9yZy9vbWcvUG9ydGFibGVTZXJ2ZXIvSWRVbmlxdWVuZXNzUG9saWN5VmFsdWVIZWxwZXIuamF2YSBvcmcvb21nL1BvcnRhYmxlU2VydmVyL0lkVW5pcXVlbmVzc1BvbGljeVZhbHVlSG9sZGVyLmphdmEgb3JnL29tZy9Qb3J0YWJsZVNlcnZlci9JbXBsaWNpdEFjdGl2YXRpb25Qb2xpY3lWYWx1ZUhlbHBlci5qYXZhIG9yZy9vbWcvUG9ydGFibGVTZXJ2ZXIvSW1wbGljaXRBY3RpdmF0aW9uUG9saWN5VmFsdWVIb2xkZXIuamF2YSBvcmcvb21nL1BvcnRhYmxlU2VydmVyL0xpZmVzcGFuUG9saWN5VmFsdWVIZWxwZXIuamF2YSBvcmcvb21nL1BvcnRhYmxlU2VydmVyL0xpZmVzcGFuUG9saWN5VmFsdWVIb2xkZXIuamF2YSBvcmcvb21nL1BvcnRhYmxlU2VydmVyL1NlcnZhbnRSZXRlbnRpb25Qb2xpY3lWYWx1ZUhlbHBlci5qYXZhIG9yZy9vbWcvUG9ydGFibGVTZXJ2ZXIvU2VydmFudFJldGVudGlvblBvbGljeVZhbHVlSG9sZGVyLmphdmEgb3JnL29tZy9Qb3J0YWJsZVNlcnZlci9PYmplY3RJZEhlbHBlci5qYXZhIG9yZy9vbWcvUG9ydGFibGVTZXJ2ZXIvT2JqZWN0SWRIb2xkZXIuamF2YSBvcmcvb21nL1BvcnRhYmxlU2VydmVyL1BPQUxpc3RIZWxwZXIuamF2YSBvcmcvb21nL1BvcnRhYmxlU2VydmVyL1BPQUxpc3RIb2xkZXIuamF2YSBvcmcvb21nL1BvcnRhYmxlU2VydmVyL1BPQU1hbmFnZXJQYWNrYWdlL0FkYXB0ZXJJbmFjdGl2ZUhvbGRlci5qYXZhIG9yZy9vbWcvUG9ydGFibGVTZXJ2ZXIvUE9BTWFuYWdlclBhY2thZ2UvU3RhdGVIZWxwZXIuamF2YSBvcmcvb21nL1BvcnRhYmxlU2VydmVyL1BPQU1hbmFnZXJQYWNrYWdlL1N0YXRlSG9sZGVyLmphdmEgb3JnL29tZy9Qb3J0YWJsZVNlcnZlci9QT0FQYWNrYWdlL0FkYXB0ZXJBbHJlYWR5RXhpc3RzSG9sZGVyLmphdmEgb3JnL29tZy9Qb3J0YWJsZVNlcnZlci9QT0FQYWNrYWdlL0FkYXB0ZXJOb25FeGlzdGVudEhvbGRlci5qYXZhIG9yZy9vbWcvUG9ydGFibGVTZXJ2ZXIvUE9BUGFja2FnZS9JbnZhbGlkUG9saWN5SG9sZGVyLmphdmEgb3JnL29tZy9Qb3J0YWJsZVNlcnZlci9QT0FQYWNrYWdlL05vU2VydmFudEhvbGRlci5qYXZhIG9yZy9vbWcvUG9ydGFibGVTZXJ2ZXIvUE9BUGFja2FnZS9PYmplY3RBbHJlYWR5QWN0aXZlSG9sZGVyLmphdmEgb3JnL29tZy9Qb3J0YWJsZVNlcnZlci9QT0FQYWNrYWdlL09iamVjdE5vdEFjdGl2ZUhvbGRlci5qYXZhIG9yZy9vbWcvUG9ydGFibGVTZXJ2ZXIvUE9BUGFja2FnZS9TZXJ2YW50QWxyZWFkeUFjdGl2ZUhvbGRlci5qYXZhIG9yZy9vbWcvUG9ydGFibGVTZXJ2ZXIvUE9BUGFja2FnZS9TZXJ2YW50Tm90QWN0aXZlSG9sZGVyLmphdmEgb3JnL29tZy9Qb3J0YWJsZVNlcnZlci9QT0FQYWNrYWdlL1dyb25nQWRhcHRlckhvbGRlci5qYXZhIG9yZy9vbWcvUG9ydGFibGVTZXJ2ZXIvUE9BUGFja2FnZS9Xcm9uZ1BvbGljeUhvbGRlci5qYXZhIG9yZy9vbWcvUG9ydGFibGVTZXJ2ZXIvUmVxdWVzdFByb2Nlc3NpbmdQb2xpY3lWYWx1ZUhlbHBlci5qYXZhIG9yZy9vbWcvUG9ydGFibGVTZXJ2ZXIvUmVxdWVzdFByb2Nlc3NpbmdQb2xpY3lWYWx1ZUhvbGRlci5qYXZhIG9yZy9vbWcvUG9ydGFibGVTZXJ2ZXIvU2VydmFudEFjdGl2YXRvckhvbGRlci5qYXZhIG9yZy9vbWcvUG9ydGFibGVTZXJ2ZXIvU2VydmFudExvY2F0b3JIb2xkZXIuamF2YSBvcmcvb21nL1BvcnRhYmxlU2VydmVyL1RocmVhZFBvbGljeVZhbHVlSGVscGVyLmphdmEgb3JnL29tZy9Qb3J0YWJsZVNlcnZlci9UaHJlYWRQb2xpY3lWYWx1ZUhvbGRlci5qYXZhIFBJSEVMSE9MRklMRVMgb3JnL29tZy9Qb3J0YWJsZUludGVyY2VwdG9yL0NsaWVudFJlcXVlc3RJbmZvSGVscGVyLmphdmEgb3JnL29tZy9Qb3J0YWJsZUludGVyY2VwdG9yL0NsaWVudFJlcXVlc3RJbnRlcmNlcHRvckhlbHBlci5qYXZhIG9yZy9vbWcvUG9ydGFibGVJbnRlcmNlcHRvci9JT1JJbmZvSGVscGVyLmphdmEgb3JnL29tZy9Qb3J0YWJsZUludGVyY2VwdG9yL0lPUkludGVyY2VwdG9ySGVscGVyLmphdmEgb3JnL29tZy9Qb3J0YWJsZUludGVyY2VwdG9yL0ludGVyY2VwdG9ySGVscGVyLmphdmEgb3JnL29tZy9Qb3J0YWJsZUludGVyY2VwdG9yL09SQkluaXRJbmZvSGVscGVyLmphdmEgb3JnL29tZy9Qb3J0YWJsZUludGVyY2VwdG9yL09SQkluaXRpYWxpemVySGVscGVyLmphdmEgb3JnL29tZy9Qb3J0YWJsZUludGVyY2VwdG9yL1BvbGljeUZhY3RvcnlIZWxwZXIuamF2YSBvcmcvb21nL1BvcnRhYmxlSW50ZXJjZXB0b3IvUmVwbHlTdGF0dXNIZWxwZXIuamF2YSBvcmcvb21nL1BvcnRhYmxlSW50ZXJjZXB0b3IvUmVxdWVzdEluZm9IZWxwZXIuamF2YSBvcmcvb21nL1BvcnRhYmxlSW50ZXJjZXB0b3IvU2VydmVyUmVxdWVzdEluZm9IZWxwZXIuamF2YSBvcmcvb21nL1BvcnRhYmxlSW50ZXJjZXB0b3IvU2VydmVyUmVxdWVzdEludGVyY2VwdG9ySGVscGVyLmphdmEgb3JnL29tZy9Qb3J0YWJsZUludGVyY2VwdG9yL1Nsb3RJZEhlbHBlci5qYXZhIG9yZy9vbWcvUG9ydGFibGVJbnRlcmNlcHRvci9DbGllbnRSZXF1ZXN0SW5mb0hvbGRlci5qYXZhIG9yZy9vbWcvUG9ydGFibGVJbnRlcmNlcHRvci9DbGllbnRSZXF1ZXN0SW50ZXJjZXB0b3JIb2xkZXIuamF2YSBvcmcvb21nL1BvcnRhYmxlSW50ZXJjZXB0b3IvQ3VycmVudEhvbGRlci5qYXZhIG9yZy9vbWcvUG9ydGFibGVJbnRlcmNlcHRvci9Gb3J3YXJkUmVxdWVzdEhvbGRlci5qYXZhIG9yZy9vbWcvUG9ydGFibGVJbnRlcmNlcHRvci9JT1JJbmZvSG9sZGVyLmphdmEgb3JnL29tZy9Qb3J0YWJsZUludGVyY2VwdG9yL0lPUkludGVyY2VwdG9ySG9sZGVyLmphdmEgb3JnL29tZy9Qb3J0YWJsZUludGVyY2VwdG9yL0ludGVyY2VwdG9ySG9sZGVyLmphdmEgb3JnL29tZy9Qb3J0YWJsZUludGVyY2VwdG9yL0ludmFsaWRTbG90SG9sZGVyLmphdmEgb3JnL29tZy9Qb3J0YWJsZUludGVyY2VwdG9yL09SQkluaXRJbmZvSG9sZGVyLmphdmEgb3JnL29tZy9Qb3J0YWJsZUludGVyY2VwdG9yL09SQkluaXRpYWxpemVySG9sZGVyLmphdmEgb3JnL29tZy9Qb3J0YWJsZUludGVyY2VwdG9yL1BvbGljeUZhY3RvcnlIb2xkZXIuamF2YSBvcmcvb21nL1BvcnRhYmxlSW50ZXJjZXB0b3IvUmVxdWVzdEluZm9Ib2xkZXIuamF2YSBvcmcvb21nL1BvcnRhYmxlSW50ZXJjZXB0b3IvU2VydmVyUmVxdWVzdEluZm9Ib2xkZXIuamF2YSBvcmcvb21nL1BvcnRhYmxlSW50ZXJjZXB0b3IvU2VydmVyUmVxdWVzdEludGVyY2VwdG9ySG9sZGVyLmphdmEgb3JnL29tZy9Qb3J0YWJsZUludGVyY2VwdG9yL1RhZ2dlZENvbXBvbmVudFNlcUhvbGRlci5qYXZhIG9yZy9vbWcvUG9ydGFibGVJbnRlcmNlcHRvci9PUkJJbml0SW5mb1BhY2thZ2UvRHVwbGljYXRlTmFtZUhvbGRlci5qYXZhIG9yZy9vbWcvUG9ydGFibGVJbnRlcmNlcHRvci9PUkJJbml0SW5mb1BhY2thZ2UvSW52YWxpZE5hbWVIb2xkZXIuamF2YSBvcmcvb21nL0lPUC9Db2RlY1BhY2thZ2UvRm9ybWF0TWlzbWF0Y2hIb2xkZXIuamF2YSBvcmcvb21nL0lPUC9Db2RlY1BhY2thZ2UvSW52YWxpZFR5cGVGb3JFbmNvZGluZ0hvbGRlci5qYXZhIG9yZy9vbWcvSU9QL0NvZGVjUGFja2FnZS9UeXBlTWlzbWF0Y2hIb2xkZXIuamF2YSBvcmcvb21nL0lPUC9Db2RlY0hlbHBlci5qYXZhIG9yZy9vbWcvSU9QL0VuY29kaW5nRm9ybWF0SGVscGVyLmphdmEgb3JnL29tZy9JT1AvRW5jb2RpbmdIZWxwZXIuamF2YSBvcmcvb21nL0lPUC9Db2RlY0ZhY3RvcnlQYWNrYWdlL1Vua25vd25FbmNvZGluZ0hvbGRlci5qYXZhIG9yZy9vbWcvSU9QL0NvZGVjRmFjdG9yeUhvbGRlci5qYXZhIG9yZy9vbWcvSU9QL0NvZGVjSG9sZGVyLmphdmEgb3JnL29tZy9JT1AvRW5jb2RpbmdIb2xkZXIuamF2YSBvcmcvb21nL0lPUC9UYWdnZWRDb21wb25lbnRTZXFIZWxwZXIuamF2YSBvcmcvb21nL0R5bmFtaWMvQ29udGV4dExpc3RIZWxwZXIuamF2YSBvcmcvb21nL0R5bmFtaWMvRXhjZXB0aW9uTGlzdEhlbHBlci5qYXZhIG9yZy9vbWcvRHluYW1pYy9QYXJhbWV0ZXJIb2xkZXIuamF2YSBvcmcvb21nL0R5bmFtaWMvUGFyYW1ldGVyTGlzdEhvbGRlci5qYXZhIG9yZy9vbWcvRHluYW1pYy9FeGNlcHRpb25MaXN0SG9sZGVyLmphdmEgb3JnL29tZy9EeW5hbWljL1BhcmFtZXRlckhlbHBlci5qYXZhIG9yZy9vbWcvRHluYW1pYy9QYXJhbWV0ZXJMaXN0SGVscGVyLmphdmEgb3JnL29tZy9EeW5hbWljL1JlcXVlc3RDb250ZXh0SGVscGVyLmphdmEgQ09SQkFYIG9yZy9vbWcvQ09SQkEvT2N0ZXRTZXFIZWxwZXIuamF2YSBvcmcvb21nL0NPUkJBL09jdGV0U2VxSG9sZGVyLmphdmEgb3JnL29tZy9DT1JCQS9Qb2xpY3lFcnJvci5qYXZhIG9yZy9vbWcvQ09SQkEvUmVwb3NpdG9yeUlkSGVscGVyLmphdmEpKSAKKworICAgICAgICAkKEJVSUxEX0lETFMpIDogJChDT1JCQV9PVVRQVVRESVIpL2J0amFycy9pZGxqLmphcgorCisgICAgICAgICQoQ09SQkFfT1VUUFVURElSKS9nZW5zcmMvX3RoZV9pZGxzLmQgOiAkKEJVSUxEX0lETFMpICQoQ09SQkFfT1VUUFVURElSKS9idGphcnMvaWRsai5qYXIKKwkJJChNS0RJUikgLXAgJChARCkKKwkJJChFQ0hPKSBJRExTX0FSRV9DUkVBVEVEPXllcyA+ICRACisKKyAgICAgICAgLWluY2x1ZGUgJChDT1JCQV9PVVRQVVRESVIpL2dlbnNyYy9fdGhlX2lkbHMuZAorCisgICAgICAgIGlmZXEgKCQoSURMU19BUkVfQ1JFQVRFRCkseWVzKQorICAgICAgICAgICAgICAgICQoZXZhbCAkKGNhbGwgU2V0dXBKYXZhQ29tcGlsYXRpb24sQlVJTERfQ09SQkEsXAorCQkgICAgU0VUVVA6PUdFTkVSQVRFX05FV0JZVEVDT0RFLFwKKwkJICAgIFNSQzo9JChDT1JCQV9UT1BESVIpL3NyYy9zaGFyZS9jbGFzc2VzICQoQ09SQkFfT1VUUFVURElSKS9nZW5zcmMgJChDT1JCQV9PVVRQVVRESVIpL2xvZ3dyYXBwZXJzLFwKKwkJICAgIEVYQ0xVREVTOj1jb20vc3VuL2NvcmJhL3NlL1BvcnRhYmxlQWN0aXZhdGlvbklETFwKKwkJCSAgICAgIGNvbS9zdW4vdG9vbHMvY29yYmEvc2UvbG9ndXRpbCxcCisJCSAgICBFWENMVURFX0ZJTEVTOj1jb20vc3VuL2NvcmJhL3NlL2ltcGwvcHJlc2VudGF0aW9uL3JtaS9KTkRJU3RhdGVGYWN0b3J5SW1wbC5qYXZhIFwKKwkJCQkgICBjb20vc3VuL2NvcmJhL3NlL3NwaS9wcmVzZW50YXRpb24vcm1pL1N0dWJXcmFwcGVyLmphdmEgXAorCQkJCSAgIGNvbS9zdW4vb3JnL29tZy9DT1JCQS9JRExUeXBlT3BlcmF0aW9ucy5qYXZhIFwKKwkJCQkgICBjb20vc3VuL29yZy9vbWcvQ09SQkEvSVJPYmplY3RPcGVyYXRpb25zLmphdmEgXAorCQkJCSAgIG9yZy9vbWcvUG9ydGFibGVJbnRlcmNlcHRvci9VTktOT1dOLmphdmEgXAorCQkJCSAgIGNvbS9zdW4vdG9vbHMvY29yYmEvc2UvaWRsL1Jlc291cmNlQnVuZGxlVXRpbC5qYXZhXAorCQkJCSAgIGNvbS9zdW4vY29yYmEvc2UvaW1wbC9wcmVzZW50YXRpb24vcm1pL2puZGkucHJvcGVydGllcyxcCisJCSAgICBDT1BZOj0ucHJwIExvZ1N0cmluZ3MucHJvcGVydGllcyxcCisJCSAgICBCSU46PSQoQ09SQkFfT1VUUFVURElSKS9jbGFzc2VzKSkKKworICAgICAgICAgICAgICAgICMgU2VwYXJhdGUgc3JjLnppcCBjYWxsIHRvIGluY2x1ZGUgc291cmNlcyB0aGF0IHdlcmUgZXhjbHVkZWQgaW4gdGhlIGJ1aWxkIHRvIAorICAgICAgICAgICAgICAgICMgbWltaWMgYmVoYXZpb3IgaW4gb2xkIGJ1aWxkIHN5c3RlbS4KKyAgICAgICAgICAgICAgICAkKGV2YWwgJChjYWxsIFNldHVwWmlwQXJjaGl2ZSxBUkNISVZFX0JVSUxEX0NPUkJBLFwKKwkJICAgIFNSQzo9JChDT1JCQV9UT1BESVIpL3NyYy9zaGFyZS9jbGFzc2VzICQoQ09SQkFfT1VUUFVURElSKS9nZW5zcmMgJChDT1JCQV9PVVRQVVRESVIpL2xvZ3dyYXBwZXJzLFwKKwkJICAgIFpJUDo9JChDT1JCQV9PVVRQVVRESVIpL2Rpc3QvbGliL3NyYy56aXApKQorCisgICAgICAgICAgICAgICAgJChCVUlMRF9DT1JCQSkgOiAkKEJVSUxEX0lETFMpICQoTE9HV1JBUFBFUl9ERVBFTkRFTkNJRVMpCisKKyAgICAgICAgICAgICAgICAjIFJ1biBzdHJpcHByb3BlcnRpZXMgb24gYWxsIHN1bm9yYiByZXNvdXJjZSBmaWxlcy4KKyAgICAgICAgICAgICAgICBTVFJJUF9QUk9QX1NSQ19GSUxFUzo9JChzaGVsbCAkKEZJTkQpICQoQ09SQkFfVE9QRElSKS9zcmMvc2hhcmUvY2xhc3NlcyAtbmFtZSAic3Vub3JiKi5wcm9wZXJ0aWVzIikKKyAgICAgICAgICAgICAgICBTVFJJUF9QUk9QX0ZJTEVTOj0kKHBhdHN1YnN0ICAkKENPUkJBX1RPUERJUikvc3JjL3NoYXJlL2NsYXNzZXMvJSwkKENPUkJBX09VVFBVVERJUikvY2xhc3Nlcy8lLFwKKwkJCSQoU1RSSVBfUFJPUF9TUkNfRklMRVMpKQorICAgICAgICAgICAgICAgICMgU2ltcGxlIGRlbGl2ZXJ5IG9mIHpoX0hLIHByb3BlcnRpZXMgZmlsZXMganVzdCBjb3BpZXMgemhfVFcgcHJvcGVydGllcyBmaWxlcworICAgICAgICAgICAgICAgIFNUUklQX1BST1BfRklMRVMrPSQocGF0c3Vic3QgICQoQ09SQkFfVE9QRElSKS9zcmMvc2hhcmUvY2xhc3Nlcy8lX3poX1RXLnByb3BlcnRpZXMsXAorCQkJJChDT1JCQV9PVVRQVVRESVIpL2NsYXNzZXMvJV96aF9ISy5wcm9wZXJ0aWVzLFwKKwkJCSQoc2hlbGwgJChGSU5EKSAkKENPUkJBX1RPUERJUikvc3JjL3NoYXJlL2NsYXNzZXMgLW5hbWUgInN1bm9yYl96aF9UVy5wcm9wZXJ0aWVzIikpCisgICAgICAgICAgICAgICAgU1RSSVBfUFJPUF9TUkNfRklMRVMrPSQoc2hlbGwgJChGSU5EKSAkKENPUkJBX1RPUERJUikvc3JjL3NoYXJlL2NsYXNzZXMgLW5hbWUgInN1bm9yYl96aF9UVy5wcm9wZXJ0aWVzIikKKwkJU1RSSVBfUFJPUF9DTURMSU5FOj0kKHN1YnN0IF9TUEFDRV8sJChTUEFDRSksXAorCQkJJChqb2luICQoYWRkcHJlZml4IC1jbGVhbl9TUEFDRV8sJChTVFJJUF9QUk9QX1NSQ19GSUxFUykpLCBcCisJCQkkKGFkZHByZWZpeCBfU1BBQ0VfLCQoU1RSSVBfUFJPUF9GSUxFUykpKSkKKworICAgICAgICAgICAgICAgICQoQ09SQkFfT1VUUFVURElSKS9fdGhlLnN0cmlwcGVkX3Byb3BlcnRpZXM6ICQoU1RSSVBfUFJPUF9TUkNfRklMRVMpIFwKKwkJCQkJJChDT1JCQV9PVVRQVVRESVIpL2J0amFycy9zdHJpcHByb3BlcnRpZXMuamFyCisJCQkkKE1LRElSKSAtcCAkKHNvcnQgJChkaXIgJChTVFJJUF9QUk9QX0ZJTEVTKSkpCisJCQkkKGNhbGwgTGlzdFBhdGhzU2FmZWx5LFNUUklQX1BST1BfQ01ETElORSxcbiwgPj4gJChDT1JCQV9PVVRQVVRESVIpL190aGUuc3RyaXBfcHJvcC5jbWRsaW5lKQorCQkJJChKQVZBKSAtamFyICQoQ09SQkFfT1VUUFVURElSKS9idGphcnMvc3RyaXBwcm9wZXJ0aWVzLmphciBcCisJCQkJQCQoQ09SQkFfT1VUUFVURElSKS9fdGhlLnN0cmlwX3Byb3AuY21kbGluZQorCQkJJChUT1VDSCkgJEAKKworICAgICAgICAgICAgICAgICQoZXZhbCAkKGNhbGwgU2V0dXBBcmNoaXZlLEFSQ0hJVkVfQ09SQkEsXAorCQkgICAgICQoQlVJTERfQ09SQkEpICQoQ09SQkFfT1VUUFVURElSKS9fdGhlLnN0cmlwcGVkX3Byb3BlcnRpZXMsXAorCQkgICAgIFNSQ1M6PSQoQ09SQkFfT1VUUFVURElSKS9jbGFzc2VzLFwKKwkJICAgICBTVUZGSVhFUzo9LmNsYXNzIC5wcnAgLnByb3BlcnRpZXMsXAorCQkgICAgIEpBUjo9JChDT1JCQV9PVVRQVVRESVIpL2Rpc3QvbGliL2NsYXNzZXMuamFyKSkKKworICAgICAgICAgICAgICAgICMgVGhlIGNyZWF0ZWQgY2xhc3Nlcy5qYXIgbm93IGNvbnRhaW5zIENvcmJhIGNvbXBpbGVkIHRvIHJ1biBvbiB0aGUgdGFyZ2V0IEpESworICAgICAgICAgICAgICAgICMgYW5kIGlzIHJlYWR5IGZvciBpbmNsdXNpb24gaW4gamRrIHJ0Lmphci4KKworICAgICAgICAgICAgICAgICMgVGhlIGNyZWF0ZWQgc3JjLnppcCBub3cgY29udGFpbnMgLmphdmEgYW5kIC5wcm9wZXJ0aWVzIGZpbGVzIHVzZWQgdG8gY3JlYXRlIHRoZSBjbGFzc2VzIGluIGNsYXNzZXMuamFyCisgICAgICAgICAgICAgICAgIyBhbmQgaXMgcmVhZHkgZm9yIGluY2x1c2lvbiBpbnRvIHRoZSBqZGsgc3JjLnppcAorCisgICAgICAgICAgICAgICAgQklOX0ZJTEVTOj0kKENPUkJBX1RPUERJUikvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9jb3JiYS9zZS9pZGwvb3JiLmlkbCBcCisJCQkgICAkKENPUkJBX1RPUERJUikvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9jb3JiYS9zZS9pZGwvaXIuaWRsCisKKyAgICAgICAgICAgICAgICAkKENPUkJBX09VVFBVVERJUikvZGlzdC9saWIvYmluLnppcCA6ICQoQklOX0ZJTEVTKSAkKENPUkJBX09VVFBVVERJUikvZGlzdC9saWIvY2xhc3Nlcy5qYXIKKwkJCSQoTUtESVIpIC1wICQoQ09SQkFfT1VUUFVURElSKS9kaXN0L2xpYgorCQkJJChNS0RJUikgLXAgJChDT1JCQV9PVVRQVVRESVIpL2xpYgorCQkJJChSTSkgLWYgJEAKKwkJCSQoRUNITykgQ3JlYXRpbmcgYGJhc2VuYW1lICRAYAorCQkJJChDUCkgJChCSU5fRklMRVMpICQoQ09SQkFfT1VUUFVURElSKS9saWIKKwkJCSQoQ0hNT0QpIHVnK3cgJChDT1JCQV9PVVRQVVRESVIpL2xpYi8qCisJCQkoY2QgJChDT1JCQV9PVVRQVVRESVIpOyAkKFpJUCkgLXEgJEAgbGliL29yYi5pZGwgbGliL2lyLmlkbCkKKworICAgICAgICAgICAgICAgICMgVGhlIGNyZWF0ZWQgYmluLnppcCBub3cgY29udGFpbnMgdGhlIGNvcmJhIHNwZWNpZmljIGJpbmFyaWVzOiBvcmIuaWRsLCBpci5pZGwKKworICAgICAgICAgICAgICAgIGFsbDogCSQoQ09SQkFfT1VUUFVURElSKS9idGphcnMvc3RyaXBwcm9wZXJ0aWVzLmphciBcCisJCQkkKENPUkJBX09VVFBVVERJUikvYnRqYXJzL2lkbGouamFyIFwKKwkJCSQoQ09SQkFfT1VUUFVURElSKS9idGphcnMvbG9ndXRpbC5qYXIgXAorCQkJJChDT1JCQV9PVVRQVVRESVIpL2Rpc3QvbGliL2NsYXNzZXMuamFyIFwKKwkJCSQoQ09SQkFfT1VUUFVURElSKS9kaXN0L2xpYi9zcmMuemlwIFwKKwkJCSQoQ09SQkFfT1VUUFVURElSKS9kaXN0L2xpYi9iaW4uemlwCisgICAgICAgIGVuZGlmCitlbmRpZgorCitjbGVhbjoKKwkkKFJNKSAtcmYgJChDT1JCQV9PVVRQVVRESVIpCisKKy5QSE9OWTogZGVmYXVsdCBhbGwgY2xlYW4gY2xvYmJlciAKZGlmZiAtLWdpdCBhL2NvcmJhL21ha2VmaWxlcy9NYWtlZmlsZSBiL2NvcmJhL21ha2VmaWxlcy9NYWtlZmlsZQppbmRleCBlZTA3ZGVkLi45NTM5ZmUwIDEwMDY0NAotLS0gYS9jb3JiYS9tYWtlZmlsZXMvTWFrZWZpbGUKKysrIGIvY29yYmEvbWFrZWZpbGVzL01ha2VmaWxlCkBAIC0xLDUgKzEsNSBAQAogIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIENvcHlyaWdodCAoYykgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICMgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogIwogIyBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjMsMjMxICsyMywyNyBAQAogIyBxdWVzdGlvbnMuCiAjCiAKLSMKLSMgTWFrZWZpbGUgZm9yIGJ1aWxkaW5nIHRoZSBjb3JiYSB3b3Jrc3BhY2UuCi0jCisjIExvY2F0ZSB0aGlzIE1ha2VmaWxlCitpZmVxICgkKGZpbHRlciAvJSwkKGxhc3R3b3JkICQoTUFLRUZJTEVfTElTVCkpKSwpCisgICAgbWFrZWZpbGVfcGF0aDo9JChDVVJESVIpLyQobGFzdHdvcmQgJChNQUtFRklMRV9MSVNUKSkKK2Vsc2UKKyAgICBtYWtlZmlsZV9wYXRoOj0kKGxhc3R3b3JkICQoTUFLRUZJTEVfTElTVCkpCitlbmRpZgorcmVwb19kaXI6PSQocGF0c3Vic3QgJS9tYWtlZmlsZXMvTWFrZWZpbGUsJSwkKG1ha2VmaWxlX3BhdGgpKQogCi0jIFRoaXMgbXVzdCBiZSB0aGUgZmlyc3QgcnVsZQotZGVmYXVsdDogYWxsCisjIFdoYXQgaXMgdGhlIG5hbWUgb2YgdGhpcyBzdWJzeXN0ZW0gKGxhbmd0b29scywgY29yYmEsIGV0Yyk/CitzdWJzeXN0ZW1fbmFtZTo9JChub3RkaXIgJChyZXBvX2RpcikpCiAKLWluY2x1ZGUgJChTUEVDKQotaW5jbHVkZSBNYWtlQmFzZS5nbWsKLWluY2x1ZGUgSmF2YUNvbXBpbGF0aW9uLmdtawotaW5jbHVkZSBJZGxDb21waWxhdGlvbi5nbWsKLQotSkFWQUNfSkFSUyA/PSAiLVhib290Y2xhc3NwYXRoL3A6JChMQU5HVE9PTFNfT1VUUFVURElSKS9kaXN0L2Jvb3RzdHJhcC9saWIvamF2YWMuamFyIiBcCi0JCS1qYXIgJChMQU5HVE9PTFNfT1VUUFVURElSKS9kaXN0L2Jvb3RzdHJhcC9saWIvamF2YWMuamFyCi0jIFRoZSBDb3JiYSBzb3VyY2VzIGFyZSBvbGQgYW5kIGdlbmVyYXRlcyBhIExPVCBvZiB3YXJuaW5ncy4KLSMgRGlzYWJsZSB0aGVzZSB1c2luZyBYbGludCwgdW50aWwgc29tZW9uZSBjYXJlcyB0byBmaXggdGhlbS4gCi1ESVNBQkxFX0NPUkJBX1dBUk5JTkdTOj0tWGxpbnQ6YWxsLC1kZXByZWNhdGlvbiwtdW5jaGVja2VkLC1zZXJpYWwsLWZhbGx0aHJvdWdoLC1jYXN0LC1yYXd0eXBlcywtc3RhdGljLC1kZXAtYW5uCi0KLSMgVGhlICJnZW5lcmF0ZSBvbGQgYnl0ZWNvZGUiIGphdmFjIHNldHVwIHVzZXMgdGhlIG5ldyBjb21waWxlciB0byBjb21waWxlIGZvciB0aGUKLSMgYm9vdCBqZGsgdG8gZ2VuZXJhdGUgdG9vbHMgdGhhdCBuZWVkIHRvIGJlIHJ1biB3aXRoIHRoZSBib290IGpkay4KLSMgVGh1cyB3ZSBmb3JjZSB0aGUgdGFyZ2V0IGJ5dGVjb2RlIHRvIHRoZSBib290IGpkayBieXRlY29kZS4KLSQoZXZhbCAkKGNhbGwgU2V0dXBKYXZhQ29tcGlsZXIsR0VORVJBVEVfT0xEQllURUNPREUsXAotICAgICBKVk06PSQoSkFWQSksXAotICAgICBKQVZBQzo9JChKQVZBQ19KQVJTKSxcCi0gICAgIEZMQUdTOj0kKEJPT1RfSkRLX1NPVVJDRVRBUkdFVCkgLWJvb3RjbGFzc3BhdGggJChCT09UX1JUSkFSKSAkKERJU0FCTEVfQ09SQkFfV0FSTklOR1MpLFwKLSAgICAgU0VSVkVSX0RJUjo9JChTSkFWQUNfU0VSVkVSX0RJUiksXAotICAgICBTRVJWRVJfSlZNOj0kKFNKQVZBQ19TRVJWRVJfSkFWQSkpKQotCi0jIFRoZSAiZ2VuZXJhdGUgbmV3IGJ5dGVjb2RlIiB1c2VzIHRoZSBuZXcgY29tcGlsZXIgdG8gZ2VuZXJhdGUgYnl0ZWNvZGUKLSMgZm9yIHRoZSBuZXcgamRrIHRoYXQgaXMgYmVpbmcgYnVpbHQuIFRoZSBjb2RlIGNvbXBpbGVkIGJ5IHRoaXMgc2V0dXAKLSMgY2Fubm90IG5lY2Vzc2FyaWx5IGJlIHJ1biB3aXRoIHRoZSBib290IGpkay4KLSQoZXZhbCAkKGNhbGwgU2V0dXBKYXZhQ29tcGlsZXIsR0VORVJBVEVfTkVXQllURUNPREUsXAotICAgICBKVk06PSQoSkFWQSksXAotICAgICBKQVZBQzo9JChKQVZBQ19KQVJTKSxcCi0gICAgIEZMQUdTOj0tY3AgJChCT09UX1RPT0xTSkFSKSAtWERpZ25vcmUuc3ltYm9sLmZpbGU9dHJ1ZSAkKERJU0FCTEVfQ09SQkFfV0FSTklOR1MpLFwKLSAgICAgU0VSVkVSX0RJUjo9JChTSkFWQUNfU0VSVkVSX0RJUiksXAotICAgICBTRVJWRVJfSlZNOj0kKFNKQVZBQ19TRVJWRVJfSkFWQSkpKQotCi0kKGV2YWwgJChjYWxsIFNldHVwSmF2YUNvbXBpbGF0aW9uLEJVSUxEX1NUUklQUFJPUCxcCi0JCVNFVFVQOj1HRU5FUkFURV9PTERCWVRFQ09ERSxcCi0JCVNSQzo9JChDT1JCQV9UT1BESVIpL21ha2UvdG9vbHMvc3JjLFwKLQkJQklOOj0kKENPUkJBX09VVFBVVERJUikvYnRjbGFzc2VzL3N0cmlwcHJvcF9jbGFzc2VzKSkKLQotJChldmFsICQoY2FsbCBTZXR1cEFyY2hpdmUsQVJDSElWRV9TVFJJUFBST1AsJChCVUlMRF9TVFJJUFBST1ApLFwKLQkJU1JDUzo9JChDT1JCQV9PVVRQVVRESVIpL2J0Y2xhc3Nlcy9zdHJpcHByb3BfY2xhc3NlcyxcCi0JCUpBUjo9JChDT1JCQV9PVVRQVVRESVIpL2J0amFycy9zdHJpcHByb3BlcnRpZXMuamFyLFwKLQkJSkFSTUFJTjo9YnVpbGQudG9vbHMuc3RyaXBwcm9wZXJ0aWVzLlN0cmlwUHJvcGVydGllc0NvcmJhKSkKLQotJChldmFsICQoY2FsbCBTZXR1cEphdmFDb21waWxhdGlvbixCVUlMRF9JRExKLFwKLQkJU0VUVVA6PUdFTkVSQVRFX09MREJZVEVDT0RFLFwKLQkJU1JDOj0kKENPUkJBX1RPUERJUikvc3JjL3NoYXJlL2NsYXNzZXMsXAotCQlCSU46PSQoQ09SQkFfT1VUUFVURElSKS9idGNsYXNzZXMvaWRsal9jbGFzc2VzLFwKLQkJQ09QWTo9LnBycCxcCi0JCUlOQ0xVREVTOj1jb20vc3VuL3Rvb2xzL2NvcmJhL3NlL2lkbCxcCi0JCUVYQ0xVREVfRklMRVM6PVJlc291cmNlQnVuZGxlVXRpbC5qYXZhKSkKLQotJChldmFsICQoY2FsbCBTZXR1cEFyY2hpdmUsQVJDSElWRV9JRExKLCQoQlVJTERfSURMSiksXAotCQlTUkNTOj0kKENPUkJBX09VVFBVVERJUikvYnRjbGFzc2VzL2lkbGpfY2xhc3NlcyxcCi0JCVNVRkZJWEVTOj0uY2xhc3MgLnBycCxcCi0JCUpBUjo9JChDT1JCQV9PVVRQVVRESVIpL2J0amFycy9pZGxqLmphcixcCi0JCUpBUk1BSU46PWNvbS5zdW4udG9vbHMuY29yYmEuc2UuaWRsLnRvSmF2YVBvcnRhYmxlLkNvbXBpbGUpKQotCi0kKGV2YWwgJChjYWxsIFNldHVwSmF2YUNvbXBpbGF0aW9uLEJVSUxEX0xPR1VUSUwsXAotCQlTRVRVUDo9R0VORVJBVEVfT0xEQllURUNPREUsXAotCQlTUkM6PSQoQ09SQkFfVE9QRElSKS9zcmMvc2hhcmUvY2xhc3NlcyxcCi0JCUJJTjo9JChDT1JCQV9PVVRQVVRESVIpL2J0Y2xhc3Nlcy9sb2d1dGlsX2NsYXNzZXMsXAotCQlJTkNMVURFUzo9Y29tL3N1bi90b29scy9jb3JiYS9zZS9sb2d1dGlsKSkKLQotJChldmFsICQoY2FsbCBTZXR1cEFyY2hpdmUsQVJDSElWRV9MT0dVVElMLCQoQlVJTERfTE9HVVRJTCksXAotCQlTUkNTOj0kKENPUkJBX09VVFBVVERJUikvYnRjbGFzc2VzL2xvZ3V0aWxfY2xhc3NlcyxcCi0JCUpBUjo9JChDT1JCQV9PVVRQVVRESVIpL2J0amFycy9sb2d1dGlsLmphcixcCi0JCUpBUk1BSU46PWNvbS5zdW4udG9vbHMuY29yYmEuc2UubG9ndXRpbC5NQykpCi0KLSMgR2VuZXJhdGUgTG9nV3JhcHBlciBjbGFzc2VzIAotJChDT1JCQV9PVVRQVVRESVIpL2xvZ3dyYXBwZXJzL2NvbS9zdW4vY29yYmEvc2UvaW1wbC9sb2dnaW5nLyVTeXN0ZW1FeGNlcHRpb24uamF2YSA6IFwKLQkJCSQoQ09SQkFfVE9QRElSKS9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2NvcmJhL3NlL3NwaS9sb2dnaW5nL2RhdGEvJS5tYyBcCi0JCQkkKENPUkJBX09VVFBVVERJUikvYnRqYXJzL2xvZ3V0aWwuamFyCi0JJChNS0RJUikgLXAgJChARCkKLQkkKFJNKSAtZiAkKEBEKS9fdGhlX3dyYXBwZXJzLmQKLQkkKEVDSE8pIEdlbmVyYXRpbmcgY2xhc3MgZmlsZSBmcm9tICQqLm1jCi0JJChKQVZBKSAtamFyICQoQ09SQkFfT1VUUFVURElSKS9idGphcnMvbG9ndXRpbC5qYXIgbWFrZS1jbGFzcyAkPCAkKEBEKQotCi0jIEdlbmVyYXRlIExvZ1dyYXBwZXIgcHJvcGVydGllcyBmaWxlIGJ5IGNvbmNhdGVuaW5nIHJlc291cmNlIGZpbGVzIAotJChDT1JCQV9PVVRQVVRESVIpL2xvZ3dyYXBwZXJzL2NvbS9zdW4vY29yYmEvc2UvaW1wbC9sb2dnaW5nL0xvZ1N0cmluZ3MucHJvcGVydGllczogXAotCQkkKENPUkJBX09VVFBVVERJUikvbG9nd3JhcHBlcnMvQWN0aXZhdGlvblN5c3RlbUV4Y2VwdGlvbi5yZXNvdXJjZSBcCi0JCSQoQ09SQkFfT1VUUFVURElSKS9sb2d3cmFwcGVycy9JT1JTeXN0ZW1FeGNlcHRpb24ucmVzb3VyY2UgXAotCQkkKENPUkJBX09VVFBVVERJUikvbG9nd3JhcHBlcnMvSW50ZXJjZXB0b3JzU3lzdGVtRXhjZXB0aW9uLnJlc291cmNlIFwKLQkJJChDT1JCQV9PVVRQVVRESVIpL2xvZ3dyYXBwZXJzL05hbWluZ1N5c3RlbUV4Y2VwdGlvbi5yZXNvdXJjZSBcCi0JCSQoQ09SQkFfT1VUUFVURElSKS9sb2d3cmFwcGVycy9PTUdTeXN0ZW1FeGNlcHRpb24ucmVzb3VyY2UgXAotCQkkKENPUkJBX09VVFBVVERJUikvbG9nd3JhcHBlcnMvT1JCVXRpbFN5c3RlbUV4Y2VwdGlvbi5yZXNvdXJjZSBcCi0JCSQoQ09SQkFfT1VUUFVURElSKS9sb2d3cmFwcGVycy9QT0FTeXN0ZW1FeGNlcHRpb24ucmVzb3VyY2UgXAotCQkkKENPUkJBX09VVFBVVERJUikvbG9nd3JhcHBlcnMvVXRpbFN5c3RlbUV4Y2VwdGlvbi5yZXNvdXJjZQotCSQoTUtESVIpIC1wICQoQEQpCi0JJChFQ0hPKSBDb25jYXRlbmF0aW5nIDggcmVzb3VyY2UgZmlsZXMgaW50byAkKEBGKQotCSQoQ0FUKSAkXiA+ICRACi0KLSMgVGhlIHJlc291cmNlcyBmaWxlcyBhcmUgZ2VuZXJhdGVkIGZyb20gbGlzcC1saWtlIC5tYyBmaWxlcy4KLSQoQ09SQkFfT1VUUFVURElSKS9sb2d3cmFwcGVycy8lU3lzdGVtRXhjZXB0aW9uLnJlc291cmNlIDogJChDT1JCQV9UT1BESVIpL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vY29yYmEvc2Uvc3BpL2xvZ2dpbmcvZGF0YS8lLm1jICQoQ09SQkFfT1VUUFVURElSKS9idGphcnMvbG9ndXRpbC5qYXIKLQkkKE1LRElSKSAtcCAkKEBEKQotCSQoUk0pIC1mICQoQEQpL190aGVfd3JhcHBlcnMuZAotCSQoRUNITykgR2VuZXJhdGluZyByZXNvdXJjZSBmaWxlIGZyb20gJCoubWMKLQkkKEpBVkEpIC1qYXIgJChDT1JCQV9PVVRQVVRESVIpL2J0amFycy9sb2d1dGlsLmphciBtYWtlLXJlc291cmNlICQ8ICQoQEQpCi0KLQotJChDT1JCQV9PVVRQVVRESVIpL2xvZ3dyYXBwZXJzL190aGVfd3JhcHBlcnMuZCA6ICQoQ09SQkFfT1VUUFVURElSKS9idGphcnMvbG9ndXRpbC5qYXIgXAotCSQoQ09SQkFfT1VUUFVURElSKS9sb2d3cmFwcGVycy9jb20vc3VuL2NvcmJhL3NlL2ltcGwvbG9nZ2luZy9BY3RpdmF0aW9uU3lzdGVtRXhjZXB0aW9uLmphdmEgXAotCSQoQ09SQkFfT1VUUFVURElSKS9sb2d3cmFwcGVycy9jb20vc3VuL2NvcmJhL3NlL2ltcGwvbG9nZ2luZy9JT1JTeXN0ZW1FeGNlcHRpb24uamF2YSBcCi0JJChDT1JCQV9PVVRQVVRESVIpL2xvZ3dyYXBwZXJzL2NvbS9zdW4vY29yYmEvc2UvaW1wbC9sb2dnaW5nL0ludGVyY2VwdG9yc1N5c3RlbUV4Y2VwdGlvbi5qYXZhIFwKLQkkKENPUkJBX09VVFBVVERJUikvbG9nd3JhcHBlcnMvY29tL3N1bi9jb3JiYS9zZS9pbXBsL2xvZ2dpbmcvTmFtaW5nU3lzdGVtRXhjZXB0aW9uLmphdmEgXAotCSQoQ09SQkFfT1VUUFVURElSKS9sb2d3cmFwcGVycy9jb20vc3VuL2NvcmJhL3NlL2ltcGwvbG9nZ2luZy9PTUdTeXN0ZW1FeGNlcHRpb24uamF2YSBcCi0JJChDT1JCQV9PVVRQVVRESVIpL2xvZ3dyYXBwZXJzL2NvbS9zdW4vY29yYmEvc2UvaW1wbC9sb2dnaW5nL09SQlV0aWxTeXN0ZW1FeGNlcHRpb24uamF2YSBcCi0JJChDT1JCQV9PVVRQVVRESVIpL2xvZ3dyYXBwZXJzL2NvbS9zdW4vY29yYmEvc2UvaW1wbC9sb2dnaW5nL1BPQVN5c3RlbUV4Y2VwdGlvbi5qYXZhIFwKLQkkKENPUkJBX09VVFBVVERJUikvbG9nd3JhcHBlcnMvY29tL3N1bi9jb3JiYS9zZS9pbXBsL2xvZ2dpbmcvVXRpbFN5c3RlbUV4Y2VwdGlvbi5qYXZhIFwKLQkkKENPUkJBX09VVFBVVERJUikvbG9nd3JhcHBlcnMvY29tL3N1bi9jb3JiYS9zZS9pbXBsL2xvZ2dpbmcvTG9nU3RyaW5ncy5wcm9wZXJ0aWVzCi0JJChNS0RJUikgLXAgJChARCkgCi0JJChFQ0hPKSBMT0dXUkFQUEVSU19BUkVfQ1JFQVRFRD15ZXMgPiAkQAotCi0jIFRyaWdnZXIgdGhlIGdlbmVyYXRpb24gb2YgdGhlIGxvZ3dyYXBwZXJzLiBBZnRlciB0aGUgbG9nd3JhcHBlciBjbGFzc2VzIGFuZAotIyByZXNvdXJjZXMgaGF2ZSBiZWVuIGNyZWF0ZWQsIHRoZW4gdGhlIG1ha2VmaWxlIHdpbGwgcmVzdGFydCBhbmQgdGhlIG5ld2x5Ci0jIGNyZWF0ZWQgamF2YSBmaWxlcyB3aWxsIGJlY29tZSBwYXJ0IG9mIHRoZSBidWlsZCBmdXJ0aGVyIGFsb25nIGluIHRoZSBtYWtlZmlsZS4KLS1pbmNsdWRlICQoQ09SQkFfT1VUUFVURElSKS9sb2d3cmFwcGVycy9fdGhlX3dyYXBwZXJzLmQKLQotaWZlcSAoJChMT0dXUkFQUEVSU19BUkVfQ1JFQVRFRCkseWVzKQotICAgICAgICAkKGV2YWwgJChjYWxsIFNldHVwSWRsQ29tcGlsYXRpb24sQlVJTERfSURMUyxcCi0gICAgICAgICAgICAgICAgSURMSjo9JChKQVZBKSAtamFyICQoQ09SQkFfT1VUUFVURElSKS9idGphcnMvaWRsai5qYXIsXAotCQlTUkM6PSQoQ09SQkFfVE9QRElSKS9zcmMvc2hhcmUvY2xhc3NlcyxcCi0JCUJJTjo9JChDT1JCQV9PVVRQVVRESVIpL2dlbnNyYyxcCi0JCUVYQ0xVREVTOj1jb20vc3VuL3Rvb2xzL2NvcmJhL3NlL2lkbC8lIFwKLQkJCW9yZy9vbWcvQ09SQkEvJSBcCi0JCQljb20vc3VuL2NvcmJhL3NlL0dpb3BJREwvJSBcCi0JCQlvcmcvb21nL1BvcnRhYmxlU2VydmVyL2NvcmJhLmlkbCxcCi0JCUlOQ0xVREVTOj0lLFwKLQkJT0xESU1QTEJBU0VTOj1jb20vc3VuL2NvcmJhL3NlL1BvcnRhYmxlQWN0aXZhdGlvbklETC9hY3RpdmF0aW9uLmlkbCBcCi0JCQkgICAgICBjb20vc3VuL2NvcmJhL3NlL3NwaS9hY3RpdmF0aW9uL2FjdGl2YXRpb24uaWRsLFwKLQkJREVMRVRFUzo9RFlOQU5ZREVMRVRFRklMRVMgb3JnL29tZy9EeW5hbWljQW55LypQT0EqIG9yZy9vbWcvRHluYW1pY0FueS8qSG9sZGVyKiBvcmcvb21nL0R5bmFtaWNBbnkvRHluVmFsdWVCb3hIZWxwZXIuamF2YSBvcmcvb21nL0R5bmFtaWNBbnkvRHluVmFsdWVDb21tb25IZWxwZXIuamF2YSBvcmcvb21nL0R5bmFtaWNBbnkvX0R5blZhbHVlQ29tbW9uU3R1Yi5qYXZhIG9yZy9vbWcvRHluYW1pY0FueS9fRHluVmFsdWVCb3hTdHViLmphdmEgb3JnL29tZy9EeW5hbWljQW55L0R5bkFueVBhY2thZ2UvVHlwZU1pc21hdGNoSG9sZGVyLmphdmEgb3JnL29tZy9EeW5hbWljQW55L0R5bkFueVBhY2thZ2UvSW52YWxpZFZhbHVlSG9sZGVyLmphdmEgb3JnL29tZy9EeW5hbWljQW55L0R5bkFueUZhY3RvcnlQYWNrYWdlL0luY29uc2lzdGVudFR5cGVDb2RlSG9sZGVyLmphdmEgSU9QREVMRVRFRklMRVMgb3JnL29tZy9JT1AvQklfRElSX0lJT1AuamF2YSBvcmcvb21nL0lPUC9DaGFpbkJ5cGFzc0NoZWNrLmphdmEgb3JnL29tZy9JT1AvQ2hhaW5CeXBhc3NJbmZvLmphdmEgb3JnL29tZy9JT1AvRk9SV0FSREVEX0lERU5USVRZLmphdmEgb3JnL29tZy9JT1AvSU5WT0NBVElPTl9QT0xJQ0lFUy5qYXZhIG9yZy9vbWcvSU9QL0xvZ2ljYWxUaHJlYWRJZC5qYXZhIG9yZy9vbWcvSU9QL1NlbmRpbmdDb250ZXh0UnVuVGltZS5qYXZhIG9yZy9vbWcvSU9QL1Vua25vd25FeGNlcHRpb25JbmZvLmphdmEgb3JnL29tZy9JT1AvVGFnZ2VkQ29tcG9uZW50U2VxSG9sZGVyLmphdmEgUE9BSEVMSE9MRklMRVMgb3JnL29tZy9Qb3J0YWJsZVNlcnZlci9DdXJyZW50UGFja2FnZS9Ob0NvbnRleHRIb2xkZXIuamF2YSBvcmcvb21nL1BvcnRhYmxlU2VydmVyL0ZvcndhcmRSZXF1ZXN0SG9sZGVyLmphdmEgb3JnL29tZy9Qb3J0YWJsZVNlcnZlci9JZEFzc2lnbm1lbnRQb2xpY3lWYWx1ZUhlbHBlci5qYXZhIG9yZy9vbWcvUG9ydGFibGVTZXJ2ZXIvSWRBc3NpZ25tZW50UG9saWN5VmFsdWVIb2xkZXIuamF2YSBvcmcvb21nL1BvcnRhYmxlU2VydmVyL0lkVW5pcXVlbmVzc1BvbGljeVZhbHVlSGVscGVyLmphdmEgb3JnL29tZy9Qb3J0YWJsZVNlcnZlci9JZFVuaXF1ZW5lc3NQb2xpY3lWYWx1ZUhvbGRlci5qYXZhIG9yZy9vbWcvUG9ydGFibGVTZXJ2ZXIvSW1wbGljaXRBY3RpdmF0aW9uUG9saWN5VmFsdWVIZWxwZXIuamF2YSBvcmcvb21nL1BvcnRhYmxlU2VydmVyL0ltcGxpY2l0QWN0aXZhdGlvblBvbGljeVZhbHVlSG9sZGVyLmphdmEgb3JnL29tZy9Qb3J0YWJsZVNlcnZlci9MaWZlc3BhblBvbGljeVZhbHVlSGVscGVyLmphdmEgb3JnL29tZy9Qb3J0YWJsZVNlcnZlci9MaWZlc3BhblBvbGljeVZhbHVlSG9sZGVyLmphdmEgb3JnL29tZy9Qb3J0YWJsZVNlcnZlci9TZXJ2YW50UmV0ZW50aW9uUG9saWN5VmFsdWVIZWxwZXIuamF2YSBvcmcvb21nL1BvcnRhYmxlU2VydmVyL1NlcnZhbnRSZXRlbnRpb25Qb2xpY3lWYWx1ZUhvbGRlci5qYXZhIG9yZy9vbWcvUG9ydGFibGVTZXJ2ZXIvT2JqZWN0SWRIZWxwZXIuamF2YSBvcmcvb21nL1BvcnRhYmxlU2VydmVyL09iamVjdElkSG9sZGVyLmphdmEgb3JnL29tZy9Qb3J0YWJsZVNlcnZlci9QT0FMaXN0SGVscGVyLmphdmEgb3JnL29tZy9Qb3J0YWJsZVNlcnZlci9QT0FMaXN0SG9sZGVyLmphdmEgb3JnL29tZy9Qb3J0YWJsZVNlcnZlci9QT0FNYW5hZ2VyUGFja2FnZS9BZGFwdGVySW5hY3RpdmVIb2xkZXIuamF2YSBvcmcvb21nL1BvcnRhYmxlU2VydmVyL1BPQU1hbmFnZXJQYWNrYWdlL1N0YXRlSGVscGVyLmphdmEgb3JnL29tZy9Qb3J0YWJsZVNlcnZlci9QT0FNYW5hZ2VyUGFja2FnZS9TdGF0ZUhvbGRlci5qYXZhIG9yZy9vbWcvUG9ydGFibGVTZXJ2ZXIvUE9BUGFja2FnZS9BZGFwdGVyQWxyZWFkeUV4aXN0c0hvbGRlci5qYXZhIG9yZy9vbWcvUG9ydGFibGVTZXJ2ZXIvUE9BUGFja2FnZS9BZGFwdGVyTm9uRXhpc3RlbnRIb2xkZXIuamF2YSBvcmcvb21nL1BvcnRhYmxlU2VydmVyL1BPQVBhY2thZ2UvSW52YWxpZFBvbGljeUhvbGRlci5qYXZhIG9yZy9vbWcvUG9ydGFibGVTZXJ2ZXIvUE9BUGFja2FnZS9Ob1NlcnZhbnRIb2xkZXIuamF2YSBvcmcvb21nL1BvcnRhYmxlU2VydmVyL1BPQVBhY2thZ2UvT2JqZWN0QWxyZWFkeUFjdGl2ZUhvbGRlci5qYXZhIG9yZy9vbWcvUG9ydGFibGVTZXJ2ZXIvUE9BUGFja2FnZS9PYmplY3ROb3RBY3RpdmVIb2xkZXIuamF2YSBvcmcvb21nL1BvcnRhYmxlU2VydmVyL1BPQVBhY2thZ2UvU2VydmFudEFscmVhZHlBY3RpdmVIb2xkZXIuamF2YSBvcmcvb21nL1BvcnRhYmxlU2VydmVyL1BPQVBhY2thZ2UvU2VydmFudE5vdEFjdGl2ZUhvbGRlci5qYXZhIG9yZy9vbWcvUG9ydGFibGVTZXJ2ZXIvUE9BUGFja2FnZS9Xcm9uZ0FkYXB0ZXJIb2xkZXIuamF2YSBvcmcvb21nL1BvcnRhYmxlU2VydmVyL1BPQVBhY2thZ2UvV3JvbmdQb2xpY3lIb2xkZXIuamF2YSBvcmcvb21nL1BvcnRhYmxlU2VydmVyL1JlcXVlc3RQcm9jZXNzaW5nUG9saWN5VmFsdWVIZWxwZXIuamF2YSBvcmcvb21nL1BvcnRhYmxlU2VydmVyL1JlcXVlc3RQcm9jZXNzaW5nUG9saWN5VmFsdWVIb2xkZXIuamF2YSBvcmcvb21nL1BvcnRhYmxlU2VydmVyL1NlcnZhbnRBY3RpdmF0b3JIb2xkZXIuamF2YSBvcmcvb21nL1BvcnRhYmxlU2VydmVyL1NlcnZhbnRMb2NhdG9ySG9sZGVyLmphdmEgb3JnL29tZy9Qb3J0YWJsZVNlcnZlci9UaHJlYWRQb2xpY3lWYWx1ZUhlbHBlci5qYXZhIG9yZy9vbWcvUG9ydGFibGVTZXJ2ZXIvVGhyZWFkUG9saWN5VmFsdWVIb2xkZXIuamF2YSBQSUhFTEhPTEZJTEVTIG9yZy9vbWcvUG9ydGFibGVJbnRlcmNlcHRvci9DbGllbnRSZXF1ZXN0SW5mb0hlbHBlci5qYXZhIG9yZy9vbWcvUG9ydGFibGVJbnRlcmNlcHRvci9DbGllbnRSZXF1ZXN0SW50ZXJjZXB0b3JIZWxwZXIuamF2YSBvcmcvb21nL1BvcnRhYmxlSW50ZXJjZXB0b3IvSU9SSW5mb0hlbHBlci5qYXZhIG9yZy9vbWcvUG9ydGFibGVJbnRlcmNlcHRvci9JT1JJbnRlcmNlcHRvckhlbHBlci5qYXZhIG9yZy9vbWcvUG9ydGFibGVJbnRlcmNlcHRvci9JbnRlcmNlcHRvckhlbHBlci5qYXZhIG9yZy9vbWcvUG9ydGFibGVJbnRlcmNlcHRvci9PUkJJbml0SW5mb0hlbHBlci5qYXZhIG9yZy9vbWcvUG9ydGFibGVJbnRlcmNlcHRvci9PUkJJbml0aWFsaXplckhlbHBlci5qYXZhIG9yZy9vbWcvUG9ydGFibGVJbnRlcmNlcHRvci9Qb2xpY3lGYWN0b3J5SGVscGVyLmphdmEgb3JnL29tZy9Qb3J0YWJsZUludGVyY2VwdG9yL1JlcGx5U3RhdHVzSGVscGVyLmphdmEgb3JnL29tZy9Qb3J0YWJsZUludGVyY2VwdG9yL1JlcXVlc3RJbmZvSGVscGVyLmphdmEgb3JnL29tZy9Qb3J0YWJsZUludGVyY2VwdG9yL1NlcnZlclJlcXVlc3RJbmZvSGVscGVyLmphdmEgb3JnL29tZy9Qb3J0YWJsZUludGVyY2VwdG9yL1NlcnZlclJlcXVlc3RJbnRlcmNlcHRvckhlbHBlci5qYXZhIG9yZy9vbWcvUG9ydGFibGVJbnRlcmNlcHRvci9TbG90SWRIZWxwZXIuamF2YSBvcmcvb21nL1BvcnRhYmxlSW50ZXJjZXB0b3IvQ2xpZW50UmVxdWVzdEluZm9Ib2xkZXIuamF2YSBvcmcvb21nL1BvcnRhYmxlSW50ZXJjZXB0b3IvQ2xpZW50UmVxdWVzdEludGVyY2VwdG9ySG9sZGVyLmphdmEgb3JnL29tZy9Qb3J0YWJsZUludGVyY2VwdG9yL0N1cnJlbnRIb2xkZXIuamF2YSBvcmcvb21nL1BvcnRhYmxlSW50ZXJjZXB0b3IvRm9yd2FyZFJlcXVlc3RIb2xkZXIuamF2YSBvcmcvb21nL1BvcnRhYmxlSW50ZXJjZXB0b3IvSU9SSW5mb0hvbGRlci5qYXZhIG9yZy9vbWcvUG9ydGFibGVJbnRlcmNlcHRvci9JT1JJbnRlcmNlcHRvckhvbGRlci5qYXZhIG9yZy9vbWcvUG9ydGFibGVJbnRlcmNlcHRvci9JbnRlcmNlcHRvckhvbGRlci5qYXZhIG9yZy9vbWcvUG9ydGFibGVJbnRlcmNlcHRvci9JbnZhbGlkU2xvdEhvbGRlci5qYXZhIG9yZy9vbWcvUG9ydGFibGVJbnRlcmNlcHRvci9PUkJJbml0SW5mb0hvbGRlci5qYXZhIG9yZy9vbWcvUG9ydGFibGVJbnRlcmNlcHRvci9PUkJJbml0aWFsaXplckhvbGRlci5qYXZhIG9yZy9vbWcvUG9ydGFibGVJbnRlcmNlcHRvci9Qb2xpY3lGYWN0b3J5SG9sZGVyLmphdmEgb3JnL29tZy9Qb3J0YWJsZUludGVyY2VwdG9yL1JlcXVlc3RJbmZvSG9sZGVyLmphdmEgb3JnL29tZy9Qb3J0YWJsZUludGVyY2VwdG9yL1NlcnZlclJlcXVlc3RJbmZvSG9sZGVyLmphdmEgb3JnL29tZy9Qb3J0YWJsZUludGVyY2VwdG9yL1NlcnZlclJlcXVlc3RJbnRlcmNlcHRvckhvbGRlci5qYXZhIG9yZy9vbWcvUG9ydGFibGVJbnRlcmNlcHRvci9UYWdnZWRDb21wb25lbnRTZXFIb2xkZXIuamF2YSBvcmcvb21nL1BvcnRhYmxlSW50ZXJjZXB0b3IvT1JCSW5pdEluZm9QYWNrYWdlL0R1cGxpY2F0ZU5hbWVIb2xkZXIuamF2YSBvcmcvb21nL1BvcnRhYmxlSW50ZXJjZXB0b3IvT1JCSW5pdEluZm9QYWNrYWdlL0ludmFsaWROYW1lSG9sZGVyLmphdmEgb3JnL29tZy9JT1AvQ29kZWNQYWNrYWdlL0Zvcm1hdE1pc21hdGNoSG9sZGVyLmphdmEgb3JnL29tZy9JT1AvQ29kZWNQYWNrYWdlL0ludmFsaWRUeXBlRm9yRW5jb2RpbmdIb2xkZXIuamF2YSBvcmcvb21nL0lPUC9Db2RlY1BhY2thZ2UvVHlwZU1pc21hdGNoSG9sZGVyLmphdmEgb3JnL29tZy9JT1AvQ29kZWNIZWxwZXIuamF2YSBvcmcvb21nL0lPUC9FbmNvZGluZ0Zvcm1hdEhlbHBlci5qYXZhIG9yZy9vbWcvSU9QL0VuY29kaW5nSGVscGVyLmphdmEgb3JnL29tZy9JT1AvQ29kZWNGYWN0b3J5UGFja2FnZS9Vbmtub3duRW5jb2RpbmdIb2xkZXIuamF2YSBvcmcvb21nL0lPUC9Db2RlY0ZhY3RvcnlIb2xkZXIuamF2YSBvcmcvb21nL0lPUC9Db2RlY0hvbGRlci5qYXZhIG9yZy9vbWcvSU9QL0VuY29kaW5nSG9sZGVyLmphdmEgb3JnL29tZy9JT1AvVGFnZ2VkQ29tcG9uZW50U2VxSGVscGVyLmphdmEgb3JnL29tZy9EeW5hbWljL0NvbnRleHRMaXN0SGVscGVyLmphdmEgb3JnL29tZy9EeW5hbWljL0V4Y2VwdGlvbkxpc3RIZWxwZXIuamF2YSBvcmcvb21nL0R5bmFtaWMvUGFyYW1ldGVySG9sZGVyLmphdmEgb3JnL29tZy9EeW5hbWljL1BhcmFtZXRlckxpc3RIb2xkZXIuamF2YSBvcmcvb21nL0R5bmFtaWMvRXhjZXB0aW9uTGlzdEhvbGRlci5qYXZhIG9yZy9vbWcvRHluYW1pYy9QYXJhbWV0ZXJIZWxwZXIuamF2YSBvcmcvb21nL0R5bmFtaWMvUGFyYW1ldGVyTGlzdEhlbHBlci5qYXZhIG9yZy9vbWcvRHluYW1pYy9SZXF1ZXN0Q29udGV4dEhlbHBlci5qYXZhIENPUkJBWCBvcmcvb21nL0NPUkJBL09jdGV0U2VxSGVscGVyLmphdmEgb3JnL29tZy9DT1JCQS9PY3RldFNlcUhvbGRlci5qYXZhIG9yZy9vbWcvQ09SQkEvUG9saWN5RXJyb3IuamF2YSBvcmcvb21nL0NPUkJBL1JlcG9zaXRvcnlJZEhlbHBlci5qYXZhKSkgCi0KLSAgICAgICAgJChCVUlMRF9JRExTKSA6ICQoQ09SQkFfT1VUUFVURElSKS9idGphcnMvaWRsai5qYXIKLQotICAgICAgICAkKENPUkJBX09VVFBVVERJUikvZ2Vuc3JjL190aGVfaWRscy5kIDogJChCVUlMRF9JRExTKSAkKENPUkJBX09VVFBVVERJUikvYnRqYXJzL2lkbGouamFyCi0JCSQoTUtESVIpIC1wICQoQEQpCi0JCSQoRUNITykgSURMU19BUkVfQ1JFQVRFRD15ZXMgPiAkQAotCi0gICAgICAgIC1pbmNsdWRlICQoQ09SQkFfT1VUUFVURElSKS9nZW5zcmMvX3RoZV9pZGxzLmQKLQotICAgICAgICBpZmVxICgkKElETFNfQVJFX0NSRUFURUQpLHllcykKLSAgICAgICAgICAgICAgICAkKGV2YWwgJChjYWxsIFNldHVwSmF2YUNvbXBpbGF0aW9uLEJVSUxEX0NPUkJBLFwKLQkJICAgIFNFVFVQOj1HRU5FUkFURV9ORVdCWVRFQ09ERSxcCi0JCSAgICBTUkM6PSQoQ09SQkFfVE9QRElSKS9zcmMvc2hhcmUvY2xhc3NlcyAkKENPUkJBX09VVFBVVERJUikvZ2Vuc3JjICQoQ09SQkFfT1VUUFVURElSKS9sb2d3cmFwcGVycyxcCi0JCSAgICBFWENMVURFUzo9Y29tL3N1bi9jb3JiYS9zZS9Qb3J0YWJsZUFjdGl2YXRpb25JRExcCi0JCQkgICAgICBjb20vc3VuL3Rvb2xzL2NvcmJhL3NlL2xvZ3V0aWwsXAotCQkgICAgRVhDTFVERV9GSUxFUzo9Y29tL3N1bi9jb3JiYS9zZS9pbXBsL3ByZXNlbnRhdGlvbi9ybWkvSk5ESVN0YXRlRmFjdG9yeUltcGwuamF2YSBcCi0JCQkJICAgY29tL3N1bi9jb3JiYS9zZS9zcGkvcHJlc2VudGF0aW9uL3JtaS9TdHViV3JhcHBlci5qYXZhIFwKLQkJCQkgICBjb20vc3VuL29yZy9vbWcvQ09SQkEvSURMVHlwZU9wZXJhdGlvbnMuamF2YSBcCi0JCQkJICAgY29tL3N1bi9vcmcvb21nL0NPUkJBL0lST2JqZWN0T3BlcmF0aW9ucy5qYXZhIFwKLQkJCQkgICBvcmcvb21nL1BvcnRhYmxlSW50ZXJjZXB0b3IvVU5LTk9XTi5qYXZhIFwKLQkJCQkgICBjb20vc3VuL3Rvb2xzL2NvcmJhL3NlL2lkbC9SZXNvdXJjZUJ1bmRsZVV0aWwuamF2YVwKLQkJCQkgICBjb20vc3VuL2NvcmJhL3NlL2ltcGwvcHJlc2VudGF0aW9uL3JtaS9qbmRpLnByb3BlcnRpZXMsXAotCQkgICAgQ09QWTo9LnBycCBMb2dTdHJpbmdzLnByb3BlcnRpZXMsXAotCQkgICAgQklOOj0kKENPUkJBX09VVFBVVERJUikvY2xhc3NlcykpCi0KLSAgICAgICAgICAgICAgICAjIFNlcGFyYXRlIHNyYy56aXAgY2FsbCB0byBpbmNsdWRlIHNvdXJjZXMgdGhhdCB3ZXJlIGV4Y2x1ZGVkIGluIHRoZSBidWlsZCB0byAKLSAgICAgICAgICAgICAgICAjIG1pbWljIGJlaGF2aW9yIGluIG9sZCBidWlsZCBzeXN0ZW0uCi0gICAgICAgICAgICAgICAgJChldmFsICQoY2FsbCBTZXR1cFppcEFyY2hpdmUsQVJDSElWRV9CVUlMRF9DT1JCQSxcCi0JCSAgICBTUkM6PSQoQ09SQkFfVE9QRElSKS9zcmMvc2hhcmUvY2xhc3NlcyAkKENPUkJBX09VVFBVVERJUikvZ2Vuc3JjICQoQ09SQkFfT1VUUFVURElSKS9sb2d3cmFwcGVycyxcCi0JCSAgICBaSVA6PSQoQ09SQkFfT1VUUFVURElSKS9kaXN0L2xpYi9zcmMuemlwKSkKLQotICAgICAgICAgICAgICAgICQoQlVJTERfQ09SQkEpIDogJChCVUlMRF9JRExTKSAkKExPR1dSQVBQRVJfREVQRU5ERU5DSUVTKQotCi0gICAgICAgICAgICAgICAgIyBSdW4gc3RyaXBwcm9wZXJ0aWVzIG9uIGFsbCBzdW5vcmIgcmVzb3VyY2UgZmlsZXMuCi0gICAgICAgICAgICAgICAgU1RSSVBfUFJPUF9TUkNfRklMRVM6PSQoc2hlbGwgJChGSU5EKSAkKENPUkJBX1RPUERJUikvc3JjL3NoYXJlL2NsYXNzZXMgLW5hbWUgInN1bm9yYioucHJvcGVydGllcyIpCi0gICAgICAgICAgICAgICAgU1RSSVBfUFJPUF9GSUxFUzo9JChwYXRzdWJzdCAgJChDT1JCQV9UT1BESVIpL3NyYy9zaGFyZS9jbGFzc2VzLyUsJChDT1JCQV9PVVRQVVRESVIpL2NsYXNzZXMvJSxcCi0JCQkkKFNUUklQX1BST1BfU1JDX0ZJTEVTKSkKLSAgICAgICAgICAgICAgICAjIFNpbXBsZSBkZWxpdmVyeSBvZiB6aF9ISyBwcm9wZXJ0aWVzIGZpbGVzIGp1c3QgY29waWVzIHpoX1RXIHByb3BlcnRpZXMgZmlsZXMKLSAgICAgICAgICAgICAgICBTVFJJUF9QUk9QX0ZJTEVTKz0kKHBhdHN1YnN0ICAkKENPUkJBX1RPUERJUikvc3JjL3NoYXJlL2NsYXNzZXMvJV96aF9UVy5wcm9wZXJ0aWVzLFwKLQkJCSQoQ09SQkFfT1VUUFVURElSKS9jbGFzc2VzLyVfemhfSEsucHJvcGVydGllcyxcCi0JCQkkKHNoZWxsICQoRklORCkgJChDT1JCQV9UT1BESVIpL3NyYy9zaGFyZS9jbGFzc2VzIC1uYW1lICJzdW5vcmJfemhfVFcucHJvcGVydGllcyIpKQotICAgICAgICAgICAgICAgIFNUUklQX1BST1BfU1JDX0ZJTEVTKz0kKHNoZWxsICQoRklORCkgJChDT1JCQV9UT1BESVIpL3NyYy9zaGFyZS9jbGFzc2VzIC1uYW1lICJzdW5vcmJfemhfVFcucHJvcGVydGllcyIpCi0JCVNUUklQX1BST1BfQ01ETElORTo9JChzdWJzdCBfU1BBQ0VfLCQoU1BBQ0UpLFwKLQkJCSQoam9pbiAkKGFkZHByZWZpeCAtY2xlYW5fU1BBQ0VfLCQoU1RSSVBfUFJPUF9TUkNfRklMRVMpKSwgXAotCQkJJChhZGRwcmVmaXggX1NQQUNFXywkKFNUUklQX1BST1BfRklMRVMpKSkpCi0KLSAgICAgICAgICAgICAgICAkKENPUkJBX09VVFBVVERJUikvX3RoZS5zdHJpcHBlZF9wcm9wZXJ0aWVzOiAkKFNUUklQX1BST1BfU1JDX0ZJTEVTKSBcCi0JCQkJCSQoQ09SQkFfT1VUUFVURElSKS9idGphcnMvc3RyaXBwcm9wZXJ0aWVzLmphcgotCQkJJChNS0RJUikgLXAgJChzb3J0ICQoZGlyICQoU1RSSVBfUFJPUF9GSUxFUykpKQotCQkJJChjYWxsIExpc3RQYXRoc1NhZmVseSxTVFJJUF9QUk9QX0NNRExJTkUsXG4sID4+ICQoQ09SQkFfT1VUUFVURElSKS9fdGhlLnN0cmlwX3Byb3AuY21kbGluZSkKLQkJCSQoSkFWQSkgLWphciAkKENPUkJBX09VVFBVVERJUikvYnRqYXJzL3N0cmlwcHJvcGVydGllcy5qYXIgXAotCQkJCUAkKENPUkJBX09VVFBVVERJUikvX3RoZS5zdHJpcF9wcm9wLmNtZGxpbmUKLQkJCSQoVE9VQ0gpICRACi0KLSAgICAgICAgICAgICAgICAkKGV2YWwgJChjYWxsIFNldHVwQXJjaGl2ZSxBUkNISVZFX0NPUkJBLFwKLQkJICAgICAkKEJVSUxEX0NPUkJBKSAkKENPUkJBX09VVFBVVERJUikvX3RoZS5zdHJpcHBlZF9wcm9wZXJ0aWVzLFwKLQkJICAgICBTUkNTOj0kKENPUkJBX09VVFBVVERJUikvY2xhc3NlcyxcCi0JCSAgICAgU1VGRklYRVM6PS5jbGFzcyAucHJwIC5wcm9wZXJ0aWVzLFwKLQkJICAgICBKQVI6PSQoQ09SQkFfT1VUUFVURElSKS9kaXN0L2xpYi9jbGFzc2VzLmphcikpCi0KLSAgICAgICAgICAgICAgICAjIFRoZSBjcmVhdGVkIGNsYXNzZXMuamFyIG5vdyBjb250YWlucyBDb3JiYSBjb21waWxlZCB0byBydW4gb24gdGhlIHRhcmdldCBKREsKLSAgICAgICAgICAgICAgICAjIGFuZCBpcyByZWFkeSBmb3IgaW5jbHVzaW9uIGluIGpkayBydC5qYXIuCi0KLSAgICAgICAgICAgICAgICAjIFRoZSBjcmVhdGVkIHNyYy56aXAgbm93IGNvbnRhaW5zIC5qYXZhIGFuZCAucHJvcGVydGllcyBmaWxlcyB1c2VkIHRvIGNyZWF0ZSB0aGUgY2xhc3NlcyBpbiBjbGFzc2VzLmphcgotICAgICAgICAgICAgICAgICMgYW5kIGlzIHJlYWR5IGZvciBpbmNsdXNpb24gaW50byB0aGUgamRrIHNyYy56aXAKLQotICAgICAgICAgICAgICAgIEJJTl9GSUxFUzo9JChDT1JCQV9UT1BESVIpL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvY29yYmEvc2UvaWRsL29yYi5pZGwgXAotCQkJICAgJChDT1JCQV9UT1BESVIpL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvY29yYmEvc2UvaWRsL2lyLmlkbAotCi0gICAgICAgICAgICAgICAgJChDT1JCQV9PVVRQVVRESVIpL2Rpc3QvbGliL2Jpbi56aXAgOiAkKEJJTl9GSUxFUykgJChDT1JCQV9PVVRQVVRESVIpL2Rpc3QvbGliL2NsYXNzZXMuamFyCi0JCQkkKE1LRElSKSAtcCAkKENPUkJBX09VVFBVVERJUikvZGlzdC9saWIKLQkJCSQoTUtESVIpIC1wICQoQ09SQkFfT1VUUFVURElSKS9saWIKLQkJCSQoUk0pIC1mICRACi0JCQkkKEVDSE8pIENyZWF0aW5nIGBiYXNlbmFtZSAkQGAKLQkJCSQoQ1ApICQoQklOX0ZJTEVTKSAkKENPUkJBX09VVFBVVERJUikvbGliCi0JCQkkKENITU9EKSB1Zyt3ICQoQ09SQkFfT1VUUFVURElSKS9saWIvKgotCQkJKGNkICQoQ09SQkFfT1VUUFVURElSKTsgJChaSVApIC1xICRAIGxpYi9vcmIuaWRsIGxpYi9pci5pZGwpCi0KLSAgICAgICAgICAgICAgICAjIFRoZSBjcmVhdGVkIGJpbi56aXAgbm93IGNvbnRhaW5zIHRoZSBjb3JiYSBzcGVjaWZpYyBiaW5hcmllczogb3JiLmlkbCwgaXIuaWRsCi0KLSAgICAgICAgICAgICAgICBhbGw6IAkkKENPUkJBX09VVFBVVERJUikvYnRqYXJzL3N0cmlwcHJvcGVydGllcy5qYXIgXAotCQkJJChDT1JCQV9PVVRQVVRESVIpL2J0amFycy9pZGxqLmphciBcCi0JCQkkKENPUkJBX09VVFBVVERJUikvYnRqYXJzL2xvZ3V0aWwuamFyIFwKLQkJCSQoQ09SQkFfT1VUUFVURElSKS9kaXN0L2xpYi9jbGFzc2VzLmphciBcCi0JCQkkKENPUkJBX09VVFBVVERJUikvZGlzdC9saWIvc3JjLnppcCBcCi0JCQkkKENPUkJBX09VVFBVVERJUikvZGlzdC9saWIvYmluLnppcAotICAgICAgICBlbmRpZgorIyBUcnkgdG8gbG9jYXRlIHRvcC1sZXZlbCBtYWtlZmlsZQordG9wX2xldmVsX21ha2VmaWxlOj0kKHJlcG9fZGlyKS8uLi9jb21tb24vbWFrZWZpbGVzL01ha2VmaWxlCitpZm5lcSAoJCh3aWxkY2FyZCAkKHRvcF9sZXZlbF9tYWtlZmlsZSkpLCkKKyAgJChpbmZvIFdpbGwgcnVuICQoc3Vic3lzdGVtX25hbWUpIHRhcmdldCBvbiB0b3AtbGV2ZWwgTWFrZWZpbGUpCisgICQoaW5mbyBXQVJOSU5HOiBUaGlzIGlzIGEgbm9uLXJlY29tbWVuZGVkIHdheSBvZiBidWlsZGluZyEpCisgICQoaW5mbyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0pCitlbHNlCisgICQoaW5mbyBDYW5ub3QgbG9jYXRlIHRvcC1sZXZlbCBNYWtlZmlsZS4gSXMgdGhpcyByZXBvIG5vdCBjaGVja2VkIG91dCBhcyBwYXJ0IG9mIGEgY29tcGxldGUgZm9yZXN0PykKKyAgJChlcnJvciBCdWlsZCBmcm9tIHRvcC1sZXZlbCBNYWtlZmlsZSBpbnN0ZWFkKQogZW5kaWYKIAotY2xlYW46Ci0JJChSTSkgLXJmICQoQ09SQkFfT1VUUFVURElSKQotCi0uUEhPTlk6IGRlZmF1bHQgYWxsIGNsZWFuIGNsb2JiZXIgCithbGw6CisJQCQoTUFLRSkgLWYgJCh0b3BfbGV2ZWxfbWFrZWZpbGUpICQoc3Vic3lzdGVtX25hbWUpCmRpZmYgLS1naXQgYS9ob3RzcG90Ly5oZ3RhZ3MgYi9ob3RzcG90Ly5oZ3RhZ3MKaW5kZXggMGRhNGY5ZC4uZTRmOGJjNyAxMDA2NDQKLS0tIGEvaG90c3BvdC8uaGd0YWdzCisrKyBiL2hvdHNwb3QvLmhndGFncwpAQCAtMjg3LDMgKzI4Nyw1IEBACiBiMjYxNTIzZmU2NmM0MGEwMjk2OGYwYWE3ZTczNjAyNDkxYmIzMzg2IGhzMjUtYjA1CiA0NTQ3ZGM3MWRiNzY1Mjc2ZTAyN2IwYzI3ODBiNzI0YmFlMGEwN2QzIGpkazgtYjYxCiBkMDMzN2MzMWM4YmU3NzE2MzY5YjRlN2MzYmQ1ZjM1Mjk4M2M2YTA2IGhzMjUtYjA2CitkY2NkNDBkZThkYjFmYTk2ZjE4NmU2MTc5OTA3ODE4ZDc1MzIwNDQwIGpkazgtYjYyCitkYzE2ZmU0MjJjNTM1ZWNkNGU5ZjgwZmI4MTRhMWJiOTcwNGRhNmY1IGhzMjUtYjA3CmRpZmYgLS1naXQgYS9ob3RzcG90L2FnZW50L3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9qdm0vaG90c3BvdC9pbnRlcnByZXRlci9CeXRlY29kZXMuamF2YSBiL2hvdHNwb3QvYWdlbnQvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL2p2bS9ob3RzcG90L2ludGVycHJldGVyL0J5dGVjb2Rlcy5qYXZhCmluZGV4IDFiYTIwZjcuLjNmMDllZTMgMTAwNjQ0Ci0tLSBhL2hvdHNwb3QvYWdlbnQvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL2p2bS9ob3RzcG90L2ludGVycHJldGVyL0J5dGVjb2Rlcy5qYXZhCisrKyBiL2hvdHNwb3QvYWdlbnQvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL2p2bS9ob3RzcG90L2ludGVycHJldGVyL0J5dGVjb2Rlcy5qYXZhCkBAIC0yNzIsOSArMjcyLDEwIEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IF9mYXN0X2FsZGMgICAgICAgICAgICA9IDIyOTsKICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgX2Zhc3RfYWxkY193ICAgICAgICAgID0gMjMwOwogICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBfcmV0dXJuX3JlZ2lzdGVyX2ZpbmFsaXplciA9IDIzMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgX3Nob3VsZG5vdHJlYWNoaGVyZSAgID0gMjMyOyAvLyBGb3IgZGVidWdnaW5nCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IF9pbnZva2VoYW5kbGUgICAgICAgICA9IDIzMjsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgX3Nob3VsZG5vdHJlYWNoaGVyZSAgID0gMjMzOyAvLyBGb3IgZGVidWdnaW5nCiAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbnVtYmVyX29mX2NvZGVzICAgICAgID0gMjMzOworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBudW1iZXJfb2ZfY29kZXMgICAgICAgPSAyMzQ7CiAKICAgLy8gRmxhZyBiaXRzIGRlcml2ZWQgZnJvbSBmb3JtYXQgc3RyaW5ncywgY2FuX3RyYXAsIGNhbl9yZXdyaXRlLCBldGMuOgogICAvLyBzZW1hbnRpYyBmbGFnczoKQEAgLTc4NywyMCArNzg4LDIyIEBACiAgICAgZGVmKF9mYXN0X2FhY2Nlc3NfMCAgICAgICwgImZhc3RfYWFjY2Vzc18wIiAgICAgICwgImJfSkoiICwgbnVsbCAgICAsIEJhc2ljVHlwZS5nZXRUT2JqZWN0KCkgLCAgMSwgdHJ1ZSAsIF9hbG9hZF8wICAgICAgICApOwogICAgIGRlZihfZmFzdF9mYWNjZXNzXzAgICAgICAsICJmYXN0X2ZhY2Nlc3NfMCIgICAgICAsICJiX0pKIiAsIG51bGwgICAgLCBCYXNpY1R5cGUuZ2V0VE9iamVjdCgpICwgIDEsIHRydWUgLCBfYWxvYWRfMCAgICAgICAgKTsKIAotICAgIGRlZihfZmFzdF9pbG9hZCAgICAgICAgICAsICJmYXN0X2lsb2FkIiAgICAgICAgICAsICJiaSIgICAsIG51bGwgICAgLCBCYXNpY1R5cGUuZ2V0VEludCgpICAgICwgIDEsIGZhbHNlLCBfaWxvYWQpOwotICAgIGRlZihfZmFzdF9pbG9hZDIgICAgICAgICAsICJmYXN0X2lsb2FkMiIgICAgICAgICAsICJiaV9pIiAsIG51bGwgICAgLCBCYXNpY1R5cGUuZ2V0VEludCgpICAgICwgIDIsIGZhbHNlLCBfaWxvYWQpOwotICAgIGRlZihfZmFzdF9pY2Fsb2FkICAgICAgICAsICJmYXN0X2ljYWxvYWQiICAgICAgICAsICJiaV8iICAsIG51bGwgICAgLCBCYXNpY1R5cGUuZ2V0VEludCgpICAgICwgIDAsIGZhbHNlLCBfaWxvYWQpOworICAgIGRlZihfZmFzdF9pbG9hZCAgICAgICAgICAsICJmYXN0X2lsb2FkIiAgICAgICAgICAsICJiaSIgICAsIG51bGwgICAgLCBCYXNpY1R5cGUuZ2V0VEludCgpICAgICwgIDEsIGZhbHNlLCBfaWxvYWQgICAgICAgICAgKTsKKyAgICBkZWYoX2Zhc3RfaWxvYWQyICAgICAgICAgLCAiZmFzdF9pbG9hZDIiICAgICAgICAgLCAiYmlfaSIgLCBudWxsICAgICwgQmFzaWNUeXBlLmdldFRJbnQoKSAgICAsICAyLCBmYWxzZSwgX2lsb2FkICAgICAgICAgICk7CisgICAgZGVmKF9mYXN0X2ljYWxvYWQgICAgICAgICwgImZhc3RfaWNhbG9hZCIgICAgICAgICwgImJpXyIgICwgbnVsbCAgICAsIEJhc2ljVHlwZS5nZXRUSW50KCkgICAgLCAgMCwgZmFsc2UsIF9pbG9hZCAgICAgICAgICApOwogCiAgICAgLy8gRmFzdGVyIG1ldGhvZCBpbnZvY2F0aW9uLgotICAgIGRlZihfZmFzdF9pbnZva2V2ZmluYWwgICAsICJmYXN0X2ludm9rZXZmaW5hbCIgICAsICJiSkoiICAsIG51bGwgICAgLCBCYXNpY1R5cGUuZ2V0VElsbGVnYWwoKSwgLTEsIHRydWUsIF9pbnZva2V2aXJ0dWFsKTsKKyAgICBkZWYoX2Zhc3RfaW52b2tldmZpbmFsICAgLCAiZmFzdF9pbnZva2V2ZmluYWwiICAgLCAiYkpKIiAgLCBudWxsICAgICwgQmFzaWNUeXBlLmdldFRJbGxlZ2FsKCksIC0xLCB0cnVlLCBfaW52b2tldmlydHVhbCAgICk7CiAKICAgICBkZWYoX2Zhc3RfbGluZWFyc3dpdGNoICAgLCAiZmFzdF9saW5lYXJzd2l0Y2giICAgLCAiIiAgICAgLCBudWxsICAgICwgQmFzaWNUeXBlLmdldFRWb2lkKCkgICAsIC0xLCBmYWxzZSwgX2xvb2t1cHN3aXRjaCAgICk7CiAgICAgZGVmKF9mYXN0X2JpbmFyeXN3aXRjaCAgICwgImZhc3RfYmluYXJ5c3dpdGNoIiAgICwgIiIgICAgICwgbnVsbCAgICAsIEJhc2ljVHlwZS5nZXRUVm9pZCgpICAgLCAtMSwgZmFsc2UsIF9sb29rdXBzd2l0Y2ggICApOworICAgIGRlZihfZmFzdF9hbGRjICAgICAgICAgICAsICJmYXN0X2FsZGMiICAgICAgICAgICAsICJiaiIgICAsIG51bGwgICAgLCBCYXNpY1R5cGUuZ2V0VE9iamVjdCgpLCAgIDEsIHRydWUsICBfbGRjICAgICAgICAgICAgKTsKKyAgICBkZWYoX2Zhc3RfYWxkY193ICAgICAgICAgLCAiZmFzdF9hbGRjX3ciICAgICAgICAgLCAiYkpKIiAgLCBudWxsICAgICwgQmFzaWNUeXBlLmdldFRPYmplY3QoKSwgICAxLCB0cnVlLCAgX2xkY193ICAgICAgICAgICk7CiAKICAgICBkZWYoX3JldHVybl9yZWdpc3Rlcl9maW5hbGl6ZXIsICJyZXR1cm5fcmVnaXN0ZXJfZmluYWxpemVyIiwgImIiICAgICwgbnVsbCAgICAsIEJhc2ljVHlwZS5nZXRUVm9pZCgpICAgLCAwLCB0cnVlLCBfcmV0dXJuICk7CiAKLSAgICBkZWYoX2Zhc3RfYWxkYyAgICAgICAgICAgLCAiZmFzdF9hbGRjIiAgICAgICAgICAgLCAiYmoiICAgLCBudWxsICAgICwgQmFzaWNUeXBlLmdldFRPYmplY3QoKSwgICAxLCB0cnVlLCAgX2xkYyAgICk7Ci0gICAgZGVmKF9mYXN0X2FsZGNfdyAgICAgICAgICwgImZhc3RfYWxkY193IiAgICAgICAgICwgImJKSiIgICwgbnVsbCAgICAsIEJhc2ljVHlwZS5nZXRUT2JqZWN0KCksICAgMSwgdHJ1ZSwgIF9sZGNfdyApOworICAgIC8vIHNwZWNpYWwgaGFuZGxpbmcgb2Ygc2lnbmF0dXJlLXBvbHltb3JwaGljIG1ldGhvZHMKKyAgICBkZWYoX2ludm9rZWhhbmRsZSAgICAgICAgLCAiaW52b2tlaGFuZGxlIiAgICAgICAgLCAiYkpKIiAgLCBudWxsICAgICwgQmFzaWNUeXBlLmdldFRJbGxlZ2FsKCksIC0xLCB0cnVlLCBfaW52b2tldmlydHVhbCAgICk7CiAKICAgICBkZWYoX3Nob3VsZG5vdHJlYWNoaGVyZSAgLCAiX3Nob3VsZG5vdHJlYWNoaGVyZSIgLCAiYiIgICAgLCBudWxsICAgICwgQmFzaWNUeXBlLmdldFRWb2lkKCkgICAsICAwLCBmYWxzZSk7CiAKZGlmZiAtLWdpdCBhL2hvdHNwb3QvYWdlbnQvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL2p2bS9ob3RzcG90L3J1bnRpbWUvQnl0ZXMuamF2YSBiL2hvdHNwb3QvYWdlbnQvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL2p2bS9ob3RzcG90L3J1bnRpbWUvQnl0ZXMuamF2YQppbmRleCBhOGRmNDQxLi5iMGNjMjc4IDEwMDY0NAotLS0gYS9ob3RzcG90L2FnZW50L3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9qdm0vaG90c3BvdC9ydW50aW1lL0J5dGVzLmphdmEKKysrIGIvaG90c3BvdC9hZ2VudC9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vanZtL2hvdHNwb3QvcnVudGltZS9CeXRlcy5qYXZhCkBAIC0zMCwyNCArMzAsMTAgQEAKIC8qKiBFbmNhcHN1bGF0ZXMgc29tZSBieXRlLXN3YXBwaW5nIG9wZXJhdGlvbnMgZGVmaW5lZCBpbiB0aGUgVk0gKi8KIAogcHVibGljIGNsYXNzIEJ5dGVzIHsKLSAgLy8gc3dhcCBpZiBjbGllbnQgcGxhdGZvcm0gaXMgZGlmZmVyZW50IGZyb20gc2VydmVyJ3MuCiAgIHByaXZhdGUgYm9vbGVhbiBzd2FwOwogCiAgIHB1YmxpYyBCeXRlcyhNYWNoaW5lRGVzY3JpcHRpb24gbWFjaERlc2MpIHsKLSAgICBTdHJpbmcgY3B1ID0gUGxhdGZvcm1JbmZvLmdldENQVSgpOwotICAgIGlmIChjcHUuZXF1YWxzKCJzcGFyYyIpKSB7Ci0gICAgICBpZiAobWFjaERlc2MuaXNCaWdFbmRpYW4oKSkgewotICAgICAgICBzd2FwID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzd2FwID0gdHJ1ZTsKLSAgICAgIH0KLSAgICB9IGVsc2UgeyAvLyBpbnRlbAotICAgICAgaWYgKG1hY2hEZXNjLmlzQmlnRW5kaWFuKCkpIHsKLSAgICAgICAgc3dhcCA9IHRydWU7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzd2FwID0gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQorICAgIHN3YXAgPSAhbWFjaERlc2MuaXNCaWdFbmRpYW4oKTsKICAgfQogCiAgIC8qKiBTaG91bGQgb25seSBzd2FwIGlmIHRoZSBoYXJkd2FyZSdzIHVuZGVybHlpbmcgYnl0ZSBvcmRlciBpcwpkaWZmIC0tZ2l0IGEvaG90c3BvdC9hZ2VudC9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vanZtL2hvdHNwb3QvdG9vbHMvamNvcmUvQnl0ZUNvZGVSZXdyaXRlci5qYXZhIGIvaG90c3BvdC9hZ2VudC9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vanZtL2hvdHNwb3QvdG9vbHMvamNvcmUvQnl0ZUNvZGVSZXdyaXRlci5qYXZhCmluZGV4IDJhM2ZhMDIuLjQwZGM5MTIgMTAwNjQ0Ci0tLSBhL2hvdHNwb3QvYWdlbnQvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL2p2bS9ob3RzcG90L3Rvb2xzL2pjb3JlL0J5dGVDb2RlUmV3cml0ZXIuamF2YQorKysgYi9ob3RzcG90L2FnZW50L3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9qdm0vaG90c3BvdC90b29scy9qY29yZS9CeXRlQ29kZVJld3JpdGVyLmphdmEKQEAgLTI5LDYgKzI5LDExIEBACiBpbXBvcnQgc3VuLmp2bS5ob3RzcG90LnV0aWxpdGllcy4qOwogaW1wb3J0IHN1bi5qdm0uaG90c3BvdC5kZWJ1Z2dlci4qOwogaW1wb3J0IHN1bi5qdm0uaG90c3BvdC5ydW50aW1lLio7CitpbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xDb250ZXh0OworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb247CiAKIHB1YmxpYyBjbGFzcyBCeXRlQ29kZVJld3JpdGVyCiB7CkBAIC0zOCw4ICs0MywyMCBAQAogICAgIHByaXZhdGUgYnl0ZVtdIGNvZGU7CiAgICAgcHJpdmF0ZSBCeXRlcyAgYnl0ZXM7CiAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgamludFNpemUgPSA0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRzsKKworICAgIHN0YXRpYyB7CisgICAgICAgIFN0cmluZyBkZWJ1ZyA9ICAoU3RyaW5nKSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKKyAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkQWN0aW9uKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3lzdGVtLmdldFByb3BlcnR5KCJzdW4uanZtLmhvdHNwb3QudG9vbHMuamNvcmUuQnl0ZUNvZGVSZXdyaXRlci5ERUJVRyIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgREVCVUcgPSAoZGVidWcgIT0gbnVsbCA/IGRlYnVnLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSA6IGZhbHNlKTsKKyAgICB9CisKIAogICAgIHByb3RlY3RlZCB2b2lkIGRlYnVnTWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgewogICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obWVzc2FnZSk7CkBAIC01NCw2ICs3MSwxOCBAQAogCiAgICAgfQogCisgICAgcHJvdGVjdGVkIHNob3J0IGdldENvbnN0YW50UG9vbEluZGV4RnJvbVJlZk1hcChpbnQgcmF3Y29kZSwgaW50IGJjaSkgeworICAgICAgICBpbnQgcmVmSW5kZXg7CisgICAgICAgIFN0cmluZyBmbXQgPSBCeXRlY29kZXMuZm9ybWF0KHJhd2NvZGUpOworICAgICAgICBzd2l0Y2ggKGZtdC5sZW5ndGgoKSkgeworICAgICAgICAgICAgY2FzZSAyOiByZWZJbmRleCA9IDB4RkYgJiBtZXRob2QuZ2V0Qnl0ZWNvZGVCeXRlQXJnKGJjaSk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAzOiByZWZJbmRleCA9IDB4RkZGRiAmIGJ5dGVzLnN3YXBTaG9ydChtZXRob2QuZ2V0Qnl0ZWNvZGVTaG9ydEFyZyhiY2kpKTsgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OiB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKHNob3J0KWNwb29sLm9iamVjdFRvQ1BJbmRleChyZWZJbmRleCk7CisgICAgIH0KKwogICAgIHByb3RlY3RlZCBzaG9ydCBnZXRDb25zdGFudFBvb2xJbmRleChpbnQgcmF3Y29kZSwgaW50IGJjaSkgewogICAgICAgIC8vIGdldCBDb25zdGFudFBvb2wgaW5kZXggZnJvbSBDb25zdGFudFBvb2xDYWNoZUluZGV4IGF0IGdpdmVuIGJjaQogICAgICAgIFN0cmluZyBmbXQgPSBCeXRlY29kZXMuZm9ybWF0KHJhd2NvZGUpOwpAQCAtOTUsNiArMTI0LDEyIEBACiAgICAgICAgIGludCBob3RzcG90Y29kZSA9IEJ5dGVjb2Rlcy5faWxsZWdhbDsKICAgICAgICAgaW50IGxlbiA9IDA7CiAKKyAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICBTdHJpbmcgbXNnID0gbWV0aG9kLmdldE1ldGhvZEhvbGRlcigpLmdldE5hbWUoKS5hc1N0cmluZygpICsgIi4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QuZ2V0TmFtZSgpLmFzU3RyaW5nKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZC5nZXRTaWduYXR1cmUoKS5hc1N0cmluZygpOworICAgICAgICAgICAgZGVidWdNZXNzYWdlKG1zZyk7CisgICAgICAgIH0KICAgICAgICAgZm9yIChpbnQgYmNpID0gMDsgYmNpIDwgY29kZS5sZW5ndGg7KSB7CiAgICAgICAgICAgICBob3RzcG90Y29kZSA9IEJ5dGVjb2Rlcy5jb2RlQXQobWV0aG9kLCBiY2kpOwogICAgICAgICAgICAgYnl0ZWNvZGUgPSBCeXRlY29kZXMuamF2YUNvZGUoaG90c3BvdGNvZGUpOwpAQCAtMTMzLDE1ICsxNjgsMTUgQEAKIAogICAgICAgICAgICAgICAgIGNhc2UgQnl0ZWNvZGVzLl9sZGNfdzoKICAgICAgICAgICAgICAgICAgICAgaWYgKGhvdHNwb3Rjb2RlICE9IGJ5dGVjb2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBmYXN0X2FsZGNfdyBwdXRzIGNvbnN0YW50IGluIENQIGNhY2hlCi0gICAgICAgICAgICAgICAgICAgICAgICBjcG9vbEluZGV4ID0gZ2V0Q29uc3RhbnRQb29sSW5kZXgoaG90c3BvdGNvZGUsIGJjaSArIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFzdF9hbGRjX3cgcHV0cyBjb25zdGFudCBpbiByZWZlcmVuY2UgbWFwCisgICAgICAgICAgICAgICAgICAgICAgICBjcG9vbEluZGV4ID0gZ2V0Q29uc3RhbnRQb29sSW5kZXhGcm9tUmVmTWFwKGhvdHNwb3Rjb2RlLCBiY2kgKyAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlU2hvcnQoY29kZSwgYmNpICsgMSwgY3Bvb2xJbmRleCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBCeXRlY29kZXMuX2xkYzoKICAgICAgICAgICAgICAgICAgICAgaWYgKGhvdHNwb3Rjb2RlICE9IGJ5dGVjb2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBmYXN0X2FsZGMgcHV0cyBjb25zdGFudCBpbiBDUCBjYWNoZQotICAgICAgICAgICAgICAgICAgICAgICAgY3Bvb2xJbmRleCA9IGdldENvbnN0YW50UG9vbEluZGV4KGhvdHNwb3Rjb2RlLCBiY2kgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZhc3RfYWxkYyBwdXRzIGNvbnN0YW50IGluIHJlZmVyZW5jZSBtYXAKKyAgICAgICAgICAgICAgICAgICAgICAgIGNwb29sSW5kZXggPSBnZXRDb25zdGFudFBvb2xJbmRleEZyb21SZWZNYXAoaG90c3BvdGNvZGUsIGJjaSArIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgY29kZVtiY2kgKyAxXSA9IChieXRlKShjcG9vbEluZGV4KTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKZGlmZiAtLWdpdCBhL2hvdHNwb3QvbWFrZS9leGNsdWRlU3JjLm1ha2UgYi9ob3RzcG90L21ha2UvZXhjbHVkZVNyYy5tYWtlCmluZGV4IDAwYTFlM2EuLjcyMWFlYTUgMTAwNjQ0Ci0tLSBhL2hvdHNwb3QvbWFrZS9leGNsdWRlU3JjLm1ha2UKKysrIGIvaG90c3BvdC9tYWtlL2V4Y2x1ZGVTcmMubWFrZQpAQCAtNzksMTAgKzc5LDEwIEBACiAgICAgICBDWFhGTEFHUyArPSAtRFNFUklBTEdDCiAgICAgICBDRkxBR1MgKz0gLURTRVJJQUxHQwogICAgICAgU3JjX0ZpbGVzX0VYQ0xVREUgKz0gXAotCWJpbmFyeVRyZWVEaWN0aW9uYXJ5LmNwcCBjbXNBZGFwdGl2ZVNpemVQb2xpY3kuY3BwIGNtc0NvbGxlY3RvclBvbGljeS5jcHAgXAorCWNtc0FkYXB0aXZlU2l6ZVBvbGljeS5jcHAgY21zQ29sbGVjdG9yUG9saWN5LmNwcCBcCiAJY21zR0NBZGFwdGl2ZVBvbGljeUNvdW50ZXJzLmNwcCBjbXNMb2NrVmVyaWZpZXIuY3BwIGNtc1Blcm1HZW4uY3BwIGNvbXBhY3RpYmxlRnJlZUxpc3RTcGFjZS5jcHAgXAotCWNvbmN1cnJlbnRNYXJrU3dlZXBHZW5lcmF0aW9uLmNwcCBjb25jdXJyZW50TWFya1N3ZWVwVGhyZWFkLmNwcCBmcmVlQmxvY2tEaWN0aW9uYXJ5LmNwcCBcCi0JZnJlZUNodW5rLmNwcCBmcmVlTGlzdC5jcHAgcHJvbW90aW9uSW5mby5jcHAgdm1DTVNPcGVyYXRpb25zLmNwcCBjb2xsZWN0aW9uU2V0Q2hvb3Nlci5jcHAgXAorCWNvbmN1cnJlbnRNYXJrU3dlZXBHZW5lcmF0aW9uLmNwcCBjb25jdXJyZW50TWFya1N3ZWVwVGhyZWFkLmNwcCBcCisJZnJlZUNodW5rLmNwcCBhZGFwdGl2ZUZyZWVMaXN0LmNwcCBwcm9tb3Rpb25JbmZvLmNwcCB2bUNNU09wZXJhdGlvbnMuY3BwIGNvbGxlY3Rpb25TZXRDaG9vc2VyLmNwcCBcCiAJY29uY3VycmVudEcxUmVmaW5lLmNwcCBjb25jdXJyZW50RzFSZWZpbmVUaHJlYWQuY3BwIGNvbmN1cnJlbnRNYXJrLmNwcCBjb25jdXJyZW50TWFya1RocmVhZC5jcHAgXAogCWRpcnR5Q2FyZFF1ZXVlLmNwcCBnMUFsbG9jUmVnaW9uLmNwcCBnMUJsb2NrT2Zmc2V0VGFibGUuY3BwIGcxQ29sbGVjdGVkSGVhcC5jcHAgZzFHQ1BoYXNlVGltZXMuY3BwIFwKIAlnMUNvbGxlY3RvclBvbGljeS5jcHAgZzFFcmdvVmVyYm9zZS5jcHAgZzFfZ2xvYmFscy5jcHAgZzFIUlByaW50ZXIuY3BwIGcxTWFya1N3ZWVwLmNwcCBcCmRpZmYgLS1naXQgYS9ob3RzcG90L21ha2UvaG90c3BvdF92ZXJzaW9uIGIvaG90c3BvdC9tYWtlL2hvdHNwb3RfdmVyc2lvbgppbmRleCAxNDU3N2ExLi4xZjcyZTIyIDEwMDY0NAotLS0gYS9ob3RzcG90L21ha2UvaG90c3BvdF92ZXJzaW9uCisrKyBiL2hvdHNwb3QvbWFrZS9ob3RzcG90X3ZlcnNpb24KQEAgLTM1LDcgKzM1LDcgQEAKIAogSFNfTUFKT1JfVkVSPTI1CiBIU19NSU5PUl9WRVI9MAotSFNfQlVJTERfTlVNQkVSPTA2CitIU19CVUlMRF9OVU1CRVI9MDcKIAogSkRLX01BSk9SX1ZFUj0xCiBKREtfTUlOT1JfVkVSPTgKZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL2NwdS94ODYvdm0vYXNzZW1ibGVyX3g4Ni5jcHAgYi9ob3RzcG90L3NyYy9jcHUveDg2L3ZtL2Fzc2VtYmxlcl94ODYuY3BwCmluZGV4IDM3OGMxZjguLjZiOTY3N2QgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL2NwdS94ODYvdm0vYXNzZW1ibGVyX3g4Ni5jcHAKKysrIGIvaG90c3BvdC9zcmMvY3B1L3g4Ni92bS9hc3NlbWJsZXJfeDg2LmNwcApAQCAtMTAwNyw2ICsxMDA3LDY3IEBACiAgIGVtaXRfc2ltZF9hcml0aCgweDU4LCBkc3QsIHNyYywgVkVYX1NJTURfRjMpOwogfQogCit2b2lkIEFzc2VtYmxlcjo6YWVzZGVjKFhNTVJlZ2lzdGVyIGRzdCwgQWRkcmVzcyBzcmMpIHsKKyAgYXNzZXJ0KFZNX1ZlcnNpb246OnN1cHBvcnRzX2FlcygpLCAiIik7CisgIEluc3RydWN0aW9uTWFyayBpbSh0aGlzKTsKKyAgc2ltZF9wcmVmaXgoZHN0LCBkc3QsIHNyYywgVkVYX1NJTURfNjYsIFZFWF9PUENPREVfMEZfMzgpOworICBlbWl0X2J5dGUoMHhkZSk7CisgIGVtaXRfb3BlcmFuZChkc3QsIHNyYyk7Cit9CisKK3ZvaWQgQXNzZW1ibGVyOjphZXNkZWMoWE1NUmVnaXN0ZXIgZHN0LCBYTU1SZWdpc3RlciBzcmMpIHsKKyAgYXNzZXJ0KFZNX1ZlcnNpb246OnN1cHBvcnRzX2FlcygpLCAiIik7CisgIGludCBlbmNvZGUgPSBzaW1kX3ByZWZpeF9hbmRfZW5jb2RlKGRzdCwgZHN0LCBzcmMsIFZFWF9TSU1EXzY2LCBWRVhfT1BDT0RFXzBGXzM4KTsKKyAgZW1pdF9ieXRlKDB4ZGUpOworICBlbWl0X2J5dGUoMHhDMCB8IGVuY29kZSk7Cit9CisKK3ZvaWQgQXNzZW1ibGVyOjphZXNkZWNsYXN0KFhNTVJlZ2lzdGVyIGRzdCwgQWRkcmVzcyBzcmMpIHsKKyAgYXNzZXJ0KFZNX1ZlcnNpb246OnN1cHBvcnRzX2FlcygpLCAiIik7CisgIEluc3RydWN0aW9uTWFyayBpbSh0aGlzKTsKKyAgc2ltZF9wcmVmaXgoZHN0LCBkc3QsIHNyYywgVkVYX1NJTURfNjYsIFZFWF9PUENPREVfMEZfMzgpOworICBlbWl0X2J5dGUoMHhkZik7CisgIGVtaXRfb3BlcmFuZChkc3QsIHNyYyk7Cit9CisKK3ZvaWQgQXNzZW1ibGVyOjphZXNkZWNsYXN0KFhNTVJlZ2lzdGVyIGRzdCwgWE1NUmVnaXN0ZXIgc3JjKSB7CisgIGFzc2VydChWTV9WZXJzaW9uOjpzdXBwb3J0c19hZXMoKSwgIiIpOworICBpbnQgZW5jb2RlID0gc2ltZF9wcmVmaXhfYW5kX2VuY29kZShkc3QsIGRzdCwgc3JjLCBWRVhfU0lNRF82NiwgVkVYX09QQ09ERV8wRl8zOCk7CisgIGVtaXRfYnl0ZSgweGRmKTsKKyAgZW1pdF9ieXRlKDB4QzAgfCBlbmNvZGUpOworfQorCit2b2lkIEFzc2VtYmxlcjo6YWVzZW5jKFhNTVJlZ2lzdGVyIGRzdCwgQWRkcmVzcyBzcmMpIHsKKyAgYXNzZXJ0KFZNX1ZlcnNpb246OnN1cHBvcnRzX2FlcygpLCAiIik7CisgIEluc3RydWN0aW9uTWFyayBpbSh0aGlzKTsKKyAgc2ltZF9wcmVmaXgoZHN0LCBkc3QsIHNyYywgVkVYX1NJTURfNjYsIFZFWF9PUENPREVfMEZfMzgpOworICBlbWl0X2J5dGUoMHhkYyk7CisgIGVtaXRfb3BlcmFuZChkc3QsIHNyYyk7Cit9CisKK3ZvaWQgQXNzZW1ibGVyOjphZXNlbmMoWE1NUmVnaXN0ZXIgZHN0LCBYTU1SZWdpc3RlciBzcmMpIHsKKyAgYXNzZXJ0KFZNX1ZlcnNpb246OnN1cHBvcnRzX2FlcygpLCAiIik7CisgIGludCBlbmNvZGUgPSBzaW1kX3ByZWZpeF9hbmRfZW5jb2RlKGRzdCwgZHN0LCBzcmMsIFZFWF9TSU1EXzY2LCBWRVhfT1BDT0RFXzBGXzM4KTsKKyAgZW1pdF9ieXRlKDB4ZGMpOworICBlbWl0X2J5dGUoMHhDMCB8IGVuY29kZSk7Cit9CisKK3ZvaWQgQXNzZW1ibGVyOjphZXNlbmNsYXN0KFhNTVJlZ2lzdGVyIGRzdCwgQWRkcmVzcyBzcmMpIHsKKyAgYXNzZXJ0KFZNX1ZlcnNpb246OnN1cHBvcnRzX2FlcygpLCAiIik7CisgIEluc3RydWN0aW9uTWFyayBpbSh0aGlzKTsKKyAgc2ltZF9wcmVmaXgoZHN0LCBkc3QsIHNyYywgVkVYX1NJTURfNjYsIFZFWF9PUENPREVfMEZfMzgpOworICBlbWl0X2J5dGUoMHhkZCk7CisgIGVtaXRfb3BlcmFuZChkc3QsIHNyYyk7Cit9CisKK3ZvaWQgQXNzZW1ibGVyOjphZXNlbmNsYXN0KFhNTVJlZ2lzdGVyIGRzdCwgWE1NUmVnaXN0ZXIgc3JjKSB7CisgIGFzc2VydChWTV9WZXJzaW9uOjpzdXBwb3J0c19hZXMoKSwgIiIpOworICBpbnQgZW5jb2RlID0gc2ltZF9wcmVmaXhfYW5kX2VuY29kZShkc3QsIGRzdCwgc3JjLCBWRVhfU0lNRF82NiwgVkVYX09QQ09ERV8wRl8zOCk7CisgIGVtaXRfYnl0ZSgweGRkKTsKKyAgZW1pdF9ieXRlKDB4QzAgfCBlbmNvZGUpOworfQorCisKIHZvaWQgQXNzZW1ibGVyOjphbmRsKEFkZHJlc3MgZHN0LCBpbnQzMl90IGltbTMyKSB7CiAgIEluc3RydWN0aW9uTWFyayBpbSh0aGlzKTsKICAgcHJlZml4KGRzdCk7CkBAIC0yMzA3LDYgKzIzNjgsMjIgQEAKICAgYV9ieXRlKHApOwogfQogCit2b2lkIEFzc2VtYmxlcjo6cHNodWZiKFhNTVJlZ2lzdGVyIGRzdCwgWE1NUmVnaXN0ZXIgc3JjKSB7CisgIGFzc2VydChWTV9WZXJzaW9uOjpzdXBwb3J0c19zc3NlMygpLCAiIik7CisgIGludCBlbmNvZGUgPSBzaW1kX3ByZWZpeF9hbmRfZW5jb2RlKGRzdCwgZHN0LCBzcmMsIFZFWF9TSU1EXzY2LCBWRVhfT1BDT0RFXzBGXzM4KTsKKyAgZW1pdF9ieXRlKDB4MDApOworICBlbWl0X2J5dGUoMHhDMCB8IGVuY29kZSk7Cit9CisKK3ZvaWQgQXNzZW1ibGVyOjpwc2h1ZmIoWE1NUmVnaXN0ZXIgZHN0LCBBZGRyZXNzIHNyYykgeworICBhc3NlcnQoVk1fVmVyc2lvbjo6c3VwcG9ydHNfc3NzZTMoKSwgIiIpOworICBhc3NlcnQoKFVzZUFWWCA+IDApLCAiU1NFIG1vZGUgcmVxdWlyZXMgYWRkcmVzcyBhbGlnbm1lbnQgMTYgYnl0ZXMiKTsKKyAgSW5zdHJ1Y3Rpb25NYXJrIGltKHRoaXMpOworICBzaW1kX3ByZWZpeChkc3QsIGRzdCwgc3JjLCBWRVhfU0lNRF82NiwgVkVYX09QQ09ERV8wRl8zOCk7CisgIGVtaXRfYnl0ZSgweDAwKTsKKyAgZW1pdF9vcGVyYW5kKGRzdCwgc3JjKTsKK30KKwogdm9pZCBBc3NlbWJsZXI6OnBzaHVmZChYTU1SZWdpc3RlciBkc3QsIFhNTVJlZ2lzdGVyIHNyYywgaW50IG1vZGUpIHsKICAgYXNzZXJ0KGlzQnl0ZShtb2RlKSwgImludmFsaWQgdmFsdWUiKTsKICAgTk9UX0xQNjQoYXNzZXJ0KFZNX1ZlcnNpb246OnN1cHBvcnRzX3NzZTIoKSwgIiIpKTsKQEAgLTgwNjcsNiArODE0NCwxNSBAQAogICBMUDY0X09OTFkobW92cShkc3QsIHNyYykpIE5PVF9MUDY0KG1vdmwoZHN0LCBzcmMpKTsKIH0KIAordm9pZCBNYWNyb0Fzc2VtYmxlcjo6bW92ZHF1KFhNTVJlZ2lzdGVyIGRzdCwgQWRkcmVzc0xpdGVyYWwgc3JjKSB7CisgIGlmIChyZWFjaGFibGUoc3JjKSkgeworICAgIEFzc2VtYmxlcjo6bW92ZHF1KGRzdCwgYXNfQWRkcmVzcyhzcmMpKTsKKyAgfSBlbHNlIHsKKyAgICBsZWEocnNjcmF0Y2gxLCBzcmMpOworICAgIEFzc2VtYmxlcjo6bW92ZHF1KGRzdCwgQWRkcmVzcyhyc2NyYXRjaDEsIDApKTsKKyAgfQorfQorCiB2b2lkIE1hY3JvQXNzZW1ibGVyOjptb3ZzZChYTU1SZWdpc3RlciBkc3QsIEFkZHJlc3NMaXRlcmFsIHNyYykgewogICBpZiAocmVhY2hhYmxlKHNyYykpIHsKICAgICBBc3NlbWJsZXI6Om1vdnNkKGRzdCwgYXNfQWRkcmVzcyhzcmMpKTsKQEAgLTgzNTcsNiArODQ0MywxNyBAQAogICB9CiB9CiAKK3ZvaWQgTWFjcm9Bc3NlbWJsZXI6OnBzaHVmYihYTU1SZWdpc3RlciBkc3QsIEFkZHJlc3NMaXRlcmFsIHNyYykgeworICAvLyBVc2VkIGluIHNpZ24tYml0IGZsaXBwaW5nIHdpdGggYWxpZ25lZCBhZGRyZXNzLgorICBhc3NlcnQoKFVzZUFWWCA+IDApIHx8ICgoKGludHB0cl90KXNyYy50YXJnZXQoKSAmIDE1KSA9PSAwKSwgIlNTRSBtb2RlIHJlcXVpcmVzIGFkZHJlc3MgYWxpZ25tZW50IDE2IGJ5dGVzIik7CisgIGlmIChyZWFjaGFibGUoc3JjKSkgeworICAgIEFzc2VtYmxlcjo6cHNodWZiKGRzdCwgYXNfQWRkcmVzcyhzcmMpKTsKKyAgfSBlbHNlIHsKKyAgICBsZWEocnNjcmF0Y2gxLCBzcmMpOworICAgIEFzc2VtYmxlcjo6cHNodWZiKGRzdCwgQWRkcmVzcyhyc2NyYXRjaDEsIDApKTsKKyAgfQorfQorCiAvLyBBVlggMy1vcGVyYW5kcyBpbnN0cnVjdGlvbnMKIAogdm9pZCBNYWNyb0Fzc2VtYmxlcjo6dmFkZHNkKFhNTVJlZ2lzdGVyIGRzdCwgWE1NUmVnaXN0ZXIgbmRzLCBBZGRyZXNzTGl0ZXJhbCBzcmMpIHsKZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL2NwdS94ODYvdm0vYXNzZW1ibGVyX3g4Ni5ocHAgYi9ob3RzcG90L3NyYy9jcHUveDg2L3ZtL2Fzc2VtYmxlcl94ODYuaHBwCmluZGV4IGM5MzZlMTMuLjhhOWJiYWYgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL2NwdS94ODYvdm0vYXNzZW1ibGVyX3g4Ni5ocHAKKysrIGIvaG90c3BvdC9zcmMvY3B1L3g4Ni92bS9hc3NlbWJsZXJfeDg2LmhwcApAQCAtODc1LDYgKzg3NSwxNyBAQAogICB2b2lkIGFkZHNzKFhNTVJlZ2lzdGVyIGRzdCwgQWRkcmVzcyBzcmMpOwogICB2b2lkIGFkZHNzKFhNTVJlZ2lzdGVyIGRzdCwgWE1NUmVnaXN0ZXIgc3JjKTsKIAorICAvLyBBRVMgaW5zdHJ1Y3Rpb25zCisgIHZvaWQgYWVzZGVjKFhNTVJlZ2lzdGVyIGRzdCwgQWRkcmVzcyBzcmMpOworICB2b2lkIGFlc2RlYyhYTU1SZWdpc3RlciBkc3QsIFhNTVJlZ2lzdGVyIHNyYyk7CisgIHZvaWQgYWVzZGVjbGFzdChYTU1SZWdpc3RlciBkc3QsIEFkZHJlc3Mgc3JjKTsKKyAgdm9pZCBhZXNkZWNsYXN0KFhNTVJlZ2lzdGVyIGRzdCwgWE1NUmVnaXN0ZXIgc3JjKTsKKyAgdm9pZCBhZXNlbmMoWE1NUmVnaXN0ZXIgZHN0LCBBZGRyZXNzIHNyYyk7CisgIHZvaWQgYWVzZW5jKFhNTVJlZ2lzdGVyIGRzdCwgWE1NUmVnaXN0ZXIgc3JjKTsKKyAgdm9pZCBhZXNlbmNsYXN0KFhNTVJlZ2lzdGVyIGRzdCwgQWRkcmVzcyBzcmMpOworICB2b2lkIGFlc2VuY2xhc3QoWE1NUmVnaXN0ZXIgZHN0LCBYTU1SZWdpc3RlciBzcmMpOworCisKICAgdm9pZCBhbmRsKEFkZHJlc3MgIGRzdCwgaW50MzJfdCBpbW0zMik7CiAgIHZvaWQgYW5kbChSZWdpc3RlciBkc3QsIGludDMyX3QgaW1tMzIpOwogICB2b2lkIGFuZGwoUmVnaXN0ZXIgZHN0LCBBZGRyZXNzIHNyYyk7CkBAIC0xNDI0LDYgKzE0MzUsMTAgQEAKICAgdm9pZCBwcmVmZXRjaHQyKEFkZHJlc3Mgc3JjKTsKICAgdm9pZCBwcmVmZXRjaHcoQWRkcmVzcyBzcmMpOwogCisgIC8vIFNodWZmbGUgQnl0ZXMKKyAgdm9pZCBwc2h1ZmIoWE1NUmVnaXN0ZXIgZHN0LCBYTU1SZWdpc3RlciBzcmMpOworICB2b2lkIHBzaHVmYihYTU1SZWdpc3RlciBkc3QsIEFkZHJlc3Mgc3JjKTsKKwogICAvLyBTaHVmZmxlIFBhY2tlZCBEb3VibGV3b3JkcwogICB2b2lkIHBzaHVmZChYTU1SZWdpc3RlciBkc3QsIFhNTVJlZ2lzdGVyIHNyYywgaW50IG1vZGUpOwogICB2b2lkIHBzaHVmZChYTU1SZWdpc3RlciBkc3QsIEFkZHJlc3Mgc3JjLCAgICAgaW50IG1vZGUpOwpAQCAtMjYxMSw2ICsyNjI2LDEyIEBACiAgIHZvaWQgZGl2c3MoWE1NUmVnaXN0ZXIgZHN0LCBBZGRyZXNzIHNyYykgICAgICAgIHsgQXNzZW1ibGVyOjpkaXZzcyhkc3QsIHNyYyk7IH0KICAgdm9pZCBkaXZzcyhYTU1SZWdpc3RlciBkc3QsIEFkZHJlc3NMaXRlcmFsIHNyYyk7CiAKKyAgLy8gTW92ZSBVbmFsaWduZWQgRG91YmxlIFF1YWR3b3JkCisgIHZvaWQgbW92ZHF1KEFkZHJlc3MgICAgIGRzdCwgWE1NUmVnaXN0ZXIgc3JjKSAgIHsgQXNzZW1ibGVyOjptb3ZkcXUoZHN0LCBzcmMpOyB9CisgIHZvaWQgbW92ZHF1KFhNTVJlZ2lzdGVyIGRzdCwgQWRkcmVzcyBzcmMpICAgICAgIHsgQXNzZW1ibGVyOjptb3ZkcXUoZHN0LCBzcmMpOyB9CisgIHZvaWQgbW92ZHF1KFhNTVJlZ2lzdGVyIGRzdCwgWE1NUmVnaXN0ZXIgc3JjKSAgIHsgQXNzZW1ibGVyOjptb3ZkcXUoZHN0LCBzcmMpOyB9CisgIHZvaWQgbW92ZHF1KFhNTVJlZ2lzdGVyIGRzdCwgQWRkcmVzc0xpdGVyYWwgc3JjKTsKKwogICB2b2lkIG1vdnNkKFhNTVJlZ2lzdGVyIGRzdCwgWE1NUmVnaXN0ZXIgc3JjKSB7IEFzc2VtYmxlcjo6bW92c2QoZHN0LCBzcmMpOyB9CiAgIHZvaWQgbW92c2QoQWRkcmVzcyBkc3QsIFhNTVJlZ2lzdGVyIHNyYykgICAgIHsgQXNzZW1ibGVyOjptb3ZzZChkc3QsIHNyYyk7IH0KICAgdm9pZCBtb3ZzZChYTU1SZWdpc3RlciBkc3QsIEFkZHJlc3Mgc3JjKSAgICAgeyBBc3NlbWJsZXI6Om1vdnNkKGRzdCwgc3JjKTsgfQpAQCAtMjY1OCw2ICsyNjc5LDEwIEBACiAgIHZvaWQgeG9ycHMoWE1NUmVnaXN0ZXIgZHN0LCBBZGRyZXNzIHNyYykgICAgIHsgQXNzZW1ibGVyOjp4b3Jwcyhkc3QsIHNyYyk7IH0KICAgdm9pZCB4b3JwcyhYTU1SZWdpc3RlciBkc3QsIEFkZHJlc3NMaXRlcmFsIHNyYyk7CiAKKyAgLy8gU2h1ZmZsZSBCeXRlcworICB2b2lkIHBzaHVmYihYTU1SZWdpc3RlciBkc3QsIFhNTVJlZ2lzdGVyIHNyYykgeyBBc3NlbWJsZXI6OnBzaHVmYihkc3QsIHNyYyk7IH0KKyAgdm9pZCBwc2h1ZmIoWE1NUmVnaXN0ZXIgZHN0LCBBZGRyZXNzIHNyYykgICAgIHsgQXNzZW1ibGVyOjpwc2h1ZmIoZHN0LCBzcmMpOyB9CisgIHZvaWQgcHNodWZiKFhNTVJlZ2lzdGVyIGRzdCwgQWRkcmVzc0xpdGVyYWwgc3JjKTsKICAgLy8gQVZYIDMtb3BlcmFuZHMgaW5zdHJ1Y3Rpb25zCiAKICAgdm9pZCB2YWRkc2QoWE1NUmVnaXN0ZXIgZHN0LCBYTU1SZWdpc3RlciBuZHMsIFhNTVJlZ2lzdGVyIHNyYykgeyBBc3NlbWJsZXI6OnZhZGRzZChkc3QsIG5kcywgc3JjKTsgfQpkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvY3B1L3g4Ni92bS9zdHViR2VuZXJhdG9yX3g4Nl8zMi5jcHAgYi9ob3RzcG90L3NyYy9jcHUveDg2L3ZtL3N0dWJHZW5lcmF0b3JfeDg2XzMyLmNwcAppbmRleCBmMTQ5ZmRlLi5kOGI2MWUwIDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9jcHUveDg2L3ZtL3N0dWJHZW5lcmF0b3JfeDg2XzMyLmNwcAorKysgYi9ob3RzcG90L3NyYy9jcHUveDg2L3ZtL3N0dWJHZW5lcmF0b3JfeDg2XzMyLmNwcApAQCAtMjEzNyw2ICsyMTM3LDUyOSBAQAogICAgIH0KICAgfQogCisgIC8vIEFFUyBpbnRyaW5zaWMgc3R1YnMKKyAgZW51bSB7QUVTQmxvY2tTaXplID0gMTZ9OworCisgIGFkZHJlc3MgZ2VuZXJhdGVfa2V5X3NodWZmbGVfbWFzaygpIHsKKyAgICBfXyBhbGlnbigxNik7CisgICAgU3R1YkNvZGVNYXJrIG1hcmsodGhpcywgIlN0dWJSb3V0aW5lcyIsICJrZXlfc2h1ZmZsZV9tYXNrIik7CisgICAgYWRkcmVzcyBzdGFydCA9IF9fIHBjKCk7CisgICAgX18gZW1pdF9kYXRhKDB4MDAwMTAyMDMsIHJlbG9jSW5mbzo6bm9uZSwgMCApOworICAgIF9fIGVtaXRfZGF0YSgweDA0MDUwNjA3LCByZWxvY0luZm86Om5vbmUsIDAgKTsKKyAgICBfXyBlbWl0X2RhdGEoMHgwODA5MGEwYiwgcmVsb2NJbmZvOjpub25lLCAwICk7CisgICAgX18gZW1pdF9kYXRhKDB4MGMwZDBlMGYsIHJlbG9jSW5mbzo6bm9uZSwgMCApOworICAgIHJldHVybiBzdGFydDsKKyAgfQorCisgIC8vIFV0aWxpdHkgcm91dGluZSBmb3IgbG9hZGluZyBhIDEyOC1iaXQga2V5IHdvcmQgaW4gbGl0dGxlIGVuZGlhbiBmb3JtYXQKKyAgLy8gY2FuIG9wdGlvbmFsbHkgc3BlY2lmeSB0aGF0IHRoZSBzaHVmZmxlIG1hc2sgaXMgYWxyZWFkeSBpbiBhbiB4bW1yZWdpc3RlcgorICB2b2lkIGxvYWRfa2V5KFhNTVJlZ2lzdGVyIHhtbWRzdCwgUmVnaXN0ZXIga2V5LCBpbnQgb2Zmc2V0LCBYTU1SZWdpc3RlciB4bW1fc2h1Zl9tYXNrPU5VTEwpIHsKKyAgICBfXyBtb3ZkcXUoeG1tZHN0LCBBZGRyZXNzKGtleSwgb2Zmc2V0KSk7CisgICAgaWYgKHhtbV9zaHVmX21hc2sgIT0gTlVMTCkgeworICAgICAgX18gcHNodWZiKHhtbWRzdCwgeG1tX3NodWZfbWFzayk7CisgICAgfSBlbHNlIHsKKyAgICAgIF9fIHBzaHVmYih4bW1kc3QsIEV4dGVybmFsQWRkcmVzcyhTdHViUm91dGluZXM6Ong4Njo6a2V5X3NodWZmbGVfbWFza19hZGRyKCkpKTsKKyAgICB9CisgIH0KKworICAvLyBhZXNlbmMgdXNpbmcgc3BlY2lmaWVkIGtleStvZmZzZXQKKyAgLy8gY2FuIG9wdGlvbmFsbHkgc3BlY2lmeSB0aGF0IHRoZSBzaHVmZmxlIG1hc2sgaXMgYWxyZWFkeSBpbiBhbiB4bW1yZWdpc3RlcgorICB2b2lkIGFlc19lbmNfa2V5KFhNTVJlZ2lzdGVyIHhtbWRzdCwgWE1NUmVnaXN0ZXIgeG1tdG1wLCBSZWdpc3RlciBrZXksIGludCBvZmZzZXQsIFhNTVJlZ2lzdGVyIHhtbV9zaHVmX21hc2s9TlVMTCkgeworICAgIGxvYWRfa2V5KHhtbXRtcCwga2V5LCBvZmZzZXQsIHhtbV9zaHVmX21hc2spOworICAgIF9fIGFlc2VuYyh4bW1kc3QsIHhtbXRtcCk7CisgIH0KKworICAvLyBhZXNkZWMgdXNpbmcgc3BlY2lmaWVkIGtleStvZmZzZXQKKyAgLy8gY2FuIG9wdGlvbmFsbHkgc3BlY2lmeSB0aGF0IHRoZSBzaHVmZmxlIG1hc2sgaXMgYWxyZWFkeSBpbiBhbiB4bW1yZWdpc3RlcgorICB2b2lkIGFlc19kZWNfa2V5KFhNTVJlZ2lzdGVyIHhtbWRzdCwgWE1NUmVnaXN0ZXIgeG1tdG1wLCBSZWdpc3RlciBrZXksIGludCBvZmZzZXQsIFhNTVJlZ2lzdGVyIHhtbV9zaHVmX21hc2s9TlVMTCkgeworICAgIGxvYWRfa2V5KHhtbXRtcCwga2V5LCBvZmZzZXQsIHhtbV9zaHVmX21hc2spOworICAgIF9fIGFlc2RlYyh4bW1kc3QsIHhtbXRtcCk7CisgIH0KKworCisgIC8vIEFyZ3VtZW50czoKKyAgLy8KKyAgLy8gSW5wdXRzOgorICAvLyAgIGNfcmFyZzAgICAtIHNvdXJjZSBieXRlIGFycmF5IGFkZHJlc3MKKyAgLy8gICBjX3JhcmcxICAgLSBkZXN0aW5hdGlvbiBieXRlIGFycmF5IGFkZHJlc3MKKyAgLy8gICBjX3JhcmcyICAgLSBLIChrZXkpIGluIGxpdHRsZSBlbmRpYW4gaW50IGFycmF5CisgIC8vCisgIGFkZHJlc3MgZ2VuZXJhdGVfYWVzY3J5cHRfZW5jcnlwdEJsb2NrKCkgeworICAgIGFzc2VydChVc2VBRVMgJiYgKFVzZUFWWCA+IDApLCAibmVlZCBBRVMgaW5zdHJ1Y3Rpb25zIGFuZCBtaXNhbGlnbmVkIFNTRSBzdXBwb3J0Iik7CisgICAgX18gYWxpZ24oQ29kZUVudHJ5QWxpZ25tZW50KTsKKyAgICBTdHViQ29kZU1hcmsgbWFyayh0aGlzLCAiU3R1YlJvdXRpbmVzIiwgImFlc2NyeXB0X2VuY3J5cHRCbG9jayIpOworICAgIExhYmVsIExfZG9MYXN0OworICAgIGFkZHJlc3Mgc3RhcnQgPSBfXyBwYygpOworCisgICAgY29uc3QgUmVnaXN0ZXIgZnJvbSAgICAgICAgPSByc2k7ICAgICAgLy8gc291cmNlIGFycmF5IGFkZHJlc3MKKyAgICBjb25zdCBSZWdpc3RlciB0byAgICAgICAgICA9IHJkeDsgICAgICAvLyBkZXN0aW5hdGlvbiBhcnJheSBhZGRyZXNzCisgICAgY29uc3QgUmVnaXN0ZXIga2V5ICAgICAgICAgPSByY3g7ICAgICAgLy8ga2V5IGFycmF5IGFkZHJlc3MKKyAgICBjb25zdCBSZWdpc3RlciBrZXlsZW4gICAgICA9IHJheDsKKyAgICBjb25zdCBBZGRyZXNzICBmcm9tX3BhcmFtKHJicCwgOCswKTsKKyAgICBjb25zdCBBZGRyZXNzICB0b19wYXJhbSAgKHJicCwgOCs0KTsKKyAgICBjb25zdCBBZGRyZXNzICBrZXlfcGFyYW0gKHJicCwgOCs4KTsKKworICAgIGNvbnN0IFhNTVJlZ2lzdGVyIHhtbV9yZXN1bHQgPSB4bW0wOworICAgIGNvbnN0IFhNTVJlZ2lzdGVyIHhtbV90ZW1wICAgPSB4bW0xOworICAgIGNvbnN0IFhNTVJlZ2lzdGVyIHhtbV9rZXlfc2h1Zl9tYXNrID0geG1tMjsKKworICAgIF9fIGVudGVyKCk7IC8vIHJlcXVpcmVkIGZvciBwcm9wZXIgc3RhY2t3YWxraW5nIG9mIFJ1bnRpbWVTdHViIGZyYW1lCisgICAgX18gcHVzaChyc2kpOworICAgIF9fIG1vdnB0cihmcm9tICwgZnJvbV9wYXJhbSk7CisgICAgX18gbW92cHRyKHRvICAgLCB0b19wYXJhbSk7CisgICAgX18gbW92cHRyKGtleSAgLCBrZXlfcGFyYW0pOworCisgICAgX18gbW92bChrZXlsZW4sIEFkZHJlc3Moa2V5LCBhcnJheU9vcERlc2M6Omxlbmd0aF9vZmZzZXRfaW5fYnl0ZXMoKSAtIGFycmF5T29wRGVzYzo6YmFzZV9vZmZzZXRfaW5fYnl0ZXMoVF9JTlQpKSk7CisgICAgLy8ga2V5bGVuID0gIyBvZiAzMi1iaXQgd29yZHMsIGNvbnZlcnQgdG8gMTI4LWJpdCB3b3JkcworICAgIF9fIHNocmwoa2V5bGVuLCAyKTsKKyAgICBfXyBzdWJsKGtleWxlbiwgMTEpOyAgIC8vIGV2ZXJ5IGtleSBoYXMgYXQgbGVhc3QgMTEgMTI4LWJpdCB3b3Jkcywgc29tZSBoYXZlIG1vcmUKKworICAgIF9fIG1vdmRxdSh4bW1fa2V5X3NodWZfbWFzaywgRXh0ZXJuYWxBZGRyZXNzKFN0dWJSb3V0aW5lczo6eDg2OjprZXlfc2h1ZmZsZV9tYXNrX2FkZHIoKSkpOworICAgIF9fIG1vdmRxdSh4bW1fcmVzdWx0LCBBZGRyZXNzKGZyb20sIDApKTsgIC8vIGdldCAxNiBieXRlcyBvZiBpbnB1dAorCisgICAgLy8gRm9yIGVuY3J5cHRpb24sIHRoZSBqYXZhIGV4cGFuZGVkIGtleSBvcmRlcmluZyBpcyBqdXN0IHdoYXQgd2UgbmVlZAorCisgICAgbG9hZF9rZXkoeG1tX3RlbXAsIGtleSwgMHgwMCwgeG1tX2tleV9zaHVmX21hc2spOworICAgIF9fIHB4b3IoeG1tX3Jlc3VsdCwgeG1tX3RlbXApOworICAgIGZvciAoaW50IG9mZnNldCA9IDB4MTA7IG9mZnNldCA8PSAweDkwOyBvZmZzZXQgKz0gMHgxMCkgeworICAgICAgYWVzX2VuY19rZXkoeG1tX3Jlc3VsdCwgeG1tX3RlbXAsIGtleSwgb2Zmc2V0LCB4bW1fa2V5X3NodWZfbWFzayk7CisgICAgfQorICAgIGxvYWRfa2V5ICAoeG1tX3RlbXAsIGtleSwgMHhhMCwgeG1tX2tleV9zaHVmX21hc2spOworICAgIF9fIGNtcGwoa2V5bGVuLCAwKTsKKyAgICBfXyBqY2MoQXNzZW1ibGVyOjplcXVhbCwgTF9kb0xhc3QpOworICAgIF9fIGFlc2VuYyh4bW1fcmVzdWx0LCB4bW1fdGVtcCk7ICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgaW4gMTkyIGFuZCAyNTYgYml0IGtleXMKKyAgICBhZXNfZW5jX2tleSh4bW1fcmVzdWx0LCB4bW1fdGVtcCwga2V5LCAweGIwLCB4bW1fa2V5X3NodWZfbWFzayk7CisgICAgbG9hZF9rZXkoeG1tX3RlbXAsIGtleSwgMHhjMCwgeG1tX2tleV9zaHVmX21hc2spOworICAgIF9fIHN1Ymwoa2V5bGVuLCAyKTsKKyAgICBfXyBqY2MoQXNzZW1ibGVyOjplcXVhbCwgTF9kb0xhc3QpOworICAgIF9fIGFlc2VuYyh4bW1fcmVzdWx0LCB4bW1fdGVtcCk7ICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgaW4gMjU2IGJpdCBrZXlzCisgICAgYWVzX2VuY19rZXkoeG1tX3Jlc3VsdCwgeG1tX3RlbXAsIGtleSwgMHhkMCwgeG1tX2tleV9zaHVmX21hc2spOworICAgIGxvYWRfa2V5KHhtbV90ZW1wLCBrZXksIDB4ZTAsIHhtbV9rZXlfc2h1Zl9tYXNrKTsKKworICAgIF9fIEJJTkQoTF9kb0xhc3QpOworICAgIF9fIGFlc2VuY2xhc3QoeG1tX3Jlc3VsdCwgeG1tX3RlbXApOworICAgIF9fIG1vdmRxdShBZGRyZXNzKHRvLCAwKSwgeG1tX3Jlc3VsdCk7ICAgICAgICAvLyBzdG9yZSB0aGUgcmVzdWx0CisgICAgX18geG9ycHRyKHJheCwgcmF4KTsgLy8gcmV0dXJuIDAKKyAgICBfXyBwb3AocnNpKTsKKyAgICBfXyBsZWF2ZSgpOyAvLyByZXF1aXJlZCBmb3IgcHJvcGVyIHN0YWNrd2Fsa2luZyBvZiBSdW50aW1lU3R1YiBmcmFtZQorICAgIF9fIHJldCgwKTsKKworICAgIHJldHVybiBzdGFydDsKKyAgfQorCisKKyAgLy8gQXJndW1lbnRzOgorICAvLworICAvLyBJbnB1dHM6CisgIC8vICAgY19yYXJnMCAgIC0gc291cmNlIGJ5dGUgYXJyYXkgYWRkcmVzcworICAvLyAgIGNfcmFyZzEgICAtIGRlc3RpbmF0aW9uIGJ5dGUgYXJyYXkgYWRkcmVzcworICAvLyAgIGNfcmFyZzIgICAtIEsgKGtleSkgaW4gbGl0dGxlIGVuZGlhbiBpbnQgYXJyYXkKKyAgLy8KKyAgYWRkcmVzcyBnZW5lcmF0ZV9hZXNjcnlwdF9kZWNyeXB0QmxvY2soKSB7CisgICAgYXNzZXJ0KFVzZUFFUyAmJiAoVXNlQVZYID4gMCksICJuZWVkIEFFUyBpbnN0cnVjdGlvbnMgYW5kIG1pc2FsaWduZWQgU1NFIHN1cHBvcnQiKTsKKyAgICBfXyBhbGlnbihDb2RlRW50cnlBbGlnbm1lbnQpOworICAgIFN0dWJDb2RlTWFyayBtYXJrKHRoaXMsICJTdHViUm91dGluZXMiLCAiYWVzY3J5cHRfZGVjcnlwdEJsb2NrIik7CisgICAgTGFiZWwgTF9kb0xhc3Q7CisgICAgYWRkcmVzcyBzdGFydCA9IF9fIHBjKCk7CisKKyAgICBjb25zdCBSZWdpc3RlciBmcm9tICAgICAgICA9IHJzaTsgICAgICAvLyBzb3VyY2UgYXJyYXkgYWRkcmVzcworICAgIGNvbnN0IFJlZ2lzdGVyIHRvICAgICAgICAgID0gcmR4OyAgICAgIC8vIGRlc3RpbmF0aW9uIGFycmF5IGFkZHJlc3MKKyAgICBjb25zdCBSZWdpc3RlciBrZXkgICAgICAgICA9IHJjeDsgICAgICAvLyBrZXkgYXJyYXkgYWRkcmVzcworICAgIGNvbnN0IFJlZ2lzdGVyIGtleWxlbiAgICAgID0gcmF4OworICAgIGNvbnN0IEFkZHJlc3MgIGZyb21fcGFyYW0ocmJwLCA4KzApOworICAgIGNvbnN0IEFkZHJlc3MgIHRvX3BhcmFtICAocmJwLCA4KzQpOworICAgIGNvbnN0IEFkZHJlc3MgIGtleV9wYXJhbSAocmJwLCA4KzgpOworCisgICAgY29uc3QgWE1NUmVnaXN0ZXIgeG1tX3Jlc3VsdCA9IHhtbTA7CisgICAgY29uc3QgWE1NUmVnaXN0ZXIgeG1tX3RlbXAgICA9IHhtbTE7CisgICAgY29uc3QgWE1NUmVnaXN0ZXIgeG1tX2tleV9zaHVmX21hc2sgPSB4bW0yOworCisgICAgX18gZW50ZXIoKTsgLy8gcmVxdWlyZWQgZm9yIHByb3BlciBzdGFja3dhbGtpbmcgb2YgUnVudGltZVN0dWIgZnJhbWUKKyAgICBfXyBwdXNoKHJzaSk7CisgICAgX18gbW92cHRyKGZyb20gLCBmcm9tX3BhcmFtKTsKKyAgICBfXyBtb3ZwdHIodG8gICAsIHRvX3BhcmFtKTsKKyAgICBfXyBtb3ZwdHIoa2V5ICAsIGtleV9wYXJhbSk7CisKKyAgICBfXyBtb3ZsKGtleWxlbiwgQWRkcmVzcyhrZXksIGFycmF5T29wRGVzYzo6bGVuZ3RoX29mZnNldF9pbl9ieXRlcygpIC0gYXJyYXlPb3BEZXNjOjpiYXNlX29mZnNldF9pbl9ieXRlcyhUX0lOVCkpKTsKKyAgICAvLyBrZXlsZW4gPSAjIG9mIDMyLWJpdCB3b3JkcywgY29udmVydCB0byAxMjgtYml0IHdvcmRzCisgICAgX18gc2hybChrZXlsZW4sIDIpOworICAgIF9fIHN1Ymwoa2V5bGVuLCAxMSk7ICAgLy8gZXZlcnkga2V5IGhhcyBhdCBsZWFzdCAxMSAxMjgtYml0IHdvcmRzLCBzb21lIGhhdmUgbW9yZQorCisgICAgX18gbW92ZHF1KHhtbV9rZXlfc2h1Zl9tYXNrLCBFeHRlcm5hbEFkZHJlc3MoU3R1YlJvdXRpbmVzOjp4ODY6OmtleV9zaHVmZmxlX21hc2tfYWRkcigpKSk7CisgICAgX18gbW92ZHF1KHhtbV9yZXN1bHQsIEFkZHJlc3MoZnJvbSwgMCkpOworCisgICAgLy8gZm9yIGRlY3J5cHRpb24gamF2YSBleHBhbmRlZCBrZXkgb3JkZXJpbmcgaXMgcm90YXRlZCBvbmUgcG9zaXRpb24gZnJvbSB3aGF0IHdlIHdhbnQKKyAgICAvLyBzbyB3ZSBzdGFydCBmcm9tIDB4MTAgaGVyZSBhbmQgaGl0IDB4MDAgbGFzdAorICAgIC8vIHdlIGRvbid0IGtub3cgaWYgdGhlIGtleSBpcyBhbGlnbmVkLCBoZW5jZSBub3QgdXNpbmcgbG9hZC1leGVjdXRlIGZvcm0KKyAgICBsb2FkX2tleSh4bW1fdGVtcCwga2V5LCAweDEwLCB4bW1fa2V5X3NodWZfbWFzayk7CisgICAgX18gcHhvciAgKHhtbV9yZXN1bHQsIHhtbV90ZW1wKTsKKyAgICBmb3IgKGludCBvZmZzZXQgPSAweDIwOyBvZmZzZXQgPD0gMHhhMDsgb2Zmc2V0ICs9IDB4MTApIHsKKyAgICAgIGFlc19kZWNfa2V5KHhtbV9yZXN1bHQsIHhtbV90ZW1wLCBrZXksIG9mZnNldCwgeG1tX2tleV9zaHVmX21hc2spOworICAgIH0KKyAgICBfXyBjbXBsKGtleWxlbiwgMCk7CisgICAgX18gamNjKEFzc2VtYmxlcjo6ZXF1YWwsIExfZG9MYXN0KTsKKyAgICAvLyBvbmx5IGluIDE5MiBhbmQgMjU2IGJpdCBrZXlzCisgICAgYWVzX2RlY19rZXkoeG1tX3Jlc3VsdCwgeG1tX3RlbXAsIGtleSwgMHhiMCwgeG1tX2tleV9zaHVmX21hc2spOworICAgIGFlc19kZWNfa2V5KHhtbV9yZXN1bHQsIHhtbV90ZW1wLCBrZXksIDB4YzAsIHhtbV9rZXlfc2h1Zl9tYXNrKTsKKyAgICBfXyBzdWJsKGtleWxlbiwgMik7CisgICAgX18gamNjKEFzc2VtYmxlcjo6ZXF1YWwsIExfZG9MYXN0KTsKKyAgICAvLyBvbmx5IGluIDI1NiBiaXQga2V5cworICAgIGFlc19kZWNfa2V5KHhtbV9yZXN1bHQsIHhtbV90ZW1wLCBrZXksIDB4ZDAsIHhtbV9rZXlfc2h1Zl9tYXNrKTsKKyAgICBhZXNfZGVjX2tleSh4bW1fcmVzdWx0LCB4bW1fdGVtcCwga2V5LCAweGUwLCB4bW1fa2V5X3NodWZfbWFzayk7CisKKyAgICBfXyBCSU5EKExfZG9MYXN0KTsKKyAgICAvLyBmb3IgZGVjcnlwdGlvbiB0aGUgYWVzZGVjbGFzdCBvcGVyYXRpb24gaXMgYWx3YXlzIG9uIGtleSsweDAwCisgICAgbG9hZF9rZXkoeG1tX3RlbXAsIGtleSwgMHgwMCwgeG1tX2tleV9zaHVmX21hc2spOworICAgIF9fIGFlc2RlY2xhc3QoeG1tX3Jlc3VsdCwgeG1tX3RlbXApOworCisgICAgX18gbW92ZHF1KEFkZHJlc3ModG8sIDApLCB4bW1fcmVzdWx0KTsgIC8vIHN0b3JlIHRoZSByZXN1bHQKKworICAgIF9fIHhvcnB0cihyYXgsIHJheCk7IC8vIHJldHVybiAwCisgICAgX18gcG9wKHJzaSk7CisgICAgX18gbGVhdmUoKTsgLy8gcmVxdWlyZWQgZm9yIHByb3BlciBzdGFja3dhbGtpbmcgb2YgUnVudGltZVN0dWIgZnJhbWUKKyAgICBfXyByZXQoMCk7CisKKyAgICByZXR1cm4gc3RhcnQ7CisgIH0KKworICB2b2lkIGhhbmRsZVNPRVJlZ2lzdGVycyhib29sIHNhdmluZykgeworICAgIGNvbnN0IGludCBzYXZlRnJhbWVTaXplSW5CeXRlcyA9IDQgKiB3b3JkU2l6ZTsKKyAgICBjb25zdCBBZGRyZXNzIHNhdmVkX3JieCAgICAgKHJicCwgLTMgKiB3b3JkU2l6ZSk7CisgICAgY29uc3QgQWRkcmVzcyBzYXZlZF9yc2kgICAgIChyYnAsIC0yICogd29yZFNpemUpOworICAgIGNvbnN0IEFkZHJlc3Mgc2F2ZWRfcmRpICAgICAocmJwLCAtMSAqIHdvcmRTaXplKTsKKworICAgIGlmIChzYXZpbmcpIHsKKyAgICAgIF9fIHN1YnB0cihyc3AsIHNhdmVGcmFtZVNpemVJbkJ5dGVzKTsKKyAgICAgIF9fIG1vdnB0cihzYXZlZF9yc2ksIHJzaSk7CisgICAgICBfXyBtb3ZwdHIoc2F2ZWRfcmRpLCByZGkpOworICAgICAgX18gbW92cHRyKHNhdmVkX3JieCwgcmJ4KTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gcmVzdG9yaW5nCisgICAgICBfXyBtb3ZwdHIocnNpLCBzYXZlZF9yc2kpOworICAgICAgX18gbW92cHRyKHJkaSwgc2F2ZWRfcmRpKTsKKyAgICAgIF9fIG1vdnB0cihyYngsIHNhdmVkX3JieCk7CisgICAgfQorICB9CisKKyAgLy8gQXJndW1lbnRzOgorICAvLworICAvLyBJbnB1dHM6CisgIC8vICAgY19yYXJnMCAgIC0gc291cmNlIGJ5dGUgYXJyYXkgYWRkcmVzcworICAvLyAgIGNfcmFyZzEgICAtIGRlc3RpbmF0aW9uIGJ5dGUgYXJyYXkgYWRkcmVzcworICAvLyAgIGNfcmFyZzIgICAtIEsgKGtleSkgaW4gbGl0dGxlIGVuZGlhbiBpbnQgYXJyYXkKKyAgLy8gICBjX3JhcmczICAgLSByIHZlY3RvciBieXRlIGFycmF5IGFkZHJlc3MKKyAgLy8gICBjX3Jhcmc0ICAgLSBpbnB1dCBsZW5ndGgKKyAgLy8KKyAgYWRkcmVzcyBnZW5lcmF0ZV9jaXBoZXJCbG9ja0NoYWluaW5nX2VuY3J5cHRBRVNDcnlwdCgpIHsKKyAgICBhc3NlcnQoVXNlQUVTICYmIChVc2VBVlggPiAwKSwgIm5lZWQgQUVTIGluc3RydWN0aW9ucyBhbmQgbWlzYWxpZ25lZCBTU0Ugc3VwcG9ydCIpOworICAgIF9fIGFsaWduKENvZGVFbnRyeUFsaWdubWVudCk7CisgICAgU3R1YkNvZGVNYXJrIG1hcmsodGhpcywgIlN0dWJSb3V0aW5lcyIsICJjaXBoZXJCbG9ja0NoYWluaW5nX2VuY3J5cHRBRVNDcnlwdCIpOworICAgIGFkZHJlc3Mgc3RhcnQgPSBfXyBwYygpOworCisgICAgTGFiZWwgTF9leGl0LCBMX2tleV8xOTJfMjU2LCBMX2tleV8yNTYsIExfbG9vcFRvcF8xMjgsIExfbG9vcFRvcF8xOTIsIExfbG9vcFRvcF8yNTY7CisgICAgY29uc3QgUmVnaXN0ZXIgZnJvbSAgICAgICAgPSByc2k7ICAgICAgLy8gc291cmNlIGFycmF5IGFkZHJlc3MKKyAgICBjb25zdCBSZWdpc3RlciB0byAgICAgICAgICA9IHJkeDsgICAgICAvLyBkZXN0aW5hdGlvbiBhcnJheSBhZGRyZXNzCisgICAgY29uc3QgUmVnaXN0ZXIga2V5ICAgICAgICAgPSByY3g7ICAgICAgLy8ga2V5IGFycmF5IGFkZHJlc3MKKyAgICBjb25zdCBSZWdpc3RlciBydmVjICAgICAgICA9IHJkaTsgICAgICAvLyByIGJ5dGUgYXJyYXkgaW5pdGlhbGl6ZWQgZnJvbSBpbml0dmVjdG9yIGFycmF5IGFkZHJlc3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgbGVmdCB3aXRoIHRoZSByZXN1bHRzIG9mIHRoZSBsYXN0IGVuY3J5cHRpb24gYmxvY2sKKyAgICBjb25zdCBSZWdpc3RlciBsZW5fcmVnICAgICA9IHJieDsgICAgICAvLyBzcmMgbGVuIChtdXN0IGJlIG11bHRpcGxlIG9mIGJsb2Nrc2l6ZSAxNikKKyAgICBjb25zdCBSZWdpc3RlciBwb3MgICAgICAgICA9IHJheDsKKworICAgIC8vIHhtbSByZWdpc3RlciBhc3NpZ25tZW50cyBmb3IgdGhlIGxvb3BzIGJlbG93CisgICAgY29uc3QgWE1NUmVnaXN0ZXIgeG1tX3Jlc3VsdCA9IHhtbTA7CisgICAgY29uc3QgWE1NUmVnaXN0ZXIgeG1tX3RlbXAgICA9IHhtbTE7CisgICAgLy8gZmlyc3QgNiBrZXlzIHByZWxvYWRlZCBpbnRvIHhtbTIteG1tNworICAgIGNvbnN0IGludCBYTU1fUkVHX05VTV9LRVlfRklSU1QgPSAyOworICAgIGNvbnN0IGludCBYTU1fUkVHX05VTV9LRVlfTEFTVCAgPSA3OworICAgIGNvbnN0IFhNTVJlZ2lzdGVyIHhtbV9rZXkwICAgPSBhc19YTU1SZWdpc3RlcihYTU1fUkVHX05VTV9LRVlfRklSU1QpOworCisgICAgX18gZW50ZXIoKTsgLy8gcmVxdWlyZWQgZm9yIHByb3BlciBzdGFja3dhbGtpbmcgb2YgUnVudGltZVN0dWIgZnJhbWUKKyAgICBoYW5kbGVTT0VSZWdpc3RlcnModHJ1ZSAvKnNhdmluZyovKTsKKworICAgIC8vIGxvYWQgcmVnaXN0ZXJzIGZyb20gaW5jb21pbmcgcGFyYW1ldGVycworICAgIGNvbnN0IEFkZHJlc3MgIGZyb21fcGFyYW0ocmJwLCA4KzApOworICAgIGNvbnN0IEFkZHJlc3MgIHRvX3BhcmFtICAocmJwLCA4KzQpOworICAgIGNvbnN0IEFkZHJlc3MgIGtleV9wYXJhbSAocmJwLCA4KzgpOworICAgIGNvbnN0IEFkZHJlc3MgIHJ2ZWNfcGFyYW0gKHJicCwgOCsxMik7CisgICAgY29uc3QgQWRkcmVzcyAgbGVuX3BhcmFtICAocmJwLCA4KzE2KTsKKyAgICBfXyBtb3ZwdHIoZnJvbSAsIGZyb21fcGFyYW0pOworICAgIF9fIG1vdnB0cih0byAgICwgdG9fcGFyYW0pOworICAgIF9fIG1vdnB0cihrZXkgICwga2V5X3BhcmFtKTsKKyAgICBfXyBtb3ZwdHIocnZlYyAsIHJ2ZWNfcGFyYW0pOworICAgIF9fIG1vdnB0cihsZW5fcmVnICwgbGVuX3BhcmFtKTsKKworICAgIGNvbnN0IFhNTVJlZ2lzdGVyIHhtbV9rZXlfc2h1Zl9tYXNrID0geG1tX3RlbXA7ICAvLyB1c2VkIHRlbXBvcmFyaWx5IHRvIHN3YXAga2V5IGJ5dGVzIHVwIGZyb250CisgICAgX18gbW92ZHF1KHhtbV9rZXlfc2h1Zl9tYXNrLCBFeHRlcm5hbEFkZHJlc3MoU3R1YlJvdXRpbmVzOjp4ODY6OmtleV9zaHVmZmxlX21hc2tfYWRkcigpKSk7CisgICAgLy8gbG9hZCB1cCB4bW0gcmVncyAyIHRocnUgNyB3aXRoIGtleXMgMC01CisgICAgZm9yIChpbnQgcm51bSA9IFhNTV9SRUdfTlVNX0tFWV9GSVJTVCwgb2Zmc2V0ID0gMHgwMDsgcm51bSAgPD0gWE1NX1JFR19OVU1fS0VZX0xBU1Q7IHJudW0rKykgeworICAgICAgbG9hZF9rZXkoYXNfWE1NUmVnaXN0ZXIocm51bSksIGtleSwgb2Zmc2V0LCB4bW1fa2V5X3NodWZfbWFzayk7CisgICAgICBvZmZzZXQgKz0gMHgxMDsKKyAgICB9CisKKyAgICBfXyBtb3ZkcXUoeG1tX3Jlc3VsdCwgQWRkcmVzcyhydmVjLCAweDAwKSk7ICAgLy8gaW5pdGlhbGl6ZSB4bW1fcmVzdWx0IHdpdGggciB2ZWMKKworICAgIC8vIG5vdyBzcGxpdCB0byBkaWZmZXJlbnQgcGF0aHMgZGVwZW5kaW5nIG9uIHRoZSBrZXlsZW4gKGxlbiBpbiBpbnRzIG9mIEFFU0NyeXB0LktMRSBhcnJheSAoNTI9MTkyLCBvciA2MD0yNTYpKQorICAgIF9fIG1vdmwocmF4LCBBZGRyZXNzKGtleSwgYXJyYXlPb3BEZXNjOjpsZW5ndGhfb2Zmc2V0X2luX2J5dGVzKCkgLSBhcnJheU9vcERlc2M6OmJhc2Vfb2Zmc2V0X2luX2J5dGVzKFRfSU5UKSkpOworICAgIF9fIGNtcGwocmF4LCA0NCk7CisgICAgX18gamNjKEFzc2VtYmxlcjo6bm90RXF1YWwsIExfa2V5XzE5Ml8yNTYpOworCisgICAgLy8gMTI4IGJpdCBjb2RlIGZvbGxvd3MgaGVyZQorICAgIF9fIG1vdnB0cihwb3MsIDApOworICAgIF9fIGFsaWduKE9wdG9Mb29wQWxpZ25tZW50KTsKKyAgICBfXyBCSU5EKExfbG9vcFRvcF8xMjgpOworICAgIF9fIG1vdmRxdSh4bW1fdGVtcCwgQWRkcmVzcyhmcm9tLCBwb3MsIEFkZHJlc3M6OnRpbWVzXzEsIDApKTsgICAvLyBnZXQgbmV4dCAxNiBieXRlcyBvZiBpbnB1dAorICAgIF9fIHB4b3IgICh4bW1fcmVzdWx0LCB4bW1fdGVtcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB4b3Igd2l0aCB0aGUgY3VycmVudCByIHZlY3RvcgorCisgICAgX18gcHhvciAgKHhtbV9yZXN1bHQsIHhtbV9rZXkwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvIHRoZSBhZXMgcm91bmRzCisgICAgZm9yIChpbnQgcm51bSA9IFhNTV9SRUdfTlVNX0tFWV9GSVJTVCArIDE7IHJudW0gIDw9IFhNTV9SRUdfTlVNX0tFWV9MQVNUOyBybnVtKyspIHsKKyAgICAgIF9fIGFlc2VuYyh4bW1fcmVzdWx0LCBhc19YTU1SZWdpc3RlcihybnVtKSk7CisgICAgfQorICAgIGZvciAoaW50IGtleV9vZmZzZXQgPSAweDYwOyBrZXlfb2Zmc2V0IDw9IDB4OTA7IGtleV9vZmZzZXQgKz0gMHgxMCkgeworICAgICAgYWVzX2VuY19rZXkoeG1tX3Jlc3VsdCwgeG1tX3RlbXAsIGtleSwga2V5X29mZnNldCk7CisgICAgfQorICAgIGxvYWRfa2V5KHhtbV90ZW1wLCBrZXksIDB4YTApOworICAgIF9fIGFlc2VuY2xhc3QoeG1tX3Jlc3VsdCwgeG1tX3RlbXApOworCisgICAgX18gbW92ZHF1KEFkZHJlc3ModG8sIHBvcywgQWRkcmVzczo6dGltZXNfMSwgMCksIHhtbV9yZXN1bHQpOyAgICAgLy8gc3RvcmUgaW50byB0aGUgbmV4dCAxNiBieXRlcyBvZiBvdXRwdXQKKyAgICAvLyBubyBuZWVkIHRvIHN0b3JlIHIgdG8gbWVtb3J5IHVudGlsIHdlIGV4aXQKKyAgICBfXyBhZGRwdHIocG9zLCBBRVNCbG9ja1NpemUpOworICAgIF9fIHN1YnB0cihsZW5fcmVnLCBBRVNCbG9ja1NpemUpOworICAgIF9fIGpjYyhBc3NlbWJsZXI6Om5vdEVxdWFsLCBMX2xvb3BUb3BfMTI4KTsKKworICAgIF9fIEJJTkQoTF9leGl0KTsKKyAgICBfXyBtb3ZkcXUoQWRkcmVzcyhydmVjLCAwKSwgeG1tX3Jlc3VsdCk7ICAgICAvLyBmaW5hbCB2YWx1ZSBvZiByIHN0b3JlZCBpbiBydmVjIG9mIENpcGhlckJsb2NrQ2hhaW5pbmcgb2JqZWN0CisKKyAgICBoYW5kbGVTT0VSZWdpc3RlcnMoZmFsc2UgLypyZXN0b3JpbmcqLyk7CisgICAgX18gbW92bChyYXgsIDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIDAgKHdoeT8pCisgICAgX18gbGVhdmUoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVxdWlyZWQgZm9yIHByb3BlciBzdGFja3dhbGtpbmcgb2YgUnVudGltZVN0dWIgZnJhbWUKKyAgICBfXyByZXQoMCk7CisKKyAgX18gQklORChMX2tleV8xOTJfMjU2KTsKKyAgLy8gaGVyZSByYXggPSBsZW4gaW4gaW50cyBvZiBBRVNDcnlwdC5LTEUgYXJyYXkgKDUyPTE5Miwgb3IgNjA9MjU2KQorICAgIF9fIGNtcGwocmF4LCA1Mik7CisgICAgX18gamNjKEFzc2VtYmxlcjo6bm90RXF1YWwsIExfa2V5XzI1Nik7CisKKyAgICAvLyAxOTItYml0IGNvZGUgZm9sbG93cyBoZXJlIChjb3VsZCBiZSBjaGFuZ2VkIHRvIHVzZSBtb3JlIHhtbSByZWdpc3RlcnMpCisgICAgX18gbW92cHRyKHBvcywgMCk7CisgIF9fIGFsaWduKE9wdG9Mb29wQWxpZ25tZW50KTsKKyAgX18gQklORChMX2xvb3BUb3BfMTkyKTsKKyAgICBfXyBtb3ZkcXUoeG1tX3RlbXAsIEFkZHJlc3MoZnJvbSwgcG9zLCBBZGRyZXNzOjp0aW1lc18xLCAwKSk7ICAgLy8gZ2V0IG5leHQgMTYgYnl0ZXMgb2YgaW5wdXQKKyAgICBfXyBweG9yICAoeG1tX3Jlc3VsdCwgeG1tX3RlbXApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8geG9yIHdpdGggdGhlIGN1cnJlbnQgciB2ZWN0b3IKKworICAgIF9fIHB4b3IgICh4bW1fcmVzdWx0LCB4bW1fa2V5MCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkbyB0aGUgYWVzIHJvdW5kcworICAgIGZvciAoaW50IHJudW0gPSBYTU1fUkVHX05VTV9LRVlfRklSU1QgKyAxOyBybnVtICA8PSBYTU1fUkVHX05VTV9LRVlfTEFTVDsgcm51bSsrKSB7CisgICAgICBfXyBhZXNlbmMoeG1tX3Jlc3VsdCwgYXNfWE1NUmVnaXN0ZXIocm51bSkpOworICAgIH0KKyAgICBmb3IgKGludCBrZXlfb2Zmc2V0ID0gMHg2MDsga2V5X29mZnNldCA8PSAweGIwOyBrZXlfb2Zmc2V0ICs9IDB4MTApIHsKKyAgICAgIGFlc19lbmNfa2V5KHhtbV9yZXN1bHQsIHhtbV90ZW1wLCBrZXksIGtleV9vZmZzZXQpOworICAgIH0KKyAgICBsb2FkX2tleSh4bW1fdGVtcCwga2V5LCAweGMwKTsKKyAgICBfXyBhZXNlbmNsYXN0KHhtbV9yZXN1bHQsIHhtbV90ZW1wKTsKKworICAgIF9fIG1vdmRxdShBZGRyZXNzKHRvLCBwb3MsIEFkZHJlc3M6OnRpbWVzXzEsIDApLCB4bW1fcmVzdWx0KTsgICAvLyBzdG9yZSBpbnRvIHRoZSBuZXh0IDE2IGJ5dGVzIG9mIG91dHB1dAorICAgIC8vIG5vIG5lZWQgdG8gc3RvcmUgciB0byBtZW1vcnkgdW50aWwgd2UgZXhpdAorICAgIF9fIGFkZHB0cihwb3MsIEFFU0Jsb2NrU2l6ZSk7CisgICAgX18gc3VicHRyKGxlbl9yZWcsIEFFU0Jsb2NrU2l6ZSk7CisgICAgX18gamNjKEFzc2VtYmxlcjo6bm90RXF1YWwsIExfbG9vcFRvcF8xOTIpOworICAgIF9fIGptcChMX2V4aXQpOworCisgIF9fIEJJTkQoTF9rZXlfMjU2KTsKKyAgICAvLyAyNTYtYml0IGNvZGUgZm9sbG93cyBoZXJlIChjb3VsZCBiZSBjaGFuZ2VkIHRvIHVzZSBtb3JlIHhtbSByZWdpc3RlcnMpCisgICAgX18gbW92cHRyKHBvcywgMCk7CisgIF9fIGFsaWduKE9wdG9Mb29wQWxpZ25tZW50KTsKKyAgX18gQklORChMX2xvb3BUb3BfMjU2KTsKKyAgICBfXyBtb3ZkcXUoeG1tX3RlbXAsIEFkZHJlc3MoZnJvbSwgcG9zLCBBZGRyZXNzOjp0aW1lc18xLCAwKSk7ICAgLy8gZ2V0IG5leHQgMTYgYnl0ZXMgb2YgaW5wdXQKKyAgICBfXyBweG9yICAoeG1tX3Jlc3VsdCwgeG1tX3RlbXApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8geG9yIHdpdGggdGhlIGN1cnJlbnQgciB2ZWN0b3IKKworICAgIF9fIHB4b3IgICh4bW1fcmVzdWx0LCB4bW1fa2V5MCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkbyB0aGUgYWVzIHJvdW5kcworICAgIGZvciAoaW50IHJudW0gPSBYTU1fUkVHX05VTV9LRVlfRklSU1QgKyAxOyBybnVtICA8PSBYTU1fUkVHX05VTV9LRVlfTEFTVDsgcm51bSsrKSB7CisgICAgICBfXyBhZXNlbmMoeG1tX3Jlc3VsdCwgYXNfWE1NUmVnaXN0ZXIocm51bSkpOworICAgIH0KKyAgICBmb3IgKGludCBrZXlfb2Zmc2V0ID0gMHg2MDsga2V5X29mZnNldCA8PSAweGQwOyBrZXlfb2Zmc2V0ICs9IDB4MTApIHsKKyAgICAgIGFlc19lbmNfa2V5KHhtbV9yZXN1bHQsIHhtbV90ZW1wLCBrZXksIGtleV9vZmZzZXQpOworICAgIH0KKyAgICBsb2FkX2tleSh4bW1fdGVtcCwga2V5LCAweGUwKTsKKyAgICBfXyBhZXNlbmNsYXN0KHhtbV9yZXN1bHQsIHhtbV90ZW1wKTsKKworICAgIF9fIG1vdmRxdShBZGRyZXNzKHRvLCBwb3MsIEFkZHJlc3M6OnRpbWVzXzEsIDApLCB4bW1fcmVzdWx0KTsgICAvLyBzdG9yZSBpbnRvIHRoZSBuZXh0IDE2IGJ5dGVzIG9mIG91dHB1dAorICAgIC8vIG5vIG5lZWQgdG8gc3RvcmUgciB0byBtZW1vcnkgdW50aWwgd2UgZXhpdAorICAgIF9fIGFkZHB0cihwb3MsIEFFU0Jsb2NrU2l6ZSk7CisgICAgX18gc3VicHRyKGxlbl9yZWcsIEFFU0Jsb2NrU2l6ZSk7CisgICAgX18gamNjKEFzc2VtYmxlcjo6bm90RXF1YWwsIExfbG9vcFRvcF8yNTYpOworICAgIF9fIGptcChMX2V4aXQpOworCisgICAgcmV0dXJuIHN0YXJ0OworICB9CisKKworICAvLyBDQkMgQUVTIERlY3J5cHRpb24uCisgIC8vIEluIDMyLWJpdCBzdHViLCBiZWNhdXNlIG9mIGxhY2sgb2YgcmVnaXN0ZXJzIHdlIGRvIG5vdCB0cnkgdG8gcGFyYWxsZWxpemUgNCBibG9ja3MgYXQgYSB0aW1lLgorICAvLworICAvLyBBcmd1bWVudHM6CisgIC8vCisgIC8vIElucHV0czoKKyAgLy8gICBjX3JhcmcwICAgLSBzb3VyY2UgYnl0ZSBhcnJheSBhZGRyZXNzCisgIC8vICAgY19yYXJnMSAgIC0gZGVzdGluYXRpb24gYnl0ZSBhcnJheSBhZGRyZXNzCisgIC8vICAgY19yYXJnMiAgIC0gSyAoa2V5KSBpbiBsaXR0bGUgZW5kaWFuIGludCBhcnJheQorICAvLyAgIGNfcmFyZzMgICAtIHIgdmVjdG9yIGJ5dGUgYXJyYXkgYWRkcmVzcworICAvLyAgIGNfcmFyZzQgICAtIGlucHV0IGxlbmd0aAorICAvLworCisgIGFkZHJlc3MgZ2VuZXJhdGVfY2lwaGVyQmxvY2tDaGFpbmluZ19kZWNyeXB0QUVTQ3J5cHQoKSB7CisgICAgYXNzZXJ0KFVzZUFFUyAmJiAoVXNlQVZYID4gMCksICJuZWVkIEFFUyBpbnN0cnVjdGlvbnMgYW5kIG1pc2FsaWduZWQgU1NFIHN1cHBvcnQiKTsKKyAgICBfXyBhbGlnbihDb2RlRW50cnlBbGlnbm1lbnQpOworICAgIFN0dWJDb2RlTWFyayBtYXJrKHRoaXMsICJTdHViUm91dGluZXMiLCAiY2lwaGVyQmxvY2tDaGFpbmluZ19kZWNyeXB0QUVTQ3J5cHQiKTsKKyAgICBhZGRyZXNzIHN0YXJ0ID0gX18gcGMoKTsKKworICAgIExhYmVsIExfZXhpdCwgTF9rZXlfMTkyXzI1NiwgTF9rZXlfMjU2OworICAgIExhYmVsIExfc2luZ2xlQmxvY2tfbG9vcFRvcF8xMjg7CisgICAgTGFiZWwgTF9zaW5nbGVCbG9ja19sb29wVG9wXzE5MiwgTF9zaW5nbGVCbG9ja19sb29wVG9wXzI1NjsKKyAgICBjb25zdCBSZWdpc3RlciBmcm9tICAgICAgICA9IHJzaTsgICAgICAvLyBzb3VyY2UgYXJyYXkgYWRkcmVzcworICAgIGNvbnN0IFJlZ2lzdGVyIHRvICAgICAgICAgID0gcmR4OyAgICAgIC8vIGRlc3RpbmF0aW9uIGFycmF5IGFkZHJlc3MKKyAgICBjb25zdCBSZWdpc3RlciBrZXkgICAgICAgICA9IHJjeDsgICAgICAvLyBrZXkgYXJyYXkgYWRkcmVzcworICAgIGNvbnN0IFJlZ2lzdGVyIHJ2ZWMgICAgICAgID0gcmRpOyAgICAgIC8vIHIgYnl0ZSBhcnJheSBpbml0aWFsaXplZCBmcm9tIGluaXR2ZWN0b3IgYXJyYXkgYWRkcmVzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBsZWZ0IHdpdGggdGhlIHJlc3VsdHMgb2YgdGhlIGxhc3QgZW5jcnlwdGlvbiBibG9jaworICAgIGNvbnN0IFJlZ2lzdGVyIGxlbl9yZWcgICAgID0gcmJ4OyAgICAgIC8vIHNyYyBsZW4gKG11c3QgYmUgbXVsdGlwbGUgb2YgYmxvY2tzaXplIDE2KQorICAgIGNvbnN0IFJlZ2lzdGVyIHBvcyAgICAgICAgID0gcmF4OworCisgICAgLy8geG1tIHJlZ2lzdGVyIGFzc2lnbm1lbnRzIGZvciB0aGUgbG9vcHMgYmVsb3cKKyAgICBjb25zdCBYTU1SZWdpc3RlciB4bW1fcmVzdWx0ID0geG1tMDsKKyAgICBjb25zdCBYTU1SZWdpc3RlciB4bW1fdGVtcCAgID0geG1tMTsKKyAgICAvLyBmaXJzdCA2IGtleXMgcHJlbG9hZGVkIGludG8geG1tMi14bW03CisgICAgY29uc3QgaW50IFhNTV9SRUdfTlVNX0tFWV9GSVJTVCA9IDI7CisgICAgY29uc3QgaW50IFhNTV9SRUdfTlVNX0tFWV9MQVNUICA9IDc7CisgICAgY29uc3QgaW50IEZJUlNUX05PTl9SRUdfS0VZX29mZnNldCA9IDB4NzA7CisgICAgY29uc3QgWE1NUmVnaXN0ZXIgeG1tX2tleV9maXJzdCAgID0gYXNfWE1NUmVnaXN0ZXIoWE1NX1JFR19OVU1fS0VZX0ZJUlNUKTsKKworICAgIF9fIGVudGVyKCk7IC8vIHJlcXVpcmVkIGZvciBwcm9wZXIgc3RhY2t3YWxraW5nIG9mIFJ1bnRpbWVTdHViIGZyYW1lCisgICAgaGFuZGxlU09FUmVnaXN0ZXJzKHRydWUgLypzYXZpbmcqLyk7CisKKyAgICAvLyBsb2FkIHJlZ2lzdGVycyBmcm9tIGluY29taW5nIHBhcmFtZXRlcnMKKyAgICBjb25zdCBBZGRyZXNzICBmcm9tX3BhcmFtKHJicCwgOCswKTsKKyAgICBjb25zdCBBZGRyZXNzICB0b19wYXJhbSAgKHJicCwgOCs0KTsKKyAgICBjb25zdCBBZGRyZXNzICBrZXlfcGFyYW0gKHJicCwgOCs4KTsKKyAgICBjb25zdCBBZGRyZXNzICBydmVjX3BhcmFtIChyYnAsIDgrMTIpOworICAgIGNvbnN0IEFkZHJlc3MgIGxlbl9wYXJhbSAgKHJicCwgOCsxNik7CisgICAgX18gbW92cHRyKGZyb20gLCBmcm9tX3BhcmFtKTsKKyAgICBfXyBtb3ZwdHIodG8gICAsIHRvX3BhcmFtKTsKKyAgICBfXyBtb3ZwdHIoa2V5ICAsIGtleV9wYXJhbSk7CisgICAgX18gbW92cHRyKHJ2ZWMgLCBydmVjX3BhcmFtKTsKKyAgICBfXyBtb3ZwdHIobGVuX3JlZyAsIGxlbl9wYXJhbSk7CisKKyAgICAvLyB0aGUgamF2YSBleHBhbmRlZCBrZXkgb3JkZXJpbmcgaXMgcm90YXRlZCBvbmUgcG9zaXRpb24gZnJvbSB3aGF0IHdlIHdhbnQKKyAgICAvLyBzbyB3ZSBzdGFydCBmcm9tIDB4MTAgaGVyZSBhbmQgaGl0IDB4MDAgbGFzdAorICAgIGNvbnN0IFhNTVJlZ2lzdGVyIHhtbV9rZXlfc2h1Zl9tYXNrID0geG1tMTsgIC8vIHVzZWQgdGVtcG9yYXJpbHkgdG8gc3dhcCBrZXkgYnl0ZXMgdXAgZnJvbnQKKyAgICBfXyBtb3ZkcXUoeG1tX2tleV9zaHVmX21hc2ssIEV4dGVybmFsQWRkcmVzcyhTdHViUm91dGluZXM6Ong4Njo6a2V5X3NodWZmbGVfbWFza19hZGRyKCkpKTsKKyAgICAvLyBsb2FkIHVwIHhtbSByZWdzIDIgdGhydSA2IHdpdGggZmlyc3QgNSBrZXlzCisgICAgZm9yIChpbnQgcm51bSA9IFhNTV9SRUdfTlVNX0tFWV9GSVJTVCwgb2Zmc2V0ID0gMHgxMDsgcm51bSAgPD0gWE1NX1JFR19OVU1fS0VZX0xBU1Q7IHJudW0rKykgeworICAgICAgbG9hZF9rZXkoYXNfWE1NUmVnaXN0ZXIocm51bSksIGtleSwgb2Zmc2V0LCB4bW1fa2V5X3NodWZfbWFzayk7CisgICAgICBvZmZzZXQgKz0gMHgxMDsKKyAgICB9CisKKyAgICAvLyBpbnNpZGUgaGVyZSwgdXNlIHRoZSBydmVjIHJlZ2lzdGVyIHRvIHBvaW50IHRvIHByZXZpb3VzIGJsb2NrIGNpcGhlcgorICAgIC8vIHdpdGggd2hpY2ggd2UgeG9yIGF0IHRoZSBlbmQgb2YgZWFjaCBuZXdseSBkZWNyeXB0ZWQgYmxvY2sKKyAgICBjb25zdCBSZWdpc3RlciAgcHJldl9ibG9ja19jaXBoZXJfcHRyID0gcnZlYzsKKworICAgIC8vIG5vdyBzcGxpdCB0byBkaWZmZXJlbnQgcGF0aHMgZGVwZW5kaW5nIG9uIHRoZSBrZXlsZW4gKGxlbiBpbiBpbnRzIG9mIEFFU0NyeXB0LktMRSBhcnJheSAoNTI9MTkyLCBvciA2MD0yNTYpKQorICAgIF9fIG1vdmwocmF4LCBBZGRyZXNzKGtleSwgYXJyYXlPb3BEZXNjOjpsZW5ndGhfb2Zmc2V0X2luX2J5dGVzKCkgLSBhcnJheU9vcERlc2M6OmJhc2Vfb2Zmc2V0X2luX2J5dGVzKFRfSU5UKSkpOworICAgIF9fIGNtcGwocmF4LCA0NCk7CisgICAgX18gamNjKEFzc2VtYmxlcjo6bm90RXF1YWwsIExfa2V5XzE5Ml8yNTYpOworCisKKyAgICAvLyAxMjgtYml0IGNvZGUgZm9sbG93cyBoZXJlLCBwYXJhbGxlbGl6ZWQKKyAgICBfXyBtb3ZwdHIocG9zLCAwKTsKKyAgX18gYWxpZ24oT3B0b0xvb3BBbGlnbm1lbnQpOworICBfXyBCSU5EKExfc2luZ2xlQmxvY2tfbG9vcFRvcF8xMjgpOworICAgIF9fIGNtcHB0cihsZW5fcmVnLCAwKTsgICAgICAgICAgIC8vIGFueSBibG9ja3MgbGVmdD8/CisgICAgX18gamNjKEFzc2VtYmxlcjo6ZXF1YWwsIExfZXhpdCk7CisgICAgX18gbW92ZHF1KHhtbV9yZXN1bHQsIEFkZHJlc3MoZnJvbSwgcG9zLCBBZGRyZXNzOjp0aW1lc18xLCAwKSk7ICAgLy8gZ2V0IG5leHQgMTYgYnl0ZXMgb2YgY2lwaGVyIGlucHV0CisgICAgX18gcHhvciAgKHhtbV9yZXN1bHQsIHhtbV9rZXlfZmlyc3QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG8gdGhlIGFlcyBkZWMgcm91bmRzCisgICAgZm9yIChpbnQgcm51bSA9IFhNTV9SRUdfTlVNX0tFWV9GSVJTVCArIDE7IHJudW0gIDw9IFhNTV9SRUdfTlVNX0tFWV9MQVNUOyBybnVtKyspIHsKKyAgICAgIF9fIGFlc2RlYyh4bW1fcmVzdWx0LCBhc19YTU1SZWdpc3RlcihybnVtKSk7CisgICAgfQorICAgIGZvciAoaW50IGtleV9vZmZzZXQgPSBGSVJTVF9OT05fUkVHX0tFWV9vZmZzZXQ7IGtleV9vZmZzZXQgPD0gMHhhMDsga2V5X29mZnNldCArPSAweDEwKSB7ICAgLy8gMTI4LWJpdCBydW5zIHVwIHRvIGtleSBvZmZzZXQgYTAKKyAgICAgIGFlc19kZWNfa2V5KHhtbV9yZXN1bHQsIHhtbV90ZW1wLCBrZXksIGtleV9vZmZzZXQpOworICAgIH0KKyAgICBsb2FkX2tleSh4bW1fdGVtcCwga2V5LCAweDAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmluYWwga2V5IGlzIHN0b3JlZCBpbiBqYXZhIGV4cGFuZGVkIGFycmF5IGF0IG9mZnNldCAwCisgICAgX18gYWVzZGVjbGFzdCh4bW1fcmVzdWx0LCB4bW1fdGVtcCk7CisgICAgX18gbW92ZHF1KHhtbV90ZW1wLCBBZGRyZXNzKHByZXZfYmxvY2tfY2lwaGVyX3B0ciwgMHgwMCkpOworICAgIF9fIHB4b3IgICh4bW1fcmVzdWx0LCB4bW1fdGVtcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHhvciB3aXRoIHRoZSBjdXJyZW50IHIgdmVjdG9yCisgICAgX18gbW92ZHF1KEFkZHJlc3ModG8sIHBvcywgQWRkcmVzczo6dGltZXNfMSwgMCksIHhtbV9yZXN1bHQpOyAgICAgLy8gc3RvcmUgaW50byB0aGUgbmV4dCAxNiBieXRlcyBvZiBvdXRwdXQKKyAgICAvLyBubyBuZWVkIHRvIHN0b3JlIHIgdG8gbWVtb3J5IHVudGlsIHdlIGV4aXQKKyAgICBfXyBsZWEocHJldl9ibG9ja19jaXBoZXJfcHRyLCBBZGRyZXNzKGZyb20sIHBvcywgQWRkcmVzczo6dGltZXNfMSwgMCkpOyAgICAgLy8gc2V0IHVwIG5ldyBwdHIKKyAgICBfXyBhZGRwdHIocG9zLCBBRVNCbG9ja1NpemUpOworICAgIF9fIHN1YnB0cihsZW5fcmVnLCBBRVNCbG9ja1NpemUpOworICAgIF9fIGptcChMX3NpbmdsZUJsb2NrX2xvb3BUb3BfMTI4KTsKKworCisgICAgX18gQklORChMX2V4aXQpOworICAgIF9fIG1vdmRxdSh4bW1fdGVtcCwgQWRkcmVzcyhwcmV2X2Jsb2NrX2NpcGhlcl9wdHIsIDB4MDApKTsKKyAgICBfXyBtb3ZwdHIocnZlYyAsIHJ2ZWNfcGFyYW0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXN0b3JlIHRoaXMgc2luY2UgdXNlZCBpbiBsb29wCisgICAgX18gbW92ZHF1KEFkZHJlc3MocnZlYywgMCksIHhtbV90ZW1wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmluYWwgdmFsdWUgb2YgciBzdG9yZWQgaW4gcnZlYyBvZiBDaXBoZXJCbG9ja0NoYWluaW5nIG9iamVjdAorICAgIGhhbmRsZVNPRVJlZ2lzdGVycyhmYWxzZSAvKnJlc3RvcmluZyovKTsKKyAgICBfXyBtb3ZsKHJheCwgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm4gMCAod2h5PykKKyAgICBfXyBsZWF2ZSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXF1aXJlZCBmb3IgcHJvcGVyIHN0YWNrd2Fsa2luZyBvZiBSdW50aW1lU3R1YiBmcmFtZQorICAgIF9fIHJldCgwKTsKKworCisgICAgX18gQklORChMX2tleV8xOTJfMjU2KTsKKyAgICAvLyBoZXJlIHJheCA9IGxlbiBpbiBpbnRzIG9mIEFFU0NyeXB0LktMRSBhcnJheSAoNTI9MTkyLCBvciA2MD0yNTYpCisgICAgX18gY21wbChyYXgsIDUyKTsKKyAgICBfXyBqY2MoQXNzZW1ibGVyOjpub3RFcXVhbCwgTF9rZXlfMjU2KTsKKworICAgIC8vIDE5Mi1iaXQgY29kZSBmb2xsb3dzIGhlcmUgKGNvdWxkIGJlIG9wdGltaXplZCB0byB1c2UgcGFyYWxsZWxpc20pCisgICAgX18gbW92cHRyKHBvcywgMCk7CisgICAgX18gYWxpZ24oT3B0b0xvb3BBbGlnbm1lbnQpOworICAgIF9fIEJJTkQoTF9zaW5nbGVCbG9ja19sb29wVG9wXzE5Mik7CisgICAgX18gbW92ZHF1KHhtbV9yZXN1bHQsIEFkZHJlc3MoZnJvbSwgcG9zLCBBZGRyZXNzOjp0aW1lc18xLCAwKSk7ICAgLy8gZ2V0IG5leHQgMTYgYnl0ZXMgb2YgY2lwaGVyIGlucHV0CisgICAgX18gcHhvciAgKHhtbV9yZXN1bHQsIHhtbV9rZXlfZmlyc3QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG8gdGhlIGFlcyBkZWMgcm91bmRzCisgICAgZm9yIChpbnQgcm51bSA9IFhNTV9SRUdfTlVNX0tFWV9GSVJTVCArIDE7IHJudW0gPD0gWE1NX1JFR19OVU1fS0VZX0xBU1Q7IHJudW0rKykgeworICAgICAgX18gYWVzZGVjKHhtbV9yZXN1bHQsIGFzX1hNTVJlZ2lzdGVyKHJudW0pKTsKKyAgICB9CisgICAgZm9yIChpbnQga2V5X29mZnNldCA9IEZJUlNUX05PTl9SRUdfS0VZX29mZnNldDsga2V5X29mZnNldCA8PSAweGMwOyBrZXlfb2Zmc2V0ICs9IDB4MTApIHsgICAvLyAxOTItYml0IHJ1bnMgdXAgdG8ga2V5IG9mZnNldCBjMAorICAgICAgYWVzX2RlY19rZXkoeG1tX3Jlc3VsdCwgeG1tX3RlbXAsIGtleSwga2V5X29mZnNldCk7CisgICAgfQorICAgIGxvYWRfa2V5KHhtbV90ZW1wLCBrZXksIDB4MDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaW5hbCBrZXkgaXMgc3RvcmVkIGluIGphdmEgZXhwYW5kZWQgYXJyYXkgYXQgb2Zmc2V0IDAKKyAgICBfXyBhZXNkZWNsYXN0KHhtbV9yZXN1bHQsIHhtbV90ZW1wKTsKKyAgICBfXyBtb3ZkcXUoeG1tX3RlbXAsIEFkZHJlc3MocHJldl9ibG9ja19jaXBoZXJfcHRyLCAweDAwKSk7CisgICAgX18gcHhvciAgKHhtbV9yZXN1bHQsIHhtbV90ZW1wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8geG9yIHdpdGggdGhlIGN1cnJlbnQgciB2ZWN0b3IKKyAgICBfXyBtb3ZkcXUoQWRkcmVzcyh0bywgcG9zLCBBZGRyZXNzOjp0aW1lc18xLCAwKSwgeG1tX3Jlc3VsdCk7ICAgICAvLyBzdG9yZSBpbnRvIHRoZSBuZXh0IDE2IGJ5dGVzIG9mIG91dHB1dAorICAgIC8vIG5vIG5lZWQgdG8gc3RvcmUgciB0byBtZW1vcnkgdW50aWwgd2UgZXhpdAorICAgIF9fIGxlYShwcmV2X2Jsb2NrX2NpcGhlcl9wdHIsIEFkZHJlc3MoZnJvbSwgcG9zLCBBZGRyZXNzOjp0aW1lc18xLCAwKSk7ICAgICAvLyBzZXQgdXAgbmV3IHB0cgorICAgIF9fIGFkZHB0cihwb3MsIEFFU0Jsb2NrU2l6ZSk7CisgICAgX18gc3VicHRyKGxlbl9yZWcsIEFFU0Jsb2NrU2l6ZSk7CisgICAgX18gamNjKEFzc2VtYmxlcjo6bm90RXF1YWwsTF9zaW5nbGVCbG9ja19sb29wVG9wXzE5Mik7CisgICAgX18gam1wKExfZXhpdCk7CisKKyAgICBfXyBCSU5EKExfa2V5XzI1Nik7CisgICAgLy8gMjU2LWJpdCBjb2RlIGZvbGxvd3MgaGVyZSAoY291bGQgYmUgb3B0aW1pemVkIHRvIHVzZSBwYXJhbGxlbGlzbSkKKyAgICBfXyBtb3ZwdHIocG9zLCAwKTsKKyAgICBfXyBhbGlnbihPcHRvTG9vcEFsaWdubWVudCk7CisgICAgX18gQklORChMX3NpbmdsZUJsb2NrX2xvb3BUb3BfMjU2KTsKKyAgICBfXyBtb3ZkcXUoeG1tX3Jlc3VsdCwgQWRkcmVzcyhmcm9tLCBwb3MsIEFkZHJlc3M6OnRpbWVzXzEsIDApKTsgICAvLyBnZXQgbmV4dCAxNiBieXRlcyBvZiBjaXBoZXIgaW5wdXQKKyAgICBfXyBweG9yICAoeG1tX3Jlc3VsdCwgeG1tX2tleV9maXJzdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkbyB0aGUgYWVzIGRlYyByb3VuZHMKKyAgICBmb3IgKGludCBybnVtID0gWE1NX1JFR19OVU1fS0VZX0ZJUlNUICsgMTsgcm51bSA8PSBYTU1fUkVHX05VTV9LRVlfTEFTVDsgcm51bSsrKSB7CisgICAgICBfXyBhZXNkZWMoeG1tX3Jlc3VsdCwgYXNfWE1NUmVnaXN0ZXIocm51bSkpOworICAgIH0KKyAgICBmb3IgKGludCBrZXlfb2Zmc2V0ID0gRklSU1RfTk9OX1JFR19LRVlfb2Zmc2V0OyBrZXlfb2Zmc2V0IDw9IDB4ZTA7IGtleV9vZmZzZXQgKz0gMHgxMCkgeyAgIC8vIDI1Ni1iaXQgcnVucyB1cCB0byBrZXkgb2Zmc2V0IGUwCisgICAgICBhZXNfZGVjX2tleSh4bW1fcmVzdWx0LCB4bW1fdGVtcCwga2V5LCBrZXlfb2Zmc2V0KTsKKyAgICB9CisgICAgbG9hZF9rZXkoeG1tX3RlbXAsIGtleSwgMHgwMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbmFsIGtleSBpcyBzdG9yZWQgaW4gamF2YSBleHBhbmRlZCBhcnJheSBhdCBvZmZzZXQgMAorICAgIF9fIGFlc2RlY2xhc3QoeG1tX3Jlc3VsdCwgeG1tX3RlbXApOworICAgIF9fIG1vdmRxdSh4bW1fdGVtcCwgQWRkcmVzcyhwcmV2X2Jsb2NrX2NpcGhlcl9wdHIsIDB4MDApKTsKKyAgICBfXyBweG9yICAoeG1tX3Jlc3VsdCwgeG1tX3RlbXApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB4b3Igd2l0aCB0aGUgY3VycmVudCByIHZlY3RvcgorICAgIF9fIG1vdmRxdShBZGRyZXNzKHRvLCBwb3MsIEFkZHJlc3M6OnRpbWVzXzEsIDApLCB4bW1fcmVzdWx0KTsgICAgIC8vIHN0b3JlIGludG8gdGhlIG5leHQgMTYgYnl0ZXMgb2Ygb3V0cHV0CisgICAgLy8gbm8gbmVlZCB0byBzdG9yZSByIHRvIG1lbW9yeSB1bnRpbCB3ZSBleGl0CisgICAgX18gbGVhKHByZXZfYmxvY2tfY2lwaGVyX3B0ciwgQWRkcmVzcyhmcm9tLCBwb3MsIEFkZHJlc3M6OnRpbWVzXzEsIDApKTsgICAgIC8vIHNldCB1cCBuZXcgcHRyCisgICAgX18gYWRkcHRyKHBvcywgQUVTQmxvY2tTaXplKTsKKyAgICBfXyBzdWJwdHIobGVuX3JlZywgQUVTQmxvY2tTaXplKTsKKyAgICBfXyBqY2MoQXNzZW1ibGVyOjpub3RFcXVhbCxMX3NpbmdsZUJsb2NrX2xvb3BUb3BfMjU2KTsKKyAgICBfXyBqbXAoTF9leGl0KTsKKworICAgIHJldHVybiBzdGFydDsKKyAgfQorCisKICBwdWJsaWM6CiAgIC8vIEluZm9ybWF0aW9uIGFib3V0IGZyYW1lIGxheW91dCBhdCB0aW1lIG9mIGJsb2NraW5nIHJ1bnRpbWUgY2FsbC4KICAgLy8gTm90ZSB0aGF0IHdlIG9ubHkgaGF2ZSB0byBwcmVzZXJ2ZSBjYWxsZWUtc2F2ZWQgcmVnaXN0ZXJzIHNpbmNlCkBAIC0yMzMyLDYgKzI4NTUsMTYgQEAKICAgICBnZW5lcmF0ZV9hcnJheWNvcHlfc3R1YnMoKTsKIAogICAgIGdlbmVyYXRlX21hdGhfc3R1YnMoKTsKKworICAgIC8vIGRvbid0IGJvdGhlciBnZW5lcmF0aW5nIHRoZXNlIEFFUyBpbnRyaW5zaWMgc3R1YnMgdW5sZXNzIGdsb2JhbCBmbGFnIGlzIHNldAorICAgIGlmIChVc2VBRVNJbnRyaW5zaWNzKSB7CisgICAgICBTdHViUm91dGluZXM6Ong4Njo6X2tleV9zaHVmZmxlX21hc2tfYWRkciA9IGdlbmVyYXRlX2tleV9zaHVmZmxlX21hc2soKTsgIC8vIG1pZ2h0IGJlIG5lZWRlZCBieSB0aGUgb3RoZXJzCisKKyAgICAgIFN0dWJSb3V0aW5lczo6X2Flc2NyeXB0X2VuY3J5cHRCbG9jayA9IGdlbmVyYXRlX2Flc2NyeXB0X2VuY3J5cHRCbG9jaygpOworICAgICAgU3R1YlJvdXRpbmVzOjpfYWVzY3J5cHRfZGVjcnlwdEJsb2NrID0gZ2VuZXJhdGVfYWVzY3J5cHRfZGVjcnlwdEJsb2NrKCk7CisgICAgICBTdHViUm91dGluZXM6Ol9jaXBoZXJCbG9ja0NoYWluaW5nX2VuY3J5cHRBRVNDcnlwdCA9IGdlbmVyYXRlX2NpcGhlckJsb2NrQ2hhaW5pbmdfZW5jcnlwdEFFU0NyeXB0KCk7CisgICAgICBTdHViUm91dGluZXM6Ol9jaXBoZXJCbG9ja0NoYWluaW5nX2RlY3J5cHRBRVNDcnlwdCA9IGdlbmVyYXRlX2NpcGhlckJsb2NrQ2hhaW5pbmdfZGVjcnlwdEFFU0NyeXB0KCk7CisgICAgfQogICB9CiAKIApkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvY3B1L3g4Ni92bS9zdHViR2VuZXJhdG9yX3g4Nl82NC5jcHAgYi9ob3RzcG90L3NyYy9jcHUveDg2L3ZtL3N0dWJHZW5lcmF0b3JfeDg2XzY0LmNwcAppbmRleCA4YWU1OTVhLi4zZTIyMzM4IDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9jcHUveDg2L3ZtL3N0dWJHZW5lcmF0b3JfeDg2XzY0LmNwcAorKysgYi9ob3RzcG90L3NyYy9jcHUveDg2L3ZtL3N0dWJHZW5lcmF0b3JfeDg2XzY0LmNwcApAQCAtMjk0MSw2ICsyOTQxLDU0OCBAQAogICAgIH0KICAgfQogCisgIC8vIEFFUyBpbnRyaW5zaWMgc3R1YnMKKyAgZW51bSB7QUVTQmxvY2tTaXplID0gMTZ9OworCisgIGFkZHJlc3MgZ2VuZXJhdGVfa2V5X3NodWZmbGVfbWFzaygpIHsKKyAgICBfXyBhbGlnbigxNik7CisgICAgU3R1YkNvZGVNYXJrIG1hcmsodGhpcywgIlN0dWJSb3V0aW5lcyIsICJrZXlfc2h1ZmZsZV9tYXNrIik7CisgICAgYWRkcmVzcyBzdGFydCA9IF9fIHBjKCk7CisgICAgX18gZW1pdF9kYXRhNjQoIDB4MDQwNTA2MDcwMDAxMDIwMywgcmVsb2NJbmZvOjpub25lICk7CisgICAgX18gZW1pdF9kYXRhNjQoIDB4MGMwZDBlMGYwODA5MGEwYiwgcmVsb2NJbmZvOjpub25lICk7CisgICAgcmV0dXJuIHN0YXJ0OworICB9CisKKyAgLy8gVXRpbGl0eSByb3V0aW5lIGZvciBsb2FkaW5nIGEgMTI4LWJpdCBrZXkgd29yZCBpbiBsaXR0bGUgZW5kaWFuIGZvcm1hdAorICAvLyBjYW4gb3B0aW9uYWxseSBzcGVjaWZ5IHRoYXQgdGhlIHNodWZmbGUgbWFzayBpcyBhbHJlYWR5IGluIGFuIHhtbXJlZ2lzdGVyCisgIHZvaWQgbG9hZF9rZXkoWE1NUmVnaXN0ZXIgeG1tZHN0LCBSZWdpc3RlciBrZXksIGludCBvZmZzZXQsIFhNTVJlZ2lzdGVyIHhtbV9zaHVmX21hc2s9TlVMTCkgeworICAgIF9fIG1vdmRxdSh4bW1kc3QsIEFkZHJlc3Moa2V5LCBvZmZzZXQpKTsKKyAgICBpZiAoeG1tX3NodWZfbWFzayAhPSBOVUxMKSB7CisgICAgICBfXyBwc2h1ZmIoeG1tZHN0LCB4bW1fc2h1Zl9tYXNrKTsKKyAgICB9IGVsc2UgeworICAgICAgX18gcHNodWZiKHhtbWRzdCwgRXh0ZXJuYWxBZGRyZXNzKFN0dWJSb3V0aW5lczo6eDg2OjprZXlfc2h1ZmZsZV9tYXNrX2FkZHIoKSkpOworICAgIH0KKyAgfQorCisgIC8vIGFlc2VuYyB1c2luZyBzcGVjaWZpZWQga2V5K29mZnNldAorICAvLyBjYW4gb3B0aW9uYWxseSBzcGVjaWZ5IHRoYXQgdGhlIHNodWZmbGUgbWFzayBpcyBhbHJlYWR5IGluIGFuIHhtbXJlZ2lzdGVyCisgIHZvaWQgYWVzX2VuY19rZXkoWE1NUmVnaXN0ZXIgeG1tZHN0LCBYTU1SZWdpc3RlciB4bW10bXAsIFJlZ2lzdGVyIGtleSwgaW50IG9mZnNldCwgWE1NUmVnaXN0ZXIgeG1tX3NodWZfbWFzaz1OVUxMKSB7CisgICAgbG9hZF9rZXkoeG1tdG1wLCBrZXksIG9mZnNldCwgeG1tX3NodWZfbWFzayk7CisgICAgX18gYWVzZW5jKHhtbWRzdCwgeG1tdG1wKTsKKyAgfQorCisgIC8vIGFlc2RlYyB1c2luZyBzcGVjaWZpZWQga2V5K29mZnNldAorICAvLyBjYW4gb3B0aW9uYWxseSBzcGVjaWZ5IHRoYXQgdGhlIHNodWZmbGUgbWFzayBpcyBhbHJlYWR5IGluIGFuIHhtbXJlZ2lzdGVyCisgIHZvaWQgYWVzX2RlY19rZXkoWE1NUmVnaXN0ZXIgeG1tZHN0LCBYTU1SZWdpc3RlciB4bW10bXAsIFJlZ2lzdGVyIGtleSwgaW50IG9mZnNldCwgWE1NUmVnaXN0ZXIgeG1tX3NodWZfbWFzaz1OVUxMKSB7CisgICAgbG9hZF9rZXkoeG1tdG1wLCBrZXksIG9mZnNldCwgeG1tX3NodWZfbWFzayk7CisgICAgX18gYWVzZGVjKHhtbWRzdCwgeG1tdG1wKTsKKyAgfQorCisKKyAgLy8gQXJndW1lbnRzOgorICAvLworICAvLyBJbnB1dHM6CisgIC8vICAgY19yYXJnMCAgIC0gc291cmNlIGJ5dGUgYXJyYXkgYWRkcmVzcworICAvLyAgIGNfcmFyZzEgICAtIGRlc3RpbmF0aW9uIGJ5dGUgYXJyYXkgYWRkcmVzcworICAvLyAgIGNfcmFyZzIgICAtIEsgKGtleSkgaW4gbGl0dGxlIGVuZGlhbiBpbnQgYXJyYXkKKyAgLy8KKyAgYWRkcmVzcyBnZW5lcmF0ZV9hZXNjcnlwdF9lbmNyeXB0QmxvY2soKSB7CisgICAgYXNzZXJ0KFVzZUFFUyAmJiAoVXNlQVZYID4gMCksICJuZWVkIEFFUyBpbnN0cnVjdGlvbnMgYW5kIG1pc2FsaWduZWQgU1NFIHN1cHBvcnQiKTsKKyAgICBfXyBhbGlnbihDb2RlRW50cnlBbGlnbm1lbnQpOworICAgIFN0dWJDb2RlTWFyayBtYXJrKHRoaXMsICJTdHViUm91dGluZXMiLCAiYWVzY3J5cHRfZW5jcnlwdEJsb2NrIik7CisgICAgTGFiZWwgTF9kb0xhc3Q7CisgICAgYWRkcmVzcyBzdGFydCA9IF9fIHBjKCk7CisKKyAgICBjb25zdCBSZWdpc3RlciBmcm9tICAgICAgICA9IGNfcmFyZzA7ICAvLyBzb3VyY2UgYXJyYXkgYWRkcmVzcworICAgIGNvbnN0IFJlZ2lzdGVyIHRvICAgICAgICAgID0gY19yYXJnMTsgIC8vIGRlc3RpbmF0aW9uIGFycmF5IGFkZHJlc3MKKyAgICBjb25zdCBSZWdpc3RlciBrZXkgICAgICAgICA9IGNfcmFyZzI7ICAvLyBrZXkgYXJyYXkgYWRkcmVzcworICAgIGNvbnN0IFJlZ2lzdGVyIGtleWxlbiAgICAgID0gcmF4OworCisgICAgY29uc3QgWE1NUmVnaXN0ZXIgeG1tX3Jlc3VsdCA9IHhtbTA7CisgICAgY29uc3QgWE1NUmVnaXN0ZXIgeG1tX3RlbXAgICA9IHhtbTE7CisgICAgY29uc3QgWE1NUmVnaXN0ZXIgeG1tX2tleV9zaHVmX21hc2sgPSB4bW0yOworCisgICAgX18gZW50ZXIoKTsgLy8gcmVxdWlyZWQgZm9yIHByb3BlciBzdGFja3dhbGtpbmcgb2YgUnVudGltZVN0dWIgZnJhbWUKKworICAgIF9fIG1vdmwoa2V5bGVuLCBBZGRyZXNzKGtleSwgYXJyYXlPb3BEZXNjOjpsZW5ndGhfb2Zmc2V0X2luX2J5dGVzKCkgLSBhcnJheU9vcERlc2M6OmJhc2Vfb2Zmc2V0X2luX2J5dGVzKFRfSU5UKSkpOworICAgIC8vIGtleWxlbiA9ICMgb2YgMzItYml0IHdvcmRzLCBjb252ZXJ0IHRvIDEyOC1iaXQgd29yZHMKKyAgICBfXyBzaHJsKGtleWxlbiwgMik7CisgICAgX18gc3VibChrZXlsZW4sIDExKTsgICAvLyBldmVyeSBrZXkgaGFzIGF0IGxlYXN0IDExIDEyOC1iaXQgd29yZHMsIHNvbWUgaGF2ZSBtb3JlCisKKyAgICBfXyBtb3ZkcXUoeG1tX2tleV9zaHVmX21hc2ssIEV4dGVybmFsQWRkcmVzcyhTdHViUm91dGluZXM6Ong4Njo6a2V5X3NodWZmbGVfbWFza19hZGRyKCkpKTsKKyAgICBfXyBtb3ZkcXUoeG1tX3Jlc3VsdCwgQWRkcmVzcyhmcm9tLCAwKSk7ICAvLyBnZXQgMTYgYnl0ZXMgb2YgaW5wdXQKKworICAgIC8vIEZvciBlbmNyeXB0aW9uLCB0aGUgamF2YSBleHBhbmRlZCBrZXkgb3JkZXJpbmcgaXMganVzdCB3aGF0IHdlIG5lZWQKKyAgICAvLyB3ZSBkb24ndCBrbm93IGlmIHRoZSBrZXkgaXMgYWxpZ25lZCwgaGVuY2Ugbm90IHVzaW5nIGxvYWQtZXhlY3V0ZSBmb3JtCisKKyAgICBsb2FkX2tleSh4bW1fdGVtcCwga2V5LCAweDAwLCB4bW1fa2V5X3NodWZfbWFzayk7CisgICAgX18gcHhvcih4bW1fcmVzdWx0LCB4bW1fdGVtcCk7CisgICAgZm9yIChpbnQgb2Zmc2V0ID0gMHgxMDsgb2Zmc2V0IDw9IDB4OTA7IG9mZnNldCArPSAweDEwKSB7CisgICAgICBhZXNfZW5jX2tleSh4bW1fcmVzdWx0LCB4bW1fdGVtcCwga2V5LCBvZmZzZXQsIHhtbV9rZXlfc2h1Zl9tYXNrKTsKKyAgICB9CisgICAgbG9hZF9rZXkgICh4bW1fdGVtcCwga2V5LCAweGEwLCB4bW1fa2V5X3NodWZfbWFzayk7CisgICAgX18gY21wbChrZXlsZW4sIDApOworICAgIF9fIGpjYyhBc3NlbWJsZXI6OmVxdWFsLCBMX2RvTGFzdCk7CisgICAgX18gYWVzZW5jKHhtbV9yZXN1bHQsIHhtbV90ZW1wKTsgICAgICAgICAgICAgICAgICAgLy8gb25seSBpbiAxOTIgYW5kIDI1NiBiaXQga2V5cworICAgIGFlc19lbmNfa2V5KHhtbV9yZXN1bHQsIHhtbV90ZW1wLCBrZXksIDB4YjAsIHhtbV9rZXlfc2h1Zl9tYXNrKTsKKyAgICBsb2FkX2tleSh4bW1fdGVtcCwga2V5LCAweGMwLCB4bW1fa2V5X3NodWZfbWFzayk7CisgICAgX18gc3VibChrZXlsZW4sIDIpOworICAgIF9fIGpjYyhBc3NlbWJsZXI6OmVxdWFsLCBMX2RvTGFzdCk7CisgICAgX18gYWVzZW5jKHhtbV9yZXN1bHQsIHhtbV90ZW1wKTsgICAgICAgICAgICAgICAgICAgLy8gb25seSBpbiAyNTYgYml0IGtleXMKKyAgICBhZXNfZW5jX2tleSh4bW1fcmVzdWx0LCB4bW1fdGVtcCwga2V5LCAweGQwLCB4bW1fa2V5X3NodWZfbWFzayk7CisgICAgbG9hZF9rZXkoeG1tX3RlbXAsIGtleSwgMHhlMCwgeG1tX2tleV9zaHVmX21hc2spOworCisgICAgX18gQklORChMX2RvTGFzdCk7CisgICAgX18gYWVzZW5jbGFzdCh4bW1fcmVzdWx0LCB4bW1fdGVtcCk7CisgICAgX18gbW92ZHF1KEFkZHJlc3ModG8sIDApLCB4bW1fcmVzdWx0KTsgICAgICAgIC8vIHN0b3JlIHRoZSByZXN1bHQKKyAgICBfXyB4b3JwdHIocmF4LCByYXgpOyAvLyByZXR1cm4gMAorICAgIF9fIGxlYXZlKCk7IC8vIHJlcXVpcmVkIGZvciBwcm9wZXIgc3RhY2t3YWxraW5nIG9mIFJ1bnRpbWVTdHViIGZyYW1lCisgICAgX18gcmV0KDApOworCisgICAgcmV0dXJuIHN0YXJ0OworICB9CisKKworICAvLyBBcmd1bWVudHM6CisgIC8vCisgIC8vIElucHV0czoKKyAgLy8gICBjX3JhcmcwICAgLSBzb3VyY2UgYnl0ZSBhcnJheSBhZGRyZXNzCisgIC8vICAgY19yYXJnMSAgIC0gZGVzdGluYXRpb24gYnl0ZSBhcnJheSBhZGRyZXNzCisgIC8vICAgY19yYXJnMiAgIC0gSyAoa2V5KSBpbiBsaXR0bGUgZW5kaWFuIGludCBhcnJheQorICAvLworICBhZGRyZXNzIGdlbmVyYXRlX2Flc2NyeXB0X2RlY3J5cHRCbG9jaygpIHsKKyAgICBhc3NlcnQoVXNlQUVTICYmIChVc2VBVlggPiAwKSwgIm5lZWQgQUVTIGluc3RydWN0aW9ucyBhbmQgbWlzYWxpZ25lZCBTU0Ugc3VwcG9ydCIpOworICAgIF9fIGFsaWduKENvZGVFbnRyeUFsaWdubWVudCk7CisgICAgU3R1YkNvZGVNYXJrIG1hcmsodGhpcywgIlN0dWJSb3V0aW5lcyIsICJhZXNjcnlwdF9kZWNyeXB0QmxvY2siKTsKKyAgICBMYWJlbCBMX2RvTGFzdDsKKyAgICBhZGRyZXNzIHN0YXJ0ID0gX18gcGMoKTsKKworICAgIGNvbnN0IFJlZ2lzdGVyIGZyb20gICAgICAgID0gY19yYXJnMDsgIC8vIHNvdXJjZSBhcnJheSBhZGRyZXNzCisgICAgY29uc3QgUmVnaXN0ZXIgdG8gICAgICAgICAgPSBjX3JhcmcxOyAgLy8gZGVzdGluYXRpb24gYXJyYXkgYWRkcmVzcworICAgIGNvbnN0IFJlZ2lzdGVyIGtleSAgICAgICAgID0gY19yYXJnMjsgIC8vIGtleSBhcnJheSBhZGRyZXNzCisgICAgY29uc3QgUmVnaXN0ZXIga2V5bGVuICAgICAgPSByYXg7CisKKyAgICBjb25zdCBYTU1SZWdpc3RlciB4bW1fcmVzdWx0ID0geG1tMDsKKyAgICBjb25zdCBYTU1SZWdpc3RlciB4bW1fdGVtcCAgID0geG1tMTsKKyAgICBjb25zdCBYTU1SZWdpc3RlciB4bW1fa2V5X3NodWZfbWFzayA9IHhtbTI7CisKKyAgICBfXyBlbnRlcigpOyAvLyByZXF1aXJlZCBmb3IgcHJvcGVyIHN0YWNrd2Fsa2luZyBvZiBSdW50aW1lU3R1YiBmcmFtZQorCisgICAgX18gbW92bChrZXlsZW4sIEFkZHJlc3Moa2V5LCBhcnJheU9vcERlc2M6Omxlbmd0aF9vZmZzZXRfaW5fYnl0ZXMoKSAtIGFycmF5T29wRGVzYzo6YmFzZV9vZmZzZXRfaW5fYnl0ZXMoVF9JTlQpKSk7CisgICAgLy8ga2V5bGVuID0gIyBvZiAzMi1iaXQgd29yZHMsIGNvbnZlcnQgdG8gMTI4LWJpdCB3b3JkcworICAgIF9fIHNocmwoa2V5bGVuLCAyKTsKKyAgICBfXyBzdWJsKGtleWxlbiwgMTEpOyAgIC8vIGV2ZXJ5IGtleSBoYXMgYXQgbGVhc3QgMTEgMTI4LWJpdCB3b3Jkcywgc29tZSBoYXZlIG1vcmUKKworICAgIF9fIG1vdmRxdSh4bW1fa2V5X3NodWZfbWFzaywgRXh0ZXJuYWxBZGRyZXNzKFN0dWJSb3V0aW5lczo6eDg2OjprZXlfc2h1ZmZsZV9tYXNrX2FkZHIoKSkpOworICAgIF9fIG1vdmRxdSh4bW1fcmVzdWx0LCBBZGRyZXNzKGZyb20sIDApKTsKKworICAgIC8vIGZvciBkZWNyeXB0aW9uIGphdmEgZXhwYW5kZWQga2V5IG9yZGVyaW5nIGlzIHJvdGF0ZWQgb25lIHBvc2l0aW9uIGZyb20gd2hhdCB3ZSB3YW50CisgICAgLy8gc28gd2Ugc3RhcnQgZnJvbSAweDEwIGhlcmUgYW5kIGhpdCAweDAwIGxhc3QKKyAgICAvLyB3ZSBkb24ndCBrbm93IGlmIHRoZSBrZXkgaXMgYWxpZ25lZCwgaGVuY2Ugbm90IHVzaW5nIGxvYWQtZXhlY3V0ZSBmb3JtCisgICAgbG9hZF9rZXkoeG1tX3RlbXAsIGtleSwgMHgxMCwgeG1tX2tleV9zaHVmX21hc2spOworICAgIF9fIHB4b3IgICh4bW1fcmVzdWx0LCB4bW1fdGVtcCk7CisgICAgZm9yIChpbnQgb2Zmc2V0ID0gMHgyMDsgb2Zmc2V0IDw9IDB4YTA7IG9mZnNldCArPSAweDEwKSB7CisgICAgICBhZXNfZGVjX2tleSh4bW1fcmVzdWx0LCB4bW1fdGVtcCwga2V5LCBvZmZzZXQsIHhtbV9rZXlfc2h1Zl9tYXNrKTsKKyAgICB9CisgICAgX18gY21wbChrZXlsZW4sIDApOworICAgIF9fIGpjYyhBc3NlbWJsZXI6OmVxdWFsLCBMX2RvTGFzdCk7CisgICAgLy8gb25seSBpbiAxOTIgYW5kIDI1NiBiaXQga2V5cworICAgIGFlc19kZWNfa2V5KHhtbV9yZXN1bHQsIHhtbV90ZW1wLCBrZXksIDB4YjAsIHhtbV9rZXlfc2h1Zl9tYXNrKTsKKyAgICBhZXNfZGVjX2tleSh4bW1fcmVzdWx0LCB4bW1fdGVtcCwga2V5LCAweGMwLCB4bW1fa2V5X3NodWZfbWFzayk7CisgICAgX18gc3VibChrZXlsZW4sIDIpOworICAgIF9fIGpjYyhBc3NlbWJsZXI6OmVxdWFsLCBMX2RvTGFzdCk7CisgICAgLy8gb25seSBpbiAyNTYgYml0IGtleXMKKyAgICBhZXNfZGVjX2tleSh4bW1fcmVzdWx0LCB4bW1fdGVtcCwga2V5LCAweGQwLCB4bW1fa2V5X3NodWZfbWFzayk7CisgICAgYWVzX2RlY19rZXkoeG1tX3Jlc3VsdCwgeG1tX3RlbXAsIGtleSwgMHhlMCwgeG1tX2tleV9zaHVmX21hc2spOworCisgICAgX18gQklORChMX2RvTGFzdCk7CisgICAgLy8gZm9yIGRlY3J5cHRpb24gdGhlIGFlc2RlY2xhc3Qgb3BlcmF0aW9uIGlzIGFsd2F5cyBvbiBrZXkrMHgwMAorICAgIGxvYWRfa2V5KHhtbV90ZW1wLCBrZXksIDB4MDAsIHhtbV9rZXlfc2h1Zl9tYXNrKTsKKyAgICBfXyBhZXNkZWNsYXN0KHhtbV9yZXN1bHQsIHhtbV90ZW1wKTsKKworICAgIF9fIG1vdmRxdShBZGRyZXNzKHRvLCAwKSwgeG1tX3Jlc3VsdCk7ICAvLyBzdG9yZSB0aGUgcmVzdWx0CisKKyAgICBfXyB4b3JwdHIocmF4LCByYXgpOyAvLyByZXR1cm4gMAorICAgIF9fIGxlYXZlKCk7IC8vIHJlcXVpcmVkIGZvciBwcm9wZXIgc3RhY2t3YWxraW5nIG9mIFJ1bnRpbWVTdHViIGZyYW1lCisgICAgX18gcmV0KDApOworCisgICAgcmV0dXJuIHN0YXJ0OworICB9CisKKworICAvLyBBcmd1bWVudHM6CisgIC8vCisgIC8vIElucHV0czoKKyAgLy8gICBjX3JhcmcwICAgLSBzb3VyY2UgYnl0ZSBhcnJheSBhZGRyZXNzCisgIC8vICAgY19yYXJnMSAgIC0gZGVzdGluYXRpb24gYnl0ZSBhcnJheSBhZGRyZXNzCisgIC8vICAgY19yYXJnMiAgIC0gSyAoa2V5KSBpbiBsaXR0bGUgZW5kaWFuIGludCBhcnJheQorICAvLyAgIGNfcmFyZzMgICAtIHIgdmVjdG9yIGJ5dGUgYXJyYXkgYWRkcmVzcworICAvLyAgIGNfcmFyZzQgICAtIGlucHV0IGxlbmd0aAorICAvLworICBhZGRyZXNzIGdlbmVyYXRlX2NpcGhlckJsb2NrQ2hhaW5pbmdfZW5jcnlwdEFFU0NyeXB0KCkgeworICAgIGFzc2VydChVc2VBRVMgJiYgKFVzZUFWWCA+IDApLCAibmVlZCBBRVMgaW5zdHJ1Y3Rpb25zIGFuZCBtaXNhbGlnbmVkIFNTRSBzdXBwb3J0Iik7CisgICAgX18gYWxpZ24oQ29kZUVudHJ5QWxpZ25tZW50KTsKKyAgICBTdHViQ29kZU1hcmsgbWFyayh0aGlzLCAiU3R1YlJvdXRpbmVzIiwgImNpcGhlckJsb2NrQ2hhaW5pbmdfZW5jcnlwdEFFU0NyeXB0Iik7CisgICAgYWRkcmVzcyBzdGFydCA9IF9fIHBjKCk7CisKKyAgICBMYWJlbCBMX2V4aXQsIExfa2V5XzE5Ml8yNTYsIExfa2V5XzI1NiwgTF9sb29wVG9wXzEyOCwgTF9sb29wVG9wXzE5MiwgTF9sb29wVG9wXzI1NjsKKyAgICBjb25zdCBSZWdpc3RlciBmcm9tICAgICAgICA9IGNfcmFyZzA7ICAvLyBzb3VyY2UgYXJyYXkgYWRkcmVzcworICAgIGNvbnN0IFJlZ2lzdGVyIHRvICAgICAgICAgID0gY19yYXJnMTsgIC8vIGRlc3RpbmF0aW9uIGFycmF5IGFkZHJlc3MKKyAgICBjb25zdCBSZWdpc3RlciBrZXkgICAgICAgICA9IGNfcmFyZzI7ICAvLyBrZXkgYXJyYXkgYWRkcmVzcworICAgIGNvbnN0IFJlZ2lzdGVyIHJ2ZWMgICAgICAgID0gY19yYXJnMzsgIC8vIHIgYnl0ZSBhcnJheSBpbml0aWFsaXplZCBmcm9tIGluaXR2ZWN0b3IgYXJyYXkgYWRkcmVzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBsZWZ0IHdpdGggdGhlIHJlc3VsdHMgb2YgdGhlIGxhc3QgZW5jcnlwdGlvbiBibG9jaworI2lmbmRlZiBfV0lONjQKKyAgICBjb25zdCBSZWdpc3RlciBsZW5fcmVnICAgICA9IGNfcmFyZzQ7ICAvLyBzcmMgbGVuIChtdXN0IGJlIG11bHRpcGxlIG9mIGJsb2Nrc2l6ZSAxNikKKyNlbHNlCisgICAgY29uc3QgQWRkcmVzcyAgbGVuX21lbShyc3AsIDYgKiB3b3JkU2l6ZSk7ICAvLyBsZW5ndGggaXMgb24gc3RhY2sgb24gV2luNjQKKyAgICBjb25zdCBSZWdpc3RlciBsZW5fcmVnICAgICA9IHIxMDsgICAgICAvLyBwaWNrIHRoZSBmaXJzdCB2b2xhdGlsZSB3aW5kb3dzIHJlZ2lzdGVyCisjZW5kaWYKKyAgICBjb25zdCBSZWdpc3RlciBwb3MgICAgICAgICA9IHJheDsKKworICAgIC8vIHhtbSByZWdpc3RlciBhc3NpZ25tZW50cyBmb3IgdGhlIGxvb3BzIGJlbG93CisgICAgY29uc3QgWE1NUmVnaXN0ZXIgeG1tX3Jlc3VsdCA9IHhtbTA7CisgICAgY29uc3QgWE1NUmVnaXN0ZXIgeG1tX3RlbXAgICA9IHhtbTE7CisgICAgLy8ga2V5cyAwLTEwIHByZWxvYWRlZCBpbnRvIHhtbTIteG1tMTIKKyAgICBjb25zdCBpbnQgWE1NX1JFR19OVU1fS0VZX0ZJUlNUID0gMjsKKyAgICBjb25zdCBpbnQgWE1NX1JFR19OVU1fS0VZX0xBU1QgID0gMTI7CisgICAgY29uc3QgWE1NUmVnaXN0ZXIgeG1tX2tleTAgICA9IGFzX1hNTVJlZ2lzdGVyKFhNTV9SRUdfTlVNX0tFWV9GSVJTVCk7CisgICAgY29uc3QgWE1NUmVnaXN0ZXIgeG1tX2tleTEwICA9IGFzX1hNTVJlZ2lzdGVyKFhNTV9SRUdfTlVNX0tFWV9MQVNUKTsKKworICAgIF9fIGVudGVyKCk7IC8vIHJlcXVpcmVkIGZvciBwcm9wZXIgc3RhY2t3YWxraW5nIG9mIFJ1bnRpbWVTdHViIGZyYW1lCisKKyNpZmRlZiBfV0lONjQKKyAgICAvLyBvbiB3aW42NCwgZmlsbCBsZW5fcmVnIGZyb20gc3RhY2sgcG9zaXRpb24KKyAgICBfXyBtb3ZsKGxlbl9yZWcsIGxlbl9tZW0pOworICAgIC8vIHNhdmUgdGhlIHhtbSByZWdpc3RlcnMgd2hpY2ggbXVzdCBiZSBwcmVzZXJ2ZWQgNi0xMgorICAgIF9fIHN1YnB0cihyc3AsIC1yc3BfYWZ0ZXJfY2FsbF9vZmYgKiB3b3JkU2l6ZSk7CisgICAgZm9yIChpbnQgaSA9IDY7IGkgPD0gWE1NX1JFR19OVU1fS0VZX0xBU1Q7IGkrKykgeworICAgICAgX18gbW92ZHF1KHhtbV9zYXZlKGkpLCBhc19YTU1SZWdpc3RlcihpKSk7CisgICAgfQorI2VuZGlmCisKKyAgICBjb25zdCBYTU1SZWdpc3RlciB4bW1fa2V5X3NodWZfbWFzayA9IHhtbV90ZW1wOyAgLy8gdXNlZCB0ZW1wb3JhcmlseSB0byBzd2FwIGtleSBieXRlcyB1cCBmcm9udAorICAgIF9fIG1vdmRxdSh4bW1fa2V5X3NodWZfbWFzaywgRXh0ZXJuYWxBZGRyZXNzKFN0dWJSb3V0aW5lczo6eDg2OjprZXlfc2h1ZmZsZV9tYXNrX2FkZHIoKSkpOworICAgIC8vIGxvYWQgdXAgeG1tIHJlZ3MgMiB0aHJ1IDEyIHdpdGgga2V5IDB4MDAgLSAweGEwCisgICAgZm9yIChpbnQgcm51bSA9IFhNTV9SRUdfTlVNX0tFWV9GSVJTVCwgb2Zmc2V0ID0gMHgwMDsgcm51bSA8PSBYTU1fUkVHX05VTV9LRVlfTEFTVDsgcm51bSsrKSB7CisgICAgICBsb2FkX2tleShhc19YTU1SZWdpc3RlcihybnVtKSwga2V5LCBvZmZzZXQsIHhtbV9rZXlfc2h1Zl9tYXNrKTsKKyAgICAgIG9mZnNldCArPSAweDEwOworICAgIH0KKworICAgIF9fIG1vdmRxdSh4bW1fcmVzdWx0LCBBZGRyZXNzKHJ2ZWMsIDB4MDApKTsgICAvLyBpbml0aWFsaXplIHhtbV9yZXN1bHQgd2l0aCByIHZlYworCisgICAgLy8gbm93IHNwbGl0IHRvIGRpZmZlcmVudCBwYXRocyBkZXBlbmRpbmcgb24gdGhlIGtleWxlbiAobGVuIGluIGludHMgb2YgQUVTQ3J5cHQuS0xFIGFycmF5ICg1Mj0xOTIsIG9yIDYwPTI1NikpCisgICAgX18gbW92bChyYXgsIEFkZHJlc3Moa2V5LCBhcnJheU9vcERlc2M6Omxlbmd0aF9vZmZzZXRfaW5fYnl0ZXMoKSAtIGFycmF5T29wRGVzYzo6YmFzZV9vZmZzZXRfaW5fYnl0ZXMoVF9JTlQpKSk7CisgICAgX18gY21wbChyYXgsIDQ0KTsKKyAgICBfXyBqY2MoQXNzZW1ibGVyOjpub3RFcXVhbCwgTF9rZXlfMTkyXzI1Nik7CisKKyAgICAvLyAxMjggYml0IGNvZGUgZm9sbG93cyBoZXJlCisgICAgX18gbW92cHRyKHBvcywgMCk7CisgICAgX18gYWxpZ24oT3B0b0xvb3BBbGlnbm1lbnQpOworICAgIF9fIEJJTkQoTF9sb29wVG9wXzEyOCk7CisgICAgX18gbW92ZHF1KHhtbV90ZW1wLCBBZGRyZXNzKGZyb20sIHBvcywgQWRkcmVzczo6dGltZXNfMSwgMCkpOyAgIC8vIGdldCBuZXh0IDE2IGJ5dGVzIG9mIGlucHV0CisgICAgX18gcHhvciAgKHhtbV9yZXN1bHQsIHhtbV90ZW1wKTsgICAgICAgICAgICAgICAvLyB4b3Igd2l0aCB0aGUgY3VycmVudCByIHZlY3RvcgorCisgICAgX18gcHhvciAgKHhtbV9yZXN1bHQsIHhtbV9rZXkwKTsgICAgICAgICAgICAgICAvLyBkbyB0aGUgYWVzIHJvdW5kcworICAgIGZvciAoaW50IHJudW0gPSBYTU1fUkVHX05VTV9LRVlfRklSU1QgKyAxOyBybnVtIDw9IFhNTV9SRUdfTlVNX0tFWV9MQVNUIC0gMTsgcm51bSsrKSB7CisgICAgICBfXyBhZXNlbmMoeG1tX3Jlc3VsdCwgYXNfWE1NUmVnaXN0ZXIocm51bSkpOworICAgIH0KKyAgICBfXyBhZXNlbmNsYXN0KHhtbV9yZXN1bHQsIHhtbV9rZXkxMCk7CisKKyAgICBfXyBtb3ZkcXUoQWRkcmVzcyh0bywgcG9zLCBBZGRyZXNzOjp0aW1lc18xLCAwKSwgeG1tX3Jlc3VsdCk7ICAgICAvLyBzdG9yZSBpbnRvIHRoZSBuZXh0IDE2IGJ5dGVzIG9mIG91dHB1dAorICAgIC8vIG5vIG5lZWQgdG8gc3RvcmUgciB0byBtZW1vcnkgdW50aWwgd2UgZXhpdAorICAgIF9fIGFkZHB0cihwb3MsIEFFU0Jsb2NrU2l6ZSk7CisgICAgX18gc3VicHRyKGxlbl9yZWcsIEFFU0Jsb2NrU2l6ZSk7CisgICAgX18gamNjKEFzc2VtYmxlcjo6bm90RXF1YWwsIExfbG9vcFRvcF8xMjgpOworCisgICAgX18gQklORChMX2V4aXQpOworICAgIF9fIG1vdmRxdShBZGRyZXNzKHJ2ZWMsIDApLCB4bW1fcmVzdWx0KTsgICAgIC8vIGZpbmFsIHZhbHVlIG9mIHIgc3RvcmVkIGluIHJ2ZWMgb2YgQ2lwaGVyQmxvY2tDaGFpbmluZyBvYmplY3QKKworI2lmZGVmIF9XSU42NAorICAgIC8vIHJlc3RvcmUgeG1tIHJlZ3MgYmVsb25naW5nIHRvIGNhbGxpbmcgZnVuY3Rpb24KKyAgICBmb3IgKGludCBpID0gNjsgaSA8PSBYTU1fUkVHX05VTV9LRVlfTEFTVDsgaSsrKSB7CisgICAgICBfXyBtb3ZkcXUoYXNfWE1NUmVnaXN0ZXIoaSksIHhtbV9zYXZlKGkpKTsKKyAgICB9CisjZW5kaWYKKyAgICBfXyBtb3ZsKHJheCwgMCk7IC8vIHJldHVybiAwICh3aHk/KQorICAgIF9fIGxlYXZlKCk7IC8vIHJlcXVpcmVkIGZvciBwcm9wZXIgc3RhY2t3YWxraW5nIG9mIFJ1bnRpbWVTdHViIGZyYW1lCisgICAgX18gcmV0KDApOworCisgICAgX18gQklORChMX2tleV8xOTJfMjU2KTsKKyAgICAvLyBoZXJlIHJheCA9IGxlbiBpbiBpbnRzIG9mIEFFU0NyeXB0LktMRSBhcnJheSAoNTI9MTkyLCBvciA2MD0yNTYpCisgICAgX18gY21wbChyYXgsIDUyKTsKKyAgICBfXyBqY2MoQXNzZW1ibGVyOjpub3RFcXVhbCwgTF9rZXlfMjU2KTsKKworICAgIC8vIDE5Mi1iaXQgY29kZSBmb2xsb3dzIGhlcmUgKGNvdWxkIGJlIGNoYW5nZWQgdG8gdXNlIG1vcmUgeG1tIHJlZ2lzdGVycykKKyAgICBfXyBtb3ZwdHIocG9zLCAwKTsKKyAgICBfXyBhbGlnbihPcHRvTG9vcEFsaWdubWVudCk7CisgICAgX18gQklORChMX2xvb3BUb3BfMTkyKTsKKyAgICBfXyBtb3ZkcXUoeG1tX3RlbXAsIEFkZHJlc3MoZnJvbSwgcG9zLCBBZGRyZXNzOjp0aW1lc18xLCAwKSk7ICAgLy8gZ2V0IG5leHQgMTYgYnl0ZXMgb2YgaW5wdXQKKyAgICBfXyBweG9yICAoeG1tX3Jlc3VsdCwgeG1tX3RlbXApOyAgICAgICAgICAgICAgIC8vIHhvciB3aXRoIHRoZSBjdXJyZW50IHIgdmVjdG9yCisKKyAgICBfXyBweG9yICAoeG1tX3Jlc3VsdCwgeG1tX2tleTApOyAgICAgICAgICAgICAgIC8vIGRvIHRoZSBhZXMgcm91bmRzCisgICAgZm9yIChpbnQgcm51bSA9IFhNTV9SRUdfTlVNX0tFWV9GSVJTVCArIDE7IHJudW0gIDw9IFhNTV9SRUdfTlVNX0tFWV9MQVNUOyBybnVtKyspIHsKKyAgICAgIF9fIGFlc2VuYyh4bW1fcmVzdWx0LCBhc19YTU1SZWdpc3RlcihybnVtKSk7CisgICAgfQorICAgIGFlc19lbmNfa2V5KHhtbV9yZXN1bHQsIHhtbV90ZW1wLCBrZXksIDB4YjApOworICAgIGxvYWRfa2V5KHhtbV90ZW1wLCBrZXksIDB4YzApOworICAgIF9fIGFlc2VuY2xhc3QoeG1tX3Jlc3VsdCwgeG1tX3RlbXApOworCisgICAgX18gbW92ZHF1KEFkZHJlc3ModG8sIHBvcywgQWRkcmVzczo6dGltZXNfMSwgMCksIHhtbV9yZXN1bHQpOyAgICAgLy8gc3RvcmUgaW50byB0aGUgbmV4dCAxNiBieXRlcyBvZiBvdXRwdXQKKyAgICAvLyBubyBuZWVkIHRvIHN0b3JlIHIgdG8gbWVtb3J5IHVudGlsIHdlIGV4aXQKKyAgICBfXyBhZGRwdHIocG9zLCBBRVNCbG9ja1NpemUpOworICAgIF9fIHN1YnB0cihsZW5fcmVnLCBBRVNCbG9ja1NpemUpOworICAgIF9fIGpjYyhBc3NlbWJsZXI6Om5vdEVxdWFsLCBMX2xvb3BUb3BfMTkyKTsKKyAgICBfXyBqbXAoTF9leGl0KTsKKworICAgIF9fIEJJTkQoTF9rZXlfMjU2KTsKKyAgICAvLyAyNTYtYml0IGNvZGUgZm9sbG93cyBoZXJlIChjb3VsZCBiZSBjaGFuZ2VkIHRvIHVzZSBtb3JlIHhtbSByZWdpc3RlcnMpCisgICAgX18gbW92cHRyKHBvcywgMCk7CisgICAgX18gYWxpZ24oT3B0b0xvb3BBbGlnbm1lbnQpOworICAgIF9fIEJJTkQoTF9sb29wVG9wXzI1Nik7CisgICAgX18gbW92ZHF1KHhtbV90ZW1wLCBBZGRyZXNzKGZyb20sIHBvcywgQWRkcmVzczo6dGltZXNfMSwgMCkpOyAgIC8vIGdldCBuZXh0IDE2IGJ5dGVzIG9mIGlucHV0CisgICAgX18gcHhvciAgKHhtbV9yZXN1bHQsIHhtbV90ZW1wKTsgICAgICAgICAgICAgICAvLyB4b3Igd2l0aCB0aGUgY3VycmVudCByIHZlY3RvcgorCisgICAgX18gcHhvciAgKHhtbV9yZXN1bHQsIHhtbV9rZXkwKTsgICAgICAgICAgICAgICAvLyBkbyB0aGUgYWVzIHJvdW5kcworICAgIGZvciAoaW50IHJudW0gPSBYTU1fUkVHX05VTV9LRVlfRklSU1QgKyAxOyBybnVtICA8PSBYTU1fUkVHX05VTV9LRVlfTEFTVDsgcm51bSsrKSB7CisgICAgICBfXyBhZXNlbmMoeG1tX3Jlc3VsdCwgYXNfWE1NUmVnaXN0ZXIocm51bSkpOworICAgIH0KKyAgICBhZXNfZW5jX2tleSh4bW1fcmVzdWx0LCB4bW1fdGVtcCwga2V5LCAweGIwKTsKKyAgICBhZXNfZW5jX2tleSh4bW1fcmVzdWx0LCB4bW1fdGVtcCwga2V5LCAweGMwKTsKKyAgICBhZXNfZW5jX2tleSh4bW1fcmVzdWx0LCB4bW1fdGVtcCwga2V5LCAweGQwKTsKKyAgICBsb2FkX2tleSh4bW1fdGVtcCwga2V5LCAweGUwKTsKKyAgICBfXyBhZXNlbmNsYXN0KHhtbV9yZXN1bHQsIHhtbV90ZW1wKTsKKworICAgIF9fIG1vdmRxdShBZGRyZXNzKHRvLCBwb3MsIEFkZHJlc3M6OnRpbWVzXzEsIDApLCB4bW1fcmVzdWx0KTsgICAgIC8vIHN0b3JlIGludG8gdGhlIG5leHQgMTYgYnl0ZXMgb2Ygb3V0cHV0CisgICAgLy8gbm8gbmVlZCB0byBzdG9yZSByIHRvIG1lbW9yeSB1bnRpbCB3ZSBleGl0CisgICAgX18gYWRkcHRyKHBvcywgQUVTQmxvY2tTaXplKTsKKyAgICBfXyBzdWJwdHIobGVuX3JlZywgQUVTQmxvY2tTaXplKTsKKyAgICBfXyBqY2MoQXNzZW1ibGVyOjpub3RFcXVhbCwgTF9sb29wVG9wXzI1Nik7CisgICAgX18gam1wKExfZXhpdCk7CisKKyAgICByZXR1cm4gc3RhcnQ7CisgIH0KKworCisKKyAgLy8gVGhpcyBpcyBhIHZlcnNpb24gb2YgQ0JDL0FFUyBEZWNyeXB0IHdoaWNoIGRvZXMgNCBibG9ja3MgaW4gYSBsb29wIGF0IGEgdGltZQorICAvLyB0byBoaWRlIGluc3RydWN0aW9uIGxhdGVuY3kKKyAgLy8KKyAgLy8gQXJndW1lbnRzOgorICAvLworICAvLyBJbnB1dHM6CisgIC8vICAgY19yYXJnMCAgIC0gc291cmNlIGJ5dGUgYXJyYXkgYWRkcmVzcworICAvLyAgIGNfcmFyZzEgICAtIGRlc3RpbmF0aW9uIGJ5dGUgYXJyYXkgYWRkcmVzcworICAvLyAgIGNfcmFyZzIgICAtIEsgKGtleSkgaW4gbGl0dGxlIGVuZGlhbiBpbnQgYXJyYXkKKyAgLy8gICBjX3JhcmczICAgLSByIHZlY3RvciBieXRlIGFycmF5IGFkZHJlc3MKKyAgLy8gICBjX3Jhcmc0ICAgLSBpbnB1dCBsZW5ndGgKKyAgLy8KKworICBhZGRyZXNzIGdlbmVyYXRlX2NpcGhlckJsb2NrQ2hhaW5pbmdfZGVjcnlwdEFFU0NyeXB0X1BhcmFsbGVsKCkgeworICAgIGFzc2VydChVc2VBRVMgJiYgKFVzZUFWWCA+IDApLCAibmVlZCBBRVMgaW5zdHJ1Y3Rpb25zIGFuZCBtaXNhbGlnbmVkIFNTRSBzdXBwb3J0Iik7CisgICAgX18gYWxpZ24oQ29kZUVudHJ5QWxpZ25tZW50KTsKKyAgICBTdHViQ29kZU1hcmsgbWFyayh0aGlzLCAiU3R1YlJvdXRpbmVzIiwgImNpcGhlckJsb2NrQ2hhaW5pbmdfZGVjcnlwdEFFU0NyeXB0Iik7CisgICAgYWRkcmVzcyBzdGFydCA9IF9fIHBjKCk7CisKKyAgICBMYWJlbCBMX2V4aXQsIExfa2V5XzE5Ml8yNTYsIExfa2V5XzI1NjsKKyAgICBMYWJlbCBMX3NpbmdsZUJsb2NrX2xvb3BUb3BfMTI4LCBMX211bHRpQmxvY2tfbG9vcFRvcF8xMjg7CisgICAgTGFiZWwgTF9zaW5nbGVCbG9ja19sb29wVG9wXzE5MiwgTF9zaW5nbGVCbG9ja19sb29wVG9wXzI1NjsKKyAgICBjb25zdCBSZWdpc3RlciBmcm9tICAgICAgICA9IGNfcmFyZzA7ICAvLyBzb3VyY2UgYXJyYXkgYWRkcmVzcworICAgIGNvbnN0IFJlZ2lzdGVyIHRvICAgICAgICAgID0gY19yYXJnMTsgIC8vIGRlc3RpbmF0aW9uIGFycmF5IGFkZHJlc3MKKyAgICBjb25zdCBSZWdpc3RlciBrZXkgICAgICAgICA9IGNfcmFyZzI7ICAvLyBrZXkgYXJyYXkgYWRkcmVzcworICAgIGNvbnN0IFJlZ2lzdGVyIHJ2ZWMgICAgICAgID0gY19yYXJnMzsgIC8vIHIgYnl0ZSBhcnJheSBpbml0aWFsaXplZCBmcm9tIGluaXR2ZWN0b3IgYXJyYXkgYWRkcmVzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBsZWZ0IHdpdGggdGhlIHJlc3VsdHMgb2YgdGhlIGxhc3QgZW5jcnlwdGlvbiBibG9jaworI2lmbmRlZiBfV0lONjQKKyAgICBjb25zdCBSZWdpc3RlciBsZW5fcmVnICAgICA9IGNfcmFyZzQ7ICAvLyBzcmMgbGVuIChtdXN0IGJlIG11bHRpcGxlIG9mIGJsb2Nrc2l6ZSAxNikKKyNlbHNlCisgICAgY29uc3QgQWRkcmVzcyAgbGVuX21lbShyc3AsIDYgKiB3b3JkU2l6ZSk7ICAvLyBsZW5ndGggaXMgb24gc3RhY2sgb24gV2luNjQKKyAgICBjb25zdCBSZWdpc3RlciBsZW5fcmVnICAgICA9IHIxMDsgICAgICAvLyBwaWNrIHRoZSBmaXJzdCB2b2xhdGlsZSB3aW5kb3dzIHJlZ2lzdGVyCisjZW5kaWYKKyAgICBjb25zdCBSZWdpc3RlciBwb3MgICAgICAgICA9IHJheDsKKworICAgIC8vIHhtbSByZWdpc3RlciBhc3NpZ25tZW50cyBmb3IgdGhlIGxvb3BzIGJlbG93CisgICAgY29uc3QgWE1NUmVnaXN0ZXIgeG1tX3Jlc3VsdCA9IHhtbTA7CisgICAgLy8ga2V5cyAwLTEwIHByZWxvYWRlZCBpbnRvIHhtbTIteG1tMTIKKyAgICBjb25zdCBpbnQgWE1NX1JFR19OVU1fS0VZX0ZJUlNUID0gNTsKKyAgICBjb25zdCBpbnQgWE1NX1JFR19OVU1fS0VZX0xBU1QgID0gMTU7CisgICAgY29uc3QgWE1NUmVnaXN0ZXIgeG1tX2tleV9maXJzdCAgID0gYXNfWE1NUmVnaXN0ZXIoWE1NX1JFR19OVU1fS0VZX0ZJUlNUKTsKKyAgICBjb25zdCBYTU1SZWdpc3RlciB4bW1fa2V5X2xhc3QgID0gYXNfWE1NUmVnaXN0ZXIoWE1NX1JFR19OVU1fS0VZX0xBU1QpOworCisgICAgX18gZW50ZXIoKTsgLy8gcmVxdWlyZWQgZm9yIHByb3BlciBzdGFja3dhbGtpbmcgb2YgUnVudGltZVN0dWIgZnJhbWUKKworI2lmZGVmIF9XSU42NAorICAgIC8vIG9uIHdpbjY0LCBmaWxsIGxlbl9yZWcgZnJvbSBzdGFjayBwb3NpdGlvbgorICAgIF9fIG1vdmwobGVuX3JlZywgbGVuX21lbSk7CisgICAgLy8gc2F2ZSB0aGUgeG1tIHJlZ2lzdGVycyB3aGljaCBtdXN0IGJlIHByZXNlcnZlZCA2LTE1CisgICAgX18gc3VicHRyKHJzcCwgLXJzcF9hZnRlcl9jYWxsX29mZiAqIHdvcmRTaXplKTsKKyAgICBmb3IgKGludCBpID0gNjsgaSA8PSBYTU1fUkVHX05VTV9LRVlfTEFTVDsgaSsrKSB7CisgICAgICBfXyBtb3ZkcXUoeG1tX3NhdmUoaSksIGFzX1hNTVJlZ2lzdGVyKGkpKTsKKyAgICB9CisjZW5kaWYKKyAgICAvLyB0aGUgamF2YSBleHBhbmRlZCBrZXkgb3JkZXJpbmcgaXMgcm90YXRlZCBvbmUgcG9zaXRpb24gZnJvbSB3aGF0IHdlIHdhbnQKKyAgICAvLyBzbyB3ZSBzdGFydCBmcm9tIDB4MTAgaGVyZSBhbmQgaGl0IDB4MDAgbGFzdAorICAgIGNvbnN0IFhNTVJlZ2lzdGVyIHhtbV9rZXlfc2h1Zl9tYXNrID0geG1tMTsgIC8vIHVzZWQgdGVtcG9yYXJpbHkgdG8gc3dhcCBrZXkgYnl0ZXMgdXAgZnJvbnQKKyAgICBfXyBtb3ZkcXUoeG1tX2tleV9zaHVmX21hc2ssIEV4dGVybmFsQWRkcmVzcyhTdHViUm91dGluZXM6Ong4Njo6a2V5X3NodWZmbGVfbWFza19hZGRyKCkpKTsKKyAgICAvLyBsb2FkIHVwIHhtbSByZWdzIDUgdGhydSAxNSB3aXRoIGtleSAweDEwIC0gMHhhMCAtIDB4MDAKKyAgICBmb3IgKGludCBybnVtID0gWE1NX1JFR19OVU1fS0VZX0ZJUlNULCBvZmZzZXQgPSAweDEwOyBybnVtIDw9IFhNTV9SRUdfTlVNX0tFWV9MQVNUOyBybnVtKyspIHsKKyAgICAgIGlmIChybnVtID09IFhNTV9SRUdfTlVNX0tFWV9MQVNUKSBvZmZzZXQgPSAweDAwOworICAgICAgbG9hZF9rZXkoYXNfWE1NUmVnaXN0ZXIocm51bSksIGtleSwgb2Zmc2V0LCB4bW1fa2V5X3NodWZfbWFzayk7CisgICAgICBvZmZzZXQgKz0gMHgxMDsKKyAgICB9CisKKyAgICBjb25zdCBYTU1SZWdpc3RlciB4bW1fcHJldl9ibG9ja19jaXBoZXIgPSB4bW0xOyAgLy8gaG9sZHMgY2lwaGVyIG9mIHByZXZpb3VzIGJsb2NrCisgICAgLy8gcmVnaXN0ZXJzIGhvbGRpbmcgdGhlIGZvdXIgcmVzdWx0cyBpbiB0aGUgcGFyYWxsZWxpemVkIGxvb3AKKyAgICBjb25zdCBYTU1SZWdpc3RlciB4bW1fcmVzdWx0MCA9IHhtbTA7CisgICAgY29uc3QgWE1NUmVnaXN0ZXIgeG1tX3Jlc3VsdDEgPSB4bW0yOworICAgIGNvbnN0IFhNTVJlZ2lzdGVyIHhtbV9yZXN1bHQyID0geG1tMzsKKyAgICBjb25zdCBYTU1SZWdpc3RlciB4bW1fcmVzdWx0MyA9IHhtbTQ7CisKKyAgICBfXyBtb3ZkcXUoeG1tX3ByZXZfYmxvY2tfY2lwaGVyLCBBZGRyZXNzKHJ2ZWMsIDB4MDApKTsgICAvLyBpbml0aWFsaXplIHdpdGggaW5pdGlhbCBydmVjCisKKyAgICAvLyBub3cgc3BsaXQgdG8gZGlmZmVyZW50IHBhdGhzIGRlcGVuZGluZyBvbiB0aGUga2V5bGVuIChsZW4gaW4gaW50cyBvZiBBRVNDcnlwdC5LTEUgYXJyYXkgKDUyPTE5Miwgb3IgNjA9MjU2KSkKKyAgICBfXyBtb3ZsKHJheCwgQWRkcmVzcyhrZXksIGFycmF5T29wRGVzYzo6bGVuZ3RoX29mZnNldF9pbl9ieXRlcygpIC0gYXJyYXlPb3BEZXNjOjpiYXNlX29mZnNldF9pbl9ieXRlcyhUX0lOVCkpKTsKKyAgICBfXyBjbXBsKHJheCwgNDQpOworICAgIF9fIGpjYyhBc3NlbWJsZXI6Om5vdEVxdWFsLCBMX2tleV8xOTJfMjU2KTsKKworCisgICAgLy8gMTI4LWJpdCBjb2RlIGZvbGxvd3MgaGVyZSwgcGFyYWxsZWxpemVkCisgICAgX18gbW92cHRyKHBvcywgMCk7CisgICAgX18gYWxpZ24oT3B0b0xvb3BBbGlnbm1lbnQpOworICAgIF9fIEJJTkQoTF9tdWx0aUJsb2NrX2xvb3BUb3BfMTI4KTsKKyAgICBfXyBjbXBwdHIobGVuX3JlZywgNCpBRVNCbG9ja1NpemUpOyAgICAgICAgICAgLy8gc2VlIGlmIGF0IGxlYXN0IDQgYmxvY2tzIGxlZnQKKyAgICBfXyBqY2MoQXNzZW1ibGVyOjpsZXNzLCBMX3NpbmdsZUJsb2NrX2xvb3BUb3BfMTI4KTsKKworICAgIF9fIG1vdmRxdSh4bW1fcmVzdWx0MCwgQWRkcmVzcyhmcm9tLCBwb3MsIEFkZHJlc3M6OnRpbWVzXzEsIDAqQUVTQmxvY2tTaXplKSk7ICAgLy8gZ2V0IG5leHQgNCBibG9ja3MgaW50byB4bW1yZXN1bHQgcmVnaXN0ZXJzCisgICAgX18gbW92ZHF1KHhtbV9yZXN1bHQxLCBBZGRyZXNzKGZyb20sIHBvcywgQWRkcmVzczo6dGltZXNfMSwgMSpBRVNCbG9ja1NpemUpKTsKKyAgICBfXyBtb3ZkcXUoeG1tX3Jlc3VsdDIsIEFkZHJlc3MoZnJvbSwgcG9zLCBBZGRyZXNzOjp0aW1lc18xLCAyKkFFU0Jsb2NrU2l6ZSkpOworICAgIF9fIG1vdmRxdSh4bW1fcmVzdWx0MywgQWRkcmVzcyhmcm9tLCBwb3MsIEFkZHJlc3M6OnRpbWVzXzEsIDMqQUVTQmxvY2tTaXplKSk7CisKKyNkZWZpbmUgRG9Gb3VyKG9wYywgc3JjX3JlZykgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfXyBvcGMoeG1tX3Jlc3VsdDAsIHNyY19yZWcpOyAgICAgICAgICAgICAgIFwKKyAgICBfXyBvcGMoeG1tX3Jlc3VsdDEsIHNyY19yZWcpOyAgICAgICAgICAgICAgIFwKKyAgICBfXyBvcGMoeG1tX3Jlc3VsdDIsIHNyY19yZWcpOyAgICAgICAgICAgICAgIFwKKyAgICBfXyBvcGMoeG1tX3Jlc3VsdDMsIHNyY19yZWcpOworCisgICAgRG9Gb3VyKHB4b3IsIHhtbV9rZXlfZmlyc3QpOworICAgIGZvciAoaW50IHJudW0gPSBYTU1fUkVHX05VTV9LRVlfRklSU1QgKyAxOyBybnVtICA8PSBYTU1fUkVHX05VTV9LRVlfTEFTVCAtIDE7IHJudW0rKykgeworICAgICAgRG9Gb3VyKGFlc2RlYywgYXNfWE1NUmVnaXN0ZXIocm51bSkpOworICAgIH0KKyAgICBEb0ZvdXIoYWVzZGVjbGFzdCwgeG1tX2tleV9sYXN0KTsKKyAgICAvLyBmb3IgZWFjaCByZXN1bHQsIHhvciB3aXRoIHRoZSByIHZlY3RvciBvZiBwcmV2aW91cyBjaXBoZXIgYmxvY2sKKyAgICBfXyBweG9yKHhtbV9yZXN1bHQwLCB4bW1fcHJldl9ibG9ja19jaXBoZXIpOworICAgIF9fIG1vdmRxdSh4bW1fcHJldl9ibG9ja19jaXBoZXIsIEFkZHJlc3MoZnJvbSwgcG9zLCBBZGRyZXNzOjp0aW1lc18xLCAwKkFFU0Jsb2NrU2l6ZSkpOworICAgIF9fIHB4b3IoeG1tX3Jlc3VsdDEsIHhtbV9wcmV2X2Jsb2NrX2NpcGhlcik7CisgICAgX18gbW92ZHF1KHhtbV9wcmV2X2Jsb2NrX2NpcGhlciwgQWRkcmVzcyhmcm9tLCBwb3MsIEFkZHJlc3M6OnRpbWVzXzEsIDEqQUVTQmxvY2tTaXplKSk7CisgICAgX18gcHhvcih4bW1fcmVzdWx0MiwgeG1tX3ByZXZfYmxvY2tfY2lwaGVyKTsKKyAgICBfXyBtb3ZkcXUoeG1tX3ByZXZfYmxvY2tfY2lwaGVyLCBBZGRyZXNzKGZyb20sIHBvcywgQWRkcmVzczo6dGltZXNfMSwgMipBRVNCbG9ja1NpemUpKTsKKyAgICBfXyBweG9yKHhtbV9yZXN1bHQzLCB4bW1fcHJldl9ibG9ja19jaXBoZXIpOworICAgIF9fIG1vdmRxdSh4bW1fcHJldl9ibG9ja19jaXBoZXIsIEFkZHJlc3MoZnJvbSwgcG9zLCBBZGRyZXNzOjp0aW1lc18xLCAzKkFFU0Jsb2NrU2l6ZSkpOyAgIC8vIHRoaXMgd2lsbCBjYXJyeSBvdmVyIHRvIG5leHQgc2V0IG9mIGJsb2NrcworCisgICAgX18gbW92ZHF1KEFkZHJlc3ModG8sIHBvcywgQWRkcmVzczo6dGltZXNfMSwgMCpBRVNCbG9ja1NpemUpLCB4bW1fcmVzdWx0MCk7ICAgICAvLyBzdG9yZSA0IHJlc3VsdHMgaW50byB0aGUgbmV4dCA2NCBieXRlcyBvZiBvdXRwdXQKKyAgICBfXyBtb3ZkcXUoQWRkcmVzcyh0bywgcG9zLCBBZGRyZXNzOjp0aW1lc18xLCAxKkFFU0Jsb2NrU2l6ZSksIHhtbV9yZXN1bHQxKTsKKyAgICBfXyBtb3ZkcXUoQWRkcmVzcyh0bywgcG9zLCBBZGRyZXNzOjp0aW1lc18xLCAyKkFFU0Jsb2NrU2l6ZSksIHhtbV9yZXN1bHQyKTsKKyAgICBfXyBtb3ZkcXUoQWRkcmVzcyh0bywgcG9zLCBBZGRyZXNzOjp0aW1lc18xLCAzKkFFU0Jsb2NrU2l6ZSksIHhtbV9yZXN1bHQzKTsKKworICAgIF9fIGFkZHB0cihwb3MsIDQqQUVTQmxvY2tTaXplKTsKKyAgICBfXyBzdWJwdHIobGVuX3JlZywgNCpBRVNCbG9ja1NpemUpOworICAgIF9fIGptcChMX211bHRpQmxvY2tfbG9vcFRvcF8xMjgpOworCisgICAgLy8gcmVnaXN0ZXJzIHVzZWQgaW4gdGhlIG5vbi1wYXJhbGxlbGl6ZWQgbG9vcHMKKyAgICBjb25zdCBYTU1SZWdpc3RlciB4bW1fcHJldl9ibG9ja19jaXBoZXJfc2F2ZSA9IHhtbTI7CisgICAgY29uc3QgWE1NUmVnaXN0ZXIgeG1tX3RlbXAgICA9IHhtbTM7CisKKyAgICBfXyBhbGlnbihPcHRvTG9vcEFsaWdubWVudCk7CisgICAgX18gQklORChMX3NpbmdsZUJsb2NrX2xvb3BUb3BfMTI4KTsKKyAgICBfXyBjbXBwdHIobGVuX3JlZywgMCk7ICAgICAgICAgICAvLyBhbnkgYmxvY2tzIGxlZnQ/PworICAgIF9fIGpjYyhBc3NlbWJsZXI6OmVxdWFsLCBMX2V4aXQpOworICAgIF9fIG1vdmRxdSh4bW1fcmVzdWx0LCBBZGRyZXNzKGZyb20sIHBvcywgQWRkcmVzczo6dGltZXNfMSwgMCkpOyAgIC8vIGdldCBuZXh0IDE2IGJ5dGVzIG9mIGNpcGhlciBpbnB1dAorICAgIF9fIG1vdmRxYSh4bW1fcHJldl9ibG9ja19jaXBoZXJfc2F2ZSwgeG1tX3Jlc3VsdCk7ICAgICAgICAgICAgICAvLyBzYXZlIGZvciBuZXh0IHIgdmVjdG9yCisgICAgX18gcHhvciAgKHhtbV9yZXN1bHQsIHhtbV9rZXlfZmlyc3QpOyAgICAgICAgICAgICAgIC8vIGRvIHRoZSBhZXMgZGVjIHJvdW5kcworICAgIGZvciAoaW50IHJudW0gPSBYTU1fUkVHX05VTV9LRVlfRklSU1QgKyAxOyBybnVtICA8PSBYTU1fUkVHX05VTV9LRVlfTEFTVCAtIDE7IHJudW0rKykgeworICAgICAgX18gYWVzZGVjKHhtbV9yZXN1bHQsIGFzX1hNTVJlZ2lzdGVyKHJudW0pKTsKKyAgICB9CisgICAgX18gYWVzZGVjbGFzdCh4bW1fcmVzdWx0LCB4bW1fa2V5X2xhc3QpOworICAgIF9fIHB4b3IgICh4bW1fcmVzdWx0LCB4bW1fcHJldl9ibG9ja19jaXBoZXIpOyAgICAgICAgICAgICAgIC8vIHhvciB3aXRoIHRoZSBjdXJyZW50IHIgdmVjdG9yCisgICAgX18gbW92ZHF1KEFkZHJlc3ModG8sIHBvcywgQWRkcmVzczo6dGltZXNfMSwgMCksIHhtbV9yZXN1bHQpOyAgICAgLy8gc3RvcmUgaW50byB0aGUgbmV4dCAxNiBieXRlcyBvZiBvdXRwdXQKKyAgICAvLyBubyBuZWVkIHRvIHN0b3JlIHIgdG8gbWVtb3J5IHVudGlsIHdlIGV4aXQKKyAgICBfXyBtb3ZkcWEoeG1tX3ByZXZfYmxvY2tfY2lwaGVyLCB4bW1fcHJldl9ibG9ja19jaXBoZXJfc2F2ZSk7ICAgICAgICAgICAgICAvLyBzZXQgdXAgbmV4dCByIHZlY3RvciB3aXRoIGNpcGhlciBpbnB1dCBmcm9tIHRoaXMgYmxvY2sKKworICAgIF9fIGFkZHB0cihwb3MsIEFFU0Jsb2NrU2l6ZSk7CisgICAgX18gc3VicHRyKGxlbl9yZWcsIEFFU0Jsb2NrU2l6ZSk7CisgICAgX18gam1wKExfc2luZ2xlQmxvY2tfbG9vcFRvcF8xMjgpOworCisKKyAgICBfXyBCSU5EKExfZXhpdCk7CisgICAgX18gbW92ZHF1KEFkZHJlc3MocnZlYywgMCksIHhtbV9wcmV2X2Jsb2NrX2NpcGhlcik7ICAgICAvLyBmaW5hbCB2YWx1ZSBvZiByIHN0b3JlZCBpbiBydmVjIG9mIENpcGhlckJsb2NrQ2hhaW5pbmcgb2JqZWN0CisjaWZkZWYgX1dJTjY0CisgICAgLy8gcmVzdG9yZSByZWdzIGJlbG9uZ2luZyB0byBjYWxsaW5nIGZ1bmN0aW9uCisgICAgZm9yIChpbnQgaSA9IDY7IGkgPD0gWE1NX1JFR19OVU1fS0VZX0xBU1Q7IGkrKykgeworICAgICAgX18gbW92ZHF1KGFzX1hNTVJlZ2lzdGVyKGkpLCB4bW1fc2F2ZShpKSk7CisgICAgfQorI2VuZGlmCisgICAgX18gbW92bChyYXgsIDApOyAvLyByZXR1cm4gMCAod2h5PykKKyAgICBfXyBsZWF2ZSgpOyAvLyByZXF1aXJlZCBmb3IgcHJvcGVyIHN0YWNrd2Fsa2luZyBvZiBSdW50aW1lU3R1YiBmcmFtZQorICAgIF9fIHJldCgwKTsKKworCisgICAgX18gQklORChMX2tleV8xOTJfMjU2KTsKKyAgICAvLyBoZXJlIHJheCA9IGxlbiBpbiBpbnRzIG9mIEFFU0NyeXB0LktMRSBhcnJheSAoNTI9MTkyLCBvciA2MD0yNTYpCisgICAgX18gY21wbChyYXgsIDUyKTsKKyAgICBfXyBqY2MoQXNzZW1ibGVyOjpub3RFcXVhbCwgTF9rZXlfMjU2KTsKKworICAgIC8vIDE5Mi1iaXQgY29kZSBmb2xsb3dzIGhlcmUgKGNvdWxkIGJlIG9wdGltaXplZCB0byB1c2UgcGFyYWxsZWxpc20pCisgICAgX18gbW92cHRyKHBvcywgMCk7CisgICAgX18gYWxpZ24oT3B0b0xvb3BBbGlnbm1lbnQpOworICAgIF9fIEJJTkQoTF9zaW5nbGVCbG9ja19sb29wVG9wXzE5Mik7CisgICAgX18gbW92ZHF1KHhtbV9yZXN1bHQsIEFkZHJlc3MoZnJvbSwgcG9zLCBBZGRyZXNzOjp0aW1lc18xLCAwKSk7ICAgLy8gZ2V0IG5leHQgMTYgYnl0ZXMgb2YgY2lwaGVyIGlucHV0CisgICAgX18gbW92ZHFhKHhtbV9wcmV2X2Jsb2NrX2NpcGhlcl9zYXZlLCB4bW1fcmVzdWx0KTsgICAgICAgICAgICAgIC8vIHNhdmUgZm9yIG5leHQgciB2ZWN0b3IKKyAgICBfXyBweG9yICAoeG1tX3Jlc3VsdCwgeG1tX2tleV9maXJzdCk7ICAgICAgICAgICAgICAgLy8gZG8gdGhlIGFlcyBkZWMgcm91bmRzCisgICAgZm9yIChpbnQgcm51bSA9IFhNTV9SRUdfTlVNX0tFWV9GSVJTVCArIDE7IHJudW0gPD0gWE1NX1JFR19OVU1fS0VZX0xBU1QgLSAxOyBybnVtKyspIHsKKyAgICAgIF9fIGFlc2RlYyh4bW1fcmVzdWx0LCBhc19YTU1SZWdpc3RlcihybnVtKSk7CisgICAgfQorICAgIGFlc19kZWNfa2V5KHhtbV9yZXN1bHQsIHhtbV90ZW1wLCBrZXksIDB4YjApOyAgICAgLy8gMTkyLWJpdCBrZXkgZ29lcyB1cCB0byBjMAorICAgIGFlc19kZWNfa2V5KHhtbV9yZXN1bHQsIHhtbV90ZW1wLCBrZXksIDB4YzApOworICAgIF9fIGFlc2RlY2xhc3QoeG1tX3Jlc3VsdCwgeG1tX2tleV9sYXN0KTsgICAgICAgICAgICAgICAgICAgIC8vIHhtbTE1IGFsd2F5cyBjYW1lIGZyb20ga2V5KzAKKyAgICBfXyBweG9yICAoeG1tX3Jlc3VsdCwgeG1tX3ByZXZfYmxvY2tfY2lwaGVyKTsgICAgICAgICAgICAgICAvLyB4b3Igd2l0aCB0aGUgY3VycmVudCByIHZlY3RvcgorICAgIF9fIG1vdmRxdShBZGRyZXNzKHRvLCBwb3MsIEFkZHJlc3M6OnRpbWVzXzEsIDApLCB4bW1fcmVzdWx0KTsgICAgIC8vIHN0b3JlIGludG8gdGhlIG5leHQgMTYgYnl0ZXMgb2Ygb3V0cHV0CisgICAgLy8gbm8gbmVlZCB0byBzdG9yZSByIHRvIG1lbW9yeSB1bnRpbCB3ZSBleGl0CisgICAgX18gbW92ZHFhKHhtbV9wcmV2X2Jsb2NrX2NpcGhlciwgeG1tX3ByZXZfYmxvY2tfY2lwaGVyX3NhdmUpOyAgICAgICAgICAgICAgLy8gc2V0IHVwIG5leHQgciB2ZWN0b3Igd2l0aCBjaXBoZXIgaW5wdXQgZnJvbSB0aGlzIGJsb2NrCisKKyAgICBfXyBhZGRwdHIocG9zLCBBRVNCbG9ja1NpemUpOworICAgIF9fIHN1YnB0cihsZW5fcmVnLCBBRVNCbG9ja1NpemUpOworICAgIF9fIGpjYyhBc3NlbWJsZXI6Om5vdEVxdWFsLExfc2luZ2xlQmxvY2tfbG9vcFRvcF8xOTIpOworICAgIF9fIGptcChMX2V4aXQpOworCisgICAgX18gQklORChMX2tleV8yNTYpOworICAgIC8vIDI1Ni1iaXQgY29kZSBmb2xsb3dzIGhlcmUgKGNvdWxkIGJlIG9wdGltaXplZCB0byB1c2UgcGFyYWxsZWxpc20pCisgICAgX18gbW92cHRyKHBvcywgMCk7CisgICAgX18gYWxpZ24oT3B0b0xvb3BBbGlnbm1lbnQpOworICAgIF9fIEJJTkQoTF9zaW5nbGVCbG9ja19sb29wVG9wXzI1Nik7CisgICAgX18gbW92ZHF1KHhtbV9yZXN1bHQsIEFkZHJlc3MoZnJvbSwgcG9zLCBBZGRyZXNzOjp0aW1lc18xLCAwKSk7ICAgLy8gZ2V0IG5leHQgMTYgYnl0ZXMgb2YgY2lwaGVyIGlucHV0CisgICAgX18gbW92ZHFhKHhtbV9wcmV2X2Jsb2NrX2NpcGhlcl9zYXZlLCB4bW1fcmVzdWx0KTsgICAgICAgICAgICAgIC8vIHNhdmUgZm9yIG5leHQgciB2ZWN0b3IKKyAgICBfXyBweG9yICAoeG1tX3Jlc3VsdCwgeG1tX2tleV9maXJzdCk7ICAgICAgICAgICAgICAgLy8gZG8gdGhlIGFlcyBkZWMgcm91bmRzCisgICAgZm9yIChpbnQgcm51bSA9IFhNTV9SRUdfTlVNX0tFWV9GSVJTVCArIDE7IHJudW0gPD0gWE1NX1JFR19OVU1fS0VZX0xBU1QgLSAxOyBybnVtKyspIHsKKyAgICAgIF9fIGFlc2RlYyh4bW1fcmVzdWx0LCBhc19YTU1SZWdpc3RlcihybnVtKSk7CisgICAgfQorICAgIGFlc19kZWNfa2V5KHhtbV9yZXN1bHQsIHhtbV90ZW1wLCBrZXksIDB4YjApOyAgICAgLy8gMjU2LWJpdCBrZXkgZ29lcyB1cCB0byBlMAorICAgIGFlc19kZWNfa2V5KHhtbV9yZXN1bHQsIHhtbV90ZW1wLCBrZXksIDB4YzApOworICAgIGFlc19kZWNfa2V5KHhtbV9yZXN1bHQsIHhtbV90ZW1wLCBrZXksIDB4ZDApOworICAgIGFlc19kZWNfa2V5KHhtbV9yZXN1bHQsIHhtbV90ZW1wLCBrZXksIDB4ZTApOworICAgIF9fIGFlc2RlY2xhc3QoeG1tX3Jlc3VsdCwgeG1tX2tleV9sYXN0KTsgICAgICAgICAgICAgLy8geG1tMTUgY2FtZSBmcm9tIGtleSswCisgICAgX18gcHhvciAgKHhtbV9yZXN1bHQsIHhtbV9wcmV2X2Jsb2NrX2NpcGhlcik7ICAgICAgICAgICAgICAgLy8geG9yIHdpdGggdGhlIGN1cnJlbnQgciB2ZWN0b3IKKyAgICBfXyBtb3ZkcXUoQWRkcmVzcyh0bywgcG9zLCBBZGRyZXNzOjp0aW1lc18xLCAwKSwgeG1tX3Jlc3VsdCk7ICAgICAvLyBzdG9yZSBpbnRvIHRoZSBuZXh0IDE2IGJ5dGVzIG9mIG91dHB1dAorICAgIC8vIG5vIG5lZWQgdG8gc3RvcmUgciB0byBtZW1vcnkgdW50aWwgd2UgZXhpdAorICAgIF9fIG1vdmRxYSh4bW1fcHJldl9ibG9ja19jaXBoZXIsIHhtbV9wcmV2X2Jsb2NrX2NpcGhlcl9zYXZlKTsgICAgICAgICAgICAgIC8vIHNldCB1cCBuZXh0IHIgdmVjdG9yIHdpdGggY2lwaGVyIGlucHV0IGZyb20gdGhpcyBibG9jaworCisgICAgX18gYWRkcHRyKHBvcywgQUVTQmxvY2tTaXplKTsKKyAgICBfXyBzdWJwdHIobGVuX3JlZywgQUVTQmxvY2tTaXplKTsKKyAgICBfXyBqY2MoQXNzZW1ibGVyOjpub3RFcXVhbCxMX3NpbmdsZUJsb2NrX2xvb3BUb3BfMjU2KTsKKyAgICBfXyBqbXAoTF9leGl0KTsKKworICAgIHJldHVybiBzdGFydDsKKyAgfQorCisKKwogI3VuZGVmIF9fCiAjZGVmaW5lIF9fIG1hc20tPgogCkBAIC0zMTM1LDYgKzM2NzcsMTYgQEAKICAgICBnZW5lcmF0ZV9hcnJheWNvcHlfc3R1YnMoKTsKIAogICAgIGdlbmVyYXRlX21hdGhfc3R1YnMoKTsKKworICAgIC8vIGRvbid0IGJvdGhlciBnZW5lcmF0aW5nIHRoZXNlIEFFUyBpbnRyaW5zaWMgc3R1YnMgdW5sZXNzIGdsb2JhbCBmbGFnIGlzIHNldAorICAgIGlmIChVc2VBRVNJbnRyaW5zaWNzKSB7CisgICAgICBTdHViUm91dGluZXM6Ong4Njo6X2tleV9zaHVmZmxlX21hc2tfYWRkciA9IGdlbmVyYXRlX2tleV9zaHVmZmxlX21hc2soKTsgIC8vIG5lZWRlZCBieSB0aGUgb3RoZXJzCisKKyAgICAgIFN0dWJSb3V0aW5lczo6X2Flc2NyeXB0X2VuY3J5cHRCbG9jayA9IGdlbmVyYXRlX2Flc2NyeXB0X2VuY3J5cHRCbG9jaygpOworICAgICAgU3R1YlJvdXRpbmVzOjpfYWVzY3J5cHRfZGVjcnlwdEJsb2NrID0gZ2VuZXJhdGVfYWVzY3J5cHRfZGVjcnlwdEJsb2NrKCk7CisgICAgICBTdHViUm91dGluZXM6Ol9jaXBoZXJCbG9ja0NoYWluaW5nX2VuY3J5cHRBRVNDcnlwdCA9IGdlbmVyYXRlX2NpcGhlckJsb2NrQ2hhaW5pbmdfZW5jcnlwdEFFU0NyeXB0KCk7CisgICAgICBTdHViUm91dGluZXM6Ol9jaXBoZXJCbG9ja0NoYWluaW5nX2RlY3J5cHRBRVNDcnlwdCA9IGdlbmVyYXRlX2NpcGhlckJsb2NrQ2hhaW5pbmdfZGVjcnlwdEFFU0NyeXB0X1BhcmFsbGVsKCk7CisgICAgfQogICB9CiAKICBwdWJsaWM6CmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9jcHUveDg2L3ZtL3N0dWJSb3V0aW5lc194ODZfMzIuY3BwIGIvaG90c3BvdC9zcmMvY3B1L3g4Ni92bS9zdHViUm91dGluZXNfeDg2XzMyLmNwcAppbmRleCA2ZWM0MTIxLi5jZmQ0ZjMzIDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9jcHUveDg2L3ZtL3N0dWJSb3V0aW5lc194ODZfMzIuY3BwCisrKyBiL2hvdHNwb3Qvc3JjL2NwdS94ODYvdm0vc3R1YlJvdXRpbmVzX3g4Nl8zMi5jcHAKQEAgLTQ0LDMgKzQ0LDQgQEAKIAogYWRkcmVzcyBTdHViUm91dGluZXM6Ong4Njo6X3ZlcmlmeV9teGNzcl9lbnRyeSAgICAgICAgID0gTlVMTDsKIGFkZHJlc3MgU3R1YlJvdXRpbmVzOjp4ODY6Ol92ZXJpZnlfZnB1X2NudHJsX3dyZF9lbnRyeSA9IE5VTEw7CithZGRyZXNzIFN0dWJSb3V0aW5lczo6eDg2Ojpfa2V5X3NodWZmbGVfbWFza19hZGRyID0gTlVMTDsKZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL2NwdS94ODYvdm0vc3R1YlJvdXRpbmVzX3g4Nl8zMi5ocHAgYi9ob3RzcG90L3NyYy9jcHUveDg2L3ZtL3N0dWJSb3V0aW5lc194ODZfMzIuaHBwCmluZGV4IDY0NzY3YzguLmQ1MzEyNGYgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL2NwdS94ODYvdm0vc3R1YlJvdXRpbmVzX3g4Nl8zMi5ocHAKKysrIGIvaG90c3BvdC9zcmMvY3B1L3g4Ni92bS9zdHViUm91dGluZXNfeDg2XzMyLmhwcApAQCAtNDEsMTAgKzQxLDE0IEBACiAgcHJpdmF0ZToKICAgc3RhdGljIGFkZHJlc3MgX3ZlcmlmeV9teGNzcl9lbnRyeTsKICAgc3RhdGljIGFkZHJlc3MgX3ZlcmlmeV9mcHVfY250cmxfd3JkX2VudHJ5OworICAvLyBzaHVmZmxlIG1hc2sgZm9yIGZpeGluZyB1cCAxMjgtYml0IHdvcmRzIGNvbnNpc3Rpbmcgb2YgYmlnLWVuZGlhbiAzMi1iaXQgaW50ZWdlcnMKKyAgc3RhdGljIGFkZHJlc3MgX2tleV9zaHVmZmxlX21hc2tfYWRkcjsKIAogIHB1YmxpYzoKICAgc3RhdGljIGFkZHJlc3MgdmVyaWZ5X214Y3NyX2VudHJ5KCkgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBfdmVyaWZ5X214Y3NyX2VudHJ5OyB9CiAgIHN0YXRpYyBhZGRyZXNzIHZlcmlmeV9mcHVfY250cmxfd3JkX2VudHJ5KCkgICAgICAgICAgICAgICAgeyByZXR1cm4gX3ZlcmlmeV9mcHVfY250cmxfd3JkX2VudHJ5OyB9CisgIHN0YXRpYyBhZGRyZXNzIGtleV9zaHVmZmxlX21hc2tfYWRkcigpICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gX2tleV9zaHVmZmxlX21hc2tfYWRkcjsgfQorCiB9OwogCiAgIHN0YXRpYyBib29sICAgIHJldHVybnNfdG9fY2FsbF9zdHViKGFkZHJlc3MgcmV0dXJuX3BjKSAgICAgeyByZXR1cm4gcmV0dXJuX3BjID09IF9jYWxsX3N0dWJfcmV0dXJuX2FkZHJlc3M7IH0KZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL2NwdS94ODYvdm0vc3R1YlJvdXRpbmVzX3g4Nl82NC5jcHAgYi9ob3RzcG90L3NyYy9jcHUveDg2L3ZtL3N0dWJSb3V0aW5lc194ODZfNjQuY3BwCmluZGV4IDA4NGJiZjguLmNmOGVjNWQgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL2NwdS94ODYvdm0vc3R1YlJvdXRpbmVzX3g4Nl82NC5jcHAKKysrIGIvaG90c3BvdC9zcmMvY3B1L3g4Ni92bS9zdHViUm91dGluZXNfeDg2XzY0LmNwcApAQCAtNTYsMyArNTYsNCBAQAogYWRkcmVzcyBTdHViUm91dGluZXM6Ong4Njo6X2RvdWJsZV9zaWduX21hc2sgPSBOVUxMOwogYWRkcmVzcyBTdHViUm91dGluZXM6Ong4Njo6X2RvdWJsZV9zaWduX2ZsaXAgPSBOVUxMOwogYWRkcmVzcyBTdHViUm91dGluZXM6Ong4Njo6X214Y3NyX3N0ZCA9IE5VTEw7CithZGRyZXNzIFN0dWJSb3V0aW5lczo6eDg2Ojpfa2V5X3NodWZmbGVfbWFza19hZGRyID0gTlVMTDsKZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL2NwdS94ODYvdm0vc3R1YlJvdXRpbmVzX3g4Nl82NC5ocHAgYi9ob3RzcG90L3NyYy9jcHUveDg2L3ZtL3N0dWJSb3V0aW5lc194ODZfNjQuaHBwCmluZGV4IDliOWNlZGUuLmMzZWZlZWMgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL2NwdS94ODYvdm0vc3R1YlJvdXRpbmVzX3g4Nl82NC5ocHAKKysrIGIvaG90c3BvdC9zcmMvY3B1L3g4Ni92bS9zdHViUm91dGluZXNfeDg2XzY0LmhwcApAQCAtNTQsNiArNTQsOCBAQAogICBzdGF0aWMgYWRkcmVzcyBfZG91YmxlX3NpZ25fbWFzazsKICAgc3RhdGljIGFkZHJlc3MgX2RvdWJsZV9zaWduX2ZsaXA7CiAgIHN0YXRpYyBhZGRyZXNzIF9teGNzcl9zdGQ7CisgIC8vIHNodWZmbGUgbWFzayBmb3IgZml4aW5nIHVwIDEyOC1iaXQgd29yZHMgY29uc2lzdGluZyBvZiBiaWctZW5kaWFuIDMyLWJpdCBpbnRlZ2VycworICBzdGF0aWMgYWRkcmVzcyBfa2V5X3NodWZmbGVfbWFza19hZGRyOwogCiAgcHVibGljOgogCkBAIC0xMTYsNiArMTE4LDkgQEAKICAgewogICAgIHJldHVybiBfbXhjc3Jfc3RkOwogICB9CisKKyAgc3RhdGljIGFkZHJlc3Mga2V5X3NodWZmbGVfbWFza19hZGRyKCkgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBfa2V5X3NodWZmbGVfbWFza19hZGRyOyB9CisKIH07CiAKICNlbmRpZiAvLyBDUFVfWDg2X1ZNX1NUVUJST1VUSU5FU19YODZfNjRfSFBQCmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9jcHUveDg2L3ZtL3ZtX3ZlcnNpb25feDg2LmNwcCBiL2hvdHNwb3Qvc3JjL2NwdS94ODYvdm0vdm1fdmVyc2lvbl94ODYuY3BwCmluZGV4IGJmN2IzYzIuLjE4MmIwYWIgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL2NwdS94ODYvdm0vdm1fdmVyc2lvbl94ODYuY3BwCisrKyBiL2hvdHNwb3Qvc3JjL2NwdS94ODYvdm0vdm1fdmVyc2lvbl94ODYuY3BwCkBAIC00MTksMTMgKzQxOSwxNiBAQAogICBpZiAoVXNlQVZYIDwgMSkKICAgICBfY3B1RmVhdHVyZXMgJj0gfkNQVV9BVlg7CiAKKyAgaWYgKCFVc2VBRVMgJiYgIUZMQUdfSVNfREVGQVVMVChVc2VBRVMpKQorICAgIF9jcHVGZWF0dXJlcyAmPSB+Q1BVX0FFUzsKKwogICBpZiAobG9naWNhbF9wcm9jZXNzb3JzX3Blcl9wYWNrYWdlKCkgPT0gMSkgewogICAgIC8vIEhUIHByb2Nlc3NvciBjb3VsZCBiZSBpbnN0YWxsZWQgb24gYSBzeXN0ZW0gd2hpY2ggZG9lc24ndCBzdXBwb3J0IEhULgogICAgIF9jcHVGZWF0dXJlcyAmPSB+Q1BVX0hUOwogICB9CiAKICAgY2hhciBidWZbMjU2XTsKLSAgamlvX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIoJXUgY29yZXMgcGVyIGNwdSwgJXUgdGhyZWFkcyBwZXIgY29yZSkgZmFtaWx5ICVkIG1vZGVsICVkIHN0ZXBwaW5nICVkJXMlcyVzJXMlcyVzJXMlcyVzJXMlcyVzJXMlcyVzJXMlcyVzJXMlcyVzIiwKKyAgamlvX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIoJXUgY29yZXMgcGVyIGNwdSwgJXUgdGhyZWFkcyBwZXIgY29yZSkgZmFtaWx5ICVkIG1vZGVsICVkIHN0ZXBwaW5nICVkJXMlcyVzJXMlcyVzJXMlcyVzJXMlcyVzJXMlcyVzJXMlcyVzJXMlcyVzJXMiLAogICAgICAgICAgICAgICAgY29yZXNfcGVyX2NwdSgpLCB0aHJlYWRzX3Blcl9jb3JlKCksCiAgICAgICAgICAgICAgICBjcHVfZmFtaWx5KCksIF9tb2RlbCwgX3N0ZXBwaW5nLAogICAgICAgICAgICAgICAgKHN1cHBvcnRzX2Ntb3YoKSA/ICIsIGNtb3YiIDogIiIpLApAQCAtNDQxLDYgKzQ0NCw3IEBACiAgICAgICAgICAgICAgICAoc3VwcG9ydHNfcG9wY250KCkgPyAiLCBwb3BjbnQiIDogIiIpLAogICAgICAgICAgICAgICAgKHN1cHBvcnRzX2F2eCgpICAgID8gIiwgYXZ4IiA6ICIiKSwKICAgICAgICAgICAgICAgIChzdXBwb3J0c19hdngyKCkgICA/ICIsIGF2eDIiIDogIiIpLAorICAgICAgICAgICAgICAgKHN1cHBvcnRzX2FlcygpICAgID8gIiwgYWVzIiA6ICIiKSwKICAgICAgICAgICAgICAgIChzdXBwb3J0c19tbXhfZXh0KCkgPyAiLCBtbXhleHQiIDogIiIpLAogICAgICAgICAgICAgICAgKHN1cHBvcnRzXzNkbm93X3ByZWZldGNoKCkgPyAiLCAzZG5vd3ByZWYiIDogIiIpLAogICAgICAgICAgICAgICAgKHN1cHBvcnRzX2x6Y250KCkgICA/ICIsIGx6Y250IjogIiIpLApAQCAtNDcyLDYgKzQ3NiwyOSBAQAogICBpZiAoIXN1cHBvcnRzX2F2eCAoKSkgLy8gRHJvcCB0byAwIGlmIG5vIEFWWCAgc3VwcG9ydAogICAgIFVzZUFWWCA9IDA7CiAKKyAgLy8gVXNlIEFFUyBpbnN0cnVjdGlvbnMgaWYgYXZhaWxhYmxlLgorICBpZiAoc3VwcG9ydHNfYWVzKCkpIHsKKyAgICBpZiAoRkxBR19JU19ERUZBVUxUKFVzZUFFUykpIHsKKyAgICAgIFVzZUFFUyA9IHRydWU7CisgICAgfQorICB9IGVsc2UgaWYgKFVzZUFFUykgeworICAgIGlmICghRkxBR19JU19ERUZBVUxUKFVzZUFFUykpCisgICAgICB3YXJuaW5nKCJBRVMgaW5zdHJ1Y3Rpb25zIG5vdCBhdmFpbGFibGUgb24gdGhpcyBDUFUiKTsKKyAgICBGTEFHX1NFVF9ERUZBVUxUKFVzZUFFUywgZmFsc2UpOworICB9CisKKyAgLy8gVGhlIEFFUyBpbnRyaW5zaWMgc3R1YnMgcmVxdWlyZSBBRVMgaW5zdHJ1Y3Rpb24gc3VwcG9ydCAob2YgY291cnNlKQorICAvLyBidXQgYWxzbyByZXF1aXJlIEFWWCBtb2RlIGZvciBtaXNhbGlnbmVkIFNTRSBhY2Nlc3MKKyAgaWYgKFVzZUFFUyAmJiAoVXNlQVZYID4gMCkpIHsKKyAgICBpZiAoRkxBR19JU19ERUZBVUxUKFVzZUFFU0ludHJpbnNpY3MpKSB7CisgICAgICBVc2VBRVNJbnRyaW5zaWNzID0gdHJ1ZTsKKyAgICB9CisgIH0gZWxzZSBpZiAoVXNlQUVTSW50cmluc2ljcykgeworICAgIGlmICghRkxBR19JU19ERUZBVUxUKFVzZUFFU0ludHJpbnNpY3MpKQorICAgICAgd2FybmluZygiQUVTIGludHJpbnNpY3Mgbm90IGF2YWlsYWJsZSBvbiB0aGlzIENQVSIpOworICAgIEZMQUdfU0VUX0RFRkFVTFQoVXNlQUVTSW50cmluc2ljcywgZmFsc2UpOworICB9CisKICNpZmRlZiBDT01QSUxFUjIKICAgaWYgKFVzZUZQVUZvclNwaWxsaW5nKSB7CiAgICAgaWYgKFVzZVNTRSA8IDIpIHsKQEAgLTcxNCw2ICs3NDEsOSBAQAogICAgIGlmIChVc2VBVlggPiAwKSB7CiAgICAgICB0dHktPnByaW50KCIgIFVzZUFWWD0lZCIsVXNlQVZYKTsKICAgICB9CisgICAgaWYgKFVzZUFFUykgeworICAgICAgdHR5LT5wcmludCgiICBVc2VBRVM9MSIpOworICAgIH0KICAgICB0dHktPmNyKCk7CiAgICAgdHR5LT5wcmludCgiQWxsb2NhdGlvbiIpOwogICAgIGlmIChBbGxvY2F0ZVByZWZldGNoU3R5bGUgPD0gMCB8fCBVc2VTU0UgPT0gMCAmJiAhc3VwcG9ydHNfM2Rub3dfcHJlZmV0Y2goKSkgewpkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvY3B1L3g4Ni92bS92bV92ZXJzaW9uX3g4Ni5ocHAgYi9ob3RzcG90L3NyYy9jcHUveDg2L3ZtL3ZtX3ZlcnNpb25feDg2LmhwcAppbmRleCA5MmNkYmQzLi4xMmJkM2I3IDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9jcHUveDg2L3ZtL3ZtX3ZlcnNpb25feDg2LmhwcAorKysgYi9ob3RzcG90L3NyYy9jcHUveDg2L3ZtL3ZtX3ZlcnNpb25feDg2LmhwcApAQCAtNzgsNyArNzgsOSBAQAogICAgICAgICAgICAgICAgc3NlNF8yICAgOiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgOiAyLAogICAgICAgICAgICAgICAgcG9wY250ICAgOiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgOiAzLAorICAgICAgICAgICAgICAgICAgICAgICAgOiAxLAorICAgICAgICAgICAgICAgYWVzICAgICAgOiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgOiAxLAogICAgICAgICAgICAgICAgb3N4c2F2ZSAgOiAxLAogICAgICAgICAgICAgICAgYXZ4ICAgICAgOiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgOiAzOwpAQCAtMjQ0LDcgKzI0Niw4IEBACiAgICAgQ1BVX1RTQyAgICA9ICgxIDw8IDE1KSwKICAgICBDUFVfVFNDSU5WID0gKDEgPDwgMTYpLAogICAgIENQVV9BVlggICAgPSAoMSA8PCAxNyksCi0gICAgQ1BVX0FWWDIgICA9ICgxIDw8IDE4KQorICAgIENQVV9BVlgyICAgPSAoMSA8PCAxOCksCisgICAgQ1BVX0FFUyAgICA9ICgxIDw8IDE5KQogICB9IGNwdUZlYXR1cmVGbGFnczsKIAogICBlbnVtIHsKQEAgLTQyMCw2ICs0MjMsOCBAQAogICAgICAgcmVzdWx0IHw9IENQVV9UU0M7CiAgICAgaWYgKF9jcHVpZF9pbmZvLmV4dF9jcHVpZDdfZWR4LmJpdHMudHNjX2ludmFyaWFuY2UgIT0gMCkKICAgICAgIHJlc3VsdCB8PSBDUFVfVFNDSU5WOworICAgIGlmIChfY3B1aWRfaW5mby5zdGRfY3B1aWQxX2VjeC5iaXRzLmFlcyAhPSAwKQorICAgICAgcmVzdWx0IHw9IENQVV9BRVM7CiAKICAgICAvLyBBTUQgZmVhdHVyZXMuCiAgICAgaWYgKGlzX2FtZCgpKSB7CkBAIC01NDQsNiArNTQ5LDcgQEAKICAgc3RhdGljIGJvb2wgc3VwcG9ydHNfYXZ4KCkgICAgICB7IHJldHVybiAoX2NwdUZlYXR1cmVzICYgQ1BVX0FWWCkgIT0gMDsgfQogICBzdGF0aWMgYm9vbCBzdXBwb3J0c19hdngyKCkgICAgIHsgcmV0dXJuIChfY3B1RmVhdHVyZXMgJiBDUFVfQVZYMikgIT0gMDsgfQogICBzdGF0aWMgYm9vbCBzdXBwb3J0c190c2MoKSAgICAgIHsgcmV0dXJuIChfY3B1RmVhdHVyZXMgJiBDUFVfVFNDKSAgICAhPSAwOyB9CisgIHN0YXRpYyBib29sIHN1cHBvcnRzX2FlcygpICAgICAgeyByZXR1cm4gKF9jcHVGZWF0dXJlcyAmIENQVV9BRVMpICE9IDA7IH0KIAogICAvLyBJbnRlbCBmZWF0dXJlcwogICBzdGF0aWMgYm9vbCBpc19pbnRlbF9mYW1pbHlfY29yZSgpIHsgcmV0dXJuIGlzX2ludGVsKCkgJiYKZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL2NwdS94ODYvdm0veDg2LmFkIGIvaG90c3BvdC9zcmMvY3B1L3g4Ni92bS94ODYuYWQKaW5kZXggYTJjZjZmNy4uYzQ5ZDBlNiAxMDA2NDQKLS0tIGEvaG90c3BvdC9zcmMvY3B1L3g4Ni92bS94ODYuYWQKKysrIGIvaG90c3BvdC9zcmMvY3B1L3g4Ni92bS94ODYuYWQKQEAgLTQxMDIsOSArNDEwMiwxNTggQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTG9naWNhbFJpZ2h0U2hpZnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotLy8gU2hvcnRzL0NoYXJzIHZlY3RvciBsb2dpY2FsIHJpZ2h0IHNoaWZ0IHByb2R1Y2VzIGluY29ycmVjdCBKYXZhIHJlc3VsdAorLy8gU2hvcnRzIHZlY3RvciBsb2dpY2FsIHJpZ2h0IHNoaWZ0IHByb2R1Y2VzIGluY29ycmVjdCBKYXZhIHJlc3VsdAogLy8gZm9yIG5lZ2F0aXZlIGRhdGEgYmVjYXVzZSBqYXZhIGNvZGUgY29udmVydCBzaG9ydCB2YWx1ZSBpbnRvIGludCB3aXRoCi0vLyBzaWduIGV4dGVuc2lvbiBiZWZvcmUgYSBzaGlmdC4KKy8vIHNpZ24gZXh0ZW5zaW9uIGJlZm9yZSBhIHNoaWZ0LiBCdXQgY2hhciB2ZWN0b3JzIGFyZSBmaW5lIHNpbmNlIGNoYXJzIGFyZQorLy8gdW5zaWduZWQgdmFsdWVzLgorCitpbnN0cnVjdCB2c3JsMlModmVjUyBkc3QsIHZlY1Mgc2hpZnQpICV7CisgIHByZWRpY2F0ZShuLT5hc19WZWN0b3IoKS0+bGVuZ3RoKCkgPT0gMik7CisgIG1hdGNoKFNldCBkc3QgKFVSU2hpZnRWUyBkc3Qgc2hpZnQpKTsKKyAgZm9ybWF0ICV7ICJwc3JsdyAgICRkc3QsJHNoaWZ0XHQhIGxvZ2ljYWwgcmlnaHQgc2hpZnQgcGFja2VkMlMiICV9CisgIGluc19lbmNvZGUgJXsKKyAgICBfXyBwc3JsdygkZHN0JCRYTU1SZWdpc3RlciwgJHNoaWZ0JCRYTU1SZWdpc3Rlcik7CisgICV9CisgIGluc19waXBlKCBwaXBlX3Nsb3cgKTsKKyV9CisKK2luc3RydWN0IHZzcmwyU19pbW0odmVjUyBkc3QsIGltbUk4IHNoaWZ0KSAleworICBwcmVkaWNhdGUobi0+YXNfVmVjdG9yKCktPmxlbmd0aCgpID09IDIpOworICBtYXRjaChTZXQgZHN0IChVUlNoaWZ0VlMgZHN0IHNoaWZ0KSk7CisgIGZvcm1hdCAleyAicHNybHcgICAkZHN0LCRzaGlmdFx0ISBsb2dpY2FsIHJpZ2h0IHNoaWZ0IHBhY2tlZDJTIiAlfQorICBpbnNfZW5jb2RlICV7CisgICAgX18gcHNybHcoJGRzdCQkWE1NUmVnaXN0ZXIsIChpbnQpJHNoaWZ0JCRjb25zdGFudCk7CisgICV9CisgIGluc19waXBlKCBwaXBlX3Nsb3cgKTsKKyV9CisKK2luc3RydWN0IHZzcmwyU19yZWcodmVjUyBkc3QsIHZlY1Mgc3JjLCB2ZWNTIHNoaWZ0KSAleworICBwcmVkaWNhdGUoVXNlQVZYID4gMCAmJiBuLT5hc19WZWN0b3IoKS0+bGVuZ3RoKCkgPT0gMik7CisgIG1hdGNoKFNldCBkc3QgKFVSU2hpZnRWUyBzcmMgc2hpZnQpKTsKKyAgZm9ybWF0ICV7ICJ2cHNybHcgICRkc3QsJHNyYywkc2hpZnRcdCEgbG9naWNhbCByaWdodCBzaGlmdCBwYWNrZWQyUyIgJX0KKyAgaW5zX2VuY29kZSAleworICAgIGJvb2wgdmVjdG9yMjU2ID0gZmFsc2U7CisgICAgX18gdnBzcmx3KCRkc3QkJFhNTVJlZ2lzdGVyLCAkc3JjJCRYTU1SZWdpc3RlciwgJHNoaWZ0JCRYTU1SZWdpc3RlciwgdmVjdG9yMjU2KTsKKyAgJX0KKyAgaW5zX3BpcGUoIHBpcGVfc2xvdyApOworJX0KKworaW5zdHJ1Y3QgdnNybDJTX3JlZ19pbW0odmVjUyBkc3QsIHZlY1Mgc3JjLCBpbW1JOCBzaGlmdCkgJXsKKyAgcHJlZGljYXRlKFVzZUFWWCA+IDAgJiYgbi0+YXNfVmVjdG9yKCktPmxlbmd0aCgpID09IDIpOworICBtYXRjaChTZXQgZHN0IChVUlNoaWZ0VlMgc3JjIHNoaWZ0KSk7CisgIGZvcm1hdCAleyAidnBzcmx3ICAkZHN0LCRzcmMsJHNoaWZ0XHQhIGxvZ2ljYWwgcmlnaHQgc2hpZnQgcGFja2VkMlMiICV9CisgIGluc19lbmNvZGUgJXsKKyAgICBib29sIHZlY3RvcjI1NiA9IGZhbHNlOworICAgIF9fIHZwc3JsdygkZHN0JCRYTU1SZWdpc3RlciwgJHNyYyQkWE1NUmVnaXN0ZXIsIChpbnQpJHNoaWZ0JCRjb25zdGFudCwgdmVjdG9yMjU2KTsKKyAgJX0KKyAgaW5zX3BpcGUoIHBpcGVfc2xvdyApOworJX0KKworaW5zdHJ1Y3QgdnNybDRTKHZlY0QgZHN0LCB2ZWNTIHNoaWZ0KSAleworICBwcmVkaWNhdGUobi0+YXNfVmVjdG9yKCktPmxlbmd0aCgpID09IDQpOworICBtYXRjaChTZXQgZHN0IChVUlNoaWZ0VlMgZHN0IHNoaWZ0KSk7CisgIGZvcm1hdCAleyAicHNybHcgICAkZHN0LCRzaGlmdFx0ISBsb2dpY2FsIHJpZ2h0IHNoaWZ0IHBhY2tlZDRTIiAlfQorICBpbnNfZW5jb2RlICV7CisgICAgX18gcHNybHcoJGRzdCQkWE1NUmVnaXN0ZXIsICRzaGlmdCQkWE1NUmVnaXN0ZXIpOworICAlfQorICBpbnNfcGlwZSggcGlwZV9zbG93ICk7CislfQorCitpbnN0cnVjdCB2c3JsNFNfaW1tKHZlY0QgZHN0LCBpbW1JOCBzaGlmdCkgJXsKKyAgcHJlZGljYXRlKG4tPmFzX1ZlY3RvcigpLT5sZW5ndGgoKSA9PSA0KTsKKyAgbWF0Y2goU2V0IGRzdCAoVVJTaGlmdFZTIGRzdCBzaGlmdCkpOworICBmb3JtYXQgJXsgInBzcmx3ICAgJGRzdCwkc2hpZnRcdCEgbG9naWNhbCByaWdodCBzaGlmdCBwYWNrZWQ0UyIgJX0KKyAgaW5zX2VuY29kZSAleworICAgIF9fIHBzcmx3KCRkc3QkJFhNTVJlZ2lzdGVyLCAoaW50KSRzaGlmdCQkY29uc3RhbnQpOworICAlfQorICBpbnNfcGlwZSggcGlwZV9zbG93ICk7CislfQorCitpbnN0cnVjdCB2c3JsNFNfcmVnKHZlY0QgZHN0LCB2ZWNEIHNyYywgdmVjUyBzaGlmdCkgJXsKKyAgcHJlZGljYXRlKFVzZUFWWCA+IDAgJiYgbi0+YXNfVmVjdG9yKCktPmxlbmd0aCgpID09IDQpOworICBtYXRjaChTZXQgZHN0IChVUlNoaWZ0VlMgc3JjIHNoaWZ0KSk7CisgIGZvcm1hdCAleyAidnBzcmx3ICAkZHN0LCRzcmMsJHNoaWZ0XHQhIGxvZ2ljYWwgcmlnaHQgc2hpZnQgcGFja2VkNFMiICV9CisgIGluc19lbmNvZGUgJXsKKyAgICBib29sIHZlY3RvcjI1NiA9IGZhbHNlOworICAgIF9fIHZwc3JsdygkZHN0JCRYTU1SZWdpc3RlciwgJHNyYyQkWE1NUmVnaXN0ZXIsICRzaGlmdCQkWE1NUmVnaXN0ZXIsIHZlY3RvcjI1Nik7CisgICV9CisgIGluc19waXBlKCBwaXBlX3Nsb3cgKTsKKyV9CisKK2luc3RydWN0IHZzcmw0U19yZWdfaW1tKHZlY0QgZHN0LCB2ZWNEIHNyYywgaW1tSTggc2hpZnQpICV7CisgIHByZWRpY2F0ZShVc2VBVlggPiAwICYmIG4tPmFzX1ZlY3RvcigpLT5sZW5ndGgoKSA9PSA0KTsKKyAgbWF0Y2goU2V0IGRzdCAoVVJTaGlmdFZTIHNyYyBzaGlmdCkpOworICBmb3JtYXQgJXsgInZwc3JsdyAgJGRzdCwkc3JjLCRzaGlmdFx0ISBsb2dpY2FsIHJpZ2h0IHNoaWZ0IHBhY2tlZDRTIiAlfQorICBpbnNfZW5jb2RlICV7CisgICAgYm9vbCB2ZWN0b3IyNTYgPSBmYWxzZTsKKyAgICBfXyB2cHNybHcoJGRzdCQkWE1NUmVnaXN0ZXIsICRzcmMkJFhNTVJlZ2lzdGVyLCAoaW50KSRzaGlmdCQkY29uc3RhbnQsIHZlY3RvcjI1Nik7CisgICV9CisgIGluc19waXBlKCBwaXBlX3Nsb3cgKTsKKyV9CisKK2luc3RydWN0IHZzcmw4Uyh2ZWNYIGRzdCwgdmVjUyBzaGlmdCkgJXsKKyAgcHJlZGljYXRlKG4tPmFzX1ZlY3RvcigpLT5sZW5ndGgoKSA9PSA4KTsKKyAgbWF0Y2goU2V0IGRzdCAoVVJTaGlmdFZTIGRzdCBzaGlmdCkpOworICBmb3JtYXQgJXsgInBzcmx3ICAgJGRzdCwkc2hpZnRcdCEgbG9naWNhbCByaWdodCBzaGlmdCBwYWNrZWQ4UyIgJX0KKyAgaW5zX2VuY29kZSAleworICAgIF9fIHBzcmx3KCRkc3QkJFhNTVJlZ2lzdGVyLCAkc2hpZnQkJFhNTVJlZ2lzdGVyKTsKKyAgJX0KKyAgaW5zX3BpcGUoIHBpcGVfc2xvdyApOworJX0KKworaW5zdHJ1Y3QgdnNybDhTX2ltbSh2ZWNYIGRzdCwgaW1tSTggc2hpZnQpICV7CisgIHByZWRpY2F0ZShuLT5hc19WZWN0b3IoKS0+bGVuZ3RoKCkgPT0gOCk7CisgIG1hdGNoKFNldCBkc3QgKFVSU2hpZnRWUyBkc3Qgc2hpZnQpKTsKKyAgZm9ybWF0ICV7ICJwc3JsdyAgICRkc3QsJHNoaWZ0XHQhIGxvZ2ljYWwgcmlnaHQgc2hpZnQgcGFja2VkOFMiICV9CisgIGluc19lbmNvZGUgJXsKKyAgICBfXyBwc3JsdygkZHN0JCRYTU1SZWdpc3RlciwgKGludCkkc2hpZnQkJGNvbnN0YW50KTsKKyAgJX0KKyAgaW5zX3BpcGUoIHBpcGVfc2xvdyApOworJX0KKworaW5zdHJ1Y3QgdnNybDhTX3JlZyh2ZWNYIGRzdCwgdmVjWCBzcmMsIHZlY1Mgc2hpZnQpICV7CisgIHByZWRpY2F0ZShVc2VBVlggPiAwICYmIG4tPmFzX1ZlY3RvcigpLT5sZW5ndGgoKSA9PSA4KTsKKyAgbWF0Y2goU2V0IGRzdCAoVVJTaGlmdFZTIHNyYyBzaGlmdCkpOworICBmb3JtYXQgJXsgInZwc3JsdyAgJGRzdCwkc3JjLCRzaGlmdFx0ISBsb2dpY2FsIHJpZ2h0IHNoaWZ0IHBhY2tlZDhTIiAlfQorICBpbnNfZW5jb2RlICV7CisgICAgYm9vbCB2ZWN0b3IyNTYgPSBmYWxzZTsKKyAgICBfXyB2cHNybHcoJGRzdCQkWE1NUmVnaXN0ZXIsICRzcmMkJFhNTVJlZ2lzdGVyLCAkc2hpZnQkJFhNTVJlZ2lzdGVyLCB2ZWN0b3IyNTYpOworICAlfQorICBpbnNfcGlwZSggcGlwZV9zbG93ICk7CislfQorCitpbnN0cnVjdCB2c3JsOFNfcmVnX2ltbSh2ZWNYIGRzdCwgdmVjWCBzcmMsIGltbUk4IHNoaWZ0KSAleworICBwcmVkaWNhdGUoVXNlQVZYID4gMCAmJiBuLT5hc19WZWN0b3IoKS0+bGVuZ3RoKCkgPT0gOCk7CisgIG1hdGNoKFNldCBkc3QgKFVSU2hpZnRWUyBzcmMgc2hpZnQpKTsKKyAgZm9ybWF0ICV7ICJ2cHNybHcgICRkc3QsJHNyYywkc2hpZnRcdCEgbG9naWNhbCByaWdodCBzaGlmdCBwYWNrZWQ4UyIgJX0KKyAgaW5zX2VuY29kZSAleworICAgIGJvb2wgdmVjdG9yMjU2ID0gZmFsc2U7CisgICAgX18gdnBzcmx3KCRkc3QkJFhNTVJlZ2lzdGVyLCAkc3JjJCRYTU1SZWdpc3RlciwgKGludCkkc2hpZnQkJGNvbnN0YW50LCB2ZWN0b3IyNTYpOworICAlfQorICBpbnNfcGlwZSggcGlwZV9zbG93ICk7CislfQorCitpbnN0cnVjdCB2c3JsMTZTX3JlZyh2ZWNZIGRzdCwgdmVjWSBzcmMsIHZlY1Mgc2hpZnQpICV7CisgIHByZWRpY2F0ZShVc2VBVlggPiAxICYmIG4tPmFzX1ZlY3RvcigpLT5sZW5ndGgoKSA9PSAxNik7CisgIG1hdGNoKFNldCBkc3QgKFVSU2hpZnRWUyBzcmMgc2hpZnQpKTsKKyAgZm9ybWF0ICV7ICJ2cHNybHcgICRkc3QsJHNyYywkc2hpZnRcdCEgbG9naWNhbCByaWdodCBzaGlmdCBwYWNrZWQxNlMiICV9CisgIGluc19lbmNvZGUgJXsKKyAgICBib29sIHZlY3RvcjI1NiA9IHRydWU7CisgICAgX18gdnBzcmx3KCRkc3QkJFhNTVJlZ2lzdGVyLCAkc3JjJCRYTU1SZWdpc3RlciwgJHNoaWZ0JCRYTU1SZWdpc3RlciwgdmVjdG9yMjU2KTsKKyAgJX0KKyAgaW5zX3BpcGUoIHBpcGVfc2xvdyApOworJX0KKworaW5zdHJ1Y3QgdnNybDE2U19yZWdfaW1tKHZlY1kgZHN0LCB2ZWNZIHNyYywgaW1tSTggc2hpZnQpICV7CisgIHByZWRpY2F0ZShVc2VBVlggPiAxICYmIG4tPmFzX1ZlY3RvcigpLT5sZW5ndGgoKSA9PSAxNik7CisgIG1hdGNoKFNldCBkc3QgKFVSU2hpZnRWUyBzcmMgc2hpZnQpKTsKKyAgZm9ybWF0ICV7ICJ2cHNybHcgICRkc3QsJHNyYywkc2hpZnRcdCEgbG9naWNhbCByaWdodCBzaGlmdCBwYWNrZWQxNlMiICV9CisgIGluc19lbmNvZGUgJXsKKyAgICBib29sIHZlY3RvcjI1NiA9IHRydWU7CisgICAgX18gdnBzcmx3KCRkc3QkJFhNTVJlZ2lzdGVyLCAkc3JjJCRYTU1SZWdpc3RlciwgKGludCkkc2hpZnQkJGNvbnN0YW50LCB2ZWN0b3IyNTYpOworICAlfQorICBpbnNfcGlwZSggcGlwZV9zbG93ICk7CislfQogCiAvLyBJbnRlZ2VycyB2ZWN0b3IgbG9naWNhbCByaWdodCBzaGlmdAogaW5zdHJ1Y3QgdnNybDJJKHZlY0QgZHN0LCB2ZWNTIHNoaWZ0KSAlewpkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvb3MvYnNkL3ZtL3BlcmZNZW1vcnlfYnNkLmNwcCBiL2hvdHNwb3Qvc3JjL29zL2JzZC92bS9wZXJmTWVtb3J5X2JzZC5jcHAKaW5kZXggMTIzZTZlMi4uY2I5ZGFkYSAxMDA2NDQKLS0tIGEvaG90c3BvdC9zcmMvb3MvYnNkL3ZtL3BlcmZNZW1vcnlfYnNkLmNwcAorKysgYi9ob3RzcG90L3NyYy9vcy9ic2Qvdm0vcGVyZk1lbW9yeV9ic2QuY3BwCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSAib3NfYnNkLmlubGluZS5ocHAiCiAjaW5jbHVkZSAicnVudGltZS9oYW5kbGVzLmlubGluZS5ocHAiCiAjaW5jbHVkZSAicnVudGltZS9wZXJmTWVtb3J5LmhwcCIKKyNpbmNsdWRlICJzZXJ2aWNlcy9tZW1UcmFja2VyLmhwcCIKICNpbmNsdWRlICJ1dGlsaXRpZXMvZXhjZXB0aW9ucy5ocHAiCiAKIC8vIHB1dCBPUy1pbmNsdWRlcyBoZXJlCkBAIC03NTMsNiArNzU0LDEwIEBACiAgIC8vIGNsZWFyIHRoZSBzaGFyZWQgbWVtb3J5IHJlZ2lvbgogICAodm9pZCk6Om1lbXNldCgodm9pZCopIG1hcEFkZHJlc3MsIDAsIHNpemUpOwogCisgIC8vIGl0IGRvZXMgbm90IGdvIHRocm91Z2ggb3MgYXBpLCB0aGUgb3BlcmF0aW9uIGhhcyB0byByZWNvcmQgZnJvbSBoZXJlCisgIE1lbVRyYWNrZXI6OnJlY29yZF92aXJ0dWFsX21lbW9yeV9yZXNlcnZlKChhZGRyZXNzKW1hcEFkZHJlc3MsIHNpemUsIENVUlJFTlRfUEMpOworICBNZW1UcmFja2VyOjpyZWNvcmRfdmlydHVhbF9tZW1vcnlfdHlwZSgoYWRkcmVzcyltYXBBZGRyZXNzLCBtdEludGVybmFsKTsKKwogICByZXR1cm4gbWFwQWRkcmVzczsKIH0KIApAQCAtOTEyLDYgKzkxNywxMCBAQAogICAgICAgICAgICAgICAiQ291bGQgbm90IG1hcCBQZXJmTWVtb3J5Iik7CiAgIH0KIAorICAvLyBpdCBkb2VzIG5vdCBnbyB0aHJvdWdoIG9zIGFwaSwgdGhlIG9wZXJhdGlvbiBoYXMgdG8gcmVjb3JkIGZyb20gaGVyZQorICBNZW1UcmFja2VyOjpyZWNvcmRfdmlydHVhbF9tZW1vcnlfcmVzZXJ2ZSgoYWRkcmVzcyltYXBBZGRyZXNzLCBzaXplLCBDVVJSRU5UX1BDKTsKKyAgTWVtVHJhY2tlcjo6cmVjb3JkX3ZpcnR1YWxfbWVtb3J5X3R5cGUoKGFkZHJlc3MpbWFwQWRkcmVzcywgbXRJbnRlcm5hbCk7CisKICAgKmFkZHIgPSBtYXBBZGRyZXNzOwogICAqc2l6ZXAgPSBzaXplOwogCmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9vcy9saW51eC92bS9wZXJmTWVtb3J5X2xpbnV4LmNwcCBiL2hvdHNwb3Qvc3JjL29zL2xpbnV4L3ZtL3BlcmZNZW1vcnlfbGludXguY3BwCmluZGV4IDJhZGFlOGQuLmI1NGM1ZGIgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL29zL2xpbnV4L3ZtL3BlcmZNZW1vcnlfbGludXguY3BwCisrKyBiL2hvdHNwb3Qvc3JjL29zL2xpbnV4L3ZtL3BlcmZNZW1vcnlfbGludXguY3BwCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSAib3NfbGludXguaW5saW5lLmhwcCIKICNpbmNsdWRlICJydW50aW1lL2hhbmRsZXMuaW5saW5lLmhwcCIKICNpbmNsdWRlICJydW50aW1lL3BlcmZNZW1vcnkuaHBwIgorI2luY2x1ZGUgInNlcnZpY2VzL21lbVRyYWNrZXIuaHBwIgogI2luY2x1ZGUgInV0aWxpdGllcy9leGNlcHRpb25zLmhwcCIKIAogLy8gcHV0IE9TLWluY2x1ZGVzIGhlcmUKQEAgLTc1Myw2ICs3NTQsMTAgQEAKICAgLy8gY2xlYXIgdGhlIHNoYXJlZCBtZW1vcnkgcmVnaW9uCiAgICh2b2lkKTo6bWVtc2V0KCh2b2lkKikgbWFwQWRkcmVzcywgMCwgc2l6ZSk7CiAKKyAgLy8gaXQgZG9lcyBub3QgZ28gdGhyb3VnaCBvcyBhcGksIHRoZSBvcGVyYXRpb24gaGFzIHRvIHJlY29yZCBmcm9tIGhlcmUKKyAgTWVtVHJhY2tlcjo6cmVjb3JkX3ZpcnR1YWxfbWVtb3J5X3Jlc2VydmUoKGFkZHJlc3MpbWFwQWRkcmVzcywgc2l6ZSwgQ1VSUkVOVF9QQyk7CisgIE1lbVRyYWNrZXI6OnJlY29yZF92aXJ0dWFsX21lbW9yeV90eXBlKChhZGRyZXNzKW1hcEFkZHJlc3MsIG10SW50ZXJuYWwpOworCiAgIHJldHVybiBtYXBBZGRyZXNzOwogfQogCkBAIC05MTIsNiArOTE3LDEwIEBACiAgICAgICAgICAgICAgICJDb3VsZCBub3QgbWFwIFBlcmZNZW1vcnkiKTsKICAgfQogCisgIC8vIGl0IGRvZXMgbm90IGdvIHRocm91Z2ggb3MgYXBpLCB0aGUgb3BlcmF0aW9uIGhhcyB0byByZWNvcmQgZnJvbSBoZXJlCisgIE1lbVRyYWNrZXI6OnJlY29yZF92aXJ0dWFsX21lbW9yeV9yZXNlcnZlKChhZGRyZXNzKW1hcEFkZHJlc3MsIHNpemUsIENVUlJFTlRfUEMpOworICBNZW1UcmFja2VyOjpyZWNvcmRfdmlydHVhbF9tZW1vcnlfdHlwZSgoYWRkcmVzcyltYXBBZGRyZXNzLCBtdEludGVybmFsKTsKKwogICAqYWRkciA9IG1hcEFkZHJlc3M7CiAgICpzaXplcCA9IHNpemU7CiAKZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL29zL3NvbGFyaXMvdm0vb3Nfc29sYXJpcy5jcHAgYi9ob3RzcG90L3NyYy9vcy9zb2xhcmlzL3ZtL29zX3NvbGFyaXMuY3BwCmluZGV4IDA0ODNkY2IuLmUzNDE1YjggMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL29zL3NvbGFyaXMvdm0vb3Nfc29sYXJpcy5jcHAKKysrIGIvaG90c3BvdC9zcmMvb3Mvc29sYXJpcy92bS9vc19zb2xhcmlzLmNwcApAQCAtNTUsNiArNTUsNyBAQAogI2luY2x1ZGUgInJ1bnRpbWUvdGhyZWFkQ3JpdGljYWwuaHBwIgogI2luY2x1ZGUgInJ1bnRpbWUvdGltZXIuaHBwIgogI2luY2x1ZGUgInNlcnZpY2VzL2F0dGFjaExpc3RlbmVyLmhwcCIKKyNpbmNsdWRlICJzZXJ2aWNlcy9tZW1UcmFja2VyLmhwcCIKICNpbmNsdWRlICJzZXJ2aWNlcy9ydW50aW1lU2VydmljZS5ocHAiCiAjaW5jbHVkZSAidGhyZWFkX3NvbGFyaXMuaW5saW5lLmhwcCIKICNpbmNsdWRlICJ1dGlsaXRpZXMvZGVjb2Rlci5ocHAiCkBAIC0zMDcyLDExICszMDczLDEyIEBACiAgIC8vIFNpbmNlIHNudl84NCwgU29sYXJpcyBhdHRlbXB0cyB0byBob25vciB0aGUgYWRkcmVzcyBoaW50IC0gc2VlIDUwMDM0MTUuCiAgIC8vIEdpdmUgaXQgYSB0cnksIGlmIHRoZSBrZXJuZWwgaG9ub3JzIHRoZSBoaW50IHdlIGNhbiByZXR1cm4gaW1tZWRpYXRlbHkuCiAgIGNoYXIqIGFkZHIgPSBTb2xhcmlzOjphbm9uX21tYXAocmVxdWVzdGVkX2FkZHIsIGJ5dGVzLCAwLCBmYWxzZSk7CisKICAgdm9sYXRpbGUgaW50IGVyciA9IGVycm5vOwogICBpZiAoYWRkciA9PSByZXF1ZXN0ZWRfYWRkcikgewogICAgIHJldHVybiBhZGRyOwogICB9IGVsc2UgaWYgKGFkZHIgIT0gTlVMTCkgewotICAgIHVubWFwX21lbW9yeShhZGRyLCBieXRlcyk7CisgICAgcGRfdW5tYXBfbWVtb3J5KGFkZHIsIGJ5dGVzKTsKICAgfQogCiAgIGlmIChQcmludE1pc2NlbGxhbmVvdXMgJiYgVmVyYm9zZSkgewpkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvb3Mvc29sYXJpcy92bS9wZXJmTWVtb3J5X3NvbGFyaXMuY3BwIGIvaG90c3BvdC9zcmMvb3Mvc29sYXJpcy92bS9wZXJmTWVtb3J5X3NvbGFyaXMuY3BwCmluZGV4IGMyNDc4OWMuLmViYmMwMGIgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL29zL3NvbGFyaXMvdm0vcGVyZk1lbW9yeV9zb2xhcmlzLmNwcAorKysgYi9ob3RzcG90L3NyYy9vcy9zb2xhcmlzL3ZtL3BlcmZNZW1vcnlfc29sYXJpcy5jcHAKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlICJvc19zb2xhcmlzLmlubGluZS5ocHAiCiAjaW5jbHVkZSAicnVudGltZS9oYW5kbGVzLmlubGluZS5ocHAiCiAjaW5jbHVkZSAicnVudGltZS9wZXJmTWVtb3J5LmhwcCIKKyNpbmNsdWRlICJzZXJ2aWNlcy9tZW1UcmFja2VyLmhwcCIKICNpbmNsdWRlICJ1dGlsaXRpZXMvZXhjZXB0aW9ucy5ocHAiCiAKIC8vIHB1dCBPUy1pbmNsdWRlcyBoZXJlCkBAIC03NjgsNiArNzY5LDEwIEBACiAgIC8vIGNsZWFyIHRoZSBzaGFyZWQgbWVtb3J5IHJlZ2lvbgogICAodm9pZCk6Om1lbXNldCgodm9pZCopIG1hcEFkZHJlc3MsIDAsIHNpemUpOwogCisgIC8vIGl0IGRvZXMgbm90IGdvIHRocm91Z2ggb3MgYXBpLCB0aGUgb3BlcmF0aW9uIGhhcyB0byByZWNvcmQgZnJvbSBoZXJlCisgIE1lbVRyYWNrZXI6OnJlY29yZF92aXJ0dWFsX21lbW9yeV9yZXNlcnZlKChhZGRyZXNzKW1hcEFkZHJlc3MsIHNpemUsIENVUlJFTlRfUEMpOworICBNZW1UcmFja2VyOjpyZWNvcmRfdmlydHVhbF9tZW1vcnlfdHlwZSgoYWRkcmVzcyltYXBBZGRyZXNzLCBtdEludGVybmFsKTsKKwogICByZXR1cm4gbWFwQWRkcmVzczsKIH0KIApAQCAtOTI3LDYgKzkzMiwxMCBAQAogICAgICAgICAgICAgICAiQ291bGQgbm90IG1hcCBQZXJmTWVtb3J5Iik7CiAgIH0KIAorICAvLyBpdCBkb2VzIG5vdCBnbyB0aHJvdWdoIG9zIGFwaSwgdGhlIG9wZXJhdGlvbiBoYXMgdG8gcmVjb3JkIGZyb20gaGVyZQorICBNZW1UcmFja2VyOjpyZWNvcmRfdmlydHVhbF9tZW1vcnlfcmVzZXJ2ZSgoYWRkcmVzcyltYXBBZGRyZXNzLCBzaXplLCBDVVJSRU5UX1BDKTsKKyAgTWVtVHJhY2tlcjo6cmVjb3JkX3ZpcnR1YWxfbWVtb3J5X3R5cGUoKGFkZHJlc3MpbWFwQWRkcmVzcywgbXRJbnRlcm5hbCk7CisKICAgKmFkZHIgPSBtYXBBZGRyZXNzOwogICAqc2l6ZXAgPSBzaXplOwogCmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9vcy93aW5kb3dzL3ZtL3BlcmZNZW1vcnlfd2luZG93cy5jcHAgYi9ob3RzcG90L3NyYy9vcy93aW5kb3dzL3ZtL3BlcmZNZW1vcnlfd2luZG93cy5jcHAKaW5kZXggMmM3NTUzOS4uMDYxYzlkOCAxMDA2NDQKLS0tIGEvaG90c3BvdC9zcmMvb3Mvd2luZG93cy92bS9wZXJmTWVtb3J5X3dpbmRvd3MuY3BwCisrKyBiL2hvdHNwb3Qvc3JjL29zL3dpbmRvd3Mvdm0vcGVyZk1lbW9yeV93aW5kb3dzLmNwcApAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgIm9zX3dpbmRvd3MuaW5saW5lLmhwcCIKICNpbmNsdWRlICJydW50aW1lL2hhbmRsZXMuaW5saW5lLmhwcCIKICNpbmNsdWRlICJydW50aW1lL3BlcmZNZW1vcnkuaHBwIgorI2luY2x1ZGUgInNlcnZpY2VzL21lbVRyYWNrZXIuaHBwIgogI2luY2x1ZGUgInV0aWxpdGllcy9leGNlcHRpb25zLmhwcCIKIAogI2luY2x1ZGUgPHdpbmRvd3MuaD4KQEAgLTE0OTYsNiArMTQ5NywxMCBAQAogICAvLyBjbGVhciB0aGUgc2hhcmVkIG1lbW9yeSByZWdpb24KICAgKHZvaWQpbWVtc2V0KG1hcEFkZHJlc3MsICdcMCcsIHNpemUpOwogCisgIC8vIGl0IGRvZXMgbm90IGdvIHRocm91Z2ggb3MgYXBpLCB0aGUgb3BlcmF0aW9uIGhhcyB0byByZWNvcmQgZnJvbSBoZXJlCisgIE1lbVRyYWNrZXI6OnJlY29yZF92aXJ0dWFsX21lbW9yeV9yZXNlcnZlKChhZGRyZXNzKW1hcEFkZHJlc3MsIHNpemUsIENVUlJFTlRfUEMpOworICBNZW1UcmFja2VyOjpyZWNvcmRfdmlydHVhbF9tZW1vcnlfdHlwZSgoYWRkcmVzcyltYXBBZGRyZXNzLCBtdEludGVybmFsKTsKKwogICByZXR1cm4gKGNoYXIqKSBtYXBBZGRyZXNzOwogfQogCkBAIC0xNjcyLDYgKzE2NzcsMTEgQEAKICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBtYXAgUGVyZk1lbW9yeSIpOwogICB9CiAKKyAgLy8gaXQgZG9lcyBub3QgZ28gdGhyb3VnaCBvcyBhcGksIHRoZSBvcGVyYXRpb24gaGFzIHRvIHJlY29yZCBmcm9tIGhlcmUKKyAgTWVtVHJhY2tlcjo6cmVjb3JkX3ZpcnR1YWxfbWVtb3J5X3Jlc2VydmUoKGFkZHJlc3MpbWFwQWRkcmVzcywgc2l6ZSwgQ1VSUkVOVF9QQyk7CisgIE1lbVRyYWNrZXI6OnJlY29yZF92aXJ0dWFsX21lbW9yeV90eXBlKChhZGRyZXNzKW1hcEFkZHJlc3MsIG10SW50ZXJuYWwpOworCisKICAgKmFkZHJwID0gKGNoYXIqKW1hcEFkZHJlc3M7CiAgICpzaXplcCA9IHNpemU7CiAKQEAgLTE4MjQsNiArMTgzNCw4IEBACiAgIH0KIAogICByZW1vdmVfZmlsZV9tYXBwaW5nKGFkZHIpOworICAvLyBpdCBkb2VzIG5vdCBnbyB0aHJvdWdoIG9zIGFwaSwgdGhlIG9wZXJhdGlvbiBoYXMgdG8gcmVjb3JkIGZyb20gaGVyZQorICBNZW1UcmFja2VyOjpyZWNvcmRfdmlydHVhbF9tZW1vcnlfcmVsZWFzZSgoYWRkcmVzcylhZGRyLCBieXRlcyk7CiB9CiAKIGNoYXIqIFBlcmZNZW1vcnk6OmJhY2tpbmdfc3RvcmVfZmlsZW5hbWUoKSB7CmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9zaGFyZS92bS9jMS9jMV9HcmFwaEJ1aWxkZXIuY3BwIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vYzEvYzFfR3JhcGhCdWlsZGVyLmNwcAppbmRleCAxYmJkYzVhLi45NDFkZDEyIDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9zaGFyZS92bS9jMS9jMV9HcmFwaEJ1aWxkZXIuY3BwCisrKyBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2MxL2MxX0dyYXBoQnVpbGRlci5jcHAKQEAgLTE4NDQsMTcgKzE4NDQsMTIgQEAKICAgICAgICAgY29kZSA9PSBCeXRlY29kZXM6Ol9pbnZva2V2aXJ0dWFsICYmIHRhcmdldC0+aXNfZmluYWxfbWV0aG9kKCkgfHwKICAgICAgICAgY29kZSA9PSBCeXRlY29kZXM6Ol9pbnZva2VkeW5hbWljKSB7CiAgICAgICBjaU1ldGhvZCogaW5saW5lX3RhcmdldCA9IChjaGFfbW9ub21vcnBoaWNfdGFyZ2V0ICE9IE5VTEwpID8gY2hhX21vbm9tb3JwaGljX3RhcmdldCA6IHRhcmdldDsKLSAgICAgIGJvb2wgc3VjY2VzcyA9IGZhbHNlOwotICAgICAgaWYgKHRhcmdldC0+aXNfbWV0aG9kX2hhbmRsZV9pbnRyaW5zaWMoKSkgewotICAgICAgICAvLyBtZXRob2QgaGFuZGxlIGludm9rZXMKLSAgICAgICAgc3VjY2VzcyA9IHRyeV9tZXRob2RfaGFuZGxlX2lubGluZSh0YXJnZXQpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gc3RhdGljIGJpbmRpbmcgPT4gY2hlY2sgaWYgY2FsbGVlIGlzIG9rCi0gICAgICAgIHN1Y2Nlc3MgPSB0cnlfaW5saW5lKGlubGluZV90YXJnZXQsIChjaGFfbW9ub21vcnBoaWNfdGFyZ2V0ICE9IE5VTEwpIHx8IChleGFjdF90YXJnZXQgIT0gTlVMTCksIGNvZGUsIGJldHRlcl9yZWNlaXZlcik7Ci0gICAgICB9Ci0gICAgICBDSEVDS19CQUlMT1VUKCk7CisgICAgICAvLyBzdGF0aWMgYmluZGluZyA9PiBjaGVjayBpZiBjYWxsZWUgaXMgb2sKKyAgICAgIGJvb2wgc3VjY2VzcyA9IHRyeV9pbmxpbmUoaW5saW5lX3RhcmdldCwgKGNoYV9tb25vbW9ycGhpY190YXJnZXQgIT0gTlVMTCkgfHwgKGV4YWN0X3RhcmdldCAhPSBOVUxMKSwgY29kZSwgYmV0dGVyX3JlY2VpdmVyKTsKIAorICAgICAgQ0hFQ0tfQkFJTE9VVCgpOwogICAgICAgY2xlYXJfaW5saW5lX2JhaWxvdXQoKTsKKwogICAgICAgaWYgKHN1Y2Nlc3MpIHsKICAgICAgICAgLy8gUmVnaXN0ZXIgZGVwZW5kZW5jZSBpZiBKVk1USSBoYXMgZWl0aGVyIGJyZWFrcG9pbnQKICAgICAgICAgLy8gc2V0dGluZyBvciBob3Rzd2FwcGluZyBvZiBtZXRob2RzIGNhcGFiaWxpdGllcyBzaW5jZSB0aGV5IG1heQpAQCAtMzIwMSw2ICszMTk2LDExIEBACiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAKKyAgLy8gbWV0aG9kIGhhbmRsZSBpbnZva2VzCisgIGlmIChjYWxsZWUtPmlzX21ldGhvZF9oYW5kbGVfaW50cmluc2ljKCkpIHsKKyAgICByZXR1cm4gdHJ5X21ldGhvZF9oYW5kbGVfaW5saW5lKGNhbGxlZSk7CisgIH0KKwogICAvLyBoYW5kbGUgaW50cmluc2ljcwogICBpZiAoY2FsbGVlLT5pbnRyaW5zaWNfaWQoKSAhPSB2bUludHJpbnNpY3M6Ol9ub25lKSB7CiAgICAgaWYgKHRyeV9pbmxpbmVfaW50cmluc2ljcyhjYWxsZWUpKSB7CkBAIC0zODg1LDEwICszODg1LDE0IEBACiAgICAgICBWYWx1ZVR5cGUqIHR5cGUgPSBzdGF0ZSgpLT5zdGFja19hdChhcmdzX2Jhc2UpLT50eXBlKCk7CiAgICAgICBpZiAodHlwZS0+aXNfY29uc3RhbnQoKSkgewogICAgICAgICBjaU1ldGhvZCogdGFyZ2V0ID0gdHlwZS0+YXNfT2JqZWN0VHlwZSgpLT5jb25zdGFudF92YWx1ZSgpLT5hc19tZXRob2RfaGFuZGxlKCktPmdldF92bXRhcmdldCgpOwotICAgICAgICBndWFyYW50ZWUoIXRhcmdldC0+aXNfbWV0aG9kX2hhbmRsZV9pbnRyaW5zaWMoKSwgInNob3VsZCBub3QgaGFwcGVuIik7ICAvLyBYWFggcmVtb3ZlCi0gICAgICAgIEJ5dGVjb2Rlczo6Q29kZSBiYyA9IHRhcmdldC0+aXNfc3RhdGljKCkgPyBCeXRlY29kZXM6Ol9pbnZva2VzdGF0aWMgOiBCeXRlY29kZXM6Ol9pbnZva2V2aXJ0dWFsOwotICAgICAgICBpZiAodHJ5X2lubGluZSh0YXJnZXQsIC8qaG9sZGVyX2tub3duKi8gdHJ1ZSwgYmMpKSB7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIC8vIFdlIGRvbid0IGRvIENIQSBoZXJlIHNvIG9ubHkgaW5saW5lIHN0YXRpYyBhbmQgc3RhdGljYWxseSBiaW5kYWJsZSBtZXRob2RzLgorICAgICAgICBpZiAodGFyZ2V0LT5pc19zdGF0aWMoKSB8fCB0YXJnZXQtPmNhbl9iZV9zdGF0aWNhbGx5X2JvdW5kKCkpIHsKKyAgICAgICAgICBCeXRlY29kZXM6OkNvZGUgYmMgPSB0YXJnZXQtPmlzX3N0YXRpYygpID8gQnl0ZWNvZGVzOjpfaW52b2tlc3RhdGljIDogQnl0ZWNvZGVzOjpfaW52b2tldmlydHVhbDsKKyAgICAgICAgICBpZiAodHJ5X2lubGluZSh0YXJnZXQsIC8qaG9sZGVyX2tub3duKi8gdHJ1ZSwgYmMpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcHJpbnRfaW5saW5pbmcodGFyZ2V0LCAibm90IHN0YXRpYyBvciBzdGF0aWNhbGx5IGJpbmRhYmxlIiwgLypzdWNjZXNzKi8gZmFsc2UpOwogICAgICAgICB9CiAgICAgICB9IGVsc2UgewogICAgICAgICBwcmludF9pbmxpbmluZyhjYWxsZWUsICJyZWNlaXZlciBub3QgY29uc3RhbnQiLCAvKnN1Y2Nlc3MqLyBmYWxzZSk7CkBAIC0zOTQxLDkgKzM5NDUsMTQgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGogKz0gdC0+c2l6ZSgpOyAgLy8gbG9uZyBhbmQgZG91YmxlIHRha2UgdHdvIHNsb3RzCiAgICAgICAgICAgfQotICAgICAgICAgIEJ5dGVjb2Rlczo6Q29kZSBiYyA9IHRhcmdldC0+aXNfc3RhdGljKCkgPyBCeXRlY29kZXM6Ol9pbnZva2VzdGF0aWMgOiBCeXRlY29kZXM6Ol9pbnZva2V2aXJ0dWFsOwotICAgICAgICAgIGlmICh0cnlfaW5saW5lKHRhcmdldCwgLypob2xkZXJfa25vd24qLyB0cnVlLCBiYykpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIC8vIFdlIGRvbid0IGRvIENIQSBoZXJlIHNvIG9ubHkgaW5saW5lIHN0YXRpYyBhbmQgc3RhdGljYWxseSBiaW5kYWJsZSBtZXRob2RzLgorICAgICAgICAgIGlmICh0YXJnZXQtPmlzX3N0YXRpYygpIHx8IHRhcmdldC0+Y2FuX2JlX3N0YXRpY2FsbHlfYm91bmQoKSkgeworICAgICAgICAgICAgQnl0ZWNvZGVzOjpDb2RlIGJjID0gdGFyZ2V0LT5pc19zdGF0aWMoKSA/IEJ5dGVjb2Rlczo6X2ludm9rZXN0YXRpYyA6IEJ5dGVjb2Rlczo6X2ludm9rZXZpcnR1YWw7CisgICAgICAgICAgICBpZiAodHJ5X2lubGluZSh0YXJnZXQsIC8qaG9sZGVyX2tub3duKi8gdHJ1ZSwgYmMpKSB7CisgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmludF9pbmxpbmluZyh0YXJnZXQsICJub3Qgc3RhdGljIG9yIHN0YXRpY2FsbHkgYmluZGFibGUiLCAvKnN1Y2Nlc3MqLyBmYWxzZSk7CiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICB9IGVsc2UgewpkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vY2xhc3NmaWxlL3ZtU3ltYm9scy5ocHAgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9jbGFzc2ZpbGUvdm1TeW1ib2xzLmhwcAppbmRleCAwNmZkYjM1Li4yZmViYzdiIDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9zaGFyZS92bS9jbGFzc2ZpbGUvdm1TeW1ib2xzLmhwcAorKysgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9jbGFzc2ZpbGUvdm1TeW1ib2xzLmhwcApAQCAtMTEwLDYgKzExMCw3IEBACiAgIHRlbXBsYXRlKHN1bl9qa2VybmVsX0Rvd25sb2FkTWFuYWdlciwgICAgICAgICAgICAgICAic3VuL2prZXJuZWwvRG93bmxvYWRNYW5hZ2VyIikgICAgICAgICAgICAgIFwKICAgdGVtcGxhdGUoZ2V0Qm9vdENsYXNzUGF0aEVudHJ5Rm9yQ2xhc3NfbmFtZSwgICAgICAgICJnZXRCb290Q2xhc3NQYXRoRW50cnlGb3JDbGFzcyIpICAgICAgICAgICAgXAogICB0ZW1wbGF0ZShzdW5fbWlzY19Qb3N0Vk1Jbml0SG9vaywgICAgICAgICAgICAgICAgICAgInN1bi9taXNjL1Bvc3RWTUluaXRIb29rIikgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlKHN1bl9taXNjX0xhdW5jaGVyX0V4dENsYXNzTG9hZGVyLCAgICAgICAgICAic3VuL21pc2MvTGF1bmNoZXIkRXh0Q2xhc3NMb2FkZXIiKSAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAvKiBKYXZhIHJ1bnRpbWUgdmVyc2lvbiBhY2Nlc3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIHRlbXBsYXRlKHN1bl9taXNjX1ZlcnNpb24sICAgICAgICAgICAgICAgICAgICAgICAgICAic3VuL21pc2MvVmVyc2lvbiIpICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTcyMyw2ICs3MjQsMjEgQEAKICAgLyogamF2YS9sYW5nL3JlZi9SZWZlcmVuY2UgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgZG9faW50cmluc2ljKF9SZWZlcmVuY2VfZ2V0LCAgICAgICAgICAgIGphdmFfbGFuZ19yZWZfUmVmZXJlbmNlLCBnZXRfbmFtZSwgICAgdm9pZF9vYmplY3Rfc2lnbmF0dXJlLCBGX1IpICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgLyogc3VwcG9ydCBmb3IgY29tLnN1bS5jcnlwdG8ucHJvdmlkZXIuQUVTQ3J5cHQgYW5kIHNvbWUgb2YgaXRzIGNhbGxlcnMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG9fY2xhc3MoY29tX3N1bl9jcnlwdG9fcHJvdmlkZXJfYWVzY3J5cHQsICAgICAgImNvbS9zdW4vY3J5cHRvL3Byb3ZpZGVyL0FFU0NyeXB0IikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG9faW50cmluc2ljKF9hZXNjcnlwdF9lbmNyeXB0QmxvY2ssIGNvbV9zdW5fY3J5cHRvX3Byb3ZpZGVyX2Flc2NyeXB0LCBlbmNyeXB0QmxvY2tfbmFtZSwgYnl0ZUFycmF5X2ludF9ieXRlQXJyYXlfaW50X3NpZ25hdHVyZSwgRl9SKSAgIFwKKyAgZG9faW50cmluc2ljKF9hZXNjcnlwdF9kZWNyeXB0QmxvY2ssIGNvbV9zdW5fY3J5cHRvX3Byb3ZpZGVyX2Flc2NyeXB0LCBkZWNyeXB0QmxvY2tfbmFtZSwgYnl0ZUFycmF5X2ludF9ieXRlQXJyYXlfaW50X3NpZ25hdHVyZSwgRl9SKSAgIFwKKyAgIGRvX25hbWUoICAgICBlbmNyeXB0QmxvY2tfbmFtZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW5jcnlwdEJsb2NrIikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIGRvX25hbWUoICAgICBkZWNyeXB0QmxvY2tfbmFtZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVjcnlwdEJsb2NrIikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIGRvX3NpZ25hdHVyZShieXRlQXJyYXlfaW50X2J5dGVBcnJheV9pbnRfc2lnbmF0dXJlLCAgICAgICAgICAgICAiKFtCSVtCSSlWIikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG9fY2xhc3MoY29tX3N1bl9jcnlwdG9fcHJvdmlkZXJfY2lwaGVyQmxvY2tDaGFpbmluZywgICAgICAgICAgICAiY29tL3N1bi9jcnlwdG8vcHJvdmlkZXIvQ2lwaGVyQmxvY2tDaGFpbmluZyIpICAgICAgIFwKKyAgIGRvX2ludHJpbnNpYyhfY2lwaGVyQmxvY2tDaGFpbmluZ19lbmNyeXB0QUVTQ3J5cHQsIGNvbV9zdW5fY3J5cHRvX3Byb3ZpZGVyX2NpcGhlckJsb2NrQ2hhaW5pbmcsIGVuY3J5cHRfbmFtZSwgYnl0ZUFycmF5X2ludF9pbnRfYnl0ZUFycmF5X2ludF9zaWduYXR1cmUsIEZfUikgICBcCisgICBkb19pbnRyaW5zaWMoX2NpcGhlckJsb2NrQ2hhaW5pbmdfZGVjcnlwdEFFU0NyeXB0LCBjb21fc3VuX2NyeXB0b19wcm92aWRlcl9jaXBoZXJCbG9ja0NoYWluaW5nLCBkZWNyeXB0X25hbWUsIGJ5dGVBcnJheV9pbnRfaW50X2J5dGVBcnJheV9pbnRfc2lnbmF0dXJlLCBGX1IpICAgXAorICAgZG9fbmFtZSggICAgIGVuY3J5cHRfbmFtZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbmNyeXB0IikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgZG9fbmFtZSggICAgIGRlY3J5cHRfbmFtZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZWNyeXB0IikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgZG9fc2lnbmF0dXJlKGJ5dGVBcnJheV9pbnRfaW50X2J5dGVBcnJheV9pbnRfc2lnbmF0dXJlLCAgICAgICAgICIoW0JJSVtCSSlWIikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAvKiBzdXBwb3J0IGZvciBzdW4ubWlzYy5VbnNhZmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICBkb19jbGFzcyhzdW5fbWlzY19VbnNhZmUsICAgICAgICAgICAgICAgInN1bi9taXNjL1Vuc2FmZSIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vY29tcGlsZXIvY29tcGlsZXJPcmFjbGUuY3BwIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vY29tcGlsZXIvY29tcGlsZXJPcmFjbGUuY3BwCmluZGV4IGJkZDM0OTEuLmJmNjkxYmMgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2NvbXBpbGVyL2NvbXBpbGVyT3JhY2xlLmNwcAorKysgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9jb21waWxlci9jb21waWxlck9yYWNsZS5jcHAKQEAgLTU3NCw3ICs1NzQsNyBAQAogICBjaGFyIHRva2VuWzEwMjRdOwogICBpbnQgIHBvcyA9IDA7CiAgIGludCAgYyA9IGdldGMoc3RyZWFtKTsKLSAgd2hpbGUoYyAhPSBFT0YpIHsKKyAgd2hpbGUoYyAhPSBFT0YgJiYgcG9zIDwgKGludCkoc2l6ZW9mKHRva2VuKS0xKSkgewogICAgIGlmIChjID09ICdcbicpIHsKICAgICAgIHRva2VuW3BvcysrXSA9ICdcMCc7CiAgICAgICBwYXJzZV9mcm9tX2xpbmUodG9rZW4pOwpAQCAtNTk1LDcgKzU5NSw3IEBACiAgIGludCAgcG9zID0gMDsKICAgY29uc3QgY2hhciogc3AgPSBzdHI7CiAgIGludCAgYyA9ICpzcCsrOwotICB3aGlsZSAoYyAhPSAnXDAnKSB7CisgIHdoaWxlIChjICE9ICdcMCcgJiYgcG9zIDwgKGludCkoc2l6ZW9mKHRva2VuKS0xKSkgewogICAgIGlmIChjID09ICdcbicpIHsKICAgICAgIHRva2VuW3BvcysrXSA9ICdcMCc7CiAgICAgICBwYXJzZV9saW5lKHRva2VuKTsKZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2djX2ltcGxlbWVudGF0aW9uL2NvbmN1cnJlbnRNYXJrU3dlZXAvYWRhcHRpdmVGcmVlTGlzdC5jcHAgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9nY19pbXBsZW1lbnRhdGlvbi9jb25jdXJyZW50TWFya1N3ZWVwL2FkYXB0aXZlRnJlZUxpc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxZTBlODcKLS0tIC9kZXYvbnVsbAorKysgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9nY19pbXBsZW1lbnRhdGlvbi9jb25jdXJyZW50TWFya1N3ZWVwL2FkYXB0aXZlRnJlZUxpc3QuY3BwCkBAIC0wLDAgKzEsMTc1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCisgKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CisgKiBxdWVzdGlvbnMuCisgKgorICovCisKKyNpbmNsdWRlICJwcmVjb21waWxlZC5ocHAiCisjaW5jbHVkZSAiZ2NfaW1wbGVtZW50YXRpb24vY29uY3VycmVudE1hcmtTd2VlcC9hZGFwdGl2ZUZyZWVMaXN0LmhwcCIKKyNpbmNsdWRlICJnY19pbXBsZW1lbnRhdGlvbi9jb25jdXJyZW50TWFya1N3ZWVwL2ZyZWVDaHVuay5ocHAiCisjaW5jbHVkZSAibWVtb3J5L2ZyZWVCbG9ja0RpY3Rpb25hcnkuaHBwIgorI2luY2x1ZGUgIm1lbW9yeS9zaGFyZWRIZWFwLmhwcCIKKyNpbmNsdWRlICJydW50aW1lL2dsb2JhbHMuaHBwIgorI2luY2x1ZGUgInJ1bnRpbWUvbXV0ZXguaHBwIgorI2luY2x1ZGUgInJ1bnRpbWUvdm1UaHJlYWQuaHBwIgorCit0ZW1wbGF0ZSA8Pgordm9pZCBBZGFwdGl2ZUZyZWVMaXN0PEZyZWVDaHVuaz46OnByaW50X29uKG91dHB1dFN0cmVhbSogc3QsIGNvbnN0IGNoYXIqIGMpIGNvbnN0IHsKKyAgaWYgKGMgIT0gTlVMTCkgeworICAgIHN0LT5wcmludCgiJTE2cyIsIGMpOworICB9IGVsc2UgeworICAgIHN0LT5wcmludChTSVpFX0ZPUk1BVF9XKDE2KSwgc2l6ZSgpKTsKKyAgfQorICBzdC0+cHJpbnQoIlx0IgorICAgICAgICAgICBTU0laRV9GT1JNQVRfVygxNCkgIlx0IiBTU0laRV9GT1JNQVRfVygxNCkgIlx0IiBTU0laRV9GT1JNQVRfVygxNCkgIlx0IiBTU0laRV9GT1JNQVRfVygxNCkgIlx0IiBTU0laRV9GT1JNQVRfVygxNCkgIlx0IgorICAgICAgICAgICBTU0laRV9GT1JNQVRfVygxNCkgIlx0IiBTU0laRV9GT1JNQVRfVygxNCkgIlx0IiBTU0laRV9GT1JNQVRfVygxNCkgIlx0IiBTU0laRV9GT1JNQVRfVygxNCkgIlx0IiBTU0laRV9GT1JNQVRfVygxNCkgIlxuIiwKKyAgICAgICAgICAgYmZyX3N1cnAoKSwgICAgICAgICAgICAgc3VycGx1cygpLCAgICAgICAgICAgICBkZXNpcmVkKCksICAgICAgICAgICAgIHByZXZfc3dlZXAoKSwgICAgICAgICAgIGJlZm9yZV9zd2VlcCgpLAorICAgICAgICAgICBjb3VudCgpLCAgICAgICAgICAgICAgIGNvYWxfYmlydGhzKCksICAgICAgICAgIGNvYWxfZGVhdGhzKCksICAgICAgICAgIHNwbGl0X2JpcnRocygpLCAgICAgICAgIHNwbGl0X2RlYXRocygpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIENodW5rPgorQWRhcHRpdmVGcmVlTGlzdDxDaHVuaz46OkFkYXB0aXZlRnJlZUxpc3QoKSA6IEZyZWVMaXN0PENodW5rPigpLCBfaGludCgwKSB7CisgIGluaXRfc3RhdGlzdGljcygpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgQ2h1bms+CitBZGFwdGl2ZUZyZWVMaXN0PENodW5rPjo6QWRhcHRpdmVGcmVlTGlzdChDaHVuayogZmMpIDogRnJlZUxpc3Q8Q2h1bms+KGZjKSwgX2hpbnQoMCkgeworICBpbml0X3N0YXRpc3RpY3MoKTsKKyNpZm5kZWYgUFJPRFVDVAorICBfYWxsb2NhdGlvbl9zdGF0cy5zZXRfcmV0dXJuZWRfYnl0ZXMoc2l6ZSgpICogSGVhcFdvcmRTaXplKTsKKyNlbmRpZgorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgQ2h1bms+Cit2b2lkIEFkYXB0aXZlRnJlZUxpc3Q8Q2h1bms+Ojppbml0aWFsaXplKCkgeworICBGcmVlTGlzdDxDaHVuaz46OmluaXRpYWxpemUoKTsKKyAgc2V0X2hpbnQoMCk7CisgIGluaXRfc3RhdGlzdGljcyh0cnVlIC8qIHNwbGl0X2JpcnRoICovKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIENodW5rPgordm9pZCBBZGFwdGl2ZUZyZWVMaXN0PENodW5rPjo6cmVzZXQoc2l6ZV90IGhpbnQpIHsKKyAgRnJlZUxpc3Q8Q2h1bms+OjpyZXNldCgpOworICBzZXRfaGludChoaW50KTsKK30KKworI2lmbmRlZiBQUk9EVUNUCit0ZW1wbGF0ZSA8Y2xhc3MgQ2h1bms+Cit2b2lkIEFkYXB0aXZlRnJlZUxpc3Q8Q2h1bms+Ojphc3NlcnRfcHJvcGVyX2xvY2tfcHJvdGVjdGlvbl93b3JrKCkgY29uc3QgeworICBhc3NlcnQocHJvdGVjdGluZ19sb2NrKCkgIT0gTlVMTCwgIkRvbid0IGNhbGwgdGhpcyBkaXJlY3RseSIpOworICBhc3NlcnQoUGFyYWxsZWxHQ1RocmVhZHMgPiAwLCAiRG9uJ3QgY2FsbCB0aGlzIGRpcmVjdGx5Iik7CisgIFRocmVhZCogdGhyID0gVGhyZWFkOjpjdXJyZW50KCk7CisgIGlmICh0aHItPmlzX1ZNX3RocmVhZCgpIHx8IHRoci0+aXNfQ29uY3VycmVudEdDX3RocmVhZCgpKSB7CisgICAgLy8gYXNzZXJ0IHRoYXQgd2UgYXJlIGhvbGRpbmcgdGhlIGZyZWVsaXN0IGxvY2sKKyAgfSBlbHNlIGlmICh0aHItPmlzX0dDX3Rhc2tfdGhyZWFkKCkpIHsKKyAgICBhc3NlcnQocHJvdGVjdGluZ19sb2NrKCktPm93bmVkX2J5X3NlbGYoKSwgIkZyZWVMaXN0IFJBQ0UgREVURUNURUQiKTsKKyAgfSBlbHNlIGlmICh0aHItPmlzX0phdmFfdGhyZWFkKCkpIHsKKyAgICBhc3NlcnQoIVNhZmVwb2ludFN5bmNocm9uaXplOjppc19hdF9zYWZlcG9pbnQoKSwgIlNob3VsZCBub3QgYmUgZXhlY3V0aW5nIik7CisgIH0gZWxzZSB7CisgICAgU2hvdWxkTm90UmVhY2hIZXJlKCk7ICAvLyB1bmFjY291bnRlZCB0aHJlYWQgdHlwZT8KKyAgfQorfQorI2VuZGlmCit0ZW1wbGF0ZSA8Y2xhc3MgQ2h1bms+Cit2b2lkIEFkYXB0aXZlRnJlZUxpc3Q8Q2h1bms+Ojppbml0X3N0YXRpc3RpY3MoYm9vbCBzcGxpdF9iaXJ0aCkgeworICBfYWxsb2NhdGlvbl9zdGF0cy5pbml0aWFsaXplKHNwbGl0X2JpcnRoKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIENodW5rPgorc2l6ZV90IEFkYXB0aXZlRnJlZUxpc3Q8Q2h1bms+OjpnZXRfYmV0dGVyX3NpemUoKSB7CisKKyAgLy8gQSBjYW5kaWRhdGUgY2h1bmsgaGFzIGJlZW4gZm91bmQuICBJZiBpdCBpcyBhbHJlYWR5IHVuZGVyCisgIC8vIHBvcHVsYXRlZCBhbmQgdGhlcmUgaXMgYSBoaW5ULCBSRXR1cm4gdGhlIGhpbnQoKS4gIEVsc2UKKyAgLy8gcmV0dXJuIHRoZSBzaXplIG9mIHRoaXMgY2h1bmsuCisgIGlmIChzdXJwbHVzKCkgPD0gMCkgeworICAgIGlmIChoaW50KCkgIT0gMCkgeworICAgICAgcmV0dXJuIGhpbnQoKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIHNpemUoKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLy8gVGhpcyBsaXN0IGhhcyBhIHN1cnBsdXMgc28gdXNlIGl0LgorICAgIHJldHVybiBzaXplKCk7CisgIH0KK30KKworCit0ZW1wbGF0ZSA8Y2xhc3MgQ2h1bms+Cit2b2lkIEFkYXB0aXZlRnJlZUxpc3Q8Q2h1bms+OjpyZXR1cm5fY2h1bmtfYXRfaGVhZChDaHVuayogY2h1bmspIHsKKyAgYXNzZXJ0X3Byb3Blcl9sb2NrX3Byb3RlY3Rpb24oKTsKKyAgcmV0dXJuX2NodW5rX2F0X2hlYWQoY2h1bmssIHRydWUpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgQ2h1bms+Cit2b2lkIEFkYXB0aXZlRnJlZUxpc3Q8Q2h1bms+OjpyZXR1cm5fY2h1bmtfYXRfaGVhZChDaHVuayogY2h1bmssIGJvb2wgcmVjb3JkX3JldHVybikgeworICBGcmVlTGlzdDxDaHVuaz46OnJldHVybl9jaHVua19hdF9oZWFkKGNodW5rLCByZWNvcmRfcmV0dXJuKTsKKyNpZmRlZiBBU1NFUlQKKyAgaWYgKHJlY29yZF9yZXR1cm4pIHsKKyAgICBpbmNyZW1lbnRfcmV0dXJuZWRfYnl0ZXNfYnkoc2l6ZSgpKkhlYXBXb3JkU2l6ZSk7CisgIH0KKyNlbmRpZgorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgQ2h1bms+Cit2b2lkIEFkYXB0aXZlRnJlZUxpc3Q8Q2h1bms+OjpyZXR1cm5fY2h1bmtfYXRfdGFpbChDaHVuayogY2h1bmspIHsKKyAgcmV0dXJuX2NodW5rX2F0X3RhaWwoY2h1bmssIHRydWUpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgQ2h1bms+Cit2b2lkIEFkYXB0aXZlRnJlZUxpc3Q8Q2h1bms+OjpyZXR1cm5fY2h1bmtfYXRfdGFpbChDaHVuayogY2h1bmssIGJvb2wgcmVjb3JkX3JldHVybikgeworICBGcmVlTGlzdDxDaHVuaz46OnJldHVybl9jaHVua19hdF90YWlsKGNodW5rLCByZWNvcmRfcmV0dXJuKTsKKyNpZmRlZiBBU1NFUlQKKyAgaWYgKHJlY29yZF9yZXR1cm4pIHsKKyAgICBpbmNyZW1lbnRfcmV0dXJuZWRfYnl0ZXNfYnkoc2l6ZSgpKkhlYXBXb3JkU2l6ZSk7CisgIH0KKyNlbmRpZgorfQorCisjaWZuZGVmIFBST0RVQ1QKK3RlbXBsYXRlIDxjbGFzcyBDaHVuaz4KK3ZvaWQgQWRhcHRpdmVGcmVlTGlzdDxDaHVuaz46OnZlcmlmeV9zdGF0cygpIGNvbnN0IHsKKyAgLy8gVGhlICsxIG9mIHRoZSBMSCBjb21wYXJhbmQgaXMgdG8gYWxsb3cgc29tZSAibG9vc2VuZXNzIiBpbgorICAvLyBjaGVja2luZzogd2UgdXN1YWxseSBjYWxsIHRoaXMgaW50ZXJmYWNlIHdoZW4gYWRkaW5nIGEgYmxvY2sKKyAgLy8gYW5kIHdlJ2xsIHN1YnNlcXVlbnRseSB1cGRhdGUgdGhlIHN0YXRzOyB3ZSBjYW5ub3QgdXBkYXRlIHRoZQorICAvLyBzdGF0cyBiZWZvcmVoYW5kIGJlY2F1c2UgaW4gdGhlIGNhc2Ugb2YgdGhlIGxhcmdlLWJsb2NrIEJUCisgIC8vIGRpY3Rpb25hcnkgZm9yIGV4YW1wbGUsIHRoaXMgbWlnaHQgYmUgdGhlIGZpcnN0IGJsb2NrIGFuZAorICAvLyBpbiB0aGF0IGNhc2UgdGhlcmUgd291bGQgYmUgbm8gcGxhY2UgdGhhdCB3ZSBjb3VsZCByZWNvcmQKKyAgLy8gdGhlIHN0YXRzICh3aGljaCBhcmUga2VwdCBpbiB0aGUgYmxvY2sgaXRzZWxmKS4KKyAgYXNzZXJ0KChfYWxsb2NhdGlvbl9zdGF0cy5wcmV2X3N3ZWVwKCkgKyBfYWxsb2NhdGlvbl9zdGF0cy5zcGxpdF9iaXJ0aHMoKQorICAgICAgICAgICsgX2FsbG9jYXRpb25fc3RhdHMuY29hbF9iaXJ0aHMoKSArIDEpICAgLy8gVG90YWwgUHJvZHVjdGlvbiBTdG9jayArIDEKKyAgICAgICAgID49IChfYWxsb2NhdGlvbl9zdGF0cy5zcGxpdF9kZWF0aHMoKSArIF9hbGxvY2F0aW9uX3N0YXRzLmNvYWxfZGVhdGhzKCkKKyAgICAgICAgICAgICArIChzc2l6ZV90KWNvdW50KCkpLCAgICAgICAgICAgICAgICAvLyBUb3RhbCBDdXJyZW50IFN0b2NrICsgZGVwbGV0aW9uCisgICAgICAgICBlcnJfbXNnKCJGcmVlTGlzdCAiIFBUUl9GT1JNQVQgIiBvZiBzaXplICIgU0laRV9GT1JNQVQKKyAgICAgICAgICAgICAgICAgIiB2aW9sYXRlcyBDb25zZXJ2YXRpb24gUHJpbmNpcGxlOiAiCisgICAgICAgICAgICAgICAgICJwcmV2X3N3ZWVwKCIgU0laRV9GT1JNQVQgIikiCisgICAgICAgICAgICAgICAgICIgKyBzcGxpdF9iaXJ0aHMoIiBTSVpFX0ZPUk1BVCAiKSIKKyAgICAgICAgICAgICAgICAgIiArIGNvYWxfYmlydGhzKCIgU0laRV9GT1JNQVQgIikgKyAxID49ICIKKyAgICAgICAgICAgICAgICAgIiBzcGxpdF9kZWF0aHMoIiBTSVpFX0ZPUk1BVCAiKSIKKyAgICAgICAgICAgICAgICAgIiBjb2FsX2RlYXRocygiIFNJWkVfRk9STUFUICIpIgorICAgICAgICAgICAgICAgICAiICsgY291bnQoIiBTU0laRV9GT1JNQVQgIikiLAorICAgICAgICAgICAgICAgICB0aGlzLCBzaXplKCksIF9hbGxvY2F0aW9uX3N0YXRzLnByZXZfc3dlZXAoKSwgX2FsbG9jYXRpb25fc3RhdHMuc3BsaXRfYmlydGhzKCksCisgICAgICAgICAgICAgICAgIF9hbGxvY2F0aW9uX3N0YXRzLnNwbGl0X2JpcnRocygpLCBfYWxsb2NhdGlvbl9zdGF0cy5zcGxpdF9kZWF0aHMoKSwKKyAgICAgICAgICAgICAgICAgX2FsbG9jYXRpb25fc3RhdHMuY29hbF9kZWF0aHMoKSwgY291bnQoKSkpOworfQorI2VuZGlmCisKKy8vIE5lZWRzIHRvIGJlIGFmdGVyIHRoZSBkZWZpbml0aW9ucyBoYXZlIGJlZW4gc2Vlbi4KK3RlbXBsYXRlIGNsYXNzIEFkYXB0aXZlRnJlZUxpc3Q8RnJlZUNodW5rPjsKZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2djX2ltcGxlbWVudGF0aW9uL2NvbmN1cnJlbnRNYXJrU3dlZXAvYWRhcHRpdmVGcmVlTGlzdC5ocHAgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9nY19pbXBsZW1lbnRhdGlvbi9jb25jdXJyZW50TWFya1N3ZWVwL2FkYXB0aXZlRnJlZUxpc3QuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiNTZiYjEKLS0tIC9kZXYvbnVsbAorKysgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9nY19pbXBsZW1lbnRhdGlvbi9jb25jdXJyZW50TWFya1N3ZWVwL2FkYXB0aXZlRnJlZUxpc3QuaHBwCkBAIC0wLDAgKzEsMjMyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEwLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCisgKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CisgKiBxdWVzdGlvbnMuCisgKgorICovCisKKyNpZm5kZWYgU0hBUkVfVk1fTUVNT1JZX0FEQVBUSVZFRlJFRUxJU1RfSFBQCisjZGVmaW5lIFNIQVJFX1ZNX01FTU9SWV9BREFQVElWRUZSRUVMSVNUX0hQUAorCisjaW5jbHVkZSAibWVtb3J5L2ZyZWVMaXN0LmhwcCIKKyNpbmNsdWRlICJnY19pbXBsZW1lbnRhdGlvbi9zaGFyZWQvYWxsb2NhdGlvblN0YXRzLmhwcCIKKworY2xhc3MgQ29tcGFjdGlibGVGcmVlTGlzdFNwYWNlOworCisvLyBBIGNsYXNzIGZvciBtYWludGFpbmluZyBhIGZyZWUgbGlzdCBvZiBDaHVuaydzLiAgVGhlIEZyZWVMaXN0CisvLyBtYWludGFpbnMgYSB0aGUgc3RydWN0dXJlIG9mIHRoZSBsaXN0IChoZWFkLCB0YWlsLCBldGMuKSBwbHVzCisvLyBzdGF0aXN0aWNzIGZvciBhbGxvY2F0aW9ucyBmcm9tIHRoZSBsaXN0LiAgVGhlIGxpbmtzIGJldHdlZW4gaXRlbXMKKy8vIGFyZSBub3QgcGFydCBvZiBGcmVlTGlzdC4gIFRoZSBzdGF0aXN0aWNzIGFyZQorLy8gdXNlZCB0byBtYWtlIGRlY2lzaW9ucyBhYm91dCBjb2FsZXNjaW5nIENodW5rJ3Mgd2hlbiB0aGV5CisvLyBhcmUgc3dlcHQgZHVyaW5nIGNvbGxlY3Rpb24uCisvLworLy8gU2VlIHRoZSBjb3JyZXNwb25kaW5nIC5jcHAgZmlsZSBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgc3BlY2lmaWNzCisvLyBmb3IgdGhhdCBpbXBsZW1lbnRhdGlvbi4KKworY2xhc3MgTXV0ZXg7CisKK3RlbXBsYXRlIDxjbGFzcyBDaHVuaz4KK2NsYXNzIEFkYXB0aXZlRnJlZUxpc3QgOiBwdWJsaWMgRnJlZUxpc3Q8Q2h1bms+IHsKKyAgZnJpZW5kIGNsYXNzIENvbXBhY3RpYmxlRnJlZUxpc3RTcGFjZTsKKyAgZnJpZW5kIGNsYXNzIFZNU3RydWN0czsKKyAgLy8gZnJpZW5kIGNsYXNzIFByaW50VHJlZUNlbnN1c0Nsb3N1cmU8Q2h1bmssIEZyZWVMaXN0X3Q+OworCisgIHNpemVfdCAgICAgICAgX2hpbnQ7ICAgICAgICAgIC8vIG5leHQgbGFyZ2VyIHNpemUgbGlzdCB3aXRoIGEgcG9zaXRpdmUgc3VycGx1cworCisgIEFsbG9jYXRpb25TdGF0cyBfYWxsb2NhdGlvbl9zdGF0czsgLy8gYWxsb2NhdGlvbi1yZWxhdGVkIHN0YXRpc3RpY3MKKworIHB1YmxpYzoKKworICBBZGFwdGl2ZUZyZWVMaXN0KCk7CisgIEFkYXB0aXZlRnJlZUxpc3QoQ2h1bmsqIGZjKTsKKworICB1c2luZyBGcmVlTGlzdDxDaHVuaz46OmFzc2VydF9wcm9wZXJfbG9ja19wcm90ZWN0aW9uOworI2lmZGVmIEFTU0VSVAorICB1c2luZyBGcmVlTGlzdDxDaHVuaz46OnByb3RlY3RpbmdfbG9jazsKKyNlbmRpZgorICB1c2luZyBGcmVlTGlzdDxDaHVuaz46OmNvdW50OworICB1c2luZyBGcmVlTGlzdDxDaHVuaz46OnNpemU7CisgIHVzaW5nIEZyZWVMaXN0PENodW5rPjo6dmVyaWZ5X2NodW5rX2luX2ZyZWVfbGlzdDsKKyAgdXNpbmcgRnJlZUxpc3Q8Q2h1bms+OjpnZXRGaXJzdE5DaHVua3NGcm9tTGlzdDsKKyAgdXNpbmcgRnJlZUxpc3Q8Q2h1bms+OjpwcmludF9vbjsKKyAgdm9pZCByZXR1cm5fY2h1bmtfYXRfaGVhZChDaHVuayogZmMsIGJvb2wgcmVjb3JkX3JldHVybik7CisgIHZvaWQgcmV0dXJuX2NodW5rX2F0X2hlYWQoQ2h1bmsqIGZjKTsKKyAgdm9pZCByZXR1cm5fY2h1bmtfYXRfdGFpbChDaHVuayogZmMsIGJvb2wgcmVjb3JkX3JldHVybik7CisgIHZvaWQgcmV0dXJuX2NodW5rX2F0X3RhaWwoQ2h1bmsqIGZjKTsKKyAgdXNpbmcgRnJlZUxpc3Q8Q2h1bms+OjpyZXR1cm5fY2h1bmtfYXRfdGFpbDsKKyAgdXNpbmcgRnJlZUxpc3Q8Q2h1bms+OjpyZW1vdmVfY2h1bms7CisgIHVzaW5nIEZyZWVMaXN0PENodW5rPjo6cHJlcGVuZDsKKyAgdXNpbmcgRnJlZUxpc3Q8Q2h1bms+OjpwcmludF9sYWJlbHNfb247CisgIHVzaW5nIEZyZWVMaXN0PENodW5rPjo6Z2V0X2NodW5rX2F0X2hlYWQ7CisKKyAgLy8gSW5pdGlhbGl6ZS4KKyAgdm9pZCBpbml0aWFsaXplKCk7CisKKyAgLy8gUmVzZXQgdGhlIGhlYWQsIHRhaWwsIGhpbnQsIGFuZCBjb3VudCBvZiBhIGZyZWUgbGlzdC4KKyAgdm9pZCByZXNldChzaXplX3QgaGludCk7CisKKyAgdm9pZCBhc3NlcnRfcHJvcGVyX2xvY2tfcHJvdGVjdGlvbl93b3JrKCkgY29uc3QgUFJPRFVDVF9SRVRVUk47CisKKyAgdm9pZCBwcmludF9vbihvdXRwdXRTdHJlYW0qIHN0LCBjb25zdCBjaGFyKiBjID0gTlVMTCkgY29uc3Q7CisKKyAgc2l6ZV90IGhpbnQoKSBjb25zdCB7CisgICAgcmV0dXJuIF9oaW50OworICB9CisgIHZvaWQgc2V0X2hpbnQoc2l6ZV90IHYpIHsKKyAgICBhc3NlcnRfcHJvcGVyX2xvY2tfcHJvdGVjdGlvbigpOworICAgIGFzc2VydCh2ID09IDAgfHwgc2l6ZSgpIDwgdiwgIkJhZCBoaW50Iik7CisgICAgX2hpbnQgPSB2OworICB9CisKKyAgc2l6ZV90IGdldF9iZXR0ZXJfc2l6ZSgpOworCisgIC8vIEFjY2Vzc29ycyBmb3Igc3RhdGlzdGljcworICB2b2lkIGluaXRfc3RhdGlzdGljcyhib29sIHNwbGl0X2JpcnRoID0gZmFsc2UpOworCisgIEFsbG9jYXRpb25TdGF0cyogYWxsb2NhdGlvbl9zdGF0cygpIHsKKyAgICBhc3NlcnRfcHJvcGVyX2xvY2tfcHJvdGVjdGlvbigpOworICAgIHJldHVybiAmX2FsbG9jYXRpb25fc3RhdHM7CisgIH0KKworICBzc2l6ZV90IGRlc2lyZWQoKSBjb25zdCB7CisgICAgcmV0dXJuIF9hbGxvY2F0aW9uX3N0YXRzLmRlc2lyZWQoKTsKKyAgfQorICB2b2lkIHNldF9kZXNpcmVkKHNzaXplX3QgdikgeworICAgIGFzc2VydF9wcm9wZXJfbG9ja19wcm90ZWN0aW9uKCk7CisgICAgX2FsbG9jYXRpb25fc3RhdHMuc2V0X2Rlc2lyZWQodik7CisgIH0KKyAgdm9pZCBjb21wdXRlX2Rlc2lyZWQoZmxvYXQgaW50ZXJfc3dlZXBfY3VycmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgaW50ZXJfc3dlZXBfZXN0aW1hdGUsCisgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGludHJhX3N3ZWVwX2VzdGltYXRlKSB7CisgICAgYXNzZXJ0X3Byb3Blcl9sb2NrX3Byb3RlY3Rpb24oKTsKKyAgICBfYWxsb2NhdGlvbl9zdGF0cy5jb21wdXRlX2Rlc2lyZWQoY291bnQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJfc3dlZXBfY3VycmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJfc3dlZXBfZXN0aW1hdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHJhX3N3ZWVwX2VzdGltYXRlKTsKKyAgfQorICBzc2l6ZV90IGNvYWxfZGVzaXJlZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gX2FsbG9jYXRpb25fc3RhdHMuY29hbF9kZXNpcmVkKCk7CisgIH0KKyAgdm9pZCBzZXRfY29hbF9kZXNpcmVkKHNzaXplX3QgdikgeworICAgIGFzc2VydF9wcm9wZXJfbG9ja19wcm90ZWN0aW9uKCk7CisgICAgX2FsbG9jYXRpb25fc3RhdHMuc2V0X2NvYWxfZGVzaXJlZCh2KTsKKyAgfQorCisgIHNzaXplX3Qgc3VycGx1cygpIGNvbnN0IHsKKyAgICByZXR1cm4gX2FsbG9jYXRpb25fc3RhdHMuc3VycGx1cygpOworICB9CisgIHZvaWQgc2V0X3N1cnBsdXMoc3NpemVfdCB2KSB7CisgICAgYXNzZXJ0X3Byb3Blcl9sb2NrX3Byb3RlY3Rpb24oKTsKKyAgICBfYWxsb2NhdGlvbl9zdGF0cy5zZXRfc3VycGx1cyh2KTsKKyAgfQorICB2b2lkIGluY3JlbWVudF9zdXJwbHVzKCkgeworICAgIGFzc2VydF9wcm9wZXJfbG9ja19wcm90ZWN0aW9uKCk7CisgICAgX2FsbG9jYXRpb25fc3RhdHMuaW5jcmVtZW50X3N1cnBsdXMoKTsKKyAgfQorICB2b2lkIGRlY3JlbWVudF9zdXJwbHVzKCkgeworICAgIGFzc2VydF9wcm9wZXJfbG9ja19wcm90ZWN0aW9uKCk7CisgICAgX2FsbG9jYXRpb25fc3RhdHMuZGVjcmVtZW50X3N1cnBsdXMoKTsKKyAgfQorCisgIHNzaXplX3QgYmZyX3N1cnAoKSBjb25zdCB7CisgICAgcmV0dXJuIF9hbGxvY2F0aW9uX3N0YXRzLmJmcl9zdXJwKCk7CisgIH0KKyAgdm9pZCBzZXRfYmZyX3N1cnAoc3NpemVfdCB2KSB7CisgICAgYXNzZXJ0X3Byb3Blcl9sb2NrX3Byb3RlY3Rpb24oKTsKKyAgICBfYWxsb2NhdGlvbl9zdGF0cy5zZXRfYmZyX3N1cnAodik7CisgIH0KKyAgc3NpemVfdCBwcmV2X3N3ZWVwKCkgY29uc3QgeworICAgIHJldHVybiBfYWxsb2NhdGlvbl9zdGF0cy5wcmV2X3N3ZWVwKCk7CisgIH0KKyAgdm9pZCBzZXRfcHJldl9zd2VlcChzc2l6ZV90IHYpIHsKKyAgICBhc3NlcnRfcHJvcGVyX2xvY2tfcHJvdGVjdGlvbigpOworICAgIF9hbGxvY2F0aW9uX3N0YXRzLnNldF9wcmV2X3N3ZWVwKHYpOworICB9CisgIHNzaXplX3QgYmVmb3JlX3N3ZWVwKCkgY29uc3QgeworICAgIHJldHVybiBfYWxsb2NhdGlvbl9zdGF0cy5iZWZvcmVfc3dlZXAoKTsKKyAgfQorICB2b2lkIHNldF9iZWZvcmVfc3dlZXAoc3NpemVfdCB2KSB7CisgICAgYXNzZXJ0X3Byb3Blcl9sb2NrX3Byb3RlY3Rpb24oKTsKKyAgICBfYWxsb2NhdGlvbl9zdGF0cy5zZXRfYmVmb3JlX3N3ZWVwKHYpOworICB9CisKKyAgc3NpemVfdCBjb2FsX2JpcnRocygpIGNvbnN0IHsKKyAgICByZXR1cm4gX2FsbG9jYXRpb25fc3RhdHMuY29hbF9iaXJ0aHMoKTsKKyAgfQorICB2b2lkIHNldF9jb2FsX2JpcnRocyhzc2l6ZV90IHYpIHsKKyAgICBhc3NlcnRfcHJvcGVyX2xvY2tfcHJvdGVjdGlvbigpOworICAgIF9hbGxvY2F0aW9uX3N0YXRzLnNldF9jb2FsX2JpcnRocyh2KTsKKyAgfQorICB2b2lkIGluY3JlbWVudF9jb2FsX2JpcnRocygpIHsKKyAgICBhc3NlcnRfcHJvcGVyX2xvY2tfcHJvdGVjdGlvbigpOworICAgIF9hbGxvY2F0aW9uX3N0YXRzLmluY3JlbWVudF9jb2FsX2JpcnRocygpOworICB9CisKKyAgc3NpemVfdCBjb2FsX2RlYXRocygpIGNvbnN0IHsKKyAgICByZXR1cm4gX2FsbG9jYXRpb25fc3RhdHMuY29hbF9kZWF0aHMoKTsKKyAgfQorICB2b2lkIHNldF9jb2FsX2RlYXRocyhzc2l6ZV90IHYpIHsKKyAgICBhc3NlcnRfcHJvcGVyX2xvY2tfcHJvdGVjdGlvbigpOworICAgIF9hbGxvY2F0aW9uX3N0YXRzLnNldF9jb2FsX2RlYXRocyh2KTsKKyAgfQorICB2b2lkIGluY3JlbWVudF9jb2FsX2RlYXRocygpIHsKKyAgICBhc3NlcnRfcHJvcGVyX2xvY2tfcHJvdGVjdGlvbigpOworICAgIF9hbGxvY2F0aW9uX3N0YXRzLmluY3JlbWVudF9jb2FsX2RlYXRocygpOworICB9CisKKyAgc3NpemVfdCBzcGxpdF9iaXJ0aHMoKSBjb25zdCB7CisgICAgcmV0dXJuIF9hbGxvY2F0aW9uX3N0YXRzLnNwbGl0X2JpcnRocygpOworICB9CisgIHZvaWQgc2V0X3NwbGl0X2JpcnRocyhzc2l6ZV90IHYpIHsKKyAgICBhc3NlcnRfcHJvcGVyX2xvY2tfcHJvdGVjdGlvbigpOworICAgIF9hbGxvY2F0aW9uX3N0YXRzLnNldF9zcGxpdF9iaXJ0aHModik7CisgIH0KKyAgdm9pZCBpbmNyZW1lbnRfc3BsaXRfYmlydGhzKCkgeworICAgIGFzc2VydF9wcm9wZXJfbG9ja19wcm90ZWN0aW9uKCk7CisgICAgX2FsbG9jYXRpb25fc3RhdHMuaW5jcmVtZW50X3NwbGl0X2JpcnRocygpOworICB9CisKKyAgc3NpemVfdCBzcGxpdF9kZWF0aHMoKSBjb25zdCB7CisgICAgcmV0dXJuIF9hbGxvY2F0aW9uX3N0YXRzLnNwbGl0X2RlYXRocygpOworICB9CisgIHZvaWQgc2V0X3NwbGl0X2RlYXRocyhzc2l6ZV90IHYpIHsKKyAgICBhc3NlcnRfcHJvcGVyX2xvY2tfcHJvdGVjdGlvbigpOworICAgIF9hbGxvY2F0aW9uX3N0YXRzLnNldF9zcGxpdF9kZWF0aHModik7CisgIH0KKyAgdm9pZCBpbmNyZW1lbnRfc3BsaXRfZGVhdGhzKCkgeworICAgIGFzc2VydF9wcm9wZXJfbG9ja19wcm90ZWN0aW9uKCk7CisgICAgX2FsbG9jYXRpb25fc3RhdHMuaW5jcmVtZW50X3NwbGl0X2RlYXRocygpOworICB9CisKKyNpZm5kZWYgUFJPRFVDVAorICAvLyBGb3IgZGVidWdnaW5nLiAgVGhlICJfcmV0dXJuZWRfYnl0ZXMiIGluIGFsbCB0aGUgbGlzdHMgYXJlIHN1bW1lZAorICAvLyBhbmQgY29tcGFyZWQgd2l0aCB0aGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHN3ZXB0IGR1cmluZyBhCisgIC8vIGNvbGxlY3Rpb24uCisgIHNpemVfdCByZXR1cm5lZF9ieXRlcygpIGNvbnN0IHsgcmV0dXJuIF9hbGxvY2F0aW9uX3N0YXRzLnJldHVybmVkX2J5dGVzKCk7IH0KKyAgdm9pZCBzZXRfcmV0dXJuZWRfYnl0ZXMoc2l6ZV90IHYpIHsgX2FsbG9jYXRpb25fc3RhdHMuc2V0X3JldHVybmVkX2J5dGVzKHYpOyB9CisgIHZvaWQgaW5jcmVtZW50X3JldHVybmVkX2J5dGVzX2J5KHNpemVfdCB2KSB7CisgICAgX2FsbG9jYXRpb25fc3RhdHMuc2V0X3JldHVybmVkX2J5dGVzKF9hbGxvY2F0aW9uX3N0YXRzLnJldHVybmVkX2J5dGVzKCkgKyB2KTsKKyAgfQorICAvLyBTdGF0cyB2ZXJpZmljYXRpb24KKyAgdm9pZCB2ZXJpZnlfc3RhdHMoKSBjb25zdDsKKyNlbmRpZiAgLy8gTk9UIFBST0RVQ1QKK307CisKKyNlbmRpZiAvLyBTSEFSRV9WTV9NRU1PUllfQURBUFRJVkVGUkVFTElTVF9IUFAKZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2djX2ltcGxlbWVudGF0aW9uL2NvbmN1cnJlbnRNYXJrU3dlZXAvY29tcGFjdGlibGVGcmVlTGlzdFNwYWNlLmNwcCBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2djX2ltcGxlbWVudGF0aW9uL2NvbmN1cnJlbnRNYXJrU3dlZXAvY29tcGFjdGlibGVGcmVlTGlzdFNwYWNlLmNwcAppbmRleCBlYWMzMmIxLi4yZjQzYzk4IDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9zaGFyZS92bS9nY19pbXBsZW1lbnRhdGlvbi9jb25jdXJyZW50TWFya1N3ZWVwL2NvbXBhY3RpYmxlRnJlZUxpc3RTcGFjZS5jcHAKKysrIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vZ2NfaW1wbGVtZW50YXRpb24vY29uY3VycmVudE1hcmtTd2VlcC9jb21wYWN0aWJsZUZyZWVMaXN0U3BhY2UuY3BwCkBAIC05MSw3ICs5MSw3IEBACiAgIF9jb2xsZWN0b3IoTlVMTCkKIHsKICAgYXNzZXJ0KHNpemVvZihGcmVlQ2h1bmspIC8gQnl0ZXNQZXJXb3JkIDw9IE1pbkNodW5rU2l6ZSwKLSAgICAiRnJlZUNodW5rIGlzIGxhcmdlciB0aGFuIGV4cGVjdGVkIik7CisgICAgICAgICAiRnJlZUNodW5rIGlzIGxhcmdlciB0aGFuIGV4cGVjdGVkIik7CiAgIF9idC5zZXRfc3BhY2UodGhpcyk7CiAgIGluaXRpYWxpemUobXIsIFNwYWNlRGVjb3JhdG9yOjpDbGVhciwgU3BhY2VEZWNvcmF0b3I6Ok1hbmdsZSk7CiAgIC8vIFdlIGhhdmUgYWxsIG9mICJtciIsIGFsbCBvZiB3aGljaCB3ZSBwbGFjZSBpbiB0aGUgZGljdGlvbmFyeQpAQCAtMTAxLDE0ICsxMDEsMTQgQEAKICAgLy8gaW1wbGVtZW50YXRpb24sIG5hbWVseSwgdGhlIHNpbXBsZSBiaW5hcnkgdHJlZSAoc3BsYXlpbmcKICAgLy8gdGVtcG9yYXJpbHkgZGlzYWJsZWQpLgogICBzd2l0Y2ggKGRpY3Rpb25hcnlDaG9pY2UpIHsKKyAgICBjYXNlIEZyZWVCbG9ja0RpY3Rpb25hcnk8RnJlZUNodW5rPjo6ZGljdGlvbmFyeUJpbmFyeVRyZWU6CisgICAgICBfZGljdGlvbmFyeSA9IG5ldyBCaW5hcnlUcmVlRGljdGlvbmFyeTxGcmVlQ2h1bmssIEFkYXB0aXZlRnJlZUxpc3Q+KG1yKTsKKyAgICAgIGJyZWFrOwogICAgIGNhc2UgRnJlZUJsb2NrRGljdGlvbmFyeTxGcmVlQ2h1bms+OjpkaWN0aW9uYXJ5U3BsYXlUcmVlOgogICAgIGNhc2UgRnJlZUJsb2NrRGljdGlvbmFyeTxGcmVlQ2h1bms+OjpkaWN0aW9uYXJ5U2tpcExpc3Q6CiAgICAgZGVmYXVsdDoKICAgICAgIHdhcm5pbmcoImRpY3Rpb25hcnlDaG9pY2U6IHNlbGVjdGVkIG9wdGlvbiBub3QgdW5kZXJzdG9vZDsgdXNpbmciCiAgICAgICAgICAgICAgICIgZGVmYXVsdCBCaW5hcnlUcmVlRGljdGlvbmFyeSBpbXBsZW1lbnRhdGlvbiBpbnN0ZWFkLiIpOwotICAgIGNhc2UgRnJlZUJsb2NrRGljdGlvbmFyeTxGcmVlQ2h1bms+OjpkaWN0aW9uYXJ5QmluYXJ5VHJlZToKLSAgICAgIF9kaWN0aW9uYXJ5ID0gbmV3IEJpbmFyeVRyZWVEaWN0aW9uYXJ5PEZyZWVDaHVuaz4obXIsIHVzZV9hZGFwdGl2ZV9mcmVlbGlzdHMpOwotICAgICAgYnJlYWs7CiAgIH0KICAgYXNzZXJ0KF9kaWN0aW9uYXJ5ICE9IE5VTEwsICJDTVMgZGljdGlvbmFyeSBpbml0aWFsaXphdGlvbiIpOwogICAvLyBUaGUgaW5kZXhlZCBmcmVlIGxpc3RzIGFyZSBpbml0aWFsbHkgYWxsIGVtcHR5IGFuZCBhcmUgbGF6aWx5CkBAIC00NTMsNyArNDUzLDcgQEAKICAgcmVwb3J0SW5kZXhlZEZyZWVMaXN0U3RhdGlzdGljcygpOwogICBnY2xvZ19vcl90dHktPnByaW50X2NyKCJMYXlvdXQgb2YgSW5kZXhlZCBGcmVlbGlzdHMiKTsKICAgZ2Nsb2dfb3JfdHR5LT5wcmludF9jcigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7Ci0gIEZyZWVMaXN0PEZyZWVDaHVuaz46OnByaW50X2xhYmVsc19vbihzdCwgInNpemUiKTsKKyAgQWRhcHRpdmVGcmVlTGlzdDxGcmVlQ2h1bms+OjpwcmludF9sYWJlbHNfb24oc3QsICJzaXplIik7CiAgIGZvciAoc2l6ZV90IGkgPSBJbmRleFNldFN0YXJ0OyBpIDwgSW5kZXhTZXRTaXplOyBpICs9IEluZGV4U2V0U3RyaWRlKSB7CiAgICAgX2luZGV4ZWRGcmVlTGlzdFtpXS5wcmludF9vbihnY2xvZ19vcl90dHkpOwogICAgIGZvciAoRnJlZUNodW5rKiBmYyA9IF9pbmRleGVkRnJlZUxpc3RbaV0uaGVhZCgpOyBmYyAhPSBOVUxMOwpAQCAtMTMxOSw3ICsxMzE5LDcgQEAKICAgc2l6ZV90IGN1cnJTaXplID0gbnVtV29yZHMgKyBNaW5DaHVua1NpemU7CiAgIGFzc2VydChjdXJyU2l6ZSAlIE1pbk9iakFsaWdubWVudCA9PSAwLCAiY3VyclNpemUgc2hvdWxkIGJlIGFsaWduZWQiKTsKICAgZm9yIChpID0gY3VyclNpemU7IGkgPCBJbmRleFNldFNpemU7IGkgKz0gSW5kZXhTZXRTdHJpZGUpIHsKLSAgICBGcmVlTGlzdDxGcmVlQ2h1bms+KiBmbCA9ICZfaW5kZXhlZEZyZWVMaXN0W2ldOworICAgIEFkYXB0aXZlRnJlZUxpc3Q8RnJlZUNodW5rPiogZmwgPSAmX2luZGV4ZWRGcmVlTGlzdFtpXTsKICAgICBpZiAoZmwtPmhlYWQoKSkgewogICAgICAgcmV0ID0gZ2V0RnJvbUxpc3RHcmVhdGVyKGZsLCBudW1Xb3Jkcyk7CiAgICAgICBhc3NlcnQocmV0ID09IE5VTEwgfHwgcmV0LT5pc19mcmVlKCksICJTaG91bGQgYmUgcmV0dXJuaW5nIGEgZnJlZSBjaHVuayIpOwpAQCAtMTcwMiw3ICsxNzAyLDkgQEAKICAgX2RpY3Rpb25hcnktPnJldHVybl9jaHVuayhjaHVuayk7CiAjaWZuZGVmIFBST0RVQ1QKICAgaWYgKENNU0NvbGxlY3Rvcjo6YWJzdHJhY3Rfc3RhdGUoKSAhPSBDTVNDb2xsZWN0b3I6OlN3ZWVwaW5nKSB7Ci0gICAgVHJlZUNodW5rPEZyZWVDaHVuaz46OmFzX1RyZWVDaHVuayhjaHVuayktPmxpc3QoKS0+dmVyaWZ5X3N0YXRzKCk7CisgICAgVHJlZUNodW5rPEZyZWVDaHVuaywgQWRhcHRpdmVGcmVlTGlzdD4qIHRjID0gVHJlZUNodW5rPEZyZWVDaHVuaywgQWRhcHRpdmVGcmVlTGlzdD46OmFzX1RyZWVDaHVuayhjaHVuayk7CisgICAgVHJlZUxpc3Q8RnJlZUNodW5rLCBBZGFwdGl2ZUZyZWVMaXN0PiogdGwgPSB0Yy0+bGlzdCgpOworICAgIHRsLT52ZXJpZnlfc3RhdHMoKTsKICAgfQogI2VuZGlmIC8vIFBST0RVQ1QKIH0KQEAgLTE3NDUsNyArMTc0Nyw3IEBACiAgIHsKICAgICBNdXRleExvY2tlckV4IHgobG9jaywgTXV0ZXg6Ol9ub19zYWZlcG9pbnRfY2hlY2tfZmxhZyk7CiAgICAgZWMgPSBkaWN0aW9uYXJ5KCktPmZpbmRfbGFyZ2VzdF9kaWN0KCk7ICAvLyBnZXQgbGFyZ2VzdCBibG9jawotICAgIGlmIChlYyAhPSBOVUxMICYmIGVjLT5lbmQoKSA9PSBjaHVuaykgeworICAgIGlmIChlYyAhPSBOVUxMICYmIGVjLT5lbmQoKSA9PSAodWludHB0cl90KikgY2h1bmspIHsKICAgICAgIC8vIEl0J3MgYSBjb3Rlcm1pbmFsIGJsb2NrIC0gd2UgY2FuIGNvYWxlc2NlLgogICAgICAgc2l6ZV90IG9sZF9zaXplID0gZWMtPnNpemUoKTsKICAgICAgIGNvYWxEZWF0aChvbGRfc2l6ZSk7CkBAIC0xODUwLDExICsxODUyLDExIEBACiAgICAgIHRoZSBleGNlc3MgaXMgPj0gTUlOX0NIVU5LLiAqLwogICBzaXplX3Qgc3RhcnQgPSBhbGlnbl9vYmplY3Rfc2l6ZShudW1Xb3JkcyArIE1pbkNodW5rU2l6ZSk7CiAgIGlmIChzdGFydCA8IEluZGV4U2V0U2l6ZSkgewotICAgIEZyZWVMaXN0PEZyZWVDaHVuaz4qIGl0ICAgPSBfaW5kZXhlZEZyZWVMaXN0OworICAgIEFkYXB0aXZlRnJlZUxpc3Q8RnJlZUNodW5rPiogaXQgICA9IF9pbmRleGVkRnJlZUxpc3Q7CiAgICAgc2l6ZV90ICAgIGhpbnQgPSBfaW5kZXhlZEZyZWVMaXN0W3N0YXJ0XS5oaW50KCk7CiAgICAgd2hpbGUgKGhpbnQgPCBJbmRleFNldFNpemUpIHsKICAgICAgIGFzc2VydChoaW50ICUgTWluT2JqQWxpZ25tZW50ID09IDAsICJoaW50IHNob3VsZCBiZSBhbGlnbmVkIik7Ci0gICAgICBGcmVlTGlzdDxGcmVlQ2h1bms+ICpmbCA9ICZfaW5kZXhlZEZyZWVMaXN0W2hpbnRdOworICAgICAgQWRhcHRpdmVGcmVlTGlzdDxGcmVlQ2h1bms+ICpmbCA9ICZfaW5kZXhlZEZyZWVMaXN0W2hpbnRdOwogICAgICAgaWYgKGZsLT5zdXJwbHVzKCkgPiAwICYmIGZsLT5oZWFkKCkgIT0gTlVMTCkgewogICAgICAgICAvLyBGb3VuZCBhIGxpc3Qgd2l0aCBzdXJwbHVzLCByZXNldCBvcmlnaW5hbCBoaW50CiAgICAgICAgIC8vIGFuZCBzcGxpdCBvdXQgYSBmcmVlIGNodW5rIHdoaWNoIGlzIHJldHVybmVkLgpAQCAtMTg3Myw3ICsxODc1LDcgQEAKIH0KIAogLyogUmVxdWlyZXMgZmwtPnNpemUgPj0gbnVtV29yZHMgKyBNaW5DaHVua1NpemUgKi8KLUZyZWVDaHVuayogQ29tcGFjdGlibGVGcmVlTGlzdFNwYWNlOjpnZXRGcm9tTGlzdEdyZWF0ZXIoRnJlZUxpc3Q8RnJlZUNodW5rPiogZmwsCitGcmVlQ2h1bmsqIENvbXBhY3RpYmxlRnJlZUxpc3RTcGFjZTo6Z2V0RnJvbUxpc3RHcmVhdGVyKEFkYXB0aXZlRnJlZUxpc3Q8RnJlZUNodW5rPiogZmwsCiAgIHNpemVfdCBudW1Xb3JkcykgewogICBGcmVlQ2h1bmsgKmN1cnIgPSBmbC0+aGVhZCgpOwogICBzaXplX3Qgb2xkTnVtV29yZHMgPSBjdXJyLT5zaXplKCk7CkBAIC0yMTU1LDcgKzIxNTcsNyBAQAogICBhc3NlcnRfbG9ja2VkKCk7CiAgIHNpemVfdCBpOwogICBmb3IgKGkgPSBJbmRleFNldFN0YXJ0OyBpIDwgSW5kZXhTZXRTaXplOyBpICs9IEluZGV4U2V0U3RyaWRlKSB7Ci0gICAgRnJlZUxpc3Q8RnJlZUNodW5rPiogZmwgPSAmX2luZGV4ZWRGcmVlTGlzdFtpXTsKKyAgICBBZGFwdGl2ZUZyZWVMaXN0PEZyZWVDaHVuaz4qIGZsICAgID0gJl9pbmRleGVkRnJlZUxpc3RbaV07CiAgICAgaWYgKFByaW50RkxTU3RhdGlzdGljcyA+IDEpIHsKICAgICAgIGdjbG9nX29yX3R0eS0+cHJpbnQoInNpemVbJWRdIDogIiwgaSk7CiAgICAgfQpAQCAtMjE3NCw3ICsyMTc2LDcgQEAKICAgYXNzZXJ0X2xvY2tlZCgpOwogICBzaXplX3QgaTsKICAgZm9yIChpID0gSW5kZXhTZXRTdGFydDsgaSA8IEluZGV4U2V0U2l6ZTsgaSArPSBJbmRleFNldFN0cmlkZSkgewotICAgIEZyZWVMaXN0PEZyZWVDaHVuaz4gKmZsID0gJl9pbmRleGVkRnJlZUxpc3RbaV07CisgICAgQWRhcHRpdmVGcmVlTGlzdDxGcmVlQ2h1bms+ICpmbCA9ICZfaW5kZXhlZEZyZWVMaXN0W2ldOwogICAgIGZsLT5zZXRfc3VycGx1cyhmbC0+Y291bnQoKSAtCiAgICAgICAgICAgICAgICAgICAgIChzc2l6ZV90KSgoZG91YmxlKWZsLT5kZXNpcmVkKCkgKiBDTVNTbWFsbFNwbGl0U3VycGx1c1BlcmNlbnQpKTsKICAgfQpAQCAtMjE4NSw3ICsyMTg3LDcgQEAKICAgc2l6ZV90IGk7CiAgIHNpemVfdCBoID0gSW5kZXhTZXRTaXplOwogICBmb3IgKGkgPSBJbmRleFNldFNpemUgLSAxOyBpICE9IDA7IGkgLT0gSW5kZXhTZXRTdHJpZGUpIHsKLSAgICBGcmVlTGlzdDxGcmVlQ2h1bms+ICpmbCA9ICZfaW5kZXhlZEZyZWVMaXN0W2ldOworICAgIEFkYXB0aXZlRnJlZUxpc3Q8RnJlZUNodW5rPiAqZmwgPSAmX2luZGV4ZWRGcmVlTGlzdFtpXTsKICAgICBmbC0+c2V0X2hpbnQoaCk7CiAgICAgaWYgKGZsLT5zdXJwbHVzKCkgPiAwKSB7CiAgICAgICBoID0gaTsKQEAgLTIxOTcsNyArMjE5OSw3IEBACiAgIGFzc2VydF9sb2NrZWQoKTsKICAgc2l6ZV90IGk7CiAgIGZvciAoaSA9IEluZGV4U2V0U3RhcnQ7IGkgPCBJbmRleFNldFNpemU7IGkgKz0gSW5kZXhTZXRTdHJpZGUpIHsKLSAgICBGcmVlTGlzdDxGcmVlQ2h1bms+ICpmbCA9ICZfaW5kZXhlZEZyZWVMaXN0W2ldOworICAgIEFkYXB0aXZlRnJlZUxpc3Q8RnJlZUNodW5rPiAqZmwgPSAmX2luZGV4ZWRGcmVlTGlzdFtpXTsKICAgICBmbC0+c2V0X3ByZXZfc3dlZXAoZmwtPmNvdW50KCkpOwogICAgIGZsLT5zZXRfY29hbF9iaXJ0aHMoMCk7CiAgICAgZmwtPnNldF9jb2FsX2RlYXRocygwKTsKQEAgLTIyMjQsNyArMjIyNiw3IEBACiAKIGJvb2wgQ29tcGFjdGlibGVGcmVlTGlzdFNwYWNlOjpjb2FsT3ZlclBvcHVsYXRlZChzaXplX3Qgc2l6ZSkgewogICBpZiAoc2l6ZSA8IFNtYWxsRm9yRGljdGlvbmFyeSkgewotICAgIEZyZWVMaXN0PEZyZWVDaHVuaz4gKmZsID0gJl9pbmRleGVkRnJlZUxpc3Rbc2l6ZV07CisgICAgQWRhcHRpdmVGcmVlTGlzdDxGcmVlQ2h1bms+ICpmbCA9ICZfaW5kZXhlZEZyZWVMaXN0W3NpemVdOwogICAgIHJldHVybiAoZmwtPmNvYWxfZGVzaXJlZCgpIDwgMCkgfHwKICAgICAgICAgICAgKChpbnQpZmwtPmNvdW50KCkgPiBmbC0+Y29hbF9kZXNpcmVkKCkpOwogICB9IGVsc2UgewpAQCAtMjIzNCwxNCArMjIzNiwxNCBAQAogCiB2b2lkIENvbXBhY3RpYmxlRnJlZUxpc3RTcGFjZTo6c21hbGxDb2FsQmlydGgoc2l6ZV90IHNpemUpIHsKICAgYXNzZXJ0KHNpemUgPCBTbWFsbEZvckRpY3Rpb25hcnksICJTaXplIHRvbyBsYXJnZSBmb3IgaW5kZXhlZCBsaXN0Iik7Ci0gIEZyZWVMaXN0PEZyZWVDaHVuaz4gKmZsID0gJl9pbmRleGVkRnJlZUxpc3Rbc2l6ZV07CisgIEFkYXB0aXZlRnJlZUxpc3Q8RnJlZUNodW5rPiAqZmwgPSAmX2luZGV4ZWRGcmVlTGlzdFtzaXplXTsKICAgZmwtPmluY3JlbWVudF9jb2FsX2JpcnRocygpOwogICBmbC0+aW5jcmVtZW50X3N1cnBsdXMoKTsKIH0KIAogdm9pZCBDb21wYWN0aWJsZUZyZWVMaXN0U3BhY2U6OnNtYWxsQ29hbERlYXRoKHNpemVfdCBzaXplKSB7CiAgIGFzc2VydChzaXplIDwgU21hbGxGb3JEaWN0aW9uYXJ5LCAiU2l6ZSB0b28gbGFyZ2UgZm9yIGluZGV4ZWQgbGlzdCIpOwotICBGcmVlTGlzdDxGcmVlQ2h1bms+ICpmbCA9ICZfaW5kZXhlZEZyZWVMaXN0W3NpemVdOworICBBZGFwdGl2ZUZyZWVMaXN0PEZyZWVDaHVuaz4gKmZsID0gJl9pbmRleGVkRnJlZUxpc3Rbc2l6ZV07CiAgIGZsLT5pbmNyZW1lbnRfY29hbF9kZWF0aHMoKTsKICAgZmwtPmRlY3JlbWVudF9zdXJwbHVzKCk7CiB9CkBAIC0yMjUwLDcgKzIyNTIsNyBAQAogICBpZiAoc2l6ZSAgPCBTbWFsbEZvckRpY3Rpb25hcnkpIHsKICAgICBzbWFsbENvYWxCaXJ0aChzaXplKTsKICAgfSBlbHNlIHsKLSAgICBkaWN0aW9uYXJ5KCktPmRpY3RfY2Vuc3VzX3VkcGF0ZShzaXplLAorICAgIGRpY3Rpb25hcnkoKS0+ZGljdF9jZW5zdXNfdXBkYXRlKHNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIHNwbGl0ICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIGJpcnRoICovKTsKICAgfQpAQCAtMjI2MCw3ICsyMjYyLDcgQEAKICAgaWYoc2l6ZSAgPCBTbWFsbEZvckRpY3Rpb25hcnkpIHsKICAgICBzbWFsbENvYWxEZWF0aChzaXplKTsKICAgfSBlbHNlIHsKLSAgICBkaWN0aW9uYXJ5KCktPmRpY3RfY2Vuc3VzX3VkcGF0ZShzaXplLAorICAgIGRpY3Rpb25hcnkoKS0+ZGljdF9jZW5zdXNfdXBkYXRlKHNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIHNwbGl0ICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBiaXJ0aCAqLyk7CiAgIH0KQEAgLTIyNjgsMTQgKzIyNzAsMTQgQEAKIAogdm9pZCBDb21wYWN0aWJsZUZyZWVMaXN0U3BhY2U6OnNtYWxsU3BsaXRCaXJ0aChzaXplX3Qgc2l6ZSkgewogICBhc3NlcnQoc2l6ZSA8IFNtYWxsRm9yRGljdGlvbmFyeSwgIlNpemUgdG9vIGxhcmdlIGZvciBpbmRleGVkIGxpc3QiKTsKLSAgRnJlZUxpc3Q8RnJlZUNodW5rPiAqZmwgPSAmX2luZGV4ZWRGcmVlTGlzdFtzaXplXTsKKyAgQWRhcHRpdmVGcmVlTGlzdDxGcmVlQ2h1bms+ICpmbCA9ICZfaW5kZXhlZEZyZWVMaXN0W3NpemVdOwogICBmbC0+aW5jcmVtZW50X3NwbGl0X2JpcnRocygpOwogICBmbC0+aW5jcmVtZW50X3N1cnBsdXMoKTsKIH0KIAogdm9pZCBDb21wYWN0aWJsZUZyZWVMaXN0U3BhY2U6OnNtYWxsU3BsaXREZWF0aChzaXplX3Qgc2l6ZSkgewogICBhc3NlcnQoc2l6ZSA8IFNtYWxsRm9yRGljdGlvbmFyeSwgIlNpemUgdG9vIGxhcmdlIGZvciBpbmRleGVkIGxpc3QiKTsKLSAgRnJlZUxpc3Q8RnJlZUNodW5rPiAqZmwgPSAmX2luZGV4ZWRGcmVlTGlzdFtzaXplXTsKKyAgQWRhcHRpdmVGcmVlTGlzdDxGcmVlQ2h1bms+ICpmbCA9ICZfaW5kZXhlZEZyZWVMaXN0W3NpemVdOwogICBmbC0+aW5jcmVtZW50X3NwbGl0X2RlYXRocygpOwogICBmbC0+ZGVjcmVtZW50X3N1cnBsdXMoKTsKIH0KQEAgLTIyODQsNyArMjI4Niw3IEBACiAgIGlmIChzaXplICA8IFNtYWxsRm9yRGljdGlvbmFyeSkgewogICAgIHNtYWxsU3BsaXRCaXJ0aChzaXplKTsKICAgfSBlbHNlIHsKLSAgICBkaWN0aW9uYXJ5KCktPmRpY3RfY2Vuc3VzX3VkcGF0ZShzaXplLAorICAgIGRpY3Rpb25hcnkoKS0+ZGljdF9jZW5zdXNfdXBkYXRlKHNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogc3BsaXQgKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogYmlydGggKi8pOwogICB9CkBAIC0yMjk0LDcgKzIyOTYsNyBAQAogICBpZiAoc2l6ZSAgPCBTbWFsbEZvckRpY3Rpb25hcnkpIHsKICAgICBzbWFsbFNwbGl0RGVhdGgoc2l6ZSk7CiAgIH0gZWxzZSB7Ci0gICAgZGljdGlvbmFyeSgpLT5kaWN0X2NlbnN1c191ZHBhdGUoc2l6ZSwKKyAgICBkaWN0aW9uYXJ5KCktPmRpY3RfY2Vuc3VzX3VwZGF0ZShzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIHNwbGl0ICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBiaXJ0aCAqLyk7CiAgIH0KQEAgLTI1MTcsMTAgKzI1MTksMTAgQEAKIAogI2lmbmRlZiBQUk9EVUNUCiB2b2lkIENvbXBhY3RpYmxlRnJlZUxpc3RTcGFjZTo6Y2hlY2tfZnJlZV9saXN0X2NvbnNpc3RlbmN5KCkgY29uc3QgewotICBhc3NlcnQoX2RpY3Rpb25hcnktPm1pbl9zaXplKCkgPD0gSW5kZXhTZXRTaXplLAorICBhc3NlcnQoKFRyZWVDaHVuazxGcmVlQ2h1bmssIEFkYXB0aXZlRnJlZUxpc3Q+OjptaW5fc2l6ZSgpIDw9IEluZGV4U2V0U2l6ZSksCiAgICAgIlNvbWUgc2l6ZXMgY2FuJ3QgYmUgYWxsb2NhdGVkIHdpdGhvdXQgcmVjb3Vyc2UgdG8iCiAgICAgIiBsaW5lYXIgYWxsb2NhdGlvbiBidWZmZXJzIik7Ci0gIGFzc2VydChCaW5hcnlUcmVlRGljdGlvbmFyeTxGcmVlQ2h1bms+OjptaW5fdHJlZV9jaHVua19zaXplKkhlYXBXb3JkU2l6ZSA9PSBzaXplb2YoVHJlZUNodW5rPEZyZWVDaHVuaz4pLAorICBhc3NlcnQoKFRyZWVDaHVuazxGcmVlQ2h1bmssIEFkYXB0aXZlRnJlZUxpc3Q+OjptaW5fc2l6ZSgpKkhlYXBXb3JkU2l6ZSA9PSBzaXplb2YoVHJlZUNodW5rPEZyZWVDaHVuaywgQWRhcHRpdmVGcmVlTGlzdD4pKSwKICAgICAiZWxzZSBNSU5fVFJFRV9DSFVOS19TSVpFIGlzIHdyb25nIik7CiAgIGFzc2VydChJbmRleFNldFN0YXJ0ICE9IDAsICJJbmRleFNldFN0YXJ0IG5vdCBpbml0aWFsaXplZCIpOwogICBhc3NlcnQoSW5kZXhTZXRTdHJpZGUgIT0gMCwgIkluZGV4U2V0U3RyaWRlIG5vdCBpbml0aWFsaXplZCIpOwpAQCAtMjUyOSwxNSArMjUzMSwxNSBAQAogCiB2b2lkIENvbXBhY3RpYmxlRnJlZUxpc3RTcGFjZTo6cHJpbnRGTENlbnN1cyhzaXplX3Qgc3dlZXBfY291bnQpIGNvbnN0IHsKICAgYXNzZXJ0X2xvY2tfc3Ryb25nKCZfZnJlZWxpc3RMb2NrKTsKLSAgRnJlZUxpc3Q8RnJlZUNodW5rPiB0b3RhbDsKKyAgQWRhcHRpdmVGcmVlTGlzdDxGcmVlQ2h1bms+IHRvdGFsOwogICBnY2xvZ19vcl90dHktPnByaW50KCJlbmQgc3dlZXAjICIgU0laRV9GT1JNQVQgIlxuIiwgc3dlZXBfY291bnQpOwotICBGcmVlTGlzdDxGcmVlQ2h1bms+OjpwcmludF9sYWJlbHNfb24oZ2Nsb2dfb3JfdHR5LCAic2l6ZSIpOworICBBZGFwdGl2ZUZyZWVMaXN0PEZyZWVDaHVuaz46OnByaW50X2xhYmVsc19vbihnY2xvZ19vcl90dHksICJzaXplIik7CiAgIHNpemVfdCB0b3RhbF9mcmVlID0gMDsKICAgZm9yIChzaXplX3QgaSA9IEluZGV4U2V0U3RhcnQ7IGkgPCBJbmRleFNldFNpemU7IGkgKz0gSW5kZXhTZXRTdHJpZGUpIHsKLSAgICBjb25zdCBGcmVlTGlzdDxGcmVlQ2h1bms+ICpmbCA9ICZfaW5kZXhlZEZyZWVMaXN0W2ldOworICAgIGNvbnN0IEFkYXB0aXZlRnJlZUxpc3Q8RnJlZUNodW5rPiAqZmwgPSAmX2luZGV4ZWRGcmVlTGlzdFtpXTsKICAgICB0b3RhbF9mcmVlICs9IGZsLT5jb3VudCgpICogZmwtPnNpemUoKTsKICAgICBpZiAoaSAlICg0MCpJbmRleFNldFN0cmlkZSkgPT0gMCkgewotICAgICAgRnJlZUxpc3Q8RnJlZUNodW5rPjo6cHJpbnRfbGFiZWxzX29uKGdjbG9nX29yX3R0eSwgInNpemUiKTsKKyAgICAgIEFkYXB0aXZlRnJlZUxpc3Q8RnJlZUNodW5rPjo6cHJpbnRfbGFiZWxzX29uKGdjbG9nX29yX3R0eSwgInNpemUiKTsKICAgICB9CiAgICAgZmwtPnByaW50X29uKGdjbG9nX29yX3R0eSk7CiAgICAgdG90YWwuc2V0X2Jmcl9zdXJwKCAgICB0b3RhbC5iZnJfc3VycCgpICAgICArIGZsLT5iZnJfc3VycCgpICAgICk7CkBAIC0yNjIwLDcgKzI2MjIsNyBAQAogICAgIHJlcyA9IF9jZmxzLT5nZXRDaHVua0Zyb21EaWN0aW9uYXJ5RXhhY3Qod29yZF9zeik7CiAgICAgaWYgKHJlcyA9PSBOVUxMKSByZXR1cm4gTlVMTDsKICAgfSBlbHNlIHsKLSAgICBGcmVlTGlzdDxGcmVlQ2h1bms+KiBmbCA9ICZfaW5kZXhlZEZyZWVMaXN0W3dvcmRfc3pdOworICAgIEFkYXB0aXZlRnJlZUxpc3Q8RnJlZUNodW5rPiogZmwgPSAmX2luZGV4ZWRGcmVlTGlzdFt3b3JkX3N6XTsKICAgICBpZiAoZmwtPmNvdW50KCkgPT0gMCkgewogICAgICAgLy8gQXR0ZW1wdCB0byByZWZpbGwgdGhpcyBsb2NhbCBmcmVlIGxpc3QuCiAgICAgICBnZXRfZnJvbV9nbG9iYWxfcG9vbCh3b3JkX3N6LCBmbCk7CkBAIC0yNjQwLDcgKzI2NDIsNyBAQAogCiAvLyBHZXQgYSBjaHVuayBvZiBibG9ja3Mgb2YgdGhlIHJpZ2h0IHNpemUgYW5kIHVwZGF0ZSByZWxhdGVkCiAvLyBib29rLWtlZXBpbmcgc3RhdHMKLXZvaWQgQ0ZMU19MQUI6OmdldF9mcm9tX2dsb2JhbF9wb29sKHNpemVfdCB3b3JkX3N6LCBGcmVlTGlzdDxGcmVlQ2h1bms+KiBmbCkgewordm9pZCBDRkxTX0xBQjo6Z2V0X2Zyb21fZ2xvYmFsX3Bvb2woc2l6ZV90IHdvcmRfc3osIEFkYXB0aXZlRnJlZUxpc3Q8RnJlZUNodW5rPiogZmwpIHsKICAgLy8gR2V0IHRoZSAjYmxvY2tzIHdlIHdhbnQgdG8gY2xhaW0KICAgc2l6ZV90IG5fYmxrcyA9IChzaXplX3QpX2Jsb2Nrc190b19jbGFpbVt3b3JkX3N6XS5hdmVyYWdlKCk7CiAgIGFzc2VydChuX2Jsa3MgPiAwLCAiRXJyb3IiKTsKQEAgLTI3MjIsNyArMjcyNCw3IEBACiAgICAgICAgIGlmIChudW1fcmV0aXJlID4gMCkgewogICAgICAgICAgIF9jZmxzLT5faW5kZXhlZEZyZWVMaXN0W2ldLnByZXBlbmQoJl9pbmRleGVkRnJlZUxpc3RbaV0pOwogICAgICAgICAgIC8vIFJlc2V0IHRoaXMgbGlzdC4KLSAgICAgICAgICBfaW5kZXhlZEZyZWVMaXN0W2ldID0gRnJlZUxpc3Q8RnJlZUNodW5rPigpOworICAgICAgICAgIF9pbmRleGVkRnJlZUxpc3RbaV0gPSBBZGFwdGl2ZUZyZWVMaXN0PEZyZWVDaHVuaz4oKTsKICAgICAgICAgICBfaW5kZXhlZEZyZWVMaXN0W2ldLnNldF9zaXplKGkpOwogICAgICAgICB9CiAgICAgICB9CkBAIC0yNzM2LDcgKzI3MzgsNyBAQAogICB9CiB9CiAKLXZvaWQgQ29tcGFjdGlibGVGcmVlTGlzdFNwYWNlOjogcGFyX2dldF9jaHVua19vZl9ibG9ja3Moc2l6ZV90IHdvcmRfc3osIHNpemVfdCBuLCBGcmVlTGlzdDxGcmVlQ2h1bms+KiBmbCkgewordm9pZCBDb21wYWN0aWJsZUZyZWVMaXN0U3BhY2U6OiBwYXJfZ2V0X2NodW5rX29mX2Jsb2NrcyhzaXplX3Qgd29yZF9zeiwgc2l6ZV90IG4sIEFkYXB0aXZlRnJlZUxpc3Q8RnJlZUNodW5rPiogZmwpIHsKICAgYXNzZXJ0KGZsLT5jb3VudCgpID09IDAsICJQcmVjb25kaXRpb24uIik7CiAgIGFzc2VydCh3b3JkX3N6IDwgQ29tcGFjdGlibGVGcmVlTGlzdFNwYWNlOjpJbmRleFNldFNpemUsCiAgICAgICAgICAiUHJlY29uZGl0aW9uIik7CkBAIC0yNzUyLDEyICsyNzU0LDEyIEBACiAgICAgICAgICAoY3VyX3N6IDwgQ29tcGFjdGlibGVGcmVlTGlzdFNwYWNlOjpJbmRleFNldFNpemUpICYmCiAgICAgICAgICAoQ01TU3BsaXRJbmRleGVkRnJlZUxpc3RCbG9ja3MgfHwgayA8PSAxKTsKICAgICAgICAgIGsrKywgY3VyX3N6ID0gayAqIHdvcmRfc3opIHsKLSAgICAgIEZyZWVMaXN0PEZyZWVDaHVuaz4gZmxfZm9yX2N1cl9zejsgIC8vIEVtcHR5LgorICAgICAgQWRhcHRpdmVGcmVlTGlzdDxGcmVlQ2h1bms+IGZsX2Zvcl9jdXJfc3o7ICAvLyBFbXB0eS4KICAgICAgIGZsX2Zvcl9jdXJfc3ouc2V0X3NpemUoY3VyX3N6KTsKICAgICAgIHsKICAgICAgICAgTXV0ZXhMb2NrZXJFeCB4KF9pbmRleGVkRnJlZUxpc3RQYXJMb2Nrc1tjdXJfc3pdLAogICAgICAgICAgICAgICAgICAgICAgICAgTXV0ZXg6Ol9ub19zYWZlcG9pbnRfY2hlY2tfZmxhZyk7Ci0gICAgICAgIEZyZWVMaXN0PEZyZWVDaHVuaz4qIGdmbCA9ICZfaW5kZXhlZEZyZWVMaXN0W2N1cl9zel07CisgICAgICAgIEFkYXB0aXZlRnJlZUxpc3Q8RnJlZUNodW5rPiogZ2ZsID0gJl9pbmRleGVkRnJlZUxpc3RbY3VyX3N6XTsKICAgICAgICAgaWYgKGdmbC0+Y291bnQoKSAhPSAwKSB7CiAgICAgICAgICAgLy8gbm4gaXMgdGhlIG51bWJlciBvZiBjaHVua3Mgb2Ygc2l6ZSBjdXJfc3ogdGhhdAogICAgICAgICAgIC8vIHdlJ2QgbmVlZCB0byBzcGxpdCBrLXdheXMgZWFjaCwgaW4gb3JkZXIgdG8gY3JlYXRlCkBAIC0yODMyLDEyICsyODM0LDExIEBACiAgICAgTXV0ZXhMb2NrZXJFeCB4KHBhckRpY3Rpb25hcnlBbGxvY0xvY2soKSwKICAgICAgICAgICAgICAgICAgICAgTXV0ZXg6Ol9ub19zYWZlcG9pbnRfY2hlY2tfZmxhZyk7CiAgICAgd2hpbGUgKG4gPiAwKSB7Ci0gICAgICBmYyA9IGRpY3Rpb25hcnkoKS0+Z2V0X2NodW5rKE1BWDIobiAqIHdvcmRfc3osCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RpY3Rpb25hcnktPm1pbl9zaXplKCkpLAorICAgICAgZmMgPSBkaWN0aW9uYXJ5KCktPmdldF9jaHVuayhNQVgyKG4gKiB3b3JkX3N6LCBfZGljdGlvbmFyeS0+bWluX3NpemUoKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJlZUJsb2NrRGljdGlvbmFyeTxGcmVlQ2h1bms+OjphdExlYXN0KTsKICAgICAgIGlmIChmYyAhPSBOVUxMKSB7CiAgICAgICAgIF9idC5hbGxvY2F0ZWQoKEhlYXBXb3JkKilmYywgZmMtPnNpemUoKSwgdHJ1ZSAvKiByZWR1Y2luZyAqLyk7ICAvLyB1cGRhdGUgX3VuYWxsb2NhdGVkX2JsawotICAgICAgICBkaWN0aW9uYXJ5KCktPmRpY3RfY2Vuc3VzX3VkcGF0ZShmYy0+c2l6ZSgpLAorICAgICAgICBkaWN0aW9uYXJ5KCktPmRpY3RfY2Vuc3VzX3VwZGF0ZShmYy0+c2l6ZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKnNwbGl0Ki8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKmJpcnRoKi8pOwogICAgICAgICBicmVhazsKQEAgLTI4OTAsNyArMjg5MSw3IEBACiAgICAgICBmYy0+c2V0X3NpemUocHJlZml4X3NpemUpOwogICAgICAgaWYgKHJlbSA+PSBJbmRleFNldFNpemUpIHsKICAgICAgICAgcmV0dXJuQ2h1bmtUb0RpY3Rpb25hcnkocmVtX2ZjKTsKLSAgICAgICAgZGljdGlvbmFyeSgpLT5kaWN0X2NlbnN1c191ZHBhdGUocmVtLCB0cnVlIC8qc3BsaXQqLywgdHJ1ZSAvKmJpcnRoKi8pOworICAgICAgICBkaWN0aW9uYXJ5KCktPmRpY3RfY2Vuc3VzX3VwZGF0ZShyZW0sIHRydWUgLypzcGxpdCovLCB0cnVlIC8qYmlydGgqLyk7CiAgICAgICAgIHJlbV9mYyA9IE5VTEw7CiAgICAgICB9CiAgICAgICAvLyBPdGhlcndpc2UsIHJldHVybiBpdCB0byB0aGUgc21hbGwgbGlzdCBiZWxvdy4KZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2djX2ltcGxlbWVudGF0aW9uL2NvbmN1cnJlbnRNYXJrU3dlZXAvY29tcGFjdGlibGVGcmVlTGlzdFNwYWNlLmhwcCBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2djX2ltcGxlbWVudGF0aW9uL2NvbmN1cnJlbnRNYXJrU3dlZXAvY29tcGFjdGlibGVGcmVlTGlzdFNwYWNlLmhwcAppbmRleCA0ZDI0NzM1Li4xYjNkOTNlIDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9zaGFyZS92bS9nY19pbXBsZW1lbnRhdGlvbi9jb25jdXJyZW50TWFya1N3ZWVwL2NvbXBhY3RpYmxlRnJlZUxpc3RTcGFjZS5ocHAKKysrIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vZ2NfaW1wbGVtZW50YXRpb24vY29uY3VycmVudE1hcmtTd2VlcC9jb21wYWN0aWJsZUZyZWVMaXN0U3BhY2UuaHBwCkBAIC0yNSw2ICsyNSw3IEBACiAjaWZuZGVmIFNIQVJFX1ZNX0dDX0lNUExFTUVOVEFUSU9OX0NPTkNVUlJFTlRNQVJLU1dFRVBfQ09NUEFDVElCTEVGUkVFTElTVFNQQUNFX0hQUAogI2RlZmluZSBTSEFSRV9WTV9HQ19JTVBMRU1FTlRBVElPTl9DT05DVVJSRU5UTUFSS1NXRUVQX0NPTVBBQ1RJQkxFRlJFRUxJU1RTUEFDRV9IUFAKIAorI2luY2x1ZGUgImdjX2ltcGxlbWVudGF0aW9uL2NvbmN1cnJlbnRNYXJrU3dlZXAvYWRhcHRpdmVGcmVlTGlzdC5ocHAiCiAjaW5jbHVkZSAiZ2NfaW1wbGVtZW50YXRpb24vY29uY3VycmVudE1hcmtTd2VlcC9wcm9tb3Rpb25JbmZvLmhwcCIKICNpbmNsdWRlICJtZW1vcnkvYmluYXJ5VHJlZURpY3Rpb25hcnkuaHBwIgogI2luY2x1ZGUgIm1lbW9yeS9ibG9ja09mZnNldFRhYmxlLmlubGluZS5ocHAiCkBAIC0zOCw2ICszOSw3IEBACiBjbGFzcyBDb21wYWN0aWJsZUZyZWVMaXN0U3BhY2U7CiBjbGFzcyBCbGtDbG9zdXJlOwogY2xhc3MgQmxrQ2xvc3VyZUNhcmVmdWw7CitjbGFzcyBGcmVlQ2h1bms7CiBjbGFzcyBVcHdhcmRzT2JqZWN0Q2xvc3VyZTsKIGNsYXNzIE9iamVjdENsb3N1cmVDYXJlZnVsOwogY2xhc3MgS2xhc3M7CkBAIC0xMzEsNyArMTMzLDcgQEAKICAgRnJlZUJsb2NrRGljdGlvbmFyeTxGcmVlQ2h1bms+OjpEaWN0aW9uYXJ5Q2hvaWNlIF9kaWN0aW9uYXJ5Q2hvaWNlOwogICBGcmVlQmxvY2tEaWN0aW9uYXJ5PEZyZWVDaHVuaz4qIF9kaWN0aW9uYXJ5OyAgICAvLyBwdHIgdG8gZGljdGlvbmFyeSBmb3IgbGFyZ2Ugc2l6ZSBibG9ja3MKIAotICBGcmVlTGlzdDxGcmVlQ2h1bms+IF9pbmRleGVkRnJlZUxpc3RbSW5kZXhTZXRTaXplXTsKKyAgQWRhcHRpdmVGcmVlTGlzdDxGcmVlQ2h1bms+IF9pbmRleGVkRnJlZUxpc3RbSW5kZXhTZXRTaXplXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluZGV4ZWQgYXJyYXkgZm9yIHNtYWxsIHNpemUgYmxvY2tzCiAgIC8vIGFsbG9jYXRpb24gc3RhdGVneQogICBib29sICAgICAgIF9maXRTdHJhdGVneTsgICAgICAvLyBVc2UgYmVzdCBmaXQgc3RyYXRlZ3kuCkBAIC0xNjgsNyArMTcwLDcgQEAKICAgLy8gSWYgdGhlIGNvdW50IG9mICJmbCIgaXMgbmVnYXRpdmUsIGl0J3MgYWJzb2x1dGUgdmFsdWUgaW5kaWNhdGVzIGEKICAgLy8gbnVtYmVyIG9mIGZyZWUgY2h1bmtzIHRoYXQgaGFkIGJlZW4gcHJldmlvdXNseSAiYm9ycm93ZWQiIGZyb20gZ2xvYmFsCiAgIC8vIGxpc3Qgb2Ygc2l6ZSAid29yZF9zeiIsIGFuZCBtdXN0IG5vdyBiZSBkZWNyZW1lbnRlZC4KLSAgdm9pZCBwYXJfZ2V0X2NodW5rX29mX2Jsb2NrcyhzaXplX3Qgd29yZF9zeiwgc2l6ZV90IG4sIEZyZWVMaXN0PEZyZWVDaHVuaz4qIGZsKTsKKyAgdm9pZCBwYXJfZ2V0X2NodW5rX29mX2Jsb2NrcyhzaXplX3Qgd29yZF9zeiwgc2l6ZV90IG4sIEFkYXB0aXZlRnJlZUxpc3Q8RnJlZUNodW5rPiogZmwpOwogCiAgIC8vIEFsbG9jYXRpb24gaGVscGVyIGZ1bmN0aW9ucwogICAvLyBBbGxvY2F0ZSB1c2luZyBhIHN0cmF0ZWd5IHRoYXQgdGFrZXMgZnJvbSB0aGUgaW5kZXhlZCBmcmVlIGxpc3RzCkBAIC0yMTQsNyArMjE2LDcgQEAKICAgLy8gYW5kIHJldHVybiBpdC4gIFRoZSBzcGxpdCBvZmYgcmVtYWluZGVyIGlzIHJldHVybmVkIHRvCiAgIC8vIHRoZSBmcmVlIGxpc3RzLiAgVGhlIG9sZCBuYW1lIGZvciBnZXRGcm9tTGlzdEdyZWF0ZXIKICAgLy8gd2FzIGxvb2tJbkxpc3RHcmVhdGVyLgotICBGcmVlQ2h1bmsqIGdldEZyb21MaXN0R3JlYXRlcihGcmVlTGlzdDxGcmVlQ2h1bms+KiBmbCwgc2l6ZV90IG51bVdvcmRzKTsKKyAgRnJlZUNodW5rKiBnZXRGcm9tTGlzdEdyZWF0ZXIoQWRhcHRpdmVGcmVlTGlzdDxGcmVlQ2h1bms+KiBmbCwgc2l6ZV90IG51bVdvcmRzKTsKICAgLy8gR2V0IGEgY2h1bmsgaW4gdGhlIGluZGV4ZWQgZnJlZSBsaXN0IG9yIGRpY3Rpb25hcnksCiAgIC8vIGJ5IGNvbnNpZGVyaW5nIGEgbGFyZ2VyIGNodW5rIGFuZCBzcGxpdHRpbmcgaXQuCiAgIEZyZWVDaHVuayogZ2V0Q2h1bmtGcm9tR3JlYXRlcihzaXplX3QgbnVtV29yZHMpOwpAQCAtNjIxLDcgKzYyMyw3IEBACiAgIENvbXBhY3RpYmxlRnJlZUxpc3RTcGFjZSogX2NmbHM7CiAKICAgLy8gT3VyIGxvY2FsIGZyZWUgbGlzdHMuCi0gIEZyZWVMaXN0PEZyZWVDaHVuaz4gX2luZGV4ZWRGcmVlTGlzdFtDb21wYWN0aWJsZUZyZWVMaXN0U3BhY2U6OkluZGV4U2V0U2l6ZV07CisgIEFkYXB0aXZlRnJlZUxpc3Q8RnJlZUNodW5rPiBfaW5kZXhlZEZyZWVMaXN0W0NvbXBhY3RpYmxlRnJlZUxpc3RTcGFjZTo6SW5kZXhTZXRTaXplXTsKIAogICAvLyBJbml0aWFsaXplZCBmcm9tIGEgY29tbWFuZC1saW5lIGFyZy4KIApAQCAtNjM0LDcgKzYzNiw3IEBACiAgIHNpemVfdCAgICAgICAgX251bV9ibG9ja3MgICAgICAgIFtDb21wYWN0aWJsZUZyZWVMaXN0U3BhY2U6OkluZGV4U2V0U2l6ZV07CiAKICAgLy8gSW50ZXJuYWwgd29yayBtZXRob2QKLSAgdm9pZCBnZXRfZnJvbV9nbG9iYWxfcG9vbChzaXplX3Qgd29yZF9zeiwgRnJlZUxpc3Q8RnJlZUNodW5rPiogZmwpOworICB2b2lkIGdldF9mcm9tX2dsb2JhbF9wb29sKHNpemVfdCB3b3JkX3N6LCBBZGFwdGl2ZUZyZWVMaXN0PEZyZWVDaHVuaz4qIGZsKTsKIAogcHVibGljOgogICBDRkxTX0xBQihDb21wYWN0aWJsZUZyZWVMaXN0U3BhY2UqIGNmbHMpOwpkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vZ2NfaW1wbGVtZW50YXRpb24vY29uY3VycmVudE1hcmtTd2VlcC9jb25jdXJyZW50TWFya1N3ZWVwR2VuZXJhdGlvbi5jcHAgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9nY19pbXBsZW1lbnRhdGlvbi9jb25jdXJyZW50TWFya1N3ZWVwL2NvbmN1cnJlbnRNYXJrU3dlZXBHZW5lcmF0aW9uLmNwcAppbmRleCBhYzhiNzAwLi40NzVmMmI4IDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9zaGFyZS92bS9nY19pbXBsZW1lbnRhdGlvbi9jb25jdXJyZW50TWFya1N3ZWVwL2NvbmN1cnJlbnRNYXJrU3dlZXBHZW5lcmF0aW9uLmNwcAorKysgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9nY19pbXBsZW1lbnRhdGlvbi9jb25jdXJyZW50TWFya1N3ZWVwL2NvbmN1cnJlbnRNYXJrU3dlZXBHZW5lcmF0aW9uLmNwcApAQCAtOTE0Myw3ICs5MTQzLDcgQEAKICAgICBzaXplX3Qgc2hyaW5rYWJsZV9zaXplX2luX2J5dGVzID0gY2h1bmtfYXRfZW5kLT5zaXplKCk7CiAgICAgc2l6ZV90IGFsaWduZWRfc2hyaW5rYWJsZV9zaXplX2luX2J5dGVzID0KICAgICAgIGFsaWduX3NpemVfZG93bihzaHJpbmthYmxlX3NpemVfaW5fYnl0ZXMsIG9zOjp2bV9wYWdlX3NpemUoKSk7Ci0gICAgYXNzZXJ0KHVuYWxsb2NhdGVkX3N0YXJ0IDw9IGNodW5rX2F0X2VuZC0+ZW5kKCksCisgICAgYXNzZXJ0KHVuYWxsb2NhdGVkX3N0YXJ0IDw9IChIZWFwV29yZCopIGNodW5rX2F0X2VuZC0+ZW5kKCksCiAgICAgICAiSW5jb25zaXN0ZW50IGNodW5rIGF0IGVuZCBvZiBzcGFjZSIpOwogICAgIHNpemVfdCBieXRlcyA9IE1JTjIoZGVzaXJlZF9ieXRlcywgYWxpZ25lZF9zaHJpbmthYmxlX3NpemVfaW5fYnl0ZXMpOwogICAgIHNpemVfdCB3b3JkX3NpemVfYmVmb3JlID0gaGVhcF93b3JkX3NpemUoX3ZpcnR1YWxfc3BhY2UuY29tbWl0dGVkX3NpemUoKSk7CkBAIC05MjEwLDcgKzkyMTAsNyBAQAogCiAgICAgYXNzZXJ0KF9jbXNTcGFjZS0+dW5hbGxvY2F0ZWRfYmxvY2soKSA8PSBfY21zU3BhY2UtPmVuZCgpLAogICAgICAgIkluY29uc2lzdGVuY3kgYXQgZW5kIG9mIHNwYWNlIik7Ci0gICAgYXNzZXJ0KGNodW5rX2F0X2VuZC0+ZW5kKCkgPT0gX2Ntc1NwYWNlLT5lbmQoKSwKKyAgICBhc3NlcnQoY2h1bmtfYXRfZW5kLT5lbmQoKSA9PSAodWludHB0cl90KikgX2Ntc1NwYWNlLT5lbmQoKSwKICAgICAgICJTaHJpbmtpbmcgaXMgaW5jb25zaXN0ZW50Iik7CiAgICAgcmV0dXJuOwogICB9CmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9zaGFyZS92bS9nY19pbXBsZW1lbnRhdGlvbi9jb25jdXJyZW50TWFya1N3ZWVwL2ZyZWVDaHVuay5ocHAgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9nY19pbXBsZW1lbnRhdGlvbi9jb25jdXJyZW50TWFya1N3ZWVwL2ZyZWVDaHVuay5ocHAKaW5kZXggMjE5MzRiYy4uODM3NmU4NyAxMDA2NDQKLS0tIGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vZ2NfaW1wbGVtZW50YXRpb24vY29uY3VycmVudE1hcmtTd2VlcC9mcmVlQ2h1bmsuaHBwCisrKyBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2djX2ltcGxlbWVudGF0aW9uL2NvbmN1cnJlbnRNYXJrU3dlZXAvZnJlZUNodW5rLmhwcApAQCAtMTMzLDcgKzEzMyw3IEBACiAgIH0KIAogICAvLyBSZXR1cm4gdGhlIGFkZHJlc3MgcGFzdCB0aGUgZW5kIG9mIHRoaXMgY2h1bmsKLSAgSGVhcFdvcmQqIGVuZCgpIGNvbnN0IHsgcmV0dXJuICgoSGVhcFdvcmQqKSB0aGlzKSArIHNpemUoKTsgfQorICB1aW50cHRyX3QqIGVuZCgpIGNvbnN0IHsgcmV0dXJuICgodWludHB0cl90KikgdGhpcykgKyBzaXplKCk7IH0KIAogICAvLyBkZWJ1Z2dpbmcKICAgdm9pZCB2ZXJpZnkoKSAgICAgICAgICAgICBjb25zdCBQUk9EVUNUX1JFVFVSTjsKZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2djX2ltcGxlbWVudGF0aW9uL2NvbmN1cnJlbnRNYXJrU3dlZXAvdm1TdHJ1Y3RzX2Ntcy5ocHAgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9nY19pbXBsZW1lbnRhdGlvbi9jb25jdXJyZW50TWFya1N3ZWVwL3ZtU3RydWN0c19jbXMuaHBwCmluZGV4IGMzOTNhNTUuLmI3MjI3NzkgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2djX2ltcGxlbWVudGF0aW9uL2NvbmN1cnJlbnRNYXJrU3dlZXAvdm1TdHJ1Y3RzX2Ntcy5ocHAKKysrIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vZ2NfaW1wbGVtZW50YXRpb24vY29uY3VycmVudE1hcmtTd2VlcC92bVN0cnVjdHNfY21zLmhwcApAQCAtMjUsNiArMjUsOCBAQAogI2lmbmRlZiBTSEFSRV9WTV9HQ19JTVBMRU1FTlRBVElPTl9DT05DVVJSRU5UTUFSS1NXRUVQX1ZNU1RSVUNUU19DTVNfSFBQCiAjZGVmaW5lIFNIQVJFX1ZNX0dDX0lNUExFTUVOVEFUSU9OX0NPTkNVUlJFTlRNQVJLU1dFRVBfVk1TVFJVQ1RTX0NNU19IUFAKIAordHlwZWRlZiBCaW5hcnlUcmVlRGljdGlvbmFyeTxGcmVlQ2h1bmssIEFkYXB0aXZlRnJlZUxpc3Q+IEFGTEJpbmFyeVRyZWVEaWN0aW9uYXJ5OworCiAjZGVmaW5lIFZNX1NUUlVDVFNfQ01TKG5vbnN0YXRpY19maWVsZCwgXAogICAgICAgICAgICAgICAgICAgIHZvbGF0aWxlX25vbnN0YXRpY19maWVsZCwgXAogICAgICAgICAgICAgICAgICAgIHN0YXRpY19maWVsZCkgXApAQCAtMzgsMTQgKzQwLDggQEAKICAgbm9uc3RhdGljX2ZpZWxkKENNU0NvbGxlY3RvciwgICAgICAgICAgICAgICAgX21hcmtCaXRNYXAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTVNCaXRNYXApICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIG5vbnN0YXRpY19maWVsZChDb25jdXJyZW50TWFya1N3ZWVwR2VuZXJhdGlvbiwgX2Ntc1NwYWNlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcGFjdGlibGVGcmVlTGlzdFNwYWNlKikgICAgICAgICAgICAgXAogICAgICBzdGF0aWNfZmllbGQoQ29uY3VycmVudE1hcmtTd2VlcFRocmVhZCwgICBfY29sbGVjdG9yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENNU0NvbGxlY3RvciopICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgdm9sYXRpbGVfbm9uc3RhdGljX2ZpZWxkKEZyZWVDaHVuaywgICAgICAgICAgX3NpemUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIG5vbnN0YXRpY19maWVsZChGcmVlQ2h1bmssICAgICAgICAgICAgICAgICAgIF9uZXh0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJlZUNodW5rKikgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBub25zdGF0aWNfZmllbGQoRnJlZUNodW5rLCAgICAgICAgICAgICAgICAgICBfcHJldiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyZWVDaHVuayopICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgbm9uc3RhdGljX2ZpZWxkKExpbmVhckFsbG9jQmxvY2ssICAgICAgICAgICAgX3dvcmRfc2l6ZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIG5vbnN0YXRpY19maWVsZChGcmVlTGlzdDxGcmVlQ2h1bms+LCAgICAgICAgIF9zaXplLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBub25zdGF0aWNfZmllbGQoRnJlZUxpc3Q8RnJlZUNodW5rPiwgICAgICAgICBfY291bnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzaXplX3QpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgbm9uc3RhdGljX2ZpZWxkKEJpbmFyeVRyZWVEaWN0aW9uYXJ5PEZyZWVDaHVuaz4sX3RvdGFsX3NpemUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBub25zdGF0aWNfZmllbGQoQ29tcGFjdGlibGVGcmVlTGlzdFNwYWNlLCAgICBfZGljdGlvbmFyeSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyZWVCbG9ja0RpY3Rpb25hcnk8RnJlZUNodW5rPiopICAgICAgIFwKKyAgbm9uc3RhdGljX2ZpZWxkKEFGTEJpbmFyeVRyZWVEaWN0aW9uYXJ5LCAgICAgX3RvdGFsX3NpemUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIG5vbnN0YXRpY19maWVsZChDb21wYWN0aWJsZUZyZWVMaXN0U3BhY2UsICAgIF9pbmRleGVkRnJlZUxpc3RbMF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJlZUxpc3Q8RnJlZUNodW5rPikgICAgICAgICAgICAgICAgICAgXAogICBub25zdGF0aWNfZmllbGQoQ29tcGFjdGlibGVGcmVlTGlzdFNwYWNlLCAgICBfc21hbGxMaW5lYXJBbGxvY0Jsb2NrLCAgICAgICAgICAgICAgICAgICAgICAgIExpbmVhckFsbG9jQmxvY2spCiAKQEAgLTYwLDE5ICs1NiwxNyBAQAogICBkZWNsYXJlX3RvcGxldmVsX3R5cGUoQ01TQ29sbGVjdG9yKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIGRlY2xhcmVfdG9wbGV2ZWxfdHlwZShDTVNCaXRNYXApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgZGVjbGFyZV90b3BsZXZlbF90eXBlKEZyZWVDaHVuaykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkZWNsYXJlX3RvcGxldmVsX3R5cGUoTWV0YWJsb2NrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIGRlY2xhcmVfdG9wbGV2ZWxfdHlwZShDb25jdXJyZW50TWFya1N3ZWVwVGhyZWFkKikgICAgICAgICAgICAgICAgICAgICAgIFwKICAgZGVjbGFyZV90b3BsZXZlbF90eXBlKENvbmN1cnJlbnRNYXJrU3dlZXBHZW5lcmF0aW9uKikgICAgICAgICAgICAgICAgICAgXAogICBkZWNsYXJlX3RvcGxldmVsX3R5cGUoU3Vycm9nYXRlTG9ja2VyVGhyZWFkKikgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIGRlY2xhcmVfdG9wbGV2ZWxfdHlwZShDb21wYWN0aWJsZUZyZWVMaXN0U3BhY2UqKSAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgZGVjbGFyZV90b3BsZXZlbF90eXBlKENNU0NvbGxlY3RvciopICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBkZWNsYXJlX3RvcGxldmVsX3R5cGUoRnJlZUNodW5rKikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGRlY2xhcmVfdG9wbGV2ZWxfdHlwZShCaW5hcnlUcmVlRGljdGlvbmFyeTxGcmVlQ2h1bms+KikgICAgICAgICAgICAgICAgIFwKLSAgZGVjbGFyZV90b3BsZXZlbF90eXBlKEZyZWVCbG9ja0RpY3Rpb25hcnk8RnJlZUNodW5rPiopICAgICAgICAgICAgICAgICAgXAotICBkZWNsYXJlX3RvcGxldmVsX3R5cGUoRnJlZUxpc3Q8RnJlZUNodW5rPiopICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGRlY2xhcmVfdG9wbGV2ZWxfdHlwZShGcmVlTGlzdDxGcmVlQ2h1bms+KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZGVjbGFyZV90b3BsZXZlbF90eXBlKEFGTEJpbmFyeVRyZWVEaWN0aW9uYXJ5KikgICAgICAgICAgICAgICAgICAgICAgICAgXAogICBkZWNsYXJlX3RvcGxldmVsX3R5cGUoTGluZWFyQWxsb2NCbG9jaykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIGRlY2xhcmVfdG9wbGV2ZWxfdHlwZShGcmVlQmxvY2tEaWN0aW9uYXJ5PEZyZWVDaHVuaz4pICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGRlY2xhcmVfdHlwZShCaW5hcnlUcmVlRGljdGlvbmFyeTxGcmVlQ2h1bms+LCBGcmVlQmxvY2tEaWN0aW9uYXJ5PEZyZWVDaHVuaz4pCisgIGRlY2xhcmVfdHlwZShBRkxCaW5hcnlUcmVlRGljdGlvbmFyeSwgRnJlZUJsb2NrRGljdGlvbmFyeTxGcmVlQ2h1bms+KSAgIFwKKyAgICAgICAgICAgIGRlY2xhcmVfdHlwZShBRkxCaW5hcnlUcmVlRGljdGlvbmFyeSwgRnJlZUJsb2NrRGljdGlvbmFyeTxGcmVlQ2h1bms+KSBcCiAKICNkZWZpbmUgVk1fSU5UX0NPTlNUQU5UU19DTVMoZGVjbGFyZV9jb25zdGFudCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICBkZWNsYXJlX2NvbnN0YW50KEdlbmVyYXRpb246OkNvbmN1cnJlbnRNYXJrU3dlZXApICAgICAgICAgICAgICAgICAgICAgICBcCmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9zaGFyZS92bS9nY19pbXBsZW1lbnRhdGlvbi9zaGFyZWQvdm1HQ09wZXJhdGlvbnMuaHBwIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vZ2NfaW1wbGVtZW50YXRpb24vc2hhcmVkL3ZtR0NPcGVyYXRpb25zLmhwcAppbmRleCAzOTY2ODc3Li4yODVlZjk3IDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9zaGFyZS92bS9nY19pbXBsZW1lbnRhdGlvbi9zaGFyZWQvdm1HQ09wZXJhdGlvbnMuaHBwCisrKyBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL2djX2ltcGxlbWVudGF0aW9uL3NoYXJlZC92bUdDT3BlcmF0aW9ucy5ocHAKQEAgLTE5MSw3ICsxOTEsNyBAQAogY2xhc3MgVk1fQ29sbGVjdEZvck1ldGFkYXRhQWxsb2NhdGlvbjogcHVibGljIFZNX0dDX09wZXJhdGlvbiB7CiAgcHJpdmF0ZToKICAgTWV0YVdvcmQqICAgICAgICAgICAgICAgIF9yZXN1bHQ7Ci0gIHNpemVfdCAgICAgIF9zaXplOyAgICAgICAgICAgICAgICAgICAgICAgLy8gc2l6ZSBvZiBvYmplY3QgdG8gYmUgYWxsb2NhdGVkCisgIHNpemVfdCAgICAgICAgICAgICAgICAgICBfc2l6ZTsgICAgIC8vIHNpemUgb2Ygb2JqZWN0IHRvIGJlIGFsbG9jYXRlZAogICBNZXRhc3BhY2U6Ok1ldGFkYXRhVHlwZSAgX21kdHlwZTsKICAgQ2xhc3NMb2FkZXJEYXRhKiAgICAgICAgIF9sb2FkZXJfZGF0YTsKICBwdWJsaWM6CmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9zaGFyZS92bS9tZW1vcnkvYWxsb2NhdGlvbi5jcHAgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9tZW1vcnkvYWxsb2NhdGlvbi5jcHAKaW5kZXggNTZjN2I2My4uOTJiMzM1YiAxMDA2NDQKLS0tIGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vbWVtb3J5L2FsbG9jYXRpb24uY3BwCisrKyBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL21lbW9yeS9hbGxvY2F0aW9uLmNwcApAQCAtNDMzLDE5ICs0MzMsMTggQEAKICAgTk9UX1BST0RVQ1QoQXRvbWljOjppbmMoJl9pbnN0YW5jZV9jb3VudCk7KQogfQogCi1BcmVuYTo6QXJlbmEoQXJlbmEgKmEpIDogX2NodW5rKGEtPl9jaHVuayksIF9od20oYS0+X2h3bSksIF9tYXgoYS0+X21heCksIF9maXJzdChhLT5fZmlyc3QpIHsKLSAgc2V0X3NpemVfaW5fYnl0ZXMoYS0+c2l6ZV9pbl9ieXRlcygpKTsKLSAgTk9UX1BST0RVQ1QoQXRvbWljOjppbmMoJl9pbnN0YW5jZV9jb3VudCk7KQotfQotCi0KIEFyZW5hICpBcmVuYTo6bW92ZV9jb250ZW50cyhBcmVuYSAqY29weSkgewogICBjb3B5LT5kZXN0cnVjdF9jb250ZW50cygpOwogICBjb3B5LT5fY2h1bmsgPSBfY2h1bms7CiAgIGNvcHktPl9od20gICA9IF9od207CiAgIGNvcHktPl9tYXggICA9IF9tYXg7CiAgIGNvcHktPl9maXJzdCA9IF9maXJzdDsKLSAgY29weS0+c2V0X3NpemVfaW5fYnl0ZXMoc2l6ZV9pbl9ieXRlcygpKTsKKworICAvLyB3b3JrYXJvdW5kIHJhcmUgcmFjaW5nIGNvbmRpdGlvbiwgd2hpY2ggY291bGQgZG91YmxlIGNvdW50CisgIC8vIHRoZSBhcmVuYSBzaXplIGJ5IG5hdGl2ZSBtZW1vcnkgdHJhY2tpbmcKKyAgc2l6ZV90IHNpemUgPSBzaXplX2luX2J5dGVzKCk7CisgIHNldF9zaXplX2luX2J5dGVzKDApOworICBjb3B5LT5zZXRfc2l6ZV9pbl9ieXRlcyhzaXplKTsKICAgLy8gRGVzdHJveSBvcmlnaW5hbCBhcmVuYQogICByZXNldCgpOwogICByZXR1cm4gY29weTsgICAgICAgICAgICAvLyBSZXR1cm4gQXJlbmEgd2l0aCBjb250ZW50cwpAQCAtNDk3LDYgKzQ5Niw5IEBACiAgICAgY2hhciogZW5kID0gX2ZpcnN0LT5uZXh0KCkgPyBfZmlyc3QtPnRvcCgpIDogX2h3bTsKICAgICBmcmVlX21hbGxvY2VkX29iamVjdHMoX2ZpcnN0LCBfZmlyc3QtPmJvdHRvbSgpLCBlbmQsIF9od20pOwogICB9CisgIC8vIHJlc2V0IHNpemUgYmVmb3JlIGNob3AgdG8gYXZvaWQgYSByYXJlIHJhY2luZyBjb25kaXRpb24KKyAgLy8gdGhhdCBjYW4gaGF2ZSB0b3RhbCBhcmVuYSBtZW1vcnkgZXhjZWVkIHRvdGFsIGNodW5rIG1lbW9yeQorICBzZXRfc2l6ZV9pbl9ieXRlcygwKTsKICAgX2ZpcnN0LT5jaG9wKCk7CiAgIHJlc2V0KCk7CiB9CmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9zaGFyZS92bS9tZW1vcnkvYWxsb2NhdGlvbi5ocHAgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9tZW1vcnkvYWxsb2NhdGlvbi5ocHAKaW5kZXggMzA2NjJiOC4uODkyZTUwZCAxMDA2NDQKLS0tIGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vbWVtb3J5L2FsbG9jYXRpb24uaHBwCisrKyBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL21lbW9yeS9hbGxvY2F0aW9uLmhwcApAQCAtMTQ0LDggKzE0NCwxMCBAQAogICBtdE5NVCAgICAgICAgICAgICAgID0gMHgwQTAwLCAgLy8gbWVtb3J5IHVzZWQgYnkgbmF0aXZlIG1lbW9yeSB0cmFja2luZwogICBtdENodW5rICAgICAgICAgICAgID0gMHgwQjAwLCAgLy8gY2h1bmsgdGhhdCBob2xkcyBjb250ZW50IG9mIGFyZW5hcwogICBtdEphdmFIZWFwICAgICAgICAgID0gMHgwQzAwLCAgLy8gSmF2YSBoZWFwCi0gIG10RG9udFRyYWNrICAgICAgICAgPSAweDBEMDAsICAvLyBtZW1vcnkgd2UgZG9ub3Qgb3IgY2Fubm90IHRyYWNrCi0gIG10X251bWJlcl9vZl90eXBlcyAgPSAweDAwMEMsICAvLyBudW1iZXIgb2YgbWVtb3J5IHR5cGVzCisgIG10Q2xhc3NTaGFyZWQgICAgICAgPSAweDBEMDAsICAvLyBjbGFzcyBkYXRhIHNoYXJpbmcKKyAgbXRfbnVtYmVyX29mX3R5cGVzICA9IDB4MDAwRCwgIC8vIG51bWJlciBvZiBtZW1vcnkgdHlwZXMgKG10RG9udFRyYWNrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBub3QgaW5jbHVkZWQgYXMgdmFsaWRhdGUgdHlwZSkKKyAgbXREb250VHJhY2sgICAgICAgICA9IDB4MEUwMCwgIC8vIG1lbW9yeSB3ZSBkbyBub3Qgb3IgY2Fubm90IHRyYWNrCiAgIG10X21hc2tzICAgICAgICAgICAgPSAweDdGMDAsCiAKICAgLy8gb2JqZWN0IHR5cGUgbWFzawpAQCAtMzQyLDcgKzM0NCw2IEBACiAgcHVibGljOgogICBBcmVuYSgpOwogICBBcmVuYShzaXplX3QgaW5pdF9zaXplKTsKLSAgQXJlbmEoQXJlbmEgKm9sZCk7CiAgIH5BcmVuYSgpOwogICB2b2lkICBkZXN0cnVjdF9jb250ZW50cygpOwogICBjaGFyKiBod20oKSBjb25zdCAgICAgICAgICAgICB7IHJldHVybiBfaHdtOyB9CmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9zaGFyZS92bS9tZW1vcnkvYmluYXJ5VHJlZURpY3Rpb25hcnkuY3BwIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vbWVtb3J5L2JpbmFyeVRyZWVEaWN0aW9uYXJ5LmNwcAppbmRleCAwOGE5YjAzLi5mNzlkMTQ5IDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9zaGFyZS92bS9tZW1vcnkvYmluYXJ5VHJlZURpY3Rpb25hcnkuY3BwCisrKyBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL21lbW9yeS9iaW5hcnlUcmVlRGljdGlvbmFyeS5jcHAKQEAgLTI1LDkgKzI1LDE1IEBACiAjaW5jbHVkZSAicHJlY29tcGlsZWQuaHBwIgogI2luY2x1ZGUgImdjX2ltcGxlbWVudGF0aW9uL3NoYXJlZC9hbGxvY2F0aW9uU3RhdHMuaHBwIgogI2luY2x1ZGUgIm1lbW9yeS9iaW5hcnlUcmVlRGljdGlvbmFyeS5ocHAiCisjaW5jbHVkZSAibWVtb3J5L2ZyZWVMaXN0LmhwcCIKKyNpbmNsdWRlICJtZW1vcnkvZnJlZUJsb2NrRGljdGlvbmFyeS5ocHAiCisjaW5jbHVkZSAibWVtb3J5L21ldGFibG9jay5ocHAiCisjaW5jbHVkZSAibWVtb3J5L21ldGFjaHVuay5ocHAiCiAjaW5jbHVkZSAicnVudGltZS9nbG9iYWxzLmhwcCIKICNpbmNsdWRlICJ1dGlsaXRpZXMvb3N0cmVhbS5ocHAiCiAjaWZuZGVmIFNFUklBTEdDCisjaW5jbHVkZSAiZ2NfaW1wbGVtZW50YXRpb24vY29uY3VycmVudE1hcmtTd2VlcC9hZGFwdGl2ZUZyZWVMaXN0LmhwcCIKKyNpbmNsdWRlICJnY19pbXBsZW1lbnRhdGlvbi9jb25jdXJyZW50TWFya1N3ZWVwL2ZyZWVDaHVuay5ocHAiCiAjaW5jbHVkZSAiZ2NfaW1wbGVtZW50YXRpb24vc2hhcmVkL3NwYWNlRGVjb3JhdG9yLmhwcCIKICNpbmNsdWRlICJnY19pbXBsZW1lbnRhdGlvbi9jb25jdXJyZW50TWFya1N3ZWVwL2ZyZWVDaHVuay5ocHAiCiAjZW5kaWYgLy8gU0VSSUFMR0MKQEAgLTM3LDE1ICs0MywxOCBAQAogLy8gVGhpcyBpcyBjdXJyZW50bHkgdXNlZCBpbiB0aGUgQ29uY3VycmVudCBNYXJrJlN3ZWVwIGltcGxlbWVudGF0aW9uLgogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotdGVtcGxhdGUgPGNsYXNzIENodW5rPgotVHJlZUNodW5rPENodW5rPiogVHJlZUNodW5rPENodW5rPjo6YXNfVHJlZUNodW5rKENodW5rKiBmYykgewordGVtcGxhdGUgPGNsYXNzIENodW5rX3QsIHRlbXBsYXRlIDxjbGFzcz4gY2xhc3MgRnJlZUxpc3RfdD4KK3NpemVfdCBUcmVlQ2h1bms8Q2h1bmtfdCwgRnJlZUxpc3RfdD46Ol9taW5fdHJlZV9jaHVua19zaXplID0gc2l6ZW9mKFRyZWVDaHVuazxDaHVua190LCAgRnJlZUxpc3RfdD4pL0hlYXBXb3JkU2l6ZTsKKwordGVtcGxhdGUgPGNsYXNzIENodW5rX3QsIHRlbXBsYXRlIDxjbGFzcz4gY2xhc3MgRnJlZUxpc3RfdD4KK1RyZWVDaHVuazxDaHVua190LCBGcmVlTGlzdF90PiogVHJlZUNodW5rPENodW5rX3QsIEZyZWVMaXN0X3Q+Ojphc19UcmVlQ2h1bmsoQ2h1bmtfdCogZmMpIHsKICAgLy8gRG8gc29tZSBhc3NlcnRpb24gY2hlY2tpbmcgaGVyZS4KLSAgcmV0dXJuIChUcmVlQ2h1bms8Q2h1bms+KikgZmM7CisgIHJldHVybiAoVHJlZUNodW5rPENodW5rX3QsIEZyZWVMaXN0X3Q+KikgZmM7CiB9CiAKLXRlbXBsYXRlIDxjbGFzcyBDaHVuaz4KLXZvaWQgVHJlZUNodW5rPENodW5rPjo6dmVyaWZ5X3RyZWVfY2h1bmtfbGlzdCgpIGNvbnN0IHsKLSAgVHJlZUNodW5rPENodW5rPiogbmV4dFRDID0gKFRyZWVDaHVuazxDaHVuaz4qKW5leHQoKTsKK3RlbXBsYXRlIDxjbGFzcyBDaHVua190LCB0ZW1wbGF0ZSA8Y2xhc3M+IGNsYXNzIEZyZWVMaXN0X3Q+Cit2b2lkIFRyZWVDaHVuazxDaHVua190LCBGcmVlTGlzdF90Pjo6dmVyaWZ5X3RyZWVfY2h1bmtfbGlzdCgpIGNvbnN0IHsKKyAgVHJlZUNodW5rPENodW5rX3QsIEZyZWVMaXN0X3Q+KiBuZXh0VEMgPSAoVHJlZUNodW5rPENodW5rX3QsIEZyZWVMaXN0X3Q+KiluZXh0KCk7CiAgIGlmIChwcmV2KCkgIT0gTlVMTCkgeyAvLyBpbnRlcmlvciBsaXN0IG5vZGUgc2hvdWxkbidyIGhhdmUgdHJlZSBmaWVsZHMKICAgICBndWFyYW50ZWUoZW1iZWRkZWRfbGlzdCgpLT5wYXJlbnQoKSA9PSBOVUxMICYmIGVtYmVkZGVkX2xpc3QoKS0+bGVmdCgpID09IE5VTEwgJiYKICAgICAgICAgICAgICAgZW1iZWRkZWRfbGlzdCgpLT5yaWdodCgpICA9PSBOVUxMLCAic2hvdWxkIGJlIGNsZWFyIik7CkBAIC01Nyw1MyArNjYsMTEzIEBACiAgIH0KIH0KIAordGVtcGxhdGUgPGNsYXNzIENodW5rX3QsIHRlbXBsYXRlIDxjbGFzcz4gY2xhc3MgRnJlZUxpc3RfdD4KK1RyZWVMaXN0PENodW5rX3QsIEZyZWVMaXN0X3Q+OjpUcmVlTGlzdCgpIHt9CiAKLXRlbXBsYXRlIDxjbGFzcyBDaHVuaz4KLVRyZWVMaXN0PENodW5rPiogVHJlZUxpc3Q8Q2h1bms+Ojphc19UcmVlTGlzdChUcmVlQ2h1bms8Q2h1bms+KiB0YykgewordGVtcGxhdGUgPGNsYXNzIENodW5rX3QsIHRlbXBsYXRlIDxjbGFzcz4gY2xhc3MgRnJlZUxpc3RfdD4KK1RyZWVMaXN0PENodW5rX3QsIEZyZWVMaXN0X3Q+KgorVHJlZUxpc3Q8Q2h1bmtfdCwgRnJlZUxpc3RfdD46OmFzX1RyZWVMaXN0KFRyZWVDaHVuazxDaHVua190LEZyZWVMaXN0X3Q+KiB0YykgewogICAvLyBUaGlzIGZpcnN0IGZyZWUgY2h1bmsgaW4gdGhlIGxpc3Qgd2lsbCBiZSB0aGUgdHJlZSBsaXN0LgotICBhc3NlcnQodGMtPnNpemUoKSA+PSBCaW5hcnlUcmVlRGljdGlvbmFyeTxDaHVuaz46Om1pbl90cmVlX2NodW5rX3NpemUsICJDaHVuayBpcyB0b28gc21hbGwgZm9yIGEgVHJlZUNodW5rIik7Ci0gIFRyZWVMaXN0PENodW5rPiogdGwgPSB0Yy0+ZW1iZWRkZWRfbGlzdCgpOworICBhc3NlcnQoKHRjLT5zaXplKCkgPj0gKFRyZWVDaHVuazxDaHVua190LCBGcmVlTGlzdF90Pjo6bWluX3NpemUoKSkpLAorICAgICJDaHVuayBpcyB0b28gc21hbGwgZm9yIGEgVHJlZUNodW5rIik7CisgIFRyZWVMaXN0PENodW5rX3QsIEZyZWVMaXN0X3Q+KiB0bCA9IHRjLT5lbWJlZGRlZF9saXN0KCk7CisgIHRsLT5pbml0aWFsaXplKCk7CiAgIHRjLT5zZXRfbGlzdCh0bCk7Ci0jaWZkZWYgQVNTRVJUCi0gIHRsLT5zZXRfcHJvdGVjdGluZ19sb2NrKE5VTEwpOwotI2VuZGlmCi0gIHRsLT5zZXRfaGludCgwKTsKICAgdGwtPnNldF9zaXplKHRjLT5zaXplKCkpOwogICB0bC0+bGlua19oZWFkKHRjKTsKICAgdGwtPmxpbmtfdGFpbCh0Yyk7CiAgIHRsLT5zZXRfY291bnQoMSk7Ci0gIHRsLT5pbml0X3N0YXRpc3RpY3ModHJ1ZSAvKiBzcGxpdF9iaXJ0aCAqLyk7Ci0gIHRsLT5zZXRfcGFyZW50KE5VTEwpOwotICB0bC0+c2V0X2xlZnQoTlVMTCk7Ci0gIHRsLT5zZXRfcmlnaHQoTlVMTCk7CisKICAgcmV0dXJuIHRsOwogfQogCi10ZW1wbGF0ZSA8Y2xhc3MgQ2h1bms+Ci1UcmVlTGlzdDxDaHVuaz4qIFRyZWVMaXN0PENodW5rPjo6YXNfVHJlZUxpc3QoSGVhcFdvcmQqIGFkZHIsIHNpemVfdCBzaXplKSB7Ci0gIFRyZWVDaHVuazxDaHVuaz4qIHRjID0gKFRyZWVDaHVuazxDaHVuaz4qKSBhZGRyOwotICBhc3NlcnQoc2l6ZSA+PSBCaW5hcnlUcmVlRGljdGlvbmFyeTxDaHVuaz46Om1pbl90cmVlX2NodW5rX3NpemUsICJDaHVuayBpcyB0b28gc21hbGwgZm9yIGEgVHJlZUNodW5rIik7Ci0gIC8vIFRoZSBzcGFjZSBpbiB0aGUgaGVhcCB3aWxsIGhhdmUgYmVlbiBtYW5nbGVkIGluaXRpYWxseSBidXQKLSAgLy8gaXMgbm90IHJlbWFuZ2xlZCB3aGVuIGEgZnJlZSBjaHVuayBpcyByZXR1cm5lZCB0byB0aGUgZnJlZSBsaXN0CisKK3RlbXBsYXRlIDxjbGFzcyBDaHVua190LCB0ZW1wbGF0ZSA8Y2xhc3M+IGNsYXNzIEZyZWVMaXN0X3Q+CitUcmVlTGlzdDxDaHVua190LCBGcmVlTGlzdF90PioKK2dldF9jaHVuayhzaXplX3Qgc2l6ZSwgZW51bSBGcmVlQmxvY2tEaWN0aW9uYXJ5PENodW5rX3Q+OjpEaXRoZXIgZGl0aGVyKSB7CisgIEZyZWVCbG9ja0RpY3Rpb25hcnk8Q2h1bmtfdD46OnZlcmlmeV9wYXJfbG9ja2VkKCk7CisgIENodW5rX3QqIHJlcyA9IGdldF9jaHVua19mcm9tX3RyZWUoc2l6ZSwgZGl0aGVyKTsKKyAgYXNzZXJ0KHJlcyA9PSBOVUxMIHx8IHJlcy0+aXNfZnJlZSgpLAorICAgICAgICAgIlNob3VsZCBiZSByZXR1cm5pbmcgYSBmcmVlIGNodW5rIik7CisgIGFzc2VydChkaXRoZXIgIT0gRnJlZUJsb2NrRGljdGlvbmFyeTxDaHVua190Pjo6ZXhhY3RseSB8fAorICAgICAgICAgcmVzLT5zaXplKCkgPT0gc2l6ZSwgIk5vdCBjb3JyZWN0IHNpemUiKTsKKyAgcmV0dXJuIHJlczsKK30KKwordGVtcGxhdGUgPGNsYXNzIENodW5rX3QsIHRlbXBsYXRlIDxjbGFzcz4gY2xhc3MgRnJlZUxpc3RfdD4KK1RyZWVMaXN0PENodW5rX3QsIEZyZWVMaXN0X3Q+KgorVHJlZUxpc3Q8Q2h1bmtfdCwgRnJlZUxpc3RfdD46OmFzX1RyZWVMaXN0KEhlYXBXb3JkKiBhZGRyLCBzaXplX3Qgc2l6ZSkgeworICBUcmVlQ2h1bms8Q2h1bmtfdCwgRnJlZUxpc3RfdD4qIHRjID0gKFRyZWVDaHVuazxDaHVua190LCBGcmVlTGlzdF90PiopIGFkZHI7CisgIGFzc2VydCgoc2l6ZSA+PSBUcmVlQ2h1bms8Q2h1bmtfdCwgRnJlZUxpc3RfdD46Om1pbl9zaXplKCkpLAorICAgICJDaHVuayBpcyB0b28gc21hbGwgZm9yIGEgVHJlZUNodW5rIik7CisgIC8vIFRoZSBzcGFjZSB3aWxsIGhhdmUgYmVlbiBtYW5nbGVkIGluaXRpYWxseSBidXQKKyAgLy8gaXMgbm90IHJlbWFuZ2xlZCB3aGVuIGEgQ2h1bmtfdCBpcyByZXR1cm5lZCB0byB0aGUgZnJlZSBsaXN0CiAgIC8vIChzaW5jZSBpdCBpcyB1c2VkIHRvIG1haW50YWluIHRoZSBjaHVuayBvbiB0aGUgZnJlZSBsaXN0KS4KLSAgYXNzZXJ0KChaYXBVbnVzZWRIZWFwQXJlYSAmJgotICAgICAgICAgIFNwYWNlTWFuZ2xlcjo6aXNfbWFuZ2xlZCgoSGVhcFdvcmQqKSB0Yy0+c2l6ZV9hZGRyKCkpICYmCi0gICAgICAgICAgU3BhY2VNYW5nbGVyOjppc19tYW5nbGVkKChIZWFwV29yZCopIHRjLT5wcmV2X2FkZHIoKSkgJiYKLSAgICAgICAgICBTcGFjZU1hbmdsZXI6OmlzX21hbmdsZWQoKEhlYXBXb3JkKikgdGMtPm5leHRfYWRkcigpKSkgfHwKLSAgICAgICAgICAodGMtPnNpemUoKSA9PSAwICYmIHRjLT5wcmV2KCkgPT0gTlVMTCAmJiB0Yy0+bmV4dCgpID09IE5VTEwpLAotICAgICJTcGFjZSBzaG91bGQgYmUgY2xlYXIgb3IgbWFuZ2xlZCIpOworICB0Yy0+YXNzZXJ0X2lzX21hbmdsZWQoKTsKICAgdGMtPnNldF9zaXplKHNpemUpOwogICB0Yy0+bGlua19wcmV2KE5VTEwpOwogICB0Yy0+bGlua19uZXh0KE5VTEwpOwotICBUcmVlTGlzdDxDaHVuaz4qIHRsID0gVHJlZUxpc3Q8Q2h1bms+Ojphc19UcmVlTGlzdCh0Yyk7CisgIFRyZWVMaXN0PENodW5rX3QsIEZyZWVMaXN0X3Q+KiB0bCA9IFRyZWVMaXN0PENodW5rX3QsIEZyZWVMaXN0X3Q+Ojphc19UcmVlTGlzdCh0Yyk7CiAgIHJldHVybiB0bDsKIH0KIAotdGVtcGxhdGUgPGNsYXNzIENodW5rPgotVHJlZUxpc3Q8Q2h1bms+KiBUcmVlTGlzdDxDaHVuaz46OnJlbW92ZV9jaHVua19yZXBsYWNlX2lmX25lZWRlZChUcmVlQ2h1bms8Q2h1bms+KiB0YykgewogCi0gIFRyZWVMaXN0PENodW5rPiogcmV0VEwgPSB0aGlzOwotICBDaHVuayogbGlzdCA9IGhlYWQoKTsKKyNpZm5kZWYgU0VSSUFMR0MKKy8vIFNwZWNpYWxpemUgZm9yIEFkYXB0aXZlRnJlZUxpc3Qgd2hpY2ggdHJpZXMgdG8gYXZvaWQKKy8vIHNwbGl0dGluZyBhIGNodW5rIG9mIGEgc2l6ZSB0aGF0IGlzIHVuZGVyIHBvcHVsYXRlZCBpbiBmYXZvciBvZgorLy8gYW4gb3ZlciBwb3B1bGF0ZWQgc2l6ZS4gIFRoZSBnZW5lcmFsIGdldF9iZXR0ZXJfbGlzdCgpIGp1c3QgcmV0dXJucworLy8gdGhlIGN1cnJlbnQgbGlzdC4KK3RlbXBsYXRlIDw+CitUcmVlTGlzdDxGcmVlQ2h1bmssIEFkYXB0aXZlRnJlZUxpc3Q+KgorVHJlZUxpc3Q8RnJlZUNodW5rLCBBZGFwdGl2ZUZyZWVMaXN0Pjo6Z2V0X2JldHRlcl9saXN0KAorICBCaW5hcnlUcmVlRGljdGlvbmFyeTxGcmVlQ2h1bmssIDo6QWRhcHRpdmVGcmVlTGlzdD4qIGRpY3Rpb25hcnkpIHsKKyAgLy8gQSBjYW5kaWRhdGUgY2h1bmsgaGFzIGJlZW4gZm91bmQuICBJZiBpdCBpcyBhbHJlYWR5IHVuZGVyCisgIC8vIHBvcHVsYXRlZCwgZ2V0IGEgY2h1bmsgYXNzb2NpYXRlZCB3aXRoIHRoZSBoaW50IGZvciB0aGlzCisgIC8vIGNodW5rLgorCisgIFRyZWVMaXN0PEZyZWVDaHVuaywgOjpBZGFwdGl2ZUZyZWVMaXN0PiogY3VyVEwgPSB0aGlzOworICBpZiAoc3VycGx1cygpIDw9IDApIHsKKyAgICAvKiBVc2UgdGhlIGhpbnQgdG8gZmluZCBhIHNpemUgd2l0aCBhIHN1cnBsdXMsIGFuZCByZXNldCB0aGUgaGludC4gKi8KKyAgICBUcmVlTGlzdDxGcmVlQ2h1bmssIDo6QWRhcHRpdmVGcmVlTGlzdD4qIGhpbnRUTCA9IHRoaXM7CisgICAgd2hpbGUgKGhpbnRUTC0+aGludCgpICE9IDApIHsKKyAgICAgIGFzc2VydChoaW50VEwtPmhpbnQoKSA+IGhpbnRUTC0+c2l6ZSgpLAorICAgICAgICAiaGludCBwb2ludHMgaW4gdGhlIHdyb25nIGRpcmVjdGlvbiIpOworICAgICAgaGludFRMID0gZGljdGlvbmFyeS0+ZmluZF9saXN0KGhpbnRUTC0+aGludCgpKTsKKyAgICAgIGFzc2VydChjdXJUTCAhPSBoaW50VEwsICJJbmZpbml0ZSBsb29wIik7CisgICAgICBpZiAoaGludFRMID09IE5VTEwgfHwKKyAgICAgICAgICBoaW50VEwgPT0gY3VyVEwgLyogU2hvdWxkIG5vdCBoYXBwZW4gYnV0IHByb3RlY3QgYWdhaW5zdCBpdCAqLyApIHsKKyAgICAgICAgLy8gTm8gdXNlZnVsIGhpbnQuICBTZXQgdGhlIGhpbnQgdG8gTlVMTCBhbmQgZ28gb24uCisgICAgICAgIGN1clRMLT5zZXRfaGludCgwKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBhc3NlcnQoaGludFRMLT5zaXplKCkgPiBjdXJUTC0+c2l6ZSgpLCAiaGludCBpcyBpbmNvbnNpc3RlbnQiKTsKKyAgICAgIGlmIChoaW50VEwtPnN1cnBsdXMoKSA+IDApIHsKKyAgICAgICAgLy8gVGhlIGhpbnQgbGVkIHRvIGEgbGlzdCB0aGF0IGhhcyBhIHN1cnBsdXMuICBVc2UgaXQuCisgICAgICAgIC8vIFNldCB0aGUgaGludCBmb3IgdGhlIGNhbmRpZGF0ZSB0byBhbiBvdmVycG9wdWxhdGVkCisgICAgICAgIC8vIHNpemUuCisgICAgICAgIGN1clRMLT5zZXRfaGludChoaW50VEwtPnNpemUoKSk7CisgICAgICAgIC8vIENoYW5nZSB0aGUgY2FuZGlkYXRlLgorICAgICAgICBjdXJUTCA9IGhpbnRUTDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBjdXJUTDsKK30KKyNlbmRpZiAvLyBTRVJJQUxHQworCit0ZW1wbGF0ZSA8Y2xhc3MgQ2h1bmtfdCwgdGVtcGxhdGUgPGNsYXNzPiBjbGFzcyBGcmVlTGlzdF90PgorVHJlZUxpc3Q8Q2h1bmtfdCwgRnJlZUxpc3RfdD4qCitUcmVlTGlzdDxDaHVua190LCBGcmVlTGlzdF90Pjo6Z2V0X2JldHRlcl9saXN0KAorICBCaW5hcnlUcmVlRGljdGlvbmFyeTxDaHVua190LCBGcmVlTGlzdF90PiogZGljdGlvbmFyeSkgeworICByZXR1cm4gdGhpczsKK30KKwordGVtcGxhdGUgPGNsYXNzIENodW5rX3QsIHRlbXBsYXRlIDxjbGFzcz4gY2xhc3MgRnJlZUxpc3RfdD4KK1RyZWVMaXN0PENodW5rX3QsIEZyZWVMaXN0X3Q+KiBUcmVlTGlzdDxDaHVua190LCBGcmVlTGlzdF90Pjo6cmVtb3ZlX2NodW5rX3JlcGxhY2VfaWZfbmVlZGVkKFRyZWVDaHVuazxDaHVua190LCBGcmVlTGlzdF90PiogdGMpIHsKKworICBUcmVlTGlzdDxDaHVua190LCBGcmVlTGlzdF90PiogcmV0VEwgPSB0aGlzOworICBDaHVua190KiBsaXN0ID0gaGVhZCgpOwogICBhc3NlcnQoIWxpc3QgfHwgbGlzdCAhPSBsaXN0LT5uZXh0KCksICJDaHVuayBvbiBsaXN0IHR3aWNlIik7CiAgIGFzc2VydCh0YyAhPSBOVUxMLCAiQ2h1bmsgYmVpbmcgcmVtb3ZlZCBpcyBOVUxMIik7CiAgIGFzc2VydChwYXJlbnQoKSA9PSBOVUxMIHx8IHRoaXMgPT0gcGFyZW50KCktPmxlZnQoKSB8fApAQCAtMTEyLDEzICsxODEsMTMgQEAKICAgYXNzZXJ0KGhlYWQoKSA9PSBOVUxMIHx8IGhlYWQoKS0+cHJldigpID09IE5VTEwsICJsaXN0IGludmFyaWFudCIpOwogICBhc3NlcnQodGFpbCgpID09IE5VTEwgfHwgdGFpbCgpLT5uZXh0KCkgPT0gTlVMTCwgImxpc3QgaW52YXJpYW50Iik7CiAKLSAgQ2h1bmsqIHByZXZGQyA9IHRjLT5wcmV2KCk7Ci0gIFRyZWVDaHVuazxDaHVuaz4qIG5leHRUQyA9IFRyZWVDaHVuazxDaHVuaz46OmFzX1RyZWVDaHVuayh0Yy0+bmV4dCgpKTsKKyAgQ2h1bmtfdCogcHJldkZDID0gdGMtPnByZXYoKTsKKyAgVHJlZUNodW5rPENodW5rX3QsIEZyZWVMaXN0X3Q+KiBuZXh0VEMgPSBUcmVlQ2h1bms8Q2h1bmtfdCwgRnJlZUxpc3RfdD46OmFzX1RyZWVDaHVuayh0Yy0+bmV4dCgpKTsKICAgYXNzZXJ0KGxpc3QgIT0gTlVMTCwgInNob3VsZCBoYXZlIGF0IGxlYXN0IHRoZSB0YXJnZXQgY2h1bmsiKTsKIAogICAvLyBJcyB0aGlzIHRoZSBmaXJzdCBpdGVtIG9uIHRoZSBsaXN0PwogICBpZiAodGMgPT0gbGlzdCkgewotICAgIC8vIFRoZSAiZ2V0Q2h1bmsuLi4iIGZ1bmN0aW9ucyBmb3IgYSBUcmVlTGlzdDxDaHVuaz4gd2lsbCBub3QgcmV0dXJuIHRoZQorICAgIC8vIFRoZSAiZ2V0Q2h1bmsuLi4iIGZ1bmN0aW9ucyBmb3IgYSBUcmVlTGlzdDxDaHVua190LCBGcmVlTGlzdF90PiB3aWxsIG5vdCByZXR1cm4gdGhlCiAgICAgLy8gZmlyc3QgY2h1bmsgaW4gdGhlIGxpc3QgdW5sZXNzIGl0IGlzIHRoZSBsYXN0IGNodW5rIGluIHRoZSBsaXN0CiAgICAgLy8gYmVjYXVzZSB0aGUgZmlyc3QgY2h1bmsgaXMgYWxzbyBhY3RpbmcgYXMgdGhlIHRyZWUgbm9kZS4KICAgICAvLyBXaGVuIGNvYWxlc2NpbmcgaGFwcGVucywgaG93ZXZlciwgdGhlIGZpcnN0IGNodW5rIGluIHRoZSBhIHRyZWUKQEAgLTEyNyw4ICsxOTYsOCBAQAogICAgIC8vIGFsbG9jYXRlZCB3aGVuIHRoZSBzd2VlcGVyIHlpZWxkcyAoZ2l2aW5nIHVwIHRoZSBmcmVlIGxpc3QgbG9jaykKICAgICAvLyB0byBhbGxvdyBtdXRhdG9yIGFjdGl2aXR5LiAgSWYgdGhpcyBjaHVuayBpcyB0aGUgZmlyc3QgaW4gdGhlCiAgICAgLy8gbGlzdCBhbmQgaXMgbm90IHRoZSBsYXN0IGluIHRoZSBsaXN0LCBkbyB0aGUgd29yayB0byBjb3B5IHRoZQotICAgIC8vIFRyZWVMaXN0PENodW5rPiBmcm9tIHRoZSBmaXJzdCBjaHVuayB0byB0aGUgbmV4dCBjaHVuayBhbmQgdXBkYXRlIGFsbAotICAgIC8vIHRoZSBUcmVlTGlzdDxDaHVuaz4gcG9pbnRlcnMgaW4gdGhlIGNodW5rcyBpbiB0aGUgbGlzdC4KKyAgICAvLyBUcmVlTGlzdDxDaHVua190LCBGcmVlTGlzdF90PiBmcm9tIHRoZSBmaXJzdCBjaHVuayB0byB0aGUgbmV4dCBjaHVuayBhbmQgdXBkYXRlIGFsbAorICAgIC8vIHRoZSBUcmVlTGlzdDxDaHVua190LCBGcmVlTGlzdF90PiBwb2ludGVycyBpbiB0aGUgY2h1bmtzIGluIHRoZSBsaXN0LgogICAgIGlmIChuZXh0VEMgPT0gTlVMTCkgewogICAgICAgYXNzZXJ0KHByZXZGQyA9PSBOVUxMLCAiTm90IGxhc3QgY2h1bmsgaW4gdGhlIGxpc3QiKTsKICAgICAgIHNldF90YWlsKE5VTEwpOwpAQCAtMTQxLDExICsyMTAsMTEgQEAKICAgICAgIC8vIFRoaXMgY2FuIGJlIHNsb3cgZm9yIGEgbG9uZyBsaXN0LiAgQ29uc2lkZXIgaGF2aW5nCiAgICAgICAvLyBhbiBvcHRpb24gdGhhdCBkb2VzIG5vdCBhbGxvdyB0aGUgZmlyc3QgY2h1bmsgb24gdGhlCiAgICAgICAvLyBsaXN0IHRvIGJlIGNvYWxlc2NlZC4KLSAgICAgIGZvciAoVHJlZUNodW5rPENodW5rPiogY3VyVEMgPSBuZXh0VEM7IGN1clRDICE9IE5VTEw7Ci0gICAgICAgICAgY3VyVEMgPSBUcmVlQ2h1bms8Q2h1bms+Ojphc19UcmVlQ2h1bmsoY3VyVEMtPm5leHQoKSkpIHsKKyAgICAgIGZvciAoVHJlZUNodW5rPENodW5rX3QsIEZyZWVMaXN0X3Q+KiBjdXJUQyA9IG5leHRUQzsgY3VyVEMgIT0gTlVMTDsKKyAgICAgICAgICBjdXJUQyA9IFRyZWVDaHVuazxDaHVua190LCBGcmVlTGlzdF90Pjo6YXNfVHJlZUNodW5rKGN1clRDLT5uZXh0KCkpKSB7CiAgICAgICAgIGN1clRDLT5zZXRfbGlzdChyZXRUTCk7CiAgICAgICB9Ci0gICAgICAvLyBGaXggdGhlIHBhcmVudCB0byBwb2ludCB0byB0aGUgbmV3IFRyZWVMaXN0PENodW5rPi4KKyAgICAgIC8vIEZpeCB0aGUgcGFyZW50IHRvIHBvaW50IHRvIHRoZSBuZXcgVHJlZUxpc3Q8Q2h1bmtfdCwgRnJlZUxpc3RfdD4uCiAgICAgICBpZiAocmV0VEwtPnBhcmVudCgpICE9IE5VTEwpIHsKICAgICAgICAgaWYgKHRoaXMgPT0gcmV0VEwtPnBhcmVudCgpLT5sZWZ0KCkpIHsKICAgICAgICAgICByZXRUTC0+cGFyZW50KCktPnNldF9sZWZ0KHJldFRMKTsKQEAgLTE3Niw5ICsyNDUsOSBAQAogICAgIHByZXZGQy0+bGlua19hZnRlcihuZXh0VEMpOwogICB9CiAKLSAgLy8gQmVsb3cgdGhpcyBwb2ludCB0aGUgZW1iZWRlZCBUcmVlTGlzdDxDaHVuaz4gYmVpbmcgdXNlZCBmb3IgdGhlCisgIC8vIEJlbG93IHRoaXMgcG9pbnQgdGhlIGVtYmVkZWQgVHJlZUxpc3Q8Q2h1bmtfdCwgRnJlZUxpc3RfdD4gYmVpbmcgdXNlZCBmb3IgdGhlCiAgIC8vIHRyZWUgbm9kZSBtYXkgaGF2ZSBjaGFuZ2VkLiBEb24ndCB1c2UgInRoaXMiCi0gIC8vIFRyZWVMaXN0PENodW5rPiouCisgIC8vIFRyZWVMaXN0PENodW5rX3QsIEZyZWVMaXN0X3Q+Ki4KICAgLy8gY2h1bmsgc2hvdWxkIHN0aWxsIGJlIGEgZnJlZSBjaHVuayAoYml0IHNldCBpbiBfcHJldikKICAgYXNzZXJ0KCFyZXRUTC0+aGVhZCgpIHx8IHJldFRMLT5zaXplKCkgPT0gcmV0VEwtPmhlYWQoKS0+c2l6ZSgpLAogICAgICJXcm9uZyBzaXplZCBjaHVuayBpbiBsaXN0Iik7CkBAIC0xODgsNyArMjU3LDcgQEAKICAgICB0Yy0+c2V0X2xpc3QoTlVMTCk7CiAgICAgYm9vbCBwcmV2X2ZvdW5kID0gZmFsc2U7CiAgICAgYm9vbCBuZXh0X2ZvdW5kID0gZmFsc2U7Ci0gICAgZm9yIChDaHVuayogY3VyRkMgPSByZXRUTC0+aGVhZCgpOworICAgIGZvciAoQ2h1bmtfdCogY3VyRkMgPSByZXRUTC0+aGVhZCgpOwogICAgICAgICAgY3VyRkMgIT0gTlVMTDsgY3VyRkMgPSBjdXJGQy0+bmV4dCgpKSB7CiAgICAgICBhc3NlcnQoY3VyRkMgIT0gdGMsICJDaHVuayBpcyBzdGlsbCBpbiBsaXN0Iik7CiAgICAgICBpZiAoY3VyRkMgPT0gcHJldkZDKSB7CkBAIC0yMTUsOCArMjg0LDggQEAKICAgcmV0dXJuIHJldFRMOwogfQogCi10ZW1wbGF0ZSA8Y2xhc3MgQ2h1bms+Ci12b2lkIFRyZWVMaXN0PENodW5rPjo6cmV0dXJuX2NodW5rX2F0X3RhaWwoVHJlZUNodW5rPENodW5rPiogY2h1bmspIHsKK3RlbXBsYXRlIDxjbGFzcyBDaHVua190LCB0ZW1wbGF0ZSA8Y2xhc3M+IGNsYXNzIEZyZWVMaXN0X3Q+Cit2b2lkIFRyZWVMaXN0PENodW5rX3QsIEZyZWVMaXN0X3Q+OjpyZXR1cm5fY2h1bmtfYXRfdGFpbChUcmVlQ2h1bms8Q2h1bmtfdCwgRnJlZUxpc3RfdD4qIGNodW5rKSB7CiAgIGFzc2VydChjaHVuayAhPSBOVUxMLCAicmV0dXJuaW5nIE5VTEwgY2h1bmsiKTsKICAgYXNzZXJ0KGNodW5rLT5saXN0KCkgPT0gdGhpcywgImxpc3Qgc2hvdWxkIGJlIHNldCBmb3IgY2h1bmsiKTsKICAgYXNzZXJ0KHRhaWwoKSAhPSBOVUxMLCAiVGhlIHRyZWUgbGlzdCBpcyBlbWJlZGRlZCBpbiB0aGUgZmlyc3QgY2h1bmsiKTsKQEAgLTIyNSwxMiArMjk0LDEyIEBACiAgIGFzc2VydChoZWFkKCkgPT0gTlVMTCB8fCBoZWFkKCktPnByZXYoKSA9PSBOVUxMLCAibGlzdCBpbnZhcmlhbnQiKTsKICAgYXNzZXJ0KHRhaWwoKSA9PSBOVUxMIHx8IHRhaWwoKS0+bmV4dCgpID09IE5VTEwsICJsaXN0IGludmFyaWFudCIpOwogCi0gIENodW5rKiBmYyA9IHRhaWwoKTsKKyAgQ2h1bmtfdCogZmMgPSB0YWlsKCk7CiAgIGZjLT5saW5rX2FmdGVyKGNodW5rKTsKICAgbGlua190YWlsKGNodW5rKTsKIAogICBhc3NlcnQoIXRhaWwoKSB8fCBzaXplKCkgPT0gdGFpbCgpLT5zaXplKCksICJXcm9uZyBzaXplZCBjaHVuayBpbiBsaXN0Iik7Ci0gIGluY3JlbWVudF9jb3VudCgpOworICBGcmVlTGlzdF90PENodW5rX3Q+OjppbmNyZW1lbnRfY291bnQoKTsKICAgZGVidWdfb25seShpbmNyZW1lbnRfcmV0dXJuZWRfYnl0ZXNfYnkoY2h1bmstPnNpemUoKSpzaXplb2YoSGVhcFdvcmQpKTspCiAgIGFzc2VydChoZWFkKCkgPT0gTlVMTCB8fCBoZWFkKCktPnByZXYoKSA9PSBOVUxMLCAibGlzdCBpbnZhcmlhbnQiKTsKICAgYXNzZXJ0KHRhaWwoKSA9PSBOVUxMIHx8IHRhaWwoKS0+bmV4dCgpID09IE5VTEwsICJsaXN0IGludmFyaWFudCIpOwpAQCAtMjM4LDEwICszMDcsMTAgQEAKIAogLy8gQWRkIHRoaXMgY2h1bmsgYXQgdGhlIGhlYWQgb2YgdGhlIGxpc3QuICAiQXQgdGhlIGhlYWQgb2YgdGhlIGxpc3QiCiAvLyBpcyBkZWZpbmVkIHRvIGJlIGFmdGVyIHRoZSBjaHVuayBwb2ludGVyIHRvIGJ5IGhlYWQoKS4gIFRoaXMgaXMKLS8vIGJlY2F1c2UgdGhlIFRyZWVMaXN0PENodW5rPiBpcyBlbWJlZGRlZCBpbiB0aGUgZmlyc3QgVHJlZUNodW5rPENodW5rPiBpbiB0aGUKLS8vIGxpc3QuICBTZWUgdGhlIGRlZmluaXRpb24gb2YgVHJlZUNodW5rPENodW5rPi4KLXRlbXBsYXRlIDxjbGFzcyBDaHVuaz4KLXZvaWQgVHJlZUxpc3Q8Q2h1bms+OjpyZXR1cm5fY2h1bmtfYXRfaGVhZChUcmVlQ2h1bms8Q2h1bms+KiBjaHVuaykgeworLy8gYmVjYXVzZSB0aGUgVHJlZUxpc3Q8Q2h1bmtfdCwgRnJlZUxpc3RfdD4gaXMgZW1iZWRkZWQgaW4gdGhlIGZpcnN0IFRyZWVDaHVuazxDaHVua190LCBGcmVlTGlzdF90PiBpbiB0aGUKKy8vIGxpc3QuICBTZWUgdGhlIGRlZmluaXRpb24gb2YgVHJlZUNodW5rPENodW5rX3QsIEZyZWVMaXN0X3Q+LgordGVtcGxhdGUgPGNsYXNzIENodW5rX3QsIHRlbXBsYXRlIDxjbGFzcz4gY2xhc3MgRnJlZUxpc3RfdD4KK3ZvaWQgVHJlZUxpc3Q8Q2h1bmtfdCwgRnJlZUxpc3RfdD46OnJldHVybl9jaHVua19hdF9oZWFkKFRyZWVDaHVuazxDaHVua190LCBGcmVlTGlzdF90PiogY2h1bmspIHsKICAgYXNzZXJ0KGNodW5rLT5saXN0KCkgPT0gdGhpcywgImxpc3Qgc2hvdWxkIGJlIHNldCBmb3IgY2h1bmsiKTsKICAgYXNzZXJ0KGhlYWQoKSAhPSBOVUxMLCAiVGhlIHRyZWUgbGlzdCBpcyBlbWJlZGRlZCBpbiB0aGUgZmlyc3QgY2h1bmsiKTsKICAgYXNzZXJ0KGNodW5rICE9IE5VTEwsICJyZXR1cm5pbmcgTlVMTCBjaHVuayIpOwpAQCAtMjQ5LDcgKzMxOCw3IEBACiAgIGFzc2VydChoZWFkKCkgPT0gTlVMTCB8fCBoZWFkKCktPnByZXYoKSA9PSBOVUxMLCAibGlzdCBpbnZhcmlhbnQiKTsKICAgYXNzZXJ0KHRhaWwoKSA9PSBOVUxMIHx8IHRhaWwoKS0+bmV4dCgpID09IE5VTEwsICJsaXN0IGludmFyaWFudCIpOwogCi0gIENodW5rKiBmYyA9IGhlYWQoKS0+bmV4dCgpOworICBDaHVua190KiBmYyA9IGhlYWQoKS0+bmV4dCgpOwogICBpZiAoZmMgIT0gTlVMTCkgewogICAgIGNodW5rLT5saW5rX2FmdGVyKGZjKTsKICAgfSBlbHNlIHsKQEAgLTI1OCwyOCArMzI3LDM4IEBACiAgIH0KICAgaGVhZCgpLT5saW5rX2FmdGVyKGNodW5rKTsKICAgYXNzZXJ0KCFoZWFkKCkgfHwgc2l6ZSgpID09IGhlYWQoKS0+c2l6ZSgpLCAiV3Jvbmcgc2l6ZWQgY2h1bmsgaW4gbGlzdCIpOwotICBpbmNyZW1lbnRfY291bnQoKTsKKyAgRnJlZUxpc3RfdDxDaHVua190Pjo6aW5jcmVtZW50X2NvdW50KCk7CiAgIGRlYnVnX29ubHkoaW5jcmVtZW50X3JldHVybmVkX2J5dGVzX2J5KGNodW5rLT5zaXplKCkqc2l6ZW9mKEhlYXBXb3JkKSk7KQogICBhc3NlcnQoaGVhZCgpID09IE5VTEwgfHwgaGVhZCgpLT5wcmV2KCkgPT0gTlVMTCwgImxpc3QgaW52YXJpYW50Iik7CiAgIGFzc2VydCh0YWlsKCkgPT0gTlVMTCB8fCB0YWlsKCktPm5leHQoKSA9PSBOVUxMLCAibGlzdCBpbnZhcmlhbnQiKTsKIH0KIAotdGVtcGxhdGUgPGNsYXNzIENodW5rPgotVHJlZUNodW5rPENodW5rPiogVHJlZUxpc3Q8Q2h1bms+OjpoZWFkX2FzX1RyZWVDaHVuaygpIHsKLSAgYXNzZXJ0KGhlYWQoKSA9PSBOVUxMIHx8IFRyZWVDaHVuazxDaHVuaz46OmFzX1RyZWVDaHVuayhoZWFkKCkpLT5saXN0KCkgPT0gdGhpcywKLSAgICAiV3JvbmcgdHlwZSBvZiBjaHVuaz8iKTsKLSAgcmV0dXJuIFRyZWVDaHVuazxDaHVuaz46OmFzX1RyZWVDaHVuayhoZWFkKCkpOwordGVtcGxhdGUgPGNsYXNzIENodW5rX3QsIHRlbXBsYXRlIDxjbGFzcz4gY2xhc3MgRnJlZUxpc3RfdD4KK3ZvaWQgVHJlZUNodW5rPENodW5rX3QsIEZyZWVMaXN0X3Q+Ojphc3NlcnRfaXNfbWFuZ2xlZCgpIGNvbnN0IHsKKyAgYXNzZXJ0KChaYXBVbnVzZWRIZWFwQXJlYSAmJgorICAgICAgICAgIFNwYWNlTWFuZ2xlcjo6aXNfbWFuZ2xlZCgoSGVhcFdvcmQqKSBDaHVua190OjpzaXplX2FkZHIoKSkgJiYKKyAgICAgICAgICBTcGFjZU1hbmdsZXI6OmlzX21hbmdsZWQoKEhlYXBXb3JkKikgQ2h1bmtfdDo6cHJldl9hZGRyKCkpICYmCisgICAgICAgICAgU3BhY2VNYW5nbGVyOjppc19tYW5nbGVkKChIZWFwV29yZCopIENodW5rX3Q6Om5leHRfYWRkcigpKSkgfHwKKyAgICAgICAgICAoc2l6ZSgpID09IDAgJiYgcHJldigpID09IE5VTEwgJiYgbmV4dCgpID09IE5VTEwpLAorICAgICJTcGFjZSBzaG91bGQgYmUgY2xlYXIgb3IgbWFuZ2xlZCIpOwogfQogCi10ZW1wbGF0ZSA8Y2xhc3MgQ2h1bms+Ci1UcmVlQ2h1bms8Q2h1bms+KiBUcmVlTGlzdDxDaHVuaz46OmZpcnN0X2F2YWlsYWJsZSgpIHsKK3RlbXBsYXRlIDxjbGFzcyBDaHVua190LCB0ZW1wbGF0ZSA8Y2xhc3M+IGNsYXNzIEZyZWVMaXN0X3Q+CitUcmVlQ2h1bms8Q2h1bmtfdCwgRnJlZUxpc3RfdD4qIFRyZWVMaXN0PENodW5rX3QsIEZyZWVMaXN0X3Q+OjpoZWFkX2FzX1RyZWVDaHVuaygpIHsKKyAgYXNzZXJ0KGhlYWQoKSA9PSBOVUxMIHx8IChUcmVlQ2h1bms8Q2h1bmtfdCwgRnJlZUxpc3RfdD46OmFzX1RyZWVDaHVuayhoZWFkKCkpLT5saXN0KCkgPT0gdGhpcyksCisgICAgIldyb25nIHR5cGUgb2YgY2h1bms/Iik7CisgIHJldHVybiBUcmVlQ2h1bms8Q2h1bmtfdCwgRnJlZUxpc3RfdD46OmFzX1RyZWVDaHVuayhoZWFkKCkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgQ2h1bmtfdCwgdGVtcGxhdGUgPGNsYXNzPiBjbGFzcyBGcmVlTGlzdF90PgorVHJlZUNodW5rPENodW5rX3QsIEZyZWVMaXN0X3Q+KiBUcmVlTGlzdDxDaHVua190LCBGcmVlTGlzdF90Pjo6Zmlyc3RfYXZhaWxhYmxlKCkgewogICBhc3NlcnQoaGVhZCgpICE9IE5VTEwsICJUaGUgaGVhZCBvZiB0aGUgbGlzdCBjYW5ub3QgYmUgTlVMTCIpOwotICBDaHVuayogZmMgPSBoZWFkKCktPm5leHQoKTsKLSAgVHJlZUNodW5rPENodW5rPiogcmV0VEM7CisgIENodW5rX3QqIGZjID0gaGVhZCgpLT5uZXh0KCk7CisgIFRyZWVDaHVuazxDaHVua190LCBGcmVlTGlzdF90PiogcmV0VEM7CiAgIGlmIChmYyA9PSBOVUxMKSB7CiAgICAgcmV0VEMgPSBoZWFkX2FzX1RyZWVDaHVuaygpOwogICB9IGVsc2UgewotICAgIHJldFRDID0gVHJlZUNodW5rPENodW5rPjo6YXNfVHJlZUNodW5rKGZjKTsKKyAgICByZXRUQyA9IFRyZWVDaHVuazxDaHVua190LCBGcmVlTGlzdF90Pjo6YXNfVHJlZUNodW5rKGZjKTsKICAgfQogICBhc3NlcnQocmV0VEMtPmxpc3QoKSA9PSB0aGlzLCAiV3JvbmcgdHlwZSBvZiBjaHVuay4iKTsKICAgcmV0dXJuIHJldFRDOwpAQCAtMjg4LDQxICszNjcsMzIgQEAKIC8vIFJldHVybnMgdGhlIGJsb2NrIHdpdGggdGhlIGxhcmdlc3QgaGVhcCBhZGRyZXNzIGFtb25nc3QKIC8vIHRob3NlIGluIHRoZSBsaXN0IGZvciB0aGlzIHNpemU7IHBvdGVudGlhbGx5IHNsb3cgYW5kIGV4cGVuc2l2ZSwKIC8vIHVzZSB3aXRoIGNhdXRpb24hCi10ZW1wbGF0ZSA8Y2xhc3MgQ2h1bms+Ci1UcmVlQ2h1bms8Q2h1bms+KiBUcmVlTGlzdDxDaHVuaz46Omxhcmdlc3RfYWRkcmVzcygpIHsKK3RlbXBsYXRlIDxjbGFzcyBDaHVua190LCB0ZW1wbGF0ZSA8Y2xhc3M+IGNsYXNzIEZyZWVMaXN0X3Q+CitUcmVlQ2h1bms8Q2h1bmtfdCwgRnJlZUxpc3RfdD4qIFRyZWVMaXN0PENodW5rX3QsIEZyZWVMaXN0X3Q+OjpsYXJnZXN0X2FkZHJlc3MoKSB7CiAgIGFzc2VydChoZWFkKCkgIT0gTlVMTCwgIlRoZSBoZWFkIG9mIHRoZSBsaXN0IGNhbm5vdCBiZSBOVUxMIik7Ci0gIENodW5rKiBmYyA9IGhlYWQoKS0+bmV4dCgpOwotICBUcmVlQ2h1bms8Q2h1bms+KiByZXRUQzsKKyAgQ2h1bmtfdCogZmMgPSBoZWFkKCktPm5leHQoKTsKKyAgVHJlZUNodW5rPENodW5rX3QsIEZyZWVMaXN0X3Q+KiByZXRUQzsKICAgaWYgKGZjID09IE5VTEwpIHsKICAgICByZXRUQyA9IGhlYWRfYXNfVHJlZUNodW5rKCk7CiAgIH0gZWxzZSB7CiAgICAgLy8gd2FsayBkb3duIHRoZSBsaXN0IGFuZCByZXR1cm4gdGhlIG9uZSB3aXRoIHRoZSBoaWdoZXN0CiAgICAgLy8gaGVhcCBhZGRyZXNzIGFtb25nIGNodW5rcyBvZiB0aGlzIHNpemUuCi0gICAgQ2h1bmsqIGxhc3QgPSBmYzsKKyAgICBDaHVua190KiBsYXN0ID0gZmM7CiAgICAgd2hpbGUgKGZjLT5uZXh0KCkgIT0gTlVMTCkgewogICAgICAgaWYgKChIZWFwV29yZCopbGFzdCA8IChIZWFwV29yZCopZmMpIHsKICAgICAgICAgbGFzdCA9IGZjOwogICAgICAgfQogICAgICAgZmMgPSBmYy0+bmV4dCgpOwogICAgIH0KLSAgICByZXRUQyA9IFRyZWVDaHVuazxDaHVuaz46OmFzX1RyZWVDaHVuayhsYXN0KTsKKyAgICByZXRUQyA9IFRyZWVDaHVuazxDaHVua190LCBGcmVlTGlzdF90Pjo6YXNfVHJlZUNodW5rKGxhc3QpOwogICB9CiAgIGFzc2VydChyZXRUQy0+bGlzdCgpID09IHRoaXMsICJXcm9uZyB0eXBlIG9mIGNodW5rLiIpOwogICByZXR1cm4gcmV0VEM7CiB9CiAKLXRlbXBsYXRlIDxjbGFzcyBDaHVuaz4KLUJpbmFyeVRyZWVEaWN0aW9uYXJ5PENodW5rPjo6QmluYXJ5VHJlZURpY3Rpb25hcnkoYm9vbCBhZGFwdGl2ZV9mcmVlbGlzdHMsIGJvb2wgc3BsYXkpIDoKLSAgX3NwbGF5KHNwbGF5KSwgX2FkYXB0aXZlX2ZyZWVsaXN0cyhhZGFwdGl2ZV9mcmVlbGlzdHMpLAotICBfdG90YWxfc2l6ZSgwKSwgX3RvdGFsX2ZyZWVfYmxvY2tzKDApLCBfcm9vdCgwKSB7fQotCi10ZW1wbGF0ZSA8Y2xhc3MgQ2h1bms+Ci1CaW5hcnlUcmVlRGljdGlvbmFyeTxDaHVuaz46OkJpbmFyeVRyZWVEaWN0aW9uYXJ5KE1lbVJlZ2lvbiBtciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFkYXB0aXZlX2ZyZWVsaXN0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNwbGF5KToKLSAgX2FkYXB0aXZlX2ZyZWVsaXN0cyhhZGFwdGl2ZV9mcmVlbGlzdHMpLCBfc3BsYXkoc3BsYXkpCi17Ci0gIGFzc2VydChtci53b3JkX3NpemUoKSA+PSBCaW5hcnlUcmVlRGljdGlvbmFyeTxDaHVuaz46Om1pbl90cmVlX2NodW5rX3NpemUsICJtaW5pbXVtIGNodW5rIHNpemUiKTsKK3RlbXBsYXRlIDxjbGFzcyBDaHVua190LCB0ZW1wbGF0ZSA8Y2xhc3M+IGNsYXNzIEZyZWVMaXN0X3Q+CitCaW5hcnlUcmVlRGljdGlvbmFyeTxDaHVua190LCBGcmVlTGlzdF90Pjo6QmluYXJ5VHJlZURpY3Rpb25hcnkoTWVtUmVnaW9uIG1yKSB7CisgIGFzc2VydCgobXIuYnl0ZV9zaXplKCkgPiBtaW5fc2l6ZSgpKSwgIm1pbmltdW0gY2h1bmsgc2l6ZSIpOwogCiAgIHJlc2V0KG1yKTsKICAgYXNzZXJ0KHJvb3QoKS0+bGVmdCgpID09IE5VTEwsICJyZXNldCBjaGVjayBmYWlsZWQiKTsKQEAgLTMzMyw1MiArNDAzLDQ4IEBACiAgIGFzc2VydCh0b3RhbF9mcmVlX2Jsb2NrcygpID09IDEsICJyZXNldCBjaGVjayBmYWlsZWQiKTsKIH0KIAotdGVtcGxhdGUgPGNsYXNzIENodW5rPgotdm9pZCBCaW5hcnlUcmVlRGljdGlvbmFyeTxDaHVuaz46OmluY190b3RhbF9zaXplKHNpemVfdCBpbmMpIHsKK3RlbXBsYXRlIDxjbGFzcyBDaHVua190LCB0ZW1wbGF0ZSA8Y2xhc3M+IGNsYXNzIEZyZWVMaXN0X3Q+Cit2b2lkIEJpbmFyeVRyZWVEaWN0aW9uYXJ5PENodW5rX3QsIEZyZWVMaXN0X3Q+OjppbmNfdG90YWxfc2l6ZShzaXplX3QgaW5jKSB7CiAgIF90b3RhbF9zaXplID0gX3RvdGFsX3NpemUgKyBpbmM7CiB9CiAKLXRlbXBsYXRlIDxjbGFzcyBDaHVuaz4KLXZvaWQgQmluYXJ5VHJlZURpY3Rpb25hcnk8Q2h1bms+OjpkZWNfdG90YWxfc2l6ZShzaXplX3QgZGVjKSB7Cit0ZW1wbGF0ZSA8Y2xhc3MgQ2h1bmtfdCwgdGVtcGxhdGUgPGNsYXNzPiBjbGFzcyBGcmVlTGlzdF90Pgordm9pZCBCaW5hcnlUcmVlRGljdGlvbmFyeTxDaHVua190LCBGcmVlTGlzdF90Pjo6ZGVjX3RvdGFsX3NpemUoc2l6ZV90IGRlYykgewogICBfdG90YWxfc2l6ZSA9IF90b3RhbF9zaXplIC0gZGVjOwogfQogCi10ZW1wbGF0ZSA8Y2xhc3MgQ2h1bms+Ci12b2lkIEJpbmFyeVRyZWVEaWN0aW9uYXJ5PENodW5rPjo6cmVzZXQoTWVtUmVnaW9uIG1yKSB7Ci0gIGFzc2VydChtci53b3JkX3NpemUoKSA+PSBCaW5hcnlUcmVlRGljdGlvbmFyeTxDaHVuaz46Om1pbl90cmVlX2NodW5rX3NpemUsICJtaW5pbXVtIGNodW5rIHNpemUiKTsKLSAgc2V0X3Jvb3QoVHJlZUxpc3Q8Q2h1bms+Ojphc19UcmVlTGlzdChtci5zdGFydCgpLCBtci53b3JkX3NpemUoKSkpOwordGVtcGxhdGUgPGNsYXNzIENodW5rX3QsIHRlbXBsYXRlIDxjbGFzcz4gY2xhc3MgRnJlZUxpc3RfdD4KK3ZvaWQgQmluYXJ5VHJlZURpY3Rpb25hcnk8Q2h1bmtfdCwgRnJlZUxpc3RfdD46OnJlc2V0KE1lbVJlZ2lvbiBtcikgeworICBhc3NlcnQoKG1yLmJ5dGVfc2l6ZSgpID4gbWluX3NpemUoKSksICJtaW5pbXVtIGNodW5rIHNpemUiKTsKKyAgc2V0X3Jvb3QoVHJlZUxpc3Q8Q2h1bmtfdCwgRnJlZUxpc3RfdD46OmFzX1RyZWVMaXN0KG1yLnN0YXJ0KCksIG1yLndvcmRfc2l6ZSgpKSk7CiAgIHNldF90b3RhbF9zaXplKG1yLndvcmRfc2l6ZSgpKTsKICAgc2V0X3RvdGFsX2ZyZWVfYmxvY2tzKDEpOwogfQogCi10ZW1wbGF0ZSA8Y2xhc3MgQ2h1bms+Ci12b2lkIEJpbmFyeVRyZWVEaWN0aW9uYXJ5PENodW5rPjo6cmVzZXQoSGVhcFdvcmQqIGFkZHIsIHNpemVfdCBieXRlX3NpemUpIHsKK3RlbXBsYXRlIDxjbGFzcyBDaHVua190LCB0ZW1wbGF0ZSA8Y2xhc3M+IGNsYXNzIEZyZWVMaXN0X3Q+Cit2b2lkIEJpbmFyeVRyZWVEaWN0aW9uYXJ5PENodW5rX3QsIEZyZWVMaXN0X3Q+OjpyZXNldChIZWFwV29yZCogYWRkciwgc2l6ZV90IGJ5dGVfc2l6ZSkgewogICBNZW1SZWdpb24gbXIoYWRkciwgaGVhcF93b3JkX3NpemUoYnl0ZV9zaXplKSk7CiAgIHJlc2V0KG1yKTsKIH0KIAotdGVtcGxhdGUgPGNsYXNzIENodW5rPgotdm9pZCBCaW5hcnlUcmVlRGljdGlvbmFyeTxDaHVuaz46OnJlc2V0KCkgewordGVtcGxhdGUgPGNsYXNzIENodW5rX3QsIHRlbXBsYXRlIDxjbGFzcz4gY2xhc3MgRnJlZUxpc3RfdD4KK3ZvaWQgQmluYXJ5VHJlZURpY3Rpb25hcnk8Q2h1bmtfdCwgRnJlZUxpc3RfdD46OnJlc2V0KCkgewogICBzZXRfcm9vdChOVUxMKTsKICAgc2V0X3RvdGFsX3NpemUoMCk7CiAgIHNldF90b3RhbF9mcmVlX2Jsb2NrcygwKTsKIH0KIAogLy8gR2V0IGEgZnJlZSBibG9jayBvZiBzaXplIGF0IGxlYXN0IHNpemUgZnJvbSB0cmVlLCBvciBOVUxMLgotLy8gSWYgYSBzcGxheSBzdGVwIGlzIHJlcXVlc3RlZCwgdGhlIHJlbW92YWwgYWxnb3JpdGhtIChvbmx5KSBpbmNvcnBvcmF0ZXMKLS8vIGEgc3BsYXkgc3RlcCBhcyBmb2xsb3dzOgotLy8gLiB0aGUgc2VhcmNoIHByb2NlZWRzIGRvd24gdGhlIHRyZWUgbG9va2luZyBmb3IgYSBwb3NzaWJsZQotLy8gICBtYXRjaC4gQXQgdGhlIChjbG9zZXN0KSBtYXRjaGluZyBsb2NhdGlvbiwgYW4gYXBwcm9wcmlhdGUgc3BsYXkgc3RlcCBpcyBhcHBsaWVkCi0vLyAgICh6aWcsIHppZy16aWcgb3IgemlnLXphZykuIEEgY2h1bmsgb2YgdGhlIGFwcHJvcHJpYXRlIHNpemUgaXMgdGhlbiByZXR1cm5lZAotLy8gICBpZiBhdmFpbGFibGUsIGFuZCBpZiBpdCdzIHRoZSBsYXN0IGNodW5rLCB0aGUgbm9kZSBpcyBkZWxldGVkLiBBIGRldGVsZXRlZAotLy8gICBub2RlIGlzIHJlcGxhY2VkIGluIHBsYWNlIGJ5IGl0cyB0cmVlIHN1Y2Nlc3Nvci4KLXRlbXBsYXRlIDxjbGFzcyBDaHVuaz4KLVRyZWVDaHVuazxDaHVuaz4qCi1CaW5hcnlUcmVlRGljdGlvbmFyeTxDaHVuaz46OmdldF9jaHVua19mcm9tX3RyZWUoc2l6ZV90IHNpemUsIGVudW0gRnJlZUJsb2NrRGljdGlvbmFyeTxDaHVuaz46OkRpdGhlciBkaXRoZXIsIGJvb2wgc3BsYXkpCit0ZW1wbGF0ZSA8Y2xhc3MgQ2h1bmtfdCwgdGVtcGxhdGUgPGNsYXNzPiBjbGFzcyBGcmVlTGlzdF90PgorVHJlZUNodW5rPENodW5rX3QsIEZyZWVMaXN0X3Q+KgorQmluYXJ5VHJlZURpY3Rpb25hcnk8Q2h1bmtfdCwgRnJlZUxpc3RfdD46OmdldF9jaHVua19mcm9tX3RyZWUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gRnJlZUJsb2NrRGljdGlvbmFyeTxDaHVua190Pjo6RGl0aGVyIGRpdGhlcikKIHsKLSAgVHJlZUxpc3Q8Q2h1bms+ICpjdXJUTCwgKnByZXZUTDsKLSAgVHJlZUNodW5rPENodW5rPiogcmV0VEMgPSBOVUxMOwotICBhc3NlcnQoc2l6ZSA+PSBCaW5hcnlUcmVlRGljdGlvbmFyeTxDaHVuaz46Om1pbl90cmVlX2NodW5rX3NpemUsICJtaW5pbXVtIGNodW5rIHNpemUiKTsKKyAgVHJlZUxpc3Q8Q2h1bmtfdCwgRnJlZUxpc3RfdD4gKmN1clRMLCAqcHJldlRMOworICBUcmVlQ2h1bms8Q2h1bmtfdCwgRnJlZUxpc3RfdD4qIHJldFRDID0gTlVMTDsKKworICBhc3NlcnQoKHNpemUgPj0gbWluX3NpemUoKSksICJtaW5pbXVtIGNodW5rIHNpemUiKTsKICAgaWYgKEZMU1ZlcmlmeURpY3Rpb25hcnkpIHsKICAgICB2ZXJpZnlfdHJlZSgpOwogICB9CkBAIC0zOTgsNyArNDY0LDcgQEAKICAgfQogICBpZiAoY3VyVEwgPT0gTlVMTCkgeyAvLyBjb3VsZG4ndCBmaW5kIGV4YWN0IG1hdGNoCiAKLSAgICBpZiAoZGl0aGVyID09IEZyZWVCbG9ja0RpY3Rpb25hcnk8Q2h1bms+OjpleGFjdGx5KSByZXR1cm4gTlVMTDsKKyAgICBpZiAoZGl0aGVyID09IEZyZWVCbG9ja0RpY3Rpb25hcnk8Q2h1bmtfdD46OmV4YWN0bHkpIHJldHVybiBOVUxMOwogCiAgICAgLy8gdHJ5IGFuZCBmaW5kIHRoZSBuZXh0IGxhcmdlciBzaXplIGJ5IHdhbGtpbmcgYmFjayB1cCB0aGUgc2VhcmNoIHBhdGgKICAgICBmb3IgKGN1clRMID0gcHJldlRMOyBjdXJUTCAhPSBOVUxMOykgewpAQCAtNDEwLDQ2ICs0NzYsOSBAQAogICB9CiAgIGlmIChjdXJUTCAhPSBOVUxMKSB7CiAgICAgYXNzZXJ0KGN1clRMLT5zaXplKCkgPj0gc2l6ZSwgInNpemUgaW5jb25zaXN0ZW5jeSIpOwotICAgIGlmIChhZGFwdGl2ZV9mcmVlbGlzdHMoKSkgewogCi0gICAgICAvLyBBIGNhbmRpZGF0ZSBjaHVuayBoYXMgYmVlbiBmb3VuZC4gIElmIGl0IGlzIGFscmVhZHkgdW5kZXIKLSAgICAgIC8vIHBvcHVsYXRlZCwgZ2V0IGEgY2h1bmsgYXNzb2NpYXRlZCB3aXRoIHRoZSBoaW50IGZvciB0aGlzCi0gICAgICAvLyBjaHVuay4KLSAgICAgIGlmIChjdXJUTC0+c3VycGx1cygpIDw9IDApIHsKLSAgICAgICAgLyogVXNlIHRoZSBoaW50IHRvIGZpbmQgYSBzaXplIHdpdGggYSBzdXJwbHVzLCBhbmQgcmVzZXQgdGhlIGhpbnQuICovCi0gICAgICAgIFRyZWVMaXN0PENodW5rPiogaGludFRMID0gY3VyVEw7Ci0gICAgICAgIHdoaWxlIChoaW50VEwtPmhpbnQoKSAhPSAwKSB7Ci0gICAgICAgICAgYXNzZXJ0KGhpbnRUTC0+aGludCgpID09IDAgfHwgaGludFRMLT5oaW50KCkgPiBoaW50VEwtPnNpemUoKSwKLSAgICAgICAgICAgICJoaW50IHBvaW50cyBpbiB0aGUgd3JvbmcgZGlyZWN0aW9uIik7Ci0gICAgICAgICAgaGludFRMID0gZmluZF9saXN0KGhpbnRUTC0+aGludCgpKTsKLSAgICAgICAgICBhc3NlcnQoY3VyVEwgIT0gaGludFRMLCAiSW5maW5pdGUgbG9vcCIpOwotICAgICAgICAgIGlmIChoaW50VEwgPT0gTlVMTCB8fAotICAgICAgICAgICAgICBoaW50VEwgPT0gY3VyVEwgLyogU2hvdWxkIG5vdCBoYXBwZW4gYnV0IHByb3RlY3QgYWdhaW5zdCBpdCAqLyApIHsKLSAgICAgICAgICAgIC8vIE5vIHVzZWZ1bCBoaW50LiAgU2V0IHRoZSBoaW50IHRvIE5VTEwgYW5kIGdvIG9uLgotICAgICAgICAgICAgY3VyVEwtPnNldF9oaW50KDApOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGFzc2VydChoaW50VEwtPnNpemUoKSA+IHNpemUsICJoaW50IGlzIGluY29uc2lzdGVudCIpOwotICAgICAgICAgIGlmIChoaW50VEwtPnN1cnBsdXMoKSA+IDApIHsKLSAgICAgICAgICAgIC8vIFRoZSBoaW50IGxlZCB0byBhIGxpc3QgdGhhdCBoYXMgYSBzdXJwbHVzLiAgVXNlIGl0LgotICAgICAgICAgICAgLy8gU2V0IHRoZSBoaW50IGZvciB0aGUgY2FuZGlkYXRlIHRvIGFuIG92ZXJwb3B1bGF0ZWQKLSAgICAgICAgICAgIC8vIHNpemUuCi0gICAgICAgICAgICBjdXJUTC0+c2V0X2hpbnQoaGludFRMLT5zaXplKCkpOwotICAgICAgICAgICAgLy8gQ2hhbmdlIHRoZSBjYW5kaWRhdGUuCi0gICAgICAgICAgICBjdXJUTCA9IGhpbnRUTDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICAvLyBUaGUgZXZtIGNvZGUgcmVzZXQgdGhlIGhpbnQgb2YgdGhlIGNhbmRpZGF0ZSBhcwotICAgICAgICAgIC8vIGF0IGFuIGludGVyaW0gcG9pbnQuICBXaHk/ICBTZWVtcyBsaWtlIHRoaXMgbGVhdmVzCi0gICAgICAgICAgLy8gdGhlIGhpbnQgcG9pbnRpbmcgdG8gYSBsaXN0IHRoYXQgZGlkbid0IHdvcmsuCi0gICAgICAgICAgLy8gY3VyVEwtPnNldF9oaW50KGhpbnRUTC0+c2l6ZSgpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAvLyBkb24ndCB3YXN0ZSB0aW1lIHNwbGF5aW5nIGlmIGNodW5rJ3Mgc2luZ2xldG9uCi0gICAgaWYgKHNwbGF5ICYmIGN1clRMLT5oZWFkKCktPm5leHQoKSAhPSBOVUxMKSB7Ci0gICAgICBzZW1pX3NwbGF5X3N0ZXAoY3VyVEwpOwotICAgIH0KKyAgICBjdXJUTCA9IGN1clRMLT5nZXRfYmV0dGVyX2xpc3QodGhpcyk7CisKICAgICByZXRUQyA9IGN1clRMLT5maXJzdF9hdmFpbGFibGUoKTsKICAgICBhc3NlcnQoKHJldFRDICE9IE5VTEwpICYmIChjdXJUTC0+Y291bnQoKSA+IDApLAogICAgICAgIkEgbGlzdCBpbiB0aGUgYmluYXJ5IHRyZWUgc2hvdWxkIG5vdCBiZSBOVUxMIik7CkBAIC00NjUsOSArNDk0LDkgQEAKICAgcmV0dXJuIHJldFRDOwogfQogCi10ZW1wbGF0ZSA8Y2xhc3MgQ2h1bms+Ci1UcmVlTGlzdDxDaHVuaz4qIEJpbmFyeVRyZWVEaWN0aW9uYXJ5PENodW5rPjo6ZmluZF9saXN0KHNpemVfdCBzaXplKSBjb25zdCB7Ci0gIFRyZWVMaXN0PENodW5rPiogY3VyVEw7Cit0ZW1wbGF0ZSA8Y2xhc3MgQ2h1bmtfdCwgdGVtcGxhdGUgPGNsYXNzPiBjbGFzcyBGcmVlTGlzdF90PgorVHJlZUxpc3Q8Q2h1bmtfdCwgRnJlZUxpc3RfdD4qIEJpbmFyeVRyZWVEaWN0aW9uYXJ5PENodW5rX3QsIEZyZWVMaXN0X3Q+OjpmaW5kX2xpc3Qoc2l6ZV90IHNpemUpIGNvbnN0IHsKKyAgVHJlZUxpc3Q8Q2h1bmtfdCwgRnJlZUxpc3RfdD4qIGN1clRMOwogICBmb3IgKGN1clRMID0gcm9vdCgpOyBjdXJUTCAhPSBOVUxMOykgewogICAgIGlmIChjdXJUTC0+c2l6ZSgpID09IHNpemUpIHsgICAgICAgIC8vIGV4YWN0IG1hdGNoCiAgICAgICBicmVhazsKQEAgLTQ4NCwxMCArNTEzLDEwIEBACiB9CiAKIAotdGVtcGxhdGUgPGNsYXNzIENodW5rPgotYm9vbCBCaW5hcnlUcmVlRGljdGlvbmFyeTxDaHVuaz46OnZlcmlmeV9jaHVua19pbl9mcmVlX2xpc3QoQ2h1bmsqIHRjKSBjb25zdCB7Cit0ZW1wbGF0ZSA8Y2xhc3MgQ2h1bmtfdCwgdGVtcGxhdGUgPGNsYXNzPiBjbGFzcyBGcmVlTGlzdF90PgorYm9vbCBCaW5hcnlUcmVlRGljdGlvbmFyeTxDaHVua190LCBGcmVlTGlzdF90Pjo6dmVyaWZ5X2NodW5rX2luX2ZyZWVfbGlzdChDaHVua190KiB0YykgY29uc3QgewogICBzaXplX3Qgc2l6ZSA9IHRjLT5zaXplKCk7Ci0gIFRyZWVMaXN0PENodW5rPiogdGwgPSBmaW5kX2xpc3Qoc2l6ZSk7CisgIFRyZWVMaXN0PENodW5rX3QsIEZyZWVMaXN0X3Q+KiB0bCA9IGZpbmRfbGlzdChzaXplKTsKICAgaWYgKHRsID09IE5VTEwpIHsKICAgICByZXR1cm4gZmFsc2U7CiAgIH0gZWxzZSB7CkBAIC00OTUsOSArNTI0LDkgQEAKICAgfQogfQogCi10ZW1wbGF0ZSA8Y2xhc3MgQ2h1bms+Ci1DaHVuayogQmluYXJ5VHJlZURpY3Rpb25hcnk8Q2h1bms+OjpmaW5kX2xhcmdlc3RfZGljdCgpIGNvbnN0IHsKLSAgVHJlZUxpc3Q8Q2h1bms+ICpjdXJUTCA9IHJvb3QoKTsKK3RlbXBsYXRlIDxjbGFzcyBDaHVua190LCB0ZW1wbGF0ZSA8Y2xhc3M+IGNsYXNzIEZyZWVMaXN0X3Q+CitDaHVua190KiBCaW5hcnlUcmVlRGljdGlvbmFyeTxDaHVua190LCBGcmVlTGlzdF90Pjo6ZmluZF9sYXJnZXN0X2RpY3QoKSBjb25zdCB7CisgIFRyZWVMaXN0PENodW5rX3QsIEZyZWVMaXN0X3Q+ICpjdXJUTCA9IHJvb3QoKTsKICAgaWYgKGN1clRMICE9IE5VTEwpIHsKICAgICB3aGlsZShjdXJUTC0+cmlnaHQoKSAhPSBOVUxMKSBjdXJUTCA9IGN1clRMLT5yaWdodCgpOwogICAgIHJldHVybiBjdXJUTC0+bGFyZ2VzdF9hZGRyZXNzKCk7CkBAIC01MTAsMTUgKzUzOSwxNSBAQAogLy8gY2h1bmsgaW4gYSBsaXN0IG9uIGEgdHJlZSBub2RlLCBqdXN0IHVubGluayBpdC4KIC8vIElmIGl0IGlzIHRoZSBsYXN0IGNodW5rIGluIHRoZSBsaXN0ICh0aGUgbmV4dCBsaW5rIGlzIE5VTEwpLAogLy8gcmVtb3ZlIHRoZSBub2RlIGFuZCByZXBhaXIgdGhlIHRyZWUuCi10ZW1wbGF0ZSA8Y2xhc3MgQ2h1bms+Ci1UcmVlQ2h1bms8Q2h1bms+KgotQmluYXJ5VHJlZURpY3Rpb25hcnk8Q2h1bms+OjpyZW1vdmVfY2h1bmtfZnJvbV90cmVlKFRyZWVDaHVuazxDaHVuaz4qIHRjKSB7Cit0ZW1wbGF0ZSA8Y2xhc3MgQ2h1bmtfdCwgdGVtcGxhdGUgPGNsYXNzPiBjbGFzcyBGcmVlTGlzdF90PgorVHJlZUNodW5rPENodW5rX3QsIEZyZWVMaXN0X3Q+KgorQmluYXJ5VHJlZURpY3Rpb25hcnk8Q2h1bmtfdCwgRnJlZUxpc3RfdD46OnJlbW92ZV9jaHVua19mcm9tX3RyZWUoVHJlZUNodW5rPENodW5rX3QsIEZyZWVMaXN0X3Q+KiB0YykgewogICBhc3NlcnQodGMgIT0gTlVMTCwgIlNob3VsZCBub3QgY2FsbCB3aXRoIGEgTlVMTCBjaHVuayIpOwogICBhc3NlcnQodGMtPmlzX2ZyZWUoKSwgIkhlYWRlciBpcyBub3QgbWFya2VkIGNvcnJlY3RseSIpOwogCi0gIFRyZWVMaXN0PENodW5rPiAqbmV3VEwsICpwYXJlbnRUTDsKLSAgVHJlZUNodW5rPENodW5rPiogcmV0VEM7Ci0gIFRyZWVMaXN0PENodW5rPiogdGwgPSB0Yy0+bGlzdCgpOworICBUcmVlTGlzdDxDaHVua190LCBGcmVlTGlzdF90PiAqbmV3VEwsICpwYXJlbnRUTDsKKyAgVHJlZUNodW5rPENodW5rX3QsIEZyZWVMaXN0X3Q+KiByZXRUQzsKKyAgVHJlZUxpc3Q8Q2h1bmtfdCwgRnJlZUxpc3RfdD4qIHRsID0gdGMtPmxpc3QoKTsKICAgZGVidWdfb25seSgKICAgICBib29sIHJlbW92aW5nX29ubHlfY2h1bmsgPSBmYWxzZTsKICAgICBpZiAodGwgPT0gX3Jvb3QpIHsKQEAgLTUzOCw4ICs1NjcsOCBAQAogCiAgIHJldFRDID0gdGM7CiAgIC8vIFJlbW92aW5nIHRoaXMgY2h1bmsgY2FuIGhhdmUgdGhlIHNpZGUgZWZmZWN0IG9mIGNoYW5naW5nIHRoZSBub2RlCi0gIC8vIChUcmVlTGlzdDxDaHVuaz4qKSBpbiB0aGUgdHJlZS4gIElmIHRoZSBub2RlIGlzIHRoZSByb290LCB1cGRhdGUgaXQuCi0gIFRyZWVMaXN0PENodW5rPiogcmVwbGFjZW1lbnRUTCA9IHRsLT5yZW1vdmVfY2h1bmtfcmVwbGFjZV9pZl9uZWVkZWQodGMpOworICAvLyAoVHJlZUxpc3Q8Q2h1bmtfdCwgRnJlZUxpc3RfdD4qKSBpbiB0aGUgdHJlZS4gIElmIHRoZSBub2RlIGlzIHRoZSByb290LCB1cGRhdGUgaXQuCisgIFRyZWVMaXN0PENodW5rX3QsIEZyZWVMaXN0X3Q+KiByZXBsYWNlbWVudFRMID0gdGwtPnJlbW92ZV9jaHVua19yZXBsYWNlX2lmX25lZWRlZCh0Yyk7CiAgIGFzc2VydCh0Yy0+aXNfZnJlZSgpLCAiQ2h1bmsgc2hvdWxkIHN0aWxsIGJlIGZyZWUiKTsKICAgYXNzZXJ0KHJlcGxhY2VtZW50VEwtPnBhcmVudCgpID09IE5VTEwgfHwKICAgICAgICAgIHJlcGxhY2VtZW50VEwgPT0gcmVwbGFjZW1lbnRUTC0+cGFyZW50KCktPmxlZnQoKSB8fApAQCAtNTQ5LDE3ICs1NzgsMTggQEAKICAgICBhc3NlcnQocmVwbGFjZW1lbnRUTC0+cGFyZW50KCkgPT0gTlVMTCwgIkluY29ycmVjdGx5IHJlcGxhY2luZyByb290Iik7CiAgICAgc2V0X3Jvb3QocmVwbGFjZW1lbnRUTCk7CiAgIH0KLSAgZGVidWdfb25seSgKKyNpZmRlZiBBU1NFUlQKICAgICBpZiAodGwgIT0gcmVwbGFjZW1lbnRUTCkgewogICAgICAgYXNzZXJ0KHJlcGxhY2VtZW50VEwtPmhlYWQoKSAhPSBOVUxMLAogICAgICAgICAiSWYgdGhlIHRyZWUgbGlzdCB3YXMgcmVwbGFjZWQsIGl0IHNob3VsZCBub3QgYmUgYSBOVUxMIGxpc3QiKTsKLSAgICAgIFRyZWVMaXN0PENodW5rPiogcmhsID0gcmVwbGFjZW1lbnRUTC0+aGVhZF9hc19UcmVlQ2h1bmsoKS0+bGlzdCgpOwotICAgICAgVHJlZUxpc3Q8Q2h1bms+KiBydGwgPSBUcmVlQ2h1bms8Q2h1bms+Ojphc19UcmVlQ2h1bmsocmVwbGFjZW1lbnRUTC0+dGFpbCgpKS0+bGlzdCgpOworICAgICAgVHJlZUxpc3Q8Q2h1bmtfdCwgRnJlZUxpc3RfdD4qIHJobCA9IHJlcGxhY2VtZW50VEwtPmhlYWRfYXNfVHJlZUNodW5rKCktPmxpc3QoKTsKKyAgICAgIFRyZWVMaXN0PENodW5rX3QsIEZyZWVMaXN0X3Q+KiBydGwgPQorICAgICAgICBUcmVlQ2h1bms8Q2h1bmtfdCwgRnJlZUxpc3RfdD46OmFzX1RyZWVDaHVuayhyZXBsYWNlbWVudFRMLT50YWlsKCkpLT5saXN0KCk7CiAgICAgICBhc3NlcnQocmhsID09IHJlcGxhY2VtZW50VEwsICJCcm9rZW4gaGVhZCIpOwogICAgICAgYXNzZXJ0KHJ0bCA9PSByZXBsYWNlbWVudFRMLCAiQnJva2VuIHRhaWwiKTsKICAgICAgIGFzc2VydChyZXBsYWNlbWVudFRMLT5zaXplKCkgPT0gdGMtPnNpemUoKSwgICJCcm9rZW4gc2l6ZSIpOwogICAgIH0KLSAgKQorI2VuZGlmCiAKICAgLy8gRG9lcyB0aGUgdHJlZSBuZWVkIHRvIGJlIHJlcGFpcmVkPwogICBpZiAocmVwbGFjZW1lbnRUTC0+Y291bnQoKSA9PSAwKSB7CkBAIC01NzQsNyArNjA0LDcgQEAKICAgICB9IGVsc2UgaWYgKHJlcGxhY2VtZW50VEwtPnJpZ2h0KCkgPT0gTlVMTCkgewogICAgICAgLy8gcmlnaHQgaXMgTlVMTAogICAgICAgbmV3VEwgPSByZXBsYWNlbWVudFRMLT5sZWZ0KCk7Ci0gICAgICBkZWJ1Z19vbmx5KHJlcGxhY2VtZW50VEwtPmNsZWFyTGVmdCgpOykKKyAgICAgIGRlYnVnX29ubHkocmVwbGFjZW1lbnRUTC0+Y2xlYXJfbGVmdCgpOykKICAgICB9IGVsc2UgeyAgLy8gd2UgaGF2ZSBib3RoIGNoaWxkcmVuLCBzbywgYnkgcGF0cmlhcmNoYWwgY29udmVudGlvbiwKICAgICAgICAgICAgICAgLy8gbXkgcmVwbGFjZW1lbnQgaXMgbGVhc3Qgbm9kZSBpbiByaWdodCBzdWItdHJlZQogICAgICAgY29tcGxpY2F0ZWRfc3BsaWNlID0gdHJ1ZTsKQEAgLTYyMyw3ICs2NTMsNyBAQAogICAgICAgbmV3VEwtPnNldF9yaWdodChyZXBsYWNlbWVudFRMLT5yaWdodCgpKTsKICAgICAgIGRlYnVnX29ubHkoCiAgICAgICAgIHJlcGxhY2VtZW50VEwtPmNsZWFyX3JpZ2h0KCk7Ci0gICAgICAgIHJlcGxhY2VtZW50VEwtPmNsZWFyTGVmdCgpOworICAgICAgICByZXBsYWNlbWVudFRMLT5jbGVhcl9sZWZ0KCk7CiAgICAgICApCiAgICAgfQogICAgIGFzc2VydChyZXBsYWNlbWVudFRMLT5yaWdodCgpID09IE5VTEwgJiYKQEAgLTY0NCwyMSArNjc0LDIxIEBACiAgICAgdmVyaWZ5X3RyZWUoKTsKICAgfQogICBhc3NlcnQoIXJlbW92aW5nX29ubHlfY2h1bmsgfHwgX3Jvb3QgPT0gTlVMTCwgInJvb3Qgc2hvdWxkIGJlIE5VTEwiKTsKLSAgcmV0dXJuIFRyZWVDaHVuazxDaHVuaz46OmFzX1RyZWVDaHVuayhyZXRUQyk7CisgIHJldHVybiBUcmVlQ2h1bms8Q2h1bmtfdCwgRnJlZUxpc3RfdD46OmFzX1RyZWVDaHVuayhyZXRUQyk7CiB9CiAKIC8vIFJlbW92ZSB0aGUgbGVmdG1vc3Qgbm9kZSAobG0pIGluIHRoZSB0cmVlIGFuZCByZXR1cm4gaXQuCiAvLyBJZiBsbSBoYXMgYSByaWdodCBjaGlsZCwgbGluayBpdCB0byB0aGUgbGVmdCBub2RlIG9mCiAvLyB0aGUgcGFyZW50IG9mIGxtLgotdGVtcGxhdGUgPGNsYXNzIENodW5rPgotVHJlZUxpc3Q8Q2h1bms+KiBCaW5hcnlUcmVlRGljdGlvbmFyeTxDaHVuaz46OnJlbW92ZV90cmVlX21pbmltdW0oVHJlZUxpc3Q8Q2h1bms+KiB0bCkgewordGVtcGxhdGUgPGNsYXNzIENodW5rX3QsIHRlbXBsYXRlIDxjbGFzcz4gY2xhc3MgRnJlZUxpc3RfdD4KK1RyZWVMaXN0PENodW5rX3QsIEZyZWVMaXN0X3Q+KiBCaW5hcnlUcmVlRGljdGlvbmFyeTxDaHVua190LCBGcmVlTGlzdF90Pjo6cmVtb3ZlX3RyZWVfbWluaW11bShUcmVlTGlzdDxDaHVua190LCBGcmVlTGlzdF90PiogdGwpIHsKICAgYXNzZXJ0KHRsICE9IE5VTEwgJiYgdGwtPnBhcmVudCgpICE9IE5VTEwsICJyZWFsbHkgbmVlZCBhIHByb3BlciBzdWItdHJlZSIpOwogICAvLyBsb2NhdGUgdGhlIHN1YnRyZWUgbWluaW11bSBieSB3YWxraW5nIGRvd24gbGVmdCBicmFuY2hlcwotICBUcmVlTGlzdDxDaHVuaz4qIGN1clRMID0gdGw7CisgIFRyZWVMaXN0PENodW5rX3QsIEZyZWVMaXN0X3Q+KiBjdXJUTCA9IHRsOwogICBmb3IgKDsgY3VyVEwtPmxlZnQoKSAhPSBOVUxMOyBjdXJUTCA9IGN1clRMLT5sZWZ0KCkpOwogICAvLyBvYnZpb3VzbHkgY3VyVEwgbm93IGhhcyBhdCBtb3N0IG9uZSBjaGlsZCwgYSByaWdodCBjaGlsZAogICBpZiAoY3VyVEwgIT0gcm9vdCgpKSB7ICAvLyBTaG91bGQgdGhpcyB0ZXN0IGp1c3QgYmUgcmVtb3ZlZD8KLSAgICBUcmVlTGlzdDxDaHVuaz4qIHBhcmVudFRMID0gY3VyVEwtPnBhcmVudCgpOworICAgIFRyZWVMaXN0PENodW5rX3QsIEZyZWVMaXN0X3Q+KiBwYXJlbnRUTCA9IGN1clRMLT5wYXJlbnQoKTsKICAgICBpZiAocGFyZW50VEwtPmxlZnQoKSA9PSBjdXJUTCkgeyAvLyBjdXJUTCBpcyBhIGxlZnQgY2hpbGQKICAgICAgIHBhcmVudFRMLT5zZXRfbGVmdChjdXJUTC0+cmlnaHQoKSk7CiAgICAgfSBlbHNlIHsKQEAgLTY4NSwzMSArNzE1LDE0IEBACiAgIHJldHVybiBjdXJUTDsKIH0KIAotLy8gQmFzZWQgb24gYSBzaW1wbGlmaWNhdGlvbiBvZiB0aGUgYWxnb3JpdGhtIGJ5IFNsZWF0b3IgYW5kIFRhcmphbiAoSkFDTSAxOTg1KS4KLS8vIFRoZSBzaW1wbGlmaWNhdGlvbnMgYXJlIHRoZSBmb2xsb3dpbmc6Ci0vLyAuIHdlIHNwbGF5IG9ubHkgd2hlbiB3ZSBkZWxldGUgKG5vdCB3aGVuIHdlIGluc2VydCkKLS8vIC4gd2UgYXBwbHkgYSBzaW5nbGUgc3BheSBzdGVwIHBlciBkZWxldGlvbi9hY2Nlc3MKLS8vIEJ5IGRvaW5nIHN1Y2ggcGFydGlhbCBzcGxheWluZywgd2UgcmVkdWNlIHRoZSBhbW91bnQgb2YgcmVzdHJ1Y3R1cmluZywKLS8vIHdoaWxlIGdldHRpbmcgYSByZWFzb25hYmx5IGVmZmljaWVudCBzZWFyY2ggdHJlZSAod2UgdGhpbmspLgotLy8gW01lYXN1cmVtZW50cyB3aWxsIGJlIG5lZWRlZCB0byAoaW4pdmFsaWRhdGUgdGhpcyBleHBlY3RhdGlvbi5dCi0KLXRlbXBsYXRlIDxjbGFzcyBDaHVuaz4KLXZvaWQgQmluYXJ5VHJlZURpY3Rpb25hcnk8Q2h1bms+OjpzZW1pX3NwbGF5X3N0ZXAoVHJlZUxpc3Q8Q2h1bms+KiB0YykgewotICAvLyBhcHBseSBhIHNlbWktc3BsYXkgc3RlcCBhdCB0aGUgZ2l2ZW4gbm9kZToKLSAgLy8gLiBpZiByb290LCBub3J0aW5nIG5lZWRzIHRvIGJlIGRvbmUKLSAgLy8gLiBpZiBjaGlsZCBvZiByb290LCBzcGxheSBvbmNlCi0gIC8vIC4gZWxzZSB6aWctemlnIG9yIHNpZy16YWcgZGVwZW5kaW5nIG9uIHBhdGggZnJvbSBncmFuZHBhcmVudAotICBpZiAocm9vdCgpID09IHRjKSByZXR1cm47Ci0gIHdhcm5pbmcoIioqKiBTcGxheWluZyBub3QgeWV0IGltcGxlbWVudGVkOyAiCi0gICAgICAgICAgInRyZWUgb3BlcmF0aW9ucyBtYXkgYmUgaW5lZmZpY2llbnQgKioqIik7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBDaHVuaz4KLXZvaWQgQmluYXJ5VHJlZURpY3Rpb25hcnk8Q2h1bms+OjppbnNlcnRfY2h1bmtfaW5fdHJlZShDaHVuayogZmMpIHsKLSAgVHJlZUxpc3Q8Q2h1bms+ICpjdXJUTCwgKnByZXZUTDsKK3RlbXBsYXRlIDxjbGFzcyBDaHVua190LCB0ZW1wbGF0ZSA8Y2xhc3M+IGNsYXNzIEZyZWVMaXN0X3Q+Cit2b2lkIEJpbmFyeVRyZWVEaWN0aW9uYXJ5PENodW5rX3QsIEZyZWVMaXN0X3Q+OjppbnNlcnRfY2h1bmtfaW5fdHJlZShDaHVua190KiBmYykgeworICBUcmVlTGlzdDxDaHVua190LCBGcmVlTGlzdF90PiAqY3VyVEwsICpwcmV2VEw7CiAgIHNpemVfdCBzaXplID0gZmMtPnNpemUoKTsKIAotICBhc3NlcnQoc2l6ZSA+PSBCaW5hcnlUcmVlRGljdGlvbmFyeTxDaHVuaz46Om1pbl90cmVlX2NodW5rX3NpemUsICJ0b28gc21hbGwgdG8gYmUgYSBUcmVlTGlzdDxDaHVuaz4iKTsKKyAgYXNzZXJ0KChzaXplID49IG1pbl9zaXplKCkpLAorICAgIGVycl9tc2coU0laRV9GT1JNQVQgIiBpcyB0b28gc21hbGwgdG8gYmUgYSBUcmVlQ2h1bms8Q2h1bmtfdCwgRnJlZUxpc3RfdD4gIiBTSVpFX0ZPUk1BVCwKKyAgICAgIHNpemUsIG1pbl9zaXplKCkpKTsKICAgaWYgKEZMU1ZlcmlmeURpY3Rpb25hcnkpIHsKICAgICB2ZXJpZnlfdHJlZSgpOwogICB9CkBAIC03MjksOSArNzQyLDkgQEAKICAgICAgIGN1clRMID0gY3VyVEwtPnJpZ2h0KCk7CiAgICAgfQogICB9Ci0gIFRyZWVDaHVuazxDaHVuaz4qIHRjID0gVHJlZUNodW5rPENodW5rPjo6YXNfVHJlZUNodW5rKGZjKTsKKyAgVHJlZUNodW5rPENodW5rX3QsIEZyZWVMaXN0X3Q+KiB0YyA9IFRyZWVDaHVuazxDaHVua190LCBGcmVlTGlzdF90Pjo6YXNfVHJlZUNodW5rKGZjKTsKICAgLy8gVGhpcyBjaHVuayBpcyBiZWluZyByZXR1cm5lZCB0byB0aGUgYmluYXJ5IHRyZWUuICBJdHMgZW1iZWRkZWQKLSAgLy8gVHJlZUxpc3Q8Q2h1bms+IHNob3VsZCBiZSB1bnVzZWQgYXQgdGhpcyBwb2ludC4KKyAgLy8gVHJlZUxpc3Q8Q2h1bmtfdCwgRnJlZUxpc3RfdD4gc2hvdWxkIGJlIHVudXNlZCBhdCB0aGlzIHBvaW50LgogICB0Yy0+aW5pdGlhbGl6ZSgpOwogICBpZiAoY3VyVEwgIT0gTlVMTCkgeyAgICAgICAgICAvLyBleGFjdCBtYXRjaAogICAgIHRjLT5zZXRfbGlzdChjdXJUTCk7CkBAIC03MzksOCArNzUyLDggQEAKICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAvLyBuZWVkIGEgbmV3IG5vZGUgaW4gdHJlZQogICAgIHRjLT5jbGVhcl9uZXh0KCk7CiAgICAgdGMtPmxpbmtfcHJldihOVUxMKTsKLSAgICBUcmVlTGlzdDxDaHVuaz4qIG5ld1RMID0gVHJlZUxpc3Q8Q2h1bms+Ojphc19UcmVlTGlzdCh0Yyk7Ci0gICAgYXNzZXJ0KCgoVHJlZUNodW5rPENodW5rPiopdGMpLT5saXN0KCkgPT0gbmV3VEwsCisgICAgVHJlZUxpc3Q8Q2h1bmtfdCwgRnJlZUxpc3RfdD4qIG5ld1RMID0gVHJlZUxpc3Q8Q2h1bmtfdCwgRnJlZUxpc3RfdD46OmFzX1RyZWVMaXN0KHRjKTsKKyAgICBhc3NlcnQoKChUcmVlQ2h1bms8Q2h1bmtfdCwgRnJlZUxpc3RfdD4qKXRjKS0+bGlzdCgpID09IG5ld1RMLAogICAgICAgIkxpc3Qgd2FzIG5vdCBpbml0aWFsaXplZCBjb3JyZWN0bHkiKTsKICAgICBpZiAocHJldlRMID09IE5VTEwpIHsgICAgICAvLyB3ZSBhcmUgdGhlIG9ubHkgdHJlZSBub2RlCiAgICAgICBhc3NlcnQocm9vdCgpID09IE5VTEwsICJjb250cm9sIHBvaW50IGludmFyaWFudCIpOwpAQCAtNzY4LDMwICs3ODEsMzAgQEAKICAgfQogfQogCi10ZW1wbGF0ZSA8Y2xhc3MgQ2h1bms+Ci1zaXplX3QgQmluYXJ5VHJlZURpY3Rpb25hcnk8Q2h1bms+OjptYXhfY2h1bmtfc2l6ZSgpIGNvbnN0IHsKLSAgRnJlZUJsb2NrRGljdGlvbmFyeTxDaHVuaz46OnZlcmlmeV9wYXJfbG9ja2VkKCk7Ci0gIFRyZWVMaXN0PENodW5rPiogdGMgPSByb290KCk7Cit0ZW1wbGF0ZSA8Y2xhc3MgQ2h1bmtfdCwgdGVtcGxhdGUgPGNsYXNzPiBjbGFzcyBGcmVlTGlzdF90Pgorc2l6ZV90IEJpbmFyeVRyZWVEaWN0aW9uYXJ5PENodW5rX3QsIEZyZWVMaXN0X3Q+OjptYXhfY2h1bmtfc2l6ZSgpIGNvbnN0IHsKKyAgRnJlZUJsb2NrRGljdGlvbmFyeTxDaHVua190Pjo6dmVyaWZ5X3Bhcl9sb2NrZWQoKTsKKyAgVHJlZUxpc3Q8Q2h1bmtfdCwgRnJlZUxpc3RfdD4qIHRjID0gcm9vdCgpOwogICBpZiAodGMgPT0gTlVMTCkgcmV0dXJuIDA7CiAgIGZvciAoOyB0Yy0+cmlnaHQoKSAhPSBOVUxMOyB0YyA9IHRjLT5yaWdodCgpKTsKICAgcmV0dXJuIHRjLT5zaXplKCk7CiB9CiAKLXRlbXBsYXRlIDxjbGFzcyBDaHVuaz4KLXNpemVfdCBCaW5hcnlUcmVlRGljdGlvbmFyeTxDaHVuaz46OnRvdGFsX2xpc3RfbGVuZ3RoKFRyZWVMaXN0PENodW5rPiogdGwpIGNvbnN0IHsKK3RlbXBsYXRlIDxjbGFzcyBDaHVua190LCB0ZW1wbGF0ZSA8Y2xhc3M+IGNsYXNzIEZyZWVMaXN0X3Q+CitzaXplX3QgQmluYXJ5VHJlZURpY3Rpb25hcnk8Q2h1bmtfdCwgRnJlZUxpc3RfdD46OnRvdGFsX2xpc3RfbGVuZ3RoKFRyZWVMaXN0PENodW5rX3QsIEZyZWVMaXN0X3Q+KiB0bCkgY29uc3QgewogICBzaXplX3QgcmVzOwogICByZXMgPSB0bC0+Y291bnQoKTsKICNpZmRlZiBBU1NFUlQKICAgc2l6ZV90IGNudDsKLSAgQ2h1bmsqIHRjID0gdGwtPmhlYWQoKTsKKyAgQ2h1bmtfdCogdGMgPSB0bC0+aGVhZCgpOwogICBmb3IgKGNudCA9IDA7IHRjICE9IE5VTEw7IHRjID0gdGMtPm5leHQoKSwgY250KyspOwogICBhc3NlcnQocmVzID09IGNudCwgIlRoZSBjb3VudCBpcyBub3QgYmVpbmcgbWFpbnRhaW5lZCBjb3JyZWN0bHkiKTsKICNlbmRpZgogICByZXR1cm4gcmVzOwogfQogCi10ZW1wbGF0ZSA8Y2xhc3MgQ2h1bms+Ci1zaXplX3QgQmluYXJ5VHJlZURpY3Rpb25hcnk8Q2h1bms+Ojp0b3RhbF9zaXplX2luX3RyZWUoVHJlZUxpc3Q8Q2h1bms+KiB0bCkgY29uc3QgewordGVtcGxhdGUgPGNsYXNzIENodW5rX3QsIHRlbXBsYXRlIDxjbGFzcz4gY2xhc3MgRnJlZUxpc3RfdD4KK3NpemVfdCBCaW5hcnlUcmVlRGljdGlvbmFyeTxDaHVua190LCBGcmVlTGlzdF90Pjo6dG90YWxfc2l6ZV9pbl90cmVlKFRyZWVMaXN0PENodW5rX3QsIEZyZWVMaXN0X3Q+KiB0bCkgY29uc3QgewogICBpZiAodGwgPT0gTlVMTCkKICAgICByZXR1cm4gMDsKICAgcmV0dXJuICh0bC0+c2l6ZSgpICogdG90YWxfbGlzdF9sZW5ndGgodGwpKSArCkBAIC03OTksOCArODEyLDggQEAKICAgICAgICAgIHRvdGFsX3NpemVfaW5fdHJlZSh0bC0+cmlnaHQoKSk7CiB9CiAKLXRlbXBsYXRlIDxjbGFzcyBDaHVuaz4KLWRvdWJsZSBCaW5hcnlUcmVlRGljdGlvbmFyeTxDaHVuaz46OnN1bV9vZl9zcXVhcmVkX2Jsb2NrX3NpemVzKFRyZWVMaXN0PENodW5rPiogY29uc3QgdGwpIGNvbnN0IHsKK3RlbXBsYXRlIDxjbGFzcyBDaHVua190LCB0ZW1wbGF0ZSA8Y2xhc3M+IGNsYXNzIEZyZWVMaXN0X3Q+Citkb3VibGUgQmluYXJ5VHJlZURpY3Rpb25hcnk8Q2h1bmtfdCwgRnJlZUxpc3RfdD46OnN1bV9vZl9zcXVhcmVkX2Jsb2NrX3NpemVzKFRyZWVMaXN0PENodW5rX3QsIEZyZWVMaXN0X3Q+KiBjb25zdCB0bCkgY29uc3QgewogICBpZiAodGwgPT0gTlVMTCkgewogICAgIHJldHVybiAwLjA7CiAgIH0KQEAgLTgxMSw4ICs4MjQsOCBAQAogICByZXR1cm4gY3VycjsKIH0KIAotdGVtcGxhdGUgPGNsYXNzIENodW5rPgotc2l6ZV90IEJpbmFyeVRyZWVEaWN0aW9uYXJ5PENodW5rPjo6dG90YWxfZnJlZV9ibG9ja3NfaW5fdHJlZShUcmVlTGlzdDxDaHVuaz4qIHRsKSBjb25zdCB7Cit0ZW1wbGF0ZSA8Y2xhc3MgQ2h1bmtfdCwgdGVtcGxhdGUgPGNsYXNzPiBjbGFzcyBGcmVlTGlzdF90Pgorc2l6ZV90IEJpbmFyeVRyZWVEaWN0aW9uYXJ5PENodW5rX3QsIEZyZWVMaXN0X3Q+Ojp0b3RhbF9mcmVlX2Jsb2Nrc19pbl90cmVlKFRyZWVMaXN0PENodW5rX3QsIEZyZWVMaXN0X3Q+KiB0bCkgY29uc3QgewogICBpZiAodGwgPT0gTlVMTCkKICAgICByZXR1cm4gMDsKICAgcmV0dXJuIHRvdGFsX2xpc3RfbGVuZ3RoKHRsKSArCkBAIC04MjAsMjggKzgzMywyOCBAQAogICAgICAgICAgdG90YWxfZnJlZV9ibG9ja3NfaW5fdHJlZSh0bC0+cmlnaHQoKSk7CiB9CiAKLXRlbXBsYXRlIDxjbGFzcyBDaHVuaz4KLXNpemVfdCBCaW5hcnlUcmVlRGljdGlvbmFyeTxDaHVuaz46Om51bV9mcmVlX2Jsb2NrcygpIGNvbnN0IHsKK3RlbXBsYXRlIDxjbGFzcyBDaHVua190LCB0ZW1wbGF0ZSA8Y2xhc3M+IGNsYXNzIEZyZWVMaXN0X3Q+CitzaXplX3QgQmluYXJ5VHJlZURpY3Rpb25hcnk8Q2h1bmtfdCwgRnJlZUxpc3RfdD46Om51bV9mcmVlX2Jsb2NrcygpIGNvbnN0IHsKICAgYXNzZXJ0KHRvdGFsX2ZyZWVfYmxvY2tzX2luX3RyZWUocm9vdCgpKSA9PSB0b3RhbF9mcmVlX2Jsb2NrcygpLAogICAgICAgICAgIl90b3RhbF9mcmVlX2Jsb2NrcyBpbmNvbnNpc3RlbmN5Iik7CiAgIHJldHVybiB0b3RhbF9mcmVlX2Jsb2NrcygpOwogfQogCi10ZW1wbGF0ZSA8Y2xhc3MgQ2h1bms+Ci1zaXplX3QgQmluYXJ5VHJlZURpY3Rpb25hcnk8Q2h1bms+Ojp0cmVlX2hlaWdodF9oZWxwZXIoVHJlZUxpc3Q8Q2h1bms+KiB0bCkgY29uc3QgewordGVtcGxhdGUgPGNsYXNzIENodW5rX3QsIHRlbXBsYXRlIDxjbGFzcz4gY2xhc3MgRnJlZUxpc3RfdD4KK3NpemVfdCBCaW5hcnlUcmVlRGljdGlvbmFyeTxDaHVua190LCBGcmVlTGlzdF90Pjo6dHJlZV9oZWlnaHRfaGVscGVyKFRyZWVMaXN0PENodW5rX3QsIEZyZWVMaXN0X3Q+KiB0bCkgY29uc3QgewogICBpZiAodGwgPT0gTlVMTCkKICAgICByZXR1cm4gMDsKICAgcmV0dXJuIDEgKyBNQVgyKHRyZWVfaGVpZ2h0X2hlbHBlcih0bC0+bGVmdCgpKSwKICAgICAgICAgICAgICAgICAgIHRyZWVfaGVpZ2h0X2hlbHBlcih0bC0+cmlnaHQoKSkpOwogfQogCi10ZW1wbGF0ZSA8Y2xhc3MgQ2h1bms+Ci1zaXplX3QgQmluYXJ5VHJlZURpY3Rpb25hcnk8Q2h1bms+Ojp0cmVlSGVpZ2h0KCkgY29uc3QgewordGVtcGxhdGUgPGNsYXNzIENodW5rX3QsIHRlbXBsYXRlIDxjbGFzcz4gY2xhc3MgRnJlZUxpc3RfdD4KK3NpemVfdCBCaW5hcnlUcmVlRGljdGlvbmFyeTxDaHVua190LCBGcmVlTGlzdF90Pjo6dHJlZV9oZWlnaHQoKSBjb25zdCB7CiAgIHJldHVybiB0cmVlX2hlaWdodF9oZWxwZXIocm9vdCgpKTsKIH0KIAotdGVtcGxhdGUgPGNsYXNzIENodW5rPgotc2l6ZV90IEJpbmFyeVRyZWVEaWN0aW9uYXJ5PENodW5rPjo6dG90YWxfbm9kZXNfaGVscGVyKFRyZWVMaXN0PENodW5rPiogdGwpIGNvbnN0IHsKK3RlbXBsYXRlIDxjbGFzcyBDaHVua190LCB0ZW1wbGF0ZSA8Y2xhc3M+IGNsYXNzIEZyZWVMaXN0X3Q+CitzaXplX3QgQmluYXJ5VHJlZURpY3Rpb25hcnk8Q2h1bmtfdCwgRnJlZUxpc3RfdD46OnRvdGFsX25vZGVzX2hlbHBlcihUcmVlTGlzdDxDaHVua190LCBGcmVlTGlzdF90PiogdGwpIGNvbnN0IHsKICAgaWYgKHRsID09IE5VTEwpIHsKICAgICByZXR1cm4gMDsKICAgfQpAQCAtODQ5LDE0ICs4NjIsMTggQEAKICAgICB0b3RhbF9ub2Rlc19oZWxwZXIodGwtPnJpZ2h0KCkpOwogfQogCi10ZW1wbGF0ZSA8Y2xhc3MgQ2h1bms+Ci1zaXplX3QgQmluYXJ5VHJlZURpY3Rpb25hcnk8Q2h1bms+Ojp0b3RhbF9ub2Rlc19pbl90cmVlKFRyZWVMaXN0PENodW5rPiogdGwpIGNvbnN0IHsKK3RlbXBsYXRlIDxjbGFzcyBDaHVua190LCB0ZW1wbGF0ZSA8Y2xhc3M+IGNsYXNzIEZyZWVMaXN0X3Q+CitzaXplX3QgQmluYXJ5VHJlZURpY3Rpb25hcnk8Q2h1bmtfdCwgRnJlZUxpc3RfdD46OnRvdGFsX25vZGVzX2luX3RyZWUoVHJlZUxpc3Q8Q2h1bmtfdCwgRnJlZUxpc3RfdD4qIHRsKSBjb25zdCB7CiAgIHJldHVybiB0b3RhbF9ub2Rlc19oZWxwZXIocm9vdCgpKTsKIH0KIAotdGVtcGxhdGUgPGNsYXNzIENodW5rPgotdm9pZCBCaW5hcnlUcmVlRGljdGlvbmFyeTxDaHVuaz46OmRpY3RfY2Vuc3VzX3VkcGF0ZShzaXplX3Qgc2l6ZSwgYm9vbCBzcGxpdCwgYm9vbCBiaXJ0aCl7Ci0gIFRyZWVMaXN0PENodW5rPiogbmQgPSBmaW5kX2xpc3Qoc2l6ZSk7Cit0ZW1wbGF0ZSA8Y2xhc3MgQ2h1bmtfdCwgdGVtcGxhdGUgPGNsYXNzPiBjbGFzcyBGcmVlTGlzdF90Pgordm9pZCBCaW5hcnlUcmVlRGljdGlvbmFyeTxDaHVua190LCBGcmVlTGlzdF90Pjo6ZGljdF9jZW5zdXNfdXBkYXRlKHNpemVfdCBzaXplLCBib29sIHNwbGl0LCBib29sIGJpcnRoKXt9CisKKyNpZm5kZWYgU0VSSUFMR0MKK3RlbXBsYXRlIDw+Cit2b2lkIEJpbmFyeVRyZWVEaWN0aW9uYXJ5PEZyZWVDaHVuaywgQWRhcHRpdmVGcmVlTGlzdD46OmRpY3RfY2Vuc3VzX3VwZGF0ZShzaXplX3Qgc2l6ZSwgYm9vbCBzcGxpdCwgYm9vbCBiaXJ0aCl7CisgIFRyZWVMaXN0PEZyZWVDaHVuaywgQWRhcHRpdmVGcmVlTGlzdD4qIG5kID0gZmluZF9saXN0KHNpemUpOwogICBpZiAobmQpIHsKICAgICBpZiAoc3BsaXQpIHsKICAgICAgIGlmIChiaXJ0aCkgewpAQCAtODgyLDE2ICs4OTksMjYgQEAKICAgLy8gICBUaGlzIGlzIGEgYmlydGggYXNzb2NpYXRlZCB3aXRoIGEgTGluQUIuICBUaGUgY2h1bmsKICAgLy8gICAgIGZvciB0aGUgTGluQUIgaXMgbm90IGluIHRoZSBkaWN0aW9uYXJ5LgogfQorI2VuZGlmIC8vIFNFUklBTEdDCiAKLXRlbXBsYXRlIDxjbGFzcyBDaHVuaz4KLWJvb2wgQmluYXJ5VHJlZURpY3Rpb25hcnk8Q2h1bms+Ojpjb2FsX2RpY3Rfb3Zlcl9wb3B1bGF0ZWQoc2l6ZV90IHNpemUpIHsKK3RlbXBsYXRlIDxjbGFzcyBDaHVua190LCB0ZW1wbGF0ZSA8Y2xhc3M+IGNsYXNzIEZyZWVMaXN0X3Q+Citib29sIEJpbmFyeVRyZWVEaWN0aW9uYXJ5PENodW5rX3QsIEZyZWVMaXN0X3Q+Ojpjb2FsX2RpY3Rfb3Zlcl9wb3B1bGF0ZWQoc2l6ZV90IHNpemUpIHsKKyAgLy8gRm9yIHRoZSBnZW5lcmFsIHR5cGUgb2YgZnJlZWxpc3RzLCBlbmNvdXJhZ2UgY29hbGVzY2luZyBieQorICAvLyByZXR1cm5pbmcgdHJ1ZS4KKyAgcmV0dXJuIHRydWU7Cit9CisKKyNpZm5kZWYgU0VSSUFMR0MKK3RlbXBsYXRlIDw+Citib29sIEJpbmFyeVRyZWVEaWN0aW9uYXJ5PEZyZWVDaHVuaywgQWRhcHRpdmVGcmVlTGlzdD46OmNvYWxfZGljdF9vdmVyX3BvcHVsYXRlZChzaXplX3Qgc2l6ZSkgewogICBpZiAoRkxTQWx3YXlzQ29hbGVzY2VMYXJnZSkgcmV0dXJuIHRydWU7CiAKLSAgVHJlZUxpc3Q8Q2h1bms+KiBsaXN0X29mX3NpemUgPSBmaW5kX2xpc3Qoc2l6ZSk7CisgIFRyZWVMaXN0PEZyZWVDaHVuaywgQWRhcHRpdmVGcmVlTGlzdD4qIGxpc3Rfb2Zfc2l6ZSA9IGZpbmRfbGlzdChzaXplKTsKICAgLy8gTm9uZSBvZiByZXF1ZXN0ZWQgc2l6ZSBpbXBsaWVzIG92ZXJwb3B1bGF0ZWQuCiAgIHJldHVybiBsaXN0X29mX3NpemUgPT0gTlVMTCB8fCBsaXN0X29mX3NpemUtPmNvYWxfZGVzaXJlZCgpIDw9IDAgfHwKICAgICAgICAgIGxpc3Rfb2Zfc2l6ZS0+Y291bnQoKSA+IGxpc3Rfb2Zfc2l6ZS0+Y29hbF9kZXNpcmVkKCk7CiB9CisjZW5kaWYgIC8vIFNFUklBTEdDCiAKIC8vIENsb3N1cmVzIGZvciB3YWxraW5nIHRoZSBiaW5hcnkgdHJlZS4KIC8vICAgZG9fbGlzdCgpIHdhbGtzIHRoZSBmcmVlIGxpc3QgaW4gYSBub2RlIGFwcGx5aW5nIHRoZSBjbG9zdXJlCkBAIC04OTksMTkgKzkyNiwxOCBAQAogLy8gICBkb190cmVlKCkgd2Fsa3MgdGhlIG5vZGVzIGluIHRoZSBiaW5hcnkgdHJlZSBhcHBseWluZyBkb19saXN0KCkKIC8vICAgICB0byBlYWNoIGxpc3QgYXQgZWFjaCBub2RlLgogCi10ZW1wbGF0ZSA8Y2xhc3MgQ2h1bms+Cit0ZW1wbGF0ZSA8Y2xhc3MgQ2h1bmtfdCwgdGVtcGxhdGUgPGNsYXNzPiBjbGFzcyBGcmVlTGlzdF90PgogY2xhc3MgVHJlZUNlbnN1c0Nsb3N1cmUgOiBwdWJsaWMgU3RhY2tPYmogewogIHByb3RlY3RlZDoKLSAgdmlydHVhbCB2b2lkIGRvX2xpc3QoRnJlZUxpc3Q8Q2h1bms+KiBmbCkgPSAwOworICB2aXJ0dWFsIHZvaWQgZG9fbGlzdChGcmVlTGlzdF90PENodW5rX3Q+KiBmbCkgPSAwOwogIHB1YmxpYzoKLSAgdmlydHVhbCB2b2lkIGRvX3RyZWUoVHJlZUxpc3Q8Q2h1bms+KiB0bCkgPSAwOworICB2aXJ0dWFsIHZvaWQgZG9fdHJlZShUcmVlTGlzdDxDaHVua190LCBGcmVlTGlzdF90PiogdGwpID0gMDsKIH07CiAKLXRlbXBsYXRlIDxjbGFzcyBDaHVuaz4KLWNsYXNzIEFzY2VuZFRyZWVDZW5zdXNDbG9zdXJlIDogcHVibGljIFRyZWVDZW5zdXNDbG9zdXJlPENodW5rPiB7Ci0gIHVzaW5nIFRyZWVDZW5zdXNDbG9zdXJlPENodW5rPjo6ZG9fbGlzdDsKK3RlbXBsYXRlIDxjbGFzcyBDaHVua190LCB0ZW1wbGF0ZSA8Y2xhc3M+IGNsYXNzIEZyZWVMaXN0X3Q+CitjbGFzcyBBc2NlbmRUcmVlQ2Vuc3VzQ2xvc3VyZSA6IHB1YmxpYyBUcmVlQ2Vuc3VzQ2xvc3VyZTxDaHVua190LCBGcmVlTGlzdF90PiB7CiAgcHVibGljOgotICB2b2lkIGRvX3RyZWUoVHJlZUxpc3Q8Q2h1bms+KiB0bCkgeworICB2b2lkIGRvX3RyZWUoVHJlZUxpc3Q8Q2h1bmtfdCwgRnJlZUxpc3RfdD4qIHRsKSB7CiAgICAgaWYgKHRsICE9IE5VTEwpIHsKICAgICAgIGRvX3RyZWUodGwtPmxlZnQoKSk7CiAgICAgICBkb19saXN0KHRsKTsKQEAgLTkyMCwxMSArOTQ2LDEwIEBACiAgIH0KIH07CiAKLXRlbXBsYXRlIDxjbGFzcyBDaHVuaz4KLWNsYXNzIERlc2NlbmRUcmVlQ2Vuc3VzQ2xvc3VyZSA6IHB1YmxpYyBUcmVlQ2Vuc3VzQ2xvc3VyZTxDaHVuaz4gewotICB1c2luZyBUcmVlQ2Vuc3VzQ2xvc3VyZTxDaHVuaz46OmRvX2xpc3Q7Cit0ZW1wbGF0ZSA8Y2xhc3MgQ2h1bmtfdCwgdGVtcGxhdGUgPGNsYXNzPiBjbGFzcyBGcmVlTGlzdF90PgorY2xhc3MgRGVzY2VuZFRyZWVDZW5zdXNDbG9zdXJlIDogcHVibGljIFRyZWVDZW5zdXNDbG9zdXJlPENodW5rX3QsIEZyZWVMaXN0X3Q+IHsKICBwdWJsaWM6Ci0gIHZvaWQgZG9fdHJlZShUcmVlTGlzdDxDaHVuaz4qIHRsKSB7CisgIHZvaWQgZG9fdHJlZShUcmVlTGlzdDxDaHVua190LCBGcmVlTGlzdF90PiogdGwpIHsKICAgICBpZiAodGwgIT0gTlVMTCkgewogICAgICAgZG9fdHJlZSh0bC0+cmlnaHQoKSk7CiAgICAgICBkb19saXN0KHRsKTsKQEAgLTkzNSw4ICs5NjAsOCBAQAogCiAvLyBGb3IgZWFjaCBsaXN0IGluIHRoZSB0cmVlLCBjYWxjdWxhdGUgdGhlIGRlc2lyZWQsIGRlc2lyZWQKIC8vIGNvYWxlc2NlLCBjb3VudCBiZWZvcmUgc3dlZXAsIGFuZCBzdXJwbHVzIGJlZm9yZSBzd2VlcC4KLXRlbXBsYXRlIDxjbGFzcyBDaHVuaz4KLWNsYXNzIEJlZ2luU3dlZXBDbG9zdXJlIDogcHVibGljIEFzY2VuZFRyZWVDZW5zdXNDbG9zdXJlPENodW5rPiB7Cit0ZW1wbGF0ZSA8Y2xhc3MgQ2h1bmtfdCwgdGVtcGxhdGUgPGNsYXNzPiBjbGFzcyBGcmVlTGlzdF90PgorY2xhc3MgQmVnaW5Td2VlcENsb3N1cmUgOiBwdWJsaWMgQXNjZW5kVHJlZUNlbnN1c0Nsb3N1cmU8Q2h1bmtfdCwgRnJlZUxpc3RfdD4gewogICBkb3VibGUgX3BlcmNlbnRhZ2U7CiAgIGZsb2F0IF9pbnRlcl9zd2VlcF9jdXJyZW50OwogICBmbG9hdCBfaW50ZXJfc3dlZXBfZXN0aW1hdGU7CkBAIC05NTEsMzIgKzk3NiwzNiBAQAogICAgX2ludGVyX3N3ZWVwX2VzdGltYXRlKGludGVyX3N3ZWVwX2VzdGltYXRlKSwKICAgIF9pbnRyYV9zd2VlcF9lc3RpbWF0ZShpbnRyYV9zd2VlcF9lc3RpbWF0ZSkgeyB9CiAKLSAgdm9pZCBkb19saXN0KEZyZWVMaXN0PENodW5rPiogZmwpIHsKKyAgdm9pZCBkb19saXN0KEZyZWVMaXN0PENodW5rX3Q+KiBmbCkge30KKworI2lmbmRlZiBTRVJJQUxHQworICB2b2lkIGRvX2xpc3QoQWRhcHRpdmVGcmVlTGlzdDxDaHVua190PiogZmwpIHsKICAgICBkb3VibGUgY29hbFN1cnBsdXNQZXJjZW50ID0gX3BlcmNlbnRhZ2U7CiAgICAgZmwtPmNvbXB1dGVfZGVzaXJlZChfaW50ZXJfc3dlZXBfY3VycmVudCwgX2ludGVyX3N3ZWVwX2VzdGltYXRlLCBfaW50cmFfc3dlZXBfZXN0aW1hdGUpOwogICAgIGZsLT5zZXRfY29hbF9kZXNpcmVkKChzc2l6ZV90KSgoZG91YmxlKWZsLT5kZXNpcmVkKCkgKiBjb2FsU3VycGx1c1BlcmNlbnQpKTsKICAgICBmbC0+c2V0X2JlZm9yZV9zd2VlcChmbC0+Y291bnQoKSk7CiAgICAgZmwtPnNldF9iZnJfc3VycChmbC0+c3VycGx1cygpKTsKICAgfQorI2VuZGlmIC8vIFNFUklBTEdDCiB9OwogCiAvLyBVc2VkIHRvIHNlYXJjaCB0aGUgdHJlZSB1bnRpbCBhIGNvbmRpdGlvbiBpcyBtZXQuCiAvLyBTaW1pbGFyIHRvIFRyZWVDZW5zdXNDbG9zdXJlIGJ1dCBzZWFyY2hlcyB0aGUKIC8vIHRyZWUgYW5kIHJldHVybnMgcHJvbXB0bHkgd2hlbiBmb3VuZC4KIAotdGVtcGxhdGUgPGNsYXNzIENodW5rPgordGVtcGxhdGUgPGNsYXNzIENodW5rX3QsIHRlbXBsYXRlIDxjbGFzcz4gY2xhc3MgRnJlZUxpc3RfdD4KIGNsYXNzIFRyZWVTZWFyY2hDbG9zdXJlIDogcHVibGljIFN0YWNrT2JqIHsKICBwcm90ZWN0ZWQ6Ci0gIHZpcnR1YWwgYm9vbCBkb19saXN0KEZyZWVMaXN0PENodW5rPiogZmwpID0gMDsKKyAgdmlydHVhbCBib29sIGRvX2xpc3QoRnJlZUxpc3RfdDxDaHVua190PiogZmwpID0gMDsKICBwdWJsaWM6Ci0gIHZpcnR1YWwgYm9vbCBkb190cmVlKFRyZWVMaXN0PENodW5rPiogdGwpID0gMDsKKyAgdmlydHVhbCBib29sIGRvX3RyZWUoVHJlZUxpc3Q8Q2h1bmtfdCwgRnJlZUxpc3RfdD4qIHRsKSA9IDA7CiB9OwogCiAjaWYgMCAvLyAgRG9uJ3QgbmVlZCB0aGlzIHlldCBidXQgaGVyZSBmb3Igc3ltbWV0cnkuCi10ZW1wbGF0ZSA8Y2xhc3MgQ2h1bms+Ci1jbGFzcyBBc2NlbmRUcmVlU2VhcmNoQ2xvc3VyZSA6IHB1YmxpYyBUcmVlU2VhcmNoQ2xvc3VyZSB7Cit0ZW1wbGF0ZSA8Y2xhc3MgQ2h1bmtfdCwgdGVtcGxhdGUgPGNsYXNzPiBjbGFzcyBGcmVlTGlzdF90PgorY2xhc3MgQXNjZW5kVHJlZVNlYXJjaENsb3N1cmUgOiBwdWJsaWMgVHJlZVNlYXJjaENsb3N1cmU8Q2h1bmtfdD4gewogIHB1YmxpYzoKLSAgYm9vbCBkb190cmVlKFRyZWVMaXN0PENodW5rPiogdGwpIHsKKyAgYm9vbCBkb190cmVlKFRyZWVMaXN0PENodW5rX3QsIEZyZWVMaXN0X3Q+KiB0bCkgewogICAgIGlmICh0bCAhPSBOVUxMKSB7CiAgICAgICBpZiAoZG9fdHJlZSh0bC0+bGVmdCgpKSkgcmV0dXJuIHRydWU7CiAgICAgICBpZiAoZG9fbGlzdCh0bCkpIHJldHVybiB0cnVlOwpAQCAtOTg3LDExICsxMDE2LDEwIEBACiB9OwogI2VuZGlmCiAKLXRlbXBsYXRlIDxjbGFzcyBDaHVuaz4KLWNsYXNzIERlc2NlbmRUcmVlU2VhcmNoQ2xvc3VyZSA6IHB1YmxpYyBUcmVlU2VhcmNoQ2xvc3VyZTxDaHVuaz4gewotICB1c2luZyBUcmVlU2VhcmNoQ2xvc3VyZTxDaHVuaz46OmRvX2xpc3Q7Cit0ZW1wbGF0ZSA8Y2xhc3MgQ2h1bmtfdCwgdGVtcGxhdGUgPGNsYXNzPiBjbGFzcyBGcmVlTGlzdF90PgorY2xhc3MgRGVzY2VuZFRyZWVTZWFyY2hDbG9zdXJlIDogcHVibGljIFRyZWVTZWFyY2hDbG9zdXJlPENodW5rX3QsIEZyZWVMaXN0X3Q+IHsKICBwdWJsaWM6Ci0gIGJvb2wgZG9fdHJlZShUcmVlTGlzdDxDaHVuaz4qIHRsKSB7CisgIGJvb2wgZG9fdHJlZShUcmVlTGlzdDxDaHVua190LCBGcmVlTGlzdF90PiogdGwpIHsKICAgICBpZiAodGwgIT0gTlVMTCkgewogICAgICAgaWYgKGRvX3RyZWUodGwtPnJpZ2h0KCkpKSByZXR1cm4gdHJ1ZTsKICAgICAgIGlmIChkb19saXN0KHRsKSkgcmV0dXJuIHRydWU7CkBAIC0xMDAzLDE3ICsxMDMxLDE3IEBACiAKIC8vIFNlYXJjaGVzIHRoZSB0cmVlIGZvciBhIGNodW5rIHRoYXQgZW5kcyBhdCB0aGUKIC8vIHNwZWNpZmllZCBhZGRyZXNzLgotdGVtcGxhdGUgPGNsYXNzIENodW5rPgotY2xhc3MgRW5kVHJlZVNlYXJjaENsb3N1cmUgOiBwdWJsaWMgRGVzY2VuZFRyZWVTZWFyY2hDbG9zdXJlPENodW5rPiB7Cit0ZW1wbGF0ZSA8Y2xhc3MgQ2h1bmtfdCwgdGVtcGxhdGUgPGNsYXNzPiBjbGFzcyBGcmVlTGlzdF90PgorY2xhc3MgRW5kVHJlZVNlYXJjaENsb3N1cmUgOiBwdWJsaWMgRGVzY2VuZFRyZWVTZWFyY2hDbG9zdXJlPENodW5rX3QsIEZyZWVMaXN0X3Q+IHsKICAgSGVhcFdvcmQqIF90YXJnZXQ7Ci0gIENodW5rKiBfZm91bmQ7CisgIENodW5rX3QqIF9mb3VuZDsKIAogIHB1YmxpYzoKICAgRW5kVHJlZVNlYXJjaENsb3N1cmUoSGVhcFdvcmQqIHRhcmdldCkgOiBfdGFyZ2V0KHRhcmdldCksIF9mb3VuZChOVUxMKSB7fQotICBib29sIGRvX2xpc3QoRnJlZUxpc3Q8Q2h1bms+KiBmbCkgewotICAgIENodW5rKiBpdGVtID0gZmwtPmhlYWQoKTsKKyAgYm9vbCBkb19saXN0KEZyZWVMaXN0X3Q8Q2h1bmtfdD4qIGZsKSB7CisgICAgQ2h1bmtfdCogaXRlbSA9IGZsLT5oZWFkKCk7CiAgICAgd2hpbGUgKGl0ZW0gIT0gTlVMTCkgewotICAgICAgaWYgKGl0ZW0tPmVuZCgpID09IF90YXJnZXQpIHsKKyAgICAgIGlmIChpdGVtLT5lbmQoKSA9PSAodWludHB0cl90KikgX3RhcmdldCkgewogICAgICAgICBfZm91bmQgPSBpdGVtOwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgIH0KQEAgLTEwMjEsMjIgKzEwNDksMjIgQEAKICAgICB9CiAgICAgcmV0dXJuIGZhbHNlOwogICB9Ci0gIENodW5rKiBmb3VuZCgpIHsgcmV0dXJuIF9mb3VuZDsgfQorICBDaHVua190KiBmb3VuZCgpIHsgcmV0dXJuIF9mb3VuZDsgfQogfTsKIAotdGVtcGxhdGUgPGNsYXNzIENodW5rPgotQ2h1bmsqIEJpbmFyeVRyZWVEaWN0aW9uYXJ5PENodW5rPjo6ZmluZF9jaHVua19lbmRzX2F0KEhlYXBXb3JkKiB0YXJnZXQpIGNvbnN0IHsKLSAgRW5kVHJlZVNlYXJjaENsb3N1cmU8Q2h1bms+IGV0c2ModGFyZ2V0KTsKK3RlbXBsYXRlIDxjbGFzcyBDaHVua190LCB0ZW1wbGF0ZSA8Y2xhc3M+IGNsYXNzIEZyZWVMaXN0X3Q+CitDaHVua190KiBCaW5hcnlUcmVlRGljdGlvbmFyeTxDaHVua190LCBGcmVlTGlzdF90Pjo6ZmluZF9jaHVua19lbmRzX2F0KEhlYXBXb3JkKiB0YXJnZXQpIGNvbnN0IHsKKyAgRW5kVHJlZVNlYXJjaENsb3N1cmU8Q2h1bmtfdCwgRnJlZUxpc3RfdD4gZXRzYyh0YXJnZXQpOwogICBib29sIGZvdW5kX3RhcmdldCA9IGV0c2MuZG9fdHJlZShyb290KCkpOwogICBhc3NlcnQoZm91bmRfdGFyZ2V0IHx8IGV0c2MuZm91bmQoKSA9PSBOVUxMLCAiQ29uc2lzdGVuY3kgY2hlY2siKTsKICAgYXNzZXJ0KCFmb3VuZF90YXJnZXQgfHwgZXRzYy5mb3VuZCgpICE9IE5VTEwsICJDb25zaXN0ZW5jeSBjaGVjayIpOwogICByZXR1cm4gZXRzYy5mb3VuZCgpOwogfQogCi10ZW1wbGF0ZSA8Y2xhc3MgQ2h1bms+Ci12b2lkIEJpbmFyeVRyZWVEaWN0aW9uYXJ5PENodW5rPjo6YmVnaW5fc3dlZXBfZGljdF9jZW5zdXMoZG91YmxlIGNvYWxTdXJwbHVzUGVyY2VudCwKK3RlbXBsYXRlIDxjbGFzcyBDaHVua190LCB0ZW1wbGF0ZSA8Y2xhc3M+IGNsYXNzIEZyZWVMaXN0X3Q+Cit2b2lkIEJpbmFyeVRyZWVEaWN0aW9uYXJ5PENodW5rX3QsIEZyZWVMaXN0X3Q+OjpiZWdpbl9zd2VlcF9kaWN0X2NlbnN1cyhkb3VibGUgY29hbFN1cnBsdXNQZXJjZW50LAogICBmbG9hdCBpbnRlcl9zd2VlcF9jdXJyZW50LCBmbG9hdCBpbnRlcl9zd2VlcF9lc3RpbWF0ZSwgZmxvYXQgaW50cmFfc3dlZXBfZXN0aW1hdGUpIHsKLSAgQmVnaW5Td2VlcENsb3N1cmU8Q2h1bms+IGJzYyhjb2FsU3VycGx1c1BlcmNlbnQsIGludGVyX3N3ZWVwX2N1cnJlbnQsCisgIEJlZ2luU3dlZXBDbG9zdXJlPENodW5rX3QsIEZyZWVMaXN0X3Q+IGJzYyhjb2FsU3VycGx1c1BlcmNlbnQsIGludGVyX3N3ZWVwX2N1cnJlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyX3N3ZWVwX2VzdGltYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRyYV9zd2VlcF9lc3RpbWF0ZSk7CiAgIGJzYy5kb190cmVlKHJvb3QoKSk7CkBAIC0xMDQ1LDg0ICsxMDczLDkxIEBACiAvLyBDbG9zdXJlcyBhbmQgbWV0aG9kcyBmb3IgY2FsY3VsYXRpbmcgdG90YWwgYnl0ZXMgcmV0dXJuZWQgdG8gdGhlCiAvLyBmcmVlIGxpc3RzIGluIHRoZSB0cmVlLgogI2lmbmRlZiBQUk9EVUNUCi10ZW1wbGF0ZSA8Y2xhc3MgQ2h1bms+Ci1jbGFzcyBJbml0aWFsaXplRGljdFJldHVybmVkQnl0ZXNDbG9zdXJlIDogcHVibGljIEFzY2VuZFRyZWVDZW5zdXNDbG9zdXJlPENodW5rPiB7Cit0ZW1wbGF0ZSA8Y2xhc3MgQ2h1bmtfdCwgdGVtcGxhdGUgPGNsYXNzPiBjbGFzcyBGcmVlTGlzdF90PgorY2xhc3MgSW5pdGlhbGl6ZURpY3RSZXR1cm5lZEJ5dGVzQ2xvc3VyZSA6IHB1YmxpYyBBc2NlbmRUcmVlQ2Vuc3VzQ2xvc3VyZTxDaHVua190LCBGcmVlTGlzdF90PiB7CiAgICBwdWJsaWM6Ci0gIHZvaWQgZG9fbGlzdChGcmVlTGlzdDxDaHVuaz4qIGZsKSB7CisgIHZvaWQgZG9fbGlzdChGcmVlTGlzdF90PENodW5rX3Q+KiBmbCkgewogICAgIGZsLT5zZXRfcmV0dXJuZWRfYnl0ZXMoMCk7CiAgIH0KIH07CiAKLXRlbXBsYXRlIDxjbGFzcyBDaHVuaz4KLXZvaWQgQmluYXJ5VHJlZURpY3Rpb25hcnk8Q2h1bms+Ojppbml0aWFsaXplX2RpY3RfcmV0dXJuZWRfYnl0ZXMoKSB7Ci0gIEluaXRpYWxpemVEaWN0UmV0dXJuZWRCeXRlc0Nsb3N1cmU8Q2h1bms+IGlkcmI7Cit0ZW1wbGF0ZSA8Y2xhc3MgQ2h1bmtfdCwgdGVtcGxhdGUgPGNsYXNzPiBjbGFzcyBGcmVlTGlzdF90Pgordm9pZCBCaW5hcnlUcmVlRGljdGlvbmFyeTxDaHVua190LCBGcmVlTGlzdF90Pjo6aW5pdGlhbGl6ZV9kaWN0X3JldHVybmVkX2J5dGVzKCkgeworICBJbml0aWFsaXplRGljdFJldHVybmVkQnl0ZXNDbG9zdXJlPENodW5rX3QsIEZyZWVMaXN0X3Q+IGlkcmI7CiAgIGlkcmIuZG9fdHJlZShyb290KCkpOwogfQogCi10ZW1wbGF0ZSA8Y2xhc3MgQ2h1bms+Ci1jbGFzcyBSZXR1cm5lZEJ5dGVzQ2xvc3VyZSA6IHB1YmxpYyBBc2NlbmRUcmVlQ2Vuc3VzQ2xvc3VyZTxDaHVuaz4gewordGVtcGxhdGUgPGNsYXNzIENodW5rX3QsIHRlbXBsYXRlIDxjbGFzcz4gY2xhc3MgRnJlZUxpc3RfdD4KK2NsYXNzIFJldHVybmVkQnl0ZXNDbG9zdXJlIDogcHVibGljIEFzY2VuZFRyZWVDZW5zdXNDbG9zdXJlPENodW5rX3QsIEZyZWVMaXN0X3Q+IHsKICAgc2l6ZV90IF9kaWN0X3JldHVybmVkX2J5dGVzOwogIHB1YmxpYzoKICAgUmV0dXJuZWRCeXRlc0Nsb3N1cmUoKSB7IF9kaWN0X3JldHVybmVkX2J5dGVzID0gMDsgfQotICB2b2lkIGRvX2xpc3QoRnJlZUxpc3Q8Q2h1bms+KiBmbCkgeworICB2b2lkIGRvX2xpc3QoRnJlZUxpc3RfdDxDaHVua190PiogZmwpIHsKICAgICBfZGljdF9yZXR1cm5lZF9ieXRlcyArPSBmbC0+cmV0dXJuZWRfYnl0ZXMoKTsKICAgfQogICBzaXplX3QgZGljdF9yZXR1cm5lZF9ieXRlcygpIHsgcmV0dXJuIF9kaWN0X3JldHVybmVkX2J5dGVzOyB9CiB9OwogCi10ZW1wbGF0ZSA8Y2xhc3MgQ2h1bms+Ci1zaXplX3QgQmluYXJ5VHJlZURpY3Rpb25hcnk8Q2h1bms+OjpzdW1fZGljdF9yZXR1cm5lZF9ieXRlcygpIHsKLSAgUmV0dXJuZWRCeXRlc0Nsb3N1cmU8Q2h1bms+IHJiYzsKK3RlbXBsYXRlIDxjbGFzcyBDaHVua190LCB0ZW1wbGF0ZSA8Y2xhc3M+IGNsYXNzIEZyZWVMaXN0X3Q+CitzaXplX3QgQmluYXJ5VHJlZURpY3Rpb25hcnk8Q2h1bmtfdCwgRnJlZUxpc3RfdD46OnN1bV9kaWN0X3JldHVybmVkX2J5dGVzKCkgeworICBSZXR1cm5lZEJ5dGVzQ2xvc3VyZTxDaHVua190LCBGcmVlTGlzdF90PiByYmM7CiAgIHJiYy5kb190cmVlKHJvb3QoKSk7CiAKICAgcmV0dXJuIHJiYy5kaWN0X3JldHVybmVkX2J5dGVzKCk7CiB9CiAKIC8vIENvdW50IHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgdHJlZS4KLXRlbXBsYXRlIDxjbGFzcyBDaHVuaz4KLWNsYXNzIHRyZWVDb3VudENsb3N1cmUgOiBwdWJsaWMgRGVzY2VuZFRyZWVDZW5zdXNDbG9zdXJlPENodW5rPiB7Cit0ZW1wbGF0ZSA8Y2xhc3MgQ2h1bmtfdCwgdGVtcGxhdGUgPGNsYXNzPiBjbGFzcyBGcmVlTGlzdF90PgorY2xhc3MgdHJlZUNvdW50Q2xvc3VyZSA6IHB1YmxpYyBEZXNjZW5kVHJlZUNlbnN1c0Nsb3N1cmU8Q2h1bmtfdCwgRnJlZUxpc3RfdD4gewogIHB1YmxpYzoKICAgdWludCBjb3VudDsKICAgdHJlZUNvdW50Q2xvc3VyZSh1aW50IGMpIHsgY291bnQgPSBjOyB9Ci0gIHZvaWQgZG9fbGlzdChGcmVlTGlzdDxDaHVuaz4qIGZsKSB7CisgIHZvaWQgZG9fbGlzdChGcmVlTGlzdF90PENodW5rX3Q+KiBmbCkgewogICAgIGNvdW50Kys7CiAgIH0KIH07CiAKLXRlbXBsYXRlIDxjbGFzcyBDaHVuaz4KLXNpemVfdCBCaW5hcnlUcmVlRGljdGlvbmFyeTxDaHVuaz46OnRvdGFsX2NvdW50KCkgewotICB0cmVlQ291bnRDbG9zdXJlPENodW5rPiBjdGMoMCk7Cit0ZW1wbGF0ZSA8Y2xhc3MgQ2h1bmtfdCwgdGVtcGxhdGUgPGNsYXNzPiBjbGFzcyBGcmVlTGlzdF90Pgorc2l6ZV90IEJpbmFyeVRyZWVEaWN0aW9uYXJ5PENodW5rX3QsIEZyZWVMaXN0X3Q+Ojp0b3RhbF9jb3VudCgpIHsKKyAgdHJlZUNvdW50Q2xvc3VyZTxDaHVua190LCBGcmVlTGlzdF90PiBjdGMoMCk7CiAgIGN0Yy5kb190cmVlKHJvb3QoKSk7CiAgIHJldHVybiBjdGMuY291bnQ7CiB9CiAjZW5kaWYgLy8gUFJPRFVDVAogCiAvLyBDYWxjdWxhdGUgc3VycGx1c2VzIGZvciB0aGUgbGlzdHMgaW4gdGhlIHRyZWUuCi10ZW1wbGF0ZSA8Y2xhc3MgQ2h1bms+Ci1jbGFzcyBzZXRUcmVlU3VycGx1c0Nsb3N1cmUgOiBwdWJsaWMgQXNjZW5kVHJlZUNlbnN1c0Nsb3N1cmU8Q2h1bms+IHsKK3RlbXBsYXRlIDxjbGFzcyBDaHVua190LCB0ZW1wbGF0ZSA8Y2xhc3M+IGNsYXNzIEZyZWVMaXN0X3Q+CitjbGFzcyBzZXRUcmVlU3VycGx1c0Nsb3N1cmUgOiBwdWJsaWMgQXNjZW5kVHJlZUNlbnN1c0Nsb3N1cmU8Q2h1bmtfdCwgRnJlZUxpc3RfdD4gewogICBkb3VibGUgcGVyY2VudGFnZTsKICBwdWJsaWM6CiAgIHNldFRyZWVTdXJwbHVzQ2xvc3VyZShkb3VibGUgdikgeyBwZXJjZW50YWdlID0gdjsgfQotICB2b2lkIGRvX2xpc3QoRnJlZUxpc3Q8Q2h1bms+KiBmbCkgeworICB2b2lkIGRvX2xpc3QoRnJlZUxpc3Q8Q2h1bmtfdD4qIGZsKSB7fQorCisjaWZuZGVmIFNFUklBTEdDCisgIHZvaWQgZG9fbGlzdChBZGFwdGl2ZUZyZWVMaXN0PENodW5rX3Q+KiBmbCkgewogICAgIGRvdWJsZSBzcGxpdFN1cnBsdXNQZXJjZW50ID0gcGVyY2VudGFnZTsKICAgICBmbC0+c2V0X3N1cnBsdXMoZmwtPmNvdW50KCkgLQogICAgICAgICAgICAgICAgICAgIChzc2l6ZV90KSgoZG91YmxlKWZsLT5kZXNpcmVkKCkgKiBzcGxpdFN1cnBsdXNQZXJjZW50KSk7CiAgIH0KKyNlbmRpZiAvLyBTRVJJQUxHQwogfTsKIAotdGVtcGxhdGUgPGNsYXNzIENodW5rPgotdm9pZCBCaW5hcnlUcmVlRGljdGlvbmFyeTxDaHVuaz46OnNldF90cmVlX3N1cnBsdXMoZG91YmxlIHNwbGl0U3VycGx1c1BlcmNlbnQpIHsKLSAgc2V0VHJlZVN1cnBsdXNDbG9zdXJlPENodW5rPiBzdHMoc3BsaXRTdXJwbHVzUGVyY2VudCk7Cit0ZW1wbGF0ZSA8Y2xhc3MgQ2h1bmtfdCwgdGVtcGxhdGUgPGNsYXNzPiBjbGFzcyBGcmVlTGlzdF90Pgordm9pZCBCaW5hcnlUcmVlRGljdGlvbmFyeTxDaHVua190LCBGcmVlTGlzdF90Pjo6c2V0X3RyZWVfc3VycGx1cyhkb3VibGUgc3BsaXRTdXJwbHVzUGVyY2VudCkgeworICBzZXRUcmVlU3VycGx1c0Nsb3N1cmU8Q2h1bmtfdCwgRnJlZUxpc3RfdD4gc3RzKHNwbGl0U3VycGx1c1BlcmNlbnQpOwogICBzdHMuZG9fdHJlZShyb290KCkpOwogfQogCiAvLyBTZXQgaGludHMgZm9yIHRoZSBsaXN0cyBpbiB0aGUgdHJlZS4KLXRlbXBsYXRlIDxjbGFzcyBDaHVuaz4KLWNsYXNzIHNldFRyZWVIaW50c0Nsb3N1cmUgOiBwdWJsaWMgRGVzY2VuZFRyZWVDZW5zdXNDbG9zdXJlPENodW5rPiB7Cit0ZW1wbGF0ZSA8Y2xhc3MgQ2h1bmtfdCwgdGVtcGxhdGUgPGNsYXNzPiBjbGFzcyBGcmVlTGlzdF90PgorY2xhc3Mgc2V0VHJlZUhpbnRzQ2xvc3VyZSA6IHB1YmxpYyBEZXNjZW5kVHJlZUNlbnN1c0Nsb3N1cmU8Q2h1bmtfdCwgRnJlZUxpc3RfdD4gewogICBzaXplX3QgaGludDsKICBwdWJsaWM6CiAgIHNldFRyZWVIaW50c0Nsb3N1cmUoc2l6ZV90IHYpIHsgaGludCA9IHY7IH0KLSAgdm9pZCBkb19saXN0KEZyZWVMaXN0PENodW5rPiogZmwpIHsKKyAgdm9pZCBkb19saXN0KEZyZWVMaXN0PENodW5rX3Q+KiBmbCkge30KKworI2lmbmRlZiBTRVJJQUxHQworICB2b2lkIGRvX2xpc3QoQWRhcHRpdmVGcmVlTGlzdDxDaHVua190PiogZmwpIHsKICAgICBmbC0+c2V0X2hpbnQoaGludCk7CiAgICAgYXNzZXJ0KGZsLT5oaW50KCkgPT0gMCB8fCBmbC0+aGludCgpID4gZmwtPnNpemUoKSwKICAgICAgICJDdXJyZW50IGhpbnQgaXMgaW5jb25zaXN0ZW50Iik7CkBAIC0xMTMwLDM1ICsxMTY1LDQwIEBACiAgICAgICBoaW50ID0gZmwtPnNpemUoKTsKICAgICB9CiAgIH0KKyNlbmRpZiAvLyBTRVJJQUxHQwogfTsKIAotdGVtcGxhdGUgPGNsYXNzIENodW5rPgotdm9pZCBCaW5hcnlUcmVlRGljdGlvbmFyeTxDaHVuaz46OnNldF90cmVlX2hpbnRzKHZvaWQpIHsKLSAgc2V0VHJlZUhpbnRzQ2xvc3VyZTxDaHVuaz4gc3RoKDApOwordGVtcGxhdGUgPGNsYXNzIENodW5rX3QsIHRlbXBsYXRlIDxjbGFzcz4gY2xhc3MgRnJlZUxpc3RfdD4KK3ZvaWQgQmluYXJ5VHJlZURpY3Rpb25hcnk8Q2h1bmtfdCwgRnJlZUxpc3RfdD46OnNldF90cmVlX2hpbnRzKHZvaWQpIHsKKyAgc2V0VHJlZUhpbnRzQ2xvc3VyZTxDaHVua190LCBGcmVlTGlzdF90PiBzdGgoMCk7CiAgIHN0aC5kb190cmVlKHJvb3QoKSk7CiB9CiAKIC8vIFNhdmUgY291bnQgYmVmb3JlIHByZXZpb3VzIHN3ZWVwIGFuZCBzcGxpdHMgYW5kIGNvYWxlc2Nlcy4KLXRlbXBsYXRlIDxjbGFzcyBDaHVuaz4KLWNsYXNzIGNsZWFyVHJlZUNlbnN1c0Nsb3N1cmUgOiBwdWJsaWMgQXNjZW5kVHJlZUNlbnN1c0Nsb3N1cmU8Q2h1bms+IHsKLSAgdm9pZCBkb19saXN0KEZyZWVMaXN0PENodW5rPiogZmwpIHsKK3RlbXBsYXRlIDxjbGFzcyBDaHVua190LCB0ZW1wbGF0ZSA8Y2xhc3M+IGNsYXNzIEZyZWVMaXN0X3Q+CitjbGFzcyBjbGVhclRyZWVDZW5zdXNDbG9zdXJlIDogcHVibGljIEFzY2VuZFRyZWVDZW5zdXNDbG9zdXJlPENodW5rX3QsIEZyZWVMaXN0X3Q+IHsKKyAgdm9pZCBkb19saXN0KEZyZWVMaXN0PENodW5rX3Q+KiBmbCkge30KKworI2lmbmRlZiBTRVJJQUxHQworICB2b2lkIGRvX2xpc3QoQWRhcHRpdmVGcmVlTGlzdDxDaHVua190PiogZmwpIHsKICAgICBmbC0+c2V0X3ByZXZfc3dlZXAoZmwtPmNvdW50KCkpOwogICAgIGZsLT5zZXRfY29hbF9iaXJ0aHMoMCk7CiAgICAgZmwtPnNldF9jb2FsX2RlYXRocygwKTsKICAgICBmbC0+c2V0X3NwbGl0X2JpcnRocygwKTsKICAgICBmbC0+c2V0X3NwbGl0X2RlYXRocygwKTsKICAgfQorI2VuZGlmICAvLyBTRVJJQUxHQwogfTsKIAotdGVtcGxhdGUgPGNsYXNzIENodW5rPgotdm9pZCBCaW5hcnlUcmVlRGljdGlvbmFyeTxDaHVuaz46OmNsZWFyX3RyZWVfY2Vuc3VzKHZvaWQpIHsKLSAgY2xlYXJUcmVlQ2Vuc3VzQ2xvc3VyZTxDaHVuaz4gY3RjOwordGVtcGxhdGUgPGNsYXNzIENodW5rX3QsIHRlbXBsYXRlIDxjbGFzcz4gY2xhc3MgRnJlZUxpc3RfdD4KK3ZvaWQgQmluYXJ5VHJlZURpY3Rpb25hcnk8Q2h1bmtfdCwgRnJlZUxpc3RfdD46OmNsZWFyX3RyZWVfY2Vuc3VzKHZvaWQpIHsKKyAgY2xlYXJUcmVlQ2Vuc3VzQ2xvc3VyZTxDaHVua190LCBGcmVlTGlzdF90PiBjdGM7CiAgIGN0Yy5kb190cmVlKHJvb3QoKSk7CiB9CiAKIC8vIERvIHJlcG9ydGluZyBhbmQgcG9zdCBzd2VlcCBjbGVhbiB1cC4KLXRlbXBsYXRlIDxjbGFzcyBDaHVuaz4KLXZvaWQgQmluYXJ5VHJlZURpY3Rpb25hcnk8Q2h1bms+OjplbmRfc3dlZXBfZGljdF9jZW5zdXMoZG91YmxlIHNwbGl0U3VycGx1c1BlcmNlbnQpIHsKK3RlbXBsYXRlIDxjbGFzcyBDaHVua190LCB0ZW1wbGF0ZSA8Y2xhc3M+IGNsYXNzIEZyZWVMaXN0X3Q+Cit2b2lkIEJpbmFyeVRyZWVEaWN0aW9uYXJ5PENodW5rX3QsIEZyZWVMaXN0X3Q+OjplbmRfc3dlZXBfZGljdF9jZW5zdXMoZG91YmxlIHNwbGl0U3VycGx1c1BlcmNlbnQpIHsKICAgLy8gRG9lcyB3YWxraW5nIHRoZSB0cmVlIDMgdGltZXMgaHVydD8KICAgc2V0X3RyZWVfc3VycGx1cyhzcGxpdFN1cnBsdXNQZXJjZW50KTsKICAgc2V0X3RyZWVfaGludHMoKTsKQEAgLTExNjksOSArMTIwOSw5IEBACiB9CiAKIC8vIFByaW50IHN1bW1hcnkgc3RhdGlzdGljcwotdGVtcGxhdGUgPGNsYXNzIENodW5rPgotdm9pZCBCaW5hcnlUcmVlRGljdGlvbmFyeTxDaHVuaz46OnJlcG9ydF9zdGF0aXN0aWNzKCkgY29uc3QgewotICBGcmVlQmxvY2tEaWN0aW9uYXJ5PENodW5rPjo6dmVyaWZ5X3Bhcl9sb2NrZWQoKTsKK3RlbXBsYXRlIDxjbGFzcyBDaHVua190LCB0ZW1wbGF0ZSA8Y2xhc3M+IGNsYXNzIEZyZWVMaXN0X3Q+Cit2b2lkIEJpbmFyeVRyZWVEaWN0aW9uYXJ5PENodW5rX3QsIEZyZWVMaXN0X3Q+OjpyZXBvcnRfc3RhdGlzdGljcygpIGNvbnN0IHsKKyAgRnJlZUJsb2NrRGljdGlvbmFyeTxDaHVua190Pjo6dmVyaWZ5X3Bhcl9sb2NrZWQoKTsKICAgZ2Nsb2dfb3JfdHR5LT5wcmludCgiU3RhdGlzdGljcyBmb3IgQmluYXJ5VHJlZURpY3Rpb25hcnk6XG4iCiAgICAgICAgICAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKICAgc2l6ZV90IHRvdGFsX3NpemUgPSB0b3RhbF9jaHVua19zaXplKGRlYnVnX29ubHkoTlVMTCkpOwpAQCAtMTE4MiwzNiArMTIyMiw0NyBAQAogICBpZiAoZnJlZV9ibG9ja3MgPiAwKSB7CiAgICAgZ2Nsb2dfb3JfdHR5LT5wcmludCgiQXYuICBCbG9jayAgU2l6ZTogJWRcbiIsIHRvdGFsX3NpemUvZnJlZV9ibG9ja3MpOwogICB9Ci0gIGdjbG9nX29yX3R0eS0+cHJpbnQoIlRyZWUgICAgICBIZWlnaHQ6ICVkXG4iLCB0cmVlSGVpZ2h0KCkpOworICBnY2xvZ19vcl90dHktPnByaW50KCJUcmVlICAgICAgSGVpZ2h0OiAlZFxuIiwgdHJlZV9oZWlnaHQoKSk7CiB9CiAKIC8vIFByaW50IGNlbnN1cyBpbmZvcm1hdGlvbiAtIGNvdW50cywgYmlydGhzLCBkZWF0aHMsIGV0Yy4KIC8vIGZvciBlYWNoIGxpc3QgaW4gdGhlIHRyZWUuICBBbHNvIHByaW50IHNvbWUgc3VtbWFyeQogLy8gaW5mb3JtYXRpb24uCi10ZW1wbGF0ZSA8Y2xhc3MgQ2h1bms+Ci1jbGFzcyBQcmludFRyZWVDZW5zdXNDbG9zdXJlIDogcHVibGljIEFzY2VuZFRyZWVDZW5zdXNDbG9zdXJlPENodW5rPiB7Cit0ZW1wbGF0ZSA8Y2xhc3MgQ2h1bmtfdCwgdGVtcGxhdGUgPGNsYXNzPiBjbGFzcyBGcmVlTGlzdF90PgorY2xhc3MgUHJpbnRUcmVlQ2Vuc3VzQ2xvc3VyZSA6IHB1YmxpYyBBc2NlbmRUcmVlQ2Vuc3VzQ2xvc3VyZTxDaHVua190LCBGcmVlTGlzdF90PiB7CiAgIGludCBfcHJpbnRfbGluZTsKICAgc2l6ZV90IF90b3RhbF9mcmVlOwotICBGcmVlTGlzdDxDaHVuaz4gX3RvdGFsOworICBGcmVlTGlzdF90PENodW5rX3Q+IF90b3RhbDsKIAogIHB1YmxpYzoKICAgUHJpbnRUcmVlQ2Vuc3VzQ2xvc3VyZSgpIHsKICAgICBfcHJpbnRfbGluZSA9IDA7CiAgICAgX3RvdGFsX2ZyZWUgPSAwOwogICB9Ci0gIEZyZWVMaXN0PENodW5rPiogdG90YWwoKSB7IHJldHVybiAmX3RvdGFsOyB9CisgIEZyZWVMaXN0X3Q8Q2h1bmtfdD4qIHRvdGFsKCkgeyByZXR1cm4gJl90b3RhbDsgfQogICBzaXplX3QgdG90YWxfZnJlZSgpIHsgcmV0dXJuIF90b3RhbF9mcmVlOyB9Ci0gIHZvaWQgZG9fbGlzdChGcmVlTGlzdDxDaHVuaz4qIGZsKSB7CisgIHZvaWQgZG9fbGlzdChGcmVlTGlzdDxDaHVua190PiogZmwpIHsKICAgICBpZiAoKytfcHJpbnRfbGluZSA+PSA0MCkgewotICAgICAgRnJlZUxpc3Q8Q2h1bms+OjpwcmludF9sYWJlbHNfb24oZ2Nsb2dfb3JfdHR5LCAic2l6ZSIpOworICAgICAgRnJlZUxpc3RfdDxDaHVua190Pjo6cHJpbnRfbGFiZWxzX29uKGdjbG9nX29yX3R0eSwgInNpemUiKTsKICAgICAgIF9wcmludF9saW5lID0gMDsKICAgICB9CiAgICAgZmwtPnByaW50X29uKGdjbG9nX29yX3R0eSk7CiAgICAgX3RvdGFsX2ZyZWUgKz0gICAgICAgICAgICBmbC0+Y291bnQoKSAgICAgICAgICAgICogZmwtPnNpemUoKSAgICAgICAgOwogICAgIHRvdGFsKCktPnNldF9jb3VudCggICAgICB0b3RhbCgpLT5jb3VudCgpICAgICAgICsgZmwtPmNvdW50KCkgICAgICApOwotICAgIHRvdGFsKCktPnNldF9iZnJfc3VycCggICAgdG90YWwoKS0+YmZyX3N1cnAoKSAgICAgKyBmbC0+YmZyX3N1cnAoKSAgICApOworICB9CisKKyNpZm5kZWYgU0VSSUFMR0MKKyAgdm9pZCBkb19saXN0KEFkYXB0aXZlRnJlZUxpc3Q8Q2h1bmtfdD4qIGZsKSB7CisgICAgaWYgKCsrX3ByaW50X2xpbmUgPj0gNDApIHsKKyAgICAgIEZyZWVMaXN0X3Q8Q2h1bmtfdD46OnByaW50X2xhYmVsc19vbihnY2xvZ19vcl90dHksICJzaXplIik7CisgICAgICBfcHJpbnRfbGluZSA9IDA7CisgICAgfQorICAgIGZsLT5wcmludF9vbihnY2xvZ19vcl90dHkpOworICAgIF90b3RhbF9mcmVlICs9ICAgICAgICAgICBmbC0+Y291bnQoKSAgICAgICAgICAgICAqIGZsLT5zaXplKCkgICAgICAgIDsKKyAgICB0b3RhbCgpLT5zZXRfY291bnQoICAgICAgdG90YWwoKS0+Y291bnQoKSAgICAgICAgKyBmbC0+Y291bnQoKSAgICAgICk7CisgICAgdG90YWwoKS0+c2V0X2Jmcl9zdXJwKCAgIHRvdGFsKCktPmJmcl9zdXJwKCkgICAgICsgZmwtPmJmcl9zdXJwKCkgICAgKTsKICAgICB0b3RhbCgpLT5zZXRfc3VycGx1cyggICAgdG90YWwoKS0+c3BsaXRfZGVhdGhzKCkgKyBmbC0+c3VycGx1cygpICAgICk7Ci0gICAgdG90YWwoKS0+c2V0X2Rlc2lyZWQoICAgIHRvdGFsKCktPmRlc2lyZWQoKSAgICAgKyBmbC0+ZGVzaXJlZCgpICAgICk7CisgICAgdG90YWwoKS0+c2V0X2Rlc2lyZWQoICAgIHRvdGFsKCktPmRlc2lyZWQoKSAgICAgICsgZmwtPmRlc2lyZWQoKSAgICApOwogICAgIHRvdGFsKCktPnNldF9wcmV2X3N3ZWVwKCAgdG90YWwoKS0+cHJldl9zd2VlcCgpICAgKyBmbC0+cHJldl9zd2VlcCgpICApOwogICAgIHRvdGFsKCktPnNldF9iZWZvcmVfc3dlZXAodG90YWwoKS0+YmVmb3JlX3N3ZWVwKCkgKyBmbC0+YmVmb3JlX3N3ZWVwKCkpOwogICAgIHRvdGFsKCktPnNldF9jb2FsX2JpcnRocyggdG90YWwoKS0+Y29hbF9iaXJ0aHMoKSAgKyBmbC0+Y29hbF9iaXJ0aHMoKSApOwpAQCAtMTIxOSwxOCArMTI3MCwzMiBAQAogICAgIHRvdGFsKCktPnNldF9zcGxpdF9iaXJ0aHModG90YWwoKS0+c3BsaXRfYmlydGhzKCkgKyBmbC0+c3BsaXRfYmlydGhzKCkpOwogICAgIHRvdGFsKCktPnNldF9zcGxpdF9kZWF0aHModG90YWwoKS0+c3BsaXRfZGVhdGhzKCkgKyBmbC0+c3BsaXRfZGVhdGhzKCkpOwogICB9CisjZW5kaWYgIC8vIFNFUklBTEdDCiB9OwogCi10ZW1wbGF0ZSA8Y2xhc3MgQ2h1bms+Ci12b2lkIEJpbmFyeVRyZWVEaWN0aW9uYXJ5PENodW5rPjo6cHJpbnRfZGljdF9jZW5zdXModm9pZCkgY29uc3QgewordGVtcGxhdGUgPGNsYXNzIENodW5rX3QsIHRlbXBsYXRlIDxjbGFzcz4gY2xhc3MgRnJlZUxpc3RfdD4KK3ZvaWQgQmluYXJ5VHJlZURpY3Rpb25hcnk8Q2h1bmtfdCwgRnJlZUxpc3RfdD46OnByaW50X2RpY3RfY2Vuc3VzKHZvaWQpIGNvbnN0IHsKIAogICBnY2xvZ19vcl90dHktPnByaW50KCJcbkJpbmFyeVRyZWVcbiIpOwotICBGcmVlTGlzdDxDaHVuaz46OnByaW50X2xhYmVsc19vbihnY2xvZ19vcl90dHksICJzaXplIik7Ci0gIFByaW50VHJlZUNlbnN1c0Nsb3N1cmU8Q2h1bms+IHB0YzsKKyAgRnJlZUxpc3RfdDxDaHVua190Pjo6cHJpbnRfbGFiZWxzX29uKGdjbG9nX29yX3R0eSwgInNpemUiKTsKKyAgUHJpbnRUcmVlQ2Vuc3VzQ2xvc3VyZTxDaHVua190LCBGcmVlTGlzdF90PiBwdGM7CiAgIHB0Yy5kb190cmVlKHJvb3QoKSk7CiAKLSAgRnJlZUxpc3Q8Q2h1bms+KiB0b3RhbCA9IHB0Yy50b3RhbCgpOwotICBGcmVlTGlzdDxDaHVuaz46OnByaW50X2xhYmVsc19vbihnY2xvZ19vcl90dHksICIgIik7CisgIEZyZWVMaXN0X3Q8Q2h1bmtfdD4qIHRvdGFsID0gcHRjLnRvdGFsKCk7CisgIEZyZWVMaXN0X3Q8Q2h1bmtfdD46OnByaW50X2xhYmVsc19vbihnY2xvZ19vcl90dHksICIgIik7Cit9CisKKyNpZm5kZWYgU0VSSUFMR0MKK3RlbXBsYXRlIDw+Cit2b2lkIEJpbmFyeVRyZWVEaWN0aW9uYXJ5PEZyZWVDaHVuaywgQWRhcHRpdmVGcmVlTGlzdD46OnByaW50X2RpY3RfY2Vuc3VzKHZvaWQpIGNvbnN0IHsKKworICBnY2xvZ19vcl90dHktPnByaW50KCJcbkJpbmFyeVRyZWVcbiIpOworICBBZGFwdGl2ZUZyZWVMaXN0PEZyZWVDaHVuaz46OnByaW50X2xhYmVsc19vbihnY2xvZ19vcl90dHksICJzaXplIik7CisgIFByaW50VHJlZUNlbnN1c0Nsb3N1cmU8RnJlZUNodW5rLCBBZGFwdGl2ZUZyZWVMaXN0PiBwdGM7CisgIHB0Yy5kb190cmVlKHJvb3QoKSk7CisKKyAgQWRhcHRpdmVGcmVlTGlzdDxGcmVlQ2h1bms+KiB0b3RhbCA9IHB0Yy50b3RhbCgpOworICBBZGFwdGl2ZUZyZWVMaXN0PEZyZWVDaHVuaz46OnByaW50X2xhYmVsc19vbihnY2xvZ19vcl90dHksICIgIik7CiAgIHRvdGFsLT5wcmludF9vbihnY2xvZ19vcl90dHksICJUT1RBTFx0Iik7CiAgIGdjbG9nX29yX3R0eS0+cHJpbnQoCiAgICAgICAgICAgICAgICJ0b3RhbF9mcmVlKHdvcmRzKTogIiBTSVpFX0ZPUk1BVF9XKDE2KQpAQCAtMTI0Miw5ICsxMzA3LDEwIEBACiAgICAgICAgICAgICAgKGRvdWJsZSkodG90YWwtPmRlc2lyZWQoKSAtIHRvdGFsLT5jb3VudCgpKQogICAgICAgICAgICAgIC8odG90YWwtPmRlc2lyZWQoKSAhPSAwID8gKGRvdWJsZSl0b3RhbC0+ZGVzaXJlZCgpIDogMS4wKSk7CiB9CisjZW5kaWYgIC8vIFNFUklBTEdDCiAKLXRlbXBsYXRlIDxjbGFzcyBDaHVuaz4KLWNsYXNzIFByaW50RnJlZUxpc3RzQ2xvc3VyZSA6IHB1YmxpYyBBc2NlbmRUcmVlQ2Vuc3VzQ2xvc3VyZTxDaHVuaz4gewordGVtcGxhdGUgPGNsYXNzIENodW5rX3QsIHRlbXBsYXRlIDxjbGFzcz4gY2xhc3MgRnJlZUxpc3RfdD4KK2NsYXNzIFByaW50RnJlZUxpc3RzQ2xvc3VyZSA6IHB1YmxpYyBBc2NlbmRUcmVlQ2Vuc3VzQ2xvc3VyZTxDaHVua190LCBGcmVlTGlzdF90PiB7CiAgIG91dHB1dFN0cmVhbSogX3N0OwogICBpbnQgX3ByaW50X2xpbmU7CiAKQEAgLTEyNTMsMTQgKzEzMTksMTQgQEAKICAgICBfc3QgPSBzdDsKICAgICBfcHJpbnRfbGluZSA9IDA7CiAgIH0KLSAgdm9pZCBkb19saXN0KEZyZWVMaXN0PENodW5rPiogZmwpIHsKKyAgdm9pZCBkb19saXN0KEZyZWVMaXN0X3Q8Q2h1bmtfdD4qIGZsKSB7CiAgICAgaWYgKCsrX3ByaW50X2xpbmUgPj0gNDApIHsKLSAgICAgIEZyZWVMaXN0PENodW5rPjo6cHJpbnRfbGFiZWxzX29uKF9zdCwgInNpemUiKTsKKyAgICAgIEZyZWVMaXN0X3Q8Q2h1bmtfdD46OnByaW50X2xhYmVsc19vbihfc3QsICJzaXplIik7CiAgICAgICBfcHJpbnRfbGluZSA9IDA7CiAgICAgfQogICAgIGZsLT5wcmludF9vbihnY2xvZ19vcl90dHkpOwogICAgIHNpemVfdCBzeiA9IGZsLT5zaXplKCk7Ci0gICAgZm9yIChDaHVuayogZmMgPSBmbC0+aGVhZCgpOyBmYyAhPSBOVUxMOworICAgIGZvciAoQ2h1bmtfdCogZmMgPSBmbC0+aGVhZCgpOyBmYyAhPSBOVUxMOwogICAgICAgICAgZmMgPSBmYy0+bmV4dCgpKSB7CiAgICAgICBfc3QtPnByaW50X2NyKCJcdFsiIFBUUl9GT1JNQVQgIiwiIFBUUl9GT1JNQVQgIikgICVzIiwKICAgICAgICAgICAgICAgICAgICAgZmMsIChIZWFwV29yZCopZmMgKyBzeiwKQEAgLTEyNjksMTEgKzEzMzUsMTEgQEAKICAgfQogfTsKIAotdGVtcGxhdGUgPGNsYXNzIENodW5rPgotdm9pZCBCaW5hcnlUcmVlRGljdGlvbmFyeTxDaHVuaz46OnByaW50X2ZyZWVfbGlzdHMob3V0cHV0U3RyZWFtKiBzdCkgY29uc3QgewordGVtcGxhdGUgPGNsYXNzIENodW5rX3QsIHRlbXBsYXRlIDxjbGFzcz4gY2xhc3MgRnJlZUxpc3RfdD4KK3ZvaWQgQmluYXJ5VHJlZURpY3Rpb25hcnk8Q2h1bmtfdCwgRnJlZUxpc3RfdD46OnByaW50X2ZyZWVfbGlzdHMob3V0cHV0U3RyZWFtKiBzdCkgY29uc3QgewogCi0gIEZyZWVMaXN0PENodW5rPjo6cHJpbnRfbGFiZWxzX29uKHN0LCAic2l6ZSIpOwotICBQcmludEZyZWVMaXN0c0Nsb3N1cmU8Q2h1bms+IHBmbGMoc3QpOworICBGcmVlTGlzdF90PENodW5rX3Q+OjpwcmludF9sYWJlbHNfb24oc3QsICJzaXplIik7CisgIFByaW50RnJlZUxpc3RzQ2xvc3VyZTxDaHVua190LCBGcmVlTGlzdF90PiBwZmxjKHN0KTsKICAgcGZsYy5kb190cmVlKHJvb3QoKSk7CiB9CiAKQEAgLTEyODEsMTggKzEzNDcsMTggQEAKIC8vIC4gX3Jvb3QgaGFzIG5vIHBhcmVudAogLy8gLiBwYXJlbnQgYW5kIGNoaWxkIHBvaW50IHRvIGVhY2ggb3RoZXIKIC8vIC4gZWFjaCBub2RlJ3Mga2V5IGNvcnJlY3RseSByZWxhdGVkIHRvIHRoYXQgb2YgaXRzIGNoaWxkKHJlbikKLXRlbXBsYXRlIDxjbGFzcyBDaHVuaz4KLXZvaWQgQmluYXJ5VHJlZURpY3Rpb25hcnk8Q2h1bms+Ojp2ZXJpZnlfdHJlZSgpIGNvbnN0IHsKK3RlbXBsYXRlIDxjbGFzcyBDaHVua190LCB0ZW1wbGF0ZSA8Y2xhc3M+IGNsYXNzIEZyZWVMaXN0X3Q+Cit2b2lkIEJpbmFyeVRyZWVEaWN0aW9uYXJ5PENodW5rX3QsIEZyZWVMaXN0X3Q+Ojp2ZXJpZnlfdHJlZSgpIGNvbnN0IHsKICAgZ3VhcmFudGVlKHJvb3QoKSA9PSBOVUxMIHx8IHRvdGFsX2ZyZWVfYmxvY2tzKCkgPT0gMCB8fAogICAgIHRvdGFsX3NpemUoKSAhPSAwLCAiX3RvdGFsX3NpemUgc2hvdWxkJ3QgYmUgMD8iKTsKICAgZ3VhcmFudGVlKHJvb3QoKSA9PSBOVUxMIHx8IHJvb3QoKS0+cGFyZW50KCkgPT0gTlVMTCwgIl9yb290IHNob3VsZG4ndCBoYXZlIHBhcmVudCIpOwogICB2ZXJpZnlfdHJlZV9oZWxwZXIocm9vdCgpKTsKIH0KIAotdGVtcGxhdGUgPGNsYXNzIENodW5rPgotc2l6ZV90IEJpbmFyeVRyZWVEaWN0aW9uYXJ5PENodW5rPjo6dmVyaWZ5X3ByZXZfZnJlZV9wdHJzKFRyZWVMaXN0PENodW5rPiogdGwpIHsKK3RlbXBsYXRlIDxjbGFzcyBDaHVua190LCB0ZW1wbGF0ZSA8Y2xhc3M+IGNsYXNzIEZyZWVMaXN0X3Q+CitzaXplX3QgQmluYXJ5VHJlZURpY3Rpb25hcnk8Q2h1bmtfdCwgRnJlZUxpc3RfdD46OnZlcmlmeV9wcmV2X2ZyZWVfcHRycyhUcmVlTGlzdDxDaHVua190LCBGcmVlTGlzdF90PiogdGwpIHsKICAgc2l6ZV90IGN0ID0gMDsKLSAgZm9yIChDaHVuayogY3VyRkMgPSB0bC0+aGVhZCgpOyBjdXJGQyAhPSBOVUxMOyBjdXJGQyA9IGN1ckZDLT5uZXh0KCkpIHsKKyAgZm9yIChDaHVua190KiBjdXJGQyA9IHRsLT5oZWFkKCk7IGN1ckZDICE9IE5VTEw7IGN1ckZDID0gY3VyRkMtPm5leHQoKSkgewogICAgIGN0Kys7CiAgICAgYXNzZXJ0KGN1ckZDLT5wcmV2KCkgPT0gTlVMTCB8fCBjdXJGQy0+cHJldigpLT5pc19mcmVlKCksCiAgICAgICAiQ2h1bmsgc2hvdWxkIGJlIGZyZWUiKTsKQEAgLTEzMDMsOCArMTM2OSw4IEBACiAvLyBOb3RlOiB0aGlzIGhlbHBlciBpcyByZWN1cnNpdmUgcmF0aGVyIHRoYW4gaXRlcmF0aXZlLCBzbyB1c2Ugd2l0aAogLy8gY2F1dGlvbiBvbiB2ZXJ5IGRlZXAgdHJlZXM7IGFuZCB3YXRjaCBvdXQgZm9yIHN0YWNrIG92ZXJmbG93IGVycm9yczsKIC8vIEluIGdlbmVyYWwsIHRvIGJlIHVzZWQgb25seSBmb3IgZGVidWdnaW5nLgotdGVtcGxhdGUgPGNsYXNzIENodW5rPgotdm9pZCBCaW5hcnlUcmVlRGljdGlvbmFyeTxDaHVuaz46OnZlcmlmeV90cmVlX2hlbHBlcihUcmVlTGlzdDxDaHVuaz4qIHRsKSBjb25zdCB7Cit0ZW1wbGF0ZSA8Y2xhc3MgQ2h1bmtfdCwgdGVtcGxhdGUgPGNsYXNzPiBjbGFzcyBGcmVlTGlzdF90Pgordm9pZCBCaW5hcnlUcmVlRGljdGlvbmFyeTxDaHVua190LCBGcmVlTGlzdF90Pjo6dmVyaWZ5X3RyZWVfaGVscGVyKFRyZWVMaXN0PENodW5rX3QsIEZyZWVMaXN0X3Q+KiB0bCkgY29uc3QgewogICBpZiAodGwgPT0gTlVMTCkKICAgICByZXR1cm47CiAgIGd1YXJhbnRlZSh0bC0+c2l6ZSgpICE9IDAsICJBIGxpc3QgbXVzdCBoYXMgYSBzaXplIik7CkBAIC0xMzMyLDE1ICsxMzk4LDI1IEBACiAgIHZlcmlmeV90cmVlX2hlbHBlcih0bC0+cmlnaHQoKSk7CiB9CiAKLXRlbXBsYXRlIDxjbGFzcyBDaHVuaz4KLXZvaWQgQmluYXJ5VHJlZURpY3Rpb25hcnk8Q2h1bms+Ojp2ZXJpZnkoKSBjb25zdCB7Cit0ZW1wbGF0ZSA8Y2xhc3MgQ2h1bmtfdCwgdGVtcGxhdGUgPGNsYXNzPiBjbGFzcyBGcmVlTGlzdF90Pgordm9pZCBCaW5hcnlUcmVlRGljdGlvbmFyeTxDaHVua190LCBGcmVlTGlzdF90Pjo6dmVyaWZ5KCkgY29uc3QgewogICB2ZXJpZnlfdHJlZSgpOwogICBndWFyYW50ZWUodG90YWxfc2l6ZSgpID09IHRvdGFsX3NpemVfaW5fdHJlZShyb290KCkpLCAiVG90YWwgU2l6ZSBpbmNvbnNpc3RlbmN5Iik7CiB9CiAKK3RlbXBsYXRlIGNsYXNzIFRyZWVMaXN0PE1ldGFibG9jaywgRnJlZUxpc3Q+OwordGVtcGxhdGUgY2xhc3MgQmluYXJ5VHJlZURpY3Rpb25hcnk8TWV0YWJsb2NrLCBGcmVlTGlzdD47Cit0ZW1wbGF0ZSBjbGFzcyBUcmVlQ2h1bms8TWV0YWJsb2NrLCBGcmVlTGlzdD47CisKK3RlbXBsYXRlIGNsYXNzIFRyZWVMaXN0PE1ldGFjaHVuaywgRnJlZUxpc3Q+OwordGVtcGxhdGUgY2xhc3MgQmluYXJ5VHJlZURpY3Rpb25hcnk8TWV0YWNodW5rLCBGcmVlTGlzdD47Cit0ZW1wbGF0ZSBjbGFzcyBUcmVlQ2h1bms8TWV0YWNodW5rLCBGcmVlTGlzdD47CisKKwogI2lmbmRlZiBTRVJJQUxHQwogLy8gRXhwbGljaXRseSBpbnN0YW50aWF0ZSB0aGVzZSB0eXBlcyBmb3IgRnJlZUNodW5rLgotdGVtcGxhdGUgY2xhc3MgQmluYXJ5VHJlZURpY3Rpb25hcnk8RnJlZUNodW5rPjsKLXRlbXBsYXRlIGNsYXNzIFRyZWVDaHVuazxGcmVlQ2h1bms+OwotdGVtcGxhdGUgY2xhc3MgVHJlZUxpc3Q8RnJlZUNodW5rPjsKK3RlbXBsYXRlIGNsYXNzIFRyZWVMaXN0PEZyZWVDaHVuaywgQWRhcHRpdmVGcmVlTGlzdD47Cit0ZW1wbGF0ZSBjbGFzcyBCaW5hcnlUcmVlRGljdGlvbmFyeTxGcmVlQ2h1bmssIEFkYXB0aXZlRnJlZUxpc3Q+OwordGVtcGxhdGUgY2xhc3MgVHJlZUNodW5rPEZyZWVDaHVuaywgQWRhcHRpdmVGcmVlTGlzdD47CisKICNlbmRpZiAvLyBTRVJJQUxHQwpkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vbWVtb3J5L2JpbmFyeVRyZWVEaWN0aW9uYXJ5LmhwcCBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL21lbW9yeS9iaW5hcnlUcmVlRGljdGlvbmFyeS5ocHAKaW5kZXggNGFiNjBjMi4uNzU3ZWI0ZiAxMDA2NDQKLS0tIGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vbWVtb3J5L2JpbmFyeVRyZWVEaWN0aW9uYXJ5LmhwcAorKysgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9tZW1vcnkvYmluYXJ5VHJlZURpY3Rpb25hcnkuaHBwCkBAIC0zNyw3NyArMzcsNzggQEAKIC8vIEEgVHJlZUxpc3QgaXMgYSBGcmVlTGlzdCB3aGljaCBjYW4gYmUgdXNlZCB0byBtYWludGFpbiBhCiAvLyBiaW5hcnkgdHJlZSBvZiBmcmVlIGxpc3RzLgogCi10ZW1wbGF0ZSA8Y2xhc3MgQ2h1bms+IGNsYXNzIFRyZWVDaHVuazsKLXRlbXBsYXRlIDxjbGFzcyBDaHVuaz4gY2xhc3MgQmluYXJ5VHJlZURpY3Rpb25hcnk7Ci10ZW1wbGF0ZSA8Y2xhc3MgQ2h1bms+IGNsYXNzIEFzY2VuZFRyZWVDZW5zdXNDbG9zdXJlOwotdGVtcGxhdGUgPGNsYXNzIENodW5rPiBjbGFzcyBEZXNjZW5kVHJlZUNlbnN1c0Nsb3N1cmU7Ci10ZW1wbGF0ZSA8Y2xhc3MgQ2h1bms+IGNsYXNzIERlc2NlbmRUcmVlU2VhcmNoQ2xvc3VyZTsKK3RlbXBsYXRlIDxjbGFzcyBDaHVua190LCB0ZW1wbGF0ZSA8Y2xhc3M+IGNsYXNzIEZyZWVMaXN0X3Q+IGNsYXNzIFRyZWVDaHVuazsKK3RlbXBsYXRlIDxjbGFzcyBDaHVua190LCB0ZW1wbGF0ZSA8Y2xhc3M+IGNsYXNzIEZyZWVMaXN0X3Q+IGNsYXNzIEJpbmFyeVRyZWVEaWN0aW9uYXJ5OwordGVtcGxhdGUgPGNsYXNzIENodW5rX3QsIHRlbXBsYXRlIDxjbGFzcz4gY2xhc3MgRnJlZUxpc3RfdD4gY2xhc3MgQXNjZW5kVHJlZUNlbnN1c0Nsb3N1cmU7Cit0ZW1wbGF0ZSA8Y2xhc3MgQ2h1bmtfdCwgdGVtcGxhdGUgPGNsYXNzPiBjbGFzcyBGcmVlTGlzdF90PiBjbGFzcyBEZXNjZW5kVHJlZUNlbnN1c0Nsb3N1cmU7Cit0ZW1wbGF0ZSA8Y2xhc3MgQ2h1bmtfdCwgdGVtcGxhdGUgPGNsYXNzPiBjbGFzcyBGcmVlTGlzdF90PiBjbGFzcyBEZXNjZW5kVHJlZVNlYXJjaENsb3N1cmU7CiAKLXRlbXBsYXRlIDxjbGFzcyBDaHVuaz4KLWNsYXNzIFRyZWVMaXN0OiBwdWJsaWMgRnJlZUxpc3Q8Q2h1bms+IHsKLSAgZnJpZW5kIGNsYXNzIFRyZWVDaHVuazxDaHVuaz47Ci0gIGZyaWVuZCBjbGFzcyBCaW5hcnlUcmVlRGljdGlvbmFyeTxDaHVuaz47Ci0gIGZyaWVuZCBjbGFzcyBBc2NlbmRUcmVlQ2Vuc3VzQ2xvc3VyZTxDaHVuaz47Ci0gIGZyaWVuZCBjbGFzcyBEZXNjZW5kVHJlZUNlbnN1c0Nsb3N1cmU8Q2h1bms+OwotICBmcmllbmQgY2xhc3MgRGVzY2VuZFRyZWVTZWFyY2hDbG9zdXJlPENodW5rPjsKK3RlbXBsYXRlIDxjbGFzcyBDaHVua190LCB0ZW1wbGF0ZSA8Y2xhc3M+IGNsYXNzIEZyZWVMaXN0X3Q+CitjbGFzcyBUcmVlTGlzdCA6IHB1YmxpYyBGcmVlTGlzdF90PENodW5rX3Q+IHsKKyAgZnJpZW5kIGNsYXNzIFRyZWVDaHVuazxDaHVua190LCBGcmVlTGlzdF90PjsKKyAgZnJpZW5kIGNsYXNzIEJpbmFyeVRyZWVEaWN0aW9uYXJ5PENodW5rX3QsIEZyZWVMaXN0X3Q+OworICBmcmllbmQgY2xhc3MgQXNjZW5kVHJlZUNlbnN1c0Nsb3N1cmU8Q2h1bmtfdCwgRnJlZUxpc3RfdD47CisgIGZyaWVuZCBjbGFzcyBEZXNjZW5kVHJlZUNlbnN1c0Nsb3N1cmU8Q2h1bmtfdCwgRnJlZUxpc3RfdD47CisgIGZyaWVuZCBjbGFzcyBEZXNjZW5kVHJlZVNlYXJjaENsb3N1cmU8Q2h1bmtfdCwgRnJlZUxpc3RfdD47CiAKLSAgVHJlZUxpc3Q8Q2h1bms+KiBfcGFyZW50OwotICBUcmVlTGlzdDxDaHVuaz4qIF9sZWZ0OwotICBUcmVlTGlzdDxDaHVuaz4qIF9yaWdodDsKKyAgVHJlZUxpc3Q8Q2h1bmtfdCwgRnJlZUxpc3RfdD4qIF9wYXJlbnQ7CisgIFRyZWVMaXN0PENodW5rX3QsIEZyZWVMaXN0X3Q+KiBfbGVmdDsKKyAgVHJlZUxpc3Q8Q2h1bmtfdCwgRnJlZUxpc3RfdD4qIF9yaWdodDsKIAogIHByb3RlY3RlZDoKLSAgVHJlZUxpc3Q8Q2h1bms+KiBwYXJlbnQoKSBjb25zdCB7IHJldHVybiBfcGFyZW50OyB9Ci0gIFRyZWVMaXN0PENodW5rPiogbGVmdCgpICAgY29uc3QgeyByZXR1cm4gX2xlZnQ7ICAgfQotICBUcmVlTGlzdDxDaHVuaz4qIHJpZ2h0KCkgIGNvbnN0IHsgcmV0dXJuIF9yaWdodDsgIH0KIAotICAvLyBFeHBsaWNpdGx5IGltcG9ydCB0aGVzZSBuYW1lcyBpbnRvIG91ciBuYW1lc3BhY2UgdG8gZml4IG5hbWUgbG9va3VwIHdpdGggdGVtcGxhdGVzCi0gIHVzaW5nIEZyZWVMaXN0PENodW5rPjo6aGVhZDsKLSAgdXNpbmcgRnJlZUxpc3Q8Q2h1bms+OjpzZXRfaGVhZDsKKyAgVHJlZUxpc3Q8Q2h1bmtfdCwgRnJlZUxpc3RfdD4qIHBhcmVudCgpIGNvbnN0IHsgcmV0dXJuIF9wYXJlbnQ7IH0KKyAgVHJlZUxpc3Q8Q2h1bmtfdCwgRnJlZUxpc3RfdD4qIGxlZnQoKSAgIGNvbnN0IHsgcmV0dXJuIF9sZWZ0OyAgIH0KKyAgVHJlZUxpc3Q8Q2h1bmtfdCwgRnJlZUxpc3RfdD4qIHJpZ2h0KCkgIGNvbnN0IHsgcmV0dXJuIF9yaWdodDsgIH0KIAotICB1c2luZyBGcmVlTGlzdDxDaHVuaz46OnRhaWw7Ci0gIHVzaW5nIEZyZWVMaXN0PENodW5rPjo6c2V0X3RhaWw7Ci0gIHVzaW5nIEZyZWVMaXN0PENodW5rPjo6bGlua190YWlsOworICAvLyBXcmFwcGVyIG9uIGNhbGwgdG8gYmFzZSBjbGFzcywgdG8gZ2V0IHRoZSB0ZW1wbGF0ZSB0byBjb21waWxlLgorICBDaHVua190KiBoZWFkKCkgY29uc3QgeyByZXR1cm4gRnJlZUxpc3RfdDxDaHVua190Pjo6aGVhZCgpOyB9CisgIENodW5rX3QqIHRhaWwoKSBjb25zdCB7IHJldHVybiBGcmVlTGlzdF90PENodW5rX3Q+Ojp0YWlsKCk7IH0KKyAgdm9pZCBzZXRfaGVhZChDaHVua190KiBoZWFkKSB7IEZyZWVMaXN0X3Q8Q2h1bmtfdD46OnNldF9oZWFkKGhlYWQpOyB9CisgIHZvaWQgc2V0X3RhaWwoQ2h1bmtfdCogdGFpbCkgeyBGcmVlTGlzdF90PENodW5rX3Q+OjpzZXRfdGFpbCh0YWlsKTsgfQogCi0gIHVzaW5nIEZyZWVMaXN0PENodW5rPjo6aW5jcmVtZW50X2NvdW50OwotICBOT1RfUFJPRFVDVCh1c2luZyBGcmVlTGlzdDxDaHVuaz46OmluY3JlbWVudF9yZXR1cm5lZF9ieXRlc19ieTspCi0gIHVzaW5nIEZyZWVMaXN0PENodW5rPjo6dmVyaWZ5X2NodW5rX2luX2ZyZWVfbGlzdDsKLSAgdXNpbmcgRnJlZUxpc3Q8Q2h1bms+OjpzaXplOworICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIEZyZWVMaXN0X3Q8Q2h1bmtfdD46OnNpemUoKTsgfQogCiAgIC8vIEFjY2Vzc29ycyBmb3IgbGlua3MgaW4gdHJlZS4KIAotICB2b2lkIHNldF9sZWZ0KFRyZWVMaXN0PENodW5rPiogdGwpIHsKKyAgdm9pZCBzZXRfbGVmdChUcmVlTGlzdDxDaHVua190LCBGcmVlTGlzdF90PiogdGwpIHsKICAgICBfbGVmdCAgID0gdGw7CiAgICAgaWYgKHRsICE9IE5VTEwpCiAgICAgICB0bC0+c2V0X3BhcmVudCh0aGlzKTsKICAgfQotICB2b2lkIHNldF9yaWdodChUcmVlTGlzdDxDaHVuaz4qIHRsKSB7CisgIHZvaWQgc2V0X3JpZ2h0KFRyZWVMaXN0PENodW5rX3QsIEZyZWVMaXN0X3Q+KiB0bCkgewogICAgIF9yaWdodCAgPSB0bDsKICAgICBpZiAodGwgIT0gTlVMTCkKICAgICAgIHRsLT5zZXRfcGFyZW50KHRoaXMpOwogICB9Ci0gIHZvaWQgc2V0X3BhcmVudChUcmVlTGlzdDxDaHVuaz4qIHRsKSAgeyBfcGFyZW50ID0gdGw7ICAgfQorICB2b2lkIHNldF9wYXJlbnQoVHJlZUxpc3Q8Q2h1bmtfdCwgRnJlZUxpc3RfdD4qIHRsKSAgeyBfcGFyZW50ID0gdGw7ICAgfQogCi0gIHZvaWQgY2xlYXJMZWZ0KCkgICAgICAgICAgICAgICB7IF9sZWZ0ID0gTlVMTDsgICB9CisgIHZvaWQgY2xlYXJfbGVmdCgpICAgICAgICAgICAgICAgeyBfbGVmdCA9IE5VTEw7ICAgfQogICB2b2lkIGNsZWFyX3JpZ2h0KCkgICAgICAgICAgICAgIHsgX3JpZ2h0ID0gTlVMTDsgIH0KICAgdm9pZCBjbGVhcl9wYXJlbnQoKSAgICAgICAgICAgICB7IF9wYXJlbnQgPSBOVUxMOyB9Ci0gIHZvaWQgaW5pdGlhbGl6ZSgpICAgICAgICAgICAgICB7IGNsZWFyTGVmdCgpOyBjbGVhcl9yaWdodCgpLCBjbGVhcl9wYXJlbnQoKTsgfQorICB2b2lkIGluaXRpYWxpemUoKSAgICAgICAgICAgICAgIHsgY2xlYXJfbGVmdCgpOyBjbGVhcl9yaWdodCgpLCBjbGVhcl9wYXJlbnQoKTsgRnJlZUxpc3RfdDxDaHVua190Pjo6aW5pdGlhbGl6ZSgpOyB9CiAKICAgLy8gRm9yIGNvbnN0cnVjdGluZyBhIFRyZWVMaXN0IGZyb20gYSBUcmVlIGNodW5rIG9yCiAgIC8vIGFkZHJlc3MgYW5kIHNpemUuCi0gIHN0YXRpYyBUcmVlTGlzdDxDaHVuaz4qIGFzX1RyZWVMaXN0KFRyZWVDaHVuazxDaHVuaz4qIHRjKTsKLSAgc3RhdGljIFRyZWVMaXN0PENodW5rPiogYXNfVHJlZUxpc3QoSGVhcFdvcmQqIGFkZHIsIHNpemVfdCBzaXplKTsKKyAgVHJlZUxpc3QoKTsKKyAgc3RhdGljIFRyZWVMaXN0PENodW5rX3QsIEZyZWVMaXN0X3Q+KgorICAgICAgICAgIGFzX1RyZWVMaXN0KFRyZWVDaHVuazxDaHVua190LCBGcmVlTGlzdF90PiogdGMpOworICBzdGF0aWMgVHJlZUxpc3Q8Q2h1bmtfdCwgRnJlZUxpc3RfdD4qIGFzX1RyZWVMaXN0KEhlYXBXb3JkKiBhZGRyLCBzaXplX3Qgc2l6ZSk7CiAKICAgLy8gUmV0dXJucyB0aGUgaGVhZCBvZiB0aGUgZnJlZSBsaXN0IGFzIGEgcG9pbnRlciB0byBhIFRyZWVDaHVuay4KLSAgVHJlZUNodW5rPENodW5rPiogaGVhZF9hc19UcmVlQ2h1bmsoKTsKKyAgVHJlZUNodW5rPENodW5rX3QsIEZyZWVMaXN0X3Q+KiBoZWFkX2FzX1RyZWVDaHVuaygpOwogCiAgIC8vIFJldHVybnMgdGhlIGZpcnN0IGF2YWlsYWJsZSBjaHVuayBpbiB0aGUgZnJlZSBsaXN0IGFzIGEgcG9pbnRlcgogICAvLyB0byBhIFRyZWVDaHVuay4KLSAgVHJlZUNodW5rPENodW5rPiogZmlyc3RfYXZhaWxhYmxlKCk7CisgIFRyZWVDaHVuazxDaHVua190LCBGcmVlTGlzdF90PiogZmlyc3RfYXZhaWxhYmxlKCk7CiAKICAgLy8gUmV0dXJucyB0aGUgYmxvY2sgd2l0aCB0aGUgbGFyZ2VzdCBoZWFwIGFkZHJlc3MgYW1vbmdzdAogICAvLyB0aG9zZSBpbiB0aGUgbGlzdCBmb3IgdGhpcyBzaXplOyBwb3RlbnRpYWxseSBzbG93IGFuZCBleHBlbnNpdmUsCiAgIC8vIHVzZSB3aXRoIGNhdXRpb24hCi0gIFRyZWVDaHVuazxDaHVuaz4qIGxhcmdlc3RfYWRkcmVzcygpOworICBUcmVlQ2h1bms8Q2h1bmtfdCwgRnJlZUxpc3RfdD4qIGxhcmdlc3RfYWRkcmVzcygpOworCisgIFRyZWVMaXN0PENodW5rX3QsIEZyZWVMaXN0X3Q+KiBnZXRfYmV0dGVyX2xpc3QoCisgICAgQmluYXJ5VHJlZURpY3Rpb25hcnk8Q2h1bmtfdCwgRnJlZUxpc3RfdD4qIGRpY3Rpb25hcnkpOwogCiAgIC8vIHJlbW92ZV9jaHVua19yZXBsYWNlX2lmX25lZWRlZCgpIHJlbW92ZXMgdGhlIGdpdmVuICJ0YyIgZnJvbSB0aGUgVHJlZUxpc3QuCiAgIC8vIElmICJ0YyIgaXMgdGhlIGZpcnN0IGNodW5rIGluIHRoZSBsaXN0LCBpdCBpcyBhbHNvIHRoZQpAQCAtMTE1LDEwICsxMTYsMTAgQEAKICAgLy8gcmV0dXJucyB0aGUgcG9zc2libHkgcmVwbGFjZWQgVHJlZUxpc3QqIGZvciB0aGUgbm9kZSBpbgogICAvLyB0aGUgdHJlZS4gIEl0IGFsc28gdXBkYXRlcyB0aGUgcGFyZW50IG9mIHRoZSBvcmlnaW5hbAogICAvLyBub2RlIHRvIHBvaW50IHRvIHRoZSBuZXcgbm9kZS4KLSAgVHJlZUxpc3Q8Q2h1bms+KiByZW1vdmVfY2h1bmtfcmVwbGFjZV9pZl9uZWVkZWQoVHJlZUNodW5rPENodW5rPiogdGMpOworICBUcmVlTGlzdDxDaHVua190LCBGcmVlTGlzdF90PiogcmVtb3ZlX2NodW5rX3JlcGxhY2VfaWZfbmVlZGVkKFRyZWVDaHVuazxDaHVua190LCBGcmVlTGlzdF90PiogdGMpOwogICAvLyBTZWUgRnJlZUxpc3QuCi0gIHZvaWQgcmV0dXJuX2NodW5rX2F0X2hlYWQoVHJlZUNodW5rPENodW5rPiogdGMpOwotICB2b2lkIHJldHVybl9jaHVua19hdF90YWlsKFRyZWVDaHVuazxDaHVuaz4qIHRjKTsKKyAgdm9pZCByZXR1cm5fY2h1bmtfYXRfaGVhZChUcmVlQ2h1bms8Q2h1bmtfdCwgRnJlZUxpc3RfdD4qIHRjKTsKKyAgdm9pZCByZXR1cm5fY2h1bmtfYXRfdGFpbChUcmVlQ2h1bms8Q2h1bmtfdCwgRnJlZUxpc3RfdD4qIHRjKTsKIH07CiAKIC8vIEEgVHJlZUNodW5rIGlzIGEgc3ViY2xhc3Mgb2YgYSBDaHVuayB0aGF0IGFkZGl0aW9uYWxseQpAQCAtMTM0LDUyICsxMzUsNTQgQEAKIC8vIG9uIHRoZSBmcmVlIGxpc3QgZm9yIGEgbm9kZSBpbiB0aGUgdHJlZSBhbmQgaXMgb25seSByZW1vdmVkIGlmCiAvLyBpdCBpcyB0aGUgbGFzdCBjaHVuayBvbiB0aGUgZnJlZSBsaXN0LgogCi10ZW1wbGF0ZSA8Y2xhc3MgQ2h1bms+Ci1jbGFzcyBUcmVlQ2h1bmsgOiBwdWJsaWMgQ2h1bmsgewotICBmcmllbmQgY2xhc3MgVHJlZUxpc3Q8Q2h1bms+OwotICBUcmVlTGlzdDxDaHVuaz4qIF9saXN0OwotICBUcmVlTGlzdDxDaHVuaz4gX2VtYmVkZGVkX2xpc3Q7ICAvLyBpZiBub24tbnVsbCwgdGhpcyBjaHVuayBpcyBvbiBfbGlzdAordGVtcGxhdGUgPGNsYXNzIENodW5rX3QsIHRlbXBsYXRlIDxjbGFzcz4gY2xhc3MgRnJlZUxpc3RfdD4KK2NsYXNzIFRyZWVDaHVuayA6IHB1YmxpYyBDaHVua190IHsKKyAgZnJpZW5kIGNsYXNzIFRyZWVMaXN0PENodW5rX3QsIEZyZWVMaXN0X3Q+OworICBUcmVlTGlzdDxDaHVua190LCBGcmVlTGlzdF90PiogX2xpc3Q7CisgIFRyZWVMaXN0PENodW5rX3QsIEZyZWVMaXN0X3Q+IF9lbWJlZGRlZF9saXN0OyAgLy8gaWYgbm9uLW51bGwsIHRoaXMgY2h1bmsgaXMgb24gX2xpc3QKKworICBzdGF0aWMgc2l6ZV90IF9taW5fdHJlZV9jaHVua19zaXplOworCiAgcHJvdGVjdGVkOgotICBUcmVlTGlzdDxDaHVuaz4qIGVtYmVkZGVkX2xpc3QoKSBjb25zdCB7IHJldHVybiAoVHJlZUxpc3Q8Q2h1bms+KikgJl9lbWJlZGRlZF9saXN0OyB9Ci0gIHZvaWQgc2V0X2VtYmVkZGVkX2xpc3QoVHJlZUxpc3Q8Q2h1bms+KiB2KSB7IF9lbWJlZGRlZF9saXN0ID0gKnY7IH0KKyAgVHJlZUxpc3Q8Q2h1bmtfdCwgRnJlZUxpc3RfdD4qIGVtYmVkZGVkX2xpc3QoKSBjb25zdCB7IHJldHVybiAoVHJlZUxpc3Q8Q2h1bmtfdCwgRnJlZUxpc3RfdD4qKSAmX2VtYmVkZGVkX2xpc3Q7IH0KKyAgdm9pZCBzZXRfZW1iZWRkZWRfbGlzdChUcmVlTGlzdDxDaHVua190LCBGcmVlTGlzdF90PiogdikgeyBfZW1iZWRkZWRfbGlzdCA9ICp2OyB9CiAgcHVibGljOgotICBUcmVlTGlzdDxDaHVuaz4qIGxpc3QoKSB7IHJldHVybiBfbGlzdDsgfQotICB2b2lkIHNldF9saXN0KFRyZWVMaXN0PENodW5rPiogdikgeyBfbGlzdCA9IHY7IH0KLSAgc3RhdGljIFRyZWVDaHVuazxDaHVuaz4qIGFzX1RyZWVDaHVuayhDaHVuayogZmMpOworICBUcmVlTGlzdDxDaHVua190LCBGcmVlTGlzdF90PiogbGlzdCgpIHsgcmV0dXJuIF9saXN0OyB9CisgIHZvaWQgc2V0X2xpc3QoVHJlZUxpc3Q8Q2h1bmtfdCwgRnJlZUxpc3RfdD4qIHYpIHsgX2xpc3QgPSB2OyB9CisgIHN0YXRpYyBUcmVlQ2h1bms8Q2h1bmtfdCwgRnJlZUxpc3RfdD4qIGFzX1RyZWVDaHVuayhDaHVua190KiBmYyk7CiAgIC8vIEluaXRpYWxpemUgZmllbGRzIGluIGEgVHJlZUNodW5rIHRoYXQgc2hvdWxkIGJlCiAgIC8vIGluaXRpYWxpemVkIHdoZW4gdGhlIFRyZWVDaHVuayBpcyBiZWluZyBhZGRlZCB0bwogICAvLyBhIGZyZWUgbGlzdCBpbiB0aGUgdHJlZS4KICAgdm9pZCBpbml0aWFsaXplKCkgeyBlbWJlZGRlZF9saXN0KCktPmluaXRpYWxpemUoKTsgfQogCi0gIENodW5rKiBuZXh0KCkgY29uc3QgeyByZXR1cm4gQ2h1bms6Om5leHQoKTsgfQotICBDaHVuayogcHJldigpIGNvbnN0IHsgcmV0dXJuIENodW5rOjpwcmV2KCk7IH0KLSAgc2l6ZV90IHNpemUoKSBjb25zdCB2b2xhdGlsZSB7IHJldHVybiBDaHVuazo6c2l6ZSgpOyB9CisgIENodW5rX3QqIG5leHQoKSBjb25zdCB7IHJldHVybiBDaHVua190OjpuZXh0KCk7IH0KKyAgQ2h1bmtfdCogcHJldigpIGNvbnN0IHsgcmV0dXJuIENodW5rX3Q6OnByZXYoKTsgfQorICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHZvbGF0aWxlIHsgcmV0dXJuIENodW5rX3Q6OnNpemUoKTsgfQorCisgIHN0YXRpYyBzaXplX3QgbWluX3NpemUoKSB7CisgICAgcmV0dXJuIF9taW5fdHJlZV9jaHVua19zaXplOworICB9CiAKICAgLy8gZGVidWdnaW5nCiAgIHZvaWQgdmVyaWZ5X3RyZWVfY2h1bmtfbGlzdCgpIGNvbnN0OworICB2b2lkIGFzc2VydF9pc19tYW5nbGVkKCkgY29uc3Q7CiB9OwogCiAKLXRlbXBsYXRlIDxjbGFzcyBDaHVuaz4KLWNsYXNzIEJpbmFyeVRyZWVEaWN0aW9uYXJ5OiBwdWJsaWMgRnJlZUJsb2NrRGljdGlvbmFyeTxDaHVuaz4gewordGVtcGxhdGUgPGNsYXNzIENodW5rX3QsIHRlbXBsYXRlIDxjbGFzcz4gY2xhc3MgRnJlZUxpc3RfdD4KK2NsYXNzIEJpbmFyeVRyZWVEaWN0aW9uYXJ5OiBwdWJsaWMgRnJlZUJsb2NrRGljdGlvbmFyeTxDaHVua190PiB7CiAgIGZyaWVuZCBjbGFzcyBWTVN0cnVjdHM7Ci0gIGJvb2wgICAgICAgX3NwbGF5OwotICBib29sICAgICAgIF9hZGFwdGl2ZV9mcmVlbGlzdHM7CiAgIHNpemVfdCAgICAgX3RvdGFsX3NpemU7CiAgIHNpemVfdCAgICAgX3RvdGFsX2ZyZWVfYmxvY2tzOwotICBUcmVlTGlzdDxDaHVuaz4qIF9yb290OworICBUcmVlTGlzdDxDaHVua190LCBGcmVlTGlzdF90PiogX3Jvb3Q7CiAKICAgLy8gcHJpdmF0ZSBhY2Nlc3NvcnMKLSAgYm9vbCBzcGxheSgpIGNvbnN0IHsgcmV0dXJuIF9zcGxheTsgfQotICB2b2lkIHNldF9zcGxheShib29sIHYpIHsgX3NwbGF5ID0gdjsgfQogICB2b2lkIHNldF90b3RhbF9zaXplKHNpemVfdCB2KSB7IF90b3RhbF9zaXplID0gdjsgfQogICB2aXJ0dWFsIHZvaWQgaW5jX3RvdGFsX3NpemUoc2l6ZV90IHYpOwogICB2aXJ0dWFsIHZvaWQgZGVjX3RvdGFsX3NpemUoc2l6ZV90IHYpOwotICBzaXplX3QgdG90YWxfZnJlZV9ibG9ja3MoKSBjb25zdCB7IHJldHVybiBfdG90YWxfZnJlZV9ibG9ja3M7IH0KICAgdm9pZCBzZXRfdG90YWxfZnJlZV9ibG9ja3Moc2l6ZV90IHYpIHsgX3RvdGFsX2ZyZWVfYmxvY2tzID0gdjsgfQotICBUcmVlTGlzdDxDaHVuaz4qIHJvb3QoKSBjb25zdCB7IHJldHVybiBfcm9vdDsgfQotICB2b2lkIHNldF9yb290KFRyZWVMaXN0PENodW5rPiogdikgeyBfcm9vdCA9IHY7IH0KLSAgYm9vbCBhZGFwdGl2ZV9mcmVlbGlzdHMoKSB7IHJldHVybiBfYWRhcHRpdmVfZnJlZWxpc3RzOyB9CisgIFRyZWVMaXN0PENodW5rX3QsIEZyZWVMaXN0X3Q+KiByb290KCkgY29uc3QgeyByZXR1cm4gX3Jvb3Q7IH0KKyAgdm9pZCBzZXRfcm9vdChUcmVlTGlzdDxDaHVua190LCBGcmVlTGlzdF90PiogdikgeyBfcm9vdCA9IHY7IH0KIAogICAvLyBUaGlzIGZpZWxkIGlzIGFkZGVkIGFuZCBjYW4gYmUgc2V0IHRvIHBvaW50IHRvIHRoZQogICAvLyB0aGUgTXV0ZXggdXNlZCB0byBzeW5jaHJvbml6ZSBhY2Nlc3MgdG8gdGhlCkBAIC0xOTEsNTQgKzE5NCw1NSBAQAogICAvLyByZXR1cm4gaXQuICBJZiB0aGUgY2h1bmsKICAgLy8gaXMgdGhlIGxhc3QgY2h1bmsgb2YgdGhhdCBzaXplLCByZW1vdmUgdGhlIG5vZGUgZm9yIHRoYXQgc2l6ZQogICAvLyBmcm9tIHRoZSB0cmVlLgotICBUcmVlQ2h1bms8Q2h1bms+KiBnZXRfY2h1bmtfZnJvbV90cmVlKHNpemVfdCBzaXplLCBlbnVtIEZyZWVCbG9ja0RpY3Rpb25hcnk8Q2h1bms+OjpEaXRoZXIgZGl0aGVyLCBib29sIHNwbGF5KTsKLSAgLy8gUmV0dXJuIGEgbGlzdCBvZiB0aGUgc3BlY2lmaWVkIHNpemUgb3IgTlVMTCBmcm9tIHRoZSB0cmVlLgotICAvLyBUaGUgbGlzdCBpcyBub3QgcmVtb3ZlZCBmcm9tIHRoZSB0cmVlLgotICBUcmVlTGlzdDxDaHVuaz4qIGZpbmRfbGlzdCAoc2l6ZV90IHNpemUpIGNvbnN0OworICBUcmVlQ2h1bms8Q2h1bmtfdCwgRnJlZUxpc3RfdD4qIGdldF9jaHVua19mcm9tX3RyZWUoc2l6ZV90IHNpemUsIGVudW0gRnJlZUJsb2NrRGljdGlvbmFyeTxDaHVua190Pjo6RGl0aGVyIGRpdGhlcik7CiAgIC8vIFJlbW92ZSB0aGlzIGNodW5rIGZyb20gdGhlIHRyZWUuICBJZiB0aGUgcmVtb3ZhbCByZXN1bHRzCiAgIC8vIGluIGFuIGVtcHR5IGxpc3QgaW4gdGhlIHRyZWUsIHJlbW92ZSB0aGUgZW1wdHkgbGlzdC4KLSAgVHJlZUNodW5rPENodW5rPiogcmVtb3ZlX2NodW5rX2Zyb21fdHJlZShUcmVlQ2h1bms8Q2h1bms+KiB0Yyk7CisgIFRyZWVDaHVuazxDaHVua190LCBGcmVlTGlzdF90PiogcmVtb3ZlX2NodW5rX2Zyb21fdHJlZShUcmVlQ2h1bms8Q2h1bmtfdCwgRnJlZUxpc3RfdD4qIHRjKTsKICAgLy8gUmVtb3ZlIHRoZSBub2RlIGluIHRoZSB0cmVlcyBzdGFydGluZyBhdCB0bCB0aGF0IGhhcyB0aGUKICAgLy8gbWluaW11bSB2YWx1ZSBhbmQgcmV0dXJuIGl0LiAgUmVwYWlyIHRoZSB0cmVlIGFzIG5lZWRlZC4KLSAgVHJlZUxpc3Q8Q2h1bms+KiByZW1vdmVfdHJlZV9taW5pbXVtKFRyZWVMaXN0PENodW5rPiogdGwpOwotICB2b2lkICAgICAgIHNlbWlfc3BsYXlfc3RlcChUcmVlTGlzdDxDaHVuaz4qIHRsKTsKKyAgVHJlZUxpc3Q8Q2h1bmtfdCwgRnJlZUxpc3RfdD4qIHJlbW92ZV90cmVlX21pbmltdW0oVHJlZUxpc3Q8Q2h1bmtfdCwgRnJlZUxpc3RfdD4qIHRsKTsKICAgLy8gQWRkIHRoaXMgZnJlZSBjaHVuayB0byB0aGUgdHJlZS4KLSAgdm9pZCAgICAgICBpbnNlcnRfY2h1bmtfaW5fdHJlZShDaHVuayogZnJlZUNodW5rKTsKKyAgdm9pZCAgICAgICBpbnNlcnRfY2h1bmtfaW5fdHJlZShDaHVua190KiBmcmVlQ2h1bmspOwogIHB1YmxpYzoKIAotICBzdGF0aWMgY29uc3Qgc2l6ZV90IG1pbl90cmVlX2NodW5rX3NpemUgID0gc2l6ZW9mKFRyZWVDaHVuazxDaHVuaz4pL0hlYXBXb3JkU2l6ZTsKKyAgLy8gUmV0dXJuIGEgbGlzdCBvZiB0aGUgc3BlY2lmaWVkIHNpemUgb3IgTlVMTCBmcm9tIHRoZSB0cmVlLgorICAvLyBUaGUgbGlzdCBpcyBub3QgcmVtb3ZlZCBmcm9tIHRoZSB0cmVlLgorICBUcmVlTGlzdDxDaHVua190LCBGcmVlTGlzdF90PiogZmluZF9saXN0IChzaXplX3Qgc2l6ZSkgY29uc3Q7CiAKICAgdm9pZCAgICAgICB2ZXJpZnlfdHJlZSgpIGNvbnN0OwogICAvLyB2ZXJpZnkgdGhhdCB0aGUgZ2l2ZW4gY2h1bmsgaXMgaW4gdGhlIHRyZWUuCi0gIGJvb2wgICAgICAgdmVyaWZ5X2NodW5rX2luX2ZyZWVfbGlzdChDaHVuayogdGMpIGNvbnN0OworICBib29sICAgICAgIHZlcmlmeV9jaHVua19pbl9mcmVlX2xpc3QoQ2h1bmtfdCogdGMpIGNvbnN0OwogIHByaXZhdGU6Ci0gIHZvaWQgICAgICAgICAgdmVyaWZ5X3RyZWVfaGVscGVyKFRyZWVMaXN0PENodW5rPiogdGwpIGNvbnN0OwotICBzdGF0aWMgc2l6ZV90IHZlcmlmeV9wcmV2X2ZyZWVfcHRycyhUcmVlTGlzdDxDaHVuaz4qIHRsKTsKKyAgdm9pZCAgICAgICAgICB2ZXJpZnlfdHJlZV9oZWxwZXIoVHJlZUxpc3Q8Q2h1bmtfdCwgRnJlZUxpc3RfdD4qIHRsKSBjb25zdDsKKyAgc3RhdGljIHNpemVfdCB2ZXJpZnlfcHJldl9mcmVlX3B0cnMoVHJlZUxpc3Q8Q2h1bmtfdCwgRnJlZUxpc3RfdD4qIHRsKTsKIAogICAvLyBSZXR1cm5zIHRoZSB0b3RhbCBudW1iZXIgb2YgY2h1bmtzIGluIHRoZSBsaXN0LgotICBzaXplX3QgICAgIHRvdGFsX2xpc3RfbGVuZ3RoKFRyZWVMaXN0PENodW5rPiogdGwpIGNvbnN0OworICBzaXplX3QgICAgIHRvdGFsX2xpc3RfbGVuZ3RoKFRyZWVMaXN0PENodW5rX3QsIEZyZWVMaXN0X3Q+KiB0bCkgY29uc3Q7CiAgIC8vIFJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiB3b3JkcyBpbiB0aGUgY2h1bmtzIGluIHRoZSB0cmVlCiAgIC8vIHN0YXJ0aW5nIGF0ICJ0bCIuCi0gIHNpemVfdCAgICAgdG90YWxfc2l6ZV9pbl90cmVlKFRyZWVMaXN0PENodW5rPiogdGwpIGNvbnN0OworICBzaXplX3QgICAgIHRvdGFsX3NpemVfaW5fdHJlZShUcmVlTGlzdDxDaHVua190LCBGcmVlTGlzdF90PiogdGwpIGNvbnN0OwogICAvLyBSZXR1cm5zIHRoZSBzdW0gb2YgdGhlIHNxdWFyZSBvZiB0aGUgc2l6ZSBvZiBlYWNoIGJsb2NrCiAgIC8vIGluIHRoZSB0cmVlIHN0YXJ0aW5nIGF0ICJ0bCIuCi0gIGRvdWJsZSAgICAgc3VtX29mX3NxdWFyZWRfYmxvY2tfc2l6ZXMoVHJlZUxpc3Q8Q2h1bms+KiBjb25zdCB0bCkgY29uc3Q7CisgIGRvdWJsZSAgICAgc3VtX29mX3NxdWFyZWRfYmxvY2tfc2l6ZXMoVHJlZUxpc3Q8Q2h1bmtfdCwgRnJlZUxpc3RfdD4qIGNvbnN0IHRsKSBjb25zdDsKICAgLy8gUmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIGZyZWUgYmxvY2tzIGluIHRoZSB0cmVlIHN0YXJ0aW5nCiAgIC8vIGF0ICJ0bCIuCi0gIHNpemVfdCAgICAgdG90YWxfZnJlZV9ibG9ja3NfaW5fdHJlZShUcmVlTGlzdDxDaHVuaz4qIHRsKSBjb25zdDsKLSAgc2l6ZV90ICAgICBudW1fZnJlZV9ibG9ja3MoKSBjb25zdDsKLSAgc2l6ZV90ICAgICB0cmVlSGVpZ2h0KCkgY29uc3Q7Ci0gIHNpemVfdCAgICAgdHJlZV9oZWlnaHRfaGVscGVyKFRyZWVMaXN0PENodW5rPiogdGwpIGNvbnN0OwotICBzaXplX3QgICAgIHRvdGFsX25vZGVzX2luX3RyZWUoVHJlZUxpc3Q8Q2h1bms+KiB0bCkgY29uc3Q7Ci0gIHNpemVfdCAgICAgdG90YWxfbm9kZXNfaGVscGVyKFRyZWVMaXN0PENodW5rPiogdGwpIGNvbnN0OworICBzaXplX3QgICAgIHRvdGFsX2ZyZWVfYmxvY2tzX2luX3RyZWUoVHJlZUxpc3Q8Q2h1bmtfdCwgRnJlZUxpc3RfdD4qIHRsKSBjb25zdDsKKyAgc2l6ZV90ICAgICBudW1fZnJlZV9ibG9ja3MoKSAgY29uc3Q7CisgIHNpemVfdCAgICAgdHJlZV9oZWlnaHQoKSBjb25zdDsKKyAgc2l6ZV90ICAgICB0cmVlX2hlaWdodF9oZWxwZXIoVHJlZUxpc3Q8Q2h1bmtfdCwgRnJlZUxpc3RfdD4qIHRsKSBjb25zdDsKKyAgc2l6ZV90ICAgICB0b3RhbF9ub2Rlc19pbl90cmVlKFRyZWVMaXN0PENodW5rX3QsIEZyZWVMaXN0X3Q+KiB0bCkgY29uc3Q7CisgIHNpemVfdCAgICAgdG90YWxfbm9kZXNfaGVscGVyKFRyZWVMaXN0PENodW5rX3QsIEZyZWVMaXN0X3Q+KiB0bCkgY29uc3Q7CiAKICBwdWJsaWM6CiAgIC8vIENvbnN0cnVjdG9yCi0gIEJpbmFyeVRyZWVEaWN0aW9uYXJ5KGJvb2wgYWRhcHRpdmVfZnJlZWxpc3RzLCBib29sIHNwbGF5ID0gZmFsc2UpOwotICBCaW5hcnlUcmVlRGljdGlvbmFyeShNZW1SZWdpb24gbXIsIGJvb2wgYWRhcHRpdmVfZnJlZWxpc3RzLCBib29sIHNwbGF5ID0gZmFsc2UpOworICBCaW5hcnlUcmVlRGljdGlvbmFyeSgpIDoKKyAgICBfdG90YWxfc2l6ZSgwKSwgX3RvdGFsX2ZyZWVfYmxvY2tzKDApLCBfcm9vdCgwKSB7fQorCisgIEJpbmFyeVRyZWVEaWN0aW9uYXJ5KE1lbVJlZ2lvbiBtcik7CiAKICAgLy8gUHVibGljIGFjY2Vzc29ycwogICBzaXplX3QgdG90YWxfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF90b3RhbF9zaXplOyB9CisgIHNpemVfdCB0b3RhbF9mcmVlX2Jsb2NrcygpIGNvbnN0IHsgcmV0dXJuIF90b3RhbF9mcmVlX2Jsb2NrczsgfQogCiAgIC8vIFJlc2V0IHRoZSBkaWN0aW9uYXJ5IHRvIHRoZSBpbml0aWFsIGNvbmRpdGlvbnMgd2l0aAogICAvLyBhIHNpbmdsZSBmcmVlIGNodW5rLgpAQCAtMjQ5LDIzICsyNTMsMjQgQEAKIAogICAvLyBSZXR1cm4gYSBjaHVuayBvZiBzaXplICJzaXplIiBvciBncmVhdGVyIGZyb20KICAgLy8gdGhlIHRyZWUuCi0gIC8vIHdhbnQgYSBiZXR0ZXIgZHluYW1pYyBzcGxheSBzdHJhdGVneSBmb3IgdGhlIGZ1dHVyZS4KLSAgQ2h1bmsqIGdldF9jaHVuayhzaXplX3Qgc2l6ZSwgZW51bSBGcmVlQmxvY2tEaWN0aW9uYXJ5PENodW5rPjo6RGl0aGVyIGRpdGhlcikgewotICAgIEZyZWVCbG9ja0RpY3Rpb25hcnk8Q2h1bms+Ojp2ZXJpZnlfcGFyX2xvY2tlZCgpOwotICAgIENodW5rKiByZXMgPSBnZXRfY2h1bmtfZnJvbV90cmVlKHNpemUsIGRpdGhlciwgc3BsYXkoKSk7CisgIENodW5rX3QqIGdldF9jaHVuayhzaXplX3Qgc2l6ZSwgZW51bSBGcmVlQmxvY2tEaWN0aW9uYXJ5PENodW5rX3Q+OjpEaXRoZXIgZGl0aGVyKSB7CisgICAgRnJlZUJsb2NrRGljdGlvbmFyeTxDaHVua190Pjo6dmVyaWZ5X3Bhcl9sb2NrZWQoKTsKKyAgICBDaHVua190KiByZXMgPSBnZXRfY2h1bmtfZnJvbV90cmVlKHNpemUsIGRpdGhlcik7CiAgICAgYXNzZXJ0KHJlcyA9PSBOVUxMIHx8IHJlcy0+aXNfZnJlZSgpLAogICAgICAgICAgICAiU2hvdWxkIGJlIHJldHVybmluZyBhIGZyZWUgY2h1bmsiKTsKKyAgICBhc3NlcnQoZGl0aGVyICE9IEZyZWVCbG9ja0RpY3Rpb25hcnk8Q2h1bmtfdD46OmV4YWN0bHkgfHwKKyAgICAgICAgICAgcmVzID09IE5VTEwgfHwgcmVzLT5zaXplKCkgPT0gc2l6ZSwgIk5vdCBjb3JyZWN0IHNpemUiKTsKICAgICByZXR1cm4gcmVzOwogICB9CiAKLSAgdm9pZCByZXR1cm5fY2h1bmsoQ2h1bmsqIGNodW5rKSB7Ci0gICAgRnJlZUJsb2NrRGljdGlvbmFyeTxDaHVuaz46OnZlcmlmeV9wYXJfbG9ja2VkKCk7CisgIHZvaWQgcmV0dXJuX2NodW5rKENodW5rX3QqIGNodW5rKSB7CisgICAgRnJlZUJsb2NrRGljdGlvbmFyeTxDaHVua190Pjo6dmVyaWZ5X3Bhcl9sb2NrZWQoKTsKICAgICBpbnNlcnRfY2h1bmtfaW5fdHJlZShjaHVuayk7CiAgIH0KIAotICB2b2lkIHJlbW92ZV9jaHVuayhDaHVuayogY2h1bmspIHsKLSAgICBGcmVlQmxvY2tEaWN0aW9uYXJ5PENodW5rPjo6dmVyaWZ5X3Bhcl9sb2NrZWQoKTsKLSAgICByZW1vdmVfY2h1bmtfZnJvbV90cmVlKChUcmVlQ2h1bms8Q2h1bms+KiljaHVuayk7CisgIHZvaWQgcmVtb3ZlX2NodW5rKENodW5rX3QqIGNodW5rKSB7CisgICAgRnJlZUJsb2NrRGljdGlvbmFyeTxDaHVua190Pjo6dmVyaWZ5X3Bhcl9sb2NrZWQoKTsKKyAgICByZW1vdmVfY2h1bmtfZnJvbV90cmVlKChUcmVlQ2h1bms8Q2h1bmtfdCwgRnJlZUxpc3RfdD4qKWNodW5rKTsKICAgICBhc3NlcnQoY2h1bmstPmlzX2ZyZWUoKSwgIlNob3VsZCBzdGlsbCBiZSBhIGZyZWUgY2h1bmsiKTsKICAgfQogCkBAIC0yODEsMTkgKzI4NiwxOSBAQAogICB9CiAKICAgc2l6ZV90ICAgICBtaW5fc2l6ZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gbWluX3RyZWVfY2h1bmtfc2l6ZTsKKyAgICByZXR1cm4gVHJlZUNodW5rPENodW5rX3QsIEZyZWVMaXN0X3Q+OjptaW5fc2l6ZSgpOwogICB9CiAKICAgZG91YmxlICAgICBzdW1fb2Zfc3F1YXJlZF9ibG9ja19zaXplcygpIGNvbnN0IHsKICAgICByZXR1cm4gc3VtX29mX3NxdWFyZWRfYmxvY2tfc2l6ZXMocm9vdCgpKTsKICAgfQogCi0gIENodW5rKiBmaW5kX2NodW5rX2VuZHNfYXQoSGVhcFdvcmQqIHRhcmdldCkgY29uc3Q7CisgIENodW5rX3QqIGZpbmRfY2h1bmtfZW5kc19hdChIZWFwV29yZCogdGFyZ2V0KSBjb25zdDsKIAogICAvLyBGaW5kIHRoZSBsaXN0IHdpdGggc2l6ZSAic2l6ZSIgaW4gdGhlIGJpbmFyeSB0cmVlIGFuZCB1cGRhdGUKICAgLy8gdGhlIHN0YXRpc3RpY3MgaW4gdGhlIGxpc3QgYWNjb3JkaW5nIHRvICJzcGxpdCIgKGNodW5rIHdhcwogICAvLyBzcGxpdCBvciBjb2FsZXNjZSkgYW5kICJiaXJ0aCIgKGNodW5rIHdhcyBhZGRlZCBvciByZW1vdmVkKS4KLSAgdm9pZCAgICAgICBkaWN0X2NlbnN1c191ZHBhdGUoc2l6ZV90IHNpemUsIGJvb2wgc3BsaXQsIGJvb2wgYmlydGgpOworICB2b2lkICAgICAgIGRpY3RfY2Vuc3VzX3VwZGF0ZShzaXplX3Qgc2l6ZSwgYm9vbCBzcGxpdCwgYm9vbCBiaXJ0aCk7CiAgIC8vIFJldHVybiB0cnVlIGlmIHRoZSBkaWN0aW9uYXJ5IGlzIG92ZXJwb3B1bGF0ZWQgKG1vcmUgY2h1bmtzIG9mCiAgIC8vIHRoaXMgc2l6ZSB0aGFuIGRlc2lyZWQpIGZvciBzaXplICJzaXplIi4KICAgYm9vbCAgICAgICBjb2FsX2RpY3Rfb3Zlcl9wb3B1bGF0ZWQoc2l6ZV90IHNpemUpOwpAQCAtMzA3LDcgKzMxMiw3IEBACiAgIC8vIHN0YXRpc3RpY3MgZm9yIHRoZSBzd2VlcC4KICAgdm9pZCAgICAgICBlbmRfc3dlZXBfZGljdF9jZW5zdXMoZG91YmxlIHNwbGl0U3VycGx1c1BlcmNlbnQpOwogICAvLyBSZXR1cm4gdGhlIGxhcmdlc3QgZnJlZSBjaHVuayBpbiB0aGUgdHJlZS4KLSAgQ2h1bmsqIGZpbmRfbGFyZ2VzdF9kaWN0KCkgY29uc3Q7CisgIENodW5rX3QqIGZpbmRfbGFyZ2VzdF9kaWN0KCkgY29uc3Q7CiAgIC8vIEFjY2Vzc29ycyBmb3Igc3RhdGlzdGljcwogICB2b2lkICAgICAgIHNldF90cmVlX3N1cnBsdXMoZG91YmxlIHNwbGl0U3VycGx1c1BlcmNlbnQpOwogICB2b2lkICAgICAgIHNldF90cmVlX2hpbnRzKHZvaWQpOwpkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vbWVtb3J5L2ZpbGVtYXAuY3BwIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vbWVtb3J5L2ZpbGVtYXAuY3BwCmluZGV4IGQ0YTExZjQuLmMzZDFiZjUgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL21lbW9yeS9maWxlbWFwLmNwcAorKysgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9tZW1vcnkvZmlsZW1hcC5jcHAKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlICJydW50aW1lL2FyZ3VtZW50cy5ocHAiCiAjaW5jbHVkZSAicnVudGltZS9qYXZhLmhwcCIKICNpbmNsdWRlICJydW50aW1lL29zLmhwcCIKKyNpbmNsdWRlICJzZXJ2aWNlcy9tZW1UcmFja2VyLmhwcCIKICNpbmNsdWRlICJ1dGlsaXRpZXMvZGVmYXVsdFN0cmVhbS5ocHAiCiAKICMgaW5jbHVkZSA8c3lzL3N0YXQuaD4KQEAgLTM0NCwyNSArMzQ1LDE0IEBACiAgICAgZmFpbF9jb250aW51ZShlcnJfbXNnKCJVbmFibGUgdG8gcmVzZXJ2ZWQgc2hhcmVkIHNwYWNlIGF0IHJlcXVpcmVkIGFkZHJlc3MgIiBJTlRQVFJfRk9STUFULCByZXF1ZXN0ZWRfYWRkcikpOwogICAgIHJldHVybiByczsKICAgfQorICAvLyB0aGUgcmVzZXJ2ZWQgdmlydHVhbCBtZW1vcnkgaXMgZm9yIG1hcHBpbmcgY2xhc3MgZGF0YSBzaGFyaW5nIGFyY2hpdmUKKyAgaWYgKE1lbVRyYWNrZXI6OmlzX29uKCkpIHsKKyAgICBNZW1UcmFja2VyOjpyZWNvcmRfdmlydHVhbF9tZW1vcnlfdHlwZSgoYWRkcmVzcylycy5iYXNlKCksIG10Q2xhc3NTaGFyZWQpOworICB9CiAgIHJldHVybiByczsKIH0KIAogLy8gTWVtb3J5IG1hcCBhIHJlZ2lvbiBpbiB0aGUgYWRkcmVzcyBzcGFjZS4KLQotY2hhciogRmlsZU1hcEluZm86Om1hcF9yZWdpb24oaW50IGksIFJlc2VydmVkU3BhY2UgcnMpIHsKLSAgc3RydWN0IEZpbGVNYXBJbmZvOjpGaWxlTWFwSGVhZGVyOjpzcGFjZV9pbmZvKiBzaSA9ICZfaGVhZGVyLl9zcGFjZVtpXTsKLSAgc2l6ZV90IHVzZWQgPSBzaS0+X3VzZWQ7Ci0gIHNpemVfdCBzaXplID0gYWxpZ25fc2l6ZV91cCh1c2VkLCBvczo6dm1fYWxsb2NhdGlvbl9ncmFudWxhcml0eSgpKTsKLQotICBSZXNlcnZlZFNwYWNlIG1hcHBlZF9ycyA9IHJzLmZpcnN0X3BhcnQoc2l6ZSwgdHJ1ZSwgdHJ1ZSk7Ci0gIFJlc2VydmVkU3BhY2UgdW5tYXBwZWRfcnMgPSBycy5sYXN0X3BhcnQoc2l6ZSk7Ci0gIG1hcHBlZF9ycy5yZWxlYXNlKCk7Ci0KLSAgcmV0dXJuIG1hcF9yZWdpb24oaSk7Ci19Ci0KLQotLy8gTWVtb3J5IG1hcCBhIHJlZ2lvbiBpbiB0aGUgYWRkcmVzcyBzcGFjZS4KIHN0YXRpYyBjb25zdCBjaGFyKiBzaGFyZWRfcmVnaW9uX25hbWVbXSA9IHsgIlJlYWRPbmx5IiwgIlJlYWRXcml0ZSIsICJNaXNjRGF0YSIsICJNaXNjQ29kZSJ9OwogCiBjaGFyKiBGaWxlTWFwSW5mbzo6bWFwX3JlZ2lvbihpbnQgaSkgewpkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vbWVtb3J5L2ZpbGVtYXAuaHBwIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vbWVtb3J5L2ZpbGVtYXAuaHBwCmluZGV4IDc2MGRkZmUuLjdjZGQ5NjEgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL21lbW9yeS9maWxlbWFwLmhwcAorKysgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9tZW1vcnkvZmlsZW1hcC5ocHAKQEAgLTEyNSw3ICsxMjUsNiBAQAogICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGNhcGFjaXR5LCBib29sIHJlYWRfb25seSwgYm9vbCBhbGxvd19leGVjKTsKICAgdm9pZCAgd3JpdGVfYnl0ZXMoY29uc3Qgdm9pZCogYnVmZmVyLCBpbnQgY291bnQpOwogICB2b2lkICB3cml0ZV9ieXRlc19hbGlnbmVkKGNvbnN0IHZvaWQqIGJ1ZmZlciwgaW50IGNvdW50KTsKLSAgY2hhciogbWFwX3JlZ2lvbihpbnQgaSwgUmVzZXJ2ZWRTcGFjZSBycyk7CiAgIGNoYXIqIG1hcF9yZWdpb24oaW50IGkpOwogICB2b2lkICB1bm1hcF9yZWdpb24oaW50IGkpOwogICB2b2lkICBjbG9zZSgpOwpkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vbWVtb3J5L2ZyZWVCbG9ja0RpY3Rpb25hcnkuY3BwIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vbWVtb3J5L2ZyZWVCbG9ja0RpY3Rpb25hcnkuY3BwCmluZGV4IDEzYjRkYWEuLjliMjIyMTIgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL21lbW9yeS9mcmVlQmxvY2tEaWN0aW9uYXJ5LmNwcAorKysgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9tZW1vcnkvZnJlZUJsb2NrRGljdGlvbmFyeS5jcHAKQEAgLTI3LDYgKzI3LDggQEAKICNpbmNsdWRlICJnY19pbXBsZW1lbnRhdGlvbi9jb25jdXJyZW50TWFya1N3ZWVwL2ZyZWVDaHVuay5ocHAiCiAjZW5kaWYgLy8gU0VSSUFMR0MKICNpbmNsdWRlICJtZW1vcnkvZnJlZUJsb2NrRGljdGlvbmFyeS5ocHAiCisjaW5jbHVkZSAibWVtb3J5L21ldGFibG9jay5ocHAiCisjaW5jbHVkZSAibWVtb3J5L21ldGFjaHVuay5ocHAiCiAjaWZkZWYgVEFSR0VUX09TX0ZBTUlMWV9saW51eAogIyBpbmNsdWRlICJ0aHJlYWRfbGludXguaW5saW5lLmhwcCIKICNlbmRpZgpAQCAtNjIsNiArNjQsOSBAQAogfQogI2VuZGlmCiAKK3RlbXBsYXRlIGNsYXNzIEZyZWVCbG9ja0RpY3Rpb25hcnk8TWV0YWJsb2NrPjsKK3RlbXBsYXRlIGNsYXNzIEZyZWVCbG9ja0RpY3Rpb25hcnk8TWV0YWNodW5rPjsKKwogI2lmbmRlZiBTRVJJQUxHQwogLy8gRXhwbGljaXRseSBpbnN0YW50aWF0ZSBmb3IgRnJlZUNodW5rCiB0ZW1wbGF0ZSBjbGFzcyBGcmVlQmxvY2tEaWN0aW9uYXJ5PEZyZWVDaHVuaz47CmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9zaGFyZS92bS9tZW1vcnkvZnJlZUJsb2NrRGljdGlvbmFyeS5ocHAgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9tZW1vcnkvZnJlZUJsb2NrRGljdGlvbmFyeS5ocHAKaW5kZXggNTczY2ZlZC4uMjUwMmUzNiAxMDA2NDQKLS0tIGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vbWVtb3J5L2ZyZWVCbG9ja0RpY3Rpb25hcnkuaHBwCisrKyBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL21lbW9yeS9mcmVlQmxvY2tEaWN0aW9uYXJ5LmhwcApAQCAtNjYsNyArNjYsNyBAQAogICB2aXJ0dWFsIHZvaWQgICAgICAgcmVzZXQoSGVhcFdvcmQqIGFkZHIsIHNpemVfdCBzaXplKSA9IDA7CiAgIHZpcnR1YWwgdm9pZCAgICAgICByZXNldCgpID0gMDsKIAotICB2aXJ0dWFsIHZvaWQgICAgICAgZGljdF9jZW5zdXNfdWRwYXRlKHNpemVfdCBzaXplLCBib29sIHNwbGl0LCBib29sIGJpcnRoKSA9IDA7CisgIHZpcnR1YWwgdm9pZCAgICAgICBkaWN0X2NlbnN1c191cGRhdGUoc2l6ZV90IHNpemUsIGJvb2wgc3BsaXQsIGJvb2wgYmlydGgpID0gMDsKICAgdmlydHVhbCBib29sICAgICAgIGNvYWxfZGljdF9vdmVyX3BvcHVsYXRlZChzaXplX3Qgc2l6ZSkgPSAwOwogICB2aXJ0dWFsIHZvaWQgICAgICAgYmVnaW5fc3dlZXBfZGljdF9jZW5zdXMoZG91YmxlIGNvYWxTdXJwbHVzUGVyY2VudCwKICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgaW50ZXJfc3dlZXBfY3VycmVudCwgZmxvYXQgaW50ZXJfc3dlZXBfZXN0aW1hdGUsCmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9zaGFyZS92bS9tZW1vcnkvZnJlZUxpc3QuY3BwIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vbWVtb3J5L2ZyZWVMaXN0LmNwcAppbmRleCBhNWZiYzA2Li5mNWNkODA1IDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9zaGFyZS92bS9tZW1vcnkvZnJlZUxpc3QuY3BwCisrKyBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL21lbW9yeS9mcmVlTGlzdC5jcHAKQEAgLTI1LDYgKzI1LDggQEAKICNpbmNsdWRlICJwcmVjb21waWxlZC5ocHAiCiAjaW5jbHVkZSAibWVtb3J5L2ZyZWVCbG9ja0RpY3Rpb25hcnkuaHBwIgogI2luY2x1ZGUgIm1lbW9yeS9mcmVlTGlzdC5ocHAiCisjaW5jbHVkZSAibWVtb3J5L21ldGFibG9jay5ocHAiCisjaW5jbHVkZSAibWVtb3J5L21ldGFjaHVuay5ocHAiCiAjaW5jbHVkZSAibWVtb3J5L3NoYXJlZEhlYXAuaHBwIgogI2luY2x1ZGUgInJ1bnRpbWUvZ2xvYmFscy5ocHAiCiAjaW5jbHVkZSAicnVudGltZS9tdXRleC5ocHAiCkBAIC00OSw4ICs1MSw2IEBACiB7CiAgIF9zaXplICAgICAgICAgPSAwOwogICBfY291bnQgICAgICAgID0gMDsKLSAgX2hpbnQgICAgICAgICA9IDA7Ci0gIGluaXRfc3RhdGlzdGljcygpOwogfQogCiB0ZW1wbGF0ZSA8Y2xhc3MgQ2h1bms+CkBAIC02MiwzNCArNjIsNTAgQEAKIHsKICAgX3NpemUgICAgICAgICA9IGZjLT5zaXplKCk7CiAgIF9jb3VudCAgICAgICAgPSAxOwotICBfaGludCAgICAgICAgID0gMDsKLSAgaW5pdF9zdGF0aXN0aWNzKCk7Ci0jaWZuZGVmIFBST0RVQ1QKLSAgX2FsbG9jYXRpb25fc3RhdHMuc2V0X3JldHVybmVkX2J5dGVzKHNpemUoKSAqIEhlYXBXb3JkU2l6ZSk7Ci0jZW5kaWYKIH0KIAogdGVtcGxhdGUgPGNsYXNzIENodW5rPgotdm9pZCBGcmVlTGlzdDxDaHVuaz46OnJlc2V0KHNpemVfdCBoaW50KSB7Cit2b2lkIEZyZWVMaXN0PENodW5rPjo6bGlua19oZWFkKENodW5rKiB2KSB7CisgIGFzc2VydF9wcm9wZXJfbG9ja19wcm90ZWN0aW9uKCk7CisgIHNldF9oZWFkKHYpOworICAvLyBJZiB0aGlzIG1ldGhvZCBpcyBub3QgdXNlZCAoanVzdCBzZXQgdGhlIGhlYWQgaW5zdGVhZCksCisgIC8vIHRoaXMgY2hlY2sgY2FuIGJlIGF2b2lkZWQuCisgIGlmICh2ICE9IE5VTEwpIHsKKyAgICB2LT5saW5rX3ByZXYoTlVMTCk7CisgIH0KK30KKworCisKK3RlbXBsYXRlIDxjbGFzcyBDaHVuaz4KK3ZvaWQgRnJlZUxpc3Q8Q2h1bms+OjpyZXNldCgpIHsKKyAgLy8gRG9uJ3Qgc2V0IHRoZSBfc2l6ZSB0byAwIGJlY2F1c2UgdGhpcyBtZXRob2QgaXMKKyAgLy8gdXNlZCB3aXRoIGEgZXhpc3RpbmcgbGlzdCB0aGF0IGhhcyBhIHNpemUgYnV0IHdoaWNoIGhhcworICAvLyBiZWVuIGVtcHRpZWQuCisgIC8vIERvbid0IGNsZWFyIHRoZSBfcHJvdGVjdGluZ19sb2NrIG9mIGFuIGV4aXN0aW5nIGxpc3QuCiAgIHNldF9jb3VudCgwKTsKICAgc2V0X2hlYWQoTlVMTCk7CiAgIHNldF90YWlsKE5VTEwpOwotICBzZXRfaGludChoaW50KTsKIH0KIAogdGVtcGxhdGUgPGNsYXNzIENodW5rPgotdm9pZCBGcmVlTGlzdDxDaHVuaz46OmluaXRfc3RhdGlzdGljcyhib29sIHNwbGl0X2JpcnRoKSB7Ci0gIF9hbGxvY2F0aW9uX3N0YXRzLmluaXRpYWxpemUoc3BsaXRfYmlydGgpOwordm9pZCBGcmVlTGlzdDxDaHVuaz46OmluaXRpYWxpemUoKSB7CisjaWZkZWYgQVNTRVJUCisgIC8vIE5lZWRlZCBlYXJseSBiZWNhdXNlIGl0IG1pZ2h0IGJlIGNoZWNrZWQgaW4gb3RoZXIgaW5pdGlhbGl6aW5nIGNvZGUuCisgIHNldF9wcm90ZWN0aW5nX2xvY2soTlVMTCk7CisjZW5kaWYKKyAgcmVzZXQoKTsKKyAgc2V0X3NpemUoMCk7CiB9CiAKLXRlbXBsYXRlIDxjbGFzcyBDaHVuaz4KLUNodW5rKiBGcmVlTGlzdDxDaHVuaz46OmdldF9jaHVua19hdF9oZWFkKCkgewordGVtcGxhdGUgPGNsYXNzIENodW5rX3Q+CitDaHVua190KiBGcmVlTGlzdDxDaHVua190Pjo6Z2V0X2NodW5rX2F0X2hlYWQoKSB7CiAgIGFzc2VydF9wcm9wZXJfbG9ja19wcm90ZWN0aW9uKCk7CiAgIGFzc2VydChoZWFkKCkgPT0gTlVMTCB8fCBoZWFkKCktPnByZXYoKSA9PSBOVUxMLCAibGlzdCBpbnZhcmlhbnQiKTsKICAgYXNzZXJ0KHRhaWwoKSA9PSBOVUxMIHx8IHRhaWwoKS0+bmV4dCgpID09IE5VTEwsICJsaXN0IGludmFyaWFudCIpOwotICBDaHVuayogZmMgPSBoZWFkKCk7CisgIENodW5rX3QqIGZjID0gaGVhZCgpOwogICBpZiAoZmMgIT0gTlVMTCkgewotICAgIENodW5rKiBuZXh0RkMgPSBmYy0+bmV4dCgpOworICAgIENodW5rX3QqIG5leHRGQyA9IGZjLT5uZXh0KCk7CiAgICAgaWYgKG5leHRGQyAhPSBOVUxMKSB7CiAgICAgICAvLyBUaGUgY2h1bmsgZmMgYmVpbmcgcmVtb3ZlZCBoYXMgYSAibmV4dCIuICBTZXQgdGhlICJuZXh0IiB0byB0aGUKICAgICAgIC8vICJwcmV2IiBvZiBmYy4KQEAgLTE5NywxMSArMjEzLDYgQEAKICAgICBsaW5rX3RhaWwoY2h1bmspOwogICB9CiAgIGluY3JlbWVudF9jb3VudCgpOyAvLyBvZiAjIG9mIGNodW5rcyBpbiBsaXN0Ci0gIERFQlVHX09OTFkoCi0gICAgaWYgKHJlY29yZF9yZXR1cm4pIHsKLSAgICAgIGluY3JlbWVudF9yZXR1cm5lZF9ieXRlc19ieShzaXplKCkqSGVhcFdvcmRTaXplKTsKLSAgICB9Ci0gICkKICAgYXNzZXJ0KGhlYWQoKSA9PSBOVUxMIHx8IGhlYWQoKS0+cHJldigpID09IE5VTEwsICJsaXN0IGludmFyaWFudCIpOwogICBhc3NlcnQodGFpbCgpID09IE5VTEwgfHwgdGFpbCgpLT5uZXh0KCkgPT0gTlVMTCwgImxpc3QgaW52YXJpYW50Iik7CiAgIGFzc2VydChoZWFkKCkgPT0gTlVMTCB8fCBoZWFkKCktPnNpemUoKSA9PSBzaXplKCksICJ3cm9uZyBpdGVtIG9uIGxpc3QiKTsKQEAgLTIzMywxMSArMjQ0LDYgQEAKICAgfQogICBsaW5rX3RhaWwoY2h1bmspOwogICBpbmNyZW1lbnRfY291bnQoKTsgIC8vIG9mICMgb2YgY2h1bmtzIGluIGxpc3QKLSAgREVCVUdfT05MWSgKLSAgICBpZiAocmVjb3JkX3JldHVybikgewotICAgICAgaW5jcmVtZW50X3JldHVybmVkX2J5dGVzX2J5KHNpemUoKSpIZWFwV29yZFNpemUpOwotICAgIH0KLSAgKQogICBhc3NlcnQoaGVhZCgpID09IE5VTEwgfHwgaGVhZCgpLT5wcmV2KCkgPT0gTlVMTCwgImxpc3QgaW52YXJpYW50Iik7CiAgIGFzc2VydCh0YWlsKCkgPT0gTlVMTCB8fCB0YWlsKCktPm5leHQoKSA9PSBOVUxMLCAibGlzdCBpbnZhcmlhbnQiKTsKICAgYXNzZXJ0KGhlYWQoKSA9PSBOVUxMIHx8IGhlYWQoKS0+c2l6ZSgpID09IHNpemUoKSwgIndyb25nIGl0ZW0gb24gbGlzdCIpOwpAQCAtMjczLDcgKzI3OSw3IEBACiAgIH0KIH0KIAotLy8gdmVyaWZ5X2NodW5rX2luX2ZyZWVfbGlzdCgpIGlzIHVzZWQgdG8gdmVyaWZ5IHRoYXQgYW4gaXRlbSBpcyBpbiB0aGlzIGZyZWUgbGlzdC4KKy8vIHZlcmlmeV9jaHVua19pbl9mcmVlX2xpc3RzKCkgaXMgdXNlZCB0byB2ZXJpZnkgdGhhdCBhbiBpdGVtIGlzIGluIHRoaXMgZnJlZSBsaXN0LgogLy8gSXQgaXMgdXNlZCBhcyBhIGRlYnVnZ2luZyBhaWQuCiB0ZW1wbGF0ZSA8Y2xhc3MgQ2h1bms+CiBib29sIEZyZWVMaXN0PENodW5rPjo6dmVyaWZ5X2NodW5rX2luX2ZyZWVfbGlzdChDaHVuayogZmMpIGNvbnN0IHsKQEAgLTI5NCw0MCArMzAwLDE0IEBACiAKICNpZm5kZWYgUFJPRFVDVAogdGVtcGxhdGUgPGNsYXNzIENodW5rPgotdm9pZCBGcmVlTGlzdDxDaHVuaz46OnZlcmlmeV9zdGF0cygpIGNvbnN0IHsKLSAgLy8gVGhlICsxIG9mIHRoZSBMSCBjb21wYXJhbmQgaXMgdG8gYWxsb3cgc29tZSAibG9vc2VuZXNzIiBpbgotICAvLyBjaGVja2luZzogd2UgdXN1YWxseSBjYWxsIHRoaXMgaW50ZXJmYWNlIHdoZW4gYWRkaW5nIGEgYmxvY2sKLSAgLy8gYW5kIHdlJ2xsIHN1YnNlcXVlbnRseSB1cGRhdGUgdGhlIHN0YXRzOyB3ZSBjYW5ub3QgdXBkYXRlIHRoZQotICAvLyBzdGF0cyBiZWZvcmVoYW5kIGJlY2F1c2UgaW4gdGhlIGNhc2Ugb2YgdGhlIGxhcmdlLWJsb2NrIEJUCi0gIC8vIGRpY3Rpb25hcnkgZm9yIGV4YW1wbGUsIHRoaXMgbWlnaHQgYmUgdGhlIGZpcnN0IGJsb2NrIGFuZAotICAvLyBpbiB0aGF0IGNhc2UgdGhlcmUgd291bGQgYmUgbm8gcGxhY2UgdGhhdCB3ZSBjb3VsZCByZWNvcmQKLSAgLy8gdGhlIHN0YXRzICh3aGljaCBhcmUga2VwdCBpbiB0aGUgYmxvY2sgaXRzZWxmKS4KLSAgYXNzZXJ0KChfYWxsb2NhdGlvbl9zdGF0cy5wcmV2X3N3ZWVwKCkgKyBfYWxsb2NhdGlvbl9zdGF0cy5zcGxpdF9iaXJ0aHMoKQotICAgICAgICAgICsgX2FsbG9jYXRpb25fc3RhdHMuY29hbF9iaXJ0aHMoKSArIDEpICAgLy8gVG90YWwgUHJvZHVjdGlvbiBTdG9jayArIDEKLSAgICAgICAgID49IChfYWxsb2NhdGlvbl9zdGF0cy5zcGxpdF9kZWF0aHMoKSArIF9hbGxvY2F0aW9uX3N0YXRzLmNvYWxfZGVhdGhzKCkKLSAgICAgICAgICAgICArIChzc2l6ZV90KWNvdW50KCkpLCAgICAgICAgICAgICAgICAvLyBUb3RhbCBDdXJyZW50IFN0b2NrICsgZGVwbGV0aW9uCi0gICAgICAgICBlcnJfbXNnKCJGcmVlTGlzdCAiIFBUUl9GT1JNQVQgIiBvZiBzaXplICIgU0laRV9GT1JNQVQKLSAgICAgICAgICAgICAgICAgIiB2aW9sYXRlcyBDb25zZXJ2YXRpb24gUHJpbmNpcGxlOiAiCi0gICAgICAgICAgICAgICAgICJwcmV2X3N3ZWVwKCIgU0laRV9GT1JNQVQgIikiCi0gICAgICAgICAgICAgICAgICIgKyBzcGxpdF9iaXJ0aHMoIiBTSVpFX0ZPUk1BVCAiKSIKLSAgICAgICAgICAgICAgICAgIiArIGNvYWxfYmlydGhzKCIgU0laRV9GT1JNQVQgIikgKyAxID49ICIKLSAgICAgICAgICAgICAgICAgIiBzcGxpdF9kZWF0aHMoIiBTSVpFX0ZPUk1BVCAiKSIKLSAgICAgICAgICAgICAgICAgIiBjb2FsX2RlYXRocygiIFNJWkVfRk9STUFUICIpIgotICAgICAgICAgICAgICAgICAiICsgY291bnQoIiBTU0laRV9GT1JNQVQgIikiLAotICAgICAgICAgICAgICAgICB0aGlzLCBfc2l6ZSwgX2FsbG9jYXRpb25fc3RhdHMucHJldl9zd2VlcCgpLCBfYWxsb2NhdGlvbl9zdGF0cy5zcGxpdF9iaXJ0aHMoKSwKLSAgICAgICAgICAgICAgICAgX2FsbG9jYXRpb25fc3RhdHMuc3BsaXRfYmlydGhzKCksIF9hbGxvY2F0aW9uX3N0YXRzLnNwbGl0X2RlYXRocygpLAotICAgICAgICAgICAgICAgICBfYWxsb2NhdGlvbl9zdGF0cy5jb2FsX2RlYXRocygpLCBjb3VudCgpKSk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBDaHVuaz4KIHZvaWQgRnJlZUxpc3Q8Q2h1bms+Ojphc3NlcnRfcHJvcGVyX2xvY2tfcHJvdGVjdGlvbl93b3JrKCkgY29uc3QgewotICBhc3NlcnQoX3Byb3RlY3RpbmdfbG9jayAhPSBOVUxMLCAiRG9uJ3QgY2FsbCB0aGlzIGRpcmVjdGx5Iik7CisgIGFzc2VydChwcm90ZWN0aW5nX2xvY2soKSAhPSBOVUxMLCAiRG9uJ3QgY2FsbCB0aGlzIGRpcmVjdGx5Iik7CiAgIGFzc2VydChQYXJhbGxlbEdDVGhyZWFkcyA+IDAsICJEb24ndCBjYWxsIHRoaXMgZGlyZWN0bHkiKTsKICAgVGhyZWFkKiB0aHIgPSBUaHJlYWQ6OmN1cnJlbnQoKTsKICAgaWYgKHRoci0+aXNfVk1fdGhyZWFkKCkgfHwgdGhyLT5pc19Db25jdXJyZW50R0NfdGhyZWFkKCkpIHsKICAgICAvLyBhc3NlcnQgdGhhdCB3ZSBhcmUgaG9sZGluZyB0aGUgZnJlZWxpc3QgbG9jawogICB9IGVsc2UgaWYgKHRoci0+aXNfR0NfdGFza190aHJlYWQoKSkgewotICAgIGFzc2VydChfcHJvdGVjdGluZ19sb2NrLT5vd25lZF9ieV9zZWxmKCksICJGcmVlTGlzdCBSQUNFIERFVEVDVEVEIik7CisgICAgYXNzZXJ0KHByb3RlY3RpbmdfbG9jaygpLT5vd25lZF9ieV9zZWxmKCksICJGcmVlTGlzdCBSQUNFIERFVEVDVEVEIik7CiAgIH0gZWxzZSBpZiAodGhyLT5pc19KYXZhX3RocmVhZCgpKSB7CiAgICAgYXNzZXJ0KCFTYWZlcG9pbnRTeW5jaHJvbml6ZTo6aXNfYXRfc2FmZXBvaW50KCksICJTaG91bGQgbm90IGJlIGV4ZWN1dGluZyIpOwogICB9IGVsc2UgewpAQCAtMzUwLDIxICszMzAsMTcgQEAKIC8vIHRvIHRoZSBjYWxsIGlzIGEgbm9uLW51bGwgc3RyaW5nLCBpdCBpcyBwcmludGVkIGluIHRoZSBmaXJzdCBjb2x1bW47CiAvLyBvdGhlcndpc2UsIGlmIHRoZSBhcmd1bWVudCBpcyBudWxsICh0aGUgZGVmYXVsdCksIHRoZW4gdGhlIHNpemUgb2YgdGhlCiAvLyAoZnJlZSBsaXN0KSBibG9jayBpcyBwcmludGVkIGluIHRoZSBmaXJzdCBjb2x1bW4uCi10ZW1wbGF0ZSA8Y2xhc3MgQ2h1bms+Ci12b2lkIEZyZWVMaXN0PENodW5rPjo6cHJpbnRfb24ob3V0cHV0U3RyZWFtKiBzdCwgY29uc3QgY2hhciogYykgY29uc3QgewordGVtcGxhdGUgPGNsYXNzIENodW5rX3Q+Cit2b2lkIEZyZWVMaXN0PENodW5rX3Q+OjpwcmludF9vbihvdXRwdXRTdHJlYW0qIHN0LCBjb25zdCBjaGFyKiBjKSBjb25zdCB7CiAgIGlmIChjICE9IE5VTEwpIHsKICAgICBzdC0+cHJpbnQoIiUxNnMiLCBjKTsKICAgfSBlbHNlIHsKICAgICBzdC0+cHJpbnQoU0laRV9GT1JNQVRfVygxNiksIHNpemUoKSk7CiAgIH0KLSAgc3QtPnByaW50KCJcdCIKLSAgICAgICAgICAgU1NJWkVfRk9STUFUX1coMTQpICJcdCIgU1NJWkVfRk9STUFUX1coMTQpICJcdCIgU1NJWkVfRk9STUFUX1coMTQpICJcdCIgU1NJWkVfRk9STUFUX1coMTQpICJcdCIgU1NJWkVfRk9STUFUX1coMTQpICJcdCIKLSAgICAgICAgICAgU1NJWkVfRk9STUFUX1coMTQpICJcdCIgU1NJWkVfRk9STUFUX1coMTQpICJcdCIgU1NJWkVfRk9STUFUX1coMTQpICJcdCIgU1NJWkVfRk9STUFUX1coMTQpICJcdCIgU1NJWkVfRk9STUFUX1coMTQpICJcbiIsCi0gICAgICAgICAgIGJmcl9zdXJwKCksICAgICAgICAgICAgIHN1cnBsdXMoKSwgICAgICAgICAgICAgZGVzaXJlZCgpLCAgICAgICAgICAgICBwcmV2X3N3ZWVwKCksICAgICAgICAgICBiZWZvcmVfc3dlZXAoKSwKLSAgICAgICAgICAgY291bnQoKSwgICAgICAgICAgICAgICBjb2FsX2JpcnRocygpLCAgICAgICAgICBjb2FsX2RlYXRocygpLCAgICAgICAgICBzcGxpdF9iaXJ0aHMoKSwgICAgICAgICBzcGxpdF9kZWF0aHMoKSk7CiB9CiAKK3RlbXBsYXRlIGNsYXNzIEZyZWVMaXN0PE1ldGFibG9jaz47Cit0ZW1wbGF0ZSBjbGFzcyBGcmVlTGlzdDxNZXRhY2h1bms+OwogI2lmbmRlZiBTRVJJQUxHQwotLy8gTmVlZHMgdG8gYmUgYWZ0ZXIgdGhlIGRlZmluaXRpb25zIGhhdmUgYmVlbiBzZWVuLgogdGVtcGxhdGUgY2xhc3MgRnJlZUxpc3Q8RnJlZUNodW5rPjsKICNlbmRpZiAvLyBTRVJJQUxHQwpkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vbWVtb3J5L2ZyZWVMaXN0LmhwcCBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL21lbW9yeS9mcmVlTGlzdC5ocHAKaW5kZXggYTk4MmNmYi4uMzc0MzhjYyAxMDA2NDQKLS0tIGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vbWVtb3J5L2ZyZWVMaXN0LmhwcAorKysgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9tZW1vcnkvZnJlZUxpc3QuaHBwCkBAIC00MCwyMyArNDAsMTkgQEAKIC8vIGZvciB0aGF0IGltcGxlbWVudGF0aW9uLgogCiBjbGFzcyBNdXRleDsKLXRlbXBsYXRlIDxjbGFzcyBDaHVuaz4gY2xhc3MgVHJlZUxpc3Q7Ci10ZW1wbGF0ZSA8Y2xhc3MgQ2h1bms+IGNsYXNzIFByaW50VHJlZUNlbnN1c0Nsb3N1cmU7CiAKLXRlbXBsYXRlIDxjbGFzcyBDaHVuaz4KK3RlbXBsYXRlIDxjbGFzcyBDaHVua190PgogY2xhc3MgRnJlZUxpc3QgVkFMVUVfT0JKX0NMQVNTX1NQRUMgewogICBmcmllbmQgY2xhc3MgQ29tcGFjdGlibGVGcmVlTGlzdFNwYWNlOwogICBmcmllbmQgY2xhc3MgVk1TdHJ1Y3RzOwotICBmcmllbmQgY2xhc3MgUHJpbnRUcmVlQ2Vuc3VzQ2xvc3VyZTxDaHVuaz47CiAKICBwcml2YXRlOgotICBDaHVuayogICAgICAgIF9oZWFkOyAgICAgICAgICAvLyBIZWFkIG9mIGxpc3Qgb2YgZnJlZSBjaHVua3MKLSAgQ2h1bmsqICAgICAgICBfdGFpbDsgICAgICAgICAgLy8gVGFpbCBvZiBsaXN0IG9mIGZyZWUgY2h1bmtzCisgIENodW5rX3QqICAgICAgX2hlYWQ7ICAgICAgICAgIC8vIEhlYWQgb2YgbGlzdCBvZiBmcmVlIGNodW5rcworICBDaHVua190KiAgICAgIF90YWlsOyAgICAgICAgICAvLyBUYWlsIG9mIGxpc3Qgb2YgZnJlZSBjaHVua3MKICAgc2l6ZV90ICAgICAgICBfc2l6ZTsgICAgICAgICAgLy8gU2l6ZSBpbiBIZWFwIHdvcmRzIG9mIGVhY2ggY2h1bmsKICAgc3NpemVfdCAgICAgICBfY291bnQ7ICAgICAgICAgLy8gTnVtYmVyIG9mIGVudHJpZXMgaW4gbGlzdAotICBzaXplX3QgICAgICAgIF9oaW50OyAgICAgICAgICAvLyBuZXh0IGxhcmdlciBzaXplIGxpc3Qgd2l0aCBhIHBvc2l0aXZlIHN1cnBsdXMKIAotICBBbGxvY2F0aW9uU3RhdHMgX2FsbG9jYXRpb25fc3RhdHM7IC8vIGFsbG9jYXRpb24tcmVsYXRlZCBzdGF0aXN0aWNzCisgcHJvdGVjdGVkOgogCiAjaWZkZWYgQVNTRVJUCiAgIE11dGV4KiAgICAgICAgX3Byb3RlY3RpbmdfbG9jazsKQEAgLTcxLDEwICs2Nyw2IEBACiAjZW5kaWYKICAgfQogCi0gIC8vIEluaXRpYWxpemUgdGhlIGFsbG9jYXRpb24gc3RhdGlzdGljcy4KLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgaW5pdF9zdGF0aXN0aWNzKGJvb2wgc3BsaXRfYmlydGggPSBmYWxzZSk7Ci0gIHZvaWQgc2V0X2NvdW50KHNzaXplX3QgdikgeyBfY291bnQgPSB2O30KICAgdm9pZCBpbmNyZW1lbnRfY291bnQoKSAgICB7CiAgICAgX2NvdW50Kys7CiAgIH0KQEAgLTg5LDUyICs4MSw0OCBAQAogICAvLyBDb25zdHJ1Y3QgYSBsaXN0IHdpdGhvdXQgYW55IGVudHJpZXMuCiAgIEZyZWVMaXN0KCk7CiAgIC8vIENvbnN0cnVjdCBhIGxpc3Qgd2l0aCAiZmMiIGFzIHRoZSBmaXJzdCAoYW5kIGxvbmUpIGVudHJ5IGluIHRoZSBsaXN0LgotICBGcmVlTGlzdChDaHVuayogZmMpOworICBGcmVlTGlzdChDaHVua190KiBmYyk7CiAKLSAgLy8gUmVzZXQgdGhlIGhlYWQsIHRhaWwsIGhpbnQsIGFuZCBjb3VudCBvZiBhIGZyZWUgbGlzdC4KLSAgdm9pZCByZXNldChzaXplX3QgaGludCk7CisgIC8vIERvIGluaXRpYWxpemF0aW9uCisgIHZvaWQgaW5pdGlhbGl6ZSgpOworCisgIC8vIFJlc2V0IHRoZSBoZWFkLCB0YWlsLCBhbmQgY291bnQgb2YgYSBmcmVlIGxpc3QuCisgIHZvaWQgcmVzZXQoKTsKIAogICAvLyBEZWNsYXJlIHRoZSBjdXJyZW50IGZyZWUgbGlzdCB0byBiZSBwcm90ZWN0ZWQgYnkgdGhlIGdpdmVuIGxvY2suCiAjaWZkZWYgQVNTRVJUCi0gIHZvaWQgc2V0X3Byb3RlY3RpbmdfbG9jayhNdXRleCogcHJvdGVjdGluZ19sb2NrKSB7Ci0gICAgX3Byb3RlY3RpbmdfbG9jayA9IHByb3RlY3RpbmdfbG9jazsKKyAgTXV0ZXgqIHByb3RlY3RpbmdfbG9jaygpIGNvbnN0IHsgcmV0dXJuIF9wcm90ZWN0aW5nX2xvY2s7IH0KKyAgdm9pZCBzZXRfcHJvdGVjdGluZ19sb2NrKE11dGV4KiB2KSB7CisgICAgX3Byb3RlY3RpbmdfbG9jayA9IHY7CiAgIH0KICNlbmRpZgogCiAgIC8vIEFjY2Vzc29ycy4KLSAgQ2h1bmsqIGhlYWQoKSBjb25zdCB7CisgIENodW5rX3QqIGhlYWQoKSBjb25zdCB7CiAgICAgYXNzZXJ0X3Byb3Blcl9sb2NrX3Byb3RlY3Rpb24oKTsKICAgICByZXR1cm4gX2hlYWQ7CiAgIH0KLSAgdm9pZCBzZXRfaGVhZChDaHVuayogdikgeworICB2b2lkIHNldF9oZWFkKENodW5rX3QqIHYpIHsKICAgICBhc3NlcnRfcHJvcGVyX2xvY2tfcHJvdGVjdGlvbigpOwogICAgIF9oZWFkID0gdjsKICAgICBhc3NlcnQoIV9oZWFkIHx8IF9oZWFkLT5zaXplKCkgPT0gX3NpemUsICJiYWQgY2h1bmsgc2l6ZSIpOwogICB9CiAgIC8vIFNldCB0aGUgaGVhZCBvZiB0aGUgbGlzdCBhbmQgc2V0IHRoZSBwcmV2IGZpZWxkIG9mIG5vbi1udWxsCiAgIC8vIHZhbHVlcyB0byBOVUxMLgotICB2b2lkIGxpbmtfaGVhZChDaHVuayogdikgewotICAgIGFzc2VydF9wcm9wZXJfbG9ja19wcm90ZWN0aW9uKCk7Ci0gICAgc2V0X2hlYWQodik7Ci0gICAgLy8gSWYgdGhpcyBtZXRob2QgaXMgbm90IHVzZWQgKGp1c3Qgc2V0IHRoZSBoZWFkIGluc3RlYWQpLAotICAgIC8vIHRoaXMgY2hlY2sgY2FuIGJlIGF2b2lkZWQuCi0gICAgaWYgKHYgIT0gTlVMTCkgewotICAgICAgdi0+bGlua19wcmV2KE5VTEwpOwotICAgIH0KLSAgfQorICB2b2lkIGxpbmtfaGVhZChDaHVua190KiB2KTsKIAotICBDaHVuayogdGFpbCgpIGNvbnN0IHsKKyAgQ2h1bmtfdCogdGFpbCgpIGNvbnN0IHsKICAgICBhc3NlcnRfcHJvcGVyX2xvY2tfcHJvdGVjdGlvbigpOwogICAgIHJldHVybiBfdGFpbDsKICAgfQotICB2b2lkIHNldF90YWlsKENodW5rKiB2KSB7CisgIHZvaWQgc2V0X3RhaWwoQ2h1bmtfdCogdikgewogICAgIGFzc2VydF9wcm9wZXJfbG9ja19wcm90ZWN0aW9uKCk7CiAgICAgX3RhaWwgPSB2OwogICAgIGFzc2VydCghX3RhaWwgfHwgX3RhaWwtPnNpemUoKSA9PSBfc2l6ZSwgImJhZCBjaHVuayBzaXplIik7CiAgIH0KICAgLy8gU2V0IHRoZSB0YWlsIG9mIHRoZSBsaXN0IGFuZCBzZXQgdGhlIG5leHQgZmllbGQgb2Ygbm9uLW51bGwKICAgLy8gdmFsdWVzIHRvIE5VTEwuCi0gIHZvaWQgbGlua190YWlsKENodW5rKiB2KSB7CisgIHZvaWQgbGlua190YWlsKENodW5rX3QqIHYpIHsKICAgICBhc3NlcnRfcHJvcGVyX2xvY2tfcHJvdGVjdGlvbigpOwogICAgIHNldF90YWlsKHYpOwogICAgIGlmICh2ICE9IE5VTEwpIHsKQEAgLTE1MiwxNzQgKzE0MCw0NSBAQAogICAgIGFzc2VydF9wcm9wZXJfbG9ja19wcm90ZWN0aW9uKCk7CiAgICAgX3NpemUgPSB2OwogICB9Ci0gIHNzaXplX3QgY291bnQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIF9jb3VudDsKLSAgfQotICBzaXplX3QgaGludCgpIGNvbnN0IHsKLSAgICByZXR1cm4gX2hpbnQ7Ci0gIH0KLSAgdm9pZCBzZXRfaGludChzaXplX3QgdikgewotICAgIGFzc2VydF9wcm9wZXJfbG9ja19wcm90ZWN0aW9uKCk7Ci0gICAgYXNzZXJ0KHYgPT0gMCB8fCBfc2l6ZSA8IHYsICJCYWQgaGludCIpOyBfaGludCA9IHY7Ci0gIH0KKyAgc3NpemVfdCBjb3VudCgpIGNvbnN0IHsgcmV0dXJuIF9jb3VudDsgfQorICB2b2lkIHNldF9jb3VudChzc2l6ZV90IHYpIHsgX2NvdW50ID0gdjt9CiAKLSAgLy8gQWNjZXNzb3JzIGZvciBzdGF0aXN0aWNzCi0gIEFsbG9jYXRpb25TdGF0cyogYWxsb2NhdGlvbl9zdGF0cygpIHsKLSAgICBhc3NlcnRfcHJvcGVyX2xvY2tfcHJvdGVjdGlvbigpOwotICAgIHJldHVybiAmX2FsbG9jYXRpb25fc3RhdHM7Ci0gIH0KKyAgc2l6ZV90IGdldF9iZXR0ZXJfc2l6ZSgpIHsgcmV0dXJuIHNpemUoKTsgfQogCi0gIHNzaXplX3QgZGVzaXJlZCgpIGNvbnN0IHsKLSAgICByZXR1cm4gX2FsbG9jYXRpb25fc3RhdHMuZGVzaXJlZCgpOwotICB9Ci0gIHZvaWQgc2V0X2Rlc2lyZWQoc3NpemVfdCB2KSB7Ci0gICAgYXNzZXJ0X3Byb3Blcl9sb2NrX3Byb3RlY3Rpb24oKTsKLSAgICBfYWxsb2NhdGlvbl9zdGF0cy5zZXRfZGVzaXJlZCh2KTsKLSAgfQotICB2b2lkIGNvbXB1dGVfZGVzaXJlZChmbG9hdCBpbnRlcl9zd2VlcF9jdXJyZW50LAotICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBpbnRlcl9zd2VlcF9lc3RpbWF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgaW50cmFfc3dlZXBfZXN0aW1hdGUpIHsKLSAgICBhc3NlcnRfcHJvcGVyX2xvY2tfcHJvdGVjdGlvbigpOwotICAgIF9hbGxvY2F0aW9uX3N0YXRzLmNvbXB1dGVfZGVzaXJlZChfY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyX3N3ZWVwX2N1cnJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyX3N3ZWVwX2VzdGltYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRyYV9zd2VlcF9lc3RpbWF0ZSk7Ci0gIH0KLSAgc3NpemVfdCBjb2FsX2Rlc2lyZWQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIF9hbGxvY2F0aW9uX3N0YXRzLmNvYWxfZGVzaXJlZCgpOwotICB9Ci0gIHZvaWQgc2V0X2NvYWxfZGVzaXJlZChzc2l6ZV90IHYpIHsKLSAgICBhc3NlcnRfcHJvcGVyX2xvY2tfcHJvdGVjdGlvbigpOwotICAgIF9hbGxvY2F0aW9uX3N0YXRzLnNldF9jb2FsX2Rlc2lyZWQodik7Ci0gIH0KLQotICBzc2l6ZV90IHN1cnBsdXMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIF9hbGxvY2F0aW9uX3N0YXRzLnN1cnBsdXMoKTsKLSAgfQotICB2b2lkIHNldF9zdXJwbHVzKHNzaXplX3QgdikgewotICAgIGFzc2VydF9wcm9wZXJfbG9ja19wcm90ZWN0aW9uKCk7Ci0gICAgX2FsbG9jYXRpb25fc3RhdHMuc2V0X3N1cnBsdXModik7Ci0gIH0KLSAgdm9pZCBpbmNyZW1lbnRfc3VycGx1cygpIHsKLSAgICBhc3NlcnRfcHJvcGVyX2xvY2tfcHJvdGVjdGlvbigpOwotICAgIF9hbGxvY2F0aW9uX3N0YXRzLmluY3JlbWVudF9zdXJwbHVzKCk7Ci0gIH0KLSAgdm9pZCBkZWNyZW1lbnRfc3VycGx1cygpIHsKLSAgICBhc3NlcnRfcHJvcGVyX2xvY2tfcHJvdGVjdGlvbigpOwotICAgIF9hbGxvY2F0aW9uX3N0YXRzLmRlY3JlbWVudF9zdXJwbHVzKCk7Ci0gIH0KLQotICBzc2l6ZV90IGJmcl9zdXJwKCkgY29uc3QgewotICAgIHJldHVybiBfYWxsb2NhdGlvbl9zdGF0cy5iZnJfc3VycCgpOwotICB9Ci0gIHZvaWQgc2V0X2Jmcl9zdXJwKHNzaXplX3QgdikgewotICAgIGFzc2VydF9wcm9wZXJfbG9ja19wcm90ZWN0aW9uKCk7Ci0gICAgX2FsbG9jYXRpb25fc3RhdHMuc2V0X2Jmcl9zdXJwKHYpOwotICB9Ci0gIHNzaXplX3QgcHJldl9zd2VlcCgpIGNvbnN0IHsKLSAgICByZXR1cm4gX2FsbG9jYXRpb25fc3RhdHMucHJldl9zd2VlcCgpOwotICB9Ci0gIHZvaWQgc2V0X3ByZXZfc3dlZXAoc3NpemVfdCB2KSB7Ci0gICAgYXNzZXJ0X3Byb3Blcl9sb2NrX3Byb3RlY3Rpb24oKTsKLSAgICBfYWxsb2NhdGlvbl9zdGF0cy5zZXRfcHJldl9zd2VlcCh2KTsKLSAgfQotICBzc2l6ZV90IGJlZm9yZV9zd2VlcCgpIGNvbnN0IHsKLSAgICByZXR1cm4gX2FsbG9jYXRpb25fc3RhdHMuYmVmb3JlX3N3ZWVwKCk7Ci0gIH0KLSAgdm9pZCBzZXRfYmVmb3JlX3N3ZWVwKHNzaXplX3QgdikgewotICAgIGFzc2VydF9wcm9wZXJfbG9ja19wcm90ZWN0aW9uKCk7Ci0gICAgX2FsbG9jYXRpb25fc3RhdHMuc2V0X2JlZm9yZV9zd2VlcCh2KTsKLSAgfQotCi0gIHNzaXplX3QgY29hbF9iaXJ0aHMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIF9hbGxvY2F0aW9uX3N0YXRzLmNvYWxfYmlydGhzKCk7Ci0gIH0KLSAgdm9pZCBzZXRfY29hbF9iaXJ0aHMoc3NpemVfdCB2KSB7Ci0gICAgYXNzZXJ0X3Byb3Blcl9sb2NrX3Byb3RlY3Rpb24oKTsKLSAgICBfYWxsb2NhdGlvbl9zdGF0cy5zZXRfY29hbF9iaXJ0aHModik7Ci0gIH0KLSAgdm9pZCBpbmNyZW1lbnRfY29hbF9iaXJ0aHMoKSB7Ci0gICAgYXNzZXJ0X3Byb3Blcl9sb2NrX3Byb3RlY3Rpb24oKTsKLSAgICBfYWxsb2NhdGlvbl9zdGF0cy5pbmNyZW1lbnRfY29hbF9iaXJ0aHMoKTsKLSAgfQotCi0gIHNzaXplX3QgY29hbF9kZWF0aHMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIF9hbGxvY2F0aW9uX3N0YXRzLmNvYWxfZGVhdGhzKCk7Ci0gIH0KLSAgdm9pZCBzZXRfY29hbF9kZWF0aHMoc3NpemVfdCB2KSB7Ci0gICAgYXNzZXJ0X3Byb3Blcl9sb2NrX3Byb3RlY3Rpb24oKTsKLSAgICBfYWxsb2NhdGlvbl9zdGF0cy5zZXRfY29hbF9kZWF0aHModik7Ci0gIH0KLSAgdm9pZCBpbmNyZW1lbnRfY29hbF9kZWF0aHMoKSB7Ci0gICAgYXNzZXJ0X3Byb3Blcl9sb2NrX3Byb3RlY3Rpb24oKTsKLSAgICBfYWxsb2NhdGlvbl9zdGF0cy5pbmNyZW1lbnRfY29hbF9kZWF0aHMoKTsKLSAgfQotCi0gIHNzaXplX3Qgc3BsaXRfYmlydGhzKCkgY29uc3QgewotICAgIHJldHVybiBfYWxsb2NhdGlvbl9zdGF0cy5zcGxpdF9iaXJ0aHMoKTsKLSAgfQotICB2b2lkIHNldF9zcGxpdF9iaXJ0aHMoc3NpemVfdCB2KSB7Ci0gICAgYXNzZXJ0X3Byb3Blcl9sb2NrX3Byb3RlY3Rpb24oKTsKLSAgICBfYWxsb2NhdGlvbl9zdGF0cy5zZXRfc3BsaXRfYmlydGhzKHYpOwotICB9Ci0gIHZvaWQgaW5jcmVtZW50X3NwbGl0X2JpcnRocygpIHsKLSAgICBhc3NlcnRfcHJvcGVyX2xvY2tfcHJvdGVjdGlvbigpOwotICAgIF9hbGxvY2F0aW9uX3N0YXRzLmluY3JlbWVudF9zcGxpdF9iaXJ0aHMoKTsKLSAgfQotCi0gIHNzaXplX3Qgc3BsaXRfZGVhdGhzKCkgY29uc3QgewotICAgIHJldHVybiBfYWxsb2NhdGlvbl9zdGF0cy5zcGxpdF9kZWF0aHMoKTsKLSAgfQotICB2b2lkIHNldF9zcGxpdF9kZWF0aHMoc3NpemVfdCB2KSB7Ci0gICAgYXNzZXJ0X3Byb3Blcl9sb2NrX3Byb3RlY3Rpb24oKTsKLSAgICBfYWxsb2NhdGlvbl9zdGF0cy5zZXRfc3BsaXRfZGVhdGhzKHYpOwotICB9Ci0gIHZvaWQgaW5jcmVtZW50X3NwbGl0X2RlYXRocygpIHsKLSAgICBhc3NlcnRfcHJvcGVyX2xvY2tfcHJvdGVjdGlvbigpOwotICAgIF9hbGxvY2F0aW9uX3N0YXRzLmluY3JlbWVudF9zcGxpdF9kZWF0aHMoKTsKLSAgfQotCi0gIE5PVF9QUk9EVUNUKAotICAgIC8vIEZvciBkZWJ1Z2dpbmcuICBUaGUgIl9yZXR1cm5lZF9ieXRlcyIgaW4gYWxsIHRoZSBsaXN0cyBhcmUgc3VtbWVkCi0gICAgLy8gYW5kIGNvbXBhcmVkIHdpdGggdGhlIHRvdGFsIG51bWJlciBvZiBieXRlcyBzd2VwdCBkdXJpbmcgYQotICAgIC8vIGNvbGxlY3Rpb24uCi0gICAgc2l6ZV90IHJldHVybmVkX2J5dGVzKCkgY29uc3QgeyByZXR1cm4gX2FsbG9jYXRpb25fc3RhdHMucmV0dXJuZWRfYnl0ZXMoKTsgfQotICAgIHZvaWQgc2V0X3JldHVybmVkX2J5dGVzKHNpemVfdCB2KSB7IF9hbGxvY2F0aW9uX3N0YXRzLnNldF9yZXR1cm5lZF9ieXRlcyh2KTsgfQotICAgIHZvaWQgaW5jcmVtZW50X3JldHVybmVkX2J5dGVzX2J5KHNpemVfdCB2KSB7Ci0gICAgICBfYWxsb2NhdGlvbl9zdGF0cy5zZXRfcmV0dXJuZWRfYnl0ZXMoX2FsbG9jYXRpb25fc3RhdHMucmV0dXJuZWRfYnl0ZXMoKSArIHYpOwotICAgIH0KLSAgKQorICBzaXplX3QgcmV0dXJuZWRfYnl0ZXMoKSBjb25zdCB7IFNob3VsZE5vdFJlYWNoSGVyZSgpOyByZXR1cm4gMDsgfQorICB2b2lkIHNldF9yZXR1cm5lZF9ieXRlcyhzaXplX3Qgdikge30KKyAgdm9pZCBpbmNyZW1lbnRfcmV0dXJuZWRfYnl0ZXNfYnkoc2l6ZV90IHYpIHt9CiAKICAgLy8gVW5saW5rIGhlYWQgb2YgbGlzdCBhbmQgcmV0dXJuIGl0LiAgUmV0dXJucyBOVUxMIGlmCiAgIC8vIHRoZSBsaXN0IGlzIGVtcHR5LgotICBDaHVuayogZ2V0X2NodW5rX2F0X2hlYWQoKTsKKyAgQ2h1bmtfdCogZ2V0X2NodW5rX2F0X2hlYWQoKTsKIAogICAvLyBSZW1vdmUgdGhlIGZpcnN0ICJuIiBvciAiY291bnQiLCB3aGljaGV2ZXIgaXMgc21hbGxlciwgY2h1bmtzIGZyb20gdGhlCiAgIC8vIGxpc3QsIHNldHRpbmcgImZsIiwgd2hpY2ggaXMgcmVxdWlyZWQgdG8gYmUgZW1wdHksIHRvIHBvaW50IHRvIHRoZW0uCi0gIHZvaWQgZ2V0Rmlyc3ROQ2h1bmtzRnJvbUxpc3Qoc2l6ZV90IG4sIEZyZWVMaXN0PENodW5rPiogZmwpOworICB2b2lkIGdldEZpcnN0TkNodW5rc0Zyb21MaXN0KHNpemVfdCBuLCBGcmVlTGlzdDxDaHVua190PiogZmwpOwogCiAgIC8vIFVubGluayB0aGlzIGNodW5rIGZyb20gaXQncyBmcmVlIGxpc3QKLSAgdm9pZCByZW1vdmVfY2h1bmsoQ2h1bmsqIGZjKTsKKyAgdm9pZCByZW1vdmVfY2h1bmsoQ2h1bmtfdCogZmMpOwogCiAgIC8vIEFkZCB0aGlzIGNodW5rIHRvIHRoaXMgZnJlZSBsaXN0LgotICB2b2lkIHJldHVybl9jaHVua19hdF9oZWFkKENodW5rKiBmYyk7Ci0gIHZvaWQgcmV0dXJuX2NodW5rX2F0X3RhaWwoQ2h1bmsqIGZjKTsKKyAgdm9pZCByZXR1cm5fY2h1bmtfYXRfaGVhZChDaHVua190KiBmYyk7CisgIHZvaWQgcmV0dXJuX2NodW5rX2F0X3RhaWwoQ2h1bmtfdCogZmMpOwogCiAgIC8vIFNpbWlsYXIgdG8gcmV0dXJuQ2h1bmsqIGJ1dCBhbHNvIHJlY29yZHMgc29tZSBkaWFnbm9zdGljCiAgIC8vIGluZm9ybWF0aW9uLgotICB2b2lkIHJldHVybl9jaHVua19hdF9oZWFkKENodW5rKiBmYywgYm9vbCByZWNvcmRfcmV0dXJuKTsKLSAgdm9pZCByZXR1cm5fY2h1bmtfYXRfdGFpbChDaHVuayogZmMsIGJvb2wgcmVjb3JkX3JldHVybik7CisgIHZvaWQgcmV0dXJuX2NodW5rX2F0X2hlYWQoQ2h1bmtfdCogZmMsIGJvb2wgcmVjb3JkX3JldHVybik7CisgIHZvaWQgcmV0dXJuX2NodW5rX2F0X3RhaWwoQ2h1bmtfdCogZmMsIGJvb2wgcmVjb3JkX3JldHVybik7CiAKICAgLy8gUHJlcGVuZCAiZmwiICh3aG9zZSBzaXplIGlzIHJlcXVpcmVkIHRvIGJlIHRoZSBzYW1lIGFzIHRoYXQgb2YgInRoaXMiKQogICAvLyB0byB0aGUgZnJvbnQgb2YgInRoaXMiIGxpc3QuCi0gIHZvaWQgcHJlcGVuZChGcmVlTGlzdDxDaHVuaz4qIGZsKTsKKyAgdm9pZCBwcmVwZW5kKEZyZWVMaXN0PENodW5rX3Q+KiBmbCk7CiAKICAgLy8gVmVyaWZ5IHRoYXQgdGhlIGNodW5rIGlzIGluIHRoZSBsaXN0LgogICAvLyBmb3VuZC4gIFJldHVybiBOVUxMIGlmICJmYyIgaXMgbm90IGZvdW5kLgotICBib29sIHZlcmlmeV9jaHVua19pbl9mcmVlX2xpc3QoQ2h1bmsqIGZjKSBjb25zdDsKKyAgYm9vbCB2ZXJpZnlfY2h1bmtfaW5fZnJlZV9saXN0KENodW5rX3QqIGZjKSBjb25zdDsKIAogICAvLyBTdGF0cyB2ZXJpZmljYXRpb24KLSAgdm9pZCB2ZXJpZnlfc3RhdHMoKSBjb25zdCBQUk9EVUNUX1JFVFVSTjsKKy8vICB2b2lkIHZlcmlmeV9zdGF0cygpIGNvbnN0IHsgU2hvdWxkTm90UmVhY2hIZXJlKCk7IH07CiAKICAgLy8gUHJpbnRpbmcgc3VwcG9ydAogICBzdGF0aWMgdm9pZCBwcmludF9sYWJlbHNfb24ob3V0cHV0U3RyZWFtKiBzdCwgY29uc3QgY2hhciogYyk7CmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9zaGFyZS92bS9tZW1vcnkvbWV0YWJsb2NrLmhwcCBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL21lbW9yeS9tZXRhYmxvY2suaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyMGQzNjEKLS0tIC9kZXYvbnVsbAorKysgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9tZW1vcnkvbWV0YWJsb2NrLmhwcApAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQorICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQorICogcXVlc3Rpb25zLgorICoKKyAqLworI2lmbmRlZiBTSEFSRV9WTV9NRU1PUllfTUVUQUJMT0NLX0hQUAorI2RlZmluZSBTSEFSRV9WTV9NRU1PUllfTUVUQUJMT0NLX0hQUAorCisvLyBNZXRhYmxvY2sgYXJlIHRoZSB1bml0IG9mIGFsbG9jYXRpb24gZnJvbSBhIENodW5rLiAgSXQgaXMgaW5pdGlhbGl6ZWQKKy8vIHdpdGggdGhlIHNpemUgb2YgdGhlIHJlcXVlc3RlZCBhbGxvY2F0aW9uLiAgVGhhdCBzaXplIGlzIG92ZXJ3cml0dGVuCisvLyBvbmNlIHRoZSBhbGxvY2F0aW9uIHJldHVybnMuCisvLworLy8gQSBNZXRhYmxvY2sgbWF5IGJlIHJldXNlZCBieSBpdHMgU3BhY2VNYW5hZ2VyIGJ1dCBhcmUgbmV2ZXIgbW92ZWQgYmV0d2VlbgorLy8gU3BhY2VNYW5hZ2Vycy4gIFRoZXJlIGlzIG5vIGV4cGxpY2l0IGxpbmsgdG8gdGhlIE1ldGFjaHVuaworLy8gZnJvbSB3aGljaCBpdCB3YXMgYWxsb2NhdGVkLiAgTWV0YWJsb2NrIG1heSBiZSBkZWFsbG9jYXRlZCBhbmQKKy8vIHB1dCBvbiBhIGZyZWVsaXN0IGJ1dCB0aGUgc3BhY2UgaXMgbmV2ZXIgZnJlZWQsIHJhdGhlcgorLy8gdGhlIE1ldGFjaHVuayBpdCBpcyBhIHBhcnQgb2Ygd2lsbCBiZSBkZWFsbG9jYXRlZCB3aGVuIGl0J3MKKy8vIGFzc29jaWF0ZWQgY2xhc3MgbG9hZGVyIGlzIGNvbGxlY3RlZC4KKworY2xhc3MgTWV0YWJsb2NrIFZBTFVFX09CSl9DTEFTU19TUEVDIHsKKyAgZnJpZW5kIGNsYXNzIFZNU3RydWN0czsKKyBwcml2YXRlOgorICAvLyBVc2VkIHRvIGFsaWduIHRoZSBhbGxvY2F0aW9uIChzZWUgYmVsb3cpLgorICB1bmlvbiBibG9ja190IHsKKyAgICB2b2lkKiBfZGF0YVszXTsKKyAgICBzdHJ1Y3QgaGVhZGVyX3QgeworICAgICAgc2l6ZV90IF93b3JkX3NpemU7CisgICAgICBNZXRhYmxvY2sqIF9uZXh0OworICAgICAgTWV0YWJsb2NrKiBfcHJldjsKKyAgICB9IF9oZWFkZXI7CisgIH0gX2Jsb2NrOworICBzdGF0aWMgc2l6ZV90IF9taW5fYmxvY2tfYnl0ZV9zaXplOworICBzdGF0aWMgc2l6ZV90IF9vdmVyaGVhZDsKKworICB0eXBlZGVmIHVuaW9uIGJsb2NrX3QgQmxvY2s7CisgIHR5cGVkZWYgc3RydWN0IGhlYWRlcl90IEhlYWRlcjsKKyAgY29uc3QgQmxvY2sqIGJsb2NrKCkgY29uc3QgeyByZXR1cm4gJl9ibG9jazsgfQorICBjb25zdCBCbG9jazo6aGVhZGVyX3QqIGhlYWRlcigpIGNvbnN0IHsgcmV0dXJuICYoYmxvY2soKS0+X2hlYWRlcik7IH0KKyBwdWJsaWM6CisKKyAgc3RhdGljIE1ldGFibG9jayogaW5pdGlhbGl6ZShNZXRhV29yZCogcCwgc2l6ZV90IHdvcmRfc2l6ZSk7CisKKyAgLy8gVGhpcyBwbGFjZXMgdGhlIGJvZHkgb2YgdGhlIGJsb2NrIGF0IGEgMiB3b3JkIGJvdW5kYXJ5CisgIC8vIGJlY2F1c2UgZXZlcnkgYmxvY2sgc3RhcnRzIG9uIGEgMiB3b3JkIGJvdW5kYXJ5LiAgV29yayBvdXQKKyAgLy8gaG93IHRvIG1ha2UgdGhlIGJvZHkgb24gYSAyIHdvcmQgYm91bmRhcnkgaWYgdGhlIGJsb2NrCisgIC8vIHN0YXJ0cyBvbiBhIGFyYml0cmFyeSBib3VuZGFyeS4gIEpKSgorCisgIHNpemVfdCB3b3JkX3NpemUoKSBjb25zdCAgeyByZXR1cm4gaGVhZGVyKCktPl93b3JkX3NpemU7IH0KKyAgdm9pZCBzZXRfd29yZF9zaXplKHNpemVfdCB2KSB7IF9ibG9jay5faGVhZGVyLl93b3JkX3NpemUgPSB2OyB9CisgIHNpemVfdCBzaXplKCkgY29uc3Qgdm9sYXRpbGUgeyByZXR1cm4gX2Jsb2NrLl9oZWFkZXIuX3dvcmRfc2l6ZTsgfQorICB2b2lkIHNldF9zaXplKHNpemVfdCB2KSB7IF9ibG9jay5faGVhZGVyLl93b3JkX3NpemUgPSB2OyB9CisgIE1ldGFibG9jayogbmV4dCgpIGNvbnN0IHsgcmV0dXJuIGhlYWRlcigpLT5fbmV4dDsgfQorICB2b2lkIHNldF9uZXh0KE1ldGFibG9jayogdikgeyBfYmxvY2suX2hlYWRlci5fbmV4dCA9IHY7IH0KKyAgTWV0YWJsb2NrKiBwcmV2KCkgY29uc3QgeyByZXR1cm4gaGVhZGVyKCktPl9wcmV2OyB9CisgIHZvaWQgc2V0X3ByZXYoTWV0YWJsb2NrKiB2KSB7IF9ibG9jay5faGVhZGVyLl9wcmV2ID0gdjsgfQorCisgIHN0YXRpYyBzaXplX3QgbWluX2Jsb2NrX2J5dGVfc2l6ZSgpIHsgcmV0dXJuIF9taW5fYmxvY2tfYnl0ZV9zaXplOyB9CisgIHN0YXRpYyBzaXplX3Qgb3ZlcmhlYWQoKSB7IHJldHVybiBfb3ZlcmhlYWQ7IH0KKworICBib29sIGlzX2ZyZWUoKSAgICAgICAgICAgICAgICAgeyByZXR1cm4gaGVhZGVyKCktPl93b3JkX3NpemUgIT0gMDsgfQorICB2b2lkIGNsZWFyX25leHQoKSAgICAgICAgICAgICAgeyBzZXRfbmV4dChOVUxMKTsgfQorICB2b2lkIGxpbmtfcHJldihNZXRhYmxvY2sqIHB0cikgeyBzZXRfcHJldihwdHIpOyB9CisgIHVpbnRwdHJfdCogZW5kKCkgICAgICAgICAgICAgIHsgcmV0dXJuICgodWludHB0cl90KikgdGhpcykgKyBzaXplKCk7IH0KKyAgYm9vbCBjYW50Q29hbGVzY2UoKSBjb25zdCAgICAgeyByZXR1cm4gZmFsc2U7IH0KKyAgdm9pZCBsaW5rX25leHQoTWV0YWJsb2NrKiBwdHIpIHsgc2V0X25leHQocHRyKTsgfQorICB2b2lkIGxpbmtfYWZ0ZXIoTWV0YWJsb2NrKiBwdHIpeworICAgIGxpbmtfbmV4dChwdHIpOworICAgIGlmIChwdHIgIT0gTlVMTCkgcHRyLT5saW5rX3ByZXYodGhpcyk7CisgIH0KKworICAvLyBTaG91bGQgbm90IGJlIG5lZWRlZCBpbiBhIGZyZWUgbGlzdCBvZiBNZXRhYmxvY2tzCisgIHZvaWQgbWFya05vdEZyZWUoKSAgICAgICAgICAgIHsgU2hvdWxkTm90UmVhY2hIZXJlKCk7IH0KKworICAvLyBEZWJ1ZyBzdXBwb3J0CisjaWZkZWYgQVNTRVJUCisgIHZvaWQqIHByZXZfYWRkcigpIGNvbnN0IHsgcmV0dXJuICh2b2lkKikmX2Jsb2NrLl9oZWFkZXIuX3ByZXY7IH0KKyAgdm9pZCogbmV4dF9hZGRyKCkgY29uc3QgeyByZXR1cm4gKHZvaWQqKSZfYmxvY2suX2hlYWRlci5fbmV4dDsgfQorICB2b2lkKiBzaXplX2FkZHIoKSBjb25zdCB7IHJldHVybiAodm9pZCopJl9ibG9jay5faGVhZGVyLl93b3JkX3NpemU7IH0KKyNlbmRpZgorICBib29sIHZlcmlmeV9jaHVua19pbl9mcmVlX2xpc3QoTWV0YWJsb2NrKiB0YykgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorICBib29sIHZlcmlmeV9wYXJfbG9ja2VkKCkgeyByZXR1cm4gdHJ1ZTsgfQorCisgIHZvaWQgYXNzZXJ0X2lzX21hbmdsZWQoKSBjb25zdCB7LyogRG9uJ3QgY2hlY2sgIlwqL30KK307CisjZW5kaWYgLy8gU0hBUkVfVk1fTUVNT1JZX01FVEFCTE9DS19IUFAKZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL21lbW9yeS9tZXRhY2h1bmsuaHBwIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vbWVtb3J5L21ldGFjaHVuay5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ0NjE5NwotLS0gL2Rldi9udWxsCisrKyBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL21lbW9yeS9tZXRhY2h1bmsuaHBwCkBAIC0wLDAgKzEsMTMzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCisgKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CisgKiBxdWVzdGlvbnMuCisgKgorICovCisjaWZuZGVmIFNIQVJFX1ZNX01FTU9SWV9NRVRBQ0hVTktfSFBQCisjZGVmaW5lIFNIQVJFX1ZNX01FTU9SWV9NRVRBQ0hVTktfSFBQCisKKy8vICBNZXRhY2h1bmsgLSBRdWFudHVtIG9mIGFsbG9jYXRpb24gZnJvbSBhIFZpcnR1YWxzcGFjZQorLy8gICAgTWV0YWNodW5rcyBhcmUgcmV1c2VkICh3aGVuIGZyZWVkIGFyZSBwdXQgb24gYSBnbG9iYWwgZnJlZWxpc3QpIGFuZAorLy8gICAgaGF2ZSBubyBwZXJtYW5lbnQgYXNzb2NpYXRpb24gdG8gYSBTcGFjZU1hbmFnZXIuCisKKy8vICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tKyA8LSBlbmQKKy8vICAgICAgICAgICAgfCAgICAgICAgICAgICAgfCAgICAgICAgICAtLSsgICAgICAgLS0tKworLy8gICAgICAgICAgICB8ICAgICAgICAgICAgICB8ICAgICAgICAgICAgfCBmcmVlICAgICB8CisvLyAgICAgICAgICAgIHwgICAgICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgIHwKKy8vICAgICAgICAgICAgfCAgICAgICAgICAgICAgfCAgICAgICAgICAgIHwgICAgICAgICAgfCBjYXBhY2l0eQorLy8gICAgICAgICAgICB8ICAgICAgICAgICAgICB8ICAgICAgICAgICAgfCAgICAgICAgICB8CisvLyAgICAgICAgICAgIHwgICAgICAgICAgICAgIHwgPC0gdG9wICAgLS0rICAgICAgICAgIHwKKy8vICAgICAgICAgICAgfCAgICAgICAgICAgICAgfCAgICAgICAgICAgLS0tKyAgICAgICAgfAorLy8gICAgICAgICAgICB8ICAgICAgICAgICAgICB8ICAgICAgICAgICAgICB8IHVzZWQgICB8CisvLyAgICAgICAgICAgIHwgICAgICAgICAgICAgIHwgICAgICAgICAgICAgIHwgICAgICAgIHwKKy8vICAgICAgICAgICAgfCAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgfCAgICAgICAgfAorLy8gICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0rIDwtIGJvdHRvbSAtLS0rICAgICAtLS0rCisKK2NsYXNzIE1ldGFjaHVuayBWQUxVRV9PQkpfQ0xBU1NfU1BFQyB7CisgIC8vIGxpbmsgdG8gc3VwcG9ydCBsaXN0cyBvZiBjaHVua3MKKyAgTWV0YWNodW5rKiBfbmV4dDsKKyAgTWV0YWNodW5rKiBfcHJldjsKKworICBNZXRhV29yZCogX2JvdHRvbTsKKyAgTWV0YVdvcmQqIF9lbmQ7CisgIE1ldGFXb3JkKiBfdG9wOworICBzaXplX3QgX3dvcmRfc2l6ZTsKKyAgLy8gVXNlZCBpbiBhIGd1YXJhbnRlZSgpIHNvIGluY2x1ZGVkIGluIHRoZSBQcm9kdWN0IGJ1aWxkcworICAvLyBldmVuIHRocm91Z2ggaXQgaXMgb25seSBmb3IgZGVidWdnaW5nLgorICBib29sIF9pc19mcmVlOworCisgIC8vIE1ldGFjaHVua3MgYXJlIGFsbG9jYXRlZCBvdXQgb2YgYSBNZXRhZGF0YVZpcnR1YWxTcGFjZSBhbmQKKyAgLy8gYW5kIHVzZSBzb21lIG9mIGl0cyBzcGFjZSB0byBkZXNjcmliZSBpdHNlbGYgKHBsdXMgYWxpZ25tZW50CisgIC8vIGNvbnNpZGVyYXRpb25zKS4gIE1ldGFkYXRhIGlzIGFsbG9jYXRlZCBpbiB0aGUgcmVzdCBvZiB0aGUgY2h1bmsuCisgIC8vIFRoaXMgc2l6ZSBpcyB0aGUgb3ZlcmhlYWQgb2YgbWFpbnRhaW5pbmcgdGhlIE1ldGFjaHVuayB3aXRoaW4KKyAgLy8gdGhlIHNwYWNlLgorICBzdGF0aWMgc2l6ZV90IF9vdmVyaGVhZDsKKworICB2b2lkIHNldF9ib3R0b20oTWV0YVdvcmQqIHYpIHsgX2JvdHRvbSA9IHY7IH0KKyAgdm9pZCBzZXRfZW5kKE1ldGFXb3JkKiB2KSB7IF9lbmQgPSB2OyB9CisgIHZvaWQgc2V0X3RvcChNZXRhV29yZCogdikgeyBfdG9wID0gdjsgfQorICB2b2lkIHNldF93b3JkX3NpemUoc2l6ZV90IHYpIHsgX3dvcmRfc2l6ZSA9IHY7IH0KKyBwdWJsaWM6CisjaWZkZWYgQVNTRVJUCisgIE1ldGFjaHVuaygpIDogX2JvdHRvbShOVUxMKSwgX2VuZChOVUxMKSwgX3RvcChOVUxMKSwgX2lzX2ZyZWUoZmFsc2UpIHt9CisjZWxzZQorICBNZXRhY2h1bmsoKSA6IF9ib3R0b20oTlVMTCksIF9lbmQoTlVMTCksIF90b3AoTlVMTCkge30KKyNlbmRpZgorCisgIC8vIFVzZWQgdG8gYWRkIGEgTWV0YWNodW5rIHRvIGEgbGlzdCBvZiBNZXRhY2h1bmtzCisgIHZvaWQgc2V0X25leHQoTWV0YWNodW5rKiB2KSB7IF9uZXh0ID0gdjsgYXNzZXJ0KHYgIT0gdGhpcywgIkJvb20iKTt9CisgIHZvaWQgc2V0X3ByZXYoTWV0YWNodW5rKiB2KSB7IF9wcmV2ID0gdjsgYXNzZXJ0KHYgIT0gdGhpcywgIkJvb20iKTt9CisKKyAgTWV0YVdvcmQqIGFsbG9jYXRlKHNpemVfdCB3b3JkX3NpemUpOworICBzdGF0aWMgTWV0YWNodW5rKiBpbml0aWFsaXplKE1ldGFXb3JkKiBwdHIsIHNpemVfdCB3b3JkX3NpemUpOworCisgIC8vIEFjY2Vzc29ycworICBNZXRhY2h1bmsqIG5leHQoKSBjb25zdCB7IHJldHVybiBfbmV4dDsgfQorICBNZXRhY2h1bmsqIHByZXYoKSBjb25zdCB7IHJldHVybiBfcHJldjsgfQorICBNZXRhV29yZCogYm90dG9tKCkgY29uc3QgeyByZXR1cm4gX2JvdHRvbTsgfQorICBNZXRhV29yZCogZW5kKCkgY29uc3QgeyByZXR1cm4gX2VuZDsgfQorICBNZXRhV29yZCogdG9wKCkgY29uc3QgeyByZXR1cm4gX3RvcDsgfQorICBzaXplX3Qgd29yZF9zaXplKCkgY29uc3QgeyByZXR1cm4gX3dvcmRfc2l6ZTsgfQorICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHZvbGF0aWxlIHsgcmV0dXJuIF93b3JkX3NpemU7IH0KKyAgdm9pZCBzZXRfc2l6ZShzaXplX3QgdikgeyBfd29yZF9zaXplID0gdjsgfQorICBib29sIGlzX2ZyZWUoKSB7IHJldHVybiBfaXNfZnJlZTsgfQorICB2b2lkIHNldF9pc19mcmVlKGJvb2wgdikgeyBfaXNfZnJlZSA9IHY7IH0KKyAgc3RhdGljIHNpemVfdCBvdmVyaGVhZCgpIHsgcmV0dXJuIF9vdmVyaGVhZDsgfQorICB2b2lkIGNsZWFyX25leHQoKSAgICAgICAgICAgICAgeyBzZXRfbmV4dChOVUxMKTsgfQorICB2b2lkIGxpbmtfcHJldihNZXRhY2h1bmsqIHB0cikgeyBzZXRfcHJldihwdHIpOyB9CisgIHVpbnRwdHJfdCogZW5kKCkgICAgICAgICAgICAgIHsgcmV0dXJuICgodWludHB0cl90KikgdGhpcykgKyBzaXplKCk7IH0KKyAgYm9vbCBjYW50Q29hbGVzY2UoKSBjb25zdCAgICAgeyByZXR1cm4gZmFsc2U7IH0KKyAgdm9pZCBsaW5rX25leHQoTWV0YWNodW5rKiBwdHIpIHsgc2V0X25leHQocHRyKTsgfQorICB2b2lkIGxpbmtfYWZ0ZXIoTWV0YWNodW5rKiBwdHIpeworICAgIGxpbmtfbmV4dChwdHIpOworICAgIGlmIChwdHIgIT0gTlVMTCkgcHRyLT5saW5rX3ByZXYodGhpcyk7CisgIH0KKworICAvLyBSZXNldCB0b3AgdG8gYm90dG9tIHNvIGNodW5rIGNhbiBiZSByZXVzZWQuCisgIHZvaWQgcmVzZXRfZW1wdHkoKSB7IF90b3AgPSAoX2JvdHRvbSArIF9vdmVyaGVhZCk7IH0KKyAgYm9vbCBpc19lbXB0eSgpIHsgcmV0dXJuIF90b3AgPT0gKF9ib3R0b20gKyBfb3ZlcmhlYWQpOyB9CisKKyAgLy8gdXNlZCAoaGFzIGJlZW4gYWxsb2NhdGVkKQorICAvLyBmcmVlIChhdmFpbGFibGUgZm9yIGZ1dHVyZSBhbGxvY2F0aW9ucykKKyAgLy8gY2FwYWNpdHkgKHRvdGFsIHNpemUgb2YgY2h1bmspCisgIHNpemVfdCB1c2VkX3dvcmRfc2l6ZSgpOworICBzaXplX3QgZnJlZV93b3JkX3NpemUoKTsKKyAgc2l6ZV90IGNhcGFjaXR5X3dvcmRfc2l6ZSgpOworCisgIC8vIERlYnVnIHN1cHBvcnQKKyNpZmRlZiBBU1NFUlQKKyAgdm9pZCogcHJldl9hZGRyKCkgY29uc3QgeyByZXR1cm4gKHZvaWQqKSZfcHJldjsgfQorICB2b2lkKiBuZXh0X2FkZHIoKSBjb25zdCB7IHJldHVybiAodm9pZCopJl9uZXh0OyB9CisgIHZvaWQqIHNpemVfYWRkcigpIGNvbnN0IHsgcmV0dXJuICh2b2lkKikmX3dvcmRfc2l6ZTsgfQorI2VuZGlmCisgIGJvb2wgdmVyaWZ5X2NodW5rX2luX2ZyZWVfbGlzdChNZXRhY2h1bmsqIHRjKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisgIGJvb2wgdmVyaWZ5X3Bhcl9sb2NrZWQoKSB7IHJldHVybiB0cnVlOyB9CisKKyAgdm9pZCBhc3NlcnRfaXNfbWFuZ2xlZCgpIGNvbnN0IHsvKiBEb24ndCBjaGVjayAiXCovfQorCisjaWZkZWYgQVNTRVJUCisgIHZvaWQgbWFuZ2xlKCk7CisjZW5kaWYgLy8gQVNTRVJUCisKKyAgdm9pZCBwcmludF9vbihvdXRwdXRTdHJlYW0qIHN0KSBjb25zdDsKKyAgdm9pZCB2ZXJpZnkoKTsKK307CisjZW5kaWYgIC8vIFNIQVJFX1ZNX01FTU9SWV9NRVRBQ0hVTktfSFBQCmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9zaGFyZS92bS9tZW1vcnkvbWV0YXNwYWNlLmNwcCBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL21lbW9yeS9tZXRhc3BhY2UuY3BwCmluZGV4IDAzOTZlZWYuLmZjMjYwOWYgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL21lbW9yeS9tZXRhc3BhY2UuY3BwCisrKyBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL21lbW9yeS9tZXRhc3BhY2UuY3BwCkBAIC0yNCw5ICsyNCwxMiBAQAogI2luY2x1ZGUgInByZWNvbXBpbGVkLmhwcCIKICNpbmNsdWRlICJnY19pbnRlcmZhY2UvY29sbGVjdGVkSGVhcC5ocHAiCiAjaW5jbHVkZSAibWVtb3J5L2JpbmFyeVRyZWVEaWN0aW9uYXJ5LmhwcCIKKyNpbmNsdWRlICJtZW1vcnkvZnJlZUxpc3QuaHBwIgogI2luY2x1ZGUgIm1lbW9yeS9jb2xsZWN0b3JQb2xpY3kuaHBwIgogI2luY2x1ZGUgIm1lbW9yeS9maWxlbWFwLmhwcCIKICNpbmNsdWRlICJtZW1vcnkvZnJlZUxpc3QuaHBwIgorI2luY2x1ZGUgIm1lbW9yeS9tZXRhYmxvY2suaHBwIgorI2luY2x1ZGUgIm1lbW9yeS9tZXRhY2h1bmsuaHBwIgogI2luY2x1ZGUgIm1lbW9yeS9tZXRhc3BhY2UuaHBwIgogI2luY2x1ZGUgIm1lbW9yeS9tZXRhc3BhY2VTaGFyZWQuaHBwIgogI2luY2x1ZGUgIm1lbW9yeS9yZXNvdXJjZUFyZWEuaHBwIgpAQCAtMzcsMTUgKzQwLDggQEAKICNpbmNsdWRlICJ1dGlsaXRpZXMvY29weS5ocHAiCiAjaW5jbHVkZSAidXRpbGl0aWVzL2RlYnVnLmhwcCIKIAotLy8gRGVmaW5lIHRoaXMgbWFjcm8gdG8gZGVhbGxvY2F0ZSBNZXRhYmxvY2suICBJZiBub3QgZGVmaW5lZCwKLS8vIGJsb2NrcyBhcmUgbm90IHlldCBkZWFsbG9jYXRlZCBhbmQgYXJlIG9ubHkgbWFuZ2xlZC4KLSN1bmRlZiBERUFMTE9DQVRFX0JMT0NLUwotCi0vLyBFYXNpbHkgcmVjb2duaXphYmxlIHBhdHRlcm5zCi0vLyBUaGVzZSBwYXR0ZXJucyBjYW4gYmUgdGhlIHNhbWUgaW4gMzJiaXQgb3IgNjRiaXQgc2luY2UKLS8vIHRoZXkgb25seSBoYXZlIHRvIGJlIGVhc2lseSByZWNvZ25pemFibGUuCi1jb25zdCB2b2lkKiBtZXRhc3BhY2VfYWxsb2NhdGlvbl9sZWFkZXIgPSAodm9pZCopIDBYMTExMTExMTE7Ci1jb25zdCB2b2lkKiBtZXRhc3BhY2VfYWxsb2NhdGlvbl90cmFpbGVyID0gKHZvaWQqKSAwWDc3Nzc3Nzc3OwordHlwZWRlZiBCaW5hcnlUcmVlRGljdGlvbmFyeTxNZXRhYmxvY2ssIEZyZWVMaXN0PiBCbG9ja1RyZWVEaWN0aW9uYXJ5OwordHlwZWRlZiBCaW5hcnlUcmVlRGljdGlvbmFyeTxNZXRhY2h1bmssIEZyZWVMaXN0PiBDaHVua1RyZWVEaWN0aW9uYXJ5OwogCiAvLyBQYXJhbWV0ZXJzIGZvciBzdHJlc3MgbW9kZSB0ZXN0aW5nCiBjb25zdCB1aW50IG1ldGFkYXRhX2RlYWxsb2NhdGVfYV9sb3RfYmxvY2sgPSAxMDsKQEAgLTUzLDcgKzQ5LDYgQEAKIHNpemVfdCBjb25zdCBhbGxvY2F0aW9uX2Zyb21fZGljdGlvbmFyeV9saW1pdCA9IDY0ICogSzsKIGNvbnN0IHNpemVfdCBtZXRhZGF0YV9jaHVua19pbml0aWFsaXplID0gMHhmN2Y3ZjdmNzsKIGNvbnN0IHNpemVfdCBtZXRhZGF0YV9kZWFsbG9jYXRlID0gMHhmNWY1ZjVmNTsKLWNvbnN0IHNpemVfdCBtZXRhZGF0YV9zcGFjZV9tYW5hZ2VyX2FsbG9jYXRlID0gMHhmM2YzZjNmMzsKIAogTWV0YVdvcmQqIGxhc3RfYWxsb2NhdGVkID0gMDsKIApAQCAtNjIsMTEgKzU3LDEyIEBACiAgIFNtYWxsSW5kZXggPSAwLAogICBNZWRpdW1JbmRleCA9IDEsCiAgIEh1bW9uZ291c0luZGV4ID0gMiwKLSAgTnVtYmVyT2ZGcmVlTGlzdHMgPSAzCisgIE51bWJlck9mRnJlZUxpc3RzID0gMiwKKyAgTnVtYmVyT2ZJblVzZUxpc3RzID0gMwogfTsKIAogc3RhdGljIENodW5rSW5kZXggbmV4dF9jaHVua19pbmRleChDaHVua0luZGV4IGkpIHsKLSAgYXNzZXJ0KGkgPCBOdW1iZXJPZkZyZWVMaXN0cywgIk91dCBvZiBib3VuZCIpOworICBhc3NlcnQoaSA8IE51bWJlck9mSW5Vc2VMaXN0cywgIk91dCBvZiBib3VuZCIpOwogICByZXR1cm4gKENodW5rSW5kZXgpIChpKzEpOwogfQogCkBAIC0xMDAsMTY0ICs5NiwxMyBAQAogLy8gdGhlIENodW5rIGFmdGVyIHRoZSBoZWFkZXIgZm9yIHRoZSBDaHVuaykgd2hlcmUgYXMgTWV0YWNodW5rcwogLy8gcG9pbnQgdG8gc3BhY2UgaW4gYSBWaXJ0dWFsU3BhY2UuICBUbyByZXBsYWNlIE1ldGFjaHVua3Mgd2l0aAogLy8gQ2h1bmtzLCBjaGFuZ2UgQ2h1bmtzIHNvIHRoYXQgdGhleSBjYW4gYmUgYWxsb2NhdGVkIG91dCBvZiBhIFZpcnR1YWxTcGFjZS4KLS8vCi0KLS8vIE1ldGFibG9jayBhcmUgdGhlIHVuaXQgb2YgYWxsb2NhdGlvbiBmcm9tIGEgQ2h1bmsuICBJdCBjb250YWlucwotLy8gdGhlIHNpemUgb2YgdGhlIHJlcXVlc3RlZCBhbGxvY2F0aW9uIGluIGEgZGVidWcgYnVpbGQuCi0vLyBBbHNvIGluIGEgZGVidWcgYnVpbGQgaXQgaGFzIGEgbWFya2VyIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlCi0vLyBib2R5IG9mIHRoZSBibG9jay4gVGhlIGFkZHJlc3Mgb2YgdGhlIGJvZHkgaXMgdGhlIGFkZHJlc3MgcmV0dXJuZWQKLS8vIGJ5IHRoZSBhbGxvY2F0aW9uLgotLy8KLS8vIExheW91dCBpbiBhIGRlYnVnIGJ1aWxkLiAgSW4gYSBwcm9kdWN0IGJ1aWxkIG9ubHkgdGhlIGJvZHkgaXMgcHJlc2VudC4KLS8vCi0vLyAgICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSsgICAgICstLS0tLS0tLS0tLSsKLS8vICAgICB8IHdvcmQgc2l6ZSB8IGxlYWRlciAgICB8IGJvZHkgICAgICAgfCAuLi4gfCB0cmFpbGVyICAgfAotLy8gICAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rICAgICArLS0tLS0tLS0tLS0rCi0vLwotLy8gQSBNZXRhYmxvY2sgbWF5IGJlIHJldXNlZCBieSBpdHMgU3BhY2VNYW5hZ2VyIGJ1dCBhcmUgbmV2ZXIgbW92ZWQgYmV0d2VlbgotLy8gU3BhY2VNYW5hZ2Vycy4gIFRoZXJlIGlzIG5vIGV4cGxpY2l0IGxpbmsgdG8gdGhlIE1ldGFjaHVuawotLy8gZnJvbSB3aGljaCBpdCB3YXMgYWxsb2NhdGVkLiAgTWV0YWJsb2NrIGFyZSBub3QgZGVhbGxvY2F0ZWQsIHJhdGhlcgotLy8gdGhlIE1ldGFjaHVuayBpdCBpcyBhIHBhcnQgb2Ygd2lsbCBiZSBkZWFsbG9jYXRlZCB3aGVuIGl0J3MKLS8vIGFzc29jaWF0ZWQgY2xhc3MgbG9hZGVyIGlzIGNvbGxlY3RlZC4KLS8vCi0vLyBXaGVuIHRoZSB3b3JkIHNpemUgb2YgYSBibG9jayBpcyBwYXNzZWQgaW4gdG8gdGhlIGRlYWxsb2NhdGlvbgotLy8gY2FsbCB0aGUgd29yZCBzaXplIG5vIGxvbmdlciBuZWVkcyB0byBiZSBwYXJ0IG9mIGEgTWV0YWJsb2NrLgotCi1jbGFzcyBNZXRhYmxvY2sgewotICBmcmllbmQgY2xhc3MgVk1TdHJ1Y3RzOwotIHByaXZhdGU6Ci0gIC8vIFVzZWQgdG8gYWxpZ24gdGhlIGFsbG9jYXRpb24gKHNlZSBiZWxvdykgYW5kIGZvciBkZWJ1Z2dpbmcuCitzaXplX3QgTWV0YWJsb2NrOjpfbWluX2Jsb2NrX2J5dGVfc2l6ZSA9IHNpemVvZihNZXRhYmxvY2spOwogI2lmZGVmIEFTU0VSVAotICBzdHJ1Y3QgewotICAgIHNpemVfdCBfd29yZF9zaXplOwotICAgIHZvaWQqICBfbGVhZGVyOwotICB9IF9oZWFkZXI7Ci0gIHZvaWQqIF9kYXRhWzFdOwotI2VuZGlmCi0gIHN0YXRpYyBzaXplX3QgX292ZXJoZWFkOwotCi0jaWZkZWYgQVNTRVJUCi0gIHZvaWQgc2V0X3dvcmRfc2l6ZShzaXplX3QgdikgeyBfaGVhZGVyLl93b3JkX3NpemUgPSB2OyB9Ci0gIHZvaWQqIGxlYWRlcigpIHsgcmV0dXJuIF9oZWFkZXIuX2xlYWRlcjsgfQotICB2b2lkKiB0cmFpbGVyKCkgewotICAgIGpsb25nIGluZGV4ID0gKGpsb25nKSBfaGVhZGVyLl93b3JkX3NpemUgLSBzaXplb2YoX2hlYWRlcikvQnl0ZXNQZXJXb3JkIC0gMTsKLSAgICBhc3NlcnQoaW5kZXggPiAwLCBlcnJfbXNnKCJCYWQgaW5kZXhsaW5nIG9mIHRyYWlsZXIgJWQiLCBpbmRleCkpOwotICAgIHZvaWQqKiBwdHIgPSAmX2RhdGFbaW5kZXhdOwotICAgIHJldHVybiAqcHRyOwotICB9Ci0gIHZvaWQgc2V0X2xlYWRlcih2b2lkKiB2KSB7IF9oZWFkZXIuX2xlYWRlciA9IHY7IH0KLSAgdm9pZCBzZXRfdHJhaWxlcih2b2lkKiB2KSB7Ci0gICAgdm9pZCoqIHB0ciA9ICZfZGF0YVtfaGVhZGVyLl93b3JkX3NpemUgLSBzaXplb2YoX2hlYWRlcikvQnl0ZXNQZXJXb3JkIC0gMV07Ci0gICAgKnB0ciA9IHY7Ci0gIH0KLSBwdWJsaWM6Ci0gIHNpemVfdCB3b3JkX3NpemUoKSB7IHJldHVybiBfaGVhZGVyLl93b3JkX3NpemU7IH0KLSNlbmRpZgotIHB1YmxpYzoKLQotICBzdGF0aWMgTWV0YWJsb2NrKiBpbml0aWFsaXplKE1ldGFXb3JkKiBwLCBzaXplX3Qgd29yZF9zaXplKTsKLQotICAvLyBUaGlzIHBsYWNlcyB0aGUgYm9keSBvZiB0aGUgYmxvY2sgYXQgYSAyIHdvcmQgYm91bmRhcnkKLSAgLy8gYmVjYXVzZSBldmVyeSBibG9jayBzdGFydHMgb24gYSAyIHdvcmQgYm91bmRhcnkuICBXb3JrIG91dAotICAvLyBob3cgdG8gbWFrZSB0aGUgYm9keSBvbiBhIDIgd29yZCBib3VuZGFyeSBpZiB0aGUgYmxvY2sKLSAgLy8gc3RhcnRzIG9uIGEgYXJiaXRyYXJ5IGJvdW5kYXJ5LiAgSkpKCi0KLSNpZmRlZiBBU1NFUlQKLSAgTWV0YVdvcmQqIGRhdGEoKSB7IHJldHVybiAoTWV0YVdvcmQqKSAmX2RhdGFbMF07IH0KKyAgc2l6ZV90IE1ldGFibG9jazo6X292ZXJoZWFkID0KKyAgICBDaHVuazo6YWxpZ25lZF9vdmVyaGVhZF9zaXplKHNpemVvZihNZXRhYmxvY2spKSAvIEJ5dGVzUGVyV29yZDsKICNlbHNlCi0gIE1ldGFXb3JkKiBkYXRhKCkgeyByZXR1cm4gKE1ldGFXb3JkKikgdGhpczsgfQorICBzaXplX3QgTWV0YWJsb2NrOjpfb3ZlcmhlYWQgPSAwOwogI2VuZGlmCi0gIHN0YXRpYyBNZXRhYmxvY2sqIG1ldGFibG9ja19mcm9tX2RhdGEoTWV0YVdvcmQqIHApIHsKLSNpZmRlZiBBU1NFUlQKLSAgICBzaXplX3Qgd29yZF9vZmZzZXQgPSBvZmZzZXRfb2YoTWV0YWJsb2NrLCBfZGF0YSkvQnl0ZXNQZXJXb3JkOwotICAgIE1ldGFibG9jayogcmVzdWx0ID0gKE1ldGFibG9jayopIChwIC0gd29yZF9vZmZzZXQpOwotICAgIHJldHVybiByZXN1bHQ7Ci0jZWxzZQotICAgIHJldHVybiAoTWV0YWJsb2NrKikgcDsKLSNlbmRpZgotICB9Ci0KLSAgc3RhdGljIHNpemVfdCBvdmVyaGVhZCgpIHsgcmV0dXJuIF9vdmVyaGVhZDsgfQotICB2b2lkIHZlcmlmeSgpOwotfTsKLQotLy8gIE1ldGFjaHVuayAtIFF1YW50dW0gb2YgYWxsb2NhdGlvbiBmcm9tIGEgVmlydHVhbHNwYWNlCi0vLyAgICBNZXRhY2h1bmtzIGFyZSByZXVzZWQgKHdoZW4gZnJlZWQgYXJlIHB1dCBvbiBhIGdsb2JhbCBmcmVlbGlzdCkgYW5kCi0vLyAgICBoYXZlIG5vIHBlcm1hbmVudCBhc3NvY2lhdGlvbiB0byBhIFNwYWNlTWFuYWdlci4KLQotLy8gICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0rIDwtIGVuZAotLy8gICAgICAgICAgICB8ICAgICAgICAgICAgICB8ICAgICAgICAgIC0tKyAgICAgICAtLS0rCi0vLyAgICAgICAgICAgIHwgICAgICAgICAgICAgIHwgICAgICAgICAgICB8IGZyZWUgICAgIHwKLS8vICAgICAgICAgICAgfCAgICAgICAgICAgICAgfCAgICAgICAgICAgIHwgICAgICAgICAgfAotLy8gICAgICAgICAgICB8ICAgICAgICAgICAgICB8ICAgICAgICAgICAgfCAgICAgICAgICB8IGNhcGFjaXR5Ci0vLyAgICAgICAgICAgIHwgICAgICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgIHwKLS8vICAgICAgICAgICAgfCAgICAgICAgICAgICAgfCA8LSB0b3AgICAtLSsgICAgICAgICAgfAotLy8gICAgICAgICAgICB8ICAgICAgICAgICAgICB8ICAgICAgICAgICAtLS0rICAgICAgICB8Ci0vLyAgICAgICAgICAgIHwgICAgICAgICAgICAgIHwgICAgICAgICAgICAgIHwgdXNlZCAgIHwKLS8vICAgICAgICAgICAgfCAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgfCAgICAgICAgfAotLy8gICAgICAgICAgICB8ICAgICAgICAgICAgICB8ICAgICAgICAgICAgICB8ICAgICAgICB8Ci0vLyAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLSsgPC0gYm90dG9tIC0tLSsgICAgIC0tLSsKLQotY2xhc3MgTWV0YWNodW5rIFZBTFVFX09CSl9DTEFTU19TUEVDIHsKLSAgLy8gbGluayB0byBzdXBwb3J0IGxpc3RzIG9mIGNodW5rcwotICBNZXRhY2h1bmsqIF9uZXh0OwotCi0gIE1ldGFXb3JkKiBfYm90dG9tOwotICBNZXRhV29yZCogX2VuZDsKLSAgTWV0YVdvcmQqIF90b3A7Ci0gIHNpemVfdCBfd29yZF9zaXplOwotCi0gIC8vIE1ldGFjaHVua3MgYXJlIGFsbG9jYXRlZCBvdXQgb2YgYSBNZXRhZGF0YVZpcnR1YWxTcGFjZSBhbmQKLSAgLy8gYW5kIHVzZSBzb21lIG9mIGl0cyBzcGFjZSB0byBkZXNjcmliZSBpdHNlbGYgKHBsdXMgYWxpZ25tZW50Ci0gIC8vIGNvbnNpZGVyYXRpb25zKS4gIE1ldGFkYXRhIGlzIGFsbG9jYXRlZCBpbiB0aGUgcmVzdCBvZiB0aGUgY2h1bmsuCi0gIC8vIFRoaXMgc2l6ZSBpcyB0aGUgb3ZlcmhlYWQgb2YgbWFpbnRhaW5pbmcgdGhlIE1ldGFjaHVuayB3aXRoaW4KLSAgLy8gdGhlIHNwYWNlLgotICBzdGF0aWMgc2l6ZV90IF9vdmVyaGVhZDsKLQotICB2b2lkIHNldF9ib3R0b20oTWV0YVdvcmQqIHYpIHsgX2JvdHRvbSA9IHY7IH0KLSAgdm9pZCBzZXRfZW5kKE1ldGFXb3JkKiB2KSB7IF9lbmQgPSB2OyB9Ci0gIHZvaWQgc2V0X3RvcChNZXRhV29yZCogdikgeyBfdG9wID0gdjsgfQotICB2b2lkIHNldF93b3JkX3NpemUoc2l6ZV90IHYpIHsgX3dvcmRfc2l6ZSA9IHY7IH0KLSBwdWJsaWM6Ci0KLSAgLy8gVXNlZCB0byBhZGQgYSBNZXRhY2h1bmsgdG8gYSBsaXN0IG9mIE1ldGFjaHVua3MKLSAgdm9pZCBzZXRfbmV4dChNZXRhY2h1bmsqIHYpIHsgX25leHQgPSB2OyBhc3NlcnQodiAhPSB0aGlzLCAiQm9vbSIpO30KLQotICBNZXRhYmxvY2sqIGFsbG9jYXRlKHNpemVfdCB3b3JkX3NpemUpOwotICBzdGF0aWMgTWV0YWNodW5rKiBpbml0aWFsaXplKE1ldGFXb3JkKiBwdHIsIHNpemVfdCB3b3JkX3NpemUpOwotCi0gIC8vIEFjY2Vzc29ycwotICBNZXRhY2h1bmsqIG5leHQoKSBjb25zdCB7IHJldHVybiBfbmV4dDsgfQotICBNZXRhV29yZCogYm90dG9tKCkgY29uc3QgeyByZXR1cm4gX2JvdHRvbTsgfQotICBNZXRhV29yZCogZW5kKCkgY29uc3QgeyByZXR1cm4gX2VuZDsgfQotICBNZXRhV29yZCogdG9wKCkgY29uc3QgeyByZXR1cm4gX3RvcDsgfQotICBzaXplX3Qgd29yZF9zaXplKCkgY29uc3QgeyByZXR1cm4gX3dvcmRfc2l6ZTsgfQotICBzdGF0aWMgc2l6ZV90IG92ZXJoZWFkKCkgeyByZXR1cm4gX292ZXJoZWFkOyB9Ci0KLSAgLy8gUmVzZXQgdG9wIHRvIGJvdHRvbSBzbyBjaHVuayBjYW4gYmUgcmV1c2VkLgotICB2b2lkIHJlc2V0X2VtcHR5KCkgeyBfdG9wID0gKF9ib3R0b20gKyBfb3ZlcmhlYWQpOyB9Ci0gIGJvb2wgaXNfZW1wdHkoKSB7IHJldHVybiBfdG9wID09IChfYm90dG9tICsgX292ZXJoZWFkKTsgfQotCi0gIC8vIHVzZWQgKGhhcyBiZWVuIGFsbG9jYXRlZCkKLSAgLy8gZnJlZSAoYXZhaWxhYmxlIGZvciBmdXR1cmUgYWxsb2NhdGlvbnMpCi0gIC8vIGNhcGFjaXR5ICh0b3RhbCBzaXplIG9mIGNodW5rKQotICBzaXplX3QgdXNlZF93b3JkX3NpemUoKTsKLSAgc2l6ZV90IGZyZWVfd29yZF9zaXplKCk7Ci0gIHNpemVfdCBjYXBhY2l0eV93b3JkX3NpemUoKTsKLQotI2lmZGVmIEFTU0VSVAotICB2b2lkIG1hbmdsZSgpIHsKLSAgICAvLyBNYW5nbGUgdGhlIHBheWxvYWQgb2YgdGhlIGNodW5rIGFuZCBub3QgdGhlIGxpbmtzIHRoYXQKLSAgICAvLyBtYWludGFpbiBsaXN0IG9mIGNodW5rcy4KLSAgICBIZWFwV29yZCogc3RhcnQgPSAoSGVhcFdvcmQqKShib3R0b20oKSArIG92ZXJoZWFkKCkpOwotICAgIHNpemVfdCB3b3JkX3NpemUgPSBjYXBhY2l0eV93b3JkX3NpemUoKSAtIG92ZXJoZWFkKCk7Ci0gICAgQ29weTo6ZmlsbF90b193b3JkcyhzdGFydCwgd29yZF9zaXplLCBtZXRhZGF0YV9jaHVua19pbml0aWFsaXplKTsKLSAgfQotI2VuZGlmIC8vIEFTU0VSVAotCi0gIHZvaWQgcHJpbnRfb24ob3V0cHV0U3RyZWFtKiBzdCkgY29uc3Q7Ci0gIHZvaWQgdmVyaWZ5KCk7Ci19OwogCiAKIC8vIFBvaW50ZXIgdG8gbGlzdCBvZiBNZXRhY2h1bmtzLgpAQCAtMjkyLDcgKzEzNywxMCBAQAogICAvLyAgIFNtYWxsQ2h1bmsKICAgLy8gICBNZWRpdW1DaHVuawogICAvLyAgIEh1bW9uZ291c0NodW5rCi0gIENodW5rTGlzdCBfZnJlZV9jaHVua3NbM107CisgIENodW5rTGlzdCBfZnJlZV9jaHVua3NbTnVtYmVyT2ZGcmVlTGlzdHNdOworCisgIC8vICAgSHVtb25nb3VzQ2h1bmsKKyAgQ2h1bmtUcmVlRGljdGlvbmFyeSBfaHVtb25nb3VzX2RpY3Rpb25hcnk7CiAKICAgLy8gQ2h1bmtNYW5hZ2VyIGluIGFsbCBsaXN0cyBvZiB0aGlzIHR5cGUKICAgc2l6ZV90IF9mcmVlX2NodW5rc190b3RhbDsKQEAgLTMzNyw3ICsxODUsOSBAQAogICB9CiAgIENodW5rTGlzdCogZnJlZV9tZWRpdW1fY2h1bmtzKCkgeyByZXR1cm4gJl9mcmVlX2NodW5rc1sxXTsgfQogICBDaHVua0xpc3QqIGZyZWVfc21hbGxfY2h1bmtzKCkgeyByZXR1cm4gJl9mcmVlX2NodW5rc1swXTsgfQotICBDaHVua0xpc3QqIGZyZWVfaHVtb25nb3VzX2NodW5rcygpIHsgcmV0dXJuICZfZnJlZV9jaHVua3NbMl07IH0KKyAgQ2h1bmtUcmVlRGljdGlvbmFyeSogaHVtb25nb3VzX2RpY3Rpb25hcnkoKSB7CisgICAgcmV0dXJuICZfaHVtb25nb3VzX2RpY3Rpb25hcnk7CisgIH0KIAogICBDaHVua0xpc3QqIGZyZWVfY2h1bmtzKENodW5rSW5kZXggaW5kZXgpOwogCkBAIC0zNTYsNDEgKzIwNiwzNSBAQAogCiAgIHZvaWQgbG9ja2VkX3ByaW50X2ZyZWVfY2h1bmtzKG91dHB1dFN0cmVhbSogc3QpOwogICB2b2lkIGxvY2tlZF9wcmludF9zdW1fZnJlZV9jaHVua3Mob3V0cHV0U3RyZWFtKiBzdCk7CisKKyAgdm9pZCBwcmludF9vbihvdXRwdXRTdHJlYW0qIHN0KTsKIH07CiAKIAogLy8gVXNlZCB0byBtYW5hZ2UgdGhlIGZyZWUgbGlzdCBvZiBNZXRhYmxvY2tzIChhIGJsb2NrIGNvcnJlc3BvbmRzCiAvLyB0byB0aGUgYWxsb2NhdGlvbiBvZiBhIHF1YW50dW0gb2YgbWV0YWRhdGEpLgogY2xhc3MgQmxvY2tGcmVlbGlzdCBWQUxVRV9PQkpfQ0xBU1NfU1BFQyB7Ci0jaWZkZWYgREVBTExPQ0FURV9CTE9DS1MKLSAgQmluYXJ5VHJlZURpY3Rpb25hcnk8TWV0YWJsb2NrPiogX2RpY3Rpb25hcnk7Ci0jZW5kaWYKLSAgc3RhdGljIE1ldGFibG9jayogaW5pdGlhbGl6ZV9mcmVlX2NodW5rKE1ldGFibG9jayogYmxvY2ssIHNpemVfdCB3b3JkX3NpemUpOworICBCbG9ja1RyZWVEaWN0aW9uYXJ5KiBfZGljdGlvbmFyeTsKKyAgc3RhdGljIE1ldGFibG9jayogaW5pdGlhbGl6ZV9mcmVlX2NodW5rKE1ldGFXb3JkKiBwLCBzaXplX3Qgd29yZF9zaXplKTsKIAotI2lmZGVmIERFQUxMT0NBVEVfQkxPQ0tTCiAgIC8vIEFjY2Vzc29ycwotICBCaW5hcnlUcmVlRGljdGlvbmFyeTxNZXRhYmxvY2s+KiBkaWN0aW9uYXJ5KCkgY29uc3QgeyByZXR1cm4gX2RpY3Rpb25hcnk7IH0KLSNlbmRpZgorICBCbG9ja1RyZWVEaWN0aW9uYXJ5KiBkaWN0aW9uYXJ5KCkgY29uc3QgeyByZXR1cm4gX2RpY3Rpb25hcnk7IH0KIAogIHB1YmxpYzoKICAgQmxvY2tGcmVlbGlzdCgpOwogICB+QmxvY2tGcmVlbGlzdCgpOwogCiAgIC8vIEdldCBhbmQgcmV0dXJuIGEgYmxvY2sgdG8gdGhlIGZyZWUgbGlzdAotICBNZXRhYmxvY2sqIGdldF9ibG9jayhzaXplX3Qgd29yZF9zaXplKTsKLSAgdm9pZCByZXR1cm5fYmxvY2soTWV0YWJsb2NrKiBibG9jaywgc2l6ZV90IHdvcmRfc2l6ZSk7CisgIE1ldGFXb3JkKiBnZXRfYmxvY2soc2l6ZV90IHdvcmRfc2l6ZSk7CisgIHZvaWQgcmV0dXJuX2Jsb2NrKE1ldGFXb3JkKiBwLCBzaXplX3Qgd29yZF9zaXplKTsKIAotICBzaXplX3QgdG90YWxTaXplKCkgewotI2lmZGVmIERFQUxMT0NBVEVfQkxPQ0tTCi0gICAgaWYgKGRpY3Rpb25hcnkoKSA9PSBOVUxMKSB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIGRpY3Rpb25hcnkoKS0+dG90YWxTaXplKCk7Ci0gICAgfQotI2Vsc2UKKyAgc2l6ZV90IHRvdGFsX3NpemUoKSB7CisgIGlmIChkaWN0aW9uYXJ5KCkgPT0gTlVMTCkgewogICAgIHJldHVybiAwOwotI2VuZGlmCisgIH0gZWxzZSB7CisgICAgcmV0dXJuIGRpY3Rpb25hcnkoKS0+dG90YWxfc2l6ZSgpOwogICB9Cit9CiAKICAgdm9pZCBwcmludF9vbihvdXRwdXRTdHJlYW0qIHN0KSBjb25zdDsKIH07CkBAIC02MDAsNyArNDQ0LDYgQEAKICAgfTsKIH07CiAKLQogY2xhc3MgTWV0YWRlYnVnIDogQWxsU3RhdGljIHsKICAgLy8gRGVidWdnaW5nIHN1cHBvcnQgZm9yIE1ldGFzcGFjZXMKICAgc3RhdGljIGludCBfZGVhbGxvY2F0ZV9ibG9ja19hX2xvdF9jb3VudDsKQEAgLTY1NSw3ICs0OTgsNyBAQAogICAvLyBMaXN0IG9mIGNodW5rcyBpbiB1c2UgYnkgdGhpcyBTcGFjZU1hbmFnZXIuICBBbGxvY2F0aW9ucwogICAvLyBhcmUgZG9uZSBmcm9tIHRoZSBjdXJyZW50IGNodW5rLiAgVGhlIGxpc3QgaXMgdXNlZCBmb3IgZGVhbGxvY2F0aW5nCiAgIC8vIGNodW5rcyB3aGVuIHRoZSBTcGFjZU1hbmFnZXIgaXMgZnJlZWQuCi0gIE1ldGFjaHVuayogX2NodW5rc19pbl91c2VbTnVtYmVyT2ZGcmVlTGlzdHNdOworICBNZXRhY2h1bmsqIF9jaHVua3NfaW5fdXNlW051bWJlck9mSW5Vc2VMaXN0c107CiAgIE1ldGFjaHVuayogX2N1cnJlbnRfY2h1bms7CiAKICAgLy8gVmlydHVhbCBzcGFjZSB3aGVyZSBhbGxvY2F0aW9uIGNvbWVzIGZyb20uCkBAIC03MDAsMjQgKzU0Myw2IEBACiAgIC8vIEFkZCBjaHVuayB0byB0aGUgbGlzdCBvZiBjaHVua3MgaW4gdXNlCiAgIHZvaWQgYWRkX2NodW5rKE1ldGFjaHVuayogdiwgYm9vbCBtYWtlX2N1cnJlbnQpOwogCi0gIC8vIERlYnVnZ2luZyBzdXBwb3J0Ci0gIHZvaWQgdmVyaWZ5X2NodW5rc19pbl91c2VfaW5kZXgoQ2h1bmtJbmRleCBpbmRleCwgTWV0YWNodW5rKiB2KSB7Ci0gICAgc3dpdGNoIChpbmRleCkgewotICAgIGNhc2UgMDoKLSAgICAgIGFzc2VydCh2LT53b3JkX3NpemUoKSA9PSBTbWFsbENodW5rLCAiTm90IGEgU21hbGxDaHVuayIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxOgotICAgICAgYXNzZXJ0KHYtPndvcmRfc2l6ZSgpID09IE1lZGl1bUNodW5rLCAiTm90IGEgTWVkaXVtQ2h1bmsiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgIGFzc2VydCh2LT53b3JkX3NpemUoKSA+IE1lZGl1bUNodW5rLCAiTm90IGEgSHVtb25nb3VzQ2h1bmsiKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhc3NlcnQoZmFsc2UsICJXcm9uZyBsaXN0LiIpOwotICAgIH0KLSAgfQotCi0gcHJvdGVjdGVkOgogICBNdXRleCogbG9jaygpIGNvbnN0IHsgcmV0dXJuIF9sb2NrOyB9CiAKICBwdWJsaWM6CkBAIC03NTEsMTAgKzU3NiwxMCBAQAogICBNZXRhV29yZCogYWxsb2NhdGUoc2l6ZV90IHdvcmRfc2l6ZSk7CiAKICAgLy8gSGVscGVyIGZvciBhbGxvY2F0aW9ucwotICBNZXRhYmxvY2sqIGFsbG9jYXRlX3dvcmsoc2l6ZV90IHdvcmRfc2l6ZSk7CisgIE1ldGFXb3JkKiBhbGxvY2F0ZV93b3JrKHNpemVfdCB3b3JkX3NpemUpOwogCiAgIC8vIFJldHVybnMgYSBibG9jayB0byB0aGUgcGVyIG1hbmFnZXIgZnJlZWxpc3QKLSAgdm9pZCBkZWFsbG9jYXRlKE1ldGFXb3JkKiBwKTsKKyAgdm9pZCBkZWFsbG9jYXRlKE1ldGFXb3JkKiBwLCBzaXplX3Qgd29yZF9zaXplKTsKIAogICAvLyBCYXNlZCBvbiB0aGUgYWxsb2NhdGlvbiBzaXplIGFuZCBhIG1pbmltdW0gY2h1bmsgc2l6ZSwKICAgLy8gcmV0dXJuZWQgY2h1bmsgc2l6ZSAoZm9yIGV4cGFuZGluZyBzcGFjZSBmb3IgY2h1bmsgYWxsb2NhdGlvbikuCkBAIC03NjMsNyArNTg4LDcgQEAKICAgLy8gQ2FsbGVkIHdoZW4gYW4gYWxsb2NhdGlvbiBmcm9tIHRoZSBjdXJyZW50IGNodW5rIGZhaWxzLgogICAvLyBHZXRzIGEgbmV3IGNodW5rIChtYXkgcmVxdWlyZSBnZXR0aW5nIGEgbmV3IHZpcnR1YWwgc3BhY2UpLAogICAvLyBhbmQgYWxsb2NhdGVzIGZyb20gdGhhdCBjaHVuay4KLSAgTWV0YWJsb2NrKiBncm93X2FuZF9hbGxvY2F0ZShzaXplX3Qgd29yZF9zaXplKTsKKyAgTWV0YVdvcmQqIGdyb3dfYW5kX2FsbG9jYXRlKHNpemVfdCB3b3JkX3NpemUpOwogCiAgIC8vIGRlYnVnZ2luZyBzdXBwb3J0LgogCkBAIC03ODAsNiArNjA1LDggQEAKIAogdWludCBjb25zdCBTcGFjZU1hbmFnZXI6Ol9zbWFsbF9jaHVua19saW1pdCA9IDQ7CiAKKworCiBjb25zdCBjaGFyKiBTcGFjZU1hbmFnZXI6Ol9leHBhbmRfbG9ja19uYW1lID0KICAgIlNwYWNlTWFuYWdlciBjaHVuayBhbGxvY2F0aW9uIGxvY2siOwogY29uc3QgaW50IFNwYWNlTWFuYWdlcjo6X2V4cGFuZF9sb2NrX3JhbmsgPSBNb25pdG9yOjpsZWFmIC0gMTsKQEAgLTc4OCwzOSArNjE1LDI2IEBACiAgICAgICAgICAgICBTcGFjZU1hbmFnZXI6Ol9leHBhbmRfbG9ja19uYW1lLAogICAgICAgICAgICAgTXV0ZXg6Ol9hbGxvd192bV9ibG9ja19mbGFnKTsKIAotI2lmZGVmIEFTU0VSVAotc2l6ZV90IE1ldGFibG9jazo6X292ZXJoZWFkID0KLSAgQ2h1bms6OmFsaWduZWRfb3ZlcmhlYWRfc2l6ZShzaXplb2YoTWV0YWJsb2NrKSkgLyBCeXRlc1BlcldvcmQ7Ci0jZWxzZQotc2l6ZV90IE1ldGFibG9jazo6X292ZXJoZWFkID0gMDsKLSNlbmRpZgogc2l6ZV90IE1ldGFjaHVuazo6X292ZXJoZWFkID0KICAgQ2h1bms6OmFsaWduZWRfb3ZlcmhlYWRfc2l6ZShzaXplb2YoTWV0YWNodW5rKSkgLyBCeXRlc1BlcldvcmQ7CiAKIC8vIE5ldyBibG9ja3MgcmV0dXJuZWQgYnkgdGhlIE1ldGFzcGFjZSBhcmUgemVybyBpbml0aWFsaXplZC4KIC8vIFdlIHNob3VsZCBmaXggdGhlIGNvbnN0cnVjdG9ycyB0byBub3QgYXNzdW1lIHRoaXMgaW5zdGVhZC4KIE1ldGFibG9jayogTWV0YWJsb2NrOjppbml0aWFsaXplKE1ldGFXb3JkKiBwLCBzaXplX3Qgd29yZF9zaXplKSB7CisgIGlmIChwID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCiAgIE1ldGFibG9jayogcmVzdWx0ID0gKE1ldGFibG9jayopIHA7CiAKICAgLy8gQ2xlYXIgdGhlIG1lbW9yeQogICBDb3B5OjpmaWxsX3RvX2FsaWduZWRfd29yZHMoKEhlYXBXb3JkKilyZXN1bHQsIHdvcmRfc2l6ZSk7CiAjaWZkZWYgQVNTRVJUCiAgIHJlc3VsdC0+c2V0X3dvcmRfc2l6ZSh3b3JkX3NpemUpOwotICAvLyBDaGVjayBhZnRlciB3b3JrIHNpemUgaXMgc2V0LgotICByZXN1bHQtPnNldF9sZWFkZXIoKHZvaWQqKSBtZXRhc3BhY2VfYWxsb2NhdGlvbl9sZWFkZXIpOwotICByZXN1bHQtPnNldF90cmFpbGVyKCh2b2lkKikgbWV0YXNwYWNlX2FsbG9jYXRpb25fdHJhaWxlcik7CiAjZW5kaWYKICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotdm9pZCBNZXRhYmxvY2s6OnZlcmlmeSgpIHsKLSNpZmRlZiBBU1NFUlQKLSAgYXNzZXJ0KGxlYWRlcigpID09IG1ldGFzcGFjZV9hbGxvY2F0aW9uX2xlYWRlciAmJgotICAgICAgICAgdHJhaWxlcigpID09IG1ldGFzcGFjZV9hbGxvY2F0aW9uX3RyYWlsZXIsCi0gICAgICAgICAiYmxvY2sgaGFzIGJlZW4gY29ycnVwdGVkIik7Ci0jZW5kaWYKLX0KLQogLy8gTWV0YWNodW5rIG1ldGhvZHMKIAogTWV0YWNodW5rKiBNZXRhY2h1bms6OmluaXRpYWxpemUoTWV0YVdvcmQqIHB0ciwgc2l6ZV90IHdvcmRfc2l6ZSkgewpAQCAtODQzLDE4ICs2NTcsMTMgQEAKIH0KIAogCi1NZXRhYmxvY2sqIE1ldGFjaHVuazo6YWxsb2NhdGUoc2l6ZV90IHdvcmRfc2l6ZSkgewotICBNZXRhYmxvY2sqIHJlc3VsdCA9IE5VTEw7CitNZXRhV29yZCogTWV0YWNodW5rOjphbGxvY2F0ZShzaXplX3Qgd29yZF9zaXplKSB7CisgIE1ldGFXb3JkKiByZXN1bHQgPSBOVUxMOwogICAvLyBJZiBhdmFpbGFibGUsIGJ1bXAgdGhlIHBvaW50ZXIgdG8gYWxsb2NhdGUuCiAgIGlmIChmcmVlX3dvcmRfc2l6ZSgpID49IHdvcmRfc2l6ZSkgewotICAgIHJlc3VsdCA9IE1ldGFibG9jazo6aW5pdGlhbGl6ZShfdG9wLCB3b3JkX3NpemUpOworICAgIHJlc3VsdCA9IF90b3A7CiAgICAgX3RvcCA9IF90b3AgKyB3b3JkX3NpemU7CiAgIH0KLSNpZmRlZiBBU1NFUlQKLSAgYXNzZXJ0KHJlc3VsdCA9PSBOVUxMIHx8Ci0gICAgICAgICByZXN1bHQtPndvcmRfc2l6ZSgpID09IHdvcmRfc2l6ZSwKLSAgICAgICAgICJCbG9jayBzaXplIGlzIG5vdCBzZXQgY29ycmVjdGx5Iik7Ci0jZW5kaWYKICAgcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAtODc4LDEwMyArNjg3LDg1IEBACiAgICAgICAgICAgICAgICBib3R0b20oKSwgdG9wKCksIGVuZCgpLCB3b3JkX3NpemUoKSk7CiB9CiAKKyNpZmRlZiBBU1NFUlQKK3ZvaWQgTWV0YWNodW5rOjptYW5nbGUoKSB7CisgIC8vIE1hbmdsZSB0aGUgcGF5bG9hZCBvZiB0aGUgY2h1bmsgYW5kIG5vdCB0aGUgbGlua3MgdGhhdAorICAvLyBtYWludGFpbiBsaXN0IG9mIGNodW5rcy4KKyAgSGVhcFdvcmQqIHN0YXJ0ID0gKEhlYXBXb3JkKikoYm90dG9tKCkgKyBvdmVyaGVhZCgpKTsKKyAgc2l6ZV90IHdvcmRfc2l6ZSA9IGNhcGFjaXR5X3dvcmRfc2l6ZSgpIC0gb3ZlcmhlYWQoKTsKKyAgQ29weTo6ZmlsbF90b193b3JkcyhzdGFydCwgd29yZF9zaXplLCBtZXRhZGF0YV9jaHVua19pbml0aWFsaXplKTsKK30KKyNlbmRpZiAvLyBBU1NFUlQKIAogdm9pZCBNZXRhY2h1bms6OnZlcmlmeSgpIHsKICNpZmRlZiBBU1NFUlQKICAgLy8gQ2Fubm90IHdhbGsgdGhyb3VnaCB0aGUgYmxvY2tzIHVubGVzcyB0aGUgYmxvY2tzIGhhdmUKICAgLy8gaGVhZGVycyB3aXRoIHNpemVzLgotICBNZXRhV29yZCogY3VyciA9IGJvdHRvbSgpICsgb3ZlcmhlYWQoKTsKLSAgd2hpbGUgKGN1cnIgPCB0b3AoKSkgewotICAgIE1ldGFibG9jayogYmxvY2sgPSAoTWV0YWJsb2NrKikgY3VycjsKLSAgICBzaXplX3Qgd29yZF9zaXplID0gYmxvY2stPndvcmRfc2l6ZSgpOwotICAgIGJsb2NrLT52ZXJpZnkoKTsKLSAgICBjdXJyID0gY3VyciArIHdvcmRfc2l6ZTsKLSAgfQorICBhc3NlcnQoX2JvdHRvbSA8PSBfdG9wICYmCisgICAgICAgICBfdG9wIDw9IF9lbmQsCisgICAgICAgICAiQ2h1bmsgaGFzIGJlZW4gc21hc2hlZCIpOworICBhc3NlcnQoU3BhY2VNYW5hZ2VyOjppc19odW1vbmdvdXMoX3dvcmRfc2l6ZSkgfHwKKyAgICAgICAgIF93b3JkX3NpemUgPT0gU3BhY2VNYW5hZ2VyOjpNZWRpdW1DaHVuayB8fAorICAgICAgICAgX3dvcmRfc2l6ZSA9PSBTcGFjZU1hbmFnZXI6OlNtYWxsQ2h1bmssCisgICAgICAgICAiQ2h1bmsgc2l6ZSBpcyB3cm9uZyIpOwogI2VuZGlmCiAgIHJldHVybjsKIH0KIAogLy8gQmxvY2tGcmVlbGlzdCBtZXRob2RzCiAKLSNpZmRlZiBERUFMTE9DQVRFX0JMT0NLUwogQmxvY2tGcmVlbGlzdDo6QmxvY2tGcmVlbGlzdCgpIDogX2RpY3Rpb25hcnkoTlVMTCkge30KLSNlbHNlCi1CbG9ja0ZyZWVsaXN0OjpCbG9ja0ZyZWVsaXN0KCkge30KLSNlbmRpZgogCiBCbG9ja0ZyZWVsaXN0Ojp+QmxvY2tGcmVlbGlzdCgpIHsKLSNpZmRlZiBERUFMTE9DQVRFX0JMT0NLUwogICBpZiAoX2RpY3Rpb25hcnkgIT0gTlVMTCkgewogICAgIGlmIChWZXJib3NlICYmIFRyYWNlTWV0YWRhdGFDaHVua0FsbG9jYXRpb24pIHsKICAgICAgIF9kaWN0aW9uYXJ5LT5wcmludF9mcmVlX2xpc3RzKGdjbG9nX29yX3R0eSk7CiAgICAgfQogICAgIGRlbGV0ZSBfZGljdGlvbmFyeTsKICAgfQotI2VuZGlmCiB9CiAKLU1ldGFibG9jayogQmxvY2tGcmVlbGlzdDo6aW5pdGlhbGl6ZV9mcmVlX2NodW5rKE1ldGFibG9jayogYmxvY2ssIHNpemVfdCB3b3JkX3NpemUpIHsKLSNpZmRlZiBERUFMTE9DQVRFX0JMT0NLUwotI2lmZGVmIEFTU0VSVAotICBhc3NlcnQod29yZF9zaXplID0gYmxvY2stPndvcmRfc2l6ZSgpLCAiV3JvbmcgY2h1bmsgc2l6ZSIpOwotI2VuZGlmCi0gIE1ldGFibG9jayogcmVzdWx0ID0gYmxvY2s7Ci0gIHJlc3VsdC0+c2V0U2l6ZSh3b3JkX3NpemUpOwotICByZXN1bHQtPmxpbmtQcmV2KE5VTEwpOwotICByZXN1bHQtPmxpbmtOZXh0KE5VTEwpOworTWV0YWJsb2NrKiBCbG9ja0ZyZWVsaXN0Ojppbml0aWFsaXplX2ZyZWVfY2h1bmsoTWV0YVdvcmQqIHAsIHNpemVfdCB3b3JkX3NpemUpIHsKKyAgTWV0YWJsb2NrKiBibG9jayA9IChNZXRhYmxvY2sqKSBwOworICBibG9jay0+c2V0X3dvcmRfc2l6ZSh3b3JkX3NpemUpOworICBibG9jay0+c2V0X3ByZXYoTlVMTCk7CisgIGJsb2NrLT5zZXRfbmV4dChOVUxMKTsKIAotICByZXR1cm4gcmVzdWx0OwotI2Vsc2UKLSAgU2hvdWxkTm90UmVhY2hIZXJlKCk7CiAgIHJldHVybiBibG9jazsKLSNlbmRpZgogfQogCi12b2lkIEJsb2NrRnJlZWxpc3Q6OnJldHVybl9ibG9jayhNZXRhYmxvY2sqIGJsb2NrLCBzaXplX3Qgd29yZF9zaXplKSB7Ci0jaWZkZWYgQVNTRVJUCi0gIGFzc2VydCh3b3JkX3NpemUgPSBibG9jay0+d29yZF9zaXplKCksICJCbG9jayBzaXplIGlzIHdyb25nIik7OwotI2VuZGlmCi0gIE1ldGFibG9jayogZnJlZV9jaHVuayA9IGluaXRpYWxpemVfZnJlZV9jaHVuayhibG9jaywgd29yZF9zaXplKTsKLSNpZmRlZiBERUFMTE9DQVRFX0JMT0NLUwordm9pZCBCbG9ja0ZyZWVsaXN0OjpyZXR1cm5fYmxvY2soTWV0YVdvcmQqIHAsIHNpemVfdCB3b3JkX3NpemUpIHsKKyAgTWV0YWJsb2NrKiBmcmVlX2NodW5rID0gaW5pdGlhbGl6ZV9mcmVlX2NodW5rKHAsIHdvcmRfc2l6ZSk7CiAgIGlmIChkaWN0aW9uYXJ5KCkgPT0gTlVMTCkgewotICAgX2RpY3Rpb25hcnkgPSBuZXcgQmluYXJ5VHJlZURpY3Rpb25hcnk8TWV0YWJsb2NrPihmYWxzZSAvKiBhZGFwdGl2ZV9mcmVlbGlzdHMgKi8pOworICAgX2RpY3Rpb25hcnkgPSBuZXcgQmxvY2tUcmVlRGljdGlvbmFyeSgpOwogICB9Ci0gIGRpY3Rpb25hcnkoKS0+cmV0dXJuQ2h1bmsoZnJlZV9jaHVuayk7Ci0jZW5kaWYKKyAgZGljdGlvbmFyeSgpLT5yZXR1cm5fY2h1bmsoZnJlZV9jaHVuayk7CiB9CiAKLU1ldGFibG9jayogQmxvY2tGcmVlbGlzdDo6Z2V0X2Jsb2NrKHNpemVfdCB3b3JkX3NpemUpIHsKLSNpZmRlZiBERUFMTE9DQVRFX0JMT0NLUworTWV0YVdvcmQqIEJsb2NrRnJlZWxpc3Q6OmdldF9ibG9jayhzaXplX3Qgd29yZF9zaXplKSB7CiAgIGlmIChkaWN0aW9uYXJ5KCkgPT0gTlVMTCkgewogICAgIHJldHVybiBOVUxMOwogICB9CiAKLSAgTWV0YWJsb2NrKiBmcmVlX2NodW5rID0KLSAgICBkaWN0aW9uYXJ5KCktPmdldENodW5rKHdvcmRfc2l6ZSwgRnJlZUJsb2NrRGljdGlvbmFyeTxNZXRhYmxvY2s+OjpleGFjdGx5KTsKLSNlbHNlCi0gIE1ldGFibG9jayogZnJlZV9jaHVuayA9IE5VTEw7Ci0jZW5kaWYKLSAgaWYgKGZyZWVfY2h1bmsgPT0gTlVMTCkgeworICBpZiAod29yZF9zaXplIDwgVHJlZUNodW5rPE1ldGFibG9jaywgRnJlZUxpc3Q+OjptaW5fc2l6ZSgpKSB7CisgICAgLy8gRGFyayBtYXR0ZXIuICBUb28gc21hbGwgZm9yIGRpY3Rpb25hcnkuCiAgICAgcmV0dXJuIE5VTEw7CiAgIH0KLSAgYXNzZXJ0KGZyZWVfY2h1bmstPndvcmRfc2l6ZSgpID09IHdvcmRfc2l6ZSwgIlNpemUgb2YgY2h1bmsgaXMgaW5jb3JyZWN0Iik7Ci0gIE1ldGFibG9jayogYmxvY2sgPSBNZXRhYmxvY2s6OmluaXRpYWxpemUoKE1ldGFXb3JkKikgZnJlZV9jaHVuaywgd29yZF9zaXplKTsKLSNpZmRlZiBBU1NFUlQKLSAgYXNzZXJ0KGJsb2NrLT53b3JkX3NpemUoKSA9PSB3b3JkX3NpemUsICJCbG9jayBzaXplIGlzIG5vdCBzZXQgY29ycmVjdGx5Iik7Ci0jZW5kaWYKIAotICByZXR1cm4gYmxvY2s7CisgIE1ldGFibG9jayogZnJlZV9ibG9jayA9CisgICAgZGljdGlvbmFyeSgpLT5nZXRfY2h1bmsod29yZF9zaXplLCBGcmVlQmxvY2tEaWN0aW9uYXJ5PE1ldGFibG9jaz46OmV4YWN0bHkpOworICBpZiAoZnJlZV9ibG9jayA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICByZXR1cm4gKE1ldGFXb3JkKikgZnJlZV9ibG9jazsKIH0KIAogdm9pZCBCbG9ja0ZyZWVsaXN0OjpwcmludF9vbihvdXRwdXRTdHJlYW0qIHN0KSBjb25zdCB7Ci0jaWZkZWYgREVBTExPQ0FURV9CTE9DS1MKICAgaWYgKGRpY3Rpb25hcnkoKSA9PSBOVUxMKSB7CiAgICAgcmV0dXJuOwogICB9CiAgIGRpY3Rpb25hcnkoKS0+cHJpbnRfZnJlZV9saXN0cyhzdCk7Ci0jZWxzZQotICByZXR1cm47Ci0jZW5kaWYKIH0KIAogLy8gVmlydHVhbFNwYWNlTm9kZSBtZXRob2RzCkBAIC0xNTk3LDE0ICsxMzg4LDExIEBACiAgICAgICAgIE1ldGFkZWJ1Zzo6ZGVhbGxvY2F0ZV9ibG9ja19hX2xvdF9jb3VudCgpICUgTWV0YURhdGFEZWFsbG9jYXRlQUxvdEludGVydmFsID09IDAgKSB7CiAgICAgTWV0YWRlYnVnOjpzZXRfZGVhbGxvY2F0ZV9ibG9ja19hX2xvdF9jb3VudCgwKTsKICAgICBmb3IgKHVpbnQgaSA9IDA7IGkgPCBtZXRhZGF0YV9kZWFsbG9jYXRlX2FfbG90X2Jsb2NrOyBpKyspIHsKLSAgICAgIE1ldGFibG9jayogZHVtbXlfYmxvY2sgPSBzbS0+YWxsb2NhdGVfd29yayhyYXdfd29yZF9zaXplKTsKKyAgICAgIE1ldGFXb3JkKiBkdW1teV9ibG9jayA9IHNtLT5hbGxvY2F0ZV93b3JrKHJhd193b3JkX3NpemUpOwogICAgICAgaWYgKGR1bW15X2Jsb2NrID09IDApIHsKICAgICAgICAgYnJlYWs7CiAgICAgICB9Ci0jaWZkZWYgQVNTRVJUCi0gICAgICBhc3NlcnQoZHVtbXlfYmxvY2stPndvcmRfc2l6ZSgpID09IHJhd193b3JkX3NpemUsICJCbG9jayBzaXplIGlzIG5vdCBzZXQgY29ycmVjdGx5Iik7Ci0jZW5kaWYKLSAgICAgIHNtLT5kZWFsbG9jYXRlKGR1bW15X2Jsb2NrLT5kYXRhKCkpOworICAgICAgc20tPmRlYWxsb2NhdGUoZHVtbXlfYmxvY2ssIHJhd193b3JkX3NpemUpOwogICAgIH0KICAgfSBlbHNlIHsKICAgICBNZXRhZGVidWc6OmluY19kZWFsbG9jYXRlX2Jsb2NrX2FfbG90X2NvdW50KCk7CkBAIC0xNzg0LDggKzE1NzIsOCBAQAogfQogCiB2b2lkIENodW5rTWFuYWdlcjo6bG9ja2VkX3ZlcmlmeSgpIHsKLSAgbG9ja2VkX3ZlcmlmeV9mcmVlX2NodW5rc190b3RhbCgpOwogICBsb2NrZWRfdmVyaWZ5X2ZyZWVfY2h1bmtzX2NvdW50KCk7CisgIGxvY2tlZF92ZXJpZnlfZnJlZV9jaHVua3NfdG90YWwoKTsKIH0KIAogdm9pZCBDaHVua01hbmFnZXI6OmxvY2tlZF9wcmludF9mcmVlX2NodW5rcyhvdXRwdXRTdHJlYW0qIHN0KSB7CkBAIC0xODAzLDcgKzE1OTEsNiBAQAogICByZXR1cm4gJl9mcmVlX2NodW5rc1tpbmRleF07CiB9CiAKLQogLy8gVGhlc2UgbWV0aG9kcyB0aGF0IHN1bSB0aGUgZnJlZSBjaHVuayBsaXN0cyBhcmUgdXNlZCBpbiBwcmludGluZwogLy8gbWV0aG9kcyB0aGF0IGFyZSB1c2VkIGluIHByb2R1Y3QgYnVpbGRzLgogc2l6ZV90IENodW5rTWFuYWdlcjo6c3VtX2ZyZWVfY2h1bmtzKCkgewpAQCAtMTgxOCw2ICsxNjA1LDcgQEAKIAogICAgIHJlc3VsdCA9IHJlc3VsdCArIGxpc3QtPnN1bV9saXN0X2NhcGFjaXR5KCk7CiAgIH0KKyAgcmVzdWx0ID0gcmVzdWx0ICsgaHVtb25nb3VzX2RpY3Rpb25hcnkoKS0+dG90YWxfc2l6ZSgpOwogICByZXR1cm4gcmVzdWx0OwogfQogCkBAIC0xODMxLDYgKzE2MTksNyBAQAogICAgIH0KICAgICBjb3VudCA9IGNvdW50ICsgbGlzdC0+c3VtX2xpc3RfY291bnQoKTsKICAgfQorICBjb3VudCA9IGNvdW50ICsgaHVtb25nb3VzX2RpY3Rpb25hcnkoKS0+dG90YWxfZnJlZV9ibG9ja3MoKTsKICAgcmV0dXJuIGNvdW50OwogfQogCkBAIC0xODc1LDIzICsxNjY0LDI0IEBACiAgIGFzc2VydF9sb2NrX3N0cm9uZyhTcGFjZU1hbmFnZXI6OmV4cGFuZF9sb2NrKCkpOwogCiAgIGxvY2tlZF92ZXJpZnkoKTsKLSAgQ2h1bmtMaXN0KiBmcmVlX2xpc3QgPSBmaW5kX2ZyZWVfY2h1bmtzX2xpc3Qod29yZF9zaXplKTsKLSAgYXNzZXJ0KGZyZWVfbGlzdCAhPSBOVUxMLCAiU2FuaXR5IGNoZWNrIik7CiAKLSAgTWV0YWNodW5rKiBjaHVuayA9IGZyZWVfbGlzdC0+aGVhZCgpOwotICBkZWJ1Z19vbmx5KE1ldGFjaHVuayogZGVidWdfaGVhZCA9IGNodW5rOykKKyAgTWV0YWNodW5rKiBjaHVuayA9IE5VTEw7CisgIGlmICghU3BhY2VNYW5hZ2VyOjppc19odW1vbmdvdXMod29yZF9zaXplKSkgeworICAgIENodW5rTGlzdCogZnJlZV9saXN0ID0gZmluZF9mcmVlX2NodW5rc19saXN0KHdvcmRfc2l6ZSk7CisgICAgYXNzZXJ0KGZyZWVfbGlzdCAhPSBOVUxMLCAiU2FuaXR5IGNoZWNrIik7CiAKLSAgaWYgKGNodW5rID09IE5VTEwpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQorICAgIGNodW5rID0gZnJlZV9saXN0LT5oZWFkKCk7CisgICAgZGVidWdfb25seShNZXRhY2h1bmsqIGRlYnVnX2hlYWQgPSBjaHVuazspCiAKLSAgTWV0YWNodW5rKiBwcmV2X2NodW5rID0gY2h1bms7Ci0gIGlmIChjaHVuay0+d29yZF9zaXplKCkgPT0gd29yZF9zaXplKSB7Ci0gICAgLy8gQ2h1bmsgaXMgYmVpbmcgcmVtb3ZlZCBmcm9tIHRoZSBjaHVua3MgZnJlZSBsaXN0LgotICAgIGRlY19mcmVlX2NodW5rc190b3RhbChjaHVuay0+Y2FwYWNpdHlfd29yZF9zaXplKCkpOworICAgIGlmIChjaHVuayA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKICAgICAvLyBSZW1vdmUgdGhlIGNodW5rIGFzIHRoZSBoZWFkIG9mIHRoZSBsaXN0LgogICAgIGZyZWVfbGlzdC0+c2V0X2hlYWQoY2h1bmstPm5leHQoKSk7CiAgICAgY2h1bmstPnNldF9uZXh0KE5VTEwpOworICAgIC8vIENodW5rIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgY2h1bmtzIGZyZWUgbGlzdC4KKyAgICBkZWNfZnJlZV9jaHVua3NfdG90YWwoY2h1bmstPmNhcGFjaXR5X3dvcmRfc2l6ZSgpKTsKIAogICAgIGlmIChUcmFjZU1ldGFkYXRhQ2h1bmtBbGxvY2F0aW9uICYmIFZlcmJvc2UpIHsKICAgICAgIHR0eS0+cHJpbnRfY3IoIkNodW5rTWFuYWdlcjo6ZnJlZV9jaHVua3NfZ2V0OiBmcmVlX2xpc3QgIgpAQCAtMTg5OSw3OSArMTY4OSwyNCBAQAogICAgICAgICAgICAgICAgICAgICBmcmVlX2xpc3QsIGNodW5rLCBjaHVuay0+d29yZF9zaXplKCkpOwogICAgIH0KICAgfSBlbHNlIHsKLSAgICBhc3NlcnQoU3BhY2VNYW5hZ2VyOjppc19odW1vbmdvdXMod29yZF9zaXplKSwKLSAgICAgICJTaG91bGQgb25seSBuZWVkIHRvIGNoZWNrIGh1bW9uZ291cyIpOwotICAgIC8vIFRoaXMgY29kZSB0byBmaW5kIHRoZSBiZXN0IGZpdCBpcyBqdXN0IGZvciBwdXJwb3NlcyBvZgotICAgIC8vIGludmVzdGlnYXRpbmcgdGhlIGxvc3MgZHVlIHRvIGZyYWdtZW50YXRpb24gb24gYSBodW1vbmdvdXMKLSAgICAvLyBjaHVuay4gIEl0IHdpbGwgYmUgcmVwbGFjZSBieSBhIGJpbmFyeVRyZWVEaWN0aW9uYXJ5IGZvcgotICAgIC8vIHRoZSBodW1vbmdvdXMgY2h1bmtzLgotICAgIHVpbnQgY291bnQgPSAwOwotICAgIE1ldGFjaHVuayogYmVzdF9maXQgPSBOVUxMOwotICAgIE1ldGFjaHVuayogYmVzdF9maXRfcHJldiA9IE5VTEw7Ci0gICAgd2hpbGUgKGNodW5rICE9IE5VTEwpIHsKLSAgICAgIGNvdW50Kys7Ci0gICAgICBpZiAoY2h1bmstPndvcmRfc2l6ZSgpIDwgd29yZF9zaXplKSB7Ci0gICAgICAgIHByZXZfY2h1bmsgPSBjaHVuazsKLSAgICAgICAgY2h1bmsgPSBjaHVuay0+bmV4dCgpOwotICAgICAgfSBlbHNlIGlmIChjaHVuay0+d29yZF9zaXplKCkgPT0gd29yZF9zaXplKSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGJlc3RfZml0ID09IE5VTEwgfHwKLSAgICAgICAgICAgIGJlc3RfZml0LT53b3JkX3NpemUoKSA+IGNodW5rLT53b3JkX3NpemUoKSkgewotICAgICAgICAgIGJlc3RfZml0X3ByZXYgPSBwcmV2X2NodW5rOwotICAgICAgICAgIGJlc3RfZml0ID0gY2h1bms7Ci0gICAgICAgIH0KLSAgICAgICAgcHJldl9jaHVuayA9IGNodW5rOwotICAgICAgICBjaHVuayA9IGNodW5rLT5uZXh0KCk7CisgICAgY2h1bmsgPSBodW1vbmdvdXNfZGljdGlvbmFyeSgpLT5nZXRfY2h1bmsoCisgICAgICB3b3JkX3NpemUsCisgICAgICBGcmVlQmxvY2tEaWN0aW9uYXJ5PE1ldGFjaHVuaz46OmF0TGVhc3QpOworCisgICAgaWYgKGNodW5rICE9IE5VTEwpIHsKKyAgICAgIGlmIChUcmFjZU1ldGFkYXRhSHVtb25nb3VzQWxsb2NhdGlvbikgeworICAgICAgICBzaXplX3Qgd2FzdGUgPSBjaHVuay0+d29yZF9zaXplKCkgLSB3b3JkX3NpemU7CisgICAgICAgIHR0eS0+cHJpbnRfY3IoIkZyZWUgbGlzdCBhbGxvY2F0ZSBodW1vbmdvdXMgY2h1bmsgc2l6ZSAiIFNJWkVfRk9STUFUCisgICAgICAgICAgICAgICAgICAgICAgIiBmb3IgcmVxdWVzdGVkIHNpemUgIiBTSVpFX0ZPUk1BVAorICAgICAgICAgICAgICAgICAgICAgICIgd2FzdGUgIiBTSVpFX0ZPUk1BVCwKKyAgICAgICAgICAgICAgICAgICAgICBjaHVuay0+d29yZF9zaXplKCksIHdvcmRfc2l6ZSwgd2FzdGUpOwogICAgICAgfQorICAgICAgLy8gQ2h1bmsgaXMgYmVpbmcgcmVtb3ZlZCBmcm9tIHRoZSBjaHVua3MgZnJlZSBsaXN0LgorICAgICAgZGVjX2ZyZWVfY2h1bmtzX3RvdGFsKGNodW5rLT5jYXBhY2l0eV93b3JkX3NpemUoKSk7CisjaWZkZWYgQVNTRVJUCisgICAgICBjaHVuay0+c2V0X2lzX2ZyZWUoZmFsc2UpOworI2VuZGlmCiAgICAgfQotICAgICAgaWYgKGNodW5rID09IE5VTEwpIHsKLSAgICAgICAgcHJldl9jaHVuayA9IGJlc3RfZml0X3ByZXY7Ci0gICAgICAgIGNodW5rID0gYmVzdF9maXQ7Ci0gICAgICB9Ci0gICAgICBpZiAoY2h1bmsgIT0gTlVMTCkgewotICAgICAgICBpZiAoVHJhY2VNZXRhZGF0YUh1bW9uZ291c0FsbG9jYXRpb24pIHsKLSAgICAgICAgICBzaXplX3Qgd2FzdGUgPSBjaHVuay0+d29yZF9zaXplKCkgLSB3b3JkX3NpemU7Ci0gICAgICAgICAgdHR5LT5wcmludF9jcigiRnJlZSBsaXN0IGFsbG9jYXRlIGh1bW9uZ291cyBjaHVuayBzaXplICIgU0laRV9GT1JNQVQKLSAgICAgICAgICAgICAgICAgICAgICAgICIgZm9yIHJlcXVlc3RlZCBzaXplICIgU0laRV9GT1JNQVQKLSAgICAgICAgICAgICAgICAgICAgICAgICIgd2FzdGUgIiBTSVpFX0ZPUk1BVAotICAgICAgICAgICAgICAgICAgICAgICAgIiBmb3VuZCBhdCAiIFNJWkVfRk9STUFUICIgb2YgIiBTSVpFX0ZPUk1BVCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rLT53b3JkX3NpemUoKSwgd29yZF9zaXplLCB3YXN0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50LCBmcmVlX2xpc3QtPnN1bV9saXN0X2NvdW50KCkpOwotICAgICAgICB9Ci0gICAgICAgIC8vIENodW5rIGlzIGJlaW5nIHJlbW92ZWQgZnJvbSB0aGUgY2h1bmtzIGZyZWUgbGlzdC4KLSAgICAgICAgZGVjX2ZyZWVfY2h1bmtzX3RvdGFsKGNodW5rLT5jYXBhY2l0eV93b3JkX3NpemUoKSk7Ci0gICAgICAgIC8vIFJlbW92ZSB0aGUgY2h1bmsgaWYgaXQgaXMgYXQgdGhlIGhlYWQgb2YgdGhlIGxpc3QuCi0gICAgICAgIGlmIChjaHVuayA9PSBmcmVlX2xpc3QtPmhlYWQoKSkgewotICAgICAgICAgIGZyZWVfbGlzdC0+c2V0X2hlYWQoY2h1bmstPm5leHQoKSk7Ci0KLSAgICAgICAgICBpZiAoVHJhY2VNZXRhZGF0YUh1bW9uZ291c0FsbG9jYXRpb24pIHsKLSAgICAgICAgICAgIHR0eS0+cHJpbnRfY3IoIkNodW5rTWFuYWdlcjo6ZnJlZV9jaHVua3NfZ2V0OiBodW1vbmdvdXMgZnJlZV9saXN0ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgUFRSX0ZPUk1BVCAiIGNodW5rICIgUFRSX0ZPUk1BVCAiIHNpemUgIiBTSVpFX0ZPUk1BVAotICAgICAgICAgICAgICAgICAgICAgICAgICAiIG5ldyBoZWFkICIgUFRSX0ZPUk1BVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZV9saXN0LCBjaHVuaywgY2h1bmstPndvcmRfc2l6ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlX2xpc3QtPmhlYWQoKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIC8vIFJlbW92ZSBhIGNodW5rIGluIHRoZSBpbnRlcmlvciBvZiB0aGUgbGlzdAotICAgICAgICAgIHByZXZfY2h1bmstPnNldF9uZXh0KGNodW5rLT5uZXh0KCkpOwotCi0gICAgICAgICAgaWYgKFRyYWNlTWV0YWRhdGFIdW1vbmdvdXNBbGxvY2F0aW9uKSB7Ci0gICAgICAgICAgICB0dHktPnByaW50X2NyKCJDaHVua01hbmFnZXI6OmZyZWVfY2h1bmtzX2dldDogaHVtb25nb3VzIGZyZWVfbGlzdCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFBUUl9GT1JNQVQgIiBjaHVuayAiIFBUUl9GT1JNQVQgIiBzaXplICIgU0laRV9GT1JNQVQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgUFRSX0ZPUk1BVCAiICBwcmV2ICIgUFRSX0ZPUk1BVCAiIG5leHQgIiBQVFJfRk9STUFULAotICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlX2xpc3QsIGNodW5rLCBjaHVuay0+d29yZF9zaXplKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZfY2h1bmssIGNodW5rLT5uZXh0KCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjaHVuay0+c2V0X25leHQoTlVMTCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpZiAoVHJhY2VNZXRhZGF0YUh1bW9uZ291c0FsbG9jYXRpb24pIHsKLSAgICAgICAgICB0dHktPnByaW50X2NyKCJDaHVua01hbmFnZXI6OmZyZWVfY2h1bmtzX2dldDogTmV3IGh1bW9uZ291cyBjaHVuayBvZiBzaXplICIKLSAgICAgICAgICAgICAgICAgICAgICAgIFNJWkVfRk9STUFULAotICAgICAgICAgICAgICAgICAgICAgICAgd29yZF9zaXplKTsKLSAgICAgICAgfQotICAgICAgfQogICB9CiAgIGxvY2tlZF92ZXJpZnkoKTsKICAgcmV0dXJuIGNodW5rOwpAQCAtMjAwMCwxMiArMTczNSwxOCBAQAogICByZXR1cm4gY2h1bms7CiB9CiAKK3ZvaWQgQ2h1bmtNYW5hZ2VyOjpwcmludF9vbihvdXRwdXRTdHJlYW0qIG91dCkgeworICBpZiAoUHJpbnRGTFNTdGF0aXN0aWNzICE9IDApIHsKKyAgICBodW1vbmdvdXNfZGljdGlvbmFyeSgpLT5yZXBvcnRfc3RhdGlzdGljcygpOworICB9Cit9CisKIC8vIFNwYWNlTWFuYWdlciBtZXRob2RzCiAKIHNpemVfdCBTcGFjZU1hbmFnZXI6OnN1bV9mcmVlX2luX2NodW5rc19pbl91c2UoKSBjb25zdCB7CiAgIE11dGV4TG9ja2VyRXggY2wobG9jaygpLCBNdXRleDo6X25vX3NhZmVwb2ludF9jaGVja19mbGFnKTsKICAgc2l6ZV90IGZyZWUgPSAwOwotICBmb3IgKENodW5rSW5kZXggaSA9IFNtYWxsSW5kZXg7IGkgPCBOdW1iZXJPZkZyZWVMaXN0czsgaSA9IG5leHRfY2h1bmtfaW5kZXgoaSkpIHsKKyAgZm9yIChDaHVua0luZGV4IGkgPSBTbWFsbEluZGV4OyBpIDwgTnVtYmVyT2ZJblVzZUxpc3RzOyBpID0gbmV4dF9jaHVua19pbmRleChpKSkgewogICAgIE1ldGFjaHVuayogY2h1bmsgPSBjaHVua3NfaW5fdXNlKGkpOwogICAgIHdoaWxlIChjaHVuayAhPSBOVUxMKSB7CiAgICAgICBmcmVlICs9IGNodW5rLT5mcmVlX3dvcmRfc2l6ZSgpOwpAQCAtMjAxOCwxMSArMTc1OSwxMiBAQAogc2l6ZV90IFNwYWNlTWFuYWdlcjo6c3VtX3dhc3RlX2luX2NodW5rc19pbl91c2UoKSBjb25zdCB7CiAgIE11dGV4TG9ja2VyRXggY2wobG9jaygpLCBNdXRleDo6X25vX3NhZmVwb2ludF9jaGVja19mbGFnKTsKICAgc2l6ZV90IHJlc3VsdCA9IDA7Ci0gIGZvciAoQ2h1bmtJbmRleCBpID0gU21hbGxJbmRleDsgaSA8IE51bWJlck9mRnJlZUxpc3RzOyBpID0gbmV4dF9jaHVua19pbmRleChpKSkgewotICAgLy8gQ291bnQgdGhlIGZyZWUgc3BhY2UgaW4gYWxsIHRoZSBjaHVuayBidXQgbm90IHRoZQotICAgLy8gY3VycmVudCBjaHVuayBmcm9tIHdoaWNoIGFsbG9jYXRpb25zIGFyZSBzdGlsbCBiZWluZyBkb25lLgorICBmb3IgKENodW5rSW5kZXggaSA9IFNtYWxsSW5kZXg7IGkgPCBOdW1iZXJPZkluVXNlTGlzdHM7IGkgPSBuZXh0X2NodW5rX2luZGV4KGkpKSB7CisKKwogICAgcmVzdWx0ICs9IHN1bV93YXN0ZV9pbl9jaHVua3NfaW5fdXNlKGkpOwogICB9CisKICAgcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAtMjAzMywxMCArMTc3NSwxMCBAQAogICAvLyBDb3VudCB0aGUgZnJlZSBzcGFjZSBpbiBhbGwgdGhlIGNodW5rIGJ1dCBub3QgdGhlCiAgIC8vIGN1cnJlbnQgY2h1bmsgZnJvbSB3aGljaCBhbGxvY2F0aW9ucyBhcmUgc3RpbGwgYmVpbmcgZG9uZS4KICAgaWYgKGNodW5rICE9IE5VTEwpIHsKLSAgICB3aGlsZSAoY2h1bmsgIT0gTlVMTCkgewotICAgICAgaWYgKGNodW5rICE9IGN1cnJlbnRfY2h1bmsoKSkgewotICAgICAgICByZXN1bHQgKz0gY2h1bmstPmZyZWVfd29yZF9zaXplKCk7Ci0gICAgICB9CisgICAgTWV0YWNodW5rKiBwcmV2ID0gY2h1bms7CisgICAgd2hpbGUgKGNodW5rICE9IE5VTEwgJiYgY2h1bmsgIT0gY3VycmVudF9jaHVuaygpKSB7CisgICAgICByZXN1bHQgKz0gY2h1bmstPmZyZWVfd29yZF9zaXplKCk7CisgICAgICBwcmV2ID0gY2h1bms7CiAgICAgICBjaHVuayA9IGNodW5rLT5uZXh0KCk7CiAgICAgICBjb3VudCsrOwogICAgIH0KQEAgLTIwNDcsNyArMTc4OSw3IEBACiBzaXplX3QgU3BhY2VNYW5hZ2VyOjpzdW1fY2FwYWNpdHlfaW5fY2h1bmtzX2luX3VzZSgpIGNvbnN0IHsKICAgTXV0ZXhMb2NrZXJFeCBjbChsb2NrKCksIE11dGV4Ojpfbm9fc2FmZXBvaW50X2NoZWNrX2ZsYWcpOwogICBzaXplX3Qgc3VtID0gMDsKLSAgZm9yIChDaHVua0luZGV4IGkgPSBTbWFsbEluZGV4OyBpIDwgTnVtYmVyT2ZGcmVlTGlzdHM7IGkgPSBuZXh0X2NodW5rX2luZGV4KGkpKSB7CisgIGZvciAoQ2h1bmtJbmRleCBpID0gU21hbGxJbmRleDsgaSA8IE51bWJlck9mSW5Vc2VMaXN0czsgaSA9IG5leHRfY2h1bmtfaW5kZXgoaSkpIHsKICAgICBNZXRhY2h1bmsqIGNodW5rID0gY2h1bmtzX2luX3VzZShpKTsKICAgICB3aGlsZSAoY2h1bmsgIT0gTlVMTCkgewogICAgICAgLy8gSnVzdCBjaGFuZ2VkIHRoaXMgc3VtICs9IGNodW5rLT5jYXBhY2l0eV93b3JkX3NpemUoKTsKQEAgLTIwNjEsOSArMTgwMywxMCBAQAogCiBzaXplX3QgU3BhY2VNYW5hZ2VyOjpzdW1fY291bnRfaW5fY2h1bmtzX2luX3VzZSgpIHsKICAgc2l6ZV90IGNvdW50ID0gMDsKLSAgZm9yIChDaHVua0luZGV4IGkgPSBTbWFsbEluZGV4OyBpIDwgTnVtYmVyT2ZGcmVlTGlzdHM7IGkgPSBuZXh0X2NodW5rX2luZGV4KGkpKSB7CisgIGZvciAoQ2h1bmtJbmRleCBpID0gU21hbGxJbmRleDsgaSA8IE51bWJlck9mSW5Vc2VMaXN0czsgaSA9IG5leHRfY2h1bmtfaW5kZXgoaSkpIHsKICAgICBjb3VudCA9IGNvdW50ICsgc3VtX2NvdW50X2luX2NodW5rc19pbl91c2UoaSk7CiAgIH0KKwogICByZXR1cm4gY291bnQ7CiB9CiAKQEAgLTIwODEsNyArMTgyNCw3IEBACiBzaXplX3QgU3BhY2VNYW5hZ2VyOjpzdW1fdXNlZF9pbl9jaHVua3NfaW5fdXNlKCkgY29uc3QgewogICBNdXRleExvY2tlckV4IGNsKGxvY2soKSwgTXV0ZXg6Ol9ub19zYWZlcG9pbnRfY2hlY2tfZmxhZyk7CiAgIHNpemVfdCB1c2VkID0gMDsKLSAgZm9yIChDaHVua0luZGV4IGkgPSBTbWFsbEluZGV4OyBpIDwgTnVtYmVyT2ZGcmVlTGlzdHM7IGkgPSBuZXh0X2NodW5rX2luZGV4KGkpKSB7CisgIGZvciAoQ2h1bmtJbmRleCBpID0gU21hbGxJbmRleDsgaSA8IE51bWJlck9mSW5Vc2VMaXN0czsgaSA9IG5leHRfY2h1bmtfaW5kZXgoaSkpIHsKICAgICBNZXRhY2h1bmsqIGNodW5rID0gY2h1bmtzX2luX3VzZShpKTsKICAgICB3aGlsZSAoY2h1bmsgIT0gTlVMTCkgewogICAgICAgdXNlZCArPSBjaHVuay0+dXNlZF93b3JkX3NpemUoKTsKQEAgLTIxMzksMTUgKzE4ODIsMTMgQEAKICAgICBnY2xvZ19vcl90dHktPnByaW50X2NyKCIgIHdvcmRfc2l6ZSAiIFBUUl9GT1JNQVQsIHdvcmRfc2l6ZSk7CiAgICAgZ2Nsb2dfb3JfdHR5LT5wcmludF9jcigiICBjaHVua193b3JkX3NpemUgIiBQVFJfRk9STUFULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtfd29yZF9zaXplKTsKLSAgICBnY2xvZ19vcl90dHktPnByaW50X2NyKCIgICAgYmxvY2sgb3ZlcmhlYWQgIiBQVFJfRk9STUFUCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiIGNodW5rIG92ZXJoZWFkICIgUFRSX0ZPUk1BVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFibG9jazo6b3ZlcmhlYWQoKSwKKyAgICBnY2xvZ19vcl90dHktPnByaW50X2NyKCIgICAgY2h1bmsgb3ZlcmhlYWQgIiBQVFJfRk9STUFULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YWNodW5rOjpvdmVyaGVhZCgpKTsKICAgfQogICByZXR1cm4gY2h1bmtfd29yZF9zaXplOwogfQogCi1NZXRhYmxvY2sqIFNwYWNlTWFuYWdlcjo6Z3Jvd19hbmRfYWxsb2NhdGUoc2l6ZV90IHdvcmRfc2l6ZSkgeworTWV0YVdvcmQqIFNwYWNlTWFuYWdlcjo6Z3Jvd19hbmRfYWxsb2NhdGUoc2l6ZV90IHdvcmRfc2l6ZSkgewogICBhc3NlcnQodnNfbGlzdCgpLT5jdXJyZW50X3ZpcnR1YWxfc3BhY2UoKSAhPSBOVUxMLAogICAgICAgICAgIlNob3VsZCBoYXZlIGJlZW4gc2V0Iik7CiAgIGFzc2VydChjdXJyZW50X2NodW5rKCkgPT0gTlVMTCB8fApAQCAtMjE4MCw3ICsxOTIxLDcgQEAKIHZvaWQgU3BhY2VNYW5hZ2VyOjpwcmludF9vbihvdXRwdXRTdHJlYW0qIHN0KSBjb25zdCB7CiAKICAgZm9yIChDaHVua0luZGV4IGkgPSBTbWFsbEluZGV4OwotICAgICAgIGkgPCBOdW1iZXJPZkZyZWVMaXN0cyA7CisgICAgICAgaSA8IE51bWJlck9mSW5Vc2VMaXN0cyA7CiAgICAgICAgaSA9IG5leHRfY2h1bmtfaW5kZXgoaSkgKSB7CiAgICAgc3QtPnByaW50X2NyKCIgIGNodW5rc19pbl91c2UgIiBQVFJfRk9STUFUICIgY2h1bmsgc2l6ZSAiIFBUUl9GT1JNQVQsCiAgICAgICAgICAgICAgICAgIGNodW5rc19pbl91c2UoaSksCkBAIC0yMTkxLDggKzE5MzIsMTEgQEAKICAgICAgICAgICAgICAgIHN1bV93YXN0ZV9pbl9jaHVua3NfaW5fdXNlKFNtYWxsSW5kZXgpLAogICAgICAgICAgICAgICAgc3VtX3dhc3RlX2luX2NodW5rc19pbl91c2UoTWVkaXVtSW5kZXgpLAogICAgICAgICAgICAgICAgc3VtX3dhc3RlX2luX2NodW5rc19pbl91c2UoSHVtb25nb3VzSW5kZXgpKTsKLSAgLy8gTm90aGluZyBpbiB0aGVtIHlldAotICAvLyBibG9ja19mcmVlbGlzdHMoKS0+cHJpbnRfb24oc3QpOworICAvLyBibG9jayBmcmVlIGxpc3RzCisgIGlmIChibG9ja19mcmVlbGlzdHMoKSAhPSBOVUxMKSB7CisgICAgc3QtPnByaW50X2NyKCJ0b3RhbCBpbiBibG9jayBmcmVlIGxpc3RzICIgU0laRV9GT1JNQVQsCisgICAgICBibG9ja19mcmVlbGlzdHMoKS0+dG90YWxfc2l6ZSgpKTsKKyAgfQogfQogCiBTcGFjZU1hbmFnZXI6OlNwYWNlTWFuYWdlcihNdXRleCogbG9jaywgVmlydHVhbFNwYWNlTGlzdCogdnNfbGlzdCkgOgpAQCAtMjIwMCw3ICsxOTQ0LDcgQEAKICAgX2FsbG9jYXRpb25fdG90YWwoMCksCiAgIF9sb2NrKGxvY2spIHsKICAgTWV0YWRlYnVnOjppbml0X2FsbG9jYXRpb25fZmFpbF9hbG90X2NvdW50KCk7Ci0gIGZvciAoQ2h1bmtJbmRleCBpID0gU21hbGxJbmRleDsgaSA8IE51bWJlck9mRnJlZUxpc3RzOyBpID0gbmV4dF9jaHVua19pbmRleChpKSkgeworICBmb3IgKENodW5rSW5kZXggaSA9IFNtYWxsSW5kZXg7IGkgPCBOdW1iZXJPZkluVXNlTGlzdHM7IGkgPSBuZXh0X2NodW5rX2luZGV4KGkpKSB7CiAgICAgX2NodW5rc19pbl91c2VbaV0gPSBOVUxMOwogICB9CiAgIF9jdXJyZW50X2NodW5rID0gTlVMTDsKQEAgLTIyNjIsMjIgKzIwMDYsMjQgQEAKICAgLy8gSHVtb25nb3VzIGNodW5rcyBhcmUgbmV2ZXIgdGhlIGN1cnJlbnQgY2h1bmsuCiAgIE1ldGFjaHVuayogaHVtb25nb3VzX2NodW5rcyA9IGNodW5rc19pbl91c2UoSHVtb25nb3VzSW5kZXgpOwogCi0gIGlmIChodW1vbmdvdXNfY2h1bmtzICE9IE5VTEwpIHsKLSAgICBjaHVua19tYW5hZ2VyLT5mcmVlX2h1bW9uZ291c19jaHVua3MoKS0+YWRkX2F0X2hlYWQoaHVtb25nb3VzX2NodW5rcyk7Ci0gICAgc2V0X2NodW5rc19pbl91c2UoSHVtb25nb3VzSW5kZXgsIE5VTEwpOworICB3aGlsZSAoaHVtb25nb3VzX2NodW5rcyAhPSBOVUxMKSB7CisjaWZkZWYgQVNTRVJUCisgICAgaHVtb25nb3VzX2NodW5rcy0+c2V0X2lzX2ZyZWUodHJ1ZSk7CisjZW5kaWYKKyAgICBNZXRhY2h1bmsqIG5leHRfaHVtb25nb3VzX2NodW5rcyA9IGh1bW9uZ291c19jaHVua3MtPm5leHQoKTsKKyAgICBjaHVua19tYW5hZ2VyLT5odW1vbmdvdXNfZGljdGlvbmFyeSgpLT5yZXR1cm5fY2h1bmsoaHVtb25nb3VzX2NodW5rcyk7CisgICAgaHVtb25nb3VzX2NodW5rcyA9IG5leHRfaHVtb25nb3VzX2NodW5rczsKICAgfQorICBzZXRfY2h1bmtzX2luX3VzZShIdW1vbmdvdXNJbmRleCwgTlVMTCk7CiAgIGNodW5rX21hbmFnZXItPmxvY2tlZF92ZXJpZnkoKTsKIH0KIAotdm9pZCBTcGFjZU1hbmFnZXI6OmRlYWxsb2NhdGUoTWV0YVdvcmQqIHApIHsKK3ZvaWQgU3BhY2VNYW5hZ2VyOjpkZWFsbG9jYXRlKE1ldGFXb3JkKiBwLCBzaXplX3Qgd29yZF9zaXplKSB7CiAgIGFzc2VydF9sb2NrX3N0cm9uZyhfbG9jayk7Ci0gIFNob3VsZE5vdFJlYWNoSGVyZSgpOyAgLy8gV2hlcmUgaXMgdGhpcyBuZWVkZWQuCi0jaWZkZWYgREVBTExPQ0FURV9CTE9DS1MKLSAgTWV0YWJsb2NrKiBibG9jayA9IE1ldGFibG9jazo6bWV0YWJsb2NrX2Zyb21fZGF0YShwKTsKLSAgLy8gVGhpcyBpcyBleHBlbnNlIGJ1dCBrZXB0IGl0IHVudGlsIGludGVncmF0aW9uIEpKSgotICBhc3NlcnQoY29udGFpbnMoKGFkZHJlc3MpYmxvY2spLCAiQmxvY2sgZG9lcyBub3QgYmVsb25nIHRvIHRoaXMgbWV0YXNwYWNlIik7Ci0gIGJsb2NrX2ZyZWVsaXN0cygpLT5yZXR1cm5fYmxvY2soYmxvY2ssIHdvcmRfc2l6ZSk7Ci0jZW5kaWYKKyAgc2l6ZV90IG1pbl9zaXplID0gVHJlZUNodW5rPE1ldGFibG9jaywgRnJlZUxpc3Q+OjptaW5fc2l6ZSgpOworICBhc3NlcnQod29yZF9zaXplID49IG1pbl9zaXplLAorICAgIGVycl9tc2coIlNob3VsZCBub3QgZGVhbGxvY2F0ZSBkYXJrIG1hdHRlciAiIFNJWkVfRk9STUFULCB3b3JkX3NpemUpKTsKKyAgYmxvY2tfZnJlZWxpc3RzKCktPnJldHVybl9ibG9jayhwLCB3b3JkX3NpemUpOwogfQogCiAvLyBBZGRzIGEgY2h1bmsgdG8gdGhlIGxpc3Qgb2YgY2h1bmtzIGluIHVzZS4KQEAgLTIzNjYsNTAgKzIxMTIsNDAgQEAKIE1ldGFXb3JkKiBTcGFjZU1hbmFnZXI6OmFsbG9jYXRlKHNpemVfdCB3b3JkX3NpemUpIHsKICAgTXV0ZXhMb2NrZXJFeCBjbChsb2NrKCksIE11dGV4Ojpfbm9fc2FmZXBvaW50X2NoZWNrX2ZsYWcpOwogCi0gIHNpemVfdCBibG9ja19vdmVyaGVhZCA9IE1ldGFibG9jazo6b3ZlcmhlYWQoKTsKICAgLy8gSWYgb25seSB0aGUgZGljdGlvbmFyeSBpcyBnb2luZyB0byBiZSB1c2VkIChpLmUuLCBubwogICAvLyBpbmRleGVkIGZyZWUgbGlzdCksIHRoZW4gdGhlcmUgaXMgYSBtaW5pbXVtIHNpemUgcmVxdWlyZW1lbnQuCiAgIC8vIE1pbkNodW5rU2l6ZSBpcyBhIHBsYWNlaG9sZGVyIGZvciB0aGUgcmVhbCBtaW5pbXVtIHNpemUgSkpKCi0gIHNpemVfdCBieXRlX3NpemVfd2l0aF9vdmVyaGVhZCA9ICh3b3JkX3NpemUgKyBibG9ja19vdmVyaGVhZCkgKiBCeXRlc1BlcldvcmQ7Ci0jaWZkZWYgREVBTExPQ0FURV9CTE9DS1MKLSAgc2l6ZV90IHJhd19ieXRlc19zaXplID0gTUFYMihBUkVOQV9BTElHTihieXRlX3NpemVfd2l0aF9vdmVyaGVhZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWluQ2h1bmtTaXplICogQnl0ZXNQZXJXb3JkKTsKLSNlbHNlCi0gIHNpemVfdCByYXdfYnl0ZXNfc2l6ZSA9IEFSRU5BX0FMSUdOKGJ5dGVfc2l6ZV93aXRoX292ZXJoZWFkKTsKLSNlbmRpZgorICBzaXplX3QgYnl0ZV9zaXplID0gd29yZF9zaXplICogQnl0ZXNQZXJXb3JkOworCisgIHNpemVfdCBieXRlX3NpemVfd2l0aF9vdmVyaGVhZCA9IGJ5dGVfc2l6ZSArIE1ldGFibG9jazo6b3ZlcmhlYWQoKTsKKworICBzaXplX3QgcmF3X2J5dGVzX3NpemUgPSBNQVgyKGJ5dGVfc2l6ZV93aXRoX292ZXJoZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFibG9jazo6bWluX2Jsb2NrX2J5dGVfc2l6ZSgpKTsKKyAgcmF3X2J5dGVzX3NpemUgPSBBUkVOQV9BTElHTihyYXdfYnl0ZXNfc2l6ZSk7CiAgIHNpemVfdCByYXdfd29yZF9zaXplID0gcmF3X2J5dGVzX3NpemUgLyBCeXRlc1BlcldvcmQ7CiAgIGFzc2VydChyYXdfd29yZF9zaXplICogQnl0ZXNQZXJXb3JkID09IHJhd19ieXRlc19zaXplLCAiU2l6ZSBwcm9ibGVtIik7CiAKICAgQmxvY2tGcmVlbGlzdCogZmwgPSAgYmxvY2tfZnJlZWxpc3RzKCk7Ci0gIE1ldGFibG9jayogYmxvY2sgPSBOVUxMOworICBNZXRhV29yZCogcCA9IE5VTEw7CiAgIC8vIEFsbG9jYXRpb24gZnJvbSB0aGUgZGljdGlvbmFyeSBpcyBleHBlbnNpdmUgaW4gdGhlIHNlbnNlIHRoYXQKICAgLy8gdGhlIGRpY3Rpb25hcnkgaGFzIHRvIGJlIHNlYXJjaGVkIGZvciBhIHNpemUuICBEb24ndCBhbGxvY2F0ZQogICAvLyBmcm9tIHRoZSBkaWN0aW9uYXJ5IHVudGlsIGl0IHN0YXJ0cyB0byBnZXQgZmF0LiAgSXMgdGhpcwogICAvLyBhIHJlYXNvbmFibGUgcG9saWN5PyAgTWF5YmUgYW4gc2tpbm55IGRpY3Rpb25hcnkgaXMgZmFzdCBlbm91Z2gKICAgLy8gZm9yIGFsbG9jYXRpb25zLiAgRG8gc29tZSBwcm9maWxpbmcuICBKSkoKLSAgaWYgKGZsLT50b3RhbFNpemUoKSA+IGFsbG9jYXRpb25fZnJvbV9kaWN0aW9uYXJ5X2xpbWl0KSB7Ci0gICAgYmxvY2sgPSBmbC0+Z2V0X2Jsb2NrKHJhd193b3JkX3NpemUpOworICBpZiAoZmwtPnRvdGFsX3NpemUoKSA+IGFsbG9jYXRpb25fZnJvbV9kaWN0aW9uYXJ5X2xpbWl0KSB7CisgICAgcCA9IGZsLT5nZXRfYmxvY2socmF3X3dvcmRfc2l6ZSk7CiAgIH0KLSAgaWYgKGJsb2NrID09IE5VTEwpIHsKLSAgICBibG9jayA9IGFsbG9jYXRlX3dvcmsocmF3X3dvcmRfc2l6ZSk7Ci0gICAgaWYgKGJsb2NrID09IE5VTEwpIHsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KKyAgaWYgKHAgPT0gTlVMTCkgeworICAgIHAgPSBhbGxvY2F0ZV93b3JrKHJhd193b3JkX3NpemUpOwogICB9CiAgIE1ldGFkZWJ1Zzo6ZGVhbGxvY2F0ZV9ibG9ja19hX2xvdCh0aGlzLCByYXdfd29yZF9zaXplKTsKIAotICAvLyBQdXNoIHRoZSBhbGxvY2F0aW9uIHBhc3QgdGhlIHdvcmQgY29udGFpbmluZyB0aGUgc2l6ZSBhbmQgbGVhZGVyLgotI2lmZGVmIEFTU0VSVAotICBNZXRhV29yZCogcmVzdWx0ID0gIGJsb2NrLT5kYXRhKCk7Ci0gIHJldHVybiByZXN1bHQ7Ci0jZWxzZQotICByZXR1cm4gKE1ldGFXb3JkKikgYmxvY2s7Ci0jZW5kaWYKKyAgcmV0dXJuIHA7CiB9CiAKIC8vIFJldHVybnMgdGhlIGFkZHJlc3Mgb2Ygc3BhY2VkIGFsbG9jYXRlZCBmb3IgIndvcmRfc2l6ZSIuCiAvLyBUaGlzIG1ldGhvZHMgZG9lcyBub3Qga25vdyBhYm91dCBibG9ja3MgKE1ldGFibG9ja3MpCi1NZXRhYmxvY2sqIFNwYWNlTWFuYWdlcjo6YWxsb2NhdGVfd29yayhzaXplX3Qgd29yZF9zaXplKSB7CitNZXRhV29yZCogU3BhY2VNYW5hZ2VyOjphbGxvY2F0ZV93b3JrKHNpemVfdCB3b3JkX3NpemUpIHsKICAgYXNzZXJ0X2xvY2tfc3Ryb25nKF9sb2NrKTsKICNpZmRlZiBBU1NFUlQKICAgaWYgKE1ldGFkZWJ1Zzo6dGVzdF9tZXRhZGF0YV9mYWlsdXJlKCkpIHsKQEAgLTI0MTcsNyArMjE1Myw3IEBACiAgIH0KICNlbmRpZgogICAvLyBJcyB0aGVyZSBzcGFjZSBpbiB0aGUgY3VycmVudCBjaHVuaz8KLSAgTWV0YWJsb2NrKiByZXN1bHQgPSBOVUxMOworICBNZXRhV29yZCogcmVzdWx0ID0gTlVMTDsKIAogICAvLyBGb3IgRHVtcFNoYXJlZFNwYWNlcywgb25seSBhbGxvY2F0ZSBvdXQgb2YgdGhlIGN1cnJlbnQgY2h1bmsgd2hpY2ggaXMKICAgLy8gbmV2ZXIgbnVsbCBiZWNhdXNlIHdlIGdhdmUgaXQgdGhlIHNpemUgd2Ugd2FudGVkLiAgIENhbGxlciByZXBvcnRzIG91dApAQCAtMjQzNiw4ICsyMTcyLDggQEAKICAgfQogICBpZiAocmVzdWx0ID4gMCkgewogICAgIGluY19hbGxvY2F0aW9uX3RvdGFsKHdvcmRfc2l6ZSk7Ci0gICAgYXNzZXJ0KHJlc3VsdCAhPSAoTWV0YWJsb2NrKikgY2h1bmtzX2luX3VzZShNZWRpdW1JbmRleCksICJIZWFkIG9mIHRoZSBsaXN0IGlzIGJlaW5nIGFsbG9jYXRlZCIpOwotICAgIGFzc2VydChyZXN1bHQtPndvcmRfc2l6ZSgpID09IHdvcmRfc2l6ZSwgIlNpemUgbm90IHNldCBjb3JyZWN0bHkiKTsKKyAgICBhc3NlcnQocmVzdWx0ICE9IChNZXRhV29yZCopIGNodW5rc19pbl91c2UoTWVkaXVtSW5kZXgpLAorICAgICAgICAgICAiSGVhZCBvZiB0aGUgbGlzdCBpcyBiZWluZyBhbGxvY2F0ZWQiKTsKICAgfQogCiAgIHJldHVybiByZXN1bHQ7CkBAIC0yNDQ3LDEzICsyMTgzLDEzIEBACiAgIC8vIElmIHRoZXJlIGFyZSBibG9ja3MgaW4gdGhlIGRpY3Rpb25hcnksIHRoZW4KICAgLy8gdmVyZmljYXRpb24gb2YgY2h1bmtzIGRvZXMgbm90IHdvcmsgc2luY2UKICAgLy8gYmVpbmcgaW4gdGhlIGRpY3Rpb25hcnkgYWx0ZXJzIGEgY2h1bmsuCi0gIGlmIChibG9ja19mcmVlbGlzdHMoKS0+dG90YWxTaXplKCkgPT0gMCkgeworICBpZiAoYmxvY2tfZnJlZWxpc3RzKCktPnRvdGFsX3NpemUoKSA9PSAwKSB7CiAgICAgLy8gU2tpcCB0aGUgc21hbGwgY2h1bmtzIGJlY2F1c2UgdGhlaXIgbmV4dCBsaW5rIHBvaW50cyB0bwogICAgIC8vIG1lZGl1bSBjaHVua3MuICBUaGlzIGlzIGJlY2F1c2UgdGhlIHNtYWxsIGNodW5rIGlzIHRoZQogICAgIC8vIGN1cnJlbnQgY2h1bmsgKGZvciBhbGxvY2F0aW9ucykgdW50aWwgaXQgaXMgZnVsbCBhbmQgdGhlCiAgICAgLy8gdGhlIGFkZGl0aW9uIG9mIHRoZSBuZXh0IGNodW5rIGRvZXMgbm90IE5VTEwgdGhlIG5leHQKICAgICAvLyBsaWtlIG9mIHRoZSBzbWFsbCBjaHVuay4KLSAgICBmb3IgKENodW5rSW5kZXggaSA9IE1lZGl1bUluZGV4OyBpIDwgTnVtYmVyT2ZGcmVlTGlzdHM7IGkgPSBuZXh0X2NodW5rX2luZGV4KGkpKSB7CisgICAgZm9yIChDaHVua0luZGV4IGkgPSBNZWRpdW1JbmRleDsgaSA8IE51bWJlck9mSW5Vc2VMaXN0czsgaSA9IG5leHRfY2h1bmtfaW5kZXgoaSkpIHsKICAgICAgIE1ldGFjaHVuayogY3VyciA9IGNodW5rc19pbl91c2UoaSk7CiAgICAgICB3aGlsZSAoY3VyciAhPSBOVUxMKSB7CiAgICAgICAgIGN1cnItPnZlcmlmeSgpOwpAQCAtMjQ5Miw3ICsyMjI4LDcgQEAKIAogICAvLyBBZGQgdXAgc3RhdGlzdGljcyBmb3IgYWxsIGNodW5rcyBpbiB0aGlzIFNwYWNlTWFuYWdlci4KICAgZm9yIChDaHVua0luZGV4IGluZGV4ID0gU21hbGxJbmRleDsKLSAgICAgICBpbmRleCA8IE51bWJlck9mRnJlZUxpc3RzOworICAgICAgIGluZGV4IDwgTnVtYmVyT2ZJblVzZUxpc3RzOwogICAgICAgIGluZGV4ID0gbmV4dF9jaHVua19pbmRleChpbmRleCkpIHsKICAgICBmb3IgKE1ldGFjaHVuayogY3VyciA9IGNodW5rc19pbl91c2UoaW5kZXgpOwogICAgICAgICAgY3VyciAhPSBOVUxMOwpAQCAtMjUyMSw3ICsyMjU3LDcgQEAKICNpZmRlZiBBU1NFUlQKIHZvaWQgU3BhY2VNYW5hZ2VyOjptYW5nbGVfZnJlZWRfY2h1bmtzKCkgewogICBmb3IgKENodW5rSW5kZXggaW5kZXggPSBTbWFsbEluZGV4OwotICAgICAgIGluZGV4IDwgTnVtYmVyT2ZGcmVlTGlzdHM7CisgICAgICAgaW5kZXggPCBOdW1iZXJPZkluVXNlTGlzdHM7CiAgICAgICAgaW5kZXggPSBuZXh0X2NodW5rX2luZGV4KGluZGV4KSkgewogICAgIGZvciAoTWV0YWNodW5rKiBjdXJyID0gY2h1bmtzX2luX3VzZShpbmRleCk7CiAgICAgICAgICBjdXJyICE9IE5VTEw7CkBAIC0yODMzLDEzICsyNTY5LDEyIEBACiAgIH0KIH0KIAotCiBNZXRhV29yZCogTWV0YXNwYWNlOjphbGxvY2F0ZShzaXplX3Qgd29yZF9zaXplLCBNZXRhZGF0YVR5cGUgbWR0eXBlKSB7CiAgIC8vIER1bXBTaGFyZWRTcGFjZXMgZG9lc24ndCB1c2UgY2xhc3MgbWV0YWRhdGEgYXJlYSAoeWV0KQogICBpZiAobWR0eXBlID09IENsYXNzVHlwZSAmJiAhRHVtcFNoYXJlZFNwYWNlcykgewotICAgIHJldHVybiBjbGFzc192c20oKS0+YWxsb2NhdGUod29yZF9zaXplKTsKKyAgICByZXR1cm4gIGNsYXNzX3ZzbSgpLT5hbGxvY2F0ZSh3b3JkX3NpemUpOwogICB9IGVsc2UgewotICAgIHJldHVybiB2c20oKS0+YWxsb2NhdGUod29yZF9zaXplKTsKKyAgICByZXR1cm4gIHZzbSgpLT5hbGxvY2F0ZSh3b3JkX3NpemUpOwogICB9CiB9CiAKQEAgLTI4NTMsNiArMjU4OCw3IEBACiAgICAgZ2Nsb2dfb3JfdHR5LT5wcmludF9jcigiSW5jcmVhc2UgY2FwYWNpdHkgdG8gR0MgZnJvbSAiIFNJWkVfRk9STUFUCiAgICAgICAiIHRvICIgU0laRV9GT1JNQVQsIGJlZm9yZV9pbmMsIE1ldGFzcGFjZUdDOjpjYXBhY2l0eV91bnRpbF9HQygpKTsKICAgfQorCiAgIHJlc3VsdCA9IGFsbG9jYXRlKHdvcmRfc2l6ZSwgbWR0eXBlKTsKIAogICByZXR1cm4gcmVzdWx0OwpAQCAtMjg4OSwzNyArMjYyNSwzOSBAQAogdm9pZCBNZXRhc3BhY2U6OmRlYWxsb2NhdGUoTWV0YVdvcmQqIHB0ciwgc2l6ZV90IHdvcmRfc2l6ZSwgYm9vbCBpc19jbGFzcykgewogICBpZiAoU2FmZXBvaW50U3luY2hyb25pemU6OmlzX2F0X3NhZmVwb2ludCgpKSB7CiAgICAgYXNzZXJ0KFRocmVhZDo6Y3VycmVudCgpLT5pc19WTV90aHJlYWQoKSwgInNob3VsZCBiZSB0aGUgVk0gdGhyZWFkIik7Ci0gICAgLy8gRG9uJ3QgdGFrZSBsb2NrCi0jaWZkZWYgREVBTExPQ0FURV9CTE9DS1MKLSAgICBpZiAoaXNfY2xhc3MpIHsKLSAgICAgIGNsYXNzX3ZzbSgpLT5kZWFsbG9jYXRlKHB0cik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHZzbSgpLT5kZWFsbG9jYXRlKHB0cik7Ci0gICAgfQotI2Vsc2UKKyAgICAvLyBEb24ndCB0YWtlIEhlYXBfbG9jaworICAgIE11dGV4TG9ja2VyIG1sKHZzbSgpLT5sb2NrKCkpOworICAgIGlmICh3b3JkX3NpemUgPCBUcmVlQ2h1bms8TWV0YWJsb2NrLCBGcmVlTGlzdD46Om1pbl9zaXplKCkpIHsKKyAgICAgIC8vIERhcmsgbWF0dGVyLiAgVG9vIHNtYWxsIGZvciBkaWN0aW9uYXJ5LgogI2lmZGVmIEFTU0VSVAotICAgIENvcHk6OmZpbGxfdG9fd29yZHMoKEhlYXBXb3JkKilwdHIsIHdvcmRfc2l6ZSwgbWV0YWRhdGFfZGVhbGxvY2F0ZSk7CisgICAgICBDb3B5OjpmaWxsX3RvX3dvcmRzKChIZWFwV29yZCopcHRyLCB3b3JkX3NpemUsIDB4ZjVmNWY1ZjUpOwogI2VuZGlmCi0jZW5kaWYKLQorICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoaXNfY2xhc3MpIHsKKyAgICAgICBjbGFzc192c20oKS0+ZGVhbGxvY2F0ZShwdHIsIHdvcmRfc2l6ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHZzbSgpLT5kZWFsbG9jYXRlKHB0ciwgd29yZF9zaXplKTsKKyAgICB9CiAgIH0gZWxzZSB7CiAgICAgTXV0ZXhMb2NrZXIgbWwodnNtKCktPmxvY2soKSk7CiAKLSNpZmRlZiBERUFMTE9DQVRFX0JMT0NLUwotICAgIGlmIChpc19jbGFzcykgewotICAgICAgY2xhc3NfdnNtKCktPmRlYWxsb2NhdGUocHRyKTsKLSAgICB9IGVsc2UgewotICAgICAgdnNtKCktPmRlYWxsb2NhdGUocHRyKTsKLSAgICB9Ci0jZWxzZQorICAgIGlmICh3b3JkX3NpemUgPCBUcmVlQ2h1bms8TWV0YWJsb2NrLCBGcmVlTGlzdD46Om1pbl9zaXplKCkpIHsKKyAgICAgIC8vIERhcmsgbWF0dGVyLiAgVG9vIHNtYWxsIGZvciBkaWN0aW9uYXJ5LgogI2lmZGVmIEFTU0VSVAotICAgIENvcHk6OmZpbGxfdG9fd29yZHMoKEhlYXBXb3JkKilwdHIsIHdvcmRfc2l6ZSwgbWV0YWRhdGFfZGVhbGxvY2F0ZSk7CisgICAgICBDb3B5OjpmaWxsX3RvX3dvcmRzKChIZWFwV29yZCopcHRyLCB3b3JkX3NpemUsIDB4ZjVmNWY1ZjUpOwogI2VuZGlmCi0jZW5kaWYKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKGlzX2NsYXNzKSB7CisgICAgICBjbGFzc192c20oKS0+ZGVhbGxvY2F0ZShwdHIsIHdvcmRfc2l6ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHZzbSgpLT5kZWFsbG9jYXRlKHB0ciwgd29yZF9zaXplKTsKKyAgICB9CiAgIH0KIH0KIAotTWV0YVdvcmQqIE1ldGFzcGFjZTo6YWxsb2NhdGUoQ2xhc3NMb2FkZXJEYXRhKiBsb2FkZXJfZGF0YSwgc2l6ZV90IHdvcmRfc2l6ZSwKK01ldGFibG9jayogTWV0YXNwYWNlOjphbGxvY2F0ZShDbGFzc0xvYWRlckRhdGEqIGxvYWRlcl9kYXRhLCBzaXplX3Qgd29yZF9zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZWFkX29ubHksIE1ldGFkYXRhVHlwZSBtZHR5cGUsIFRSQVBTKSB7CiAgIGlmIChIQVNfUEVORElOR19FWENFUFRJT04pIHsKICAgICBhc3NlcnQoZmFsc2UsICJTaG91bGQgbm90IGFsbG9jYXRlIHdpdGggZXhjZXB0aW9uIHBlbmRpbmciKTsKQEAgLTI5NDMsNyArMjY4MSw3IEBACiAgICAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7CiAgICAgICByZXBvcnRfb3V0X29mX3NoYXJlZF9zcGFjZShyZWFkX29ubHkgPyBTaGFyZWRSZWFkT25seSA6IFNoYXJlZFJlYWRXcml0ZSk7CiAgICAgfQotICAgIHJldHVybiByZXN1bHQ7CisgICAgcmV0dXJuIE1ldGFibG9jazo6aW5pdGlhbGl6ZShyZXN1bHQsIHdvcmRfc2l6ZSk7CiAgIH0KIAogICByZXN1bHQgPSBsb2FkZXJfZGF0YS0+bWV0YXNwYWNlX25vbl9udWxsKCktPmFsbG9jYXRlKHdvcmRfc2l6ZSwgbWR0eXBlKTsKQEAgLTI5NTEsNyArMjY4OSw3IEBACiAgIGlmIChyZXN1bHQgPT0gTlVMTCkgewogICAgIC8vIFRyeSB0byBjbGVhbiBvdXQgc29tZSBtZW1vcnkgYW5kIHJldHJ5LgogICAgIHJlc3VsdCA9Ci0gICAgVW5pdmVyc2U6OmhlYXAoKS0+Y29sbGVjdG9yX3BvbGljeSgpLT5zYXRpc2Z5X2ZhaWxlZF9tZXRhZGF0YV9hbGxvY2F0aW9uKAorICAgICAgVW5pdmVyc2U6OmhlYXAoKS0+Y29sbGVjdG9yX3BvbGljeSgpLT5zYXRpc2Z5X2ZhaWxlZF9tZXRhZGF0YV9hbGxvY2F0aW9uKAogICAgICAgICBsb2FkZXJfZGF0YSwgd29yZF9zaXplLCBtZHR5cGUpOwogCiAgICAgLy8gSWYgcmVzdWx0IGlzIHN0aWxsIG51bGwsIHdlIGFyZSBvdXQgb2YgbWVtb3J5LgpAQCAtMjk2Nyw3ICsyNzA1LDcgQEAKICAgICAgIFRIUk9XX09PUF8wKFVuaXZlcnNlOjpvdXRfb2ZfbWVtb3J5X2Vycm9yX3Blcm1fZ2VuKCkpOwogICAgIH0KICAgfQotICByZXR1cm4gcmVzdWx0OworICByZXR1cm4gTWV0YWJsb2NrOjppbml0aWFsaXplKHJlc3VsdCwgd29yZF9zaXplKTsKIH0KIAogdm9pZCBNZXRhc3BhY2U6OnByaW50X29uKG91dHB1dFN0cmVhbSogb3V0KSBjb25zdCB7CmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9zaGFyZS92bS9tZW1vcnkvbWV0YXNwYWNlLmhwcCBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL21lbW9yeS9tZXRhc3BhY2UuaHBwCmluZGV4IDE2OWEzYjcuLmM0MmE5NzkgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL21lbW9yeS9tZXRhc3BhY2UuaHBwCisrKyBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL21lbW9yeS9tZXRhc3BhY2UuaHBwCkBAIC01NywxMiArNTcsMTAgQEAKIC8vCiAKIGNsYXNzIENsYXNzTG9hZGVyRGF0YTsKK2NsYXNzIE1ldGFibG9jazsKIGNsYXNzIE1ldGFXb3JkOwogY2xhc3MgTXV0ZXg7CiBjbGFzcyBvdXRwdXRTdHJlYW07Ci1jbGFzcyBGcmVlQ2h1bms7Ci10ZW1wbGF0ZSA8Y2xhc3MgQ2h1bmtfdD4gY2xhc3MgRnJlZUxpc3Q7Ci10ZW1wbGF0ZSA8Y2xhc3MgQ2h1bmtfdD4gY2xhc3MgQmluYXJ5VHJlZURpY3Rpb25hcnk7CiBjbGFzcyBTcGFjZU1hbmFnZXI7CiAKIC8vIE1ldGFzcGFjZXMgZWFjaCBoYXZlIGEgIFNwYWNlTWFuYWdlciBhbmQgYWxsb2NhdGlvbnMKQEAgLTEyOCw3ICsxMjYsNyBAQAogICBzaXplX3QgY2FwYWNpdHlfd29yZHMoTWV0YWRhdGFUeXBlIG1kdHlwZSkgY29uc3Q7CiAgIHNpemVfdCB3YXN0ZV93b3JkcyhNZXRhZGF0YVR5cGUgbWR0eXBlKSBjb25zdDsKIAotICBzdGF0aWMgTWV0YVdvcmQqIGFsbG9jYXRlKENsYXNzTG9hZGVyRGF0YSogbG9hZGVyX2RhdGEsIHNpemVfdCBzaXplLAorICBzdGF0aWMgTWV0YWJsb2NrKiBhbGxvY2F0ZShDbGFzc0xvYWRlckRhdGEqIGxvYWRlcl9kYXRhLCBzaXplX3Qgc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlYWRfb25seSwgTWV0YWRhdGFUeXBlIG1kdHlwZSwgVFJBUFMpOwogICB2b2lkIGRlYWxsb2NhdGUoTWV0YVdvcmQqIHB0ciwgc2l6ZV90IGJ5dGVfc2l6ZSwgYm9vbCBpc19jbGFzcyk7CiAKZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL21lbW9yeS9tZXRhc3BhY2VTaGFyZWQuY3BwIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vbWVtb3J5L21ldGFzcGFjZVNoYXJlZC5jcHAKaW5kZXggZjY5ZTc1OC4uZGRlMjZiNSAxMDA2NDQKLS0tIGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vbWVtb3J5L21ldGFzcGFjZVNoYXJlZC5jcHAKKysrIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vbWVtb3J5L21ldGFzcGFjZVNoYXJlZC5jcHAKQEAgLTY2Myw4ICs2NjMsOCBAQAogICBpZiAoX3JvX2Jhc2UgPT0gTlVMTCB8fCBfcndfYmFzZSA9PSBOVUxMKSB7CiAgICAgcmV0dXJuIGZhbHNlOwogICB9IGVsc2UgewotICAgIHJldHVybiAoKHAgPiBfcm9fYmFzZSAmJiBwIDwgKF9yb19iYXNlICsgU2hhcmVkUmVhZE9ubHlTaXplKSkgfHwKLSAgICAgICAgICAgIChwID4gX3J3X2Jhc2UgJiYgcCA8IChfcndfYmFzZSArIFNoYXJlZFJlYWRXcml0ZVNpemUpKSk7CisgICAgcmV0dXJuICgocCA+PSBfcm9fYmFzZSAmJiBwIDwgKF9yb19iYXNlICsgU2hhcmVkUmVhZE9ubHlTaXplKSkgfHwKKyAgICAgICAgICAgIChwID49IF9yd19iYXNlICYmIHAgPCAoX3J3X2Jhc2UgKyBTaGFyZWRSZWFkV3JpdGVTaXplKSkpOwogICB9CiB9CiAKQEAgLTY5MywxNCArNjkzLDYgQEAKICAgUmVzZXJ2ZWRTcGFjZSBzaGFyZWRfcnMgPSBtYXBpbmZvLT5yZXNlcnZlX3NoYXJlZF9tZW1vcnkoKTsKICAgaWYgKCFzaGFyZWRfcnMuaXNfcmVzZXJ2ZWQoKSkgcmV0dXJuIGZhbHNlOwogCi0gIC8vIFNwbGl0IHJlc2VydmVkIG1lbW9yeSBpbnRvIHBpZWNlcyAod2luZG93cyBuZWVkcyB0aGlzKQotICBSZXNlcnZlZFNwYWNlIHJvX3JzICAgPSBzaGFyZWRfcnMuZmlyc3RfcGFydChTaGFyZWRSZWFkT25seVNpemUpOwotICBSZXNlcnZlZFNwYWNlIHRtcF9yczEgPSBzaGFyZWRfcnMubGFzdF9wYXJ0KFNoYXJlZFJlYWRPbmx5U2l6ZSk7Ci0gIFJlc2VydmVkU3BhY2UgcndfcnMgICA9IHRtcF9yczEuZmlyc3RfcGFydChTaGFyZWRSZWFkV3JpdGVTaXplKTsKLSAgUmVzZXJ2ZWRTcGFjZSB0bXBfcnMyID0gdG1wX3JzMS5sYXN0X3BhcnQoU2hhcmVkUmVhZFdyaXRlU2l6ZSk7Ci0gIFJlc2VydmVkU3BhY2UgbWRfcnMgICA9IHRtcF9yczIuZmlyc3RfcGFydChTaGFyZWRNaXNjRGF0YVNpemUpOwotICBSZXNlcnZlZFNwYWNlIG1jX3JzICAgPSB0bXBfcnMyLmxhc3RfcGFydChTaGFyZWRNaXNjRGF0YVNpemUpOwotCiAgIC8vIE1hcCBlYWNoIHNoYXJlZCByZWdpb24KICAgaWYgKChfcm9fYmFzZSA9IG1hcGluZm8tPm1hcF9yZWdpb24ocm8pKSAhPSBOVUxMICYmCiAgICAgICAoX3J3X2Jhc2UgPSBtYXBpbmZvLT5tYXBfcmVnaW9uKHJ3KSkgIT0gTlVMTCAmJgpkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vbWVtb3J5L3Jlc291cmNlQXJlYS5ocHAgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9tZW1vcnkvcmVzb3VyY2VBcmVhLmhwcAppbmRleCBmNDJjMGY2Li5mMTQxOGNlIDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9zaGFyZS92bS9tZW1vcnkvcmVzb3VyY2VBcmVhLmhwcAorKysgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9tZW1vcnkvcmVzb3VyY2VBcmVhLmhwcApAQCAtMTI3LDE1ICsxMjcsMjEgQEAKICAgdm9pZCByZXNldF90b19tYXJrKCkgewogICAgIGlmIChVc2VNYWxsb2NPbmx5KSBmcmVlX21hbGxvY2VkX29iamVjdHMoKTsKIAotICAgIGlmKCBfY2h1bmstPm5leHQoKSApICAgICAgICAvLyBEZWxldGUgbGF0ZXIgY2h1bmtzCisgICAgaWYoIF9jaHVuay0+bmV4dCgpICkgeyAgICAgICAvLyBEZWxldGUgbGF0ZXIgY2h1bmtzCisgICAgICAvLyByZXNldCBhcmVuYSBzaXplIGJlZm9yZSBkZWxldGUgY2h1bmtzLiBPdGhlcndpc2UsIHRoZSB0b3RhbAorICAgICAgLy8gYXJlbmEgc2l6ZSBjb3VsZCBleGNlZWQgdG90YWwgY2h1bmsgc2l6ZQorICAgICAgYXNzZXJ0KF9hcmVhLT5zaXplX2luX2J5dGVzKCkgPiBzaXplX2luX2J5dGVzKCksICJTYW5pdHkgY2hlY2siKTsKKyAgICAgIF9hcmVhLT5zZXRfc2l6ZV9pbl9ieXRlcyhzaXplX2luX2J5dGVzKCkpOwogICAgICAgX2NodW5rLT5uZXh0X2Nob3AoKTsKKyAgICB9IGVsc2UgeworICAgICAgYXNzZXJ0KF9hcmVhLT5zaXplX2luX2J5dGVzKCkgPT0gc2l6ZV9pbl9ieXRlcygpLCAiU2FuaXR5IGNoZWNrIik7CisgICAgfQogICAgIF9hcmVhLT5fY2h1bmsgPSBfY2h1bms7ICAgICAvLyBSb2xsIGJhY2sgYXJlbmEgdG8gc2F2ZWQgY2h1bmsKICAgICBfYXJlYS0+X2h3bSA9IF9od207CiAgICAgX2FyZWEtPl9tYXggPSBfbWF4OwogCiAgICAgLy8gY2xlYXIgb3V0IHRoaXMgY2h1bmsgKHRvIGRldGVjdCBhbGxvY2F0aW9uIGJ1Z3MpCiAgICAgaWYgKFphcFJlc291cmNlQXJlYSkgbWVtc2V0KF9od20sIGJhZFJlc291cmNlVmFsdWUsIF9tYXggLSBfaHdtKTsKLSAgICBfYXJlYS0+c2V0X3NpemVfaW5fYnl0ZXMoc2l6ZV9pbl9ieXRlcygpKTsKICAgfQogCiAgIH5SZXNvdXJjZU1hcmsoKSB7CkBAIC0yMTksMTUgKzIyNSwyMSBAQAogICB2b2lkIHJlc2V0X3RvX21hcmsoKSB7CiAgICAgaWYgKFVzZU1hbGxvY09ubHkpIGZyZWVfbWFsbG9jZWRfb2JqZWN0cygpOwogCi0gICAgaWYoIF9jaHVuay0+bmV4dCgpICkgICAgICAgIC8vIERlbGV0ZSBsYXRlciBjaHVua3MKKyAgICBpZiggX2NodW5rLT5uZXh0KCkgKSB7ICAgICAgICAvLyBEZWxldGUgbGF0ZXIgY2h1bmtzCisgICAgICAvLyByZXNldCBhcmVuYSBzaXplIGJlZm9yZSBkZWxldGUgY2h1bmtzLiBPdGhlcndpc2UsIHRoZSB0b3RhbAorICAgICAgLy8gYXJlbmEgc2l6ZSBjb3VsZCBleGNlZWQgdG90YWwgY2h1bmsgc2l6ZQorICAgICAgYXNzZXJ0KF9hcmVhLT5zaXplX2luX2J5dGVzKCkgPiBzaXplX2luX2J5dGVzKCksICJTYW5pdHkgY2hlY2siKTsKKyAgICAgIF9hcmVhLT5zZXRfc2l6ZV9pbl9ieXRlcyhzaXplX2luX2J5dGVzKCkpOwogICAgICAgX2NodW5rLT5uZXh0X2Nob3AoKTsKKyAgICB9IGVsc2UgeworICAgICAgYXNzZXJ0KF9hcmVhLT5zaXplX2luX2J5dGVzKCkgPT0gc2l6ZV9pbl9ieXRlcygpLCAiU2FuaXR5IGNoZWNrIik7CisgICAgfQogICAgIF9hcmVhLT5fY2h1bmsgPSBfY2h1bms7ICAgICAvLyBSb2xsIGJhY2sgYXJlbmEgdG8gc2F2ZWQgY2h1bmsKICAgICBfYXJlYS0+X2h3bSA9IF9od207CiAgICAgX2FyZWEtPl9tYXggPSBfbWF4OwogCiAgICAgLy8gY2xlYXIgb3V0IHRoaXMgY2h1bmsgKHRvIGRldGVjdCBhbGxvY2F0aW9uIGJ1Z3MpCiAgICAgaWYgKFphcFJlc291cmNlQXJlYSkgbWVtc2V0KF9od20sIGJhZFJlc291cmNlVmFsdWUsIF9tYXggLSBfaHdtKTsKLSAgICBfYXJlYS0+c2V0X3NpemVfaW5fYnl0ZXMoc2l6ZV9pbl9ieXRlcygpKTsKICAgfQogCiAgIH5EZW9wdFJlc291cmNlTWFyaygpIHsKZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29vcHMvbWV0aG9kLmNwcCBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29vcHMvbWV0aG9kLmNwcAppbmRleCA1YTEwMzJmLi45ODQ5ODI5IDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9zaGFyZS92bS9vb3BzL21ldGhvZC5jcHAKKysrIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vb29wcy9tZXRob2QuY3BwCkBAIC0xMTU1LDggKzExNTUsMTIgQEAKIHZtU3ltYm9sczo6U0lEIE1ldGhvZDo6a2xhc3NfaWRfZm9yX2ludHJpbnNpY3MoS2xhc3MqIGhvbGRlcikgewogICAvLyBpZiBsb2FkZXIgaXMgbm90IHRoZSBkZWZhdWx0IGxvYWRlciAoaS5lLiwgIT0gTlVMTCksIHdlIGNhbid0IGtub3cgdGhlIGludHJpbnNpY3MKICAgLy8gYmVjYXVzZSB3ZSBhcmUgbm90IGxvYWRpbmcgZnJvbSBjb3JlIGxpYnJhcmllcwotICBpZiAoSW5zdGFuY2VLbGFzczo6Y2FzdChob2xkZXIpLT5jbGFzc19sb2FkZXIoKSAhPSBOVUxMKQorICAvLyBleGNlcHRpb246IHRoZSBBRVMgaW50cmluc2ljcyBjb21lIGZyb20gbGliL2V4dC9zdW5qY2VfcHJvdmlkZXIuamFyCisgIC8vIHdoaWNoIGRvZXMgbm90IHVzZSB0aGUgY2xhc3MgZGVmYXVsdCBjbGFzcyBsb2FkZXIgc28gd2UgY2hlY2sgZm9yIGl0cyBsb2FkZXIgaGVyZQorICBpZiAoKEluc3RhbmNlS2xhc3M6OmNhc3QoaG9sZGVyKS0+Y2xhc3NfbG9hZGVyKCkgIT0gTlVMTCkgJiYKKyAgICAgICBJbnN0YW5jZUtsYXNzOjpjYXN0KGhvbGRlciktPmNsYXNzX2xvYWRlcigpLT5rbGFzcygpLT5uYW1lKCkgIT0gdm1TeW1ib2xzOjpzdW5fbWlzY19MYXVuY2hlcl9FeHRDbGFzc0xvYWRlcigpKSB7CiAgICAgcmV0dXJuIHZtU3ltYm9sczo6Tk9fU0lEOyAgIC8vIHJlZ2FyZGxlc3Mgb2YgbmFtZSwgbm8gaW50cmluc2ljcyBoZXJlCisgIH0KIAogICAvLyBzZWUgaWYgdGhlIGtsYXNzIG5hbWUgaXMgd2VsbC1rbm93bjoKICAgU3ltYm9sKiBrbGFzc19uYW1lID0gSW5zdGFuY2VLbGFzczo6Y2FzdChob2xkZXIpLT5uYW1lKCk7CmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9zaGFyZS92bS9vcHRvL2MyX2dsb2JhbHMuaHBwIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vb3B0by9jMl9nbG9iYWxzLmhwcAppbmRleCA4MDk5NmE1Li40ZmRlYmY1IDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9zaGFyZS92bS9vcHRvL2MyX2dsb2JhbHMuaHBwCisrKyBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29wdG8vYzJfZ2xvYmFscy5ocHAKQEAgLTQzOSw2ICs0MzksOSBAQAogICBwcm9kdWN0KGJvb2wsIERvRXNjYXBlQW5hbHlzaXMsIHRydWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAiUGVyZm9ybSBlc2NhcGUgYW5hbHlzaXMiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkZXZlbG9wKGJvb2wsIEV4aXRFc2NhcGVBbmFseXNpc09uVGltZW91dCwgdHJ1ZSwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAiRXhpdCBvciB0aHJvdyBhc3NlcnQgaW4gRUEgd2hlbiBpdCByZWFjaGVzIHRpbWUgbGltaXQiKSAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICBub3Rwcm9kdWN0KGJvb2wsIFByaW50RXNjYXBlQW5hbHlzaXMsIGZhbHNlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAiUHJpbnQgdGhlIHJlc3VsdHMgb2YgZXNjYXBlIGFuYWx5c2lzIikgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vb3B0by9jYWxsR2VuZXJhdG9yLmNwcCBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29wdG8vY2FsbEdlbmVyYXRvci5jcHAKaW5kZXggNTQ3MDk2Yi4uOTNmMmI4NSAxMDA2NDQKLS0tIGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vb3B0by9jYWxsR2VuZXJhdG9yLmNwcAorKysgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9vcHRvL2NhbGxHZW5lcmF0b3IuY3BwCkBAIC02NzAsNiArNjcwLDEyOSBAQAogfQogCiAKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tUHJlZGljdGVkSW50cmluc2ljR2VuZXJhdG9yLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBJbnRlcm5hbCBjbGFzcyB3aGljaCBoYW5kbGVzIGFsbCBwcmVkaWN0ZWQgSW50cmluc2ljIGNhbGxzLgorY2xhc3MgUHJlZGljdGVkSW50cmluc2ljR2VuZXJhdG9yIDogcHVibGljIENhbGxHZW5lcmF0b3IgeworICBDYWxsR2VuZXJhdG9yKiBfaW50cmluc2ljOworICBDYWxsR2VuZXJhdG9yKiBfY2c7CisKK3B1YmxpYzoKKyAgUHJlZGljdGVkSW50cmluc2ljR2VuZXJhdG9yKENhbGxHZW5lcmF0b3IqIGludHJpbnNpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxHZW5lcmF0b3IqIGNnKQorICAgIDogQ2FsbEdlbmVyYXRvcihjZy0+bWV0aG9kKCkpCisgIHsKKyAgICBfaW50cmluc2ljID0gaW50cmluc2ljOworICAgIF9jZyAgICAgICAgPSBjZzsKKyAgfQorCisgIHZpcnR1YWwgYm9vbCAgICAgIGlzX3ZpcnR1YWwoKSAgIGNvbnN0ICAgIHsgcmV0dXJuIHRydWU7IH0KKyAgdmlydHVhbCBib29sICAgICAgaXNfaW5saW5lZCgpICAgY29uc3QgICAgeyByZXR1cm4gdHJ1ZTsgfQorICB2aXJ0dWFsIGJvb2wgICAgICBpc19pbnRyaW5zaWMoKSBjb25zdCAgICB7IHJldHVybiB0cnVlOyB9CisKKyAgdmlydHVhbCBKVk1TdGF0ZSogZ2VuZXJhdGUoSlZNU3RhdGUqIGp2bXMpOworfTsKKworCitDYWxsR2VuZXJhdG9yKiBDYWxsR2VuZXJhdG9yOjpmb3JfcHJlZGljdGVkX2ludHJpbnNpYyhDYWxsR2VuZXJhdG9yKiBpbnRyaW5zaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsR2VuZXJhdG9yKiBjZykgeworICByZXR1cm4gbmV3IFByZWRpY3RlZEludHJpbnNpY0dlbmVyYXRvcihpbnRyaW5zaWMsIGNnKTsKK30KKworCitKVk1TdGF0ZSogUHJlZGljdGVkSW50cmluc2ljR2VuZXJhdG9yOjpnZW5lcmF0ZShKVk1TdGF0ZSoganZtcykgeworICBHcmFwaEtpdCBraXQoanZtcyk7CisgIFBoYXNlR1ZOJiBndm4gPSBraXQuZ3ZuKCk7CisKKyAgQ29tcGlsZUxvZyogbG9nID0ga2l0LkMtPmxvZygpOworICBpZiAobG9nICE9IE5VTEwpIHsKKyAgICBsb2ctPmVsZW0oInByZWRpY3RlZF9pbnRyaW5zaWMgYmNpPSclZCcgbWV0aG9kPSclZCciLAorICAgICAgICAgICAgICBqdm1zLT5iY2koKSwgbG9nLT5pZGVudGlmeShtZXRob2QoKSkpOworICB9CisKKyAgTm9kZSogc2xvd19jdGwgPSBfaW50cmluc2ljLT5nZW5lcmF0ZV9wcmVkaWNhdGUoa2l0LnN5bmNfanZtcygpKTsKKyAgaWYgKGtpdC5mYWlsaW5nKCkpCisgICAgcmV0dXJuIE5VTEw7ICAvLyBtaWdodCBoYXBwZW4gYmVjYXVzZSBvZiBOb2RlQ291bnRJbmxpbmluZ0N1dG9mZgorCisgIFNhZmVQb2ludE5vZGUqIHNsb3dfbWFwID0gTlVMTDsKKyAgSlZNU3RhdGUqIHNsb3dfanZtczsKKyAgaWYgKHNsb3dfY3RsICE9IE5VTEwpIHsKKyAgICBQcmVzZXJ2ZUpWTVN0YXRlIHBqdm1zKCZraXQpOworICAgIGtpdC5zZXRfY29udHJvbChzbG93X2N0bCk7CisgICAgaWYgKCFraXQuc3RvcHBlZCgpKSB7CisgICAgICBzbG93X2p2bXMgPSBfY2ctPmdlbmVyYXRlKGtpdC5zeW5jX2p2bXMoKSk7CisgICAgICBpZiAoa2l0LmZhaWxpbmcoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7ICAvLyBtaWdodCBoYXBwZW4gYmVjYXVzZSBvZiBOb2RlQ291bnRJbmxpbmluZ0N1dG9mZgorICAgICAgYXNzZXJ0KHNsb3dfanZtcyAhPSBOVUxMLCAibXVzdCBiZSIpOworICAgICAga2l0LmFkZF9leGNlcHRpb25fc3RhdGVzX2Zyb20oc2xvd19qdm1zKTsKKyAgICAgIGtpdC5zZXRfbWFwKHNsb3dfanZtcy0+bWFwKCkpOworICAgICAgaWYgKCFraXQuc3RvcHBlZCgpKQorICAgICAgICBzbG93X21hcCA9IGtpdC5zdG9wKCk7CisgICAgfQorICB9CisKKyAgaWYgKGtpdC5zdG9wcGVkKCkpIHsKKyAgICAvLyBQcmVkaWNhdGUgaXMgYWx3YXlzIGZhbHNlLgorICAgIGtpdC5zZXRfanZtcyhzbG93X2p2bXMpOworICAgIHJldHVybiBraXQudHJhbnNmZXJfZXhjZXB0aW9uc19pbnRvX2p2bXMoKTsKKyAgfQorCisgIC8vIEdlbmVyYXRlIGludHJpbnNpYyBjb2RlOgorICBKVk1TdGF0ZSogbmV3X2p2bXMgPSBfaW50cmluc2ljLT5nZW5lcmF0ZShraXQuc3luY19qdm1zKCkpOworICBpZiAobmV3X2p2bXMgPT0gTlVMTCkgeworICAgIC8vIEludHJpbnNpYyBmYWlsZWQsIHNvIHVzZSBzbG93IGNvZGUgb3IgbWFrZSBhIGRpcmVjdCBjYWxsLgorICAgIGlmIChzbG93X21hcCA9PSBOVUxMKSB7CisgICAgICBDYWxsR2VuZXJhdG9yKiBjZyA9IENhbGxHZW5lcmF0b3I6OmZvcl9kaXJlY3RfY2FsbChtZXRob2QoKSk7CisgICAgICBuZXdfanZtcyA9IGNnLT5nZW5lcmF0ZShraXQuc3luY19qdm1zKCkpOworICAgIH0gZWxzZSB7CisgICAgICBraXQuc2V0X2p2bXMoc2xvd19qdm1zKTsKKyAgICAgIHJldHVybiBraXQudHJhbnNmZXJfZXhjZXB0aW9uc19pbnRvX2p2bXMoKTsKKyAgICB9CisgIH0KKyAga2l0LmFkZF9leGNlcHRpb25fc3RhdGVzX2Zyb20obmV3X2p2bXMpOworICBraXQuc2V0X2p2bXMobmV3X2p2bXMpOworCisgIC8vIE5lZWQgdG8gbWVyZ2Ugc2xvdyBhbmQgZmFzdD8KKyAgaWYgKHNsb3dfbWFwID09IE5VTEwpIHsKKyAgICAvLyBUaGUgZmFzdCBwYXRoIGlzIHRoZSBvbmx5IHBhdGggcmVtYWluaW5nLgorICAgIHJldHVybiBraXQudHJhbnNmZXJfZXhjZXB0aW9uc19pbnRvX2p2bXMoKTsKKyAgfQorCisgIGlmIChraXQuc3RvcHBlZCgpKSB7CisgICAgLy8gSW50cmluc2ljIG1ldGhvZCB0aHJldyBhbiBleGNlcHRpb24sIHNvIGl0J3MganVzdCB0aGUgc2xvdyBwYXRoIGFmdGVyIGFsbC4KKyAgICBraXQuc2V0X2p2bXMoc2xvd19qdm1zKTsKKyAgICByZXR1cm4ga2l0LnRyYW5zZmVyX2V4Y2VwdGlvbnNfaW50b19qdm1zKCk7CisgIH0KKworICAvLyBGaW5pc2ggdGhlIGRpYW1vbmQuCisgIGtpdC5DLT5zZXRfaGFzX3NwbGl0X2lmcyh0cnVlKTsgLy8gSGFzIGNoYW5jZSBmb3Igc3BsaXQtaWYgb3B0aW1pemF0aW9uCisgIFJlZ2lvbk5vZGUqIHJlZ2lvbiA9IG5ldyAoa2l0LkMpIFJlZ2lvbk5vZGUoMyk7CisgIHJlZ2lvbi0+aW5pdF9yZXEoMSwga2l0LmNvbnRyb2woKSk7CisgIHJlZ2lvbi0+aW5pdF9yZXEoMiwgc2xvd19tYXAtPmNvbnRyb2woKSk7CisgIGtpdC5zZXRfY29udHJvbChndm4udHJhbnNmb3JtKHJlZ2lvbikpOworICBOb2RlKiBpb3BoaSA9IFBoaU5vZGU6Om1ha2UocmVnaW9uLCBraXQuaV9vKCksIFR5cGU6OkFCSU8pOworICBpb3BoaS0+c2V0X3JlcSgyLCBzbG93X21hcC0+aV9vKCkpOworICBraXQuc2V0X2lfbyhndm4udHJhbnNmb3JtKGlvcGhpKSk7CisgIGtpdC5tZXJnZV9tZW1vcnkoc2xvd19tYXAtPm1lcmdlZF9tZW1vcnkoKSwgcmVnaW9uLCAyKTsKKyAgdWludCB0b3MgPSBraXQuanZtcygpLT5zdGtvZmYoKSArIGtpdC5zcCgpOworICB1aW50IGxpbWl0ID0gc2xvd19tYXAtPnJlcSgpOworICBmb3IgKHVpbnQgaSA9IFR5cGVGdW5jOjpQYXJtczsgaSA8IGxpbWl0OyBpKyspIHsKKyAgICAvLyBTa2lwIHVudXNlZCBzdGFjayBzbG90czsgZmFzdCBmb3J3YXJkIHRvIG1vbm9mZigpOworICAgIGlmIChpID09IHRvcykgeworICAgICAgaSA9IGtpdC5qdm1zKCktPm1vbm9mZigpOworICAgICAgaWYoIGkgPj0gbGltaXQgKSBicmVhazsKKyAgICB9CisgICAgTm9kZSogbSA9IGtpdC5tYXAoKS0+aW4oaSk7CisgICAgTm9kZSogbiA9IHNsb3dfbWFwLT5pbihpKTsKKyAgICBpZiAobSAhPSBuKSB7CisgICAgICBjb25zdCBUeXBlKiB0ID0gZ3ZuLnR5cGUobSktPm1lZXQoZ3ZuLnR5cGUobikpOworICAgICAgTm9kZSogcGhpID0gUGhpTm9kZTo6bWFrZShyZWdpb24sIG0sIHQpOworICAgICAgcGhpLT5zZXRfcmVxKDIsIG4pOworICAgICAga2l0Lm1hcCgpLT5zZXRfcmVxKGksIGd2bi50cmFuc2Zvcm0ocGhpKSk7CisgICAgfQorICB9CisgIHJldHVybiBraXQudHJhbnNmZXJfZXhjZXB0aW9uc19pbnRvX2p2bXMoKTsKK30KKwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tVW5jb21tb25UcmFwQ2FsbEdlbmVyYXRvci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBJbnRlcm5hbCBjbGFzcyB3aGljaCBoYW5kbGVzIGFsbCBvdXQtb2YtbGluZSBjYWxscyBjaGVja2luZyByZWNlaXZlciB0eXBlLgogY2xhc3MgVW5jb21tb25UcmFwQ2FsbEdlbmVyYXRvciA6IHB1YmxpYyBDYWxsR2VuZXJhdG9yIHsKZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29wdG8vY2FsbEdlbmVyYXRvci5ocHAgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9vcHRvL2NhbGxHZW5lcmF0b3IuaHBwCmluZGV4IDNjZmQzOWQuLmFlNTkxNzMgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29wdG8vY2FsbEdlbmVyYXRvci5ocHAKKysrIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vb3B0by9jYWxsR2VuZXJhdG9yLmhwcApAQCAtMTQzLDYgKzE0Myw5IEBACiAgIC8vIFJlZ2lzdHJ5IGZvciBpbnRyaW5zaWNzOgogICBzdGF0aWMgQ2FsbEdlbmVyYXRvciogZm9yX2ludHJpbnNpYyhjaU1ldGhvZCogbSk7CiAgIHN0YXRpYyB2b2lkIHJlZ2lzdGVyX2ludHJpbnNpYyhjaU1ldGhvZCogbSwgQ2FsbEdlbmVyYXRvciogY2cpOworICBzdGF0aWMgQ2FsbEdlbmVyYXRvciogZm9yX3ByZWRpY3RlZF9pbnRyaW5zaWMoQ2FsbEdlbmVyYXRvciogaW50cmluc2ljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbEdlbmVyYXRvciogY2cpOworICB2aXJ0dWFsIE5vZGUqIGdlbmVyYXRlX3ByZWRpY2F0ZShKVk1TdGF0ZSoganZtcykgeyByZXR1cm4gTlVMTDsgfTsKIAogICBzdGF0aWMgdm9pZCBwcmludF9pbmxpbmluZyhjaU1ldGhvZCogY2FsbGVlLCBpbnQgaW5saW5lX2xldmVsLCBpbnQgYmNpLCBjb25zdCBjaGFyKiBtc2cpIHsKICAgICBpZiAoUHJpbnRJbmxpbmluZykKZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29wdG8vY29tcGlsZS5jcHAgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9vcHRvL2NvbXBpbGUuY3BwCmluZGV4IGQ4NzA4NzIuLmM0ZGE3MGUgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29wdG8vY29tcGlsZS5jcHAKKysrIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vb3B0by9jb21waWxlLmNwcApAQCAtMzA0Nyw5ICszMDQ3LDkgQEAKICAgY2FzZSBUX0xPTkc6CiAgIGNhc2UgVF9ET1VCTEU6ICByZXR1cm4gKF92Ll92YWx1ZS5qID09IG90aGVyLl92Ll92YWx1ZS5qKTsKICAgY2FzZSBUX09CSkVDVDoKLSAgY2FzZSBUX01FVEFEQVRBOiByZXR1cm4gKF92Ll9tZXRhZGF0YSA9PSBvdGhlci5fdi5fbWV0YWRhdGEpOwogICBjYXNlIFRfQUREUkVTUzogcmV0dXJuIChfdi5fdmFsdWUubCA9PSBvdGhlci5fdi5fdmFsdWUubCk7CiAgIGNhc2UgVF9WT0lEOiAgICByZXR1cm4gKF92Ll92YWx1ZS5sID09IG90aGVyLl92Ll92YWx1ZS5sKTsgIC8vIGp1bXAtdGFibGUgZW50cmllcworICBjYXNlIFRfTUVUQURBVEE6IHJldHVybiAoX3YuX21ldGFkYXRhID09IG90aGVyLl92Ll9tZXRhZGF0YSk7CiAgIGRlZmF1bHQ6IFNob3VsZE5vdFJlYWNoSGVyZSgpOwogICB9CiAgIHJldHVybiBmYWxzZTsKZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29wdG8vY29tcGlsZS5ocHAgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9vcHRvL2NvbXBpbGUuaHBwCmluZGV4IDZiY2YzZDMuLjQ0YmYyNzcgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29wdG8vY29tcGlsZS5ocHAKKysrIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vb3B0by9jb21waWxlLmhwcApAQCAtMTQ5LDcgKzE0OSw3IEBACiAgIHByaXZhdGU6CiAgICAgQmFzaWNUeXBlIF90eXBlOwogICAgIHVuaW9uIHsKLSAgICBqdmFsdWUgICAgX3ZhbHVlOworICAgICAganZhbHVlICAgIF92YWx1ZTsKICAgICAgIE1ldGFkYXRhKiBfbWV0YWRhdGE7CiAgICAgfSBfdjsKICAgICBpbnQgICAgICAgX29mZnNldDsgICAgICAgICAvLyBvZmZzZXQgb2YgdGhpcyBjb25zdGFudCAoaW4gYnl0ZXMpIHJlbGF0aXZlIHRvIHRoZSBjb25zdGFudCB0YWJsZSBiYXNlLgpkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vb3B0by9kb0NhbGwuY3BwIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vb3B0by9kb0NhbGwuY3BwCmluZGV4IDMwYTAxZjMuLjk1ZDE0ODggMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29wdG8vZG9DYWxsLmNwcAorKysgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9vcHRvL2RvQ2FsbC5jcHAKQEAgLTEwNyw3ICsxMDcsMTcgQEAKICAgLy8gaW50cmluc2ljcyBoYW5kbGUgc3RyaWN0IGYucC4gY29ycmVjdGx5LgogICBpZiAoYWxsb3dfaW5saW5lICYmIGFsbG93X2ludHJpbnNpY3MpIHsKICAgICBDYWxsR2VuZXJhdG9yKiBjZyA9IGZpbmRfaW50cmluc2ljKGNhbGxlZSwgY2FsbF9pc192aXJ0dWFsKTsKLSAgICBpZiAoY2cgIT0gTlVMTCkgIHJldHVybiBjZzsKKyAgICBpZiAoY2cgIT0gTlVMTCkgeworICAgICAgaWYgKGNnLT5pc19wcmVkaWN0ZWQoKSkgeworICAgICAgICAvLyBDb2RlIHdpdGhvdXQgaW50cmluc2ljIGJ1dCwgaG9wZWZ1bGx5LCBpbmxpbmVkLgorICAgICAgICBDYWxsR2VuZXJhdG9yKiBpbmxpbmVfY2cgPSB0aGlzLT5jYWxsX2dlbmVyYXRvcihjYWxsZWUsCisgICAgICAgICAgICAgIHZ0YWJsZV9pbmRleCwgY2FsbF9pc192aXJ0dWFsLCBqdm1zLCBhbGxvd19pbmxpbmUsIHByb2ZfZmFjdG9yLCBmYWxzZSk7CisgICAgICAgIGlmIChpbmxpbmVfY2cgIT0gTlVMTCkgeworICAgICAgICAgIGNnID0gQ2FsbEdlbmVyYXRvcjo6Zm9yX3ByZWRpY3RlZF9pbnRyaW5zaWMoY2csIGlubGluZV9jZyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBjZzsKKyAgICB9CiAgIH0KIAogICAvLyBEbyBtZXRob2QgaGFuZGxlIGNhbGxzLgpkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vb3B0by9lc2NhcGUuY3BwIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vb3B0by9lc2NhcGUuY3BwCmluZGV4IDlmZDMxODAuLmE1YWE0NzEgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29wdG8vZXNjYXBlLmNwcAorKysgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9vcHRvL2VzY2FwZS5jcHAKQEAgLTg5MywxMiArODkzLDE2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdfaGFzX29vcHMgJiYgKGkgPiBUeXBlRnVuYzo6UGFybXMpOwogI2lmZGVmIEFTU0VSVAogICAgICAgICAgIGlmICghKGlzX2FycmF5Y29weSB8fAotICAgICAgICAgICAgICAgIGNhbGwtPmFzX0NhbGxMZWFmKCktPl9uYW1lICE9IE5VTEwgJiYKLSAgICAgICAgICAgICAgICAoc3RyY21wKGNhbGwtPmFzX0NhbGxMZWFmKCktPl9uYW1lLCAiZzFfd2JfcHJlIikgID09IDAgfHwKLSAgICAgICAgICAgICAgICAgc3RyY21wKGNhbGwtPmFzX0NhbGxMZWFmKCktPl9uYW1lLCAiZzFfd2JfcG9zdCIpID09IDAgKSkKLSAgICAgICAgICApIHsKKyAgICAgICAgICAgICAgICAoY2FsbC0+YXNfQ2FsbExlYWYoKS0+X25hbWUgIT0gTlVMTCAmJgorICAgICAgICAgICAgICAgICAoc3RyY21wKGNhbGwtPmFzX0NhbGxMZWFmKCktPl9uYW1lLCAiZzFfd2JfcHJlIikgID09IDAgfHwKKyAgICAgICAgICAgICAgICAgIHN0cmNtcChjYWxsLT5hc19DYWxsTGVhZigpLT5fbmFtZSwgImcxX3diX3Bvc3QiKSA9PSAwIHx8CisgICAgICAgICAgICAgICAgICBzdHJjbXAoY2FsbC0+YXNfQ2FsbExlYWYoKS0+X25hbWUsICJhZXNjcnlwdF9lbmNyeXB0QmxvY2siKSA9PSAwIHx8CisgICAgICAgICAgICAgICAgICBzdHJjbXAoY2FsbC0+YXNfQ2FsbExlYWYoKS0+X25hbWUsICJhZXNjcnlwdF9kZWNyeXB0QmxvY2siKSA9PSAwIHx8CisgICAgICAgICAgICAgICAgICBzdHJjbXAoY2FsbC0+YXNfQ2FsbExlYWYoKS0+X25hbWUsICJjaXBoZXJCbG9ja0NoYWluaW5nX2VuY3J5cHRBRVNDcnlwdCIpID09IDAgfHwKKyAgICAgICAgICAgICAgICAgIHN0cmNtcChjYWxsLT5hc19DYWxsTGVhZigpLT5fbmFtZSwgImNpcGhlckJsb2NrQ2hhaW5pbmdfZGVjcnlwdEFFU0NyeXB0IikgPT0gMCkKKyAgICAgICAgICAgICAgICAgICkpKSB7CiAgICAgICAgICAgICBjYWxsLT5kdW1wKCk7Ci0gICAgICAgICAgICBhc3NlcnQoZmFsc2UsICJFQTogdW5leHBlY3RlZCBDYWxsTGVhZiIpOworICAgICAgICAgICAgZmF0YWwoZXJyX21zZ19yZXMoIkVBIHVuZXhwZWN0ZWQgQ2FsbExlYWYgJXMiLCBjYWxsLT5hc19DYWxsTGVhZigpLT5fbmFtZSkpOwogICAgICAgICAgIH0KICNlbmRpZgogICAgICAgICAgIC8vIEFsd2F5cyBwcm9jZXNzIGFycmF5Y29weSdzIGRlc3RpbmF0aW9uIG9iamVjdCBzaW5jZQpAQCAtMTA4MCw3ICsxMDg0LDcgQEAKICAgICAgIEMtPmxvZygpLT50ZXh0KCIlcyIsIChpdGVyYXRpb25zID49IENHX0JVSUxEX0lURVJfTElNSVQpID8gIml0ZXJhdGlvbnMiIDogInRpbWUiKTsKICAgICAgIEMtPmxvZygpLT5lbmRfZWxlbSgiIGxpbWl0JyIpOwogICAgIH0KLSAgICBhc3NlcnQoZmFsc2UsIGVycl9tc2dfcmVzKCJpbmZpbml0ZSBFQSBjb25uZWN0aW9uIGdyYXBoIGJ1aWxkICglZiBzZWMsICVkIGl0ZXJhdGlvbnMpIHdpdGggJWQgbm9kZXMgYW5kIHdvcmtsaXN0IHNpemUgJWQiLAorICAgIGFzc2VydChFeGl0RXNjYXBlQW5hbHlzaXNPblRpbWVvdXQsIGVycl9tc2dfcmVzKCJpbmZpbml0ZSBFQSBjb25uZWN0aW9uIGdyYXBoIGJ1aWxkICglZiBzZWMsICVkIGl0ZXJhdGlvbnMpIHdpdGggJWQgbm9kZXMgYW5kIHdvcmtsaXN0IHNpemUgJWQiLAogICAgICAgICAgICB0aW1lLnNlY29uZHMoKSwgaXRlcmF0aW9ucywgbm9kZXNfc2l6ZSgpLCBwdG5vZGVzX3dvcmtsaXN0Lmxlbmd0aCgpKSk7CiAgICAgLy8gUG9zc2libGUgaW5maW5pdGUgYnVpbGRfY29ubmVjdGlvbl9ncmFwaCBsb29wLAogICAgIC8vIGJhaWxvdXQgKG5vIGNoYW5nZXMgdG8gaWRlYWwgZ3JhcGggd2VyZSBtYWRlKS4KZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29wdG8vbGlicmFyeV9jYWxsLmNwcCBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29wdG8vbGlicmFyeV9jYWxsLmNwcAppbmRleCBmMzRkZjc5Li42YjkwMDYxIDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9zaGFyZS92bS9vcHRvL2xpYnJhcnlfY2FsbC5jcHAKKysrIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vb3B0by9saWJyYXJ5X2NhbGwuY3BwCkBAIC00NCwxOCArNDQsMjIgQEAKICBwdWJsaWM6CiAgcHJpdmF0ZToKICAgYm9vbCAgICAgICAgICAgICBfaXNfdmlydHVhbDsKKyAgYm9vbCAgICAgICAgICAgICBfaXNfcHJlZGljdGVkOwogICB2bUludHJpbnNpY3M6OklEIF9pbnRyaW5zaWNfaWQ7CiAKICBwdWJsaWM6Ci0gIExpYnJhcnlJbnRyaW5zaWMoY2lNZXRob2QqIG0sIGJvb2wgaXNfdmlydHVhbCwgdm1JbnRyaW5zaWNzOjpJRCBpZCkKKyAgTGlicmFyeUludHJpbnNpYyhjaU1ldGhvZCogbSwgYm9vbCBpc192aXJ0dWFsLCBib29sIGlzX3ByZWRpY3RlZCwgdm1JbnRyaW5zaWNzOjpJRCBpZCkKICAgICA6IElubGluZUNhbGxHZW5lcmF0b3IobSksCiAgICAgICBfaXNfdmlydHVhbChpc192aXJ0dWFsKSwKKyAgICAgIF9pc19wcmVkaWN0ZWQoaXNfcHJlZGljdGVkKSwKICAgICAgIF9pbnRyaW5zaWNfaWQoaWQpCiAgIHsKICAgfQogICB2aXJ0dWFsIGJvb2wgaXNfaW50cmluc2ljKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQogICB2aXJ0dWFsIGJvb2wgaXNfdmlydHVhbCgpICAgY29uc3QgeyByZXR1cm4gX2lzX3ZpcnR1YWw7IH0KKyAgdmlydHVhbCBib29sIGlzX3ByZWRpY3RlZCgpICAgY29uc3QgeyByZXR1cm4gX2lzX3ByZWRpY3RlZDsgfQogICB2aXJ0dWFsIEpWTVN0YXRlKiBnZW5lcmF0ZShKVk1TdGF0ZSoganZtcyk7CisgIHZpcnR1YWwgTm9kZSogZ2VuZXJhdGVfcHJlZGljYXRlKEpWTVN0YXRlKiBqdm1zKTsKICAgdm1JbnRyaW5zaWNzOjpJRCBpbnRyaW5zaWNfaWQoKSBjb25zdCB7IHJldHVybiBfaW50cmluc2ljX2lkOyB9CiB9OwogCkBAIC04Myw2ICs4Nyw3IEBACiAgIGludCAgICAgICAgICAgICAgIGFyZ19zaXplKCkgIGNvbnN0ICAgIHsgcmV0dXJuIGNhbGxlZSgpLT5hcmdfc2l6ZSgpOyB9CiAKICAgYm9vbCB0cnlfdG9faW5saW5lKCk7CisgIE5vZGUqIHRyeV90b19wcmVkaWNhdGUoKTsKIAogICAvLyBIZWxwZXIgZnVuY3Rpb25zIHRvIGlubGluZSBuYXRpdmVzCiAgIHZvaWQgcHVzaF9yZXN1bHQoUmVnaW9uTm9kZSogcmVnaW9uLCBQaGlOb2RlKiB2YWx1ZSk7CkBAIC0xNDgsNiArMTUzLDcgQEAKICAgQ2FsbEphdmFOb2RlKiBnZW5lcmF0ZV9tZXRob2RfY2FsbF92aXJ0dWFsKHZtSW50cmluc2ljczo6SUQgbWV0aG9kX2lkKSB7CiAgICAgcmV0dXJuIGdlbmVyYXRlX21ldGhvZF9jYWxsKG1ldGhvZF9pZCwgdHJ1ZSwgZmFsc2UpOwogICB9CisgIE5vZGUgKiBsb2FkX2ZpZWxkX2Zyb21fb2JqZWN0KE5vZGUgKiBmcm9tT2JqLCBjb25zdCBjaGFyICogZmllbGROYW1lLCBjb25zdCBjaGFyICogZmllbGRUeXBlU3RyaW5nLCBib29sIGlzX2V4YWN0LCBib29sIGlzX3N0YXRpYyk7CiAKICAgTm9kZSogbWFrZV9zdHJpbmdfbWV0aG9kX25vZGUoaW50IG9wY29kZSwgTm9kZSogc3RyMV9zdGFydCwgTm9kZSogY250MSwgTm9kZSogc3RyMl9zdGFydCwgTm9kZSogY250Mik7CiAgIE5vZGUqIG1ha2Vfc3RyaW5nX21ldGhvZF9ub2RlKGludCBvcGNvZGUsIE5vZGUqIHN0cjEsIE5vZGUqIHN0cjIpOwpAQCAtMjUzLDYgKzI1OSwxMCBAQAogICBib29sIGlubGluZV9yZXZlcnNlQnl0ZXModm1JbnRyaW5zaWNzOjpJRCBpZCk7CiAKICAgYm9vbCBpbmxpbmVfcmVmZXJlbmNlX2dldCgpOworICBib29sIGlubGluZV9hZXNjcnlwdF9CbG9jayh2bUludHJpbnNpY3M6OklEIGlkKTsKKyAgYm9vbCBpbmxpbmVfY2lwaGVyQmxvY2tDaGFpbmluZ19BRVNDcnlwdCh2bUludHJpbnNpY3M6OklEIGlkKTsKKyAgTm9kZSogaW5saW5lX2NpcGhlckJsb2NrQ2hhaW5pbmdfQUVTQ3J5cHRfcHJlZGljYXRlKGJvb2wgZGVjcnlwdGluZyk7CisgIE5vZGUqIGdldF9rZXlfc3RhcnRfZnJvbV9hZXNjcnlwdF9vYmplY3QoTm9kZSogYWVzY3J5cHRfb2JqZWN0KTsKIH07CiAKIApAQCAtMzA2LDYgKzMxNiw4IEBACiAgICAgfQogICB9CiAKKyAgYm9vbCBpc19wcmVkaWN0ZWQgPSBmYWxzZTsKKwogICBzd2l0Y2ggKGlkKSB7CiAgIGNhc2Ugdm1JbnRyaW5zaWNzOjpfY29tcGFyZVRvOgogICAgIGlmICghU3BlY2lhbFN0cmluZ0NvbXBhcmVUbykgIHJldHVybiBOVUxMOwpAQCAtNDEzLDYgKzQyNSwxOCBAQAogICAgIGJyZWFrOwogI2VuZGlmCiAKKyAgY2FzZSB2bUludHJpbnNpY3M6Ol9hZXNjcnlwdF9lbmNyeXB0QmxvY2s6CisgIGNhc2Ugdm1JbnRyaW5zaWNzOjpfYWVzY3J5cHRfZGVjcnlwdEJsb2NrOgorICAgIGlmICghVXNlQUVTSW50cmluc2ljcykgcmV0dXJuIE5VTEw7CisgICAgYnJlYWs7CisKKyAgY2FzZSB2bUludHJpbnNpY3M6Ol9jaXBoZXJCbG9ja0NoYWluaW5nX2VuY3J5cHRBRVNDcnlwdDoKKyAgY2FzZSB2bUludHJpbnNpY3M6Ol9jaXBoZXJCbG9ja0NoYWluaW5nX2RlY3J5cHRBRVNDcnlwdDoKKyAgICBpZiAoIVVzZUFFU0ludHJpbnNpY3MpIHJldHVybiBOVUxMOworICAgIC8vIHRoZXNlIHR3byByZXF1aXJlIHRoZSBwcmVkaWNhdGVkIGxvZ2ljCisgICAgaXNfcHJlZGljdGVkID0gdHJ1ZTsKKyAgICBicmVhazsKKwogIGRlZmF1bHQ6CiAgICAgYXNzZXJ0KGlkIDw9IHZtSW50cmluc2ljczo6TEFTVF9DT01QSUxFUl9JTkxJTkUsICJjYWxsZXIgcmVzcG9uc2liaWxpdHkiKTsKICAgICBhc3NlcnQoaWQgIT0gdm1JbnRyaW5zaWNzOjpfT2JqZWN0X2luaXQgJiYgaWQgIT0gdm1JbnRyaW5zaWNzOjpfaW52b2tlLCAiZW51bSBvdXQgb2Ygb3JkZXI/Iik7CkBAIC00NDQsNyArNDY4LDcgQEAKICAgICBpZiAoIUlubGluZVVuc2FmZU9wcykgIHJldHVybiBOVUxMOwogICB9CiAKLSAgcmV0dXJuIG5ldyBMaWJyYXJ5SW50cmluc2ljKG0sIGlzX3ZpcnR1YWwsICh2bUludHJpbnNpY3M6OklEKSBpZCk7CisgIHJldHVybiBuZXcgTGlicmFyeUludHJpbnNpYyhtLCBpc192aXJ0dWFsLCBpc19wcmVkaWN0ZWQsICh2bUludHJpbnNpY3M6OklEKSBpZCk7CiB9CiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXJlZ2lzdGVyX2xpYnJhcnlfaW50cmluc2ljcy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC00OTYsNiArNTIwLDQ3IEBACiAgIHJldHVybiBOVUxMOwogfQogCitOb2RlKiBMaWJyYXJ5SW50cmluc2ljOjpnZW5lcmF0ZV9wcmVkaWNhdGUoSlZNU3RhdGUqIGp2bXMpIHsKKyAgTGlicmFyeUNhbGxLaXQga2l0KGp2bXMsIHRoaXMpOworICBDb21waWxlKiBDID0ga2l0LkM7CisgIGludCBub2RlcyA9IEMtPnVuaXF1ZSgpOworI2lmbmRlZiBQUk9EVUNUCisgIGFzc2VydChpc19wcmVkaWN0ZWQoKSwgInNhbml0eSIpOworICBpZiAoKFByaW50SW50cmluc2ljcyB8fCBQcmludElubGluaW5nIE5PVF9QUk9EVUNUKCB8fCBQcmludE9wdG9JbmxpbmluZykgKSAmJiBWZXJib3NlKSB7CisgICAgY2hhciBidWZbMTAwMF07CisgICAgY29uc3QgY2hhciogc3RyID0gdm1JbnRyaW5zaWNzOjpzaG9ydF9uYW1lX2FzX0Nfc3RyaW5nKGludHJpbnNpY19pZCgpLCBidWYsIHNpemVvZihidWYpKTsKKyAgICB0dHktPnByaW50X2NyKCJQcmVkaWNhdGUgZm9yIGludHJpbnNpYyAlcyIsIHN0cik7CisgIH0KKyNlbmRpZgorCisgIE5vZGUqIHNsb3dfY3RsID0ga2l0LnRyeV90b19wcmVkaWNhdGUoKTsKKyAgaWYgKCFraXQuZmFpbGluZygpKSB7CisgICAgaWYgKEMtPmxvZygpKSB7CisgICAgICBDLT5sb2coKS0+ZWxlbSgicHJlZGljYXRlX2ludHJpbnNpYyBpZD0nJXMnJXMgbm9kZXM9JyVkJyIsCisgICAgICAgICAgICAgICAgICAgICB2bUludHJpbnNpY3M6Om5hbWVfYXQoaW50cmluc2ljX2lkKCkpLAorICAgICAgICAgICAgICAgICAgICAgKGlzX3ZpcnR1YWwoKSA/ICIgdmlydHVhbD0nMSciIDogIiIpLAorICAgICAgICAgICAgICAgICAgICAgQy0+dW5pcXVlKCkgLSBub2Rlcyk7CisgICAgfQorICAgIHJldHVybiBzbG93X2N0bDsgLy8gQ291bGQgYmUgTlVMTCBpZiB0aGUgY2hlY2sgZm9sZHMuCisgIH0KKworICAvLyBUaGUgaW50cmluc2ljIGJhaWxlZCBvdXQKKyAgaWYgKFByaW50SW50cmluc2ljcyB8fCBQcmludElubGluaW5nIE5PVF9QUk9EVUNUKCB8fCBQcmludE9wdG9JbmxpbmluZykgKSB7CisgICAgaWYgKGp2bXMtPmhhc19tZXRob2QoKSkgeworICAgICAgLy8gTm90IGEgcm9vdCBjb21waWxlLgorICAgICAgY29uc3QgY2hhciogbXNnID0gImZhaWxlZCB0byBnZW5lcmF0ZSBwcmVkaWNhdGUgZm9yIGludHJpbnNpYyI7CisgICAgICBDb21waWxlVGFzazo6cHJpbnRfaW5saW5pbmcoa2l0LmNhbGxlZSgpLCBqdm1zLT5kZXB0aCgpIC0gMSwga2l0LmJjaSgpLCBtc2cpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBSb290IGNvbXBpbGUKKyAgICAgIHR0eS0+cHJpbnQoIkRpZCBub3QgZ2VuZXJhdGUgcHJlZGljYXRlIGZvciBpbnRyaW5zaWMgJXMlcyBhdCBiY2k6JWQgaW4iLAorICAgICAgICAgICAgICAgdm1JbnRyaW5zaWNzOjpuYW1lX2F0KGludHJpbnNpY19pZCgpKSwKKyAgICAgICAgICAgICAgIChpc192aXJ0dWFsKCkgPyAiICh2aXJ0dWFsKSIgOiAiIiksIGtpdC5iY2koKSk7CisgICAgfQorICB9CisgIEMtPmdhdGhlcl9pbnRyaW5zaWNfc3RhdGlzdGljcyhpbnRyaW5zaWNfaWQoKSwgaXNfdmlydHVhbCgpLCBDb21waWxlOjpfaW50cmluc2ljX2ZhaWxlZCk7CisgIHJldHVybiBOVUxMOworfQorCiBib29sIExpYnJhcnlDYWxsS2l0Ojp0cnlfdG9faW5saW5lKCkgewogICAvLyBIYW5kbGUgc3ltYm9saWMgbmFtZXMgZm9yIG90aGVyd2lzZSB1bmRpc3Rpbmd1aXNoZWQgYm9vbGVhbiBzd2l0Y2hlczoKICAgY29uc3QgYm9vbCBpc19zdG9yZSAgICAgICA9IHRydWU7CkBAIC03NjcsNiArODMyLDE0IEBACiAgIGNhc2Ugdm1JbnRyaW5zaWNzOjpfUmVmZXJlbmNlX2dldDoKICAgICByZXR1cm4gaW5saW5lX3JlZmVyZW5jZV9nZXQoKTsKIAorICBjYXNlIHZtSW50cmluc2ljczo6X2Flc2NyeXB0X2VuY3J5cHRCbG9jazoKKyAgY2FzZSB2bUludHJpbnNpY3M6Ol9hZXNjcnlwdF9kZWNyeXB0QmxvY2s6CisgICAgcmV0dXJuIGlubGluZV9hZXNjcnlwdF9CbG9jayhpbnRyaW5zaWNfaWQoKSk7CisKKyAgY2FzZSB2bUludHJpbnNpY3M6Ol9jaXBoZXJCbG9ja0NoYWluaW5nX2VuY3J5cHRBRVNDcnlwdDoKKyAgY2FzZSB2bUludHJpbnNpY3M6Ol9jaXBoZXJCbG9ja0NoYWluaW5nX2RlY3J5cHRBRVNDcnlwdDoKKyAgICByZXR1cm4gaW5saW5lX2NpcGhlckJsb2NrQ2hhaW5pbmdfQUVTQ3J5cHQoaW50cmluc2ljX2lkKCkpOworCiAgIGRlZmF1bHQ6CiAgICAgLy8gSWYgeW91IGdldCBoZXJlLCBpdCBtYXkgYmUgdGhhdCBzb21lb25lIGhhcyBhZGRlZCBhIG5ldyBpbnRyaW5zaWMKICAgICAvLyB0byB0aGUgbGlzdCBpbiB2bVN5bWJvbHMuaHBwIHdpdGhvdXQgaW1wbGVtZW50aW5nIGl0IGhlcmUuCkBAIC03ODAsNiArODUzLDM2IEBACiAgIH0KIH0KIAorTm9kZSogTGlicmFyeUNhbGxLaXQ6OnRyeV90b19wcmVkaWNhdGUoKSB7CisgIGlmICghanZtcygpLT5oYXNfbWV0aG9kKCkpIHsKKyAgICAvLyBSb290IEpWTVN0YXRlIGhhcyBhIG51bGwgbWV0aG9kLgorICAgIGFzc2VydChtYXAoKS0+bWVtb3J5KCktPk9wY29kZSgpID09IE9wX1Bhcm0sICIiKTsKKyAgICAvLyBJbnNlcnQgdGhlIG1lbW9yeSBhbGlhc2luZyBub2RlCisgICAgc2V0X2FsbF9tZW1vcnkocmVzZXRfbWVtb3J5KCkpOworICB9CisgIGFzc2VydChtZXJnZWRfbWVtb3J5KCksICIiKTsKKworICBzd2l0Y2ggKGludHJpbnNpY19pZCgpKSB7CisgIGNhc2Ugdm1JbnRyaW5zaWNzOjpfY2lwaGVyQmxvY2tDaGFpbmluZ19lbmNyeXB0QUVTQ3J5cHQ6CisgICAgcmV0dXJuIGlubGluZV9jaXBoZXJCbG9ja0NoYWluaW5nX0FFU0NyeXB0X3ByZWRpY2F0ZShmYWxzZSk7CisgIGNhc2Ugdm1JbnRyaW5zaWNzOjpfY2lwaGVyQmxvY2tDaGFpbmluZ19kZWNyeXB0QUVTQ3J5cHQ6CisgICAgcmV0dXJuIGlubGluZV9jaXBoZXJCbG9ja0NoYWluaW5nX0FFU0NyeXB0X3ByZWRpY2F0ZSh0cnVlKTsKKworICBkZWZhdWx0OgorICAgIC8vIElmIHlvdSBnZXQgaGVyZSwgaXQgbWF5IGJlIHRoYXQgc29tZW9uZSBoYXMgYWRkZWQgYSBuZXcgaW50cmluc2ljCisgICAgLy8gdG8gdGhlIGxpc3QgaW4gdm1TeW1ib2xzLmhwcCB3aXRob3V0IGltcGxlbWVudGluZyBpdCBoZXJlLgorI2lmbmRlZiBQUk9EVUNUCisgICAgaWYgKChQcmludE1pc2NlbGxhbmVvdXMgJiYgKFZlcmJvc2UgfHwgV2l6YXJkTW9kZSkpIHx8IFByaW50T3B0bykgeworICAgICAgdHR5LT5wcmludF9jcigiKioqIFdhcm5pbmc6IFVuaW1wbGVtZW50ZWQgcHJlZGljYXRlIGZvciBpbnRyaW5zaWMgJXMoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgdm1JbnRyaW5zaWNzOjpuYW1lX2F0KGludHJpbnNpY19pZCgpKSwgaW50cmluc2ljX2lkKCkpOworICAgIH0KKyNlbmRpZgorICAgIE5vZGUqIHNsb3dfY3RsID0gY29udHJvbCgpOworICAgIHNldF9jb250cm9sKHRvcCgpKTsgLy8gTm8gZmFzdCBwYXRoIGluc3RyaW5zaWMKKyAgICByZXR1cm4gc2xvd19jdGw7CisgIH0KK30KKwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1wdXNoX3Jlc3VsdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBmaW5pc2hpbmcgaW50cmluc2ljcy4KIHZvaWQgTGlicmFyeUNhbGxLaXQ6OnB1c2hfcmVzdWx0KFJlZ2lvbk5vZGUqIHJlZ2lvbiwgUGhpTm9kZSogdmFsdWUpIHsKQEAgLTM4MzAsNyArMzkzMyw3IEBACiAgICAgICAgICAgICAgICAgICAgICB2dGFibGVfaW5kZXgqdnRhYmxlRW50cnk6OnNpemUoKSkgKiB3b3JkU2l6ZSArCiAgICAgICAgICAgICAgICAgICAgICB2dGFibGVFbnRyeTo6bWV0aG9kX29mZnNldF9pbl9ieXRlcygpOwogICBOb2RlKiBlbnRyeV9hZGRyICA9IGJhc2ljX3BsdXNfYWRyKG9ial9rbGFzcywgZW50cnlfb2Zmc2V0KTsKLSAgTm9kZSogdGFyZ2V0X2NhbGwgPSBtYWtlX2xvYWQoTlVMTCwgZW50cnlfYWRkciwgVHlwZUluc3RQdHI6Ok5PVE5VTEwsIFRfT0JKRUNUKTsKKyAgTm9kZSogdGFyZ2V0X2NhbGwgPSBtYWtlX2xvYWQoTlVMTCwgZW50cnlfYWRkciwgVHlwZVB0cjo6Tk9UTlVMTCwgVF9BRERSRVNTKTsKIAogICAvLyBDb21wYXJlIHRoZSB0YXJnZXQgbWV0aG9kIHdpdGggdGhlIGV4cGVjdGVkIG1ldGhvZCAoZS5nLiwgT2JqZWN0Lmhhc2hDb2RlKS4KICAgY29uc3QgVHlwZVB0ciogbmF0aXZlX2NhbGxfYWRkciA9IFR5cGVNZXRhZGF0YVB0cjo6bWFrZShtZXRob2QpOwpAQCAtNTYxMywzICs1NzE2LDI2NSBAQAogICBwdXNoKHJlc3VsdCk7CiAgIHJldHVybiB0cnVlOwogfQorCisKK05vZGUgKiBMaWJyYXJ5Q2FsbEtpdDo6bG9hZF9maWVsZF9mcm9tX29iamVjdChOb2RlICogZnJvbU9iaiwgY29uc3QgY2hhciAqIGZpZWxkTmFtZSwgY29uc3QgY2hhciAqIGZpZWxkVHlwZVN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4YWN0PXRydWUsIGJvb2wgaXNfc3RhdGljPWZhbHNlKSB7CisKKyAgY29uc3QgVHlwZUluc3RQdHIqIHRpbnN0ID0gX2d2bi50eXBlKGZyb21PYmopLT5pc2FfaW5zdHB0cigpOworICBhc3NlcnQodGluc3QgIT0gTlVMTCwgIm9iaiBpcyBudWxsIik7CisgIGFzc2VydCh0aW5zdC0+a2xhc3MoKS0+aXNfbG9hZGVkKCksICJvYmogaXMgbm90IGxvYWRlZCIpOworICBhc3NlcnQoIWlzX2V4YWN0IHx8IHRpbnN0LT5rbGFzc19pc19leGFjdCgpLCAia2xhc3Mgbm90IGV4YWN0Iik7CisKKyAgY2lGaWVsZCogZmllbGQgPSB0aW5zdC0+a2xhc3MoKS0+YXNfaW5zdGFuY2Vfa2xhc3MoKS0+Z2V0X2ZpZWxkX2J5X25hbWUoY2lTeW1ib2w6Om1ha2UoZmllbGROYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lTeW1ib2w6Om1ha2UoZmllbGRUeXBlU3RyaW5nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfc3RhdGljKTsKKyAgaWYgKGZpZWxkID09IE5VTEwpIHJldHVybiAoTm9kZSAqKSBOVUxMOworICBhc3NlcnQgKGZpZWxkICE9IE5VTEwsICJ1bmRlZmluZWQgZmllbGQiKTsKKworICAvLyBOZXh0IGNvZGUgIGNvcGllZCBmcm9tIFBhcnNlOjpkb19nZXRfeHh4KCk6CisKKyAgLy8gQ29tcHV0ZSBhZGRyZXNzIGFuZCBtZW1vcnkgdHlwZS4KKyAgaW50IG9mZnNldCAgPSBmaWVsZC0+b2Zmc2V0X2luX2J5dGVzKCk7CisgIGJvb2wgaXNfdm9sID0gZmllbGQtPmlzX3ZvbGF0aWxlKCk7CisgIGNpVHlwZSogZmllbGRfa2xhc3MgPSBmaWVsZC0+dHlwZSgpOworICBhc3NlcnQoZmllbGRfa2xhc3MtPmlzX2xvYWRlZCgpLCAic2hvdWxkIGJlIGxvYWRlZCIpOworICBjb25zdCBUeXBlUHRyKiBhZHJfdHlwZSA9IEMtPmFsaWFzX3R5cGUoZmllbGQpLT5hZHJfdHlwZSgpOworICBOb2RlICphZHIgPSBiYXNpY19wbHVzX2Fkcihmcm9tT2JqLCBmcm9tT2JqLCBvZmZzZXQpOworICBCYXNpY1R5cGUgYnQgPSBmaWVsZC0+bGF5b3V0X3R5cGUoKTsKKworICAvLyBCdWlsZCB0aGUgcmVzdWx0YW50IHR5cGUgb2YgdGhlIGxvYWQKKyAgY29uc3QgVHlwZSAqdHlwZSA9IFR5cGVPb3BQdHI6Om1ha2VfZnJvbV9rbGFzcyhmaWVsZF9rbGFzcy0+YXNfa2xhc3MoKSk7CisKKyAgLy8gQnVpbGQgdGhlIGxvYWQuCisgIE5vZGUqIGxvYWRlZEZpZWxkID0gbWFrZV9sb2FkKE5VTEwsIGFkciwgdHlwZSwgYnQsIGFkcl90eXBlLCBpc192b2wpOworICByZXR1cm4gbG9hZGVkRmllbGQ7Cit9CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1pbmxpbmVfYWVzY3J5cHRfQmxvY2stLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorYm9vbCBMaWJyYXJ5Q2FsbEtpdDo6aW5saW5lX2Flc2NyeXB0X0Jsb2NrKHZtSW50cmluc2ljczo6SUQgaWQpIHsKKyAgYWRkcmVzcyBzdHViQWRkcjsKKyAgY29uc3QgY2hhciAqc3R1Yk5hbWU7CisgIGFzc2VydChVc2VBRVMsICJuZWVkIEFFUyBpbnN0cnVjdGlvbiBzdXBwb3J0Iik7CisKKyAgc3dpdGNoKGlkKSB7CisgIGNhc2Ugdm1JbnRyaW5zaWNzOjpfYWVzY3J5cHRfZW5jcnlwdEJsb2NrOgorICAgIHN0dWJBZGRyID0gU3R1YlJvdXRpbmVzOjphZXNjcnlwdF9lbmNyeXB0QmxvY2soKTsKKyAgICBzdHViTmFtZSA9ICJhZXNjcnlwdF9lbmNyeXB0QmxvY2siOworICAgIGJyZWFrOworICBjYXNlIHZtSW50cmluc2ljczo6X2Flc2NyeXB0X2RlY3J5cHRCbG9jazoKKyAgICBzdHViQWRkciA9IFN0dWJSb3V0aW5lczo6YWVzY3J5cHRfZGVjcnlwdEJsb2NrKCk7CisgICAgc3R1Yk5hbWUgPSAiYWVzY3J5cHRfZGVjcnlwdEJsb2NrIjsKKyAgICBicmVhazsKKyAgfQorICBpZiAoc3R1YkFkZHIgPT0gTlVMTCkgcmV0dXJuIGZhbHNlOworCisgIC8vIFJlc3RvcmUgdGhlIHN0YWNrIGFuZCBwb3Agb2ZmIHRoZSBhcmd1bWVudHMuCisgIGludCBuYXJncyA9IDU7ICAvLyB0aGlzICsgMiBvb3Avb2Zmc2V0IGNvbWJvcworICBhc3NlcnQoY2FsbGVlKCktPnNpZ25hdHVyZSgpLT5zaXplKCkgPT0gbmFyZ3MtMSwgImVuY3J5cHRCbG9jayBoYXMgNCBhcmd1bWVudHMiKTsKKworICBOb2RlICphZXNjcnlwdF9vYmplY3QgID0gYXJndW1lbnQoMCk7CisgIE5vZGUgKnNyYyAgICAgICAgID0gYXJndW1lbnQoMSk7CisgIE5vZGUgKnNyY19vZmZzZXQgID0gYXJndW1lbnQoMik7CisgIE5vZGUgKmRlc3QgICAgICAgID0gYXJndW1lbnQoMyk7CisgIE5vZGUgKmRlc3Rfb2Zmc2V0ID0gYXJndW1lbnQoNCk7CisKKyAgLy8gKDEpIHNyYyBhbmQgZGVzdCBhcmUgYXJyYXlzLgorICBjb25zdCBUeXBlKiBzcmNfdHlwZSA9IHNyYy0+VmFsdWUoJl9ndm4pOworICBjb25zdCBUeXBlKiBkZXN0X3R5cGUgPSBkZXN0LT5WYWx1ZSgmX2d2bik7CisgIGNvbnN0IFR5cGVBcnlQdHIqIHRvcF9zcmMgPSBzcmNfdHlwZS0+aXNhX2FyeXB0cigpOworICBjb25zdCBUeXBlQXJ5UHRyKiB0b3BfZGVzdCA9IGRlc3RfdHlwZS0+aXNhX2FyeXB0cigpOworICBhc3NlcnQgKHRvcF9zcmMgICE9IE5VTEwgJiYgdG9wX3NyYy0+a2xhc3MoKSAgIT0gTlVMTCAmJiAgdG9wX2Rlc3QgIT0gTlVMTCAmJiB0b3BfZGVzdC0+a2xhc3MoKSAhPSBOVUxMLCAiYXJncyBhcmUgc3RyYW5nZSIpOworCisgIC8vIGZvciB0aGUgcXVpY2sgYW5kIGRpcnR5IGNvZGUgd2Ugd2lsbCBza2lwIGFsbCB0aGUgY2hlY2tzLgorICAvLyB3ZSBhcmUganVzdCB0cnlpbmcgdG8gZ2V0IHRoZSBjYWxsIHRvIGJlIGdlbmVyYXRlZC4KKyAgTm9kZSogc3JjX3N0YXJ0ICA9IHNyYzsKKyAgTm9kZSogZGVzdF9zdGFydCA9IGRlc3Q7CisgIGlmIChzcmNfb2Zmc2V0ICE9IE5VTEwgfHwgZGVzdF9vZmZzZXQgIT0gTlVMTCkgeworICAgIGFzc2VydChzcmNfb2Zmc2V0ICE9IE5VTEwgJiYgZGVzdF9vZmZzZXQgIT0gTlVMTCwgIiIpOworICAgIHNyY19zdGFydCAgPSBhcnJheV9lbGVtZW50X2FkZHJlc3Moc3JjLCAgc3JjX29mZnNldCwgIFRfQllURSk7CisgICAgZGVzdF9zdGFydCA9IGFycmF5X2VsZW1lbnRfYWRkcmVzcyhkZXN0LCBkZXN0X29mZnNldCwgVF9CWVRFKTsKKyAgfQorCisgIC8vIG5vdyBuZWVkIHRvIGdldCB0aGUgc3RhcnQgb2YgaXRzIGV4cGFuZGVkIGtleSBhcnJheQorICAvLyB0aGlzIHJlcXVpcmVzIGEgbmV3ZXIgY2xhc3MgZmlsZSB0aGF0IGhhcyB0aGlzIGFycmF5IGFzIGxpdHRsZUVuZGlhbiBpbnRzLCBvdGhlcndpc2Ugd2UgcmV2ZXJ0IHRvIGphdmEKKyAgTm9kZSoga19zdGFydCA9IGdldF9rZXlfc3RhcnRfZnJvbV9hZXNjcnlwdF9vYmplY3QoYWVzY3J5cHRfb2JqZWN0KTsKKyAgaWYgKGtfc3RhcnQgPT0gTlVMTCkgcmV0dXJuIGZhbHNlOworCisgIC8vIENhbGwgdGhlIHN0dWIuCisgIG1ha2VfcnVudGltZV9jYWxsKFJDX0xFQUZ8UkNfTk9fRlAsIE9wdG9SdW50aW1lOjphZXNjcnlwdF9ibG9ja19UeXBlKCksCisgICAgICAgICAgICAgICAgICAgIHN0dWJBZGRyLCBzdHViTmFtZSwgVHlwZVB0cjo6Qk9UVE9NLAorICAgICAgICAgICAgICAgICAgICBzcmNfc3RhcnQsIGRlc3Rfc3RhcnQsIGtfc3RhcnQpOworCisgIHJldHVybiB0cnVlOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLWlubGluZV9jaXBoZXJCbG9ja0NoYWluaW5nX0FFU0NyeXB0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Jvb2wgTGlicmFyeUNhbGxLaXQ6OmlubGluZV9jaXBoZXJCbG9ja0NoYWluaW5nX0FFU0NyeXB0KHZtSW50cmluc2ljczo6SUQgaWQpIHsKKyAgYWRkcmVzcyBzdHViQWRkcjsKKyAgY29uc3QgY2hhciAqc3R1Yk5hbWU7CisKKyAgYXNzZXJ0KFVzZUFFUywgIm5lZWQgQUVTIGluc3RydWN0aW9uIHN1cHBvcnQiKTsKKworICBzd2l0Y2goaWQpIHsKKyAgY2FzZSB2bUludHJpbnNpY3M6Ol9jaXBoZXJCbG9ja0NoYWluaW5nX2VuY3J5cHRBRVNDcnlwdDoKKyAgICBzdHViQWRkciA9IFN0dWJSb3V0aW5lczo6Y2lwaGVyQmxvY2tDaGFpbmluZ19lbmNyeXB0QUVTQ3J5cHQoKTsKKyAgICBzdHViTmFtZSA9ICJjaXBoZXJCbG9ja0NoYWluaW5nX2VuY3J5cHRBRVNDcnlwdCI7CisgICAgYnJlYWs7CisgIGNhc2Ugdm1JbnRyaW5zaWNzOjpfY2lwaGVyQmxvY2tDaGFpbmluZ19kZWNyeXB0QUVTQ3J5cHQ6CisgICAgc3R1YkFkZHIgPSBTdHViUm91dGluZXM6OmNpcGhlckJsb2NrQ2hhaW5pbmdfZGVjcnlwdEFFU0NyeXB0KCk7CisgICAgc3R1Yk5hbWUgPSAiY2lwaGVyQmxvY2tDaGFpbmluZ19kZWNyeXB0QUVTQ3J5cHQiOworICAgIGJyZWFrOworICB9CisgIGlmIChzdHViQWRkciA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CisKKworICAvLyBSZXN0b3JlIHRoZSBzdGFjayBhbmQgcG9wIG9mZiB0aGUgYXJndW1lbnRzLgorICBpbnQgbmFyZ3MgPSA2OyAgLy8gdGhpcyArIG9vcC9vZmZzZXQgKyBsZW4gKyBvb3Avb2Zmc2V0CisgIGFzc2VydChjYWxsZWUoKS0+c2lnbmF0dXJlKCktPnNpemUoKSA9PSBuYXJncy0xLCAid3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50cyIpOworICBOb2RlICpjaXBoZXJCbG9ja0NoYWluaW5nX29iamVjdCAgPSBhcmd1bWVudCgwKTsKKyAgTm9kZSAqc3JjICAgICAgICAgPSBhcmd1bWVudCgxKTsKKyAgTm9kZSAqc3JjX29mZnNldCAgPSBhcmd1bWVudCgyKTsKKyAgTm9kZSAqbGVuICAgICAgICAgPSBhcmd1bWVudCgzKTsKKyAgTm9kZSAqZGVzdCAgICAgICAgPSBhcmd1bWVudCg0KTsKKyAgTm9kZSAqZGVzdF9vZmZzZXQgPSBhcmd1bWVudCg1KTsKKworICAvLyAoMSkgc3JjIGFuZCBkZXN0IGFyZSBhcnJheXMuCisgIGNvbnN0IFR5cGUqIHNyY190eXBlID0gc3JjLT5WYWx1ZSgmX2d2bik7CisgIGNvbnN0IFR5cGUqIGRlc3RfdHlwZSA9IGRlc3QtPlZhbHVlKCZfZ3ZuKTsKKyAgY29uc3QgVHlwZUFyeVB0ciogdG9wX3NyYyA9IHNyY190eXBlLT5pc2FfYXJ5cHRyKCk7CisgIGNvbnN0IFR5cGVBcnlQdHIqIHRvcF9kZXN0ID0gZGVzdF90eXBlLT5pc2FfYXJ5cHRyKCk7CisgIGFzc2VydCAodG9wX3NyYyAgIT0gTlVMTCAmJiB0b3Bfc3JjLT5rbGFzcygpICAhPSBOVUxMCisgICAgICAgICAgJiYgIHRvcF9kZXN0ICE9IE5VTEwgJiYgdG9wX2Rlc3QtPmtsYXNzKCkgIT0gTlVMTCwgImFyZ3MgYXJlIHN0cmFuZ2UiKTsKKworICAvLyBjaGVja3MgYXJlIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgY2FsbGVyCisgIE5vZGUqIHNyY19zdGFydCAgPSBzcmM7CisgIE5vZGUqIGRlc3Rfc3RhcnQgPSBkZXN0OworICBpZiAoc3JjX29mZnNldCAhPSBOVUxMIHx8IGRlc3Rfb2Zmc2V0ICE9IE5VTEwpIHsKKyAgICBhc3NlcnQoc3JjX29mZnNldCAhPSBOVUxMICYmIGRlc3Rfb2Zmc2V0ICE9IE5VTEwsICIiKTsKKyAgICBzcmNfc3RhcnQgID0gYXJyYXlfZWxlbWVudF9hZGRyZXNzKHNyYywgIHNyY19vZmZzZXQsICBUX0JZVEUpOworICAgIGRlc3Rfc3RhcnQgPSBhcnJheV9lbGVtZW50X2FkZHJlc3MoZGVzdCwgZGVzdF9vZmZzZXQsIFRfQllURSk7CisgIH0KKworICAvLyBpZiB3ZSBhcmUgaW4gdGhpcyBzZXQgb2YgY29kZSwgd2UgImtub3ciIHRoZSBlbWJlZGRlZENpcGhlciBpcyBhbiBBRVNDcnlwdCBvYmplY3QKKyAgLy8gKGJlY2F1c2Ugb2YgdGhlIHByZWRpY2F0ZWQgbG9naWMgZXhlY3V0ZWQgZWFybGllcikuCisgIC8vIHNvIHdlIGNhc3QgaXQgaGVyZSBzYWZlbHkuCisgIC8vIHRoaXMgcmVxdWlyZXMgYSBuZXdlciBjbGFzcyBmaWxlIHRoYXQgaGFzIHRoaXMgYXJyYXkgYXMgbGl0dGxlRW5kaWFuIGludHMsIG90aGVyd2lzZSB3ZSByZXZlcnQgdG8gamF2YQorCisgIE5vZGUqIGVtYmVkZGVkQ2lwaGVyT2JqID0gbG9hZF9maWVsZF9mcm9tX29iamVjdChjaXBoZXJCbG9ja0NoYWluaW5nX29iamVjdCwgImVtYmVkZGVkQ2lwaGVyIiwgIkxjb20vc3VuL2NyeXB0by9wcm92aWRlci9TeW1tZXRyaWNDaXBoZXI7IiwgLyppc19leGFjdCovIGZhbHNlKTsKKyAgaWYgKGVtYmVkZGVkQ2lwaGVyT2JqID09IE5VTEwpIHJldHVybiBmYWxzZTsKKworICAvLyBjYXN0IGl0IHRvIHdoYXQgd2Uga25vdyBpdCB3aWxsIGJlIGF0IHJ1bnRpbWUKKyAgY29uc3QgVHlwZUluc3RQdHIqIHRpbnN0ID0gX2d2bi50eXBlKGNpcGhlckJsb2NrQ2hhaW5pbmdfb2JqZWN0KS0+aXNhX2luc3RwdHIoKTsKKyAgYXNzZXJ0KHRpbnN0ICE9IE5VTEwsICJDQkMgb2JqIGlzIG51bGwiKTsKKyAgYXNzZXJ0KHRpbnN0LT5rbGFzcygpLT5pc19sb2FkZWQoKSwgIkNCQyBvYmogaXMgbm90IGxvYWRlZCIpOworICBjaUtsYXNzKiBrbGFzc19BRVNDcnlwdCA9IHRpbnN0LT5rbGFzcygpLT5hc19pbnN0YW5jZV9rbGFzcygpLT5maW5kX2tsYXNzKGNpU3ltYm9sOjptYWtlKCJjb20vc3VuL2NyeXB0by9wcm92aWRlci9BRVNDcnlwdCIpKTsKKyAgaWYgKCFrbGFzc19BRVNDcnlwdC0+aXNfbG9hZGVkKCkpIHJldHVybiBmYWxzZTsKKworICBjaUluc3RhbmNlS2xhc3MqIGluc3RrbGFzc19BRVNDcnlwdCA9IGtsYXNzX0FFU0NyeXB0LT5hc19pbnN0YW5jZV9rbGFzcygpOworICBjb25zdCBUeXBlS2xhc3NQdHIqIGFrbGFzcyA9IFR5cGVLbGFzc1B0cjo6bWFrZShpbnN0a2xhc3NfQUVTQ3J5cHQpOworICBjb25zdCBUeXBlT29wUHRyKiB4dHlwZSA9IGFrbGFzcy0+YXNfaW5zdGFuY2VfdHlwZSgpOworICBOb2RlKiBhZXNjcnlwdF9vYmplY3QgPSBuZXcoQykgQ2hlY2tDYXN0UFBOb2RlKGNvbnRyb2woKSwgZW1iZWRkZWRDaXBoZXJPYmosIHh0eXBlKTsKKyAgYWVzY3J5cHRfb2JqZWN0ID0gX2d2bi50cmFuc2Zvcm0oYWVzY3J5cHRfb2JqZWN0KTsKKworICAvLyB3ZSBuZWVkIHRvIGdldCB0aGUgc3RhcnQgb2YgdGhlIGFlc2NyeXB0X29iamVjdCdzIGV4cGFuZGVkIGtleSBhcnJheQorICBOb2RlKiBrX3N0YXJ0ID0gZ2V0X2tleV9zdGFydF9mcm9tX2Flc2NyeXB0X29iamVjdChhZXNjcnlwdF9vYmplY3QpOworICBpZiAoa19zdGFydCA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CisKKyAgLy8gc2ltaWxhcmx5LCBnZXQgdGhlIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlIHIgdmVjdG9yCisgIE5vZGUqIG9ialJ2ZWMgPSBsb2FkX2ZpZWxkX2Zyb21fb2JqZWN0KGNpcGhlckJsb2NrQ2hhaW5pbmdfb2JqZWN0LCAiciIsICJbQiIsIC8qaXNfZXhhY3QqLyBmYWxzZSk7CisgIGlmIChvYmpSdmVjID09IE5VTEwpIHJldHVybiBmYWxzZTsKKyAgTm9kZSogcl9zdGFydCA9IGFycmF5X2VsZW1lbnRfYWRkcmVzcyhvYmpSdmVjLCBpbnRjb24oMCksIFRfQllURSk7CisKKyAgLy8gQ2FsbCB0aGUgc3R1YiwgcGFzc2luZyBzcmNfc3RhcnQsIGRlc3Rfc3RhcnQsIGtfc3RhcnQsIHJfc3RhcnQgYW5kIHNyY19sZW4KKyAgbWFrZV9ydW50aW1lX2NhbGwoUkNfTEVBRnxSQ19OT19GUCwKKyAgICAgICAgICAgICAgICAgICAgT3B0b1J1bnRpbWU6OmNpcGhlckJsb2NrQ2hhaW5pbmdfYWVzY3J5cHRfVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICBzdHViQWRkciwgc3R1Yk5hbWUsIFR5cGVQdHI6OkJPVFRPTSwKKyAgICAgICAgICAgICAgICAgICAgc3JjX3N0YXJ0LCBkZXN0X3N0YXJ0LCBrX3N0YXJ0LCByX3N0YXJ0LCBsZW4pOworCisgIC8vIHJldHVybiBpcyB2b2lkIHNvIG5vIHJlc3VsdCBuZWVkcyB0byBiZSBwdXNoZWQKKworICByZXR1cm4gdHJ1ZTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1nZXRfa2V5X3N0YXJ0X2Zyb21fYWVzY3J5cHRfb2JqZWN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK05vZGUgKiBMaWJyYXJ5Q2FsbEtpdDo6Z2V0X2tleV9zdGFydF9mcm9tX2Flc2NyeXB0X29iamVjdChOb2RlICphZXNjcnlwdF9vYmplY3QpIHsKKyAgTm9kZSogb2JqQUVTQ3J5cHRLZXkgPSBsb2FkX2ZpZWxkX2Zyb21fb2JqZWN0KGFlc2NyeXB0X29iamVjdCwgIksiLCAiW0kiLCAvKmlzX2V4YWN0Ki8gZmFsc2UpOworICBhc3NlcnQgKG9iakFFU0NyeXB0S2V5ICE9IE5VTEwsICJ3cm9uZyB2ZXJzaW9uIG9mIGNvbS5zdW4uY3J5cHRvLnByb3ZpZGVyLkFFU0NyeXB0Iik7CisgIGlmIChvYmpBRVNDcnlwdEtleSA9PSBOVUxMKSByZXR1cm4gKE5vZGUgKikgTlVMTDsKKworICAvLyBub3cgaGF2ZSB0aGUgYXJyYXksIG5lZWQgdG8gZ2V0IHRoZSBzdGFydCBhZGRyZXNzIG9mIHRoZSBLIGFycmF5CisgIE5vZGUqIGtfc3RhcnQgPSBhcnJheV9lbGVtZW50X2FkZHJlc3Mob2JqQUVTQ3J5cHRLZXksIGludGNvbigwKSwgVF9JTlQpOworICByZXR1cm4ga19zdGFydDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0taW5saW5lX2NpcGhlckJsb2NrQ2hhaW5pbmdfQUVTQ3J5cHRfcHJlZGljYXRlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUmV0dXJuIG5vZGUgcmVwcmVzZW50aW5nIHNsb3cgcGF0aCBvZiBwcmVkaWNhdGUgY2hlY2suCisvLyB0aGUgcHNldWRvIGNvZGUgd2Ugd2FudCB0byBlbXVsYXRlIHdpdGggdGhpcyBwcmVkaWNhdGUgaXM6CisvLyBmb3IgZW5jcnlwdGlvbjoKKy8vICAgIGlmIChlbWJlZGRlZENpcGhlck9iaiBpbnN0YW5jZW9mIEFFU0NyeXB0KSBkb19pbnRyaW5zaWMsIGVsc2UgZG9famF2YXBhdGgKKy8vIGZvciBkZWNyeXB0aW9uOgorLy8gICAgaWYgKChlbWJlZGRlZENpcGhlck9iaiBpbnN0YW5jZW9mIEFFU0NyeXB0KSAmJiAoY2lwaGVyIT1wbGFpbikpIGRvX2ludHJpbnNpYywgZWxzZSBkb19qYXZhcGF0aAorLy8gICAgbm90ZSBjaXBoZXI9PXBsYWluIGlzIG1vcmUgY29uc2VydmF0aXZlIHRoYW4gdGhlIG9yaWdpbmFsIGphdmEgY29kZSBidXQgdGhhdCdzIE9LCisvLworTm9kZSogTGlicmFyeUNhbGxLaXQ6OmlubGluZV9jaXBoZXJCbG9ja0NoYWluaW5nX0FFU0NyeXB0X3ByZWRpY2F0ZShib29sIGRlY3J5cHRpbmcpIHsKKyAgLy8gRmlyc3QsIGNoZWNrIHJlY2VpdmVyIGZvciBOVUxMIHNpbmNlIGl0IGlzIHZpcnR1YWwgbWV0aG9kLgorICBpbnQgbmFyZ3MgPSBhcmdfc2l6ZSgpOworICBOb2RlKiBvYmpDQkMgPSBhcmd1bWVudCgwKTsKKyAgX3NwICs9IG5hcmdzOworICBvYmpDQkMgPSBkb19udWxsX2NoZWNrKG9iakNCQywgVF9PQkpFQ1QpOworICBfc3AgLT0gbmFyZ3M7CisKKyAgaWYgKHN0b3BwZWQoKSkgcmV0dXJuIE5VTEw7IC8vIEFsd2F5cyBOVUxMCisKKyAgLy8gTG9hZCBlbWJlZGRlZENpcGhlciBmaWVsZCBvZiBDaXBoZXJCbG9ja0NoYWluaW5nIG9iamVjdC4KKyAgTm9kZSogZW1iZWRkZWRDaXBoZXJPYmogPSBsb2FkX2ZpZWxkX2Zyb21fb2JqZWN0KG9iakNCQywgImVtYmVkZGVkQ2lwaGVyIiwgIkxjb20vc3VuL2NyeXB0by9wcm92aWRlci9TeW1tZXRyaWNDaXBoZXI7IiwgLyppc19leGFjdCovIGZhbHNlKTsKKworICAvLyBnZXQgQUVTQ3J5cHQga2xhc3MgZm9yIGluc3RhbmNlT2YgY2hlY2sKKyAgLy8gQUVTQ3J5cHQgbWlnaHQgbm90IGJlIGxvYWRlZCB5ZXQgaWYgc29tZSBvdGhlciBTeW1tZXRyaWNDaXBoZXIgZ290IHVzIHRvIHRoaXMgY29tcGlsZSBwb2ludAorICAvLyB3aWxsIGhhdmUgc2FtZSBjbGFzc2xvYWRlciBhcyBDaXBoZXJCbG9ja0NoYWluaW5nIG9iamVjdAorICBjb25zdCBUeXBlSW5zdFB0ciogdGluc3QgPSBfZ3ZuLnR5cGUob2JqQ0JDKS0+aXNhX2luc3RwdHIoKTsKKyAgYXNzZXJ0KHRpbnN0ICE9IE5VTEwsICJDQkNvYmogaXMgbnVsbCIpOworICBhc3NlcnQodGluc3QtPmtsYXNzKCktPmlzX2xvYWRlZCgpLCAiQ0JDb2JqIGlzIG5vdCBsb2FkZWQiKTsKKworICAvLyB3ZSB3YW50IHRvIGRvIGFuIGluc3RhbmNlb2YgY29tcGFyaXNvbiBhZ2FpbnN0IHRoZSBBRVNDcnlwdCBjbGFzcworICBjaUtsYXNzKiBrbGFzc19BRVNDcnlwdCA9IHRpbnN0LT5rbGFzcygpLT5hc19pbnN0YW5jZV9rbGFzcygpLT5maW5kX2tsYXNzKGNpU3ltYm9sOjptYWtlKCJjb20vc3VuL2NyeXB0by9wcm92aWRlci9BRVNDcnlwdCIpKTsKKyAgaWYgKCFrbGFzc19BRVNDcnlwdC0+aXNfbG9hZGVkKCkpIHsKKyAgICAvLyBpZiBBRVNDcnlwdCBpcyBub3QgZXZlbiBsb2FkZWQsIHdlIG5ldmVyIHRha2UgdGhlIGludHJpbnNpYyBmYXN0IHBhdGgKKyAgICBOb2RlKiBjdHJsID0gY29udHJvbCgpOworICAgIHNldF9jb250cm9sKHRvcCgpKTsgLy8gbm8gcmVndWxhciBmYXN0IHBhdGgKKyAgICByZXR1cm4gY3RybDsKKyAgfQorICBjaUluc3RhbmNlS2xhc3MqIGluc3RrbGFzc19BRVNDcnlwdCA9IGtsYXNzX0FFU0NyeXB0LT5hc19pbnN0YW5jZV9rbGFzcygpOworCisgIF9zcCArPSBuYXJnczsgICAgICAgICAgLy8gZ2VuX2luc3RhbmNlb2YgbWlnaHQgZG8gYW4gdW5jb21tb24gdHJhcAorICBOb2RlKiBpbnN0b2YgPSBnZW5faW5zdGFuY2VvZihlbWJlZGRlZENpcGhlck9iaiwgbWFrZWNvbihUeXBlS2xhc3NQdHI6Om1ha2UoaW5zdGtsYXNzX0FFU0NyeXB0KSkpOworICBfc3AgLT0gbmFyZ3M7CisgIE5vZGUqIGNtcF9pbnN0b2YgID0gX2d2bi50cmFuc2Zvcm0obmV3IChDKSBDbXBJTm9kZShpbnN0b2YsIGludGNvbigxKSkpOworICBOb2RlKiBib29sX2luc3RvZiAgPSBfZ3ZuLnRyYW5zZm9ybShuZXcgKEMpIEJvb2xOb2RlKGNtcF9pbnN0b2YsIEJvb2xUZXN0OjpuZSkpOworCisgIE5vZGUqIGluc3RvZl9mYWxzZSA9IGdlbmVyYXRlX2d1YXJkKGJvb2xfaW5zdG9mLCBOVUxMLCBQUk9CX01JTik7CisKKyAgLy8gZm9yIGVuY3J5cHRpb24sIHdlIGFyZSBkb25lCisgIGlmICghZGVjcnlwdGluZykKKyAgICByZXR1cm4gaW5zdG9mX2ZhbHNlOyAgLy8gZXZlbiBpZiBpdCBpcyBOVUxMCisKKyAgLy8gZm9yIGRlY3J5cHRpb24sIHdlIG5lZWQgdG8gYWRkIGEgZnVydGhlciBjaGVjayB0byBhdm9pZAorICAvLyB0YWtpbmcgdGhlIGludHJpbnNpYyBwYXRoIHdoZW4gY2lwaGVyIGFuZCBwbGFpbiBhcmUgdGhlIHNhbWUKKyAgLy8gc2VlIHRoZSBvcmlnaW5hbCBqYXZhIGNvZGUgZm9yIHdoeS4KKyAgUmVnaW9uTm9kZSogcmVnaW9uID0gbmV3KEMpIFJlZ2lvbk5vZGUoMyk7CisgIHJlZ2lvbi0+aW5pdF9yZXEoMSwgaW5zdG9mX2ZhbHNlKTsKKyAgTm9kZSogc3JjID0gYXJndW1lbnQoMSk7CisgIE5vZGUgKmRlc3QgPSBhcmd1bWVudCg0KTsKKyAgTm9kZSogY21wX3NyY19kZXN0ID0gX2d2bi50cmFuc2Zvcm0obmV3IChDKSBDbXBQTm9kZShzcmMsIGRlc3QpKTsKKyAgTm9kZSogYm9vbF9zcmNfZGVzdCA9IF9ndm4udHJhbnNmb3JtKG5ldyAoQykgQm9vbE5vZGUoY21wX3NyY19kZXN0LCBCb29sVGVzdDo6ZXEpKTsKKyAgTm9kZSogc3JjX2Rlc3RfY29uam9pbnQgPSBnZW5lcmF0ZV9ndWFyZChib29sX3NyY19kZXN0LCBOVUxMLCBQUk9CX01JTik7CisgIHJlZ2lvbi0+aW5pdF9yZXEoMiwgc3JjX2Rlc3RfY29uam9pbnQpOworCisgIHJlY29yZF9mb3JfaWd2bihyZWdpb24pOworICByZXR1cm4gX2d2bi50cmFuc2Zvcm0ocmVnaW9uKTsKKworfQorCisKZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29wdG8vbG9vcFRyYW5zZm9ybS5jcHAgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9vcHRvL2xvb3BUcmFuc2Zvcm0uY3BwCmluZGV4IGI4YjFhNTcuLjUzZDBmZmYgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29wdG8vbG9vcFRyYW5zZm9ybS5jcHAKKysrIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vb3B0by9sb29wVHJhbnNmb3JtLmNwcApAQCAtMjcxNSw2ICsyNzE1LDggQEAKICAgcmVzdWx0X21lbSA9IG5ldyAoQykgUHJvak5vZGUoY2FsbCxUeXBlRnVuYzo6TWVtb3J5KTsKICAgX2lndm4ucmVnaXN0ZXJfbmV3X25vZGVfd2l0aF9vcHRpbWl6ZXIocmVzdWx0X21lbSk7CiAKKy8qIERpc2FibGUgZm9sbG93aW5nIG9wdGltaXphdGlvbiB1bnRpbCBwcm9wZXIgZml4IChhZGQgbWlzc2luZyBjaGVja3MpLgorCiAgIC8vIElmIHRoaXMgZmlsbCBpcyB0aWdodGx5IGNvdXBsZWQgdG8gYW4gYWxsb2NhdGlvbiBhbmQgb3ZlcndyaXRlcwogICAvLyB0aGUgd2hvbGUgYm9keSwgYWxsb3cgaXQgdG8gdGFrZSBvdmVyIHRoZSB6ZXJvaW5nLgogICBBbGxvY2F0ZU5vZGUqIGFsbG9jID0gQWxsb2NhdGVOb2RlOjpJZGVhbF9hbGxvY2F0aW9uKGJhc2UsIHRoaXMpOwpAQCAtMjczOCw2ICsyNzQwLDcgQEAKICNlbmRpZgogICAgIH0KICAgfQorKi8KIAogICAvLyBSZWRpcmVjdCB0aGUgb2xkIGNvbnRyb2wgYW5kIG1lbW9yeSBlZGdlcyB0aGF0IGFyZSBvdXRzaWRlIHRoZSBsb29wLgogICBOb2RlKiBleGl0ID0gaGVhZC0+bG9vcGV4aXQoKS0+cHJval9vdXQoMCk7CmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9zaGFyZS92bS9vcHRvL211bG5vZGUuY3BwIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vb3B0by9tdWxub2RlLmNwcAppbmRleCA0NTcyYTI2Li40MDQ3YjkzIDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9zaGFyZS92bS9vcHRvL211bG5vZGUuY3BwCisrKyBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29wdG8vbXVsbm9kZS5jcHAKQEAgLTQ3OSwyNCArNDc5LDI3IEBACiAgICAgcmV0dXJuIG5ldyAocGhhc2UtPkMpIEFuZElOb2RlKGxvYWQscGhhc2UtPmludGNvbihtYXNrJjB4RkZGRikpOwogCiAgIC8vIE1hc2tpbmcgYml0cyBvZmYgb2YgYSBTaG9ydD8gIExvYWRpbmcgYSBDaGFyYWN0ZXIgZG9lcyBzb21lIG1hc2tpbmcKLSAgaWYgKGxvcCA9PSBPcF9Mb2FkUyAmJiAobWFzayAmIDB4RkZGRjAwMDApID09IDAgKSB7Ci0gICAgTm9kZSAqbGR1cyA9IG5ldyAocGhhc2UtPkMpIExvYWRVU05vZGUobG9hZC0+aW4oTWVtTm9kZTo6Q29udHJvbCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZC0+aW4oTWVtTm9kZTo6TWVtb3J5KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkLT5pbihNZW1Ob2RlOjpBZGRyZXNzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkLT5hZHJfdHlwZSgpKTsKLSAgICBsZHVzID0gcGhhc2UtPnRyYW5zZm9ybShsZHVzKTsKLSAgICByZXR1cm4gbmV3IChwaGFzZS0+QykgQW5kSU5vZGUobGR1cywgcGhhc2UtPmludGNvbihtYXNrICYgMHhGRkZGKSk7Ci0gIH0KKyAgaWYgKGNhbl9yZXNoYXBlICYmCisgICAgICBsb2FkLT5vdXRjbnQoKSA9PSAxICYmIGxvYWQtPnVuaXF1ZV9vdXQoKSA9PSB0aGlzKSB7CisgICAgaWYgKGxvcCA9PSBPcF9Mb2FkUyAmJiAobWFzayAmIDB4RkZGRjAwMDApID09IDAgKSB7CisgICAgICBOb2RlICpsZHVzID0gbmV3IChwaGFzZS0+QykgTG9hZFVTTm9kZShsb2FkLT5pbihNZW1Ob2RlOjpDb250cm9sKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWQtPmluKE1lbU5vZGU6Ok1lbW9yeSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkLT5pbihNZW1Ob2RlOjpBZGRyZXNzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWQtPmFkcl90eXBlKCkpOworICAgICAgbGR1cyA9IHBoYXNlLT50cmFuc2Zvcm0obGR1cyk7CisgICAgICByZXR1cm4gbmV3IChwaGFzZS0+QykgQW5kSU5vZGUobGR1cywgcGhhc2UtPmludGNvbihtYXNrICYgMHhGRkZGKSk7CisgICAgfQogCi0gIC8vIE1hc2tpbmcgc2lnbiBiaXRzIG9mZiBvZiBhIEJ5dGU/ICBEbyBhbiB1bnNpZ25lZCBieXRlIGxvYWQgcGx1cwotICAvLyBhbiBhbmQuCi0gIGlmIChsb3AgPT0gT3BfTG9hZEIgJiYgKG1hc2sgJiAweEZGRkZGRjAwKSA9PSAwKSB7Ci0gICAgTm9kZSogbGR1YiA9IG5ldyAocGhhc2UtPkMpIExvYWRVQk5vZGUobG9hZC0+aW4oTWVtTm9kZTo6Q29udHJvbCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZC0+aW4oTWVtTm9kZTo6TWVtb3J5KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkLT5pbihNZW1Ob2RlOjpBZGRyZXNzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkLT5hZHJfdHlwZSgpKTsKLSAgICBsZHViID0gcGhhc2UtPnRyYW5zZm9ybShsZHViKTsKLSAgICByZXR1cm4gbmV3IChwaGFzZS0+QykgQW5kSU5vZGUobGR1YiwgcGhhc2UtPmludGNvbihtYXNrKSk7CisgICAgLy8gTWFza2luZyBzaWduIGJpdHMgb2ZmIG9mIGEgQnl0ZT8gIERvIGFuIHVuc2lnbmVkIGJ5dGUgbG9hZCBwbHVzCisgICAgLy8gYW4gYW5kLgorICAgIGlmIChsb3AgPT0gT3BfTG9hZEIgJiYgKG1hc2sgJiAweEZGRkZGRjAwKSA9PSAwKSB7CisgICAgICBOb2RlKiBsZHViID0gbmV3IChwaGFzZS0+QykgTG9hZFVCTm9kZShsb2FkLT5pbihNZW1Ob2RlOjpDb250cm9sKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWQtPmluKE1lbU5vZGU6Ok1lbW9yeSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkLT5pbihNZW1Ob2RlOjpBZGRyZXNzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWQtPmFkcl90eXBlKCkpOworICAgICAgbGR1YiA9IHBoYXNlLT50cmFuc2Zvcm0obGR1Yik7CisgICAgICByZXR1cm4gbmV3IChwaGFzZS0+QykgQW5kSU5vZGUobGR1YiwgcGhhc2UtPmludGNvbihtYXNrKSk7CisgICAgfQogICB9CiAKICAgLy8gTWFza2luZyBvZmYgc2lnbiBiaXRzPyAgRG9udCBtYWtlIHRoZW0hCkBAIC05MjMsNyArOTI2LDkgQEAKICAgICAgIHNldF9yZXEoMiwgcGhhc2UtPmludGNvbigwKSk7CiAgICAgICByZXR1cm4gdGhpczsKICAgICB9Ci0gICAgZWxzZSBpZiggbGQtPk9wY29kZSgpID09IE9wX0xvYWRVUyApCisgICAgZWxzZSBpZiggY2FuX3Jlc2hhcGUgJiYKKyAgICAgICAgICAgICBsZC0+T3Bjb2RlKCkgPT0gT3BfTG9hZFVTICYmCisgICAgICAgICAgICAgbGQtPm91dGNudCgpID09IDEgJiYgbGQtPnVuaXF1ZV9vdXQoKSA9PSBzaGwpCiAgICAgICAvLyBSZXBsYWNlIHplcm8tZXh0ZW5zaW9uLWxvYWQgd2l0aCBzaWduLWV4dGVuc2lvbi1sb2FkCiAgICAgICByZXR1cm4gbmV3IChwaGFzZS0+QykgTG9hZFNOb2RlKCBsZC0+aW4oTWVtTm9kZTo6Q29udHJvbCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxkLT5pbihNZW1Ob2RlOjpNZW1vcnkpLApkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vb3B0by9ydW50aW1lLmNwcCBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29wdG8vcnVudGltZS5jcHAKaW5kZXggYmIwNTA1My4uNTE5ODdlMiAxMDA2NDQKLS0tIGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vb3B0by9ydW50aW1lLmNwcAorKysgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9vcHRvL3J1bnRpbWUuY3BwCkBAIC04MTEsNiArODExLDQ4IEBACiAgIHJldHVybiBUeXBlRnVuYzo6bWFrZShkb21haW4sIHJhbmdlKTsKIH0KIAorLy8gZm9yIGFlc2NyeXB0IGVuY3J5cHQvZGVjcnlwdCBvcGVyYXRpb25zLCBqdXN0IHRocmVlIHBvaW50ZXJzIHJldHVybmluZyB2b2lkIChsZW5ndGggaXMgY29uc3RhbnQpCitjb25zdCBUeXBlRnVuYyogT3B0b1J1bnRpbWU6OmFlc2NyeXB0X2Jsb2NrX1R5cGUoKSB7CisgIC8vIGNyZWF0ZSBpbnB1dCB0eXBlIChkb21haW4pCisgIGludCBudW1fYXJncyAgICAgID0gMzsKKyAgaW50IGFyZ2NudCA9IG51bV9hcmdzOworICBjb25zdCBUeXBlKiogZmllbGRzID0gVHlwZVR1cGxlOjpmaWVsZHMoYXJnY250KTsKKyAgaW50IGFyZ3AgPSBUeXBlRnVuYzo6UGFybXM7CisgIGZpZWxkc1thcmdwKytdID0gVHlwZVB0cjo6Tk9UTlVMTDsgICAgLy8gc3JjCisgIGZpZWxkc1thcmdwKytdID0gVHlwZVB0cjo6Tk9UTlVMTDsgICAgLy8gZGVzdAorICBmaWVsZHNbYXJncCsrXSA9IFR5cGVQdHI6Ok5PVE5VTEw7ICAgIC8vIGsgYXJyYXkKKyAgYXNzZXJ0KGFyZ3AgPT0gVHlwZUZ1bmM6OlBhcm1zK2FyZ2NudCwgImNvcnJlY3QgZGVjb2RpbmciKTsKKyAgY29uc3QgVHlwZVR1cGxlKiBkb21haW4gPSBUeXBlVHVwbGU6Om1ha2UoVHlwZUZ1bmM6OlBhcm1zK2FyZ2NudCwgZmllbGRzKTsKKworICAvLyBubyByZXN1bHQgdHlwZSBuZWVkZWQKKyAgZmllbGRzID0gVHlwZVR1cGxlOjpmaWVsZHMoMSk7CisgIGZpZWxkc1tUeXBlRnVuYzo6UGFybXMrMF0gPSBOVUxMOyAvLyB2b2lkCisgIGNvbnN0IFR5cGVUdXBsZSogcmFuZ2UgPSBUeXBlVHVwbGU6Om1ha2UoVHlwZUZ1bmM6OlBhcm1zLCBmaWVsZHMpOworICByZXR1cm4gVHlwZUZ1bmM6Om1ha2UoZG9tYWluLCByYW5nZSk7Cit9CisKKy8vIGZvciBjaXBoZXJCbG9ja0NoYWluaW5nIGNhbGxzIG9mIGFlc2NyeXB0IGVuY3J5cHQvZGVjcnlwdCwgZm91ciBwb2ludGVycyBhbmQgYSBsZW5ndGgsIHJldHVybmluZyB2b2lkCitjb25zdCBUeXBlRnVuYyogT3B0b1J1bnRpbWU6OmNpcGhlckJsb2NrQ2hhaW5pbmdfYWVzY3J5cHRfVHlwZSgpIHsKKyAgLy8gY3JlYXRlIGlucHV0IHR5cGUgKGRvbWFpbikKKyAgaW50IG51bV9hcmdzICAgICAgPSA1OworICBpbnQgYXJnY250ID0gbnVtX2FyZ3M7CisgIGNvbnN0IFR5cGUqKiBmaWVsZHMgPSBUeXBlVHVwbGU6OmZpZWxkcyhhcmdjbnQpOworICBpbnQgYXJncCA9IFR5cGVGdW5jOjpQYXJtczsKKyAgZmllbGRzW2FyZ3ArK10gPSBUeXBlUHRyOjpOT1ROVUxMOyAgICAvLyBzcmMKKyAgZmllbGRzW2FyZ3ArK10gPSBUeXBlUHRyOjpOT1ROVUxMOyAgICAvLyBkZXN0CisgIGZpZWxkc1thcmdwKytdID0gVHlwZVB0cjo6Tk9UTlVMTDsgICAgLy8gayBhcnJheQorICBmaWVsZHNbYXJncCsrXSA9IFR5cGVQdHI6Ok5PVE5VTEw7ICAgIC8vIHIgYXJyYXkKKyAgZmllbGRzW2FyZ3ArK10gPSBUeXBlSW50OjpJTlQ7ICAgICAgICAvLyBzcmMgbGVuCisgIGFzc2VydChhcmdwID09IFR5cGVGdW5jOjpQYXJtcythcmdjbnQsICJjb3JyZWN0IGRlY29kaW5nIik7CisgIGNvbnN0IFR5cGVUdXBsZSogZG9tYWluID0gVHlwZVR1cGxlOjptYWtlKFR5cGVGdW5jOjpQYXJtcythcmdjbnQsIGZpZWxkcyk7CisKKyAgLy8gbm8gcmVzdWx0IHR5cGUgbmVlZGVkCisgIGZpZWxkcyA9IFR5cGVUdXBsZTo6ZmllbGRzKDEpOworICBmaWVsZHNbVHlwZUZ1bmM6OlBhcm1zKzBdID0gTlVMTDsgLy8gdm9pZAorICBjb25zdCBUeXBlVHVwbGUqIHJhbmdlID0gVHlwZVR1cGxlOjptYWtlKFR5cGVGdW5jOjpQYXJtcywgZmllbGRzKTsKKyAgcmV0dXJuIFR5cGVGdW5jOjptYWtlKGRvbWFpbiwgcmFuZ2UpOworfQorCiAvLy0tLS0tLS0tLS0tLS0gSW50ZXJwcmV0ZXIgc3RhdGUgYWNjZXNzIGZvciBvbiBzdGFjayByZXBsYWNlbWVudAogY29uc3QgVHlwZUZ1bmMqIE9wdG9SdW50aW1lOjpvc3JfZW5kX1R5cGUoKSB7CiAgIC8vIGNyZWF0ZSBpbnB1dCB0eXBlIChkb21haW4pCmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9zaGFyZS92bS9vcHRvL3J1bnRpbWUuaHBwIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vb3B0by9ydW50aW1lLmhwcAppbmRleCBjNzA3NzcyLi4xM2RhMjU1IDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9zaGFyZS92bS9vcHRvL3J1bnRpbWUuaHBwCisrKyBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29wdG8vcnVudGltZS5ocHAKQEAgLTI4MCw2ICsyODAsOSBAQAogCiAgIHN0YXRpYyBjb25zdCBUeXBlRnVuYyogYXJyYXlfZmlsbF9UeXBlKCk7CiAKKyAgc3RhdGljIGNvbnN0IFR5cGVGdW5jKiBhZXNjcnlwdF9ibG9ja19UeXBlKCk7CisgIHN0YXRpYyBjb25zdCBUeXBlRnVuYyogY2lwaGVyQmxvY2tDaGFpbmluZ19hZXNjcnlwdF9UeXBlKCk7CisKICAgLy8gbGVhZiBvbiBzdGFjayByZXBsYWNlbWVudCBpbnRlcnByZXRlciBhY2Nlc3NvciB0eXBlcwogICBzdGF0aWMgY29uc3QgVHlwZUZ1bmMqIG9zcl9lbmRfVHlwZSgpOwogCmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9zaGFyZS92bS9vcHRvL3N1cGVyd29yZC5jcHAgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9vcHRvL3N1cGVyd29yZC5jcHAKaW5kZXggZmZjNTM5NC4uZjUzYzY0OCAxMDA2NDQKLS0tIGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vb3B0by9zdXBlcndvcmQuY3BwCisrKyBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29wdG8vc3VwZXJ3b3JkLmNwcApAQCAtMTc3NiwxNiArMTc3NiwxNSBAQAogICAgIHNldF92ZWx0X3R5cGUobiwgY29udGFpbmVyX3R5cGUobikpOwogICB9CiAKLSAgLy8gUHJvcGFnYXRlIG5hcnJvd2VkIHR5cGUgYmFja3dhcmRzIHRocm91Z2ggb3BlcmF0aW9ucworICAvLyBQcm9wYWdhdGUgaW50ZWdlciBuYXJyb3dlZCB0eXBlIGJhY2t3YXJkcyB0aHJvdWdoIG9wZXJhdGlvbnMKICAgLy8gdGhhdCBkb24ndCBkZXBlbmQgb24gaGlnaGVyIG9yZGVyIGJpdHMKICAgZm9yIChpbnQgaSA9IF9ibG9jay5sZW5ndGgoKSAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgTm9kZSogbiA9IF9ibG9jay5hdChpKTsKICAgICAvLyBPbmx5IGludGVnZXIgdHlwZXMgbmVlZCBiZSBleGFtaW5lZAotICAgIGNvbnN0IFR5cGUqIHZ0ID0gdmVsdF90eXBlKG4pOwotICAgIGlmICh2dC0+YmFzaWNfdHlwZSgpID09IFRfSU5UKSB7CisgICAgY29uc3QgVHlwZSogdnRuID0gdmVsdF90eXBlKG4pOworICAgIGlmICh2dG4tPmJhc2ljX3R5cGUoKSA9PSBUX0lOVCkgewogICAgICAgdWludCBzdGFydCwgZW5kOwogICAgICAgVmVjdG9yTm9kZTo6dmVjdG9yX29wZXJhbmRzKG4sICZzdGFydCwgJmVuZCk7Ci0gICAgICBjb25zdCBUeXBlKiB2dCA9IHZlbHRfdHlwZShuKTsKIAogICAgICAgZm9yICh1aW50IGogPSBzdGFydDsgaiA8IGVuZDsgaisrKSB7CiAgICAgICAgIE5vZGUqIGluICA9IG4tPmluKGopOwpAQCAtMTgwMSw2ICsxODAwLDI0IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgfQogICAgICAgICAgIGlmIChzYW1lX3R5cGUpIHsKKyAgICAgICAgICAgIC8vIEZvciByaWdodCBzaGlmdHMgb2Ygc21hbGwgaW50ZWdlciB0eXBlcyAoYm9vbCwgYnl0ZSwgY2hhciwgc2hvcnQpCisgICAgICAgICAgICAvLyB3ZSBuZWVkIHByZWNpc2UgaW5mb3JtYXRpb24gYWJvdXQgc2lnbi1uZXNzLiBPbmx5IExvYWQgbm9kZXMgaGF2ZQorICAgICAgICAgICAgLy8gdGhpcyBpbmZvcm1hdGlvbiBiZWNhdXNlIFN0b3JlIG5vZGVzIGFyZSB0aGUgc2FtZSBmb3Igc2lnbmVkIGFuZAorICAgICAgICAgICAgLy8gdW5zaWduZWQgdmFsdWVzLiBBbmQgYW55IGFyaXRobWV0aWMgb3BlcmF0aW9uIGFmdGVyIGEgbG9hZCBtYXkKKyAgICAgICAgICAgIC8vIGV4cGFuZCBhIHZhbHVlIHRvIHNpZ25lZCBJbnQgc28gc3VjaCByaWdodCBzaGlmdHMgY2FuJ3QgYmUgdXNlZAorICAgICAgICAgICAgLy8gYmVjYXVzZSB2ZWN0b3IgZWxlbWVudHMgZG8gbm90IGhhdmUgdXBwZXIgYml0cyBvZiBJbnQuCisgICAgICAgICAgICBjb25zdCBUeXBlKiB2dCA9IHZ0bjsKKyAgICAgICAgICAgIGlmIChWZWN0b3JOb2RlOjppc19zaGlmdChpbikpIHsKKyAgICAgICAgICAgICAgTm9kZSogbG9hZCA9IGluLT5pbigxKTsKKyAgICAgICAgICAgICAgaWYgKGxvYWQtPmlzX0xvYWQoKSAmJiBpbl9iYihsb2FkKSAmJiAodmVsdF90eXBlKGxvYWQpLT5iYXNpY190eXBlKCkgPT0gVF9JTlQpKSB7CisgICAgICAgICAgICAgICAgdnQgPSB2ZWx0X3R5cGUobG9hZCk7CisgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW4tPk9wY29kZSgpICE9IE9wX0xTaGlmdEkpIHsKKyAgICAgICAgICAgICAgICAvLyBXaWRlbiB0eXBlIHRvIEludCB0byBhdm9pZCBjcmVhdGlvbiBvZiByaWdodCBzaGlmdCB2ZWN0b3IKKyAgICAgICAgICAgICAgICAvLyAoYWxpZ24gKyBkYXRhX3NpemUoczEpIGNoZWNrIGluIHN0bXRzX2Nhbl9wYWNrKCkgd2lsbCBmYWlsKS4KKyAgICAgICAgICAgICAgICAvLyBOb3RlLCBsZWZ0IHNoaWZ0cyB3b3JrIHJlZ2FyZGxlc3MgdHlwZS4KKyAgICAgICAgICAgICAgICB2dCA9IFR5cGVJbnQ6OklOVDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICAgICAgc2V0X3ZlbHRfdHlwZShpbiwgdnQpOwogICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMTg0MSw3ICsxODU4LDIwIEBACiAvLyBTbWFsbGVzdCB0eXBlIGNvbnRhaW5pbmcgcmFuZ2Ugb2YgdmFsdWVzCiBjb25zdCBUeXBlKiBTdXBlcldvcmQ6OmNvbnRhaW5lcl90eXBlKE5vZGUqIG4pIHsKICAgaWYgKG4tPmlzX01lbSgpKSB7Ci0gICAgcmV0dXJuIFR5cGU6OmdldF9jb25zdF9iYXNpY190eXBlKG4tPmFzX01lbSgpLT5tZW1vcnlfdHlwZSgpKTsKKyAgICBCYXNpY1R5cGUgYnQgPSBuLT5hc19NZW0oKS0+bWVtb3J5X3R5cGUoKTsKKyAgICBpZiAobi0+aXNfU3RvcmUoKSAmJiAoYnQgPT0gVF9DSEFSKSkgeworICAgICAgLy8gVXNlIFRfU0hPUlQgdHlwZSBpbnN0ZWFkIG9mIFRfQ0hBUiBmb3Igc3RvcmVkIHZhbHVlcyBiZWNhdXNlIGFueQorICAgICAgLy8gcHJlY2VkaW5nIGFyaXRobWV0aWMgb3BlcmF0aW9uIGV4dGVuZHMgdmFsdWVzIHRvIHNpZ25lZCBJbnQuCisgICAgICBidCA9IFRfU0hPUlQ7CisgICAgfQorICAgIGlmIChuLT5PcGNvZGUoKSA9PSBPcF9Mb2FkVUIpIHsKKyAgICAgIC8vIEFkanVzdCB0eXBlIGZvciB1bnNpZ25lZCBieXRlIGxvYWRzLCBpdCBpcyBpbXBvcnRhbnQgZm9yIHJpZ2h0IHNoaWZ0cy4KKyAgICAgIC8vIFRfQk9PTEVBTiBpcyB1c2VkIGJlY2F1c2UgdGhlcmUgaXMgbm8gYmFzaWMgdHlwZSByZXByZXNlbnRpbmcgdHlwZQorICAgICAgLy8gVHlwZUludDo6VUJZVEUuIFVzZSBvZiBUX0JPT0xFQU4gZm9yIHZlY3RvcnMgaXMgZmluZSBiZWNhdXNlIG9ubHkKKyAgICAgIC8vIHNpemUgKG9uZSBieXRlKSBhbmQgc2lnbiBpcyBpbXBvcnRhbnQuCisgICAgICBidCA9IFRfQk9PTEVBTjsKKyAgICB9CisgICAgcmV0dXJuIFR5cGU6OmdldF9jb25zdF9iYXNpY190eXBlKGJ0KTsKICAgfQogICBjb25zdCBUeXBlKiB0ID0gX2lndm4udHlwZShuKTsKICAgaWYgKHQtPmJhc2ljX3R5cGUoKSA9PSBUX0lOVCkgewpkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vb3B0by90eXBlLmNwcCBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29wdG8vdHlwZS5jcHAKaW5kZXggZjk4Mjc5OS4uMWE4ZWUyNSAxMDA2NDQKLS0tIGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vb3B0by90eXBlLmNwcAorKysgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9vcHRvL3R5cGUuY3BwCkBAIC02MSw3ICs2MSw3IEBACiAgIHsgQmFkLCAgICAgICAgICAgICBUX0lMTEVHQUwsICAgICJ0dXBsZToiLCAgICAgICAgZmFsc2UsIE5vZGU6Ok5vdEFNYWNoaW5lUmVnLCByZWxvY0luZm86Om5vbmUgICAgICAgICAgfSwgIC8vIFR1cGxlCiAgIHsgQmFkLCAgICAgICAgICAgICBUX0FSUkFZLCAgICAgICJhcnJheToiLCAgICAgICAgZmFsc2UsIE5vZGU6Ok5vdEFNYWNoaW5lUmVnLCByZWxvY0luZm86Om5vbmUgICAgICAgICAgfSwgIC8vIEFycmF5CiAKLSNpZiBkZWZpbmVkKElBMzIpIHx8IGRlZmluZWQoQU1ENjQpCisjaWZuZGVmIFNQQVJDCiAgIHsgQmFkLCAgICAgICAgICAgICBUX0lMTEVHQUwsICAgICJ2ZWN0b3JzOiIsICAgICAgZmFsc2UsIE9wX1ZlY1MsICAgICAgICAgICAgICByZWxvY0luZm86Om5vbmUgICAgICAgICAgfSwgIC8vIFZlY3RvclMKICAgeyBCYWQsICAgICAgICAgICAgIFRfSUxMRUdBTCwgICAgInZlY3RvcmQ6IiwgICAgICBmYWxzZSwgT3BfVmVjRCwgICAgICAgICAgICAgIHJlbG9jSW5mbzo6bm9uZSAgICAgICAgICB9LCAgLy8gVmVjdG9yRAogICB7IEJhZCwgICAgICAgICAgICAgVF9JTExFR0FMLCAgICAidmVjdG9yeDoiLCAgICAgIGZhbHNlLCBPcF9WZWNYLCAgICAgICAgICAgICAgcmVsb2NJbmZvOjpub25lICAgICAgICAgIH0sICAvLyBWZWN0b3JYCmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9zaGFyZS92bS9vcHRvL3ZlY3Rvcm5vZGUuY3BwIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vb3B0by92ZWN0b3Jub2RlLmNwcAppbmRleCBkMDk1NWE4Li45NjYwZDRlIDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9zaGFyZS92bS9vcHRvL3ZlY3Rvcm5vZGUuY3BwCisrKyBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL29wdG8vdmVjdG9ybm9kZS5jcHAKQEAgLTI5LDggKzI5LDcgQEAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tVmVjdG9yTm9kZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIC8vIFJldHVybiB0aGUgdmVjdG9yIG9wZXJhdG9yIGZvciB0aGUgc3BlY2lmaWVkIHNjYWxhciBvcGVyYXRpb24KLS8vIGFuZCB2ZWN0b3IgbGVuZ3RoLiAgQWxzbyB1c2VkIHRvIGNoZWNrIGlmIHRoZSBjb2RlIGdlbmVyYXRvcgotLy8gc3VwcG9ydHMgdGhlIHZlY3RvciBvcGVyYXRpb24uCisvLyBhbmQgdmVjdG9yIGxlbmd0aC4KIGludCBWZWN0b3JOb2RlOjpvcGNvZGUoaW50IHNvcGMsIEJhc2ljVHlwZSBidCkgewogICBzd2l0Y2ggKHNvcGMpIHsKICAgY2FzZSBPcF9BZGRJOgpAQCAtNzUsNyArNzQsNyBAQAogICAgIGNhc2UgVF9CWVRFOiAgIHJldHVybiAwOyAgIC8vIFVuaW1wbGVtZW50ZWQKICAgICBjYXNlIFRfQ0hBUjoKICAgICBjYXNlIFRfU0hPUlQ6ICByZXR1cm4gT3BfTXVsVlM7Ci0gICAgY2FzZSBUX0lOVDogICAgcmV0dXJuIE1hdGNoZXI6Om1hdGNoX3J1bGVfc3VwcG9ydGVkKE9wX011bFZJKSA/IE9wX011bFZJIDogMDsgLy8gU1NFNF8xCisgICAgY2FzZSBUX0lOVDogICAgcmV0dXJuIE9wX011bFZJOwogICAgIH0KICAgICBTaG91bGROb3RSZWFjaEhlcmUoKTsKICAgY2FzZSBPcF9NdWxGOgpAQCAtMTA0LDkgKzEwMyw5IEBACiAgICAgcmV0dXJuIE9wX0xTaGlmdFZMOwogICBjYXNlIE9wX1JTaGlmdEk6CiAgICAgc3dpdGNoIChidCkgewotICAgIGNhc2UgVF9CT09MRUFOOgorICAgIGNhc2UgVF9CT09MRUFOOnJldHVybiBPcF9VUlNoaWZ0VkI7IC8vIGJvb2xlYW4gaXMgdW5zaWduZWQgdmFsdWUKKyAgICBjYXNlIFRfQ0hBUjogICByZXR1cm4gT3BfVVJTaGlmdFZTOyAvLyBjaGFyIGlzIHVuc2lnbmVkIHZhbHVlCiAgICAgY2FzZSBUX0JZVEU6ICAgcmV0dXJuIE9wX1JTaGlmdFZCOwotICAgIGNhc2UgVF9DSEFSOgogICAgIGNhc2UgVF9TSE9SVDogIHJldHVybiBPcF9SU2hpZnRWUzsKICAgICBjYXNlIFRfSU5UOiAgICByZXR1cm4gT3BfUlNoaWZ0Vkk7CiAgICAgfQpAQCAtMTE2LDEwICsxMTUsMTQgQEAKICAgICByZXR1cm4gT3BfUlNoaWZ0Vkw7CiAgIGNhc2UgT3BfVVJTaGlmdEk6CiAgICAgc3dpdGNoIChidCkgewotICAgIGNhc2UgVF9CT09MRUFOOgotICAgIGNhc2UgVF9CWVRFOiAgIHJldHVybiBPcF9VUlNoaWZ0VkI7Ci0gICAgY2FzZSBUX0NIQVI6Ci0gICAgY2FzZSBUX1NIT1JUOiAgcmV0dXJuIE9wX1VSU2hpZnRWUzsKKyAgICBjYXNlIFRfQk9PTEVBTjpyZXR1cm4gT3BfVVJTaGlmdFZCOworICAgIGNhc2UgVF9DSEFSOiAgIHJldHVybiBPcF9VUlNoaWZ0VlM7CisgICAgY2FzZSBUX0JZVEU6CisgICAgY2FzZSBUX1NIT1JUOiAgcmV0dXJuIDA7IC8vIFZlY3RvciBsb2dpY2FsIHJpZ2h0IHNoaWZ0IGZvciBzaWduZWQgc2hvcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmFsdWVzIHByb2R1Y2VzIGluY29ycmVjdCBKYXZhIHJlc3VsdCBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmVnYXRpdmUgZGF0YSBiZWNhdXNlIGphdmEgY29kZSBzaG91bGQgY29udmVydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhIHNob3J0IHZhbHVlIGludG8gaW50IHZhbHVlIHdpdGggc2lnbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleHRlbnNpb24gYmVmb3JlIGEgc2hpZnQuCiAgICAgY2FzZSBUX0lOVDogICAgcmV0dXJuIE9wX1VSU2hpZnRWSTsKICAgICB9CiAgICAgU2hvdWxkTm90UmVhY2hIZXJlKCk7CkBAIC0xNTcsMTIgKzE2MCwxNCBAQAogICByZXR1cm4gMDsgLy8gVW5pbXBsZW1lbnRlZAogfQogCisvLyBBbHNvIHVzZWQgdG8gY2hlY2sgaWYgdGhlIGNvZGUgZ2VuZXJhdG9yCisvLyBzdXBwb3J0cyB0aGUgdmVjdG9yIG9wZXJhdGlvbi4KIGJvb2wgVmVjdG9yTm9kZTo6aW1wbGVtZW50ZWQoaW50IG9wYywgdWludCB2bGVuLCBCYXNpY1R5cGUgYnQpIHsKICAgaWYgKGlzX2phdmFfcHJpbWl0aXZlKGJ0KSAmJgogICAgICAgKHZsZW4gPiAxKSAmJiBpc19wb3dlcl9vZl8yKHZsZW4pICYmCiAgICAgICBNYXRjaGVyOjp2ZWN0b3Jfc2l6ZV9zdXBwb3J0ZWQoYnQsIHZsZW4pKSB7CiAgICAgaW50IHZvcGMgPSBWZWN0b3JOb2RlOjpvcGNvZGUob3BjLCBidCk7Ci0gICAgcmV0dXJuIHZvcGMgPiAwICYmIE1hdGNoZXI6Omhhc19tYXRjaF9ydWxlKHZvcGMpOworICAgIHJldHVybiB2b3BjID4gMCAmJiBNYXRjaGVyOjptYXRjaF9ydWxlX3N1cHBvcnRlZCh2b3BjKTsKICAgfQogICByZXR1cm4gZmFsc2U7CiB9CmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9zaGFyZS92bS9wcmltcy91bnNhZmUuY3BwIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vcHJpbXMvdW5zYWZlLmNwcAppbmRleCAwNTFjODU5Li5lMzc1MGU2IDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9zaGFyZS92bS9wcmltcy91bnNhZmUuY3BwCisrKyBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL3ByaW1zL3Vuc2FmZS5jcHAKQEAgLTEyNCw2ICsxMjQsOCBAQAogICAgICAgYXNzZXJ0KCh2b2lkKilwLT5vYmpfZmllbGRfYWRkcjxvb3A+KChqaW50KWJ5dGVfb2Zmc2V0KSA9PSBwdHJfcGx1c19kaXNwLAogICAgICAgICAgICAgICJyYXcgW3B0citkaXNwXSBtdXN0IGJlIGNvbnNpc3RlbnQgd2l0aCBvb3A6OmZpZWxkX2Jhc2UiKTsKICAgICB9CisgICAgamxvbmcgcF9zaXplID0gSGVhcFdvcmRTaXplICogKGpsb25nKShwLT5zaXplKCkpOworICAgIGFzc2VydChieXRlX29mZnNldCA8IHBfc2l6ZSwgZXJyX21zZygiVW5zYWZlIGFjY2Vzczogb2Zmc2V0ICIgSU5UNjRfRk9STUFUICIgPiBvYmplY3QncyBzaXplICIgSU5UNjRfRk9STUFULCBieXRlX29mZnNldCwgcF9zaXplKSk7CiAgIH0KICNlbmRpZgogICBpZiAoc2l6ZW9mKGNoYXIqKSA9PSBzaXplb2YoamludCkpICAgIC8vICh0aGlzIGNvbnN0YW50IGZvbGRzISkKZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL3J1bnRpbWUvYXJndW1lbnRzLmNwcCBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL3J1bnRpbWUvYXJndW1lbnRzLmNwcAppbmRleCAzODY5ZjFmLi4xMmZiZGRjIDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9zaGFyZS92bS9ydW50aW1lL2FyZ3VtZW50cy5jcHAKKysrIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vcnVudGltZS9hcmd1bWVudHMuY3BwCkBAIC03OTEsNiArNzkxLDEwIEBACiAgICAgc3QtPnByaW50KCJqdm1fYXJnczogIik7IHByaW50X2p2bV9hcmdzX29uKHN0KTsKICAgfQogICBzdC0+cHJpbnRfY3IoImphdmFfY29tbWFuZDogJXMiLCBqYXZhX2NvbW1hbmQoKSA/IGphdmFfY29tbWFuZCgpIDogIjx1bmtub3duPiIpOworICBpZiAoX2phdmFfY2xhc3NfcGF0aCAhPSBOVUxMKSB7CisgICAgY2hhciogcGF0aCA9IF9qYXZhX2NsYXNzX3BhdGgtPnZhbHVlKCk7CisgICAgc3QtPnByaW50X2NyKCJqYXZhX2NsYXNzX3BhdGggKGluaXRpYWwpOiAlcyIsIHN0cmxlbihwYXRoKSA9PSAwID8gIjxub3Qgc2V0PiIgOiBwYXRoICk7CisgIH0KICAgc3QtPnByaW50X2NyKCJMYXVuY2hlciBUeXBlOiAlcyIsIF9zdW5famF2YV9sYXVuY2hlcik7CiB9CiAKQEAgLTg3Myw3ICs4NzcsNyBAQAogICBib29sIHJlc3VsdCAgICAgICAgID0gdHJ1ZTsKIAogICBpbnQgYyA9IGdldGMoc3RyZWFtKTsKLSAgd2hpbGUoYyAhPSBFT0YpIHsKKyAgd2hpbGUoYyAhPSBFT0YgJiYgcG9zIDwgKGludCkoc2l6ZW9mKHRva2VuKS0xKSkgewogICAgIGlmIChpbl93aGl0ZV9zcGFjZSkgewogICAgICAgaWYgKGluX2NvbW1lbnQpIHsKICAgICAgICAgaWYgKGMgPT0gJ1xuJykgaW5fY29tbWVudCA9IGZhbHNlOwpAQCAtMjc3MSw2ICsyNzc1LDExIEBACiAgICAgICAgIHJldHVybiBKTklfRUlOVkFMOwogICAgICAgfQogICAgICAgRkxBR19TRVRfQ01ETElORSh1aW50eCwgTWF4RGlyZWN0TWVtb3J5U2l6ZSwgbWF4X2RpcmVjdF9tZW1vcnlfc2l6ZSk7CisgICAgfSBlbHNlIGlmIChtYXRjaF9vcHRpb24ob3B0aW9uLCAiLVhYOitVc2VWTUludGVycnVwdGlibGVJTyIsICZ0YWlsKSkgeworICAgICAgLy8gTk9URSEgSW4gSkRLIDksIHRoZSBVc2VWTUludGVycnVwdGlibGVJTyBmbGFnIHdpbGwgY29tcGxldGVseSBnbworICAgICAgLy8gICAgICAgYXdheSBhbmQgd2lsbCBjYXVzZSBWTSBpbml0aWFsaXphdGlvbiBmYWlsdXJlcyEKKyAgICAgIHdhcm5pbmcoIi1YWDorVXNlVk1JbnRlcnJ1cHRpYmxlSU8gaXMgb2Jzb2xldGUgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSByZWxlYXNlLiIpOworICAgICAgRkxBR19TRVRfQ01ETElORShib29sLCBVc2VWTUludGVycnVwdGlibGVJTywgdHJ1ZSk7CiAgICAgfSBlbHNlIGlmIChtYXRjaF9vcHRpb24ob3B0aW9uLCAiLVhYOiIsICZ0YWlsKSkgeyAvLyAtWFg6eHh4eAogICAgICAgLy8gU2tpcCAtWFg6RmxhZ3M9IHNpbmNlIHRoYXQgY2FzZSBoYXMgYWxyZWFkeSBiZWVuIGhhbmRsZWQKICAgICAgIGlmIChzdHJuY21wKHRhaWwsICJGbGFncz0iLCBzdHJsZW4oIkZsYWdzPSIpKSAhPSAwKSB7CkBAIC0yNzg2LDEwICsyNzk1LDYgQEAKIAogICAvLyBDaGFuZ2UgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIGZsYWdzICB3aGljaCBoYXZlIGRpZmZlcmVudCBkZWZhdWx0IHZhbHVlcwogICAvLyB3aGVuIHdvcmtpbmcgd2l0aCBvbGRlciBKREtzLgotICBpZiAoSkRLX1ZlcnNpb246OmN1cnJlbnQoKS5jb21wYXJlX21ham9yKDYpIDw9IDAgJiYKLSAgICAgIEZMQUdfSVNfREVGQVVMVChVc2VWTUludGVycnVwdGlibGVJTykpIHsKLSAgICBGTEFHX1NFVF9ERUZBVUxUKFVzZVZNSW50ZXJydXB0aWJsZUlPLCB0cnVlKTsKLSAgfQogI2lmZGVmIExJTlVYCiAgaWYgKEpES19WZXJzaW9uOjpjdXJyZW50KCkuY29tcGFyZV9tYWpvcig2KSA8PSAwICYmCiAgICAgICBGTEFHX0lTX0RFRkFVTFQoVXNlTGludXhQb3NpeFRocmVhZENQVUNsb2NrcykpIHsKZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL3J1bnRpbWUvZ2xvYmFscy5ocHAgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9ydW50aW1lL2dsb2JhbHMuaHBwCmluZGV4IGU3ODM4ODMuLjM5ZTZhOTggMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL3J1bnRpbWUvZ2xvYmFscy5ocHAKKysrIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vcnVudGltZS9nbG9iYWxzLmhwcApAQCAtNTMzLDYgKzUzMyw5IEBACiAgIHByb2R1Y3QoaW50eCwgVXNlU1NFLCA5OSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICJIaWdoZXN0IHN1cHBvcnRlZCBTU0UgaW5zdHJ1Y3Rpb25zIHNldCBvbiB4ODYveDY0IikgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHByb2R1Y3QoYm9vbCwgVXNlQUVTLCBmYWxzZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAiQ29udHJvbCB3aGV0aGVyIEFFUyBpbnN0cnVjdGlvbnMgY2FuIGJlIHVzZWQgb24geDg2L3g2NCIpICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICBwcm9kdWN0KHVpbnR4LCBMYXJnZVBhZ2VTaXplSW5CeXRlcywgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAiTGFyZ2UgcGFnZSBzaXplICgwIHRvIGxldCBWTSBjaG9vc2UgdGhlIHBhZ2Ugc2l6ZSIpICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtNjM1LDYgKzYzOCw5IEBACiAgIHByb2R1Y3QoYm9vbCwgVXNlU1NFNDJJbnRyaW5zaWNzLCBmYWxzZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICJTU0U0LjIgdmVyc2lvbnMgb2YgaW50cmluc2ljcyIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHByb2R1Y3QoYm9vbCwgVXNlQUVTSW50cmluc2ljcywgZmFsc2UsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICJ1c2UgaW50cmluc2ljcyBmb3IgQUVTIHZlcnNpb25zIG9mIGNyeXB0byIpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIGRldmVsb3AoYm9vbCwgVHJhY2VDYWxsRml4dXAsIGZhbHNlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICJ0cmFjZXMgYWxsIGNhbGwgZml4dXBzIikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9zaGFyZS92bS9ydW50aW1lL2hhbmRsZXMuY3BwIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vcnVudGltZS9oYW5kbGVzLmNwcAppbmRleCBjYjUzMDg4Li5hMzdlNDZkIDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9zaGFyZS92bS9ydW50aW1lL2hhbmRsZXMuY3BwCisrKyBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL3J1bnRpbWUvaGFuZGxlcy5jcHAKQEAgLTE1OCwxMyArMTU4LDE4IEBACiAKICAgLy8gRGVsZXRlIGxhdGVyIGNodW5rcwogICBpZiggX2NodW5rLT5uZXh0KCkgKSB7CisgICAgLy8gcmVzZXQgYXJlbmEgc2l6ZSBiZWZvcmUgZGVsZXRlIGNodW5rcy4gT3RoZXJ3aXNlLCB0aGUgdG90YWwKKyAgICAvLyBhcmVuYSBzaXplIGNvdWxkIGV4Y2VlZCB0b3RhbCBjaHVuayBzaXplCisgICAgYXNzZXJ0KGFyZWEtPnNpemVfaW5fYnl0ZXMoKSA+IHNpemVfaW5fYnl0ZXMoKSwgIlNhbml0eSBjaGVjayIpOworICAgIGFyZWEtPnNldF9zaXplX2luX2J5dGVzKHNpemVfaW5fYnl0ZXMoKSk7CiAgICAgX2NodW5rLT5uZXh0X2Nob3AoKTsKKyAgfSBlbHNlIHsKKyAgICBhc3NlcnQoYXJlYS0+c2l6ZV9pbl9ieXRlcygpID09IHNpemVfaW5fYnl0ZXMoKSwgIlNhbml0eSBjaGVjayIpOwogICB9CiAgIC8vIFJvbGwgYmFjayBhcmVuYSB0byBzYXZlZCB0b3AgbWFya2VycwogICBhcmVhLT5fY2h1bmsgPSBfY2h1bms7CiAgIGFyZWEtPl9od20gPSBfaHdtOwogICBhcmVhLT5fbWF4ID0gX21heDsKLSAgYXJlYS0+c2V0X3NpemVfaW5fYnl0ZXMoX3NpemVfaW5fYnl0ZXMpOwogI2lmZGVmIEFTU0VSVAogICAvLyBjbGVhciBvdXQgZmlyc3QgY2h1bmsgKHRvIGRldGVjdCBhbGxvY2F0aW9uIGJ1Z3MpCiAgIGlmIChaYXBWTUhhbmRsZUFyZWEpIHsKZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL3J1bnRpbWUvaGFuZGxlcy5ocHAgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9ydW50aW1lL2hhbmRsZXMuaHBwCmluZGV4IGNhYjNkYzUuLjhjNjQzZDcgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL3J1bnRpbWUvaGFuZGxlcy5ocHAKKysrIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vcnVudGltZS9oYW5kbGVzLmhwcApAQCAtMjk3LDYgKzI5Nyw3IEBACiAgIHZvaWQgc2V0X3ByZXZpb3VzX2hhbmRsZV9tYXJrKEhhbmRsZU1hcmsqIG1hcmspIHsgX3ByZXZpb3VzX2hhbmRsZV9tYXJrID0gbWFyazsgfQogICBIYW5kbGVNYXJrKiBwcmV2aW91c19oYW5kbGVfbWFyaygpIGNvbnN0ICAgICAgICB7IHJldHVybiBfcHJldmlvdXNfaGFuZGxlX21hcms7IH0KIAorICBzaXplX3Qgc2l6ZV9pbl9ieXRlcygpIGNvbnN0IHsgcmV0dXJuIF9zaXplX2luX2J5dGVzOyB9CiAgcHVibGljOgogICBIYW5kbGVNYXJrKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlZSBoYW5kbGVzX2lubGluZS5ocHAKICAgSGFuZGxlTWFyayhUaHJlYWQqIHRocmVhZCkgICAgICAgICAgICAgICAgICAgICAgeyBpbml0aWFsaXplKHRocmVhZCk7IH0KZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL3J1bnRpbWUvaGFuZGxlcy5pbmxpbmUuaHBwIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vcnVudGltZS9oYW5kbGVzLmlubGluZS5ocHAKaW5kZXggOTZkZDk0Yy4uNTFjMzFmZiAxMDA2NDQKLS0tIGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vcnVudGltZS9oYW5kbGVzLmlubGluZS5ocHAKKysrIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vcnVudGltZS9oYW5kbGVzLmlubGluZS5ocHAKQEAgLTEzNiwxMyArMTM2LDE4IEBACiAgIEhhbmRsZUFyZWEqIGFyZWEgPSBfYXJlYTsgICAvLyBoZWxwIGNvbXBpbGVycyB3aXRoIHBvb3IgYWxpYXMgYW5hbHlzaXMKICAgLy8gRGVsZXRlIGxhdGVyIGNodW5rcwogICBpZiggX2NodW5rLT5uZXh0KCkgKSB7CisgICAgLy8gcmVzZXQgYXJlbmEgc2l6ZSBiZWZvcmUgZGVsZXRlIGNodW5rcy4gT3RoZXJ3aXNlLCB0aGUgdG90YWwKKyAgICAvLyBhcmVuYSBzaXplIGNvdWxkIGV4Y2VlZCB0b3RhbCBjaHVuayBzaXplCisgICAgYXNzZXJ0KGFyZWEtPnNpemVfaW5fYnl0ZXMoKSA+IHNpemVfaW5fYnl0ZXMoKSwgIlNhbml0eSBjaGVjayIpOworICAgIGFyZWEtPnNldF9zaXplX2luX2J5dGVzKHNpemVfaW5fYnl0ZXMoKSk7CiAgICAgX2NodW5rLT5uZXh0X2Nob3AoKTsKKyAgfSBlbHNlIHsKKyAgICBhc3NlcnQoYXJlYS0+c2l6ZV9pbl9ieXRlcygpID09IHNpemVfaW5fYnl0ZXMoKSwgIlNhbml0eSBjaGVjayIpOwogICB9CiAgIC8vIFJvbGwgYmFjayBhcmVuYSB0byBzYXZlZCB0b3AgbWFya2VycwogICBhcmVhLT5fY2h1bmsgPSBfY2h1bms7CiAgIGFyZWEtPl9od20gPSBfaHdtOwogICBhcmVhLT5fbWF4ID0gX21heDsKLSAgYXJlYS0+c2V0X3NpemVfaW5fYnl0ZXMoX3NpemVfaW5fYnl0ZXMpOwogICBkZWJ1Z19vbmx5KGFyZWEtPl9oYW5kbGVfbWFya19uZXN0aW5nLS0pOwogfQogCmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9zaGFyZS92bS9ydW50aW1lL29zLmNwcCBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL3J1bnRpbWUvb3MuY3BwCmluZGV4IDU1MGU2NGEuLjU2YmQ4MjYgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL3J1bnRpbWUvb3MuY3BwCisrKyBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL3J1bnRpbWUvb3MuY3BwCkBAIC02MDAsOSArNjAwLDcgQEAKICAgaWYgKFByaW50TWFsbG9jICYmIHR0eSAhPSBOVUxMKSB0dHktPnByaW50X2NyKCJvczo6bWFsbG9jICIgU0laRV9GT1JNQVQgIiBieXRlcyAtLT4gIiBQVFJfRk9STUFULCBzaXplLCBtZW1ibG9jayk7CiAKICAgLy8gd2UgZG8gbm90IHRyYWNrIE1hbGxvY0N1c2hpb24gbWVtb3J5Ci0gIGlmIChNZW1UcmFja2VyOjppc19vbigpKSB7CiAgICAgTWVtVHJhY2tlcjo6cmVjb3JkX21hbGxvYygoYWRkcmVzcyltZW1ibG9jaywgc2l6ZSwgbWVtZmxhZ3MsIGNhbGxlciA9PSAwID8gQ0FMTEVSX1BDIDogY2FsbGVyKTsKLSAgfQogCiAgIHJldHVybiBtZW1ibG9jazsKIH0KQEAgLTYxMyw3ICs2MTEsNyBAQAogICBOT1RfUFJPRFVDVChpbmNfc3RhdF9jb3VudGVyKCZudW1fbWFsbG9jcywgMSkpOwogICBOT1RfUFJPRFVDVChpbmNfc3RhdF9jb3VudGVyKCZhbGxvY19ieXRlcywgc2l6ZSkpOwogICB2b2lkKiBwdHIgPSA6OnJlYWxsb2MobWVtYmxvY2ssIHNpemUpOwotICBpZiAocHRyICE9IE5VTEwgJiYgTWVtVHJhY2tlcjo6aXNfb24oKSkgeworICBpZiAocHRyICE9IE5VTEwpIHsKICAgICBNZW1UcmFja2VyOjpyZWNvcmRfcmVhbGxvYygoYWRkcmVzcyltZW1ibG9jaywgKGFkZHJlc3MpcHRyLCBzaXplLCBtZW1mbGFncywKICAgICAgY2FsbGVyID09IDAgPyBDQUxMRVJfUEMgOiBjYWxsZXIpOwogICB9CkBAIC0xNDAxLDcgKzEzOTksNyBAQAogCiBjaGFyKiBvczo6cmVzZXJ2ZV9tZW1vcnkoc2l6ZV90IGJ5dGVzLCBjaGFyKiBhZGRyLCBzaXplX3QgYWxpZ25tZW50X2hpbnQpIHsKICAgY2hhciogcmVzdWx0ID0gcGRfcmVzZXJ2ZV9tZW1vcnkoYnl0ZXMsIGFkZHIsIGFsaWdubWVudF9oaW50KTsKLSAgaWYgKHJlc3VsdCAhPSBOVUxMICYmIE1lbVRyYWNrZXI6OmlzX29uKCkpIHsKKyAgaWYgKHJlc3VsdCAhPSBOVUxMKSB7CiAgICAgTWVtVHJhY2tlcjo6cmVjb3JkX3ZpcnR1YWxfbWVtb3J5X3Jlc2VydmUoKGFkZHJlc3MpcmVzdWx0LCBieXRlcywgQ0FMTEVSX1BDKTsKICAgfQogCkBAIC0xNDA5LDcgKzE0MDcsNyBAQAogfQogY2hhciogb3M6OmF0dGVtcHRfcmVzZXJ2ZV9tZW1vcnlfYXQoc2l6ZV90IGJ5dGVzLCBjaGFyKiBhZGRyKSB7CiAgIGNoYXIqIHJlc3VsdCA9IHBkX2F0dGVtcHRfcmVzZXJ2ZV9tZW1vcnlfYXQoYnl0ZXMsIGFkZHIpOwotICBpZiAocmVzdWx0ICE9IE5VTEwgJiYgTWVtVHJhY2tlcjo6aXNfb24oKSkgeworICBpZiAocmVzdWx0ICE9IE5VTEwpIHsKICAgICBNZW1UcmFja2VyOjpyZWNvcmRfdmlydHVhbF9tZW1vcnlfcmVzZXJ2ZSgoYWRkcmVzcylyZXN1bHQsIGJ5dGVzLCBDQUxMRVJfUEMpOwogICB9CiAgIHJldHVybiByZXN1bHQ7CkBAIC0xNDIyLDcgKzE0MjAsNyBAQAogCiBib29sIG9zOjpjb21taXRfbWVtb3J5KGNoYXIqIGFkZHIsIHNpemVfdCBieXRlcywgYm9vbCBleGVjdXRhYmxlKSB7CiAgIGJvb2wgcmVzID0gcGRfY29tbWl0X21lbW9yeShhZGRyLCBieXRlcywgZXhlY3V0YWJsZSk7Ci0gIGlmIChyZXMgJiYgTWVtVHJhY2tlcjo6aXNfb24oKSkgeworICBpZiAocmVzKSB7CiAgICAgTWVtVHJhY2tlcjo6cmVjb3JkX3ZpcnR1YWxfbWVtb3J5X2NvbW1pdCgoYWRkcmVzcylhZGRyLCBieXRlcywgQ0FMTEVSX1BDKTsKICAgfQogICByZXR1cm4gcmVzOwpAQCAtMTQzMSw3ICsxNDI5LDcgQEAKIGJvb2wgb3M6OmNvbW1pdF9tZW1vcnkoY2hhciogYWRkciwgc2l6ZV90IHNpemUsIHNpemVfdCBhbGlnbm1lbnRfaGludCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZXhlY3V0YWJsZSkgewogICBib29sIHJlcyA9IG9zOjpwZF9jb21taXRfbWVtb3J5KGFkZHIsIHNpemUsIGFsaWdubWVudF9oaW50LCBleGVjdXRhYmxlKTsKLSAgaWYgKHJlcyAmJiBNZW1UcmFja2VyOjppc19vbigpKSB7CisgIGlmIChyZXMpIHsKICAgICBNZW1UcmFja2VyOjpyZWNvcmRfdmlydHVhbF9tZW1vcnlfY29tbWl0KChhZGRyZXNzKWFkZHIsIHNpemUsIENBTExFUl9QQyk7CiAgIH0KICAgcmV0dXJuIHJlczsKQEAgLTE0NTgsOCArMTQ1Niw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICphZGRyLCBzaXplX3QgYnl0ZXMsIGJvb2wgcmVhZF9vbmx5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhbGxvd19leGVjKSB7CiAgIGNoYXIqIHJlc3VsdCA9IHBkX21hcF9tZW1vcnkoZmQsIGZpbGVfbmFtZSwgZmlsZV9vZmZzZXQsIGFkZHIsIGJ5dGVzLCByZWFkX29ubHksIGFsbG93X2V4ZWMpOwotICBpZiAocmVzdWx0ICE9IE5VTEwgJiYgTWVtVHJhY2tlcjo6aXNfb24oKSkgeworICBpZiAocmVzdWx0ICE9IE5VTEwpIHsKICAgICBNZW1UcmFja2VyOjpyZWNvcmRfdmlydHVhbF9tZW1vcnlfcmVzZXJ2ZSgoYWRkcmVzcylyZXN1bHQsIGJ5dGVzLCBDQUxMRVJfUEMpOworICAgIE1lbVRyYWNrZXI6OnJlY29yZF92aXJ0dWFsX21lbW9yeV9jb21taXQoKGFkZHJlc3MpcmVzdWx0LCBieXRlcywgQ0FMTEVSX1BDKTsKICAgfQogICByZXR1cm4gcmVzdWx0OwogfQpAQCAtMTQ3NCw2ICsxNDczLDcgQEAKIGJvb2wgb3M6OnVubWFwX21lbW9yeShjaGFyICphZGRyLCBzaXplX3QgYnl0ZXMpIHsKICAgYm9vbCByZXN1bHQgPSBwZF91bm1hcF9tZW1vcnkoYWRkciwgYnl0ZXMpOwogICBpZiAocmVzdWx0KSB7CisgICAgTWVtVHJhY2tlcjo6cmVjb3JkX3ZpcnR1YWxfbWVtb3J5X3VuY29tbWl0KChhZGRyZXNzKWFkZHIsIGJ5dGVzKTsKICAgICBNZW1UcmFja2VyOjpyZWNvcmRfdmlydHVhbF9tZW1vcnlfcmVsZWFzZSgoYWRkcmVzcylhZGRyLCBieXRlcyk7CiAgIH0KICAgcmV0dXJuIHJlc3VsdDsKZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL3J1bnRpbWUvc3R1YlJvdXRpbmVzLmNwcCBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL3J1bnRpbWUvc3R1YlJvdXRpbmVzLmNwcAppbmRleCA1Y2E0YmE1Li45OGQ0MjhhIDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9zaGFyZS92bS9ydW50aW1lL3N0dWJSb3V0aW5lcy5jcHAKKysrIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vcnVudGltZS9zdHViUm91dGluZXMuY3BwCkBAIC0xMjAsNiArMTIwLDEwIEBACiBhZGRyZXNzIFN0dWJSb3V0aW5lczo6X2FycmF5b2ZfanNob3J0X2ZpbGw7CiBhZGRyZXNzIFN0dWJSb3V0aW5lczo6X2FycmF5b2ZfamludF9maWxsOwogCithZGRyZXNzIFN0dWJSb3V0aW5lczo6X2Flc2NyeXB0X2VuY3J5cHRCbG9jayAgICAgICAgICAgICAgID0gTlVMTDsKK2FkZHJlc3MgU3R1YlJvdXRpbmVzOjpfYWVzY3J5cHRfZGVjcnlwdEJsb2NrICAgICAgICAgICAgICAgPSBOVUxMOworYWRkcmVzcyBTdHViUm91dGluZXM6Ol9jaXBoZXJCbG9ja0NoYWluaW5nX2VuY3J5cHRBRVNDcnlwdCA9IE5VTEw7CithZGRyZXNzIFN0dWJSb3V0aW5lczo6X2NpcGhlckJsb2NrQ2hhaW5pbmdfZGVjcnlwdEFFU0NyeXB0ID0gTlVMTDsKIAogZG91YmxlICgqIFN0dWJSb3V0aW5lczo6X2ludHJpbnNpY19sb2cgICApKGRvdWJsZSkgPSBOVUxMOwogZG91YmxlICgqIFN0dWJSb3V0aW5lczo6X2ludHJpbnNpY19sb2cxMCApKGRvdWJsZSkgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vcnVudGltZS9zdHViUm91dGluZXMuaHBwIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vcnVudGltZS9zdHViUm91dGluZXMuaHBwCmluZGV4IDBlNTgzYWUuLjkxZjI3M2UgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL3J1bnRpbWUvc3R1YlJvdXRpbmVzLmhwcAorKysgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9ydW50aW1lL3N0dWJSb3V0aW5lcy5ocHAKQEAgLTE5OSw2ICsxOTksMTEgQEAKICAgLy8gemVybyBoZWFwIHNwYWNlIGFsaWduZWQgdG8gamxvbmcgKDggYnl0ZXMpCiAgIHN0YXRpYyBhZGRyZXNzIF96ZXJvX2FsaWduZWRfd29yZHM7CiAKKyAgc3RhdGljIGFkZHJlc3MgX2Flc2NyeXB0X2VuY3J5cHRCbG9jazsKKyAgc3RhdGljIGFkZHJlc3MgX2Flc2NyeXB0X2RlY3J5cHRCbG9jazsKKyAgc3RhdGljIGFkZHJlc3MgX2NpcGhlckJsb2NrQ2hhaW5pbmdfZW5jcnlwdEFFU0NyeXB0OworICBzdGF0aWMgYWRkcmVzcyBfY2lwaGVyQmxvY2tDaGFpbmluZ19kZWNyeXB0QUVTQ3J5cHQ7CisKICAgLy8gVGhlc2UgYXJlIHZlcnNpb25zIG9mIHRoZSBqYXZhLmxhbmcuTWF0aCBtZXRob2RzIHdoaWNoIHBlcmZvcm0KICAgLy8gdGhlIHNhbWUgb3BlcmF0aW9ucyBhcyB0aGUgaW50cmluc2ljIHZlcnNpb24uICBUaGV5IGFyZSB1c2VkIGZvcgogICAvLyBjb25zdGFudCBmb2xkaW5nIGluIHRoZSBjb21waWxlciB0byBlbnN1cmUgZXF1aXZhbGVuY2UuICBJZiB0aGUKQEAgLTMzMCw2ICszMzUsMTEgQEAKICAgc3RhdGljIGFkZHJlc3MgYXJyYXlvZl9qc2hvcnRfZmlsbCgpIHsgcmV0dXJuIF9hcnJheW9mX2pzaG9ydF9maWxsOyB9CiAgIHN0YXRpYyBhZGRyZXNzIGFycmF5b2ZfamludF9maWxsKCkgICB7IHJldHVybiBfYXJyYXlvZl9qaW50X2ZpbGw7IH0KIAorICBzdGF0aWMgYWRkcmVzcyBhZXNjcnlwdF9lbmNyeXB0QmxvY2soKSAgICAgICAgICAgICAgICB7IHJldHVybiBfYWVzY3J5cHRfZW5jcnlwdEJsb2NrOyB9CisgIHN0YXRpYyBhZGRyZXNzIGFlc2NyeXB0X2RlY3J5cHRCbG9jaygpICAgICAgICAgICAgICAgIHsgcmV0dXJuIF9hZXNjcnlwdF9kZWNyeXB0QmxvY2s7IH0KKyAgc3RhdGljIGFkZHJlc3MgY2lwaGVyQmxvY2tDaGFpbmluZ19lbmNyeXB0QUVTQ3J5cHQoKSAgeyByZXR1cm4gX2NpcGhlckJsb2NrQ2hhaW5pbmdfZW5jcnlwdEFFU0NyeXB0OyB9CisgIHN0YXRpYyBhZGRyZXNzIGNpcGhlckJsb2NrQ2hhaW5pbmdfZGVjcnlwdEFFU0NyeXB0KCkgIHsgcmV0dXJuIF9jaXBoZXJCbG9ja0NoYWluaW5nX2RlY3J5cHRBRVNDcnlwdDsgfQorCiAgIHN0YXRpYyBhZGRyZXNzIHNlbGVjdF9maWxsX2Z1bmN0aW9uKEJhc2ljVHlwZSB0LCBib29sIGFsaWduZWQsIGNvbnN0IGNoYXIqICZuYW1lKTsKIAogICBzdGF0aWMgYWRkcmVzcyB6ZXJvX2FsaWduZWRfd29yZHMoKSAgIHsgcmV0dXJuIF96ZXJvX2FsaWduZWRfd29yZHM7IH0KZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL3J1bnRpbWUvdGhyZWFkLmNwcCBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL3J1bnRpbWUvdGhyZWFkLmNwcAppbmRleCAwZWQ5YTRiLi41Yzk2MjI0IDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9zaGFyZS92bS9ydW50aW1lL3RocmVhZC5jcHAKKysrIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vcnVudGltZS90aHJlYWQuY3BwCkBAIC0zMjMsMTIgKzMyMywxMCBAQAogICBvczo6aW5pdGlhbGl6ZV90aHJlYWQodGhpcyk7CiAKICNpZiBJTkNMVURFX05NVAotICAgLy8gcmVjb3JkIHRocmVhZCdzIG5hdGl2ZSBzdGFjaywgc3RhY2sgZ3Jvd3MgZG93bndhcmQKLSAgaWYgKE1lbVRyYWNrZXI6OmlzX29uKCkpIHsKLSAgICBhZGRyZXNzIHN0YWNrX2xvd19hZGRyID0gc3RhY2tfYmFzZSgpIC0gc3RhY2tfc2l6ZSgpOwotICAgIE1lbVRyYWNrZXI6OnJlY29yZF90aHJlYWRfc3RhY2soc3RhY2tfbG93X2FkZHIsIHN0YWNrX3NpemUoKSwgdGhpcywKKyAgLy8gcmVjb3JkIHRocmVhZCdzIG5hdGl2ZSBzdGFjaywgc3RhY2sgZ3Jvd3MgZG93bndhcmQKKyAgYWRkcmVzcyBzdGFja19sb3dfYWRkciA9IHN0YWNrX2Jhc2UoKSAtIHN0YWNrX3NpemUoKTsKKyAgTWVtVHJhY2tlcjo6cmVjb3JkX3RocmVhZF9zdGFjayhzdGFja19sb3dfYWRkciwgc3RhY2tfc2l6ZSgpLCB0aGlzLAogICAgICAgQ1VSUkVOVF9QQyk7Ci0gIH0KICNlbmRpZiAvLyBJTkNMVURFX05NVAogfQogCkBAIC0zNDUsNiArMzQzLDkgQEAKICAgaWYgKF9zdGFja19iYXNlICE9IE5VTEwpIHsKICAgICBhZGRyZXNzIGxvd19zdGFja19hZGRyID0gc3RhY2tfYmFzZSgpIC0gc3RhY2tfc2l6ZSgpOwogICAgIE1lbVRyYWNrZXI6OnJlbGVhc2VfdGhyZWFkX3N0YWNrKGxvd19zdGFja19hZGRyLCBzdGFja19zaXplKCksIHRoaXMpOworI2lmZGVmIEFTU0VSVAorICAgIHNldF9zdGFja19iYXNlKE5VTEwpOworI2VuZGlmCiAgIH0KICNlbmRpZiAvLyBJTkNMVURFX05NVAogCkBAIC0xNTIxLDEwICsxNTIyLDEyIEBACiAgICAgICB0dHktPnByaW50X2NyKCJ0ZXJtaW5hdGUgdGhyZWFkICVwIiwgdGhpcyk7CiAgIH0KIAotICAvLyBJbmZvIE5NVCB0aGF0IHRoaXMgSmF2YVRocmVhZCBpcyBleGl0aW5nLCBpdHMgbWVtb3J5Ci0gIC8vIHJlY29yZGVyIHNob3VsZCBiZSBjb2xsZWN0ZWQKKyAgLy8gQnkgbm93LCB0aGlzIHRocmVhZCBzaG91bGQgYWxyZWFkeSBiZSBpbnZpc2libGUgdG8gc2FmZXBvaW50LAorICAvLyBhbmQgaXRzIHBlci10aHJlYWQgcmVjb3JkZXIgYWxzbyBjb2xsZWN0ZWQuCiAgIGFzc2VydCghaXNfc2FmZXBvaW50X3Zpc2libGUoKSwgIndyb25nIHN0YXRlIik7Ci0gIE1lbVRyYWNrZXI6OnRocmVhZF9leGl0aW5nKHRoaXMpOworI2lmIElOQ0xVREVfTk1UCisgIGFzc2VydChnZXRfcmVjb3JkZXIoKSA9PSBOVUxMLCAiQWxyZWFkeSBjb2xsZWN0ZWQiKTsKKyNlbmRpZiAvLyBJTkNMVURFX05NVAogCiAgIC8vIEpTUjE2NiAtLSByZXR1cm4gdGhlIHBhcmtlciB0byB0aGUgZnJlZSBsaXN0CiAgIFBhcmtlcjo6UmVsZWFzZShfcGFya2VyKTsKQEAgLTI0MjUsNiArMjQyOCw3IEBACiB9CiAKIHZvaWQgSmF2YVRocmVhZDo6cmVtb3ZlX3N0YWNrX2d1YXJkX3BhZ2VzKCkgeworICBhc3NlcnQoVGhyZWFkOjpjdXJyZW50KCkgPT0gdGhpcywgImZyb20gZGlmZmVyZW50IHRocmVhZCIpOwogICBpZiAoX3N0YWNrX2d1YXJkX3N0YXRlID09IHN0YWNrX2d1YXJkX3VudXNlZCkgcmV0dXJuOwogICBhZGRyZXNzIGxvd19hZGRyID0gc3RhY2tfYmFzZSgpIC0gc3RhY2tfc2l6ZSgpOwogICBzaXplX3QgbGVuID0gKFN0YWNrWWVsbG93UGFnZXMgKyBTdGFja1JlZFBhZ2VzKSAqIG9zOjp2bV9wYWdlX3NpemUoKTsKQEAgLTQwOTMsNyArNDA5NywxMCBAQAogCiAgICAgLy8gTm93LCB0aGlzIHRocmVhZCBpcyBub3QgdmlzaWJsZSB0byBzYWZlcG9pbnQKICAgICBwLT5zZXRfc2FmZXBvaW50X3Zpc2libGUoZmFsc2UpOwotCisgICAgLy8gb25jZSB0aGUgdGhyZWFkIGJlY29tZXMgc2FmZXBvaW50IGludmlzaWJsZSwgd2UgY2FuIG5vdCB1c2UgaXRzIHBlci10aHJlYWQKKyAgICAvLyByZWNvcmRlci4gQW5kIFRocmVhZHM6OmRvX3RocmVhZHMoKSBubyBsb25nZXIgd2Fsa3MgdGhpcyB0aHJlYWQsIHNvIHdlIGhhdmUKKyAgICAvLyB0byByZWxlYXNlIGl0cyBwZXItdGhyZWFkIHJlY29yZGVyIGhlcmUuCisgICAgTWVtVHJhY2tlcjo6dGhyZWFkX2V4aXRpbmcocCk7CiAgIH0gLy8gdW5sb2NrIFRocmVhZHNfbG9jawogCiAgIC8vIFNpbmNlIEV2ZW50czo6bG9nIHVzZXMgYSBsb2NrLCB3ZSBncmFiIGl0IG91dHNpZGUgdGhlIFRocmVhZHNfbG9jawpkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vcnVudGltZS92bVN0cnVjdHMuY3BwIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vcnVudGltZS92bVN0cnVjdHMuY3BwCmluZGV4IDUxZTNhYjVmLi45MTU5YWQ5IDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9zaGFyZS92bS9ydW50aW1lL3ZtU3RydWN0cy5jcHAKKysrIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vcnVudGltZS92bVN0cnVjdHMuY3BwCkBAIC01OSw2ICs1OSw3IEBACiAjaW5jbHVkZSAibWVtb3J5L2dlbmVyYXRpb24uaHBwIgogI2luY2x1ZGUgIm1lbW9yeS9nZW5lcmF0aW9uU3BlYy5ocHAiCiAjaW5jbHVkZSAibWVtb3J5L2hlYXAuaHBwIgorI2luY2x1ZGUgIm1lbW9yeS9tZXRhYmxvY2suaHBwIgogI2luY2x1ZGUgIm1lbW9yeS9zcGFjZS5ocHAiCiAjaW5jbHVkZSAibWVtb3J5L3RlbnVyZWRHZW5lcmF0aW9uLmhwcCIKICNpbmNsdWRlICJtZW1vcnkvdW5pdmVyc2UuaHBwIgpAQCAtMjQ5LDYgKzI1MCw3IEBACiB0eXBlZGVmIEhhc2h0YWJsZTxLbGFzcyosIG10Q2xhc3M+ICAgICAgICAgICAgS2xhc3NIYXNodGFibGU7CiB0eXBlZGVmIEhhc2h0YWJsZUVudHJ5PEtsYXNzKiwgbXRDbGFzcz4gICAgICAgS2xhc3NIYXNodGFibGVFbnRyeTsKIHR5cGVkZWYgVHdvT29wSGFzaHRhYmxlPFN5bWJvbCosIG10Q2xhc3M+ICAgICBTeW1ib2xUd29Pb3BIYXNodGFibGU7Cit0eXBlZGVmIEJpbmFyeVRyZWVEaWN0aW9uYXJ5PE1ldGFibG9jaywgRnJlZUxpc3Q+IE1ldGFibG9ja1RyZWVEaWN0aW9uYXJ5OwogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBWTV9TVFJVQ1RTCkBAIC0xMjM3LDcgKzEyMzksMTUgQEAKICAgbm9uc3RhdGljX2ZpZWxkKEFjY2Vzc0ZsYWdzLCAgICAgICAgICAgICAgICAgX2ZsYWdzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGppbnQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIG5vbnN0YXRpY19maWVsZChlbGFwc2VkVGltZXIsICAgICAgICAgICAgICAgIF9jb3VudGVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbG9uZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICBub25zdGF0aWNfZmllbGQoZWxhcHNlZFRpbWVyLCAgICAgICAgICAgICAgICBfYWN0aXZlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgbm9uc3RhdGljX2ZpZWxkKEludm9jYXRpb25Db3VudGVyLCAgICAgICAgICAgX2NvdW50ZXIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCkKKyAgbm9uc3RhdGljX2ZpZWxkKEludm9jYXRpb25Db3VudGVyLCAgICAgICAgICAgX2NvdW50ZXIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZvbGF0aWxlX25vbnN0YXRpY19maWVsZChGcmVlQ2h1bmssICAgICAgICAgIF9zaXplLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBub25zdGF0aWNfZmllbGQoRnJlZUNodW5rLCAgICAgICAgICAgICAgICAgICBfbmV4dCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJlZUNodW5rKikgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgbm9uc3RhdGljX2ZpZWxkKEZyZWVDaHVuaywgICAgICAgICAgICAgICAgICAgX3ByZXYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyZWVDaHVuayopICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG5vbnN0YXRpY19maWVsZChGcmVlTGlzdDxGcmVlQ2h1bms+LCAgICAgICAgIF9zaXplLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBub25zdGF0aWNfZmllbGQoRnJlZUxpc3Q8TWV0YWJsb2NrPiwgICAgICAgICBfc2l6ZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgbm9uc3RhdGljX2ZpZWxkKEZyZWVMaXN0PEZyZWVDaHVuaz4sICAgICAgICAgX2NvdW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzaXplX3QpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG5vbnN0YXRpY19maWVsZChGcmVlTGlzdDxNZXRhYmxvY2s+LCAgICAgICAgIF9jb3VudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2l6ZV90KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBub25zdGF0aWNfZmllbGQoTWV0YWJsb2NrVHJlZURpY3Rpb25hcnksICAgICBfdG90YWxfc2l6ZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KQogCiAgIC8qIE5PVEUgdGhhdCB3ZSBkbyBub3QgdXNlIHRoZSBsYXN0X2VudHJ5KCkgbWFjcm8gaGVyZTsgaXQgaXMgdXNlZCAgKi8KICAgLyogaW4gdm1TdHJ1Y3RzXzxvcz5fPGNwdT4uaHBwJ3MgVk1fU1RSVUNUU19PU19DUFUgbWFjcm8gKGFuZCBtdXN0ICAqLwpAQCAtMjA4MCw3ICsyMDkwLDI0IEBACiAgIGRlY2xhcmVfdG9wbGV2ZWxfdHlwZShVbml2ZXJzZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgZGVjbGFyZV90b3BsZXZlbF90eXBlKHZmcmFtZUFycmF5KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICBkZWNsYXJlX3RvcGxldmVsX3R5cGUodmZyYW1lQXJyYXlFbGVtZW50KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGRlY2xhcmVfdG9wbGV2ZWxfdHlwZShBbm5vdGF0aW9ucyopCisgIGRlY2xhcmVfdG9wbGV2ZWxfdHlwZShBbm5vdGF0aW9ucyopICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAvKioqKioqKioqKioqKioqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIC8qIE1pc2NlbGxhbmVvdXMgdHlwZXMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgLyoqKioqKioqKioqKioqKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIC8qIGZyZWVsaXN0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZGVjbGFyZV90b3BsZXZlbF90eXBlKEZyZWVDaHVuayopICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkZWNsYXJlX3RvcGxldmVsX3R5cGUoTWV0YWJsb2NrKikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRlY2xhcmVfdG9wbGV2ZWxfdHlwZShGcmVlQmxvY2tEaWN0aW9uYXJ5PEZyZWVDaHVuaz4qKSAgICAgICAgICAgICAgICAgIFwKKyAgZGVjbGFyZV90b3BsZXZlbF90eXBlKEZyZWVMaXN0PEZyZWVDaHVuaz4qKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkZWNsYXJlX3RvcGxldmVsX3R5cGUoRnJlZUxpc3Q8RnJlZUNodW5rPikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRlY2xhcmVfdG9wbGV2ZWxfdHlwZShGcmVlQmxvY2tEaWN0aW9uYXJ5PE1ldGFibG9jaz4qKSAgICAgICAgICAgICAgICAgIFwKKyAgZGVjbGFyZV90b3BsZXZlbF90eXBlKEZyZWVMaXN0PE1ldGFibG9jaz4qKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkZWNsYXJlX3RvcGxldmVsX3R5cGUoRnJlZUxpc3Q8TWV0YWJsb2NrPikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRlY2xhcmVfdG9wbGV2ZWxfdHlwZShNZXRhYmxvY2tUcmVlRGljdGlvbmFyeSopICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZGVjbGFyZV90eXBlKE1ldGFibG9ja1RyZWVEaWN0aW9uYXJ5LCBGcmVlQmxvY2tEaWN0aW9uYXJ5PE1ldGFibG9jaz4pICAgXAorICAgICAgICAgICAgICBkZWNsYXJlX3R5cGUoTWV0YWJsb2NrVHJlZURpY3Rpb25hcnksIEZyZWVCbG9ja0RpY3Rpb25hcnk8TWV0YWJsb2NrPikKIAogCiAgIC8qIE5PVEUgdGhhdCB3ZSBkbyBub3QgdXNlIHRoZSBsYXN0X2VudHJ5KCkgbWFjcm8gaGVyZTsgaXQgaXMgdXNlZCAgKi8KZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL3NlcnZpY2VzL2F0dGFjaExpc3RlbmVyLmNwcCBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL3NlcnZpY2VzL2F0dGFjaExpc3RlbmVyLmNwcAppbmRleCA5ODNmM2Y5Li44MGRmZDdlIDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9zaGFyZS92bS9zZXJ2aWNlcy9hdHRhY2hMaXN0ZW5lci5jcHAKKysrIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vc2VydmljZXMvYXR0YWNoTGlzdGVuZXIuY3BwCkBAIC00MDQsNiArNDA0LDggQEAKIHN0YXRpYyB2b2lkIGF0dGFjaF9saXN0ZW5lcl90aHJlYWRfZW50cnkoSmF2YVRocmVhZCogdGhyZWFkLCBUUkFQUykgewogICBvczo6c2V0X3ByaW9yaXR5KHRocmVhZCwgTmVhck1heFByaW9yaXR5KTsKIAorICB0aHJlYWQtPnJlY29yZF9zdGFja19iYXNlX2FuZF9zaXplKCk7CisKICAgaWYgKEF0dGFjaExpc3RlbmVyOjpwZF9pbml0KCkgIT0gMCkgewogICAgIHJldHVybjsKICAgfQpkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vc2VydmljZXMvbWVtQmFzZWxpbmUuY3BwIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vc2VydmljZXMvbWVtQmFzZWxpbmUuY3BwCmluZGV4IDViODI5NzUuLjU3YmRiMDEgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL3NlcnZpY2VzL21lbUJhc2VsaW5lLmNwcAorKysgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9zZXJ2aWNlcy9tZW1CYXNlbGluZS5jcHAKQEAgLTQwLDYgKzQwLDcgQEAKICAge210U3ltYm9sLCAgICAgIlN5bWJvbCJ9LAogICB7bXROTVQsICAgICAgICAiTWVtb3J5IFRyYWNraW5nIn0sCiAgIHttdENodW5rLCAgICAgICJQb29sZWQgRnJlZSBDaHVua3MifSwKKyAge210Q2xhc3NTaGFyZWQsIlNoYXJlZCBzcGFjZXMgZm9yIGNsYXNzZXMifSwKICAge210Tm9uZSwgICAgICAgIlVua25vd24ifSAgLy8gSXQgY2FuIGhhcHBlbiB3aGVuIHR5cGUgdGFnZ2luZyByZWNvcmRzIGFyZSBsYWdnaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlaGluZAogfTsKQEAgLTU1LDYgKzU2LDcgQEAKIAogICBfbWFsbG9jX2NzID0gTlVMTDsKICAgX3ZtX2NzID0gTlVMTDsKKyAgX3ZtX21hcCA9IE5VTEw7CiAKICAgX251bWJlcl9vZl9jbGFzc2VzID0gMDsKICAgX251bWJlcl9vZl90aHJlYWRzID0gMDsKQEAgLTcyLDYgKzc0LDExIEBACiAgICAgX3ZtX2NzID0gTlVMTDsKICAgfQogCisgIGlmIChfdm1fbWFwICE9IE5VTEwpIHsKKyAgICBkZWxldGUgX3ZtX21hcDsKKyAgICBfdm1fbWFwID0gTlVMTDsKKyAgfQorCiAgIHJlc2V0KCk7CiB9CiAKQEAgLTg1LDYgKzkyLDcgQEAKIAogICBpZiAoX21hbGxvY19jcyAhPSBOVUxMKSBfbWFsbG9jX2NzLT5jbGVhcigpOwogICBpZiAoX3ZtX2NzICE9IE5VTEwpIF92bV9jcy0+Y2xlYXIoKTsKKyAgaWYgKF92bV9tYXAgIT0gTlVMTCkgX3ZtX21hcC0+Y2xlYXIoKTsKIAogICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgTlVNQkVSX09GX01FTU9SWV9UWVBFOyBpbmRleCArKykgewogICAgIF9tYWxsb2NfZGF0YVtpbmRleF0uY2xlYXIoKTsKQEAgLTk0LDM5ICsxMDIsMzMgQEAKIH0KIAogTWVtQmFzZWxpbmU6On5NZW1CYXNlbGluZSgpIHsKLSAgaWYgKF9tYWxsb2NfY3MgIT0gTlVMTCkgewotICAgIGRlbGV0ZSBfbWFsbG9jX2NzOwotICB9Ci0KLSAgaWYgKF92bV9jcyAhPSBOVUxMKSB7Ci0gICAgZGVsZXRlIF92bV9jczsKLSAgfQorICBjbGVhcigpOwogfQogCiAvLyBiYXNlbGluZSBtYWxsb2MnZCBtZW1vcnkgcmVjb3JkcywgZ2VuZXJhdGUgb3ZlcmFsbCBzdW1tYXJ5IGFuZCBzdW1tYXJpZXMgYnkKIC8vIG1lbW9yeSB0eXBlcwogYm9vbCBNZW1CYXNlbGluZTo6YmFzZWxpbmVfbWFsbG9jX3N1bW1hcnkoY29uc3QgTWVtUG9pbnRlckFycmF5KiBtYWxsb2NfcmVjb3JkcykgewotICBNZW1Qb2ludGVyQXJyYXlJdGVyYXRvckltcGwgbUl0cigoTWVtUG9pbnRlckFycmF5KiltYWxsb2NfcmVjb3Jkcyk7Ci0gIE1lbVBvaW50ZXJSZWNvcmQqIG1wdHIgPSAoTWVtUG9pbnRlclJlY29yZCopbUl0ci5jdXJyZW50KCk7CisgIE1lbVBvaW50ZXJBcnJheUl0ZXJhdG9ySW1wbCBtYWxsb2NfaXRyKChNZW1Qb2ludGVyQXJyYXkqKW1hbGxvY19yZWNvcmRzKTsKKyAgTWVtUG9pbnRlclJlY29yZCogbWFsbG9jX3B0ciA9IChNZW1Qb2ludGVyUmVjb3JkKiltYWxsb2NfaXRyLmN1cnJlbnQoKTsKICAgc2l6ZV90IHVzZWRfYXJlbmFfc2l6ZSA9IDA7CiAgIGludCBpbmRleDsKLSAgd2hpbGUgKG1wdHIgIT0gTlVMTCkgewotICAgIGluZGV4ID0gZmxhZzJpbmRleChGTEFHU19UT19NRU1PUllfVFlQRShtcHRyLT5mbGFncygpKSk7Ci0gICAgc2l6ZV90IHNpemUgPSBtcHRyLT5zaXplKCk7CisgIHdoaWxlIChtYWxsb2NfcHRyICE9IE5VTEwpIHsKKyAgICBpbmRleCA9IGZsYWcyaW5kZXgoRkxBR1NfVE9fTUVNT1JZX1RZUEUobWFsbG9jX3B0ci0+ZmxhZ3MoKSkpOworICAgIHNpemVfdCBzaXplID0gbWFsbG9jX3B0ci0+c2l6ZSgpOwogICAgIF90b3RhbF9tYWxsb2NlZCArPSBzaXplOwogICAgIF9tYWxsb2NfZGF0YVtpbmRleF0uaW5jKHNpemUpOwotICAgIGlmIChNZW1Qb2ludGVyUmVjb3JkOjppc19hcmVuYV9yZWNvcmQobXB0ci0+ZmxhZ3MoKSkpIHsKKyAgICBpZiAoTWVtUG9pbnRlclJlY29yZDo6aXNfYXJlbmFfcmVjb3JkKG1hbGxvY19wdHItPmZsYWdzKCkpKSB7CiAgICAgICAvLyBzZWUgaWYgYXJlbmEgc2l6ZSByZWNvcmQgcHJlc2VudAotICAgICAgTWVtUG9pbnRlclJlY29yZCogbmV4dF9wID0gKE1lbVBvaW50ZXJSZWNvcmRFeCopbUl0ci5wZWVrX25leHQoKTsKLSAgICAgIGlmIChNZW1Qb2ludGVyUmVjb3JkOjppc19hcmVuYV9zaXplX3JlY29yZChuZXh0X3AtPmZsYWdzKCkpKSB7Ci0gICAgICAgIGFzc2VydChuZXh0X3AtPmlzX3NpemVfcmVjb3JkX29mX2FyZW5hKG1wdHIpLCAiYXJlbmEgcmVjb3JkcyBkbyBub3QgbWF0Y2giKTsKLSAgICAgICAgc2l6ZSA9IG5leHRfcC0+c2l6ZSgpOworICAgICAgTWVtUG9pbnRlclJlY29yZCogbmV4dF9tYWxsb2NfcHRyID0gKE1lbVBvaW50ZXJSZWNvcmRFeCopbWFsbG9jX2l0ci5wZWVrX25leHQoKTsKKyAgICAgIGlmIChNZW1Qb2ludGVyUmVjb3JkOjppc19hcmVuYV9zaXplX3JlY29yZChuZXh0X21hbGxvY19wdHItPmZsYWdzKCkpKSB7CisgICAgICAgIGFzc2VydChuZXh0X21hbGxvY19wdHItPmlzX3NpemVfcmVjb3JkX29mX2FyZW5hKG1hbGxvY19wdHIpLCAiYXJlbmEgcmVjb3JkcyBkbyBub3QgbWF0Y2giKTsKKyAgICAgICAgc2l6ZSA9IG5leHRfbWFsbG9jX3B0ci0+c2l6ZSgpOwogICAgICAgICBfYXJlbmFfZGF0YVtpbmRleF0uaW5jKHNpemUpOwogICAgICAgICB1c2VkX2FyZW5hX3NpemUgKz0gc2l6ZTsKLSAgICAgICAgbUl0ci5uZXh0KCk7CisgICAgICAgIG1hbGxvY19pdHIubmV4dCgpOwogICAgICAgfQogICAgIH0KLSAgICBtcHRyID0gKE1lbVBvaW50ZXJSZWNvcmRFeCopbUl0ci5uZXh0KCk7CisgICAgbWFsbG9jX3B0ciA9IChNZW1Qb2ludGVyUmVjb3JkRXgqKW1hbGxvY19pdHIubmV4dCgpOwogICB9CiAKICAgLy8gc3Vic3RyYWN0IHVzZWQgYXJlbmEgc2l6ZSB0byBnZXQgc2l6ZSBvZiBhcmVuYSBjaHVuayBpbiBmcmVlIGxpc3QKQEAgLTE0MiwyMCArMTQ0LDIzIEBACiAvLyBiYXNlbGluZSBtbWFwJ2QgbWVtb3J5IHJlY29yZHMsIGdlbmVyYXRlIG92ZXJhbGwgc3VtbWFyeSBhbmQgc3VtbWFyaWVzIGJ5CiAvLyBtZW1vcnkgdHlwZXMKIGJvb2wgTWVtQmFzZWxpbmU6OmJhc2VsaW5lX3ZtX3N1bW1hcnkoY29uc3QgTWVtUG9pbnRlckFycmF5KiB2bV9yZWNvcmRzKSB7Ci0gIE1lbVBvaW50ZXJBcnJheUl0ZXJhdG9ySW1wbCB2SXRyKChNZW1Qb2ludGVyQXJyYXkqKXZtX3JlY29yZHMpOwotICBWTU1lbVJlZ2lvbiogdnB0ciA9IChWTU1lbVJlZ2lvbiopdkl0ci5jdXJyZW50KCk7CisgIE1lbVBvaW50ZXJBcnJheUl0ZXJhdG9ySW1wbCB2bV9pdHIoKE1lbVBvaW50ZXJBcnJheSopdm1fcmVjb3Jkcyk7CisgIFZNTWVtUmVnaW9uKiB2bV9wdHIgPSAoVk1NZW1SZWdpb24qKXZtX2l0ci5jdXJyZW50KCk7CiAgIGludCBpbmRleDsKLSAgd2hpbGUgKHZwdHIgIT0gTlVMTCkgewotICAgIGluZGV4ID0gZmxhZzJpbmRleChGTEFHU19UT19NRU1PUllfVFlQRSh2cHRyLT5mbGFncygpKSk7Ci0KKyAgd2hpbGUgKHZtX3B0ciAhPSBOVUxMKSB7CisgICAgaWYgKHZtX3B0ci0+aXNfcmVzZXJ2ZWRfcmVnaW9uKCkpIHsKKyAgICAgIGluZGV4ID0gZmxhZzJpbmRleChGTEFHU19UT19NRU1PUllfVFlQRSh2bV9wdHItPmZsYWdzKCkpKTsKICAgICAvLyB3ZSB1c2UgdGhlIG51bWJlciBvZiB0aHJlYWQgc3RhY2sgdG8gY291bnQgdGhyZWFkcwotICAgIGlmIChJU19NRU1PUllfVFlQRSh2cHRyLT5mbGFncygpLCBtdFRocmVhZFN0YWNrKSkgeworICAgICAgaWYgKElTX01FTU9SWV9UWVBFKHZtX3B0ci0+ZmxhZ3MoKSwgbXRUaHJlYWRTdGFjaykpIHsKICAgICAgIF9udW1iZXJfb2ZfdGhyZWFkcyArKzsKICAgICB9Ci0gICAgX3RvdGFsX3ZtX3Jlc2VydmVkICs9IHZwdHItPnJlc2VydmVkX3NpemUoKTsKLSAgICBfdG90YWxfdm1fY29tbWl0dGVkICs9IHZwdHItPmNvbW1pdHRlZF9zaXplKCk7Ci0gICAgX3ZtX2RhdGFbaW5kZXhdLmluYyh2cHRyLT5yZXNlcnZlZF9zaXplKCksIHZwdHItPmNvbW1pdHRlZF9zaXplKCkpOwotICAgIHZwdHIgPSAoVk1NZW1SZWdpb24qKXZJdHIubmV4dCgpOworICAgICAgX3RvdGFsX3ZtX3Jlc2VydmVkICs9IHZtX3B0ci0+c2l6ZSgpOworICAgICAgX3ZtX2RhdGFbaW5kZXhdLmluYyh2bV9wdHItPnNpemUoKSwgMCk7CisgICAgfSBlbHNlIHsKKyAgICAgIF90b3RhbF92bV9jb21taXR0ZWQgKz0gdm1fcHRyLT5zaXplKCk7CisgICAgICBfdm1fZGF0YVtpbmRleF0uaW5jKDAsIHZtX3B0ci0+c2l6ZSgpKTsKKyAgICB9CisgICAgdm1fcHRyID0gKFZNTWVtUmVnaW9uKil2bV9pdHIubmV4dCgpOwogICB9CiAgIHJldHVybiB0cnVlOwogfQpAQCAtMTY1LDQxICsxNzAsNTcgQEAKIGJvb2wgTWVtQmFzZWxpbmU6OmJhc2VsaW5lX21hbGxvY19kZXRhaWxzKGNvbnN0IE1lbVBvaW50ZXJBcnJheSogbWFsbG9jX3JlY29yZHMpIHsKICAgYXNzZXJ0KE1lbVRyYWNrZXI6OnRyYWNrX2NhbGxzaXRlKCksICJkZXRhaWwgdHJhY2tpbmcgaXMgb2ZmIik7CiAKLSAgTWVtUG9pbnRlckFycmF5SXRlcmF0b3JJbXBsIG1JdHIoKE1lbVBvaW50ZXJBcnJheSopbWFsbG9jX3JlY29yZHMpOwotICBNZW1Qb2ludGVyUmVjb3JkRXgqIG1wdHIgPSAoTWVtUG9pbnRlclJlY29yZEV4KiltSXRyLmN1cnJlbnQoKTsKLSAgTWFsbG9jQ2FsbHNpdGVQb2ludGVyIG1wOworICBNZW1Qb2ludGVyQXJyYXlJdGVyYXRvckltcGwgbWFsbG9jX2l0cihjb25zdF9jYXN0PE1lbVBvaW50ZXJBcnJheSo+KG1hbGxvY19yZWNvcmRzKSk7CisgIE1lbVBvaW50ZXJSZWNvcmRFeCogbWFsbG9jX3B0ciA9IChNZW1Qb2ludGVyUmVjb3JkRXgqKW1hbGxvY19pdHIuY3VycmVudCgpOworICBNYWxsb2NDYWxsc2l0ZVBvaW50ZXIgbWFsbG9jX2NhbGxzaXRlOwogCisgIC8vIGluaXRhaWxpemUgbWFsbG9jIGNhbGxzaXRlIGFycmF5CiAgIGlmIChfbWFsbG9jX2NzID09IE5VTEwpIHsKICAgICBfbWFsbG9jX2NzID0gbmV3IChzdGQ6Om5vdGhyb3cpIE1lbVBvaW50ZXJBcnJheUltcGw8TWFsbG9jQ2FsbHNpdGVQb2ludGVyPig2NCk7CiAgICAgLy8gb3V0IG9mIG5hdGl2ZSBtZW1vcnkKLSAgICBpZiAoX21hbGxvY19jcyA9PSBOVUxMKSB7CisgICAgaWYgKF9tYWxsb2NfY3MgPT0gTlVMTCB8fCBfbWFsbG9jX2NzLT5vdXRfb2ZfbWVtb3J5KCkpIHsKICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgIH0gZWxzZSB7CiAgICAgX21hbGxvY19jcy0+Y2xlYXIoKTsKICAgfQogCisgIE1lbVBvaW50ZXJBcnJheSogbWFsbG9jX2RhdGEgPSBjb25zdF9jYXN0PE1lbVBvaW50ZXJBcnJheSo+KG1hbGxvY19yZWNvcmRzKTsKKworICAvLyBzb3J0IGludG8gY2FsbHNpdGUgcGMgb3JkZXIuIERldGFpbHMgYXJlIGFnZ3JlZ2F0ZWQgYnkgY2FsbHNpdGVzCisgIG1hbGxvY19kYXRhLT5zb3J0KChGTl9TT1JUKW1hbGxvY19zb3J0X2J5X3BjKTsKKyAgYm9vbCByZXQgPSB0cnVlOworCiAgIC8vIGJhc2VsaW5lIG1lbW9yeSB0aGF0IGlzIHRvdGFsZWQgb3ZlciAxIEtCCi0gIHdoaWxlIChtcHRyICE9IE5VTEwpIHsKLSAgICBpZiAoIU1lbVBvaW50ZXJSZWNvcmQ6OmlzX2FyZW5hX3NpemVfcmVjb3JkKG1wdHItPmZsYWdzKCkpKSB7CisgIHdoaWxlIChtYWxsb2NfcHRyICE9IE5VTEwpIHsKKyAgICBpZiAoIU1lbVBvaW50ZXJSZWNvcmQ6OmlzX2FyZW5hX3NpemVfcmVjb3JkKG1hbGxvY19wdHItPmZsYWdzKCkpKSB7CiAgICAgICAvLyBza2lwIHRocmVhZCBzdGFja3MKLSAgICAgIGlmICghSVNfTUVNT1JZX1RZUEUobXB0ci0+ZmxhZ3MoKSwgbXRUaHJlYWRTdGFjaykpIHsKLSAgICAgICAgaWYgKG1wLmFkZHIoKSAhPSBtcHRyLT5wYygpKSB7Ci0gICAgICAgICAgaWYgKChtcC5hbW91bnQoKS9LKSA+IDApIHsKLSAgICAgICAgICAgIGlmICghX21hbGxvY19jcy0+YXBwZW5kKCZtcCkpIHsKLSAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKCFJU19NRU1PUllfVFlQRShtYWxsb2NfcHRyLT5mbGFncygpLCBtdFRocmVhZFN0YWNrKSkgeworICAgICAgICBpZiAobWFsbG9jX2NhbGxzaXRlLmFkZHIoKSAhPSBtYWxsb2NfcHRyLT5wYygpKSB7CisgICAgICAgICAgaWYgKChtYWxsb2NfY2FsbHNpdGUuYW1vdW50KCkvSykgPiAwKSB7CisgICAgICAgICAgICBpZiAoIV9tYWxsb2NfY3MtPmFwcGVuZCgmbWFsbG9jX2NhbGxzaXRlKSkgeworICAgICAgICAgICAgICByZXQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgfQotICAgICAgICAgIG1wID0gTWFsbG9jQ2FsbHNpdGVQb2ludGVyKG1wdHItPnBjKCkpOworICAgICAgICAgIG1hbGxvY19jYWxsc2l0ZSA9IE1hbGxvY0NhbGxzaXRlUG9pbnRlcihtYWxsb2NfcHRyLT5wYygpKTsKICAgICAgICAgfQotICAgICAgICBtcC5pbmMobXB0ci0+c2l6ZSgpKTsKKyAgICAgICAgbWFsbG9jX2NhbGxzaXRlLmluYyhtYWxsb2NfcHRyLT5zaXplKCkpOwogICAgICAgfQogICAgIH0KLSAgICBtcHRyID0gKE1lbVBvaW50ZXJSZWNvcmRFeCopbUl0ci5uZXh0KCk7CisgICAgbWFsbG9jX3B0ciA9IChNZW1Qb2ludGVyUmVjb3JkRXgqKW1hbGxvY19pdHIubmV4dCgpOwogICB9CiAKLSAgaWYgKG1wLmFkZHIoKSAhPSAwICYmIChtcC5hbW91bnQoKS9LKSA+IDApIHsKLSAgICBpZiAoIV9tYWxsb2NfY3MtPmFwcGVuZCgmbXApKSB7CisgIC8vIHJlc3RvcmUgdG8gYWRkcmVzcyBvcmRlci4gU25hcHNob3QgbWFsbG9jIGRhdGEgaXMgbWFpbnRhaW5lZCBpbiBtZW1vcnkKKyAgLy8gYWRkcmVzcyBvcmRlci4KKyAgbWFsbG9jX2RhdGEtPnNvcnQoKEZOX1NPUlQpbWFsbG9jX3NvcnRfYnlfYWRkcik7CisKKyAgaWYgKCFyZXQpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAvLyBkZWFsIHdpdGggbGFzdCByZWNvcmQKKyAgaWYgKG1hbGxvY19jYWxsc2l0ZS5hZGRyKCkgIT0gMCAmJiAobWFsbG9jX2NhbGxzaXRlLmFtb3VudCgpL0spID4gMCkgeworICAgIGlmICghX21hbGxvY19jcy0+YXBwZW5kKCZtYWxsb2NfY2FsbHNpdGUpKSB7CiAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICB9CkBAIC0yMTAsMzQgKzIzMSwxMDYgQEAKIGJvb2wgTWVtQmFzZWxpbmU6OmJhc2VsaW5lX3ZtX2RldGFpbHMoY29uc3QgTWVtUG9pbnRlckFycmF5KiB2bV9yZWNvcmRzKSB7CiAgIGFzc2VydChNZW1UcmFja2VyOjp0cmFja19jYWxsc2l0ZSgpLCAiZGV0YWlsIHRyYWNraW5nIGlzIG9mZiIpOwogCi0gIFZNQ2FsbHNpdGVQb2ludGVyIHZwOwotICBNZW1Qb2ludGVyQXJyYXlJdGVyYXRvckltcGwgdkl0cigoTWVtUG9pbnRlckFycmF5Kil2bV9yZWNvcmRzKTsKLSAgVk1NZW1SZWdpb25FeCogdnB0ciA9IChWTU1lbVJlZ2lvbkV4Kil2SXRyLmN1cnJlbnQoKTsKKyAgVk1DYWxsc2l0ZVBvaW50ZXIgIHZtX2NhbGxzaXRlOworICBWTUNhbGxzaXRlUG9pbnRlciogY3VyX2NhbGxzaXRlID0gTlVMTDsKKyAgTWVtUG9pbnRlckFycmF5SXRlcmF0b3JJbXBsIHZtX2l0cigoTWVtUG9pbnRlckFycmF5Kil2bV9yZWNvcmRzKTsKKyAgVk1NZW1SZWdpb25FeCogdm1fcHRyID0gKFZNTWVtUmVnaW9uRXgqKXZtX2l0ci5jdXJyZW50KCk7CiAKKyAgLy8gaW5pdGlhbGl6ZSB2aXJ0dWFsIG1lbW9yeSBtYXAgYXJyYXkKKyAgaWYgKF92bV9tYXAgPT0gTlVMTCkgeworICAgIF92bV9tYXAgPSBuZXcgKHN0ZDo6bm90aHJvdykgTWVtUG9pbnRlckFycmF5SW1wbDxWTU1lbVJlZ2lvbkV4Pih2bV9yZWNvcmRzLT5sZW5ndGgoKSk7CisgICBpZiAoX3ZtX21hcCA9PSBOVUxMIHx8IF92bV9tYXAtPm91dF9vZl9tZW1vcnkoKSkgeworICAgICByZXR1cm4gZmFsc2U7CisgICB9CisgIH0gZWxzZSB7CisgICAgX3ZtX21hcC0+Y2xlYXIoKTsKKyAgfQorCisgIC8vIGluaXRpYWxpemUgdmlydHVhbCBtZW1vcnkgY2FsbHNpdGUgYXJyYXkKICAgaWYgKF92bV9jcyA9PSBOVUxMKSB7CiAgICAgX3ZtX2NzID0gbmV3IChzdGQ6Om5vdGhyb3cpIE1lbVBvaW50ZXJBcnJheUltcGw8Vk1DYWxsc2l0ZVBvaW50ZXI+KDY0KTsKLSAgICBpZiAoX3ZtX2NzID09IE5VTEwpIHsKKyAgICBpZiAoX3ZtX2NzID09IE5VTEwgfHwgX3ZtX2NzLT5vdXRfb2ZfbWVtb3J5KCkpIHsKICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgIH0gZWxzZSB7CiAgICAgX3ZtX2NzLT5jbGVhcigpOwogICB9CiAKLSAgd2hpbGUgKHZwdHIgIT0gTlVMTCkgewotICAgIGlmICh2cC5hZGRyKCkgIT0gdnB0ci0+cGMoKSkgewotICAgICAgaWYgKCFfdm1fY3MtPmFwcGVuZCgmdnApKSB7CisgIC8vIGNvbnNvbGlkYXRlIHZpcnR1YWwgbWVtb3J5IGRhdGEKKyAgVk1NZW1SZWdpb25FeCogICAgIHJlc2VydmVkX3JlYyA9IE5VTEw7CisgIFZNTWVtUmVnaW9uRXgqICAgICBjb21taXR0ZWRfcmVjID0gTlVMTDsKKworICAvLyB2bV9wdHIgaXMgY29taW5nIGluIGluY3JlYXNpbmcgYmFzZSBhZGRyZXNzIG9yZGVyCisgIHdoaWxlICh2bV9wdHIgIT0gTlVMTCkgeworICAgIGlmICh2bV9wdHItPmlzX3Jlc2VydmVkX3JlZ2lvbigpKSB7CisgICAgICAvLyBjb25zb2xpZGF0ZSByZXNlcnZlZCBtZW1vcnkgcmVnaW9ucyBmb3IgdmlydHVhbCBtZW1vcnkgbWFwLgorICAgICAgLy8gVGhlIGNyaXRlcmlhIGZvciBjb25zb2xpZGF0aW9uIGlzOgorICAgICAgLy8gMS4gdHdvIGFkamFjZW50IHJlc2VydmVkIG1lbW9yeSByZWdpb25zCisgICAgICAvLyAyLiBiZWxvbmcgdG8gdGhlIHNhbWUgbWVtb3J5IHR5cGUKKyAgICAgIC8vIDMuIHJlc2VydmVkIGZyb20gdGhlIHNhbWUgY2FsbHNpdGUKKyAgICAgIGlmIChyZXNlcnZlZF9yZWMgPT0gTlVMTCB8fAorICAgICAgICByZXNlcnZlZF9yZWMtPmJhc2UoKSArIHJlc2VydmVkX3JlYy0+c2l6ZSgpICE9IHZtX3B0ci0+YWRkcigpIHx8CisgICAgICAgIEZMQUdTX1RPX01FTU9SWV9UWVBFKHJlc2VydmVkX3JlYy0+ZmxhZ3MoKSkgIT0gRkxBR1NfVE9fTUVNT1JZX1RZUEUodm1fcHRyLT5mbGFncygpKSB8fAorICAgICAgICByZXNlcnZlZF9yZWMtPnBjKCkgIT0gdm1fcHRyLT5wYygpKSB7CisgICAgICAgIGlmICghX3ZtX21hcC0+YXBwZW5kKHZtX3B0cikpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgfQotICAgICAgdnAgPSBWTUNhbGxzaXRlUG9pbnRlcih2cHRyLT5wYygpKTsKKyAgICAgICAgLy8gaW5zZXJ0ZWQgcmVzZXJ2ZWQgcmVnaW9uLCB3ZSBuZWVkIHRoZSBwb2ludGVyIHRvIHRoZSBlbGVtZW50IGluIHZpcnR1YWwKKyAgICAgICAgLy8gbWVtb3J5IG1hcCBhcnJheS4KKyAgICAgICAgcmVzZXJ2ZWRfcmVjID0gKFZNTWVtUmVnaW9uRXgqKV92bV9tYXAtPmF0KF92bV9tYXAtPmxlbmd0aCgpIC0gMSk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXNlcnZlZF9yZWMtPmV4cGFuZF9yZWdpb24odm1fcHRyLT5hZGRyKCksIHZtX3B0ci0+c2l6ZSgpKTsKICAgICB9Ci0gICAgdnAuaW5jKHZwdHItPnNpemUoKSwgdnB0ci0+Y29tbWl0dGVkX3NpemUoKSk7Ci0gICAgdnB0ciA9IChWTU1lbVJlZ2lvbkV4Kil2SXRyLm5leHQoKTsKLSAgfQotICBpZiAodnAuYWRkcigpICE9IDApIHsKLSAgICBpZiAoIV92bV9jcy0+YXBwZW5kKCZ2cCkpIHsKKworICAgICAgaWYgKGN1cl9jYWxsc2l0ZSAhPSBOVUxMICYmICFfdm1fY3MtPmFwcGVuZChjdXJfY2FsbHNpdGUpKSB7CiAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQorICAgICAgdm1fY2FsbHNpdGUgPSBWTUNhbGxzaXRlUG9pbnRlcih2bV9wdHItPnBjKCkpOworICAgICAgY3VyX2NhbGxzaXRlID0gJnZtX2NhbGxzaXRlOworICAgICAgdm1fY2FsbHNpdGUuaW5jKHZtX3B0ci0+c2l6ZSgpLCAwKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gY29uc29saWRhdGUgY29tbWl0dGVkIG1lbW9yeSByZWdpb25zIGZvciB2aXJ0dWFsIG1lbW9yeSBtYXAKKyAgICAgIC8vIFRoZSBjcml0ZXJpYWwgaXM6CisgICAgICAvLyAxLiB0d28gYWRqYWNlbnQgY29tbWl0dGVkIG1lbW9yeSByZWdpb25zCisgICAgICAvLyAyLiBjb21taXR0ZWQgZnJvbSB0aGUgc2FtZSBjYWxsc2l0ZQorICAgICAgaWYgKGNvbW1pdHRlZF9yZWMgPT0gTlVMTCB8fAorICAgICAgICBjb21taXR0ZWRfcmVjLT5iYXNlKCkgKyBjb21taXR0ZWRfcmVjLT5zaXplKCkgIT0gdm1fcHRyLT5hZGRyKCkgfHwKKyAgICAgICAgY29tbWl0dGVkX3JlYy0+cGMoKSAhPSB2bV9wdHItPnBjKCkpIHsKKyAgICAgICAgaWYgKCFfdm1fbWFwLT5hcHBlbmQodm1fcHRyKSkgeworICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgfQorICAgICAgICBjb21taXR0ZWRfcmVjID0gKFZNTWVtUmVnaW9uRXgqKV92bV9tYXAtPmF0KF92bV9tYXAtPmxlbmd0aCgpIC0gMSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29tbWl0dGVkX3JlYy0+ZXhwYW5kX3JlZ2lvbih2bV9wdHItPmFkZHIoKSwgdm1fcHRyLT5zaXplKCkpOworICAgICAgfQorICAgICAgdm1fY2FsbHNpdGUuaW5jKDAsIHZtX3B0ci0+c2l6ZSgpKTsKKyAgICB9CisgICAgdm1fcHRyID0gKFZNTWVtUmVnaW9uRXgqKXZtX2l0ci5uZXh0KCk7CisgIH0KKyAgLy8gZGVhbCB3aXRoIGxhc3QgcmVjb3JkCisgIGlmIChjdXJfY2FsbHNpdGUgIT0gTlVMTCAmJiAhX3ZtX2NzLT5hcHBlbmQoY3VyX2NhbGxzaXRlKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIHNvcnQgaXQgaW50byBjYWxsc2l0ZSBwYyBvcmRlci4gRGV0YWlscyBhcmUgYWdncmVnYXRlZCBieSBjYWxsc2l0ZXMKKyAgX3ZtX2NzLT5zb3J0KChGTl9TT1JUKWJsX3ZtX3NvcnRfYnlfcGMpOworCisgIC8vIHdhbGsgdGhlIGFycmF5IHRvIGNvbnNvbGlkYXRlIHJlY29yZCBieSBwYworICBNZW1Qb2ludGVyQXJyYXlJdGVyYXRvckltcGwgaXRyKF92bV9jcyk7CisgIFZNQ2FsbHNpdGVQb2ludGVyKiBjYWxsc2l0ZV9yZWMgPSAoVk1DYWxsc2l0ZVBvaW50ZXIqKWl0ci5jdXJyZW50KCk7CisgIFZNQ2FsbHNpdGVQb2ludGVyKiBuZXh0X3JlYyA9IChWTUNhbGxzaXRlUG9pbnRlciopaXRyLm5leHQoKTsKKyAgd2hpbGUgKG5leHRfcmVjICE9IE5VTEwpIHsKKyAgICBhc3NlcnQoY2FsbHNpdGVfcmVjICE9IE5VTEwsICJTYW5pdHkgY2hlY2siKTsKKyAgICBpZiAobmV4dF9yZWMtPmFkZHIoKSA9PSBjYWxsc2l0ZV9yZWMtPmFkZHIoKSkgeworICAgICAgY2FsbHNpdGVfcmVjLT5pbmMobmV4dF9yZWMtPnJlc2VydmVkX2Ftb3VudCgpLCBuZXh0X3JlYy0+Y29tbWl0dGVkX2Ftb3VudCgpKTsKKyAgICAgIGl0ci5yZW1vdmUoKTsKKyAgICAgIG5leHRfcmVjID0gKFZNQ2FsbHNpdGVQb2ludGVyKilpdHIuY3VycmVudCgpOworICAgIH0gZWxzZSB7CisgICAgICBjYWxsc2l0ZV9yZWMgPSBuZXh0X3JlYzsKKyAgICAgIG5leHRfcmVjID0gKFZNQ2FsbHNpdGVQb2ludGVyKilpdHIubmV4dCgpOworICAgIH0KKyAgfQorCiAgIHJldHVybiB0cnVlOwogfQogCkBAIC0yNTEsMTIgKzM0NCw4IEBACiAgIF9udW1iZXJfb2ZfY2xhc3NlcyA9IFN5c3RlbURpY3Rpb25hcnk6Om51bWJlcl9vZl9jbGFzc2VzKCk7CiAKICAgaWYgKCFzdW1tYXJ5X29ubHkgJiYgTWVtVHJhY2tlcjo6dHJhY2tfY2FsbHNpdGUoKSAmJiBfYmFzZWxpbmVkKSB7Ci0gICAgKChNZW1Qb2ludGVyQXJyYXkqKXNuYXBzaG90Ll9hbGxvY19wdHJzKS0+c29ydCgoRk5fU09SVCltYWxsb2Nfc29ydF9ieV9wYyk7Ci0gICAgKChNZW1Qb2ludGVyQXJyYXkqKXNuYXBzaG90Ll92bV9wdHJzKS0+c29ydCgoRk5fU09SVCl2bV9zb3J0X2J5X3BjKTsKICAgICBfYmFzZWxpbmVkID0gIGJhc2VsaW5lX21hbGxvY19kZXRhaWxzKHNuYXBzaG90Ll9hbGxvY19wdHJzKSAmJgogICAgICAgYmFzZWxpbmVfdm1fZGV0YWlscyhzbmFwc2hvdC5fdm1fcHRycyk7Ci0gICAgKChNZW1Qb2ludGVyQXJyYXkqKXNuYXBzaG90Ll9hbGxvY19wdHJzKS0+c29ydCgoRk5fU09SVCltYWxsb2Nfc29ydF9ieV9hZGRyKTsKLSAgICAoKE1lbVBvaW50ZXJBcnJheSopc25hcHNob3QuX3ZtX3B0cnMpLT5zb3J0KChGTl9TT1JUKXZtX3NvcnRfYnlfYWRkcik7CiAgIH0KICAgcmV0dXJuIF9iYXNlbGluZWQ7CiB9CkBAIC0yNzgsNyArMzY3LDcgQEAKICAgICAgIHJldHVybiBNZW1UeXBlMk5hbWVNYXBbaW5kZXhdLl9uYW1lOwogICAgIH0KICAgfQotICBhc3NlcnQoZmFsc2UsICJubyB0eXBlIik7CisgIGFzc2VydChmYWxzZSwgZXJyX21zZygiYmFkIHR5cGUgJXgiLCB0eXBlKSk7CiAgIHJldHVybiBOVUxMOwogfQogCkBAIC0zNDEsMTMgKzQzMCw2IEBACiAgIHJldHVybiBVTlNJR05FRF9DT01QQVJFKG1wMS0+YWRkcigpLCBtcDItPmFkZHIoKSk7CiB9CiAKLS8vIHNvcnQgc25hcHNob3QgbW1hcCdkIHJlY29yZHMgaW4gY2FsbHNpdGUgcGMgb3JkZXIKLWludCBNZW1CYXNlbGluZTo6dm1fc29ydF9ieV9wYyhjb25zdCB2b2lkKiBwMSwgY29uc3Qgdm9pZCogcDIpIHsKLSAgYXNzZXJ0KE1lbVRyYWNrZXI6OnRyYWNrX2NhbGxzaXRlKCksIkp1c3QgY2hlY2siKTsKLSAgY29uc3QgVk1NZW1SZWdpb25FeCogbXAxID0gKGNvbnN0IFZNTWVtUmVnaW9uRXgqKXAxOwotICBjb25zdCBWTU1lbVJlZ2lvbkV4KiBtcDIgPSAoY29uc3QgVk1NZW1SZWdpb25FeCopcDI7Ci0gIHJldHVybiBVTlNJR05FRF9DT01QQVJFKG1wMS0+cGMoKSwgbXAyLT5wYygpKTsKLX0KIAogLy8gc29ydCBiYXNlbGluZWQgbW1hcCdkIHJlY29yZHMgaW4gc2l6ZSAocmVzZXJ2ZWQgc2l6ZSkgb3JkZXIKIGludCBNZW1CYXNlbGluZTo6Ymxfdm1fc29ydF9ieV9zaXplKGNvbnN0IHZvaWQqIHAxLCBjb25zdCB2b2lkKiBwMikgewpAQCAtMzc2LDEyICs0NTgsMyBAQAogICByZXR1cm4gZGVsdGE7CiB9CiAKLS8vIHNvcnQgc25hcHNob3QgbW1hcCdkIHJlY29yZHMgaW4gbWVtb3J5IGJsb2NrIGFkZHJlc3Mgb3JkZXIKLWludCBNZW1CYXNlbGluZTo6dm1fc29ydF9ieV9hZGRyKGNvbnN0IHZvaWQqIHAxLCBjb25zdCB2b2lkKiBwMikgewotICBhc3NlcnQoTWVtVHJhY2tlcjo6aXNfb24oKSwgIkp1c3QgY2hlY2siKTsKLSAgY29uc3QgVk1NZW1SZWdpb24qIG1wMSA9IChjb25zdCBWTU1lbVJlZ2lvbiopcDE7Ci0gIGNvbnN0IFZNTWVtUmVnaW9uKiBtcDIgPSAoY29uc3QgVk1NZW1SZWdpb24qKXAyOwotICBpbnQgZGVsdGEgPSBVTlNJR05FRF9DT01QQVJFKG1wMS0+YWRkcigpLCBtcDItPmFkZHIoKSk7Ci0gIGFzc2VydChkZWx0YSAhPSAwLCAiZHVwIHBvaW50ZXIiKTsKLSAgcmV0dXJuIGRlbHRhOwotfQpkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vc2VydmljZXMvbWVtQmFzZWxpbmUuaHBwIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vc2VydmljZXMvbWVtQmFzZWxpbmUuaHBwCmluZGV4IDJhZmZhMmIuLjVmOThlMzAgMTAwNjQ0Ci0tLSBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL3NlcnZpY2VzL21lbUJhc2VsaW5lLmhwcAorKysgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9zZXJ2aWNlcy9tZW1CYXNlbGluZS5ocHAKQEAgLTMyMCw2ICszMjAsOCBAQAogICAvLyBvbmx5IGF2YWlsYWJsZSB3aGVuIGRldGFpbCB0cmFja2luZyBpcyBvbi4KICAgTWVtUG9pbnRlckFycmF5KiAgX21hbGxvY19jczsKICAgTWVtUG9pbnRlckFycmF5KiAgX3ZtX2NzOworICAvLyB2aXJ0dWFsIG1lbW9yeSBtYXAKKyAgTWVtUG9pbnRlckFycmF5KiAgX3ZtX21hcDsKIAogIHByaXZhdGU6CiAgIHN0YXRpYyBNZW1UeXBlMk5hbWUgIE1lbVR5cGUyTmFtZU1hcFtOVU1CRVJfT0ZfTUVNT1JZX1RZUEVdOwpAQCAtNDMyLDkgKzQzNCw2IEBACiAgIHN0YXRpYyBpbnQgbWFsbG9jX3NvcnRfYnlfcGMoY29uc3Qgdm9pZCogcDEsIGNvbnN0IHZvaWQqIHAyKTsKICAgc3RhdGljIGludCBtYWxsb2Nfc29ydF9ieV9hZGRyKGNvbnN0IHZvaWQqIHAxLCBjb25zdCB2b2lkKiBwMik7CiAKLSAgc3RhdGljIGludCB2bV9zb3J0X2J5X3BjKGNvbnN0IHZvaWQqIHAxLCBjb25zdCB2b2lkKiBwMik7Ci0gIHN0YXRpYyBpbnQgdm1fc29ydF9ieV9hZGRyKGNvbnN0IHZvaWQqIHAxLCBjb25zdCB2b2lkKiBwMik7Ci0KICBwcml2YXRlOgogICAvLyBzb3J0aW5nIGZ1bmN0aW9ucyBmb3IgYmFzZWxpbmVkIHJlY29yZHMKICAgc3RhdGljIGludCBibF9tYWxsb2Nfc29ydF9ieV9zaXplKGNvbnN0IHZvaWQqIHAxLCBjb25zdCB2b2lkKiBwMik7CmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9zaGFyZS92bS9zZXJ2aWNlcy9tZW1QdHIuY3BwIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vc2VydmljZXMvbWVtUHRyLmNwcAppbmRleCBkMmExODc2Li41ZDBmYmY1IDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9zaGFyZS92bS9zZXJ2aWNlcy9tZW1QdHIuY3BwCisrKyBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL3NlcnZpY2VzL21lbVB0ci5jcHAKQEAgLTQwLDM1ICs0MCwzIEBACiAgIHJldHVybiBzZXE7CiB9CiAKLQotCi1ib29sIFZNTWVtUmVnaW9uOjpjb250YWlucyhjb25zdCBWTU1lbVJlZ2lvbiogbXIpIGNvbnN0IHsKLSAgYXNzZXJ0KGJhc2UoKSAhPSAwLCAiU2FuaXR5IGNoZWNrIik7Ci0gIGFzc2VydChzaXplKCkgIT0gMCB8fCBjb21taXR0ZWRfc2l6ZSgpICE9IDAsCi0gICAgIlNhbml0eSBjaGVjayIpOwotICBhZGRyZXNzIGJhc2VfYWRkciA9IGJhc2UoKTsKLSAgYWRkcmVzcyBlbmRfYWRkciA9IGJhc2VfYWRkciArCi0gICAgKGlzX3Jlc2VydmVfcmVjb3JkKCk/IHJlc2VydmVkX3NpemUoKTogY29tbWl0dGVkX3NpemUoKSk7Ci0gIGlmIChtci0+aXNfcmVzZXJ2ZV9yZWNvcmQoKSkgewotICAgIGlmIChtci0+YmFzZSgpID09IGJhc2VfYWRkciAmJiBtci0+c2l6ZSgpID09IHNpemUoKSkgewotICAgICAgLy8gdGhlIHNhbWUgcmFuZ2UKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0gZWxzZSBpZiAobXItPmlzX2NvbW1pdF9yZWNvcmQoKSB8fCBtci0+aXNfdW5jb21taXRfcmVjb3JkKCkpIHsKLSAgICBhc3NlcnQobXItPmJhc2UoKSAhPSAwICYmIG1yLT5jb21taXR0ZWRfc2l6ZSgpID4gMCwKLSAgICAgICJiYWQgcmVjb3JkIik7Ci0gICAgcmV0dXJuIChtci0+YmFzZSgpID49IGJhc2VfYWRkciAmJgotICAgICAgKG1yLT5iYXNlKCkgKyBtci0+Y29tbWl0dGVkX3NpemUoKSkgPD0gZW5kX2FkZHIpOwotICB9IGVsc2UgaWYgKG1yLT5pc190eXBlX3RhZ2dpbmdfcmVjb3JkKCkpIHsKLSAgICBhc3NlcnQobXItPmJhc2UoKSAhPSBOVUxMLCAiU2FuaXR5IGNoZWNrIik7Ci0gICAgcmV0dXJuIChtci0+YmFzZSgpID49IGJhc2VfYWRkciAmJiBtci0+YmFzZSgpIDwgZW5kX2FkZHIpOwotICB9IGVsc2UgaWYgKG1yLT5pc19yZWxlYXNlX3JlY29yZCgpKSB7Ci0gICAgYXNzZXJ0KG1yLT5iYXNlKCkgIT0gMCAmJiBtci0+c2l6ZSgpID4gMCwKLSAgICAgICJiYWQgcmVjb3JkIik7Ci0gICAgcmV0dXJuIChtci0+YmFzZSgpID09IGJhc2VfYWRkciAmJiBtci0+c2l6ZSgpID09IHNpemUoKSk7Ci0gIH0gZWxzZSB7Ci0gICAgU2hvdWxkTm90UmVhY2hIZXJlKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19CmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9zaGFyZS92bS9zZXJ2aWNlcy9tZW1QdHIuaHBwIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vc2VydmljZXMvbWVtUHRyLmhwcAppbmRleCBiZWY0OWIyLi4wNjE4YTNjIDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9zaGFyZS92bS9zZXJ2aWNlcy9tZW1QdHIuaHBwCisrKyBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL3NlcnZpY2VzL21lbVB0ci5ocHAKQEAgLTI5MSw2ICsyOTEsMjYgQEAKICAgaW5saW5lIGJvb2wgaXNfdHlwZV90YWdnaW5nX3JlY29yZCgpIGNvbnN0IHsKICAgICByZXR1cm4gaXNfdmlydHVhbF9tZW1vcnlfdHlwZV9yZWNvcmQoX2ZsYWdzKTsKICAgfQorCisgIC8vIGlmIHRoZSB0d28gbWVtb3J5IHBvaW50ZXIgcmVjb3JkcyBhY3R1YWxseSByZXByZXNlbnQgdGhlIHNhbWUKKyAgLy8gbWVtb3J5IGJsb2NrCisgIGlubGluZSBib29sIGlzX3NhbWVfcmVnaW9uKGNvbnN0IE1lbVBvaW50ZXJSZWNvcmQqIG90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuIChhZGRyKCkgPT0gb3RoZXItPmFkZHIoKSAmJiBzaXplKCkgPT0gb3RoZXItPnNpemUoKSk7CisgIH0KKworICAvLyBpZiB0aGlzIG1lbW9yeSByZWdpb24gZnVsbHkgY29udGFpbnMgYW5vdGhlciBvbmUKKyAgaW5saW5lIGJvb2wgY29udGFpbnNfcmVnaW9uKGNvbnN0IE1lbVBvaW50ZXJSZWNvcmQqIG90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnRhaW5zX3JlZ2lvbihvdGhlci0+YWRkcigpLCBvdGhlci0+c2l6ZSgpKTsKKyAgfQorCisgIC8vIGlmIHRoaXMgbWVtb3J5IHJlZ2lvbiBmdWxseSBjb250YWlucyBzcGVjaWZpZWQgbWVtb3J5IHJhbmdlCisgIGlubGluZSBib29sIGNvbnRhaW5zX3JlZ2lvbihhZGRyZXNzIGFkZCwgc2l6ZV90IHN6KSBjb25zdCB7CisgICAgcmV0dXJuIChhZGRyKCkgPD0gYWRkICYmIGFkZHIoKSArIHNpemUoKSA+PSBhZGQgKyBzeik7CisgIH0KKworICBpbmxpbmUgYm9vbCBjb250YWluc19hZGRyZXNzKGFkZHJlc3MgYWRkKSBjb25zdCB7CisgICAgcmV0dXJuIChhZGRyKCkgPD0gYWRkICYmIGFkZHIoKSArIHNpemUoKSA+IGFkZCk7CisgIH0KIH07CiAKIC8vIE1lbVBvaW50ZXJSZWNvcmRFeCBhbHNvIHJlY29yZHMgY2FsbHNpdGUgcGMsIGZyb20gd2hlcmUKQEAgLTMyMSw2NiArMzQxLDMyIEBACiAgIH0KIH07CiAKLS8vIGEgdmlydHVhbCBtZW1vcnkgcmVnaW9uCisvLyBhIHZpcnR1YWwgbWVtb3J5IHJlZ2lvbi4gVGhlIHJlZ2lvbiBjYW4gcmVwcmVzZW50IGEgcmVzZXJ2ZWQKKy8vIHZpcnR1YWwgbWVtb3J5IHJlZ2lvbiBvciBhIGNvbW1pdHRlZCBtZW1vcnkgcmVnaW9uCiBjbGFzcyBWTU1lbVJlZ2lvbiA6IHB1YmxpYyBNZW1Qb2ludGVyUmVjb3JkIHsKLSBwcml2YXRlOgotICAvLyBjb21taXR0ZWQgc2l6ZQotICBzaXplX3QgICAgICAgX2NvbW1pdHRlZF9zaXplOwotCiBwdWJsaWM6Ci0gIFZNTWVtUmVnaW9uKCk6IF9jb21taXR0ZWRfc2l6ZSgwKSB7IH0KKyAgVk1NZW1SZWdpb24oKSB7IH0KIAogICB2b2lkIGluaXQoY29uc3QgTWVtUG9pbnRlclJlY29yZCogbXApIHsKLSAgICBhc3NlcnQobXAtPmlzX3ZtX3BvaW50ZXIoKSwgIm5vdCB2aXJ0dWFsIG1lbW9yeSBwb2ludGVyIik7CisgICAgYXNzZXJ0KG1wLT5pc192bV9wb2ludGVyKCksICJTYW5pdHkgY2hlY2siKTsKICAgICBfYWRkciA9IG1wLT5hZGRyKCk7Ci0gICAgaWYgKG1wLT5pc19jb21taXRfcmVjb3JkKCkgfHwgbXAtPmlzX3VuY29tbWl0X3JlY29yZCgpKSB7Ci0gICAgICBfY29tbWl0dGVkX3NpemUgPSBtcC0+c2l6ZSgpOwotICAgICAgc2V0X3NpemUoX2NvbW1pdHRlZF9zaXplKTsKLSAgICB9IGVsc2UgewogICAgICAgc2V0X3NpemUobXAtPnNpemUoKSk7Ci0gICAgICBfY29tbWl0dGVkX3NpemUgPSAwOwotICAgIH0KICAgICBzZXRfZmxhZ3MobXAtPmZsYWdzKCkpOwogICB9CiAKICAgVk1NZW1SZWdpb24mIG9wZXJhdG9yPShjb25zdCBWTU1lbVJlZ2lvbiYgb3RoZXIpIHsKICAgICBNZW1Qb2ludGVyUmVjb3JkOjpvcGVyYXRvcj0ob3RoZXIpOwotICAgIF9jb21taXR0ZWRfc2l6ZSA9IG90aGVyLmNvbW1pdHRlZF9zaXplKCk7CiAgICAgcmV0dXJuICp0aGlzOwogICB9CiAKLSAgaW5saW5lIGJvb2wgaXNfcmVzZXJ2ZV9yZWNvcmQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGlzX3ZpcnR1YWxfbWVtb3J5X3Jlc2VydmVfcmVjb3JkKGZsYWdzKCkpOworICBpbmxpbmUgYm9vbCBpc19yZXNlcnZlZF9yZWdpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIGlzX2FsbG9jYXRpb25fcmVjb3JkKCk7CiAgIH0KIAotICBpbmxpbmUgYm9vbCBpc19yZWxlYXNlX3JlY29yZCgpIGNvbnN0IHsKLSAgICByZXR1cm4gaXNfdmlydHVhbF9tZW1vcnlfcmVsZWFzZV9yZWNvcmQoZmxhZ3MoKSk7CisgIGlubGluZSBib29sIGlzX2NvbW1pdHRlZF9yZWdpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIGlzX2NvbW1pdF9yZWNvcmQoKTsKICAgfQogCi0gIC8vIHJlc2l6ZSByZXNlcnZlZCBWTSByYW5nZQotICBpbmxpbmUgdm9pZCBzZXRfcmVzZXJ2ZWRfc2l6ZShzaXplX3QgbmV3X3NpemUpIHsKLSAgICBhc3NlcnQobmV3X3NpemUgPj0gY29tbWl0dGVkX3NpemUoKSwgInJlc2l6ZSIpOwotICAgIHNldF9zaXplKG5ld19zaXplKTsKLSAgfQotCi0gIGlubGluZSB2b2lkIGNvbW1pdChzaXplX3Qgc2l6ZSkgewotICAgIF9jb21taXR0ZWRfc2l6ZSArPSBzaXplOwotICB9Ci0KLSAgaW5saW5lIHZvaWQgdW5jb21taXQoc2l6ZV90IHNpemUpIHsKLSAgICBpZiAoX2NvbW1pdHRlZF9zaXplID49IHNpemUpIHsKLSAgICAgIF9jb21taXR0ZWRfc2l6ZSAtPSBzaXplOwotICAgIH0gZWxzZSB7Ci0gICAgICBfY29tbWl0dGVkX3NpemUgPSAwOwotICAgIH0KLSAgfQotCi0gIC8qCi0gICAqIGlmIHRoaXMgdmlydHVhbCBtZW1vcnkgcmFuZ2UgY292ZXJzIHdob2xlIHJhbmdlIG9mCi0gICAqIHRoZSBvdGhlciBWTU1lbVJlZ2lvbgotICAgKi8KLSAgYm9vbCBjb250YWlucyhjb25zdCBWTU1lbVJlZ2lvbiogbXIpIGNvbnN0OwotCiAgIC8qIGJhc2UgYWRkcmVzcyBvZiB0aGlzIHZpcnR1YWwgbWVtb3J5IHJhbmdlICovCiAgIGlubGluZSBhZGRyZXNzIGJhc2UoKSBjb25zdCB7CiAgICAgcmV0dXJuIGFkZHIoKTsKQEAgLTM5MSwxMyArMzc3LDI4IEBACiAgICAgc2V0X2ZsYWdzKGZsYWdzKCkgfCAoZiAmIG10X21hc2tzKSk7CiAgIH0KIAotICAvLyByZWxlYXNlIHBhcnQgb2YgbWVtb3J5IHJhbmdlCi0gIGlubGluZSB2b2lkIHBhcnRpYWxfcmVsZWFzZShhZGRyZXNzIGFkZCwgc2l6ZV90IHN6KSB7Ci0gICAgYXNzZXJ0KGFkZCA+PSBhZGRyKCkgJiYgYWRkIDwgYWRkcigpICsgc2l6ZSgpLCAibm90IHZhbGlkIGFkZHJlc3MiKTsKLSAgICAvLyBmb3Igbm93LCBpdCBjYW4gcGFydGlhbGx5IHJlbGVhc2UgZnJvbSB0aGUgYm90aCBlbmRzLAotICAgIC8vIGJ1dCBub3QgaW4gdGhlIG1pZGRsZQorICAvLyBleHBhbmQgdGhpcyByZWdpb24gdG8gYWxzbyBjb3ZlciBzcGVjaWZpZWQgcmFuZ2UuCisgIC8vIFRoZSByYW5nZSBoYXMgdG8gYmUgb24gZWl0aGVyIGVuZCBvZiB0aGUgbWVtb3J5IHJlZ2lvbi4KKyAgdm9pZCBleHBhbmRfcmVnaW9uKGFkZHJlc3MgYWRkciwgc2l6ZV90IHN6KSB7CisgICAgaWYgKGFkZHIgPCBiYXNlKCkpIHsKKyAgICAgIGFzc2VydChhZGRyICsgc3ogPT0gYmFzZSgpLCAiU2FuaXR5IGNoZWNrIik7CisgICAgICBfYWRkciA9IGFkZHI7CisgICAgICBzZXRfc2l6ZShzaXplKCkgKyBzeik7CisgICAgfSBlbHNlIHsKKyAgICAgIGFzc2VydChiYXNlKCkgKyBzaXplKCkgPT0gYWRkciwgIlNhbml0eSBjaGVjayIpOworICAgICAgc2V0X3NpemUoc2l6ZSgpICsgc3opOworICAgIH0KKyAgfQorCisgIC8vIGV4Y2x1ZGUgdGhlIHNwZWNpZmllZCBhZGRyZXNzIHJhbmdlIGZyb20gdGhpcyByZWdpb24uCisgIC8vIFRoZSBleGNsdWRlZCBtZW1vcnkgcmFuZ2UgaGFzIHRvIGJlIG9uIGVpdGhlciBlbmQgb2YgdGhpcyBtZW1vcnkKKyAgLy8gcmVnaW9uLgorICBpbmxpbmUgdm9pZCBleGNsdWRlX3JlZ2lvbihhZGRyZXNzIGFkZCwgc2l6ZV90IHN6KSB7CisgICAgYXNzZXJ0KGlzX3Jlc2VydmVkX3JlZ2lvbigpIHx8IGlzX2NvbW1pdHRlZF9yZWdpb24oKSwgIlNhbml0eSBjaGVjayIpOworICAgIGFzc2VydChhZGRyKCkgIT0gTlVMTCAmJiBzaXplKCkgIT0gMCwgIlNhbml0eSBjaGVjayIpOworICAgIGFzc2VydChhZGQgPj0gYWRkcigpICYmIGFkZCA8IGFkZHIoKSArIHNpemUoKSwgIlNhbml0eSBjaGVjayIpOwogICAgIGFzc2VydChhZGQgPT0gYWRkcigpIHx8IChhZGQgKyBzeikgPT0gKGFkZHIoKSArIHNpemUoKSksCi0gICAgICAicmVsZWFzZSBpbiB0aGUgbWlkZGxlIik7CisgICAgICAiZXhjbHVkZSBpbiB0aGUgbWlkZGxlIik7CiAgICAgaWYgKGFkZCA9PSBhZGRyKCkpIHsKICAgICAgIHNldF9hZGRyKGFkZCArIHN6KTsKICAgICAgIHNldF9zaXplKHNpemUoKSAtIHN6KTsKQEAgLTQwNSwxNiArNDA2LDYgQEAKICAgICAgIHNldF9zaXplKHNpemUoKSAtIHN6KTsKICAgICB9CiAgIH0KLQotICAvLyB0aGUgY29tbWl0dGVkIHNpemUgb2YgdGhlIHZpcnR1YWwgbWVtb3J5IGJsb2NrCi0gIGlubGluZSBzaXplX3QgY29tbWl0dGVkX3NpemUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIF9jb21taXR0ZWRfc2l6ZTsKLSAgfQotCi0gIC8vIHRoZSByZXNlcnZlZCBzaXplIG9mIHRoZSB2aXJ0dWFsIG1lbW9yeSBibG9jawotICBpbmxpbmUgc2l6ZV90IHJlc2VydmVkX3NpemUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHNpemUoKTsKLSAgfQogfTsKIAogY2xhc3MgVk1NZW1SZWdpb25FeCA6IHB1YmxpYyBWTU1lbVJlZ2lvbiB7CmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9zaGFyZS92bS9zZXJ2aWNlcy9tZW1SZWNvcmRlci5jcHAgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9zZXJ2aWNlcy9tZW1SZWNvcmRlci5jcHAKaW5kZXggMzNkYjg3NS4uNWVjODY1YSAxMDA2NDQKLS0tIGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vc2VydmljZXMvbWVtUmVjb3JkZXIuY3BwCisrKyBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL3NlcnZpY2VzL21lbVJlY29yZGVyLmNwcApAQCAtMzEsMTQgKzMxLDE5IEBACiAjaW5jbHVkZSAic2VydmljZXMvbWVtVHJhY2tlci5ocHAiCiAKIE1lbVBvaW50ZXIqIFNlcXVlbmNlZFJlY29yZEl0ZXJhdG9yOjpuZXh0X3JlY29yZCgpIHsKLSAgTWVtUG9pbnRlciogaXRyX2N1ciA9IF9pdHIuY3VycmVudCgpOwotICBpZiAoaXRyX2N1ciA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLSAgTWVtUG9pbnRlciogaXRyX25leHQgPSBfaXRyLm5leHQoKTsKKyAgTWVtUG9pbnRlclJlY29yZCogaXRyX2N1ciA9IChNZW1Qb2ludGVyUmVjb3JkKilfaXRyLmN1cnJlbnQoKTsKKyAgaWYgKGl0cl9jdXIgPT0gTlVMTCkgIHsKKyAgICByZXR1cm4gaXRyX2N1cjsKKyAgfQogCi0gIHdoaWxlIChpdHJfbmV4dCAhPSBOVUxMICYmCi0gICAgc2FtZV9raW5kKChNZW1Qb2ludGVyUmVjb3JkKilpdHJfY3VyLCAoTWVtUG9pbnRlclJlY29yZCopaXRyX25leHQpKSB7CisgIE1lbVBvaW50ZXJSZWNvcmQqIGl0cl9uZXh0ID0gKE1lbVBvaW50ZXJSZWNvcmQqKV9pdHIubmV4dCgpOworCisgIC8vIGRvbid0IGNvbGxhcHNlIHZpcnR1YWwgbWVtb3J5IHJlY29yZHMKKyAgd2hpbGUgKGl0cl9uZXh0ICE9IE5VTEwgJiYgIWl0cl9jdXItPmlzX3ZtX3BvaW50ZXIoKSAmJgorICAgICFpdHJfbmV4dC0+aXNfdm1fcG9pbnRlcigpICYmCisgICAgc2FtZV9raW5kKGl0cl9jdXIsIGl0cl9uZXh0KSkgewogICAgIGl0cl9jdXIgPSBpdHJfbmV4dDsKLSAgICBpdHJfbmV4dCA9IF9pdHIubmV4dCgpOworICAgIGl0cl9uZXh0ID0gKE1lbVBvaW50ZXJSZWNvcmQqKV9pdHIubmV4dCgpOwogICB9CiAKICAgcmV0dXJuIGl0cl9jdXI7CmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9zaGFyZS92bS9zZXJ2aWNlcy9tZW1SZWNvcmRlci5ocHAgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9zZXJ2aWNlcy9tZW1SZWNvcmRlci5ocHAKaW5kZXggNzU0Y2JkNi4uMmFmZWViMCAxMDA2NDQKLS0tIGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vc2VydmljZXMvbWVtUmVjb3JkZXIuaHBwCisrKyBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL3NlcnZpY2VzL21lbVJlY29yZGVyLmhwcApAQCAtMTg4LDYgKzE4OCw3IEBACiAgIC8vIFRlc3QgaWYgdGhlIHR3byByZWNvcmRzIGFyZSB0aGUgc2FtZSBraW5kOiB0aGUgc2FtZSBtZW1vcnkgYmxvY2sgYW5kIGFsbG9jYXRpb24KICAgLy8gdHlwZS4KICAgaW5saW5lIGJvb2wgc2FtZV9raW5kKGNvbnN0IE1lbVBvaW50ZXJSZWNvcmQqIHAxLCBjb25zdCBNZW1Qb2ludGVyUmVjb3JkKiBwMikgY29uc3QgeworICAgIGFzc2VydCghcDEtPmlzX3ZtX3BvaW50ZXIoKSAmJiAhcDItPmlzX3ZtX3BvaW50ZXIoKSwgIm1hbGxvYyBwb2ludGVyIG9ubHkiKTsKICAgICByZXR1cm4gKHAxLT5hZGRyKCkgPT0gcDItPmFkZHIoKSAmJgogICAgICAgKHAxLT5mbGFncygpICZNZW1Qb2ludGVyUmVjb3JkOjp0YWdfbWFza3MpID09CiAgICAgICAocDItPmZsYWdzKCkgJiBNZW1Qb2ludGVyUmVjb3JkOjp0YWdfbWFza3MpKTsKZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL3NlcnZpY2VzL21lbVJlcG9ydGVyLmNwcCBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL3NlcnZpY2VzL21lbVJlcG9ydGVyLmNwcAppbmRleCA3ODNkOTUxLi42MDJhYzFjIDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9zaGFyZS92bS9zZXJ2aWNlcy9tZW1SZXBvcnRlci5jcHAKKysrIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vc2VydmljZXMvbWVtUmVwb3J0ZXIuY3BwCkBAIC01MSw2ICs1MSw3IEBACiAKICAgcmVwb3J0X3N1bW1hcmllcyhiYXNlbGluZSk7CiAgIGlmICghc3VtbWFyeV9vbmx5ICYmIE1lbVRyYWNrZXI6OnRyYWNrX2NhbGxzaXRlKCkpIHsKKyAgICByZXBvcnRfdmlydHVhbF9tZW1vcnlfbWFwKGJhc2VsaW5lKTsKICAgICByZXBvcnRfY2FsbHNpdGVzKGJhc2VsaW5lKTsKICAgfQogICBfb3V0cHV0ZXIuZG9uZSgpOwpAQCAtNzQsNiArNzUsMjUgQEAKICAgX291dHB1dGVyLmRvbmVfY2F0ZWdvcnlfc3VtbWFyeSgpOwogfQogCit2b2lkIEJhc2VsaW5lUmVwb3J0ZXI6OnJlcG9ydF92aXJ0dWFsX21lbW9yeV9tYXAoY29uc3QgTWVtQmFzZWxpbmUmIGJhc2VsaW5lKSB7CisgIF9vdXRwdXRlci5zdGFydF92aXJ0dWFsX21lbW9yeV9tYXAoKTsKKyAgTWVtQmFzZWxpbmUqIHBCTCA9IGNvbnN0X2Nhc3Q8TWVtQmFzZWxpbmUqPigmYmFzZWxpbmUpOworICBNZW1Qb2ludGVyQXJyYXlJdGVyYXRvckltcGwgaXRyID0gTWVtUG9pbnRlckFycmF5SXRlcmF0b3JJbXBsKHBCTC0+X3ZtX21hcCk7CisgIFZNTWVtUmVnaW9uRXgqIHJnbiA9IChWTU1lbVJlZ2lvbkV4KilpdHIuY3VycmVudCgpOworICB3aGlsZSAocmduICE9IE5VTEwpIHsKKyAgICBpZiAocmduLT5pc19yZXNlcnZlZF9yZWdpb24oKSkgeworICAgICAgX291dHB1dGVyLnJlc2VydmVkX21lbW9yeV9yZWdpb24oRkxBR1NfVE9fTUVNT1JZX1RZUEUocmduLT5mbGFncygpKSwKKyAgICAgICAgcmduLT5iYXNlKCksIHJnbi0+YmFzZSgpICsgcmduLT5zaXplKCksIGFtb3VudF9pbl9jdXJyZW50X3NjYWxlKHJnbi0+c2l6ZSgpKSwgcmduLT5wYygpKTsKKyAgICB9IGVsc2UgeworICAgICAgX291dHB1dGVyLmNvbW1pdHRlZF9tZW1vcnlfcmVnaW9uKHJnbi0+YmFzZSgpLCByZ24tPmJhc2UoKSArIHJnbi0+c2l6ZSgpLAorICAgICAgICBhbW91bnRfaW5fY3VycmVudF9zY2FsZShyZ24tPnNpemUoKSksIHJnbi0+cGMoKSk7CisgICAgfQorICAgIHJnbiA9IChWTU1lbVJlZ2lvbkV4KilpdHIubmV4dCgpOworICB9CisKKyAgX291dHB1dGVyLmRvbmVfdmlydHVhbF9tZW1vcnlfbWFwKCk7Cit9CisKIHZvaWQgQmFzZWxpbmVSZXBvcnRlcjo6cmVwb3J0X2NhbGxzaXRlcyhjb25zdCBNZW1CYXNlbGluZSYgYmFzZWxpbmUpIHsKICAgX291dHB1dGVyLnN0YXJ0X2NhbGxzaXRlKCk7CiAgIE1lbUJhc2VsaW5lKiBwQkwgPSBjb25zdF9jYXN0PE1lbUJhc2VsaW5lKj4oJmJhc2VsaW5lKTsKQEAgLTMyNCw2ICszNDQsNDAgQEAKICAgX291dHB1dC0+cHJpbnRfY3IoIiAiKTsKIH0KIAorCit2b2lkIEJhc2VsaW5lVFRZT3V0cHV0ZXI6OnN0YXJ0X3ZpcnR1YWxfbWVtb3J5X21hcCgpIHsKKyAgX291dHB1dC0+cHJpbnRfY3IoIlZpcnR1YWwgbWVtb3J5IG1hcDoiKTsKK30KKwordm9pZCBCYXNlbGluZVRUWU91dHB1dGVyOjpyZXNlcnZlZF9tZW1vcnlfcmVnaW9uKE1FTUZMQUdTIHR5cGUsIGFkZHJlc3MgYmFzZSwgYWRkcmVzcyBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUsIGFkZHJlc3MgcGMpIHsKKyAgY29uc3QgY2hhciogdW5pdCA9IG1lbW9yeV91bml0KF9zY2FsZSk7CisgIGNoYXIgYnVmWzEyOF07CisgIGludCAgb2Zmc2V0OworICBfb3V0cHV0LT5wcmludF9jcigiICIpOworICBfb3V0cHV0LT5wcmludF9jcigiWyIgUFRSX0ZPUk1BVCAiIC0gIiBQVFJfRk9STUFUICJdIHJlc2VydmVkICVkJXMgZm9yICVzIiwgYmFzZSwgZW5kLCBzaXplLCB1bml0LAorICAgICAgICAgICAgTWVtQmFzZWxpbmU6OnR5cGUybmFtZSh0eXBlKSk7CisgIGlmIChvczo6ZGxsX2FkZHJlc3NfdG9fZnVuY3Rpb25fbmFtZShwYywgYnVmLCBzaXplb2YoYnVmKSwgJm9mZnNldCkpIHsKKyAgICAgIF9vdXRwdXQtPnByaW50X2NyKCJcdFx0ZnJvbSBbJXMrMHgleF0iLCBidWYsIG9mZnNldCk7CisgIH0KK30KKwordm9pZCBCYXNlbGluZVRUWU91dHB1dGVyOjpjb21taXR0ZWRfbWVtb3J5X3JlZ2lvbihhZGRyZXNzIGJhc2UsIGFkZHJlc3MgZW5kLCBzaXplX3Qgc2l6ZSwgYWRkcmVzcyBwYykgeworICBjb25zdCBjaGFyKiB1bml0ID0gbWVtb3J5X3VuaXQoX3NjYWxlKTsKKyAgY2hhciBidWZbMTI4XTsKKyAgaW50ICBvZmZzZXQ7CisgIF9vdXRwdXQtPnByaW50KCJcdFsiIFBUUl9GT1JNQVQgIiAtICIgUFRSX0ZPUk1BVCAiXSBjb21taXR0ZWQgJWQlcyIsIGJhc2UsIGVuZCwgc2l6ZSwgdW5pdCk7CisgIGlmIChvczo6ZGxsX2FkZHJlc3NfdG9fZnVuY3Rpb25fbmFtZShwYywgYnVmLCBzaXplb2YoYnVmKSwgJm9mZnNldCkpIHsKKyAgICAgIF9vdXRwdXQtPnByaW50X2NyKCIgZnJvbSBbJXMrMHgleF0iLCBidWYsIG9mZnNldCk7CisgIH0KK30KKwordm9pZCBCYXNlbGluZVRUWU91dHB1dGVyOjpkb25lX3ZpcnR1YWxfbWVtb3J5X21hcCgpIHsKKyAgX291dHB1dC0+cHJpbnRfY3IoIiAiKTsKK30KKworCisKIHZvaWQgQmFzZWxpbmVUVFlPdXRwdXRlcjo6c3RhcnRfY2FsbHNpdGUoKSB7CiAgIF9vdXRwdXQtPnByaW50X2NyKCJEZXRhaWxzOiIpOwogICBfb3V0cHV0LT5wcmludF9jcigiICIpOwpAQCAtMzM3LDcgKzM5MSw3IEBACiAgIHNpemVfdCBtYWxsb2NfY291bnQpIHsKICAgaWYgKG1hbGxvY19hbXQgPiAwKSB7CiAgICAgY29uc3QgY2hhciogdW5pdCA9IG1lbW9yeV91bml0KF9zY2FsZSk7Ci0gICAgY2hhciBidWZbNjRdOworICAgIGNoYXIgYnVmWzEyOF07CiAgICAgaW50ICBvZmZzZXQ7CiAgICAgaWYgKHBjID09IDApIHsKICAgICAgIF9vdXRwdXQtPnByaW50KCJbQk9PVFNUUkFQXSUxOHMiLCAiICIpOwpAQCAtMzU3LDcgKzQxMSw3IEBACiAgIHNpemVfdCBjb21taXR0ZWRfYW10KSB7CiAgIGlmIChyZXNlcnZlZF9hbXQgPiAwKSB7CiAgICAgY29uc3QgY2hhciogdW5pdCA9IG1lbW9yeV91bml0KF9zY2FsZSk7Ci0gICAgY2hhciBidWZbNjRdOworICAgIGNoYXIgYnVmWzEyOF07CiAgICAgaW50ICBvZmZzZXQ7CiAgICAgaWYgKHBjID09IDApIHsKICAgICAgIF9vdXRwdXQtPnByaW50KCJbQk9PVFNUUkFQXSUxOHMiLCAiICIpOwpAQCAtNTAyLDcgKzU1Niw3IEBACiAgICAgaW50IG1hbGxvY19kaWZmLCBpbnQgbWFsbG9jX2NvdW50X2RpZmYpIHsKICAgaWYgKG1hbGxvY19kaWZmICE9IDApIHsKICAgICBjb25zdCBjaGFyKiB1bml0ID0gbWVtb3J5X3VuaXQoX3NjYWxlKTsKLSAgICBjaGFyIGJ1Zls2NF07CisgICAgY2hhciBidWZbMTI4XTsKICAgICBpbnQgIG9mZnNldDsKICAgICBpZiAocGMgPT0gMCkgewogICAgICAgX291dHB1dC0+cHJpbnRfY3IoIltCT09UU1RSQVBdJTE4cyIsICIgIik7CmRpZmYgLS1naXQgYS9ob3RzcG90L3NyYy9zaGFyZS92bS9zZXJ2aWNlcy9tZW1SZXBvcnRlci5ocHAgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9zZXJ2aWNlcy9tZW1SZXBvcnRlci5ocHAKaW5kZXggNDU5NWIyNy4uN2E1MzcyZCAxMDA2NDQKLS0tIGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vc2VydmljZXMvbWVtUmVwb3J0ZXIuaHBwCisrKyBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL3NlcnZpY2VzL21lbVJlcG9ydGVyLmhwcApAQCAtOTMsNiArOTMsMTEgQEAKIAogICB2aXJ0dWFsIHZvaWQgZG9uZV9jYXRlZ29yeV9zdW1tYXJ5KCkgPSAwOwogCisgIHZpcnR1YWwgdm9pZCBzdGFydF92aXJ0dWFsX21lbW9yeV9tYXAoKSA9IDA7CisgIHZpcnR1YWwgdm9pZCByZXNlcnZlZF9tZW1vcnlfcmVnaW9uKE1FTUZMQUdTIHR5cGUsIGFkZHJlc3MgYmFzZSwgYWRkcmVzcyBlbmQsIHNpemVfdCBzaXplLCBhZGRyZXNzIHBjKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBjb21taXR0ZWRfbWVtb3J5X3JlZ2lvbihhZGRyZXNzIGJhc2UsIGFkZHJlc3MgZW5kLCBzaXplX3Qgc2l6ZSwgYWRkcmVzcyBwYykgPSAwOworICB2aXJ0dWFsIHZvaWQgZG9uZV92aXJ0dWFsX21lbW9yeV9tYXAoKSA9IDA7CisKICAgLyoKICAgICogIFJlcG9ydCBjYWxsc2l0ZSBpbmZvcm1hdGlvbgogICAgKi8KQEAgLTEzNiw2ICsxNDEsNyBAQAogCiAgcHJpdmF0ZToKICAgdm9pZCByZXBvcnRfc3VtbWFyaWVzKGNvbnN0IE1lbUJhc2VsaW5lJiBiYXNlbGluZSk7CisgIHZvaWQgcmVwb3J0X3ZpcnR1YWxfbWVtb3J5X21hcChjb25zdCBNZW1CYXNlbGluZSYgYmFzZWxpbmUpOwogICB2b2lkIHJlcG9ydF9jYWxsc2l0ZXMoY29uc3QgTWVtQmFzZWxpbmUmIGJhc2VsaW5lKTsKIAogICB2b2lkIGRpZmZfc3VtbWFyaWVzKGNvbnN0IE1lbUJhc2VsaW5lJiBjdXIsIGNvbnN0IE1lbUJhc2VsaW5lJiBwcmV2KTsKQEAgLTI1MSw2ICsyNTcsMTMgQEAKIAogICB2b2lkIGRvbmVfY2F0ZWdvcnlfc3VtbWFyeSgpOwogCisgIC8vIHZpcnR1YWwgbWVtb3J5IG1hcAorICB2b2lkIHN0YXJ0X3ZpcnR1YWxfbWVtb3J5X21hcCgpOworICB2b2lkIHJlc2VydmVkX21lbW9yeV9yZWdpb24oTUVNRkxBR1MgdHlwZSwgYWRkcmVzcyBiYXNlLCBhZGRyZXNzIGVuZCwgc2l6ZV90IHNpemUsIGFkZHJlc3MgcGMpOworICB2b2lkIGNvbW1pdHRlZF9tZW1vcnlfcmVnaW9uKGFkZHJlc3MgYmFzZSwgYWRkcmVzcyBlbmQsIHNpemVfdCBzaXplLCBhZGRyZXNzIHBjKTsKKyAgdm9pZCBkb25lX3ZpcnR1YWxfbWVtb3J5X21hcCgpOworCisKICAgLyoKICAgICogIFJlcG9ydCBjYWxsc2l0ZSBpbmZvcm1hdGlvbgogICAgKi8KZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL3NlcnZpY2VzL21lbVNuYXBzaG90LmNwcCBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL3NlcnZpY2VzL21lbVNuYXBzaG90LmNwcAppbmRleCBmODYwNTc2Li4yMGUxY2U2IDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9zaGFyZS92bS9zZXJ2aWNlcy9tZW1TbmFwc2hvdC5jcHAKKysrIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vc2VydmljZXMvbWVtU25hcHNob3QuY3BwCkBAIC0zMSw2ICszMSwyMjAgQEAKICNpbmNsdWRlICJzZXJ2aWNlcy9tZW1TbmFwc2hvdC5ocHAiCiAjaW5jbHVkZSAic2VydmljZXMvbWVtVHJhY2tlci5ocHAiCiAKKworYm9vbCBWTU1lbVBvaW50ZXJJdGVyYXRvcjo6aW5zZXJ0X3JlY29yZChNZW1Qb2ludGVyUmVjb3JkKiByZWMpIHsKKyAgVk1NZW1SZWdpb25FeCBuZXdfcmVjOworICBhc3NlcnQocmVjLT5pc19hbGxvY2F0aW9uX3JlY29yZCgpIHx8IHJlYy0+aXNfY29tbWl0X3JlY29yZCgpLAorICAgICJTYW5pdHkgY2hlY2siKTsKKyAgaWYgKE1lbVRyYWNrZXI6OnRyYWNrX2NhbGxzaXRlKCkpIHsKKyAgICBuZXdfcmVjLmluaXQoKE1lbVBvaW50ZXJSZWNvcmRFeCopcmVjKTsKKyAgfSBlbHNlIHsKKyAgICBuZXdfcmVjLmluaXQocmVjKTsKKyAgfQorICByZXR1cm4gaW5zZXJ0KCZuZXdfcmVjKTsKK30KKworYm9vbCBWTU1lbVBvaW50ZXJJdGVyYXRvcjo6aW5zZXJ0X3JlY29yZF9hZnRlcihNZW1Qb2ludGVyUmVjb3JkKiByZWMpIHsKKyAgVk1NZW1SZWdpb25FeCBuZXdfcmVjOworICBhc3NlcnQocmVjLT5pc19hbGxvY2F0aW9uX3JlY29yZCgpIHx8IHJlYy0+aXNfY29tbWl0X3JlY29yZCgpLAorICAgICJTYW5pdHkgY2hlY2siKTsKKyAgaWYgKE1lbVRyYWNrZXI6OnRyYWNrX2NhbGxzaXRlKCkpIHsKKyAgICBuZXdfcmVjLmluaXQoKE1lbVBvaW50ZXJSZWNvcmRFeCopcmVjKTsKKyAgfSBlbHNlIHsKKyAgICBuZXdfcmVjLmluaXQocmVjKTsKKyAgfQorICByZXR1cm4gaW5zZXJ0X2FmdGVyKCZuZXdfcmVjKTsKK30KKworLy8gd2UgZG9uJ3QgY29uc29saWRhdGUgcmVzZXJ2ZWQgcmVnaW9ucywgc2luY2UgdGhleSBtYXkgYmUgY2F0ZWdvcml6ZWQKKy8vIGluIGRpZmZlcmVudCB0eXBlcy4KK2Jvb2wgVk1NZW1Qb2ludGVySXRlcmF0b3I6OmFkZF9yZXNlcnZlZF9yZWdpb24oTWVtUG9pbnRlclJlY29yZCogcmVjKSB7CisgIGFzc2VydChyZWMtPmlzX2FsbG9jYXRpb25fcmVjb3JkKCksICJTYW5pdHkgY2hlY2siKTsKKyAgVk1NZW1SZWdpb24qIGN1ciA9IChWTU1lbVJlZ2lvbiopY3VycmVudCgpOworCisgIC8vIHdlIGRvbid0IGhhdmUgYW55dGhpbmcgeWV0CisgIGlmIChjdXIgPT0gTlVMTCkgeworICAgIHJldHVybiBpbnNlcnRfcmVjb3JkKHJlYyk7CisgIH0KKworICBhc3NlcnQoY3VyLT5pc19yZXNlcnZlZF9yZWdpb24oKSwgIlNhbml0eSBjaGVjayIpOworICAvLyBkdXBsaWNhdGVkIHJlY29yZHMKKyAgaWYgKGN1ci0+aXNfc2FtZV9yZWdpb24ocmVjKSkgeworICAgIHJldHVybiB0cnVlOworICB9CisgIGFzc2VydChjdXItPmJhc2UoKSA+IHJlYy0+YWRkcigpLCAiSnVzdCBjaGVjazogbG9jYXRlKCkiKTsKKyAgYXNzZXJ0KHJlYy0+YWRkcigpICsgcmVjLT5zaXplKCkgPD0gY3VyLT5iYXNlKCksICJDYW4gbm90IG92ZXJsYXAiKTsKKyAgcmV0dXJuIGluc2VydF9yZWNvcmQocmVjKTsKK30KKworLy8gd2UgZG8gY29uc29saWRhdGUgY29tbWl0dGVkIHJlZ2lvbnMKK2Jvb2wgVk1NZW1Qb2ludGVySXRlcmF0b3I6OmFkZF9jb21taXR0ZWRfcmVnaW9uKE1lbVBvaW50ZXJSZWNvcmQqIHJlYykgeworICBhc3NlcnQocmVjLT5pc19jb21taXRfcmVjb3JkKCksICJTYW5pdHkgY2hlY2siKTsKKyAgVk1NZW1SZWdpb24qIGN1cjsKKyAgY3VyID0gKFZNTWVtUmVnaW9uKiljdXJyZW50KCk7CisgIGFzc2VydChjdXItPmlzX3Jlc2VydmVkX3JlZ2lvbigpICYmIGN1ci0+Y29udGFpbnNfcmVnaW9uKHJlYyksCisgICAgIlNhbml0eSBjaGVjayIpOworCisgIC8vIHRocmVhZCdzIG5hdGl2ZSBzdGFjayBpcyBhbHdheXMgbWFya2VkIGFzICJjb21taXR0ZWQiLCBpZ25vcmUKKyAgLy8gdGhlICJjb21taXQiIG9wZXJhdGlvbiBmb3IgY3JlYXRpbmcgc3RhY2sgZ3VhcmQgcGFnZXMKKyAgaWYgKEZMQUdTX1RPX01FTU9SWV9UWVBFKGN1ci0+ZmxhZ3MoKSkgPT0gbXRUaHJlYWRTdGFjayAmJgorICAgICAgRkxBR1NfVE9fTUVNT1JZX1RZUEUocmVjLT5mbGFncygpKSAhPSBtdFRocmVhZFN0YWNrKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBjdXIgPSAoVk1NZW1SZWdpb24qKW5leHQoKTsKKyAgd2hpbGUgKGN1ciAhPSBOVUxMICYmIGN1ci0+aXNfY29tbWl0dGVkX3JlZ2lvbigpKSB7CisgICAgLy8gZHVwbGljYXRlZCBjb21taXQgcmVjb3JkcworICAgIGlmKGN1ci0+Y29udGFpbnNfcmVnaW9uKHJlYykpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoY3VyLT5iYXNlKCkgPiByZWMtPmFkZHIoKSkgeworICAgICAgLy8gY29tbWl0dGVkIHJlZ2lvbnMgY2FuIG5vdCBvdmVybGFwCisgICAgICBhc3NlcnQocmVjLT5hZGRyKCkgKyByZWMtPnNpemUoKSA8PSBjdXItPmJhc2UoKSwgIkNhbiBub3Qgb3ZlcmxhcCIpOworICAgICAgaWYgKHJlYy0+YWRkcigpICsgcmVjLT5zaXplKCkgPT0gY3VyLT5iYXNlKCkpIHsKKyAgICAgICAgY3VyLT5leHBhbmRfcmVnaW9uKHJlYy0+YWRkcigpLCByZWMtPnNpemUoKSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGluc2VydF9yZWNvcmQocmVjKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGN1ci0+YmFzZSgpICsgY3VyLT5zaXplKCkgPT0gcmVjLT5hZGRyKCkpIHsKKyAgICAgIGN1ci0+ZXhwYW5kX3JlZ2lvbihyZWMtPmFkZHIoKSwgcmVjLT5zaXplKCkpOworICAgICAgVk1NZW1SZWdpb24qIG5leHRfcmVnID0gKFZNTWVtUmVnaW9uKiluZXh0KCk7CisgICAgICAvLyBzZWUgaWYgd2UgY2FuIGNvbnNvbGlkYXRlIG5leHQgY29tbWl0dGVkIHJlZ2lvbgorICAgICAgaWYgKG5leHRfcmVnICE9IE5VTEwgJiYgbmV4dF9yZWctPmlzX2NvbW1pdHRlZF9yZWdpb24oKSAmJgorICAgICAgICBuZXh0X3JlZy0+YmFzZSgpID09IGN1ci0+YmFzZSgpICsgY3VyLT5zaXplKCkpIHsKKyAgICAgICAgICBjdXItPmV4cGFuZF9yZWdpb24obmV4dF9yZWctPmJhc2UoKSwgbmV4dF9yZWctPnNpemUoKSk7CisgICAgICAgICAgcmVtb3ZlKCk7CisgICAgICB9CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgY3VyID0gKFZNTWVtUmVnaW9uKiluZXh0KCk7CisgIH0KKyAgcmV0dXJuIGluc2VydF9yZWNvcmQocmVjKTsKK30KKworYm9vbCBWTU1lbVBvaW50ZXJJdGVyYXRvcjo6cmVtb3ZlX3VuY29tbWl0dGVkX3JlZ2lvbihNZW1Qb2ludGVyUmVjb3JkKiByZWMpIHsKKyAgYXNzZXJ0KHJlYy0+aXNfdW5jb21taXRfcmVjb3JkKCksICJzYW5pdHkgY2hlY2siKTsKKyAgVk1NZW1SZWdpb24qIGN1cjsKKyAgY3VyID0gKFZNTWVtUmVnaW9uKiljdXJyZW50KCk7CisgIGFzc2VydChjdXItPmlzX3Jlc2VydmVkX3JlZ2lvbigpICYmIGN1ci0+Y29udGFpbnNfcmVnaW9uKHJlYyksCisgICAgIlNhbml0eSBjaGVjayIpOworICAvLyB0aHJlYWQncyBuYXRpdmUgc3RhY2sgaXMgYWx3YXlzIG1hcmtlZCBhcyAiY29tbWl0dGVkIiwgaWdub3JlCisgIC8vIHRoZSAiY29tbWl0IiBvcGVyYXRpb24gZm9yIGNyZWF0aW5nIHN0YWNrIGd1YXJkIHBhZ2VzCisgIGlmIChGTEFHU19UT19NRU1PUllfVFlQRShjdXItPmZsYWdzKCkpID09IG10VGhyZWFkU3RhY2sgJiYKKyAgICAgIEZMQUdTX1RPX01FTU9SWV9UWVBFKHJlYy0+ZmxhZ3MoKSkgIT0gbXRUaHJlYWRTdGFjaykgeworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgY3VyID0gKFZNTWVtUmVnaW9uKiluZXh0KCk7CisgIHdoaWxlIChjdXIgIT0gTlVMTCAmJiBjdXItPmlzX2NvbW1pdHRlZF9yZWdpb24oKSkgeworICAgIC8vIHJlZ2lvbiBhbHJlYWR5IHVuY29tbWl0dGVkLCBtdXN0IGJlIGR1ZSB0byBkdXBsaWNhdGVkIHJlY29yZAorICAgIGlmIChjdXItPmFkZHIoKSA+PSByZWMtPmFkZHIoKSArIHJlYy0+c2l6ZSgpKSB7CisgICAgICBicmVhazsKKyAgICB9IGVsc2UgaWYgKGN1ci0+Y29udGFpbnNfcmVnaW9uKHJlYykpIHsKKyAgICAgIC8vIHVuY29tbWl0IHdob2xlIHJlZ2lvbgorICAgICAgaWYgKGN1ci0+aXNfc2FtZV9yZWdpb24ocmVjKSkgeworICAgICAgICByZW1vdmUoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9IGVsc2UgaWYgKHJlYy0+YWRkcigpID09IGN1ci0+YWRkcigpIHx8CisgICAgICAgIHJlYy0+YWRkcigpICsgcmVjLT5zaXplKCkgPT0gY3VyLT5hZGRyKCkgKyBjdXItPnNpemUoKSkgeworICAgICAgICAvLyB1bmNvbW1pdHRlZCBmcm9tIGVpdGhlciBlbmQgb2YgY3VycmVudCBtZW1vcnkgcmVnaW9uLgorICAgICAgICBjdXItPmV4Y2x1ZGVfcmVnaW9uKHJlYy0+YWRkcigpLCByZWMtPnNpemUoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfSBlbHNlIHsgLy8gc3BsaXQgdGhlIGNvbW1pdHRlZCByZWdpb24gYW5kIHJlbGVhc2UgdGhlIG1pZGRsZQorICAgICAgICBhZGRyZXNzIGhpZ2hfYWRkciA9IGN1ci0+YWRkcigpICsgY3VyLT5zaXplKCk7CisgICAgICAgIHNpemVfdCBzeiA9IGhpZ2hfYWRkciAtIHJlYy0+YWRkcigpOworICAgICAgICBjdXItPmV4Y2x1ZGVfcmVnaW9uKHJlYy0+YWRkcigpLCBzeik7CisgICAgICAgIHN6ID0gaGlnaF9hZGRyIC0gKHJlYy0+YWRkcigpICsgcmVjLT5zaXplKCkpOworICAgICAgICBpZiAoTWVtVHJhY2tlcjo6dHJhY2tfY2FsbHNpdGUoKSkgeworICAgICAgICAgIE1lbVBvaW50ZXJSZWNvcmRFeCB0bXAocmVjLT5hZGRyKCkgKyByZWMtPnNpemUoKSwgY3VyLT5mbGFncygpLCBzeiwKKyAgICAgICAgICAgICAoKFZNTWVtUmVnaW9uRXgqKWN1ciktPnBjKCkpOworICAgICAgICAgIHJldHVybiBpbnNlcnRfcmVjb3JkX2FmdGVyKCZ0bXApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIE1lbVBvaW50ZXJSZWNvcmQgdG1wKHJlYy0+YWRkcigpICsgcmVjLT5zaXplKCksIGN1ci0+ZmxhZ3MoKSwgc3opOworICAgICAgICAgIHJldHVybiBpbnNlcnRfcmVjb3JkX2FmdGVyKCZ0bXApOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGN1ciA9IChWTU1lbVJlZ2lvbiopbmV4dCgpOworICB9CisKKyAgLy8gd2UgbWF5IG5vdCBmaW5kIGNvbW1pdHRlZCByZWNvcmQgZHVlIHRvIGR1cGxpY2F0ZWQgcmVjb3JkcworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBWTU1lbVBvaW50ZXJJdGVyYXRvcjo6cmVtb3ZlX3JlbGVhc2VkX3JlZ2lvbihNZW1Qb2ludGVyUmVjb3JkKiByZWMpIHsKKyAgYXNzZXJ0KHJlYy0+aXNfZGVhbGxvY2F0aW9uX3JlY29yZCgpLCAiU2FuaXR5IGNoZWNrIik7CisgIFZNTWVtUmVnaW9uKiBjdXIgPSAoVk1NZW1SZWdpb24qKWN1cnJlbnQoKTsKKyAgYXNzZXJ0KGN1ci0+aXNfcmVzZXJ2ZWRfcmVnaW9uKCkgJiYgY3VyLT5jb250YWluc19yZWdpb24ocmVjKSwKKyAgICAiU2FuaXR5IGNoZWNrIik7CisjaWZkZWYgQVNTRVJUCisgIFZNTWVtUmVnaW9uKiBuZXh0X3JlZyA9IChWTU1lbVJlZ2lvbiopcGVla19uZXh0KCk7CisgIC8vIHNob3VsZCBub3QgaGF2ZSBhbnkgY29tbWl0dGVkIG1lbW9yeSBpbiB0aGlzIHJlc2VydmVkIHJlZ2lvbgorICBhc3NlcnQobmV4dF9yZWcgPT0gTlVMTCB8fCAhbmV4dF9yZWctPmlzX2NvbW1pdHRlZF9yZWdpb24oKSwgIlNhbml0eSBjaGVjayIpOworI2VuZGlmCisgIGlmIChyZWMtPmlzX3NhbWVfcmVnaW9uKGN1cikpIHsKKyAgICByZW1vdmUoKTsKKyAgfSBlbHNlIGlmIChyZWMtPmFkZHIoKSA9PSBjdXItPmFkZHIoKSB8fAorICAgIHJlYy0+YWRkcigpICsgcmVjLT5zaXplKCkgPT0gY3VyLT5hZGRyKCkgKyBjdXItPnNpemUoKSkgeworICAgIC8vIHJlbGVhc2VkIHJlZ2lvbiBpcyBhdCBlaXRoZXIgZW5kIG9mIHRoaXMgcmVnaW9uCisgICAgY3VyLT5leGNsdWRlX3JlZ2lvbihyZWMtPmFkZHIoKSwgcmVjLT5zaXplKCkpOworICB9IGVsc2UgeyAvLyBzcGxpdCB0aGUgcmVzZXJ2ZWQgcmVnaW9uIGFuZCByZWxlYXNlIHRoZSBtaWRkbGUKKyAgICBhZGRyZXNzIGhpZ2hfYWRkciA9IGN1ci0+YWRkcigpICsgY3VyLT5zaXplKCk7CisgICAgc2l6ZV90IHN6ID0gaGlnaF9hZGRyIC0gcmVjLT5hZGRyKCk7CisgICAgY3VyLT5leGNsdWRlX3JlZ2lvbihyZWMtPmFkZHIoKSwgc3opOworICAgIHN6ID0gaGlnaF9hZGRyIC0gcmVjLT5hZGRyKCkgLSByZWMtPnNpemUoKTsKKyAgICBpZiAoTWVtVHJhY2tlcjo6dHJhY2tfY2FsbHNpdGUoKSkgeworICAgICAgTWVtUG9pbnRlclJlY29yZEV4IHRtcChyZWMtPmFkZHIoKSArIHJlYy0+c2l6ZSgpLCBjdXItPmZsYWdzKCksIHN6LAorICAgICAgICAoKFZNTWVtUmVnaW9uRXgqKWN1ciktPnBjKCkpOworICAgICAgcmV0dXJuIGluc2VydF9yZXNlcnZlZF9yZWdpb24oJnRtcCk7CisgICAgfSBlbHNlIHsKKyAgICAgIE1lbVBvaW50ZXJSZWNvcmQgdG1wKHJlYy0+YWRkcigpICsgcmVjLT5zaXplKCksIGN1ci0+ZmxhZ3MoKSwgc3opOworICAgICAgcmV0dXJuIGluc2VydF9yZXNlcnZlZF9yZWdpb24oJnRtcCk7CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworfQorCitib29sIFZNTWVtUG9pbnRlckl0ZXJhdG9yOjppbnNlcnRfcmVzZXJ2ZWRfcmVnaW9uKE1lbVBvaW50ZXJSZWNvcmQqIHJlYykgeworICAvLyBza2lwIGFsbCAnY29tbWl0JyByZWNvcmRzIGFzc29jaWF0ZWQgd2l0aCBwcmV2aW91cyByZXNlcnZlZCByZWdpb24KKyAgVk1NZW1SZWdpb24qIHAgPSAoVk1NZW1SZWdpb24qKW5leHQoKTsKKyAgd2hpbGUgKHAgIT0gTlVMTCAmJiBwLT5pc19jb21taXR0ZWRfcmVnaW9uKCkgJiYKKyAgICAgICAgIHAtPmJhc2UoKSArIHAtPnNpemUoKSA8IHJlYy0+YWRkcigpKSB7CisgICAgcCA9IChWTU1lbVJlZ2lvbiopbmV4dCgpOworICB9CisgIHJldHVybiBpbnNlcnRfcmVjb3JkKHJlYyk7Cit9CisKK2Jvb2wgVk1NZW1Qb2ludGVySXRlcmF0b3I6OnNwbGl0X3Jlc2VydmVkX3JlZ2lvbihWTU1lbVJlZ2lvbiogcmduLCBhZGRyZXNzIG5ld19yZ25fYWRkciwgc2l6ZV90IG5ld19yZ25fc2l6ZSkgeworICBhc3NlcnQocmduLT5jb250YWluc19yZWdpb24obmV3X3Jnbl9hZGRyLCBuZXdfcmduX3NpemUpLCAiTm90IGZ1bGx5IGNvbnRhaW5lZCIpOworICBhZGRyZXNzIHBjID0gKE1lbVRyYWNrZXI6OnRyYWNrX2NhbGxzaXRlKCkgPyAoKFZNTWVtUmVnaW9uRXgqKXJnbiktPnBjKCkgOiBOVUxMKTsKKyAgaWYgKHJnbi0+YmFzZSgpID09IG5ld19yZ25fYWRkcikgeyAvLyBuZXcgcmVnaW9uIGlzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJlZ2lvbgorICAgIHNpemVfdCBzeiA9IHJnbi0+c2l6ZSgpIC0gbmV3X3Jnbl9zaXplOworICAgIC8vIHRoZSBvcmlnaW5hbCByZWdpb24gYmVjb21lcyAnbmV3JyByZWdpb24KKyAgICByZ24tPmV4Y2x1ZGVfcmVnaW9uKG5ld19yZ25fYWRkciArIG5ld19yZ25fc2l6ZSwgc3opOworICAgICAvLyByZW1haW5pbmcgYmVjb21lcyBuZXh0IHJlZ2lvbgorICAgIE1lbVBvaW50ZXJSZWNvcmRFeCBuZXh0X3JnbihuZXdfcmduX2FkZHIgKyBuZXdfcmduX3NpemUsIHJnbi0+ZmxhZ3MoKSwgc3osIHBjKTsKKyAgICByZXR1cm4gaW5zZXJ0X3Jlc2VydmVkX3JlZ2lvbigmbmV4dF9yZ24pOworICB9IGVsc2UgaWYgKHJnbi0+YmFzZSgpICsgcmduLT5zaXplKCkgPT0gbmV3X3Jnbl9hZGRyICsgbmV3X3Jnbl9zaXplKSB7CisgICAgcmduLT5leGNsdWRlX3JlZ2lvbihuZXdfcmduX2FkZHIsIG5ld19yZ25fc2l6ZSk7CisgICAgTWVtUG9pbnRlclJlY29yZEV4IG5leHRfcmduKG5ld19yZ25fYWRkciwgcmduLT5mbGFncygpLCBuZXdfcmduX3NpemUsIHBjKTsKKyAgICByZXR1cm4gaW5zZXJ0X3Jlc2VydmVkX3JlZ2lvbigmbmV4dF9yZ24pOworICB9IGVsc2UgeworICAgIC8vIHRoZSBvcmdpbmFsIHJlZ2lvbiB3aWxsIGJlIHNwbGl0IGludG8gdGhyZWUKKyAgICBhZGRyZXNzIHJnbl9oaWdoX2FkZHIgPSByZ24tPmJhc2UoKSArIHJnbi0+c2l6ZSgpOworICAgIC8vIGZpcnN0IHJlZ2lvbgorICAgIHJnbi0+ZXhjbHVkZV9yZWdpb24obmV3X3Jnbl9hZGRyLCAocmduX2hpZ2hfYWRkciAtIG5ld19yZ25fYWRkcikpOworICAgIC8vIHRoZSBzZWNvbmQgcmVnaW9uIGlzIHRoZSBuZXcgcmVnaW9uCisgICAgTWVtUG9pbnRlclJlY29yZEV4IG5ld19yZ24obmV3X3Jnbl9hZGRyLCByZ24tPmZsYWdzKCksIG5ld19yZ25fc2l6ZSwgcGMpOworICAgIGlmICghaW5zZXJ0X3Jlc2VydmVkX3JlZ2lvbigmbmV3X3JnbikpIHJldHVybiBmYWxzZTsKKyAgICAvLyB0aGUgcmVtYWluaW5nIHJlZ2lvbgorICAgIE1lbVBvaW50ZXJSZWNvcmRFeCByZW1fcmduKG5ld19yZ25fYWRkciArIG5ld19yZ25fc2l6ZSwgcmduLT5mbGFncygpLAorICAgICAgcmduX2hpZ2hfYWRkciAtIChuZXdfcmduX2FkZHIgKyBuZXdfcmduX3NpemUpLCBwYyk7CisgICAgcmV0dXJuIGluc2VydF9yZXNlcnZlZF9yZWdpb24oJnJlbV9yZ24pOworICB9Cit9CisKIHN0YXRpYyBpbnQgc29ydF9pbl9zZXFfb3JkZXIoY29uc3Qgdm9pZCogcDEsIGNvbnN0IHZvaWQqIHAyKSB7CiAgIGFzc2VydChwMSAhPSBOVUxMICYmIHAyICE9IE5VTEwsICJTYW5pdHkgY2hlY2siKTsKICAgY29uc3QgTWVtUG9pbnRlclJlY29yZCogbXAxID0gKE1lbVBvaW50ZXJSZWNvcmQqKXAxOwpAQCAtNjEsMTEgKzI3NSwxMSBAQAogfQogCiAKLU1lbVBvaW50ZXJBcnJheUl0ZXJhdG9ySW1wbCBTdGFnaW5nQXJlYTo6dmlydHVhbF9tZW1vcnlfcmVjb3JkX3dhbGtlcigpIHsKK1ZNUmVjb3JkSXRlcmF0b3IgU3RhZ2luZ0FyZWE6OnZpcnR1YWxfbWVtb3J5X3JlY29yZF93YWxrZXIoKSB7CiAgIE1lbVBvaW50ZXJBcnJheSogYXJyID0gdm1fZGF0YSgpOwogICAvLyBzb3J0IGludG8gc2VxIG51bWJlciBvcmRlcgogICBhcnItPnNvcnQoKEZOX1NPUlQpc29ydF9pbl9zZXFfb3JkZXIpOwotICByZXR1cm4gTWVtUG9pbnRlckFycmF5SXRlcmF0b3JJbXBsKGFycik7CisgIHJldHVybiBWTVJlY29yZEl0ZXJhdG9yKGFycik7CiB9CiAKIApAQCAtMTM1LDYgKzM0OSw4IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgIH0KICAgICB9IGVsc2UgeworICAgICAgLy8gbG9jYXRlIG1hdGNoZWQgcmVjb3JkIGFuZC9vciBhbHNvIHBvc2l0aW9uIHRoZSBpdGVyYXRvciB0byBwcm9wZXIKKyAgICAgIC8vIGxvY2F0aW9uIGZvciB0aGlzIGluY29taW5nIHJlY29yZC4KICAgICAgIHAyID0gKE1lbVBvaW50ZXJSZWNvcmQqKW1hbGxvY19zdGFnaW5nX2l0ci5sb2NhdGUocDEtPmFkZHIoKSk7CiAgICAgICAvLyB3ZSBoYXZlIG5vdCBzZWVuIHRoaXMgbWVtb3J5IGJsb2NrLCBzbyBqdXN0IGFkZCB0byBzdGFnaW5nIGFyZWEKICAgICAgIGlmIChwMiA9PSBOVUxMKSB7CkBAIC0xOTksNyArNDE1LDcgQEAKICAgTWFsbG9jUmVjb3JkSXRlcmF0b3IgIG1hbGxvY19pdHIgPSBfc3RhZ2luZ19hcmVhLm1hbGxvY19yZWNvcmRfd2Fsa2VyKCk7CiAgIGJvb2wgcHJvbW90ZWQgPSBmYWxzZTsKICAgaWYgKHByb21vdGVfbWFsbG9jX3JlY29yZHMoJm1hbGxvY19pdHIpKSB7Ci0gICAgTWVtUG9pbnRlckFycmF5SXRlcmF0b3JJbXBsIHZtX2l0ciA9IF9zdGFnaW5nX2FyZWEudmlydHVhbF9tZW1vcnlfcmVjb3JkX3dhbGtlcigpOworICAgIFZNUmVjb3JkSXRlcmF0b3Igdm1faXRyID0gX3N0YWdpbmdfYXJlYS52aXJ0dWFsX21lbW9yeV9yZWNvcmRfd2Fsa2VyKCk7CiAgICAgaWYgKHByb21vdGVfdmlydHVhbF9tZW1vcnlfcmVjb3Jkcygmdm1faXRyKSkgewogICAgICAgcHJvbW90ZWQgPSB0cnVlOwogICAgIH0KQEAgLTIxOCw3ICs0MzQsNyBAQAogICAgIG1hdGNoZWRfcmVjID0gKE1lbVBvaW50ZXJSZWNvcmQqKW1hbGxvY19zbmFwc2hvdF9pdHIubG9jYXRlKG5ld19yZWMtPmFkZHIoKSk7CiAgICAgLy8gZm91bmQgbWF0Y2hlZCBtZW1vcnkgYmxvY2sKICAgICBpZiAobWF0Y2hlZF9yZWMgIT0gTlVMTCAmJiBuZXdfcmVjLT5hZGRyKCkgPT0gbWF0Y2hlZF9yZWMtPmFkZHIoKSkgewotICAgICAgLy8gc25hcHNob3QgYWxyZWFkeSBjb250YWlucyAnbGl2ZWQnIHJlY29yZHMKKyAgICAgIC8vIHNuYXBzaG90IGFscmVhZHkgY29udGFpbnMgJ2xpdmUnIHJlY29yZHMKICAgICAgIGFzc2VydChtYXRjaGVkX3JlYy0+aXNfYWxsb2NhdGlvbl9yZWNvcmQoKSB8fCBtYXRjaGVkX3JlYy0+aXNfYXJlbmFfc2l6ZV9yZWNvcmQoKSwKICAgICAgICAgICAgICAiU2FuaXR5IGNoZWNrIik7CiAgICAgICAvLyB1cGRhdGUgYmxvY2sgc3RhdGVzCkBAIC0yNzcsODcgKzQ5Myw2MCBAQAogYm9vbCBNZW1TbmFwc2hvdDo6cHJvbW90ZV92aXJ0dWFsX21lbW9yeV9yZWNvcmRzKE1lbVBvaW50ZXJBcnJheUl0ZXJhdG9yKiBpdHIpIHsKICAgVk1NZW1Qb2ludGVySXRlcmF0b3Igdm1fc25hcHNob3RfaXRyKF92bV9wdHJzKTsKICAgTWVtUG9pbnRlclJlY29yZCogbmV3X3JlYyA9IChNZW1Qb2ludGVyUmVjb3JkKilpdHItPmN1cnJlbnQoKTsKLSAgVk1NZW1SZWdpb25FeCBuZXdfdm1fcmVjOwotICBWTU1lbVJlZ2lvbiogIG1hdGNoZWRfcmVjOworICBWTU1lbVJlZ2lvbiogIHJlc2VydmVkX3JlYzsKICAgd2hpbGUgKG5ld19yZWMgIT0gTlVMTCkgewogICAgIGFzc2VydChuZXdfcmVjLT5pc192bV9wb2ludGVyKCksICJTYW5pdHkgY2hlY2siKTsKLSAgICBpZiAoTWVtVHJhY2tlcjo6dHJhY2tfY2FsbHNpdGUoKSkgewotICAgICAgbmV3X3ZtX3JlYy5pbml0KChNZW1Qb2ludGVyUmVjb3JkRXgqKW5ld19yZWMpOwotICAgIH0gZWxzZSB7Ci0gICAgICBuZXdfdm1fcmVjLmluaXQobmV3X3JlYyk7Ci0gICAgfQotICAgIG1hdGNoZWRfcmVjID0gKFZNTWVtUmVnaW9uKil2bV9zbmFwc2hvdF9pdHIubG9jYXRlKG5ld19yZWMtPmFkZHIoKSk7Ci0gICAgaWYgKG1hdGNoZWRfcmVjICE9IE5VTEwgJiYKLSAgICAgICAgKG1hdGNoZWRfcmVjLT5jb250YWlucygmbmV3X3ZtX3JlYykgfHwgbWF0Y2hlZF9yZWMtPmJhc2UoKSA9PSBuZXdfdm1fcmVjLmJhc2UoKSkpIHsKKworICAgIC8vIGxvY2F0ZSBhIHJlc2VydmVkIHJlZ2lvbiB0aGF0IGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgYWRkcmVzcywgb3IKKyAgICAvLyB0aGUgbmVhcmVzdCByZXNlcnZlZCByZWdpb24gaGFzIGJhc2UgYWRkcmVzcyBqdXN0IGFib3ZlIHRoZSBzcGVjaWZpZWQKKyAgICAvLyBhZGRyZXNzCisgICAgcmVzZXJ2ZWRfcmVjID0gKFZNTWVtUmVnaW9uKil2bV9zbmFwc2hvdF9pdHIubG9jYXRlKG5ld19yZWMtPmFkZHIoKSk7CisgICAgaWYgKHJlc2VydmVkX3JlYyAhPSBOVUxMICYmIHJlc2VydmVkX3JlYy0+Y29udGFpbnNfcmVnaW9uKG5ld19yZWMpKSB7CiAgICAgICAvLyBzbmFwc2hvdCBjYW4gb25seSBoYXZlICdsaXZlJyByZWNvcmRzCi0gICAgICBhc3NlcnQobWF0Y2hlZF9yZWMtPmlzX3Jlc2VydmVfcmVjb3JkKCksICJTYW5pdHkgY2hlY2siKTsKLSAgICAgIGlmIChuZXdfdm1fcmVjLmlzX3Jlc2VydmVfcmVjb3JkKCkgJiYgbWF0Y2hlZF9yZWMtPmJhc2UoKSA9PSBuZXdfdm1fcmVjLmJhc2UoKSkgewotICAgICAgICAvLyByZXNpemUgcmVzZXJ2ZWQgdmlydHVhbCBtZW1vcnkgcmFuZ2UKLSAgICAgICAgLy8gcmVzaXplIGhhcyB0byBjb3ZlciBjb21taXR0ZWQgYXJlYQotICAgICAgICBhc3NlcnQobmV3X3ZtX3JlYy5zaXplKCkgPj0gbWF0Y2hlZF9yZWMtPmNvbW1pdHRlZF9zaXplKCksICJTYW5pdHkgY2hlY2siKTsKLSAgICAgICAgbWF0Y2hlZF9yZWMtPnNldF9yZXNlcnZlZF9zaXplKG5ld192bV9yZWMuc2l6ZSgpKTsKLSAgICAgIH0gZWxzZSBpZiAobmV3X3ZtX3JlYy5pc19jb21taXRfcmVjb3JkKCkpIHsKLSAgICAgICAgLy8gY29tbWl0IG1lbW9yeSBpbnNpZGUgcmVzZXJ2ZWQgbWVtb3J5IHJhbmdlCi0gICAgICAgIGFzc2VydChuZXdfdm1fcmVjLmNvbW1pdHRlZF9zaXplKCkgPD0gbWF0Y2hlZF9yZWMtPnJlc2VydmVkX3NpemUoKSwgIlNhbml0eSBjaGVjayIpOwotICAgICAgICAvLyB0aHJlYWQgc3RhY2tzIGFyZSBtYXJrZWQgY29tbWl0dGVkLCBzbyB3ZSBpZ25vcmUgJ2NvbW1pdCcgcmVjb3JkIGZvciBjcmVhdGluZwotICAgICAgICAvLyBzdGFjayBndWFyZCBwYWdlcwotICAgICAgICBpZiAoRkxBR1NfVE9fTUVNT1JZX1RZUEUobWF0Y2hlZF9yZWMtPmZsYWdzKCkpICE9IG10VGhyZWFkU3RhY2spIHsKLSAgICAgICAgICBtYXRjaGVkX3JlYy0+Y29tbWl0KG5ld192bV9yZWMuY29tbWl0dGVkX3NpemUoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiAobmV3X3ZtX3JlYy5pc191bmNvbW1pdF9yZWNvcmQoKSkgewotICAgICAgICBpZiAoRkxBR1NfVE9fTUVNT1JZX1RZUEUobWF0Y2hlZF9yZWMtPmZsYWdzKCkpID09IG10VGhyZWFkU3RhY2spIHsKLSAgICAgICAgICAvLyBpZ25vcmUgJ3VuY29tbWl0JyByZWNvcmQgZnJvbSByZW1vdmluZyBzdGFjayBndWFyZCBwYWdlcywgdW5jb21taXQKLSAgICAgICAgICAvLyB0aHJlYWQgc3RhY2sgYXMgd2hvbGUKLSAgICAgICAgICBpZiAobWF0Y2hlZF9yZWMtPmNvbW1pdHRlZF9zaXplKCkgPT0gbmV3X3ZtX3JlYy5jb21taXR0ZWRfc2l6ZSgpKSB7Ci0gICAgICAgICAgICBtYXRjaGVkX3JlYy0+dW5jb21taXQobmV3X3ZtX3JlYy5jb21taXR0ZWRfc2l6ZSgpKTsKKyAgICAgIGFzc2VydChyZXNlcnZlZF9yZWMtPmlzX3Jlc2VydmVkX3JlZ2lvbigpLCAiU2FuaXR5IGNoZWNrIik7CisgICAgICBpZiAobmV3X3JlYy0+aXNfYWxsb2NhdGlvbl9yZWNvcmQoKSkgeworICAgICAgICBpZiAoIXJlc2VydmVkX3JlYy0+aXNfc2FtZV9yZWdpb24obmV3X3JlYykpIHsKKyAgICAgICAgICAvLyBvbmx5IGRlYWwgd2l0aCBzcGxpdCBhIGJpZ2dlciByZXNlcnZlZCByZWdpb24gaW50byBzbWFsbGVyIHJlZ2lvbnMuCisgICAgICAgICAgLy8gU28gZmFyLCBDRFMgaXMgdGhlIG9ubHkgdXNlIGNhc2UuCisgICAgICAgICAgaWYgKCF2bV9zbmFwc2hvdF9pdHIuc3BsaXRfcmVzZXJ2ZWRfcmVnaW9uKHJlc2VydmVkX3JlYywgbmV3X3JlYy0+YWRkcigpLCBuZXdfcmVjLT5zaXplKCkpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIC8vIHVuY29tbWl0IG1lbW9yeSBpbnNpZGUgcmVzZXJ2ZWQgbWVtb3J5IHJhbmdlCi0gICAgICAgICAgYXNzZXJ0KG5ld192bV9yZWMuY29tbWl0dGVkX3NpemUoKSA8PSBtYXRjaGVkX3JlYy0+Y29tbWl0dGVkX3NpemUoKSwKLSAgICAgICAgICAgICAgICAiU2FuaXR5IGNoZWNrIik7Ci0gICAgICAgICAgbWF0Y2hlZF9yZWMtPnVuY29tbWl0KG5ld192bV9yZWMuY29tbWl0dGVkX3NpemUoKSk7CiAgICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiAobmV3X3ZtX3JlYy5pc190eXBlX3RhZ2dpbmdfcmVjb3JkKCkpIHsKLSAgICAgICAgLy8gdGFnIHRoaXMgdmlydHVhbCBtZW1vcnkgcmFuZ2UgdG8gYSBtZW1vcnkgdHlwZQotICAgICAgICAvLyBjYW4gbm90IHJlLXRhZyBhIG1lbW9yeSByYW5nZSB0byBkaWZmZXJlbnQgdHlwZQotICAgICAgICBhc3NlcnQoRkxBR1NfVE9fTUVNT1JZX1RZUEUobWF0Y2hlZF9yZWMtPmZsYWdzKCkpID09IG10Tm9uZSB8fAotICAgICAgICAgICAgICAgRkxBR1NfVE9fTUVNT1JZX1RZUEUobWF0Y2hlZF9yZWMtPmZsYWdzKCkpID09IEZMQUdTX1RPX01FTU9SWV9UWVBFKG5ld192bV9yZWMuZmxhZ3MoKSksCisgICAgICB9IGVsc2UgaWYgKG5ld19yZWMtPmlzX3VuY29tbWl0X3JlY29yZCgpKSB7CisgICAgICAgIGlmICghdm1fc25hcHNob3RfaXRyLnJlbW92ZV91bmNvbW1pdHRlZF9yZWdpb24obmV3X3JlYykpIHsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAobmV3X3JlYy0+aXNfY29tbWl0X3JlY29yZCgpKSB7CisgICAgICAgIC8vIGluc2VydCBvciBleHBhbmQgZXhpc3RpbmcgY29tbWl0dGVkIHJlZ2lvbiB0byBjb3ZlciB0aGlzCisgICAgICAgIC8vIG5ld2x5IGNvbW1pdHRlZCByZWdpb24KKyAgICAgICAgaWYgKCF2bV9zbmFwc2hvdF9pdHIuYWRkX2NvbW1pdHRlZF9yZWdpb24obmV3X3JlYykpIHsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAobmV3X3JlYy0+aXNfZGVhbGxvY2F0aW9uX3JlY29yZCgpKSB7CisgICAgICAgIC8vIHJlbGVhc2UgcGFydCBvciBhbGwgbWVtb3J5IHJlZ2lvbgorICAgICAgICBpZiAoIXZtX3NuYXBzaG90X2l0ci5yZW1vdmVfcmVsZWFzZWRfcmVnaW9uKG5ld19yZWMpKSB7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKG5ld19yZWMtPmlzX3R5cGVfdGFnZ2luZ19yZWNvcmQoKSkgeworICAgICAgICAvLyB0YWcgdGhpcyByZXNlcnZlZCB2aXJ0dWFsIG1lbW9yeSByYW5nZSB0byBhIG1lbW9yeSB0eXBlLiBDYW4gbm90IHJlLXRhZyBhIG1lbW9yeSByYW5nZQorICAgICAgICAvLyB0byBkaWZmZXJlbnQgdHlwZS4KKyAgICAgICAgYXNzZXJ0KEZMQUdTX1RPX01FTU9SWV9UWVBFKHJlc2VydmVkX3JlYy0+ZmxhZ3MoKSkgPT0gbXROb25lIHx8CisgICAgICAgICAgICAgICBGTEFHU19UT19NRU1PUllfVFlQRShyZXNlcnZlZF9yZWMtPmZsYWdzKCkpID09IEZMQUdTX1RPX01FTU9SWV9UWVBFKG5ld19yZWMtPmZsYWdzKCkpLAogICAgICAgICAgICAgICAgIlNhbml0eSBjaGVjayIpOwotICAgICAgICBtYXRjaGVkX3JlYy0+dGFnKG5ld192bV9yZWMuZmxhZ3MoKSk7Ci0gICAgICB9IGVsc2UgaWYgKG5ld192bV9yZWMuaXNfcmVsZWFzZV9yZWNvcmQoKSkgewotICAgICAgICAvLyByZWxlYXNlIHBhcnQgb3Igd2hvbGUgbWVtb3J5IHJhbmdlCi0gICAgICAgIGlmIChuZXdfdm1fcmVjLmJhc2UoKSA9PSBtYXRjaGVkX3JlYy0+YmFzZSgpICYmCi0gICAgICAgICAgICBuZXdfdm1fcmVjLnNpemUoKSA9PSBtYXRjaGVkX3JlYy0+c2l6ZSgpKSB7Ci0gICAgICAgICAgLy8gcmVsZWFzZSB3aG9sZSB2aXJ0dWFsIG1lbW9yeSByYW5nZQotICAgICAgICAgIGFzc2VydChtYXRjaGVkX3JlYy0+Y29tbWl0dGVkX3NpemUoKSA9PSAwLCAiU2FuaXR5IGNoZWNrIik7Ci0gICAgICAgICAgdm1fc25hcHNob3RfaXRyLnJlbW92ZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIC8vIHBhcnRpYWwgcmVsZWFzZQotICAgICAgICAgIG1hdGNoZWRfcmVjLT5wYXJ0aWFsX3JlbGVhc2UobmV3X3ZtX3JlYy5iYXNlKCksIG5ld192bV9yZWMuc2l6ZSgpKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gbXVsdGlwbGUgcmVzZXJ2ZS9jb21taXQgb24gdGhlIHNhbWUgdmlydHVhbCBtZW1vcnkgcmFuZ2UKLSAgICAgICAgYXNzZXJ0KChuZXdfdm1fcmVjLmlzX3Jlc2VydmVfcmVjb3JkKCkgfHwgbmV3X3ZtX3JlYy5pc19jb21taXRfcmVjb3JkKCkpICYmCi0gICAgICAgICAgKG5ld192bV9yZWMuYmFzZSgpID09IG1hdGNoZWRfcmVjLT5iYXNlKCkgJiYgbmV3X3ZtX3JlYy5zaXplKCkgPT0gbWF0Y2hlZF9yZWMtPnNpemUoKSksCi0gICAgICAgICAgIlNhbml0eSBjaGVjayIpOwotICAgICAgICBtYXRjaGVkX3JlYy0+dGFnKG5ld192bV9yZWMuZmxhZ3MoKSk7Ci0gICAgICB9CisgICAgICAgIHJlc2VydmVkX3JlYy0+dGFnKG5ld19yZWMtPmZsYWdzKCkpOwogICAgIH0gZWxzZSB7Ci0gICAgICAvLyBubyBtYXRjaGVkIHJlY29yZAotICAgICAgaWYgKG5ld192bV9yZWMuaXNfcmVzZXJ2ZV9yZWNvcmQoKSkgewotICAgICAgICBpZiAobWF0Y2hlZF9yZWMgPT0gTlVMTCB8fCBtYXRjaGVkX3JlYy0+YmFzZSgpID4gbmV3X3ZtX3JlYy5iYXNlKCkpIHsKLSAgICAgICAgICBpZiAoIXZtX3NuYXBzaG90X2l0ci5pbnNlcnQoJm5ld192bV9yZWMpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIFNob3VsZE5vdFJlYWNoSGVyZSgpOwogICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpZiAoIXZtX3NuYXBzaG90X2l0ci5pbnNlcnRfYWZ0ZXIoJm5ld192bV9yZWMpKSB7CisgICAgICAvKgorICAgICAgICogVGhlIGFzc2VydGlvbiBmYWlsdXJlIGluZGljYXRlcyBtaXMtbWF0Y2hlZCB2aXJ0dWFsIG1lbW9yeSByZWNvcmRzLiBUaGUgbGlrZWx5CisgICAgICAgKiBzY2VuYXJpbyBpcywgdGhhdCBzb21lIHZpcnR1YWwgbWVtb3J5IG9wZXJhdGlvbnMgYXJlIG5vdCBnb2luZyB0aHJvdWdoIG9zOjp4eHh4X21lbW9yeSgpCisgICAgICAgKiBhcGksIHdoaWNoIGhhdmUgdG8gYmUgdHJhY2tlZCBtYW51YWxseS4gKHBlcmZNZW1vcnkgaXMgYW4gZXhhbXBsZSkuCisgICAgICAqLworICAgICAgYXNzZXJ0KG5ld19yZWMtPmlzX2FsbG9jYXRpb25fcmVjb3JkKCksICJTYW5pdHkgY2hlY2siKTsKKyAgICAgIGlmICghdm1fc25hcHNob3RfaXRyLmFkZF9yZXNlcnZlZF9yZWdpb24obmV3X3JlYykpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIHRocm93IG91dCBvYnNvbGV0ZSByZWNvcmRzLCB3aGljaCBhcmUgdGhlIGNvbW1pdC91bmNvbW1pdC9yZWxlYXNlL3RhZyByZWNvcmRzCi0gICAgICAgIC8vIG9uIG1lbW9yeSByZWdpb25zIHRoYXQgYXJlIGFscmVhZHkgcmVsZWFzZWQuCi0gICAgICB9CiAgIH0KICAgICBuZXdfcmVjID0gKE1lbVBvaW50ZXJSZWNvcmQqKWl0ci0+bmV4dCgpOwogICB9CkBAIC00MzMsNSArNjIyLDMzIEBACiAgICAgY3VyID0gKE1lbVBvaW50ZXJSZWNvcmQqKXZtX2l0ci5uZXh0KCk7CiAgIH0KIH0KKwordm9pZCBNZW1TbmFwc2hvdDo6ZHVtcF9hbGxfdm1fcG9pbnRlcnMoKSB7CisgIE1lbVBvaW50ZXJBcnJheUl0ZXJhdG9ySW1wbCBpdHIoX3ZtX3B0cnMpOworICBWTU1lbVJlZ2lvbiogcHRyID0gKFZNTWVtUmVnaW9uKilpdHIuY3VycmVudCgpOworICB0dHktPnByaW50X2NyKCJkdW1wIHZpcnR1YWwgbWVtb3J5IHBvaW50ZXJzOiIpOworICB3aGlsZSAocHRyICE9IE5VTEwpIHsKKyAgICBpZiAocHRyLT5pc19jb21taXR0ZWRfcmVnaW9uKCkpIHsKKyAgICAgIHR0eS0+cHJpbnQoIlx0Iik7CisgICAgfQorICAgIHR0eS0+cHJpbnQoIlsiIFBUUl9GT1JNQVQgIiAtICIgUFRSX0ZPUk1BVCAiXSBbJXhdIiwgcHRyLT5hZGRyKCksCisgICAgICAocHRyLT5hZGRyKCkgKyBwdHItPnNpemUoKSksIHB0ci0+ZmxhZ3MoKSk7CisKKyAgICBpZiAoTWVtVHJhY2tlcjo6dHJhY2tfY2FsbHNpdGUoKSkgeworICAgICAgVk1NZW1SZWdpb25FeCogZXggPSAoVk1NZW1SZWdpb25FeCopcHRyOworICAgICAgaWYgKGV4LT5wYygpICE9IE5VTEwpIHsKKyAgICAgICAgY2hhciBidWZbMTAyNF07CisgICAgICAgIGlmIChvczo6ZGxsX2FkZHJlc3NfdG9fZnVuY3Rpb25fbmFtZShleC0+cGMoKSwgYnVmLCBzaXplb2YoYnVmKSwgTlVMTCkpIHsKKyAgICAgICAgICB0dHktPnByaW50X2NyKCJcdCVzIiwgYnVmKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0dHktPnByaW50X2NyKCIiKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHB0ciA9IChWTU1lbVJlZ2lvbiopaXRyLm5leHQoKTsKKyAgfQorICB0dHktPmZsdXNoKCk7Cit9CiAjZW5kaWYgLy8gQVNTRVJUCiAKZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL3NlcnZpY2VzL21lbVNuYXBzaG90LmhwcCBiL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL3NlcnZpY2VzL21lbVNuYXBzaG90LmhwcAppbmRleCA5YWM2ZTRjLi5kZDUyZjRjIDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9zaGFyZS92bS9zZXJ2aWNlcy9tZW1TbmFwc2hvdC5ocHAKKysrIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vc2VydmljZXMvbWVtU25hcHNob3QuaHBwCkBAIC0xMTEsMzMgKzExMSw0MSBAQAogICAgICAgTWVtUG9pbnRlckl0ZXJhdG9yKGFycikgewogICB9CiAKLSAgLy8gbG9jYXRlIGFuIGV4aXN0aW5nIHJlY29yZCB0aGF0IGNvbnRhaW5zIHNwZWNpZmllZCBhZGRyZXNzLCBvcgotICAvLyB0aGUgcmVjb3JkLCB3aGVyZSB0aGUgcmVjb3JkIHdpdGggc3BlY2lmaWVkIGFkZHJlc3MsIHNob3VsZAotICAvLyBiZSBpbnNlcnRlZC4KLSAgLy8gdmlydHVhbCBtZW1vcnkgcmVjb3JkIGFycmF5IGlzIHNvcnRlZCBpbiBhZGRyZXNzIG9yZGVyLCBzbwotICAvLyBiaW5hcnkgc2VhcmNoIGlzIHBlcmZvcm1lZAorICAvLyBsb2NhdGUgYW4gZXhpc3RpbmcgcmVzZXJ2ZWQgbWVtb3J5IHJlZ2lvbiB0aGF0IGNvbnRhaW5zIHNwZWNpZmllZCBhZGRyZXNzLAorICAvLyBvciB0aGUgcmVzZXJ2ZWQgcmVnaW9uIGp1c3QgYWJvdmUgdGhpcyBhZGRyZXNzLCB3aGVyZSB0aGUgaW5jb21pbmcKKyAgLy8gcmVzZXJ2ZWQgcmVnaW9uIHNob3VsZCBiZSBpbnNlcnRlZC4KICAgdmlydHVhbCBNZW1Qb2ludGVyKiBsb2NhdGUoYWRkcmVzcyBhZGRyKSB7Ci0gICAgaW50IGluZGV4X2xvdyA9IDA7Ci0gICAgaW50IGluZGV4X2hpZ2ggPSBfYXJyYXktPmxlbmd0aCgpOwotICAgIGludCBpbmRleF9taWQgPSAoaW5kZXhfaGlnaCArIGluZGV4X2xvdykgLyAyOwotICAgIGludCByID0gMTsKLSAgICB3aGlsZSAoaW5kZXhfbG93IDwgaW5kZXhfaGlnaCAmJiAociA9IGNvbXBhcmUoaW5kZXhfbWlkLCBhZGRyKSkgIT0gMCkgewotICAgICAgaWYgKHIgPiAwKSB7Ci0gICAgICAgIGluZGV4X2hpZ2ggPSBpbmRleF9taWQ7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpbmRleF9sb3cgPSBpbmRleF9taWQ7CisgICAgcmVzZXQoKTsKKyAgICBWTU1lbVJlZ2lvbiogcmVnID0gKFZNTWVtUmVnaW9uKiljdXJyZW50KCk7CisgICAgd2hpbGUgKHJlZyAhPSBOVUxMKSB7CisgICAgICBpZiAocmVnLT5pc19yZXNlcnZlZF9yZWdpb24oKSkgeworICAgICAgICBpZiAocmVnLT5jb250YWluc19hZGRyZXNzKGFkZHIpIHx8IGFkZHIgPCByZWctPmJhc2UoKSkgeworICAgICAgICAgIHJldHVybiByZWc7CiAgICAgICB9Ci0gICAgICBpbmRleF9taWQgPSAoaW5kZXhfaGlnaCArIGluZGV4X2xvdykgLyAyOwogICAgIH0KLSAgICBpZiAociA9PSAwKSB7Ci0gICAgICAvLyB1cGRhdGUgY3VycmVudCBsb2NhdGlvbgotICAgICAgX3BvcyA9IGluZGV4X21pZDsKLSAgICAgIHJldHVybiBfYXJyYXktPmF0KGluZGV4X21pZCk7Ci0gICAgfSBlbHNlIHsKKyAgICAgIHJlZyA9IChWTU1lbVJlZ2lvbiopbmV4dCgpOworICAgIH0KICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgfQogCisgIC8vIGZvbGxvd2luZyBtZXRob2RzIHVwZGF0ZSB2aXJ0dWFsIG1lbW9yeSBpbiB0aGUgY29udGV4dAorICAvLyBvZiAnY3VycmVudCcgcG9zaXRpb24sIHdoaWNoIGlzIHByb3Blcmx5IHBvc2l0aW9uZWQgYnkKKyAgLy8gY2FsbGVycyB2aWEgbG9jYXRlIG1ldGhvZC4KKyAgYm9vbCBhZGRfcmVzZXJ2ZWRfcmVnaW9uKE1lbVBvaW50ZXJSZWNvcmQqIHJlYyk7CisgIGJvb2wgYWRkX2NvbW1pdHRlZF9yZWdpb24oTWVtUG9pbnRlclJlY29yZCogcmVjKTsKKyAgYm9vbCByZW1vdmVfdW5jb21taXR0ZWRfcmVnaW9uKE1lbVBvaW50ZXJSZWNvcmQqIHJlYyk7CisgIGJvb2wgcmVtb3ZlX3JlbGVhc2VkX3JlZ2lvbihNZW1Qb2ludGVyUmVjb3JkKiByZWMpOworCisgIC8vIHNwbGl0IGEgcmVzZXJ2ZWQgcmVnaW9uIHRvIGNyZWF0ZSBhIG5ldyBtZW1vcnkgcmVnaW9uIHdpdGggc3BlY2lmaWVkIGJhc2UgYW5kIHNpemUKKyAgYm9vbCBzcGxpdF9yZXNlcnZlZF9yZWdpb24oVk1NZW1SZWdpb24qIHJnbiwgYWRkcmVzcyBuZXdfcmduX2FkZHIsIHNpemVfdCBuZXdfcmduX3NpemUpOworIHByaXZhdGU6CisgIGJvb2wgaW5zZXJ0X3JlY29yZChNZW1Qb2ludGVyUmVjb3JkKiByZWMpOworICBib29sIGluc2VydF9yZWNvcmRfYWZ0ZXIoTWVtUG9pbnRlclJlY29yZCogcmVjKTsKKworICBib29sIGluc2VydF9yZXNlcnZlZF9yZWdpb24oTWVtUG9pbnRlclJlY29yZCogcmVjKTsKKworICAvLyByZXNldCBjdXJyZW50IHBvc2l0aW9uCisgIGlubGluZSB2b2lkIHJlc2V0KCkgeyBfcG9zID0gMDsgfQogI2lmZGVmIEFTU0VSVAogICB2aXJ0dWFsIGJvb2wgaXNfZHVwX3BvaW50ZXIoY29uc3QgTWVtUG9pbnRlciogcHRyMSwKICAgICBjb25zdCBNZW1Qb2ludGVyKiBwdHIyKSBjb25zdCB7CkBAIC0xNTQsMzIgKzE2MiwxNyBAQAogICAgICAgICAgICAocDEtPmZsYWdzKCkgJiBNZW1Qb2ludGVyUmVjb3JkOjp0YWdfbWFza3MpID09IE1lbVBvaW50ZXJSZWNvcmQ6OnRhZ19yZWxlYXNlOwogICB9CiAjZW5kaWYKLSAgLy8gY29tcGFyZSBpZiBhbiBhZGRyZXNzIGZhbGxzIGludG8gYSBtZW1vcnkgcmVnaW9uLAotICAvLyByZXR1cm4gMCwgaWYgdGhlIGFkZHJlc3MgZmFsbHMgaW50byBhIG1lbW9yeSByZWdpb24gYXQgc3BlY2lmaWVkIGluZGV4Ci0gIC8vIHJldHVybiAxLCBpZiBtZW1vcnkgcmVnaW9uIHBvaW50ZWQgYnkgc3BlY2lmaWVkIGluZGV4IGlzIGhpZ2hlciB0aGFuIHRoZSBhZGRyZXNzCi0gIC8vIHJldHVybiAtMSwgaWYgbWVtb3J5IHJlZ2lvbiBwb2ludGVkIGJ5IHNwZWNpZmllZCBpbmRleCBpcyBsb3dlciB0aGFuIHRoZSBhZGRyZXNzCi0gIGludCBjb21wYXJlKGludCBpbmRleCwgYWRkcmVzcyBhZGRyKSBjb25zdCB7Ci0gICAgVk1NZW1SZWdpb24qIHIgPSAoVk1NZW1SZWdpb24qKV9hcnJheS0+YXQoaW5kZXgpOwotICAgIGFzc2VydChyLT5pc19yZXNlcnZlX3JlY29yZCgpLCAiU2FuaXR5IGNoZWNrIik7Ci0gICAgaWYgKHItPmFkZHIoKSA+IGFkZHIpIHsKLSAgICAgIHJldHVybiAxOwotICAgIH0gZWxzZSBpZiAoci0+YWRkcigpICsgci0+cmVzZXJ2ZWRfc2l6ZSgpIDw9IGFkZHIpIHsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICB9CiB9OwogCiBjbGFzcyBNYWxsb2NSZWNvcmRJdGVyYXRvciA6IHB1YmxpYyBNZW1Qb2ludGVyQXJyYXlJdGVyYXRvciB7Ci0gcHJpdmF0ZToKKyBwcm90ZWN0ZWQ6CiAgIE1lbVBvaW50ZXJBcnJheUl0ZXJhdG9ySW1wbCAgX2l0cjsKIAogIHB1YmxpYzoKICAgTWFsbG9jUmVjb3JkSXRlcmF0b3IoTWVtUG9pbnRlckFycmF5KiBhcnIpIDogX2l0cihhcnIpIHsKICAgfQogCi0gIE1lbVBvaW50ZXIqIGN1cnJlbnQoKSBjb25zdCB7CisgIHZpcnR1YWwgTWVtUG9pbnRlciogY3VycmVudCgpIGNvbnN0IHsKICAgICBNZW1Qb2ludGVyUmVjb3JkKiBjdXIgPSAoTWVtUG9pbnRlclJlY29yZCopX2l0ci5jdXJyZW50KCk7CiAgICAgYXNzZXJ0KGN1ciA9PSBOVUxMIHx8ICFjdXItPmlzX3ZtX3BvaW50ZXIoKSwgInNlZWsgZXJyb3IiKTsKICAgICBNZW1Qb2ludGVyUmVjb3JkKiBuZXh0ID0gKE1lbVBvaW50ZXJSZWNvcmQqKV9pdHIucGVla19uZXh0KCk7CkBAIC0xOTQsNyArMTg3LDcgQEAKICAgICB9CiAgIH0KIAotICBNZW1Qb2ludGVyKiBuZXh0KCkgeworICB2aXJ0dWFsIE1lbVBvaW50ZXIqIG5leHQoKSB7CiAgICAgTWVtUG9pbnRlclJlY29yZCogY3VyID0gKE1lbVBvaW50ZXJSZWNvcmQqKV9pdHIuY3VycmVudCgpOwogICAgIGFzc2VydChjdXIgPT0gTlVMTCB8fCAhY3VyLT5pc192bV9wb2ludGVyKCksICJTYW5pdHkgY2hlY2siKTsKICAgICBNZW1Qb2ludGVyUmVjb3JkKiBuZXh0ID0gKE1lbVBvaW50ZXJSZWNvcmQqKV9pdHIubmV4dCgpOwpAQCAtMjE0LDYgKzIwNyw2MyBAQAogICBib29sIGluc2VydF9hZnRlcihNZW1Qb2ludGVyKiBwdHIpIHsgU2hvdWxkTm90UmVhY2hIZXJlKCk7IHJldHVybiBmYWxzZTsgfQogfTsKIAorLy8gY29sbGFwc2UgZHVwbGljYXRlZCByZWNvcmRzLiBFbGltaW5hdGluZyBkdXBsaWNhdGVkIHJlY29yZHMgaGVyZSwgaXMgbXVjaAorLy8gY2hlYXBlciB0aGFuIGR1cmluZyBwcm9tb3Rpb24gcGhhc2UuIEhvd2V2ZXIsIGl0IGRvZXMgaGF2ZSBsaW1pdGF0aW9uIC0gaXQKKy8vIGNhbiBvbmx5IGVsaW1pbmF0ZSBkdXBsaWNhdGVkIHJlY29yZHMgd2l0aGluIHRoZSBnZW5lcmF0aW9uLCB0aGVyZSBhcmUKKy8vIHN0aWxsIGNoYW5jZXMgc2VlaW5nIGR1cGxpY2F0ZWQgcmVjb3JkcyBkdXJpbmcgcHJvbW90aW9uLgorLy8gV2Ugd2FudCB0byB1c2UgdGhlIHJlY29yZCB3aXRoIGhpZ2hlciBzZXF1ZW5jZSBudW1iZXIsIGJlY2F1c2UgaXQgaGFzCisvLyBtb3JlIGFjY3VyYXRlIGNhbGxzaXRlIHBjLgorY2xhc3MgVk1SZWNvcmRJdGVyYXRvciA6IHB1YmxpYyBNYWxsb2NSZWNvcmRJdGVyYXRvciB7CisgcHVibGljOgorICBWTVJlY29yZEl0ZXJhdG9yKE1lbVBvaW50ZXJBcnJheSogYXJyKSA6IE1hbGxvY1JlY29yZEl0ZXJhdG9yKGFycikgeworICAgIE1lbVBvaW50ZXJSZWNvcmQqIGN1ciA9IChNZW1Qb2ludGVyUmVjb3JkKilfaXRyLmN1cnJlbnQoKTsKKyAgICBNZW1Qb2ludGVyUmVjb3JkKiBuZXh0ID0gKE1lbVBvaW50ZXJSZWNvcmQqKV9pdHIucGVla19uZXh0KCk7CisgICAgd2hpbGUgKG5leHQgIT0gTlVMTCkgeworICAgICAgYXNzZXJ0KGN1ciAhPSBOVUxMLCAiU2FuaXR5IGNoZWNrIik7CisgICAgICBhc3NlcnQoKChTZXFNZW1Qb2ludGVyUmVjb3JkKiluZXh0KS0+c2VxKCkgPiAoKFNlcU1lbVBvaW50ZXJSZWNvcmQqKWN1ciktPnNlcSgpLAorICAgICAgICAicHJlLXNvcnQgb3JkZXIiKTsKKworICAgICAgaWYgKGlzX2R1cGxpY2F0ZWRfcmVjb3JkKGN1ciwgbmV4dCkpIHsKKyAgICAgICAgX2l0ci5uZXh0KCk7CisgICAgICAgIG5leHQgPSAoTWVtUG9pbnRlclJlY29yZCopX2l0ci5wZWVrX25leHQoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHZpcnR1YWwgTWVtUG9pbnRlciogY3VycmVudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gX2l0ci5jdXJyZW50KCk7CisgIH0KKworICAvLyBnZXQgbmV4dCByZWNvcmQsIGJ1dCBza2lwIHRoZSBkdXBsaWNhdGVkIHJlY29yZHMKKyAgdmlydHVhbCBNZW1Qb2ludGVyKiBuZXh0KCkgeworICAgIE1lbVBvaW50ZXJSZWNvcmQqIGN1ciA9IChNZW1Qb2ludGVyUmVjb3JkKilfaXRyLm5leHQoKTsKKyAgICBNZW1Qb2ludGVyUmVjb3JkKiBuZXh0ID0gKE1lbVBvaW50ZXJSZWNvcmQqKV9pdHIucGVla19uZXh0KCk7CisgICAgd2hpbGUgKG5leHQgIT0gTlVMTCkgeworICAgICAgYXNzZXJ0KGN1ciAhPSBOVUxMLCAiU2FuaXR5IGNoZWNrIik7CisgICAgICBhc3NlcnQoKChTZXFNZW1Qb2ludGVyUmVjb3JkKiluZXh0KS0+c2VxKCkgPiAoKFNlcU1lbVBvaW50ZXJSZWNvcmQqKWN1ciktPnNlcSgpLAorICAgICAgICAicHJlLXNvcnQgb3JkZXIiKTsKKworICAgICAgaWYgKGlzX2R1cGxpY2F0ZWRfcmVjb3JkKGN1ciwgbmV4dCkpIHsKKyAgICAgICAgX2l0ci5uZXh0KCk7CisgICAgICAgIGN1ciA9IG5leHQ7CisgICAgICAgIG5leHQgPSAoTWVtUG9pbnRlclJlY29yZCopX2l0ci5wZWVrX25leHQoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gY3VyOworICB9CisKKyBwcml2YXRlOgorICBib29sIGlzX2R1cGxpY2F0ZWRfcmVjb3JkKE1lbVBvaW50ZXJSZWNvcmQqIHAxLCBNZW1Qb2ludGVyUmVjb3JkKiBwMikgY29uc3QgeworICAgIGJvb2wgcmV0ID0gKHAxLT5hZGRyKCkgPT0gcDItPmFkZHIoKSAmJiBwMS0+c2l6ZSgpID09IHAyLT5zaXplKCkgJiYgcDEtPmZsYWdzKCkgPT0gcDItPmZsYWdzKCkpOworICAgIGFzc2VydCghKHJldCAmJiBGTEFHU19UT19NRU1PUllfVFlQRShwMS0+ZmxhZ3MoKSkgPT0gbXRUaHJlYWRTdGFjayksICJkdXAgb24gc3RhY2sgcmVjb3JkIik7CisgICAgcmV0dXJuIHJldDsKKyAgfQorfTsKKwogY2xhc3MgU3RhZ2luZ0FyZWEgOiBwdWJsaWMgX1ZhbHVlT2JqIHsKICBwcml2YXRlOgogICBNZW1Qb2ludGVyQXJyYXkqICAgX21hbGxvY19kYXRhOwpAQCAtMjMzLDcgKzI4Myw4IEBACiAgICAgcmV0dXJuIE1hbGxvY1JlY29yZEl0ZXJhdG9yKG1hbGxvY19kYXRhKCkpOwogICB9CiAKLSAgTWVtUG9pbnRlckFycmF5SXRlcmF0b3JJbXBsIHZpcnR1YWxfbWVtb3J5X3JlY29yZF93YWxrZXIoKTsKKyAgVk1SZWNvcmRJdGVyYXRvciB2aXJ0dWFsX21lbW9yeV9yZWNvcmRfd2Fsa2VyKCk7CisKICAgYm9vbCBpbml0KCk7CiAgIHZvaWQgY2xlYXIoKSB7CiAgICAgYXNzZXJ0KF9tYWxsb2NfZGF0YSAhPSBOVUxMICYmIF92bV9kYXRhICE9IE5VTEwsICJKdXN0IGNoZWNrIik7CkBAIC0yOTMsNiArMzQ0LDggQEAKICAgTk9UX1BST0RVQ1Qodm9pZCBjaGVja19zdGFnaW5nX2RhdGEoKTspCiAgIE5PVF9QUk9EVUNUKHZvaWQgY2hlY2tfbWFsbG9jX3BvaW50ZXJzKCk7KQogICBOT1RfUFJPRFVDVChib29sIGhhc19hbGxvY2F0aW9uX3JlY29yZChhZGRyZXNzIGFkZHIpOykKKyAgLy8gZHVtcCBhbGwgdmlydHVhbCBtZW1vcnkgcG9pbnRlcnMgaW4gc25hcHNob3QKKyAgREVCVUdfT05MWSggdm9pZCBkdW1wX2FsbF92bV9wb2ludGVycygpOykKIAogIHByaXZhdGU6CiAgICAvLyBjb3B5IHBvaW50ZXIgZGF0YSBmcm9tIHNyYyB0byBkZXN0CkBAIC0zMDIsNSArMzU1LDQgQEAKICAgIGJvb2wgcHJvbW90ZV92aXJ0dWFsX21lbW9yeV9yZWNvcmRzKE1lbVBvaW50ZXJBcnJheUl0ZXJhdG9yKiBpdHIpOwogfTsKIAotCiAjZW5kaWYgLy8gU0hBUkVfVk1fU0VSVklDRVNfTUVNX1NOQVBTSE9UX0hQUApkaWZmIC0tZ2l0IGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vc2VydmljZXMvbWVtVHJhY2tlci5jcHAgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9zZXJ2aWNlcy9tZW1UcmFja2VyLmNwcAppbmRleCAyYWY2ZTEwLi4zY2VjNjc4IDEwMDY0NAotLS0gYS9ob3RzcG90L3NyYy9zaGFyZS92bS9zZXJ2aWNlcy9tZW1UcmFja2VyLmNwcAorKysgYi9ob3RzcG90L3NyYy9zaGFyZS92bS9zZXJ2aWNlcy9tZW1UcmFja2VyLmNwcApAQCAtMzY0LDcgKzM2NCw3IEBACiAKICAgICBpZiAodGhyZWFkICE9IE5VTEwpIHsKICAgICAgIGlmICh0aHJlYWQtPmlzX0phdmFfdGhyZWFkKCkgJiYgKChKYXZhVGhyZWFkKil0aHJlYWQpLT5pc19zYWZlcG9pbnRfdmlzaWJsZSgpKSB7Ci0gICAgICAgIEphdmFUaHJlYWQqICAgICAgamF2YV90aHJlYWQgPSBzdGF0aWNfY2FzdDxKYXZhVGhyZWFkKj4odGhyZWFkKTsKKyAgICAgICAgSmF2YVRocmVhZCogICAgICBqYXZhX3RocmVhZCA9IChKYXZhVGhyZWFkKil0aHJlYWQ7CiAgICAgICAgIEphdmFUaHJlYWRTdGF0ZSAgc3RhdGUgPSBqYXZhX3RocmVhZC0+dGhyZWFkX3N0YXRlKCk7CiAgICAgICAgIGlmIChTYWZlcG9pbnRTeW5jaHJvbml6ZTo6c2FmZXBvaW50X3NhZmUoamF2YV90aHJlYWQsIHN0YXRlKSkgewogICAgICAgICAgIC8vIEphdmFUaHJlYWRzIHRoYXQgYXJlIHNhZmVwb2ludCBzYWZlLCBjYW4gcnVuIHRocm91Z2ggc2FmZXBvaW50LApAQCAtNDcyLDYgKzQ3Miw4IEBACiAgICAgICAvLyBpdCBzaG91bGQgZ3VhcmFudGVlIHRoYXQgTk1UIGlzIGZ1bGx5IHN5bmMtZWQuCiAgICAgICBUaHJlYWRDcml0aWNhbCB0YzsKIAorICAgICAgU2VxdWVuY2VHZW5lcmF0b3I6OnJlc2V0KCk7CisKICAgICAgIC8vIHdhbGsgYWxsIEphdmFUaHJlYWRzIHRvIGNvbGxlY3QgcmVjb3JkZXJzCiAgICAgICBTeW5jVGhyZWFkUmVjb3JkZXJDbG9zdXJlIHN0YzsKICAgICAgIFRocmVhZHM6OnRocmVhZHNfZG8oJnN0Yyk7CkBAIC00ODQsMTEgKzQ4NiwxMiBAQAogICAgICAgICBwZW5kaW5nX3JlY29yZGVycyA9IF9nbG9iYWxfcmVjb3JkZXI7CiAgICAgICAgIF9nbG9iYWxfcmVjb3JkZXIgPSBOVUxMOwogICAgICAgfQotICAgICAgU2VxdWVuY2VHZW5lcmF0b3I6OnJlc2V0KCk7CiAgICAgICAvLyBjaGVjayBfd29ya2VyX3RocmVhZCB3aXRoIGxvY2sgdG8gYXZvaWQgcmFjaW5nIGNvbmRpdGlvbgogICAgICAgaWYgKF93b3JrZXJfdGhyZWFkICE9IE5VTEwpIHsKICAgICAgICAgX3dvcmtlcl90aHJlYWQtPmF0X3N5bmNfcG9pbnQocGVuZGluZ19yZWNvcmRlcnMpOwogICAgICAgfQorCisgICAgICBhc3NlcnQoU2VxdWVuY2VHZW5lcmF0b3I6OnBlZWsoKSA9PSAxLCAiU2hvdWxkIG5vdCBoYXZlIG1lbW9yeSBhY3Rpdml0aWVzIGR1cmluZyBzeW5jLXBvaW50Iik7CiAgICAgfQogICB9CiAKZGlmZiAtLWdpdCBhL2hvdHNwb3Qvc3JjL3NoYXJlL3ZtL3NlcnZpY2VzL21lbVRyYWNrZXIuaHBwIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vc2VydmljZXMvbWVtVHJhY2tlci5ocHAKaW5kZXggNjI2MzdkOC4uYzQyZjAxYiAxMDA2NDQKLS0tIGEvaG90c3BvdC9zcmMvc2hhcmUvdm0vc2VydmljZXMvbWVtVHJhY2tlci5ocHAKKysrIGIvaG90c3BvdC9zcmMvc2hhcmUvdm0vc2VydmljZXMvbWVtVHJhY2tlci5ocHAKQEAgLTExMyw4ICsxMTMsMTAgQEAKICNpbmNsdWRlICJ0aHJlYWRfc29sYXJpcy5pbmxpbmUuaHBwIgogI2VuZGlmCiAKLSNpZmRlZiBfREVCVUcKLSAgI2RlZmluZSBERUJVR19DQUxMRVJfUEMgIG9zOjpnZXRfY2FsbGVyX3BjKDMpCitleHRlcm4gYm9vbCBOTVRfdHJhY2tfY2FsbHNpdGU7CisKKyNpZmRlZiBBU1NFUlQKKyAgI2RlZmluZSBERUJVR19DQUxMRVJfUEMgIChOTVRfdHJhY2tfY2FsbHNpdGUgPyBvczo6Z2V0X2NhbGxlcl9wYygyKSA6IDApCiAjZWxzZQogICAjZGVmaW5lIERFQlVHX0NBTExFUl9QQyAgMAogI2VuZGlmCkBAIC0yNjEsNyArMjYzLDcgQEAKICAgLy8gcmVjb3JkIGEgJ21hbGxvYycgY2FsbAogICBzdGF0aWMgaW5saW5lIHZvaWQgcmVjb3JkX21hbGxvYyhhZGRyZXNzIGFkZHIsIHNpemVfdCBzaXplLCBNRU1GTEFHUyBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzIHBjID0gMCwgVGhyZWFkKiB0aHJlYWQgPSBOVUxMKSB7Ci0gICAgaWYgKE5NVF9DQU5fVFJBQ0soZmxhZ3MpKSB7CisgICAgaWYgKGlzX29uKCkgJiYgTk1UX0NBTl9UUkFDSyhmbGFncykpIHsKICAgICAgIGFzc2VydChzaXplID4gMCwgIlNhbml0eSBjaGVjayIpOwogICAgICAgY3JlYXRlX21lbW9yeV9yZWNvcmQoYWRkciwgKGZsYWdzfE1lbVBvaW50ZXJSZWNvcmQ6Om1hbGxvY190YWcoKSksIHNpemUsIHBjLCB0aHJlYWQpOwogICAgIH0KQEAgLTI3NSw3ICsyNzcsNyBAQAogICAvLyByZWNvcmQgYSAncmVhbGxvYycgY2FsbAogICBzdGF0aWMgaW5saW5lIHZvaWQgcmVjb3JkX3JlYWxsb2MoYWRkcmVzcyBvbGRfYWRkciwgYWRkcmVzcyBuZXdfYWRkciwgc2l6ZV90IHNpemUsCiAgICAgICAgTUVNRkxBR1MgZmxhZ3MsIGFkZHJlc3MgcGMgPSAwLCBUaHJlYWQqIHRocmVhZCA9IE5VTEwpIHsKLSAgICBpZiAoaXNfb24oKSkgeworICAgIGlmIChpc19vbigpICYmIE5NVF9DQU5fVFJBQ0soZmxhZ3MpKSB7CiAgICAgICBhc3NlcnQoc2l6ZSA+IDAsICJTYW5pdHkgY2hlY2siKTsKICAgICAgIHJlY29yZF9mcmVlKG9sZF9hZGRyLCBmbGFncywgdGhyZWFkKTsKICAgICAgIHJlY29yZF9tYWxsb2MobmV3X2FkZHIsIHNpemUsIGZsYWdzLCBwYywgdGhyZWFkKTsKQEAgLTMxNyw2ICszMTksNyBAQAogICBzdGF0aWMgaW5saW5lIHZvaWQgcmVsZWFzZV90aHJlYWRfc3RhY2soYWRkcmVzcyBhZGRyLCBzaXplX3Qgc2l6ZSwgVGhyZWFkKiB0aHIpIHsKICAgICBpZiAoaXNfb24oKSkgewogICAgICAgYXNzZXJ0KHNpemUgPiAwICYmIHRociAhPSBOVUxMLCAiU2FuaXR5IGNoZWNrIik7CisgICAgICBhc3NlcnQoIXRoci0+aXNfSmF2YV90aHJlYWQoKSwgInRvbyBlYXJseSIpOwogICAgICAgY3JlYXRlX21lbW9yeV9yZWNvcmQoYWRkciwgTWVtUG9pbnRlclJlY29yZDo6dmlydHVhbF9tZW1vcnlfdW5jb21taXRfdGFnKCkgfCBtdFRocmVhZFN0YWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLCBERUJVR19DQUxMRVJfUEMsIHRocik7CiAgICAgICBjcmVhdGVfbWVtb3J5X3JlY29yZChhZGRyLCBNZW1Qb2ludGVyUmVjb3JkOjp2aXJ0dWFsX21lbW9yeV9yZWxlYXNlX3RhZygpIHwgbXRUaHJlYWRTdGFjaywKQEAgLTMyNiwxMSArMzI5LDExIEBACiAKICAgLy8gcmVjb3JkIGEgdmlydHVhbCBtZW1vcnkgJ2NvbW1pdCcgY2FsbAogICBzdGF0aWMgaW5saW5lIHZvaWQgcmVjb3JkX3ZpcnR1YWxfbWVtb3J5X2NvbW1pdChhZGRyZXNzIGFkZHIsIHNpemVfdCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MgcGMgPSAwLCBUaHJlYWQqIHRocmVhZCA9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzIHBjLCBUaHJlYWQqIHRocmVhZCA9IE5VTEwpIHsKICAgICBpZiAoaXNfb24oKSkgewogICAgICAgYXNzZXJ0KHNpemUgPiAwLCAiU2FuaXR5IGNoZWNrIik7CiAgICAgICBjcmVhdGVfbWVtb3J5X3JlY29yZChhZGRyLCBNZW1Qb2ludGVyUmVjb3JkOjp2aXJ0dWFsX21lbW9yeV9jb21taXRfdGFnKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLCBERUJVR19DQUxMRVJfUEMsIHRocmVhZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLCBwYywgdGhyZWFkKTsKICAgICB9CiAgIH0KIApkaWZmIC0tZ2l0IGEvaG90c3BvdC90ZXN0L2NvbXBpbGVyLzYzNDA4NjQvVGVzdEJ5dGVWZWN0LmphdmEgYi9ob3RzcG90L3Rlc3QvY29tcGlsZXIvNjM0MDg2NC9UZXN0Qnl0ZVZlY3QuamF2YQppbmRleCBlYzRiYTlmLi41ZGIzNjg3IDEwMDY0NAotLS0gYS9ob3RzcG90L3Rlc3QvY29tcGlsZXIvNjM0MDg2NC9UZXN0Qnl0ZVZlY3QuamF2YQorKysgYi9ob3RzcG90L3Rlc3QvY29tcGlsZXIvNjM0MDg2NC9UZXN0Qnl0ZVZlY3QuamF2YQpAQCAtMzMsNyArMzMsNyBAQAogcHVibGljIGNsYXNzIFRlc3RCeXRlVmVjdCB7CiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBUlJMRU4gPSA5OTc7CiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJVEVSUyAgPSAxMTAwMDsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFERF9JTklUID0gMDsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFERF9JTklUID0gNjM7CiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCSVRfTUFTSyA9IDB4Qjc7CiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBWQUxVRSA9IDM7CiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSElGVCA9IDg7CkBAIC03Niw2ICs3Niw3IEBACiAgICAgICB0ZXN0X3N1YmMoYTAsIGExKTsKICAgICAgIHRlc3Rfc3VidihhMCwgYTEsIChieXRlKVZBTFVFKTsKICAgICAgIHRlc3Rfc3ViYShhMCwgYTEsIGEyKTsKKwogICAgICAgdGVzdF9tdWxjKGEwLCBhMSk7CiAgICAgICB0ZXN0X211bHYoYTAsIGExLCAoYnl0ZSlWQUxVRSk7CiAgICAgICB0ZXN0X211bGEoYTAsIGExLCBhMik7CkBAIC04OCw2ICs4OSw3IEBACiAgICAgICB0ZXN0X2RpdmNfbihhMCwgYTEpOwogICAgICAgdGVzdF9kaXZ2KGEwLCBhMSwgKGJ5dGUpLVZBTFVFKTsKICAgICAgIHRlc3RfZGl2YShhMCwgYTEsIGEzKTsKKwogICAgICAgdGVzdF9hbmRjKGEwLCBhMSk7CiAgICAgICB0ZXN0X2FuZHYoYTAsIGExLCAoYnl0ZSlCSVRfTUFTSyk7CiAgICAgICB0ZXN0X2FuZGEoYTAsIGExLCBhNCk7CkBAIC05NywzMCArOTksNDkgQEAKICAgICAgIHRlc3RfeG9yYyhhMCwgYTEpOwogICAgICAgdGVzdF94b3J2KGEwLCBhMSwgKGJ5dGUpQklUX01BU0spOwogICAgICAgdGVzdF94b3JhKGEwLCBhMSwgYTQpOworCiAgICAgICB0ZXN0X3NsbGMoYTAsIGExKTsKICAgICAgIHRlc3Rfc2xsdihhMCwgYTEsIFZBTFVFKTsKICAgICAgIHRlc3Rfc3JsYyhhMCwgYTEpOwogICAgICAgdGVzdF9zcmx2KGEwLCBhMSwgVkFMVUUpOwogICAgICAgdGVzdF9zcmFjKGEwLCBhMSk7CiAgICAgICB0ZXN0X3NyYXYoYTAsIGExLCBWQUxVRSk7CisKICAgICAgIHRlc3Rfc2xsY19uKGEwLCBhMSk7CiAgICAgICB0ZXN0X3NsbHYoYTAsIGExLCAtVkFMVUUpOwogICAgICAgdGVzdF9zcmxjX24oYTAsIGExKTsKICAgICAgIHRlc3Rfc3JsdihhMCwgYTEsIC1WQUxVRSk7CiAgICAgICB0ZXN0X3NyYWNfbihhMCwgYTEpOwogICAgICAgdGVzdF9zcmF2KGEwLCBhMSwgLVZBTFVFKTsKKwogICAgICAgdGVzdF9zbGxjX28oYTAsIGExKTsKICAgICAgIHRlc3Rfc2xsdihhMCwgYTEsIFNISUZUKTsKICAgICAgIHRlc3Rfc3JsY19vKGEwLCBhMSk7CiAgICAgICB0ZXN0X3NybHYoYTAsIGExLCBTSElGVCk7CiAgICAgICB0ZXN0X3NyYWNfbyhhMCwgYTEpOwogICAgICAgdGVzdF9zcmF2KGEwLCBhMSwgU0hJRlQpOworCiAgICAgICB0ZXN0X3NsbGNfb24oYTAsIGExKTsKICAgICAgIHRlc3Rfc2xsdihhMCwgYTEsIC1TSElGVCk7CiAgICAgICB0ZXN0X3NybGNfb24oYTAsIGExKTsKICAgICAgIHRlc3Rfc3JsdihhMCwgYTEsIC1TSElGVCk7CiAgICAgICB0ZXN0X3NyYWNfb24oYTAsIGExKTsKICAgICAgIHRlc3Rfc3JhdihhMCwgYTEsIC1TSElGVCk7CisKKyAgICAgIHRlc3Rfc2xsY19hZGQoYTAsIGExKTsKKyAgICAgIHRlc3Rfc2xsdl9hZGQoYTAsIGExLCBBRERfSU5JVCk7CisgICAgICB0ZXN0X3NybGNfYWRkKGEwLCBhMSk7CisgICAgICB0ZXN0X3NybHZfYWRkKGEwLCBhMSwgQUREX0lOSVQpOworICAgICAgdGVzdF9zcmFjX2FkZChhMCwgYTEpOworICAgICAgdGVzdF9zcmF2X2FkZChhMCwgYTEsIEFERF9JTklUKTsKKworICAgICAgdGVzdF9zbGxjX2FuZChhMCwgYTEpOworICAgICAgdGVzdF9zbGx2X2FuZChhMCwgYTEsIEJJVF9NQVNLKTsKKyAgICAgIHRlc3Rfc3JsY19hbmQoYTAsIGExKTsKKyAgICAgIHRlc3Rfc3Jsdl9hbmQoYTAsIGExLCBCSVRfTUFTSyk7CisgICAgICB0ZXN0X3NyYWNfYW5kKGEwLCBhMSk7CisgICAgICB0ZXN0X3NyYXZfYW5kKGEwLCBhMSwgQklUX01BU0spOworCiAgICAgICB0ZXN0X3BhY2syKHAyLCBhMSk7CiAgICAgICB0ZXN0X3VucGFjazIoYTAsIHAyKTsKICAgICAgIHRlc3RfcGFjazJfc3dhcChwMiwgYTEpOwpAQCAtMzY5LDYgKzM5MCw2MCBAQAogICAgICAgICBlcnJuICs9IHZlcmlmeSgidGVzdF9zcmF2X29uOiAiLCBpLCBhMFtpXSwgKGJ5dGUpKChieXRlKShBRERfSU5JVCtpKT4+KC1TSElGVCkpKTsKICAgICAgIH0KIAorICAgICAgdGVzdF9zbGxjX2FkZChhMCwgYTEpOworICAgICAgZm9yIChpbnQgaT0wOyBpPEFSUkxFTjsgaSsrKSB7CisgICAgICAgIGVycm4gKz0gdmVyaWZ5KCJ0ZXN0X3NsbGNfYWRkOiAiLCBpLCBhMFtpXSwgKGJ5dGUpKCgoYnl0ZSkoQUREX0lOSVQraSkgKyBBRERfSU5JVCk8PFZBTFVFKSk7CisgICAgICB9CisgICAgICB0ZXN0X3NsbHZfYWRkKGEwLCBhMSwgQUREX0lOSVQpOworICAgICAgZm9yIChpbnQgaT0wOyBpPEFSUkxFTjsgaSsrKSB7CisgICAgICAgIGVycm4gKz0gdmVyaWZ5KCJ0ZXN0X3NsbHZfYWRkOiAiLCBpLCBhMFtpXSwgKGJ5dGUpKCgoYnl0ZSkoQUREX0lOSVQraSkgKyBBRERfSU5JVCk8PFZBTFVFKSk7CisgICAgICB9CisKKyAgICAgIHRlc3Rfc3JsY19hZGQoYTAsIGExKTsKKyAgICAgIGZvciAoaW50IGk9MDsgaTxBUlJMRU47IGkrKykgeworICAgICAgICBlcnJuICs9IHZlcmlmeSgidGVzdF9zcmxjX2FkZDogIiwgaSwgYTBbaV0sIChieXRlKSgoKGJ5dGUpKEFERF9JTklUK2kpICsgQUREX0lOSVQpPj4+VkFMVUUpKTsKKyAgICAgIH0KKyAgICAgIHRlc3Rfc3Jsdl9hZGQoYTAsIGExLCBBRERfSU5JVCk7CisgICAgICBmb3IgKGludCBpPTA7IGk8QVJSTEVOOyBpKyspIHsKKyAgICAgICAgZXJybiArPSB2ZXJpZnkoInRlc3Rfc3Jsdl9hZGQ6ICIsIGksIGEwW2ldLCAoYnl0ZSkoKChieXRlKShBRERfSU5JVCtpKSArIEFERF9JTklUKT4+PlZBTFVFKSk7CisgICAgICB9CisKKyAgICAgIHRlc3Rfc3JhY19hZGQoYTAsIGExKTsKKyAgICAgIGZvciAoaW50IGk9MDsgaTxBUlJMRU47IGkrKykgeworICAgICAgICBlcnJuICs9IHZlcmlmeSgidGVzdF9zcmFjX2FkZDogIiwgaSwgYTBbaV0sIChieXRlKSgoKGJ5dGUpKEFERF9JTklUK2kpICsgQUREX0lOSVQpPj5WQUxVRSkpOworICAgICAgfQorICAgICAgdGVzdF9zcmF2X2FkZChhMCwgYTEsIEFERF9JTklUKTsKKyAgICAgIGZvciAoaW50IGk9MDsgaTxBUlJMRU47IGkrKykgeworICAgICAgICBlcnJuICs9IHZlcmlmeSgidGVzdF9zcmF2X2FkZDogIiwgaSwgYTBbaV0sIChieXRlKSgoKGJ5dGUpKEFERF9JTklUK2kpICsgQUREX0lOSVQpPj5WQUxVRSkpOworICAgICAgfQorCisgICAgICB0ZXN0X3NsbGNfYW5kKGEwLCBhMSk7CisgICAgICBmb3IgKGludCBpPTA7IGk8QVJSTEVOOyBpKyspIHsKKyAgICAgICAgZXJybiArPSB2ZXJpZnkoInRlc3Rfc2xsY19hbmQ6ICIsIGksIGEwW2ldLCAoYnl0ZSkoKChieXRlKShBRERfSU5JVCtpKSAmIEJJVF9NQVNLKTw8VkFMVUUpKTsKKyAgICAgIH0KKyAgICAgIHRlc3Rfc2xsdl9hbmQoYTAsIGExLCBCSVRfTUFTSyk7CisgICAgICBmb3IgKGludCBpPTA7IGk8QVJSTEVOOyBpKyspIHsKKyAgICAgICAgZXJybiArPSB2ZXJpZnkoInRlc3Rfc2xsdl9hbmQ6ICIsIGksIGEwW2ldLCAoYnl0ZSkoKChieXRlKShBRERfSU5JVCtpKSAmIEJJVF9NQVNLKTw8VkFMVUUpKTsKKyAgICAgIH0KKworICAgICAgdGVzdF9zcmxjX2FuZChhMCwgYTEpOworICAgICAgZm9yIChpbnQgaT0wOyBpPEFSUkxFTjsgaSsrKSB7CisgICAgICAgIGVycm4gKz0gdmVyaWZ5KCJ0ZXN0X3NybGNfYW5kOiAiLCBpLCBhMFtpXSwgKGJ5dGUpKCgoYnl0ZSkoQUREX0lOSVQraSkgJiBCSVRfTUFTSyk+Pj5WQUxVRSkpOworICAgICAgfQorICAgICAgdGVzdF9zcmx2X2FuZChhMCwgYTEsIEJJVF9NQVNLKTsKKyAgICAgIGZvciAoaW50IGk9MDsgaTxBUlJMRU47IGkrKykgeworICAgICAgICBlcnJuICs9IHZlcmlmeSgidGVzdF9zcmx2X2FuZDogIiwgaSwgYTBbaV0sIChieXRlKSgoKGJ5dGUpKEFERF9JTklUK2kpICYgQklUX01BU0spPj4+VkFMVUUpKTsKKyAgICAgIH0KKworICAgICAgdGVzdF9zcmFjX2FuZChhMCwgYTEpOworICAgICAgZm9yIChpbnQgaT0wOyBpPEFSUkxFTjsgaSsrKSB7CisgICAgICAgIGVycm4gKz0gdmVyaWZ5KCJ0ZXN0X3NyYWNfYW5kOiAiLCBpLCBhMFtpXSwgKGJ5dGUpKCgoYnl0ZSkoQUREX0lOSVQraSkgJiBCSVRfTUFTSyk+PlZBTFVFKSk7CisgICAgICB9CisgICAgICB0ZXN0X3NyYXZfYW5kKGEwLCBhMSwgQklUX01BU0spOworICAgICAgZm9yIChpbnQgaT0wOyBpPEFSUkxFTjsgaSsrKSB7CisgICAgICAgIGVycm4gKz0gdmVyaWZ5KCJ0ZXN0X3NyYXZfYW5kOiAiLCBpLCBhMFtpXSwgKGJ5dGUpKCgoYnl0ZSkoQUREX0lOSVQraSkgJiBCSVRfTUFTSyk+PlZBTFVFKSk7CisgICAgICB9CisKICAgICAgIHRlc3RfcGFjazIocDIsIGExKTsKICAgICAgIGZvciAoaW50IGk9MDsgaTxBUlJMRU4vMjsgaSsrKSB7CiAgICAgICAgIGVycm4gKz0gdmVyaWZ5KCJ0ZXN0X3BhY2syOiAiLCBpLCBwMltpXSwgKHNob3J0KSgoKHNob3J0KShBRERfSU5JVCsyKmkpICYgMHhGRikgfCAoKHNob3J0KShBRERfSU5JVCsyKmkrMSkgPDwgOCkpKTsKQEAgLTgwNSw2ICs4ODAsODQgQEAKIAogICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CiAgICAgZm9yIChpbnQgaT0wOyBpPElURVJTOyBpKyspIHsKKyAgICAgIHRlc3Rfc2xsY19hZGQoYTAsIGExKTsKKyAgICB9CisgICAgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0ZXN0X3NsbGNfYWRkOiAiICsgKGVuZCAtIHN0YXJ0KSk7CisgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBmb3IgKGludCBpPTA7IGk8SVRFUlM7IGkrKykgeworICAgICAgdGVzdF9zbGx2X2FkZChhMCwgYTEsIEFERF9JTklUKTsKKyAgICB9CisgICAgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0ZXN0X3NsbHZfYWRkOiAiICsgKGVuZCAtIHN0YXJ0KSk7CisKKyAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIGZvciAoaW50IGk9MDsgaTxJVEVSUzsgaSsrKSB7CisgICAgICB0ZXN0X3NybGNfYWRkKGEwLCBhMSk7CisgICAgfQorICAgIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGVzdF9zcmxjX2FkZDogIiArIChlbmQgLSBzdGFydCkpOworICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgZm9yIChpbnQgaT0wOyBpPElURVJTOyBpKyspIHsKKyAgICAgIHRlc3Rfc3Jsdl9hZGQoYTAsIGExLCBBRERfSU5JVCk7CisgICAgfQorICAgIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGVzdF9zcmx2X2FkZDogIiArIChlbmQgLSBzdGFydCkpOworCisgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBmb3IgKGludCBpPTA7IGk8SVRFUlM7IGkrKykgeworICAgICAgdGVzdF9zcmFjX2FkZChhMCwgYTEpOworICAgIH0KKyAgICBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oInRlc3Rfc3JhY19hZGQ6ICIgKyAoZW5kIC0gc3RhcnQpKTsKKyAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIGZvciAoaW50IGk9MDsgaTxJVEVSUzsgaSsrKSB7CisgICAgICB0ZXN0X3NyYXZfYWRkKGEwLCBhMSwgQUREX0lOSVQpOworICAgIH0KKyAgICBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oInRlc3Rfc3Jhdl9hZGQ6ICIgKyAoZW5kIC0gc3RhcnQpKTsKKworICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgZm9yIChpbnQgaT0wOyBpPElURVJTOyBpKyspIHsKKyAgICAgIHRlc3Rfc2xsY19hbmQoYTAsIGExKTsKKyAgICB9CisgICAgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0ZXN0X3NsbGNfYW5kOiAiICsgKGVuZCAtIHN0YXJ0KSk7CisgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBmb3IgKGludCBpPTA7IGk8SVRFUlM7IGkrKykgeworICAgICAgdGVzdF9zbGx2X2FuZChhMCwgYTEsIEJJVF9NQVNLKTsKKyAgICB9CisgICAgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0ZXN0X3NsbHZfYW5kOiAiICsgKGVuZCAtIHN0YXJ0KSk7CisKKyAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIGZvciAoaW50IGk9MDsgaTxJVEVSUzsgaSsrKSB7CisgICAgICB0ZXN0X3NybGNfYW5kKGEwLCBhMSk7CisgICAgfQorICAgIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGVzdF9zcmxjX2FuZDogIiArIChlbmQgLSBzdGFydCkpOworICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgZm9yIChpbnQgaT0wOyBpPElURVJTOyBpKyspIHsKKyAgICAgIHRlc3Rfc3Jsdl9hbmQoYTAsIGExLCBCSVRfTUFTSyk7CisgICAgfQorICAgIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGVzdF9zcmx2X2FuZDogIiArIChlbmQgLSBzdGFydCkpOworCisgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBmb3IgKGludCBpPTA7IGk8SVRFUlM7IGkrKykgeworICAgICAgdGVzdF9zcmFjX2FuZChhMCwgYTEpOworICAgIH0KKyAgICBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oInRlc3Rfc3JhY19hbmQ6ICIgKyAoZW5kIC0gc3RhcnQpKTsKKyAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIGZvciAoaW50IGk9MDsgaTxJVEVSUzsgaSsrKSB7CisgICAgICB0ZXN0X3NyYXZfYW5kKGEwLCBhMSwgQklUX01BU0spOworICAgIH0KKyAgICBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oInRlc3Rfc3Jhdl9hbmQ6ICIgKyAoZW5kIC0gc3RhcnQpKTsKKworICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgZm9yIChpbnQgaT0wOyBpPElURVJTOyBpKyspIHsKICAgICAgIHRlc3RfcGFjazIocDIsIGExKTsKICAgICB9CiAgICAgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CkBAIC0xMDM2LDYgKzExODksMjYgQEAKICAgICAgIGEwW2ldID0gKGJ5dGUpKGExW2ldPDxiKTsKICAgICB9CiAgIH0KKyAgc3RhdGljIHZvaWQgdGVzdF9zbGxjX2FkZChieXRlW10gYTAsIGJ5dGVbXSBhMSkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYTAubGVuZ3RoOyBpKz0xKSB7CisgICAgICBhMFtpXSA9IChieXRlKSgoYTFbaV0gKyBBRERfSU5JVCk8PFZBTFVFKTsKKyAgICB9CisgIH0KKyAgc3RhdGljIHZvaWQgdGVzdF9zbGx2X2FkZChieXRlW10gYTAsIGJ5dGVbXSBhMSwgaW50IGIpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGEwLmxlbmd0aDsgaSs9MSkgeworICAgICAgYTBbaV0gPSAoYnl0ZSkoKGExW2ldICsgYik8PFZBTFVFKTsKKyAgICB9CisgIH0KKyAgc3RhdGljIHZvaWQgdGVzdF9zbGxjX2FuZChieXRlW10gYTAsIGJ5dGVbXSBhMSkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYTAubGVuZ3RoOyBpKz0xKSB7CisgICAgICBhMFtpXSA9IChieXRlKSgoYTFbaV0gJiBCSVRfTUFTSyk8PFZBTFVFKTsKKyAgICB9CisgIH0KKyAgc3RhdGljIHZvaWQgdGVzdF9zbGx2X2FuZChieXRlW10gYTAsIGJ5dGVbXSBhMSwgaW50IGIpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGEwLmxlbmd0aDsgaSs9MSkgeworICAgICAgYTBbaV0gPSAoYnl0ZSkoKGExW2ldICYgYik8PFZBTFVFKTsKKyAgICB9CisgIH0KIAogICBzdGF0aWMgdm9pZCB0ZXN0X3NybGMoYnl0ZVtdIGEwLCBieXRlW10gYTEpIHsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IGEwLmxlbmd0aDsgaSs9MSkgewpAQCAtMTA2Miw2ICsxMjM1LDI2IEBACiAgICAgICBhMFtpXSA9IChieXRlKShhMVtpXT4+PmIpOwogICAgIH0KICAgfQorICBzdGF0aWMgdm9pZCB0ZXN0X3NybGNfYWRkKGJ5dGVbXSBhMCwgYnl0ZVtdIGExKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhMC5sZW5ndGg7IGkrPTEpIHsKKyAgICAgIGEwW2ldID0gKGJ5dGUpKChhMVtpXSArIEFERF9JTklUKT4+PlZBTFVFKTsKKyAgICB9CisgIH0KKyAgc3RhdGljIHZvaWQgdGVzdF9zcmx2X2FkZChieXRlW10gYTAsIGJ5dGVbXSBhMSwgaW50IGIpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGEwLmxlbmd0aDsgaSs9MSkgeworICAgICAgYTBbaV0gPSAoYnl0ZSkoKGExW2ldICsgYik+Pj5WQUxVRSk7CisgICAgfQorICB9CisgIHN0YXRpYyB2b2lkIHRlc3Rfc3JsY19hbmQoYnl0ZVtdIGEwLCBieXRlW10gYTEpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGEwLmxlbmd0aDsgaSs9MSkgeworICAgICAgYTBbaV0gPSAoYnl0ZSkoKGExW2ldICYgQklUX01BU0spPj4+VkFMVUUpOworICAgIH0KKyAgfQorICBzdGF0aWMgdm9pZCB0ZXN0X3NybHZfYW5kKGJ5dGVbXSBhMCwgYnl0ZVtdIGExLCBpbnQgYikgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYTAubGVuZ3RoOyBpKz0xKSB7CisgICAgICBhMFtpXSA9IChieXRlKSgoYTFbaV0gJiBiKT4+PlZBTFVFKTsKKyAgICB9CisgIH0KIAogICBzdGF0aWMgdm9pZCB0ZXN0X3NyYWMoYnl0ZVtdIGEwLCBieXRlW10gYTEpIHsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IGEwLmxlbmd0aDsgaSs9MSkgewpAQCAtMTA4OCw2ICsxMjgxLDI2IEBACiAgICAgICBhMFtpXSA9IChieXRlKShhMVtpXT4+Yik7CiAgICAgfQogICB9CisgIHN0YXRpYyB2b2lkIHRlc3Rfc3JhY19hZGQoYnl0ZVtdIGEwLCBieXRlW10gYTEpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGEwLmxlbmd0aDsgaSs9MSkgeworICAgICAgYTBbaV0gPSAoYnl0ZSkoKGExW2ldICsgQUREX0lOSVQpPj5WQUxVRSk7CisgICAgfQorICB9CisgIHN0YXRpYyB2b2lkIHRlc3Rfc3Jhdl9hZGQoYnl0ZVtdIGEwLCBieXRlW10gYTEsIGludCBiKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhMC5sZW5ndGg7IGkrPTEpIHsKKyAgICAgIGEwW2ldID0gKGJ5dGUpKChhMVtpXSArIGIpPj5WQUxVRSk7CisgICAgfQorICB9CisgIHN0YXRpYyB2b2lkIHRlc3Rfc3JhY19hbmQoYnl0ZVtdIGEwLCBieXRlW10gYTEpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGEwLmxlbmd0aDsgaSs9MSkgeworICAgICAgYTBbaV0gPSAoYnl0ZSkoKGExW2ldICYgQklUX01BU0spPj5WQUxVRSk7CisgICAgfQorICB9CisgIHN0YXRpYyB2b2lkIHRlc3Rfc3Jhdl9hbmQoYnl0ZVtdIGEwLCBieXRlW10gYTEsIGludCBiKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhMC5sZW5ndGg7IGkrPTEpIHsKKyAgICAgIGEwW2ldID0gKGJ5dGUpKChhMVtpXSAmIGIpPj5WQUxVRSk7CisgICAgfQorICB9CiAKICAgc3RhdGljIHZvaWQgdGVzdF9wYWNrMihzaG9ydFtdIHAyLCBieXRlW10gYTEpIHsKICAgICBpZiAocDIubGVuZ3RoKjIgPiBhMS5sZW5ndGgpIHJldHVybjsKZGlmZiAtLWdpdCBhL2hvdHNwb3QvdGVzdC9jb21waWxlci82MzQwODY0L1Rlc3RJbnRWZWN0LmphdmEgYi9ob3RzcG90L3Rlc3QvY29tcGlsZXIvNjM0MDg2NC9UZXN0SW50VmVjdC5qYXZhCmluZGV4IDM2ZTI3N2YuLjU4NjZiMzQgMTAwNjQ0Ci0tLSBhL2hvdHNwb3QvdGVzdC9jb21waWxlci82MzQwODY0L1Rlc3RJbnRWZWN0LmphdmEKKysrIGIvaG90c3BvdC90ZXN0L2NvbXBpbGVyLzYzNDA4NjQvVGVzdEludFZlY3QuamF2YQpAQCAtNzQsNiArNzQsNyBAQAogICAgICAgdGVzdF9zdWJjKGEwLCBhMSk7CiAgICAgICB0ZXN0X3N1YnYoYTAsIGExLCAoaW50KVZBTFVFKTsKICAgICAgIHRlc3Rfc3ViYShhMCwgYTEsIGEyKTsKKwogICAgICAgdGVzdF9tdWxjKGEwLCBhMSk7CiAgICAgICB0ZXN0X211bHYoYTAsIGExLCAoaW50KVZBTFVFKTsKICAgICAgIHRlc3RfbXVsYShhMCwgYTEsIGEyKTsKQEAgLTg2LDYgKzg3LDcgQEAKICAgICAgIHRlc3RfZGl2Y19uKGEwLCBhMSk7CiAgICAgICB0ZXN0X2RpdnYoYTAsIGExLCAoaW50KS1WQUxVRSk7CiAgICAgICB0ZXN0X2RpdmEoYTAsIGExLCBhMyk7CisKICAgICAgIHRlc3RfYW5kYyhhMCwgYTEpOwogICAgICAgdGVzdF9hbmR2KGEwLCBhMSwgKGludClCSVRfTUFTSyk7CiAgICAgICB0ZXN0X2FuZGEoYTAsIGExLCBhNCk7CkBAIC05NSwzMCArOTcsNDkgQEAKICAgICAgIHRlc3RfeG9yYyhhMCwgYTEpOwogICAgICAgdGVzdF94b3J2KGEwLCBhMSwgKGludClCSVRfTUFTSyk7CiAgICAgICB0ZXN0X3hvcmEoYTAsIGExLCBhNCk7CisKICAgICAgIHRlc3Rfc2xsYyhhMCwgYTEpOwogICAgICAgdGVzdF9zbGx2KGEwLCBhMSwgVkFMVUUpOwogICAgICAgdGVzdF9zcmxjKGEwLCBhMSk7CiAgICAgICB0ZXN0X3NybHYoYTAsIGExLCBWQUxVRSk7CiAgICAgICB0ZXN0X3NyYWMoYTAsIGExKTsKICAgICAgIHRlc3Rfc3JhdihhMCwgYTEsIFZBTFVFKTsKKwogICAgICAgdGVzdF9zbGxjX24oYTAsIGExKTsKICAgICAgIHRlc3Rfc2xsdihhMCwgYTEsIC1WQUxVRSk7CiAgICAgICB0ZXN0X3NybGNfbihhMCwgYTEpOwogICAgICAgdGVzdF9zcmx2KGEwLCBhMSwgLVZBTFVFKTsKICAgICAgIHRlc3Rfc3JhY19uKGEwLCBhMSk7CiAgICAgICB0ZXN0X3NyYXYoYTAsIGExLCAtVkFMVUUpOworCiAgICAgICB0ZXN0X3NsbGNfbyhhMCwgYTEpOwogICAgICAgdGVzdF9zbGx2KGEwLCBhMSwgU0hJRlQpOwogICAgICAgdGVzdF9zcmxjX28oYTAsIGExKTsKICAgICAgIHRlc3Rfc3JsdihhMCwgYTEsIFNISUZUKTsKICAgICAgIHRlc3Rfc3JhY19vKGEwLCBhMSk7CiAgICAgICB0ZXN0X3NyYXYoYTAsIGExLCBTSElGVCk7CisKICAgICAgIHRlc3Rfc2xsY19vbihhMCwgYTEpOwogICAgICAgdGVzdF9zbGx2KGEwLCBhMSwgLVNISUZUKTsKICAgICAgIHRlc3Rfc3JsY19vbihhMCwgYTEpOwogICAgICAgdGVzdF9zcmx2KGEwLCBhMSwgLVNISUZUKTsKICAgICAgIHRlc3Rfc3JhY19vbihhMCwgYTEpOwogICAgICAgdGVzdF9zcmF2KGEwLCBhMSwgLVNISUZUKTsKKworICAgICAgdGVzdF9zbGxjX2FkZChhMCwgYTEpOworICAgICAgdGVzdF9zbGx2X2FkZChhMCwgYTEsIEFERF9JTklUKTsKKyAgICAgIHRlc3Rfc3JsY19hZGQoYTAsIGExKTsKKyAgICAgIHRlc3Rfc3Jsdl9hZGQoYTAsIGExLCBBRERfSU5JVCk7CisgICAgICB0ZXN0X3NyYWNfYWRkKGEwLCBhMSk7CisgICAgICB0ZXN0X3NyYXZfYWRkKGEwLCBhMSwgQUREX0lOSVQpOworCisgICAgICB0ZXN0X3NsbGNfYW5kKGEwLCBhMSk7CisgICAgICB0ZXN0X3NsbHZfYW5kKGEwLCBhMSwgQklUX01BU0spOworICAgICAgdGVzdF9zcmxjX2FuZChhMCwgYTEpOworICAgICAgdGVzdF9zcmx2X2FuZChhMCwgYTEsIEJJVF9NQVNLKTsKKyAgICAgIHRlc3Rfc3JhY19hbmQoYTAsIGExKTsKKyAgICAgIHRlc3Rfc3Jhdl9hbmQoYTAsIGExLCBCSVRfTUFTSyk7CisKICAgICAgIHRlc3RfcGFjazIocDIsIGExKTsKICAgICAgIHRlc3RfdW5wYWNrMihhMCwgcDIpOwogICAgICAgdGVzdF9wYWNrMl9zd2FwKHAyLCBhMSk7CkBAIC0zNTksNiArMzgwLDYwIEBACiAgICAgICAgIGVycm4gKz0gdmVyaWZ5KCJ0ZXN0X3NyYXZfb246ICIsIGksIGEwW2ldLCAoaW50KSgoaW50KShBRERfSU5JVCtpKT4+KC1TSElGVCkpKTsKICAgICAgIH0KIAorICAgICAgdGVzdF9zbGxjX2FkZChhMCwgYTEpOworICAgICAgZm9yIChpbnQgaT0wOyBpPEFSUkxFTjsgaSsrKSB7CisgICAgICAgIGVycm4gKz0gdmVyaWZ5KCJ0ZXN0X3NsbGNfYWRkOiAiLCBpLCBhMFtpXSwgKGludCkoKChpbnQpKEFERF9JTklUK2kpICsgQUREX0lOSVQpPDxWQUxVRSkpOworICAgICAgfQorICAgICAgdGVzdF9zbGx2X2FkZChhMCwgYTEsIEFERF9JTklUKTsKKyAgICAgIGZvciAoaW50IGk9MDsgaTxBUlJMRU47IGkrKykgeworICAgICAgICBlcnJuICs9IHZlcmlmeSgidGVzdF9zbGx2X2FkZDogIiwgaSwgYTBbaV0sIChpbnQpKCgoaW50KShBRERfSU5JVCtpKSArIEFERF9JTklUKTw8VkFMVUUpKTsKKyAgICAgIH0KKworICAgICAgdGVzdF9zcmxjX2FkZChhMCwgYTEpOworICAgICAgZm9yIChpbnQgaT0wOyBpPEFSUkxFTjsgaSsrKSB7CisgICAgICAgIGVycm4gKz0gdmVyaWZ5KCJ0ZXN0X3NybGNfYWRkOiAiLCBpLCBhMFtpXSwgKGludCkoKChpbnQpKEFERF9JTklUK2kpICsgQUREX0lOSVQpPj4+VkFMVUUpKTsKKyAgICAgIH0KKyAgICAgIHRlc3Rfc3Jsdl9hZGQoYTAsIGExLCBBRERfSU5JVCk7CisgICAgICBmb3IgKGludCBpPTA7IGk8QVJSTEVOOyBpKyspIHsKKyAgICAgICAgZXJybiArPSB2ZXJpZnkoInRlc3Rfc3Jsdl9hZGQ6ICIsIGksIGEwW2ldLCAoaW50KSgoKGludCkoQUREX0lOSVQraSkgKyBBRERfSU5JVCk+Pj5WQUxVRSkpOworICAgICAgfQorCisgICAgICB0ZXN0X3NyYWNfYWRkKGEwLCBhMSk7CisgICAgICBmb3IgKGludCBpPTA7IGk8QVJSTEVOOyBpKyspIHsKKyAgICAgICAgZXJybiArPSB2ZXJpZnkoInRlc3Rfc3JhY19hZGQ6ICIsIGksIGEwW2ldLCAoaW50KSgoKGludCkoQUREX0lOSVQraSkgKyBBRERfSU5JVCk+PlZBTFVFKSk7CisgICAgICB9CisgICAgICB0ZXN0X3NyYXZfYWRkKGEwLCBhMSwgQUREX0lOSVQpOworICAgICAgZm9yIChpbnQgaT0wOyBpPEFSUkxFTjsgaSsrKSB7CisgICAgICAgIGVycm4gKz0gdmVyaWZ5KCJ0ZXN0X3NyYXZfYWRkOiAiLCBpLCBhMFtpXSwgKGludCkoKChpbnQpKEFERF9JTklUK2kpICsgQUREX0lOSVQpPj5WQUxVRSkpOworICAgICAgfQorCisgICAgICB0ZXN0X3NsbGNfYW5kKGEwLCBhMSk7CisgICAgICBmb3IgKGludCBpPTA7IGk8QVJSTEVOOyBpKyspIHsKKyAgICAgICAgZXJybiArPSB2ZXJpZnkoInRlc3Rfc2xsY19hbmQ6ICIsIGksIGEwW2ldLCAoaW50KSgoKGludCkoQUREX0lOSVQraSkgJiBCSVRfTUFTSyk8PFZBTFVFKSk7CisgICAgICB9CisgICAgICB0ZXN0X3NsbHZfYW5kKGEwLCBhMSwgQklUX01BU0spOworICAgICAgZm9yIChpbnQgaT0wOyBpPEFSUkxFTjsgaSsrKSB7CisgICAgICAgIGVycm4gKz0gdmVyaWZ5KCJ0ZXN0X3NsbHZfYW5kOiAiLCBpLCBhMFtpXSwgKGludCkoKChpbnQpKEFERF9JTklUK2kpICYgQklUX01BU0spPDxWQUxVRSkpOworICAgICAgfQorCisgICAgICB0ZXN0X3NybGNfYW5kKGEwLCBhMSk7CisgICAgICBmb3IgKGludCBpPTA7IGk8QVJSTEVOOyBpKyspIHsKKyAgICAgICAgZXJybiArPSB2ZXJpZnkoInRlc3Rfc3JsY19hbmQ6ICIsIGksIGEwW2ldLCAoaW50KSgoKGludCkoQUREX0lOSVQraSkgJiBCSVRfTUFTSyk+Pj5WQUxVRSkpOworICAgICAgfQorICAgICAgdGVzdF9zcmx2X2FuZChhMCwgYTEsIEJJVF9NQVNLKTsKKyAgICAgIGZvciAoaW50IGk9MDsgaTxBUlJMRU47IGkrKykgeworICAgICAgICBlcnJuICs9IHZlcmlmeSgidGVzdF9zcmx2X2FuZDogIiwgaSwgYTBbaV0sIChpbnQpKCgoaW50KShBRERfSU5JVCtpKSAmIEJJVF9NQVNLKT4+PlZBTFVFKSk7CisgICAgICB9CisKKyAgICAgIHRlc3Rfc3JhY19hbmQoYTAsIGExKTsKKyAgICAgIGZvciAoaW50IGk9MDsgaTxBUlJMRU47IGkrKykgeworICAgICAgICBlcnJuICs9IHZlcmlmeSgidGVzdF9zcmFjX2FuZDogIiwgaSwgYTBbaV0sIChpbnQpKCgoaW50KShBRERfSU5JVCtpKSAmIEJJVF9NQVNLKT4+VkFMVUUpKTsKKyAgICAgIH0KKyAgICAgIHRlc3Rfc3Jhdl9hbmQoYTAsIGExLCBCSVRfTUFTSyk7CisgICAgICBmb3IgKGludCBpPTA7IGk8QVJSTEVOOyBpKyspIHsKKyAgICAgICAgZXJybiArPSB2ZXJpZnkoInRlc3Rfc3Jhdl9hbmQ6ICIsIGksIGEwW2ldLCAoaW50KSgoKGludCkoQUREX0lOSVQraSkgJiBCSVRfTUFTSyk+PlZBTFVFKSk7CisgICAgICB9CisKICAgICAgIHRlc3RfcGFjazIocDIsIGExKTsKICAgICAgIGZvciAoaW50IGk9MDsgaTxBUlJMRU4vMjsgaSsrKSB7CiAgICAgICAgIGVycm4gKz0gdmVyaWZ5KCJ0ZXN0X3BhY2syOiAiLCBpLCBwMltpXSwgKChsb25nKShBRERfSU5JVCsyKmkpICYgMHhGRkZGRkZGRmwpIHwgKChsb25nKShBRERfSU5JVCsyKmkrMSkgPDwgMzIpKTsKQEAgLTcyNyw2ICs4MDIsODQgQEAKIAogICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CiAgICAgZm9yIChpbnQgaT0wOyBpPElURVJTOyBpKyspIHsKKyAgICAgIHRlc3Rfc2xsY19hZGQoYTAsIGExKTsKKyAgICB9CisgICAgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0ZXN0X3NsbGNfYWRkOiAiICsgKGVuZCAtIHN0YXJ0KSk7CisgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBmb3IgKGludCBpPTA7IGk8SVRFUlM7IGkrKykgeworICAgICAgdGVzdF9zbGx2X2FkZChhMCwgYTEsIEFERF9JTklUKTsKKyAgICB9CisgICAgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0ZXN0X3NsbHZfYWRkOiAiICsgKGVuZCAtIHN0YXJ0KSk7CisKKyAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIGZvciAoaW50IGk9MDsgaTxJVEVSUzsgaSsrKSB7CisgICAgICB0ZXN0X3NybGNfYWRkKGEwLCBhMSk7CisgICAgfQorICAgIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGVzdF9zcmxjX2FkZDogIiArIChlbmQgLSBzdGFydCkpOworICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgZm9yIChpbnQgaT0wOyBpPElURVJTOyBpKyspIHsKKyAgICAgIHRlc3Rfc3Jsdl9hZGQoYTAsIGExLCBBRERfSU5JVCk7CisgICAgfQorICAgIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGVzdF9zcmx2X2FkZDogIiArIChlbmQgLSBzdGFydCkpOworCisgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBmb3IgKGludCBpPTA7IGk8SVRFUlM7IGkrKykgeworICAgICAgdGVzdF9zcmFjX2FkZChhMCwgYTEpOworICAgIH0KKyAgICBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oInRlc3Rfc3JhY19hZGQ6ICIgKyAoZW5kIC0gc3RhcnQpKTsKKyAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIGZvciAoaW50IGk9MDsgaTxJVEVSUzsgaSsrKSB7CisgICAgICB0ZXN0X3NyYXZfYWRkKGEwLCBhMSwgQUREX0lOSVQpOworICAgIH0KKyAgICBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oInRlc3Rfc3Jhdl9hZGQ6ICIgKyAoZW5kIC0gc3RhcnQpKTsKKworICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgZm9yIChpbnQgaT0wOyBpPElURVJTOyBpKyspIHsKKyAgICAgIHRlc3Rfc2xsY19hbmQoYTAsIGExKTsKKyAgICB9CisgICAgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0ZXN0X3NsbGNfYW5kOiAiICsgKGVuZCAtIHN0YXJ0KSk7CisgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBmb3IgKGludCBpPTA7IGk8SVRFUlM7IGkrKykgeworICAgICAgdGVzdF9zbGx2X2FuZChhMCwgYTEsIEJJVF9NQVNLKTsKKyAgICB9CisgICAgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0ZXN0X3NsbHZfYW5kOiAiICsgKGVuZCAtIHN0YXJ0KSk7CisKKyAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIGZvciAoaW50IGk9MDsgaTxJVEVSUzsgaSsrKSB7CisgICAgICB0ZXN0X3NybGNfYW5kKGEwLCBhMSk7CisgICAgfQorICAgIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGVzdF9zcmxjX2FuZDogIiArIChlbmQgLSBzdGFydCkpOworICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgZm9yIChpbnQgaT0wOyBpPElURVJTOyBpKyspIHsKKyAgICAgIHRlc3Rfc3Jsdl9hbmQoYTAsIGExLCBCSVRfTUFTSyk7CisgICAgfQorICAgIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGVzdF9zcmx2X2FuZDogIiArIChlbmQgLSBzdGFydCkpOworCisgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBmb3IgKGludCBpPTA7IGk8SVRFUlM7IGkrKykgeworICAgICAgdGVzdF9zcmFjX2FuZChhMCwgYTEpOworICAgIH0KKyAgICBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oInRlc3Rfc3JhY19hbmQ6ICIgKyAoZW5kIC0gc3RhcnQpKTsKKyAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIGZvciAoaW50IGk9MDsgaTxJVEVSUzsgaSsrKSB7CisgICAgICB0ZXN0X3NyYXZfYW5kKGEwLCBhMSwgQklUX01BU0spOworICAgIH0KKyAgICBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oInRlc3Rfc3Jhdl9hbmQ6ICIgKyAoZW5kIC0gc3RhcnQpKTsKKworICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgZm9yIChpbnQgaT0wOyBpPElURVJTOyBpKyspIHsKICAgICAgIHRlc3RfcGFjazIocDIsIGExKTsKICAgICB9CiAgICAgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CkBAIC05MDgsNiArMTA2MSwyNiBAQAogICAgICAgYTBbaV0gPSAoaW50KShhMVtpXTw8Yik7CiAgICAgfQogICB9CisgIHN0YXRpYyB2b2lkIHRlc3Rfc2xsY19hZGQoaW50W10gYTAsIGludFtdIGExKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhMC5sZW5ndGg7IGkrPTEpIHsKKyAgICAgIGEwW2ldID0gKGludCkoKGExW2ldICsgQUREX0lOSVQpPDxWQUxVRSk7CisgICAgfQorICB9CisgIHN0YXRpYyB2b2lkIHRlc3Rfc2xsdl9hZGQoaW50W10gYTAsIGludFtdIGExLCBpbnQgYikgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYTAubGVuZ3RoOyBpKz0xKSB7CisgICAgICBhMFtpXSA9IChpbnQpKChhMVtpXSArIGIpPDxWQUxVRSk7CisgICAgfQorICB9CisgIHN0YXRpYyB2b2lkIHRlc3Rfc2xsY19hbmQoaW50W10gYTAsIGludFtdIGExKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhMC5sZW5ndGg7IGkrPTEpIHsKKyAgICAgIGEwW2ldID0gKGludCkoKGExW2ldICYgQklUX01BU0spPDxWQUxVRSk7CisgICAgfQorICB9CisgIHN0YXRpYyB2b2lkIHRlc3Rfc2xsdl9hbmQoaW50W10gYTAsIGludFtdIGExLCBpbnQgYikgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYTAubGVuZ3RoOyBpKz0xKSB7CisgICAgICBhMFtpXSA9IChpbnQpKChhMVtpXSAmIGIpPDxWQUxVRSk7CisgICAgfQorICB9CiAKICAgc3RhdGljIHZvaWQgdGVzdF9zcmxjKGludFtdIGEwLCBpbnRbXSBhMSkgewogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYTAubGVuZ3RoOyBpKz0xKSB7CkBAIC05MzQsNiArMTEwNywyNiBAQAogICAgICAgYTBbaV0gPSAoaW50KShhMVtpXT4+PmIpOwogICAgIH0KICAgfQorICBzdGF0aWMgdm9pZCB0ZXN0X3NybGNfYWRkKGludFtdIGEwLCBpbnRbXSBhMSkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYTAubGVuZ3RoOyBpKz0xKSB7CisgICAgICBhMFtpXSA9IChpbnQpKChhMVtpXSArIEFERF9JTklUKT4+PlZBTFVFKTsKKyAgICB9CisgIH0KKyAgc3RhdGljIHZvaWQgdGVzdF9zcmx2X2FkZChpbnRbXSBhMCwgaW50W10gYTEsIGludCBiKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhMC5sZW5ndGg7IGkrPTEpIHsKKyAgICAgIGEwW2ldID0gKGludCkoKGExW2ldICsgYik+Pj5WQUxVRSk7CisgICAgfQorICB9CisgIHN0YXRpYyB2b2lkIHRlc3Rfc3JsY19hbmQoaW50W10gYTAsIGludFtdIGExKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhMC5sZW5ndGg7IGkrPTEpIHsKKyAgICAgIGEwW2ldID0gKGludCkoKGExW2ldICYgQklUX01BU0spPj4+VkFMVUUpOworICAgIH0KKyAgfQorICBzdGF0aWMgdm9pZCB0ZXN0X3NybHZfYW5kKGludFtdIGEwLCBpbnRbXSBhMSwgaW50IGIpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGEwLmxlbmd0aDsgaSs9MSkgeworICAgICAgYTBbaV0gPSAoaW50KSgoYTFbaV0gJiBiKT4+PlZBTFVFKTsKKyAgICB9CisgIH0KIAogICBzdGF0aWMgdm9pZCB0ZXN0X3NyYWMoaW50W10gYTAsIGludFtdIGExKSB7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhMC5sZW5ndGg7IGkrPTEpIHsKQEAgLTk2MCw2ICsxMTUzLDI2IEBACiAgICAgICBhMFtpXSA9IChpbnQpKGExW2ldPj5iKTsKICAgICB9CiAgIH0KKyAgc3RhdGljIHZvaWQgdGVzdF9zcmFjX2FkZChpbnRbXSBhMCwgaW50W10gYTEpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGEwLmxlbmd0aDsgaSs9MSkgeworICAgICAgYTBbaV0gPSAoaW50KSgoYTFbaV0gKyBBRERfSU5JVCk+PlZBTFVFKTsKKyAgICB9CisgIH0KKyAgc3RhdGljIHZvaWQgdGVzdF9zcmF2X2FkZChpbnRbXSBhMCwgaW50W10gYTEsIGludCBiKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhMC5sZW5ndGg7IGkrPTEpIHsKKyAgICAgIGEwW2ldID0gKGludCkoKGExW2ldICsgYik+PlZBTFVFKTsKKyAgICB9CisgIH0KKyAgc3RhdGljIHZvaWQgdGVzdF9zcmFjX2FuZChpbnRbXSBhMCwgaW50W10gYTEpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGEwLmxlbmd0aDsgaSs9MSkgeworICAgICAgYTBbaV0gPSAoaW50KSgoYTFbaV0gJiBCSVRfTUFTSyk+PlZBTFVFKTsKKyAgICB9CisgIH0KKyAgc3RhdGljIHZvaWQgdGVzdF9zcmF2X2FuZChpbnRbXSBhMCwgaW50W10gYTEsIGludCBiKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhMC5sZW5ndGg7IGkrPTEpIHsKKyAgICAgIGEwW2ldID0gKGludCkoKGExW2ldICYgYik+PlZBTFVFKTsKKyAgICB9CisgIH0KIAogICBzdGF0aWMgdm9pZCB0ZXN0X3BhY2syKGxvbmdbXSBwMiwgaW50W10gYTEpIHsKICAgICBpZiAocDIubGVuZ3RoKjIgPiBhMS5sZW5ndGgpIHJldHVybjsKZGlmZiAtLWdpdCBhL2hvdHNwb3QvdGVzdC9jb21waWxlci82MzQwODY0L1Rlc3RMb25nVmVjdC5qYXZhIGIvaG90c3BvdC90ZXN0L2NvbXBpbGVyLzYzNDA4NjQvVGVzdExvbmdWZWN0LmphdmEKaW5kZXggNzBiNDFmNC4uNDM2YTg0NyAxMDA2NDQKLS0tIGEvaG90c3BvdC90ZXN0L2NvbXBpbGVyLzYzNDA4NjQvVGVzdExvbmdWZWN0LmphdmEKKysrIGIvaG90c3BvdC90ZXN0L2NvbXBpbGVyLzYzNDA4NjQvVGVzdExvbmdWZWN0LmphdmEKQEAgLTczLDYgKzczLDcgQEAKICAgICAgIHRlc3Rfc3ViYyhhMCwgYTEpOwogICAgICAgdGVzdF9zdWJ2KGEwLCBhMSwgKGxvbmcpVkFMVUUpOwogICAgICAgdGVzdF9zdWJhKGEwLCBhMSwgYTIpOworCiAgICAgICB0ZXN0X211bGMoYTAsIGExKTsKICAgICAgIHRlc3RfbXVsdihhMCwgYTEsIChsb25nKVZBTFVFKTsKICAgICAgIHRlc3RfbXVsYShhMCwgYTEsIGEyKTsKQEAgLTg1LDYgKzg2LDcgQEAKICAgICAgIHRlc3RfZGl2Y19uKGEwLCBhMSk7CiAgICAgICB0ZXN0X2RpdnYoYTAsIGExLCAobG9uZyktVkFMVUUpOwogICAgICAgdGVzdF9kaXZhKGEwLCBhMSwgYTMpOworCiAgICAgICB0ZXN0X2FuZGMoYTAsIGExKTsKICAgICAgIHRlc3RfYW5kdihhMCwgYTEsIChsb25nKUJJVF9NQVNLKTsKICAgICAgIHRlc3RfYW5kYShhMCwgYTEsIGE0KTsKQEAgLTk0LDMwICs5Niw0OCBAQAogICAgICAgdGVzdF94b3JjKGEwLCBhMSk7CiAgICAgICB0ZXN0X3hvcnYoYTAsIGExLCAobG9uZylCSVRfTUFTSyk7CiAgICAgICB0ZXN0X3hvcmEoYTAsIGExLCBhNCk7CisKICAgICAgIHRlc3Rfc2xsYyhhMCwgYTEpOwogICAgICAgdGVzdF9zbGx2KGEwLCBhMSwgVkFMVUUpOwogICAgICAgdGVzdF9zcmxjKGEwLCBhMSk7CiAgICAgICB0ZXN0X3NybHYoYTAsIGExLCBWQUxVRSk7CiAgICAgICB0ZXN0X3NyYWMoYTAsIGExKTsKICAgICAgIHRlc3Rfc3JhdihhMCwgYTEsIFZBTFVFKTsKKwogICAgICAgdGVzdF9zbGxjX24oYTAsIGExKTsKICAgICAgIHRlc3Rfc2xsdihhMCwgYTEsIC1WQUxVRSk7CiAgICAgICB0ZXN0X3NybGNfbihhMCwgYTEpOwogICAgICAgdGVzdF9zcmx2KGEwLCBhMSwgLVZBTFVFKTsKICAgICAgIHRlc3Rfc3JhY19uKGEwLCBhMSk7CiAgICAgICB0ZXN0X3NyYXYoYTAsIGExLCAtVkFMVUUpOworCiAgICAgICB0ZXN0X3NsbGNfbyhhMCwgYTEpOwogICAgICAgdGVzdF9zbGx2KGEwLCBhMSwgU0hJRlQpOwogICAgICAgdGVzdF9zcmxjX28oYTAsIGExKTsKICAgICAgIHRlc3Rfc3JsdihhMCwgYTEsIFNISUZUKTsKICAgICAgIHRlc3Rfc3JhY19vKGEwLCBhMSk7CiAgICAgICB0ZXN0X3NyYXYoYTAsIGExLCBTSElGVCk7CisKICAgICAgIHRlc3Rfc2xsY19vbihhMCwgYTEpOwogICAgICAgdGVzdF9zbGx2KGEwLCBhMSwgLVNISUZUKTsKICAgICAgIHRlc3Rfc3JsY19vbihhMCwgYTEpOwogICAgICAgdGVzdF9zcmx2KGEwLCBhMSwgLVNISUZUKTsKICAgICAgIHRlc3Rfc3JhY19vbihhMCwgYTEpOwogICAgICAgdGVzdF9zcmF2KGEwLCBhMSwgLVNISUZUKTsKKworICAgICAgdGVzdF9zbGxjX2FkZChhMCwgYTEpOworICAgICAgdGVzdF9zbGx2X2FkZChhMCwgYTEsIEFERF9JTklUKTsKKyAgICAgIHRlc3Rfc3JsY19hZGQoYTAsIGExKTsKKyAgICAgIHRlc3Rfc3Jsdl9hZGQoYTAsIGExLCBBRERfSU5JVCk7CisgICAgICB0ZXN0X3NyYWNfYWRkKGEwLCBhMSk7CisgICAgICB0ZXN0X3NyYXZfYWRkKGEwLCBhMSwgQUREX0lOSVQpOworCisgICAgICB0ZXN0X3NsbGNfYW5kKGEwLCBhMSk7CisgICAgICB0ZXN0X3NsbHZfYW5kKGEwLCBhMSwgQklUX01BU0spOworICAgICAgdGVzdF9zcmxjX2FuZChhMCwgYTEpOworICAgICAgdGVzdF9zcmx2X2FuZChhMCwgYTEsIEJJVF9NQVNLKTsKKyAgICAgIHRlc3Rfc3JhY19hbmQoYTAsIGExKTsKKyAgICAgIHRlc3Rfc3Jhdl9hbmQoYTAsIGExLCBCSVRfTUFTSyk7CiAgICAgfQogICAgIC8vIFRlc3QgYW5kIHZlcmlmeSByZXN1bHRzCiAgICAgU3lzdGVtLm91dC5wcmludGxuKCJWZXJpZmljYXRpb24iKTsKQEAgLTM1NCw2ICszNzQsNjAgQEAKICAgICAgICAgZXJybiArPSB2ZXJpZnkoInRlc3Rfc3Jhdl9vbjogIiwgaSwgYTBbaV0sIChsb25nKSgobG9uZykoQUREX0lOSVQraSk+PigtU0hJRlQpKSk7CiAgICAgICB9CiAKKyAgICAgIHRlc3Rfc2xsY19hZGQoYTAsIGExKTsKKyAgICAgIGZvciAoaW50IGk9MDsgaTxBUlJMRU47IGkrKykgeworICAgICAgICBlcnJuICs9IHZlcmlmeSgidGVzdF9zbGxjX2FkZDogIiwgaSwgYTBbaV0sIChsb25nKSgoKGxvbmcpKEFERF9JTklUK2kpICsgQUREX0lOSVQpPDxWQUxVRSkpOworICAgICAgfQorICAgICAgdGVzdF9zbGx2X2FkZChhMCwgYTEsIEFERF9JTklUKTsKKyAgICAgIGZvciAoaW50IGk9MDsgaTxBUlJMRU47IGkrKykgeworICAgICAgICBlcnJuICs9IHZlcmlmeSgidGVzdF9zbGx2X2FkZDogIiwgaSwgYTBbaV0sIChsb25nKSgoKGxvbmcpKEFERF9JTklUK2kpICsgQUREX0lOSVQpPDxWQUxVRSkpOworICAgICAgfQorCisgICAgICB0ZXN0X3NybGNfYWRkKGEwLCBhMSk7CisgICAgICBmb3IgKGludCBpPTA7IGk8QVJSTEVOOyBpKyspIHsKKyAgICAgICAgZXJybiArPSB2ZXJpZnkoInRlc3Rfc3JsY19hZGQ6ICIsIGksIGEwW2ldLCAobG9uZykoKChsb25nKShBRERfSU5JVCtpKSArIEFERF9JTklUKT4+PlZBTFVFKSk7CisgICAgICB9CisgICAgICB0ZXN0X3NybHZfYWRkKGEwLCBhMSwgQUREX0lOSVQpOworICAgICAgZm9yIChpbnQgaT0wOyBpPEFSUkxFTjsgaSsrKSB7CisgICAgICAgIGVycm4gKz0gdmVyaWZ5KCJ0ZXN0X3NybHZfYWRkOiAiLCBpLCBhMFtpXSwgKGxvbmcpKCgobG9uZykoQUREX0lOSVQraSkgKyBBRERfSU5JVCk+Pj5WQUxVRSkpOworICAgICAgfQorCisgICAgICB0ZXN0X3NyYWNfYWRkKGEwLCBhMSk7CisgICAgICBmb3IgKGludCBpPTA7IGk8QVJSTEVOOyBpKyspIHsKKyAgICAgICAgZXJybiArPSB2ZXJpZnkoInRlc3Rfc3JhY19hZGQ6ICIsIGksIGEwW2ldLCAobG9uZykoKChsb25nKShBRERfSU5JVCtpKSArIEFERF9JTklUKT4+VkFMVUUpKTsKKyAgICAgIH0KKyAgICAgIHRlc3Rfc3Jhdl9hZGQoYTAsIGExLCBBRERfSU5JVCk7CisgICAgICBmb3IgKGludCBpPTA7IGk8QVJSTEVOOyBpKyspIHsKKyAgICAgICAgZXJybiArPSB2ZXJpZnkoInRlc3Rfc3Jhdl9hZGQ6ICIsIGksIGEwW2ldLCAobG9uZykoKChsb25nKShBRERfSU5JVCtpKSArIEFERF9JTklUKT4+VkFMVUUpKTsKKyAgICAgIH0KKworICAgICAgdGVzdF9zbGxjX2FuZChhMCwgYTEpOworICAgICAgZm9yIChpbnQgaT0wOyBpPEFSUkxFTjsgaSsrKSB7CisgICAgICAgIGVycm4gKz0gdmVyaWZ5KCJ0ZXN0X3NsbGNfYW5kOiAiLCBpLCBhMFtpXSwgKGxvbmcpKCgobG9uZykoQUREX0lOSVQraSkgJiBCSVRfTUFTSyk8PFZBTFVFKSk7CisgICAgICB9CisgICAgICB0ZXN0X3NsbHZfYW5kKGEwLCBhMSwgQklUX01BU0spOworICAgICAgZm9yIChpbnQgaT0wOyBpPEFSUkxFTjsgaSsrKSB7CisgICAgICAgIGVycm4gKz0gdmVyaWZ5KCJ0ZXN0X3NsbHZfYW5kOiAiLCBpLCBhMFtpXSwgKGxvbmcpKCgobG9uZykoQUREX0lOSVQraSkgJiBCSVRfTUFTSyk8PFZBTFVFKSk7CisgICAgICB9CisKKyAgICAgIHRlc3Rfc3JsY19hbmQoYTAsIGExKTsKKyAgICAgIGZvciAoaW50IGk9MDsgaTxBUlJMRU47IGkrKykgeworICAgICAgICBlcnJuICs9IHZlcmlmeSgidGVzdF9zcmxjX2FuZDogIiwgaSwgYTBbaV0sIChsb25nKSgoKGxvbmcpKEFERF9JTklUK2kpICYgQklUX01BU0spPj4+VkFMVUUpKTsKKyAgICAgIH0KKyAgICAgIHRlc3Rfc3Jsdl9hbmQoYTAsIGExLCBCSVRfTUFTSyk7CisgICAgICBmb3IgKGludCBpPTA7IGk8QVJSTEVOOyBpKyspIHsKKyAgICAgICAgZXJybiArPSB2ZXJpZnkoInRlc3Rfc3Jsdl9hbmQ6ICIsIGksIGEwW2ldLCAobG9uZykoKChsb25nKShBRERfSU5JVCtpKSAmIEJJVF9NQVNLKT4+PlZBTFVFKSk7CisgICAgICB9CisKKyAgICAgIHRlc3Rfc3JhY19hbmQoYTAsIGExKTsKKyAgICAgIGZvciAoaW50IGk9MDsgaTxBUlJMRU47IGkrKykgeworICAgICAgICBlcnJuICs9IHZlcmlmeSgidGVzdF9zcmFjX2FuZDogIiwgaSwgYTBbaV0sIChsb25nKSgoKGxvbmcpKEFERF9JTklUK2kpICYgQklUX01BU0spPj5WQUxVRSkpOworICAgICAgfQorICAgICAgdGVzdF9zcmF2X2FuZChhMCwgYTEsIEJJVF9NQVNLKTsKKyAgICAgIGZvciAoaW50IGk9MDsgaTxBUlJMRU47IGkrKykgeworICAgICAgICBlcnJuICs9IHZlcmlmeSgidGVzdF9zcmF2X2FuZDogIiwgaSwgYTBbaV0sIChsb25nKSgoKGxvbmcpKEFERF9JTklUK2kpICYgQklUX01BU0spPj5WQUxVRSkpOworICAgICAgfQorCiAgICAgfQogCiAgICAgaWYgKGVycm4gPiAwKQpAQCAtNjk2LDYgKzc3MCw4NCBAQAogICAgIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGVzdF9zcmF2X29uOiAiICsgKGVuZCAtIHN0YXJ0KSk7CiAKKyAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIGZvciAoaW50IGk9MDsgaTxJVEVSUzsgaSsrKSB7CisgICAgICB0ZXN0X3NsbGNfYWRkKGEwLCBhMSk7CisgICAgfQorICAgIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGVzdF9zbGxjX2FkZDogIiArIChlbmQgLSBzdGFydCkpOworICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgZm9yIChpbnQgaT0wOyBpPElURVJTOyBpKyspIHsKKyAgICAgIHRlc3Rfc2xsdl9hZGQoYTAsIGExLCBBRERfSU5JVCk7CisgICAgfQorICAgIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGVzdF9zbGx2X2FkZDogIiArIChlbmQgLSBzdGFydCkpOworCisgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBmb3IgKGludCBpPTA7IGk8SVRFUlM7IGkrKykgeworICAgICAgdGVzdF9zcmxjX2FkZChhMCwgYTEpOworICAgIH0KKyAgICBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oInRlc3Rfc3JsY19hZGQ6ICIgKyAoZW5kIC0gc3RhcnQpKTsKKyAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIGZvciAoaW50IGk9MDsgaTxJVEVSUzsgaSsrKSB7CisgICAgICB0ZXN0X3NybHZfYWRkKGEwLCBhMSwgQUREX0lOSVQpOworICAgIH0KKyAgICBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oInRlc3Rfc3Jsdl9hZGQ6ICIgKyAoZW5kIC0gc3RhcnQpKTsKKworICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgZm9yIChpbnQgaT0wOyBpPElURVJTOyBpKyspIHsKKyAgICAgIHRlc3Rfc3JhY19hZGQoYTAsIGExKTsKKyAgICB9CisgICAgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0ZXN0X3NyYWNfYWRkOiAiICsgKGVuZCAtIHN0YXJ0KSk7CisgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBmb3IgKGludCBpPTA7IGk8SVRFUlM7IGkrKykgeworICAgICAgdGVzdF9zcmF2X2FkZChhMCwgYTEsIEFERF9JTklUKTsKKyAgICB9CisgICAgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0ZXN0X3NyYXZfYWRkOiAiICsgKGVuZCAtIHN0YXJ0KSk7CisKKyAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIGZvciAoaW50IGk9MDsgaTxJVEVSUzsgaSsrKSB7CisgICAgICB0ZXN0X3NsbGNfYW5kKGEwLCBhMSk7CisgICAgfQorICAgIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGVzdF9zbGxjX2FuZDogIiArIChlbmQgLSBzdGFydCkpOworICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgZm9yIChpbnQgaT0wOyBpPElURVJTOyBpKyspIHsKKyAgICAgIHRlc3Rfc2xsdl9hbmQoYTAsIGExLCBCSVRfTUFTSyk7CisgICAgfQorICAgIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGVzdF9zbGx2X2FuZDogIiArIChlbmQgLSBzdGFydCkpOworCisgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBmb3IgKGludCBpPTA7IGk8SVRFUlM7IGkrKykgeworICAgICAgdGVzdF9zcmxjX2FuZChhMCwgYTEpOworICAgIH0KKyAgICBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oInRlc3Rfc3JsY19hbmQ6ICIgKyAoZW5kIC0gc3RhcnQpKTsKKyAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIGZvciAoaW50IGk9MDsgaTxJVEVSUzsgaSsrKSB7CisgICAgICB0ZXN0X3NybHZfYW5kKGEwLCBhMSwgQklUX01BU0spOworICAgIH0KKyAgICBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oInRlc3Rfc3Jsdl9hbmQ6ICIgKyAoZW5kIC0gc3RhcnQpKTsKKworICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgZm9yIChpbnQgaT0wOyBpPElURVJTOyBpKyspIHsKKyAgICAgIHRlc3Rfc3JhY19hbmQoYTAsIGExKTsKKyAgICB9CisgICAgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0ZXN0X3NyYWNfYW5kOiAiICsgKGVuZCAtIHN0YXJ0KSk7CisgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBmb3IgKGludCBpPTA7IGk8SVRFUlM7IGkrKykgeworICAgICAgdGVzdF9zcmF2X2FuZChhMCwgYTEsIEJJVF9NQVNLKTsKKyAgICB9CisgICAgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0ZXN0X3NyYXZfYW5kOiAiICsgKGVuZCAtIHN0YXJ0KSk7CisKICAgICByZXR1cm4gZXJybjsKICAgfQogCkBAIC04NTQsNiArMTAwNiwyNiBAQAogICAgICAgYTBbaV0gPSAobG9uZykoYTFbaV08PGIpOwogICAgIH0KICAgfQorICBzdGF0aWMgdm9pZCB0ZXN0X3NsbGNfYWRkKGxvbmdbXSBhMCwgbG9uZ1tdIGExKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhMC5sZW5ndGg7IGkrPTEpIHsKKyAgICAgIGEwW2ldID0gKGxvbmcpKChhMVtpXSArIEFERF9JTklUKTw8VkFMVUUpOworICAgIH0KKyAgfQorICBzdGF0aWMgdm9pZCB0ZXN0X3NsbHZfYWRkKGxvbmdbXSBhMCwgbG9uZ1tdIGExLCBsb25nIGIpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGEwLmxlbmd0aDsgaSs9MSkgeworICAgICAgYTBbaV0gPSAobG9uZykoKGExW2ldICsgYik8PFZBTFVFKTsKKyAgICB9CisgIH0KKyAgc3RhdGljIHZvaWQgdGVzdF9zbGxjX2FuZChsb25nW10gYTAsIGxvbmdbXSBhMSkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYTAubGVuZ3RoOyBpKz0xKSB7CisgICAgICBhMFtpXSA9IChsb25nKSgoYTFbaV0gJiBCSVRfTUFTSyk8PFZBTFVFKTsKKyAgICB9CisgIH0KKyAgc3RhdGljIHZvaWQgdGVzdF9zbGx2X2FuZChsb25nW10gYTAsIGxvbmdbXSBhMSwgbG9uZyBiKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhMC5sZW5ndGg7IGkrPTEpIHsKKyAgICAgIGEwW2ldID0gKGxvbmcpKChhMVtpXSAmIGIpPDxWQUxVRSk7CisgICAgfQorICB9CiAKICAgc3RhdGljIHZvaWQgdGVzdF9zcmxjKGxvbmdbXSBhMCwgbG9uZ1tdIGExKSB7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhMC5sZW5ndGg7IGkrPTEpIHsKQEAgLTg4MCw2ICsxMDUyLDI2IEBACiAgICAgICBhMFtpXSA9IChsb25nKShhMVtpXT4+PmIpOwogICAgIH0KICAgfQorICBzdGF0aWMgdm9pZCB0ZXN0X3NybGNfYWRkKGxvbmdbXSBhMCwgbG9uZ1tdIGExKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhMC5sZW5ndGg7IGkrPTEpIHsKKyAgICAgIGEwW2ldID0gKGxvbmcpKChhMVtpXSArIEFERF9JTklUKT4+PlZBTFVFKTsKKyAgICB9CisgIH0KKyAgc3RhdGljIHZvaWQgdGVzdF9zcmx2X2FkZChsb25nW10gYTAsIGxvbmdbXSBhMSwgbG9uZyBiKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhMC5sZW5ndGg7IGkrPTEpIHsKKyAgICAgIGEwW2ldID0gKGxvbmcpKChhMVtpXSArIGIpPj4+VkFMVUUpOworICAgIH0KKyAgfQorICBzdGF0aWMgdm9pZCB0ZXN0X3NybGNfYW5kKGxvbmdbXSBhMCwgbG9uZ1tdIGExKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhMC5sZW5ndGg7IGkrPTEpIHsKKyAgICAgIGEwW2ldID0gKGxvbmcpKChhMVtpXSAmIEJJVF9NQVNLKT4+PlZBTFVFKTsKKyAgICB9CisgIH0KKyAgc3RhdGljIHZvaWQgdGVzdF9zcmx2X2FuZChsb25nW10gYTAsIGxvbmdbXSBhMSwgbG9uZyBiKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhMC5sZW5ndGg7IGkrPTEpIHsKKyAgICAgIGEwW2ldID0gKGxvbmcpKChhMVtpXSAmIGIpPj4+VkFMVUUpOworICAgIH0KKyAgfQogCiAgIHN0YXRpYyB2b2lkIHRlc3Rfc3JhYyhsb25nW10gYTAsIGxvbmdbXSBhMSkgewogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYTAubGVuZ3RoOyBpKz0xKSB7CkBAIC05MDYsNiArMTA5OCwyNiBAQAogICAgICAgYTBbaV0gPSAobG9uZykoYTFbaV0+PmIpOwogICAgIH0KICAgfQorICBzdGF0aWMgdm9pZCB0ZXN0X3NyYWNfYWRkKGxvbmdbXSBhMCwgbG9uZ1tdIGExKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhMC5sZW5ndGg7IGkrPTEpIHsKKyAgICAgIGEwW2ldID0gKGxvbmcpKChhMVtpXSArIEFERF9JTklUKT4+VkFMVUUpOworICAgIH0KKyAgfQorICBzdGF0aWMgdm9pZCB0ZXN0X3NyYXZfYWRkKGxvbmdbXSBhMCwgbG9uZ1tdIGExLCBsb25nIGIpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGEwLmxlbmd0aDsgaSs9MSkgeworICAgICAgYTBbaV0gPSAobG9uZykoKGExW2ldICsgYik+PlZBTFVFKTsKKyAgICB9CisgIH0KKyAgc3RhdGljIHZvaWQgdGVzdF9zcmFjX2FuZChsb25nW10gYTAsIGxvbmdbXSBhMSkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYTAubGVuZ3RoOyBpKz0xKSB7CisgICAgICBhMFtpXSA9IChsb25nKSgoYTFbaV0gJiBCSVRfTUFTSyk+PlZBTFVFKTsKKyAgICB9CisgIH0KKyAgc3RhdGljIHZvaWQgdGVzdF9zcmF2X2FuZChsb25nW10gYTAsIGxvbmdbXSBhMSwgbG9uZyBiKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhMC5sZW5ndGg7IGkrPTEpIHsKKyAgICAgIGEwW2ldID0gKGxvbmcpKChhMVtpXSAmIGIpPj5WQUxVRSk7CisgICAgfQorICB9CiAKICAgc3RhdGljIGludCB2ZXJpZnkoU3RyaW5nIHRleHQsIGludCBpLCBsb25nIGVsZW0sIGxvbmcgdmFsKSB7CiAgICAgaWYgKGVsZW0gIT0gdmFsKSB7CmRpZmYgLS1naXQgYS9ob3RzcG90L3Rlc3QvY29tcGlsZXIvNjM0MDg2NC9UZXN0U2hvcnRWZWN0LmphdmEgYi9ob3RzcG90L3Rlc3QvY29tcGlsZXIvNjM0MDg2NC9UZXN0U2hvcnRWZWN0LmphdmEKaW5kZXggYTY4OGUwZC4uOWY1OWM4ZiAxMDA2NDQKLS0tIGEvaG90c3BvdC90ZXN0L2NvbXBpbGVyLzYzNDA4NjQvVGVzdFNob3J0VmVjdC5qYXZhCisrKyBiL2hvdHNwb3QvdGVzdC9jb21waWxlci82MzQwODY0L1Rlc3RTaG9ydFZlY3QuamF2YQpAQCAtNzUsNiArNzUsNyBAQAogICAgICAgdGVzdF9zdWJjKGEwLCBhMSk7CiAgICAgICB0ZXN0X3N1YnYoYTAsIGExLCAoc2hvcnQpVkFMVUUpOwogICAgICAgdGVzdF9zdWJhKGEwLCBhMSwgYTIpOworCiAgICAgICB0ZXN0X211bGMoYTAsIGExKTsKICAgICAgIHRlc3RfbXVsdihhMCwgYTEsIChzaG9ydClWQUxVRSk7CiAgICAgICB0ZXN0X211bGEoYTAsIGExLCBhMik7CkBAIC04Nyw2ICs4OCw3IEBACiAgICAgICB0ZXN0X2RpdmNfbihhMCwgYTEpOwogICAgICAgdGVzdF9kaXZ2KGEwLCBhMSwgKHNob3J0KS1WQUxVRSk7CiAgICAgICB0ZXN0X2RpdmEoYTAsIGExLCBhMyk7CisKICAgICAgIHRlc3RfYW5kYyhhMCwgYTEpOwogICAgICAgdGVzdF9hbmR2KGEwLCBhMSwgKHNob3J0KUJJVF9NQVNLKTsKICAgICAgIHRlc3RfYW5kYShhMCwgYTEsIGE0KTsKQEAgLTk2LDMwICs5OCw0OSBAQAogICAgICAgdGVzdF94b3JjKGEwLCBhMSk7CiAgICAgICB0ZXN0X3hvcnYoYTAsIGExLCAoc2hvcnQpQklUX01BU0spOwogICAgICAgdGVzdF94b3JhKGEwLCBhMSwgYTQpOworCiAgICAgICB0ZXN0X3NsbGMoYTAsIGExKTsKICAgICAgIHRlc3Rfc2xsdihhMCwgYTEsIFZBTFVFKTsKICAgICAgIHRlc3Rfc3JsYyhhMCwgYTEpOwogICAgICAgdGVzdF9zcmx2KGEwLCBhMSwgVkFMVUUpOwogICAgICAgdGVzdF9zcmFjKGEwLCBhMSk7CiAgICAgICB0ZXN0X3NyYXYoYTAsIGExLCBWQUxVRSk7CisKICAgICAgIHRlc3Rfc2xsY19uKGEwLCBhMSk7CiAgICAgICB0ZXN0X3NsbHYoYTAsIGExLCAtVkFMVUUpOwogICAgICAgdGVzdF9zcmxjX24oYTAsIGExKTsKICAgICAgIHRlc3Rfc3JsdihhMCwgYTEsIC1WQUxVRSk7CiAgICAgICB0ZXN0X3NyYWNfbihhMCwgYTEpOwogICAgICAgdGVzdF9zcmF2KGEwLCBhMSwgLVZBTFVFKTsKKwogICAgICAgdGVzdF9zbGxjX28oYTAsIGExKTsKICAgICAgIHRlc3Rfc2xsdihhMCwgYTEsIFNISUZUKTsKICAgICAgIHRlc3Rfc3JsY19vKGEwLCBhMSk7CiAgICAgICB0ZXN0X3NybHYoYTAsIGExLCBTSElGVCk7CiAgICAgICB0ZXN0X3NyYWNfbyhhMCwgYTEpOwogICAgICAgdGVzdF9zcmF2KGEwLCBhMSwgU0hJRlQpOworCiAgICAgICB0ZXN0X3NsbGNfb24oYTAsIGExKTsKICAgICAgIHRlc3Rfc2xsdihhMCwgYTEsIC1TSElGVCk7CiAgICAgICB0ZXN0X3NybGNfb24oYTAsIGExKTsKICAgICAgIHRlc3Rfc3JsdihhMCwgYTEsIC1TSElGVCk7CiAgICAgICB0ZXN0X3NyYWNfb24oYTAsIGExKTsKICAgICAgIHRlc3Rfc3JhdihhMCwgYTEsIC1TSElGVCk7CisKKyAgICAgIHRlc3Rfc2xsY19hZGQoYTAsIGExKTsKKyAgICAgIHRlc3Rfc2xsdl9hZGQoYTAsIGExLCBBRERfSU5JVCk7CisgICAgICB0ZXN0X3NybGNfYWRkKGEwLCBhMSk7CisgICAgICB0ZXN0X3NybHZfYWRkKGEwLCBhMSwgQUREX0lOSVQpOworICAgICAgdGVzdF9zcmFjX2FkZChhMCwgYTEpOworICAgICAgdGVzdF9zcmF2X2FkZChhMCwgYTEsIEFERF9JTklUKTsKKworICAgICAgdGVzdF9zbGxjX2FuZChhMCwgYTEpOworICAgICAgdGVzdF9zbGx2X2FuZChhMCwgYTEsIEJJVF9NQVNLKTsKKyAgICAgIHRlc3Rfc3JsY19hbmQoYTAsIGExKTsKKyAgICAgIHRlc3Rfc3Jsdl9hbmQoYTAsIGExLCBCSVRfTUFTSyk7CisgICAgICB0ZXN0X3NyYWNfYW5kKGEwLCBhMSk7CisgICAgICB0ZXN0X3NyYXZfYW5kKGEwLCBhMSwgQklUX01BU0spOworCiAgICAgICB0ZXN0X3BhY2syKHAyLCBhMSk7CiAgICAgICB0ZXN0X3VucGFjazIoYTAsIHAyKTsKICAgICAgIHRlc3RfcGFjazJfc3dhcChwMiwgYTEpOwpAQCAtMzY0LDYgKzM4NSw2MCBAQAogICAgICAgICBlcnJuICs9IHZlcmlmeSgidGVzdF9zcmF2X29uOiAiLCBpLCBhMFtpXSwgKHNob3J0KSgoc2hvcnQpKEFERF9JTklUK2kpPj4oLVNISUZUKSkpOwogICAgICAgfQogCisgICAgICB0ZXN0X3NsbGNfYWRkKGEwLCBhMSk7CisgICAgICBmb3IgKGludCBpPTA7IGk8QVJSTEVOOyBpKyspIHsKKyAgICAgICAgZXJybiArPSB2ZXJpZnkoInRlc3Rfc2xsY19hZGQ6ICIsIGksIGEwW2ldLCAoc2hvcnQpKCgoc2hvcnQpKEFERF9JTklUK2kpICsgQUREX0lOSVQpPDxWQUxVRSkpOworICAgICAgfQorICAgICAgdGVzdF9zbGx2X2FkZChhMCwgYTEsIEFERF9JTklUKTsKKyAgICAgIGZvciAoaW50IGk9MDsgaTxBUlJMRU47IGkrKykgeworICAgICAgICBlcnJuICs9IHZlcmlmeSgidGVzdF9zbGx2X2FkZDogIiwgaSwgYTBbaV0sIChzaG9ydCkoKChzaG9ydCkoQUREX0lOSVQraSkgKyBBRERfSU5JVCk8PFZBTFVFKSk7CisgICAgICB9CisKKyAgICAgIHRlc3Rfc3JsY19hZGQoYTAsIGExKTsKKyAgICAgIGZvciAoaW50IGk9MDsgaTxBUlJMRU47IGkrKykgeworICAgICAgICBlcnJuICs9IHZlcmlmeSgidGVzdF9zcmxjX2FkZDogIiwgaSwgYTBbaV0sIChzaG9ydCkoKChzaG9ydCkoQUREX0lOSVQraSkgKyBBRERfSU5JVCk+Pj5WQUxVRSkpOworICAgICAgfQorICAgICAgdGVzdF9zcmx2X2FkZChhMCwgYTEsIEFERF9JTklUKTsKKyAgICAgIGZvciAoaW50IGk9MDsgaTxBUlJMRU47IGkrKykgeworICAgICAgICBlcnJuICs9IHZlcmlmeSgidGVzdF9zcmx2X2FkZDogIiwgaSwgYTBbaV0sIChzaG9ydCkoKChzaG9ydCkoQUREX0lOSVQraSkgKyBBRERfSU5JVCk+Pj5WQUxVRSkpOworICAgICAgfQorCisgICAgICB0ZXN0X3NyYWNfYWRkKGEwLCBhMSk7CisgICAgICBmb3IgKGludCBpPTA7IGk8QVJSTEVOOyBpKyspIHsKKyAgICAgICAgZXJybiArPSB2ZXJpZnkoInRlc3Rfc3JhY19hZGQ6ICIsIGksIGEwW2ldLCAoc2hvcnQpKCgoc2hvcnQpKEFERF9JTklUK2kpICsgQUREX0lOSVQpPj5WQUxVRSkpOworICAgICAgfQorICAgICAgdGVzdF9zcmF2X2FkZChhMCwgYTEsIEFERF9JTklUKTsKKyAgICAgIGZvciAoaW50IGk9MDsgaTxBUlJMRU47IGkrKykgeworICAgICAgICBlcnJuICs9IHZlcmlmeSgidGVzdF9zcmF2X2FkZDogIiwgaSwgYTBbaV0sIChzaG9ydCkoKChzaG9ydCkoQUREX0lOSVQraSkgKyBBRERfSU5JVCk+PlZBTFVFKSk7CisgICAgICB9CisKKyAgICAgIHRlc3Rfc2xsY19hbmQoYTAsIGExKTsKKyAgICAgIGZvciAoaW50IGk9MDsgaTxBUlJMRU47IGkrKykgeworICAgICAgICBlcnJuICs9IHZlcmlmeSgidGVzdF9zbGxjX2FuZDogIiwgaSwgYTBbaV0sIChzaG9ydCkoKChzaG9ydCkoQUREX0lOSVQraSkgJiBCSVRfTUFTSyk8PFZBTFVFKSk7CisgICAgICB9CisgICAgICB0ZXN0X3NsbHZfYW5kKGEwLCBhMSwgQklUX01BU0spOworICAgICAgZm9yIChpbnQgaT0wOyBpPEFSUkxFTjsgaSsrKSB7CisgICAgICAgIGVycm4gKz0gdmVyaWZ5KCJ0ZXN0X3NsbHZfYW5kOiAiLCBpLCBhMFtpXSwgKHNob3J0KSgoKHNob3J0KShBRERfSU5JVCtpKSAmIEJJVF9NQVNLKTw8VkFMVUUpKTsKKyAgICAgIH0KKworICAgICAgdGVzdF9zcmxjX2FuZChhMCwgYTEpOworICAgICAgZm9yIChpbnQgaT0wOyBpPEFSUkxFTjsgaSsrKSB7CisgICAgICAgIGVycm4gKz0gdmVyaWZ5KCJ0ZXN0X3NybGNfYW5kOiAiLCBpLCBhMFtpXSwgKHNob3J0KSgoKHNob3J0KShBRERfSU5JVCtpKSAmIEJJVF9NQVNLKT4+PlZBTFVFKSk7CisgICAgICB9CisgICAgICB0ZXN0X3NybHZfYW5kKGEwLCBhMSwgQklUX01BU0spOworICAgICAgZm9yIChpbnQgaT0wOyBpPEFSUkxFTjsgaSsrKSB7CisgICAgICAgIGVycm4gKz0gdmVyaWZ5KCJ0ZXN0X3NybHZfYW5kOiAiLCBpLCBhMFtpXSwgKHNob3J0KSgoKHNob3J0KShBRERfSU5JVCtpKSAmIEJJVF9NQVNLKT4+PlZBTFVFKSk7CisgICAgICB9CisKKyAgICAgIHRlc3Rfc3JhY19hbmQoYTAsIGExKTsKKyAgICAgIGZvciAoaW50IGk9MDsgaTxBUlJMRU47IGkrKykgeworICAgICAgICBlcnJuICs9IHZlcmlmeSgidGVzdF9zcmFjX2FuZDogIiwgaSwgYTBbaV0sIChzaG9ydCkoKChzaG9ydCkoQUREX0lOSVQraSkgJiBCSVRfTUFTSyk+PlZBTFVFKSk7CisgICAgICB9CisgICAgICB0ZXN0X3NyYXZfYW5kKGEwLCBhMSwgQklUX01BU0spOworICAgICAgZm9yIChpbnQgaT0wOyBpPEFSUkxFTjsgaSsrKSB7CisgICAgICAgIGVycm4gKz0gdmVyaWZ5KCJ0ZXN0X3NyYXZfYW5kOiAiLCBpLCBhMFtpXSwgKHNob3J0KSgoKHNob3J0KShBRERfSU5JVCtpKSAmIEJJVF9NQVNLKT4+VkFMVUUpKTsKKyAgICAgIH0KKwogICAgICAgdGVzdF9wYWNrMihwMiwgYTEpOwogICAgICAgZm9yIChpbnQgaT0wOyBpPEFSUkxFTi8yOyBpKyspIHsKICAgICAgICAgZXJybiArPSB2ZXJpZnkoInRlc3RfcGFjazI6ICIsIGksIHAyW2ldLCAoKGludCkoQUREX0lOSVQrMippKSAmIDB4RkZGRikgfCAoKGludCkoQUREX0lOSVQrMippKzEpIDw8IDE2KSk7CkBAIC03NjIsNiArODM3LDg0IEBACiAKICAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogICAgIGZvciAoaW50IGk9MDsgaTxJVEVSUzsgaSsrKSB7CisgICAgICB0ZXN0X3NsbGNfYWRkKGEwLCBhMSk7CisgICAgfQorICAgIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGVzdF9zbGxjX2FkZDogIiArIChlbmQgLSBzdGFydCkpOworICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgZm9yIChpbnQgaT0wOyBpPElURVJTOyBpKyspIHsKKyAgICAgIHRlc3Rfc2xsdl9hZGQoYTAsIGExLCBBRERfSU5JVCk7CisgICAgfQorICAgIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGVzdF9zbGx2X2FkZDogIiArIChlbmQgLSBzdGFydCkpOworCisgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBmb3IgKGludCBpPTA7IGk8SVRFUlM7IGkrKykgeworICAgICAgdGVzdF9zcmxjX2FkZChhMCwgYTEpOworICAgIH0KKyAgICBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oInRlc3Rfc3JsY19hZGQ6ICIgKyAoZW5kIC0gc3RhcnQpKTsKKyAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIGZvciAoaW50IGk9MDsgaTxJVEVSUzsgaSsrKSB7CisgICAgICB0ZXN0X3NybHZfYWRkKGEwLCBhMSwgQUREX0lOSVQpOworICAgIH0KKyAgICBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oInRlc3Rfc3Jsdl9hZGQ6ICIgKyAoZW5kIC0gc3RhcnQpKTsKKworICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgZm9yIChpbnQgaT0wOyBpPElURVJTOyBpKyspIHsKKyAgICAgIHRlc3Rfc3JhY19hZGQoYTAsIGExKTsKKyAgICB9CisgICAgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0ZXN0X3NyYWNfYWRkOiAiICsgKGVuZCAtIHN0YXJ0KSk7CisgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBmb3IgKGludCBpPTA7IGk8SVRFUlM7IGkrKykgeworICAgICAgdGVzdF9zcmF2X2FkZChhMCwgYTEsIEFERF9JTklUKTsKKyAgICB9CisgICAgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0ZXN0X3NyYXZfYWRkOiAiICsgKGVuZCAtIHN0YXJ0KSk7CisKKyAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIGZvciAoaW50IGk9MDsgaTxJVEVSUzsgaSsrKSB7CisgICAgICB0ZXN0X3NsbGNfYW5kKGEwLCBhMSk7CisgICAgfQorICAgIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGVzdF9zbGxjX2FuZDogIiArIChlbmQgLSBzdGFydCkpOworICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgZm9yIChpbnQgaT0wOyBpPElURVJTOyBpKyspIHsKKyAgICAgIHRlc3Rfc2xsdl9hbmQoYTAsIGExLCBCSVRfTUFTSyk7CisgICAgfQorICAgIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGVzdF9zbGx2X2FuZDogIiArIChlbmQgLSBzdGFydCkpOworCisgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBmb3IgKGludCBpPTA7IGk8SVRFUlM7IGkrKykgeworICAgICAgdGVzdF9zcmxjX2FuZChhMCwgYTEpOworICAgIH0KKyAgICBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oInRlc3Rfc3JsY19hbmQ6ICIgKyAoZW5kIC0gc3RhcnQpKTsKKyAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIGZvciAoaW50IGk9MDsgaTxJVEVSUzsgaSsrKSB7CisgICAgICB0ZXN0X3NybHZfYW5kKGEwLCBhMSwgQklUX01BU0spOworICAgIH0KKyAgICBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oInRlc3Rfc3Jsdl9hbmQ6ICIgKyAoZW5kIC0gc3RhcnQpKTsKKworICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgZm9yIChpbnQgaT0wOyBpPElURVJTOyBpKyspIHsKKyAgICAgIHRlc3Rfc3JhY19hbmQoYTAsIGExKTsKKyAgICB9CisgICAgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0ZXN0X3NyYWNfYW5kOiAiICsgKGVuZCAtIHN0YXJ0KSk7CisgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBmb3IgKGludCBpPTA7IGk8SVRFUlM7IGkrKykgeworICAgICAgdGVzdF9zcmF2X2FuZChhMCwgYTEsIEJJVF9NQVNLKTsKKyAgICB9CisgICAgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0ZXN0X3NyYXZfYW5kOiAiICsgKGVuZCAtIHN0YXJ0KSk7CisKKyAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIGZvciAoaW50IGk9MDsgaTxJVEVSUzsgaSsrKSB7CiAgICAgICB0ZXN0X3BhY2syKHAyLCBhMSk7CiAgICAgfQogICAgIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwpAQCAtOTY4LDYgKzExMjEsMjYgQEAKICAgICAgIGEwW2ldID0gKHNob3J0KShhMVtpXTw8Yik7CiAgICAgfQogICB9CisgIHN0YXRpYyB2b2lkIHRlc3Rfc2xsY19hZGQoc2hvcnRbXSBhMCwgc2hvcnRbXSBhMSkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYTAubGVuZ3RoOyBpKz0xKSB7CisgICAgICBhMFtpXSA9IChzaG9ydCkoKGExW2ldICsgQUREX0lOSVQpPDxWQUxVRSk7CisgICAgfQorICB9CisgIHN0YXRpYyB2b2lkIHRlc3Rfc2xsdl9hZGQoc2hvcnRbXSBhMCwgc2hvcnRbXSBhMSwgaW50IGIpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGEwLmxlbmd0aDsgaSs9MSkgeworICAgICAgYTBbaV0gPSAoc2hvcnQpKChhMVtpXSArIGIpPDxWQUxVRSk7CisgICAgfQorICB9CisgIHN0YXRpYyB2b2lkIHRlc3Rfc2xsY19hbmQoc2hvcnRbXSBhMCwgc2hvcnRbXSBhMSkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYTAubGVuZ3RoOyBpKz0xKSB7CisgICAgICBhMFtpXSA9IChzaG9ydCkoKGExW2ldICYgQklUX01BU0spPDxWQUxVRSk7CisgICAgfQorICB9CisgIHN0YXRpYyB2b2lkIHRlc3Rfc2xsdl9hbmQoc2hvcnRbXSBhMCwgc2hvcnRbXSBhMSwgaW50IGIpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGEwLmxlbmd0aDsgaSs9MSkgeworICAgICAgYTBbaV0gPSAoc2hvcnQpKChhMVtpXSAmIGIpPDxWQUxVRSk7CisgICAgfQorICB9CiAKICAgc3RhdGljIHZvaWQgdGVzdF9zcmxjKHNob3J0W10gYTAsIHNob3J0W10gYTEpIHsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IGEwLmxlbmd0aDsgaSs9MSkgewpAQCAtOTk0LDYgKzExNjcsMjYgQEAKICAgICAgIGEwW2ldID0gKHNob3J0KShhMVtpXT4+PmIpOwogICAgIH0KICAgfQorICBzdGF0aWMgdm9pZCB0ZXN0X3NybGNfYWRkKHNob3J0W10gYTAsIHNob3J0W10gYTEpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGEwLmxlbmd0aDsgaSs9MSkgeworICAgICAgYTBbaV0gPSAoc2hvcnQpKChhMVtpXSArIEFERF9JTklUKT4+PlZBTFVFKTsKKyAgICB9CisgIH0KKyAgc3RhdGljIHZvaWQgdGVzdF9zcmx2X2FkZChzaG9ydFtdIGEwLCBzaG9ydFtdIGExLCBpbnQgYikgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYTAubGVuZ3RoOyBpKz0xKSB7CisgICAgICBhMFtpXSA9IChzaG9ydCkoKGExW2ldICsgYik+Pj5WQUxVRSk7CisgICAgfQorICB9CisgIHN0YXRpYyB2b2lkIHRlc3Rfc3JsY19hbmQoc2hvcnRbXSBhMCwgc2hvcnRbXSBhMSkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYTAubGVuZ3RoOyBpKz0xKSB7CisgICAgICBhMFtpXSA9IChzaG9ydCkoKGExW2ldICYgQklUX01BU0spPj4+VkFMVUUpOworICAgIH0KKyAgfQorICBzdGF0aWMgdm9pZCB0ZXN0X3NybHZfYW5kKHNob3J0W10gYTAsIHNob3J0W10gYTEsIGludCBiKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhMC5sZW5ndGg7IGkrPTEpIHsKKyAgICAgIGEwW2ldID0gKHNob3J0KSgoYTFbaV0gJiBiKT4+PlZBTFVFKTsKKyAgICB9CisgIH0KIAogICBzdGF0aWMgdm9pZCB0ZXN0X3NyYWMoc2hvcnRbXSBhMCwgc2hvcnRbXSBhMSkgewogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYTAubGVuZ3RoOyBpKz0xKSB7CkBAIC0xMDIwLDYgKzEyMTMsMjYgQEAKICAgICAgIGEwW2ldID0gKHNob3J0KShhMVtpXT4+Yik7CiAgICAgfQogICB9CisgIHN0YXRpYyB2b2lkIHRlc3Rfc3JhY19hZGQoc2hvcnRbXSBhMCwgc2hvcnRbXSBhMSkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYTAubGVuZ3RoOyBpKz0xKSB7CisgICAgICBhMFtpXSA9IChzaG9ydCkoKGExW2ldICsgQUREX0lOSVQpPj5WQUxVRSk7CisgICAgfQorICB9CisgIHN0YXRpYyB2b2lkIHRlc3Rfc3Jhdl9hZGQoc2hvcnRbXSBhMCwgc2hvcnRbXSBhMSwgaW50IGIpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGEwLmxlbmd0aDsgaSs9MSkgeworICAgICAgYTBbaV0gPSAoc2hvcnQpKChhMVtpXSArIGIpPj5WQUxVRSk7CisgICAgfQorICB9CisgIHN0YXRpYyB2b2lkIHRlc3Rfc3JhY19hbmQoc2hvcnRbXSBhMCwgc2hvcnRbXSBhMSkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYTAubGVuZ3RoOyBpKz0xKSB7CisgICAgICBhMFtpXSA9IChzaG9ydCkoKGExW2ldICYgQklUX01BU0spPj5WQUxVRSk7CisgICAgfQorICB9CisgIHN0YXRpYyB2b2lkIHRlc3Rfc3Jhdl9hbmQoc2hvcnRbXSBhMCwgc2hvcnRbXSBhMSwgaW50IGIpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGEwLmxlbmd0aDsgaSs9MSkgeworICAgICAgYTBbaV0gPSAoc2hvcnQpKChhMVtpXSAmIGIpPj5WQUxVRSk7CisgICAgfQorICB9CiAKICAgc3RhdGljIHZvaWQgdGVzdF9wYWNrMihpbnRbXSBwMiwgc2hvcnRbXSBhMSkgewogICAgIGlmIChwMi5sZW5ndGgqMiA+IGExLmxlbmd0aCkgcmV0dXJuOwpkaWZmIC0tZ2l0IGEvaG90c3BvdC90ZXN0L2NvbXBpbGVyLzcxODQzOTQvVGVzdEFFU0Jhc2UuamF2YSBiL2hvdHNwb3QvdGVzdC9jb21waWxlci83MTg0Mzk0L1Rlc3RBRVNCYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ2YzgzNQotLS0gL2Rldi9udWxsCisrKyBiL2hvdHNwb3QvdGVzdC9jb21waWxlci83MTg0Mzk0L1Rlc3RBRVNCYXNlLmphdmEKQEAgLTAsMCArMSwxNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKKyAqIHF1ZXN0aW9ucy4KKyAqCisgKi8KKworLyoqCisgKiBAYXV0aG9yIFRvbSBEZW5lYXUKKyAqLworCitpbXBvcnQgamF2YXguY3J5cHRvLkNpcGhlcjsKK2ltcG9ydCBqYXZheC5jcnlwdG8uS2V5R2VuZXJhdG9yOworaW1wb3J0IGphdmF4LmNyeXB0by5TZWNyZXRLZXk7CitpbXBvcnQgamF2YXguY3J5cHRvLnNwZWMuSXZQYXJhbWV0ZXJTcGVjOworaW1wb3J0IGphdmF4LmNyeXB0by5zcGVjLlNlY3JldEtleVNwZWM7CitpbXBvcnQgamF2YS5zZWN1cml0eS5BbGdvcml0aG1QYXJhbWV0ZXJzOworCitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCithYnN0cmFjdCBwdWJsaWMgY2xhc3MgVGVzdEFFU0Jhc2UgeworICBpbnQgbXNnU2l6ZSA9IEludGVnZXIuZ2V0SW50ZWdlcigibXNnU2l6ZSIsIDY0Nik7CisgIGJvb2xlYW4gY2hlY2tPdXRwdXQgPSBCb29sZWFuLmdldEJvb2xlYW4oImNoZWNrT3V0cHV0Iik7CisgIGJvb2xlYW4gbm9SZWluaXQgPSBCb29sZWFuLmdldEJvb2xlYW4oIm5vUmVpbml0Iik7CisgIGludCBrZXlTaXplID0gSW50ZWdlci5nZXRJbnRlZ2VyKCJrZXlTaXplIiwgMTI4KTsKKyAgU3RyaW5nIGFsZ29yaXRobSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiYWxnb3JpdGhtIiwgIkFFUyIpOworICBTdHJpbmcgbW9kZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibW9kZSIsICJDQkMiKTsKKyAgYnl0ZVtdIGlucHV0OworICBieXRlW10gZW5jb2RlOworICBieXRlW10gZXhwZWN0ZWRFbmNvZGU7CisgIGJ5dGVbXSBkZWNvZGU7CisgIGJ5dGVbXSBleHBlY3RlZERlY29kZTsKKyAgUmFuZG9tIHJhbmRvbSA9IG5ldyBSYW5kb20oMCk7CisgIENpcGhlciBjaXBoZXI7CisgIENpcGhlciBkQ2lwaGVyOworICBTdHJpbmcgcGFkZGluZ1N0ciA9ICJQS0NTNVBhZGRpbmciOworICBBbGdvcml0aG1QYXJhbWV0ZXJzIGFsZ1BhcmFtczsKKyAgU2VjcmV0S2V5IGtleTsKKyAgaW50IGl2TGVuOworCisgIHN0YXRpYyBpbnQgbnVtVGhyZWFkcyA9IDA7CisgIGludCAgdGhyZWFkSWQ7CisgIHN0YXRpYyBzeW5jaHJvbml6ZWQgaW50IGdldFRocmVhZElkKCkgeworICAgIGludCBpZCA9IG51bVRocmVhZHM7CisgICAgbnVtVGhyZWFkcysrOworICAgIHJldHVybiBpZDsKKyAgfQorCisgIGFic3RyYWN0IHB1YmxpYyB2b2lkIHJ1bigpOworCisgIHB1YmxpYyB2b2lkIHByZXBhcmUoKSB7CisgICAgdHJ5IHsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxubXNnU2l6ZT0iICsgbXNnU2l6ZSArICIsIGtleSBzaXplPSIgKyBrZXlTaXplICsgIiwgcmVJbml0PSIgKyAhbm9SZWluaXQgKyAiLCBjaGVja091dHB1dD0iICsgY2hlY2tPdXRwdXQpOworCisgICAgICBpbnQga2V5TGVuQnl0ZXMgPSAoa2V5U2l6ZSA9PSAwID8gMTYgOiBrZXlTaXplLzgpOworICAgICAgYnl0ZSBrZXlCeXRlc1tdID0gbmV3IGJ5dGVba2V5TGVuQnl0ZXNdOworICAgICAgaWYgKGtleVNpemUgPT0gMTI4KQorICAgICAgICBrZXlCeXRlcyA9IG5ldyBieXRlW10gey04LCAtNywgLTYsIC01LCAtNCwgLTMsIC0yLCAtMSwgMCwgMSwgMiwgMywgNCwgNSwgNiwgN307CisgICAgICBlbHNlCisgICAgICAgIHJhbmRvbS5uZXh0Qnl0ZXMoa2V5Qnl0ZXMpOworCisgICAgICBrZXkgPSBuZXcgU2VjcmV0S2V5U3BlYyhrZXlCeXRlcywgYWxnb3JpdGhtKTsKKyAgICAgIGlmICh0aHJlYWRJZCA9PSAwKSB7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQWxnb3JpdGhtOiAiICsga2V5LmdldEFsZ29yaXRobSgpICsgIigiCisgICAgICAgICAgICAgICAgICAgICAgICAgICArIGtleS5nZXRFbmNvZGVkKCkubGVuZ3RoICogOCArICJiaXQpIik7CisgICAgICB9CisgICAgICBpbnB1dCA9IG5ldyBieXRlW21zZ1NpemVdOworICAgICAgZm9yIChpbnQgaT0wOyBpPGlucHV0Lmxlbmd0aDsgaSsrKSB7CisgICAgICAgIGlucHV0W2ldID0gKGJ5dGUpIChpICYgMHhmZik7CisgICAgICB9CisKKyAgICAgIGNpcGhlciA9IENpcGhlci5nZXRJbnN0YW5jZShhbGdvcml0aG0gKyAiLyIgKyBtb2RlICsgIi8iICsgcGFkZGluZ1N0ciwgIlN1bkpDRSIpOworICAgICAgZENpcGhlciA9IENpcGhlci5nZXRJbnN0YW5jZShhbGdvcml0aG0gKyAiLyIgKyBtb2RlICsgIi8iICsgcGFkZGluZ1N0ciwgIlN1bkpDRSIpOworCisgICAgICBpdkxlbiA9IChhbGdvcml0aG0uZXF1YWxzKCJBRVMiKSA/IDE2IDogYWxnb3JpdGhtLmVxdWFscygiREVTIikgPyA4IDogMCk7CisgICAgICBJdlBhcmFtZXRlclNwZWMgaW5pdFZlY3RvciA9IG5ldyBJdlBhcmFtZXRlclNwZWMobmV3IGJ5dGVbaXZMZW5dKTsKKworICAgICAgY2lwaGVyLmluaXQoQ2lwaGVyLkVOQ1JZUFRfTU9ERSwga2V5LCBpbml0VmVjdG9yKTsKKyAgICAgIGFsZ1BhcmFtcyA9IGNpcGhlci5nZXRQYXJhbWV0ZXJzKCk7CisgICAgICBkQ2lwaGVyLmluaXQoQ2lwaGVyLkRFQ1JZUFRfTU9ERSwga2V5LCBhbGdQYXJhbXMpOworICAgICAgaWYgKHRocmVhZElkID09IDApIHsKKyAgICAgICAgY2hpbGRTaG93Q2lwaGVyKCk7CisgICAgICB9CisKKyAgICAgIC8vIGRvIG9uZSBlbmNvZGUgYW5kIGRlY29kZSBpbiBwcmVwYXJhdGlvbgorICAgICAgLy8gdGhpcyB3aWxsIGFsc28gY3JlYXRlIHRoZSBlbmNvZGUgYnVmZmVyIGFuZCBkZWNvZGUgYnVmZmVyCisgICAgICBlbmNvZGUgPSBjaXBoZXIuZG9GaW5hbChpbnB1dCk7CisgICAgICBkZWNvZGUgPSBkQ2lwaGVyLmRvRmluYWwoZW5jb2RlKTsKKyAgICAgIGlmIChjaGVja091dHB1dCkgeworICAgICAgICBleHBlY3RlZEVuY29kZSA9IChieXRlW10pIGVuY29kZS5jbG9uZSgpOworICAgICAgICBleHBlY3RlZERlY29kZSA9IChieXRlW10pIGRlY29kZS5jbG9uZSgpOworICAgICAgICBzaG93QXJyYXkoa2V5LmdldEVuY29kZWQoKSAgLCAgImtleTogICAgIik7CisgICAgICAgIHNob3dBcnJheShpbnB1dCwgICJpbnB1dDogICIpOworICAgICAgICBzaG93QXJyYXkoZW5jb2RlLCAiZW5jb2RlOiAiKTsKKyAgICAgICAgc2hvd0FycmF5KGRlY29kZSwgImRlY29kZTogIik7CisgICAgICB9CisgICAgfQorICAgIGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIFN5c3RlbS5leGl0KDEpOworICAgIH0KKyAgfQorCisgIHZvaWQgc2hvd0FycmF5KGJ5dGUgYltdLCBTdHJpbmcgbmFtZSkgeworICAgIFN5c3RlbS5vdXQuZm9ybWF0KCIlcyBbJWRdOiAiLCBuYW1lLCBiLmxlbmd0aCk7CisgICAgZm9yIChpbnQgaT0wOyBpPE1hdGgubWluKGIubGVuZ3RoLCAzMik7IGkrKykgeworICAgICAgU3lzdGVtLm91dC5mb3JtYXQoIiUwMnggIiwgYltpXSAmIDB4ZmYpOworICAgIH0KKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKKyAgfQorCisgIHZvaWQgY29tcGFyZUFycmF5cyhieXRlIGJbXSwgYnl0ZSBleHBbXSkgeworICAgIGlmIChiLmxlbmd0aCAhPSBleHAubGVuZ3RoKSB7CisgICAgICBTeXN0ZW0ub3V0LmZvcm1hdCgiZGlmZmVyZW50IGxlbmd0aHMgZm9yIGFjdHVhbCBhbmQgZXhwZWN0ZWQgb3V0cHV0IGFycmF5c1xuIik7CisgICAgICBzaG93QXJyYXkoYiwgInRlc3Q6ICIpOworICAgICAgc2hvd0FycmF5KGV4cCwgImV4cCA6ICIpOworICAgICAgU3lzdGVtLmV4aXQoMSk7CisgICAgfQorICAgIGZvciAoaW50IGk9MDsgaTwgZXhwLmxlbmd0aDsgaSsrKSB7CisgICAgICBpZiAoYltpXSAhPSBleHBbaV0pIHsKKyAgICAgICAgU3lzdGVtLm91dC5mb3JtYXQoIm91dHB1dCBlcnJvciBhdCBpbmRleCAlZDogZ290ICUwMngsIGV4cGVjdGVkICUwMnhcbiIsIGksIGJbaV0gJiAweGZmLCBleHBbaV0gJiAweGZmKTsKKyAgICAgICAgc2hvd0FycmF5KGIsICJ0ZXN0OiAiKTsKKyAgICAgICAgc2hvd0FycmF5KGV4cCwgImV4cCA6ICIpOworICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworCisgIHZvaWQgc2hvd0NpcGhlcihDaXBoZXIgYywgU3RyaW5nIGtpbmQpIHsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oa2luZCArICIgY2lwaGVyIHByb3ZpZGVyOiAiICsgY2lwaGVyLmdldFByb3ZpZGVyKCkpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbihraW5kICsgIiBjaXBoZXIgYWxnb3JpdGhtOiAiICsgY2lwaGVyLmdldEFsZ29yaXRobSgpKTsKKyAgfQorCisgIGFic3RyYWN0IHZvaWQgY2hpbGRTaG93Q2lwaGVyKCk7Cit9CmRpZmYgLS1naXQgYS9ob3RzcG90L3Rlc3QvY29tcGlsZXIvNzE4NDM5NC9UZXN0QUVTRGVjb2RlLmphdmEgYi9ob3RzcG90L3Rlc3QvY29tcGlsZXIvNzE4NDM5NC9UZXN0QUVTRGVjb2RlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjllYzAyZAotLS0gL2Rldi9udWxsCisrKyBiL2hvdHNwb3QvdGVzdC9jb21waWxlci83MTg0Mzk0L1Rlc3RBRVNEZWNvZGUuamF2YQpAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCisgKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CisgKiBxdWVzdGlvbnMuCisgKgorICovCisKKy8qKgorICogQGF1dGhvciBUb20gRGVuZWF1CisgKi8KKworaW1wb3J0IGphdmF4LmNyeXB0by5DaXBoZXI7CisKK3B1YmxpYyBjbGFzcyBUZXN0QUVTRGVjb2RlIGV4dGVuZHMgVGVzdEFFU0Jhc2UgeworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgcnVuKCkgeworICAgIHRyeSB7CisgICAgICBpZiAoIW5vUmVpbml0KSBkQ2lwaGVyLmluaXQoQ2lwaGVyLkRFQ1JZUFRfTU9ERSwga2V5LCBhbGdQYXJhbXMpOworICAgICAgaWYgKGNoZWNrT3V0cHV0KSB7CisgICAgICAgIC8vIGNoZWNrZWQgdmVyc2lvbiBjcmVhdGVzIG5ldyBvdXRwdXQgYnVmZmVyIGVhY2ggdGltZQorICAgICAgICBkZWNvZGUgPSBkQ2lwaGVyLmRvRmluYWwoZW5jb2RlLCAwLCBlbmNvZGUubGVuZ3RoKTsKKyAgICAgICAgY29tcGFyZUFycmF5cyhkZWNvZGUsIGV4cGVjdGVkRGVjb2RlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIG5vbi1jaGVja2VkIHZlcnNpb24gb3V0cHV0cyB0byBleGlzdGluZyBlbmNvZGUgYnVmZmVyIGZvciBtYXhpbXVtIHNwZWVkCisgICAgICAgIGRlY29kZSA9IG5ldyBieXRlW2RDaXBoZXIuZ2V0T3V0cHV0U2l6ZShlbmNvZGUubGVuZ3RoKV07CisgICAgICAgIGRDaXBoZXIuZG9GaW5hbChlbmNvZGUsIDAsIGVuY29kZS5sZW5ndGgsIGRlY29kZSk7CisgICAgICB9CisgICAgfQorICAgIGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgIFN5c3RlbS5leGl0KDEpOworICAgIH0KKyAgfQorCisgIEBPdmVycmlkZQorICB2b2lkIGNoaWxkU2hvd0NpcGhlcigpIHsKKyAgICBzaG93Q2lwaGVyKGRDaXBoZXIsICJEZWNyeXB0aW9uIik7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvaG90c3BvdC90ZXN0L2NvbXBpbGVyLzcxODQzOTQvVGVzdEFFU0VuY29kZS5qYXZhIGIvaG90c3BvdC90ZXN0L2NvbXBpbGVyLzcxODQzOTQvVGVzdEFFU0VuY29kZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkNmJmN2YKLS0tIC9kZXYvbnVsbAorKysgYi9ob3RzcG90L3Rlc3QvY29tcGlsZXIvNzE4NDM5NC9UZXN0QUVTRW5jb2RlLmphdmEKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQorICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQorICogcXVlc3Rpb25zLgorICoKKyAqLworCisvKioKKyAqIEBhdXRob3IgVG9tIERlbmVhdQorICovCisKK2ltcG9ydCBqYXZheC5jcnlwdG8uQ2lwaGVyOworCitwdWJsaWMgY2xhc3MgVGVzdEFFU0VuY29kZSBleHRlbmRzIFRlc3RBRVNCYXNlIHsKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICB0cnkgeworICAgICAgaWYgKCFub1JlaW5pdCkgY2lwaGVyLmluaXQoQ2lwaGVyLkVOQ1JZUFRfTU9ERSwga2V5LCBhbGdQYXJhbXMpOworICAgICAgaWYgKGNoZWNrT3V0cHV0KSB7CisgICAgICAgIC8vIGNoZWNrZWQgdmVyc2lvbiBjcmVhdGVzIG5ldyBvdXRwdXQgYnVmZmVyIGVhY2ggdGltZQorICAgICAgICBlbmNvZGUgPSBjaXBoZXIuZG9GaW5hbChpbnB1dCwgMCwgbXNnU2l6ZSk7CisgICAgICAgIGNvbXBhcmVBcnJheXMoZW5jb2RlLCBleHBlY3RlZEVuY29kZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBub24tY2hlY2tlZCB2ZXJzaW9uIG91dHB1dHMgdG8gZXhpc3RpbmcgZW5jb2RlIGJ1ZmZlciBmb3IgbWF4aW11bSBzcGVlZAorICAgICAgICBlbmNvZGUgPSBuZXcgYnl0ZVtjaXBoZXIuZ2V0T3V0cHV0U2l6ZShtc2dTaXplKV07CisgICAgICAgIGNpcGhlci5kb0ZpbmFsKGlucHV0LCAwLCBtc2dTaXplLCBlbmNvZGUpOworICAgICAgfQorICAgIH0KKyAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICBTeXN0ZW0uZXhpdCgxKTsKKyAgICB9CisgIH0KKworICBAT3ZlcnJpZGUKKyAgdm9pZCBjaGlsZFNob3dDaXBoZXIoKSB7CisgICAgc2hvd0NpcGhlcihjaXBoZXIsICJFbmNyeXB0aW9uIik7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvaG90c3BvdC90ZXN0L2NvbXBpbGVyLzcxODQzOTQvVGVzdEFFU01haW4uamF2YSBiL2hvdHNwb3QvdGVzdC9jb21waWxlci83MTg0Mzk0L1Rlc3RBRVNNYWluLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2EyY2I0MwotLS0gL2Rldi9udWxsCisrKyBiL2hvdHNwb3QvdGVzdC9jb21waWxlci83MTg0Mzk0L1Rlc3RBRVNNYWluLmphdmEKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQorICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQorICogcXVlc3Rpb25zLgorICoKKyAqLworCisvKioKKyAqIEB0ZXN0CisgKiBAYnVnIDcxODQzOTQKKyAqIEBzdW1tYXJ5IGFkZCBpbnRyaW5zaWNzIHRvIHVzZSBBRVMgaW5zdHJ1Y3Rpb25zCisgKgorICogQHJ1biBtYWluL290aGVydm0vdGltZW91dD02MDAgLVhiYXRjaCAtRGNoZWNrT3V0cHV0PXRydWUgVGVzdEFFU01haW4KKyAqCisgKiBAYXV0aG9yIFRvbSBEZW5lYXUKKyAqLworCitwdWJsaWMgY2xhc3MgVGVzdEFFU01haW4geworICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgaW50IGl0ZXJzID0gKGFyZ3MubGVuZ3RoID4gMCA/IEludGVnZXIudmFsdWVPZihhcmdzWzBdKSA6IDEwMDAwMDApOworICAgIFN5c3RlbS5vdXQucHJpbnRsbihpdGVycyArICIgaXRlcmF0aW9ucyIpOworICAgIFRlc3RBRVNFbmNvZGUgZXRlc3QgPSBuZXcgVGVzdEFFU0VuY29kZSgpOworICAgIGV0ZXN0LnByZXBhcmUoKTsKKyAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLm5hbm9UaW1lKCk7CisgICAgZm9yIChpbnQgaT0wOyBpPGl0ZXJzOyBpKyspIHsKKyAgICAgIGV0ZXN0LnJ1bigpOworICAgIH0KKyAgICBsb25nIGVuZCA9IFN5c3RlbS5uYW5vVGltZSgpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGVzdEFFU0VuY29kZSBydW50aW1lIHdhcyAiICsgKGRvdWJsZSkoKGVuZCAtIHN0YXJ0KS8xMDAwMDAwMDAwLjApICsgIiBtcyIpOworCisgICAgVGVzdEFFU0RlY29kZSBkdGVzdCA9IG5ldyBUZXN0QUVTRGVjb2RlKCk7CisgICAgZHRlc3QucHJlcGFyZSgpOworICAgIHN0YXJ0ID0gU3lzdGVtLm5hbm9UaW1lKCk7CisgICAgZm9yIChpbnQgaT0wOyBpPGl0ZXJzOyBpKyspIHsKKyAgICAgIGR0ZXN0LnJ1bigpOworICAgIH0KKyAgICBlbmQgPSBTeXN0ZW0ubmFub1RpbWUoKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRlc3RBRVNEZWNvZGUgcnVudGltZSB3YXMgIiArIChkb3VibGUpKChlbmQgLSBzdGFydCkvMTAwMDAwMDAwMC4wKSArICIgbXMiKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvaG90c3BvdC90ZXN0L2NvbXBpbGVyLzgwMDA4MDUvVGVzdDgwMDA4MDUuamF2YSBiL2hvdHNwb3QvdGVzdC9jb21waWxlci84MDAwODA1L1Rlc3Q4MDAwODA1LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQwYjdiNAotLS0gL2Rldi9udWxsCisrKyBiL2hvdHNwb3QvdGVzdC9jb21waWxlci84MDAwODA1L1Rlc3Q4MDAwODA1LmphdmEKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQorICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQorICogcXVlc3Rpb25zLgorICovCisKKy8qKgorICogQHRlc3QKKyAqIEBidWcgODAwMDgwNQorICogQHN1bW1hcnkgSk1NIGlzc3VlOiBzaG9ydCBsb2FkcyBhcmUgbm9uLWF0b21pYworICoKKyAqIEBydW4gbWFpbi9vdGhlcnZtIC1zZXJ2ZXIgLVhYOi1UaWVyZWRDb21waWxhdGlvbiAtWGNvbXAgLVhYOitQcmludENvbXBpbGF0aW9uIC1YWDpDb21waWxlT25seT1UZXN0ODAwMDgwNS5sb2FkUzJMbWFza0ZGLFRlc3Q4MDAwODA1LmxvYWRTMkxtYXNrMTYsVGVzdDgwMDA4MDUubG9hZFMyTG1hc2sxMyxUZXN0ODAwMDgwNS5sb2FkVVNfc2lnbkV4dCxUZXN0ODAwMDgwNS5sb2FkQjJMX21hc2s4IFRlc3Q4MDAwODA1CisgKi8KKworcHVibGljIGNsYXNzIFRlc3Q4MDAwODA1IHsKKyAgICBzdGF0aWMgbG9uZyBsb2FkUzJMbWFza0ZGICAgKHNob3J0W10gc2EpIHsgcmV0dXJuIHNhWzBdICYgMHhGRjsgfQorICAgIHN0YXRpYyBsb25nIGxvYWRTMkxtYXNrRkZfMSAoc2hvcnRbXSBzYSkgeyByZXR1cm4gc2FbMF0gJiAweEZGOyB9CisKKyAgICBzdGF0aWMgbG9uZyBsb2FkUzJMbWFzazE2ICAgKHNob3J0W10gc2EpIHsgcmV0dXJuIHNhWzBdICYgMHhGRkZFOyB9CisgICAgc3RhdGljIGxvbmcgbG9hZFMyTG1hc2sxNl8xIChzaG9ydFtdIHNhKSB7IHJldHVybiBzYVswXSAmIDB4RkZGRTsgfQorCisgICAgc3RhdGljIGxvbmcgbG9hZFMyTG1hc2sxMyAgIChzaG9ydFtdIHNhKSB7IHJldHVybiBzYVswXSAmIDB4MEZGRjsgfQorICAgIHN0YXRpYyBsb25nIGxvYWRTMkxtYXNrMTNfMSAoc2hvcnRbXSBzYSkgeyByZXR1cm4gc2FbMF0gJiAweDBGRkY7IH0KKworICAgIHN0YXRpYyBpbnQgbG9hZFVTX3NpZ25FeHQgICAoY2hhcltdIGNhKSB7IHJldHVybiAoY2FbMF0gPDwgMTYpID4+IDE2OyB9CisgICAgc3RhdGljIGludCBsb2FkVVNfc2lnbkV4dF8xIChjaGFyW10gY2EpIHsgcmV0dXJuIChjYVswXSA8PCAxNikgPj4gMTY7IH0KKworICAgIHN0YXRpYyBsb25nIGxvYWRCMkxfbWFzazggICAoYnl0ZVtdIGJhKSB7IHJldHVybiBiYVswXSAmIDB4NTU7IH0KKyAgICBzdGF0aWMgbG9uZyBsb2FkQjJMX21hc2s4XzEgKGJ5dGVbXSBiYSkgeyByZXR1cm4gYmFbMF0gJiAweDU1OyB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIGZvciAoaW50IGkgPSBCeXRlLk1JTl9WQUxVRTsgaSA8IEJ5dGUuTUFYX1ZBTFVFOyBpKyspIHsKKyAgICAgICAgICAgIGJ5dGVbXSBiYSA9IG5ldyBieXRlW10gIHsgKGJ5dGUpIGl9OworCisgICAgICAgICAgICB7IGxvbmcgdjEgPSBsb2FkQjJMX21hc2s4KGJhKTsKKyAgICAgICAgICAgICAgbG9uZyB2MiA9IGxvYWRCMkxfbWFzazhfMShiYSk7CisgICAgICAgICAgICAgIGlmICh2MSAhPSB2MikKKyAgICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoU3RyaW5nLmZvcm1hdCgibG9hZEIyTF9tYXNrOCBmYWlsZWQ6ICV4ICE9ICV4IiwgdjEsIHYyKSk7IH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaW50IGkgPSBTaG9ydC5NSU5fVkFMVUU7IGkgPCBTaG9ydC5NQVhfVkFMVUU7IGkrKykgeworICAgICAgICAgICAgc2hvcnRbXSBzYSA9IG5ldyBzaG9ydFtdIHsgKHNob3J0KWkgfTsKKyAgICAgICAgICAgIGNoYXJbXSBjYSA9IG5ldyBjaGFyW10geyAoY2hhcilpIH07CisKKyAgICAgICAgICAgIHsgbG9uZyB2MSA9IGxvYWRTMkxtYXNrRkYoc2EpOworICAgICAgICAgICAgICBsb25nIHYyID0gbG9hZFMyTG1hc2tGRl8xKHNhKTsKKyAgICAgICAgICAgICAgaWYgKHYxICE9IHYyKQorICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihTdHJpbmcuZm9ybWF0KCJsb2FkUzJMbWFza0ZGIGZhaWxlZDogJXggIT0gJXgiLCB2MSwgdjIpKTsgfQorCisgICAgICAgICAgICB7IGxvbmcgdjEgPSBsb2FkUzJMbWFzazE2KHNhKTsKKyAgICAgICAgICAgICAgbG9uZyB2MiA9IGxvYWRTMkxtYXNrMTZfMShzYSk7CisgICAgICAgICAgICAgIGlmICh2MSAhPSB2MikKKyAgICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoU3RyaW5nLmZvcm1hdCgibG9hZFMyTG1hc2sxNiBmYWlsZWQ6ICV4ICE9ICV4IiwgdjEsIHYyKSk7IH0KKworICAgICAgICAgICAgeyBsb25nIHYxID0gbG9hZFMyTG1hc2sxMyhzYSk7CisgICAgICAgICAgICAgIGxvbmcgdjIgPSBsb2FkUzJMbWFzazEzXzEoc2EpOworICAgICAgICAgICAgICBpZiAodjEgIT0gdjIpCisgICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFN0cmluZy5mb3JtYXQoImxvYWRTMkxtYXNrMTMgZmFpbGVkOiAleCAhPSAleCIsIHYxLCB2MikpOyB9CisKKyAgICAgICAgICAgIHsgaW50IHYxID0gbG9hZFVTX3NpZ25FeHQoY2EpOworICAgICAgICAgICAgICBpbnQgdjIgPSBsb2FkVVNfc2lnbkV4dF8xKGNhKTsKKyAgICAgICAgICAgICAgaWYgKHYxICE9IHYyKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFN0cmluZy5mb3JtYXQoImxvYWRVU19zaWduRXh0IGZhaWxlZDogJXggIT0gJXgiLCB2MSwgdjIpKTsgfQorICAgICAgICB9CisKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJURVNUIFBBU1NFRC4iKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9ob3RzcG90L3Rlc3QvY29tcGlsZXIvODAwMTE4My9UZXN0Q2hhclZlY3QuamF2YSBiL2hvdHNwb3QvdGVzdC9jb21waWxlci84MDAxMTgzL1Rlc3RDaGFyVmVjdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2ZmYxZTIKLS0tIC9kZXYvbnVsbAorKysgYi9ob3RzcG90L3Rlc3QvY29tcGlsZXIvODAwMTE4My9UZXN0Q2hhclZlY3QuamF2YQpAQCAtMCwwICsxLDEzMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKKyAqIHF1ZXN0aW9ucy4KKyAqCisgKi8KKworLyoqCisgKiBAdGVzdAorICogQGJ1ZyA4MDAxMTgzCisgKiBAc3VtbWFyeSBpbmNvcnJlY3QgcmVzdWx0cyBvZiBjaGFyIHZlY3RvcnMgcmlnaHQgc2hpZnQgb3BlcmFpdG9uCisgKgorICogQHJ1biBtYWluL290aGVydm0vdGltZW91dD00MDAgLVhiYXRjaCAtWG14NjRtIFRlc3RDaGFyVmVjdAorICovCisKK3B1YmxpYyBjbGFzcyBUZXN0Q2hhclZlY3QgeworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQVJSTEVOID0gOTk3OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSVRFUlMgID0gMTEwMDA7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBRERfSU5JVCA9IENoYXJhY3Rlci5NQVhfVkFMVUUtNTAwOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQklUX01BU0sgPSAweEI3MzE7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBWQUxVRSA9IDc7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSElGVCA9IDE2OworCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRlc3RpbmcgQ2hhciB2ZWN0b3JzIik7CisgICAgaW50IGVycm4gPSB0ZXN0KCk7CisgICAgaWYgKGVycm4gPiAwKSB7CisgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkZBSUxFRDogIiArIGVycm4gKyAiIGVycm9ycyIpOworICAgICAgU3lzdGVtLmV4aXQoOTcpOworICAgIH0KKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlBBU1NFRCIpOworICB9CisKKyAgc3RhdGljIGludCB0ZXN0KCkgeworICAgIGNoYXJbXSBhMCA9IG5ldyBjaGFyW0FSUkxFTl07CisgICAgY2hhcltdIGExID0gbmV3IGNoYXJbQVJSTEVOXTsKKyAgICBzaG9ydFtdIGEyID0gbmV3IHNob3J0W0FSUkxFTl07CisgICAgc2hvcnRbXSBhMyA9IG5ldyBzaG9ydFtBUlJMRU5dOworICAgIHNob3J0W10gYTQgPSBuZXcgc2hvcnRbQVJSTEVOXTsKKyAgICAgaW50W10gcDIgPSBuZXcgIGludFtBUlJMRU4vMl07CisgICAgbG9uZ1tdIHA0ID0gbmV3IGxvbmdbQVJSTEVOLzRdOworICAgIC8vIEluaXRpYWxpemUKKyAgICBpbnQgZ29sZF9zdW0gPSAwOworICAgIGZvciAoaW50IGk9MDsgaTxBUlJMRU47IGkrKykgeworICAgICAgY2hhciB2YWwgPSAoY2hhcikoQUREX0lOSVQraSk7CisgICAgICBnb2xkX3N1bSArPSB2YWw7CisgICAgICBhMVtpXSA9IHZhbDsKKyAgICAgIGEyW2ldID0gVkFMVUU7CisgICAgICBhM1tpXSA9IC1WQUxVRTsKKyAgICAgIGE0W2ldID0gKHNob3J0KUJJVF9NQVNLOworICAgIH0KKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIldhcm11cCIpOworICAgIGZvciAoaW50IGk9MDsgaTxJVEVSUzsgaSsrKSB7CisgICAgICB0ZXN0X3N1bShhMSk7CisgICAgICB0ZXN0X2FkZGMoYTAsIGExKTsKKyAgICAgIHRlc3RfYWRkdihhMCwgYTEsIChjaGFyKVZBTFVFKTsKKyAgICAgIHRlc3RfYWRkYShhMCwgYTEsIGEyKTsKKyAgICAgIHRlc3Rfc3ViYyhhMCwgYTEpOworICAgICAgdGVzdF9zdWJ2KGEwLCBhMSwgKGNoYXIpVkFMVUUpOworICAgICAgdGVzdF9zdWJhKGEwLCBhMSwgYTIpOworCisgICAgICB0ZXN0X211bGMoYTAsIGExKTsKKyAgICAgIHRlc3RfbXVsdihhMCwgYTEsIChjaGFyKVZBTFVFKTsKKyAgICAgIHRlc3RfbXVsYShhMCwgYTEsIGEyKTsKKyAgICAgIHRlc3RfZGl2YyhhMCwgYTEpOworICAgICAgdGVzdF9kaXZ2KGEwLCBhMSwgVkFMVUUpOworICAgICAgdGVzdF9kaXZhKGEwLCBhMSwgYTIpOworICAgICAgdGVzdF9tdWxjX24oYTAsIGExKTsKKyAgICAgIHRlc3RfbXVsdihhMCwgYTEsIChjaGFyKS1WQUxVRSk7CisgICAgICB0ZXN0X211bGEoYTAsIGExLCBhMyk7CisgICAgICB0ZXN0X2RpdmNfbihhMCwgYTEpOworICAgICAgdGVzdF9kaXZ2KGEwLCBhMSwgLVZBTFVFKTsKKyAgICAgIHRlc3RfZGl2YShhMCwgYTEsIGEzKTsKKworICAgICAgdGVzdF9hbmRjKGEwLCBhMSk7CisgICAgICB0ZXN0X2FuZHYoYTAsIGExLCAoc2hvcnQpQklUX01BU0spOworICAgICAgdGVzdF9hbmRhKGEwLCBhMSwgYTQpOworICAgICAgdGVzdF9vcmMoYTAsIGExKTsKKyAgICAgIHRlc3Rfb3J2KGEwLCBhMSwgKHNob3J0KUJJVF9NQVNLKTsKKyAgICAgIHRlc3Rfb3JhKGEwLCBhMSwgYTQpOworICAgICAgdGVzdF94b3JjKGEwLCBhMSk7CisgICAgICB0ZXN0X3hvcnYoYTAsIGExLCAoc2hvcnQpQklUX01BU0spOworICAgICAgdGVzdF94b3JhKGEwLCBhMSwgYTQpOworCisgICAgICB0ZXN0X3NsbGMoYTAsIGExKTsKKyAgICAgIHRlc3Rfc2xsdihhMCwgYTEsIFZBTFVFKTsKKyAgICAgIHRlc3Rfc3JsYyhhMCwgYTEpOworICAgICAgdGVzdF9zcmx2KGEwLCBhMSwgVkFMVUUpOworICAgICAgdGVzdF9zcmFjKGEwLCBhMSk7CisgICAgICB0ZXN0X3NyYXYoYTAsIGExLCBWQUxVRSk7CisKKyAgICAgIHRlc3Rfc2xsY19uKGEwLCBhMSk7CisgICAgICB0ZXN0X3NsbHYoYTAsIGExLCAtVkFMVUUpOworICAgICAgdGVzdF9zcmxjX24oYTAsIGExKTsKKyAgICAgIHRlc3Rfc3JsdihhMCwgYTEsIC1WQUxVRSk7CisgICAgICB0ZXN0X3NyYWNfbihhMCwgYTEpOworICAgICAgdGVzdF9zcmF2KGEwLCBhMSwgLVZBTFVFKTsKKworICAgICAgdGVzdF9zbGxjX28oYTAsIGExKTsKKyAgICAgIHRlc3Rfc2xsdihhMCwgYTEsIFNISUZUKTsKKyAgICAgIHRlc3Rfc3JsY19vKGEwLCBhMSk7CisgICAgICB0ZXN0X3NybHYoYTAsIGExLCBTSElGVCk7CisgICAgICB0ZXN0X3NyYWNfbyhhMCwgYTEpOworICAgICAgdGVzdF9zcmF2KGEwLCBhMSwgU0hJRlQpOworCisgICAgICB0ZXN0X3NsbGNfb24oYTAsIGExKTsKKyAgICAgIHRlc3Rfc2xsdihhMCwgYTEsIC1TSElGVCk7CisgICAgICB0ZXN0X3NybGNfb24oYTAsIGExKTsKKyAgICAgIHRlc3Rfc3JsdihhMCwgYTEsIC1TSElGVCk7CisgICAgICB0ZXN0X3NyYWNfb24oYTAsIGExKTsKKyAgICAgIHRlc3Rfc3JhdihhMCwgYTEsIC1TSElGVCk7CisKKyAgICAgIHRlc3Rfc2xsY19hZGQoYTAsIGExKTsKKyAgICAgIHRlc3Rfc2xsdl9hZGQoYTAsIGExLCBBRERfSU5JVCk7CisgICAgICB0ZXN0X3NybGNfYWRkKGEwLCBhMSk7CisgICAgICB0ZXN0X3NybHZfYWRkKGEwLCBhMSwgQUREX0lOSVQpOworICAgICAgdGVzdF9zcmFjX2FkZChhMCwgYTEpOworICAgICAgdGVzdF9zcmF2X2FkZChhMCwgYTEsIEFERF9JTklUKTsKKworICAgICAgdGVzdF9zbGxjX2FuZChhMCwgYTEpOworICAgICAgdGVzdF9zbGx2X2FuZChhMCwgYTEsIEJJVF9NQVNLKTsKKyAgICAgIHRlc3Rfc3JsY19hbmQoYTAsIGExKTsKKyAgICAgIHRlc3Rfc3Jsdl9hbmQoYTAsIGExLCBCSVRfTUFTSyk7CisgICAgICB0ZXN0X3NyYWNfYW5kKGEwLCBhMSk7CisgICAgICB0ZXN0X3NyYXZfYW5kKGEwLCBhMSwgQklUX01BU0spOworCisgICAgICB0ZXN0X3BhY2syKHAyLCBhMSk7CisgICAgICB0ZXN0X3VucGFjazIoYTAsIHAyKTsKKyAgICAgIHRlc3RfcGFjazJfc3dhcChwMiwgYTEpOworICAgICAgdGVzdF91bnBhY2syX3N3YXAoYTAsIHAyKTsKKyAgICAgIHRlc3RfcGFjazQocDQsIGExKTsKKyAgICAgIHRlc3RfdW5wYWNrNChhMCwgcDQpOworICAgICAgdGVzdF9wYWNrNF9zd2FwKHA0LCBhMSk7CisgICAgICB0ZXN0X3VucGFjazRfc3dhcChhMCwgcDQpOworICAgIH0KKyAgICAvLyBUZXN0IGFuZCB2ZXJpZnkgcmVzdWx0cworICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVmVyaWZpY2F0aW9uIik7CisgICAgaW50IGVycm4gPSAwOworICAgIHsKKyAgICAgIGludCBzdW0gPSB0ZXN0X3N1bShhMSk7CisgICAgICBpZiAoc3VtICE9IGdvbGRfc3VtKSB7CisgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigidGVzdF9zdW06ICAiICsgc3VtICsgIiAhPSAiICsgZ29sZF9zdW0pOworICAgICAgICBlcnJuKys7CisgICAgICB9CisKKyAgICAgIHRlc3RfYWRkYyhhMCwgYTEpOworICAgICAgZm9yIChpbnQgaT0wOyBpPEFSUkxFTjsgaSsrKSB7CisgICAgICAgIGVycm4gKz0gdmVyaWZ5KCJ0ZXN0X2FkZGM6ICIsIGksIGEwW2ldLCAoY2hhcikoKGNoYXIpKEFERF9JTklUK2kpK1ZBTFVFKSk7CisgICAgICB9CisgICAgICB0ZXN0X2FkZHYoYTAsIGExLCAoY2hhcilWQUxVRSk7CisgICAgICBmb3IgKGludCBpPTA7IGk8QVJSTEVOOyBpKyspIHsKKyAgICAgICAgZXJybiArPSB2ZXJpZnkoInRlc3RfYWRkdjogIiwgaSwgYTBbaV0sIChjaGFyKSgoY2hhcikoQUREX0lOSVQraSkrVkFMVUUpKTsKKyAgICAgIH0KKyAgICAgIHRlc3RfYWRkYShhMCwgYTEsIGEyKTsKKyAgICAgIGZvciAoaW50IGk9MDsgaTxBUlJMRU47IGkrKykgeworICAgICAgICBlcnJuICs9IHZlcmlmeSgidGVzdF9hZGRhOiAiLCBpLCBhMFtpXSwgKGNoYXIpKChjaGFyKShBRERfSU5JVCtpKStWQUxVRSkpOworICAgICAgfQorCisgICAgICB0ZXN0X3N1YmMoYTAsIGExKTsKKyAgICAgIGZvciAoaW50IGk9MDsgaTxBUlJMRU47IGkrKykgeworICAgICAgICBlcnJuICs9IHZlcmlmeSgidGVzdF9zdWJjOiAiLCBpLCBhMFtpXSwgKGNoYXIpKChjaGFyKShBRERfSU5JVCtpKS1WQUxVRSkpOworICAgICAgfQorICAgICAgdGVzdF9zdWJ2KGEwLCBhMSwgKGNoYXIpVkFMVUUpOworICAgICAgZm9yIChpbnQgaT0wOyBpPEFSUkxFTjsgaSsrKSB7CisgICAgICAgIGVycm4gKz0gdmVyaWZ5KCJ0ZXN0X3N1YnY6ICIsIGksIGEwW2ldLCAoY2hhcikoKGNoYXIpKEFERF9JTklUK2kpLVZBTFVFKSk7CisgICAgICB9CisgICAgICB0ZXN0X3N1YmEoYTAsIGExLCBhMik7CisgICAgICBmb3IgKGludCBpPTA7IGk8QVJSTEVOOyBpKyspIHsKKyAgICAgICAgZXJybiArPSB2ZXJpZnkoInRlc3Rfc3ViYTogIiwgaSwgYTBbaV0sIChjaGFyKSgoY2hhcikoQUREX0lOSVQraSktVkFMVUUpKTsKKyAgICAgIH0KKworICAgICAgdGVzdF9tdWxjKGEwLCBhMSk7CisgICAgICBmb3IgKGludCBpPTA7IGk8QVJSTEVOOyBpKyspIHsKKyAgICAgICAgZXJybiArPSB2ZXJpZnkoInRlc3RfbXVsYzogIiwgaSwgYTBbaV0sIChjaGFyKSgoY2hhcikoQUREX0lOSVQraSkqVkFMVUUpKTsKKyAgICAgIH0KKyAgICAgIHRlc3RfbXVsdihhMCwgYTEsIChjaGFyKVZBTFVFKTsKKyAgICAgIGZvciAoaW50IGk9MDsgaTxBUlJMRU47IGkrKykgeworICAgICAgICBlcnJuICs9IHZlcmlmeSgidGVzdF9tdWx2OiAiLCBpLCBhMFtpXSwgKGNoYXIpKChjaGFyKShBRERfSU5JVCtpKSpWQUxVRSkpOworICAgICAgfQorICAgICAgdGVzdF9tdWxhKGEwLCBhMSwgYTIpOworICAgICAgZm9yIChpbnQgaT0wOyBpPEFSUkxFTjsgaSsrKSB7CisgICAgICAgIGVycm4gKz0gdmVyaWZ5KCJ0ZXN0X211bGE6ICIsIGksIGEwW2ldLCAoY2hhcikoKGNoYXIpKEFERF9JTklUK2kpKlZBTFVFKSk7CisgICAgICB9CisKKyAgICAgIHRlc3RfZGl2YyhhMCwgYTEpOworICAgICAgZm9yIChpbnQgaT0wOyBpPEFSUkxFTjsgaSsrKSB7CisgICAgICAgIGVycm4gKz0gdmVyaWZ5KCJ0ZXN0X2RpdmM6ICIsIGksIGEwW2ldLCAoY2hhcikoKGNoYXIpKEFERF9JTklUK2kpL1ZBTFVFKSk7CisgICAgICB9CisgICAgICB0ZXN0X2RpdnYoYTAsIGExLCBWQUxVRSk7CisgICAgICBmb3IgKGludCBpPTA7IGk8QVJSTEVOOyBpKyspIHsKKyAgICAgICAgZXJybiArPSB2ZXJpZnkoInRlc3RfZGl2djogIiwgaSwgYTBbaV0sIChjaGFyKSgoY2hhcikoQUREX0lOSVQraSkvVkFMVUUpKTsKKyAgICAgIH0KKyAgICAgIHRlc3RfZGl2YShhMCwgYTEsIGEyKTsKKyAgICAgIGZvciAoaW50IGk9MDsgaTxBUlJMRU47IGkrKykgeworICAgICAgICBlcnJuICs9IHZlcmlmeSgidGVzdF9kaXZhOiAiLCBpLCBhMFtpXSwgKGNoYXIpKChjaGFyKShBRERfSU5JVCtpKS9WQUxVRSkpOworICAgICAgfQorCisgICAgICB0ZXN0X211bGNfbihhMCwgYTEpOworICAgICAgZm9yIChpbnQgaT0wOyBpPEFSUkxFTjsgaSsrKSB7CisgICAgICAgIGVycm4gKz0gdmVyaWZ5KCJ0ZXN0X211bGNfbjogIiwgaSwgYTBbaV0sIChjaGFyKSgoY2hhcikoQUREX0lOSVQraSkqKC1WQUxVRSkpKTsKKyAgICAgIH0KKyAgICAgIHRlc3RfbXVsdihhMCwgYTEsIChjaGFyKS1WQUxVRSk7CisgICAgICBmb3IgKGludCBpPTA7IGk8QVJSTEVOOyBpKyspIHsKKyAgICAgICAgZXJybiArPSB2ZXJpZnkoInRlc3RfbXVsdl9uOiAiLCBpLCBhMFtpXSwgKGNoYXIpKChjaGFyKShBRERfSU5JVCtpKSooLVZBTFVFKSkpOworICAgICAgfQorICAgICAgdGVzdF9tdWxhKGEwLCBhMSwgYTMpOworICAgICAgZm9yIChpbnQgaT0wOyBpPEFSUkxFTjsgaSsrKSB7CisgICAgICAgIGVycm4gKz0gdmVyaWZ5KCJ0ZXN0X211bGFfbjogIiwgaSwgYTBbaV0sIChjaGFyKSgoY2hhcikoQUREX0lOSVQraSkqKC1WQUxVRSkpKTsKKyAgICAgIH0KKworICAgICAgdGVzdF9kaXZjX24oYTAsIGExKTsKKyAgICAgIGZvciAoaW50IGk9MDsgaTxBUlJMRU47IGkrKykgeworICAgICAgICBlcnJuICs9IHZlcmlmeSgidGVzdF9kaXZjX246ICIsIGksIGEwW2ldLCAoY2hhcikoKGNoYXIpKEFERF9JTklUK2kpLygtVkFMVUUpKSk7CisgICAgICB9CisgICAgICB0ZXN0X2RpdnYoYTAsIGExLCAtVkFMVUUpOworICAgICAgZm9yIChpbnQgaT0wOyBpPEFSUkxFTjsgaSsrKSB7CisgICAgICAgIGVycm4gKz0gdmVyaWZ5KCJ0ZXN0X2RpdnZfbjogIiwgaSwgYTBbaV0sIChjaGFyKSgoY2hhcikoQUREX0lOSVQraSkvKC1WQUxVRSkpKTsKKyAgICAgIH0KKyAgICAgIHRlc3RfZGl2YShhMCwgYTEsIGEzKTsKKyAgICAgIGZvciAoaW50IGk9MDsgaTxBUlJMRU47IGkrKykgeworICAgICAgICBlcnJuICs9IHZlcmlmeSgidGVzdF9kaXZhX246ICIsIGksIGEwW2ldLCAoY2hhcikoKGNoYXIpKEFERF9JTklUK2kpLygtVkFMVUUpKSk7CisgICAgICB9CisKKyAgICAgIHRlc3RfYW5kYyhhMCwgYTEpOworICAgICAgZm9yIChpbnQgaT0wOyBpPEFSUkxFTjsgaSsrKSB7CisgICAgICAgIGVycm4gKz0gdmVyaWZ5KCJ0ZXN0X2FuZGM6ICIsIGksIGEwW2ldLCAoY2hhcikoKGNoYXIpKEFERF9JTklUK2kpJkJJVF9NQVNLKSk7CisgICAgICB9CisgICAgICB0ZXN0X2FuZHYoYTAsIGExLCAoc2hvcnQpQklUX01BU0spOworICAgICAgZm9yIChpbnQgaT0wOyBpPEFSUkxFTjsgaSsrKSB7CisgICAgICAgIGVycm4gKz0gdmVyaWZ5KCJ0ZXN0X2FuZHY6ICIsIGksIGEwW2ldLCAoY2hhcikoKGNoYXIpKEFERF9JTklUK2kpJkJJVF9NQVNLKSk7CisgICAgICB9CisgICAgICB0ZXN0X2FuZGEoYTAsIGExLCBhNCk7CisgICAgICBmb3IgKGludCBpPTA7IGk8QVJSTEVOOyBpKyspIHsKKyAgICAgICAgZXJybiArPSB2ZXJpZnkoInRlc3RfYW5kYTogIiwgaSwgYTBbaV0sIChjaGFyKSgoY2hhcikoQUREX0lOSVQraSkmQklUX01BU0spKTsKKyAgICAgIH0KKworICAgICAgdGVzdF9vcmMoYTAsIGExKTsKKyAgICAgIGZvciAoaW50IGk9MDsgaTxBUlJMRU47IGkrKykgeworICAgICAgICBlcnJuICs9IHZlcmlmeSgidGVzdF9vcmM6ICIsIGksIGEwW2ldLCAoY2hhcikoKGNoYXIpKEFERF9JTklUK2kpfEJJVF9NQVNLKSk7CisgICAgICB9CisgICAgICB0ZXN0X29ydihhMCwgYTEsIChzaG9ydClCSVRfTUFTSyk7CisgICAgICBmb3IgKGludCBpPTA7IGk8QVJSTEVOOyBpKyspIHsKKyAgICAgICAgZXJybiArPSB2ZXJpZnkoInRlc3Rfb3J2OiAiLCBpLCBhMFtpXSwgKGNoYXIpKChjaGFyKShBRERfSU5JVCtpKXxCSVRfTUFTSykpOworICAgICAgfQorICAgICAgdGVzdF9vcmEoYTAsIGExLCBhNCk7CisgICAgICBmb3IgKGludCBpPTA7IGk8QVJSTEVOOyBpKyspIHsKKyAgICAgICAgZXJybiArPSB2ZXJpZnkoInRlc3Rfb3JhOiAiLCBpLCBhMFtpXSwgKGNoYXIpKChjaGFyKShBRERfSU5JVCtpKXxCSVRfTUFTSykpOworICAgICAgfQorCisgICAgICB0ZXN0X3hvcmMoYTAsIGExKTsKKyAgICAgIGZvciAoaW50IGk9MDsgaTxBUlJMRU47IGkrKykgeworICAgICAgICBlcnJuICs9IHZlcmlmeSgidGVzdF94b3JjOiAiLCBpLCBhMFtpXSwgKGNoYXIpKChjaGFyKShBRERfSU5JVCtpKV5CSVRfTUFTSykpOworICAgICAgfQorICAgICAgdGVzdF94b3J2KGEwLCBhMSwgKHNob3J0KUJJVF9NQVNLKTsKKyAgICAgIGZvciAoaW50IGk9MDsgaTxBUlJMRU47IGkrKykgeworICAgICAgICBlcnJuICs9IHZlcmlmeSgidGVzdF94b3J2OiAiLCBpLCBhMFtpXSwgKGNoYXIpKChjaGFyKShBRERfSU5JVCtpKV5CSVRfTUFTSykpOworICAgICAgfQorICAgICAgdGVzdF94b3JhKGEwLCBhMSwgYTQpOworICAgICAgZm9yIChpbnQgaT0wOyBpPEFSUkxFTjsgaSsrKSB7CisgICAgICAgIGVycm4gKz0gdmVyaWZ5KCJ0ZXN0X3hvcmE6ICIsIGksIGEwW2ldLCAoY2hhcikoKGNoYXIpKEFERF9JTklUK2kpXkJJVF9NQVNLKSk7CisgICAgICB9CisKKyAgICAgIHRlc3Rfc2xsYyhhMCwgYTEpOworICAgICAgZm9yIChpbnQgaT0wOyBpPEFSUkxFTjsgaSsrKSB7CisgICAgICAgIGVycm4gKz0gdmVyaWZ5KCJ0ZXN0X3NsbGM6ICIsIGksIGEwW2ldLCAoY2hhcikoKGNoYXIpKEFERF9JTklUK2kpPDxWQUxVRSkpOworICAgICAgfQorICAgICAgdGVzdF9zbGx2KGEwLCBhMSwgVkFMVUUpOworICAgICAgZm9yIChpbnQgaT0wOyBpPEFSUkxFTjsgaSsrKSB7CisgICAgICAgIGVycm4gKz0gdmVyaWZ5KCJ0ZXN0X3NsbHY6ICIsIGksIGEwW2ldLCAoY2hhcikoKGNoYXIpKEFERF9JTklUK2kpPDxWQUxVRSkpOworICAgICAgfQorCisgICAgICB0ZXN0X3NybGMoYTAsIGExKTsKKyAgICAgIGZvciAoaW50IGk9MDsgaTxBUlJMRU47IGkrKykgeworICAgICAgICBlcnJuICs9IHZlcmlmeSgidGVzdF9zcmxjOiAiLCBpLCBhMFtpXSwgKGNoYXIpKChjaGFyKShBRERfSU5JVCtpKT4+PlZBTFVFKSk7CisgICAgICB9CisgICAgICB0ZXN0X3NybHYoYTAsIGExLCBWQUxVRSk7CisgICAgICBmb3IgKGludCBpPTA7IGk8QVJSTEVOOyBpKyspIHsKKyAgICAgICAgZXJybiArPSB2ZXJpZnkoInRlc3Rfc3JsdjogIiwgaSwgYTBbaV0sIChjaGFyKSgoY2hhcikoQUREX0lOSVQraSk+Pj5WQUxVRSkpOworICAgICAgfQorCisgICAgICB0ZXN0X3NyYWMoYTAsIGExKTsKKyAgICAgIGZvciAoaW50IGk9MDsgaTxBUlJMRU47IGkrKykgeworICAgICAgICBlcnJuICs9IHZlcmlmeSgidGVzdF9zcmFjOiAiLCBpLCBhMFtpXSwgKGNoYXIpKChjaGFyKShBRERfSU5JVCtpKT4+VkFMVUUpKTsKKyAgICAgIH0KKyAgICAgIHRlc3Rfc3JhdihhMCwgYTEsIFZBTFVFKTsKKyAgICAgIGZvciAoaW50IGk9MDsgaTxBUlJMRU47IGkrKykgeworICAgICAgICBlcnJuICs9IHZlcmlmeSgidGVzdF9zcmF2OiAiLCBpLCBhMFtpXSwgKGNoYXIpKChjaGFyKShBRERfSU5JVCtpKT4+VkFMVUUpKTsKKyAgICAgIH0KKworICAgICAgdGVzdF9zbGxjX24oYTAsIGExKTsKKyAgICAgIGZvciAoaW50IGk9MDsgaTxBUlJMRU47IGkrKykgeworICAgICAgICBlcnJuICs9IHZlcmlmeSgidGVzdF9zbGxjX246ICIsIGksIGEwW2ldLCAoY2hhcikoKGNoYXIpKEFERF9JTklUK2kpPDwoLVZBTFVFKSkpOworICAgICAgfQorICAgICAgdGVzdF9zbGx2KGEwLCBhMSwgLVZBTFVFKTsKKyAgICAgIGZvciAoaW50IGk9MDsgaTxBUlJMRU47IGkrKykgeworICAgICAgICBlcnJuICs9IHZlcmlmeSgidGVzdF9zbGx2X246ICIsIGksIGEwW2ldLCAoY2hhcikoKGNoYXIpKEFERF9JTklUK2kpPDwoLVZBTFVFKSkpOworICAgICAgfQorCisgICAgICB0ZXN0X3NybGNfbihhMCwgYTEpOworICAgICAgZm9yIChpbnQgaT0wOyBpPEFSUkxFTjsgaSsrKSB7CisgICAgICAgIGVycm4gKz0gdmVyaWZ5KCJ0ZXN0X3NybGNfbjogIiwgaSwgYTBbaV0sIChjaGFyKSgoY2hhcikoQUREX0lOSVQraSk+Pj4oLVZBTFVFKSkpOworICAgICAgfQorICAgICAgdGVzdF9zcmx2KGEwLCBhMSwgLVZBTFVFKTsKKyAgICAgIGZvciAoaW50IGk9MDsgaTxBUlJMRU47IGkrKykgeworICAgICAgICBlcnJuICs9IHZlcmlmeSgidGVzdF9zcmx2X246ICIsIGksIGEwW2ldLCAoY2hhcikoKGNoYXIpKEFERF9JTklUK2kpPj4+KC1WQUxVRSkpKTsKKyAgICAgIH0KKworICAgICAgdGVzdF9zcmFjX24oYTAsIGExKTsKKyAgICAgIGZvciAoaW50IGk9MDsgaTxBUlJMRU47IGkrKykgeworICAgICAgICBlcnJuICs9IHZlcmlmeSgidGVzdF9zcmFjX246ICIsIGksIGEwW2ldLCAoY2hhcikoKGNoYXIpKEFERF9JTklUK2kpPj4oLVZBTFVFKSkpOworICAgICAgfQorICAgICAgdGVzdF9zcmF2KGEwLCBhMSwgLVZBTFVFKTsKKyAgICAgIGZvciAoaW50IGk9MDsgaTxBUlJMRU47IGkrKykgeworICAgICAgICBlcnJuICs9IHZlcmlmeSgidGVzdF9zcmF2X246ICIsIGksIGEwW2ldLCAoY2hhcikoKGNoYXIpKEFERF9JTklUK2kpPj4oLVZBTFVFKSkpOworICAgICAgfQorCisgICAgICB0ZXN0X3NsbGNfbyhhMCwgYTEpOworICAgICAgZm9yIChpbnQgaT0wOyBpPEFSUkxFTjsgaSsrKSB7CisgICAgICAgIGVycm4gKz0gdmVyaWZ5KCJ0ZXN0X3NsbGNfbzogIiwgaSwgYTBbaV0sIChjaGFyKSgoY2hhcikoQUREX0lOSVQraSk8PFNISUZUKSk7CisgICAgICB9CisgICAgICB0ZXN0X3NsbHYoYTAsIGExLCBTSElGVCk7CisgICAgICBmb3IgKGludCBpPTA7IGk8QVJSTEVOOyBpKyspIHsKKyAgICAgICAgZXJybiArPSB2ZXJpZnkoInRlc3Rfc2xsdl9vOiAiLCBpLCBhMFtpXSwgKGNoYXIpKChjaGFyKShBRERfSU5JVCtpKTw8U0hJRlQpKTsKKyAgICAgIH0KKworICAgICAgdGVzdF9zcmxjX28oYTAsIGExKTsKKyAgICAgIGZvciAoaW50IGk9MDsgaTxBUlJMRU47IGkrKykgeworICAgICAgICBlcnJuICs9IHZlcmlmeSgidGVzdF9zcmxjX286ICIsIGksIGEwW2ldLCAoY2hhcikoKGNoYXIpKEFERF9JTklUK2kpPj4+U0hJRlQpKTsKKyAgICAgIH0KKyAgICAgIHRlc3Rfc3JsdihhMCwgYTEsIFNISUZUKTsKKyAgICAgIGZvciAoaW50IGk9MDsgaTxBUlJMRU47IGkrKykgeworICAgICAgICBlcnJuICs9IHZlcmlmeSgidGVzdF9zcmx2X286ICIsIGksIGEwW2ldLCAoY2hhcikoKGNoYXIpKEFERF9JTklUK2kpPj4+U0hJRlQpKTsKKyAgICAgIH0KKworICAgICAgdGVzdF9zcmFjX28oYTAsIGExKTsKKyAgICAgIGZvciAoaW50IGk9MDsgaTxBUlJMRU47IGkrKykgeworICAgICAgICBlcnJuICs9IHZlcmlmeSgidGVzdF9zcmFjX286ICIsIGksIGEwW2ldLCAoY2hhcikoKGNoYXIpKEFERF9JTklUK2kpPj5TSElGVCkpOworICAgICAgfQorICAgICAgdGVzdF9zcmF2KGEwLCBhMSwgU0hJRlQpOworICAgICAgZm9yIChpbnQgaT0wOyBpPEFSUkxFTjsgaSsrKSB7CisgICAgICAgIGVycm4gKz0gdmVyaWZ5KCJ0ZXN0X3NyYXZfbzogIiwgaSwgYTBbaV0sIChjaGFyKSgoY2hhcikoQUREX0lOSVQraSk+PlNISUZUKSk7CisgICAgICB9CisKKyAgICAgIHRlc3Rfc2xsY19vbihhMCwgYTEpOworICAgICAgZm9yIChpbnQgaT0wOyBpPEFSUkxFTjsgaSsrKSB7CisgICAgICAgIGVycm4gKz0gdmVyaWZ5KCJ0ZXN0X3NsbGNfb246ICIsIGksIGEwW2ldLCAoY2hhcikoKGNoYXIpKEFERF9JTklUK2kpPDwoLVNISUZUKSkpOworICAgICAgfQorICAgICAgdGVzdF9zbGx2KGEwLCBhMSwgLVNISUZUKTsKKyAgICAgIGZvciAoaW50IGk9MDsgaTxBUlJMRU47IGkrKykgeworICAgICAgICBlcnJuICs9IHZlcmlmeSgidGVzdF9zbGx2X29uOiAiLCBpLCBhMFtpXSwgKGNoYXIpKChjaGFyKShBRERfSU5JVCtpKTw8KC1TSElGVCkpKTsKKyAgICAgIH0KKworICAgICAgdGVzdF9zcmxjX29uKGEwLCBhMSk7CisgICAgICBmb3IgKGludCBpPTA7IGk8QVJSTEVOOyBpKyspIHsKKyAgICAgICAgZXJybiArPSB2ZXJpZnkoInRlc3Rfc3JsY19vbjogIiwgaSwgYTBbaV0sIChjaGFyKSgoY2hhcikoQUREX0lOSVQraSk+Pj4oLVNISUZUKSkpOworICAgICAgfQorICAgICAgdGVzdF9zcmx2KGEwLCBhMSwgLVNISUZUKTsKKyAgICAgIGZvciAoaW50IGk9MDsgaTxBUlJMRU47IGkrKykgeworICAgICAgICBlcnJuICs9IHZlcmlmeSgidGVzdF9zcmx2X29uOiAiLCBpLCBhMFtpXSwgKGNoYXIpKChjaGFyKShBRERfSU5JVCtpKT4+PigtU0hJRlQpKSk7CisgICAgICB9CisKKyAgICAgIHRlc3Rfc3JhY19vbihhMCwgYTEpOworICAgICAgZm9yIChpbnQgaT0wOyBpPEFSUkxFTjsgaSsrKSB7CisgICAgICAgIGVycm4gKz0gdmVyaWZ5KCJ0ZXN0X3NyYWNfb246ICIsIGksIGEwW2ldLCAoY2hhcikoKGNoYXIpKEFERF9JTklUK2kpPj4oLVNISUZUKSkpOworICAgICAgfQorICAgICAgdGVzdF9zcmF2KGEwLCBhMSwgLVNISUZUKTsKKyAgICAgIGZvciAoaW50IGk9MDsgaTxBUlJMRU47IGkrKykgeworICAgICAgICBlcnJuICs9IHZlcmlmeSgidGVzdF9zcmF2X29uOiAiLCBpLCBhMFtpXSwgKGNoYXIpKChjaGFyKShBRERfSU5JVCtpKT4+KC1TSElGVCkpKTsKKyAgICAgIH0KKworICAgICAgdGVzdF9zbGxjX2FkZChhMCwgYTEpOworICAgICAgZm9yIChpbnQgaT0wOyBpPEFSUkxFTjsgaSsrKSB7CisgICAgICAgIGVycm4gKz0gdmVyaWZ5KCJ0ZXN0X3NsbGNfYWRkOiAiLCBpLCBhMFtpXSwgKGNoYXIpKCgoY2hhcikoQUREX0lOSVQraSkgKyBBRERfSU5JVCk8PFZBTFVFKSk7CisgICAgICB9CisgICAgICB0ZXN0X3NsbHZfYWRkKGEwLCBhMSwgQUREX0lOSVQpOworICAgICAgZm9yIChpbnQgaT0wOyBpPEFSUkxFTjsgaSsrKSB7CisgICAgICAgIGVycm4gKz0gdmVyaWZ5KCJ0ZXN0X3NsbHZfYWRkOiAiLCBpLCBhMFtpXSwgKGNoYXIpKCgoY2hhcikoQUREX0lOSVQraSkgKyBBRERfSU5JVCk8PFZBTFVFKSk7CisgICAgICB9CisKKyAgICAgIHRlc3Rfc3JsY19hZGQoYTAsIGExKTsKKyAgICAgIGZvciAoaW50IGk9MDsgaTxBUlJMRU47IGkrKykgeworICAgICAgICBlcnJuICs9IHZlcmlmeSgidGVzdF9zcmxjX2FkZDogIiwgaSwgYTBbaV0sIChjaGFyKSgoKGNoYXIpKEFERF9JTklUK2kpICsgQUREX0lOSVQpPj4+VkFMVUUpKTsKKyAgICAgIH0KKyAgICAgIHRlc3Rfc3Jsdl9hZGQoYTAsIGExLCBBRERfSU5JVCk7CisgICAgICBmb3IgKGludCBpPTA7IGk8QVJSTEVOOyBpKyspIHsKKyAgICAgICAgZXJybiArPSB2ZXJpZnkoInRlc3Rfc3Jsdl9hZGQ6ICIsIGksIGEwW2ldLCAoY2hhcikoKChjaGFyKShBRERfSU5JVCtpKSArIEFERF9JTklUKT4+PlZBTFVFKSk7CisgICAgICB9CisKKyAgICAgIHRlc3Rfc3JhY19hZGQoYTAsIGExKTsKKyAgICAgIGZvciAoaW50IGk9MDsgaTxBUlJMRU47IGkrKykgeworICAgICAgICBlcnJuICs9IHZlcmlmeSgidGVzdF9zcmFjX2FkZDogIiwgaSwgYTBbaV0sIChjaGFyKSgoKGNoYXIpKEFERF9JTklUK2kpICsgQUREX0lOSVQpPj5WQUxVRSkpOworICAgICAgfQorICAgICAgdGVzdF9zcmF2X2FkZChhMCwgYTEsIEFERF9JTklUKTsKKyAgICAgIGZvciAoaW50IGk9MDsgaTxBUlJMRU47IGkrKykgeworICAgICAgICBlcnJuICs9IHZlcmlmeSgidGVzdF9zcmF2X2FkZDogIiwgaSwgYTBbaV0sIChjaGFyKSgoKGNoYXIpKEFERF9JTklUK2kpICsgQUREX0lOSVQpPj5WQUxVRSkpOworICAgICAgfQorCisgICAgICB0ZXN0X3NsbGNfYW5kKGEwLCBhMSk7CisgICAgICBmb3IgKGludCBpPTA7IGk8QVJSTEVOOyBpKyspIHsKKyAgICAgICAgZXJybiArPSB2ZXJpZnkoInRlc3Rfc2xsY19hbmQ6ICIsIGksIGEwW2ldLCAoY2hhcikoKChjaGFyKShBRERfSU5JVCtpKSAmIEJJVF9NQVNLKTw8VkFMVUUpKTsKKyAgICAgIH0KKyAgICAgIHRlc3Rfc2xsdl9hbmQoYTAsIGExLCBCSVRfTUFTSyk7CisgICAgICBmb3IgKGludCBpPTA7IGk8QVJSTEVOOyBpKyspIHsKKyAgICAgICAgZXJybiArPSB2ZXJpZnkoInRlc3Rfc2xsdl9hbmQ6ICIsIGksIGEwW2ldLCAoY2hhcikoKChjaGFyKShBRERfSU5JVCtpKSAmIEJJVF9NQVNLKTw8VkFMVUUpKTsKKyAgICAgIH0KKworICAgICAgdGVzdF9zcmxjX2FuZChhMCwgYTEpOworICAgICAgZm9yIChpbnQgaT0wOyBpPEFSUkxFTjsgaSsrKSB7CisgICAgICAgIGVycm4gKz0gdmVyaWZ5KCJ0ZXN0X3NybGNfYW5kOiAiLCBpLCBhMFtpXSwgKGNoYXIpKCgoY2hhcikoQUREX0lOSVQraSkgJiBCSVRfTUFTSyk+Pj5WQUxVRSkpOworICAgICAgfQorICAgICAgdGVzdF9zcmx2X2FuZChhMCwgYTEsIEJJVF9NQVNLKTsKKyAgICAgIGZvciAoaW50IGk9MDsgaTxBUlJMRU47IGkrKykgeworICAgICAgICBlcnJuICs9IHZlcmlmeSgidGVzdF9zcmx2X2FuZDogIiwgaSwgYTBbaV0sIChjaGFyKSgoKGNoYXIpKEFERF9JTklUK2kpICYgQklUX01BU0spPj4+VkFMVUUpKTsKKyAgICAgIH0KKworICAgICAgdGVzdF9zcmFjX2FuZChhMCwgYTEpOworICAgICAgZm9yIChpbnQgaT0wOyBpPEFSUkxFTjsgaSsrKSB7CisgICAgICAgIGVycm4gKz0gdmVyaWZ5KCJ0ZXN0X3NyYWNfYW5kOiAiLCBpLCBhMFtpXSwgKGNoYXIpKCgoY2hhcikoQUREX0lOSVQraSkgJiBCSVRfTUFTSyk+PlZBTFVFKSk7CisgICAgICB9CisgICAgICB0ZXN0X3NyYXZfYW5kKGEwLCBhMSwgQklUX01BU0spOworICAgICAgZm9yIChpbnQgaT0wOyBpPEFSUkxFTjsgaSsrKSB7CisgICAgICAgIGVycm4gKz0gdmVyaWZ5KCJ0ZXN0X3NyYXZfYW5kOiAiLCBpLCBhMFtpXSwgKGNoYXIpKCgoY2hhcikoQUREX0lOSVQraSkgJiBCSVRfTUFTSyk+PlZBTFVFKSk7CisgICAgICB9CisKKyAgICAgIHRlc3RfcGFjazIocDIsIGExKTsKKyAgICAgIGZvciAoaW50IGk9MDsgaTxBUlJMRU4vMjsgaSsrKSB7CisgICAgICAgIGVycm4gKz0gdmVyaWZ5KCJ0ZXN0X3BhY2syOiAiLCBpLCBwMltpXSwgKChpbnQpKEFERF9JTklUKzIqaSkgJiAweEZGRkYpIHwgKChpbnQpKEFERF9JTklUKzIqaSsxKSA8PCAxNikpOworICAgICAgfQorICAgICAgZm9yIChpbnQgaT0wOyBpPEFSUkxFTjsgaSsrKSB7CisgICAgICAgIGEwW2ldID0gKGNoYXIpLTE7CisgICAgICB9CisgICAgICB0ZXN0X3VucGFjazIoYTAsIHAyKTsKKyAgICAgIGZvciAoaW50IGk9MDsgaTwoQVJSTEVOJigtMikpOyBpKyspIHsKKyAgICAgICAgZXJybiArPSB2ZXJpZnkoInRlc3RfdW5wYWNrMjogIiwgaSwgYTBbaV0sIChjaGFyKShBRERfSU5JVCtpKSk7CisgICAgICB9CisKKyAgICAgIHRlc3RfcGFjazJfc3dhcChwMiwgYTEpOworICAgICAgZm9yIChpbnQgaT0wOyBpPEFSUkxFTi8yOyBpKyspIHsKKyAgICAgICAgZXJybiArPSB2ZXJpZnkoInRlc3RfcGFjazJfc3dhcDogIiwgaSwgcDJbaV0sICgoaW50KShBRERfSU5JVCsyKmkrMSkgJiAweEZGRkYpIHwgKChpbnQpKEFERF9JTklUKzIqaSkgPDwgMTYpKTsKKyAgICAgIH0KKyAgICAgIGZvciAoaW50IGk9MDsgaTxBUlJMRU47IGkrKykgeworICAgICAgICBhMFtpXSA9IChjaGFyKS0xOworICAgICAgfQorICAgICAgdGVzdF91bnBhY2syX3N3YXAoYTAsIHAyKTsKKyAgICAgIGZvciAoaW50IGk9MDsgaTwoQVJSTEVOJigtMikpOyBpKyspIHsKKyAgICAgICAgZXJybiArPSB2ZXJpZnkoInRlc3RfdW5wYWNrMl9zd2FwOiAiLCBpLCBhMFtpXSwgKGNoYXIpKEFERF9JTklUK2kpKTsKKyAgICAgIH0KKworICAgICAgdGVzdF9wYWNrNChwNCwgYTEpOworICAgICAgZm9yIChpbnQgaT0wOyBpPEFSUkxFTi80OyBpKyspIHsKKyAgICAgICAgZXJybiArPSB2ZXJpZnkoInRlc3RfcGFjazQ6ICIsIGksIHA0W2ldLCAgKChsb25nKShBRERfSU5JVCs0KmkrMCkgJiAweEZGRkZsKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgobG9uZykoQUREX0lOSVQrNCppKzEpICYgMHhGRkZGbCkgPDwgMTYpICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgobG9uZykoQUREX0lOSVQrNCppKzIpICYgMHhGRkZGbCkgPDwgMzIpICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgobG9uZykoQUREX0lOSVQrNCppKzMpICYgMHhGRkZGbCkgPDwgNDgpKTsKKyAgICAgIH0KKyAgICAgIGZvciAoaW50IGk9MDsgaTxBUlJMRU47IGkrKykgeworICAgICAgICBhMFtpXSA9IChjaGFyKS0xOworICAgICAgfQorICAgICAgdGVzdF91bnBhY2s0KGEwLCBwNCk7CisgICAgICBmb3IgKGludCBpPTA7IGk8KEFSUkxFTiYoLTQpKTsgaSsrKSB7CisgICAgICAgIGVycm4gKz0gdmVyaWZ5KCJ0ZXN0X3VucGFjazQ6ICIsIGksIGEwW2ldLCAoY2hhcikoQUREX0lOSVQraSkpOworICAgICAgfQorCisgICAgICB0ZXN0X3BhY2s0X3N3YXAocDQsIGExKTsKKyAgICAgIGZvciAoaW50IGk9MDsgaTxBUlJMRU4vNDsgaSsrKSB7CisgICAgICAgIGVycm4gKz0gdmVyaWZ5KCJ0ZXN0X3BhY2s0X3N3YXA6ICIsIGksIHA0W2ldLCAgKChsb25nKShBRERfSU5JVCs0KmkrMykgJiAweEZGRkZsKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChsb25nKShBRERfSU5JVCs0KmkrMikgJiAweEZGRkZsKSA8PCAxNikgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKGxvbmcpKEFERF9JTklUKzQqaSsxKSAmIDB4RkZGRmwpIDw8IDMyKSAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgobG9uZykoQUREX0lOSVQrNCppKzApICYgMHhGRkZGbCkgPDwgNDgpKTsKKyAgICAgIH0KKyAgICAgIGZvciAoaW50IGk9MDsgaTxBUlJMRU47IGkrKykgeworICAgICAgICBhMFtpXSA9IChjaGFyKS0xOworICAgICAgfQorICAgICAgdGVzdF91bnBhY2s0X3N3YXAoYTAsIHA0KTsKKyAgICAgIGZvciAoaW50IGk9MDsgaTwoQVJSTEVOJigtNCkpOyBpKyspIHsKKyAgICAgICAgZXJybiArPSB2ZXJpZnkoInRlc3RfdW5wYWNrNF9zd2FwOiAiLCBpLCBhMFtpXSwgKGNoYXIpKEFERF9JTklUK2kpKTsKKyAgICAgIH0KKworICAgIH0KKworICAgIGlmIChlcnJuID4gMCkKKyAgICAgIHJldHVybiBlcnJuOworCisgICAgU3lzdGVtLm91dC5wcmludGxuKCJUaW1lIik7CisgICAgbG9uZyBzdGFydCwgZW5kOworCisgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBmb3IgKGludCBpPTA7IGk8SVRFUlM7IGkrKykgeworICAgICAgdGVzdF9zdW0oYTEpOworICAgIH0KKyAgICBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oInRlc3Rfc3VtOiAiICsgKGVuZCAtIHN0YXJ0KSk7CisKKyAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIGZvciAoaW50IGk9MDsgaTxJVEVSUzsgaSsrKSB7CisgICAgICB0ZXN0X2FkZGMoYTAsIGExKTsKKyAgICB9CisgICAgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0ZXN0X2FkZGM6ICIgKyAoZW5kIC0gc3RhcnQpKTsKKyAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIGZvciAoaW50IGk9MDsgaTxJVEVSUzsgaSsrKSB7CisgICAgICB0ZXN0X2FkZHYoYTAsIGExLCAoY2hhcilWQUxVRSk7CisgICAgfQorICAgIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGVzdF9hZGR2OiAiICsgKGVuZCAtIHN0YXJ0KSk7CisgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBmb3IgKGludCBpPTA7IGk8SVRFUlM7IGkrKykgeworICAgICAgdGVzdF9hZGRhKGEwLCBhMSwgYTIpOworICAgIH0KKyAgICBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oInRlc3RfYWRkYTogIiArIChlbmQgLSBzdGFydCkpOworCisgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBmb3IgKGludCBpPTA7IGk8SVRFUlM7IGkrKykgeworICAgICAgdGVzdF9zdWJjKGEwLCBhMSk7CisgICAgfQorICAgIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGVzdF9zdWJjOiAiICsgKGVuZCAtIHN0YXJ0KSk7CisgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBmb3IgKGludCBpPTA7IGk8SVRFUlM7IGkrKykgeworICAgICAgdGVzdF9zdWJ2KGEwLCBhMSwgKGNoYXIpVkFMVUUpOworICAgIH0KKyAgICBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oInRlc3Rfc3VidjogIiArIChlbmQgLSBzdGFydCkpOworICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgZm9yIChpbnQgaT0wOyBpPElURVJTOyBpKyspIHsKKyAgICAgIHRlc3Rfc3ViYShhMCwgYTEsIGEyKTsKKyAgICB9CisgICAgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0ZXN0X3N1YmE6ICIgKyAoZW5kIC0gc3RhcnQpKTsKKworICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgZm9yIChpbnQgaT0wOyBpPElURVJTOyBpKyspIHsKKyAgICAgIHRlc3RfbXVsYyhhMCwgYTEpOworICAgIH0KKyAgICBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oInRlc3RfbXVsYzogIiArIChlbmQgLSBzdGFydCkpOworICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgZm9yIChpbnQgaT0wOyBpPElURVJTOyBpKyspIHsKKyAgICAgIHRlc3RfbXVsdihhMCwgYTEsIChjaGFyKVZBTFVFKTsKKyAgICB9CisgICAgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0ZXN0X211bHY6ICIgKyAoZW5kIC0gc3RhcnQpKTsKKyAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIGZvciAoaW50IGk9MDsgaTxJVEVSUzsgaSsrKSB7CisgICAgICB0ZXN0X211bGEoYTAsIGExLCBhMik7CisgICAgfQorICAgIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGVzdF9tdWxhOiAiICsgKGVuZCAtIHN0YXJ0KSk7CisKKyAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIGZvciAoaW50IGk9MDsgaTxJVEVSUzsgaSsrKSB7CisgICAgICB0ZXN0X2RpdmMoYTAsIGExKTsKKyAgICB9CisgICAgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0ZXN0X2RpdmM6ICIgKyAoZW5kIC0gc3RhcnQpKTsKKyAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIGZvciAoaW50IGk9MDsgaTxJVEVSUzsgaSsrKSB7CisgICAgICB0ZXN0X2RpdnYoYTAsIGExLCBWQUxVRSk7CisgICAgfQorICAgIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGVzdF9kaXZ2OiAiICsgKGVuZCAtIHN0YXJ0KSk7CisgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBmb3IgKGludCBpPTA7IGk8SVRFUlM7IGkrKykgeworICAgICAgdGVzdF9kaXZhKGEwLCBhMSwgYTIpOworICAgIH0KKyAgICBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oInRlc3RfZGl2YTogIiArIChlbmQgLSBzdGFydCkpOworCisgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBmb3IgKGludCBpPTA7IGk8SVRFUlM7IGkrKykgeworICAgICAgdGVzdF9tdWxjX24oYTAsIGExKTsKKyAgICB9CisgICAgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0ZXN0X211bGNfbjogIiArIChlbmQgLSBzdGFydCkpOworICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgZm9yIChpbnQgaT0wOyBpPElURVJTOyBpKyspIHsKKyAgICAgIHRlc3RfbXVsdihhMCwgYTEsIChjaGFyKS1WQUxVRSk7CisgICAgfQorICAgIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGVzdF9tdWx2X246ICIgKyAoZW5kIC0gc3RhcnQpKTsKKyAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIGZvciAoaW50IGk9MDsgaTxJVEVSUzsgaSsrKSB7CisgICAgICB0ZXN0X211bGEoYTAsIGExLCBhMyk7CisgICAgfQorICAgIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGVzdF9tdWxhX246ICIgKyAoZW5kIC0gc3RhcnQpKTsKKworICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgZm9yIChpbnQgaT0wOyBpPElURVJTOyBpKyspIHsKKyAgICAgIHRlc3RfZGl2Y19uKGEwLCBhMSk7CisgICAgfQorICAgIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGVzdF9kaXZjX246ICIgKyAoZW5kIC0gc3RhcnQpKTsKKyAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIGZvciAoaW50IGk9MDsgaTxJVEVSUzsgaSsrKSB7CisgICAgICB0ZXN0X2RpdnYoYTAsIGExLCAtVkFMVUUpOworICAgIH0KKyAgICBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oInRlc3RfZGl2dl9uOiAiICsgKGVuZCAtIHN0YXJ0KSk7CisgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBmb3IgKGludCBpPTA7IGk8SVRFUlM7IGkrKykgeworICAgICAgdGVzdF9kaXZhKGEwLCBhMSwgYTMpOworICAgIH0KKyAgICBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oInRlc3RfZGl2YV9uOiAiICsgKGVuZCAtIHN0YXJ0KSk7CisKKyAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIGZvciAoaW50IGk9MDsgaTxJVEVSUzsgaSsrKSB7CisgICAgICB0ZXN0X2FuZGMoYTAsIGExKTsKKyAgICB9CisgICAgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0ZXN0X2FuZGM6ICIgKyAoZW5kIC0gc3RhcnQpKTsKKyAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIGZvciAoaW50IGk9MDsgaTxJVEVSUzsgaSsrKSB7CisgICAgICB0ZXN0X2FuZHYoYTAsIGExLCAoc2hvcnQpQklUX01BU0spOworICAgIH0KKyAgICBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oInRlc3RfYW5kdjogIiArIChlbmQgLSBzdGFydCkpOworICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgZm9yIChpbnQgaT0wOyBpPElURVJTOyBpKyspIHsKKyAgICAgIHRlc3RfYW5kYShhMCwgYTEsIGE0KTsKKyAgICB9CisgICAgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0ZXN0X2FuZGE6ICIgKyAoZW5kIC0gc3RhcnQpKTsKKworICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgZm9yIChpbnQgaT0wOyBpPElURVJTOyBpKyspIHsKKyAgICAgIHRlc3Rfb3JjKGEwLCBhMSk7CisgICAgfQorICAgIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGVzdF9vcmM6ICIgKyAoZW5kIC0gc3RhcnQpKTsKKyAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIGZvciAoaW50IGk9MDsgaTxJVEVSUzsgaSsrKSB7CisgICAgICB0ZXN0X29ydihhMCwgYTEsIChzaG9ydClCSVRfTUFTSyk7CisgICAgfQorICAgIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGVzdF9vcnY6ICIgKyAoZW5kIC0gc3RhcnQpKTsKKyAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIGZvciAoaW50IGk9MDsgaTxJVEVSUzsgaSsrKSB7CisgICAgICB0ZXN0X29yYShhMCwgYTEsIGE0KTsKKyAgICB9CisgICAgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0ZXN0X29yYTogIiArIChlbmQgLSBzdGFydCkpOworCisgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBmb3IgKGludCBpPTA7IGk8SVRFUlM7IGkrKykgeworICAgICAgdGVzdF94b3JjKGEwLCBhMSk7CisgICAgfQorICAgIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGVzdF94b3JjOiAiICsgKGVuZCAtIHN0YXJ0KSk7CisgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBmb3IgKGludCBpPTA7IGk8SVRFUlM7IGkrKykgeworICAgICAgdGVzdF94b3J2KGEwLCBhMSwgKHNob3J0KUJJVF9NQVNLKTsKKyAgICB9CisgICAgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0ZXN0X3hvcnY6ICIgKyAoZW5kIC0gc3RhcnQpKTsKKyAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIGZvciAoaW50IGk9MDsgaTxJVEVSUzsgaSsrKSB7CisgICAgICB0ZXN0X3hvcmEoYTAsIGExLCBhNCk7CisgICAgfQorICAgIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGVzdF94b3JhOiAiICsgKGVuZCAtIHN0YXJ0KSk7CisKKyAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIGZvciAoaW50IGk9MDsgaTxJVEVSUzsgaSsrKSB7CisgICAgICB0ZXN0X3NsbGMoYTAsIGExKTsKKyAgICB9CisgICAgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0ZXN0X3NsbGM6ICIgKyAoZW5kIC0gc3RhcnQpKTsKKyAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIGZvciAoaW50IGk9MDsgaTxJVEVSUzsgaSsrKSB7CisgICAgICB0ZXN0X3NsbHYoYTAsIGExLCBWQUxVRSk7CisgICAgfQorICAgIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGVzdF9zbGx2OiAiICsgKGVuZCAtIHN0YXJ0KSk7CisKKyAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIGZvciAoaW50IGk9MDsgaTxJVEVSUzsgaSsrKSB7CisgICAgICB0ZXN0X3NybGMoYTAsIGExKTsKKyAgICB9CisgICAgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0ZXN0X3NybGM6ICIgKyAoZW5kIC0gc3RhcnQpKTsKKyAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIGZvciAoaW50IGk9MDsgaTxJVEVSUzsgaSsrKSB7CisgICAgICB0ZXN0X3NybHYoYTAsIGExLCBWQUxVRSk7CisgICAgfQorICAgIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGVzdF9zcmx2OiAiICsgKGVuZCAtIHN0YXJ0KSk7CisKKyAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIGZvciAoaW50IGk9MDsgaTxJVEVSUzsgaSsrKSB7CisgICAgICB0ZXN0X3NyYWMoYTAsIGExKTsKKyAgICB9CisgICAgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0ZXN0X3NyYWM6ICIgKyAoZW5kIC0gc3RhcnQpKTsKKyAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIGZvciAoaW50IGk9MDsgaTxJVEVSUzsgaSsrKSB7CisgICAgICB0ZXN0X3NyYXYoYTAsIGExLCBWQUxVRSk7CisgICAgfQorICAgIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGVzdF9zcmF2OiAiICsgKGVuZCAtIHN0YXJ0KSk7CisKKyAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIGZvciAoaW50IGk9MDsgaTxJVEVSUzsgaSsrKSB7CisgICAgICB0ZXN0X3NsbGNfbihhMCwgYTEpOworICAgIH0KKyAgICBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oInRlc3Rfc2xsY19uOiAiICsgKGVuZCAtIHN0YXJ0KSk7CisgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBmb3IgKGludCBpPTA7IGk8SVRFUlM7IGkrKykgeworICAgICAgdGVzdF9zbGx2KGEwLCBhMSwgLVZBTFVFKTsKKyAgICB9CisgICAgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0ZXN0X3NsbHZfbjogIiArIChlbmQgLSBzdGFydCkpOworCisgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBmb3IgKGludCBpPTA7IGk8SVRFUlM7IGkrKykgeworICAgICAgdGVzdF9zcmxjX24oYTAsIGExKTsKKyAgICB9CisgICAgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0ZXN0X3NybGNfbjogIiArIChlbmQgLSBzdGFydCkpOworICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgZm9yIChpbnQgaT0wOyBpPElURVJTOyBpKyspIHsKKyAgICAgIHRlc3Rfc3JsdihhMCwgYTEsIC1WQUxVRSk7CisgICAgfQorICAgIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGVzdF9zcmx2X246ICIgKyAoZW5kIC0gc3RhcnQpKTsKKworICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgZm9yIChpbnQgaT0wOyBpPElURVJTOyBpKyspIHsKKyAgICAgIHRlc3Rfc3JhY19uKGEwLCBhMSk7CisgICAgfQorICAgIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGVzdF9zcmFjX246ICIgKyAoZW5kIC0gc3RhcnQpKTsKKyAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIGZvciAoaW50IGk9MDsgaTxJVEVSUzsgaSsrKSB7CisgICAgICB0ZXN0X3NyYXYoYTAsIGExLCAtVkFMVUUpOworICAgIH0KKyAgICBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oInRlc3Rfc3Jhdl9uOiAiICsgKGVuZCAtIHN0YXJ0KSk7CisKKyAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIGZvciAoaW50IGk9MDsgaTxJVEVSUzsgaSsrKSB7CisgICAgICB0ZXN0X3NsbGNfbyhhMCwgYTEpOworICAgIH0KKyAgICBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oInRlc3Rfc2xsY19vOiAiICsgKGVuZCAtIHN0YXJ0KSk7CisgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBmb3IgKGludCBpPTA7IGk8SVRFUlM7IGkrKykgeworICAgICAgdGVzdF9zbGx2KGEwLCBhMSwgU0hJRlQpOworICAgIH0KKyAgICBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oInRlc3Rfc2xsdl9vOiAiICsgKGVuZCAtIHN0YXJ0KSk7CisKKyAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIGZvciAoaW50IGk9MDsgaTxJVEVSUzsgaSsrKSB7CisgICAgICB0ZXN0X3NybGNfbyhhMCwgYTEpOworICAgIH0KKyAgICBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oInRlc3Rfc3JsY19vOiAiICsgKGVuZCAtIHN0YXJ0KSk7CisgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBmb3IgKGludCBpPTA7IGk8SVRFUlM7IGkrKykgeworICAgICAgdGVzdF9zcmx2KGEwLCBhMSwgU0hJRlQpOworICAgIH0KKyAgICBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oInRlc3Rfc3Jsdl9vOiAiICsgKGVuZCAtIHN0YXJ0KSk7CisKKyAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIGZvciAoaW50IGk9MDsgaTxJVEVSUzsgaSsrKSB7CisgICAgICB0ZXN0X3NyYWNfbyhhMCwgYTEpOworICAgIH0KKyAgICBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oInRlc3Rfc3JhY19vOiAiICsgKGVuZCAtIHN0YXJ0KSk7CisgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBmb3IgKGludCBpPTA7IGk8SVRFUlM7IGkrKykgeworICAgICAgdGVzdF9zcmF2KGEwLCBhMSwgU0hJRlQpOworICAgIH0KKyAgICBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oInRlc3Rfc3Jhdl9vOiAiICsgKGVuZCAtIHN0YXJ0KSk7CisKKyAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIGZvciAoaW50IGk9MDsgaTxJVEVSUzsgaSsrKSB7CisgICAgICB0ZXN0X3NsbGNfb24oYTAsIGExKTsKKyAgICB9CisgICAgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0ZXN0X3NsbGNfb246ICIgKyAoZW5kIC0gc3RhcnQpKTsKKyAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIGZvciAoaW50IGk9MDsgaTxJVEVSUzsgaSsrKSB7CisgICAgICB0ZXN0X3NsbHYoYTAsIGExLCAtU0hJRlQpOworICAgIH0KKyAgICBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oInRlc3Rfc2xsdl9vbjogIiArIChlbmQgLSBzdGFydCkpOworCisgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBmb3IgKGludCBpPTA7IGk8SVRFUlM7IGkrKykgeworICAgICAgdGVzdF9zcmxjX29uKGEwLCBhMSk7CisgICAgfQorICAgIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGVzdF9zcmxjX29uOiAiICsgKGVuZCAtIHN0YXJ0KSk7CisgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBmb3IgKGludCBpPTA7IGk8SVRFUlM7IGkrKykgeworICAgICAgdGVzdF9zcmx2KGEwLCBhMSwgLVNISUZUKTsKKyAgICB9CisgICAgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0ZXN0X3NybHZfb246ICIgKyAoZW5kIC0gc3RhcnQpKTsKKworICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgZm9yIChpbnQgaT0wOyBpPElURVJTOyBpKyspIHsKKyAgICAgIHRlc3Rfc3JhY19vbihhMCwgYTEpOworICAgIH0KKyAgICBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oInRlc3Rfc3JhY19vbjogIiArIChlbmQgLSBzdGFydCkpOworICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgZm9yIChpbnQgaT0wOyBpPElURVJTOyBpKyspIHsKKyAgICAgIHRlc3Rfc3JhdihhMCwgYTEsIC1TSElGVCk7CisgICAgfQorICAgIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGVzdF9zcmF2X29uOiAiICsgKGVuZCAtIHN0YXJ0KSk7CisKKyAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIGZvciAoaW50IGk9MDsgaTxJVEVSUzsgaSsrKSB7CisgICAgICB0ZXN0X3NsbGNfYWRkKGEwLCBhMSk7CisgICAgfQorICAgIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGVzdF9zbGxjX2FkZDogIiArIChlbmQgLSBzdGFydCkpOworICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgZm9yIChpbnQgaT0wOyBpPElURVJTOyBpKyspIHsKKyAgICAgIHRlc3Rfc2xsdl9hZGQoYTAsIGExLCBBRERfSU5JVCk7CisgICAgfQorICAgIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGVzdF9zbGx2X2FkZDogIiArIChlbmQgLSBzdGFydCkpOworCisgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBmb3IgKGludCBpPTA7IGk8SVRFUlM7IGkrKykgeworICAgICAgdGVzdF9zcmxjX2FkZChhMCwgYTEpOworICAgIH0KKyAgICBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oInRlc3Rfc3JsY19hZGQ6ICIgKyAoZW5kIC0gc3RhcnQpKTsKKyAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIGZvciAoaW50IGk9MDsgaTxJVEVSUzsgaSsrKSB7CisgICAgICB0ZXN0X3NybHZfYWRkKGEwLCBhMSwgQUREX0lOSVQpOworICAgIH0KKyAgICBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oInRlc3Rfc3Jsdl9hZGQ6ICIgKyAoZW5kIC0gc3RhcnQpKTsKKworICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgZm9yIChpbnQgaT0wOyBpPElURVJTOyBpKyspIHsKKyAgICAgIHRlc3Rfc3JhY19hZGQoYTAsIGExKTsKKyAgICB9CisgICAgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0ZXN0X3NyYWNfYWRkOiAiICsgKGVuZCAtIHN0YXJ0KSk7CisgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBmb3IgKGludCBpPTA7IGk8SVRFUlM7IGkrKykgeworICAgICAgdGVzdF9zcmF2X2FkZChhMCwgYTEsIEFERF9JTklUKTsKKyAgICB9CisgICAgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0ZXN0X3NyYXZfYWRkOiAiICsgKGVuZCAtIHN0YXJ0KSk7CisKKyAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIGZvciAoaW50IGk9MDsgaTxJVEVSUzsgaSsrKSB7CisgICAgICB0ZXN0X3NsbGNfYW5kKGEwLCBhMSk7CisgICAgfQorICAgIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGVzdF9zbGxjX2FuZDogIiArIChlbmQgLSBzdGFydCkpOworICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgZm9yIChpbnQgaT0wOyBpPElURVJTOyBpKyspIHsKKyAgICAgIHRlc3Rfc2xsdl9hbmQoYTAsIGExLCBCSVRfTUFTSyk7CisgICAgfQorICAgIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGVzdF9zbGx2X2FuZDogIiArIChlbmQgLSBzdGFydCkpOworCisgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBmb3IgKGludCBpPTA7IGk8SVRFUlM7IGkrKykgeworICAgICAgdGVzdF9zcmxjX2FuZChhMCwgYTEpOworICAgIH0KKyAgICBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oInRlc3Rfc3JsY19hbmQ6ICIgKyAoZW5kIC0gc3RhcnQpKTsKKyAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIGZvciAoaW50IGk9MDsgaTxJVEVSUzsgaSsrKSB7CisgICAgICB0ZXN0X3NybHZfYW5kKGEwLCBhMSwgQklUX01BU0spOworICAgIH0KKyAgICBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oInRlc3Rfc3Jsdl9hbmQ6ICIgKyAoZW5kIC0gc3RhcnQpKTsKKworICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgZm9yIChpbnQgaT0wOyBpPElURVJTOyBpKyspIHsKKyAgICAgIHRlc3Rfc3JhY19hbmQoYTAsIGExKTsKKyAgICB9CisgICAgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0ZXN0X3NyYWNfYW5kOiAiICsgKGVuZCAtIHN0YXJ0KSk7CisgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBmb3IgKGludCBpPTA7IGk8SVRFUlM7IGkrKykgeworICAgICAgdGVzdF9zcmF2X2FuZChhMCwgYTEsIEJJVF9NQVNLKTsKKyAgICB9CisgICAgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0ZXN0X3NyYXZfYW5kOiAiICsgKGVuZCAtIHN0YXJ0KSk7CisKKyAgICBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIGZvciAoaW50IGk9MDsgaTxJVEVSUzsgaSsrKSB7CisgICAgICB0ZXN0X3BhY2syKHAyLCBhMSk7CisgICAgfQorICAgIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGVzdF9wYWNrMjogIiArIChlbmQgLSBzdGFydCkpOworICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgZm9yIChpbnQgaT0wOyBpPElURVJTOyBpKyspIHsKKyAgICAgIHRlc3RfdW5wYWNrMihhMCwgcDIpOworICAgIH0KKyAgICBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oInRlc3RfdW5wYWNrMjogIiArIChlbmQgLSBzdGFydCkpOworICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgZm9yIChpbnQgaT0wOyBpPElURVJTOyBpKyspIHsKKyAgICAgIHRlc3RfcGFjazJfc3dhcChwMiwgYTEpOworICAgIH0KKyAgICBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oInRlc3RfcGFjazJfc3dhcDogIiArIChlbmQgLSBzdGFydCkpOworICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgZm9yIChpbnQgaT0wOyBpPElURVJTOyBpKyspIHsKKyAgICAgIHRlc3RfdW5wYWNrMl9zd2FwKGEwLCBwMik7CisgICAgfQorICAgIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGVzdF91bnBhY2syX3N3YXA6ICIgKyAoZW5kIC0gc3RhcnQpKTsKKworICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgZm9yIChpbnQgaT0wOyBpPElURVJTOyBpKyspIHsKKyAgICAgIHRlc3RfcGFjazQocDQsIGExKTsKKyAgICB9CisgICAgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0ZXN0X3BhY2s0OiAiICsgKGVuZCAtIHN0YXJ0KSk7CisgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBmb3IgKGludCBpPTA7IGk8SVRFUlM7IGkrKykgeworICAgICAgdGVzdF91bnBhY2s0KGEwLCBwNCk7CisgICAgfQorICAgIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGVzdF91bnBhY2s0OiAiICsgKGVuZCAtIHN0YXJ0KSk7CisgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBmb3IgKGludCBpPTA7IGk8SVRFUlM7IGkrKykgeworICAgICAgdGVzdF9wYWNrNF9zd2FwKHA0LCBhMSk7CisgICAgfQorICAgIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGVzdF9wYWNrNF9zd2FwOiAiICsgKGVuZCAtIHN0YXJ0KSk7CisgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICBmb3IgKGludCBpPTA7IGk8SVRFUlM7IGkrKykgeworICAgICAgdGVzdF91bnBhY2s0X3N3YXAoYTAsIHA0KTsKKyAgICB9CisgICAgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0ZXN0X3VucGFjazRfc3dhcDogIiArIChlbmQgLSBzdGFydCkpOworCisgICAgcmV0dXJuIGVycm47CisgIH0KKworICBzdGF0aWMgaW50IHRlc3Rfc3VtKGNoYXJbXSBhMSkgeworICAgIGludCBzdW0gPSAwOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYTEubGVuZ3RoOyBpKz0xKSB7CisgICAgICBzdW0gKz0gYTFbaV07CisgICAgfQorICAgIHJldHVybiBzdW07CisgIH0KKworICBzdGF0aWMgdm9pZCB0ZXN0X2FkZGMoY2hhcltdIGEwLCBjaGFyW10gYTEpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGEwLmxlbmd0aDsgaSs9MSkgeworICAgICAgYTBbaV0gPSAoY2hhcikoYTFbaV0rVkFMVUUpOworICAgIH0KKyAgfQorICBzdGF0aWMgdm9pZCB0ZXN0X2FkZHYoY2hhcltdIGEwLCBjaGFyW10gYTEsIGNoYXIgYikgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYTAubGVuZ3RoOyBpKz0xKSB7CisgICAgICBhMFtpXSA9IChjaGFyKShhMVtpXStiKTsKKyAgICB9CisgIH0KKyAgc3RhdGljIHZvaWQgdGVzdF9hZGRhKGNoYXJbXSBhMCwgY2hhcltdIGExLCBzaG9ydFtdIGEyKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhMC5sZW5ndGg7IGkrPTEpIHsKKyAgICAgIGEwW2ldID0gKGNoYXIpKGExW2ldK2EyW2ldKTsKKyAgICB9CisgIH0KKworICBzdGF0aWMgdm9pZCB0ZXN0X3N1YmMoY2hhcltdIGEwLCBjaGFyW10gYTEpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGEwLmxlbmd0aDsgaSs9MSkgeworICAgICAgYTBbaV0gPSAoY2hhcikoYTFbaV0tVkFMVUUpOworICAgIH0KKyAgfQorICBzdGF0aWMgdm9pZCB0ZXN0X3N1YnYoY2hhcltdIGEwLCBjaGFyW10gYTEsIGNoYXIgYikgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYTAubGVuZ3RoOyBpKz0xKSB7CisgICAgICBhMFtpXSA9IChjaGFyKShhMVtpXS1iKTsKKyAgICB9CisgIH0KKyAgc3RhdGljIHZvaWQgdGVzdF9zdWJhKGNoYXJbXSBhMCwgY2hhcltdIGExLCBzaG9ydFtdIGEyKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhMC5sZW5ndGg7IGkrPTEpIHsKKyAgICAgIGEwW2ldID0gKGNoYXIpKGExW2ldLWEyW2ldKTsKKyAgICB9CisgIH0KKworICBzdGF0aWMgdm9pZCB0ZXN0X211bGMoY2hhcltdIGEwLCBjaGFyW10gYTEpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGEwLmxlbmd0aDsgaSs9MSkgeworICAgICAgYTBbaV0gPSAoY2hhcikoYTFbaV0qVkFMVUUpOworICAgIH0KKyAgfQorICBzdGF0aWMgdm9pZCB0ZXN0X211bGNfbihjaGFyW10gYTAsIGNoYXJbXSBhMSkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYTAubGVuZ3RoOyBpKz0xKSB7CisgICAgICBhMFtpXSA9IChjaGFyKShhMVtpXSooLVZBTFVFKSk7CisgICAgfQorICB9CisgIHN0YXRpYyB2b2lkIHRlc3RfbXVsdihjaGFyW10gYTAsIGNoYXJbXSBhMSwgY2hhciBiKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhMC5sZW5ndGg7IGkrPTEpIHsKKyAgICAgIGEwW2ldID0gKGNoYXIpKGExW2ldKmIpOworICAgIH0KKyAgfQorICBzdGF0aWMgdm9pZCB0ZXN0X211bGEoY2hhcltdIGEwLCBjaGFyW10gYTEsIHNob3J0W10gYTIpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGEwLmxlbmd0aDsgaSs9MSkgeworICAgICAgYTBbaV0gPSAoY2hhcikoYTFbaV0qYTJbaV0pOworICAgIH0KKyAgfQorCisgIHN0YXRpYyB2b2lkIHRlc3RfZGl2YyhjaGFyW10gYTAsIGNoYXJbXSBhMSkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYTAubGVuZ3RoOyBpKz0xKSB7CisgICAgICBhMFtpXSA9IChjaGFyKShhMVtpXS9WQUxVRSk7CisgICAgfQorICB9CisgIHN0YXRpYyB2b2lkIHRlc3RfZGl2Y19uKGNoYXJbXSBhMCwgY2hhcltdIGExKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhMC5sZW5ndGg7IGkrPTEpIHsKKyAgICAgIGEwW2ldID0gKGNoYXIpKGExW2ldLygtVkFMVUUpKTsKKyAgICB9CisgIH0KKyAgc3RhdGljIHZvaWQgdGVzdF9kaXZ2KGNoYXJbXSBhMCwgY2hhcltdIGExLCBpbnQgYikgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYTAubGVuZ3RoOyBpKz0xKSB7CisgICAgICBhMFtpXSA9IChjaGFyKShhMVtpXS9iKTsKKyAgICB9CisgIH0KKyAgc3RhdGljIHZvaWQgdGVzdF9kaXZhKGNoYXJbXSBhMCwgY2hhcltdIGExLCBzaG9ydFtdIGEyKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhMC5sZW5ndGg7IGkrPTEpIHsKKyAgICAgIGEwW2ldID0gKGNoYXIpKGExW2ldL2EyW2ldKTsKKyAgICB9CisgIH0KKworICBzdGF0aWMgdm9pZCB0ZXN0X2FuZGMoY2hhcltdIGEwLCBjaGFyW10gYTEpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGEwLmxlbmd0aDsgaSs9MSkgeworICAgICAgYTBbaV0gPSAoY2hhcikoYTFbaV0mQklUX01BU0spOworICAgIH0KKyAgfQorICBzdGF0aWMgdm9pZCB0ZXN0X2FuZHYoY2hhcltdIGEwLCBjaGFyW10gYTEsIHNob3J0IGIpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGEwLmxlbmd0aDsgaSs9MSkgeworICAgICAgYTBbaV0gPSAoY2hhcikoYTFbaV0mYik7CisgICAgfQorICB9CisgIHN0YXRpYyB2b2lkIHRlc3RfYW5kYShjaGFyW10gYTAsIGNoYXJbXSBhMSwgc2hvcnRbXSBhMikgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYTAubGVuZ3RoOyBpKz0xKSB7CisgICAgICBhMFtpXSA9IChjaGFyKShhMVtpXSZhMltpXSk7CisgICAgfQorICB9CisKKyAgc3RhdGljIHZvaWQgdGVzdF9vcmMoY2hhcltdIGEwLCBjaGFyW10gYTEpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGEwLmxlbmd0aDsgaSs9MSkgeworICAgICAgYTBbaV0gPSAoY2hhcikoYTFbaV18QklUX01BU0spOworICAgIH0KKyAgfQorICBzdGF0aWMgdm9pZCB0ZXN0X29ydihjaGFyW10gYTAsIGNoYXJbXSBhMSwgc2hvcnQgYikgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYTAubGVuZ3RoOyBpKz0xKSB7CisgICAgICBhMFtpXSA9IChjaGFyKShhMVtpXXxiKTsKKyAgICB9CisgIH0KKyAgc3RhdGljIHZvaWQgdGVzdF9vcmEoY2hhcltdIGEwLCBjaGFyW10gYTEsIHNob3J0W10gYTIpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGEwLmxlbmd0aDsgaSs9MSkgeworICAgICAgYTBbaV0gPSAoY2hhcikoYTFbaV18YTJbaV0pOworICAgIH0KKyAgfQorCisgIHN0YXRpYyB2b2lkIHRlc3RfeG9yYyhjaGFyW10gYTAsIGNoYXJbXSBhMSkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYTAubGVuZ3RoOyBpKz0xKSB7CisgICAgICBhMFtpXSA9IChjaGFyKShhMVtpXV5CSVRfTUFTSyk7CisgICAgfQorICB9CisgIHN0YXRpYyB2b2lkIHRlc3RfeG9ydihjaGFyW10gYTAsIGNoYXJbXSBhMSwgc2hvcnQgYikgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYTAubGVuZ3RoOyBpKz0xKSB7CisgICAgICBhMFtpXSA9IChjaGFyKShhMVtpXV5iKTsKKyAgICB9CisgIH0KKyAgc3RhdGljIHZvaWQgdGVzdF94b3JhKGNoYXJbXSBhMCwgY2hhcltdIGExLCBzaG9ydFtdIGEyKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhMC5sZW5ndGg7IGkrPTEpIHsKKyAgICAgIGEwW2ldID0gKGNoYXIpKGExW2ldXmEyW2ldKTsKKyAgICB9CisgIH0KKworICBzdGF0aWMgdm9pZCB0ZXN0X3NsbGMoY2hhcltdIGEwLCBjaGFyW10gYTEpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGEwLmxlbmd0aDsgaSs9MSkgeworICAgICAgYTBbaV0gPSAoY2hhcikoYTFbaV08PFZBTFVFKTsKKyAgICB9CisgIH0KKyAgc3RhdGljIHZvaWQgdGVzdF9zbGxjX24oY2hhcltdIGEwLCBjaGFyW10gYTEpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGEwLmxlbmd0aDsgaSs9MSkgeworICAgICAgYTBbaV0gPSAoY2hhcikoYTFbaV08PCgtVkFMVUUpKTsKKyAgICB9CisgIH0KKyAgc3RhdGljIHZvaWQgdGVzdF9zbGxjX28oY2hhcltdIGEwLCBjaGFyW10gYTEpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGEwLmxlbmd0aDsgaSs9MSkgeworICAgICAgYTBbaV0gPSAoY2hhcikoYTFbaV08PFNISUZUKTsKKyAgICB9CisgIH0KKyAgc3RhdGljIHZvaWQgdGVzdF9zbGxjX29uKGNoYXJbXSBhMCwgY2hhcltdIGExKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhMC5sZW5ndGg7IGkrPTEpIHsKKyAgICAgIGEwW2ldID0gKGNoYXIpKGExW2ldPDwoLVNISUZUKSk7CisgICAgfQorICB9CisgIHN0YXRpYyB2b2lkIHRlc3Rfc2xsdihjaGFyW10gYTAsIGNoYXJbXSBhMSwgaW50IGIpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGEwLmxlbmd0aDsgaSs9MSkgeworICAgICAgYTBbaV0gPSAoY2hhcikoYTFbaV08PGIpOworICAgIH0KKyAgfQorICBzdGF0aWMgdm9pZCB0ZXN0X3NsbGNfYWRkKGNoYXJbXSBhMCwgY2hhcltdIGExKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhMC5sZW5ndGg7IGkrPTEpIHsKKyAgICAgIGEwW2ldID0gKGNoYXIpKChhMVtpXSArIEFERF9JTklUKTw8VkFMVUUpOworICAgIH0KKyAgfQorICBzdGF0aWMgdm9pZCB0ZXN0X3NsbHZfYWRkKGNoYXJbXSBhMCwgY2hhcltdIGExLCBpbnQgYikgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYTAubGVuZ3RoOyBpKz0xKSB7CisgICAgICBhMFtpXSA9IChjaGFyKSgoYTFbaV0gKyBiKTw8VkFMVUUpOworICAgIH0KKyAgfQorICBzdGF0aWMgdm9pZCB0ZXN0X3NsbGNfYW5kKGNoYXJbXSBhMCwgY2hhcltdIGExKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhMC5sZW5ndGg7IGkrPTEpIHsKKyAgICAgIGEwW2ldID0gKGNoYXIpKChhMVtpXSAmIEJJVF9NQVNLKTw8VkFMVUUpOworICAgIH0KKyAgfQorICBzdGF0aWMgdm9pZCB0ZXN0X3NsbHZfYW5kKGNoYXJbXSBhMCwgY2hhcltdIGExLCBpbnQgYikgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYTAubGVuZ3RoOyBpKz0xKSB7CisgICAgICBhMFtpXSA9IChjaGFyKSgoYTFbaV0gJiBiKTw8VkFMVUUpOworICAgIH0KKyAgfQorCisgIHN0YXRpYyB2b2lkIHRlc3Rfc3JsYyhjaGFyW10gYTAsIGNoYXJbXSBhMSkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYTAubGVuZ3RoOyBpKz0xKSB7CisgICAgICBhMFtpXSA9IChjaGFyKShhMVtpXT4+PlZBTFVFKTsKKyAgICB9CisgIH0KKyAgc3RhdGljIHZvaWQgdGVzdF9zcmxjX24oY2hhcltdIGEwLCBjaGFyW10gYTEpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGEwLmxlbmd0aDsgaSs9MSkgeworICAgICAgYTBbaV0gPSAoY2hhcikoYTFbaV0+Pj4oLVZBTFVFKSk7CisgICAgfQorICB9CisgIHN0YXRpYyB2b2lkIHRlc3Rfc3JsY19vKGNoYXJbXSBhMCwgY2hhcltdIGExKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhMC5sZW5ndGg7IGkrPTEpIHsKKyAgICAgIGEwW2ldID0gKGNoYXIpKGExW2ldPj4+U0hJRlQpOworICAgIH0KKyAgfQorICBzdGF0aWMgdm9pZCB0ZXN0X3NybGNfb24oY2hhcltdIGEwLCBjaGFyW10gYTEpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGEwLmxlbmd0aDsgaSs9MSkgeworICAgICAgYTBbaV0gPSAoY2hhcikoYTFbaV0+Pj4oLVNISUZUKSk7CisgICAgfQorICB9CisgIHN0YXRpYyB2b2lkIHRlc3Rfc3JsdihjaGFyW10gYTAsIGNoYXJbXSBhMSwgaW50IGIpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGEwLmxlbmd0aDsgaSs9MSkgeworICAgICAgYTBbaV0gPSAoY2hhcikoYTFbaV0+Pj5iKTsKKyAgICB9CisgIH0KKyAgc3RhdGljIHZvaWQgdGVzdF9zcmxjX2FkZChjaGFyW10gYTAsIGNoYXJbXSBhMSkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYTAubGVuZ3RoOyBpKz0xKSB7CisgICAgICBhMFtpXSA9IChjaGFyKSgoYTFbaV0gKyBBRERfSU5JVCk+Pj5WQUxVRSk7CisgICAgfQorICB9CisgIHN0YXRpYyB2b2lkIHRlc3Rfc3Jsdl9hZGQoY2hhcltdIGEwLCBjaGFyW10gYTEsIGludCBiKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhMC5sZW5ndGg7IGkrPTEpIHsKKyAgICAgIGEwW2ldID0gKGNoYXIpKChhMVtpXSArIGIpPj4+VkFMVUUpOworICAgIH0KKyAgfQorICBzdGF0aWMgdm9pZCB0ZXN0X3NybGNfYW5kKGNoYXJbXSBhMCwgY2hhcltdIGExKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhMC5sZW5ndGg7IGkrPTEpIHsKKyAgICAgIGEwW2ldID0gKGNoYXIpKChhMVtpXSAmIEJJVF9NQVNLKT4+PlZBTFVFKTsKKyAgICB9CisgIH0KKyAgc3RhdGljIHZvaWQgdGVzdF9zcmx2X2FuZChjaGFyW10gYTAsIGNoYXJbXSBhMSwgaW50IGIpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGEwLmxlbmd0aDsgaSs9MSkgeworICAgICAgYTBbaV0gPSAoY2hhcikoKGExW2ldICYgYik+Pj5WQUxVRSk7CisgICAgfQorICB9CisKKyAgc3RhdGljIHZvaWQgdGVzdF9zcmFjKGNoYXJbXSBhMCwgY2hhcltdIGExKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhMC5sZW5ndGg7IGkrPTEpIHsKKyAgICAgIGEwW2ldID0gKGNoYXIpKGExW2ldPj5WQUxVRSk7CisgICAgfQorICB9CisgIHN0YXRpYyB2b2lkIHRlc3Rfc3JhY19uKGNoYXJbXSBhMCwgY2hhcltdIGExKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhMC5sZW5ndGg7IGkrPTEpIHsKKyAgICAgIGEwW2ldID0gKGNoYXIpKGExW2ldPj4oLVZBTFVFKSk7CisgICAgfQorICB9CisgIHN0YXRpYyB2b2lkIHRlc3Rfc3JhY19vKGNoYXJbXSBhMCwgY2hhcltdIGExKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhMC5sZW5ndGg7IGkrPTEpIHsKKyAgICAgIGEwW2ldID0gKGNoYXIpKGExW2ldPj5TSElGVCk7CisgICAgfQorICB9CisgIHN0YXRpYyB2b2lkIHRlc3Rfc3JhY19vbihjaGFyW10gYTAsIGNoYXJbXSBhMSkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYTAubGVuZ3RoOyBpKz0xKSB7CisgICAgICBhMFtpXSA9IChjaGFyKShhMVtpXT4+KC1TSElGVCkpOworICAgIH0KKyAgfQorICBzdGF0aWMgdm9pZCB0ZXN0X3NyYXYoY2hhcltdIGEwLCBjaGFyW10gYTEsIGludCBiKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhMC5sZW5ndGg7IGkrPTEpIHsKKyAgICAgIGEwW2ldID0gKGNoYXIpKGExW2ldPj5iKTsKKyAgICB9CisgIH0KKyAgc3RhdGljIHZvaWQgdGVzdF9zcmFjX2FkZChjaGFyW10gYTAsIGNoYXJbXSBhMSkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYTAubGVuZ3RoOyBpKz0xKSB7CisgICAgICBhMFtpXSA9IChjaGFyKSgoYTFbaV0gKyBBRERfSU5JVCk+PlZBTFVFKTsKKyAgICB9CisgIH0KKyAgc3RhdGljIHZvaWQgdGVzdF9zcmF2X2FkZChjaGFyW10gYTAsIGNoYXJbXSBhMSwgaW50IGIpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGEwLmxlbmd0aDsgaSs9MSkgeworICAgICAgYTBbaV0gPSAoY2hhcikoKGExW2ldICsgYik+PlZBTFVFKTsKKyAgICB9CisgIH0KKyAgc3RhdGljIHZvaWQgdGVzdF9zcmFjX2FuZChjaGFyW10gYTAsIGNoYXJbXSBhMSkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYTAubGVuZ3RoOyBpKz0xKSB7CisgICAgICBhMFtpXSA9IChjaGFyKSgoYTFbaV0gJiBCSVRfTUFTSyk+PlZBTFVFKTsKKyAgICB9CisgIH0KKyAgc3RhdGljIHZvaWQgdGVzdF9zcmF2X2FuZChjaGFyW10gYTAsIGNoYXJbXSBhMSwgaW50IGIpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGEwLmxlbmd0aDsgaSs9MSkgeworICAgICAgYTBbaV0gPSAoY2hhcikoKGExW2ldICYgYik+PlZBTFVFKTsKKyAgICB9CisgIH0KKworICBzdGF0aWMgdm9pZCB0ZXN0X3BhY2syKGludFtdIHAyLCBjaGFyW10gYTEpIHsKKyAgICBpZiAocDIubGVuZ3RoKjIgPiBhMS5sZW5ndGgpIHJldHVybjsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHAyLmxlbmd0aDsgaSs9MSkgeworICAgICAgaW50IGwwID0gKGludClhMVtpKjIrMF07CisgICAgICBpbnQgbDEgPSAoaW50KWExW2kqMisxXTsKKyAgICAgIHAyW2ldID0gKGwxIDw8IDE2KSB8IChsMCAmIDB4RkZGRik7CisgICAgfQorICB9CisgIHN0YXRpYyB2b2lkIHRlc3RfdW5wYWNrMihjaGFyW10gYTAsIGludFtdIHAyKSB7CisgICAgaWYgKHAyLmxlbmd0aCoyID4gYTAubGVuZ3RoKSByZXR1cm47CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwMi5sZW5ndGg7IGkrPTEpIHsKKyAgICAgIGludCBsID0gcDJbaV07CisgICAgICBhMFtpKjIrMF0gPSAoY2hhcikobCAmIDB4RkZGRik7CisgICAgICBhMFtpKjIrMV0gPSAoY2hhcikobCA+PiAxNik7CisgICAgfQorICB9CisgIHN0YXRpYyB2b2lkIHRlc3RfcGFjazJfc3dhcChpbnRbXSBwMiwgY2hhcltdIGExKSB7CisgICAgaWYgKHAyLmxlbmd0aCoyID4gYTEubGVuZ3RoKSByZXR1cm47CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwMi5sZW5ndGg7IGkrPTEpIHsKKyAgICAgIGludCBsMCA9IChpbnQpYTFbaSoyKzBdOworICAgICAgaW50IGwxID0gKGludClhMVtpKjIrMV07CisgICAgICBwMltpXSA9IChsMCA8PCAxNikgfCAobDEgJiAweEZGRkYpOworICAgIH0KKyAgfQorICBzdGF0aWMgdm9pZCB0ZXN0X3VucGFjazJfc3dhcChjaGFyW10gYTAsIGludFtdIHAyKSB7CisgICAgaWYgKHAyLmxlbmd0aCoyID4gYTAubGVuZ3RoKSByZXR1cm47CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwMi5sZW5ndGg7IGkrPTEpIHsKKyAgICAgIGludCBsID0gcDJbaV07CisgICAgICBhMFtpKjIrMF0gPSAoY2hhcikobCA+PiAxNik7CisgICAgICBhMFtpKjIrMV0gPSAoY2hhcikobCAmIDB4RkZGRik7CisgICAgfQorICB9CisKKyAgc3RhdGljIHZvaWQgdGVzdF9wYWNrNChsb25nW10gcDQsIGNoYXJbXSBhMSkgeworICAgIGlmIChwNC5sZW5ndGgqNCA+IGExLmxlbmd0aCkgcmV0dXJuOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcDQubGVuZ3RoOyBpKz0xKSB7CisgICAgICBsb25nIGwwID0gKGxvbmcpYTFbaSo0KzBdOworICAgICAgbG9uZyBsMSA9IChsb25nKWExW2kqNCsxXTsKKyAgICAgIGxvbmcgbDIgPSAobG9uZylhMVtpKjQrMl07CisgICAgICBsb25nIGwzID0gKGxvbmcpYTFbaSo0KzNdOworICAgICAgcDRbaV0gPSAobDAgJiAweEZGRkZsKSB8CisgICAgICAgICAgICAgKChsMSAmIDB4RkZGRmwpIDw8IDE2KSB8CisgICAgICAgICAgICAgKChsMiAmIDB4RkZGRmwpIDw8IDMyKSB8CisgICAgICAgICAgICAgKChsMyAmIDB4RkZGRmwpIDw8IDQ4KTsKKyAgICB9CisgIH0KKyAgc3RhdGljIHZvaWQgdGVzdF91bnBhY2s0KGNoYXJbXSBhMCwgbG9uZ1tdIHA0KSB7CisgICAgaWYgKHA0Lmxlbmd0aCo0ID4gYTAubGVuZ3RoKSByZXR1cm47CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwNC5sZW5ndGg7IGkrPTEpIHsKKyAgICAgIGxvbmcgbCA9IHA0W2ldOworICAgICAgYTBbaSo0KzBdID0gKGNoYXIpKGwgJiAweEZGRkZsKTsKKyAgICAgIGEwW2kqNCsxXSA9IChjaGFyKShsID4+IDE2KTsKKyAgICAgIGEwW2kqNCsyXSA9IChjaGFyKShsID4+IDMyKTsKKyAgICAgIGEwW2kqNCszXSA9IChjaGFyKShsID4+IDQ4KTsKKyAgICB9CisgIH0KKyAgc3RhdGljIHZvaWQgdGVzdF9wYWNrNF9zd2FwKGxvbmdbXSBwNCwgY2hhcltdIGExKSB7CisgICAgaWYgKHA0Lmxlbmd0aCo0ID4gYTEubGVuZ3RoKSByZXR1cm47CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwNC5sZW5ndGg7IGkrPTEpIHsKKyAgICAgIGxvbmcgbDAgPSAobG9uZylhMVtpKjQrMF07CisgICAgICBsb25nIGwxID0gKGxvbmcpYTFbaSo0KzFdOworICAgICAgbG9uZyBsMiA9IChsb25nKWExW2kqNCsyXTsKKyAgICAgIGxvbmcgbDMgPSAobG9uZylhMVtpKjQrM107CisgICAgICBwNFtpXSA9IChsMyAmIDB4RkZGRmwpIHwKKyAgICAgICAgICAgICAoKGwyICYgMHhGRkZGbCkgPDwgMTYpIHwKKyAgICAgICAgICAgICAoKGwxICYgMHhGRkZGbCkgPDwgMzIpIHwKKyAgICAgICAgICAgICAoKGwwICYgMHhGRkZGbCkgPDwgNDgpOworICAgIH0KKyAgfQorICBzdGF0aWMgdm9pZCB0ZXN0X3VucGFjazRfc3dhcChjaGFyW10gYTAsIGxvbmdbXSBwNCkgeworICAgIGlmIChwNC5sZW5ndGgqNCA+IGEwLmxlbmd0aCkgcmV0dXJuOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcDQubGVuZ3RoOyBpKz0xKSB7CisgICAgICBsb25nIGwgPSBwNFtpXTsKKyAgICAgIGEwW2kqNCswXSA9IChjaGFyKShsID4+IDQ4KTsKKyAgICAgIGEwW2kqNCsxXSA9IChjaGFyKShsID4+IDMyKTsKKyAgICAgIGEwW2kqNCsyXSA9IChjaGFyKShsID4+IDE2KTsKKyAgICAgIGEwW2kqNCszXSA9IChjaGFyKShsICYgMHhGRkZGbCk7CisgICAgfQorICB9CisKKyAgc3RhdGljIGludCB2ZXJpZnkoU3RyaW5nIHRleHQsIGludCBpLCBpbnQgZWxlbSwgaW50IHZhbCkgeworICAgIGlmIChlbGVtICE9IHZhbCkgeworICAgICAgU3lzdGVtLmVyci5wcmludGxuKHRleHQgKyAiWyIgKyBpICsgIl0gPSAiICsgZWxlbSArICIgIT0gIiArIHZhbCk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7CisgIH0KKworICBzdGF0aWMgaW50IHZlcmlmeShTdHJpbmcgdGV4dCwgaW50IGksIGxvbmcgZWxlbSwgbG9uZyB2YWwpIHsKKyAgICBpZiAoZWxlbSAhPSB2YWwpIHsKKyAgICAgIFN5c3RlbS5lcnIucHJpbnRsbih0ZXh0ICsgIlsiICsgaSArICJdID0gIiArIExvbmcudG9IZXhTdHJpbmcoZWxlbSkgKyAiICE9ICIgKyBMb25nLnRvSGV4U3RyaW5nKHZhbCkpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiAwOworICB9Cit9CmRpZmYgLS1naXQgYS9ob3RzcG90L3Rlc3QvcnVudGltZS83MTU4ODAwL0JhZFV0ZjguamF2YSBiL2hvdHNwb3QvdGVzdC9ydW50aW1lLzcxNTg4MDAvQmFkVXRmOC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Yjc5NzYyLi4wMDAwMDAwCi0tLSBhL2hvdHNwb3QvdGVzdC9ydW50aW1lLzcxNTg4MDAvQmFkVXRmOC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCi0gKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55Ci0gKiBxdWVzdGlvbnMuCi0gKi8KLQotLyoKLSAqIEB0ZXN0Ci0gKiBAYnVnIDcxNTg4MDAKLSAqIEBzdW1tYXJ5IFRlc3QgdGhhdCAxMjAwIHN5bWJvbHMgdGhhdCBoYXNoIHRvIHRoZSBzYW1lIHZhbHVlIHRyaWdnZXJzCi0gKiB0aGUgc3ltYm9sIHRhYmxlIGFsdGVybmF0ZSBoYXNoaW5nIG1lY2hhbmlzbS4gIFRoZXJlIGlzbid0IGFjdHVhbGx5IGEKLSAqIHdheSB0byB2ZXJpZnkgdGhpcy4KLSAqLwotLy8KLS8vIEdlbmVyYXRlIGxhcmdlIG51bWJlciBvZiBzdHJpbmdzIHRoYXQgaGFzaCB0byB0aGUgc2FtZSB2YWx1ZQotLy8gdG8gc2xvdyBkb3duIHN5bWJvbCB0YWJsZSBsb29rdXAuCi0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLQotcHVibGljIGNsYXNzIEJhZFV0Zjggewotc3RhdGljIFN0cmluZ1tdIHN0cmluZ3MgPSB7Ci0gICAgIkVPY0xLdmJkZFp5UHhZcGIiLAotICAgICJEbmNMS3ZiZFB4bUFHcnFqIiwKLSAgICAiRG9Damp2YmRweG9JSFFkWSIsCi0gICAgIkVQQ2tLdmJkcVlvSGZxRVkiLAotICAgICJEbmJrS3ZiZGV6dllkaVVYIiwKLSAgICAiRG5iamp2YmRlRW9SYlhDaiIsCi0gICAgIkVPYmtLdmJkYnNDa1VFS0IiLAotICAgICJFT2NMS3ZiZG5VdHlqaXFmIiwKLSAgICAiRG5jTEt2YmRSV25EY01IYyIsCi0gICAgIkRvQ2tLdmJkclNVa09MQW0iLAotICAgICJEbmNMS3ZiZGZORndHbUprIiwKLSAgICAiRVBETEt2YmR2QWRZcm9GSSIsCi0gICAgIkRvRExLdmJkaUdpYnlWaXUiLAotICAgICJEbmNMS3ZiZFlxTkVobUZSIiwKLSAgICAiRG9Da0t2YmRFQVJobHpYWCIsCi0gICAgIkRuY0xLdmJkU1pqSHNDdkEiLAotICAgICJEbmNLanZiZHFUc2dScWtVIiwKLSAgICAiRG5iamp2YmRxQWlGQVhIZCIsCi0gICAgIkVQREtqdmJkR2NqdkphaWoiLAotICAgICJEbmJrS3ZiZHd0bGRweGtuIiwKLSAgICAiRG9ES2p2YmRZa3JFVG5NTiIsCi0gICAgIkVQQ2pqdmJkYkJXRWZRUVgiLAotICAgICJFUENqanZiZHVNWHdBdEJYIiwKLSAgICAiRG5jTEt2YmRic0NrVGNpYSIsCi0gICAgIkRvQ2pqdmJkY3pZcFlaUkMiLAotICAgICJFT2NLanZiZEZlaXFtaHNxIiwKLSAgICAiRG9Da0t2YmRLQ2ljUWlieCIsCi0gICAgIkVPY0tqdmJkWkxyRVVPTG0iLAotICAgICJEb0NqanZiZGFOS2JTdG1IIiwKLSAgICAiRG9ES2p2YmRKYmpEUWpEWSIsCi0gICAgIkVQQ2tLdmJkZW1Gd0dtS0wiLAotICAgICJFUERLanZiZFpRbGVJbUVxIiwKLSAgICAiRG5jS2p2YmRaalNoUGZiRyIsCi0gICAgIkRuYmpqdmJkcVluaEhSRVkiLAotICAgICJEb0NrS3ZiZGFSZkRJVUdMIiwKLSAgICAiRG9ES2p2YmRMcldseXVReiIsCi0gICAgIkRuYmpqdmJkWmlzSG9mYWYiLAotICAgICJFT2JqanZiZGh0eWR2clViIiwKLSAgICAiRG5iamp2YmRSb3RIS0dFWCIsCi0gICAgIkVPYmpqdmJkTmVFVGhoa0UiLAotICAgICJFUENqanZiZFp0SkpaRVNuIiwKLSAgICAiRG9ES2p2YmRuUHl4dkxZYiIsCi0gICAgIkVQREtqdmJkZUVvUmJXYmoiLAotICAgICJFT2NMS3ZiZEZ4dHRhRVhiIiwKLSAgICAiRU9iamp2YmRkd3lzdFJleiIsCi0gICAgIkVQQ2pqdmJkSnB6RW5lbkYiLAotICAgICJEbmJrS3ZiZFRwcG50dUlOIiwKLSAgICAiRVBDa0t2YmRUdWtwS1VCUiIsCi0gICAgIkRuYmtLdmJkaGxGRU9VY1oiLAotICAgICJFT2JrS3ZiZGxoZFVRdVJhIiwKLSAgICAiRG5iamp2YmRrQ2xLcUhVZyIsCi0gICAgIkVPY0tqdmJkcVR0R3Fxa1UiLAotICAgICJEbmNLanZiZHRrd3ZhVUJYIiwKLSAgICAiRG9ES2p2YmRzUVdPakN1ZiIsCi0gICAgIkRuY0xLdmJkRUtJSnV3akEiLAotICAgICJEbmNLanZiZEdMRXJjSU11IiwKLSAgICAiRU9jTEt2YmROUHdwdW1mcyIsCi0gICAgIkVPYmtLdmJkblZVekxKckciLAotICAgICJEb0NrS3ZiZGNUREtzZEtCIiwKLSAgICAiRG5jS2p2YmRLUlpkb0ZtZSIsCi0gICAgIkVPY0xLdmJkZW1GdmdOS0wiLAotICAgICJFUENrS3ZiZHpub3BkYmxZIiwKLSAgICAiRVBETEt2YmRPWVBWemRPVSIsCi0gICAgIkRuYmpqdmJkc1psUHNBaE8iLAotICAgICJEb0RMS3ZiZEtDakRSS0RZIiwKLSAgICAiRG9Da0t2YmRodVplWFNWQyIsCi0gICAgIkVQREtqdmJkT1N0VmdFdHAiLAotICAgICJEbmNMS3ZiZHZ3TUF2QldWIiwKLSAgICAiRVBES2p2YmRCY29hV0psZiIsCi0gICAgIkVPY0tqdmJkWnhkS09ETVMiLAotICAgICJEb0NqanZiZGJzQ2tUY2pCIiwKLSAgICAiRU9jTEt2YmR3V2xBdWFXViIsCi0gICAgIkRuYmpqdmJkRmVqUm5KVVIiLAotICAgICJEbmJqanZiZG1JZFRxVlNCIiwKLSAgICAiRG5ia0t2YmRxQkllQVdoRSIsCi0gICAgIkRuY0tqdmJkck16SnlNSUoiLAotICAgICJEb0NrS3ZiZFpHdmRBT3NKIiwKLSAgICAiRG5jTEt2YmRqZ2dMZkZuTCIsCi0gICAgIkRvQ2pqdmJkWXFORkpNZHEiLAotICAgICJEb0NrS3ZiZHFaUEhmcUR4IiwKLSAgICAiRG5jTEt2YmRPRWRUaGlMRSIsCi0gICAgIkRvQ2tLdmJkWmlyZ3BHYWYiLAotICAgICJFUERMS3ZiZHppdVFQZFN0IiwKLSAgICAiRU9ia0t2YmRLUXllT2VuRiIsCi0gICAgIkRvRExLdmJkdWFEeVNuZGgiLAotICAgICJEb0NqanZiZFZVTlVHTHZLIiwKLSAgICAiRG5jS2p2YmRBTWhZcnZ6WSIsCi0gICAgIkRuYmtLdmJkblFaeHZLeGIiLAotICAgICJFUENqanZiZEJoamFrSkZqIiwKLSAgICAiRG5jTEt2YmRtZmVZTk5meSIsCi0gICAgIkRvRExLdmJkamxiTHlkZm8iLAotICAgICJEb0RMS3ZiZHB5UElHcGN4IiwKLSAgICAiRU9jTEt2YmRuVlV6TEpxZiIsCi0gICAgIkRvQ2pqdmJkbUpFVHFWU0IiLAotICAgICJEb0RMS3ZiZEpUWkFzTXhNIiwKLSAgICAiRG9Da0t2YmRuUVp4dkxaQyIsCi0gICAgIkRvREtqdmJkQUNxd2l6SlEiLAotICAgICJEbmNLanZiZHZCRVpTb0ZJIiwKLSAgICAiRG5jS2p2YmRHY2tWakNKaiIsCi0gICAgIkRuY0xLdmJkaU1GRU50Y1oiLAotICAgICJEbmJqanZiZGp1dm1jYXd3IiwKLSAgICAiRG5ia0t2YmRaeUVLTmJsUyIsCi0gICAgIkRvQ2pqdmJkdU1ZWEJVQlgiLAotICAgICJEbmJqanZiZEZXWW9wTkplIiwKLSAgICAiRG9ES2p2YmRlbGZYR2xqTCIsCi0gICAgIkRuYmpqdmJkYWtMZW5tY0EiLAotICAgICJFUERLanZiZGZJTFdSbXBnIiwKLSAgICAiRU9iamp2YmRTTFlldUhMVCIsCi0gICAgIkRvQ2pqdmJkTWZib2xvdGsiLAotICAgICJFUERMS3ZiZHJSdUtuS2FOIiwKLSAgICAiRU9jS2p2YmR5emRuUmhJaCIsCi0gICAgIkRvRExLdmJkR0FvUlpKem0iLAotICAgICJEb0NqanZiZGhsRkRuVWNaIiwKLSAgICAiRVBETEt2YmRtcFp5VmtZYiIsCi0gICAgIkRuY0tqdmJkVHBxUFV1SU4iLAotICAgICJEbmNMS3ZiZEhEanZKYWlqIiwKLSAgICAiRVBETEt2YmRZbFJjc21rbSIsCi0gICAgIkVQRExLdmJkdmx2QU1kRk4iLAotICAgICJEbmNLanZiZElzWkFybVlNIiwKLSAgICAiRU9jTEt2YmRlZ2p1cW5RZyIsCi0gICAgIkVPY0xLdmJkWlFtRkpORlIiLAotICAgICJEb0NqanZiZFp4ZEptY01TIiwKLSAgICAiRVBDa0t2YmRsWlRTVFlnVSIsCi0gICAgIkRvREtqdmJkcWNlSlBuV0IiLAotICAgICJEbmNMS3ZiZFZnd3V4R3h6IiwKLSAgICAiRG5jS2p2YmREbmJrTFhERSIsCi0gICAgIkVQRExLdmJkYXRiSFlLc2giLAotICAgICJEbmNLanZiZEV6c3FGTGJpIiwKLSAgICAiRVBETEt2YmRuVlZaa0tSZiIsCi0gICAgIkVPY0tqdmJkS2VlZ2JCUXUiLAotICAgICJFUENrS3ZiZEtmR0hhYVJWIiwKLSAgICAiRVBES2p2YmRtSWN0UlZSYSIsCi0gICAgIkVQQ2pqdmJkUk14QnhuVXoiLAotICAgICJEbmJqanZiZEpZVGJJTHBwIiwKLSAgICAiRVBDa0t2YmRUQUVpSGJQRSIsCi0gICAgIkVPY0xLdmJkZmVsWm5HZ0EiLAotICAgICJEb0NqanZiZE9TdFdHZVVwIiwKLSAgICAiRU9jTEt2YmRlbUdYSE5KayIsCi0gICAgIkRvREtqdmJkWVRNQW1VT3giLAotICAgICJFUENrS3ZiZHB5T2hHcGN4IiwKLSAgICAiRVBDa0t2YmRBTWd4c1d6WSIsCi0gICAgIkRuYmpqdmJkWWtyRVRuTU4iLAotICAgICJFUERMS3ZiZFVRcVBVdGdtIiwKLSAgICAiRG5jS2p2YmRlaEt1ck5xSCIsCi0gICAgIkRvQ2pqdmJkWk1TRVRuTG0iLAotICAgICJEb0RLanZiZElIR3l5WHdnIiwKLSAgICAiRU9iamp2YmRYR1l6VUFQVCIsCi0gICAgIkRvQ2pqdmJkaGJQQ2VXcVIiLAotICAgICJEb0NrS3ZiZEtOQUR6R3VCIiwKLSAgICAiRG5iamp2YmRGZWlyT0pUcSIsCi0gICAgIkRuY0xLdmJkYVJlY0h0RmsiLAotICAgICJEbmJrS3ZiZHpvUHBlQ2xZIiwKLSAgICAiRU9ia0t2YmRaUk1lSk1lUiIsCi0gICAgIkRuYmpqdmJkWWZ2ZEFQU2kiLAotICAgICJEbmNMS3ZiZEpjS0NxSmNZIiwKLSAgICAiRU9jTEt2YmRxdm9rYmh5UiIsCi0gICAgIkRvRExLdmJkclJ1TE5qYU4iLAotICAgICJEb0NqanZiZFRsV1BCV09pIiwKLSAgICAiRG9Da0t2YmRqdlduRUJ4WCIsCi0gICAgIkRvRExLdmJkVGt1bmFWb0oiLAotICAgICJEb0NrS3ZiZFFaTkFIVFNLIiwKLSAgICAiRU9iamp2YmRxd1BrYmh5UiIsCi0gICAgIkVPY0xLdmJkTkhEUGxwVWsiLAotICAgICJEbmNMS3ZiZElISFp4eFlIIiwKLSAgICAiRG5jTEt2YmR0a3hYQXRBdyIsCi0gICAgIkRuY0xLdmJkU0NFRk1KWkwiLAotICAgICJEbmJqanZiZFpRbUVobGRxIiwKLSAgICAiRG9Damp2YmROR2JvbG90ayIsCi0gICAgIkRuYmpqdmJkbkNLV3dubXUiLAotICAgICJEbmNMS3ZiZHpIWk1BTkV3IiwKLSAgICAiRG9ES2p2YmRtdHR5a0pyRyIsCi0gICAgIkRuYmtLdmJkbHJaVXpTY2kiLAotICAgICJFUERLanZiZFNLeUdWSEtzIiwKLSAgICAiRG9Damp2YmRLVnVHRUZHaSIsCi0gICAgIkVQQ2pqdmJkQ0lrQmtJZWoiLAotICAgICJEbmNMS3ZiZHpIWk1BTWVYIiwKLSAgICAiRG5ia0t2YmRhU0ZiZ3NlayIsCi0gICAgIkRuY0xLdmJkSERqdWpCaWoiLAotICAgICJEb0RLanZiZEdaVlVhRHdiIiwKLSAgICAiRG5iamp2YmRabm5KRkV6SyIsCi0gICAgIkRvQ2tLdmJkdGNEVXdXT28iLAotICAgICJEb0NrS3ZiZGxCTW9OQUxBIiwKLSAgICAiRU9jS2p2YmROc1VXSEZVcCIsCi0gICAgIkRvRExLdmJkVlVOVUZsVmoiLAotICAgICJEbmJrS3ZiZGhrZGNuVWNaIiwKLSAgICAiRG5jTEt2YmRMaUJrcVlBUyIsCi0gICAgIkVPY0tqdmJkem9QcGRjTHgiLAotICAgICJFUERLanZiZGlqR0lKbVhyIiwKLSAgICAiRU9jS2p2YmRaaXNIb2ZhZiIsCi0gICAgIkRvRExLdmJkZU9kcmtVVVMiLAotICAgICJEb0RMS3ZiZG5QeXh2S3hiIiwKLSAgICAiRVBES2p2YmRJeFVCaE1SUSIsCi0gICAgIkRuY0xLdmJkbGhjdFJVcWEiLAotICAgICJEb0RMS3ZiZG1nRlhsbkd5IiwKLSAgICAiRG5jS2p2YmRDSktiS2lHSyIsCi0gICAgIkVPY0xLdmJkZG5kcmp0VVMiLAotICAgICJEbmJqanZiZGtETGpxR3VIIiwKLSAgICAiRG5jS2p2YmRtSWNzcHRxYSIsCi0gICAgIkRvQ2tLdmJkdnZsQXZCV1YiLAotICAgICJFT2JqanZiZGpibExRZnRnIiwKLSAgICAiRG5iamp2YmRDRVFCV0tNZiIsCi0gICAgIkRuYmpqdmJkQmRQYVZpbGYiLAotICAgICJEb0NrS3ZiZFp4Y2pPRExyIiwKLSAgICAiRG9Da0t2YmRFT2JqandDZCIsCi0gICAgIkVQREtqdmJkeVROaGxxYkgiLAotICAgICJFUENrS3ZiZFVNVm9BdlBKIiwKLSAgICAiRG5jS2p2YmRVeGhVWmpvTyIsCi0gICAgIkRuY0tqdmJkcXF0am1rQW0iLAotICAgICJEbmNLanZiZEtmR0lDQlJWIiwKLSAgICAiRVBDamp2YmRWck9YYWVMYyIsCi0gICAgIkVQRExLdmJkd1hMYVdCV1YiLAotICAgICJFUENrS3ZiZGpibEtxSFVnIiwKLSAgICAiRG5iamp2YmR1REN1V3VvUCIsCi0gICAgIkVQREtqdmJkTkdicE1vdUwiLAotICAgICJFT2JqanZiZEJjb2FWak5HIiwKLSAgICAiRG5jTEt2YmRyV3BNREl4cSIsCi0gICAgIkRuY0xLdmJkaGFvQ2R3UlIiLAotICAgICJEbmJrS3ZiZEZ4dHVCRHdiIiwKLSAgICAiRG5jS2p2YmRJakVBS1BnRSIsCi0gICAgIkVPY0xLdmJkdUNidVhWb1AiLAotICAgICJEb0RLanZiZFp0SWlaRHNPIiwKLSAgICAiRG5iamp2YmRFenRSRWxDaSIsCi0gICAgIkRuY0xLdmJkeG1zSHdzSkQiLAotICAgICJEbmJqanZiZFJiRUVsSXhrIiwKLSAgICAiRG9ES2p2YmRXSHd2WGdZeiIsCi0gICAgIkVPY0tqdmJkUWx3YlluVXoiLAotICAgICJFT2NMS3ZiZFZUbHRGa3VqIiwKLSAgICAiRG5jS2p2YmRsaUVUcHRxYSIsCi0gICAgIkRuYmtLdmJkZG9Fcmp0VHIiLAotICAgICJEb0NrS3ZiZGdQYXp2ZFhoIiwKLSAgICAiRG5jS2p2YmR5U21obHFhZyIsCi0gICAgIkRvQ2pqdmJkYlBnSERremQiLAotICAgICJEb0NrS3ZiZEZXWlBvbUtGIiwKLSAgICAiRU9iamp2YmRzc1NTeHlkYyIsCi0gICAgIkVPYmpqdmJkelFubGlKd0EiLAotICAgICJFT2JrS3ZiZEtDakNwaWJ4IiwKLSAgICAiRVBDamp2YmRweU9oSFJFWSIsCi0gICAgIkRuY0xLdmJkZGpKcXV0em4iLAotICAgICJFT2JrS3ZiZEJkUUF1ak1mIiwKLSAgICAiRVBDa0t2YmRMQWpmbGJYcSIsCi0gICAgIkRuY0xLdmJkTEJMR2xheFIiLAotICAgICJEb0RMS3ZiZHJwV1BKYnVmIiwKLSAgICAiRG9Damp2YmRFS0hpdXhLQSIsCi0gICAgIkRvQ2pqdmJkWHNNQWxzbngiLAotICAgICJFT2JrS3ZiZHB0VGdTU0xVIiwKLSAgICAiRG9ES2p2YmRuSEZYbU5meSIsCi0gICAgIkRuY0tqdmJkQ0pLYktoZWoiLAotICAgICJFUENqanZiZGhsRWRPVWJ5IiwKLSAgICAiRU9jS2p2YmRLV1VmRUZHaSIsCi0gICAgIkRvREtqdmJkWlFtRkpNZHEiLAotICAgICJFUENqanZiZGlHakRaV0tWIiwKLSAgICAiRU9ia0t2YmRWQWJRcnByWiIsCi0gICAgIkRvREtqdmJkZmVrek5nSEEiLAotICAgICJEb0RMS3ZiZG5IRXdsbWdaIiwKLSAgICAiRG5jS2p2YmR3ekhlZXhFciIsCi0gICAgIkRvQ2pqdmJkbXBaeHVqeUMiLAotICAgICJFUERLanZiZHdNdkFNY2RtIiwKLSAgICAiRG9Damp2YmRmSGtWck5xSCIsCi0gICAgIkVQQ2tLdmJkWXpiZlJpdXkiLAotICAgICJFUENrS3ZiZFp0SWlaRHJuIiwKLSAgICAiRG5iamp2YmRqdlduRGJZWCIsCi0gICAgIkRvQ2pqdmJkT1N0VmdFdHAiLAotICAgICJFUERMS3ZiZFpNU0VUbWxOIiwKLSAgICAiRVBES2p2YmRCaGphamhlaiIsCi0gICAgIkVQQ2pqdmJkZG9GVExVVVMiLAotICAgICJEbmJrS3ZiZHNRVm9KY1dHIiwKLSAgICAiRVBDamp2YmRyRUZKUU52QiIsCi0gICAgIkRvQ2pqdmJkTXBZUldPR3MiLAotICAgICJFT2NMS3ZiZFppcmdwSEJmIiwKLSAgICAiRVBETEt2YmR5T1RJWHNKRCIsCi0gICAgIkRvQ2tLdmJkS1JaZG5mTmUiLAotICAgICJEbmJqanZiZGJCV0ZGb293IiwKLSAgICAiRVBDamp2YmRnRmxabkhIQSIsCi0gICAgIkRuYmtLdmJkR0dKck9Jc3EiLAotICAgICJEb0RMS3ZiZHVEQ3R3V1BQIiwKLSAgICAiRU9iamp2YmROZGRVSWhqZCIsCi0gICAgIkRuYmpqdmJkeHNOaU1xYWciLAotICAgICJFT2JqanZiZGRlT3JDV2JqIiwKLSAgICAiRU9iamp2YmRQeG1BR3NSaiIsCi0gICAgIkVPY0xLdmJkZGVPckNYREsiLAotICAgICJEb0RMS3ZiZGRlT3JCd0NqIiwKLSAgICAiRG9Damp2YmRWcW5ZQ0VsRCIsCi0gICAgIkRuYmtLdmJkVXlJVVpqb08iLAotICAgICJFT2JqanZiZGVGT3JDWERLIiwKLSAgICAiRU9ia0t2YmRWck54Q0ZMYyIsCi0gICAgIkVPYmpqdmJkVGZ6bWt3V0YiLAotICAgICJFT2NLanZiZElIR3paWVlIIiwKLSAgICAiRVBES2p2YmR0YmJ1WFdQUCIsCi0gICAgIkRvQ2pqdmJkWmlzSVFIQmYiLAotICAgICJFT2JqanZiZGJzQ2tVRGpCIiwKLSAgICAiRVBDa0t2YmRWd0pYdWRGSCIsCi0gICAgIkVQREtqdmJkcm91b0tEVmYiLAotICAgICJFUENrS3ZiZEZ5VlZCRVlDIiwKLSAgICAiRG5jTEt2YmRabm5JZUV6SyIsCi0gICAgIkVQRExLdmJkeFZORlF4a24iLAotICAgICJEb0RLanZiZHB4bmdnUkR4IiwKLSAgICAiRG9ETEt2YmRxWk9nZnBjeCIsCi0gICAgIkRuY0tqdmJkQ0lqYWtKR0siLAotICAgICJFUENrS3ZiZENKTEJqaGVqIiwKLSAgICAiRG9ETEt2YmRuUHpZdkt4YiIsCi0gICAgIkVPY0tqdmJkcVRzZ1NSa1UiLAotICAgICJFT2NMS3ZiZExCTEdsYXhSIiwKLSAgICAiRG9ETEt2YmRjYlRNckFVTiIsCi0gICAgIkRuY0xLdmJkeml0b29kU3QiLAotICAgICJEb0RLanZiZEp2VWZEZGZpIiwKLSAgICAiRU9jTEt2YmRIRGp2S0NKaiIsCi0gICAgIkVQQ2tLdmJkZU9lVEtzc3IiLAotICAgICJEbmJrS3ZiZGxZcnFzWWZ0IiwKLSAgICAiRG5jTEt2YmRpaWVoS014UyIsCi0gICAgIkRuY0tqdmJkVVJRb1ZVaE4iLAotICAgICJEbmJrS3ZiZHVNWVhCVUF3IiwKLSAgICAiRG9ETEt2YmRTUHRISmZFWCIsCi0gICAgIkVPYmtLdmJkcUJKRkFXZ2QiLAotICAgICJFT2NLanZiZEZwQVRXZ0Z5IiwKLSAgICAiRG9ETEt2YmRCc0JEVGZYUyIsCi0gICAgIkRuY0tqdmJkamhITGZGbWsiLAotICAgICJEb0NqanZiZENKS2FrSWZLIiwKLSAgICAiRG5ia0t2YmRkb0ZTanRUciIsCi0gICAgIkVPYmtLdmJkQU5JWXNXelkiLAotICAgICJFT2JqanZiZENUQWJ0RnZyIiwKLSAgICAiRU9iamp2YmRyUnRrT0xBbSIsCi0gICAgIkRuYmtLdmJka3hzU1RZZ1UiLAotICAgICJEb0NqanZiZG5CaXdYbm11IiwKLSAgICAiRU9iamp2YmR3dG1FcVlsTyIsCi0gICAgIkVQREtqdmJkcnlsUVRBaE8iLAotICAgICJEb0RMS3ZiZHRiYnR2dk9vIiwKLSAgICAiRVBDamp2YmRaTHJFVG1sTiIsCi0gICAgIkVQRExLdmJkV1hKWVdEZGciLAotICAgICJEb0NrS3ZiZEtRekZPZk9GIiwKLSAgICAiRVBDamp2YmR3eklGZlhlUyIsCi0gICAgIkRuY0tqdmJkUmp5RnVITFQiLAotICAgICJFUERMS3ZiZFVMdW5hV1BKIiwKLSAgICAiRG5jS2p2YmRVeGhUeWtPbiIsCi0gICAgIkRuYmtLdmJkSmNLQ3FLRFkiLAotICAgICJFUERMS3ZiZGNiU21TQVRtIiwKLSAgICAiRG5ia0t2YmRlZ2p1ck5xSCIsCi0gICAgIkVQREtqdmJkWmpUSVFHYkciLAotICAgICJFUENqanZiZGlMZGROdUN5IiwKLSAgICAiRG9Damp2YmRaUWxkaU5FcSIsCi0gICAgIkVPY0xLdmJkYWtNR1BPREEiLAotICAgICJFT2JqanZiZG5IRXdsbWdaIiwKLSAgICAiRU9jTEt2YmRCc0FjVUdYUyIsCi0gICAgIkVQQ2tLdmJkaVZaZHdTVWIiLAotICAgICJFT2NMS3ZiZGRDVE5TQVVOIiwKLSAgICAiRG5ia0t2YmRFWHhNVVVVTSIsCi0gICAgIkRuY0tqdmJkWXBsZGlNZVIiLAotICAgICJEb0RLanZiZE5kZFRpSWpkIiwKLSAgICAiRG9ETEt2YmRaTHFkVU5sTiIsCi0gICAgIkVQQ2tLdmJkaUJuY0ZXcHEiLAotICAgICJEbmNMS3ZiZGlDUERFdnFSIiwKLSAgICAiRU9jS2p2YmRVeUhzektvTyIsCi0gICAgIkRuY0tqdmJkaHR5ZHZxdGIiLAotICAgICJFUENqanZiZHB4b0hnUWN4IiwKLSAgICAiRU9ia0t2YmRrV1duRGF4WCIsCi0gICAgIkRuYmpqdmJkQmhrQmtKRmoiLAotICAgICJEb0NrS3ZiZFJhY2RraHlMIiwKLSAgICAiRU9jTEt2YmRaalRIcEhDRyIsCi0gICAgIkVQQ2tLdmJkTW93cVdPR3MiLAotICAgICJEbmNMS3ZiZGVnanVyTnBnIiwKLSAgICAiRU9iamp2YmRmTWZXZm1LTCIsCi0gICAgIkVQRExLdmJkWmlyZ3BHYWYiLAotICAgICJEb0RMS3ZiZGladUZsUW5HIiwKLSAgICAiRG5jTEt2YmRGeHVWQWN4QyIsCi0gICAgIkVPYmtLdmJkWmlzSG9mYWYiLAotICAgICJFT2NLanZiZEpTeUJTbVlNIiwKLSAgICAiRVBETEt2YmRWWWd0WmtQTyIsCi0gICAgIkVPY0tqdmJkUmJFRk1KWWsiLAotICAgICJEbmNMS3ZiZHJFRklvbldCIiwKLSAgICAiRG5jS2p2YmRLREpicUpjWSIsCi0gICAgIkVPY0xLdmJkaGZqQ3h1aXUiLAotICAgICJFT2JqanZiZExMQWhXQUtaIiwKLSAgICAiRG9Da0t2YmRSWE5jYmxJRCIsCi0gICAgIkRvRExLdmJkY2JTbVNBVG0iLAotICAgICJFT2NMS3ZiZHdXbEF2QXV1IiwKLSAgICAiRU9ia0t2YmRpQm5iZHZwcSIsCi0gICAgIkRvQ2tLdmJkTlFYcHVtZ1QiLAotICAgICJEbmNMS3ZiZGtWd09FQ1lYIiwKLSAgICAiRG5ia0t2YmRmb2F6d0R4SSIsCi0gICAgIkRvRExLdmJkYkJXRkZwUHciLAotICAgICJEb0RMS3ZiZHZCRHhzUEVoIiwKLSAgICAiRVBES2p2YmRKcVpkb0ZtZSIsCi0gICAgIkRvRExLdmJkSXJ5QXJtWGwiLAotICAgICJFUENqanZiZEFOSVpTd1p4IiwKLSAgICAiRVBDa0t2YmRWaFlWeEd4eiIsCi0gICAgIkRuY0tqdmJkTEFqZ05DWVIiLAotICAgICJEbmNLanZiZHh4SWpDUVprIiwKLSAgICAiRG5jS2p2YmRiaU5LS2V3WSIsCi0gICAgIkVQQ2pqdmJkbHJaVlpzRUoiLAotICAgICJFUERLanZiZElyeUFzTXdsIiwKLSAgICAiRG9Da0t2YmR0QUhSSUFBciIsCi0gICAgIkVQREtqdmJkSm1BRVpmdUIiLAotICAgICJFUENrS3ZiZFpqU2dvZ0JmIiwKLSAgICAiRG9ETEt2YmRPWG51emNuVSIsCi0gICAgIkRuYmtLdmJkZWhLdlJuUWciLAotICAgICJFT2JqanZiZFp5RGltYmtyIiwKLSAgICAiRG9ES2p2YmRtYWpXd29PViIsCi0gICAgIkVPY0tqdmJka01hbFplSFAiLAotICAgICJFT2NLanZiZElqRUFKcEhFIiwKLSAgICAiRVBDa0t2YmREaWhLVnhLQSIsCi0gICAgIkRuY0tqdmJkTmRkVUlpS2QiLAotICAgICJFT2JqanZiZHFkRklwT1dCIiwKLSAgICAiRG9Da0t2YmR4blNoWHNKRCIsCi0gICAgIkRvRExLdmJkam1Ca3pFZm8iLAotICAgICJFT2NMS3ZiZGF0YWdZTFRoIiwKLSAgICAiRG9Damp2YmRWaFlWeEhZeiIsCi0gICAgIkRuYmpqdmJkSmJqRFJLRFkiLAotICAgICJFUENqanZiZExCTEhOQ1lSIiwKLSAgICAiRG5iamp2YmRuR2VZTk9HeSIsCi0gICAgIkVPY0xLdmJkVXNtVGVrdksiLAotICAgICJFUENqanZiZHRreFhCVGFYIiwKLSAgICAiRVBDamp2YmR6b1BxRkNreCIsCi0gICAgIkRuY0tqdmJkQ0lqYktoZWoiLAotICAgICJEbmNLanZiZFpMcWRUbWttIiwKLSAgICAiRG9ES2p2YmRzUHVuaWNWZiIsCi0gICAgIkVPY0tqdmJkbWdGWG1OZ1oiLAotICAgICJFT2JrS3ZiZGlNRkVOdUN5IiwKLSAgICAiRG9ES2p2YmRoYW5iZVhSUiIsCi0gICAgIkVPYmtLdmJkQUNxd2l5aHAiLAotICAgICJEbmNLanZiZFppc0lRSEJmIiwKLSAgICAiRVBDamp2YmRnUUJ6d0R3aCIsCi0gICAgIkRuYmpqdmJkeVlKSmFveWsiLAotICAgICJEb0RLanZiZHhVbGRxWk1PIiwKLSAgICAiRU9ia0t2YmRrQ2xMUWdWSCIsCi0gICAgIkVQQ2pqdmJkWlFsZGlNZVIiLAotICAgICJFUERMS3ZiZFp5RUtPQ2xTIiwKLSAgICAiRVBETEt2YmRjSWxpa0Z2eCIsCi0gICAgIkRvREtqdmJkcnpNUVRCSG4iLAotICAgICJEbmJqanZiZFZZZ3Raa1BPIiwKLSAgICAiRG9ETEt2YmRIRUt1aWFqSyIsCi0gICAgIkVQQ2tLdmJkY3paUVh4cUMiLAotICAgICJEb0RLanZiZHJEZGlRTnVhIiwKLSAgICAiRG5jTEt2YmRjSW1LTEdXeCIsCi0gICAgIkRvQ2pqdmJkVllndFprUE8iLAotICAgICJFUERMS3ZiZFpubkllRlpqIiwKLSAgICAiRVBES2p2YmRNSWFrcVlBUyIsCi0gICAgIkRvQ2tLdmJkU0xZZlVnTFQiLAotICAgICJFUERMS3ZiZGlDT2JkdnBxIiwKLSAgICAiRG5iamp2YmRScFVIS0ZjdyIsCi0gICAgIkRvRExLdmJkSUhIWnlZWGciLAotICAgICJFUENqanZiZHlwb01oaXdBIiwKLSAgICAiRG5ia0t2YmRDRVBhVmpNZiIsCi0gICAgIkRuYmtLdmJkZXJBdnpsRFAiLAotICAgICJEbmJrS3ZiZFpRbGVJbUZSIiwKLSAgICAiRU9jS2p2YmRLUlpkbmVtZSIsCi0gICAgIkRvRExLdmJkaUJuYmVYUXEiLAotICAgICJEbmNMS3ZiZEVQREtqdmNFIiwKLSAgICAiRU9jTEt2YmRhdUNHd2tUaCIsCi0gICAgIkRuY0xLdmJkRXZaUVBtSmUiLAotICAgICJFUENrS3ZiZFVSUW51VklOIiwKLSAgICAiRG5jTEt2YmRlZ2p2U09RZyIsCi0gICAgIkVQQ2pqdmJkS2FLZ01hd3EiLAotICAgICJEbmJrS3ZiZFJ6S0lTYnZBIiwKLSAgICAiRG5jTEt2YmRpTGRjblVjWiIsCi0gICAgIkVQRExLdmJka0RNS3BmdUgiLAotICAgICJEb0RMS3ZiZFJiRGRraHlMIiwKLSAgICAiRG5iamp2YmREd3hNVVVUbCIsCi0gICAgIkRuYmtLdmJkcnBXUEtDdWYiLAotICAgICJEbmJrS3ZiZE5WU3FqbUFYIiwKLSAgICAiRG9ES2p2YmRSYkRlTUl4ayIsCi0gICAgIkVPY0xLdmJkY3l4cFh5UkMiLAotICAgICJEbmNMS3ZiZFJNd2JZblV6IiwKLSAgICAiRU9iamp2YmRxbHpKeGxIaSIsCi0gICAgIkRvQ2tLdmJkSllVQ0lNUXAiLAotICAgICJEbmNMS3ZiZExaUWpTenVHIiwKLSAgICAiRU9jS2p2YmR4Vk5FcVlrbiIsCi0gICAgIkRuYmtLdmJkWm9PSWVGWmoiLAotICAgICJEb0NqanZiZEJyYUN0RndTIiwKLSAgICAiRU9jTEt2YmRsaURzcVZTQiIsCi0gICAgIkVQQ2tLdmJkZUFUcU5YaWYiLAotICAgICJEbmNMS3ZiZGtNYkx5ZGdQIiwKLSAgICAiRU9iamp2YmRaeGRKbWJrciIsCi0gICAgIkRvQ2pqdmJkcmFlbGxITFoiLAotICAgICJFT2JrS3ZiZHVEQ3VXdlBQIiwKLSAgICAiRG9Da0t2YmRwc3RHclNMVSIsCi0gICAgIkRvQ2pqdmJkTEdGZ2JCUXUiLAotICAgICJEbmJrS3ZiZGh0ekZXcXVDIiwKLSAgICAiRU9iamp2YmRvQUt6dEhkTyIsCi0gICAgIkVQRExLdmJkYXRhZnhLdEkiLAotICAgICJFUERLanZiZGtXWE5jYXd3IiwKLSAgICAiRG9Da0t2YmR3a1hFSHp6RyIsCi0gICAgIkVPYmtLdmJkbWdFd21OZ1oiLAotICAgICJEbmNLanZiZEJpTENMSkZqIiwKLSAgICAiRG9Damp2YmRlT2RzS3NzciIsCi0gICAgIkVPY0xLdmJkZklMV1NPUkgiLAotICAgICJFT2JrS3ZiZENEcEF1ak1mIiwKLSAgICAiRVBES2p2YmRLREtEUWlieCIsCi0gICAgIkRvREtqdmJkVlVNdEdMdWoiLAotICAgICJFT2JrS3ZiZHJYUU1DaVlxIiwKLSAgICAiRG5jS2p2YmRlUEVzTFR0UyIsCi0gICAgIkRuY0xLdmJkRHhZTHRVVGwiLAotICAgICJFUENrS3ZiZEdZdVZCRVlDIiwKLSAgICAiRG5jTEt2YmROZUVVSWlLZCIsCi0gICAgIkVQQ2tLdmJkcHhvSUhSRHgiLAotICAgICJFT2JqanZiZEZrRXNESGx1IiwKLSAgICAiRU9iamp2YmRzc1NTeHpGRCIsCi0gICAgIkRvQ2tLdmJkVXROVGZNVmoiLAotICAgICJEbmJqanZiZEpjS0RSS0RZIiwKLSAgICAiRG5jS2p2YmRxaUFLRW1PZSIsCi0gICAgIkRvREtqdmJkdGxYd0F0QlgiLAotICAgICJEbmJrS3ZiZHhtc0lZVEljIiwKLSAgICAiRU9ia0t2YmRMclhNelVweiIsCi0gICAgIkRvQ2pqdmJka3hzU1N4ZnQiLAotICAgICJEbmNLanZiZFFsd2F4blV6IiwKLSAgICAiRU9ia0t2YmRqaEdsRmZOayIsCi0gICAgIkVQQ2tLdmJkeHNOaG1SYWciLAotICAgICJEb0RMS3ZiZE1mY1BtUVVrIiwKLSAgICAiRG9ES2p2YmRRdm5FRExoRCIsCi0gICAgIkVPYmpqdmJkVmd4VnhIWXoiLAotICAgICJEb0RMS3ZiZGxyWXR5cmRKIiwKLSAgICAiRG9Damp2YmRlenZZZUlzdyIsCi0gICAgIkRuY0xLdmJkTmRkVGlJamQiLAotICAgICJFUERMS3ZiZEdHSnJOaVVSIiwKLSAgICAiRVBETEt2YmRSekpoVERXQSIsCi0gICAgIkVQQ2pqdmJkdnZrYVdCVnUiLAotICAgICJFT2NLanZiZFJYTmRDa2djIiwKLSAgICAiRU9jS2p2YmRRWk5BSFRTSyIsCi0gICAgIkVQQ2tLdmJkc0NHTkxma1oiLAotICAgICJFT2NMS3ZiZER3d2t0VHNsIiwKLSAgICAiRU9jTEt2YmRxbHpKeUxnaSIsCi0gICAgIkVPY0xLdmJkeHNOaU1xYWciLAotICAgICJFT2NMS3ZiZGh6VkZsUk9HIiwKLSAgICAiRU9jS2p2YmRFenRSRk1DaSIsCi0gICAgIkRuYmtLdmJkcWlBSmRtUEYiLAotICAgICJFUERMS3ZiZGpjTUtxR3RnIiwKLSAgICAiRU9ia0t2YmRUbFdPYVdPaSIsCi0gICAgIkVQRExLdmJkVVJSUFV1SG0iLAotICAgICJEb0RLanZiZGVsZldnTktMIiwKLSAgICAiRU9jTEt2YmRHQW5xWkp6bSIsCi0gICAgIkVPYmpqdmJkR1pVdUFkWGIiLAotICAgICJEb0RMS3ZiZHVMd3dBdEF3IiwKLSAgICAiRG9Damp2YmRaalRJUUdiRyIsCi0gICAgIkVQQ2pqdmJkUk5YYlluVXoiLAotICAgICJFUERMS3ZiZGlMZUVOdGJ5IiwKLSAgICAiRU9iamp2YmRNb3dwdW5HcyIsCi0gICAgIkVPY0tqdmJkYmlOSmpldngiLAotICAgICJEb0RLanZiZEVZWUxzdFRsIiwKLSAgICAiRG9ETEt2YmRxVVRmclJqdCIsCi0gICAgIkRvREtqdmJkYnNDa1VFSmEiLAotICAgICJEb0RLanZiZFhzTUJOVVBZIiwKLSAgICAiRVBDamp2YmRSTlhheG5VeiIsCi0gICAgIkRvRExLdmJkTkdjUU5RVWsiLAotICAgICJEbmJqanZiZEVBUmlNeXdYIiwKLSAgICAiRVBES2p2YmRTS3hmVWZrVCIsCi0gICAgIkRuY0tqdmJkaHR5ZVhSdGIiLAotICAgICJEbmNLanZiZFpMcWNzbkxtIiwKLSAgICAiRU9ia0t2YmRabm1oZUV6SyIsCi0gICAgIkVPYmpqdmJkdGJjVXZ1bm8iLAotICAgICJEbmJqanZiZHJ6TVFUQkhuIiwKLSAgICAiRG5iamp2YmREd3drdFRzbCIsCi0gICAgIkVQREtqdmJka3hzU1RZZ1UiLAotICAgICJEb0RLanZiZElyeUFybHhNIiwKLSAgICAiRG9ES2p2YmRuQml2eE9uViIsCi0gICAgIkRvREtqdmJkZUFUcGx3aWYiLAotICAgICJFT2NMS3ZiZEtlZWdiQXB1IiwKLSAgICAiRVBDamp2YmRNZ0RRTW90ayIsCi0gICAgIkRvQ2pqdmJkdUNidHdXT28iLAotICAgICJEbmJrS3ZiZHlOc0h3cmhjIiwKLSAgICAiRG5ia0t2YmR0dk54SnBzQSIsCi0gICAgIkVPY0xLdmJkcUFoZUFXZ2QiLAotICAgICJEb0NrS3ZiZFVSUW9VdGdtIiwKLSAgICAiRU9jS2p2YmRxY2VJcE9XQiIsCi0gICAgIkRvQ2tLdmJkVndJd3VkRkgiLAotICAgICJEbmJrS3ZiZGJMTUZubWNBIiwKLSAgICAiRU9jTEt2YmRaalRIcEhCZiIsCi0gICAgIkVPY0tqdmJkUlhOZENraEQiLAotICAgICJFUERMS3ZiZGlISmNaVml1IiwKLSAgICAiRG9Damp2YmR4eElqQ1B6TCIsCi0gICAgIkRuYmtLdmJkQmNwQldKbUciLAotICAgICJFUENrS3ZiZFp5RUtPQ2tyIiwKLSAgICAiRVBES2p2YmRPVFVXSEZWUSIsCi0gICAgIkRvQ2pqdmJkSUdnWnh3d2ciLAotICAgICJFUERMS3ZiZEZqZVNiaE11IiwKLSAgICAiRVBETEt2YmRoZ0tDeHZKdSIsCi0gICAgIkVPY0xLdmJkTnNVV0dkdHAiLAotICAgICJFUERLanZiZHVWblhpcHNBIiwKLSAgICAiRG5jTEt2YmRHWXVWQkVYYiIsCi0gICAgIkVQRExLdmJkWnRJaHlFU24iLAotICAgICJEb0RLanZiZFp4ZEptY0xyIiwKLSAgICAiRG9Damp2YmRVc2x0R0x1aiIsCi0gICAgIkRvREtqdmJkRG9ETEt2YmQiLAotICAgICJEbmNMS3ZiZHJEZGhwTnZCIiwKLSAgICAiRVBETEt2YmRLQ2pEUkpieCIsCi0gICAgIkRvRExLdmJkeExXZEh6eWYiLAotICAgICJFT2JrS3ZiZHJ6TVFUQWhPIiwKLSAgICAiRU9jTEt2YmRPRkR0SkpLZCIsCi0gICAgIkVQQ2tLdmJkclNWS21qYU4iLAotICAgICJFT2NLanZiZFdXaVlWZEVnIiwKLSAgICAiRU9jS2p2YmRXV2h3dkRkZyIsCi0gICAgIkRuY0tqdmJkcHN0SFJxanQiLAotICAgICJFUENrS3ZiZEtXVkZjZUdpIiwKLSAgICAiRG9Da0t2YmRaalNoUGZiRyIsCi0gICAgIkRvQ2tLdmJkU3hLbE56a1kiLAotICAgICJFUERMS3ZiZEl3dENIa3FRIiwKLSAgICAiRU9jS2p2YmRzQ0dOTGdMWiIsCi0gICAgIkRuY0tqdmJkemFBT2ZnQ00iLAotICAgICJEb0RMS3ZiZHhtcmhZU2lEIiwKLSAgICAiRG5jTEt2YmRmTWZXZ01qTCIsCi0gICAgIkVQREtqdmJkcUZkRXN1YUkiLAotICAgICJFT2NMS3ZiZGlMZURuVWNaIiwKLSAgICAiRG9Damp2YmRLVnVGY2VISiIsCi0gICAgIkRvQ2pqdmJkZmVrek5nSEEiLAotICAgICJFT2NLanZiZE9GRVRoaUxFIiwKLSAgICAiRVBETEt2YmRxY2VKUG5XQiIsCi0gICAgIkRvRExLdmJkdUNidHdXT28iLAotICAgICJEbmNLanZiZFRxUk90dUlOIiwKLSAgICAiRG5jS2p2YmRwZWRGVVdCSSIsCi0gICAgIkRvRExLdmJkckVGSlFOdWEiLAotICAgICJEb0RMS3ZiZHlYaGpDUHlrIiwKLSAgICAiRVBDa0t2YmRKWVVCaExxUSIsCi0gICAgIkVQQ2tLdmJkdGNDdVhWbm8iLAotICAgICJEb0RMS3ZiZFpMckVVT0xtIiwKLSAgICAiRVBDa0t2YmRwc3RHclJqdCIsCi0gICAgIkRuY0xLdmJkZGVQU0NYQ2oiLAotICAgICJFT2JrS3ZiZGF1Q0hYanNoIiwKLSAgICAiRG9ETEt2YmRrSGZrZWZOayIsCi0gICAgIkVPYmpqdmJkTVJ3TXpVcHoiLAotICAgICJFT2JqanZiZGFNa0NUVk5IIiwKLSAgICAiRG9Da0t2YmRHR0pyTmh0UiIsCi0gICAgIkVQRExLdmJkdkJEeHJuZUkiLAotICAgICJFUERMS3ZiZElISFp4d3hIIiwKLSAgICAiRU9jTEt2YmRySkFKZG1QRiIsCi0gICAgIkVPY0tqdmJkR1pVdUFkWGIiLAotICAgICJFT2NMS3ZiZGJVYkhZTFVJIiwKLSAgICAiRG5iamp2YmRKem9mWUVBTiIsCi0gICAgIkVQREtqdmJkRnh0dUJEeEMiLAotICAgICJEbmJrS3ZiZFF2bkRia2djIiwKLSAgICAiRVBES2p2YmRKbUFEekd0YSIsCi0gICAgIkRvREtqdmJkWlJNZGhsZVIiLAotICAgICJEbmJrS3ZiZHNycXNaWmVEIiwKLSAgICAiRU9ia0t2YmRyb3ZQSmJ1ZiIsCi0gICAgIkVQQ2pqdmJkZGVPcWJYQ2oiLAotICAgICJFT2JqanZiZHRjRFZYVm9QIiwKLSAgICAiRG5jS2p2YmRNZmJwTlFWTCIsCi0gICAgIkRvQ2tLdmJkaGJQQ2VYUXEiLAotICAgICJEb0NrS3ZiZE5IQ29tUVZMIiwKLSAgICAiRU9iamp2YmR2QkR4cm9GSSIsCi0gICAgIkVQQ2pqdmJkbkJpdndvTnUiLAotICAgICJFT2JqanZiZGJobGpLZXdZIiwKLSAgICAiRVBES2p2YmRaeURpbWNNUyIsCi0gICAgIkVPYmtLdmJkV1NPWGJFbEQiLAotICAgICJFT2NLanZiZFRmem5NWFZlIiwKLSAgICAiRVBDamp2YmRadEpKWWNzTyIsCi0gICAgIkRvQ2pqdmJkUmp4ZlZITFQiLAotICAgICJEb0NrS3ZiZFZUbHRHTVZqIiwKLSAgICAiRG5jS2p2YmRZZndFQU9yaSIsCi0gICAgIkRuY0tqdmJkWWtyRVVPTU4iLAotICAgICJFT2JrS3ZiZHFHRUVzdWFJIiwKLSAgICAiRG5jTEt2YmRqSmZIaW1YciIsCi0gICAgIkVQRExLdmJkZG5kc0xVVHIiLAotICAgICJEbmJrS3ZiZHFCSkZBV2hFIiwKLSAgICAiRVBETEt2YmRFT2NLandERSIsCi0gICAgIkVQQ2tLdmJkdHZPWUpxVEEiLAotICAgICJEbmNMS3ZiZGt5VFJzWkhVIiwKLSAgICAiRG9Damp2YmRUcHBudVZJTiIsCi0gICAgIkRuY0xLdmJkd3loRmV3ZVMiLAotICAgICJEbmNLanZiZHNCZWxrZ0t5IiwKLSAgICAiRG9Damp2YmRLREtDcUpjWSIsCi0gICAgIkRvQ2pqdmJka0NsS3FIVkgiLAotICAgICJEb0NqanZiZGNUQ2p0RGlhIiwKLSAgICAiRVBETEt2YmRVVmtwSnRBcSIsCi0gICAgIkVQRExLdmJkUnlqSVRDdkEiLAotICAgICJEbmJqanZiZEp1dUZjZGdKIiwKLSAgICAiRG9ES2p2YmRySkFKZG1PZSIsCi0gICAgIkRuY0tqdmJkSmNKYnFLQ3giLAotICAgICJEb0RMS3ZiZEpjSmJxSmNZIiwKLSAgICAiRG9ES2p2YmRlRW9TQ1hESyIsCi0gICAgIkRvRExLdmJkU3dqbE56a1kiLAotICAgICJFT2JqanZiZHppdG9wRHJ0IiwKLSAgICAiRG9Da0t2YmRLV1ZHRUVnSiIsCi0gICAgIkRuY0tqdmJkcHNzZnFyS3QiLAotICAgICJFT2NMS3ZiZFVNV1BCVm9KIiwKLSAgICAiRG5jS2p2YmR5emRtcklJaCIsCi0gICAgIkVQQ2pqdmJkeFVsZHFaTG4iLAotICAgICJEb0RMS3ZiZHlTbkltUmJIIiwKLSAgICAiRG9Damp2YmRHZEt2SmFpaiIsCi0gICAgIkRvQ2tLdmJkeFpnZWV3ZHIiLAotICAgICJFT2JrS3ZiZGlMZGROdURaIiwKLSAgICAiRG5iamp2YmRTQ0Rka2laTCIsCi0gICAgIkRuY0tqdmJkem5wUkVjTVkiLAotICAgICJFT2NMS3ZiZGFSZWJoVGZMIiwKLSAgICAiRG5iamp2YmRaUWxkaU1kcSIsCi0gICAgIkVQQ2pqdmJkYnJianRFS0IiLAotICAgICJFT2NLanZiZEVBUmlNelhYIiwKLSAgICAiRG9ETEt2YmRYcmthTlRueCIsCi0gICAgIkVQQ2tLdmJkUVpOQUhUUmoiLAotICAgICJEb0RMS3ZiZEV6c3BlTGNKIiwKLSAgICAiRVBDamp2YmR1Vm5ZS1JUQSIsCi0gICAgIkVPYmpqdmJkSlh0QmhNUXAiLAotICAgICJFUERLanZiZGVPZHJqc3NyIiwKLSAgICAiRVBDamp2YmRMcXdNeXRweiIsCi0gICAgIkVQREtqdmJkVU1Wb0JWb0oiLAotICAgICJEbmNLanZiZFJwVUdpZkR3IiwKLSAgICAiRVBETEt2YmRaeURpbkRMciIsCi0gICAgIkRuYmtLdmJkTnJzdWZlVlEiLAotICAgICJFUENrS3ZiZFpNU0R0TmxOIiwKLSAgICAiRVBDa0t2YmR5U25KTlNDSCIsCi0gICAgIkVQQ2pqdmJkZk1ldmZsakwiLAotICAgICJEbmNMS3ZiZFhzTUJOVG54IiwKLSAgICAiRG5ia0t2YmRweG9IZnFEeCIsCi0gICAgIkRuY0xLdmJkVVFwbnR0aE4iLAotICAgICJEbmNLanZiZElzWkFybHdsIiwKLSAgICAiRG9ETEt2YmRaR3dFQU9zSiIsCi0gICAgIkVPY0tqdmJkVnZod3ZEZGciLAotICAgICJFT2NMS3ZiZHVXTnhKcVRBIiwKLSAgICAiRVBDamp2YmRIRUt2SmFpaiIsCi0gICAgIkRvREtqdmJkcnBXT2pDdWYiLAotICAgICJEbmNMS3ZiZHJwV09qRFZmIiwKLSAgICAiRG9Damp2YmRJSEd6WXd3ZyIsCi0gICAgIkRvRExLdmJkcHhvSUdxRVkiLAotICAgICJEb0RMS3ZiZEpjSmJxS0RZIiwKLSAgICAiRG9Damp2YmRSV21kQ2xIYyIsCi0gICAgIkVQQ2pqdmJkRldZb3BOSmUiLAotICAgICJEbmNLanZiZG1mZHdsbWZ5IiwKLSAgICAiRG9Da0t2YmR4VWxlUXhsTyIsCi0gICAgIkVPYmpqdmJkbkdkeE1uR3kiLAotICAgICJFUENqanZiZHZ2bEF2QlZ1IiwKLSAgICAiRG5jTEt2YmRkbmRzS3NzciIsCi0gICAgIkVPYmpqdmJkWk1SY3NuTG0iLAotICAgICJFT2NLanZiZEZ4dHRhRVhiIiwKLSAgICAiRG5jS2p2YmRWVU5UZk1WaiIsCi0gICAgIkVPY0xLdmJkTnJ0V0hGVXAiLAotICAgICJEb0RLanZiZHd1TWRxWWxPIiwKLSAgICAiRVBETEt2YmRyWFBrYmh4cSIsCi0gICAgIkVPYmpqdmJkckVGSXBOdWEiLAotICAgICJFT2JqanZiZHppdVFRRHJ0IiwKLSAgICAiRU9jTEt2YmRxWW9JR3BjeCIsCi0gICAgIkRuYmpqdmJkc1FWb0pjVmYiLAotICAgICJFT2JrS3ZiZGtETUtwZ1VnIiwKLSAgICAiRU9iamp2YmR2QkR5VFBGSSIsCi0gICAgIkRuY0tqdmJkdUNidVd2T28iLAotICAgICJFUENqanZiZGtWdm5FQ1lYIiwKLSAgICAiRG5jTEt2YmRaR3ZkQU9yaSIsCi0gICAgIkRvQ2tLdmJkclhQbERKWlIiLAotICAgICJFT2NMS3ZiZHVDY1ZXdk9vIiwKLSAgICAiRG9ES2p2YmRDRVBhV0psZiIsCi0gICAgIkVQREtqdmJkZG9Fcmpzc3IiLAotICAgICJEbmNLanZiZEFDcXhLWmlRIiwKLSAgICAiRVBDamp2YmRVVmxQaXRBcSIsCi0gICAgIkVQREtqdmJkakpmSGpNeFMiLAotICAgICJFT2JrS3ZiZEFNaFlzV3pZIiwKLSAgICAiRG9ES2p2YmRuQml2eE9tdSIsCi0gICAgIkVPY0xLdmJkYmlOS0tmWFkiLAotICAgICJFUERLanZiZFlxTWVJbGVSIiwKLSAgICAiRU9ia0t2YmRKbUFEeWdVYSIsCi0gICAgIkVPYmpqdmJkRVBETExXY0UiLAotICAgICJFUENqanZiZHJYUGtjSXhxIiwKLSAgICAiRU9jTEt2YmRsaUR0UXRxYSIsCi0gICAgIkRvQ2pqdmJkbW95eHVqeUMiLAotICAgICJFUERMS3ZiZGRvRlRMVHNyIiwKLSAgICAiRU9jTEt2YmRDV3pkSkVwVyIsCi0gICAgIkRuYmpqdmJkckVFaHBPV0IiLAotICAgICJEb0RLanZiZFpMckR0TmttIiwKLSAgICAiRU9jTEt2YmRMRmZIYkFxViIsCi0gICAgIkVPY0tqdmJkbXR0ekxLU0ciLAotICAgICJFT2NMS3ZiZG1iSnZ3b09WIiwKLSAgICAiRU9jS2p2YmRVYUNRcnFTWiIsCi0gICAgIkRuYmpqdmJkbWdFeE1uR3kiLAotICAgICJFUERLanZiZGRuZHJrVVVTIiwKLSAgICAiRU9ia0t2YmREd3drc3RUbCIsCi0gICAgIkRvQ2tLdmJkY0pNakxGd1kiLAotICAgICJEbmJqanZiZGFOTEJydU1nIiwKLSAgICAiRG9ETEt2YmRRWW1BSFRSaiIsCi0gICAgIkRuYmtLdmJkc1FXT2ljV0ciLAotICAgICJFT2JrS3ZiZE1Sd016VXB6IiwKLSAgICAiRG9ETEt2YmRac2hpWkRybiIsCi0gICAgIkVQRExLdmJkblB6WXVqeGIiLAotICAgICJFT2NLanZiZENFUUF1ak1mIiwKLSAgICAiRVBETEt2YmRLZWZIYkFwdSIsCi0gICAgIkRvRExLdmJkWXBsZGlORlIiLAotICAgICJEb0NrS3ZiZEZXWlFRTkplIiwKLSAgICAiRG5jTEt2YmR6bnBRZUNreCIsCi0gICAgIkVPY0tqdmJkblFaeHZLeGIiLAotICAgICJEb0NrS3ZiZFZCQnBycHF5IiwKLSAgICAiRG5ia0t2YmRaaXJoUGZhZiIsCi0gICAgIkRuYmtLdmJkZWdqdlNOcUgiLAotICAgICJFT2NMS3ZiZHFkRWlQbldCIiwKLSAgICAiRU9iamp2YmRCaGtDS2lHSyIsCi0gICAgIkVPYmpqdmJkeFpnZkdZRlMiLAotICAgICJEbmJqanZiZE5RWVF1bWdUIiwKLSAgICAiRVBDamp2YmR4c05obHJCZyIsCi0gICAgIkRvQ2tLdmJkUWREQXBSRHIiLAotICAgICJEb0NrS3ZiZHh4SWlhb3lrIiwKLSAgICAiRVBES2p2YmRGZWlyTmh0UiIsCi0gICAgIkRvQ2pqdmJkZWdqdlNPUWciLAotICAgICJFT2JrS3ZiZHFjZGlRTnZCIiwKLSAgICAiRG5jTEt2YmRpTUVkTnRjWiIsCi0gICAgIkRuY0xLdmJkVHFSUFV0aE4iLAotICAgICJFUENrS3ZiZHd5Z2VleEZTIiwKLSAgICAiRG9ES2p2YmR5VE9KTXJCZyIsCi0gICAgIkRuY0xLdmJkZUVvUmF2YmoiLAotICAgICJFUENqanZiZHRiY1V2dk9vIiwKLSAgICAiRU9iamp2YmRLQ2ljUkpjWSIsCi0gICAgIkVPYmpqdmJkWnlFS09ETVMiLAotICAgICJEbmJqanZiZG1KRHRRdHJCIiwKLSAgICAiRG5jTEt2YmRFQVJobHl2dyIsCi0gICAgIkRuYmpqdmJkSXhUYklMcVEiLAotICAgICJFT2NMS3ZiZHd5Z2VmWUZTIiwKLSAgICAiRG9Damp2YmR6bm9xRkNreCIsCi0gICAgIkRvQ2pqdmJkUnBVR2pHRHciLAotICAgICJEbmNLanZiZGh6VkdNUW5HIiwKLSAgICAiRVBDamp2YmRoa2VEblZDeSIsCi0gICAgIkVPYmtLdmJkT0VkVUlpS2QiLAotICAgICJEbmNLanZiZHJEZUlvbXVhIiwKLSAgICAiRG5jTEt2YmRpSEpieHVpdSIsCi0gICAgIkVQREtqdmJkZHhac3RSZXoiLAotICAgICJFUERMS3ZiZG1TWXVacmRKIiwKLSAgICAiRU9ia0t2YmRWVU5VRmt2SyIsCi0gICAgIkVQRExLdmJkTmVFVUpJamQiLAotICAgICJEb0NrS3ZiZGlNRWROdUN5IiwKLSAgICAiRG9ETEt2YmRSRGNBcFFjciIsCi0gICAgIkVQQ2pqdmJkVGxWb0JWb0oiLAotICAgICJFT2JqanZiZExCS2dOQndxIiwKLSAgICAiRVBDa0t2YmRzQ0ZsbEhLeSIsCi0gICAgIkVPYmpqdmJkblZVekxKcWYiLAotICAgICJEb0RLanZiZHFyVkxOa0JOIiwKLSAgICAiRG9Da0t2YmRxRmNkdFdCSSIsCi0gICAgIkRuY0xLdmJkYlZDR3hMVGgiLAotICAgICJFT2NMS3ZiZGVGUFNDWENqIiwKLSAgICAiRU9jTEt2YmRScFRnS0ZkWCIsCi0gICAgIkVPYmpqdmJkem5wUWVETHgiLAotICAgICJFT2NLanZiZGp2WE5jYXhYIiwKLSAgICAiRG5iamp2YmRIRGtXSmJKaiIsCi0gICAgIkRuY0tqdmJkaGtlRU51RFoiLAotICAgICJEbmJrS3ZiZG5VdHlqalNHIiwKLSAgICAiRG9ES2p2YmRTUVVISmZEdyIsCi0gICAgIkRuY0tqdmJkYlViSFlMVUkiLAotICAgICJFT2NMS3ZiZE5zVHZHZHVRIiwKLSAgICAiRVBETEt2YmRTWmlnc0N2QSIsCi0gICAgIkRuY0tqdmJkTWZjUGxwVWsiLAotICAgICJEb0RMS3ZiZHhybklsckJnIiwKLSAgICAiRG5jS2p2YmRpTGRjblZDeSIsCi0gICAgIkVQQ2pqdmJkbWZlWU5PSFoiLAotICAgICJEb0NrS3ZiZGp2V21jYXhYIiwKLSAgICAiRG9ES2p2YmRiVWJIWGtVSSIsCi0gICAgIkRuY0tqdmJkQmhrQmppRmoiLAotICAgICJEb0RMS3ZiZE5IQ29scFZMIiwKLSAgICAiRU9jS2p2YmRyeWtvc0FoTyIsCi0gICAgIkRuY0xLdmJkcUdEZVVWYUkiLAotICAgICJEbmJrS3ZiZGhnSmNaVml1IiwKLSAgICAiRG5iamp2YmR1THhYQXRCWCIsCi0gICAgIkVQQ2pqdmJkWXBsZUpORlIiLAotICAgICJFUERMS3ZiZFF2bWRDbEhjIiwKLSAgICAiRG5iamp2YmRKWVRiSU1SUSIsCi0gICAgIkRuY0xLdmJkem5wUkZETVkiLAotICAgICJFT2NMS3ZiZFpubWlGRXlqIiwKLSAgICAiRG5ia0t2YmRyUnVMT0xBbSIsCi0gICAgIkVPYmtLdmJkaGtlRU9VYnkiLAotICAgICJEbmNMS3ZiZFlsU0VVT0xtIiwKLSAgICAiRG9Damp2YmRoa2RjbXRieSIsCi0gICAgIkRuY0xLdmJkZGRuckNYREsiLAotICAgICJEb0RMS3ZiZEthTEhOQ1lSIiwKLSAgICAiRU9jS2p2YmRjeXhwWVpRYiIsCi0gICAgIkVQRExLdmJkQUNxd2paaHAiLAotICAgICJEb0NrS3ZiZEJzQkRUZXZyIiwKLSAgICAiRU9ia0t2YmRlS0pxdlV6biIsCi0gICAgIkVPYmtLdmJkY0ltSmtHV3giLAotICAgICJEbmNMS3ZiZFlTbEFsdE94IiwKLSAgICAiRG5jTEt2YmRscll0eXJkSiIsCi0gICAgIkVPYmtLdmJkS3hxSnJ6dGYiLAotICAgICJFT2NLanZiZHNRV1BKY1ZmIiwKLSAgICAiRG9ES2p2YmRreVNxcnhnVSIsCi0gICAgIkVPYmpqdmJkZUVvUmJYQ2oiLAotICAgICJFT2NLanZiZEhEa1ZqQmlqIiwKLSAgICAiRG9ETEt2YmRDVEJDc2ZYUyIsCi0gICAgIkRvQ2pqdmJkS0NqRFFpYngiLAotICAgICJEb0NqanZiZGxoZFRxVXJCIiwKLSAgICAiRG9ES2p2YmRUdWxRS1RhUiIsCi0gICAgIkRvQ2tLdmJkUmp4ZXRma1QiLAotICAgICJFUENqanZiZEV1eVFRTktGIiwKLSAgICAiRVBDamp2YmREb0RLa1hERSIsCi0gICAgIkRvQ2pqdmJkc1FXUEpidWYiLAotICAgICJEb0RLanZiZGh1WmR2cXRiIiwKLSAgICAiRVBETEt2YmRpSEtDeVdKdSIsCi0gICAgIkVQRExLdmJkTEZlZ2FhUXUiLAotICAgICJEb0NqanZiZHFaUEhnUkR4IiwKLSAgICAiRG5jS2p2YmRVV01QalVBcSIsCi0gICAgIkRvRExLdmJkVFlLa216angiLAotICAgICJEb0RLanZiZGVnanZTT1FnIiwKLSAgICAiRG5ia0t2YmRVdE5UZWt2SyIsCi0gICAgIkVPYmtLdmJkTnNUdkdlVlEiLAotICAgICJEb0RMS3ZiZGZORnZnTWpMIiwKLSAgICAiRU9jTEt2YmRaUW1FaU5FcSIsCi0gICAgIkVQREtqdmJkQnJhRFRmV3IiLAotICAgICJFUERLanZiZE5HY1FOUVZMIiwKLSAgICAiRVBETEt2YmRaeUVLT0RNUyIsCi0gICAgIkVPY0tqdmJkQnZ6ZElkcFciLAotICAgICJFUENqanZiZEFDcXdpeWlRIiwKLSAgICAiRG9Damp2YmRkZVBSYXdDaiIsCi0gICAgIkVQREtqdmJkV1dpWHVjZGciLAotICAgICJEb0RLanZiZFdleHpVQVBUIiwKLSAgICAiRG5iamp2YmR3WE1CV0JXViIsCi0gICAgIkVPY0xLdmJkVXlIc3pMT24iLAotICAgICJFUENrS3ZiZE9ZT3V6Y25VIiwKLSAgICAiRVBDa0t2YmRoYW5jRXdRcSIsCi0gICAgIkRuYmtLdmJkamdnTGVmT0wiLAotICAgICJFUENrS3ZiZEZqZHNESU11IiwKLSAgICAiRG9ES2p2YmRyU1VqbWtCTiIsCi0gICAgIkRvRExLdmJkWmpUSVFHYWYiLAotICAgICJEb0RLanZiZE1nRFBtUHRrIiwKLSAgICAiRVBETEt2YmRXUm13YkZNRCIsCi0gICAgIkRvQ2tLdmJkelJPbUpLWEEiLAotICAgICJEbmJrS3ZiZHJEZGlRTnZCIiwKLSAgICAiRG5iamp2YmR1REN0d1ZvUCIsCi0gICAgIkVPY0xLdmJkQ0lqYkxKRmoiLAotICAgICJFUERLanZiZFhya2FNc254IiwKLSAgICAiRVBES2p2YmRWaFh2WGZ4eiIsCi0gICAgIkRuY0tqdmJkaGJQREV3UlIiLAotICAgICJEb0NrS3ZiZHB4b0hnUWN4IiwKLSAgICAiRG9Da0t2YmR1TVh3QlVCWCIsCi0gICAgIkVPYmpqdmJkTmVFVGhoamQiLAotICAgICJEb0NqanZiZGlyemhya0p6IiwKLSAgICAiRG9ETEt2YmRhTWtDVFVsZyIsCi0gICAgIkRuY0xLdmJkV1JuWUJlTGMiLAotICAgICJEbmJqanZiZEdCUFJaSnptIiwKLSAgICAiRU9jTEt2YmRlT2VTanN0UyIsCi0gICAgIkRvRExLdmJkbUljdFJWU0IiLAotICAgICJEb0NqanZiZFp4ZEpuRE1TIiwKLSAgICAiRG9Da0t2YmRScFRnS0ZjdyIsCi0gICAgIkRuY0xLdmJkVHVrb2pUYVIiLAotICAgICJEbmJqanZiZEtSWmRvRm1lIiwKLSAgICAiRG5ia0t2YmRVUlFvVlVoTiIsCi0gICAgIkRvRExLdmJkeVlKS0JvekwiLAotICAgICJFT2JrS3ZiZGZORndITWpMIiwKLSAgICAiRG9ETEt2YmRaaXNJUUhCZiIsCi0gICAgIkVPYmtLdmJkcUZjZHN1YUkiLAotICAgICJEbmNMS3ZiZHpvUHFGREx4IiwKLSAgICAiRG9ES2p2YmRTS3hldUhMVCIsCi0gICAgIkVQREtqdmJkc0JlbUxmankiLAotICAgICJEb0NqanZiZEpiakNxSmNZIiwKLSAgICAiRG9Damp2YmROUHhSVm5HcyIsCi0gICAgIkRuY0xLdmJkR2NqdkpiS0siLAotICAgICJFT2NLanZiZHJXcE1ESXhxIiwKLSAgICAiRU9jTEt2YmRRZERBcFFjciIsCi0gICAgIkRvREtqdmJkWk1SZFRuTG0iLAotICAgICJFT2NMS3ZiZGR4WnNzckZ6IiwKLSAgICAiRU9iamp2YmRVdE5UZkx1aiIsCi0gICAgIkVQQ2pqdmJkTExCSVdBS1oiLAotICAgICJEb0NrS3ZiZGdGbFptZmdBIiwKLSAgICAiRVBDamp2YmRVVmtvaXRBcSIsCi0gICAgIkRvREtqdmJkRG5jS2p2Y0UiLAotICAgICJEb0RMS3ZiZFJwVUhKZkVYIiwKLSAgICAiRVBES2p2YmRMcXZselZReiIsCi0gICAgIkVQREtqdmJkWk1SZFVPTG0iLAotICAgICJFT2NMS3ZiZENKTEJrSWZLIiwKLSAgICAiRG5jS2p2YmRhU0ZiaFVGayIsCi0gICAgIkVQRExLdmJkWm9OaGVFeksiLAotICAgICJEbmNLanZiZFVWbFBqVUFxIiwKLSAgICAiRG5ia0t2YmRLTkFEeWZ1QiIsCi0gICAgIkVPYmtLdmJkWmR3ZnpnaGIiLAotICAgICJFUERMS3ZiZFp0SWh4Y3JuIiwKLSAgICAiRU9ia0t2YmRHY2tWaWFqSyIsCi0gICAgIkRuY0xLdmJkRmZKcW1pVVIiLAotICAgICJEbmNLanZiZEtXVWZEZGdKIiwKLSAgICAiRG9ES2p2YmRNdHJxam1BWCIsCi0gICAgIkVPY0xLdmJkc1FXUEtEVmYiLAotICAgICJEb0NqanZiZHd0bGVSWk1PIiwKLSAgICAiRU9iamp2YmR1YUR4c1BFaCIsCi0gICAgIkVQRExLdmJkS3hxSnJ6dUciLAotICAgICJFT2NLanZiZFZBYXBycHJaIiwKLSAgICAiRU9iamp2YmRFdXhvcE1qRiIsCi0gICAgIkRuYmpqdmJkeU9USHdyaUQiLAotICAgICJFUERMS3ZiZHJwVm5pYnZHIiwKLSAgICAiRVBES2p2YmRrV1duRGF3dyIsCi0gICAgIkRuY0xLdmJkclhQa2JpWXEiLAotICAgICJEb0RMS3ZiZGR4WnNzcWV6IiwKLSAgICAiRU9jTEt2YmRIRGtXSmJKaiIsCi0gICAgIkRuY0xLdmJkRVBDa0xXY0UiLAotICAgICJEbmJrS3ZiZEVYd2tzdFRsIiwKLSAgICAiRU9iamp2YmRxaUFLRW1PZSIsCi0gICAgIkRuY0xLdmJkakFRR2FRR2oiLAotICAgICJFUENqanZiZE5lRHRKSktkIiwKLSAgICAiRVBDamp2YmR2d01CV0JWdSIsCi0gICAgIkVQREtqdmJkRmVqU09JdFIiLAotICAgICJFT2NMS3ZiZE5Qd3FXT0hUIiwKLSAgICAiRVBES2p2YmRic0Nqc2NpYSIsCi0gICAgIkVPYmtLdmJkeVlJaWFveWsiLAotICAgICJEb0RLanZiZExaUWlyenVHIiwKLSAgICAiRU9iamp2YmRTTFpHVkdqcyIsCi0gICAgIkRvQ2pqdmJkQU1neHNXelkiLAotICAgICJEb0RMS3ZiZEVPYmpqd0NkIiwKLSAgICAiRG5ia0t2YmRzUHZPaWNXRyIsCi0gICAgIkVQQ2tLdmJkckpBS0VsbmUiLAotICAgICJFUENrS3ZiZGF1Q0d3anNoIiwKLSAgICAiRG5jTEt2YmRlZ2tXUm5RZyIsCi0gICAgIkVQQ2tLdmJkWXBtRWlORlIiLAotICAgICJEb0RLanZiZHVhRHhzUEZJIiwKLSAgICAiRG9Damp2YmRjeXhveFlxQyIsCi0gICAgIkRvQ2tLdmJka01ha3pGSFAiLAotICAgICJEbmJqanZiZEpiaWJxSmJ4IiwKLSAgICAiRG5ia0t2YmRXV2h4V0RlSCIsCi0gICAgIkRvQ2pqdmJkc3NSc1l6RkQiLAotICAgICJEb0RLanZiZHB5UElIUkR4IiwKLSAgICAiRG5jTEt2YmR3TldBTkRlTiIsCi0gICAgIkRvREtqdmJkSllVQmdsUlEiLAotICAgICJFT2JrS3ZiZFhuUkFZVlZ0IiwKLSAgICAiRG9Damp2YmRVV0xwS1RhUiIsCi0gICAgIkRvREtqdmJkVHFST3R0Z20iLAotICAgICJFUENrS3ZiZFZxblhhZU1EIiwKLSAgICAiRU9iamp2YmRBRFJ3aXlpUSIsCi0gICAgIkRvREtqdmJkbHJaVXlyY2kiLAotICAgICJFUERLanZiZHZBZFpTbmRoIiwKLSAgICAiRG9Da0t2YmR6b1FRZURMeCIsCi0gICAgIkRuYmtLdmJkU1FVR2pGZFgiLAotICAgICJFT2NMS3ZiZHFCSkZBWElFIiwKLSAgICAiRU9ia0t2YmRTQ0VGTGlaTCIsCi0gICAgIkRuYmpqdmJkem9RUWRjTVkiLAotICAgICJEbmJrS3ZiZHB4bmdmcUVZIiwKLSAgICAiRG5jTEt2YmRic0RMVUVLQiIsCi0gICAgIkRvQ2pqdmJkWHJsQk10T3giLAotICAgICJFT2JqanZiZEtDakRRaWNZIiwKLSAgICAiRG5jTEt2YmRMcldselVweiIsCi0gICAgIkVPYmpqdmJkYWFXRWZRUVgiLAotICAgICJFT2JqanZiZHRsWVdhVGFYIiwKLSAgICAiRG5ia0t2YmRNb3dwdW5HcyIsCi0gICAgIkVPYmtLdmJkU0xZZXVIS3MiLAotICAgICJFT2JrS3ZiZFRBRWhoQ09kIiwKLSAgICAiRVBDa0t2YmRtU1l0eXJjaSIsCi0gICAgIkRuY0xLdmJkWWtxY3NuTG0iLAotICAgICJEb0RMS3ZiZHJ5bFFUQWduIiwKLSAgICAiRG5jTEt2YmRKWHRDSU1SUSIsCi0gICAgIkVPYmtLdmJkU0JkRWxJeUwiLAotICAgICJEb0RMS3ZiZHd5Z2VmWUZTIiwKLSAgICAiRG5jS2p2YmR5WGhpYlB6TCIsCi0gICAgIkVQQ2pqdmJkdWFEeHNQRkkiLAotICAgICJFT2JqanZiZFpvTmlGRXpLIiwKLSAgICAiRVBDamp2YmRrTkJreWVIUCIsCi0gICAgIkVQQ2tLdmJkV1JuWGFkbEQiLAotICAgICJEbmNMS3ZiZFJXbWRETGhEIiwKLSAgICAiRG5ia0t2YmRtU1l0elREaSIsCi0gICAgIkVPY0tqdmJka1Z3T0RiWHciLAotICAgICJEbmNMS3ZiZFFseENaT1V6IiwKLSAgICAiRU9iamp2YmRiaGxpamZYWSIsCi0gICAgIkVPY0xLdmJkWG1xQVh0dXQiLAotICAgICJFT2NMS3ZiZG1iS1hYbm5WIiwKLSAgICAiRG9ES2p2YmRrSGdNRmZPTCIsCi0gICAgIkVQQ2tLdmJkZmVreW1nSEEiLAotICAgICJEb0NqanZiZGVLS1J2VXpuIiwKLSAgICAiRG9ES2p2YmRrSGZrZWZOayIsCi0gICAgIkRvQ2pqdmJkeXFQTWlLWEEiLAotICAgICJEbmJqanZiZFVRcU90dUlOIiwKLSAgICAiRU9jS2p2YmRFUENrS3dERSIsCi0gICAgIkRvRExLdmJkWlJORklsZVIiLAotICAgICJEbmJqanZiZFJhY2RsSlpMIiwKLSAgICAiRU9jTEt2YmRUdWtvaXRBcSIsCi0gICAgIkVPY0xLdmJkWkxyRHRPTU4iLAotICAgICJFT2NMS3ZiZGdLZnpjR0FFIiwKLSAgICAiRU9iamp2YmR6alZRUUVTdCIsCi0gICAgIkVPY0xLdmJkY0lsaWpldngiLAotICAgICJFT2NLanZiZEdLZHNESG1WIiwKLSAgICAiRG5jTEt2YmRLa0JIdkFKeSIsCi0gICAgIkVPY0tqdmJkWk1SY3RPTG0iLAotICAgICJFUENrS3ZiZEFEUnhLWmlRIiwKLSAgICAiRU9iamp2YmREd3hMc3NzbCIsCi0gICAgIkVQRExLdmJkVXhnc3pMUE8iLAotICAgICJFUENrS3ZiZFNRVGZpZWRYIiwKLSAgICAiRVBDamp2YmROZUVVSklrRSIsCi0gICAgIkRvRExLdmJkcHlQSGZxRHgiLAotICAgICJEbmJrS3ZiZHlPU2hYc0pEIiwKLSAgICAiRG5jTEt2YmRMaUJrcHhBUyIsCi0gICAgIkRvREtqdmJkYWFXRWVwUVgiLAotICAgICJEb0NqanZiZFdTT1lCZUxjIiwKLSAgICAiRU9jS2p2YmRMRmVnYkFxViIsCi0gICAgIkVQREtqdmJkZmZMek9HZ0EiLAotICAgICJFT2JrS3ZiZEZrRXJiZ2x1IiwKLSAgICAiRG5jTEt2YmRpWnVGbFJPRyIsCi0gICAgIkRuY0tqdmJkZWdrV1JuUWciLAotICAgICJEb0RMS3ZiZFFkREFwUkRyIiwKLSAgICAiRU9jTEt2YmRlWVp0VVJleiIsCi0gICAgIkVPYmpqdmJkclhRTGNJeHEiLAotICAgICJEb0RMS3ZiZHhaaEdHWGVTIiwKLSAgICAiRG9ETEt2YmRHR0tTT0l0UiIsCi0gICAgIkVPYmpqdmJkamhITGZGbkwiLAotICAgICJFT2NMS3ZiZFVRcG9VdUhtIiwKLSAgICAiRG9Da0t2YmRYcmxCTlVQWSIsCi0gICAgIkRvREtqdmJkSlh0Q0lNUlEiLAotICAgICJEbmJrS3ZiZFpNU0RzbkxtIiwKLSAgICAiRG5jS2p2YmRDVEJEVUdXciIsCi0gICAgIkRuY0tqdmJkYmhsaWtHWFkiLAotICAgICJEb0RLanZiZFhtcUFZVldVIiwKLSAgICAiRG5iamp2YmRsaURzcVZSYSIsCi0gICAgIkRuYmtLdmJkbWFqWFlPblYiLAotICAgICJFT2JqanZiZEpweWVQR05lIiwKLSAgICAiRG5ia0t2YmRDVEFjVUdYUyIsCi0gICAgIkRvRExLdmJkQ0RwQlZqTkciLAotICAgICJFT2NMS3ZiZHh3aGlhb3lrIiwKLSAgICAiRG9ES2p2YmR4Vk5GUXlNTyIsCi0gICAgIkVQQ2tLdmJkVnZod3ZFRWciLAotICAgICJEbmJrS3ZiZEZXWW9vbUplIiwKLSAgICAiRU9jS2p2YmRsclpVeXNFSiIsCi0gICAgIkVQREtqdmJkcXF1S25LYU4iLAotICAgICJEb0NrS3ZiZFRrdW5hVm9KIiwKLSAgICAiRU9jTEt2YmRmSGtWck9RZyIsCi0gICAgIkVQRExLdmJkaVV6RldyVWIiLAotICAgICJEb0RMS3ZiZHRBR3FJQUJTIiwKLSAgICAiRG9Da0t2YmRaUk1kaG1FcSIsCi0gICAgIkRuYmtLdmJkTnNVVmZlVlEiLAotICAgICJFUERMS3ZiZHF3UGtiaVpSIiwKLSAgICAiRG9Da0t2YmROVXNTTE5BWCIsCi0gICAgIkRuY0tqdmJkbXBaeHZLeUMiLAotICAgICJFUENrS3ZiZExZcUtTenRmIiwKLSAgICAiRVBES2p2YmRaeUVLT0RNUyIsCi0gICAgIkVQREtqdmJkTkdib21QdUwiLAotICAgICJEbmNLanZiZFpNU0R0TmxOIiwKLSAgICAiRVBDamp2YmRUWGprbXpqeCIsCi0gICAgIkVPYmtLdmJkQmRRQXZLTWYiLAotICAgICJFT2NMS3ZiZGt5U3JUWWdVIiwKLSAgICAiRG5ia0t2YmRab09JZGR6SyIsCi0gICAgIkRvQ2tLdmJkWk1TRHNta20iLAotICAgICJFUENrS3ZiZENXemRJZHBXIiwKLSAgICAiRG5jTEt2YmRCdnpkSWRvdiIsCi0gICAgIkRvQ2pqdmJkYVJmREh0RmsiLAotICAgICJEbmJrS3ZiZFdleVp0QU9zIiwKLSAgICAiRG9ETEt2YmRuQ0p3WVBPViIsCi0gICAgIkRvQ2pqdmJkRVlZTHN0VU0iLAotICAgICJFT2NMS3ZiZHd0bGRxWk1PIiwKLSAgICAiRVBDamp2YmRGVnhvb21LRiIsCi0gICAgIkVPYmtLdmJkeXFQTWhpd0EiLAotICAgICJEb0RMS3ZiZGt4cnJTeGdVIiwKLSAgICAiRG9Damp2YmRlQVRxTllLRyIsCi0gICAgIkRuY0xLdmJkSktFQUpwSEUiLAotICAgICJEb0NrS3ZiZGRuZHNMVVRyIiwKLSAgICAiRG5iamp2YmRxRmNlVVdCSSIsCi0gICAgIkRvRExLdmJkaGtkZE9VYnkiLAotICAgICJEbmNLanZiZEdLZHJjSU11IiwKLSAgICAiRVBDa0t2YmRlbGV2ZmxpayIsCi0gICAgIkRvREtqdmJkaGFvREZXcVIiLAotICAgICJEb0NqanZiZFlsU0RzbWxOIiwKLSAgICAiRVBDamp2YmRpWnVHTHBtZiIsCi0gICAgIkVPYmtLdmJkbkNKdnhQTnUiLAotICAgICJEbmJrS3ZiZGh6VWVsUk5mIiwKLSAgICAiRG5ia0t2YmRaZVlHemdpQyIsCi0gICAgIkRvQ2tLdmJkRG5ia0xXYmQiLAotICAgICJEbmJrS3ZiZG5IRllNbWZ5IiwKLSAgICAiRG9Damp2YmRlUEVzS3RUciIsCi0gICAgIkRuYmpqdmJkWlFtRWhsZVIiLAotICAgICJEbmJrS3ZiZFRrdW5hVm9KIiwKLSAgICAiRG5ia0t2YmRGV1pQcE1qRiIsCi0gICAgIkRvREtqdmJkU3drTU56a1kiLAotICAgICJFT2NMS3ZiZHd0bGRweU1PIiwKLSAgICAiRU9jS2p2YmRoa2RjbXRieSIsCi0gICAgIkRvQ2pqdmJkTlFYcVdOZnMiLAotICAgICJFUERLanZiZHpqVXBQZFRVIiwKLSAgICAiRG5iamp2YmRxY2VKUG5XQiIsCi0gICAgIkVQREtqdmJkVXlIc3lqb08iLAotICAgICJFUENrS3ZiZFpzaGh4Y3NPIiwKLSAgICAiRG5jS2p2YmRxQWlGQVdnZCIsCi0gICAgIkVPYmtLdmJkZ0Zrek9HZ0EiLAotICAgICJEbmNLanZiZG1nRllOTmdaIiwKLSAgICAiRG9ETEt2YmREakhqV1lLQSIsCi0gICAgIkRuYmpqdmJkSmJpY1JLQ3giLAotICAgICJEbmJrS3ZiZGZORndITWpMIiwKLSAgICAiRVBDa0t2YmRXU054QmRsRCIsCi0gICAgIkVQRExLdmJkQ0pLYkxKRmoiLAotICAgICJFUERLanZiZEVPY0trWERFIiwKLSAgICAiRVBDa0t2YmRWck9ZQ0VsRCIsCi0gICAgIkRuYmpqdmJkQ0lrQmpoZWoiLAotICAgICJEb0RMS3ZiZGRvRlRLc3RTIiwKLSAgICAiRG5iamp2YmR1RERWWFZvUCIsCi0gICAgIkVPYmtLdmJkeHdpS0NQekwiLAotICAgICJEbmJrS3ZiZFpHdmRBUFRKIiwKLSAgICAiRG9ETEt2YmRCZFBhVmpORyIsCi0gICAgIkVPY0tqdmJkSUhHell3eEgiLAotICAgICJEb0NqanZiZEdGalNOaHNxIiwKLSAgICAiRG5iamp2YmRsWXNTU3hnVSIsCi0gICAgIkVQQ2pqdmJkcXJVam5LYU4iLAotICAgICJFT2NMS3ZiZHR2T1hpcHNBIiwKLSAgICAiRG9ETEt2YmRyb3VuakN1ZiIsCi0gICAgIkRvQ2tLdmJkRlZ5UG9tS0YiLAotICAgICJFT2NLanZiZE5IQ3BOUHRrIiwKLSAgICAiRVBETEt2YmRXZXladEFQVCIsCi0gICAgIkVQREtqdmJkamNMa1FmdUgiLAotICAgICJFT2NMS3ZiZHpIWk1BTWVYIiwKLSAgICAiRG9Damp2YmRVTVdQQlZuaSIsCi0gICAgIkVPY0tqdmJkSEVMV0tCaksiLAotICAgICJEb0RLanZiZE1nQ29tUVVrIiwKLSAgICAiRG5ia0t2YmRpR2pEWldKdSIsCi0gICAgIkRuY0tqdmJkeXFPbUpLWEEiLAotICAgICJEb0RLanZiZFZaSVR5am9PIiwKLSAgICAiRG9Damp2YmR6UW9OSkp3QSIsCi0gICAgIkVPY0xLdmJkR0FvUXhpem0iLAotICAgICJEb0RLanZiZGF0YWdZS3NoIiwKLSAgICAiRVBES2p2YmRTQmNlTUpZayIsCi0gICAgIkRvRExLdmJkTXBZUXZPSFQiLAotICAgICJEbmNLanZiZGlDT2NGV3BxIiwKLSAgICAiRG9Damp2YmRVR3puTHZ2RiIsCi0gICAgIkVQRExLdmJkQU5JWXJ2eXgiLAotICAgICJFUENqanZiZEl3dENIa3BwIiwKLSAgICAiRU9ia0t2YmRKU3lCU21ZTSIsCi0gICAgIkVPYmtLdmJkd3VNZHFZbE8iLAotICAgICJFT2JqanZiZG11VlprS1NHIiwKLSAgICAiRG5jTEt2YmRTUHNmakZkWCIsCi0gICAgIkRvRExLdmJkU1FVSEplZFgiLAotICAgICJEb0RLanZiZGlWWmR3U1ViIiwKLSAgICAiRVBETEt2YmRSanhmVkdrVCIsCi0gICAgIkVPYmpqdmJkbXBaeVZrWkMiLAotICAgICJEbmNMS3ZiZGh6VWVsUk9HIiwKLSAgICAiRVBDa0t2YmR4Vk1lUlpNTyIsCi0gICAgIkVPY0tqdmJkeHhJaWFwWmsiLAotICAgICJFT2NLanZiZEpTeUJUTllNIiwKLSAgICAiRVBES2p2YmRNU1hNelVweiIsCi0gICAgIkVPYmtLdmJkSm1BRHpIVkIiIH07Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oamF2YS5sYW5nLlN0cmluZ1tdIHVudXNlZCkgewotICAgIHRyeSB7Ci0gICAgICBCdWZmZXJlZE91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oImJhZC5vdXQiKSk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0cmluZ3MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgb3V0LndyaXRlKHN0cmluZ3NbaV0uZ2V0Qnl0ZXMoKSk7Ci0gICAgICAgIG91dC53cml0ZSgiXG4iLmdldEJ5dGVzKCkpOwotICAgICAgfQotICAgICAgb3V0LmNsb3NlKCk7Ci0gICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU29tZSBleGNlcHRpb24gb2NjdXJyZWQiKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2hvdHNwb3QvdGVzdC9ydW50aW1lLzcxNTg4MDAvSW50ZXJuVGVzdC5qYXZhIGIvaG90c3BvdC90ZXN0L3J1bnRpbWUvNzE1ODgwMC9JbnRlcm5UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwY2QxYzAuLjAwMDAwMDAKLS0tIGEvaG90c3BvdC90ZXN0L3J1bnRpbWUvNzE1ODgwMC9JbnRlcm5UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCi0gKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55Ci0gKiBxdWVzdGlvbnMuCi0gKi8KLQotLyoKLSAqIEB0ZXN0Ci0gKiBAYnVnIDcxNTg4MDAKLSAqIEBydW4gc2hlbGwvdGltZW91dD00MDAgVGVzdDcxNTg4MDAuc2gKLSAqIEBzdW1tYXJ5IFRoaXMgdGVzdCBwZXJmb3JtcyBwb29ybHkgaWYgYWx0ZXJuYXRlIGhhc2hpbmcgaXNuJ3QgdXNlZCBmb3IKLSAqIHN0cmluZyB0YWJsZS4KLSAqIFRoZSB0aW1lb3V0IGlzIGhhbmRsZWQgYnkgdGhlIHNoZWxsIGZpbGUgKHdoaWNoIGtpbGxzIHRoZSBwcm9jZXNzKQotICovCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS5pby4qOwotCi1wdWJsaWMgY2xhc3MgSW50ZXJuVGVzdCB7Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZyBhcmdzW10pIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBTdHJpbmcgYmFkU3RyaW5nc0ZpbGVuYW1lID0gImJhZHN0cmluZ3MudHh0IjsKLQotICAgICAgICBpZiAoYXJncy5sZW5ndGggPT0gMCB8fCAoIWFyZ3NbMF0uZXF1YWxzKCJiYWQiKSAmJiAhYXJnc1swXS5lcXVhbHMoIm5vcm1hbCIpKSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZTogIGphdmEgSW50ZXJuVGVzdCBbbm9ybWFsfGJhZF0iKTsKLSAgICAgICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZzdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGJhZFN0cmluZ3NGaWxlbmFtZSk7Ci0gICAgICAgIERhdGFJbnB1dFN0cmVhbSBpbiA9IG5ldyBEYXRhSW5wdXRTdHJlYW0oZnN0cmVhbSk7Ci0gICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbikpOwotICAgICAgICBTdHJpbmcgdG9JbnRlcm4sIHRvRGlzY2FyZDsKLSAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgbG9uZyBjdXJyZW50ID0gMEw7Ci0gICAgICAgIGxvbmcgbGFzdCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCi0gICAgICAgIGlmIChhcmdzWzBdLmVxdWFscygiYmFkIikpIHsKLSAgICAgICAgICAgIHdoaWxlICgodG9JbnRlcm4gPSBici5yZWFkTGluZSgpKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdG9EaXNjYXJkID0gbmV3IFN0cmluZygobmV3IEludGVnZXIoKGludCkoTWF0aC5yYW5kb20oKSAqIEludGVnZXIuTUFYX1ZBTFVFKSkpLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIHRvSW50ZXJuLmludGVybigpOwotICAgICAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgICAgICAgICAgaWYgKGNvdW50ICUgMTAwMDAgPT0gMCAmJiBjb3VudCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG5ldyBEYXRlKGN1cnJlbnQpICsgIjogaW50ZXJuZWQgIiArIGNvdW50ICsgIiAwLWhhc2ggc3RyaW5ncyAtIGxhc3QgMTAwMDAgdG9vayAiICsgKChmbG9hdCkoY3VycmVudCAtIGxhc3QpKS8xMDAwICsgInMgKCIgKyAoKGZsb2F0KShjdXJyZW50IC0gbGFzdCkpLzEwMDAwMDAwICsgInMgcGVyIFN0cmluZykiKTsKLSAgICAgICAgICAgICAgICAgICAgbGFzdCA9IGN1cnJlbnQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChhcmdzWzBdLmVxdWFscygibm9ybWFsIikpIHsKLSAgICAgICAgICAgIHdoaWxlICgodG9EaXNjYXJkID0gYnIucmVhZExpbmUoKSkgIT0gbnVsbCkgeyAvLyBkbyB0aGUgc2FtZSByZWFkIGZyb20gdGhlIGZpbGUgdG8gdHJ5IGFuZCBtYWtlIHRoZSB0ZXN0IGZhaXIKLSAgICAgICAgICAgICAgICB0b0ludGVybiA9IG5ldyBTdHJpbmcoKG5ldyBJbnRlZ2VyKChpbnQpKE1hdGgucmFuZG9tKCkgKiBJbnRlZ2VyLk1BWF9WQUxVRSkpKS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICB0b0ludGVybi5pbnRlcm4oKTsKLSAgICAgICAgICAgICAgICBjb3VudCsrOwotICAgICAgICAgICAgICAgIGlmIChjb3VudCAlIDEwMDAwID09IDAgJiYgY291bnQgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihuZXcgRGF0ZShjdXJyZW50KSArICI6IGludGVybmVkICIgKyBjb3VudCArICIgbm9ybWFsIHN0cmluZ3MgLSBsYXN0IDEwMDAwIHRvb2sgIiArICgoZmxvYXQpKGN1cnJlbnQgLSBsYXN0KSkvMTAwMCArICJzICgiICsgKChmbG9hdCkoY3VycmVudCAtIGxhc3QpKS8xMDAwMDAwMCArICJzIHBlciBTdHJpbmcpIik7Ci0gICAgICAgICAgICAgICAgICAgIGxhc3QgPSBjdXJyZW50OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpbi5jbG9zZSgpOwotICAgIH0KLX0KLQotCmRpZmYgLS1naXQgYS9ob3RzcG90L3Rlc3QvcnVudGltZS83MTU4ODAwL1Rlc3Q3MTU4ODAwLnNoIGIvaG90c3BvdC90ZXN0L3J1bnRpbWUvNzE1ODgwMC9UZXN0NzE1ODgwMC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFmYTdhYy4uMDAwMDAwMAotLS0gYS9ob3RzcG90L3Rlc3QvcnVudGltZS83MTU4ODAwL1Rlc3Q3MTU4ODAwLnNoCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotIyEvYmluL3NoCi0jIAotIyAgQ29weXJpZ2h0IChjKSAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyAgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotIyAKLSMgIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0jICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotIyAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0jIAotIyAgVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0jICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSMgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyAgdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSMgIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0jIAotIyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotIyAgMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotIyAgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotIyAKLSMgIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCi0jICBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55Ci0jICBxdWVzdGlvbnMuCi0jIAotIwotIyAgIFJ1biB0ZXN0IGZvciBJbnRlcm5UZXN0LmphdmEKLSMKLQotaWYgWyAiJHtURVNUU1JDfSIgPSAiIiBdCi10aGVuIFRFU1RTUkM9LgotZmkKLQotaWYgWyAiJHtURVNUSkFWQX0iID0gIiIgXQotdGhlbgotICBQQVJFTlQ9YGRpcm5hbWUgXGB3aGljaCBqYXZhXGBgCi0gIFRFU1RKQVZBPWBkaXJuYW1lICR7UEFSRU5UfWAKLSAgZWNobyAiVEVTVEpBVkEgbm90IHNldCwgc2VsZWN0aW5nICIgJHtURVNUSkFWQX0KLSAgZWNobyAiSWYgdGhpcyBpcyBpbmNvcnJlY3QsIHRyeSBzZXR0aW5nIHRoZSB2YXJpYWJsZSBtYW51YWxseS4iCi1maQotCi1pZiBbICIke1RFU1RDTEFTU0VTfSIgPSAiIiBdCi10aGVuCi0gIGVjaG8gIlRFU1RDTEFTU0VTIG5vdCBzZXQuICBUZXN0IGNhbm5vdCBleGVjdXRlLiAgRmFpbGVkLiIKLSAgZXhpdCAxCi1maQotCi0jIHNldCBwbGF0Zm9ybS1kZXBlbmRlbnQgdmFyaWFibGVzCi1PUz1gdW5hbWUgLXNgCi1jYXNlICIkT1MiIGluCi0gIFN1bk9TIHwgTGludXggfCBEYXJ3aW4gKQotICAgIE5VTEw9L2Rldi9udWxsCi0gICAgUFM9IjoiCi0gICAgRlM9Ii8iCi0gICAgOzsKLSAgV2luZG93c18qICkKLSAgICBOVUxMPU5VTAotICAgIFBTPSI7IgotICAgIEZTPSJcXCIKLSAgICA7OwotICBDWUdXSU5fKiApCi0gICAgTlVMTD0vZGV2L251bGwKLSAgICBQUz0iOyIKLSAgICBGUz0iLyIKLSAgICA7OwotICAqICkKLSAgICBlY2hvICJVbnJlY29nbml6ZWQgc3lzdGVtISIKLSAgICBleGl0IDE7Ci0gICAgOzsKLWVzYWMKLQotSkVNTVlQQVRIPSR7Q1BBUFBFTkR9Ci1DTEFTU1BBVEg9LiR7UFN9JHtURVNUQ0xBU1NFU30ke1BTfSR7SkVNTVlQQVRIfSA7IGV4cG9ydCBDTEFTU1BBVEgKLQotVEhJU19ESVI9YHB3ZGAKLQotJHtURVNUSkFWQX0ke0ZTfWJpbiR7RlN9amF2YSAke1RFU1RWTU9QVFN9IC1mdWxsdmVyc2lvbgotCi0ke1RFU1RKQVZBfSR7RlN9YmluJHtGU31qYXZhYyAtZCAuICR7VEVTVFNSQ30ke0ZTfUludGVyblRlc3QuamF2YQotCi1jcCAke1RFU1RTUkN9JHtGU31iYWRzdHJpbmdzLnR4dCAuCi0KLSR7VEVTVEpBVkF9JHtGU31iaW4ke0ZTfWphdmEgJHtURVNUVk1PUFRTfSAtWFg6K1ByaW50U3RyaW5nVGFibGVTdGF0aXN0aWNzIC1YWDorVHJhY2VTYWZlcG9pbnRDbGVhbnVwVGltZSBJbnRlcm5UZXN0IGJhZCA+IHRlc3Qub3V0IDI+JjEgJgotQ19QSUQ9JCEKLQotc2xlZXAgNjAKLQotcHMgfCBncmVwICR7Q19QSUR9IHwgZ3JlcCAtdiBncmVwCi0KLWlmIFsgJD8gPSAwIF0KLXRoZW4KLSAgICBraWxsIC05ICR7Q19QSUR9Ci0gICAgZWNobyAiVGVzdCBGYWlsZWQiCi0gICAgZXhpdCAxCi1lbHNlCi0gICAgZWNobyAiVGVzdCBQYXNzZWQiCi0gICAgZXhpdCAwCi1maQpkaWZmIC0tZ2l0IGEvaG90c3BvdC90ZXN0L3J1bnRpbWUvNzE1ODgwMC9iYWRzdHJpbmdzLnR4dCBiL2hvdHNwb3QvdGVzdC9ydW50aW1lLzcxNTg4MDAvYmFkc3RyaW5ncy50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3Zjc2ZmIuLjAwMDAwMDAKLS0tIGEvaG90c3BvdC90ZXN0L3J1bnRpbWUvNzE1ODgwMC9iYWRzdHJpbmdzLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDMwMDAxICswLDAgQEAKLUVPY0xLdmJkZFp5UHhZcGINCi1EbmNMS3ZiZFB4bUFHcnFqDQotRG9Damp2YmRweG9JSFFkWQ0KLUVQQ2tLdmJkcVlvSGZxRVkNCi1EbmJrS3ZiZGV6dllkaVVYDQotRG5iamp2YmRlRW9SYlhDag0KLUVPYmtLdmJkYnNDa1VFS0INCi1FT2NMS3ZiZG5VdHlqaXFmDQotRG5jTEt2YmRSV25EY01IYw0KLURvQ2tLdmJkclNVa09MQW0NCi1EbmNMS3ZiZGZORndHbUprDQotRVBETEt2YmR2QWRZcm9GSQ0KLURvRExLdmJkaUdpYnlWaXUNCi1EbmNMS3ZiZFlxTkVobUZSDQotRG9Da0t2YmRFQVJobHpYWA0KLURuY0xLdmJkU1pqSHNDdkENCi1EbmNLanZiZHFUc2dScWtVDQotRG5iamp2YmRxQWlGQVhIZA0KLUVQREtqdmJkR2NqdkphaWoNCi1EbmJrS3ZiZHd0bGRweGtuDQotRG9ES2p2YmRZa3JFVG5NTg0KLUVQQ2pqdmJkYkJXRWZRUVgNCi1FUENqanZiZHVNWHdBdEJYDQotRG5jTEt2YmRic0NrVGNpYQ0KLURvQ2pqdmJkY3pZcFlaUkMNCi1FT2NLanZiZEZlaXFtaHNxDQotRG9Da0t2YmRLQ2ljUWlieA0KLUVPY0tqdmJkWkxyRVVPTG0NCi1Eb0NqanZiZGFOS2JTdG1IDQotRG9ES2p2YmRKYmpEUWpEWQ0KLUVQQ2tLdmJkZW1Gd0dtS0wNCi1FUERLanZiZFpRbGVJbUVxDQotRG5jS2p2YmRaalNoUGZiRw0KLURuYmpqdmJkcVluaEhSRVkNCi1Eb0NrS3ZiZGFSZkRJVUdMDQotRG9ES2p2YmRMcldseXVReg0KLURuYmpqdmJkWmlzSG9mYWYNCi1FT2JqanZiZGh0eWR2clViDQotRG5iamp2YmRSb3RIS0dFWA0KLUVPYmpqdmJkTmVFVGhoa0UNCi1FUENqanZiZFp0SkpaRVNuDQotRG9ES2p2YmRuUHl4dkxZYg0KLUVQREtqdmJkZUVvUmJXYmoNCi1FT2NMS3ZiZEZ4dHRhRVhiDQotRU9iamp2YmRkd3lzdFJleg0KLUVQQ2pqdmJkSnB6RW5lbkYNCi1EbmJrS3ZiZFRwcG50dUlODQotRVBDa0t2YmRUdWtwS1VCUg0KLURuYmtLdmJkaGxGRU9VY1oNCi1FT2JrS3ZiZGxoZFVRdVJhDQotRG5iamp2YmRrQ2xLcUhVZw0KLUVPY0tqdmJkcVR0R3Fxa1UNCi1EbmNLanZiZHRrd3ZhVUJYDQotRG9ES2p2YmRzUVdPakN1Zg0KLURuY0xLdmJkRUtJSnV3akENCi1EbmNLanZiZEdMRXJjSU11DQotRU9jTEt2YmROUHdwdW1mcw0KLUVPYmtLdmJkblZVekxKckcNCi1Eb0NrS3ZiZGNUREtzZEtCDQotRG5jS2p2YmRLUlpkb0ZtZQ0KLUVPY0xLdmJkZW1GdmdOS0wNCi1FUENrS3ZiZHpub3BkYmxZDQotRVBETEt2YmRPWVBWemRPVQ0KLURuYmpqdmJkc1psUHNBaE8NCi1Eb0RMS3ZiZEtDakRSS0RZDQotRG9Da0t2YmRodVplWFNWQw0KLUVQREtqdmJkT1N0VmdFdHANCi1EbmNMS3ZiZHZ3TUF2QldWDQotRVBES2p2YmRCY29hV0psZg0KLUVPY0tqdmJkWnhkS09ETVMNCi1Eb0NqanZiZGJzQ2tUY2pCDQotRU9jTEt2YmR3V2xBdWFXVg0KLURuYmpqdmJkRmVqUm5KVVINCi1EbmJqanZiZG1JZFRxVlNCDQotRG5ia0t2YmRxQkllQVdoRQ0KLURuY0tqdmJkck16SnlNSUoNCi1Eb0NrS3ZiZFpHdmRBT3NKDQotRG5jTEt2YmRqZ2dMZkZuTA0KLURvQ2pqdmJkWXFORkpNZHENCi1Eb0NrS3ZiZHFaUEhmcUR4DQotRG5jTEt2YmRPRWRUaGlMRQ0KLURvQ2tLdmJkWmlyZ3BHYWYNCi1FUERMS3ZiZHppdVFQZFN0DQotRU9ia0t2YmRLUXllT2VuRg0KLURvRExLdmJkdWFEeVNuZGgNCi1Eb0NqanZiZFZVTlVHTHZLDQotRG5jS2p2YmRBTWhZcnZ6WQ0KLURuYmtLdmJkblFaeHZLeGINCi1FUENqanZiZEJoamFrSkZqDQotRG5jTEt2YmRtZmVZTk5meQ0KLURvRExLdmJkamxiTHlkZm8NCi1Eb0RMS3ZiZHB5UElHcGN4DQotRU9jTEt2YmRuVlV6TEpxZg0KLURvQ2pqdmJkbUpFVHFWU0INCi1Eb0RMS3ZiZEpUWkFzTXhNDQotRG9Da0t2YmRuUVp4dkxaQw0KLURvREtqdmJkQUNxd2l6SlENCi1EbmNLanZiZHZCRVpTb0ZJDQotRG5jS2p2YmRHY2tWakNKag0KLURuY0xLdmJkaU1GRU50Y1oNCi1EbmJqanZiZGp1dm1jYXd3DQotRG5ia0t2YmRaeUVLTmJsUw0KLURvQ2pqdmJkdU1ZWEJVQlgNCi1EbmJqanZiZEZXWW9wTkplDQotRG9ES2p2YmRlbGZYR2xqTA0KLURuYmpqdmJkYWtMZW5tY0ENCi1FUERLanZiZGZJTFdSbXBnDQotRU9iamp2YmRTTFlldUhMVA0KLURvQ2pqdmJkTWZib2xvdGsNCi1FUERMS3ZiZHJSdUtuS2FODQotRU9jS2p2YmR5emRuUmhJaA0KLURvRExLdmJkR0FvUlpKem0NCi1Eb0NqanZiZGhsRkRuVWNaDQotRVBETEt2YmRtcFp5VmtZYg0KLURuY0tqdmJkVHBxUFV1SU4NCi1EbmNMS3ZiZEhEanZKYWlqDQotRVBETEt2YmRZbFJjc21rbQ0KLUVQRExLdmJkdmx2QU1kRk4NCi1EbmNLanZiZElzWkFybVlNDQotRU9jTEt2YmRlZ2p1cW5RZw0KLUVPY0xLdmJkWlFtRkpORlINCi1Eb0NqanZiZFp4ZEptY01TDQotRVBDa0t2YmRsWlRTVFlnVQ0KLURvREtqdmJkcWNlSlBuV0INCi1EbmNMS3ZiZFZnd3V4R3h6DQotRG5jS2p2YmREbmJrTFhERQ0KLUVQRExLdmJkYXRiSFlLc2gNCi1EbmNLanZiZEV6c3FGTGJpDQotRVBETEt2YmRuVlZaa0tSZg0KLUVPY0tqdmJkS2VlZ2JCUXUNCi1FUENrS3ZiZEtmR0hhYVJWDQotRVBES2p2YmRtSWN0UlZSYQ0KLUVQQ2pqdmJkUk14QnhuVXoNCi1EbmJqanZiZEpZVGJJTHBwDQotRVBDa0t2YmRUQUVpSGJQRQ0KLUVPY0xLdmJkZmVsWm5HZ0ENCi1Eb0NqanZiZE9TdFdHZVVwDQotRU9jTEt2YmRlbUdYSE5Kaw0KLURvREtqdmJkWVRNQW1VT3gNCi1FUENrS3ZiZHB5T2hHcGN4DQotRVBDa0t2YmRBTWd4c1d6WQ0KLURuYmpqdmJkWWtyRVRuTU4NCi1FUERMS3ZiZFVRcVBVdGdtDQotRG5jS2p2YmRlaEt1ck5xSA0KLURvQ2pqdmJkWk1TRVRuTG0NCi1Eb0RLanZiZElIR3l5WHdnDQotRU9iamp2YmRYR1l6VUFQVA0KLURvQ2pqdmJkaGJQQ2VXcVINCi1Eb0NrS3ZiZEtOQUR6R3VCDQotRG5iamp2YmRGZWlyT0pUcQ0KLURuY0xLdmJkYVJlY0h0RmsNCi1EbmJrS3ZiZHpvUHBlQ2xZDQotRU9ia0t2YmRaUk1lSk1lUg0KLURuYmpqdmJkWWZ2ZEFQU2kNCi1EbmNMS3ZiZEpjS0NxSmNZDQotRU9jTEt2YmRxdm9rYmh5Ug0KLURvRExLdmJkclJ1TE5qYU4NCi1Eb0NqanZiZFRsV1BCV09pDQotRG9Da0t2YmRqdlduRUJ4WA0KLURvRExLdmJkVGt1bmFWb0oNCi1Eb0NrS3ZiZFFaTkFIVFNLDQotRU9iamp2YmRxd1BrYmh5Ug0KLUVPY0xLdmJkTkhEUGxwVWsNCi1EbmNMS3ZiZElISFp4eFlIDQotRG5jTEt2YmR0a3hYQXRBdw0KLURuY0xLdmJkU0NFRk1KWkwNCi1EbmJqanZiZFpRbUVobGRxDQotRG9Damp2YmROR2JvbG90aw0KLURuYmpqdmJkbkNLV3dubXUNCi1EbmNMS3ZiZHpIWk1BTkV3DQotRG9ES2p2YmRtdHR5a0pyRw0KLURuYmtLdmJkbHJaVXpTY2kNCi1FUERLanZiZFNLeUdWSEtzDQotRG9Damp2YmRLVnVHRUZHaQ0KLUVQQ2pqdmJkQ0lrQmtJZWoNCi1EbmNMS3ZiZHpIWk1BTWVYDQotRG5ia0t2YmRhU0ZiZ3Nlaw0KLURuY0xLdmJkSERqdWpCaWoNCi1Eb0RLanZiZEdaVlVhRHdiDQotRG5iamp2YmRabm5KRkV6Sw0KLURvQ2tLdmJkdGNEVXdXT28NCi1Eb0NrS3ZiZGxCTW9OQUxBDQotRU9jS2p2YmROc1VXSEZVcA0KLURvRExLdmJkVlVOVUZsVmoNCi1EbmJrS3ZiZGhrZGNuVWNaDQotRG5jTEt2YmRMaUJrcVlBUw0KLUVPY0tqdmJkem9QcGRjTHgNCi1FUERLanZiZGlqR0lKbVhyDQotRU9jS2p2YmRaaXNIb2ZhZg0KLURvRExLdmJkZU9kcmtVVVMNCi1Eb0RMS3ZiZG5QeXh2S3hiDQotRVBES2p2YmRJeFVCaE1SUQ0KLURuY0xLdmJkbGhjdFJVcWENCi1Eb0RMS3ZiZG1nRlhsbkd5DQotRG5jS2p2YmRDSktiS2lHSw0KLUVPY0xLdmJkZG5kcmp0VVMNCi1EbmJqanZiZGtETGpxR3VIDQotRG5jS2p2YmRtSWNzcHRxYQ0KLURvQ2tLdmJkdnZsQXZCV1YNCi1FT2JqanZiZGpibExRZnRnDQotRG5iamp2YmRDRVFCV0tNZg0KLURuYmpqdmJkQmRQYVZpbGYNCi1Eb0NrS3ZiZFp4Y2pPRExyDQotRG9Da0t2YmRFT2JqandDZA0KLUVQREtqdmJkeVROaGxxYkgNCi1FUENrS3ZiZFVNVm9BdlBKDQotRG5jS2p2YmRVeGhVWmpvTw0KLURuY0tqdmJkcXF0am1rQW0NCi1EbmNLanZiZEtmR0lDQlJWDQotRVBDamp2YmRWck9YYWVMYw0KLUVQRExLdmJkd1hMYVdCV1YNCi1FUENrS3ZiZGpibEtxSFVnDQotRG5iamp2YmR1REN1V3VvUA0KLUVQREtqdmJkTkdicE1vdUwNCi1FT2JqanZiZEJjb2FWak5HDQotRG5jTEt2YmRyV3BNREl4cQ0KLURuY0xLdmJkaGFvQ2R3UlINCi1EbmJrS3ZiZEZ4dHVCRHdiDQotRG5jS2p2YmRJakVBS1BnRQ0KLUVPY0xLdmJkdUNidVhWb1ANCi1Eb0RLanZiZFp0SWlaRHNPDQotRG5iamp2YmRFenRSRWxDaQ0KLURuY0xLdmJkeG1zSHdzSkQNCi1EbmJqanZiZFJiRUVsSXhrDQotRG9ES2p2YmRXSHd2WGdZeg0KLUVPY0tqdmJkUWx3YlluVXoNCi1FT2NMS3ZiZFZUbHRGa3VqDQotRG5jS2p2YmRsaUVUcHRxYQ0KLURuYmtLdmJkZG9Fcmp0VHINCi1Eb0NrS3ZiZGdQYXp2ZFhoDQotRG5jS2p2YmR5U21obHFhZw0KLURvQ2pqdmJkYlBnSERremQNCi1Eb0NrS3ZiZEZXWlBvbUtGDQotRU9iamp2YmRzc1NTeHlkYw0KLUVPYmpqdmJkelFubGlKd0ENCi1FT2JrS3ZiZEtDakNwaWJ4DQotRVBDamp2YmRweU9oSFJFWQ0KLURuY0xLdmJkZGpKcXV0em4NCi1FT2JrS3ZiZEJkUUF1ak1mDQotRVBDa0t2YmRMQWpmbGJYcQ0KLURuY0xLdmJkTEJMR2xheFINCi1Eb0RMS3ZiZHJwV1BKYnVmDQotRG9Damp2YmRFS0hpdXhLQQ0KLURvQ2pqdmJkWHNNQWxzbngNCi1FT2JrS3ZiZHB0VGdTU0xVDQotRG9ES2p2YmRuSEZYbU5meQ0KLURuY0tqdmJkQ0pLYktoZWoNCi1FUENqanZiZGhsRWRPVWJ5DQotRU9jS2p2YmRLV1VmRUZHaQ0KLURvREtqdmJkWlFtRkpNZHENCi1FUENqanZiZGlHakRaV0tWDQotRU9ia0t2YmRWQWJRcnByWg0KLURvREtqdmJkZmVrek5nSEENCi1Eb0RMS3ZiZG5IRXdsbWdaDQotRG5jS2p2YmR3ekhlZXhFcg0KLURvQ2pqdmJkbXBaeHVqeUMNCi1FUERLanZiZHdNdkFNY2RtDQotRG9Damp2YmRmSGtWck5xSA0KLUVQQ2tLdmJkWXpiZlJpdXkNCi1FUENrS3ZiZFp0SWlaRHJuDQotRG5iamp2YmRqdlduRGJZWA0KLURvQ2pqdmJkT1N0VmdFdHANCi1FUERMS3ZiZFpNU0VUbWxODQotRVBES2p2YmRCaGphamhlag0KLUVQQ2pqdmJkZG9GVExVVVMNCi1EbmJrS3ZiZHNRVm9KY1dHDQotRVBDamp2YmRyRUZKUU52Qg0KLURvQ2pqdmJkTXBZUldPR3MNCi1FT2NMS3ZiZFppcmdwSEJmDQotRVBETEt2YmR5T1RJWHNKRA0KLURvQ2tLdmJkS1JaZG5mTmUNCi1EbmJqanZiZGJCV0ZGb293DQotRVBDamp2YmRnRmxabkhIQQ0KLURuYmtLdmJkR0dKck9Jc3ENCi1Eb0RMS3ZiZHVEQ3R3V1BQDQotRU9iamp2YmROZGRVSWhqZA0KLURuYmpqdmJkeHNOaU1xYWcNCi1FT2JqanZiZGRlT3JDV2JqDQotRU9iamp2YmRQeG1BR3NSag0KLUVPY0xLdmJkZGVPckNYREsNCi1Eb0RMS3ZiZGRlT3JCd0NqDQotRG9Damp2YmRWcW5ZQ0VsRA0KLURuYmtLdmJkVXlJVVpqb08NCi1FT2JqanZiZGVGT3JDWERLDQotRU9ia0t2YmRWck54Q0ZMYw0KLUVPYmpqdmJkVGZ6bWt3V0YNCi1FT2NLanZiZElIR3paWVlIDQotRVBES2p2YmR0YmJ1WFdQUA0KLURvQ2pqdmJkWmlzSVFIQmYNCi1FT2JqanZiZGJzQ2tVRGpCDQotRVBDa0t2YmRWd0pYdWRGSA0KLUVQREtqdmJkcm91b0tEVmYNCi1FUENrS3ZiZEZ5VlZCRVlDDQotRG5jTEt2YmRabm5JZUV6Sw0KLUVQRExLdmJkeFZORlF4a24NCi1Eb0RLanZiZHB4bmdnUkR4DQotRG9ETEt2YmRxWk9nZnBjeA0KLURuY0tqdmJkQ0lqYWtKR0sNCi1FUENrS3ZiZENKTEJqaGVqDQotRG9ETEt2YmRuUHpZdkt4Yg0KLUVPY0tqdmJkcVRzZ1NSa1UNCi1FT2NMS3ZiZExCTEdsYXhSDQotRG9ETEt2YmRjYlRNckFVTg0KLURuY0xLdmJkeml0b29kU3QNCi1Eb0RLanZiZEp2VWZEZGZpDQotRU9jTEt2YmRIRGp2S0NKag0KLUVQQ2tLdmJkZU9lVEtzc3INCi1EbmJrS3ZiZGxZcnFzWWZ0DQotRG5jTEt2YmRpaWVoS014Uw0KLURuY0tqdmJkVVJRb1ZVaE4NCi1EbmJrS3ZiZHVNWVhCVUF3DQotRG9ETEt2YmRTUHRISmZFWA0KLUVPYmtLdmJkcUJKRkFXZ2QNCi1FT2NLanZiZEZwQVRXZ0Z5DQotRG9ETEt2YmRCc0JEVGZYUw0KLURuY0tqdmJkamhITGZGbWsNCi1Eb0NqanZiZENKS2FrSWZLDQotRG5ia0t2YmRkb0ZTanRUcg0KLUVPYmtLdmJkQU5JWXNXelkNCi1FT2JqanZiZENUQWJ0RnZyDQotRU9iamp2YmRyUnRrT0xBbQ0KLURuYmtLdmJka3hzU1RZZ1UNCi1Eb0NqanZiZG5CaXdYbm11DQotRU9iamp2YmR3dG1FcVlsTw0KLUVQREtqdmJkcnlsUVRBaE8NCi1Eb0RMS3ZiZHRiYnR2dk9vDQotRVBDamp2YmRaTHJFVG1sTg0KLUVQRExLdmJkV1hKWVdEZGcNCi1Eb0NrS3ZiZEtRekZPZk9GDQotRVBDamp2YmR3eklGZlhlUw0KLURuY0tqdmJkUmp5RnVITFQNCi1FUERMS3ZiZFVMdW5hV1BKDQotRG5jS2p2YmRVeGhUeWtPbg0KLURuYmtLdmJkSmNLQ3FLRFkNCi1FUERMS3ZiZGNiU21TQVRtDQotRG5ia0t2YmRlZ2p1ck5xSA0KLUVQREtqdmJkWmpUSVFHYkcNCi1FUENqanZiZGlMZGROdUN5DQotRG9Damp2YmRaUWxkaU5FcQ0KLUVPY0xLdmJkYWtNR1BPREENCi1FT2JqanZiZG5IRXdsbWdaDQotRU9jTEt2YmRCc0FjVUdYUw0KLUVQQ2tLdmJkaVZaZHdTVWINCi1FT2NMS3ZiZGRDVE5TQVVODQotRG5ia0t2YmRFWHhNVVVVTQ0KLURuY0tqdmJkWXBsZGlNZVINCi1Eb0RLanZiZE5kZFRpSWpkDQotRG9ETEt2YmRaTHFkVU5sTg0KLUVQQ2tLdmJkaUJuY0ZXcHENCi1EbmNMS3ZiZGlDUERFdnFSDQotRU9jS2p2YmRVeUhzektvTw0KLURuY0tqdmJkaHR5ZHZxdGINCi1FUENqanZiZHB4b0hnUWN4DQotRU9ia0t2YmRrV1duRGF4WA0KLURuYmpqdmJkQmhrQmtKRmoNCi1Eb0NrS3ZiZFJhY2RraHlMDQotRU9jTEt2YmRaalRIcEhDRw0KLUVQQ2tLdmJkTW93cVdPR3MNCi1EbmNMS3ZiZGVnanVyTnBnDQotRU9iamp2YmRmTWZXZm1LTA0KLUVQRExLdmJkWmlyZ3BHYWYNCi1Eb0RMS3ZiZGladUZsUW5HDQotRG5jTEt2YmRGeHVWQWN4Qw0KLUVPYmtLdmJkWmlzSG9mYWYNCi1FT2NLanZiZEpTeUJTbVlNDQotRVBETEt2YmRWWWd0WmtQTw0KLUVPY0tqdmJkUmJFRk1KWWsNCi1EbmNMS3ZiZHJFRklvbldCDQotRG5jS2p2YmRLREpicUpjWQ0KLUVPY0xLdmJkaGZqQ3h1aXUNCi1FT2JqanZiZExMQWhXQUtaDQotRG9Da0t2YmRSWE5jYmxJRA0KLURvRExLdmJkY2JTbVNBVG0NCi1FT2NMS3ZiZHdXbEF2QXV1DQotRU9ia0t2YmRpQm5iZHZwcQ0KLURvQ2tLdmJkTlFYcHVtZ1QNCi1EbmNMS3ZiZGtWd09FQ1lYDQotRG5ia0t2YmRmb2F6d0R4SQ0KLURvRExLdmJkYkJXRkZwUHcNCi1Eb0RMS3ZiZHZCRHhzUEVoDQotRVBES2p2YmRKcVpkb0ZtZQ0KLURvRExLdmJkSXJ5QXJtWGwNCi1FUENqanZiZEFOSVpTd1p4DQotRVBDa0t2YmRWaFlWeEd4eg0KLURuY0tqdmJkTEFqZ05DWVINCi1EbmNLanZiZHh4SWpDUVprDQotRG5jS2p2YmRiaU5LS2V3WQ0KLUVQQ2pqdmJkbHJaVlpzRUoNCi1FUERLanZiZElyeUFzTXdsDQotRG9Da0t2YmR0QUhSSUFBcg0KLUVQREtqdmJkSm1BRVpmdUINCi1FUENrS3ZiZFpqU2dvZ0JmDQotRG9ETEt2YmRPWG51emNuVQ0KLURuYmtLdmJkZWhLdlJuUWcNCi1FT2JqanZiZFp5RGltYmtyDQotRG9ES2p2YmRtYWpXd29PVg0KLUVPY0tqdmJka01hbFplSFANCi1FT2NLanZiZElqRUFKcEhFDQotRVBDa0t2YmREaWhLVnhLQQ0KLURuY0tqdmJkTmRkVUlpS2QNCi1FT2JqanZiZHFkRklwT1dCDQotRG9Da0t2YmR4blNoWHNKRA0KLURvRExLdmJkam1Ca3pFZm8NCi1FT2NMS3ZiZGF0YWdZTFRoDQotRG9Damp2YmRWaFlWeEhZeg0KLURuYmpqdmJkSmJqRFJLRFkNCi1FUENqanZiZExCTEhOQ1lSDQotRG5iamp2YmRuR2VZTk9HeQ0KLUVPY0xLdmJkVXNtVGVrdksNCi1FUENqanZiZHRreFhCVGFYDQotRVBDamp2YmR6b1BxRkNreA0KLURuY0tqdmJkQ0lqYktoZWoNCi1EbmNLanZiZFpMcWRUbWttDQotRG9ES2p2YmRzUHVuaWNWZg0KLUVPY0tqdmJkbWdGWG1OZ1oNCi1FT2JrS3ZiZGlNRkVOdUN5DQotRG9ES2p2YmRoYW5iZVhSUg0KLUVPYmtLdmJkQUNxd2l5aHANCi1EbmNLanZiZFppc0lRSEJmDQotRVBDamp2YmRnUUJ6d0R3aA0KLURuYmpqdmJkeVlKSmFveWsNCi1Eb0RLanZiZHhVbGRxWk1PDQotRU9ia0t2YmRrQ2xMUWdWSA0KLUVQQ2pqdmJkWlFsZGlNZVINCi1FUERMS3ZiZFp5RUtPQ2xTDQotRVBETEt2YmRjSWxpa0Z2eA0KLURvREtqdmJkcnpNUVRCSG4NCi1EbmJqanZiZFZZZ3Raa1BPDQotRG9ETEt2YmRIRUt1aWFqSw0KLUVQQ2tLdmJkY3paUVh4cUMNCi1Eb0RLanZiZHJEZGlRTnVhDQotRG5jTEt2YmRjSW1LTEdXeA0KLURvQ2pqdmJkVllndFprUE8NCi1FUERMS3ZiZFpubkllRlpqDQotRVBES2p2YmRNSWFrcVlBUw0KLURvQ2tLdmJkU0xZZlVnTFQNCi1FUERMS3ZiZGlDT2JkdnBxDQotRG5iamp2YmRScFVIS0Zjdw0KLURvRExLdmJkSUhIWnlZWGcNCi1FUENqanZiZHlwb01oaXdBDQotRG5ia0t2YmRDRVBhVmpNZg0KLURuYmtLdmJkZXJBdnpsRFANCi1EbmJrS3ZiZFpRbGVJbUZSDQotRU9jS2p2YmRLUlpkbmVtZQ0KLURvRExLdmJkaUJuYmVYUXENCi1EbmNMS3ZiZEVQREtqdmNFDQotRU9jTEt2YmRhdUNHd2tUaA0KLURuY0xLdmJkRXZaUVBtSmUNCi1FUENrS3ZiZFVSUW51VklODQotRG5jTEt2YmRlZ2p2U09RZw0KLUVQQ2pqdmJkS2FLZ01hd3ENCi1EbmJrS3ZiZFJ6S0lTYnZBDQotRG5jTEt2YmRpTGRjblVjWg0KLUVQRExLdmJka0RNS3BmdUgNCi1Eb0RMS3ZiZFJiRGRraHlMDQotRG5iamp2YmREd3hNVVVUbA0KLURuYmtLdmJkcnBXUEtDdWYNCi1EbmJrS3ZiZE5WU3FqbUFYDQotRG9ES2p2YmRSYkRlTUl4aw0KLUVPY0xLdmJkY3l4cFh5UkMNCi1EbmNMS3ZiZFJNd2JZblV6DQotRU9iamp2YmRxbHpKeGxIaQ0KLURvQ2tLdmJkSllVQ0lNUXANCi1EbmNMS3ZiZExaUWpTenVHDQotRU9jS2p2YmR4Vk5FcVlrbg0KLURuYmtLdmJkWm9PSWVGWmoNCi1Eb0NqanZiZEJyYUN0RndTDQotRU9jTEt2YmRsaURzcVZTQg0KLUVQQ2tLdmJkZUFUcU5YaWYNCi1EbmNMS3ZiZGtNYkx5ZGdQDQotRU9iamp2YmRaeGRKbWJrcg0KLURvQ2pqdmJkcmFlbGxITFoNCi1FT2JrS3ZiZHVEQ3VXdlBQDQotRG9Da0t2YmRwc3RHclNMVQ0KLURvQ2pqdmJkTEdGZ2JCUXUNCi1EbmJrS3ZiZGh0ekZXcXVDDQotRU9iamp2YmRvQUt6dEhkTw0KLUVQRExLdmJkYXRhZnhLdEkNCi1FUERLanZiZGtXWE5jYXd3DQotRG9Da0t2YmR3a1hFSHp6Rw0KLUVPYmtLdmJkbWdFd21OZ1oNCi1EbmNLanZiZEJpTENMSkZqDQotRG9Damp2YmRlT2RzS3Nzcg0KLUVPY0xLdmJkZklMV1NPUkgNCi1FT2JrS3ZiZENEcEF1ak1mDQotRVBES2p2YmRLREtEUWlieA0KLURvREtqdmJkVlVNdEdMdWoNCi1FT2JrS3ZiZHJYUU1DaVlxDQotRG5jS2p2YmRlUEVzTFR0Uw0KLURuY0xLdmJkRHhZTHRVVGwNCi1FUENrS3ZiZEdZdVZCRVlDDQotRG5jTEt2YmROZUVVSWlLZA0KLUVQQ2tLdmJkcHhvSUhSRHgNCi1FT2JqanZiZEZrRXNESGx1DQotRU9iamp2YmRzc1NTeHpGRA0KLURvQ2tLdmJkVXROVGZNVmoNCi1EbmJqanZiZEpjS0RSS0RZDQotRG5jS2p2YmRxaUFLRW1PZQ0KLURvREtqdmJkdGxYd0F0QlgNCi1EbmJrS3ZiZHhtc0lZVEljDQotRU9ia0t2YmRMclhNelVweg0KLURvQ2pqdmJka3hzU1N4ZnQNCi1EbmNLanZiZFFsd2F4blV6DQotRU9ia0t2YmRqaEdsRmZOaw0KLUVQQ2tLdmJkeHNOaG1SYWcNCi1Eb0RMS3ZiZE1mY1BtUVVrDQotRG9ES2p2YmRRdm5FRExoRA0KLUVPYmpqdmJkVmd4VnhIWXoNCi1Eb0RMS3ZiZGxyWXR5cmRKDQotRG9Damp2YmRlenZZZUlzdw0KLURuY0xLdmJkTmRkVGlJamQNCi1FUERMS3ZiZEdHSnJOaVVSDQotRVBETEt2YmRSekpoVERXQQ0KLUVQQ2pqdmJkdnZrYVdCVnUNCi1FT2NLanZiZFJYTmRDa2djDQotRU9jS2p2YmRRWk5BSFRTSw0KLUVQQ2tLdmJkc0NHTkxma1oNCi1FT2NMS3ZiZER3d2t0VHNsDQotRU9jTEt2YmRxbHpKeUxnaQ0KLUVPY0xLdmJkeHNOaU1xYWcNCi1FT2NMS3ZiZGh6VkZsUk9HDQotRU9jS2p2YmRFenRSRk1DaQ0KLURuYmtLdmJkcWlBSmRtUEYNCi1FUERMS3ZiZGpjTUtxR3RnDQotRU9ia0t2YmRUbFdPYVdPaQ0KLUVQRExLdmJkVVJSUFV1SG0NCi1Eb0RLanZiZGVsZldnTktMDQotRU9jTEt2YmRHQW5xWkp6bQ0KLUVPYmpqdmJkR1pVdUFkWGINCi1Eb0RMS3ZiZHVMd3dBdEF3DQotRG9Damp2YmRaalRJUUdiRw0KLUVQQ2pqdmJkUk5YYlluVXoNCi1FUERMS3ZiZGlMZUVOdGJ5DQotRU9iamp2YmRNb3dwdW5Hcw0KLUVPY0tqdmJkYmlOSmpldngNCi1Eb0RLanZiZEVZWUxzdFRsDQotRG9ETEt2YmRxVVRmclJqdA0KLURvREtqdmJkYnNDa1VFSmENCi1Eb0RLanZiZFhzTUJOVVBZDQotRVBDamp2YmRSTlhheG5Veg0KLURvRExLdmJkTkdjUU5RVWsNCi1EbmJqanZiZEVBUmlNeXdYDQotRVBES2p2YmRTS3hmVWZrVA0KLURuY0tqdmJkaHR5ZVhSdGINCi1EbmNLanZiZFpMcWNzbkxtDQotRU9ia0t2YmRabm1oZUV6Sw0KLUVPYmpqdmJkdGJjVXZ1bm8NCi1EbmJqanZiZHJ6TVFUQkhuDQotRG5iamp2YmREd3drdFRzbA0KLUVQREtqdmJka3hzU1RZZ1UNCi1Eb0RLanZiZElyeUFybHhNDQotRG9ES2p2YmRuQml2eE9uVg0KLURvREtqdmJkZUFUcGx3aWYNCi1FT2NMS3ZiZEtlZWdiQXB1DQotRVBDamp2YmRNZ0RRTW90aw0KLURvQ2pqdmJkdUNidHdXT28NCi1EbmJrS3ZiZHlOc0h3cmhjDQotRG5ia0t2YmR0dk54SnBzQQ0KLUVPY0xLdmJkcUFoZUFXZ2QNCi1Eb0NrS3ZiZFVSUW9VdGdtDQotRU9jS2p2YmRxY2VJcE9XQg0KLURvQ2tLdmJkVndJd3VkRkgNCi1EbmJrS3ZiZGJMTUZubWNBDQotRU9jTEt2YmRaalRIcEhCZg0KLUVPY0tqdmJkUlhOZENraEQNCi1FUERMS3ZiZGlISmNaVml1DQotRG9Damp2YmR4eElqQ1B6TA0KLURuYmtLdmJkQmNwQldKbUcNCi1FUENrS3ZiZFp5RUtPQ2tyDQotRVBES2p2YmRPVFVXSEZWUQ0KLURvQ2pqdmJkSUdnWnh3d2cNCi1FUERMS3ZiZEZqZVNiaE11DQotRVBETEt2YmRoZ0tDeHZKdQ0KLUVPY0xLdmJkTnNVV0dkdHANCi1FUERLanZiZHVWblhpcHNBDQotRG5jTEt2YmRHWXVWQkVYYg0KLUVQRExLdmJkWnRJaHlFU24NCi1Eb0RLanZiZFp4ZEptY0xyDQotRG9Damp2YmRVc2x0R0x1ag0KLURvREtqdmJkRG9ETEt2YmQNCi1EbmNMS3ZiZHJEZGhwTnZCDQotRVBETEt2YmRLQ2pEUkpieA0KLURvRExLdmJkeExXZEh6eWYNCi1FT2JrS3ZiZHJ6TVFUQWhPDQotRU9jTEt2YmRPRkR0SkpLZA0KLUVQQ2tLdmJkclNWS21qYU4NCi1FT2NLanZiZFdXaVlWZEVnDQotRU9jS2p2YmRXV2h3dkRkZw0KLURuY0tqdmJkcHN0SFJxanQNCi1FUENrS3ZiZEtXVkZjZUdpDQotRG9Da0t2YmRaalNoUGZiRw0KLURvQ2tLdmJkU3hLbE56a1kNCi1FUERMS3ZiZEl3dENIa3FRDQotRU9jS2p2YmRzQ0dOTGdMWg0KLURuY0tqdmJkemFBT2ZnQ00NCi1Eb0RMS3ZiZHhtcmhZU2lEDQotRG5jTEt2YmRmTWZXZ01qTA0KLUVQREtqdmJkcUZkRXN1YUkNCi1FT2NMS3ZiZGlMZURuVWNaDQotRG9Damp2YmRLVnVGY2VISg0KLURvQ2pqdmJkZmVrek5nSEENCi1FT2NLanZiZE9GRVRoaUxFDQotRVBETEt2YmRxY2VKUG5XQg0KLURvRExLdmJkdUNidHdXT28NCi1EbmNLanZiZFRxUk90dUlODQotRG5jS2p2YmRwZWRGVVdCSQ0KLURvRExLdmJkckVGSlFOdWENCi1Eb0RMS3ZiZHlYaGpDUHlrDQotRVBDa0t2YmRKWVVCaExxUQ0KLUVQQ2tLdmJkdGNDdVhWbm8NCi1Eb0RMS3ZiZFpMckVVT0xtDQotRVBDa0t2YmRwc3RHclJqdA0KLURuY0xLdmJkZGVQU0NYQ2oNCi1FT2JrS3ZiZGF1Q0hYanNoDQotRG9ETEt2YmRrSGZrZWZOaw0KLUVPYmpqdmJkTVJ3TXpVcHoNCi1FT2JqanZiZGFNa0NUVk5IDQotRG9Da0t2YmRHR0pyTmh0Ug0KLUVQRExLdmJkdkJEeHJuZUkNCi1FUERMS3ZiZElISFp4d3hIDQotRU9jTEt2YmRySkFKZG1QRg0KLUVPY0tqdmJkR1pVdUFkWGINCi1FT2NMS3ZiZGJVYkhZTFVJDQotRG5iamp2YmRKem9mWUVBTg0KLUVQREtqdmJkRnh0dUJEeEMNCi1EbmJrS3ZiZFF2bkRia2djDQotRVBES2p2YmRKbUFEekd0YQ0KLURvREtqdmJkWlJNZGhsZVINCi1EbmJrS3ZiZHNycXNaWmVEDQotRU9ia0t2YmRyb3ZQSmJ1Zg0KLUVQQ2pqdmJkZGVPcWJYQ2oNCi1FT2JqanZiZHRjRFZYVm9QDQotRG5jS2p2YmRNZmJwTlFWTA0KLURvQ2tLdmJkaGJQQ2VYUXENCi1Eb0NrS3ZiZE5IQ29tUVZMDQotRU9iamp2YmR2QkR4cm9GSQ0KLUVQQ2pqdmJkbkJpdndvTnUNCi1FT2JqanZiZGJobGpLZXdZDQotRVBES2p2YmRaeURpbWNNUw0KLUVPYmtLdmJkV1NPWGJFbEQNCi1FT2NLanZiZFRmem5NWFZlDQotRVBDamp2YmRadEpKWWNzTw0KLURvQ2pqdmJkUmp4ZlZITFQNCi1Eb0NrS3ZiZFZUbHRHTVZqDQotRG5jS2p2YmRZZndFQU9yaQ0KLURuY0tqdmJkWWtyRVVPTU4NCi1FT2JrS3ZiZHFHRUVzdWFJDQotRG5jTEt2YmRqSmZIaW1Ycg0KLUVQRExLdmJkZG5kc0xVVHINCi1EbmJrS3ZiZHFCSkZBV2hFDQotRVBETEt2YmRFT2NLandERQ0KLUVQQ2tLdmJkdHZPWUpxVEENCi1EbmNMS3ZiZGt5VFJzWkhVDQotRG9Damp2YmRUcHBudVZJTg0KLURuY0xLdmJkd3loRmV3ZVMNCi1EbmNLanZiZHNCZWxrZ0t5DQotRG9Damp2YmRLREtDcUpjWQ0KLURvQ2pqdmJka0NsS3FIVkgNCi1Eb0NqanZiZGNUQ2p0RGlhDQotRVBETEt2YmRVVmtwSnRBcQ0KLUVQRExLdmJkUnlqSVRDdkENCi1EbmJqanZiZEp1dUZjZGdKDQotRG9ES2p2YmRySkFKZG1PZQ0KLURuY0tqdmJkSmNKYnFLQ3gNCi1Eb0RMS3ZiZEpjSmJxSmNZDQotRG9ES2p2YmRlRW9TQ1hESw0KLURvRExLdmJkU3dqbE56a1kNCi1FT2JqanZiZHppdG9wRHJ0DQotRG9Da0t2YmRLV1ZHRUVnSg0KLURuY0tqdmJkcHNzZnFyS3QNCi1FT2NMS3ZiZFVNV1BCVm9KDQotRG5jS2p2YmR5emRtcklJaA0KLUVQQ2pqdmJkeFVsZHFaTG4NCi1Eb0RMS3ZiZHlTbkltUmJIDQotRG9Damp2YmRHZEt2SmFpag0KLURvQ2tLdmJkeFpnZWV3ZHINCi1FT2JrS3ZiZGlMZGROdURaDQotRG5iamp2YmRTQ0Rka2laTA0KLURuY0tqdmJkem5wUkVjTVkNCi1FT2NMS3ZiZGFSZWJoVGZMDQotRG5iamp2YmRaUWxkaU1kcQ0KLUVQQ2pqdmJkYnJianRFS0INCi1FT2NLanZiZEVBUmlNelhYDQotRG9ETEt2YmRYcmthTlRueA0KLUVQQ2tLdmJkUVpOQUhUUmoNCi1Eb0RMS3ZiZEV6c3BlTGNKDQotRVBDamp2YmR1Vm5ZS1JUQQ0KLUVPYmpqdmJkSlh0QmhNUXANCi1FUERLanZiZGVPZHJqc3NyDQotRVBDamp2YmRMcXdNeXRweg0KLUVQREtqdmJkVU1Wb0JWb0oNCi1EbmNLanZiZFJwVUdpZkR3DQotRVBETEt2YmRaeURpbkRMcg0KLURuYmtLdmJkTnJzdWZlVlENCi1FUENrS3ZiZFpNU0R0TmxODQotRVBDa0t2YmR5U25KTlNDSA0KLUVQQ2pqdmJkZk1ldmZsakwNCi1EbmNMS3ZiZFhzTUJOVG54DQotRG5ia0t2YmRweG9IZnFEeA0KLURuY0xLdmJkVVFwbnR0aE4NCi1EbmNLanZiZElzWkFybHdsDQotRG9ETEt2YmRaR3dFQU9zSg0KLUVPY0tqdmJkVnZod3ZEZGcNCi1FT2NMS3ZiZHVXTnhKcVRBDQotRVBDamp2YmRIRUt2SmFpag0KLURvREtqdmJkcnBXT2pDdWYNCi1EbmNMS3ZiZHJwV09qRFZmDQotRG9Damp2YmRJSEd6WXd3Zw0KLURvRExLdmJkcHhvSUdxRVkNCi1Eb0RMS3ZiZEpjSmJxS0RZDQotRG9Damp2YmRSV21kQ2xIYw0KLUVQQ2pqdmJkRldZb3BOSmUNCi1EbmNLanZiZG1mZHdsbWZ5DQotRG9Da0t2YmR4VWxlUXhsTw0KLUVPYmpqdmJkbkdkeE1uR3kNCi1FUENqanZiZHZ2bEF2QlZ1DQotRG5jTEt2YmRkbmRzS3Nzcg0KLUVPYmpqdmJkWk1SY3NuTG0NCi1FT2NLanZiZEZ4dHRhRVhiDQotRG5jS2p2YmRWVU5UZk1Wag0KLUVPY0xLdmJkTnJ0V0hGVXANCi1Eb0RLanZiZHd1TWRxWWxPDQotRVBETEt2YmRyWFBrYmh4cQ0KLUVPYmpqdmJkckVGSXBOdWENCi1FT2JqanZiZHppdVFRRHJ0DQotRU9jTEt2YmRxWW9JR3BjeA0KLURuYmpqdmJkc1FWb0pjVmYNCi1FT2JrS3ZiZGtETUtwZ1VnDQotRU9iamp2YmR2QkR5VFBGSQ0KLURuY0tqdmJkdUNidVd2T28NCi1FUENqanZiZGtWdm5FQ1lYDQotRG5jTEt2YmRaR3ZkQU9yaQ0KLURvQ2tLdmJkclhQbERKWlINCi1FT2NMS3ZiZHVDY1ZXdk9vDQotRG9ES2p2YmRDRVBhV0psZg0KLUVQREtqdmJkZG9Fcmpzc3INCi1EbmNLanZiZEFDcXhLWmlRDQotRVBDamp2YmRVVmxQaXRBcQ0KLUVQREtqdmJkakpmSGpNeFMNCi1FT2JrS3ZiZEFNaFlzV3pZDQotRG9ES2p2YmRuQml2eE9tdQ0KLUVPY0xLdmJkYmlOS0tmWFkNCi1FUERLanZiZFlxTWVJbGVSDQotRU9ia0t2YmRKbUFEeWdVYQ0KLUVPYmpqdmJkRVBETExXY0UNCi1FUENqanZiZHJYUGtjSXhxDQotRU9jTEt2YmRsaUR0UXRxYQ0KLURvQ2pqdmJkbW95eHVqeUMNCi1FUERMS3ZiZGRvRlRMVHNyDQotRU9jTEt2YmRDV3pkSkVwVw0KLURuYmpqdmJkckVFaHBPV0INCi1Eb0RLanZiZFpMckR0TmttDQotRU9jTEt2YmRMRmZIYkFxVg0KLUVPY0tqdmJkbXR0ekxLU0cNCi1FT2NMS3ZiZG1iSnZ3b09WDQotRU9jS2p2YmRVYUNRcnFTWg0KLURuYmpqdmJkbWdFeE1uR3kNCi1FUERLanZiZGRuZHJrVVVTDQotRU9ia0t2YmREd3drc3RUbA0KLURvQ2tLdmJkY0pNakxGd1kNCi1EbmJqanZiZGFOTEJydU1nDQotRG9ETEt2YmRRWW1BSFRSag0KLURuYmtLdmJkc1FXT2ljV0cNCi1FT2JrS3ZiZE1Sd016VXB6DQotRG9ETEt2YmRac2hpWkRybg0KLUVQRExLdmJkblB6WXVqeGINCi1FT2NLanZiZENFUUF1ak1mDQotRVBETEt2YmRLZWZIYkFwdQ0KLURvRExLdmJkWXBsZGlORlINCi1Eb0NrS3ZiZEZXWlFRTkplDQotRG5jTEt2YmR6bnBRZUNreA0KLUVPY0tqdmJkblFaeHZLeGINCi1Eb0NrS3ZiZFZCQnBycHF5DQotRG5ia0t2YmRaaXJoUGZhZg0KLURuYmtLdmJkZWdqdlNOcUgNCi1FT2NMS3ZiZHFkRWlQbldCDQotRU9iamp2YmRCaGtDS2lHSw0KLUVPYmpqdmJkeFpnZkdZRlMNCi1EbmJqanZiZE5RWVF1bWdUDQotRVBDamp2YmR4c05obHJCZw0KLURvQ2tLdmJkUWREQXBSRHINCi1Eb0NrS3ZiZHh4SWlhb3lrDQotRVBES2p2YmRGZWlyTmh0Ug0KLURvQ2pqdmJkZWdqdlNPUWcNCi1FT2JrS3ZiZHFjZGlRTnZCDQotRG5jTEt2YmRpTUVkTnRjWg0KLURuY0xLdmJkVHFSUFV0aE4NCi1FUENrS3ZiZHd5Z2VleEZTDQotRG9ES2p2YmR5VE9KTXJCZw0KLURuY0xLdmJkZUVvUmF2YmoNCi1FUENqanZiZHRiY1V2dk9vDQotRU9iamp2YmRLQ2ljUkpjWQ0KLUVPYmpqdmJkWnlFS09ETVMNCi1EbmJqanZiZG1KRHRRdHJCDQotRG5jTEt2YmRFQVJobHl2dw0KLURuYmpqdmJkSXhUYklMcVENCi1FT2NMS3ZiZHd5Z2VmWUZTDQotRG9Damp2YmR6bm9xRkNreA0KLURvQ2pqdmJkUnBVR2pHRHcNCi1EbmNLanZiZGh6VkdNUW5HDQotRVBDamp2YmRoa2VEblZDeQ0KLUVPYmtLdmJkT0VkVUlpS2QNCi1EbmNLanZiZHJEZUlvbXVhDQotRG5jTEt2YmRpSEpieHVpdQ0KLUVQREtqdmJkZHhac3RSZXoNCi1FUERMS3ZiZG1TWXVacmRKDQotRU9ia0t2YmRWVU5VRmt2Sw0KLUVQRExLdmJkTmVFVUpJamQNCi1Eb0NrS3ZiZGlNRWROdUN5DQotRG9ETEt2YmRSRGNBcFFjcg0KLUVQQ2pqdmJkVGxWb0JWb0oNCi1FT2JqanZiZExCS2dOQndxDQotRVBDa0t2YmRzQ0ZsbEhLeQ0KLUVPYmpqdmJkblZVekxKcWYNCi1Eb0RLanZiZHFyVkxOa0JODQotRG9Da0t2YmRxRmNkdFdCSQ0KLURuY0xLdmJkYlZDR3hMVGgNCi1FT2NMS3ZiZGVGUFNDWENqDQotRU9jTEt2YmRScFRnS0ZkWA0KLUVPYmpqdmJkem5wUWVETHgNCi1FT2NLanZiZGp2WE5jYXhYDQotRG5iamp2YmRIRGtXSmJKag0KLURuY0tqdmJkaGtlRU51RFoNCi1EbmJrS3ZiZG5VdHlqalNHDQotRG9ES2p2YmRTUVVISmZEdw0KLURuY0tqdmJkYlViSFlMVUkNCi1FT2NMS3ZiZE5zVHZHZHVRDQotRVBETEt2YmRTWmlnc0N2QQ0KLURuY0tqdmJkTWZjUGxwVWsNCi1Eb0RMS3ZiZHhybklsckJnDQotRG5jS2p2YmRpTGRjblZDeQ0KLUVQQ2pqdmJkbWZlWU5PSFoNCi1Eb0NrS3ZiZGp2V21jYXhYDQotRG9ES2p2YmRiVWJIWGtVSQ0KLURuY0tqdmJkQmhrQmppRmoNCi1Eb0RMS3ZiZE5IQ29scFZMDQotRU9jS2p2YmRyeWtvc0FoTw0KLURuY0xLdmJkcUdEZVVWYUkNCi1EbmJrS3ZiZGhnSmNaVml1DQotRG5iamp2YmR1THhYQXRCWA0KLUVQQ2pqdmJkWXBsZUpORlINCi1FUERMS3ZiZFF2bWRDbEhjDQotRG5iamp2YmRKWVRiSU1SUQ0KLURuY0xLdmJkem5wUkZETVkNCi1FT2NMS3ZiZFpubWlGRXlqDQotRG5ia0t2YmRyUnVMT0xBbQ0KLUVPYmtLdmJkaGtlRU9VYnkNCi1EbmNMS3ZiZFlsU0VVT0xtDQotRG9Damp2YmRoa2RjbXRieQ0KLURuY0xLdmJkZGRuckNYREsNCi1Eb0RMS3ZiZEthTEhOQ1lSDQotRU9jS2p2YmRjeXhwWVpRYg0KLUVQRExLdmJkQUNxd2paaHANCi1Eb0NrS3ZiZEJzQkRUZXZyDQotRU9ia0t2YmRlS0pxdlV6bg0KLUVPYmtLdmJkY0ltSmtHV3gNCi1EbmNMS3ZiZFlTbEFsdE94DQotRG5jTEt2YmRscll0eXJkSg0KLUVPYmtLdmJkS3hxSnJ6dGYNCi1FT2NLanZiZHNRV1BKY1ZmDQotRG9ES2p2YmRreVNxcnhnVQ0KLUVPYmpqdmJkZUVvUmJYQ2oNCi1FT2NLanZiZEhEa1ZqQmlqDQotRG9ETEt2YmRDVEJDc2ZYUw0KLURvQ2pqdmJkS0NqRFFpYngNCi1Eb0NqanZiZGxoZFRxVXJCDQotRG9ES2p2YmRUdWxRS1RhUg0KLURvQ2tLdmJkUmp4ZXRma1QNCi1FUENqanZiZEV1eVFRTktGDQotRVBDamp2YmREb0RLa1hERQ0KLURvQ2pqdmJkc1FXUEpidWYNCi1Eb0RLanZiZGh1WmR2cXRiDQotRVBETEt2YmRpSEtDeVdKdQ0KLUVQRExLdmJkTEZlZ2FhUXUNCi1Eb0NqanZiZHFaUEhnUkR4DQotRG5jS2p2YmRVV01QalVBcQ0KLURvRExLdmJkVFlLa216angNCi1Eb0RLanZiZGVnanZTT1FnDQotRG5ia0t2YmRVdE5UZWt2Sw0KLUVPYmtLdmJkTnNUdkdlVlENCi1Eb0RMS3ZiZGZORnZnTWpMDQotRU9jTEt2YmRaUW1FaU5FcQ0KLUVQREtqdmJkQnJhRFRmV3INCi1FUERLanZiZE5HY1FOUVZMDQotRVBETEt2YmRaeUVLT0RNUw0KLUVPY0tqdmJkQnZ6ZElkcFcNCi1FUENqanZiZEFDcXdpeWlRDQotRG9Damp2YmRkZVBSYXdDag0KLUVQREtqdmJkV1dpWHVjZGcNCi1Eb0RLanZiZFdleHpVQVBUDQotRG5iamp2YmR3WE1CV0JXVg0KLUVPY0xLdmJkVXlIc3pMT24NCi1FUENrS3ZiZE9ZT3V6Y25VDQotRVBDa0t2YmRoYW5jRXdRcQ0KLURuYmtLdmJkamdnTGVmT0wNCi1FUENrS3ZiZEZqZHNESU11DQotRG9ES2p2YmRyU1VqbWtCTg0KLURvRExLdmJkWmpUSVFHYWYNCi1Eb0RLanZiZE1nRFBtUHRrDQotRVBETEt2YmRXUm13YkZNRA0KLURvQ2tLdmJkelJPbUpLWEENCi1EbmJrS3ZiZHJEZGlRTnZCDQotRG5iamp2YmR1REN0d1ZvUA0KLUVPY0xLdmJkQ0lqYkxKRmoNCi1FUERLanZiZFhya2FNc254DQotRVBES2p2YmRWaFh2WGZ4eg0KLURuY0tqdmJkaGJQREV3UlINCi1Eb0NrS3ZiZHB4b0hnUWN4DQotRG9Da0t2YmR1TVh3QlVCWA0KLUVPYmpqdmJkTmVFVGhoamQNCi1Eb0NqanZiZGlyemhya0p6DQotRG9ETEt2YmRhTWtDVFVsZw0KLURuY0xLdmJkV1JuWUJlTGMNCi1EbmJqanZiZEdCUFJaSnptDQotRU9jTEt2YmRlT2VTanN0Uw0KLURvRExLdmJkbUljdFJWU0INCi1Eb0NqanZiZFp4ZEpuRE1TDQotRG9Da0t2YmRScFRnS0Zjdw0KLURuY0xLdmJkVHVrb2pUYVINCi1EbmJqanZiZEtSWmRvRm1lDQotRG5ia0t2YmRVUlFvVlVoTg0KLURvRExLdmJkeVlKS0JvekwNCi1FT2JrS3ZiZGZORndITWpMDQotRG9ETEt2YmRaaXNJUUhCZg0KLUVPYmtLdmJkcUZjZHN1YUkNCi1EbmNMS3ZiZHpvUHFGREx4DQotRG9ES2p2YmRTS3hldUhMVA0KLUVQREtqdmJkc0JlbUxmankNCi1Eb0NqanZiZEpiakNxSmNZDQotRG9Damp2YmROUHhSVm5Hcw0KLURuY0xLdmJkR2NqdkpiS0sNCi1FT2NLanZiZHJXcE1ESXhxDQotRU9jTEt2YmRRZERBcFFjcg0KLURvREtqdmJkWk1SZFRuTG0NCi1FT2NMS3ZiZGR4WnNzckZ6DQotRU9iamp2YmRVdE5UZkx1ag0KLUVQQ2pqdmJkTExCSVdBS1oNCi1Eb0NrS3ZiZGdGbFptZmdBDQotRVBDamp2YmRVVmtvaXRBcQ0KLURvREtqdmJkRG5jS2p2Y0UNCi1Eb0RMS3ZiZFJwVUhKZkVYDQotRVBES2p2YmRMcXZselZReg0KLUVQREtqdmJkWk1SZFVPTG0NCi1FT2NMS3ZiZENKTEJrSWZLDQotRG5jS2p2YmRhU0ZiaFVGaw0KLUVQRExLdmJkWm9OaGVFeksNCi1EbmNLanZiZFVWbFBqVUFxDQotRG5ia0t2YmRLTkFEeWZ1Qg0KLUVPYmtLdmJkWmR3ZnpnaGINCi1FUERMS3ZiZFp0SWh4Y3JuDQotRU9ia0t2YmRHY2tWaWFqSw0KLURuY0xLdmJkRmZKcW1pVVINCi1EbmNLanZiZEtXVWZEZGdKDQotRG9ES2p2YmRNdHJxam1BWA0KLUVPY0xLdmJkc1FXUEtEVmYNCi1Eb0NqanZiZHd0bGVSWk1PDQotRU9iamp2YmR1YUR4c1BFaA0KLUVQRExLdmJkS3hxSnJ6dUcNCi1FT2NLanZiZFZBYXBycHJaDQotRU9iamp2YmRFdXhvcE1qRg0KLURuYmpqdmJkeU9USHdyaUQNCi1FUERMS3ZiZHJwVm5pYnZHDQotRVBES2p2YmRrV1duRGF3dw0KLURuY0xLdmJkclhQa2JpWXENCi1Eb0RMS3ZiZGR4WnNzcWV6DQotRU9jTEt2YmRIRGtXSmJKag0KLURuY0xLdmJkRVBDa0xXY0UNCi1EbmJrS3ZiZEVYd2tzdFRsDQotRU9iamp2YmRxaUFLRW1PZQ0KLURuY0xLdmJkakFRR2FRR2oNCi1FUENqanZiZE5lRHRKSktkDQotRVBDamp2YmR2d01CV0JWdQ0KLUVQREtqdmJkRmVqU09JdFINCi1FT2NMS3ZiZE5Qd3FXT0hUDQotRVBES2p2YmRic0Nqc2NpYQ0KLUVPYmtLdmJkeVlJaWFveWsNCi1Eb0RLanZiZExaUWlyenVHDQotRU9iamp2YmRTTFpHVkdqcw0KLURvQ2pqdmJkQU1neHNXelkNCi1Eb0RMS3ZiZEVPYmpqd0NkDQotRG5ia0t2YmRzUHZPaWNXRw0KLUVQQ2tLdmJkckpBS0VsbmUNCi1FUENrS3ZiZGF1Q0d3anNoDQotRG5jTEt2YmRlZ2tXUm5RZw0KLUVQQ2tLdmJkWXBtRWlORlINCi1Eb0RLanZiZHVhRHhzUEZJDQotRG9Damp2YmRjeXhveFlxQw0KLURvQ2tLdmJka01ha3pGSFANCi1EbmJqanZiZEpiaWJxSmJ4DQotRG5ia0t2YmRXV2h4V0RlSA0KLURvQ2pqdmJkc3NSc1l6RkQNCi1Eb0RLanZiZHB5UElIUkR4DQotRG5jTEt2YmR3TldBTkRlTg0KLURvREtqdmJkSllVQmdsUlENCi1FT2JrS3ZiZFhuUkFZVlZ0DQotRG9Damp2YmRVV0xwS1RhUg0KLURvREtqdmJkVHFST3R0Z20NCi1FUENrS3ZiZFZxblhhZU1EDQotRU9iamp2YmRBRFJ3aXlpUQ0KLURvREtqdmJkbHJaVXlyY2kNCi1FUERLanZiZHZBZFpTbmRoDQotRG9Da0t2YmR6b1FRZURMeA0KLURuYmtLdmJkU1FVR2pGZFgNCi1FT2NMS3ZiZHFCSkZBWElFDQotRU9ia0t2YmRTQ0VGTGlaTA0KLURuYmpqdmJkem9RUWRjTVkNCi1EbmJrS3ZiZHB4bmdmcUVZDQotRG5jTEt2YmRic0RMVUVLQg0KLURvQ2pqdmJkWHJsQk10T3gNCi1FT2JqanZiZEtDakRRaWNZDQotRG5jTEt2YmRMcldselVweg0KLUVPYmpqdmJkYWFXRWZRUVgNCi1FT2JqanZiZHRsWVdhVGFYDQotRG5ia0t2YmRNb3dwdW5Hcw0KLUVPYmtLdmJkU0xZZXVIS3MNCi1FT2JrS3ZiZFRBRWhoQ09kDQotRVBDa0t2YmRtU1l0eXJjaQ0KLURuY0xLdmJkWWtxY3NuTG0NCi1Eb0RMS3ZiZHJ5bFFUQWduDQotRG5jTEt2YmRKWHRDSU1SUQ0KLUVPYmtLdmJkU0JkRWxJeUwNCi1Eb0RMS3ZiZHd5Z2VmWUZTDQotRG5jS2p2YmR5WGhpYlB6TA0KLUVQQ2pqdmJkdWFEeHNQRkkNCi1FT2JqanZiZFpvTmlGRXpLDQotRVBDamp2YmRrTkJreWVIUA0KLUVQQ2tLdmJkV1JuWGFkbEQNCi1EbmNMS3ZiZFJXbWRETGhEDQotRG5ia0t2YmRtU1l0elREaQ0KLUVPY0tqdmJka1Z3T0RiWHcNCi1EbmNMS3ZiZFFseENaT1V6DQotRU9iamp2YmRiaGxpamZYWQ0KLUVPY0xLdmJkWG1xQVh0dXQNCi1FT2NMS3ZiZG1iS1hYbm5WDQotRG9ES2p2YmRrSGdNRmZPTA0KLUVQQ2tLdmJkZmVreW1nSEENCi1Eb0NqanZiZGVLS1J2VXpuDQotRG9ES2p2YmRrSGZrZWZOaw0KLURvQ2pqdmJkeXFQTWlLWEENCi1EbmJqanZiZFVRcU90dUlODQotRU9jS2p2YmRFUENrS3dERQ0KLURvRExLdmJkWlJORklsZVINCi1EbmJqanZiZFJhY2RsSlpMDQotRU9jTEt2YmRUdWtvaXRBcQ0KLUVPY0xLdmJkWkxyRHRPTU4NCi1FT2NMS3ZiZGdLZnpjR0FFDQotRU9iamp2YmR6alZRUUVTdA0KLUVPY0xLdmJkY0lsaWpldngNCi1FT2NLanZiZEdLZHNESG1WDQotRG5jTEt2YmRLa0JIdkFKeQ0KLUVPY0tqdmJkWk1SY3RPTG0NCi1FUENrS3ZiZEFEUnhLWmlRDQotRU9iamp2YmREd3hMc3NzbA0KLUVQRExLdmJkVXhnc3pMUE8NCi1FUENrS3ZiZFNRVGZpZWRYDQotRVBDamp2YmROZUVVSklrRQ0KLURvRExLdmJkcHlQSGZxRHgNCi1EbmJrS3ZiZHlPU2hYc0pEDQotRG5jTEt2YmRMaUJrcHhBUw0KLURvREtqdmJkYWFXRWVwUVgNCi1Eb0NqanZiZFdTT1lCZUxjDQotRU9jS2p2YmRMRmVnYkFxVg0KLUVQREtqdmJkZmZMek9HZ0ENCi1FT2JrS3ZiZEZrRXJiZ2x1DQotRG5jTEt2YmRpWnVGbFJPRw0KLURuY0tqdmJkZWdrV1JuUWcNCi1Eb0RMS3ZiZFFkREFwUkRyDQotRU9jTEt2YmRlWVp0VVJleg0KLUVPYmpqdmJkclhRTGNJeHENCi1Eb0RMS3ZiZHhaaEdHWGVTDQotRG9ETEt2YmRHR0tTT0l0Ug0KLUVPYmpqdmJkamhITGZGbkwNCi1FT2NMS3ZiZFVRcG9VdUhtDQotRG9Da0t2YmRYcmxCTlVQWQ0KLURvREtqdmJkSlh0Q0lNUlENCi1EbmJrS3ZiZFpNU0RzbkxtDQotRG5jS2p2YmRDVEJEVUdXcg0KLURuY0tqdmJkYmhsaWtHWFkNCi1Eb0RLanZiZFhtcUFZVldVDQotRG5iamp2YmRsaURzcVZSYQ0KLURuYmtLdmJkbWFqWFlPblYNCi1FT2JqanZiZEpweWVQR05lDQotRG5ia0t2YmRDVEFjVUdYUw0KLURvRExLdmJkQ0RwQlZqTkcNCi1FT2NMS3ZiZHh3aGlhb3lrDQotRG9ES2p2YmR4Vk5GUXlNTw0KLUVQQ2tLdmJkVnZod3ZFRWcNCi1EbmJrS3ZiZEZXWW9vbUplDQotRU9jS2p2YmRsclpVeXNFSg0KLUVQREtqdmJkcXF1S25LYU4NCi1Eb0NrS3ZiZFRrdW5hVm9KDQotRU9jTEt2YmRmSGtWck9RZw0KLUVQRExLdmJkaVV6RldyVWINCi1Eb0RMS3ZiZHRBR3FJQUJTDQotRG9Da0t2YmRaUk1kaG1FcQ0KLURuYmtLdmJkTnNVVmZlVlENCi1FUERMS3ZiZHF3UGtiaVpSDQotRG9Da0t2YmROVXNTTE5BWA0KLURuY0tqdmJkbXBaeHZLeUMNCi1FUENrS3ZiZExZcUtTenRmDQotRVBES2p2YmRaeUVLT0RNUw0KLUVQREtqdmJkTkdib21QdUwNCi1EbmNLanZiZFpNU0R0TmxODQotRVBDamp2YmRUWGprbXpqeA0KLUVPYmtLdmJkQmRRQXZLTWYNCi1FT2NMS3ZiZGt5U3JUWWdVDQotRG5ia0t2YmRab09JZGR6Sw0KLURvQ2tLdmJkWk1TRHNta20NCi1FUENrS3ZiZENXemRJZHBXDQotRG5jTEt2YmRCdnpkSWRvdg0KLURvQ2pqdmJkYVJmREh0RmsNCi1EbmJrS3ZiZFdleVp0QU9zDQotRG9ETEt2YmRuQ0p3WVBPVg0KLURvQ2pqdmJkRVlZTHN0VU0NCi1FT2NMS3ZiZHd0bGRxWk1PDQotRVBDamp2YmRGVnhvb21LRg0KLUVPYmtLdmJkeXFQTWhpd0ENCi1Eb0RMS3ZiZGt4cnJTeGdVDQotRG9Damp2YmRlQVRxTllLRw0KLURuY0xLdmJkSktFQUpwSEUNCi1Eb0NrS3ZiZGRuZHNMVVRyDQotRG5iamp2YmRxRmNlVVdCSQ0KLURvRExLdmJkaGtkZE9VYnkNCi1EbmNLanZiZEdLZHJjSU11DQotRVBDa0t2YmRlbGV2Zmxpaw0KLURvREtqdmJkaGFvREZXcVINCi1Eb0NqanZiZFlsU0RzbWxODQotRVBDamp2YmRpWnVHTHBtZg0KLUVPYmtLdmJkbkNKdnhQTnUNCi1EbmJrS3ZiZGh6VWVsUk5mDQotRG5ia0t2YmRaZVlHemdpQw0KLURvQ2tLdmJkRG5ia0xXYmQNCi1EbmJrS3ZiZG5IRllNbWZ5DQotRG9Damp2YmRlUEVzS3RUcg0KLURuYmpqdmJkWlFtRWhsZVINCi1EbmJrS3ZiZFRrdW5hVm9KDQotRG5ia0t2YmRGV1pQcE1qRg0KLURvREtqdmJkU3drTU56a1kNCi1FT2NMS3ZiZHd0bGRweU1PDQotRU9jS2p2YmRoa2RjbXRieQ0KLURvQ2pqdmJkTlFYcVdOZnMNCi1FUERLanZiZHpqVXBQZFRVDQotRG5iamp2YmRxY2VKUG5XQg0KLUVQREtqdmJkVXlIc3lqb08NCi1FUENrS3ZiZFpzaGh4Y3NPDQotRG5jS2p2YmRxQWlGQVdnZA0KLUVPYmtLdmJkZ0Zrek9HZ0ENCi1EbmNLanZiZG1nRllOTmdaDQotRG9ETEt2YmREakhqV1lLQQ0KLURuYmpqdmJkSmJpY1JLQ3gNCi1EbmJrS3ZiZGZORndITWpMDQotRVBDa0t2YmRXU054QmRsRA0KLUVQRExLdmJkQ0pLYkxKRmoNCi1FUERLanZiZEVPY0trWERFDQotRVBDa0t2YmRWck9ZQ0VsRA0KLURuYmpqdmJkQ0lrQmpoZWoNCi1Eb0RMS3ZiZGRvRlRLc3RTDQotRG5iamp2YmR1RERWWFZvUA0KLUVPYmtLdmJkeHdpS0NQekwNCi1EbmJrS3ZiZFpHdmRBUFRKDQotRG9ETEt2YmRCZFBhVmpORw0KLUVPY0tqdmJkSUhHell3eEgNCi1Eb0NqanZiZEdGalNOaHNxDQotRG5iamp2YmRsWXNTU3hnVQ0KLUVQQ2pqdmJkcXJVam5LYU4NCi1FT2NMS3ZiZHR2T1hpcHNBDQotRG9ETEt2YmRyb3VuakN1Zg0KLURvQ2tLdmJkRlZ5UG9tS0YNCi1FT2NLanZiZE5IQ3BOUHRrDQotRVBETEt2YmRXZXladEFQVA0KLUVQREtqdmJkamNMa1FmdUgNCi1FT2NMS3ZiZHpIWk1BTWVYDQotRG9Damp2YmRVTVdQQlZuaQ0KLUVPY0tqdmJkSEVMV0tCaksNCi1Eb0RLanZiZE1nQ29tUVVrDQotRG5ia0t2YmRpR2pEWldKdQ0KLURuY0tqdmJkeXFPbUpLWEENCi1Eb0RLanZiZFZaSVR5am9PDQotRG9Damp2YmR6UW9OSkp3QQ0KLUVPY0xLdmJkR0FvUXhpem0NCi1Eb0RLanZiZGF0YWdZS3NoDQotRVBES2p2YmRTQmNlTUpZaw0KLURvRExLdmJkTXBZUXZPSFQNCi1EbmNLanZiZGlDT2NGV3BxDQotRG9Damp2YmRVR3puTHZ2Rg0KLUVQRExLdmJkQU5JWXJ2eXgNCi1FUENqanZiZEl3dENIa3BwDQotRU9ia0t2YmRKU3lCU21ZTQ0KLUVPYmtLdmJkd3VNZHFZbE8NCi1FT2JqanZiZG11VlprS1NHDQotRG5jTEt2YmRTUHNmakZkWA0KLURvRExLdmJkU1FVSEplZFgNCi1Eb0RLanZiZGlWWmR3U1ViDQotRVBETEt2YmRSanhmVkdrVA0KLUVPYmpqdmJkbXBaeVZrWkMNCi1EbmNMS3ZiZGh6VWVsUk9HDQotRVBDa0t2YmR4Vk1lUlpNTw0KLUVPY0tqdmJkeHhJaWFwWmsNCi1FT2NLanZiZEpTeUJUTllNDQotRVBES2p2YmRNU1hNelVweg0KLUVQQ2tLdmJkTmRkVGhoamQNCi1Eb0RLanZiZHpucFJFY0x4DQotRG5jTEt2YmRxWW9IZ1JFWQ0KLURuYmpqdmJkaUNQQ2R2cVINCi1Eb0NqanZiZHNRVm9LRFZmDQotRG9Damp2YmRxRmNkdFdCSQ0KLUVQQ2tLdmJkRmtGVERJTXUNCi1EbmJrS3ZiZFF2bWRDa2djDQotRG5iamp2YmR1Q2J0d1dPbw0KLURvQ2pqdmJkYU5LYXJ1TkgNCi1FT2NMS3ZiZHJwV1BLQ3ZHDQotRG9Damp2YmRFS0hpdXdqQQ0KLURvRExLdmJkc0JmTWxIS3kNCi1FT2JqanZiZHVDY1ZXdW5vDQotRG9Da0t2YmROZGRVSWlMRQ0KLURvRExLdmJkVnJOd2JFbEQNCi1FUENrS3ZiZFRxUW9VdUhtDQotRG9Damp2YmRjSk1pa0Z2eA0KLUVPY0tqdmJkaWpHSUptWVMNCi1EbmNLanZiZHR2TndpcHNBDQotRVBES2p2YmRHUUFTd0dleQ0KLURvQ2tLdmJkbUpFVVF0cWENCi1EbmNLanZiZHB4bmdnUWN4DQotRU9jTEt2YmREbmJqandERQ0KLURuYmpqdmJkeFZNZHFaTG4NCi1FUENrS3ZiZFRrdlBBdk9pDQotRG5ia0t2YmRkaWpSdlV6bg0KLURuYmpqdmJkSnV1RmNlR2kNCi1Eb0RMS3ZiZGVBVHBseEpmDQotRU9iamp2YmRpTGVEbXVEWg0KLUVPYmtLdmJkekhZbEFORlgNCi1FT2JrS3ZiZFNCZEZMaVlrDQotRG5jTEt2YmRNZ0NwTlB1TA0KLURuY0xLdmJkTnNUdWZlVlENCi1FUENqanZiZFVRcU90dUlODQotRVBDa0t2YmRLREpjUWljWQ0KLURuYmtLdmJkc0NGbUxmankNCi1EbmJqanZiZE5kY3RKSWpkDQotRG9ETEt2YmR6alVwUGRTdA0KLUVQRExLdmJkTW94UlZtZ1QNCi1FT2NLanZiZGJzQ2pzY2lhDQotRG9Damp2YmRyRGVJcE9XQg0KLUVQREtqdmJkT1RVVmdGVlENCi1FT2NMS3ZiZHVXTndpcHNBDQotRG9ES2p2YmRKY0pjUktDeA0KLURuY0tqdmJkR1pVdGFEd2INCi1FUENqanZiZFp0SkpZZFNuDQotRG9ETEt2YmR0Y0RWV3VvUA0KLUVPYmpqdmJkS2FMR21DWHENCi1Eb0NqanZiZGRaeG94WXBiDQotRG5ia0t2YmRXUm14Q0VrYw0KLUVPY0xLdmJkTnJzdWZkdVENCi1Eb0RMS3ZiZHFsekp4bElKDQotRG9Da0t2YmRGVnlQb2xqRg0KLURuYmtLdmJkamdnTUdHT0wNCi1Eb0RMS3ZiZExBa0hNYXdxDQotRG5jTEt2YmR3dU1kcHhsTw0KLURvREtqdmJkdFNxcnh5ZGMNCi1Eb0NqanZiZFNMWkdWSEtzDQotRG5iamp2YmRyTXpLWWxJSg0KLURuYmpqdmJkVEFGSWhCbmQNCi1FUERMS3ZiZEl4VGJJTVJRDQotRG9ETEt2YmRiQlZlR1FQdw0KLURuYmtLdmJkdmx2QU5FRW0NCi1FUERMS3ZiZEVPY0trWENkDQotRG9Da0t2YmRZcU1kaG1GUg0KLUVPYmpqdmJkblV0ektpcWYNCi1FUENrS3ZiZHR1blhqUXNBDQotRG5ia0t2YmRkZG9TQndESw0KLURuYmpqdmJkVHFST3R0Z20NCi1FUENrS3ZiZHpRbm1KSndBDQotRU9iamp2YmRmcEJ6d0R3aA0KLURuY0tqdmJkUm90SEplY3cNCi1FUENqanZiZGh0ekZXclZDDQotRG5jTEt2YmRxZEVocE52Qg0KLURuYmpqdmJka1dXbWNiWVgNCi1FT2NMS3ZiZFlTa2FNc29ZDQotRU9iamp2YmREaklLVnhLQQ0KLURuYmtLdmJkcm91bmpEVmYNCi1FT2JrS3ZiZEp6cEZ3ZEFODQotRG9ETEt2YmRzQmVsa2dMWg0KLURvRExLdmJkd3RtRXFaTU8NCi1EbmNLanZiZHhtcmd3cmlEDQotRU9jS2p2YmREb0RMTFdiZA0KLUVQREtqdmJkSXd0QmhMcHANCi1FUERMS3ZiZFVhQnFUUlJ5DQotRG9Damp2YmRqS0ZoSmx3cg0KLURvQ2tLdmJkR0xGVERJTXUNCi1FUENqanZiZHJiRm1NSEt5DQotRG9ETEt2YmRlaEt1ck9RZw0KLURuY0tqdmJkaWpGaEpsd3INCi1Eb0NqanZiZGp2WE9FQnd3DQotRVBDamp2YmRUWGprbXprWQ0KLUVPY0tqdmJkYVNGY0h0R0wNCi1FUERMS3ZiZHB5UElIUWN4DQotRU9jS2p2YmRtYWl3WG9OdQ0KLURvREtqdmJkU0JkRk1KWkwNCi1Eb0RLanZiZGpLR0lLTXdyDQotRG5jTEt2YmR5WGlLQm96TA0KLURvQ2tLdmJkcWx6SnhraEoNCi1FT2JrS3ZiZHJOWml5TGhKDQotRG9Da0t2YmRycFdQS0N2Rw0KLURuY0xLdmJkVnJPWGJFa2MNCi1EbmJrS3ZiZE9BSXJ0SnJBDQotRG5ia0t2YmRyWFFNQ2h5Ug0KLUVPY0xLdmJkRG5iamp3Q2QNCi1FUENqanZiZGp2WE9FQ1h3DQotRVBDa0t2YmRNZ0RQbVB0aw0KLURvRExLdmJkWWZ3RUFQU2kNCi1FUENqanZiZHpHeGxBTkV3DQotRG9ES2p2YmRtYktXd29OdQ0KLUVPY0xLdmJkZFp4cFh4cUMNCi1Eb0RMS3ZiZExHR0hiQXB1DQotRG9Damp2YmRWVGx0R0x1ag0KLUVQQ2pqdmJkT0VkVGhpS2QNCi1Eb0NqanZiZFV5SHRaa1BPDQotRG5jTEt2YmRIRUxXSmFqSw0KLUVPY0tqdmJkY2FybVNBVU4NCi1FT2JqanZiZHFpQUpkbU9lDQotRU9ia0t2YmRaUWxlSW1GUg0KLUVPYmtLdmJkUWNjQlFSRHINCi1Eb0NrS3ZiZExBamZtQndxDQotRG5jS2p2YmRTS3hldUhLcw0KLURuY0xLdmJkbUpEc3FVckINCi1FT2NMS3ZiZEdGaXJOaHRSDQotRG5jTEt2YmRFQVJpTXl3WA0KLURuYmpqdmJkWnhjak5ibFMNCi1EbmNMS3ZiZFdYSXd1ZEVnDQotRG9ETEt2YmRoa2VEbXVDeQ0KLUVPYmtLdmJkVXNsc2VsV0sNCi1Eb0NrS3ZiZExoYWtxWUFTDQotRG9Damp2YmRJTUJ6bXZwaw0KLUVQQ2pqdmJkS2FLZ01iWHENCi1FUENqanZiZGlMZURtdGNaDQotRG5iamp2YmRzUHZQS0N2Rw0KLURuY0xLdmJkblZVekxLUmYNCi1Eb0RMS3ZiZGlVeWVXclZDDQotRU9jTEt2YmRqYmxMUkd1SA0KLURuYmtLdmJkaHR5ZHZxdGINCi1FT2NLanZiZFRxUW51VklODQotRG9Damp2YmRNdHNSa05BWA0KLUVQQ2pqdmJkR0tkcmJnbHUNCi1EbmNLanZiZE1veFF2T0dzDQotRG9ES2p2YmRpSEtEWldLVg0KLURvREtqdmJkVUx2UEF2UEoNCi1EbmJrS3ZiZEV2WlFQbUtGDQotRU9iamp2YmRreHJyVFpHdA0KLUVPYmpqdmJkS0NpY1FpYngNCi1Eb0NqanZiZEtrQWd2QUtaDQotRU9jS2p2YmROeE91emNtdA0KLUVQRExLdmJkYnNDanNkSmENCi1FT2JqanZiZEhEa1ZqQmpLDQotRVBDamp2YmRZcU1kaU1lUg0KLUVQQ2tLdmJkY3pZb3haUkMNCi1EbmNLanZiZG5Qell1anhiDQotRG5iamp2YmRNcFlSV09IVA0KLURuY0xLdmJkTEZlZ2JCUlYNCi1EbmNLanZiZHhWTWRxWWxPDQotRG9ES2p2YmRGa0VyYmhOVg0KLURuY0tqdmJkTExCSHZBSnkNCi1Eb0RLanZiZFRmem1rd1dGDQotRVBDamp2YmR5WGlLQ1Faaw0KLURvREtqdmJkcVVVR3JTTFUNCi1FT2JqanZiZEdjanVpYWlqDQotRU9jTEt2YmRaUk1kaG1GUg0KLURvQ2pqdmJkWm9OaUVkeksNCi1Eb0NqanZiZEVBUmlOWndYDQotRG9Da0t2YmR3WE1CVmFXVg0KLUVQQ2pqdmJkVlpIc3lqb08NCi1Eb0RLanZiZHlYaGpCcFprDQotRU9ia0t2YmR0a3hXYVVBdw0KLURuYmtLdmJkTHJXbVp1UXoNCi1EbmNMS3ZiZHlTbkpOUmJIDQotRVBDamp2YmRlenZZZGhzdw0KLURvRExLdmJkaGFuY0ZXcVINCi1FT2JqanZiZHl6ZU9SZ2lJDQotRVBDamp2YmR5WGlKYlB5aw0KLUVPYmpqdmJkdVZuWGlxVEENCi1EbmJqanZiZFpqVEhvZmFmDQotRVBETEt2YmRMclhNeXVReg0KLURuYmpqdmJkSGZmeXh4WGcNCi1Eb0RMS3ZiZE9TdFdHZHRwDQotRG5iamp2YmRkaWpSdlV6bg0KLURvQ2pqdmJkWU5xQVh0dXQNCi1FUENqanZiZFVRcG50dUhtDQotRG9ES2p2YmR1V09YalFzQQ0KLURvRExLdmJkdFRSc1l5ZGMNCi1EbmNLanZiZHBmRGVVVmFJDQotRG9ETEt2YmRVTHVvQXZPaQ0KLURuYmpqdmJkcW1aallraEoNCi1FUERLanZiZFpNU0VUbWttDQotRG9ETEt2YmRac2hoeUVUTw0KLURuY0xLdmJkUWRDYVFRY3INCi1EbmNLanZiZFFjY0JRUkVTDQotRU9jS2p2YmRyTlpqWWxJSg0KLUVQREtqdmJkakFRSEJQZ0sNCi1Eb0NqanZiZG5VdVprSnFmDQotRG9ES2p2YmRMQWpmbUJ4Ug0KLUVPYmpqdmJkVXNsdEZrdWoNCi1Eb0RMS3ZiZFpRbGVKTWVSDQotRG5iamp2YmRCcmFDdEdYUw0KLURvRExLdmJkYVNGYmhVR0wNCi1FT2JqanZiZHJiR01rZ0xaDQotRVBDa0t2YmRKWVVDSGxSUQ0KLUVPY0tqdmJkZ0Zrek5mZ0ENCi1Eb0NqanZiZGFSZWNIdEZrDQotRVBES2p2YmRuVXVaa0tTRw0KLUVQRExLdmJka1dXbWRCd3cNCi1FT2JrS3ZiZHlwb05KS1hBDQotRU9jS2p2YmRaeGRKbWJsUw0KLURuY0xLdmJkWmlyaFBnQ0cNCi1Eb0RMS3ZiZGRlT3JDWENqDQotRG9Damp2YmRPWG9WemNuVQ0KLURuY0xLdmJkU0JkRk1KWkwNCi1EbmNLanZiZHJ6TVByYUhuDQotRG5jTEt2YmRxWlBIZnBjeA0KLURuY0tqdmJkVkFiUXNRcXkNCi1Eb0RLanZiZHlTbkpOU0NIDQotRVBETEt2YmR0U3FzWlplRA0KLURuY0xLdmJkdHZPWUtSVEENCi1EbmNMS3ZiZExHR0lDQlF1DQotRG9ETEt2YmREbmNMS3dERQ0KLUVPYmpqdmJkTnJ0VmdFdHANCi1FT2NLanZiZFVRcU90dGhODQotRU9iamp2YmRadElpWWNybg0KLUVPY0tqdmJkbXVWWmpqUmYNCi1EbmJqanZiZGNKTktLZXZ4DQotRG9Da0t2YmREeFhsVHRVTQ0KLURuY0xLdmJkcVpPaEhRY3gNCi1FUERLanZiZElzWkJTbHdsDQotRU9jS2p2YmROVXNSa05BWA0KLURvRExLdmJkUmJFRk1KWWsNCi1EbmJqanZiZGlCbmNGV3FSDQotRU9jTEt2YmRSektJU2NXQQ0KLUVPY0tqdmJkUmJFRk1JeUwNCi1FUERLanZiZHNQdW5qRFZmDQotRG9Damp2YmRoelZGa3BtZg0KLUVPY0tqdmJkZHhadFVTRnoNCi1EbmNLanZiZG5WVXlrSnJHDQotRU9jTEt2YmRFUENrS3ZiZA0KLUVQQ2pqdmJkblV1WmtLU0cNCi1EbmJqanZiZG5DS1d4T211DQotRG5ia0t2YmRZemNGcktWeQ0KLURvREtqdmJkdm1XQU1jZG0NCi1FT2JrS3ZiZGhrZGNtdURaDQotRG5jS2p2YmROc1VWZ0ZWUQ0KLUVQRExLdmJkWXpiZXFpdXkNCi1FT2NMS3ZiZFV4Z3N6TE9uDQotRG5iamp2YmRaUW1FaU1lUg0KLURvQ2pqdmJka0hmbEZlbWsNCi1FUERMS3ZiZGhiUENkd1JSDQotRG9ETEt2YmRXWEl3dWNkZw0KLURvQ2pqdmJkT1lPdXpjblUNCi1Eb0RMS3ZiZGNTYmtUZEphDQotRU9jS2p2YmRFdllwUU1qRg0KLUVQRExLdmJkcnlrb3NBaE8NCi1FT2JrS3ZiZHJvdlBKYnZHDQotRG9ETEt2YmRrSGZsR0dOaw0KLURvQ2pqdmJkWnRJaVljc08NCi1Eb0RMS3ZiZFpubWlFZHpLDQotRU9iamp2YmRaTVNEc25MbQ0KLUVQQ2pqdmJkTEFqZm1CeFINCi1EbmNMS3ZiZHB0VUdyUmp0DQotRU9jTEt2YmROUVhxVm1nVA0KLURvRExLdmJkQ0lrQ0xJZksNCi1FUERMS3ZiZHVWbXhLUlRBDQotRVBES2p2YmRIYkx6RXpBRA0KLUVQQ2pqdmJkYlViR3hLc2gNCi1Eb0NrS3ZiZGpsYkx6RWdQDQotRVBDa0t2YmRYR1l6VUFQVA0KLURuYmtLdmJkdUx4WEFzYVgNCi1FT2JrS3ZiZEp2VWZFRkhKDQotRU9jS2p2YmRtYktYWG9OdQ0KLUVQREtqdmJkUXZuRGJrZ2MNCi1Eb0RMS3ZiZGlVekZXclZDDQotRU9ia0t2YmRaeUVLTmNMcg0KLURvREtqdmJkckVFaHBOdWENCi1EbmJrS3ZiZHppdG9vY3NVDQotRVBDamp2YmRtYkp2eE9uVg0KLUVPY0xLdmJkTmRkVGlJamQNCi1EbmNLanZiZGZwQnp2ZFlJDQotRU9ia0t2YmRCaGpiTElmSw0KLURvQ2pqdmJkRmplVERIbVYNCi1FT2NLanZiZFJqeUdWR2tUDQotRG9Da0t2YmRaUWxkaG1GUg0KLUVQREtqdmJkcWx6S1pMaEoNCi1EbmJrS3ZiZFpvT0llRXlqDQotRG5jS2p2YmRCZFBhVmpORw0KLUVQQ2tLdmJkVHVsUGpVQlINCi1FUERMS3ZiZEdHSnFtaVRxDQotRG9ETEt2YmRHR0pxbWhzcQ0KLUVPY0tqdmJkSXJ5QlROWGwNCi1FUERMS3ZiZElzWWFTbVhsDQotRG9Damp2YmRWd0pYdWRFZw0KLUVQQ2tLdmJkdURDdHZ1b1ANCi1FT2NMS3ZiZGRCc01yQVVODQotRG5jTEt2YmRyb3VvSmNXRw0KLURvREtqdmJkQ2dMZkhBemMNCi1EbmNMS3ZiZGh0ekV2cXRiDQotRG9ES2p2YmRadElpWWNzTw0KLURuY0tqdmJkTWZib21QdGsNCi1EbmNLanZiZFlxTkVpTWRxDQotRG5ia0t2YmRDVEJDdEZ2cg0KLURuY0xLdmJkaHR6RXZxdUMNCi1Eb0NqanZiZEFNaFpTdnl4DQotRG9ES2p2YmRqbGJMekVmbw0KLUVPY0tqdmJkWkxyRVRta20NCi1EbmNLanZiZFVMdlBBdW5pDQotRG9Damp2YmR0Y0N0dnVvUA0KLUVQQ2tLdmJkT1RUdWdFdHANCi1FT2JqanZiZGh0ekV2cXVDDQotRG9Damp2YmRrSGdMZkZtaw0KLURuY0tqdmJkbW95eVZrWkMNCi1EbmJrS3ZiZHNCZW1MZ0t5DQotRG9ES2p2YmRkQ1RNckFVTg0KLURvQ2pqdmJkbXVVeWtKcWYNCi1EbmJqanZiZGJRSEdja3pkDQotRG9ETEt2YmR5T1NoWHJpRA0KLUVQRExLdmJkWlJORkltRlINCi1FT2NMS3ZiZERvREtrV2NFDQotRVBDa0t2YmR3TXZBTWNkbQ0KLURuYmpqdmJkYktsRm9OY0ENCi1Eb0NrS3ZiZE1mYnBNcFZMDQotRG5jTEt2YmRoa2VEblVieQ0KLURvREtqdmJkTVNXbVp0cHoNCi1FUENqanZiZG1mZVlNbWdaDQotRG5iamp2YmRxaUFLRk1vRg0KLURvQ2tLdmJkU0JkRWxJeGsNCi1FT2NMS3ZiZHVvVHpwa1BVDQotRG5jTEt2YmREb0NqandDZA0KLUVPYmpqdmJkTEdHSGJCUXUNCi1EbmJrS3ZiZFFjYmFRUkRyDQotRVBETEt2YmR5TnJneFRKRA0KLUVPYmpqdmJkdFNxcnlaZGMNCi1Eb0RMS3ZiZGVna1dTTnBnDQotRU9jS2p2YmRaTHJEc25MbQ0KLUVPYmpqdmJkRmtFc0NnbVYNCi1Eb0RLanZiZGF0YWdYanRJDQotRG5jTEt2YmRHWlV1QkR3Yg0KLURvRExLdmJkdUREVXZ1bm8NCi1FT2JqanZiZFVSUk90dUlODQotRG5ia0t2YmR5WGhqQnBaaw0KLURvRExLdmJkS2FMR2xheFINCi1Eb0NrS3ZiZGxaVFJyeGdVDQotRVBETEt2YmRVc2x0RmxXSw0KLURuY0xLdmJkR0dLUm5Jc3ENCi1EbmJrS3ZiZGlqRmhLTlhyDQotRG9ES2p2YmRyV29rYmlZcQ0KLUVPYmpqdmJkVWFDUlNxUnkNCi1FT2JqanZiZFJrWWZWSEtzDQotRG5ia0t2YmRRdm5EY01JRA0KLUVPYmpqdmJkdkJFWXJuZUkNCi1EbmJrS3ZiZHlTbWlOUmJIDQotRVBES2p2YmRqdXZtY2F4WA0KLURvQ2pqdmJkVlRtVUdMdWoNCi1FUERMS3ZiZHhWTWVSWWxPDQotRG5iamp2YmROUHdwdk5nVA0KLURvREtqdmJkSlRaQXJseE0NCi1FUERMS3ZiZGpia2tSSFVnDQotRG5ia0t2YmRTQmRGTUl5TA0KLUVQREtqdmJkTWdDb2xwVWsNCi1EbmNMS3ZiZFZBYlFzUXJaDQotRG5jTEt2YmR5VE9KTlJhZw0KLURuYmpqdmJkbWdGWU1tZ1oNCi1FUERLanZiZFRBRklnYk9kDQotRU9ia0t2YmRGV1lvb21KZQ0KLURvREtqdmJkSXhVQmhNUlENCi1Eb0NqanZiZEZXWW9wTktGDQotRG9ES2p2YmROZGNzaGlMRQ0KLUVPY0xLdmJkd1dsQldBdXUNCi1FUENrS3ZiZFlwbGRpTkZSDQotRVBETEt2YmRRd09EYmtnYw0KLUVQQ2tLdmJkcVpPaEhRY3gNCi1FT2JqanZiZEhEanVqQ0tLDQotRG9ETEt2YmRuQmpXd25tdQ0KLUVQRExLdmJkVVFxUFV1SG0NCi1EbmJrS3ZiZElyeUJTbHhNDQotRG5ia0t2YmRqaEdsRmZOaw0KLURuYmtLdmJkcWx5aXlNSGkNCi1FUERMS3ZiZHhtc0lZVEljDQotRVBDamp2YmROcnN1ZmR1UQ0KLURuY0xLdmJkYWFXRWVwUHcNCi1EbmJqanZiZGtWdm5EYXhYDQotRU9jS2p2YmRVUXBudHVJTg0KLUVPY0tqdmJkUWREQW9wY3INCi1Eb0NrS3ZiZHVNWHZhVUF3DQotRG5ia0t2YmRNUndOWnVReg0KLURvQ2tLdmJkTkdjUU1vdGsNCi1FUERMS3ZiZHVXT1lKcHNBDQotRG5jS2p2YmRadEpJeGNybg0KLURuYmpqdmJkd3loRmZYZVMNCi1FT2NMS3ZiZElyeUFzTllNDQotRU9iamp2YmR5VE5pTlJhZw0KLUVQQ2tLdmJkaVp1R0xxT0cNCi1EbmNLanZiZEhFTFdKYktLDQotRG9ES2p2YmRJR2Z5eHd4SA0KLUVQQ2tLdmJkZU9kcmtUc3INCi1Eb0RLanZiZHBzdEdyUmp0DQotRU9jS2p2YmRadEpJeGRTbg0KLUVPYmpqdmJkWnRJaVpEcm4NCi1EbmJqanZiZE9FY3RJaGtFDQotRG5jTEt2YmRLREpicUpieA0KLURuY0tqdmJkRU9jTEt2Y0UNCi1FT2NMS3ZiZGdMR3pjR0FFDQotRG9Damp2YmRHQlBReGl6bQ0KLUVQQ2pqdmJkZUZPcWJYREsNCi1FT2JrS3ZiZGVoS3VxblFnDQotRG5jS2p2YmRSb3NnS0Zjdw0KLUVPY0xLdmJkVXNtVUdMdWoNCi1FT2NMS3ZiZHJYUU1DaVpSDQotRG9ES2p2YmRqY01MUWZ0Zw0KLUVQRExLdmJkSEVLdktCaksNCi1FUERLanZiZGJWQ0hZTFVJDQotRG5jS2p2YmRGZktTT0l0Ug0KLURuY0tqdmJkWVNrYU5Ub1kNCi1EbmNMS3ZiZFF2bWNjTGhEDQotRU9jS2p2YmRuVlV5a0tTRw0KLURvQ2tLdmJkYnNES3NkSmENCi1FT2JrS3ZiZEdMRlRDaE11DQotRG9Da0t2YmRxR0VGVHVhSQ0KLUVQQ2tLdmJkZGRvUmJYQ2oNCi1FUENqanZiZE1mYnBOUVZMDQotRG9ES2p2YmRGamRyYmdtVg0KLUVQQ2tLdmJkbVJ4dVpzRGkNCi1EbmNLanZiZGFSZkNoVUdMDQotRG5jTEt2YmRNSkJrcVlBUw0KLUVPYmtLdmJkeFVtRXFZbE8NCi1FUERMS3ZiZHRiYnR2dW9QDQotRG9ES2p2YmR4c09KTlNCZw0KLUVQREtqdmJkWnRJaHlEcm4NCi1EbmNMS3ZiZEtDaWNSS0RZDQotRVBETEt2YmRVdE5VRmxWag0KLUVQQ2pqdmJkZUFUcU14SmYNCi1FT2NMS3ZiZGFOTEJzVW1IDQotRG9ES2p2YmRKY0pjUWpEWQ0KLUVQQ2tLdmJkaU1FZE50YnkNCi1Eb0NqanZiZGlHaWJ5V0p1DQotRG5jS2p2YmRlRW5yQ1hESw0KLUVQQ2pqdmJkVVZsUGlzYVINCi1EbmNMS3ZiZFhHWlp0QVBUDQotRG9ES2p2YmRkZG9SYlhESw0KLURvRExLdmJkU0JkRWxJeUwNCi1Eb0NqanZiZFJOWGJaT1V6DQotRG5iamp2YmRUQUVoaENQRQ0KLUVPYmpqdmJkVU1Wb0JXT2kNCi1EbmJrS3ZiZEZqZHJjSG1WDQotRG9Damp2YmRmSUt1ck9SSA0KLURvRExLdmJkVkJDUlRRcloNCi1FT2NMS3ZiZFpvTmhkZHpLDQotRG9Da0t2YmRVTHZPYVZvSg0KLURuYmpqdmJkWmlyaFBnQ0cNCi1FT2NLanZiZFZCQnBycVNaDQotRG9ETEt2YmRhU0ZjSVVHTA0KLURvRExLdmJkZklLdXFuUkgNCi1EbmNLanZiZGlqR0lLTlhyDQotRVBETEt2YmRyek1Qc0Fnbg0KLUVQREtqdmJkTlVzU0ttQVgNCi1FUENrS3ZiZExMQWhXQUtaDQotRG5jS2p2YmRrV1duRGF3dw0KLURuYmtLdmJkSllVQ0hsUXANCi1FUERMS3ZiZE53b1Z6ZE50DQotRG9Damp2YmRTTFlldGZqcw0KLURvRExLdmJkcHRUZ1NTTFUNCi1EbmNLanZiZHhWTWRxWkxuDQotRG5jS2p2YmRaeURpbkRNUw0KLURuYmtLdmJkblB5eHVqeGINCi1FUENrS3ZiZFNpWmpSQUJNDQotRVBES2p2YmRQeU5BSFNxag0KLURuY0xLdmJkcXdQbENoeVINCi1FUERLanZiZEdja1dKYktLDQotRG9ETEt2YmRiQldGRm9vdw0KLURvQ2tLdmJka0Nra1JHdUgNCi1EbmNMS3ZiZG1KRHRRdVNCDQotRU9ia0t2YmRRZENhUVFkUw0KLURuY0tqdmJkS2ZGaEJhUXUNCi1EbmNLanZiZGFOS2FydU1nDQotRU9jS2p2YmRuUHpaV0xZYg0KLUVPYmpqdmJkeFVsZHFaTU8NCi1EbmJrS3ZiZEdja1dKYWlqDQotRG5jS2p2YmRrVndPRGF3dw0KLUVPYmpqdmJkR0tkc0RIbHUNCi1FT2JrS3ZiZEtReWVPZk9GDQotRVBDa0t2YmRHZEt2S0NKag0KLURuYmtLdmJkR2RLdWliS0sNCi1Eb0RLanZiZE9GRHRKSktkDQotRG9Da0t2YmR3dU1kcHhrbg0KLUVPYmpqdmJkWmpTaFBnQmYNCi1Eb0RLanZiZGN5eHBZWlFiDQotRG5iamp2YmRyYkdNa2dMWg0KLURuYmpqdmJkeHNOaU1xYkgNCi1Eb0RLanZiZFdTT1hiRkxjDQotRVBDamp2YmRyRGVJb212Qg0KLUVPY0tqdmJkRXV4b3BOSmUNCi1Eb0RLanZiZEtES0NxS0N4DQotRG9Da0t2YmRrSUhMZkdOaw0KLUVPY0tqdmJkblV1WmppckcNCi1EbmNLanZiZElyeUFybVhsDQotRG9ES2p2YmRyYWVtTUdrWg0KLURuY0tqdmJkRUpnaXZZS0ENCi1Eb0RMS3ZiZGJobUprR1d4DQotRG5iamp2YmRaeURpbWNNUw0KLUVPY0tqdmJkaHVaZVdyVkMNCi1EbmJrS3ZiZFJiRUZNSlpMDQotRVBDa0t2YmRlT2Rya1VUcg0KLURvQ2tLdmJkbGhkVVF1UmENCi1EbmJqanZiZFp0SWlaRHNPDQotRVBDamp2YmRaeUVKbWNNUw0KLURuYmpqdmJkRnBBVFdnR1oNCi1FT2NMS3ZiZHVhRHhyb0VoDQotRG5ia0t2YmRwZWNlVVdCSQ0KLUVPY0tqdmJkamNNTFFmdGcNCi1EbmNMS3ZiZG5QelpXTFpDDQotRG5iamp2YmRaeUVLTmNNUw0KLURvREtqdmJkWk1TRHNuTG0NCi1EbmJqanZiZE9BSXNUalNBDQotRG9Damp2YmRXU054Q0ZMYw0KLURvREtqdmJka0NsTFJIVkgNCi1EbmNLanZiZFp4ZEptY0xyDQotRVBDamp2YmRPWU91emRPVQ0KLURuY0tqdmJkV0h4VnhIWXoNCi1Eb0RMS3ZiZHdYTUJXQlZ1DQotRU9iamp2YmRaeGRKbWNNUw0KLUVPY0tqdmJkckVGSlBtdkINCi1FT2NLanZiZFFjYmFRUWNyDQotRVBDa0t2YmRmSGtXUm5SSA0KLUVPY0tqdmJkckVFaVFOdkINCi1FT2JrS3ZiZGNUQ2p0RGlhDQotRG9Da0t2YmRuQ0p2d29PVg0KLURvRExLdmJkeG5USVlTaUQNCi1FT2NLanZiZEdRQVN2ZmV5DQotRG9ES2p2YmRVdE5UZWt2Sw0KLURvRExLdmJkYlViSFhrVGgNCi1EbmNLanZiZGFOTEJzVk5IDQotRVBDa0t2YmRtdHVaamlyRw0KLUVQREtqdmJkdmx2QU5FRW0NCi1EbmJrS3ZiZGNJbGpMR1d4DQotRU9jS2p2YmRKU3lBcm1ZTQ0KLUVPYmpqdmJkVlRsdEZsVmoNCi1EbmNLanZiZFRBRklnYk9kDQotRU9jTEt2YmRVc2x0R0x1ag0KLUVPYmpqdmJkWlJORWhtRlINCi1FT2NLanZiZFVHem5NWFZlDQotRG5iamp2YmRUcVFvVXRoTg0KLURuY0xLdmJkWlJORWhtRXENCi1FT2JrS3ZiZEt4cGlyenVHDQotRU9jS2p2YmRpVlpkdnF0Yg0KLUVPY0xLdmJkYXRiR3hLdEkNCi1EbmJrS3ZiZHBmRGRzdkJJDQotRG5iamp2YmRweVBJR3FEeA0KLURvQ2tLdmJkcVVVR3JSanQNCi1Eb0NqanZiZGZIanVxbXFIDQotRVBES2p2YmRxbHpKeUxnaQ0KLURvQ2pqdmJkem5wUkVjTVkNCi1FT2JqanZiZGp1dm5FQnd3DQotRG9Da0t2YmRRd05kQ2tnYw0KLURvQ2pqdmJkeHNOaGxxYWcNCi1FT2NLanZiZGJzREt0RUphDQotRVBETEt2YmRmSUt1cW5RZw0KLURuY0xLdmJkSlhzYklMcVENCi1Eb0RMS3ZiZGlVeWR3UnVDDQotRU9jTEt2YmRVdE1zZk1Wag0KLURuYmtLdmJkZk5HV2ZsaWsNCi1Eb0RMS3ZiZHF3UUxjSlpSDQotRG5jTEt2YmRZcU1lSWxlUg0KLURvQ2pqdmJkemFBUEdnQmwNCi1FUENrS3ZiZGF1QmdZTFVJDQotRVBETEt2YmRpVXlkdnF0Yg0KLURuYmpqdmJkUnlqSVRDdkENCi1EbmNMS3ZiZEl3c2FoTHFRDQotRVBDamp2YmRSYWNka2lZaw0KLUVPY0tqdmJkUmJFRk1KWkwNCi1Eb0NqanZiZHJ6TG9yYUhuDQotRU9ia0t2YmR4eElpYW96TA0KLUVPY0xLdmJkSmNKYnFKYngNCi1FUENqanZiZFppc0hvZ0JmDQotRU9jS2p2YmRWVG1VR01XSw0KLUVQREtqdmJkcnlsUVNhSU8NCi1EbmNMS3ZiZFNDRUVraVlrDQotRG9ETEt2YmRodHllWFJ1Qw0KLUVPYmpqdmJkUXZtY2JsSUQNCi1Eb0RLanZiZGF1Q0d3anRJDQotRG5ia0t2YmRHWXR1QkVZQw0KLURvQ2tLdmJka3lUU1N4ZnQNCi1FUERMS3ZiZElHZnl5WVlIDQotRU9iamp2YmRqbGJMekVnUA0KLUVQQ2pqdmJkSXdzYkhrcHANCi1FUERLanZiZG11VXlqalNHDQotRG9Da0t2YmRVUXBvVXRnbQ0KLUVPYmtLdmJkVVFxUFZWSU4NCi1EbmNMS3ZiZFhya2FNc254DQotRG5jTEt2YmRhTWpiVFVsZw0KLURuY0xLdmJkaGdKYnlWalYNCi1EbmJrS3ZiZFVSUW9VdUlODQotRG5iamp2YmRGV1pRUU1pZQ0KLUVQQ2pqdmJkbkNKd1lQTnUNCi1FT2NMS3ZiZEJjcEJWaW1HDQotRG9Da0t2YmR5cVBNaUtYQQ0KLUVPYmtLdmJkblZVektqUmYNCi1EbmJrS3ZiZFZnd3ZYZ1l6DQotRU9ia0t2YmRac2lKWkRzTw0KLUVQREtqdmJkaUNQQ2R3UlINCi1FT2JrS3ZiZEdZdVVhRVlDDQotRG5ia0t2YmRweVBJSFJFWQ0KLURuYmpqdmJkaVp0ZkxwbkcNCi1FUENrS3ZiZFZVTlRlbFdLDQotRG5ia0t2YmRUcHBvVlVoTg0KLURuYmpqdmJkeHJuSWxyQmcNCi1FUERLanZiZG1JZFVRdHJCDQotRU9iamp2YmRrTkJrekZHbw0KLURuY0tqdmJkaGJPY0ZYUXENCi1Eb0RMS3ZiZE5HY1BtUVZMDQotRVBES2p2YmRab05oZUV5ag0KLURuYmtLdmJkamxiTHpFZm8NCi1Eb0NqanZiZFpSTWRpTkVxDQotRU9iamp2YmRjellveFlxQw0KLUVQREtqdmJkTEFrSE1heFINCi1Eb0RMS3ZiZHNQdW5pYnVmDQotRG9ETEt2YmROZGNzaGhrRQ0KLUVQREtqdmJkaGtkY25WQ3kNCi1FUENrS3ZiZFZaSHRaa09uDQotRG5iamp2YmRzcnJUWXpGRA0KLURvQ2pqdmJkYXRiR3hLdEkNCi1FT2NMS3ZiZG5HZHhNbkhaDQotRVBETEt2YmRtYWl2d29PVg0KLUVPYmtLdmJkakplZ2pNd3INCi1FUERLanZiZFlmd0VBT3JpDQotRU9jS2p2YmRweG5nZnBjeA0KLURuYmpqdmJkRVBDamtYQ2QNCi1FUERLanZiZHhzT0ltUmFnDQotRU9iamp2YmRFUERLandERQ0KLURuYmpqdmJkWWxTRVRuTG0NCi1EbmNMS3ZiZEJpTEJqaGVqDQotRG9ES2p2YmRycFdQSmNWZg0KLURuY0tqdmJkUnBUZmllZFgNCi1Eb0RLanZiZGFrTUdPbkRBDQotRG5iamp2YmR1Vm14S1FzQQ0KLURuY0tqdmJkS2ZGaENCUlYNCi1EbmJrS3ZiZHBmRUZUdkJJDQotRG5jTEt2YmRxd1FMY0l5Ug0KLUVPY0tqdmJkbGhkVHB1U0INCi1EbmNLanZiZHF3UUxiaHhxDQotRG5ia0t2YmRuSEV3bG1nWg0KLUVQREtqdmJkRG9DamtXYmQNCi1FT2JrS3ZiZEFOSVlzV3l4DQotRU9iamp2YmRwZkVFc3ZCSQ0KLUVQREtqdmJkQ0pMQ0tpRmoNCi1Eb0RLanZiZHFjZGhvblZhDQotRVBDamp2YmR6alVwUUVTdA0KLURuY0xLdmJkWlFsZUltRXENCi1FUENqanZiZEVQQ2tMWENkDQotRVBES2p2YmRZbFJkVU5sTg0KLUVPYmtLdmJkeHdpS0JvekwNCi1EbmJqanZiZEZqZHNDaE5WDQotRU9iamp2YmR3dGxlUllsTw0KLURvRExLdmJkZU9kc0xVVVMNCi1FUERLanZiZFpMcWN0T0xtDQotRG9ETEt2YmRqbGJMeWVIUA0KLURvQ2tLdmJkYU5MQ1RWTWcNCi1EbmJrS3ZiZEVLSGpXWGpBDQotRG5ia0t2YmRac2hoeURzTw0KLURuYmpqdmJkc1B1bmlidWYNCi1FUENrS3ZiZHdXa2FXQlZ1DQotRVBETEt2YmRGcEFUV2ZleQ0KLUVPYmpqdmJkem9RUWRjTVkNCi1FUERMS3ZiZHB4bmdmcGN4DQotRG5iamp2YmRnUGF6d0R3aA0KLUVQREtqdmJkS1Z0ZkVFZmkNCi1FT2NMS3ZiZGhrZUVOdURaDQotRU9ia0t2YmRJd3RDSUxxUQ0KLUVQQ2pqdmJkeU5yaFhzSkQNCi1EbmJrS3ZiZE1TV21adVF6DQotRU9jTEt2YmRzUHVuaWNXRw0KLURuY0xLdmJkVUx2UEJXUEoNCi1Eb0NrS3ZiZEtmRmhDQXB1DQotRU9jTEt2YmRUQUVoaENPZA0KLURuYmtLdmJkU0t4ZXRmanMNCi1Eb0NqanZiZFV0TlRmTHVqDQotRU9iamp2YmRoelZHTVJPRw0KLURvQ2tLdmJkeHNOaG1SYWcNCi1EbmJqanZiZGRaeVB3eHBiDQotRU9iamp2YmRFdXhvb2xqRg0KLURuY0xLdmJkVlRsc2ZMdWoNCi1Eb0NrS3ZiZFpqU2hRR2FmDQotRVBES2p2YmRyU1ZLbkthTg0KLURuYmtLdmJkRnh1VkJEd2INCi1Eb0NrS3ZiZEpYdEJoTHBwDQotRVBDamp2YmRIZmZ6Wlh4SA0KLURvQ2pqdmJkcVpPZ2ZxRHgNCi1EbmNMS3ZiZHF3UU1DaHlSDQotRU9iamp2YmRhU0dESVVGaw0KLUVQRExLdmJkWnhkS05jTVMNCi1FT2JqanZiZGh1WmR3U1ViDQotRVBETEt2YmRmTWZXZ01paw0KLURuY0xLdmJkWlJORkpNZHENCi1FT2NLanZiZEpLRUFLUGZkDQotRVBDa0t2YmRjeXhveFlxQw0KLUVPY0tqdmJkQ1NhQ3NldnINCi1Eb0RMS3ZiZEtRekVvR05lDQotRG9ETEt2YmRqaEhMZWZPTA0KLURvQ2pqdmJkUmp4ZXVHanMNCi1EbmNLanZiZHlPVElYc0ljDQotRG5ia0t2YmRCZFFCV0tNZg0KLUVPY0tqdmJkdUx4WEJVQlgNCi1FT2JrS3ZiZHJTVWtOa0FtDQotRG9ES2p2YmRLZkZoQmFSVg0KLUVQQ2pqdmJkZGRvU0J2Y0sNCi1EbmNLanZiZHlPVEh4VEpEDQotRU9jTEt2YmRpTGVFTnVEWg0KLURvQ2pqdmJkSmJqRFJLQ3gNCi1FUERLanZiZGRvRXJrVVVTDQotRG9Da0t2YmRCaUtha0pHSw0KLURuYmtLdmJkQ0lqYktpRmoNCi1Eb0NqanZiZElzWkJTbVhsDQotRU9jTEt2YmRCaGphamlGag0KLURuYmpqdmJkcnpNUVRCSU8NCi1FT2JqanZiZHJXb2xDaHlSDQotRVBDa0t2YmRFQVJpTXpYWA0KLURvRExLdmJkcldwTURKWXENCi1FT2NMS3ZiZEtSWmRvR09GDQotRG9Damp2YmRCc0FjVUZ2cg0KLURvQ2pqdmJkQnJhRFVHWFMNCi1Eb0NrS3ZiZEl3dEJoTVFwDQotRU9iamp2YmRlQVRxTXhLRw0KLUVQREtqdmJkWXpiZlJqV1oNCi1FT2NMS3ZiZHNDR05MZ0t5DQotRG9ES2p2YmRoZmljWldLVg0KLUVPYmpqdmJkWlFsZGhsZHENCi1FUERLanZiZHNRVm9KYnZHDQotRVBES2p2YmRzUVZuaWNXRw0KLURvRExLdmJkVlpJVHlqb08NCi1FUENqanZiZElMYXptdnBrDQotRVBDa0t2YmRaTVNEc21sTg0KLURvQ2pqdmJkWkd2ZEFPcmkNCi1Eb0RLanZiZHd1TWVSWWtuDQotRG5iamp2YmRaeUVKbWJsUw0KLUVQREtqdmJkaGtlRU51RFoNCi1FUERMS3ZiZEdkS3ZLQ0tLDQotRVBDamp2YmRqdXdPRUNYdw0KLUVPYmtLdmJkWmVYZnpnaGINCi1FT2JqanZiZEptQUVaZ1VhDQotRU9jTEt2YmR0Y0N1V3ZPbw0KLUVQQ2tLdmJkaWllaEpsd3INCi1Eb0RMS3ZiZHd0bGRweU1PDQotRG9Damp2YmRqYmxMUWZ1SA0KLURuY0tqdmJkTlB3cHVuR3MNCi1EbmJqanZiZFNMWkZ0Z0xUDQotRVBES2p2YmR5WGhqQ1B5aw0KLUVPYmpqdmJkbGlFVHB1U0INCi1EbmJqanZiZHFseWl4a2dpDQotRG9ETEt2YmRtYkp2eE9uVg0KLURvQ2pqdmJkWmpTZ3BHYWYNCi1Eb0NqanZiZHFkRWhwTnVhDQotRG9ETEt2YmRlbGZYR21LTA0KLUVQREtqdmJkSUdnWnlZWUgNCi1EbmNMS3ZiZGZNZlhITWlrDQotRG9Damp2YmRab05oZUV5ag0KLUVQQ2tLdmJkc1psUHNCSU8NCi1FT2NLanZiZExBamdNYlhxDQotRG5jS2p2YmRWWklUeWtPbg0KLURuYmpqdmJkcHlPZ2ZxRVkNCi1FUERLanZiZGJVYWdZS3RJDQotRU9ia0t2YmRyU1VqbkxCTg0KLURuY0tqdmJkUXdOZERMaEQNCi1FT2NMS3ZiZHJ5a29zQklPDQotRVBES2p2YmRzUHVuaWNXRw0KLUVQQ2pqdmJkbGlEdFF1UmENCi1FT2NLanZiZGNTYmtUZEtCDQotRU9jTEt2YmRLYUtnTkNYcQ0KLURuYmpqdmJkWnNoaHhjcm4NCi1EbmJrS3ZiZGNiVE1yQVVODQotRVBDa0t2YmRzUVdQS0RWZg0KLURuY0tqdmJkaWpHSGpNd3INCi1FT2NMS3ZiZFVMdlBCVm5pDQotRVBDamp2YmRmZkx5bkhIQQ0KLURvQ2pqdmJkVHFRbnR1SG0NCi1Eb0RMS3ZiZGp1d05kQ1h3DQotRG9Da0t2YmRWWklUekxPbg0KLUVQRExLdmJkcXJVa09MQW0NCi1FUERMS3ZiZFpRbUVobUZSDQotRG9ES2p2YmR3anZkSHp5Zg0KLUVQREtqdmJkZVBFcmp0VHINCi1FT2JqanZiZG1vell2TFpDDQotRG5iamp2YmRBQ3JYaXpJcA0KLUVPY0xLdmJkVHZNUUp0QXENCi1EbmNMS3ZiZHNzU1RaWmVEDQotRG5iamp2YmRtb3paVmp4Yg0KLUVPY0xLdmJkdFNyU3h6RkQNCi1FUERMS3ZiZFp5RGpPQ2tyDQotRG5ia0t2YmRiQldFZW9wWA0KLUVPY0xLdmJka1dXbWNiWHcNCi1Eb0NrS3ZiZGtWd05kQnd3DQotRG5jS2p2YmRFenNxRk1DaQ0KLURuY0xLdmJkQUNxeEp5aHANCi1Eb0RLanZiZFlwbUZJbGVSDQotRG5jS2p2YmRHS2RzQ2dsdQ0KLURvQ2tLdmJkWm5uSkZFeksNCi1Eb0RLanZiZEJzQkN0R1dyDQotRVBES2p2YmRCY3BBdWltRw0KLURuYmpqdmJkSUdmell4WGcNCi1EbmJrS3ZiZEdMRXNDZ21WDQotRVBDa0t2YmR5U25KTlNCZw0KLURvQ2tLdmJkUHlOQUdycWoNCi1FUERLanZiZG1haXZ4UE51DQotRG5iamp2YmRkb0ZTa1VVUw0KLURvQ2tLdmJkeVNtaU5SYWcNCi1Eb0RMS3ZiZEVZWGxVVVVNDQotRU9ia0t2YmRDVEJDdEZ3Uw0KLURvRExLdmJkb3puRGtYb0ENCi1FT2NMS3ZiZEJ2emNpRW92DQotRG9Damp2YmRTUHRISmZFWA0KLUVQRExLdmJkdHZPWUpxVEENCi1FUERLanZiZFppc0hwSEJmDQotRVBES2p2YmRJTGF6bXZxTA0KLUVPY0tqdmJkUnBVSEtHRHcNCi1EbmNLanZiZFdYSllXRGRnDQotRVBETEt2YmRJd3RDSGxRcA0KLUVQREtqdmJkVXROVGZMdksNCi1EbmNMS3ZiZGRaeHBYeHFDDQotRU9jTEt2YmRrTkJsWmRnUA0KLUVPYmtLdmJkcVluaEdxRVkNCi1FUERMS3ZiZGZwQnp3RHdoDQotRG5jTEt2YmRUa3VvQlZvSg0KLURuYmtLdmJkdnZsQldBdlYNCi1Eb0NqanZiZHJYUU1DaVlxDQotRVBDamp2YmRGZWlxbWlVUg0KLURuY0xLdmJkempVb3BEc1UNCi1EbmNLanZiZGhrZURtdUN5DQotRVBDamp2YmRWcW5ZQmRsRA0KLUVPY0xLdmJkU0NEZUxpWWsNCi1Eb0NqanZiZEp2VWVjZUhKDQotRVBDamp2YmRqZ2ZrZkZuTA0KLURuYmpqdmJka1Z3TmRCd3cNCi1FT2JrS3ZiZGN6WW93eVJDDQotRVBDamp2YmRab05oZGR5ag0KLUVQQ2pqdmJkT1NzdWdFdVENCi1FT2JrS3ZiZFpNUmNzbkxtDQotRU9iamp2YmRyTXpKeUxnaQ0KLUVQREtqdmJkclNVam5LYU4NCi1FUERLanZiZFNMWWZVZmtUDQotRVBES2p2YmRVVmxRS1VBcQ0KLURvRExLdmJkSmNLQ3FKYngNCi1EbmJqanZiZGVGUFJiV2NLDQotRG9Da0t2YmRWQWJRc1FxeQ0KLURuY0xLdmJkcGVjZVR2QkkNCi1Eb0RMS3ZiZGNJbGlrRndZDQotRG9ETEt2YmRic0RMVGRKYQ0KLUVQQ2tLdmJkUlhPRUNsSGMNCi1EbmJqanZiZGJLa2VubkRBDQotRG5jTEt2YmRFenNxRWtjSg0KLUVQQ2pqdmJkSnZVZWRFZ0oNCi1FT2NMS3ZiZHppdHBRRHNVDQotRG5jTEt2YmRRdm5EYmxIYw0KLUVPY0tqdmJkYlFHZ0RremQNCi1EbmJrS3ZiZGRaeVB4WXBiDQotRVBETEt2YmRMclhOWnVReg0KLURvREtqdmJkRGpJSnZZS0ENCi1FUENqanZiZGJWQ0hYanNoDQotRU9jTEt2YmRzUHVuaWNWZg0KLUVPY0xLdmJkRXpzcGRsQ2kNCi1Eb0RMS3ZiZG1SeHR6U2RKDQotRG5iamp2YmRzQmZOTGZqeQ0KLURvQ2pqdmJkY1RETFVEaWENCi1FUERMS3ZiZGlkamdWUEFPDQotRG9Da0t2YmR1Vm14S1FzQQ0KLUVPYmpqdmJkeExYRGd6ekcNCi1FUENrS3ZiZHVhRVpTb0ZJDQotRU9jTEt2YmRkbmVTanNzcg0KLURvQ2tLdmJkV1hKWVZkRkgNCi1EbmNMS3ZiZEhrYXpuV3FMDQotRG5jS2p2YmRiVkNHeEtzaA0KLURuYmpqdmJkaU1FY210Y1oNCi1Eb0RLanZiZHFBaGVBWEhkDQotRVBDa0t2YmRNSWFsUXhBUw0KLURuYmpqdmJkVnZpWHVjZGcNCi1EbmJqanZiZE1wWHB1bWdUDQotRU9ia0t2YmRNSkNMcVlBUw0KLUVPYmpqdmJkY3paUVlZcUMNCi1EbmNMS3ZiZFV4Z3Raam9PDQotRU9jTEt2YmRqdXdOZENZWA0KLURuY0tqdmJkU3dqbE56a1kNCi1FUERMS3ZiZHJXcExiaHhxDQotRG9ES2p2YmRuQmpXd29PVg0KLUVQQ2pqdmJkbVNZdHlyZEoNCi1Eb0RMS3ZiZHplWm56ZHpRDQotRG5jTEt2YmRNb3dxV09Hcw0KLUVQQ2tLdmJkcVRzZnFyTFUNCi1FT2JrS3ZiZHJhZW1NSEt5DQotRU9jTEt2YmRKY0picGpDeA0KLURuYmpqdmJkbXVVektqUmYNCi1EbmNLanZiZE5lRVRoaGtFDQotRG9ES2p2YmRIYWt5ZHpBRA0KLUVPY0tqdmJkWHNMYU5VUFkNCi1FT2JqanZiZExGZkhiQlF1DQotRG5jTEt2YmRiS2xGb09EQQ0KLURvQ2pqdmJkUnBUZmllY3cNCi1EbmJrS3ZiZFJrWWV0Z0xUDQotRG9Damp2YmRlZ2tWck9RZw0KLURvRExLdmJkaGxGRU9VYnkNCi1Eb0NrS3ZiZEZ5VXRhRVhiDQotRG5iamp2YmRBTWd4c1haeA0KLUVPY0xLdmJkVVFxT3R1SG0NCi1FUERLanZiZHhybWlNckNIDQotRU9jTEt2YmRSRURBcFFkUw0KLURvRExLdmJkV1JteEJkbEQNCi1EbmJqanZiZGlIS0N5VmpWDQotRVBDa0t2YmR4d2hqQ1B5aw0KLUVPYmpqdmJkTEthSHZBSnkNCi1FUERMS3ZiZFp0SkpZY3NPDQotRG9Damp2YmRiUGZnRGt6ZA0KLUVPYmtLdmJkVWFCcVRSUnkNCi1FUERLanZiZEdZdHVBY3diDQotRG5iamp2YmRRY2JhUVJEcg0KLUVQQ2pqdmJkc0JmTk1IS3kNCi1FUERLanZiZFp5RGltYmxTDQotRG9ES2p2YmRKWHRCZ2xSUQ0KLUVPYmtLdmJkcHNzZnJTTFUNCi1FT2NMS3ZiZE1Sd015dHB6DQotRG9Damp2YmRFWVlNVVR0TQ0KLURvQ2tLdmJkZUFVUW1YaWYNCi1EbmNMS3ZiZFVhQnFTcHF5DQotRU9ia0t2YmRWQWJRcnFSeQ0KLUVPYmtLdmJkd1hNQXVhV1YNCi1EbmNMS3ZiZENJamFrSWZLDQotRG5jTEt2YmRqbUJrekVmbw0KLUVPY0xLdmJkS1Z0ZkRlR2kNCi1FT2JrS3ZiZG5RWnlWanhiDQotRG5jTEt2YmR6UlBNaGl3QQ0KLURuY0tqdmJkSnB5ZG5mT0YNCi1FUERLanZiZHFUc2ZyUmtVDQotRVBETEt2YmRFdXlRUGxpZQ0KLURuYmpqdmJkZlNCV3psQ28NCi1EbmJrS3ZiZHFpQUtGTW5lDQotRVBDamp2YmRhdGJIWUxVSQ0KLUVPY0tqdmJkTnNUdWdFdHANCi1FUENrS3ZiZG1nRlhtTmdaDQotRVBETEt2YmRNU1hOWnRweg0KLURvREtqdmJkVWFCcHJxUnkNCi1EbmJqanZiZFhtcUFYdHZVDQotRU9jS2p2YmRIbEJ6bldwaw0KLUVPY0tqdmJkVnFtd2JFbEQNCi1Eb0NrS3ZiZHFyVkxPTEFtDQotRG5ia0t2YmRac2hpWWNybg0KLURvQ2tLdmJkWm9OaGRkeWoNCi1FT2NMS3ZiZEV1eG9vbGpGDQotRG5ia0t2YmR1Q2NWWFZvUA0KLUVQQ2tLdmJkbXVWWmppckcNCi1EbmNLanZiZFJ6S0hyYnZBDQotRU9ia0t2YmRlS0pxdXR6bg0KLUVPYmtLdmJkeU9TaFhzSWMNCi1FUENqanZiZFJiRGRsSlpMDQotRG9ES2p2YmRTQmRGTUl4aw0KLURuY0xLdmJkS2FLZ01hd3ENCi1FT2JrS3ZiZENEcEF1aWxmDQotRG5ia0t2YmRSV25EY0xnYw0KLURuY0xLdmJkcWx6SnhraEoNCi1FUENqanZiZE5IRFFNcFVrDQotRU9jTEt2YmRSTXdiWk50eg0KLUVQREtqdmJkT0VkVGhpTEUNCi1Eb0RMS3ZiZFV5SHN6S29PDQotRG5ia0t2YmRaaXNJUGdDRw0KLURuY0tqdmJkd3pIZWV3ZVMNCi1EbmNLanZiZFF3T0RjTGhEDQotRG9ETEt2YmRxZEZKUG11YQ0KLUVPY0xLdmJkdndNQXZCVnUNCi1FUERMS3ZiZGJWQmZ3anNoDQotRG9Da0t2YmRSeWpIcmNXQQ0KLURvRExLdmJkV0lZVnhHeHoNCi1EbmJrS3ZiZGJpTWpMR1hZDQotRU9jTEt2YmRCaGpiS2lGag0KLUVPYmpqdmJkQ0RwQXZKbUcNCi1FUERLanZiZExCS2ZtQ1lSDQotRG9Da0t2YmRiaU1pamV2eA0KLURuYmtLdmJkeU9TZ3dyaUQNCi1FUERMS3ZiZGxZcnFzWkhVDQotRU9jTEt2YmR3eWhHRnhGUw0KLUVQRExLdmJkUnlqSHNDdkENCi1FUENrS3ZiZEhnR3pZeFlIDQotRG9ETEt2YmRHRmpSbWh0Ug0KLUVQREtqdmJkRnlVdGFFWUMNCi1EbmNMS3ZiZGVGT3JDV2JqDQotRG9ETEt2YmRKU3lBcmx3bA0KLUVPY0tqdmJkWnlFS09ETHINCi1FT2NMS3ZiZGVtR1hHbUprDQotRG5iamp2YmRTQ0RlTGh5TA0KLURvRExLdmJkWVRMYU1zbngNCi1Eb0NqanZiZHhLd0VIenlmDQotRU9jTEt2YmRpVlpkdnF1Qw0KLURuYmtLdmJkVWFCcVRRcXkNCi1FUENqanZiZEdaVlZCRVhiDQotRG9ETEt2YmRDRVFBdktNZg0KLURvRExLdmJkUldtZENraEQNCi1FUERLanZiZFJvdEhKZWN3DQotRG9Damp2YmRaeGNpbWJsUw0KLUVPY0xLdmJkdGJjVXZ2T28NCi1EbmJqanZiZFpzaUpaRHNPDQotRU9jS2p2YmRSeWpIc0N2QQ0KLUVPY0tqdmJkeExXZEh6ekcNCi1Eb0NqanZiZEZqZHJiaE11DQotRVBDa0t2YmR4Vk5GUllsTw0KLURvQ2tLdmJkbUljc3FVcWENCi1FUERMS3ZiZGZNZldnTWpMDQotRVBES2p2YmRUcVFvVXRoTg0KLUVPY0tqdmJkdGt3dmFVQXcNCi1Eb0RLanZiZEJkUGFWaWxmDQotRG9ETEt2YmRaTVJkVG1rbQ0KLUVQRExLdmJkZWxld0dsaWsNCi1Eb0NrS3ZiZHd6SGZGeEVyDQotRVBDa0t2YmR2QWN5VFBGSQ0KLUVPYmpqdmJkUWREQlBxRVMNCi1Eb0RLanZiZFp0SWlZY3JuDQotRU9jS2p2YmR5cG5saGl3QQ0KLURvQ2tLdmJkTnJ0V0dkdVENCi1EbmNLanZiZHhzT0lscWJIDQotRVBDamp2YmRBTklZcnZ5eA0KLURuYmpqdmJkTndudXpkT1UNCi1FUENrS3ZiZEZ5VXVCRVhiDQotRU9jTEt2YmRhYVdGR1FRWA0KLURuY0xLdmJkcmFlbGtma1oNCi1FUENqanZiZFRwcVBWVWhODQotRG5jS2p2YmR5U21pTlNCZw0KLUVQREtqdmJkcnBXUEpidkcNCi1FT2JqanZiZHdOV0FORUZODQotRU9iamp2YmRaZVlHemhKQw0KLURvQ2pqdmJkZG5kc0tzdFMNCi1FUERMS3ZiZGVna1dTT1JIDQotRVBDamp2YmR2d01BdkJWdQ0KLUVQQ2pqdmJka3lTcXJ4Z1UNCi1FUENrS3ZiZEhrYXpuV3FMDQotRVBDamp2YmRxbHpLWWtoSg0KLURuY0xLdmJkWnhkSm1jTVMNCi1FUENqanZiZHFHRUZUdkFoDQotRU9iamp2YmRUWUtrbXprWQ0KLUVQQ2tLdmJkWmlzSG9mYkcNCi1FT2NMS3ZiZHpvUHBkY0x4DQotRVBES2p2YmRaalRIcEhDRw0KLUVPY0tqdmJkS1dWR0VGSEoNCi1FUENqanZiZGh5dUZsUk9HDQotRVBDa0t2YmRGamVURElNdQ0KLURuY0xLdmJkT1lQVnpjblUNCi1Eb0NqanZiZFNaaklTYnZBDQotRG9Da0t2YmRab05pRWR5ag0KLUVQQ2pqdmJkcldwTURKWlINCi1FT2JrS3ZiZGtWdm5EYXhYDQotRU9iamp2YmRjU2JqdERpYQ0KLURuYmpqdmJkTEdHSUNCUlYNCi1FUERMS3ZiZGtXV21jYlh3DQotRU9iamp2YmRuSEV4Tk9IWg0KLURuY0tqdmJkVXROVUZsVmoNCi1FT2JrS3ZiZEV2WlBvbUtGDQotRG9Da0t2YmR1b1R6cGpudA0KLUVPY0xLdmJkVVJRb1ZWSG0NCi1EbmJrS3ZiZFRBRWlJQm5kDQotRG5jS2p2YmRRd09FQ2tnYw0KLURuYmpqdmJkUmJEZGtpWkwNCi1Eb0NqanZiZEVQQ2tMV2NFDQotRVBES2p2YmR6alVwUGRTdA0KLUVQREtqdmJkWk1TRHNta20NCi1Eb0RMS3ZiZEJkUGFXSm1HDQotRVBDa0t2YmR3andFSHp5Zg0KLURuYmpqdmJkaHVaZVhTVWINCi1Eb0NrS3ZiZGxZcnFzWWZ0DQotRG9Damp2YmRFWHhNVHNzbA0KLURvREtqdmJkem9QcGRia3gNCi1EbmNLanZiZFdSblhiRk1EDQotRG9ETEt2YmRkaWpSdXR6bg0KLURuY0tqdmJkbkNLV3dubXUNCi1FT2NMS3ZiZFpNU0RzbWttDQotRU9jTEt2YmRVYUNSVFJTWg0KLUVPYmtLdmJka0NranBnVkgNCi1EbmJrS3ZiZGlyemlUS2l6DQotRG9ETEt2YmRKcHllT2VuRg0KLUVPYmtLdmJkR0tkc0RIbVYNCi1FT2JqanZiZG9BS3pzaERuDQotRVBETEt2YmRsclpWWnJjaQ0KLURuY0xLdmJkUnpLSHNEV0ENCi1FT2JrS3ZiZEtrQWhXQUtaDQotRVBETEt2YmRWQWFxU3FSeQ0KLURvQ2tLdmJkakFQZ0FwSEsNCi1FUENrS3ZiZEJjcEJXSm1HDQotRG5jS2p2YmR1Q2J1WFdPbw0KLUVPY0xLdmJkcWlBS0VtT2UNCi1FUERLanZiZFlwbGRobGVSDQotRG5iamp2YmRFUENqandDZA0KLURuYmpqdmJkYnNES3RFSmENCi1FT2JqanZiZEtmR0lDQlJWDQotRG9ETEt2YmRSYWRGTUl4aw0KLURvREtqdmJkR0dKcW1oc3ENCi1FUENqanZiZEpiaWNRakRZDQotRG5jS2p2YmRiaU5LS2ZXeA0KLUVPY0xLdmJkdUx4WEFzYVgNCi1FUENqanZiZEVLSUp1d2pBDQotRVBDamp2YmRXUm13YWRsRA0KLURuYmpqdmJkZk1ld0dtSmsNCi1FT2NMS3ZiZE54T3V6ZE9VDQotRG5ia0t2YmRmSUt2U09RZw0KLURuY0xLdmJkUVpOQUhTcWoNCi1EbmJqanZiZFpMcWRVTmxODQotRVBDamp2YmRTTFlldGdMVA0KLURuY0tqdmJkZUVvU0NXYmoNCi1FUERMS3ZiZHNDRm1NR2p5DQotRVBETEt2YmRMR0dIYWFSVg0KLURuY0xLdmJkRXV4cFFNakYNCi1FT2JqanZiZFZZaFR6TFBPDQotRVBDa0t2YmRhU0ZiaFRlaw0KLURuYmtLdmJkRGloSnV3akENCi1FT2JqanZiZEZqZVRESU11DQotRU9iamp2YmRoa2VEblVieQ0KLURvREtqdmJkeFVtRXB5TG4NCi1EbmNMS3ZiZGlWWmR2cXRiDQotRG9Da0t2YmR1bnN6cUxQVQ0KLURuYmtLdmJkU0JjZGtpWWsNCi1FT2JqanZiZGJobUtLZXZ4DQotRG5iamp2YmRWWkh0WmtPbg0KLURvRExLdmJkWmlyZ29nQ0cNCi1Eb0RMS3ZiZHFCSWVBV2hFDQotRVBDamp2YmR3dG1FcVlrbg0KLURuY0tqdmJkS0NqRFJKYngNCi1FT2NLanZiZFR2THBKc2FSDQotRG9ES2p2YmR5WGhqQm96TA0KLURuYmpqdmJkdUREVXdWb1ANCi1Eb0RLanZiZHphQU9mZ0JsDQotRG9Damp2YmRXU09ZQ0VsRA0KLUVPY0xLdmJkcXdRTURKWXENCi1Eb0NrS3ZiZE5IQ29scFVrDQotRVBDa0t2YmRDRVBhVmltRw0KLUVPY0tqdmJkaktGaEpseFMNCi1FT2NMS3ZiZHhVbGVSWWtuDQotRG5ia0t2YmRyTlpqWk1IaQ0KLURvREtqdmJkbXVVekxLU0cNCi1FT2JqanZiZGZJS3VyT1FnDQotRVBES2p2YmRRbHdiWk50eg0KLURuY0tqdmJkaGtlRG5VYnkNCi1FT2JqanZiZHd1TWRxWk1PDQotRG5jS2p2YmRsaUR0UXRyQg0KLUVQQ2pqdmJkTlB3cVdOZ1QNCi1EbmNLanZiZGpBUGdBcEdqDQotRU9ia0t2YmRNcFlSVm1mcw0KLURuYmtLdmJkR0tlVENoTlYNCi1Eb0RMS3ZiZEhiTVpkekFEDQotRU9iamp2YmRRbHdheU9Veg0KLUVQREtqdmJkVnFuWUNGTGMNCi1Eb0NrS3ZiZG1wWnlWanlDDQotRU9ia0t2YmRVc2xzZkx1ag0KLURvRExLdmJkbGhkVVJWU0INCi1FT2NMS3ZiZG1TWlZacmNpDQotRG9Damp2YmRZemJlckp1eQ0KLUVQRExLdmJkaHpWR0xwbkcNCi1FUENqanZiZHNQdk9pY1ZmDQotRU9ia0t2YmRlT2VUTFVVUw0KLURuY0xLdmJkbWZkeE1uSFoNCi1FUERLanZiZEhmZnpZd3hIDQotRVBETEt2YmRyeWxQc0Fnbg0KLUVPY0tqdmJkd1dsQldBdlYNCi1FUERLanZiZFZBYlFzUXF5DQotRG5ia0t2YmRzWmxQc0JJTw0KLURuY0xLdmJkRXpzcGRrYmkNCi1EbmNMS3ZiZGh5dUdNUk9HDQotRG9Da0t2YmRGYU9weGl6bQ0KLURvQ2tLdmJkWnNpSXhjcm4NCi1Eb0NrS3ZiZGlqR0hqTXdyDQotRG5ia0t2YmRjeXhwWVpRYg0KLURuYmpqdmJkRXpzcGRrYmkNCi1EbmNMS3ZiZE5RWVJWbkdzDQotRU9ia0t2YmRrQ2xLcGdWSA0KLUVPY0xLdmJka0NsS3FIVkgNCi1FT2NLanZiZGhhbmJkdnFSDQotRVBDa0t2YmRtZmR3bU5meQ0KLUVPYmtLdmJkWVRNQW1VUFkNCi1Eb0NrS3ZiZElHZ1p4eFhnDQotRU9jS2p2YmRuSEV3bG5IWg0KLURuY0xLdmJkQ0RwQXVpbGYNCi1FUENqanZiZG1iS1hYb09WDQotRU9ia0t2YmRhcEdmZEx6ZA0KLUVQQ2tLdmJkUmp5R1ZITFQNCi1Eb0NrS3ZiZGRvRlRMVHRTDQotRVBDamp2YmRHTEZUQ2dsdQ0KLURvQ2pqdmJkaUxlRU50Y1oNCi1Eb0NrS3ZiZEtDaWNRakN4DQotRVBDa0t2YmR1b1R6cUxQVQ0KLUVQQ2pqdmJkdVZtd2lxVEENCi1FUENqanZiZFdJWHV4R3h6DQotRVBDamp2YmRweG5nZnFEeA0KLUVPY0tqdmJkZU9kcmtUc3INCi1Eb0RMS3ZiZE5yc3VmZHVRDQotRU9jS2p2YmRJSEhaeVh3Zw0KLURvQ2pqdmJkcGZFRXN2QkkNCi1FT2NLanZiZGhnS0RZdktWDQotRG5iamp2YmRtYkp2eE9tdQ0KLUVQREtqdmJkR2RLdWpDS0sNCi1Eb0RMS3ZiZGZrR3pjR0FFDQotRVBDa0t2YmRab05pRWVaag0KLUVQRExLdmJkYU1qYlRVbGcNCi1FUENrS3ZiZFNQc2dKZkVYDQotRVBES2p2YmREeFlMc3RVTQ0KLUVQQ2pqdmJkS1Z0ZkRlR2kNCi1FT2NMS3ZiZHBlY2VUdkFoDQotRU9iamp2YmRIZmZ6WXd4SA0KLURuYmpqdmJkZmZNWm5ISEENCi1FT2NMS3ZiZHNRVm5pYnZHDQotRU9jS2p2YmRaaXJncEdiRw0KLUVPYmpqdmJkSlN4YVRNeE0NCi1FT2NMS3ZiZGJyY0xVRUtCDQotRVBDamp2YmRHWlV1QWN3Yg0KLURuYmtLdmJkcHNzZ1JyTFUNCi1EbmJrS3ZiZEtWdGVjZUhKDQotRVBES2p2YmRtYWpYWU9tdQ0KLUVQREtqdmJkTndvVnpkT1UNCi1EbmJqanZiZHJwVm5pY1dHDQotRG9ES2p2YmRqaEdsRmZOaw0KLUVPYmpqdmJkRVh3bFR0VGwNCi1Eb0RMS3ZiZGtDa2tRZnRnDQotRG5jS2p2YmREeFlMdFVUbA0KLURuY0tqdmJkTlFZUXVuR3MNCi1Eb0RMS3ZiZFpRbGVJbUZSDQotRG9ES2p2YmR1Vm14S1JUQQ0KLURvRExLdmJkc3Jxc1paZGMNCi1Eb0RMS3ZiZFpMcWN0TmxODQotRVBETEt2YmROc1VWZmVWUQ0KLURuY0xLdmJkaHVaZVhSdUMNCi1FUENrS3ZiZGlDT2Jkd1JSDQotRG9ES2p2YmRJd3NiSU1RcA0KLUVPYmpqdmJkdGNDdHZ2UFANCi1FT2NMS3ZiZHB5T2hIUkR4DQotRU9iamp2YmRtZ0V3bU9IWg0KLURvQ2tLdmJkZWxldmdOSmsNCi1Eb0NqanZiZHVMd3dCVGFYDQotRG9Da0t2YmRYcmxCTlRueA0KLUVQRExLdmJkdUNjVXZ1b1ANCi1FUERLanZiZFVSUlBWVWdtDQotRU9ia0t2YmRCc0JDc2ZYUw0KLURvRExLdmJkWmpTZ29nQ0cNCi1FT2JrS3ZiZGhnS0RaVml1DQotRVBDa0t2YmRFWVhrc3RVTQ0KLURuY0xLdmJkck16SnlMZ2kNCi1EbmJqanZiZGFTRmNJVUZrDQotRVBETEt2YmRuQmpXeE9uVg0KLUVQRExLdmJkc3NScnlaZUQNCi1FT2NLanZiZGVyQXZ6a2JvDQotRG9Damp2YmRaaXJoUUhDRw0KLURuYmtLdmJkQnJhQ3RGdnINCi1FT2NMS3ZiZHhaZ2ZGeEZTDQotRG9ES2p2YmRKdXVGZEZHaQ0KLUVQREtqdmJkVVFxUFV0Z20NCi1FUERMS3ZiZE5IQ3BNcFVrDQotRVBES2p2YmRuQ0tYWU9uVg0KLURvQ2tLdmJkZFp5UVh5UWINCi1EbmJqanZiZHB4b0hnUkVZDQotRVBDa0t2YmRmTkZ3SE5Kaw0KLURuY0xLdmJkVkJDUXNRcXkNCi1FUENrS3ZiZFV4aFR6TE9uDQotRU9iamp2YmRTUVRnSmZFWA0KLURvQ2tLdmJkcldwTGJpWlINCi1Eb0RMS3ZiZHRjRFV3V09vDQotRG9Da0t2YmR3ekhmR1hlUw0KLUVQRExLdmJkcnpNUHJhSG4NCi1FUENrS3ZiZERvQ2pqdmNFDQotRG9ETEt2YmRiaGxpamV3WQ0KLUVPYmtLdmJkVXhnc3lqb08NCi1Eb0RMS3ZiZGJVYWZ4S3NoDQotRG9Damp2YmRVTHVvQldPaQ0KLUVQQ2tLdmJkVkJCcVNxUnkNCi1Eb0NqanZiZGhrZUVOdGNaDQotRVBDamp2YmRxWW5nZ1JEeA0KLURuY0xLdmJkamhITUZmT0wNCi1FT2NLanZiZFp4Y2luRE1TDQotRG9ETEt2YmR2QkR5U25kaA0KLURuY0tqdmJkaXJ6aVRLaXoNCi1EbmNLanZiZEpYc2FnbFJRDQotRG5jS2p2YmRoZmpEWXZKdQ0KLURuY0xLdmJkanV2bkRiWVgNCi1FT2NLanZiZEthTEhNYXhSDQotRG9Damp2YmRpR2pEWldLVg0KLURuYmpqdmJkRU9iamtXYmQNCi1EbmJrS3ZiZEptQUR5Z1ZCDQotRVBES2p2YmRKdlZGZEVmaQ0KLUVQRExLdmJkbkdlWG1PR3kNCi1Eb0NqanZiZHBzc2dTU0t0DQotRVBES2p2YmR3dGxkcVlsTw0KLUVQREtqdmJkbWZlWG1OZ1oNCi1Eb0NqanZiZHF2b2tiaVpSDQotRG9ETEt2YmRxVVVIU1JqdA0KLUVPYmtLdmJkbWJLWFlPblYNCi1FT2NLanZiZGFTR0NoVGZMDQotRVBDa0t2YmRXV2lZV0RkZw0KLURvQ2pqdmJkdW9UenFLbnQNCi1EbmJqanZiZEhEa1ZqQmpLDQotRU9jS2p2YmRiVkJmd2p0SQ0KLUVPY0tqdmJkanZYT0VCeFgNCi1EbmNLanZiZFpMckVUbk1ODQotRU9ia0t2YmRmTkdYSE1qTA0KLUVQQ2tLdmJka0RMa1JIVWcNCi1FT2JqanZiZFpqVElRR2JHDQotRG9ES2p2YmRac2lJeURzTw0KLURuYmtLdmJkYnJianNjakINCi1FUENqanZiZG1iSndZUE9WDQotRG9Da0t2YmRLREpjUWljWQ0KLURvRExLdmJkWnhjaW5Da3INCi1Eb0RLanZiZHVvVHpxTFBVDQotRU9jS2p2YmRkbmRzS3N0Uw0KLURuYmpqdmJkTlFYcVdOZnMNCi1FT2NLanZiZElpZEFLUUdkDQotRG9ETEt2YmRUa3ZPYVZuaQ0KLURvQ2pqdmJkc1B2UEpjVmYNCi1Eb0RLanZiZFZxblhiRWxEDQotRU9jS2p2YmRJSEd5eVh4SA0KLURuYmtLdmJkVXhnc3pMT24NCi1FUERMS3ZiZHd1TWRweGtuDQotRG5ia0t2YmRxclZMTmtCTg0KLURuY0tqdmJkaWpGZ2pNd3INCi1FUENrS3ZiZFNRVUdqRmN3DQotRU9iamp2YmRSV21kQ2tnYw0KLURuYmtLdmJkVlRsdEZrdksNCi1FT2NMS3ZiZEpiakNxS0RZDQotRU9ia0t2YmRmTWZYR21LTA0KLUVPYmpqdmJkelJQTkpLWEENCi1FUENqanZiZEJzQWJ0R1dyDQotRG9ES2p2YmRKWHNhaExxUQ0KLURuYmtLdmJkbEJOT21BTEENCi1Eb0RMS3ZiZGxyWXR6VERpDQotRVBETEt2YmRadEpJeGRUTw0KLURuY0tqdmJkbWJKdnhQT1YNCi1FUERMS3ZiZGFNa0JzVW1IDQotRVBDa0t2YmROc1VWZ0ZVcA0KLURvQ2pqdmJkV2ZZeXRBUFQNCi1FT2JqanZiZE5IQ3BNcFZMDQotRVBDamp2YmRNZ0NvbVB0aw0KLUVPY0xLdmJkZXFhV3psRFANCi1Eb0NrS3ZiZEZWeG9wTktGDQotRU9jS2p2YmRZa3JEc21sTg0KLURuY0tqdmJkV1dpWVdFRkgNCi1Eb0RLanZiZFNMWWZVZmtUDQotRG5iamp2YmRoa2VFT1ZDeQ0KLURvREtqdmJkSlhzYWdrcHANCi1Eb0RMS3ZiZFpvT0lkZVpqDQotRG5jTEt2YmRMaUNNUllBUw0KLURuY0tqdmJkeU9USHdzSkQNCi1EbmNLanZiZHZtV0FORGVODQotRG9ETEt2YmR0VFNUWXlkYw0KLURvQ2tLdmJkZG5lU2p0VHINCi1FT2JrS3ZiZGtETUtwZnRnDQotRG5iamp2YmRiaGxqS2V3WQ0KLUVQQ2tLdmJkSXNaQlNsd2wNCi1FUENqanZiZGxxeHVac0RpDQotRG5iamp2YmROcnRXR2VWUQ0KLUVPY0xLdmJkdkJFWlNuZGgNCi1FT2NLanZiZHJKQUpkbU9lDQotRG9Damp2YmR5T1RIeFRJYw0KLURvQ2pqdmJkbWZkd2xuR3kNCi1FT2NMS3ZiZGtETUtwZ1ZIDQotRG9Da0t2YmRSRUNhUVFkUw0KLURuY0tqdmJkYU1qYXJ0bGcNCi1FUENqanZiZFZ2aVh1Y2VIDQotRG5ia0t2YmROc1VWZ0ZWUQ0KLURvREtqdmJkRmtFc0RJTXUNCi1FT2NLanZiZGRaeVB3eVFiDQotRG9ES2p2YmRxbVppeGxJSg0KLURvREtqdmJkckVFaG9tdkINCi1FT2NMS3ZiZGxaU3FzWkhVDQotRVBDa0t2YmRlaEt1cW1xSA0KLURvRExLdmJkRnh0dUJEd2INCi1FUENqanZiZEtqYUh2QUp5DQotRG5jTEt2YmRCY3BBdWpNZg0KLURvQ2pqdmJkTlFZUldPSFQNCi1Eb0NqanZiZEhha3pFekFEDQotRVBDa0t2YmRKVFlhU2x3bA0KLURvQ2pqdmJkeml0cFFFVFUNCi1Eb0RLanZiZHZCRVpTb0ZJDQotRG5jTEt2YmRuQmpYWG9PVg0KLURvRExLdmJkaVp1R01ST0cNCi1Eb0RLanZiZEtWdGVjZGZpDQotRG5iamp2YmRkakpxdlV6bg0KLUVQQ2tLdmJkYU1qYlN0bGcNCi1FT2NLanZiZFNaakhzRFdBDQotRG5ia0t2YmRVYUNSU3FTWg0KLURvRExLdmJkeFpnZWZYZVMNCi1EbmNLanZiZGpoR2tmRm5MDQotRG5jS2p2YmRJakVBSm9nRQ0KLUVQQ2tLdmJkTkdjUGxwVkwNCi1EbmNLanZiZFVNV1BBdk9pDQotRG5ia0t2YmRhdGFmeEtzaA0KLUVPYmtLdmJkamNNTFFnVWcNCi1Eb0RLanZiZGRlT3FhdmNLDQotRU9jTEt2YmRvem5FTFhvQQ0KLUVQRExLdmJkZU9kcmp0VVMNCi1EbmJrS3ZiZGpLRmhKbVhyDQotRVBDa0t2YmRweG9IZnBkWQ0KLURvQ2pqdmJkWkxyRHNuTU4NCi1FUENrS3ZiZHd5aEZleEZTDQotRU9jS2p2YmRrQ2xLcGZ0Zw0KLURvREtqdmJkeG5USVlTaUQNCi1EbmNLanZiZHhuU2hZU2lEDQotRG9Da0t2YmRGeHR1QkR3Yg0KLUVPYmpqdmJkWWtyRVVOa20NCi1EbmJqanZiZE5RWVF2TmZzDQotRVBDa0t2YmRobEZEblVieQ0KLUVPY0xLdmJkaUNPYmR3UlINCi1Eb0NqanZiZFZ3Slh2RUZIDQotRG5ia0t2YmRCdnpjaGVQdg0KLUVPYmtLdmJkWkhXZEFQU2kNCi1EbmNLanZiZEhnR3pZeFhnDQotRG9Da0t2YmRNSkNNUXhBUw0KLUVQQ2tLdmJkWkxxZFRta20NCi1Eb0RMS3ZiZG5DSndZUE51DQotRVBDamp2YmRPU3N2R2R0cA0KLURuY0tqdmJkbFlycXNaR3QNCi1FT2NMS3ZiZEpZVUJoTHFRDQotRG9Damp2YmRaaXNIcEdhZg0KLURuYmpqdmJkVmd4V1hmeHoNCi1FUERLanZiZGtXWE5kQnhYDQotRG9Da0t2YmRsWlRTU3lIVQ0KLURuY0tqdmJkamdnTGVlbkwNCi1EbmJqanZiZEtOQUVaZnVCDQotRG9Damp2YmRMQWtITWF4Ug0KLUVPY0xLdmJkWlJORkpORlINCi1Eb0RMS3ZiZGpBUUdhUGZqDQotRU9iamp2YmRqZ2dNR0Ztaw0KLURvRExLdmJkeWZ5TUFNZVgNCi1EbmNMS3ZiZGpia2tSSFZIDQotRU9jTEt2YmRPVFR1Z0ZWUQ0KLUVPY0tqdmJkV0h4V1hmeHoNCi1FUENrS3ZiZHZ3TUJXQlZ1DQotRVBDamp2YmRuSEV3bG5IWg0KLURvREtqdmJkSEVLdWlhaWoNCi1Eb0NqanZiZFZ3SXd2RUVnDQotRVBETEt2YmRlaEt2Um5SSA0KLURuY0xLdmJkblZVeWppckcNCi1FT2JqanZiZGZNZXZnTkprDQotRVBES2p2YmRqYmtqcUhWSA0KLURuY0xLdmJkckpBS0Vsb0YNCi1Eb0NrS3ZiZEdja1dKYWlqDQotRG5iamp2YmRUdk1RSnRBcQ0KLUVQQ2tLdmJkaGtkZE50Y1oNCi1EbmJrS3ZiZHJ6TVFUQklPDQotRG5jS2p2YmRzWmxRVEFnbg0KLUVQRExLdmJkT0ZEdEpJamQNCi1FT2NMS3ZiZG5CaXZ3b09WDQotRG5jS2p2YmRKWHRCaExwcA0KLUVQQ2tLdmJkSlRZYVNtWGwNCi1FT2NMS3ZiZExHRmdiQlF1DQotRG5jS2p2YmRuSEV3bG1nWg0KLURvQ2pqdmJkQUNyWUp6SlENCi1FUENrS3ZiZGladUdMcU5mDQotRG5iamp2YmRuR2R4TW1meQ0KLURuYmtLdmJkUmtaR1VnS3MNCi1Eb0RMS3ZiZFppc0hvZmFmDQotRVBETEt2YmRKS0VBSnBHZA0KLURuYmtLdmJkQnNCRFVGd1MNCi1FT2JqanZiZHRjRFZXdW5vDQotRU9jS2p2YmRCc0Fic2ZXcg0KLUVQREtqdmJkcldwTUNoeVINCi1Eb0RMS3ZiZFZUbHRGa3VqDQotRVBES2p2YmRHRmpTT0pVUg0KLUVPY0tqdmJkQnNBY1VHWFMNCi1FUENrS3ZiZGNKTktLZld4DQotRVBETEt2YmRuUVp5V0t4Yg0KLUVQQ2tLdmJkcVR0R3JTS3QNCi1FT2JrS3ZiZGpKZklLTlhyDQotRU9jTEt2YmRWcW14QmRrYw0KLUVPY0tqdmJkRldZb3BNakYNCi1EbmJqanZiZHFkRkpQbldCDQotRG9Damp2YmRlaEt2Um5SSA0KLUVQREtqdmJka3lUUnNaR3QNCi1FT2JqanZiZG96bWNrWVBBDQotRG5iamp2YmRicmNMVURqQg0KLURvRExLdmJkck15aXhraEoNCi1Eb0RMS3ZiZHJwV09qQ3ZHDQotRG9ES2p2YmRMRmVoQ0FxVg0KLURuY0tqdmJkcldwTUNpWXENCi1FT2NLanZiZFZUbVVGa3ZLDQotRU9ia0t2YmRoZmljWlZqVg0KLUVQQ2tLdmJkSXNaQXNOWGwNCi1Eb0NqanZiZG1mZHhOT0haDQotRVBES2p2YmR6bm9wZGJsWQ0KLURuYmpqdmJkTGlDTVJZQVMNCi1EbmNMS3ZiZGVQRXNLc3RTDQotRG9ETEt2YmRVTVZvQlZuaQ0KLURuY0tqdmJkV1JuWGFlTGMNCi1FT2JqanZiZHJEZGlQbXZCDQotRG9ES2p2YmREb0RLa1hERQ0KLURuY0tqdmJkT0FJcnRKckENCi1FUENrS3ZiZHd6SUdHWGRyDQotRU9jTEt2YmRVUXFQVXRnbQ0KLUVQRExLdmJkaGxGRU9VYnkNCi1EbmNLanZiZFppcmhQZmJHDQotRU9jTEt2YmRLVnVHRUVnSg0KLURvREtqdmJkZGVQU0J2YmoNCi1FUERMS3ZiZGZIanVxbXFIDQotRVBES2p2YmRaalNncEhCZg0KLURuY0xLdmJkdW5zenBqb1UNCi1FUENrS3ZiZHFUdEhSckt0DQotRU9iamp2YmRmTkdYR2xqTA0KLUVPYmpqdmJkVUd6bk1XdWUNCi1EbmJrS3ZiZHNQdW9KYnZHDQotRU9iamp2YmRuUVp4dWp4Yg0KLUVQRExLdmJkY3paUHd5UWINCi1Eb0NrS3ZiZFdYSXd2RGRnDQotRU9jS2p2YmRRdm1kRExoRA0KLURuY0xLdmJkQ0lrQmppRmoNCi1FT2JqanZiZGpKZWdqTlhyDQotRG5jTEt2YmRjSWxpa0Z2eA0KLUVQRExLdmJkUmtaRnRmanMNCi1Eb0NqanZiZGN6WW94WlJDDQotRU9jTEt2YmRhdGFnWGpzaA0KLURuY0xLdmJkamNManFHdUgNCi1Eb0NqanZiZE1TV2x5dVF6DQotRG9Da0t2YmRqdXZuRGJZWA0KLURuYmpqdmJkaU1FZE9VY1oNCi1FUENqanZiZGNUREt0RUtCDQotRG5iamp2YmR3ekhlZXhFcg0KLUVQRExLdmJkZW1HV2dOSmsNCi1FT2JqanZiZGFrTGZPbkRBDQotRVBETEt2YmRUZnpuTHZ2Rg0KLURvREtqdmJkYU5MQnNVbUgNCi1FT2NMS3ZiZGh6VkZrcU5mDQotRG9ES2p2YmRaUk5GSWxkcQ0KLURvREtqdmJkbHJaVlpzRUoNCi1FT2JrS3ZiZGJVYWdYanRJDQotRG9ETEt2YmRVeUhzeWtQTw0KLUVPYmpqdmJka1Z3TmRDWVgNCi1FUERMS3ZiZFVWa3BKdEJSDQotRVBES2p2YmRyTXpKeGtnaQ0KLUVPY0tqdmJkU0xZZlVnTFQNCi1Eb0NqanZiZE1Sd05adHB6DQotRVBETEt2YmRJeFRhZ2xSUQ0KLUVQRExLdmJkSnFaZG5lbkYNCi1Eb0RMS3ZiZFpNUmRUbWttDQotRG5ia0t2YmRBTkh4cnZ5eA0KLUVQQ2pqdmJkRmtFcmJoTlYNCi1FT2NMS3ZiZFdTTnhDRWtjDQotRVBDamp2YmRpQ1BDZHdRcQ0KLURuYmtLdmJkYkF2RWVvb3cNCi1FT2NLanZiZGVGT3JCdmNLDQotRG5ia0t2YmRhUmVjSHRHTA0KLURuYmtLdmJkWnNoaHhjcm4NCi1FT2NLanZiZHFUdEhSckt0DQotRU9iamp2YmRhdUJnWGp0SQ0KLUVPY0tqdmJkUWRDYVFSRHINCi1Eb0NqanZiZEZWeG9wTWpGDQotRVBETEt2YmRJR2daeVh3Zw0KLURvRExLdmJkUnBUZmpGZFgNCi1EbmJrS3ZiZFNRVUdpZkVYDQotRG5iamp2YmRweG9JSFJFWQ0KLURvRExLdmJkcWlBSmVNbmUNCi1FT2NMS3ZiZENJa0JrSkZqDQotRG5jTEt2YmRGZktTTmhzcQ0KLURvREtqdmJkd1drYVZhVnUNCi1FUERMS3ZiZE5lRVRpSktkDQotRG5iamp2YmRoYk9jRXZwcQ0KLURvQ2tLdmJkcmJHTWxITFoNCi1EbmJqanZiZExBamdNYXdxDQotRG5jTEt2YmRscXlVelNkSg0KLURuY0xLdmJkWWtxZFRuTG0NCi1FT2NLanZiZFlrckRzbk1ODQotRU9jTEt2YmRuQ0tYWG5uVg0KLURvQ2pqdmJkRG5jTExXYmQNCi1Eb0RLanZiZFlwbUZKTWRxDQotRVBETEt2YmRGcEFUWEhGeQ0KLURvREtqdmJkSnZVZkVFZmkNCi1FUERMS3ZiZG1KRVVSVlNCDQotRG5jTEt2YmR0YmNWV3Vubw0KLUVPY0xLdmJkYlVhZ1lLdEkNCi1FT2JrS3ZiZGNKTWpLZXZ4DQotRG5iamp2YmRLVnVHRUZHaQ0KLURvQ2tLdmJkWk1SY3ROa20NCi1FT2NMS3ZiZFlwbUVpTWRxDQotRG9ES2p2YmRZcG1FaG1FcQ0KLURuY0tqdmJkempWUVFEcnQNCi1FUENqanZiZHpIWWxBTWR3DQotRVBETEt2YmRZa3Fjc25NTg0KLUVPYmtLdmJkaWllaEptWVMNCi1EbmJqanZiZER3d2t0VVVNDQotRU9ia0t2YmRyb3VuakN1Zg0KLURuYmpqdmJkR0dLUm1pVVINCi1FT2NMS3ZiZHd6SUdGeEVyDQotRVBES2p2YmRPRWRVSkpMRQ0KLURvQ2tLdmJkZk5GdmdNakwNCi1Eb0RMS3ZiZE9FZFRoaGpkDQotRG5ia0t2YmR5VE9JbVNDSA0KLUVPY0xLdmJkeml0cFFFU3QNCi1Eb0RLanZiZHVEQ3VXdlBQDQotRG9Damp2YmRUcHBudVVoTg0KLURvQ2tLdmJkSUJsWmR6QUQNCi1Eb0NqanZiZFpRbUZKTWVSDQotRG5ia0t2YmRKWHNhZ2xRcA0KLURvQ2tLdmJkU1ppZ3JjV0ENCi1FT2JqanZiZFpzaUl5RVRPDQotRVBES2p2YmRaTHFjdE9MbQ0KLURuY0tqdmJkd3loR0Z4RlMNCi1EbmNMS3ZiZHF3UGtjSXlSDQotRVBES2p2YmRSa1lmVWdMVA0KLURvQ2tLdmJkeHhJakJwWmsNCi1EbmNMS3ZiZHFseWpZbElKDQotRVBDamp2YmRSYWNlTGlZaw0KLUVQREtqdmJkamxiTHllSFANCi1FUERLanZiZHJiRm1MZmtaDQotRVBDa0t2YmR2QkVZc1BGSQ0KLURuY0tqdmJkU0JkRWxKWWsNCi1FUERLanZiZHB4b0lIUkVZDQotRVBDa0t2YmRqaEhNRmZOaw0KLUVQQ2tLdmJkQU5JWXNYWngNCi1FT2JqanZiZG5HZHhOT0haDQotRU9iamp2YmRLUXpGUEdPRg0KLURvQ2pqdmJkdHVuWUtSVEENCi1EbmJqanZiZExGZkhiQlJWDQotRU9jS2p2YmRwZWRFc3VhSQ0KLURuYmpqdmJkWWtxY3Nta20NCi1FUENrS3ZiZGJyY0xVRUtCDQotRG5ia0t2YmROUVlRdW5Hcw0KLURvRExLdmJkSmNKYnFLQ3gNCi1FUERMS3ZiZEl4VGJIbFJRDQotRG5ia0t2YmR2d01BdkJXVg0KLUVPY0tqdmJkZkhrVnFuUWcNCi1FT2NMS3ZiZGJLa2ZQTmNBDQotRVBETEt2YmRWQWJRcnBxeQ0KLURuY0xLdmJkV1JuWGFlTGMNCi1FUENrS3ZiZEZwQVRYR2V5DQotRG9ETEt2YmR5ZnhsQU5GWA0KLURvQ2tLdmJkRlZ5UVFNakYNCi1FT2NMS3ZiZHhuU2hYcmhjDQotRG9Damp2YmRtYWl2d29PVg0KLURuYmtLdmJkYnNETFRkSmENCi1Eb0NrS3ZiZFV0TXRHTVZqDQotRG5iamp2YmROVlNxa05BWA0KLUVQRExLdmJkV2ZZeXRBT3MNCi1FUENrS3ZiZFp5RUpuRExyDQotRU9ia0t2YmR5WGhqQ1Faaw0KLUVPYmtLdmJkZG9GU2tVVHINCi1FT2NLanZiZGVBVHFNeEtHDQotRG5ia0t2YmRuUHl5V0t5Qw0KLURuY0tqdmJka3lTclRaSFUNCi1EbmJqanZiZG1mZHhOTmZ5DQotRVBDa0t2YmRIbEJ6blhRaw0KLUVQREtqdmJkWmlzSVBnQ0cNCi1EbmNMS3ZiZHJFRWhvblZhDQotRG9ETEt2YmRyeWtvc0JIbg0KLUVPYmtLdmJkcXZwTGJpWlINCi1Eb0NqanZiZGhrZURuVWNaDQotRG9Da0t2YmRWd0l3dWRFZw0KLURuY0xLdmJkeVhpSmFvekwNCi1Eb0NrS3ZiZHl6ZU9TSUloDQotRVBDamp2YmRrVndOY2JZWA0KLURuY0xLdmJkVGt1b0F1b0oNCi1FUENqanZiZGlqRmdpbVlTDQotRG5jTEt2YmRsaUVVUlVyQg0KLURvREtqdmJkVVJRb1V1SU4NCi1Eb0RLanZiZHJNekp4a2hKDQotRVBDa0t2YmRxWW5nZnFFWQ0KLUVQRExLdmJkZHd6VVRyRnoNCi1Eb0NrS3ZiZHlZSWpCcFprDQotRVBDamp2YmRzc1NTeHpFYw0KLUVPYmtLdmJkRmVqU05pVVINCi1FUENrS3ZiZHJFRkpQbXVhDQotRG5ia0t2YmRpaWZJSm1Ycg0KLUVQRExLdmJkWkxyRVVPTG0NCi1FT2JqanZiZEdGaXFuSXRSDQotRG9Da0t2YmRqdXdOY2F3dw0KLURuY0tqdmJkbXBaeHVrWWINCi1Eb0RMS3ZiZHFkRkpRTnVhDQotRVBES2p2YmROUVlSV09Hcw0KLURvQ2pqdmJkWmVZR3poSWINCi1FT2JqanZiZFpqU2dwSENHDQotRU9iamp2YmRoZmpEWXZLVg0KLUVQQ2tLdmJkSnB6Rk9lbWUNCi1EbmJrS3ZiZGxoY3NwdHJCDQotRG5jTEt2YmRGZWlxbkpUcQ0KLUVPYmpqdmJkWnhjaW5Da3INCi1FUERMS3ZiZEZWeVFQbUtGDQotRU9ia0t2YmRlbGZXZmxqTA0KLUVPY0tqdmJkSnB5ZG5lbkYNCi1EbmJrS3ZiZGJWQ0d3a1VJDQotRU9ia0t2YmRlbUZ3R21Kaw0KLURvQ2tLdmJkQnNBYnNmV3INCi1FUERMS3ZiZEpZVGJIa3FRDQotRG5jS2p2YmR5TnJneFRJYw0KLURvREtqdmJkR1FBU3ZmZXkNCi1FT2NMS3ZiZFJOWUNaT1V6DQotRU9jS2p2YmR5emVPUmdpSQ0KLUVPY0xLdmJkWlFtRWhsZVINCi1FUENqanZiZG10dHlqalJmDQotRG5iamp2YmRMQkxHbUJ3cQ0KLUVPY0xLdmJkS1Z1RmRGR2kNCi1FUENrS3ZiZHhtc0h3c0pEDQotRG9ETEt2YmR5T1RJWHJpRA0KLUVQRExLdmJkWnNpSlljc08NCi1FUENqanZiZGp2WE9FQnhYDQotRG9Da0t2YmRsWlNxc1pHdA0KLURvREtqdmJkQURSeEtaaVENCi1FT2NLanZiZHpvUVJFY01ZDQotRU9ia0t2YmRHR0tSbWhzcQ0KLUVPYmpqdmJkSnV0ZkRkZ0oNCi1Eb0RMS3ZiZFVzbHRGa3ZLDQotRU9ia0t2YmRIRGtXS0JqSw0KLURuY0tqdmJkTHF3TXpWUXoNCi1FT2JqanZiZGFSZWNJVGZMDQotRG9ES2p2YmRha01HUE5jQQ0KLURuYmpqdmJkd1hNQldBdlYNCi1FT2NLanZiZFF3T0VETGhEDQotRU9jS2p2YmRBTWd4cndaeA0KLURuYmpqdmJkcXF0a05rQW0NCi1Eb0RMS3ZiZGJobUtLZXdZDQotRG9Damp2YmRRbVlCeG5Veg0KLURuYmtLdmJkdlBUenFLbnQNCi1FUENrS3ZiZEpxWmVQR09GDQotRG9ETEt2YmRUZnpuTVhWZQ0KLURvQ2tLdmJkRnlWVWFEd2INCi1EbmNMS3ZiZEZ4dVVhRHdiDQotRU9ia0t2YmRobEVjblVieQ0KLURuYmpqdmJkQ0pMQ0toZksNCi1Eb0NrS3ZiZFB5TkFHcnJLDQotRU9jS2p2YmRWZ3hWeEd4eg0KLUVPYmtLdmJkU3hLa216angNCi1FT2NMS3ZiZGVtRndITWpMDQotRU9iamp2YmRyRUVpUG5WYQ0KLURvQ2tLdmJkRGpJSnZYakENCi1FUENqanZiZFlUTUFtVG9ZDQotRG9Damp2YmRiTE1Gbm1jQQ0KLURvQ2tLdmJkcm91bmpDdWYNCi1FUERLanZiZHJKQUplTk9lDQotRG5jTEt2YmRKYmljUWpEWQ0KLUVQQ2pqdmJkbXBaeHZMWkMNCi1EbmNMS3ZiZFZyTnhDRWxEDQotRG5ia0t2YmREb0RMS3dDZA0KLURvREtqdmJkc1prcFNhSU8NCi1FUENqanZiZE5RWVJWbkdzDQotRG9Da0t2YmRWck9YYkZNRA0KLURvQ2pqdmJkbFlycXJ5SFUNCi1Eb0RMS3ZiZFZUbHRHTVZqDQotRG5jTEt2YmR3ekhmR1hlUw0KLUVQQ2tLdmJkbWFqWFlPblYNCi1FT2NMS3ZiZFpMcWRUbWxODQotRG9ETEt2YmRxZEZKUU9XQg0KLUVPYmtLdmJkVmd3dlhnWXoNCi1FUERLanZiZGtNYWt6RkhQDQotRG9ES2p2YmRha0xmUE5jQQ0KLUVPYmpqdmJkeVlKSmJRWmsNCi1Eb0RMS3ZiZERpZ2l2WGpBDQotRG9ETEt2YmRIRUxXSmFqSw0KLUVPYmpqdmJkWkd2ZEFQVEoNCi1FT2NLanZiZFVHem1rdnVlDQotRG5jTEt2YmRTWmlnc0N2QQ0KLURvRExLdmJkZEJzTXJBVG0NCi1FT2JrS3ZiZG1TWlV6U2RKDQotRG5jS2p2YmRqQVBmYVFHag0KLURvREtqdmJkbEJNb05BTEENCi1EbmJrS3ZiZEpUWkFybHhNDQotRU9iamp2YmRIZ0haeVh3Zw0KLUVQRExLdmJkaHpVZWtwbkcNCi1FUERLanZiZEVPY0tqdmJkDQotRG9Da0t2YmRqY0xrUkhVZw0KLUVPYmpqdmJkQmlMQmtJZWoNCi1EbmJqanZiZFpNU0VVTmttDQotRG9Da0t2YmR6UlBOSkp3QQ0KLUVQQ2pqdmJkR2RLdWlhaksNCi1FUERMS3ZiZHJFRklwT1ZhDQotRVBDa0t2YmRLZkdIYkFwdQ0KLUVQREtqdmJkVXRNc2ZNVmoNCi1Eb0RMS3ZiZGJWQ0hZS3NoDQotRVBETEt2YmRFenRSRk1DaQ0KLUVPY0xLdmJkSm1BRHpHdGENCi1EbmJqanZiZHRTclN4eWRjDQotRG9Damp2YmRBQ3JZS1ppUQ0KLUVQREtqdmJkc3Jxc1l6RWMNCi1Eb0NqanZiZHVMeFhBdEF3DQotRG9Damp2YmRFenRRZGtiaQ0KLURvRExLdmJka0NsS3BnVkgNCi1Eb0RMS3ZiZFNDRGVNSllrDQotRG9ETEt2YmRweG9JR3FEeA0KLURvQ2tLdmJkRGlnalZ4S0ENCi1FUERLanZiZEdHS1NPSlVSDQotRU9jTEt2YmRpTGVEblZEWg0KLURuYmpqdmJkeU9TZ3hTaGMNCi1FUERMS3ZiZE5zVVdIRXVRDQotRU9jTEt2YmRZcG1GSW1FcQ0KLURvREtqdmJkWkxyRHRPTG0NCi1EbmNLanZiZEp2VkdFRkhKDQotRU9jS2p2YmRaaXJnb2dDRw0KLUVQQ2tLdmJkS0NqQ3FKYngNCi1FT2JqanZiZGdLZnpjR0FFDQotRG5jS2p2YmRaalRJUUhCZg0KLURvREtqdmJkUkRjQlFRY3INCi1EbmJrS3ZiZFpRbUVpTkZSDQotRU9ia0t2YmRTaVpqUkFCTQ0KLUVPYmtLdmJkVVJST3R0Z20NCi1FT2JqanZiZGxaU3JTeGZ0DQotRG9Damp2YmROeFBWemRPVQ0KLUVQQ2pqdmJkcUFoZUFXaEUNCi1FUENrS3ZiZHdYTGFXQldWDQotRG9Da0t2YmRLREtEUWpDeA0KLUVPY0tqdmJkZWhMVnFuUWcNCi1Eb0NrS3ZiZFp4ZEptY01TDQotRG5jTEt2YmREakhqVnhLQQ0KLUVPYmtLdmJkWHJsQW1Ub1kNCi1FT2NMS3ZiZHd0bGVSWWxPDQotRVBDamp2YmR0bFlXYVVCWA0KLUVQQ2tLdmJkaVV6RlhTVkMNCi1Eb0NqanZiZGNKTkprRndZDQotRU9ia0t2YmRhUmViaFVHTA0KLUVPY0tqdmJkTkhEUU1vdGsNCi1Eb0RMS3ZiZHlUTmhscWJIDQotRU9jTEt2YmRLZkdJQmFSVg0KLUVPYmtLdmJkS2FMSE1hd3ENCi1Eb0NrS3ZiZG5DS1d3b051DQotRVBETEt2YmRIZmZ6WXd4SA0KLURuY0tqdmJkbkdkeE1tZ1oNCi1FUENqanZiZE5Qd3B2TmdUDQotRG9ETEt2YmRZa3JFVU9NTg0KLURvREtqdmJkVHFST3VVZ20NCi1Eb0RLanZiZHZCRHlUUEVoDQotRG5ia0t2YmRKS0VBS1FIRQ0KLUVPYmpqdmJkaUJvQ2VXcVINCi1EbmJrS3ZiZG1SeVV5cmNpDQotRG5ia0t2YmRKdXVHRUZHaQ0KLUVPY0xLdmJkRnlWVkJFWGINCi1FT2JrS3ZiZHd5aEdGd2RyDQotRU9ia0t2YmRDVEJEVGV2cg0KLURvREtqdmJkamJra1FmdGcNCi1FT2NLanZiZFZBYlFycVJ5DQotRU9iamp2YmRMQWtITWF3cQ0KLUVPYmpqdmJkRXp0UWVMY0oNCi1FUENqanZiZGNJbGlrRnZ4DQotRG5jS2p2YmRaeUVKbWNMcg0KLUVPYmpqdmJkcWNlSlBtdWENCi1EbmNLanZiZFpubWlFZHlqDQotRU9jTEt2YmRpR2ljWXVqVg0KLURvQ2tLdmJkRmVpck5odFINCi1Eb0NrS3ZiZERqSGpWeEtBDQotRG5ia0t2YmRxRmRFc3ZCSQ0KLUVPY0tqdmJkY0ltS0tldngNCi1FUERMS3ZiZFFtWGJaT1V6DQotRG5jS2p2YmRxY2RocE52Qg0KLUVPYmtLdmJkc1B2T2pDdkcNCi1Eb0RLanZiZEZWeVFQbUtGDQotRU9jS2p2YmRxWW5oR3BjeA0KLUVQREtqdmJkS2ZHSUJhUlYNCi1FUENrS3ZiZG5HZVhtTmdaDQotRG5jS2p2YmRLVnRlZEVnSg0KLUVPYmpqdmJkQ1RBYnNld1MNCi1EbmJqanZiZGVFb1JhdmNLDQotRVBDa0t2YmROc1VWZmVWUQ0KLUVQRExLdmJkR2RMV0tDS0sNCi1EbmJqanZiZEtmRmhDQlJWDQotRG9Damp2YmRaTHJEdE9MbQ0KLUVQRExLdmJkaHR5ZHZyVkMNCi1Eb0RMS3ZiZFpqVElQZmFmDQotRG9Damp2YmRicmNMVGRLQg0KLURuY0tqdmJkem9RUkZDbFkNCi1EbmJqanZiZFNLeUZ1SEtzDQotRU9jS2p2YmRaUWxkaU1lUg0KLURuY0xLdmJka3lTclRZZnQNCi1EbmJrS3ZiZFNMWkdVZ0tzDQotRVBDa0t2YmR1Q2J1V3ZPbw0KLURvREtqdmJkc0NGbGtnTFoNCi1Eb0NqanZiZHJEZGlQbXZCDQotRVBETEt2YmR5U25KTlJiSA0KLUVQRExLdmJkRG9ES2tYREUNCi1FUENqanZiZGlqR0hqTXdyDQotRU9jTEt2YmRlSmpTV1V6bg0KLUVQQ2tLdmJkS1dWRmRFZ0oNCi1Eb0RMS3ZiZFZZaFR5a1BPDQotRU9ia0t2YmRlSmlxdXR6bg0KLURvQ2pqdmJkUmp5RnVHa1QNCi1Eb0RLanZiZEhEa1dKYWpLDQotRVBDa0t2YmRiS2xGbm5EQQ0KLUVQREtqdmJkUXdPRURNSGMNCi1Eb0RMS3ZiZFpzaGlaRVNuDQotRU9iamp2YmRreVRTU3lHdA0KLURvQ2tLdmJkeFVtRXB5TG4NCi1FT2JqanZiZE11U3FrTkFYDQotRG5jTEt2YmRiaU5Ka0dXeA0KLURvQ2pqdmJkV0lZVndmeHoNCi1EbmNMS3ZiZGtWd05jYXd3DQotRG9ETEt2YmRPRkVUaGhqZA0KLURvRExLdmJkZG5kcmtVVHINCi1EbmJrS3ZiZHl6ZU5ySGlJDQotRVBDamp2YmRaUk5FaGxkcQ0KLURuY0tqdmJkaGxFZE51RFoNCi1Eb0NqanZiZHFxdUtta0FtDQotRG9ES2p2YmRGeVZWQkR4Qw0KLUVQQ2tLdmJkSnV0ZWNlSEoNCi1EbmJrS3ZiZGlCb0RFdnFSDQotRG9ETEt2YmRMcXZselVweg0KLUVQQ2pqdmJkclJ1S25MQk4NCi1EbmJrS3ZiZFpqU2hRSENHDQotRG5ia0t2YmRjU2NMVGNqQg0KLUVPY0tqdmJkeU5yZ3hTaUQNCi1FT2NLanZiZFppcmhQZmJHDQotRG9ETEt2YmRrSUdrZWZPTA0KLUVQRExLdmJka0Nra1JHdGcNCi1FUERLanZiZGJVYWZ4TFRoDQotRU9ia0t2YmRoZmpEWXZLVg0KLURvQ2pqdmJkcGVjZHN2QWgNCi1FT2NLanZiZHBmRGVVV0FoDQotRG5ia0t2YmRQeG1BR3NSag0KLURuYmpqdmJkWk1TRVVObE4NCi1FT2NMS3ZiZHFGZEZUdkFoDQotRG9Damp2YmRXWEpYdkRlSA0KLURvQ2pqdmJkcVVUZnFyTFUNCi1FUENqanZiZHZPc3pxTFBVDQotRU9ia0t2YmRtdHVaa0pxZg0KLUVPY0xLdmJkamdma2VmTmsNCi1Eb0NqanZiZGhhb0NlV3FSDQotRU9iamp2YmRLYUxITWJYcQ0KLURvQ2pqdmJkU0xaRnRmanMNCi1Eb0NqanZiZEZmS1NPSXRSDQotRG5ia0t2YmRxVVVIU1NLdA0KLUVQQ2tLdmJkSEVLdWpCaksNCi1FT2JrS3ZiZElzWkJTbVhsDQotRU9jS2p2YmRSRGNBcFFjcg0KLURvREtqdmJkdUREVld2UFANCi1FT2NLanZiZExCTEdsYXhSDQotRG9ETEt2YmRJeFRiSGxRcA0KLUVQRExLdmJkclJ0a09LYU4NCi1Eb0NqanZiZFJqeUZ0ZmtUDQotRVBES2p2YmRHUUFTd0hHWg0KLUVQREtqdmJkTWdEUGxvdUwNCi1FT2JrS3ZiZEpYdENJTHFRDQotRU9ia0t2YmRyRUZKUU52Qg0KLURvQ2tLdmJkZU9lVEt0VVMNCi1FT2JrS3ZiZFNRVGdKZkR3DQotRVBDamp2YmRTUVVHaWVkWA0KLURvQ2pqdmJkcVVVR3JSanQNCi1FUERLanZiZFRxUlBWVWdtDQotRVBDa0t2YmRJTUJ6bldxTA0KLUVPYmtLdmJkaGFuY0V3UlINCi1FT2NLanZiZHJNekp4a2dpDQotRVBDamp2YmRoYlBERXZxUg0KLUVQREtqdmJkWkhYRUFPc0oNCi1FUERMS3ZiZHhuU2hYcmlEDQotRG9Da0t2YmRMTEFndkFLWg0KLURvQ2tLdmJkaGZpY1l2SnUNCi1FT2JqanZiZFpSTWVJbGVSDQotRG5jTEt2YmRZZndFQU9yaQ0KLURvRExLdmJkRHd4TVR0VU0NCi1Eb0NrS3ZiZFdSbXdiRkxjDQotRG5ia0t2YmROUVlSVm5IVA0KLURuYmpqdmJkam1DTVplSFANCi1FUERLanZiZGFOS2JUVWxnDQotRVBDa0t2YmRpZGtIVlBBTw0KLURvQ2pqdmJkSGZnWnh3eEgNCi1FT2JqanZiZHh3aGliUHlrDQotRVBES2p2YmRGamVUREhtVg0KLURvREtqdmJkaUNPY0ZXcVINCi1Eb0NrS3ZiZEptQUR5ZnVCDQotRU9jTEt2YmRoZmljWXVqVg0KLURuY0xLdmJkWXpiZlNKdXkNCi1Eb0NqanZiZGJVYWdYanRJDQotRG9ES2p2YmRqS0ZoS05ZUw0KLUVPY0xLdmJkQ0lrQ0xKR0sNCi1Eb0RLanZiZFpzaGlaRVNuDQotRVBDa0t2YmRTUVRmakZjdw0KLUVPYmtLdmJkaU1FY25VY1oNCi1FUERMS3ZiZHlPVEh4U2lEDQotRVBDamp2YmRGamVUREhtVg0KLURuYmpqdmJkSnV1R0VGR2kNCi1FUERLanZiZGhrZURuVkN5DQotRVBDa0t2YmRWQWFxU3ByWg0KLURuY0xLdmJkVlVOVGVsVmoNCi1Eb0NrS3ZiZGZJTFZyTnBnDQotRG5jS2p2YmROSERRTlB1TA0KLUVPY0xLdmJkTFpRaXJ6dGYNCi1FT2JqanZiZEdja1dLQ0pqDQotRU9ia0t2YmRJSEd5eVh3Zw0KLURuY0xLdmJkaVV5ZHdTVkMNCi1Eb0RMS3ZiZHBlY2R0V0JJDQotRU9jTEt2YmRMR0ZnYWFSVg0KLUVPY0xLdmJkZXp1eGVKVVgNCi1FT2JrS3ZiZGdHTHltZ0hBDQotRG5iamp2YmRFdlpRUU5KZQ0KLURuY0tqdmJkSmNKYnBqRFkNCi1Eb0RLanZiZEl4VGFoTHFRDQotRG5jS2p2YmRCY3BBdkpsZg0KLUVPYmpqdmJkblB5eVZrWWINCi1FT2JqanZiZGZOR1dmbGpMDQotRG5iamp2YmRpZUxIVlBBTw0KLUVPY0tqdmJkUk5ZQ1ltdHoNCi1FUERLanZiZGlISmNZdWl1DQotRU9ia0t2YmRNb3dxVm5IVA0KLURvQ2pqdmJkaVV5ZHZyVWINCi1FT2JqanZiZFpNUmNzbkxtDQotRG5ia0t2YmRhU0ZjSVVGaw0KLURuYmpqdmJkWnlFS05jTHINCi1EbmJrS3ZiZFpubkpGRXpLDQotRG5jTEt2YmRKU3lCU2x4TQ0KLURvQ2tLdmJkWHNNQW1VT3gNCi1FUENqanZiZGRuZVNrVHRTDQotRU9jTEt2YmRWd0l4V0VFZw0KLUVQQ2pqdmJkeHNPSk1yQmcNCi1EbmNLanZiZGtJSE1HR09MDQotRG5jTEt2YmRHRmpSbWhzcQ0KLURuYmtLdmJkeVNtaU5SYWcNCi1FUERLanZiZHB5UEhnUkVZDQotRG5iamp2YmRHWlV1QWN4Qw0KLURuYmpqdmJkaUhLRFl2SnUNCi1Eb0NqanZiZHRsWHdCVUJYDQotRU9ia0t2YmRUa3ZQQXZQSg0KLUVPY0tqdmJkU3hMTG16a1kNCi1EbmNLanZiZGhnSmNaVmpWDQotRU9jTEt2YmRaaXJnb2dCZg0KLUVPY0tqdmJkVHVrcEtVQlINCi1FUERMS3ZiZFFsd2F4bXR6DQotRG9Da0t2YmROeE91emROdA0KLUVQRExLdmJkdUNidVhXUFANCi1FUENrS3ZiZG1iSnZ3b051DQotRU9ia0t2YmRLREtDcUpieA0KLUVQQ2pqdmJkeU5zSVhyaGMNCi1FUENrS3ZiZFNDRUVraVlrDQotRU9ia0t2YmRPRkRzaGlMRQ0KLURvREtqdmJkWm5taUZFeksNCi1FT2JrS3ZiZEpiakRSS0RZDQotRU9ia0t2YmRZZnZkQU9yaQ0KLURuY0tqdmJka0RManBmdUgNCi1Eb0NrS3ZiZHNycXNaWmRjDQotRG9ES2p2YmRMQkxITkJ3cQ0KLURuY0xLdmJkRGpIaldZS0ENCi1Eb0RLanZiZFpRbGVJbGRxDQotRG9ES2p2YmRhdGJHeEt0SQ0KLUVPYmpqdmJkVVdNUUtVQXENCi1FT2NMS3ZiZGxoZFVRdHJCDQotRVBDamp2YmRBTWhaVFd5eA0KLURvQ2pqdmJkamhHbEdGbWsNCi1Eb0RMS3ZiZEhnR3paWHhIDQotRU9jS2p2YmRyeWtvcmFJTw0KLURvREtqdmJkakplaEpsd3INCi1FT2JrS3ZiZHJFRWhvbldCDQotRVBDamp2YmRpVXllV3JVYg0KLURuYmtLdmJkTlFZUlZtZ1QNCi1FUENqanZiZFZVTlVGa3VqDQotRG5iamp2YmRFWVlNVHRVTQ0KLURvREtqdmJkWXBsZGhsZHENCi1FUENqanZiZHRsWVdhVGFYDQotRG9Damp2YmRvem1kTFhvQQ0KLURuYmpqdmJkWm5uSkZGWmoNCi1FT2JqanZiZFpzaGlaRHJuDQotRVBETEt2YmRaalNoUGZhZg0KLURvQ2tLdmJkcnBWbmlidkcNCi1Eb0NrS3ZiZFF3TmNibEhjDQotRU9ia0t2YmR4WmdlZlhkcg0KLURvREtqdmJkTmRkVUloa0UNCi1EbmNLanZiZGNJbUprRndZDQotRG9ES2p2YmRaaXJoUUdhZg0KLURvREtqdmJkcXdQa2NKWlINCi1FUERMS3ZiZGtIZ0xmRm5MDQotRG5jS2p2YmRscXh1WnJjaQ0KLURuY0tqdmJkUmFkRkxpWWsNCi1FUERLanZiZElIR3l4eFhnDQotRU9ia0t2YmRtcFp5Vmp5Qw0KLUVQQ2tLdmJkVWFCcVNwcXkNCi1FT2NLanZiZHFaT2dmcUR4DQotRU9ia0t2YmRrTkJsWmVHbw0KLUVPYmpqdmJkT0FJcnNqU0ENCi1FUERMS3ZiZEV2WlBwTktGDQotRG5iamp2YmRjellveFpSQw0KLURvREtqdmJkdkFkWlRQRWgNCi1EbmNLanZiZHFVVGZxckt0DQotRVBDa0t2YmRaR3dFQVBUSg0KLUVQRExLdmJkWk1TRVVOa20NCi1FUENqanZiZFlrcWN0TmxODQotRG5ia0t2YmRlRW5xYXdESw0KLURvQ2pqdmJkS1Z1R0VGSEoNCi1FT2NLanZiZHppdG9wRHNVDQotRG5iamp2YmRzQmZOTGdMWg0KLURuYmpqdmJkY0ltSmtGdngNCi1FUENrS3ZiZE1nQ3BOUVVrDQotRU9jTEt2YmRaUW1FaGxlUg0KLUVQRExLdmJkdFRScnh6RWMNCi1EbmNMS3ZiZEtWdUZjZUhKDQotRVBDa0t2YmR5ZnhsQU1kdw0KLURuYmtLdmJkc1prb3NCSG4NCi1FUERMS3ZiZHdXbEF2QlZ1DQotRG9ETEt2YmRscXh1WnJkSg0KLUVQRExLdmJkTVJ3TXpVcHoNCi1FT2JqanZiZEZrRlRDZ21WDQotRU9ia0t2YmRIRUt2SmJLSw0KLURuY0xLdmJka05DTVpkZm8NCi1Eb0NqanZiZGRvRlNrVHRTDQotRVBDa0t2YmRScFRmakZkWA0KLURvREtqdmJkSUdnWnlZWGcNCi1FUENrS3ZiZEJpTENMSWZLDQotRG9Damp2YmRLUXlkbmZOZQ0KLUVQQ2pqdmJkSGdHelpZWUgNCi1EbmJqanZiZFlOcUFZVXZVDQotRG5jS2p2YmRHY2tWakJqSw0KLURvQ2pqdmJkamhITUZlbWsNCi1EbmJrS3ZiZGtJR2tlZW5MDQotRG5jTEt2YmRtYWl2d25tdQ0KLUVQRExLdmJkbXVWWmtKcWYNCi1FUERLanZiZE5kZFVJaGpkDQotRG9Da0t2YmRSRGJhUVJFUw0KLURuY0xLdmJkVHZMb2pVQlINCi1EbmNMS3ZiZHRTclN4eWVEDQotRG5jS2p2YmRqZ2ZsR0Ztaw0KLURvQ2tLdmJkUXdOZERMZ2MNCi1Eb0NrS3ZiZEVYd2tzc3NsDQotRG9ES2p2YmR0QUhSSUFBcg0KLURvRExLdmJkU1BzZ0plY3cNCi1FT2JrS3ZiZGpnZ0xmR09MDQotRG9Damp2YmRTQmRGTGh4aw0KLURvQ2tLdmJkaU1FZE51RFoNCi1Eb0NqanZiZGh0ekZXclViDQotRVBDamp2YmRTS3hldGdLcw0KLURvRExLdmJkZG5kc0xUdFMNCi1EbmNLanZiZHRjQ3R3Vm5vDQotRG9ETEt2YmRBQ3JZSnpKUQ0KLUVPY0xLdmJkeU9TaFhyaGMNCi1FT2JqanZiZHFxdUtuS2FODQotRG9Da0t2YmRuQ0p2eE9uVg0KLUVQRExLdmJkRldZcFFNakYNCi1EbmJqanZiZG5DSnZ3b051DQotRU9ia0t2YmRoZmpDeVdLVg0KLURvREtqdmJkck5aalpMaEoNCi1EbmJrS3ZiZHlOcmd3c0ljDQotRVBDa0t2YmRTWmpJVERXQQ0KLURuY0xLdmJkcWlBSmVOT2UNCi1Eb0NrS3ZiZGhhb0RFdnBxDQotRU9jTEt2YmR0a3d3QXRBdw0KLURuY0tqdmJkc1B2T2ljV0cNCi1Eb0NqanZiZFdYSllWY2RnDQotRG9ETEt2YmRtSWRVUXVTQg0KLURuYmtLdmJkYXVCZ1lLdEkNCi1FT2NMS3ZiZEpiaWNSS0N4DQotRG9ETEt2YmRzUHVvSmNWZg0KLUVQQ2tLdmJkZklMV1JuUkgNCi1FUENrS3ZiZEFNaFlydnpZDQotRG9Damp2YmRLV1VlZEVmaQ0KLUVQQ2tLdmJkaGFvREV2cVINCi1FT2JqanZiZHhWTWVSWk1PDQotRG5jS2p2YmRGYU9xWkp6bQ0KLURuY0tqdmJkSXJ5QXJsd2wNCi1FT2JrS3ZiZFJXbWNjTGdjDQotRVBDa0t2YmRzUHVuaWJ2Rw0KLUVPY0tqdmJkUWNjQlBwY3INCi1FUERLanZiZHNzUnNZekZEDQotRG5jTEt2YmR5U21pTXFiSA0KLUVPYmtLdmJkWkxxZFRtbE4NCi1FUERMS3ZiZFZBYXFUUXF5DQotRG5jTEt2YmRGV1pQb21KZQ0KLURvREtqdmJkVVZrb2pUYVINCi1EbmNLanZiZFVMdlBCV1BKDQotRU9iamp2YmRVc2xzZkx1ag0KLURvREtqdmJkc0JmTWxIS3kNCi1Eb0NqanZiZGt5U3JUWWdVDQotRVBES2p2YmRZZ1hFQVBUSg0KLUVPY0xLdmJkcnpNUHNBaE8NCi1Eb0NrS3ZiZGN5eHBYeVJDDQotRG5jTEt2YmRrSUdrZWVtaw0KLUVPYmtLdmJkVnFuWGJFbEQNCi1FT2JrS3ZiZE11U3FrTkFYDQotRG5jTEt2YmRrTkNMeWRmbw0KLUVPY0xLdmJkVVZsUUpzYVINCi1FT2NLanZiZGN6WlB4WXFDDQotRU9ia0t2YmRXSVh2WGZ4eg0KLURvQ2tLdmJkZG5kc0xUdFMNCi1EbmJrS3ZiZEZmSnFtaVVSDQotRG5jS2p2YmRVUlJPdVZJTg0KLUVPYmtLdmJkZGRuckNYREsNCi1EbmNMS3ZiZFp5RUptY0xyDQotRVBDa0t2YmRWZ3hWeEhZeg0KLURvREtqdmJkRmZLUm1pVHENCi1FUERLanZiZGRDVE5TQVVODQotRG9ETEt2YmRVeGdzeWtPbg0KLURvRExLdmJkQmhqYkxJZksNCi1Eb0NrS3ZiZEZlalJtaVRxDQotRVBETEt2YmRtdVV5a0pxZg0KLURvQ2tLdmJkVlRtVGZMdWoNCi1Eb0NqanZiZGtOQ0x5ZGdQDQotRG5iamp2YmRIZmZ6WXhZSA0KLUVPYmtLdmJkcHhuZ2ZwY3gNCi1FUENqanZiZEtRekZPZk9GDQotRG5jTEt2YmRPRWRUaGlLZA0KLUVPY0tqdmJkSlN5QlROWGwNCi1EbmNMS3ZiZHlOc0lYcmlEDQotRU9jTEt2YmRKWVRhZ2twcA0KLURvQ2pqdmJka01ha3pFZm8NCi1Eb0RMS3ZiZFpqU2dwR2JHDQotRG5iamp2YmRTUVVISmZEdw0KLURuY0tqdmJkUnBUZ0plZFgNCi1EbmNLanZiZHJ5a29zQklPDQotRU9ia0t2YmRHWXR0YUVZQw0KLURvQ2tLdmJkWnhjak5jTVMNCi1Eb0NqanZiZFJhZEVsSXlMDQotRG9ES2p2YmRreVNxcnlHdA0KLUVQREtqdmJkaUhKYnlXSnUNCi1FUENqanZiZHd6SGVld2RyDQotRVBES2p2YmRRd05jY0xoRA0KLURvQ2pqdmJkYkJWZUdQb3cNCi1FT2NLanZiZGRkbnJDV2NLDQotRVBDamp2YmRKWHRDSGtxUQ0KLUVPYmtLdmJkcmJGbGxITFoNCi1EbmNLanZiZEFDcXhLWmhwDQotRG9Da0t2YmRKWHRDSUxwcA0KLURuY0tqdmJkRVlZTVRzc2wNCi1FT2NLanZiZHdqdmRIenpHDQotRVBETEt2YmRlbUdXZ01paw0KLUVQQ2pqdmJkcXZva2NJeVINCi1EbmJrS3ZiZFVhQ1FycHJaDQotRG9Damp2YmRLQ2pDcUtEWQ0KLUVQREtqdmJkWVNsQk10T3gNCi1FUERMS3ZiZHlYaUtCb3pMDQotRU9ia0t2YmRaeGRLTmNNUw0KLUVPYmtLdmJkQ0RwQlZqTkcNCi1EbmNLanZiZG1nRXhNbWdaDQotRU9iamp2YmRIa2F6bldxTA0KLUVPYmpqdmJka05DTHpFZm8NCi1FUERMS3ZiZHlOcmd3c0ljDQotRG5jS2p2YmRuSEZZTk5meQ0KLURvQ2tLdmJkRHd3a3RUc2wNCi1FUERMS3ZiZFRsV09hV1BKDQotRG9ES2p2YmRtSWN0UlZSYQ0KLUVQQ2tLdmJkZUVucWJXYmoNCi1FUERLanZiZFRZTE1OemtZDQotRG5jS2p2YmRrSGdMZkdOaw0KLURuY0xLdmJkblB5eHZMWkMNCi1FT2NMS3ZiZGpLR0hqTXhTDQotRG9Damp2YmRpWnRmTVJPRw0KLUVQREtqdmJkRmVpcW1oc3ENCi1FUERLanZiZERvREtqdmJkDQotRU9jTEt2YmRLUlplT2ZPRg0KLURvREtqdmJkem9RUWVDa3gNCi1FT2JqanZiZEVPY0xLd0RFDQotRG9Da0t2YmRyYWZOTGdMWg0KLUVPYmpqdmJkTWZib21QdUwNCi1EbmNLanZiZFVRcVBVdGhODQotRU9jTEt2YmRkakpyV1V6bg0KLURvRExLdmJkdkJEeVNvRWgNCi1EbmJqanZiZFZVTXNlbFZqDQotRG9Da0t2YmRkbmRya1VVUw0KLUVPYmtLdmJkbXBaeHZLeGINCi1FUENrS3ZiZG1iSnZ4UE51DQotRVBDa0t2YmRtZmR3bG5IWg0KLURuYmtLdmJkWlJNZGhtRlINCi1EbmJqanZiZFlTbEJOVG9ZDQotRG5jTEt2YmR6b1FSRkNsWQ0KLUVQQ2tLdmJkVlpJVHpMT24NCi1EbmNLanZiZFp0SWlaRHJuDQotRG5jS2p2YmRGVnhvcE5LRg0KLUVPY0tqdmJkdFRTU3h5ZGMNCi1FT2JqanZiZFVWbFFLVGFSDQotRVBETEt2YmRrTWJMekVnUA0KLURvRExLdmJkS0RKY1FpY1kNCi1Eb0RMS3ZiZEptQUVaZ1ZCDQotRU9jS2p2YmRDV3pkSkZQdg0KLURuY0xLdmJkZG5lVExVVVMNCi1FT2JqanZiZEJjb2FXSmxmDQotRVBES2p2YmRHY2p2SmJKag0KLURvQ2pqdmJkZGRvUmF2Y0sNCi1FT2NMS3ZiZEFNaFpTdnl4DQotRG5iamp2YmRhamxHT21jQQ0KLURvQ2tLdmJkQ0lrQ0xKRmoNCi1EbmJqanZiZE1TV21adHB6DQotRU9jS2p2YmROR2NRTXBVaw0KLUVPY0tqdmJkVHFST3VVaE4NCi1Eb0NrS3ZiZEZWeG9vbGllDQotRG9ES2p2YmRVUXBudVVnbQ0KLUVQREtqdmJkbkJpd1hubXUNCi1EbmJqanZiZEp1dUdEZGdKDQotRVBDamp2YmRaTHFjc25MbQ0KLUVPYmtLdmJkWm5taGVFeksNCi1Eb0RLanZiZFhzTUFsdE94DQotRU9ia0t2YmRpTUVkT1VjWg0KLURvREtqdmJkWlJORWhsZVINCi1Eb0RMS3ZiZE1JYkxweEFTDQotRG9ETEt2YmRWd0l3dWNkZw0KLURvQ2pqdmJkUmJEZUxpWkwNCi1EbmNMS3ZiZFpNUmN0TmxODQotRG9Da0t2YmRHY2p2SmJKag0KLURuYmpqdmJkU1ppaFNjV0ENCi1FUERMS3ZiZGtETGpxSFVnDQotRG5iamp2YmRaaXNJUGZhZg0KLUVPYmpqdmJkbXBaeVdMWkMNCi1FT2NMS3ZiZHJiR05MZ0xaDQotRG5ia0t2YmRrVnZtZEJ3dw0KLUVPYmpqdmJkZG9GU2pzdFMNCi1FT2JqanZiZHh3aUpiUHlrDQotRVBES2p2YmRUdkxvaXRBcQ0KLURvQ2tLdmJkWkxyRHNuTU4NCi1Eb0RLanZiZE9BSlRVSnJBDQotRU9ia0t2YmRVUlFudHVIbQ0KLUVPYmtLdmJka0lHa2VmT0wNCi1EbmNMS3ZiZHNDRmxsSEt5DQotRVBDa0t2YmRhdGFmeEt0SQ0KLURvQ2pqdmJkaWlmSGpNeFMNCi1EbmJrS3ZiZFpzaUl5RHNPDQotRG5jS2p2YmRpZUtnVW9BTw0KLUVQQ2pqdmJkQmhrQ0xJZWoNCi1EbmJqanZiZER4WGt0VHNsDQotRU9ia0t2YmRLQ2pDcUtDeA0KLUVPY0xLdmJkSXdzYWhMcVENCi1FUERMS3ZiZGh6VWZMcG5HDQotRU9iamp2YmRiQXZFZXBQdw0KLUVPY0xLdmJkU0xaRnVIS3MNCi1EbmJrS3ZiZElpZEFKb2dFDQotRG5iamp2YmRKYmpEUWljWQ0KLUVQRExLdmJkUXdPRGJsSUQNCi1FT2JrS3ZiZHFaT2dmcUVZDQotRU9iamp2YmRrV1duRGJYdw0KLURuY0xLdmJkRXZaUHBNakYNCi1FUERMS3ZiZEtReWRuZk5lDQotRU9iamp2YmRVV01RSnRBcQ0KLUVPY0xLdmJkcXJVam1rQk4NCi1Eb0RMS3ZiZEptQUVaZnVCDQotRG9Da0t2YmRodHlkdnF0Yg0KLURvQ2tLdmJkdEFIUWhBQlMNCi1FUERMS3ZiZHhaaEdHWGRyDQotRVBES2p2YmRtU1pWWnJjaQ0KLURuYmtLdmJkWmpUSG9nQ0cNCi1FT2JrS3ZiZFlxTWRpTWVSDQotRG9ES2p2YmRkd3pVVVJleg0KLURvRExLdmJkYktsRm5uREENCi1FUENrS3ZiZEdHS1NPSlRxDQotRU9ia0t2YmRMR0ZnYkJSVg0KLURvQ2tLdmJkS3lRalN6dUcNCi1EbmNLanZiZEpjSmNSSmNZDQotRU9jTEt2YmRuQml3WVBPVg0KLUVPY0xLdmJkTEdHSGFhUlYNCi1FT2JqanZiZGRuZVNrVHRTDQotRG9ES2p2YmRpTGRkT1VjWg0KLUVPYmtLdmJkc1B2T2pDdWYNCi1EbmJrS3ZiZFp5RUtPQ2xTDQotRG9Damp2YmR5emVPUmhJaA0KLURuYmtLdmJkaGtlRG11Q3kNCi1FT2JrS3ZiZHZ2a2FXQXZWDQotRU9jS2p2YmR6ZVpuemR6UQ0KLURvQ2pqdmJkVkFhcHJxU1oNCi1FT2JqanZiZGpoR2tlZk5rDQotRG5jTEt2YmRTS3hmVkhMVA0KLUVQQ2pqdmJkWlJNZUltRlINCi1EbmNMS3ZiZEZlaXJPSlRxDQotRG5jTEt2YmRGZkpyT0l0Ug0KLURvRExLdmJkbW95eVZrWWINCi1EbmNMS3ZiZGRkb1JhdmNLDQotRG9ETEt2YmRhdUJmeEt0SQ0KLUVPYmpqdmJkU1B0SEpmRHcNCi1FUENqanZiZENFUUJXSm1HDQotRG9Damp2YmREbmJrTFdjRQ0KLUVQRExLdmJkVlVOVUdNVmoNCi1EbmJrS3ZiZG5RWnlWanlDDQotRG5ia0t2YmRnRmt5bWZnQQ0KLURvREtqdmJkUkRjQlFRZFMNCi1FT2NLanZiZHRjQ3VXdk9vDQotRU9ia0t2YmRscll1WnJkSg0KLURvQ2pqdmJkWmlyZ29nQmYNCi1Eb0RMS3ZiZE1mY1BtUHVMDQotRU9jS2p2YmREd3dsVHRUbA0KLURuY0xLdmJkd1hMYVdBdXUNCi1FUERLanZiZFVhQnFTcHF5DQotRU9ia0t2YmRIbEJ6blhSTA0KLUVQQ2tLdmJka01ha3pGSFANCi1EbmJrS3ZiZHFaT2dmcGN4DQotRG5ia0t2YmRVTVdPYVdQSg0KLURuY0xLdmJkTWZib2xwVkwNCi1FT2JqanZiZGZla3luR2dBDQotRVBDa0t2YmRXV2lYdkVGSA0KLURvQ2pqdmJkcHhuaEdxRHgNCi1Eb0RLanZiZHNRVm5qRFdHDQotRU9ia0t2YmRZTnFBWHR1dA0KLURuY0xLdmJkRG5ia0xYQ2QNCi1FT2JrS3ZiZEthTEdtQndxDQotRG9Da0t2YmRCdnpjaUZQdg0KLURvRExLdmJkaktGZ2lsd3INCi1FUENrS3ZiZFVhQnFUUXF5DQotRG9ETEt2YmRWZ3d2WUhZeg0KLUVQREtqdmJkSUhHeXlYd2cNCi1FUERLanZiZEVYeE1Uc3RNDQotRG5ia0t2YmRRY2NCUHBjcg0KLURuYmtLdmJkTWdDcE5QdUwNCi1FUERLanZiZFNQdEhLRmN3DQotRG9ES2p2YmRrSUhNR0ZuTA0KLURuY0xLdmJkbkdlWG1OZ1oNCi1Eb0RMS3ZiZGh0eWVXcXVDDQotRU9iamp2YmRxR0VGVVZhSQ0KLUVPY0xLdmJkTlB3cHVtZ1QNCi1EbmJrS3ZiZFpzaGlZZFRPDQotRG9ES2p2YmRaTVNFVG1rbQ0KLURuY0xLdmJkUmJEZGtoeUwNCi1FUENqanZiZFR2TVFKdEJSDQotRU9ia0t2YmRqdlhPRUJ3dw0KLURuY0xLdmJkclhQa2JpWlINCi1FT2NMS3ZiZEZlalNPSlRxDQotRU9jS2p2YmRlZ2p2Um5SSA0KLUVQRExLdmJkSnZWR0RlSEoNCi1FT2JqanZiZFhybEJNdE94DQotRG5jS2p2YmRGZWpTTmhzcQ0KLUVQREtqdmJkQmlMQmppR0sNCi1FT2NLanZiZGRpaXJWdHpuDQotRVBETEt2YmRWQkJxVFJSeQ0KLURvQ2tLdmJkZXFhV3prY1ANCi1FT2JqanZiZHFZbmdnUkVZDQotRVBES2p2YmRFQVJpTlp3WA0KLUVPYmpqdmJkU1FUZmlmRVgNCi1FT2JqanZiZExCTEhOQnhSDQotRVBDa0t2YmROSENwTXBVaw0KLUVQQ2tLdmJkS1Z1R0RkZmkNCi1FUENrS3ZiZHhybkltUmJIDQotRU9jTEt2YmRaUk5FaU5GUg0KLUVPY0xLdmJkdGJjVXZ1bm8NCi1FUENqanZiZEpUWkFzTlhsDQotRVBETEt2YmRGVnlRUGxqRg0KLURvQ2tLdmJkaWVLZnRvQU8NCi1FT2JrS3ZiZFpNU0VUbk1ODQotRG9Damp2YmRkZVBTQnZjSw0KLURuY0xLdmJkcVVVSFNTTFUNCi1Eb0RMS3ZiZFpRbGRobUVxDQotRG9ES2p2YmRPVFR1Z0ZVcA0KLURuY0xLdmJkWnNpSlpFU24NCi1EbmJqanZiZHRiY1V3V1BQDQotRVBETEt2YmRkd3pUdFJleg0KLURuYmpqdmJkWm9OaGVGWmoNCi1FUENrS3ZiZEtmRmdiQXB1DQotRG9ETEt2YmRoeXRmTVFtZg0KLURuYmtLdmJkbkdlWGxuR3kNCi1FUENqanZiZFNCY2RsSXlMDQotRG5jS2p2YmRiQXZGRnBQdw0KLUVPYmpqdmJkem9QcGVDbFkNCi1FT2NMS3ZiZHF3UU1ESXlSDQotRVBDamp2YmRtYWl2eE9tdQ0KLUVQQ2pqdmJkSXdzYWhMcVENCi1EbmNMS3ZiZGRkb1NCd0NqDQotRU9jTEt2YmRyRUVocE52Qg0KLURvQ2pqdmJkRVBDa0t2Y0UNCi1EbmNLanZiZGVQRXNMVHNyDQotRG5jS2p2YmRtUnlWWnNFSg0KLURuYmpqdmJkWkxxZFRuTU4NCi1FUERLanZiZFJiRUZNSXhrDQotRU9iamp2YmRKWHNiSGxSUQ0KLURuY0tqdmJka0RNTFFmdGcNCi1FT2NLanZiZE9FY3RKSWpkDQotRG5ia0t2YmRxVHNmclJrVQ0KLUVQREtqdmJka0lHa2VlbkwNCi1Eb0RMS3ZiZFV4aFVaam5uDQotRG5jTEt2YmR3eWhGZXhGUw0KLUVQREtqdmJkYkxMZk9tY0ENCi1EbmJrS3ZiZHRiYnVYV1BQDQotRU9jTEt2YmRZcG1FaG1GUg0KLURuYmtLdmJkeG1zSHhUSWMNCi1Eb0RLanZiZHpub3FGREx4DQotRU9iamp2YmRtZmR4TW5IWg0KLUVPYmpqdmJkWVRNQk5VT3gNCi1FT2JqanZiZEFEUndpekpRDQotRU9jTEt2YmRNb3hRdk9Hcw0KLUVPY0xLdmJkcldvbERKWXENCi1FUENqanZiZGVGUFJiWERLDQotRG9ES2p2YmRyRGRocE52Qg0KLUVQREtqdmJkWnhkS09ETHINCi1FT2NMS3ZiZFdTTndhZGxEDQotRU9jS2p2YmR4cm1obHFiSA0KLURvRExLdmJkem9QcUVibFkNCi1EbmNLanZiZFRrdW9CV1BKDQotRG5iamp2YmRyeWtwU2FIbg0KLUVPY0tqdmJkS1dVZkRkZ0oNCi1EbmJrS3ZiZFpNU0VVT01ODQotRU9ia0t2YmRTQmNka2h4aw0KLURuYmpqdmJkSUdmeXlZWGcNCi1FUENrS3ZiZG5Cald3b09WDQotRU9jS2p2YmR6YUFQR2dCbA0KLURuYmpqdmJka1Z2bWRDWHcNCi1Eb0RMS3ZiZGtETGtRZnVIDQotRG9Da0t2YmRWcW5YYkZNRA0KLURuY0tqdmJkV1dpWHVjZUgNCi1Eb0NqanZiZEJ2emRJZVB2DQotRG5jS2p2YmRMRmZJQ0JRdQ0KLURuY0xLdmJkZUZQUmF3REsNCi1EbmNLanZiZGptQmt5ZGdQDQotRU9iamp2YmRWVU10Rmt1ag0KLUVQRExLdmJkclNVam1rQk4NCi1Eb0RMS3ZiZFNQc2dLRmRYDQotRG9ES2p2YmR1RERWWFZubw0KLURvQ2pqdmJkTXVTcWptQVgNCi1FUENrS3ZiZFp5RUptY0xyDQotRG5ia0t2YmRNZmNRTW91TA0KLURvRExLdmJkVU1XUEF1bmkNCi1EbmJqanZiZGRaeHBZWlJDDQotRVBES2p2YmRiQXZFZW9wWA0KLURuYmtLdmJkZG9FcmtVVVMNCi1Eb0NqanZiZGVQRXJqc3RTDQotRU9jS2p2YmRHS2VUREhsdQ0KLUVPYmpqdmJkZklLdlNPUkgNCi1FUENqanZiZFVzbVRlbFdLDQotRU9ia0t2YmRhTWtCc1ZNZw0KLURvQ2tLdmJkUmp4ZlZIS3MNCi1EbmJrS3ZiZE1wWVF1bWdUDQotRG5jTEt2YmRWd0l4V0VGSA0KLURuY0tqdmJkYU1rQ1RVbUgNCi1Eb0RMS3ZiZGhsRkVOdURaDQotRVBDamp2YmRaaXNJUGdDRw0KLUVQQ2pqdmJkWm5uSkVkeksNCi1FUERLanZiZEdMRXNESU5WDQotRU9iamp2YmRZemNGcktWeQ0KLUVQREtqdmJkWmlyaFBnQmYNCi1FUERMS3ZiZEthTEdtQ1hxDQotRU9ia0t2YmRkb0Vya1Rzcg0KLURvQ2tLdmJkUlhOZENrZ2MNCi1Eb0RMS3ZiZEV2WlFRTktGDQotRG9Da0t2YmRab05oZGVaag0KLUVQQ2tLdmJkaGtkZE50YnkNCi1FUERMS3ZiZFpMckR0TmxODQotRG5jS2p2YmRSYkRkbEl4aw0KLUVQQ2tLdmJkRU9jS2p3Q2QNCi1EbmNLanZiZGxxeVV5cmRKDQotRG9ETEt2YmROZGRUaGhrRQ0KLUVPY0tqdmJkd3loRmV3ZHINCi1FUERMS3ZiZGlVeWR3U1ZDDQotRG5ia0t2YmRZemNGcWpXWg0KLURuYmtLdmJkaUJvQ2R3UlINCi1FT2NMS3ZiZHBlY2RzdWFJDQotRVBDa0t2YmRRbHhDWW5Veg0KLUVQRExLdmJkVnZoeFdFRWcNCi1FT2NMS3ZiZGxaU3FyeUd0DQotRVBDa0t2YmRVYUNRc1FxeQ0KLURvQ2tLdmJkdkFkWlNuZGgNCi1EbmJqanZiZG10dHlrS1JmDQotRVBDa0t2YmRZZ1dkQVBUSg0KLURvQ2tLdmJkbFlycXNaR3QNCi1EbmJrS3ZiZFpzaUl4Y3JuDQotRG9Damp2YmRkZU9xYXZiag0KLUVPYmtLdmJkYlZCZndqc2gNCi1FT2JqanZiZE1veFF2T0hUDQotRVBDa0t2YmRSYkVGTGlZaw0KLURvQ2tLdmJkbGhkVHFVcWENCi1FT2NMS3ZiZE1JYk1SWUFTDQotRU9ia0t2YmREbmNLa1diZA0KLURuY0xLdmJkZlNBdnprY1ANCi1EbmJrS3ZiZHhzT0lscWJIDQotRG9Da0t2YmRBRFNZS1pocA0KLUVQQ2pqdmJkWnNoaVpFU24NCi1Eb0NqanZiZGllTEd1UEFPDQotRVBDamp2YmRrSGdNRmVuTA0KLUVQREtqdmJkZEJybHJBVU4NCi1EbmNLanZiZGRkb1NDWENqDQotRVBDamp2YmRzUVdPaWJ2Rw0KLUVPYmtLdmJkS2tCSHZBS1oNCi1FT2JqanZiZGtXV21kQnd3DQotRU9iamp2YmRuR2VYbU5nWg0KLUVPY0xLdmJkeU5yZ3dyaGMNCi1EbmJrS3ZiZE5kZFRoaUxFDQotRG5jS2p2YmREakhpdllLQQ0KLUVPYmpqdmJkV1hJeFdEZGcNCi1FT2JqanZiZHJNeWl4bElKDQotRU9jS2p2YmRjeXlQeFlwYg0KLURuY0tqdmJkY3l4b3d4cGINCi1FT2NMS3ZiZGhiT2NGWFFxDQotRU9jS2p2YmRIRGp1aWJLSw0KLURvREtqdmJkaVZaZVhSdUMNCi1FT2NLanZiZG5CalhZT25WDQotRG5ia0t2YmRPVFR1ZmR0cA0KLURvREtqdmJkVkFiUlRSU1oNCi1EbmJqanZiZFJYT0VETGdjDQotRU9jTEt2YmR6bm9wZGNMeA0KLURuY0xLdmJkUk5YYXlPVXoNCi1EbmNMS3ZiZFNQdEhLRmRYDQotRVBES2p2YmR4VWxkcVlrbg0KLURvQ2tLdmJkWlJORWlORXENCi1FUERLanZiZHJiRmxsR2p5DQotRVBDamp2YmRVeUhzekxQTw0KLURuY0xLdmJkeHdoaWJRWmsNCi1FT2NLanZiZEZXWW9wTWllDQotRU9jS2p2YmRhTktiVFZNZw0KLURuYmpqdmJkbGlFVHFVckINCi1FT2JqanZiZFJYT0Ria2djDQotRG5ia0t2YmRUbFdQQldQSg0KLUVPY0tqdmJkT0ZFVGhpS2QNCi1FT2JqanZiZE1TWE16VlF6DQotRU9iamp2YmRIRGtWakNLSw0KLUVQRExLdmJkcUZjZVR1YUkNCi1FT2NLanZiZEZ5VXRhRHhDDQotRU9jTEt2YmRtZ0V4TW5HeQ0KLURuY0tqdmJkdGxZV2FVQlgNCi1Eb0RLanZiZENEb2FXSmxmDQotRVBES2p2YmRreVRTVFlnVQ0KLURvQ2pqdmJkcXF0am5MQW0NCi1EbmJqanZiZEdZdHVBZFhiDQotRG9Da0t2YmRCaGpiTElmSw0KLUVQREtqdmJkTlB3cVZtZnMNCi1Eb0NqanZiZHNycXNZekZEDQotRVBES2p2YmRTUHNmakZkWA0KLUVQQ2pqdmJkWnlEak5ia3INCi1FUERLanZiZHFaT2dmcGN4DQotRVBDa0t2YmRxR0RlVVZhSQ0KLURvREtqdmJkVVZrcEtVQXENCi1Eb0NqanZiZFJwVUdqR0VYDQotRG9ETEt2YmRtZ0ZZTW1meQ0KLUVQRExLdmJkUnBVSEtGY3cNCi1Eb0RMS3ZiZEV2WlFQbUtGDQotRG9ES2p2YmRac2hoeGRUTw0KLURvQ2pqdmJkaVp1R01ST0cNCi1Eb0RLanZiZGZwQnp2ZFlJDQotRVBDamp2YmRtZ0ZZTk9HeQ0KLUVPY0tqdmJkTnJ0V0dkdHANCi1EbmJqanZiZFdIeFZ3Z1l6DQotRVBDa0t2YmRKYmpEUktEWQ0KLUVQQ2pqdmJkdVdPWUpwc0ENCi1EbmNLanZiZGVoTFZyT1JIDQotRG9Damp2YmRHRmpTT0l0Ug0KLURvQ2tLdmJkanV3T0RiWVgNCi1FT2JqanZiZEpUWkJTbVhsDQotRG5ia0t2YmR6UW9OSWl3QQ0KLUVPYmpqdmJkakpmSGlsd3INCi1FT2NLanZiZEpweWVPZk9GDQotRG5iamp2YmRxRmRFc3VhSQ0KLUVQRExLdmJkVXhoVHpLb08NCi1FUERLanZiZEJyYUNzZlhTDQotRG9Damp2YmRMQWpnTkJ4Ug0KLUVPYmtLdmJkbGhkVHFVckINCi1FUENqanZiZFpvT0llRlpqDQotRG5iamp2YmRyRGRocE51YQ0KLUVQQ2pqdmJkSUhIWnh4WUgNCi1FUENrS3ZiZGlNRWRPVkN5DQotRG9ES2p2YmRoZ0pieHZLVg0KLURvRExLdmJkVXlIc3lqb08NCi1Eb0RLanZiZEdRQVRYR2ZaDQotRG5iamp2YmR2QWRZcm9FaA0KLUVQQ2tLdmJkaHR5ZHZyVWINCi1Eb0NqanZiZHNRV09pY1dHDQotRG5jTEt2YmRjSk1qTEdXeA0KLURvQ2tLdmJkSXdzYWdsUXANCi1Eb0NrS3ZiZFlrckVVT0xtDQotRU9ia0t2YmRWdmh4V0RlSA0KLUVQRExLdmJkWk1SZFRuTG0NCi1Eb0NqanZiZEFEUndpekpRDQotRG9ES2p2YmRTd2prbXpqeA0KLURuYmtLdmJkQmlLYkxJZksNCi1FUENqanZiZFJ5aWdzRFdBDQotRVBES2p2YmRSWE9FQ2toRA0KLUVPYmpqdmJkZHhadFRxZXoNCi1FT2JqanZiZGJCVmRmUG93DQotRG5jTEt2YmRNZmNRTlFWTA0KLUVQREtqdmJkVkJCcVRRcloNCi1EbmNLanZiZFpNUmN0T0xtDQotRG5jS2p2YmRHR0pyT0lzcQ0KLUVQQ2pqdmJkWk1TRVRtbE4NCi1Eb0RMS3ZiZGhsRWRPVkRaDQotRU9jTEt2YmRPaEFYeUFaQg0KLURvQ2tLdmJkeU9USVlTaUQNCi1Eb0NqanZiZFV0TlVHTVZqDQotRU9ia0t2YmRXWEpZV0RkZw0KLUVPY0xLdmJkQmhqYktoZWoNCi1FT2JrS3ZiZFZ3SXd2RGRnDQotRVBETEt2YmR6alVwUURzVQ0KLUVPY0tqdmJkcUFpRkFYSGQNCi1Eb0RMS3ZiZHFyVWtOamFODQotRU9jS2p2YmRZT1JBWVV2VQ0KLUVPY0xLdmJkY0lsakxGd1kNCi1EbmJrS3ZiZFZ3Slh2RGRnDQotRG9ES2p2YmRWQkNRc1JTWg0KLURvRExLdmJkbXVVektpcWYNCi1FT2JrS3ZiZEpZVUNJTHBwDQotRVBES2p2YmRzUVZvS0N2Rw0KLUVQRExLdmJkbW95eVZrWkMNCi1FUERMS3ZiZHNDR05MZmp5DQotRU9jS2p2YmRiaU5LTEdXeA0KLURvQ2pqdmJkcnBWbmpEV0cNCi1FT2JrS3ZiZGZWenhQaXpzDQotRG5ia0t2YmRSWE9EY0xnYw0KLUVQQ2pqdmJkakpmSUpseFMNCi1Eb0NqanZiZFpMcWNzbkxtDQotRG5jS2p2YmRqdXZuRUNYdw0KLURvRExLdmJkRVBES2tYQ2QNCi1EbmJqanZiZE9Tc3ZHZHVRDQotRG9ES2p2YmRJTUJ6bXZwaw0KLUVQQ2pqdmJkcXJVa09MQW0NCi1FUENqanZiZFRrdk9hVm9KDQotRU9iamp2YmRvem1kS3dvQQ0KLURuY0xLdmJkRHhYa3N0VGwNCi1FT2NLanZiZGZNZXdITWlrDQotRG9ETEt2YmRHS2VUQ2dtVg0KLUVPYmpqdmJkeG5TZ3dzSWMNCi1FUENrS3ZiZGFhVmRlcFB3DQotRU9ia0t2YmRxR0VGVVZhSQ0KLURuY0xLdmJkamJsS3BnVWcNCi1Eb0RMS3ZiZFJXbkVETGhEDQotRG5iamp2YmRGeHVWQWN4Qw0KLURuY0tqdmJkcVpPaEdwY3gNCi1Eb0NrS3ZiZGZIanZSblFnDQotRG5ia0t2YmR3TXZBTkRlTg0KLUVPYmtLdmJkRmZLU09Jc3ENCi1Eb0NqanZiZG1halhZUE51DQotRU9ia0t2YmRBTkh5VFhaeA0KLUVQQ2pqdmJkTEZmSGJBcVYNCi1Eb0NqanZiZFZnd3V4SFl6DQotRVBDamp2YmRRdm1jYmxIYw0KLURvREtqdmJkYVNGYmhVR0wNCi1EbmNMS3ZiZHpIWk1BTkZYDQotRG5jS2p2YmR5U25KTlJiSA0KLURvQ2pqdmJkTXBZUlZuSFQNCi1FT2JrS3ZiZGRlUFNCd0RLDQotRVBDa0t2YmRNZmNQbVFVaw0KLUVPYmpqdmJkTWdDcE5RVkwNCi1Eb0RLanZiZHJFRklvbldCDQotRG9ETEt2YmRGamRzQ2dtVg0KLUVPYmpqdmJkd3RtRlJZbE8NCi1EbmJqanZiZEl3dEJna3FRDQotRVBDamp2YmR1YUR4cm5kaA0KLUVQRExLdmJkU2h6S1JBQk0NCi1EbmJqanZiZGZIanZSblJIDQotRU9jS2p2YmRCaUxCamlHSw0KLUVQQ2pqdmJkQ0VQYVdLTkcNCi1Eb0RLanZiZHRiYnVXdW9QDQotRG9ES2p2YmRlZ2tXUm1xSA0KLURuYmpqdmJkTmVFVGlKTEUNCi1FUENrS3ZiZGpjTGtSSFVnDQotRG5iamp2YmRqdlhPRUJ3dw0KLUVPY0xLdmJkVGxXUEF2T2kNCi1Eb0NqanZiZHJNeWl4a2hKDQotRU9ia0t2YmRxR0VFdFdBaA0KLURuY0tqdmJkYkJWZUdRUHcNCi1Eb0RMS3ZiZHBzc2ZxcWp0DQotRG5ia0t2YmRGV1pQb21KZQ0KLURvREtqdmJkU0JjZGtpWWsNCi1Eb0NrS3ZiZHZCRVpTb0ZJDQotRU9jS2p2YmRSYWNlTGh4aw0KLUVPY0tqdmJkSktFQUtRSEUNCi1Eb0RMS3ZiZGRaeVFZWXBiDQotRU9iamp2YmRlWHpUc3Fleg0KLURuY0xLdmJkQ1NhQ3RHWFMNCi1FUENrS3ZiZGxaU3JTeUhVDQotRU9jTEt2YmRUSlppcUFCTQ0KLURuY0xLdmJkdkFkWXNPZGgNCi1EbmJrS3ZiZGN5eG94WlFiDQotRG5ia0t2YmRoYW5iZHdSUg0KLUVQQ2pqdmJkYkJWZUZvcFgNCi1EbmNLanZiZEdMRlRESG1WDQotRG9Damp2YmRpWnVHTHBtZg0KLUVPY0xLdmJkSmJqQ3FKYngNCi1FT2JrS3ZiZEdkTFdKYktLDQotRG9Damp2YmRSa1pHVkhLcw0KLURvQ2pqdmJkR2NrV0phaksNCi1EbmNLanZiZEFNZ3hydnl4DQotRVBDamp2YmRFUERLanZiZA0KLUVPY0xLdmJka0RManFHdGcNCi1Eb0RMS3ZiZE5QeFJWbkdzDQotRG9ES2p2YmR5U21obVJhZw0KLUVQQ2pqdmJkVnFuWGFka2MNCi1FUERLanZiZFR1bFBpdEFxDQotRU9iamp2YmRHTEVyY0hsdQ0KLURvRExLdmJkSEVMV0tDSmoNCi1FT2JqanZiZGJWQ0hZTFVJDQotRG5jS2p2YmRxdnBMYmlaUg0KLUVQQ2pqdmJkdkFkWlNvRkkNCi1FT2NMS3ZiZGZqZnpjR0FFDQotRG5iamp2YmRhTkthcnRtSA0KLUVPY0xLdmJkY1RES3NkSmENCi1EbmNMS3ZiZE9Tc3VmZHVRDQotRG5ia0t2YmR5WUlpYXBaaw0KLURvQ2pqdmJkdW5zenFLb1UNCi1Eb0NrS3ZiZGRuZHNMVHNyDQotRG9ES2p2YmR4eEpLQm95aw0KLURvRExLdmJkcm92T2lidkcNCi1FUENrS3ZiZGlMZGRPVkRaDQotRVBDa0t2YmRpQm5jRldxUg0KLUVPY0xLdmJkWlFsZGlORlINCi1Eb0NrS3ZiZE9FY3RKSktkDQotRG9Da0t2YmRyTXpLWk1JSg0KLURuYmtLdmJkVmhZVndnWXoNCi1FT2NMS3ZiZFF2bkRibEhjDQotRG9ETEt2YmRtSkVVUlZSYQ0KLURvRExLdmJkQ1RCRFVGd1MNCi1FUENrS3ZiZE5yc3ZIRXVRDQotRG5ia0t2YmRlZ2tWcW5SSA0KLURvQ2pqdmJkZEJybHJBVG0NCi1Eb0NrS3ZiZENKTENMSkZqDQotRU9jS2p2YmR4WmdlZlhlUw0KLUVQREtqdmJkWnRKSlpEc08NCi1Eb0NrS3ZiZFF2bWRETUlEDQotRG9ETEt2YmRSYWNlTGh4aw0KLURuYmtLdmJkU0JkRkxoeGsNCi1Eb0RLanZiZE9UVHVmZHRwDQotRG9ETEt2YmRuUVp4dWp5Qw0KLURuYmpqdmJkWnNoaHlFVE8NCi1Eb0NqanZiZHR2T1lKcVRBDQotRG5jTEt2YmRSTXhCeG10eg0KLURuYmpqdmJkRXpzcUVsQ2kNCi1FT2JqanZiZEtlZkhiQXFWDQotRG5ia0t2YmRtcFp5V0t5Qw0KLURuY0xLdmJkTlFYcVdPR3MNCi1FUERMS3ZiZFZUbHNla3VqDQotRVBDa0t2YmRHY2p2SmFqSw0KLUVQRExLdmJkSXJ5QXJseE0NCi1Eb0RMS3ZiZHd5aEdGd2RyDQotRVBDa0t2YmR6YUFPZ0dhbA0KLURuY0xLdmJkaUhLQ3h2SnUNCi1FT2NLanZiZExCS2dNYlhxDQotRG9Damp2YmRUcHBvVlZJTg0KLUVQREtqdmJkTlB4UXZPSFQNCi1EbmJqanZiZFR2THBKc2FSDQotRG5jS2p2YmRuVlV5amlxZg0KLUVQQ2pqdmJkVlVOVGZMdksNCi1FT2NMS3ZiZER4WUx0VHRNDQotRG5ia0t2YmRkZVBTQ1hDag0KLUVQRExLdmJkZ0dMek9ISEENCi1Eb0NrS3ZiZFR1a3BLVGFSDQotRG5jTEt2YmRWVU10R01XSw0KLUVPYmtLdmJkWG5SQVlWV1UNCi1EbmNMS3ZiZHlxT21KSndBDQotRG9ES2p2YmRGVnlRUU5LRg0KLURuY0tqdmJkdk9zenFMT3QNCi1FUENrS3ZiZFpSTWRobUZSDQotRVBETEt2YmRobEZEbXVDeQ0KLUVPY0tqdmJka0lITGVlbkwNCi1EbmJqanZiZHFjZUpRT1dCDQotRG9Da0t2YmR6aXRwUGRTdA0KLUVQQ2pqdmJkRmVpcW1odFINCi1Eb0RMS3ZiZHNRVm9KY1ZmDQotRVBETEt2YmRVUXBudVZJTg0KLURvRExLdmJkV1NOeEJkbEQNCi1FUENqanZiZHB5UEhnUWN4DQotRU9jS2p2YmRVeUhzeWpvTw0KLURvQ2pqdmJkeHJuSk5TQ0gNCi1Eb0NqanZiZEtES0NwakN4DQotRVBETEt2YmR4c09JbHJCZw0KLURvQ2tLdmJkbkdkeE1uSFoNCi1FUERMS3ZiZGZIa1dTTnBnDQotRG5iamp2YmRrSGdNR0ZuTA0KLUVPY0xLdmJkeG1zSVlTaUQNCi1Eb0RMS3ZiZEVYeExzc3NsDQotRG9ES2p2YmRqRkxHdVBBTw0KLUVPY0xLdmJkZUVvUmF3Q2oNCi1Eb0RLanZiZHlPVElZU2lEDQotRG5iamp2YmRJSEd5eVh4SA0KLURuY0tqdmJkVHFRb1V1SG0NCi1FT2NLanZiZE1mY1FOUHVMDQotRG5ia0t2YmRhdGJHeEtzaA0KLURvREtqdmJkT1RVV0hFdHANCi1FUENrS3ZiZEdMRlRDZ21WDQotRG9ES2p2YmRrSGZrZkdOaw0KLUVPYmpqdmJkSlh0QmhNUlENCi1FT2JrS3ZiZFJwVUhLR0VYDQotRG5iamp2YmRpVXpGV3JWQw0KLUVQQ2tLdmJkbGlFVHFVckINCi1EbmJrS3ZiZFpqVElRSEJmDQotRG9Damp2YmRaTVNFVG5MbQ0KLUVQRExLdmJkRldZb29tS0YNCi1FUERMS3ZiZFJhY2VMaHhrDQotRG9ETEt2YmRFQVNKTlp3WA0KLUVQRExLdmJkR1pVdGFFWGINCi1EbmNMS3ZiZHlOcmd4U2lEDQotRU9jS2p2YmRiVkJnWGtUaA0KLUVQQ2tLdmJkdk9zenBrT3QNCi1FT2JrS3ZiZEtmR0hiQlJWDQotRG5jTEt2YmRqdlhPRUJ4WA0KLUVQRExLdmJkdkFjeVRQRkkNCi1FT2JqanZiZE5zVVdHZVVwDQotRVBDamp2YmRadElpWkRybg0KLURvRExLdmJkclJ0a09MQk4NCi1EbmNLanZiZHB0VUhTU0xVDQotRG5jTEt2YmRXU09YYWVMYw0KLUVQQ2tLdmJkaUxlRG11Q3kNCi1Eb0NqanZiZGh5dUZrcU5mDQotRG5ia0t2YmR6b1BxRkRNWQ0KLURvQ2tLdmJkR0Zpck9JdFINCi1Eb0NqanZiZEVPYmprWENkDQotRG5ia0t2YmRqS0ZnaWx3cg0KLUVQRExLdmJkVndJd3ZFRkgNCi1Eb0RLanZiZGZJS3ZSbXBnDQotRVBETEt2YmRPRkRzaUlrRQ0KLUVQRExLdmJkR0tkcmNJTXUNCi1FUERLanZiZFpubWlFZVpqDQotRG9ES2p2YmRLV1ZGY2VISg0KLURuY0tqdmJkdkJEeVNuZUkNCi1EbmNLanZiZGRlT3Fhd0NqDQotRG9Da0t2YmRFenRSRkxiaQ0KLUVQREtqdmJkTXBYcHVtZ1QNCi1FUERLanZiZHR1bllKcVRBDQotRVBDamp2YmRlZ2tWcW1wZw0KLUVPYmpqdmJkbFlzUnNaSFUNCi1FT2NLanZiZGJVYWdYa1VJDQotRVBETEt2YmRBTkh5U3Z5eA0KLURuYmtLdmJkbUpFVVF0cWENCi1FUERLanZiZFZVTlVGbFZqDQotRVBDa0t2YmR2dmxCVmFWdQ0KLURvQ2pqdmJkbW96WldMWWINCi1Eb0RLanZiZHd6SUZmWGVTDQotRG9ETEt2YmROUVhwdk9Hcw0KLURuY0xLdmJkRVlYbFRzdE0NCi1FUENrS3ZiZGJVYkd3a1VJDQotRU9jTEt2YmRMQkxITkJ4Ug0KLURuYmtLdmJkZVBFcmtVVVMNCi1FT2JqanZiZHlYaUphb3lrDQotRG5jTEt2YmRWck54QmVMYw0KLURvQ2pqdmJkYVJlYmhVR0wNCi1FT2NLanZiZHhzTmhtU0JnDQotRU9jS2p2YmRYcmthTXNvWQ0KLUVPYmpqdmJkaHVaZHdTVkMNCi1Eb0NrS3ZiZHFHRUZVV0FoDQotRG9ES2p2YmRlZ2tWck5wZw0KLURvQ2tLdmJkdGNDdHZ1b1ANCi1FT2NLanZiZG1KRVVRdHJCDQotRU9jS2p2YmRXWEl3dWNkZw0KLURvRExLdmJkaGdLQ3lXSnUNCi1FUENqanZiZGNTYmtVRGpCDQotRVBES2p2YmRMcldtWnVReg0KLUVQRExLdmJkWHJsQWxzbngNCi1EbmJrS3ZiZEtOQUR5Z1VhDQotRVBES2p2YmR5TnJoWHNKRA0KLUVPY0xLdmJkSXNaQlNseE0NCi1FUENrS3ZiZGRuZHJrVHNyDQotRG5iamp2YmRGeVV1QkVZQw0KLUVQQ2tLdmJkSmNLQ3BqQ3gNCi1FT2JrS3ZiZGJCV0ZHUVB3DQotRU9jTEt2YmRGamRyYmhOVg0KLUVQRExLdmJkckRkaVFOdkINCi1FT2JrS3ZiZGtIZ01HR09MDQotRVBDa0t2YmRreVNyU3lIVQ0KLURuY0xLdmJkYWFXRWZRUVgNCi1FT2JrS3ZiZGVoS3ZSbXBnDQotRG5ia0t2YmRtSWRVUlZSYQ0KLURvRExLdmJkdkJFWlNuZUkNCi1Eb0NrS3ZiZE5kY3NoaGpkDQotRG5jTEt2YmRaeUVLT0Nrcg0KLURvQ2tLdmJkVnJOd2JGTUQNCi1EbmJrS3ZiZG5DS1hYb051DQotRVBES2p2YmRTUVRnS0dEdw0KLUVPYmtLdmJkYVJmQ2d0RmsNCi1FT2JqanZiZGtXWE5jYXd3DQotRU9ia0t2YmREaWhKdXhLQQ0KLURuY0xLdmJkblZWWmtLU0cNCi1FUENrS3ZiZFZCQnFTcHF5DQotRG5jTEt2YmRxR0VGVVdBaA0KLURvQ2tLdmJkc1B2T2pEV0cNCi1EbmNLanZiZHlTbWlOUmJIDQotRG9ES2p2YmRyYWVtTGZqeQ0KLURvRExLdmJkblB6WldLeGINCi1EbmJqanZiZFJqeGZWR2tUDQotRG9ES2p2YmRHTEVzREhsdQ0KLURuYmpqdmJkUm90SEtGZFgNCi1Eb0NrS3ZiZFJwVUdpZWN3DQotRG5iamp2YmRaalRIb2dCZg0KLUVQREtqdmJkY1RDanREaWENCi1FT2NLanZiZHJvdW5pYnVmDQotRU9jS2p2YmRWQkNSU3FSeQ0KLUVQREtqdmJkRXZaUG9saWUNCi1EbmJrS3ZiZHpSUE5KS1hBDQotRG5jTEt2YmRCaGpiS2lHSw0KLURuYmtLdmJkcXJWS21rQk4NCi1EbmJqanZiZEJyYURUZXdTDQotRG5ia0t2YmRKY0tEUkpieA0KLURvQ2pqdmJkYlViSFlMVUkNCi1Eb0RLanZiZFV5SVR5a09uDQotRG9Da0t2YmRZbFNFVU9NTg0KLUVQQ2tLdmJkUnBVSEtHRVgNCi1FT2JrS3ZiZFRBRkpJQ1BFDQotRVBES2p2YmRycFdQSmNWZg0KLURvQ2tLdmJkWm5uSkZGWmoNCi1FUENrS3ZiZGtWdm1jYXhYDQotRU9jS2p2YmR5emRuUmdpSQ0KLUVPYmpqdmJkcUFpRkFYSUUNCi1EbmNMS3ZiZFdXaVlXRGVIDQotRVBDamp2YmRxbHpLWkxnaQ0KLUVPYmpqdmJkYXVDR3drVUkNCi1Eb0RMS3ZiZHRUU1N4eWRjDQotRU9ia0t2YmRiVkNHeExUaA0KLUVPYmtLdmJka1dXbWRCeFgNCi1FT2JqanZiZFJOWGF4blV6DQotRU9jS2p2YmR3WExhVmFWdQ0KLURuY0tqdmJkcVR0R3FyS3QNCi1EbmNLanZiZElqRUFKcEdkDQotRVBES2p2YmRIZmZ5eVh3Zw0KLUVPYmtLdmJkU0NFRkxpWWsNCi1EbmNLanZiZGlWWmVYUnVDDQotRG9ETEt2YmRXV2h3dWRGSA0KLUVQRExLdmJkclJ1S21rQW0NCi1FT2JqanZiZHhzTmhscWFnDQotRVBES2p2YmRjSk1pa0Z3WQ0KLURvREtqdmJkcHlQSGZwZFkNCi1EbmNLanZiZHd5aEdHWGRyDQotRG9Da0t2YmRrVndPRGJYdw0KLURuY0xLdmJkSmNKYnBpYngNCi1FUENrS3ZiZHNRV1BKY1ZmDQotRU9jS2p2YmRaUk5FaU1kcQ0KLUVPYmtLdmJkanZYT0VDWHcNCi1FT2JqanZiZFp4Y2pPRExyDQotRG5jS2p2YmRSV21kRE1JRA0KLURuY0tqdmJkanZXbWNiWVgNCi1Eb0NqanZiZG5CalhYb09WDQotRG5jS2p2YmRpQm5iZHdRcQ0KLUVQREtqdmJkRG9ES2p3Q2QNCi1FUENrS3ZiZEZ4dVZCRVlDDQotRG5jS2p2YmRGVnhvcE1pZQ0KLUVPY0xLdmJkS1dVZkVFZmkNCi1FUENrS3ZiZE5ydFZnRXRwDQotRG9ETEt2YmRmb2F6d0R4SQ0KLURvREtqdmJkcXF1S21rQW0NCi1FUERLanZiZGhiUENlWFJSDQotRG5jS2p2YmRadEloeUVUTw0KLUVQQ2tLdmJkUXdOZENraEQNCi1FUERLanZiZGh6VWZNUk9HDQotRG5iamp2YmRycFZvS0N1Zg0KLUVQRExLdmJkdGxZV2FVQXcNCi1FT2NMS3ZiZGRvRXJqc3RTDQotRG5ia0t2YmR5emVPUmdoaA0KLUVQRExLdmJkWm5taGRlWmoNCi1Eb0NqanZiZGNJbGlrR1hZDQotRU9jTEt2YmRMQWtITkJ4Ug0KLURvQ2pqdmJkdGt3d0JVQXcNCi1Eb0NqanZiZGdHTVpuSEhBDQotRG5ia0t2YmRVc21UZkx1ag0KLUVPY0xLdmJkcVpQSGdRY3gNCi1FUERMS3ZiZExxdmx5dHB6DQotRG9ETEt2YmRxZEZJb212Qg0KLUVPYmpqdmJkQmhqYktoZksNCi1FT2NMS3ZiZHJNeWpZbElKDQotRG5jS2p2YmREbmNLa1hDZA0KLURuYmtLdmJkTlFYcHVuSFQNCi1FUERLanZiZFpqU2dvZmJHDQotRG5iamp2YmRCaUtiTEllag0KLURvQ2pqdmJkR0FvUXhpem0NCi1FT2NMS3ZiZHd0bGRxWkxuDQotRG9ETEt2YmRJcnhhU21YbA0KLURvQ2pqdmJkTkhEUU1wVWsNCi1FT2NMS3ZiZFRrdW5hV09pDQotRG5jTEt2YmROSENwTXBWTA0KLURvREtqdmJkZWxmWEhOS0wNCi1FT2JqanZiZGN5eHBZWXFDDQotRG9ETEt2YmRaR3dFQU9yaQ0KLURvRExLdmJkSXhVQ0hrcVENCi1Eb0NqanZiZG96bkVLeFBBDQotRU9jS2p2YmRiTE1HUE5jQQ0KLUVPYmpqdmJkaWllZ2lseFMNCi1Eb0RLanZiZFpSTkZJbUZSDQotRG5jTEt2YmRSYkRlTGh4aw0KLUVQQ2tLdmJkcWx6SnhsSGkNCi1FT2NMS3ZiZGhrZURuVWJ5DQotRVBDamp2YmRoYW9ERXdRcQ0KLUVQQ2tLdmJkRmtGU2NIbHUNCi1FUENqanZiZEpLRUFLUUdkDQotRG9Da0t2YmRweG5nZnFEeA0KLUVPYmpqdmJkVUd6bkx3V0YNCi1FT2JqanZiZFZaSHN5a1BPDQotRG5jTEt2YmRZbFJkVU5sTg0KLUVQQ2tLdmJkSERrV0tCaksNCi1EbmNMS3ZiZGpLRmhLTXhTDQotRG5iamp2YmRuQmpXeFBPVg0KLUVPYmtLdmJkdGNDdHZ2T28NCi1EbmJqanZiZFRwcVBVdGhODQotRG5jTEt2YmRNb3hRdk9Hcw0KLURuYmpqdmJkZk5HWEhNakwNCi1FUERLanZiZGhnSmNaVmpWDQotRG9ETEt2YmROR2JvbHBWTA0KLUVQREtqdmJkYXRiSFlMVUkNCi1EbmNMS3ZiZGN6WlB3eHFDDQotRG5iamp2YmRaeGNpbWJsUw0KLUVQRExLdmJkS2FLZ01iWHENCi1FT2NMS3ZiZHRiY1V3V09vDQotRG5ia0t2YmRKdXRmRUVmaQ0KLURvQ2pqdmJkbUlkVVJVcWENCi1FUENqanZiZGRCcm1TQVRtDQotRVBDa0t2YmRYc0xhTlVQWQ0KLURuYmtLdmJkTlB3cHZPR3MNCi1FT2NLanZiZEl3c2FnbFFwDQotRG9Da0t2YmRsaGRVUXRyQg0KLURvRExLdmJkR2RMV0phaWoNCi1Eb0NqanZiZHdYTUF2QXZWDQotRG5ia0t2YmRicmJrVGRKYQ0KLUVQREtqdmJkRlZ4cFFOSmUNCi1Eb0NqanZiZEhEa1dKYktLDQotRG5ia0t2YmRqdlhPRGJZWA0KLURvQ2pqdmJkZW1Gd0dtSmsNCi1Eb0NqanZiZFFkQ2FQcGNyDQotRU9jS2p2YmRxY2RpUU52Qg0KLURuY0xLdmJkYkJXRkZvb3cNCi1FT2NLanZiZEthS2dNYXdxDQotRU9ia0t2YmRMQktnTWF3cQ0KLURuY0tqdmJkY2JTbVNBVU4NCi1Eb0NqanZiZHlPVEh3c0pEDQotRU9jTEt2YmRPU3RWZmVVcA0KLUVPYmtLdmJkSGZmeXlZWGcNCi1FUENqanZiZG11VXlrSnJHDQotRG9ETEt2YmRKWVRiSUxwcA0KLURuY0tqdmJkbkdkd2xtZ1oNCi1FUERLanZiZFpRbGRobGRxDQotRU9iamp2YmRVYUJwc1JTWg0KLUVPY0tqdmJkcnpMcFNhSU8NCi1EbmJqanZiZExHRmdiQXFWDQotRVBES2p2YmRYcmxBbVVPeA0KLUVQRExLdmJkdFNxcnlaZUQNCi1Eb0RLanZiZHRsWHdBdEF3DQotRG9ES2p2YmRhUmViZ3NmTA0KLUVPYmpqdmJkVVdMcEtVQXENCi1FT2JqanZiZFF2bWNjTGdjDQotRU9jTEt2YmR6bm9wZURNWQ0KLUVPY0xLdmJkSXdzYkhrcHANCi1FUERMS3ZiZHppdVFQY3NVDQotRVBETEt2YmRlbGV2Z01paw0KLURvREtqdmJkVEFGSWdiT2QNCi1Eb0RMS3ZiZGJCV0ZHUG93DQotRG9ES2p2YmRZcU5FaU1lUg0KLUVPY0xLdmJkaGZpY1l1aXUNCi1FT2NLanZiZHlUT0ltUmJIDQotRG5jS2p2YmRpTGVEbXRieQ0KLUVQRExLdmJkVXNtVGVrdksNCi1Eb0NrS3ZiZGtDa2tRZnRnDQotRG9Da0t2YmRWVG1VRmxWag0KLURvQ2tLdmJkVEl5alJBQWwNCi1FT2NLanZiZGJVYWZ4S3RJDQotRU9jS2p2YmRac2lJeGRTbg0KLURvREtqdmJkU0NFRWxJeUwNCi1EbmJqanZiZEJzQWJzZlhTDQotRG9Da0t2YmRCY3BBdWltRw0KLURvQ2tLdmJkVndJd3ZFRWcNCi1EbmJqanZiZGFqbEZvTmNBDQotRVBDa0t2YmR0U3JUWXpGRA0KLURuYmtLdmJkR0Zpck5oc3ENCi1FT2NLanZiZGFwSEhFTHpkDQotRG9ETEt2YmRpVXllWFNVYg0KLURuYmpqdmJkdEFHcUlBQlMNCi1EbmJrS3ZiZFhzTGFNc254DQotRG9Da0t2YmRlRW5xYXdESw0KLUVPY0tqdmJkRHhYa3N0VU0NCi1EbmJqanZiZGN5eG94WlFiDQotRG9ETEt2YmRsclpWWnJjaQ0KLURvQ2tLdmJkVEFFaUlDUEUNCi1FT2NMS3ZiZHB5UEhmcGN4DQotRVBETEt2YmRWQkNSVFFxeQ0KLURuYmpqdmJkbUpFVVF0cWENCi1EbmJqanZiZGtDbEtxSFZIDQotRU9ia0t2YmRDSkthamlHSw0KLUVPYmtLdmJkZUFVUk14SmYNCi1FUERMS3ZiZGNTYmtVRGpCDQotRG5jTEt2YmRzQ0ZtTGZqeQ0KLUVQQ2tLdmJkSXdzYWhMcVENCi1Eb0NrS3ZiZHJKQUplTW5lDQotRG9ETEt2YmRJSEd6WXd4SA0KLURvQ2pqdmJkR2NrVmpCaksNCi1FT2JqanZiZGVna1ZxbXFIDQotRG9ETEt2YmRMS2FJV0FLWg0KLUVQRExLdmJkYVJmQ2hVR0wNCi1Eb0RMS3ZiZHlZSkphb3pMDQotRG9Da0t2YmRyV3BMYmh5Ug0KLURvQ2tLdmJkTEdHSUJhUlYNCi1Eb0RLanZiZEt5UkpyenRmDQotRG9Da0t2YmRqdXZuRUJ4WA0KLUVPYmtLdmJkTmVFVGhoa0UNCi1FUENqanZiZFF3TmNia2hEDQotRG9Da0t2YmRKcVplUEdPRg0KLUVPYmpqdmJkTkdib21RVWsNCi1FT2JrS3ZiZGt4cnFzWkhVDQotRU9jTEt2YmRyb3VuakRWZg0KLURvRExLdmJka0NsTFJHdGcNCi1FT2NMS3ZiZGJLa2ZPbkRBDQotRVBDa0t2YmRSRGJhUHBjcg0KLUVQRExLdmJka0hnTGVmTmsNCi1FT2NMS3ZiZEZWeHBQbUtGDQotRU9ia0t2YmRzcnJTeHpFYw0KLURuYmtLdmJkRmVpck9Jc3ENCi1EbmNMS3ZiZHppdG9wRHJ0DQotRG9Damp2YmR1V09YalFzQQ0KLUVQQ2tLdmJkeVhoakNQeWsNCi1Eb0RLanZiZGFhV0VmUG93DQotRG5jTEt2YmR2QWN5U25lSQ0KLUVPYmpqdmJkQURSd2paaHANCi1FT2JrS3ZiZG5QeXh2TFliDQotRG5jS2p2YmRpakdJSmx3cg0KLUVQQ2pqdmJkSmNKYnFKY1kNCi1EbmJrS3ZiZGtNYkx5ZGdQDQotRG9Da0t2YmRSRGJhUVFjcg0KLURvQ2pqdmJkeHNPSWxyQ0gNCi1EbmJqanZiZEtReWRuZk9GDQotRVBES2p2YmRjSW1LS2ZXeA0KLURuYmpqdmJkY0ltS0tld1kNCi1FT2JrS3ZiZHFkRkpQbXVhDQotRU9iamp2YmRhamtlbm5EQQ0KLURuYmpqdmJkWnlFS05jTHINCi1Eb0NqanZiZEtXVkZkRWdKDQotRVBES2p2YmRXWEl3dWNlSA0KLURuYmpqdmJkcWlBSmRsbmUNCi1FT2NMS3ZiZGt5VFJyeUd0DQotRVBDamp2YmRwYUpGQVdnZA0KLUVQQ2pqdmJkbUpEc3FWU0INCi1FUENqanZiZFJFREFvcGRTDQotRG9Damp2YmRScFVIS0ZkWA0KLURuY0tqdmJkcHRVSFNTS3QNCi1FUENqanZiZGlDT2JkdnBxDQotRG5jTEt2YmROd251emNtdA0KLURuY0tqdmJkcWRGSXBPV0INCi1Eb0RLanZiZGpnZ0xlZk5rDQotRU9ia0t2YmRyTlppeUxnaQ0KLUVQQ2tLdmJkYVNGY0lUZkwNCi1EbmJqanZiZEdMRlRESU5WDQotRVBDa0t2YmRpTGVFTnVEWg0KLURuY0xLdmJkWnlFSm1jTHINCi1FT2JqanZiZHVEQ3VXdk9vDQotRG9ES2p2YmROUVhxV05nVA0KLURuY0tqdmJkVkJDUlRSUnkNCi1FUENqanZiZFNRVUdpZkVYDQotRU9jTEt2YmRBTklaU3Z5eA0KLURvREtqdmJkdkJEeVRQRkkNCi1EbmJrS3ZiZEVQQ2tMV2JkDQotRG9Da0t2YmR5WUlqQ1B5aw0KLURuYmtLdmJkZWxld0dtS0wNCi1FUERMS3ZiZGF0Ykd4TFVJDQotRVBETEt2YmRUdkxvalRhUg0KLURvQ2pqdmJkaHR5ZVdyVkMNCi1Eb0RLanZiZHplWm56ZHpRDQotRG5iamp2YmR5emRuUmhKSQ0KLUVQQ2pqdmJkdUx4V2FVQlgNCi1FT2NMS3ZiZGt5VFJzWWdVDQotRG5iamp2YmRDVEJDc2V3Uw0KLUVPYmpqdmJkakFQZ0FwSEsNCi1FUERMS3ZiZHdrV2RIenlmDQotRU9iamp2YmRzUHZPaWNXRw0KLURvQ2tLdmJkVHVsUGlzYVINCi1EbmJrS3ZiZHVDY1V2dW9QDQotRU9ia0t2YmRaUk1kaU1lUg0KLURvQ2tLdmJkU1B0SEpmRHcNCi1EbmNMS3ZiZEthTEdsYXhSDQotRG5ia0t2YmRScFRnS0dEdw0KLURvQ2pqdmJkV1hKWVdFRWcNCi1FT2JqanZiZFdYSllXRGRnDQotRU9jS2p2YmRLQ2pDcUtDeA0KLURuYmtLdmJkYWtNR1BOY0ENCi1Eb0RLanZiZHdrWERnenpHDQotRU9ia0t2YmROSERQbG90aw0KLURuY0xLdmJkeXpkbXJJSkkNCi1FT2JrS3ZiZEZrRXJiaE11DQotRVBDa0t2YmROZURzaUlqZA0KLURvREtqdmJkSUdmeXlYeEgNCi1Eb0NqanZiZFp5RGluRExyDQotRVBDamp2YmRlbUZ2Zm1Kaw0KLUVPYmpqdmJkSllUYklMcVENCi1EbmJqanZiZFdYSXd1Y2RnDQotRG9Damp2YmRpSEtDeHZKdQ0KLUVQREtqdmJkZnBCendEeEkNCi1Eb0NqanZiZGFOTENTdGxnDQotRVBDa0t2YmRuVlV5a0pxZg0KLURvQ2pqdmJkeVlJakJvekwNCi1FUENqanZiZHpqVXBRRHNVDQotRG9ETEt2YmRaeGNqT0Nrcg0KLUVQQ2tLdmJkZUZPckJ2Y0sNCi1FUERLanZiZEthS2ZsYXhSDQotRU9jTEt2YmRmTWV2Z01qTA0KLUVQREtqdmJkR2NrV0tDS0sNCi1Eb0NqanZiZEtWdUZkRWdKDQotRU9iamp2YmRmTWZXZm1Kaw0KLURvRExLdmJkTWZib21RVkwNCi1FUERMS3ZiZFJrWWV1R2pzDQotRU9jTEt2YmRLZkdIYWFRdQ0KLUVPYmtLdmJkb3puRGp3b0ENCi1FT2NLanZiZFVNV1BCVm9KDQotRG9Da0t2YmRGamVTYmdtVg0KLUVQQ2pqdmJkckVGSlFPV0INCi1FT2NMS3ZiZHZBY3lUT2RoDQotRG5iamp2YmRXZll6VUFPcw0KLUVPYmtLdmJkVGt1b0JXUEoNCi1EbmJrS3ZiZEZwQVN2Z0Z5DQotRG9Damp2YmRjelpRWHlSQw0KLURvQ2pqdmJkUkRjQlFRZFMNCi1Eb0RLanZiZHFZbmdmcUR4DQotRU9ia0t2YmRXUm13YkVsRA0KLUVQQ2pqdmJkRnlWVkJEd2INCi1FT2JqanZiZEJoamJLaGVqDQotRG5jTEt2YmR6YUFQR2dCbA0KLUVPYmtLdmJkVHBwb1ZVZ20NCi1Eb0NqanZiZGJyY0xUY2pCDQotRVBDa0t2YmRHTEZUQ2dsdQ0KLURvRExLdmJkRHd4TVVVVU0NCi1FUENqanZiZE5RWVF1bWdUDQotRG5jS2p2YmRtZmVYbU9HeQ0KLUVQQ2pqdmJkd3RtRlJZa24NCi1Eb0NrS3ZiZHNCZk1sR2p5DQotRG5jTEt2YmRScFVIS0dEdw0KLUVPYmpqdmJkamJsTFFmdUgNCi1FT2JqanZiZEpZVGJIbFJRDQotRG9Da0t2YmRtdHR5amlxZg0KLURvQ2tLdmJkWlFsZGlNZHENCi1FUERLanZiZEZlalNOaVVSDQotRU9jTEt2YmRqZ2ZrZkZuTA0KLURuYmpqdmJkTXBZUXZOZ1QNCi1EbmJrS3ZiZFV5SVVaam5uDQotRG5ia0t2YmRKYmpEUktEWQ0KLUVQQ2pqdmJkZUVuckJ2Y0sNCi1FT2NLanZiZHl6ZG5TSUloDQotRG9ES2p2YmREb0RLandDZA0KLURvRExLdmJkQ1NhRFVGd1MNCi1Eb0RMS3ZiZElyeGFUTXdsDQotRG5ia0t2YmRSTlhheU50eg0KLURvQ2tLdmJkeHhKS0JveWsNCi1EbmNMS3ZiZG5HZHhOT0d5DQotRG5iamp2YmR5U21obHFiSA0KLURvQ2tLdmJkeHdoakJveWsNCi1FUENqanZiZFpRbGVJbGVSDQotRVBDamp2YmRhUmZDaFRlaw0KLUVPY0tqdmJkWVRNQk5VUFkNCi1Eb0NqanZiZGVna1dTTnBnDQotRU9ia0t2YmR6aXVRUGRUVQ0KLUVPY0tqdmJkbkNLWFlPbXUNCi1Eb0NrS3ZiZFpubWhkZHpLDQotRU9iamp2YmR6YUFQR2dCbA0KLURvRExLdmJkZVBGU2p0VHINCi1FUENrS3ZiZE5ydFdHZVZRDQotRVBDamp2YmRlbGZXZm1LTA0KLURvREtqdmJkS3hwalN6dGYNCi1FUERLanZiZHhtc0lYc0ljDQotRVBDamp2YmRkWnlQeFlxQw0KLURvREtqdmJkdk9zenFMT3QNCi1EbmNLanZiZGF0Ykd4TFRoDQotRU9iamp2YmR6b1FRZGJreA0KLURvQ2pqdmJkWlJNZUltRXENCi1FT2NLanZiZHFUdEdxcWp0DQotRU9jS2p2YmRxQWhlQVdnZA0KLURuYmpqdmJkeVNtaG1SYWcNCi1EbmNLanZiZGpLRmhKbHdyDQotRVBES2p2YmRxRmNlVVdCSQ0KLURvREtqdmJkc0JlbUxnTFoNCi1FUERMS3ZiZEtRekVvRm5GDQotRU9jS2p2YmRGamRzQ2dtVg0KLUVPYmpqdmJkcGZFRXRXQkkNCi1FUERLanZiZFp4Y2pPQ2xTDQotRVBES2p2YmRuQml2d29PVg0KLUVQQ2pqdmJkcnlsUVRBaE8NCi1FUERLanZiZEthTEdtQnhSDQotRVBES2p2YmRIZ0d6WXd4SA0KLUVPYmpqdmJka0hmbEdGbWsNCi1EbmJqanZiZHFHRGVVVmFJDQotRVBES2p2YmRNZ0RRTlFVaw0KLURuY0xLdmJkU0t5R1ZIS3MNCi1FT2NLanZiZHFGZEVzdkFoDQotRU9jS2p2YmRZa3JFVG5MbQ0KLURuYmtLdmJkcUJJZUFYSGQNCi1EbmNMS3ZiZFpRbGRobUZSDQotRG5jTEt2YmRGamVTYmhNdQ0KLUVQQ2tLdmJkZGVQUmF2Y0sNCi1FUENrS3ZiZHNzUnNZekVjDQotRVBDa0t2YmRSYWRGTGh4aw0KLURuYmtLdmJkVnZoeFdFRWcNCi1FT2NMS3ZiZElyeUFybVlNDQotRVBDa0t2YmRLZkdIYkFxVg0KLURuY0tqdmJkRUtJSnV4S0ENCi1FUERLanZiZEl3c2JJTVJRDQotRU9ia0t2YmR6YUFPZmdCbA0KLURuY0xLdmJkZVVBVUFTbHYNCi1EbmJqanZiZGxxeHVac0RpDQotRG5iamp2YmRVV01RS1RhUg0KLUVPY0xLdmJkTkdicE5QdGsNCi1FUERLanZiZFdTT1lDRWtjDQotRG9Da0t2YmRqZ2dNR0dPTA0KLURvQ2pqdmJkU1FVSEplY3cNCi1EbmNMS3ZiZFp5RGpPRE1TDQotRU9iamp2YmRmcEJ6dmN4SQ0KLUVPY0xLdmJkVGxWb0F2UEoNCi1EbmJqanZiZFZ2aVlXRUZIDQotRVBDa0t2YmRabm1pRkZaag0KLUVPYmpqdmJkTkdicE5RVWsNCi1Eb0RMS3ZiZHJiR01rZmp5DQotRG9ETEt2YmR4blNoWVNpRA0KLUVPYmtLdmJkSllUYWhNUlENCi1Eb0RMS3ZiZG9BS3pzaEVPDQotRG9Da0t2YmRaeGNqT0Nrcg0KLUVQRExLdmJkUldtZENrZ2MNCi1FUENrS3ZiZEdGaXFuSlVSDQotRG9ES2p2YmRSekpnc0RXQQ0KLURuY0xLdmJkcHRUZnFxanQNCi1FUERLanZiZG1JY3RSVXFhDQotRU9ia0t2YmRuQml3WG9PVg0KLURuYmpqdmJkZk1ldmZsakwNCi1FT2JrS3ZiZEJyYURVR1dyDQotRG5jS2p2YmRVeGhUektubg0KLURvQ2pqdmJkbWZkeE1tZnkNCi1EbmJqanZiZGh1WmVXclZDDQotRG5ia0t2YmRMaUNMcHhBUw0KLURuYmpqdmJkS2ZGZ2JBcHUNCi1EbmJqanZiZHppdVBwRVRVDQotRG9Damp2YmR3dU5FcVpMbg0KLUVQQ2tLdmJkRVh3a3Nzc2wNCi1FUENqanZiZGhnS0N4dWpWDQotRG9ES2p2YmRobEVkT1ZEWg0KLURuY0tqdmJkTEFqZ01iWHENCi1EbmNLanZiZE9GRVRoaGtFDQotRG9Da0t2YmRBTkh4cnZ6WQ0KLUVQQ2pqdmJkWnRJaVpEcm4NCi1Eb0NqanZiZFlwbGRobUVxDQotRG5jTEt2YmRxd1BsREl5Ug0KLURuY0xLdmJkVXROVUZsV0sNCi1FT2JrS3ZiZGtXWE9EYllYDQotRG5iamp2YmRSekpoU2J2QQ0KLURvQ2tLdmJkRUpnalZ4S0ENCi1EbmNLanZiZHhuU2d4U2hjDQotRU9iamp2YmRiVWJIWUtzaA0KLURuY0xLdmJkWm9OaUZFeksNCi1FUERLanZiZGJpTWpLZXZ4DQotRG5ia0t2YmRJd3NiSGxSUQ0KLUVPYmpqdmJkaFd5QXp6QUoNCi1FT2JrS3ZiZHF2cExjSXlSDQotRU9iamp2YmRHR0tTT0lzcQ0KLUVPYmtLdmJkVHBxUFV0aE4NCi1EbmNLanZiZHVhRVpUT2RoDQotRU9ia0t2YmRKSmRBSm9mZA0KLURvQ2tLdmJkRUtJSnV3akENCi1EbmNMS3ZiZERuYmprWERFDQotRG5iamp2YmRoYk9iZHdRcQ0KLUVPYmpqdmJkdW5zenBrUFUNCi1FUENqanZiZHdOV0FORGRtDQotRVBETEt2YmRvem1janhQQQ0KLUVPYmpqdmJkWm5taUZGWmoNCi1EbmJqanZiZHVERFV3Vm5vDQotRU9jS2p2YmRaalNoUGZiRw0KLURuY0xLdmJkQURTWGl5aHANCi1Eb0NqanZiZHVDY1ZYV1BQDQotRG5ia0t2YmRmZkx6T0hIQQ0KLURuY0xLdmJkQmRQYVdKbGYNCi1FUERMS3ZiZEp2VkdFRkdpDQotRVBDa0t2YmR2d01CV0JXVg0KLUVPYmpqdmJkaWpHSGpNeFMNCi1FUENrS3ZiZGFOTENUVk5IDQotRVBDamp2YmRiQXVkZW9wWA0KLURvREtqdmJkb3ptY2p3b0ENCi1FUENqanZiZFlsUmN0T01ODQotRG9Damp2YmREb0RMS3ZjRQ0KLUVPYmtLdmJkVnFtd2FlTUQNCi1EbmJqanZiZHF2b2xDaHlSDQotRVBDa0t2YmRSa1pHVkdqcw0KLURvREtqdmJkanZYT0VCeFgNCi1Eb0NqanZiZElISFp5WHdnDQotRG5ia0t2YmRMQktnTkNZUg0KLUVQREtqdmJkeU5zSHhTaGMNCi1FT2NLanZiZHl6ZG1xaEpJDQotRG5iamp2YmRxRmNkdFZhSQ0KLUVPYmpqdmJkckpBS0VsbmUNCi1EbmNLanZiZFR2THBKdEFxDQotRU9ia0t2YmREb0RLanZiZA0KLUVQQ2pqdmJkWWxSY3NuTG0NCi1Eb0RLanZiZGVna1ZxbXFIDQotRVBETEt2YmRaSFhFQVBTaQ0KLURvREtqdmJkYWtMZW5uREENCi1EbmNMS3ZiZHJEZGlQbXVhDQotRG9Damp2YmRoYlBERXdSUg0KLUVQRExLdmJkdGNEVXZ1bm8NCi1EbmJqanZiZEVLSGpWeEtBDQotRU9jTEt2YmRZcU1kaG1GUg0KLUVQRExLdmJkbXR0ektpcWYNCi1FUERMS3ZiZFRrdlBBdW9KDQotRG5jTEt2YmRWQWJSVFFxeQ0KLURuY0xLdmJkTEJLZmxiWVINCi1Eb0NqanZiZFp5RGltY01TDQotRU9jS2p2YmRGcEFUWEhGeQ0KLUVPYmtLdmJkbkNKd1lPbXUNCi1FUENrS3ZiZFZaSHN6TFBPDQotRVBDa0t2YmRDU2FEVGZYUw0KLURuY0tqdmJkTlZTcWptQVgNCi1FUENrS3ZiZEZqZHJiaE11DQotRVBDa0t2YmRic0NrVURqQg0KLUVPYmpqdmJkTW93cHVtZnMNCi1Eb0RMS3ZiZFJvdEhKZWN3DQotRG5iamp2YmRUZnpta3dXRg0KLUVPYmpqdmJkQmNwQXZLTkcNCi1Eb0RMS3ZiZFdIeFdYZnh6DQotRVBDamp2YmRxVVVHclNLdA0KLURuY0xLdmJkbGlEc3FWU0INCi1EbmJrS3ZiZEJkUUF1ak1mDQotRG5ia0t2YmRXWEl4VmNkZw0KLURvQ2tLdmJkZGVQU0NYQ2oNCi1EbmJqanZiZFppcmhQZmJHDQotRG5iamp2YmR5WGlLQm96TA0KLURuYmpqdmJkem5wUkVjTVkNCi1EbmNLanZiZEpjS0NxS0N4DQotRVBDa0t2YmRKYmlicGpEWQ0KLUVQRExLdmJka0NsTFJIVkgNCi1FUERLanZiZFR2TG9pc2FSDQotRU9jS2p2YmRaR3dFQVBTaQ0KLUVQQ2tLdmJkS1JaZG5lbkYNCi1EbmNLanZiZGZNZlhHbUprDQotRVBDa0t2YmRoZmlieVdKdQ0KLUVPY0tqdmJkTUliTHFZQVMNCi1FUERMS3ZiZGJVYkhYanRJDQotRU9ia0t2YmRDU2FEVUZ3Uw0KLUVQRExLdmJkR0dKcW5KVVINCi1FT2NMS3ZiZERvREtqdmJkDQotRG5iamp2YmRGa0ZURElNdQ0KLURuYmpqdmJkZ0ZsWm5HZ0ENCi1Eb0NrS3ZiZGFrTGZQT0RBDQotRVBETEt2YmREd3dsVHN0TQ0KLURvQ2pqdmJkTUpCa3FZQVMNCi1EbmJqanZiZGlHakN4dWpWDQotRVBETEt2YmRWd0l3dWNlSA0KLUVQRExLdmJkWnlFS09Da3INCi1FUERLanZiZGRvRlRMVHRTDQotRG9Da0t2YmRYcmxBbHNueA0KLUVPY0xLdmJkWm9PSWVFeksNCi1EbmJqanZiZGFNamJUVk1nDQotRVBES2p2YmRlT2VUS3Nzcg0KLURuY0tqdmJkU0t4ZXRmanMNCi1Eb0NqanZiZHB4bmhHcGN4DQotRVBETEt2YmRtdHVaa0pyRw0KLURvQ2pqdmJkWWtxZFRtbE4NCi1FT2NMS3ZiZEp1dUdFRWZpDQotRG9Damp2YmRoelVmTVJPRw0KLURuY0xLdmJkZGRuckJ2YmoNCi1FT2NMS3ZiZFdTTndiRk1EDQotRG9ETEt2YmR0U3JUWXlkYw0KLUVQQ2pqdmJkUmp4ZXRnS3MNCi1EbmNLanZiZEZ4dHRhRVlDDQotRVBETEt2YmRpQm5jRldwcQ0KLURuYmpqdmJkeVRPSW1TQ0gNCi1Eb0RLanZiZGN5eVFYeVJDDQotRU9jTEt2YmRaTHJFVU9MbQ0KLURvQ2pqdmJkWG1xQVlWV1UNCi1FUENqanZiZFVzbHRGa3ZLDQotRG5jS2p2YmRMcXZtWnVReg0KLURuYmpqdmJkWmpUSVFHYWYNCi1Eb0RLanZiZHpvUHBlQ2t4DQotRVBES2p2YmRHR0tTTmhzcQ0KLURuY0tqdmJkdFNyU3h6RkQNCi1FUENrS3ZiZHlPVEh4U2hjDQotRG5ia0t2YmRlaEt2U09SSA0KLURvRExLdmJkV0lYdllIWXoNCi1FT2JrS3ZiZERvQ2tMWENkDQotRG9ETEt2YmRMQktmbGF4Ug0KLUVQRExLdmJkS1F6Rk9lbkYNCi1FT2JqanZiZGpGTEhWUEFPDQotRU9ia0t2YmRGZWlxbWhzcQ0KLURvREtqdmJkUm90SEtGZFgNCi1EbmJrS3ZiZGRaeHBZWlFiDQotRG5jS2p2YmRxcXRrTmtCTg0KLUVQREtqdmJkWmpTaFBnQmYNCi1Eb0NrS3ZiZE5IQ3BNb3VMDQotRU9iamp2YmR4WmdlZllGUw0KLURvQ2pqdmJkTnJzdkhFdVENCi1Eb0NqanZiZHd6SGVld2RyDQotRU9iamp2YmR2UFR6cGtQVQ0KLUVQREtqdmJkcm91bmlidkcNCi1EbmJrS3ZiZHBzdEdxcWp0DQotRVBETEt2YmRlRk9yQ1hESw0KLUVPY0xLdmJkR0JQUllpem0NCi1Eb0RMS3ZiZE53bnV6ZE9VDQotRG5ia0t2YmRSTXdheG5Veg0KLUVPY0xLdmJkRGloS1dYakENCi1FT2JrS3ZiZEZlaXJPSlRxDQotRG9ETEt2YmRTS3hldUdqcw0KLUVPY0xLdmJkZG5kc0tzc3INCi1EbmJqanZiZGlDUERFdnBxDQotRU9jS2p2YmRNb3hRdW1mcw0KLURuYmtLdmJkZk5HV2ZsakwNCi1EbmJrS3ZiZElIR3paWHdnDQotRU9iamp2YmRUbFdQQXZPaQ0KLURvRExLdmJkblB5eVZrWkMNCi1FT2NLanZiZGtXV21kQnhYDQotRU9ia0t2YmRFSmdqV1hqQQ0KLURuYmpqdmJka01hbFpkZ1ANCi1EbmJrS3ZiZHNDR05MZmp5DQotRG5iamp2YmRZcU1lSWxlUg0KLURuY0xLdmJkTWdDb21QdGsNCi1Eb0NrS3ZiZE1mYm9sb3VMDQotRG5jS2p2YmRlckF2emxEUA0KLURuYmpqdmJkcXdRTGNJeVINCi1FT2JqanZiZGNJbUprRndZDQotRVBDamp2YmRZemJlcktWeQ0KLURvQ2pqdmJkRXpzcUVsQ2kNCi1FT2JrS3ZiZFJvdEdpZWN3DQotRVBDa0t2YmRHTEVyY0lOVg0KLURvQ2tLdmJkWXBtRWlNZHENCi1Eb0RLanZiZEpYc2FnbFJRDQotRG5ia0t2YmRGVnhwUG1KZQ0KLURuYmtLdmJkeFVtRXB5TG4NCi1FUENqanZiZExyWE15dHB6DQotRG5ia0t2YmRodHpFdnF0Yg0KLUVQREtqdmJkRHhZTHN0VGwNCi1FUENrS3ZiZGlCb0RGWFFxDQotRVBDa0t2YmRab09KRWVaag0KLURvQ2pqdmJkdURDdVd1b1ANCi1FT2JrS3ZiZGpjTGtRZnVIDQotRG9Da0t2YmRjSW1LTEdXeA0KLUVQRExLdmJkRVlYbFVVVGwNCi1FT2NMS3ZiZFpMcWRUbk1ODQotRU9jS2p2YmRtb3pZdWp5Qw0KLURuY0xLdmJkSnB6RW5mT0YNCi1FT2NMS3ZiZGlDUENkdnBxDQotRG5jS2p2YmRBRFJ4S1pocA0KLURvRExLdmJkbUpEc3FWU0INCi1FT2JrS3ZiZG5CaXdZUE9WDQotRU9ia0t2YmRxd1FNREl4cQ0KLURuY0tqdmJkZUZPcWJXYmoNCi1FUERLanZiZG1mZVlNbWZ5DQotRG5ia0t2YmRHTEZTYmhOVg0KLURvRExLdmJkd2tYRGd6ekcNCi1FT2JrS3ZiZGJBdkZGcFFYDQotRVBETEt2YmR5WGhqQm95aw0KLURvQ2pqdmJkTWZicE1vdUwNCi1Eb0NqanZiZFJFREFwUkVTDQotRG5jTEt2YmRtYWpXd25tdQ0KLURvRExLdmJkSWlkQUpvZmQNCi1Eb0NqanZiZFNaaWhUQ3ZBDQotRG9Da0t2YmR1THd2YVVCWA0KLUVQQ2tLdmJkaUhKYnlWalYNCi1FT2JrS3ZiZEdZdHVBZFhiDQotRG9ETEt2YmRDVEJDdEZ3Uw0KLUVPY0xLdmJkaGxGRU50YnkNCi1Eb0NrS3ZiZHlTbklsckJnDQotRVBETEt2YmR3dU5GUXlNTw0KLURuY0tqdmJkbHF4dHpURGkNCi1Eb0RLanZiZFdXaHhXRUZIDQotRG9Da0t2YmRpSEpjWlZqVg0KLUVQREtqdmJkQ2ZsR0hBemMNCi1EbmNMS3ZiZHpST21KS1hBDQotRVBETEt2YmRDSkxCamhlag0KLUVPY0tqdmJkVnJOd2JFa2MNCi1EbmJrS3ZiZFV0TlVGbFdLDQotRG9ES2p2YmRMQktmbGJZUg0KLUVQQ2pqdmJkYXVCZndrVGgNCi1FUENrS3ZiZHJYUU1ESlpSDQotRG5iamp2YmRuVlV5ampTRw0KLURuY0tqdmJkaU1FZE9VYnkNCi1Eb0RLanZiZHFpQUtGTlBGDQotRU9jTEt2YmRRZERCUVFjcg0KLURvREtqdmJkcHhuZ2dRZFkNCi1EbmNLanZiZHRTclRZeWRjDQotRG5iamp2YmR3ekhlZlhlUw0KLURvQ2pqdmJkUm9zZmpHRVgNCi1FUENrS3ZiZG5QeXh1anlDDQotRU9iamp2YmRaeUVKbkNrcg0KLURuYmtLdmJkaHl0ZWxSTmYNCi1FUERMS3ZiZGVZWnN0U0Z6DQotRU9iamp2YmRUZnptbFhWZQ0KLUVPY0tqdmJkYktrZW5tY0ENCi1EbmNMS3ZiZHZ3TUF1YVZ1DQotRU9ia0t2YmR3TXZBTWRFbQ0KLUVPY0xLdmJka0hmbEZmTmsNCi1FUENqanZiZHpvUHBlRE1ZDQotRG9Damp2YmRpTGVEbXVDeQ0KLUVPY0tqdmJkUnBVR2pHRHcNCi1EbmJrS3ZiZFVzbHNla3VqDQotRVBDamp2YmRtSkVVUlZSYQ0KLURuY0xLdmJkWmpTZ29mYWYNCi1FT2NMS3ZiZGFNamFzVWxnDQotRG9Damp2YmRSRURCUHBkUw0KLURuYmpqdmJkSXdzYWdsUXANCi1Eb0NrS3ZiZGtOQ0x6RkhQDQotRG9ETEt2YmRhUmZDaFVGaw0KLUVQQ2pqdmJkclJ0am5LYU4NCi1FUENrS3ZiZHVvVHpwa090DQotRU9jS2p2YmRuSEZZTW1meQ0KLUVPY0tqdmJkSERrVmpCaksNCi1FT2JqanZiZEVYeE1Uc3NsDQotRG5iamp2YmROUHhSV09IVA0KLUVPYmpqdmJkaVp0ZkxwbWYNCi1FT2JqanZiZFR2TG9qVGFSDQotRG9ES2p2YmRLa0JJV0FLWg0KLURvRExLdmJkdUNidHdWbm8NCi1EbmNMS3ZiZG10dHpLalNHDQotRG5jTEt2YmRiQlZkZlFRWA0KLUVPYmtLdmJkeVhpS0JwWmsNCi1EbmNMS3ZiZHpHeGxBTWR3DQotRG9Da0t2YmRNcFhwdk5mcw0KLURvQ2tLdmJkS1F5ZG9HT0YNCi1FUERMS3ZiZFRmem1sWFZlDQotRVBES2p2YmRRY2NCUHFFUw0KLUVQQ2pqdmJkWnRKSXlFU24NCi1Eb0NqanZiZFZyT1hiRWxEDQotRG5iamp2YmRiTE1HT21jQQ0KLURuYmtLdmJkblB6WldLeUMNCi1FUERMS3ZiZG1hald3b09WDQotRU9iamp2YmRRd09FRE1IYw0KLUVQQ2tLdmJkVHZNUUtVQlINCi1Eb0NqanZiZE9UVVZnRXRwDQotRG9Da0t2YmRJSEhaeVh4SA0KLUVQRExLdmJkRG9ETEt3REUNCi1FT2JqanZiZGladGZNUW1mDQotRU9iamp2YmRpakdIaW1Ycg0KLURvREtqdmJkVnJOeENFbEQNCi1FUERMS3ZiZEp1dGVkRkdpDQotRG5iamp2YmRtU1pWWnNFSg0KLURuY0tqdmJkcWx6S1lsSUoNCi1FT2NLanZiZGZlbFpuR2dBDQotRU9jS2p2YmRZbFJjdE9MbQ0KLURvREtqdmJkUHhtQUhTcksNCi1FUENqanZiZFdXaVlXRUVnDQotRG9Damp2YmRiQXZGRm9vdw0KLUVPY0tqdmJkRmplU2JnbHUNCi1FUERMS3ZiZGxxeVZac0VKDQotRU9jS2p2YmRkZG9SYlhESw0KLUVQQ2tLdmJkYVJlY0h0RmsNCi1EbmNMS3ZiZFNLeUdVZ0tzDQotRG9ETEt2YmRjeXlQd3lRYg0KLURvRExLdmJkblZVektqUmYNCi1FT2JqanZiZFlrcWRVT0xtDQotRU9ia0t2YmRSYkVFa2h5TA0KLURuY0tqdmJkdEFIUWhBQXINCi1EbmJrS3ZiZFZxbXdiRk1EDQotRU9jTEt2YmR6bm9xRkRMeA0KLUVPY0xLdmJkRVh4THRUc2wNCi1EbmJrS3ZiZHR1bXdpcHNBDQotRU9iamp2YmRtSkVVUXRxYQ0KLURuY0tqdmJkeHdoakNQeWsNCi1EbmJrS3ZiZHlmeU1BTkZYDQotRG5jTEt2YmRpVlplWFJ0Yg0KLUVPYmtLdmJkZHRBVUFUTXYNCi1FT2NLanZiZHhuU2d3cmlEDQotRU9iamp2YmRsclpWWnJkSg0KLUVQQ2tLdmJkc0JlbGtma1oNCi1Eb0RLanZiZEZWeVBvbUplDQotRVBDa0t2YmRRbVlCeG5Veg0KLUVPY0tqdmJkU0JkRkxoeUwNCi1EbmNMS3ZiZG1KRVRwdVNCDQotRG9ETEt2YmRSRUNhUHBjcg0KLURuY0xLdmJkSXhVQmdsUlENCi1Eb0NqanZiZHBzc2ZyU0xVDQotRG5ia0t2YmRTUVVISmVkWA0KLUVPYmpqdmJka3lTclRaSFUNCi1FT2JrS3ZiZFp0SWlaRVRPDQotRG9Damp2YmR0dW13aXBzQQ0KLURvQ2pqdmJkZEJybHJBVU4NCi1FUENqanZiZEtDakRRaWJ4DQotRG9Damp2YmRRY2NBb3BkUw0KLURvRExLdmJkU0JjZUxpWWsNCi1FUERLanZiZFJFREFvcURyDQotRU9jS2p2YmRaUWxlSk1lUg0KLURvQ2tLdmJkRUFSaU15d1gNCi1FUERLanZiZGtETGtRZ1VnDQotRG5jTEt2YmRGamRzRElNdQ0KLUVQQ2pqdmJkbHJZdHlzRGkNCi1FUENrS3ZiZGV6dXhlSXN3DQotRU9ia0t2YmR5TnNIeFRKRA0KLURuYmtLdmJkZW1HV2dNaWsNCi1Eb0RMS3ZiZEJoa0NLaGVqDQotRU9jTEt2YmRqdldtY2F3dw0KLUVQRExLdmJkcVRzZ1JyTFUNCi1FT2JrS3ZiZFp5RGltY0xyDQotRVBDamp2YmRscll0elRFSg0KLURvQ2tLdmJkSGdHeXlZWGcNCi1Eb0NrS3ZiZFpvTmhkZHlqDQotRVBES2p2YmRodHpGV3F1Qw0KLUVQQ2tLdmJkRG9Da0t3REUNCi1Eb0RMS3ZiZHNycXNaWmVEDQotRVBDa0t2YmRpSEpieHVpdQ0KLURvQ2pqdmJkaGxGRU9VY1oNCi1FUERLanZiZERpZ2l1d2pBDQotRVBES2p2YmRRZERCUHFFUw0KLURvQ2pqdmJkY1RDanNkS0INCi1EbmNMS3ZiZFVzbVVGa3VqDQotRVBETEt2YmRuSEV3bG5HeQ0KLUVPY0xLdmJkeFZORXFZa24NCi1Eb0RLanZiZEV1eG9wTkplDQotRU9ia0t2YmRrQ2xMUWZ1SA0KLUVQQ2pqdmJkY1RETFVFS0INCi1FT2NLanZiZEVQREtrWERFDQotRVBDamp2YmRYc0xhTlVPeA0KLURvREtqdmJkRldaUVFOS0YNCi1FUERMS3ZiZFV0TXRGbFZqDQotRU9jS2p2YmR6YUFQR2ZhbA0KLURuYmtLdmJkSGxCem5YUkwNCi1Eb0RMS3ZiZFRsVm9CV1BKDQotRVBDa0t2YmREb0Nqa1hERQ0KLUVPY0tqdmJkcnpNUVRBaE8NCi1FT2NMS3ZiZG96bWRMWG9BDQotRG9ETEt2YmR6UW5tSWpYQQ0KLURvQ2tLdmJkbWdFeE1tZ1oNCi1FUENrS3ZiZHpqVW9vY3J0DQotRU9jTEt2YmR3eWhHRndlUw0KLUVPY0xLdmJkV1doeFZjZUgNCi1EbmNMS3ZiZHFxdGtPS2FODQotRG9Da0t2YmRPVFR2SEV1UQ0KLURvRExLdmJkakplaEtNd3INCi1Eb0NqanZiZHVEQ3R2dW9QDQotRG5iamp2YmRxZEVpUG12Qg0KLURuYmpqdmJkaHR6RXdSdUMNCi1EbmJrS3ZiZFJrWWV0ZmtUDQotRG9ES2p2YmRDRHBCVmpORw0KLURvQ2tLdmJkY1NianNjakINCi1FUERMS3ZiZFlwbGRpTWRxDQotRG9Damp2YmRhYVdFZlBvdw0KLUVPY0tqdmJkcVpQSGdRZFkNCi1Eb0NrS3ZiZGVPZHJqdFVTDQotRG9ETEt2YmRGYVBSWkp6bQ0KLURuYmpqdmJkUkVDYVBxRVMNCi1EbmNLanZiZGFNamFydU1nDQotRU9iamp2YmR1Vm5ZSnBzQQ0KLURuYmtLdmJkcVRzZnJTTFUNCi1EbmNLanZiZFlxTWVKTWRxDQotRU9jS2p2YmR2dmxCV0F1dQ0KLURuYmpqdmJkVXhndFprT24NCi1FT2NLanZiZE9Tc3VmZHVRDQotRU9jTEt2YmR0dW14SnFUQQ0KLURuY0tqdmJkSXJ5QXNOWGwNCi1Eb0RLanZiZE11VFJrTkFYDQotRG9ETEt2YmR4blNnd3JoYw0KLUVPY0tqdmJkaUhLQ3h1alYNCi1FT2JrS3ZiZGVLSnJWdHpuDQotRVBETEt2YmRqaEhNR0dOaw0KLUVPY0xLdmJka1Z3TmRCd3cNCi1FT2NMS3ZiZHlnWk1BTkV3DQotRVBETEt2YmRSWE9EY0xoRA0KLUVQQ2pqdmJkU1BzZmpGY3cNCi1Eb0RLanZiZFlwbGVJbGRxDQotRG9ETEt2YmRPRWNzaUlqZA0KLURuYmpqdmJkZGRvUmF2YmoNCi1EbmNMS3ZiZEhEa1dLQmpLDQotRG9Damp2YmR4eEpLQm95aw0KLUVQREtqdmJkWWtxZFVOa20NCi1Eb0RMS3ZiZERuYmpqdmNFDQotRG9Da0t2YmRWdmh4VmNlSA0KLUVQRExLdmJkV1JuWGJGTUQNCi1FT2JrS3ZiZGxpRVVRdHFhDQotRVBDa0t2YmROUVhxVm1mcw0KLUVPY0xLdmJkSUdmeXlZWUgNCi1EbmNLanZiZHhVbGRweGxPDQotRG9ES2p2YmR6bm9wZGNMeA0KLURuY0tqdmJkSERrVmliS0sNCi1FUERMS3ZiZGpsYkx5ZGdQDQotRG9ES2p2YmRZVE1BbHRPeA0KLURvREtqdmJkY1Nia1VFS0INCi1FUENqanZiZHpvUVJFYmxZDQotRU9jS2p2YmRaeGNpbkRNUw0KLURvREtqdmJkWnlEak9ETVMNCi1Eb0NqanZiZHhaZ2ZGd2RyDQotRVBETEt2YmRhTWtCc1ZNZw0KLUVQQ2tLdmJkdUREVXZ1bm8NCi1EbmNLanZiZHNDRm1MZ0t5DQotRG9ETEt2YmRkZU9yQ1djSw0KLURuY0xLdmJkTmRkVGhoamQNCi1FT2NLanZiZEJ2emNoZVFXDQotRVBETEt2YmRlRW5xYlhDag0KLURvQ2pqdmJkTnJ0VmZkdVENCi1FT2NLanZiZFpRbUVpTkZSDQotRVBDa0t2YmRHRmpTTmlUcQ0KLUVQREtqdmJkWnhjaW5Da3INCi1Eb0NqanZiZGtOQmxaZGdQDQotRG9Da0t2YmRFWVhrc3RUbA0KLURuY0xLdmJkWXBtRWhtRXENCi1FT2NMS3ZiZGVQRlNrVHNyDQotRG9Damp2YmRlbUZ2Zm1LTA0KLURuYmtLdmJkZW1Gd0dsakwNCi1FUERMS3ZiZG1iSnZ4T25WDQotRVBDamp2YmR0YmNWWFZvUA0KLUVPY0tqdmJkRmtFcmNIbVYNCi1Eb0RLanZiZFZVTXRGbFdLDQotRU9jTEt2YmRrTWFreWRmbw0KLURuYmpqdmJkSU1Cem5XcUwNCi1FT2JrS3ZiZHB0VUhSckxVDQotRG5ia0t2YmRqSmZIaWx3cg0KLUVQQ2pqdmJkR1l1VWFEeEMNCi1FT2JqanZiZG10dVpqalJmDQotRG5jTEt2YmRrQ2trUWZ1SA0KLURvRExLdmJkdGxYd0JVQlgNCi1EbmNMS3ZiZENXemNoZVB2DQotRU9ia0t2YmRyRUVpUG11YQ0KLUVPY0xLdmJkWXFORklsZHENCi1Eb0RMS3ZiZGZJTFdSblFnDQotRG9ETEt2YmRxVVVHclJrVQ0KLURvQ2pqdmJkZk1mV2ZsaWsNCi1FT2NMS3ZiZE9UVHVnRXVRDQotRG5jTEt2YmRqdlduRGF3dw0KLUVPY0xLdmJkc1B1b0tEVmYNCi1FUERMS3ZiZFppcmhQZmFmDQotRG9Damp2YmREd3hMc3N0TQ0KLURuYmpqdmJkZkhrV1JtcGcNCi1EbmNMS3ZiZHJwV09pYnVmDQotRVBETEt2YmRadEloeUVTbg0KLURuY0xLdmJkd3lnZkdZRXINCi1FUENqanZiZGVFb1NDV2NLDQotRVBDamp2YmRqdXZtZEJ3dw0KLUVPYmpqdmJkcVVUZnFxanQNCi1FT2NMS3ZiZFpqU2dvZ0JmDQotRG9ES2p2YmRZcU1kaU1lUg0KLURvQ2pqdmJkS2VmSUNBcHUNCi1Eb0RMS3ZiZE1mY1FOUVZMDQotRVBDa0t2YmRqZ2dNR0dOaw0KLUVPYmtLdmJkQ0RvYVZqTWYNCi1FT2JrS3ZiZFdXaVh1Y2VIDQotRU9jTEt2YmRVUlJPdVZIbQ0KLURuYmpqdmJkcHNzZnJTTFUNCi1EbmNLanZiZGdGa3pOZ0hBDQotRG5iamp2YmRhU0ZiZ3RGaw0KLURuY0xLdmJkSXhUYWhNUXANCi1FUERMS3ZiZEtXVkZjZUdpDQotRG5jS2p2YmRGVnlQb21LRg0KLURvREtqdmJkWmlyZ3BIQmYNCi1FT2JqanZiZFZxbXdhZGtjDQotRVBDa0t2YmRpZUxIVlBBTw0KLURuY0tqdmJkWkxxZFVPTU4NCi1Eb0RLanZiZFdXaVlXRGVIDQotRU9ia0t2YmRRd05kQ2xJRA0KLURuYmpqdmJkTW94UlZuR3MNCi1EbmNMS3ZiZHJEZGlQbXZCDQotRG5iamp2YmRaUWxlSk5GUg0KLUVPY0xLdmJkckRkaHBPVmENCi1FUERMS3ZiZFlxTkZJbUZSDQotRG9ES2p2YmRFWVhsVHRVTQ0KLURvQ2pqdmJkaHVaZVdxdGINCi1FUERLanZiZE1mY1BscFZMDQotRU9jS2p2YmROUVlRdk5mcw0KLURvREtqdmJkaVV6RlhTVkMNCi1Eb0NrS3ZiZG1SeHR6U2NpDQotRG5iamp2YmRiaU1pa0dYWQ0KLURvQ2pqdmJkUWREQlFRZFMNCi1FT2JqanZiZHFaUElHcUR4DQotRG9Da0t2YmRrV1dtZEJ4WA0KLURvREtqdmJkS3hwaXJ6dUcNCi1Eb0NqanZiZGxCTlBOQUxBDQotRG9Damp2YmRoelZHTVJPRw0KLURvQ2pqdmJkem9RUkVjTVkNCi1FUERLanZiZGxBbG5tQUxBDQotRVBETEt2YmR3dU1lUlpMbg0KLUVPY0xLdmJkWXFNZGlORlINCi1FT2JrS3ZiZE9UVHVnRXVRDQotRU9jS2p2YmRZVE1BbVVPeA0KLURuYmpqdmJkUkRjQlFSRVMNCi1Eb0RMS3ZiZGlka0hWUEFPDQotRVBDa0t2YmRTS3lGdGZqcw0KLURvQ2pqdmJkaHl0ZWxRbWYNCi1EbmNMS3ZiZEV6dFJFbENpDQotRVBETEt2YmRSV25FRExnYw0KLURvREtqdmJkd3VORlF5TG4NCi1FT2JrS3ZiZEdMRlRESG1WDQotRG5ia0t2YmRTaHlpcUFCTQ0KLUVPYmtLdmJkVWFDUXNSU1oNCi1FT2NLanZiZGp1d05jYlh3DQotRG5ia0t2YmRtZmVYbG5IWg0KLURuY0tqdmJkc1B1b0tEVmYNCi1FT2NLanZiZE5HYm9tUHRrDQotRG9ES2p2YmR2UFR6cGtPdA0KLUVQREtqdmJkSnFaZG5lbWUNCi1EbmNLanZiZHFUdEdxcWtVDQotRG5ia0t2YmRqZ2dMZWVtaw0KLURvQ2pqdmJkVlpJVVprT24NCi1FUENrS3ZiZHpqVlBvZFRVDQotRG5jS2p2YmRuQmpYWU9uVg0KLURvREtqdmJkSGdHell4WUgNCi1FUENrS3ZiZFNaaWdzQ3ZBDQotRVBDamp2YmR0YmJ0dnVubw0KLURvREtqdmJkUElBWHlBWkINCi1FT2JqanZiZFJOWGF4bXR6DQotRG9Da0t2YmRVeUlUeWtQTw0KLUVQQ2tLdmJkc3NScnlaZUQNCi1FT2JrS3ZiZEp1dUdFRkdpDQotRG9ETEt2YmR4WmdmR1hlUw0KLUVPYmpqdmJkdW9UenFMT3QNCi1Eb0RLanZiZGJyYmtUY2pCDQotRG5jTEt2YmR4eElpYW95aw0KLURvQ2pqdmJkRnh0dUJEeEMNCi1FUERMS3ZiZHphQVBHZ0JsDQotRVBETEt2YmRweG5oR3FEeA0KLUVPY0tqdmJkdFNxc1paZUQNCi1FT2NMS3ZiZE1vd3B2T0dzDQotRU9ia0t2YmRWQkNSU3BxeQ0KLURvQ2tLdmJkWlJORWlNZVINCi1FUENqanZiZGN6WW93eVFiDQotRG5jS2p2YmRqZ2ZrZkdOaw0KLURuYmtLdmJkc3NTVFl6RkQNCi1FT2NMS3ZiZFZoWVdZR3h6DQotRG5jS2p2YmRLREpjUWlieA0KLURuY0tqdmJkWkhXZEFQVEoNCi1FUENrS3ZiZEZqZHNDaE5WDQotRG9ETEt2YmRKY0pjUkpjWQ0KLUVQQ2pqdmJkUmp5R1ZITFQNCi1EbmJrS3ZiZEJjcEJXS01mDQotRG9Damp2YmR4VW1FcHlNTw0KLUVQREtqdmJkWm9OaUZFeksNCi1Eb0NqanZiZFBJQVlaQVpCDQotRU9jTEt2YmRGZWpTT0lzcQ0KLURvREtqdmJkamdnTUdGbWsNCi1FT2JrS3ZiZFdSblhhZGxEDQotRU9ia0t2YmRuR2R4TW1meQ0KLURvRExLdmJkTEJLZ05CeFINCi1Eb0NqanZiZGFTR0NoVGVrDQotRVBDa0t2YmRTQ0VFbEl4aw0KLUVPYmpqdmJkSXhUYkhsUXANCi1FUENrS3ZiZE9FY3NoaGtFDQotRU9jTEt2YmRic0Nqc2RLQg0KLURuY0xLdmJkQ1NhRFVHWFMNCi1FUENqanZiZFJ6SmdzRFdBDQotRVBETEt2YmR1Q2J1WFZubw0KLUVPY0xLdmJkR2RMVmlhaksNCi1EbmNLanZiZENXemRKRXBXDQotRG5jS2p2YmRqdXdPRGJYdw0KLURuY0xLdmJkcVVUZnFxanQNCi1FT2NLanZiZHhVbUZSWWtuDQotRG9Damp2YmRWQWFxU3FSeQ0KLUVQRExLdmJkYU1rQnNVbGcNCi1FT2NLanZiZEdMRlRDZ21WDQotRVBDa0t2YmRaZVlHemdpQw0KLURvQ2pqdmJkd1hMYVdCVnUNCi1Eb0NqanZiZGVsZXZnTWlrDQotRVBES2p2YmRrSGdNR0dPTA0KLURvQ2pqdmJkY0pNaktld1kNCi1FT2NMS3ZiZHd6SGZHWUVyDQotRG5jTEt2YmRsWlRScnlHdA0KLUVPY0xLdmJkZlZ6d29penMNCi1FUERLanZiZGh6VWVsUk5mDQotRVBDa0t2YmRpSEtDeHZLVg0KLUVPY0tqdmJkR0ZqUm1odFINCi1FUERMS3ZiZEdMRXNDaE5WDQotRG9ES2p2YmRZT1JBWHVXVQ0KLURuYmpqdmJkcHN0SFNTS3QNCi1FT2JrS3ZiZGVna1ZxbXBnDQotRVBETEt2YmRoeXVHTVFtZg0KLUVPYmtLdmJkbGlEdFF0cWENCi1Eb0NrS3ZiZGZOR1hHbGlrDQotRG9Da0t2YmRIZmdaeVh3Zw0KLURvQ2pqdmJkZG5kc0tzc3INCi1FUENqanZiZFpNU0RzbkxtDQotRU9ia0t2YmRFWHhNVHN0TQ0KLUVQREtqdmJkSnZVZWNkZmkNCi1EbmJrS3ZiZFZVTXNla3VqDQotRVBDamp2YmRQeU5BR3NTSw0KLURvQ2pqdmJkTVNXbVp1UXoNCi1FT2JrS3ZiZEJjcEJWak5HDQotRG5iamp2YmRlenV4ZGlVWA0KLUVQQ2pqdmJkQmRRQXZKbGYNCi1EbmNLanZiZE9UVVdIRlZRDQotRG9ES2p2YmRhU0dESVVGaw0KLUVPY0tqdmJkVUd6bWxXdkYNCi1FT2NMS3ZiZGpsYWt5ZGZvDQotRG9Da0t2YmRXU09YYWVMYw0KLURvREtqdmJkem5wUkZETHgNCi1Eb0NrS3ZiZHd0bGRweGxPDQotRG9ETEt2YmRHZExWakJqSw0KLUVPYmpqdmJkbXR0eWtLU0cNCi1Eb0RLanZiZFpqU2hRR2FmDQotRG9ES2p2YmRyRGRob212Qg0KLUVQRExLdmJkaVV5ZVhTVkMNCi1EbmNLanZiZElzWWFTbVhsDQotRG5iamp2YmRWaFh2WUhZeg0KLUVQREtqdmJkd3pIZkdYZHINCi1FT2NLanZiZHhzT0pNcWJIDQotRG9Damp2YmRlaEt1cW1xSA0KLUVQQ2pqdmJkWmR4R3poSkMNCi1FT2NLanZiZHNDR01sSExaDQotRG9Damp2YmRPRWNzaGhrRQ0KLURvQ2pqdmJkRXpzcUVsREoNCi1EbmNMS3ZiZFVSUlBWVklODQotRVBDa0t2YmRab09KRkV6Sw0KLURuYmpqdmJkQmlLYWpoZksNCi1FT2NMS3ZiZGJVYWZ3a1RoDQotRU9jTEt2YmRWWkhzektvTw0KLURuYmtLdmJkR0tkc0RJTXUNCi1EbmJrS3ZiZGRvRlNrVVVTDQotRG5iamp2YmRQeG1BR3Jxag0KLUVQQ2pqdmJkS05BRHpIVkINCi1FUENqanZiZGN5eHBYeHFDDQotRG5ia0t2YmRMQkxHbUJ4Ug0KLUVQREtqdmJkRldZb3BOSmUNCi1FUENrS3ZiZGNKTktLZXdZDQotRG9Damp2YmRHTEVyY0htVg0KLUVQQ2pqdmJkV1hJeFdEZGcNCi1EbmJrS3ZiZFF2bWNia2hEDQotRU9jTEt2YmRiVkNHd2p0SQ0KLURvQ2pqdmJkbWdGWU1tZnkNCi1FUERMS3ZiZFFkREFwUkVTDQotRG5ia0t2YmRXV2h3dkVGSA0KLURuYmpqdmJkeFpoRmV4RlMNCi1FUENrS3ZiZENJamFrSkdLDQotRVBDa0t2YmRLUXllT2ZPRg0KLURuY0tqdmJkRU9iamtYREUNCi1EbmJqanZiZE5HY1Bsb3RrDQotRG9Damp2YmRWVU10R01Wag0KLUVQRExLdmJkZWxmV2dOS0wNCi1EbmJrS3ZiZHF3UGxESlpSDQotRG5jTEt2YmRiaU1pa0Z3WQ0KLUVPYmtLdmJka05Ca3pFZ1ANCi1Eb0NrS3ZiZG11VXlqaXFmDQotRG5jS2p2YmRkbmVTanRUcg0KLUVQQ2tLdmJkUmtaRnRnTFQNCi1FT2JrS3ZiZFJqeUdVZ0xUDQotRVBDa0t2YmRLYUtnTWF4Ug0KLURuYmtLdmJkWk1SZFRuTU4NCi1FUENrS3ZiZHFaT2hHcGN4DQotRVBDa0t2YmR4d2hqQm96TA0KLURuY0tqdmJkR2NrVmlhaksNCi1FUENrS3ZiZGlpZkhpbHhTDQotRU9jTEt2YmRxVVVHclJqdA0KLUVQQ2pqdmJkYmhsakxHV3gNCi1EbmJrS3ZiZGhnS0N4dWpWDQotRG9ETEt2YmRKU3lBc05YbA0KLURvRExLdmJkamdmbEZlbkwNCi1FUENrS3ZiZE1KQmxReEFTDQotRG5jTEt2YmRVTVZvQXZQSg0KLURvQ2tLdmJka0NranBnVkgNCi1FUERLanZiZHFHRUVzdkFoDQotRU9ia0t2YmRtUnh1WnJjaQ0KLUVPYmpqdmJkTmRjdEloamQNCi1FUENrS3ZiZENTYURUZXZyDQotRVBDamp2YmRSRGNBb3Bjcg0KLUVPYmtLdmJkd3RtRXB5TU8NCi1FT2NLanZiZHFaUEhmcUR4DQotRU9jTEt2YmRhTktiU3RtSA0KLUVPY0xLdmJkYVNGY0hzZkwNCi1EbmJrS3ZiZFJvc2dKZWN3DQotRU9ia0t2YmRreVNyU3lHdA0KLUVPY0xLdmJkd3VNZHFZa24NCi1FUENqanZiZHJEZGhvbldCDQotRVBDa0t2YmRpQm9ERXdSUg0KLUVQQ2tLdmJkRXp0UWRsQ2kNCi1FT2JrS3ZiZEZ5VXVCRVhiDQotRVBES2p2YmRPQUlzVUpyQQ0KLUVQREtqdmJkS0NpY1JLQ3gNCi1FT2JqanZiZFNaaWhTYnZBDQotRG5jTEt2YmR2QWRZc1BFaA0KLURuY0tqdmJkeVNuSW1TQ0gNCi1FT2JrS3ZiZGlWWmVYUnRiDQotRU9jS2p2YmRzQ0ZsbEhMWg0KLUVQREtqdmJkWmVYZnpnaUMNCi1EbmJqanZiZE1wWHB2TmdUDQotRG9ETEt2YmRzQ0ZsbEhLeQ0KLURvQ2tLdmJkcVlvSGZwZFkNCi1EbmJqanZiZFJ6S0hyYnZBDQotRU9jS2p2YmROSENvbVB0aw0KLUVPY0xLdmJkQ0pMQmppR0sNCi1FUERMS3ZiZHNabFBzQWhPDQotRG5ia0t2YmRlbUZ2Z01paw0KLURvQ2pqdmJkRnlVdUJEd2INCi1EbmJqanZiZHJhZk1sR2taDQotRG5jS2p2YmRkWnlQeFlwYg0KLUVPYmpqdmJkeFpoR0Z3ZHINCi1FUENrS3ZiZEVYd2xUc3NsDQotRG5ia0t2YmRBTklZcnZ5eA0KLUVPYmpqdmJkZGVQUmF3Q2oNCi1FUERLanZiZHlOc0lYcmhjDQotRVBDa0t2YmRoa2VFT1ZEWg0KLURvRExLdmJkQU1neHJ3WngNCi1FUERMS3ZiZHNRV1BKYnZHDQotRG9Da0t2YmRrVnZtY2JYdw0KLUVQREtqdmJkSllUYklNUXANCi1EbmNMS3ZiZEJzQWNUZXdTDQotRG5jTEt2YmR4cm5KTlJhZw0KLUVPY0xLdmJkbVNZdHpTZEoNCi1FT2JrS3ZiZHFkRkpRTnVhDQotRG9Damp2YmRaeUVLT0Nrcg0KLURvQ2tLdmJkWkxyRVVPTG0NCi1FUENrS3ZiZFJOWGF4blV6DQotRVBETEt2YmRuVXVaampSZg0KLUVPYmtLdmJkbWJLWFlPbXUNCi1EbmJrS3ZiZGxaVFNUWWdVDQotRVBES2p2YmRHWXVVYUR4Qw0KLURuY0xLdmJkRnlWVkFjeEMNCi1Eb0RLanZiZEV2WlBwTWpGDQotRVBETEt2YmRTd2psTnpqeA0KLUVQQ2pqdmJkYktrZW9OY0ENCi1Eb0NrS3ZiZE1mY1FNb3RrDQotRG5ia0t2YmR5VE5pTlJiSA0KLURuY0xLdmJkRldZcFFNakYNCi1FUENrS3ZiZEV2WW9wTWpGDQotRG5jS2p2YmRlS0pyV1V6bg0KLUVPY0tqdmJkcHNzZnJTTFUNCi1FT2JqanZiZEtDakRSSmJ4DQotRG5ia0t2YmRlVUFVQVRNdg0KLUVQRExLdmJkaktHSUpseFMNCi1EbmJrS3ZiZHBzc2ZxckxVDQotRVBES2p2YmRxWlBIZ1FkWQ0KLUVQRExLdmJkZUFVUk5YaWYNCi1Eb0NqanZiZHlwb01oaXdBDQotRVBETEt2YmRHWXR1QWRYYg0KLUVPYmtLdmJkUmFjZUxpWWsNCi1Eb0NqanZiZFhzTUJOVG54DQotRU9jTEt2YmRLQ2pDcUtDeA0KLURvQ2pqdmJkWVNsQW1VUFkNCi1FUERMS3ZiZHBzdEdyU0t0DQotRVBES2p2YmRodHllWFJ1Qw0KLUVPYmpqdmJkdGxZWEJVQlgNCi1FT2JqanZiZFJNeEJ5TnR6DQotRU9iamp2YmRoYW5iZVdxUg0KLUVPY0tqdmJkcHlQSUhRY3gNCi1FUERMS3ZiZHJSdGpuTEJODQotRG9ES2p2YmROUVlRdk5nVA0KLURuYmpqdmJkYnNES3NkSmENCi1EbmJqanZiZER4WU1Uc3NsDQotRVBETEt2YmRuQ0tXeE9tdQ0KLURuY0tqdmJkSUxhem13UWsNCi1Eb0RLanZiZGhnSmNZdWl1DQotRG9Damp2YmRsWXJyU3lIVQ0KLUVPY0tqdmJkVlVOVUZrdksNCi1FT2JqanZiZFJ5akhyYnZBDQotRG9ETEt2YmREbmJrS3ZiZA0KLUVPY0tqdmJkYU5LYlN0bUgNCi1EbmJrS3ZiZGpibExSR3RnDQotRG5jS2p2YmR4VWxlUXlMbg0KLUVQREtqdmJkTEdGaEJhUXUNCi1FT2JrS3ZiZHFtWml5TGdpDQotRG9Damp2YmRKdXVHRUZHaQ0KLUVQREtqdmJkcW1aaXhsSUoNCi1Eb0NqanZiZFhuUkFZVlZ0DQotRU9jTEt2YmRXSVlWeEd4eg0KLUVQQ2tLdmJkeFpnZkdZRXINCi1FUERLanZiZGZOR1dmbUtMDQotRVBES2p2YmRicmJqc2NqQg0KLURvREtqdmJkc1B1bmpDdkcNCi1Eb0RLanZiZHppdVFRRHNVDQotRG9ETEt2YmRiaGxpamZXeA0KLUVQQ2tLdmJkaGdLQ3lXS1YNCi1FUERMS3ZiZEdMRXNDZ21WDQotRU9jS2p2YmRtSWNzcHVTQg0KLUVQREtqdmJkSXdzYklMcVENCi1Eb0RMS3ZiZHBlZEVzdkJJDQotRG5jTEt2YmRzUHVuakRWZg0KLURuY0xLdmJkSXhUYkhrcVENCi1EbmNMS3ZiZGNTYmtUZEphDQotRG5jS2p2YmRVV0xwSnNhUg0KLURuYmtLdmJkc1FWbmpDdkcNCi1FUERLanZiZHlYaUphcFprDQotRVBDa0t2YmRyekxvc0Fnbg0KLURuY0xLdmJkTnNUdWdFdVENCi1Eb0RMS3ZiZHJ5a29yYUhuDQotRU9iamp2YmR1YUR5U29GSQ0KLURuY0tqdmJkWkhXZEFPcmkNCi1FUENqanZiZGxxeHR5c0VKDQotRG5ia0t2YmRPU3N2SEV0cA0KLURvREtqdmJkUm90R2pHRHcNCi1Eb0RLanZiZFlmdmRBT3NKDQotRG9Da0t2YmRCaGphamlHSw0KLUVPYmpqdmJkQ2dMZWdBemMNCi1Eb0RMS3ZiZGh0eWVXclZDDQotRU9jS2p2YmR6aXRvb2NydA0KLUVPY0tqdmJkTlZUU0ttQVgNCi1FUENqanZiZFZZZ3N5am5uDQotRU9ia0t2YmRsaUVVUXVSYQ0KLURvQ2tLdmJkcUZjZVVXQWgNCi1FUERLanZiZElzWkFzTXhNDQotRG5ia0t2YmRVVmxQalVCUg0KLURvREtqdmJkYlVhZndqc2gNCi1FT2JqanZiZFFseENaT1V6DQotRG9Da0t2YmRRdm5FRExoRA0KLUVPY0tqdmJkVVZsUUtVQlINCi1FUERLanZiZGVoS3ZSblFnDQotRG9ETEt2YmR4bXNJWVRJYw0KLUVPYmpqdmJkc0NHTkxma1oNCi1FT2JqanZiZG1TWXR6U2RKDQotRG9Damp2YmRpTUVjblZEWg0KLUVQQ2pqdmJkeXBubGhpd0ENCi1Eb0NqanZiZFJ5aWhURFdBDQotRG9Damp2YmRab09KRWR6Sw0KLURvQ2pqdmJkSnB6RW9HT0YNCi1Eb0NrS3ZiZFlwbUVpTWVSDQotRVBDa0t2YmRiaGxqS2ZXeA0KLUVQRExLdmJkcVluZ2dRY3gNCi1FT2NMS3ZiZHdqd0VIenlmDQotRVBDamp2YmRMRmVnYkFxVg0KLURvQ2pqdmJkTW94UXZOZ1QNCi1FUENqanZiZFpzaUl5RVRPDQotRG9ETEt2YmRaUW1GSW1FcQ0KLURuYmpqdmJkWWtyRHRPTU4NCi1FUENqanZiZGpnZ01HR09MDQotRG5jTEt2YmREd3dsVHN0TQ0KLUVPY0tqdmJkQ1d6Y2lGUVcNCi1Eb0NrS3ZiZHlZSWlhb3pMDQotRG5ia0t2YmROc1R1ZmVWUQ0KLURvREtqdmJkamxha3lkZm8NCi1FT2JqanZiZFVHem5MdnVlDQotRG9Damp2YmRlRk9xYXdESw0KLURvQ2pqdmJkWm5taUZFeWoNCi1FT2NLanZiZFZCQ1FycHJaDQotRU9jTEt2YmRyb3ZPakN2Rw0KLURuY0tqdmJkcm92UEtDdWYNCi1FT2NMS3ZiZGxZcnFyeUhVDQotRU9ia0t2YmRjeXlQeFpRYg0KLUVPYmpqdmJkbkJpdndublYNCi1FT2JqanZiZGpKZWhKbHdyDQotRG5ia0t2YmRPRkR0SklqZA0KLURuYmpqdmJkVkFhcVNxU1oNCi1FT2JrS3ZiZHJYUGtiaVpSDQotRG9Damp2YmR6YUFQR2ZhbA0KLURuY0tqdmJkWlFsZGhtRXENCi1FT2JqanZiZG1veXh2TFpDDQotRG5ia0t2YmRtcFp4dWp5Qw0KLURvQ2pqdmJkdndMYVdCV1YNCi1EbmNMS3ZiZGlWWmR2cXVDDQotRG5iamp2YmRlckJXemxEUA0KLUVQQ2pqdmJkamJranBmdUgNCi1EbmNMS3ZiZHJhZk5MZmtaDQotRG5jS2p2YmRyV29rYmh4cQ0KLUVQQ2tLdmJkc1prb3NCSG4NCi1FT2NLanZiZGlkamZ1UEFPDQotRG5iamp2YmROR2NQbVFVaw0KLUVQQ2pqdmJkckpBS0ZOT2UNCi1EbmJqanZiZFR1a29pdEJSDQotRG5ia0t2YmR5U21obHJDSA0KLUVPYmtLdmJkclhQa2NJeHENCi1FT2NMS3ZiZEZlalNPSXRSDQotRU9ia0t2YmRtZ0V4TW5HeQ0KLUVQREtqdmJkcXJWTE9MQk4NCi1Eb0RLanZiZExBa0hOQ1lSDQotRU9ia0t2YmRWck9YYkVrYw0KLURuYmpqdmJkRVh3bFVUc2wNCi1FUENrS3ZiZHlYaGpCcFprDQotRU9ia0t2YmRpaWZIak14Uw0KLUVPY0tqdmJkRUtIaXV4S0ENCi1FT2JrS3ZiZFpMcWRUbWxODQotRU9ia0t2YmRXUm5YYWVMYw0KLURuYmpqdmJkV1NOd2FlTUQNCi1EbmJqanZiZGZOR1dnTktMDQotRG9ES2p2YmRvQUt6dElEbg0KLURuY0xLdmJkbWFpdnhPbXUNCi1EbmJqanZiZFpMcWNzbk1ODQotRU9iamp2YmRjVERLc2NpYQ0KLUVQQ2pqdmJkT1RUdWZlVXANCi1Eb0RLanZiZEdkTFZqQmpLDQotRG5jS2p2YmRjSk5LTEZ2eA0KLUVPY0xLdmJkVFlLa216angNCi1FT2NLanZiZFpSTWVJbUVxDQotRG9ETEt2YmRLUXllUEZuRg0KLURuYmtLdmJkTnJ0V0dkdVENCi1FUENqanZiZGF0YkhYanRJDQotRVBDamp2YmR2d01BdWFWdQ0KLUVQRExLdmJkblFaeHZMWkMNCi1FT2JqanZiZHRsWVhBc2FYDQotRG5ia0t2YmR1RERWV3ZQUA0KLUVQRExLdmJkcVR0R3JTS3QNCi1FT2JqanZiZHhuU2d3c0pEDQotRU9iamp2YmRiS2tlbm1jQQ0KLUVQQ2tLdmJkRmFPcVlpem0NCi1FT2NLanZiZExHR0hiQlJWDQotRG9ETEt2YmRSekpoVEN2QQ0KLUVQQ2pqdmJkaU1GRG10Y1oNCi1EbmJqanZiZFdXaHd2RUVnDQotRVBDamp2YmRKbUFFWmdWQg0KLURvQ2pqdmJkbXVWWmppckcNCi1Eb0NqanZiZGxpRVVSVXFhDQotRG9ETEt2YmRuQ0tXd25uVg0KLUVQRExLdmJkaGdKYnlWaXUNCi1EbmJrS3ZiZGpnZ01GZk5rDQotRU9ia0t2YmRFdXhvcE1pZQ0KLUVQREtqdmJkc3NSc1l5ZGMNCi1EbmNMS3ZiZGxpRHNxVlJhDQotRU9jTEt2YmRMQktmbGJZUg0KLURuY0tqdmJkem9QcGVDbFkNCi1EbmNLanZiZHFGZEVzdkJJDQotRG9Damp2YmRaTVJjdE9NTg0KLURuY0tqdmJkRG5ia0xXY0UNCi1FT2JrS3ZiZE1mY1FOUHVMDQotRG9ES2p2YmRVV01QalRhUg0KLURuYmpqdmJkeG1zSHdzSWMNCi1FT2JrS3ZiZHJEZGhvbldCDQotRVBDa0t2YmRoZ0pjWXZKdQ0KLURvQ2tLdmJkbFlzU1N5SFUNCi1FUENqanZiZE5kY3NpSkxFDQotRG9ES2p2YmRobEVjbXVDeQ0KLUVPYmpqdmJkSlRaQXNOWGwNCi1FUENqanZiZHpucFFlQ2xZDQotRG5jTEt2YmREeFlNVHNzbA0KLURvQ2pqdmJka1Z3TmNiWHcNCi1FT2NMS3ZiZE1nRFBscFVrDQotRU9ia0t2YmRYc01BbHNueA0KLURuYmtLdmJkaUJuY0V2cVINCi1FUENqanZiZGVGUFNDV2NLDQotRG9ES2p2YmRtdVV6S2pTRw0KLUVQREtqdmJkcXJVa05qYU4NCi1Eb0RLanZiZGh5dUZsUW5HDQotRU9jS2p2YmREaWdpdllLQQ0KLURvRExLdmJkSllVQ0hrcVENCi1EbmNLanZiZEFDcXdpeWlRDQotRVBES2p2YmRFWVhrc3RVTQ0KLURvRExLdmJkS0RLQ3BpY1kNCi1EbmNMS3ZiZENEb2FWak5HDQotRU9ia0t2YmR4WmhGZXhGUw0KLUVQQ2tLdmJkS0RKY1FqQ3gNCi1Eb0RMS3ZiZEVQQ2tLd0NkDQotRVBDa0t2YmRUZnpta3dWZQ0KLURuYmpqdmJkdVdPWUpxVEENCi1Eb0NqanZiZGNKTWlqZlhZDQotRVBDa0t2YmRtYWl3WVBPVg0KLUVPY0tqdmJkZGpKclZ0em4NCi1FT2JrS3ZiZHBzdEhTUmp0DQotRU9jS2p2YmR5WGlLQ1Faaw0KLURuYmtLdmJkSXNZYVNtWU0NCi1EbmJqanZiZHd0bUZReGxPDQotRG5ia0t2YmRZcGxlSk1kcQ0KLURvQ2pqdmJka05Ca3pGR28NCi1FT2NLanZiZGJzQ2tVRUtCDQotRG9ES2p2YmRZbFJjdE9NTg0KLURuYmtLdmJkanV3T0VDWHcNCi1FUERLanZiZFdSblhhZU1EDQotRG5jTEt2YmRrRExrUWdWSA0KLURvRExLdmJkRmVpcW5KVHENCi1FT2NLanZiZHpIWWxBTWVYDQotRVBDamp2YmRKYmpDcGpEWQ0KLUVQRExLdmJkeml0b3BEc1UNCi1EbmJrS3ZiZHppdVBwRHJ0DQotRG5jTEt2YmR5U25JbVNDSA0KLURuYmpqdmJkeVNuSW1SYkgNCi1Eb0NqanZiZEtqYUlXQUp5DQotRG5iamp2YmRUcVJQVXRoTg0KLURvQ2pqdmJkVVJRbnR1SU4NCi1FT2JqanZiZFFseENZbXR6DQotRVBES2p2YmRNdHNTTE5BWA0KLUVPYmpqdmJkSmJqRFFpY1kNCi1Eb0RLanZiZEVQQ2tLd0RFDQotRU9ia0t2YmRLUXlkb0dOZQ0KLURvRExLdmJkVndKWHVjZUgNCi1FT2JqanZiZG5VdHlrSnJHDQotRG5jTEt2YmR3TXZBTkVFbQ0KLUVQREtqdmJkcHlQSGdRZFkNCi1EbmJqanZiZFVWa3BLVUJSDQotRU9jTEt2YmRoZmpDeVZqVg0KLUVQREtqdmJkZG9GVEtzdFMNCi1FUENrS3ZiZEFOSHlUWFp4DQotRVBDa0t2YmRVeGhUeWpvTw0KLUVPYmpqdmJka1Z3TmRCeFgNCi1FUERLanZiZERvQ2pqdmJkDQotRG5ia0t2YmRXV2h3dWRFZw0KLURuYmtLdmJkeVROaU1yQ0gNCi1Eb0RMS3ZiZGVsZXdHbGpMDQotRG5jTEt2YmRVR3puTVd1ZQ0KLURuY0tqdmJkd3lnZkZ3ZHINCi1FUENrS3ZiZEpxWmVQRm5GDQotRG5iamp2YmROc1R1Z0V1UQ0KLURvREtqdmJkUWNiYVBxRHINCi1EbmNMS3ZiZGZNZXZnTkprDQotRG5jTEt2YmRsclpWWnJkSg0KLURvQ2pqdmJkRmplVENnbHUNCi1EbmJqanZiZFlxTkZJbUVxDQotRG9Damp2YmRzQ0dNa2ZrWg0KLURuY0xLdmJkaHVaZHdTVWINCi1Eb0NrS3ZiZHJYUGtiaVpSDQotRG9Damp2YmRaUk1kaU1kcQ0KLURvREtqdmJkZW1GdmdNakwNCi1Eb0NqanZiZHlnWk1BTkV3DQotRU9jS2p2YmRaUk1lSWxkcQ0KLUVPYmtLdmJkaUhKY1pXS1YNCi1EbmNLanZiZENKS2JLaUZqDQotRU9iamp2YmR6Uk9saGpYQQ0KLURuYmpqdmJkRG9ETEt2YmQNCi1FUERMS3ZiZFZZZ3Raam5uDQotRU9ia0t2YmREb0NqandERQ0KLURuYmtLdmJkcm91b0pidWYNCi1Eb0NrS3ZiZHlUT0ltUmFnDQotRVBES2p2YmRCY3BCVmlsZg0KLURvQ2pqdmJkQ1d6ZEpGUVcNCi1FUENrS3ZiZGJyYmpzY2pCDQotRU9jTEt2YmR3a1dkSHp6Rw0KLUVQREtqdmJkbkdlWGxuR3kNCi1FUENrS3ZiZHpucFJFY0x4DQotRVBDa0t2YmRaTVJjc25MbQ0KLUVPY0tqdmJkSlN5QXJtWGwNCi1EbmJrS3ZiZFpNU0R0TmttDQotRVBES2p2YmRBTWd5U3Z6WQ0KLURvRExLdmJkeVlKSmJQekwNCi1Eb0NrS3ZiZExBamdNYXhSDQotRG9ETEt2YmRXSVh1eEd4eg0KLURvQ2pqdmJkcXdRTGJpWXENCi1EbmJrS3ZiZHB5UElIUWN4DQotRU9jS2p2YmRmTkdYSE5Kaw0KLURuY0tqdmJkcVluaEhRZFkNCi1EbmNLanZiZGVFbnJCdmNLDQotRVBES2p2YmRaalRIcEdhZg0KLURvRExLdmJkdW9UenFMUFUNCi1EbmJrS3ZiZElqRUFKb2ZkDQotRG5ia0t2YmR4blNneFRKRA0KLURvRExLdmJkWHNMYU1zbngNCi1EbmJqanZiZGFSZkRIc2VrDQotRG9Da0t2YmR1THd3QXRCWA0KLURuYmtLdmJkcnBXUEpjVmYNCi1Eb0RLanZiZHJiRmxrZ0xaDQotRG9Da0t2YmRscXh0eXJkSg0KLUVPYmtLdmJkUnlpaFNidkENCi1FT2JrS3ZiZFdSbllDRkxjDQotRG9Da0t2YmRPRWNzaGhqZA0KLURuYmtLdmJkWmpUSHBIQmYNCi1EbmJqanZiZGN5eVB3eHBiDQotRG5jTEt2YmRrVnZtZENYdw0KLURuY0xLdmJkY1NjS3RFSmENCi1EbmJqanZiZHJTVkxPTEJODQotRU9ia0t2YmRpR2pEWXZLVg0KLUVQQ2tLdmJkRUpnalZ3akENCi1EbmJrS3ZiZFJvc2dLRmRYDQotRVBETEt2YmRjU2NLdERpYQ0KLURvQ2pqdmJkdGJjVlhWbm8NCi1EbmNLanZiZGhnSmJ5Vml1DQotRVBDamp2YmRqSmVoS05ZUw0KLUVPYmtLdmJkeU9USVlUSkQNCi1EbmJrS3ZiZFJhY2VNSllrDQotRG9Da0t2YmRxaUFLRW1PZQ0KLURvRExLdmJkRUtIaXV3akENCi1FT2JrS3ZiZHhVbGRweGtuDQotRU9ia0t2YmRGZWpSbWh0Ug0KLURuY0xLdmJkU0JjZGxJeUwNCi1FUENrS3ZiZHhaaEZleEZTDQotRU9iamp2YmR3andFSHp6Rw0KLUVQQ2pqdmJkbVJ4dHpTZEoNCi1FUERMS3ZiZEV2WW9vbGpGDQotRG9Da0t2YmRtZ0ZYbG1meQ0KLURvQ2pqdmJkdGt4WEJUYVgNCi1FT2JrS3ZiZG1nRXhNbkhaDQotRG5jTEt2YmRqdlhPRGF3dw0KLURvQ2tLdmJkU0NFRk1JeUwNCi1FUERLanZiZFZZaFR5a09uDQotRG9ETEt2YmROc1VWZ0ZVcA0KLURuY0tqdmJkUlhPRUNsSUQNCi1Eb0RLanZiZG5WVlprS1NHDQotRG9ES2p2YmRXV2h4VmNkZw0KLUVQQ2tLdmJkd3VORlF4bE8NCi1EbmNMS3ZiZEtlZWdiQlJWDQotRG5jTEt2YmRVV0xwSnNhUg0KLUVPY0xLdmJkTnhPdXpjbXQNCi1FT2JqanZiZGR3elVVU0Z6DQotRG9Damp2YmRKWHRCaE1RcA0KLURvQ2tLdmJkTEdGZ2JCUlYNCi1FT2NMS3ZiZGNKTWpLZXdZDQotRG5iamp2YmR4VW1FcVlrbg0KLURuYmtLdmJkamJranFHdGcNCi1FUENrS3ZiZElIR3pZd3dnDQotRG5iamp2YmRycFdPakN2Rw0KLURvREtqdmJkWk1SY3ROa20NCi1EbmJrS3ZiZGRaeVB3eHFDDQotRG9Damp2YmR0Y0RWV3Vubw0KLURvQ2tLdmJkSmNLRFJKY1kNCi1FT2NMS3ZiZG1iS1d3bm5WDQotRVBES2p2YmRjYXNOU0FVTg0KLUVQQ2tLdmJkVWFCcHNRcXkNCi1FT2JrS3ZiZEp1dGVkRkhKDQotRG9ETEt2YmRCaGpha0pGag0KLURuYmtLdmJkblV1WmppcWYNCi1FUERLanZiZHB4b0hnUWN4DQotRG5iamp2YmRaalRIb2ZiRw0KLUVPYmtLdmJka3hzU1N4Z1UNCi1EbmJqanZiZFdSbXdiRWxEDQotRG9Da0t2YmRSa1pGdUdqcw0KLUVQQ2tLdmJkd05XQU5EZG0NCi1FT2JqanZiZFRrdlBCVm5pDQotRG9ES2p2YmRkbmRya1R0Uw0KLURuY0xLdmJkWnRKSXhkU24NCi1FT2NMS3ZiZHVhRHlUT2VJDQotRU9jS2p2YmR4WmdmR1hkcg0KLUVPY0xLdmJka3lTclRaR3QNCi1FUERLanZiZFZ3Slh1Y2RnDQotRVBETEt2YmRhdGFnWUxVSQ0KLURvQ2pqdmJkZFp4cFlaUWINCi1FUERLanZiZHR1blhqUlRBDQotRG9ETEt2YmRXU09ZQmVNRA0KLURvQ2pqdmJkSGxCem5YUkwNCi1FUERMS3ZiZGN5eHBYeHBiDQotRG5iamp2YmRBTWhZc1d6WQ0KLUVPYmpqdmJkcmFlbUxnS3kNCi1FUERLanZiZEpwekZPZW5GDQotRG9Damp2YmRabm5JZUV5ag0KLURvQ2pqdmJkcldwTGJpWlINCi1FT2NLanZiZExxd015dHB6DQotRG5jS2p2YmRLUXpFb0ZtZQ0KLUVQREtqdmJkWlJNZUpNZVINCi1EbmNLanZiZEV1eHBQbGllDQotRU9jTEt2YmRGV1lwUGxpZQ0KLUVPY0xLdmJkamJsS3BnVWcNCi1FT2NMS3ZiZGlCbmJkd1FxDQotRG9ETEt2YmRPVFR1ZmVWUQ0KLUVQREtqdmJkcHlPZ2dRZFkNCi1EbmJrS3ZiZEdCT3FZaXptDQotRU9iamp2YmRSanhmVWZrVA0KLUVQQ2pqdmJkVU1Wb0F1b0oNCi1Eb0RMS3ZiZFZ3Slh2RUVnDQotRU9ia0t2YmRuQ0tYWG9PVg0KLURvREtqdmJkTlB4UlZtZ1QNCi1EbmNMS3ZiZFpzaUl4ZFNuDQotRVBES2p2YmRqbGFsWmVIUA0KLURvRExLdmJkZUZQU0J2YmoNCi1Eb0RLanZiZFZxblhiRk1EDQotRG5jS2p2YmRIZmZ5eVlZSA0KLUVPY0xLdmJkQmhqYkxKRmoNCi1FUERLanZiZEp2VkdFRkhKDQotRU9jS2p2YmRnUUJ6dmRZSQ0KLUVQRExLdmJkcHlPZ2dSRHgNCi1FT2JqanZiZEtReWVPZk5lDQotRVBDamp2YmR0Y0N0d1Zubw0KLUVQQ2pqdmJkUXZtZENsSGMNCi1EbmJrS3ZiZHlYaUtCb3lrDQotRG5jS2p2YmRxVHNnU1NMVQ0KLUVPYmpqdmJkeU5yZ3hTaGMNCi1EbmJqanZiZFJrWkZ1R2pzDQotRU9iamp2YmRZZnZkQU9yaQ0KLURvREtqdmJka01iTVplR28NCi1FUERMS3ZiZENJamJMSWVqDQotRG9ES2p2YmRIZmZ5eHd3Zw0KLUVQQ2tLdmJkR2RMVmliSmoNCi1Eb0NrS3ZiZGFhVmRlcFFYDQotRG5ia0t2YmRTUVVHaWZEdw0KLUVQQ2tLdmJkcVluZ2ZwZFkNCi1EbmJrS3ZiZHhVbGVReUxuDQotRG9Damp2YmRxbHlpeGtnaQ0KLUVQQ2tLdmJkamdma2ZHTmsNCi1FT2JqanZiZGVGT3FhdmJqDQotRG9ETEt2YmRZa3JEdE5sTg0KLURvQ2tLdmJkamhHbEZlbkwNCi1FUENqanZiZGlqRmhKbVhyDQotRU9iamp2YmRuR2VZTW1meQ0KLUVPY0xLdmJkYmhtSmpmWFkNCi1FT2NMS3ZiZExCS2ZtQ1lSDQotRG5jTEt2YmRKU3hhU21YbA0KLUVQQ2pqdmJkc1FWbmljV0cNCi1Eb0RLanZiZGpoSExmRm5MDQotRU9ia0t2YmRqdXdPRUJ3dw0KLURvQ2pqdmJkaUJuY0V2cHENCi1FT2NMS3ZiZHVMeFdhVUF3DQotRG5jTEt2YmRodVpkd1J0Yg0KLUVPY0tqdmJkanZXbkVDWHcNCi1FT2JrS3ZiZFplWUd6Z2hiDQotRG9ETEt2YmROUVlRdW1nVA0KLURvREtqdmJkSnB5ZG9GbkYNCi1FUENrS3ZiZFJqeUZ1R2tUDQotRG5iamp2YmRyYWVsa2dLeQ0KLUVPYmpqdmJkZk5HWEhNakwNCi1Eb0RMS3ZiZHVXTndpcVRBDQotRG5jS2p2YmRuVlV6TEpyRw0KLURvRExLdmJkZWhLdlNPUWcNCi1FUERMS3ZiZHd0bUZSWWtuDQotRG9ES2p2YmRLZkZnYWFRdQ0KLURuY0tqdmJkQ1RCRFRmWFMNCi1FT2JqanZiZERvQ2pqd0NkDQotRVBDamp2YmRZVE1BbVVPeA0KLUVPY0tqdmJkaU1GRG5WQ3kNCi1FT2JrS3ZiZGpsYWxaZUhQDQotRG5iamp2YmRDSkxDTElmSw0KLURvRExLdmJkWk1SZFVOa20NCi1EbmJqanZiZFVSUlBWVWdtDQotRU9iamp2YmRKY0picGlieA0KLUVPYmtLdmJkcldwTURKWlINCi1FT2JqanZiZGp1d05kQnhYDQotRVBDamp2YmRiQlZkZlFRWA0KLUVQQ2pqdmJkS1JaZU9mT0YNCi1Eb0NrS3ZiZEtES0NxS0N4DQotRG9Damp2YmRrVnZtZEJ4WA0KLUVQREtqdmJkdkFkWXJvRWgNCi1FT2NMS3ZiZHRjQ3VYV1BQDQotRVBDamp2YmRjelpRWHhwYg0KLURuY0tqdmJkVXhoVVprUE8NCi1FT2JqanZiZGxyWXR5c0VKDQotRG5jTEt2YmRjU2NMVURpYQ0KLUVQREtqdmJkQnNBYnNldnINCi1Eb0RMS3ZiZHFUdEdxckxVDQotRG9ES2p2YmRTQ0VGTGlZaw0KLUVQQ2pqdmJkUldtY2NMZ2MNCi1EbmNMS3ZiZE5RWVF1bkdzDQotRU9ia0t2YmRtYktYWVBOdQ0KLUVQQ2pqdmJkZk1ld0dtS0wNCi1FT2JqanZiZHpST21JaXdBDQotRG5ia0t2YmRsaUVUcHRxYQ0KLUVQREtqdmJkSGxCem5XcGsNCi1Eb0NrS3ZiZFVhQnBzUXF5DQotRG9Da0t2YmRXU09ZQ0ZNRA0KLURvRExLdmJkeG1yaFlUSWMNCi1EbmNMS3ZiZExBa0dsYllSDQotRG5jS2p2YmRsaGN0UlVxYQ0KLURvQ2pqdmJkdURDdHdWbm8NCi1EbmJrS3ZiZElqRUFLUUhFDQotRG5iamp2YmRpTGRkTnVDeQ0KLUVQREtqdmJkRVh3a3RVVGwNCi1FUENqanZiZHlOcmd3c0pEDQotRU9ia0t2YmRuUHpZdWp4Yg0KLUVQREtqdmJkem5vcUVjTVkNCi1FUERLanZiZFpSTkVobGVSDQotRG9Damp2YmRHUUFUWEhGeQ0KLUVQQ2pqdmJkeXFQTklpd0ENCi1FT2NLanZiZGt4cnJUWWdVDQotRU9jS2p2YmRjSW1LTEZ2eA0KLURvQ2tLdmJkdW9UenBrUFUNCi1FUENqanZiZEpYdENJTVFwDQotRU9jS2p2YmRycFZvSmJ2Rw0KLURuY0xLdmJkcVpQSUhSRHgNCi1EbmJqanZiZFRBRkpIYW5kDQotRU9jS2p2YmR0Y0N1V3Vubw0KLURuY0xLdmJkZklLdXJOcUgNCi1EbmNLanZiZExyV21adHB6DQotRG9ETEt2YmRNdHNSam1BWA0KLUVPYmpqdmJkTEdHSGJCUlYNCi1FT2JrS3ZiZENXemNoZVB2DQotRU9jS2p2YmRaeGNqT0RNUw0KLUVPYmtLdmJkemFBUEdnQmwNCi1Eb0RMS3ZiZEtWdGVjZGdKDQotRG5iamp2YmRIRGp2SmJKag0KLUVQQ2pqdmJkTGlDTHFZQVMNCi1FUERMS3ZiZEZWeHBQbUtGDQotRG9ETEt2YmRaaXNJUGdCZg0KLURuY0xLdmJkVHBwb1V0Z20NCi1EbmJqanZiZHB5UElHcGRZDQotRG9ETEt2YmRFenRSRWxDaQ0KLURuY0xLdmJkSGdHelpZWUgNCi1EbmJqanZiZFpMcWN0T01ODQotRG5ia0t2YmRxVHRHcXFrVQ0KLURuYmpqdmJkaU1FY25WQ3kNCi1FUERLanZiZHZCRHhybmVJDQotRG9ES2p2YmRlbUdYSE5Kaw0KLURvREtqdmJkaGZpY1l2S1YNCi1FT2JqanZiZGVna1dTT1FnDQotRG9ETEt2YmRPRkR0SWlLZA0KLUVQQ2pqdmJkQmRRQXVpbUcNCi1Eb0NqanZiZHB5UEhnUkVZDQotRG5jS2p2YmRKWHNiSGtwcA0KLURvREtqdmJkUmJFRWxJeGsNCi1Eb0RLanZiZHNRV1BKY1dHDQotRU9ia0t2YmRzQ0dOTGZrWg0KLUVPY0xLdmJkemFBUEdnQ00NCi1FT2JrS3ZiZHpqVW9vZFN0DQotRG5ia0t2YmRlbUZ2Z01qTA0KLURuYmtLdmJkV1doeFZjZGcNCi1EbmNMS3ZiZHhybWlNcWFnDQotRVBDa0t2YmRNU1dseXRweg0KLUVPYmpqdmJkd05XQU1kRk4NCi1FUERMS3ZiZGxyWXR6VEVKDQotRG5iamp2YmRWcW5ZQmVMYw0KLURuY0tqdmJkbkhFd21PR3kNCi1EbmJqanZiZHRiYnVXdlBQDQotRG5jS2p2YmRtSWNzcHVTQg0KLUVPYmtLdmJkRU9jS2tYQ2QNCi1FT2NLanZiZERuY0trWENkDQotRVBETEt2YmR1YUR4cm5kaA0KLURvQ2pqdmJkT0ZEc2hoa0UNCi1EbmJrS3ZiZFJhY2VMaHlMDQotRVBDa0t2YmRac2hoeURybg0KLURvQ2pqdmJkQ1NhRFRmV3INCi1FT2NLanZiZHFVVGZyU0xVDQotRVBETEt2YmR0VFJyeVpkYw0KLURvRExLdmJka3lUUnNaR3QNCi1FUERLanZiZHlxUE5JalhBDQotRG9Da0t2YmROVXJyS21BWA0KLURvQ2pqdmJkU0NEZU1JeGsNCi1FT2JrS3ZiZGtNYkx6RWdQDQotRG5jS2p2YmRFdlpQcE1pZQ0KLURvQ2tLdmJkeVlJaWJRWmsNCi1FT2JrS3ZiZE5QeFF1bWZzDQotRU9jTEt2YmREbmNLanZiZA0KLUVQQ2tLdmJkb3ptY2p4UEENCi1FUERLanZiZENJa0NMSWZLDQotRG5jS2p2YmRjeXhveFpSQw0KLURvQ2tLdmJkZU9kcmtVVVMNCi1Eb0NqanZiZGh6VkZsUW5HDQotRU9iamp2YmRPRkVUaUpMRQ0KLURuY0tqdmJkaHl1R0xxTmYNCi1FT2JrS3ZiZFJXbWRDbElEDQotRG9Damp2YmRGcEFUV2dGeQ0KLURuYmtLdmJkbHF4dHlzRGkNCi1FT2JqanZiZHFtWmpZa2hKDQotRG9ES2p2YmRaeURqT0RNUw0KLURvQ2pqdmJkRUpoSnZZS0ENCi1FT2NLanZiZHFUc2dSckxVDQotRU9jS2p2YmRac2lJeGNybg0KLUVPYmtLdmJkSUhHelpZWUgNCi1FUERLanZiZEhnR3l4eFhnDQotRU9ia0t2YmR4bXJnd3JpRA0KLUVQQ2tLdmJkeHJuSk5TQmcNCi1EbmJrS3ZiZGpoR2tlZk9MDQotRVBDamp2YmRLUXlkb0dOZQ0KLUVPY0tqdmJkcXZwTURKWlINCi1FT2JqanZiZFFkREJRUWRTDQotRG9ES2p2YmRTS3hmVkhLcw0KLURvREtqdmJkYkxMZW9PREENCi1Eb0RMS3ZiZEJzQWNVR1dyDQotRG9Damp2YmRSektIcmJ2QQ0KLUVPYmpqdmJkZk1mWEdsakwNCi1FT2JrS3ZiZGRlT3JDV2JqDQotRG9ES2p2YmRkakpyVnR6bg0KLURvRExLdmJkaHR5ZHZxdGINCi1EbmJqanZiZFJOWGF5T1V6DQotRVBETEt2YmRSanlGdGdLcw0KLUVPYmtLdmJkc1B1b0tDdkcNCi1FUENrS3ZiZFlxTkVpTkZSDQotRG5jS2p2YmRVeGdzeWpubg0KLUVQQ2pqdmJkWlJNZGhsZHENCi1Eb0RMS3ZiZEVKaEtXWGpBDQotRG9Da0t2YmRRd09EYmxJRA0KLUVQQ2tLdmJkc3NScnh6RkQNCi1EbmJqanZiZFp4ZEtPQ2tyDQotRU9iamp2YmR1Q2NVd1Zubw0KLUVPY0tqdmJkbXVVekxLUmYNCi1FUENqanZiZGZwQnp2Y3doDQotRG5iamp2YmRNb3dwdk5mcw0KLUVQREtqdmJkR0xFcmNIbVYNCi1FUERMS3ZiZFpvT0llRXlqDQotRG5jTEt2YmRTTFpHVWdLcw0KLURuY0xLdmJkbHF5VXpURUoNCi1FUENqanZiZGRlUFJhd0RLDQotRG5jS2p2YmRIRUt2S0NKag0KLURvREtqdmJkZUVucWF2Y0sNCi1Eb0RMS3ZiZHRTclRZekZEDQotRVBETEt2YmR4VW1GUXhsTw0KLURuYmpqdmJkTExCSVdBSnkNCi1FT2NMS3ZiZE1vd3FXTmZzDQotRVBES2p2YmRwdFVHclNLdA0KLURvRExLdmJkSEVLdktDS0sNCi1FUENqanZiZEpjSmJwakRZDQotRG5iamp2YmRNdVRSa05BWA0KLURuYmtLdmJkRXpzcGRsREoNCi1EbmNMS3ZiZFZVTXNla3ZLDQotRVBES2p2YmRPVFVWZ0V0cA0KLURuY0tqdmJkQU1neVN3WngNCi1Eb0NrS3ZiZHd0bUZSWWtuDQotRU9iamp2YmRJakVBS1BnRQ0KLUVQREtqdmJkUnBUZmpHRVgNCi1EbmNLanZiZEZqZVNiZ2x1DQotRU9ia0t2YmRqRkxHdG9BTw0KLURvQ2tLdmJkdVdPWUpxVEENCi1FUENrS3ZiZFZBYXBzUXJaDQotRG5iamp2YmRWd0pYdWRFZw0KLURvRExLdmJkVXRNc2ZMdksNCi1FUENqanZiZEhFTFZqQmlqDQotRG5jS2p2YmRSV25FQ2toRA0KLUVQRExLdmJkWnNpSlpEc08NCi1EbmNMS3ZiZG5QelpXTFliDQotRVBDamp2YmR6bm9xRWNNWQ0KLUVPY0tqdmJkem9RUWVETVkNCi1EbmJqanZiZHpucFFkYmt4DQotRVBES2p2YmRlWVp0VHJGeg0KLURvQ2tLdmJka3lTclRaSFUNCi1EbmNLanZiZENTYURVR1hTDQotRG9Da0t2YmRjSk5KamZYWQ0KLUVPY0xLdmJkQ0VRQXZKbGYNCi1FUERLanZiZHl6ZG1xaEpJDQotRG5jTEt2YmROUHdwdk5nVA0KLURvREtqdmJkcW1aaXhrZ2kNCi1FT2NLanZiZFZZaFVaa1BPDQotRU9ia0t2YmRoZ0pieHZKdQ0KLURvREtqdmJkVVFxUFV1SG0NCi1EbmNMS3ZiZHF2b2xDaHlSDQotRVBDa0t2YmRFWHhNVHNzbA0KLURuYmtLdmJkSGdHell3eEgNCi1Eb0RMS3ZiZElpZEFKcEdkDQotRG5ia0t2YmRaTHFkVU9NTg0KLURuYmtLdmJkR2NrVmlhaWoNCi1Eb0NrS3ZiZEZWeG9wTkplDQotRU9jTEt2YmRSYkVGTUl5TA0KLUVPYmtLdmJkTEFqZmxhd3ENCi1FT2JqanZiZHppdVBvZFRVDQotRVBETEt2YmRRd05kQ2toRA0KLUVQQ2pqdmJkWnhkSm1jTHINCi1FUERMS3ZiZHhybWhscWFnDQotRG9Da0t2YmRTUHNnSmZEdw0KLUVQQ2pqdmJka0RManBnVWcNCi1EbmJqanZiZHRiY1V3V09vDQotRG5ia0t2YmRXSVh1eEhZeg0KLUVPYmpqdmJkRXZZcFFNaWUNCi1Eb0RMS3ZiZElIR3paWHhIDQotRVBETEt2YmRWWWdzektvTw0KLURuY0tqdmJkaGFuY0V2cHENCi1FUENqanZiZGNKTktLZXdZDQotRVBES2p2YmRXV2h3dkVFZw0KLUVPY0xLdmJkdkFkWXNPZGgNCi1FT2JrS3ZiZGN5eVB3eHFDDQotRU9iamp2YmRTUHRHaWZEdw0KLUVPY0xLdmJka01hbFplSFANCi1FUERLanZiZFlsUmN0TmxODQotRG9ETEt2YmRLV1ZHRUZHaQ0KLURuY0xLdmJkTWdDb2xvdUwNCi1EbmNMS3ZiZGhiUENlWFJSDQotRG5jTEt2YmREd3hNVHN0TQ0KLURvREtqdmJkdkFjeVNuZGgNCi1FT2JrS3ZiZFhHWXl0QVBUDQotRG9Damp2YmRtdVZaampSZg0KLUVPY0xLdmJkREdsRmdBemMNCi1Eb0RLanZiZGlCbmNGWFJSDQotRG9ES2p2YmRrYU1ubUFMQQ0KLURuY0tqdmJkVkJDUXJxU1oNCi1Eb0NrS3ZiZFZ2aVlXRUZIDQotRU9ia0t2YmRBTWhaU3daeA0KLURvRExLdmJkZUFVUWx3akcNCi1Eb0RMS3ZiZFp4Y2pPRE1TDQotRU9jTEt2YmRycFdQS0RWZg0KLUVQQ2tLdmJkV1JuWUNGTGMNCi1EbmJrS3ZiZEtlZWhCYVJWDQotRG9ES2p2YmRNU1hNelVweg0KLUVPY0tqdmJkUmtaR1ZHanMNCi1Eb0RMS3ZiZEZrRlNjSU11DQotRG9Damp2YmRaalRIb2dCZg0KLURuYmtLdmJkbkJpdndubXUNCi1FT2NLanZiZENUQWNUZXZyDQotRU9jS2p2YmRWdmlYdkRlSA0KLURvRExLdmJkbGlEc3B0cWENCi1FUERMS3ZiZFppcmdwR2FmDQotRVBDamp2YmRhUmZDaFVGaw0KLUVQQ2pqdmJka0NsS3FHdGcNCi1Eb0NqanZiZEtReWVPZk9GDQotRVBDa0t2YmRxdnBMYmlZcQ0KLURuYmpqdmJkQ1RCRFRmWFMNCi1Eb0NqanZiZE9FY3RJaGtFDQotRU9iamp2YmRiVkNIWGtVSQ0KLURuY0tqdmJkeG5USVhyaGMNCi1EbmJqanZiZGV6dllkaHN3DQotRVBDamp2YmREd3drc3RVTQ0KLUVQQ2tLdmJkYWFWZGVwUVgNCi1Eb0RMS3ZiZGpsYk1aZUhQDQotRG9ETEt2YmRxQWlGQVhIZA0KLUVQRExLdmJkR0xFc0NnbHUNCi1FUENqanZiZFp5RGluQ2xTDQotRVBDa0t2YmRTTFlldUdrVA0KLUVQREtqdmJkd3loR0Z3ZVMNCi1FT2NMS3ZiZGpKZklLTllTDQotRG9Damp2YmRkZU9yQ1hDag0KLURvREtqdmJka3hycXNaSFUNCi1FT2NLanZiZEdZdVZCRVlDDQotRG5jS2p2YmRIa2F6bXZxTA0KLURuYmtLdmJkWnNpSXhkU24NCi1FT2JrS3ZiZGhhbmJlWFFxDQotRU9jTEt2YmRNcFhxV05mcw0KLURuYmtLdmJkRXp0UWRrY0oNCi1FUENqanZiZERqSGpXWGpBDQotRU9jS2p2YmROUVlRdk5nVA0KLUVQQ2tLdmJkTkhDcE5QdGsNCi1Eb0NqanZiZGJzQ2tVRGpCDQotRU9ia0t2YmRPU3RXR2VVcA0KLUVPY0tqdmJkVnFuWUJkbEQNCi1Eb0NrS3ZiZHZsdkFORGVODQotRG9ES2p2YmRuUVp5V0t5Qw0KLUVPY0xLdmJka3lUUnNZZnQNCi1FT2NLanZiZG5WVXlqaXFmDQotRVBDamp2YmRYblJBWHR1dA0KLUVQREtqdmJkZFp4cFh4cGINCi1FUERMS3ZiZGZIanZTT1FnDQotRG5jS2p2YmRYc01CTlRueA0KLURuY0tqdmJkRUFSaU16WFgNCi1FUENqanZiZE9TdFZnRXVRDQotRG5iamp2YmRIRUxXS0NLSw0KLUVPY0xLdmJkZWhMV1NPUWcNCi1EbmNMS3ZiZFlrcWN0T0xtDQotRG9ETEt2YmR4c09KTXFiSA0KLURvQ2pqdmJkekd5TUFORlgNCi1Eb0NqanZiZFNDRUVsSlpMDQotRG9ES2p2YmRSa1lldUhMVA0KLUVPY0tqdmJkWHNMYU1zbngNCi1EbmJqanZiZGVQRlNrVVVTDQotRG5jS2p2YmRHWlV1QWRYYg0KLUVPY0xLdmJkbFpTcXNaR3QNCi1EbmNLanZiZGlDUENkd1JSDQotRU9iamp2YmRqdlhPRUJ4WA0KLUVQRExLdmJkUlhPRURNSGMNCi1FUENrS3ZiZFppc0lRSENHDQotRVBES2p2YmRqS0dJS05ZUw0KLURuY0xLdmJkV1dpWVZkRWcNCi1EbmJqanZiZGFNa0JydU5IDQotRU9jTEt2YmRPRkVUaGlLZA0KLURvQ2tLdmJkVlpIc3pMUE8NCi1Eb0RLanZiZGlISmNZdkp1DQotRVBDa0t2YmR3dU5GUlpMbg0KLUVPYmtLdmJkSnFaZG9HTmUNCi1FT2NLanZiZGRuZHNMVVVTDQotRU9jTEt2YmRCcmFDdEdXcg0KLURuY0xLdmJkeHJuSk5SYkgNCi1Eb0RMS3ZiZENXemNpRlB2DQotRVBDa0t2YmR0bFh2YVVBdw0KLURvQ2pqdmJkTWZib21RVWsNCi1Eb0NqanZiZGZvYXp3RHhJDQotRG9Da0t2YmRhdUNIWGtVSQ0KLURuYmpqdmJkYW9nSEVMemQNCi1FUENqanZiZFR1bFBpc2FSDQotRVBDa0t2YmRPU3N2SEV0cA0KLURvRExLdmJkVGt1b0JWbmkNCi1FUERLanZiZFZCQnFUUlNaDQotRG5iamp2YmRFSmdpdllLQQ0KLURuY0tqdmJkSlh0QmdrcVENCi1EbmJrS3ZiZGJzQ2pzZEphDQotRVBDamp2YmRobEVjblVieQ0KLUVPYmpqdmJkc3NTU3laZGMNCi1FT2JrS3ZiZGhnS0N5V0p1DQotRU9ia0t2YmRkZU9xYldjSw0KLURvQ2tLdmJkcXZwTGNKWXENCi1FUERLanZiZHhaZ2VmWGVTDQotRU9jTEt2YmRrVndPRUJ3dw0KLUVQREtqdmJkZW1GdmZsakwNCi1FUENqanZiZEZrRXJjSU11DQotRU9jS2p2YmRaeUVLTmNNUw0KLUVQREtqdmJkcWx6SnhsSGkNCi1FUENqanZiZG1iSndYbm11DQotRU9jTEt2YmRjVERMVGNpYQ0KLURvQ2tLdmJkeXpkbXFoSkkNCi1EbmJqanZiZEdkTFdLQmlqDQotRG9ES2p2YmR1YUR4c1BFaA0KLURvREtqdmJkWnNoaHhkVE8NCi1EbmNLanZiZHB0VUdxckt0DQotRVBDamp2YmRKdlZGY2VHaQ0KLUVPY0tqdmJkZGRvUmF3REsNCi1Eb0NrS3ZiZGZNZlhITWlrDQotRU9iamp2YmRWQWJSU3BxeQ0KLUVPYmtLdmJkZFp5UHhZcGINCi1EbmJrS3ZiZFZZZ3N6S25uDQotRG9Da0t2YmRaTVJkVU5rbQ0KLUVPYmpqdmJkVHZNUGl0QlINCi1FT2JrS3ZiZEl4VGFnbFFwDQotRU9ia0t2YmRHR0tTTmlVUg0KLURvQ2tLdmJkR0JPcHlKem0NCi1FUENqanZiZHFyVWptamFODQotRG5jS2p2YmRJTUJ6bXZwaw0KLUVQQ2pqdmJkY3l4b3hZcGINCi1FT2NLanZiZG1JY3NxVXJCDQotRG9Da0t2YmRxdm9sQ2h5Ug0KLUVQQ2pqdmJka0hnTUdHT0wNCi1FUERMS3ZiZHBhSWVBV2dkDQotRG5jTEt2YmRxdm9rY0l4cQ0KLUVPY0tqdmJkWnNpSlljcm4NCi1FT2JrS3ZiZHlZSktCcFprDQotRG9Da0t2YmRLREtEUWljWQ0KLUVPYmtLdmJkbGhkVHB0cWENCi1FT2JrS3ZiZHlYaGpCcFprDQotRU9ia0t2YmRLTkFFWmZ0YQ0KLUVPY0xLdmJkUnlpaFRDdkENCi1EbmNMS3ZiZHRjQ3R3Vm5vDQotRG5iamp2YmRWWklUeWtPbg0KLURvQ2pqdmJkSlN5QXJsd2wNCi1FUERLanZiZER4WUx0VVVNDQotRVBES2p2YmR2bHZBTkVGTg0KLURvREtqdmJkcnlrcFRBZ24NCi1EbmJqanZiZGVZWnRVU0Z6DQotRG9ES2p2YmR6alZRUUVUVQ0KLUVPYmpqdmJkaUhKYnlWalYNCi1Eb0NqanZiZGNTY0xUY2pCDQotRG5jTEt2YmRoYW9ERXdRcQ0KLURuYmtLdmJkUWx3YlpOdHoNCi1FUENqanZiZEVBUmlNelhYDQotRVBDamp2YmRHRmpTT0lzcQ0KLURvREtqdmJkclhQbENoeHENCi1Eb0RMS3ZiZFlxTWVJbUVxDQotRG9ES2p2YmRPRkVUaUpLZA0KLUVQQ2pqdmJkQ1RCRFVGdnINCi1Eb0NrS3ZiZFpvT0lkZVpqDQotRG5jTEt2YmRIZ0haeVlYZw0KLUVPY0xLdmJkQ1NhQ3NldnINCi1Eb0NqanZiZHNRV09qQ3VmDQotRG9ES2p2YmRLV1VmRGVHaQ0KLUVPY0tqdmJkeml0cFBjcnQNCi1FUERLanZiZFp5RGltY01TDQotRVBDamp2YmRCY3BBdWlsZg0KLUVPY0tqdmJkcXdRTUNpWXENCi1FT2NMS3ZiZHNyclRaWmRjDQotRU9iamp2YmRTUVVIS0dFWA0KLURvRExLdmJkY3l4b3haUkMNCi1FT2JrS3ZiZFdYSllXRUZIDQotRG5ia0t2YmRoZ0tEWXVpdQ0KLURvREtqdmJkclNWTE9LYU4NCi1FUENqanZiZE1veFF1bWdUDQotRVBES2p2YmRjYlRNckFUbQ0KLUVQREtqdmJkem5vcGRjTVkNCi1EbmJqanZiZHpkek96ZHlwDQotRU9iamp2YmRHWXVWQkVYYg0KLUVQREtqdmJkaVp0ZWtwbkcNCi1Eb0RMS3ZiZHZ2bEF1YVZ1DQotRG9ES2p2YmRFWVhrc3RUbA0KLUVQQ2pqdmJkYXVDSFlLc2gNCi1Eb0NqanZiZERqSUp1d2pBDQotRU9iamp2YmRrTkNMekZHbw0KLUVQRExLdmJkaUdpY1pXS1YNCi1FUENrS3ZiZHRsWHZhVGFYDQotRG9Da0t2YmRweU9nZ1FjeA0KLUVPYmpqdmJkdFRTU3laZGMNCi1Eb0RMS3ZiZGladGVsUk9HDQotRU9jTEt2YmRXUm5ZQ0ZNRA0KLUVQRExLdmJkTmRkVUloamQNCi1EbmNMS3ZiZEVPYmpqdmJkDQotRVBETEt2YmRWVU5UZWxWag0KLUVQQ2pqdmJkVmhYdllHeHoNCi1Eb0NrS3ZiZGZSYVd6a2JvDQotRG9Damp2YmRSanlHVkhLcw0KLURvQ2pqdmJkU0t4ZlVma1QNCi1FT2NLanZiZGFSZWNJVGVrDQotRG9Da0t2YmRFSmhLVndqQQ0KLURvRExLdmJkd1hMYVdCVnUNCi1FUERMS3ZiZExZcUpyenRmDQotRG5jS2p2YmRVTVZvQXVvSg0KLURuYmpqdmJkdm1XQU1jZG0NCi1FT2JqanZiZHBzc2Zxckt0DQotRG5iamp2YmRobEVjblZEWg0KLUVPY0tqdmJkTnNVV0dlVlENCi1FT2JqanZiZFZVTlRla3VqDQotRG5ia0t2YmRWWWdzeWtPbg0KLUVPYmtLdmJkcHNzZ1NSanQNCi1EbmNLanZiZFZaSVR6TE9uDQotRG9ES2p2YmRHR0pyTmlUcQ0KLURvRExLdmJkQUNxd2l6SlENCi1Eb0RLanZiZElyeUFybVhsDQotRG9Da0t2YmRaTVJkVG1sTg0KLURuYmtLdmJkcm92UEtEVmYNCi1FT2JrS3ZiZHJvdW5qRFdHDQotRG5iamp2YmRDU2FEVGV2cg0KLURuYmpqdmJkVXlJVHlqbm4NCi1EbmJrS3ZiZEtSWmVPZk9GDQotRG9Da0t2YmREaWdpdXhLQQ0KLUVPY0tqdmJkeHNOaGxyQ0gNCi1FT2NMS3ZiZERqSGl1eEtBDQotRG5jS2p2YmRYbXFBWHR2VQ0KLURuYmpqdmJkcUZkRlR2QWgNCi1FT2JrS3ZiZHhybWhtU0JnDQotRG9Damp2YmRJaWRBS1BmZA0KLUVPY0tqdmJkS1F5ZG9HT0YNCi1EbmJqanZiZGxxeVV6U2RKDQotRVBES2p2YmR0dk9ZS1FzQQ0KLUVQQ2tLdmJkY0lsakxGdngNCi1Eb0NqanZiZFlxTkVobGRxDQotRVBES2p2YmRjellwWVpSQw0KLURvRExLdmJkaUJvQ2VYUXENCi1FT2NMS3ZiZGlDUERGWFJSDQotRVBETEt2YmRaaXNIb2ZhZg0KLUVQREtqdmJkbUlkVVJWU0INCi1FUERLanZiZFpSTkZJbGRxDQotRG9ES2p2YmRKcHlkb0ZtZQ0KLURvRExLdmJkV1dod3VkRWcNCi1EbmNMS3ZiZERuYmpqd0RFDQotRG5jS2p2YmRxVHNmcXFrVQ0KLURuY0tqdmJkS0RLRFJLRFkNCi1Eb0RLanZiZFR1bFFKc2FSDQotRG9Damp2YmRTQmRGTUl5TA0KLURuY0xLdmJkcVR0SFNTS3QNCi1FT2NLanZiZEJjb2FWak1mDQotRU9iamp2YmRpaWVoS05Ycg0KLUVPYmpqdmJkQ1d6Y2lGUVcNCi1FUERMS3ZiZFdTTndhZGxEDQotRVBES2p2YmRLVnVHRUZISg0KLURvQ2tLdmJkWk1SZFVObE4NCi1FUERLanZiZFpSTWRpTWRxDQotRVBDa0t2YmR4VW1FcHlNTw0KLURvRExLdmJkUmtZZlZIS3MNCi1FT2JqanZiZEl3dENJTVFwDQotRVBES2p2YmRtSkRzcVVxYQ0KLUVQREtqdmJkckRlSlBtdkINCi1FT2NLanZiZFR2TVBpc2FSDQotRG5jS2p2YmRNdHNSam1BWA0KLURuYmpqdmJkbHF5VXlzRGkNCi1FUERLanZiZFF3TmRDbElEDQotRG5jTEt2YmRSanhmVkdqcw0KLUVPYmtLdmJkYXVCZnhLdEkNCi1Eb0RMS3ZiZGladGZMcG5HDQotRG9ES2p2YmRoYW5jRlhSUg0KLURvREtqdmJkUkVEQlFRZFMNCi1FT2JqanZiZHJ6TVFUQklPDQotRU9jS2p2YmRjSW1LS2ZYWQ0KLURvRExLdmJkaWpHSUtOWHINCi1EbmNMS3ZiZGdHTVptZmdBDQotRVBDamp2YmRabm1oZUZaag0KLUVQREtqdmJkbXVWWmppcWYNCi1FT2JqanZiZGVGUFJhd0RLDQotRVBETEt2YmRyTlppeUxoSg0KLUVPY0tqdmJkbGhkVVJVckINCi1FUERMS3ZiZEdHSnJOaHRSDQotRU9jS2p2YmRpR2lieVdLVg0KLUVPY0tqdmJkUWx3YlpOdHoNCi1EbmNMS3ZiZG5WVXpLaXFmDQotRU9jS2p2YmRic0RLc2NqQg0KLUVQRExLdmJkRG5iamp2Y0UNCi1Eb0NrS3ZiZHlTbWhtUmFnDQotRG5jS2p2YmRreVRTVFlmdA0KLURvRExLdmJkRVlYa3N0VU0NCi1FT2NLanZiZGlISmJ5VmpWDQotRU9jS2p2YmRzUVZuaWNXRw0KLURvQ2tLdmJkb3puRGtZUEENCi1FT2JrS3ZiZFVSUW9WVkhtDQotRVBETEt2YmRGZktTTmlUcQ0KLURuYmpqdmJkVmd4VndnWXoNCi1EbmJrS3ZiZG1mZVlOT0haDQotRG9ES2p2YmR5cVBOSWl3QQ0KLUVPYmpqdmJkRlZ5UVBsaWUNCi1FT2NMS3ZiZEdkS3ZLQmlqDQotRVBDamp2YmREd3hNVVR0TQ0KLURvQ2tLdmJkS1Z0ZkVFZmkNCi1Eb0NrS3ZiZGRqS1J2VXpuDQotRU9ia0t2YmRsaUVVUlZTQg0KLUVQRExLdmJkV1NOd2FlTUQNCi1FT2NMS3ZiZEpxWmRvRm5GDQotRG5iamp2YmRLeHFKcnp1Rw0KLURuYmpqdmJkbXVVeWpqU0cNCi1FUERMS3ZiZEFEUnhLWmhwDQotRVBDa0t2YmRpQ1BERXdSUg0KLUVPYmpqdmJkVFhrTU56a1kNCi1EbmJqanZiZE1nRFBsb3VMDQotRVBDamp2YmR5emVOcWdoaA0KLUVPY0tqdmJkbXVVeWpqU0cNCi1FUERLanZiZERvRExLdmNFDQotRVBETEt2YmROeFBWemROdA0KLURvREtqdmJkQmhqYktoZksNCi1EbmJqanZiZFpMckVUbWxODQotRG9Da0t2YmRIZmZ5eHd3Zw0KLUVPY0tqdmJkWVNsQW1VUFkNCi1FUENqanZiZHRUU1RZekZEDQotRG9Damp2YmRGamVUQ2dtVg0KLUVPYmpqdmJkTndudXpjblUNCi1Eb0RMS3ZiZFNQc2ZpZWN3DQotRG9ES2p2YmRLVnRlZEZHaQ0KLUVPYmpqdmJkVWFDUXNSUnkNCi1FT2JrS3ZiZGJzRExVRGpCDQotRU9ia0t2YmRFT2NLanZjRQ0KLUVQQ2pqdmJkeU5zSVlTaGMNCi1FT2NMS3ZiZGJWQ0d4S3NoDQotRG9ES2p2YmRsWlNxc1lmdA0KLURvQ2pqdmJkVXNsc2VsV0sNCi1EbmNMS3ZiZGJVYkhYa1VJDQotRG5ia0t2YmRZa3Fjc21rbQ0KLURuY0tqdmJkWHNNQW1VT3gNCi1Eb0RLanZiZEp1dUZjZGdKDQotRU9jTEt2YmRHTEZUQ2hOVg0KLURvQ2tLdmJkYWFXRWZRUVgNCi1EbmNLanZiZFZxblhiRk1EDQotRU9jS2p2YmRaeUVKbkNsUw0KLURvQ2tLdmJkTmRjdEpJamQNCi1Eb0RMS3ZiZG1haXdZT211DQotRVBDa0t2YmRtYkp2eFBPVg0KLURuY0xLdmJkVHFSUFV1SU4NCi1FUERMS3ZiZEdHS1NOaVVSDQotRVBDamp2YmRJd3RDSU1RcA0KLUVPY0tqdmJkSERqdkphaksNCi1FT2NMS3ZiZFp5RUpuRE1TDQotRG5ia0t2YmRyV3BNREpaUg0KLUVPY0xLdmJkYlVhZ1hqdEkNCi1FT2NMS3ZiZExHRmdiQlJWDQotRU9jS2p2YmRxdnBNREl4cQ0KLUVQREtqdmJkT0FKU3NqU0ENCi1EbmNLanZiZHNycXNZeWVEDQotRG5iamp2YmR0a3d2YVVCWA0KLURuYmpqdmJkR1FBU3dHZloNCi1FT2JrS3ZiZFVSUk90dUlODQotRU9ia0t2YmRpVXlkd1J0Yg0KLUVPY0xLdmJkcWx5aXhraEoNCi1FUENrS3ZiZHVhRVlyb0ZJDQotRG9Da0t2YmRuVXR5amlxZg0KLURvQ2tLdmJkc3NTVFl6RkQNCi1EbmNMS3ZiZGVBVHFNd2pHDQotRG5ia0t2YmRxbHlqWWxIaQ0KLURuY0xLdmJkVEFFaGhDT2QNCi1FT2NMS3ZiZHB4b0lIUWRZDQotRVBES2p2YmRFWHhMc3N0TQ0KLURuY0xLdmJkYkxMZlBOY0ENCi1Eb0RMS3ZiZENXemRJZVFXDQotRG5iamp2YmRXU053YkVsRA0KLURvREtqdmJkR0ZqU09KVVINCi1Eb0NqanZiZG10dHpLalJmDQotRVBDamp2YmRxbVpqWk1IaQ0KLURuY0xLdmJkZHd6VVRxZXoNCi1FT2JrS3ZiZHJFRklwT1ZhDQotRG5iamp2YmR1TVlXYVRhWA0KLUVQREtqdmJkVEFFaUlCb0UNCi1FT2NLanZiZFZyTndhZU1EDQotRG9Damp2YmRTd2tNTnpqeA0KLURvREtqdmJkWm9OaGVFeWoNCi1FT2JqanZiZEZwQVN2Z0daDQotRG5ia0t2YmR2QkR4c1BFaA0KLURvREtqdmJkSUhHell4WUgNCi1FT2NMS3ZiZGhhbmJlWFFxDQotRU9ia0t2YmRBQ3F4SnlocA0KLURvRExLdmJkZ1FCendEeEkNCi1FT2JqanZiZE9ZT3V6ZE50DQotRG5iamp2YmRSV21kRE1IYw0KLUVQQ2tLdmJkZVBGVExVVVMNCi1EbmJrS3ZiZEhsQnpuV3BrDQotRVBDa0t2YmRxbHlpeGxJSg0KLURuYmpqdmJkSUhIWnlZWGcNCi1FT2JqanZiZEJjb2FWaW1HDQotRU9jTEt2YmRabm5JZGR6Sw0KLURuYmpqdmJkQmlMQmpoZksNCi1FUERMS3ZiZGVPZVRLdFRyDQotRU9ia0t2YmRZbFJjc25MbQ0KLURvREtqdmJkbkhFeE5PR3kNCi1Eb0NrS3ZiZG5DSndYb051DQotRU9jS2p2YmR3V2xCV0JXVg0KLURuYmpqdmJkR1l1VkFkWGINCi1FT2JrS3ZiZExHR0hiQlF1DQotRVBDa0t2YmRFSmdqVnhLQQ0KLUVPYmtLdmJkbHF5VlpyZEoNCi1FT2JrS3ZiZGFOTEJzVW1IDQotRVBDa0t2YmRHUUFTd0hHWg0KLURuY0xLdmJkbkJqV3dublYNCi1EbmJqanZiZFVzbHNla3VqDQotRG5jTEt2YmRlQVRxTllKZg0KLUVPY0xLdmJkSXd0Q0hsUXANCi1FT2NMS3ZiZEdMRXJjSU11DQotRG5ia0t2YmRqdlhPRUNYdw0KLUVQQ2tLdmJkZlNBdnprYm8NCi1EbmJqanZiZHNDR05NSEt5DQotRG9ETEt2YmRVUlFudVZIbQ0KLUVPYmpqdmJkUXZtZENrZ2MNCi1FUENqanZiZFNQc2dLRmN3DQotRVBETEt2YmRZcG1FaGxlUg0KLUVQQ2pqdmJkRmpkc0RIbHUNCi1FUERMS3ZiZHFkRklwT1dCDQotRU9iamp2YmRuUVp5VmtaQw0KLUVQQ2pqdmJkUWRDYVFSRVMNCi1EbmJqanZiZEFEUndpeWlRDQotRG5iamp2YmRpaWVoS05ZUw0KLURvQ2tLdmJkSGthem5XcUwNCi1FT2JqanZiZG1veXh1anhiDQotRU9jTEt2YmR4eElpYlFaaw0KLUVPYmpqdmJkc1B1b0tDdkcNCi1FT2JqanZiZGpjTUtwZnRnDQotRU9jS2p2YmRaaXNIb2ZiRw0KLURuY0xLdmJkVUd6bkx3V0YNCi1Eb0RMS3ZiZEZmSnFuSlVSDQotRG5iamp2YmRzQmVsa2dMWg0KLURvQ2tLdmJkcmJHTkxma1oNCi1EbmNLanZiZGVZWnNzcWV6DQotRVBDa0t2YmR5TnNId3NJYw0KLURuYmtLdmJkcmFmTWtmankNCi1FUENqanZiZFp5RUpuRE1TDQotRG5iamp2YmRGcEFTd0dleQ0KLURuYmtLdmJkTEdHSUJhUXUNCi1EbmNMS3ZiZGRpaXF1dHpuDQotRG5jS2p2YmRXSVh1d2Z4eg0KLURvQ2pqdmJkTlB4UlZuSFQNCi1EbmNLanZiZHd5Z2VmWGVTDQotRVBETEt2YmRtSkVVUXRyQg0KLUVQQ2pqdmJkUXdPRUNraEQNCi1Eb0RMS3ZiZE5HYnBNb3RrDQotRG5jTEt2YmRSeWpJU2NXQQ0KLURuY0xLdmJkVnJPWGFlTUQNCi1EbmNMS3ZiZFFtWUJ4blV6DQotRG5iamp2YmRWQkNSU3FTWg0KLUVQQ2tLdmJkUm9zZmlmRVgNCi1FUERMS3ZiZGxZcnFyeGdVDQotRVBETEt2YmRLVnVHRGVISg0KLURuY0xLdmJkRG5jTExXY0UNCi1FT2NMS3ZiZGZOR1hHbUtMDQotRU9jTEt2YmRRdm1kRE1IYw0KLUVPY0xLdmJkRUFSaU15dncNCi1Eb0NqanZiZG5IRlhsbkd5DQotRU9jS2p2YmRodHllWFJ0Yg0KLURuY0tqdmJkTWdEUU5RVkwNCi1FT2JqanZiZHBlZEZVV0JJDQotRVBES2p2YmRrSGZrZkZuTA0KLURvREtqdmJkclhRTUNoeVINCi1FT2JrS3ZiZFJFREFvcUVTDQotRG9ES2p2YmRCZFFBdktNZg0KLURvQ2tLdmJkanZXbkRheFgNCi1EbmJrS3ZiZGVQRXNLc3RTDQotRVBES2p2YmR5T1RId3NKRA0KLURuYmtLdmJkclNWS25LYU4NCi1FUENrS3ZiZFppcmdwSEJmDQotRG9Da0t2YmRzUVZuakRWZg0KLURuYmpqdmJkR0xFc0NnbVYNCi1FUERMS3ZiZGVsZXdITWpMDQotRU9iamp2YmRqbGJNWmVHbw0KLURvRExLdmJkeHJtaGxyQ0gNCi1Eb0NrS3ZiZGN6WlFYeVFiDQotRU9iamp2YmRSRGNCUVJEcg0KLURvQ2pqdmJkeExYRUh6eWYNCi1Eb0NrS3ZiZGt5U3JUWkd0DQotRG9Damp2YmREb0RLandDZA0KLUVPYmtLdmJkS1dWR0VFZmkNCi1Eb0RLanZiZFRxUW9VdUlODQotRU9iamp2YmRaUk5FaU1lUg0KLURvREtqdmJkeFVtRXB5TU8NCi1FUERMS3ZiZHh4Skphb3pMDQotRU9ia0t2YmRyYWVtTGZrWg0KLUVQQ2pqdmJkYmlOS0xGdngNCi1EbmJqanZiZFpqU2dwSENHDQotRU9iamp2YmRxQkllQVhIZA0KLUVPYmpqdmJkVlVOVUdNV0sNCi1FUERLanZiZGxpRHNxVXFhDQotRU9jTEt2YmR4WmdmR1lGUw0KLURuYmpqdmJkWXBtRkpNZHENCi1FUENrS3ZiZGNUQ2p0RUtCDQotRG5jTEt2YmRWVU10RmxWag0KLUVQREtqdmJkY0lsaWpldngNCi1Eb0NqanZiZHBzdEhTU0t0DQotRU9jS2p2YmRMQWpnTWF4Ug0KLURvREtqdmJkSGthem5YUWsNCi1FUERMS3ZiZHJvdlBKY1ZmDQotRU9iamp2YmRqYmxMUkhWSA0KLUVQQ2tLdmJkZlNBdnpsQ28NCi1FUERMS3ZiZGtIZmtlZk9MDQotRG9Damp2YmRiaU5LS2ZYWQ0KLUVQRExLdmJkakpmSGlsd3INCi1FT2NLanZiZHhWTWVReGtuDQotRG5jS2p2YmRxbHpKeU1JSg0KLURvRExLdmJkZmZNWm5HZ0ENCi1FUERMS3ZiZHJwV1BKY1ZmDQotRG5ia0t2YmROc1R2R2VWUQ0KLURuY0tqdmJkWnNoaVpFVE8NCi1Eb0NqanZiZFdSblhhZUxjDQotRVBETEt2YmRVYUNSVFFxeQ0KLUVPY0tqdmJkS0RLRFFqQ3gNCi1FUENrS3ZiZExLYUlXQUp5DQotRG9ES2p2YmRqYmxLcGZ0Zw0KLUVQREtqdmJkZkhrV1NOcUgNCi1FT2JqanZiZFNDRUVraVpMDQotRVBES2p2YmRjeXhwWVpRYg0KLUVQRExLdmJkVlVNdEZrdWoNCi1EbmJqanZiZFZCQ1FycHJaDQotRU9iamp2YmRkb0VzTFVVUw0KLURuYmtLdmJkaUhLRFpWalYNCi1FT2NLanZiZHB5UEhnUkR4DQotRU9iamp2YmRZcGxlSk5GUg0KLURuY0xLdmJkckRkaHBPV0INCi1EbmNMS3ZiZGNiU21TQVVODQotRG5jTEt2YmRRd09EY0xnYw0KLUVQQ2pqdmJkS1Z1RmNkZ0oNCi1FUERMS3ZiZEp2VWVjZGZpDQotRU9ia0t2YmRkakpxdlV6bg0KLUVQQ2tLdmJkTHJYTlp1UXoNCi1EbmJrS3ZiZERpaEp1eEtBDQotRG9Damp2YmRlZ2tXU09SSA0KLURuY0tqdmJkRnlWVWFFWUMNCi1Eb0RMS3ZiZE5IRFBscFZMDQotRG9ETEt2YmRkbmVUS3RVUw0KLURvQ2pqdmJkRUFSaGx5d1gNCi1EbmNLanZiZG1iSndZUE9WDQotRG5iamp2YmRkZU9yQnZiag0KLUVQREtqdmJkQU1oWlRYWngNCi1EbmJqanZiZFVMdW9CVm9KDQotRG9Da0t2YmRNZmJvbVFWTA0KLUVPYmpqdmJkeVROaGxxYkgNCi1FUERMS3ZiZGN5eG93eHBiDQotRG9Da0t2YmRFUERMTFhDZA0KLURuY0xLdmJkU0NFRkxpWkwNCi1EbmJqanZiZEJpTENLaUZqDQotRVBDamp2YmRtZ0V4Tk5nWg0KLUVPY0xLdmJkc1B2UEtEVmYNCi1Eb0NrS3ZiZGJLa2ZPbWNBDQotRG5jTEt2YmRJeFRhZ2xSUQ0KLURuYmtLdmJkRlZ5UVFOSmUNCi1FUERMS3ZiZGJzQ2p0RUtCDQotRVBES2p2YmRha01Gbm5EQQ0KLUVPYmpqdmJkV1dpWVZjZGcNCi1EbmJrS3ZiZGZTQXZ6a2NQDQotRU9jTEt2YmRiS2tlbm5EQQ0KLUVQQ2pqdmJkVHBwb1ZVaE4NCi1FUERMS3ZiZGVtR1dnTWpMDQotRG5iamp2YmRKdlVlZEZISg0KLURvRExLdmJkcXZva2JpWlINCi1FUENqanZiZFpNUmN0T01ODQotRG9Damp2YmROUHdwdW5Hcw0KLURvQ2tLdmJkWnRKSXlEcm4NCi1FUENqanZiZEZlalJuSXNxDQotRVBETEt2YmRac2hoeGRUTw0KLURuY0xLdmJkeFpoR0dYZVMNCi1Eb0RMS3ZiZEt5UktTenRmDQotRVBES2p2YmRDZmxGZ0F6Yw0KLUVQREtqdmJkT0VkVGhpS2QNCi1Eb0RMS3ZiZFRBRklnYW9FDQotRU9iamp2YmRFQVJpTlp2dw0KLUVPY0xLdmJkamhITGVmT0wNCi1EbmNLanZiZGJWQ0hYanRJDQotRVBES2p2YmRlRlBSYXdDag0KLURvRExLdmJkdGNDdVd1b1ANCi1Eb0RMS3ZiZFVWa3BKdEFxDQotRVBDamp2YmRhU0ZjSHNmTA0KLUVQREtqdmJkUHhtQUdycksNCi1FUENrS3ZiZERqSGpXWGpBDQotRG5ia0t2YmRwc3NmcXJLdA0KLURvREtqdmJkZVBFc0t0VHINCi1FT2JrS3ZiZER3eE1VVHRNDQotRG5ia0t2YmRaUk1kaU5FcQ0KLUVQQ2pqdmJkaHVaZHZxdUMNCi1Eb0NqanZiZEdMRXNDaE11DQotRVBES2p2YmRSRGJhUVFkUw0KLUVPY0tqdmJkRUpoSnZZS0ENCi1EbmNLanZiZGt4c1NTeGZ0DQotRU9iamp2YmRLUlpkbmZPRg0KLUVPY0xLdmJkWlFtRklsZVINCi1EbmJrS3ZiZGpjTGpwZnVIDQotRG5ia0t2YmRZemJmU0tXWg0KLUVQRExLdmJkYlVhZnhMVGgNCi1FUENqanZiZEp1dUZjZGdKDQotRG9Da0t2YmRKY0tDcUpjWQ0KLURvQ2pqdmJkU0t5R1ZHa1QNCi1Eb0NqanZiZGVtRnZmbGlrDQotRG9Damp2YmR2QkVZc1BFaA0KLUVPY0tqdmJkQ1d6ZEpFb3YNCi1EbmNMS3ZiZHFUc2dTU0t0DQotRG5ia0t2YmRVTVZvQldPaQ0KLUVQQ2tLdmJkT0Vjc2lJamQNCi1EbmNMS3ZiZGFTRmJoVUZrDQotRG9Da0t2YmRodHpFd1J1Qw0KLURvQ2tLdmJkaUNPY0V2cVINCi1Eb0NrS3ZiZGZJTFZxblJIDQotRG5ia0t2YmRDSkxDS2hlag0KLUVQQ2tLdmJkYWtMZW9PREENCi1EbmJrS3ZiZFVhQ1JUUXJaDQotRG9ES2p2YmRSYWNka2h5TA0KLUVQQ2pqdmJkWU5xQVh0dXQNCi1EbmNLanZiZHd6SGZGd2RyDQotRG5jTEt2YmROcnN2R2VVcA0KLUVQREtqdmJkRG9Da0t2YmQNCi1FUENqanZiZHJhZk5MZmtaDQotRU9iamp2YmRtYWpYWG9PVg0KLURuY0xLdmJkVkFiUlRRcloNCi1FT2JrS3ZiZGt5U3JUWkhVDQotRG9ES2p2YmRaZVhmemdoYg0KLUVQRExLdmJkaUNPY0ZXcHENCi1FT2NLanZiZFVRcG51VWhODQotRG5jTEt2YmRpakdJS013cg0KLURuY0tqdmJkSGdIWnh3d2cNCi1EbmNMS3ZiZFZUbVVGbFdLDQotRG9ES2p2YmRlWVp0VVNGeg0KLUVQREtqdmJkSGZmeXlZWGcNCi1EbmNLanZiZFhzTGFNdE94DQotRG5jS2p2YmR6aXRvb2NydA0KLURvREtqdmJkaHR5ZVdxdUMNCi1FUERLanZiZEV1eVBwTktGDQotRG5ia0t2YmR0dk9ZS1JUQQ0KLURuY0tqdmJkWm5uSkZFeksNCi1FUENrS3ZiZHFaUElHcGN4DQotRG5ia0t2YmRWZ3hXWUd4eg0KLUVQQ2pqdmJkT1N0V0hFdVENCi1FT2JrS3ZiZE5kZFRpSWpkDQotRG9ES2p2YmR3WE1CV0F1dQ0KLUVQRExLdmJkc1B2UEtEVmYNCi1EbmNMS3ZiZFF2bkRia2hEDQotRG5jS2p2YmRFS0hqV1lLQQ0KLUVQQ2tLdmJkQ2dNRmdBemMNCi1FT2NMS3ZiZFF2bkRia2djDQotRVBDamp2YmREb0NrTFdiZA0KLURuYmtLdmJkS0NpYnBpY1kNCi1FT2NMS3ZiZGhmaWJ5Vml1DQotRU9jTEt2YmR6UW5saUp3QQ0KLURuY0tqdmJkRUFTSW1ad1gNCi1FUERMS3ZiZEZrRlRDaE5WDQotRG5iamp2YmRFdXhvb21LRg0KLUVPY0tqdmJkWXFNZUpNZVINCi1EbmJqanZiZGdRQnp2ZFlJDQotRG9Damp2YmRreHJyU3hmdA0KLURuYmpqdmJkanV3TmRDWVgNCi1FT2NMS3ZiZGZwQnp3RVhoDQotRG9Da0t2YmRuSEZZTW1nWg0KLUVPY0tqdmJkamxiTVplSFANCi1Eb0NrS3ZiZG10dHpLalNHDQotRVBETEt2YmR6alVvcERzVQ0KLUVQRExLdmJkc1psUHJhSU8NCi1FT2NMS3ZiZExCTEhNYllSDQotRVBETEt2YmR0YmNWWFZubw0KLURvRExLdmJkYWFWZUdRUVgNCi1FUENqanZiZFdTT1lDRWtjDQotRU9iamp2YmR4VW1GUXlNTw0KLURvRExLdmJkUmJEZGtpWkwNCi1Eb0NqanZiZGhsRkRuVkN5DQotRVBES2p2YmRjVERLc2NpYQ0KLUVQQ2tLdmJkamxiTVplR28NCi1EbmNMS3ZiZENJa0NLaUdLDQotRG9Damp2YmRyYkZtTUdrWg0KLUVPYmtLdmJkUWNjQW9xRHINCi1EbmJqanZiZFRxUlBWVWdtDQotRVBDa0t2YmROcnN1ZmVVcA0KLUVPY0xLdmJkck15alpMaEoNCi1FUERMS3ZiZGlpZkhpbVhyDQotRG5ia0t2YmRwc3RIU1JqdA0KLUVPY0tqdmJkWnRJaHhkU24NCi1EbmJrS3ZiZGJobUtMR1hZDQotRG5ia0t2YmRreHNTU3hmdA0KLURvQ2pqdmJkVEFGSWhCbmQNCi1FT2JrS3ZiZFV0TXRHTHZLDQotRVBDamp2YmRwc3RHclNMVQ0KLURuY0tqdmJkeExYRGd6eWYNCi1FT2NLanZiZFNDRGRsSXhrDQotRU9ia0t2YmRPRkVVSWlMRQ0KLURuYmtLdmJkamdnTGVmTmsNCi1EbmNLanZiZGxpRVVRdHFhDQotRU9jTEt2YmRGamRzREhsdQ0KLURuY0xLdmJkZUVucWF2Y0sNCi1FT2NMS3ZiZG5QeXlWanlDDQotRG9ES2p2YmRsaURzcHRyQg0KLURvQ2tLdmJkclhRTGJpWlINCi1EbmNMS3ZiZEZrRXJiaE5WDQotRG9ES2p2YmRUcVJPdHRoTg0KLURvQ2tLdmJkWVNsQW1VT3gNCi1EbmJrS3ZiZEtWdUdEZGdKDQotRU9jS2p2YmR2d0xhV0F2Vg0KLURvRExLdmJkRU9iamp2YmQNCi1EbmJrS3ZiZHdYTGFXQlZ1DQotRG5ia0t2YmRtdHVaamlxZg0KLURvREtqdmJkZWdrV1JuUkgNCi1Eb0NrS3ZiZGVYelVVU0Z6DQotRG5jTEt2YmRmTkdYR21Kaw0KLURvQ2pqdmJkRXp0UWRsQ2kNCi1FUENrS3ZiZEV1eVFQbGpGDQotRVBDamp2YmRyRUVpUU52Qg0KLURuYmtLdmJkTHF3Tlp0cHoNCi1FT2JrS3ZiZEtlZWdiQlF1DQotRU9ia0t2YmR2QkVaU29GSQ0KLURvRExLdmJkclhRTGJoeVINCi1EbmJrS3ZiZGJLbEdQT0RBDQotRG5jTEt2YmRuQ0tYWU9uVg0KLUVPY0tqdmJkamNNS3BmdUgNCi1Eb0NrS3ZiZFFkQ2FRUkVTDQotRVBDa0t2YmREbmNLandDZA0KLURvRExLdmJkWWxTRHROa20NCi1FT2JrS3ZiZG1iS1hYbm11DQotRVBDa0t2YmRqZ2ZrZkdPTA0KLURuYmtLdmJkWnlEak5jTVMNCi1FT2NMS3ZiZGtOQ0x5ZUhQDQotRG5jTEt2YmRWVU10R0x1ag0KLUVPY0tqdmJkS1Z0ZWRGR2kNCi1FUENqanZiZEtSWmVPZW5GDQotRG9Damp2YmRVUXFQVXRoTg0KLUVQREtqdmJka01iTHlkZ1ANCi1FT2JqanZiZFZxbXhCZGxEDQotRVBES2p2YmRqQVFHYVBnSw0KLURvQ2tLdmJkVGxWbmFXUEoNCi1FUENqanZiZHdqdmRIenpHDQotRU9iamp2YmRCc0JDdEdXcg0KLUVQQ2pqdmJkd3VORXFaTU8NCi1EbmNMS3ZiZGJyY0t0RUtCDQotRVBDa0t2YmRGeVZWQWN4Qw0KLUVQQ2tLdmJkYVNHQ2dzZkwNCi1FUERLanZiZHJ5bFFUQklPDQotRG5jS2p2YmRmU0JXemxDbw0KLUVPYmpqdmJkZlJhV3psQ28NCi1EbmJrS3ZiZHNQdk9qRFdHDQotRVBDamp2YmRjYlNsckFVTg0KLUVPYmtLdmJkcldwTGJoeHENCi1FUENqanZiZGhnS0RaVmpWDQotRU9jS2p2YmRobEZEblVieQ0KLURvQ2tLdmJkZGRvU0J2Y0sNCi1Eb0NrS3ZiZHBzc2ZyUmtVDQotRG9ETEt2YmRKdXRmRUZHaQ0KLUVPYmtLdmJkRVBES2tXY0UNCi1FT2NLanZiZGNKTkpqZXZ4DQotRVBDamp2YmRjVERLc2NpYQ0KLURuY0tqdmJkWWxSY3NtbE4NCi1FUERMS3ZiZGtIZ01GZk5rDQotRG9Da0t2YmRqYmtqcUd1SA0KLUVQREtqdmJkVHZNUGpVQXENCi1EbmJrS3ZiZFFZbUFHc1JqDQotRVBDa0t2YmRLZWVnYkFwdQ0KLUVQREtqdmJkaUxkY210Y1oNCi1Eb0NrS3ZiZE5lRHNoaGpkDQotRU9jTEt2YmR4blNoWHNJYw0KLUVQRExLdmJkeU9TaFhyaGMNCi1FT2JrS3ZiZGJQZ0hFTHpkDQotRG9Damp2YmREb0NrS3dERQ0KLUVPY0xLdmJkbWJKdnhQT1YNCi1EbmJqanZiZGtOQmxaZUhQDQotRG5ia0t2YmRSWE5kRE1JRA0KLURuY0xLdmJkWG5SQVlVdlUNCi1FT2JrS3ZiZEJjcEF1aWxmDQotRVBES2p2YmRTTFlldUdrVA0KLURvQ2pqdmJkUmFjZUxpWWsNCi1EbmNMS3ZiZFpvTmlGRXpLDQotRU9jTEt2YmRHTEVzRElNdQ0KLURuYmpqdmJkblV1WmtKcWYNCi1Eb0NrS3ZiZGxxeVV5cmNpDQotRG9Da0t2YmRMR0dIYWFSVg0KLURuYmtLdmJkbW95eVdMWWINCi1EbmNLanZiZE1wWVJXT0dzDQotRG5iamp2YmRreVRSc1lmdA0KLUVPYmtLdmJkaktGaEptWHINCi1EbmJqanZiZHhMV2NnenpHDQotRG9Da0t2YmR4blNoWHJoYw0KLURuYmpqdmJkUmJFRWtpWkwNCi1FT2NMS3ZiZFdXaVh1ZEVnDQotRG9ETEt2YmREaklLVnhLQQ0KLURvREtqdmJkZ0Zrek5nSEENCi1FUERMS3ZiZHZ2bEF1YVZ1DQotRVBETEt2YmRhdUJmd2tUaA0KLURuY0xLdmJkbUljdFF0ckINCi1FUERLanZiZENEcEJXSm1HDQotRG9ES2p2YmR2QWN4c1BFaA0KLUVPY0tqdmJkckpBS0ZOT2UNCi1FT2NMS3ZiZGJzREtzY2lhDQotRG5jTEt2YmRBTWhZc1d6WQ0KLURuY0tqdmJkZGRuckNYREsNCi1FT2NMS3ZiZGtIZmxHR09MDQotRG9ES2p2YmRiVWFmeEtzaA0KLURuYmtLdmJkTmRjdElpTEUNCi1FT2NMS3ZiZHZCRHlUUEVoDQotRG9Damp2YmRGZWpTT0pVUg0KLURuYmtLdmJkVVFwbnR1SG0NCi1FT2JqanZiZFRwcU90dGdtDQotRG9ETEt2YmRkZG9TQ1hDag0KLURuY0xLdmJkYlZDSFhrVUkNCi1FUENqanZiZEtOQUVaZ1ZCDQotRVBES2p2YmRGamRzRElNdQ0KLURuYmpqdmJkcGFJZUFYSGQNCi1FT2NMS3ZiZHJEZGhwT1dCDQotRVBES2p2YmRJeFVCaExwcA0KLUVQREtqdmJkaGtkZE9WQ3kNCi1FUENrS3ZiZFRrdW9BdW5pDQotRVBETEt2YmRuUHl4dWp4Yg0KLUVPYmpqdmJkZlNCV3psQ28NCi1FUERLanZiZE11U3JLbUFYDQotRVBETEt2YmRtb3pZdkt5Qw0KLURuYmtLdmJkWmlyaFBmYWYNCi1FUENqanZiZE5RWHFXT0hUDQotRG5jS2p2YmRac2lJeUVTbg0KLURuYmtLdmJkVVJRbnVVZ20NCi1Eb0NqanZiZGtJSE1GZk9MDQotRVBES2p2YmRLZkdIYWFSVg0KLURuY0xLdmJkdGNEVXdWb1ANCi1FT2NMS3ZiZHhybkltUmJIDQotRVBETEt2YmRvem1kTFlQQQ0KLURvREtqdmJkVVZrb2pVQlINCi1EbmJqanZiZHFVVUhSckxVDQotRG9ETEt2YmRFQVJobVp2dw0KLUVPY0xLdmJkWkhXZEFPcmkNCi1Eb0NqanZiZFZVTXRHTHVqDQotRU9jTEt2YmRtZmVZTk5meQ0KLUVQREtqdmJkWmlyZ29nQ0cNCi1EbmJqanZiZEVKaEtWd2pBDQotRG5ia0t2YmRrVnZtZEJ4WA0KLURuYmpqdmJkdkJFWXNPZUkNCi1FUENrS3ZiZERvQ2pqd0RFDQotRG9Damp2YmRSWE5kQ2xJRA0KLUVQREtqdmJka3hyclRaR3QNCi1FT2NMS3ZiZFpkeEd6aEpDDQotRG9ETEt2YmR4blNneFNpRA0KLURvREtqdmJkSXJ5QXNNeE0NCi1EbmJrS3ZiZFRZS2xOemp4DQotRG5jTEt2YmRJR2Z6WllYZw0KLURuY0xLdmJkUXZuRUNsSGMNCi1EbmJrS3ZiZHFVVGZyUmtVDQotRG9ES2p2YmRSRGNBb3BkUw0KLURvREtqdmJkVGZ6bk1YV0YNCi1FT2NMS3ZiZGF1Q0hZS3RJDQotRU9ia0t2YmROcnN2SEV0cA0KLURvRExLdmJkRGloSnZYakENCi1EbmJqanZiZGxpRHRSVlJhDQotRG5jS2p2YmRnRmxabWZnQQ0KLURuY0xLdmJkbUpEc3B0cWENCi1EbmNLanZiZGZvYXp2ZFhoDQotRU9jS2p2YmRKWHRCZ2twcA0KLUVQQ2tLdmJkcVVVR3JTS3QNCi1FUERLanZiZHJNekp5TGdpDQotRVBDamp2YmRpR2pEWXVpdQ0KLUVPY0xLdmJka1dYTmNhd3cNCi1FT2NMS3ZiZHh4SWpCb3lrDQotRG5ia0t2YmRlUEVyanNzcg0KLURuYmpqdmJkSXJ5QXJtWU0NCi1FT2NMS3ZiZFJNd2F5TnR6DQotRU9jTEt2YmRSa1pHVWdLcw0KLURvREtqdmJkWkxyRVVPTU4NCi1EbmJrS3ZiZERITUZnQXpjDQotRG5ia0t2YmR3WE1CVmFWdQ0KLURuYmpqdmJkZGVPckNYREsNCi1FUERMS3ZiZHd1TWVReUxuDQotRVBDamp2YmRCaGpiTEllag0KLUVQREtqdmJkYU5MQ1N1TWcNCi1FUENqanZiZEJoa0NLaGVqDQotRVBDa0t2YmRwdFVHclNLdA0KLUVPYmtLdmJkVlRtVGZMdksNCi1Eb0NrS3ZiZERvREtrWERFDQotRG5iamp2YmRmb2F6dmRZSQ0KLURuYmtLdmJkYXRiSFlLdEkNCi1EbmJrS3ZiZFZVTXRHTHVqDQotRVBES2p2YmRlRW9SYXZiag0KLURvQ2tLdmJkSnB6RlBHTmUNCi1EbmJqanZiZE5IRFFOUVVrDQotRG5jS2p2YmRZTnFBWHVXVQ0KLUVQQ2tLdmJkWm5uSWRkeksNCi1FT2JrS3ZiZFlsUmRUbk1ODQotRVBES2p2YmRFenNwZGtjSg0KLURvRExLdmJkQ0lrQmpoZksNCi1FT2JqanZiZFRrdW9Bdk9pDQotRG9Da0t2YmRoa2RjblVieQ0KLUVQQ2pqdmJkSGZnWnlZWGcNCi1EbmNMS3ZiZGJzQ2tUZEtCDQotRG9Damp2YmRMcXdNelZReg0KLURvRExLdmJkUmtZZlVnTFQNCi1FT2NMS3ZiZGJRSEhFTHpkDQotRVBDa0t2YmRiVkNHeExUaA0KLUVPYmpqdmJkbVNZdVpzRUoNCi1Eb0RLanZiZHNzUnNZeWVEDQotRVBES2p2YmRMcldseXRweg0KLURuY0tqdmJkSlRaQlNseE0NCi1EbmJrS3ZiZHhybkpNckJnDQotRVBDamp2YmR4WmdmRnhGUw0KLUVPYmtLdmJkVVFwbnVWSU4NCi1FT2JrS3ZiZHpqVXBRRVN0DQotRU9iamp2YmR1YUR4c1BGSQ0KLURvRExLdmJka3lUUnNZZnQNCi1Eb0RLanZiZHlUT0ltUmJIDQotRU9ia0t2YmRlZ2tXUm5RZw0KLURvQ2pqdmJkYVNGYmdzZWsNCi1Eb0RLanZiZHJ5bFBzQWhPDQotRG9Damp2YmRnR01abkdnQQ0KLUVQQ2tLdmJkbHF5VXpTZEoNCi1EbmNLanZiZHdOV0FNZEZODQotRVBES2p2YmRUbFdQQXVvSg0KLUVPY0xLdmJkVU1XUEF1b0oNCi1EbmJqanZiZGRaeG93eHFDDQotRVBDa0t2YmRFdXlRUGxpZQ0KLURvREtqdmJkVkFhcVNxU1oNCi1FUERMS3ZiZHd0bGRweGxPDQotRU9jTEt2YmRyUnRrTmtCTg0KLURuY0tqdmJkSnFaZU9lbkYNCi1EbmNLanZiZGZIa1dTTnFIDQotRG9Da0t2YmRuVXVaamlyRw0KLUVPY0tqdmJkc0NGbU1Ha1oNCi1Eb0RMS3ZiZHd6SUZmWUVyDQotRU9jTEt2YmRxcXRqbWphTg0KLURvQ2pqdmJkcmJHTkxnS3kNCi1FUERLanZiZE5IQ29tUVVrDQotRG5ia0t2YmRJTUJ6bldxTA0KLUVQQ2pqdmJkRUtIaXZYakENCi1FUERMS3ZiZFZoWVdZR3h6DQotRVBETEt2YmRaeGNqTmJsUw0KLURuYmpqdmJkSnB6RW9GbWUNCi1FUERLanZiZGVyQld6a2NQDQotRG9ETEt2YmRwc3NnUnJLdA0KLUVPYmtLdmJkdGJidHZ1b1ANCi1FT2NMS3ZiZHFHRGVVV0FoDQotRG9ES2p2YmRsWlNyVFlmdA0KLUVPY0tqdmJkRmZLUm1odFINCi1EbmJrS3ZiZE5QeFJWbkdzDQotRVBETEt2YmRac2hoeGNzTw0KLUVQQ2pqdmJkTW94UXZOZ1QNCi1FUENqanZiZEthS2ZtQnhSDQotRVBETEt2YmRTd2prbXpqeA0KLURvQ2tLdmJkamJra1JHdGcNCi1Eb0RLanZiZGZvYXp3RHhJDQotRG9ES2p2YmRxd1FMYmh4cQ0KLUVQQ2tLdmJkWnRJaHlFVE8NCi1EbmNMS3ZiZG1wWnh1a1liDQotRU9jS2p2YmRNb3hRdW1nVA0KLURvQ2pqdmJkTFlxSnJ6dUcNCi1FT2JqanZiZG5HZVhsbWZ5DQotRVBETEt2YmR5emVPU0hoaA0KLUVPY0xLdmJkaVp1R01RbWYNCi1FUENrS3ZiZFdTTndhZGtjDQotRG5jS2p2YmRoZmlieVZqVg0KLUVPY0tqdmJkUW1YYlpPVXoNCi1Eb0NqanZiZFNLeGV1R2tUDQotRG5iamp2YmRicmJrVURqQg0KLUVQRExLdmJkSmNLQ3FKYngNCi1EbmJqanZiZGpTemlUTEp6DQotRU9jS2p2YmRaeGRLTmNNUw0KLURvQ2tLdmJkZWxmV2ZtSmsNCi1Eb0NqanZiZEZqZVNjSGx1DQotRVBETEt2YmRuQ0p2d25uVg0KLUVQREtqdmJkTnJzdWZkdVENCi1EbmJrS3ZiZGpjTGpxR3VIDQotRU9iamp2YmRtYktYWU9uVg0KLURvQ2pqdmJkUmFjZGtpWWsNCi1FT2JrS3ZiZGFhVmRmUVFYDQotRG9Da0t2YmRKcHlkbmZPRg0KLURvQ2tLdmJkdUNidHdWb1ANCi1Eb0RLanZiZHB4bmhIUkR4DQotRU9jS2p2YmRtSkVVUXRxYQ0KLUVQRExLdmJkUmtaR1ZHanMNCi1FUERLanZiZEVPYmprWENkDQotRU9iamp2YmRDVEFidEdXcg0KLURvQ2tLdmJkcVRzZnJTS3QNCi1EbmNMS3ZiZGFNa0JzVW1IDQotRG5jTEt2YmRxbHlpeGxJSg0KLUVQQ2tLdmJkdndNQXVhVnUNCi1EbmNLanZiZGlVekV3UnVDDQotRG9ES2p2YmRpVXpGV3JWQw0KLURuYmtLdmJka0RNS3BmdUgNCi1FT2JrS3ZiZFpubkpGRXpLDQotRU9ia0t2YmRXV2h3dWRFZw0KLURvQ2pqdmJkeXBvTklpd0ENCi1Eb0NqanZiZFNoeWlxQUJNDQotRG5iamp2YmRPRkVUaGhrRQ0KLURuYmpqdmJkUlhOY2JrZ2MNCi1Eb0NrS3ZiZHFVVGZyU0t0DQotRVBETEt2YmRmTkdXZ01qTA0KLUVQRExLdmJkR0Zpck9KVVINCi1FT2NLanZiZFNDRUZNSllrDQotRU9jS2p2YmRtcFp4dWtZYg0KLUVQRExLdmJkcmFmTkxnS3kNCi1EbmJrS3ZiZG1KRHNxVXJCDQotRG5iamp2YmRqS0ZnaW1Ycg0KLUVPY0xLdmJkVllndFpqb08NCi1FT2JrS3ZiZFR2TVBqVUJSDQotRU9jTEt2YmRTeEtrbXpqeA0KLURvREtqdmJkblB6WXZLeGINCi1FUENqanZiZGFSZkRJVGVrDQotRU9ia0t2YmRqS0dJSm1Ycg0KLURvQ2pqdmJkbGlFVVJWU0INCi1FT2JrS3ZiZEZhT3FZaXptDQotRU9jTEt2YmRxR0VFc3VhSQ0KLURvQ2pqdmJkWlFsZUpORXENCi1Eb0NqanZiZGJLbEZubkRBDQotRG5iamp2YmRXSVh1d2Z4eg0KLUVQRExLdmJkTkdjUG1QdUwNCi1Eb0NqanZiZEJzQkRUZXZyDQotRG5ia0t2YmRjellveFlwYg0KLUVPYmpqdmJkSnV0ZWRFZmkNCi1EbmNMS3ZiZEdGaXJOaHNxDQotRVBES2p2YmRVYUNRcnFSeQ0KLUVQQ2pqdmJkUXdOZERNSUQNCi1FUERMS3ZiZHRTclN5WmVEDQotRG5ia0t2YmROSERRTXBVaw0KLURvREtqdmJkWmlyZ29mYWYNCi1FT2JrS3ZiZHJwV09pYnVmDQotRG9Da0t2YmR3eWdmRnhFcg0KLUVQQ2pqdmJkU3dqbE56angNCi1EbmJrS3ZiZGpLR0hqTXhTDQotRG5jTEt2YmRpakZoS05Ycg0KLUVPY0tqdmJkZGRvUmF2YmoNCi1FUERMS3ZiZG1JZFRwdVNCDQotRG5jTEt2YmRpaWVoSm1ZUw0KLUVPYmtLdmJkamNMa1FnVWcNCi1Eb0RLanZiZHNRVm9KYnVmDQotRU9iamp2YmRoelVmTVFtZg0KLURuYmtLdmJkY0ltS0tmV3gNCi1FT2JrS3ZiZGJRSEhFTHpkDQotRG5iamp2YmRXV2lYdWNlSA0KLUVQREtqdmJkakplZ2pOWHINCi1FUENqanZiZFp5RUtOYmxTDQotRG9ES2p2YmRMcXZselZReg0KLUVQRExLdmJkWlJORWhtRlINCi1EbmJrS3ZiZEdjanVpYkpqDQotRU9jTEt2YmRHQW5weGl6bQ0KLUVQQ2pqdmJka1Z2bkRhd3cNCi1FT2NLanZiZEhmZnpaWHdnDQotRG9Da0t2YmRLZWVoQ0FxVg0KLUVQQ2pqdmJkSEVLdWlhaksNCi1FT2NLanZiZFV0TXNlbFdLDQotRVBES2p2YmRFWHdsVHN0TQ0KLUVQREtqdmJkc3JyU3h6RkQNCi1FT2NLanZiZEV6dFFlTURKDQotRVBDa0t2YmRkb0ZTanN0Uw0KLURvQ2tLdmJkU0NFRWxJeUwNCi1EbmNLanZiZEZWeHBRTkplDQotRG5iamp2YmRYbXFBWVV1dA0KLURvQ2pqdmJkaVp0ZkxwbWYNCi1Eb0RLanZiZHd5Z2VleEVyDQotRU9jTEt2YmRpVXllWFNVYg0KLURuY0tqdmJkc1prb3JhSU8NCi1FT2NMS3ZiZEFDcllKeWhwDQotRU9jTEt2YmRUbFZvQlZvSg0KLUVQQ2tLdmJkcVpQSGZxRHgNCi1EbmJrS3ZiZG1KRHNwdHFhDQotRG5jS2p2YmRoa2VEblVjWg0KLUVQREtqdmJkVVJRb1V0Z20NCi1FUERLanZiZGpBUUhBb2dLDQotRU9iamp2YmRDSWtDS2hmSw0KLUVPY0tqdmJkWXpiZlJqV1oNCi1EbmJrS3ZiZFdSbllDRWtjDQotRG5jS2p2YmR5emVPUmdpSQ0KLUVPYmpqdmJkRVBDa0xXYmQNCi1Eb0RMS3ZiZE5IQ29tUHVMDQotRG5ia0t2YmRhUmViaFVGaw0KLURuYmtLdmJkaGxFY210YnkNCi1FT2NMS3ZiZGxpRVRxVXJCDQotRVBES2p2YmRJeFRiSGtxUQ0KLURuY0xLdmJkQ0VQYVZqTkcNCi1FT2NMS3ZiZElqRUFKb2dFDQotRG9Da0t2YmRzWmtwU2FIbg0KLUVQRExLdmJkRVh4THRUdE0NCi1EbmNLanZiZHdYTUF2QXV1DQotRVBES2p2YmRha01HUE9EQQ0KLUVQQ2tLdmJkYXVCZnhLc2gNCi1FT2NLanZiZENKS2FrSkZqDQotRVBDa0t2YmR5WGhqQm96TA0KLURvRExLdmJka1dXbkRiWVgNCi1EbmNLanZiZEVQQ2prWERFDQotRG9ES2p2YmRscXh0elREaQ0KLUVQQ2pqdmJkeVRPSk5TQmcNCi1Eb0NrS3ZiZG5HZVlNbWdaDQotRVBDa0t2YmRhU0ZiaFVGaw0KLUVPYmpqdmJkbkNLV3hQTnUNCi1Eb0NqanZiZHJXcExiaHlSDQotRVBETEt2YmRtUnh0eXJjaQ0KLURuYmpqdmJkU0JkRWxKWkwNCi1EbmJrS3ZiZHJYUUxiaVlxDQotRG9ETEt2YmRXSHd1d2Z4eg0KLURvQ2pqdmJkWlJORkpORXENCi1EbmNLanZiZFVWa3BKc2FSDQotRG9Damp2YmRiaU1pamZYWQ0KLUVQREtqdmJkVlRtVGVrdksNCi1Eb0NqanZiZGVYeXRUckZ6DQotRG9ETEt2YmR5WUpLQ1Faaw0KLURvRExLdmJkY3paUVlaUWINCi1FT2JqanZiZFJhZEZNSlpMDQotRG5jTEt2YmRrVnZuRUNZWA0KLURuY0tqdmJkdWFEeVNuZUkNCi1EbmJqanZiZHd1TkZReU1PDQotRG5jTEt2YmRzcnFyeHpFYw0KLURvRExLdmJkY1NianRFS0INCi1FUENqanZiZFp0Skl5RVRPDQotRG9ETEt2YmRKdlVmRGRnSg0KLURuYmpqdmJkaGJQREZXcVINCi1EbmNLanZiZGN5eVFZWXBiDQotRG9ES2p2YmRXU053YkZNRA0KLURvQ2pqdmJkbWFqWFhvTnUNCi1FUENrS3ZiZHhaZ2VleEVyDQotRU9jS2p2YmR4c09JbHJCZw0KLURvREtqdmJkWnlFSm1ia3INCi1EbmNMS3ZiZFRrdW5hVm5pDQotRU9jTEt2YmRVUXBvVXRoTg0KLURvRExLdmJkeU5zSHhUSkQNCi1EbmNLanZiZEV6dFJFbENpDQotRG5ia0t2YmRYblJBWVZWdA0KLURuYmpqdmJkcUFoZUFXZ2QNCi1EbmJrS3ZiZENKTEJrSWZLDQotRVBES2p2YmRVR3pta3dXRg0KLUVQQ2tLdmJkU2laaXFBQk0NCi1FUERMS3ZiZGlka0d0b0FPDQotRU9jTEt2YmRZbFNEc25MbQ0KLUVQREtqdmJkTVNXbVp0cHoNCi1Eb0RLanZiZGxoZFVSVlJhDQotRU9jTEt2YmRPWU91emRPVQ0KLURuY0xLdmJkcmFmTWxHa1oNCi1FT2JqanZiZHJ5bFByYUhuDQotRG5iamp2YmREbmNMS3dDZA0KLURvQ2tLdmJkb3puRUxYb0ENCi1Eb0NrS3ZiZG10dHlrSnJHDQotRG9ETEt2YmRCdnpjaUVvdg0KLUVQQ2pqdmJkZVh6VVVTRnoNCi1Eb0RLanZiZHR1bllLUXNBDQotRU9iamp2YmRxY2VKUU52Qg0KLUVPY0xLdmJkcVR0R3Fxa1UNCi1Eb0NrS3ZiZGlHakRZdWpWDQotRVBDa0t2YmRSV25FRExoRA0KLUVPY0xLdmJkY1NianREaWENCi1EbmNMS3ZiZFRxUk91VkhtDQotRU9jS2p2YmRpaWZJS014Uw0KLUVPYmtLdmJkbFlycXNaR3QNCi1Eb0RLanZiZFNCZEZMaHhrDQotRG5ia0t2YmRWVU5VRmt1ag0KLURvQ2pqdmJkcnpMcFNhSU8NCi1Eb0RLanZiZHpHeGxBTkZYDQotRG9ETEt2YmRmSGp1cW1wZw0KLUVQREtqdmJkWlJNZUlsZHENCi1EbmNLanZiZE1mY1BscFZMDQotRG5jS2p2YmR4S3dEZ3p6Rw0KLUVPY0xLdmJkWXpiZlJqVnkNCi1FT2JrS3ZiZFdTTndiRWxEDQotRG9Da0t2YmRlRk9yQ1hDag0KLUVPYmpqdmJkYktsR09tY0ENCi1FT2NLanZiZER4WGt0VVRsDQotRVBDamp2YmR2QkR5U25lSQ0KLUVQREtqdmJkTEZlaENCUlYNCi1Eb0RMS3ZiZGladUZsUk9HDQotRVBES2p2YmREb0RMS3ZiZA0KLURvQ2pqdmJkUXdOZENraEQNCi1Eb0NqanZiZENKTEJrSWZLDQotRG5iamp2YmRscXlVelNjaQ0KLURuY0xLdmJkTkhDcE1wVWsNCi1FT2NLanZiZGlNRkVPVkN5DQotRG9Da0t2YmRuR2VZTk9HeQ0KLURuYmtLdmJkWm9PSWRkeksNCi1FT2NLanZiZEZwQVRXZmZaDQotRG9ES2p2YmRlT2VUS3RUcg0KLURuYmpqdmJkR0dLU05oc3ENCi1FT2NLanZiZHlYaUtDUHlrDQotRG9Damp2YmRlQVVSTllLRw0KLURvREtqdmJkcHNzZnJSanQNCi1FUERLanZiZG5WVlpqalJmDQotRU9jS2p2YmRpWnVHTVFtZg0KLUVPY0xLdmJkTkhEUGxvdGsNCi1EbmJqanZiZHVDYnR3Vm9QDQotRU9jS2p2YmR4VWxlUXhsTw0KLURvREtqdmJkbkhGWU1uR3kNCi1EbmJqanZiZFVWbFBpdEFxDQotRVBDa0t2YmRqQVBnQW9mag0KLURvQ2tLdmJkVGxWb0F1b0oNCi1FUENrS3ZiZG1TWXR5cmRKDQotRVBES2p2YmRCc0FjVGV2cg0KLUVQQ2tLdmJkVXlJVHpLbm4NCi1EbmJqanZiZGJRSEdkTHpkDQotRU9jTEt2YmRlenV5Rklzdw0KLURvRExLdmJkRVh3bFR0VU0NCi1FT2NLanZiZEt5UkpyenRmDQotRG5iamp2YmR0VFNTeHpFYw0KLURuYmpqdmJkSERqdWpCaWoNCi1Eb0NqanZiZHNRVm5pY1dHDQotRU9ia0t2YmRac2lKWWNybg0KLUVQRExLdmJkVXROVUZrdWoNCi1Eb0RLanZiZE5Qd3B1bWZzDQotRU9jS2p2YmRTQmNkbEpaTA0KLUVQRExLdmJkbWZlWGxtZnkNCi1EbmNLanZiZElzWkFzTlhsDQotRG5jTEt2YmRtSkRzcHRyQg0KLURuY0tqdmJkR1l1VWFFWGINCi1EbmNMS3ZiZHlZSkpiUHpMDQotRG5ia0t2YmRycFZuaWNXRw0KLUVQQ2pqdmJkVHFRb1ZVZ20NCi1Eb0RMS3ZiZEZWeVBwTWpGDQotRU9ia0t2YmRabm5JZUV5ag0KLUVPYmtLdmJkYlVhZ1lLdEkNCi1Eb0NrS3ZiZHFHRGR0V0JJDQotRVBETEt2YmRGVnhwUU5LRg0KLURuY0xLdmJka1dYTmRDWVgNCi1FUERLanZiZGR3eXN0UmV6DQotRU9jS2p2YmRhTkthc1VsZw0KLURuYmtLdmJkTmRjdEloamQNCi1FUENrS3ZiZGF0YWdZS3NoDQotRG9Da0t2YmRmTkZ2Z01paw0KLUVPYmpqdmJkSllUYklNUXANCi1Eb0NqanZiZEVZWU1UdFRsDQotRG5jS2p2YmRXUm14Q0VsRA0KLUVQQ2tLdmJkYnNDanNkS0INCi1FT2NMS3ZiZEZWeHBRTWllDQotRU9ia0t2YmRwYUpGQVdnZA0KLUVQRExLdmJkaWpHSGltWHINCi1FUENqanZiZGxoY3RRdHFhDQotRU9iamp2YmRGVnhvb2xpZQ0KLURuY0tqdmJkckpBS0VtT2UNCi1EbmJrS3ZiZHpRbm1JaXdBDQotRVBDa0t2YmRrSGZrZWVtaw0KLURuYmpqdmJkTEdHSGFhUXUNCi1EbmJrS3ZiZE9Tc3VnRXRwDQotRG5ia0t2YmRadElpWWNybg0KLURvQ2pqdmJkUVpOQUdzU0sNCi1FT2JqanZiZE5QeFJXT0dzDQotRG9Da0t2YmRWVU1zZkx1ag0KLURuYmpqdmJkbUpFVHFVcWENCi1FUERMS3ZiZEJzQWNVRnZyDQotRU9jTEt2YmRJc1pBcmx3bA0KLUVQQ2pqdmJkTmRkVGlKS2QNCi1Eb0RLanZiZHlYaGlhb3pMDQotRG5jTEt2YmRqbUNMekVmbw0KLUVPY0xLdmJkUmFkRWxKWWsNCi1EbmNMS3ZiZGpia2tRZnVIDQotRU9ia0t2YmRYRnh6VUFPcw0KLURuY0xLdmJkeFpoR0Z3ZHINCi1Eb0NqanZiZE5zVHVnRXVRDQotRU9iamp2YmRSYkRkbEl5TA0KLURvQ2tLdmJkZVBFc0xVVVMNCi1Eb0NqanZiZE9TdFZnRlZRDQotRVBETEt2YmRVdE10R0x1ag0KLUVPYmpqdmJkRmpkcmJoTXUNCi1FT2NLanZiZGRlT3JCd0NqDQotRG5iamp2YmR4VW1GUllrbg0KLURuYmpqdmJkQ0VRQlZpbUcNCi1FT2NMS3ZiZHZBZFpUUEVoDQotRVBDa0t2YmRHY2p2SmFpag0KLUVQQ2pqdmJkT0ZFVGlJamQNCi1FT2NMS3ZiZGVtR1dnTktMDQotRG9Da0t2YmRxVHNmclJrVQ0KLURuY0xLdmJkYnJjS3NkS0INCi1FUERMS3ZiZFRBRkloQm9FDQotRG9Damp2YmRLQ2pDcUpieA0KLURuYmpqdmJkTnNVV0hGVXANCi1FUERLanZiZGtXV21jYXhYDQotRVBETEt2YmRiS2xGb05jQQ0KLURvQ2pqdmJka0lHa2VmTmsNCi1FUENrS3ZiZFhGeVp0QVBUDQotRVBES2p2YmRweG5oR3BjeA0KLURvRExLdmJkaGFuYmVXcVINCi1FT2NLanZiZGxpRVVRdHFhDQotRU9iamp2YmRiQlZlRnBQdw0KLUVPYmtLdmJkUWREQXBRZFMNCi1FUERMS3ZiZG5RWnlWa1pDDQotRU9iamp2YmRoYk9jRXdRcQ0KLURuYmpqdmJkQmRQYVdLTWYNCi1Eb0NqanZiZENUQWJ0R1dyDQotRVBDamp2YmRFdllwUU1pZQ0KLUVPYmpqdmJkRHhZTHRVVGwNCi1FT2JrS3ZiZENUQkRUZlhTDQotRVBDamp2YmRtcFp4dkt5Qw0KLUVQQ2tLdmJkUnpLSVREV0ENCi1FT2JrS3ZiZGVtR1hHbUprDQotRU9jTEt2YmRJcnlBc05YbA0KLURvREtqdmJka1dYTmNhd3cNCi1FT2JrS3ZiZGRDVE5TQVVODQotRG5jS2p2YmR2QkR4cm9FaA0KLURuY0xLdmJkaUNQREV3UlINCi1FT2JqanZiZFJrWkdWSExUDQotRG9Damp2YmRGa0ZTYmhOVg0KLUVQRExLdmJkd2p2ZEh6ekcNCi1Eb0RMS3ZiZHFxdUtta0JODQotRU9jS2p2YmRzUVZvSmNWZg0KLUVQQ2pqdmJkWWxTRVVPTU4NCi1FT2JrS3ZiZGpLR0lLTXhTDQotRG5jTEt2YmRScFVHaWZEdw0KLUVPYmtLdmJkRXV4b29sakYNCi1FUERMS3ZiZHppdHBRRVRVDQotRU9jS2p2YmRUdkxwS1VBcQ0KLURvQ2pqdmJkclNWS21rQW0NCi1FT2NMS3ZiZEV2WlFQbUplDQotRVBDa0t2YmRmZWxabkhIQQ0KLUVPY0xLdmJkamhHbEdHTmsNCi1EbmNLanZiZENFUGFXSm1HDQotRG5jTEt2YmRycFZuakRXRw0KLURvRExLdmJkZU9lVEt0VVMNCi1Eb0NrS3ZiZHRiYnVYVm5vDQotRU9ia0t2YmRZcGxlSk1lUg0KLURuYmpqdmJkaUNQREV2cVINCi1Eb0RMS3ZiZFVzbHNla3VqDQotRG5ia0t2YmRHQlBReUp6bQ0KLUVQQ2tLdmJkdGJjVXdWb1ANCi1Eb0RLanZiZGR4WnNzckZ6DQotRG5jTEt2YmRrSUdsR0Ztaw0KLUVQQ2tLdmJkaHVaZHdSdGINCi1FT2JrS3ZiZGVoTFdTT1FnDQotRG9Da0t2YmRhdGFmd2pzaA0KLURvREtqdmJkaGZqQ3lWaXUNCi1Eb0NqanZiZEZ5VXVBY3hDDQotRU9ia0t2YmRVTVdQQXZQSg0KLUVQRExLdmJkeHhJakJveWsNCi1EbmJqanZiZE1Sdmx5dHB6DQotRVBDa0t2YmREeFlMdFVUbA0KLURuYmpqdmJkaVZaZVhTVWINCi1Eb0NqanZiZGZmTVptZ0hBDQotRVBETEt2YmRuUHl5VmtZYg0KLUVQQ2tLdmJkWnRJaHlFVE8NCi1EbmNLanZiZFJFQ2FQcURyDQotRVBES2p2YmRWck54QmVNRA0KLURuYmtLdmJkS1Z1RmRGR2kNCi1FT2NMS3ZiZHJ6TG9zQWduDQotRVBES2p2YmRMTEFndkFLWg0KLUVPY0xLdmJkTFlwaXJ6dGYNCi1EbmNLanZiZG5HZVhsbkhaDQotRU9jTEt2YmRRZERBb3BkUw0KLURuYmtLdmJkcHRUZnJSa1UNCi1Eb0NqanZiZHFHRUZVVmFJDQotRG5jTEt2YmRyRGVJb212Qg0KLURvRExLdmJkeU9USHhTaUQNCi1FT2NMS3ZiZFJwVGZqR0R3DQotRG9ETEt2YmR6aXRwUGRUVQ0KLURuYmpqdmJkVXhoVHlrT24NCi1FT2NLanZiZEdGalNOaHRSDQotRU9ia0t2YmRpZGtHdVBBTw0KLUVPYmpqdmJkVkFhcHNRcloNCi1FUERMS3ZiZFFjY0FvcGRTDQotRU9iamp2YmRtb3pZdWtaQw0KLUVPY0tqdmJkR0ZqU09Jc3ENCi1FUENrS3ZiZHl6ZU5ySGlJDQotRG5jTEt2YmRFT2NLanZjRQ0KLURuY0xLdmJkTEZmSUJhUXUNCi1Eb0RLanZiZHRsWHdCVUJYDQotRG9Damp2YmRlT2VUTFRzcg0KLURuY0tqdmJkaVp1R0xwbkcNCi1Eb0NrS3ZiZFdSbllCZGtjDQotRG5jTEt2YmR1Q2J0dnZPbw0KLURuYmtLdmJkR0dLUm5Jc3ENCi1FT2NMS3ZiZFZUbVVGa3VqDQotRU9jS2p2YmRGa0VzREhsdQ0KLURvREtqdmJkUXdOY2JrZ2MNCi1EbmNMS3ZiZFdSbXdiRkxjDQotRG5iamp2YmRIbEJ6bXdSTA0KLUVQREtqdmJkRG5jS2p3Q2QNCi1FT2JrS3ZiZEdCUFJZaXptDQotRU9jS2p2YmRxclZMTmphTg0KLUVPYmpqdmJkcUZjZVVWYUkNCi1Eb0NrS3ZiZFpRbUZJbUZSDQotRVBETEt2YmRtSWN0UlZTQg0KLUVPYmtLdmJkakFRSEJQZmoNCi1FT2JqanZiZHJFRklvbldCDQotRG5iamp2YmRzUHVvS0N1Zg0KLURvREtqdmJkdGJidVhXUFANCi1FUERMS3ZiZE9TdFdHZHVRDQotRG9Da0t2YmRVUXFQVXVJTg0KLUVQRExLdmJkd3loRmV3ZHINCi1FT2JrS3ZiZFNoeWlxQUFsDQotRVBETEt2YmRHWlV1QkVYYg0KLUVQQ2tLdmJkSGZmeXlYd2cNCi1FT2JqanZiZEdCT3B5SnptDQotRU9ia0t2YmRaaXJncEdhZg0KLUVPYmtLdmJkUmp4ZlVma1QNCi1FUERLanZiZFpIV2RBUFNpDQotRG5iamp2YmRWck9ZQmRrYw0KLURvQ2pqdmJkR0dLU05oc3ENCi1FT2NLanZiZEpxWmVPZW5GDQotRU9jTEt2YmRkQnNOU0FVTg0KLURuY0tqdmJkWnRKSlljc08NCi1FUERLanZiZEJyYURUZXZyDQotRG9Da0t2YmRSRGNBcFFkUw0KLUVPYmpqdmJkR0dKck5pVHENCi1Eb0NqanZiZEdMRlRDZ21WDQotRG9Damp2YmR0bFh3QlVBdw0KLURuY0xLdmJkUXdOZENsSGMNCi1Eb0RMS3ZiZHlnWWxBTWVYDQotRVBETEt2YmRUdk1RS1RhUg0KLUVQQ2pqdmJkaU1GRG5WRFoNCi1Eb0NqanZiZGlCb0RGWFJSDQotRU9ia0t2YmRVUXFPdVVnbQ0KLUVPY0tqdmJkYU1rQnNWTkgNCi1FT2JrS3ZiZHd1TkVxWk1PDQotRU9iamp2YmRMQWtHbGJYcQ0KLUVPYmtLdmJka0Nra1FnVWcNCi1EbmNMS3ZiZFZxbllDRkxjDQotRVBDa0t2YmR4Vk1lUlpMbg0KLURuY0xLdmJkUlhPRUNsSGMNCi1FT2JqanZiZHZ3TUF2QldWDQotRU9iamp2YmRJd3NhaExwcA0KLUVPYmpqdmJkS0RLQ3BpY1kNCi1Eb0RLanZiZGxyWlV6VEVKDQotRU9jTEt2YmR5WUlqQnBaaw0KLURuY0xLdmJkeHNOaGxxYWcNCi1FUERLanZiZGdQYXp2ZFhoDQotRVBETEt2YmRiS2xHUE5jQQ0KLURvQ2pqdmJkcVVVSFNSanQNCi1EbmJrS3ZiZE5lRHNpSktkDQotRG5iamp2YmRxR0VGVHZBaA0KLURvREtqdmJkblV0eWtLUmYNCi1FUERLanZiZFp0SkpaRHJuDQotRG9Damp2YmRtUnh0eXNFSg0KLUVPY0tqdmJkUW1YYlluVXoNCi1FUERLanZiZGptQ0x6RkdvDQotRG5jS2p2YmRzQmZNa2ZrWg0KLUVQQ2tLdmJkRlZ4cFBsaWUNCi1EbmJrS3ZiZFpMckVVT01ODQotRG9Da0t2YmRFT2NLa1hERQ0KLUVPYmtLdmJkdkJFWXNQRWgNCi1FUERLanZiZGNKTWpMR1hZDQotRU9jTEt2YmRPWVBWemNuVQ0KLURuYmtLdmJkc1FXT2pEV0cNCi1FT2NMS3ZiZGZIanZSblJIDQotRG9ETEt2YmRtYktYWVBPVg0KLURuY0tqdmJkcnBXUEpjVmYNCi1FT2NLanZiZFVSUk91VWdtDQotRG5ia0t2YmRyb3ZPaWNXRw0KLUVPYmpqdmJkTFlwaXJ6dUcNCi1EbmJqanZiZEdRQVN2Z0daDQotRG5ia0t2YmRZemNGcWpWeQ0KLURuY0tqdmJkQnNCQ3RGdnINCi1Eb0RMS3ZiZFlnWEVBT3JpDQotRU9jTEt2YmRxVHNmcXFqdA0KLURuY0tqdmJkUElBWVpBWWENCi1FT2NMS3ZiZHlwbmxpSndBDQotRG5ia0t2YmRoeXVHTHFOZg0KLUVPY0xLdmJkamhHa2ZHT0wNCi1EbmNLanZiZGpibExSR3VIDQotRVBDamp2YmR4d2hpYlB5aw0KLUVPY0tqdmJkQmhrQ0xJZksNCi1EbmJqanZiZEpUWkFybHhNDQotRG9Da0t2YmRSanhldGdLcw0KLUVPYmtLdmJkaVV5ZVdyVkMNCi1FT2NLanZiZHdYTGFXQXV1DQotRVBETEt2YmRzc1NUWlpkYw0KLUVPYmtLdmJkY1NianREaWENCi1EbmNLanZiZGdHTVpuSEhBDQotRG9Da0t2YmRhdGFmd2tVSQ0KLURuY0xLdmJkbkNLV3hQTnUNCi1FT2JqanZiZHlPU2hYcmhjDQotRVBDamp2YmRweVBIZnFFWQ0KLURvREtqdmJkYlViR3hLc2gNCi1FT2NLanZiZHlwb05KS1hBDQotRU9ia0t2YmR5VE9KTXJCZw0KLURvRExLdmJkaVp0ZkxwbWYNCi1FUENrS3ZiZExHRmdiQlF1DQotRU9jTEt2YmRDSkxCa0pGag0KLURuYmtLdmJkVXhnc3pMUE8NCi1Eb0RLanZiZFVRcVBWVkhtDQotRVBDamp2YmRpakdJS05ZUw0KLUVQREtqdmJkQ0pLYWpoZWoNCi1FUERMS3ZiZHVvVHpxTFBVDQotRG5iamp2YmRKVFpCVE13bA0KLUVPY0xLdmJkTEFqZm1Cd3ENCi1Eb0RMS3ZiZFF3T0VDa2hEDQotRG9Damp2YmRRWW1BSFRTSw0KLURvREtqdmJkRXV5UVFNakYNCi1Eb0RLanZiZFpkd2Z6aEliDQotRU9jS2p2YmR5VE9KTlJhZw0KLURvRExLdmJkYkJWZGZRUHcNCi1Eb0NrS3ZiZGJWQmZ4TFVJDQotRG5jS2p2YmRjSWxqS2V2eA0KLUVPY0xLdmJkaGdLRFpWaXUNCi1FT2JqanZiZE9UVVdIRXRwDQotRG5jS2p2YmRaUk1lSWxkcQ0KLURuYmpqdmJka0hnTUdHTmsNCi1FT2NMS3ZiZFpNU0VUbWxODQotRVBDa0t2YmRqY01LcGZ1SA0KLUVQRExLdmJkaUJuY0ZYUXENCi1FT2JqanZiZEpjS0NxS0RZDQotRG9ES2p2YmRRd09FQ2xJRA0KLUVQQ2tLdmJkUnBVSEplY3cNCi1Eb0RLanZiZFpqU2dvZ0JmDQotRG9Da0t2YmRFT2JrS3ZiZA0KLURvRExLdmJkRHd3a3RVVGwNCi1Eb0NrS3ZiZFNLeUdWSEtzDQotRG5ia0t2YmRaTVNFVG5NTg0KLURuY0xLdmJkaVp1R0xwbWYNCi1FT2JqanZiZGpjTGpwZ1ZIDQotRU9jTEt2YmRZemNGcWpWeQ0KLUVQQ2pqdmJkUXZuRGNMaEQNCi1Eb0NrS3ZiZERpaEp2WUtBDQotRVBETEt2YmRKcVplT2VuRg0KLUVPY0tqdmJkV1hKWHZEZGcNCi1Eb0NqanZiZHpucFFlQ2t4DQotRVBDamp2YmRqSmVoSm1Ycg0KLURvREtqdmJkbVNZdVpzRGkNCi1Eb0RLanZiZEZWeVBvbGllDQotRG5iamp2YmRVTHZQQXZPaQ0KLURuY0tqdmJkd3pJR0Z3ZHINCi1EbmJrS3ZiZE9FY3NpSktkDQotRVBDa0t2YmRFSmhKdXdqQQ0KLUVPYmtLdmJkWVNrYU5VT3gNCi1FT2JrS3ZiZGRvRlNrVHRTDQotRG9ETEt2YmRGa0ZUREhsdQ0KLURvQ2pqdmJkZHd6VHRSZXoNCi1FT2NMS3ZiZER3d2xVVHRNDQotRG9ES2p2YmRIRGp2SmFpag0KLUVPYmtLdmJkeVRPSWxyQmcNCi1FT2NMS3ZiZHRTcXNZekZEDQotRU9ia0t2YmR1Vm13alFzQQ0KLUVQREtqdmJkYmlNaktmWFkNCi1EbmNMS3ZiZHNRV1BLRFdHDQotRG5jTEt2YmRSYkVFbEl5TA0KLURuYmpqdmJkR0tlVERIbHUNCi1FUENrS3ZiZHJwV09qRFdHDQotRU9iamp2YmRWd0pZV0VGSA0KLUVQQ2pqdmJkdkJEeVNvRkkNCi1FUENrS3ZiZFpNU0RzbWttDQotRU9ia0t2YmRxWW5oSFJFWQ0KLUVPYmpqdmJkeXFQTWlKd0ENCi1EbmNMS3ZiZENUQkN0R1hTDQotRVBDa0t2YmRmZWt5bkdnQQ0KLUVQQ2tLdmJkdnZrYVdCVnUNCi1Eb0NqanZiZEdaVXVBZFlDDQotRG9ES2p2YmRweU9nZnFEeA0KLUVQQ2pqdmJkZVBGVEtzdFMNCi1FT2NMS3ZiZFZ2aVh1ZEZIDQotRVBDa0t2YmRkWnlRWVpRYg0KLURuYmtLdmJkVWFDUXJxUnkNCi1FUERMS3ZiZFF3TmRETUlEDQotRG5jS2p2YmRVYUNSVFFyWg0KLURuYmpqdmJkSERrV0piS0sNCi1FT2NLanZiZE9UVHZHZHVRDQotRG5iamp2YmRzc1JyeHpFYw0KLUVPYmpqdmJkZXp1eGRpVHcNCi1FT2NMS3ZiZEdMRlRDZ21WDQotRVBETEt2YmRVeGd0WmtPbg0KLUVPY0xLdmJkYnJianNjaWENCi1EbmJqanZiZGpKZkhpbVhyDQotRU9jS2p2YmRqY01MUWdVZw0KLURvREtqdmJkbFlycXJ4ZnQNCi1FUERLanZiZEdZdHRhRVhiDQotRU9jTEt2YmRoYlBERXdRcQ0KLUVPY0tqdmJkdkFjeHJvRWgNCi1Eb0RLanZiZFZneFZ4SFl6DQotRG9Da0t2YmRUcVFudVZJTg0KLURvQ2pqdmJkclhRTUNpWlINCi1FT2NLanZiZE1TV2x5dHB6DQotRG9Damp2YmRCaUxDTEpGag0KLUVPYmtLdmJkVXlIdFprUE8NCi1Eb0RMS3ZiZEdjanVqQ0pqDQotRVBDamp2YmRma0d6YmZBRQ0KLURvQ2pqdmJkRG9Damp3REUNCi1EbmJrS3ZiZHFHRGRzdkFoDQotRG9ETEt2YmRqdlhOZEJ3dw0KLUVPY0tqdmJkQU5IeVN2eXgNCi1Eb0NqanZiZGVKalJ2VXpuDQotRG5jS2p2YmRxVVRnUnFrVQ0KLURuY0xLdmJkRXZaUVBsakYNCi1EbmJqanZiZFNQc2dLRmRYDQotRU9jS2p2YmRHTEZTY0htVg0KLUVQQ2pqdmJkcVVUZ1Jxa1UNCi1FUENrS3ZiZE54T3V6ZE9VDQotRG9Da0t2YmRwZkVFdFdCSQ0KLUVPY0xLdmJkRHd3bFR0VGwNCi1FUENqanZiZFNaaklURFdBDQotRG5jS2p2YmRRd05jYmxJRA0KLURuYmpqdmJkaWpHSUtNd3INCi1EbmJqanZiZFlwbGRpTWRxDQotRG5jTEt2YmRlbUdYSE5LTA0KLUVQQ2tLdmJkRUtIaldZS0ENCi1Eb0RMS3ZiZHdYTUJXQXZWDQotRG5iamp2YmRRd09FQ2xIYw0KLURuYmtLdmJkYlViSFlLdEkNCi1EbmNMS3ZiZENTYUN0RnZyDQotRG5jTEt2YmRFdXlQcE5KZQ0KLUVQREtqdmJkRlZ5UG9saWUNCi1EbmNLanZiZGRuZVNrVHRTDQotRU9jS2p2YmRadEpJeGNzTw0KLUVPY0tqdmJkaUdpY1pXSnUNCi1EbmNMS3ZiZE9GRHRJaUxFDQotRG9ETEt2YmRPU3N1ZmR1UQ0KLURuYmtLdmJkTWZjUG1RVkwNCi1FT2JqanZiZGlVekV3U1ZDDQotRG9Da0t2YmRDSWtCa0pGag0KLURuY0xLdmJkWWtyRVRtbE4NCi1FT2JqanZiZHFaT2dnUkVZDQotRVBDa0t2YmRIRGtWaWFqSw0KLURuYmtLdmJkYnNETFRkS0INCi1FUERMS3ZiZGxxeHR6VERpDQotRG5jS2p2YmRMR0ZnYkFxVg0KLUVPYmpqdmJkb0FLenRIY24NCi1FUERMS3ZiZFJYT0RibElEDQotRG9Damp2YmRJSEd6WXd4SA0KLUVPYmtLdmJkTlB3cVZuSFQNCi1FT2NLanZiZHhybkltUmFnDQotRU9jTEt2YmRpTGRkTnVDeQ0KLURvQ2tLdmJka01ha3pFZm8NCi1FT2JrS3ZiZG5QeXh1a1liDQotRVBDamp2YmRaZHdmemdpQw0KLUVQQ2tLdmJkbkhFd21OZnkNCi1FT2JqanZiZHlTbWlOUmFnDQotRU9jS2p2YmR6ZVpuemR5cA0KLUVQQ2pqdmJkSnZWRmRFZ0oNCi1FT2NLanZiZFpRbGRpTWVSDQotRU9jS2p2YmRGeVZWQWRZQw0KLURuY0tqdmJkSlhzYWhNUlENCi1EbmJqanZiZGZOR1hHbGpMDQotRU9jTEt2YmR3V2xBdkF2Vg0KLURuY0xLdmJka0lITGVmTmsNCi1EbmNMS3ZiZGxpRHRRdHJCDQotRG9Da0t2YmR4WmdlZlhkcg0KLURuY0tqdmJkQ1d6Y2hkcFcNCi1FUENrS3ZiZHB5UEhmcGRZDQotRU9jS2p2YmRoYk9jRldxUg0KLURuYmpqdmJkempVcFBkU3QNCi1Eb0RMS3ZiZFpNUmRVT0xtDQotRG5jTEt2YmRWd0pYdWNkZw0KLUVQQ2pqdmJkV1hJeFZjZGcNCi1EbmJrS3ZiZE1wWHB2T0hUDQotRG5jTEt2YmRSa1pHVkhLcw0KLURvREtqdmJkbXBaeVdLeGINCi1Eb0NqanZiZGVna1dSbXBnDQotRG5jTEt2YmR5emVPU0hoaA0KLUVQRExLdmJkUkVDYVBwZFMNCi1FUERLanZiZHF2cExjSlpSDQotRG9Damp2YmRSRGJhUHFEcg0KLUVPYmpqdmJkUkVDYVBxRHINCi1FT2NMS3ZiZHNCZk5MZ0xaDQotRG5jS2p2YmRaeUVLT0Nrcg0KLURuYmtLdmJkU1BzZ0pmRVgNCi1FUERLanZiZFpSTWRpTWVSDQotRVBETEt2YmREd3drdFRzbA0KLUVQRExLdmJkTGhiTHB4QVMNCi1FUERLanZiZFppcmdwSEJmDQotRG9Da0t2YmRtdHVaa0pxZg0KLURuYmpqdmJkd1drYVdBdXUNCi1EbmJqanZiZFJEY0JQcUVTDQotRG5ia0t2YmR5emVOcWdpSQ0KLUVPYmpqdmJkWWtyRVVPTG0NCi1Eb0NrS3ZiZG10dVprS1JmDQotRG9Da0t2YmROZGN0SWhrRQ0KLURuYmpqdmJkaHl0ZkxxT0cNCi1FT2NMS3ZiZGRaeVB3eHBiDQotRVBDamp2YmRZemJlcWl2Wg0KLUVPY0tqdmJkd3lnZkdYZVMNCi1FT2NMS3ZiZFJvc2ZpZkVYDQotRVBDa0t2YmR6bm9wZGJreA0KLUVPYmtLdmJkVkJCcVNxU1oNCi1FT2JqanZiZFFseENaTnR6DQotRVBDa0t2YmRobEZEbXRieQ0KLURvRExLdmJkQ0RwQXZKbUcNCi1FUERLanZiZGRlT3JDWERLDQotRU9jTEt2YmRyb3ZPakRXRw0KLURuYmtLdmJkSUdmeXlZWUgNCi1FT2JrS3ZiZG1iS1d3bm11DQotRU9jTEt2YmRrRExqcUd1SA0KLUVQRExLdmJkcXJVa05qYU4NCi1FUERLanZiZHVERFZYV1BQDQotRU9iamp2YmRabm5KRkV6Sw0KLURuYmpqdmJkYVJmQ2d0R0wNCi1Eb0NrS3ZiZEdLZHNESGx1DQotRG5jS2p2YmRxbHlpeU1IaQ0KLURvRExLdmJkU0xZZXRnTFQNCi1EbmJrS3ZiZFpRbGVKTkVxDQotRU9jTEt2YmRaTHJFVG5NTg0KLURuYmpqdmJkaVV5ZHdSdUMNCi1FT2JqanZiZG5Qell2TFliDQotRVBDamp2YmRHWXVVYUVZQw0KLUVPYmpqdmJkQUNxd2l5aVENCi1EbmNLanZiZElIR3paWVhnDQotRG5jS2p2YmR4cm5JbHFhZw0KLURuYmpqdmJkeVNtaGxxYWcNCi1Eb0NqanZiZFNDRUZNSlpMDQotRU9iamp2YmRTS3hmVWZqcw0KLURuYmpqdmJkblV0eWpqUmYNCi1EbmNMS3ZiZGt5VFJzWkd0DQotRG9ETEt2YmRXUm5YYkVsRA0KLUVPY0tqdmJkanZYTmNiWVgNCi1FT2NLanZiZGRqS1NXVXpuDQotRG9ES2p2YmR2QkR4cm5lSQ0KLUVPY0xLdmJkZG5kc0t0VHINCi1Eb0RMS3ZiZFpqVEhwR2JHDQotRG5ia0t2YmRwZkRkc3VhSQ0KLUVQQ2tLdmJkZk1mV2dOSmsNCi1Eb0NrS3ZiZGpKZWdqTlhyDQotRG9ES2p2YmRjVERMVGRLQg0KLUVQRExLdmJkd3pIZkZ4RXINCi1EbmNLanZiZGZNZldnTWlrDQotRG5ia0t2YmRyYkZsbEdrWg0KLUVQQ2tLdmJkQ0lrQ0xKR0sNCi1FT2JqanZiZHVERFV2dk9vDQotRU9jS2p2YmREeFlNVVRzbA0KLUVPY0xLdmJkc1B2T2lidWYNCi1EbmNLanZiZFVzbHRHTHZLDQotRVBDamp2YmR5T1NoWVRJYw0KLURvREtqdmJkdWFFWlNvRWgNCi1EbmNLanZiZExyWE16VXB6DQotRG9Da0t2YmROc1R1ZmVVcA0KLUVPYmtLdmJkTEdHSUJhUXUNCi1FUENqanZiZG1TWlZac0VKDQotRG5jTEt2YmRRZERBb3FEcg0KLURvQ2tLdmJkS0NpY1JKYngNCi1FUENrS3ZiZHh3aGliUVprDQotRG9ES2p2YmRUdk1RSnNhUg0KLURvQ2tLdmJkWXpjR1NKdXkNCi1EbmJrS3ZiZHd5aEdGd2RyDQotRG9Damp2YmRFT2NMS3dERQ0KLURvQ2tLdmJkR0dLUm1odFINCi1FT2NMS3ZiZHJ6TVFUQWduDQotRG9ETEt2YmRKdlZGY2VISg0KLURuYmtLdmJkZk1mV2ZtSmsNCi1FUENrS3ZiZG1hald3bm11DQotRVBDamp2YmR4cm1pTXFhZw0KLUVPY0tqdmJkcVVUZnFxa1UNCi1FT2JrS3ZiZG9BS3p0SGNuDQotRU9ia0t2YmRreVRTVFpIVQ0KLUVQQ2pqdmJkaUNPY0V3UlINCi1EbmJrS3ZiZEdaVXRhRHdiDQotRVBDamp2YmRZT1JBWHVXVQ0KLURvQ2tLdmJkVUx2UEF1b0oNCi1EbmJqanZiZGNTYmpzY2pCDQotRG9ES2p2YmRMclhNeXRweg0KLURuY0tqdmJkSXJ5QlROWU0NCi1Eb0NqanZiZFp5RGluQ2tyDQotRVBETEt2YmRab09KRkV5ag0KLURuY0xLdmJkYWprZk9tY0ENCi1FUERMS3ZiZFJOWUNZbXR6DQotRG9Da0t2YmRkZVBSYXdESw0KLUVPY0tqdmJkYlViSFlLdEkNCi1FUENqanZiZGJyYmpzY2pCDQotRVBES2p2YmRLREpjUktDeA0KLUVPYmpqdmJkcWNkaVFPVmENCi1FUERLanZiZFpqVElQZ0JmDQotRG5iamp2YmRyU1VqbWphTg0KLURuYmpqdmJkRVh4THNzdE0NCi1FUENrS3ZiZEZqZVNiZ2x1DQotRG5ia0t2YmRMcXdNeXRweg0KLURvREtqdmJkVUd6bk1YVmUNCi1FT2JrS3ZiZHBzdEhSckxVDQotRG9ES2p2YmRZVExhTlVQWQ0KLURuYmtLdmJkR0tkcmJoTlYNCi1FT2JqanZiZFJNeENaTnR6DQotRG5jTEt2YmREaWhKdXdqQQ0KLUVQQ2pqdmJkT0ZEdEpJa0UNCi1EbmJrS3ZiZGxpRVVRdVNCDQotRG9ES2p2YmRrQ2trUWZ0Zw0KLUVQQ2tLdmJkR1pWVkFjd2INCi1FT2JqanZiZGt5VFNTeGdVDQotRVBES2p2YmRJcnlCU2x4TQ0KLUVPY0tqdmJkV0lYdlhmeHoNCi1Eb0RMS3ZiZGhmakN5V0tWDQotRG9ES2p2YmROUVhwdW1mcw0KLURuY0tqdmJkaU1FY25WQ3kNCi1FUERMS3ZiZHhWTWVSWkxuDQotRVBDa0t2YmREb0RLandERQ0KLURuYmtLdmJkU0NFRkxpWkwNCi1Eb0NqanZiZHFZb0hnUWN4DQotRU9iamp2YmR4WmhGZXhGUw0KLUVPY0xLdmJka0RNTFJHdUgNCi1FUENrS3ZiZFZ3Slh2RGRnDQotRG9Damp2YmRqaEhMZWZPTA0KLUVPY0xLdmJkaUNPY0ZXcHENCi1EbmJqanZiZHJvdk9qQ3ZHDQotRG5jTEt2YmRSektIc0N2QQ0KLUVQQ2tLdmJkRG9ETEt3REUNCi1FT2NLanZiZHJOWmpaTGhKDQotRU9iamp2YmRUQUZJaEJvRQ0KLURuY0tqdmJkbHF5VlpzRGkNCi1EbmNMS3ZiZGpnZ01GZW5MDQotRVBETEt2YmRVc2x0R01XSw0KLURvQ2pqdmJka3lUUnNaR3QNCi1FT2NMS3ZiZHJ6TVBzQkhuDQotRVBDa0t2YmRkWnhwWVlwYg0KLURuY0xLdmJkR0tkc0NnbVYNCi1EbmJrS3ZiZHZBZFlzUEVoDQotRG9ETEt2YmRxVVVHclNLdA0KLUVQQ2pqdmJkeG5USHhUSWMNCi1FT2NLanZiZFppc0lRR2FmDQotRG5jTEt2YmRCaGpiTEpGag0KLURvQ2tLdmJkSlN5QlROWU0NCi1EbmJqanZiZG1mZHdsbWdaDQotRU9jTEt2YmRKY0pjUkpieA0KLURuY0xLdmJkbW95eVdMWWINCi1FT2JqanZiZFNLeGZVZmtUDQotRU9iamp2YmRsQWxubUFMQQ0KLURvRExLdmJkVGxWbmFWb0oNCi1FT2NLanZiZG5DS1d3bm5WDQotRVBDamp2YmRqYmtrUkd0Zw0KLUVQQ2pqdmJkVUx1b0JWb0oNCi1FUERLanZiZHdNdkFNY2VODQotRG5ia0t2YmR6bm9wZGNMeA0KLUVQQ2tLdmJkZXV6d29penMNCi1FUENqanZiZHBzc2ZyUmp0DQotRU9jS2p2YmRpR2lieVdKdQ0KLURuYmtLdmJkWVNsQk5Ub1kNCi1FUERLanZiZGtWd05jYllYDQotRG9Damp2YmRzUHVvSmNWZg0KLURuYmtLdmJkcmJHTkxnTFoNCi1EbmJrS3ZiZFJiRUZNSllrDQotRU9iamp2YmRxY2VJb25WYQ0KLURuYmtLdmJkVHBxUFV1SG0NCi1FT2NMS3ZiZFZ2aVh2RUVnDQotRU9jTEt2YmR2QWN4cm5kaA0KLURuYmpqdmJkVFlLa216a1kNCi1FT2NMS3ZiZHVEQ3VYVm5vDQotRVBDa0t2YmRFdllwUGxpZQ0KLURuY0xLdmJkYVNHQ2d0RmsNCi1Eb0NqanZiZHBmRGR0V0JJDQotRG5jTEt2YmRIRGtXSmJKag0KLURuY0xLdmJkcVpPZ2ZwZFkNCi1FUENrS3ZiZEZ4dVZCRVhiDQotRG9ES2p2YmRuQml2d25uVg0KLUVQQ2tLdmJkUldtY2JraEQNCi1FT2JqanZiZGZJS3ZTT1FnDQotRG5ia0t2YmRjSWxpa0dXeA0KLUVPY0tqdmJkUWREQlFRZFMNCi1FUENqanZiZG5QelpXS3lDDQotRG5ia0t2YmRaeGNpbWJrcg0KLURuY0xLdmJkTEZmSGFhUlYNCi1Eb0NqanZiZFlTbEJOVG9ZDQotRG5iamp2YmRLQ2ljUktEWQ0KLUVQQ2tLdmJkZG5lU2p0VVMNCi1FT2JqanZiZG1JY3RSVXFhDQotRG5jS2p2YmRZcU1kaU5GUg0KLURuYmpqdmJkdWFEeVRQRkkNCi1FUENrS3ZiZGVQRXNMVHRTDQotRVBDa0t2YmRiVWFnWUtzaA0KLURvRExLdmJkc3NTU3h6RkQNCi1FT2JrS3ZiZE11U3JMTkFYDQotRVBETEt2YmRkZG5xYldiag0KLURuYmtLdmJkdkFjeVNuZUkNCi1FUERLanZiZGF0Ykd4TFVJDQotRU9jTEt2YmRkZVBSYldiag0KLURvRExLdmJkaWpHSUtOWVMNCi1FUENqanZiZE5yc3VnRXRwDQotRU9jTEt2YmR4WmhHR1lFcg0KLURuYmtLdmJkVGt2UEF2UEoNCi1Eb0NqanZiZEZ5VXVBY3diDQotRG5iamp2YmRKVFpCVE14TQ0KLUVQRExLdmJkYU1rQ1N0bUgNCi1FUERMS3ZiZGpLR0hpbVlTDQotRG5ia0t2YmRlbGV3R2xpaw0KLUVPYmpqdmJka0hnTUdHT0wNCi1FT2JrS3ZiZFVSUlBVdUhtDQotRU9jTEt2YmRqS0ZoS05ZUw0KLUVQRExLdmJkaHl1RmtwbkcNCi1FT2NMS3ZiZFJvc2dKZWN3DQotRG9Damp2YmRjellveFlxQw0KLURuY0xLdmJkemFBUEdnQ00NCi1FUERLanZiZGlVekV3U1ViDQotRG9Damp2YmRLUXpFbmVtZQ0KLUVPYmpqdmJkYXRhZ1hrVGgNCi1Eb0NqanZiZHd0bGRxWWtuDQotRU9jS2p2YmRVeGdzekxPbg0KLUVQQ2tLdmJkVWFCcHJwcloNCi1FT2NMS3ZiZFlOcUFZVlZ0DQotRU9iamp2YmRiVWFmd2tUaA0KLUVQRExLdmJkY0lsakxHV3gNCi1EbmJqanZiZE5IRFBsb3RrDQotRU9jTEt2YmRrSUhNRmZPTA0KLUVQREtqdmJkZGVQU0NYREsNCi1FT2NMS3ZiZGJVYWZ4TFRoDQotRG9ES2p2YmRRbHdheG10eg0KLURvQ2tLdmJkYlFISEVMemQNCi1FUERMS3ZiZGhmaWNaV0tWDQotRG9ES2p2YmRxclZMT0xBbQ0KLURvQ2pqdmJkdUREVXZ2UFANCi1FUENqanZiZENFUUF1aWxmDQotRU9jTEt2YmRFQVNJbHl3WA0KLURuY0xLdmJkUk5YYXlOdHoNCi1FT2NLanZiZFZyT1hhZU1EDQotRVBDamp2YmRGV1lvcE5LRg0KLURuYmtLdmJkU1FUZmpGY3cNCi1Eb0RMS3ZiZEpUWkFzTXdsDQotRG9Damp2YmRpQ1BERXZwcQ0KLURuY0tqdmJkVndJd3VjZUgNCi1FUERMS3ZiZEp2VkZjZGZpDQotRVBDamp2YmRjYlNsckFUbQ0KLURuYmpqdmJkcUJKRkFYSUUNCi1FUENrS3ZiZFRBRkpIYk9kDQotRVBDamp2YmRjVENrVUVLQg0KLUVQQ2tLdmJkeHdoaWJQekwNCi1FUENrS3ZiZFJwVGZpZkVYDQotRVBETEt2YmR2QWRZc09lSQ0KLURuY0tqdmJkcHhuZ2ZwZFkNCi1FUENqanZiZEVYd2tzc3RNDQotRG5ia0t2YmROcnN1ZmVVcA0KLURuYmtLdmJkSktFQUpvZ0UNCi1Eb0NrS3ZiZE5zVVdHZHVRDQotRG9Da0t2YmRicmNMVGNqQg0KLUVPY0tqdmJkaUhKY1pWaXUNCi1FT2JrS3ZiZEV6dFFka2NKDQotRG9Damp2YmRsaUVUcHRxYQ0KLUVPY0xLdmJkT0VkVUloamQNCi1Eb0NrS3ZiZFNLeGZWR2tUDQotRVBDamp2YmRJc1pBc014TQ0KLUVPY0tqdmJkWnNpSXlEc08NCi1EbmNMS3ZiZHVEQ3R3V09vDQotRG5ia0t2YmRFenRRZGxDaQ0KLURuYmpqdmJkTFpRalN6dGYNCi1Eb0RMS3ZiZFhtcUFYdVZ0DQotRVBDamp2YmR4c09KTlNDSA0KLURvRExLdmJkUmFkRWxKWkwNCi1FT2NMS3ZiZFdSblhiRWtjDQotRG5jS2p2YmRTQ0VGTGlZaw0KLUVQRExLdmJkaWRrSFZQQU8NCi1Eb0NqanZiZGtDbEtxR3RnDQotRVBES2p2YmR1THhYQlVBdw0KLURuY0xLdmJkcVVUZnFxa1UNCi1FT2JqanZiZGNJbUtLZXZ4DQotRG9ETEt2YmRNZ0NwTXBWTA0KLURuYmpqdmJkdFRSc1l5ZGMNCi1EbmJrS3ZiZEtlZkhiQlF1DQotRU9jS2p2YmR1b1R6cGpudA0KLURvQ2pqdmJkanV3TmNhd3cNCi1EbmNLanZiZFRrdlBCVm5pDQotRVBETEt2YmRhcEdmZEx6ZA0KLUVQREtqdmJkdkFkWlRQRWgNCi1FUENrS3ZiZHdYTGFWYVdWDQotRU9jS2p2YmRab05oZGR5ag0KLURuY0tqdmJkcWNlSW9uVmENCi1EbmJqanZiZEl3c2JIa3FRDQotRG9ES2p2YmRqRktmdVBBTw0KLUVPY0xLdmJkYmhtSmtGdngNCi1EbmNLanZiZER4WU1VVVRsDQotRG5iamp2YmRNZmJwTlFWTA0KLURvRExLdmJkWmVYZnpoSWINCi1FT2NMS3ZiZFZBYlJTcHF5DQotRG5jTEt2YmRaeGNqT0Nrcg0KLUVPY0tqdmJkeVROaU5TQ0gNCi1FT2JrS3ZiZGlMZGRPVWNaDQotRG9Damp2YmRkd3lzdFJleg0KLURvREtqdmJkVXNtVGVsV0sNCi1FUERMS3ZiZEVQQ2prV2NFDQotRG9ES2p2YmRJd3NhZ2xRcA0KLUVPYmtLdmJkR2NqdkpiS0sNCi1Eb0NrS3ZiZFJ6SmdyYnZBDQotRU9ia0t2YmRreHNTU3hmdA0KLURuY0xLdmJkZkhqdlNOcGcNCi1EbmJrS3ZiZHhzTmlNcWFnDQotRG9ETEt2YmRjSW1LS2V2eA0KLUVPY0xLdmJkSnV0ZkRkZ0oNCi1Eb0RMS3ZiZGhhbmNFd1JSDQotRU9ia0t2YmRuUHpZdkt5Qw0KLURvREtqdmJkTkhEUGxvdUwNCi1FUENrS3ZiZEthS2dNYlhxDQotRU9jTEt2YmRxVVRnU1JrVQ0KLUVQQ2tLdmJkWmpTZ3BIQmYNCi1EbmNMS3ZiZEhmZnpZeFhnDQotRG9Da0t2YmRGa0VyYmhNdQ0KLUVPYmpqdmJkaGFuY0V3UXENCi1FUERLanZiZEpZVUNIa3BwDQotRVBES2p2YmR0a3d3QlVBdw0KLUVPY0xLdmJkaVp1R01STmYNCi1FT2JrS3ZiZHJKQUtFbG5lDQotRG5iamp2YmRJSEhaeHd3Zw0KLUVQREtqdmJka0hnTUdHTmsNCi1Eb0NqanZiZGVPZVNqdFVTDQotRG9ETEt2YmRKYmljUWpDeA0KLURuY0tqdmJkbkdlWGxuR3kNCi1FUERLanZiZEtWdGVjZGZpDQotRU9jS2p2YmRVTHVvQlZuaQ0KLURuYmtLdmJkbUpEdFJWUmENCi1EbmNMS3ZiZEpUWkFzTXhNDQotRVBES2p2YmRWZ3hWeEhZeg0KLUVQQ2pqdmJkVkJDUlNxU1oNCi1FUENqanZiZEpxWmRuZk9GDQotRG5jS2p2YmRxZEVpUU9WYQ0KLURuYmtLdmJkWkxxZFRuTG0NCi1FT2NLanZiZHpIWk1BTkZYDQotRG5jS2p2YmRWck54QmRrYw0KLURuYmpqdmJkS2tBZ3ZBS1oNCi1EbmJqanZiZG1iS1d4T25WDQotRG9ES2p2YmRZcU1lSW1FcQ0KLUVPYmpqdmJkYlVhZ1lLdEkNCi1EbmNLanZiZFFaTkFIU3FqDQotRG9ETEt2YmRmb2F6dmN3aA0KLURuYmtLdmJkVnZod3ZEZGcNCi1Eb0RLanZiZFVSUW9VdGhODQotRVBETEt2YmR2QkR5VE9lSQ0KLURuYmpqdmJkclJ1S21rQk4NCi1EbmJrS3ZiZFJiRGRsSXhrDQotRU9iamp2YmRTQ0Rka2h5TA0KLURvREtqdmJkU0JjZU1KWWsNCi1Eb0RMS3ZiZHd5aEdHWUZTDQotRVBES2p2YmRRdm1jYmxJRA0KLURvRExLdmJkYWFXRkdRUVgNCi1Eb0RLanZiZEVBU0ltWnZ3DQotRVBETEt2YmRuUVp5V0xZYg0KLUVQREtqdmJkYnJjTFVFSmENCi1FT2NMS3ZiZEtDaWNRakRZDQotRVBDamp2YmRWQkNRc1FxeQ0KLUVQQ2tLdmJka2FOUE5BTEENCi1EbmNMS3ZiZGFOS2FydG1IDQotRG9ETEt2YmRDVEFidEZ2cg0KLUVPYmpqdmJkZFp4b3d4cGINCi1FT2JrS3ZiZFRwcU91VWdtDQotRG5jTEt2YmRaUWxlSk5GUg0KLURuYmpqdmJkVVZsUGlzYVINCi1FT2JqanZiZEJzQkN0RnZyDQotRVBDamp2YmRKdXRlY2RnSg0KLUVPY0tqdmJkZk5GdmdOS0wNCi1EbmNLanZiZGRuZVNqdFVTDQotRG9ES2p2YmRqY01LcUd0Zw0KLUVPY0xLdmJkR2RMV0tDS0sNCi1FT2NLanZiZFJEY0JQcGRTDQotRG9Da0t2YmRhdUNHd2tUaA0KLUVQQ2pqdmJkYU5MQ1N0bUgNCi1FT2NLanZiZGVsZldnTWpMDQotRG9ETEt2YmR0U3JTeHllRA0KLUVQQ2pqdmJkZW1HWEdtS0wNCi1FT2NMS3ZiZHVEQ3VYV09vDQotRG5jS2p2YmRhdUJmeExVSQ0KLURuYmpqdmJkSUhHeXlYd2cNCi1FUENqanZiZEV2WW9vbGpGDQotRU9iamp2YmRkbmVUTFVUcg0KLURvQ2pqdmJkeVNtaU5SYWcNCi1Eb0RLanZiZHFVVUhTUmp0DQotRU9iamp2YmRjellwWHhwYg0KLUVPYmtLdmJkYU1rQnJ0bGcNCi1FUERMS3ZiZG5VdVprS1JmDQotRG9ES2p2YmRjU2NLc2RKYQ0KLUVQQ2pqdmJkc3JyVFl5ZGMNCi1FT2JqanZiZFpvTmlGRXlqDQotRVBETEt2YmRtdHR5amlyRw0KLUVPY0xLdmJkWXFNZUlsZVINCi1Eb0RLanZiZEtXVWZFRkdpDQotRU9jTEt2YmRjeXhveFlxQw0KLUVPYmtLdmJkTmVFVGlKTEUNCi1FUENrS3ZiZFVNV09hVm9KDQotRVBDamp2YmRXU09YYkVsRA0KLUVQQ2tLdmJkTkhDcE5QdUwNCi1FT2JrS3ZiZEV1eVFRTkplDQotRG9Da0t2YmRtZ0V4Tk9HeQ0KLUVPY0tqdmJkWnRKSlljc08NCi1FT2NMS3ZiZE1wWHFWbkdzDQotRU9iamp2YmRic0RMVGNqQg0KLUVQQ2pqdmJkZG9GVExVVHINCi1FT2NMS3ZiZGFOS2JUVk5IDQotRG9Damp2YmRKY0tDcGljWQ0KLURvRExLdmJkc0JmTWxHankNCi1FUERLanZiZHFpQUpkbG5lDQotRU9ia0t2YmRLZWZIYWFSVg0KLURvRExLdmJkYmlOSmpld1kNCi1FUENrS3ZiZFZUbHRGbFdLDQotRG9ETEt2YmRiQldGR1BwWA0KLURuY0xLdmJkVlpJVHpLb08NCi1FUENqanZiZG5VdHpMS1NHDQotRVBDa0t2YmRCcmFEVGV2cg0KLUVQRExLdmJkVGt1bmFXUEoNCi1FT2JqanZiZFpSTkZKTkVxDQotRG5ia0t2YmR4VWxkcVlrbg0KLUVQRExLdmJkdHZPWUpwc0ENCi1FT2NMS3ZiZEp2VWZFRWdKDQotRG9ES2p2YmRsWXJxc1pHdA0KLURuY0tqdmJkZVBGU2pzdFMNCi1FUERMS3ZiZHFxdUxPTEFtDQotRG9Da0t2YmRTUHRIS0ZkWA0KLURvQ2pqdmJkWnlEak5jTVMNCi1FUERLanZiZFRsVm5hV1BKDQotRVBDamp2YmRaaXJncEhDRw0KLUVPYmtLdmJkTlFZUXZOZnMNCi1EbmNLanZiZHFxdGpuTEJODQotRG9ES2p2YmRqSmVoSm1ZUw0KLURuY0xLdmJkck5aaXhsSGkNCi1FUERMS3ZiZE1mY1BscFZMDQotRVBDamp2YmRVV01RSnRCUg0KLURvQ2tLdmJkZk1mV2ZsakwNCi1EbmJqanZiZGFSZkRIdEZrDQotRG5jTEt2YmRpTUZEblZEWg0KLURvQ2tLdmJkWHJrYU5Ub1kNCi1Eb0NqanZiZFpMcWRVTmxODQotRU9ia0t2YmRSanhldGZrVA0KLUVPY0xLdmJkbWdGWG1PR3kNCi1FUERLanZiZFVRcG50dUhtDQotRG9ES2p2YmRwc3RIUnJLdA0KLURuY0xLdmJkSGthem13UkwNCi1FT2JqanZiZHBmRUZVV0FoDQotRG9ES2p2YmRaeUVKbkRNUw0KLUVPYmtLdmJkaUJvQ2VYUXENCi1Eb0NrS3ZiZGVBVHBseEtHDQotRG5jTEt2YmRXUm13YWRrYw0KLUVQREtqdmJkVVFxUFV0aE4NCi1Eb0NqanZiZG5CalhYbm11DQotRVBETEt2YmRaalRJUGZiRw0KLUVQQ2tLdmJkV0h3dXhHeHoNCi1EbmNLanZiZFlwbUZKTWRxDQotRG9ES2p2YmRoYlBERlhSUg0KLURuYmtLdmJkQmRRQlZpbUcNCi1Eb0NqanZiZG1JY3RSVXFhDQotRVBES2p2YmRaeURqTmJrcg0KLUVPY0xLdmJkUVltQUhTcksNCi1EbmJqanZiZHFZb0hnUWN4DQotRG5jS2p2YmRxaUFLRk1vRg0KLURuY0tqdmJkT1RVV0hFdVENCi1Eb0NqanZiZFZUbVRmTHVqDQotRG9Da0t2YmRkZG9SYldjSw0KLUVQREtqdmJkSXNZYVROWU0NCi1FT2JrS3ZiZFJvc2ZpZWRYDQotRU9jS2p2YmRjVERMVUVLQg0KLUVPY0xLdmJkbW96WXVqeGINCi1EbmJqanZiZFppcmdvZ0JmDQotRVBDamp2YmRLV1VlY2VISg0KLURuYmpqdmJkWm9PSkVkeksNCi1FUERLanZiZEVKaEtWd2pBDQotRG9Da0t2YmRmcEJ6dmN4SQ0KLURvREtqdmJkbHJZdHlzRGkNCi1Eb0RMS3ZiZFpqU2dvZmJHDQotRG9Damp2YmRVdE10R01Wag0KLUVQQ2pqdmJkR0dLUm1pVHENCi1FUENrS3ZiZFF2bkRjTUlEDQotRG5ia0t2YmRLQ2pDcUpieA0KLUVQQ2tLdmJkWXBsZUltRXENCi1Eb0RMS3ZiZGpLRmdqTlhyDQotRG9ETEt2YmRac2hoeGNybg0KLUVQRExLdmJkblZWWmpqUmYNCi1FT2NLanZiZHFkRklwTnVhDQotRG5iamp2YmRWd0l4VmRFZw0KLURvQ2tLdmJkdWFFWlNuZUkNCi1EbmJrS3ZiZHpub3FGQ2xZDQotRG9Damp2YmRvQUt6c2djbg0KLUVPY0tqdmJkU0xaR1ZHa1QNCi1EbmNLanZiZGlDT2JlV3FSDQotRVBDamp2YmRXUm5YYkVrYw0KLUVPYmpqdmJkUm90R2llY3cNCi1FT2JrS3ZiZEtES0RRaWJ4DQotRG5iamp2YmRsWXNSc1lmdA0KLUVPY0tqdmJkVWFCcVNwcloNCi1Eb0NqanZiZGhrZGNtdURaDQotRU9jS2p2YmRqZ2ZsRmZOaw0KLURvQ2pqdmJkR0tkcmNJTlYNCi1FT2NMS3ZiZEVKZ2pWeEtBDQotRU9ia0t2YmRTeEtrbXprWQ0KLURuYmpqdmJkc1prb3NCSU8NCi1Eb0NqanZiZEJ2emNoZVB2DQotRU9ia0t2YmRHWXR1QkVYYg0KLUVQREtqdmJkaUxlRU50YnkNCi1FUENrS3ZiZFJOWGJZblV6DQotRU9iamp2YmRmSGtXUm5RZw0KLUVPYmtLdmJkdUREVlhXT28NCi1Eb0NrS3ZiZEpiakNxSmJ4DQotRVBETEt2YmRwZWRGVHZCSQ0KLURuY0xLdmJkakplZ2pNd3INCi1FUENqanZiZFV4Z3N6TFBPDQotRU9ia0t2YmR4bXJoWHNKRA0KLUVPY0tqdmJkSlN4YVNtWGwNCi1FUERMS3ZiZGZORndHbUprDQotRVBES2p2YmRzcnJUWXlkYw0KLURuY0tqdmJkaGdLRFpWalYNCi1FUENrS3ZiZFpNUmN0TmttDQotRG9ES2p2YmRlenV5RWh0WA0KLUVQQ2tLdmJkRVh3bFVUc2wNCi1FUERMS3ZiZGVBVVFseEtHDQotRG9ES2p2YmRabm1pRWR5ag0KLUVPYmtLdmJkcnpNUHJhSU8NCi1FUENqanZiZHh4SWliUHlrDQotRVBDa0t2YmRLZkZnYkJSVg0KLURvREtqdmJkeXplT1JoSWgNCi1EbmJrS3ZiZGJBdkZHUHBYDQotRG5jS2p2YmRab09KRWR5ag0KLURuYmtLdmJkckpBSmRtT2UNCi1Eb0RLanZiZEtWdUZkRWZpDQotRU9jS2p2YmRxZEZKUU52Qg0KLUVQRExLdmJkT0VjdEloa0UNCi1FUERMS3ZiZHZCRVlzT2VJDQotRG5jS2p2YmRIRUxWakJqSw0KLURuY0xLdmJkWnNoaHlEc08NCi1FUERLanZiZEdkS3VpYkpqDQotRG9Da0t2YmRFWVhrc3RVTQ0KLURuYmpqdmJkSnB5ZU9mTmUNCi1FUERLanZiZHpvUHBkYmt4DQotRG9Da0t2YmRNU1hNeXRweg0KLURuY0xLdmJkcVpPZ2dRY3gNCi1Eb0RLanZiZG11VXlqaXJHDQotRG5ia0t2YmROVlNxa05BWA0KLURuY0xLdmJkUm90SEpmRVgNCi1FT2NLanZiZFp5RUpuQ2tyDQotRVBETEt2YmR5WUpLQnBaaw0KLURuYmtLdmJkeG1yZ3hUSkQNCi1EbmJrS3ZiZGhhb0RGV3FSDQotRG5jS2p2YmRiaG1KamV2eA0KLUVPYmpqdmJkU0t5R1ZHanMNCi1EbmJqanZiZFNLeGZWSEtzDQotRG5iamp2YmRxZEZJb211YQ0KLURuYmtLdmJka0hmbEdHT0wNCi1Eb0RMS3ZiZHFHRGVVVmFJDQotRU9iamp2YmRqbUJsWmVIUA0KLUVQQ2tLdmJkbXR0eWtKckcNCi1EbmNMS3ZiZFJYT0VETGdjDQotRG9ETEt2YmRoYW9ERldxUg0KLURvREtqdmJkdnZrYVdBdXUNCi1Eb0NrS3ZiZGJobUtLZld4DQotRU9iamp2YmRTQmRGTUpaTA0KLURuYmpqdmJkblV1WmpqU0cNCi1FUERMS3ZiZGxpRHRRdVNCDQotRU9jTEt2YmRzQ0ZtTUdqeQ0KLURuYmpqdmJkdHVuWGpRc0ENCi1FT2JrS3ZiZGtDa2pxSFVnDQotRU9iamp2YmREb0NrS3ZiZA0KLURuYmtLdmJkaVp1RmxST0cNCi1FT2NLanZiZFJOWUNaTnR6DQotRU9jTEt2YmR4VW1FcHhsTw0KLUVQQ2tLdmJkZGVQU0J3REsNCi1FT2NMS3ZiZGF1QmZ4S3NoDQotRG9Damp2YmR0a3d3QlRhWA0KLUVPYmpqdmJkbWdFd21OZnkNCi1EbmJqanZiZE9TdFdIRXVRDQotRVBDa0t2YmRHTEZUQ2hOVg0KLUVQQ2tLdmJkS0RKYnBqRFkNCi1Eb0RMS3ZiZG5QelpWanhiDQotRG9Damp2YmRGVnlQb21KZQ0KLURuY0xLdmJkQUNxd2l6SXANCi1FUENrS3ZiZFppcmhRR2FmDQotRG5jS2p2YmR0VFJzWlplRA0KLUVPYmtLdmJkTEJMSE1iWVINCi1FT2NMS3ZiZHJOWmpaTGdpDQotRU9iamp2YmRUWGtMbXprWQ0KLUVQQ2tLdmJkQnNBYnNmWFMNCi1FT2NLanZiZGVBVHBtWGlmDQotRG9Da0t2YmRNU1dtWnVReg0KLURuY0xLdmJkVlRtVGZNVmoNCi1Eb0RMS3ZiZFp4ZEtPRE1TDQotRVBES2p2YmRaalNoUGdDRw0KLUVQRExLdmJkeFZNZHB4a24NCi1FUERMS3ZiZGNTYmpzZEtCDQotRVBETEt2YmRpaWZJSmx3cg0KLURvREtqdmJkS1F5ZG9GbkYNCi1FT2JrS3ZiZGVna1dSbXBnDQotRU9ia0t2YmRpQm5jRlhRcQ0KLURvRExLdmJkTmRjdEpKTEUNCi1FT2NLanZiZFV5SHN6S25uDQotRU9jTEt2YmRTUVVIS0Zjdw0KLUVPYmtLdmJkVWFCcVNwcloNCi1Eb0NrS3ZiZFNDRGVMaVpMDQotRVBDa0t2YmRLREtDcGpDeA0KLUVQRExLdmJkd3lnZkZ3ZVMNCi1Eb0RLanZiZGlWWmVXcXRiDQotRG9Damp2YmRNUndNeXVReg0KLURvQ2pqdmJkc0NHTkxma1oNCi1Eb0NrS3ZiZG1SeHVac0VKDQotRVBDa0t2YmRrRE1MUkd0Zw0KLUVPYmtLdmJkR2RLdWliSmoNCi1FUENrS3ZiZGVQRlRMVVRyDQotRU9jS2p2YmRYcmxBbHNvWQ0KLURvRExLdmJkWmpUSG9nQmYNCi1EbmJqanZiZFppcmhRR2FmDQotRVBDa0t2YmRGVnhvb2xqRg0KLURvQ2tLdmJkYktrZW9OY0ENCi1Eb0RLanZiZHFZbmdmcUVZDQotRVBETEt2YmRyV29rY0pZcQ0KLURvQ2tLdmJkTW93cVZuSFQNCi1FUENrS3ZiZHFxdGpuS2FODQotRG9ETEt2YmRpQ1BERldxUg0KLURvRExLdmJkZUppcXV0em4NCi1FT2JrS3ZiZHFjZGlQbXZCDQotRVBDamp2YmRNZ0NvbVFVaw0KLURvRExLdmJkdVZuWUtRc0ENCi1EbmJqanZiZGpoSExmRm1rDQotRU9jS2p2YmRWdmh3dkVFZw0KLURuYmtLdmJkWnRJaHlFU24NCi1EbmNMS3ZiZHpub3BlQ2xZDQotRVBDa0t2YmR3dGxkcVpMbg0KLUVPY0tqdmJkZUVuckJ3REsNCi1Eb0NrS3ZiZGt4cnFzWkhVDQotRG9ES2p2YmRpakdIaW1ZUw0KLURuY0xLdmJkZk5HV2dNakwNCi1FT2NLanZiZG1iS1d4T25WDQotRVBDa0t2YmRodHpFdnJWQw0KLURvRExLdmJkaGZpYnlXSnUNCi1Eb0NrS3ZiZFhya2FNc29ZDQotRG9Da0t2YmR6b1BwZGJreA0KLUVQRExLdmJkU0xZZXVHanMNCi1FT2NMS3ZiZHFseWl4bElKDQotRU9iamp2YmRuVlZaamlxZg0KLUVPY0xLdmJkeU5yaFhyaUQNCi1Eb0NqanZiZFJqeUZ0Z0xUDQotRU9jTEt2YmRreVRScnlIVQ0KLUVQQ2pqdmJkcnlrcFRCSU8NCi1FT2JqanZiZGxxeHR6U2RKDQotRU9iamp2YmRjYXJtU0FUbQ0KLUVPY0tqdmJkWHNMYU5Ub1kNCi1FT2NLanZiZGxxeHR5c0RpDQotRU9jTEt2YmRhTWtDU3RtSA0KLURuY0tqdmJkYkF2RkdQb3cNCi1FUERMS3ZiZFR1bFFLVGFSDQotRG5jS2p2YmRYR1l6VUFPcw0KLURuY0tqdmJkZXp1eGVJdFgNCi1EbmJrS3ZiZHJ5a3BUQklPDQotRG9Da0t2YmR4blNoWHNJYw0KLURvRExLdmJkRVBDamtYQ2QNCi1EbmJrS3ZiZEl4VUJna3BwDQotRG5ia0t2YmRCaUtiS2hmSw0KLURvREtqdmJkS05BRHlnVkINCi1FT2JqanZiZEFEUnhLWmlRDQotRVBDamp2YmRNZmNRTW90aw0KLUVPYmpqdmJkU0JjZGtoeGsNCi1FUERLanZiZE5ydFZnRlZRDQotRVBES2p2YmRaTVJkVG5MbQ0KLUVPYmtLdmJkZWhLdlJuUWcNCi1Eb0NrS3ZiZGxpRVRwdHFhDQotRG9ETEt2YmRFWHdrdFVVTQ0KLUVPYmpqdmJkQmlMQmppRmoNCi1FT2NMS3ZiZFJrWWV1R2pzDQotRU9jS2p2YmRtdHR6S2pSZg0KLUVPYmtLdmJkeHJtaG1SYkgNCi1EbmJrS3ZiZHlYaUphb3lrDQotRU9ia0t2YmR4bXJnd3NJYw0KLURvRExLdmJkaVp0Zk1RbWYNCi1EbmJrS3ZiZHB4b0hmcGN4DQotRU9iamp2YmR1YUVaVE9kaA0KLUVPYmtLdmJkcXF0a05rQW0NCi1Eb0RLanZiZHhtcmd4VEljDQotRG5jTEt2YmRNZ0NvbHBWTA0KLUVQQ2tLdmJkWm5uSkVlWmoNCi1FUENqanZiZFZZZ3N6S29PDQotRVBDa0t2YmRCY3BBdWlsZg0KLUVPYmtLdmJkbGhkVVF1U0INCi1FT2JrS3ZiZE1JYkxweEFTDQotRVBDamp2YmRuVlV5amlyRw0KLURvREtqdmJkS1JaZU9lbkYNCi1EbmJqanZiZHVDYnVYV1BQDQotRG5iamp2YmRzc1JzWXlkYw0KLUVQQ2tLdmJkbGhjdFF0cWENCi1Eb0NrS3ZiZHNRVm9KY1ZmDQotRU9iamp2YmRlZ2tXU05wZw0KLURvRExLdmJkT0FKVFVLU0ENCi1Eb0RMS3ZiZGxpRVVSVlNCDQotRG9ES2p2YmR4c05obHFiSA0KLURuYmpqdmJkT1NzdkdkdHANCi1FUERLanZiZGFhVmVHUG93DQotRU9iamp2YmROZUVUaUlqZA0KLURuYmtLdmJkSktFQUpwSEUNCi1FUENqanZiZEFOSVlzV3pZDQotRG9Damp2YmRqdldtZENYdw0KLUVQREtqdmJkcm91b0pjVmYNCi1EbmJqanZiZGlVekZXcXVDDQotRG5iamp2YmRGeHR1QkVZQw0KLURuYmpqdmJkUmtZZlZITFQNCi1FT2JqanZiZFF3TmNjTUlEDQotRG9Damp2YmRYc01BbVRueA0KLURvQ2pqdmJkakpmSUtNeFMNCi1FT2NMS3ZiZGJpTWlrR1hZDQotRG9Damp2YmRRZERBb3FFUw0KLUVQQ2tLdmJkVndJeFZjZGcNCi1FT2NMS3ZiZENFUUF2S01mDQotRVBETEt2YmR6Uk9tSktYQQ0KLUVQRExLdmJkWkxyRHNuTG0NCi1EbmNLanZiZGpnZ01HRm1rDQotRG5ia0t2YmRkZG5yQnZjSw0KLURuYmpqdmJkcGVjZHN2QkkNCi1FUENrS3ZiZGlqRmdqTllTDQotRU9jTEt2YmRVYUJxVFFxeQ0KLURuY0tqdmJka0hnTUZmTmsNCi1FT2JrS3ZiZFpHdmRBUFNpDQotRG5iamp2YmRxVVRnU1JqdA0KLURvRExLdmJkcXZwTGNJeVINCi1EbmNMS3ZiZExxdmx5dHB6DQotRG5ia0t2YmRLREpicGpDeA0KLURvQ2pqdmJkbHF5VXlyY2kNCi1EbmJrS3ZiZFVRcVBVdUlODQotRU9ia0t2YmRUbFZuYVZuaQ0KLUVPY0xLdmJkTmRjc2hpTEUNCi1FT2JrS3ZiZGtETUxSSFVnDQotRG5jS2p2YmRJeFRiSUxwcA0KLUVQQ2tLdmJkZVBGVEtzc3INCi1EbmJqanZiZGRlT3JDV2NLDQotRG5ia0t2YmRhdGJHeExUaA0KLUVPYmtLdmJkcWx6S1pMZ2kNCi1FUENqanZiZE9UVVZnRlVwDQotRU9jTEt2YmRwZkVGVHZBaA0KLURuY0xLdmJkWm5uSWRlWmoNCi1FT2JrS3ZiZFp4ZEtPRExyDQotRG9ES2p2YmRqZ2dMZkdOaw0KLUVQQ2pqdmJkUkRjQW9wZFMNCi1EbmNLanZiZGxaVFJyeUhVDQotRG5jS2p2YmRac2hpWWRTbg0KLUVQREtqdmJkYXRiSFlMVGgNCi1FUERLanZiZExBamZtQ1hxDQotRVBES2p2YmRPRkVVSWlMRQ0KLURuY0tqdmJkeFZORlF4bE8NCi1Eb0NqanZiZHJhZk5MZmtaDQotRG9Damp2YmRHRmlxbkpUcQ0KLUVQQ2tLdmJkVXNtVUZsV0sNCi1FT2JrS3ZiZExCTEhNYlhxDQotRVBDa0t2YmR0bFlXYVVCWA0KLUVQQ2pqdmJkU1BzZmpHRVgNCi1FT2JqanZiZElqRUFKb2dFDQotRG9ETEt2YmROSENwTlFVaw0KLURuY0xLdmJkWWtxZFVOa20NCi1Eb0NqanZiZHFxdUtta0JODQotRG5iamp2YmRFdXlRUU1qRg0KLUVPY0tqdmJkVVJSUFV0aE4NCi1FT2JqanZiZG1veXh2TFliDQotRU9ia0t2YmRHWXR1QWRZQw0KLURuYmpqdmJkWmVZR3poSkMNCi1Eb0RMS3ZiZENnTGZIQXpjDQotRG9ETEt2YmRodVplWFNVYg0KLURvQ2tLdmJkamxiTVpkZ1ANCi1Eb0NrS3ZiZGVtR1dnTWpMDQotRVBDa0t2YmR4eEpKYW95aw0KLUVQRExLdmJkcUdFRXN1YUkNCi1FT2JrS3ZiZEVLSGpWd2pBDQotRU9jS2p2YmRpQm9ERldwcQ0KLUVQQ2tLdmJkZmZMek5mZ0ENCi1FT2JqanZiZERvQ2prWERFDQotRVBES2p2YmRoZmljWldKdQ0KLURvQ2pqdmJkV1dpWVZkRkgNCi1FUENrS3ZiZEtRekZPZW5GDQotRG9Da0t2YmRtYkp2eFBPVg0KLURuYmtLdmJkdEFIUWhBQXINCi1FUERMS3ZiZG1TWXR6U2NpDQotRVBETEt2YmRkZU9xYXZjSw0KLURvQ2pqdmJkQ0VRQlZqTWYNCi1FUERMS3ZiZGxZcnFzWWZ0DQotRG5ia0t2YmRKU3lCVE5YbA0KLUVQQ2pqdmJkY2JTbVNBVG0NCi1Eb0RLanZiZGZORndHbUprDQotRG9Da0t2YmRHTEVyYmhOVg0KLUVPYmtLdmJkaVp1RmxRbkcNCi1EbmJqanZiZHhVbUVweGxPDQotRVBES2p2YmRVV01QaXRCUg0KLUVQREtqdmJkcmFmTkxmankNCi1FUERMS3ZiZHJXb2xESlpSDQotRU9iamp2YmRoYlBERlhRcQ0KLURuY0xLdmJkcXJVa05qYU4NCi1EbmJrS3ZiZEJpTENLaGVqDQotRG9ES2p2YmRTQ0VGTUl4aw0KLURvRExLdmJkZmZMek5nSEENCi1FUENrS3ZiZFpMcWNzbWttDQotRG5ia0t2YmRaTVNFVU9NTg0KLURuYmpqdmJkemFBUEhIQ00NCi1EbmJqanZiZENJa0JqaGZLDQotRG9Da0t2YmRaaXJncEhCZg0KLURuYmpqdmJkSXd0QmhMcHANCi1FT2JrS3ZiZGVPZVRMVVRyDQotRU9ia0t2YmRVeGdzekxQTw0KLUVPYmtLdmJkaHpWR0xxT0cNCi1EbmJqanZiZE9UVHVmZHRwDQotRU9jS2p2YmRaUk5FaGxlUg0KLUVQQ2pqdmJkS3lSS1N6dUcNCi1Eb0NrS3ZiZFp0SkpZY3NPDQotRU9jTEt2YmRlbUdYR21LTA0KLUVQREtqdmJkSlhzYWhNUXANCi1Eb0RMS3ZiZGhiT2JlV3FSDQotRU9iamp2YmRGVnhwUGxqRg0KLUVPY0tqdmJkYU5MQnJ1TWcNCi1Eb0NqanZiZHB5UElHcGN4DQotRU9jTEt2YmRaTVJjc21rbQ0KLUVPY0xLdmJkbkdlWG1OZ1oNCi1Eb0RMS3ZiZGpsYWxaZUdvDQotRG9ETEt2YmRhU0dESHRHTA0KLUVQQ2tLdmJkQ1RBYnNld1MNCi1FUENqanZiZFpqU2dvZmJHDQotRG5iamp2YmRKdXRlY2RmaQ0KLUVQQ2tLdmJkSXJ5QlNtWU0NCi1Eb0NqanZiZGZla3pPSEhBDQotRG5ia0t2YmRSRURBb3FFUw0KLUVQQ2pqdmJkdFRTVFl6RWMNCi1FUENrS3ZiZG1veXlWa1liDQotRU9ia0t2YmRtZmR4TW5HeQ0KLURvQ2tLdmJkd3VORlF4a24NCi1EbmNLanZiZHNCZWxrZmp5DQotRVBETEt2YmRRdm1kRExoRA0KLUVQREtqdmJkQmhrQ0xKRmoNCi1Eb0NrS3ZiZGVKaXF1dHpuDQotRU9jTEt2YmRxVHNmclNLdA0KLURvRExLdmJkYWtMZk9tY0ENCi1EbmNLanZiZEthTEhNYXdxDQotRVBDa0t2YmR6bm9wZGNNWQ0KLURvREtqdmJkWnRKSXlEc08NCi1Eb0RMS3ZiZHNRVm5qQ3ZHDQotRG5jS2p2YmR1RERVdnVubw0KLURvQ2tLdmJkSllVQ0hsUXANCi1EbmJrS3ZiZG5CaXdZUE51DQotRU9iamp2YmRsWXJxcnlIVQ0KLUVQQ2pqdmJkcWNkaVBuV0INCi1Eb0NqanZiZFVRcG9VdGhODQotRVBES2p2YmRzWmxRVEFoTw0KLUVPY0tqdmJkdGJidHdXT28NCi1FUERMS3ZiZEp1dUdEZGdKDQotRU9jS2p2YmRqZ2dNR0dPTA0KLUVQRExLdmJkSGZmeXh3eEgNCi1FT2NMS3ZiZFNDRUVsSXhrDQotRU9ia0t2YmRJd3NiSGtxUQ0KLUVQRExLdmJkamJranFIVWcNCi1EbmJqanZiZG5RWnh1anhiDQotRVBES2p2YmRkZVBSYldiag0KLURvQ2tLdmJkaHR5ZHdSdUMNCi1Eb0RLanZiZENEb2FXS01mDQotRU9jS2p2YmRSanlHVkdqcw0KLUVPYmpqdmJkZENUTlNBVG0NCi1FT2NLanZiZFpMckVUbWxODQotRVBES2p2YmRsclpVeXNEaQ0KLUVPY0xLdmJkd3RtRlJaTU8NCi1FUENqanZiZHRUUnJ4eWRjDQotRU9iamp2YmRlRlBTQnZjSw0KLURvQ2tLdmJkd3VORlJaTG4NCi1EbmJqanZiZGh5dGZMcG1mDQotRVBDa0t2YmRyeWtwVEFnbg0KLUVPYmtLdmJkUkRjQXBSRHINCi1Eb0NqanZiZFpubkllRlpqDQotRU9jTEt2YmRlUEVya1VUcg0KLURvRExLdmJkcmJHTkxnTFoNCi1FT2JqanZiZFZaSVVaam9PDQotRG5jTEt2YmR6SFlsQU1lWA0KLURuYmtLdmJkYnNETFRjaWENCi1FUENqanZiZE9Tc3VmZHRwDQotRG5jS2p2YmRwc3RIU1NMVQ0KLURuY0tqdmJkdUREVld1b1ANCi1FUERLanZiZGlNRWROdUN5DQotRU9jS2p2YmR0YmNWV3Vubw0KLURvREtqdmJkcVVUZ1JxanQNCi1EbmNMS3ZiZFp5RGpOY0xyDQotRG9ETEt2YmRSV21kRExnYw0KLURuY0tqdmJkWkxxZFVPTU4NCi1Eb0RLanZiZGlqR0lKbHdyDQotRU9iamp2YmR1TVlYQlVBdw0KLURvQ2tLdmJkSERrV0phaksNCi1Eb0NqanZiZFJwVGZpZkVYDQotRG9Damp2YmRVeUhzektubg0KLUVQREtqdmJkcVpQSUdwZFkNCi1FUERLanZiZFJXbWRDa2hEDQotRU9ia0t2YmRzcnJTeVpkYw0KLUVPY0tqdmJkWWxTRHRObE4NCi1EbmNLanZiZGJLa2VubkRBDQotRVBDa0t2YmRpWnVHTVFtZg0KLUVQQ2tLdmJkRXp0UWVMYmkNCi1FUENrS3ZiZGFSZWJnc2ZMDQotRG9Da0t2YmRCY3BBdWlsZg0KLUVPY0tqdmJkeU5zSVlTaGMNCi1FUENqanZiZGNJbGlqZXdZDQotRG9Damp2YmRtYktYWG9PVg0KLURuY0xLdmJkdURDdHdXUFANCi1FUERLanZiZG5DSndYb09WDQotRVBDamp2YmRqY0xrUWdVZw0KLURuYmtLdmJkdGNDdHdWbm8NCi1EbmNLanZiZEdGalJtaVVSDQotRG5jTEt2YmRyV3BMY0pZcQ0KLURuY0xLdmJkS1dWR0RkZmkNCi1FUENrS3ZiZG5VdVprSnJHDQotRVBDamp2YmRpQ1BDZVdxUg0KLURuY0tqdmJkRVlZTVVVVGwNCi1FT2JqanZiZHJwV09pY1dHDQotRG9ES2p2YmRGZWpTT0lzcQ0KLURuYmpqdmJkcWlBSmRtT2UNCi1FT2NLanZiZFV5SVR6S25uDQotRG9ES2p2YmRmTWZXZ01qTA0KLURuYmtLdmJkWHJrYU10T3gNCi1Eb0NrS3ZiZEtlZklCYVJWDQotRVBDamp2YmR5VE5obHFiSA0KLUVQQ2pqdmJkdGxYd0JVQXcNCi1FT2NLanZiZFJvc2ZqRmRYDQotRG9Damp2YmRZcGxkaU1lUg0KLURuYmpqdmJkd3pJRmV4RlMNCi1EbmNLanZiZFNDRGVMaHlMDQotRG5jTEt2YmRyekxwU2FIbg0KLURuY0tqdmJkdUNjVld1b1ANCi1Eb0RMS3ZiZGF0YWdYa1RoDQotRG5ia0t2YmRzQ0dNbEdrWg0KLUVQQ2tLdmJka1dYTmRCd3cNCi1EbmNLanZiZEpjS0NwakN4DQotRU9jS2p2YmROeFBWemROdA0KLUVQQ2tLdmJkS1JaZU9mT0YNCi1EbmNMS3ZiZGNJbGpMR1hZDQotRVBETEt2YmRWaFh1d2Z4eg0KLURvQ2pqdmJkYW9mZmNremQNCi1FT2NLanZiZExoYkxweEFTDQotRG5iamp2YmRuSEV4TW1nWg0KLUVPYmpqdmJkYmhsaktmWFkNCi1EbmJqanZiZGtETGtSR3VIDQotRVBETEt2YmRmSGtXU09SSA0KLUVPYmpqdmJkem9QcUZDbFkNCi1EbmNLanZiZHpub3BkYmt4DQotRU9iamp2YmRuVXR6TEtSZg0KLUVQQ2tLdmJkWlFsZGlNZVINCi1Eb0RLanZiZEZqZVNjSG1WDQotRVBES2p2YmRFT2NMS3dDZA0KLUVQREtqdmJkeXFPbUpLWEENCi1FT2NLanZiZFNRVGZpZWN3DQotRG9ETEt2YmREb0RMTFhERQ0KLURvREtqdmJkaGxFY211RFoNCi1FT2JqanZiZGZIa1dSbXFIDQotRG5ia0t2YmRJR2Z6WXd3Zw0KLURuY0xLdmJkVVdNUGpVQXENCi1FUERLanZiZGtIZmxHR09MDQotRG5ia0t2YmRuUHpaVmp5Qw0KLUVQRExLdmJkU0JjZUxpWWsNCi1EbmNMS3ZiZFV0TXNmTHZLDQotRG5ia0t2YmRicmNMVGRKYQ0KLUVPYmtLdmJkSXd0Q0hrcVENCi1FUERLanZiZHRiY1ZXdlBQDQotRU9ia0t2YmR0YmNWV3VvUA0KLURvREtqdmJkS1Z0ZkVGR2kNCi1FUENqanZiZE1Sdmx5dHB6DQotRG9ETEt2YmR3dU1lUllsTw0KLUVPY0tqdmJkbGhkVHFWUmENCi1FUERLanZiZGlHakN5VmpWDQotRG5iamp2YmRyRGVKUU51YQ0KLURvREtqdmJkcmJGbU1IS3kNCi1FT2NLanZiZGZIanVyTnBnDQotRG5ia0t2YmRaUk5GSk1lUg0KLUVPY0tqdmJkcUZkRXN2QkkNCi1EbmJqanZiZFppcmdvZ0NHDQotRG9ETEt2YmREbmNLandERQ0KLURvQ2tLdmJkamhHbEZmT0wNCi1FT2JqanZiZG1haXZ4T25WDQotRU9ia0t2YmRLa0FoV0FKeQ0KLUVPY0tqdmJkTnJ0V0hFdVENCi1EbmJrS3ZiZEZrRlRDaE11DQotRU9ia0t2YmRlT2RyanN0Uw0KLUVPY0tqdmJkSXdzYkhsUXANCi1Eb0NrS3ZiZGVBVHBtWGlmDQotRU9jTEt2YmRLYUtnTWF4Ug0KLUVPYmtLdmJkVUd6bkx2dkYNCi1EbmJrS3ZiZGJMTUdQT0RBDQotRU9iamp2YmRUa3ZPYVZvSg0KLUVPY0tqdmJkc1FWb0tEVmYNCi1FUERLanZiZHpub3BkY0x4DQotRG9ETEt2YmRwZkRkc3ZBaA0KLURuY0tqdmJkckRkaHBOdWENCi1FT2NMS3ZiZGhmaWNaVmpWDQotRG5jS2p2YmRGeHVWQkVZQw0KLUVQREtqdmJkempWUVFFVFUNCi1FT2JrS3ZiZEtSWmVQR05lDQotRU9iamp2YmREbmNMTFhERQ0KLUVPY0xLdmJkWWtxY3ROa20NCi1Eb0RLanZiZHR2T1lLUlRBDQotRG9Da0t2YmRtYWpXeFBOdQ0KLURuY0tqdmJkSWpFQUpvZmQNCi1FUENrS3ZiZGlDUERGV3FSDQotRU9jTEt2YmRJSEhaeHd3Zw0KLUVPY0tqdmJkWXBtRWlORlINCi1FT2NMS3ZiZFFtWUNaTnR6DQotRU9jTEt2YmRWWWhUeWtQTw0KLUVQQ2tLdmJkSktFQUtQZmQNCi1Eb0NqanZiZFJrWWZVZmpzDQotRVBETEt2YmRsWlRTVFpHdA0KLURvRExLdmJkTkdicE5RVkwNCi1Eb0NqanZiZHZBZFpUT2RoDQotRVBDamp2YmRsaURzcVVxYQ0KLUVQREtqdmJkU1BzZmllY3cNCi1FT2NLanZiZFlsUmNzbWttDQotRG5ia0t2YmR3WE1BdkJWdQ0KLUVQQ2tLdmJkUmp4ZlZHanMNCi1FT2NMS3ZiZENJa0NLaUZqDQotRG9Da0t2YmRkeFpzc3JGeg0KLUVPY0tqdmJkUkVEQXBSRVMNCi1FT2NMS3ZiZFRwcVBWVklODQotRU9iamp2YmRhYVdFZW9vdw0KLUVPY0tqdmJkZGVPckNYQ2oNCi1FT2NMS3ZiZEFNZ3lTdnl4DQotRVBETEt2YmROUHdxVm5IVA0KLUVPYmtLdmJkd3VNZVJZbE8NCi1Eb0NrS3ZiZFRrdW9BdW9KDQotRVBES2p2YmRtSkRzcHVSYQ0KLUVQQ2pqdmJkTkhDcE5RVkwNCi1EbmNLanZiZEdjanZLQmlqDQotRU9jS2p2YmRiUUhIRUx6ZA0KLUVQREtqdmJkUHhtQUdycWoNCi1FUENqanZiZFJiRGRraVlrDQotRVBETEt2YmRUQUZKSGFuZA0KLURvREtqdmJkcW1aalpNSGkNCi1FT2JqanZiZHRTclRZekZEDQotRG5jTEt2YmRobEVjbXRieQ0KLUVPYmpqdmJkbUpFVVF1U0INCi1EbmNLanZiZGRuZHNLc3RTDQotRVBETEt2YmRtZ0ZZTk9HeQ0KLURuYmpqdmJkU0NFRWxJeUwNCi1EbmNLanZiZG1haXZ4T211DQotRG9ES2p2YmRGVnlQb21LRg0KLURuYmtLdmJkTXBYcVdPSFQNCi1FT2JqanZiZEtlZklDQlJWDQotRU9iamp2YmRxR0RkdFdCSQ0KLURuYmtLdmJkQ0pMQ0xJZksNCi1FT2JrS3ZiZExxd05adHB6DQotRG9ETEt2YmRpaWZIak13cg0KLURvQ2tLdmJkZGRvUmF3REsNCi1EbmNLanZiZGJyY0tzY2pCDQotRG5iamp2YmRyU1ZMTmtBbQ0KLURuYmpqdmJkZmZMeW5ISEENCi1FT2JrS3ZiZFRBRkpIYlBFDQotRG5jS2p2YmREbmNLa1djRQ0KLUVPY0xLdmJkcm91b0tEVmYNCi1FT2NMS3ZiZFppc0lQZmJHDQotRU9jTEt2YmRpR2ljWXVpdQ0KLURvRExLdmJkVmd4V1hmeHoNCi1Eb0NrS3ZiZGZmTVptZ0hBDQotRU9iamp2YmRXZlpadEFQVA0KLUVQRExLdmJkRXpzcUVsQ2kNCi1Eb0NrS3ZiZFlTbEFsc29ZDQotRVBETEt2YmRGV1lwUG1LRg0KLURvREtqdmJka05DTVpkZm8NCi1FUERMS3ZiZGVoTFdTT1FnDQotRG5iamp2YmR4eEpLQ1B5aw0KLUVPY0xLdmJkTWZjUU1wVkwNCi1FT2NMS3ZiZG5WVlprS1JmDQotRU9iamp2YmRjellveFpRYg0KLUVQQ2tLdmJkU1FVR2llZFgNCi1Eb0RLanZiZGV1endwSnpzDQotRG9ETEt2YmRxWlBIZnFEeA0KLURvQ2pqdmJkS2VlaENCUXUNCi1EbmJrS3ZiZEFEU1lKeWlRDQotRG9Damp2YmRGa0ZUREhsdQ0KLUVQREtqdmJkWm9PSkVkeksNCi1FUENqanZiZFpqVElRR2JHDQotRG5jS2p2YmRaSFdkQU9yaQ0KLUVQQ2pqdmJkZVh5c3RSZXoNCi1FT2JrS3ZiZEl4VGFna3BwDQotRU9iamp2YmR4WmdmRnhFcg0KLURvRExLdmJkamhITGZHTmsNCi1FT2JrS3ZiZFRmem5NV3VlDQotRG9ETEt2YmRPU3N1ZmVWUQ0KLURuY0tqdmJkVlVOVGVsV0sNCi1FUENqanZiZFpRbUZJbUVxDQotRG5iamp2YmRrQ2xMUWZ0Zw0KLURuYmpqdmJkUlhOZERMaEQNCi1EbmNLanZiZFRxUW9WVWdtDQotRVBDamp2YmROUVlSVm1nVA0KLURvRExLdmJkblV1WmppcWYNCi1Eb0RLanZiZGJzQ2pzZEphDQotRU9jS2p2YmRGa0VzRElOVg0KLURvREtqdmJkeU9USHhTaUQNCi1FT2NLanZiZGtNYk1aZGdQDQotRG5ia0t2YmRlRW5xYXZjSw0KLURvQ2tLdmJkeFpoRmZZRXINCi1EbmNLanZiZE5QeFF1bkdzDQotRU9jTEt2YmRPWU91emROdA0KLURuY0tqdmJkSmJpY1JLRFkNCi1EbmNLanZiZGpBUUhBb2ZqDQotRU9jS2p2YmRXV2lZVmNkZw0KLURuYmpqdmJkakZLZnRvQU8NCi1FUENrS3ZiZFRYa0xtemp4DQotRVBDa0t2YmRXU054QmVNRA0KLURvQ2tLdmJkdU1Yd0JUYVgNCi1Eb0RMS3ZiZExCS2ZtQnhSDQotRG9Damp2YmRFT2JqandERQ0KLUVQREtqdmJkVGxWbmFWb0oNCi1Eb0RMS3ZiZGhnSmNaVml1DQotRU9iamp2YmRhdGJIWGp0SQ0KLUVPY0xLdmJkWmVYZnpnaUMNCi1FUENrS3ZiZGVGUFJiWENqDQotRVBDa0t2YmRaUWxlSk1kcQ0KLURuYmpqdmJkVVdMb2pVQXENCi1FUENqanZiZEZhT3B5SnptDQotRG5ia0t2YmRBTklZcndaeA0KLUVQQ2tLdmJkYkJXRWVvcFgNCi1Eb0RMS3ZiZGN6WXBZWXBiDQotRVBDa0t2YmRiVkJmeExUaA0KLURvREtqdmJkTEJLZmxhd3ENCi1Eb0NrS3ZiZHlPU2d4U2lEDQotRVBES2p2YmRrRExrUWdWSA0KLUVPYmtLdmJkam1CbFpkZm8NCi1FUERLanZiZHVvVHpxTE90DQotRU9jTEt2YmRhUmViaFVGaw0KLUVQREtqdmJkYXRiR3dqdEkNCi1FT2NMS3ZiZENJamJMSWZLDQotRG5jS2p2YmRrSUdrZWVtaw0KLURuY0tqdmJkeFZNZVJaTU8NCi1FT2NLanZiZFJYT0RjTUhjDQotRG5iamp2YmRxcXVMT0xBbQ0KLURvREtqdmJkREhMZkhBemMNCi1Eb0NrS3ZiZG5WVlprS1JmDQotRG9ETEt2YmRHY2p2SmJLSw0KLURvQ2pqdmJkem9RUkZETHgNCi1Eb0RMS3ZiZG11VXpMS1JmDQotRVBETEt2YmR0dW13aXFUQQ0KLUVPY0tqdmJkbUpEc3B0ckINCi1FUENqanZiZElHZ1p4d3dnDQotRVBETEt2YmR4TFhEZ3p6Rw0KLURuYmtLdmJkUXdOZENraEQNCi1EbmJqanZiZGNhc05TQVVODQotRVBDa0t2YmRUdWxRS1RhUg0KLUVPY0tqdmJkaGdKYnlWalYNCi1Eb0RMS3ZiZEtWdGVjZUhKDQotRG5iamp2YmRIZ0d6WXd4SA0KLUVQQ2pqdmJkeG5TZ3hUSkQNCi1FUERLanZiZHlZSktDUHpMDQotRU9jS2p2YmRPRkR0SkpLZA0KLUVPYmtLdmJkUmFkRWtoeGsNCi1Eb0NrS3ZiZGlpZkhqTlhyDQotRG9Damp2YmRuVXR5amlyRw0KLUVPYmtLdmJkSnB5ZG9HTmUNCi1Eb0RLanZiZFpMcWN0T0xtDQotRG5ia0t2YmRzQmZNa2ZrWg0KLUVPY0xLdmJkT1N0V0dlVlENCi1FUERMS3ZiZGlqR0lKbVlTDQotRG9ETEt2YmR4eEpKYlFaaw0KLURuY0tqdmJkSGJMeWR6QUQNCi1FT2NMS3ZiZHlUTmlNcWFnDQotRVBES2p2YmRNZ0NvbVFWTA0KLURvRExLdmJkeml0b29jc1UNCi1FUERLanZiZHNCZk1rZmp5DQotRG9Da0t2YmRGeVV0YUVZQw0KLURvRExLdmJkSktFQUpwR2QNCi1Eb0NrS3ZiZHlnWk1BTWVYDQotRVBDa0t2YmRKcVpkb0ZuRg0KLURuYmtLdmJkaUJuYmR2cVINCi1FT2NMS3ZiZFNRVUdqRmRYDQotRG5ia0t2YmRtU1l0elRFSg0KLURvQ2pqdmJkZWhLdlNPUWcNCi1FT2NMS3ZiZEdja1ZpYkpqDQotRG5jS2p2YmRoZmljWXZKdQ0KLUVQREtqdmJkd3VNZVJZa24NCi1FT2NMS3ZiZEZlalNOaVVSDQotRVBDamp2YmRPRkVVSkpMRQ0KLURuYmtLdmJkWHNMYU10T3gNCi1FUERLanZiZGRaeVB4WXBiDQotRVBDa0t2YmRoelZGa3FOZg0KLURvREtqdmJkT0VkVUlpTEUNCi1FUENrS3ZiZG5HZVhtT0haDQotRU9ia0t2YmRpTUVkTnVDeQ0KLURvRExLdmJkZG9GVExUdFMNCi1FT2JrS3ZiZEl4VGJIbFFwDQotRG5jTEt2YmRaUk1kaG1FcQ0KLURvRExLdmJkWm5taGVFeWoNCi1FUERLanZiZEtlZWdiQXB1DQotRG5jTEt2YmROVlRTTE5BWA0KLUVPY0tqdmJkS0RKYnFLQ3gNCi1FUENqanZiZEZmS1NPSXNxDQotRVBDamp2YmR4blNoWVNpRA0KLUVPY0xLdmJkT1N0V0hGVlENCi1EbmNMS3ZiZHNQdk9pY1dHDQotRG5iamp2YmR4blRId3NKRA0KLURvREtqdmJkTEFrR21Cd3ENCi1Eb0NrS3ZiZHdNdkFNY2VODQotRU9jTEt2YmRtUnlWWnNEaQ0KLUVQQ2tLdmJkbXBaeVdLeUMNCi1Eb0RMS3ZiZHJ5a3BUQklPDQotRG9Damp2YmRWZ3d2WUhZeg0KLUVQRExLdmJkVHZNUGpVQlINCi1FT2NMS3ZiZGdGa3pPR2dBDQotRG5ia0t2YmRWQkJwc1JSeQ0KLURuYmpqdmJkUnpLSVNidkENCi1FT2JqanZiZHhuVElYc0pEDQotRU9iamp2YmRab09KRWR5ag0KLUVQQ2pqdmJkSERqdWliS0sNCi1FUENqanZiZGV6dXhkaVVYDQotRU9jS2p2YmRZVE1BbVRvWQ0KLUVPYmpqdmJkSllUYklMcHANCi1Eb0RLanZiZGtDbExSSFVnDQotRVBES2p2YmRUa3ZQQXZQSg0KLUVPYmtLdmJkZUFVUk5YakcNCi1EbmNMS3ZiZFR1a3BLVUJSDQotRG9Damp2YmRjVERLc2RKYQ0KLURvREtqdmJkQnNBY1VHWFMNCi1FT2JqanZiZERvQ2pqdmNFDQotRU9jS2p2YmR0bFlXYVRhWA0KLURuYmpqdmJkUkRiYVBwY3INCi1FUENqanZiZHJ5bFBzQWduDQotRG9Da0t2YmRPaEFZWkFZYQ0KLURuYmpqdmJkaVV5ZHdTVkMNCi1Eb0NqanZiZHd6SUZmWUZTDQotRG9Da0t2YmRac2hpWkRybg0KLURvQ2tLdmJkWm9PSWRkeWoNCi1EbmNLanZiZHBzc2dTU0t0DQotRVBDamp2YmRyU1VrTmtCTg0KLUVQREtqdmJkakpmSUpseFMNCi1FT2NMS3ZiZHhWTkZSWWtuDQotRG9ES2p2YmRXV2h3dkVGSA0KLURuY0xLdmJkUkRjQlFRY3INCi1EbmJrS3ZiZGxpRVRwdVJhDQotRVBDamp2YmRaUk1kaU1lUg0KLURuYmtLdmJkaU1FZE9WQ3kNCi1FUENqanZiZHpucFJFYmt4DQotRG9Da0t2YmR3eklGZXhGUw0KLURuYmpqdmJkbVNZdVpyZEoNCi1Eb0RMS3ZiZENXemNoZG92DQotRVBETEt2YmRwZkVGVHZBaA0KLUVQRExLdmJkeU9USVlUSWMNCi1EbmNLanZiZE5RWHFWbkhUDQotRG9ETEt2YmRDZ01GZ0F6Yw0KLUVPY0tqdmJkSXd0QmdrcHANCi1FUERLanZiZFJqeUdVZmpzDQotRU9iamp2YmRBQ3F3alppUQ0KLURvREtqdmJkcHN0R3JTS3QNCi1EbmJrS3ZiZG5HZHdtT0haDQotRG5jS2p2YmRpWnRmTHBuRw0KLURvRExLdmJkYVNHQ2d0RmsNCi1Eb0NrS3ZiZEZmSnFuSXNxDQotRVBDa0t2YmRrTkNMekVnUA0KLUVPY0tqdmJkRmVpck9KVHENCi1FT2NMS3ZiZFV0TlVHTVdLDQotRU9ia0t2YmRTUVVISmZFWA0KLUVQQ2tLdmJkcXF1S21rQk4NCi1EbmJqanZiZGJobUtLZlhZDQotRG9Da0t2YmRJc1lhVE5YbA0KLURvQ2pqdmJkWm9OaGVGWmoNCi1FT2NMS3ZiZEJoamJMSWZLDQotRU9jS2p2YmRhdGFmd2pzaA0KLURvQ2pqdmJka3hyclN5SFUNCi1FUERMS3ZiZFNDRUVsSXhrDQotRU9jS2p2YmRmTWV2Zm1LTA0KLUVQQ2pqdmJkTUpCbFJZQVMNCi1Eb0NqanZiZFN4S2ttemtZDQotRG5ia0t2YmRrTkNMeWRnUA0KLUVPYmtLdmJka3hzU1RaSFUNCi1Eb0NqanZiZFJwVUdpZWRYDQotRU9jS2p2YmRqYmxMUkd1SA0KLUVPYmtLdmJkeVROaU1yQ0gNCi1EbmJqanZiZFplWGZ6aEpDDQotRG9ES2p2YmRaeGRKbWJsUw0KLURuY0tqdmJkT1N0V0hFdVENCi1Eb0NrS3ZiZHlOc0h3c0ljDQotRVBES2p2YmRreHJxcnlIVQ0KLUVPYmpqdmJkWkxxY3RObE4NCi1Eb0RMS3ZiZHhuU2d4U2hjDQotRVBETEt2YmRuQmpXd29OdQ0KLURvREtqdmJka0lITUdHT0wNCi1FT2JqanZiZHFVVUdyUmtVDQotRG5jTEt2YmRSanlHVkhLcw0KLUVQREtqdmJkaGZqQ3lXSnUNCi1FUENrS3ZiZEhFTFZqQmpLDQotRG5jS2p2YmRnUUJ6dmN3aA0KLURvRExLdmJkVkFhcVNwcXkNCi1Eb0NrS3ZiZHlTbkpOU0JnDQotRG9ETEt2YmRwZWNlVVdBaA0KLURuY0xLdmJkYVJlYmdzZkwNCi1FT2NLanZiZFpMcWN0TmxODQotRU9iamp2YmR0YmJ0dnZQUA0KLURvQ2tLdmJkWk1TRHRObE4NCi1FT2NLanZiZHNCZWxrZmp5DQotRVBETEt2YmRUcHFQVlZJTg0KLURuYmpqdmJkQmlLYktoZksNCi1EbmJqanZiZE9GRVVJaUtkDQotRVBDa0t2YmRTaVpqUkFBbA0KLUVPYmtLdmJkd2p3RGd6eWYNCi1FUENqanZiZGhsRWROdGJ5DQotRVBDamp2YmRodHlkd1NVYg0KLUVPY0tqdmJkblFaeVZqeUMNCi1Eb0RLanZiZFJ6S0lTY1dBDQotRU9jTEt2YmRMQkxITkNYcQ0KLURvRExLdmJkc3NTVFl6RkQNCi1FT2JqanZiZEV2WXBQbGllDQotRG5jTEt2YmRoZmljWXZLVg0KLUVQQ2pqdmJkblV1WmtKcWYNCi1EbmJqanZiZFhuUkFYdHV0DQotRVBES2p2YmRkaWpSdXR6bg0KLUVPY0xLdmJkRXZZcFBsakYNCi1Eb0NqanZiZFR1bFFLVUFxDQotRU9ia0t2YmR4bXNJWVNoYw0KLUVQRExLdmJka3lUUnJ5SFUNCi1FT2JqanZiZENFUUF2S05HDQotRU9iamp2YmRHWXVWQkVZQw0KLUVQREtqdmJkdkFkWXNPZUkNCi1FT2JqanZiZFJwVUhLR0VYDQotRVBDa0t2YmRLREpjUWpEWQ0KLURvRExLdmJkdW5zenFLb1UNCi1Eb0NqanZiZEp2VWZFRWZpDQotRG5jTEt2YmRycFdQSmNXRw0KLURvQ2tLdmJkYWprZlBOY0ENCi1EbmJqanZiZEZwQVRYSEZ5DQotRU9ia0t2YmRGZkpyT0pUcQ0KLURuY0xLdmJkWm5uSkZFeWoNCi1Eb0NqanZiZE9FY3RJaUtkDQotRVBETEt2YmRWaFh1eEd4eg0KLUVQREtqdmJkeVNtaGxyQ0gNCi1FT2NLanZiZGlHakRaV0p1DQotRG5jS2p2YmRkWnlRWVpSQw0KLURuY0xLdmJkeml1UHBFVFUNCi1EbmNMS3ZiZEpUWWFUTlhsDQotRVBDamp2YmROZGRUaGlLZA0KLURuYmtLdmJkYkF1ZGVwUHcNCi1FT2NLanZiZE1vd3B1bkhUDQotRG9ETEt2YmRtYktYWVBOdQ0KLURvRExLdmJkZXp2WkVpVHcNCi1EbmJqanZiZHJNeWl4a2dpDQotRG5ia0t2YmRLV1ZHRUZHaQ0KLURvQ2pqdmJka0RManBmdGcNCi1EbmJqanZiZEpxWmVQRm1lDQotRU9ia0t2YmREd3hMc3NzbA0KLUVQQ2pqdmJkbW95eVdMWWINCi1FUENrS3ZiZEZqZHJjSG1WDQotRG9Da0t2YmREd3hMdFRzbA0KLUVPY0xLdmJkb0FLenRIZE8NCi1FUERMS3ZiZFRrdW9BdW9KDQotRG5jTEt2YmRVUlJQVlZIbQ0KLUVQQ2tLdmJkS0NpY1JKY1kNCi1Eb0NrS3ZiZHVEQ3VYV09vDQotRG9Damp2YmRSWE5kRE1JRA0KLURvREtqdmJkQmNwQldKbGYNCi1Eb0NqanZiZFRxUk90dGdtDQotRG5jS2p2YmRSYWRGTUl4aw0KLURvRExLdmJkQ1NhRFRld1MNCi1FT2NLanZiZFFseENZbXR6DQotRG5jTEt2YmRlT2VTa1VUcg0KLURuYmtLdmJkVHFRbnR0aE4NCi1EbmJqanZiZGhiT2JkdnBxDQotRVBETEt2YmRNb3dxVm1nVA0KLURuY0tqdmJkQU5JWlRXelkNCi1FUERMS3ZiZGlWWmVYUnRiDQotRG5jTEt2YmRZTnFBWHR2VQ0KLUVPY0tqdmJkZklLdXJOcGcNCi1Eb0NrS3ZiZEZwQVRXZmV5DQotRVBDamp2YmRIa2F6bXdSTA0KLURvREtqdmJkSnZVZkRkZ0oNCi1FUENrS3ZiZFNCZEVsSXhrDQotRG9Da0t2YmRic0NqdEVKYQ0KLURvRExLdmJkdkJFWXNPZGgNCi1FT2NMS3ZiZEdHSnFtaHNxDQotRU9jTEt2YmRKU3lCU2x4TQ0KLURuY0xLdmJkblFaeHVrWkMNCi1FT2NMS3ZiZHlTbklsckNIDQotRG9Damp2YmRJakVBS1BnRQ0KLURvRExLdmJkaGxFY25WRFoNCi1FUERLanZiZFplWUd6Z2hiDQotRVBES2p2YmRiS2xHT25EQQ0KLUVQREtqdmJka01iTVpkZ1ANCi1FT2NMS3ZiZERvQ2tLd0NkDQotRG5iamp2YmRMQkxHbGJYcQ0KLUVQRExLdmJkWnhjaW5Da3INCi1Eb0NrS3ZiZHFUc2ZyUmp0DQotRG9Da0t2YmRBRFNZSnpJcA0KLURvREtqdmJkYlVhZ1lLc2gNCi1FT2JqanZiZGpBUUhBb2ZqDQotRU9jS2p2YmREb0RLa1hERQ0KLUVQREtqdmJkU1ppZ3NDdkENCi1FUENrS3ZiZEtSWmVQR09GDQotRVBDamp2YmRLYUtnTkNYcQ0KLUVPYmtLdmJkeHhKS0JveWsNCi1FT2NLanZiZHhtcmd3c0ljDQotRG5ia0t2YmRtb3pZdkt5Qw0KLURvQ2tLdmJkcXF1TE9MQW0NCi1FT2JrS3ZiZERuY0xMWENkDQotRVBETEt2YmRqY01LcGZ0Zw0KLUVQQ2pqdmJkd2tYRGd6ekcNCi1Eb0RMS3ZiZEhmZnl4d3dnDQotRG9Da0t2YmR2QWRaU25lSQ0KLUVPY0xLdmJkcm92T2pEVmYNCi1FT2NMS3ZiZHNQdW9KYnVmDQotRG9ETEt2YmR5U25KTlNCZw0KLUVPYmtLdmJkWHNNQWx0T3gNCi1EbmNMS3ZiZEZmS1NPSlRxDQotRVBDa0t2YmRkZG5yQ1djSw0KLURvQ2pqdmJkeVNtaGxyQmcNCi1EbmJqanZiZE54UFZ6Y25VDQotRG5jS2p2YmRodHpFdnJWQw0KLURvQ2pqdmJkUXdPRGJsSGMNCi1Eb0RMS3ZiZGpjTGpwZ1ZIDQotRU9jTEt2YmRiS2xHT21jQQ0KLUVQREtqdmJkZk1mV2ZsaWsNCi1EbmNLanZiZG1iSndYbm11DQotRU9jTEt2YmRUa3VvQXZPaQ0KLURuYmpqdmJkc1prb3JhSU8NCi1Eb0RLanZiZFpNU0VVT0xtDQotRU9jTEt2YmRzQ0ZtTGZrWg0KLURuY0tqdmJkVXhoVHlqbm4NCi1FUERLanZiZFJvc2ZqR0VYDQotRU9jTEt2YmRtdVV6S2lyRw0KLUVQQ2tLdmJkR0dKck9JdFINCi1FT2JqanZiZEVYd2t0VVVNDQotRG5ia0t2YmRpaWZIaW1Ycg0KLUVQREtqdmJkbUpEc3B1U0INCi1FT2JqanZiZHd5aEdGd2RyDQotRG5jS2p2YmRhdGFmd2tVSQ0KLUVQRExLdmJkWU5xQVh0dXQNCi1Eb0RMS3ZiZEVQQ2tMV2NFDQotRU9jTEt2YmRxY2VKUU9XQg0KLUVQREtqdmJkeVNuSk5TQmcNCi1EbmJqanZiZHl6ZG5TSUloDQotRG9ES2p2YmRyRGRpUU52Qg0KLURvQ2tLdmJkWWtxZFRuTG0NCi1Eb0NrS3ZiZGxaVFNUWWdVDQotRVBES2p2YmRNcFhxV05mcw0KLUVPYmtLdmJkSmJpY1FqRFkNCi1Eb0RMS3ZiZEdBb1JZaXptDQotRG5jS2p2YmRtZ0V4Tk9IWg0KLURvQ2pqdmJkem5vcUZETHgNCi1FT2NLanZiZGllTEd0b0FPDQotRG9Damp2YmRNZmJwTW90aw0KLUVPYmtLdmJkeXpkblNIaUkNCi1FT2JrS3ZiZGNTYmpzY2lhDQotRG9ES2p2YmROR2NRTlFVaw0KLUVQREtqdmJkTkdicE1wVkwNCi1Eb0RMS3ZiZFVRcVBWVWdtDQotRG5iamp2YmRWdmh3dWNlSA0KLUVQREtqdmJkRHhYa3N0VGwNCi1FUENqanZiZFB5TkFIVFJqDQotRVBETEt2YmRlT2RzTFR0Uw0KLURvREtqdmJkVEFFaUlDUEUNCi1Eb0RLanZiZFppc0lRR2FmDQotRU9ia0t2YmR4Vk1kcHhrbg0KLUVQQ2tLdmJkblV0ektqUmYNCi1FT2NLanZiZGh0eWR2clZDDQotRG9ES2p2YmRicmNMVGNpYQ0KLUVQRExLdmJkYmhsaWtGdngNCi1FUERLanZiZEFOSVpTd1p4DQotRVBES2p2YmR0YmJ1WFdPbw0KLUVPYmpqdmJkbGlEdFF0cWENCi1EbmNMS3ZiZEdMRlNjSU11DQotRG5ia0t2YmRmTWZYR2xqTA0KLUVPYmtLdmJkQ1RCRFRld1MNCi1FUERLanZiZFNpWmlxQUFsDQotRU9jS2p2YmRGZktTTmhzcQ0KLUVQQ2pqdmJkeVlKS0JwWmsNCi1EbmNLanZiZEFNZ3lUV3l4DQotRG5ia0t2YmRwYUpGQVhJRQ0KLUVPY0tqdmJkRVlZTVVVVGwNCi1FUENqanZiZGVGT3JCdmNLDQotRG9ETEt2YmRwdFVIU1JrVQ0KLURvQ2tLdmJkT1lQVnpjblUNCi1EbmJqanZiZGlqRmhLTXhTDQotRG5ia0t2YmRFS0hpdlhqQQ0KLURuY0xLdmJkc1B2T2ljVmYNCi1Eb0NqanZiZG1iSnZ4T211DQotRU9jS2p2YmREeFlNVVVUbA0KLURvREtqdmJkWnRJaHhkVE8NCi1EbmNLanZiZFRsVm9BdW9KDQotRG9ES2p2YmRGeVV1QkR3Yg0KLUVPYmtLdmJkUVltQUdzU0sNCi1EbmJrS3ZiZHVMd3dBc2FYDQotRVBES2p2YmRlZ2tXUm1wZw0KLUVQRExLdmJkUkRjQW9xRHINCi1Eb0NqanZiZEZXWlBvbGllDQotRG9Da0t2YmRiaG1Ka0dXeA0KLURuY0xLdmJkcldwTURKWXENCi1EbmJqanZiZGFhV0Vlb293DQotRG9ETEt2YmR6SFlsQU5GWA0KLURvQ2tLdmJkakZMSFVvQU8NCi1EbmJqanZiZFp5RUtOYmtyDQotRG9ES2p2YmRMclhNeXVReg0KLUVQRExLdmJkd05XQU1kRk4NCi1Eb0NrS3ZiZGtXWE9EYXhYDQotRU9jS2p2YmRyYWVsa2dLeQ0KLUVPY0xLdmJkbVNaVlpzRGkNCi1FUENqanZiZGtNYkx6RWZvDQotRU9iamp2YmRhU0ZiZ3RGaw0KLUVPYmtLdmJkbUljdFJVcWENCi1EbmNLanZiZGh0eWR2cXVDDQotRVBES2p2YmRab09KRWVaag0KLURvRExLdmJkeVhpSmFvekwNCi1FT2NMS3ZiZFZ3SXhXRUZIDQotRG5ia0t2YmRZcG1GSk1kcQ0KLUVQRExLdmJkaktHSUtNd3INCi1FUENrS3ZiZEZwQVN3SEdaDQotRG5jS2p2YmRLUXpFbmZOZQ0KLURvRExLdmJka1Z3T0RheFgNCi1FUENqanZiZHphQU9mZmFsDQotRU9iamp2YmRuSEV3bG5HeQ0KLURuY0xLdmJkTHF3TXl1UXoNCi1FUENrS3ZiZFdSblhhZU1EDQotRG9Da0t2YmRjYlNsckFVTg0KLUVQREtqdmJkTUpCbFJZQVMNCi1FT2NMS3ZiZFp4Y2ltYmtyDQotRG5jTEt2YmRDRHBCVmltRw0KLURvREtqdmJkR2RLdktCaksNCi1FUERMS3ZiZHppdVBvZFN0DQotRG5ia0t2YmRicmJqdEVLQg0KLUVPY0xLdmJkbUljc3B0cWENCi1FUERLanZiZE1Sd015dVF6DQotRG9ETEt2YmRmSGtWck5xSA0KLURuYmtLdmJkTFpSS1N6dUcNCi1FUERLanZiZFRmem1rd1dGDQotRU9jTEt2YmRTS3hldUhMVA0KLUVQRExLdmJka0hnTGZHTmsNCi1Eb0RMS3ZiZFZoWHV4SFl6DQotRU9jS2p2YmRrSGdNR0dPTA0KLURvREtqdmJkRUFSaG1adncNCi1FUERMS3ZiZGpLRmdpbVhyDQotRU9ia0t2YmRTUVVHaWVjdw0KLUVQQ2pqdmJkaktGaEpseFMNCi1Eb0RLanZiZER4WGxUdFVNDQotRVBETEt2YmRlbGZXZ01paw0KLUVPY0tqdmJkdGNEVlhXT28NCi1Eb0RLanZiZGladUZsUk5mDQotRG9Da0t2YmRzQmVsbEhLeQ0KLUVQQ2tLdmJkamxiTHllR28NCi1FT2NLanZiZGhmaWJ4dWpWDQotRU9iamp2YmRoeXVHTVJPRw0KLURvRExLdmJkZ1FCenZkWUkNCi1Eb0RLanZiZGVBVHBtWGpHDQotRVBETEt2YmRqS0ZnaWx4Uw0KLURvREtqdmJkcnBXUEpidWYNCi1EbmNMS3ZiZERuY0xLdmNFDQotRG9Da0t2YmRrVnZtZENYdw0KLURuY0xLdmJkR2NqdWpDSmoNCi1EbmNMS3ZiZHB4bmdmcGN4DQotRG5iamp2YmRpQ1BDZHdRcQ0KLUVQRExLdmJkaWpGaEpsd3INCi1EbmNLanZiZGhnSmJ4dktWDQotRVBDamp2YmRaeGNqTmJrcg0KLURuY0tqdmJkWlFsZUpNZHENCi1EbmNMS3ZiZHlmeGxBTWVYDQotRVBDamp2YmRGZkpyTmlVUg0KLUVQRExLdmJkempWUVBkU3QNCi1Eb0RMS3ZiZGpBUUhCUGZqDQotRU9iamp2YmRab09KRkV6Sw0KLUVPYmtLdmJkRnBBVFdnR1oNCi1FUERLanZiZHZBY3hybmVJDQotRG9ETEt2YmR4cm5KTXJDSA0KLURvQ2tLdmJkam1DTHlkZm8NCi1FUENrS3ZiZGVnanVxbXFIDQotRG9Da0t2YmRTQmRGTGlaTA0KLUVPYmtLdmJkYkF2RkZvcFgNCi1EbmNMS3ZiZEdRQVN3R2V5DQotRG5ia0t2YmRRY2NBb3BkUw0KLUVQQ2tLdmJkWnNoaVlkU24NCi1FUENqanZiZEhEanVqQ0tLDQotRU9iamp2YmR1RERWV3Vubw0KLURvQ2pqdmJkempWUVFEc1UNCi1FT2NMS3ZiZGVGT3FhdmNLDQotRG9ETEt2YmR5WGhpYlB6TA0KLURvRExLdmJkcnpNUHNBZ24NCi1FT2JrS3ZiZFV0TlRmTVdLDQotRU9jTEt2YmRMcXdOWnVReg0KLUVQREtqdmJkcUJKRkFYSGQNCi1Eb0NrS3ZiZG5VdVprS1NHDQotRG9Damp2YmRaSFhFQU9zSg0KLURuY0tqdmJkUWREQlBwY3INCi1EbmJrS3ZiZENJa0JrSWVqDQotRG5ia0t2YmRNZ0RQbVFVaw0KLURuYmtLdmJkeHhJakNQeWsNCi1EbmJqanZiZFpzaUl4ZFNuDQotRG9Da0t2YmRBRFJ4SnpKUQ0KLUVPYmpqdmJka3hzU1RaSFUNCi1EbmNLanZiZFdYSXhWZEVnDQotRG5iamp2YmRMcldtWnRweg0KLUVQREtqdmJkaHpVZWxRbkcNCi1Eb0RMS3ZiZFNCY2VMaHhrDQotRU9iamp2YmRXSVh2WUd4eg0KLUVQREtqdmJkRVlYa3RVVU0NCi1FT2JrS3ZiZGhsRkVOdGJ5DQotRVBETEt2YmROd251emNtdA0KLUVPY0tqdmJkYWFXRWZQcFgNCi1EbmNMS3ZiZGRkb1NDV2NLDQotRVBES2p2YmRtYWl3WG5uVg0KLURvRExLdmJkTWdEUU1wVWsNCi1Eb0RMS3ZiZGpGS2Z1UEFPDQotRG5jTEt2YmRuR2VZTW1meQ0KLURuY0xLdmJkclNVam1rQW0NCi1FT2NMS3ZiZGZIa1dSblFnDQotRG5iamp2YmRuQ0tXeFBOdQ0KLURuYmpqdmJkcmFlbUxnS3kNCi1FT2JrS3ZiZFdXaVlXRGRnDQotRG9Da0t2YmRLZkZnYWFRdQ0KLUVQQ2tLdmJkYVNGY0lVR0wNCi1FT2NLanZiZGt4cnFyeUhVDQotRG5jS2p2YmRSRGJhUVFjcg0KLURuY0xLdmJkYlZCZ1hqdEkNCi1Eb0NqanZiZHFaUEhmcUR4DQotRG5ia0t2YmRjeXhvd3hwYg0KLUVQQ2tLdmJkV1hJeFdEZUgNCi1Eb0NrS3ZiZHlYaUtCb3pMDQotRG5ia0t2YmRsWlNyVFlmdA0KLUVPYmpqdmJkR2RLdWpCaWoNCi1EbmJqanZiZHRjRFZYV1BQDQotRG9ES2p2YmRabm1oZGR5ag0KLUVPYmtLdmJkVHVrb2lzYVINCi1FT2JrS3ZiZHpvUHFGQ2t4DQotRG5jTEt2YmRMaGFsUXhBUw0KLUVQQ2tLdmJkVndJd3VkRkgNCi1Eb0RLanZiZGpLR0lLTllTDQotRG9ETEt2YmRqaEhMZWVuTA0KLUVQREtqdmJkSlRaQlNseE0NCi1Eb0NqanZiZEZhT3FaSnptDQotRG9ETEt2YmRuQmpYWG5uVg0KLURvQ2pqdmJkZUZQU0NYREsNCi1FUENqanZiZGJBdkZHUG93DQotRG5ia0t2YmRWd0l3dkVGSA0KLUVPYmpqdmJkcVVUZnJTTFUNCi1EbmNLanZiZHFseWl4a2hKDQotRG9ES2p2YmRTTFpGdUdqcw0KLURuY0xLdmJkc0NHTkxma1oNCi1FUERMS3ZiZGFvZmdEa3pkDQotRG9Da0t2YmRkaWlyV1V6bg0KLUVPY0tqdmJkdUNjVld1bm8NCi1EbmJrS3ZiZFNQc2ZqR0R3DQotRG9Da0t2YmRGV1lwUU1pZQ0KLURvRExLdmJkUkVDYVFSRVMNCi1FUERMS3ZiZGhmaWJ5VmpWDQotRG5iamp2YmRxVHNnU1NMVQ0KLUVPYmtLdmJkclhRTUNoeVINCi1EbmNMS3ZiZE5ydFZmZHVRDQotRU9iamp2YmRpVXpFdnF0Yg0KLURuY0tqdmJkVWFDUXNSUnkNCi1FUENqanZiZFJiRUVraVlrDQotRG5jS2p2YmRVdE5VR01Wag0KLUVQQ2pqdmJkekhZbEFNZVgNCi1FUENrS3ZiZGVFb1JiWENqDQotRG9ETEt2YmRjU2NMVURpYQ0KLURvRExLdmJkdGJidVd1bm8NCi1FT2NLanZiZGJVYWZ3a1RoDQotRG9Damp2YmR0Y0RWWFdPbw0KLUVPY0tqdmJkSGdHeXh4WUgNCi1FT2NMS3ZiZFdTT1hiRWtjDQotRG9Da0t2YmRLZWVoQ0JSVg0KLURuY0xLdmJkTWdDb21RVkwNCi1Eb0RLanZiZFVNVm9CVm9KDQotRG9Damp2YmR6b1FSRkNreA0KLURvQ2tLdmJkVVdNUUpzYVINCi1EbmJqanZiZGtOQ0x5ZGdQDQotRU9jS2p2YmRtb3pZdkt5Qw0KLURuYmtLdmJkbWdFeE1uR3kNCi1EbmNLanZiZHpucFFlRE1ZDQotRG9ES2p2YmRaeGNqTmJrcg0KLUVPY0tqdmJkcWRFaVFOdWENCi1FUERMS3ZiZGZIa1ZyTnBnDQotRG5ia0t2YmRYc01CTXNvWQ0KLUVPYmtLdmJkY0pOS0xHWFkNCi1FUERMS3ZiZFZxbXdiRWtjDQotRVBDa0t2YmRKY0picGlieA0KLUVPYmpqdmJkWU5xQVh0dlUNCi1FT2JrS3ZiZGpBUUhBcEdqDQotRVBES2p2YmRyYkZtTUhMWg0KLURuYmtLdmJkUElBWHlBWWENCi1Eb0RLanZiZFNMWkdWSExUDQotRG9Da0t2YmREbmJrTFdjRQ0KLURuY0tqdmJkem9QcGVETVkNCi1FUERLanZiZFF3TmRETGhEDQotRVBES2p2YmRoZmpDeHVpdQ0KLURvQ2pqdmJkYWprZW5tY0ENCi1FUERLanZiZHRUU1RZeWVEDQotRG9Damp2YmRpakZoS013cg0KLURvRExLdmJkcGZEZVR1YUkNCi1FUENqanZiZEpYdENIbFFwDQotRU9jS2p2YmRqYmtrUkd1SA0KLUVPYmtLdmJkVlRsc2VsV0sNCi1Eb0NrS3ZiZGF1Q0hYa1RoDQotRG5iamp2YmRTTFpHVkdqcw0KLURvRExLdmJkZWhMV1JtcUgNCi1EbmNLanZiZFNCZEZMaHlMDQotRG9ETEt2YmRtYWpYWVBPVg0KLUVPY0tqdmJkcGVjZVR2QWgNCi1FUENqanZiZE5kY3RJaGtFDQotRU9jTEt2YmR1V053alFzQQ0KLURvQ2pqdmJkdHZPWUtSVEENCi1EbmNLanZiZHFpQUplTk9lDQotRG5iamp2YmRVdE5VR0x2Sw0KLUVQREtqdmJkTWdDb2xvdGsNCi1FT2NLanZiZFFseENaTnR6DQotRG9ES2p2YmRtZmR3bU5meQ0KLUVQREtqdmJkcm92UEtEVmYNCi1EbmJqanZiZERqSUp1d2pBDQotRVBDamp2YmRzQmZOTUhMWg0KLURvQ2pqdmJkSmJqRFJKY1kNCi1FUERMS3ZiZFpSTWVKTkVxDQotRVBDa0t2YmRSa1lmVkdrVA0KLURuY0xLdmJkUmJEZUxpWWsNCi1FUENqanZiZHFpQUpkbG9GDQotRG9Damp2YmRGeVZVYUR3Yg0KLURvQ2pqdmJkTVJ2bVp0cHoNCi1Eb0RMS3ZiZEdRQVRXZmZaDQotRVBDamp2YmR3dG1GUXlNTw0KLUVPY0tqdmJkVEl6S1JBQWwNCi1Eb0NrS3ZiZHNRVm5pY1ZmDQotRG9ETEt2YmRGZktSbWh0Ug0KLUVPY0tqdmJkc0NGbUxmankNCi1Eb0RLanZiZGRkbnFiWERLDQotRG9ES2p2YmRZZ1dkQU9yaQ0KLURvQ2tLdmJkbXVVeWpqU0cNCi1FT2JrS3ZiZGhmaWNZdkp1DQotRG9Da0t2YmRRbHhDWk50eg0KLUVQQ2tLdmJkR1pWVWFFWGINCi1EbmNMS3ZiZEVYeE1UdFRsDQotRG9ES2p2YmRHRmlyTmlVUg0KLUVQQ2pqdmJkcHNzZ1JyTFUNCi1FT2JrS3ZiZFZaSHN5a09uDQotRG5jS2p2YmR5VE9KTXJCZw0KLUVPY0tqdmJkUmFjZGxJeUwNCi1FT2JrS3ZiZGlDT2NGV3FSDQotRG9ETEt2YmRSanhmVkdrVA0KLUVPY0xLdmJkaUJuY0ZYUXENCi1EbmNMS3ZiZG5RWnh1a1liDQotRG9ES2p2YmRwYUllQVdnZA0KLURuY0tqdmJkVnFuWUNFa2MNCi1EbmJqanZiZFpSTWRobUVxDQotRVBDamp2YmRoZ0tEWXVpdQ0KLUVPY0xLdmJkQ0lrQmpoZksNCi1FUENrS3ZiZFpubWhkZVpqDQotRU9jS2p2YmRUcHBudVVoTg0KLUVPY0xLdmJkYlZCZnhLc2gNCi1FUERLanZiZEZWeHBRTktGDQotRG5iamp2YmRqdlduRGF4WA0KLUVPYmpqdmJkQU5JWXJ3WngNCi1FT2JqanZiZGF1Q0hYanRJDQotRU9ia0t2YmRaaXJncEdhZg0KLUVPYmpqdmJkdW9UenFMUFUNCi1Eb0RMS3ZiZHhaaEZld2VTDQotRG9Damp2YmRJTGF6bldxTA0KLURuY0xLdmJkYU1rQnJ0bGcNCi1FT2JqanZiZE5ydFZnRlVwDQotRG5ia0t2YmRSektIc0N2QQ0KLURvQ2tLdmJkaVp1RmtwbkcNCi1EbmJrS3ZiZEV6dFJFbERKDQotRVBDamp2YmRSRUNhUVFkUw0KLUVQQ2pqdmJkcXF0a05rQW0NCi1FT2JrS3ZiZHlOcmhYcmlEDQotRG9ETEt2YmRlZ2tXUm1xSA0KLURuY0tqdmJkTlFYcVdOZnMNCi1Eb0RMS3ZiZFJhZEZMaHhrDQotRVBES2p2YmR4VW1GUXlMbg0KLUVQQ2pqdmJkeHhKS0JveWsNCi1FT2JrS3ZiZG5WVXpMSnFmDQotRG5iamp2YmRTUVVHaWVkWA0KLURuY0xLdmJkcnBWbmpDdkcNCi1Eb0RLanZiZFppcmdwR2JHDQotRG5jS2p2YmRPQUpUVUpyQQ0KLURuYmpqdmJkVXlIc3lqb08NCi1FUERLanZiZGZwQnp2ZFhoDQotRVBDamp2YmR5VE5obHFhZw0KLURuY0tqdmJkTEJLZmxheFINCi1Eb0NqanZiZFZ3Slh2RUVnDQotRU9jS2p2YmRWcW5YYWRsRA0KLURvREtqdmJkeU5yZ3hTaUQNCi1FT2JqanZiZG5WVlpqalJmDQotRG5iamp2YmRGZWlxbWlUcQ0KLUVPYmtLdmJkRlZ4cFFNaWUNCi1EbmJrS3ZiZElCa3lkekFEDQotRVBDa0t2YmRaalRIb2ZhZg0KLURuY0xLdmJkblB6WXVrWkMNCi1FT2JrS3ZiZExZcUtTenVHDQotRG5iamp2YmR4bXJnd3JoYw0KLUVPYmtLdmJkVGt1b0JXT2kNCi1FT2JrS3ZiZElyeGFTbHhNDQotRU9jTEt2YmRKcVplT2ZPRg0KLURvQ2pqdmJkQmhqYktpRmoNCi1FUENrS3ZiZHJEZUpQblZhDQotRVBDa0t2YmROd29WemNuVQ0KLUVPY0xLdmJkWG1xQVlWV1UNCi1FUENrS3ZiZFplWUd6aEpDDQotRU9jS2p2YmROZGRVSWhqZA0KLURvREtqdmJkamdnTGVlbWsNCi1FT2JrS3ZiZHhaZ2VmWGVTDQotRU9jS2p2YmRnRmt6T0dnQQ0KLUVPYmtLdmJkTmRjc2lJa0UNCi1FUERLanZiZGJpTWlrRndZDQotRVBES2p2YmRlbGZXZm1Kaw0KLUVPY0tqdmJkSEVMV0phaksNCi1Eb0RMS3ZiZFpSTWVJbGRxDQotRU9jTEt2YmRSWE5jY01IYw0KLUVQQ2tLdmJkUWx4Q1pOdHoNCi1Eb0NrS3ZiZHlUT0pNcWFnDQotRVBETEt2YmRDVEFjVGV2cg0KLUVPY0tqdmJkcnBWbmljV0cNCi1EbmJrS3ZiZFpMckVUbWttDQotRU9jTEt2YmRScFRmaWZFWA0KLURuYmpqdmJkUWNiYVBxRHINCi1Eb0NrS3ZiZEV1eHBRTktGDQotRVBDamp2YmROZUVUaGlLZA0KLUVQREtqdmJkVllndFpqb08NCi1Eb0NqanZiZFpSTWRobGVSDQotRG9Damp2YmRac2lJeURybg0KLUVQRExLdmJkYVNHQ2d0R0wNCi1FUERMS3ZiZHFUdEdxckt0DQotRG9Da0t2YmRuVlV6S2pTRw0KLUVQQ2pqdmJkelFvTWlKd0ENCi1FUERLanZiZFhybEJNdE94DQotRG9Damp2YmROSENvbHBWTA0KLUVPYmtLdmJkWG5SQVh1VnQNCi1FT2JqanZiZE1KQ01ReEFTDQotRU9ia0t2YmRJcnhhVE14TQ0KLURuYmpqdmJkYkF1ZGZRUVgNCi1EbmJrS3ZiZG5DS1hZT211DQotRG9ES2p2YmRFWHhNVVVUbA0KLUVPYmtLdmJkeVhoaWFvekwNCi1FT2JqanZiZEVKaEtWd2pBDQotRU9jS2p2YmRwZkVGVHVhSQ0KLUVPY0tqdmJkYlZDSFlMVGgNCi1EbmNMS3ZiZHlxT2xpSndBDQotRU9jS2p2YmRreHJxc1pIVQ0KLURuY0tqdmJkRGpIalZ3akENCi1FUENrS3ZiZGtETUxRZnVIDQotRVBDamp2YmRVVmxQalVCUg0KLURvRExLdmJkakpmSGltWHINCi1Eb0NrS3ZiZEV1eG9vbGpGDQotRG9ETEt2YmRZemNHUmpXWg0KLURvREtqdmJkd3loR0dZRlMNCi1EbmJrS3ZiZHNyclN4eWVEDQotRVBDa0t2YmR4bXJoWHJoYw0KLUVQREtqdmJkRGpIaXZYakENCi1FT2JrS3ZiZGZNZlhHbGlrDQotRVBETEt2YmRHZEt2S0Jpag0KLURvQ2tLdmJkYkxNR09tY0ENCi1FUENrS3ZiZFJYTmRETGdjDQotRVBDamp2YmRac2lJeGNybg0KLURvREtqdmJkcHlQSUdxRVkNCi1FUERLanZiZGxaVFJyeUhVDQotRG9ES2p2YmRVc2xzZWt2Sw0KLURuY0tqdmJkS2ZGaENCUXUNCi1EbmNMS3ZiZFNDRGVNSXlMDQotRVBES2p2YmRKY0pjUkpjWQ0KLURvRExLdmJkcmFlbGxITFoNCi1FUENqanZiZHVEQ3R3V1BQDQotRG5ia0t2YmRCZFBhV0psZg0KLUVQQ2tLdmJkcUZjZVVWYUkNCi1EbmJrS3ZiZGN5eG94WXFDDQotRG5ia0t2YmRsWXNTVFlmdA0KLUVPYmpqdmJkWkhYRUFPc0oNCi1FT2JqanZiZFVSUk90dUhtDQotRVBDamp2YmRaTHJEc25NTg0KLUVQQ2pqdmJkZklLdlJtcGcNCi1FUERMS3ZiZHdXbEJWYVZ1DQotRU9ia0t2YmRaTVNEc21rbQ0KLUVQREtqdmJkS05BRVpmdUINCi1EbmJqanZiZGh5dUdNUk9HDQotRU9iamp2YmRKdXVHRGRnSg0KLUVQRExLdmJkZ1FCendEeEkNCi1FT2JqanZiZGp2WE5kQ1h3DQotRVBDamp2YmRsWlNyU3lHdA0KLURvREtqdmJkWHNMYU1zbngNCi1Eb0RMS3ZiZFRsVm9BdW9KDQotRG5ia0t2YmRwdFVHclNMVQ0KLUVPYmtLdmJkRXp0UkZNQ2kNCi1FT2NMS3ZiZFRrdk9hVm9KDQotRU9ia0t2YmREb0NqandDZA0KLUVQQ2tLdmJkVGZ6bkx3VmUNCi1FT2JrS3ZiZFJqeUdVZmpzDQotRVBES2p2YmRWdmlYdkVGSA0KLURuYmpqdmJkS2tCSVdBS1oNCi1FT2NMS3ZiZHFGZEZVVmFJDQotRU9jTEt2YmRCaGpha0pGag0KLURuY0tqdmJkYXVCZ1lLc2gNCi1EbmJqanZiZHhLdmRIenlmDQotRG9Damp2YmR4Vk1kcVlsTw0KLUVQQ2pqdmJkRVBETExYREUNCi1FUERMS3ZiZFZ2aHd1Y2RnDQotRG5jS2p2YmRhUmZESVRmTA0KLUVQREtqdmJkZnBCenZjeEkNCi1Eb0NrS3ZiZEdMRlRESG1WDQotRG9ETEt2YmRjVERLdERqQg0KLURuYmtLdmJkWlJNZUlsZHENCi1FT2JqanZiZFJqeUdWR2tUDQotRVBDamp2YmRsaGN0UlZSYQ0KLURuYmpqdmJkeVhoaWJQekwNCi1EbmJqanZiZEZwQVN2Z0Z5DQotRG5iamp2YmRLQ2ljUkpjWQ0KLURuYmtLdmJkUHhtQUdycksNCi1FUENqanZiZHBzdEhTU0t0DQotRU9ia0t2YmRpWnRlbFFuRw0KLURvRExLdmJkS2tBZ3ZBSnkNCi1FT2JqanZiZHNQdlBLQ3VmDQotRU9jTEt2YmRoeXVHTHFPRw0KLUVQRExLdmJkeU9TZ3hTaGMNCi1FT2JrS3ZiZG1KRHNwdHFhDQotRVBDamp2YmRiVkNIWUt0SQ0KLURvQ2tLdmJkQ0pMQmtJZksNCi1FUERLanZiZFRxUW51VWdtDQotRU9jTEt2YmR5cG5tSWpYQQ0KLURvRExLdmJkaUxkZE9VYnkNCi1Eb0NrS3ZiZGFTRmJndEdMDQotRVBETEt2YmRyYWVsbEdqeQ0KLUVPYmtLdmJkV1Jtd2JFa2MNCi1FUENqanZiZERvRExLdmNFDQotRG5iamp2YmRqRWpmdVBBTw0KLURuYmpqdmJkcXZva2JpWXENCi1EbmJrS3ZiZFZaSVR6TE9uDQotRVBES2p2YmRVV0xwSnRBcQ0KLUVPYmtLdmJkd3RtRlF5TU8NCi1Eb0RMS3ZiZEZXWlFQbUtGDQotRVBES2p2YmRMQktnTWF3cQ0KLURuY0xLdmJkQU5JWXNXeXgNCi1FT2JrS3ZiZHF2b2xESllxDQotRU9jS2p2YmRRbHdiWk9Veg0KLUVQQ2tLdmJkbHF5VXpURUoNCi1FUENrS3ZiZFNMWWZVZ0tzDQotRG9Damp2YmRSb3RISmZFWA0KLUVPY0tqdmJkclhRTUNpWlINCi1EbmNMS3ZiZGFvZmdFTHpkDQotRG9ES2p2YmRlaEt2U05xSA0KLUVQQ2tLdmJkemFBT2ZnQmwNCi1Eb0NrS3ZiZFZVTXNmTVZqDQotRG9ETEt2YmRVR3puTHdWZQ0KLUVQRExLdmJkRG9ES2p3REUNCi1Eb0NqanZiZEFOSHhzWFp4DQotRVBDa0t2YmRKcHlkbmVuRg0KLUVQQ2pqdmJkdFRSc1paZUQNCi1Eb0RMS3ZiZG5RWnlXTFpDDQotRVBDa0t2YmRLTkFEeWZ0YQ0KLUVQQ2tLdmJkVVZsUGpUYVINCi1EbmNMS3ZiZGVPZVNqc3RTDQotRG5jS2p2YmRYcmxBbVVPeA0KLURvQ2tLdmJkeG5USVhyaGMNCi1FUERMS3ZiZFpqVElRR2FmDQotRG9Damp2YmRQeG1BR3JySw0KLUVQREtqdmJkTFpRaXJ6dGYNCi1Eb0RMS3ZiZGtIZmxHRm5MDQotRG9Damp2YmRpTUZFT1VieQ0KLURuYmpqdmJkaGFvREZYUXENCi1FUENrS3ZiZHl6ZU5xaEloDQotRVBES2p2YmRiVWJHd2tVSQ0KLURvQ2tLdmJkRVh4THNzdE0NCi1Eb0RMS3ZiZGFSZWJoVUdMDQotRU9iamp2YmRNZmJwTlFVaw0KLURvRExLdmJkQ0VRQXVpbGYNCi1FT2JqanZiZE1vd3B1bkhUDQotRG9ETEt2YmR6SFlsQU1lWA0KLURvQ2tLdmJkZWdrVnFuUWcNCi1EbmJrS3ZiZHdXbEF1YVZ1DQotRG5jS2p2YmRGZkpxbkl0Ug0KLUVPYmpqdmJkWmpUSHBIQmYNCi1FUENrS3ZiZGJzREt0RUphDQotRU9jTEt2YmRadElpWkVTbg0KLURvRExLdmJkcHhvSUhSRHgNCi1FUERMS3ZiZFRwcU90dUlODQotRG5iamp2YmRtb3l4dkt4Yg0KLURuY0tqdmJkcUdFRXRXQkkNCi1FUENrS3ZiZFF3TmRDbEhjDQotRG9Da0t2YmRIRUxWaWFqSw0KLUVQRExLdmJkQ0pMQmtJZksNCi1FUERMS3ZiZHZ3TUJXQlZ1DQotRVBES2p2YmR4cm1pTlJhZw0KLUVPY0tqdmJkeFZNZVF5TG4NCi1Eb0NrS3ZiZHJhZWxrZ0xaDQotRVBDamp2YmRkbmRzTFVVUw0KLURvQ2pqdmJkaGdLRFl2S1YNCi1FUERLanZiZEJpS2JLaUZqDQotRG5jS2p2YmRLa0JJV0FLWg0KLURuYmpqdmJkamxha3pFZ1ANCi1FT2JqanZiZE5ydFdHZVVwDQotRVBES2p2YmRpZGtHdVBBTw0KLURuYmtLdmJkakFRSEJQZ0sNCi1Eb0NrS3ZiZFV4Z3Raa1BPDQotRG9ETEt2YmREb0NrTFhERQ0KLURvRExLdmJka1Z2bWNheFgNCi1FUENrS3ZiZG1mZVhtT0haDQotRG9Damp2YmRIRGtXSmFqSw0KLURvRExLdmJka0hnTUdGbkwNCi1FT2JqanZiZEJkUUF1aWxmDQotRVBES2p2YmR4VWxlUXhsTw0KLURvREtqdmJkSmJqRFJKY1kNCi1FUERLanZiZFhzTUFsdE94DQotRU9jS2p2YmRJcnhhU21YbA0KLURvRExLdmJkeVlKSmJRWmsNCi1Eb0RMS3ZiZFFsd2F4blV6DQotRU9ia0t2YmRxdnBNREl5Ug0KLURvQ2tLdmJkaHpWR0xwbkcNCi1EbmNLanZiZEpLRUFKb2ZkDQotRU9jTEt2YmRaTHJFVG5MbQ0KLURuY0tqdmJkUXZuRGNNSUQNCi1FUERMS3ZiZGlMZGRPVWJ5DQotRU9jS2p2YmRlSmlxdlV6bg0KLURuYmpqdmJkc0JlbU1Ha1oNCi1FUENrS3ZiZGR0QVVBU21XDQotRVBDamp2YmRpTGVFT1ZDeQ0KLUVQREtqdmJka3hyclN5SFUNCi1Eb0NqanZiZFVSUW9WVWhODQotRU9jS2p2YmR0a3d3QlVCWA0KLUVPY0tqdmJkZGVPcWF3Q2oNCi1FT2NLanZiZGJBdkVmUG93DQotRVBDa0t2YmR6Uk9tSWpYQQ0KLUVPYmpqdmJkS0RLQ3BpYngNCi1FUERLanZiZElHZnl5WVhnDQotRU9jTEt2YmRlT2RzS3Nzcg0KLUVPY0tqdmJkc0JlbGtnS3kNCi1Eb0RLanZiZEpZVUNJTVJRDQotRU9jTEt2YmRqY01MUWdWSA0KLUVPY0xLdmJkSlRZYVNtWGwNCi1Eb0RMS3ZiZE5kZFVKSWtFDQotRG9ETEt2YmRGamRzQ2hOVg0KLURuYmpqdmJkbXR0eWpqU0cNCi1FUERMS3ZiZFZnd3V4SFl6DQotRU9jTEt2YmRzQ0dNa2ZqeQ0KLUVPY0tqdmJkS1dWR0RlSEoNCi1FUERMS3ZiZGpKZWdqTXdyDQotRG9Da0t2YmROSERRTW90aw0KLURvRExLdmJkam1Ca3lkZ1ANCi1EbmJrS3ZiZFNMWkZ0ZmpzDQotRVBES2p2YmRqYmtqcGZ1SA0KLUVPYmpqdmJka1Z3TmRCd3cNCi1EbmNLanZiZEZ4dHVCRVlDDQotRVBDa0t2YmRyTXpKeGtoSg0KLURvRExLdmJkcHRVR3JTS3QNCi1FT2NLanZiZGh6VWVsUW5HDQotRU9ia0t2YmRzUVZvS0N1Zg0KLURvQ2tLdmJkeml0cFBjc1UNCi1Eb0NrS3ZiZHlTbkpNcWFnDQotRG5jS2p2YmRaUk1lSW1GUg0KLUVPYmtLdmJkWXpjRnJLVnkNCi1Eb0RLanZiZHJOWmpaTUlKDQotRVBDa0t2YmRFdllvb2xpZQ0KLUVPY0xLdmJkTEJLZ05DWHENCi1EbmJrS3ZiZHJwVm5qRFdHDQotRU9ia0t2YmRMTEJIdkFKeQ0KLURvQ2tLdmJkcW1aaXhrZ2kNCi1Eb0NqanZiZGh5dGZMcG1mDQotRG5ia0t2YmRWWkhzeWpvTw0KLUVPYmtLdmJkV1doeFdFRWcNCi1FT2JrS3ZiZGhmakRaV0p1DQotRG9Damp2YmRab09JZGR6Sw0KLURvQ2pqdmJkQ0RvYVdKbUcNCi1Eb0NrS3ZiZHppdG9vY3J0DQotRU9jTEt2YmRPU3N2R2R1UQ0KLUVPY0xLdmJkVnFuWGJFbEQNCi1FUERLanZiZGdGbFpuSEhBDQotRU9jS2p2YmRVc2x0Rmt2Sw0KLUVQQ2tLdmJkZVBGU2tUc3INCi1FUENrS3ZiZHNzU1RZekZEDQotRU9jTEt2YmRWVGxzZWxXSw0KLURuY0tqdmJkWlJNZUpNZHENCi1FT2NLanZiZFlTbEFsc254DQotRG5jTEt2YmRTWmloVERXQQ0KLURuYmpqdmJkdnZsQldBdXUNCi1FT2NMS3ZiZEV2WlBvbGpGDQotRVBES2p2YmRIRUxXSmJKag0KLURvREtqdmJkRGpIaXV4S0ENCi1EbmNMS3ZiZHJNeWpZa2dpDQotRU9jTEt2YmRSYkRkbEl4aw0KLURvRExLdmJkRlZ5UVFNaWUNCi1FT2NMS3ZiZFp4ZEptY01TDQotRVBES2p2YmRGZWpSbWlVUg0KLUVQQ2pqdmJkblB5eHVqeGINCi1Eb0NrS3ZiZGpLR0lLTlhyDQotRG9Damp2YmRZU2xCTlVQWQ0KLURvRExLdmJkWnNoaVpEc08NCi1FUERMS3ZiZGt5VFJzWWZ0DQotRG5jS2p2YmRKYmljUWljWQ0KLURvQ2tLdmJkWEdaWnRBT3MNCi1EbmJrS3ZiZFpqU2dwR2JHDQotRG5jS2p2YmRXU09ZQmVNRA0KLURvRExLdmJkS05BRHlmdGENCi1Eb0RMS3ZiZExCS2dNYllSDQotRU9iamp2YmROZGRUaGhrRQ0KLUVQQ2pqdmJkUWRDYVBxRVMNCi1EbmJrS3ZiZHZCRHlTb0ZJDQotRVBDa0t2YmREb0RMTFdjRQ0KLURuY0xLdmJkYVNHREh0R0wNCi1FT2JrS3ZiZEtOQUR6R3RhDQotRG5jTEt2YmRUQUZKSGFvRQ0KLUVPY0xLdmJkVEFGSklCb0UNCi1Eb0RMS3ZiZFV0TlRlbFdLDQotRVBDa0t2YmRLZWZJQ0FwdQ0KLUVPYmtLdmJkeVNtaGxxYkgNCi1FUERMS3ZiZHVhRVlyb0ZJDQotRG5iamp2YmRTS3hmVkhMVA0KLUVPYmtLdmJkaGtkY25WRFoNCi1EbmJrS3ZiZENTYURUZXZyDQotRG9Da0t2YmRpQm9DZVhRcQ0KLURuY0xLdmJkWmpTaFFHYWYNCi1FUENrS3ZiZEl3c2Fna3FRDQotRG5ia0t2YmRuQ0tXd29OdQ0KLURuY0tqdmJkZWxmV2dOSmsNCi1FT2NMS3ZiZFNQdEhLRmN3DQotRU9iamp2YmRaUk5FaGxlUg0KLURvQ2tLdmJkYkxNR1BOY0ENCi1Eb0NrS3ZiZFJrWkZ0ZmpzDQotRU9jTEt2YmR5U21obVNCZw0KLURvQ2tLdmJkV0h4VndnWXoNCi1FT2JqanZiZFVSUW50dUhtDQotRVBES2p2YmR5U25KTXFiSA0KLUVPY0xLdmJkT1N0V0hFdHANCi1FUENqanZiZGVPZVRLc3RTDQotRG5jTEt2YmRzc1JzWlpkYw0KLUVPYmpqdmJkcm92UEtDdWYNCi1FUERLanZiZGladUZrcU9HDQotRG5jTEt2YmRzQmZOTGZqeQ0KLUVPY0xLdmJkQ0RwQXVqTkcNCi1FUERLanZiZE9Tc3VnRlVwDQotRG9ETEt2YmROUVlSVm1mcw0KLUVPY0xLdmJkVEFFaUhhb0UNCi1Eb0NqanZiZEVQREtqd0RFDQotRVBDa0t2YmRxVVVHcXFrVQ0KLUVQREtqdmJkdGJjVlhWb1ANCi1EbmJqanZiZGhiT2NFdnFSDQotRU9jS2p2YmRDVEFjVUdXcg0KLUVQQ2tLdmJkUWREQXBRY3INCi1EbmJqanZiZFRmem5Md1dGDQotRG5ia0t2YmRDRG9hVmpNZg0KLUVQQ2pqdmJkQnNCRFVGdnINCi1FUENrS3ZiZFdXaVh1Y2VIDQotRG9Damp2YmRKY0pjUkpieA0KLURvRExLdmJkc0NHTWxIS3kNCi1FUENqanZiZFNCY2VMaHlMDQotRG9ES2p2YmRIZmZ6WllZSA0KLUVQQ2tLdmJkdkFkWlRPZUkNCi1EbmJrS3ZiZHh3aGpCcFprDQotRG5jS2p2YmRPRkR0SWhqZA0KLURvQ2pqdmJkbXBaeHVqeGINCi1FT2NLanZiZElyeUFzTXdsDQotRVBDa0t2YmRUcVFudVVoTg0KLURuY0tqdmJkT1NzdkhFdHANCi1FUERMS3ZiZFpvT0lkZVpqDQotRG5ia0t2YmRLZWVnYkFxVg0KLUVQQ2pqdmJkcUZjZVVXQWgNCi1EbmJrS3ZiZENXemNoZHBXDQotRVBDa0t2YmR6UW5saGl3QQ0KLURvRExLdmJkcWRFaVFOdWENCi1EbmNLanZiZGRkb1Jhd0NqDQotRVBETEt2YmRsWXJyU3hmdA0KLURuYmtLdmJkUlduRUNrZ2MNCi1EbmNLanZiZEdZdVVhRVlDDQotRVBETEt2YmRac2lJeGNybg0KLURvQ2pqdmJkSmJpYnFKYngNCi1FUERLanZiZEdZdHVCRHhDDQotRG5iamp2YmRDRVFBdktNZg0KLUVPYmpqdmJkdkFjeVRQRWgNCi1Eb0NrS3ZiZHh3aGpCb3pMDQotRG9ES2p2YmROc1R1Z0ZWUQ0KLURvREtqdmJka0hnTGVlbWsNCi1FT2NMS3ZiZHdXbEJWYVdWDQotRU9jTEt2YmRyTlpqWWtnaQ0KLURuYmtLdmJkSllVQmdsUlENCi1EbmJrS3ZiZGp2V21kQ1h3DQotRU9iamp2YmRtYWpYWVBPVg0KLURuY0tqdmJkRGloSnV4S0ENCi1FUENqanZiZHd6SUdHWUZTDQotRG9ES2p2YmRNcFlRdk9IVA0KLURuY0xLdmJkYmhsakxGd1kNCi1FT2JqanZiZGVsZXZnTWlrDQotRG5iamp2YmRkZVBTQ1diag0KLURuYmpqdmJkS1F5ZG5lbkYNCi1EbmJrS3ZiZFpRbUVobUZSDQotRG9ES2p2YmRqS0ZnaW1ZUw0KLUVPYmpqdmJkQU5JWlN2eXgNCi1Eb0NqanZiZGZIa1dSblJIDQotRU9ia0t2YmRkaWlxdXR6bg0KLUVPY0tqdmJkcVluaEhRZFkNCi1Eb0RLanZiZEtDakRRakN4DQotRG9ETEt2YmRqZ2ZsRmZOaw0KLUVPY0xLdmJkdFRScnh6RWMNCi1EbmJrS3ZiZHVMd3dCVUF3DQotRG5jTEt2YmRrV1hPRUJ4WA0KLUVQREtqdmJkTnhQVnpjblUNCi1FUENqanZiZFVNVm5hV09pDQotRU9ia0t2YmRaUW1GSW1FcQ0KLURuY0xLdmJkUXZtZERNSUQNCi1FT2JqanZiZEdGalNOaHNxDQotRU9jTEt2YmRiQXZGRnBRWA0KLURvQ2pqdmJka0NranFHdUgNCi1FUENrS3ZiZGJMTGVvTmNBDQotRG9ETEt2YmRlbUZ3R21Kaw0KLUVPY0tqdmJkVlVNdEZsV0sNCi1FUERMS3ZiZFdYSlh1Y2RnDQotRG5jTEt2YmRxY2RocE51YQ0KLURuY0xLdmJkR1l1VWFEeEMNCi1FUENrS3ZiZEdaVXRhRHdiDQotRU9jTEt2YmRqdXdPRGF4WA0KLUVPY0tqdmJkU0t5RnVIS3MNCi1FT2NMS3ZiZE5RWVF2T0hUDQotRVBDa0t2YmROR2NRTlB1TA0KLUVPY0xLdmJkUElBWVpBWkINCi1FT2JqanZiZE1mY1BscFZMDQotRVBDamp2YmRMQWpmbGJYcQ0KLUVQQ2pqdmJkeVNtaG1SYkgNCi1FUERLanZiZHhzTmhtU0JnDQotRU9jS2p2YmRaTVNEc21rbQ0KLURvQ2pqdmJkYkF1ZGZRUVgNCi1Eb0NqanZiZGVQRXJqdFRyDQotRG5jS2p2YmR0a3hYQlVCWA0KLURvQ2tLdmJkcXZva2JpWXENCi1EbmJqanZiZE1mYnBNb3VMDQotRG5iamp2YmRpakZoS05Ycg0KLURvREtqdmJkaGdKY1pWalYNCi1FUERLanZiZElIR3paWVlIDQotRG5iamp2YmROc1R1ZmVWUQ0KLURuYmpqdmJkcWx5aXhsSUoNCi1FUERMS3ZiZG1haXZ4UE9WDQotRG5ia0t2YmRtSkRzcHRyQg0KLURuYmpqdmJkUVltQUdzU0sNCi1FT2NLanZiZFpqVElRSENHDQotRVBES2p2YmRxR0RlVHVhSQ0KLUVPY0xLdmJkQURTWUp6SXANCi1EbmNMS3ZiZGV1endvaXpzDQotRU9iamp2YmRGeVV1QkVYYg0KLURuY0xLdmJkblV0eWtKcWYNCi1FUENqanZiZGVsZlhHbUtMDQotRU9jS2p2YmRLQ2pEUWpEWQ0KLURuY0tqdmJkYWFWZUdQb3cNCi1EbmNLanZiZHF2b2xESllxDQotRG9Damp2YmREbmJqa1diZA0KLURvQ2pqdmJkamxha3llSFANCi1Eb0NrS3ZiZExaUkpyenRmDQotRG5jS2p2YmRaaXNJUUhDRw0KLUVQRExLdmJkWnlEak5ia3INCi1EbmJrS3ZiZExBamZtQndxDQotRU9jS2p2YmR0U3FyeVplRA0KLUVPY0xLdmJkSU1Cem12cUwNCi1FT2JqanZiZGlWWmR2cXRiDQotRG9ETEt2YmRNZ0RQbVFWTA0KLUVQRExLdmJkTWdDcE5QdGsNCi1FT2JqanZiZEtWdUdEZUhKDQotRU9jTEt2YmRqSmVoSmx4Uw0KLUVQQ2tLdmJkaGxFY211RFoNCi1Eb0RLanZiZEhmZ1p5WHdnDQotRVBDamp2YmRTaHlpcUFCTQ0KLUVQRExLdmJkTWdDb2xvdUwNCi1FUERMS3ZiZFZxbXdhZGtjDQotRVBDamp2YmRuQ0tXd25tdQ0KLURuY0tqdmJkUnBVR2pHRVgNCi1Eb0RLanZiZGtXV25FQ1lYDQotRG5iamp2YmRrTWFsWmVHbw0KLUVPY0tqdmJkeFVsZVJZa24NCi1FT2JrS3ZiZEZ4dHVCRHhDDQotRU9iamp2YmRuR2R3bG5HeQ0KLUVPYmtLdmJkdWFFWXNPZUkNCi1FUENrS3ZiZHlUT0pNckJnDQotRU9iamp2YmRESE1GZ0F6Yw0KLURuYmpqdmJkRU9jS2tYQ2QNCi1FUERMS3ZiZEJoamJMSWZLDQotRVBDa0t2YmRadEpKWkVUTw0KLUVPY0xLdmJkSXdzYWdrcVENCi1Eb0NrS3ZiZFp5RGpOYmtyDQotRG5iamp2YmRCc0Fic2ZXcg0KLURvQ2pqdmJkZU9lU2pzc3INCi1FT2JrS3ZiZFZVTlVHTVdLDQotRG5jTEt2YmRmTWZXZm1LTA0KLURvQ2pqdmJkdWFFWlRPZGgNCi1Eb0NrS3ZiZFppc0lQZ0JmDQotRG5iamp2YmRWWkh0WmpvTw0KLURvQ2pqdmJkQ1d6Y2hlUHYNCi1FT2JqanZiZEptQUVaZnVCDQotRU9iamp2YmR2dmthVmFXVg0KLURvQ2pqdmJkaWllZ2pOWHINCi1EbmJqanZiZGNTY0xVRUphDQotRG5jTEt2YmRKWHNiSGxRcA0KLUVQQ2pqdmJkcnBXT2pEVmYNCi1Eb0RMS3ZiZERuYmpqd0RFDQotRG5iamp2YmR4blNoWVNpRA0KLURvQ2pqdmJkcUdFRlVXQkkNCi1Eb0RLanZiZHRTclRZekVjDQotRU9ia0t2YmRFUERMTFdjRQ0KLURvREtqdmJkS1F6RW5mT0YNCi1FUERMS3ZiZEl3dEJoTVJRDQotRG9Damp2YmRUdkxvalVCUg0KLUVQRExLdmJkWnlEaW1ia3INCi1FUERMS3ZiZHB0VGZyU0t0DQotRG5jTEt2YmRrTWJMeWVIUA0KLUVPY0tqdmJkS2ZGaEJhUXUNCi1FT2JqanZiZGVFb1JiWERLDQotRU9jS2p2YmRIRGp2SmJKag0KLUVPYmtLdmJkRXp0UWVMY0oNCi1EbmNLanZiZFV0TXNmTHVqDQotRG5iamp2YmRSWE9FQ2tnYw0KLURuY0tqdmJkTEFqZm1CeFINCi1FT2NMS3ZiZHNQdlBKY1ZmDQotRVBDamp2YmR5Z1lsQU1kdw0KLURuYmpqdmJkbXVWWmtLUmYNCi1FUENrS3ZiZFNaaWdyY1dBDQotRG5jTEt2YmRjSk1pa0dXeA0KLUVPY0tqdmJkR0xFcmNIbHUNCi1Eb0RLanZiZEtOQUR5Z1VhDQotRVBETEt2YmRNZmJvbHBVaw0KLURvRExLdmJkVXhoVHlqb08NCi1FUENrS3ZiZE10cnFqbUFYDQotRVBETEt2YmRMQkxHbUJ4Ug0KLURvQ2pqdmJkcnpNUVRBZ24NCi1FUERMS3ZiZFV4aFR5a1BPDQotRG5ia0t2YmRuVlV6TEpxZg0KLURvQ2tLdmJkTFlwaXJ6dGYNCi1FUERMS3ZiZEZlalNPSXRSDQotRG5jTEt2YmR2bHZBTkRlTg0KLURuY0xLdmJkd3RsZVJZa24NCi1FT2JrS3ZiZGNKTktMRnZ4DQotRVBDamp2YmRZU2thTlRueA0KLUVPY0xLdmJkU3hLbE56angNCi1EbmJqanZiZEhiTVpkekFEDQotRVBDamp2YmRYblJBWHVWdA0KLURvREtqdmJkUW1ZQnhuVXoNCi1Eb0NrS3ZiZFdTT1lDRWtjDQotRG5ia0t2YmRlbUdYR2xpaw0KLUVPYmpqdmJkTmVEc2lKTEUNCi1Eb0NrS3ZiZGJpTWlqZlhZDQotRVBDamp2YmRtSWRUcHRyQg0KLURvQ2pqdmJkRXp0UWVNREoNCi1EbmNMS3ZiZENJamJMSWZLDQotRVBDamp2YmRoa2VFTnVEWg0KLURvQ2tLdmJkQU1neHNXelkNCi1Eb0NqanZiZGladGVsUW5HDQotRU9jS2p2YmRXWEpYdWNlSA0KLUVPY0xLdmJkWlJNZUpNZVINCi1FUENrS3ZiZGlWWmR2cXVDDQotRG9ETEt2YmRrVnZtZENYdw0KLUVPYmpqdmJkbkhFeE1tZ1oNCi1FUERLanZiZEhnSFp5WVlIDQotRVBES2p2YmRSYkVGTUpZaw0KLUVQQ2tLdmJkdkJFWlNuZGgNCi1EbmJrS3ZiZGNTY0xUZEphDQotRG9ETEt2YmRjSk1pamZYWQ0KLURuYmpqdmJkZG5kcmpzdFMNCi1FUERMS3ZiZGJpTkpqZXZ4DQotRG5ia0t2YmRPU3N2R2R1UQ0KLURvREtqdmJkTW93cHZOZnMNCi1Eb0NrS3ZiZFpqU2dwR2FmDQotRG5ia0t2YmRkZG5xYXdESw0KLURvRExLdmJkS2FMR21DWVINCi1Eb0NqanZiZG11VlprS1NHDQotRU9jS2p2YmRaUWxkaU1kcQ0KLUVPYmpqdmJkUk5YYXlPVXoNCi1EbmNMS3ZiZGV1enhRSnpzDQotRG5jTEt2YmRFT2NLa1hDZA0KLURuY0tqdmJkaHR5ZVhTVWINCi1EbmJqanZiZEVPYmprWERFDQotRG5jTEt2YmRLUXllUEdOZQ0KLUVPY0xLdmJkSGdHelpYd2cNCi1FT2JrS3ZiZHJNekp4bElKDQotRU9ia0t2YmRSWE5kQ2xIYw0KLURvRExLdmJkd3pJRmV4RXINCi1FUERLanZiZEpZVUNJTVFwDQotRG5ia0t2YmRoYk9jRldxUg0KLUVPY0tqdmJkbkdkeE1tZ1oNCi1FT2JqanZiZGRlT3Fhd0NqDQotRVBDamp2YmRxVHNnU1NLdA0KLURuY0tqdmJkSlh0QmhMcVENCi1Eb0RMS3ZiZGF0YWdZS3NoDQotRU9jS2p2YmRqRWtIVW9BTw0KLURuY0tqdmJkTEZmSUNCUlYNCi1EbmJrS3ZiZEtReWRvRm1lDQotRVBES2p2YmRobEZFT1ZDeQ0KLUVQQ2tLdmJkWnhkSm1ibFMNCi1FUERLanZiZEpiakNxS0N4DQotRG5jS2p2YmR3TldBTkRkbQ0KLUVQRExLdmJkcHlQSGZxRHgNCi1FUENqanZiZE9UVHVmZVZRDQotRVBDa0t2YmR0YmJ0dnZPbw0KLURvQ2pqdmJkYkJXRWZRUVgNCi1FT2JqanZiZEtOQUVaZ1ZCDQotRG5iamp2YmRKWHRCZ2txUQ0KLUVQQ2pqdmJkR1l0dUJFWGINCi1Eb0RMS3ZiZFpqU2hRR2FmDQotRG9ETEt2YmRRbVlDWW5Veg0KLUVPY0xLdmJkcGVkRlR2QWgNCi1FT2JqanZiZEtReWRvR05lDQotRVBDa0t2YmRLREpjUktEWQ0KLUVPYmtLdmJkcmFmTWtma1oNCi1FT2JrS3ZiZGlDT2Jkd1JSDQotRVBDamp2YmRkQnNNckFVTg0KLURvREtqdmJkV0lYdlhnWXoNCi1Eb0RLanZiZGtDbEtwZnRnDQotRU9jS2p2YmRrQ2tqcGZ0Zw0KLUVPY0xLdmJkVnJPWUJlTGMNCi1FT2JrS3ZiZG1veXh1a1pDDQotRVBDamp2YmRkWnlRWHlSQw0KLURvQ2tLdmJkaGJQQ2R2cVINCi1Eb0NrS3ZiZEp2VWVjZUdpDQotRU9jTEt2YmRWcW5YYWVNRA0KLURvQ2tLdmJkV1doeFZjZUgNCi1FUERLanZiZGlHakRaVmpWDQotRU9iamp2YmRHQW5weGl6bQ0KLURvQ2pqdmJkaVp1RmxRbkcNCi1FT2NLanZiZFRxUlBWVklODQotRVBDamp2YmRxZEVob212Qg0KLURvQ2tLdmJkTEFrSE1heFINCi1FUERMS3ZiZE9FZFRoaUtkDQotRG5ia0t2YmRreHJyVFpHdA0KLUVPY0xLdmJkRVBETExYQ2QNCi1Eb0RMS3ZiZFRJektSQUFsDQotRVBETEt2YmRTQ0RlTGlaTA0KLUVQQ2tLdmJkcHlPZ2ZwZFkNCi1FUENqanZiZHRrd3dCVGFYDQotRVBES2p2YmRpQm9DZVdxUg0KLURvQ2pqdmJkaGdKYnh1alYNCi1Eb0RMS3ZiZHFkRWhwTnZCDQotRU9jS2p2YmRrQ2tqcUd1SA0KLUVQQ2pqdmJkaGJPYmVYUXENCi1FT2NLanZiZHhzT0ltUmJIDQotRG9Damp2YmRLV1ZGY2VISg0KLURvREtqdmJkQmlLYktpR0sNCi1FUERLanZiZG5HZVhtTmdaDQotRVBES2p2YmRpaWZIak5ZUw0KLUVPY0tqdmJkYXVCZ1hqc2gNCi1EbmJrS3ZiZFV0TXNmTHZLDQotRG5jS2p2YmROcnRWZ0V1UQ0KLUVQRExLdmJkVXNtVUdMdksNCi1FT2NMS3ZiZE5HY1FNcFZMDQotRVBDa0t2YmRxbVpqWkxoSg0KLUVPYmtLdmJkRmZLU09KVVINCi1EbmNLanZiZGhhb0NlWFJSDQotRG9Da0t2YmRtZmR3bG5HeQ0KLUVQQ2pqdmJkamJranFHdUgNCi1Eb0RLanZiZGxxeVZac0VKDQotRG5iamp2YmRXV2lZVmNkZw0KLUVPY0tqdmJkZUFUcU13akcNCi1FT2NLanZiZHFVVGdTU0t0DQotRG5jS2p2YmRxd1FNREpaUg0KLUVQQ2tLdmJkc1FWb0pidWYNCi1Eb0NqanZiZFZUbVVGbFZqDQotRG9ES2p2YmRtYWpXeFBPVg0KLUVPY0tqdmJkVVFwb1V0aE4NCi1Eb0RLanZiZHdNdkFNZEVtDQotRVBETEt2YmREbmJrTFhERQ0KLURuY0xLdmJkRmZLU05pVHENCi1EbmNLanZiZElyeUJTbHdsDQotRG9ES2p2YmRtZ0V3bG1meQ0KLURuY0tqdmJkcXdQa2JoeVINCi1EbmNMS3ZiZE5lRVRpSktkDQotRU9iamp2YmREb0Nqa1hDZA0KLUVPYmtLdmJkamdmbEZmTmsNCi1EbmNMS3ZiZHhzTmhsckNIDQotRG9Damp2YmRlRk9yQ1diag0KLUVPYmpqdmJka05Ca3pGSFANCi1Eb0NqanZiZHhybWlOU0NIDQotRU9jTEt2YmRWd0pYdkRlSA0KLUVQQ2tLdmJkWlJNZGhtRXENCi1FT2JqanZiZGpTemhzS2l6DQotRG9Da0t2YmRxZEVpUU9WYQ0KLUVPY0xLdmJkcGFKRkFXaEUNCi1FUERMS3ZiZFJrWWZWR2pzDQotRG5jS2p2YmRNcFhxV05nVA0KLUVPY0xLdmJkVlloVVprUE8NCi1Eb0NqanZiZFV4aFR5am5uDQotRG9Da0t2YmRPWU91emNtdA0KLURvREtqdmJkWkxxZFVObE4NCi1Eb0RMS3ZiZEpTeUJUTXhNDQotRG9ETEt2YmRZT1JBWHR1dA0KLURuY0tqdmJkSGZmell4WGcNCi1EbmNMS3ZiZG1wWnlWanlDDQotRU9jS2p2YmRtZmVYbG5HeQ0KLURvRExLdmJka0hma2VlbkwNCi1Eb0RMS3ZiZEpUWkJTbVlNDQotRU9ia0t2YmRyTXpLWk1IaQ0KLURuY0xLdmJkaUxlRG11Q3kNCi1Eb0RLanZiZGp2WE5jYllYDQotRG5ia0t2YmRySkFKZU1uZQ0KLURvRExLdmJkdmx2QU1kRk4NCi1FUENqanZiZFpMckRzbWxODQotRG5iamp2YmRhYVZkZlBwWA0KLUVPYmtLdmJkcmJGbGtmankNCi1Eb0RLanZiZEdMRXJiaE5WDQotRG9Damp2YmRDSWtDS2hmSw0KLURuYmpqdmJkZUVvU0J3REsNCi1EbmNMS3ZiZGlyemlTaml6DQotRVBES2p2YmR3eklHR1lFcg0KLURuY0tqdmJkYlZDR3drVGgNCi1FT2JrS3ZiZGFrTUZubWNBDQotRG5ia0t2YmRScFVIS0ZkWA0KLURvRExLdmJkTVNXbHl0cHoNCi1EbmNMS3ZiZHBzc2dSckt0DQotRVBDamp2YmRaUk1lSW1FcQ0KLURvQ2pqdmJkcXJWS21qYU4NCi1FT2JqanZiZGpBUUdhUGZqDQotRG9ETEt2YmR5cU9tSkp3QQ0KLURuYmpqdmJkUWNjQXBSRVMNCi1Eb0RMS3ZiZElzWWFTbVhsDQotRVBDamp2YmRyb3ZQS0RXRw0KLUVQRExLdmJkcWRFaHBPVmENCi1Eb0NrS3ZiZFZ2aVlWZEVnDQotRG9Damp2YmRxWlBJR3FFWQ0KLUVQQ2tLdmJkT1RUdkdlVlENCi1Eb0NrS3ZiZERuY0xMWENkDQotRU9ia0t2YmR2QkVZc09lSQ0KLURvQ2pqdmJkWU9SQVlWVnQNCi1FT2NMS3ZiZGhnS0N4dWl1DQotRG9ES2p2YmRkZG9SYldjSw0KLUVPYmtLdmJkbW95eVdLeUMNCi1FT2NMS3ZiZHlZSkpiUVprDQotRG5iamp2YmRVeUlVWmtQTw0KLURuY0tqdmJkRnlVdUJEeEMNCi1Eb0NqanZiZG5RWnlWanlDDQotRG9ETEt2YmRhdGJIWUtzaA0KLURvQ2pqdmJkY3pZb3d4cGINCi1EbmNMS3ZiZElzWkFzTXhNDQotRVBES2p2YmRHS2VUQ2hNdQ0KLURvQ2tLdmJkcHRUZ1NSanQNCi1FUERLanZiZE10cnFqbUFYDQotRG5jTEt2YmRLUXpFb0ZtZQ0KLUVPYmpqdmJkRnh0dUFjeEMNCi1EbmNLanZiZGtETGtSSFZIDQotRVBDa0t2YmR1bnN6cUtudA0KLURvQ2tLdmJkZXp1eGVKVHcNCi1FT2JrS3ZiZHpqVlFRRHNVDQotRVBETEt2YmRqS0dJS014Uw0KLURvQ2pqdmJkY3l5UVh4cUMNCi1FT2JrS3ZiZGh0eWR3UnRiDQotRG5iamp2YmRmTkdYSE5LTA0KLURvREtqdmJkbW95eHVqeGINCi1EbmNMS3ZiZG11VlprSnFmDQotRU9ia0t2YmRaeURqTmJrcg0KLURuYmtLdmJkeVhoaWFvekwNCi1FT2JrS3ZiZEtXVWZEZUhKDQotRG9Da0t2YmRkb0ZUTFVVUw0KLURuYmpqdmJkSnZVZkVGSEoNCi1FT2JqanZiZHNycXJ4ekZEDQotRU9iamp2YmRtZ0ZZTW1meQ0KLURuYmpqdmJkYnJjTFRjakINCi1FUERLanZiZFp0SWlaRVRPDQotRG5jS2p2YmRTTFpHVkhMVA0KLUVPYmpqdmJkaHR6RlhTVkMNCi1FT2NLanZiZHZBY3hzUEVoDQotRU9jS2p2YmRicmJqc2RLQg0KLURvREtqdmJkZXp1eGRpVHcNCi1Eb0RLanZiZGhrZGNuVkRaDQotRG9Da0t2YmROZGRVSklrRQ0KLURuYmpqdmJkc0NHTWxHankNCi1FT2NLanZiZHNzU1N4eWRjDQotRG9Damp2YmRTUHRISmZEdw0KLURvRExLdmJkbVJ5VlpyZEoNCi1FT2NMS3ZiZEJkUUJWak5HDQotRVBDamp2YmR0dk9YaXBzQQ0KLUVPY0xLdmJkRHd3bFVVVU0NCi1FT2JrS3ZiZGhrZUVOdURaDQotRU9jS2p2YmR3eWdmR1lFcg0KLURuY0tqdmJkYnNDa1VFSmENCi1EbmJrS3ZiZHZsdkFNY2VODQotRVBES2p2YmRUdk1QaXRBcQ0KLUVQRExLdmJkTW93cHZPSFQNCi1FT2NLanZiZE5RWHB2TmdUDQotRG5jS2p2YmRZemNGcWl1eQ0KLUVPYmpqdmJkcVVVR3JSanQNCi1FT2NLanZiZFVhQnFUUlNaDQotRG5iamp2YmRyYWZNa2ZqeQ0KLURuY0xLdmJkbWdGWG1OZnkNCi1EbmNLanZiZE5ydFZmZHRwDQotRU9jS2p2YmRWWklUeWpvTw0KLUVQREtqdmJkVHVrcEp0QlINCi1Eb0RMS3ZiZHlPVEh4VEljDQotRG5iamp2YmRzQmZOTGZrWg0KLUVQQ2pqdmJkbUpEdFJWU0INCi1FT2JqanZiZG1KRHRSVXJCDQotRG5iamp2YmRpVlplV3JWQw0KLURuY0tqdmJkQmlLYWpoZksNCi1EbmJrS3ZiZHppdVFQY3NVDQotRU9jS2p2YmRHRmlxbkpUcQ0KLURvQ2pqdmJkQU1oWlRYWngNCi1EbmNMS3ZiZERqSGl1d2pBDQotRG5ia0t2YmRCZFFCVmpORw0KLUVQQ2pqdmJkcWx6S1lrZ2kNCi1EbmNMS3ZiZExMQklXQUp5DQotRG5jTEt2YmRiaGxqS2ZYWQ0KLURuY0tqdmJkYW9nSEVMemQNCi1EbmJrS3ZiZGpFa0d0b0FPDQotRG5iamp2YmRHZEt2SmJLSw0KLUVQRExLdmJkcXJVam5LYU4NCi1FT2JqanZiZG5WVXlrS1NHDQotRVBES2p2YmRWck53YkZNRA0KLURvREtqdmJkdmx2QU1kRW0NCi1FUENqanZiZGFhV0Vlb3BYDQotRVBETEt2YmRVTHVvQlZvSg0KLUVQRExLdmJkempVcFBjc1UNCi1FUERLanZiZFpubkpFZHlqDQotRVBES2p2YmR0bFh3QXNhWA0KLUVQQ2pqdmJkakpmSGltWHINCi1FUENrS3ZiZHh3aUtCcFprDQotRG9Da0t2YmRMaUJsUXhBUw0KLUVPYmtLdmJkWEZ4eXRBT3MNCi1FT2JqanZiZG5RWnh1a1liDQotRG5jS2p2YmRaeGNqTmNNUw0KLURuYmtLdmJkUWNiYVFRY3INCi1FT2JrS3ZiZFZneFZ3Z1l6DQotRG9ETEt2YmRkb0VzTFVVUw0KLUVPY0tqdmJkVHBwbnR0Z20NCi1Eb0RLanZiZEJoa0JqaGVqDQotRVBDa0t2YmRsaGNzcVZSYQ0KLURvREtqdmJkWnNoaVljc08NCi1Eb0RLanZiZHRjRFV2dlBQDQotRG5ia0t2YmRSa1pGdUdqcw0KLURvQ2tLdmJkYWFWZUZvcFgNCi1FT2JrS3ZiZFlPUkFYdHV0DQotRG5jTEt2YmRxd1BsREpZcQ0KLURvRExLdmJkYkJXRWVwUHcNCi1EbmJrS3ZiZFZ2aHhXRGRnDQotRU9ia0t2YmRmSGtWcW1wZw0KLURuY0tqdmJkYU1qYXJ0bUgNCi1FUENrS3ZiZEJoamJMSWVqDQotRG9Damp2YmRDSWpiS2lGag0KLURvREtqdmJka0lITGVmT0wNCi1FT2NLanZiZHJiR01sR2taDQotRG5jTEt2YmRQeG1BR3NSag0KLUVPY0tqdmJkWnhkS09ETVMNCi1EbmNLanZiZGtETGpxSFVnDQotRU9jTEt2YmRqRWtIVW9BTw0KLURvRExLdmJkcm92T2pEVmYNCi1EbmNMS3ZiZFpzaGlaRVNuDQotRG5jS2p2YmRVeUlVWmpubg0KLUVQRExLdmJkeG1yaFlTaUQNCi1Eb0NqanZiZGFOS2FzVWxnDQotRG5ia0t2YmRZcU1lSk1kcQ0KLURuY0tqdmJkWm9PSWVFeWoNCi1FT2NLanZiZGVtR1hHbGlrDQotRU9iamp2YmR5emRuUmhJaA0KLURuY0tqdmJkSEVLdkpiSmoNCi1FT2JrS3ZiZFNDRGRsSXhrDQotRVBDamp2YmRHQW9ReGl6bQ0KLURvQ2pqdmJkYU5LYXNWTWcNCi1FT2JrS3ZiZGVQRXJrVHRTDQotRVBDamp2YmRsaGRVUXVTQg0KLUVQREtqdmJkTlFYcHZPR3MNCi1Eb0NrS3ZiZFhuUkFZVXV0DQotRU9ia0t2YmRjVENrVUVLQg0KLURuY0xLdmJkbVJ5VXpTZEoNCi1FUERMS3ZiZHJTVkxOa0FtDQotRG9Da0t2YmRKdlVlY2RnSg0KLURvRExLdmJkUkRiYVFSRHINCi1FUERLanZiZFlsU0VUbWxODQotRVBDa0t2YmRiVWFnWUt0SQ0KLUVQQ2pqdmJkc3NScnh6RkQNCi1FUENqanZiZFJNd2JZbXR6DQotRG5iamp2YmR4cm1obVJhZw0KLURvREtqdmJkVHZMcEp0QXENCi1FUERLanZiZFZCQnBycHJaDQotRG5ia0t2YmRSa1lldUdrVA0KLUVPY0tqdmJkbWJLV3dvT1YNCi1FT2NLanZiZFplWUd6Z2hiDQotRVBDamp2YmRGZWlyT0pVUg0KLURvQ2tLdmJkWnNpSXhjcm4NCi1FUERLanZiZERuYmtLdmNFDQotRG9ETEt2YmRzcnJUWlplRA0KLURuY0tqdmJkSmJqQ3BpY1kNCi1EbmJqanZiZGN5eHBYeHBiDQotRVBDamp2YmRyWFFMYmh4cQ0KLURuY0tqdmJkelJPbUpKd0ENCi1Eb0RLanZiZHFkRklwTnZCDQotRVBES2p2YmRrSGZrZkdOaw0KLURvREtqdmJkRmpkc0RJTlYNCi1Eb0RLanZiZFV5SVR5am9PDQotRU9jTEt2YmRpVXpFd1J0Yg0KLUVQQ2tLdmJkbWZlWU1tZ1oNCi1EbmNMS3ZiZEhnR3l5WHhIDQotRU9ia0t2YmRNdVRTTE5BWA0KLURuY0tqdmJkdGJjVXdXT28NCi1Eb0NqanZiZFZ3SXhXRUZIDQotRU9jS2p2YmRoZ0pjWldLVg0KLURvQ2pqdmJkc0NGbGxITFoNCi1FUERLanZiZEdjanZKYktLDQotRU9jTEt2YmRuR2VZTk5meQ0KLURuY0tqdmJkWm5uSWVGWmoNCi1Eb0RLanZiZHhVbGRxWkxuDQotRU9jS2p2YmRyb3ZPaWJ2Rw0KLURvREtqdmJkVVdMcEtUYVINCi1EbmNLanZiZGVQRlRLdFRyDQotRVBETEt2YmRGeHR1QWRZQw0KLURvRExLdmJkZklLdlJuUWcNCi1FUERMS3ZiZHlwbm1JalhBDQotRG5jS2p2YmRiVWFnWUxVSQ0KLUVQREtqdmJkblZVeWppcWYNCi1FT2JrS3ZiZEtXVkdEZUdpDQotRU9ia0t2YmRhTktiU3VNZw0KLURvREtqdmJkTlZTcWtOQVgNCi1FT2JrS3ZiZGhiUERGV3FSDQotRG9ETEt2YmRMR0ZoQmFSVg0KLUVPY0tqdmJkYnJjTFVEakINCi1FT2JqanZiZFpIWEVBUFRKDQotRVBDamp2YmRDU2FEVGV2cg0KLURuY0xLdmJkZ1FCenZjeEkNCi1FT2JqanZiZGlkamZ1UEFPDQotRG9ETEt2YmR6alVvb2RUVQ0KLURuY0tqdmJkR0xFc0NoTlYNCi1FUENqanZiZE5lRHNoaUxFDQotRU9iamp2YmRHR0tSbklzcQ0KLUVPYmtLdmJkZVladFRxZXoNCi1FT2NLanZiZFF3T0RibEhjDQotRG9Da0t2YmRrQ2xMUkhWSA0KLUVQQ2tLdmJkeFVsZHFZa24NCi1FUENrS3ZiZHZCRHhzUEZJDQotRG5ia0t2YmRxdnBMY0l5Ug0KLURuY0tqdmJkcW1aaXhraEoNCi1Eb0RMS3ZiZGtWd05kQ1lYDQotRU9ia0t2YmRVeGdzeWtQTw0KLUVQQ2tLdmJkamNManBnVWcNCi1EbmJqanZiZGJVYWdZS3RJDQotRU9iamp2YmREakhqV1hqQQ0KLUVPYmpqdmJkcnlrcFNhSU8NCi1FT2JqanZiZHJiR01sR2p5DQotRG5jTEt2YmRWWWhVWmpubg0KLURvRExLdmJkamxha3lkZm8NCi1EbmJrS3ZiZFZUbVVHTVZqDQotRU9iamp2YmRaalRJUUhDRw0KLUVPY0xLdmJkWnhjak5jTHINCi1Eb0NrS3ZiZHFUc2dTUmp0DQotRG5iamp2YmRDSWtCa0pGag0KLUVQQ2tLdmJkYW9nSEVMemQNCi1FUENqanZiZE5QeFF1bkdzDQotRU9iamp2YmR4WmhGZlhlUw0KLURvREtqdmJkamJsS3FIVWcNCi1FT2JrS3ZiZE5QeFJXTmdUDQotRG9ES2p2YmRrYU5PbUFMQQ0KLUVQRExLdmJkeHNPSW1TQ0gNCi1FT2NMS3ZiZFpzaGh5RVRPDQotRVBETEt2YmRJSEhaeVlZSA0KLURvREtqdmJkbGlFVVJWUmENCi1FT2JqanZiZGlWWmVYUnRiDQotRU9jS2p2YmRpSEpjWXZKdQ0KLUVPY0tqdmJkSXNZYVROWGwNCi1Eb0NrS3ZiZHRsWHZhVGFYDQotRU9jS2p2YmROUVlSVm5IVA0KLURvREtqdmJkZGpKcXZVem4NCi1Eb0RLanZiZFVMdW9CVm9KDQotRG9ETEt2YmRVc2xzZWxWag0KLUVQQ2tLdmJkZGVQU0NXYmoNCi1FUERLanZiZE5lRHRJaUtkDQotRU9jS2p2YmRpVXpGWFNVYg0KLURvQ2tLdmJkbVJ5VlpzRUoNCi1FUENqanZiZHVMd3dBdEJYDQotRVBETEt2YmR4WmdmR1hkcg0KLURuYmtLdmJkQmNwQXVqTkcNCi1EbmJqanZiZFp0Skl5RHJuDQotRU9iamp2YmRtYkp2d25tdQ0KLUVQQ2pqdmJkWG5SQVlWV1UNCi1FT2NMS3ZiZHlPU2hYc0pEDQotRG9Damp2YmRwdFVHcXFrVQ0KLURuYmtLdmJkRnBBU3dIR1oNCi1EbmJrS3ZiZHd0bGVSWWxPDQotRVBDa0t2YmRuSEZZTW1meQ0KLUVQREtqdmJkS0NqRFFqRFkNCi1FT2JrS3ZiZGVxYVd6bERQDQotRG9Da0t2YmRiTE1HUE9EQQ0KLURvQ2pqdmJkcHlQSUdxRHgNCi1FT2NLanZiZGJobUtMRndZDQotRG9ETEt2YmRFT2NLandDZA0KLUVQQ2tLdmJkZVBGVEt0VVMNCi1FUENrS3ZiZHR2TndpcHNBDQotRVBDa0t2YmR6b1FRZGJsWQ0KLUVPY0xLdmJkS2phSHZBSnkNCi1FUERLanZiZHZQVHpwa090DQotRVBES2p2YmRNSkNMcHhBUw0KLUVPYmtLdmJkV1dod3ZFRWcNCi1EbmJrS3ZiZGNKTkpqZXZ4DQotRG9Da0t2YmROUVhwdW5Hcw0KLUVQREtqdmJkV1NOeEJkbEQNCi1FUERLanZiZHd5aEZld2VTDQotRG5jS2p2YmRkZG5yQ1djSw0KLUVPYmpqdmJkZUtKclZ0em4NCi1FT2JqanZiZHJ5a29zQklPDQotRVBES2p2YmRpaWVoS014Uw0KLURuY0tqdmJkcldwTUNpWlINCi1Eb0NqanZiZGRvRlNqc3NyDQotRG9Damp2YmRiaG1LS2ZXeA0KLUVPYmpqdmJkbWFqV3dvTnUNCi1FT2NMS3ZiZER4WUxzdFVNDQotRVBDamp2YmRkZG9SYXdESw0KLURuY0tqdmJkbXVVektqU0cNCi1Eb0RLanZiZExGZWdiQlJWDQotRVBDa0t2YmR5U25KTXFiSA0KLURuYmpqdmJkTExBZ3ZBS1oNCi1FUENqanZiZHJhZW1NSExaDQotRU9iamp2YmRuVXR6TEtTRw0KLUVQREtqdmJka0RNTFFnVkgNCi1Eb0RLanZiZGtIZ01HR09MDQotRG9Damp2YmR4c05pTlNDSA0KLUVPYmtLdmJkTlFYcHZPSFQNCi1FT2JrS3ZiZFF3TmRETGdjDQotRG5iamp2YmRlZ2tXUm5SSA0KLURuYmtLdmJkR1pVdUFjd2INCi1EbmNMS3ZiZGlNRWNtdUN5DQotRG9ETEt2YmRGZkpxbkpUcQ0KLURvREtqdmJkWm5uSkZFeksNCi1FT2NMS3ZiZFRxUlBVdGdtDQotRU9jTEt2YmRSanlGdUhMVA0KLUVPY0tqdmJkaHR6RXdSdGINCi1FT2JqanZiZFRYamttemp4DQotRG9ES2p2YmRxZEZKUU9WYQ0KLURvQ2tLdmJkR2NrVmlhaksNCi1EbmNMS3ZiZER4WGxVVHNsDQotRU9jTEt2YmRlVUFVQVNsdg0KLURuYmtLdmJkempVcFFFVFUNCi1EbmJrS3ZiZHRjQ3VXdW9QDQotRG5jTEt2YmRhdUJnWGtVSQ0KLURvQ2pqdmJkVVZsUGl0QlINCi1EbmJrS3ZiZEZmSnJPSXRSDQotRG9ETEt2YmR4blNnd3NKRA0KLUVQQ2tLdmJkWHNNQk5Ub1kNCi1EbmNMS3ZiZENUQWNVRndTDQotRG9ES2p2YmRoZ0pieHZKdQ0KLURvRExLdmJkaGtlRG5VYnkNCi1FT2JrS3ZiZEV2WlBwTktGDQotRVBDamp2YmRpSEpjWldKdQ0KLUVPYmpqdmJkSUhIWnlZWGcNCi1Eb0NrS3ZiZGVna1ZxbXFIDQotRG9Damp2YmR4Vk5GUlpNTw0KLURvRExLdmJkVVFwbnR1SU4NCi1Eb0RLanZiZEVKaEp1d2pBDQotRG9ES2p2YmRrSGZsR0dOaw0KLURuYmtLdmJkbXR0eWtLUmYNCi1EbmNMS3ZiZFp4ZEptYmxTDQotRG5iamp2YmRaUW1FaG1FcQ0KLURvQ2pqdmJkSmNKY1FqRFkNCi1Eb0RLanZiZEJoa0NMSWVqDQotRG9ETEt2YmRtSWNzcHVSYQ0KLURuYmpqdmJkcWlBS0VsbmUNCi1Eb0NqanZiZEpwekVvRm5GDQotRU9jS2p2YmR5T1NoWVRKRA0KLURvQ2tLdmJkbXVWWmppcWYNCi1Eb0RMS3ZiZFNDRGVMaHlMDQotRU9jS2p2YmRKdlVlZEZHaQ0KLUVPYmtLdmJkZWhMV1JuUkgNCi1FUERLanZiZHhtcmhYcmlEDQotRG9ETEt2YmRPVFVXR2VWUQ0KLUVQQ2pqdmJkelJQTWhpd0ENCi1FUERLanZiZEtSWmVQR09GDQotRG9Da0t2YmRyRGVJb212Qg0KLUVQREtqdmJka1Z2bWRCd3cNCi1Eb0RLanZiZElHZnpZd3dnDQotRVBETEt2YmRGVnlQcE5LRg0KLURvREtqdmJkaHl0ZkxxTmYNCi1EbmJqanZiZE1mYm9tUVVrDQotRU9jTEt2YmR0Y0RWWFdPbw0KLURvREtqdmJkcXdQbERKWXENCi1FT2NMS3ZiZFpzaGlaRVRPDQotRU9jTEt2YmRlRW5yQ1hDag0KLUVPY0tqdmJkWkxyRHNuTG0NCi1FUENqanZiZExZcUtTenVHDQotRG5jTEt2YmRNdHNSam1BWA0KLURvQ2pqdmJkSlRaQXJseE0NCi1FUENrS3ZiZGxaU3JUWkd0DQotRG5jS2p2YmRSeWpJVEN2QQ0KLURvQ2pqdmJkRXV4cFBtS0YNCi1EbmJrS3ZiZFRZS2ttemp4DQotRG9ETEt2YmR1RERWWFdQUA0KLURuY0xLdmJkakFQZmFQZ0sNCi1EbmNMS3ZiZHJFRkpQblZhDQotRVBDamp2YmRyWFFNQ2h5Ug0KLURuYmtLdmJkem5wUWVETHgNCi1Eb0NrS3ZiZGpnZmxGZk9MDQotRU9iamp2YmRqbGFsWmRnUA0KLURvQ2pqdmJkdGJjVXZ2T28NCi1Eb0NrS3ZiZHJFRklvbldCDQotRU9iamp2YmR3WE1BdkF1dQ0KLURuY0xLdmJkZVBGU2tVVHINCi1FUENrS3ZiZFRwcG9VdUlODQotRVBES2p2YmRJeFVDSGxRcA0KLURuYmtLdmJkQmlMQmppR0sNCi1Eb0RLanZiZGxpRHNwdVJhDQotRU9iamp2YmRGa0ZURElNdQ0KLUVQQ2pqdmJkc1FWbmpEVmYNCi1FUENqanZiZEtlZklCYVJWDQotRG9ES2p2YmRJcnlBc05ZTQ0KLURvQ2tLdmJkc3Jxcnh6RWMNCi1FUENqanZiZExxd05adVF6DQotRU9jTEt2YmRjSWxpa0dYWQ0KLURvQ2pqdmJkQURTWGl6SXANCi1Eb0NrS3ZiZHVhRVpUT2VJDQotRG5jS2p2YmR2QkR5VFBFaA0KLUVQQ2tLdmJkUmtaRnVIS3MNCi1Eb0RMS3ZiZFNMWkZ1R2tUDQotRU9jTEt2YmRmZWt6T0hIQQ0KLUVPY0xLdmJka2FNb05BTEENCi1EbmNMS3ZiZGtOQ01aZUdvDQotRU9iamp2YmROc1VWZmR1UQ0KLUVQQ2pqdmJkWm9OaUVlWmoNCi1Eb0RMS3ZiZExZcGlyenVHDQotRVBES2p2YmRtb3l4dWp5Qw0KLURvQ2tLdmJkYU1qYlN1TkgNCi1FUERMS3ZiZHh4SWpDUHpMDQotRG5ia0t2YmRWQWFxU3ByWg0KLURvQ2pqdmJkdVZteEpxVEENCi1Eb0NrS3ZiZFJrWkdWSExUDQotRG9ES2p2YmRFdXlRUGxqRg0KLURuYmtLdmJkcHRVSFNSa1UNCi1EbmNMS3ZiZHVMeFdhVUF3DQotRU9iamp2YmRhYVZkZlFRWA0KLUVQRExLdmJkV1dpWVZkRkgNCi1FT2NMS3ZiZGZlbFptZ0hBDQotRG9Damp2YmRBRFJ4S1ppUQ0KLUVPY0tqdmJkZkhrV1NPUkgNCi1FT2JrS3ZiZFRBRWlJQm9FDQotRG5jS2p2YmRFS0lLVnhLQQ0KLURvQ2tLdmJka0RNS3BnVkgNCi1EbmJrS3ZiZENXemNpRXBXDQotRU9iamp2YmR4WmdlZlhlUw0KLUVPY0xLdmJkc1prcFRCSU8NCi1Eb0RMS3ZiZHJKQUtGTW5lDQotRVBES2p2YmRrV1hOZEJ3dw0KLURuYmtLdmJkUmJFRkxoeUwNCi1EbmNMS3ZiZFdYSllXRGVIDQotRU9jTEt2YmRpakZnak13cg0KLURvRExLdmJkbkhFeE1uR3kNCi1FT2JrS3ZiZFplWUd6aEpDDQotRG5iamp2YmRFdlpQcE1pZQ0KLUVPYmpqdmJkWXBsZGlNZHENCi1Eb0NqanZiZGZSYVd6bENvDQotRVBDamp2YmRHWXR1QkR4Qw0KLUVPY0xLdmJkUVltQUdycksNCi1FUENrS3ZiZGxoY3NwdVNCDQotRG9ETEt2YmRlenZaRklzdw0KLUVPY0tqdmJkbFlzU1RaSFUNCi1EbmJrS3ZiZG1mZVhtT0d5DQotRG5jTEt2YmRLREtEUWljWQ0KLURuY0tqdmJkWmpUSVFIQ0cNCi1EbmJrS3ZiZGdGa3pPSEhBDQotRG5ia0t2YmRhTkxCc1ZOSA0KLURvQ2pqdmJkQnNCQ3RHV3INCi1EbmNLanZiZHFkRklvbXZCDQotRG5ia0t2YmRrTkJsWmRmbw0KLURuYmtLdmJkU1FUZ0tHRHcNCi1Eb0NrS3ZiZGRvRlRMVHNyDQotRG9ES2p2YmRFWVlMdFR0TQ0KLUVPY0tqdmJkVndKWVdFRWcNCi1Eb0RMS3ZiZHlPU2d3cmhjDQotRG9Da0t2YmRaTVJkVU9MbQ0KLURvRExLdmJkWVNsQk10T3gNCi1FUENrS3ZiZGt4c1JzWWZ0DQotRG5ia0t2YmRyekxwVEFnbg0KLURuY0tqdmJkUmp4ZlVnS3MNCi1EbmJrS3ZiZHFxdUxOa0FtDQotRG9ETEt2YmRSTXhDWW5Veg0KLUVQQ2pqdmJkWm9PSWRlWmoNCi1FT2JrS3ZiZHJwV09pY1ZmDQotRVBETEt2YmRrQ2tqcUhWSA0KLUVPY0tqdmJkbVNaVXpTY2kNCi1FT2JqanZiZFJqeGZVZ0xUDQotRU9iamp2YmROZGRUaGhqZA0KLURvQ2pqdmJkS1Z1RmNkZmkNCi1FUERLanZiZHpqVlBvZFRVDQotRG5jS2p2YmRKVFlhU21YbA0KLURuY0tqdmJkZFp5UVh5UWINCi1FUENqanZiZENJa0NLaUZqDQotRVBES2p2YmRUa3VuYVdPaQ0KLUVPYmpqdmJkZklLdXFuUkgNCi1Eb0NqanZiZFpSTWRpTWVSDQotRG5iamp2YmRNcFhwdW5IVA0KLURvRExLdmJkWlJORWhtRlINCi1FT2JqanZiZGFvZmZkTHpkDQotRG9ETEt2YmR2QWRZc09kaA0KLURuYmpqdmJkU0xaR1VnTFQNCi1Eb0NqanZiZFNDRGRraVpMDQotRG9ETEt2YmRlbGV3SE5LTA0KLURvQ2pqdmJkUlhOZERNSGMNCi1FT2JqanZiZGtXV25EYXd3DQotRU9iamp2YmRjeXhveFpSQw0KLURuY0tqdmJkZWxmV2ZsakwNCi1FT2JqanZiZFpubkpFZHpLDQotRU9jS2p2YmRrSGZsR0ZuTA0KLURvQ2tLdmJkaGJQQ2R3UlINCi1FUERMS3ZiZEhEa1dLQ0tLDQotRG5ia0t2YmRSYWRFa2lZaw0KLUVPY0xLdmJkRldZb3BOSmUNCi1Eb0RMS3ZiZHFUc2ZyU0t0DQotRU9iamp2YmR4blNneFRKRA0KLUVQRExLdmJkeFpoRmV3ZHINCi1FUENrS3ZiZFR2TG9qVGFSDQotRU9iamp2YmRmSUt1cW5RZw0KLUVQQ2pqdmJkRHhYbFRzc2wNCi1FT2JqanZiZFF2bWNjTGhEDQotRU9ia0t2YmRSTlhheU9Veg0KLUVQQ2pqdmJkYXRiR3hMVGgNCi1FT2NLanZiZE9Tc3ZHZVZRDQotRVBES2p2YmRlUEZUS3N0Uw0KLURuYmpqdmJkbFlzUnNaSFUNCi1EbmJqanZiZFppc0lRR2FmDQotRG9Da0t2YmRzcnFzWXpFYw0KLUVPYmpqdmJkZklMVnFuUkgNCi1EbmJrS3ZiZFpIV2RBUFRKDQotRG9ETEt2YmRFUENrTFhDZA0KLUVPYmpqdmJkRVh3a3RUc2wNCi1EbmNMS3ZiZEZWeVFQbGllDQotRG5jS2p2YmROc1VXSEV0cA0KLUVPY0tqdmJkeXFPbUpLWEENCi1FT2NLanZiZEFEU1lKeWhwDQotRVBES2p2YmRVeUlVWmpvTw0KLUVPY0tqdmJkbUpFVVJWU0INCi1EbmJqanZiZEl3dEJna3BwDQotRVBDamp2YmRaUW1FaGxkcQ0KLUVQQ2tLdmJkRGpIaXV4S0ENCi1Eb0RLanZiZHJFRWlRT1ZhDQotRG5jS2p2YmRLREtEUWpDeA0KLURuY0tqdmJkWlJORkpNZVINCi1EbmNMS3ZiZHd5Z2Vld2VTDQotRG5jTEt2YmRuVXVaa0tTRw0KLURvREtqdmJkdndNQXZCV1YNCi1Eb0NqanZiZEJoa0NMSWZLDQotRG5iamp2YmRvem5Ea1hvQQ0KLUVPY0tqdmJkamdmbEZlbWsNCi1FT2JrS3ZiZEtWdGZEZGdKDQotRG5iamp2YmRYcmthTlVQWQ0KLURuY0tqdmJkaGxFZE50YnkNCi1FUERLanZiZGVtR1dmbUprDQotRG9ETEt2YmRsaGN0UXRyQg0KLUVPYmpqdmJkblZWWmtKcWYNCi1FT2JqanZiZHd1TkVweU1PDQotRG9Damp2YmRUcHFPdVZIbQ0KLUVPYmpqdmJkYkxMZW5uREENCi1Eb0RMS3ZiZGlHakRaV0tWDQotRVBETEt2YmRGamVUREhsdQ0KLURvRExLdmJkRHhZTHN0VU0NCi1FUERMS3ZiZGlVekZYU1ZDDQotRG5jS2p2YmRKWVRiSGtwcA0KLURvQ2tLdmJkWnNoaHhkU24NCi1FUERLanZiZHhybklscWFnDQotRU9jTEt2YmRpSEpjWXZKdQ0KLURuYmpqdmJka1Z3TmNheFgNCi1FT2JqanZiZHB5UElHcGN4DQotRVBDa0t2YmRhdUNHeExVSQ0KLUVPYmtLdmJkV1JuWGFka2MNCi1EbmJrS3ZiZFZVTlVHTHZLDQotRU9ia0t2YmREeFlMc3NzbA0KLURuYmtLdmJkQ0pLYktoZksNCi1EbmNMS3ZiZGJobUtLZlhZDQotRU9jTEt2YmRab09JZUZaag0KLURvRExLdmJka05DTHpGSFANCi1FT2JrS3ZiZHB4bmdnUWRZDQotRU9ia0t2YmRZcU5GSk5FcQ0KLUVQQ2pqdmJkeXpkblNIaGgNCi1FT2NLanZiZGN6WlFZWlFiDQotRG5jS2p2YmRaeURpbWJsUw0KLURuY0xLdmJkeU9USVhyaGMNCi1FT2JqanZiZGh6VWVsUW5HDQotRU9iamp2YmRGamVUQ2hOVg0KLURvQ2pqdmJkd012QU5FRW0NCi1Eb0RMS3ZiZFJYT0VETUlEDQotRG5jS2p2YmRpSEpjWXZKdQ0KLUVPY0xLdmJkaHR6RldyVkMNCi1EbmNLanZiZFZZZ3N5a1BPDQotRG9Damp2YmRHR0tSbWlVUg0KLUVQRExLdmJkUW1YYlluVXoNCi1EbmJrS3ZiZGtJR2xGZW1rDQotRG9Damp2YmRTUHNnSmZEdw0KLURuY0tqdmJkempWUVBjcnQNCi1FUERLanZiZG1mZHhOTmZ5DQotRVBES2p2YmRaeURpbWJsUw0KLURvREtqdmJkQU5JWlN2elkNCi1Eb0NrS3ZiZEpxWmRvR09GDQotRU9jS2p2YmRjSk1pamV3WQ0KLURuY0xLdmJkTlFYcVdOZnMNCi1EbmNMS3ZiZGtOQmxaZUdvDQotRG9Damp2YmRIZmZ6WllYZw0KLURvREtqdmJkamhITUdHT0wNCi1EbmJrS3ZiZGlDT2JkdnBxDQotRG9ETEt2YmRZbFJjdE5rbQ0KLUVPYmtLdmJkaVV6RXdSdUMNCi1EbmNMS3ZiZE1mYm9tUHVMDQotRVBDa0t2YmRsWlNyU3lHdA0KLURuY0xLdmJkdkFjeHJvRkkNCi1Eb0NqanZiZE5HY1FOUVVrDQotRG5jS2p2YmRXU054QmVMYw0KLUVQQ2tLdmJkcXZva2NJeVINCi1EbmNMS3ZiZGRaeVFYeHFDDQotRG9Da0t2YmR2UFR6cUxQVQ0KLURuY0xLdmJkWnhjak5ibFMNCi1FUENqanZiZGtNYkx6RkhQDQotRVBDa0t2YmRsWXJxc1lnVQ0KLURuYmpqdmJkV1NPWGJGTUQNCi1EbmJrS3ZiZFdleVp0QVBUDQotRVBDa0t2YmRFS0hpdllLQQ0KLURvQ2tLdmJka05Ca3llR28NCi1Eb0RMS3ZiZGlCb0RFdnFSDQotRG9ETEt2YmRSa1lmVkdqcw0KLUVPY0tqdmJkZG5lU2tVVHINCi1FT2JqanZiZEZlalJuSXRSDQotRG5jTEt2YmRMQWpnTWJYcQ0KLURuYmtLdmJkVUd6bkx3VmUNCi1Eb0RLanZiZExxd05adHB6DQotRVBES2p2YmRVeGhUeWpubg0KLUVQRExLdmJka05Ca3llSFANCi1Eb0NqanZiZGdGa3pOZ0hBDQotRU9iamp2YmR1bnN6cGpudA0KLUVQQ2tLdmJkdEFIUWhBQlMNCi1EbmJqanZiZGJLa2ZPbkRBDQotRG9Damp2YmRWdmlZV0VGSA0KLURvQ2pqdmJkR1pVdUFkWGINCi1FT2JqanZiZGhsRkRtdUN5DQotRG5jTEt2YmR5ZnlNQU1kdw0KLUVPYmpqdmJkRnlVdGFEeEMNCi1EbmJrS3ZiZGVFb1NDWERLDQotRU9jS2p2YmRiVkNHd2p0SQ0KLUVPY0xLdmJkVEFFaGdhbmQNCi1FT2JrS3ZiZFJwVUhKZWN3DQotRG5iamp2YmRac2lKWkRybg0KLURuY0xLdmJkdFNxcnh5ZUQNCi1Eb0RLanZiZEpTeGFTbVlNDQotRVBDa0t2YmRqdXZuRUNZWA0KLURvRExLdmJkck15allrZ2kNCi1EbmJrS3ZiZGpKZWdqTlhyDQotRG9ETEt2YmR1YUR4c09kaA0KLURvRExLdmJkbUljc3B0ckINCi1FT2JrS3ZiZEZrRlRESG1WDQotRG5iamp2YmRZT1JBWVZWdA0KLURuY0xLdmJkZGRvUmJXY0sNCi1FUERMS3ZiZExyV21adVF6DQotRG9ETEt2YmRsaUVUcHVSYQ0KLURvQ2pqdmJkYnJjS3NkS0INCi1Eb0NrS3ZiZEhrYXptdnBrDQotRVBDamp2YmRVYUJwc1JSeQ0KLUVPYmtLdmJkS2ZGaEJhUXUNCi1Eb0NrS3ZiZEtReWRuZk5lDQotRU9jTEt2YmREaklLVnhLQQ0KLURuY0tqdmJkcGVjZVVXQkkNCi1EbmNMS3ZiZEthTEhOQnhSDQotRVBETEt2YmRwdFRmclJrVQ0KLUVQREtqdmJkZG5kc0xUdFMNCi1FT2JqanZiZE1wWHB2T0hUDQotRG5ia0t2YmRhTWphcnVOSA0KLURvQ2tLdmJkcGVjZHRWYUkNCi1EbmNMS3ZiZFJwVGZqR0VYDQotRU9ia0t2YmRDU2FDc2V2cg0KLURvQ2tLdmJkbkhFd21OZ1oNCi1FT2JqanZiZGZIanVxbXFIDQotRG9ES2p2YmRLV1ZHRGVHaQ0KLURvRExLdmJkV0h4VnhIWXoNCi1EbmJqanZiZFhzTGFNc254DQotRVBETEt2YmREakhpdXdqQQ0KLURuYmpqdmJkYWFXRkdRUVgNCi1EbmJqanZiZHNyclRaWmRjDQotRG9Damp2YmRkbmVUS3RVUw0KLURvREtqdmJkY0pNakxGdngNCi1Eb0RLanZiZGFOS2JUVWxnDQotRG5iamp2YmRrSGZsRmZPTA0KLUVPYmpqdmJkSnB6Rk9lbWUNCi1Eb0NqanZiZHJvdW5pYnVmDQotRG9Damp2YmRIZ0haeHd4SA0KLUVPY0xLdmJkU0t4ZXVHa1QNCi1FT2NMS3ZiZHpRb05KSndBDQotRU9iamp2YmRabm5KRWR6Sw0KLURvRExLdmJkSnV1RmNkZmkNCi1EbmNLanZiZElyeUJTbVlNDQotRU9ia0t2YmR5WUpKYW96TA0KLUVPYmpqdmJkRmtFc0RIbVYNCi1EbmJrS3ZiZGZNZlhITWpMDQotRG5ia0t2YmRMR0dJQmFSVg0KLUVPY0xLdmJkUlhOZERNSGMNCi1Eb0RLanZiZGVnanZSblJIDQotRG5ia0t2YmRLZWVnYWFRdQ0KLURuYmpqdmJka01ha3pFZ1ANCi1Eb0RLanZiZGNUREt0RUtCDQotRG5jTEt2YmRoYW9ERXZxUg0KLURuY0xLdmJkbWdFd21OZnkNCi1FUERLanZiZENJamJMSWZLDQotRG5jTEt2YmRKdlVlZEVnSg0KLURvQ2pqdmJkRlZ4cFBsakYNCi1FT2NMS3ZiZEpZVUNJTVJRDQotRVBES2p2YmRkd3lzc3JGeg0KLURvREtqdmJkaU1FZE9VY1oNCi1Eb0RLanZiZFpRbGVJbGRxDQotRVBDa0t2YmRuUVp5VmtZYg0KLURvQ2pqdmJkTkdicE5QdUwNCi1Eb0NrS3ZiZE9TdFZnRlZRDQotRU9jS2p2YmRHQlBReGl6bQ0KLURuYmpqdmJkT1hvVnpjblUNCi1EbmNLanZiZHlxUE5JaXdBDQotRG9ETEt2YmRrSUdsR0dOaw0KLUVQREtqdmJkYmlOS0xGdngNCi1Eb0NrS3ZiZENUQkNzZldyDQotRG9ES2p2YmRTaHlqUkFCTQ0KLUVQQ2pqdmJkeHdoakJvekwNCi1Eb0NrS3ZiZHFVVUhTU0xVDQotRG9ES2p2YmRiQlZkZlBvdw0KLURvQ2tLdmJkcVluZ2dSRHgNCi1Eb0NrS3ZiZHRrd3dBc2FYDQotRVBETEt2YmRaTVNEc25NTg0KLUVQRExLdmJkWmpUSVFHYkcNCi1FUENqanZiZHpvUHBkYmxZDQotRVBES2p2YmRWdmlZV0VGSA0KLURuYmpqdmJkVXNsdEdMdWoNCi1Eb0NrS3ZiZFFkREFvcGNyDQotRVBES2p2YmRaeGNqTmJrcg0KLUVQQ2pqdmJkWmlzSHBHYkcNCi1FUERLanZiZEV1eHBQbUtGDQotRU9jS2p2YmRRd05jY0xnYw0KLUVQQ2pqdmJkRVlZTHN0VU0NCi1FT2JrS3ZiZFpSTkVobUVxDQotRG9ES2p2YmRhUmZESVVHTA0KLURuY0tqdmJkdWFEeHNPZUkNCi1FT2JrS3ZiZG1haXdZUE9WDQotRU9jS2p2YmRLREpicUpieA0KLURvREtqdmJkUXZuRURMZ2MNCi1EbmJrS3ZiZHRsWHZhVGFYDQotRVBES2p2YmR6UW9OSWl3QQ0KLUVPY0xLdmJkTmVEc2lJamQNCi1EbmJrS3ZiZEJkUUF2SmxmDQotRG9Da0t2YmRoelZHTVJPRw0KLUVQRExLdmJkVWFDUXNSUnkNCi1FT2NMS3ZiZFppc0hvZ0NHDQotRG9Da0t2YmRscXh0elREaQ0KLURvQ2pqdmJkUmtaR1VnS3MNCi1FT2JrS3ZiZFpubWhkZVpqDQotRU9jTEt2YmRaalRIb2dCZg0KLURuY0xLdmJkaHl0ZkxxTmYNCi1FUENrS3ZiZG5QeXh2S3hiDQotRG5jTEt2YmRqY01LcUhWSA0KLUVQQ2tLdmJkdVdOd2pSVEENCi1EbmJrS3ZiZHd5Z2ZHWGVTDQotRU9iamp2YmRUbFdPYVZvSg0KLUVQQ2pqdmJkVXROVUdMdksNCi1FT2JrS3ZiZEtrQWd2QUtaDQotRU9ia0t2YmRhTWtDVFVtSA0KLUVQREtqdmJkT0ZEc2hoamQNCi1FUERMS3ZiZGh6VWZMcG1mDQotRVBDa0t2YmRreVNyVFlnVQ0KLUVPY0xLdmJkRmZLU05oc3ENCi1EbmNLanZiZE9BSlRVS1NBDQotRVBETEt2YmRyRGVKUG12Qg0KLUVQQ2tLdmJkS1JaZG5mTmUNCi1FUENqanZiZFJEY0FvcURyDQotRU9jS2p2YmROSERRTlB0aw0KLUVPY0xLdmJkVlRtVGZNVmoNCi1FT2NLanZiZHJYUU1DaHlSDQotRG9Damp2YmRaUW1GSk5FcQ0KLUVQQ2tLdmJkV1Jtd2Fka2MNCi1FT2JrS3ZiZFNDRGVMaHlMDQotRG5jS2p2YmR5TnNIeFRKRA0KLUVQREtqdmJkdFNyVFl5ZGMNCi1Eb0RMS3ZiZGlHakN4dWl1DQotRG9Da0t2YmRyTlpqWkxnaQ0KLUVQRExLdmJkSm1BRHpHdUINCi1EbmNMS3ZiZHRjQ3VXdW5vDQotRG5iamp2YmREeFhrdFR0TQ0KLUVQQ2pqdmJkZFp5UHhaUWINCi1FUERMS3ZiZGxxeHR5c0RpDQotRG9ETEt2YmRiQXVlR1BwWA0KLUVPYmpqdmJkVnZpWHZEZGcNCi1FUERLanZiZEJkUUF2S01mDQotRG5ia0t2YmRQeG1BSFNxag0KLURvRExLdmJkVXNsdEZsV0sNCi1EbmNLanZiZFZoWVdZSFl6DQotRG9ES2p2YmRkd3pUdFNGeg0KLURuY0xLdmJkSUdmell3d2cNCi1FUENqanZiZG1KRHNxVXJCDQotRVBDa0t2YmRHUUFTd0dleQ0KLUVPY0xLdmJkVGxXT2FWb0oNCi1EbmNMS3ZiZExGZWhDQlJWDQotRG5iamp2YmRUa3ZPYVZvSg0KLUVQQ2tLdmJkd1hNQXZCV1YNCi1FT2JqanZiZHB4bmhHcUR4DQotRU9jTEt2YmRzcnFyeVplRA0KLURvRExLdmJkdVZuWGpRc0ENCi1EbmNMS3ZiZFJvdEhLRmRYDQotRU9jS2p2YmRuVXR5amlyRw0KLUVPY0tqdmJkQ0pMQ0xKRmoNCi1FT2NMS3ZiZFNDRUZMaVlrDQotRG9ETEt2YmRqY01MUWdWSA0KLURvQ2tLdmJkTEJMR2xheFINCi1FT2JrS3ZiZFpRbGRpTkZSDQotRU9jTEt2YmR1TVh3QXNhWA0KLURuY0tqdmJkeHJuSWxyQmcNCi1FT2JrS3ZiZGVoS3ZSblJIDQotRG9ETEt2YmRSb3NmaWVjdw0KLURvQ2tLdmJkRmpkcmNJTlYNCi1FUENqanZiZGtXV21kQnhYDQotRG5iamp2YmRGa0ZUREhsdQ0KLURvQ2pqdmJkVEFFaGdhb0UNCi1Eb0RLanZiZEFOSVpUV3l4DQotRU9ia0t2YmRKU3lBc05ZTQ0KLUVQRExLdmJkcVR0SFJxa1UNCi1FUERLanZiZGJCVmVGb293DQotRVBDa0t2YmRZU2thTXNvWQ0KLURuY0xLdmJkRG5ia0t3REUNCi1EbmNLanZiZE1TV2x6VXB6DQotRG5jS2p2YmRhdUNIWGpzaA0KLURvQ2pqdmJkVHZNUUtVQlINCi1Eb0RMS3ZiZHJSdUxPTEFtDQotRU9jS2p2YmRhdGJHeEt0SQ0KLURuY0xLdmJkTkdjUU1vdGsNCi1FUERLanZiZGlDT2JlV3FSDQotRG9ES2p2YmR1RERVd1Zubw0KLURuY0xLdmJkWWxSY3Nta20NCi1EbmNLanZiZGJBdWVGb293DQotRU9ia0t2YmRZVE1CTlRvWQ0KLURuY0tqdmJkdkFkWXNQRWgNCi1FT2JqanZiZEJkUUJXS01mDQotRG5ia0t2YmR1Q2J1V3Vubw0KLUVPY0xLdmJkS1dWR0VGSEoNCi1FT2JrS3ZiZGN5eVFYeHFDDQotRG5ia0t2YmRhTWphc1VtSA0KLUVQQ2tLdmJkbWdFd2xtZnkNCi1Eb0RMS3ZiZHJEZGlRT1ZhDQotRG9ES2p2YmRVeUlVWmpubg0KLURuYmtLdmJkbkJqWFlPblYNCi1FT2NLanZiZFJwVGdKZkR3DQotRG5jS2p2YmRqY0xqcUd1SA0KLURuYmtLdmJkWmpUSVFIQ0cNCi1FT2NLanZiZHVWbllLUlRBDQotRG5ia0t2YmRHY2tXSmJLSw0KLUVPYmpqdmJkWnlFSm5ETVMNCi1EbmNLanZiZE5zVVdHZHVRDQotRU9iamp2YmRLUXpFb0ZtZQ0KLUVPY0tqdmJkVlVNdEdMdksNCi1FUERLanZiZHJKQUtGTW9GDQotRG9Da0t2YmROcnN2SEZWUQ0KLURuY0xLdmJkU0t5R1VmanMNCi1Eb0NrS3ZiZFZ2aHhXRUZIDQotRG5jTEt2YmRGZWpSbklzcQ0KLUVPYmpqdmJkVlloVVprT24NCi1Eb0NqanZiZHhVbUVweGtuDQotRG9ETEt2YmRCaUxDS2hlag0KLURvREtqdmJkSWpFQUpvZmQNCi1FT2NLanZiZHd6SGZGd2RyDQotRG5jS2p2YmRGamVUREhsdQ0KLURuYmpqdmJkYmlNaktld1kNCi1EbmJqanZiZGFOTENUVWxnDQotRU9iamp2YmREd3hNVVVUbA0KLURvQ2tLdmJkbXR0eWtLU0cNCi1FUERLanZiZGlVeWVYU1ZDDQotRVBETEt2YmRXSVlWd2Z4eg0KLUVQRExLdmJkZW1GdmdNaWsNCi1Eb0NrS3ZiZFV5SHN6S29PDQotRU9ia0t2YmRUWGtNTnpqeA0KLURvREtqdmJkU1FUZ0tGZFgNCi1EbmJqanZiZExpQmtweEFTDQotRVBDa0t2YmRSb3NnS0dFWA0KLURvQ2tLdmJkbWZkd21OZ1oNCi1EbmNMS3ZiZGlISmJ5Vml1DQotRG5jTEt2YmR4cm5KTXFiSA0KLUVPY0tqdmJkaGxGRU50Y1oNCi1Eb0NqanZiZGJLa2VubkRBDQotRG5ia0t2YmRHY2tXS0JqSw0KLURuYmpqdmJkVXlJVVprT24NCi1FUERLanZiZGVFbnJDWERLDQotRU9jS2p2YmRzQmZNa2dLeQ0KLURuY0tqdmJkeHNOaU5TQmcNCi1FUERLanZiZGtOQ0x6RWdQDQotRVBES2p2YmRTS3lHVkdqcw0KLURvREtqdmJkcldvbENoeVINCi1EbmNMS3ZiZFdTTndhZUxjDQotRU9jS2p2YmRKWVRiSGtxUQ0KLURuYmpqdmJkWnNoaVpEc08NCi1Eb0RLanZiZFNLeGZVZmpzDQotRVBDa0t2YmRwdFRnUnJLdA0KLUVQQ2pqdmJkUkVEQXBRZFMNCi1EbmNMS3ZiZHR2T1hqUlRBDQotRVBES2p2YmRlbUdYR2xqTA0KLUVPYmpqdmJkQmRRQXZKbUcNCi1FUERMS3ZiZGh1WmR3UnVDDQotRG5jTEt2YmRqdlduRGF4WA0KLUVQRExLdmJkRlZ4b3BNaWUNCi1FUENrS3ZiZGFqa2VvTmNBDQotRVBDamp2YmRTUHNmaWZFWA0KLURuYmtLdmJkQnNBY1RmV3INCi1FUENqanZiZEVPY0xMV2NFDQotRG9Damp2YmRaTHJEc21sTg0KLUVQQ2tLdmJkeG5TZ3hUSWMNCi1FT2JqanZiZEdRQVRYR2V5DQotRU9ia0t2YmRic0RMVUVLQg0KLURvQ2pqdmJkclNWS21qYU4NCi1FUENrS3ZiZGRuZVRMVVVTDQotRG9Da0t2YmR4bXJnd3NKRA0KLUVQREtqdmJkR1l1VkFkWGINCi1EbmNMS3ZiZGF1QmZ4TFRoDQotRVBETEt2YmRyTXpLWkxnaQ0KLUVPYmtLdmJkVXNsdEdMdksNCi1EbmJqanZiZER4WGxUc3RNDQotRU9ia0t2YmRzQmZOTGdMWg0KLURuY0tqdmJkaWRqZ1VvQU8NCi1FUERMS3ZiZEpKZEFLUUhFDQotRU9jS2p2YmRiQldGRnBRWA0KLUVQQ2pqdmJkU1ppaFREV0ENCi1FUENrS3ZiZGhnS0N4dWl1DQotRG5jS2p2YmRkbmVUTFVUcg0KLURvREtqdmJkY3paUHhaUkMNCi1EbmJqanZiZGxZcnJUWWZ0DQotRG9ES2p2YmRXWEpYdkVFZw0KLUVQRExLdmJkYmhtSmtGdngNCi1FUENqanZiZER4WUx0VHNsDQotRVBES2p2YmRxZEZJb25WYQ0KLUVPYmpqdmJkQ0lqYkxJZWoNCi1EbmJqanZiZG1iS1hYbm11DQotRVBES2p2YmRsWlRTVFlmdA0KLUVQREtqdmJkd1hNQlZhV1YNCi1EbmJqanZiZFNQdEdqR0VYDQotRG9ES2p2YmRyTXpLWWxIaQ0KLUVQQ2tLdmJkaVZaZHdTVkMNCi1EbmJqanZiZHB0VUhTU0t0DQotRG5jTEt2YmRjU2Jqc2NqQg0KLURvREtqdmJkU1BzZmllY3cNCi1FT2NLanZiZGVna1ZxblFnDQotRU9ia0t2YmRqdXZtY2JYdw0KLURuY0tqdmJkQ0pMQ0toZksNCi1FT2JqanZiZFZxbllCZU1EDQotRG9Damp2YmRLQ2pDcUpjWQ0KLURuY0xLdmJkWlJNZGhtRXENCi1FT2NLanZiZHJSdGtPS2FODQotRG9ETEt2YmRScFRmaWVkWA0KLURvQ2pqdmJkUk13YlpPVXoNCi1Eb0NqanZiZHJYUU1ESXhxDQotRU9iamp2YmRzcnFzWlpkYw0KLURuYmpqdmJkZmpmemJmQUUNCi1Eb0NrS3ZiZEpTeUJUTXhNDQotRVBES2p2YmRuQ0p2d29OdQ0KLURvQ2pqdmJkbWJKdndvTnUNCi1EbmJrS3ZiZEZXWlFQbGpGDQotRG5jTEt2YmR4blNnd3JpRA0KLURuYmpqdmJkVnZod3VjZGcNCi1Eb0NqanZiZGpnZmtmRm5MDQotRG5jTEt2YmR6UlBNaUtYQQ0KLUVPY0xLdmJkcVpQSGdSRVkNCi1FUENrS3ZiZHJ5bFBzQWduDQotRVBDa0t2YmRWWklUeWtQTw0KLURvQ2pqdmJkaGtlRU9WRFoNCi1FT2NLanZiZFVWa3BKdEFxDQotRU9jS2p2YmRkQ1RNckFVTg0KLUVQREtqdmJkWmVYZnpnaGINCi1FUENqanZiZGlNRkRtdURaDQotRVBDamp2YmRKS0VBSnBIRQ0KLUVPY0xLdmJkYWprZW9PREENCi1EbmJqanZiZFpSTkVobUZSDQotRU9jTEt2YmROSENwTlFWTA0KLUVPYmpqdmJkbVJ4dHpTY2kNCi1Eb0NqanZiZHpSUE1oalhBDQotRG5ia0t2YmRuR2R3bU5meQ0KLUVPYmtLdmJkdkFjeHNPZUkNCi1Eb0RMS3ZiZEJzQWNUZXZyDQotRG9Da0t2YmRvem1kS3hQQQ0KLURuYmtLdmJkVGxWb0JWb0oNCi1FUENrS3ZiZHF3UUxjSXhxDQotRG5jTEt2YmRiaU1qTEdXeA0KLURvRExLdmJkZkhrV1JuUkgNCi1FT2NLanZiZGJWQ0d4S3NoDQotRG9Damp2YmRUcVJQVXRoTg0KLURvQ2tLdmJkYlFHZ0VMemQNCi1FT2NMS3ZiZFFaTkFIU3JLDQotRG9ETEt2YmRaeURqTmJrcg0KLUVQQ2pqdmJkcWlBSmRtT2UNCi1FT2JrS3ZiZEthTEhOQnhSDQotRG5jS2p2YmR5WGhqQm96TA0KLUVPYmpqdmJkRGpJS1dZS0ENCi1FT2NLanZiZExGZWdhYVF1DQotRVBES2p2YmRaalRJUGdDRw0KLUVPY0xLdmJkZkhqdXFuUWcNCi1EbmJqanZiZGxoY3NxVlJhDQotRG9Damp2YmRNdVNxa05BWA0KLURuY0xLdmJkQ0lrQmtJZWoNCi1EbmNLanZiZFVhQ1FzUXF5DQotRU9iamp2YmRSYkRka2h5TA0KLUVPY0tqdmJkcHNzZnJSa1UNCi1FT2NLanZiZExHRmhCYVF1DQotRVBDa0t2YmRxcXRqbkxCTg0KLUVPY0xLdmJkV1Jtd2JFa2MNCi1FT2JqanZiZHBlZEZUdWFJDQotRG9Da0t2YmRKSmRBSm9mZA0KLURvRExLdmJkd05XQU5FRW0NCi1FUENrS3ZiZFlnV2RBT3JpDQotRG9ETEt2YmR2QWN5VE9lSQ0KLURuYmtLdmJkYmhtSmpmV3gNCi1FT2NMS3ZiZHlwbmxpS1hBDQotRU9jS2p2YmRaeUVKbkNsUw0KLURvQ2pqdmJkWm9OaGRlWmoNCi1FUENrS3ZiZGtETGtSR3RnDQotRU9iamp2YmROc1VXR2R0cA0KLURuYmpqdmJkWlFsZGhtRlINCi1FT2NLanZiZFlwbUVobGRxDQotRVBDa0t2YmRaUW1FaU1lUg0KLURuYmpqdmJkaHl0ZkxwbkcNCi1FT2JqanZiZG10dVprSnJHDQotRU9iamp2YmRHTEVzRElOVg0KLUVQQ2pqdmJkVmhYdllIWXoNCi1Eb0RMS3ZiZEtlZklDQXFWDQotRG5jS2p2YmRVdE1zZkx2Sw0KLUVPY0xLdmJkdWFFWlRPZUkNCi1FUERLanZiZGRkb1NCd0RLDQotRG9Da0t2YmRmZkx5bWdIQQ0KLURuYmtLdmJkYkF1ZUdRUVgNCi1EbmJrS3ZiZGJyY0xUY2lhDQotRVBDamp2YmRSYkVFbEpZaw0KLURvQ2tLdmJkR0Zpck5pVHENCi1Eb0RLanZiZE5kY3RJaGtFDQotRVBETEt2YmRRY2NBb3FFUw0KLURuYmtLdmJkRmZLUm5KVVINCi1EbmJqanZiZEZmSnJOaVVSDQotRVBETEt2YmRDZmtlZ0F6Yw0KLUVQQ2pqdmJkUlhOY2NNSGMNCi1Eb0NrS3ZiZFpqU2hQZ0JmDQotRU9jS2p2YmRTTFpHVWZrVA0KLURvRExLdmJkQmNwQXVqTWYNCi1FT2NMS3ZiZHVXTndpcVRBDQotRG9ETEt2YmRweU9nZnFFWQ0KLUVPY0tqdmJkY1NjS3RFSmENCi1FT2JqanZiZG5DSndYb051DQotRG5ia0t2YmRqRkxHdG9BTw0KLURvQ2pqdmJkWHJsQk1zbngNCi1FUERLanZiZGhnSmNaV0p1DQotRG9Damp2YmRpQm9ERXZwcQ0KLUVQREtqdmJkY3pZb3hZcUMNCi1Eb0RMS3ZiZGpGTEhWUEFPDQotRG5iamp2YmRiUGdHZEx6ZA0KLURvREtqdmJkV0lZV1lHeHoNCi1EbmNLanZiZGh5dGZMcG5HDQotRU9iamp2YmRmSGp1cW5RZw0KLURuYmpqdmJkbWdFeE1tZ1oNCi1FT2NMS3ZiZGhnS0RZdWl1DQotRVBES2p2YmRtSkVVUlZSYQ0KLURvRExLdmJkSnB5ZVBHTmUNCi1Eb0RMS3ZiZGxoZFVRdVJhDQotRU9ia0t2YmRtdVV6TEtTRw0KLURuYmpqdmJkeHdoakJvekwNCi1FUERMS3ZiZFZaSVVaam5uDQotRVBETEt2YmRKcHlkbmZPRg0KLUVQQ2tLdmJkcXF0am1qYU4NCi1FUENrS3ZiZFpvT0pGRlpqDQotRG5iamp2YmRtdHR6S2pSZg0KLUVQRExLdmJkdVdPWGpRc0ENCi1FT2NMS3ZiZHd0bGVSWWtuDQotRG9Damp2YmRMWXBqU3p1Rw0KLUVPYmpqdmJkSXNZYVNtWU0NCi1EbmJqanZiZHl6ZU9SaEpJDQotRU9jTEt2YmRrV1duRUNYdw0KLUVQREtqdmJkVnZpWVZjZGcNCi1Eb0RLanZiZEJjb2FWak1mDQotRG9Da0t2YmRpTUVjbXVEWg0KLUVPYmpqdmJkTEthSHZBS1oNCi1EbmNMS3ZiZEpUWkFybHdsDQotRU9jTEt2YmRoYW9DZVdwcQ0KLURuY0xLdmJkcldwTGNKWlINCi1FT2JrS3ZiZEhrYXpuV3BrDQotRG5iamp2YmR6alZQb2NydA0KLUVPY0tqdmJkeXFQTWhpd0ENCi1Eb0NrS3ZiZHBzdEhScWtVDQotRG5ia0t2YmRSa1lmVkhLcw0KLURvRExLdmJkVmd3dllHeHoNCi1FT2NLanZiZEZmS1NOaVVSDQotRG5ia0t2YmRxcXVMT0xCTg0KLURuY0tqdmJkT0FKVFRqU0ENCi1Eb0RLanZiZGRuZVNrVVRyDQotRU9ia0t2YmRscXlVeXNFSg0KLURvREtqdmJkYmhtS0tldngNCi1FT2NMS3ZiZGlDT2Jkd1FxDQotRVBDa0t2YmRGZWpTTmlUcQ0KLUVPYmtLdmJkd3lnZkdZRXINCi1FUERMS3ZiZHNRV1BLRFZmDQotRG5jS2p2YmRqYmtqcGZ1SA0KLUVQREtqdmJkUmtaRnVHanMNCi1FUERLanZiZHd5aEZmWGRyDQotRG5jS2p2YmRjSWxpa0Z2eA0KLURvQ2tLdmJkaVV5ZHdTVkMNCi1EbmNLanZiZGlVekZYU1ZDDQotRU9jS2p2YmRqS0ZnaW1ZUw0KLUVQREtqdmJkanZYT0Rhd3cNCi1FUENrS3ZiZFJiRGRsSlpMDQotRU9ia0t2YmRyRUVocE52Qg0KLUVPYmpqdmJkcnBWb0tEV0cNCi1Eb0NqanZiZE54UFZ6Y25VDQotRVBES2p2YmRWZ3d2WUhZeg0KLURuYmpqdmJkbXVVeWppckcNCi1FT2JqanZiZHJTVkxOa0JODQotRG5jS2p2YmRVV0xvalVCUg0KLUVPY0xLdmJkd3lnZWZYZVMNCi1FT2JrS3ZiZGhhb0RFdnFSDQotRU9jTEt2YmRHR0tSbWlVUg0KLUVPY0tqdmJkZUVucWF3REsNCi1FUERMS3ZiZEdHSnFuSXRSDQotRG9ETEt2YmRkZU9yQnZiag0KLURuYmtLdmJkaVZaZVdxdUMNCi1EbmNMS3ZiZEpjSmNRakRZDQotRVBETEt2YmRrRE1MUWdVZw0KLUVPYmpqdmJkZW1GdmZsaWsNCi1FT2JrS3ZiZHd6SGVld2RyDQotRG9Damp2YmRIRGp1aWFqSw0KLURvQ2tLdmJkckVFaVBuVmENCi1FT2NMS3ZiZHlwbm1KS1hBDQotRG9ETEt2YmRtZ0ZYbU9IWg0KLUVPYmtLdmJkVXNtVUZrdWoNCi1FUERMS3ZiZGNTY0t0RGpCDQotRVBDa0t2YmRVeUlUekxPbg0KLURuY0tqdmJkWm5uSWRkeWoNCi1FUENrS3ZiZGFhVmVHUG93DQotRG9Damp2YmRTUVRmaWZEdw0KLURvREtqdmJkRG9ES2tYQ2QNCi1EbmNMS3ZiZGh0ekV3UnVDDQotRU9ia0t2YmRNcFhxVm5Hcw0KLURvREtqdmJkRG5jTExYQ2QNCi1Eb0NrS3ZiZHRjRFV3Vm9QDQotRG9ES2p2YmR0U3FyeVpkYw0KLUVQREtqdmJkYkJXRkdQcFgNCi1FUENqanZiZG1SeHR5cmRKDQotRG9ETEt2YmRHY2tWakNKag0KLUVPYmpqdmJkem9QcGVDa3gNCi1EbmJqanZiZEtXVkZjZUhKDQotRVBDamp2YmRTS3lHVkhMVA0KLURvRExLdmJkZWxldmdOS0wNCi1Eb0NqanZiZFRYamxOemtZDQotRG9ETEt2YmRwc3RIU1NMVQ0KLUVQREtqdmJkaGdLQ3h1aXUNCi1FT2JrS3ZiZFpRbGVKTWVSDQotRVBDamp2YmRLVnVHRGRmaQ0KLURuY0tqdmJkVUd6bWt2dkYNCi1EbmNLanZiZHhybkpNcWJIDQotRVBDamp2YmRLVnVHRGRnSg0KLUVPYmpqdmJkcHRUZ1JxanQNCi1FT2JqanZiZENEcEF1ak1mDQotRVBES2p2YmRjelpRWHlSQw0KLURuY0xLdmJkcVluZ2ZwZFkNCi1FT2NMS3ZiZHFCSWVBWElFDQotRVBETEt2YmRaTHJFVG1sTg0KLUVQREtqdmJkTmVFVGhoamQNCi1FT2NMS3ZiZG1iS1d4T25WDQotRG9Da0t2YmRDRG9hV0tORw0KLUVPY0xLdmJkRU9jS2tXYmQNCi1FUENrS3ZiZE5RWHB2T0dzDQotRVBETEt2YmRGeVV0YUR4Qw0KLUVQREtqdmJkYkxNR09uREENCi1Eb0RMS3ZiZEpjSmNRakRZDQotRVBETEt2YmRPVFVXSEZVcA0KLURvQ2pqdmJkbWdGWGxuR3kNCi1FT2NMS3ZiZFJEYmFRUkVTDQotRG9ETEt2YmRjeXhvd3hwYg0KLUVQRExLdmJkbGlFVVJWU0INCi1FT2NLanZiZFhuUkFYdVdVDQotRG9Da0t2YmREbmJqandERQ0KLURvQ2tLdmJkS1Z1R0VFZmkNCi1FT2JrS3ZiZHlPVEh4U2hjDQotRVBES2p2YmR5U25JbHFiSA0KLURvRExLdmJkSEVMV0piSmoNCi1EbmJqanZiZHlPVEh4U2hjDQotRG5iamp2YmRjelpRWHhwYg0KLUVQRExLdmJkWkxyRHNta20NCi1FUENqanZiZGZOR1dmbGlrDQotRVBES2p2YmRtYktXd25tdQ0KLURuY0tqdmJkckRkaVBuV0INCi1FT2JqanZiZEhEanZLQ0tLDQotRG5ia0t2YmRVVmtvalRhUg0KLUVPYmpqdmJkcHRUZnJTS3QNCi1FUERLanZiZEZ4dHRhRVhiDQotRG9Da0t2YmRqdlhOY2JZWA0KLURvQ2tLdmJkU0xZZlVnS3MNCi1FT2NLanZiZEhha3pFekFEDQotRG5jTEt2YmRpQ09iZHdRcQ0KLUVQRExLdmJkWkxxZFVObE4NCi1Eb0RMS3ZiZGhrZURuVkN5DQotRVBDa0t2YmRlbUZ2Z05LTA0KLUVPYmpqdmJkbGlEdFF1UmENCi1FT2JrS3ZiZHd1TWRweGtuDQotRU9ia0t2YmRpcnpocmtKeg0KLUVQQ2pqdmJkSllUYWhMcVENCi1EbmNMS3ZiZElIR3l4d3dnDQotRVBDamp2YmRTUVVIS0dFWA0KLURvQ2pqdmJkWnNoaVljc08NCi1FT2NMS3ZiZFB5TkFIU3JLDQotRVBDamp2YmRic0Nqc2NpYQ0KLUVPYmpqdmJkVVdMb2pVQlINCi1Eb0RMS3ZiZEtlZWhCYVF1DQotRU9iamp2YmRqdXdPRGF3dw0KLURvRExLdmJkdGt4WEFzYVgNCi1EbmNMS3ZiZGRuZVNrVHRTDQotRG5iamp2YmRadEpJeGNzTw0KLURuYmpqdmJkSlRZYVROWGwNCi1FUENqanZiZEdLZVRESGx1DQotRG9ETEt2YmRLUXlkb0dOZQ0KLURvREtqdmJkVnJPWGFlTGMNCi1FUENrS3ZiZHpIWWxBTWVYDQotRG9ETEt2YmRCdnpjaGRvdg0KLUVPYmtLdmJkYXBHZ0VMemQNCi1Eb0RLanZiZGFNa0JzVWxnDQotRG5iamp2YmRWVU5UZWxXSw0KLUVPYmpqdmJkaUhKY1pXS1YNCi1EbmNMS3ZiZFpvTmhlRXlqDQotRG5jS2p2YmRESE1GZ0F6Yw0KLURuYmtLdmJkRnBBVFhHZXkNCi1FUERLanZiZE1wWHFXT0hUDQotRVBDamp2YmRtU1pWWnJkSg0KLUVQREtqdmJkY0lsaktmWFkNCi1Eb0NrS3ZiZGpjTGtSR3VIDQotRG9ETEt2YmRHWXVWQkVYYg0KLUVPYmtLdmJkV1hJeFdEZUgNCi1EbmNLanZiZFFseENaT1V6DQotRG5iamp2YmRZTnFBWHR1dA0KLUVQRExLdmJkR2RLdkpiSmoNCi1Eb0RMS3ZiZEdMRlNiZ2x1DQotRVBDa0t2YmRSanhmVkdrVA0KLURvQ2tLdmJkdUNidVhXT28NCi1Eb0NqanZiZHVDYnR2dW5vDQotRU9ia0t2YmRqQVFHYVFHag0KLURvRExLdmJkcUJKRkFYSGQNCi1FT2NLanZiZGtDbEtwZ1ZIDQotRU9jTEt2YmRpTUZEbXRieQ0KLUVQRExLdmJkanZYTmNiWHcNCi1FUENrS3ZiZHhVbUZSWWtuDQotRG9ES2p2YmRIZ0d5eVlYZw0KLURvQ2pqdmJkUnpKaFNjV0ENCi1EbmJrS3ZiZGxaVFJzWWdVDQotRG5ia0t2YmRGVnhwUU5KZQ0KLUVQQ2tLdmJkWnlFSm1jTVMNCi1FT2JqanZiZFpRbGRobUZSDQotRU9iamp2YmRZU2xCTXRQWQ0KLURuY0xLdmJkdkJEeHNPZGgNCi1Eb0RMS3ZiZHZBZFlybmRoDQotRG9Damp2YmRaeUVKbWNMcg0KLURuYmtLdmJkS2FMR21DWHENCi1EbmJrS3ZiZFpRbUZJbUVxDQotRU9jS2p2YmRxdm9sREl4cQ0KLURuYmtLdmJkVnFuWUJka2MNCi1Eb0NrS3ZiZG5QeXh2TFpDDQotRU9jTEt2YmRtSkVVUlVxYQ0KLURvRExLdmJkZkhrVnJOcGcNCi1Eb0NqanZiZHpub3BkYmxZDQotRG9Da0t2YmRqdldtZENYdw0KLUVPY0tqdmJkdW5zenBqbnQNCi1FT2JrS3ZiZHpvUHFGRE1ZDQotRU9iamp2YmREeFhrdFR0TQ0KLUVPYmpqdmJkQmNvYVZqTWYNCi1EbmNLanZiZHRjRFZXdW5vDQotRU9iamp2YmRweU9nZ1FkWQ0KLURuYmtLdmJkd1drYVdBdXUNCi1FUENqanZiZGFqa2VvT0RBDQotRU9jS2p2YmRLTkFFWmZ0YQ0KLUVPY0tqdmJkWmlzSVFIQ0cNCi1EbmNMS3ZiZEVYd2tzc3RNDQotRG9ES2p2YmR0YmJ1WFZvUA0KLURuY0xLdmJkRHhZTVRzdE0NCi1Eb0NrS3ZiZGN5eVB3eHBiDQotRVBDa0t2YmR4bXJnd3NKRA0KLURvREtqdmJkWVNrYU5VT3gNCi1FT2NMS3ZiZHh3aGpDUHlrDQotRG5jS2p2YmRVc21UZWt1ag0KLURuYmtLdmJka1Z3T0VDWHcNCi1FT2JrS3ZiZG5CalhZT25WDQotRG5jS2p2YmRjYXNOU0FUbQ0KLUVQREtqdmJkVEFGSWhDT2QNCi1EbmJrS3ZiZGtXV25FQ1lYDQotRG5ia0t2YmRGamVTYmdtVg0KLURvQ2pqdmJkSnpvZXdkQU4NCi1EbmJrS3ZiZFplWGZ6aEliDQotRG5jS2p2YmRNSkNMcVlBUw0KLURvQ2tLdmJkR0xGVENnbHUNCi1Eb0RMS3ZiZE11U3JMTkFYDQotRU9jS2p2YmRxY2VJb212Qg0KLURvRExLdmJkZWdrVnFuUkgNCi1Eb0RLanZiZEtmR0lDQlF1DQotRU9jS2p2YmRFdllvcE5LRg0KLURuYmpqdmJkbHJaVlpzRUoNCi1Eb0RMS3ZiZHFxdGptamFODQotRG5jTEt2YmRRbVhheG10eg0KLUVQREtqdmJkQ0RvYVZqTkcNCi1FUENrS3ZiZHFxdUxOamFODQotRG5iamp2YmRLUlpkb0ZuRg0KLURvQ2tLdmJka1Z3T0VDWVgNCi1EbmNLanZiZEdRQVRYR2ZaDQotRG5jTEt2YmRDRHBBdWpNZg0KLUVPY0tqdmJkRHhYbFVVVGwNCi1FUENqanZiZFlrckVVTmxODQotRG5iamp2YmRadEpJeUVUTw0KLURvQ2pqdmJkWHNNQWx0UFkNCi1FT2NMS3ZiZHh4SWpDUHpMDQotRG9ETEt2YmRTTFpGdUhMVA0KLURuY0tqdmJkRlZ5UVFNakYNCi1Eb0NqanZiZEZhT3B5SnptDQotRVBDamp2YmRySkFKZG1QRg0KLUVPY0xLdmJkTXVTcWptQVgNCi1EbmNMS3ZiZEVKZ2l1eEtBDQotRVBES2p2YmRCZFFBdWltRw0KLURuYmpqdmJkV1hJeFZkRkgNCi1EbmJrS3ZiZEhEa1ZqQmpLDQotRVBES2p2YmRuSEV3bG1nWg0KLUVQQ2tLdmJkQmlLYktoZksNCi1FUERLanZiZGh5dUdMcG5HDQotRG9Da0t2YmRac2lKWkRzTw0KLURuYmpqdmJkZEJybHJBVU4NCi1Eb0NrS3ZiZFlxTWVJbGRxDQotRG5jTEt2YmRaTHFkVU5rbQ0KLUVPY0xLdmJkTXVTckttQVgNCi1Eb0NrS3ZiZER4WGtzc3RNDQotRU9jS2p2YmRxZEVpUG11YQ0KLURvQ2pqdmJkT0VkVUpJamQNCi1Eb0NrS3ZiZEVPYmtMV2JkDQotRU9ia0t2YmRmZWt5bkhIQQ0KLUVQQ2tLdmJkckVGSXBOdkINCi1EbmJrS3ZiZG5CalhYb09WDQotRVBDamp2YmRtZ0V3bU9HeQ0KLURuY0tqdmJkS0NqRFFqQ3gNCi1FUERLanZiZEpxWmRvR09GDQotRG5jS2p2YmRVc21UZkx1ag0KLURvRExLdmJkamNNS3BnVWcNCi1FUERMS3ZiZFNRVUdqR0R3DQotRG5iamp2YmRSYWNkbEpZaw0KLURuY0tqdmJkWWdYRUFPc0oNCi1FUENqanZiZGhmaWNaV0tWDQotRG9ES2p2YmRHQW5weGl6bQ0KLUVQQ2tLdmJkUmJEZUxoeUwNCi1Eb0RLanZiZGlCbmNFd1FxDQotRG9Da0t2YmR4WmdmRnhGUw0KLURvQ2pqdmJkcXZwTUNoeVINCi1FT2JqanZiZGJVYkd4S3RJDQotRG9Da0t2YmRFT2JrS3ZjRQ0KLURuYmpqdmJkS1F6RW5mTmUNCi1Eb0NqanZiZFJXbkRibElEDQotRG5ia0t2YmRreHJxc1lnVQ0KLURuY0xLdmJkcXdQbENpWXENCi1FUERLanZiZFNaakhzRFdBDQotRG5jTEt2YmRFUENqanZiZA0KLUVPY0xLdmJkcHlQSUdwY3gNCi1EbmNMS3ZiZGJWQ0d3a1RoDQotRG5ia0t2YmRuUHpaV0t4Yg0KLUVPYmtLdmJkR0tlVERJTXUNCi1FT2NLanZiZGlpZklLTllTDQotRG5jTEt2YmRuUVp4dkt4Yg0KLUVQRExLdmJkR0ZqU05pVVINCi1EbmJqanZiZFJOWGF4blV6DQotRVBDamp2YmRPVFR2R2R1UQ0KLUVPYmtLdmJkVXRNc2VsVmoNCi1Eb0NqanZiZG5VdVprS1NHDQotRVBES2p2YmRRbVhheG5Veg0KLUVQQ2tLdmJkTmVEdEloamQNCi1EbmNMS3ZiZE54T3V6ZE9VDQotRG5jS2p2YmRKSmRBSnBHZA0KLURvREtqdmJkd3VORXFZa24NCi1EbmNLanZiZFpNU0R0T0xtDQotRG5iamp2YmROZURzaUpMRQ0KLUVQQ2pqdmJkSnB6RW9HT0YNCi1FUENqanZiZGtETGtSR3RnDQotRG9Damp2YmRVV0xwSnRBcQ0KLUVQREtqdmJkZk1mV2ZsakwNCi1FUENrS3ZiZHJNekp5TUlKDQotRG9Damp2YmRKS0VBSm9mZA0KLURuYmpqdmJkbkJpd1hvTnUNCi1Eb0NqanZiZERpaEp2WUtBDQotRG5ia0t2YmRTWmlnc0RXQQ0KLURvQ2pqdmJkRmVqUm1oc3ENCi1EbmJrS3ZiZGFNa0NUVk5IDQotRU9ia0t2YmRjelpQeFpSQw0KLUVQREtqdmJkVlpJVVpqbm4NCi1Eb0RLanZiZGt5U3JUWkd0DQotRG9ETEt2YmRzUHZQS0RWZg0KLURvQ2tLdmJkd1dsQlZhVnUNCi1FUERLanZiZEFOSVpTdnl4DQotRVBDa0t2YmRuSEZZTk5nWg0KLURuYmtLdmJkTmRjc2lJa0UNCi1FUERMS3ZiZERvQ2tMV2JkDQotRVBES2p2YmRRY2NCUHFEcg0KLUVPYmtLdmJkU1BzZmlmRVgNCi1FT2NLanZiZGVsZlhITkprDQotRU9ia0t2YmRGZktSbWlVUg0KLUVPY0xLdmJkS0NpYnFLRFkNCi1FUERMS3ZiZFVXTHBKc2FSDQotRVBDa0t2YmRLZkZoQ0JRdQ0KLUVPY0tqdmJkbXVVekxKckcNCi1FT2NMS3ZiZEJkUUJWak1mDQotRU9jS2p2YmRmcEJ6dmN3aA0KLUVPY0tqdmJkbVJ5VXpTY2kNCi1FT2NLanZiZEZWeHBQbGllDQotRG5iamp2YmREd3dsVVVVTQ0KLURuY0tqdmJkVXlIc3lqb08NCi1Eb0NrS3ZiZFVzbHNlbFZqDQotRG5jTEt2YmRtdVV5a0pxZg0KLURuY0xLdmJkTEZmSGJBcHUNCi1EbmNMS3ZiZGh5dUZsUk9HDQotRVBES2p2YmR4blRJWVRKRA0KLUVQREtqdmJkVHVsUGpVQXENCi1Eb0NqanZiZENEb2FXSmxmDQotRG9Da0t2YmRiTE1HT25EQQ0KLUVQREtqdmJkT1N0VmZkdHANCi1FUENrS3ZiZFpSTWVJbUZSDQotRG9ETEt2YmRpVlplWFJ1Qw0KLUVQREtqdmJkUm9zZmllZFgNCi1Eb0NqanZiZG5HZVlNbkd5DQotRG9Damp2YmRpaWVoS05ZUw0KLURuY0tqdmJkYmhtS0tmWFkNCi1FT2NMS3ZiZG5CalhYb051DQotRVBES2p2YmR1THd3QXRBdw0KLUVPY0xLdmJkeWdZbEFNZVgNCi1Eb0NrS3ZiZE5zVHZIRXRwDQotRVBDamp2YmRzcnJUWXpGRA0KLUVQQ2tLdmJkQmRRQXVpbUcNCi1EbmNLanZiZG1mZVlNbkhaDQotRU9jS2p2YmR4WmhGZXhFcg0KLURuY0xLdmJkWnNoaHlFVE8NCi1FT2JrS3ZiZE9GRVVKSkxFDQotRG9ETEt2YmR1REN0dnVvUA0KLUVPY0tqdmJkR1pWVkJFWUMNCi1FT2JqanZiZFpSTWVKTkVxDQotRG5ia0t2YmRreHNSc1lmdA0KLURuYmtLdmJkc0JmTkxmankNCi1FT2NMS3ZiZE5QeFF2T0hUDQotRG5iamp2YmRwc3RIUnFrVQ0KLUVPY0xLdmJkWlFsZUpORlINCi1FUENqanZiZHhWTkVweGtuDQotRG9Da0t2YmR3dG1FcVpMbg0KLURvQ2tLdmJkR0FvUXhpem0NCi1Eb0RMS3ZiZFZxbXdhZUxjDQotRG9ES2p2YmRLZkdIYWFRdQ0KLURvQ2pqdmJkY0pOS0xHV3gNCi1FUERMS3ZiZHJ6TVBzQkhuDQotRG5jS2p2YmRmb2F6d0R4SQ0KLUVQREtqdmJkWnlFSm5DbFMNCi1EbmJqanZiZHdNdkFORGVODQotRU9iamp2YmRac2hpWkVUTw0KLUVQREtqdmJkVXNsc2VsVmoNCi1Eb0RLanZiZHd0bUVweUxuDQotRG5jTEt2YmRKVFlhVE14TQ0KLUVQREtqdmJkdkJEeHNPZUkNCi1Eb0RLanZiZHhybWhtU0NIDQotRVBETEt2YmRqSmVnak5ZUw0KLUVPY0tqdmJkSnZVZWRFZ0oNCi1EbmJrS3ZiZFZaSVR5am9PDQotRG9ES2p2YmRkZVBTQ1diag0KLURuY0tqdmJkV0lYdlhnWXoNCi1FUERLanZiZFpRbUZKTWVSDQotRG5iamp2YmRxZEVpUG5XQg0KLURvRExLdmJkVVZrb2pUYVINCi1Eb0RMS3ZiZEZWeHBQbUplDQotRVBDamp2YmR4bXNId3NJYw0KLUVQRExLdmJkaWllaEpseFMNCi1FUERMS3ZiZENUQWJzZXdTDQotRVBDamp2YmR6b1BwZGJreA0KLURuYmtLdmJkaWpHSGlseFMNCi1FUERMS3ZiZE9ZT3V6ZE50DQotRU9jTEt2YmRUcHBvVXVJTg0KLURuYmtLdmJkY1NjTFVEaWENCi1FT2NMS3ZiZGVQRlRMVVRyDQotRU9jTEt2YmRoZ0tDeHZLVg0KLUVQQ2tLdmJkckpBS0ZOT2UNCi1FT2NLanZiZFZ3Slh1Y2RnDQotRVBDa0t2YmROZGRVSkpLZA0KLURuY0xLdmJkSllVQ0hsUXANCi1FT2JqanZiZGtWdm5EYXhYDQotRVBDamp2YmROZURzaUpMRQ0KLUVQREtqdmJkeXplTnFoSkkNCi1FUENqanZiZG1JZFRxVXJCDQotRVBES2p2YmRab09KRkV5ag0KLURvREtqdmJkdWFEeHNPZUkNCi1FUENrS3ZiZEtqYUlXQUtaDQotRG5jTEt2YmRLYUxITWJZUg0KLUVPY0tqdmJkcmFmTWxIS3kNCi1FUENqanZiZGh0ekV2cXRiDQotRVBDa0t2YmRkZG9TQ1hESw0KLUVPY0tqdmJkempVcFBkVFUNCi1FUENqanZiZExaUkpyenVHDQotRU9jS2p2YmRhTWphcnVNZw0KLURvQ2tLdmJkeU9TZ3dzSkQNCi1FUENqanZiZEtES0NxSmNZDQotRU9ia0t2YmR2QWN4cm5lSQ0KLUVPYmpqdmJkd3VNZVF4a24NCi1EbmNMS3ZiZG1TWlV5c0RpDQotRG5ia0t2YmRjSWxpamZXeA0KLURvREtqdmJkZG5kcmp0VHINCi1FT2NLanZiZHd0bUVxWWxPDQotRU9jS2p2YmRZemNGcWl2Wg0KLURuYmtLdmJkQ0RwQldKbUcNCi1FT2NLanZiZGFTR0Nnc2ZMDQotRU9iamp2YmRJd3RCaExxUQ0KLURuYmtLdmJkeXpkbXJJSWgNCi1FUERMS3ZiZFdleHpVQU9zDQotRG5jTEt2YmRSWE5kQ2tnYw0KLUVPY0tqdmJka1Z3TmRCd3cNCi1EbmNMS3ZiZElHZnpZeFlIDQotRG9Da0t2YmRiQXZGR1Bvdw0KLURvQ2tLdmJkUWx4QnhuVXoNCi1EbmNLanZiZHFyVWtPS2FODQotRVBETEt2YmRaaXNJUUdhZg0KLURvREtqdmJkc1FXUEpidkcNCi1EbmNMS3ZiZGpoSE1GZk5rDQotRU9ia0t2YmR3TldBTWRGTg0KLURvQ2tLdmJkZUtLUnV0em4NCi1FT2JrS3ZiZEpweWVPZk5lDQotRU9jS2p2YmRRbVhheU50eg0KLURuY0tqdmJkbkhFeE5OZ1oNCi1FUENqanZiZFVMdW9CVm5pDQotRG9Damp2YmRxcXVMTmphTg0KLUVQREtqdmJkeXpkblNJSkkNCi1EbmJrS3ZiZFF2bkRjTGdjDQotRG9Da0t2YmR0Y0RVdnZPbw0KLURuYmpqdmJkbkdlWG1OZnkNCi1Eb0RLanZiZHhzTmhtUmJIDQotRG9ES2p2YmR0VFNTeVplRA0KLURvREtqdmJkUmFkRk1KWkwNCi1FT2NLanZiZFVhQ1FycHF5DQotRG9ETEt2YmRFSmdpdlhqQQ0KLUVPY0xLdmJkR0ZqU09JdFINCi1FUERMS3ZiZGFTR0RJVUdMDQotRG5iamp2YmRKWVRhZ2txUQ0KLUVPY0xLdmJkWkxyRHNtbE4NCi1FT2NMS3ZiZEVKZ2l1d2pBDQotRG9ES2p2YmR4VWxlUllsTw0KLURuYmpqdmJkUXdPRGNMaEQNCi1FT2JrS3ZiZE9UVVZnRXRwDQotRU9ia0t2YmRSTXdheG5Veg0KLUVPYmpqdmJkckVGSlBtdWENCi1FT2NMS3ZiZGlVekV2cXVDDQotRG9ES2p2YmRNcFlRdW1mcw0KLUVQQ2tLdmJkaGFuY0V2cVINCi1EbmNLanZiZGtOQ01aZGZvDQotRG5jTEt2YmRaSFdkQU9yaQ0KLUVPYmpqdmJkbHJZdVpyY2kNCi1FT2JqanZiZGdMR3piZkFFDQotRU9iamp2YmRjVENrVUVKYQ0KLUVQRExLdmJkVkFiUlRSUnkNCi1Eb0NqanZiZFlxTkVpTWVSDQotRG5jS2p2YmRCdnpjaGRwVw0KLURuYmtLdmJkdFNxcnlaZGMNCi1FUENqanZiZHd5Z2Vld2VTDQotRG9Da0t2YmRxbHpKeUxoSg0KLUVPY0xLdmJkdGJidHZ2T28NCi1Eb0RLanZiZHJTVktuTEFtDQotRG5ia0t2YmRmTWV2Z05LTA0KLUVPYmpqdmJkUmFjZGtoeUwNCi1FUENrS3ZiZEZwQVN2Z0daDQotRVBETEt2YmRab09KRkV5ag0KLUVQQ2pqdmJkempVcFBjcnQNCi1FT2NLanZiZGNiU2xyQVRtDQotRU9jS2p2YmRxd1BrYmh4cQ0KLURuYmpqdmJkSEVMVmliS0sNCi1FUERLanZiZFpRbGRpTWVSDQotRG5iamp2YmRwc3RHcXJLdA0KLURvREtqdmJkR0ZqUm1pVVINCi1FUENrS3ZiZHNzUnNaWmRjDQotRG5ia0t2YmRscXh1WnNEaQ0KLURuY0tqdmJkRVh3bFVUdE0NCi1EbmJqanZiZHl6ZG5SaEloDQotRVBDamp2YmRrQ2trUkd0Zw0KLUVPY0xLdmJkTHJXbHl0cHoNCi1FUENrS3ZiZENFUUF2S05HDQotRG5jTEt2YmRWd0l4V0RlSA0KLUVPYmtLdmJkdU1ZWEJUYVgNCi1Eb0NrS3ZiZFJ5aWhURFdBDQotRG5iamp2YmRrYU1vTkFMQQ0KLURuYmpqdmJkYU1qYXJ0bGcNCi1Eb0NrS3ZiZE5WVFNLbUFYDQotRG9ETEt2YmRkd3lzdFJleg0KLUVQQ2pqdmJkY0ltSmpldngNCi1Eb0NrS3ZiZGVBVVFsd2pHDQotRG9ES2p2YmRaeGNqTmJsUw0KLURuY0xLdmJka0lHbEZlbkwNCi1Eb0NqanZiZGZIanVyTnFIDQotRG9Da0t2YmRpQm9ERlhSUg0KLUVQRExLdmJkdkJEeVRQRkkNCi1EbmJrS3ZiZFV4aFVaa1BPDQotRU9iamp2YmRxWk9oSFFkWQ0KLUVPY0tqdmJkU0NEZUxpWkwNCi1EbmNLanZiZG96bWNrWVBBDQotRG5jS2p2YmRnR0x5bWdIQQ0KLURuY0tqdmJkSUxhem5XcGsNCi1FUENqanZiZHFVVGdTU0t0DQotRG9Da0t2YmRyb3ZPakN1Zg0KLUVPY0xLdmJkS2ZHSUJhUXUNCi1FUERLanZiZENJamFqaUZqDQotRVBDa0t2YmRtb3l4dWp5Qw0KLUVPYmtLdmJkeVNuSk1yQ0gNCi1FT2NMS3ZiZEhEanVqQmlqDQotRU9iamp2YmRyTXlpeU1IaQ0KLURvQ2tLdmJkaWlmSGltWHINCi1EbmJrS3ZiZGJzQ2tUY2lhDQotRG5ia0t2YmRNZmJwTlB0aw0KLUVPY0xLdmJkZG9FcmtVVHINCi1EbmNMS3ZiZHFaT2hHcUR4DQotRG5iamp2YmREbmNLa1hDZA0KLURvQ2pqdmJkU0NFRWxJeGsNCi1FUENrS3ZiZGJVYkhYanNoDQotRG5ia0t2YmRDVEFjVUdXcg0KLUVQRExLdmJkWnRJaVpFU24NCi1EbmJqanZiZHJEZUpQblZhDQotRG9Da0t2YmRaaXNJUUhDRw0KLURuY0xLdmJkZ0Zrek9ISEENCi1FUENrS3ZiZG1mZHhNbWZ5DQotRG5jTEt2YmRNSWJNUllBUw0KLUVPY0tqdmJkYW9nR2NremQNCi1FT2NMS3ZiZExBa0hNYXdxDQotRG5jTEt2YmR4d2lKYlFaaw0KLURuY0xLdmJkYXVCZ1lMVUkNCi1EbmJrS3ZiZG5RWnh2S3lDDQotRU9jS2p2YmRGa0VzQ2hOVg0KLURvRExLdmJkcHN0R3JSanQNCi1FUERMS3ZiZGxZcnJTeGdVDQotRG5iamp2YmRaUW1GSWxkcQ0KLURvQ2pqdmJkYmhtS0xGdngNCi1FT2JrS3ZiZHNCZWxsR2p5DQotRG5jTEt2YmR1Q2NVd1dPbw0KLUVPYmtLdmJkSnV1R0VFZmkNCi1Eb0NrS3ZiZEl3dENIa3FRDQotRVBDa0t2YmRhTWtCcnVNZw0KLURuY0xLdmJkRUFSaU15dncNCi1FT2JqanZiZG1nRXhOT0d5DQotRG9Damp2YmRwZkRkc3VhSQ0KLUVQRExLdmJkRXpzcGRsQ2kNCi1FUERLanZiZHFkRkpRTnVhDQotRG5ia0t2YmRuQmpXeE9uVg0KLUVQRExLdmJkWmlzSG9nQmYNCi1FUENrS3ZiZGpjTUtwZnRnDQotRG5ia0t2YmRhdUNHd2pzaA0KLURvREtqdmJkbFlyclRaSFUNCi1FT2NMS3ZiZHpqVlBwRHJ0DQotRG9Da0t2YmRRZERBcFFkUw0KLURvREtqdmJkZWhMV1JtcGcNCi1FUERMS3ZiZHVvVHpwa1BVDQotRG9Da0t2YmRsaURzcHVSYQ0KLURvREtqdmJkRVh4THNzc2wNCi1FT2JqanZiZFpzaUpZY3JuDQotRG9Da0t2YmRhYVdGR1BwWA0KLURvQ2tLdmJkcmFmTk1ITFoNCi1Eb0NqanZiZG1nRXdsbkhaDQotRVBDa0t2YmRGa0VzQ2dtVg0KLURuY0tqdmJkcW1aallsSGkNCi1Eb0NrS3ZiZGZJTFdTT1JIDQotRG9ETEt2YmRuQ0tYWU9uVg0KLURuYmtLdmJkSGdHeXlZWUgNCi1Eb0RMS3ZiZEVLSGpWeEtBDQotRVBES2p2YmRiQXVlR1Bvdw0KLURuYmtLdmJkRnlVdUJEd2INCi1FUERLanZiZHVDY1V2dk9vDQotRU9ia0t2YmRhdUJmeEtzaA0KLUVPYmpqdmJkWmpUSVBnQmYNCi1FT2JrS3ZiZE5HYm9scFZMDQotRU9jS2p2YmRlRk9xYldiag0KLURvQ2pqdmJkdndNQXZCVnUNCi1EbmJrS3ZiZHpSUE1oalhBDQotRG5jS2p2YmRGa0VyY0lNdQ0KLUVQQ2pqdmJkaGxGRU9VY1oNCi1Eb0NrS3ZiZEpiakNwaWNZDQotRVBDa0t2YmRaR3dFQU9yaQ0KLURuYmtLdmJkTlFZUXVuSFQNCi1Eb0NrS3ZiZGtJSE1GZk9MDQotRU9ia0t2YmRIRUxWakJpag0KLURvRExLdmJkWlFsZGhsZVINCi1Eb0RMS3ZiZFZUbVRlbFZqDQotRG5iamp2YmRKVFpBcmx3bA0KLURuYmtLdmJkQ0RwQXZLTWYNCi1Eb0NqanZiZER4WUx0VVRsDQotRG9ETEt2YmR3a1djZ3p5Zg0KLUVQRExLdmJkTEJLZ05DWVINCi1Eb0RMS3ZiZFpNU0VVTmttDQotRU9jTEt2YmR4VW1FcHhrbg0KLUVPY0tqdmJkR0xGVERIbHUNCi1FT2NMS3ZiZHlZSktDUHlrDQotRG9Damp2YmREbmJqanZjRQ0KLURvRExLdmJkYXRiSFhqdEkNCi1FT2JqanZiZGJpTWpMR1d4DQotRVBES2p2YmRUWUtsTnpqeA0KLUVPY0tqdmJkdUREVXZ2UFANCi1FT2JrS3ZiZGxpRVRwdVNCDQotRG5iamp2YmRyV29sREl4cQ0KLUVPYmpqdmJkcVpPZ2dRY3gNCi1FT2NMS3ZiZHlYaUtCb3lrDQotRG5iamp2YmRxbVppeU1JSg0KLUVQQ2pqdmJkVUx1b0F1b0oNCi1Eb0RMS3ZiZFl6Y0dSaXZaDQotRG5iamp2YmR0a3d3QlRhWA0KLURuYmpqdmJkSmJpY1FpY1kNCi1Eb0NrS3ZiZFR1a29qVGFSDQotRVBDa0t2YmRIYkx5ZHpBRA0KLUVPYmpqdmJkVlRsdEdMdksNCi1FUENqanZiZFVzbVVGa3VqDQotRVBETEt2YmRUcVJPdVZJTg0KLURuY0xLdmJkWWtyRVRuTG0NCi1Eb0NrS3ZiZGVGUFNCd0RLDQotRG5iamp2YmROR2NQbVB0aw0KLURuYmpqdmJkV0h3dXhIWXoNCi1Eb0RMS3ZiZE5Vc1JqbUFYDQotRU9jS2p2YmRaalRIcEhCZg0KLURuY0tqdmJkV1hJd3ZEZUgNCi1FT2NMS3ZiZHJKQUtFbG9GDQotRG9Damp2YmRGZWlyT0pVUg0KLUVPY0tqdmJkV1dod3ZFRWcNCi1EbmNLanZiZEtlZWhCYVF1DQotRG5iamp2YmRaTHJEc21sTg0KLUVPY0xLdmJkWm5uSWVGWmoNCi1Eb0NrS3ZiZGpLR0hqTXdyDQotRU9ia0t2YmRtSWN0UXRxYQ0KLURvQ2pqdmJka0NsS3BmdUgNCi1EbmJqanZiZGNUREtzY2lhDQotRG5iamp2YmRBRFNZS1ppUQ0KLUVPYmtLdmJkeWdaTUFORlgNCi1FUENqanZiZGFNa0NUVWxnDQotRG9ES2p2YmR6alZQb2RUVQ0KLUVQQ2tLdmJkSXhUYWdrcHANCi1FUENqanZiZFpqU2dwSEJmDQotRU9jTEt2YmRpQ09jRXZwcQ0KLUVPY0xLdmJkc1FXT2lidkcNCi1Eb0RLanZiZEV1eG9vbUplDQotRG9ES2p2YmRtdVZaa0tTRw0KLURvQ2pqdmJkU1pqSVREV0ENCi1Eb0NrS3ZiZENKTEJrSkdLDQotRVBDa0t2YmRsaURzcVZTQg0KLURvQ2pqdmJkdWFEeHJuZUkNCi1FT2NMS3ZiZHR2TnhKcHNBDQotRU9jS2p2YmRFdXlQb2xqRg0KLURuYmpqdmJkd1dsQXVhV1YNCi1EbmNMS3ZiZHVNWHZhVGFYDQotRU9iamp2YmRkeFpzdFNGeg0KLUVQRExLdmJkbXR0eWtLU0cNCi1FUENqanZiZGZJS3ZSblJIDQotRG9ETEt2YmRqZ2ZrZWVtaw0KLURvQ2tLdmJkSEVMVmpCaksNCi1FT2JqanZiZGFSZWNJVUdMDQotRG5ia0t2YmRtU1l1WnJjaQ0KLURvRExLdmJkS2ZHSGFhUXUNCi1FT2NMS3ZiZEl3c2FoTHBwDQotRU9jTEt2YmRFdXlQb21LRg0KLURvQ2tLdmJkc1FXUEpjVmYNCi1EbmJqanZiZGJQZ0hEa3pkDQotRG9ES2p2YmRaTVNFVG5NTg0KLURvREtqdmJkSlN5QlRNd2wNCi1FUENrS3ZiZFNDRGVNSXhrDQotRG9ETEt2YmR0a3d3QlRhWA0KLURvQ2pqdmJkdGJjVld1b1ANCi1FUENqanZiZG96bWRLeFBBDQotRG9Damp2YmR0a3d3QlVCWA0KLURvRExLdmJkUWREQlBwY3INCi1Eb0NqanZiZEpiakNwakRZDQotRVBDamp2YmRDVEJEVGZXcg0KLUVQREtqdmJkWU5xQVlVdXQNCi1Eb0RLanZiZFVSUlBWVWdtDQotRU9jTEt2YmROUHdxVm1mcw0KLURvREtqdmJkc0NHTWtnTFoNCi1Eb0RMS3ZiZFp0SWlZY3NPDQotRU9iamp2YmRoZmljWldKdQ0KLUVQQ2pqdmJkVHFSUFV1SU4NCi1FUENqanZiZHlPU2hYc0ljDQotRU9jTEt2YmRsaUVUcVZSYQ0KLURuY0tqdmJkWXFNZGhtRXENCi1Eb0NrS3ZiZEtmR0hiQlF1DQotRG5ia0t2YmRxQkllQVhJRQ0KLUVQRExLdmJkUVpOQUhUUmoNCi1FT2JrS3ZiZFJvc2dKZWN3DQotRVBDamp2YmRLUXpFbmZPRg0KLURvREtqdmJkelJQTWlLWEENCi1EbmJrS3ZiZEdjanZKYkpqDQotRG9Damp2YmRiQXZFZW9vdw0KLURuY0tqdmJkRlZ5UVBtS0YNCi1FUERMS3ZiZFJ6S0lTY1dBDQotRVBDa0t2YmRLa0FoV0FKeQ0KLUVQQ2tLdmJkSnFaZG5lbkYNCi1Eb0NrS3ZiZFZVTXRHTVdLDQotRG5jS2p2YmRCaUxCamlHSw0KLURuYmtLdmJkanZXbkRiWVgNCi1EbmJrS3ZiZHd1TkVxWWtuDQotRG9ES2p2YmRlZ2p1ck9SSA0KLUVPYmpqdmJkcGVjZVR2QWgNCi1Eb0NrS3ZiZEFNZ3lTd1p4DQotRVBDa0t2YmRsWlNxc1pHdA0KLUVQRExLdmJkYnJia1RkS0INCi1FUERLanZiZGh6VWVrcG5HDQotRG5jTEt2YmRkZU9xYldiag0KLUVQQ2pqdmJkc1B1bmlidkcNCi1FT2NMS3ZiZFZ3SXhWZEVnDQotRG9Damp2YmRrSUhMZWZOaw0KLURuYmtLdmJkeG1yaFhyaGMNCi1FUENrS3ZiZHppdVBvY3J0DQotRU9jTEt2YmROVXNTTE5BWA0KLURuY0tqdmJkaGtkZE50Y1oNCi1Eb0NqanZiZE1wWVJXTmdUDQotRU9iamp2YmRkWnhveFlxQw0KLUVPY0xLdmJkTlZUUmptQVgNCi1FUERLanZiZFpqVElRSENHDQotRG5ia0t2YmRIRUt2SmJLSw0KLUVPY0tqdmJkaUdpYnh2SnUNCi1EbmJqanZiZHNDR05NR2p5DQotRG9Damp2YmRCaGtCamhmSw0KLUVQQ2tLdmJkU0NEZGtoeUwNCi1EbmJqanZiZE5Qd3B2TmZzDQotRU9jTEt2YmRKVFpCVE5ZTQ0KLURuY0tqdmJkcUdFRlR2QkkNCi1FT2JrS3ZiZGRuZVNqdFRyDQotRG5jTEt2YmRxZEZKUG11YQ0KLUVQREtqdmJkcmJGbU1Ha1oNCi1Eb0NqanZiZGhYWkF6ekFKDQotRU9jS2p2YmRreHNTU3hnVQ0KLUVQREtqdmJkckVFaG9uVmENCi1EbmJrS3ZiZFl6Y0dTS1Z5DQotRG9Damp2YmR6Uk9tSkp3QQ0KLUVQRExLdmJkT0VkVUpKS2QNCi1FUENqanZiZHFxdUtta0FtDQotRU9jTEt2YmRaeUVLT0RMcg0KLURuYmtLdmJkSXNaQXNNeE0NCi1EbmJqanZiZFpqVEhvZmFmDQotRG9Damp2YmRyU1VrT0xBbQ0KLUVQQ2pqdmJkQnNBYnNld1MNCi1FT2JrS3ZiZFVzbHRHTHVqDQotRVBDa0t2YmRBTkh5VFd5eA0KLUVPYmtLdmJkc0JlbU1HankNCi1FT2JqanZiZE1veFJWbWZzDQotRVBDa0t2YmROR2JvbG91TA0KLUVQRExLdmJkaktHSGltWHINCi1EbmNLanZiZFVNV1BBdW5pDQotRU9jTEt2YmRPRWRVSWhrRQ0KLUVQQ2tLdmJkaktHSGltWHINCi1FUENrS3ZiZGh1WmR3U1ZDDQotRG9Damp2YmRDSWtCamlGag0KLUVQQ2tLdmJkeFpoR0Z4RlMNCi1FT2JqanZiZE9GRHRKSktkDQotRG9Da0t2YmRmTkdXZ05LTA0KLUVQRExLdmJkY2FybVNBVG0NCi1Eb0RLanZiZGtOQ01aZUhQDQotRG9ETEt2YmRrTWFreWVHbw0KLURuYmpqdmJkaUhKY1l2S1YNCi1EbmJqanZiZFdXaHhWY2RnDQotRVBES2p2YmRWVU5UZWxWag0KLURvREtqdmJkWkd2ZEFQVEoNCi1Eb0NqanZiZERuY0xMWENkDQotRVBES2p2YmR1REN1V3Vubw0KLURvQ2tLdmJkUHlOQUhUU0sNCi1EbmNLanZiZHF3UGxESXlSDQotRU9jS2p2YmRZemJmU0p2Wg0KLURuYmtLdmJkUm90R2lmRHcNCi1Eb0RMS3ZiZFJEY0JRUkRyDQotRG9ES2p2YmRFQVJpTlp2dw0KLURuY0tqdmJkSlN4YVROWU0NCi1FUERLanZiZFZ3Slh2RGVIDQotRU9jS2p2YmRRd09FQ2toRA0KLURvQ2pqdmJkRVBDa0xXYmQNCi1FUERLanZiZFZCQnBzUlNaDQotRU9jS2p2YmRkZG9TQndDag0KLUVPY0tqdmJkRmtGU2NJTlYNCi1FT2JqanZiZHBzdEdyU0xVDQotRVBETEt2YmRoYW9ERlhSUg0KLUVQREtqdmJkS2ZHSUNBcHUNCi1FT2JrS3ZiZEJzQWNUZXZyDQotRU9ia0t2YmRoa2VEbXRieQ0KLURvQ2tLdmJkcVluZ2ZwZFkNCi1FT2NLanZiZHNQdlBLQ3ZHDQotRG9ETEt2YmR1Vm13aXFUQQ0KLUVPY0tqdmJkaWRrR3RvQU8NCi1FUENrS3ZiZHl6ZU9SZ2lJDQotRG9Da0t2YmRtSkRzcVVxYQ0KLURuY0xLdmJkaUdpYnlWalYNCi1EbmNLanZiZGh0ekV3U1ZDDQotRU9jTEt2YmRaUk1kaU5GUg0KLUVPY0tqdmJkcmFmTWtnS3kNCi1Eb0RLanZiZFpHd0VBT3NKDQotRU9jTEt2YmRqbUNNWmVIUA0KLURuY0xLdmJkaktGZ2ltWVMNCi1FUENqanZiZGRaeHBZWlJDDQotRG5jS2p2YmRqbUJrekVnUA0KLUVPYmtLdmJka0lITGVlbWsNCi1FUERLanZiZGpBUUdhUUdqDQotRG5jTEt2YmRTUHRISmZEdw0KLURvQ2tLdmJkR0tkc0NoTlYNCi1FUENqanZiZHJvdW9KYnVmDQotRVBES2p2YmRsaGNzcVVxYQ0KLURvQ2pqdmJkd1hNQldBdlYNCi1EbmJrS3ZiZGhrZGNtdGJ5DQotRU9jTEt2YmRGa0VzREhtVg0KLUVPY0xLdmJkQ0lrQmpoZWoNCi1Eb0NrS3ZiZGlMZURuVkRaDQotRG9ETEt2YmREeFhsVHNzbA0KLURuYmpqdmJkTnJ0VmZkdVENCi1FUENrS3ZiZEhEa1dKYWpLDQotRVBDamp2YmRUdWxRS1VCUg0KLURvREtqdmJkSllVQmhMcHANCi1EbmNLanZiZGlDT2NGWFJSDQotRG9Da0t2YmR4c05pTXJCZw0KLUVPYmtLdmJkUWx4QnlOdHoNCi1FUENqanZiZEJoa0JqaUZqDQotRVBDamp2YmROZURzaUlqZA0KLURuY0xLdmJkQnNBY1RmWFMNCi1EbmNMS3ZiZER3d2xVVHNsDQotRU9jS2p2YmRVUXFQVlVnbQ0KLURuY0tqdmJkbXR0ektpckcNCi1FUENqanZiZEtXVWZFRkhKDQotRVBDamp2YmRHS2RyY0lOVg0KLUVQRExLdmJka3hyclRZZ1UNCi1Eb0NrS3ZiZFFkQ2FRUWNyDQotRG5ia0t2YmR2QWRZcm9GSQ0KLUVPYmtLdmJkRnh0dGFEd2INCi1EbmJrS3ZiZFFkREJQcUVTDQotRG5jS2p2YmRrVndPRGJYdw0KLURvQ2tLdmJkcm91bmljVmYNCi1FUENqanZiZEJjb2FWak1mDQotRG5jS2p2YmRjSW1LS2V2eA0KLURvQ2pqdmJkeExXZEh6eWYNCi1FT2NMS3ZiZGNiVE5TQVRtDQotRVBES2p2YmRSYWNkbEpaTA0KLUVQRExLdmJkWlFsZUlsZVINCi1FUENrS3ZiZFRmem5Md1dGDQotRU9ia0t2YmRzQ0ZtTGdLeQ0KLURvREtqdmJkeXFPbGhpd0ENCi1FT2NLanZiZHRjQ3R3Vm9QDQotRG5iamp2YmRSV21kQ2tnYw0KLUVPY0tqdmJkcVVUZnFyS3QNCi1EbmJrS3ZiZFJ5akhzRFdBDQotRG9ETEt2YmRZcU1kaU5FcQ0KLUVPY0tqdmJkaGJQQ2VYUlINCi1FT2NLanZiZFZyTndiRkxjDQotRU9ia0t2YmRaTHFjc21rbQ0KLURvREtqdmJkUldtZERNSUQNCi1FUENqanZiZGtXWE5jYllYDQotRG5jTEt2YmRaeURpbkNsUw0KLUVPY0xLdmJkcVVUZnFxanQNCi1EbmNMS3ZiZFV0TlRlbFdLDQotRVBES2p2YmRrV1dtZENYdw0KLURvREtqdmJkZXp1eGRodFgNCi1Eb0NrS3ZiZGFTR0NndEdMDQotRVBES2p2YmRWd0pZV0RkZw0KLURvRExLdmJkV1NPWUNGTUQNCi1FT2JrS3ZiZHh3aUphb3pMDQotRG9Damp2YmRUcHFPdVZJTg0KLURvQ2tLdmJkcnpMcFNhSG4NCi1EbmJrS3ZiZEp1dGVjZGZpDQotRG5ia0t2YmRoZ0tEWlZqVg0KLURuY0tqdmJkQ0pLYWppR0sNCi1FUENrS3ZiZGJyY0xUY2lhDQotRG5jS2p2YmR4eElpYlB6TA0KLURvRExLdmJkTlVzUmtOQVgNCi1Eb0NrS3ZiZFpSTWVKTWRxDQotRG5iamp2YmR4c09KTXFiSA0KLURuY0tqdmJkcUFoZUFXaEUNCi1Eb0NrS3ZiZFpubklkZHlqDQotRG9Damp2YmRycFdPaWJ1Zg0KLURvQ2pqdmJkRHhYbFVVVGwNCi1FUERLanZiZFppcmdvZmJHDQotRG5iamp2YmREbmJrS3ZiZA0KLUVPY0xLdmJkb3puRGtYb0ENCi1EbmJqanZiZG96bWRLeFBBDQotRG5ia0t2YmRmSGtWcW1xSA0KLURvRExLdmJka0RNTFJHdGcNCi1FUERLanZiZER4WGxVVHRNDQotRG9ETEt2YmRaTHJFVG1rbQ0KLURvQ2pqdmJkTEFrR2xiWVINCi1EbmNMS3ZiZGRuZHNMVVVTDQotRG9Damp2YmRhUmZESVVGaw0KLURuYmpqdmJkakpmSGpOWHINCi1EbmNMS3ZiZGVGUFJiWERLDQotRG9Da0t2YmRKWVRiSU1SUQ0KLURuYmtLdmJkcHRVR3JSanQNCi1FT2NLanZiZGtNYkx6RWZvDQotRG9Damp2YmRlenV4ZUpVWA0KLURvQ2pqdmJkWk1SY3RPTG0NCi1Eb0RMS3ZiZFdXaVh1ZEVnDQotRG5ia0t2YmRpaWVoS05Ycg0KLURvQ2tLdmJkWHJrYU5VT3gNCi1FUERMS3ZiZFpqVElRR2JHDQotRU9iamp2YmRlT2VUTFR0Uw0KLUVQREtqdmJkQnJhQ3Nld1MNCi1FUERMS3ZiZExCS2ZsYXhSDQotRG5jS2p2YmRSekpoU2NXQQ0KLUVQRExLdmJkR0tkcmJoTXUNCi1Eb0RLanZiZEZlaXFtaVVSDQotRG5iamp2YmRGV1lvb2xqRg0KLURuYmtLdmJkVVdMb2lzYVINCi1FUERLanZiZGZSYVd6a2JvDQotRVBETEt2YmRLUXpFbmZOZQ0KLURvRExLdmJkblV0eWppcWYNCi1EbmJqanZiZHlOcmd4U2lEDQotRU9jS2p2YmRqbGFrekZIUA0KLURvQ2tLdmJkanZYT0RheFgNCi1EbmJrS3ZiZExGZkhhYVJWDQotRVBDa0t2YmR3dU1lUllsTw0KLUVQRExLdmJkdFNxcnh6RWMNCi1EbmNLanZiZGR3eXRUcWV6DQotRU9jS2p2YmRaTHFjc25NTg0KLURvQ2pqdmJka3hzU1RaSFUNCi1FUERLanZiZGladGVrcU5mDQotRU9ia0t2YmRuQ0tXd25tdQ0KLUVPYmpqdmJkYXVCZ1lLc2gNCi1FUERLanZiZHJTVktta0JODQotRU9ia0t2YmR4cm5JbVNCZw0KLURuY0tqdmJkWm5uSkVlWmoNCi1Eb0RLanZiZFpqVElRSEJmDQotRG5jTEt2YmRtSWN0UlZSYQ0KLURvQ2pqdmJkeml1UVFEc1UNCi1FUERLanZiZFpSTkZKTkVxDQotRU9jS2p2YmRUcVJQVXRoTg0KLUVQQ2tLdmJkZVBGU2pzc3INCi1FUERMS3ZiZGZJS3VxbXFIDQotRG9ES2p2YmRkWnlRWVlwYg0KLURvRExLdmJkV1Jtd2FlTUQNCi1Eb0RMS3ZiZE9ZT3V6Y210DQotRG9ETEt2YmR4c05pTlJiSA0KLUVQQ2tLdmJkTmVFVGhpTEUNCi1FUENrS3ZiZE5QeFF1bkhUDQotRVBDamp2YmR1Q2J0dnVvUA0KLUVPY0xLdmJkamdma2VlbWsNCi1FT2JqanZiZGpsYkx5ZGZvDQotRG9ETEt2YmR4bXNJWHJoYw0KLURvQ2tLdmJkbHJaVlpzRGkNCi1Eb0RLanZiZEV6dFJFbENpDQotRU9iamp2YmRCc0Fic2ZXcg0KLURvRExLdmJkWkhXZEFPc0oNCi1EbmJqanZiZFNDRGRraHhrDQotRU9iamp2YmRlRk9xYldjSw0KLUVQRExLdmJkWnRKSlpFU24NCi1FUENrS3ZiZEtmRmhCYVF1DQotRG9Da0t2YmRNcFlRdk5mcw0KLUVPYmpqdmJkcnBXT2pDdkcNCi1FUERMS3ZiZEpTeGFUTXhNDQotRVBDamp2YmRPU3N2R2R1UQ0KLURvRExLdmJkdHVteEtSVEENCi1FUERLanZiZEJjcEJXS01mDQotRG5ia0t2YmR0YmJ1V3ZQUA0KLURvRExLdmJkS1dVZkRkZmkNCi1FUERLanZiZE9TdFZnRlZRDQotRU9ia0t2YmRabm1oZUZaag0KLURvRExLdmJkUXdPRGNNSUQNCi1Eb0RLanZiZFZyTnhCZU1EDQotRG9Da0t2YmRhU0ZiZ3Nlaw0KLURvQ2pqdmJkVHZNUUtUYVINCi1Eb0NrS3ZiZFpzaUl4ZFNuDQotRU9ia0t2YmRha01Gbm5EQQ0KLURvRExLdmJkSnV0ZWRGSEoNCi1FT2NMS3ZiZGh6VkZsUW5HDQotRU9iamp2YmR6alVwUURzVQ0KLUVQQ2tLdmJkem9RUWVDa3gNCi1EbmNLanZiZFpqU2hQZ0NHDQotRG5iamp2YmRNZ0NwTXBWTA0KLURuYmtLdmJkTkdicE5QdUwNCi1FT2JrS3ZiZEtmRmhCYVJWDQotRG5iamp2YmRLUXpGUEZuRg0KLUVQREtqdmJkQ0lrQmtKR0sNCi1FT2JrS3ZiZG1halhYbm5WDQotRG9Da0t2YmROd251emNuVQ0KLUVPYmpqdmJkYXVDR3drVGgNCi1EbmJrS3ZiZGJpTktLZlhZDQotRG5iamp2YmRRbVlDWW5Veg0KLURvREtqdmJkaUxkZE50Y1oNCi1FT2NLanZiZGVFb1NCd0RLDQotRG9ES2p2YmRjVENrVURpYQ0KLURuYmtLdmJkWlJORWhtRXENCi1FUENrS3ZiZEhmZ1p4eFhnDQotRU9iamp2YmRic0RMVURqQg0KLUVQREtqdmJkaGJQREZXcVINCi1EbmNMS3ZiZEtOQUR5ZnVCDQotRU9ia0t2YmRFenRSRWtjSg0KLURuY0xLdmJkYkxNRm5uREENCi1FT2JrS3ZiZFpqU2hQZ0JmDQotRG5jTEt2YmRiVkNIWGtUaA0KLURuYmtLdmJkcVR0SFNSa1UNCi1FT2JrS3ZiZGZTQld6bERQDQotRG5ia0t2YmRHS2VURElNdQ0KLUVPY0xLdmJkR2NqdkpiSmoNCi1FUENrS3ZiZE1vd3FXT0hUDQotRG5jS2p2YmRZcG1GSWxlUg0KLUVQREtqdmJkWnhjak5ibFMNCi1EbmNMS3ZiZE5ydFZnRXVRDQotRU9jS2p2YmRxclZLbkxCTg0KLURuYmtLdmJkYXRiSFhrVUkNCi1Eb0NrS3ZiZEVQREtrV2JkDQotRVBETEt2YmRtSWRVUlZSYQ0KLURvQ2tLdmJkTW94UldOZ1QNCi1FT2JqanZiZExCS2ZsYlhxDQotRG9Da0t2YmRTd2prbXprWQ0KLURvREtqdmJkSmJpY1FpY1kNCi1FT2JrS3ZiZE5RWVF1bWdUDQotRG9ES2p2YmR4eEpLQ1B6TA0KLURuY0xLdmJkbkdkeE5OZ1oNCi1Eb0NrS3ZiZGRpalNWdHpuDQotRVBES2p2YmRySkFKZG1PZQ0KLURuYmpqdmJkem9RUWVETHgNCi1Eb0NqanZiZFpSTWVJbGRxDQotRG5iamp2YmRrSGdNR0dPTA0KLURvQ2pqdmJkYVNHQ2hUZkwNCi1FT2NMS3ZiZENKTENLaUZqDQotRG9Da0t2YmRWaFh2WUhZeg0KLUVQQ2pqdmJkY1NianNjaWENCi1FT2NLanZiZHhaZ2Vld2RyDQotRVBETEt2YmRZa3FkVU5sTg0KLURuYmtLdmJkUkVEQXBRZFMNCi1EbmJqanZiZG1velpWa1liDQotRVBES2p2YmRhUmVjSVRmTA0KLURuY0xLdmJkWnlFSm1ia3INCi1FT2NLanZiZFpubklkZVpqDQotRG5jTEt2YmRlWHpUc3JGeg0KLURvQ2pqdmJkWlJNZGhtRXENCi1FT2NMS3ZiZEdHSnFtaHRSDQotRVBES2p2YmRJaWRBSnBIRQ0KLURuY0tqdmJkTVJ3Tlp0cHoNCi1EbmNMS3ZiZG5CaXdYb09WDQotRG9ETEt2YmRxWW5oR3FFWQ0KLUVPY0tqdmJkV2V4eXRBT3MNCi1FT2NLanZiZGladUZsUW5HDQotRU9ia0t2YmRWQWFxVFJSeQ0KLUVQQ2tLdmJkVEFFaGdhb0UNCi1Eb0RLanZiZE1veFF2TmZzDQotRVBES2p2YmRkakpxdlV6bg0KLUVPYmtLdmJkQmlLYWpoZksNCi1FUERMS3ZiZFpMcWNzbWxODQotRG9Damp2YmRnUGF6d0R3aA0KLUVQQ2tLdmJkd2tXY2d6ekcNCi1FUERLanZiZGxZc1NTeUd0DQotRU9iamp2YmRaTHJEc21rbQ0KLURuY0xLdmJkYnNDa1VEaWENCi1FT2JrS3ZiZGt4cnJTeUd0DQotRG5ia0t2YmRuQml2eE9uVg0KLURvRExLdmJkWmlyaFBnQ0cNCi1FT2JqanZiZGZNZXZmbUtMDQotRVBES2p2YmRTUVRnSmVjdw0KLURvRExLdmJkVVdNUGl0QXENCi1Eb0RLanZiZHd0bGVSWk1PDQotRU9iamp2YmRLUlpkb0dOZQ0KLURvQ2pqdmJkYXVCZ1lLc2gNCi1Eb0RLanZiZFhybEFsc254DQotRG5jS2p2YmRVTVZuYVZuaQ0KLURuY0tqdmJkaUhLRFl2S1YNCi1EbmJrS3ZiZHlTbkpOU0NIDQotRVBDamp2YmRmTkdXZ05LTA0KLUVPY0xLdmJkblFaeHVqeGINCi1FT2JqanZiZFZnd3ZYZ1l6DQotRU9jTEt2YmRqS0dIaW1ZUw0KLURuYmtLdmJkaGFuYmVYUXENCi1EbmNMS3ZiZGh6VWZMcG1mDQotRG9ETEt2YmRjelpQeFpSQw0KLUVQREtqdmJkUk5ZQnhuVXoNCi1FT2NMS3ZiZGxyWlZacmRKDQotRG5jS2p2YmR0Y0RVd1dPbw0KLUVQQ2tLdmJkUXZtZERMaEQNCi1FUENqanZiZGZNZldmbGpMDQotRG9Damp2YmRaeUVLTmJrcg0KLUVPY0tqdmJkZ1BhenZjeEkNCi1EbmNLanZiZGZOR1hITWpMDQotRG5jTEt2YmRFS0hqV1hqQQ0KLUVPYmtLdmJkWmpTZ29nQ0cNCi1FUENqanZiZHhuU2d4U2hjDQotRVBDamp2YmRxclZLbWtCTg0KLUVQQ2pqdmJkYkJWZGVwUVgNCi1Eb0NrS3ZiZHJYUUxiaHhxDQotRG9Damp2YmRiVkJmeExUaA0KLUVQQ2tLdmJkSGxCem5XcUwNCi1FUERLanZiZFRBRWhnYW9FDQotRG5iamp2YmRDZmtmSEF6Yw0KLURuYmtLdmJkcHRUZnFxanQNCi1FUERMS3ZiZFdJWHV3Z1l6DQotRU9iamp2YmRySkFKZU5QRg0KLURuY0xLdmJkS0RLRFJKY1kNCi1EbmJrS3ZiZHJEZUlwTnZCDQotRG5jTEt2YmRWd0l3dWRGSA0KLURuY0tqdmJkSUNNWmR6QUQNCi1FUENrS3ZiZHNRVm5qRFZmDQotRVBES2p2YmRpWnVHTVJOZg0KLURvRExLdmJkSUdmeXlYd2cNCi1FUERMS3ZiZFlPUkFYdHV0DQotRG9Damp2YmRoelZHTVFuRw0KLUVQRExLdmJkUXdOY2JrZ2MNCi1FT2JqanZiZHNCZW1MZ0xaDQotRG9ETEt2YmRadElpWWRTbg0KLURvQ2pqdmJkZWxldmZsakwNCi1Eb0NrS3ZiZGN5eG93eHFDDQotRVBETEt2YmRaTVJkVU5sTg0KLUVPY0xLdmJkZFp5UHd5UkMNCi1FUENqanZiZFpMckRzbkxtDQotRVBDa0t2YmRnUGF6d0VZSQ0KLURvREtqdmJkcUZkRXN2QkkNCi1FT2NLanZiZFZ2aVh2RGRnDQotRVBDamp2YmRDV3pkSWRvdg0KLURuY0tqdmJkclNWS25MQk4NCi1FT2JrS3ZiZGlMZGROdGNaDQotRVBETEt2YmRyRGRpUG12Qg0KLUVQREtqdmJkS0RLRFJLQ3gNCi1Eb0RLanZiZHRTcXNaWmVEDQotRG9ETEt2YmR3dU5GUllsTw0KLURvQ2pqdmJkdUx3dmFUYVgNCi1FT2JqanZiZHRreFhCVUJYDQotRU9jTEt2YmRTUVRnSmZFWA0KLUVPYmpqdmJkZG5lVEt0VVMNCi1Eb0RMS3ZiZEFNaFlzWFp4DQotRU9jTEt2YmRjelpQd3hxQw0KLUVQRExLdmJkamJranFHdGcNCi1FT2NMS3ZiZEZrRXNDaE11DQotRU9iamp2YmRic0NrVURpYQ0KLUVPYmtLdmJkRXpzcUVsREoNCi1FUERMS3ZiZEdaVXVCRVlDDQotRG9Da0t2YmR6Uk9tSkp3QQ0KLUVQREtqdmJkdU1Yd0FzYVgNCi1FUENqanZiZHF3UU1ESlpSDQotRG9ES2p2YmRxVVVIU1JrVQ0KLURvQ2tLdmJkd3RsZVF4a24NCi1EbmJrS3ZiZFF2bkVDbEhjDQotRVBES2p2YmRqdlhOY2F3dw0KLURvQ2pqdmJkamdnTUZlbkwNCi1FUERMS3ZiZEpZVUJoTHBwDQotRG5ia0t2YmRrTkNMeWVHbw0KLURvQ2pqdmJkRG9Da0xXY0UNCi1FT2NLanZiZFlxTWVKTkZSDQotRVBDamp2YmRSRGNBcFFkUw0KLUVPYmpqdmJkamJsS3BnVkgNCi1FUERLanZiZHFxdGpuS2FODQotRG9ETEt2YmR3dG1GUllsTw0KLURvQ2pqdmJkbkhFd21OZ1oNCi1EbmNMS3ZiZGFNamFzVk5IDQotRG5jS2p2YmRuVXR6TEtTRw0KLURvRExLdmJka3lTclN5R3QNCi1FUENqanZiZHlOc0lYcmlEDQotRG9Da0t2YmRSYWRGTUl5TA0KLUVPY0tqdmJkcXZva2JoeHENCi1FUENqanZiZFlrckVVT0xtDQotRVBES2p2YmRycFdQS0N2Rw0KLURuY0tqdmJkeFVsZHB5TG4NCi1FT2JqanZiZHJiRm1NSEt5DQotRG9Damp2YmRaSFdkQVBUSg0KLURuY0tqdmJkRVBETEt3REUNCi1EbmJqanZiZFpIV2RBUFRKDQotRG9ETEt2YmROcnN2SEZVcA0KLURuY0xLdmJkQ1RCRFVGdnINCi1FUERMS3ZiZHVERFV2dW5vDQotRG9ETEt2YmRkd3lzdFNGeg0KLURuYmtLdmJkbWJKdndvTnUNCi1FUENqanZiZGNiVE5TQVVODQotRG5iamp2YmRuVlV6S2pSZg0KLUVPY0xLdmJkWWxSZFVPTU4NCi1Eb0NqanZiZFRBRklnYW5kDQotRG5ia0t2YmRwZWNlVVZhSQ0KLURvRExLdmJkbFpTclRZZnQNCi1FUENqanZiZGRlUFJiWERLDQotRU9jTEt2YmRKcVpkbmZOZQ0KLUVQQ2tLdmJkUmFjZUxoeUwNCi1FUERLanZiZExBa0dsYXhSDQotRVBDamp2YmRxR0Rkc3ZBaA0KLURuYmpqdmJkeFpnZWZZRXINCi1FT2JrS3ZiZEtXVkdFRkdpDQotRVBDamp2YmRTUVVIS0ZkWA0KLUVQREtqdmJkRHhZTHNzc2wNCi1FUENqanZiZGZIanZTTnFIDQotRVBDa0t2YmRRd09EYmtoRA0KLUVPY0tqdmJkWm5taUZFeWoNCi1FUENrS3ZiZHF3UU1DaHlSDQotRU9jTEt2YmRaeURpbWNMcg0KLUVPYmpqdmJkakFRR2FRR2oNCi1FUENrS3ZiZFp0SkpZZFRPDQotRU9iamp2YmRqRktnVW9BTw0KLURuYmtLdmJkY1NjTFVFS0INCi1FUERLanZiZGpjTUxSR3VIDQotRU9iamp2YmRxbHpLWkxnaQ0KLUVPY0tqdmJkRmZKck5pVVINCi1FT2JrS3ZiZEthS2dOQnhSDQotRU9jS2p2YmRIRGp1akJpag0KLUVPYmtLdmJkRmVqU09KVVINCi1EbmNMS3ZiZE1JYWxSWUFTDQotRU9jS2p2YmRWVGxzZWt2Sw0KLURvQ2pqdmJkVVFxT3R0aE4NCi1EbmJqanZiZFZZZ3Raa09uDQotRG5ia0t2YmRyb3ZPaWNWZg0KLURuY0tqdmJkS2ZHSUJhUXUNCi1EbmJqanZiZGp1dm5EYXhYDQotRVBETEt2YmRIYWt6RXpBRA0KLUVQRExLdmJkeXpkblJoSWgNCi1Eb0NqanZiZFpHdmRBUFRKDQotRG9ETEt2YmRxdm9sQ2h5Ug0KLURuY0xLdmJkamxiTHllSFANCi1FUENrS3ZiZG1JZFRwdHJCDQotRVBDa0t2YmRRY2JhUHFFUw0KLURvRExLdmJkZGRvU0J3Q2oNCi1EbmJqanZiZGp2V25FQ1h3DQotRG5iamp2YmRaaXNIb2ZiRw0KLUVPY0tqdmJkWlFsZGhsZHENCi1EbmJrS3ZiZGZla3ltZmdBDQotRG5iamp2YmRMQktnTWJZUg0KLUVQQ2pqdmJkRUFSaU16V3cNCi1FT2JqanZiZHRTclRZekVjDQotRVBES2p2YmRab09JZGR5ag0KLURuYmtLdmJkY1NianRFS0INCi1FT2JqanZiZGRuZHNLc3NyDQotRG9Damp2YmR4blNneFNoYw0KLUVQQ2pqdmJkT1RVVmZkdHANCi1Eb0NrS3ZiZFV0TXNlbFdLDQotRG5iamp2YmRKcHlkb0dOZQ0KLURvQ2tLdmJkR1FBU3dHZXkNCi1EbmJqanZiZG5HZHhNbkd5DQotRVBES2p2YmRIRGtWaWJLSw0KLURvQ2pqdmJkdGJidVhXT28NCi1FUERLanZiZEtXVkdFRWdKDQotRU9ia0t2YmRHTEVzQ2dtVg0KLURvQ2tLdmJkYnJianRFS0INCi1FUERMS3ZiZFJ6SmdyY1dBDQotRVBDa0t2YmRhUmVjSVRmTA0KLUVPYmpqdmJkcmJHTWxIS3kNCi1EbmJrS3ZiZFpkd2Z6Z2lDDQotRVBES2p2YmRWd0pYdWRGSA0KLURvQ2pqdmJkaVp0ZWtxT0cNCi1FT2JrS3ZiZHFyVWtPS2FODQotRU9ia0t2YmR5U25JbVJiSA0KLUVPYmpqdmJkZG9GVEtzdFMNCi1FT2NLanZiZHlPVEh4VEpEDQotRG5jS2p2YmRGVnhvb2xpZQ0KLURvQ2tLdmJkRmVqUm5Jc3ENCi1FUERMS3ZiZHB0VUdyUmtVDQotRU9jS2p2YmRhamxHT25EQQ0KLUVQREtqdmJkclJ0a09LYU4NCi1FT2NLanZiZHpvUVFlREx4DQotRVBDamp2YmRyYWZNbEdrWg0KLUVQQ2pqdmJkbXBaeVdLeUMNCi1Eb0NrS3ZiZGRCcmxyQVVODQotRG5ia0t2YmRNZ0RQbHBWTA0KLURuYmpqdmJkVXhoVHpLb08NCi1Eb0NrS3ZiZFNDRGRsSXlMDQotRVBES2p2YmRtYkp2eFBPVg0KLUVQQ2tLdmJkTkdjUU1wVWsNCi1FUENqanZiZFZxbXhDRkxjDQotRG9ES2p2YmRyRGRob25XQg0KLUVPY0xLdmJkWVRMYU5Ub1kNCi1Eb0NrS3ZiZGtJR2xGZW1rDQotRVBES2p2YmROcnN2SEZWUQ0KLUVQRExLdmJkcnpMb3JhSG4NCi1FT2JrS3ZiZHJhZWxrZ0xaDQotRG9ETEt2YmRCZFFBdWpNZg0KLURuY0tqdmJkd3pJR0dZRlMNCi1FT2NLanZiZFplWGZ6aEliDQotRG9ES2p2YmRiQXVlR1BwWA0KLURvQ2pqdmJkWnRKSlljcm4NCi1Eb0RLanZiZHlxUE5KS1hBDQotRG9Da0t2YmRUQUZJaENQRQ0KLURvRExLdmJkamJsTFFnVkgNCi1Eb0NqanZiZFp0SkpaRHNPDQotRU9jTEt2YmRyTlppeGtoSg0KLURvQ2pqdmJkem9QcGRibFkNCi1EbmJrS3ZiZHFjZGhwTnZCDQotRG5jS2p2YmRZcGxkaGxlUg0KLURvQ2pqdmJkbVJ5VXlzRUoNCi1Eb0NqanZiZEpYdEJna3FRDQotRU9jS2p2YmRWd0pZV0RlSA0KLURvRExLdmJkWkxxZFVPTG0NCi1FUERLanZiZEVYd2xVVVRsDQotRU9ia0t2YmRvem5Ea1lQQQ0KLUVQQ2tLdmJkRUFTSk5adncNCi1FUENqanZiZEZqZHNDZ2x1DQotRG9Da0t2YmRUbFdQQldPaQ0KLURuYmpqdmJkY1RDanNkS0INCi1FT2JrS3ZiZGt5U3JUWWZ0DQotRVBDa0t2YmRMclhNeXRweg0KLURuY0tqdmJkWlFtRWhsZVINCi1FT2NMS3ZiZEhrYXpuV3BrDQotRG5ia0t2YmRIZmdaeVh4SA0KLUVPYmtLdmJkcGVjZHRXQWgNCi1EbmJrS3ZiZFJhZEVsSllrDQotRVBDamp2YmRUWGtNTnpqeA0KLURvQ2pqdmJkbVNZdHpURUoNCi1FUENrS3ZiZFpzaUpaRHNPDQotRG5jS2p2YmRkb0Vya1R0Uw0KLURvQ2tLdmJkWlJNZGlNZVINCi1FT2JrS3ZiZFRmem1rdnZGDQotRG5jS2p2YmRweG5oSFFjeA0KLUVQRExLdmJkYU1qYlN0bGcNCi1Eb0NqanZiZGtIZmtlZk9MDQotRG9Damp2YmRxcXRrT0xBbQ0KLURuYmpqdmJkeXplTnFnaUkNCi1FT2NLanZiZGlMZURuVWJ5DQotRG5jS2p2YmR5WUlqQ1B5aw0KLUVPY0tqdmJkcGZFRlVWYUkNCi1FUENqanZiZFppcmdwSEJmDQotRG5ia0t2YmRLV1VlY2RnSg0KLUVPY0xLdmJkaUhLQ3h2SnUNCi1FUERLanZiZGNUQ2tVRUtCDQotRU9jTEt2YmRhTWtCc1ZOSA0KLUVQRExLdmJkSnV0ZkVGR2kNCi1FUENrS3ZiZEZhT3FaSnptDQotRU9iamp2YmRoYW9DZHZxUg0KLUVQQ2tLdmJkZFp4cFh4cUMNCi1EbmJqanZiZFp4Y2luRExyDQotRG9ETEt2YmRwc3NmcXJLdA0KLURvQ2pqdmJkcVRzZ1JyTFUNCi1FUERMS3ZiZEVZWGxVVHRNDQotRU9iamp2YmR1Vm13alFzQQ0KLUVPY0xLdmJkTlB4UXVuSFQNCi1EbmJqanZiZEJoamFqaUdLDQotRG9Da0t2YmRVR3puTVhWZQ0KLUVQREtqdmJkVndJd3ZFRkgNCi1FT2JrS3ZiZFJNd2F5TnR6DQotRG9ETEt2YmRRWk5BR3JySw0KLUVPYmpqdmJkS1dVZWRGR2kNCi1Eb0RMS3ZiZGFOS2FydGxnDQotRG5jS2p2YmR1V09YaXBzQQ0KLUVPYmpqdmJkdVZteEtSVEENCi1Eb0RLanZiZHlnWk1BTWR3DQotRG9ETEt2YmRxVHNmclJrVQ0KLURvQ2pqdmJkRXZZcFFNakYNCi1FT2JrS3ZiZE5QeFF1bkdzDQotRU9ia0t2YmRzWmxQc0Fnbg0KLURuYmtLdmJkWm5uSWRkeksNCi1FUENrS3ZiZE5RWHFXT0hUDQotRG5ia0t2YmRHTEZTYmhNdQ0KLURvREtqdmJkcnpNUHJhSU8NCi1EbmJrS3ZiZFppcmdvZmFmDQotRVBES2p2YmRpakZoSmx4Uw0KLURuY0tqdmJkV1JteEJlTGMNCi1EbmJrS3ZiZHVERFV2dW9QDQotRG9ES2p2YmRpWnVHTVFtZg0KLUVPYmtLdmJkZWxmWEdsakwNCi1FUERMS3ZiZGZORnZmbGpMDQotRG5jS2p2YmRHS2RyY0lOVg0KLUVPYmpqdmJkRmZKcW5Jc3ENCi1FT2NMS3ZiZElMYXpuV3FMDQotRG5jTEt2YmRKdXRlZEZISg0KLUVPY0xLdmJkSXd0QmhMcHANCi1FUERMS3ZiZHNyclN5WmRjDQotRVBES2p2YmRjelpRWHhwYg0KLURuY0xLdmJkRG9Damp2Y0UNCi1FUENqanZiZHB4b0lIUkVZDQotRG9Da0t2YmR4eEpKYlB6TA0KLUVQQ2tLdmJkVlpJVVprUE8NCi1FUERMS3ZiZFVMdW9CV1BKDQotRVBDa0t2YmRmTWZXZm1Kaw0KLURuYmpqdmJkWnRJaVpFVE8NCi1Eb0NqanZiZGlNRWNuVWJ5DQotRG9Da0t2YmRjeXlQeFpRYg0KLURvQ2tLdmJkWmlyZ29mYWYNCi1FT2JrS3ZiZG96bWRMWVBBDQotRG9ES2p2YmRZa3JFVU5rbQ0KLURvQ2tLdmJkTHF3TXpWUXoNCi1FT2JqanZiZExGZklDQlJWDQotRU9iamp2YmRqSmVoS05ZUw0KLURvQ2pqdmJkRUpnaXV3akENCi1FUENrS3ZiZHlxUE5JaXdBDQotRVBES2p2YmROZGNzaUlqZA0KLUVQQ2pqdmJkYXVCZ1hqc2gNCi1EbmJrS3ZiZHl6ZU9SZ2lJDQotRVBDa0t2YmRzQ0dOTGdMWg0KLUVPYmtLdmJkdGJidHdWbm8NCi1FT2JqanZiZHd1TWRxWkxuDQotRU9iamp2YmRTUVRmaWVkWA0KLUVQQ2pqdmJkbXR0eWpqU0cNCi1EbmNMS3ZiZG5IRllNbkd5DQotRG5jS2p2YmR4bXNJWHJoYw0KLUVQREtqdmJkUVltQUdzUmoNCi1FT2JqanZiZGZvYXp2ZFlJDQotRG9ETEt2YmRoYW9ERXZwcQ0KLUVPYmpqdmJkRGloS1Z3akENCi1Eb0NqanZiZFpNU0R0TmxODQotRG5iamp2YmRobEZEblZEWg0KLUVQQ2pqdmJkaUNQQ2R3UlINCi1EbmNMS3ZiZFVMdW9CVm9KDQotRG9ETEt2YmR5WUpLQnBaaw0KLURvRExLdmJkUmJEZGxJeUwNCi1FT2NLanZiZFlTbEFsc29ZDQotRG9Da0t2YmR5U21obHFiSA0KLUVPY0tqdmJkdVdOeEtSVEENCi1EbmJrS3ZiZEZqZVRESU11DQotRG9ETEt2YmR6YUFQR2dDTQ0KLUVQQ2tLdmJkQmhrQ0xKR0sNCi1EbmJrS3ZiZFlwbUZKTkZSDQotRVBDamp2YmRRY2NCUVFkUw0KLUVPY0tqdmJkcUdEZHRWYUkNCi1FT2NMS3ZiZElMYXptdnFMDQotRVBETEt2YmRhamtlbm5EQQ0KLURvREtqdmJkeFZNZHFaTG4NCi1FUERLanZiZE5QeFF1bkdzDQotRU9iamp2YmRoeXRmTVJPRw0KLUVQREtqdmJkRVh4THRUdE0NCi1FUERLanZiZFpubklkZVpqDQotRG9ES2p2YmRHS2VUQ2hOVg0KLURuY0xLdmJkam1DTVplR28NCi1EbmJrS3ZiZFF3TmRDbEhjDQotRG5jS2p2YmRYcmxCTXRPeA0KLURvQ2tLdmJkemFBT2dIQmwNCi1EbmNMS3ZiZGNJbGlqZXdZDQotRU9iamp2YmRyYkZsbEhLeQ0KLUVPY0tqdmJkbWJKd1hubXUNCi1FT2JrS3ZiZHNzU1N4eWRjDQotRG9ES2p2YmRTUVRnS0dFWA0KLURuYmpqdmJkVXlIdFprUE8NCi1FUENqanZiZEZ5VXVBZFlDDQotRG9Da0t2YmRxRmNkc3ZCSQ0KLUVPY0xLdmJkcXdRTGJoeVINCi1Eb0NrS3ZiZGJzQ2tVRUtCDQotRVBDamp2YmRJakVBS1FIRQ0KLURuYmtLdmJkYU5LYlRVbUgNCi1FT2JrS3ZiZG5DS1d4UE9WDQotRU9jTEt2YmRaeGNpbkNsUw0KLUVPYmpqdmJkaGxGRG5WRFoNCi1EbmNMS3ZiZHB5UEhmcGRZDQotRU9jS2p2YmRUbFZvQXVvSg0KLUVPY0tqdmJkbWJLWFhvT1YNCi1Eb0NrS3ZiZHhzT0ltU0JnDQotRG5jS2p2YmRaSFhFQVBUSg0KLURvRExLdmJkRGpJS1Z3akENCi1Eb0RMS3ZiZG5DSnZ3b051DQotRVBDamp2YmRaZVlHemdoYg0KLUVQREtqdmJkSGZmell4WGcNCi1FT2JqanZiZGlyemhya0p6DQotRG9Damp2YmRabm5KRkZaag0KLUVQREtqdmJkZUFUcU13aWYNCi1Eb0RLanZiZGJWQ0hYanNoDQotRG9Damp2YmRHY2tWakNLSw0KLUVPY0xLdmJkeVlKSmJQekwNCi1Eb0NqanZiZGlDUERGV3BxDQotRU9jTEt2YmRJd3RDSUxxUQ0KLURvRExLdmJkS1F6Rk9mT0YNCi1FT2NLanZiZE5Qd3FXTmdUDQotRU9iamp2YmRaTHFjc21rbQ0KLUVQRExLdmJkblB5eHZLeGINCi1Eb0RMS3ZiZEtqYUh2QUtaDQotRU9iamp2YmRqS0Znak5ZUw0KLURuYmtLdmJkTEFrR21DWHENCi1Eb0RMS3ZiZGVFb1NCd0NqDQotRG5iamp2YmRIbEJ6blhSTA0KLURuYmpqdmJkS2ZHSGJCUlYNCi1EbmJrS3ZiZFpRbGRpTWRxDQotRU9jTEt2YmRuQml2d25uVg0KLURuY0tqdmJkc1FWb0tEV0cNCi1FT2JrS3ZiZHlwbmxoaXdBDQotRU9ia0t2YmRyeWtwVEFnbg0KLURvQ2pqdmJkYU1rQnNVbUgNCi1FUERMS3ZiZFJEY0JQcUVTDQotRG9Damp2YmRweG5nZnBkWQ0KLUVPY0tqdmJkRXp0UkZMYmkNCi1FT2NMS3ZiZGNiVE5TQVVODQotRG9Da0t2YmRqY0xqcGZ1SA0KLUVQQ2tLdmJkalN6aHNLaXoNCi1FUENrS3ZiZG9BS3p0SURuDQotRVBDamp2YmRNZ0RRTlB1TA0KLURvRExLdmJkS05BRVpnVkINCi1FUENqanZiZFpzaUpaRHNPDQotRU9jTEt2YmRrQ2trUWZ1SA0KLURvQ2pqdmJkbkdlWG1OZnkNCi1EbmJqanZiZHJwVm9KYnVmDQotRG9Da0t2YmR1Q2J1V3VvUA0KLUVPYmpqdmJkU3drTU56a1kNCi1Eb0NrS3ZiZHJOWml5TUhpDQotRG5iamp2YmR1REN0dnVvUA0KLURvRExLdmJkTXVTcWptQVgNCi1FT2JrS3ZiZHNRVm5pY1ZmDQotRVBDamp2YmRtZmVZTk5nWg0KLURuY0xLdmJkbUlkVVJVcWENCi1FUENrS3ZiZEdCUFF5SnptDQotRVBDamp2YmRaUk5GSW1FcQ0KLURuY0tqdmJkTmRkVUpKTEUNCi1FT2JrS3ZiZGFTRmJnc2VrDQotRG5jS2p2YmREb0NrS3dERQ0KLURvQ2pqdmJkdGt4V2FVQlgNCi1EbmNMS3ZiZGZOR1hITWpMDQotRVBDa0t2YmRxVHRIU1NLdA0KLURuYmtLdmJkeG1yaFhzSkQNCi1EbmJqanZiZG10dHlrS1NHDQotRU9iamp2YmRxY2Rob211YQ0KLURvQ2tLdmJkVlRsc2ZNVmoNCi1EbmJrS3ZiZFJFQ2FQcGNyDQotRG5ia0t2YmRpakZoS05ZUw0KLUVPYmtLdmJkSXdzYklNUlENCi1FUERMS3ZiZEpiaWJxSmJ4DQotRVBES2p2YmR4eEpLQ1B5aw0KLUVPY0tqdmJkanV2bkVDWVgNCi1EbmJrS3ZiZEtSWmVQRm1lDQotRG5ia0t2YmRNcFlSVm5Hcw0KLUVPY0tqdmJkZk1ldmdOS0wNCi1Eb0NrS3ZiZG1mZVhtT0haDQotRG5jTEt2YmRGcEFUWEdleQ0KLURvREtqdmJkSlh0Q0lNUXANCi1FT2JqanZiZFpzaGlaRHNPDQotRVBETEt2YmRhUmZESHNmTA0KLURuY0tqdmJkTUlha3FZQVMNCi1FT2JqanZiZFNMWkdVZmpzDQotRG9ES2p2YmRCY29hV0ptRw0KLURvREtqdmJkRXV4cFBsaWUNCi1FT2JqanZiZEpjSmJxS0N4DQotRG9Damp2YmR4d2hpYXBaaw0KLURuYmtLdmJkc0JlbUxma1oNCi1Eb0RMS3ZiZEhnR3l4d3hIDQotRU9jS2p2YmRRZERBcFJEcg0KLUVQRExLdmJkS1dVZkRlSEoNCi1EbmJqanZiZGp2WE9EYllYDQotRG9ETEt2YmRIRUxXSmJLSw0KLURuY0xLdmJkZ0ZreW5ISEENCi1FUENrS3ZiZFB4bUFIU3FqDQotRG9ETEt2YmRZa3FkVG5MbQ0KLUVQQ2tLdmJkSllVQ0lMcHANCi1FT2NLanZiZHh3aGpCcFprDQotRG9Damp2YmRpTUZFTnRjWg0KLURvQ2pqdmJkbkNKdndvT1YNCi1Eb0RLanZiZFNLeGV0Z0tzDQotRU9jS2p2YmRXUm14Q0ZNRA0KLUVPY0xLdmJkcGVkRlR2QkkNCi1FT2JrS3ZiZGJBdkVmUG93DQotRU9ia0t2YmRabm1pRWVaag0KLURuYmtLdmJkdFRTU3laZUQNCi1FUENrS3ZiZFB4bUFHc1JqDQotRVBDa0t2YmRWVG1VR0x2Sw0KLUVPYmtLdmJkSm1BRHlmdGENCi1FT2NLanZiZHdXbEJWYVdWDQotRG9ETEt2YmRqY01LcUd0Zw0KLUVPY0xLdmJkR0dKck5pVHENCi1EbmJrS3ZiZGdQYXp2ZFlJDQotRVBDa0t2YmRHTEVzREhtVg0KLURuYmpqdmJkcWNlSW9tdWENCi1EbmNMS3ZiZGpia2pwZ1VnDQotRG9Damp2YmRTeExMbXprWQ0KLUVQRExLdmJkaktHSGlseFMNCi1FUERLanZiZG1iSnZ3b051DQotRVBES2p2YmRqbUJreWVIUA0KLUVQRExLdmJkelJPbGlKd0ENCi1EbmJqanZiZFVhQnBycHJaDQotRG9ES2p2YmR0YmJ0d1dQUA0KLURuYmpqdmJkVVJRb1ZWSG0NCi1Eb0NqanZiZGpia2pxR3VIDQotRG9Damp2YmRSYkVGTGh5TA0KLURuY0tqdmJkQmNwQXVqTWYNCi1Eb0NrS3ZiZFB4bUFHcnFqDQotRVBETEt2YmRaUk1lSW1GUg0KLUVPY0xLdmJkY1NjS3NjaWENCi1FT2JqanZiZGVYeXRUckZ6DQotRVBDamp2YmRLZkdJQ0JRdQ0KLURuY0tqdmJkaWpHSUtNd3INCi1FT2JqanZiZFpMcWN0T0xtDQotRU9ia0t2YmRTTFpGdUdqcw0KLURuYmpqdmJkWk1SY3NuTU4NCi1FUENrS3ZiZFdTT1lCZU1EDQotRU9iamp2YmRSYWNkbEpZaw0KLURuYmpqdmJkRnlWVWFFWGINCi1FT2JqanZiZFJiRUZMaVlrDQotRU9iamp2YmRaalRJUUdhZg0KLUVQQ2tLdmJkTnNUdWdFdHANCi1Eb0NrS3ZiZEVBU0lseXZ3DQotRG9Damp2YmRzcnJTeHpGRA0KLURvRExLdmJkUXdPRURNSUQNCi1FUERLanZiZGFhVmVHUVB3DQotRG9Damp2YmRGZWpSbkl0Ug0KLUVPYmtLdmJkUmFjZGxJeUwNCi1EbmJqanZiZEdHSnFuSXNxDQotRG9ETEt2YmRHWXR1QkR4Qw0KLURuY0tqdmJkYkxNR1BPREENCi1FT2JqanZiZHFZb0lHcGN4DQotRG5jS2p2YmRyeWtvc0Fnbg0KLUVQQ2pqdmJkSmJqRFFqQ3gNCi1FT2JqanZiZGt5U3FzWWZ0DQotRVBES2p2YmR4d2hqQnBaaw0KLURuY0tqdmJkYXVCZndrVGgNCi1FUENrS3ZiZHRTclN4eWRjDQotRG9ES2p2YmRNUnZtWnVReg0KLURuY0xLdmJkblV0eWppcWYNCi1Eb0RLanZiZFNMWWV0Z0tzDQotRG9ETEt2YmRKYmpDcUpjWQ0KLUVQRExLdmJkU2h5aXFBQWwNCi1FUERMS3ZiZFNRVUhKZkR3DQotRU9jTEt2YmRpakZoSm1ZUw0KLUVQRExLdmJkdndNQldBdlYNCi1FT2JqanZiZGVYeXRVU0Z6DQotRU9iamp2YmRXWEpYdWNlSA0KLUVQQ2tLdmJkckRlSW9tdkINCi1EbmNLanZiZGN6WlFYeVJDDQotRG5iamp2YmRRbHhDWk9Veg0KLUVQQ2pqdmJkUWNjQXBSRHINCi1Eb0NrS3ZiZHFpQUpkbG9GDQotRG9Damp2YmREd3drdFR0TQ0KLUVQQ2pqdmJkUnBVR2pHRVgNCi1EbmJrS3ZiZFdmWXl0QVBUDQotRVBDamp2YmRVTVZvQlZuaQ0KLUVPYmtLdmJkeG5TaFlUSWMNCi1FT2JqanZiZFZBYXFTcHJaDQotRG5jTEt2YmRLVnRmRGRnSg0KLURvQ2pqdmJkbGlFVVF0cWENCi1EbmJqanZiZGlHakN5V0tWDQotRG5iamp2YmRxclZMT0xCTg0KLUVPYmtLdmJkVWFDUlNxU1oNCi1FT2JrS3ZiZFRrdlBBdW5pDQotRG9Damp2YmRJR2daeVh3Zw0KLURvRExLdmJkc3NSc1l6RWMNCi1EbmJqanZiZFpMcWRUbWttDQotRVBDamp2YmRVdE5UZkx2Sw0KLURuY0tqdmJkZk1ld0dtSmsNCi1FT2NMS3ZiZENUQkRUZldyDQotRVBES2p2YmRGcEFTd0dleQ0KLUVQQ2pqdmJkWkxyRVRta20NCi1FUERMS3ZiZHlYaGpDUVprDQotRG5ia0t2YmRlQVRxTXhKZg0KLURvQ2pqdmJkakpmSGlsd3INCi1FUERLanZiZHppdG9wRVN0DQotRVBES2p2YmRFdXhvcE1qRg0KLURvQ2tLdmJkdkJFWXJvRkkNCi1EbmJrS3ZiZHJOWml5TUlKDQotRVBDamp2YmR4Vk1kcHlNTw0KLURuYmtLdmJkUWx4Q1pPVXoNCi1EbmJrS3ZiZHFtWml5TGhKDQotRG5jTEt2YmRYblJBWHVXVQ0KLUVPYmtLdmJkUmFkRWxKWWsNCi1EbmNLanZiZExpQmtxWUFTDQotRG5iamp2YmRtUnlVeXNEaQ0KLURvREtqdmJkS0NpY1FqRFkNCi1FT2NMS3ZiZFJrWkdWR2pzDQotRG9ES2p2YmR0U3JTeVpkYw0KLUVPY0tqdmJkUnlqSVNidkENCi1FUENqanZiZEhmZnl5WVlIDQotRU9jS2p2YmRhb2dIRGt6ZA0KLUVQQ2pqdmJkaWRrR3VQQU8NCi1FT2NLanZiZENEcEF1ak1mDQotRG9Da0t2YmR1Vm5YalFzQQ0KLURuYmpqdmJkVHVsUUp0QXENCi1EbmNLanZiZHFUc2dSckxVDQotRG9Da0t2YmR6ZHluemR5cA0KLUVPYmtLdmJkZW1HWEhOS0wNCi1FT2NLanZiZEpYdENIbFJRDQotRVBES2p2YmRlZ2tXUm5RZw0KLURvQ2pqdmJkeVhpS0NQeWsNCi1FUERMS3ZiZGxaVFJzWkhVDQotRG9Damp2YmRmTkZ2Z05LTA0KLURuYmpqdmJkYlZCZ1lMVGgNCi1EbmNLanZiZGNKTWlrRnZ4DQotRVBETEt2YmRVTVZuYVZvSg0KLURvQ2tLdmJkZ1FCenZjeEkNCi1Eb0NqanZiZFp0SWh4ZFNuDQotRVBDamp2YmRSV25FRE1JRA0KLUVPYmtLdmJkamxha3lkZm8NCi1EbmNMS3ZiZHJwV09pY1ZmDQotRU9jS2p2YmRoZ0tEWXVpdQ0KLURvREtqdmJkbUlkVHFVcWENCi1FUENqanZiZHd0bGVReGtuDQotRU9ia0t2YmRjSk5LS2ZXeA0KLURuY0xLdmJkTnNVV0dkdHANCi1Eb0RLanZiZFdTT1hiRWtjDQotRVBDa0t2YmRweU9oSFJFWQ0KLURvREtqdmJka3lUU1RZZnQNCi1FUENqanZiZEZqZHJiZ21WDQotRG5jTEt2YmRyb3VuakRXRw0KLURvREtqdmJkVlRtVGZMdksNCi1FUERMS3ZiZFNDRGVMaVlrDQotRG9Da0t2YmRyWFBsREl4cQ0KLURuY0xLdmJkS1Z1R0RlSEoNCi1EbmJqanZiZHJXb2tjSXhxDQotRU9iamp2YmRLVnVHRUVmaQ0KLUVQRExLdmJkcmJHTWxHankNCi1FUERLanZiZGxxeHR6U2NpDQotRU9jTEt2YmR3eWdlZXdlUw0KLUVPYmpqdmJkaktHSUtOWVMNCi1FT2JrS3ZiZFZyT1hiRWxEDQotRG5iamp2YmRyTXpLWkxnaQ0KLUVQQ2tLdmJkTXBYcVdOZnMNCi1FUERMS3ZiZHJTVWtPTEFtDQotRVBES2p2YmRaaXNJUGZiRw0KLUVQRExLdmJkUkRiYVFSRVMNCi1EbmNLanZiZFZUbVVHTHZLDQotRU9jS2p2YmRZemNHUmpXWg0KLUVPYmpqdmJkTXVTckxOQVgNCi1EbmNLanZiZGpnZmxHRm5MDQotRG5jTEt2YmRXSVh2WGZ4eg0KLURvRExLdmJkTkhDb21QdGsNCi1FT2NMS3ZiZFNCY2VMaHlMDQotRG9Da0t2YmRaUk1lSW1GUg0KLUVQRExLdmJkaWlmSUtNd3INCi1Eb0NrS3ZiZHZCRHhzT2VJDQotRVBETEt2YmR4bXNIeFNoYw0KLUVPY0tqdmJkY3l5UHhaUkMNCi1Eb0NrS3ZiZHNCZk5NSEt5DQotRG9ETEt2YmRhUmViaFRmTA0KLURuY0xLdmJkeXBvTkpLWEENCi1FT2JrS3ZiZHpSUE5KS1hBDQotRG5ia0t2YmRUdkxvaXRCUg0KLUVPY0tqdmJkV0h3dXhHeHoNCi1FT2JqanZiZFpIV2RBUFRKDQotRG5iamp2YmR5U25KTXFhZw0KLUVQQ2tLdmJkdFRSc1l6RkQNCi1FUERMS3ZiZGh5dGVsUW5HDQotRVBDa0t2YmRUcHBudHVIbQ0KLURuYmpqdmJkWmVZR3poSWINCi1FUENqanZiZEl3c2FnbFFwDQotRG9Da0t2YmRwc3RHclJrVQ0KLUVPYmpqdmJkQ0pMQmppRmoNCi1FT2NMS3ZiZGVQRXJqc3RTDQotRVBES2p2YmRweG5oR3FEeA0KLURuYmpqdmJkWnlFS09DbFMNCi1Eb0NqanZiZHB5T2hIUkVZDQotRG5jTEt2YmROR2NQbVB1TA0KLURvRExLdmJkUXdOY2NMZ2MNCi1FUERLanZiZG1iSnZ4UE51DQotRG5ia0t2YmRRd09FRE1IYw0KLURvREtqdmJkWHJsQWx0T3gNCi1FUENrS3ZiZEdRQVN2Z0daDQotRU9jTEt2YmRtdHR5a0tTRw0KLUVPY0xLdmJkR0xGU2JnbVYNCi1EbmNMS3ZiZHVDYnVXdk9vDQotRVBES2p2YmRTUVRmaWVjdw0KLURvQ2tLdmJkWWtxY3ROa20NCi1Eb0RMS3ZiZGxaU3FzWkhVDQotRG9ETEt2YmRxR0VFdFZhSQ0KLUVPYmpqdmJkaHl0ZWtwbWYNCi1Eb0RLanZiZG11VXpLaXFmDQotRU9iamp2YmRyTXlpeUxoSg0KLURvRExLdmJkRUFSaGx6V3cNCi1FT2JqanZiZGFSZkNnc2VrDQotRVBES2p2YmRhTkthcnVOSA0KLUVPY0xLdmJkSnFaZU9lbkYNCi1EbmJqanZiZFRmem1sWFZlDQotRG9Damp2YmR6UW9OSWpYQQ0KLUVPYmtLdmJkTXBZUXZOZnMNCi1EbmNMS3ZiZFZyT1lDRWxEDQotRG9Damp2YmRpakdJSmx3cg0KLURvRExLdmJkclhRTURJeVINCi1FUERMS3ZiZEVZWU1VVHRNDQotRG5jS2p2YmRrSGdNRmVuTA0KLURuYmpqdmJkcWRGSXBPV0INCi1FT2JrS3ZiZHFGY2VUdkFoDQotRU9iamp2YmR5T1NneFNpRA0KLUVPY0tqdmJkRG5ia0t2Y0UNCi1Eb0RMS3ZiZFlxTWVJbUZSDQotRU9ia0t2YmR3dGxlUlpNTw0KLUVQQ2tLdmJkcldvbENpWXENCi1FT2JqanZiZHJYUGtjSllxDQotRG9Da0t2YmR0bFh2YVVCWA0KLUVPY0xLdmJkZVlac3NyRnoNCi1Eb0RMS3ZiZG5HZVlNbkhaDQotRU9ia0t2YmRZVExhTXRPeA0KLURvRExLdmJkSmNKY1JLRFkNCi1FUERLanZiZGVLSnJWdHpuDQotRG9Da0t2YmRyU1VrTmphTg0KLURuY0tqdmJkZUFUcU5YakcNCi1FT2JrS3ZiZHFsekp5TGhKDQotRU9iamp2YmREaklKdlhqQQ0KLUVPYmpqdmJkekd5TUFNZHcNCi1Eb0RMS3ZiZEZmSnJOaVRxDQotRU9jTEt2YmRCaGtDS2lHSw0KLUVPYmpqdmJkcHNzZ1NSanQNCi1EbmNLanZiZEthTEdsYlhxDQotRU9jTEt2YmRsWXJxcnhnVQ0KLUVQQ2pqdmJkVnFteEJlTGMNCi1FUERMS3ZiZFpRbUZKTkZSDQotRG9Da0t2YmRrQ2trUWZ1SA0KLURuY0tqdmJkYXVDR3dqc2gNCi1Eb0NqanZiZEVBU0lseXdYDQotRG5jS2p2YmRMQWpnTkJ4Ug0KLURuY0tqdmJkQ0RwQlZpbUcNCi1FT2NMS3ZiZHFsekp4a2hKDQotRVBETEt2YmR0dk54S1JUQQ0KLURuYmtLdmJkR0xGU2NJTlYNCi1Eb0NrS3ZiZFF2bWRDa2hEDQotRVBES2p2YmRGamRyYmhOVg0KLUVQQ2tLdmJkWkxyRVRuTG0NCi1FUERMS3ZiZFR2TG9pc2FSDQotRVBETEt2YmRzcnJUWlpkYw0KLUVQQ2tLdmJkWk1SY3NtbE4NCi1EbmNMS3ZiZHhuVEh4VEljDQotRU9jS2p2YmR6Uk9saUp3QQ0KLUVPY0tqdmJkc1FWbmpEVmYNCi1FT2JrS3ZiZHFHRGRzdkJJDQotRG5jS2p2YmR3dGxlUXhrbg0KLUVPYmpqdmJkVHFSUFV1SG0NCi1EbmJqanZiZFZ3SXd2RUZIDQotRVBDamp2YmRac2hoeGNzTw0KLURvQ2tLdmJkS0NpYnFKYngNCi1FT2NLanZiZFVWbFFLVGFSDQotRU9ia0t2YmRWVG1VRmxXSw0KLUVPY0xLdmJkbUljdFJWUmENCi1Eb0RLanZiZFBJQVlaQVlhDQotRG9Da0t2YmRqdlduRGJYdw0KLURuYmpqdmJkdHZOd2pSVEENCi1FT2JqanZiZE5IQ29tUVVrDQotRU9jS2p2YmR5U25JbVJiSA0KLURvQ2pqdmJkRGpJS1Z4S0ENCi1EbmNMS3ZiZEtlZkhiQXB1DQotRU9iamp2YmRlaExXUm1wZw0KLUVPY0xLdmJkSlRaQXNNd2wNCi1Eb0RLanZiZFppcmdwSENHDQotRU9ia0t2YmRvem1janhQQQ0KLUVPYmtLdmJkc1prb3NBZ24NCi1FUENqanZiZFN4S2xOemp4DQotRG9Damp2YmRmSUxWck5wZw0KLUVQQ2pqdmJkR0dLUm5KVHENCi1EbmJqanZiZHBzc2dTU0xVDQotRG9ES2p2YmRyRGRpUG12Qg0KLUVQQ2tLdmJkWnRKSlljc08NCi1Eb0RMS3ZiZE5kY3RJaGtFDQotRVBDamp2YmRjSW1Ka0Z2eA0KLUVPY0xLdmJkR0xFcmJoTlYNCi1Eb0NrS3ZiZG5RWnh1a1liDQotRVBDa0t2YmRXU054QmVMYw0KLUVQQ2tLdmJkc1B2T2pEV0cNCi1FT2NMS3ZiZGVGT3FhdmJqDQotRVBDamp2YmRqQVFIQXBISw0KLUVQREtqdmJkd1hNQlZhVnUNCi1EbmNMS3ZiZE1vd3FXTmZzDQotRG9Da0t2YmRSYkVGTUpZaw0KLURvQ2tLdmJkck5aalpMaEoNCi1Eb0NqanZiZHVEQ3R3V1BQDQotRU9iamp2YmROZUVVSklqZA0KLURuYmtLdmJkbFlzUnNZZ1UNCi1Eb0NqanZiZFV4Z3N5am5uDQotRU9ia0t2YmRiTE1HUE9EQQ0KLURvQ2tLdmJkZG5lVEt0VVMNCi1FT2NLanZiZHZ2a2FXQXV1DQotRVBES2p2YmRWVU5VRmt1ag0KLUVPYmpqdmJkS0RLRFFqQ3gNCi1FUERLanZiZG5VdVpqaXFmDQotRG9Da0t2YmRzQ0ZtTUdrWg0KLURuY0tqdmJkcnBWbmpEV0cNCi1EbmJqanZiZGladGZNUW1mDQotRG9Da0t2YmR3V2thVmFWdQ0KLURvQ2pqdmJkU0NEZUxpWkwNCi1EbmNLanZiZEVZWUx0VHNsDQotRVBETEt2YmRPU3N1ZmVWUQ0KLUVPY0xLdmJkV1NPWGFkbEQNCi1FUERMS3ZiZHBhSkZBWEhkDQotRG5jS2p2YmRTQ0Rka2h5TA0KLURvQ2pqdmJkSU1Cem12cUwNCi1EbmJrS3ZiZFZVTXNmTHZLDQotRG9Da0t2YmRsaGN0UXVTQg0KLURuY0tqdmJkSnV1R0VGR2kNCi1FUENqanZiZEpTeUFzTXdsDQotRU9jS2p2YmRVdE10R01Wag0KLUVQQ2tLdmJkSERrV0tDS0sNCi1EbmNMS3ZiZHlTbkltUmFnDQotRVBDamp2YmR3TXZBTWNkbQ0KLURuYmtLdmJkZWxldmZtSmsNCi1FUERLanZiZFlPUkFZVXZVDQotRVBDa0t2YmRWd0l4V0RlSA0KLUVPYmpqdmJkdHZPWGlwc0ENCi1EbmNMS3ZiZGhsRWRPVWNaDQotRU9jTEt2YmRUbFZvQXVvSg0KLUVQQ2tLdmJkTlFYcHVuSFQNCi1FT2NMS3ZiZFdYSlh2RGRnDQotRG5ia0t2YmRab09KRkV6Sw0KLUVPYmtLdmJkbWJLV3dvT1YNCi1EbmJqanZiZGlIS0RZdktWDQotRG5jS2p2YmRmU0JXemxEUA0KLURvQ2tLdmJkTEJLZmxhd3ENCi1FT2JrS3ZiZFVzbVVGa3ZLDQotRU9iamp2YmRMcXdOWnRweg0KLURvQ2tLdmJkc0JmTkxmankNCi1EbmNMS3ZiZGp2V21jYllYDQotRU9ia0t2YmRhTWtCcnVNZw0KLUVQQ2tLdmJkSGthem12cUwNCi1EbmJqanZiZFJ5akhyYnZBDQotRVBDa0t2YmROUVhwdk9IVA0KLUVPYmpqdmJkT1lQVnpjblUNCi1Eb0NqanZiZGFTR0NndEZrDQotRG9ES2p2YmR4bXNIeFNpRA0KLUVPYmpqdmJkWmlyZ29nQ0cNCi1FT2NMS3ZiZG11VlprS1NHDQotRG5jTEt2YmRVeUhzektubg0KLURuYmtLdmJkeG1zSHhUSkQNCi1FUENrS3ZiZFZyT1lCZGtjDQotRU9jTEt2YmRoa2RjbXVEWg0KLURuY0tqdmJkd3VNZHB5TG4NCi1FT2JrS3ZiZHhWTWRweGxPDQotRVBES2p2YmRtYktXd29PVg0KLURvQ2pqdmJkaGtlRG10YnkNCi1EbmNMS3ZiZExGZWhDQlF1DQotRG9Da0t2YmRZU2thTlVPeA0KLURuYmtLdmJkbWFpdnhQTnUNCi1FUERLanZiZGZORnZnTktMDQotRVBES2p2YmRobEVkT1VjWg0KLUVQRExLdmJkVHVrcEtVQXENCi1EbmNLanZiZFVWbFFLVGFSDQotRG5ia0t2YmRZZ1dkQVBTaQ0KLURvREtqdmJkSXdzYkhrcHANCi1FT2NLanZiZGxaVFNUWWdVDQotRG9Da0t2YmROSENvbHBWTA0KLUVQQ2pqdmJkeHJtaG1SYWcNCi1FT2JrS3ZiZFV4Z3N5am5uDQotRG9Damp2YmRzUVZvSmJ2Rw0KLURvQ2tLdmJkQmRRQlZqTWYNCi1FT2JrS3ZiZElISFp4eFhnDQotRU9jS2p2YmRKdXVGZEVnSg0KLURvRExLdmJkd3loR0dYZVMNCi1EbmJrS3ZiZFNLeUZ1R2tUDQotRG9ES2p2YmRpR2lieHZLVg0KLURuY0tqdmJkbkJqWFhvTnUNCi1EbmJrS3ZiZEZwQVRXZmZaDQotRVBDamp2YmR1REN0dnZPbw0KLUVPYmpqdmJkSXNaQXJseE0NCi1EbmNLanZiZEV2WW9wTWpGDQotRU9iamp2YmR3dU1kcVlrbg0KLURvQ2pqdmJkd3loRmZZRXINCi1FUENqanZiZHFVVGZyU0xVDQotRU9jTEt2YmR6R3hsQU5Fdw0KLUVQQ2pqdmJkRU9jS2p3Q2QNCi1FUENrS3ZiZE9Tc3ZHZVVwDQotRG5jS2p2YmRobEVjblVjWg0KLUVQQ2tLdmJkVVZrb2l0QXENCi1EbmJqanZiZE9BSlRUalNBDQotRG5jS2p2YmRxbVppeUxoSg0KLUVPYmpqdmJkcHN0R3FyTFUNCi1FUERMS3ZiZEZ4dVZBY3diDQotRG9Da0t2YmRhdUJnWUtzaA0KLURuYmpqdmJkWk1SY3Nta20NCi1FT2NMS3ZiZHFyVkxOa0JODQotRG9ES2p2YmROUVlSV05nVA0KLURvQ2pqdmJkQ1RCQ3RGdnINCi1EbmNLanZiZFp5RUtOY01TDQotRVBDa0t2YmRWdmlZVmRGSA0KLURvREtqdmJkZVBFcmp0VVMNCi1FT2JrS3ZiZHd0bUZSWkxuDQotRG5jS2p2YmRwZWRFc3ZBaA0KLUVQQ2tLdmJkem9RUkZDbFkNCi1Eb0RLanZiZEl4VGJJTVFwDQotRG9ETEt2YmR4c09JbVNDSA0KLUVQQ2pqdmJkWWZ3RUFPcmkNCi1FT2NLanZiZG5QeXlXTFpDDQotRU9jS2p2YmRobEZFT1ZDeQ0KLURvQ2pqdmJkd3loRmZYZHINCi1EbmJrS3ZiZFpRbUVobGVSDQotRG5iamp2YmRiQXVkZXBQdw0KLURuYmpqdmJkTXBYcVZtZ1QNCi1EbmNMS3ZiZE5lRVVJaGpkDQotRU9ia0t2YmRNZmJvbVFVaw0KLURvQ2tLdmJkcXZwTURKWXENCi1Eb0RMS3ZiZGZla3pOZmdBDQotRU9jTEt2YmRlckF2emxDbw0KLUVPY0xLdmJkaVp0ZWxRbkcNCi1FUERMS3ZiZFJYTmRDbEhjDQotRVBES2p2YmROcnN1ZmVVcA0KLURuY0tqdmJkWlFsZGlNZVINCi1FT2JrS3ZiZGlMZGNtdGJ5DQotRG5jTEt2YmRaUW1FaGxlUg0KLURuY0xLdmJkWlJORWlNZHENCi1EbmNMS3ZiZFdSbXdhZGxEDQotRVBETEt2YmRHTEVzREhsdQ0KLURuY0xLdmJkWmpUSVBnQ0cNCi1FT2JqanZiZHhuVElYc0ljDQotRVBDamp2YmRsaUVUcHRxYQ0KLUVPY0tqdmJkbHJaVXlyY2kNCi1Eb0RLanZiZGJLbEZubkRBDQotRG5iamp2YmR3WExhV0JXVg0KLURvQ2tLdmJkdWFFWlNvRkkNCi1FUENqanZiZFJ5akhyYnZBDQotRVBDamp2YmRMaGFrcHhBUw0KLURvQ2tLdmJkbWFpd1hvTnUNCi1FT2NLanZiZHlOcmhZU2hjDQotRU9iamp2YmRzQ0ZsbEdqeQ0KLURuYmtLdmJkWnNoaHhkVE8NCi1Eb0RLanZiZFpqU2hQZmFmDQotRU9jS2p2YmRtYWpXd25tdQ0KLUVPYmpqdmJkSnZVZkVGSEoNCi1FUENrS3ZiZE9FY3NpSWtFDQotRVBDa0t2YmRrTkJsWmVHbw0KLURvQ2pqdmJkVnZpWHVkRkgNCi1EbmJrS3ZiZGpKZkhqTXhTDQotRG9ETEt2YmRHQlBSWkp6bQ0KLUVPY0tqdmJkaUNPYmR2cVINCi1EbmJqanZiZFZ3SllXRGVIDQotRG5jS2p2YmRHQW9ReGl6bQ0KLUVPYmpqdmJkeG1zSVlTaUQNCi1EbmNMS3ZiZHFxdGtPTEFtDQotRU9iamp2YmR2dmxBdkJXVg0KLURuY0tqdmJkdkFkWlRQRkkNCi1FT2NLanZiZGpBUUhBb2dLDQotRU9ia0t2YmRweG9JSFJEeA0KLUVQQ2tLdmJkZmZMeW5HZ0ENCi1FUERMS3ZiZFR2THBLVUFxDQotRU9jS2p2YmRtdHR6S2pTRw0KLURvQ2tLdmJkcXdRTUNoeVINCi1Eb0RLanZiZHJ6TVBzQWduDQotRG9ETEt2YmR5WUpLQ1B5aw0KLURvQ2tLdmJkUmJFRWtoeGsNCi1FUENrS3ZiZEJkUUF1aWxmDQotRVBETEt2YmRSYWNlTUl5TA0KLUVPY0tqdmJkcmFlbGtmankNCi1FT2NMS3ZiZEVBU0lseld3DQotRG5ia0t2YmRPU3N2R2VVcA0KLURuYmpqdmJkbXVWWmtKckcNCi1EbmJrS3ZiZFZ3SXd2RGVIDQotRG9ES2p2YmR3V2xBdkJWdQ0KLURuY0tqdmJkU0t5RnVHanMNCi1Eb0NrS3ZiZE9YbnV6Y210DQotRG5jS2p2YmRyWFBsREpaUg0KLUVQRExLdmJkc0JmTk1HankNCi1FUERMS3ZiZGlpZkhpbHdyDQotRG5ia0t2YmRqdldtY2JZWA0KLURvRExLdmJkWm5taGRkeWoNCi1FUENrS3ZiZGVtRnZmbUtMDQotRVBETEt2YmROeFBWemNuVQ0KLURuYmpqdmJkUmtZZlVnTFQNCi1FUENrS3ZiZFpSTWRobGRxDQotRU9iamp2YmRZcU1kaG1GUg0KLURuY0xLdmJkSnZWR0RlR2kNCi1FUERLanZiZFV0TXNmTHVqDQotRG9ETEt2YmRaeUVKbkNsUw0KLURuYmtLdmJkamNNS3FHdGcNCi1FUENqanZiZERuYmprWERFDQotRG5iamp2YmRMR0dJQ0FxVg0KLUVQREtqdmJkV0lYdllHeHoNCi1FT2NMS3ZiZEJpTENLaGZLDQotRG5ia0t2YmRkd3pVVVJleg0KLUVPY0xLdmJkWlFsZGlNZHENCi1EbmNMS3ZiZEtWdGZFRkdpDQotRG9Da0t2YmR2QWN4c1BFaA0KLURuY0xLdmJkanZXbWNiWHcNCi1FT2JrS3ZiZHFpQUplTk9lDQotRU9jTEt2YmRVTVdQQldQSg0KLUVQQ2pqdmJkT0ZEc2hoamQNCi1FT2NMS3ZiZFZyTnhCZU1EDQotRVBES2p2YmRpR2ljWldLVg0KLUVPYmtLdmJkdFRScnh6RkQNCi1Eb0NqanZiZGpKZkhpbHhTDQotRG9Damp2YmRlbGZYR21LTA0KLUVQQ2pqdmJkSXJ4YVRNd2wNCi1FT2NMS3ZiZFJFQ2FQcGNyDQotRG5ia0t2YmRpTGVEbXRieQ0KLUVQRExLdmJkR2NqdktDSmoNCi1FT2NLanZiZFdXaVh1Y2VIDQotRG9Da0t2YmRwc3RIUnJMVQ0KLUVQRExLdmJka0hnTGVlbWsNCi1FUENrS3ZiZHpHeGxBTkV3DQotRU9ia0t2YmRqS0dIak13cg0KLUVQQ2tLdmJkaVV6RXZxdUMNCi1FT2NMS3ZiZHdYTUJXQlZ1DQotRU9ia0t2YmRlS0tSdlV6bg0KLURuY0xLdmJkU0JjZUxoeGsNCi1Eb0RMS3ZiZEpiaWJxSmJ4DQotRG5jS2p2YmRlQVVRbHhKZg0KLUVQREtqdmJkYlVhZndrVUkNCi1Eb0NrS3ZiZHhuVElYcmlEDQotRVBETEt2YmRSYWNkbEpZaw0KLUVPY0xLdmJkbWdGWGxuR3kNCi1FT2NLanZiZEhFTFdKYWlqDQotRVBETEt2YmRMaGJNUXhBUw0KLURuYmtLdmJkaGJQREZYUlINCi1FT2NLanZiZHF3UU1ESXhxDQotRG5jS2p2YmRlT2Rya1Rzcg0KLUVPYmpqdmJkeU9TZ3dyaUQNCi1FUENrS3ZiZGptQ0x5ZUhQDQotRG5iamp2YmRaaXNIcEdiRw0KLUVPY0tqdmJkSUhHelpYd2cNCi1EbmNMS3ZiZHdXa2FXQXZWDQotRG9ES2p2YmRmZkx6T0hIQQ0KLUVQQ2pqdmJkcVpQSUhSRVkNCi1Eb0NrS3ZiZERqSGl2WUtBDQotRG9ETEt2YmRZTnFBWVZXVQ0KLUVQQ2tLdmJkempVcFBjcnQNCi1EbmNMS3ZiZGxxeVZacmRKDQotRG5jTEt2YmREb0RMTFhERQ0KLURvQ2pqdmJkY1NianREaWENCi1Eb0RLanZiZER4WGxVVHNsDQotRG5jTEt2YmRKWVRhaExwcA0KLUVPYmtLdmJkTlFYcVZuSFQNCi1FT2JqanZiZGlqR0lKbHhTDQotRU9iamp2YmRPU3RWZmR0cA0KLUVQQ2tLdmJkZXJCV3psQ28NCi1FT2JqanZiZEtRekVuZW5GDQotRVBDamp2YmRtdHVaa0tSZg0KLUVQQ2tLdmJkRUpoSnV4S0ENCi1FUENqanZiZGdHTHltZmdBDQotRU9iamp2YmRSYkRlTGh4aw0KLUVPY0tqdmJkclNVa05rQW0NCi1Eb0RMS3ZiZEVPY0xMWERFDQotRU9iamp2YmRCaGpiS2lGag0KLURvRExLdmJkQmRRQXVpbUcNCi1EbmJqanZiZER3d2tzdFRsDQotRG9ETEt2YmRWd0pZVmRFZw0KLUVPY0tqdmJkQUNxd2l6SlENCi1FT2JqanZiZFpzaUl5RVRPDQotRU9ia0t2YmRHTEZTYmhNdQ0KLUVPY0xLdmJkRmtGVENoTlYNCi1EbmJqanZiZFZCQ1JTcHJaDQotRG9Damp2YmRzc1JzWXlkYw0KLURvQ2tLdmJkVU1XT2FXT2kNCi1Eb0RLanZiZFlTbEJNc254DQotRU9ia0t2YmROc1R2SEZWUQ0KLUVQREtqdmJkWmlzSVBmYWYNCi1FT2NMS3ZiZHBzc2ZxcWp0DQotRVBDa0t2YmROSENwTXBWTA0KLUVQREtqdmJkY3paUHd4cGINCi1FUENqanZiZG5CaXZ4UE9WDQotRG9ES2p2YmRVdE5UZWxWag0KLUVQREtqdmJkamhITUZmTmsNCi1FT2JqanZiZEV1eVBvbGllDQotRVBETEt2YmRLUXlkbmVtZQ0KLUVQQ2tLdmJkUXZuRUNrZ2MNCi1FUERMS3ZiZGF0Ykd4TFRoDQotRG9ETEt2YmROUHhRdk9Hcw0KLURvRExLdmJkeVNuSW1TQ0gNCi1FT2JrS3ZiZHZCRVpUT2VJDQotRG9Damp2YmRhdGFnWGtVSQ0KLURuYmpqdmJkbWJLWFhublYNCi1FT2NMS3ZiZG1iS1hYb051DQotRVBDa0t2YmROc1VXR2R1UQ0KLURuY0xLdmJkcHNzZ1NSanQNCi1FUERMS3ZiZGlVekZYU1ViDQotRU9ia0t2YmR5emVPUmdpSQ0KLUVPY0xLdmJkS0RLRFFpYngNCi1Eb0NqanZiZG1KRHRRdVNCDQotRG5jTEt2YmRhTkthcnVNZw0KLURuYmtLdmJkT0VjdEpKS2QNCi1FT2JqanZiZGtWdm5FQ1h3DQotRU9ia0t2YmRLYUxITWJYcQ0KLURvQ2pqdmJkWXpjRnFpdXkNCi1Eb0NrS3ZiZHZ3TGFXQXZWDQotRVBETEt2YmRuQml3WG9OdQ0KLUVPY0xLdmJkTEJLZ05Cd3ENCi1FUENrS3ZiZENKTEJqaUZqDQotRU9iamp2YmRwdFVHcXJMVQ0KLURvQ2tLdmJkV1hKWVdFRkgNCi1FT2NMS3ZiZE5lRVRoaUxFDQotRVBDamp2YmR0QUhRaEFBcg0KLUVPY0tqdmJkVUd6bWxYVmUNCi1EbmJrS3ZiZHJ5bFBzQklPDQotRVBDamp2YmRJQ0x6RXpBRA0KLUVQREtqdmJkcnBWb0tDdWYNCi1FUENqanZiZFJrWkZ1R2pzDQotRG5iamp2YmR6bm9wZGJreA0KLURvRExLdmJkbWdGWU5OZnkNCi1FT2JqanZiZHB0VUhSckt0DQotRG9Da0t2YmRoZmpEWldKdQ0KLURuY0xLdmJkTEdGZ2JCUlYNCi1FUENqanZiZFpubkllRXlqDQotRG9ES2p2YmRtdHVaamlyRw0KLUVQQ2tLdmJkbWJKdndvT1YNCi1EbmNMS3ZiZEpweWRvRm1lDQotRVBES2p2YmRGeVV0YUVYYg0KLURuYmtLdmJkcUZjZHRXQWgNCi1EbmJqanZiZFdSblhhZU1EDQotRU9jS2p2YmRDSWtCa0pHSw0KLUVPY0tqdmJkSlRaQlNseE0NCi1EbmJqanZiZHppdVBvY3NVDQotRG5iamp2YmRoelVlbFFtZg0KLUVQQ2pqdmJkVWFCcVNwcloNCi1EbmNMS3ZiZHhaZ2VmWGRyDQotRU9iamp2YmRLVnVGZEVnSg0KLUVQQ2pqdmJkQU1neVRXelkNCi1EbmJqanZiZGlISmJ4dWl1DQotRG9ETEt2YmRVdE5UZWt1ag0KLUVQQ2pqdmJkVVFwbnR0Z20NCi1Eb0RMS3ZiZFZBYlJUUlNaDQotRG5jS2p2YmRreHNTVFlnVQ0KLURuYmtLdmJkTWZib21RVWsNCi1Eb0NqanZiZFRBRWlIYk9kDQotRG9Damp2YmRjelpQeFlwYg0KLURuYmtLdmJkVVZrb2pVQlINCi1EbmNLanZiZGRkbnFhdmJqDQotRG9ETEt2YmR4d2hpYXBaaw0KLURvREtqdmJkWmlyaFBmYWYNCi1Eb0RLanZiZFR1a29pdEFxDQotRG9Damp2YmRySkFLRk1uZQ0KLUVPYmtLdmJkWlFtRWhtRlINCi1Eb0NqanZiZEhnSFp5WHhIDQotRG5jTEt2YmROSENwTlB1TA0KLURvQ2tLdmJkZklLdlJtcGcNCi1Eb0NqanZiZE5zVVdIRXRwDQotRG9Damp2YmRwZkRkdFdBaA0KLURvRExLdmJkQmhrQ0tpR0sNCi1FT2JqanZiZHRTcXNZeWRjDQotRVBETEt2YmRRY2NCUHFFUw0KLUVPY0xLdmJkdU1YdmFVQXcNCi1FT2NMS3ZiZFpNUmN0TmttDQotRU9iamp2YmRSYWRGTUl4aw0KLURuY0xLdmJkamhHbEZmT0wNCi1Eb0NqanZiZGh0ekV2cXRiDQotRG5iamp2YmRVdE5VR01XSw0KLUVQQ2pqdmJkYWFXRWZRUVgNCi1EbmNLanZiZHVuc3pwa090DQotRG9ES2p2YmRFSmdqV1lLQQ0KLURvQ2tLdmJkUVltQUdzUmoNCi1Eb0NqanZiZG1vell1anlDDQotRG5ia0t2YmR1Vm5ZS1JUQQ0KLURuYmtLdmJkWnhjak5ibFMNCi1FUERLanZiZHpSUE5JaXdBDQotRU9ia0t2YmR6aXRvcEVTdA0KLUVPYmpqdmJkZklMVnJOcGcNCi1Eb0NqanZiZE5HY1BtUHVMDQotRG5iamp2YmRFWVhsVVVUbA0KLURuYmpqdmJkcmFlbGxIS3kNCi1Eb0RLanZiZFpRbUVobUZSDQotRG9Da0t2YmRabm5JZGVaag0KLURuYmpqdmJkamNNS3BnVkgNCi1FT2JrS3ZiZFRmem5MdnVlDQotRU9jS2p2YmRGa0VyY0lNdQ0KLURuY0tqdmJkR2RLdktCaksNCi1Eb0NqanZiZFZ2aHd2RUZIDQotRVBDa0t2YmRtSkVVUXVTQg0KLURuY0tqdmJkSXNaQlNseE0NCi1EbmJrS3ZiZG1iSnZ4UE51DQotRG9ES2p2YmRUcVJQVlVoTg0KLURvRExLdmJkd3lnZWZYZHINCi1EbmJqanZiZExHR0hiQlJWDQotRG5jTEt2YmRkaWpTVnR6bg0KLUVPYmtLdmJkWm5uSkZGWmoNCi1FT2NLanZiZENUQkNzZlhTDQotRG9ETEt2YmRtdHR6S2pTRw0KLUVPY0tqdmJkeU5zSVhzSWMNCi1FT2NLanZiZGJWQmdYanRJDQotRU9jTEt2YmRHRmpSbkpVUg0KLURuYmtLdmJkWVRNQk10T3gNCi1FUENrS3ZiZE5HY1FNb3VMDQotRG9ES2p2YmRKY0tEUWlieA0KLURvRExLdmJkcnBXT2ljV0cNCi1FT2NLanZiZFJhY2VNSXlMDQotRVBETEt2YmRXV2lZV0RlSA0KLUVQRExLdmJkY3paUVh4cUMNCi1Eb0RLanZiZExCS2dNYXhSDQotRG5iamp2YmRaalNoUUhCZg0KLURvQ2tLdmJkS2FMR2xiWHENCi1EbmJrS3ZiZEdkS3VqQ0pqDQotRU9ia0t2YmRJQmt5ZHpBRA0KLURuYmtLdmJkcVVUZ1NSa1UNCi1FT2NMS3ZiZEJpS2JLaGZLDQotRG9ES2p2YmRWd0l3dkVFZw0KLUVQREtqdmJkSWpFQUtRSEUNCi1Eb0NrS3ZiZEVQQ2tMV2NFDQotRG9ETEt2YmRyRGVKUU51YQ0KLUVPY0xLdmJkTmRkVUloamQNCi1FUENrS3ZiZFlOcUFYdHZVDQotRU9ia0t2YmRVYUNSU3FSeQ0KLUVQQ2pqdmJkcXF0am1qYU4NCi1FUERMS3ZiZGhiT2NGV3BxDQotRG9ES2p2YmRVTHZQQlZuaQ0KLURvREtqdmJkR0dKck9KVHENCi1Eb0NrS3ZiZHFjZUlwTnZCDQotRU9jS2p2YmRkZVBTQ1hDag0KLUVQQ2pqdmJkVlVOVGVrdWoNCi1EbmJqanZiZExHR0hiQXB1DQotRG9Da0t2YmRjVERMVGNpYQ0KLURuYmtLdmJkTnNVV0dlVlENCi1FT2JqanZiZFpMcWNzbWxODQotRU9ia0t2YmR4cm5KTXJDSA0KLURuYmpqdmJkcXZvbENoeHENCi1FUENqanZiZGFOS2JTdU5IDQotRG5ia0t2YmRsWXJyVFlmdA0KLUVQQ2pqdmJkd3RsZHB5TU8NCi1EbmJrS3ZiZE5kZFRoaUtkDQotRVBDa0t2YmRqSmZJSmx3cg0KLUVQQ2pqdmJkSnB6RW9GbWUNCi1EbmJrS3ZiZGlNRWNtdURaDQotRU9jS2p2YmRrVnZtZEJ3dw0KLUVPY0xLdmJkQU1neHJ3WngNCi1FT2JqanZiZGF0Ykd3anRJDQotRU9jS2p2YmRUQUVoaENPZA0KLURuYmpqdmJkZk5Gd0hOSmsNCi1FT2JqanZiZFZCQnFTcHF5DQotRVBDamp2YmR1YUVaU25kaA0KLUVQRExLdmJkcHN0R3Fxa1UNCi1EbmJrS3ZiZEl3dENIbFFwDQotRG5jS2p2YmRyYkdOTUdrWg0KLUVPY0tqdmJkSUxhem5XcUwNCi1Eb0NqanZiZFRYamttemtZDQotRG9Damp2YmRJR2Z5eVh4SA0KLUVPY0tqdmJkaktGaEtOWHINCi1FUERLanZiZFJEY0FwUkVTDQotRU9iamp2YmRtZmR4Tk5meQ0KLUVPYmpqdmJkRGloS1dZS0ENCi1Eb0NqanZiZHphQU9mZmFsDQotRVBETEt2YmRRY2NCUVFjcg0KLUVQQ2pqdmJkVGxXUEF2T2kNCi1EbmJqanZiZHFVVGZyU0xVDQotRU9iamp2YmRWQWJSVFJSeQ0KLURvQ2tLdmJkbkNLV3hQT1YNCi1FT2NLanZiZEZqZHJiaE5WDQotRG5iamp2YmRyekxwVEFoTw0KLURvQ2pqdmJkRHhZTVVVVU0NCi1EbmJqanZiZG1veXh1anlDDQotRG5iamp2YmRVVmtvaXRBcQ0KLUVPYmpqdmJkckVFaHBPV0INCi1EbmNLanZiZFJqeUdWR2pzDQotRG9Da0t2YmRKSmRBS1BnRQ0KLURvREtqdmJkS0RKYnFLQ3gNCi1FUERMS3ZiZGNURExVRGlhDQotRG9Da0t2YmRlUEVzS3Nzcg0KLUVQQ2pqdmJkSmJqQ3FKYngNCi1Eb0RMS3ZiZGRCcm1TQVRtDQotRU9jTEt2YmRsaGNzcVZSYQ0KLUVPY0xLdmJkS2ZHSUNCUlYNCi1FUERMS3ZiZHJvdlBKYnZHDQotRG9Damp2YmRiQXZGR1FRWA0KLUVQRExLdmJkbFpUU1N4ZnQNCi1EbmJqanZiZExxdm1adVF6DQotRG5jTEt2YmRac2hpWWRTbg0KLUVPY0xLdmJkdU1YdmFUYVgNCi1FT2JqanZiZFp0SkpZY3JuDQotRU9jTEt2YmRjelpQd3hwYg0KLUVQREtqdmJkYXRhZndqdEkNCi1FT2JrS3ZiZHNRVm5pY1dHDQotRG5iamp2YmRyV29rY0l5Ug0KLURuY0xLdmJkSnV0ZWNlR2kNCi1FT2NMS3ZiZEFEUndpeWlRDQotRVBES2p2YmRDSWtCamlGag0KLUVQREtqdmJkck5aallrZ2kNCi1EbmJrS3ZiZFNMWWV1SExUDQotRG9ES2p2YmRrTkJrekVmbw0KLURuYmtLdmJkY3l4b3d5UWINCi1FUERLanZiZFlrckVUbk1ODQotRG9ES2p2YmR3V2xBdkF2Vg0KLUVQQ2tLdmJkY3paUHhaUWINCi1FUENrS3ZiZEtDaWJwakN4DQotRU9jS2p2YmRoeXRmTHFPRw0KLURuYmpqdmJkeG1zSHdyaUQNCi1FUERLanZiZG1mZVlNbWdaDQotRG9Da0t2YmROUVhwdk5mcw0KLURuY0xLdmJkaXJ6aVNrSnoNCi1FT2NLanZiZEhmZnpZeFlIDQotRU9jS2p2YmRXWEl4V0RkZw0KLURuY0xLdmJkVnZod3VjZUgNCi1Eb0RMS3ZiZEZ4dHVCRHhDDQotRG5jTEt2YmRKY0tDcUpieA0KLURvQ2tLdmJkeExXY2d6eWYNCi1EbmJqanZiZENKTEJqaUdLDQotRVBDamp2YmRjYXNNckFUbQ0KLURvRExLdmJkTEZmSUNBcVYNCi1FUERLanZiZHFtWmpaTUhpDQotRG5jS2p2YmRjelpQd3hxQw0KLUVPYmtLdmJkcldwTURKWXENCi1FUENqanZiZExGZWhDQlF1DQotRVBDa0t2YmRSekpnc0RXQQ0KLURvREtqdmJkSXNaQXJseE0NCi1EbmNMS3ZiZHFGY2RzdWFJDQotRG5jTEt2YmRVTHZQQlZuaQ0KLUVPY0xLdmJkV1hKWHVjZUgNCi1FUERMS3ZiZGFOTENUVk1nDQotRU9ia0t2YmRVeGhVWmpubg0KLURuY0xLdmJkZUFUcGx4S0cNCi1Eb0NqanZiZG1TWXR6U2NpDQotRU9jTEt2YmRrTWJMekVmbw0KLUVQQ2pqdmJkcnBWb0pjV0cNCi1FUENqanZiZFhybEFsc29ZDQotRG9ETEt2YmRVeGhUektubg0KLUVQQ2pqdmJkT0VkVUpKTEUNCi1FT2JqanZiZEtESmNSS0N4DQotRVBES2p2YmRjeXhwWHhxQw0KLURuYmtLdmJkWnhkS09ETVMNCi1EbmNMS3ZiZGNJbUpqZld4DQotRG5iamp2YmRwZkVGVHVhSQ0KLURuYmtLdmJkWm9OaGVFeWoNCi1FT2NLanZiZGpGS2Z1UEFPDQotRG5ia0t2YmRGVnlRUU5LRg0KLURuYmtLdmJkRGpIaXV3akENCi1FUENrS3ZiZE1nRFBsb3RrDQotRVBES2p2YmR4blNoWHNJYw0KLURvRExLdmJkT1RVVmZkdVENCi1EbmNLanZiZEZlalJuSXNxDQotRG5jS2p2YmRTUVVISmZFWA0KLURuY0xLdmJkUlhPRURNSGMNCi1Eb0NrS3ZiZHNaa29zQWduDQotRG9ES2p2YmRVc21VR0x1ag0KLUVQREtqdmJkaWlmSUptWVMNCi1Eb0RMS3ZiZFpRbUVobUZSDQotRU9iamp2YmRlVUFVQVNsdg0KLURvRExLdmJkVXNsdEZsVmoNCi1Eb0NqanZiZFNpWmpSQUJNDQotRU9jTEt2YmRlZ2tWck9SSA0KLURvREtqdmJkWWxSZFRuTG0NCi1EbmNLanZiZHppdG9wRVN0DQotRG5ia0t2YmRoYlBERXdRcQ0KLURuY0tqdmJkU0t4ZXRnTFQNCi1EbmNLanZiZFpRbUVpTkZSDQotRVBETEt2YmRVeUlUekxQTw0KLURuYmpqdmJkem5wUWRibFkNCi1FT2JrS3ZiZGJMTUZvT0RBDQotRVBETEt2YmRCaGpiTEpGag0KLURvREtqdmJkTndvVnpkT1UNCi1EbmNLanZiZHZCRHhzUEVoDQotRG5ia0t2YmRTQmNlTGlaTA0KLUVQQ2tLdmJkT2hBWHlBWkINCi1FT2JqanZiZFppc0lRR2JHDQotRU9jTEt2YmRBTWd4cnZ5eA0KLUVQREtqdmJkQ0RwQXZLTWYNCi1Eb0RLanZiZHhWTWRweGxPDQotRU9jS2p2YmRKYmljUkpieA0KLURvQ2tLdmJkVHBwbnVWSU4NCi1FT2JqanZiZFpqVElQZmJHDQotRG9Da0t2YmRweU9oSFFjeA0KLURvQ2pqdmJkZkhqdlNPUWcNCi1Eb0NqanZiZHpvUHBkY01ZDQotRVBES2p2YmRtZmVZTk5meQ0KLUVQQ2pqdmJkWEdZelVBUFQNCi1Eb0RMS3ZiZHlwbm1KS1hBDQotRG5ia0t2YmRCc0FjVUZ3Uw0KLURvRExLdmJkUVltQUdzUmoNCi1FT2JqanZiZFV4aFR5am5uDQotRG9Da0t2YmRyb3VvS0N2Rw0KLURvRExLdmJkaHR5ZHdTVWINCi1FUENrS3ZiZGR3eXRVU0Z6DQotRU9jS2p2YmRyYkZtTGdMWg0KLUVPYmtLdmJkYlBmZmNremQNCi1FT2JqanZiZER4WGxUdFVNDQotRG5ia0t2YmRxR0VGVHZBaA0KLUVQQ2pqdmJkRG9Da0t3REUNCi1FT2NMS3ZiZFZ2aVlXRGVIDQotRVBDamp2YmRXU09ZQ0ZMYw0KLURuY0tqdmJkbWJLV3hQTnUNCi1Eb0NrS3ZiZFpzaGh4ZFRPDQotRG9ES2p2YmR3dGxkcVlrbg0KLURvRExLdmJkWVNsQk1zb1kNCi1FUERLanZiZFJrWkZ1SEtzDQotRG5ia0t2YmRlWVpzdFJleg0KLURvQ2pqdmJkck5aaXhsSUoNCi1Eb0NqanZiZG1nRlhsbWdaDQotRVBDa0t2YmRZbFJjc21sTg0KLURvQ2pqdmJkT0ZFVGlKS2QNCi1FUERMS3ZiZEJoa0NMSkZqDQotRVBDamp2YmRtdVZaa0pyRw0KLURuYmtLdmJkRmplVENoTXUNCi1Eb0NqanZiZEpUWkJTbHdsDQotRG5ia0t2YmRvem1kTFlQQQ0KLUVPYmpqdmJkdGJidHZ1b1ANCi1EbmNLanZiZHFVVGZyU0t0DQotRG5jS2p2YmR5VE9JbVNCZw0KLURuYmpqdmJkY1RDa1RkS0INCi1FT2NLanZiZEthS2dOQ1hxDQotRVBES2p2YmRab09JZUV5ag0KLURvREtqdmJkWXFNZUlsZVINCi1EbmNLanZiZG5QelpXTFpDDQotRVBETEt2YmRaaXJoUGZiRw0KLURuYmtLdmJkR1FBVFhHZXkNCi1FT2NLanZiZFpzaUpZY3NPDQotRG5ia0t2YmRyV3BNREpZcQ0KLURvQ2tLdmJkTXVUU0xOQVgNCi1FT2JqanZiZHB4bmhIUkR4DQotRU9jS2p2YmR6aXRwUUVTdA0KLUVQQ2pqdmJkaHVaZVhTVWINCi1Eb0NqanZiZE5lRHRKSWtFDQotRG9Da0t2YmRDRVFCV0tNZg0KLUVQQ2tLdmJkSEVLdktDSmoNCi1FUENqanZiZGF0YkhZTFRoDQotRU9ia0t2YmRMR0dJQ0JSVg0KLURuY0tqdmJkUmp4ZXVHanMNCi1Eb0RLanZiZG5IRllOT0haDQotRU9ia0t2YmRJcnlBc05ZTQ0KLUVPYmpqdmJkbWZkd2xuR3kNCi1FT2NMS3ZiZE5lRHNpSWtFDQotRG5iamp2YmRKVFlhU2x4TQ0KLURvQ2tLdmJkUmFkRWtpWWsNCi1EbmNMS3ZiZGpLRmdqTllTDQotRU9ia0t2YmRaalNoUUdhZg0KLUVPY0tqdmJkS2ZGZ2FhUXUNCi1Eb0RLanZiZGhnSmJ5VmpWDQotRG9Da0t2YmR3dU5GUlpNTw0KLURuY0xLdmJkZmVrek5mZ0ENCi1EbmNLanZiZHVDY1ZXdW5vDQotRVBETEt2YmRWck54QmRrYw0KLURuYmtLdmJkUmtZZXVITFQNCi1Eb0RMS3ZiZHd1TkVweGxPDQotRG9Damp2YmRRY2NBb3FEcg0KLUVPY0tqdmJkVUd6bWt2dkYNCi1EbmNLanZiZEVKaEtXWUtBDQotRU9jTEt2YmRzc1NTeHllRA0KLURvQ2pqdmJkVnZpWHZFRWcNCi1EbmJqanZiZEV1eG9wTktGDQotRU9ia0t2YmRMQWtHbGJYcQ0KLURvQ2tLdmJkWnNpSlpFU24NCi1Eb0NrS3ZiZGhrZUVPVWJ5DQotRG5ia0t2YmRiaGxpa0dYWQ0KLUVPYmtLdmJkTEJMR21DWVINCi1FUENqanZiZHhVbGVReUxuDQotRG5jTEt2YmRyYkdOTUdqeQ0KLURvQ2tLdmJkZGRvU0J3REsNCi1FUERMS3ZiZGt5VFJzWWdVDQotRVBES2p2YmRlaExWcW1xSA0KLUVQRExLdmJkcmJGbU1IS3kNCi1EbmNMS3ZiZG1iSnZ3b09WDQotRU9jTEt2YmRWVU5VRmt2Sw0KLUVQRExLdmJkcnBXUEpidkcNCi1EbmNLanZiZEdBbnB4aXptDQotRU9jS2p2YmR5emVOcWdoaA0KLURvRExLdmJkaGJQREZXcHENCi1Eb0RMS3ZiZGZWenhRSnpzDQotRG9ETEt2YmRVTVdQQlZvSg0KLUVPY0xLdmJkUnBUZmpGZFgNCi1FUENrS3ZiZHBmRGVVV0JJDQotRU9iamp2YmRtdVV5amlyRw0KLUVPYmpqdmJkdGJidHdXT28NCi1FT2JrS3ZiZHJ5bFBzQWduDQotRU9jTEt2YmRtU1l0eXNFSg0KLURuY0tqdmJkU0NEZU1KWWsNCi1Eb0NqanZiZFRwcG9VdGhODQotRVBES2p2YmRWVG1VRmt1ag0KLUVPYmpqdmJkSXNaQXNOWGwNCi1FT2NLanZiZFNCY2RsSllrDQotRG5ia0t2YmRaUWxlSWxlUg0KLURuYmpqdmJkZGRvU0J2Y0sNCi1FT2NMS3ZiZE5IQ29tUHVMDQotRG5jS2p2YmRpQ1BDZHZxUg0KLUVPY0tqdmJkbGlEc3B1U0INCi1FT2JrS3ZiZHpvUHBlQ2t4DQotRG5iamp2YmRjSk1pamV2eA0KLURvREtqdmJkZFp4cFlaUWINCi1Eb0RLanZiZGt5U3JTeGZ0DQotRG9ES2p2YmR5WGhpYXBaaw0KLUVQQ2tLdmJkT0FJcnNpckENCi1FT2JrS3ZiZFVhQnFTcVNaDQotRVBDa0t2YmRadEpJeUVTbg0KLURuYmtLdmJkVHZMb2l0QXENCi1FUENqanZiZHl6ZU5ySUpJDQotRU9jS2p2YmRpQ1BERXdSUg0KLUVQQ2tLdmJkbkNKdndvTnUNCi1FUENrS3ZiZElHZnpaWVhnDQotRG9Da0t2YmRreVNxcnhmdA0KLURvQ2pqdmJkWmR4R3pnaUMNCi1EbmNLanZiZHppdHBQY3NVDQotRG5jTEt2YmRiVkNIWGpzaA0KLUVQQ2tLdmJkbGhjc3FWU0INCi1FUENqanZiZEdZdHVBY3hDDQotRU9jTEt2YmRqQVFHYVFISw0KLUVPYmpqdmJkamxha3pGR28NCi1FT2NMS3ZiZHZ3TUF2QXV1DQotRVBDamp2YmRUcVFvVlVoTg0KLUVQQ2tLdmJkZUVuckJ3Q2oNCi1Eb0NrS3ZiZHNDR01rZ0t5DQotRG5iamp2YmRoa2VEblZEWg0KLUVQQ2pqdmJkT0ZEc2hpTEUNCi1EbmJqanZiZER3d2xVVHNsDQotRVBDa0t2YmRLV1VlZEVnSg0KLUVQRExLdmJkc1FWbmljV0cNCi1FUENrS3ZiZGpnZmxGZk9MDQotRU9ia0t2YmRRWW1BSFRTSw0KLUVPYmtLdmJkU1BzZ0plY3cNCi1FT2JqanZiZGpBUUdhUGdLDQotRG9ETEt2YmREeFhsVVVVTQ0KLURvQ2pqdmJkZWdqdXFuUWcNCi1EbmJrS3ZiZGR3elRzcWV6DQotRG5jS2p2YmR4eEpKYlB5aw0KLUVPY0tqdmJkR0tlVENoTXUNCi1Eb0NrS3ZiZGVGUFNDV2NLDQotRU9ia0t2YmRkZU9yQndESw0KLUVQQ2tLdmJkYU5MQnNVbUgNCi1Eb0RMS3ZiZFJwVGdKZWRYDQotRVBDa0t2YmRreVNyU3hnVQ0KLUVQQ2tLdmJkVlloVHpLb08NCi1FUENqanZiZHh4SWpDUHlrDQotRVBETEt2YmRWck9YYWRrYw0KLUVPY0xLdmJkRU9jS2p3REUNCi1EbmNMS3ZiZG1mZVlNbkd5DQotRVBDa0t2YmRWQWFwcnByWg0KLUVQQ2pqdmJkRldZcFFNakYNCi1Eb0NrS3ZiZHFyVWpta0FtDQotRG9Damp2YmRRdm1kRExoRA0KLUVQRExLdmJkZUFUcU5ZS0cNCi1EbmJrS3ZiZExHR0hhYVF1DQotRU9iamp2YmRlenZaRWh0WA0KLURuYmtLdmJkanV3TmRCd3cNCi1EbmNLanZiZEpUWkFzTXdsDQotRVBES2p2YmRreHJyVFlnVQ0KLUVQREtqdmJkYkF1ZGZRUVgNCi1Eb0NrS3ZiZFZVTlVHTVZqDQotRVBETEt2YmRhTkxCc1VsZw0KLUVQRExLdmJkRHd4THRVVU0NCi1FUENqanZiZE1nQ29scFVrDQotRVBETEt2YmRhb2dHZEx6ZA0KLUVQREtqdmJkekd4bEFORlgNCi1FUENrS3ZiZFVRcU91VWdtDQotRG9ES2p2YmRFUERLa1hDZA0KLUVQREtqdmJkYnNDa1RjaWENCi1FT2JqanZiZFRBRWhoQm5kDQotRVBDa0t2YmRoelZGa3BtZg0KLURuYmtLdmJkYVNGY0h0R0wNCi1Eb0NqanZiZEdCT3B4aXptDQotRG5jTEt2YmRHWXR0YUVZQw0KLURvREtqdmJkcVlvSGZwZFkNCi1FT2NLanZiZHJvdW9LQ3VmDQotRU9jS2p2YmRpQ1BERldxUg0KLURuYmpqdmJkVkFhcHJxUnkNCi1FUENqanZiZGVQRlNqdFVTDQotRG5ia0t2YmRMR0dJQ0JSVg0KLUVQRExLdmJka01hbFplSFANCi1Eb0RMS3ZiZEp1dGZFRkhKDQotRG9ES2p2YmRWQkNSU3FTWg0KLUVPYmpqdmJkdnZsQldCV1YNCi1FT2NMS3ZiZEZWeHBQbUplDQotRG9ETEt2YmRLZkdIYWFSVg0KLURuYmpqdmJkQnZ6ZElkcFcNCi1EbmNLanZiZE5zVVdIRlVwDQotRVBETEt2YmRyU1ZMTmphTg0KLUVQREtqdmJkZ0dNWm5HZ0ENCi1EbmJrS3ZiZFNCY2VNSXlMDQotRU9jTEt2YmRTQmRGTGlZaw0KLUVPY0xLdmJkUnlpZ3JjV0ENCi1FUERLanZiZGFNa0JydU5IDQotRG5jS2p2YmRVYUNSU3BxeQ0KLURuYmpqdmJkSU1Cem12cGsNCi1EbmJrS3ZiZGJWQ0d4S3RJDQotRG5jTEt2YmRsaUR0UXVTQg0KLUVPYmtLdmJkSERrVmpCaksNCi1EbmNLanZiZG1TWXR5cmNpDQotRG5ia0t2YmR4Vk1kcHhsTw0KLUVQQ2pqdmJkUnBUZmpHRHcNCi1FUENrS3ZiZGhhbmNFdnBxDQotRVBETEt2YmROc1R2SEV1UQ0KLURvREtqdmJkZmVreW1mZ0ENCi1FT2JrS3ZiZFVXTG9qVUJSDQotRVBDamp2YmRKWHRCZ2twcA0KLURvQ2pqdmJkRVBDa0xYQ2QNCi1FUENqanZiZFp4Y2pOY0xyDQotRG9Damp2YmRac2lKWWNybg0KLUVQQ2tLdmJkWnRJaVpEcm4NCi1FT2JrS3ZiZHVMeFdhVUJYDQotRU9ia0t2YmRaZHhHemdoYg0KLUVPY0tqdmJka0NsTFJIVkgNCi1FT2NMS3ZiZEZqZHNESU5WDQotRG5jS2p2YmROZUVVSWlLZA0KLUVQQ2tLdmJkWXBtRkpORlINCi1FUERLanZiZGxoY3NwdHFhDQotRG9ETEt2YmRuQ0tXd29PVg0KLUVPYmtLdmJkRG5ia0xYQ2QNCi1FT2JrS3ZiZFF3T0VDa2hEDQotRU9jS2p2YmRVYUNSU3BxeQ0KLUVQQ2pqdmJkQmNvYVZqTkcNCi1EbmJqanZiZHhtcmhYc0pEDQotRU9iamp2YmRjSW1LS2V3WQ0KLURuYmtLdmJkcHlPZ2ZwZFkNCi1EbmJqanZiZHB5T2dnUkR4DQotRU9iamp2YmRFT2NLandERQ0KLURuYmtLdmJkdUNjVXdWb1ANCi1FT2NLanZiZGhnS0N4dWl1DQotRG9ES2p2YmRpWnRlbFFtZg0KLURvREtqdmJkbkJqWFlPblYNCi1FUERMS3ZiZGN6WlB3eHBiDQotRVBDamp2YmRBRFJ3aXpKUQ0KLUVPYmpqdmJkZlZ6d3BKenMNCi1EbmJqanZiZHh4SWlhcFprDQotRVBDamp2YmRqY0xrUWZ1SA0KLUVQQ2pqdmJkY3l5UVlZcUMNCi1Eb0NrS3ZiZEV1eVBwTkplDQotRG5jTEt2YmRjSk5Ka0dXeA0KLURvREtqdmJkWm9PSWRlWmoNCi1Eb0NqanZiZFdIeFZ3Z1l6DQotRG5iamp2YmRlRW9SYldiag0KLURuY0tqdmJkWk1TRHNuTG0NCi1FT2NMS3ZiZGJpTktMRnZ4DQotRG5ia0t2YmRqY0xqcUhWSA0KLURuYmpqdmJkRVlYa3RUdE0NCi1FUENqanZiZENTYUNzZldyDQotRU9jTEt2YmRCZFFBdWltRw0KLUVPYmtLdmJkcWRGSXBPV0INCi1EbmNMS3ZiZGVsZXZnTktMDQotRU9ia0t2YmRaTVJkVU5rbQ0KLUVQQ2tLdmJkckRkaVFPVmENCi1Eb0RMS3ZiZENXemRKRlFXDQotRU9iamp2YmR4VWxlUXlNTw0KLURuY0tqdmJkQnNBY1RmWFMNCi1FT2NLanZiZFJNeEJ4bXR6DQotRU9jS2p2YmRTS3lGdUdrVA0KLUVQQ2tLdmJkRXV4b29sakYNCi1EbmNMS3ZiZFlnV2RBUFNpDQotRG9Da0t2YmRpSEpjWXZLVg0KLUVQQ2tLdmJkWlFsZGlORlINCi1EbmNLanZiZGpBUGdBb2ZqDQotRU9iamp2YmRrVnZtZEJ4WA0KLURvRExLdmJkc0JmTWxITFoNCi1Eb0RMS3ZiZHVXTnhLUXNBDQotRU9iamp2YmRPVFR1Z0V0cA0KLURvQ2pqdmJkSXhVQmdrcVENCi1FT2NLanZiZHFGY2VVV0FoDQotRG5iamp2YmRUa3VuYVZvSg0KLUVQREtqdmJkaVp0ZkxxT0cNCi1Eb0NqanZiZGNJbUprR1hZDQotRG5jTEt2YmRwc3RHclNMVQ0KLURuY0xLdmJkUnBUZmpHRHcNCi1EbmJrS3ZiZHpucFJFYmxZDQotRG5iamp2YmRxZEVob212Qg0KLURuY0xLdmJkSXd0QmhNUlENCi1Eb0RLanZiZGh0ekZXcXRiDQotRU9jS2p2YmRpQm5jRXdRcQ0KLUVQREtqdmJkWlFsZUpNZHENCi1FT2NMS3ZiZExBa0dsYXhSDQotRG9Da0t2YmRac2lJeURzTw0KLUVPYmtLdmJkZU9kc0tzc3INCi1EbmJqanZiZEpjS0NwakRZDQotRVBETEt2YmRTQmRFbEl5TA0KLUVQQ2tLdmJkeU9USHdyaGMNCi1FUERMS3ZiZEdMRXNESU11DQotRVBDamp2YmRtSkVUcVZSYQ0KLURuY0tqdmJkS0RKYnFKYngNCi1FT2NLanZiZGJzQ2tUZEtCDQotRU9jS2p2YmR1REN1WFZubw0KLUVPY0tqdmJkclhQbERJeHENCi1FT2NLanZiZHFseWl4a2hKDQotRU9iamp2YmRSa1lmVWdMVA0KLUVQRExLdmJkTEFrR21DWHENCi1EbmJqanZiZEhnR3pZeFhnDQotRG5jS2p2YmRwc3RIU1NLdA0KLURvQ2tLdmJkcXZvbENpWXENCi1Eb0NrS3ZiZG1nRllOT0haDQotRG5ia0t2YmRxR0RlVHZCSQ0KLURvRExLdmJkeXplTnJIaGgNCi1EbmJrS3ZiZHd6SGVmWGVTDQotRG9ES2p2YmRiaU1qTEdYWQ0KLURuYmtLdmJkVHVsUUtUYVINCi1EbmJqanZiZHNQdW5pY1ZmDQotRG5jS2p2YmRxdnBMY0l5Ug0KLURuY0xLdmJkT0ZFVGhoa0UNCi1FT2NLanZiZFpzaGh4ZFNuDQotRG5jS2p2YmRweVBIZnBkWQ0KLURvRExLdmJkTkdjUG1RVWsNCi1Eb0NrS3ZiZFZnd3ZYZnh6DQotRG9Damp2YmRDZ0xlZ0F6Yw0KLURuYmpqdmJkYXVDR3hMVGgNCi1Eb0RLanZiZHFGY2VUdkJJDQotRG9Damp2YmR1TVlYQXNhWA0KLUVQQ2tLdmJkclNWS21rQW0NCi1FT2JrS3ZiZE9ZT3V6Y25VDQotRG5jS2p2YmRZa3FjdE5sTg0KLURuY0tqdmJkU1pqSHJjV0ENCi1Eb0NqanZiZHJFRkpRTnVhDQotRVBDamp2YmRSb3NmakZjdw0KLUVPYmtLdmJkWm9OaUZFeWoNCi1FUERLanZiZFZnd3ZYZnh6DQotRG9ETEt2YmRoYlBDZHZxUg0KLURuY0tqdmJkcXZva2NJeVINCi1EbmJqanZiZHBzc2ZxcWtVDQotRG5jTEt2YmR6b1BwZGJreA0KLURuYmpqdmJkdWFEeVNvRkkNCi1FT2NLanZiZEVBU0ltWndYDQotRG5jS2p2YmRicmNLdERqQg0KLURvQ2pqdmJkUWNjQlFRZFMNCi1Eb0NrS3ZiZERpZ2pWd2pBDQotRG5ia0t2YmRiVkJmd2tVSQ0KLUVPY0tqdmJkSXNZYVNseE0NCi1Eb0RMS3ZiZEtWdGVkRWdKDQotRVBDamp2YmRJcnlBcmx4TQ0KLURuY0tqdmJkcGVjZVR1YUkNCi1FT2JrS3ZiZFpzaGlZZFNuDQotRG5jTEt2YmRadEloeUVTbg0KLURuYmpqdmJkT1lPdXpjblUNCi1Eb0RLanZiZFV4aFR5am9PDQotRU9iamp2YmRUcHBvVlZIbQ0KLURuY0tqdmJkcldvbENpWXENCi1Eb0RMS3ZiZE5WU3JLbUFYDQotRU9ia0t2YmRpR2ljWldLVg0KLURvREtqdmJkdVZtd2lwc0ENCi1FUENqanZiZE5Qd3FWbkhUDQotRU9iamp2YmRlbGV3R21Kaw0KLUVPY0xLdmJkZ0dMek5nSEENCi1Eb0RLanZiZGNKTkpqZld4DQotRG9Da0t2YmR5T1RId3JpRA0KLUVPYmpqdmJkRXpzcGVMY0oNCi1EbmJqanZiZGpoSExlZW5MDQotRG5jS2p2YmRPU3RXSEZWUQ0KLUVPY0xLdmJkc1psUHNCSG4NCi1FUERMS3ZiZHRjQ3VXdW5vDQotRG5ia0t2YmRVTHVuYVZuaQ0KLUVQREtqdmJkSnFaZG5mTmUNCi1FT2NLanZiZHF3UGtjSXhxDQotRU9iamp2YmRySkFKZU5PZQ0KLURuYmpqdmJkUkVDYVBwZFMNCi1FUENqanZiZHBmRUVzdkJJDQotRVBETEt2YmRJc1pBcm1ZTQ0KLUVQRExLdmJkSllVQ0lMcHANCi1FT2NMS3ZiZFlsU0R0TmxODQotRVBDamp2YmRKWVRiSGtwcA0KLUVQREtqdmJkWXpiZlNKdloNCi1FUENqanZiZFJhY2VNSllrDQotRU9iamp2YmRaaXNIb2ZhZg0KLURuYmtLdmJkUmJFRWxJeUwNCi1FT2NMS3ZiZGlqRmhLTlhyDQotRU9jS2p2YmRSWE5kRE1JRA0KLURuY0xLdmJkYmlOS0xHWFkNCi1Eb0RMS3ZiZGxaU3JTeUhVDQotRU9ia0t2YmRxWlBJSFJEeA0KLURvREtqdmJkblB6WXVqeGINCi1FT2JrS3ZiZG5IRXdsbWZ5DQotRU9ia0t2YmRDV3pkSWVQdg0KLUVPYmtLdmJkcWx5aXlMZ2kNCi1FUENqanZiZGt5U3FyeUhVDQotRU9ia0t2YmRjSW1LS2V2eA0KLURuY0tqdmJkRUFTSk16V3cNCi1EbmNLanZiZFJrWWZVZmtUDQotRVBDamp2YmRxWW9JR3BjeA0KLURuY0tqdmJkR2NrV0tCaksNCi1FUENqanZiZFlUTGFOVU94DQotRVBES2p2YmR3dGxlUlpNTw0KLUVPYmtLdmJkR0ZpcW5KVVINCi1EbmNMS3ZiZGxoZFVSVlJhDQotRU9iamp2YmRxbHpKeGtoSg0KLURuY0xLdmJkRmFQUXlKem0NCi1FUENrS3ZiZHBzc2dSckxVDQotRU9iamp2YmRpQ09jRlhSUg0KLURuY0tqdmJkcVR0R3FyTFUNCi1FUENqanZiZHNDRmxrZ0xaDQotRU9jS2p2YmR1V09YaXFUQQ0KLUVPY0tqdmJka0NsS3FHdUgNCi1FUENqanZiZE1vd3B2T0dzDQotRVBDa0t2YmR4cm1obVJhZw0KLURvQ2pqdmJkaVV6RlhSdUMNCi1FT2NMS3ZiZFVNV1BBdk9pDQotRG9ETEt2YmRtZmR3bG1nWg0KLUVQQ2pqdmJkZWhLdXJOcGcNCi1FT2NMS3ZiZEJzQWNUZXZyDQotRVBDamp2YmRaalRJUGdCZg0KLUVPYmpqdmJkUElBWHlBWkINCi1FUENqanZiZENEb2FWak5HDQotRG5jS2p2YmRycFZuaWNWZg0KLURvREtqdmJkbFpUU1N4Z1UNCi1EbmNLanZiZEdaVlZBZFlDDQotRVBETEt2YmRzQ0dNa2ZqeQ0KLUVQQ2pqdmJkU1BzZmpGZFgNCi1Eb0NqanZiZEpYc2JJTVFwDQotRG5jS2p2YmR6ZVpuemR5cA0KLURuYmtLdmJkbFlzUnNZZnQNCi1EbmNLanZiZGJpTWpMRndZDQotRVBES2p2YmR5T1NoWVNpRA0KLURvQ2tLdmJkT1RUdWZkdVENCi1FUERMS3ZiZFZ3SllWY2RnDQotRG9Da0t2YmRHRmlxbkpUcQ0KLUVPY0xLdmJkVXNsc2VsV0sNCi1FT2JqanZiZGt4c1NTeUhVDQotRU9jTEt2YmR4c05obVNCZw0KLURuYmpqdmJkcXF0a09MQW0NCi1EbmJqanZiZGVGUFJhd0RLDQotRG5ia0t2YmRMWlFpcnp1Rw0KLUVQQ2tLdmJkRldZcFBsaWUNCi1FT2JrS3ZiZHJXcE1DaVlxDQotRU9jS2p2YmRpaWVoS05Ycg0KLUVQREtqdmJkRXZZb3BOSmUNCi1FUENrS3ZiZHhybWhtU0NIDQotRG9Da0t2YmRwdFVIU1JrVQ0KLUVPY0tqdmJkS0NqRFJKY1kNCi1Eb0RMS3ZiZHJNektZa2dpDQotRG9Damp2YmRaTHJEdE5rbQ0KLURvQ2tLdmJkcVluZ2dRY3gNCi1EbmJrS3ZiZHJvdk9pYnZHDQotRG5jS2p2YmRBRFJ3aXpJcA0KLUVPY0xLdmJkWmlzSHBIQ0cNCi1FUENqanZiZFpSTkZJbUZSDQotRVBES2p2YmRWd0l4VmNlSA0KLUVPY0tqdmJkckRlSlFOdWENCi1FUENrS3ZiZEl4VGFnbFFwDQotRG5jS2p2YmRHRmlxbWlVUg0KLUVQQ2pqdmJkVndKWHZFRWcNCi1EbmJrS3ZiZHd1TWVSWk1PDQotRVBDa0t2YmRaUk5GSW1GUg0KLUVQQ2tLdmJkbkhFd2xtZ1oNCi1FUERLanZiZExZcUtTenVHDQotRG9ES2p2YmRac2lKWWRUTw0KLURvRExLdmJkU2h5alJBQWwNCi1Eb0RLanZiZFJhZEZMaVlrDQotRG5ia0t2YmRqYmtqcGdVZw0KLUVPYmtLdmJkVWFCcHNSUnkNCi1FT2NLanZiZGVoS3VxblJIDQotRU9ia0t2YmREd3hNVVRzbA0KLUVPY0tqdmJkcHRVSFNTS3QNCi1FUERLanZiZEhFS3VpYkpqDQotRU9jS2p2YmR4eElqQnBaaw0KLUVPYmtLdmJkZWxld0dtSmsNCi1EbmNMS3ZiZFR2THBLVUFxDQotRVBDamp2YmRHTEVyYmhOVg0KLURuY0xLdmJkZkhqdlJtcUgNCi1EbmJqanZiZGtNYWt5ZUhQDQotRVBES2p2YmRKY0tDcGpEWQ0KLURvQ2tLdmJkUkVDYVBwY3INCi1FT2NMS3ZiZG1nRllNbWdaDQotRU9iamp2YmRaUk1kaU1lUg0KLURvQ2pqdmJkWXpjRnFpdloNCi1Eb0NrS3ZiZGVPZVRLdFRyDQotRVBDa0t2YmRYRnh5dEFQVA0KLURuY0xLdmJkWm5uSkVkeksNCi1EbmNMS3ZiZGh0eWVXclViDQotRU9jS2p2YmRFSmdpdlhqQQ0KLUVQRExLdmJkc3NTVFl5ZUQNCi1FUERMS3ZiZExCTEdtQ1hxDQotRG5ia0t2YmRLZWVnYkFwdQ0KLURvRExLdmJkSllVQmhMcVENCi1FUERLanZiZHdOV0FORGRtDQotRG9Damp2YmRLZkdJQmFSVg0KLURvQ2pqdmJkYmhsakxGd1kNCi1EbmNMS3ZiZG1nRlhtTmdaDQotRG9ES2p2YmRaUk1lSk5GUg0KLURvQ2tLdmJkV2V5WnRBT3MNCi1Eb0NrS3ZiZGJpTktMRnZ4DQotRVBES2p2YmRVc21UZk1Wag0KLUVQQ2tLdmJkaWpGZ2pNd3INCi1EbmJrS3ZiZGJzQ2p0RGlhDQotRG5iamp2YmRaUWxlSk5GUg0KLURvRExLdmJkTlFYcVdOZnMNCi1FT2NMS3ZiZFVMdW5hVm9KDQotRG5jTEt2YmRyRUVocE9WYQ0KLURuY0xLdmJkUnlpZ3NDdkENCi1Eb0NrS3ZiZFZ3SllXRUVnDQotRG5jTEt2YmRqS0dJS013cg0KLUVPYmtLdmJkckVGSXBOdkINCi1Eb0NqanZiZEdMRXNESU5WDQotRU9jTEt2YmRKU3lBcmx4TQ0KLUVQQ2pqdmJkVEpaaXFBQk0NCi1EbmNMS3ZiZENUQWJzZXdTDQotRG5iamp2YmRaalRJUGZhZg0KLUVQQ2pqdmJkYlBmZ0VMemQNCi1EbmJqanZiZExCTEhNYlhxDQotRVBDamp2YmRxaUFLRk1vRg0KLURuYmtLdmJkSUJsWmR6QUQNCi1FUERMS3ZiZHlUTmlOUmFnDQotRG9ETEt2YmRaalNnb2dDRw0KLUVQQ2pqdmJkakFQZ0FvZmoNCi1FUENqanZiZHhtcmd4VEpEDQotRU9iamp2YmRTUHNnS0dFWA0KLUVPYmtLdmJkUlduRGJsSGMNCi1EbmJqanZiZFpRbUZJbUZSDQotRG9Damp2YmRqdXdPRGF3dw0KLUVPY0xLdmJkVnZpWHZFRkgNCi1FUENqanZiZGNJbUprR1hZDQotRVBES2p2YmRWQWJRcnFTWg0KLURvQ2pqdmJkV1dpWHVkRkgNCi1FUERLanZiZGFwR2ZkTHpkDQotRU9ia0t2YmRRd09FRE1JRA0KLUVQQ2pqdmJkS0RLQ3FLQ3gNCi1EbmNLanZiZEp2VWZFRWdKDQotRU9ia0t2YmREb0RMS3ZjRQ0KLUVPY0tqdmJkcXdQa2JoeVINCi1FT2JqanZiZHlUT0pOU0NIDQotRU9ia0t2YmRac2lJeGRUTw0KLURvQ2pqdmJkYVNGYmhUZkwNCi1FT2NLanZiZFVzbHNla3ZLDQotRG9ES2p2YmRlaExXU09SSA0KLUVQQ2tLdmJkQnNCRFRmV3INCi1Eb0NrS3ZiZE1mYnBOUVZMDQotRG9Da0t2YmRlenZaRkpVWA0KLUVPYmpqdmJkSllVQmhNUlENCi1EbmNLanZiZGxoY3NwdHFhDQotRG9Da0t2YmRpWnRmTVFuRw0KLUVPYmtLdmJkWlJNZGhsZVINCi1FUERMS3ZiZGt5U3JTeGdVDQotRG9Da0t2YmRZbFNEc21rbQ0KLURuYmtLdmJka05Ca3pFZm8NCi1FUERMS3ZiZHlZSktDUHpMDQotRU9jS2p2YmRxd1BrYmlaUg0KLURuY0xLdmJkcWRGSlFPV0INCi1Eb0RLanZiZEZ5VXRhRHhDDQotRG5iamp2YmRaeURpbkRNUw0KLUVPY0tqdmJkcXJWS25LYU4NCi1Eb0NqanZiZE1nRFBsb3RrDQotRVBDamp2YmRVVmxQaXRCUg0KLURvRExLdmJkYnNDa1RjakINCi1FUENqanZiZG5HZHdsbkd5DQotRG5ia0t2YmRhcEdmZEx6ZA0KLUVQREtqdmJkZG5kc0t0VHINCi1EbmNMS3ZiZHNyclRaWmVEDQotRU9ia0t2YmRxZEZKUU9XQg0KLURuY0tqdmJkUmFkRkxoeGsNCi1EbmJrS3ZiZGZJTFdTT1JIDQotRG5ia0t2YmRxWk9nZ1FjeA0KLUVQREtqdmJkQ0RwQXVqTWYNCi1FT2JqanZiZHhzT0ltU0JnDQotRG9ES2p2YmRyU1VqbWphTg0KLUVPYmtLdmJkck15allraEoNCi1FT2JrS3ZiZEFOSHlTdnpZDQotRU9ia0t2YmRnR0x5bkdnQQ0KLURvRExLdmJkTmRjc2hpS2QNCi1FT2JqanZiZGVQRXJrVHRTDQotRVBDa0t2YmRTQ0VGTGh4aw0KLURvREtqdmJkSXhVQmhMcVENCi1FUENrS3ZiZFZ2aHhXRGRnDQotRU9jTEt2YmRLZkdIYkJRdQ0KLURvQ2pqdmJkYWpsRm9OY0ENCi1Eb0NrS3ZiZFFkREFvcGRTDQotRG9ES2p2YmRTQmNlTUpaTA0KLURvREtqdmJkT1N0V0dkdHANCi1Eb0NqanZiZEdkTFdLQmlqDQotRG5ia0t2YmR2T3N6cGpudA0KLURuY0xLdmJkVVZsUGpUYVINCi1Eb0RMS3ZiZGxpRHNwdHJCDQotRU9jS2p2YmRaaXNIcEhDRw0KLURvREtqdmJka1Z3T0RheFgNCi1Eb0RMS3ZiZGZWendwSnpzDQotRG5ia0t2YmREaklLV1lLQQ0KLUVPYmtLdmJkckpBSmRtUEYNCi1FT2JqanZiZGVBVHBtWUpmDQotRG5ia0t2YmRRbVlCeU9Veg0KLUVQRExLdmJkeG1yaFhzSkQNCi1FUERMS3ZiZENKTEJqaUdLDQotRG9Da0t2YmRZcG1GSk1lUg0KLURvREtqdmJkWG5SQVh1V1UNCi1Eb0RLanZiZGlNRkRtdGJ5DQotRG5ia0t2YmRkWnlRWVpRYg0KLURuY0xLdmJkWnRJaVlkU24NCi1FT2JqanZiZHdNdkFORGRtDQotRVBETEt2YmRJd3NiSGtxUQ0KLURuY0tqdmJkVVJRbnR0aE4NCi1FT2JrS3ZiZFRxUk90dGdtDQotRVBDamp2YmRUa3ZPYVZuaQ0KLUVPY0xLdmJkZk5Gd0hOS0wNCi1FT2JrS3ZiZGpnZmxGZk9MDQotRU9iamp2YmRVUXFPdVVoTg0KLURuY0xLdmJkZWdqdXJOcUgNCi1FUERMS3ZiZHhVbUVxWk1PDQotRG9ES2p2YmRHY2p2S0JqSw0KLURvREtqdmJkVlRsdEZrdWoNCi1EbmJrS3ZiZExZcUtTenRmDQotRG9ES2p2YmRVeUh0WmtPbg0KLUVQRExLdmJkdkFjeVRPZGgNCi1EbmNLanZiZHFGY2RzdkFoDQotRG5jTEt2YmRyYkZtTUhLeQ0KLUVPY0tqdmJkWWxSZFRuTG0NCi1Eb0NqanZiZEVBU0pNelhYDQotRU9ia0t2YmRNb3hRdk5mcw0KLUVPY0tqdmJkaUhKY1l1alYNCi1EbmJqanZiZHZBY3lUUEVoDQotRG9ETEt2YmRHUUFTd0dmWg0KLUVPYmtLdmJkTW94UlZuSFQNCi1FT2JrS3ZiZGhnSmNZdkp1DQotRG5iamp2YmR1V09YaXBzQQ0KLURvRExLdmJkUWNiYVFRZFMNCi1FT2JrS3ZiZFVzbHRGa3ZLDQotRVBES2p2YmRLeVFpcnp1Rw0KLUVQQ2pqdmJkbUpEdFF1U0INCi1FT2JrS3ZiZFhya2FNc29ZDQotRU9jS2p2YmRyRUZJcE9WYQ0KLUVQREtqdmJkVnFtd2Fka2MNCi1FT2NLanZiZHFZb0lHcUR4DQotRU9ia0t2YmR0YmJ0d1dPbw0KLUVQQ2tLdmJkU0t4ZlVma1QNCi1FUENrS3ZiZG1KRHNxVXJCDQotRG5jS2p2YmRoYW9DZVdwcQ0KLUVPYmpqdmJkRnh1VkFkWUMNCi1FUENrS3ZiZHFGY2RzdkJJDQotRVBETEt2YmRPVFVXR2VWUQ0KLUVQQ2tLdmJkbGhkVVF0ckINCi1Eb0RLanZiZENKTENMSkdLDQotRVBES2p2YmRNZ0NwTW90aw0KLURuYmpqdmJkcmJGbGtnTFoNCi1Eb0RLanZiZHFCSkZBV2hFDQotRVBDamp2YmRweVBIZnFEeA0KLUVPY0tqdmJkVGxWb0JWbmkNCi1FUENqanZiZHJSdGtOa0JODQotRVBDa0t2YmRXV2h3dWNlSA0KLUVQREtqdmJkY0ltS0tld1kNCi1FT2NLanZiZFlTbEJOVG9ZDQotRU9ia0t2YmRaUk1lSWxkcQ0KLUVQRExLdmJkTW94UldOZ1QNCi1FT2JqanZiZE1JYk1ReEFTDQotRVBDamp2YmRRZERCUVFkUw0KLUVPYmtLdmJkZFp5UHd4cUMNCi1FT2NMS3ZiZEFDclhpeWlRDQotRVBETEt2YmRjU2JrVUVKYQ0KLURuY0xLdmJkVGt1bmFXUEoNCi1EbmJqanZiZHZCRVlybmRoDQotRU9iamp2YmRtSWN0UXVSYQ0KLURuY0tqdmJkaVV5ZHZxdGINCi1Eb0NqanZiZGhrZGNuVWJ5DQotRU9jS2p2YmRlUEZUTFRzcg0KLUVPY0xLdmJkaUhKYnh1alYNCi1FT2JqanZiZFpzaUpaRVNuDQotRU9jS2p2YmRweG9IZnFFWQ0KLUVQREtqdmJkRnlVdUJEd2INCi1Eb0RMS3ZiZEJpTEJrSkdLDQotRVBDa0t2YmRsaUR0UXVSYQ0KLURvREtqdmJkaGJPY0V3UXENCi1EbmNMS3ZiZFJvc2dKZkR3DQotRU9iamp2YmRyek1RU2FJTw0KLUVPYmtLdmJkVXNtVGZNVmoNCi1FT2NLanZiZFdYSXhXRUZIDQotRVBDamp2YmRjVENqdERqQg0KLUVPYmtLdmJkYkJWZUdRUHcNCi1FT2NMS3ZiZGFTR0RIdEZrDQotRG9ETEt2YmRxRmRGVVZhSQ0KLUVQQ2tLdmJkeHhJakJvekwNCi1EbmNMS3ZiZE5kZFVJaUxFDQotRU9iamp2YmR1TVlXYVVBdw0KLUVQQ2tLdmJkV1dpWHZEZGcNCi1FT2JqanZiZEpYc2JJTHFRDQotRG5ia0t2YmREbmJqandDZA0KLURuYmtLdmJkeFVsZHFaTU8NCi1Eb0NqanZiZEt5UktTenRmDQotRG5jTEt2YmRMRmVoQmFRdQ0KLUVQRExLdmJkanZYTmRCd3cNCi1FT2NMS3ZiZHVhRVpUUEZJDQotRG9Da0t2YmRmTWV2Zm1LTA0KLUVQQ2tLdmJkcHhvSUdxRVkNCi1FUENrS3ZiZEtXVWVjZGdKDQotRU9ia0t2YmRtYkp3WU9tdQ0KLUVQQ2tLdmJkSXNaQXJtWU0NCi1EbmJqanZiZHhMWERnenlmDQotRG5jTEt2YmRFdllvcE1qRg0KLURuY0xLdmJkbUpFVHFWUmENCi1EbmJrS3ZiZHJvdW9LRFdHDQotRVBETEt2YmRiVkNHd2tUaA0KLURvREtqdmJkWmlyaFBnQ0cNCi1FUERLanZiZFR2TVFLVUFxDQotRG5ia0t2YmRMcldselZReg0KLUVPY0xLdmJkckVFaVBtdWENCi1EbmJqanZiZGN6WlFYeVJDDQotRG5jS2p2YmRuVXR6S2pTRw0KLUVQQ2pqdmJka05DTHpGSFANCi1EbmNLanZiZFp5RUtOYmtyDQotRU9ia0t2YmRKdXVGZEVnSg0KLURuY0xLdmJkdUNidVhXUFANCi1FUENqanZiZHlOcmhYcmlEDQotRG5ia0t2YmRJeFRhZ2xRcA0KLUVQQ2pqdmJkSnZWRmNlSEoNCi1FUENrS3ZiZFZCQnBycVNaDQotRU9jS2p2YmRreHJxc1lnVQ0KLUVQQ2pqdmJkR0xGU2JoTXUNCi1FT2JqanZiZG5QelpXTFliDQotRU9ia0t2YmRqYmxMUkd1SA0KLURvRExLdmJkdWFEeVRQRkkNCi1FUENqanZiZGlpZklKbVhyDQotRU9ia0t2YmRZa3FjdE9NTg0KLUVQQ2tLdmJkZWxmWEhNakwNCi1FUERMS3ZiZGVGT3JDV2JqDQotRU9iamp2YmRlVUFVQVROVw0KLUVQQ2pqdmJkV1JteEJlTUQNCi1Eb0NqanZiZFp4Y2luRE1TDQotRU9jTEt2YmRXUm13YkVsRA0KLURvRExLdmJkcHNzZnJTTFUNCi1EbmNMS3ZiZFFjY0FwUkVTDQotRG9ES2p2YmRHZEt1akJpag0KLURvREtqdmJkWkxxZFRtbE4NCi1Eb0NqanZiZGJpTktMR1hZDQotRG9Damp2YmRWWklUektvTw0KLURvQ2tLdmJkc1B1b0tDdkcNCi1FUERLanZiZE5HYm9tUVZMDQotRG5ia0t2YmRrSUhNR0ZuTA0KLUVQREtqdmJkdlBUenBqb1UNCi1FT2NLanZiZGN6WlB4WlFiDQotRG5jS2p2YmRsaUVVUlVyQg0KLURuYmtLdmJkR1pVdGFEeEMNCi1FUENqanZiZHJNeWpaTGhKDQotRVBDamp2YmRUdWxQalRhUg0KLURvQ2tLdmJkWmVZR3poSkMNCi1EbmNMS3ZiZHd5Z2VmWUVyDQotRG5iamp2YmRlaExWck9RZw0KLURuYmpqdmJkWnhjak5ibFMNCi1Eb0NqanZiZFNMWWV0Z0tzDQotRVBDa0t2YmRWQWJRcnBxeQ0KLUVQQ2pqdmJkdFRTVFpaZGMNCi1EbmJrS3ZiZFNDRUZNSXlMDQotRG9ES2p2YmRyRGVKUG12Qg0KLUVPY0xLdmJkdUREVlhWbm8NCi1Eb0RMS3ZiZFpkeEd6aEliDQotRU9ia0t2YmRoZ0pieHVqVg0KLURuY0xLdmJkbFlzUnNaSFUNCi1Eb0RMS3ZiZGh6VWVsUW1mDQotRU9ia0t2YmRXV2h3dkRlSA0KLUVQQ2pqdmJkamdma2ZGbWsNCi1FT2JrS3ZiZHphQVBIR2FsDQotRG9ETEt2YmRFUERMTFhERQ0KLURvQ2pqdmJkVHVrcEtUYVINCi1FT2NLanZiZGhhb0NlV3BxDQotRVBES2p2YmR3anZkSHp6Rw0KLUVQRExLdmJkSlRaQlROWU0NCi1Eb0RMS3ZiZFJFQ2FQcURyDQotRG5jS2p2YmRqaEdrZkdOaw0KLUVPYmtLdmJkamhHa2ZGbWsNCi1EbmNMS3ZiZHFseWl4a2hKDQotRU9ia0t2YmRqRWtIVW9BTw0KLUVQQ2tLdmJkY2FzTXJBVU4NCi1FT2JqanZiZGh6VWZMcU9HDQotRG9Da0t2YmRFdllvcE5LRg0KLUVQQ2pqdmJkanV3T0RheFgNCi1EbmNMS3ZiZGRpaXJXVXpuDQotRU9ia0t2YmRPU3RWZmR1UQ0KLURuYmpqdmJkeXBubUlqWEENCi1EbmJqanZiZFJXbkVDbEhjDQotRU9jTEt2YmRiaGxqTEZ2eA0KLUVQRExLdmJkSlhzYWdsUlENCi1FT2JrS3ZiZGh6VWZMcU9HDQotRU9ia0t2YmRuUHl4dWp5Qw0KLURvREtqdmJkQmlLYWppRmoNCi1Eb0RLanZiZFpqVEhwSEJmDQotRVBDamp2YmRhU0ZjSVRlaw0KLUVPYmpqdmJkWXpjRnFpdXkNCi1EbmNMS3ZiZHFkRklwTnZCDQotRG9ES2p2YmRMWXFKcnp1Rw0KLURvRExLdmJkVndKWHVjZGcNCi1EbmJqanZiZGhiT2JkdnFSDQotRG9Da0t2YmRDRVFCV0psZg0KLURvRExLdmJkU0NEZGxKWWsNCi1FUERMS3ZiZFp5RUpuQ2tyDQotRG9ES2p2YmR2QWN5VE9lSQ0KLURvREtqdmJka0lITGZGbWsNCi1FUENqanZiZHVhRVlyb0ZJDQotRG5ia0t2YmRqYmxLcGdVZw0KLUVPY0tqdmJkd3lnZWZZRlMNCi1FT2NLanZiZGxpRHNxVXFhDQotRG5iamp2YmRqY01MUkd0Zw0KLUVPYmtLdmJkUmJFRWxKWWsNCi1FUENrS3ZiZHFyVWtOamFODQotRU9jTEt2YmRSb3RHaWZEdw0KLURuYmtLdmJkVXNtVUdMdWoNCi1Eb0NqanZiZGVLSnF2VXpuDQotRVBES2p2YmRRd05kQ2xIYw0KLUVPY0xLdmJkY1NjTFRjakINCi1Eb0NqanZiZHZCRHhyb0VoDQotRG9ETEt2YmRJeFVCZ2xRcA0KLUVQRExLdmJkZlZ6eFFKenMNCi1EbmNMS3ZiZHFsektZbElKDQotRG9ES2p2YmRhTkxDU3VNZw0KLUVPY0tqdmJkd2p3RGd6eWYNCi1FUERLanZiZEl4VGFnbFJRDQotRG9ES2p2YmRWVGx0R0x1ag0KLURvQ2tLdmJkaU1GRU51RFoNCi1FT2NMS3ZiZFp5RUpuRE1TDQotRG5ia0t2YmRpQm9DZVhSUg0KLUVQQ2tLdmJkYmlNaWpld1kNCi1FT2NLanZiZG10dHpMSnFmDQotRG5jS2p2YmRZVExhTXRPeA0KLUVQQ2pqdmJkZklLdXFtcUgNCi1Eb0NqanZiZEJkUUJWak5HDQotRU9ia0t2YmRpZUxHdVBBTw0KLUVQRExLdmJkc1psUVNhSU8NCi1EbmJrS3ZiZEV6dFFlTURKDQotRVBDamp2YmRJakVBSnBIRQ0KLUVPY0xLdmJkZklMV1JtcGcNCi1FUENqanZiZFp5RGluRExyDQotRG5jS2p2YmRMR0dJQmFSVg0KLURuY0xLdmJkbW96WldMWkMNCi1Eb0NrS3ZiZGxaU3JTeGZ0DQotRU9jTEt2YmRGamRyY0lOVg0KLUVPY0tqdmJkUXZuRGJsSGMNCi1Eb0NrS3ZiZHFVVUhScWtVDQotRVBES2p2YmRuQmpXd25tdQ0KLURvQ2pqdmJkWnhjak5ia3INCi1EbmNLanZiZFppc0lRSENHDQotRG9Da0t2YmRKY0pjUkpieA0KLUVQRExLdmJkbGhkVVF0cWENCi1EbmJrS3ZiZHJ6THBTYUhuDQotRG9ES2p2YmR6aXVQcERydA0KLUVQREtqdmJkRVlYbFR0VU0NCi1FT2JrS3ZiZHFkRklwT1ZhDQotRG5jS2p2YmRweG5oSFFkWQ0KLURuYmtLdmJkTGhha3FZQVMNCi1FUENrS3ZiZHJSdGtOa0JODQotRU9ia0t2YmRxclZLbWphTg0KLUVPY0tqdmJkeFVsZHFaTU8NCi1FT2NLanZiZHJiRmxsSEt5DQotRG9Da0t2YmR5U21obHJCZw0KLUVQQ2tLdmJka3hycXNZZ1UNCi1FUENrS3ZiZFpMcWNzbk1ODQotRG5jS2p2YmRGcEFUWEhGeQ0KLUVQRExLdmJkWlJNZGlNZVINCi1FUERMS3ZiZFJOWGJZbXR6DQotRG9Da0t2YmRweVBJR3FFWQ0KLURvRExLdmJkS2FLZm1DWVINCi1FUERMS3ZiZHJ5bFBzQklPDQotRU9iamp2YmRVUXFPdVZIbQ0KLUVQQ2tLdmJkZXp2WkZJdFgNCi1FT2NLanZiZFppcmhRSENHDQotRG9ES2p2YmRlUEZTanNzcg0KLUVPY0tqdmJkQ1RBY1RmWFMNCi1FT2NLanZiZGt4c1JzWWZ0DQotRVBETEt2YmRRd09EY01IYw0KLURvREtqdmJkd3VORlJaTU8NCi1FUENqanZiZEV1eVBvbUtGDQotRG9Da0t2YmRweG5oR3BjeA0KLURuY0tqdmJkaVZaZVdyVWINCi1FT2NLanZiZHJFRWlQbXZCDQotRU9jTEt2YmRaeGRKbkRMcg0KLUVPYmpqdmJkVXROVUZrdksNCi1Eb0RMS3ZiZFpRbUZJbGRxDQotRU9iamp2YmRuQ0p2d25tdQ0KLUVQQ2tLdmJkUldtY2NMZ2MNCi1EbmJrS3ZiZG5VdHlrSnFmDQotRG5ia0t2YmRWQkJxU3BxeQ0KLUVQQ2tLdmJkWm9PSWRkeWoNCi1EbmJrS3ZiZFpRbGRpTkZSDQotRG5jTEt2YmRtUnlWWnNEaQ0KLURvQ2pqdmJkY2FzTXJBVG0NCi1FT2NMS3ZiZHRiYnR2dW5vDQotRG9ETEt2YmRadEpKWWRTbg0KLURuYmtLdmJkR0tlVERIbHUNCi1Eb0NrS3ZiZFpqVEhwR2JHDQotRU9jS2p2YmRIRGp2S0NLSw0KLUVPYmpqdmJkZGRucWJYQ2oNCi1FT2JrS3ZiZGxaVFNUWWdVDQotRVBDamp2YmRxcXRqbWtCTg0KLUVPYmpqdmJkdEFHcUlBQXINCi1FT2JrS3ZiZHJSdGptamFODQotRG5iamp2YmRNUndNeXRweg0KLUVQQ2tLdmJkc1FXUEpidWYNCi1Eb0RLanZiZHFGY2VVV0JJDQotRG9Da0t2YmRuQmpXeFBOdQ0KLURvRExLdmJkaVV6RlhSdUMNCi1FT2JrS3ZiZFFjY0JQcUVTDQotRG5iamp2YmRPRkR0SWlMRQ0KLUVQREtqdmJkWWxSY3NuTU4NCi1EbmNLanZiZEZmSnJOaHNxDQotRG9Da0t2YmRzQ0ZtTUhLeQ0KLUVQRExLdmJkWWtyRVRuTU4NCi1Eb0NqanZiZFlOcUFYdVdVDQotRVBES2p2YmRyb3ZQS0RXRw0KLURvRExLdmJkYktsR09tY0ENCi1Eb0NrS3ZiZE9TdFdIRlZRDQotRU9iamp2YmRoYk9iZVhRcQ0KLUVQQ2pqdmJkZUVuckJ3REsNCi1Eb0RMS3ZiZHJiRm1NR2taDQotRG5jS2p2YmR4WmhHR1lGUw0KLUVQREtqdmJkYnJia1RkS0INCi1FUERLanZiZHJhZWxsR2taDQotRVBDa0t2YmRzc1NUWlplRA0KLUVQREtqdmJkRGpIaXV4S0ENCi1Eb0NqanZiZHpvUHFGRE1ZDQotRVBDamp2YmRsQWxubUFMQQ0KLURvREtqdmJkbXR1WmpqUmYNCi1Eb0RLanZiZEZwQVN2ZmV5DQotRG9Da0t2YmRqbGFreWVHbw0KLURvREtqdmJkeG5TZ3hUSWMNCi1FUENqanZiZHhaaEZmWGVTDQotRVBDa0t2YmRxY2RpUG5WYQ0KLUVPY0xLdmJkbWZlWU1uSFoNCi1Eb0RMS3ZiZHVDYnVXdk9vDQotRG9ES2p2YmRtSWNzcVVxYQ0KLUVQREtqdmJkem9RUWRibFkNCi1Eb0RMS3ZiZFJOWGF5T1V6DQotRG5iamp2YmRySkFLRk5PZQ0KLURuYmpqdmJkWkxyRVVPTU4NCi1FT2NLanZiZHd5Z2VleEVyDQotRVBDa0t2YmRiVkJmd2p0SQ0KLUVPYmtLdmJkS0RLRFJKYngNCi1Eb0NrS3ZiZEdja1dLQmlqDQotRU9jS2p2YmR6alZRUGRTdA0KLUVQRExLdmJkcWx6S1lraEoNCi1EbmJqanZiZGFqa2VubkRBDQotRG9ETEt2YmRSekpnc0N2QQ0KLUVPYmpqdmJkZWhLdXFtcUgNCi1EbmNLanZiZGFqbEZubkRBDQotRG5iamp2YmRqRWtIVW9BTw0KLURvQ2pqdmJkRlZ5UG9tS0YNCi1Eb0NrS3ZiZEpjSmJwakN4DQotRG5ia0t2YmRSYWNlTGlaTA0KLUVQREtqdmJkZUVuckJ3REsNCi1Eb0RMS3ZiZHhLdmRIenlmDQotRG9Da0t2YmRTUHRIS0Zjdw0KLUVPYmtLdmJkamhITUdHT0wNCi1FT2NMS3ZiZEdHSnFuSXRSDQotRG9Damp2YmRuR2R4Tk5nWg0KLURvREtqdmJkYktrZk9tY0ENCi1EbmJqanZiZGVsZXdITktMDQotRVBDa0t2YmRjU2Jqc2RKYQ0KLUVQQ2tLdmJkVEFFaGdiT2QNCi1EbmNMS3ZiZFVzbHNlbFZqDQotRG5iamp2YmRWck9ZQmVNRA0KLUVPYmpqdmJkRXpzcGVNREoNCi1FUENqanZiZGNURExUY2pCDQotRVBETEt2YmRzUHZQSmJ1Zg0KLUVPY0tqdmJkcUdFRlVXQkkNCi1FUERLanZiZFZneFdZR3h6DQotRU9jTEt2YmRTUHRHakdEdw0KLUVPYmtLdmJkR2NrVmliSmoNCi1Eb0RMS3ZiZGVFb1NDV2NLDQotRVBDa0t2YmRRdm1kQ2xJRA0KLURuY0xLdmJkaHl0ZWxST0cNCi1FUENrS3ZiZGVYelR0U0Z6DQotRVBDa0t2YmRyWFFNREl4cQ0KLUVPYmtLdmJkdGxYdmFVQXcNCi1EbmJrS3ZiZGlNRkRtdGNaDQotRVBETEt2YmRKcVplT2ZOZQ0KLUVQRExLdmJkbUlkVVF0ckINCi1Eb0RLanZiZFZUbHRHTHZLDQotRG5jTEt2YmRaUk5FaGxlUg0KLUVQREtqdmJkamxha3lkZm8NCi1EbmJqanZiZEZwQVN2ZmV5DQotRVBDa0t2YmRreVNyVFlmdA0KLUVPY0xLdmJkVlVNdEdNVmoNCi1FUERMS3ZiZG1SeVV5c0RpDQotRVBDa0t2YmRHS2VTY0hsdQ0KLUVPYmpqdmJkY3paUHd5UkMNCi1FUERMS3ZiZFZZaFVaa09uDQotRG5jTEt2YmRKYmlicUtEWQ0KLUVQRExLdmJkZmVrek5mZ0ENCi1FT2JrS3ZiZEtReWRvR09GDQotRU9ia0t2YmRWZ3d2WGZ4eg0KLURuY0xLdmJkUWREQXBRY3INCi1EbmNMS3ZiZEdGalJuSlVSDQotRG5jS2p2YmRqZ2ZsRmVtaw0KLURvREtqdmJkbGhjdFJWU0INCi1EbmNMS3ZiZFpMcWN0T0xtDQotRG5jS2p2YmRmU0F2emxDbw0KLUVQREtqdmJkWlJNZUlsZVINCi1FT2JqanZiZFpSTWVKTWRxDQotRU9jS2p2YmRNdVRTS21BWA0KLURuY0tqdmJkcVluZ2ZwZFkNCi1EbmJrS3ZiZHhybWlNcWJIDQotRU9iamp2YmRiUGdHY2t6ZA0KLURvQ2tLdmJkcHN0R3Fxa1UNCi1EbmNMS3ZiZG1KRHNxVlNCDQotRVBETEt2YmR0dW5ZS1FzQQ0KLUVPYmtLdmJkRG5ia0t3Q2QNCi1FUERMS3ZiZEVYd2tzdFVNDQotRG9ES2p2YmRyUnRrTmtCTg0KLURuY0xLdmJkSXd0Q0lNUXANCi1FUERMS3ZiZFpRbUVobUVxDQotRG5ia0t2YmR4bXJoWVRJYw0KLURvQ2pqdmJkQ1NhRFVHV3INCi1FUENrS3ZiZGF0YWdYa1VJDQotRG5jTEt2YmRFUERLa1djRQ0KLURuY0tqdmJkWmpTaFBnQmYNCi1FUERLanZiZEhEa1ZqQ0pqDQotRG9Damp2YmRzcnJUWXpFYw0KLUVPYmpqdmJkaGxFY25VYnkNCi1EbmJqanZiZGVtRnZmbUtMDQotRU9ia0t2YmRsaGNzcVVxYQ0KLURvQ2tLdmJkWnRJaVlkVE8NCi1FT2JrS3ZiZEVYd2xUc3NsDQotRG9ES2p2YmRoYW9DZHZxUg0KLUVPYmtLdmJkbGlFVVJVckINCi1Eb0RMS3ZiZEVZWGtzdFRsDQotRG5jS2p2YmRGa0VzRElOVg0KLURvREtqdmJkRmtFcmNIbVYNCi1Eb0RMS3ZiZEtDakNwakRZDQotRVBDamp2YmRqSmVnak14Uw0KLURuYmtLdmJkbkNLV3dubXUNCi1EbmJqanZiZHF3UUxiaVlxDQotRG9ETEt2YmRTWmlnc0RXQQ0KLUVPYmpqdmJkdVZuWUtSVEENCi1FT2NLanZiZFRsV09hVm9KDQotRG5iamp2YmRTQ0RlTUpZaw0KLURuYmtLdmJkUXZtZENsSUQNCi1FUENrS3ZiZHppdVFQZFRVDQotRU9jTEt2YmRoZmljWldKdQ0KLUVPY0tqdmJkWkxxZFRta20NCi1Eb0RLanZiZGNJbUtLZXZ4DQotRU9jTEt2YmRHRmlyT0pVUg0KLUVPYmtLdmJkUkVEQXBSRVMNCi1Eb0RLanZiZEhFTFdLQmlqDQotRU9jS2p2YmRyU1ZMTmtCTg0KLUVPY0tqdmJkQmRRQldKbGYNCi1Eb0NqanZiZEZwQVRYSEdaDQotRG5iamp2YmRxWk9oR3BkWQ0KLUVQRExLdmJkQ1NhRFVHV3INCi1Eb0RMS3ZiZHJwV1BKY1dHDQotRG5iamp2YmRac2lKWWRUTw0KLUVQREtqdmJkSnZWR0VGR2kNCi1FUENrS3ZiZG1JY3RSVlNCDQotRG5jS2p2YmRCaUxDS2hmSw0KLURvQ2tLdmJkWmlzSVFHYkcNCi1Eb0NqanZiZHVXTndqUXNBDQotRU9jTEt2YmRpSEtDeVZqVg0KLUVQQ2pqdmJkbFpTclRaR3QNCi1FT2JqanZiZE5QeFJXTmdUDQotRG5jS2p2YmRlQVVSTlhpZg0KLURuY0xLdmJkT1N0V0dlVlENCi1Eb0NqanZiZEp2VWVjZUdpDQotRG9ES2p2YmRYc01CTXNueA0KLUVQREtqdmJkR0xGU2JoTXUNCi1FUERMS3ZiZEV2WlBvbGllDQotRU9jS2p2YmRyUnRqbkxCTg0KLUVQREtqdmJkeU9USHhUSkQNCi1FUERLanZiZG1hald3bm11DQotRVBDamp2YmRyTlpqWkxoSg0KLURuY0tqdmJkYWpsRm9PREENCi1Eb0RLanZiZHJFRklwT1ZhDQotRG5ia0t2YmRwZWRFdFdCSQ0KLURuY0tqdmJkcXdRTUNoeVINCi1EbmJqanZiZG5DS1d3bm5WDQotRG9Damp2YmROVXNSa05BWA0KLUVPY0xLdmJkVUx2UEJXUEoNCi1EbmNMS3ZiZGpsYWxaZGZvDQotRVBES2p2YmRqSmZIak5ZUw0KLURvREtqdmJkUHhtQUhUU0sNCi1EbmJrS3ZiZG1JY3RRdHFhDQotRU9iamp2YmRuSEZYbU5meQ0KLUVQQ2tLdmJkcWx6SnlMaEoNCi1EbmJqanZiZFZxbllDRWxEDQotRVBES2p2YmRxVHNnUnFrVQ0KLUVQQ2pqdmJkQURTWUtaaHANCi1FUERMS3ZiZEV2WlBvbGpGDQotRG9Da0t2YmRMRmZJQ0JSVg0KLUVPY0xLdmJkWlJORkpORlINCi1FUERLanZiZHBlZEZVV0JJDQotRVBES2p2YmRWd0pZVmNlSA0KLURvQ2pqdmJkR1l0dUJEd2INCi1Eb0NqanZiZFZZZ3Raam9PDQotRG5jS2p2YmRRY2NBcFFjcg0KLUVPY0xLdmJkV1dpWVdEZGcNCi1EbmNLanZiZHlUT0pOU0JnDQotRG5iamp2YmRiQXVlRnBRWA0KLURuYmtLdmJkaVV5ZHdTVWINCi1Eb0RLanZiZEtWdGZEZUhKDQotRG9ES2p2YmRFT2Jqa1hDZA0KLUVPY0tqdmJkcWx5allsSGkNCi1FT2NLanZiZGZSYVd6bENvDQotRU9iamp2YmRSV21jYmxJRA0KLURvRExLdmJkQ0RwQXZLTWYNCi1EbmNMS3ZiZG11VlpqalNHDQotRVBETEt2YmRrYU1ubUFMQQ0KLUVQQ2tLdmJkY1Nia1RkS0INCi1EbmJqanZiZFp0Skl5RVNuDQotRVBDa0t2YmRRdm1jY01IYw0KLURuY0xLdmJkZkhqdlJtcGcNCi1Eb0NqanZiZFZ2aHd2RUVnDQotRVBDamp2YmRYcmthTlRueA0KLURuYmtLdmJkR0Zpck5pVVINCi1FT2JrS3ZiZFpMckRzbkxtDQotRU9ia0t2YmR5U25KTlJiSA0KLURuY0tqdmJkYU1rQnNVbUgNCi1FUENrS3ZiZHFHRUZVV0JJDQotRU9iamp2YmRtYWpYWU9uVg0KLURuYmtLdmJkSEVMV0tCaksNCi1FUERLanZiZFdTT1lDRkxjDQotRG5jTEt2YmRlaEt1ck5xSA0KLUVQRExLdmJkU1pqSVNjV0ENCi1EbmNLanZiZFpRbGRpTkVxDQotRG5jTEt2YmRWd0l3dkVFZw0KLURuYmpqdmJkYXVDR3hLc2gNCi1EbmJrS3ZiZEtlZkhiQXB1DQotRG9Da0t2YmRzc1NUWXllRA0KLURuYmpqdmJkU1BzZ0pmRVgNCi1Eb0NrS3ZiZGVLS1J2VXpuDQotRG9ETEt2YmRpTUVjblZDeQ0KLURvRExLdmJkb0FLenNnY24NCi1Eb0RLanZiZERvREtqdmJkDQotRG5jS2p2YmRGV1lvcE1pZQ0KLUVQRExLdmJkUk5YYXhtdHoNCi1FT2NMS3ZiZEtlZkhhYVJWDQotRVBES2p2YmRlckF2emtibw0KLUVPYmpqdmJkem9RUkVjTVkNCi1EbmJrS3ZiZGlqRmdqTXdyDQotRU9iamp2YmRoYk9iZHZxUg0KLUVQQ2tLdmJkeVNtaU1xYkgNCi1FT2JrS3ZiZHl6ZU9TSUloDQotRG5ia0t2YmRqY0xrUkhVZw0KLURvRExLdmJkSnB5ZG9HTmUNCi1Eb0RLanZiZHdYTUJXQldWDQotRU9ia0t2YmRzQmZNa2dLeQ0KLURuYmtLdmJkWWtxZFRuTU4NCi1FUENqanZiZEVQRExMV2JkDQotRU9ia0t2YmREd3hMdFVVTQ0KLURuY0tqdmJkTnJ0VmdGVXANCi1FUERLanZiZFpRbGVKTkZSDQotRVBES2p2YmRKS0VBS1BmZA0KLURuYmpqdmJkaGdLQ3h2SnUNCi1FT2JrS3ZiZExBa0hNYlhxDQotRVBES2p2YmRoYW5jRXZxUg0KLURvQ2pqdmJkTnNVV0hFdVENCi1EbmJrS3ZiZFpqVEhvZmFmDQotRVBDamp2YmRyRGRpUU9WYQ0KLUVQREtqdmJka01iTHpFZ1ANCi1FUENrS3ZiZFpvT0pGRXlqDQotRVBDa0t2YmRBRFJ4SnlocA0KLUVPYmpqdmJkYVNHQ2dzZkwNCi1EbmJqanZiZEpiakRRaWJ4DQotRVBDamp2YmRwZkVFdFdCSQ0KLUVPY0xLdmJkWnhkSm1ibFMNCi1FUENrS3ZiZFJwVGdLR0VYDQotRG9Damp2YmR6UlBOSWl3QQ0KLUVPYmtLdmJkem9QcGVDbFkNCi1FT2JqanZiZGVGT3JCd0RLDQotRG9Da0t2YmRPVFR2SEV0cA0KLURuYmpqdmJkR1FBVFdnRnkNCi1FUENqanZiZEV2WlFRTkplDQotRU9ia0t2YmRqdlduRUNZWA0KLURvRExLdmJkeVRPSWxxYWcNCi1EbmJrS3ZiZEVBU0pOWnZ3DQotRU9jS2p2YmRzWmtvc0JIbg0KLURvRExLdmJkdFNxc1l5ZUQNCi1EbmNLanZiZHFseWl4a2dpDQotRVBDamp2YmRUcHBudVZIbQ0KLURuY0tqdmJkYXRiSFlLc2gNCi1Eb0NrS3ZiZHVWbXdqUXNBDQotRVBDa0t2YmR2QWN4c09lSQ0KLUVPYmtLdmJkUmp5RnVITFQNCi1FT2JqanZiZFR1a29pdEFxDQotRU9jTEt2YmRreVNxcnhmdA0KLUVPYmpqdmJkUWNjQlBwZFMNCi1Eb0RLanZiZGZmTHpOZmdBDQotRG9ES2p2YmRpQ09jRXZxUg0KLURuY0tqdmJkSUJrekV6QUQNCi1FT2JqanZiZFZaSHN5am9PDQotRU9jTEt2YmRab05oZUV6Sw0KLURuYmtLdmJkc1prcFRBaE8NCi1EbmJqanZiZHFGZEV0VmFJDQotRG5ia0t2YmRJR2Z6Wlh3Zw0KLUVQRExLdmJkbHJaVlpzRUoNCi1FT2JqanZiZEJjcEF2Sm1HDQotRG5iamp2YmR0U3FzWXpGRA0KLUVQRExLdmJkSkpkQUpvZ0UNCi1EbmNLanZiZHhWTWRweU1PDQotRVBDamp2YmRRd09FRExoRA0KLURvQ2pqdmJkbWdGWG1OZ1oNCi1Eb0RMS3ZiZGpFa0d1UEFPDQotRVBDamp2YmRBQ3JYalppUQ0KLURvQ2pqdmJkWk1SZFRtbE4NCi1EbmNMS3ZiZGlMZURuVkRaDQotRU9iamp2YmRWQWFwcnBxeQ0KLURvRExLdmJkUmp5RnVHanMNCi1EbmJqanZiZFZBYlFycHJaDQotRU9ia0t2YmRTWmpIcmNXQQ0KLUVQREtqdmJkVnJPWUJlTUQNCi1FUERMS3ZiZER3eE1VVHNsDQotRVBES2p2YmRSYWRFbEl4aw0KLURuYmpqdmJkbW96WldLeUMNCi1Eb0RMS3ZiZHB0VGdSckt0DQotRVBDamp2YmRhdGFnWGtVSQ0KLURuY0xLdmJkWkxxY3NuTU4NCi1Eb0RMS3ZiZGZORndHbUprDQotRU9ia0t2YmRxVHNmclNLdA0KLURuY0xLdmJkWmpUSHBHYkcNCi1Eb0NqanZiZHVXTndpcHNBDQotRVBES2p2YmRhdUNHd2tUaA0KLURuY0xLdmJkS1Z1R0VGR2kNCi1FT2JqanZiZFppcmhQZmFmDQotRG9ES2p2YmR4S3ZjZ3p5Zg0KLURuYmtLdmJkeHNOaGxyQ0gNCi1Eb0NrS3ZiZEJzQkRVR1dyDQotRG5jS2p2YmRmTWZYSE5Kaw0KLURuYmpqdmJkT1NzdWdGVlENCi1EbmNLanZiZFppc0lQZmFmDQotRG5iamp2YmRaSFhFQU9zSg0KLURuYmpqdmJkTFpSSnJ6dUcNCi1FT2JrS3ZiZHd1TkZReGxPDQotRG5jS2p2YmRkeFp0VVJleg0KLUVQQ2tLdmJkeHJtaU5TQ0gNCi1Eb0RLanZiZGlVeWR3U1ZDDQotRU9iamp2YmRpaWZJSmx3cg0KLURuY0xLdmJkc3NTU3h5ZUQNCi1FUERLanZiZE9FY3NpSkxFDQotRU9jS2p2YmR5U25JbHJCZw0KLUVQQ2tLdmJkZFp5UVlaUkMNCi1EbmJqanZiZFdYSlh1ZEVnDQotRG9ETEt2YmRLYUxITkNYcQ0KLURvREtqdmJkR0dLUm1pVHENCi1EbmJrS3ZiZGxyWXR5cmRKDQotRVBES2p2YmRodHpFdnJWQw0KLUVPYmtLdmJkZFp5UVlZcUMNCi1Eb0RMS3ZiZGhhb0Nkd1JSDQotRVBDa0t2YmR4TFdkSHp5Zg0KLURvREtqdmJkeVNtaG1SYkgNCi1EbmJrS3ZiZFpMcWNzbWxODQotRU9iamp2YmRadEpJeGRUTw0KLURvREtqdmJkRHd3a3Nzc2wNCi1FUERLanZiZEZ5VlZBZFhiDQotRG9Da0t2YmRVdE5VRmt2Sw0KLUVQRExLdmJkeG1zSVhzSWMNCi1FUERMS3ZiZFVzbVVGa3VqDQotRU9jS2p2YmRHS2RzREhsdQ0KLUVPY0tqdmJkQUNxd2paaVENCi1FUERLanZiZEZwQVN3SEdaDQotRG9Da0t2YmRHWlV0YUR4Qw0KLURuY0tqdmJkbVNaVlpzRUoNCi1Eb0NqanZiZEpiaWNSS0N4DQotRG5jTEt2YmRUdk1RSnNhUg0KLURvQ2pqdmJkTmVEdEpKS2QNCi1FUENqanZiZG5Qell2S3hiDQotRG9ETEt2YmR5VE5obHJDSA0KLUVQREtqdmJkUm9zZ0plY3cNCi1FT2JrS3ZiZFRBRWlJQ09kDQotRU9jS2p2YmRhcEhIRGt6ZA0KLURvQ2tLdmJkamxha3pGR28NCi1EbmNMS3ZiZHJwV1BKYnVmDQotRG5iamp2YmROUVhxVm5IVA0KLUVPY0xLdmJka05DTHpGSFANCi1FT2JqanZiZFR1a3BLVGFSDQotRU9jTEt2YmRFdXhwUGxpZQ0KLUVQQ2tLdmJkSnV1RmRGSEoNCi1FUERLanZiZEdHSnFtaVRxDQotRG5iamp2YmRPQUlydEpyQQ0KLURuYmpqdmJkZWxmV2dOS0wNCi1FT2JrS3ZiZGhiT2NFd1JSDQotRG5jTEt2YmRxaUFLRk5QRg0KLURuY0tqdmJkVnFuWUNGTUQNCi1Eb0RMS3ZiZFdIeFdYZ1l6DQotRU9jTEt2YmROVlRTS21BWA0KLUVQREtqdmJkdWFEeVNuZGgNCi1EbmJrS3ZiZGlpZklKbHhTDQotRVBES2p2YmRlQVRwbVlKZg0KLURuY0xLdmJkdUNjVld1b1ANCi1FUENqanZiZGhmaWNZdkp1DQotRG5jS2p2YmRlaExWcW5RZw0KLUVQQ2tLdmJkckRlSlBtdWENCi1Eb0NqanZiZFRmem1sV3VlDQotRG5jS2p2YmRab05pRkV5ag0KLURvRExLdmJkeG1zSHhTaUQNCi1FT2JrS3ZiZFZ3SllWZEZIDQotRVBDamp2YmR1TVh3QlVCWA0KLURuYmtLdmJkVHFST3VWSU4NCi1FUENqanZiZEdLZVRDZ2x1DQotRVBETEt2YmRjeXlQd3hwYg0KLUVQRExLdmJkUW1YYXlPVXoNCi1FUERMS3ZiZFp5RGluQ2tyDQotRVBETEt2YmRab05oZUV5ag0KLURuY0xLdmJkbWZkeE1uR3kNCi1EbmJrS3ZiZGtDbExSR3VIDQotRG5jTEt2YmRKWHNiSU1RcA0KLURuYmpqdmJkakplZ2lseFMNCi1Eb0NrS3ZiZG5QeXh1a1pDDQotRVBES2p2YmRaTVJjc25MbQ0KLURvQ2tLdmJkSGZmell4WUgNCi1EbmJrS3ZiZGJzRExUY2pCDQotRG9ETEt2YmRTd2psTnpqeA0KLURuY0tqdmJka2FNbm1BTEENCi1EbmNMS3ZiZHFtWmpaTGhKDQotRG9ES2p2YmRxclVrTmtCTg0KLURuY0xLdmJkbWZlWG1PR3kNCi1FUENqanZiZFpNUmRUbWxODQotRG5ia0t2YmR5cG5saGpYQQ0KLUVQRExLdmJkeU9USHhUSkQNCi1FT2JqanZiZE1Sd016VlF6DQotRVBDamp2YmRTQ0RlTUl4aw0KLUVPYmpqdmJkT1hudXpkT1UNCi1FUERLanZiZE9TdFdIRlZRDQotRG9ETEt2YmRyekxwVEFnbg0KLURuYmtLdmJkVUx1b0F2UEoNCi1FUERLanZiZFp4ZEtPRE1TDQotRU9jS2p2YmRiQXZFZlBwWA0KLURuY0tqdmJkeU9TZ3dyaUQNCi1FUERMS3ZiZHJKQUpkbVBGDQotRVBETEt2YmRhdUNHeEt0SQ0KLURuY0xLdmJkcXJWTE9MQW0NCi1FUERLanZiZGtIZ0xmRm1rDQotRG5jS2p2YmRVYUNSU3FTWg0KLURuYmtLdmJkYlFHZ0VMemQNCi1FT2NLanZiZGNKTWlqZlhZDQotRVBDa0t2YmRlT2VUTFVUcg0KLUVPY0tqdmJkUW1ZQnlOdHoNCi1FUERMS3ZiZEZ4dVZCRHdiDQotRU9jS2p2YmRHR0pyTmlVUg0KLURvREtqdmJkZG5kc0xUdFMNCi1FT2NMS3ZiZGRaeVB4WXFDDQotRVBDa0t2YmRTS3hmVkhMVA0KLUVPY0tqdmJkU0NEZGtpWWsNCi1EbmJqanZiZHR2TndqUXNBDQotRU9jS2p2YmRKWHNiSUxxUQ0KLUVPYmpqdmJkamNMa1JIVkgNCi1FT2JqanZiZGtDa2tRZ1VnDQotRG9Damp2YmRUcVFudHRnbQ0KLUVQQ2tLdmJkRXV5UG9sakYNCi1Eb0NrS3ZiZFRxUW51VWdtDQotRG9ETEt2YmRMcldselZReg0KLUVQQ2pqdmJkUmp5R1ZHa1QNCi1Eb0RMS3ZiZEhFS3ZLQmpLDQotRG9Damp2YmRuQ0p2eE9uVg0KLUVPYmtLdmJkcHRVR3JSa1UNCi1FUERLanZiZFF3TmNibElEDQotRG9Damp2YmRJaWRBS1BnRQ0KLURvQ2pqdmJkVFlMTU56a1kNCi1EbmJqanZiZEV6dFJGTUNpDQotRU9ia0t2YmRCaGtDTEpHSw0KLUVQRExLdmJkWmlzSHBHYkcNCi1FUERMS3ZiZGRlUFJiWERLDQotRU9ia0t2YmRVUXBudHVJTg0KLUVPYmpqdmJkRVBDamp2Y0UNCi1EbmNLanZiZGJpTkpqZXdZDQotRVBETEt2YmRWck9ZQ0VsRA0KLUVQQ2tLdmJkU0JkRWxJeUwNCi1Eb0RMS3ZiZHpqVlFRRVRVDQotRG9Damp2YmRDRHBBdktORw0KLUVPYmtLdmJkTkhDb21QdUwNCi1FT2NLanZiZEdkS3ZKYWlqDQotRG5ia0t2YmRxbVpqWWtnaQ0KLURuY0tqdmJkUXZuRUNsSUQNCi1EbmNMS3ZiZFdXaVh1ZEZIDQotRG9ETEt2YmRDRVFCV0psZg0KLURuY0tqdmJkTXBYcVdPR3MNCi1FUERLanZiZFZCQ1JTcVJ5DQotRVBETEt2YmRxVVRnU1JqdA0KLUVPY0xLdmJkSlh0Q0hrcVENCi1FT2JrS3ZiZEJpTEJrSkZqDQotRU9jTEt2YmRWdmh3dkVFZw0KLUVPY0tqdmJkQ1RCQ3Nld1MNCi1FT2NLanZiZHlOc0h3cmlEDQotRG9ES2p2YmR3ekhmRnhFcg0KLURuYmpqdmJkeXBvTWlKd0ENCi1Eb0NqanZiZEpiaWNRakN4DQotRU9jTEt2YmRWVU1zZWt1ag0KLUVPY0tqdmJkQ0VRQldKbGYNCi1FT2JqanZiZElqRUFLUUdkDQotRG9Damp2YmREaklKdlhqQQ0KLURvRExLdmJkRnlVdUFkWUMNCi1EbmNMS3ZiZFJvdEdpZWRYDQotRG9Damp2YmRCaGtCamhlag0KLUVPY0tqdmJkQmhrQ0toZksNCi1FUENrS3ZiZExGZkhiQlJWDQotRG9Da0t2YmROVXJyTE5BWA0KLUVPY0tqdmJkWm9PSWVFeksNCi1FUENqanZiZGtNYk1aZUhQDQotRG9Damp2YmRrVndOZEJ4WA0KLUVQQ2tLdmJkTmRkVGhpS2QNCi1EbmJqanZiZGpjTGtRZnRnDQotRG5ia0t2YmRGa0VyY0htVg0KLURuYmpqdmJkcUdFRXRXQWgNCi1EbmNLanZiZG1TWXVac0VKDQotRG9Damp2YmRVc21UZk1XSw0KLURvQ2tLdmJkVlVNdEZrdksNCi1FT2NLanZiZEtmR0lDQlJWDQotRG5ia0t2YmRNU1dselVweg0KLUVPY0xLdmJkVkJCcHJwcXkNCi1FUENqanZiZG5IRXdtTmdaDQotRG9Da0t2YmRlRW9SYXdESw0KLURuYmtLdmJkcHNzZ1NTTFUNCi1EbmNLanZiZE9Tc3VnRlVwDQotRG5ia0t2YmR3ekhmR1lGUw0KLURvQ2pqdmJkVEFFaUhiUEUNCi1FT2JrS3ZiZEthTEdtQ1hxDQotRG5ia0t2YmRDV3pjaUZRVw0KLURuY0xLdmJkblZWWmppcWYNCi1FUENqanZiZE9TdFdIRXRwDQotRG9ES2p2YmRrSUdrZkZtaw0KLURvREtqdmJkWmpUSVBmYkcNCi1FT2NLanZiZFhzTUFsc254DQotRG5iamp2YmRJTGF6bXdSTA0KLUVPY0tqdmJkckRkaVBtdkINCi1FUERLanZiZGlVekV3UnVDDQotRU9jS2p2YmRxQWhlQVhIZA0KLUVQQ2pqdmJkUnlpZ3NDdkENCi1Eb0NqanZiZHB5T2dnUWN4DQotRVBDa0t2YmRaeURqTmJsUw0KLURuY0xLdmJkRmVqU05pVHENCi1FUERLanZiZHpSUE5JalhBDQotRG5jTEt2YmRhTWtCc1ZNZw0KLUVPYmtLdmJkTFlxSnJ6dUcNCi1EbmNLanZiZHNCZk5NSExaDQotRVBES2p2YmRqZ2ZsRmZPTA0KLURvREtqdmJkQ1RBY1VHV3INCi1EbmJqanZiZFNMWkdWR2tUDQotRG9Da0t2YmRaUW1FaGxkcQ0KLUVQREtqdmJkVXNtVGZNV0sNCi1Eb0NqanZiZEtlZklDQlJWDQotRVBDamp2YmRaTVNEc25NTg0KLUVPYmtLdmJkd3pJR0dYZHINCi1FT2JqanZiZHJSdGpuTEFtDQotRVBES2p2YmRYcmxBbVRueA0KLUVQQ2pqdmJkWnRKSlpFVE8NCi1EbmJqanZiZGllTEd0b0FPDQotRG5ia0t2YmRuQ0p2eFBPVg0KLUVQREtqdmJkaktGZ2pOWVMNCi1Eb0NrS3ZiZGxoY3NwdVJhDQotRVBES2p2YmRiQXZFZlFQdw0KLUVPY0xLdmJkaUdqRFl1aXUNCi1EbmNLanZiZG5RWnh2TFpDDQotRG9ETEt2YmRhb2dIRGt6ZA0KLURuYmpqdmJkTWZjUU1vdUwNCi1EbmNLanZiZEthS2dNYllSDQotRG5jS2p2YmRyYkdOTUhLeQ0KLURvQ2tLdmJkZG9GU2p0VVMNCi1FUERMS3ZiZE5kZFRpSWpkDQotRVBES2p2YmRoZ0tEWlZpdQ0KLUVQRExLdmJka01iTHpFZm8NCi1Eb0RLanZiZGptQ01aZGZvDQotRG9ES2p2YmRTQ0RlTGh5TA0KLURvQ2tLdmJkUXdPRGNNSUQNCi1EbmJrS3ZiZGdHTHltZ0hBDQotRVBES2p2YmRXSVlWd2Z4eg0KLURuYmtLdmJkWkxxZFVOa20NCi1Eb0NrS3ZiZFlsU0VUbWttDQotRG5ia0t2YmRMcXZseXVReg0KLURuYmtLdmJkWlJNZGlNZHENCi1FT2NMS3ZiZGRlUFNDWENqDQotRVBETEt2YmRSYWNka2lZaw0KLURuYmpqdmJkWmlzSVFHYkcNCi1FT2JqanZiZHJwVm5pYnZHDQotRG5jTEt2YmRJeFVDSGxSUQ0KLUVQQ2tLdmJkaHVaZVhSdGINCi1EbmJqanZiZFF3T0RibElEDQotRG9ES2p2YmRlenV5RWhzdw0KLURuY0tqdmJkaUxkZE50Y1oNCi1FUENrS3ZiZGlMZUVOdGJ5DQotRG5iamp2YmR4S3ZjZ3p6Rw0KLUVQRExLdmJkUlhOZENsSUQNCi1EbmNMS3ZiZEVLSGpWd2pBDQotRU9jTEt2YmR6b1BxRkNreA0KLURvRExLdmJkbGlFVVJVcWENCi1Eb0NqanZiZHlPVElZVEpEDQotRG5jTEt2YmRJSEd5eVh3Zw0KLUVQQ2pqdmJkU2h5alJBQk0NCi1Eb0NrS3ZiZG5QeXlXTFliDQotRU9iamp2YmRzUHZQSmNWZg0KLUVQREtqdmJkVFhqbE56angNCi1Eb0RLanZiZGRuZVRMVVVTDQotRU9jS2p2YmRtdVV5amlxZg0KLURuY0tqdmJkWm9PSWRkeksNCi1Eb0NqanZiZHB5T2hHcUVZDQotRG9Da0t2YmR3andEZ3p5Zg0KLURuYmtLdmJkeFpnZWV4RXINCi1FT2NMS3ZiZEhEanZLQ0tLDQotRG9Da0t2YmRweG5oSFFkWQ0KLURvRExLdmJkTHJXbHpVcHoNCi1FUERLanZiZGF0YkhYa1RoDQotRG9ETEt2YmRaeURpbkRMcg0KLUVQQ2pqdmJkR0dKcW5KVHENCi1Eb0RLanZiZGRuZVRMVHNyDQotRG5jTEt2YmR5emRtcWhKSQ0KLUVPYmtLdmJkUmp4ZlZHa1QNCi1FUERLanZiZE9BSlRUaXJBDQotRVBDamp2YmRab05pRkV6Sw0KLURuYmpqdmJkT2hBWHlBWWENCi1EbmJqanZiZEFDcXdpeklwDQotRG9ETEt2YmRjSW1KamV2eA0KLUVQRExLdmJkeG1yaFlUSWMNCi1Eb0RMS3ZiZGpjTGtSR3VIDQotRVBDa0t2YmR4Vk5FcHhsTw0KLUVQQ2tLdmJkS0NpYnFKYngNCi1Eb0NrS3ZiZGpKZklLTXhTDQotRG9ETEt2YmRWWWhVWmpvTw0KLUVQRExLdmJkckpBS0VtUEYNCi1FT2NMS3ZiZFJEYmFRUkRyDQotRG9Da0t2YmR1V09YaXFUQQ0KLURvQ2pqdmJkWnlEak5jTHINCi1FT2JqanZiZGJCV0Vlb293DQotRVBETEt2YmRVUXBudHRnbQ0KLUVPY0tqdmJkbEJOT21BTEENCi1EbmJqanZiZFNQc2ZpZWN3DQotRG5iamp2YmR3eklHR1lGUw0KLUVPY0tqdmJkTEdGZ2FhUlYNCi1FT2NLanZiZHJYUUxjSllxDQotRG5ia0t2YmRtYktYWVBPVg0KLURvQ2tLdmJkWmlzSG9nQ0cNCi1FUENrS3ZiZEZWeVBwTWpGDQotRU9jS2p2YmRZa3JEc21rbQ0KLURvREtqdmJkeFVtRXFZbE8NCi1FUERLanZiZEtOQUVaZ1VhDQotRG9ETEt2YmRxWlBJR3BjeA0KLURvQ2pqdmJkTWdDb21QdGsNCi1FT2JqanZiZFV5SHN6S29PDQotRG9Da0t2YmRlRW5xYXZjSw0KLUVQREtqdmJkcVlvSUdxRVkNCi1Eb0RMS3ZiZENEb2FXSm1HDQotRVBETEt2YmRsWlNyVFpIVQ0KLUVQQ2tLdmJkWnhjaW5ETVMNCi1Eb0NrS3ZiZGdGa3pOZmdBDQotRU9jS2p2YmRZTnFBWHR2VQ0KLUVPYmpqdmJkd3lnZWZZRXINCi1FUENrS3ZiZGJCVmRmUVFYDQotRG5ia0t2YmRxclZMT0xBbQ0KLUVPY0tqdmJkRmplVERJTlYNCi1EbmJqanZiZG5IRllNbkd5DQotRVBDamp2YmRyYkZsbEhLeQ0KLUVQQ2pqdmJkWkxyRHRPTU4NCi1FUERMS3ZiZGNKTktLZld4DQotRG9Damp2YmRyYWVtTUhMWg0KLURvREtqdmJkZUpqU1dVem4NCi1FUENrS3ZiZFpubWlFZHlqDQotRG5iamp2YmR3dGxlUXhsTw0KLURuYmtLdmJkRHd3bFVUdE0NCi1Eb0RLanZiZHJXcE1ESlpSDQotRU9jS2p2YmRlZ2tWck9SSA0KLUVQQ2tLdmJkaUNPY0ZXcVINCi1EbmJrS3ZiZEJzQkRUZXZyDQotRG9Damp2YmRqY0xqcGZ1SA0KLURuYmpqdmJkWnhkS09ETHINCi1Eb0NqanZiZHFjZUlwT1ZhDQotRG9ETEt2YmRWdmh4VmNlSA0KLUVPYmtLdmJkc3JxcnlaZGMNCi1EbmJrS3ZiZE1TV2x5dHB6DQotRG9ETEt2YmRxVHNmcXJLdA0KLUVQQ2pqdmJkaktHSUtOWVMNCi1FT2NMS3ZiZGlHaWJ4dktWDQotRVBDamp2YmRLREtDcGlieA0KLUVQREtqdmJkUWREQlBxRHINCi1EbmNLanZiZG96bWRMWVBBDQotRG9Da0t2YmRUdkxvalVBcQ0KLURuYmtLdmJkYmhtS0xGd1kNCi1FUERLanZiZENJamJMSWVqDQotRG5jS2p2YmRrSGZrZWVuTA0KLURvREtqdmJkdEFHcUlBQlMNCi1FUENqanZiZFJvc2ZqRmRYDQotRU9jS2p2YmRyYWVtTGdMWg0KLURuYmtLdmJkeG1yZ3hUSWMNCi1Eb0NrS3ZiZE9BSlN0SnJBDQotRVBDamp2YmRxWW5nZnBkWQ0KLUVQRExLdmJkQnZ6ZEpFb3YNCi1Eb0RLanZiZHJEZUlwT1dCDQotRU9iamp2YmRxVVRmclNLdA0KLUVPY0tqdmJkeG5TaFhzSWMNCi1Eb0RLanZiZEV6c3FGTGNKDQotRU9iamp2YmREeFlNVVVVTQ0KLUVPY0tqdmJkaktGaEtOWVMNCi1FT2NLanZiZGpnZmxHRm1rDQotRG9Da0t2YmRHR0tSbkl0Ug0KLUVQQ2tLdmJkUkVEQXBSRHINCi1FT2NMS3ZiZE5RWVJXT0hUDQotRVBDamp2YmR4bXJnd3JpRA0KLURuY0xLdmJkYnNDanNkSmENCi1FT2NLanZiZHlwb05JaXdBDQotRG5jS2p2YmRab09KRkV5ag0KLURvQ2pqdmJkcmJHTWtnS3kNCi1FUERLanZiZHlUTmlOU0JnDQotRG9Damp2YmRjelpQd3lRYg0KLURvREtqdmJkV2ZaWnRBT3MNCi1FUERLanZiZHpub3FGQ2xZDQotRG5jS2p2YmRUbFZvQlZvSg0KLUVQQ2tLdmJkSXhVQmhNUlENCi1Eb0NrS3ZiZFpRbUVpTkVxDQotRG9ES2p2YmRuVlV5a0tSZg0KLURuYmpqdmJkVXRNdEZsV0sNCi1FT2JqanZiZE9UVVZmZVVwDQotRG9Damp2YmRaTVNFVU9NTg0KLURvQ2pqdmJkd2p3RGd6ekcNCi1Eb0RLanZiZFlxTkVpTkZSDQotRG9ETEt2YmRxaUFLRW1PZQ0KLUVQRExLdmJkZk5HWEhOSmsNCi1EbmJqanZiZENFUUJWak1mDQotRU9ia0t2YmRxVVVHclJqdA0KLURuYmtLdmJkam1DTHllSFANCi1EbmJqanZiZGNKTWlrRndZDQotRVBDamp2YmRqdXdOZEJ4WA0KLURvQ2tLdmJkZXFhV3prYm8NCi1EbmNLanZiZFRrdk9hVm9KDQotRG9ES2p2YmRab09JZUV6Sw0KLURvRExLdmJkS0RLRFJLRFkNCi1EbmNMS3ZiZHF3UU1ESllxDQotRU9ia0t2YmRLZWVnYkJSVg0KLUVQREtqdmJkZWdqdXFuUkgNCi1Eb0RLanZiZHh3aGpCcFprDQotRU9iamp2YmR6aXVRUGRTdA0KLUVQQ2pqdmJkWnlFS09Da3INCi1FUENqanZiZFJXbWRDa2hEDQotRU9jTEt2YmRRY2JhUVJFUw0KLURuY0xLdmJkSXJ4YVROWU0NCi1EbmJqanZiZEdGaXFtaVRxDQotRG9Damp2YmRaZVhmemdoYg0KLURvQ2pqdmJkU0xaRnVHa1QNCi1FUERLanZiZElyeUJTbVlNDQotRU9jTEt2YmRSeWpIc0N2QQ0KLUVQREtqdmJkem9QcUZDa3gNCi1FUERMS3ZiZEZlaXJPSXNxDQotRU9ia0t2YmRMaUJrcHhBUw0KLURvQ2pqdmJkbXVVeWppckcNCi1FT2NLanZiZHBmRGVUdWFJDQotRG5jTEt2YmR0U3FzWXllRA0KLUVPY0xLdmJkQU1oWXJ3WngNCi1FT2NLanZiZEpTeUFzTllNDQotRG5jTEt2YmRkbmVUTFRzcg0KLUVQRExLdmJkQU5JWXNXeXgNCi1FT2JrS3ZiZFJYT0RibEhjDQotRG9Da0t2YmRZemNHUmpXWg0KLURvRExLdmJka0hnTGZGbkwNCi1Eb0NrS3ZiZHB5UElHcUR4DQotRU9ia0t2YmR3dU5FcHhrbg0KLURvRExLdmJkSlN4YVROWU0NCi1Eb0RMS3ZiZFJOWGJaT1V6DQotRG5iamp2YmROSERQbHBVaw0KLUVPYmpqdmJkS1F6RlBGbkYNCi1FT2NLanZiZHdrV2RIenpHDQotRU9ia0t2YmRpQ1BDZHZwcQ0KLUVQQ2tLdmJkd3pIZkZ3ZHINCi1Eb0RMS3ZiZHd1TWVReGtuDQotRG9ETEt2YmRtb3l4dWp5Qw0KLURuY0xLdmJkeVlKS0JveWsNCi1FT2NLanZiZGhnSmJ4dWpWDQotRU9jS2p2YmR2QWN5U25kaA0KLUVQQ2pqdmJkT1lQVnpjbXQNCi1EbmNLanZiZGVyQld6bENvDQotRG5jTEt2YmRFdXhvb2xpZQ0KLURvRExLdmJkVXNtVGVsVmoNCi1Eb0NrS3ZiZGNJbUtLZlhZDQotRVBDa0t2YmRLREpjUkpjWQ0KLURvRExLdmJkZklMV1NPUWcNCi1Eb0RMS3ZiZHRjRFZXdW5vDQotRG9ES2p2YmRlZ2p2U05wZw0KLURuY0tqdmJkanZYT0VCeFgNCi1EbmNLanZiZHZPc3pwam9VDQotRU9jTEt2YmRrSUdrZkZuTA0KLUVQREtqdmJkWnhjaW5Da3INCi1FT2NLanZiZE54UFZ6Y25VDQotRG5ia0t2YmROcnN2SEV0cA0KLURuYmpqdmJkd3lnZWZYZVMNCi1FT2JrS3ZiZG5IRXdtT0d5DQotRU9ia0t2YmRaUk5GSWxlUg0KLURvQ2pqdmJkTkhDb2xvdGsNCi1FUERLanZiZFRrdW9CVm5pDQotRU9ia0t2YmRrSGdMZkdOaw0KLURvQ2tLdmJkVnZoeFdFRWcNCi1FT2NMS3ZiZHRiY1ZXdk9vDQotRG9ES2p2YmRVTHZPYVdPaQ0KLUVPYmtLdmJkTmRjc2lKTEUNCi1Eb0RMS3ZiZE9ZUFZ6ZE50DQotRG9Da0t2YmROZURzaUpMRQ0KLUVPY0xLdmJkWEdZeXRBT3MNCi1FT2NLanZiZGNJbGpMR1d4DQotRG9ES2p2YmRJTUJ6bXdRaw0KLUVQREtqdmJkYnJjS3NjakINCi1Eb0NqanZiZHFkRWhwT1dCDQotRG5iamp2YmR6b1BxRkNsWQ0KLURuYmpqdmJkS0RLQ3FKY1kNCi1FUERMS3ZiZFpSTkVobGRxDQotRG5jTEt2YmRkWnlRWHlSQw0KLURuY0xLdmJkUnpLSHJjV0ENCi1FT2JrS3ZiZFRBRklnYlBFDQotRU9iamp2YmR3dG1GUllrbg0KLURvRExLdmJkQ1RBYnRGd1MNCi1FT2JqanZiZEp6cEZ3ZEFODQotRG9Damp2YmRDVEFic2V2cg0KLUVPYmpqdmJkeXpkbXJJSWgNCi1EbmJrS3ZiZEFOSVpUWFp4DQotRVBDa0t2YmRWd0pYdkRlSA0KLURuY0tqdmJkbWZkd2xuSFoNCi1Eb0NqanZiZFppcmhQZmFmDQotRVBDa0t2YmRpSEpjWXZKdQ0KLURuYmpqdmJkUk14Q1ltdHoNCi1FUERMS3ZiZFpIV2RBUFNpDQotRG5iamp2YmRXU054QmRrYw0KLURvREtqdmJkTnhQVnpkTnQNCi1FT2JqanZiZGRlUFJhd0RLDQotRG5jS2p2YmRhU0dDZ3RHTA0KLURuY0tqdmJkZG9GU2pzdFMNCi1EbmJqanZiZE9GRVRpSkxFDQotRG9ETEt2YmRlQVVRbVlKZg0KLUVPYmpqdmJkWnNoaVpFU24NCi1FUENqanZiZFZ3SXd2RUZIDQotRG5ia0t2YmRLREtEUWpEWQ0KLUVQRExLdmJkUmJFRk1KWkwNCi1Eb0RLanZiZGladUdMcG5HDQotRG9Damp2YmRxR0VFdFdBaA0KLURuYmpqdmJkbkJpd1lQTnUNCi1EbmJqanZiZHRsWHdCVGFYDQotRG9Damp2YmRxWW9IZnFFWQ0KLUVQQ2tLdmJkSXNaQXJtWGwNCi1Eb0RMS3ZiZG1mZVlOTmdaDQotRG9Da0t2YmRyYWZOTGdLeQ0KLURuYmtLdmJkWWZ3RUFPc0oNCi1Eb0RMS3ZiZHJFRklvbldCDQotRVBDamp2YmRSWE9EY01JRA0KLUVQQ2pqdmJkWmlzSVBmYkcNCi1EbmNLanZiZG9BS3pzaEVPDQotRU9jTEt2YmROUVhxVm1mcw0KLURuYmtLdmJkZG9Fc0tzc3INCi1FUERLanZiZE5lRVRpSkxFDQotRVBDa0t2YmRWZ3d2WGZ4eg0KLUVPY0tqdmJkSXNaQlROWGwNCi1FT2JrS3ZiZEZlaXJPSlVSDQotRVBDamp2YmRWQWJSU3BxeQ0KLURuYmpqdmJkZVh5c3NxZXoNCi1FUERMS3ZiZFpHd0VBT3JpDQotRG9Da0t2YmRWQWFxU3FSeQ0KLURvRExLdmJkaVZaZVdyVkMNCi1FUERLanZiZEdZdVVhRHdiDQotRG5jTEt2YmRMclhNeXVReg0KLUVQREtqdmJkR1pVdGFFWGINCi1FT2NMS3ZiZHpvUVJGREx4DQotRVBDa0t2YmRUQUZKSUNPZA0KLUVQREtqdmJkTlB4UlZtZnMNCi1Eb0NqanZiZGF1QmZ4S3NoDQotRG5jTEt2YmRNSWJMcHhBUw0KLURvQ2tLdmJkbWdFd21OZnkNCi1Eb0RMS3ZiZGhhbmJkdnFSDQotRG9Da0t2YmRTTFlmVWZqcw0KLURvQ2pqdmJkVHZNUUpzYVINCi1EbmJrS3ZiZGxoY3NwdVJhDQotRG5iamp2YmRKU3lCU2x4TQ0KLUVQQ2pqdmJkU0xaRnVITFQNCi1Eb0NrS3ZiZFlUTGFOVVBZDQotRU9iamp2YmRGZWlxbkpVUg0KLUVQREtqdmJkWWxSY3ROa20NCi1FT2NLanZiZEhEanZKYWlqDQotRG5ia0t2YmRuQ0p2d25uVg0KLURvQ2pqdmJkTkhEUGxvdUwNCi1EbmNMS3ZiZFdYSXhXRGRnDQotRG9Da0t2YmRKU3lBc013bA0KLUVPYmtLdmJkeG1yaFhyaUQNCi1EbmJrS3ZiZEp6cEdZRUFODQotRU9jTEt2YmRkZG5xYXdESw0KLUVPY0xLdmJkaHl1RmtwbkcNCi1EbmJrS3ZiZHRBSFFoQUJTDQotRG9Damp2YmRqaEdsRmVtaw0KLURuY0xLdmJkakplaEptWHINCi1FUERMS3ZiZEhmZnl5WHdnDQotRG9Da0t2YmRSYkVGTGlaTA0KLURvQ2pqdmJkZGVQU0J3Q2oNCi1FUERLanZiZGVPZVRLdFVTDQotRG5iamp2YmRyRGVJb212Qg0KLURuYmpqdmJkVlpJVVpqb08NCi1FUERLanZiZHhtc0lZVEljDQotRVBDamp2YmREbmJrTFhERQ0KLURuYmtLdmJkWWxTRHRObE4NCi1FT2JrS3ZiZGVGUFNCdmJqDQotRVBDa0t2YmRrRE1LcGdVZw0KLURvQ2tLdmJkYktsR1BPREENCi1FT2JqanZiZEdkTFZqQ0tLDQotRVBDa0t2YmRrQ2tqcUd1SA0KLUVPY0xLdmJkcVluZ2ZwY3gNCi1FUERMS3ZiZGVLSnF2VXpuDQotRG9Da0t2YmRrSUhNR0dPTA0KLURuY0tqdmJkRG9ES2tYREUNCi1FUENrS3ZiZHNDR05NSExaDQotRU9jS2p2YmR5emVOcWhKSQ0KLURuYmpqdmJkcXdRTGJoeHENCi1FT2JqanZiZGFhV0VlcFB3DQotRU9iamp2YmREeFhrdFVUbA0KLURuYmpqdmJkZHd6VHRSZXoNCi1EbmJqanZiZEtReWVPZk5lDQotRVBES2p2YmRiQlZkZXBQdw0KLURuY0xLdmJkZlNBdnprYm8NCi1Eb0RLanZiZHFZb0lIUWN4DQotRG9Da0t2YmRlRW5yQndDag0KLURuY0tqdmJkZWhMVnFuUkgNCi1FUERMS3ZiZGhmakRZdWl1DQotRVBDa0t2YmR2bVdBTkVFbQ0KLUVQQ2tLdmJkWlJORWlORlINCi1FT2NMS3ZiZENTYUN0R1hTDQotRG9ES2p2YmRiaGxqS2V2eA0KLURvREtqdmJkYkJWZGVwUVgNCi1EbmNMS3ZiZHFUc2ZyU0t0DQotRVBES2p2YmRqRWpnVlBBTw0KLURvQ2pqdmJkRmVpcW1pVHENCi1FT2JqanZiZGNJbUprR1hZDQotRU9iamp2YmRKYmpDcUpjWQ0KLURuYmtLdmJkamNManBmdGcNCi1FUERMS3ZiZFdYSllXRUVnDQotRG9ES2p2YmR6bnBSRWJreA0KLUVPYmpqdmJkZklMVnFtcUgNCi1EbmJrS3ZiZHh3aUtDUVprDQotRVBETEt2YmRPRWRVSklqZA0KLURuYmtLdmJkc0NGbUxnS3kNCi1EbmNLanZiZGlqRmhLTXhTDQotRVBDamp2YmR6aXRwUURydA0KLUVQQ2tLdmJkWlFsZUltRXENCi1Eb0RLanZiZFp4ZEtOY0xyDQotRG5jS2p2YmRHZExWakNLSw0KLUVPY0tqdmJkaHpVZkxwbkcNCi1EbmNMS3ZiZHd6SGZHWUVyDQotRU9iamp2YmRFT2JqanZjRQ0KLUVPY0xLdmJkZkhrVnFtcGcNCi1EbmJqanZiZFhuUkFYdVZ0DQotRU9jTEt2YmRlRk9yQndESw0KLUVQQ2pqdmJkeml0b29jc1UNCi1FUERLanZiZFp4ZEptYmxTDQotRU9iamp2YmRGamVTY0hsdQ0KLURvREtqdmJkamhHa2ZGbWsNCi1FT2NMS3ZiZHVERFZYV1BQDQotRVBETEt2YmRKWVVDSGtwcA0KLUVQQ2tLdmJka0NsS3BnVkgNCi1FT2JrS3ZiZEpjS0NxSmJ4DQotRG5jS2p2YmRFWHdsVVRzbA0KLUVPYmtLdmJkeHdpSmJQekwNCi1EbmNMS3ZiZEhEanVqQ0tLDQotRG5ia0t2YmRFdXlRUU1pZQ0KLUVQQ2tLdmJkVWFCcHNSU1oNCi1FUENrS3ZiZGRvRlRLc3RTDQotRVBDamp2YmR1YUVZc09lSQ0KLURvRExLdmJkY1RES3NjakINCi1EbmNMS3ZiZE5kY3NoaUtkDQotRG5iamp2YmRXU09ZQ0VrYw0KLUVPY0tqdmJkWm5taUVkeksNCi1FUERLanZiZFVRcG50dGdtDQotRG9Damp2YmRuR2R3bU9HeQ0KLURvQ2tLdmJkWnlEak5ibFMNCi1FT2NLanZiZFNoeWpSQUFsDQotRG5jS2p2YmRUa3ZPYVdQSg0KLURvREtqdmJkT0Vjc2lKS2QNCi1EbmNLanZiZGJWQmZ4S3RJDQotRVBDa0t2YmRyYWZOTGZqeQ0KLURvREtqdmJkdWFFWlRPZUkNCi1EbmNMS3ZiZEdHS1NOaHRSDQotRVBDamp2YmRuQmpXeE9tdQ0KLUVPYmtLdmJkS2VmSUNCUlYNCi1EbmNLanZiZFpvTmhlRlpqDQotRG5ia0t2YmRFT2NLa1diZA0KLUVQREtqdmJkTkdjUG1RVWsNCi1FT2JrS3ZiZGFNamJTdGxnDQotRG5ia0t2YmRKWVRiSU1SUQ0KLURuY0xLdmJkSlhzYWhMcHANCi1EbmNLanZiZGRlT3JCdmJqDQotRG9ETEt2YmRKU3lBc013bA0KLUVQQ2tLdmJkWmR3ZnpoSkMNCi1Eb0NqanZiZHVERFZXdW5vDQotRG5iamp2YmRFenRRZGtiaQ0KLUVPY0xLdmJkVXlIc3lrT24NCi1FT2JqanZiZERqSGl2WUtBDQotRG9ETEt2YmRuVXR6TEtTRw0KLURuY0xLdmJkU0xaRnVHa1QNCi1Eb0RLanZiZGxZcnJUWkd0DQotRU9jTEt2YmRxVVVHcXJLdA0KLUVQRExLdmJkRVBDamp2Y0UNCi1FUERLanZiZGR4WnRUckZ6DQotRU9ia0t2YmRsWXJxcnhnVQ0KLURvQ2pqdmJkYXVDR3dqdEkNCi1EbmJqanZiZFFaTkFIVFJqDQotRG9ES2p2YmRNb3hSVm1mcw0KLURuY0xLdmJkT1RUdkdlVXANCi1EbmNLanZiZGNKTktLZXdZDQotRG9ES2p2YmRtdVZaampTRw0KLUVQREtqdmJkVVdMcEtVQXENCi1FT2NMS3ZiZFNMWkdWR2pzDQotRU9iamp2YmRDSWpha0pHSw0KLUVQRExLdmJkWm5taGRkeWoNCi1FT2NLanZiZExCS2dNYXhSDQotRU9jTEt2YmREakhqVndqQQ0KLURuYmtLdmJkWWxSY3NuTG0NCi1Eb0NqanZiZHJSdUtuS2FODQotRVBDa0t2YmRwdFVIU1NMVQ0KLURuY0xLdmJkWXBtRWlORlINCi1FT2JrS3ZiZE1JYWxReEFTDQotRG5iamp2YmRKdXRlY2VISg0KLURuY0xLdmJkRldZcFBsaWUNCi1FUENrS3ZiZG1nRllNbWdaDQotRG9Damp2YmRtYkp2eE9uVg0KLURuY0tqdmJkSUdmelpZWGcNCi1FUERMS3ZiZHFUdEdxckxVDQotRVBDamp2YmRXUm13YkVsRA0KLUVQRExLdmJkR0xFcmNJTXUNCi1FUERMS3ZiZHd5Z2VmWUVyDQotRVBES2p2YmRyU1VrT0xCTg0KLURvQ2tLdmJkTlFZUXVtZnMNCi1Eb0NrS3ZiZFJqeUdWR2pzDQotRVBES2p2YmRtYWpYWG9PVg0KLURuY0tqdmJkSUdnWnh3d2cNCi1EbmJrS3ZiZHh3aUphcFprDQotRG9ES2p2YmRZcU1kaGxlUg0KLUVPY0xLdmJkWnRKSXhkU24NCi1FUERMS3ZiZFRJektSQUJNDQotRVBES2p2YmRDRVBhV0psZg0KLUVPY0xLdmJkamdmbEZmT0wNCi1FUENqanZiZFpqU2hRR2JHDQotRG9ETEt2YmRIRGp2SmJLSw0KLUVPY0xLdmJkQmlLYkxJZksNCi1EbmNMS3ZiZGlISmJ4dWpWDQotRU9ia0t2YmRLZWVoQmFRdQ0KLUVQRExLdmJkWVNsQk1zbngNCi1FT2JrS3ZiZG1KRHNwdHJCDQotRG9ES2p2YmRUa3VvQXZQSg0KLUVQREtqdmJkWnlFSm5ETHINCi1FUENrS3ZiZFpvTmhkZHlqDQotRVBES2p2YmRWWkhzeWtPbg0KLURuYmtLdmJkakplZ2pOWVMNCi1Eb0RMS3ZiZHRjQ3R3Vm5vDQotRU9jS2p2YmRrSUhMZWZPTA0KLUVPY0tqdmJkWWtxZFRuTG0NCi1EbmJrS3ZiZGladUdNUW1mDQotRG9Damp2YmRaTHJEc25MbQ0KLURvQ2pqdmJkRHd3a3RUc2wNCi1FT2JqanZiZFJ6S0hyYnZBDQotRG9ES2p2YmRRbHdheG5Veg0KLUVPYmtLdmJkeVRPSW1SYWcNCi1FUENqanZiZFFtWUJ5T1V6DQotRU9iamp2YmRicmJrVURqQg0KLURvRExLdmJkR1l0dUFjd2INCi1EbmNMS3ZiZGVQRlNqc3NyDQotRG9ES2p2YmRSYkRkbEl4aw0KLURvREtqdmJkd3pJR0dYZVMNCi1FUENqanZiZE9UVVZnRXVRDQotRVBDa0t2YmRlbUdXZm1Kaw0KLUVPY0xLdmJkWlFtRWhtRXENCi1Eb0NqanZiZFpSTWVKTkZSDQotRG9Damp2YmR2QkVaU29FaA0KLURuY0xLdmJkaGxGRG5WRFoNCi1Eb0NqanZiZEpKZEFLUGZkDQotRU9iamp2YmR5WUpLQ1Faaw0KLUVPYmpqdmJkUnpLSVRDdkENCi1FUENqanZiZFVNVm5hV1BKDQotRG9Damp2YmROZGRUaGhqZA0KLUVPY0tqdmJkTlB3cHZPSFQNCi1EbmJqanZiZFppc0hwSENHDQotRU9ia0t2YmRHTEZTY0lOVg0KLUVPY0xLdmJkYnNETFRkSmENCi1FT2JqanZiZGJobGlqZld4DQotRG9ETEt2YmRWWkhzekxQTw0KLUVPYmpqdmJkWm5uSkZFeWoNCi1Eb0RLanZiZGVPZVNrVHRTDQotRG9ETEt2YmRrQ2tqcGdVZw0KLUVQQ2pqdmJkRmVqUm5KVVINCi1Eb0NqanZiZFpzaUl5RHJuDQotRG9ETEt2YmR0dW5ZSnFUQQ0KLURuYmtLdmJkb3puRUxYb0ENCi1Eb0NqanZiZFp0SWlZY3NPDQotRU9jTEt2YmRHR0tTT0pVUg0KLURvQ2pqdmJkVU1XUEF1bmkNCi1EbmJrS3ZiZEVQREtrV2JkDQotRVBDa0t2YmRVeGhUekxQTw0KLURvREtqdmJkR2RLdktCaWoNCi1EbmNLanZiZG1TWlV6U2NpDQotRVBDamp2YmRaalNoUUdhZg0KLURuY0xLdmJkV1JteENFbEQNCi1FUERMS3ZiZHF2cE1ESXlSDQotRG5jS2p2YmRDSktha0lmSw0KLUVQREtqdmJkSEVMV0piS0sNCi1Eb0RLanZiZGpsYkx6RkdvDQotRVBDamp2YmRUa3ZQQldPaQ0KLURvQ2tLdmJkSnZWR0VGR2kNCi1FT2NMS3ZiZFV5SHN6TFBPDQotRU9iamp2YmRWQkJwc1FxeQ0KLURuYmtLdmJkWmR4R3poSWINCi1EbmJqanZiZHNQdk9pY1ZmDQotRG9ES2p2YmR0Y0N0d1dQUA0KLUVPY0xLdmJkd3RtRlJZa24NCi1FUERLanZiZGVnanZTTnFIDQotRG9ES2p2YmRJeFVCZ2xRcA0KLUVPY0xLdmJkQmNwQXZLTkcNCi1EbmJqanZiZHdYTUF2QXZWDQotRG5ia0t2YmRkb0VzTFVVUw0KLURuY0tqdmJkQ0lrQ0tpR0sNCi1Eb0RLanZiZGxaVFNUWWZ0DQotRVBDamp2YmRkb0VzS3RUcg0KLUVPYmpqdmJkRmZKck9KVHENCi1FUERMS3ZiZGxpRHNxVlNCDQotRG5jTEt2YmRiVWFnWGp0SQ0KLUVPYmtLdmJkSXNZYVNseE0NCi1FUENqanZiZEhrYXpuWFJMDQotRG5ia0t2YmR4VW1GUXlNTw0KLURvQ2pqdmJkV1dpWHZEZGcNCi1FUENqanZiZFNRVUhLRmN3DQotRVBETEt2YmRqS0dJSmx3cg0KLUVPY0tqdmJkWEZ4eXRBT3MNCi1EbmNLanZiZG1iS1d3b051DQotRU9iamp2YmRpWnVGa3BtZg0KLURvQ2pqdmJkRnlWVkJEd2INCi1EbmJqanZiZGVxYVd6bERQDQotRVBDamp2YmRSeWpIc0RXQQ0KLURuYmtLdmJkcWx6SnlNSGkNCi1EbmJrS3ZiZFpSTkZJbUZSDQotRG9Da0t2YmRZZndFQVBTaQ0KLURvQ2pqdmJkT0FJcnNqU0ENCi1FUENrS3ZiZGFOTENUVk1nDQotRG5iamp2YmRxY2VJb212Qg0KLURuYmpqdmJkc0NGbGtnTFoNCi1Eb0RMS3ZiZG1JZFVSVXFhDQotRU9jS2p2YmRac2hoeGNybg0KLURvREtqdmJkWmpUSVBnQ0cNCi1EbmNLanZiZGVtR1dmbUprDQotRG5iamp2YmRBQ3F4S1ppUQ0KLUVPYmtLdmJka1Z2bkVCeFgNCi1EbmNMS3ZiZFV0TlRmTVdLDQotRVBETEt2YmR1YUR4c1BGSQ0KLUVPYmtLdmJkZ1FCenZjeEkNCi1FT2JrS3ZiZFNaaWhURFdBDQotRU9jTEt2YmRxWW5nZ1JFWQ0KLUVQREtqdmJkcWlBSmRtUEYNCi1FT2NMS3ZiZGlHakRaVmpWDQotRU9jTEt2YmRHWlZWQWRYYg0KLURvREtqdmJkaGZqQ3h1aXUNCi1EbmJrS3ZiZHVNWVhCVGFYDQotRG9Da0t2YmRqU3ppVEtpeg0KLURvREtqdmJkcWx6S1pNSUoNCi1EbmJqanZiZGtWd09FQnhYDQotRG9Damp2YmRkdEFVQVNtVw0KLURvRExLdmJkempWUVFFU3QNCi1FT2NMS3ZiZGt5U3JTeUhVDQotRG5jTEt2YmROR2JvbG90aw0KLURuYmpqdmJkZGVPckJ3Q2oNCi1Eb0RMS3ZiZGlMZGNtdURaDQotRG9ES2p2YmRTUHNmakZkWA0KLURvQ2tLdmJkYlVhZnhLdEkNCi1EbmJrS3ZiZGNKTkprRnZ4DQotRU9iamp2YmRGZWpTTmlVUg0KLUVQREtqdmJkUW1ZQ1ltdHoNCi1EbmNLanZiZGZWendwSnpzDQotRVBES2p2YmRXUm13YkVrYw0KLURuY0xLdmJkRmtFc0RJTXUNCi1Eb0NqanZiZFFjY0JQcUVTDQotRU9ia0t2YmRLQ2licGpDeA0KLUVPY0tqdmJkTEJMSE5Cd3ENCi1Eb0NrS3ZiZFVNV09hVm9KDQotRG9Damp2YmRyYkZtTUdqeQ0KLUVPY0xLdmJkSnZWRmRFZ0oNCi1FUENrS3ZiZGpoSE1HRm5MDQotRG5jS2p2YmROeE91emNtdA0KLUVQREtqdmJkRVh4THN0VU0NCi1Eb0RLanZiZHd5Z2ZHWGVTDQotRU9ia0t2YmR5VE5pTXJCZw0KLURuY0tqdmJkbFpTclN4Z1UNCi1FUERLanZiZEpYdENIbFFwDQotRVBDa0t2YmRkbmRzTFRzcg0KLUVPYmpqdmJkTmRjc2hoa0UNCi1EbmNMS3ZiZFNDRGVMaHlMDQotRG5jTEt2YmROc1R2SEV1UQ0KLUVPY0tqdmJkQUNxeEtaaVENCi1Eb0NqanZiZHB0VGdScWp0DQotRVBES2p2YmRPRWRUaUpMRQ0KLURvREtqdmJkcnBWb0tDdkcNCi1EbmJqanZiZEZqZVNiaE5WDQotRVBDamp2YmROR2JvbG91TA0KLUVQRExLdmJkckVGSW9uVmENCi1EbmJrS3ZiZE9GRHNpSWpkDQotRG9Da0t2YmRUcVFvVXVJTg0KLUVQREtqdmJkZU9kc0t0VHINCi1EbmNLanZiZHlOcmhYc0ljDQotRVBES2p2YmRuUVp4dWp5Qw0KLUVQQ2tLdmJkWXFNZGhtRlINCi1EbmNMS3ZiZGRlT3JCdmJqDQotRG9Damp2YmRMR0ZnYkFwdQ0KLURvQ2pqdmJkZW1Gd0hNaWsNCi1Eb0NrS3ZiZFJYT0VDbEhjDQotRG9Da0t2YmRaUW1FaU5GUg0KLUVQQ2pqdmJkRUFTSWx6WFgNCi1EbmJrS3ZiZHJXb2tiaVpSDQotRU9ia0t2YmRIRUxXS0Jpag0KLURuYmtLdmJkYlVhZ1hrVUkNCi1FT2NLanZiZGJzRExVRGlhDQotRU9jTEt2YmRVV0xvalVBcQ0KLURuYmpqdmJkUXZtY2NNSUQNCi1Eb0RLanZiZFp4Y2pPRE1TDQotRVBES2p2YmRUdWxQalVCUg0KLURuY0xLdmJkalN6aHNLaXoNCi1FT2NLanZiZFRBRkpJQ09kDQotRG5ia0t2YmRLTkFEekhWQg0KLURvQ2pqdmJkbGlEdFJWU0INCi1FT2JqanZiZFdYSXhWY2VIDQotRVBDamp2YmRmSGtXUm5RZw0KLUVPYmtLdmJkakFRR2FQZ0sNCi1FT2JrS3ZiZGtDbExSR3VIDQotRG5jTEt2YmRabm5JZGVaag0KLUVPYmpqdmJkbFlzUnNZZ1UNCi1Eb0RMS3ZiZHB5UEhnUWN4DQotRG5iamp2YmRuUHl5V0t5Qw0KLUVPYmpqdmJkUXdOY2JsSUQNCi1EbmJqanZiZENKS2FqaGZLDQotRVBES2p2YmRpSEtDeVdLVg0KLUVPYmpqdmJkZUVvUmF2YmoNCi1FT2NLanZiZG1haXZ3bm5WDQotRU9jS2p2YmR3TldBTkRlTg0KLUVQREtqdmJkVEFGSWhDUEUNCi1Eb0NqanZiZFpRbGVKTWVSDQotRVBES2p2YmRtdHVaamlxZg0KLURuYmtLdmJkRVBDa0xYQ2QNCi1FT2JrS3ZiZHFHRUVzdkJJDQotRU9jS2p2YmRtSWRUcVZTQg0KLUVPYmpqdmJkSlRaQlNsd2wNCi1FUENqanZiZHFsektaTUlKDQotRVBES2p2YmR1Q2J0d1dPbw0KLUVQRExLdmJkblB6WXVrWWINCi1FUERLanZiZGVGUFNCdmJqDQotRVBETEt2YmRIRUt2S0NKag0KLUVQREtqdmJkVlVOVUdMdWoNCi1FT2NMS3ZiZEp1dUdFRWdKDQotRU9jS2p2YmR6UW5tSktYQQ0KLUVPY0xLdmJkcmJHTWtmankNCi1EbmJqanZiZFVzbHRGa3VqDQotRG5ia0t2YmREeFlNVVVVTQ0KLURuYmpqdmJkVVFwb1V1SG0NCi1FUERLanZiZFJiRGRsSlpMDQotRG5jTEt2YmRtZ0ZYbG1meQ0KLUVQQ2pqdmJkSmJpYnFKY1kNCi1Eb0NqanZiZEVQRExMV2NFDQotRG9ETEt2YmRNSkNNUllBUw0KLURvQ2tLdmJkUVpOQUdzU0sNCi1FT2JqanZiZGlDUERGWFFxDQotRU9jTEt2YmRWd0pYdkVFZw0KLURvRExLdmJkc3Jxc1l6RkQNCi1EbmNMS3ZiZGp1dm5EYlh3DQotRVBES2p2YmRoZ0tDeVdLVg0KLURvRExLdmJkTmRjdElpS2QNCi1FT2JrS3ZiZHVhRVlybmVJDQotRG9Da0t2YmROVlNyS21BWA0KLURuY0tqdmJkWG5SQVh0dlUNCi1Eb0RLanZiZGhrZGROdGNaDQotRG9Da0t2YmRpQm5iZHdRcQ0KLURuYmtLdmJkTEJMR2xhd3ENCi1Eb0RLanZiZHlnWk1BTkV3DQotRG5ia0t2YmRac2lJeGNzTw0KLUVPYmpqdmJkaUJvREV3UlINCi1Eb0NqanZiZEhiTHpFekFEDQotRVBDa0t2YmRqYmtrUWdWSA0KLUVPY0xLdmJkc0JlbUxnTFoNCi1FT2NMS3ZiZHB0VUdyUmtVDQotRVBDamp2YmR6bnBRZGJreA0KLURvREtqdmJkR1l0dUFkWGINCi1FT2NLanZiZHpqVXBRRVRVDQotRU9jTEt2YmR5cG9OSWpYQQ0KLURuYmtLdmJkU1FVSEpmRHcNCi1FUENrS3ZiZGJzQ2p0RUtCDQotRG9ETEt2YmRhamxGb09EQQ0KLURvREtqdmJkZWxldmZtS0wNCi1EbmJrS3ZiZENUQWJzZldyDQotRG9ES2p2YmRqaEdsR0dOaw0KLURvQ2tLdmJkZENUTXJBVG0NCi1FUERMS3ZiZGFNamJTdU1nDQotRG9Da0t2YmRLYUxITkNZUg0KLURuY0xLdmJkR0dLU05pVHENCi1Eb0NqanZiZExaUkpyenRmDQotRVBETEt2YmRqbGFreWVHbw0KLUVPYmtLdmJkd3VNZHB5TG4NCi1EbmJrS3ZiZGVnanVxblFnDQotRVBES2p2YmR0VFNUWXlkYw0KLUVPYmtLdmJkWnlEak9DbFMNCi1EbmJrS3ZiZHFHRUV0V0FoDQotRU9jTEt2YmRLUXlkb0ZuRg0KLUVQRExLdmJkcVVUZ1NTS3QNCi1EbmJqanZiZE1KQ01ReEFTDQotRVBDa0t2YmRpTUZEblVieQ0KLUVPY0tqdmJkZnBCendFWGgNCi1Eb0NrS3ZiZFNCY2VNSXhrDQotRU9iamp2YmRmTWV2Z01paw0KLUVQQ2pqdmJkakFRSEFvZmoNCi1FUENqanZiZFpMckVUbk1ODQotRU9ia0t2YmREb0RMTFhDZA0KLURuY0xLdmJkU1pqSHNEV0ENCi1EbmJqanZiZE9TdFZnRlZRDQotRU9ia0t2YmRiaGxpamZYWQ0KLURuYmtLdmJkakVqZnRvQU8NCi1Eb0NqanZiZGVFbnJDWERLDQotRU9jTEt2YmRaeUVLTmNNUw0KLUVQREtqdmJkV1NOd2Fka2MNCi1FUENqanZiZGtETGpxSFVnDQotRG9Da0t2YmRTQ0VGTGlZaw0KLURuY0tqdmJkdGt3d0JUYVgNCi1FUERLanZiZENUQWJzZXZyDQotRG5jTEt2YmRtZmR3bG5HeQ0KLURuY0xLdmJkVHVrcEp0QlINCi1Eb0NqanZiZGxZcnJUWkd0DQotRU9jS2p2YmRuQ0tXd29PVg0KLURuY0tqdmJkTWdDb2xwVkwNCi1FUERMS3ZiZGR3eXRVUmV6DQotRG9Da0t2YmRha0xlbm1jQQ0KLUVQQ2tLdmJkUXZtZENraEQNCi1EbmNMS3ZiZEVBUmhseld3DQotRU9jTEt2YmRyWFFNREpZcQ0KLUVPYmtLdmJkbUpFVHB0ckINCi1FT2NLanZiZEFNZ3hzWFp4DQotRVBES2p2YmRVTHZQQlZuaQ0KLURvREtqdmJkcUdFRlR2QWgNCi1Eb0RLanZiZEdMRlRDaE11DQotRG9Damp2YmRMQktnTkNYcQ0KLURvQ2pqdmJkT0Vjc2lKTEUNCi1FT2JqanZiZFNMWkZ1SEtzDQotRG9Damp2YmR0a3hYQXNhWA0KLURuYmpqdmJkTkdicE5RVkwNCi1FT2NMS3ZiZGlMZUVPVWJ5DQotRU9iamp2YmREb0NqandERQ0KLUVQQ2tLdmJkeHJuSk1yQ0gNCi1FUERLanZiZEpUWkJUTXdsDQotRG5jS2p2YmRCY3BCV0psZg0KLURuY0xLdmJkR0tkc0RIbVYNCi1EbmNMS3ZiZER3d2xVVVRsDQotRVBETEt2YmRiUUhIRUx6ZA0KLUVQRExLdmJkWWxTRVVPTG0NCi1FT2JqanZiZGh0eWVYU1ViDQotRVBDamp2YmRBQ3F4S1ppUQ0KLUVPYmpqdmJkckRkaVBtdWENCi1FUENrS3ZiZGN5eHBZWXFDDQotRVBES2p2YmRyWFFMYmlaUg0KLURuY0tqdmJkam1CbFplSFANCi1EbmNLanZiZGxZcnJUWWZ0DQotRU9ia0t2YmRhYVdGRnBQdw0KLURuY0tqdmJkd3loR0Z3ZHINCi1FUENrS3ZiZHVMeFhBdEJYDQotRU9iamp2YmRoYW5jRXZwcQ0KLURuY0xLdmJkYmlNaktldngNCi1EbmNLanZiZFRJeWpSQUJNDQotRG9Da0t2YmRjSW1LTEZ2eA0KLURuYmtLdmJkWmpTZ3BIQmYNCi1FUENrS3ZiZEdkS3ZKYkpqDQotRU9jTEt2YmRTQ0RlTUl5TA0KLUVPY0tqdmJkWnhkSm5DbFMNCi1FT2NMS3ZiZEhEa1ZpYkpqDQotRG9ES2p2YmRlenV4ZUpUdw0KLUVPY0tqdmJkcUZjZVVWYUkNCi1FUERLanZiZFdJWVdYZnh6DQotRG9ES2p2YmROUVhxV09IVA0KLURuYmtLdmJkT1N0V0hFdHANCi1FUERLanZiZExBa0dtQnhSDQotRVBES2p2YmREeFhrc3NzbA0KLUVQQ2tLdmJkVHFSUFZVZ20NCi1Eb0RMS3ZiZHJEZGhvbXZCDQotRG5jTEt2YmRwdFVHclNLdA0KLUVPY0tqdmJkaUJuYmVXcVINCi1Eb0RLanZiZGV6dlllSlVYDQotRG5ia0t2YmRPQUpTdEpyQQ0KLURuYmpqdmJkdGNDdVd2UFANCi1EbmJqanZiZElqRUFLUGdFDQotRU9ia0t2YmRXV2lYdkVFZw0KLURuYmtLdmJkU0JkRk1KWWsNCi1FT2NLanZiZFFkQ2FRUWNyDQotRVBETEt2YmRMWlJLU3p1Rw0KLURvQ2tLdmJkcGZFRlR1YUkNCi1EbmJrS3ZiZFZCQnFTcVJ5DQotRG5jTEt2YmRNb3hSVm5Hcw0KLUVPY0xLdmJkdW9UenFLbnQNCi1Eb0NqanZiZHh4SktDUHlrDQotRG5jTEt2YmRWdmh3dkVGSA0KLUVQRExLdmJkT1lQVnpjblUNCi1FT2NMS3ZiZEJkUGFXSmxmDQotRG5ia0t2YmRKU3lBc013bA0KLURvQ2tLdmJkWVRMYU1zbngNCi1FT2NLanZiZFVXTHBKc2FSDQotRG9Damp2YmRoYk9jRXdSUg0KLURuY0tqdmJkS2ZHSGJBcVYNCi1Eb0NqanZiZGxaVFNTeUd0DQotRG5jTEt2YmRhdGJHeExUaA0KLUVQRExLdmJkaUdpY1l2S1YNCi1FT2NMS3ZiZFRJeWpSQUFsDQotRVBES2p2YmRac2lJeURzTw0KLURuYmpqdmJkWkxxY3NtbE4NCi1FT2NMS3ZiZGVPZVRMVHRTDQotRG5jS2p2YmRRZENhUHFEcg0KLUVQQ2pqdmJkVUd6bkx2dkYNCi1FT2JrS3ZiZHJEZGhwTnZCDQotRVBETEt2YmRSYWRGTGh4aw0KLURuYmpqdmJkaHl0ZWxRbWYNCi1FUERLanZiZEZrRlNiaE5WDQotRG9ES2p2YmRhU0dESHNlaw0KLUVPYmtLdmJkekhZbEFNZHcNCi1EbmJqanZiZGxpRHNwdHJCDQotRVBDa0t2YmRZbFNEdE5sTg0KLURvREtqdmJkblB5eHVqeGINCi1FT2JqanZiZFJrWWZWR2pzDQotRVBDamp2YmRSYWNlTUpaTA0KLUVPY0xLdmJkblV1WmtKckcNCi1EbmNLanZiZE9ZT3V6ZE50DQotRG9Da0t2YmRKYmpEUWljWQ0KLURuYmpqdmJkUnlqSHNDdkENCi1FT2NMS3ZiZFVHem1sWFZlDQotRVBDamp2YmRNb3hSV09Hcw0KLURuY0tqdmJkbHJaVXpURUoNCi1Eb0NqanZiZEpZVUJna3BwDQotRU9jTEt2YmRBQ3JYaXpKUQ0KLUVQREtqdmJkc0NHTWtma1oNCi1EbmNLanZiZHFZbmhHcUVZDQotRG5jTEt2YmRqZ2ZsRmVtaw0KLURuY0tqdmJkcnpNUVRBZ24NCi1Eb0NqanZiZGxaVFNTeGdVDQotRVBETEt2YmRLQ2licUtDeA0KLUVPY0xLdmJkbUpEdFF1U0INCi1EbmNMS3ZiZFFjYmFQcUVTDQotRG9Damp2YmRPWG9WemROdA0KLUVPYmtLdmJkYnNDanNkS0INCi1FUERLanZiZHlTbWlNcWJIDQotRG9Damp2YmRyTXpLWkxoSg0KLURuY0tqdmJkdEFHcUlBQXINCi1FUENqanZiZEVYeE1UdFVNDQotRU9jS2p2YmRWck9ZQmRrYw0KLURvREtqdmJkelJPbGhpd0ENCi1EbmNLanZiZHFUdEhSckxVDQotRG5ia0t2YmRpVXpFd1NVYg0KLURvQ2tLdmJkWkxxY3NuTU4NCi1EbmJqanZiZFVhQnFUUlJ5DQotRG9ES2p2YmRSb3NnS0dFWA0KLUVPYmtLdmJkU2h6S1JBQk0NCi1Eb0RMS3ZiZHFaT2hIUkR4DQotRVBETEt2YmRpVXpGV3F0Yg0KLURvQ2tLdmJkWnlFSm1ia3INCi1EbmNLanZiZFJFREJQcGRTDQotRVBDamp2YmRNU1dtWnRweg0KLUVQRExLdmJkVEFFaUhhb0UNCi1Eb0RLanZiZE5lRVRpSWpkDQotRU9jTEt2YmRxZEZKUG11YQ0KLURvQ2tLdmJkUnBUZmpGY3cNCi1EbmNMS3ZiZHpub3FFY01ZDQotRG9Da0t2YmRGZkpxbWlVUg0KLUVPY0xLdmJkU1BzZmlmRVgNCi1EbmJqanZiZHR1bllKcHNBDQotRVBES2p2YmRxY2RpUU9WYQ0KLURuYmtLdmJkZVh5c3NyRnoNCi1FUERMS3ZiZFFZbUFHcnFqDQotRU9iamp2YmRlZ2p1cW1wZw0KLUVPY0xLdmJkYkxMZW5tY0ENCi1FT2NMS3ZiZHB5UEhnUkVZDQotRG9ES2p2YmRaUk1kaG1FcQ0KLURuY0xLdmJkZFp4b3haUkMNCi1FT2NLanZiZEt4cGpTenRmDQotRVBES2p2YmRLa0JIdkFKeQ0KLUVPYmtLdmJkbkJpd1lPblYNCi1FT2JrS3ZiZHJXb2xESllxDQotRG9Da0t2YmRaeUVKbWJrcg0KLURvREtqdmJka0RNTFJIVWcNCi1FUENqanZiZFF3TmNjTUlEDQotRG5jS2p2YmRTWmloU2J2QQ0KLURuY0xLdmJkbkhGWG1OZ1oNCi1EbmNLanZiZEdLZVNiaE11DQotRG5jTEt2YmRVTHZQQXVvSg0KLUVPY0xLdmJkWXFORkpNZVINCi1Eb0RMS3ZiZE1mY1BtUVZMDQotRVBES2p2YmRGcEFUV2dHWg0KLUVPYmpqdmJkZXFhV3prYm8NCi1FT2NLanZiZFpvTmhkZHpLDQotRU9iamp2YmRGZWlxbWlUcQ0KLURvREtqdmJkYXVCZndqc2gNCi1FT2NMS3ZiZEJyYURVRnZyDQotRG9ETEt2YmR5WUlqQ1B6TA0KLURuYmpqdmJkbVJ4dVpzRUoNCi1FT2JqanZiZE1mY1FNcFVrDQotRU9jS2p2YmR5TnNJWHJoYw0KLUVQREtqdmJkUkVEQlBwY3INCi1FUENqanZiZFJrWWV1R2tUDQotRVBDa0t2YmR0QUhSSUFBcg0KLURuYmtLdmJkeFVtRlF4a24NCi1FT2JrS3ZiZHRUU1RaWmRjDQotRU9jS2p2YmRtSWRVUXRxYQ0KLUVPY0tqdmJkWHJrYU5VUFkNCi1Eb0RLanZiZENXemRJZVB2DQotRG9ES2p2YmRiQlZkZlFQdw0KLUVQQ2pqdmJkWnlFSm1ibFMNCi1EbmNLanZiZGxaVFJyeGZ0DQotRVBETEt2YmRJeFVDSU1RcA0KLURuYmpqdmJkS3lSS1N6dGYNCi1FT2NLanZiZE5lRVVJaGpkDQotRU9jTEt2YmRqS0dJSm1Ycg0KLURvRExLdmJkQ0VQYVZpbUcNCi1FUENrS3ZiZE9GRHNpSWtFDQotRU9jTEt2YmRlaEt2U09SSA0KLURvREtqdmJkd1drYVdBdXUNCi1FUERLanZiZHB4b0hmcGN4DQotRVBES2p2YmRKYmpDcUpieA0KLURuY0tqdmJkWnRKSlpFVE8NCi1FUERMS3ZiZHNaa3BUQkhuDQotRVBDa0t2YmRUbFdQQXVvSg0KLURvQ2pqdmJkamdnTUZmT0wNCi1Eb0RLanZiZGZNZXdHbGlrDQotRVBETEt2YmRuQml2d29PVg0KLURvQ2pqdmJkd3VORXB4a24NCi1EbmJrS3ZiZGlpZklLTllTDQotRU9jS2p2YmRLVnVGZEZHaQ0KLUVQQ2pqdmJkWmR4R3pnaUMNCi1FT2NMS3ZiZHVhRHhzUEVoDQotRVBDa0t2YmRSb3RISmZFWA0KLURuY0xLdmJkQ0lqYWpoZWoNCi1Eb0NrS3ZiZGNJbUpqZld4DQotRU9jTEt2YmRLVnRlY2RnSg0KLURvQ2pqdmJkZUZPckJ3Q2oNCi1FUERLanZiZHF2cExjSXhxDQotRU9iamp2YmRFQVJpTXl2dw0KLURuY0tqdmJkYlVhZnhMVGgNCi1EbmNMS3ZiZExBa0dtQ1lSDQotRG9ES2p2YmR4Vk1kcVlrbg0KLUVQREtqdmJkV1dpWVdEZGcNCi1FT2JrS3ZiZEtESmJwakN4DQotRG9Da0t2YmRuUHl4dkt5Qw0KLURvQ2tLdmJkWnNpSlljc08NCi1FT2JrS3ZiZEpwekZPZW1lDQotRU9jTEt2YmRPU3N1ZmVVcA0KLURvRExLdmJkVGZ6bk1XdkYNCi1FUERMS3ZiZGZORndHbGlrDQotRVBETEt2YmRDRHBBdWlsZg0KLUVQREtqdmJkYmlNaWtHV3gNCi1Eb0NrS3ZiZHJiR01rZmp5DQotRG9Damp2YmRXSVh1eEhZeg0KLUVQREtqdmJkR0ZpcW5Jc3ENCi1FUERMS3ZiZE5HYnBNcFZMDQotRU9jTEt2YmR0U3JUWXllRA0KLURvREtqdmJkakpmSGpOWHINCi1FUENrS3ZiZHppdHBQY3J0DQotRG9ETEt2YmR4bXJneFNpRA0KLUVQRExLdmJkY0pOS0xGdngNCi1FUERMS3ZiZHNyclN4eWRjDQotRG5ia0t2YmRxY2VJb25XQg0KLUVQQ2tLdmJkWm5uSWRkeksNCi1Eb0NqanZiZExZcGlyenRmDQotRVBDamp2YmRMcldselVweg0KLURuYmpqdmJkUmtaR1ZHanMNCi1FT2JqanZiZG5CaXZ4T211DQotRG9Damp2YmRtSWRVUXVTQg0KLUVPYmtLdmJkdGNDdHZ1b1ANCi1EbmJqanZiZEFOSVlydnpZDQotRG5jS2p2YmRtYWl2d29OdQ0KLUVPY0xLdmJkcm91b0pjV0cNCi1Eb0RMS3ZiZFRwcG9WVklODQotRG9ETEt2YmRWVU10Rmt1ag0KLURuY0xLdmJkem5wUWRibFkNCi1EbmNLanZiZEVQQ2tMWERFDQotRU9jTEt2YmRmSGtWcW1xSA0KLUVQREtqdmJkYXBHZ0RremQNCi1FUENqanZiZFNQc2ZpZkR3DQotRG9ETEt2YmRHS2VURElOVg0KLUVPYmpqdmJkeXFQTklqWEENCi1FUENqanZiZGF0Ykd3a1VJDQotRG9Damp2YmRDVEFjVGV3Uw0KLURuYmpqdmJkeG5USVhzSkQNCi1FT2NLanZiZGJLbEZubkRBDQotRG5jS2p2YmRqSmVnak5Ycg0KLUVPYmpqdmJkTXVUUmtOQVgNCi1FT2JrS3ZiZFV4Z3N5a09uDQotRG9Da0t2YmRSYWNlTUl4aw0KLUVQRExLdmJkSmJpYnBpYngNCi1Eb0RLanZiZEV6dFFkbENpDQotRVBES2p2YmRjeXlQd3lSQw0KLURuY0tqdmJkamxiTVpkZm8NCi1FUENrS3ZiZFJYTmRDbElEDQotRG5jTEt2YmR0YmJ1WFZvUA0KLURvREtqdmJkaWVMSFZQQU8NCi1Eb0RLanZiZEZWeG9wTWllDQotRU9iamp2YmR6b1BwZGJsWQ0KLUVQQ2pqdmJkbUlkVVF1U0INCi1FUENrS3ZiZFlrckVVTmttDQotRG9Da0t2YmRWd0l4VmRFZw0KLURvQ2pqdmJkT1NzdkdkdHANCi1FUENqanZiZG1TWXR5c0RpDQotRU9ia0t2YmRXV2lZVmNlSA0KLURvREtqdmJkck5aaXhrZ2kNCi1FUERLanZiZGJWQ0hZS3NoDQotRG5ia0t2YmRqS0ZnaW1Ycg0KLUVQREtqdmJkTnNVV0hGVXANCi1FT2JrS3ZiZGVBVVFsd2pHDQotRU9jS2p2YmRUQUVpSUNQRQ0KLURvQ2tLdmJkWkxxZFVOa20NCi1FT2NLanZiZFppc0hvZ0NHDQotRVBDa0t2YmRLVnRmRUVnSg0KLUVPYmpqdmJkYVNHRElVR0wNCi1FUERLanZiZFpSTkZJbGVSDQotRG9ES2p2YmR5WGlKYW95aw0KLUVPYmtLdmJkUmtZZlZIS3MNCi1EbmJrS3ZiZExBa0hOQ1hxDQotRG5jS2p2YmRKcHllUEZuRg0KLUVQQ2tLdmJka0hnTUZlbkwNCi1Eb0RMS3ZiZE9GRHRJaGtFDQotRG9Da0t2YmR0VFNUWlpkYw0KLUVPY0xLdmJka0NsS3BmdUgNCi1Eb0NqanZiZEJjcEJWak5HDQotRG5ia0t2YmRmTWZYSE5Kaw0KLURvREtqdmJkQnNCQ3RGdnINCi1Eb0NqanZiZEhnR3pZd3dnDQotRG5jTEt2YmRTd2prbXprWQ0KLURvQ2tLdmJkRGloSnV3akENCi1FUERLanZiZFFjY0JQcGRTDQotRVBES2p2YmRlaExWcW5RZw0KLURvQ2pqdmJkbW96WlZrWkMNCi1Eb0RMS3ZiZGFOS2FzVk5IDQotRU9ia0t2YmRyUnRrT0xCTg0KLURvREtqdmJkZWhMV1JuUkgNCi1FT2JrS3ZiZFNDRUVraVlrDQotRG9Damp2YmRSWE9FRE1JRA0KLUVPY0tqdmJkRmVqUm1pVVINCi1FT2NMS3ZiZEZrRXNDaE5WDQotRG5jS2p2YmRXV2h3dWNlSA0KLUVQQ2tLdmJkTndvVnpkT1UNCi1FT2NLanZiZGVQRlNrVVRyDQotRG9ES2p2YmRNUndNelVweg0KLUVPYmpqdmJkTHJYTXpVcHoNCi1FUERLanZiZFp4ZEpuRExyDQotRU9jTEt2YmRyUnRrTmphTg0KLUVQQ2tLdmJkVHZMb2l0QlINCi1EbmNLanZiZEtlZWhDQXB1DQotRVBETEt2YmRlbUZ2ZmxqTA0KLURuY0xLdmJkZUZPcWF3Q2oNCi1Eb0RLanZiZFp5RUpuQ2tyDQotRG9Damp2YmRsWlRSc1pIVQ0KLURuYmtLdmJkUmJEZGxKWkwNCi1EbmJqanZiZFlxTWRpTkZSDQotRU9iamp2YmRTUVRmakZkWA0KLURvQ2pqdmJkZ0ZsWm5HZ0ENCi1Eb0RMS3ZiZHd0bGRxWWtuDQotRU9ia0t2YmRqZ2dMZkZtaw0KLURuY0xLdmJkTWdDcE5QdGsNCi1EbmNLanZiZG1wWnlXS3hiDQotRVBES2p2YmRWcW5ZQmVNRA0KLURvREtqdmJkVUx1b0JXT2kNCi1EbmNMS3ZiZGV6dlpFaVR3DQotRVBDa0t2YmRqYmxMUkhVZw0KLUVQQ2pqdmJkQmlLYWtKR0sNCi1EbmNLanZiZFR1a3BKdEFxDQotRG9Da0t2YmRrV1duRUJ4WA0KLUVQQ2pqdmJkblB6WXZMWkMNCi1FT2NMS3ZiZFdIeFZ4R3h6DQotRG5jTEt2YmROc1VXSEV0cA0KLUVPYmtLdmJkSERrV0tCaWoNCi1FT2JrS3ZiZFZBYlFzUXJaDQotRG5ia0t2YmRLQ2licUtEWQ0KLUVPYmpqdmJkTFlxS1N6dGYNCi1Eb0NrS3ZiZFpMckR0T01ODQotRU9jS2p2YmRlbUZ2Z05Kaw0KLURuY0xLdmJkaUNPY0V2cHENCi1EbmJrS3ZiZEVYeEx0VHRNDQotRU9ia0t2YmRGamRyYmdsdQ0KLUVPYmtLdmJkbXR0eWtKckcNCi1Eb0NqanZiZGVQRlRMVVRyDQotRG9Da0t2YmRXUm13YWRsRA0KLURvRExLdmJkVnFteENFbEQNCi1FUENrS3ZiZG5CaXdYb09WDQotRG5iamp2YmRFdlpRUG1LRg0KLUVPYmtLdmJkU0t5R1ZHa1QNCi1FUENqanZiZGF1QmdYa1RoDQotRVBDamp2YmRWck54QmVMYw0KLUVPYmpqdmJkT0Vjc2hpTEUNCi1Eb0RMS3ZiZGJMTUdQTmNBDQotRG5ia0t2YmRkWnhwWVlxQw0KLURvQ2tLdmJkbFpUU1RaSFUNCi1FT2JrS3ZiZHRsWHdCVGFYDQotRU9ia0t2YmRIZmZ5eHd4SA0KLUVQREtqdmJkcnBXT2ljVmYNCi1EbmNLanZiZGtWdm1kQnd3DQotRVBES2p2YmR1YUR5U29GSQ0KLUVPYmtLdmJkc1prb3NCSG4NCi1Eb0RMS3ZiZFRBRkpJQ09kDQotRG5iamp2YmRwc3RIUnJMVQ0KLURuY0tqdmJkVVFxT3R1SU4NCi1FUERLanZiZFZVTXRGbFdLDQotRG9ETEt2YmRyb3VvS0RWZg0KLURvQ2pqdmJkbVJ5VXlzRGkNCi1FUERLanZiZGdGa3pOZ0hBDQotRG5iamp2YmRac2hpWkRzTw0KLURuYmpqdmJkSU1Cem13UkwNCi1FT2JqanZiZFpzaGh4ZFRPDQotRU9jTEt2YmRaR3dFQU9yaQ0KLUVQQ2tLdmJka0hmbEZmT0wNCi1Eb0NrS3ZiZEtESmNRaWJ4DQotRU9jTEt2YmRGa0VzQ2dtVg0KLUVQQ2pqdmJkSnV0ZkVFZ0oNCi1Eb0NrS3ZiZE9YbnV6ZE50DQotRVBETEt2YmR1THd3QXRBdw0KLURvREtqdmJkcXZwTGJpWlINCi1FUENqanZiZEdZdVZCRVhiDQotRU9jTEt2YmRDSkthamhmSw0KLURuYmpqdmJka01iTHllR28NCi1FUENrS3ZiZGlqR0lLTXdyDQotRG9ETEt2YmRKenBHWGRBTg0KLURvREtqdmJkTndudXpkT1UNCi1FT2NMS3ZiZHRTcXNZeWVEDQotRU9jTEt2YmRtUnh1WnJkSg0KLUVQREtqdmJkaGxFY210Y1oNCi1Eb0NrS3ZiZGJpTkpqZXZ4DQotRG9ES2p2YmRHY2tWaWJKag0KLURvRExLdmJkR0xGU2JoTXUNCi1FUERLanZiZEVPYmprV2JkDQotRU9ia0t2YmRCaGtCamlHSw0KLUVQREtqdmJkdEFHcUlBQXINCi1Eb0NrS3ZiZFdSbXdhZGtjDQotRU9iamp2YmRRZERBb3FEcg0KLUVPY0xLdmJkd05XQU5EZU4NCi1FUENqanZiZE1vd3FWbWdUDQotRVBETEt2YmRlZ2tXU05wZw0KLUVQRExLdmJkakFRSEFvZ0sNCi1Eb0RMS3ZiZHZ3TGFWYVdWDQotRVBDamp2YmRMR0ZnYkJRdQ0KLURvQ2pqdmJkeHNPSk1yQ0gNCi1FT2JrS3ZiZEZrRlRDaE11DQotRU9iamp2YmRiTExlbm1jQQ0KLUVQRExLdmJkaUNPYmVYUlINCi1FUENqanZiZGhiT2JkdnBxDQotRU9ia0t2YmRWWklVWmtPbg0KLUVQRExLdmJkZlZ6eFBpenMNCi1FUERLanZiZG5QeXlWanlDDQotRG5jTEt2YmRSektJVEN2QQ0KLUVPY0xLdmJkVXRNc2ZMdWoNCi1EbmNLanZiZFZCQnBzUlJ5DQotRG5ia0t2YmR6ZVpuemR6UQ0KLUVPY0xLdmJkVXROVGZNVmoNCi1FT2JqanZiZHFjZGlRT1dCDQotRG9Da0t2YmROZGRUaUlqZA0KLURuY0xLdmJkcnlrb3NCSG4NCi1FUERLanZiZFdSbllCZUxjDQotRG5jTEt2YmRyWFFMY0l4cQ0KLUVQQ2tLdmJkVVdMcEtUYVINCi1Eb0NrS3ZiZFpSTkZKTWVSDQotRVBETEt2YmR1bnN6cGpvVQ0KLURvREtqdmJkeml0cFBkU3QNCi1FT2JrS3ZiZHZCRHhybmVJDQotRG9ETEt2YmRWdmlYdkRlSA0KLUVQQ2tLdmJkRGloSnV4S0ENCi1FUENrS3ZiZE5QeFF1bkdzDQotRG9Damp2YmRtdVV6S2pSZg0KLURuYmtLdmJkYlBmZmRMemQNCi1Eb0RMS3ZiZFhybEJOVG54DQotRG9ES2p2YmRaUW1FaG1GUg0KLUVPYmpqdmJkbXR0ekxLUmYNCi1Eb0NrS3ZiZGRpalJ2VXpuDQotRVBETEt2YmRIZmZ5eVlYZw0KLUVQQ2tLdmJkY1RES3RFSmENCi1FUENrS3ZiZHBlY2R0V0FoDQotRG5jS2p2YmRSanhldUdrVA0KLUVQQ2pqdmJkcWRFaHBPVmENCi1FUENqanZiZGVsZlhHbUprDQotRU9ia0t2YmRXV2h3dWRGSA0KLUVQREtqdmJkaGJPYmVYUXENCi1Eb0NrS3ZiZGZmTHluSEhBDQotRG5iamp2YmRwYUpGQVhJRQ0KLURvREtqdmJkcVpQSUdwY3gNCi1Eb0RMS3ZiZG1haXZ4UE9WDQotRG5jS2p2YmRxRmRFc3ZBaA0KLUVQQ2pqdmJkcnBXT2lidkcNCi1FUENrS3ZiZHlmeU1BTWR3DQotRG9ETEt2YmRodVpkdnF0Yg0KLURuY0xLdmJkV1JuWUJlTUQNCi1EbmNMS3ZiZERuY0xLdmJkDQotRU9ia0t2YmRoelVmTHBuRw0KLUVPY0xLdmJkZG9GU2tUdFMNCi1FUERLanZiZGJLbEZvT0RBDQotRG9Da0t2YmRSV21jY0xoRA0KLUVPYmpqdmJkZUFVUWx4SmYNCi1EbmNMS3ZiZEtWdUdFRWZpDQotRU9ia0t2YmRWdmh3dkVFZw0KLUVQRExLdmJkaGFvREV2cVINCi1FUERLanZiZHBmRUZUdkJJDQotRVBDa0t2YmR5emVOcklKSQ0KLURvRExLdmJkR2NrVmlhaWoNCi1FT2JqanZiZG5IRXhOTmZ5DQotRU9ia0t2YmRaTHFkVU9MbQ0KLURvRExLdmJkRHhYa3RUc2wNCi1FT2JrS3ZiZEZWeHBQbUtGDQotRG9ES2p2YmROZGN0SkpMRQ0KLURuYmtLdmJkVFhrTU56angNCi1EbmNLanZiZGJyYmtVRUtCDQotRG9Da0t2YmRHS2VTYmhOVg0KLUVQREtqdmJkWVNrYU10T3gNCi1FUENqanZiZGlHaWNZdWpWDQotRU9iamp2YmRuSEZYbU9HeQ0KLURvREtqdmJkWnlEak5ibFMNCi1FT2NMS3ZiZEdZdHVCRVhiDQotRG5iamp2YmRxR0RlVVdBaA0KLURuYmtLdmJkVHBwbnVWSG0NCi1FT2NMS3ZiZFB5TkFHc1JqDQotRVBDa0t2YmRJcnhhU2x4TQ0KLURuY0tqdmJkQ2ZrZkhBemMNCi1EbmJrS3ZiZElISFp4eFhnDQotRVBDamp2YmRqS0ZoS014Uw0KLUVPY0tqdmJkZWhLdlJuUkgNCi1FT2JqanZiZHhWTWRweU1PDQotRG5iamp2YmRTTFlldGdLcw0KLUVPYmtLdmJkUmp5R1Vma1QNCi1Eb0NqanZiZHd5aEZld2VTDQotRG5jTEt2YmRySkFLRWxuZQ0KLUVQQ2pqdmJkaUdqQ3h2S1YNCi1FUENqanZiZENJamFqaUZqDQotRG9ETEt2YmR1bnN6cUxQVQ0KLURuYmpqdmJkeVNtaGxyQ0gNCi1EbmJrS3ZiZG5Cald4UE51DQotRG9ES2p2YmRsaGRUcVVyQg0KLURvQ2pqdmJkR2RLdkphaksNCi1FT2JqanZiZGt5U3FyeUhVDQotRVBDamp2YmRZa3FkVG1rbQ0KLUVPYmtLdmJkRG5iamtYREUNCi1FUERLanZiZEtES0NxS0RZDQotRU9jTEt2YmRlWVpzdFNGeg0KLUVQREtqdmJkWnlEak5ia3INCi1EbmNMS3ZiZFB5TkFHcnJLDQotRG9Da0t2YmRUbFZvQXVuaQ0KLURuY0tqdmJkRVBDa0t2YmQNCi1FUENrS3ZiZGNUQ2tUY2pCDQotRG5ia0t2YmRjSk5LTEdYWQ0KLURuYmpqdmJkUmtZZlZIS3MNCi1Eb0RMS3ZiZGFhV0VmUVFYDQotRVBES2p2YmRtYkp2d25tdQ0KLUVPY0xLdmJkWnlEaW1jTVMNCi1Eb0RMS3ZiZFlrckVVTmttDQotRG9ES2p2YmRtYWl2d25tdQ0KLURvRExLdmJkcVlvSUhRY3gNCi1FUERLanZiZExyV2x5dVF6DQotRG5jTEt2YmRrQ2trUWdWSA0KLUVPYmpqdmJkclhQbENoeVINCi1Eb0NqanZiZEpUWWFUTXdsDQotRVBDa0t2YmROc1R2SEZWUQ0KLURuYmpqdmJkZUVucWF2Y0sNCi1FUENqanZiZFZ2aHd1Y2VIDQotRVBDa0t2YmRiTE1Gb09EQQ0KLUVQRExLdmJkQ0lrQ0xJZksNCi1Eb0RMS3ZiZGJMTGVubkRBDQotRG5jTEt2YmR5TnJoWVRJYw0KLUVQRExLdmJkTkhDcE5RVWsNCi1EbmJrS3ZiZGRuZHNMVVRyDQotRG5jS2p2YmRhb2dIRGt6ZA0KLUVQRExLdmJkWmpTZ3BHYkcNCi1EbmJqanZiZGFTR0RJVUdMDQotRVBDa0t2YmRqaEdsRmZOaw0KLUVQRExLdmJkYktrZW5tY0ENCi1FT2NLanZiZElISFp5WHhIDQotRG9Damp2YmRpVXlkd1J0Yg0KLUVQRExLdmJkYXVCZ1lLdEkNCi1FUERMS3ZiZFpNU0RzbWxODQotRG9ES2p2YmRkbmVTanRUcg0KLUVQQ2pqdmJkSmJpYnFKYngNCi1EbmJqanZiZEdZdHVBY3diDQotRG9ETEt2YmRzUVZvSmJ2Rw0KLURvQ2tLdmJkeG1yaFhzSWMNCi1Eb0NqanZiZHlOc0h3c0pEDQotRG9Da0t2YmRLV1ZGY2VHaQ0KLURvRExLdmJkc0JmTk1Ha1oNCi1EbmJrS3ZiZEp6b2V3ZEFODQotRVBES2p2YmR3ekhlZllGUw0KLURuYmpqdmJkQmlLYktoZWoNCi1FT2NLanZiZGp1dm1kQ1h3DQotRU9jS2p2YmRiaG1LS2V2eA0KLURvQ2pqdmJkZWhMV1JtcGcNCi1FUENqanZiZEFDcllKekpRDQotRU9jS2p2YmRodVplWFNVYg0KLURvQ2tLdmJkSmNKYnFKY1kNCi1FUERLanZiZFlxTWVKTkVxDQotRG5jTEt2YmRtSkR0UlVxYQ0KLUVQREtqdmJkbkJqV3hPblYNCi1Eb0RMS3ZiZE9FY3RKSWtFDQotRG9Damp2YmREeFlMdFR0TQ0KLUVPY0xLdmJkWm5uSkZGWmoNCi1FT2NLanZiZEtSWmVPZk5lDQotRG9Damp2YmRUdWtwSnRBcQ0KLURvREtqdmJkaHl1R0xwbkcNCi1Eb0RLanZiZGh0ekZXclViDQotRG5ia0t2YmRRY2NCUVJEcg0KLUVQQ2pqdmJkVHVrb2pVQlINCi1FUERLanZiZGVLS1J2VXpuDQotRU9jTEt2YmRlWHpUdFNGeg0KLURuY0tqdmJkeVRPSk5TQ0gNCi1FT2JrS3ZiZGptQmt5ZGZvDQotRVBDamp2YmRlbGV2Zmxpaw0KLURvREtqdmJkWnRKSXhjcm4NCi1Eb0RLanZiZHFpQUplTk9lDQotRG9Damp2YmRkZG5xYXZiag0KLURvQ2pqdmJkWkxyRHRPTU4NCi1FUERLanZiZFp5RUtOY0xyDQotRU9ia0t2YmRNZ0RQbVFWTA0KLUVQQ2pqdmJkeHJtaU1yQmcNCi1FT2JqanZiZFpHdmRBUFNpDQotRVBDa0t2YmR2dmthV0JXVg0KLURuY0tqdmJkZk1ld0hOSmsNCi1Eb0NqanZiZGxyWXR5cmRKDQotRG5jTEt2YmRpTGVEblZDeQ0KLURuYmpqdmJkdndMYVdCV1YNCi1FT2NMS3ZiZFZCQ1JTcHJaDQotRG9ETEt2YmRZemJmU0tWeQ0KLURuYmtLdmJkWHJsQk5VUFkNCi1FT2JqanZiZEtmRmhDQXFWDQotRG9Da0t2YmRWVG1UZWt2Sw0KLUVQRExLdmJkYVNHQ2hUZkwNCi1EbmNMS3ZiZGF1Q0d3anNoDQotRU9iamp2YmRCY3BCV0psZg0KLURuYmpqdmJkWmpUSVFIQ0cNCi1Eb0NrS3ZiZERqSGl1eEtBDQotRU9ia0t2YmRaeGRLTmJsUw0KLURvRExLdmJkcHRUZnJSanQNCi1Eb0RMS3ZiZEpiakNxS0RZDQotRU9jS2p2YmRFSmhLV1lLQQ0KLURuYmtLdmJkc3NTU3laZUQNCi1FT2NMS3ZiZFpzaGh5RVNuDQotRVBES2p2YmRSanhmVWdLcw0KLURuY0tqdmJkd3lnZWZZRXINCi1FUENrS3ZiZGlMZUVPVkN5DQotRG5ia0t2YmRUdkxvalRhUg0KLURvQ2tLdmJkemR6T3pkeXANCi1FUERLanZiZFZVTlVHTVdLDQotRU9iamp2YmRxZEVob25WYQ0KLUVQREtqdmJkS2VmSGJBcVYNCi1EbmNLanZiZHRTcXNZekZEDQotRG9ETEt2YmRaalRJUGdCZg0KLUVQQ2tLdmJkUmp5RnVITFQNCi1FT2NLanZiZFV0TXNmTHZLDQotRG9Damp2YmRuSEV3bG5HeQ0KLURuYmpqdmJkVVJRbnR0Z20NCi1Eb0NrS3ZiZEZmSnJPSXNxDQotRG9ETEt2YmRqS0dJS013cg0KLUVPY0tqdmJkVEFFaUlCbmQNCi1FUERMS3ZiZEZ4dHRhRVhiDQotRG9ES2p2YmRKVFpBc05ZTQ0KLUVQQ2tLdmJkRmVqU05odFINCi1FUERLanZiZHdrWEVIenlmDQotRG5iamp2YmRiVWFmeExUaA0KLURvQ2tLdmJkWlFsZUpORXENCi1FUENqanZiZG1wWnlWa1pDDQotRG5iamp2YmRtSkVVUXVSYQ0KLUVPYmtLdmJkckVGSXBOdWENCi1FT2NMS3ZiZEpwekVuZk5lDQotRG5iamp2YmR5VE5pTXFhZw0KLUVPYmpqdmJkTlFZUXZPSFQNCi1FUERLanZiZEdLZHJiZ21WDQotRU9jTEt2YmRDSktha0llag0KLURuY0xLdmJkbGhjc3B0ckINCi1EbmJqanZiZFppcmhQZmFmDQotRG5jS2p2YmRab05pRkZaag0KLUVPY0xLdmJkanV3TmNhd3cNCi1FT2NLanZiZFV5SVR6TFBPDQotRG5iamp2YmR4Vk1kcHlMbg0KLUVPYmpqdmJkbkNKd1hublYNCi1FUENqanZiZElNQnpuV3FMDQotRU9ia0t2YmRKcHpGT2VuRg0KLUVPYmpqdmJkbGhkVHB1UmENCi1EbmNMS3ZiZFNDRGRraVpMDQotRU9iamp2YmRaeGNpbWNNUw0KLUVPY0tqdmJkeFZNZHFaTG4NCi1Eb0NrS3ZiZHJKQUtGTW5lDQotRU9iamp2YmRYc01BbVVQWQ0KLUVPYmpqdmJkZUZPcWJXYmoNCi1EbmNLanZiZENUQkNzZldyDQotRG9Damp2YmRSeWpIc0N2QQ0KLUVQREtqdmJkeml1UVFEcnQNCi1FT2NMS3ZiZHppdVBvY3J0DQotRVBDa0t2YmRXV2h3dkVFZw0KLUVQQ2tLdmJkZUVvUmF2Y0sNCi1FUENqanZiZFNLeUZ1R2tUDQotRVBDamp2YmRyRUZJb25XQg0KLUVPYmpqdmJkckVGSXBPVmENCi1EbmNLanZiZHpHeU1BTkV3DQotRVBES2p2YmRyUnRqbWphTg0KLURvQ2tLdmJkSmJqRFJLRFkNCi1FT2JrS3ZiZGZORnZnTktMDQotRG5ia0t2YmRaSFdkQVBUSg0KLUVQQ2pqdmJkQ0RvYVdLTWYNCi1EbmNMS3ZiZEpLRUFLUGdFDQotRG5iamp2YmRzc1NUWXlkYw0KLUVPY0tqdmJkSXNZYVROWU0NCi1FUENrS3ZiZGdQYXp2Y3hJDQotRG9Damp2YmRtb3pZdkxZYg0KLURuYmtLdmJkZUFUcU5ZS0cNCi1FT2JqanZiZEl3c2JJTVFwDQotRVBETEt2YmRwc3NmclNLdA0KLUVQQ2tLdmJkaHpVZkxwbWYNCi1FT2NLanZiZE5HY1BscFVrDQotRG5jTEt2YmRoa2VFT1ZEWg0KLUVQREtqdmJkTEZmSUJhUlYNCi1FUENrS3ZiZEp1dUdFRkdpDQotRU9jS2p2YmRSYWNkbEpZaw0KLUVQQ2pqdmJkbWJLV3hPbXUNCi1FUERMS3ZiZHd0bUZReGtuDQotRG5iamp2YmRndnlBenpBSg0KLUVQREtqdmJkTnJzdWdGVlENCi1EbmNLanZiZG10dHpMS1JmDQotRG5ia0t2YmRaeUVLTmNMcg0KLUVPYmtLdmJkeHJtaU5SYWcNCi1Eb0RMS3ZiZGlNRkRuVkN5DQotRU9iamp2YmRXU054QmRsRA0KLURuYmtLdmJkQ1RCRFVGd1MNCi1Eb0RLanZiZFlUTGFNdFBZDQotRU9jTEt2YmRadElpWkRybg0KLUVPYmpqdmJkWXpjR1NKdloNCi1FT2JrS3ZiZENTYURVRnZyDQotRG9Damp2YmRUcHBudVVnbQ0KLURvQ2tLdmJkT1RVVmZkdVENCi1FT2NMS3ZiZGZwQnp3RHdoDQotRG5jS2p2YmRHQlBReUp6bQ0KLUVQQ2pqdmJkVlpJVHlqbm4NCi1FT2JrS3ZiZFZoWHV4R3h6DQotRU9iamp2YmRpaWZIaW1Ycg0KLUVQREtqdmJkdndNQXZBdlYNCi1FT2NLanZiZGtXWE9EYllYDQotRG9ES2p2YmRtYktYWG5uVg0KLURvRExLdmJkWnNpSlpEcm4NCi1Eb0NrS3ZiZGxyWlV6VERpDQotRG9ES2p2YmRTUVRmakdFWA0KLUVPY0tqdmJkcWNkaVBuV0INCi1FT2NMS3ZiZHBzc2dTU0t0DQotRVBETEt2YmRoa2VFTnVDeQ0KLUVQREtqdmJkWlFtRWhtRXENCi1Eb0RLanZiZFp0Skl4Y3JuDQotRG5jTEt2YmRoZ0pieHVqVg0KLURvQ2tLdmJkRG9ES2tYQ2QNCi1FT2JrS3ZiZFpHdmRBT3NKDQotRU9ia0t2YmR3anZkSHp5Zg0KLUVQQ2pqdmJkVVFwb1V1SG0NCi1FUERLanZiZFVHem5NWFZlDQotRG5iamp2YmR1YUVZcm9GSQ0KLURvRExLdmJkZWhMV1JuUkgNCi1Eb0RMS3ZiZGdRQnp3RVlJDQotRU9ia0t2YmRiVWFnWUtzaA0KLUVPYmpqdmJkeXFQTWhpd0ENCi1FUERLanZiZHZ2a2FXQldWDQotRG5ia0t2YmRKVFlhVE5ZTQ0KLURvREtqdmJkWnRJaHhkU24NCi1FT2NMS3ZiZHVhRVpUT2RoDQotRU9iamp2YmRrTkNNWmVHbw0KLUVQQ2pqdmJkWkxxZFRuTG0NCi1Eb0NrS3ZiZFVzbHRGa3VqDQotRG5jS2p2YmRuUHl5VmtaQw0KLURvRExLdmJkd2p2ZEh6ekcNCi1FUENrS3ZiZEdLZHNDZ21WDQotRG5iamp2YmRpTUZEbXRieQ0KLUVPYmpqdmJkZG5lU2p0VVMNCi1EbmNMS3ZiZGV6dlpGSlVYDQotRVBDamp2YmRoYk9jRldxUg0KLURvQ2tLdmJkYU1qYlRWTWcNCi1Eb0RMS3ZiZEhEanZLQ0pqDQotRU9jTEt2YmRweG9JSFJEeA0KLURvREtqdmJkWnNoaHhjcm4NCi1FT2NMS3ZiZGNKTktLZXdZDQotRU9iamp2YmRUcHBudHVIbQ0KLUVQQ2pqdmJkZW1HV2ZtSmsNCi1Eb0NrS3ZiZGpjTGtRZnRnDQotRU9ia0t2YmRRd09EYmtnYw0KLUVQRExLdmJkQ1RBY1VGd1MNCi1EbmJqanZiZHZPc3pwa1BVDQotRU9jS2p2YmRrQ2xMUkhVZw0KLUVPY0xLdmJkTkhDcE1wVkwNCi1FT2JqanZiZFpNUmNzbk1ODQotRG9Damp2YmRweG5nZ1FjeA0KLUVPY0tqdmJkeVRPSk5SYkgNCi1FUERLanZiZGVLS1J1dHpuDQotRG5jS2p2YmRyekxvc0Fnbg0KLUVQREtqdmJkWXpjR1JqV1oNCi1FUERLanZiZFFjYmFQcGRTDQotRG5ia0t2YmR0a3hYQXNhWA0KLURuY0tqdmJkQ0RwQXZLTWYNCi1FUERLanZiZEhFS3ZLQmpLDQotRU9jS2p2YmRmcEJ6dmRZSQ0KLURuY0xLdmJkaWlmSUptWVMNCi1FUERMS3ZiZGRlT3FiV2JqDQotRG5ia0t2YmRaeURpbkRNUw0KLURvRExLdmJka05DTHlkZ1ANCi1FT2NMS3ZiZGRlUFNDV2JqDQotRG5ia0t2YmRaeGNqTmNNUw0KLURvQ2pqdmJkUXdOY2NNSUQNCi1FUERMS3ZiZGlpZWhLTXdyDQotRU9jTEt2YmRDVEJEVUZ3Uw0KLUVQRExLdmJkYkxNR09uREENCi1FT2NMS3ZiZFVNV09hVm5pDQotRG5iamp2YmR5cVBNaGpYQQ0KLURuY0tqdmJkQ1RBYnNld1MNCi1EbmNLanZiZE1wWVF2T0hUDQotRVBES2p2YmRUcVJQVlZJTg0KLURvQ2pqdmJkWnhkSm5DbFMNCi1Eb0NqanZiZFdTTndiRWxEDQotRG5ia0t2YmRyV29rY0l4cQ0KLUVPYmtLdmJkV0lZV1hnWXoNCi1FUERLanZiZHppdG9wRHNVDQotRU9iamp2YmRVVmtvalVCUg0KLUVQRExLdmJkRU9ia0xYQ2QNCi1FT2NLanZiZHJiRm1NSEt5DQotRG5iamp2YmRlaEt1cW1wZw0KLUVPY0xLdmJkWnNoaVljcm4NCi1Eb0NqanZiZFpubklkZVpqDQotRU9jTEt2YmRtdHR6TEtSZg0KLUVPYmpqdmJkR1pVdUJEd2INCi1Eb0NqanZiZEhEanZKYWlqDQotRG5iamp2YmRLUXpGUEdOZQ0KLURuY0tqdmJkUmJEZU1KWWsNCi1Eb0NqanZiZGV6dXlFaHN3DQotRG9ES2p2YmR3a1dkSHp6Rw0KLURuY0tqdmJkRUFTSk15dncNCi1EbmNMS3ZiZHlmeU1BTkV3DQotRVBDamp2YmRDU2FEVGZYUw0KLUVPY0tqdmJkQ0pLYWppR0sNCi1FT2JqanZiZHJKQUtGTk9lDQotRG5iamp2YmRGV1pQb2xqRg0KLURuYmpqdmJkbXBaeVZqeUMNCi1FUERLanZiZGlpZklLTllTDQotRG5jS2p2YmRHQW5xWWl6bQ0KLUVPY0tqdmJkaU1GRU9WRFoNCi1EbmJqanZiZEpYdEJnbFJRDQotRG9Da0t2YmRpakdIaWx3cg0KLURvQ2pqdmJkRHd4TVVVVU0NCi1Eb0RMS3ZiZFVNV1BCVm5pDQotRVBDamp2YmREd3drc3NzbA0KLURuYmtLdmJkTmVEc2hoa0UNCi1FT2JrS3ZiZGJBdWRmUVFYDQotRG5ia0t2YmR3dU1kcVpMbg0KLURuYmpqdmJkaWpHSGpOWHINCi1FUENqanZiZE9GRVRpSWtFDQotRG9Damp2YmR4c09JbVNDSA0KLURvQ2tLdmJkTGlCa3FZQVMNCi1EbmNLanZiZEZrRlRESG1WDQotRG9Damp2YmRkb0VyanN0Uw0KLUVPYmpqdmJkeU9USVhzSWMNCi1EbmNLanZiZGVYelR0U0Z6DQotRG9Damp2YmRxZEZJb25XQg0KLUVQRExLdmJkTXBZUldOZ1QNCi1Eb0RMS3ZiZGZOR1hITkprDQotRVBDamp2YmRlUEVya1Rzcg0KLURvQ2pqdmJkTkhDcE5RVkwNCi1FT2JqanZiZHNRVm5qQ3VmDQotRG5iamp2YmR0Y0RVd1dQUA0KLURvQ2pqdmJkdWFEeVNuZGgNCi1FUERLanZiZHFaUElHcUR4DQotRU9iamp2YmRpakZnaW1ZUw0KLURuY0tqdmJkWnlFSm1ibFMNCi1Eb0RLanZiZGlyemlTa0p6DQotRG5jTEt2YmRlT2VUS3RUcg0KLUVPY0tqdmJkZnBCendFWUkNCi1EbmJrS3ZiZGV6dlpGSXRYDQotRVBDamp2YmRyUnVMT0thTg0KLURuY0xLdmJkYnJianNjakINCi1FT2JrS3ZiZGRCcmxyQVVODQotRVBES2p2YmRab09JZGVaag0KLUVPY0tqdmJkR1l1VWFFWUMNCi1FUENrS3ZiZE54UFZ6ZE50DQotRU9jTEt2YmRobEZEbXVEWg0KLURuY0tqdmJkS1Z0ZWNkZ0oNCi1FUERMS3ZiZHFsekp4a2hKDQotRU9jS2p2YmR5U21obHFiSA0KLUVQQ2tLdmJkeHNOaU5SYWcNCi1FUERLanZiZFRZS2ttemp4DQotRU9ia0t2YmRJcnlCVE14TQ0KLUVQRExLdmJkeG5TaFhzSWMNCi1FUENqanZiZGFTRmJoVUdMDQotRU9iamp2YmRSRGJhUVFkUw0KLUVPYmtLdmJkcmJGbU1Ha1oNCi1FUENrS3ZiZFdYSlh1ZEVnDQotRU9jTEt2YmRjSk5LS2ZYWQ0KLURuY0tqdmJkRXV4cFBsakYNCi1EbmNLanZiZGRDVE5TQVRtDQotRU9jTEt2YmRGVnlRUG1LRg0KLUVQQ2tLdmJkcGVjZVVXQkkNCi1Eb0RMS3ZiZFZUbVVHTVdLDQotRG9Damp2YmRGeVZWQkVYYg0KLUVPY0xLdmJkVHVrcEtUYVINCi1EbmNMS3ZiZERITGVnQXpjDQotRVBDamp2YmRkeFp0VHJGeg0KLURuY0tqdmJkc3NSc1paZUQNCi1Eb0RLanZiZGVPZVNqc3RTDQotRG9ES2p2YmRRZERBcFFjcg0KLURuY0xLdmJkVVJRb1V1SU4NCi1EbmJrS3ZiZGV6dXhkaVVYDQotRVBDamp2YmRiUGdIRGt6ZA0KLUVPY0tqdmJkRldaUVFNakYNCi1Eb0RLanZiZE1mY1FNb3RrDQotRVBDamp2YmRyV29rYmlZcQ0KLURvREtqdmJkbkdkd21PR3kNCi1FT2NLanZiZG5CalhZT211DQotRU9jTEt2YmREb0NqanZiZA0KLURvRExLdmJkc1FWb0pidWYNCi1FT2JrS3ZiZFppcmhRSEJmDQotRVBDa0t2YmRJR2daeHd3Zw0KLURuY0xLdmJkck16S1pNSUoNCi1EbmJrS3ZiZGtIZmxGZW1rDQotRU9ia0t2YmRmSGtXU09SSA0KLURuYmtLdmJkd3lnZkdZRXINCi1FT2NLanZiZHhtcmd4VEpEDQotRG5iamp2YmRHZExWaWFpag0KLURvREtqdmJkbVNZdHlzRUoNCi1FT2JrS3ZiZGZJTFZxbXBnDQotRG5jTEt2YmRBRFNYaXpJcA0KLURvQ2pqdmJkem5wUWRia3gNCi1EbmNMS3ZiZG1iS1d4T25WDQotRVBDa0t2YmRKdlVmRUVmaQ0KLUVPY0xLdmJkY1NjTFRkSmENCi1EbmJqanZiZFFjYmFQcGRTDQotRVBES2p2YmREb0RLanZjRQ0KLURuY0tqdmJkaHpVZk1ST0cNCi1EbmNLanZiZGJyY0t0RGlhDQotRU9jTEt2YmRKcHlkb0ZtZQ0KLURuYmpqdmJkeExXZEh6eWYNCi1FUENqanZiZHd1TWVReU1PDQotRU9jTEt2YmRpaWZIaW1Ycg0KLUVPY0xLdmJkeVNtaU5TQ0gNCi1FUENqanZiZHpub3BlQ2t4DQotRVBETEt2YmRac2hoeUVTbg0KLURvRExLdmJkckRlSlFOdkINCi1Eb0RMS3ZiZElMYXpuWFFrDQotRG9Damp2YmRuVXR6S2lxZg0KLURuYmtLdmJkakplaEtNd3INCi1FT2NMS3ZiZER4WGxVVVVNDQotRG9Da0t2YmR0U3FzWXllRA0KLURvREtqdmJkeFZNZVF4bE8NCi1FUERMS3ZiZFpqVEhvZmFmDQotRU9ia0t2YmRaaXNIb2dCZg0KLURuYmtLdmJkbkJpd1hvT1YNCi1Eb0NrS3ZiZFlTa2FNdFBZDQotRG5jTEt2YmRIRUxWaWJLSw0KLUVQQ2tLdmJkaGxFY25WQ3kNCi1FUENrS3ZiZFpMcWRUbk1ODQotRG9ES2p2YmRic0NrVUVLQg0KLUVQQ2tLdmJkTXBZUlZuSFQNCi1FT2NMS3ZiZEZXWlFQbGpGDQotRG9ETEt2YmR6bm9xRWNMeA0KLURuYmtLdmJkY0ltSmpld1kNCi1FUENrS3ZiZHZ2bEJWYVdWDQotRG9Da0t2YmRtSWRUcVVyQg0KLURuY0tqdmJkeFpnZWV4RlMNCi1FT2NMS3ZiZHJvdW9KYnZHDQotRG9Da0t2YmRXUm5ZQmRsRA0KLURvQ2tLdmJkQmhqYkxKRmoNCi1EbmJqanZiZHJvdW9LRFdHDQotRG9ES2p2YmRVeGdzeWpubg0KLURvRExLdmJkYWtNRm5uREENCi1FT2NMS3ZiZFp0SkpZY3NPDQotRG5jTEt2YmRyYkZsbEhLeQ0KLUVQQ2pqdmJkbWFqWFhubXUNCi1EbmNMS3ZiZHB5UEhnUWRZDQotRU9iamp2YmR5TnJnd3NKRA0KLUVQQ2pqdmJkYU1qYXJ1TWcNCi1EbmNMS3ZiZFlmd0VBUFRKDQotRG9ES2p2YmRiaU5LTEZ2eA0KLURvQ2pqdmJkYWprZk9uREENCi1FT2JqanZiZFpvT0pFZVpqDQotRU9jS2p2YmRxWk9oR3FFWQ0KLUVPY0tqdmJkeml1UG9kVFUNCi1Eb0RLanZiZHVMeFdhVUJYDQotRU9ia0t2YmR5WGhqQm95aw0KLURvREtqdmJkVGt1bmFXUEoNCi1FT2JrS3ZiZEJyYUNzZlhTDQotRG9ETEt2YmRUQUVpSUNQRQ0KLURuYmtLdmJkRGpIalZ3akENCi1FT2NLanZiZHFsektaTGhKDQotRU9ia0t2YmRkbmVUTFRzcg0KLUVPYmtLdmJkV1Jtd2FlTUQNCi1Eb0RMS3ZiZExCTEhOQndxDQotRG9ETEt2YmRVeGhVWmtQTw0KLURuY0tqdmJkWWxTRHNta20NCi1Eb0NrS3ZiZHhaaEdGd2RyDQotRU9iamp2YmRic0RLc2RKYQ0KLUVQQ2tLdmJkR1l1VkFkWUMNCi1FT2JrS3ZiZFJYTmNjTGhEDQotRG5iamp2YmRGVnhwUU1qRg0KLURvRExLdmJkTWdEUU5QdGsNCi1FT2JrS3ZiZFF2bWNjTUhjDQotRG5jS2p2YmRNcFhxVm5IVA0KLURvQ2pqdmJkZFp4b3hZcUMNCi1EbmNLanZiZG5WVXpLalJmDQotRG9Damp2YmRFdXlRUG1LRg0KLURvREtqdmJkTFlxS1N6dUcNCi1FUERMS3ZiZFRBRkpJQ09kDQotRG9Damp2YmRDSkxDS2lGag0KLUVPY0xLdmJkRnlWVkFjd2INCi1Eb0NqanZiZGJRSEhEa3pkDQotRG9Da0t2YmROcnN2R2R1UQ0KLURuYmpqdmJkUldtY2JsSUQNCi1EbmJrS3ZiZFF2bkVETGdjDQotRG5iamp2YmRWWklUektubg0KLUVQRExLdmJkeHhKSmFveWsNCi1FT2JrS3ZiZGRvRXNMVVRyDQotRG5jTEt2YmRaUWxkaGxkcQ0KLURvRExLdmJkZENTbVNBVU4NCi1Eb0RMS3ZiZFlwbGRobGRxDQotRG9ETEt2YmREeFhsVVRzbA0KLUVQQ2tLdmJkbkdkeE1tZnkNCi1EbmNLanZiZHdXbEJXQXV1DQotRU9jTEt2YmRrRE1LcGdVZw0KLURvRExLdmJkWnNoaVlkU24NCi1FUERMS3ZiZGhmakN5V0tWDQotRU9iamp2YmRLUlplT2VtZQ0KLURvQ2tLdmJkem5vcGRjTHgNCi1FUENrS3ZiZFpNU0Rzbk1ODQotRG5ia0t2YmRrV1dtY2JYdw0KLUVPYmpqdmJkcHhvSGZxRVkNCi1EbmJrS3ZiZHRsWVhBc2FYDQotRVBETEt2YmRqdlhOY2F3dw0KLUVQRExLdmJkdUREVlhWb1ANCi1Eb0RLanZiZExHRmdiQlF1DQotRU9iamp2YmRtdVV6TEtSZg0KLUVPYmpqdmJkUmFjZU1JeUwNCi1FUERMS3ZiZGlIS0N5VmpWDQotRG9Da0t2YmR4blRId3JpRA0KLUVPY0xLdmJkWmpUSVBnQ0cNCi1EbmNMS3ZiZEJjcEJWak5HDQotRVBETEt2YmRWd0l4VmNlSA0KLURvQ2tLdmJka0lHa2VlbWsNCi1EbmJrS3ZiZG96bWRLeFBBDQotRG9ES2p2YmRqdXdOZENYdw0KLURvQ2tLdmJkZUVvU0NYQ2oNCi1FUENrS3ZiZGNTY0t0RUphDQotRVBETEt2YmR5U25JbHJCZw0KLUVQQ2pqdmJkblFaeVZrWWINCi1Eb0RMS3ZiZHFZbmdnUkVZDQotRU9ia0t2YmRCc0JEVUdYUw0KLURuYmtLdmJkVVdMb2l0QXENCi1Eb0NrS3ZiZElHZ1p4eFlIDQotRG9ETEt2YmR2d0xhV0JWdQ0KLUVPYmpqdmJkbWZlWGxuSFoNCi1FUERMS3ZiZFJYTmRETUlEDQotRVBDamp2YmRaTHJEc21rbQ0KLUVPY0tqdmJkVVFwb1V1SG0NCi1EbmJrS3ZiZEV6c3FGTURKDQotRU9jTEt2YmRRbHdheU9Veg0KLUVQREtqdmJkeXpkblJoSkkNCi1Eb0RMS3ZiZHd6SGZHWGVTDQotRU9jS2p2YmRUdk1QaXRCUg0KLUVPY0tqdmJkSmJpY1JKY1kNCi1Eb0RMS3ZiZEZWeHBRTkplDQotRG9ETEt2YmR1THhYQlRhWA0KLURvQ2pqdmJkTFlwaXJ6dUcNCi1EbmJqanZiZHZ3TUF2QldWDQotRVBDa0t2YmRCaUtiS2lGag0KLURuY0xLdmJkSXJ5QXJtWU0NCi1EbmNLanZiZHlTbWlOUmFnDQotRG5jS2p2YmRlRW9SYldiag0KLURvRExLdmJkanV3T0VDWHcNCi1FUERMS3ZiZEZXWlBvbUplDQotRU9ia0t2YmRqY01MUkd0Zw0KLURuY0xLdmJkUXdOY2NNSGMNCi1FUERMS3ZiZHpRb01pSndBDQotRG9ES2p2YmRtU1l0elNkSg0KLUVPY0xLdmJkZWxmV2dNakwNCi1FT2NMS3ZiZGlNRkVOdUN5DQotRVBDa0t2YmRlenZaRWhzdw0KLUVQRExLdmJkVVZsUGlzYVINCi1FUERLanZiZGJLbEdPbWNBDQotRU9ia0t2YmR6R3lNQU5Fdw0KLURvREtqdmJkWEZ4elVBUFQNCi1FUERMS3ZiZHFyVWtOa0FtDQotRU9jS2p2YmRQeG1BR3NTSw0KLUVPY0xLdmJkeWZ5TUFNZVgNCi1FT2JqanZiZHVERFV3Vm9QDQotRG5jTEt2YmR5WUpKYlFaaw0KLURvRExLdmJkeFZORXFZa24NCi1FUENqanZiZE5QeFJXT0hUDQotRU9ia0t2YmRZcU5FaU5FcQ0KLUVQREtqdmJkWHJsQWxzb1kNCi1FUERMS3ZiZGJyY0t0RUphDQotRU9iamp2YmRHZEt2SmJKag0KLURvQ2pqdmJkckRlSlBuVmENCi1Eb0RLanZiZFpMckVUbk1ODQotRG9ES2p2YmRLVnVHRGVHaQ0KLURvQ2tLdmJkWnRKSXlFVE8NCi1FT2JqanZiZFlTbEFsc29ZDQotRG9ETEt2YmRDU2FEVUdXcg0KLUVPYmpqdmJkbWZlWU5OZ1oNCi1Eb0RLanZiZHR1bXdpcVRBDQotRG5jS2p2YmRxRmRFdFdBaA0KLUVQQ2tLdmJkYXVDSFhqdEkNCi1EbmJqanZiZHZPc3pxS29VDQotRU9jS2p2YmR4cm5JbVNCZw0KLURvQ2tLdmJkanZXbWRCd3cNCi1FUENqanZiZG11VXpLaXFmDQotRU9iamp2YmROZGNzaUlqZA0KLUVPY0xLdmJkTlB4UlZuR3MNCi1FT2JrS3ZiZFNQc2dLRmRYDQotRVBETEt2YmRWQWJRc1FxeQ0KLUVQREtqdmJkVlpIc3lqb08NCi1EbmNLanZiZEp6b2ZYZEFODQotRU9ia0t2YmRGamVUQ2hOVg0KLURuYmpqdmJkakplZ2pOWHINCi1EbmJrS3ZiZFpMckRzbkxtDQotRG5iamp2YmRiQXVlR1FRWA0KLURuY0xLdmJkUWNiYVFRZFMNCi1EbmJqanZiZEZqZHJiZ2x1DQotRG5jTEt2YmRBTWd4c1d5eA0KLURuYmpqdmJkUnBVSEtHRHcNCi1EbmNMS3ZiZE1mY1BscFZMDQotRU9iamp2YmRJd3RCaE1SUQ0KLUVQQ2tLdmJkZWxmWEdtS0wNCi1Eb0RMS3ZiZEZrRXJiaE11DQotRVBDamp2YmRIZmZ5eVlYZw0KLURvREtqdmJkT0VjdEpJa0UNCi1Eb0NrS3ZiZEtrQWd2QUtaDQotRU9iamp2YmR6aXRvcERzVQ0KLUVQQ2pqdmJkUnBVSEpmRVgNCi1Eb0NrS3ZiZFpMckR0TmttDQotRVBDa0t2YmRpakdJS05Ycg0KLURvQ2pqdmJkeFVtRXB4bE8NCi1EbmJqanZiZEl4VGJJTVJRDQotRVBDa0t2YmRNZmJwTW90aw0KLURuY0xLdmJkamxiTHpGR28NCi1FT2JrS3ZiZHJSdGtOamFODQotRG5ia0t2YmRSb3NnS0Zjdw0KLUVQRExLdmJkcGZEZVVXQWgNCi1EbmJrS3ZiZGt4c1JyeUhVDQotRVBDa0t2YmRrVnZtY2JYdw0KLUVPY0tqdmJkaGZpY1pXSnUNCi1FUERLanZiZENFUUJXS01mDQotRG9Damp2YmRVeUlUektvTw0KLURuYmpqdmJkYU5LYlN0bUgNCi1FUERMS3ZiZEZXWXBRTWllDQotRU9iamp2YmRoeXRla3FOZg0KLUVPYmpqdmJkZVh5c3NxZXoNCi1EbmJrS3ZiZExBamdOQ1lSDQotRG5jS2p2YmRTQmRGTGlaTA0KLUVQREtqdmJkQmhrQmppR0sNCi1Eb0RLanZiZG1hald4T211DQotRG9Damp2YmRyTXpKeU1IaQ0KLURvREtqdmJkWkxxY3RPTU4NCi1FT2NLanZiZG5Qell1anhiDQotRG5jS2p2YmRkb0ZUS3N0Uw0KLURuY0xLdmJkamNNTFJHdUgNCi1Eb0NrS3ZiZGJVYWdZS3RJDQotRG5jTEt2YmRWQWFxVFJTWg0KLUVQQ2pqdmJkT0VkVGlKTEUNCi1FUENqanZiZEp2VWZFRkhKDQotRG5iamp2YmRJcnlCVE5ZTQ0KLUVQREtqdmJkWXBsZUpORXENCi1EbmNLanZiZFpHd0VBT3JpDQotRG5jTEt2YmRCZFFBdkptRw0KLURvQ2tLdmJkbUlkVHFVcWENCi1FUENrS3ZiZHRjQ3VXdW5vDQotRVBDamp2YmRtdVV5ampTRw0KLURuY0xLdmJkakFRSEFwSEsNCi1FUENqanZiZEdkS3VqQmpLDQotRVBES2p2YmRZa3JFVG1sTg0KLURuY0tqdmJkWU9SQVlVdXQNCi1EbmJrS3ZiZGlIS0N4dkp1DQotRVBDamp2YmRrSGdMZkdPTA0KLURvQ2pqdmJkcHNzZnFxa1UNCi1FUERLanZiZFpubWhlRXpLDQotRVBETEt2YmR5U21obHJDSA0KLUVQQ2tLdmJkakplZ2lseFMNCi1Eb0NrS3ZiZHFjZGhwTnVhDQotRVBES2p2YmRJSEhaeVh4SA0KLURuYmpqdmJkam1Ca3lkZ1ANCi1Eb0NqanZiZFlrcWNzbkxtDQotRVBDa0t2YmRabm1oZGVaag0KLUVQRExLdmJkRGpJSnV3akENCi1FT2NMS3ZiZG5RWnh2S3lDDQotRVBDa0t2YmRCaGtDS2lHSw0KLURuYmpqdmJkWWtyRHNuTU4NCi1EbmNMS3ZiZHl6ZU5xZ2hoDQotRG5jTEt2YmRyUnVLbWphTg0KLUVQQ2pqdmJkc3NSc1l6RWMNCi1Eb0RMS3ZiZFpRbGVKTkZSDQotRU9iamp2YmRaUWxlSk1lUg0KLUVQREtqdmJkdHZOeEpxVEENCi1FT2JqanZiZGJCV0ZHUHBYDQotRVBETEt2YmRhamtlb09EQQ0KLUVQRExLdmJkU1ppaFRDdkENCi1FT2JrS3ZiZFpNUmRUbk1ODQotRVBDa0t2YmRzQ0ZtTGdLeQ0KLUVPYmpqdmJkVnZoeFZjZUgNCi1FUENrS3ZiZGFhVmVGcFFYDQotRG9Damp2YmRaUW1FaGxlUg0KLUVPY0tqdmJkaHpVZkxwbWYNCi1FUENrS3ZiZFJFREJRUkRyDQotRG5jTEt2YmRlbUZ3SE5Kaw0KLUVPY0tqdmJkR0FucVlpem0NCi1EbmNMS3ZiZHRUUnNaWmRjDQotRG9ETEt2YmRHR0tSbWh0Ug0KLURvRExLdmJkSWlkQUpvZ0UNCi1Eb0NrS3ZiZHhaaEdGeEVyDQotRG5jTEt2YmRweG9IZ1JFWQ0KLURuYmpqdmJkUWNiYVFSRVMNCi1FUERLanZiZGpBUGZhUGdLDQotRVBDa0t2YmR2d01BdWFXVg0KLUVPY0tqdmJkWkxyRHNuTU4NCi1EbmNLanZiZHlxT2xoaXdBDQotRU9ia0t2YmRSYWNka2lZaw0KLURvREtqdmJkVVdNUUpzYVINCi1FUERLanZiZFVHem1rdnZGDQotRG9Damp2YmRoYlBERlhSUg0KLUVPYmpqdmJkWEdaWnRBUFQNCi1FUENqanZiZE1veFJXTmdUDQotRU9jS2p2YmRHRmlxbWh0Ug0KLURvQ2tLdmJkTlB4UldOZ1QNCi1FT2JrS3ZiZHlOcmd4VEpEDQotRVBES2p2YmRyWFBrY0pZcQ0KLUVPY0xLdmJkRmplVENoTXUNCi1EbmNLanZiZGp2WE5jYXd3DQotRG5jS2p2YmRrTWJNWmRnUA0KLUVPY0tqdmJkRG5ia0xYREUNCi1FT2JqanZiZGJCV0ZHUG93DQotRG9Damp2YmRBTWhaU3daeA0KLUVQRExLdmJkWlJORWlNZVINCi1Eb0RLanZiZHFkRWlRTnZCDQotRG9Da0t2YmRkZVBSYXZiag0KLUVQREtqdmJkYU1qYlN0bGcNCi1FT2JrS3ZiZEhnR3l4eFlIDQotRU9jS2p2YmR0a3hYQlVBdw0KLURuYmpqdmJkbVNaVXlzRUoNCi1FT2JrS3ZiZHJYUUxiaHhxDQotRU9ia0t2YmRWVGxzZk1XSw0KLURvREtqdmJkU0xaR1VmanMNCi1Eb0NrS3ZiZEZWeVBwTWpGDQotRG9Damp2YmRoZ0tDeVZpdQ0KLUVQQ2tLdmJkWk1TRHRPTG0NCi1FUENqanZiZHlTbWhscWFnDQotRVBES2p2YmRXUm13YWRsRA0KLUVQQ2pqdmJkcVpQSGZwZFkNCi1Eb0RMS3ZiZFhzTUJNc29ZDQotRG5jTEt2YmRlbGV3SE1qTA0KLUVPYmpqdmJkWXBsZUltRXENCi1Eb0RLanZiZFppcmdvZ0JmDQotRU9jTEt2YmRyWFBsQ2h4cQ0KLUVQQ2tLdmJkRlZ4cFFNaWUNCi1Eb0NrS3ZiZHJOWmpaTUhpDQotRU9jS2p2YmREaklKdXhLQQ0KLURuY0xLdmJkZU9lU2tUc3INCi1Eb0NqanZiZFpvTmhkZHlqDQotRG9ES2p2YmRrV1hOY2F4WA0KLURvRExLdmJkVHBxT3R0aE4NCi1EbmJqanZiZGVoS3VxblFnDQotRVBDamp2YmRtZ0ZYbG1meQ0KLURuY0xLdmJkU2h5aXFBQWwNCi1FT2NLanZiZEthS2dOQndxDQotRVBES2p2YmRFenRSRWtiaQ0KLUVPY0tqdmJkVnZpWHZFRkgNCi1FUERLanZiZGNJbGlrR1d4DQotRVBDa0t2YmRVV0xvalVBcQ0KLUVQRExLdmJkT1N0V0hFdHANCi1Eb0NqanZiZEhsQnptd1JMDQotRG5iamp2YmRXSVlWeEhZeg0KLUVQRExLdmJkQURTWGpaaHANCi1FUERLanZiZFJ6SmdyY1dBDQotRU9ia0t2YmR4cm5JbHFhZw0KLUVPYmpqdmJkUm9zZ0tGY3cNCi1Eb0RLanZiZGt5U3JUWWdVDQotRG5jS2p2YmRzcnFyeHlkYw0KLUVQRExLdmJkWnlFS09ETHINCi1FUENqanZiZEVYeE1VVVRsDQotRU9jS2p2YmR0Y0N0d1dPbw0KLURuY0xLdmJkZG5kcmtUdFMNCi1FUERLanZiZHJhZk1rZmp5DQotRVBDamp2YmRKY0picGlieA0KLUVPYmtLdmJkRmZKcW5Jc3ENCi1FUENrS3ZiZHlOc0h3cmlEDQotRG9Damp2YmRhUmViZ3NmTA0KLURuYmpqdmJkdW9UenBqbnQNCi1FUENqanZiZFpHdmRBT3NKDQotRG9ES2p2YmRtb3pZdWp5Qw0KLUVQREtqdmJkWkd2ZEFQU2kNCi1EbmJqanZiZG1TWXR6VERpDQotRG9Damp2YmRSb3RHakZkWA0KLUVPYmtLdmJkU0JjZUxoeGsNCi1Eb0NqanZiZGRpalJ2VXpuDQotRU9ia0t2YmRNZ0RRTlB0aw0KLURvQ2tLdmJkRlZ4b29tS0YNCi1EbmNLanZiZEdjanVqQmpLDQotRVBES2p2YmRCY3BBdkpsZg0KLURuY0xLdmJkTEJMSE5DWVINCi1FT2JrS3ZiZG1JY3RRdHJCDQotRG9ETEt2YmRGcEFUWEdleQ0KLUVQQ2tLdmJkYnJia1VEakINCi1EbmNMS3ZiZGNUQ2p0RUphDQotRG5jTEt2YmRCc0Fic2ZYUw0KLUVQREtqdmJkRnBBVFhHZloNCi1Eb0RLanZiZHd1TWVReGxPDQotRU9ia0t2YmRxVVVHcXJLdA0KLURuY0tqdmJkWnlFS09ETHINCi1FUERLanZiZGpoSExlZk5rDQotRVBDa0t2YmRyYkZtTUdqeQ0KLURvQ2tLdmJkc1FXT2pDdkcNCi1Eb0NqanZiZExCTEhNYlhxDQotRU9iamp2YmRycFZuaWNWZg0KLUVQQ2pqdmJkVnFtd2FlTUQNCi1EbmNMS3ZiZFJOWUNZblV6DQotRU9iamp2YmRSWE5kQ2toRA0KLURuY0tqdmJkSUhIWnlZWGcNCi1EbmJqanZiZHlUT0pNckNIDQotRG9ETEt2YmRVc21VRmt1ag0KLURuY0tqdmJkUWNiYVBxRVMNCi1EbmJrS3ZiZG1nRllOTmdaDQotRU9jS2p2YmRreVNyVFlnVQ0KLURvQ2pqdmJkSGxCem13UWsNCi1EbmJqanZiZGFTRmNJVGVrDQotRU9iamp2YmRRZENhUHFEcg0KLURuY0tqdmJkeFZNZHB5TG4NCi1FT2NLanZiZGlNRWRPVkN5DQotRG9Damp2YmRSb3NnSmVjdw0KLURuY0xLdmJka0RNTFFmdGcNCi1FUENrS3ZiZEtES0NxS0RZDQotRG9Damp2YmRqdlduRGF3dw0KLUVPY0xLdmJkdVZuWUpwc0ENCi1Eb0RMS3ZiZFdSbllCZGxEDQotRG9ES2p2YmRzc1NTeHpGRA0KLUVQRExLdmJkSllUYWdsUlENCi1FT2NMS3ZiZGh6VWZMcG1mDQotRG9ETEt2YmRKdXRmRGRnSg0KLUVPY0tqdmJkeG1yZ3dyaGMNCi1FT2JrS3ZiZHdXa2FWYVZ1DQotRU9jS2p2YmR4cm1pTXJCZw0KLURvREtqdmJkUkRjQXBSRVMNCi1Eb0NqanZiZGRqSnJWdHpuDQotRU9jS2p2YmR4Vk5FcVlsTw0KLURvQ2pqdmJkSkpkQUpvZmQNCi1Eb0RMS3ZiZGVtR1dmbUprDQotRU9jS2p2YmRuUHl5V0t5Qw0KLURvQ2pqdmJkYnJjTFRjaWENCi1Eb0RLanZiZGp1dm1kQ1h3DQotRG5jTEt2YmR0a3d2YVVBdw0KLUVPY0tqdmJkSERrVmlhaWoNCi1FT2JrS3ZiZFJEYmFQcGNyDQotRU9jTEt2YmR0U3FyeVplRA0KLUVPY0tqdmJkclJ1TE9LYU4NCi1FT2NLanZiZGN6WW93eVJDDQotRG5ia0t2YmRqY01MUWZ1SA0KLURuY0tqdmJkbWJKd1lPblYNCi1FUERMS3ZiZFpubWlGRXpLDQotRVBES2p2YmRqYmtrUWdWSA0KLUVPYmtLdmJkSlRaQXJtWU0NCi1EbmNLanZiZFNQc2dKZkVYDQotRG5jTEt2YmR1TVlYQlVCWA0KLUVPYmtLdmJka0lITUZmT0wNCi1FT2NLanZiZFlPUkFZVldVDQotRG9Damp2YmR5emRtcWdoaA0KLURuY0xLdmJkdHVtd2lxVEENCi1FUERLanZiZFFtWUNaT1V6DQotRG9Damp2YmR0Y0N0dnZQUA0KLUVPYmpqdmJkVlRtVUdNVmoNCi1FT2JrS3ZiZEJzQWNVR1hTDQotRG9Damp2YmRxWW5nZnFEeA0KLUVQQ2tLdmJkdGt4WEJUYVgNCi1Eb0RMS3ZiZEFDcXdpeWhwDQotRG5jS2p2YmRyYWVsa2dLeQ0KLUVQREtqdmJkdUx3dmFVQlgNCi1EbmNLanZiZHBzc2dTU0xVDQotRVBDamp2YmRJeFRiSGxSUQ0KLUVQREtqdmJkUHlOQUdycWoNCi1Eb0RMS3ZiZG5DSnZ4T25WDQotRU9ia0t2YmRaUk5GSk5FcQ0KLURvQ2pqdmJkRnh1VkJFWUMNCi1FT2NLanZiZFZBYlJTcHF5DQotRG5iamp2YmRKYmlicUtEWQ0KLURvRExLdmJkS0NpY1FqQ3gNCi1FUENqanZiZE5ydFZnRlVwDQotRU9jTEt2YmRaUWxlSk5FcQ0KLURvRExLdmJkYVJlYmdzZkwNCi1Eb0NrS3ZiZENJamFrSWVqDQotRU9jTEt2YmRCcmFEVUdXcg0KLUVQRExLdmJkQURSeEtaaVENCi1Eb0NqanZiZEhrYXptdnBrDQotRVBES2p2YmRVc2x0R0x2Sw0KLUVPY0tqdmJkVGt2T2FWb0oNCi1EbmNMS3ZiZFpubWlFZHlqDQotRG9ES2p2YmRadEpKWWRTbg0KLURvRExLdmJkYmlOSmpmV3gNCi1EbmJqanZiZElzWkJUTllNDQotRVBDa0t2YmRoYlBERXZwcQ0KLURuY0tqdmJkcWx5allsSUoNCi1Eb0NrS3ZiZGJzRExUY2lhDQotRG9ES2p2YmRLQ2pDcUtDeA0KLURvRExLdmJkbkJpd1lPbXUNCi1EbmJrS3ZiZGpLR0lLTXdyDQotRVBDamp2YmRIZ0d5eHhZSA0KLUVPY0xLdmJkY3l4cFh4cUMNCi1EbmNMS3ZiZGxaU3JTeUd0DQotRVBDamp2YmRUQUZJaENQRQ0KLUVPYmtLdmJkWmR3ZnpnaUMNCi1Eb0RMS3ZiZFNMWWZVZ0xUDQotRG9Damp2YmRSTXdheU50eg0KLURuYmpqdmJkQ2ZsR0hBemMNCi1Eb0NqanZiZHJKQUtGTk9lDQotRVBDamp2YmRqYmxLcGdVZw0KLUVQRExLdmJkUWNjQW9xRHINCi1EbmJqanZiZENKS2JLaGZLDQotRVBETEt2YmRpR2lieVdKdQ0KLUVPY0xLdmJkeU5zSHhTaGMNCi1FUERMS3ZiZG1JY3NwdVNCDQotRG5iamp2YmRuR2R4Tk9IWg0KLURvQ2tLdmJkaHpWR01STmYNCi1Eb0RMS3ZiZGVGUFJhd0RLDQotRU9iamp2YmRzUVdPakN2Rw0KLUVPYmtLdmJkaHpVZWxRbWYNCi1FT2JrS3ZiZGVKaXJXVXpuDQotRG5jTEt2YmR4eElpYlB6TA0KLUVPYmtLdmJkU0JjZU1JeGsNCi1Eb0NrS3ZiZGVoS3ZSbXFIDQotRU9iamp2YmRSYkRlTGlaTA0KLUVPYmpqdmJkR1l0dUFkWUMNCi1EbmJqanZiZEhEa1ZpYktLDQotRG9Damp2YmRLUXllT2ZOZQ0KLURvQ2tLdmJkbWJKdnhPbXUNCi1Eb0NrS3ZiZFVMdk9hV1BKDQotRG5jTEt2YmRyV3BNQ2laUg0KLUVPYmpqdmJkaHl0ZkxxTmYNCi1Eb0NqanZiZGdQYXp2ZFhoDQotRG9Damp2YmRpSEtEWXVpdQ0KLUVQREtqdmJkUlduRGJraEQNCi1EbmNMS3ZiZHJNektaTGhKDQotRU9ia0t2YmR5WGhpYW95aw0KLUVQQ2tLdmJkam1DTHlkZm8NCi1EbmJrS3ZiZER4WU1VVHNsDQotRVBES2p2YmR4bXJneFNpRA0KLURuYmtLdmJkbVNZdHlyY2kNCi1FUENqanZiZHF2b2tjSXhxDQotRG9ETEt2YmRYc01BbVVQWQ0KLURuY0tqdmJkRG9ES2tXY0UNCi1FUENrS3ZiZE1nRFBtUVVrDQotRG9ETEt2YmRLeVFpcnp0Zg0KLUVQQ2pqdmJkbWFqV3dubXUNCi1FT2NMS3ZiZGRDU2xyQVRtDQotRVBETEt2YmRySkFLRWxuZQ0KLURvQ2tLdmJkSXNaQlRNeE0NCi1EbmJrS3ZiZGZmTVpuR2dBDQotRU9jS2p2YmRKY0tEUWpEWQ0KLUVPYmpqdmJkeHNPSk1yQ0gNCi1FT2JrS3ZiZEVLSGl1d2pBDQotRG5jS2p2YmR1bnN6cGpudA0KLURvRExLdmJkWmpUSVFIQ0cNCi1EbmJqanZiZHNRVm5pYnZHDQotRG5ia0t2YmRHUUFUWEhHWg0KLURuYmtLdmJkQnNCRFRmWFMNCi1Eb0NrS3ZiZEJzQWJzZXZyDQotRG9Da0t2YmRSWE5kRExoRA0KLUVQQ2pqdmJkUmFkRWxKWkwNCi1EbmJrS3ZiZHh3aGliUHpMDQotRU9jS2p2YmRDSkxCamlGag0KLURuY0xLdmJkWk1TRHNta20NCi1Eb0RLanZiZHVhRVpTb0ZJDQotRVBDamp2YmRoZ0pieHVqVg0KLUVPY0xLdmJkQ0pMQmpoZksNCi1Eb0NrS3ZiZFppc0hwSEJmDQotRG9Da0t2YmRxRmRGVVdCSQ0KLUVQQ2tLdmJkREdsRmdBemMNCi1EbmNLanZiZFp4Y2pOYmxTDQotRVBETEt2YmRMcXZtWnVReg0KLURvREtqdmJkeFpoR0Z4RlMNCi1FT2JrS3ZiZFpkeEd6aEliDQotRG9ETEt2YmRxd1FNQ2h5Ug0KLURvQ2tLdmJkamxhbFplR28NCi1EbmNLanZiZFpSTkVobGRxDQotRVBDa0t2YmRaSFhFQVBTaQ0KLURvREtqdmJkRG9ETEt3Q2QNCi1EbmJrS3ZiZG1iSndZUE51DQotRG5jS2p2YmRNZmNQbG91TA0KLURvQ2tLdmJkUXdPRGJsSGMNCi1Eb0NqanZiZE5RWVF1bkdzDQotRG5iamp2YmRscXh0elNjaQ0KLUVPY0xLdmJkckRkaHBOdWENCi1EbmNMS3ZiZEtlZklDQXB1DQotRVBES2p2YmRhdGFnWGtVSQ0KLURvQ2pqdmJkYW9mZ0RremQNCi1FT2JrS3ZiZElyeGFUTXdsDQotRG5jTEt2YmRTTFlmVkdrVA0KLUVQQ2tLdmJkZWxldmZtS0wNCi1EbmNLanZiZEZmS1NPSXNxDQotRU9iamp2YmRmSUxWcW5RZw0KLURuY0xLdmJkWmpTaFBnQ0cNCi1Eb0NqanZiZHJOWml4bEhpDQotRG5ia0t2YmRkb0ZUS3N0Uw0KLUVPY0tqdmJkV1NOd2JGTUQNCi1FUERMS3ZiZHB4bmdmcUR4DQotRU9jS2p2YmRJSEd5eHhZSA0KLUVPY0xLdmJkdndNQXVhVnUNCi1FT2NLanZiZGt4cnFyeUd0DQotRG5jTEt2YmRaalNoUUhCZg0KLURuYmpqdmJkaVV6RXZxdUMNCi1FT2JrS3ZiZHB4b0hmcGN4DQotRG9Da0t2YmRHQW9SWkp6bQ0KLUVPY0tqdmJkZWhMVnJPUWcNCi1FUERLanZiZGtETUxSR3VIDQotRG5ia0t2YmRLQ2pEUktEWQ0KLUVQQ2pqdmJkTEdGaEJhUlYNCi1FUERMS3ZiZGFNamJTdU5IDQotRG5jS2p2YmRXZll6VUFPcw0KLURvQ2pqdmJkc0JlbGtmankNCi1EbmNMS3ZiZFpubWhlRlpqDQotRU9jTEt2YmRhdGFnWUxVSQ0KLUVPYmtLdmJkV1hKWHZFRWcNCi1Eb0RLanZiZFpNUmRUbWxODQotRVBDamp2YmRXWEl3dkVFZw0KLURvQ2pqdmJka0NranFIVWcNCi1FUENqanZiZGlqRmhKbHhTDQotRVBES2p2YmRtU1pVeXNFSg0KLURvREtqdmJkTWdEUU1vdUwNCi1FUENrS3ZiZHJEZGhvbXZCDQotRVBDamp2YmRSTlhiWW10eg0KLUVQQ2tLdmJkVXRNdEZsV0sNCi1EbmJqanZiZEdjanZKYWpLDQotRVBES2p2YmR1YUR5VE9lSQ0KLURuY0xLdmJkeml1UG9jcnQNCi1Eb0NqanZiZGNTY0tzY2pCDQotRG5jS2p2YmRtZ0V4TW1meQ0KLUVPYmpqdmJkSmNKY1FpYngNCi1FUERLanZiZE1wWHB2TmZzDQotRU9ia0t2YmR5cVBOSWpYQQ0KLUVQQ2pqdmJkQ1NhRFVHV3INCi1FT2NLanZiZFpubkpGRXlqDQotRU9ia0t2YmR5T1Nnd3JpRA0KLUVQQ2pqdmJkdGt3d0F0QlgNCi1EbmJrS3ZiZERuY0xMWERFDQotRU9jS2p2YmRac2hoeGNzTw0KLURvQ2pqdmJkeFZNZHB4bE8NCi1EbmNLanZiZExHR0hhYVF1DQotRG9Da0t2YmR4VW1GUXlNTw0KLUVQREtqdmJkcGZFRXN2QWgNCi1Eb0NrS3ZiZFpSTWRobGRxDQotRVBETEt2YmRZemJlckp1eQ0KLUVPYmpqdmJkZkhrV1NPUWcNCi1FUERMS3ZiZFJNeEJ5TnR6DQotRG5jTEt2YmRtb3l5V0xaQw0KLUVPYmtLdmJkaHR5ZHZyVkMNCi1Eb0NrS3ZiZFZoWVdZR3h6DQotRVBES2p2YmRiVkNIWGpzaA0KLUVQQ2tLdmJkVGxXUEJWbmkNCi1EbmNMS3ZiZEZrRXNDZ21WDQotRG5ia0t2YmRJc1lhU2x4TQ0KLURuY0tqdmJkemFBT2ZmYk0NCi1EbmNMS3ZiZGFTRmNIdEdMDQotRG9ETEt2YmRpR2pEWXVpdQ0KLUVPYmpqdmJkRGlnalZ3akENCi1EbmNLanZiZHFtWml4bElKDQotRG5ia0t2YmRSanhmVWdMVA0KLUVPYmtLdmJkZUFVUk5ZS0cNCi1FUENqanZiZGp2V25FQ1h3DQotRVBDamp2YmROUVhxVm1nVA0KLURvRExLdmJkeG1zSHhTaGMNCi1FUENrS3ZiZHF3UGxDaHhxDQotRG5iamp2YmR1THd3QXNhWA0KLURuY0tqdmJkdUNidVd1bm8NCi1EbmJrS3ZiZEpweWRuZW5GDQotRVBETEt2YmRSWE9FQ2xJRA0KLURuY0tqdmJkU0t5RnVHa1QNCi1EbmNLanZiZGN6WlFZWlJDDQotRVBDa0t2YmRHWlV0YUR4Qw0KLUVQQ2pqdmJkT0FKVFVLU0ENCi1EbmJrS3ZiZHNabFFTYUhuDQotRG5jS2p2YmR1V053aXFUQQ0KLURvRExLdmJkUk5ZQ1pPVXoNCi1Eb0NrS3ZiZFZUbVRmTVZqDQotRU9jTEt2YmRlQVRwbVlKZg0KLURuY0tqdmJkYlViR3hLc2gNCi1EbmJrS3ZiZExaUktTenRmDQotRG5jS2p2YmRjSk1qTEZ3WQ0KLURuYmtLdmJkUmFkRWtoeUwNCi1FUENrS3ZiZGF1QmdYa1RoDQotRU9ia0t2YmRySkFLRk5PZQ0KLUVPY0tqdmJkRG5iamtYREUNCi1Eb0RLanZiZHJhZk1sR2p5DQotRU9jTEt2YmRsaUR0UlZSYQ0KLUVPYmpqdmJkWmpTaFFIQ0cNCi1EbmJqanZiZFpubWlGRXlqDQotRVBES2p2YmRiQXVlRnBRWA0KLUVQQ2pqdmJkVndKWVZjZGcNCi1FT2JrS3ZiZGlqR0lKbVlTDQotRG9Damp2YmRKcHllT2VuRg0KLURvREtqdmJkWWxTRHNuTU4NCi1EbmNMS3ZiZGVoTFZxbXFIDQotRG5iamp2YmRUcHBudVZIbQ0KLUVPY0tqdmJkU0xZZXRnTFQNCi1FUENrS3ZiZFp5RUtPQ2xTDQotRG9ES2p2YmRIRGp1akJpag0KLUVQQ2tLdmJkSGthem12cGsNCi1FT2JrS3ZiZGt4cnJUWWZ0DQotRVBDamp2YmRPVFVWZmVWUQ0KLURvQ2pqdmJkWXpiZlNLV1oNCi1EbmNLanZiZGt4cnJTeGdVDQotRU9iamp2YmRFT2NLa1hDZA0KLUVQREtqdmJkY1RDa1RjaWENCi1Eb0RLanZiZGF0YWdYa1RoDQotRG9ETEt2YmROSENwTXBVaw0KLURvREtqdmJkaHR6RXZxdUMNCi1FUENqanZiZGRlUFNCdmJqDQotRG9ETEt2YmRkbmVUTFVVUw0KLURuY0xLdmJkaWpGaEtNd3INCi1FUERMS3ZiZHB4b0lIUkR4DQotRG5jTEt2YmRxcXVMT0thTg0KLUVQQ2tLdmJkU0NFRWtpWkwNCi1Eb0RMS3ZiZHZBZFlyb0VoDQotRG5jTEt2YmREd3drc3N0TQ0KLUVPY0tqdmJkS1dWRmNkZ0oNCi1FUERLanZiZFpubWhkZVpqDQotRG9Damp2YmRKU3lCVE14TQ0KLURvRExLdmJkdGNEVlhWb1ANCi1FT2NMS3ZiZGJBdWRmUG93DQotRVBDamp2YmRwZkRkdFdBaA0KLURuY0tqdmJkdUNjVXdXT28NCi1EbmJqanZiZEdGaXJPSXRSDQotRG5iamp2YmRMQktnTkJ4Ug0KLURuYmpqdmJkdVZuWUpwc0ENCi1EbmJqanZiZGp1dm5EYlh3DQotRG9ES2p2YmRGa0ZURElOVg0KLUVPY0tqdmJkRXZaUVFNaWUNCi1Eb0NrS3ZiZE1mYm9scFVrDQotRVBDamp2YmRoYlBDZHdRcQ0KLURvREtqdmJkWnlFS05ibFMNCi1FUENqanZiZHVDYnR3V1BQDQotRG5iamp2YmRnTEd6YmZBRQ0KLUVPYmpqdmJkcUdEZHN2QWgNCi1FUERMS3ZiZE5HYm9sb3RrDQotRG9Da0t2YmRTUHNmaWZFWA0KLURuY0xLdmJkYlZDR3dqc2gNCi1FT2JrS3ZiZGlqR0hqTXdyDQotRG5iamp2YmRSb3NmaWZEdw0KLURvQ2pqdmJkUWNjQXBSRHINCi1Eb0RLanZiZHFUdEhTU0t0DQotRU9jTEt2YmRzUVdQSmNWZg0KLUVPYmtLdmJkZU9kc0xUc3INCi1EbmNMS3ZiZGNURExVRGpCDQotRG9ES2p2YmRWZ3d2WGZ4eg0KLUVPY0tqdmJkdW9UenFLbnQNCi1FUENqanZiZFlOcUFZVldVDQotRU9iamp2YmRlbUdYR21Kaw0KLURvQ2tLdmJkVmd4V1hmeHoNCi1Eb0NqanZiZHFsektaTGdpDQotRVBETEt2YmRMRmZIYWFRdQ0KLURuYmtLdmJkY1Nia1RjakINCi1FT2JqanZiZGdHTHpOZ0hBDQotRU9iamp2YmRaalNncEdiRw0KLURuYmpqdmJkR2NrVmpCaWoNCi1FT2NMS3ZiZFVNVm5hV09pDQotRU9ia0t2YmRyeWxRU2FIbg0KLUVQRExLdmJkWkhXZEFPcmkNCi1Eb0RLanZiZHlmeGxBTWR3DQotRG5iamp2YmRaTVNEc25MbQ0KLURvREtqdmJkT1RVVmdFdHANCi1EbmJrS3ZiZEpTeGFTbHdsDQotRG5jS2p2YmRrTkNMekZHbw0KLURvREtqdmJkZk1ldmdNaWsNCi1EbmJqanZiZE1nRFBscFZMDQotRG5jS2p2YmRxcXVMT0xBbQ0KLURvQ2tLdmJkZk5Gd0dsaWsNCi1EbmNMS3ZiZHB4bmhIUkR4DQotRG9ETEt2YmRaTVJkVG1sTg0KLUVQQ2tLdmJkVVJSUFZWSG0NCi1FUENrS3ZiZG1nRXdtT0haDQotRU9jTEt2YmRWQWFwc1JTWg0KLURvQ2pqdmJkY3paUHd4cGINCi1FUERMS3ZiZFdYSXhXRGRnDQotRVBDa0t2YmRVVmxRSnRCUg0KLUVPY0tqdmJkZWxmV2dOSmsNCi1FUERLanZiZFV0TXRGa3VqDQotRG5iamp2YmRSa1pGdGZqcw0KLUVPYmtLdmJkQ0pMQ0xKR0sNCi1Eb0RMS3ZiZEtWdUdFRWdKDQotRG5jS2p2YmRJeFRiSGtxUQ0KLURuY0xLdmJkTVNXbHpVcHoNCi1FUENrS3ZiZEtlZklDQXFWDQotRU9jS2p2YmR0dW5YalJUQQ0KLURvRExLdmJkWk1TRVRtbE4NCi1FT2JrS3ZiZGFwSEhFTHpkDQotRU9ia0t2YmRtUnh0eXJkSg0KLURvQ2pqdmJkdFRTU3h6RWMNCi1FT2JqanZiZGRlT3JCdmJqDQotRG5jTEt2YmRKWVVCZ2twcA0KLUVQQ2pqdmJkdUx4WEJVQXcNCi1EbmJqanZiZFNMWWV0ZmpzDQotRG5jS2p2YmR6UW5tSWl3QQ0KLUVQQ2pqdmJkUnBVR2pGZFgNCi1FT2NMS3ZiZGRkbnFiV2NLDQotRU9jS2p2YmRXV2h3dWNkZw0KLUVPY0xLdmJkQ1d6ZEpFb3YNCi1FUERLanZiZFRrdW9BdW5pDQotRG5jTEt2YmRxVVRnU1NMVQ0KLURvRExLdmJkTkhEUU1vdGsNCi1EbmNMS3ZiZFdYSlh2RUVnDQotRVBDamp2YmRhTkthcnVOSA0KLUVQRExLdmJkcmFlbGtmankNCi1EbmNMS3ZiZExxdm1adHB6DQotRG5iamp2YmROZGRUaGhrRQ0KLURvREtqdmJkem9RUWRjTHgNCi1FUERLanZiZFlwbGRpTkZSDQotRU9iamp2YmRadEpJeURzTw0KLURvQ2tLdmJkV1dpWVdEZUgNCi1Eb0NrS3ZiZGVFb1NCd0RLDQotRG9Damp2YmRCc0FjVGV2cg0KLUVPYmpqdmJkcXZwTUNoeVINCi1FUENqanZiZHNDR01sSEt5DQotRG5ia0t2YmR1THd3QXRBdw0KLUVPYmtLdmJkTVJ3TXl1UXoNCi1EbmNMS3ZiZHdXbEF1YVdWDQotRG5jTEt2YmRIZ0haeHd4SA0KLURuY0tqdmJkQnNBY1Rld1MNCi1Eb0RMS3ZiZEpweWVQRm1lDQotRG5jS2p2YmRWVU5VRmxXSw0KLURuY0tqdmJkRVlYa3RUdE0NCi1EbmNMS3ZiZHdNdkFORGVODQotRG5ia0t2YmR0U3JUWlplRA0KLUVPY0xLdmJkSllVQmhNUlENCi1EbmNLanZiZGxZcnJUWkd0DQotRG9ETEt2YmRsaURzcVVyQg0KLUVPYmpqdmJkZWdqdXFuUWcNCi1FT2JqanZiZGxaU3JUWkhVDQotRG5jTEt2YmRmTkdXZmxqTA0KLURvRExLdmJkTEZlZ2JCUXUNCi1EbmNMS3ZiZGVtR1hHbUtMDQotRVBES2p2YmREd3drc3NzbA0KLURuYmpqdmJkeG1zSVlUSkQNCi1Eb0RMS3ZiZEJzQkN0R1dyDQotRG9Damp2YmRJc1lhVE5ZTQ0KLURuY0tqdmJkSnV1R0VFZ0oNCi1FT2JrS3ZiZGt5U3FzWWdVDQotRG5ia0t2YmROUHdxV05mcw0KLUVQRExLdmJkbUlkVHB0ckINCi1Eb0RMS3ZiZHlxT21JalhBDQotRVBDamp2YmRoa2VFT1VjWg0KLURvREtqdmJkSnFaZVBGbWUNCi1FUERMS3ZiZGZTQXZ6bENvDQotRU9iamp2YmRiaGxqTEZ2eA0KLUVPY0xLdmJkYU1rQnNVbUgNCi1Eb0NqanZiZEt5UktTenVHDQotRU9iamp2YmRjU2JqdEVKYQ0KLUVPY0xLdmJka0hmbEdGbWsNCi1Eb0RMS3ZiZGVtRndITWpMDQotRU9iamp2YmRTTFpHVkhMVA0KLURvQ2pqdmJkSlh0Q0lMcHANCi1FT2NMS3ZiZGFhVmRmUG93DQotRU9jTEt2YmRGcEFUV2dHWg0KLURvQ2pqdmJkeFpnZWV3ZHINCi1FT2JrS3ZiZGVFbnFhd0NqDQotRU9iamp2YmRoeXRmTVFtZg0KLURuYmpqdmJkb3puRUt4UEENCi1EbmJqanZiZG9BS3pzZ2RPDQotRG9Da0t2YmRZemJmUml2Wg0KLURvRExLdmJkcXF0a09LYU4NCi1EbmNMS3ZiZHF2b2tjSllxDQotRVBES2p2YmRPU3RWZmVVcA0KLURvREtqdmJkWnhjaW5ETHINCi1Eb0NrS3ZiZGN5eVFZWXFDDQotRU9ia0t2YmRjSWxpa0dXeA0KLUVPY0xLdmJkZmZMek5nSEENCi1FUENqanZiZE10c1JrTkFYDQotRU9jS2p2YmRwZWNlVHZCSQ0KLUVPY0tqdmJkWnNpSXhjc08NCi1EbmNMS3ZiZEp2VkdEZGdKDQotRG5ia0t2YmRaTVJkVG1sTg0KLUVQRExLdmJkbkNKd1hublYNCi1FT2JrS3ZiZHhVbGRxWkxuDQotRVBDamp2YmROZGRVSklrRQ0KLURvQ2pqdmJkeVlKSmFwWmsNCi1EbmJqanZiZHB4b0hnUWN4DQotRU9iamp2YmRIRGp2S0Jpag0KLURuY0tqdmJkVXROVUZsV0sNCi1FUENrS3ZiZGtWdm1kQnd3DQotRG5iamp2YmRnR01abWdIQQ0KLURvRExLdmJkbUlkVHFWU0INCi1FT2NMS3ZiZHppdHBQZFRVDQotRG5jTEt2YmRreHJxcnhnVQ0KLURvQ2pqdmJkVkJCcHNSU1oNCi1FT2NMS3ZiZEdGaXFtaVRxDQotRU9jS2p2YmR4c09KTXFhZw0KLURvQ2tLdmJkSERrVmpDSmoNCi1FUERLanZiZGpTemlUS2l6DQotRU9jS2p2YmRDVEFic2V3Uw0KLUVQQ2tLdmJka1dXbkRiWVgNCi1Eb0RMS3ZiZEpTeGFUTXhNDQotRG9ETEt2YmRNb3hSV05nVA0KLURvRExLdmJkbXVWWmtKckcNCi1FUERLanZiZGJVYkhYanRJDQotRG5iamp2YmRrV1duRUJ4WA0KLUVPY0xLdmJkblB5eHVrWkMNCi1EbmJqanZiZFhybEJNdE94DQotRG9ETEt2YmRKdXVHRUZHaQ0KLUVQREtqdmJkVWFCcHJwcloNCi1FT2JqanZiZHNycXJ4eWRjDQotRU9iamp2YmR1Q2J0d1dPbw0KLURvQ2tLdmJkU0xZZXVITFQNCi1Eb0RLanZiZEtReWVQRm1lDQotRU9jS2p2YmRlWVpzc3JGeg0KLURvREtqdmJkcHhvSGZwZFkNCi1FUENrS3ZiZGNJbGpLZlhZDQotRVBES2p2YmREd3drc3N0TQ0KLURuYmtLdmJkc1FXT2ljVmYNCi1FUERMS3ZiZElpZEFLUUhFDQotRG9ETEt2YmRyRGVKUG5XQg0KLUVPY0xLdmJkWm9OaUVlWmoNCi1FT2JqanZiZHB0VGdSckxVDQotRVBES2p2YmRtUnlVelRFSg0KLURvRExLdmJkRnh0dUJFWUMNCi1EbmJrS3ZiZGVoTFZxbXFIDQotRVBDamp2YmRVdE5VR0x1ag0KLURvRExLdmJkeFZORXFaTG4NCi1EbmNLanZiZHlTbkltUmJIDQotRG9Damp2YmRiTE1HUE5jQQ0KLUVQQ2tLdmJkelFvTWlLWEENCi1EbmJrS3ZiZGJpTWlqZXZ4DQotRU9jS2p2YmRTUVRmaWVkWA0KLURuYmpqdmJkWmlzSVFIQmYNCi1FT2JrS3ZiZFlwbGVJbGRxDQotRG5jTEt2YmRqbUJsWmVIUA0KLURuY0tqdmJkU0NEZGtoeGsNCi1EbmJrS3ZiZHJ5a3BUQWduDQotRU9ia0t2YmRaUWxkaU1lUg0KLURuYmpqdmJkZVlac3NxZXoNCi1FUERMS3ZiZGxZcnJTeUhVDQotRU9jTEt2YmRUcHFPdHRnbQ0KLUVPY0tqdmJkQ0pMQ0xJZWoNCi1FUERLanZiZFVRcU90dGdtDQotRU9ia0t2YmRHQk9xWkp6bQ0KLURuY0tqdmJkcXdRTURJeVINCi1FUERLanZiZGJCV0ZGb293DQotRU9jTEt2YmRaTVJjdE9MbQ0KLUVQQ2tLdmJkSEVLdWliS0sNCi1EbmJqanZiZE5kZFRoaUtkDQotRG5jS2p2YmRKdXVGZEVnSg0KLURuY0xLdmJkUnpKZ3NEV0ENCi1EbmNMS3ZiZFJXbWRDa2hEDQotRVBDamp2YmRaUk5GSW1FcQ0KLUVPY0xLdmJkVWFCcVRSU1oNCi1FT2JrS3ZiZFdJWHZZR3h6DQotRG9ES2p2YmRyUnVLbkthTg0KLURvQ2pqdmJkWWdYRUFQVEoNCi1Eb0NrS3ZiZHd1TWVReU1PDQotRVBETEt2YmRrSGZrZkZtaw0KLURvREtqdmJkVHFRbnVVaE4NCi1Eb0NrS3ZiZGJLbEZvT0RBDQotRU9ia0t2YmRyekxvcmFJTw0KLURuY0xLdmJkRnh1VkFkWUMNCi1Eb0NqanZiZFpRbGRpTWVSDQotRU9jS2p2YmRKVFpCVE5YbA0KLUVQREtqdmJkc1FXUEtDdkcNCi1FT2NMS3ZiZGVFb1Jhd0RLDQotRVBETEt2YmR0VFNTeHpFYw0KLURuY0xLdmJkbGlEc3FVcWENCi1EbmJqanZiZFpRbGVJbUVxDQotRVBDamp2YmRhU0dESVRlaw0KLURvRExLdmJkUlduRGJraEQNCi1FUERMS3ZiZHBlZEVzdkFoDQotRVBDa0t2YmRZcGxkaGxkcQ0KLURvQ2pqdmJkWm9PSkVkeWoNCi1FT2NMS3ZiZG1veXh2S3lDDQotRU9iamp2YmRtU1pWWnNFSg0KLURvRExLdmJkcVVVR3JTTFUNCi1FUERMS3ZiZG1wWnh1anlDDQotRVBDamp2YmRDRHBCVmlsZg0KLUVQQ2pqdmJkRmZKck5oc3ENCi1Eb0RLanZiZHNaa29zQklPDQotRG5iamp2YmRpQm5iZHZwcQ0KLURuY0tqdmJka0RNS3BmdGcNCi1FUENrS3ZiZGF0Ykd4TFRoDQotRG9Damp2YmRKVFlhVE5YbA0KLURuYmpqdmJkaGtkY25WQ3kNCi1EbmNMS3ZiZHlOcmd4VEljDQotRVBETEt2YmR5TnNId3JpRA0KLUVQRExLdmJkQmRRQlZpbGYNCi1Eb0RMS3ZiZElzWWFUTlhsDQotRG5ia0t2YmRreHNTVFpIVQ0KLUVQQ2pqdmJkQnNCRFVHV3INCi1FT2NMS3ZiZGdRQnp3RHhJDQotRG5iamp2YmRqYmxMUWZ1SA0KLURuYmtLdmJkYlZCZ1lLc2gNCi1EbmNMS3ZiZE1nQ29tUHVMDQotRVBETEt2YmRxY2VJcE9WYQ0KLURuYmpqdmJkcUZjZVR2QWgNCi1FUENqanZiZEZXWXBRTkplDQotRG9ETEt2YmRIRGp1akJqSw0KLURuY0xLdmJkSUhHeXlYeEgNCi1EbmJqanZiZGVGT3Fhd0NqDQotRG9ES2p2YmRHUUFTd0dmWg0KLURuY0xLdmJkcldva2JoeVINCi1EbmNLanZiZFNLeUZ0ZmtUDQotRG9Da0t2YmRlbUZ2Zm1LTA0KLUVQREtqdmJkeHNOaG1SYkgNCi1FT2NLanZiZHNQdW5pY1ZmDQotRU9iamp2YmRyYkdOTUdqeQ0KLUVQRExLdmJkT1hvVnpjblUNCi1FT2NMS3ZiZGRaeHBZWXBiDQotRG9ES2p2YmRWQkJwc1JSeQ0KLUVQREtqdmJkSERrV0tDS0sNCi1Eb0NrS3ZiZFNpWmpSQUFsDQotRVBES2p2YmRVUlFvVlZIbQ0KLURvQ2tLdmJkcHlQSGdRZFkNCi1FT2NLanZiZEdBb1F4aXptDQotRG5iamp2YmRNcFhwdk5mcw0KLURuY0tqdmJkZG5kcmp0VVMNCi1EbmJrS3ZiZGxoY3NwdHFhDQotRG9Da0t2YmRmTkZ2Zm1LTA0KLUVQQ2tLdmJkSGZmeXh4WGcNCi1Eb0NrS3ZiZFlwbGVJbUZSDQotRG9Da0t2YmRiQlZkZlBwWA0KLURuY0xLdmJkV1NOeEJkbEQNCi1FUERLanZiZFNRVGZqRmN3DQotRVBDamp2YmRreHJxc1lnVQ0KLUVQREtqdmJkcm92T2pDdkcNCi1Eb0NqanZiZGFTR0Nnc2VrDQotRG5jTEt2YmRaR3dFQU9yaQ0KLURvRExLdmJkSm1BRHpIVWENCi1Eb0NqanZiZE5kY3NoaUtkDQotRG9Da0t2YmRkbmVUTFR0Uw0KLUVPYmtLdmJkTW94UXVtZnMNCi1EbmNLanZiZFZneFZ3Znh6DQotRG9ES2p2YmRHY2p1aWJLSw0KLUVPYmtLdmJkVHFRbnVVaE4NCi1EbmNLanZiZFVSUlBVdUlODQotRU9ia0t2YmRicmJqdEVKYQ0KLURuYmtLdmJkS1F5ZU9lbkYNCi1FT2JqanZiZGJLa2ZPbkRBDQotRVBETEt2YmRsaGRUcHRyQg0KLUVPYmpqdmJkeG5USHhUSkQNCi1FT2JqanZiZEtDakNwakRZDQotRG9ETEt2YmRNU1dtWnRweg0KLURvQ2tLdmJkQnNCQ3NmWFMNCi1EbmJrS3ZiZGZSYVd6a2NQDQotRVBES2p2YmRiQXZGR1FRWA0KLURvQ2pqdmJkZG9GU2p0VVMNCi1EbmJqanZiZHlwb05KSndBDQotRVBES2p2YmR6ZHpPemR5cA0KLUVPYmpqdmJkSnB6RW9GbWUNCi1Eb0NrS3ZiZHVDYnVYV1BQDQotRVBDa0t2YmRGZkpyT0l0Ug0KLURvRExLdmJka0lHbEZmT0wNCi1EbmJqanZiZGJBdWRmUHBYDQotRG9ETEt2YmR0QUhSSUFCUw0KLUVPY0xLdmJkdURDdVd1bm8NCi1Eb0RLanZiZGtIZ0xmR05rDQotRU9jTEt2YmR4WmhGZXdlUw0KLUVPYmtLdmJkVXhnc3pLb08NCi1FT2NLanZiZGlCb0NlWFJSDQotRG5ia0t2YmRaZVhmemhKQw0KLUVPYmtLdmJkdGNEVXZ2UFANCi1FT2NLanZiZE10cnJMTkFYDQotRG5ia0t2YmRXWEpZVmNlSA0KLURuYmtLdmJkSmJqQ3BpYngNCi1FUENrS3ZiZGFqbEZubkRBDQotRG5iamp2YmR1YUVaVFBFaA0KLUVPY0tqdmJkR2NqdWliSmoNCi1EbmNMS3ZiZEtlZkhiQXFWDQotRG9ES2p2YmRVeGd0Wmpubg0KLUVQQ2pqdmJkVlpJVHpLbm4NCi1FUERLanZiZEhrYXpuWFJMDQotRG5ia0t2YmRPRWRUaUlrRQ0KLURuYmpqdmJkaUdqRFl2SnUNCi1Eb0RLanZiZG5VdHlrSnJHDQotRVBDa0t2YmRCZFFCV0tORw0KLUVQREtqdmJkc0JlbUxma1oNCi1FUENqanZiZHR1bXdpcVRBDQotRU9jS2p2YmRuQ0tYWVBPVg0KLURuY0xLdmJkVndJeFZkRkgNCi1EbmJqanZiZFdJWVdZR3h6DQotRU9ia0t2YmRGcEFUWEhGeQ0KLURvQ2pqdmJkYXVCZ1hqdEkNCi1EbmJrS3ZiZFRxUk91VkhtDQotRG5iamp2YmRsaGNzcVVxYQ0KLUVQRExLdmJkeFpoR0dYZVMNCi1Eb0RMS3ZiZFpqVEhvZ0NHDQotRU9jS2p2YmRiS2xHT25EQQ0KLUVPYmpqdmJkTGlCbFJZQVMNCi1EbmNLanZiZHhybkpNckNIDQotRU9jTEt2YmRNSkJsUllBUw0KLUVPY0tqdmJkVXNtVGVrdWoNCi1EbmJqanZiZEVZWU1Uc3NsDQotRU9ia0t2YmRaTVNFVU5rbQ0KLURuY0xLdmJkR0dLU05oc3ENCi1Eb0RLanZiZEdaVlZBZFhiDQotRVBES2p2YmRLUlpkb0ZuRg0KLUVPY0xLdmJkRVh3bFVUdE0NCi1Eb0RLanZiZEV6dFFlTGNKDQotRG9Da0t2YmRKWVVCZ2xRcA0KLURvQ2tLdmJkSlRaQXNOWGwNCi1FT2JqanZiZHZtV0FNZEVtDQotRVBDamp2YmR4WmdlZllGUw0KLURuY0tqdmJkdFRScnh6RWMNCi1FT2NMS3ZiZGlHakRaV0p1DQotRG9Da0t2YmRZbFJjdE9MbQ0KLURuY0tqdmJkRHhYbFR0VU0NCi1FUENqanZiZGN5eHBZWXFDDQotRU9jTEt2YmRxR0RlVVdCSQ0KLURuYmpqdmJkblB5eHZMWkMNCi1Eb0RMS3ZiZEtlZkhiQXB1DQotRG9Da0t2YmRqYmxLcUhWSA0KLUVPYmtLdmJkVGZ6bWt2dWUNCi1FT2NLanZiZFpubWlFZHpLDQotRU9jS2p2YmREeFhrc3RUbA0KLUVQRExLdmJkQmRRQXVqTWYNCi1Eb0RLanZiZEdaVlZCRHdiDQotRG9ETEt2YmRFdlpQcE1pZQ0KLUVQQ2pqdmJkVndKWHVjZUgNCi1Eb0RMS3ZiZFJqeUZ0Z0xUDQotRG9Da0t2YmRYc0xhTlRueA0KLURuYmpqdmJkREhMZkhBemMNCi1Eb0NrS3ZiZFZCQ1FycHJaDQotRG9Da0t2YmR5TnNJWVNoYw0KLUVQREtqdmJkeVhpSmJQekwNCi1Eb0NqanZiZFVzbHRGbFdLDQotRVBDa0t2YmRjeXlRWVpSQw0KLURuYmtLdmJkZGRucWJXYmoNCi1FUENrS3ZiZG11VXlqalNHDQotRU9ia0t2YmRaeURpbkRMcg0KLURuYmpqdmJkWnRJaVpFU24NCi1FUENqanZiZFZCQ1JUUlJ5DQotRU9jTEt2YmRDV3pjaUZQdg0KLUVPYmtLdmJkckVGSlBuV0INCi1EbmJrS3ZiZHFVVUhTUmtVDQotRVBETEt2YmRscXlVeXJjaQ0KLURvQ2pqdmJkSU1Cem5YUWsNCi1Eb0NqanZiZFV4Z3N5a09uDQotRVBDamp2YmRYc01CTXNueA0KLURuY0tqdmJkanV2bWRCeFgNCi1FT2NMS3ZiZGtJR2tlZW1rDQotRG9Damp2YmRqS0dJS05ZUw0KLUVQRExLdmJkU0xaR1ZHanMNCi1FT2NLanZiZE1mY1BtUVVrDQotRG9Damp2YmRyTlpqWWxJSg0KLUVPY0xLdmJka3lUU1RaSFUNCi1FT2JqanZiZGpBUUdhUUhLDQotRVBES2p2YmRNb3hSVm5IVA0KLUVPYmtLdmJkZUFUcG1YaWYNCi1FT2JrS3ZiZEZqZHNESG1WDQotRG5jTEt2YmRiTExmT21jQQ0KLUVQQ2tLdmJkdW5zenFMT3QNCi1EbmJrS3ZiZG5RWnh2TFpDDQotRG5jTEt2YmRaeURqTmJsUw0KLURuYmtLdmJkcHRUZnJTS3QNCi1Eb0RMS3ZiZHphQU9nSENNDQotRVBDamp2YmRoYlBDZVhSUg0KLURuYmtLdmJkbXVWWmtLU0cNCi1Eb0NrS3ZiZHppdVFRRVN0DQotRG5ia0t2YmRoZ0tEWldLVg0KLURuYmpqdmJkVUx1b0JXUEoNCi1EbmNMS3ZiZFdYSlh1Y2RnDQotRG9Damp2YmRSYWNkbEpZaw0KLURvRExLdmJkZWdqdlNOcUgNCi1FT2NMS3ZiZG5VdHpMS1JmDQotRU9jS2p2YmRGeHR1QkVYYg0KLURvQ2tLdmJkbUljc3FVckINCi1FT2JqanZiZFVMdlBBdlBKDQotRU9jTEt2YmRTd2tMbXprWQ0KLUVQQ2tLdmJkU1pqSVRDdkENCi1FUENrS3ZiZGVPZHJqdFVTDQotRVBDamp2YmRJeFVCaExwcA0KLUVPYmtLdmJkcWlBSmVNb0YNCi1EbmJrS3ZiZGhsRWNtdGNaDQotRU9jTEt2YmRGZWpSbkpUcQ0KLUVPY0tqdmJkd1hNQXZCV1YNCi1Eb0RLanZiZG1wWnlXTFpDDQotRG9Damp2YmRHTEVyYmhOVg0KLURvRExLdmJkbWFpdndubXUNCi1FT2NMS3ZiZE9Yb1Z6Y25VDQotRG5jTEt2YmRCaGpiTEpHSw0KLUVQREtqdmJkWmpUSVFHYWYNCi1Eb0NrS3ZiZGdQYXp3RVlJDQotRG5jTEt2YmRHR0tSbWlVUg0KLUVPYmpqdmJkZkhrV1JtcGcNCi1EbmJrS3ZiZFhya2FOVVBZDQotRVBDa0t2YmR6UW9NaGl3QQ0KLUVPY0tqdmJkcnBXT2pEVmYNCi1EbmNLanZiZFp0SkpaRHJuDQotRVBES2p2YmRxWk9nZ1JEeA0KLURuYmpqdmJkaGdKYnlXS1YNCi1Eb0RLanZiZGlWWmR3UnVDDQotRG9ES2p2YmRJd3RDSGtwcA0KLURvREtqdmJkVkFhcHNSUnkNCi1FUERMS3ZiZHdqdmNnenpHDQotRG9ETEt2YmRSeWloU2NXQQ0KLURvRExLdmJkclJ1S21rQW0NCi1EbmJrS3ZiZHFHRGRzdWFJDQotRVBDa0t2YmRBTWhZcndaeA0KLURuY0tqdmJkU1BzZmpHRVgNCi1EbmNLanZiZGN6WXBYeHBiDQotRG9ETEt2YmRrSUhNR0Ztaw0KLUVQQ2pqdmJka0NsS3FIVWcNCi1FT2JrS3ZiZHhWTWRxWk1PDQotRG9ES2p2YmRCZFFCVmpNZg0KLUVPYmtLdmJkWmpUSHBHYkcNCi1FUERLanZiZFRmem1rdnVlDQotRVBDa0t2YmRMQWpmbUNYcQ0KLURvQ2pqdmJkTEdHSGJBcHUNCi1FUERLanZiZEV6c3FFa2NKDQotRG9ES2p2YmR3eWdmR1lGUw0KLURvRExLdmJkaGdKYnlXS1YNCi1FUERMS3ZiZFpzaGlaRVRPDQotRVBETEt2YmRLV1VmRGRmaQ0KLURuYmtLdmJkcVlvSGdRY3gNCi1EbmNLanZiZG5HZVlNbWdaDQotRVBES2p2YmRLQ2pEUktEWQ0KLURvQ2tLdmJkSmNLRFFpYngNCi1FT2JrS3ZiZFpvTmlGRlpqDQotRVBDa0t2YmRVeUhzeWtQTw0KLUVPY0tqdmJkdHZOeEtRc0ENCi1FT2JqanZiZGF0YWZ3anRJDQotRG9ETEt2YmRoelZGa3BtZg0KLUVPYmtLdmJkTWdDb21RVkwNCi1FUENrS3ZiZFNDRUVraHhrDQotRG9ETEt2YmRnRmxabkdnQQ0KLUVPYmpqdmJkWk1TRVRuTG0NCi1FT2JrS3ZiZHR1bXhLUXNBDQotRU9iamp2YmRab09JZGR5ag0KLUVPY0xLdmJkcVpPZ2dRY3gNCi1FT2NMS3ZiZEtmRmhCYVF1DQotRG5jTEt2YmR6R3hsQU5Fdw0KLUVPYmpqdmJkZWhMV1JuUWcNCi1FT2JrS3ZiZEVQQ2prV2JkDQotRU9ia0t2YmRxWW5oSFJEeA0KLUVPYmtLdmJkanZYT0Rhd3cNCi1EbmJqanZiZHFUc2dTUmtVDQotRU9jS2p2YmRUcVFvVlZIbQ0KLURuYmpqdmJkUW1ZQnhuVXoNCi1EbmJqanZiZHB5T2hHcUVZDQotRU9jTEt2YmRMR0dIYkFxVg0KLUVPYmtLdmJkWmlyZ3BIQ0cNCi1FT2JrS3ZiZHFZbmhHcGN4DQotRG5jTEt2YmRyYkdOTGdLeQ0KLUVPYmtLdmJka3lTclN4Z1UNCi1FT2NMS3ZiZGVBVVFsd2pHDQotRG5jS2p2YmRrVndOZENZWA0KLURvQ2pqdmJkSnZWR0RlSEoNCi1FUENrS3ZiZEV1eVBwTktGDQotRU9jS2p2YmREakhpdlhqQQ0KLURuYmpqdmJka05DTHlkZm8NCi1FUENqanZiZFpqVEhvZ0JmDQotRG9ES2p2YmRHS2VURElOVg0KLURuYmtLdmJkSlh0QmdsUXANCi1EbmJqanZiZEZlalNPSXNxDQotRU9jS2p2YmRoeXRlbFJOZg0KLURuYmpqdmJkYkJWZGVvcFgNCi1Eb0NrS3ZiZEZqZHNESU5WDQotRG9ETEt2YmRqdlhOY2JYdw0KLURuYmtLdmJkWmR4R3poSkMNCi1FUERMS3ZiZGpBUGdCUUdqDQotRU9iamp2YmRKWHNiSGtxUQ0KLUVQREtqdmJkaVZaZHdSdGINCi1FT2JqanZiZEdGalNOaVRxDQotRVBES2p2YmR6bnBRZGJreA0KLUVQQ2pqdmJkZW1GdmdOS0wNCi1FUERLanZiZFdYSXhXRUVnDQotRG5jTEt2YmRFT2JrS3ZjRQ0KLURuYmpqdmJkTEFqZm1DWVINCi1FUERMS3ZiZEVYd2tzdFRsDQotRU9iamp2YmRGZktTTmhzcQ0KLURuY0tqdmJkeWdaTUFORlgNCi1FUENrS3ZiZFlxTkZJbGVSDQotRG9Da0t2YmRTS3lHVWdMVA0KLURuY0tqdmJkQmRRQlZqTkcNCi1EbmJrS3ZiZGJVYWdZTFRoDQotRU9jS2p2YmRzUHVuakRXRw0KLURuY0xLdmJkckVGSW9uVmENCi1EbmNLanZiZGFTR0NoVGZMDQotRG9Da0t2YmRjSk5LS2ZYWQ0KLUVPYmtLdmJkVUx1b0JXT2kNCi1EbmNMS3ZiZEtXVkdFRWdKDQotRVBDa0t2YmRxRmRFc3VhSQ0KLUVQREtqdmJkQU1neVN2eXgNCi1EbmNMS3ZiZGlVekV3UnVDDQotRU9iamp2YmRab05oZUV6Sw0KLURuYmtLdmJkWkxyRVRuTU4NCi1FT2JqanZiZEtXVkZjZGZpDQotRG9ETEt2YmRjU2NMVUVKYQ0KLUVQQ2tLdmJkSXdzYklNUlENCi1FT2NLanZiZHNCZW1NSEt5DQotRU9jTEt2YmR6aXRvb2RTdA0KLUVQREtqdmJkck15alpMaEoNCi1EbmJqanZiZGFSZkNnc2ZMDQotRG9Da0t2YmRLUXpFbmVuRg0KLUVPY0xLdmJkVUd6bkx2dWUNCi1EbmNMS3ZiZFp4Y2luQ2tyDQotRG5iamp2YmRFdXlQcE5LRg0KLURuY0tqdmJkR0Zpck9Jc3ENCi1FT2NMS3ZiZFZxbXhCZU1EDQotRU9jTEt2YmR3dU1lUlpMbg0KLURuYmtLdmJkQmhrQmtJZWoNCi1FT2NLanZiZE5RWHB1bWZzDQotRU9ia0t2YmRWQkNSVFJTWg0KLURvRExLdmJkWmVZR3poSkMNCi1EbmNMS3ZiZFJFREJQcUVTDQotRG5iamp2YmR2QkVaU29GSQ0KLUVQQ2pqdmJkYWtMZW9OY0ENCi1FUERMS3ZiZGVGT3FiV2JqDQotRVBETEt2YmRpR2ljWldKdQ0KLUVQQ2tLdmJkRUtIaXV3akENCi1FUENqanZiZHdrV2NnenlmDQotRG9ES2p2YmRtcFp5VmtaQw0KLUVQQ2tLdmJkU1ppaFNidkENCi1FUERLanZiZGVsZXZmbUtMDQotRG5iamp2YmRlQVRwbHdpZg0KLURvQ2pqdmJkR0FucHhpem0NCi1FUERLanZiZFRsV1BCV09pDQotRU9jS2p2YmRtU1l0elRFSg0KLURuY0xLdmJkbkdlWG1OZnkNCi1Eb0RLanZiZFRJekpxQUFsDQotRU9jS2p2YmRxZEVpUG5WYQ0KLUVPY0tqdmJkY1RDa1VFS0INCi1Eb0NqanZiZEV2WW9wTWpGDQotRG9ETEt2YmR3dU1kcHlNTw0KLUVQREtqdmJkRXV5UVBsaWUNCi1FT2NMS3ZiZFZVTXNmTVZqDQotRU9iamp2YmRpakZnaWx4Uw0KLURvREtqdmJkblB5eHVqeUMNCi1FT2NLanZiZFRBRklnYlBFDQotRG5ia0t2YmRaeGRKbkRMcg0KLURuY0xLdmJkcWRFaVBtdWENCi1FT2NLanZiZGhnSmNaVmpWDQotRG5ia0t2YmRSYkVGTGh4aw0KLURvREtqdmJkbWFpdndvTnUNCi1Eb0NrS3ZiZFpRbUZKTWRxDQotRG5jTEt2YmRlWVp0VHFleg0KLUVPYmtLdmJkcVlvSUdwZFkNCi1EbmJqanZiZEVBU0pNeXZ3DQotRG9ES2p2YmR3ekhmR1lGUw0KLURuY0tqdmJkanZYT0VDWVgNCi1EbmNMS3ZiZGJCVmRlcFFYDQotRG9ETEt2YmRyRUZJb211YQ0KLURuYmpqdmJkWWdXZEFPc0oNCi1FT2NLanZiZGtNYWt5ZGZvDQotRVBDamp2YmRlZ2tXU05xSA0KLUVQRExLdmJkWWxTRVVOa20NCi1FUERMS3ZiZHpSUE1oalhBDQotRG5iamp2YmRtU1pVeXJjaQ0KLUVQREtqdmJkaWllaEtOWHINCi1FUERMS3ZiZHd6SUdHWGRyDQotRG5jS2p2YmRTTFlldGZrVA0KLUVPY0xLdmJkVVJST3R1SG0NCi1FUERMS3ZiZEVZWUx0VVVNDQotRU9jTEt2YmRhU0dESVVGaw0KLURuYmtLdmJkaGZpYnlWaXUNCi1EbmNLanZiZGVGT3FhdmNLDQotRVBETEt2YmRadEloeUVUTw0KLUVPY0tqdmJkc1B1b0tEVmYNCi1Eb0RMS3ZiZEJoa0JqaUdLDQotRVBETEt2YmRuUVp5VmtZYg0KLURuY0xLdmJkTnNUdWdFdHANCi1FUENqanZiZENEcEJXSm1HDQotRG9Da0t2YmRtSWRUcVZSYQ0KLUVPY0tqdmJkcHRVSFJxanQNCi1EbmJqanZiZFJwVGZpZkR3DQotRG5jS2p2YmRhUmViZ3RGaw0KLUVQRExLdmJkRUFSaU15dncNCi1FT2NLanZiZHlOc0h4U2hjDQotRG9Da0t2YmR4S3dEZ3p5Zg0KLURuY0tqdmJkd3VORlF5TG4NCi1EbmNMS3ZiZGVnanZTT1JIDQotRG5jTEt2YmRPU3RXR2R0cA0KLUVPY0xLdmJkY1RDa1RkS0INCi1EbmNLanZiZFJFQ2FRUkVTDQotRG9ETEt2YmRrSUhNRmVtaw0KLUVQQ2tLdmJkZmpmemNHQUUNCi1EbmNLanZiZFpMcWRUbkxtDQotRU9jS2p2YmRJTUJ6bXdSTA0KLUVPY0tqdmJkd3pIZWV4RlMNCi1FUENqanZiZEtWdUZkRkhKDQotRVBDamp2YmRSWE9EY0xnYw0KLURvRExLdmJkbHJaVlpyZEoNCi1FUERLanZiZGpLR0lKbVlTDQotRU9ia0t2YmRIRUt1akNKag0KLURuY0tqdmJkTmRkVGlJamQNCi1Eb0RLanZiZFpqU2dwR2FmDQotRG9Damp2YmRtZmVYbG5IWg0KLUVQQ2pqdmJkUm9zZmlmRHcNCi1Eb0NqanZiZFp4Y2luRExyDQotRG9Damp2YmROZURzaUlqZA0KLUVQREtqdmJkVmd4VndnWXoNCi1EbmJrS3ZiZHFUdEdyUmp0DQotRG5ia0t2YmRUcVFudHVJTg0KLURuY0tqdmJkQnZ6ZEpFcFcNCi1FUENqanZiZHFVVUhSckxVDQotRG5iamp2YmRxY2Rob25XQg0KLURuY0tqdmJkSERrV0tCaksNCi1EbmJrS3ZiZHhWTWVReGxPDQotRU9iamp2YmRrQ2xLcGdWSA0KLUVPY0xLdmJkQ1NhRFVHWFMNCi1EbmNMS3ZiZFVRcU90dGdtDQotRG9Da0t2YmRaeGNqT0NsUw0KLUVQREtqdmJkVnFteENGTUQNCi1EbmJqanZiZHFtWml4bEhpDQotRG5iamp2YmRpVXlkdnF1Qw0KLURvQ2tLdmJkT1RUdWdGVlENCi1FT2NLanZiZFVRcG9WVklODQotRG9Da0t2YmROSERQbHBWTA0KLUVPY0xLdmJkRG5jTEt3Q2QNCi1FT2NMS3ZiZGRlT3JDWENqDQotRU9iamp2YmRxdm9sQ2h5Ug0KLUVPY0xLdmJkYW9mZ0VMemQNCi1Eb0RMS3ZiZHJwVm9LRFdHDQotRG5jS2p2YmRhTWphc1VtSA0KLUVPYmpqdmJkbGlFVHFVckINCi1EbmNMS3ZiZFhzTGFNdE94DQotRU9ia0t2YmRyeWtwVEFoTw0KLUVQREtqdmJkZWhLdlJtcGcNCi1FT2JqanZiZFV4aFR6S25uDQotRG5jTEt2YmRUZnpuTVhWZQ0KLUVQRExLdmJkcVVUZnFxa1UNCi1Eb0NqanZiZEhFTFdLQ0tLDQotRG9ETEt2YmR3dU5GUXlNTw0KLURvQ2pqdmJkZmZMeW5HZ0ENCi1FT2NMS3ZiZFNMWWV0ZmtUDQotRVBES2p2YmR0VFJyeVplRA0KLUVQREtqdmJkZGRvUmJYREsNCi1Eb0RLanZiZEZWeG9vbGpGDQotRG9ETEt2YmR4c05pTlNDSA0KLURvRExLdmJkc0NHTk1Ha1oNCi1FT2NMS3ZiZGtIZmtmRm5MDQotRVBDa0t2YmRxclVqbkxBbQ0KLURuYmtLdmJkSEVMVmlhaksNCi1FT2NLanZiZE5IRFFNb3VMDQotRVBDa0t2YmRXV2h4VmRGSA0KLURuYmtLdmJkVVdNUGl0QlINCi1EbmNMS3ZiZFpvT0pGRlpqDQotRG5jS2p2YmRjSWxqS2V3WQ0KLURvRExLdmJkVlVOVUdMdksNCi1FT2JrS3ZiZE5zVHVmZHRwDQotRG5iamp2YmRHS2RzQ2dtVg0KLUVPYmtLdmJkdURDdHdXUFANCi1FT2JqanZiZGtNYk1aZUdvDQotRVBDa0t2YmRKU3lBc05YbA0KLURuYmpqdmJkbWJKd1hubXUNCi1FUENrS3ZiZFJqeGV1R2tUDQotRU9ia0t2YmRhU0ZjSVRlaw0KLUVQRExLdmJkR1l0dUFkWUMNCi1Eb0RLanZiZEZlaXJOaVVSDQotRVBDamp2YmRoeXVHTVFtZg0KLUVPYmpqdmJkRHhZTHN0VU0NCi1FT2JrS3ZiZEZmS1JtaHRSDQotRG5ia0t2YmR5VE5obVNDSA0KLUVQQ2pqdmJkSlN5QXNOWU0NCi1FUENrS3ZiZEV1eHBRTWllDQotRG9ETEt2YmRrQ2xMUWdVZw0KLURuYmtLdmJkc3NScnh6RWMNCi1FUERMS3ZiZFJNd2JaTnR6DQotRVBDa0t2YmRzc1NUWXllRA0KLURvQ2tLdmJkWXFNZUltRXENCi1FT2NMS3ZiZGp1d09FQ1h3DQotRU9jS2p2YmRPVFVXSEZVcA0KLUVQQ2pqdmJkbGlEdFF0ckINCi1FUERLanZiZFp4ZEptYmxTDQotRG9ES2p2YmRiVkNIWGtUaA0KLURvREtqdmJkcHN0SFNSanQNCi1FT2NMS3ZiZE5Qd3B1bkdzDQotRG9Da0t2YmRMQWpnTkNYcQ0KLURvQ2pqdmJkRG9ES2p2YmQNCi1Eb0NrS3ZiZFppcmdwSEJmDQotRVBETEt2YmRlenV4ZGlUdw0KLURvQ2tLdmJkTHJYTXl1UXoNCi1EbmNMS3ZiZHFseWpZa2dpDQotRG5ia0t2YmRMcldselVweg0KLURvQ2pqdmJkaHl0ZkxwbkcNCi1FT2JqanZiZHhybWlOU0JnDQotRVBETEt2YmRxcXVMTmphTg0KLUVPYmpqdmJkaUhLQ3lWalYNCi1EbmNLanZiZGpTemlUS2l6DQotRVBDamp2YmRDZmxHSEF6Yw0KLUVQQ2pqdmJkWnRKSlpEcm4NCi1FUENqanZiZEpLRUFLUUhFDQotRVBES2p2YmRJeFRiSGxSUQ0KLUVPY0tqdmJkWlJNZGhtRXENCi1FT2NMS3ZiZG10dHlrSnFmDQotRG5jTEt2YmRFenNxRk1ESg0KLUVQREtqdmJkSnV0ZWNlR2kNCi1FT2NLanZiZGVtRnZmbUprDQotRG9Da0t2YmRreVNxc1pHdA0KLUVPY0xLdmJkbHJaVlpzRGkNCi1FT2NMS3ZiZEVYeExzdFRsDQotRG5ia0t2YmRrTkJsWmVIUA0KLURuY0xLdmJkYXVDSFlLc2gNCi1FUENrS3ZiZGh1WmVYU1ZDDQotRVBDamp2YmRPVFR1ZmR0cA0KLURvREtqdmJkRG9Da0t3Q2QNCi1Eb0RMS3ZiZE9BSXJzaXJBDQotRVBDamp2YmRsQW1QTkFMQQ0KLUVPY0xLdmJkaUJvQ2R3UXENCi1Eb0NrS3ZiZG5DSndZT25WDQotRU9jTEt2YmRxd1FMYmh4cQ0KLURuY0xLdmJkR1l1VkJFWUMNCi1FUENqanZiZGN5eVFYeHFDDQotRVBES2p2YmRyRUVpUG12Qg0KLURuYmtLdmJkSmJpYnFKYngNCi1EbmNMS3ZiZGlHakN4dWl1DQotRU9iamp2YmRqS0dJSm1Ycg0KLUVQQ2pqdmJkRmtFc0RJTXUNCi1FUERLanZiZENXemNoZVB2DQotRU9iamp2YmRFT2JqandERQ0KLUVQQ2tLdmJkUWREQXBSRHINCi1Eb0RMS3ZiZGJBdkVmUVB3DQotRG9ETEt2YmRkdEFVQVROVw0KLURuYmpqdmJkVXhoVVprT24NCi1EbmJqanZiZHdOV0FORUVtDQotRVBDamp2YmR1REN1V3VvUA0KLURuYmpqdmJkakFRSEFwSEsNCi1EbmNMS3ZiZEp6cEZ4RUFODQotRG5jS2p2YmR3dGxkcHhsTw0KLUVPYmpqdmJkQnJhQ3RHV3INCi1FUERLanZiZEptQUR6R3VCDQotRG9ETEt2YmRSYWRFa2laTA0KLURvQ2tLdmJkQU1oWlRYWngNCi1Eb0NqanZiZHFHRGVVVmFJDQotRG9Damp2YmRWdmh4V0RkZw0KLUVPY0tqdmJkU0JjZU1JeUwNCi1EbmJrS3ZiZFJrWWZVZmpzDQotRU9jTEt2YmRGV1lwUU1qRg0KLURvRExLdmJkaGxGRU51Q3kNCi1FT2JrS3ZiZGlDT2JlV3BxDQotRG5ia0t2YmRIRUxXSmFpag0KLUVPYmtLdmJkQ1RBY1RmV3INCi1FUERLanZiZGJyY0xUZEphDQotRG9ETEt2YmREbmNLa1hERQ0KLURvQ2tLdmJkbVNZdHpTZEoNCi1FT2NMS3ZiZFZaSHN6TFBPDQotRG5iamp2YmRoa2RjbXVDeQ0KLURuYmtLdmJkTHJYTlp1UXoNCi1FUERLanZiZFpubWlGRXpLDQotRVBDa0t2YmRsclpWWnNFSg0KLURuYmpqdmJkcW1aaXhraEoNCi1Eb0RMS3ZiZGNUQ2pzZEtCDQotRG9Da0t2YmRjeXlQeFlxQw0KLURvREtqdmJkc3NScnh5ZGMNCi1Eb0RLanZiZHZQVHpwam50DQotRU9iamp2YmRaTHFjdE9NTg0KLURvRExLdmJkUk5YYlluVXoNCi1EbmNLanZiZEpZVUJnbFJRDQotRU9ia0t2YmRrSUdsR0ZuTA0KLURvRExLdmJkaVV6RXdTVWINCi1FUERLanZiZGVFbnJDV2JqDQotRG9ETEt2YmRSYkRka2h4aw0KLUVPYmpqdmJkWXpjRnFqV1oNCi1FT2NMS3ZiZGpnZ0xmRm5MDQotRG5jTEt2YmRnUUJ6d0VYaA0KLURvQ2pqdmJkUWx4QnlOdHoNCi1EbmJrS3ZiZG96bkRqd29BDQotRG5ia0t2YmRWZ3d1eEhZeg0KLURvRExLdmJkYWFWZGVwUVgNCi1Eb0RLanZiZExaUktTenRmDQotRVBES2p2YmRiVWJIWGtVSQ0KLUVPY0xLdmJkamhHa2ZGbWsNCi1FT2JrS3ZiZGVFb1NCdmNLDQotRG5jS2p2YmRVdE10R01Wag0KLUVQRExLdmJkSlRaQXNNeE0NCi1EbmJrS3ZiZE9FZFVKSktkDQotRG9ES2p2YmRaSFhFQVBTaQ0KLUVPYmtLdmJkdWFEeVRQRkkNCi1EbmJqanZiZHFBaUZBV2hFDQotRU9iamp2YmRlbGV2Z05LTA0KLURuYmpqdmJkVEFFaGdiUEUNCi1Eb0RLanZiZG5QelpWa1pDDQotRG9ES2p2YmRRd05kRExoRA0KLURuYmpqdmJkbkJqV3dvTnUNCi1FT2JrS3ZiZGZNZXdHbGpMDQotRG5jS2p2YmRycFZuakN1Zg0KLUVQRExLdmJkTEdGZ2JCUlYNCi1FT2JrS3ZiZGtDa2tSSFVnDQotRU9ia0t2YmRUbFZvQXVvSg0KLUVQRExLdmJkck15alpNSGkNCi1FT2NMS3ZiZFdId3V4SFl6DQotRU9jS2p2YmRMclhOWnRweg0KLUVPYmpqdmJkYlFISERremQNCi1FT2NMS3ZiZGZJTFdSblJIDQotRVBDamp2YmR5ZnlNQU1lWA0KLURuY0xLdmJkTkhDcE5RVkwNCi1FUENqanZiZEZrRXNESGx1DQotRG5jS2p2YmRHR0pxbWh0Ug0KLURuYmtLdmJkdkFjeHJuZGgNCi1Eb0NqanZiZHFHRGVUdkJJDQotRG9Damp2YmRKdlVmRGRnSg0KLURvQ2pqdmJkVVZsUGlzYVINCi1Eb0NrS3ZiZHFUc2dTUmtVDQotRU9iamp2YmRqYmxLcGZ0Zw0KLUVPYmtLdmJkdGNEVlhXUFANCi1EbmJrS3ZiZGZIa1ZxblJIDQotRG5jTEt2YmRtb3l4dkxaQw0KLUVPYmpqdmJka0hma2ZGbkwNCi1FUERLanZiZHdOV0FNY2RtDQotRVBDamp2YmRKcHpGT2ZOZQ0KLURuY0tqdmJkbWJKdnhPblYNCi1EbmNLanZiZFRxUW51VWdtDQotRU9jTEt2YmRUcHFPdVZIbQ0KLURvQ2pqdmJkWWxTRVRta20NCi1Eb0RLanZiZGpFa0d1UEFPDQotRG9Da0t2YmR3eWdlZlhkcg0KLUVPYmtLdmJkclhQa2NKWXENCi1Eb0NqanZiZHhVbGVReU1PDQotRU9jTEt2YmRCc0FjVGZYUw0KLUVQRExLdmJkTEJMR2xiWHENCi1FT2JqanZiZG1iSnZ3bm5WDQotRG5iamp2YmRiVkNHd2pzaA0KLURuYmtLdmJkeFVtRXB5TU8NCi1FUENrS3ZiZFlTbEJOVG54DQotRG9ES2p2YmRlT2VTa1VUcg0KLURuY0xLdmJkcW1aaXhsSGkNCi1FUENrS3ZiZE5IQ3BOUVZMDQotRG9Da0t2YmREaWdqV1hqQQ0KLUVPYmpqdmJkckRlSlFOdkINCi1FT2NMS3ZiZEp1dUdEZUhKDQotRG9Da0t2YmRkZG5yQ1hDag0KLURvREtqdmJkcVR0R3FyS3QNCi1Eb0RLanZiZGVPZVRLc3RTDQotRU9iamp2YmR5U21pTlJiSA0KLURuYmpqdmJkWnNoaVlkVE8NCi1FT2JqanZiZG5DS1hYbm11DQotRVBES2p2YmRxaUFLRk1uZQ0KLURvREtqdmJkTmVFVUlpS2QNCi1EbmJqanZiZHppdHBQZFRVDQotRVBDa0t2YmR6YUFPZmZhbA0KLUVPY0tqdmJkWnRJaVpEcm4NCi1Eb0NqanZiZHRTclRZeWVEDQotRG9ETEt2YmRGVnhvcE5KZQ0KLURvRExLdmJkSkpkQUpwSEUNCi1Eb0RMS3ZiZEhEanVpYWlqDQotRU9ia0t2YmRVV01RS1VBcQ0KLUVQREtqdmJkVHBxT3VWSU4NCi1FT2NMS3ZiZHF2cE1DaHlSDQotRG9Da0t2YmRWdmlYdWRFZw0KLURvQ2tLdmJkR0xFcmJnbVYNCi1FUENrS3ZiZFppcmhQZmJHDQotRG9Da0t2YmRXWEpZVmNlSA0KLURuYmpqdmJkaGtlRU9VY1oNCi1EbmNLanZiZFNQdEhKZWRYDQotRG5jS2p2YmRGZktSbklzcQ0KLURuY0tqdmJkV1doeFZkRWcNCi1Eb0NrS3ZiZE9TdFdIRXVRDQotRG9ETEt2YmRFdXlRUG1LRg0KLURuY0tqdmJkcnBWb0tEV0cNCi1Eb0NqanZiZEtWdGZFRWZpDQotRG9Damp2YmRXWEl3dWRFZw0KLUVQREtqdmJkU0NEZU1JeUwNCi1FUERLanZiZERvREtrWENkDQotRG9Da0t2YmRKcHpFbmVuRg0KLUVQREtqdmJkYWFXRWZQb3cNCi1Eb0NqanZiZFZ3Slh1Y2RnDQotRVBDamp2YmRhdUNIWUt0SQ0KLUVPY0xLdmJkTmVEc2hoa0UNCi1EbmNMS3ZiZE5HY1FNcFZMDQotRU9jTEt2YmRJcnlCU21YbA0KLURuYmtLdmJkVEFGSklDUEUNCi1FT2NMS3ZiZHJNektZbEhpDQotRU9jS2p2YmR6bm9wZURNWQ0KLUVPY0xLdmJkTVJ2bVp1UXoNCi1EbmNLanZiZGVGT3FiWENqDQotRG5jTEt2YmRiaGxpamZXeA0KLUVPY0tqdmJkcWRFaHBPV0INCi1Eb0RMS3ZiZFVXTVFKc2FSDQotRG9ETEt2YmRwdFVHcXJMVQ0KLUVPYmpqdmJkYVNHQ2hVRmsNCi1FUENqanZiZFlUTUFsdE94DQotRG5jS2p2YmRFUENrTFdiZA0KLUVPY0tqdmJkS0NqRFJLQ3gNCi1FUERLanZiZFp5RGpOY01TDQotRG5jTEt2YmRGZktSbkpVUg0KLUVQREtqdmJkck5aaXlMaEoNCi1FT2NLanZiZFplWGZ6Z2lDDQotRU9jS2p2YmRiVWJHd2tUaA0KLUVQRExLdmJkSGZnWnh3eEgNCi1EbmNMS3ZiZHJvdk9qQ3VmDQotRG5iamp2YmRmTkdXZmxpaw0KLURuYmtLdmJkWm9OaUZFeWoNCi1FUENqanZiZGRuZVRLdFVTDQotRU9iamp2YmRSYkRkbEl4aw0KLUVPY0tqdmJkS2ZGZ2JCUlYNCi1FUERLanZiZEZ5VXVCRHhDDQotRVBDa0t2YmRpVXpGWFJ0Yg0KLUVQQ2pqdmJkckpBSmVOUEYNCi1EbmNMS3ZiZFZBYlJTcVNaDQotRU9iamp2YmRhTktiVFZNZw0KLURvQ2tLdmJkbGhjdFF0cWENCi1Eb0RLanZiZFpzaGlaRHJuDQotRVBETEt2YmRGa0ZTYmdsdQ0KLUVQQ2pqdmJkSGZmeXh3eEgNCi1EbmNLanZiZFR2TG9qVGFSDQotRG5ia0t2YmRhdUNIWGtVSQ0KLURvREtqdmJkR2RLdWlhaksNCi1FT2NLanZiZGtDbEtxSFZIDQotRVBETEt2YmRuVXR5a0tTRw0KLURuYmtLdmJkQmlLYktoZWoNCi1Eb0RMS3ZiZEhmZnpaWHdnDQotRVBDamp2YmRicmJrVGNqQg0KLURvQ2tLdmJkVndKWVdEZGcNCi1EbmNMS3ZiZEpKZEFKb2dFDQotRVBDa0t2YmRKdlVmRGRmaQ0KLURvREtqdmJkWmVZR3pnaUMNCi1FT2JqanZiZFp5RUpuRE1TDQotRU9jTEt2YmRtU1pWWnNFSg0KLUVQQ2tLdmJkRG5iamp2YmQNCi1FUENrS3ZiZEp2VkdEZUdpDQotRG9Damp2YmRUWGtMbXprWQ0KLURuYmtLdmJkTHF3Tlp1UXoNCi1EbmNLanZiZFp0SWlZY3NPDQotRG9ES2p2YmRMWXFLU3p0Zg0KLURuYmtLdmJkVUx1b0JWbmkNCi1FT2JrS3ZiZGlCbmJlV3FSDQotRU9iamp2YmRmSUxXUm1xSA0KLURuY0tqdmJkZXp2WWRoc3cNCi1EbmJqanZiZEp2VWZFRWZpDQotRVBDa0t2YmRScFVIS0dEdw0KLUVPYmtLdmJkWkd3RUFQVEoNCi1FT2NMS3ZiZGNUQ2tVRUtCDQotRU9iamp2YmRHQW9ReGl6bQ0KLURuYmpqdmJkTndvVnpjbXQNCi1EbmNMS3ZiZEpiaWNSS0RZDQotRG5ia0t2YmRHWlZWQWN4Qw0KLUVQQ2tLdmJkUmFkRk1KWWsNCi1EbmJqanZiZHhzTmlOUmFnDQotRG5iamp2YmRpQm5jRlhSUg0KLUVQQ2pqdmJkeVNtaU5SYkgNCi1Eb0RLanZiZGVBVHFNeEtHDQotRG5iamp2YmR0U3JTeVpkYw0KLUVPY0tqdmJkd3RsZHB5TG4NCi1FUERLanZiZHF3UGtiaVlxDQotRVBETEt2YmR6aXRwUGNzVQ0KLURvREtqdmJkRGpIaXV3akENCi1FUENrS3ZiZGZNZXdHbUtMDQotRG5jS2p2YmRscll0eXJjaQ0KLUVQQ2pqdmJkWlFsZGlNZHENCi1FUERLanZiZEpiakRRakN4DQotRG5jS2p2YmRxVHNnUnJLdA0KLUVQQ2tLdmJkRXZaUVBsakYNCi1Eb0NrS3ZiZFVzbHRHTVdLDQotRU9jTEt2YmRFSmdpdlhqQQ0KLURuYmtLdmJkZVBGVExUdFMNCi1FUERLanZiZEVZWUxzdFRsDQotRVBES2p2YmRNZmNQbVB1TA0KLURvREtqdmJkQnNBY1RldnINCi1FUERMS3ZiZHd0bGVSWk1PDQotRU9iamp2YmRSb3RISmZEdw0KLUVPY0tqdmJkSnV1RmRGSEoNCi1EbmJqanZiZFpvT0llRlpqDQotRG9ETEt2YmRzWmxRU2FIbg0KLUVQQ2pqdmJkZG9GVExUdFMNCi1EbmNLanZiZGJWQmdYanNoDQotRVBDa0t2YmRhTWtCcnRsZw0KLUVQREtqdmJkZGlpcXV0em4NCi1FT2JrS3ZiZGladUZrcG5HDQotRVBDa0t2YmRJeFRhZ2xSUQ0KLUVPY0tqdmJkdWFFWXJuZGgNCi1EbmJqanZiZHpRb01pSndBDQotRG9Da0t2YmRzQ0dOTUhLeQ0KLUVPYmpqdmJkTW94UXVuSFQNCi1EbmJrS3ZiZHh3aUpiUHpMDQotRU9jTEt2YmRKYmlicGpDeA0KLURuY0tqdmJkSXhUYkhrcHANCi1Eb0NrS3ZiZHd1TWVReGxPDQotRU9jS2p2YmRLZWVoQ0JSVg0KLUVQQ2tLdmJkWnhkS05ibFMNCi1FUENqanZiZExGZWdiQlF1DQotRG9Da0t2YmR1THd3QlVCWA0KLURvREtqdmJkamxiTVplSFANCi1Eb0RMS3ZiZGpBUGZhUGZqDQotRU9iamp2YmRxR0VGVHZCSQ0KLUVPYmpqdmJkZUFVUk5YaWYNCi1FT2JqanZiZHhtcmd4VEpEDQotRVBDa0t2YmRxR0RlVVdBaA0KLURuY0tqdmJkcVRzZnFyS3QNCi1FT2JqanZiZGpFamZ0b0FPDQotRU9jS2p2YmROcnRXSEZVcA0KLUVPYmtLdmJkdUNjVXZ2T28NCi1FUENrS3ZiZHZ3TUF2QldWDQotRG5jTEt2YmR0a3d3QlVCWA0KLURvQ2pqdmJkVlpIc3lqbm4NCi1FUERLanZiZFFjY0JRUWRTDQotRG5ia0t2YmRqZ2ZrZWVtaw0KLUVQRExLdmJkRnlWVkJEeEMNCi1EbmNMS3ZiZHJOWml5TUlKDQotRU9iamp2YmRIZmdaeHd3Zw0KLURvREtqdmJkcWNlSW9tdkINCi1FUENrS3ZiZE5HY1Bsb3VMDQotRG9Da0t2YmRDSWtCa0llag0KLURvQ2pqdmJkaktGaEptWVMNCi1FT2JrS3ZiZEJzQkRVR1dyDQotRU9ia0t2YmRuUVp4dkt5Qw0KLURuYmpqdmJkaHpWRmtxT0cNCi1FUENqanZiZEdMRlNjSGx1DQotRG9Damp2YmR0bFh3QXRCWA0KLURvRExLdmJkVXRNdEZrdksNCi1Eb0NrS3ZiZEJ2emNoZG92DQotRG5jTEt2YmRsWlNyVFpIVQ0KLUVPY0tqdmJkWm5uSkVkeWoNCi1EbmNLanZiZFlwbGVKTWRxDQotRVBES2p2YmRpTUVjbXRjWg0KLUVQQ2pqdmJkZmVsWm1nSEENCi1EbmJrS3ZiZExoYWxSWUFTDQotRG5jS2p2YmRlaExXUm5SSA0KLURuYmpqdmJkZUtKcXZVem4NCi1FUENqanZiZHFxdGtPTEJODQotRU9jTEt2YmRmUmFXemxEUA0KLURuY0xLdmJkaHR6RldxdUMNCi1FT2JrS3ZiZEp2VkZkRkdpDQotRU9ia0t2YmRNZmNQbG90aw0KLURvQ2pqdmJkdGNDdVd2UFANCi1EbmJqanZiZHd0bUZSWk1PDQotRG9ES2p2YmRzUHZQS0N2Rw0KLUVQQ2pqdmJkbWZkd21PSFoNCi1FUERMS3ZiZE1nRFBsb3VMDQotRG9ES2p2YmRuR2R3bG5IWg0KLURvQ2tLdmJkVndKWHVkRkgNCi1FT2JqanZiZFFkQ2FRUWNyDQotRG5ia0t2YmRZU2thTlVQWQ0KLURvQ2pqdmJkVUx2UEF1bmkNCi1FUENqanZiZFNaaWhTY1dBDQotRG9Da0t2YmRCaUxDS2hlag0KLURuYmtLdmJkaFhaQXp6QUoNCi1FT2NMS3ZiZFFZbUFHc1JqDQotRU9jTEt2YmRadEpJeURybg0KLURuYmtLdmJkTnNUdWZkdVENCi1FT2NLanZiZEVYeE1VVHNsDQotRG9ETEt2YmRLeVJKcnp1Rw0KLURvREtqdmJkcldwTGJoeHENCi1EbmJqanZiZHJEZUlvbldCDQotRVBES2p2YmRIRUxWaWFpag0KLURvRExLdmJkQmRRQldKbUcNCi1EbmNMS3ZiZFJqeUdVZmtUDQotRVBETEt2YmRZTnFBWVV1dA0KLUVQREtqdmJkUlhOZENsSUQNCi1FUENrS3ZiZE53bnV6ZE9VDQotRU9jTEt2YmRqbUJreWRmbw0KLURvQ2pqdmJkcnBXUEtEVmYNCi1FUENrS3ZiZFp5RUtOYmtyDQotRU9jS2p2YmRRWk5BSFRSag0KLUVPY0tqdmJkd3RtRXB4a24NCi1EbmNMS3ZiZExoYk1SWUFTDQotRG9Damp2YmRzcnJUWlpkYw0KLURuY0tqdmJkeG1yZ3hTaGMNCi1FUENrS3ZiZG1velpWa1pDDQotRVBDamp2YmRic0RMVGNpYQ0KLURvREtqdmJkR0tlU2NJTXUNCi1FUENqanZiZHJFRklwT1dCDQotRU9jS2p2YmRtcFp4dWtaQw0KLURvQ2tLdmJkVGt1bmFWbmkNCi1Eb0NqanZiZGRuZVNrVVVTDQotRVBDamp2YmRUbFZvQldQSg0KLURvREtqdmJkeHNOaG1TQ0gNCi1FUENrS3ZiZFZ2aVh2RGRnDQotRG5iamp2YmR3ekhmRndkcg0KLUVQREtqdmJkZk1ld0hNakwNCi1Eb0NqanZiZGJzREt0RGpCDQotRVBETEt2YmRVUXBvVlZJTg0KLUVPYmtLdmJkckVGSlBtdWENCi1FT2JrS3ZiZGhsRWNuVWNaDQotRG9ES2p2YmRaUk1lSWxlUg0KLURuYmpqdmJkbWFqWFlPblYNCi1Eb0RLanZiZGFSZkRIdEdMDQotRG9Damp2YmRiaGxqS2V3WQ0KLURvRExLdmJkRHd3a3Nzc2wNCi1EbmNMS3ZiZFVNV09hVm9KDQotRG5jS2p2YmRXV2lZV0RkZw0KLURvQ2pqdmJkeVhpSmJRWmsNCi1EbmJrS3ZiZEhEa1ZpYktLDQotRVBDamp2YmR0U3JTeHpFYw0KLUVPY0xLdmJkYVNHQ2hVRmsNCi1EbmJrS3ZiZFlTbEJOVU94DQotRVBETEt2YmRKVFpCU21ZTQ0KLURvQ2pqdmJkVGt2T2FXT2kNCi1EbmNLanZiZE1vd3B2TmZzDQotRVBES2p2YmRlRW5xYXZjSw0KLUVPY0xLdmJkaWlmSUpseFMNCi1EbmJrS3ZiZHFjZUlwTnVhDQotRVBES2p2YmRyTlppeGtoSg0KLURuY0tqdmJkaUhLRFpWaXUNCi1EbmJrS3ZiZHJEZGlQbldCDQotRG5jTEt2YmRMR0ZoQ0FxVg0KLURvQ2pqdmJkd3VNZHFZbE8NCi1FUENqanZiZGVQRlRLc3NyDQotRU9iamp2YmRWQkNRcnBxeQ0KLUVPYmpqdmJkYnJjS3NkS0INCi1EbmJrS3ZiZEJ2emNpRXBXDQotRG9Damp2YmRJSEd5eVh4SA0KLUVPYmpqdmJkcnpMcFRBaE8NCi1FT2NLanZiZGVtR1dnTkprDQotRU9ia0t2YmRWWkh0Wmpubg0KLUVPY0tqdmJkaUNPYmVYUlINCi1FUENrS3ZiZHVvVHpwa1BVDQotRG9Da0t2YmRyTlpqWWtnaQ0KLURuYmtLdmJkVEFFaGdhbmQNCi1FT2NLanZiZGh1WmR3UnVDDQotRG9ETEt2YmRXV2lYdWNlSA0KLUVQREtqdmJkWm9PSWRkeksNCi1EbmNMS3ZiZFZBYlJTcHJaDQotRG5iamp2YmRoZ0tEWldKdQ0KLURvQ2tLdmJkVlpJVHlrT24NCi1Eb0NrS3ZiZGlHaWJ5V0tWDQotRVBETEt2YmR3eWhHR1lGUw0KLURvREtqdmJkaUhLQ3h2SnUNCi1FUERMS3ZiZGh5dUdMcG5HDQotRVBES2p2YmRPQUpTdEtTQQ0KLUVPY0tqdmJkeml0cFBkU3QNCi1Eb0NrS3ZiZHpST2xoalhBDQotRG9ETEt2YmR0VFNTeHpFYw0KLURvREtqdmJkem9RUkZDa3gNCi1EbmJrS3ZiZHhuU2d4U2hjDQotRG5iamp2YmRpQm9ERldxUg0KLURvQ2pqdmJkbkJqV3dvTnUNCi1EbmNMS3ZiZFZZaFR6S25uDQotRG5jTEt2YmRrSUdrZWZOaw0KLURuYmtLdmJkbHF4dVpzRUoNCi1FT2NMS3ZiZEFDcllKeklwDQotRVBES2p2YmRtYWl3WU9uVg0KLUVPY0tqdmJkWWtyRVVObE4NCi1Eb0NqanZiZFZVTlRmTHVqDQotRG9ETEt2YmRmSGtXU09RZw0KLURuYmtLdmJkQnJhQ3NmWFMNCi1FT2NLanZiZE1KQmtweEFTDQotRG9ES2p2YmRjeXlRWHlRYg0KLUVPYmtLdmJkZUVuckNYREsNCi1FT2JrS3ZiZEZlalNOaVRxDQotRG9Damp2YmRFWVhrc3RUbA0KLUVQREtqdmJkeVlJakJwWmsNCi1EbmNLanZiZGlISmNaV0tWDQotRG5jS2p2YmRRZERBb3FEcg0KLUVPYmtLdmJkdUREVXZ2T28NCi1FUENrS3ZiZHpHeU1BTkV3DQotRG9ES2p2YmRRdm5FQ2tnYw0KLURuY0tqdmJkVnZpWHVkRWcNCi1Eb0RMS3ZiZFFaTkFIVFNLDQotRVBES2p2YmRrQ2tqcUhVZw0KLUVPYmpqdmJkd3loRmV3ZVMNCi1Eb0NqanZiZHh3aUpiUVprDQotRU9jTEt2YmRFUERMTFhERQ0KLURuY0xLdmJkVnJOd2JGTGMNCi1Eb0NrS3ZiZGpBUGdCUGdLDQotRU9jS2p2YmRwc3RHcXFqdA0KLUVQRExLdmJkSERrVmpDS0sNCi1EbmNLanZiZGlyemhyaml6DQotRG5iamp2YmR4cm5KTlNCZw0KLUVQQ2tLdmJkcmFlbGtnTFoNCi1EbmNMS3ZiZHB0VGdScWp0DQotRG9Da0t2YmRJc1lhVE14TQ0KLURvQ2pqdmJkTXBYcVZuR3MNCi1Eb0RMS3ZiZFVWa29pdEJSDQotRG9Da0t2YmRqbUNMeWVIUA0KLURvQ2pqdmJkaVZaZVdxdUMNCi1Eb0NqanZiZFZVTXRGbFdLDQotRVBETEt2YmR4S3ZkSHp6Rw0KLURvREtqdmJkaU1FZE51Q3kNCi1FUERLanZiZHd6SUZmWUVyDQotRU9iamp2YmRKWHNhZ2twcA0KLUVQQ2tLdmJkeHJtaG1TQmcNCi1Eb0RLanZiZGxxeHVac0RpDQotRVBES2p2YmRzUVZvSmNWZg0KLURuYmpqdmJkRVlZTHN0VU0NCi1EbmNMS3ZiZGtIZ0xmR05rDQotRVBDamp2YmRic0RLdERqQg0KLURuYmpqdmJkSmNLRFFpYngNCi1Eb0NqanZiZHl6ZG5TSUloDQotRG5ia0t2YmRycFdPakN1Zg0KLUVPYmpqdmJkYkF1ZGVvcFgNCi1EbmJrS3ZiZFlrcWN0TmxODQotRVBETEt2YmRmSGtXUm5SSA0KLUVQRExLdmJkWG1xQVlVdXQNCi1EbmNLanZiZEZ5VlZCRVhiDQotRG5ia0t2YmRyRGRocE51YQ0KLURuY0tqdmJkZUFVUk5YakcNCi1Eb0NrS3ZiZE9UVVZnRXVRDQotRVBDamp2YmRkd3lzc3JGeg0KLURvQ2pqdmJkTXBZUldOZnMNCi1Eb0NrS3ZiZGp1dm5EYXd3DQotRG5ia0t2YmRWaFh2WGdZeg0KLUVPYmpqdmJkVHVsUUtUYVINCi1FT2JqanZiZE9BSlRVSnJBDQotRVBETEt2YmRzWmtvc0JJTw0KLURvQ2tLdmJkaGdKYnh2S1YNCi1FUENqanZiZG5CaXZ4T25WDQotRG5jS2p2YmR4cm5JbHJDSA0KLURuY0xLdmJkemFBUEhHYk0NCi1FUENrS3ZiZHVNWHZhVUJYDQotRG5ia0t2YmRTQmNlTUpaTA0KLUVPYmpqdmJkSnB6RW9HT0YNCi1EbmJrS3ZiZFdleHl0QVBUDQotRG5ia0t2YmRrVndOY2F4WA0KLUVPY0xLdmJkRVlZTHNzdE0NCi1Eb0NrS3ZiZFJvc2ZpZWRYDQotRU9jS2p2YmR3dU1kcHlNTw0KLUVPYmpqdmJkVXNtVUZsV0sNCi1FT2JqanZiZGp1d09FQ1h3DQotRG5jS2p2YmRxbHpKeGtnaQ0KLURvQ2tLdmJkaUhKYnh1alYNCi1FUERMS3ZiZGFrTUZvTmNBDQotRU9jTEt2YmRtSWNzcVVxYQ0KLUVQQ2tLdmJkZUtLU1Z0em4NCi1FUENrS3ZiZHZCRVpUT2VJDQotRG5jS2p2YmRwc3RIU1JqdA0KLUVPY0tqdmJkS1Z1R0VFZmkNCi1Eb0RMS3ZiZFpRbGRpTkZSDQotRVBDamp2YmR4blRJWVNoYw0KLUVPY0tqdmJkdHVuWGpRc0ENCi1FUERLanZiZGpjTGtSSFZIDQotRG5jS2p2YmREb0RMTFhDZA0KLURuYmpqdmJkWnlFSm5ETVMNCi1Eb0RMS3ZiZEZrRlRDZ21WDQotRU9jS2p2YmRoa2RkT1VieQ0KLUVQRExLdmJkTmVFVUpJa0UNCi1EbmJrS3ZiZHl6ZU5xZ2hoDQotRVBES2p2YmRGVnhvcE1qRg0KLUVPY0tqdmJkR2RMVmliS0sNCi1EbmNLanZiZEJkUUF2SmxmDQotRG9ES2p2YmRiaU5LTEZ3WQ0KLUVQQ2tLdmJkbkdlWU5OZ1oNCi1FUERMS3ZiZEVZWGxVVHNsDQotRG5jTEt2YmRPRWNzaUlqZA0KLURuY0tqdmJkS2FMSE1iWVINCi1EbmNLanZiZHlUT0lsckNIDQotRVBDa0t2YmRNcFhwdW1nVA0KLUVQQ2pqdmJkdGJidHdWbm8NCi1Eb0RLanZiZHJSdGtPTEFtDQotRU9iamp2YmRiTExmUE5jQQ0KLURuY0tqdmJkam1DTHlkZ1ANCi1EbmJrS3ZiZFRrdW9CVm9KDQotRG5ia0t2YmRTQ0RkbEpZaw0KLUVPYmtLdmJkQ0VQYVZqTkcNCi1Eb0RMS3ZiZEZhT3B4aXptDQotRVBDamp2YmRmTWV2Z01qTA0KLURvQ2tLdmJkWXpjR1JqVnkNCi1EbmJqanZiZEtSWmRvR05lDQotRVBETEt2YmRaaXNJUUhDRw0KLUVPY0xLdmJkWk1TRVVPTU4NCi1Eb0NqanZiZGlHaWJ4dWl1DQotRVBETEt2YmRaUW1GSk1lUg0KLURvQ2tLdmJkc0JlbUxmankNCi1EbmNMS3ZiZHpvUHFFY01ZDQotRG5jTEt2YmRNb3hSV09Hcw0KLUVPY0xLdmJkRmVpck9KVVINCi1Eb0RMS3ZiZHB5T2dmcGRZDQotRG5jTEt2YmR5emVPU0lKSQ0KLURvRExLdmJkUmtaRnVIS3MNCi1EbmJrS3ZiZHhWTkVxWkxuDQotRG9Damp2YmRNZ0RQbVB1TA0KLUVQREtqdmJkWlFtRWhtRlINCi1EbmNLanZiZEJyYURVRndTDQotRG9Da0t2YmRxcXRqbWtBbQ0KLUVQRExLdmJkTFpRaXJ6dUcNCi1Eb0RMS3ZiZGxZc1JyeUd0DQotRU9jS2p2YmRLYUxITkJ4Ug0KLUVPY0tqdmJkVHFRb1V0aE4NCi1FT2JrS3ZiZGhiT2JlWFJSDQotRVBES2p2YmRKdXRmRGVHaQ0KLURvRExLdmJkUmtaRnVHa1QNCi1FT2NLanZiZHJiR05MZ0t5DQotRG5iamp2YmRtcFp5V0t5Qw0KLUVQREtqdmJkSEVMVmpCaWoNCi1FUENqanZiZHVERFV2dW9QDQotRU9jS2p2YmRyRGVJb25XQg0KLURvQ2pqdmJkblB5eVdMWkMNCi1FUERLanZiZGRuZHJqdFVTDQotRU9iamp2YmRqdXZuRGJZWA0KLUVQRExLdmJkQ0lrQmpoZksNCi1FT2JrS3ZiZFpqVEhvZ0NHDQotRU9jS2p2YmRqSmVoS05ZUw0KLURuYmtLdmJkU3hMTU56a1kNCi1Eb0RMS3ZiZEtES0RSSmNZDQotRVBDa0t2YmRtcFp4dkt4Yg0KLURuYmpqdmJkc3NTVFl5ZUQNCi1FT2JqanZiZEhEa1ZpYkpqDQotRG5ia0t2YmRTTFpGdGdMVA0KLURvQ2pqdmJkeG5USVhyaUQNCi1EbmJrS3ZiZGNTYmpzZEphDQotRG9Da0t2YmR1b1R6cGpvVQ0KLURvQ2pqdmJkWHNMYU5VT3gNCi1Eb0RMS3ZiZGNTY0t0RUphDQotRG5ia0t2YmRmcEJ6d0R3aA0KLUVQREtqdmJkamxha3llR28NCi1EbmJqanZiZFl6Y0ZxaXZaDQotRG5jTEt2YmRDSWtCamlHSw0KLUVQRExLdmJkeFpoRmZZRlMNCi1FT2JqanZiZHJFRkpRTnZCDQotRG9ETEt2YmRqQVBnQlFISw0KLUVPY0xLdmJka0RManFIVWcNCi1Eb0NrS3ZiZGlVekZXcXRiDQotRG9Da0t2YmRLVnRmRGRmaQ0KLURvRExLdmJkd2tYRUh6eWYNCi1FT2JqanZiZHFjZGhwT1dCDQotRVBDa0t2YmRlRW5yQnZiag0KLURvQ2tLdmJkQ1RBYnNld1MNCi1EbmJqanZiZE5IQ3BNb3VMDQotRG9ES2p2YmRTUVVHaWVjdw0KLURvRExLdmJkZWxldmZtS0wNCi1Eb0NrS3ZiZHlTbkltU0NIDQotRG5jS2p2YmRBTklaU3Z6WQ0KLURuY0tqdmJkckpBSmVOUEYNCi1FUENqanZiZHFUdEdxcWp0DQotRU9iamp2YmRhUmZESHNmTA0KLUVQQ2tLdmJkckpBSmVNbmUNCi1FUERLanZiZGlHakRZdkp1DQotRG9ES2p2YmRNZ0NwTXBWTA0KLURuY0tqdmJkWmpUSVFIQ0cNCi1FT2NMS3ZiZEpZVGJJTHFRDQotRG9Da0t2YmR6b1BxRWJreA0KLUVQRExLdmJkdmx2QU5EZU4NCi1EbmNMS3ZiZGF0YWZ3anNoDQotRG5jTEt2YmRKdXVGY2RnSg0KLURuY0xLdmJkd1hNQXZCV1YNCi1Eb0RMS3ZiZGFNamJTdG1IDQotRG9Da0t2YmRlT2RzTFR0Uw0KLURvREtqdmJkYkxMZW9OY0ENCi1FUERLanZiZEpLRUFKcEdkDQotRG5iamp2YmRabm5JZUV5ag0KLUVPY0xLdmJkdW5zenBqbnQNCi1FT2JrS3ZiZG1veXlXS3hiDQotRU9ia0t2YmRJTGF6bXZwaw0KLUVQREtqdmJkUWx3YlltdHoNCi1FUENqanZiZGVyQXZ6a2NQDQotRU9ia0t2YmRlZ2p2U09SSA0KLUVPY0tqdmJkc3Jxc1l5ZGMNCi1FT2NLanZiZGZJS3ZTT1JIDQotRG5ia0t2YmRGamRzRElNdQ0KLUVQREtqdmJkcHN0SFJxanQNCi1FT2NMS3ZiZFdSbXhDRWxEDQotRU9jTEt2YmRrSGZsR0ZuTA0KLURvQ2pqdmJkWmpUSG9mYkcNCi1FT2JqanZiZGVFb1NCd0NqDQotRVBDa0t2YmRKU3lCVE5YbA0KLURuYmtLdmJkVWFDUlRRcXkNCi1FUERLanZiZFNMWkZ0ZmtUDQotRG5jS2p2YmR5TnJnd3NKRA0KLURvREtqdmJkZXp1eGRpVVgNCi1Eb0RMS3ZiZEFDclhpeWhwDQotRG9ETEt2YmR4d2lKYW95aw0KLUVPY0tqdmJkVXhoVHpMT24NCi1EbmJqanZiZG5IRllOTmZ5DQotRU9jTEt2YmRoYW5iZVdxUg0KLURvREtqdmJkekhZbEFNZHcNCi1Eb0NqanZiZEt5UkpyenVHDQotRG5jTEt2YmRsaUVUcHVSYQ0KLUVPYmtLdmJkY3pZcFh5UkMNCi1Eb0RLanZiZEZmS1JuSXNxDQotRVBES2p2YmRWQWJRc1JTWg0KLURuY0tqdmJkZXp2WkVpVVgNCi1Eb0NrS3ZiZFppc0hvZmJHDQotRVBES2p2YmRqS0ZnaWx4Uw0KLUVPY0xLdmJkdVZteEtRc0ENCi1EbmJqanZiZGh1WmVXclViDQotRU9ia0t2YmRHWXVVYUR4Qw0KLURvRExLdmJkYWFXRkdQcFgNCi1EbmJrS3ZiZFVRcG9WVWhODQotRVBDamp2YmRaeGRKbWNNUw0KLURuY0tqdmJkaGJQQ2R3UlINCi1FT2JrS3ZiZFpSTWVKTkZSDQotRG5iamp2YmRUbFZvQldPaQ0KLURvQ2tLdmJkYXRiSFlLdEkNCi1FT2JrS3ZiZGlISmJ4dkp1DQotRG5jS2p2YmRzUVdPakN2Rw0KLURuY0xLdmJkUm9zZmpHRVgNCi1FT2JrS3ZiZFJFREJRUkRyDQotRU9jTEt2YmRlRW5xYXdDag0KLUVQRExLdmJkR1pWVWFFWGINCi1FUERMS3ZiZElyeUFybVhsDQotRU9iamp2YmRpaWVoSmx3cg0KLURvQ2tLdmJkTUpDTVJZQVMNCi1EbmJrS3ZiZGxyWXR6VERpDQotRG9ETEt2YmRuR2VYbG1meQ0KLURvQ2tLdmJkU0NEZU1KWkwNCi1FT2JrS3ZiZExGZWdhYVJWDQotRG9ES2p2YmRHR0tSbWhzcQ0KLUVPYmtLdmJkaUxkY25WRFoNCi1EbmJqanZiZEdCT3FaSnptDQotRG5iamp2YmRoZmpDeHZLVg0KLUVQQ2pqdmJkbEJOUE5BTEENCi1FT2NLanZiZHRiYnVYV1BQDQotRG5jTEt2YmRFUENqandERQ0KLURvRExLdmJkTHF3Tlp0cHoNCi1FUERMS3ZiZGJWQ0d3a1VJDQotRG5jTEt2YmRaeURpbWNMcg0KLURuY0xLdmJkZklMV1NOcGcNCi1Eb0RLanZiZEZWeVBwTkplDQotRG5jS2p2YmRxaUFKZU1vRg0KLUVPY0tqdmJkcXJWTE9MQW0NCi1Eb0NqanZiZGVoS3VxblFnDQotRG9ETEt2YmRHTEZUQ2dsdQ0KLURvQ2pqdmJkWHJsQk10UFkNCi1EbmNLanZiZGxZcnJUWWdVDQotRVBDa0t2YmRXU054Q0ZNRA0KLURuY0tqdmJkVVZrb2l0QXENCi1EbmNMS3ZiZGZIanZTT1JIDQotRG9Da0t2YmRDRVBhV0tNZg0KLUVPYmtLdmJkbWJKdnhQT1YNCi1FUERLanZiZHd6SGVmWGVTDQotRU9jS2p2YmR2dmxBdkF1dQ0KLURuY0xLdmJkcHhuZ2ZxRHgNCi1EbmJqanZiZEl3dENJTVFwDQotRG5jS2p2YmRIRGp2S0JqSw0KLUVPY0tqdmJkam1DTHpGR28NCi1EbmJrS3ZiZFpNUmRUbk1ODQotRU9iamp2YmRFT2NMTFdiZA0KLURvRExLdmJka05CbFpkZm8NCi1FUENqanZiZGVtR1hITktMDQotRU9jTEt2YmRreHJxcnlHdA0KLUVPY0tqdmJkc1B2UEtEV0cNCi1FT2NLanZiZFhzTUFsc29ZDQotRG5ia0t2YmRtSWNzcHVTQg0KLURvQ2pqdmJkVWFCcHNSUnkNCi1FT2NMS3ZiZFNQc2ZpZWRYDQotRU9jS2p2YmRTQ0VFa2lZaw0KLURuY0tqdmJkV1hKWHVkRWcNCi1EbmNMS3ZiZFJ5aWdyYnZBDQotRG9ETEt2YmRVTVZvQXZPaQ0KLURuYmpqdmJkWnRJaHhjc08NCi1FT2NMS3ZiZEpYc2JIa3BwDQotRG5ia0t2YmRadEloeUVUTw0KLURuY0xLdmJkSGxCem12cGsNCi1FT2JrS3ZiZHpIWk1BTWVYDQotRVBES2p2YmRLQ2pDcGpEWQ0KLUVPY0tqdmJkamJsS3FIVWcNCi1Eb0RLanZiZEdHSnJOaVVSDQotRG9ETEt2YmRyRUZJb212Qg0KLUVQQ2tLdmJkcm92UEtEVmYNCi1Eb0RLanZiZHB4bmhHcGRZDQotRVBES2p2YmRlbUdXZ05LTA0KLUVQRExLdmJkVGxXUEF1b0oNCi1FT2NMS3ZiZGh1WmVXcXRiDQotRG5ia0t2YmRoeXVHTHBuRw0KLUVPYmpqdmJkU0JjZGxKWkwNCi1EbmJrS3ZiZGVFbnFiV2NLDQotRG5iamp2YmRKS0VBSm9mZA0KLUVPYmpqdmJkYlFHZmNremQNCi1FUENqanZiZFJrWWV1SExUDQotRG9ETEt2YmRYcmxCTXRPeA0KLUVPYmtLdmJkem5vcUZDa3gNCi1FUERMS3ZiZGpnZ0xmRm5MDQotRVBES2p2YmRodVpkd1NWQw0KLUVQQ2tLdmJkZUVvUmJYREsNCi1FUENrS3ZiZEthS2dOQ1lSDQotRG9ETEt2YmRXV2h4V0RkZw0KLUVQQ2pqdmJkcVVUZnFxanQNCi1FT2NLanZiZGNTYmtUZEphDQotRG5jS2p2YmRhdUNIWGp0SQ0KLURvQ2tLdmJkUWx3YlpOdHoNCi1EbmJqanZiZHF2b2xDaVlxDQotRU9jTEt2YmRlUEZTanN0Uw0KLUVPY0tqdmJkaGdLRFpXS1YNCi1FT2JrS3ZiZENnTGZIQXpjDQotRG5jS2p2YmRuVXVaa0tTRw0KLURuYmpqdmJkbGhjdFJVckINCi1Eb0RLanZiZHB5UEhnUkVZDQotRG9Da0t2YmRqSmVnaW1Ycg0KLUVQREtqdmJkZkhrVnJPUkgNCi1FUERLanZiZHlUT0lscWJIDQotRVBES2p2YmRqS0ZoS05ZUw0KLUVQREtqdmJkRldaUHBNaWUNCi1FUENqanZiZEl3c2FoTHBwDQotRU9ia0t2YmRLZkdJQmFRdQ0KLURuY0tqdmJkR0Zpck9KVHENCi1EbmJqanZiZHBlZEZVV0JJDQotRVBDa0t2YmROZURzaGlLZA0KLUVPYmpqdmJkQmlMQmpoZWoNCi1FT2JqanZiZENKS2JMSkZqDQotRG5jS2p2YmR2d01BdWFXVg0KLURuYmpqdmJkWlJNZGhsZVINCi1EbmNLanZiZGhnS0N5Vml1DQotRG9Da0t2YmRoZmljWldLVg0KLURuYmpqdmJkd2tXZEh6eWYNCi1EbmNMS3ZiZFZCQnFTcHJaDQotRU9jTEt2YmRVc21UZWxWag0KLUVPY0xLdmJkRnh1VkJFWUMNCi1Eb0RLanZiZEthTEhNYllSDQotRVBDa0t2YmRHZEt1aWFpag0KLUVQREtqdmJkZklLdlJuUWcNCi1EbmNLanZiZGZla3pOZmdBDQotRG9Da0t2YmRKYmljUkpieA0KLUVPY0tqdmJkSXdzYWdrcHANCi1EbmNLanZiZE9FY3RJaUtkDQotRG5jS2p2YmRPVFVWZmR1UQ0KLUVQQ2tLdmJkRldaUG9tS0YNCi1FT2JqanZiZGV6dlpGSlVYDQotRG9Damp2YmR0U3JUWXpGRA0KLURvQ2tLdmJkYlZDSFlMVGgNCi1FUERMS3ZiZFpNUmRVT0xtDQotRG9ETEt2YmROd29WemROdA0KLUVQRExLdmJkRmFQUlpKem0NCi1Eb0NqanZiZHhaaEdGd2VTDQotRVBDamp2YmRaUW1GSW1GUg0KLURuYmpqdmJkc1FXT2lidkcNCi1Eb0NqanZiZFNCZEZNSXhrDQotRVBDa0t2YmRFT2JrS3ZjRQ0KLURvREtqdmJkcUZjZHN2QWgNCi1FT2NLanZiZGV6dXlFaHN3DQotRG5ia0t2YmRWcW5YYWVNRA0KLUVPYmpqdmJkbkdlWGxtZ1oNCi1EbmNMS3ZiZENJa0JrSWZLDQotRVBETEt2YmRwZWNkdFdBaA0KLUVQREtqdmJkc1FWbmpDdkcNCi1Eb0RLanZiZGtETUxRZnVIDQotRU9iamp2YmRBTWhaVFd6WQ0KLUVQQ2pqdmJkaUNPYmR2cVINCi1Eb0RLanZiZFVXTG9pc2FSDQotRG5jTEt2YmRTUHRIS0dEdw0KLUVPYmpqdmJkYU5MQnJ0bUgNCi1FUERLanZiZFV5SHN6S29PDQotRG9ES2p2YmRRd05jY0xoRA0KLUVQRExLdmJkblZVektqUmYNCi1Eb0NrS3ZiZFJ5aWdyY1dBDQotRU9jTEt2YmRiaU5LTEdYWQ0KLURuY0tqdmJkbGhjdFJWU0INCi1Eb0NrS3ZiZE5QeFJXTmZzDQotRU9iamp2YmRBTkh4c1haeA0KLURuYmpqdmJkTnJzdkhFdVENCi1FUENqanZiZG1iSnZ4UE51DQotRU9jS2p2YmRKdlZHRUZHaQ0KLUVQREtqdmJkVVdMb2l0QXENCi1Eb0NrS3ZiZGtETUtwZnVIDQotRU9jTEt2YmRmamZ6YmZBRQ0KLUVPY0xLdmJkY3paUVlaUkMNCi1Eb0RMS3ZiZFF3TmNibEhjDQotRU9ia0t2YmRPVFR1Z0V0cA0KLURuY0tqdmJkYlVhZ1lMVGgNCi1FUENqanZiZGZOR1dmbUtMDQotRU9iamp2YmRpVlpkdnJVYg0KLURuY0xLdmJkWnlEaW5ETVMNCi1FUENrS3ZiZG1haXdZT211DQotRU9jTEt2YmRxVVVIU1JrVQ0KLURuY0xLdmJkRG5jS2p2YmQNCi1Eb0NrS3ZiZFZxbXhDRWxEDQotRVBDa0t2YmRhUmZESVVGaw0KLUVPY0tqdmJkaktHSUpseFMNCi1EbmNMS3ZiZGt4cnJUWkhVDQotRG5jS2p2YmR5cG5tSWpYQQ0KLURvRExLdmJkSnB5ZU9mT0YNCi1Eb0RMS3ZiZHdYTUJWYVZ1DQotRG9ES2p2YmRLZkZoQ0FxVg0KLURvQ2pqdmJkSXhUYWhMcVENCi1FT2NMS3ZiZEFEU1lLWmlRDQotRG9Da0t2YmRNb3dwdW5IVA0KLUVPY0tqdmJkZ0tmemJmQUUNCi1FUERLanZiZGhrZGRPVkRaDQotRVBETEt2YmRlbUZ3SE1paw0KLUVQQ2pqdmJkVVZsUUtUYVINCi1EbmNMS3ZiZFJXbkVDa2hEDQotRG5iamp2YmRrV1hPRGJZWA0KLURvQ2pqdmJkWmVZR3pnaGINCi1Eb0NrS3ZiZFNLeUZ0ZmtUDQotRG9ETEt2YmRCaGtDTEpGag0KLURuY0tqdmJkbGhkVHFWUmENCi1FUERLanZiZHFxdGptamFODQotRG9ETEt2YmRaalRIb2ZiRw0KLUVQRExLdmJkSm1BRHpIVkINCi1Eb0RMS3ZiZFNCY2VMaHlMDQotRU9iamp2YmRxd1BsQ2lZcQ0KLURuY0xLdmJkWU9SQVh0dlUNCi1FUERMS3ZiZFpubkpFZHlqDQotRG9Damp2YmR1V054S1FzQQ0KLUVQREtqdmJkV1NOeENFbEQNCi1Eb0NrS3ZiZFJqeUZ0Z0xUDQotRG9Da0t2YmRlT2VTa1VVUw0KLUVPY0tqdmJkRGloS1Z4S0ENCi1FT2JqanZiZGZmTHltZ0hBDQotRG9ETEt2YmRjU2NLc2RLQg0KLUVQRExLdmJkbFlzU1N5R3QNCi1EbmJqanZiZEdLZVRESU5WDQotRG9ETEt2YmRDVEJDdEdYUw0KLUVPYmpqdmJkRUFTSWx5dncNCi1FUERMS3ZiZGZNZldmbUtMDQotRG9Da0t2YmRwc3RHcXJMVQ0KLURuY0xLdmJkdGxYd0FzYVgNCi1Eb0RLanZiZE5yc3ZIRXVRDQotRU9iamp2YmRDVEJEVGZYUw0KLURvREtqdmJka01hbFplSFANCi1Eb0RMS3ZiZFFjY0JQcURyDQotRG5ia0t2YmRZcU5FaU5FcQ0KLURuYmtLdmJkdkJEeVRPZUkNCi1EbmJqanZiZExBa0dtQnhSDQotRU9ia0t2YmRMaUJsUllBUw0KLUVQQ2pqdmJkVHVrcEtVQlINCi1FT2JrS3ZiZGh1WmVXcXRiDQotRG9ETEt2YmRaeUVKbWJrcg0KLURuYmpqdmJkeHJtaU5TQ0gNCi1FUENqanZiZEtXVkZkRkhKDQotRVBDamp2YmRSV21jYmxJRA0KLUVQQ2tLdmJkc1FWb0pjVmYNCi1FUENrS3ZiZEdjanVpYkpqDQotRG9Damp2YmRKdXRlY2VISg0KLURuYmpqdmJkTExBaFdBSnkNCi1EbmNLanZiZFVMdW5hV09pDQotRU9jTEt2YmRIbEJ6blhRaw0KLURvREtqdmJkdkJEeHJvRWgNCi1Eb0RLanZiZHphQVBIR2JNDQotRG9ETEt2YmRVeUlUeWpvTw0KLURuYmtLdmJkdWFEeHJvRkkNCi1FT2JrS3ZiZEFNaFpTdnpZDQotRU9iamp2YmREb0RLa1diZA0KLUVPYmtLdmJkR0tkcmJoTlYNCi1FUENrS3ZiZG1nRlhsbkd5DQotRU9jS2p2YmR6ZHpPemR6UQ0KLUVQQ2tLdmJkS2tCSHZBSnkNCi1FT2NLanZiZHFBaUZBV2hFDQotRG9Damp2YmRRdm1kQ2xJRA0KLURuY0tqdmJkTXRzU0ttQVgNCi1FT2JqanZiZHppdVBwRVRVDQotRG9ES2p2YmRkWnlRWVpRYg0KLUVQRExLdmJkYXVCZ1hrVGgNCi1EbmJrS3ZiZG5DSnZ3bm11DQotRG9Damp2YmR4VW1GUXlNTw0KLURuY0tqdmJkWEdZelVBUFQNCi1FUERMS3ZiZE9BSlRVS1NBDQotRG5jS2p2YmRkWnlQd3hxQw0KLUVPY0tqdmJkcWx6S1lsSUoNCi1EbmJqanZiZGtWdm5EYXd3DQotRG5iamp2YmRaZHhHemhJYg0KLURuYmtLdmJkRHd4THRUc2wNCi1FT2JrS3ZiZEdLZHJjSG1WDQotRG5jS2p2YmRUQUZKSGJPZA0KLURvREtqdmJkRU9ia0t2Y0UNCi1EbmJrS3ZiZGFOTENTdU5IDQotRG9ETEt2YmREeFlMdFR0TQ0KLUVPYmpqdmJkVlpJVVpqbm4NCi1Eb0NrS3ZiZE5zVVZmZHVRDQotRU9jTEt2YmRHR0tSbWh0Ug0KLUVQREtqdmJkYktsRm5tY0ENCi1EbmNLanZiZHZ2bEF2QldWDQotRG9Damp2YmRsaUVVUXRyQg0KLURuYmpqdmJkamdma2ZHTmsNCi1FUERLanZiZGxZc1NUWWZ0DQotRG9ETEt2YmRiS2xHT25EQQ0KLUVQREtqdmJkakFQZmFQZmoNCi1EbmJrS3ZiZHpHeU1BTWVYDQotRG9Damp2YmRabm1oZGR6Sw0KLUVQQ2tLdmJkSU1Cem13UWsNCi1FT2JrS3ZiZGpFa0hWUEFPDQotRVBDa0t2YmRRY2NCUHBkUw0KLUVQQ2pqdmJkaGdLQ3h2SnUNCi1EbmNMS3ZiZFZneFZ4SFl6DQotRU9jS2p2YmR4Vk5GUXhrbg0KLURvREtqdmJkYkxNR1BOY0ENCi1EbmNMS3ZiZEdja1dKYWpLDQotRG5ia0t2YmRyTXlpeUxnaQ0KLUVPY0xLdmJkS2VmSUNBcHUNCi1Eb0NqanZiZHFGZEV0V0JJDQotRVBDa0t2YmRZU2xCTlVQWQ0KLURvQ2pqdmJkSXdzYklMcHANCi1FUENqanZiZG1nRllNbkhaDQotRU9iamp2YmRRdm1jY01JRA0KLURuY0xLdmJkVVJRbnR0aE4NCi1FT2NMS3ZiZGR4WnRVU0Z6DQotRVBDa0t2YmRodHpGV3F0Yg0KLUVPY0tqdmJkVkJDUlNwcXkNCi1EbmNLanZiZHRiYnR2dk9vDQotRVBDa0t2YmRjelpRWVpRYg0KLURuYmpqdmJkUXdPRGNMZ2MNCi1FUERMS3ZiZHR1blhpcHNBDQotRG5jTEt2YmRCaGphamhlag0KLURvREtqdmJkTnJ0VmZkdVENCi1FT2NMS3ZiZEtXVWZEZGZpDQotRU9iamp2YmRwc3RIUnJMVQ0KLURuYmpqdmJkem5wUkZDbFkNCi1FUENqanZiZGZORnZnTWlrDQotRG9Damp2YmRVc2x0R0x2Sw0KLURuYmpqdmJkbHF5VlpzRGkNCi1Eb0NrS3ZiZE5Qd3FXT0hUDQotRU9jTEt2YmRha0xlb05jQQ0KLURvREtqdmJkc0NHTk1Ha1oNCi1FUERLanZiZGFSZkRIc2ZMDQotRG9ES2p2YmRadEloeURybg0KLUVQRExLdmJkT1N0VmdGVXANCi1FUENrS3ZiZGVBVHBseEtHDQotRG5jTEt2YmR5U21obHJCZw0KLURvREtqdmJkbkNLV3dvT1YNCi1EbmJqanZiZERuY0tqdmNFDQotRU9jTEt2YmR3eklHR1hkcg0KLUVPYmpqdmJkbUlkVHFWU0INCi1EbmJqanZiZFVHem5Md1ZlDQotRG5jTEt2YmRUa3ZPYVdQSg0KLURuY0tqdmJkeU9TZ3dzSWMNCi1EbmNLanZiZGptQ0x6RkdvDQotRG9ETEt2YmRwc3NmcXFrVQ0KLUVQREtqdmJkbXR1WmppckcNCi1FT2NLanZiZE9GRVRoaGtFDQotRG9ES2p2YmRJTUJ6bldxTA0KLUVQQ2tLdmJkSnZWRmNkZmkNCi1FUERLanZiZG5CaXZ4T211DQotRU9ia0t2YmRUdkxvalRhUg0KLURvQ2tLdmJkTVJ3Tlp0cHoNCi1FT2JqanZiZEVBUmhselhYDQotRG5iamp2YmRjU2NMVGNqQg0KLURuY0tqdmJkeG1yaFhyaGMNCi1Eb0RLanZiZEV2WlFRTktGDQotRG5jTEt2YmRHTEVyY0htVg0KLURvRExLdmJkRmtGVENoTXUNCi1Eb0NrS3ZiZE9GRVRpSWtFDQotRVBES2p2YmRuVlV6TEtSZg0KLUVQREtqdmJkbXVVektqU0cNCi1FUENqanZiZHd1TkZReGtuDQotRG5jTEt2YmRlQVRwbVhqRw0KLUVPYmpqdmJkeFVtRXB4a24NCi1FUERLanZiZGNTYmtUY2pCDQotRVBDamp2YmRtYktYWG9OdQ0KLUVQREtqdmJkU1FVSEtGZFgNCi1Eb0RLanZiZENUQWJzZXdTDQotRU9jTEt2YmRWd0pZVmRGSA0KLURvREtqdmJkWnRJaVljc08NCi1FUERLanZiZGhrZUVOdGNaDQotRU9ia0t2YmRHQk9weUp6bQ0KLUVQQ2tLdmJkUk14Q1ltdHoNCi1Eb0NqanZiZHpqVlBvY3NVDQotRG9ETEt2YmRyRGRpUG5XQg0KLUVQQ2pqdmJkRmpkc0RJTXUNCi1Eb0RMS3ZiZFNMWkdVZ0xUDQotRVBETEt2YmRLZWZIYWFRdQ0KLURvREtqdmJkS0NpYnBpY1kNCi1FT2NMS3ZiZGlqR0lKbVlTDQotRU9iamp2YmRlbGZXZ05LTA0KLURuYmtLdmJkYmhtS0tmV3gNCi1Eb0RLanZiZFNRVUhLR0VYDQotRVBDa0t2YmRuR2R4TW1nWg0KLURuY0xLdmJkSkpkQUtQZ0UNCi1FUERMS3ZiZG1SeVV5cmRKDQotRU9jTEt2YmRoelVmTHFPRw0KLURvREtqdmJkTEFqZ01heFINCi1Eb0RLanZiZFJvc2ZqR0VYDQotRU9ia0t2YmRwc3NmcXFqdA0KLURuYmtLdmJkakFRSEFvZmoNCi1EbmNMS3ZiZGlka0hVb0FPDQotRG9Da0t2YmRDSWpiTEllag0KLURuY0xLdmJkZWxmV2ZtS0wNCi1Eb0RMS3ZiZHhVbGVReGtuDQotRVBETEt2YmRFdlpRUGxqRg0KLURuY0xLdmJkSmJqRFFqQ3gNCi1EbmNMS3ZiZHlPVElYcmlEDQotRG9ES2p2YmRUdWxQalVBcQ0KLURuYmpqdmJkSlN5QXNOWU0NCi1FT2NMS3ZiZGJCVmVHUVFYDQotRVBDamp2YmRiS2tlbm1jQQ0KLUVQQ2pqdmJkaUdqRFpXSnUNCi1EbmNMS3ZiZGNTYmpzZEphDQotRU9ia0t2YmRadEpJeURzTw0KLURvRExLdmJkcmFmTWtnTFoNCi1Eb0NqanZiZGlNRkRtdURaDQotRG5ia0t2YmRuVXR5amlyRw0KLUVQREtqdmJkZk5GdmZsaWsNCi1Eb0RMS3ZiZHJXb2tjSlpSDQotRG5jS2p2YmRXV2h4V0RkZw0KLUVQRExLdmJkTmVEdEpKS2QNCi1FT2NMS3ZiZHFsektZa2hKDQotRG5jS2p2YmRTUVVIS0dEdw0KLURvQ2tLdmJka0hmbEZmT0wNCi1FUENrS3ZiZFJYTmRETUlEDQotRG5jTEt2YmRTTFpGdGZrVA0KLUVPY0xLdmJkWlFsZGlNZVINCi1EbmJqanZiZFNCZEVsSllrDQotRG5jTEt2YmR3V2xCVmFXVg0KLURvQ2pqdmJkaHpVZkxxT0cNCi1Eb0RMS3ZiZG1KRVVRdVNCDQotRG5iamp2YmRVTHZQQlZvSg0KLUVQRExLdmJkWWtyRHRPTU4NCi1FUERLanZiZEhFS3VqQmlqDQotRU9iamp2YmRKdXVHRGRmaQ0KLUVPYmpqdmJkemFBT2dHYk0NCi1EbmNMS3ZiZGtDbExSSFVnDQotRU9ia0t2YmRZVE1BbVRvWQ0KLUVPYmpqdmJkeFZNZVF5TG4NCi1Eb0RLanZiZHJFRkpRTnVhDQotRG5jS2p2YmRZU2xCTlRueA0KLURuYmpqdmJkclNVa09MQW0NCi1FT2NMS3ZiZHJ5bFFUQklPDQotRG5iamp2YmRyb3VvS0RWZg0KLURvRExLdmJkd1drYVZhVnUNCi1Eb0NrS3ZiZFpRbUZJbGVSDQotRVBDamp2YmRpTGVFTnRieQ0KLURvQ2pqdmJkckRlSlFOdWENCi1FT2JqanZiZElHZnpZeFhnDQotRG9Da0t2YmR5U21pTXFhZw0KLUVPY0tqdmJkYlZCZ1lMVGgNCi1Eb0RLanZiZExGZWhDQXB1DQotRVBDa0t2YmRDRHBBdkptRw0KLUVPYmtLdmJkWkxyRHRPTG0NCi1FUENrS3ZiZFpubkpFZHlqDQotRVBDamp2YmRaalNncEdiRw0KLUVPY0tqdmJkV1NPWUJka2MNCi1FUERLanZiZHd0bGVReUxuDQotRG5ia0t2YmRtSkR0UXVTQg0KLUVPYmtLdmJka1dYT0RiWHcNCi1EbmNLanZiZGV6dXlFaVR3DQotRU9iamp2YmRuQmpXd25tdQ0KLUVQREtqdmJkWnhkSm1jTVMNCi1FUERLanZiZHJiR05NSExaDQotRU9ia0t2YmRFWVhsVHNzbA0KLURuYmpqdmJkeVRPSk5SYWcNCi1EbmJrS3ZiZEdaVlZBZFlDDQotRVBDamp2YmRUWUxNTnprWQ0KLURuY0xLdmJkSmNKY1JLRFkNCi1FT2NMS3ZiZFlwbUVobGRxDQotRG9Da0t2YmRqS0Znak5ZUw0KLUVQRExLdmJkSmJpYnFLQ3gNCi1FUENqanZiZHlUTmlOU0NIDQotRG9ETEt2YmRHR0tSbWhzcQ0KLUVQRExLdmJkTEFrR21DWVINCi1FUERMS3ZiZENFUGFXS01mDQotRG9Da0t2YmRac2lJeURzTw0KLUVQQ2pqdmJkamJra1JHdUgNCi1EbmJrS3ZiZHFZb0hnUkVZDQotRG9ETEt2YmRaTVJjdE5rbQ0KLUVPYmpqdmJkRGpJSnZZS0ENCi1EbmNLanZiZFZxblhiRWtjDQotRVBDa0t2YmRpSEtDeVZpdQ0KLUVPY0tqdmJka0hmbEdGbWsNCi1Eb0RLanZiZE9GRHNpSWpkDQotRU9jTEt2YmRWck9ZQ0VrYw0KLUVQQ2pqdmJkaHR5ZHZyVWINCi1Eb0RMS3ZiZHJOWmpZbEhpDQotRVBES2p2YmRWd0l4V0RlSA0KLUVPYmtLdmJkaHl1RmxSTmYNCi1FUERMS3ZiZFNLeUZ1SEtzDQotRG9Da0t2YmRCaGphamlGag0KLURvREtqdmJkaGFuYmVXcHENCi1EbmNLanZiZEdHSnFuSlRxDQotRVBES2p2YmRadEpJeUVUTw0KLUVPY0xLdmJkQU5JWlN2elkNCi1EbmJrS3ZiZHB0VUhTU0xVDQotRG9ETEt2YmRSRGNCUHBkUw0KLURvREtqdmJkQmNwQXVqTkcNCi1EbmJqanZiZGFhVmRlb3BYDQotRG5iamp2YmRodHlkdnJVYg0KLURvQ2tLdmJka1dYTmNheFgNCi1EbmNMS3ZiZHJOWmpZa2dpDQotRVBDamp2YmRCaUthamlHSw0KLUVPYmtLdmJkd2tXY2d6ekcNCi1FUENrS3ZiZFJEY0FwUWNyDQotRG5jTEt2YmRmZWt6TmdIQQ0KLURvREtqdmJkaUJvQ2R3UlINCi1FT2NMS3ZiZElCbFpkekFEDQotRG5ia0t2YmRaTHFjc25NTg0KLURvREtqdmJkYXRiR3drVUkNCi1FT2JqanZiZG1nRlhsbWZ5DQotRVBETEt2YmR4VW1FcVlrbg0KLUVQRExLdmJkYXVCZnhLc2gNCi1FT2JqanZiZHNQdk9qRFZmDQotRG5ia0t2YmRrVndOZEJ3dw0KLUVQQ2tLdmJkemFBUEdmYk0NCi1FT2NMS3ZiZFJvdEdqR0R3DQotRVBDa0t2YmRxY2VKUG11YQ0KLUVQRExLdmJkWnlEaW5Da3INCi1FT2JrS3ZiZENEb2FXS01mDQotRU9jS2p2YmRqbUNMekVnUA0KLUVQREtqdmJkSGxCem5YUkwNCi1EbmNLanZiZGVPZVRMVHRTDQotRVBDamp2YmRHWlV1QkVYYg0KLURuYmtLdmJkcVR0SFJxanQNCi1FT2NMS3ZiZEZ5VXVBZFhiDQotRVBETEt2YmRFQVJpTXpXdw0KLUVPY0tqdmJkRmVpck5pVVINCi1Eb0NrS3ZiZHpqVW9vY3NVDQotRU9jTEt2YmRFenRRZGxDaQ0KLURuY0xLdmJkS0NqQ3BpYngNCi1FUENqanZiZHhaaEdGeEZTDQotRU9iamp2YmR3V2thV0F2Vg0KLURuYmtLdmJkYWFXRkZvb3cNCi1FT2NLanZiZEJzQkRVR1hTDQotRVBETEt2YmRtSWRVUXVSYQ0KLURuY0tqdmJkVkFiUlRSUnkNCi1Eb0NrS3ZiZEhmZnl4eFlIDQotRU9iamp2YmRER2tmSEF6Yw0KLURvQ2tLdmJkaUNQREZYUlINCi1FUENrS3ZiZFZyTndiRWtjDQotRVBDa0t2YmRpR2pEWXZLVg0KLURuYmtLdmJkSU1Cem12cGsNCi1FUENrS3ZiZEt4cUpyenRmDQotRG5jTEt2YmRtSWN0UXVTQg0KLUVPY0tqdmJkYVNGYmhVR0wNCi1Eb0NqanZiZG1iS1d3bm11DQotRG9Da0t2YmRpVXllV3JWQw0KLURuY0tqdmJkR0dLUm1oc3ENCi1Eb0NqanZiZGVoTFZxblFnDQotRG5jTEt2YmRUa3VuYVZvSg0KLURuYmpqdmJkR1pVdGFEeEMNCi1FUENqanZiZHRTclN5WmVEDQotRG9ETEt2YmRqYmtrUWZ1SA0KLUVPY0xLdmJkT0ZEdEpKTEUNCi1EbmJqanZiZEJkUUF2SmxmDQotRG9Da0t2YmR1RERWV3ZQUA0KLUVPY0tqdmJkWnRKSXlEc08NCi1EbmNMS3ZiZFFjY0JQcGRTDQotRG5jTEt2YmRpVXpFdnF1Qw0KLUVQQ2pqdmJkdnZrYVdBdXUNCi1Eb0RMS3ZiZFpvT0llRXpLDQotRG5ia0t2YmRrQ2trUkd1SA0KLUVPY0tqdmJkUmtaR1ZITFQNCi1FT2JrS3ZiZHRjQ3VYVm5vDQotRVBDamp2YmRNcFlSVm5Hcw0KLURvREtqdmJkRmZKck5pVHENCi1EbmJrS3ZiZFpubWlGRlpqDQotRVBETEt2YmRiaG1LS2ZXeA0KLURvRExLdmJkRGpIaXZYakENCi1Eb0RMS3ZiZGlMZURuVkRaDQotRU9jTEt2YmRVUXFPdHRoTg0KLUVQREtqdmJkWkhYRUFPcmkNCi1FT2JrS3ZiZHZBZFlybmRoDQotRU9ia0t2YmRRbHdheG5Veg0KLURvQ2pqdmJkUXdPRURMaEQNCi1FUERMS3ZiZHFyVktuTEJODQotRU9iamp2YmR3dG1GUXhrbg0KLUVQRExLdmJkVGZ6bk1XdkYNCi1EbmJrS3ZiZGFNamFzVk5IDQotRVBDamp2YmRjeXlRWHhwYg0KLURuY0tqdmJkTWZjUU1wVWsNCi1EbmJqanZiZFpubWhlRXpLDQotRG5jTEt2YmRicmJrVURpYQ0KLURuY0xLdmJkaUNPY0ZYUlINCi1Eb0NqanZiZFp4Y2ltYmxTDQotRVBETEt2YmRSa1lmVkhLcw0KLURuY0tqdmJkRG9ES2p2YmQNCi1FT2NLanZiZEdBbnB4aXptDQotRU9jS2p2YmRZcGxkaGxkcQ0KLURuYmtLdmJkUXdPRURNSUQNCi1EbmJqanZiZGN5eG94WXBiDQotRG9Damp2YmRha01HT25EQQ0KLUVQQ2pqdmJkTEFrR2xhd3ENCi1EbmNLanZiZEpKZEFLUGZkDQotRU9jTEt2YmR4cm5JbVNCZw0KLURvRExLdmJkTmRkVUpJamQNCi1EbmNMS3ZiZGZJS3ZSbXBnDQotRG9Damp2YmRpWnVHTHFPRw0KLUVPY0xLdmJkZUFVUk13aWYNCi1EbmNMS3ZiZGlDUENlV3BxDQotRG9Damp2YmRHY2p2S0Jpag0KLUVQREtqdmJkUkRjQlFRZFMNCi1FUENqanZiZFV0TXRHTHZLDQotRVBES2p2YmR5WGhqQm95aw0KLURvREtqdmJkcVpPZ2ZwY3gNCi1FT2JqanZiZFlUTUFtVVBZDQotRG9ETEt2YmRpQ09iZVhRcQ0KLURuY0tqdmJkbUpEdFJVcWENCi1FT2JrS3ZiZFNDRUVsSXlMDQotRU9ia0t2YmROR2JwTW91TA0KLURvQ2tLdmJkRXpzcUVsQ2kNCi1FT2JqanZiZE9TdFdIRlZRDQotRVBDamp2YmRqbUJsWmRmbw0KLUVQREtqdmJkaVV5ZVdxdGINCi1EbmJqanZiZFlTa2FOVVBZDQotRG9Da0t2YmRUQUVoaENQRQ0KLURvQ2pqdmJkbXR0eWpqU0cNCi1FT2NLanZiZHJNeWpaTUlKDQotRVBES2p2YmRVc21UZWxWag0KLUVQQ2tLdmJkTnNUdWdGVXANCi1EbmJrS3ZiZFdSbllCZU1EDQotRG5jTEt2YmRIZ0d6Wlh4SA0KLUVQRExLdmJkWkxyRHNtbE4NCi1EbmNMS3ZiZGNTYmtVRGpCDQotRU9ia0t2YmR6aXVQcERydA0KLURvQ2pqdmJkWnlFSm1ibFMNCi1FT2JrS3ZiZGpnZ01GZW5MDQotRG5ia0t2YmRtZmVYbU5meQ0KLUVPYmtLdmJkaUJuY0ZYUlINCi1FUERLanZiZEFEU1hpeWlRDQotRU9iamp2YmRMRmZIYkFwdQ0KLUVPY0xLdmJkUk13YlpPVXoNCi1FUENrS3ZiZEZWeG9vbUplDQotRU9jTEt2YmRabm1pRWR5ag0KLURuY0xLdmJkVUx1bmFWb0oNCi1EbmNMS3ZiZGRuZHNLdFRyDQotRVBES2p2YmRFenRRZU1ESg0KLUVPYmtLdmJkY1NjS3NjakINCi1FT2NLanZiZEZrRXJiZ2x1DQotRG9Da0t2YmRzQmZNbEdrWg0KLUVQRExLdmJkQ1NhQ3NmV3INCi1FUENqanZiZFZBYXBzUlNaDQotRU9jTEt2YmRnRmt6TmZnQQ0KLUVQRExLdmJkamhITGVmTmsNCi1FT2JqanZiZHlOc0lYc0ljDQotRG9Damp2YmRxY2RpUG12Qg0KLUVPY0tqdmJkZVh5c3NyRnoNCi1EbmJqanZiZEVPY0tqd0NkDQotRG9ETEt2YmRHS2RyYmdtVg0KLURuY0xLdmJkS1F6RW9GbkYNCi1Eb0NrS3ZiZHF2cE1ESlpSDQotRU9ia0t2YmRaeUVLT0RNUw0KLURuY0tqdmJkQmhqYktpRmoNCi1EbmNLanZiZGZIa1ZyTnFIDQotRG5jTEt2YmRlWHlzc3JGeg0KLUVPYmpqdmJkeG1zSHdyaUQNCi1FUERLanZiZFJ5aWdzQ3ZBDQotRG9Da0t2YmRab05pRWVaag0KLUVQQ2tLdmJkaHpVZkxwbkcNCi1EbmNLanZiZFZVTlVGa3VqDQotRVBES2p2YmRSWE5kRE1JRA0KLUVPYmtLdmJkbEJNbm1BTEENCi1FUERLanZiZGZmTVpuSEhBDQotRVBDamp2YmRFQVJobHl2dw0KLUVPY0tqdmJkVlRsdEdMdksNCi1FT2NLanZiZEpxWmRvRm1lDQotRU9ia0t2YmR5T1RId3NJYw0KLURvRExLdmJkQ2ZrZWdBemMNCi1EbmJrS3ZiZFpNUmRUbWttDQotRG5ia0t2YmRoa2VFT1VjWg0KLURvREtqdmJkWm5uSWVFeWoNCi1EbmJqanZiZHJhZk5NR2taDQotRG9ETEt2YmRadEpJeUVTbg0KLUVPY0xLdmJkYVJlY0lUZWsNCi1FUENqanZiZFpvT0pFZHlqDQotRG9ETEt2YmR4c05obHJCZw0KLUVQQ2pqdmJkWnhkS05jTVMNCi1Eb0NqanZiZENXemRKRW92DQotRU9ia0t2YmRUcHBudHRnbQ0KLURuYmtLdmJkam1DTHlkZm8NCi1FT2JrS3ZiZEJzQWJzZXdTDQotRU9iamp2YmRqZ2ZsRmVtaw0KLURuYmpqdmJkcHN0R3JTS3QNCi1FT2NMS3ZiZE9UVHZIRlVwDQotRG9Da0t2YmRjellvd3lSQw0KLUVPYmtLdmJkVHZNUGpVQXENCi1FT2NLanZiZGV6dlllSlVYDQotRVBDa0t2YmR6SFlsQU5Fdw0KLUVQQ2tLdmJkcWNkaVFPVmENCi1Eb0NrS3ZiZHNyclN4eWVEDQotRU9ia0t2YmRPVFVXR2VVcA0KLURvREtqdmJkYlViSFlMVGgNCi1Eb0NrS3ZiZEhha3lkekFEDQotRG9ES2p2YmRkakpyV1V6bg0KLUVQREtqdmJkbWFpd1lQT1YNCi1Eb0NqanZiZHRiY1V3Vm5vDQotRVBETEt2YmRyTXlqWWtnaQ0KLURvQ2pqdmJkVVFwb1V0Z20NCi1EbmNLanZiZGRkb1NCd0RLDQotRVBDa0t2YmRhdGJHd2tUaA0KLURuY0tqdmJkbWJKdnhQTnUNCi1EbmJqanZiZHd6SGVld2RyDQotRG5jTEt2YmR6aXRwUGNydA0KLUVPY0xLdmJkck15allrZ2kNCi1FT2NMS3ZiZHJFRklvbXZCDQotRG9ETEt2YmRpaWZJSmx4Uw0KLUVPY0xLdmJkdHZPWUtRc0ENCi1Eb0NrS3ZiZHhzTmhscWFnDQotRG5iamp2YmR5VE9JbHFhZw0KLURuY0xLdmJkSUdnWnlZWGcNCi1FT2NLanZiZFVzbVVHTVdLDQotRU9ia0t2YmRoelVmTVFuRw0KLUVQRExLdmJkWnhkSm5Da3INCi1EbmNLanZiZEtXVWVjZUdpDQotRU9jTEt2YmRtYkp2d25uVg0KLURvRExLdmJkRG5jS2p2YmQNCi1FUENrS3ZiZFpvTmhlRXlqDQotRG5jTEt2YmRWcW5YYWRsRA0KLURuY0xLdmJkdHVuWGlwc0ENCi1EbmNMS3ZiZGpBUGdCUGZqDQotRG9Da0t2YmR5cVBOSktYQQ0KLURuY0tqdmJkcnBXUEpidWYNCi1FT2NLanZiZHF2cE1ESllxDQotRG5iamp2YmRjVERMVURpYQ0KLURuYmtLdmJkaUdqQ3h2S1YNCi1FUERLanZiZGF1QmZ4S3RJDQotRG9Da0t2YmRMRmZIYkFwdQ0KLURvRExLdmJkSGZmeXlYd2cNCi1FT2NLanZiZEl4VUNIa3FRDQotRG9ES2p2YmR6UW9NaUp3QQ0KLURvREtqdmJkeVlJakJveWsNCi1FT2JrS3ZiZHhuU2d3cmlEDQotRU9ia0t2YmRJTUJ6bldwaw0KLUVQREtqdmJkWWxTRHRPTU4NCi1Eb0RLanZiZGlqR0hqTXhTDQotRU9jS2p2YmRZa3Fjc25NTg0KLURvQ2pqdmJkbWFpd1lPbXUNCi1FUERLanZiZEhFTFdLQmpLDQotRG9Damp2YmR3dG1GUllsTw0KLUVPY0xLdmJkRmVpcW5KVHENCi1FUERLanZiZGlCbmNFdnFSDQotRG9Da0t2YmRKWHNiSUxwcA0KLUVPYmpqdmJkVUx1bmFWbmkNCi1EbmNLanZiZER3eExzdFVNDQotRG9ES2p2YmRyV3BNQ2h5Ug0KLUVPYmtLdmJkWXpjRnFpdloNCi1EbmNLanZiZEV6c3BkbERKDQotRVBES2p2YmRmTWZYR21LTA0KLURvQ2tLdmJkQ1RBYnRHV3INCi1Eb0RMS3ZiZFJrWkdVZ0tzDQotRVBDa0t2YmRGV1pRUU1pZQ0KLURuYmpqdmJkeFZORXFZa24NCi1Eb0NqanZiZGVGUFJiV2JqDQotRVBDa0t2YmRac2hoeUVTbg0KLUVPYmpqdmJkcXJWS25MQW0NCi1FUENqanZiZHB0VUdxcWp0DQotRU9jTEt2YmRyRUVocE9WYQ0KLURuY0tqdmJkelFvTklqWEENCi1EbmNMS3ZiZG1nRlhsbkd5DQotRG9ES2p2YmRaalNoUUhCZg0KLURuYmpqdmJkaktHSGpOWHINCi1Eb0RMS3ZiZHFGY2RzdkFoDQotRVBDa0t2YmRPRWRVSWlMRQ0KLUVQRExLdmJkTmVFVUpKS2QNCi1FUENqanZiZHpIWk1BTkV3DQotRG5ia0t2YmRxbHpKeU1JSg0KLURuYmpqdmJkZWxmWEhNakwNCi1FUENrS3ZiZEFOSHlUV3pZDQotRG5iamp2YmRSRURCUHBjcg0KLURuY0xLdmJkUW1ZQ1pPVXoNCi1FT2NLanZiZHVvVHpwam9VDQotRG9Damp2YmRxclVqbWtCTg0KLURuYmpqdmJkeWZ4bEFORlgNCi1FT2NMS3ZiZEptQUR5Z1VhDQotRVBETEt2YmR5TnJoWVRJYw0KLURvQ2pqdmJkQ1RBYnRGd1MNCi1EbmNMS3ZiZFN3a0xtemtZDQotRG5iamp2YmRqaEhNRmZOaw0KLURvQ2tLdmJkWmVYZnpoSWINCi1EbmJqanZiZGJyYmp0RUphDQotRG9Da0t2YmR4cm1obVJiSA0KLURvRExLdmJkclhRTGJoeHENCi1FT2JqanZiZFR1bFFLVUJSDQotRVBDa0t2YmRNcFlRdW1nVA0KLURuY0tqdmJkZXJCV3psRFANCi1Eb0NqanZiZGlHakN4dkp1DQotRG9Damp2YmRsWlNxc1pHdA0KLUVPY0xLdmJkWmlzSVBmYWYNCi1EbmJrS3ZiZEhFS3ZLQmlqDQotRG5jTEt2YmRqU3ppU2ppeg0KLUVQREtqdmJkQ0VRQldKbUcNCi1FT2JrS3ZiZEdHS1JtaVVSDQotRVBES2p2YmRNdVRSa05BWA0KLURuYmpqdmJkclhRTGJpWXENCi1FUENqanZiZE9UVVdHZHVRDQotRVBDamp2YmRuQmpYWG9OdQ0KLURvRExLdmJkY2FybVNBVU4NCi1Eb0NqanZiZE5Qd3FXT0dzDQotRU9ia0t2YmRVc2xzZWt2Sw0KLURuYmpqdmJkemFBUEdmYk0NCi1Eb0NrS3ZiZEdkTFZqQ0pqDQotRG9ETEt2YmRSanlGdGZrVA0KLURvRExLdmJkR0xGVERIbHUNCi1EbmJrS3ZiZEdGaXJPSlVSDQotRVBETEt2YmRkb0ZUTFVVUw0KLUVPYmtLdmJka3hyclRaR3QNCi1EbmNLanZiZHhybkpNcWFnDQotRU9jTEt2YmRDRHBCV0ptRw0KLURvQ2pqdmJkbHF5VXlzRGkNCi1FUERLanZiZFRmem1sWFZlDQotRG5jS2p2YmRFdXhwUU1pZQ0KLUVPY0tqdmJkYkxMZlBOY0ENCi1EbmNLanZiZFZneFdYZ1l6DQotRG9ES2p2YmRyYkZtTGdLeQ0KLURvQ2pqdmJkemFBUEdmYk0NCi1EbmNMS3ZiZFlTbEFsc29ZDQotRG9ETEt2YmRaeUVKbkNsUw0KLUVQRExLdmJkRXZZb3BNakYNCi1EbmNLanZiZG10dVpqaXFmDQotRG9Damp2YmRDSktiTElmSw0KLUVPY0xLdmJkY0lsakxGdngNCi1FT2JrS3ZiZHJKQUtGTlBGDQotRG9ES2p2YmRCaUtiS2hmSw0KLUVQREtqdmJkV0lZV1lHeHoNCi1Eb0NrS3ZiZGpBUUdhUUhLDQotRG5iamp2YmRqYmxMUWZ0Zw0KLURuY0xLdmJkYmhsaWtHWFkNCi1FUERLanZiZFpMckRzbWttDQotRG9ETEt2YmRWVGxzZk1XSw0KLURvQ2pqdmJkbGlEc3B0cWENCi1EbmJrS3ZiZGp1dm1jYlh3DQotRG9Damp2YmRiVkNIWGp0SQ0KLURvQ2tLdmJkUXZtZENsSUQNCi1EbmJqanZiZExBa0hOQ1hxDQotRVBES2p2YmRadEloeUVUTw0KLURuYmtLdmJkWWtxZFRtbE4NCi1Eb0RLanZiZE10cnJLbUFYDQotRG5jTEt2YmRKWHRDSU1RcA0KLUVQQ2tLdmJkbGhkVHFVcWENCi1FT2JqanZiZG5IRllOTmZ5DQotRVBES2p2YmR4cm1obHJCZw0KLURuY0xLdmJkaUxlRG10Y1oNCi1EbmNLanZiZE5yc3VmZHRwDQotRU9ia0t2YmRsaGNzcHRxYQ0KLUVPYmpqdmJkTmVFVGlJa0UNCi1EbmJrS3ZiZHhzTmhtUmJIDQotRG5ia0t2YmRBRFJ4S1pocA0KLURuYmpqdmJkVHFST3VVZ20NCi1FT2NLanZiZHB4b0lHcUR4DQotRU9jTEt2YmRxQkllQVdoRQ0KLURuYmpqdmJkQ0lrQmppRmoNCi1EbmNMS3ZiZFRsV1BCV1BKDQotRG9Damp2YmRFS0hqVnhLQQ0KLURuYmtLdmJkWlJORkltRXENCi1FT2JrS3ZiZEpiaWNRakN4DQotRG9ES2p2YmROc1R1ZmVWUQ0KLUVPYmpqdmJkRHhZTVVUc2wNCi1Eb0RMS3ZiZGFTRmNJVGZMDQotRVBES2p2YmRjVERMVGNpYQ0KLURvQ2tLdmJkbGhkVHB1UmENCi1FT2JqanZiZENKS2JLaUZqDQotRG5jS2p2YmRxQWlGQVdoRQ0KLUVQREtqdmJkVXNsc2ZMdWoNCi1FT2JqanZiZFdXaVh1Y2VIDQotRVBDamp2YmRPRWNzaGlMRQ0KLUVQRExLdmJkRUpoSnV4S0ENCi1Eb0NrS3ZiZEt5UktTenVHDQotRG5jS2p2YmRIZmZ6Wlh4SA0KLUVPY0xLdmJkU0xaR1Vma1QNCi1FT2JrS3ZiZEhnSFp4d3hIDQotRG5ia0t2YmRjU2JqdEVKYQ0KLUVQREtqdmJkWkd3RUFQVEoNCi1Eb0RMS3ZiZGVBVVJOWGlmDQotRVBETEt2YmRNcFlRdW5Hcw0KLUVPYmtLdmJkTmVEc2hpS2QNCi1Eb0RMS3ZiZHpvUVFkYmt4DQotRVBES2p2YmRXSHhXWGZ4eg0KLUVQQ2pqdmJkQ0VQYVZqTkcNCi1Eb0NqanZiZGJobGlrRnZ4DQotRU9jTEt2YmRCdnpkSWRwVw0KLURvQ2tLdmJkTlB3cVdOZnMNCi1FUENqanZiZGJobGlqZld4DQotRG5jS2p2YmRxd1FMYmlaUg0KLUVPYmpqdmJka0NsTFJHdUgNCi1EbmNLanZiZE5IRFFOUVZMDQotRG5jS2p2YmRoa2RjbXVEWg0KLUVPY0tqdmJkS1dWRmRGSEoNCi1FUERMS3ZiZFlUTUJNdE94DQotRU9ia0t2YmRTS3hmVkdqcw0KLURuY0tqdmJkWm9PSkVkeksNCi1FT2JqanZiZE1wWHFWbWdUDQotRVBES2p2YmRoYW9ERlhSUg0KLUVQQ2pqdmJkcnBXUEpjVmYNCi1FT2NLanZiZGN6WXBZWlJDDQotRG9ETEt2YmRMTEFoV0FKeQ0KLURvREtqdmJkRU9ia0xYREUNCi1FUERLanZiZG5WVXlrS1JmDQotRG5ia0t2YmRCdnpkSWRvdg0KLUVPY0tqdmJkR0Zpck9KVVINCi1Eb0NqanZiZEdHSnJOaVRxDQotRVBES2p2YmRxQWhlQVdnZA0KLURuY0tqdmJkeG1zSVhyaUQNCi1FT2JrS3ZiZFZBYlFzUlJ5DQotRVBES2p2YmRSWE9EYmtoRA0KLUVPYmpqdmJkVlpIdFpqb08NCi1FT2NLanZiZGZmTVptZmdBDQotRU9jTEt2YmRiaU1qTEdYWQ0KLURvREtqdmJkVVFwb1ZVaE4NCi1FUENrS3ZiZGhmakN4dWl1DQotRG9Da0t2YmR6aXVQb2NzVQ0KLUVPYmpqdmJkQmhrQmtKRmoNCi1EbmJqanZiZGVBVVJOWGlmDQotRG5jS2p2YmRRbHhCeU9Veg0KLUVQRExLdmJkUmJFRWtoeGsNCi1FUENqanZiZHJiRmxrZ0t5DQotRG9Damp2YmRhU0ZiaFVHTA0KLUVPY0tqdmJkc0NHTWtma1oNCi1Eb0NrS3ZiZEpiaWNSSmNZDQotRG5ia0t2YmRxbHpLWWxIaQ0KLURvQ2pqdmJkWnlEaW1ibFMNCi1FT2NMS3ZiZHNycXNaWmRjDQotRG9ES2p2YmRqZ2dNR0dOaw0KLURuYmtLdmJkQURTWGl5aVENCi1Eb0NrS3ZiZGVoS3VyT1JIDQotRU9jTEt2YmRyeWxQc0Fnbg0KLUVQQ2pqdmJkUldtZENsSUQNCi1FUENqanZiZGJzQ2pzZEtCDQotRU9iamp2YmRVUXBvVlZIbQ0KLURuYmtLdmJkaUNPYmVYUXENCi1EbmNMS3ZiZFVRcG9WVWhODQotRG9Da0t2YmRLQ2ljUktEWQ0KLURuY0tqdmJkamxha3pGR28NCi1EbmJrS3ZiZE1nRFFNcFZMDQotRG9ETEt2YmRXU054QmVNRA0KLURuYmtLdmJkdkJFWlRPZGgNCi1FUENqanZiZHNRV1BLQ3VmDQotRU9iamp2YmRaZVlHemdoYg0KLURuYmtLdmJkeHNOaG1TQ0gNCi1FUERMS3ZiZGt5U3JUWkd0DQotRU9ia0t2YmRyRGRpUU52Qg0KLURuY0xLdmJkSERqdWlhaksNCi1Eb0NqanZiZFVSUk90dUlODQotRG5jS2p2YmRLeVJKcnp0Zg0KLUVPYmpqdmJkSUdmeXlZWGcNCi1EbmNMS3ZiZFhzTUJNdFBZDQotRVBDa0t2YmRhYVZkZlBwWA0KLURuY0tqdmJkaUhKYnlXSnUNCi1FT2NLanZiZFNLeGZWR2pzDQotRG9ES2p2YmR4WmdmRndkcg0KLURuYmtLdmJkUk5ZQ1pOdHoNCi1FUENrS3ZiZENEb2FXS05HDQotRG9ES2p2YmREakhqV1lLQQ0KLUVQREtqdmJkeU5zSHdzSWMNCi1Eb0RLanZiZFV0TlRmTHVqDQotRG9ETEt2YmRHR0tSbkpUcQ0KLUVQQ2tLdmJkc0JlbU1HankNCi1FUERLanZiZFNRVUhLRmN3DQotRG5iamp2YmRrQ2xLcGZ1SA0KLUVPYmpqdmJkUnlqSHJjV0ENCi1FT2NMS3ZiZFNQc2ZqR0VYDQotRG9Damp2YmRHY2tXS0Jpag0KLUVQQ2tLdmJkR2RLdWpCaWoNCi1EbmJqanZiZGNKTWlqZXdZDQotRVBES2p2YmRrSUdrZWZPTA0KLUVQQ2tLdmJkclNWTE5rQk4NCi1EbmJrS3ZiZHJwV1BKYnZHDQotRG9ETEt2YmRaaXJncEhCZg0KLUVQQ2tLdmJkSERqdWpCaWoNCi1FUENrS3ZiZHZCRHlTb0VoDQotRG9ETEt2YmRlUEVzS3Nzcg0KLURvRExLdmJkWlJNZGhsZHENCi1FT2JqanZiZFVRcVBVdGdtDQotRG9ETEt2YmRNU1hOWnRweg0KLUVPYmpqdmJkVlloVHpLbm4NCi1FT2NLanZiZHJOWml4bElKDQotRG9ETEt2YmRUcHFQVlZJTg0KLURuYmtLdmJka0NranFIVkgNCi1EbmJrS3ZiZGtXV21jYXhYDQotRU9jTEt2YmRKU3lCU2x3bA0KLUVPYmtLdmJkbVJ4dHpURUoNCi1EbmNLanZiZHB0VGdScWp0DQotRU9jTEt2YmRxWW9IZnFFWQ0KLURvREtqdmJkR1pVdGFEeEMNCi1FT2NLanZiZEtReWRvR05lDQotRVBETEt2YmRzc1NUWlplRA0KLUVPYmpqdmJkaGtkZE9VY1oNCi1Eb0RLanZiZEdkS3ZKYktLDQotRU9jS2p2YmRVTHZQQXVvSg0KLURvQ2tLdmJkckVGSlBuV0INCi1EbmJqanZiZGZOR1dmbUprDQotRVBDa0t2YmRrV1hPRGF3dw0KLUVPY0tqdmJkTXRyckttQVgNCi1EbmJqanZiZEV1eVBwTWllDQotRU9iamp2YmRyU1ZLbWtBbQ0KLUVQRExLdmJkaGFuYmR2cVINCi1Eb0NrS3ZiZGtXV21kQnd3DQotRG5iamp2YmR4VWxlUXlMbg0KLUVPY0xLdmJkcHlQSGZwZFkNCi1EbmNLanZiZHBmRGVUdkJJDQotRG9Da0t2YmRuVlZaamlyRw0KLURuYmtLdmJkempWUG9jc1UNCi1FUERMS3ZiZG1mZHdsbWZ5DQotRG5ia0t2YmRTS3lGdUdqcw0KLUVPYmtLdmJkVkFhcHJwcXkNCi1FUENqanZiZFVhQnFUUlJ5DQotRU9ia0t2YmRab05oZGR6Sw0KLURuY0tqdmJkck5aaXlMaEoNCi1EbmNLanZiZGFNa0JydU5IDQotRG9ES2p2YmRaeURqTmNNUw0KLUVQQ2pqdmJkWmpUSVFIQ0cNCi1FT2JrS3ZiZGpKZWdpbHdyDQotRVBES2p2YmRIZmZ6WXhZSA0KLUVQREtqdmJkYVNHQ2hUZkwNCi1Eb0RMS3ZiZGNKTWpMR1d4DQotRU9jTEt2YmR0bFh2YVRhWA0KLURvQ2pqdmJkR1l1VkFjeEMNCi1FT2NMS3ZiZFVzbHRHTHZLDQotRVBETEt2YmRSTlhheU9Veg0KLURvRExLdmJkUmFkRkxpWWsNCi1FT2NLanZiZENUQWJzZlhTDQotRVBDamp2YmRHWlZWQWRZQw0KLUVQRExLdmJkeXBubGlKd0ENCi1FUENqanZiZFNCZEZMaHhrDQotRU9jTEt2YmRHTEZTYmhOVg0KLURuY0tqdmJkVHBwbnVVaE4NCi1FT2JrS3ZiZGV6dllkaVR3DQotRG9Da0t2YmRJc1pCU2x4TQ0KLURuY0xLdmJkUk5ZQnhtdHoNCi1FUENrS3ZiZGVGT3Fhd0NqDQotRG5iamp2YmR0U3JUWXpFYw0KLURuY0tqdmJka0RMa1FnVWcNCi1EbmJqanZiZEVBUmhselhYDQotRU9jS2p2YmRXUm14QmVNRA0KLURvRExLdmJkelFubGlLWEENCi1FUERLanZiZHBmRGR0V0FoDQotRG5jTEt2YmRNZ0NwTXBWTA0KLURuYmtLdmJkaVp0ZkxwbWYNCi1FUERMS3ZiZHpRb05KSndBDQotRVBDa0t2YmRhTkthc1VtSA0KLUVQRExLdmJkUmJEZUxoeUwNCi1Eb0RMS3ZiZEtSWmVPZW1lDQotRU9jS2p2YmRaeGRKbWNNUw0KLURuY0xLdmJkZUtLU1Z0em4NCi1FUERMS3ZiZFJqeGV1SExUDQotRU9ia0t2YmROR2NQbVB0aw0KLURvQ2tLdmJkdGNEVld2UFANCi1FUENqanZiZGNUREtzY2pCDQotRG9ETEt2YmRicmNMVGNpYQ0KLUVPYmpqdmJkdmx2QU1jZG0NCi1FT2JqanZiZEZ4dVZCRHdiDQotRVBDamp2YmRoa2RjbXRieQ0KLUVPY0tqdmJkUm90SEtGY3cNCi1EbmNMS3ZiZGVsZldnTktMDQotRU9ia0t2YmR1Q2J1WFZubw0KLUVQREtqdmJkRVlYbFVVVU0NCi1FT2NLanZiZGJVYkhYanNoDQotRU9jTEt2YmRtZ0V3bU9IWg0KLURvQ2pqdmJkRVh4THNzc2wNCi1FUERMS3ZiZFpMcWRUbWxODQotRU9jTEt2YmRic0NrVUVKYQ0KLUVPY0tqdmJkcXZwTGJoeHENCi1FT2NLanZiZGZJS3ZSbXBnDQotRG5jTEt2YmRHQk9weGl6bQ0KLURvRExLdmJkbkJpd1hubXUNCi1Eb0NqanZiZEtXVkZjZUdpDQotRU9jTEt2YmRSYkVFa2laTA0KLUVPYmpqdmJkZmZNWm1nSEENCi1Eb0NqanZiZFVNV1BCV1BKDQotRU9ia0t2YmRrQ2xLcGZ0Zw0KLURvRExLdmJkQmhrQmtJZWoNCi1Eb0RLanZiZGhnSmJ5V0p1DQotRG9Damp2YmRFQVNJbHpYWA0KLUVQREtqdmJkR1pVdGFEeEMNCi1EbmJqanZiZGxZc1JyeUhVDQotRU9jS2p2YmRoZ0tDeVdKdQ0KLUVQQ2tLdmJkc1FXT2lidWYNCi1Eb0NqanZiZFJNd2JZbXR6DQotRG9ES2p2YmRaeGRKbkNsUw0KLUVQQ2pqdmJkSlRaQlROWU0NCi1EbmJqanZiZGlMZUVPVWJ5DQotRU9jTEt2YmRqRWpnVW9BTw0KLUVQQ2tLdmJkeml0b3BEcnQNCi1FUENqanZiZHRjQ3VXdlBQDQotRG5jS2p2YmRaTVJkVU5sTg0KLURvRExLdmJkZFp4b3haUkMNCi1Eb0RLanZiZEZWeG9vbUtGDQotRG9Da0t2YmRTTFlldUdrVA0KLURuY0xLdmJkWVNsQk5UbngNCi1FT2JrS3ZiZGV1endvaXpzDQotRVBES2p2YmRVUXBvVXVJTg0KLURvREtqdmJkbXBaeHVqeUMNCi1FUENqanZiZERHbEZnQXpjDQotRVBDamp2YmRrQ2trUkd1SA0KLURuYmtLdmJkdmx2QU1kRk4NCi1Eb0RMS3ZiZGF0YkhYa1VJDQotRVBDamp2YmRGV1lvb2xpZQ0KLURuYmpqdmJkckVGSlBuV0INCi1FT2JrS3ZiZHB5T2dnUWN4DQotRU9jS2p2YmRxd1FNQ2h4cQ0KLUVPY0tqdmJkcXJWTE5rQW0NCi1FT2NLanZiZGVyQld6bENvDQotRG9ETEt2YmRSV21kRE1IYw0KLUVPY0xLdmJkWm9OaGRlWmoNCi1EbmJrS3ZiZHVuc3pwa1BVDQotRVBES2p2YmRHQW5weGl6bQ0KLURvQ2tLdmJkS0NqQ3FLQ3gNCi1FT2NLanZiZFpzaGh5RHJuDQotRG9ES2p2YmRkZG9TQnZjSw0KLURuY0tqdmJkY1NjS3RFSmENCi1FT2NMS3ZiZFpqU2hRR2JHDQotRG5jTEt2YmREbmNLa1hERQ0KLUVQRExLdmJkcnpNUVRCSG4NCi1FUERMS3ZiZEl4VUJnbFJRDQotRVBES2p2YmRjeXhwWHhwYg0KLUVPYmtLdmJkTVNYTXl0cHoNCi1FT2JrS3ZiZGlqR0lLTXdyDQotRU9ia0t2YmR6ZHpPemR5cA0KLURuYmpqdmJkZUFUcGx3akcNCi1EbmJrS3ZiZGNJbGlrRndZDQotRG9ETEt2YmRzUHVuaWNWZg0KLUVQREtqdmJkbW96WXZMWkMNCi1Eb0NrS3ZiZGt5VFNTeGdVDQotRG5jTEt2YmRSV25EY0xoRA0KLURuY0tqdmJkSEVMV0phaWoNCi1EbmNLanZiZFpRbUZJbGVSDQotRU9jS2p2YmRpQ09jRXZwcQ0KLUVPY0tqdmJkYnJia1VFS0INCi1FT2NMS3ZiZE9GRVRoaGpkDQotRU9ia0t2YmRiQlZkZXBQdw0KLUVPYmtLdmJkVXhoVHpLbm4NCi1FT2JrS3ZiZHpvUHBkYmxZDQotRU9jTEt2YmRyYkZsbEhMWg0KLURvREtqdmJkamdnTUdHT0wNCi1EbmNMS3ZiZHFjZUpRTnVhDQotRG9ES2p2YmRpSEpieHZKdQ0KLURvRExLdmJkeVNuSW1TQmcNCi1FUENrS3ZiZHRUUnJ4ekZEDQotRU9jTEt2YmRrVnZuRUJ4WA0KLURuYmpqdmJkdGNDdHZ2T28NCi1FUENrS3ZiZHl6ZG1ySGlJDQotRG9ES2p2YmRGamRyYmhNdQ0KLURvRExLdmJkWnlFS09ETHINCi1Eb0RLanZiZFVSUW51VkhtDQotRVBDa0t2YmRaeURpbWNNUw0KLUVPY0xLdmJkTlFYcHVuSFQNCi1EbmJqanZiZFFseENZbXR6DQotRG5iamp2YmRDRG9hVmltRw0KLUVPYmpqdmJkc1B2T2lidkcNCi1EbmJqanZiZGdHTHluR2dBDQotRG5jTEt2YmRDRG9hV0ptRw0KLUVPYmtLdmJkbkNLWFhublYNCi1FT2NMS3ZiZFV4Z3Raa1BPDQotRG5ia0t2YmRpTUZEbXVEWg0KLURuY0tqdmJkaUdpY1pXS1YNCi1Eb0RLanZiZGNTY0t0RUphDQotRG9ES2p2YmRwc3NnUnFrVQ0KLURuY0tqdmJkc0JmTkxnS3kNCi1Eb0RMS3ZiZEdZdHRhRHdiDQotRG5jS2p2YmRqdlduRGF4WA0KLUVQQ2pqdmJkaGdKY1l1aXUNCi1EbmJqanZiZHhVbGRweGxPDQotRG9ES2p2YmRVYUNSU3FTWg0KLURuYmtLdmJkTndvVnpkTnQNCi1Eb0NrS3ZiZFpubkllRXpLDQotRVBES2p2YmROZUVVSklrRQ0KLURuYmpqdmJkSmJqRFFqRFkNCi1FUERMS3ZiZEtWdUZjZUdpDQotRVBDa0t2YmRLa0JJV0FKeQ0KLUVPYmpqdmJkcmFmTWxITFoNCi1FT2NMS3ZiZFpMcWN0TmttDQotRU9iamp2YmRNZ0NvbVB0aw0KLURuY0tqdmJkamhITUdHT0wNCi1EbmJrS3ZiZEpZVUNJTVFwDQotRG9Damp2YmRobEVjblZDeQ0KLURvRExLdmJkeHNPSk5TQmcNCi1FT2NMS3ZiZFJNeEJ4bXR6DQotRU9jTEt2YmRIRGp1akNKag0KLUVPYmpqdmJkWlJNZGhtRlINCi1FUERMS3ZiZFVRcG9VdGhODQotRVBDa0t2YmR2bHZBTkVGTg0KLUVPYmtLdmJkU0NFRWtoeGsNCi1FUENqanZiZExCS2ZtQ1hxDQotRVBES2p2YmRPU3RWZmR1UQ0KLUVQQ2pqdmJkR2NqdkpiS0sNCi1EbmJqanZiZFZCQnBycHF5DQotRG9Damp2YmRpcnppVExKeg0KLURuY0xLdmJkRldZcFFOS0YNCi1Eb0RMS3ZiZGpLR0hqTllTDQotRG5jS2p2YmRabm1pRWR6Sw0KLURvREtqdmJkeVNtaU1yQmcNCi1EbmNMS3ZiZGVBVVJOWUtHDQotRVBETEt2YmRlbUdXZmxpaw0KLURvREtqdmJkYU1rQnJ0bUgNCi1Eb0RLanZiZEl4VUJnbFJRDQotRG9ES2p2YmRPRWNzaGhqZA0KLUVQQ2pqdmJkcHhuaEdxRHgNCi1EbmNLanZiZFlTbEJOVG9ZDQotRG5iamp2YmRHR0tTT0pVUg0KLUVPY0xLdmJkWmpUSHBHYkcNCi1FUENqanZiZElIR3paWVhnDQotRG5jS2p2YmRkbmRzTFRzcg0KLURuYmpqdmJkcUFoZUFYSUUNCi1FT2NLanZiZFZoWHZYZnh6DQotRG5jS2p2YmRGeVZWQWRZQw0KLURuYmpqdmJkSnZWRmNlR2kNCi1FUENrS3ZiZG96bkRqd29BDQotRVBES2p2YmR2UFR6cUxQVQ0KLUVPYmpqdmJkaWlmSUtNd3INCi1FT2NMS3ZiZGxaVFNTeGdVDQotRU9iamp2YmRRdm5FQ2tnYw0KLURuY0xLdmJkamdma2ZHTmsNCi1EbmJrS3ZiZENEb2FXSm1HDQotRG5ia0t2YmR4blRId3JpRA0KLURuY0tqdmJkb0FLenNoRG4NCi1Eb0RLanZiZHZBZFpTbmRoDQotRG5iamp2YmRScFRnS0Zjdw0KLUVPY0xLdmJkaWllZ2lsd3INCi1FT2NLanZiZEdkTFZqQmpLDQotRU9ia0t2YmRHRmpSbWh0Ug0KLUVQQ2pqdmJkWnNpSllkVE8NCi1FUENqanZiZEpKZEFLUGZkDQotRVBETEt2YmRLZkdIYkJSVg0KLURuY0xLdmJkamhITUZlbkwNCi1FT2JrS3ZiZGJMTUZubkRBDQotRG9Damp2YmRVV01QaXNhUg0KLURuYmtLdmJkWmpUSHBIQ0cNCi1FT2JrS3ZiZGJzQ2tUY2pCDQotRVBDa0t2YmRTTFlmVWZrVA0KLURvREtqdmJkWmVZR3poSWINCi1EbmNLanZiZHJvdlBKY1ZmDQotRVBDamp2YmRlUEZTanRUcg0KLURuY0tqdmJkSmJpYnFKYngNCi1FUERMS3ZiZER4WU1VVVRsDQotRG5ia0t2YmRaSFhFQVBTaQ0KLURuY0tqdmJkVlRtVUZsVmoNCi1FUERLanZiZHpvUVJFY0x4DQotRVBES2p2YmRLZkZoQ0FxVg0KLURvREtqdmJkdUREVXdWb1ANCi1Eb0RLanZiZGdGbFptZmdBDQotRU9iamp2YmRUQUVpSGJPZA0KLURvQ2tLdmJkTW93cVZtZ1QNCi1EbmNLanZiZHVNWHdCVGFYDQotRG5jS2p2YmRlWVpzc3JGeg0KLURuY0xLdmJkbWZkeE5OZ1oNCi1EbmNMS3ZiZHhMWERnenpHDQotRG9Damp2YmROc1R2R2R1UQ0KLUVQRExLdmJkVHBxT3R1SG0NCi1FT2JrS3ZiZFpNUmN0T01ODQotRVBDamp2YmRIRUt1aWJKag0KLUVQQ2pqdmJkQmlLYkxKR0sNCi1Eb0NqanZiZFV0TlVGa3ZLDQotRU9jS2p2YmRWVGx0Rmt1ag0KLURuYmpqdmJkY3pZcFh4cUMNCi1FUERMS3ZiZHVXTnhLUXNBDQotRU9jS2p2YmRkWnlRWVlxQw0KLURuYmtLdmJkeWZ5TUFNZHcNCi1EbmNMS3ZiZERpaEtXWGpBDQotRVBDamp2YmRvQUt6dElEbg0KLURvQ2pqdmJkY1RETFVEakINCi1FUERLanZiZEpjSmNSS0N4DQotRG5jS2p2YmRJeFRhaExxUQ0KLURvRExLdmJkVHFST3R0Z20NCi1Eb0RLanZiZGpibExRZ1VnDQotRU9jTEt2YmRUcHBudVVoTg0KLUVQQ2pqdmJkck15alpMZ2kNCi1FT2JqanZiZHlwbm1JalhBDQotRG9Da0t2YmRjellveFpSQw0KLUVPYmtLdmJkRmplVERIbVYNCi1FUENqanZiZFp4Y2ltYmtyDQotRG9ES2p2YmRhdGJIWGtVSQ0KLUVQREtqdmJkdm1XQU1kRW0NCi1Eb0NqanZiZHF3UU1DaVlxDQotRG9ES2p2YmR1V053alFzQQ0KLURuY0tqdmJkQUNxd2paaVENCi1Eb0NqanZiZE9UVHZHZHVRDQotRU9ia0t2YmRpcnpoc0tpeg0KLUVPYmpqdmJkT1RUdWdGVXANCi1FT2NMS3ZiZEtESmJxSmNZDQotRG9Damp2YmRpVXllWFJ0Yg0KLUVPYmpqdmJkZk1mWEhOS0wNCi1FT2NLanZiZGpoSE1GZk5rDQotRG5jS2p2YmRScFVHakZjdw0KLUVQQ2pqdmJkZklMVnFuUkgNCi1FT2NLanZiZGlIS0N5V0p1DQotRG9ETEt2YmRuUHpZdkxZYg0KLURuYmtLdmJkbkdlWU5PSFoNCi1Eb0RLanZiZHR2T1hqUXNBDQotRVBDamp2YmRtSWN0UlZSYQ0KLUVPY0tqdmJkcHlPaEdwY3gNCi1EbmJrS3ZiZEtReWRvRm5GDQotRG9ES2p2YmRrVnZuRGF3dw0KLUVPYmpqdmJkYlViSFhqc2gNCi1FT2NLanZiZENKTENMSWZLDQotRVBES2p2YmRaZVlHemhKQw0KLURuY0tqdmJkY1NjTFVEaWENCi1Eb0NrS3ZiZFFtWGJaT1V6DQotRU9jTEt2YmRSYWRGTUl4aw0KLURuYmtLdmJkeml1UG9kU3QNCi1FT2NLanZiZEVYeE1VVVRsDQotRG5iamp2YmRlZ2p2U09RZw0KLUVPYmtLdmJkWnRKSllkVE8NCi1FUERLanZiZFZBYlFzUXJaDQotRG5ia0t2YmRrSGZsRmZPTA0KLUVPYmtLdmJkdGNDdVhXT28NCi1EbmJqanZiZGNURExVRUphDQotRVBDamp2YmRaalRJUUhCZg0KLUVPYmpqdmJkVEFFaGhDUEUNCi1FT2NMS3ZiZGJobGlrRndZDQotRG9ETEt2YmRFUERLa1diZA0KLUVPY0tqdmJkWnRKSlpFU24NCi1FUERLanZiZFpNUmRVTmxODQotRVBDa0t2YmRoZ0pjWldKdQ0KLURuY0tqdmJkVWFCcVNwcloNCi1FT2NMS3ZiZEVKZ2l1eEtBDQotRU9iamp2YmRTUHRIS0Zjdw0KLURvQ2pqdmJkRmZLU09KVVINCi1FT2JqanZiZFZyT1hhZU1EDQotRG9Damp2YmRyWFBrY0l4cQ0KLURvREtqdmJkWmpUSG9mYWYNCi1FT2NMS3ZiZFZZZ3N6TE9uDQotRG5jS2p2YmRJd3NhZ2twcA0KLURuY0xLdmJkVGt2UEJWbmkNCi1FT2NMS3ZiZFV0TlVGa3VqDQotRU9iamp2YmRabm1oZUV5ag0KLUVQREtqdmJkeVlJakJveWsNCi1FUENrS3ZiZHFseWl5TUlKDQotRVBDamp2YmRZemJlcWpWeQ0KLUVPY0xLdmJkVVFxT3VWSU4NCi1FT2JrS3ZiZFpNU0R0T01ODQotRG5jS2p2YmRWdmh4V0RkZw0KLUVPY0xLdmJkaVp1RmxSTmYNCi1FT2JqanZiZFp0SkpZY3JuDQotRVBDamp2YmRtdVV6S2lyRw0KLURvRExLdmJkVlVNdEdNVmoNCi1FUERMS3ZiZGhXeUF6ekFKDQotRG9ETEt2YmRmSUt2Um1xSA0KLURuYmpqdmJkcWRGSXBPVmENCi1EbmJrS3ZiZEl3dENIa3BwDQotRU9jS2p2YmRlRW5yQnZjSw0KLURuYmtLdmJkSnV1RmRGR2kNCi1Eb0RLanZiZGVPZVRLdFVTDQotRU9iamp2YmRLV1VmRGVHaQ0KLUVQQ2pqdmJkaUhKYnlWaXUNCi1FT2NLanZiZEJyYUNzZldyDQotRG9Damp2YmRHWXVWQkVZQw0KLURvQ2tLdmJkbkhFd21PSFoNCi1FUERLanZiZFppc0lRR2FmDQotRVBDa0t2YmRtcFp4dkt5Qw0KLURvRExLdmJkbVNZdVpyZEoNCi1FT2JrS3ZiZEtESmJxS0N4DQotRU9jTEt2YmRac2lKWkVUTw0KLUVQREtqdmJkbkNKdnhPbXUNCi1Eb0NrS3ZiZGpnZmxHR09MDQotRG5ia0t2YmRSb3NmakZkWA0KLUVQQ2pqdmJkUkVDYVFRY3INCi1EbmJrS3ZiZE5IQ29tUVZMDQotRVBDamp2YmRySkFLRW1PZQ0KLURvRExLdmJkcUJKRkFYSUUNCi1EbmNMS3ZiZEdMRlRESU5WDQotRU9jTEt2YmRoZ0pieHVqVg0KLURuYmtLdmJkalN6aHNLaXoNCi1FT2NLanZiZEtXVkdEZGZpDQotRG9ES2p2YmRabm5JZUZaag0KLURuYmpqdmJkeHhJaWFveWsNCi1FT2JrS3ZiZGN6WXBZWlFiDQotRVBDamp2YmRaeGNqT0RNUw0KLUVPYmtLdmJkaUhKYnh2S1YNCi1Eb0NqanZiZEp6b2V4RUFODQotRG9Damp2YmRhUmZDaFRlaw0KLURvRExLdmJkeHdoakNQeWsNCi1Eb0RMS3ZiZFZxbllCZUxjDQotRG5ia0t2YmRSRGNCUHBkUw0KLUVPYmtLdmJkWXFORkltRlINCi1FUERLanZiZHNyclRZekZEDQotRU9jS2p2YmRxY2RocE9XQg0KLUVPY0tqdmJkYU5MQ1RVbUgNCi1Eb0RLanZiZG5Qell1a1pDDQotRG5jTEt2YmRLQ2pEUktDeA0KLUVPYmpqdmJkRmtFc0RJTlYNCi1FUERLanZiZE1nRFFNb3VMDQotRG5jTEt2YmRPWG51emROdA0KLUVQQ2pqdmJkcHN0R3FyTFUNCi1FUENrS3ZiZFJiRGRraHlMDQotRG5ia0t2YmRhb2dHZEx6ZA0KLURuY0tqdmJkamxiTHlkZ1ANCi1EbmJqanZiZFVNVm9BdlBKDQotRVBDamp2YmRKcVplT2ZPRg0KLURvRExLdmJkVXNtVGVrdksNCi1Eb0NqanZiZHB5T2dmcGN4DQotRG5ia0t2YmRKWVVDSU1SUQ0KLURuY0xLdmJkakpmSGpNd3INCi1Eb0NqanZiZFJvc2dLR0R3DQotRG9Da0t2YmRkWnhwWVlxQw0KLURuY0tqdmJkZGRuckJ3Q2oNCi1FUERLanZiZGlqR0lKbHhTDQotRG9Damp2YmRrV1duRUNZWA0KLUVPYmtLdmJkcWx6SnhsSUoNCi1FT2NMS3ZiZHphQVBISEJsDQotRG9ES2p2YmRsWlRTU3lHdA0KLURuYmpqdmJkYXRiSFhrVUkNCi1FT2NMS3ZiZE5kY3NoaUtkDQotRG5jS2p2YmRHZEt1akJqSw0KLURuYmpqdmJkUlduRGNNSUQNCi1Eb0NqanZiZFN4S2xOemtZDQotRVBES2p2YmRIRGtXSmJKag0KLUVQRExLdmJkWnhjak5jTHINCi1FT2NLanZiZExZcUtTenVHDQotRVBETEt2YmRqdXZtY2F3dw0KLUVQREtqdmJkeG1yaFlUSkQNCi1FT2NLanZiZFppcmhQZmFmDQotRG5iamp2YmRmSUt1ck5xSA0KLUVQQ2tLdmJkWVRMYU5UbngNCi1Eb0RMS3ZiZGR0QVVBU2x2DQotRVBDa0t2YmRaTHJEdE9MbQ0KLURuYmpqdmJkbkdkeE1uSFoNCi1Eb0NqanZiZGVGUFNDWENqDQotRG5jTEt2YmRZT1JBWVV2VQ0KLUVQQ2pqdmJkclhRTURKWlINCi1FUENrS3ZiZFJwVGZqR0R3DQotRG9Damp2YmRwc3NmclNLdA0KLUVQQ2tLdmJkS1dVZWRGSEoNCi1EbmJqanZiZFZ2aHd2RGRnDQotRG5jS2p2YmRMcldselVweg0KLURuY0tqdmJkd3RtRlF4a24NCi1FT2JrS3ZiZG1JZFRxVXFhDQotRG5ia0t2YmRKdXRlZEZISg0KLUVPY0tqdmJkVlpJVHlrUE8NCi1Eb0RMS3ZiZGhiUERGWFFxDQotRG5iamp2YmRtdVZaamlyRw0KLURuY0xLdmJkaWVLZ1ZQQU8NCi1EbmNLanZiZEV1eVBwTkplDQotRG9ES2p2YmRpSEpjWXVpdQ0KLUVQREtqdmJkbWdGWU5OZnkNCi1EbmJrS3ZiZE9UVVdHZVVwDQotRG9Damp2YmRaUk5GSk5GUg0KLUVQRExLdmJkWXBtRkpORXENCi1FT2JrS3ZiZFJNeEJ4blV6DQotRG5jS2p2YmROUVlRdk9IVA0KLUVPY0xLdmJkTW94UlZuSFQNCi1Eb0RLanZiZHB5T2hHcGN4DQotRU9iamp2YmRSeWpJVERXQQ0KLUVPYmpqdmJkcnlrb3NBaE8NCi1FT2NMS3ZiZGhhb0RGWFJSDQotRG9ETEt2YmRJcnlCU21ZTQ0KLURuYmpqdmJkbFpTclRZZnQNCi1EbmNMS3ZiZGVnanVyT1JIDQotRU9jS2p2YmRKWVVDSGxSUQ0KLUVPY0xLdmJkUkVEQXBSRVMNCi1FT2JqanZiZG1nRllNbkhaDQotRVBDa0t2YmRaeURpbWJsUw0KLURvQ2tLdmJkaUNQQ2R3UXENCi1FT2JrS3ZiZGJWQmdZS3RJDQotRG9ETEt2YmROZGRVSkpMRQ0KLURvQ2pqdmJkcnBWbmlidWYNCi1FUERMS3ZiZEthTEdsYllSDQotRG5iamp2YmRUcHFQVlVoTg0KLURvQ2pqdmJkY3l4b3hZcGINCi1FUERLanZiZGhmaWJ4dkp1DQotRVBDamp2YmRKcHlkbmZOZQ0KLURuY0xLdmJkdVdPWGlwc0ENCi1Eb0RLanZiZHJSdGtOa0FtDQotRU9ia0t2YmROUVhxVm1nVA0KLUVPYmtLdmJkQ0lrQmtKRmoNCi1FUERMS3ZiZHFVVUhTUmp0DQotRU9jTEt2YmRlWVp0VHFleg0KLUVQQ2pqdmJkcVVVSFJxa1UNCi1EbmNLanZiZGtXWE9EYXhYDQotRVBDa0t2YmRhTktiVFZOSA0KLUVQQ2pqdmJkdkFjeHJvRWgNCi1FT2NLanZiZGxaVFNUWkd0DQotRU9jTEt2YmRMQWtITkNZUg0KLURvRExLdmJkVXRNc2VsV0sNCi1FUENqanZiZG5WVXpLalJmDQotRG9ETEt2YmR5cG9NaUp3QQ0KLUVPYmpqdmJkS0RLQ3FLRFkNCi1Eb0NqanZiZHJXb2xESXhxDQotRG9ES2p2YmR3eWhGZlhlUw0KLUVPY0tqdmJkbkdlWU1tZ1oNCi1Eb0RMS3ZiZFJFREFvcGNyDQotRVBDamp2YmRpVXpGWFJ1Qw0KLURvRExLdmJkWlFsZGhtRXENCi1FUENqanZiZHR2TndpcHNBDQotRVBES2p2YmRicmNMVURpYQ0KLURvRExLdmJkZWdrVnFuUWcNCi1Eb0NqanZiZHpub3BkY01ZDQotRG9Damp2YmRtZmVYbG1nWg0KLURuY0xLdmJkWHJsQk1zbngNCi1Eb0NqanZiZG1nRXdtT0d5DQotRG9Da0t2YmRqbUNMeWRnUA0KLURuY0xLdmJkbUpFVVF1U0INCi1EbmJqanZiZFJiRGVMaVlrDQotRG5ia0t2YmRRZERCUHFEcg0KLUVPYmtLdmJkaktHSGpNeFMNCi1Eb0NrS3ZiZHlPVEh4U2lEDQotRVBDamp2YmRRd05kQ2toRA0KLUVPYmpqdmJkZk5Gd0dsakwNCi1FT2JqanZiZFZxbXhDRWxEDQotRU9jS2p2YmRlT2VUS3RUcg0KLURvREtqdmJkVWFCcVNwcXkNCi1EbmJqanZiZG1JZFVSVXFhDQotRG9Da0t2YmRVV01RSnRCUg0KLURuYmpqdmJkeG5TZ3hTaUQNCi1EbmNLanZiZHdYTUJWYVZ1DQotRG5iamp2YmR2dmthVmFXVg0KLUVPYmtLdmJkbWFpd1hubXUNCi1Eb0NqanZiZGdRQnp3RVlJDQotRU9jS2p2YmRGVnhwUG1KZQ0KLUVPYmpqdmJkS0RKY1FqQ3gNCi1Eb0NrS3ZiZFlsUmRVT01ODQotRU9jTEt2YmRab09JZGR6Sw0KLURvQ2pqdmJkZmZNWm5ISEENCi1EbmNLanZiZG5RWnh1anhiDQotRVBETEt2YmR3WE1CV0JWdQ0KLURvQ2pqdmJkTEZmSUJhUXUNCi1EbmNLanZiZEdRQVN3SEZ5DQotRG5ia0t2YmRhdUJmeEtzaA0KLUVPY0xLdmJkcmFlbGtnS3kNCi1FT2JrS3ZiZG5WVXpMS1NHDQotRG9ES2p2YmRBTkh4cndaeA0KLURuY0xLdmJkcVpQSGZxRVkNCi1FT2JqanZiZHZQVHpwam9VDQotRU9iamp2YmRyV3BNREl5Ug0KLURuYmtLdmJkQ0RwQldLTkcNCi1EbmJrS3ZiZHlPU2d3cmhjDQotRG5ia0t2YmRlS0tTVnR6bg0KLURuY0tqdmJkTW93cHVtZ1QNCi1FT2NMS3ZiZE9GRHRJaGpkDQotRVBES2p2YmRrRE1MUkd0Zw0KLUVQREtqdmJkaWllaEpsd3INCi1FUERMS3ZiZEJkUUF2SmxmDQotRG9ETEt2YmRaeUVLT0RNUw0KLUVPYmpqdmJkSnFaZVBGbWUNCi1EbmJrS3ZiZEt4cUtTenRmDQotRU9ia0t2YmRtSkVVUXVTQg0KLURuYmtLdmJkUkVEQW9wZFMNCi1FUERLanZiZHd6SGVmWUVyDQotRVBES2p2YmRuSEV4TW5HeQ0KLUVPY0tqdmJkbW96WlZqeUMNCi1FUERLanZiZFpIV2RBUFRKDQotRG9ES2p2YmRqZ2ZrZkZuTA0KLURuY0tqdmJkY3paUHhZcUMNCi1Eb0RLanZiZEVYd2xVVVRsDQotRG5jS2p2YmRodVpkdnJWQw0KLURuYmtLdmJkeEt3RGd6ekcNCi1FUENrS3ZiZHNabFFTYUlPDQotRU9jS2p2YmR6UlBNaUtYQQ0KLURvREtqdmJkcXZvbERJeHENCi1Eb0RLanZiZFFkQ2FQcGNyDQotRVBDamp2YmRKbUFEeWZ1Qg0KLURuYmpqdmJkc0NHTkxnTFoNCi1Eb0RLanZiZEtmR0lDQXFWDQotRG9Da0t2YmRiaU5Ka0dYWQ0KLURuY0tqdmJkaUdpY1l2S1YNCi1FUENqanZiZFN4TExtemp4DQotRG5jS2p2YmRMQWpmbGF4Ug0KLUVQQ2tLdmJkVXlIc3lqb08NCi1EbmJqanZiZGN5eG94WXFDDQotRU9ia0t2YmR4WmdmR1lGUw0KLUVQRExLdmJkWm9OaUVlWmoNCi1EbmNMS3ZiZFp0SWh4Y3JuDQotRVBETEt2YmRJd3RDSUxxUQ0KLURuY0xLdmJkUW1YYlltdHoNCi1FT2NMS3ZiZG11VXpLaXFmDQotRVBES2p2YmRzUVZuaWJ1Zg0KLUVPYmpqdmJkT1NzdWdFdHANCi1FT2NMS3ZiZFlsU0VUbkxtDQotRU9ia0t2YmRVdE5VR01XSw0KLURvRExLdmJkemVabnplWnANCi1Eb0RLanZiZHFUdEhScWtVDQotRU9iamp2YmRtYkp2eFBOdQ0KLURvRExLdmJkbGlEc3FVcWENCi1FUENqanZiZGhhbmJkdnBxDQotRG9ES2p2YmRpaWZIaWx4Uw0KLURvREtqdmJkbUpEc3B0cWENCi1EbmJrS3ZiZERuY0trV2NFDQotRVBDa0t2YmRhb2ZnRUx6ZA0KLURuY0tqdmJkaWpHSUptWHINCi1FUENrS3ZiZFJrWWZVZ0xUDQotRU9ia0t2YmRIRUt1aWJLSw0KLURuYmpqdmJkVmhYdXdmeHoNCi1Eb0RMS3ZiZGlNRWNtdUN5DQotRG5ia0t2YmRKY0pjUWlieA0KLURuYmtLdmJkbWZlWU5PR3kNCi1Eb0RLanZiZHFVVGdTU0t0DQotRVBETEt2YmRlUEVyanRVUw0KLUVPYmtLdmJkYU5LYXNVbUgNCi1FT2JrS3ZiZGlpZklKbVlTDQotRU9jS2p2YmRzUHVuakN2Rw0KLUVPYmtLdmJkYnJjS3REakINCi1FUERLanZiZGJobGlrRndZDQotRVBDamp2YmRycFZuakRXRw0KLUVQQ2pqdmJkYU1rQ1N0bGcNCi1EbmNLanZiZE1wWHFWbkdzDQotRVBETEt2YmRaalNoUGZiRw0KLUVQRExLdmJkZkhrVnJPUWcNCi1Eb0NrS3ZiZERuYmpqdmJkDQotRG9Da0t2YmRreVNxc1lmdA0KLURvRExLdmJkWlJNZUltRXENCi1Eb0RMS3ZiZFlwbGVJbGVSDQotRG5jS2p2YmRpSEpieVZpdQ0KLUVPYmtLdmJkck15aXhrZ2kNCi1FUERLanZiZHF2b2tiaVlxDQotRU9jS2p2YmR6aXRvb2RUVQ0KLURuYmpqdmJkVlloVHlqbm4NCi1FUERMS3ZiZHlZSkpiUHpMDQotRU9ia0t2YmRlRlBTQ1djSw0KLUVQREtqdmJkSXNaQXJseE0NCi1EbmJqanZiZGtJSExmR05rDQotRG9ETEt2YmRlaExWcW1xSA0KLUVPY0xLdmJkdkJFWlRQRkkNCi1EbmNLanZiZG5VdVpqaXJHDQotRVBDamp2YmRha0xmT25EQQ0KLURuYmtLdmJkRXpzcUVrY0oNCi1EbmJqanZiZFZoWHZYZ1l6DQotRG9Damp2YmRJcnlCVE5ZTQ0KLURuY0tqdmJkWmlyZ3BIQmYNCi1Eb0RLanZiZEVZWUxzc3RNDQotRG5iamp2YmRac2hoeUVUTw0KLURvQ2pqdmJkT1RVVmdGVlENCi1FT2JqanZiZFppc0hwR2JHDQotRG9ETEt2YmRrRExrUkd0Zw0KLUVPYmtLdmJkZWdqdlNOcGcNCi1EbmNMS3ZiZGZJS3ZSblFnDQotRG5jTEt2YmRKS0VBSnBHZA0KLURuY0tqdmJkclJ0a05rQk4NCi1FUENrS3ZiZGp2V25EYXhYDQotRG9Damp2YmRtZmR3bU5nWg0KLURuYmpqdmJkYnJjTFVFSmENCi1EbmNMS3ZiZG5RWnh1anhiDQotRG9ES2p2YmROc1R1Z0V1UQ0KLUVPY0tqdmJkVVZsUGlzYVINCi1FT2JrS3ZiZEhEanVqQmlqDQotRVBETEt2YmRTQmRGTUpZaw0KLUVQQ2tLdmJkVnZoeFZkRkgNCi1EbmNLanZiZElzWWFUTlhsDQotRVBETEt2YmRJcnhhU2x4TQ0KLUVQREtqdmJkZm9hendEd2gNCi1FUENrS3ZiZGRlT3FiWERLDQotRG9Damp2YmRKcHpFbmZOZQ0KLURuY0tqdmJkcWlBS0ZOT2UNCi1FUERMS3ZiZHVEQ3R3V09vDQotRG5iamp2YmRaalNoUUdiRw0KLUVPYmpqdmJkVkFiUXNSU1oNCi1EbmNMS3ZiZHRjQ3VXdW9QDQotRG9ES2p2YmRUdkxvaXRBcQ0KLUVPY0xLdmJkWlFsZUlsZVINCi1Eb0NrS3ZiZHVMeFhBdEF3DQotRG5iamp2YmRxWW9IZnFEeA0KLURvREtqdmJkSllUYkhrcVENCi1EbmNMS3ZiZEdaVXRhRHhDDQotRU9iamp2YmRxRmRFdFdBaA0KLUVQQ2tLdmJkSUxhem5XcUwNCi1FT2JrS3ZiZFF3TmRDa2hEDQotRVBDa0t2YmRtSkRzcVVxYQ0KLUVPY0tqdmJkdkJFWXJuZUkNCi1Eb0RLanZiZGFwR2dFTHpkDQotRG9Damp2YmR3V2xBdkF2Vg0KLURvRExLdmJkSmJpY1FpY1kNCi1FUERLanZiZGFhVmRlcFB3DQotRG9Da0t2YmRzWmtvc0FoTw0KLURvQ2tLdmJkTmVFVGlKS2QNCi1FT2JrS3ZiZEVPYmtMWENkDQotRVBDamp2YmR1Q2J1WFZubw0KLURvQ2tLdmJkcnlrcFRCSG4NCi1EbmJrS3ZiZHJFRklwTnVhDQotRG9Damp2YmRsWXJyU3hmdA0KLURvRExLdmJkcWRGSXBPVmENCi1FT2JqanZiZHJiRm1NR2p5DQotRG5ia0t2YmRScFVIS0dEdw0KLUVPY0xLdmJkem9QcGRjTVkNCi1Eb0RMS3ZiZGZJTFZxblFnDQotRG9Da0t2YmRsWlNxc1pIVQ0KLURuY0tqdmJkcnpNUVNhSU8NCi1Eb0NrS3ZiZGh1WmVXclViDQotRU9iamp2YmRmU0F2emtibw0KLURvQ2tLdmJkVlpJVVpqbm4NCi1FT2NMS3ZiZGhsRWRPVWNaDQotRG9ES2p2YmRiVWFnWGtVSQ0KLURvQ2pqdmJkcVVUZ1JxanQNCi1Eb0RMS3ZiZHFUc2ZyUmp0DQotRG5ia0t2YmRyb3VvS0N1Zg0KLUVQREtqdmJkbWJLWFhvTnUNCi1Eb0RMS3ZiZGhiUERFd1JSDQotRG5jTEt2YmR1Vm5ZS1JUQQ0KLURvQ2pqdmJkY0pOS0tmWFkNCi1FUENqanZiZGVGT3JDWERLDQotRVBDa0t2YmRjellveFlwYg0KLURuYmtLdmJkS2ZHSGFhUlYNCi1Eb0NqanZiZE11VFJqbUFYDQotRG9ES2p2YmRrTWFsWmVHbw0KLURuYmtLdmJkYmhtS0xGdngNCi1FUERMS3ZiZGp1d09EYlh3DQotRG9ETEt2YmRVTVZvQlZvSg0KLURvQ2tLdmJkUnBUZ0pmRHcNCi1FT2NMS3ZiZGFqbEZvTmNBDQotRVBDamp2YmRSTXdheG5Veg0KLUVPY0xLdmJkSmNKYnBqRFkNCi1Eb0NqanZiZGpoSExlZk5rDQotRU9jTEt2YmRjYXNOU0FUbQ0KLURvREtqdmJkeU9USHdyaUQNCi1FT2JqanZiZEtReWRuZW5GDQotRU9iamp2YmRaaXJoUGdCZg0KLUVQQ2pqdmJkQmlLYkxJZksNCi1FT2NLanZiZE5lRHRJaUtkDQotRU9jS2p2YmRrRExqcUd0Zw0KLURvREtqdmJkdUREVld1b1ANCi1EbmNMS3ZiZGVQRXJqdFRyDQotRU9jS2p2YmRKYmljUWpEWQ0KLUVQREtqdmJkcnlsUVRCSG4NCi1EbmJqanZiZGtNYk1aZUdvDQotRG5jTEt2YmR0bFlXYVVBdw0KLURvQ2pqdmJkRHd4TVVUdE0NCi1FT2JrS3ZiZGpibEtxR3RnDQotRG9ES2p2YmRSTXhDWk50eg0KLUVPYmtLdmJkcVlvSUdxRHgNCi1FUERLanZiZG1mZVlOTmdaDQotRU9iamp2YmRUQUZJaENQRQ0KLURvQ2pqdmJkaktHSUtNeFMNCi1FT2NMS3ZiZE1wWVJXT0hUDQotRU9jTEt2YmRNb3hSVm5Hcw0KLURuY0tqdmJkaGFvREV3UXENCi1EbmJrS3ZiZEVYeE1UdFRsDQotRVBDa0t2YmRNZ0NwTXBWTA0KLUVPYmpqdmJkUnpLSVREV0ENCi1FT2NMS3ZiZHJ6TG9zQkhuDQotRVBDa0t2YmRCcmFDc2ZXcg0KLURvQ2tLdmJkYWFWZUdQb3cNCi1FT2NMS3ZiZElHZ1p5WHhIDQotRVBES2p2YmRsaUVUcHRxYQ0KLUVPY0xLdmJkYktsR1BPREENCi1EbmJqanZiZFJhZEVsSlpMDQotRVBETEt2YmRqRkxIVlBBTw0KLURuYmtLdmJkaUJuYmR3UlINCi1FT2JrS3ZiZHZCRHlUT2VJDQotRG5iamp2YmRVeUh0Wmpubg0KLURuYmtLdmJkbWdGWU5PR3kNCi1EbmJrS3ZiZEdLZHNESGx1DQotRVBETEt2YmRaUk5FaU1lUg0KLURvQ2tLdmJkYkxMZW9PREENCi1FT2JrS3ZiZEFOSVpTdnpZDQotRG9Da0t2YmR6aXVQcERydA0KLURuYmpqdmJkV0h3dlhnWXoNCi1FUERLanZiZHNCZk5MZ0xaDQotRG9Da0t2YmRXV2lYdWRGSA0KLUVQRExLdmJkd3pJR0dZRXINCi1FT2NMS3ZiZFZUbVVHTVdLDQotRU9iamp2YmRNU1hNeXRweg0KLURuY0tqdmJkWmlyaFFHYWYNCi1FT2JqanZiZENKTEJqaUdLDQotRVBDamp2YmRaTHJFVG5MbQ0KLUVPYmpqdmJkZWxldmZsakwNCi1EbmNLanZiZEdZdVZCRVlDDQotRVBDa0t2YmRrQ2tqcGdVZw0KLURvQ2tLdmJkYmhsakxGd1kNCi1EbmJqanZiZGVFb1NCdmJqDQotRG5jTEt2YmR2QWN5VFBGSQ0KLURuYmtLdmJkamJsTFFnVkgNCi1FUENqanZiZGVFb1NCdmJqDQotRG5ia0t2YmRhTWpiU3RsZw0KLUVPYmpqdmJkckRkaHBPV0INCi1FT2NLanZiZGJLbEZvT0RBDQotRVBETEt2YmRaalRJUUdhZg0KLUVPYmpqdmJkRXpzcUVrY0oNCi1EbmJqanZiZFpSTkVpTkVxDQotRU9iamp2YmRxbHpKeGxJSg0KLURuYmtLdmJka0lITGZGbWsNCi1FT2JrS3ZiZE10cnJLbUFYDQotRVBDa0t2YmROUVhwdk5nVA0KLUVQQ2tLdmJkYnJjS3RFS0INCi1FT2JqanZiZFNQdEdqR0VYDQotRG9ES2p2YmR4d2lKYW95aw0KLURuYmpqdmJkVlloVVprUE8NCi1Eb0RMS3ZiZFhybEJOVVBZDQotRG9ES2p2YmRabm1pRWR6Sw0KLURvQ2pqdmJkV1dpWHZEZUgNCi1Eb0RMS3ZiZHlOc0h3c0ljDQotRG9ES2p2YmR3eWhGZllFcg0KLUVQRExLdmJkTmVEc2hoa0UNCi1FUERLanZiZEJpTEJrSkZqDQotRU9jS2p2YmRKcVpkb0dOZQ0KLUVPY0tqdmJkYkF2RWVwUVgNCi1Eb0NqanZiZGFOTEJzVWxnDQotRVBETEt2YmR2QkR4c09kaA0KLURuY0tqdmJkR0Zpck5pVHENCi1FUERMS3ZiZFpubWlFZVpqDQotRG5jTEt2YmRlUEZTanRUcg0KLUVPY0tqdmJkbkdkd2xuSFoNCi1FT2NMS3ZiZHVERFV2dW5vDQotRU9iamp2YmRaUW1GSWxkcQ0KLURvQ2tLdmJkY3l4cFlZcUMNCi1FT2NMS3ZiZE1Sdmx6VlF6DQotRG9Damp2YmR0Y0RVd1ZvUA0KLUVQQ2tLdmJkclhRTGJoeHENCi1Eb0RLanZiZGtWd09EYlh3DQotRG5iamp2YmRuQ0p3WU9tdQ0KLURuYmtLdmJkcXZwTGJoeHENCi1Eb0RLanZiZEtESmNRakRZDQotRG5ia0t2YmR2d01BdkF1dQ0KLUVQREtqdmJkdHZOeEtSVEENCi1Eb0RLanZiZFlrcWN0T01ODQotRG9ES2p2YmR0Y0N1V3ZPbw0KLURvQ2pqdmJkRU9ia0xYREUNCi1Eb0NrS3ZiZGJyYmp0RGlhDQotRU9ia0t2YmREbmNLa1hERQ0KLURuYmpqdmJkeHhKS0JvekwNCi1FUENqanZiZGJobGlrR1d4DQotRG5jS2p2YmRKWHRDSU1SUQ0KLUVPY0xLdmJka1Z2bWNheFgNCi1Eb0NqanZiZHF3UGtiaHlSDQotRU9iamp2YmR5U25JbVJiSA0KLUVPYmpqdmJkWlFsZUltRlINCi1FT2JrS3ZiZG1wWnh1anlDDQotRVBDamp2YmRoYlBERXZwcQ0KLUVPYmtLdmJkcHlQSGdSRVkNCi1Eb0RMS3ZiZHd6SUdHWGVTDQotRU9iamp2YmRhU0dDaFVHTA0KLURvREtqdmJkcmJGbU1Ha1oNCi1FUENrS3ZiZHhLd0VIenlmDQotRG5ia0t2YmRKWHRCZ2twcA0KLUVQQ2tLdmJkbFpUUnJ4ZnQNCi1FT2NLanZiZEZWeVBwTktGDQotRG9Da0t2YmRhUmVjSHNlaw0KLURvREtqdmJkRmZLUm5KVVINCi1Eb0NqanZiZHlPVElYcmhjDQotRG9ETEt2YmR5T1NneFNoYw0KLURvREtqdmJkRU9jS2p3Q2QNCi1Eb0NqanZiZHpvUHBlQ2xZDQotRG9Da0t2YmRVUlJQVlVoTg0KLURvRExLdmJkVnFteENGTUQNCi1FT2NLanZiZE5WU3JLbUFYDQotRU9jS2p2YmRUdkxwS1RhUg0KLUVQRExLdmJkQ1RBYnRGd1MNCi1FUERMS3ZiZFp5RUtOYmxTDQotRU9jTEt2YmRzQ0ZsbEhMWg0KLUVPYmtLdmJkamxiTVplSFANCi1FUERLanZiZE1wWHB1bkdzDQotRU9iamp2YmRhTkxDU3VOSA0KLURvRExLdmJka0NranFIVWcNCi1FUENqanZiZFRZS2xOemp4DQotRG5iamp2YmROeE91emRPVQ0KLURvQ2tLdmJkZWdqdlJtcGcNCi1Eb0NqanZiZGhmakN5V0tWDQotRG5jTEt2YmRqZ2dNRmZOaw0KLUVPY0tqdmJkdVZtd2pSVEENCi1EbmJrS3ZiZERqSGl1eEtBDQotRU9jTEt2YmRkZVBSYXZjSw0KLURuYmtLdmJkd2tXY2d6eWYNCi1EbmJrS3ZiZEhsQnpuWFFrDQotRVBDa0t2YmRhdGFmeEtzaA0KLUVQQ2pqdmJkY0pNaktmWFkNCi1Eb0RLanZiZHJEZGlRT1dCDQotRG9ETEt2YmRWdmh3dkVFZw0KLUVPYmpqdmJkd2p2ZEh6ekcNCi1EbmNMS3ZiZHVNWVhBdEF3DQotRG9ETEt2YmRaUW1GSk5FcQ0KLUVQQ2pqdmJkeU9USVhyaUQNCi1Eb0NrS3ZiZGJpTktMR1d4DQotRG5jS2p2YmRIRUt2S0Jpag0KLUVQRExLdmJkWWxTRHROa20NCi1Eb0RLanZiZFRxUk91VklODQotRVBDa0t2YmRkZU9xYlhDag0KLUVPY0xLdmJkQ1RCQ3Nld1MNCi1FUENqanZiZG5VdHlrSnJHDQotRG5iamp2YmRsWlRTU3lHdA0KLUVQQ2pqdmJkam1Ca3llR28NCi1EbmJrS3ZiZFZoWHV3Znh6DQotRG5jTEt2YmRlUEZUTFRzcg0KLUVPY0tqdmJkZW1HV2dNaWsNCi1FT2JrS3ZiZGh1WmVXcXVDDQotRVBDamp2YmRFdllwUU5LRg0KLUVPY0tqdmJkcGFKRkFYSGQNCi1Eb0RLanZiZEpTeUJTbVlNDQotRU9jTEt2YmRTQ0RkbEl4aw0KLURuY0tqdmJkU0xaR1ZHa1QNCi1EbmJrS3ZiZHJiRmxrZ0t5DQotRU9iamp2YmRKU3lBc013bA0KLUVPY0tqdmJkRU9jS2tYREUNCi1FUENqanZiZE1veFF1bWZzDQotRVBES2p2YmRVUXBudVVnbQ0KLURuY0tqdmJkYWFXRkZvb3cNCi1EbmJrS3ZiZGFrTUdQT0RBDQotRU9ia0t2YmRyRUVob211YQ0KLUVPY0tqdmJkbW96WldMWWINCi1FT2JqanZiZFZnd3V4R3h6DQotRU9jTEt2YmRDSkxDS2hlag0KLUVQRExLdmJkVlVOVUdMdksNCi1FT2NMS3ZiZExHR0hiQlJWDQotRG9Da0t2YmRscXh0eXNFSg0KLUVPY0xLdmJkY1NjTFRkS0INCi1EbmNLanZiZGh0eWR3UnRiDQotRG9Damp2YmRjVENqc2NpYQ0KLURuY0xLdmJkVXNsc2VrdWoNCi1Eb0RLanZiZHd1TkZSWWtuDQotRU9jTEt2YmRpakdIak5ZUw0KLURvQ2pqdmJkSlN5QlNtWU0NCi1Eb0RLanZiZEVZWGxVVHRNDQotRVBES2p2YmRVeUlUektvTw0KLURuYmtLdmJkdkJEeVRQRkkNCi1Eb0RLanZiZFlsUmNzbWttDQotRG9ES2p2YmRkZVBSYlhDag0KLUVQQ2tLdmJkVlpIdFpqb08NCi1FUERMS3ZiZFdYSXhWY2VIDQotRVBDamp2YmR1RERVd1ZvUA0KLURuY0tqdmJkUWx4QnhuVXoNCi1Eb0RMS3ZiZGZwQnp2ZFlJDQotRG9Damp2YmRNSkJsUllBUw0KLUVQQ2tLdmJkWmlzSG9mYWYNCi1EbmJrS3ZiZGtXWE5kQ1h3DQotRU9jS2p2YmRFWVhrc3RUbA0KLUVPY0tqdmJkZmVreW1nSEENCi1FUERLanZiZGVsZldmbGlrDQotRVBDamp2YmRkQ1ROU0FVTg0KLUVQREtqdmJkcGZEZVVWYUkNCi1EbmNMS3ZiZGlCbmJlV3FSDQotRU9iamp2YmRFdXlQb2xqRg0KLUVQQ2tLdmJkUkRjQlFSRVMNCi1EbmNLanZiZGhmaWJ4dWpWDQotRU9ia0t2YmRWcW5ZQmVNRA0KLUVQREtqdmJkSktFQUtRR2QNCi1FT2NMS3ZiZHNRVm9KYnVmDQotRU9jS2p2YmRxY2Rob25WYQ0KLUVPYmpqdmJkSmNLQ3FKY1kNCi1FT2NLanZiZHBmRUVzdWFJDQotRVBETEt2YmR4blRJWVNoYw0KLUVPY0xLdmJkeFZNZHFZbE8NCi1FT2JqanZiZFp5RGltY01TDQotRG5jS2p2YmRpR2pDeHZLVg0KLURvQ2tLdmJkUmJFRWtpWWsNCi1Eb0NqanZiZFdJWVZ4SFl6DQotRVBETEt2YmRZemNGcWpWeQ0KLURuY0xLdmJkVFlMTG16angNCi1Eb0RMS3ZiZHdYTGFWYVdWDQotRG9ETEt2YmRNUnZseXVReg0KLURvQ2pqdmJkYWprZW9OY0ENCi1FUENqanZiZGpFa0hVb0FPDQotRG9Damp2YmRab05pRkZaag0KLURuY0xLdmJkbFpUUnJ5SFUNCi1Eb0NqanZiZGNURExUZEphDQotRU9jTEt2YmRsaGN0UlZTQg0KLUVPYmpqdmJkdWFFWXJvRkkNCi1EbmNLanZiZHpqVXBRRHNVDQotRG9ETEt2YmR5cVBOSWl3QQ0KLURuYmpqdmJkaGtkY25VYnkNCi1FT2JqanZiZFZZZ3Raam9PDQotRG5iamp2YmRDSkxDTEpGag0KLUVQQ2pqdmJkemVabnpkeXANCi1EbmJqanZiZHFseWpaTUlKDQotRU9jTEt2YmRHQW5weUp6bQ0KLURvRExLdmJkTkdjUU1wVkwNCi1EbmNLanZiZEFEU1hpeWlRDQotRG9Damp2YmRMQkxITkNZUg0KLURvQ2tLdmJkdVZuWGpSVEENCi1EbmNLanZiZHRTcXNaWmVEDQotRVBES2p2YmRweU9oR3FFWQ0KLUVPYmpqdmJkRXV5UG9tS0YNCi1FUERLanZiZHlPU2d4VEljDQotRVBES2p2YmRHRmlxbkpUcQ0KLUVPY0tqdmJkeVlKSmJQekwNCi1EbmNMS3ZiZEFEUndqWmlRDQotRG5jTEt2YmRDU2FEVUZ3Uw0KLURvRExLdmJkRXpzcUVrYmkNCi1FT2NMS3ZiZHNzU1RZeWVEDQotRG5ia0t2YmRTQmRFa2laTA0KLUVPYmpqdmJkRldaUVBsaWUNCi1FT2JrS3ZiZGJCVmVGcFB3DQotRG9ETEt2YmRCZFFCVmpNZg0KLUVQRExLdmJkcHRVSFJxanQNCi1FUENrS3ZiZFF3T0RjTUlEDQotRG9ETEt2YmRlbGV2Z01paw0KLURuYmpqdmJkVlRtVUZrdWoNCi1EbmJrS3ZiZExZcUpyenVHDQotRG9Da0t2YmRDVEFic2V2cg0KLURvQ2pqdmJkSnB5ZU9mT0YNCi1FUENrS3ZiZE9TdFdIRXRwDQotRU9jTEt2YmRLVnRmRUVmaQ0KLURvQ2tLdmJkbXVVeWtKcWYNCi1EbmJqanZiZFFaTkFIU3JLDQotRG5iamp2YmRNZ0RQbHBVaw0KLURuYmtLdmJkQ0lrQmpoZksNCi1FT2JqanZiZEJzQkNzZXdTDQotRU9jTEt2YmRZemJmUml2Wg0KLUVPY0xLdmJkcnpNUVNhSG4NCi1FT2NLanZiZFJvc2ZqRmN3DQotRVBES2p2YmRBTkh5VFhaeA0KLUVQQ2tLdmJkbGlEc3B0cWENCi1FT2NMS3ZiZEFDclhpeklwDQotRVBDamp2YmRMRmZJQ0FwdQ0KLURvQ2pqdmJkYkF2RWVwUHcNCi1FT2NLanZiZFRwcVBWVkhtDQotRG9Damp2YmRzQmVtTUdqeQ0KLUVQQ2tLdmJkdWFFWlRQRWgNCi1Eb0NrS3ZiZE9TdFdIRXRwDQotRVBDamp2YmRiQlZlR1FQdw0KLUVPYmpqdmJkT1NzdWZlVXANCi1Eb0NrS3ZiZGpBUUhCUGdLDQotRVBDamp2YmRiQldFZlBvdw0KLUVQREtqdmJkdFNxc1paZGMNCi1FUENrS3ZiZGVnanVxbXBnDQotRG9ETEt2YmRSb3RHaWZEdw0KLURvREtqdmJkbUpFVVF0ckINCi1Eb0NqanZiZGNJbGpLZXdZDQotRU9ia0t2YmRiaU1qS2V3WQ0KLUVPYmpqdmJkY1NjS3NkSmENCi1FUERLanZiZHRTcXNZeWVEDQotRG5ia0t2YmRycFdPakN2Rw0KLUVQRExLdmJkQmlLYkxJZWoNCi1FUENrS3ZiZEJkUGFXSm1HDQotRU9iamp2YmRaUk5FaG1FcQ0KLUVPY0xLdmJkaVV6RldyVWINCi1FUENrS3ZiZG1JZFVRdHJCDQotRVBDa0t2YmRiVWFmeExUaA0KLUVPY0tqdmJkbkNLV3hPbXUNCi1Eb0NrS3ZiZHNaa29zQklPDQotRG5ia0t2YmRIRGp1akNKag0KLURvQ2pqdmJkV1NPWUNGTGMNCi1FUERLanZiZG1KRVRxVlNCDQotRG5iamp2YmRyWFBrY0pZcQ0KLUVPYmtLdmJkTWdEUGxwVkwNCi1EbmJqanZiZFppc0hwR2FmDQotRG9Damp2YmRHR0pxbWlUcQ0KLUVPYmtLdmJkSUhHeXlZWGcNCi1FT2JrS3ZiZHFUc2dSckt0DQotRU9iamp2YmRtSkR0UlZTQg0KLURuYmpqdmJkZGRvU0J2YmoNCi1FUERLanZiZGRlUFNCdmJqDQotRG5iamp2YmRCY3BBdkpsZg0KLURuY0tqdmJkZXp2WWVJdFgNCi1Eb0RLanZiZG1nRXdtTmZ5DQotRU9iamp2YmREaWdpdlhqQQ0KLUVPY0xLdmJkbUpFVVJVckINCi1FT2NMS3ZiZGVQRlRMVHRTDQotRVBES2p2YmRWVG1VR01Wag0KLUVQREtqdmJkbkJpdndublYNCi1FUENqanZiZFpubWhkZHpLDQotRG5jS2p2YmRaZVhmemdpQw0KLURvRExLdmJkRXV5UHBOSmUNCi1Eb0RMS3ZiZHFkRWhwTnVhDQotRG9ES2p2YmRGV1lwUU1pZQ0KLURvQ2tLdmJkTWZjUU1wVkwNCi1FT2NLanZiZG10dHlrS1NHDQotRG5iamp2YmRsaGNzcHVTQg0KLUVQQ2pqdmJkV1NOd2JGTUQNCi1FUERLanZiZFJiRUVsSXlMDQotRU9jS2p2YmR5TnNId3NJYw0KLUVQQ2pqdmJkcnlsUVRBZ24NCi1EbmNMS3ZiZEFEU1lKeWlRDQotRU9jS2p2YmRaalRJUGdCZg0KLUVPYmpqdmJkS0RLRFFpYngNCi1FT2JrS3ZiZEtESmNSSmNZDQotRG9Da0t2YmRtU1pVelNkSg0KLUVQQ2pqdmJkYU5LYXJ0bGcNCi1Eb0RLanZiZElHZ1p5WHdnDQotRU9iamp2YmRhdUNIWGpzaA0KLUVPYmtLdmJkeFVtRXB5TG4NCi1FUENqanZiZE5zVHVnRXRwDQotRVBETEt2YmRaeURpbWJsUw0KLURvREtqdmJkYlVhZ1lLdEkNCi1EbmNLanZiZGxpRVRwdVNCDQotRU9jS2p2YmREaWhLV1hqQQ0KLURuY0tqdmJkWnRJaVpFVE8NCi1FT2JqanZiZHlnWk1BTWVYDQotRG9ES2p2YmRmTkdXZ01paw0KLURvQ2pqdmJkWk1TRVVOa20NCi1FT2NLanZiZHNycXNaWmRjDQotRVBDa0t2YmRBQ3F4SnpKUQ0KLUVQRExLdmJkTmRjc2hpS2QNCi1Eb0RLanZiZHlxT21JaXdBDQotRU9jS2p2YmRSTXdiWW10eg0KLUVPY0tqdmJkWXBtRWhsZVINCi1Eb0RLanZiZGpKZkhpbVlTDQotRG9Damp2YmRyYkZtTUhMWg0KLURvQ2tLdmJkQmNwQldLTkcNCi1Eb0RLanZiZEl4VGJIa3FRDQotRG9ES2p2YmRodVpkd1NVYg0KLUVQRExLdmJkSllVQmdsUXANCi1FUENrS3ZiZHVDY1V3Vm5vDQotRG5ia0t2YmR3dU5FcHlNTw0KLURuY0tqdmJkc3NTU3h6RWMNCi1Eb0RMS3ZiZEdkTFdKYktLDQotRU9iamp2YmRGamRzRElNdQ0KLURuY0xLdmJkZmtHemJmQUUNCi1FT2NMS3ZiZHJSdGtPTEJODQotRVBETEt2YmRhamtmT21jQQ0KLUVQQ2pqdmJkck16SnhraEoNCi1EbmNMS3ZiZHFaT2hIUkVZDQotRG9ES2p2YmRtSkVVUXVTQg0KLURuYmtLdmJkUkRiYVFSRVMNCi1FUENqanZiZHB5UEhnUkVZDQotRG5iamp2YmRNSWFsUXhBUw0KLURuY0xLdmJkaVp1R01ST0cNCi1Eb0RLanZiZGdGa3ltZmdBDQotRG5jTEt2YmRzQ0dNa2dMWg0KLUVPYmtLdmJkUm90SEplY3cNCi1FUERLanZiZGtDbEtwZnRnDQotRVBDa0t2YmRSanlHVWdMVA0KLUVPY0tqdmJkaHVaZHZxdGINCi1FT2NMS3ZiZG10dHpLalNHDQotRU9iamp2YmRobEVkT1ZEWg0KLURvRExLdmJkWmlzSHBHYWYNCi1EbmJrS3ZiZFRxUW50dUhtDQotRVBETEt2YmROZGN0SWlMRQ0KLUVPYmtLdmJkV1JuWGJGTGMNCi1FUERMS3ZiZEtWdGZEZGdKDQotRVBDa0t2YmRKU3lCVE13bA0KLURuYmtLdmJkdVdOeEtRc0ENCi1Eb0NrS3ZiZHFHRUZVVmFJDQotRVBES2p2YmRoa2RjblZEWg0KLUVQQ2pqdmJkeVNuSWxyQmcNCi1FT2NMS3ZiZFlsUmN0TmxODQotRU9ia0t2YmR2QkR4cm9GSQ0KLURvRExLdmJkeHdpSmJQekwNCi1FUENqanZiZHlOc0h4VEpEDQotRG9Damp2YmRoZmpEWXVqVg0KLURvRExLdmJkY0ltS0xGd1kNCi1EbmJqanZiZHF3UU1DaHhxDQotRG5jTEt2YmRhYVdFZlFQdw0KLURuYmtLdmJkVVFxT3VVaE4NCi1FT2NMS3ZiZFVhQ1JTcVNaDQotRG5iamp2YmRSTXhCeU9Veg0KLUVQREtqdmJkS0NqQ3BqQ3gNCi1EbmNMS3ZiZHJNekp5TUlKDQotRVBDamp2YmRPRWRUaGhqZA0KLUVQREtqdmJkclNVa09LYU4NCi1FT2JrS3ZiZE1vd3B1bkdzDQotRG9Damp2YmRoelZHTHBtZg0KLUVPY0xLdmJkYU1rQnNWTWcNCi1Eb0NqanZiZGtJR2tmRm5MDQotRG5ia0t2YmRZcGxkaU5GUg0KLUVQRExLdmJkWnhjak5jTVMNCi1FUERLanZiZEdHS1JuSlVSDQotRVBDamp2YmRiaU5LS2ZXeA0KLUVPYmpqdmJkbVJ5VXlyY2kNCi1EbmNLanZiZExyWE5adHB6DQotRG5jS2p2YmRaalRJUGdDRw0KLURuYmtLdmJkeXBvTklpd0ENCi1FUENqanZiZERpaEtWeEtBDQotRG5jS2p2YmR5ZnhsQU5GWA0KLURvREtqdmJkaU1GRU9WQ3kNCi1FUENrS3ZiZHRjRFV2dlBQDQotRG9Da0t2YmRFdllwUU1pZQ0KLURuYmpqdmJkWkxyRHRPTG0NCi1FUENqanZiZEtRekZQR05lDQotRVBES2p2YmRHZExWakNKag0KLURvREtqdmJkcVlvSGZxRHgNCi1Eb0RMS3ZiZEZWeG9vbUplDQotRG5ia0t2YmRLUlplUEZuRg0KLURvQ2pqdmJkRlZ5UVFNakYNCi1EbmJrS3ZiZFR1bFFKc2FSDQotRU9ia0t2YmRrSGdNRmVuTA0KLURvREtqdmJkVlVNc2VsVmoNCi1FUERMS3ZiZHJEZGhvblZhDQotRG5jS2p2YmRrVnZtY2F4WA0KLURvRExLdmJkclJ1S25MQW0NCi1FT2NLanZiZEpiaWJwakRZDQotRVBES2p2YmRYcmxBbVRvWQ0KLURuYmtLdmJkWmlyaFFHYkcNCi1EbmJqanZiZGpnZmtmRm5MDQotRU9jS2p2YmRHRmpTT0pUcQ0KLURvREtqdmJkU0NEZU1KWWsNCi1Eb0NrS3ZiZHBlY2R0V0FoDQotRU9iamp2YmR6ZVpuemR5cA0KLURvQ2pqdmJkTUpCbFF4QVMNCi1FUERLanZiZG5CaXZ3bm11DQotRG9ES2p2YmRSYWRFbEl5TA0KLURvRExLdmJkc1psUHNCSG4NCi1FT2JqanZiZHpub3BlREx4DQotRU9jTEt2YmRDSktiS2lGag0KLURuY0xLdmJkbWdFeE5OZnkNCi1EbmJrS3ZiZG5Qell2S3hiDQotRG5jS2p2YmRyRGRpUG5WYQ0KLURvQ2pqdmJkQU1neHJ3WngNCi1EbmNMS3ZiZFRmem1rd1dGDQotRG5jS2p2YmRxaUFKZGxvRg0KLUVQQ2tLdmJkd3VNZVJaTG4NCi1Eb0NqanZiZFZVTlVGa3VqDQotRG9ETEt2YmRLUXllUEdOZQ0KLURuY0tqdmJkTHF2bHpWUXoNCi1Eb0RLanZiZG1nRllOTmdaDQotRG5iamp2YmRkeFp0VHJGeg0KLUVPYmtLdmJkcVRzZ1NTS3QNCi1EbmJrS3ZiZFp4Y2ltY01TDQotRG9Damp2YmRBTkh5U3Z5eA0KLURvRExLdmJkWlFtRkpNZHENCi1Eb0NrS3ZiZEhEanVqQmlqDQotRVBETEt2YmRzUHVvSmJ1Zg0KLUVQQ2pqdmJkWXBtRWhtRlINCi1EbmNMS3ZiZFpqVEhwR2FmDQotRVBES2p2YmRFdXlRUU5LRg0KLURvQ2tLdmJkbWJLV3hQTnUNCi1Eb0NrS3ZiZFJqeUZ0ZmpzDQotRG9Da0t2YmRpaWZIak5ZUw0KLUVQREtqdmJkcHlPaEdwZFkNCi1Eb0RLanZiZFVWbFBpdEJSDQotRG9Damp2YmRFS0lKdXdqQQ0KLUVQQ2pqdmJkRmtGVERIbVYNCi1FT2NMS3ZiZHlTbkpOU0NIDQotRG5jTEt2YmRScFVISmVkWA0KLUVQREtqdmJkdHZPWUpwc0ENCi1Eb0RLanZiZEtES0RRakN4DQotRG9ETEt2YmRhTWtDVFVtSA0KLUVPY0tqdmJkTXBZUlZuR3MNCi1FT2NLanZiZHRTcXNZekZEDQotRG5jTEt2YmRLYUtnTkNYcQ0KLURvQ2tLdmJkc0NGbGxHa1oNCi1FT2JrS3ZiZE5yc3ZHZVVwDQotRG9ES2p2YmRtYWl2eE9uVg0KLUVPY0xLdmJkT0VjdEloamQNCi1Eb0NrS3ZiZGVtR1hHbGpMDQotRG9ETEt2YmRqdldtZEJ4WA0KLUVQQ2tLdmJkQ0lqYkxJZWoNCi1FUENqanZiZGtIZmtmRm1rDQotRG9ETEt2YmR3eklHRndkcg0KLUVPY0tqdmJkZEJybHJBVU4NCi1FUENrS3ZiZEp1dGVjZGdKDQotRG9Damp2YmRXUm13YWVMYw0KLURuYmtLdmJkaVZaZHdSdUMNCi1EbmJqanZiZEdMRXNESG1WDQotRVBDa0t2YmR4c09KTlNDSA0KLUVQQ2pqdmJkSXd0QmdrcVENCi1EbmNLanZiZGJyYmp0RGpCDQotRVBDa0t2YmRqaEdrZWVtaw0KLURuY0tqdmJkV1dpWHZEZUgNCi1FUENqanZiZG5VdHpLaXFmDQotRG5jS2p2YmRUdWtvaXRBcQ0KLURuY0xLdmJkQ0lrQmpoZksNCi1Eb0NrS3ZiZGhnS0RaV0p1DQotRVBES2p2YmRCaGtCamlGag0KLURuYmpqdmJkTWZicE5QdGsNCi1Eb0RLanZiZG5Cald4UE9WDQotRG9Damp2YmRFSmhLV1lLQQ0KLUVPY0tqdmJkVHBxT3R1SG0NCi1Eb0NqanZiZHd6SUZmWGRyDQotRU9jS2p2YmRycFZvS0RWZg0KLUVPY0xLdmJkRVlZTHRUc2wNCi1Eb0NrS3ZiZExGZklDQlF1DQotRU9jS2p2YmRlWHpUc3JGeg0KLUVPY0xLdmJkU1FVSEtGZFgNCi1FT2NMS3ZiZHJhZW1NSExaDQotRVBES2p2YmRrSUdsRmVtaw0KLURuY0tqdmJkT1lPdXpjblUNCi1Eb0NrS3ZiZEl3dENJTHBwDQotRG5jTEt2YmRab05pRWR6Sw0KLURvREtqdmJkc3Jxc1paZUQNCi1FUERMS3ZiZHpHeU1BTkV3DQotRG5jTEt2YmRCcmFDc2V3Uw0KLUVPYmtLdmJkcHlPZ2ZwY3gNCi1EbmJqanZiZHhtcmd4VEljDQotRU9jTEt2YmRaalNncEhDRw0KLUVQQ2pqdmJkcldwTURJeHENCi1EbmNLanZiZFp0Skl5RVNuDQotRVBDamp2YmRKU3hhU21YbA0KLURvQ2pqdmJkaU1GRU9WQ3kNCi1Eb0NqanZiZER3d2xUc3RNDQotRG5jTEt2YmRKWVVDSGtwcA0KLUVQRExLdmJkc3JyU3h6RkQNCi1FT2JqanZiZGtIZ01GZk5rDQotRVBES2p2YmRPU3RWZ0ZVcA0KLURuYmpqdmJkamhITUdHT0wNCi1EbmJqanZiZFp5RUptY0xyDQotRVBES2p2YmREaWhLV1lLQQ0KLURuY0xLdmJkUm9zZmllY3cNCi1Eb0NqanZiZHlUTmhtU0NIDQotRG5ia0t2YmRGZWlyTmhzcQ0KLURvREtqdmJkckRlSXBOdkINCi1FT2JrS3ZiZFZBYXFUUlNaDQotRVBETEt2YmRMQWtHbGJYcQ0KLUVPY0tqdmJkVkFhcHJxUnkNCi1FUERMS3ZiZGZJS3ZSblFnDQotRVBDamp2YmRVUXBvVlVnbQ0KLUVPYmpqdmJkeFZORXB5TU8NCi1FT2NLanZiZHNDRmxsR2taDQotRG5jS2p2YmRzQmVsa2dMWg0KLURvRExLdmJkdmx2QU5EZU4NCi1Eb0NqanZiZG5CaXZ3b051DQotRU9iamp2YmRzQ0dNa2dMWg0KLUVPYmpqdmJkc1B2UEpidkcNCi1FUERMS3ZiZHhybkltUmJIDQotRVBETEt2YmROUHhSVm5IVA0KLURvRExLdmJkTXRycWtOQVgNCi1Eb0RLanZiZGlHaWNaV0p1DQotRVBES2p2YmRPRkVVSkpMRQ0KLUVQRExLdmJkb0FLenNoRG4NCi1Eb0RLanZiZGVoS3ZSblFnDQotRU9iamp2YmRMTEJJV0FLWg0KLUVQREtqdmJkZU9kc0xVVVMNCi1EbmNLanZiZGp2V21kQnhYDQotRG5jTEt2YmRlenV5RkpUdw0KLUVQQ2tLdmJkTlB3cHVtZ1QNCi1FUENqanZiZGt4c1JyeGdVDQotRVBETEt2YmRwdFVIU1NMVQ0KLUVQREtqdmJkZUFUcU5YaWYNCi1FUENrS3ZiZGpsYWt6RWdQDQotRU9iamp2YmR5WGlLQ1B6TA0KLURvQ2pqdmJkaGxGRG11RFoNCi1EbmNLanZiZGF1Q0d4TFVJDQotRU9iamp2YmR5U21pTlNCZw0KLUVPY0xLdmJkZk5HV2ZsakwNCi1EbmNMS3ZiZFZ2aVlXRGRnDQotRVBDa0t2YmRrSUhMZWZPTA0KLUVQRExLdmJkUk5ZQ1pOdHoNCi1Eb0RMS3ZiZG1mZHhOT0d5DQotRG9ETEt2YmRjU2NLdERqQg0KLUVPY0xLdmJkRVBETEt2Y0UNCi1FUENqanZiZFVhQnBycVNaDQotRU9ia0t2YmRkZG5xYlhESw0KLUVQQ2tLdmJkYWFWZUdRUVgNCi1Eb0RMS3ZiZHVvVHpxS250DQotRG5iamp2YmRxd1BrYmh4cQ0KLUVPYmtLdmJkdWFFWlRPZGgNCi1FT2NMS3ZiZEtmRmhCYVJWDQotRU9jS2p2YmRWWWd0WmpvTw0KLUVPY0xLdmJkclNWS25LYU4NCi1EbmJrS3ZiZHNDRm1NR2p5DQotRG5ia0t2YmRTTFlldUdrVA0KLURvQ2tLdmJkd1dsQXZBdXUNCi1FUENqanZiZFJYT0VDbElEDQotRVBDa0t2YmRDSWtDS2lGag0KLUVPY0tqdmJkR2NrVmlhaksNCi1Eb0NrS3ZiZHpucFJGQ2t4DQotRG5iamp2YmR4S3dEZ3p5Zg0KLURuY0tqdmJkVkFhcHJwcloNCi1Eb0RLanZiZE9FY3RJaGpkDQotRU9iamp2YmRtSWRUcHRxYQ0KLURuYmpqdmJkdndNQXVhV1YNCi1FT2JrS3ZiZEVZWGtzc3NsDQotRVBDa0t2YmRpWnRlbFFuRw0KLUVPY0tqdmJkcWRFaHBPVmENCi1EbmJqanZiZGlkamZ1UEFPDQotRG5ia0t2YmRuQml2eFBOdQ0KLUVPYmtLdmJkclNWS21rQk4NCi1EbmJrS3ZiZGlDUERGV3FSDQotRG5jS2p2YmRaaXNIb2ZhZg0KLURvQ2pqdmJkSnZWRmNkZmkNCi1Eb0RMS3ZiZGN5eHBZWXBiDQotRG9Damp2YmRyeWtwVEJIbg0KLUVQRExLdmJkcXJVa09LYU4NCi1Eb0NrS3ZiZEdRQVRXZ0Z5DQotRG5jS2p2YmR1YUR4c1BGSQ0KLUVQQ2tLdmJkWWtxZFRuTG0NCi1FT2JqanZiZFFZbUFHc1JqDQotRG5ia0t2YmRaeUVLT0Nrcg0KLURuYmtLdmJkT0VkVGhoamQNCi1FUERLanZiZGlDT2NGV3BxDQotRU9jS2p2YmRNZmNRTlB0aw0KLUVQRExLdmJkTEdGaEJhUlYNCi1FUERMS3ZiZHNzU1N5WmVEDQotRVBDa0t2YmRUQUZKSUJvRQ0KLUVPYmtLdmJkZUZQUmF2YmoNCi1EbmJrS3ZiZGpLRmhLTllTDQotRG5jTEt2YmRDSkxCamlHSw0KLURuY0xLdmJkcWx6SnlMaEoNCi1FT2NMS3ZiZFJ5aWdzQ3ZBDQotRG9ES2p2YmRZcU1kaGxkcQ0KLURuYmpqdmJkZWhLdlNPUWcNCi1FT2JqanZiZE1nQ29sb3VMDQotRG9Da0t2YmRlaEt1cW5SSA0KLURvREtqdmJkUXZtZENraEQNCi1Eb0RLanZiZE1TV2x6VlF6DQotRU9ia0t2YmRiaGxpa0dYWQ0KLURvQ2pqdmJkZUFVUW1ZSmYNCi1FUENqanZiZFp5RUptY01TDQotRG9ES2p2YmRJR2Z6WXhZSA0KLURvRExLdmJkSERqdkpiSmoNCi1FT2NLanZiZFF3TmRDa2djDQotRVBDa0t2YmRSV25EY01IYw0KLURuYmpqdmJkck16SnlNSUoNCi1EbmNLanZiZGxoY3RRdVNCDQotRG9ES2p2YmRiUGdHZEx6ZA0KLUVPYmtLdmJkaWpGaEptWHINCi1Eb0NqanZiZGJRR2dEa3pkDQotRVBETEt2YmREaWhKdlhqQQ0KLUVPYmpqdmJkYU5LYXNVbUgNCi1EbmNLanZiZFp5RUtPQ2xTDQotRG5iamp2YmRTTFlmVkhMVA0KLURvRExLdmJkd3pIZkZ3ZVMNCi1FUENqanZiZGZORndITkprDQotRG9ETEt2YmRlbGV3SE5Kaw0KLUVQQ2pqdmJkdWFEeHJvRWgNCi1Eb0RLanZiZGR3eXRVUmV6DQotRG5jS2p2YmR3dG1FcHlMbg0KLUVPY0xLdmJkQ0lrQmtJZWoNCi1FT2NMS3ZiZGlMZGRPVWNaDQotRVBES2p2YmRpVXlkd1NWQw0KLURuY0tqdmJkckVFaVFPVmENCi1EbmJrS3ZiZFl6YmVxaXZaDQotRG9Damp2YmRrVndPRUNZWA0KLURvRExLdmJkWkxxY3Nta20NCi1FT2JqanZiZFZZZ3Raa1BPDQotRU9jTEt2YmRIZmZ5eHd3Zw0KLUVQREtqdmJkY0lsakxHV3gNCi1EbmJrS3ZiZE1wWHB2TmZzDQotRU9jTEt2YmRGZWlyT0pUcQ0KLURuY0xLdmJkV1doeFdFRkgNCi1Eb0NqanZiZFpSTWRobUVxDQotRG5ia0t2YmRVTHZQQldQSg0KLUVQRExLdmJkWlJNZGlNZHENCi1EbmJqanZiZFRZTE1OemtZDQotRG9Da0t2YmRaeGNqTmJsUw0KLURvQ2tLdmJkS0NpYnBpY1kNCi1FUERMS3ZiZGRvRlRLdFVTDQotRG5jTEt2YmRjSW1LTEdYWQ0KLUVPY0tqdmJkS2FMR21Cd3ENCi1FUENrS3ZiZG5IRllNbkd5DQotRVBES2p2YmRVUXFQVXVJTg0KLUVQREtqdmJkZUFVUk5ZSmYNCi1Eb0NrS3ZiZHh3aUtDUVprDQotRG5ia0t2YmRLVnVHRGVHaQ0KLUVQREtqdmJkcm92T2ljVmYNCi1Eb0RMS3ZiZHJ5bFFTYUhuDQotRU9jTEt2YmR5U21obHJCZw0KLUVPY0xLdmJkTnJzdWZlVlENCi1FT2NLanZiZHpvUVJFYmxZDQotRVBDa0t2YmR6YUFPZ0hDTQ0KLURvQ2pqdmJkWkxxZFRta20NCi1FT2JrS3ZiZE5HYnBOUVVrDQotRU9jS2p2YmRac2hpWWRTbg0KLUVQRExLdmJkRG5jTEt2YmQNCi1FT2NLanZiZHFsekp5TUhpDQotRG9Da0t2YmRCaGtDS2lGag0KLUVPY0xLdmJkUmFjZUxoeUwNCi1FUERMS3ZiZHhzTmlOUmJIDQotRG9ES2p2YmR0Y0N0d1dPbw0KLURuYmpqdmJkbWZkd2xuR3kNCi1EbmNLanZiZFJFREJRUWRTDQotRG5jTEt2YmRuUHpZdkt4Yg0KLUVQQ2pqdmJkamdma2VmTmsNCi1EbmJrS3ZiZG5VdHlrSnJHDQotRVBES2p2YmRTQ0VGTGlZaw0KLUVPY0xLdmJkR2NqdWlhaksNCi1FUENqanZiZEpZVUNIbFJRDQotRVBETEt2YmRZcGxlSWxkcQ0KLUVPYmtLdmJkZk1mV2ZsaWsNCi1EbmNMS3ZiZHd1TWRweUxuDQotRG9ETEt2YmRFUERMTFdjRQ0KLURvRExLdmJkWkxyRHRPTG0NCi1Eb0NrS3ZiZGRaeG94WXFDDQotRG5jTEt2YmRUdWxRS1VBcQ0KLURuY0tqdmJkcXJVam5LYU4NCi1Eb0NrS3ZiZEdGalJtaVRxDQotRVBDamp2YmRwc3NmclJrVQ0KLUVQREtqdmJkclhRTGJpWXENCi1Eb0NrS3ZiZE5RWVF1bkhUDQotRG9Da0t2YmROcnRXSEV1UQ0KLURuY0xLdmJkamdmbEdHTmsNCi1EbmNLanZiZEJzQkNzZXdTDQotRG9Da0t2YmRNcFlSVm1mcw0KLURuYmtLdmJkS2ZGaEJhUXUNCi1FT2JrS3ZiZEdjanVpYWlqDQotRU9ia0t2YmRha01HT25EQQ0KLURuYmtLdmJkRnlVdUFjeEMNCi1EbmJrS3ZiZHRTclRaWmRjDQotRVBDamp2YmRhdGFmeExUaA0KLUVQQ2tLdmJkVUd6bWxYVmUNCi1FT2JrS3ZiZFp5RGluQ2xTDQotRG5jS2p2YmR5emRuU0lKSQ0KLURuYmtLdmJkblB5eHVrWkMNCi1Eb0RLanZiZGtETUxRZ1ZIDQotRU9iamp2YmRiVkJmd2p0SQ0KLUVQRExLdmJkelJQTWhpd0ENCi1FT2JrS3ZiZGhrZURtdUN5DQotRG5ia0t2YmRaUWxlSW1FcQ0KLUVPYmpqdmJkckRlSlBuVmENCi1FUERMS3ZiZGFOTEJzVk1nDQotRG5ia0t2YmRPRWN0SWhqZA0KLUVPY0tqdmJkYXRhZ1hrVUkNCi1EbmNLanZiZE1vd3B1bkdzDQotRU9ia0t2YmR0dk53aXFUQQ0KLURuYmpqdmJkeXpkblNIaUkNCi1FT2JrS3ZiZGJobGlrRnZ4DQotRU9jS2p2YmRhTkthcnVOSA0KLURuYmtLdmJkaVZaZHZxdGINCi1FT2JrS3ZiZFZZZ3N6S29PDQotRG9Da0t2YmRqSmZJS013cg0KLURuY0xLdmJkZXp2WkZKVHcNCi1FT2JrS3ZiZGN5eG94WXFDDQotRVBETEt2YmRGZWpTTmlUcQ0KLURuY0tqdmJkSXdzYklNUXANCi1EbmJqanZiZFR1a3BKc2FSDQotRVBETEt2YmRJc1pBcmx4TQ0KLUVQREtqdmJkVEFFaGdhbmQNCi1FT2NMS3ZiZGZOR1hITWlrDQotRG9ES2p2YmRqY01MUWdVZw0KLURuY0tqdmJkU0xZZlZIS3MNCi1Eb0NqanZiZG5Cald3b09WDQotRVBDamp2YmRuQmpXd25uVg0KLUVPYmtLdmJkUXZtY2NMZ2MNCi1FUERLanZiZHd1TWVSWWxPDQotRG9ES2p2YmROZGRVSklqZA0KLURvQ2tLdmJkcVVUZ1NSa1UNCi1Eb0RMS3ZiZGVoTFZxbXBnDQotRG9ETEt2YmRyb3ZPakN2Rw0KLUVPYmpqdmJkem9QcGRjTVkNCi1FUERMS3ZiZFpSTkZJbGVSDQotRG5ia0t2YmRTTFpHVkdqcw0KLURvQ2tLdmJkeVNtaU1yQmcNCi1EbmJrS3ZiZHd5aEZmWGVTDQotRG9ETEt2YmRXSHd2WUhZeg0KLURvQ2pqdmJkSUhIWnlZWUgNCi1FT2JqanZiZEpTeUFybVhsDQotRG5jS2p2YmRBQ3F4SnlpUQ0KLURuY0xLdmJkbXBaeHVqeUMNCi1Eb0NqanZiZEZrRlNjSU5WDQotRVBETEt2YmRDRHBBdWpORw0KLURuYmtLdmJkaGtlRG5VYnkNCi1EbmNMS3ZiZEZXWW9wTkplDQotRG9Damp2YmRMQWpmbUNZUg0KLUVQQ2pqdmJkeHJtaU1yQ0gNCi1FT2JqanZiZGNJbUprR1d4DQotRG9Damp2YmRGZWpSbkpUcQ0KLUVPYmtLdmJkWVRNQWxzbngNCi1FUENqanZiZHNQdk9pYnVmDQotRU9iamp2YmROZURzaGhqZA0KLUVPY0xLdmJkQmlLYkxJZWoNCi1FT2JrS3ZiZGF1Q0d4TFRoDQotRVBES2p2YmRiQldFZXBRWA0KLUVQQ2tLdmJkVnJOeEJkbEQNCi1FT2JqanZiZE1JYWxSWUFTDQotRU9jS2p2YmRKY0tDcGpDeA0KLUVPY0xLdmJkTHF3Tlp0cHoNCi1Eb0NrS3ZiZFppc0hvZ0JmDQotRG5iamp2YmRFUERLanZiZA0KLURvRExLdmJkRldaUVFOSmUNCi1FT2JrS3ZiZEhnR3pZd3hIDQotRU9jS2p2YmRqYmtrUWZ1SA0KLURuYmpqdmJkdGt4WEF0QlgNCi1FUERMS3ZiZExBa0hOQ1hxDQotRU9jTEt2YmRXV2h4VmRGSA0KLURuY0xLdmJkQ1d6ZEllUVcNCi1Eb0RMS3ZiZFZ2aHd2RGRnDQotRU9iamp2YmRwZkRlVVdBaA0KLUVPY0xLdmJkcW1aaXhraEoNCi1EbmNLanZiZHl6ZG1ySUpJDQotRG5jTEt2YmRScFRnSmVjdw0KLURvRExLdmJkR0ZqU09Jc3ENCi1FT2NLanZiZHd1TkZReUxuDQotRG5iamp2YmRJc1pBc013bA0KLURuY0tqdmJkcHRUZ1Jxa1UNCi1EbmNLanZiZFpRbUVpTkVxDQotRG5ia0t2YmRhdUNIWUxUaA0KLUVQRExLdmJkeXpkbXJIaGgNCi1FUENqanZiZFpvT0pGRXlqDQotRU9jTEt2YmRVUXFPdHRnbQ0KLURvQ2pqdmJkUk5ZQ1pOdHoNCi1FUERLanZiZHJSdGtPTEJODQotRG5jTEt2YmRtYWpXeE9tdQ0KLUVQRExLdmJkTEJMSE1iWHENCi1Eb0RMS3ZiZENJamFqaGZLDQotRU9iamp2YmRZa3JEdE9NTg0KLUVPY0xLdmJkVXROVUdNVmoNCi1FT2JqanZiZGFTRmNIc2VrDQotRG5ia0t2YmRYcmthTXRQWQ0KLURvQ2tLdmJkWlFtRkltRlINCi1FT2NMS3ZiZGNKTWlqZXdZDQotRVBETEt2YmRHTEVyYmhOVg0KLURuYmtLdmJkaVV5ZHdTVkMNCi1FUERMS3ZiZGRuZHNLc3NyDQotRG9ETEt2YmR4d2hqQ1B6TA0KLURvQ2tLdmJkeFZNZVF4a24NCi1EbmNLanZiZGlCb0Nkd1JSDQotRVBETEt2YmRuUHl5VmtaQw0KLUVQQ2pqdmJkbXVVekxLUmYNCi1Eb0RMS3ZiZFNRVUdpZWN3DQotRG9ES2p2YmRSYkRkbEpaTA0KLURuY0tqdmJkcXJWS25MQW0NCi1Eb0RLanZiZFZCQ1FzUXJaDQotRG9ES2p2YmRtYktXeFBOdQ0KLUVPYmpqdmJkRlZ5UVBtS0YNCi1EbmJqanZiZGlpZWhKbHhTDQotRU9jS2p2YmRJcnhhU21ZTQ0KLUVPY0tqdmJkc1prb3NBZ24NCi1FT2NMS3ZiZG5DS1d4UE9WDQotRVBETEt2YmRLV1VlY2RmaQ0KLURuY0xLdmJkaGdLRFpXS1YNCi1FUERMS3ZiZHlTbkltU0NIDQotRU9ia0t2YmRKS0VBS1FHZA0KLUVPY0xLdmJkWk1TRVRta20NCi1Eb0NqanZiZGhnSmNZdWpWDQotRU9jTEt2YmRlaExWcW1wZw0KLURvQ2tLdmJkZXp1eUZJdFgNCi1EbmNMS3ZiZHZCRHhzT2VJDQotRU9ia0t2YmRUdWxQaXNhUg0KLURuYmtLdmJkYWprZlBPREENCi1Eb0RLanZiZFlrckVVT0xtDQotRVBDa0t2YmRmSUt2U05wZw0KLUVQQ2tLdmJkaUJuY0V3UXENCi1FT2NLanZiZEtXVWVjZGdKDQotRU9ia0t2YmRZbFJjc21rbQ0KLUVQQ2pqdmJkZHd6VVRxZXoNCi1EbmJqanZiZGVZWnN0UmV6DQotRVBETEt2YmR4Vk5FcVpMbg0KLURuY0xLdmJkRmplU2NJTlYNCi1FT2JqanZiZHhVbGVReGtuDQotRG5jS2p2YmRLV1VmRGRmaQ0KLURvRExLdmJkc3NScnh6RWMNCi1FT2JqanZiZFJwVUdpZWRYDQotRU9jTEt2YmRaUWxlSk1kcQ0KLURuYmtLdmJkcWRGSXBOdWENCi1FUENqanZiZFl6YmVyS1daDQotRG9ES2p2YmR4eElqQm95aw0KLUVPY0xLdmJkRU9ia0t3REUNCi1Eb0RMS3ZiZHFxdUxOamFODQotRG5jS2p2YmR3dU5GUlpMbg0KLURvQ2pqdmJkcVVUZ1JyS3QNCi1FT2JrS3ZiZFZ3SXd2RGVIDQotRG5ia0t2YmRWd0pZV0VFZw0KLURuYmpqdmJkWWxTRVRuTU4NCi1EbmJrS3ZiZHFUc2dScWp0DQotRG9ES2p2YmRpR2ljWlZqVg0KLURuYmpqdmJkeG5USHhUSkQNCi1FT2JrS3ZiZHFVVGZyU0t0DQotRG9Da0t2YmRGeVZWQkVYYg0KLUVPY0tqdmJkcUdEZHN2QWgNCi1FUENrS3ZiZFRrdW5hVm5pDQotRU9ia0t2YmRNUnZselZReg0KLUVQREtqdmJkRG5jS2tXYmQNCi1FT2JqanZiZHFxdGtOa0JODQotRG5jTEt2YmRmSGtXUm5SSA0KLURuYmpqdmJkaUxkY25VYnkNCi1FT2NLanZiZFZZZ3N5am5uDQotRVBDamp2YmRVdE5UZk1XSw0KLUVQREtqdmJkcVlvSGdSRVkNCi1EbmNLanZiZEdaVXVBZFlDDQotRG5iamp2YmREbmJqandERQ0KLUVPY0tqdmJkVHFRbnR0aE4NCi1FT2NMS3ZiZFV5SVR6TFBPDQotRU9jTEt2YmRqYmxMUkhWSA0KLURvQ2tLdmJkTEdGaENCUXUNCi1EbmNMS3ZiZGxpRVVRdVNCDQotRU9ia0t2YmRSYWNka2laTA0KLUVPY0xLdmJkYVNGY0h0RmsNCi1Eb0RLanZiZEpZVGFoTHBwDQotRVBETEt2YmRVUXFPdVZJTg0KLUVQQ2pqdmJkcW1aallraEoNCi1Eb0NrS3ZiZFJqeUdVZ0tzDQotRU9iamp2YmR5TnJoWVNpRA0KLUVQQ2tLdmJkQmhrQ0tpRmoNCi1FT2JqanZiZFlsU0R0T0xtDQotRG9Damp2YmRUQUZJaEJvRQ0KLURuY0tqdmJkTmRjdEpJamQNCi1Eb0RMS3ZiZEdkS3ZKYWlqDQotRU9iamp2YmRKcHlkbmZOZQ0KLUVQRExLdmJkQ0RwQXZLTkcNCi1Eb0RMS3ZiZGVFb1JhdmJqDQotRG9Da0t2YmRkb0ZTanNzcg0KLUVQQ2pqdmJkcVlvSGZxRVkNCi1FUENrS3ZiZEZrRlNjSG1WDQotRU9iamp2YmRjeXlRWVpSQw0KLURvREtqdmJkeXpkbXJIaGgNCi1Eb0RLanZiZFVXTG9qVUFxDQotRU9ia0t2YmRpQ1BDZHdSUg0KLURvQ2tLdmJkQ1RCRFRldnINCi1FT2NLanZiZExBa0dsYlhxDQotRVBES2p2YmRjeXlRWHlSQw0KLUVQRExLdmJkeU5zSHhTaUQNCi1FUERLanZiZHFVVGdSckt0DQotRG9ES2p2YmRKdXVGZEVmaQ0KLURvRExLdmJkRVh3a3RUdE0NCi1FT2JrS3ZiZGVKaXJWdHpuDQotRU9iamp2YmRZVE1CTXNueA0KLURuYmtLdmJkTlFYcHVtZnMNCi1FUERMS3ZiZHppdG9wRHJ0DQotRG5jTEt2YmREeFhsVVVVTQ0KLUVPY0tqdmJkQURTWGl5aHANCi1Eb0NqanZiZHFUc2dTU0t0DQotRG9Da0t2YmRadEloeGRUTw0KLUVPY0tqdmJkVXlIdFpqbm4NCi1FUERMS3ZiZGNTYmtUZEtCDQotRG5jTEt2YmR4WmdmR1lFcg0KLURuY0tqdmJkZUFUcGx4SmYNCi1Eb0RMS3ZiZG5DSndYbm11DQotRG5ia0t2YmRiS2xGbm5EQQ0KLURvQ2tLdmJkckRlSXBOdWENCi1FUENqanZiZG10dHpLaXJHDQotRG9ES2p2YmRicmJrVURqQg0KLURuYmtLdmJkZFp4b3haUkMNCi1FT2JrS3ZiZGhnS0RaV0tWDQotRG5iamp2YmRHRmlxbWh0Ug0KLUVQREtqdmJkVUx2T2FXUEoNCi1FT2NMS3ZiZHlnWWxBTkZYDQotRG5iamp2YmRJSEd6WllZSA0KLUVPY0tqdmJkaGtlRU51Q3kNCi1FT2NMS3ZiZE5kZFRpSkxFDQotRU9iamp2YmRHRmlxbkpVUg0KLUVPY0xLdmJkanZXbkVCeFgNCi1FUENqanZiZFZCQ1JUUlNaDQotRG5jS2p2YmRWQkNSVFJTWg0KLUVPYmtLdmJkQmRRQXZKbGYNCi1FT2JrS3ZiZEpZVUNIa3BwDQotRU9jS2p2YmRHY2tWakNKag0KLUVPYmtLdmJkQnNBY1VHV3INCi1Eb0RMS3ZiZEl4VUJoTVFwDQotRG9ES2p2YmRNZ0RRTlB0aw0KLUVPY0xLdmJkSEVLdWpDS0sNCi1Eb0NqanZiZExoYWxReEFTDQotRU9ia0t2YmRVTHVvQlZvSg0KLUVQREtqdmJkaGZqRFpWalYNCi1Eb0NrS3ZiZEtESmJxSmJ4DQotRG9Da0t2YmRiS2xHUE5jQQ0KLURuY0tqdmJkcnBWbmljV0cNCi1FUERLanZiZHZBZFpTbmVJDQotRG5ia0t2YmRGeVZVYUVZQw0KLUVPY0tqdmJkSERqdWliSmoNCi1EbmJqanZiZGJpTWpMRnZ4DQotRVBDamp2YmRVc2x0R0x2Sw0KLURvQ2pqdmJka05Ca3pFZ1ANCi1EbmNMS3ZiZEZ4dHVCRVlDDQotRU9jS2p2YmRuQmpXeFBOdQ0KLURuYmtLdmJkcVVUZnJSanQNCi1FUENqanZiZFpIWEVBUFNpDQotRG9Damp2YmR4eEpKYXBaaw0KLURuY0tqdmJkWnlEaW1jTHINCi1EbmJqanZiZGlCbmJlV3BxDQotRU9iamp2YmRqYmtrUWZ0Zw0KLUVPYmpqdmJkcXZva2JoeVINCi1FT2NMS3ZiZGVZWnRUckZ6DQotRVBDa0t2YmRMcXZtWnRweg0KLURvREtqdmJkTmVEc2lJamQNCi1FUENrS3ZiZGVYeXN0UmV6DQotRU9jS2p2YmRBTWhaU3Z6WQ0KLUVQQ2pqdmJkU3drTU56a1kNCi1Eb0RLanZiZHRsWVhBdEJYDQotRVBDamp2YmRCdnpkSWRvdg0KLURvRExLdmJkVkJCcVNxUnkNCi1FT2NMS3ZiZFR2TVFLVUFxDQotRU9jTEt2YmR4Vk1lUXlNTw0KLUVQRExLdmJkQnNBYnRHV3INCi1Eb0NrS3ZiZEtlZkhhYVJWDQotRG5jTEt2YmRDVEJEVGV3Uw0KLUVQQ2pqdmJkVEl5alJBQWwNCi1Eb0RLanZiZGt4c1NTeGZ0DQotRU9iamp2YmRqdlhPRUNYdw0KLUVQREtqdmJkVlRsc2ZMdksNCi1FT2NLanZiZGpKZkhqTlhyDQotRU9iamp2YmRmTWZXZmxpaw0KLURuYmtLdmJkWXFORkltRXENCi1Eb0RMS3ZiZGNKTWlrRnZ4DQotRG9Da0t2YmRyWFBsREl5Ug0KLUVPYmpqdmJkZU9kc0xUdFMNCi1EbmNMS3ZiZEpTeUFybVhsDQotRU9iamp2YmRrTkJsWmVIUA0KLUVPYmtLdmJkZkhrVnFuUkgNCi1EbmNMS3ZiZEtDakNxS0RZDQotRG9ETEt2YmRVeUhzeWtPbg0KLURuY0tqdmJkV1dpWVdFRWcNCi1FUENrS3ZiZEtXVkZkRWZpDQotRU9ia0t2YmRGcEFUV2dGeQ0KLUVPY0tqdmJkcnpMcFRBZ24NCi1FUENqanZiZGh1WmVXclZDDQotRVBDa0t2YmRyYWVsbEdqeQ0KLURuY0xLdmJkR0tlVENnbVYNCi1Eb0RMS3ZiZENFUUF2SmxmDQotRG9ETEt2YmRKdlVmRUZHaQ0KLUVPY0tqdmJkSERrVmpDSmoNCi1FUENqanZiZFp4ZEpuQ2xTDQotRG9Damp2YmRjSW1KamV3WQ0KLURvRExLdmJka0RNTFJIVWcNCi1Eb0RMS3ZiZHFaT2dnUkVZDQotRG9Da0t2YmRrTWFreWVIUA0KLURvQ2tLdmJkRXZZcFBtSmUNCi1EbmNMS3ZiZEpKZEFKcEhFDQotRG9ES2p2YmRFUENqa1hDZA0KLURuYmpqdmJkbEFtT21BTEENCi1Eb0RMS3ZiZHNCZk5MZ0xaDQotRG5jTEt2YmRLeVFqU3p1Rw0KLUVQRExLdmJkZUFVUk14SmYNCi1FUENqanZiZGtIZmxHR09MDQotRU9jS2p2YmRFdXhwUGxpZQ0KLURuY0tqdmJkY3l5UHhZcUMNCi1Eb0NrS3ZiZFJEYmFQcUVTDQotRG5jTEt2YmRhYVZlRnBRWA0KLUVPY0xLdmJkTXVUU0xOQVgNCi1FUENrS3ZiZGJpTWpLZld4DQotRU9jS2p2YmRTQ0VFa2laTA0KLURuY0tqdmJkYmhtSmtHV3gNCi1EbmNLanZiZFdYSllWY2RnDQotRU9jTEt2YmR2QkR4cm5kaA0KLURvQ2tLdmJkQ0VRQlZqTkcNCi1FUERMS3ZiZHhVbUZReU1PDQotRG5ia0t2YmR6bnBSRkNreA0KLURvQ2pqdmJkS0RKYnBqRFkNCi1FT2NMS3ZiZFJFREJRUkRyDQotRG9ETEt2YmRadEloeUVUTw0KLUVPYmpqdmJkS2ZHSGJCUXUNCi1EbmJqanZiZG5VdHpLaXJHDQotRVBETEt2YmR5TnNId3NJYw0KLURvQ2pqdmJkSXJ4YVNseE0NCi1Eb0NrS3ZiZFJqeUZ1SExUDQotRVBDa0t2YmRKdlVmRGRnSg0KLURuYmtLdmJkZ1FCenZjd2gNCi1EbmJrS3ZiZHB5T2dmcUVZDQotRG5ia0t2YmRtUnh1WnNFSg0KLUVPYmtLdmJkbVJ5VXlzRGkNCi1EbmJqanZiZHJ6TVByYUlPDQotRVBETEt2YmREeFhrc3NzbA0KLUVQRExLdmJkcVVVR3JTS3QNCi1FUENqanZiZFppc0lQZmJHDQotRVBETEt2YmRpR2ljWlZqVg0KLURuYmpqdmJkcWNkaVBuVmENCi1Eb0RMS3ZiZEdLZHNDZ2x1DQotRVBDa0t2YmRZU2xCTlVPeA0KLURvQ2tLdmJkam1Ca3llSFANCi1FT2JqanZiZEtESmNSS0RZDQotRVBES2p2YmRpTGRjbXVDeQ0KLURvQ2pqdmJkYkF2RWZRUVgNCi1FUERLanZiZGVnanZSbXFIDQotRU9jTEt2YmRyb3VuaWJ2Rw0KLURvQ2tLdmJkbGlFVVF0ckINCi1Eb0NrS3ZiZHJYUGxDaHlSDQotRG5ia0t2YmRjeXhveFpSQw0KLURvQ2tLdmJkV0lZV1lIWXoNCi1EbmJrS3ZiZG1KRVRwdHJCDQotRU9iamp2YmRiQlZlR1BwWA0KLURvQ2tLdmJkeXBubGlLWEENCi1FT2NMS3ZiZGF0YWdYa1RoDQotRVBES2p2YmRyb3VuakRXRw0KLUVQREtqdmJkVXlIc3lqbm4NCi1FUERLanZiZGRaeG94WlJDDQotRG5iamp2YmRLQ2pDcGpEWQ0KLURvQ2pqdmJkS2tCSHZBSnkNCi1EbmJqanZiZGpia2tSR3VIDQotRG9Damp2YmRyYWZOTUdqeQ0KLURuY0tqdmJkeG5USHdzSkQNCi1EbmNLanZiZGVtRnZmbUprDQotRG5iamp2YmRJd3NiSUxxUQ0KLUVPYmpqdmJkVU1XUEF2T2kNCi1FT2NMS3ZiZEdLZHNDaE11DQotRG9Damp2YmRXWEl4V0VFZw0KLURvQ2pqdmJkdlBUenFLbnQNCi1Eb0RLanZiZElMYXptd1JMDQotRVBDa0t2YmRqbGFrekZIUA0KLUVQRExLdmJkS0RKYnFLQ3gNCi1FT2NMS3ZiZEhFTFdLQmpLDQotRG9Da0t2YmRPRkRzaGhrRQ0KLUVQREtqdmJkQmhrQ0toZWoNCi1Eb0RLanZiZE5kZFRpSktkDQotRVBDa0t2YmRWcW13YWRrYw0KLUVQQ2tLdmJkRmZLU09JdFINCi1FUENqanZiZFpzaGlZY3JuDQotRG5jTEt2YmR2QWN4c09lSQ0KLUVPYmtLdmJkS1Z0ZkVGSEoNCi1EbmNMS3ZiZFhzTUJOVVBZDQotRG9ETEt2YmRDVEFidEdYUw0KLURvREtqdmJkUnlqSHNEV0ENCi1Eb0NqanZiZEpjS0RSSmNZDQotRU9jS2p2YmRFdXhwUGxqRg0KLURuY0xLdmJkdVdOeEtRc0ENCi1FT2NMS3ZiZGh1WmVYU1ViDQotRU9iamp2YmRqdlduRGF4WA0KLUVPYmpqdmJkd1dsQXZBdXUNCi1FT2JrS3ZiZHFxdUtuTEJODQotRG9ETEt2YmRkQ1NtU0FUbQ0KLURvQ2pqdmJkd3RtRXB4bE8NCi1EbmJqanZiZERvQ2tMV2NFDQotRG5jTEt2YmR3eWhHRnhFcg0KLUVPY0tqdmJkcnlrb3NBZ24NCi1EbmJqanZiZE5lRVVKSkxFDQotRG9ES2p2YmRqdXdOZENZWA0KLUVQREtqdmJkaUdpYnlWalYNCi1EbmJqanZiZFlxTkVobUVxDQotRVBETEt2YmR4Vk5FcHlMbg0KLURvQ2pqdmJkWmVZR3pnaUMNCi1Eb0NqanZiZFpqVElRR2JHDQotRG5ia0t2YmRTUHNmakdFWA0KLUVPYmpqdmJkQnNCRFVHWFMNCi1Eb0NrS3ZiZHNCZk5NR2taDQotRU9jTEt2YmRMQkxHbUNYcQ0KLUVQREtqdmJkSlRaQlROWU0NCi1EbmJqanZiZEpUWkJTbVlNDQotRG9ETEt2YmRqS0Znak5ZUw0KLURvREtqdmJkcWx6S1lraEoNCi1FUENrS3ZiZGtXWE9FQ1lYDQotRU9ia0t2YmRGa0VzRElOVg0KLUVPYmpqdmJkZG5kc0tzdFMNCi1Eb0NqanZiZGF1QmZ3anNoDQotRG5iamp2YmRGamVUQ2dsdQ0KLUVPY0xLdmJkZk1mV2ZsaWsNCi1FT2JqanZiZGxZc1JyeUd0DQotRVBDamp2YmR0YmNWV3VvUA0KLURuYmpqdmJkTWdEUG1RVkwNCi1Eb0RMS3ZiZGpoSExlZk5rDQotRU9jTEt2YmRVc21UZk1XSw0KLURvQ2tLdmJkcHRUZnFxanQNCi1FT2JrS3ZiZHJSdUttamFODQotRVBDamp2YmR6b1FRZGNNWQ0KLURvREtqdmJkcnBWb0tEVmYNCi1Eb0NrS3ZiZGxaU3JUWWZ0DQotRG9Damp2YmRCaGphamlGag0KLUVPY0xLdmJkem9RUWRia3gNCi1FT2JrS3ZiZE9oQVlaQVlhDQotRU9jS2p2YmRqdlhOZEJ3dw0KLURuYmpqdmJkRVh3bFR0VGwNCi1Eb0NrS3ZiZHpqVlBvY3NVDQotRG9ETEt2YmRaUWxkaU1lUg0KLURuY0tqdmJkWU5xQVlWVnQNCi1EbmJqanZiZHR2TnhLUlRBDQotRVBDamp2YmRxY2VJb25XQg0KLUVPY0tqdmJkeVhpS0NQekwNCi1Eb0NrS3ZiZGZJS3VyTnBnDQotRG9ES2p2YmRGeHVWQWRZQw0KLUVPY0xLdmJkZU9kcmpzc3INCi1EbmNMS3ZiZHhuU2hZVEljDQotRVBETEt2YmRvem5FS3dvQQ0KLURvRExLdmJkcHRUZnJSa1UNCi1EbmNMS3ZiZGtXV25EYXhYDQotRVBDamp2YmRLV1ZHRGVISg0KLUVQQ2pqdmJkdHVtd2lwc0ENCi1Eb0NrS3ZiZFp4Y2luRE1TDQotRU9iamp2YmRDV3pkSWVRVw0KLUVQREtqdmJkSGdHell3d2cNCi1FT2NLanZiZHVEQ3R2dk9vDQotRG5iamp2YmRxdm9rYmlaUg0KLURuYmpqdmJkbUljc3B0cWENCi1EbmNMS3ZiZHJKQUpkbVBGDQotRVBDa0t2YmRLamFIdkFKeQ0KLURvQ2tLdmJkaHVaZHdTVWINCi1FT2NLanZiZG5QelpWanlDDQotRG9ES2p2YmRZU2xBbVVQWQ0KLUVPY0tqdmJkZmZMek5nSEENCi1EbmNMS3ZiZHB0VUhScWp0DQotRVBDamp2YmR5VE5pTXFhZw0KLURvQ2pqdmJkYXVCZ1hrVGgNCi1FUENqanZiZGJpTWlrR1hZDQotRU9jTEt2YmRJSEd6Wlh3Zw0KLURuY0tqdmJkclhQa2NJeHENCi1EbmJqanZiZE9UVHVnRXVRDQotRG5ia0t2YmRqY01LcUhVZw0KLURvREtqdmJkZmZNWm5ISEENCi1Eb0NqanZiZGRpalNXVXpuDQotRG5jS2p2YmRCaGtDS2lHSw0KLURuY0tqdmJkSllUYkhrcVENCi1EbmJrS3ZiZHF3UGxDaVpSDQotRG9Da0t2YmR4VW1GUllrbg0KLURvREtqdmJkbVNaVXpURGkNCi1FUERMS3ZiZGt5VFNTeGZ0DQotRG9Damp2YmRtYWpYWVBPVg0KLUVQQ2tLdmJkTW93cVZuSFQNCi1EbmNMS3ZiZFRwcG9VdUhtDQotRVBETEt2YmRnRmt5bWZnQQ0KLUVPYmpqdmJkaGdKY1l1alYNCi1EbmNLanZiZHRBR3FJQUJTDQotRG9ETEt2YmRxWk9oR3BkWQ0KLUVPYmtLdmJkamJra1JHdUgNCi1Eb0NqanZiZEdMRXNDaE5WDQotRG5iamp2YmRab09JZUV5ag0KLURuY0xLdmJkYnJianNkSmENCi1FUENqanZiZEdHSnFtaVRxDQotRVBDa0t2YmROUHhSV05nVA0KLUVQQ2pqdmJkSnB5ZG5mT0YNCi1FT2NLanZiZGN5eG94WXBiDQotRVBES2p2YmRtb3paV0xZYg0KLUVPYmpqdmJkVlRtVUZsVmoNCi1Eb0NqanZiZE5ydFdHZHVRDQotRG5jS2p2YmRxVVRmcXFrVQ0KLURvREtqdmJkVGZ6bk1XdWUNCi1FT2NMS3ZiZE5zVHVnRXVRDQotRG9ETEt2YmRqaEhMZkdPTA0KLUVPYmpqdmJkWnRKSllkU24NCi1Eb0RLanZiZFpqVEhvZmJHDQotRG5jS2p2YmR1Q2J0d1Zubw0KLUVQQ2tLdmJkWnRJaHhjc08NCi1FT2NMS3ZiZG5VdVprSnFmDQotRU9ia0t2YmRpQ1BDZVhRcQ0KLUVPY0tqdmJkWnRKSXhjc08NCi1FT2NMS3ZiZFpSTkVobUZSDQotRG5ia0t2YmRGamRzRElOVg0KLURuY0tqdmJkc1psUVNhSU8NCi1FT2JqanZiZHVMeFhBdEF3DQotRG5jS2p2YmRkb0ZTanRUcg0KLURvQ2tLdmJkbWJLWFhvT1YNCi1Eb0RLanZiZE9BSXNUaXJBDQotRG5jTEt2YmRNZmNRTXBWTA0KLUVQREtqdmJkc3Jxcnh6RkQNCi1FT2NMS3ZiZFpSTWRpTWRxDQotRU9ia0t2YmRDVEFic2ZYUw0KLUVQRExLdmJkdHVuWUpwc0ENCi1FT2JrS3ZiZFlTa2FOVG9ZDQotRG9Da0t2YmRaTVJkVU9NTg0KLUVQQ2tLdmJkSXNZYVNtWU0NCi1EbmNMS3ZiZFZZZ3Raa1BPDQotRU9iamp2YmRhTkxCc1VtSA0KLUVPY0xLdmJkWnlFS09Da3INCi1Eb0RMS3ZiZE9Tc3VmZHRwDQotRG9ES2p2YmRoYlBDZHZxUg0KLURuYmtLdmJkaVp1RmtwbkcNCi1Eb0RLanZiZEhEanVqQ0pqDQotRVBES2p2YmRDRHBCVmpNZg0KLUVPYmtLdmJkZUZPckJ3REsNCi1Eb0RMS3ZiZGhnSmJ4dkp1DQotRU9iamp2YmRpWnVGbFFtZg0KLUVQREtqdmJkZXV6d3BKenMNCi1FUERLanZiZGV6dXlFaHN3DQotRVBDa0t2YmRKWVRiSU1RcA0KLURuYmtLdmJka0lITGVlbkwNCi1Eb0NrS3ZiZEFNZ3lUWFp4DQotRG5ia0t2YmRmSUt2Um5RZw0KLUVQRExLdmJkSnFaZVBGbkYNCi1Eb0NqanZiZFJqeGZWR2tUDQotRU9jTEt2YmR5U21obHFiSA0KLURuYmpqdmJkRVlZTVVUdE0NCi1Eb0RMS3ZiZGh0eWR2cXVDDQotRU9iamp2YmRaUk1kaU1kcQ0KLUVQQ2pqdmJkVlpJVHpMT24NCi1Eb0NrS3ZiZG11VlpqalJmDQotRG9Damp2YmR6b1FSRWJreA0KLURuYmtLdmJka3lUU1N4Z1UNCi1Eb0NqanZiZHpSUE5JalhBDQotRVBES2p2YmRuUHl4dkxaQw0KLUVPY0tqdmJkU1pqSHJidkENCi1FUENrS3ZiZFNoeWpSQUJNDQotRU9iamp2YmRZcG1FaU1lUg0KLURvQ2pqdmJkRmFPcVlpem0NCi1EbmNMS3ZiZEV2WlFRTWpGDQotRG5jS2p2YmROcnRXR2VWUQ0KLURvREtqdmJkcWRGSlBtdkINCi1EbmJqanZiZFJYT0RibElEDQotRG9ETEt2YmR5emRuUmhJaA0KLUVQQ2tLdmJkY1RDanNkS0INCi1EbmNMS3ZiZEpjS0NxS0N4DQotRU9iamp2YmRtZmR3bU5nWg0KLUVQRExLdmJkcVVUZ1NTTFUNCi1FT2JqanZiZFp5RUtPRExyDQotRVBES2p2YmRUcHBvVlZJTg0KLURuYmpqdmJkRlZ5UHBOSmUNCi1FUERLanZiZEpZVUJoTHFRDQotRVBETEt2YmRxY2VJcE9XQg0KLUVQRExLdmJkaUJuYmVYUXENCi1EbmJrS3ZiZEdaVlZCRVlDDQotRG5jS2p2YmRHTEZURElOVg0KLUVPYmpqdmJkVUd6bWxYV0YNCi1FT2NMS3ZiZHhybWlNcWJIDQotRG9ETEt2YmRKcHpFbmVuRg0KLUVPYmpqdmJkRXZZb29tSmUNCi1Eb0RLanZiZEpxWmRvRm1lDQotRU9iamp2YmRFdXlQcE1pZQ0KLUVPY0tqdmJkbXR1WmpqUmYNCi1FUERLanZiZGpLR0hpbHdyDQotRVBDa0t2YmRwYUllQVdnZA0KLURvREtqdmJkR1pWVWFEeEMNCi1Eb0NqanZiZEZrRXJjSGx1DQotRU9jS2p2YmRyYkZsbEdqeQ0KLURuYmtLdmJkTVJ3TXpVcHoNCi1Eb0NrS3ZiZER4WUx0VHNsDQotRU9jTEt2YmRMQktmbUJ4Ug0KLURvQ2pqdmJkVndKWVdEZUgNCi1Eb0NrS3ZiZFpvT0lkZVpqDQotRVBETEt2YmRwZkVGVVdBaA0KLUVPY0xLdmJkS1dWR0RkZmkNCi1FT2JrS3ZiZHR2TndpcHNBDQotRG9Damp2YmR3dU5FcVpNTw0KLUVPYmtLdmJkZlNCV3prYm8NCi1FUERMS3ZiZEZ4dVZBZFhiDQotRG5ia0t2YmRSV25FQ2xIYw0KLUVPY0tqdmJka0NranFIVWcNCi1Eb0NqanZiZGJzREtzY2lhDQotRVBETEt2YmR6UW9NaUtYQQ0KLURuYmtLdmJkUkRjQXBRY3INCi1Eb0RLanZiZFp0SWlZY3JuDQotRG9ETEt2YmRxWlBIZ1FkWQ0KLUVPYmpqdmJkeWZ4bEFNZVgNCi1FT2JqanZiZGRqSnJXVXpuDQotRVBES2p2YmRqY01MUWdWSA0KLUVPY0xLdmJkb3ptY2tYb0ENCi1FUERLanZiZGNKTWpMR1d4DQotRVBDa0t2YmRiaGxpamV3WQ0KLUVPYmpqdmJkckVGSlBuV0INCi1FT2NLanZiZG11VlpqaXJHDQotRG5jS2p2YmRuQmpYWU9tdQ0KLURuY0xLdmJkamNManFIVWcNCi1FUERMS3ZiZGxoZFVRdVJhDQotRG9ES2p2YmRWd0l3dkVGSA0KLUVPYmtLdmJkWk1TRHNuTG0NCi1Eb0RMS3ZiZHpIWk1BTWR3DQotRU9jS2p2YmRaTVNEc25MbQ0KLURuY0tqdmJkWnNoaHlEc08NCi1EbmNLanZiZENFUGFXSmxmDQotRU9jS2p2YmR4eEpLQ1Faaw0KLUVQQ2tLdmJkZXp2WkVpVHcNCi1FUERMS3ZiZHlwb01pS1hBDQotRVBDa0t2YmRuVXVaampSZg0KLURuYmtLdmJkRmZKcW5KVVINCi1Eb0NqanZiZFRwcVBVdGhODQotRG5jS2p2YmRjeXhveFlwYg0KLUVPYmtLdmJkQ1NhQ3NmWFMNCi1EbmJrS3ZiZFJhY2RsSXlMDQotRG9Damp2YmRUSXpLUkFCTQ0KLUVQQ2tLdmJkYXRiR3dqc2gNCi1FT2JqanZiZFVzbHRHTVdLDQotRG9ETEt2YmR0dk9YalFzQQ0KLURuYmpqdmJkWVNsQW1VUFkNCi1FT2NLanZiZHd1TkVweGtuDQotRU9ia0t2YmRZcU1kaU1kcQ0KLUVPY0tqdmJkbkdlWGxtZ1oNCi1EbmJrS3ZiZHF3UUxjSllxDQotRU9ia0t2YmR1Vm14SnFUQQ0KLUVPYmpqdmJkbW95eVZrWWINCi1Eb0RLanZiZEJkUGFXS01mDQotRG5jS2p2YmRWdmh3dkVGSA0KLUVPYmtLdmJkYXVCZnhMVUkNCi1FT2NMS3ZiZE1nRFFOUVVrDQotRU9jS2p2YmRzUVZuakN1Zg0KLUVPYmtLdmJkanV2bkVCd3cNCi1Eb0NrS3ZiZGtXWE9EYlh3DQotRVBDa0t2YmRaeURqTmJsUw0KLURvREtqdmJkWkxxZFVObE4NCi1Eb0RLanZiZGJMTUZvTmNBDQotRG9Da0t2YmRGVnlRUG1KZQ0KLUVPY0tqdmJkaGtkY211Q3kNCi1FUENrS3ZiZG10dVpqaXFmDQotRG5iamp2YmRSYkVGTGlZaw0KLUVQQ2tLdmJkeVNuSk1xYWcNCi1FUERMS3ZiZGhsRkRuVkN5DQotRG9Damp2YmR6b1FSRWJsWQ0KLUVQQ2pqdmJkdkJFWXJvRkkNCi1FUENqanZiZEpiakNxSmNZDQotRG5ia0t2YmRsaUVVUlVyQg0KLURvREtqdmJkT1RVV0dkdHANCi1FT2NMS3ZiZFpubWhkZHpLDQotRVBES2p2YmRTQmNka2laTA0KLURvQ2pqdmJkWk1SY3RPTG0NCi1Eb0RMS3ZiZHVDY1V3Vm5vDQotRG9ETEt2YmRFenNwZU1ESg0KLUVQQ2pqdmJkVUx1bmFXT2kNCi1Eb0RMS3ZiZEl3c2FnbFFwDQotRU9ia0t2YmRKdXVGZEZHaQ0KLUVQQ2tLdmJkUWNjQlFSRHINCi1FUERLanZiZE5yc3VnRXRwDQotRVBETEt2YmRFWHhMdFVVTQ0KLURvREtqdmJkVkJDUXNSUnkNCi1EbmNLanZiZGVGUFNDV2NLDQotRG9ETEt2YmRoZmljWXZKdQ0KLURuY0tqdmJka0NsTFJIVkgNCi1FT2NMS3ZiZHVXTnhLUlRBDQotRU9iamp2YmROUHdwdW1nVA0KLURvQ2pqdmJkam1DTHpGR28NCi1EbmNLanZiZFp0SWh4ZFNuDQotRU9ia0t2YmRLUXllUEZtZQ0KLUVQQ2pqdmJkRXV4cFBsakYNCi1Eb0NrS3ZiZFp0SWh5RHJuDQotRVBETEt2YmRKcHpGT2ZOZQ0KLUVQREtqdmJkdWFFWlRQRkkNCi1FUERMS3ZiZFNRVGdLRmN3DQotRU9jTEt2YmRCY3BBdWpNZg0KLUVQQ2pqdmJkZkhrVnJPUWcNCi1FUENqanZiZEthS2ZsYXhSDQotRU9ia0t2YmRaalRJUUdhZg0KLUVPY0xLdmJkaWpHSUtNd3INCi1FUERMS3ZiZHZCRVpUT2RoDQotRG5ia0t2YmRaUk5FaGxlUg0KLURuYmtLdmJkaWpGZ2ltWHINCi1FT2JqanZiZEVBU0lseXdYDQotRG9Damp2YmRLYUtnTkNYcQ0KLUVQRExLdmJkVHBwb1V1SG0NCi1FUENrS3ZiZHd6SGVmWUVyDQotRVBDa0t2YmRodHllV3JVYg0KLURuYmtLdmJkUHlOQUdzUmoNCi1FUERLanZiZG10dHpLaXFmDQotRG5iamp2YmRSYWNka2h5TA0KLUVPY0xLdmJkZUpqUnZVem4NCi1FT2JqanZiZE5IQ3BOUVZMDQotRVBDamp2YmRnTEd6Y0dBRQ0KLURvQ2tLdmJkaWRrR3RvQU8NCi1EbmJrS3ZiZEtESmNSS0N4DQotRG5iamp2YmRTUVRnS0dFWA0KLUVQRExLdmJkeXFQTWlKd0ENCi1EbmJrS3ZiZExyV2x5dHB6DQotRG5iamp2YmRtZ0V4Tk5nWg0KLUVQQ2tLdmJkbFlzUnJ4Z1UNCi1EbmJqanZiZFRrdW9BdlBKDQotRU9jS2p2YmRnRmt5bWdIQQ0KLUVQRExLdmJkbWFpdnhPblYNCi1EbmJqanZiZEV6dFFlTURKDQotRU9iamp2YmRXZll6VUFQVA0KLURuYmtLdmJkaU1FZE51RFoNCi1Eb0RLanZiZGdRQnp3RVhoDQotRU9jTEt2YmRTQmNkbEl5TA0KLURuYmpqdmJkck16SnhraEoNCi1EbmJqanZiZGRkbnJDWERLDQotRG5jTEt2YmRtYktYWG5uVg0KLURuYmpqdmJkWXpiZlNLV1oNCi1FUENqanZiZFVNV1BCVm9KDQotRVBES2p2YmRCcmFEVUdXcg0KLURvQ2tLdmJkRmtGVERJTlYNCi1EbmNLanZiZFlrcWRUbWttDQotRG5jS2p2YmRtcFp5Vmp5Qw0KLURvQ2pqdmJkWmlzSVFIQ0cNCi1EbmNMS3ZiZFlxTWVKTWVSDQotRVBES2p2YmRaalRIcEhCZg0KLUVPY0xLdmJkY0pNaWtGd1kNCi1Eb0NrS3ZiZEZwQVRYSEdaDQotRG5iamp2YmRWQkJxU3BxeQ0KLURvQ2tLdmJkZFp5UVh4cGINCi1FT2NMS3ZiZHFseWl5TUhpDQotRVBETEt2YmRmTWZXZ05Kaw0KLURvQ2pqdmJkck5aalpMZ2kNCi1FUENrS3ZiZGVPZHNLdFRyDQotRVBES2p2YmRMclhNeXRweg0KLURuY0xLdmJkUXZuRGNNSGMNCi1Eb0RMS3ZiZHlZSkpiUHlrDQotRG5iamp2YmRyeWxQc0JJTw0KLURuYmtLdmJkVHFST3VVZ20NCi1Eb0NqanZiZGN5eVFZWlJDDQotRU9iamp2YmRiTE1Gbm1jQQ0KLUVPYmpqdmJkYlZDR3hLc2gNCi1FT2JqanZiZGVsZldnTWpMDQotRVBETEt2YmRuR2R3bU9HeQ0KLUVQQ2tLdmJkY1RETFRkS0INCi1EbmNMS3ZiZFV4aFR5am9PDQotRVBDamp2YmR3ekhmRnhFcg0KLUVQQ2pqdmJka3hycXJ5SFUNCi1EbmNMS3ZiZERpaEp2WUtBDQotRVBDa0t2YmRSekpoU2NXQQ0KLUVPYmpqdmJkWkhXZEFPcmkNCi1Eb0RMS3ZiZGpia2tSR3VIDQotRG5jS2p2YmROVlNyTE5BWA0KLURuY0tqdmJkVnFuWUNFbEQNCi1EbmJqanZiZEZXWlBwTWpGDQotRG9Damp2YmRaTVJjdE5rbQ0KLUVQQ2pqdmJkUk5YYXhtdHoNCi1FT2NMS3ZiZExaUWpTenRmDQotRU9iamp2YmRlUEZTanNzcg0KLUVPY0tqdmJkamJra1JIVWcNCi1FUERLanZiZGNTYmp0RUphDQotRU9ia0t2YmRLUXpGUEZtZQ0KLURvQ2tLdmJkblV0ektqUmYNCi1EbmNMS3ZiZGVPZVRLdFVTDQotRG9Damp2YmRwc3RHcXFqdA0KLUVPY0tqdmJkcnBXUEpjV0cNCi1FUENrS3ZiZHdrWERnenlmDQotRG5jS2p2YmRuUHl4dkxZYg0KLURvQ2tLdmJkcHhvSUhSRHgNCi1EbmJqanZiZExGZWdhYVJWDQotRVBDamp2YmRyWFFMY0pZcQ0KLURuY0tqdmJkV1hKWHZEZGcNCi1EbmJqanZiZFFkQ2FRUkRyDQotRU9jTEt2YmRXV2lYdWNlSA0KLURvQ2pqdmJkYmlOSmtHWFkNCi1FUERLanZiZGlqR0hqTXhTDQotRG9ETEt2YmRUZnpta3dWZQ0KLUVPYmtLdmJkbVNaVXpURUoNCi1EbmJqanZiZEtlZkhhYVJWDQotRG5jTEt2YmRkb0ZTanN0Uw0KLURuY0xLdmJkU0xZZlVnS3MNCi1FUENrS3ZiZENJamJMSkdLDQotRG5jS2p2YmRLTkFEekd1Qg0KLURvREtqdmJkQmNwQlZqTWYNCi1EbmJqanZiZHB4b0hmcUVZDQotRG9Damp2YmRBTkh5VFd5eA0KLURvREtqdmJkRmplU2JnbVYNCi1EbmJrS3ZiZHh3aUtDUHpMDQotRG5jS2p2YmRxY2VJcE52Qg0KLURuYmpqdmJkTEZmSGJBcVYNCi1FUERMS3ZiZHRUU1RZeWRjDQotRVBDamp2YmRlenZZZGlUdw0KLUVPYmpqdmJkV1dpWVZkRkgNCi1FT2NMS3ZiZFp5RGpOYmtyDQotRU9ia0t2YmR3eklGZXdlUw0KLUVQQ2pqdmJkam1Ca3pGR28NCi1FT2JqanZiZEdBb1JZaXptDQotRU9iamp2YmRqY01MUWdWSA0KLURvQ2pqdmJkZGVQUmF2YmoNCi1FT2NLanZiZGxoY3NwdVNCDQotRVBDamp2YmRTQ0VGTUpaTA0KLUVPYmtLdmJkRVlZTHNzc2wNCi1FT2JrS3ZiZHBzdEdyU0xVDQotRG9ETEt2YmRJR2daeHd3Zw0KLUVPYmtLdmJkV0lZV1lHeHoNCi1FUENqanZiZGZJTFdTTnFIDQotRG5ia0t2YmRGV1lwUGxqRg0KLURvQ2pqdmJkVkFiUlNxUnkNCi1FT2NLanZiZGVFb1NDV2NLDQotRU9jS2p2YmRTQmNlTUl4aw0KLURvQ2pqdmJkZ0Zrek9HZ0ENCi1FT2JrS3ZiZGJQZmdFTHpkDQotRG5iamp2YmRtdHVaa0pxZg0KLUVQQ2tLdmJkWWdXZEFQU2kNCi1FT2JrS3ZiZG1haXdYb09WDQotRU9jS2p2YmRqdXZuRGJYdw0KLURuY0xLdmJkaUJvQ2R2cHENCi1EbmJrS3ZiZFp4Y2pOYmtyDQotRVBES2p2YmRLZkZnYWFSVg0KLURvREtqdmJkTkdjUGxvdUwNCi1FT2NLanZiZEhsQnpuWFFrDQotRVBDamp2YmRLUXlkb0ZtZQ0KLUVQQ2pqdmJkRHhZTHNzc2wNCi1Eb0NqanZiZEhiTHlkekFEDQotRG5ia0t2YmRaaXNIb2ZiRw0KLURuYmtLdmJkdnZrYVdCV1YNCi1EbmNMS3ZiZGR4WnRVU0Z6DQotRVBDamp2YmRCY3BCV0psZg0KLUVPYmtLdmJkVkJCcHJwcXkNCi1Eb0NrS3ZiZGFTRmNJVGZMDQotRG9Da0t2YmRaTHFjdE9NTg0KLUVQREtqdmJkRldZcFFNaWUNCi1EbmNLanZiZE9FY3RKSWpkDQotRG9Da0t2YmRFdXlRUG1KZQ0KLURuY0xLdmJkWkd3RUFPc0oNCi1EbmNLanZiZGxxeVV6U2NpDQotRU9jS2p2YmRLQ2licUtDeA0KLURuYmpqdmJkRU9jTEt2YmQNCi1EbmNLanZiZGRuZVRMVVVTDQotRVBDamp2YmRoYlBERldwcQ0KLURvQ2pqdmJkZUFVUW1YakcNCi1FUERLanZiZFZ3SllXRGVIDQotRG5jS2p2YmRlUEZUS3N0Uw0KLURvQ2pqdmJkamdnTUZlbWsNCi1FUENqanZiZGNTY0xVRGpCDQotRG9ES2p2YmRaalRJUUdiRw0KLUVPYmpqdmJkZWhLdXJOcGcNCi1EbmNMS3ZiZGJzRExVRUphDQotRU9jTEt2YmRFSmdqV1hqQQ0KLUVQQ2tLdmJkcXF1S25LYU4NCi1EbmJqanZiZFpqU2hRSENHDQotRG9Damp2YmRDRVBhVmlsZg0KLUVPYmpqdmJkempVcFFEcnQNCi1FT2NMS3ZiZFVWbFBqVUJSDQotRG5iamp2YmRlRlBTQ1diag0KLURvQ2tLdmJkS3hwaXJ6dUcNCi1EbmNMS3ZiZHJ5a3BUQWduDQotRG9ES2p2YmRlbUdYR2xqTA0KLURuY0xLdmJkVFlLbE56a1kNCi1EbmNLanZiZHVhRHlUT2VJDQotRU9ia0t2YmRuQmpXd29PVg0KLUVQQ2tLdmJkR2RMV0tDSmoNCi1FUERLanZiZEtlZWdhYVF1DQotRU9ia0t2YmR4blNoWHJoYw0KLURvQ2tLdmJkc0JlbUxnS3kNCi1FUENqanZiZHJ6TG9yYUhuDQotRVBETEt2YmRyUnVLbWphTg0KLURuY0xLdmJkbWFqV3hQT1YNCi1EbmNLanZiZEtWdUdEZUdpDQotRU9iamp2YmR6aXVRUGRUVQ0KLURuYmtLdmJkWnhjaW5Da3INCi1FUENrS3ZiZGxxeHR6VERpDQotRVBDa0t2YmR5emVPU0hpSQ0KLURuYmtLdmJkcW1aaXlNSUoNCi1FT2NMS3ZiZEl3dEJna3FRDQotRG5jTEt2YmRmZWt6T0hIQQ0KLUVQQ2tLdmJkS05BRHpHdUINCi1FT2NMS3ZiZFVhQnFTcVJ5DQotRVBES2p2YmRkZG5yQnZiag0KLURuY0xLdmJkbXVWWmppckcNCi1FT2NLanZiZGJCV0VlcFB3DQotRG5jTEt2YmR3anZkSHp5Zg0KLUVQREtqdmJkbWdGWGxtZ1oNCi1FUENrS3ZiZHRTcXJ5WmVEDQotRU9ia0t2YmRPRkVVSWhrRQ0KLUVPY0tqdmJkaUJuY0ZYUlINCi1EbmNMS3ZiZHhaZ2Vld2VTDQotRVBETEt2YmR4d2lLQ1B5aw0KLUVQREtqdmJkSEVLdkphaksNCi1EbmNLanZiZHJhZk1sR2p5DQotRU9jTEt2YmR3V2xCV0JXVg0KLURuY0xLdmJkZWdqdlJtcUgNCi1FT2JrS3ZiZGVoS3ZSbXFIDQotRG9ETEt2YmRVYUJwc1FyWg0KLUVQREtqdmJkUmFjZU1KWWsNCi1EbmJrS3ZiZFpSTkVobGRxDQotRG5iamp2YmRLQ2licGpEWQ0KLURvRExLdmJkS2FMR21DWHENCi1EbmNMS3ZiZEthS2ZsYllSDQotRG9Damp2YmRaUWxlSk5GUg0KLUVQQ2pqdmJkWkhXZEFPc0oNCi1FT2JrS3ZiZHB4bmdnUkR4DQotRVBES2p2YmRpVXpGWFNWQw0KLURuY0tqdmJkaGZqRFpXSnUNCi1Eb0NqanZiZFlrckR0TmxODQotRU9jTEt2YmRrVnZtZEJ4WA0KLURuYmpqdmJkRmtGU2NIbHUNCi1Eb0NqanZiZGxyWXVacmNpDQotRU9jS2p2YmRyRGRpUG5XQg0KLURvQ2pqdmJkZm9henZjd2gNCi1FUENrS3ZiZHRreFdhVUF3DQotRU9iamp2YmRWWWdzeWpvTw0KLUVQQ2pqdmJkc3NTVFpaZUQNCi1Eb0NqanZiZGJWQmZ3anNoDQotRVBDamp2YmRWZ3d1eEd4eg0KLUVPY0tqdmJkWm9OaGRlWmoNCi1FUENrS3ZiZEdZdHRhRHdiDQotRG5jTEt2YmR2QWN5U29FaA0KLURvREtqdmJkSUdmelpZWUgNCi1Eb0RLanZiZHRjQ3R2dlBQDQotRU9iamp2YmRreHNScnlIVQ0KLURuYmtLdmJkSlN5QlRNd2wNCi1Eb0NqanZiZHNQdW9KYnVmDQotRG5iamp2YmRaeGNpbWNNUw0KLURvREtqdmJkTkdicE1vdUwNCi1EbmJqanZiZFNaakhyYnZBDQotRG9Da0t2YmRtUnh0eXNEaQ0KLUVPY0xLdmJkWlFtRWlNZVINCi1FUENqanZiZHBmRUV0VmFJDQotRVBDamp2YmR0VFJyeHpFYw0KLURvQ2tLdmJkWmR4R3pnaGINCi1EbmNLanZiZHJ5a3BUQklPDQotRVBDa0t2YmR4eElqQ1B5aw0KLURuY0xLdmJkQ0VRQXVqTkcNCi1FT2NMS3ZiZHJXb2tiaHlSDQotRVBES2p2YmRqSmVoS013cg0KLURuY0xLdmJkU3hMTU56angNCi1EbmJqanZiZFp5RGluRE1TDQotRU9iamp2YmRaaXJoUUdhZg0KLURuY0xLdmJka0NsS3FIVkgNCi1FT2JrS3ZiZGZJS3ZSbXFIDQotRG9ETEt2YmRRdm1jYmxJRA0KLUVQREtqdmJkTnNUdWZkdHANCi1FT2JrS3ZiZFpSTWVJbGVSDQotRG5ia0t2YmRkd3l0VHJGeg0KLUVPYmpqdmJkWnhkS09ETVMNCi1FUENrS3ZiZFNMWkZ0Z0tzDQotRVBES2p2YmRyb3ZQSmJ1Zg0KLUVQQ2pqdmJkSGdIWnh4WUgNCi1FUENqanZiZGRkb1NCdmJqDQotRG9ES2p2YmRlZ2tWcW1wZw0KLURvREtqdmJkQ2ZrZkhBemMNCi1FT2JqanZiZHR2TnhKcVRBDQotRVBES2p2YmRodHllWFNWQw0KLUVQRExLdmJkVXRNdEdMdksNCi1FUENqanZiZEZhUFJZaXptDQotRVBDa0t2YmRWWklVWmtPbg0KLUVQREtqdmJkRmVpcW5Jc3ENCi1FT2JrS3ZiZGRkb1JiV2NLDQotRU9jTEt2YmRhTkxDU3VNZw0KLUVPYmpqdmJkRnBBVFhHZloNCi1EbmNMS3ZiZHJYUGtjSllxDQotRVBDamp2YmRGamRyY0hsdQ0KLUVPYmtLdmJkVVFxUFZVaE4NCi1Eb0RMS3ZiZHB4b0hmcUR4DQotRG5jTEt2YmR5cG9OSWpYQQ0KLUVQQ2pqdmJkbVJ4dVpyZEoNCi1FUERLanZiZHFaUEhnUkVZDQotRU9jTEt2YmRaR3dFQVBUSg0KLURuY0xLdmJkanV3TmNiWHcNCi1Eb0NrS3ZiZFRsV1BCVm9KDQotRG9Damp2YmRSektJU2NXQQ0KLUVQRExLdmJkWm5uSkZFeksNCi1FUERMS3ZiZHF2b2tiaHlSDQotRG5ia0t2YmRBTWhaVFd5eA0KLUVQQ2tLdmJkcVlvSGdSRHgNCi1FUERLanZiZFp0SkpaRVRPDQotRU9ia0t2YmRXUm14QmRsRA0KLURuYmtLdmJkd1drYVdCV1YNCi1EbmNLanZiZGdLZnpjR0FFDQotRG5jTEt2YmR0YmNVd1Zubw0KLUVPY0xLdmJkY0ltSmpmV3gNCi1EbmNMS3ZiZFN3amxOemp4DQotRU9ia0t2YmRqYmxMUWZ0Zw0KLURuY0xLdmJkUW1ZQnlOdHoNCi1EbmJqanZiZGhsRkRtdGJ5DQotRG5iamp2YmRjVERLc2RKYQ0KLUVQQ2tLdmJkcVVUZ1NSa1UNCi1FT2NLanZiZFpRbGVJbUVxDQotRU9jTEt2YmR0VFJyeHpGRA0KLUVQQ2tLdmJkVVZrcEtVQXENCi1EbmNMS3ZiZG1iSnZ3b051DQotRVBES2p2YmRySkFLRk1uZQ0KLURuY0tqdmJkcHlPaEdxRVkNCi1FT2NMS3ZiZExyV2x6VlF6DQotRG5iamp2YmR2QWRZc1BGSQ0KLUVQQ2tLdmJkRG9ES2p2YmQNCi1Eb0RMS3ZiZGVsZldnTWpMDQotRU9ia0t2YmRhTWpiVFVsZw0KLUVPYmpqdmJkdVZtd2pSVEENCi1FUENqanZiZEhmZnl4d3dnDQotRG5ia0t2YmRYcmthTlRvWQ0KLURvQ2pqdmJkWnNoaHlEcm4NCi1Eb0RLanZiZHVuc3pxS29VDQotRVBDa0t2YmRtSkR0UlZTQg0KLURuYmtLdmJkY0ltS0xGd1kNCi1Eb0NqanZiZHBlZEV0VmFJDQotRG5iamp2YmR1TVh3QXRCWA0KLUVQRExLdmJkaGJQREZXcHENCi1FUENqanZiZHJEZGlRTnVhDQotRG5ia0t2YmRLeHBpcnp1Rw0KLUVPYmtLdmJkY1RDanRFSmENCi1EbmNMS3ZiZFpRbUZJbGRxDQotRG9Da0t2YmRxVVVHclJrVQ0KLURuYmtLdmJkZFp5UVh5UkMNCi1EbmNMS3ZiZElyeUJUTlhsDQotRVBES2p2YmR1YUR4cm5lSQ0KLURvQ2tLdmJkWk1TRHNtbE4NCi1Eb0RLanZiZHJvdk9qQ3ZHDQotRU9jTEt2YmRoeXVGa3BtZg0KLURvRExLdmJkZGRuckJ3REsNCi1EbmNLanZiZER3eExzdFRsDQotRVBETEt2YmRkWnhwWHhwYg0KLURvREtqdmJkQ1NhRFRld1MNCi1FUENrS3ZiZFZxbXhCZUxjDQotRG9Da0t2YmRaTVNFVU5rbQ0KLURuYmtLdmJkem5vcGRjTVkNCi1FUENqanZiZHFZb0hnUWN4DQotRVBDa0t2YmRsaGRVUXVSYQ0KLUVPYmpqdmJkYXVCZ1lMVUkNCi1FT2JqanZiZHlTbkpNckNIDQotRU9iamp2YmRrSUdsR0dPTA0KLURvQ2tLdmJkd1hNQXZCV1YNCi1EbmJqanZiZGlDT2NGWFJSDQotRVBDa0t2YmRJSEd6WllYZw0KLUVQREtqdmJkaU1GRG11Q3kNCi1FT2NLanZiZHRsWHZhVUJYDQotRG9ETEt2YmRoZmlieHVpdQ0KLUVQQ2tLdmJkcXdRTUNoeHENCi1FT2JrS3ZiZFJrWWV1R2pzDQotRG9ES2p2YmRZa3JFVU5sTg0KLUVQREtqdmJkWnNoaVljc08NCi1EbmJrS3ZiZFFseEJ4blV6DQotRG5jS2p2YmRTUHRHaWZFWA0KLURvRExLdmJkbWFqWFhvTnUNCi1FT2JqanZiZEhiTVpkekFEDQotRVBDa0t2YmRaeUVLTmJsUw0KLUVPYmtLdmJkS2ZGZ2JCUlYNCi1FT2NMS3ZiZE9UVVZnRlZRDQotRG9Da0t2YmRmTWV2Z01paw0KLUVQREtqdmJkcHRUZnJTS3QNCi1EbmJrS3ZiZHhaaEZleEZTDQotRG5jTEt2YmRVYUJxVFFyWg0KLURvQ2pqdmJkdUREVXdXUFANCi1Eb0RLanZiZE5zVVZmZHVRDQotRU9ia0t2YmR2T3N6cGpvVQ0KLUVPYmtLdmJkTnNUdkdkdHANCi1FUERLanZiZHh3aGlhcFprDQotRG9ES2p2YmRpR2pDeHZKdQ0KLURvRExLdmJkeHhJaWJQeWsNCi1EbmNLanZiZHZBZFlyb0ZJDQotRU9jTEt2YmRMQWtHbUJ3cQ0KLURuY0xLdmJkSXNZYVRNeE0NCi1FUERMS3ZiZEZlalJtaVVSDQotRG9Da0t2YmRicmJqc2NpYQ0KLURvRExLdmJkaUhKYnlXSnUNCi1FT2NLanZiZEl3dEJoTVFwDQotRU9ia0t2YmRwZkRkdFZhSQ0KLUVPYmpqdmJkZk1ldmZtSmsNCi1FT2JqanZiZHB0VUhSckxVDQotRVBETEt2YmRZZ1hFQU9yaQ0KLUVPYmtLdmJkWm9PSkVlWmoNCi1Eb0RLanZiZHFVVUdxcWp0DQotRG5iamp2YmR4blRId3JpRA0KLUVQREtqdmJkZkhrV1JtcGcNCi1FUERMS3ZiZGVQRXNMVVVTDQotRVBDamp2YmRFUENrTFhERQ0KLURvQ2pqdmJkZ1FCenZkWUkNCi1Eb0NrS3ZiZFpqU2dvZ0JmDQotRU9ia0t2YmR0dW5ZS1FzQQ0KLUVQREtqdmJkZXp2WWRpVHcNCi1FUERMS3ZiZExCTEdtQ1lSDQotRU9ia0t2YmRTTFlmVkhLcw0KLUVQREtqdmJkZklMV1NOcUgNCi1FT2JqanZiZHFseWl4a2hKDQotRG9Da0t2YmRqS0Znak5Ycg0KLURvRExLdmJkeXpkbXJIaGgNCi1Eb0RMS3ZiZFlwbGVJbUVxDQotRG9ES2p2YmRVeGd0WmtQTw0KLUVQRExLdmJkSktFQUtQZ0UNCi1Eb0RLanZiZFJYT0RibEhjDQotRG9Da0t2YmRtb3pZdWp4Yg0KLUVPY0tqdmJkTWdDcE1vdUwNCi1EbmNLanZiZFpzaUpaRVNuDQotRVBDa0t2YmR6Uk9tSWl3QQ0KLURuYmtLdmJkRU9jTEt2YmQNCi1FUENqanZiZHB4b0lIUkR4DQotRG5ia0t2YmRFSmdpdlhqQQ0KLURvREtqdmJkZkhqdXJPUWcNCi1FT2JqanZiZHlZSWpDUHpMDQotRG9Damp2YmR2bHZBTkVFbQ0KLURuY0xLdmJkT1hvVnpkT1UNCi1FT2JrS3ZiZGF0YWdZS3RJDQotRG5ia0t2YmRHWXR1QWN3Yg0KLUVPYmtLdmJkZWdqdXFuUkgNCi1EbmJrS3ZiZHR1bXhLUXNBDQotRG5ia0t2YmRJeFRiSUxxUQ0KLURuY0tqdmJkSXNaQlRNeE0NCi1FUENqanZiZFJqeUZ1SExUDQotRU9jS2p2YmRKWHRDSU1RcA0KLURvREtqdmJkWWtxZFVPTG0NCi1FT2JqanZiZFpzaUl5RVNuDQotRG5ia0t2YmRodHllV3JVYg0KLUVQQ2pqdmJkRXV5UVBtS0YNCi1FT2NMS3ZiZGVGT3JDV2NLDQotRG9ETEt2YmRFdllwUGxpZQ0KLURvQ2pqdmJkWnRKSXlFVE8NCi1FUENqanZiZHJXb2tjSllxDQotRG9ETEt2YmR1YUR5U25lSQ0KLURuY0xLdmJkc1B1bmpDdWYNCi1FT2JrS3ZiZHB5T2hHcGN4DQotRU9ia0t2YmRsaURzcVVxYQ0KLURvRExLdmJkaGFvQ2VYUXENCi1EbmNMS3ZiZGFSZkNoVUZrDQotRU9jS2p2YmRZVE1BbHNvWQ0KLUVQQ2tLdmJkZmtHemJmQUUNCi1FT2NLanZiZFVSUW50dGdtDQotRG9ETEt2YmREb0NqanZjRQ0KLURuY0xLdmJkQ0pLYkxKR0sNCi1FUERLanZiZGhsRkVPVkRaDQotRG5ia0t2YmR1Q2NWV3ZPbw0KLUVQQ2pqdmJkUWREQlBwY3INCi1FT2JrS3ZiZGJCVmRlb3BYDQotRG5ia0t2YmRXSHd1d2Z4eg0KLURvRExLdmJkc3Jxcnh6RkQNCi1Eb0RLanZiZENTYUNzZlhTDQotRG9Da0t2YmROUHhRdW5Hcw0KLUVQRExLdmJkeXplTnJIaGgNCi1FT2JqanZiZFdYSXd1ZEZIDQotRVBDamp2YmRLV1ZGY2VISg0KLUVPY0xLdmJkcXdQbENpWlINCi1EbmNMS3ZiZHlPVEh3c0pEDQotRG5jTEt2YmR4VWxlUlpNTw0KLURuYmpqdmJkWkhXZEFQVEoNCi1Eb0RMS3ZiZGVQRXNLc3RTDQotRVBES2p2YmRIRGtWakJpag0KLUVPYmpqdmJkU1B0SEplY3cNCi1FT2JqanZiZHlUT0pOUmFnDQotRU9jS2p2YmRoZmlieHVpdQ0KLUVPY0tqdmJkUkRiYVBxRVMNCi1EbmJqanZiZGVtR1dmbGlrDQotRG9ES2p2YmR3andFSHp6Rw0KLUVPYmpqdmJkc0NHTk1HankNCi1EbmJqanZiZHNzUnNZeWVEDQotRG9ES2p2YmRKdlZGY2VHaQ0KLUVQQ2tLdmJkTFpRalN6dUcNCi1Eb0RMS3ZiZHFVVUhTU0xVDQotRVBDamp2YmRhYVdFZW9vdw0KLUVQQ2pqdmJkRGpIaXV4S0ENCi1FUERLanZiZFpRbUZJbGVSDQotRG9ES2p2YmRSRGJhUHBkUw0KLUVQQ2pqdmJkWm9PSkZGWmoNCi1FT2JqanZiZFFtWUJ4blV6DQotRVBES2p2YmRLQ2licUtEWQ0KLURvRExLdmJkc0NGbU1HankNCi1EbmNLanZiZEthS2dNYXhSDQotRG9Damp2YmRyTXpKeGtoSg0KLUVPYmtLdmJkZUtLUnV0em4NCi1FUENrS3ZiZGNUQ2pzY2pCDQotRVBDa0t2YmRac2lJeURybg0KLUVPYmpqdmJkbkJqWFhvT1YNCi1Eb0RLanZiZEJpS2FrSWZLDQotRU9jS2p2YmRScFRmakdFWA0KLURvQ2tLdmJkdFNxcnh5ZGMNCi1FT2JrS3ZiZEhEa1ZqQmlqDQotRG5jTEt2YmRxVHNnU1NMVQ0KLURuY0xLdmJkemR6T3pkelENCi1Eb0RMS3ZiZFZyTndhZGxEDQotRG5jTEt2YmRTUVVHaWZFWA0KLURuY0xLdmJkeHhKS0JveWsNCi1FUENqanZiZHJ6THBTYUlPDQotRG5ia0t2YmRodHllWFJ1Qw0KLURvREtqdmJkeVRPSW1TQmcNCi1FUERMS3ZiZGRaeHBYeHFDDQotRG9Da0t2YmRaTVNEc25MbQ0KLURuY0xLdmJkRUFSaGx6WFgNCi1FUERLanZiZGtXWE9FQ1lYDQotRU9ia0t2YmRTTFlldGdMVA0KLUVQREtqdmJkVGZ6bkx2dkYNCi1Eb0NqanZiZFNaakhyY1dBDQotRG5jS2p2YmRtSkRzcHRxYQ0KLUVPY0xLdmJkWnhkSm1ibFMNCi1EbmJqanZiZEtXVWZEZUhKDQotRVBDa0t2YmRMaUJrcHhBUw0KLUVPYmtLdmJkZVBGU2tUdFMNCi1Eb0RLanZiZFl6YmZTS1daDQotRVBDamp2YmR2QWRZc1BGSQ0KLUVPYmtLdmJkVEFGSklCbmQNCi1EbmJrS3ZiZHNaa3BTYUhuDQotRG9ETEt2YmRjelpRWVpSQw0KLUVQREtqdmJkVHZNUUtUYVINCi1EbmJrS3ZiZHlZSktDUVprDQotRVBDa0t2YmRWQWFxVFFxeQ0KLUVPY0xLdmJkYlBmZ0RremQNCi1FT2JrS3ZiZGVQRXJqc3NyDQotRVBETEt2YmR5VE9KTlJhZw0KLUVQRExLdmJkeVROaU5TQmcNCi1Eb0NqanZiZHF2cE1DaVlxDQotRG9ES2p2YmRScFVIS0dFWA0KLURvQ2pqdmJkRG9Da0xXYmQNCi1EbmNMS3ZiZGRDVE5TQVRtDQotRG9Da0t2YmRjU2JrVUVKYQ0KLUVQRExLdmJkempWUG9jcnQNCi1EbmJrS3ZiZHhWTkZReUxuDQotRG5ia0t2YmRTS3lGdGZrVA0KLURvQ2tLdmJkbXBaeHVrWkMNCi1EbmNMS3ZiZEdGalNPSlRxDQotRU9jS2p2YmRoa2RjbXRjWg0KLURvQ2pqdmJkeXplT1JnaGgNCi1FUENrS3ZiZFJiRGVNSlpMDQotRG9ETEt2YmRaTVJjdE9NTg0KLUVPYmpqdmJkQU1neVN2eXgNCi1FT2NMS3ZiZFRZTE1OemtZDQotRG5iamp2YmRtdVZaampTRw0KLURuYmtLdmJkWnNpSXlEcm4NCi1FUERMS3ZiZGpFamZ1UEFPDQotRG9Damp2YmRreHJyU3hnVQ0KLURuY0tqdmJkU0xZZlVma1QNCi1EbmJqanZiZEJjcEF2Sm1HDQotRG9ETEt2YmRTUHNnS0Zjdw0KLURvQ2tLdmJkclhRTURJeVINCi1FT2JrS3ZiZEtWdUZkRWZpDQotRG5ia0t2YmRyU1ZMT0xCTg0KLURvREtqdmJkWm5taGRlWmoNCi1Eb0RLanZiZE5IRFFOUHVMDQotRG9ES2p2YmRweU9nZ1JFWQ0KLURvQ2tLdmJkUXZtY2JsSUQNCi1FUENrS3ZiZE1mYm9tUVZMDQotRVBDamp2YmROVlRSam1BWA0KLUVPY0tqdmJkYmhsaWpldngNCi1FT2JrS3ZiZFdXaVh2RUZIDQotRG5jS2p2YmRscXlWWnJkSg0KLURuYmpqdmJkclNVa05qYU4NCi1EbmNMS3ZiZG1TWlV6VERpDQotRU9iamp2YmRaUW1FaG1FcQ0KLUVPY0tqdmJkaUxkY25WRFoNCi1FT2JrS3ZiZHlTbWhscWFnDQotRG5iamp2YmRiVWFnWUxUaA0KLURuY0tqdmJkQmRRQXZLTkcNCi1EbmNMS3ZiZHl6ZG5SZ2hoDQotRU9ia0t2YmRMWlJLU3p0Zg0KLURvRExLdmJkUlhPRURNSGMNCi1EbmNLanZiZEZrRlNiZ21WDQotRVBDamp2YmRaUWxkaU1lUg0KLUVQRExLdmJkRmZKcW1pVHENCi1FT2NMS3ZiZHBzc2dSckt0DQotRG5iamp2YmRLUlplT2VtZQ0KLURuYmtLdmJkblB6WXZMWkMNCi1Eb0RMS3ZiZFVWbFFKc2FSDQotRVBDamp2YmRxRmNlVHZBaA0KLUVQREtqdmJkRUFSaGx5dncNCi1FUENqanZiZE5HYm9sb3RrDQotRG9Damp2YmRWaFlXWGdZeg0KLURvQ2pqdmJkVXRNdEZrdksNCi1EbmNLanZiZFpRbGRobGVSDQotRG5iamp2YmRDRVBhV0tNZg0KLUVPYmpqdmJkdVdPWGpRc0ENCi1FT2NLanZiZElqRUFLUGZkDQotRG9Damp2YmRVUlJQVXVJTg0KLUVPYmtLdmJkYmhtS0tmV3gNCi1Eb0RLanZiZHhybkpNckNIDQotRU9iamp2YmRHRmlyTmlUcQ0KLURvRExLdmJkdFNxc1paZUQNCi1FUERMS3ZiZEtrQWhXQUp5DQotRVBDa0t2YmRiVkJnWUtzaA0KLURvQ2pqdmJkS1dWRmRGR2kNCi1FUERLanZiZHdYTUF1YVdWDQotRG9Da0t2YmRSWE5kQ2toRA0KLUVQQ2pqdmJkWlJNZGhtRXENCi1EbmNMS3ZiZGNKTWlqZld4DQotRG5ia0t2YmRaUk5FaU5GUg0KLUVPYmpqdmJkQU1oWXJ2eXgNCi1FUERMS3ZiZGlqR0lKbVhyDQotRG9Da0t2YmRiaG1KamZYWQ0KLUVPY0xLdmJkcnpNUVRCSG4NCi1EbmJrS3ZiZEtWdGZFRWZpDQotRVBDa0t2YmR4Vk5GUlpNTw0KLUVQRExLdmJkamNNTFFnVWcNCi1FT2JqanZiZGp1d09EYlh3DQotRU9ia0t2YmRaZVhmemhKQw0KLUVQQ2tLdmJkVXlJVHlqb08NCi1FUENrS3ZiZEdGalJuSXNxDQotRG5iamp2YmRJd3NiSGxSUQ0KLURuY0tqdmJkdFRTVFl6RWMNCi1FUERLanZiZGhmakN5V0tWDQotRG9Damp2YmRoeXRlbFFuRw0KLURvREtqdmJkeG5USHhUSWMNCi1FT2NLanZiZFVRcVBVdGdtDQotRVBETEt2YmRrTkNNWmRnUA0KLURuYmtLdmJkR0tlVERJTlYNCi1FT2NMS3ZiZFpNUmNzbWxODQotRG5iamp2YmRSWE5kQ2tnYw0KLURvQ2pqdmJkUlhOY2NNSGMNCi1FT2JrS3ZiZFJqeUZ1R2pzDQotRVBETEt2YmRtSkR0UlVyQg0KLURvRExLdmJkcHlQSUdwZFkNCi1FUENqanZiZGtOQ0x6RWdQDQotRG9ETEt2YmRab05pRkV6Sw0KLURvREtqdmJkS1Z1RmNkZmkNCi1Eb0RLanZiZHFaT2dnUWRZDQotRVBDa0t2YmRTUVRnSmVjdw0KLUVPY0tqdmJkclJ1S25MQW0NCi1FT2JrS3ZiZGJVYkhZTFVJDQotRU9jTEt2YmR5TnJnd3NKRA0KLURvREtqdmJkZWdrVnFuUWcNCi1EbmJrS3ZiZEdCT3B4aXptDQotRU9ia0t2YmRKYmpEUWljWQ0KLURuY0xLdmJkU0xaRnVHanMNCi1Eb0NrS3ZiZEdja1ZpYkpqDQotRG9Da0t2YmR6ZVpuemR5cA0KLUVPYmpqdmJkeHhKS0NRWmsNCi1FT2JqanZiZEpwekZQR05lDQotRVBDa0t2YmRVc2x0R0x2Sw0KLURvRExLdmJkeml1UVFEc1UNCi1EbmNMS3ZiZFJ6S0lTY1dBDQotRG9Da0t2YmRTTFlmVkdqcw0KLUVQQ2pqdmJkaGdLRFl1alYNCi1Eb0RLanZiZHR1blhqUXNBDQotRVBES2p2YmRxY2VKUG5XQg0KLURuY0tqdmJkVVFxT3VVaE4NCi1FT2NLanZiZEp2VkZjZUhKDQotRVBDa0t2YmRNZmNQbVFWTA0KLUVPYmtLdmJkTnJzdWZkdHANCi1EbmNMS3ZiZFVRcG51VWhODQotRG5jS2p2YmRZa3FkVU9NTg0KLUVPYmtLdmJkcWNlSlFOdkINCi1FUERMS3ZiZENXemRKRlB2DQotRG5jS2p2YmRhdUJmeExUaA0KLURuY0tqdmJkWm5uSkVkeWoNCi1EbmNMS3ZiZEV2WXBQbGllDQotRG9ETEt2YmRoYW9DZHZwcQ0KLUVPYmtLdmJkQ0VRQlZpbUcNCi1FT2NLanZiZEJpS2JLaGZLDQotRG5ia0t2YmRldXp3cEp6cw0KLURuY0xLdmJkaGxFY25WRFoNCi1FT2JrS3ZiZGtDa2pwZnRnDQotRG5jS2p2YmRaUWxkaG1FcQ0KLURvREtqdmJkRnlWVkJFWGINCi1EbmNLanZiZFppcmdvZ0NHDQotRVBDa0t2YmRXWEpYdkVGSA0KLURuYmtLdmJkT1N0VmZkdVENCi1EbmJrS3ZiZE5HYnBNb3VMDQotRU9ia0t2YmRjSWxqS2ZYWQ0KLURvRExLdmJkWHJsQk1zbngNCi1FT2NMS3ZiZGZORndHbUprDQotRU9iamp2YmRVUXFQVXVIbQ0KLURuYmpqdmJkRVh4THRVVGwNCi1FUERLanZiZExHRmhDQlF1DQotRG5jS2p2YmRUWUxMbXprWQ0KLURvQ2tLdmJka2FOUE5BTEENCi1Eb0NqanZiZEZ4dHVCRHdiDQotRVBETEt2YmRHR0pyTmhzcQ0KLURvQ2tLdmJkWnlFSm5ETHINCi1FT2JrS3ZiZER4WGxUc3NsDQotRVBDa0t2YmRHS2RyYmdsdQ0KLUVPY0xLdmJkbW95eVZqeGINCi1EbmJrS3ZiZFJOWUJ5TnR6DQotRU9iamp2YmRHRmlyT0l0Ug0KLURvQ2pqdmJkeFVtRlJaTG4NCi1FUENrS3ZiZHNRV1BKY1dHDQotRVBDamp2YmRlZ2tXU09SSA0KLURuY0xLdmJkWXpjR1JqVnkNCi1Eb0NrS3ZiZFJYTmNibEhjDQotRU9ia0t2YmR3dGxkcVlrbg0KLURuYmtLdmJkWmlzSHBHYWYNCi1FUENrS3ZiZEdRQVN2ZmV5DQotRG5iamp2YmRlRlBSYXZiag0KLUVPY0xLdmJkR1pWVkJFWUMNCi1FUENrS3ZiZEtES0RRaWNZDQotRVBDa0t2YmRVc21VRmt1ag0KLURvQ2tLdmJkYXRiSFhqdEkNCi1FT2JrS3ZiZGxyWXR5cmRKDQotRG5iamp2YmRqS0dIaWx3cg0KLUVPY0tqdmJkamxha3llR28NCi1Eb0RMS3ZiZG5QelpWa1pDDQotRG5iamp2YmRDSWpiTEpGag0KLURvQ2tLdmJkZWdrV1NPUkgNCi1Eb0RMS3ZiZGp2WE9EYllYDQotRVBES2p2YmRhYVZlRm9vdw0KLURuY0tqdmJkd3RtRlJaTG4NCi1FT2JrS3ZiZGtOQ0x6RWZvDQotRG5jTEt2YmRyYkdNbEdrWg0KLUVPYmpqdmJkY3paUVh4cUMNCi1Eb0NrS3ZiZHVhRVpUT2RoDQotRU9iamp2YmRaeGNqTmJrcg0KLUVPY0tqdmJkQ0pLYktpRmoNCi1EbmJqanZiZGpFa0d1UEFPDQotRG5iamp2YmRac2hoeURzTw0KLURvRExLdmJkYnNDa1VEakINCi1Eb0NrS3ZiZE5kZFVJaGtFDQotRVBETEt2YmR1Vm5ZSnBzQQ0KLURuYmpqdmJkUXZtY2NNSGMNCi1Eb0RLanZiZERqSUtXWGpBDQotRG9ETEt2YmR4WmhHR1lFcg0KLUVPYmtLdmJkcXF1S21rQk4NCi1FT2JqanZiZExCTEhNYXdxDQotRG9ETEt2YmRyYkZtTGdMWg0KLUVQRExLdmJkZGRuckJ3Q2oNCi1Eb0NrS3ZiZGJyY0xVRUtCDQotRG9ES2p2YmRxbHlqWWxIaQ0KLURuY0tqdmJkUXdOZERNSUQNCi1FT2JrS3ZiZEJpTENLaGVqDQotRVBDa0t2YmRTWmlnc0RXQQ0KLURuYmtLdmJkd3VORlJZbE8NCi1FUERMS3ZiZHVDYnR2dk9vDQotRG5iamp2YmRhYVdGRnBQdw0KLUVPYmtLdmJkUkVDYVFRZFMNCi1EbmNLanZiZHlPU2hYc0pEDQotRVBDa0t2YmRGVnlQb21KZQ0KLURvRExLdmJkY0pNaWpldngNCi1FT2JrS3ZiZFNaaWdzQ3ZBDQotRU9iamp2YmRyTlpqWWxIaQ0KLURuYmtLdmJkS2ZGaEJhUlYNCi1FUERMS3ZiZFNMWkZ0Z0tzDQotRVBETEt2YmRyYkdOTUdqeQ0KLUVQQ2pqdmJkZHd6VHRTRnoNCi1Eb0RMS3ZiZG5HZHhOTmdaDQotRG5jTEt2YmRUZnptbFd1ZQ0KLUVPY0tqdmJkYkxMZk9tY0ENCi1Eb0RMS3ZiZE5HY1FOUHVMDQotRG5jTEt2YmRVYUNRc1FxeQ0KLUVQQ2pqdmJkQ2ZrZkhBemMNCi1FUERLanZiZGxyWXVac0RpDQotRVBETEt2YmRtYWpYWVBPVg0KLUVPYmpqdmJkdUNjVXZ2T28NCi1Eb0RMS3ZiZEpYc2FoTHFRDQotRVBDa0t2YmRPU3N1Z0V1UQ0KLURuYmtLdmJkdWFEeVRPZUkNCi1EbmNMS3ZiZFlxTkVobGRxDQotRU9jTEt2YmRlT2RzS3RVUw0KLUVPY0tqdmJka0hnTGVmT0wNCi1FUENrS3ZiZHJwVm9LQ3VmDQotRU9iamp2YmRTaHpKcUFBbA0KLURuYmpqdmJkZ1BhendEeEkNCi1FUERMS3ZiZEV6dFFkbERKDQotRG9ES2p2YmRZcG1GSW1GUg0KLURuY0xLdmJkc0JlbGxITFoNCi1Eb0NqanZiZGF0YkhZS3NoDQotRG9Damp2YmRwdFRnUnJMVQ0KLUVPY0xLdmJkem5wUkZDa3gNCi1FUENqanZiZFdXaVlXRUZIDQotRVBDamp2YmRSb3NnSmVkWA0KLURuYmpqdmJka0lHa2VmT0wNCi1EbmJqanZiZGladUdMcU5mDQotRVBDa0t2YmRBTklaVFd5eA0KLUVPYmpqdmJkWlFtRkpNZHENCi1FT2JrS3ZiZGp2V21jYllYDQotRG5jTEt2YmRSYkVGTUpZaw0KLUVPY0tqdmJkcGZEZHRWYUkNCi1FUERLanZiZEpxWmVQRm5GDQotRG5iamp2YmRlRk9xYXZjSw0KLURvQ2pqdmJkbkhGWGxuSFoNCi1FUENqanZiZFR2THBLVGFSDQotRVBETEt2YmRWZ3hWeEhZeg0KLUVPYmtLdmJkWlJORkpNZHENCi1FUERMS3ZiZGJVYWZ3a1VJDQotRU9iamp2YmRLQ2pEUWlieA0KLUVQRExLdmJkclhQbENoeVINCi1Eb0NqanZiZHhzTmhscWJIDQotRG9ES2p2YmROR2JvbVB0aw0KLUVQRExLdmJkTEJMR21Cd3ENCi1EbmNMS3ZiZElzWkJUTllNDQotRVBETEt2YmRPWG51emNtdA0KLUVQREtqdmJkS0RKY1JKY1kNCi1FT2JrS3ZiZGlCbmNGV3FSDQotRG5jTEt2YmRsaGNzcVVyQg0KLURuY0tqdmJkcnlsUVRBZ24NCi1Eb0RMS3ZiZFRsV09hV09pDQotRVBDa0t2YmRlZ2p1ck5wZw0KLUVPYmpqdmJkeVROaG1TQmcNCi1FUENqanZiZFFjY0JQcGNyDQotRVBES2p2YmRlT2VTa1R0Uw0KLURvQ2pqdmJkR1l1VkFkWGINCi1FT2JqanZiZHJ6TVBzQWhPDQotRG5jTEt2YmRyRUZKUU9WYQ0KLUVQQ2pqdmJkYmhtS0tmV3gNCi1FUENrS3ZiZGVZWnNzcWV6DQotRG5ia0t2YmRVUlFudHVIbQ0KLUVQRExLdmJka0RMa1JIVkgNCi1FT2NLanZiZGxaU3JTeGZ0DQotRU9ia0t2YmRpakdIaW1Ycg0KLUVPY0xLdmJkcHhuZ2dRZFkNCi1EbmNLanZiZEpLRUFKcEdkDQotRVBDamp2YmRNb3dwdW1mcw0KLURvQ2tLdmJkbVNZdHlzRGkNCi1Eb0RMS3ZiZEJzQkRUZldyDQotRVBETEt2YmRyTXpLWk1IaQ0KLURuYmtLdmJkQnJhRFVHV3INCi1EbmJqanZiZER4WU1UdFRsDQotRG5jS2p2YmRGeVV1QkVZQw0KLUVQQ2tLdmJkVlpJVHpLbm4NCi1EbmJrS3ZiZFRrdlBCV1BKDQotRU9ia0t2YmRTUVRmakZkWA0KLURvQ2pqdmJkWmlzSVBnQmYNCi1FUENrS3ZiZExHRmhDQXFWDQotRG9Damp2YmROR2NRTlB1TA0KLURvQ2tLdmJkcWx6SnlNSUoNCi1FT2JqanZiZFp0SWlaRHJuDQotRG5iamp2YmRlRW9SYXdDag0KLURvREtqdmJkVWFCcVNxUnkNCi1FT2NMS3ZiZG1mZHdtT0d5DQotRG9ES2p2YmRwdFRmcXJLdA0KLURvRExLdmJkdkFjeHNQRWgNCi1Eb0NrS3ZiZHlTbWhtUmJIDQotRU9jTEt2YmRoZmpEWldLVg0KLUVPY0tqdmJkSGZmelpYeEgNCi1Eb0RLanZiZExGZkhhYVF1DQotRVBDamp2YmRnRmxabWZnQQ0KLUVPY0tqdmJkdGNDdVhWbm8NCi1Eb0RMS3ZiZFppcmdwR2JHDQotRU9iamp2YmROc1VXSEV1UQ0KLURvRExLdmJkc0JmTkxnS3kNCi1Eb0RLanZiZEdHS1JuSlVSDQotRG9ETEt2YmRLa0FoV0FLWg0KLURuYmpqdmJkT0ZEdEpKS2QNCi1FUENqanZiZE11U3JLbUFYDQotRG5iamp2YmR5WGlLQnBaaw0KLURuY0xLdmJkT0ZEdEloamQNCi1Eb0RLanZiZE5QeFF1bWdUDQotRG5iamp2YmRyU1ZMT0thTg0KLUVQQ2pqdmJkbUpEdFJWUmENCi1FUENrS3ZiZFplWGZ6Z2lDDQotRG9ES2p2YmRoYW9DZHdSUg0KLURuY0tqdmJkaUJuY0ZYUlINCi1FUERMS3ZiZHZCRVlybmRoDQotRG5iamp2YmRCaUxCa0lmSw0KLUVQRExLdmJkaGdKYnlWalYNCi1EbmNLanZiZHpSUE5JaXdBDQotRG5iamp2YmRlZ2p2Um1wZw0KLURuY0xLdmJkeVlJaWJRWmsNCi1FUENrS3ZiZHhuVElYcmhjDQotRVBDa0t2YmRoa2VFT1VieQ0KLURuYmtLdmJkakplaEtNeFMNCi1Eb0RLanZiZGtWd09EYllYDQotRVBDa0t2YmRGV1lwUU5LRg0KLUVQQ2pqdmJkWHJrYU1zbngNCi1FUERLanZiZFJqeGV0Z0xUDQotRG9ES2p2YmRFenRSRkxiaQ0KLURuYmtLdmJkcWRGSlFOdWENCi1FUERMS3ZiZFRxUW50dGhODQotRG9ETEt2YmRZT1JBWHR2VQ0KLURuYmpqdmJkRVlYa3NzdE0NCi1FUERLanZiZGtNYk1aZGZvDQotRG5jTEt2YmRKS0VBS1FHZA0KLUVPY0tqdmJkRmVqU09KVVINCi1Eb0NqanZiZFlsUmRUbWttDQotRG9ES2p2YmRsWXJxcnhnVQ0KLUVQREtqdmJkS1Z1RmRGR2kNCi1FT2NMS3ZiZEpxWmVPZk5lDQotRG5ia0t2YmR6b1BwZGNMeA0KLURvREtqdmJkZGVQU0NYQ2oNCi1Eb0RLanZiZEVBU0lseXdYDQotRG9Damp2YmRyRUVpUG11YQ0KLUVQQ2tLdmJkaWRrR3VQQU8NCi1FT2JqanZiZEtSWmRuZk5lDQotRG5jS2p2YmRoZ0pjWldKdQ0KLUVQRExLdmJkWnhjaW1ia3INCi1FUERLanZiZE5lRVVJaUtkDQotRU9jS2p2YmR2QWRaU25kaA0KLURuY0xLdmJkamdnTUdHTmsNCi1FT2JrS3ZiZE9TdFZnRlVwDQotRVBDa0t2YmRSYWNlTUl4aw0KLURuY0tqdmJkRHd4TVVVVU0NCi1EbmNLanZiZFdleVp0QVBUDQotRVBDamp2YmRFWVhrc3RUbA0KLUVPY0tqdmJkeHNPSk5TQmcNCi1FUENrS3ZiZEtRekZQRm5GDQotRU9jTEt2YmRKWHRDSGtwcA0KLURvQ2pqdmJkdGxZWEJVQlgNCi1FUENqanZiZHd1TkZSWWtuDQotRG9ETEt2YmRrRExqcGZ1SA0KLUVQREtqdmJkeHJtaGxxYkgNCi1FT2NMS3ZiZGptQ0x6RWdQDQotRG9Damp2YmR1YUVZc1BGSQ0KLUVQQ2tLdmJkQ0VQYVdKbUcNCi1EbmNLanZiZHd0bUVweGxPDQotRVBDa0t2YmRKYmpDcGpDeA0KLURuYmpqdmJkaHpWR01STmYNCi1FUENrS3ZiZFp4Y2luRE1TDQotRG9Da0t2YmRyTlppeUxnaQ0KLUVPY0xLdmJkSUhHeXlZWUgNCi1FT2JrS3ZiZFlOcUFYdVdVDQotRVBES2p2YmR0dk53alJUQQ0KLUVQQ2tLdmJkY0pNakxGdngNCi1FUENqanZiZE5yc3ZIRXVRDQotRG9Damp2YmRuR2VZTW1nWg0KLURvRExLdmJkU0xaR1VmanMNCi1FUERLanZiZHR2T1lLUlRBDQotRG9ES2p2YmR6aXVQcEVTdA0KLURvQ2tLdmJkTWdEUGxvdGsNCi1Eb0NrS3ZiZGVGT3JDWERLDQotRG5ia0t2YmRNZ0NvbHBVaw0KLUVQQ2tLdmJkS1Z1RmRGR2kNCi1Eb0RMS3ZiZHVDY1V2dW9QDQotRG9Da0t2YmRSRGNBb3BkUw0KLUVQRExLdmJkZWhLdlNOcGcNCi1FT2NLanZiZERvQ2pqdmJkDQotRG9Damp2YmRPU3N1ZmR0cA0KLUVPYmpqdmJkR1FBU3dHZloNCi1EbmNMS3ZiZGlISmNZdWpWDQotRG5jS2p2YmRSYWRGTUpaTA0KLUVQRExLdmJkWnhjaW5ETHINCi1FUERMS3ZiZGhhb0RGWFFxDQotRG9ES2p2YmRjSk5Ka0dYWQ0KLURvRExLdmJkdWFEeVNvRWgNCi1FT2NLanZiZFV4aFVaa1BPDQotRG5jTEt2YmRWWWhUektvTw0KLURuYmpqdmJkZWhLdlJuUWcNCi1EbmJrS3ZiZE9oQVh5QVlhDQotRG5jTEt2YmR4c05pTlJhZw0KLURvRExLdmJkVHBwb1ZVZ20NCi1FT2JrS3ZiZFVSUk91VklODQotRU9jTEt2YmROc1R1Z0ZWUQ0KLURvQ2tLdmJkclhQbENoeHENCi1FUERLanZiZEhEa1dKYWpLDQotRG9Da0t2YmR4blRIeFRJYw0KLUVQREtqdmJkRXZaUG9sakYNCi1FUERLanZiZHJ6TVFUQklPDQotRVBDamp2YmRxWlBIZ1FjeA0KLURvQ2tLdmJkVnFteENGTUQNCi1EbmNMS3ZiZFNQc2dLR0VYDQotRG9Da0t2YmR6alZQb2RTdA0KLURvREtqdmJkblV0eWppcWYNCi1EbmJqanZiZElCa3lkekFEDQotRG9ES2p2YmRjVERLc2NqQg0KLUVPY0tqdmJkaUhLRFl1aXUNCi1EbmNLanZiZEJyYURVRnZyDQotRG9Damp2YmRRbVlDWk9Veg0KLUVQQ2tLdmJkeVNuSWxxYkgNCi1EbmJrS3ZiZGtETGpxR3VIDQotRG5iamp2YmRWcW5ZQ0ZNRA0KLURuY0xLdmJkR0tlVENnbHUNCi1EbmNLanZiZGxaU3FyeGZ0DQotRG5jTEt2YmRyRUVocE52Qg0KLUVPY0xLdmJkckRlSlFOdkINCi1FUENrS3ZiZFFtWGJZbXR6DQotRG9Da0t2YmRRbHhDWW5Veg0KLUVQQ2pqdmJkRU9ia0xXYmQNCi1FUERMS3ZiZGVoS3VxbXFIDQotRVBDa0t2YmRrQ2tqcGZ1SA0KLURuY0tqdmJkUlhOY2JsSGMNCi1FUENqanZiZHNycXJ4eWRjDQotRVBES2p2YmRkZG9TQnZjSw0KLUVQQ2pqdmJkQURSeEp6SXANCi1FUERMS3ZiZHZBY3hzUEVoDQotRVBES2p2YmRTTFlmVWdMVA0KLURvQ2tLdmJkc3JyVFl5ZUQNCi1Eb0NrS3ZiZExGZWdiQXB1DQotRVBDamp2YmR5cU9saUp3QQ0KLUVQREtqdmJkcVR0R3JSanQNCi1FUENrS3ZiZGhiT2JkdnFSDQotRVBDamp2YmRjU2NMVUVKYQ0KLURvRExLdmJkUlduRGJsSUQNCi1FT2JrS3ZiZFpMckVUbkxtDQotRG9ES2p2YmRpQm9ERXZwcQ0KLURvREtqdmJkTXBYcVZtZnMNCi1FUENqanZiZHB4bmdmcGN4DQotRG5jS2p2YmRzQ0dOTGZqeQ0KLURuY0tqdmJkUmp5R1ZITFQNCi1FUERLanZiZGtIZmxHRm1rDQotRG9ES2p2YmRsaGRVUXVTQg0KLUVQQ2pqdmJkS2FMR2xiWHENCi1FUENrS3ZiZFZoWHZYZ1l6DQotRU9jTEt2YmRLeVFpcnp0Zg0KLUVPY0xLdmJkbGlEc3FWUmENCi1EbmNLanZiZEp1dGZEZGZpDQotRG9ES2p2YmRFWHdrc3NzbA0KLURuY0xLdmJkeHhJakNQeWsNCi1FT2JrS3ZiZEthS2dNYXhSDQotRVBES2p2YmRrQ2tqcGdVZw0KLUVPY0xLdmJkWkxxY3RObE4NCi1FUERLanZiZE5kZFRoaGpkDQotRU9jS2p2YmRZbFNEc21sTg0KLUVQRExLdmJkbWdFeE5PR3kNCi1Eb0RLanZiZGVQRXJqc3RTDQotRG5ia0t2YmRaUWxlSWxkcQ0KLURuY0tqdmJkcHNzZnJSa1UNCi1FT2NLanZiZER4WU1UdFRsDQotRVBDamp2YmR5U21obVNCZw0KLUVQREtqdmJkaWllaEpseFMNCi1FT2NMS3ZiZEZrRlRESU5WDQotRVBDamp2YmRWcW14Q0ZNRA0KLURuY0xLdmJkSXNaQXNNd2wNCi1EbmNLanZiZEJyYURUZlhTDQotRVBES2p2YmRtdVV5a0pxZg0KLURuYmtLdmJkRnlWVWFFWGINCi1FT2JqanZiZHpST21KSndBDQotRG5jS2p2YmRFWVhsVVVUbA0KLUVQREtqdmJkQmhqYktoZksNCi1Eb0NqanZiZEpwekVuZW1lDQotRG5jTEt2YmRWd0l3dWNlSA0KLUVQREtqdmJkaGZqRFl1aXUNCi1FT2NMS3ZiZEZwQVN3SEdaDQotRVBES2p2YmRab09KRWR5ag0KLURvREtqdmJkcWRFaVBuV0INCi1Eb0RLanZiZG5CalhZUE51DQotRG9Damp2YmRpSEtDeHVpdQ0KLUVPY0tqdmJkR0xGVENoTXUNCi1FT2NLanZiZGlNRWROdGJ5DQotRG5ia0t2YmRHZEt1akJpag0KLURuY0tqdmJkS1F5ZG5lbWUNCi1EbmJrS3ZiZHppdVBvY3NVDQotRG9ES2p2YmRtZmR4Tk5nWg0KLUVPYmpqdmJkRHhYbFVUdE0NCi1FT2JqanZiZGRlUFNCd0NqDQotRU9jS2p2YmROUHhRdk9IVA0KLURuYmtLdmJkWkhXZEFPc0oNCi1FUERMS3ZiZHlxUE5JaXdBDQotRG9Da0t2YmRweVBIZnFEeA0KLUVQRExLdmJkVXNsc2VrdWoNCi1FUENqanZiZGladGZMcG5HDQotRG9Da0t2YmRtU1pWWnNEaQ0KLUVQQ2pqdmJkcHlPaEdwY3gNCi1FUERMS3ZiZHppdG9vZFN0DQotRG9ES2p2YmRWWWhVWmtPbg0KLUVPYmtLdmJkQnNBYnRHV3INCi1FUERLanZiZHZCRVlzT2RoDQotRU9ia0t2YmRHY2p1aWJLSw0KLURuY0tqdmJkZUFUcU5ZS0cNCi1Eb0NqanZiZEtOQUVaZ1ZCDQotRG5jTEt2YmRxVVVIU1JqdA0KLUVPY0xLdmJkR2NqdWliSmoNCi1Eb0RMS3ZiZG5CaXZ4UE9WDQotRG5ia0t2YmRLQ2pEUktDeA0KLURuYmtLdmJkcnlrb3NBZ24NCi1FT2NLanZiZFVhQnFUUlJ5DQotRVBDamp2YmRjU2JrVGNqQg0KLURvRExLdmJkSXhUYklMcHANCi1Eb0NqanZiZEhEanVpYkpqDQotRG5jS2p2YmR1YUR4cm9GSQ0KLURvREtqdmJkcGVkRXRXQkkNCi1FT2NLanZiZFhzTGFOVG54DQotRVBDamp2YmRZT1JBWVZXVQ0KLURvQ2pqdmJkWXBsZUlsZVINCi1Eb0RLanZiZENEcEF1ak1mDQotRVBDa0t2YmRweG9IZnBjeA0KLURvQ2tLdmJkVVdNUGlzYVINCi1FUENqanZiZG11VXpLalNHDQotRVBES2p2YmRreHNSc1lnVQ0KLUVQQ2tLdmJkWnhjak5ibFMNCi1EbmJrS3ZiZGJQZmZja3pkDQotRVBES2p2YmRVVmtwSnRCUg0KLURvQ2tLdmJkdmx2QU5FRk4NCi1FT2JrS3ZiZFNoeWpSQUFsDQotRVBES2p2YmR4cm1obVNDSA0KLURvREtqdmJkanZYTmNhd3cNCi1FUERLanZiZGtETGpxR3VIDQotRU9ia0t2YmRoZmlieHVpdQ0KLUVQQ2pqdmJkbHF5VXlyY2kNCi1FUERMS3ZiZEZWeG9wTWpGDQotRU9jS2p2YmRxZEVpUG5XQg0KLURuY0tqdmJkclhQbENoeHENCi1Eb0NrS3ZiZHhWTWVSWWtuDQotRVBDamp2YmRsaGRVUXRxYQ0KLUVPYmpqdmJkUm90SEtGY3cNCi1FT2JrS3ZiZHdqdmNnenpHDQotRVBETEt2YmRCaGtCamlGag0KLUVPYmpqdmJkbFpUU1RaR3QNCi1Eb0NrS3ZiZGtJSE1GZW1rDQotRU9iamp2YmRkbmRya1Rzcg0KLURvRExLdmJkRlZ4cFFOS0YNCi1FUENqanZiZFpzaUpaRVRPDQotRU9iamp2YmRpTUZFT1VieQ0KLURvQ2tLdmJkaGxGRU9VYnkNCi1FUENrS3ZiZHJXb2xESXlSDQotRU9iamp2YmRtYWpXd29PVg0KLURvQ2tLdmJkeXBvTWlKd0ENCi1Eb0RLanZiZENEcEF2S01mDQotRVBETEt2YmR6alZRUURydA0KLUVPYmpqdmJkamxha3lkZm8NCi1FT2JrS3ZiZEpweWVPZW1lDQotRG9ETEt2YmRpSEpjWXZKdQ0KLUVPY0xLdmJkYnNES3RFS0INCi1FT2NMS3ZiZHJwV09qRFZmDQotRU9iamp2YmRlbGZXZm1LTA0KLUVPYmpqdmJkeG5TZ3dyaUQNCi1EbmJrS3ZiZHFseWpaTGhKDQotRVBDa0t2YmRRZERCUHFEcg0KLUVQQ2tLdmJkUmtZZlVmanMNCi1FT2JqanZiZGh0eWR3U1ZDDQotRG5iamp2YmRXV2h3dkRkZw0KLURvRExLdmJkeXBubGlLWEENCi1EbmNMS3ZiZGhmaWJ4dktWDQotRG5jTEt2YmR4cm1pTlNDSA0KLURuY0tqdmJkVWFCcVNxUnkNCi1Eb0RLanZiZFpNU0RzbWttDQotRG5jTEt2YmRGamVTY0htVg0KLUVQRExLdmJkUVltQUhTcksNCi1Eb0NrS3ZiZFVWbFFKc2FSDQotRG9ES2p2YmRHS2RzREhtVg0KLUVQQ2tLdmJka0hnTGZHTmsNCi1FUERLanZiZENJa0NMSkZqDQotRG9Da0t2YmRycFdPaWNWZg0KLURuY0xLdmJkcW1aaXlNSUoNCi1FT2JrS3ZiZE5HY1FNcFVrDQotRU9jTEt2YmRoZmlieHVpdQ0KLURvQ2pqdmJkamNManFIVkgNCi1FUERMS3ZiZFp4ZEpuRE1TDQotRG5jTEt2YmRIRGtWaWFqSw0KLUVQREtqdmJkaHl0ZWxSTmYNCi1FUERLanZiZFpSTkZJbGVSDQotRU9iamp2YmROUVlSV05nVA0KLUVQQ2pqdmJkTmRjc2lJa0UNCi1Eb0NrS3ZiZGFqa2ZPbkRBDQotRVBDamp2YmRSTllDWk9Veg0KLUVQQ2tLdmJkQmNwQXZLTkcNCi1EbmNLanZiZHFUc2ZxckxVDQotRVBDamp2YmRzWmxRU2FIbg0KLUVPY0tqdmJkcWRGSXBOdkINCi1Eb0NqanZiZHRiY1V3V1BQDQotRU9iamp2YmRFWVlNVHRUbA0KLUVPY0xLdmJkZ0dMek5mZ0ENCi1Eb0RMS3ZiZHpkeW56ZVpwDQotRG5iamp2YmRhamxHUE5jQQ0KLUVQQ2pqdmJkRUpoSnV4S0ENCi1FUENqanZiZExMQklXQUp5DQotRG5ia0t2YmR3eklGZXdkcg0KLURvQ2tLdmJkQnZ6Y2lFcFcNCi1Eb0RLanZiZGFOS2FzVk5IDQotRVBETEt2YmRWdmlYdWRFZw0KLUVQREtqdmJkY2JTbVNBVU4NCi1FUERLanZiZHFjZGlRTnVhDQotRVBDa0t2YmRiQlZkZlBwWA0KLUVPY0xLdmJkckVGSXBPVmENCi1Eb0RLanZiZERpZ2l2WGpBDQotRG9ES2p2YmRZU2xCTXRQWQ0KLURvREtqdmJkclJ0am5MQW0NCi1Eb0RLanZiZEtlZWdiQXB1DQotRG5ia0t2YmRIZ0haeVh4SA0KLUVQQ2tLdmJkZHd6VVRyRnoNCi1EbmJqanZiZHVEQ3R3V1BQDQotRU9jTEt2YmRhUmZESHNmTA0KLUVQQ2pqdmJkZGVPcWJXYmoNCi1EbmNMS3ZiZE9GRHNpSkxFDQotRU9ia0t2YmRTQmNlTUl5TA0KLUVPY0xLdmJkcnlsUVNhSU8NCi1EbmNMS3ZiZEpjSmNRakN4DQotRVBDa0t2YmRhUmZDZ3Nlaw0KLUVPY0tqdmJkeml0b29jc1UNCi1Eb0RLanZiZHl6ZG5TSUpJDQotRU9ia0t2YmRkbmRzTFRzcg0KLURvRExLdmJkY1RES3RFS0INCi1FUENrS3ZiZGRaeVFZWXBiDQotRVBETEt2YmRDSWpha0pGag0KLURuY0xLdmJkTHJXbHpWUXoNCi1FT2NLanZiZHhybklscWFnDQotRG5jTEt2YmRkZU9yQ1djSw0KLURvQ2tLdmJkUmFjZUxpWkwNCi1FUENrS3ZiZGRlUFNDWENqDQotRG9ES2p2YmRKcHpGT2VtZQ0KLURvQ2tLdmJkaU1GRU9VYnkNCi1EbmNLanZiZFVRcVBWVkhtDQotRU9jTEt2YmRjU2Jqc2NqQg0KLURuYmpqdmJkdlBUenBqb1UNCi1FUERLanZiZEVQRExLdmJkDQotRG5jS2p2YmR2QkVZc1BFaA0KLURuYmpqdmJkSXhUYklNUXANCi1Eb0RMS3ZiZFpMckVUbk1ODQotRVBDa0t2YmRaeGRKbWJrcg0KLUVQQ2pqdmJkSWlkQUtRSEUNCi1EbmNLanZiZHJTVWptamFODQotRG5ia0t2YmRrYU5PbUFMQQ0KLURuYmtLdmJkaUdqQ3lWaXUNCi1FUENqanZiZFlrckRzbWxODQotRU9jS2p2YmR5cG9NaGpYQQ0KLURvQ2tLdmJkaUdqRFpWaXUNCi1Eb0RMS3ZiZFp4Y2luQ2xTDQotRG9Damp2YmRxVVVHclNMVQ0KLURuYmtLdmJkWVRMYU5VUFkNCi1FT2JrS3ZiZGVoS3VyTnBnDQotRU9jS2p2YmRtUnlWWnJkSg0KLUVPYmtLdmJkWmlyaFBnQmYNCi1FT2NLanZiZHB5T2dnUWN4DQotRG5ia0t2YmRmb2F6d0VYaA0KLURuYmtLdmJkbXVVekxKcWYNCi1FUERMS3ZiZFlsUmRVT0xtDQotRG5jS2p2YmRSanlGdUdqcw0KLURvRExLdmJkUWREQW9wZFMNCi1Eb0NrS3ZiZG1TWXR5c0VKDQotRU9iamp2YmRRZERBcFJEcg0KLURvREtqdmJkeU9USHhTaGMNCi1FUERLanZiZHB0VUhTUmtVDQotRU9jS2p2YmRMR0dIYWFSVg0KLUVPY0xLdmJkYWFXRkZvcFgNCi1Eb0NqanZiZGxCTW5tQUxBDQotRG5iamp2YmRabm5JZGVaag0KLURvQ2pqdmJkWk1SZFVOa20NCi1Eb0RMS3ZiZFJNeEJ5TnR6DQotRVBDa0t2YmRKWVRhaE1SUQ0KLURuY0xLdmJkcHlQSUhRZFkNCi1Eb0NrS3ZiZFZCQ1JUUlJ5DQotRU9jTEt2YmRaeUVLT0RMcg0KLUVPYmtLdmJkUmFkRWtpWWsNCi1FT2NLanZiZGN5eVFYeVJDDQotRG5ia0t2YmRWcW5YYWRrYw0KLUVQQ2tLdmJkR0tlVERJTXUNCi1EbmJrS3ZiZHJSdGpuS2FODQotRU9ia0t2YmRGVnhvb2xqRg0KLURvREtqdmJkRG9Damp2Y0UNCi1EbmJrS3ZiZGRuZVRMVHNyDQotRVBES2p2YmRHY2p2S0NLSw0KLUVPYmpqdmJkZ1BhenZkWUkNCi1Eb0RLanZiZFNMWWZWSEtzDQotRG9Da0t2YmRFUENqa1diZA0KLURuYmpqdmJkbWFpdnhQT1YNCi1FT2JqanZiZEpKZEFKb2dFDQotRG9ES2p2YmRoa2RkTnRieQ0KLURvQ2tLdmJkaUNQREV3UXENCi1FT2NLanZiZG1halhZT211DQotRG5ia0t2YmRxWW5nZnFFWQ0KLUVPY0tqdmJkVHBwb1V1SU4NCi1FUERLanZiZE5kZFRoaGtFDQotRG5jS2p2YmREbmJrS3ZiZA0KLURuYmpqdmJkWlJORWlORlINCi1FUENqanZiZGFhV0ZGb3BYDQotRVBETEt2YmRCaGpiS2hlag0KLURvQ2tLdmJkZnBCenZjd2gNCi1Eb0RLanZiZG1TWlZacmRKDQotRU9ia0t2YmRiQXVlR1FRWA0KLUVPY0tqdmJkTlFYcVdPR3MNCi1FUENqanZiZHZBY3lTbmRoDQotRU9jTEt2YmR5U25JbVJhZw0KLUVPYmtLdmJkU3hMTG16a1kNCi1EbmJqanZiZGNKTWpMR1hZDQotRU9ia0t2YmRCc0JEVUZ3Uw0KLURvQ2pqdmJkcWx5alpMaEoNCi1FUENqanZiZGxpRVVSVlJhDQotRG9ES2p2YmRwdFRnUnJMVQ0KLURuY0tqdmJkaUJvQ2R3UXENCi1FT2NLanZiZEVPY0xMWERFDQotRU9iamp2YmRFWVlMdFRzbA0KLUVQREtqdmJkVlRtVGVrdWoNCi1EbmNMS3ZiZExGZWdiQlF1DQotRVBDamp2YmRtdHR6TEtSZg0KLUVQRExLdmJkcGZFRlR1YUkNCi1EbmNLanZiZGlpZWdqTXdyDQotRU9ia0t2YmR4Vk5FcVlsTw0KLURvQ2pqdmJkUlduRGJsSGMNCi1FUENqanZiZGFTRmJndEdMDQotRG5ia0t2YmRvem1jandvQQ0KLURvREtqdmJkUHlOQUhTcksNCi1EbmNMS3ZiZFZxblhiRWtjDQotRVBDa0t2YmRGV1lwUU5KZQ0KLUVPY0xLdmJkbFlzUnNaSFUNCi1FT2NMS3ZiZFF2bWNibElEDQotRU9iamp2YmRSa1lldGZrVA0KLURvQ2pqdmJkRmpkc0RJTlYNCi1FUENqanZiZHJhZk5NR2taDQotRVBES2p2YmRjelpRWHhxQw0KLUVQRExLdmJkRHd4THRUc2wNCi1Eb0NqanZiZEZwQVN2ZmZaDQotRG9Damp2YmRpTUVkT1ZDeQ0KLURvQ2tLdmJkZWxldmZsakwNCi1EbmJqanZiZGFTRmNIdEZrDQotRG5jS2p2YmRCaGtCa0lmSw0KLUVPYmpqdmJkR0tkc0RIbVYNCi1EbmNMS3ZiZGh6VWVrcU9HDQotRU9jTEt2YmRac2hpWkRybg0KLURuY0xLdmJkRGpJSnV3akENCi1FUENqanZiZHB4b0hmcUVZDQotRVBDamp2YmRPQUlyc2pTQQ0KLUVQRExLdmJkRXV5UG9saWUNCi1FUERLanZiZHNzUnJ4eWRjDQotRVBES2p2YmRqbGFrekVnUA0KLURuY0tqdmJkaVV5ZHdSdUMNCi1Eb0NrS3ZiZFpNU0R0TmttDQotRVBETEt2YmRiQlZlR1FQdw0KLUVPYmtLdmJkTkhEUGxwVkwNCi1Eb0RMS3ZiZERqSGl1eEtBDQotRVBES2p2YmRhdGJHd2tVSQ0KLURuYmpqdmJkZXFhV3prYm8NCi1Eb0RLanZiZHZ2bEJXQXV1DQotRU9iamp2YmRaaXJoUUhCZg0KLUVQQ2tLdmJkRG5jTEt2Y0UNCi1EbmJqanZiZGVoS3ZTTnBnDQotRG5jS2p2YmRWd0l3dWRGSA0KLURvQ2pqdmJkTlFZUlZtZ1QNCi1FT2NLanZiZE5ydFdHZVVwDQotRG5jS2p2YmR2dmxBdkF1dQ0KLURuYmtLdmJkaktHSGltWHINCi1FT2JqanZiZGhrZGROdURaDQotRVBDa0t2YmROZGRUaGhrRQ0KLUVQQ2pqdmJkc1B1bmpEVmYNCi1FUERLanZiZHhaZ2ZGd2RyDQotRG5jS2p2YmRaeURqTmJsUw0KLUVQREtqdmJkamNNTFFmdUgNCi1EbmNLanZiZHd0bUZSWk1PDQotRG5jS2p2YmRWaFh1d2dZeg0KLURvQ2tLdmJkVlpJVHlqbm4NCi1FUENrS3ZiZE5ydFdIRXRwDQotRVBDamp2YmRNZmJvbVFVaw0KLUVPYmtLdmJkZHd5c3NxZXoNCi1FUENrS3ZiZGhmakN5VmpWDQotRG9ES2p2YmR0dk9ZSnBzQQ0KLURvREtqdmJkaUxkY25WQ3kNCi1FT2JrS3ZiZExyV2x6VXB6DQotRG9Da0t2YmRTUHNnS0ZkWA0KLUVQQ2pqdmJka05DTHllR28NCi1EbmNLanZiZENTYUN0R1dyDQotRG5iamp2YmRSa1pGdGdMVA0KLURvQ2tLdmJkVkFhcHJwcloNCi1EbmJqanZiZHlYaGliUVprDQotRG9Da0t2YmRzUVZuaWJ2Rw0KLUVQQ2pqdmJkdWFEeVRQRkkNCi1EbmNMS3ZiZFVhQ1JTcHF5DQotRG9ETEt2YmRuUHpZdWtaQw0KLURvREtqdmJkUlduRGNNSGMNCi1FT2NLanZiZHhWTkZSWkxuDQotRU9jS2p2YmRSa1pHVWZrVA0KLURuYmtLdmJkdm1XQU1kRW0NCi1FT2NLanZiZG1iS1hZT211DQotRVBDa0t2YmR5WGlLQ1B5aw0KLURuYmtLdmJka0hnTUZmT0wNCi1EbmNLanZiZFZZZ3Raa1BPDQotRVBDa0t2YmREbmJrS3dDZA0KLUVPYmtLdmJkS2ZHSGFhUlYNCi1FUENrS3ZiZHFaT2dnUWRZDQotRU9jTEt2YmRUbFZuYVZvSg0KLURvQ2tLdmJkaGFuYmVXcVINCi1EbmJrS3ZiZHlwb01pSndBDQotRG5ia0t2YmR1TVh2YVVCWA0KLURvREtqdmJkZGlpcldVem4NCi1FT2JrS3ZiZHFZb0hnUWN4DQotRG5iamp2YmRGeVV1QkR3Yg0KLURvQ2tLdmJkS0NpY1FqRFkNCi1FUERMS3ZiZGV6dlllSlR3DQotRVBDamp2YmRTeEtsTnprWQ0KLURvREtqdmJkUW1ZQnlPVXoNCi1EbmJqanZiZElHZ1p4eFhnDQotRVBES2p2YmRxbVpqWkxnaQ0KLURuY0tqdmJkbWZlWU1tZ1oNCi1EbmNMS3ZiZEdkTFZpYktLDQotRG9Da0t2YmRaR3ZkQU9zSg0KLUVPYmtLdmJkalN6aHJrSnoNCi1FUERMS3ZiZGRlUFJiV2NLDQotRU9iamp2YmREeFhrc3RVTQ0KLURvQ2pqdmJkdmx2QU5EZU4NCi1FT2NLanZiZHJEZGlRT1dCDQotRG9Da0t2YmRtYWpYWG9PVg0KLURuY0tqdmJkVXRNc2VrdksNCi1FT2NMS3ZiZHh4SktCb3lrDQotRVBES2p2YmRxWW5oR3BjeA0KLUVPYmpqdmJkYXRhZndrVGgNCi1EbmNMS3ZiZGFqa2VubWNBDQotRG5iamp2YmRaUWxlSW1FcQ0KLUVQQ2pqdmJkRG5jTEt3Q2QNCi1FT2JqanZiZEhFTFdLQmlqDQotRVBETEt2YmR4cm1obVJhZw0KLURvQ2pqdmJkd1hNQldCVnUNCi1FT2JqanZiZHNQdk9qQ3ZHDQotRU9jTEt2YmRzc1NUWlpkYw0KLUVQQ2tLdmJkZG5kcmtVVVMNCi1FT2NMS3ZiZE5HYm9sb3RrDQotRU9iamp2YmRaTVNEdE5sTg0KLUVPYmtLdmJkWnNoaVljc08NCi1EbmNLanZiZER3eExzc3RNDQotRU9jTEt2YmRxWlBJR3FFWQ0KLUVPY0tqdmJkWlJORkltRlINCi1FT2NLanZiZHJEZUlvblZhDQotRG5iamp2YmRZemJlcktXWg0KLUVPYmpqdmJkZWdqdlJuUWcNCi1Eb0NrS3ZiZHVERFV3V09vDQotRVBES2p2YmRSb3RHakdFWA0KLUVPY0tqdmJkS1F5ZU9lbWUNCi1FUENqanZiZER3eE1UdFVNDQotRU9iamp2YmRwZWRGVHZBaA0KLUVQRExLdmJkRnh0dUJEeEMNCi1Eb0NqanZiZGxxeHR6U2RKDQotRG5jS2p2YmRaTHJEdE9NTg0KLUVQQ2tLdmJkR2RLdWpCaksNCi1Eb0NrS3ZiZGV6dllkaVR3DQotRG5iamp2YmRyRUVpUU9WYQ0KLURuY0tqdmJkT1lQVnpkT1UNCi1EbmJqanZiZHh3aUtDUHpMDQotRU9ia0t2YmRScFRnSmVjdw0KLURvQ2tLdmJkd3RtRXB4bE8NCi1FUERLanZiZHFGY2VUdWFJDQotRG5jS2p2YmRzUHVvSmNXRw0KLURuY0xLdmJkUnlqSHNDdkENCi1FUENrS3ZiZHlYaUphb3lrDQotRVBETEt2YmRKdlZGY2RnSg0KLURuY0xLdmJkclhQbENoeHENCi1FT2JqanZiZHZCRVpUT2RoDQotRG9ES2p2YmRxdm9rY0pZcQ0KLUVPY0tqdmJkbHF4dHpTY2kNCi1FUERLanZiZEZrRXJiZ2x1DQotRG9ES2p2YmRFUERMS3ZjRQ0KLUVPYmtLdmJkaWpGaEpseFMNCi1Eb0NqanZiZE9GRHRKSktkDQotRG5ia0t2YmR5WGhpYXBaaw0KLURuY0tqdmJkRVh3bFR0VGwNCi1EbmNMS3ZiZFp5RUtPQ2tyDQotRG5ia0t2YmRxbHlqWWxJSg0KLUVPYmtLdmJkSUdmeXh3eEgNCi1EbmJqanZiZHlOcmd4VEljDQotRG5ia0t2YmRlT2VTa1Rzcg0KLUVQQ2pqdmJkZFp5UHhaUkMNCi1EbmNMS3ZiZGtETUtwZ1VnDQotRVBES2p2YmRmSUt1cW5RZw0KLUVQQ2tLdmJkaGxGRU51RFoNCi1Eb0RMS3ZiZGlCb0NkdnFSDQotRVBDa0t2YmR5U25JbVJhZw0KLURuYmpqdmJkSXhUYWhMcVENCi1Eb0RLanZiZFpubWhkZHlqDQotRU9jS2p2YmRnUUJ6d0VYaA0KLUVQRExLdmJkZklMV1NOcUgNCi1EbmNLanZiZGpjTUtxR3RnDQotRU9ia0t2YmRLUXpFbmZOZQ0KLUVQREtqdmJkVVFxUFZWSG0NCi1FT2JqanZiZFJFREJQcGNyDQotRU9iamp2YmRuSEV4TW5HeQ0KLURuYmtLdmJkdkJEeHJuZGgNCi1EbmNLanZiZENFUGFWaW1HDQotRG5ia0t2YmRHQlBReGl6bQ0KLUVQREtqdmJkTHF3TXpWUXoNCi1EbmJrS3ZiZEVQRExMWERFDQotRVBES2p2YmR3V2thV0JWdQ0KLUVPYmtLdmJkeHJuSW1TQ0gNCi1EbmNLanZiZHNycXJ4ekVjDQotRG5ia0t2YmRwZkRlVVdBaA0KLUVQREtqdmJkakFRSEFwR2oNCi1Eb0NrS3ZiZGFTR0NoVGZMDQotRG9ES2p2YmRpSEpieHZLVg0KLUVQRExLdmJkbGhkVVJVcWENCi1FUENqanZiZEl3c2FoTVJRDQotRU9iamp2YmRHWXR1QkVZQw0KLURuY0xLdmJkTmVFVGhoa0UNCi1FT2JrS3ZiZEJ2emRJZVB2DQotRVBDamp2YmRiQXVlRnBRWA0KLUVPY0xLdmJkakFRR2FRR2oNCi1FUENqanZiZE5IRFFOUHVMDQotRG5jTEt2YmRkb0ZTa1VVUw0KLURuY0tqdmJkQUNxeEp6SXANCi1EbmJrS3ZiZHhMV2NnenlmDQotRVBDa0t2YmRUbFZuYVdQSg0KLURvQ2tLdmJkQ0pLYkxJZksNCi1Eb0NrS3ZiZER3eE1VVHRNDQotRVBDa0t2YmRFUERMS3dERQ0KLUVPY0xLdmJkVHZNUUtUYVINCi1FT2NMS3ZiZGVYeXRUckZ6DQotRVBES2p2YmROVXJyTE5BWA0KLURuYmtLdmJkWmpTaFBnQmYNCi1FT2JqanZiZGpBUGZhUUdqDQotRVBDa0t2YmRZbFJkVU5sTg0KLUVQREtqdmJkempVb29jc1UNCi1Eb0RMS3ZiZEtES0NxSmJ4DQotRVBDamp2YmRRdm5FQ2toRA0KLURuYmtLdmJkR2NrVmpCaWoNCi1FT2JqanZiZFhtcUFYdVZ0DQotRVBDamp2YmRlRlBSYXZjSw0KLURvREtqdmJkRVlYbFVUc2wNCi1Eb0NqanZiZFhybEJOVG9ZDQotRG9ETEt2YmRyUnVMTmtBbQ0KLURuY0xLdmJkRHhYbFVUdE0NCi1FT2NLanZiZHd1TkVxWkxuDQotRVBES2p2YmRFT2NMTFdiZA0KLURvQ2tLdmJkcGZEZHRWYUkNCi1FT2NLanZiZG1wWnlWanlDDQotRU9jS2p2YmR0U3JTeHpGRA0KLUVPYmtLdmJkc0JlbUxmankNCi1Eb0NqanZiZFVHem5NV3VlDQotRG5jTEt2YmRiQXZFZlBwWA0KLURuYmpqdmJkdUNjVXdWbm8NCi1Eb0RMS3ZiZFRwcG9VdUlODQotRG5jS2p2YmRZcU1lSW1FcQ0KLURvQ2tLdmJkckRkaG9tdkINCi1FT2JqanZiZGdGa3pPR2dBDQotRVBES2p2YmRTd2prbXpqeA0KLURvQ2pqdmJkUkVEQlBwY3INCi1FT2JqanZiZFlrckR0TmxODQotRU9iamp2YmRaaXNIb2dDRw0KLURuY0tqdmJkVXRNc2VsV0sNCi1Eb0RLanZiZGtIZmtlZW1rDQotRG5jTEt2YmRTTFlldUhMVA0KLUVPY0xLdmJkZUZPckJ3Q2oNCi1FT2JqanZiZEhEanZLQ0pqDQotRG5ia0t2YmRrSUdrZWVtaw0KLURvQ2tLdmJkWlFtRkpNZVINCi1Eb0NrS3ZiZHFUdEdyU0t0DQotRG5jTEt2YmRjSWxqS2ZXeA0KLURuYmpqdmJkUmp4ZlVnS3MNCi1EbmJrS3ZiZGh5dUZsUk9HDQotRU9ia0t2YmRweG9IZnBkWQ0KLURvREtqdmJkaHVaZHdSdGINCi1EbmJrS3ZiZEJkUUF2S01mDQotRG9Da0t2YmRWVGxzZWt1ag0KLUVPYmtLdmJkQ0pMQmtJZksNCi1FT2NLanZiZG1nRllOTmdaDQotRVBETEt2YmR4cm5JbVJhZw0KLURvQ2pqdmJkYktsR1BPREENCi1Eb0NqanZiZE1veFJWbWdUDQotRVBETEt2YmRLZkdJQmFSVg0KLURvREtqdmJkU0NFRWxKWkwNCi1FUENrS3ZiZG1SeHR6U2RKDQotRVBES2p2YmRqS0dJS05Ycg0KLURuYmtLdmJkbGhkVHB0ckINCi1FUERLanZiZEJjb2FWaWxmDQotRVBES2p2YmRSektJU2NXQQ0KLUVPY0tqdmJkbkhGWG1PR3kNCi1FUENqanZiZEZmSnJOaHRSDQotRG5ia0t2YmR6YUFQSEhDTQ0KLURuYmtLdmJkd1hMYVdCV1YNCi1Eb0RLanZiZEtlZWdhYVF1DQotRVBDamp2YmRSb3RIS0Zjdw0KLUVPY0tqdmJkbkdlWG1PR3kNCi1Eb0NqanZiZG1JZFRxVlJhDQotRG5jTEt2YmRmTkdXZ01paw0KLUVQQ2tLdmJkcm92UEpidWYNCi1FT2JrS3ZiZEV2WXBQbGpGDQotRG5jTEt2YmRPWVBWemRPVQ0KLUVPYmpqdmJkcnpMb3NBaE8NCi1EbmJqanZiZHl6ZG5TSUpJDQotRU9jTEt2YmRJc1pBcm1ZTQ0KLURvRExLdmJkdkFkWlRQRWgNCi1Eb0NrS3ZiZFF2bkRjTUhjDQotRU9iamp2YmR1TVlXYVVCWA0KLURuY0tqdmJkVXlIc3pMT24NCi1FUENrS3ZiZGJyYmpzY2lhDQotRU9iamp2YmRUa3VuYVZuaQ0KLUVPYmtLdmJkZUFUcG1ZS0cNCi1FT2NLanZiZHFVVGZxckxVDQotRVBETEt2YmRHWXR0YUR4Qw0KLUVQREtqdmJkUk5ZQnlOdHoNCi1EbmNMS3ZiZEFEUndpekpRDQotRG5jTEt2YmRLZkZnYWFRdQ0KLUVQREtqdmJkeFpoR0dZRlMNCi1EbmNMS3ZiZHd0bUZSWWxPDQotRU9jTEt2YmRlaExWck5xSA0KLURuYmtLdmJkS3hwaXJ6dGYNCi1Eb0NqanZiZFp4ZEtOY0xyDQotRG9ETEt2YmRyYkZtTUdqeQ0KLURvRExLdmJkcVluaEhRY3gNCi1FUENqanZiZEdLZVRESU11DQotRVBDamp2YmRaUk5FaGxlUg0KLURuYmtLdmJkZk1mWEdtSmsNCi1EbmJqanZiZFJqeUdWSEtzDQotRVBES2p2YmRaSFhFQU9yaQ0KLUVPYmpqdmJkeG5USVlUSWMNCi1EbmJqanZiZFRwcU90dGdtDQotRU9jTEt2YmRXWEl3dWNlSA0KLUVPY0xLdmJkelJPbUpLWEENCi1FUENrS3ZiZHVDYnR3V09vDQotRG5jTEt2YmRKVFpCVE13bA0KLUVPYmtLdmJkbHF5VXlzRGkNCi1EbmJqanZiZHJwVm9KY1dHDQotRG9Damp2YmRIRGp2S0NLSw0KLUVPYmtLdmJkVndKWHZEZUgNCi1FUERLanZiZFpzaUpaRHJuDQotRG9Da0t2YmRoZmpEWXZKdQ0KLURvRExLdmJkWnlFSm1jTHINCi1EbmJqanZiZG1halhYb09WDQotRG9Da0t2YmRlbGV3R21LTA0KLURvRExLdmJkVXRNc2ZNVmoNCi1FT2NLanZiZGVnanVxbXBnDQotRG5ia0t2YmRaTVJjdE5rbQ0KLURuY0tqdmJkaGxFZE9VY1oNCi1Eb0RMS3ZiZHFBaUZBWElFDQotRU9iamp2YmRkQnNNckFVTg0KLUVQREtqdmJkYVNHREh0R0wNCi1EbmJqanZiZGJWQ0d3anRJDQotRG5jTEt2YmR6ZHpPemVacA0KLUVQREtqdmJkS1F5ZVBGbkYNCi1FUERMS3ZiZGF1QmdYanRJDQotRVBETEt2YmRDU2FDdEdXcg0KLURuYmtLdmJkYnNDanRFS0INCi1Eb0RLanZiZENXemRJZVFXDQotRVBDa0t2YmRSYkRlTGh4aw0KLUVPYmpqdmJkT0VjdEpJa0UNCi1Eb0NrS3ZiZFNQdEdpZWRYDQotRG5jS2p2YmRkWnlQeFpSQw0KLURuYmpqdmJkVHVrcEtVQlINCi1Eb0NqanZiZHBzdEhScWtVDQotRG5jS2p2YmROZGN0SWhqZA0KLUVPY0tqdmJkVVdNUGpUYVINCi1Eb0NrS3ZiZExHR0hiQXB1DQotRU9iamp2YmRtb3paV0xaQw0KLUVPYmpqdmJkVUx2UEF2T2kNCi1FUERMS3ZiZGNKTWlrRnZ4DQotRG5jTEt2YmRqSmZIak14Uw0KLUVQQ2pqdmJkcVlvSUhSRVkNCi1Eb0NqanZiZGlpZkhqTlhyDQotRU9ia0t2YmRaTHJFVG5NTg0KLURuYmtLdmJkdFNxc1l5ZGMNCi1FUERMS3ZiZENJa0NMSkZqDQotRG9Da0t2YmRsaURzcVVyQg0KLURuYmtLdmJkTlB4UXVtZ1QNCi1FUERLanZiZEFDcllKeWlRDQotRU9jTEt2YmRZVE1CTXRPeA0KLURvRExLdmJkTkdjUU5QdGsNCi1EbmNLanZiZHRiYnR2dW5vDQotRG5jS2p2YmRaTHJFVU5sTg0KLURvQ2tLdmJkYW9nSEVMemQNCi1Eb0NqanZiZGdGbFptZmdBDQotRVBDamp2YmR2UFR6cGtPdA0KLURvQ2pqdmJkaktHSGpNeFMNCi1FUERMS3ZiZGF1QmdYanNoDQotRU9jTEt2YmRpQm9DZVdwcQ0KLUVPYmtLdmJkU1BzZmpHRVgNCi1EbmJrS3ZiZHpHeGxBTWVYDQotRG9ETEt2YmRxRmNkdFdBaA0KLUVQQ2tLdmJkT1lPdXpjbXQNCi1Eb0NqanZiZER3eEx0VVRsDQotRG5ia0t2YmRPVFVWZ0ZVcA0KLURuYmtLdmJkaUdpYnlXSnUNCi1FUENqanZiZFV5SVR6TE9uDQotRG9Da0t2YmRiTE1Gbm5EQQ0KLURvQ2pqdmJkRHd4THNzc2wNCi1EbmNMS3ZiZEJpTEJqaGZLDQotRVBES2p2YmROUHdwdk9Hcw0KLUVPYmtLdmJkelFubGlLWEENCi1Eb0NqanZiZGVZWnNzcWV6DQotRG9Damp2YmRlQVRwbHhLRw0KLUVPY0xLdmJkUnlqSVNjV0ENCi1FUERLanZiZGRlT3FiV2NLDQotRVBETEt2YmRBQ3JYalpocA0KLURuYmpqdmJkbXVWWmtLU0cNCi1FUERLanZiZFZxbXdiRkxjDQotRVBDa0t2YmRDU2FDdEZ3Uw0KLURuYmpqdmJkVlpIc3pMUE8NCi1Eb0RLanZiZFZyTnhDRkxjDQotRU9jS2p2YmRlZ2p1cW5RZw0KLUVQQ2pqdmJkWk1TRVRtbE4NCi1FT2NLanZiZEhEanZLQmpLDQotRVBDa0t2YmR5T1RJWHNKRA0KLURvREtqdmJkblFaeVdLeGINCi1EbmNMS3ZiZHh3aGlhb3pMDQotRG5jTEt2YmROZGNzaGhrRQ0KLUVQQ2pqdmJkWG5SQVlVdXQNCi1Eb0RMS3ZiZE5zVVdHZVVwDQotRG5jS2p2YmRXSHd1d2Z4eg0KLURuYmtLdmJkUnBVR2lmRVgNCi1EbmJqanZiZEVPY0xLd0NkDQotRVBES2p2YmR1YUVZc09lSQ0KLURuYmtLdmJkamhITGZGbkwNCi1EbmNMS3ZiZFpvT0pFZVpqDQotRVBDa0t2YmRFUENqanZjRQ0KLUVPYmpqdmJkeFVsZHFZa24NCi1FT2JrS3ZiZE9FZFRoaUxFDQotRG5ia0t2YmRqY01LcGdWSA0KLUVPYmpqdmJka0lHa2VlbkwNCi1EbmNLanZiZFpzaUpaRHJuDQotRVBDa0t2YmR4blNoWHNJYw0KLURvREtqdmJkWm5taUVkeksNCi1Eb0NrS3ZiZFZUbVVHTHZLDQotRU9jTEt2YmR1Q2NWWFZubw0KLUVPYmpqdmJkWlFsZUpORlINCi1FT2JqanZiZEZlalJtaHNxDQotRVBETEt2YmRhTWtCcnVOSA0KLURvQ2tLdmJkTlFYcVdOZ1QNCi1Eb0RLanZiZGp1d05jYlh3DQotRVBDamp2YmRTQmNlTGlZaw0KLURvQ2pqdmJkTWdDb2xwVkwNCi1Eb0RMS3ZiZFZaSHRaa1BPDQotRG9ES2p2YmR1TVlYQlVBdw0KLUVQREtqdmJkTmVEc2hpS2QNCi1Eb0RLanZiZFRBRkpJQ1BFDQotRU9iamp2YmRKdlZGY2VHaQ0KLUVPYmpqdmJkTkhDcE1wVWsNCi1EbmJrS3ZiZGlqR0lLTllTDQotRG9ETEt2YmREbmNLa1hDZA0KLURuY0tqdmJka01ha3llR28NCi1FT2JrS3ZiZGpLRmdpbHdyDQotRG9Da0t2YmRPaEFYeUFaQg0KLURvQ2tLdmJkVUd6bk1XdkYNCi1FT2NLanZiZFJvc2ZpZkVYDQotRVBETEt2YmRmTkZ2Z01qTA0KLUVPYmtLdmJkeHhKSmJQekwNCi1FUENqanZiZFFseENZbXR6DQotRU9jTEt2YmRnUGF6d0VYaA0KLURvRExLdmJka3lTclRZZnQNCi1Eb0RMS3ZiZGhnS0RZdWl1DQotRG9ES2p2YmRZa3JFVG1rbQ0KLUVPYmpqdmJkTlB3cHVuSFQNCi1FT2NMS3ZiZFlsUmRVTmxODQotRG5ia0t2YmRaTHJEdE9MbQ0KLUVPYmpqdmJkeHJuSk1yQ0gNCi1FT2JqanZiZFpubkllRlpqDQotRG9Damp2YmR6UlBNaGl3QQ0KLURuY0tqdmJkc3NTU3h5ZUQNCi1FT2NMS3ZiZGpBUGdBb2ZqDQotRG5jS2p2YmRSb3NmaWZFWA0KLURvREtqdmJkRVh3a3RVVGwNCi1EbmJqanZiZFdSbXdhZGtjDQotRVBETEt2YmRlRW9SYXZiag0KLURvREtqdmJkWHNNQk5Ub1kNCi1EbmJrS3ZiZFZxbXhDRkxjDQotRU9jS2p2YmRrVndPRUJ3dw0KLURvQ2pqdmJkZk5HWEdtSmsNCi1FT2NMS3ZiZG10dVpqaXFmDQotRG9Da0t2YmRuUHl5V0t5Qw0KLUVPYmpqdmJkSnB5ZG9HTmUNCi1EbmJrS3ZiZGpKZkhpbVlTDQotRG9Da0t2YmR5WGhqQm96TA0KLURvQ2pqdmJka0lITGVlbkwNCi1FT2NMS3ZiZFRBRWlJQm9FDQotRG5ia0t2YmR2QkR4c1BGSQ0KLURuY0tqdmJkbGhkVHB1UmENCi1FT2JqanZiZEZmSnFtaVVSDQotRVBDamp2YmRlckF2emtibw0KLURuY0xLdmJkd3lnZWV4RXINCi1FT2JqanZiZFNCZEVsSlpMDQotRU9jS2p2YmR5U21pTXJCZw0KLUVQREtqdmJkYXRiR3drVGgNCi1EbmNLanZiZG5CaXZ3bm11DQotRVBES2p2YmRGeHVWQWRZQw0KLUVQRExLdmJkcWx6SnlNSGkNCi1FUERLanZiZFpSTWRobGRxDQotRG9Damp2YmROZUR0SWhrRQ0KLURvQ2tLdmJkZk1ld0dsaWsNCi1FT2NMS3ZiZGhhb0RFd1FxDQotRG5iamp2YmRJd3NhZ2txUQ0KLURuY0tqdmJka0lITUdGbkwNCi1Eb0RMS3ZiZEdkS3VpYktLDQotRG5iamp2YmRUQUVpSUNPZA0KLURuY0xLdmJkTmVFVGhpS2QNCi1FT2JrS3ZiZFlwbUVpTkZSDQotRVBETEt2YmRGa0ZUREhsdQ0KLURvQ2tLdmJka0RMa1JIVWcNCi1EbmJrS3ZiZHlZSWpDUHlrDQotRG5jTEt2YmRGVnlRUG1LRg0KLURuYmpqdmJkWlFsZGhsZHENCi1Eb0RLanZiZFZxbllCZGtjDQotRVBES2p2YmRTS3hldUdrVA0KLUVQQ2pqdmJkaVp1R0xxTmYNCi1EbmJqanZiZEpUWkFybVhsDQotRG5ia0t2YmR5TnJnd3JoYw0KLUVPY0xLdmJkck5aaXlMZ2kNCi1EbmNLanZiZFNCZEZNSlpMDQotRVBDa0t2YmRmTWZXZm1LTA0KLUVQRExLdmJkZk1ldmZsakwNCi1Eb0NqanZiZG1JY3NxVlJhDQotRG9ETEt2YmRyRUVocE9WYQ0KLUVQRExLdmJkWlJNZUltRXENCi1Eb0RMS3ZiZHlUTmlNckJnDQotRVBDamp2YmRzUVZuaWJ2Rw0KLUVPY0tqdmJkdkJEeHNQRkkNCi1Eb0RLanZiZHFxdUtuS2FODQotRG5jTEt2YmRxR0RlVHVhSQ0KLUVQQ2tLdmJkWmR4R3pnaUMNCi1Eb0RLanZiZGtETGtRZnRnDQotRG9ES2p2YmRlUEVzS3RVUw0KLURvREtqdmJkVXhndFpqb08NCi1EbmNMS3ZiZHhVbUZSWWxPDQotRG5iamp2YmR3dU1lUllrbg0KLURvQ2tLdmJkUldtZENsSUQNCi1FUERMS3ZiZENEcEJXSmxmDQotRG5jS2p2YmR1YUVZcm5lSQ0KLURuYmpqdmJkZkhrVnFtcGcNCi1FUERLanZiZEt4cGlyenVHDQotRG9ETEt2YmRaTHFkVU5rbQ0KLURvRExLdmJkRHd4TVRzdE0NCi1FT2NLanZiZHJ6TG9zQWhPDQotRG5iamp2YmRxWlBIZ1FkWQ0KLUVPYmtLdmJkamdnTUZmTmsNCi1FUENqanZiZFpNUmNzbWttDQotRU9iamp2YmRFSmdpdXhLQQ0KLURuY0xLdmJkWnRKSlpEc08NCi1FT2JrS3ZiZFJqeGV1R2tUDQotRG5jS2p2YmRxZEZKUG11YQ0KLURvQ2tLdmJkR1l0dUFjeEMNCi1Eb0NqanZiZFpubWhlRXpLDQotRG9Da0t2YmRLV1VmRUZHaQ0KLURvQ2tLdmJkZk1mWEdtS0wNCi1EbmJqanZiZGp2V21jYlh3DQotRG5ia0t2YmR5emVPUmhKSQ0KLUVQRExLdmJkcHN0SFJxanQNCi1Eb0RLanZiZFR1a3BLVUFxDQotRG9ES2p2YmRTUHRHakZjdw0KLURuY0tqdmJkV1NOeENGTUQNCi1EbmJrS3ZiZGpsYWxaZGdQDQotRU9jTEt2YmRreHNSc1lnVQ0KLUVPYmpqdmJkTEZmSUNBcHUNCi1Eb0RLanZiZENFUUJXS01mDQotRG9ES2p2YmRiQXZGRnBRWA0KLURvQ2tLdmJkaGdLQ3h2S1YNCi1EbmNMS3ZiZGpjTUxRZ1ZIDQotRVBDa0t2YmR6aXRwUURydA0KLUVPY0tqdmJkTlZUUmptQVgNCi1FUERLanZiZGt4c1JzWkhVDQotRG9ES2p2YmRLREpjUktDeA0KLUVQREtqdmJkRmplU2NIbVYNCi1FUENrS3ZiZFpqVElRSEJmDQotRG5ia0t2YmRscXlVeXJkSg0KLURvREtqdmJkZWhLdXJPUkgNCi1FT2JqanZiZGJLbEZvT0RBDQotRG9Da0t2YmR3dG1GUXlNTw0KLURvQ2pqdmJkWG5SQVlVdXQNCi1Eb0RLanZiZHhzT0lscWJIDQotRG5jTEt2YmR5TnNJWHJoYw0KLURvRExLdmJkQ0VRQXZLTkcNCi1EbmNLanZiZFJvdEhKZWRYDQotRVBETEt2YmRWWkhzeWpvTw0KLURuYmpqdmJka0Nra1JIVkgNCi1Eb0RLanZiZFJXbWNibEhjDQotRG5jTEt2YmRxdm9rYmlZcQ0KLURvRExLdmJkUmtaR1ZITFQNCi1FT2JqanZiZHVDYnVYVm5vDQotRG9Da0t2YmRFSmdpdllLQQ0KLURvREtqdmJka1dXbkRiWVgNCi1FUERLanZiZG5HZHhNbWZ5DQotRG9ETEt2YmRJSEd6WXhZSA0KLURvREtqdmJkdUNidHdWbm8NCi1FT2JrS3ZiZHFseWpZa2dpDQotRU9iamp2YmRWd0l3dWRFZw0KLURuYmpqdmJkZlJhV3prY1ANCi1FUENrS3ZiZEVBUmhselhYDQotRG5ia0t2YmRmTWV2Zm1Kaw0KLURuY0xLdmJkWnlEak5jTHINCi1FT2NLanZiZHRBSFFoQUJTDQotRG5jS2p2YmRrQ2xLcUd0Zw0KLURvQ2tLdmJkRU9ia0xYQ2QNCi1FT2JqanZiZEZrRlRESU5WDQotRU9jS2p2YmRFenRRZGtjSg0KLURvQ2tLdmJkS2FMSE5CeFINCi1FUERMS3ZiZGhhb0NkdnFSDQotRU9ia0t2YmRySkFKZG1PZQ0KLUVPYmpqdmJkcnBWbmpDdWYNCi1FUENrS3ZiZEZqZVRDZ2x1DQotRG9Damp2YmRxZEVpUG5XQg0KLUVQREtqdmJkR0Zpck9KVVINCi1FUENrS3ZiZEptQUR6SFVhDQotRVBDamp2YmRXV2h3dWNkZw0KLURuY0xLdmJkQmhrQmppRmoNCi1Eb0NrS3ZiZFNaaWhTYnZBDQotRG5jS2p2YmRadElpWkVUTw0KLUVQRExLdmJkQ1RBY1VHWFMNCi1Eb0RLanZiZFZxbXhDRkxjDQotRG5jTEt2YmRtYWpXd29PVg0KLUVQREtqdmJkVmhZVnhIWXoNCi1Eb0RMS3ZiZGRvRlNqdFRyDQotRG9ETEt2YmRyek1RVEFnbg0KLURvQ2pqdmJkVVZsUGpVQlINCi1FUERMS3ZiZHR2T1hpcHNBDQotRG9Damp2YmRyb3VvS0N2Rw0KLUVPYmtLdmJkT1NzdWZkdHANCi1FUERMS3ZiZElHZnpaWHhIDQotRU9ia0t2YmRiUUdnRGt6ZA0KLURvQ2tLdmJkT0ZEdEpJa0UNCi1FUENqanZiZGlISmJ5V0p1DQotRG5iamp2YmRMQWtITWF4Ug0KLUVQQ2tLdmJkSlRaQlRNd2wNCi1EbmNMS3ZiZFNRVGZqR0VYDQotRU9jTEt2YmRsclpWWnJjaQ0KLUVPYmpqdmJka3lUU1RaSFUNCi1FUENqanZiZHhVbGVReGtuDQotRVBETEt2YmRFS0lLV1lLQQ0KLURvQ2tLdmJkWkhXZEFQU2kNCi1FUERMS3ZiZHhWTkZSWk1PDQotRVBETEt2YmRjU2JrVGNqQg0KLURvQ2tLdmJkbFlzU1RaR3QNCi1FUERLanZiZHVhRHhyb0ZJDQotRU9ia0t2YmROSERRTW91TA0KLURvRExLdmJkeHJuSk1xYkgNCi1EbmJqanZiZG1mZVhtT0d5DQotRG9ES2p2YmRpZGtHdG9BTw0KLURuYmpqdmJkR1l0dUJFWGINCi1EbmJqanZiZFJFQ2FRUWRTDQotRG9Da0t2YmRtYWpYWG5uVg0KLURuY0tqdmJkWk1TRVVObE4NCi1FUENrS3ZiZFp0Skl4Y3JuDQotRG5jTEt2YmRKcHlkbmVtZQ0KLURuY0tqdmJkVnZpWVdFRWcNCi1Eb0RMS3ZiZHlYaGpCb3lrDQotRG9Damp2YmRiaGxpa0dYWQ0KLURuYmtLdmJkVnZpWHVkRkgNCi1FUENrS3ZiZFlUTUFsc254DQotRVBDamp2YmR4WmhGZXdlUw0KLURvQ2pqdmJkeU5zSVhyaUQNCi1Eb0RLanZiZHpub3FFY01ZDQotRG5iamp2YmRhdUNIWGp0SQ0KLURuY0tqdmJkSXNaQXNNd2wNCi1FUENrS3ZiZFpNU0R0T0xtDQotRG5ia0t2YmRKcVplUEZtZQ0KLUVQREtqdmJka0hma2VlbkwNCi1Eb0RMS3ZiZGFOTENTdG1IDQotRG5jTEt2YmRJd3NiSGtxUQ0KLUVPYmtLdmJkZkhqdlJuUkgNCi1FUENqanZiZGxxeVZac0RpDQotRU9ia0t2YmRFdXhvb2xpZQ0KLURvREtqdmJkakFQZ0FvZmoNCi1FT2NMS3ZiZGpjTUxSSFZIDQotRG5jS2p2YmRqS0Znak5Ycg0KLUVQQ2tLdmJkbUljdFF1UmENCi1EbmNMS3ZiZEpweWVQR09GDQotRG5jTEt2YmROR2JwTW91TA0KLUVPYmtLdmJkcGZEZHN1YUkNCi1FUENqanZiZHl6ZU9SaEloDQotRG9ES2p2YmRyRGRocE51YQ0KLURvQ2pqdmJkRmZLUm1odFINCi1FUERMS3ZiZHBmRUVzdWFJDQotRVBETEt2YmRxY2RocE9WYQ0KLUVQQ2pqdmJkVllnc3lrUE8NCi1Eb0RMS3ZiZERuY0xMWENkDQotRU9ia0t2YmR1YUVZcm9FaA0KLUVPY0xLdmJka05CbFplSFANCi1FT2JqanZiZEdjanZKYWpLDQotRG5jTEt2YmRycFZvSmJ1Zg0KLUVPYmpqdmJkRUtJSnV4S0ENCi1EbmNLanZiZFp4Y2pPRE1TDQotRG5jTEt2YmRtZ0ZYbU9HeQ0KLURvQ2tLdmJkVU1Wb0F1b0oNCi1Eb0RLanZiZHFjZGlRTnVhDQotRG5ia0t2YmRicmNLdERpYQ0KLURuYmtLdmJkS2ZGZ2JBcHUNCi1EbmNLanZiZGV6dlpFaVR3DQotRG5ia0t2YmRscXh0elNkSg0KLURvQ2pqdmJkT1RVV0dlVXANCi1FUENrS3ZiZEpYdEJoTVFwDQotRU9jTEt2YmRPQUpUVGpTQQ0KLUVPY0tqdmJkZklMVnJOcGcNCi1FT2NMS3ZiZG5RWnh2TFpDDQotRVBES2p2YmR5WUpKYW95aw0KLURuYmpqdmJka01ha3pGSFANCi1EbmJqanZiZGpia2pwZnVIDQotRG9Da0t2YmRnR0x5bWZnQQ0KLURvRExLdmJkSllVQmhMcHANCi1FUENqanZiZEpTeUJUTXhNDQotRG5iamp2YmR5VE5pTXJCZw0KLURuYmtLdmJkcVlvSGZwZFkNCi1FT2NLanZiZFp5RUtOY0xyDQotRG9Da0t2YmRadElpWWNzTw0KLUVQQ2tLdmJkWlFtRkpORlINCi1EbmNLanZiZFNQc2dLRmRYDQotRG9Damp2YmR2d01BdWFXVg0KLUVQREtqdmJkSGZnWnh4WUgNCi1FT2JrS3ZiZHJTVWpuS2FODQotRG5iamp2YmRLV1ZHRUZHaQ0KLURuY0tqdmJkc1B2T2pEV0cNCi1FUERLanZiZGh6VkZrcU9HDQotRG9ES2p2YmRzc1NTeVpkYw0KLURvREtqdmJkWWtxY3NtbE4NCi1FUENqanZiZFlwbGRpTkZSDQotRG5jTEt2YmRlbUZ3R2xpaw0KLURvRExLdmJkanV2bWRCeFgNCi1Eb0RLanZiZENUQkRUZXdTDQotRG9Da0t2YmRLZWVoQmFRdQ0KLUVPYmtLdmJkd3loRmV4RXINCi1Eb0RLanZiZFF2bWNjTUlEDQotRG9ES2p2YmRWdmlZVmNlSA0KLUVQQ2tLdmJkbVJ4dHlyZEoNCi1FUERMS3ZiZFlxTWVKTkZSDQotRVBDa0t2YmRSYkRlTUl4aw0KLUVQQ2tLdmJkY0pNaktmWFkNCi1EbmJrS3ZiZFZ3SXd2RGRnDQotRG5iamp2YmRJd3RDSGtwcA0KLURuY0xLdmJkY3pZcFlZcUMNCi1FUENrS3ZiZEthTEdtQnhSDQotRG5jS2p2YmR1THd3QXNhWA0KLURuY0xLdmJkc3NScnh6RWMNCi1FT2JqanZiZHJYUU1DaVpSDQotRG5ia0t2YmRaUk5GSW1GUg0KLUVPY0tqdmJkQUNxd2paaHANCi1EbmJqanZiZGJLbEdPbWNBDQotRU9iamp2YmRHRmlyT0pVUg0KLUVQRExLdmJkcXZva2JpWXENCi1FT2NLanZiZEptQUVaZ1VhDQotRG9Da0t2YmRiaGxqS2V2eA0KLUVQQ2pqdmJkYktsR1BOY0ENCi1FT2NLanZiZFJNeEJ5T1V6DQotRU9jS2p2YmRic0RMVUVKYQ0KLUVQQ2tLdmJkUmFjZGxKWkwNCi1FT2JrS3ZiZG11VXlqalNHDQotRU9ia0t2YmRqS0Znak5Ycg0KLURvRExLdmJkbGhjdFF1UmENCi1Eb0NrS3ZiZGpLRmhLTXhTDQotRU9iamp2YmRwZWRFdFZhSQ0KLUVPY0tqdmJkSXd0QmhMcHANCi1EbmJqanZiZFpIV2RBUFNpDQotRU9jTEt2YmRpTGRjbXVDeQ0KLUVPY0xLdmJkamNNTFJHdUgNCi1FUENqanZiZFJiRGRraVpMDQotRU9jS2p2YmRpSEpieHZLVg0KLUVPY0xLdmJkYVNHREhzZkwNCi1Eb0NrS3ZiZGpLRmhKbHdyDQotRG5jS2p2YmRpQm9DZVdxUg0KLUVPY0xLdmJkZWdqdlNOcGcNCi1FT2NMS3ZiZHJiR01sSExaDQotRG5iamp2YmRCcmFEVUdYUw0KLURuY0xLdmJkRmVpck9Jc3ENCi1FUERMS3ZiZGh5dGVrcG1mDQotRU9jS2p2YmRJc1lhVE13bA0KLURuYmtLdmJkclNWTE9LYU4NCi1Eb0NrS3ZiZFRJeWpSQUJNDQotRU9jTEt2YmRzQmZOTUdrWg0KLUVQRExLdmJkVXROVGZNV0sNCi1FT2JrS3ZiZFJqeGV1R2pzDQotRU9ia0t2YmRUcVFudVZJTg0KLUVPYmpqdmJkaHVaZHdSdUMNCi1FT2NMS3ZiZHFUdEhTU0t0DQotRG5jS2p2YmRtcFp4dkxaQw0KLURvRExLdmJkbEFsb05BTEENCi1FUERLanZiZGlMZGRPVWJ5DQotRVBETEt2YmR3dU1kcHhsTw0KLURuY0tqdmJkTnJzdkhFdVENCi1FUENrS3ZiZHlPU2d4VEpEDQotRU9jTEt2YmRJcnlBcmx4TQ0KLUVQRExLdmJkWkhYRUFQU2kNCi1FUENqanZiZFNDRGRsSXhrDQotRU9jS2p2YmR5U25KTlNDSA0KLURuYmpqdmJkaWpHSUtOWHINCi1FUERLanZiZFZBYXFUUlNaDQotRU9iamp2YmRreHNTU3hmdA0KLUVQQ2tLdmJkblV0ektpcWYNCi1FUENrS3ZiZGxxeHVac0VKDQotRU9iamp2YmRFWHhNVVVVTQ0KLUVQQ2tLdmJkTEZmSUJhUXUNCi1EbmJqanZiZHJSdGtOamFODQotRG9Damp2YmROSENwTXBVaw0KLUVQREtqdmJkWmpUSVFHYWYNCi1FUENrS3ZiZEhFTFdKYktLDQotRG9ES2p2YmRKYmlicGpDeA0KLURuYmpqdmJkSlN5QXJtWU0NCi1FUENqanZiZGZORndHbUprDQotRU9jTEt2YmRZVE1CTXNueA0KLURvRExLdmJkeVRPSk1xYkgNCi1FT2JqanZiZEVQRExMWERFDQotRG5jTEt2YmRreVRTVFpHdA0KLUVPYmpqdmJkR0JQUllpem0NCi1Eb0NrS3ZiZFZ2aVh2RGVIDQotRG5jS2p2YmRzUVdPaWNWZg0KLURvQ2tLdmJkZkhqdlNOcUgNCi1EbmNLanZiZGxaVFNTeGZ0DQotRG5jS2p2YmRGVnlQb2xpZQ0KLUVQQ2pqdmJkUlhPRGJsSUQNCi1Eb0NqanZiZGxoY3NxVlNCDQotRG5jTEt2YmRxWW5oR3FEeA0KLUVPYmpqdmJkRmVpcW1pVVINCi1EbmJqanZiZEtlZkhhYVF1DQotRG9ES2p2YmRSTlhiWW10eg0KLUVPY0tqdmJkTndudXpjbXQNCi1Eb0RMS3ZiZFhGeHl0QVBUDQotRVBETEt2YmRPVFVWZmR0cA0KLURvQ2pqdmJkcmFlbGtma1oNCi1EbmNLanZiZFhzTUFsdFBZDQotRG9ES2p2YmRWVU1zZkx1ag0KLUVQRExLdmJkWmlzSVBmYkcNCi1FUERLanZiZGRaeHBZWXFDDQotRG5ia0t2YmR6alVvcEVTdA0KLURuYmtLdmJkVlVNdEdNVmoNCi1EbmNMS3ZiZHVDYnR3V09vDQotRU9ia0t2YmRhYVZlRnBQdw0KLURuY0tqdmJkS05BRHpHdGENCi1EbmNLanZiZGVFb1NDWENqDQotRU9iamp2YmRoYW5jRXZxUg0KLUVPYmtLdmJkS0NpY1FpYngNCi1EbmNMS3ZiZGlqR0hqTXdyDQotRG9Da0t2YmR6aXVQcEVUVQ0KLURvQ2pqdmJkaUJuYmVYUlINCi1Eb0NrS3ZiZFpRbUVpTWRxDQotRU9ia0t2YmRyTXlqWk1IaQ0KLUVPY0tqdmJkZG9FcmtUdFMNCi1Eb0NrS3ZiZHRrd3ZhVUF3DQotRVBETEt2YmRUbFZuYVZvSg0KLURuY0tqdmJkZkhqdXJPUWcNCi1Eb0RMS3ZiZFdXaVh2RUVnDQotRVBDa0t2YmRxZEVocE51YQ0KLUVPY0xLdmJkWVNrYU10UFkNCi1FUENrS3ZiZHhtc0h4VEljDQotRG5iamp2YmRKcVpkbmVuRg0KLUVQREtqdmJkV2V4elVBT3MNCi1FT2NMS3ZiZHJvdlBLQ3VmDQotRG9ES2p2YmRreHNTU3lHdA0KLURuYmpqdmJkemR5bnpkeXANCi1FT2NMS3ZiZEhFS3ZKYkpqDQotRU9iamp2YmRPU3RXSEV1UQ0KLURuYmpqdmJka3lUUnNaR3QNCi1Eb0NrS3ZiZGNKTktLZXZ4DQotRG9ES2p2YmRTUHRHaWZEdw0KLUVPYmtLdmJkR2RMVmliS0sNCi1EbmJqanZiZGJCVmRmUG93DQotRG5jS2p2YmRodHllWFNWQw0KLUVQRExLdmJkcHRUZnJTTFUNCi1EbmNLanZiZGp2WE9EYXd3DQotRG5jS2p2YmRxWk9nZnFEeA0KLURuY0xLdmJkVEpaalJBQk0NCi1FT2NMS3ZiZFRwcVBWVWhODQotRU9jS2p2YmRSV21kQ2xJRA0KLURvQ2pqdmJkcXF1TE9MQW0NCi1Eb0NqanZiZEZmSnFtaVVSDQotRU9jS2p2YmRkQnNNckFUbQ0KLUVPY0tqdmJkWXpjRnJLVnkNCi1FUENqanZiZHNabFFTYUlPDQotRVBDa0t2YmRrSGZrZWVuTA0KLUVPY0tqdmJkaUhKY1l1aXUNCi1Eb0RLanZiZENFUGFWaWxmDQotRG9Damp2YmRkQnJtU0FVTg0KLUVQRExLdmJkU1B0R2lmRHcNCi1FT2NMS3ZiZEFNaFlydnl4DQotRG5jTEt2YmRUSXlqUkFBbA0KLUVPY0xLdmJkWnRJaHlFU24NCi1EbmJqanZiZFZVTlVGbFdLDQotRU9jS2p2YmR5WGlKYW95aw0KLUVQQ2tLdmJkRG5jTEt2YmQNCi1FT2NMS3ZiZEtXVkZjZGdKDQotRVBES2p2YmRuUVp4dkt5Qw0KLURuY0tqdmJkakplaEpseFMNCi1Eb0RLanZiZFJrWWZWSEtzDQotRVBETEt2YmRpcnpoc0xKeg0KLUVPYmtLdmJkVlVNdEZrdWoNCi1EbmJqanZiZHF3UGtiaVlxDQotRVBDamp2YmRJR2Z6WllYZw0KLURvQ2tLdmJkbFlzUnJ5R3QNCi1FT2JqanZiZHBmRGVVV0JJDQotRU9jS2p2YmR3dGxkcHhrbg0KLURvQ2tLdmJkeml0b3BFVFUNCi1Eb0RLanZiZEp1dUdFRWZpDQotRG5ia0t2YmRuUHpaVmtaQw0KLUVPY0tqdmJkbWZlWU1uR3kNCi1FUERLanZiZGtJR2xHR05rDQotRG5jS2p2YmRlenZaRWh0WA0KLUVQREtqdmJkcXF0am1rQW0NCi1FUERMS3ZiZHpSUE5JaXdBDQotRG9Da0t2YmRHS2VTYmdtVg0KLUVQRExLdmJkbUpFVHFWU0INCi1FUERLanZiZGJWQ0d3a1RoDQotRG9Damp2YmRCaGtCa0llag0KLUVPY0xLdmJkYkJXRkZvcFgNCi1EbmNMS3ZiZGpnZ0xmR09MDQotRVBDa0t2YmR6UW5tSWl3QQ0KLUVPY0xLdmJkaGJQREZXcHENCi1FUERMS3ZiZGtDbExRZ1ZIDQotRU9ia0t2YmRyV3BNQ2h5Ug0KLURuY0tqdmJkTWZicE5QdUwNCi1EbmJqanZiZE5zVVZmZVZRDQotRU9jS2p2YmRhUmZESHRGaw0KLURvREtqdmJkUmJFRkxoeUwNCi1FT2NLanZiZG1JY3NxVXFhDQotRG5jS2p2YmRGVnlQcE5KZQ0KLURvQ2pqdmJkTEFqZ01heFINCi1FT2NMS3ZiZHlwb05KS1hBDQotRG5jTEt2YmRFenRSRk1DaQ0KLURvQ2tLdmJkdVZtd2lxVEENCi1FT2JrS3ZiZFV5SHN5a1BPDQotRG9Da0t2YmRoelVmTHFOZg0KLUVQQ2pqdmJkaVV6RXZxdGINCi1FUERLanZiZHBmRGVUdWFJDQotRVBDa0t2YmRTd2prbXpqeA0KLURuY0xLdmJkaktGZ2pNd3INCi1FT2NMS3ZiZFJXbkVDa2hEDQotRU9jS2p2YmRab09KRkV5ag0KLURuYmtLdmJkdnZsQXZBdlYNCi1EbmNLanZiZFpMcWNzbWxODQotRG5jS2p2YmR5cU9saUp3QQ0KLUVQQ2tLdmJkS1dVZWRFZmkNCi1Eb0NrS3ZiZGVQRXNMVHRTDQotRG5ia0t2YmR0Y0RWWFZvUA0KLUVQQ2pqdmJkS0NqQ3BpY1kNCi1FT2JrS3ZiZFpkd2Z6aEpDDQotRVBETEt2YmRCaGphamlHSw0KLUVPY0tqdmJkSlhzYWhNUlENCi1Eb0NrS3ZiZFp4ZEtOY0xyDQotRVBES2p2YmRuQmpXd29PVg0KLURuY0xLdmJkYXBHZ0RremQNCi1FUERLanZiZGptQ0x6RWdQDQotRVBDa0t2YmRXUm13YkZNRA0KLURuYmpqdmJkQmRRQXVqTWYNCi1FT2JrS3ZiZHpqVXBQY3NVDQotRG9ETEt2YmR3dG1GUXlNTw0KLURvQ2tLdmJkaU1FY210YnkNCi1EbmNLanZiZFNCY2RraVlrDQotRVBDa0t2YmRmU0JXemtibw0KLUVPY0xLdmJkeFZNZVJaTG4NCi1EbmJqanZiZENTYURVR1hTDQotRG5jS2p2YmRadEpJeUVUTw0KLUVQQ2tLdmJkVGt2T2FWbmkNCi1EbmJrS3ZiZGt5U3FzWWZ0DQotRVBDamp2YmR4c09KTXJDSA0KLUVQQ2pqdmJkQ1d6ZEpFb3YNCi1FUENqanZiZEVBUmlNeXdYDQotRU9ia0t2YmR4c05pTlNDSA0KLURuY0xLdmJkaGJQREZXcVINCi1FT2JrS3ZiZFZVTlVGbFZqDQotRU9iamp2YmRYcmxCTlRvWQ0KLUVPY0xLdmJkZkhqdlNPUWcNCi1FUENqanZiZHdXa2FXQXV1DQotRG5jS2p2YmRiS2xGbm5EQQ0KLUVQQ2tLdmJkUmtaRnVHa1QNCi1FUENqanZiZE1vd3B2TmZzDQotRG5jTEt2YmRtdHVaampTRw0KLURuYmtLdmJkaUNQREV2cVINCi1EbmNMS3ZiZGJBdWRmUG93DQotRG5iamp2YmRGamVTYmhNdQ0KLURuY0tqdmJkU1FUZmpHRVgNCi1FUERLanZiZGJBdWVHUVFYDQotRG5ia0t2YmRqS0dJSm1Ycg0KLUVPY0tqdmJkSXJ5QlROWU0NCi1FUERMS3ZiZG1nRXdsbkd5DQotRU9iamp2YmRTQmRFa2h4aw0KLURvQ2pqdmJkZk1mV2dNakwNCi1FUERMS3ZiZEVPYmpqd0NkDQotRU9iamp2YmRoelVla3FPRw0KLUVPYmpqdmJkV1NOd2JFbEQNCi1Eb0RLanZiZHJOWmpZa2hKDQotRG9Da0t2YmRSa1lmVWdLcw0KLUVPYmpqdmJkY3pZcFlaUkMNCi1Eb0NrS3ZiZHpvUVFlRE1ZDQotRG5jS2p2YmRGeHVWQkVYYg0KLURvREtqdmJkU2laalJBQk0NCi1Eb0RMS3ZiZFl6YmZSaXZaDQotRVBETEt2YmRscXlVeXJkSg0KLUVPY0xLdmJkdGJidVd2T28NCi1EbmNLanZiZFNLeGZWR2tUDQotRG9Damp2YmRFWHhMdFVUbA0KLUVPY0xLdmJkRVBDamtXYmQNCi1FUERMS3ZiZEVPYmtMWERFDQotRVBDa0t2YmR4S3ZkSHp6Rw0KLUVQREtqdmJkcGZEZHRWYUkNCi1Eb0NqanZiZGJBdWVHUHBYDQotRG9Damp2YmRaTVJkVU9MbQ0KLURvRExLdmJkd3RtRlJZa24NCi1Eb0NqanZiZE5Qd3B1bWdUDQotRG9Da0t2YmRkaWpTV1V6bg0KLURvREtqdmJkSlhzYkhrcVENCi1EbmJqanZiZHhaaEZleEVyDQotRG9Damp2YmRTUVVISmVkWA0KLUVQRExLdmJkam1DTVpkZ1ANCi1EbmNMS3ZiZE1mYm9tUHRrDQotRU9jTEt2YmRxVHRIUnFqdA0KLUVQQ2tLdmJkcWNlSXBOdkINCi1EbmNMS3ZiZEZ4dHVCRHhDDQotRVBDa0t2YmR4Vk5FcHlMbg0KLUVPY0tqdmJkWXpiZXFpdloNCi1Eb0NqanZiZE5kY3NpSkxFDQotRG9ES2p2YmR6alZRUURzVQ0KLUVPYmpqdmJkdkJEeVNuZUkNCi1Eb0RLanZiZEJoamJLaGVqDQotRVBETEt2YmRXU09ZQmRsRA0KLUVPY0tqdmJkT1lPdXpjblUNCi1FUENrS3ZiZGtDa2tRZ1ZIDQotRG5ia0t2YmR0bFh3QlRhWA0KLURuYmtLdmJkVHBwb1ZVZ20NCi1Eb0NqanZiZFFtWGF4blV6DQotRG5jS2p2YmRrSGZrZkZtaw0KLUVQQ2pqdmJkbWdFd2xuSFoNCi1FUERMS3ZiZFpkeEd6aEpDDQotRVBDa0t2YmRtSWRUcVVxYQ0KLURvREtqdmJkekd5TUFNZVgNCi1EbmJrS3ZiZFRwcG51VWhODQotRG9Damp2YmRTTFlmVWdMVA0KLURuYmtLdmJkWnNpSlpFVE8NCi1FT2JrS3ZiZE5VcnFqbUFYDQotRU9iamp2YmRaeURpbWNMcg0KLURvQ2tLdmJkUkRiYVFSRHINCi1EbmJqanZiZGJBdWRmUG93DQotRVBES2p2YmRaalRIcEdhZg0KLURvREtqdmJkcXdRTGNJeHENCi1EbmJqanZiZFpMcWRUbWttDQotRG9ES2p2YmR5WGlLQ1B6TA0KLUVPYmpqdmJkc3NTVFl5ZUQNCi1Eb0NqanZiZGRkb1Jhd0NqDQotRG9Damp2YmRrTWJMeWRmbw0KLURvQ2pqdmJkVlRtVUZrdksNCi1Eb0NqanZiZGh5dUZrcG1mDQotRU9ia0t2YmRsWXNTU3lHdA0KLUVQQ2pqdmJkdHZOeEtRc0ENCi1Eb0RLanZiZFJwVGdLRmRYDQotRU9iamp2YmRqYmtrUWdWSA0KLURuYmpqdmJkYU5MQ1N0bGcNCi1FT2NLanZiZER4WUxzc3NsDQotRG9Damp2YmRmTkZ2Z01qTA0KLURuY0xLdmJkcm92UEpjV0cNCi1EbmJrS3ZiZGRvRlNqc3NyDQotRG5iamp2YmRTUVRnS0dEdw0KLURvQ2pqdmJkUXZuRURMaEQNCi1FT2NLanZiZFV4aFVaa09uDQotRVBDamp2YmRFenNxRk1ESg0KLURvREtqdmJkR2RLdWlhaWoNCi1FT2NLanZiZHhybkpNckNIDQotRG5iamp2YmRVV01RSnRCUg0KLUVPYmtLdmJkRUtIaXZZS0ENCi1FUERMS3ZiZFlTbEFsdE94DQotRG5iamp2YmRiVkNIWGp0SQ0KLURuYmtLdmJkdGt3d0F0QlgNCi1Eb0NqanZiZFpRbGVKTkVxDQotRVBES2p2YmRFUENqanZjRQ0KLUVQQ2pqdmJkQ1NhRFVGd1MNCi1FUERLanZiZEhFTFZpYWpLDQotRG9ETEt2YmRpakZnak5Ycg0KLURuY0xLdmJkam1DTHlkZm8NCi1FT2JrS3ZiZGRaeVFYeHFDDQotRG5ia0t2YmR5U25JbVNDSA0KLUVQQ2pqdmJkcW1aallrZ2kNCi1FUENqanZiZEdGaXJOaVRxDQotRG9ES2p2YmRSWE5kRE1JRA0KLURuY0xLdmJkTWZjUU5RVWsNCi1FT2NMS3ZiZFpkd2Z6Z2hiDQotRVBETEt2YmRVTHVvQldPaQ0KLUVPYmpqdmJkRnlWVWFEd2INCi1Eb0NqanZiZE5RWHB1bWZzDQotRG5ia0t2YmRyV29sREl4cQ0KLUVQQ2tLdmJkQnZ6ZEllUVcNCi1EbmJrS3ZiZGZJS3VxbXBnDQotRU9jS2p2YmRuQml3WG9OdQ0KLUVPYmpqdmJkaUhLRFpXS1YNCi1FUENqanZiZFpMcWRUbkxtDQotRG9Damp2YmRsWXNTVFlnVQ0KLUVQRExLdmJkc0JmTk1IS3kNCi1EbmJrS3ZiZGp1dm1kQ1h3DQotRVBETEt2YmRSRGNCUVFkUw0KLUVPY0tqdmJkeVNtaG1SYkgNCi1FUERMS3ZiZGJyYmpzY2lhDQotRVBETEt2YmRreHJyVFpHdA0KLURvREtqdmJkY0pNakxHV3gNCi1FUERLanZiZEtlZWdiQlF1DQotRG5iamp2YmR2UFR6cUtvVQ0KLUVPY0xLdmJkSWlkQUtQZ0UNCi1Eb0RMS3ZiZFZyT1lCZGtjDQotRU9iamp2YmRlRk9xYXdESw0KLUVPY0xLdmJkWlJORWhtRlINCi1FT2JqanZiZEtmRmdiQlJWDQotRG9Damp2YmRpTGVFT1ZDeQ0KLUVQQ2tLdmJkcW1aallrZ2kNCi1FUERLanZiZEhmZnl4eFhnDQotRVBES2p2YmRaTHJEc21sTg0KLURuYmpqdmJkVGt1b0JWb0oNCi1FT2NLanZiZHVERFV2dk9vDQotRG9ES2p2YmRaZHdmemhKQw0KLUVQQ2tLdmJkZk1mV2dOS0wNCi1FUENqanZiZFJYT0VDa2djDQotRU9jS2p2YmRNb3dwdk5mcw0KLURvRExLdmJkaUJvQ2VXcHENCi1FT2JrS3ZiZE53b1Z6ZE9VDQotRVBETEt2YmREb0RLanZiZA0KLUVPYmpqdmJkTEZlaENCUlYNCi1FT2NMS3ZiZHVDY1ZXdW5vDQotRU9jS2p2YmRYc01CTXRPeA0KLURuYmtLdmJkY0lsaktld1kNCi1Eb0RMS3ZiZEV6c3Bka2NKDQotRG5jS2p2YmRxY2Rob211YQ0KLUVQREtqdmJkaWlmSGpOWHINCi1FT2JrS3ZiZFZxblhiRkxjDQotRVBDa0t2YmRkd3lzc3JGeg0KLURuY0tqdmJkclNWS21rQW0NCi1FUENqanZiZFRsVm9CVm5pDQotRU9iamp2YmRPaEFZWkFZYQ0KLUVQQ2pqdmJkUmFkRWtpWkwNCi1Eb0NrS3ZiZFNDRUVraVlrDQotRU9iamp2YmRHWlZWQWN4Qw0KLURuYmpqdmJkWnlFSm5ETVMNCi1FT2NLanZiZHppdG9vZFN0DQotRVBES2p2YmRYRnh6VUFQVA0KLURuYmpqdmJkeml1UVFFU3QNCi1FUENqanZiZEVBUmhtWnZ3DQotRG5jTEt2YmRhdGJIWGtUaA0KLURuY0tqdmJkYnNDanREakINCi1FUENqanZiZEtXVkdEZGdKDQotRVBES2p2YmRyYWZOTGZrWg0KLUVPYmtLdmJkRmtFc0NoTXUNCi1EbmJrS3ZiZFZneFdYZnh6DQotRU9iamp2YmRKYmpEUkpieA0KLUVPYmtLdmJkd3loRmZZRlMNCi1FUENqanZiZE1mYnBOUHRrDQotRU9ia0t2YmRic0RLdERpYQ0KLUVQQ2tLdmJka3hzUnNaSFUNCi1EbmJrS3ZiZHZBZFpUT2RoDQotRG5jS2p2YmRwdFVIUnJMVQ0KLURuY0tqdmJkdlBUenFLbnQNCi1EbmNMS3ZiZFRwcG9VdGhODQotRG5ia0t2YmRyYkZsa2dMWg0KLUVQQ2pqdmJkR2RLdkphaksNCi1FUERMS3ZiZEFDcXhLWmlRDQotRG9Da0t2YmRiUGZmY2t6ZA0KLURvQ2tLdmJkaGJPY0V2cVINCi1EbmJqanZiZHVDY1ZXdk9vDQotRG9Da0t2YmRtdVV6TEtSZg0KLUVQQ2pqdmJkYlViSFlMVUkNCi1Eb0RLanZiZGJLa2VvTmNBDQotRG9Damp2YmRjU2NLdEVKYQ0KLURvQ2pqdmJkeXpkblJnaUkNCi1FUENqanZiZGtJR2xGZk9MDQotRU9jTEt2YmR6alVwUGNzVQ0KLURvRExLdmJkSnV1R0VFZ0oNCi1EbmNMS3ZiZFRxUk90dGhODQotRU9jTEt2YmRwc3RHcXFrVQ0KLUVQQ2tLdmJkdFNyVFl6RWMNCi1FUERLanZiZGV6dllkaVVYDQotRG9ES2p2YmR0VFJyeHpGRA0KLURvQ2pqdmJkcm92T2pEV0cNCi1Eb0RLanZiZFVRcG9VdGhODQotRU9jS2p2YmRLREpicGljWQ0KLURuYmpqdmJkYVNHQ2d0RmsNCi1Eb0RLanZiZEdaVlZBY3diDQotRG5iamp2YmRFdllvcE5KZQ0KLUVPYmpqdmJkU1FUZ0tGZFgNCi1FUERMS3ZiZHJYUGtiaHlSDQotRG9ETEt2YmRoeXVHTVJPRw0KLURvREtqdmJkem9RUkZDbFkNCi1FUENrS3ZiZEtXVWVjZUhKDQotRU9ia0t2YmRabm1pRkZaag0KLURuYmpqdmJkdGNEVXdWb1ANCi1Eb0NrS3ZiZGpsYWt5ZUhQDQotRVBDa0t2YmRCdnpkSWRwVw0KLUVQQ2pqdmJkZGVQUmF3Q2oNCi1Eb0RLanZiZG1mZVlOTmZ5DQotRG5ia0t2YmRTTFlldGdLcw0KLURuY0tqdmJkRmVqUm5KVHENCi1FUERMS3ZiZElHZnpaWHdnDQotRG5jS2p2YmRKdlZGZEZISg0KLUVPY0xLdmJkSUhIWnlZWUgNCi1FUERMS3ZiZHlYaGlhb3lrDQotRG9Damp2YmRBRFNZSnpJcA0KLUVPYmpqdmJkTlB4UXVuSFQNCi1FUENrS3ZiZHhuVEh3cmhjDQotRG5jS2p2YmRUcHBudVZIbQ0KLUVPYmtLdmJkamxiTHlkZm8NCi1Eb0RMS3ZiZFZCQnBzUlJ5DQotRG5iamp2YmRBQ3F3aXlocA0KLURvQ2tLdmJkWlJORkpORXENCi1FT2NMS3ZiZGFSZkRIdEZrDQotRG9Da0t2YmRLZkZnYkJRdQ0KLURuYmpqdmJkZENUTlNBVU4NCi1FUERMS3ZiZFRmem5NWFZlDQotRU9jS2p2YmRlT2VTa1VUcg0KLURuYmtLdmJkcWRFaVBuVmENCi1FT2NMS3ZiZHNCZW1NSExaDQotRG9Da0t2YmROUHhRdk9Hcw0KLUVQRExLdmJkT1RUdWZlVXANCi1EbmNLanZiZHJhZWxrZmp5DQotRG9ETEt2YmRab09JZUZaag0KLURuYmtLdmJkcHRUZ1JyTFUNCi1EbmNLanZiZEFDclhpeWhwDQotRVBETEt2YmRJR2daeHd4SA0KLURuYmpqdmJkWm5taUVlWmoNCi1EbmJrS3ZiZFdSbXhDRkxjDQotRG9ETEt2YmR5WUlpYW96TA0KLUVQQ2pqdmJkT1RUdkdlVXANCi1FUENrS3ZiZE5Vc1NLbUFYDQotRVBDamp2YmREaWdpdXdqQQ0KLURvREtqdmJkSXJ4YVRNeE0NCi1Eb0RLanZiZFp5RGltY0xyDQotRVBDamp2YmRqYmtrUkhWSA0KLURvQ2pqdmJkV1hKWVZjZUgNCi1FT2NMS3ZiZGxaVFNTeUhVDQotRG5jTEt2YmR3dU5FcVlsTw0KLUVQQ2tLdmJkcnBXUEpidWYNCi1EbmNLanZiZHRiY1V3V1BQDQotRU9jS2p2YmRHS2VTY0lOVg0KLURuY0tqdmJkWmVYZnpoSkMNCi1EbmNLanZiZFVRcVBWVklODQotRG9ES2p2YmR4c05obVNCZw0KLURvREtqdmJkVVJST3VWSG0NCi1EbmNLanZiZFJNd2JZbXR6DQotRG9ES2p2YmRaUk1lSW1FcQ0KLUVPY0xLdmJkV0h3dlhnWXoNCi1FUERMS3ZiZEl3c2FoTVFwDQotRU9jS2p2YmRmSGtWck5xSA0KLUVPYmpqdmJkZGpLU1dVem4NCi1EbmNLanZiZHh3aUpiUVprDQotRVBDa0t2YmRNU1dselZReg0KLURvRExLdmJkVVFwbnVVaE4NCi1EbmNMS3ZiZGlDUENkdnFSDQotRG9Damp2YmRhcEhIRUx6ZA0KLURuY0tqdmJkeU9TZ3dyaGMNCi1Eb0NrS3ZiZER4WUx0VVRsDQotRU9iamp2YmR5ZnlNQU1kdw0KLUVPYmpqdmJkSGZmell4WUgNCi1Eb0RLanZiZFl6Y0ZyS1daDQotRVBETEt2YmRkWnlQd3lSQw0KLUVQQ2tLdmJkTGhhbFJZQVMNCi1Eb0NrS3ZiZEdZdHVCRVhiDQotRG9Damp2YmRyeWxRVEFnbg0KLURvQ2pqdmJkYkJWZUdQcFgNCi1FUERMS3ZiZFlwbUZJbUZSDQotRG5ia0t2YmRKY0tDcGpEWQ0KLURuY0xLdmJkWVRMYU5VUFkNCi1EbmJrS3ZiZGVPZVNqdFRyDQotRG9Da0t2YmRFWVlMdFR0TQ0KLUVQQ2tLdmJkcnpMb3JhSU8NCi1Eb0NqanZiZEtXVkdEZGZpDQotRG9ES2p2YmRCaGpiTElmSw0KLUVQQ2tLdmJkTlFZUXZPR3MNCi1FT2NMS3ZiZHVMeFhCVGFYDQotRVBES2p2YmRBTkh5U3daeA0KLURuYmtLdmJkZU9kc0xUdFMNCi1EbmJrS3ZiZFVzbVRmTVdLDQotRG9ETEt2YmRjSW1Ka0dYWQ0KLURuY0tqdmJkc1B1bmlidWYNCi1EbmJqanZiZElHZnl4eFlIDQotRG9ETEt2YmR2QkR5VE9lSQ0KLUVQRExLdmJkR0tlU2NIbVYNCi1FT2NMS3ZiZHFGY2VVVmFJDQotRG5jTEt2YmRxZEVocE9XQg0KLURvRExLdmJkVHVsUGl0QXENCi1EbmJqanZiZFdYSXd1ZEVnDQotRVBETEt2YmRjVERLdERqQg0KLURvQ2pqdmJkZ0ZsWm5ISEENCi1EbmJrS3ZiZHd1TkVxWkxuDQotRU9ia0t2YmRtUnh0elNjaQ0KLUVPYmpqdmJkanZYTmRDWVgNCi1EbmJrS3ZiZHFHRGRzdkJJDQotRG5jS2p2YmRxZEVob212Qg0KLURvQ2pqdmJkcnBWb0tDdkcNCi1FT2JrS3ZiZFdId3ZZSFl6DQotRU9jS2p2YmRyeWtvcmFIbg0KLUVQQ2tLdmJkc1B1b0tDdWYNCi1EbmNLanZiZFpqU2dvZmFmDQotRG5jS2p2YmROZUVUaUlqZA0KLURvRExLdmJkZG9GU2tUc3INCi1FUENrS3ZiZGtXV25FQ1h3DQotRG5ia0t2YmRaUk5GSWxkcQ0KLUVPYmpqdmJkempWUVBkVFUNCi1EbmJqanZiZGh5dGVsUk5mDQotRU9jS2p2YmROUHhRdW5IVA0KLURvQ2tLdmJkbXVWWmtKckcNCi1FUENqanZiZFVWbFFKdEJSDQotRG9ES2p2YmR6aXRwUUVTdA0KLURvQ2pqdmJkcmFlbUxma1oNCi1Eb0RMS3ZiZGtOQmxaZUhQDQotRU9ia0t2YmRyYkdOTUhMWg0KLUVQRExLdmJka0lITGVlbWsNCi1Eb0RLanZiZGJBdkVlb3BYDQotRG9ES2p2YmRpR2pDeHVqVg0KLUVQQ2tLdmJkcWx6SnhrZ2kNCi1EbmNMS3ZiZFZaSVR6TFBPDQotRU9jTEt2YmRWWklUeWtPbg0KLUVQQ2pqdmJkanV2bkRhd3cNCi1Eb0RLanZiZGtWd09FQ1lYDQotRU9iamp2YmRjeXhwWHlSQw0KLURuYmpqdmJkVUx2UEF1bmkNCi1EbmJrS3ZiZE9UVVdHZHRwDQotRU9jTEt2YmRLREpjUktDeA0KLUVQQ2tLdmJkQnNCRFVGd1MNCi1EbmNMS3ZiZFFkREFvcGNyDQotRU9iamp2YmRjU2JqdEVLQg0KLURuYmpqdmJkbEFsb05BTEENCi1Eb0NqanZiZEFEU1hpekpRDQotRU9jS2p2YmRycFdPaWJ2Rw0KLUVPYmpqdmJkSUdmelpYd2cNCi1FUERLanZiZHB0VUhSckt0DQotRG5jTEt2YmRaZHdmemhJYg0KLURvQ2tLdmJkUVpOQUdycksNCi1Eb0RLanZiZHVDYnR2dW9QDQotRVBDamp2YmRKdXVGY2VHaQ0KLUVQQ2tLdmJkZ0dMeW1nSEENCi1EbmJqanZiZGN5eVB4WXBiDQotRVBDa0t2YmRodVplV3F1Qw0KLUVPYmtLdmJkeVROaU5SYkgNCi1Eb0NqanZiZFZBYXFTcHJaDQotRG5jTEt2YmRvem5Ea1lQQQ0KLUVQQ2tLdmJkaVV5ZHZxdUMNCi1EbmNMS3ZiZGh5dGZNUk9HDQotRG9Da0t2YmRtYktYWVBOdQ0KLURuYmtLdmJkTXBZUXVuSFQNCi1FT2NMS3ZiZEhrYXpuWFFrDQotRG9ETEt2YmRUdk1QaXNhUg0KLURvQ2tLdmJkSXJ5QlROWGwNCi1Eb0RMS3ZiZFpMckRzbWttDQotRG5jTEt2YmRsaGN0UlZSYQ0KLUVQQ2pqdmJkWWtxY3Nta20NCi1FUENqanZiZEVYd2xVVHRNDQotRU9ia0t2YmRFdlpQb2xqRg0KLUVQRExLdmJkWlJORWlORlINCi1Eb0NrS3ZiZEFOSVpUWFp4DQotRG5jS2p2YmRab09JZUZaag0KLURvRExLdmJkZUppcldVem4NCi1Eb0NqanZiZFJXbWRETGdjDQotRG9ES2p2YmRBQ3JZS1pocA0KLUVQREtqdmJkTW93cHVuSFQNCi1FT2NLanZiZFlUTGFOVG54DQotRG5iamp2YmRRdm5FQ2xIYw0KLURuYmtLdmJkU0JjZUxoeUwNCi1Eb0RLanZiZGpnZmxHR09MDQotRU9jS2p2YmRZcGxkaU1kcQ0KLURvQ2pqdmJkcm92UEtEV0cNCi1Eb0RLanZiZFppc0hvZmJHDQotRG9ES2p2YmRFT2NMS3dERQ0KLUVQQ2pqdmJkaGZqRFpXSnUNCi1EbmNLanZiZGhmakN5V0p1DQotRU9jTEt2YmR0U3FzWXpFYw0KLURvRExLdmJkYlFISEVMemQNCi1Eb0RLanZiZHlTbkltUmJIDQotRU9jTEt2YmRWcW14Q0VsRA0KLURuYmpqdmJkTmRjc2lKS2QNCi1FUENrS3ZiZGtOQmt6RWZvDQotRG5ia0t2YmRKS0VBS1BmZA0KLURuY0xLdmJkaWlmSUpsd3INCi1EbmJqanZiZGh0ekV2cXRiDQotRU9iamp2YmR3V2xBdkJXVg0KLUVQRExLdmJkbGhjdFF1U0INCi1FT2NMS3ZiZE5kZFVJaUtkDQotRVBES2p2YmRKU3hhVE14TQ0KLUVQRExLdmJkVnJPWGFlTUQNCi1Eb0RMS3ZiZEdjanZLQmpLDQotRG5jTEt2YmRxdnBMYmlaUg0KLUVQQ2tLdmJkaktGZ2lseFMNCi1EbmNMS3ZiZERvQ2pqdmJkDQotRG9Damp2YmRxcXRqbkthTg0KLUVPY0tqdmJkQnZ6ZEpFcFcNCi1Eb0NrS3ZiZGNhcmxyQVRtDQotRG9ETEt2YmRRZENhUVFkUw0KLURuY0tqdmJkVnFuWGFka2MNCi1Eb0NqanZiZEp2VWVjZGdKDQotRG5ia0t2YmRWWWhVWmtQTw0KLUVQREtqdmJkeFpnZkZ4RXINCi1FUENqanZiZHNQdW5pY1dHDQotRG5ia0t2YmRtU1l0eXJkSg0KLURuYmpqdmJkVHVsUUpzYVINCi1EbmNLanZiZHNyclN4eWVEDQotRG5ia0t2YmR6UW5tSkp3QQ0KLURuY0tqdmJkYXRhZnhMVGgNCi1FT2NMS3ZiZG1mZVlOTmdaDQotRU9ia0t2YmROeE91emNuVQ0KLUVQRExLdmJkRHd3a3NzdE0NCi1FUERMS3ZiZHhuVElZVEljDQotRVBES2p2YmRIZ0d5eVh4SA0KLUVPY0tqdmJkR0FucHlKem0NCi1Eb0NrS3ZiZFVRcVBWVWhODQotRG5jTEt2YmRZZ1dkQU9yaQ0KLURvRExLdmJkeWdaTUFORlgNCi1FUENrS3ZiZHJKQUpkbG5lDQotRVBETEt2YmRabm1oZUV5ag0KLURuYmpqdmJkSXhVQ0hrcHANCi1EbmJrS3ZiZGpKZWhKbHdyDQotRG9ES2p2YmRobEVkTnVEWg0KLUVPY0tqdmJkZU9lU2tUc3INCi1FT2NMS3ZiZFZxbllCZGxEDQotRG9ES2p2YmRlQVRxTXdpZg0KLUVQQ2pqdmJkclhRTGJoeVINCi1EbmJqanZiZEZrRXJiaE11DQotRG9Damp2YmRweG5oSFFjeA0KLUVPY0xLdmJkcldwTURJeHENCi1FUERLanZiZFZoWVdZR3h6DQotRG9Da0t2YmR3eklHRnhGUw0KLURvQ2pqdmJkRXp0UWVMYmkNCi1EbmJqanZiZGxaVFJyeGdVDQotRG5jTEt2YmRTWmloU2J2QQ0KLURuYmpqdmJkcnpMcFRBZ24NCi1FUENqanZiZE5yc3VnRlZRDQotRG5iamp2YmR4VWxlUXhsTw0KLURuY0tqdmJkdGt3d0JVQXcNCi1Eb0NqanZiZGJCVmRlb293DQotRVBES2p2YmRFT2Jqa1hERQ0KLURuYmpqdmJkaGdKYnh2S1YNCi1FUENrS3ZiZEl3dENIbFFwDQotRG9Da0t2YmR4bXNJWHJoYw0KLUVPYmtLdmJkZGVQU0NYREsNCi1FT2NLanZiZFZyT1hiRWtjDQotRU9jTEt2YmRGVnlQb21KZQ0KLURvRExLdmJkUkVEQlBxRHINCi1EbmNMS3ZiZGFOTENTdG1IDQotRG5jTEt2YmRiQXVkZlFQdw0KLURvREtqdmJkUmFjZUxpWkwNCi1Eb0NrS3ZiZEpZVUNJTVJRDQotRG5ia0t2YmRZa3JEdE9NTg0KLURuYmpqdmJkRmtGVENoTlYNCi1FT2NMS3ZiZFpSTWVJbUZSDQotRU9ia0t2YmRVeGdzekxPbg0KLUVPY0tqdmJkRmpkc0NoTXUNCi1FT2JrS3ZiZHJhZk5MZ0xaDQotRVBES2p2YmRlbGV3R21Kaw0KLUVPY0tqdmJkWk1SY3RObE4NCi1Eb0RMS3ZiZGxpRVVRdHFhDQotRG5jS2p2YmRxVVVIU1JqdA0KLUVQREtqdmJkdUNidHdWbm8NCi1Eb0NrS3ZiZGFhVmVGb293DQotRVBETEt2YmRrQ2xLcUd1SA0KLURvRExLdmJkQ2ZsRmdBemMNCi1Eb0RMS3ZiZFRBRWhnYlBFDQotRU9ia0t2YmRtdHVaampSZg0KLUVPYmpqdmJkS0RLQ3FKYngNCi1EbmNLanZiZHJvdk9qRFZmDQotRG9Da0t2YmRodHpGV3F0Yg0KLURuY0xLdmJkRXZZcFFOS0YNCi1FT2NMS3ZiZGVGUFJhdmNLDQotRG9ETEt2YmRobEVjblVieQ0KLURvQ2tLdmJkZWdqdlNPUWcNCi1EbmNLanZiZGhiUENlV3BxDQotRG5iamp2YmRzcnJUWXllRA0KLURuY0xLdmJkVGxXUEF2T2kNCi1FUENqanZiZHd6SGVleEVyDQotRG5jTEt2YmRtSkVVUXVSYQ0KLURuYmtLdmJka0lITGVlbWsNCi1FT2JrS3ZiZGh0eWVYU1ViDQotRU9jTEt2YmRIRGtXS0NKag0KLUVPY0xLdmJkUmJEZGtoeUwNCi1FT2JrS3ZiZFJvc2ZpZkR3DQotRVBDamp2YmRPU3RWZmR1UQ0KLURuYmtLdmJkaUhKYnh1alYNCi1Eb0NqanZiZHNQdW9KY1dHDQotRVBDa0t2YmREeFhrdFR0TQ0KLURvQ2pqdmJkSERqdWpDSmoNCi1FT2JqanZiZFVXTG9pc2FSDQotRVBES2p2YmRxaUFLRW1PZQ0KLURvRExLdmJkeG1zSVlTaGMNCi1FUENrS3ZiZENKS2JLaUdLDQotRG9ETEt2YmRSRUNhUVJEcg0KLUVQRExLdmJkWXFORWlORXENCi1EbmJrS3ZiZGlNRWNuVkN5DQotRG9Da0t2YmR1Q2J0d1Zubw0KLURvREtqdmJkSGJNWmR6QUQNCi1EbmJrS3ZiZGVtR1hHbUtMDQotRG9ETEt2YmRnUUJ6d0R3aA0KLURvREtqdmJkS1F6RW9HT0YNCi1Eb0RLanZiZFdTTndhZU1EDQotRVBES2p2YmR5U21obHFiSA0KLUVPYmtLdmJkRHhZTHRUdE0NCi1EbmJqanZiZEZ4dVZCRVhiDQotRU9iamp2YmRpQm9DZHdSUg0KLUVQQ2pqdmJkR1FBVFdnR1oNCi1FUENrS3ZiZFlwbGVKTkVxDQotRU9jTEt2YmR2UFR6cUtvVQ0KLURuYmtLdmJkWlFtRWhsZHENCi1EbmNLanZiZExCS2dNYXdxDQotRVBDa0t2YmRxRmNlVHZBaA0KLUVQQ2pqdmJka0lITUZlbkwNCi1Eb0RLanZiZGVoTFZxblJIDQotRG9ES2p2YmR4d2hpYlB5aw0KLURuYmtLdmJka01iTVplSFANCi1FT2NLanZiZHNyclN5WmVEDQotRU9jTEt2YmRNb3dwdW5IVA0KLUVPYmpqdmJkSnFaZG5mT0YNCi1Eb0NrS3ZiZGV6dXhkaHRYDQotRG5iamp2YmRhYVdGRm9wWA0KLURvQ2pqdmJkcWRGSlFPVmENCi1FUENqanZiZFdXaHd1ZEZIDQotRVBES2p2YmRodHpGV3JVYg0KLUVQQ2tLdmJkV1NOd2FlTUQNCi1FT2JrS3ZiZGNJbGlrRnZ4DQotRVBDa0t2YmRhdUNHd2tUaA0KLUVQQ2tLdmJkYmhtSmtHV3gNCi1FUERLanZiZFJvc2dKZkVYDQotRG5ia0t2YmRUdk1RSnRBcQ0KLURuYmtLdmJkc0JmTWxHa1oNCi1EbmJrS3ZiZFZyTnhDRWxEDQotRG9ETEt2YmRtcFp4dWtaQw0KLUVPYmtLdmJkaGxFY25WQ3kNCi1FT2NMS3ZiZHd6SUZmWUZTDQotRG5ia0t2YmRadEloeGRTbg0KLURvRExLdmJkamdma2ZGbWsNCi1Eb0RMS3ZiZHFUdEhTUmtVDQotRU9iamp2YmRTQ0RlTGlaTA0KLURvREtqdmJkZUFUcGx4SmYNCi1EbmJrS3ZiZElCa3pFekFEDQotRU9jS2p2YmRGV1pRUGxqRg0KLURvQ2pqdmJkUmJEZU1KWWsNCi1FUERMS3ZiZERvQ2tLdmNFDQotRG9Da0t2YmRaalNoUGZiRw0KLURuYmpqdmJkTlB4UXZPR3MNCi1FUERMS3ZiZEt5UWlyenRmDQotRG9ETEt2YmRKdXRlY2RmaQ0KLURvQ2pqdmJkVHBwb1V1SG0NCi1FUERMS3ZiZGpFa0d1UEFPDQotRG5ia0t2YmRWVG1UZWt1ag0KLURuYmtLdmJkWnlFSm1jTVMNCi1FT2NLanZiZE5kZFRoaGpkDQotRG5jTEt2YmRyRGRocE51YQ0KLUVPY0tqdmJkQmlMQmtKR0sNCi1Eb0NrS3ZiZHJYUGtiaHhxDQotRG5iamp2YmRaUW1FaU1kcQ0KLURuY0xLdmJkaHpVZk1ST0cNCi1FUERLanZiZHVhRVlyb0VoDQotRG9Damp2YmRKWVVDSGtxUQ0KLURvQ2pqdmJkd3pIZkZ4RXINCi1FUENqanZiZExpQmtxWUFTDQotRG9ETEt2YmR4WmdmRnhFcg0KLURvQ2tLdmJkcmFlbUxnTFoNCi1Eb0RMS3ZiZHh4Skphb3pMDQotRVBETEt2YmRLZWVoQmFSVg0KLURvQ2tLdmJkUElBWVpBWkINCi1FT2JqanZiZEJ2emRJZG92DQotRG9ES2p2YmRqYmxLcUd1SA0KLURvREtqdmJkbGhkVVJWU0INCi1FUERLanZiZHF2cE1ESlpSDQotRG5jS2p2YmRhamtlb09EQQ0KLUVPY0tqdmJka3lTcXNaSFUNCi1EbmJqanZiZEpxWmRuZk9GDQotRG5jS2p2YmRaSFdkQU9zSg0KLURvQ2tLdmJkYU5MQ1N0bGcNCi1Eb0RMS3ZiZFZaSHN6S25uDQotRG9Damp2YmR0dk9ZSnBzQQ0KLURvQ2pqdmJkTlB4UXZOZnMNCi1Eb0RMS3ZiZFpMcWN0T01ODQotRU9iamp2YmR2d01BdkF2Vg0KLURuYmtLdmJkRXV4cFBsaWUNCi1EbmJrS3ZiZEFNaFlzV3l4DQotRG9Da0t2YmR0dW13alFzQQ0KLUVQQ2pqdmJkVkFhcHJxUnkNCi1FT2JrS3ZiZGxaU3FzWWdVDQotRU9ia0t2YmRCdnpkSWRvdg0KLURuYmpqdmJkeU9TaFlUSkQNCi1FT2NMS3ZiZFpzaGh4ZFNuDQotRVBES2p2YmRVdE1zZWxXSw0KLURvRExLdmJkWXFORWlNZVINCi1EbmNMS3ZiZGRlUFNCd0RLDQotRG5jTEt2YmRxWW5nZ1FjeA0KLURuYmtLdmJkcWNlSlFPVmENCi1Eb0RMS3ZiZHRTclRaWmVEDQotRVBDamp2YmRBTkh5VFd6WQ0KLURvRExLdmJkY0lsaWtGdngNCi1Eb0RLanZiZHhtc0h3c0ljDQotRU9ia0t2YmRZemJmUml1eQ0KLUVQREtqdmJkV0h3dXdmeHoNCi1FT2NMS3ZiZGRuZHNMVHNyDQotRU9ia0t2YmR3WE1BdWFWdQ0KLUVQRExLdmJkYlZCZndqdEkNCi1FT2JqanZiZGZNZlhITWlrDQotRG9Da0t2YmRPWG9WemRPVQ0KLURuYmtLdmJkbkdlWGxuSFoNCi1FUENqanZiZEdHSnJPSlRxDQotRVBDa0t2YmRoYW5iZVdxUg0KLUVPY0xLdmJkTGhiTHB4QVMNCi1FUERMS3ZiZGJCVmRlcFB3DQotRU9jS2p2YmRXU053YWRsRA0KLURvQ2tLdmJkYVJmQ2hUZWsNCi1FUENrS3ZiZG1iSnZ4T211DQotRG9Da0t2YmRDU2FDc2ZYUw0KLUVPYmtLdmJkYmhsaktld1kNCi1EbmNMS3ZiZGRaeG93eHBiDQotRG5iamp2YmRSRGNCUVFkUw0KLURuYmpqdmJkS0RKYnFLRFkNCi1FT2JrS3ZiZFdSbXhDRkxjDQotRVBETEt2YmRZbFNFVG1rbQ0KLUVPY0xLdmJkTUlhbFJZQVMNCi1Eb0RLanZiZENFUUF1aW1HDQotRVBES2p2YmRDVEFjVGV3Uw0KLUVQQ2pqdmJkclJ0a09LYU4NCi1EbmJrS3ZiZHRUUnJ5WmVEDQotRG5iamp2YmRNZ0NvbHBWTA0KLUVPY0tqdmJkckRkaG9tdWENCi1FUERLanZiZFJiRGVNSlpMDQotRG5ia0t2YmR4blNnd3JoYw0KLURvREtqdmJkVnZoeFZkRkgNCi1EbmNLanZiZExZcUpyenVHDQotRG5jTEt2YmRac2lJeUVUTw0KLUVQRExLdmJkaWVMSFVvQU8NCi1FUERMS3ZiZE5zVVZnRXVRDQotRVBETEt2YmRvQUt6dEhjbg0KLURuY0tqdmJkZk5GdmdOSmsNCi1Eb0NrS3ZiZHFZb0hnUWN4DQotRG5jTEt2YmRkd3pVVVNGeg0KLURvQ2tLdmJkSUhHelpZWGcNCi1EbmNMS3ZiZGRaeHBYeHBiDQotRG5iamp2YmRobEZEblVjWg0KLUVQQ2pqdmJkU0t4ZlVmanMNCi1Eb0NrS3ZiZGJBdkZHUHBYDQotRU9jTEt2YmRWaFh1d2Z4eg0KLUVQQ2tLdmJkZG9Fc0t0VHINCi1EbmNLanZiZGhrZUVPVkRaDQotRU9iamp2YmROVXJxam1BWA0KLUVQRExLdmJkVVdMb2pUYVINCi1Eb0RMS3ZiZFdJWVZ3Znh6DQotRG5ia0t2YmRVdE1zZWt2Sw0KLUVPY0tqdmJkUnBVSEplY3cNCi1Eb0RLanZiZENKS2JLaUZqDQotRU9iamp2YmRFdXhvb21KZQ0KLUVQQ2pqdmJkTHJXbHl0cHoNCi1FT2JqanZiZE1nRFBsb3RrDQotRG5jTEt2YmROcnRXSEZWUQ0KLURvQ2pqdmJkWmVZR3pnaUMNCi1FUENrS3ZiZEthS2ZtQ1lSDQotRG9Damp2YmRqbGFrekVmbw0KLUVQREtqdmJkcGVjZVR2QkkNCi1EbmJrS3ZiZEtES0NxSmNZDQotRG9ES2p2YmRNb3dxV05nVA0KLUVQREtqdmJkUk14Q1ltdHoNCi1FT2JqanZiZHJYUUxiaVlxDQotRG5jTEt2YmRabm1oZUZaag0KLUVPY0xLdmJkaUxlRU50Y1oNCi1EbmNLanZiZHphQVBHZmFsDQotRVBDa0t2YmRlQVRxTllLRw0KLUVPYmpqdmJkU0NEZGxJeUwNCi1Eb0NrS3ZiZFZaSHRaam5uDQotRVBDamp2YmRadEloeGRUTw0KLUVQREtqdmJkVGxWb0F1b0oNCi1FT2JqanZiZFpSTkZJbGVSDQotRG9ETEt2YmRFUERMS3dDZA0KLURuYmpqdmJkZlJhV3prYm8NCi1FUERMS3ZiZGRuZVNqc3RTDQotRU9ia0t2YmR1Q2J0d1dPbw0KLUVQQ2tLdmJkbW95eVdLeUMNCi1FUENqanZiZGVoTFZyT1JIDQotRG9ETEt2YmR1Q2NVdnVubw0KLUVPYmtLdmJkZFp4b3d4cUMNCi1FT2JrS3ZiZEtReWRvRm1lDQotRVBDa0t2YmRxcXRrT0thTg0KLURvREtqdmJkdWFFWXNPZUkNCi1FT2JrS3ZiZGVQRXNMVVRyDQotRG9ETEt2YmRic0RMVGNpYQ0KLURuY0xLdmJkRHd3bFR0VU0NCi1FT2NLanZiZE9FZFVJaGtFDQotRG9ETEt2YmR0dk9YalJUQQ0KLUVPYmtLdmJkZUZQU0NYQ2oNCi1FUENrS3ZiZHFsekp4bElKDQotRU9jS2p2YmRVTVZvQlZuaQ0KLUVQQ2tLdmJkcXF0a05rQk4NCi1Eb0RMS3ZiZGlWWmVXcXVDDQotRG5jS2p2YmRaTHJEc21sTg0KLUVQQ2tLdmJkeml0b3BFU3QNCi1FT2NLanZiZG5CalhZUE9WDQotRU9ia0t2YmRlaEt1ck9RZw0KLURvQ2pqdmJkbUpEc3B0ckINCi1EbmJrS3ZiZGFOS2JUVk5IDQotRG5jTEt2YmRHUUFTdmZleQ0KLUVPY0xLdmJkdGJjVXdWbm8NCi1FT2NLanZiZHFVVUhTU0xVDQotRU9jTEt2YmR2d0xhV0JXVg0KLUVQQ2tLdmJkUmFjZGxJeGsNCi1EbmJrS3ZiZHhaZ2ZHWGVTDQotRU9jTEt2YmRWQWFwc1FxeQ0KLUVPY0xLdmJkUXZuRUNraEQNCi1FUERLanZiZENXemNoZHBXDQotRG9Damp2YmRwZWRGVVdCSQ0KLUVQREtqdmJkcXZwTUNpWXENCi1FUERMS3ZiZEVQREtqd0NkDQotRG5jTEt2YmRHY2tXSmFpag0KLUVPYmpqdmJkZ1BhendFWGgNCi1Eb0NrS3ZiZFVWbFBpdEJSDQotRG9Damp2YmRNU1hNelZReg0KLURuYmtLdmJkbGlFVVF1UmENCi1Eb0NrS3ZiZE9TdFZnRlVwDQotRVBDamp2YmRVdE10R01Wag0KLURvQ2tLdmJkS1dWRmRGSEoNCi1FUENrS3ZiZFV4aFVaa09uDQotRG5ia0t2YmRMQktmbGJZUg0KLUVQQ2tLdmJkRmtFc0NnbHUNCi1EbmJrS3ZiZEtDaWJwakN4DQotRG5ia0t2YmRHTEVzQ2hOVg0KLURvQ2pqdmJkTEdGaENBcHUNCi1EbmNMS3ZiZGVYelRzcWV6DQotRG9Da0t2YmR4cm1obHFiSA0KLUVQRExLdmJkWWxSZFRtbE4NCi1FUENqanZiZHFZbmhIUkR4DQotRVBES2p2YmRXZll6VUFPcw0KLUVQQ2tLdmJkTUpDTHB4QVMNCi1FT2JrS3ZiZHVDYnR3Vm9QDQotRG9Da0t2YmRtZmR3bG1meQ0KLUVQQ2pqdmJkVkJCcHJwcXkNCi1Eb0RMS3ZiZEVLSGl2WGpBDQotRG9ETEt2YmRrV1duRUNZWA0KLUVPY0tqdmJkcVVVSFNSa1UNCi1EbmNLanZiZFlsUmNzbkxtDQotRU9jS2p2YmRlbGZXZm1Kaw0KLUVQRExLdmJkWnRJaHhjc08NCi1FT2NMS3ZiZEdLZHJjSU5WDQotRVBETEt2YmRPQUlzVUtTQQ0KLURvQ2pqdmJkWEZ4eXRBT3MNCi1FUENqanZiZFVRcG50dUlODQotRVBETEt2YmRUdkxwSnRCUg0KLUVQREtqdmJkUnlpaFNidkENCi1EbmJqanZiZGh5dUZsUk9HDQotRU9ia0t2YmRaeGNpbkNsUw0KLUVPY0tqdmJkcHRUZnFyS3QNCi1Eb0RMS3ZiZFVSUlBVdGdtDQotRU9ia0t2YmRhTktiVFZOSA0KLUVPY0xLdmJkaVp1RmxRbWYNCi1FUERLanZiZGVQRXNMVVRyDQotRVBDamp2YmRGeHVVYUVZQw0KLUVQRExLdmJkbGlFVHB1UmENCi1FT2JqanZiZGpLRmhLTllTDQotRG9Da0t2YmR3ekhlZlhlUw0KLURvRExLdmJkRmZKcW1pVVINCi1FT2JqanZiZGNKTWpLZXdZDQotRU9iamp2YmRxZEZJb211YQ0KLURuYmtLdmJkRmVqUm5KVHENCi1EbmJqanZiZEV6c3FGTUNpDQotRVBETEt2YmRoelVlbFJPRw0KLUVQREtqdmJkTEthSVdBS1oNCi1Eb0NrS3ZiZEdHSnJPSXNxDQotRU9jS2p2YmRWVU10R01XSw0KLUVPYmtLdmJkbXBaeVZrWkMNCi1Eb0RMS3ZiZEpUWWFTbVhsDQotRU9iamp2YmRtU1pVeXJjaQ0KLUVPYmtLdmJkeG5TZ3dzSWMNCi1FT2NMS3ZiZGhnSmNZdWpWDQotRG9ES2p2YmRVUXBvVlZIbQ0KLUVQREtqdmJkS1dWRmRFZ0oNCi1Eb0NrS3ZiZFdYSlh1ZEVnDQotRU9ia0t2YmRkeFp0VVJleg0KLURuYmtLdmJkWlJNZUpORXENCi1FT2NLanZiZHB4b0lIUkR4DQotRU9ia0t2YmRHR0tTT0pUcQ0KLUVPY0tqdmJka0lITUZlbkwNCi1FUERMS3ZiZFRxUW9VdGdtDQotRG5iamp2YmR0dk54SnBzQQ0KLURuYmtLdmJkRnlVdGFEeEMNCi1EbmJrS3ZiZFNMWWV1SEtzDQotRG5jTEt2YmR4cm1obHJCZw0KLURuY0xLdmJkR2RMV0phaksNCi1FUENrS3ZiZFNQdEhKZkVYDQotRVBDa0t2YmRlS0pyVnR6bg0KLURvQ2pqdmJkV1JuWGFkbEQNCi1EbmNLanZiZGhrZGNtdGJ5DQotRG9ETEt2YmRWdmlZV0VGSA0KLUVPY0tqdmJkVEFGSklDUEUNCi1FUENqanZiZENKS2JMSWVqDQotRG9ETEt2YmR5WUpKYW95aw0KLUVQREtqdmJkTnNVVmdGVXANCi1FUENqanZiZHJEZGhvbXVhDQotRG9ES2p2YmR5U25KTlJhZw0KLUVQQ2pqdmJkeU5yZ3hTaGMNCi1EbmJqanZiZEFEUnhLWmhwDQotRG5ia0t2YmRhTWtDU3RtSA0KLUVQREtqdmJkZklLdlJuUkgNCi1EbmJrS3ZiZG9BS3p0SUVPDQotRG5iamp2YmREakhqVndqQQ0KLUVPYmtLdmJkanV3T0RiWVgNCi1Eb0RMS3ZiZGJobUtLZld4DQotRVBETEt2YmRLYUxHbGF4Ug0KLURvRExLdmJkd3pJR0Z4RlMNCi1FUENrS3ZiZEdCT3B4aXptDQotRVBES2p2YmRSWE9EY01IYw0KLUVPY0xLdmJkWXFORkpNZHENCi1FT2NLanZiZHhVbGVReGtuDQotRVBES2p2YmRaaXJncEhDRw0KLURuY0xLdmJkZXJBdnprYm8NCi1FUENrS3ZiZFR2TVBpc2FSDQotRVBDa0t2YmRadEpJeGRUTw0KLUVPY0tqdmJkZGVQUmF2Y0sNCi1EbmNMS3ZiZENEcEF1aW1HDQotRVBETEt2YmRRZENhUHFFUw0KLUVPYmpqdmJkWnlFSm1ia3INCi1Eb0RMS3ZiZE9FY3NpSWtFDQotRU9jS2p2YmRyYkZsa2dMWg0KLUVPY0tqdmJkUmFjZGxKWkwNCi1FUENrS3ZiZEtES0NxS0N4DQotRVBES2p2YmRyRGVJb25WYQ0KLURuY0tqdmJkT0ZFVGhoamQNCi1EbmNMS3ZiZExBa0hNYlhxDQotRU9ia0t2YmRoeXRla3BuRw0KLURuY0xLdmJkclNVa09MQW0NCi1EbmNMS3ZiZGlDT2NGV3BxDQotRG9Damp2YmRyeWxQc0FoTw0KLUVPY0tqdmJkeFZORXB5TG4NCi1EbmJrS3ZiZG1iSnZ3bm5WDQotRG5ia0t2YmRWQWJRc1FyWg0KLUVQQ2tLdmJkQ1RCQ3RHWFMNCi1EbmNLanZiZFRBRWlIYlBFDQotRU9iamp2YmRGZWlxbkpUcQ0KLUVQRExLdmJkRHhZTVR0VGwNCi1EbmNMS3ZiZEhEa1ZpYktLDQotRG5ia0t2YmRkZVBTQnZjSw0KLURvQ2pqdmJkYXVDR3drVGgNCi1FUERMS3ZiZFdJWVdZR3h6DQotRG9ETEt2YmRqY0xqcUhWSA0KLURvRExLdmJkVGZ6bk1YV0YNCi1EbmJrS3ZiZGtWd05jYXd3DQotRU9iamp2YmRsWXJyU3hnVQ0KLURuY0tqdmJkYU5MQ1RVbUgNCi1FT2NLanZiZHpub3FFYmxZDQotRG5jTEt2YmRqdXdPRUJ3dw0KLURuY0tqdmJkR1FBVFhIR1oNCi1FT2NLanZiZGladUZrcG1mDQotRVBDamp2YmRhamxHT25EQQ0KLUVQREtqdmJkSmNKYnBqQ3gNCi1EbmNLanZiZGF1QmdYanRJDQotRVBDa0t2YmRzWmtwVEFoTw0KLUVQQ2tLdmJkT0VkVUloamQNCi1FT2NLanZiZE5zVVdHZHVRDQotRG5ia0t2YmRWVGx0RmxWag0KLUVPYmpqdmJkYU5LYXNWTkgNCi1EbmJqanZiZGhhbmNFdnBxDQotRVBETEt2YmRadElpWkVUTw0KLURvREtqdmJkRnh1VWFFWUMNCi1Eb0RMS3ZiZExHR0hiQXFWDQotRG9ES2p2YmRxY2VJcE9XQg0KLURvREtqdmJkdkJFWlRQRWgNCi1Eb0RLanZiZEtlZkhiQlF1DQotRVBETEt2YmRsWlRTU3lIVQ0KLURuY0tqdmJkblB5eVdLeUMNCi1FT2JqanZiZHNaa3BUQkhuDQotRG9Damp2YmRhYVZkZXBQdw0KLUVQREtqdmJkdGt3dmFVQXcNCi1FT2JqanZiZEVQQ2tLdmJkDQotRVBDamp2YmR0a3d2YVVCWA0KLURuY0tqdmJkUmJEZU1JeUwNCi1FT2NLanZiZHh3aGpCb3lrDQotRG9ETEt2YmRGeHVWQWN4Qw0KLURuYmtLdmJkeFpnZkZ4RlMNCi1FT2NLanZiZGpoR2tlZk5rDQotRU9jS2p2YmRFUERLa1djRQ0KLUVQRExLdmJkUXZuRURNSUQNCi1FT2NMS3ZiZHFxdUttamFODQotRG9Da0t2YmRadEpKWkVTbg0KLUVQRExLdmJkVGt2T2FXUEoNCi1EbmJqanZiZGNTYmtVRUphDQotRU9iamp2YmRRbHhCeG10eg0KLUVPY0xLdmJkZWhLdXFtcGcNCi1FT2JqanZiZHB5T2dnUWN4DQotRG5jTEt2YmRuVlZaampTRw0KLUVQQ2pqdmJkeXFPbUlpd0ENCi1FUERMS3ZiZGRaeHBYeVJDDQotRU9ia0t2YmRSWE9EY01JRA0KLUVPY0tqdmJkbkhGWGxtZnkNCi1FUERLanZiZHpucFFkY0x4DQotRU9jTEt2YmRxR0RkdFdCSQ0KLUVQQ2pqdmJkWm9OaGRkeksNCi1FT2NLanZiZHFUc2dTU0xVDQotRU9jTEt2YmRSekpoVEN2QQ0KLUVPY0tqdmJkQ0lqYkxJZksNCi1EbmNLanZiZEtRekVvR05lDQotRU9jS2p2YmRBQ3JYaXpKUQ0KLUVPYmpqdmJkRXpzcGRrY0oNCi1FT2JrS3ZiZHNabFFUQWhPDQotRVBES2p2YmRmb2F6d0VZSQ0KLURvRExLdmJkakFRR2FRR2oNCi1Eb0RMS3ZiZEV6c3FGTUNpDQotRVBES2p2YmR5WUpKYXBaaw0KLURuYmtLdmJkSXhVQmdsUlENCi1Eb0NqanZiZHRUUnNZeWVEDQotRVBES2p2YmRHS2RzRElNdQ0KLUVPY0xLdmJkRnlWVkFjeEMNCi1EbmJrS3ZiZFpMckR0TmttDQotRVBETEt2YmRzcnFyeHlkYw0KLUVQREtqdmJkcnBWbmpDdkcNCi1Eb0RMS3ZiZG1TWXR6VEVKDQotRVBES2p2YmRhamtmT21jQQ0KLUVQRExLdmJkc3NTU3h6RWMNCi1FT2JqanZiZER4WU1Uc3NsDQotRG5ia0t2YmRpTUZFT1ZEWg0KLUVPY0xLdmJkVUx2T2FWbmkNCi1FUERMS3ZiZGxxeVV6U2RKDQotRU9iamp2YmRab05oZUZaag0KLURuY0tqdmJkY1NjTFRkS0INCi1FT2JrS3ZiZEdMRlRESU5WDQotRG5jS2p2YmRjeXlRWVpSQw0KLUVPY0tqdmJkWXFNZUlsZHENCi1Eb0NrS3ZiZE9FY3NoaGtFDQotRU9ia0t2YmRpcnpocmppeg0KLUVPY0xLdmJkeFVtRlJZbE8NCi1Eb0RLanZiZGt5VFJzWkd0DQotRG5jS2p2YmRJcnlBc05ZTQ0KLUVPYmtLdmJkdVdOeEpwc0ENCi1EbmNLanZiZFlrcWNzbkxtDQotRG9ETEt2YmRkWnhwWHlRYg0KLURuY0tqdmJkUm90R2llZFgNCi1EbmJrS3ZiZEtWdGVkRWdKDQotRU9jS2p2YmRqdlduRUJ3dw0KLUVPYmtLdmJkRnlWVkFkWGINCi1Eb0NrS3ZiZFlsU0VVTmttDQotRU9jS2p2YmRjVERMVGNpYQ0KLUVQQ2tLdmJkempVcFFFU3QNCi1EbmJrS3ZiZHFVVGZxckxVDQotRVBES2p2YmRTUVVISmZFWA0KLURuYmpqdmJkaUdqRFl2S1YNCi1FT2JrS3ZiZGhrZGNuVkN5DQotRVBDamp2YmRKdXVGZEZISg0KLUVPYmpqdmJkWWtxZFRuTU4NCi1Eb0NrS3ZiZHBzc2dTUmtVDQotRU9ia0t2YmRVV0xwS1VCUg0KLURvREtqdmJkWnNpSlpFU24NCi1EbmJrS3ZiZFlxTWRobUVxDQotRG9Da0t2YmRqY0xrUkhWSA0KLURuYmtLdmJkU1BzZ0tHRHcNCi1Eb0RMS3ZiZEtWdGZFRWZpDQotRVBDamp2YmRpR2lieVdLVg0KLUVQQ2pqdmJkRVlZTHRVVGwNCi1FUENqanZiZEZlalNPSXNxDQotRG5jTEt2YmRSRUNhUVJFUw0KLUVQQ2tLdmJkRXV5UVFOS0YNCi1FT2JrS3ZiZHh3aGpDUHpMDQotRG5jTEt2YmRpTGVEblVieQ0KLUVPY0tqdmJkRXV4cFFNaWUNCi1FT2NLanZiZElpZEFKb2dFDQotRG9ES2p2YmR4c05obHFhZw0KLUVPY0tqdmJkRXpzcUZMY0oNCi1FT2JqanZiZFlUTUFtVG9ZDQotRG9ETEt2YmR3dU5GUXlMbg0KLURvQ2tLdmJkeml0cFFEcnQNCi1FT2NMS3ZiZFp0Skl4ZFNuDQotRG5jTEt2YmRxWlBIZ1JEeA0KLUVQRExLdmJkTW94UXZOZnMNCi1EbmNLanZiZG1JY3RRdVNCDQotRG9Da0t2YmRGZktTTmlVUg0KLUVQRExLdmJkaHR5ZHZxdGINCi1FT2JqanZiZHhybkpOUmFnDQotRG5iamp2YmRkb0ZUS3Nzcg0KLUVQREtqdmJkcWx5alpMZ2kNCi1EbmJrS3ZiZHlOc0h3c0pEDQotRU9jTEt2YmR4blRId3NKRA0KLUVPYmpqdmJkVVFxT3R1SU4NCi1EbmJrS3ZiZHd0bGVReU1PDQotRG9ETEt2YmRyb3ZQS0RWZg0KLUVPY0xLdmJkRmFQUXhpem0NCi1FT2JqanZiZFZBYXBzUXF5DQotRU9jS2p2YmRKdlZGZEZHaQ0KLURuYmtLdmJkdUREVlhWbm8NCi1FT2JrS3ZiZFpqVEhwR2JHDQotRU9iamp2YmRaaXJnb2ZhZg0KLURuY0tqdmJkQU1neVN2elkNCi1Eb0RLanZiZEdkTFZpYktLDQotRG9ES2p2YmRXUm13YkVrYw0KLURuY0tqdmJkWHNNQWxzbngNCi1Eb0RMS3ZiZHRjQ3VYVm9QDQotRG9ETEt2YmRxbHlqWWxJSg0KLUVQQ2pqdmJkSEVMVmpDS0sNCi1EbmNMS3ZiZEJkUUF1aWxmDQotRG9Damp2YmRlRk9yQ1hESw0KLURvQ2pqdmJkUnBUZ0pmRHcNCi1Eb0NrS3ZiZExBa0hNYlhxDQotRU9jTEt2YmRhUmViaFVHTA0KLURuY0xLdmJkblFaeVdMWWINCi1FT2JqanZiZFhzTUJOVU94DQotRG5jS2p2YmRyU1ZLbkthTg0KLUVQQ2pqdmJkQU1oWlN3WngNCi1FT2NMS3ZiZGNTY0t0RUtCDQotRG5jS2p2YmRLYUxHbGF4Ug0KLUVPY0tqdmJkWlJNZUpORlINCi1FUENrS3ZiZHd5Z2Vld2RyDQotRG5ia0t2YmRoYW5jRlhSUg0KLUVPY0tqdmJkT1RVVmZkdHANCi1FUERMS3ZiZG1iS1hZT25WDQotRG9ES2p2YmRHTEZTYmhOVg0KLUVQRExLdmJkTWZib21QdGsNCi1EbmJrS3ZiZG1JY3NxVlJhDQotRG9ES2p2YmR3dG1GUlpMbg0KLURvQ2tLdmJkZHRBVUFUTXYNCi1EbmNLanZiZGlCb0RFdnFSDQotRU9ia0t2YmRpSEpjWXVqVg0KLURuYmpqdmJkaUNQREZXcVINCi1FT2NLanZiZHlUTmhsckNIDQotRG9ES2p2YmROUVlSVm1mcw0KLUVPY0xLdmJkRmpkcmJoTXUNCi1Eb0NqanZiZHNyclN5WmVEDQotRVBDa0t2YmRYc01CTXNvWQ0KLURvREtqdmJkamhITGZGbWsNCi1FUENrS3ZiZHlPVElZVEljDQotRU9jTEt2YmRiaG1LTEdXeA0KLURuYmpqdmJkeG5USHdzSWMNCi1FT2NMS3ZiZFpvT0pFZVpqDQotRU9jS2p2YmRqbUJrekVmbw0KLUVQREtqdmJkWU9SQVh1V1UNCi1FUERLanZiZHRreFhBc2FYDQotRG9ETEt2YmR1YUVZc1BGSQ0KLUVQQ2pqdmJkeXBvTklpd0ENCi1Eb0RLanZiZFZCQ1JUUXJaDQotRG5iamp2YmRscll0eXJkSg0KLURvQ2pqdmJkaHpVZWtwbkcNCi1FT2NLanZiZGNUQ2pzZEphDQotRU9ia0t2YmRiaGxpamZXeA0KLUVPY0xLdmJkWVRMYU1zb1kNCi1EbmJqanZiZEtWdGVkRkdpDQotRU9jTEt2YmRzUHZQSmJ1Zg0KLURuY0xLdmJkTnJzdkhFdVENCi1FT2JrS3ZiZG1mZVlNbWZ5DQotRVBDamp2YmRaalRIcEhDRw0KLURvRExLdmJkcHlPaEdxRHgNCi1Eb0RLanZiZFJrWkdWR2pzDQotRG5iamp2YmRSV25FRE1IYw0KLUVQQ2tLdmJkamxiTVpkZm8NCi1Eb0NrS3ZiZHlxT21JaXdBDQotRG9Da0t2YmRkeFpzdFNGeg0KLURuYmpqdmJkS0NpYnFKYngNCi1Eb0NqanZiZHFxdGpuTEJODQotRG5iamp2YmRCaGpiTEpHSw0KLURvRExLdmJkcldva2JoeHENCi1FT2NMS3ZiZEp6cEdYZEFODQotRVBES2p2YmRSTXhDWk50eg0KLURuY0tqdmJka0NsTFJHdUgNCi1EbmNMS3ZiZElISFp4eFhnDQotRVBES2p2YmRac2hpWWRTbg0KLUVQQ2tLdmJkcWNkaG9tdkINCi1Eb0RLanZiZFZUbVVGa3ZLDQotRU9ia0t2YmRaaXNIb2dCZg0KLURvQ2pqdmJkUmJEZGtpWWsNCi1EbmJrS3ZiZEdHSnJPSlRxDQotRG5jTEt2YmRlRlBSYXZjSw0KLURuYmpqdmJkU1B0SEtHRHcNCi1Eb0RMS3ZiZEptQUR5ZnVCDQotRVBDamp2YmRLQ2licGljWQ0KLURvRExLdmJkaUdpY1pWalYNCi1Eb0NrS3ZiZFpMcWRVTmttDQotRVBES2p2YmRWVU5VRmt2Sw0KLUVQQ2pqdmJkZW1GdmZsaWsNCi1FUENrS3ZiZGt4cnFyeGZ0DQotRG5ia0t2YmRSYkVFbEl4aw0KLUVQQ2pqdmJkYWFWZGZRUVgNCi1Eb0RMS3ZiZHlTbWhscWFnDQotRVBDamp2YmRyUnVLbkthTg0KLURuY0xLdmJkZXp1eUVodFgNCi1EbmJrS3ZiZHRiYnVXdW9QDQotRG5ia0t2YmRadEloeGNybg0KLUVPYmtLdmJkY3l4b3haUWINCi1FT2NLanZiZER4WUx0VHRNDQotRU9iamp2YmRqZ2dNRmZPTA0KLUVQQ2tLdmJkR2NrV0piS0sNCi1EbmJqanZiZGRkbnFhdmNLDQotRVBES2p2YmRZZ1dkQVBUSg0KLURuYmpqdmJkYmhsaWtHWFkNCi1EbmNLanZiZE5QeFJWbWdUDQotRU9ia0t2YmRScFVIS0dEdw0KLUVPYmtLdmJkbWZkd2xtZ1oNCi1Eb0RMS3ZiZEJ2emRKRlB2DQotRG5iamp2YmRaSFhFQVBTaQ0KLUVQREtqdmJkYlFIR2RMemQNCi1FT2NLanZiZENJamJMSWVqDQotRG5iamp2YmRPWG51emROdA0KLUVPYmtLdmJkclNVa05rQk4NCi1Eb0RMS3ZiZE5lRHNpSkxFDQotRVBDa0t2YmRpVXllWFJ0Yg0KLUVPYmtLdmJkYnNES3NkSmENCi1EbmNMS3ZiZGJyY0xUZEphDQotRG5jTEt2YmRTUHNnSmVjdw0KLUVPYmpqdmJkS05BRHpHdGENCi1FUERMS3ZiZEZXWlBvbUtGDQotRVBDamp2YmRSektJU2J2QQ0KLUVPY0tqdmJkdm1XQU1jZG0NCi1EbmNLanZiZHd5aEdHWUVyDQotRVBETEt2YmRmSGp1cW5SSA0KLUVQQ2pqdmJkUlhPRURMaEQNCi1FUENrS3ZiZHlPU2d3c0pEDQotRG9ETEt2YmRuQ0tYWU9tdQ0KLURuYmpqdmJkam1DTHllR28NCi1EbmJqanZiZFRZS2xOemp4DQotRG9Damp2YmRaaXNIcEdiRw0KLUVPYmpqdmJkVVdNUGlzYVINCi1FT2JqanZiZHFGY2R0V0FoDQotRU9jTEt2YmRZcU5FaGxlUg0KLURuYmpqdmJkbFpTclN5R3QNCi1FUERMS3ZiZGVQRXNMVHNyDQotRG5jS2p2YmRTQmNkbEpZaw0KLUVQREtqdmJkZVBFc0xUc3INCi1FUERLanZiZHlwbm1JalhBDQotRG5iamp2YmRzUVdQS0N1Zg0KLUVPY0tqdmJkWlJORWhsZHENCi1FUENqanZiZFlwbUZJbUVxDQotRVBDa0t2YmRLZkZoQmFSVg0KLURuY0xLdmJkZXp2WkVodFgNCi1EbmNLanZiZGlDT2JkdnBxDQotRG5iamp2YmRtSkVUcVVyQg0KLUVPY0xLdmJkZnBCenZjeEkNCi1EbmNLanZiZFJiRGRraHhrDQotRVBDa0t2YmRtcFp5VmtaQw0KLUVQRExLdmJkeU5zSVhyaGMNCi1EbmJrS3ZiZHlZSkphb3lrDQotRG5jS2p2YmR3V2xCVmFXVg0KLURvREtqdmJkcXdQbENpWXENCi1EbmNMS3ZiZHZ2a2FWYVdWDQotRG5jS2p2YmRjSk1qS2V3WQ0KLUVPYmtLdmJkYkJXRkZwUHcNCi1FUENqanZiZHB5T2hHcUVZDQotRVBES2p2YmRDRHBBdWpORw0KLUVQRExLdmJkQ1NhQ3RGdnINCi1Eb0NqanZiZHd5Z2ZGeEVyDQotRU9jTEt2YmRMRmVoQmFRdQ0KLUVQQ2pqdmJkc3NTU3h5ZGMNCi1FUENqanZiZEhmZ1p5WVlIDQotRG5ia0t2YmRuQmpXeE9tdQ0KLURuYmtLdmJkY0pOSmpld1kNCi1FT2JqanZiZHJ6TG9yYUlPDQotRU9jS2p2YmRBRFJ3alppUQ0KLUVQQ2tLdmJkT0FKU3RKckENCi1EbmNMS3ZiZGFqa2VubkRBDQotRG9Damp2YmRtYktXeFBOdQ0KLUVPYmtLdmJkbWJLWFlQT1YNCi1Eb0NrS3ZiZEtDakNwakRZDQotRVBDa0t2YmRJakVBSm9nRQ0KLURvQ2tLdmJka0hnTGZHT0wNCi1Eb0NrS3ZiZEpjSmJxS0N4DQotRVBDa0t2YmRWVU10R01XSw0KLURvREtqdmJkTnhPdXpjbXQNCi1FUERMS3ZiZE5RWVJWbkdzDQotRG5ia0t2YmR6alVvb2NydA0KLURvREtqdmJkRG5iamp2Y0UNCi1Eb0NrS3ZiZEdCUFJaSnptDQotRG9Damp2YmR0dk53alJUQQ0KLUVQRExLdmJkWlFsZGhsZVINCi1Eb0RMS3ZiZFV0TXNmTVdLDQotRG5ia0t2YmREeFlMdFRzbA0KLURvQ2pqdmJkbWJKd1lQT1YNCi1Eb0NqanZiZGFOTENUVk1nDQotRG9Damp2YmRXWEl3dkVGSA0KLURvREtqdmJkZFp4b3hZcGINCi1EbmNMS3ZiZGlqR0hpbVhyDQotRVBES2p2YmRaUW1FaU1kcQ0KLURuY0tqdmJkVHVsUGlzYVINCi1EbmNMS3ZiZG5HZHhNbkd5DQotRVBDa0t2YmRsWXNTU3lIVQ0KLURvREtqdmJkS1JaZVBGbWUNCi1Eb0NrS3ZiZFpSTkZKTkVxDQotRG5jTEt2YmRrTWJNWmVHbw0KLURvQ2tLdmJkQmlMQmtJZWoNCi1FT2JqanZiZFdYSXd2RUZIDQotRU9jTEt2YmRHR0pxbkpUcQ0KLURvRExLdmJkUldtY2JsSUQNCi1FT2JqanZiZHhVbGVReGxPDQotRG5ia0t2YmRSRURCUHBkUw0KLURuYmpqdmJkaWlmSGpNd3INCi1FT2JqanZiZFpMcWN0T01ODQotRVBDamp2YmRtUnh0eXJjaQ0KLURvRExLdmJkRHhYbFR0VU0NCi1Eb0RLanZiZHhybWlOU0JnDQotRG9ES2p2YmRUcHBudHRoTg0KLUVPYmpqdmJkblV0eWtLUmYNCi1Eb0NrS3ZiZFJOWUJ4bXR6DQotRU9jTEt2YmRRWW1BSFRTSw0KLUVQQ2pqdmJkWnRJaHhjc08NCi1Eb0NqanZiZGJzQ2pzZEphDQotRVBES2p2YmRzWmtvcmFJTw0KLURvREtqdmJkRUpoSnZZS0ENCi1FT2NMS3ZiZEpTeGFUTXdsDQotRG9ETEt2YmRBTkh4cnZ6WQ0KLUVPYmtLdmJkY1RES3REaWENCi1FUERLanZiZHJXb2xESlpSDQotRG9ES2p2YmRzUVZuaWNWZg0KLUVQQ2pqdmJkWVNsQWxzb1kNCi1FUENrS3ZiZEpZVUJoTVJRDQotRG5jTEt2YmR0bFh3QlVCWA0KLUVPYmpqdmJkVnJPWUJlTUQNCi1FUENqanZiZGNKTkprR1d4DQotRG5jTEt2YmRqS0dIak5Ycg0KLURuY0tqdmJkUk13YXlPVXoNCi1FT2JqanZiZHpkek96ZHlwDQotRG5iamp2YmROSENvbHBWTA0KLURvRExLdmJkTmRkVGhpTEUNCi1FUERLanZiZEZqZHNDZ21WDQotRG5iamp2YmRUSlpqUkFCTQ0KLURuY0tqdmJkT1RUdWdGVlENCi1EbmNMS3ZiZFZZZ3N6TFBPDQotRG5jS2p2YmRFQVJobHpXdw0KLUVQRExLdmJkVUd6bWt2dkYNCi1Eb0RMS3ZiZG1SeVZac0VKDQotRU9iamp2YmRwdFVIUnFqdA0KLUVPY0tqdmJkSnB6Rk9lbWUNCi1EbmJrS3ZiZE1nRFBtUHRrDQotRU9jS2p2YmRoelVmTVJOZg0KLURvRExLdmJkcHlQSGdRZFkNCi1Eb0NqanZiZFpqU2hRSENHDQotRU9jS2p2YmRPVFR2R2VWUQ0KLUVQQ2pqdmJkUmFjZGtpWkwNCi1EbmJqanZiZHppdG9vZFRVDQotRU9jS2p2YmR4eElqQ1B5aw0KLUVPYmpqdmJkdW5zenFMUFUNCi1FT2JqanZiZHdqd0RnenpHDQotRG5ia0t2YmRVeUh0WmtPbg0KLURuYmpqdmJkcXZwTUNoeVINCi1EbmJqanZiZG1JY3RSVXJCDQotRU9ia0t2YmROSENwTXBVaw0KLURvREtqdmJkZUZQU0NYQ2oNCi1FT2NLanZiZHR2T1hqUlRBDQotRG5jTEt2YmRaR3ZkQVBTaQ0KLURvQ2pqdmJkUWNiYVBwY3INCi1Eb0RMS3ZiZFZVTXNlbFZqDQotRG5iamp2YmRWZ3hXWGdZeg0KLURvRExLdmJkakFRSEJRSEsNCi1FT2NLanZiZHh4SktDUHlrDQotRG5ia0t2YmRRZERBcFFjcg0KLURuYmpqdmJkcXJVam1qYU4NCi1FT2NLanZiZEp6b2ZZRUFODQotRG9ETEt2YmRKdlZHRUZISg0KLUVPYmtLdmJkSmNKYnBqRFkNCi1FUERMS3ZiZGhhbmJkd1JSDQotRU9ia0t2YmRpWnRmTHFPRw0KLURvQ2pqdmJkZU9kc0xUc3INCi1Eb0NqanZiZFNMWkZ1R2pzDQotRG9Damp2YmRxVHNmclJqdA0KLUVPYmpqdmJkQUNxeEtaaHANCi1FUENqanZiZHhaaEZleEVyDQotRVBES2p2YmRpQm9DZVhSUg0KLURvREtqdmJkcUZjZHRWYUkNCi1EbmJrS3ZiZGtDbExRZ1ZIDQotRG5ia0t2YmRaUW1FaGxkcQ0KLURuYmpqdmJkUVltQUdycWoNCi1EbmJqanZiZGlMZGROdURaDQotRG9ETEt2YmRzUVdPakRXRw0KLUVQREtqdmJkVnFuWGFlTGMNCi1EbmJqanZiZHdOV0FORUZODQotRVBDa0t2YmRzQmZOTUhLeQ0KLUVPY0xLdmJkS1F6Rk9mT0YNCi1Eb0RLanZiZEhFTFZpYkpqDQotRVBES2p2YmRjSW1Ka0Z3WQ0KLURuY0tqdmJkSXd0QmdrcVENCi1FT2JrS3ZiZEFOSHlTdnl4DQotRG9ETEt2YmRweG5oR3FFWQ0KLUVQQ2pqdmJkcmFmTk1IS3kNCi1Eb0RMS3ZiZFNRVGZpZWN3DQotRG5ia0t2YmRpTUVkT1VjWg0KLUVPYmpqdmJkUW1ZQ1luVXoNCi1FUERMS3ZiZFdJWVdYZnh6DQotRVBDamp2YmROZUVUaGlMRQ0KLUVPYmpqdmJkSERrV0phaWoNCi1EbmNLanZiZE1nRFFOUHVMDQotRG5jS2p2YmRLV1VlZEZHaQ0KLUVQRExLdmJkSllVQ0lNUlENCi1FT2NMS3ZiZFJhY2RraHlMDQotRVBDa0t2YmRTQmRFa2h5TA0KLUVQQ2tLdmJkTVJ3TXpVcHoNCi1FUERMS3ZiZGt4cnFzWWZ0DQotRU9ia0t2YmRSa1lldGdMVA0KLUVQQ2tLdmJkTnJzdkhGVlENCi1Eb0NqanZiZHFpQUtGTk9lDQotRG9ES2p2YmRkd3lzdFJleg0KLUVPY0tqdmJkcnlsUVRCSG4NCi1FUERLanZiZERqSGpXWGpBDQotRU9iamp2YmRDSWtDTEpHSw0KLURuYmpqdmJkcXdQbERKWXENCi1FUENqanZiZG5WVXpMS1JmDQotRU9jTEt2YmRVeGhVWmpubg0KLURuYmpqdmJkUnBVSEplY3cNCi1EbmJqanZiZGpoR2xGZk5rDQotRU9ia0t2YmRKS0VBS1BnRQ0KLURvRExLdmJkSWlkQUtQZ0UNCi1EbmNLanZiZENTYUN0R1hTDQotRG9Damp2YmRJaWRBS1FIRQ0KLURuYmtLdmJkRmpkc0NnbVYNCi1Eb0NrS3ZiZEdLZVRDZ2x1DQotRU9jS2p2YmRFenNwZU1ESg0KLUVPY0xLdmJkcVVUZ1NTS3QNCi1Eb0NrS3ZiZG5CaXZ3bm11DQotRG5jTEt2YmRKY0pjUktDeA0KLUVQQ2pqdmJkVndKWHVjZGcNCi1EbmJqanZiZEtWdUdFRkhKDQotRG5jTEt2YmRuVlV6S2pTRw0KLURvQ2tLdmJkcUdEZVR1YUkNCi1EbmJrS3ZiZExGZklDQlF1DQotRG5ia0t2YmRaalRJUUdiRw0KLURvRExLdmJkZEJybHJBVG0NCi1EbmNLanZiZFlOcUFYdHV0DQotRG5iamp2YmRVUlJPdHVIbQ0KLUVPYmpqdmJkeG1yZ3hTaUQNCi1Eb0NrS3ZiZGpKZkhqTXdyDQotRG5jTEt2YmROd29WemRPVQ0KLUVQRExLdmJkeVROaGxxYkgNCi1FT2JrS3ZiZGlNRWNuVWJ5DQotRG9ES2p2YmRKY0tDcUpieA0KLUVQRExLdmJkTnJ0VmdFdHANCi1EbmNLanZiZGpFa0d0b0FPDQotRG9ES2p2YmROVlNyS21BWA0KLUVPY0xLdmJkeG1zSVlUSWMNCi1FT2JrS3ZiZGNUREt0RGpCDQotRVBETEt2YmR4c09JbHJDSA0KLURuYmtLdmJkYnJianNkS0INCi1Eb0NqanZiZHBmRUV0V0FoDQotRG9Da0t2YmRNb3dxVm1mcw0KLUVQQ2tLdmJkZUFUcU14SmYNCi1FT2JrS3ZiZGpKZWhKbVlTDQotRVBES2p2YmR4bXJoWVNpRA0KLUVPYmpqdmJkamJra1FnVWcNCi1Eb0NqanZiZFlsUmRVTmxODQotRG9ETEt2YmRpSEtEWldKdQ0KLURvREtqdmJkcGVkRXN2QWgNCi1Eb0NrS3ZiZEV1eVBvbUplDQotRVBDa0t2YmRodHllV3JWQw0KLURuY0xLdmJkYkF2RWZRUVgNCi1EbmJqanZiZFRrdlBCV1BKDQotRG5jS2p2YmRZbFJkVU9MbQ0KLURuY0xLdmJkQ0lqYWppR0sNCi1FUERLanZiZFV0TlRmTHVqDQotRG5ia0t2YmRLVnVGZEVnSg0KLURvREtqdmJkZlZ6d29penMNCi1FUENqanZiZHlTbWlNckJnDQotRVBDa0t2YmRycFdQSmNWZg0KLURvREtqdmJkY0ltSmpld1kNCi1Eb0NrS3ZiZGtWdm5FQ1lYDQotRG5jS2p2YmRXUm5ZQ0VrYw0KLURvREtqdmJkQ0lrQmpoZksNCi1FT2JrS3ZiZG1JZFVSVlNCDQotRG9Da0t2YmRUcHBvVXVIbQ0KLUVQRExLdmJkVVFxT3R1SG0NCi1EbmJrS3ZiZGhnS0RZdkp1DQotRG5ia0t2YmRrSGdMZkZtaw0KLUVQRExLdmJkQ0RvYVZqTWYNCi1FUENrS3ZiZGVoS3ZTTnFIDQotRG5jS2p2YmROZUVVSkpMRQ0KLURuY0tqdmJkbGhkVHFWU0INCi1FT2NLanZiZEV1eHBQbUplDQotRG5jTEt2YmRxY2VJcE51YQ0KLURuYmpqdmJkblZWWmpqUmYNCi1EbmJrS3ZiZEtESmNSSmJ4DQotRU9ia0t2YmRuSEV3bG1nWg0KLUVPY0xLdmJkRldaUVFNakYNCi1Eb0RLanZiZEtXVWVkRWdKDQotRG9ETEt2YmRtb3paVmtaQw0KLURvQ2tLdmJkWmR4R3poSkMNCi1FT2JrS3ZiZEdRQVRXZmZaDQotRVBDa0t2YmRKdXVHRGVISg0KLURvQ2tLdmJkaUdpYnh2SnUNCi1EbmJrS3ZiZEJyYURVR1hTDQotRVBETEt2YmRpSEtEWXZLVg0KLURuYmpqdmJkWnhjak9ETVMNCi1EbmJrS3ZiZG5HZHdsbWdaDQotRG9ES2p2YmRreHNScnhnVQ0KLUVPY0tqdmJkcnpNUVRBZ24NCi1EbmNMS3ZiZGpoSExmR09MDQotRG5iamp2YmRRdm5FQ2xJRA0KLURvREtqdmJkcWRFaG9tdkINCi1Eb0RMS3ZiZEdkS3ZLQ0pqDQotRG5iamp2YmRxdnBMYmlZcQ0KLUVPYmpqdmJkc1B2T2pDdWYNCi1Eb0RMS3ZiZFZxblhiRWxEDQotRVBETEt2YmRlRW9SYlhDag0KLURvQ2tLdmJkeVlKS0JveWsNCi1Eb0RMS3ZiZGxoZFVSVXFhDQotRVBETEt2YmRZa3FkVG5NTg0KLURvQ2tLdmJkbkdkd21OZ1oNCi1FT2JrS3ZiZEdHS1NPSXNxDQotRU9iamp2YmRMTEFndkFKeQ0KLURuYmpqdmJkYWpsRm5tY0ENCi1Eb0RMS3ZiZGlpZkhpbVlTDQotRVBDamp2YmRuUHpZdWtZYg0KLUVQRExLdmJkVlloVHlqbm4NCi1FT2NMS3ZiZGZORndITkprDQotRG9Damp2YmRicmJrVGNpYQ0KLURuY0xLdmJkUmtaR1ZITFQNCi1FT2JrS3ZiZFNRVUhLRmRYDQotRU9jS2p2YmRTS3hldUhLcw0KLURuY0tqdmJkRnh1VWFEd2INCi1Eb0NrS3ZiZGFTR0RIdEZrDQotRVBES2p2YmRaeURpbWNMcg0KLUVPYmpqdmJkaUdpYnh2SnUNCi1FUENrS3ZiZER3d2t0VHNsDQotRVBES2p2YmRSYWRFa2laTA0KLUVQREtqdmJkbWdFd2xtZnkNCi1EbmNMS3ZiZGFvZ0hEa3pkDQotRU9jTEt2YmRqdXZtZENYdw0KLUVQREtqdmJkcXdQbENpWXENCi1Eb0RLanZiZExCTEhOQnhSDQotRU9iamp2YmRlRk9yQnZiag0KLUVQREtqdmJkRnlWVkFkWUMNCi1FUERMS3ZiZEtOQUR5Z1VhDQotRG5jS2p2YmRiVkNHeExVSQ0KLURvQ2tLdmJkSlN5QXJtWGwNCi1FT2JrS3ZiZFF2bkRia2djDQotRU9iamp2YmRyRUVpUU9XQg0KLUVPY0tqdmJkWk1TRHRPTG0NCi1Eb0RLanZiZFF2bWNjTGhEDQotRVBDa0t2YmRyek1RVEJIbg0KLUVQREtqdmJkTWdDcE5RVWsNCi1Eb0RLanZiZG1iSndZUE9WDQotRU9jS2p2YmRnR0x5bWdIQQ0KLUVPYmpqdmJkc3Jxc1l6RkQNCi1FUERMS3ZiZHJOWml5TGdpDQotRG5ia0t2YmRpaWVnaW1ZUw0KLURvREtqdmJkcXdRTGNKWXENCi1FT2JrS3ZiZGFOTENTdU5IDQotRVBDa0t2YmRuVXVaa0pxZg0KLUVQQ2pqdmJkU0NFRWtpWkwNCi1EbmNMS3ZiZFZaSHN6S25uDQotRG5iamp2YmRVdE1zZkx1ag0KLURvREtqdmJkeG1yZ3dyaUQNCi1Eb0NrS3ZiZHh4SktCcFprDQotRU9ia0t2YmRaTVJkVU5sTg0KLUVPYmtLdmJkYlBnSERremQNCi1FT2JrS3ZiZHFxdGpuTEFtDQotRVBES2p2YmRVUlJPdVVoTg0KLURvREtqdmJkQ1d6ZEpGUHYNCi1Eb0RMS3ZiZE1TWE15dHB6DQotRG5iamp2YmRxbHlqWk1IaQ0KLURvREtqdmJkYnNETFVEaWENCi1FT2NMS3ZiZHVWblhpcVRBDQotRG9Damp2YmREeFlMc3NzbA0KLURvRExLdmJkeXFQTWlKd0ENCi1FT2JrS3ZiZGVPZHNMVVVTDQotRU9jS2p2YmRFdXlRUU1qRg0KLURvREtqdmJkRXp0UWVNREoNCi1FUENrS3ZiZEdaVlZCRHhDDQotRG5ia0t2YmRuR2R4Tk5nWg0KLURvQ2tLdmJkY0lsakxGdngNCi1Eb0NqanZiZFlxTWRobUVxDQotRVBETEt2YmRnS2Z6YmZBRQ0KLUVQQ2pqdmJkSmNLRFJKY1kNCi1FT2NLanZiZE9GRHRKSkxFDQotRG5jS2p2YmRpTGRjbXVEWg0KLUVPYmtLdmJkcldwTGNKWlINCi1EbmJrS3ZiZFZBYXFUUXJaDQotRG5iamp2YmRGa0ZUQ2hNdQ0KLURuY0tqdmJkYWFXRWVwUVgNCi1FUENrS3ZiZHBlZEVzdkFoDQotRG5jS2p2YmRqQVFHYVBmag0KLURvREtqdmJkYlViSFhrVGgNCi1Eb0RLanZiZFJqeUZ0ZmtUDQotRU9jTEt2YmRPVFR2SEV0cA0KLURvQ2pqdmJkUmtZZlZHanMNCi1EbmNMS3ZiZHpvUVJGQ2t4DQotRG5jS2p2YmRyTXpKeU1IaQ0KLUVPY0tqdmJkVUx2UEJXT2kNCi1FT2NMS3ZiZHpkeW56ZHpRDQotRVBDamp2YmR0dW14SnBzQQ0KLURvRExLdmJkd012QU1jZG0NCi1FT2NMS3ZiZHFjZUlvblZhDQotRU9iamp2YmRPRWRVSWlLZA0KLUVPYmpqdmJkSEVMVmpCaWoNCi1FT2JqanZiZHFjZGlQbXZCDQotRG9Damp2YmRKdlZGZEZHaQ0KLUVQREtqdmJkV1Jtd2FlTGMNCi1FUERLanZiZFp4ZEpuRE1TDQotRG9ES2p2YmRaeGRKbkRNUw0KLUVPYmpqdmJkeFVsZHB4a24NCi1EbmJrS3ZiZFNMWWV0ZmpzDQotRVBETEt2YmRZcU1lSWxkcQ0KLURvQ2pqdmJkck15allsSUoNCi1FT2JrS3ZiZGR4WnRUcWV6DQotRVBDa0t2YmRXU054Q0VsRA0KLURvREtqdmJkV1dpWVZjZGcNCi1Eb0RMS3ZiZHFHRGRzdkFoDQotRU9jTEt2YmRoelZGbFJOZg0KLUVPY0tqdmJkYU5MQ1N1TkgNCi1EbmJrS3ZiZGtIZ01GZk5rDQotRG5ia0t2YmRkZVBSYlhESw0KLURuY0tqdmJkTlZUU0ttQVgNCi1FT2JrS3ZiZGh6VWZMcG1mDQotRU9jS2p2YmRaTVNEdE5rbQ0KLUVQREtqdmJkVHFST3R1SG0NCi1Eb0NrS3ZiZGRkbnFiWENqDQotRG9ES2p2YmRsaUVVUlZTQg0KLURuY0tqdmJkdHZOeEtRc0ENCi1EbmJqanZiZHFjZUpRT1ZhDQotRVBES2p2YmRweU9nZ1FjeA0KLUVPY0tqdmJkdGNEVXZ1b1ANCi1FT2JqanZiZHJXcE1DaHhxDQotRVBES2p2YmRHWXR0YUVZQw0KLUVPYmpqdmJkaWlmSUtOWVMNCi1Eb0NqanZiZFp5RUptY01TDQotRVBETEt2YmRLUXpGT2ZOZQ0KLURvQ2tLdmJkcVlvSUdwZFkNCi1FUERMS3ZiZHh3aGliUHpMDQotRVBES2p2YmRSYWRFbEpZaw0KLURvRExLdmJkdGt3d0F0QXcNCi1FUENqanZiZERqSGpWeEtBDQotRVBES2p2YmRyekxvc0JJTw0KLUVQQ2tLdmJkQmRQYVZpbUcNCi1Eb0NqanZiZHJhZk1rZmp5DQotRVBES2p2YmROR2NQbVFWTA0KLURvRExLdmJkVnZpWVZkRkgNCi1FUENqanZiZGtWd09EYXhYDQotRG5jS2p2YmRrTWJNWmVHbw0KLUVPY0xLdmJkZmtHemJmQUUNCi1EbmJrS3ZiZHB5T2hIUWRZDQotRG9ES2p2YmRRZENhUHFFUw0KLUVPYmpqdmJkRUtIaXV4S0ENCi1EbmJqanZiZHB4bmhHcGN4DQotRG5ia0t2YmRreHNTU3hnVQ0KLURuYmpqdmJkVVJRbnVVZ20NCi1Eb0RMS3ZiZFR1a3BKdEJSDQotRVBDa0t2YmRxQWlGQVdnZA0KLURuYmpqdmJkZ0dMeW1mZ0ENCi1FT2NMS3ZiZHlZSWliUVprDQotRG9ETEt2YmRXSHhWeEd4eg0KLUVQRExLdmJkRnlWVkFkWGINCi1EbmJrS3ZiZHJSdUtuS2FODQotRG9ETEt2YmRUcHFPdHRnbQ0KLUVQREtqdmJkTGhiTHFZQVMNCi1Eb0NqanZiZEhFTFZqQ0tLDQotRG5jTEt2YmRmU0JXemxEUA0KLURvQ2tLdmJkUkRjQlBwZFMNCi1Eb0RMS3ZiZHNRV1BKY1ZmDQotRVBDa0t2YmR5U21pTXJDSA0KLUVQQ2tLdmJkYlViSFhqdEkNCi1Eb0RMS3ZiZFV0TXNmTHVqDQotRVBDamp2YmRFdlpRUG1LRg0KLUVPYmpqdmJkZGVPcWJYREsNCi1FUERLanZiZGtDbEtxR3RnDQotRG5jS2p2YmRxaUFKZG1QRg0KLUVPY0xLdmJkbHJaVXlyY2kNCi1FT2NLanZiZGJCVmVGcFB3DQotRU9jTEt2YmRVTHZQQldPaQ0KLUVQQ2tLdmJkY0pNakxGd1kNCi1EbmJqanZiZFp0SWh4Y3NPDQotRVBETEt2YmRTUHRISmZEdw0KLUVPYmtLdmJkYU5MQnNVbGcNCi1Eb0RMS3ZiZHF2cExjSXhxDQotRG9Da0t2YmRweG9JSFFjeA0KLUVQQ2tLdmJkbFpUUnNaR3QNCi1Eb0NqanZiZGVyQld6a2NQDQotRVBETEt2YmRadEpJeGRTbg0KLUVPY0xLdmJkbW95eVdLeGINCi1Eb0RMS3ZiZHVhRHhyb0VoDQotRVBETEt2YmRkb0Vya1R0Uw0KLURuY0tqdmJkblB6WXZLeGINCi1FT2JqanZiZHNabFBzQWhPDQotRVBETEt2YmRqSmZIak14Uw0KLUVPY0xLdmJkYnNETFVEaWENCi1EbmNMS3ZiZE11VFNMTkFYDQotRVBETEt2YmRlbUdXZm1LTA0KLUVPYmtLdmJkS2VmSGJCUXUNCi1FT2NMS3ZiZHVWblhqUlRBDQotRG5iamp2YmRHWlZVYUVZQw0KLUVPY0tqdmJka05DTVplR28NCi1FUENrS3ZiZEdLZVNiZ21WDQotRG9ES2p2YmRxclZMTmphTg0KLURuYmpqdmJkRUFTSWx6V3cNCi1EbmJqanZiZGVPZHJrVVVTDQotRG5jS2p2YmREaklKdlhqQQ0KLURvQ2pqdmJkcUdFRlVXQWgNCi1FUENqanZiZFFjYmFRUkVTDQotRG5ia0t2YmRodHlkd1NVYg0KLURvQ2tLdmJkTXVUUmptQVgNCi1EbmJqanZiZEp1dGZFRWZpDQotRVBDamp2YmR6R3hsQU1lWA0KLURuY0xLdmJkSUhHeXlZWUgNCi1Eb0RMS3ZiZHhVbUVxWkxuDQotRG5ia0t2YmROSENwTW90aw0KLURuYmpqdmJkRnlWVkFjd2INCi1FUENqanZiZFNoekpxQUJNDQotRG5iamp2YmRjeXhveFpSQw0KLUVQQ2pqdmJkcXF1S25MQk4NCi1EbmNMS3ZiZGNJbGlrRndZDQotRG9Da0t2YmRlT2VTa1Rzcg0KLUVPY0xLdmJkWXBsZGhsZHENCi1FUERMS3ZiZFFZbUFHc1JqDQotRG9Da0t2YmR6R3lNQU1lWA0KLUVQQ2tLdmJkcXJWS25MQk4NCi1FT2JrS3ZiZHhVbGRweGxPDQotRVBDamp2YmRmSUt1cW5SSA0KLUVQREtqdmJkRldZcFFNakYNCi1FUERMS3ZiZE9GRVVKSktkDQotRU9jTEt2YmRIRUt2S0Jpag0KLURvREtqdmJkamNNTFJIVWcNCi1FUENrS3ZiZFdYSXd1ZEVnDQotRG5jTEt2YmRnUGF6dmN3aA0KLURuYmpqdmJkblZVeWtKckcNCi1FUENqanZiZHh4SkpiUHlrDQotRG5jTEt2YmRqSmVoS014Uw0KLURuY0tqdmJkRXpzcGRrYmkNCi1FUERLanZiZHJwVm5qRFdHDQotRG5iamp2YmRWck9ZQ0ZMYw0KLURvRExLdmJkTWZicE1vdGsNCi1EbmNLanZiZGJobGpMR1d4DQotRG5jS2p2YmR4cm1obHJCZw0KLUVPY0tqdmJkYktsR1BPREENCi1Eb0RLanZiZEp2VWZFRkhKDQotRVBDa0t2YmR5U25JbHFhZw0KLUVQREtqdmJkVkFiUXJwcXkNCi1EbmJqanZiZHJ5a29zQWhPDQotRG5ia0t2YmRLZkZoQ0JRdQ0KLURuYmpqdmJkRVh3a3RUc2wNCi1Eb0RLanZiZERvRExMWENkDQotRU9ia0t2YmR2d01BdkF2Vg0KLUVPYmtLdmJkWHNMYU5VT3gNCi1EbmJrS3ZiZFJEY0JRUkVTDQotRU9jTEt2YmRaaXNJUGdDRw0KLURvREtqdmJkcGZFRXRXQkkNCi1Eb0RLanZiZGZvYXp3RHdoDQotRVBDa0t2YmRGcEFTdmZmWg0KLUVPYmpqdmJkUlduRGJsSGMNCi1Eb0NrS3ZiZE54T3V6ZE9VDQotRG5jTEt2YmRZbFNEdE9MbQ0KLUVQQ2pqdmJkamJranFIVkgNCi1FUENrS3ZiZHJNekp4a2dpDQotRVBES2p2YmRDSWtCamhmSw0KLUVQQ2tLdmJkVXNsc2VrdksNCi1FT2NLanZiZEZlalJuSlVSDQotRVBETEt2YmROSENvbG90aw0KLUVQQ2pqdmJkVXhndFpqbm4NCi1Eb0RLanZiZEVPY0xMWENkDQotRVBDa0t2YmRrSGZsR0ZuTA0KLUVQQ2pqdmJkd3lnZkZ4RXINCi1EbmNLanZiZGVPZHJqdFRyDQotRG9ETEt2YmRxVHRIUnFqdA0KLUVQRExLdmJkUXdOZENrZ2MNCi1FUENrS3ZiZGh6VkdMcG5HDQotRG9ES2p2YmR4d2lLQ1B6TA0KLUVQQ2tLdmJkWmlyaFFHYkcNCi1Eb0NqanZiZHFyVWtPS2FODQotRG9ETEt2YmRsclpVeXNFSg0KLURvQ2pqdmJkcUZkRlVXQWgNCi1EbmJqanZiZHlZSktDUHpMDQotRG5jS2p2YmR4VWxkcHlNTw0KLUVQQ2pqdmJkdkFjeVRPZUkNCi1FT2JqanZiZExGZWdhYVJWDQotRG5jS2p2YmRlbUZ2Z05LTA0KLUVPY0xLdmJkamNManFIVkgNCi1Eb0RLanZiZFJNeENZblV6DQotRVBETEt2YmRSanhmVWZrVA0KLURvRExLdmJkaU1FZE51RFoNCi1Eb0RMS3ZiZFpSTWRobUVxDQotRG9ETEt2YmRxbHlpeUxnaQ0KLUVPYmpqdmJkaWllaEptWVMNCi1Eb0NqanZiZHd1TWVSWWxPDQotRVBES2p2YmRxcXVLbWtBbQ0KLUVPY0tqdmJkbHJZdHlzRGkNCi1FUERMS3ZiZGxpRVRxVXJCDQotRU9iamp2YmRlUEVya1Rzcg0KLURvRExLdmJkZkhqdlJuUWcNCi1FT2JqanZiZFJYT0VDa2djDQotRU9ia0t2YmRNcFhxV09Hcw0KLURuY0tqdmJkRUpoSnZZS0ENCi1Eb0NrS3ZiZFZyT1lCZU1EDQotRVBES2p2YmRUa3ZQQldPaQ0KLUVPY0xLdmJkanV2bWNiWVgNCi1EbmNLanZiZE1mY1FNb3VMDQotRU9jTEt2YmRNcFhwdk9IVA0KLURvQ2pqdmJkaUxkY210Y1oNCi1EbmJrS3ZiZGlISmNaV0p1DQotRVBETEt2YmRUcVFudVVnbQ0KLURuY0tqdmJkTEdGZ2JCUXUNCi1FUERLanZiZE5kY3RJaUxFDQotRVBES2p2YmRaeGRLT0RMcg0KLURvREtqdmJkU1pqSVRDdkENCi1FUENqanZiZER3eE1VVHNsDQotRVBDa0t2YmR5U21obVJhZw0KLUVPY0xLdmJkU1B0SEtHRHcNCi1Eb0RLanZiZG1JY3RSVXFhDQotRG9ES2p2YmRhUmZDaFRlaw0KLURuY0xLdmJkeU5yaFhzSWMNCi1EbmNMS3ZiZEpUWkJTbHhNDQotRG9ES2p2YmRGZWlyT0lzcQ0KLURuYmpqdmJkSnV0ZWRGSEoNCi1EbmJrS3ZiZFVzbHRHTVdLDQotRG5ia0t2YmRiaGxqTEdXeA0KLUVQQ2pqdmJkaXJ6aVRMSnoNCi1FT2NLanZiZG5Qell2S3lDDQotRG9ES2p2YmRrRE1MUkd0Zw0KLURuY0xLdmJkeXplTnFoSWgNCi1FUENqanZiZFlUTUFtVVBZDQotRG9Da0t2YmRnR01abkhIQQ0KLURuY0xLdmJkbFpTcXNZZnQNCi1FT2NMS3ZiZFpqU2hRSENHDQotRG5iamp2YmRqaEdsR0dOaw0KLURvRExLdmJka3hzUnJ5R3QNCi1Eb0NqanZiZFp5RGpOYmtyDQotRG5ia0t2YmROZUVVSklqZA0KLUVPY0tqdmJkeHhKSmJQeWsNCi1Eb0RMS3ZiZFJiRGVNSXhrDQotRU9iamp2YmRyRGVKUG5XQg0KLUVQQ2tLdmJkclhQa2JpWXENCi1FUENqanZiZGVGUFJiV2JqDQotRG5jTEt2YmRIZmZ5eHhZSA0KLUVQREtqdmJkY3l5UVlaUWINCi1Eb0NrS3ZiZE5zVHZHZVVwDQotRVBDa0t2YmRmcEJ6d0R4SQ0KLUVQQ2pqdmJkcVR0SFJyTFUNCi1FUENrS3ZiZGhnSmJ4dkp1DQotRU9jS2p2YmRreHNScnlHdA0KLUVQQ2tLdmJkWnNoaHlFVE8NCi1EbmJrS3ZiZHJXcExiaVpSDQotRU9ia0t2YmRuSEV4TW1meQ0KLURuYmtLdmJkYlViR3drVGgNCi1EbmJrS3ZiZG5IRXhNbkhaDQotRU9iamp2YmRabm1pRkV5ag0KLUVPYmtLdmJkU1FVR2pHRHcNCi1FUENrS3ZiZHFUdEdyUmtVDQotRU9iamp2YmRjSW1LTEdYWQ0KLUVPYmtLdmJkU2h6SnFBQWwNCi1EbmNMS3ZiZEdHSnFuSXNxDQotRG5ia0t2YmRlaEt1cW1wZw0KLURuY0xLdmJkZGVPckNYREsNCi1FT2NMS3ZiZFJNd2JZbXR6DQotRG5iamp2YmRnRmxabWdIQQ0KLURuYmtLdmJkeU9TZ3hUSkQNCi1FT2NMS3ZiZFFaTkFHc1NLDQotRG9Da0t2YmRSTXdheU50eg0KLURuY0xLdmJkZXp2WWVJdFgNCi1FT2NMS3ZiZFZBYXBzUXJaDQotRG9Damp2YmRjSW1LTEZ3WQ0KLURvREtqdmJkVHFRbnR0Z20NCi1EbmJqanZiZE9FZFVKSWtFDQotRG9ES2p2YmRlWVpzc3Fleg0KLURuYmpqdmJkWmpTZ3BIQ0cNCi1Eb0NrS3ZiZFR2TVBpc2FSDQotRU9jS2p2YmRaalNnb2ZhZg0KLUVQRExLdmJkZlZ6d29penMNCi1EbmJqanZiZENTYUNzZXdTDQotRVBETEt2YmRGVnlQcE1qRg0KLUVPYmtLdmJkZGpKclZ0em4NCi1EbmJqanZiZHlPU2d4VEljDQotRU9jTEt2YmRyb3ZQS0RWZg0KLURuYmpqdmJkeFpoR0dYZVMNCi1EbmNMS3ZiZGJMTGVvTmNBDQotRU9jS2p2YmRNZmJvbVFVaw0KLUVQRExLdmJkYVJlYmhUZkwNCi1Eb0RMS3ZiZG9BS3p0SGNuDQotRU9jTEt2YmRHY2tXSmJKag0KLURuY0xLdmJkcW1aallsSGkNCi1EbmNLanZiZFp5RGluRExyDQotRG9Da0t2YmR4d2hpYlB6TA0KLURuYmtLdmJkWm9PSkZGWmoNCi1FUERMS3ZiZFlwbUVpTWRxDQotRG9Da0t2YmRpVXpGV3F1Qw0KLURuYmpqdmJkc1B2UEpjVmYNCi1EbmNLanZiZER3eE1Uc3NsDQotRU9ia0t2YmRaUWxlSk5FcQ0KLURvRExLdmJkV1NOeEJka2MNCi1Eb0NqanZiZGNTYmtUY2lhDQotRU9jS2p2YmRxdm9sQ2h5Ug0KLURuYmpqdmJkcWx6SnhsSGkNCi1Eb0NqanZiZGxyWlV6VEVKDQotRVBDa0t2YmRHZExXSmJKag0KLUVPYmtLdmJkem9QcUZETHgNCi1EbmNMS3ZiZEFOSVlyd1p4DQotRU9iamp2YmRTUHNnSmZFWA0KLURvQ2pqdmJkYmlOSmpmV3gNCi1EbmJrS3ZiZE1mYnBOUVZMDQotRU9ia0t2YmRkZVBSYlhDag0KLUVQREtqdmJkU2h6S1JBQWwNCi1Eb0RLanZiZG5QeXh1a1liDQotRU9iamp2YmRWWklUektvTw0KLUVQRExLdmJkWnlEaW5ETVMNCi1FUENqanZiZFlwbGRobUZSDQotRG9Da0t2YmRaalRJUGZhZg0KLUVPYmpqdmJkcWRFaVBtdWENCi1EbmJrS3ZiZFJhZEVraHhrDQotRVBETEt2YmR6alZQcERydA0KLURuYmtLdmJkYU1rQnNVbGcNCi1EbmNMS3ZiZE1wWHB1bkdzDQotRG9ES2p2YmRVeGdzekxQTw0KLUVQQ2tLdmJkaWllZ2lseFMNCi1Eb0NqanZiZEVPY0trV2JkDQotRU9jTEt2YmRjVERMVUVKYQ0KLUVQRExLdmJkWnRJaVljcm4NCi1Eb0RMS3ZiZG10dHlqaXJHDQotRVBETEt2YmRHZExWakJqSw0KLURuY0xLdmJkRGlnalZ4S0ENCi1FUENrS3ZiZGVsZldmbGlrDQotRG9ES2p2YmRPVFVWZmR0cA0KLURuY0tqdmJkVGxXT2FWbmkNCi1FUERLanZiZHJwV09pYnZHDQotRVBES2p2YmRmUmFXemxDbw0KLURuY0tqdmJkbHJZdVpyZEoNCi1Eb0RLanZiZElzWkJTbHdsDQotRVBETEt2YmRxcXVMT0thTg0KLURuYmpqdmJkSm1BRVpnVWENCi1FUENrS3ZiZGNJbUprRnZ4DQotRG5jTEt2YmRreHJxc1lmdA0KLUVQQ2tLdmJkVVdMb2pUYVINCi1Eb0RLanZiZG5HZVhsbWZ5DQotRG9Da0t2YmRpTUZEbXVDeQ0KLUVQREtqdmJkYXVDSFhqdEkNCi1Eb0NqanZiZEJzQWNVR1hTDQotRG9ES2p2YmRBQ3JZSnlocA0KLURvREtqdmJkc1psUHNCSG4NCi1Eb0RMS3ZiZGpKZWdpbVhyDQotRG9ES2p2YmRXWEl3dkRkZw0KLURuY0tqdmJkZWxld0hOSmsNCi1FT2JrS3ZiZHlUT0pNckNIDQotRG9Da0t2YmROZGRVSWlLZA0KLURvQ2tLdmJkUnlqSHJidkENCi1Eb0NqanZiZGlHakN5V0tWDQotRG9ETEt2YmRobEZFT1ZEWg0KLUVQQ2tLdmJkUWREQW9xRHINCi1Eb0RLanZiZEJpTEJqaGVqDQotRU9jS2p2YmRxbHlqWkxnaQ0KLURuY0xLdmJkdFNyVFl6RkQNCi1Eb0NrS3ZiZHJNeWpZbEhpDQotRU9iamp2YmRoZmljWXVpdQ0KLURvREtqdmJkZmVreW1nSEENCi1FT2NMS3ZiZGlpZkhqTlhyDQotRU9iamp2YmRJd3NhZ2xRcA0KLURvQ2pqdmJkQ0lrQmtJZksNCi1FUERLanZiZGFTRmNIc2ZMDQotRG9ETEt2YmRNZ0RQbHBVaw0KLUVQREtqdmJkcVluZ2dRZFkNCi1Eb0RLanZiZGFTRmJnc2VrDQotRG9Damp2YmRpWnRla3FOZg0KLUVQRExLdmJka0NsS3BmdGcNCi1Eb0NrS3ZiZHVNWVdhVUF3DQotRU9ia0t2YmR0VFNUWXlkYw0KLURuYmpqdmJkcHRVR3FyS3QNCi1FT2JqanZiZFlsUmN0TmxODQotRG5jS2p2YmRNZ0RRTlB0aw0KLURuY0xLdmJkSUxhem5YUWsNCi1Eb0RMS3ZiZGlDUERGV3BxDQotRG9Da0t2YmRpR2ljWldLVg0KLURuY0tqdmJkRmpkcmJnbHUNCi1EbmNMS3ZiZEtXVWZEZUdpDQotRG9Damp2YmRWaFh1d2dZeg0KLURvREtqdmJkaHR6RldxdUMNCi1FUENqanZiZFJwVGZpZWRYDQotRG9Da0t2YmRLVnVGZEVmaQ0KLURvRExLdmJkYkJXRWZQb3cNCi1Eb0NrS3ZiZFp5RGpPRExyDQotRG5jTEt2YmRlQVVRbVhpZg0KLURvQ2tLdmJkSWlkQUtRSEUNCi1FUENrS3ZiZFRxUk91VklODQotRG5jS2p2YmRSWE9EY01JRA0KLURvREtqdmJka3lUUnNaSFUNCi1FUENqanZiZHhuVElYcmhjDQotRU9iamp2YmRKem9mWGRBTg0KLUVPY0tqdmJkaUJuY0ZXcHENCi1FT2JrS3ZiZFlPUkFYdVZ0DQotRG5iamp2YmRpTUVkTnRieQ0KLUVQREtqdmJkVnJPWGJGTUQNCi1FUENrS3ZiZEFNZ3hyd1p4DQotRG9Da0t2YmR0YmJ1WFZvUA0KLUVQQ2pqdmJkRG9Da0t3Q2QNCi1EbmNMS3ZiZFZCQnBzUlJ5DQotRG9ES2p2YmRlbUdXZ01paw0KLUVPYmtLdmJkZUVucWJYREsNCi1FUENqanZiZGhhbmJkdnFSDQotRG5ia0t2YmRtYWl3WU9uVg0KLURvQ2pqdmJkY0pNakxHWFkNCi1EbmJrS3ZiZElyeUFybHhNDQotRVBDamp2YmR0a3d2YVVBdw0KLURuYmtLdmJkeFpnZWZZRlMNCi1FUENrS3ZiZGVyQld6bERQDQotRVBDamp2YmROeFBWemRPVQ0KLUVQREtqdmJkYVNHREhzZWsNCi1FT2NLanZiZHFjZGhwT1ZhDQotRVBDa0t2YmR4bXNIeFNoYw0KLURvREtqdmJkRG5jS2p3REUNCi1Eb0NqanZiZFlwbUVobUZSDQotRG5jS2p2YmRhUmZDZ3NmTA0KLUVPYmpqdmJkZWdqdXJOcGcNCi1EbmJrS3ZiZGpoSE1GZW5MDQotRVBDamp2YmRNZmNQbVFVaw0KLUVPY0xLdmJkQUNyWUtaaHANCi1Eb0RLanZiZGZmTVptZ0hBDQotRG9Damp2YmRhYVZlR1FRWA0KLUVPY0tqdmJkU0NEZGtpWkwNCi1FT2NLanZiZHF3UGxDaVlxDQotRG9ES2p2YmRhamxHUE9EQQ0KLURuY0xLdmJkSllUYkhrcHANCi1EbmNMS3ZiZHRjRFZYV09vDQotRVBDamp2YmRFWHhMdFRzbA0KLUVQQ2pqdmJkSnV0ZWNlR2kNCi1EbmJqanZiZERvQ2tMV2JkDQotRG9Da0t2YmR1Q2J0d1dPbw0KLUVQRExLdmJkYXVCZ1lMVGgNCi1FUENqanZiZE9Yb1Z6Y210DQotRG9Da0t2YmRSTXhCeU9Veg0KLURvQ2pqdmJkcVlvSUdxRHgNCi1FUENqanZiZE5HYnBNcFZMDQotRG9Damp2YmRKcHpGT2ZOZQ0KLUVPY0tqdmJkVkFhcHNRcloNCi1EbmNLanZiZHB4b0lIUWN4DQotRU9jS2p2YmRSYWNlTGlaTA0KLURuY0xLdmJkdGNDdVd2T28NCi1FT2JqanZiZGJCVmVHUG93DQotRG5iamp2YmRLeVJLU3p1Rw0KLUVPY0xLdmJkRnlWVWFFWUMNCi1FUERLanZiZGtDa2tSSFVnDQotRU9ia0t2YmRLYUtmbUJ4Ug0KLURvRExLdmJkYlViR3dqc2gNCi1EbmJqanZiZHJvdk9qRFZmDQotRVBDamp2YmRac2lJeURzTw0KLUVPYmpqdmJkUkRiYVBxRHINCi1FT2NLanZiZG5CaXZ3bm11DQotRVBDamp2YmRZVE1CTXNvWQ0KLURvRExLdmJkeEt3RUh6ekcNCi1FUENrS3ZiZHFUc2dScWtVDQotRVBES2p2YmRmTWZXZ05LTA0KLURuYmtLdmJkem5wUkVia3gNCi1EbmNLanZiZEpYdENIbFJRDQotRVBETEt2YmRHWXVWQkVYYg0KLUVQREtqdmJkWkxyRVVPTU4NCi1FUERLanZiZHRjQ3R2dW9QDQotRU9iamp2YmRYc0xhTlVQWQ0KLUVQRExLdmJkeU9USVlTaUQNCi1FT2JqanZiZHNyclRZeWVEDQotRU9iamp2YmRaaXNIcEdhZg0KLURvRExLdmJkdk9zenFMT3QNCi1EbmNMS3ZiZGFNamJTdU5IDQotRG5jTEt2YmRZVE1CTXNvWQ0KLUVQREtqdmJkd3pJR0Z4RlMNCi1FUERMS3ZiZG1SeVV5cmNpDQotRG5jTEt2YmRUa3ZQQldPaQ0KLUVQQ2pqdmJkTmRjc2lJamQNCi1FUENrS3ZiZEV6c3Bka2JpDQotRU9ia0t2YmRyb3ZPaWNWZg0KLURvREtqdmJkaGJPYmVYUXENCi1EbmNLanZiZFpubkllRlpqDQotRU9ia0t2YmRSRUNhUHBkUw0KLUVPY0tqdmJkbkdlWGxuSFoNCi1FUENqanZiZGF1Q0d3anNoDQotRVBDamp2YmRjellwWHlSQw0KLUVPY0xLdmJkRGloSnV4S0ENCi1FT2NLanZiZGtWd05jYlh3DQotRU9iamp2YmRic0NrVGNpYQ0KLURvQ2tLdmJkZk1ld0hOS0wNCi1Eb0NqanZiZHhaZ2VleEVyDQotRU9jTEt2YmRpQm9ERXdRcQ0KLURuYmtLdmJkcHN0SFNTS3QNCi1FT2NLanZiZFF2bWRDbEhjDQotRVBES2p2YmRJeFVCaExxUQ0KLUVPYmtLdmJkWnRKSXlFU24NCi1FUENqanZiZHR1bXdqUXNBDQotRG9Damp2YmROUHhRdW5IVA0KLUVPY0xLdmJkZG5kcmtVVHINCi1FT2JqanZiZENUQkNzZXZyDQotRU9jS2p2YmRpVXpFd1J1Qw0KLUVQREtqdmJkUnlpZ3JidkENCi1Eb0NqanZiZGV6dlllSlR3DQotRU9jTEt2YmRWZ3hWeEd4eg0KLURuYmpqdmJkWmVYZnpoSWINCi1EbmNLanZiZHhaZ2ZGd2VTDQotRG9Da0t2YmRLeHFLU3p0Zg0KLURuY0xLdmJkcHlPZ2dSRVkNCi1FUERMS3ZiZFhybEJOVU94DQotRVBDa0t2YmRxd1BrYmlaUg0KLUVQRExLdmJkYnNDanNjaWENCi1Eb0RLanZiZG5HZVlNbWdaDQotRU9jTEt2YmRVc21UZkx2Sw0KLURuYmtLdmJkanV3T0VCeFgNCi1EbmJqanZiZFRBRkpJQ1BFDQotRG5jS2p2YmRFdXhvb21LRg0KLUVQREtqdmJkZU9kc0xUc3INCi1FT2JrS3ZiZFpzaGlZZFNuDQotRG5jS2p2YmRjVERLc2NqQg0KLURuY0xLdmJkdndNQldBdlYNCi1FT2NLanZiZFZ3SXd1ZEZIDQotRVBETEt2YmRsWlRTU3hnVQ0KLUVPY0tqdmJkTWdDb2xvdGsNCi1FT2NMS3ZiZFpkeEd6Z2lDDQotRG5iamp2YmRVTHVvQldPaQ0KLUVPYmpqdmJkaUNPYmVYUXENCi1FUERLanZiZE5Vc1JrTkFYDQotRG9Damp2YmRaeGNqT0NsUw0KLURuY0xLdmJkaVV6RXdTVkMNCi1Eb0RMS3ZiZHZsdkFNY2VODQotRG9ETEt2YmRxY2RocE9XQg0KLUVPYmtLdmJkQ1NhRFVHV3INCi1Eb0NrS3ZiZHNzU1RZeWRjDQotRG9Da0t2YmRuR2R4TW1nWg0KLURvQ2tLdmJkSEVMV0piS0sNCi1Eb0RLanZiZEtlZkhiQXB1DQotRU9ia0t2YmRWcW13YkZMYw0KLURvQ2tLdmJkVXROVGVrdWoNCi1FUERMS3ZiZFRsV09hVm5pDQotRG9Damp2YmREeFhrc3RVTQ0KLUVQQ2tLdmJkcHhvSGZxRVkNCi1FUERLanZiZG1TWXR6VEVKDQotRG9Damp2YmRkZG5yQ1hESw0KLUVQQ2tLdmJkWmpUSHBHYkcNCi1EbmNMS3ZiZGh6VkdMcU9HDQotRVBDamp2YmRaalNnb2dCZg0KLUVQRExLdmJka0RManFHdUgNCi1EbmNMS3ZiZHhVbUZSWkxuDQotRVBETEt2YmRqaEhNRmZOaw0KLUVQQ2tLdmJkWmpUSHBIQmYNCi1FT2JrS3ZiZGVna1ZxblFnDQotRVBETEt2YmRHWXR0YUVYYg0KLUVPYmpqdmJkWmR3ZnpoSkMNCi1Eb0NrS3ZiZEdRQVN3SEZ5DQotRVBES2p2YmRrVnZuRGJYdw0KLUVPYmtLdmJkSllUYWdrcVENCi1Eb0NqanZiZE1TV2x6VlF6DQotRG9Damp2YmRuR2VZTW1meQ0KLURvRExLdmJkQURSeEtaaVENCi1FT2JrS3ZiZFpMcWRUbWttDQotRVBDa0t2YmRGZWlyT0l0Ug0KLUVQQ2tLdmJkUmp5R1ZHanMNCi1EbmNMS3ZiZGlNRkRuVWNaDQotRU9ia0t2YmRWQWFxU3BxeQ0KLUVQQ2tLdmJkVUx1bmFWbmkNCi1EbmJrS3ZiZGNJbUtLZXZ4DQotRG9Damp2YmR1YUR5VFBGSQ0KLUVQREtqdmJkS1F5ZG9GbkYNCi1FUENqanZiZG96bWNqd29BDQotRG9ETEt2YmRaTHFkVU5sTg0KLURvREtqdmJkSlhzYkhrcHANCi1Eb0NrS3ZiZGVsZlhITkprDQotRU9iamp2YmRlRk9xYXZjSw0KLUVQRExLdmJkcWx5alpNSUoNCi1Eb0NqanZiZFV0TXNla3ZLDQotRG9Da0t2YmRJeFVCaE1RcA0KLUVPY0tqdmJkZW1HV2dNakwNCi1Eb0NrS3ZiZHd1TWVReUxuDQotRG5jS2p2YmRrQ2xLcGdWSA0KLURvREtqdmJkZk5GdmZsaWsNCi1EbmNLanZiZGhrZGNtdUN5DQotRG9ETEt2YmRDSktha0lmSw0KLURuYmtLdmJkU1FUZ0pmRVgNCi1EbmJrS3ZiZGtJR2xHRm1rDQotRG9ES2p2YmR5U21obHFiSA0KLURvQ2pqdmJkR2RMVmliSmoNCi1FUENqanZiZFNMWkdVZmtUDQotRVBETEt2YmRTS3hmVkhLcw0KLURvREtqdmJkR0xGU2JoTXUNCi1Eb0NrS3ZiZHFGY2R0V0FoDQotRU9jTEt2YmRiVkJmeExVSQ0KLURvREtqdmJkY1NjS3NkS0INCi1EbmJrS3ZiZFZ3SllXRUZIDQotRVBDamp2YmRHUUFTd0hGeQ0KLURuYmpqdmJkcVVUZnJSanQNCi1FUERMS3ZiZEVZWU1UdFVNDQotRG9ETEt2YmRmTkZ3SE5LTA0KLUVPYmtLdmJkc1FXUEpidkcNCi1FT2NLanZiZElzWWFTbVlNDQotRVBES2p2YmRCZFFBdWlsZg0KLURuYmtLdmJkcm91bmlidkcNCi1FT2JrS3ZiZGlDUENkdnFSDQotRU9jTEt2YmRCc0Fic2ZYUw0KLURvQ2pqdmJkdUREVld1b1ANCi1FUENrS3ZiZGJzQ2p0RUphDQotRU9jS2p2YmRjVERMVGRLQg0KLURvQ2pqdmJkWEdZeXRBUFQNCi1EbmJqanZiZGVQRlRMVHNyDQotRU9ia0t2YmRkb0VyanNzcg0KLUVQQ2tLdmJkY1RES3NkSmENCi1FUERLanZiZGpnZmxHRm5MDQotRU9iamp2YmRkZU9xYldjSw0KLUVPYmtLdmJkQUNxd2l6SlENCi1FT2JqanZiZEhnR3l5WHhIDQotRG9Damp2YmRxbHpLWk1IaQ0KLURuYmpqdmJkaGZpYnh2SnUNCi1Eb0RLanZiZFNDRUZMaVpMDQotRVBDamp2YmRTQ0VGTGlZaw0KLUVPYmtLdmJkaUxkY211RFoNCi1FT2JrS3ZiZHpHeU1BTWVYDQotRVBES2p2YmRWWWhUektvTw0KLUVQQ2tLdmJkeHJtaU5SYWcNCi1Eb0RMS3ZiZGpLR0hpbHhTDQotRU9jS2p2YmRoV3lBenpBSg0KLUVQRExLdmJkTWZjUU5RVkwNCi1EbmNLanZiZFlrcWRUbWxODQotRG9ETEt2YmRqSmZJSmx3cg0KLUVPY0xLdmJkWmVZR3pnaGINCi1EbmNMS3ZiZEp1dUZjZUdpDQotRVBDa0t2YmRoelVlbFJOZg0KLURuYmtLdmJkQmhrQ0toZWoNCi1Eb0RMS3ZiZGhiT2JlWFJSDQotRG5ia0t2YmR6SFpNQU1kdw0KLURvREtqdmJkWnhjak5ibFMNCi1Eb0NqanZiZER3d2tzc3RNDQotRG9Da0t2YmRVVmtwSnRBcQ0KLURvRExLdmJkYWFXRWVwUHcNCi1EbmNMS3ZiZEdkS3ZKYktLDQotRG9ETEt2YmRUdWxRSnRCUg0KLURvREtqdmJkcWNlSlBuVmENCi1EbmJrS3ZiZHZBZFpUT2VJDQotRU9jS2p2YmRWQWJSU3FSeQ0KLUVQQ2tLdmJkVHFRbnVWSG0NCi1Eb0NqanZiZHdOV0FORGVODQotRG5ia0t2YmRadElpWWRTbg0KLUVQQ2pqdmJkUElBWHlBWkINCi1FUENqanZiZFpvT0llRXpLDQotRG9ETEt2YmRtSkVUcVVyQg0KLURvQ2pqdmJkT0ZEdElpS2QNCi1EbmJrS3ZiZHF2b2xESXhxDQotRG5iamp2YmRtZ0ZZTk5meQ0KLURuY0xLdmJkaWVMSFVvQU8NCi1FUENrS3ZiZERuYmtMV2NFDQotRG9Damp2YmRtSkVUcHVTQg0KLURuY0xLdmJkaWllZ2pOWHINCi1FUERLanZiZFpRbGRpTWVSDQotRU9jS2p2YmRaSFhFQVBUSg0KLUVPYmtLdmJkV0h3dlhmeHoNCi1EbmJrS3ZiZHhVbGVSWkxuDQotRG5ia0t2YmR0dk54S1FzQQ0KLURvREtqdmJkT1N0V0hFdVENCi1EbmJrS3ZiZHNCZWxsSExaDQotRG9ES2p2YmRzQ0ZsbEdrWg0KLUVQREtqdmJkamhHbEdHT0wNCi1EbmNLanZiZHh4SktCb3lrDQotRG5jS2p2YmRyWFBrY0pZcQ0KLURvQ2tLdmJkdVZuWGlwc0ENCi1Eb0RLanZiZGpLR0hqTXdyDQotRG9ES2p2YmRiQldFZlBwWA0KLUVPY0tqdmJkem5vcUVjTVkNCi1Eb0NrS3ZiZHlTbkpNcWJIDQotRG9Damp2YmRsclpWWnNEaQ0KLUVQRExLdmJkS2ZGZ2JBcHUNCi1Eb0RMS3ZiZFpSTWRpTkZSDQotRU9iamp2YmRwZWNlVVdBaA0KLUVPYmtLdmJkUm90SEtGY3cNCi1EbmNLanZiZGladUZrcG1mDQotRG9ES2p2YmRuR2R3bU5nWg0KLURvREtqdmJkTW94UlZuR3MNCi1Eb0RMS3ZiZGlWWmVYUnRiDQotRU9jS2p2YmRHQW9SWWl6bQ0KLURvREtqdmJkSkpkQUpwR2QNCi1Eb0RLanZiZHdNdkFORUZODQotRG5iamp2YmRhYVdGRnBRWA0KLURuYmpqdmJkcWx6S1pNSUoNCi1FUERMS3ZiZHhuU2hYc0pEDQotRG5jTEt2YmRNZmNQbG90aw0KLURuY0xLdmJkVVJSUFZVaE4NCi1EbmJrS3ZiZEhnR3paWHhIDQotRU9jTEt2YmRZbFJjdE9NTg0KLURuY0tqdmJkbkhFd2xuR3kNCi1Eb0RLanZiZGxZc1NUWkd0DQotRU9jS2p2YmRaeGNqTmNMcg0KLUVPYmpqdmJkbXR0eWpqU0cNCi1FT2JrS3ZiZGZmTHluSEhBDQotRG5ia0t2YmRtcFp4dkxaQw0KLURuY0xLdmJkQmhqYWtKR0sNCi1Eb0NrS3ZiZHBzdEhTUmtVDQotRVBETEt2YmRpTGRkT1ZDeQ0KLUVPY0tqdmJkeFVsZVF5TG4NCi1FUENrS3ZiZFR1a3BLVGFSDQotRU9jTEt2YmRqdlhPRUNZWA0KLUVPYmpqdmJkUlduRURMZ2MNCi1FT2JrS3ZiZGJobGpMR1d4DQotRVBDa0t2YmRab09KRWR5ag0KLURuYmtLdmJkcXJWS25MQW0NCi1Eb0RLanZiZFZBYlJUUlJ5DQotRG5ia0t2YmRoZmpEWldLVg0KLUVPY0xLdmJka1dYT0VDWVgNCi1EbmJrS3ZiZFlUTGFNc254DQotRU9iamp2YmRaUk5GSW1GUg0KLURuY0xLdmJkQ1d6ZElkcFcNCi1FT2NMS3ZiZHB5UElHcUR4DQotRG9ETEt2YmRpQ09jRldwcQ0KLUVQQ2pqdmJkaHR6RlhTVWINCi1EbmJqanZiZGxxeHR5cmNpDQotRG9Da0t2YmRpWnRlbFJPRw0KLUVQQ2tLdmJkVlVOVUZrdksNCi1EbmJrS3ZiZE5kZFVKSkxFDQotRG9Da0t2YmROZGN0SWhqZA0KLURuYmtLdmJkY3l5UVlaUWINCi1FT2JrS3ZiZFFtWUJ5TnR6DQotRG9ETEt2YmRWck54QmVNRA0KLUVQQ2pqdmJkQ1RCQ3NldnINCi1EbmNMS3ZiZHRTclRZeWVEDQotRG5iamp2YmRSeWlnc0RXQQ0KLURuY0xLdmJkSllVQmdsUXANCi1Eb0RLanZiZFNQc2ZpZWRYDQotRG9Da0t2YmRBRFJ4S1ppUQ0KLUVQRExLdmJkckVGSlBtdkINCi1EbmJqanZiZHZBY3lUT2RoDQotRU9jS2p2YmRhTWphc1VtSA0KLURvREtqdmJkWmpTZ29nQmYNCi1EbmJrS3ZiZG5HZVhtT0d5DQotRG5iamp2YmRNZ0NvbVB1TA0KLUVQQ2tLdmJkeEt2Y2d6ekcNCi1EbmNLanZiZHd0bGRweU1PDQotRG9ES2p2YmRiaGxpa0dYWQ0KLUVQQ2tLdmJkcHlQSUhSRVkNCi1Eb0RMS3ZiZGtDbExSSFVnDQotRVBES2p2YmRxRmRGVVdCSQ0KLUVPY0xLdmJka3hycXJ4Z1UNCi1Eb0RMS3ZiZFR2TG9pdEFxDQotRG9Damp2YmRKdXVGY2RmaQ0KLUVQQ2pqdmJkcnlrcFRBaE8NCi1FUENqanZiZGladUZrcU5mDQotRU9iamp2YmRFdXhwUU5LRg0KLUVQQ2pqdmJkR0dLU09KVVINCi1FUENrS3ZiZGN5eG93eHFDDQotRG5iamp2YmRqaEdrZWVtaw0KLUVQREtqdmJkaWpHSUptWVMNCi1EbmJrS3ZiZHlwbmxpS1hBDQotRU9jS2p2YmRSYWRGTGh5TA0KLUVQQ2pqdmJkeHdpS0NQeWsNCi1Eb0NrS3ZiZGZJTFZxblFnDQotRG9ETEt2YmRrTkNMekVnUA0KLURvQ2tLdmJkR0tkcmJnbHUNCi1EbmJrS3ZiZEpjSmNSSmNZDQotRG9ETEt2YmRJd3NhaE1SUQ0KLURuYmtLdmJkTmRkVUloamQNCi1FUENrS3ZiZEp1dUdEZGdKDQotRVBETEt2YmRqS0dIak13cg0KLUVPYmtLdmJkR2RLdktDSmoNCi1EbmNLanZiZE5VcnFrTkFYDQotRG9ETEt2YmRUcVFvVlZIbQ0KLURvREtqdmJkTmRkVGlJa0UNCi1FUENrS3ZiZHVhRVpUUEZJDQotRG5iamp2YmRGV1lvcE1pZQ0KLUVPYmpqdmJkeVhoaWFvekwNCi1FUENqanZiZGhhb0RGV3BxDQotRG5jS2p2YmRKSmRBS1FIRQ0KLURvREtqdmJkZWdrVnJPUWcNCi1EbmJqanZiZHd1TWRxWWxPDQotRVBDa0t2YmRMS2FIdkFKeQ0KLURvREtqdmJkUmJFRkxpWWsNCi1Eb0RLanZiZFN4TE1Oemp4DQotRG5ia0t2YmRHS2RzQ2hNdQ0KLURuY0tqdmJkQUNyWUp6SlENCi1Eb0NqanZiZGJVYWZ3a1VJDQotRG5jS2p2YmR6alZQcERydA0KLURuYmpqdmJkRmZLU09KVHENCi1FUERLanZiZEhmZnl5WHhIDQotRU9jTEt2YmRSa1pGdGdMVA0KLUVPY0tqdmJkWHNNQW1Ub1kNCi1FT2NMS3ZiZE5Qd3FXTmZzDQotRG9Damp2YmRFdXhwUGxqRg0KLURuY0xLdmJkakpmSUpseFMNCi1Eb0NqanZiZGhnSmJ4dWl1DQotRVBDa0t2YmRyRGRocE9XQg0KLURuYmtLdmJkd1dsQldBdXUNCi1FT2JqanZiZHlTbWlNckNIDQotRVBDamp2YmR1V09YalJUQQ0KLURuY0xLdmJkUkRiYVBxRVMNCi1FUENrS3ZiZGpFa0hWUEFPDQotRVBETEt2YmRkaWlxdlV6bg0KLUVQREtqdmJkeVlKS0NQeWsNCi1EbmNLanZiZE5lRVRoaUtkDQotRG5jS2p2YmRyYkdNbEdrWg0KLUVPY0tqdmJkT1RUdkhFdVENCi1FT2JqanZiZEZ5VlVhRVlDDQotRVBDa0t2YmRiaU1pa0Z3WQ0KLUVQREtqdmJkdWFEeHNQRkkNCi1EbmNMS3ZiZG96bWNrWVBBDQotRG9ETEt2YmRWWWdzeWtQTw0KLURvQ2pqdmJkUXZuRGJrZ2MNCi1EbmNLanZiZFpMckR0TmttDQotRG9ES2p2YmRIZmdaeVlYZw0KLURvREtqdmJkYXVDR3drVUkNCi1Eb0RLanZiZG1KRHNxVlNCDQotRU9jS2p2YmRoZ0pieVdLVg0KLUVQQ2pqdmJkcm91b0tEV0cNCi1Eb0RLanZiZFFtWUNZblV6DQotRG9ETEt2YmRmSGtWcW1wZw0KLURvQ2pqdmJkWmpTaFBmYWYNCi1Eb0NrS3ZiZElHZnpZeFlIDQotRVBES2p2YmRaUk1lSk5GUg0KLUVQQ2pqdmJkUnBUZ0tGZFgNCi1FUENrS3ZiZEVZWU1VVVVNDQotRG5jTEt2YmR3dU1kcVpMbg0KLUVPY0tqdmJkbXVWWmtKcWYNCi1EbmNLanZiZGhnSmJ5V0p1DQotRG5iamp2YmRLVnVGY2RmaQ0KLUVQQ2tLdmJkUmFkRWxJeGsNCi1FUENrS3ZiZFlsU0RzbWttDQotRG9ES2p2YmRobEZFT1ZEWg0KLURvQ2pqdmJkSXNaQlNsd2wNCi1Eb0RLanZiZExBa0dtQ1hxDQotRG9ETEt2YmRxd1FNQ2lZcQ0KLUVQREtqdmJkVVJST3R1SU4NCi1Eb0NqanZiZHB4b0hnUkVZDQotRG5jS2p2YmR3WExhV0F1dQ0KLUVPYmpqdmJkcnBXUEpjV0cNCi1FUERMS3ZiZG1vell2TFliDQotRVBDa0t2YmRNb3dwdW5Hcw0KLURuYmtLdmJkQU5IeVN2elkNCi1EbmNMS3ZiZFp5RGluRExyDQotRG9Damp2YmR6aXVQcEVTdA0KLUVQREtqdmJkaVZaZVhSdUMNCi1FUERMS3ZiZERuY0trV2JkDQotRU9jTEt2YmRGVnhvcE5KZQ0KLURuY0xLdmJkQUNxeEp6SXANCi1EbmNLanZiZGFNa0NUVWxnDQotRG9Da0t2YmRoeXVHTVFuRw0KLUVPYmpqdmJkYkJXRkZwUHcNCi1FT2JrS3ZiZFRBRWlJQ1BFDQotRG9ES2p2YmRiVWFnWGp0SQ0KLURvRExLdmJkR1pVdUFjd2INCi1Eb0RLanZiZG5HZHdsbWdaDQotRG9ETEt2YmRWQkNSU3BxeQ0KLURuYmpqdmJkZklLdlJuUkgNCi1FT2JrS3ZiZGFSZWJnc2VrDQotRG5iamp2YmROVlNyTE5BWA0KLUVQREtqdmJkckpBS0VtUEYNCi1EbmJrS3ZiZEJkUUJXS05HDQotRG9Damp2YmRlUEZUTFVVUw0KLUVQQ2tLdmJkUkRjQW9xRHINCi1EbmNMS3ZiZHJOWml5TGhKDQotRG9Da0t2YmRMcXdOWnRweg0KLUVQRExLdmJkbHF4dHpURUoNCi1EbmJrS3ZiZHJSdGpta0JODQotRVBDa0t2YmRaUk1lSk5FcQ0KLURuYmtLdmJkWnNpSllkVE8NCi1FT2JqanZiZFV0TXRHTHZLDQotRU9jTEt2YmRuQ0p3WU9uVg0KLURuY0xLdmJkVU1XUEF1bmkNCi1FT2NLanZiZEpjSmJwakRZDQotRG9Da0t2YmRjSW1LTEdYWQ0KLUVPYmtLdmJkWVNsQW1UbngNCi1EbmNMS3ZiZENUQkN0RnZyDQotRU9iamp2YmRxbHlqWWxJSg0KLURvQ2tLdmJkbVNaVXpTY2kNCi1Eb0RLanZiZGpFamZ1UEFPDQotRVBDamp2YmRXZll6VUFQVA0KLURuYmpqdmJkelJPbUpKd0ENCi1FT2JqanZiZG5RWnlWanlDDQotRG5jS2p2YmRqQVFHYVBnSw0KLUVPYmtLdmJkdFRTVFpaZUQNCi1Eb0RMS3ZiZFpMckVUbkxtDQotRG5jS2p2YmRDRHBBdWpORw0KLURuY0tqdmJkVXlIc3lrT24NCi1FUERMS3ZiZGVYeXN0UmV6DQotRVBDamp2YmRsclpVeXJjaQ0KLUVQREtqdmJkd2p2Y2d6ekcNCi1FUERLanZiZG5IRXhOT0d5DQotRU9jS2p2YmRaTHFkVG1sTg0KLUVQQ2tLdmJkRXV4b3BNakYNCi1FT2JqanZiZEpZVGFnbFJRDQotRVBDamp2YmRyV3BMYmlaUg0KLUVQQ2pqdmJkTnhPdXpjblUNCi1Eb0RMS3ZiZGlqRmhLTlhyDQotRG5ia0t2YmRLV1ZHRUZISg0KLURuYmtLdmJkS0NpY1FqQ3gNCi1Eb0NrS3ZiZGNTY0xUZEtCDQotRU9jS2p2YmRLV1VlY2RmaQ0KLURvQ2pqdmJkaUxlRG11RFoNCi1EbmNLanZiZHlTbkpOU0NIDQotRVBETEt2YmRac2hoeURybg0KLURuYmtLdmJkc3NTU3h5ZGMNCi1FT2NMS3ZiZHFyVWpuTEJODQotRVBES2p2YmRHZExXS0NLSw0KLUVPYmpqdmJkc1FXUEpidWYNCi1Eb0RMS3ZiZEpjS0RSSmNZDQotRG9Damp2YmRab05pRWVaag0KLURuYmtLdmJkR0ZqU09KVHENCi1FUERMS3ZiZHh4SktCb3pMDQotRG9ES2p2YmRCcmFEVUdYUw0KLUVQREtqdmJkSmJqQ3BpY1kNCi1Eb0NqanZiZFZxbXdiRWtjDQotRVBES2p2YmRpakZoS013cg0KLUVQRExLdmJkclNWTE5rQk4NCi1Eb0NrS3ZiZGlVekV2cXVDDQotRVBDamp2YmRXSVlWeEd4eg0KLURuYmtLdmJkWm9PSWRlWmoNCi1EbmNMS3ZiZFpSTWVKTkVxDQotRU9iamp2YmRaTVNEdE9NTg0KLURuYmpqdmJkUlduRGNMZ2MNCi1Eb0RMS3ZiZG1SeHR6VERpDQotRU9jS2p2YmRKbUFEeWdVYQ0KLUVPY0tqdmJkeFVtRlF5TU8NCi1FT2NMS3ZiZE9UVVdIRXRwDQotRG9ETEt2YmRaUk5GSk1lUg0KLUVPY0xLdmJkeG1zSHhTaGMNCi1FUENrS3ZiZFV4aFR5a1BPDQotRG9Da0t2YmRlbGZXZmxqTA0KLUVQRExLdmJkRmVqU09KVHENCi1FUENrS3ZiZEtlZklCYVJWDQotRG5jS2p2YmRkZU9xYlhESw0KLUVPY0tqdmJkaGxFY25VY1oNCi1Eb0NrS3ZiZFp0SkpaRVRPDQotRG5iamp2YmRTUHRISmZEdw0KLURuY0xLdmJkT0ZEdEloa0UNCi1FUERMS3ZiZEZ5VlZBY3diDQotRG9Damp2YmRxVHRHcXFqdA0KLUVPY0xLdmJkeVRPSWxyQ0gNCi1EbmJqanZiZEFDcllLWmlRDQotRG9ETEt2YmR2bVdBTWNlTg0KLURvREtqdmJkTEJMSE5DWVINCi1FUENrS3ZiZEl4VUNIbFFwDQotRVBETEt2YmRRbVhheU50eg0KLURvQ2pqdmJkS1JaZG9GbWUNCi1EbmNMS3ZiZFpvTmlFZHlqDQotRG9ES2p2YmRxcXRrT0xCTg0KLUVQQ2tLdmJkaVp1RmtwbWYNCi1EbmNLanZiZEVQQ2prWENkDQotRG9ES2p2YmRiVkJnWGpzaA0KLURvQ2pqdmJkbVJ5VXpTZEoNCi1FT2JqanZiZE1KQ0xweEFTDQotRG9Damp2YmR3V2xCV0F2Vg0KLUVQREtqdmJkTkhDcE1vdUwNCi1EbmNLanZiZEVPY0xLd0RFDQotRG9Damp2YmR3anZjZ3p6Rw0KLURuYmtLdmJkTkdicE5QdGsNCi1Eb0RMS3ZiZFpHd0VBT3JpDQotRU9iamp2YmRhUmZESVRmTA0KLURvREtqdmJkVnZod3VkRWcNCi1FUENqanZiZEhnR3l4d3dnDQotRG5jS2p2YmRjSk1pa0Z3WQ0KLUVPYmpqdmJkd012QU1kRW0NCi1FT2NLanZiZHVNWVhCVUF3DQotRVBETEt2YmRwZkRlVHVhSQ0KLURvREtqdmJkc3NTU3h6RWMNCi1EbmJqanZiZGpibExSSFVnDQotRU9jTEt2YmRWd0l4V0RlSA0KLUVQQ2tLdmJkTEdGZ2FhUXUNCi1FUERLanZiZEJpS2FrSWZLDQotRG9ETEt2YmRFT2NLandERQ0KLUVPY0tqdmJkZGlqUnZVem4NCi1Eb0NqanZiZG1haXZ4UE9WDQotRG5ia0t2YmRNZmNRTlB1TA0KLURuY0xLdmJkWnRJaVpEc08NCi1Eb0RMS3ZiZGhsRWNtdURaDQotRU9jS2p2YmRJR2Z6WXhZSA0KLURuY0xLdmJkSUNMeWR6QUQNCi1FUERMS3ZiZE1mY1BtUHVMDQotRG5iamp2YmRyUnVLbWphTg0KLURuYmtLdmJkYnNES3NjakINCi1Eb0NrS3ZiZGhrZGROdGNaDQotRU9jTEt2YmROUVhxVm5Hcw0KLURvRExLdmJkckVGSW9uVmENCi1Eb0NqanZiZFF2bkRjTUlEDQotRVBDamp2YmRqbGFsWmVHbw0KLUVQQ2tLdmJkakpmSUtOWVMNCi1FT2JqanZiZFJFREJQcUVTDQotRVBDamp2YmRpWnRmTVJOZg0KLURvREtqdmJkQURSeEp5aVENCi1EbmNMS3ZiZFlrcWNzbk1ODQotRG5jTEt2YmRac2hpWkRzTw0KLURvRExLdmJkUk5YYXlOdHoNCi1EbmNMS3ZiZHFjZGlQbXZCDQotRVBDa0t2YmRyTlppeGxIaQ0KLUVQQ2pqdmJkd3RtRlJZbE8NCi1FT2JrS3ZiZEpUWkJUTlhsDQotRU9jTEt2YmRXUm5YYWRrYw0KLURvRExLdmJkdndNQlZhVnUNCi1Eb0RLanZiZGxaU3JUWWdVDQotRVBETEt2YmRRY2JhUVJEcg0KLURvQ2pqdmJkaHVaZHZyVWINCi1EbmJrS3ZiZFp4ZEtPQ2xTDQotRG5jS2p2YmRKem9leEVBTg0KLUVPY0xLdmJkUXZtZERMaEQNCi1EbmNMS3ZiZHVuc3pwa1BVDQotRU9jS2p2YmRpWnVHTVFuRw0KLURuY0tqdmJkVlpJVVprT24NCi1Eb0RMS3ZiZGt4c1JzWWdVDQotRVBDamp2YmRHUUFTd0dleQ0KLURuY0tqdmJkbkJpdndvTnUNCi1FUERMS3ZiZHNCZWxrZmp5DQotRG9ETEt2YmRkZG9SYldiag0KLUVQQ2pqdmJkaGFuY0ZYUXENCi1FT2JrS3ZiZEp2VWZFRWZpDQotRVBETEt2YmRJaWRBS1BmZA0KLURvRExLdmJkeFZNZHB4a24NCi1Eb0NqanZiZGFOTENUVk5IDQotRG5ia0t2YmRaeURpbkRNUw0KLURvRExLdmJkck16SnlMaEoNCi1FUERMS3ZiZHlYaGlhb3pMDQotRG9Damp2YmRHS2VUREhsdQ0KLURuY0tqdmJkd3pJR0Z4RlMNCi1FT2JqanZiZEp2VWVkRWZpDQotRG5jTEt2YmRJakVBSnBHZA0KLURuY0tqdmJkeVROaU5SYkgNCi1FT2NLanZiZGlka0d1UEFPDQotRG9ETEt2YmRrVnZtY2JYdw0KLURvQ2pqdmJkSllUYkhrcHANCi1Eb0RMS3ZiZEZ5VlZCRVlDDQotRVBETEt2YmRtb3l5Vmp5Qw0KLUVPY0tqdmJkY1RES3REakINCi1FUENqanZiZEV2WXBQbUplDQotRG9Damp2YmRDSkxDS2hlag0KLURvQ2pqdmJkU0t4ZlVnTFQNCi1Eb0RMS3ZiZEZqZVRESU5WDQotRG5jTEt2YmRFWHhNVVR0TQ0KLUVPY0tqdmJkV1JuWGFlTUQNCi1Eb0NqanZiZHJNekp5TGdpDQotRG9Da0t2YmRjU2JrVUVLQg0KLURuYmtLdmJkeXplT1NJSWgNCi1EbmNMS3ZiZHBzdEdxckt0DQotRVBES2p2YmRDSkxCa0pHSw0KLUVPY0xLdmJkSmNKY1FqRFkNCi1FUERMS3ZiZGJMTGZQTmNBDQotRG5iamp2YmRFQVNJbVp3WA0KLURuYmpqdmJkdHVtd2lxVEENCi1EbmJrS3ZiZHhLdmRIenlmDQotRG9Damp2YmRWd0l4V0RlSA0KLURuY0xLdmJkWXpjRnFqVnkNCi1FUERLanZiZHFpQUplTW9GDQotRG9ETEt2YmROUVhxVm1mcw0KLUVQRExLdmJkRmpkc0NoTlYNCi1Eb0NrS3ZiZE9UVVdHZHRwDQotRU9jS2p2YmRPRWRVSWlLZA0KLUVPY0xLdmJkdWFFWlNvRkkNCi1FT2NMS3ZiZHhzTmhsckJnDQotRU9ia0t2YmRjSWxpamZYWQ0KLURvRExLdmJkTHF2bHl0cHoNCi1Eb0RLanZiZElyeUJUTlhsDQotRU9iamp2YmRRd09FQ2toRA0KLURvQ2pqdmJkTEZlZ2FhUXUNCi1FT2JrS3ZiZEZrRlRDaE5WDQotRG5iamp2YmR5emVPU0hpSQ0KLUVPYmpqdmJkTEFrSE5DWVINCi1EbmJrS3ZiZFp5RGltY01TDQotRG5jS2p2YmRrTWJMekVnUA0KLURuYmpqdmJkUmJFRWtoeUwNCi1FT2NLanZiZExyWE16VlF6DQotRU9jS2p2YmRWQkJxVFJSeQ0KLUVPYmpqdmJkeU5zSHhUSWMNCi1FUENqanZiZE11VFJrTkFYDQotRG9Da0t2YmRVYUNRcnByWg0KLUVQQ2pqdmJkam1DTHlkZm8NCi1Eb0NqanZiZEZ5VlZBY3hDDQotRVBDamp2YmRRdm5EYmxJRA0KLURuYmpqdmJkTGhiTHFZQVMNCi1EbmNMS3ZiZEZ4dVZCRVlDDQotRG5jS2p2YmRHTEZTY0lNdQ0KLURuY0tqdmJkQnZ6Y2hlUVcNCi1FUERMS3ZiZFNQc2ZqRmN3DQotRG5ia0t2YmRzUVdPaWJ2Rw0KLURuYmtLdmJkYVNHQ2hUZkwNCi1FUERMS3ZiZGptQmt6RkdvDQotRG9ETEt2YmRxQWlGQVdoRQ0KLUVQRExLdmJka1Z3TmNhd3cNCi1Eb0NrS3ZiZEtSWmVQR09GDQotRU9jTEt2YmRKWHRDSU1SUQ0KLUVQQ2tLdmJkYU5MQ1RVbUgNCi1FUERMS3ZiZGxpRHRSVXJCDQotRU9jTEt2YmRLZkdIYkFwdQ0KLUVPYmtLdmJkRHd3bFRzdE0NCi1Eb0RMS3ZiZG1nRXhNbWZ5DQotRU9jTEt2YmRLV1VmRUZISg0KLUVQQ2pqdmJka3hycXJ4ZnQNCi1EbmNMS3ZiZGtDbEtxSFVnDQotRG9ES2p2YmRWcW5YYWRsRA0KLURvRExLdmJkVUx2UEJXUEoNCi1Eb0RLanZiZFVzbHNmTVdLDQotRU9jTEt2YmRKdlZGZEZHaQ0KLURuY0tqdmJkaWlmSGlseFMNCi1FUENrS3ZiZFJhY2VNSllrDQotRG9Da0t2YmRkd3l0VHJGeg0KLUVQRExLdmJkWWtyRVRuTG0NCi1Eb0NqanZiZGlNRWRPVWJ5DQotRG9Da0t2YmR4Vk1lUXlMbg0KLUVQQ2tLdmJkd3VNZHB4bE8NCi1FUERMS3ZiZE5QeFF1bWZzDQotRG5jS2p2YmRZcGxlSk5FcQ0KLURuY0tqdmJkVEFFaGhDUEUNCi1FT2NMS3ZiZFVHem5Md1ZlDQotRU9jS2p2YmROUHdwdW5IVA0KLUVQRExLdmJkS2FMSE5Cd3ENCi1FT2NMS3ZiZEZmS1JtaHRSDQotRU9ia0t2YmRZbFJjc21sTg0KLURvRExLdmJkV1NPWGFkbEQNCi1FT2NMS3ZiZFdXaVh1Y2RnDQotRG9Da0t2YmRac2lJeGNzTw0KLURvRExLdmJkYmhsaWtGdngNCi1FT2NLanZiZHRsWVhBc2FYDQotRU9jTEt2YmRVdE5UZWxWag0KLURvREtqdmJkaGFvREZYUlINCi1Eb0RMS3ZiZEV1eG9vbUplDQotRG9ETEt2YmRFWVlMdFRzbA0KLURuY0xLdmJkYmhtSmtHV3gNCi1FUERMS3ZiZHF3UGtiaHhxDQotRG5iamp2YmRscll1WnNFSg0KLURuY0xLdmJkZUtLU1dVem4NCi1EbmJrS3ZiZHlUTmlOU0NIDQotRG5jS2p2YmRkd3pUc3Fleg0KLURuY0xLdmJkVFhrTU56angNCi1Eb0RLanZiZEptQUVaZ1VhDQotRG5jS2p2YmRlRW5xYXZiag0KLUVQRExLdmJkY0pOSmpmV3gNCi1EbmNMS3ZiZFB5TkFHc1JqDQotRG9Damp2YmRMR0dIYkFxVg0KLURuY0tqdmJkZGRvUmJXY0sNCi1Eb0RMS3ZiZFpqVEhvZ0JmDQotRVBETEt2YmRSa1pGdUhLcw0KLUVPY0xLdmJkRXV5UG9sakYNCi1FUERLanZiZEVZWU1UdFVNDQotRG5jS2p2YmREeFhsVHNzbA0KLURuYmtLdmJkUXZtY2JsSUQNCi1FT2JrS3ZiZGptQmt5ZGdQDQotRG9Da0t2YmRPQUpUVUtTQQ0KLURuY0tqdmJkaGdKYnh2SnUNCi1Eb0RLanZiZFZ2aHhWY2VIDQotRG9Da0t2YmRqdlhPRGF3dw0KLUVQREtqdmJkZW1GdmZsaWsNCi1Eb0RLanZiZGtDa2tSR3RnDQotRG9Damp2YmREaWdqVnhLQQ0KLURuY0xLdmJkTEFqZ05DWVINCi1FUERLanZiZGJVYkd3a1RoDQotRU9iamp2YmRtdVV6TEpyRw0KLURuYmpqdmJkbWdGWGxuR3kNCi1Eb0NrS3ZiZEZ4dHRhRHdiDQotRVBDamp2YmRKY0tEUktDeA0KLURvQ2tLdmJkcGZEZVVXQWgNCi1FUERMS3ZiZEFEU1lKeWhwDQotRG9Damp2YmRIa2F6bXZxTA0KLURuYmtLdmJkdUx4V2FVQlgNCi1FUENrS3ZiZFFkQ2FQcGRTDQotRU9jTEt2YmRaZHdmemhJYg0KLUVQREtqdmJkS1dVZWNlR2kNCi1FUERLanZiZFNDRGVNSlpMDQotRG9ES2p2YmR5T1NoWVNoYw0KLUVPYmpqdmJkbGlFVVJWU0INCi1EbmNMS3ZiZG1nRXdsbkd5DQotRG5ia0t2YmRzQmVtTUhLeQ0KLURvREtqdmJkWXpjR1NKdloNCi1FT2JrS3ZiZEdjanZLQmpLDQotRU9jTEt2YmRKdXVHRGRnSg0KLUVQQ2pqdmJkT1N0V0dlVXANCi1FT2NMS3ZiZEdMRXNDaE11DQotRU9jTEt2YmRlQVRxTllKZg0KLURuY0xLdmJkeHhJakNRWmsNCi1FT2JrS3ZiZGRaeVFYeVFiDQotRG9ES2p2YmRWQkNSVFJSeQ0KLUVQQ2pqdmJkdUREVld1b1ANCi1FT2NLanZiZFZaSHRaa09uDQotRVBDamp2YmRaUW1FaG1GUg0KLURuYmtLdmJkWnlEaW1jTHINCi1FUERMS3ZiZGpibEtxSFZIDQotRU9jTEt2YmRadElpWkRzTw0KLURuYmtLdmJkUldtY2JraEQNCi1FUENqanZiZGRuZVNqdFRyDQotRG9Da0t2YmRaUW1GSk1kcQ0KLURvRExLdmJkTEZlZ2JCUlYNCi1FT2NLanZiZFN3a01Oemp4DQotRG9Damp2YmRGamVUREhsdQ0KLUVQQ2pqdmJkdFNxcnh5ZGMNCi1EbmNMS3ZiZFNQdEhLRmN3DQotRG5jTEt2YmR5WUpKYXBaaw0KLUVPY0tqdmJkZHhac3NyRnoNCi1FT2JqanZiZGZla3pPR2dBDQotRVBES2p2YmRyeWxRU2FIbg0KLURuYmpqdmJkWmlzSG9mYkcNCi1FT2JqanZiZHJiR05NSEt5DQotRG5ia0t2YmRMQktmbUJ4Ug0KLURuY0tqdmJkQUNxeEp5aHANCi1EbmNMS3ZiZGRpalJ1dHpuDQotRVBETEt2YmRNcFlSVm1mcw0KLURuY0xLdmJkbXR0ektpcWYNCi1EbmJrS3ZiZFpubWhkZVpqDQotRVBDa0t2YmRqS0Znak5ZUw0KLURuYmpqdmJkeG5USHhTaGMNCi1FUENqanZiZGxaVFNUWWdVDQotRG9Damp2YmRxbHlqWWtnaQ0KLUVPYmtLdmJkeFZNZVF5TU8NCi1FUERMS3ZiZFNQdEhKZWN3DQotRVBETEt2YmRycFdPaWJ2Rw0KLUVPYmtLdmJkUmJFRkxoeUwNCi1Eb0NrS3ZiZFlOcUFZVXZVDQotRG9Da0t2YmRuQ0tYWG5uVg0KLUVPYmtLdmJkZGRvU0J2YmoNCi1EbmNLanZiZE5HY1BscFVrDQotRG5ia0t2YmRtYWpYWG5tdQ0KLURvQ2pqdmJkSlhzYkhsUXANCi1EbmNMS3ZiZE5HY1Bsb3VMDQotRG9Da0t2YmRUQUZKSGFvRQ0KLUVQQ2pqdmJkblB5eHZLeUMNCi1FUENrS3ZiZFJ5aWhURFdBDQotRG5jTEt2YmRRbHhDWk50eg0KLUVPYmtLdmJkSlN5QXNNd2wNCi1Eb0NqanZiZG10dHlrSnJHDQotRVBDa0t2YmRmcEJ6d0VYaA0KLURvQ2pqdmJkcnpNUVRCSU8NCi1FUERLanZiZGRaeG93eVJDDQotRG5jS2p2YmRhTkthcnVOSA0KLURuYmpqdmJkYU5LYXNWTWcNCi1EbmNLanZiZGNiVE5TQVRtDQotRVBDa0t2YmRpTGRjblZEWg0KLUVPYmpqdmJkWVRMYU10T3gNCi1FT2NLanZiZEVBU0lseld3DQotRG5iamp2YmR6aXVQb2RUVQ0KLUVPY0xLdmJkcVVVSFJxa1UNCi1EbmJrS3ZiZHlOc0h4U2lEDQotRU9iamp2YmRoa2VEblVjWg0KLUVPY0tqdmJkTkhDcE5RVWsNCi1FUERMS3ZiZElyeUJTbVlNDQotRG5ia0t2YmRmZWt5bkdnQQ0KLUVPY0xLdmJkaUhLQ3lXSnUNCi1FT2JrS3ZiZHJNektZbElKDQotRG9Damp2YmRzWmtvcmFJTw0KLUVPY0tqdmJkUWNjQW9xRVMNCi1Eb0NqanZiZHRUUnJ4ekZEDQotRVBDamp2YmRKWHRCaE1SUQ0KLURuYmpqdmJkc0JmTk1IS3kNCi1EbmJrS3ZiZGVFbnJCd0NqDQotRG9ETEt2YmRUZnpta3Z2Rg0KLURvQ2pqdmJkQ0pMQ0xJZWoNCi1EbmJqanZiZE5VcnJMTkFYDQotRG9Da0t2YmR4c05pTlJhZw0KLUVQQ2pqdmJkdGJjVXdWb1ANCi1Eb0RLanZiZGFvZ0hEa3pkDQotRG5jS2p2YmRwZWRGVHVhSQ0KLURuYmpqdmJkcVluZ2ZwZFkNCi1EbmNLanZiZGJpTkprR1d4DQotRG9Damp2YmRHY2tWakJpag0KLUVPYmtLdmJkcWNlSW9tdkINCi1FUERMS3ZiZEZXWlFRTkplDQotRU9ia0t2YmRyUnRrT0xBbQ0KLURuY0tqdmJkRHd3a3RVVGwNCi1FT2JrS3ZiZHdOV0FNY2VODQotRG5jS2p2YmRaTVNEdE9MbQ0KLUVPYmpqdmJkVGt2UEF1bmkNCi1Eb0RMS3ZiZFV4aFR5a1BPDQotRU9jTEt2YmRWQkNRc1FxeQ0KLUVQREtqdmJkWnNoaHhjcm4NCi1EbmJqanZiZHFkRWlRT1dCDQotRG9ES2p2YmRrV1dtZEJ3dw0KLURvRExLdmJkelFvTWhpd0ENCi1EbmJqanZiZFVHem1sWFdGDQotRG5jS2p2YmRKVFlhVE13bA0KLURvREtqdmJkR0xGU2NIbVYNCi1Eb0RLanZiZHJXcExjSlpSDQotRU9jS2p2YmR3TldBTWNkbQ0KLUVPYmtLdmJkbWZlWU5PR3kNCi1FT2JrS3ZiZHRjRFV3Vm9QDQotRG5iamp2YmRpWnVHTVFtZg0KLUVPYmpqdmJkZk1ld0dtSmsNCi1EbmJqanZiZEFOSVpUV3l4DQotRG5jS2p2YmR0VFNTeHlkYw0KLURuYmtLdmJkc0JmTWtmankNCi1Eb0RLanZiZFNMWWZVZ0tzDQotRG9ETEt2YmRaaXNIb2dDRw0KLUVPYmtLdmJkVlRsc2ZNVmoNCi1EbmNLanZiZGRaeVB3eHBiDQotRG5jTEt2YmRBTWhZc1haeA0KLURuY0xLdmJkeHdoakNQekwNCi1FT2NLanZiZEtSWmVPZW1lDQotRG9Da0t2YmR1bnN6cUxPdA0KLUVQREtqdmJkWlJNZGlNZHENCi1EbmJqanZiZEV1eHBQbGpGDQotRVBETEt2YmRHR0pyT0pVUg0KLUVQREtqdmJkVnZpWHVkRWcNCi1EbmJqanZiZHBmRGVUdkJJDQotRG5jTEt2YmRSYWRFbEpZaw0KLUVQREtqdmJkYU1qYlN1TWcNCi1FUERMS3ZiZFRBRWhoQ09kDQotRG5jTEt2YmRUSXlpcUFCTQ0KLUVQQ2tLdmJkQnNCRFVGdnINCi1Eb0NqanZiZGNTYmtVRUphDQotRU9iamp2YmRDSWpiS2hmSw0KLURvREtqdmJkYXVDSFhqc2gNCi1Eb0NrS3ZiZHB5UEhmcUVZDQotRU9jTEt2YmREd3hNVVVVTQ0KLURuYmpqdmJkR0ZqUm1pVVINCi1Eb0RMS3ZiZGJRR2dFTHpkDQotRU9jS2p2YmRHR0pxbkl0Ug0KLUVQQ2pqdmJkeHJuSk5SYWcNCi1Eb0RMS3ZiZGJobUprRndZDQotRVBES2p2YmRkb0ZTa1R0Uw0KLURuY0tqdmJkTlVzU0ttQVgNCi1FUENqanZiZGZlbFptZmdBDQotRG9Da0t2YmRqS0dJSmx3cg0KLUVQRExLdmJkSllUYWdsUXANCi1FUENrS3ZiZFZyT1hiRk1EDQotRVBES2p2YmRUcHFQVXVJTg0KLUVQQ2pqdmJkR2NrVmlhaWoNCi1EbmJqanZiZGN6WlFZWXFDDQotRG9ES2p2YmRNdHJxa05BWA0KLUVPYmtLdmJkYU5LYXJ0bUgNCi1FUERLanZiZG1TWlV5c0RpDQotRU9jTEt2YmRsaGRVUlZTQg0KLURuY0tqdmJkV1JuWGJFa2MNCi1EbmNMS3ZiZExCS2ZtQndxDQotRVBES2p2YmRaZHdmemhJYg0KLUVQQ2tLdmJkaGFuY0ZYUlINCi1FT2JrS3ZiZGFTRmJndEdMDQotRG5jTEt2YmRKWHNhZ2xRcA0KLURuY0xLdmJkVXNsdEZsVmoNCi1Eb0RLanZiZExCS2ZtQndxDQotRVBDa0t2YmRuVlZaamlyRw0KLUVPYmpqdmJkaVp1RmxST0cNCi1FT2JrS3ZiZHd5Z2Vld2VTDQotRVBDa0t2YmR3anZjZ3p5Zg0KLURuYmtLdmJkc3NSc1l6RkQNCi1EbmJqanZiZHh3aUphb3lrDQotRVBDamp2YmRWaFlXWUhZeg0KLURuY0tqdmJkaHpWRmtwbkcNCi1EbmNMS3ZiZGVKalNWdHpuDQotRG5jTEt2YmR5WUlqQ1B5aw0KLUVQRExLdmJkSnB6RW9HTmUNCi1EbmNLanZiZG5CaXdYb051DQotRU9jS2p2YmRWck9ZQ0VsRA0KLUVPYmtLdmJkTEJLZ05DWHENCi1FUERLanZiZFRsV1BCVm5pDQotRVBES2p2YmRGeHVWQkR4Qw0KLURuY0tqdmJkbkhGWGxuR3kNCi1FUENqanZiZFlrckR0T01ODQotRG9Da0t2YmRVV01QalRhUg0KLURvQ2pqdmJkalN6aVNqaXoNCi1EbmJqanZiZGVPZHNLdFVTDQotRVBDa0t2YmRtZmR3bU9IWg0KLUVPYmpqdmJkdFNyVFl5ZGMNCi1EbmJrS3ZiZFJqeGV1R2tUDQotRU9ia0t2YmRLZWVoQ0FwdQ0KLUVPY0xLdmJkcHhvSUdxRVkNCi1EbmNLanZiZGJMTUdPbkRBDQotRVBDa0t2YmRFWHdrdFVVTQ0KLUVPYmtLdmJkaVV6RldxdGINCi1Eb0NqanZiZGlIS0N5Vml1DQotRU9ia0t2YmR2d0xhV0F1dQ0KLURvRExLdmJkaUNQREV2cVINCi1FT2NLanZiZFdYSlh2RUVnDQotRG9Da0t2YmRxVHRHclNMVQ0KLURuYmtLdmJkdGJidVhXT28NCi1FT2JqanZiZGdHTHpPR2dBDQotRG5jS2p2YmRUbFZvQldQSg0KLURvQ2tLdmJkZUVvUmJXY0sNCi1Eb0NrS3ZiZGtXV21kQ1h3DQotRG5jS2p2YmRlaExXUm1wZw0KLUVQQ2tLdmJkakZMR3RvQU8NCi1Eb0RLanZiZEdMRlNjSU11DQotRU9iamp2YmRyUnRrT0thTg0KLUVQQ2tLdmJkY3paUVlZcUMNCi1EbmJqanZiZGZIa1ZxblJIDQotRU9jTEt2YmR0dk54S1JUQQ0KLUVQQ2tLdmJkQURTWUp5aVENCi1FT2NLanZiZG1KRVRwdHJCDQotRU9jTEt2YmRVUlFvVXRnbQ0KLURvRExLdmJkWk1TRHRPTU4NCi1FUENqanZiZEZmSnFuSXNxDQotRU9jS2p2YmRjSk5LS2ZXeA0KLURuYmpqdmJka3lTcXJ4ZnQNCi1EbmNMS3ZiZEpweWVQRm1lDQotRG5jS2p2YmR1Q2NWWFdQUA0KLUVPY0xLdmJkeEt2Y2d6ekcNCi1Eb0RMS3ZiZHBmRUVzdkFoDQotRU9ia0t2YmRaeURqTmJsUw0KLUVQQ2pqdmJkaGJQREV3UlINCi1FUERMS3ZiZFRxUW9VdGhODQotRG9ES2p2YmR4blNneFNoYw0KLURvQ2tLdmJkY1RDanNjakINCi1Eb0NrS3ZiZE9UVVZmZVZRDQotRG5jS2p2YmRrTWJNWmVIUA0KLURuY0xLdmJkRXZZcFBtS0YNCi1EbmNMS3ZiZEpUWkJUTllNDQotRU9iamp2YmRJSEd5eHhZSA0KLUVPY0tqdmJkcmFlbUxma1oNCi1FT2NLanZiZE1wWVJWbWdUDQotRG5jS2p2YmR4WmdmRnhFcg0KLURuYmtLdmJkcHhvSUdwY3gNCi1FUENrS3ZiZGtJR2xHRm5MDQotRG9ES2p2YmRVc2xzZWxWag0KLURuYmpqdmJkWm5uSkVkeksNCi1EbmNMS3ZiZGVoTFZyT1JIDQotRG9Damp2YmR5U21obHFiSA0KLURvRExLdmJkQURTWGl5aHANCi1Eb0RLanZiZFp0SkpaRHJuDQotRG9Damp2YmRlenZaRWlVWA0KLUVPY0xLdmJkcVR0SFNSa1UNCi1FUERLanZiZFZneFdYZ1l6DQotRG9Damp2YmRHWlV1QkR3Yg0KLURuY0xLdmJkaHpVZWtwbkcNCi1FUENqanZiZFp4Y2luRE1TDQotRVBDa0t2YmRPRkVUaGlMRQ0KLURvRExLdmJkaHpWR0xxT0cNCi1FT2JqanZiZGt5U3FyeUd0DQotRG9ES2p2YmRtcFp5VmtZYg0KLURvQ2pqdmJkbkhGWU1uR3kNCi1FT2JrS3ZiZFJvdEdqRmN3DQotRVBES2p2YmRqYmxLcGdVZw0KLUVPY0xLdmJkV1dpWVZkRkgNCi1Eb0RMS3ZiZHRiY1ZYVm9QDQotRVBETEt2YmRxcXRrT0xBbQ0KLUVQRExLdmJkbVJ5VXlzRUoNCi1EbmJrS3ZiZHhuU2hZVEpEDQotRG9ETEt2YmRHS2VTYmhNdQ0KLURvQ2tLdmJkanV3T0RiWHcNCi1EbmNMS3ZiZGFNa0NTdU1nDQotRG5jS2p2YmR0YmNVdnVubw0KLURuYmpqdmJkaVZaZVdxdGINCi1Eb0NqanZiZExCS2dOQnhSDQotRU9ia0t2YmRsWlNxcnhnVQ0KLUVQQ2tLdmJkVUx1bmFXT2kNCi1Eb0NrS3ZiZHd6SUdHWUVyDQotRVBDa0t2YmRuSEV4Tk9IWg0KLUVPYmpqdmJkcHlPZ2ZxRVkNCi1EbmJqanZiZHBlZEZVV0FoDQotRG9Da0t2YmRoYW9ERlhRcQ0KLURuYmtLdmJkWXFNZGhsZVINCi1EbmJqanZiZHNaa3BTYUlPDQotRVBES2p2YmRKY0picUpieA0KLUVPYmpqdmJkZWhLdlJtcUgNCi1FT2NMS3ZiZG1JZFVSVlNCDQotRVBETEt2YmR2T3N6cUtvVQ0KLUVPY0xLdmJkWmlzSVFHYkcNCi1EbmJqanZiZEZ5VlVhRHdiDQotRVBDamp2YmRUQUVpSUJvRQ0KLURuY0xLdmJkUmtaRnRnS3MNCi1FT2NMS3ZiZHpkeW56ZHlwDQotRU9jTEt2YmRuVXR5a0tTRw0KLURvREtqdmJkWlFtRWhsZHENCi1FT2NLanZiZG5Cald4T25WDQotRVBDa0t2YmRxdnBMYmlaUg0KLURvREtqdmJkcnlrb3NCSU8NCi1FT2NMS3ZiZEJpS2JMSkdLDQotRVBETEt2YmRCdnpjaUZQdg0KLURvQ2pqdmJkZW1Gd0dsaWsNCi1FUERMS3ZiZHFUc2ZxcWp0DQotRG5jTEt2YmRwdFVIUnJMVQ0KLUVPYmtLdmJkYlViR3dqc2gNCi1Eb0NrS3ZiZEhmZnl5WHdnDQotRVBDamp2YmRnR01abkhIQQ0KLUVQREtqdmJkRmVqUm1oc3ENCi1Eb0NrS3ZiZFF2bWRDa2djDQotRG5jTEt2YmR5TnNIeFNoYw0KLURvQ2tLdmJkckRlSXBPV0INCi1FT2JrS3ZiZFl6Y0dSaXV5DQotRG5jS2p2YmRNb3dxV05mcw0KLURvRExLdmJkYnNETFRjakINCi1FUENrS3ZiZFpRbUVpTkVxDQotRU9iamp2YmROUHdxV05mcw0KLURvRExLdmJkZGVPckJ3REsNCi1FT2JrS3ZiZHJOWml4a2dpDQotRG9ES2p2YmR0bFh2YVVCWA0KLURuY0tqdmJkdHVuWUtSVEENCi1FT2NMS3ZiZGZTQld6a2NQDQotRU9iamp2YmRWQWJSVFFyWg0KLURuYmpqdmJkY0pOS0xGdngNCi1EbmNLanZiZHNzUnNZeWVEDQotRG9ETEt2YmRxVHNnU1NMVQ0KLUVQQ2tLdmJkTW93cVZtZ1QNCi1Eb0NqanZiZERuYmpqdmJkDQotRVBDa0t2YmRsaGRVUlVxYQ0KLURuY0tqdmJkcXJWTE9MQW0NCi1Eb0RLanZiZE5IRFFOUVVrDQotRVBDa0t2YmRYc0xhTXRPeA0KLUVQQ2tLdmJkUm9zZ0pmRHcNCi1EbmNMS3ZiZEtWdUZjZGdKDQotRG9Damp2YmRHR0tSbkl0Ug0KLURuYmtLdmJkZUVuckNXY0sNCi1FUERMS3ZiZGxaU3JUWWdVDQotRVBDamp2YmR0U3JUWXllRA0KLURvQ2tLdmJkWmlzSHBIQ0cNCi1EbmJqanZiZGJyYmtVRGlhDQotRG5ia0t2YmRoZmljWXZLVg0KLUVPY0tqdmJkc0JmTWxITFoNCi1Eb0RLanZiZEJkUUJWak5HDQotRG5ia0t2YmRUdkxwS1VBcQ0KLURvQ2pqdmJkemFBUEdnQ00NCi1FT2JqanZiZGlWWmVXclZDDQotRVBDamp2YmRac2hpWWNybg0KLUVPYmpqdmJkUk5YYlluVXoNCi1FT2JrS3ZiZEJjcEJXSmxmDQotRG5jS2p2YmR0YmNVdnVvUA0KLURvQ2tLdmJkbWZlWG1OZ1oNCi1EbmNMS3ZiZGJQZmdFTHpkDQotRG5jS2p2YmRac2hpWWRTbg0KLUVPYmtLdmJkRGpIaXV3akENCi1Eb0RMS3ZiZGZJS3ZSblJIDQotRG5iamp2YmRpTGVEbXRjWg0KLURvRExLdmJkUXdOY2JsSUQNCi1FT2JrS3ZiZG1SeVV6U2RKDQotRG5ia0t2YmRuSEZZTW5IWg0KLUVPY0xLdmJkZkhqdlNPUkgNCi1EbmNMS3ZiZGxaU3JTeUhVDQotRU9ia0t2YmR0U3JTeHpGRA0KLUVPYmpqdmJkWnlFS05jTHINCi1FT2JrS3ZiZFJrWWV1SExUDQotRU9jS2p2YmRUa3VvQXVvSg0KLURuYmpqdmJkRVBES2tYQ2QNCi1FUENrS3ZiZG5DSndYb09WDQotRU9iamp2YmR4cm1pTXFiSA0KLURvRExLdmJkUmFjZU1JeUwNCi1FUERLanZiZFJvc2dLRmRYDQotRG9Damp2YmR6b1FRZURNWQ0KLURuY0tqdmJkWnlFSm1jTVMNCi1Eb0RMS3ZiZE9GRHNoaUxFDQotRVBES2p2YmRTUVVHaWVkWA0KLUVQQ2tLdmJkVEl5alJBQWwNCi1FT2JqanZiZHhVbUZSWWtuDQotRG5jS2p2YmRtcFp5V0xZYg0KLURvQ2tLdmJkeWdaTUFORXcNCi1Eb0RMS3ZiZGh1WmVXcXVDDQotRU9ia0t2YmRGeVV1QWN4Qw0KLURvQ2tLdmJkaUNQQ2VYUXENCi1EbmNLanZiZHNDRmxrZmtaDQotRVBDamp2YmROUHdwdk9IVA0KLURvQ2pqdmJkU1B0R2pHRHcNCi1EbmNMS3ZiZEFNaFpTdnl4DQotRVBDa0t2YmRXWEpZV0RkZw0KLUVQREtqdmJkYW9nSERremQNCi1Eb0RMS3ZiZFJvc2dLRmN3DQotRVBETEt2YmRyUnRqbkthTg0KLURuY0tqdmJkdkJFWlNvRWgNCi1Eb0RMS3ZiZG1halhZT211DQotRG5iamp2YmRmTkZ3SE1qTA0KLUVQQ2tLdmJkZXp1eUVodFgNCi1Eb0NrS3ZiZEhmZnpaWVlIDQotRVBDa0t2YmR2QWRZc09kaA0KLUVQQ2pqdmJkaGxGRG5WRFoNCi1EbmNLanZiZGJpTktMRnZ4DQotRG9ETEt2YmRNSWFsUXhBUw0KLUVQRExLdmJkR2NrV0tCaksNCi1FT2NLanZiZHZPc3pxS250DQotRG9Da0t2YmRyYWVsa2dLeQ0KLUVPY0tqdmJkTWdDb21QdGsNCi1Eb0RLanZiZE9Tc3VnRlZRDQotRG9Da0t2YmR5TnJoWVRKRA0KLUVQQ2pqdmJkdUREVlhXT28NCi1EbmNMS3ZiZGlDUERGWFJSDQotRG5jTEt2YmRpR2lieVdLVg0KLUVPY0xLdmJkZk5HWEhOSmsNCi1FT2JrS3ZiZEJoamFrSWVqDQotRVBDamp2YmR4bXJoWHJpRA0KLURuYmtLdmJkSmJpYnFLRFkNCi1EbmJrS3ZiZFNDRGRraHlMDQotRVBDamp2YmRHRmlyT0lzcQ0KLURuYmtLdmJkS1Z0ZkRlSEoNCi1Eb0RLanZiZEdLZHJiaE11DQotRG5jTEt2YmRaTHJFVG1sTg0KLUVPYmpqdmJkanV2bWNiWHcNCi1EbmNLanZiZFFkREFwUkRyDQotRU9ia0t2YmRlQVRwbHdqRw0KLURvQ2pqdmJkWk1SZFVOa20NCi1Eb0RLanZiZFRxUW9WVklODQotRVBDa0t2YmRPVFR1ZmVWUQ0KLUVQREtqdmJkV1JuWGFkbEQNCi1EbmNLanZiZFpzaUpZZFNuDQotRG9Da0t2YmRaTHJEc25NTg0KLURvREtqdmJkRUtIaXV3akENCi1FUERMS3ZiZG5CaXZ4UE9WDQotRVBDamp2YmRkZG5yQ1diag0KLUVPY0xLdmJkcHNzZ1NSa1UNCi1FUENqanZiZHpkek96ZHlwDQotRVBDamp2YmRaeGNpbkNsUw0KLURvREtqdmJkdkFjeVNvRWgNCi1EbmJqanZiZFdIeFdYZnh6DQotRG9ETEt2YmRDV3pkSkVwVw0KLURvQ2pqdmJkZWhMVnFuUkgNCi1FT2JqanZiZEVYeExzdFRsDQotRU9iamp2YmRrTWFrekVmbw0KLUVQQ2tLdmJkS2FLZmxiWHENCi1FUERMS3ZiZGlqRmdqTllTDQotRG9Damp2YmRac2lJeGRTbg0KLURuY0tqdmJkZUFUcU5YaWYNCi1EbmNMS3ZiZHpvUHFFYmxZDQotRU9ia0t2YmRMQWpnTkJ3cQ0KLURuY0tqdmJkVXhnc3lrUE8NCi1Eb0RLanZiZGFvZ0dja3pkDQotRG5jS2p2YmRGVnhwUG1KZQ0KLUVPY0xLdmJkWkxyRHRObE4NCi1FT2JqanZiZFlOcUFYdVdVDQotRG9Da0t2YmRFWVlMc3RVTQ0KLUVPYmpqdmJkZUZQU0J3REsNCi1EbmNLanZiZGVQRXNLc3NyDQotRG5jS2p2YmRaalRIb2dDRw0KLUVQQ2tLdmJkaktHSGpOWHINCi1Eb0NrS3ZiZE5ydFZnRlZRDQotRG5jTEt2YmRhTWphcnVOSA0KLURvRExLdmJkd2p3RUh6ekcNCi1FT2NMS3ZiZFRJekpxQUJNDQotRG9ETEt2YmRsaUVUcVZTQg0KLURvRExLdmJkTnJ0VmZkdHANCi1EbmJqanZiZFp4ZEtOY01TDQotRVBETEt2YmRiVWFmeEtzaA0KLURvQ2tLdmJkVnJOeENGTUQNCi1Eb0NrS3ZiZHhaZ2VmWUVyDQotRG9ES2p2YmRZVExhTXNvWQ0KLURuY0tqdmJkZUFVUk13aWYNCi1FT2NMS3ZiZE5HY1BtUVZMDQotRVBES2p2YmRxY2VKUU9WYQ0KLURuY0tqdmJkUm90SEtHRVgNCi1Eb0NqanZiZHdOV0FNZEZODQotRVBDa0t2YmRGeVZWQWN3Yg0KLURvREtqdmJkbW96WXZLeUMNCi1EbmNLanZiZFNQc2dKZWN3DQotRVBES2p2YmRadEpKWWNybg0KLUVPY0xLdmJkR2NrV0tDSmoNCi1Eb0RLanZiZGt4cnJTeGZ0DQotRG5iamp2YmRSYkRkbEl4aw0KLURuY0tqdmJkeVlKSmJQeWsNCi1EbmJqanZiZGhnSmNZdktWDQotRU9ia0t2YmRqY0xqcUhVZw0KLUVPYmtLdmJkaGdKYnlXS1YNCi1FT2JqanZiZHJvdlBLQ3ZHDQotRG9Da0t2YmRiQlZkZXBRWA0KLURuYmpqdmJkVVZrb2pUYVINCi1FUENrS3ZiZGJVYWdZTFVJDQotRG9ETEt2YmRwdFVHcXFrVQ0KLURvQ2pqdmJkeVROaGxxYWcNCi1EbmNLanZiZEVZWGxUc3NsDQotRVBDa0t2YmRYRnh5dEFPcw0KLUVPY0xLdmJkTmRjdEloa0UNCi1FUERMS3ZiZGtETUxSR3VIDQotRVBETEt2YmREaWhKdXhLQQ0KLUVPY0xLdmJkcmFmTk1ITFoNCi1FUERMS3ZiZGJLbEZvT0RBDQotRG5jTEt2YmRaTHFjc25NTg0KLURuYmpqdmJkem5wUkZETHgNCi1EbmNMS3ZiZHppdVFQZFN0DQotRVBDa0t2YmRicmNLc2RLQg0KLURuY0xLdmJkYU1rQ1RVbUgNCi1FUERMS3ZiZFlrcWRVT0xtDQotRG9ES2p2YmRqaEhMZkdOaw0KLURvRExLdmJkWk1TRHRObE4NCi1EbmJqanZiZFpqVEhwSENHDQotRG9Da0t2YmRlbUZ2Z05LTA0KLURuY0tqdmJkclJ0a09MQW0NCi1FUENqanZiZHlOcmhYc0ljDQotRU9iamp2YmRnUGF6d0R3aA0KLURvREtqdmJkUkRjQW9xRHINCi1Eb0RLanZiZHZ2a2FXQldWDQotRU9jS2p2YmRaUk1kaU5GUg0KLUVQQ2tLdmJkZGVQUmF3Q2oNCi1Eb0NrS3ZiZEhEanZLQmlqDQotRG5ia0t2YmRaaXJncEdiRw0KLUVPY0tqdmJkaGJQQ2VXcVINCi1EbmJrS3ZiZE5Qd3B2TmZzDQotRVBDamp2YmRaaXJoUGZiRw0KLUVPY0xLdmJkSUdnWnh3eEgNCi1FUENrS3ZiZHJ5a29zQkhuDQotRG9ES2p2YmR4blRJWVNoYw0KLURuYmpqdmJkTnNUdkdkdVENCi1EbmNMS3ZiZEJjcEF2SmxmDQotRG5iamp2YmRscXh0eXNEaQ0KLURvQ2tLdmJkT0VkVGlJamQNCi1EbmNLanZiZGZIa1ZyT1FnDQotRG9Da0t2YmRpSEtEWXZLVg0KLURvREtqdmJkT1RVVmdGVXANCi1FT2JrS3ZiZGFhVmRmUG93DQotRG5jTEt2YmRaSFhFQVBUSg0KLURuYmtLdmJka0lITGVmTmsNCi1EbmJrS3ZiZGpFamZ1UEFPDQotRU9iamp2YmRodHpGV3F0Yg0KLURvRExLdmJkU1FUZmpGZFgNCi1EbmNMS3ZiZEhFS3ZLQmpLDQotRG5jTEt2YmRIRGtWakJpag0KLUVQREtqdmJkUnBUZmllY3cNCi1EbmJrS3ZiZGlCbmNFd1FxDQotRU9ia0t2YmRSYWRFa2h5TA0KLUVQQ2tLdmJkZXp2WWRpVHcNCi1FT2NLanZiZGFNamFzVWxnDQotRU9ia0t2YmRjelpQd3lRYg0KLUVQQ2pqdmJkVHZNUUp0QXENCi1FUENqanZiZEpYdENJTVJRDQotRG9ETEt2YmRrRE1LcGZ0Zw0KLUVQQ2pqdmJkaVZaZHZxdGINCi1EbmJrS3ZiZHR1blhpcHNBDQotRG9Damp2YmRqSmVoS05ZUw0KLURuYmpqdmJkSnZVZWNlSEoNCi1Eb0RLanZiZEtSWmRvRm1lDQotRG5jTEt2YmRKY0tDcGpDeA0KLUVQREtqdmJkbWJLWFlQTnUNCi1EbmJqanZiZGtJSExlZW5MDQotRVBETEt2YmROUHhRdW5IVA0KLURuYmpqdmJkVXRNdEZrdksNCi1FUERMS3ZiZHNQdlBKY1dHDQotRU9iamp2YmRNUnZselZReg0KLURvQ2tLdmJkc1FXT2pEV0cNCi1EbmJqanZiZFhHWlp0QVBUDQotRG5iamp2YmR1bnN6cGtPdA0KLURuY0tqdmJkeFpoRmZYZHINCi1EbmJqanZiZFJ6SmdzQ3ZBDQotRVBDa0t2YmRTQ0RkbEl4aw0KLUVQREtqdmJkUkVEQlBxRVMNCi1EbmJqanZiZEJ2emRJZG92DQotRG9ETEt2YmRTTFlldGZrVA0KLUVPYmpqdmJkS1dWR0RlSEoNCi1Eb0NqanZiZHVERFV2dW9QDQotRU9jTEt2YmRXSVlXWGdZeg0KLURvQ2pqdmJkYmhtSmpmV3gNCi1FUERLanZiZEl4VUNJTHBwDQotRU9jTEt2YmRlWHpUc3JGeg0KLUVQRExLdmJkc0JlbUxnS3kNCi1FUENrS3ZiZHpqVlBwRHJ0DQotRG5jTEt2YmRaeURpbWJrcg0KLURuYmpqdmJkUk5ZQnhtdHoNCi1FUENrS3ZiZHZPc3pwa1BVDQotRU9ia0t2YmRTUVRmaWVkWA0KLURuY0tqdmJkWlJORklsZHENCi1Eb0RLanZiZGJobGlqZlhZDQotRU9ia0t2YmRFenNwZUxjSg0KLUVQQ2pqdmJkS0NpY1JKYngNCi1FT2NMS3ZiZE9ZT3V6Y25VDQotRG9Da0t2YmRoa2RkT1ZEWg0KLURuY0tqdmJkSXhUYWhNUXANCi1FT2NMS3ZiZHd5Z2VleEZTDQotRVBDamp2YmRLUlplT2VtZQ0KLUVQRExLdmJkZ1BhenZjeEkNCi1EbmNLanZiZGZORndITWlrDQotRU9jTEt2YmR0a3d2YVRhWA0KLUVPYmpqdmJkVVJRbnVWSU4NCi1EbmJrS3ZiZGlCbmNGV3FSDQotRG5jTEt2YmRhTWtDU3RtSA0KLUVQQ2pqdmJkWmpTZ29nQmYNCi1Eb0RLanZiZE1vd3B2T0dzDQotRVBDa0t2YmRzcnFzWlpkYw0KLURuYmtLdmJkUnBUZmpGZFgNCi1FT2NLanZiZGFNamJUVk1nDQotRU9jTEt2YmRtZ0V4TW1meQ0KLURuY0tqdmJkQ0pMQ0xKR0sNCi1Eb0NrS3ZiZE5lRHNoaUtkDQotRG5ia0t2YmRHTEZTYmdtVg0KLUVPYmpqdmJkTXRyckxOQVgNCi1FT2NLanZiZHBlZEVzdkFoDQotRG9ES2p2YmRjeXhwWHlRYg0KLUVPYmtLdmJkeFpoR0dYZHINCi1Eb0NrS3ZiZEV6dFFkbENpDQotRU9ia0t2YmRpakZnaWx4Uw0KLUVQRExLdmJka0hnTUZlbkwNCi1FT2NMS3ZiZGxyWXR5c0RpDQotRG5jTEt2YmRqY0xqcGdWSA0KLURvQ2pqdmJkblZWWmtLUmYNCi1FUERLanZiZEZlaXJOaHNxDQotRG5ia0t2YmRqYmxMUkd1SA0KLUVQRExLdmJkdFRTVFpaZUQNCi1Eb0RLanZiZFZCQ1JUUlNaDQotRG5jS2p2YmRUWUxNTnpqeA0KLURvQ2tLdmJkRXp0UWRrY0oNCi1FT2JqanZiZHBmRUZUdWFJDQotRG5jTEt2YmRZU2xBbVVQWQ0KLURuY0tqdmJkWXBsZGlORlINCi1EbmNMS3ZiZFdYSXd2RGRnDQotRG9ETEt2YmRlWHlzc3JGeg0KLURuY0xLdmJkcWRFaG9uVmENCi1FT2NMS3ZiZE5RWVJWbkdzDQotRU9iamp2YmRScFRnS0dEdw0KLURvREtqdmJkYXVDSFhrVUkNCi1Eb0RMS3ZiZGhmaWNaVml1DQotRG5iamp2YmR6b1BwZUNreA0KLURvQ2tLdmJkSllUYWdsUXANCi1Eb0RLanZiZG5CaXdZUE51DQotRU9jTEt2YmRNSkNMcVlBUw0KLUVQQ2pqdmJkWWtyRHNuTU4NCi1FUENrS3ZiZGVoS3ZSbXFIDQotRU9ia0t2YmRWcW14Q0ZNRA0KLURuY0tqdmJkckRlSlBtdkINCi1FUERMS3ZiZHphQU9nSENNDQotRU9jTEt2YmROUHhRdk5mcw0KLURuY0xLdmJkRlZ4b3BNaWUNCi1FUERLanZiZGdRQnp3RHdoDQotRU9iamp2YmRUZnpta3Z2Rg0KLUVQRExLdmJkVWFCcHJwcXkNCi1Eb0NrS3ZiZG5HZHhOT0d5DQotRG5jTEt2YmRmSUt1ck9RZw0KLUVQQ2tLdmJkS0RKY1JLQ3gNCi1FUENqanZiZG1KRVVRdVNCDQotRG5jTEt2YmRyYWZOTUdqeQ0KLUVPY0tqdmJkWnhkS05ia3INCi1EbmJrS3ZiZEptQUR6R3VCDQotRVBDamp2YmRRdm1kRE1JRA0KLURuYmtLdmJkZW1HV2dOSmsNCi1EbmNLanZiZHlmeGxBTWR3DQotRVBDa0t2YmRkdEFVQVROVw0KLURuY0tqdmJkY2FzTXJBVG0NCi1Eb0RLanZiZFZoWVZ4SFl6DQotRVBDamp2YmRoeXVGa3BtZg0KLURvRExLdmJkY2JUTXJBVG0NCi1FUENrS3ZiZElMYXpuWFJMDQotRG9ES2p2YmRSRGJhUVFjcg0KLURuY0tqdmJkaWpGZ2pOWVMNCi1FT2JrS3ZiZElNQnpuWFJMDQotRVBDamp2YmR4Vk5FcHlMbg0KLURuY0xLdmJkWWtxY3RPTU4NCi1FT2NLanZiZHhybWlOU0JnDQotRVBETEt2YmR0VFJzWXpGRA0KLUVPY0tqdmJkempWUVFEc1UNCi1FUENqanZiZFpNUmN0TmxODQotRG5jS2p2YmRYcmxBbVRueA0KLUVPY0xLdmJkYlBnR2RMemQNCi1FUERMS3ZiZEZmSnFtaHNxDQotRU9jTEt2YmR5emRtcWdpSQ0KLURvQ2pqdmJkdUNidHZ1b1ANCi1EbmNMS3ZiZE5HY1BscFZMDQotRVBDamp2YmRHQk9weUp6bQ0KLUVQQ2tLdmJkUkRjQlBwY3INCi1FT2NMS3ZiZFJiRUZMaHlMDQotRU9jTEt2YmRlUEZUTFRzcg0KLUVPYmtLdmJkY1RDa1VEakINCi1EbmJrS3ZiZHJXb2tiaHhxDQotRG5jTEt2YmRxVVRmclJqdA0KLUVPY0xLdmJkUnlpaFREV0ENCi1FT2JrS3ZiZHB4bmhIUWRZDQotRG5ia0t2YmRyU1VrT0thTg0KLURvQ2pqdmJkSUdnWnlZWGcNCi1Eb0RMS3ZiZE1vd3FXTmZzDQotRG9ES2p2YmRVeGd0WmtPbg0KLUVPYmpqdmJkVXROVGVsVmoNCi1FT2JqanZiZGxxeHR5cmRKDQotRG5jS2p2YmRrVnZuRGJZWA0KLUVPYmpqdmJkZVBGVEtzc3INCi1Eb0NrS3ZiZE11U3JMTkFYDQotRU9jTEt2YmRuUVp5V0xaQw0KLURvREtqdmJkaGdKY1l1alYNCi1Eb0RMS3ZiZGFNamFzVk1nDQotRVBDamp2YmRjU2NMVURpYQ0KLURuYmpqdmJkYktrZW9OY0ENCi1EbmJrS3ZiZGZwQnp3RVlJDQotRG9Da0t2YmRCaGtCamhlag0KLURuYmpqdmJka0RNTFJHdGcNCi1FT2JrS3ZiZGVBVHFOWGpHDQotRU9jS2p2YmRGa0ZTYmdsdQ0KLURuYmpqdmJkem5wUWRjTVkNCi1EbmNMS3ZiZElpZEFKcEhFDQotRG9Damp2YmRMWlFpcnp1Rw0KLURuYmpqdmJkempVb3BEcnQNCi1FT2NMS3ZiZG5VdVpqaXFmDQotRG9ETEt2YmR3eWhGZXdlUw0KLURvQ2tLdmJkYW9mZmNremQNCi1FT2JrS3ZiZHphQVBHZ0NNDQotRU9ia0t2YmRFenNwZGtjSg0KLURuYmpqdmJkRGpIaXV4S0ENCi1EbmJrS3ZiZFZxbXhCZGxEDQotRU9jTEt2YmRySkFLRk1uZQ0KLUVPY0tqdmJkWmpTZ29mYkcNCi1FUENqanZiZGZNZldnTkprDQotRG9Da0t2YmRUdWtwSnNhUg0KLURvQ2pqdmJkeVNtaU5TQmcNCi1EbmJrS3ZiZHpHeU1BTkZYDQotRU9ia0t2YmR1V054S1FzQQ0KLURvREtqdmJkUmtaRnVITFQNCi1EbmNMS3ZiZGJLbEdPbWNBDQotRG5jTEt2YmR5TnNJWHNKRA0KLURuYmtLdmJkTXBYcVdOZnMNCi1Eb0NrS3ZiZEhFS3VqQmpLDQotRG5jTEt2YmREeFhrdFRzbA0KLUVQQ2tLdmJkQUNyWUp5aVENCi1FT2NLanZiZHFVVUhTUmp0DQotRG9ETEt2YmRPRkRzaUpMRQ0KLUVPYmtLdmJkcmJHTWxHankNCi1Eb0NqanZiZGpibEtwZ1VnDQotRVBDa0t2YmRpSEpjWXVqVg0KLUVQREtqdmJkckRlSlFOdkINCi1FUERMS3ZiZGJyYmtUZEphDQotRG5ia0t2YmROZUR0SWhrRQ0KLURuYmtLdmJkY0pOS0tldngNCi1FUENqanZiZHhWTkZReGtuDQotRU9iamp2YmRoeXVHTHFPRw0KLUVPY0tqdmJkcmFmTWtma1oNCi1FT2JrS3ZiZFJrWWV0Z0tzDQotRG5iamp2YmRVV0xvaXRCUg0KLURvQ2pqdmJkUXZtY2JsSUQNCi1FT2NMS3ZiZERvRExMWENkDQotRG5jTEt2YmR6UlBNaUp3QQ0KLURvQ2tLdmJkc1prb3JhSG4NCi1Eb0RLanZiZGtIZ01HRm5MDQotRU9ia0t2YmRyYkZtTUdqeQ0KLURuYmtLdmJkUlduRGJraEQNCi1FUERLanZiZEpiaWNSSmJ4DQotRG5jS2p2YmRHWlV1QWN3Yg0KLURvQ2pqdmJkbWZkd21OZnkNCi1Eb0RLanZiZEJkUUF1ak5HDQotRVBETEt2YmR3V2xBdWFWdQ0KLURuY0xLdmJkeG1yZ3hTaUQNCi1Eb0NrS3ZiZFVzbVVGa3VqDQotRU9jS2p2YmRjVERLc2RLQg0KLURuYmpqdmJkamNMa1JIVkgNCi1Eb0RLanZiZGJpTWlqZXdZDQotRVBDamp2YmRQeU5BSFNySw0KLURuYmpqdmJkRmtFcmNJTlYNCi1FUERLanZiZFpRbGRobUZSDQotRVBES2p2YmRUSlpqUkFCTQ0KLUVPY0tqdmJkS2FLZ01heFINCi1Eb0NqanZiZHd6SGVmWUVyDQotRG9ETEt2YmREd3hMdFVVTQ0KLURvQ2tLdmJkZklMV1JtcGcNCi1Eb0NrS3ZiZFJ5aWhUQ3ZBDQotRG9ES2p2YmRTUVVHakZjdw0KLURvQ2pqdmJkRVlYa3RVVGwNCi1FUENqanZiZG96bkVLeFBBDQotRVBETEt2YmRTaVppcUFCTQ0KLUVPYmtLdmJkVlVOVUZrdWoNCi1EbmNLanZiZE1mYnBOUVVrDQotRG5jTEt2YmRFdllvcE1pZQ0KLURuYmpqdmJkTW93cHZOZ1QNCi1EbmNMS3ZiZEtqYUh2QUtaDQotRG9ES2p2YmRxbVpqWk1JSg0KLUVPYmpqdmJkR2NqdWliSmoNCi1Eb0RMS3ZiZHVMd3ZhVGFYDQotRG9Da0t2YmRIZ0haeVlZSA0KLUVPYmpqdmJkRU9jS2p3Q2QNCi1FUENqanZiZEdja1dLQ0tLDQotRU9ia0t2YmRFdXlRUU1pZQ0KLURuYmpqdmJkSGdHelpZWUgNCi1FT2JqanZiZFZVTXNla3VqDQotRU9ia0t2YmRXV2lYdWNkZw0KLUVQREtqdmJkUlduRUNrZ2MNCi1FUERLanZiZHhaZ2VmWUZTDQotRG5ia0t2YmRFdXlQb21LRg0KLUVQQ2pqdmJkZGVQU0NYQ2oNCi1Eb0RLanZiZFVzbHRGbFdLDQotRG5ia0t2YmRic0RLdEVKYQ0KLUVPYmtLdmJkbW95eVdMWkMNCi1Eb0RLanZiZFNDRGVNSlpMDQotRG5ia0t2YmR3dGxlUllrbg0KLUVQRExLdmJkSnB6RW5mTmUNCi1EbmNLanZiZFppc0lRR2JHDQotRG9Damp2YmRpVXpFd1J0Yg0KLURuY0tqdmJkcm91bmljVmYNCi1EbmNMS3ZiZG1JZFVSVlJhDQotRG9ES2p2YmRZU2xCTlVQWQ0KLURuYmpqdmJkS0RLRFFpYngNCi1Eb0RMS3ZiZG5DSnZ3b09WDQotRVBES2p2YmRnRmxabWZnQQ0KLURvREtqdmJkVHVrb2pUYVINCi1EbmJqanZiZFZBYlFzUXF5DQotRU9jTEt2YmR0QUhSSUFCUw0KLURuYmpqdmJkbWJKdndublYNCi1FT2NLanZiZHZCRHhybmVJDQotRG5iamp2YmRlSmlyV1V6bg0KLURuYmpqdmJkS2VlZ2FhUXUNCi1EbmJqanZiZHpRb01pS1hBDQotRG5iamp2YmR4d2lKYlB5aw0KLUVQRExLdmJkS05BRHpIVWENCi1Eb0NrS3ZiZEFOSHlUWFp4DQotRU9ia0t2YmR4TFhEZ3p5Zg0KLUVPY0tqdmJkcHhvSGdRY3gNCi1EbmNLanZiZExCS2ZsYXdxDQotRVBES2p2YmRoYW5iZHdRcQ0KLURuYmtLdmJkRUFTSWx5dncNCi1FUENrS3ZiZHd6SGZHWUVyDQotRU9jTEt2YmRxWlBIZ1FkWQ0KLUVQREtqdmJkcVR0R3FxanQNCi1Eb0NqanZiZER4WGtzc3NsDQotRG9ES2p2YmRRbHdheU50eg0KLUVPY0tqdmJkVHZMb2l0QXENCi1EbmJrS3ZiZGlyemhzS2l6DQotRVBES2p2YmR5emVPUmdoaA0KLURuY0xLdmJkbUpEc3FWUmENCi1EbmNMS3ZiZEtlZklDQXFWDQotRU9jTEt2YmRabm1oZUZaag0KLURvREtqdmJkSXhVQ0lMcHANCi1EbmNMS3ZiZHhzT0lsckJnDQotRG9Da0t2YmRpVlpkdnF0Yg0KLUVQRExLdmJkYkJXRWZRUHcNCi1FT2JrS3ZiZHNDRmxsR2taDQotRU9ia0t2YmROZGN0SWlLZA0KLUVPYmpqdmJkb3ptY2p3b0ENCi1FUERMS3ZiZGxoZFRxVXFhDQotRU9jS2p2YmRiVWFnWUtzaA0KLURuYmtLdmJkSnB5ZG9HT0YNCi1EbmJrS3ZiZG5HZVlNbWZ5DQotRG5jS2p2YmR0bFh3QlVBdw0KLURuY0tqdmJkcWlBSmRsbmUNCi1FUENrS3ZiZE1JYWtxWUFTDQotRG5ia0t2YmRDV3pjaGRvdg0KLUVPYmtLdmJkZWxld0hOSmsNCi1FUENqanZiZEZwQVN2Z0Z5DQotRG9ETEt2YmRWck54Q0ZNRA0KLURuYmtLdmJkTXBZUXZOZnMNCi1FUENrS3ZiZEVPYmtLd0RFDQotRVBETEt2YmRIRGp1aWJKag0KLUVQQ2pqdmJkS2FMSE1heFINCi1Eb0RLanZiZGFrTGZPbWNBDQotRVBETEt2YmRNZ0RRTlFWTA0KLURvQ2pqdmJkRXZZcFFOS0YNCi1FUERLanZiZHJFRWhwT1ZhDQotRU9jTEt2YmRPRkRzaUlqZA0KLURuY0tqdmJkdFRTVFl5ZUQNCi1FT2JqanZiZFF2bkRibEhjDQotRG9ES2p2YmRWck53YkVsRA0KLUVQQ2pqdmJkWk1SZFVOa20NCi1Eb0NqanZiZGhmaWJ4dWpWDQotRG5iamp2YmRZcG1GSk1lUg0KLURuY0xLdmJkRGloS1Z4S0ENCi1Eb0NqanZiZHJOWmpZa2dpDQotRU9jTEt2YmRZcU5GSW1FcQ0KLURvRExLdmJkSmJqRFFqQ3gNCi1Eb0RLanZiZHd5Z2VmWGVTDQotRG5jTEt2YmRVeUhzeWtQTw0KLURuY0xLdmJkSlN5QlRNeE0NCi1FUERLanZiZGNJbUtLZlhZDQotRVBDamp2YmRkbmRzTFR0Uw0KLURvRExLdmJkRUFTSWx6V3cNCi1FT2JqanZiZHJ5bFFUQWduDQotRG9ES2p2YmRGa0ZUQ2hNdQ0KLURuY0xLdmJkVWFDUXJwcloNCi1EbmJqanZiZE9GRVRoaGpkDQotRU9iamp2YmRsWXNScnhnVQ0KLUVQQ2tLdmJkbkdlWU5PR3kNCi1Eb0RLanZiZHd5Z2VmWUVyDQotRG9Damp2YmRHY2tWaWFqSw0KLURvREtqdmJkU1pqSVREV0ENCi1FT2JqanZiZGtXWE5kQ1h3DQotRVBDa0t2YmRLamFJV0FKeQ0KLUVPYmtLdmJkS2tCSVdBS1oNCi1Eb0RMS3ZiZHB0VGZxckxVDQotRG9ES2p2YmRQeG1BR3NSag0KLUVPYmtLdmJkVHZNUGl0QlINCi1FUENrS3ZiZGVnanZTT1FnDQotRG9ES2p2YmR3TldBTkVFbQ0KLUVPY0xLdmJkUk5YYlltdHoNCi1Eb0RLanZiZEVPY0tqd0RFDQotRVBETEt2YmRmTWZYSE1paw0KLURvQ2tLdmJkV0h3dlhmeHoNCi1FUENqanZiZGVsZldnTktMDQotRVBDamp2YmRxY2RpUU9WYQ0KLURuY0tqdmJka3lUU1RaR3QNCi1Eb0NrS3ZiZGJBdWVGcFB3DQotRU9jS2p2YmRRd05kQ2xIYw0KLURuYmpqdmJkeG1zSVlTaUQNCi1FUERLanZiZENUQWJ0RndTDQotRG5jTEt2YmRKcHpGT2VtZQ0KLUVPY0tqdmJkaVp1R0xxT0cNCi1EbmNLanZiZEthTEhNYXhSDQotRVBETEt2YmRiaU1qTEZ2eA0KLUVQQ2tLdmJkanZYT0RheFgNCi1FT2NMS3ZiZE9BSlNzaXJBDQotRVBES2p2YmRxWW5oSFFkWQ0KLURvQ2tLdmJkRHd3bFR0VU0NCi1EbmJrS3ZiZFJqeGZWSEtzDQotRU9iamp2YmR6alVwUGNydA0KLUVPY0xLdmJkZVVBVUFUTlcNCi1FT2JrS3ZiZFFsd2F4bXR6DQotRU9ia0t2YmRFWHhMdFVVTQ0KLUVPYmtLdmJkWWtyRVRta20NCi1Eb0NrS3ZiZHhtc0h3c0ljDQotRG9ES2p2YmR6alVvb2NydA0KLUVQREtqdmJkcUdFRlR1YUkNCi1FUENqanZiZGJpTWpMR1hZDQotRVBES2p2YmRmcEJ6d0VYaA0KLURuY0tqdmJkWmVZR3poSkMNCi1Eb0NqanZiZEZrRXNDZ2x1DQotRG5jS2p2YmRPRkRzaGhqZA0KLURuY0tqdmJkWk1SY3NuTU4NCi1FUENrS3ZiZHJFRkpQblZhDQotRG9Da0t2YmRjeXlQeFlwYg0KLUVQRExLdmJkaWpHSUtNd3INCi1Eb0NqanZiZGJBdWRlcFFYDQotRG5jTEt2YmRGZWpTT0l0Ug0KLUVPY0tqdmJkU0xaR1ZITFQNCi1FUERLanZiZE1KQmtweEFTDQotRG5jS2p2YmRKWHNhZ2xRcA0KLURuYmtLdmJkamNNTFJIVkgNCi1Eb0NrS3ZiZEZqZVRDZ21WDQotRG5iamp2YmRxVVRmclJrVQ0KLURuYmpqdmJkem5vcUZDa3gNCi1FT2JrS3ZiZFZxbllCZUxjDQotRG9ETEt2YmRhTWpiVFZNZw0KLURvQ2tLdmJkU1FVSEtGZFgNCi1Eb0NqanZiZHJEZGhvbXVhDQotRG5jTEt2YmRjVENqc2RKYQ0KLURvQ2tLdmJkc0NGbGtnS3kNCi1FUENrS3ZiZG1iS1d3bm11DQotRG9Damp2YmRaUW1GSW1FcQ0KLUVQQ2tLdmJkeVhpS0NQekwNCi1FT2NMS3ZiZEtRekVuZW5GDQotRVBDamp2YmRyYkdOTUdqeQ0KLUVQREtqdmJkZ0dNWm5ISEENCi1FT2NMS3ZiZGZIanVxblJIDQotRU9jTEt2YmRGZWlyTmlVUg0KLURvQ2pqdmJkdWFFWlNvRkkNCi1EbmNLanZiZGJBdWRmUG93DQotRG9Da0t2YmRiaU1pa0Z3WQ0KLURvRExLdmJkY3l4cFlZcUMNCi1EbmJqanZiZHB4b0hmcGRZDQotRG5jS2p2YmRxVVRnUnFqdA0KLURvREtqdmJkY0ltS0tmV3gNCi1EbmJqanZiZG1mZVlOTmZ5DQotRVBDamp2YmRJakVBSm9mZA0KLUVPYmpqdmJkTEJLZ05DWHENCi1FT2JqanZiZHVMeFdhVUF3DQotRG5iamp2YmRKVFpCVE5YbA0KLURvQ2tLdmJkdWFEeVRPZUkNCi1FT2NMS3ZiZFV5SVVaa1BPDQotRU9jTEt2YmRkZVBSYXdDag0KLUVQREtqdmJkaGJPYmVXcVINCi1FT2NLanZiZEJkUUF2Sm1HDQotRU9jS2p2YmRrVndPRGF3dw0KLURuYmtLdmJkVVZrb2lzYVINCi1EbmJrS3ZiZE1veFF2TmZzDQotRU9iamp2YmRDSktiTElmSw0KLURuY0tqdmJkWXBtRkpORXENCi1Eb0NqanZiZGpLRmhLTXhTDQotRG5iamp2YmRaTHJFVU5sTg0KLUVQREtqdmJkd3VORlJaTU8NCi1FT2JqanZiZGp1dm5FQ1h3DQotRVBDa0t2YmRsWlRTVFpHdA0KLURvQ2pqdmJkc1FWb0pjV0cNCi1EbmNMS3ZiZG1KRVRxVlNCDQotRG5iamp2YmRqZ2dMZkdPTA0KLUVPYmpqdmJkeHdpS0JwWmsNCi1Eb0RMS3ZiZEtES0NwakRZDQotRVBDamp2YmR6UlBOSWpYQQ0KLURvQ2tLdmJka2FNb05BTEENCi1FUENrS3ZiZGp2V25EYXd3DQotRVBDa0t2YmRTQmNka2laTA0KLURuYmtLdmJkYlViSFhrVUkNCi1FT2NLanZiZFVSUk90dUhtDQotRG5jTEt2YmRKbUFFWmdWQg0KLURvRExLdmJkRHhZTHNzc2wNCi1EbmNLanZiZFdSblhhZGxEDQotRVBDamp2YmRBRFNYaXlocA0KLURuYmtLdmJkTkdjUGxvdUwNCi1EbmJqanZiZEJzQWNUZXZyDQotRU9iamp2YmRXV2h3dkRlSA0KLUVPY0xLdmJkYlVhZnhLc2gNCi1Eb0NrS3ZiZHRjQ3VYV09vDQotRU9jS2p2YmRiS2tlbm5EQQ0KLUVQRExLdmJkR2NqdWpCaksNCi1Eb0RLanZiZFJXbWRETUhjDQotRVBDa0t2YmRtU1pVeXJkSg0KLURvQ2tLdmJkTFpSS1N6dGYNCi1EbmNLanZiZFpRbUZKTkZSDQotRVBETEt2YmRqaEdrZWZOaw0KLURuY0tqdmJkZUFUcG1ZSmYNCi1FUENrS3ZiZERqSGl2WGpBDQotRU9iamp2YmRGeVZWQkVYYg0KLURuY0tqdmJkSUhIWnh4WGcNCi1EbmJqanZiZE1veFF2TmZzDQotRU9iamp2YmRsWXNSc1pHdA0KLUVPY0xLdmJkWkhXZEFQVEoNCi1Eb0NrS3ZiZG96bkRqd29BDQotRU9jTEt2YmRZcG1FaU5FcQ0KLUVPY0xLdmJkZk1mV2dOSmsNCi1EbmJqanZiZGpsYWxaZUdvDQotRVBETEt2YmRWZ3hWeEd4eg0KLURvREtqdmJkWlJNZGlNZVINCi1EbmJrS3ZiZE5zVVZnRlVwDQotRU9iamp2YmROR2NQbVB1TA0KLUVQRExLdmJkclNVam5LYU4NCi1EbmNLanZiZE1nRFBtUVVrDQotRG9ETEt2YmRSa1pHVWZrVA0KLUVPY0xLdmJkcHhvSUdxRHgNCi1Eb0NrS3ZiZFZ3SXhWY2RnDQotRG9ES2p2YmRaUW1GSWxlUg0KLUVQREtqdmJkWnNoaVpEcm4NCi1FUENrS3ZiZEZXWlBwTkplDQotRG5ia0t2YmRjSW1LS2ZYWQ0KLURvQ2tLdmJkaVZaZVdxdGINCi1FUENrS3ZiZGt4c1NTeUhVDQotRU9ia0t2YmRjU2JrVGRLQg0KLUVPY0tqdmJkRnh0dGFFWUMNCi1FUENrS3ZiZGh0ekV3U1ZDDQotRU9jS2p2YmRMQWpnTkJ3cQ0KLURvQ2tLdmJkWmlzSG9mYkcNCi1Eb0RMS3ZiZElzWWFUTllNDQotRVBETEt2YmRBRFJ4SnpJcA0KLURvREtqdmJkVGt1b0F2T2kNCi1FT2NMS3ZiZFpSTWVKTWRxDQotRVBETEt2YmRXV2lYdkRkZw0KLURuYmpqdmJkYnNES3NjakINCi1EbmJrS3ZiZHRsWHdCVUJYDQotRVBDamp2YmRtZ0ZYbG1nWg0KLUVPYmtLdmJkam1CbFplR28NCi1FT2JrS3ZiZG1nRXdtT0d5DQotRG9Damp2YmR0bFh3QlRhWA0KLUVQREtqdmJkU2laaXFBQk0NCi1FUERMS3ZiZEVYeE1Uc3NsDQotRVBDa0t2YmRSV21jY0xoRA0KLURuY0xLdmJkcldwTURKWlINCi1FUERMS3ZiZGVsZlhHbGlrDQotRU9jTEt2YmRGamRzQ2hOVg0KLUVQQ2tLdmJkVlVNdEZrdWoNCi1Eb0RMS3ZiZHRreFhCVUJYDQotRG5jTEt2YmRNZ0RRTlB0aw0KLURuYmtLdmJkTUpDTVF4QVMNCi1FT2NMS3ZiZHVXT1lKcHNBDQotRVBDamp2YmRaeGNpbWNNUw0KLURvREtqdmJkcXJVam1rQW0NCi1FT2JqanZiZFJ6SmdzQ3ZBDQotRU9jTEt2YmRpQm9ERlhSUg0KLUVQQ2pqdmJkU1B0SEtGY3cNCi1EbmNLanZiZGJCVmVHUHBYDQotRG5iamp2YmRSb3RHaWVkWA0KLURvREtqdmJkSUhHelpZWGcNCi1EbmJqanZiZGlHakN5Vml1DQotRVBDamp2YmRTeEtrbXpqeA0KLUVQQ2pqdmJkbWFqV3dvT1YNCi1EbmJqanZiZG1iS1d4UE51DQotRU9ia0t2YmRDVEJDc2ZYUw0KLURvQ2pqdmJkS1F6RW5mT0YNCi1FUENrS3ZiZGRpalJ1dHpuDQotRU9ia0t2YmRGamVUQ2dtVg0KLURuYmpqdmJkVVJRbnVVaE4NCi1EbmJrS3ZiZGlDT2NGWFJSDQotRU9ia0t2YmRKdXRmRUVmaQ0KLURuY0xLdmJkaHR5ZHdSdUMNCi1Eb0NqanZiZGNUQ2pzZEphDQotRG5iamp2YmR6b1BxRWNNWQ0KLURvRExLdmJkU0NEZGxKWkwNCi1FT2NLanZiZGxoY3RRdVNCDQotRVBES2p2YmRPRkVUaUpLZA0KLUVPYmtLdmJkZFp5UVlaUWINCi1FT2NMS3ZiZHJNeWpZbEhpDQotRG9ETEt2YmRxclZMT0xCTg0KLURuY0tqdmJkeU5zSHdyaUQNCi1FT2JrS3ZiZFF2bkVDa2djDQotRG5ia0t2YmR6bm9wZUNsWQ0KLURvQ2tLdmJkQ0pMQmppR0sNCi1FT2NMS3ZiZGF1Q0d4S3RJDQotRVBDamp2YmRlRk9yQ1djSw0KLURuY0xLdmJkY1NianREaWENCi1EbmJrS3ZiZEtXVkdEZGdKDQotRVBES2p2YmRyRGRpUU51YQ0KLURuY0xLdmJkcVR0R3FyS3QNCi1Eb0RLanZiZGpKZklLTXdyDQotRG9Da0t2YmRreHNTVFpIVQ0KLUVPYmtLdmJkRmVqU05odFINCi1Eb0RLanZiZG5DS1d4T211DQotRG9ETEt2YmR2QkR5U25lSQ0KLURuY0tqdmJkZFp4cFh5UkMNCi1FUERLanZiZGR3elRzcWV6DQotRG9ETEt2YmRMRmZJQmFRdQ0KLURuY0xLdmJkd3pIZWV3ZHINCi1EbmNMS3ZiZE9GRVVKSktkDQotRG9ETEt2YmRFdlpRUU1pZQ0KLUVQRExLdmJkV0h4VndnWXoNCi1Eb0NqanZiZGlHakN4dWpWDQotRVBES2p2YmRyb3ZQSmNXRw0KLURvRExLdmJkWnhjak9Da3INCi1EbmJqanZiZFJ6SmdzRFdBDQotRG9ETEt2YmRpWnVHTHBuRw0KLURuY0xLdmJkVHVrb2l0QlINCi1EbmJrS3ZiZG5CaXdYbm5WDQotRG9ES2p2YmRCdnpkSWRvdg0KLUVPYmtLdmJkUlduRUNraEQNCi1Eb0NrS3ZiZFJiRGVNSlpMDQotRG5jS2p2YmRpR2pEWXVqVg0KLUVQQ2tLdmJkTmRjdElpTEUNCi1FUENqanZiZEtXVWZEZGZpDQotRU9jS2p2YmRrSUdsR0dOaw0KLUVQREtqdmJkR1pWVkJEeEMNCi1FT2JrS3ZiZFhzTUJOVU94DQotRU9iamp2YmRBTkh4cnZ5eA0KLUVQREtqdmJkWnRJaHlEcm4NCi1Eb0NrS3ZiZFJXbWRDa2djDQotRU9ia0t2YmRmZkx5bkdnQQ0KLURvREtqdmJkSXhUYWhNUXANCi1EbmNLanZiZEtRekZQR09GDQotRG9ES2p2YmR1REN0d1dPbw0KLUVPY0tqdmJkbkNKdnhPbXUNCi1Eb0NqanZiZEVKZ2l2WGpBDQotRG5jS2p2YmRlbUdXZ01qTA0KLURuY0tqdmJkQ0RwQlZqTWYNCi1EbmNMS3ZiZG1veXh1a1pDDQotRU9jTEt2YmR0a3d3QlRhWA0KLURvQ2tLdmJkTHF3TXpVcHoNCi1EbmNMS3ZiZHFGZEZVV0JJDQotRVBETEt2YmRaeUVKbWJsUw0KLUVPY0tqdmJkRXpzcUZNQ2kNCi1Eb0NrS3ZiZGNhcm1TQVRtDQotRG5jTEt2YmRGZkpxbWlUcQ0KLURuY0xLdmJkS1F6RW9HTmUNCi1Eb0NqanZiZFVhQ1JUUlNaDQotRU9jTEt2YmRxWk9oR3FFWQ0KLURvQ2tLdmJkWmlzSVFHYWYNCi1Eb0NrS3ZiZGVGT3JCd0NqDQotRG9ETEt2YmRtSWN0UXRxYQ0KLUVPYmtLdmJkeFZNZHFZa24NCi1EbmNLanZiZHd5Z2ZGeEZTDQotRG9Da0t2YmRSV25FRExoRA0KLUVPY0tqdmJkbVJ5VXlyY2kNCi1Eb0NrS3ZiZFdYSXd2RGVIDQotRVBETEt2YmRSWE9EY0xnYw0KLURvRExLdmJkQnNCRFVHV3INCi1FT2NLanZiZEV2WW9wTkplDQotRG9Damp2YmRCdnpkSWRvdg0KLURvQ2tLdmJkeXplTnJJSkkNCi1FT2JrS3ZiZENKS2JLaGVqDQotRU9iamp2YmRRY2NCUVFjcg0KLURuYmtLdmJkeFpnZWV3ZHINCi1Eb0RLanZiZHFjZGhwTnVhDQotRG9Damp2YmRlSmpTVnR6bg0KLURuY0tqdmJkZG5lVEtzc3INCi1EbmJqanZiZFp4Y2pOYmtyDQotRVBDamp2YmRaaXNJUGZhZg0KLUVQQ2tLdmJka3lUUnJ4ZnQNCi1EbmNLanZiZFZ3SXhWY2RnDQotRG5jTEt2YmRJeFRhZ2twcA0KLUVQQ2pqdmJkYnJianRFSmENCi1EbmNLanZiZGtDa2pxSFVnDQotRG9Da0t2YmRVeGdzeWpubg0KLUVPYmpqdmJkVWFDUlNwcloNCi1EbmJqanZiZE1KQ0xweEFTDQotRG5jTEt2YmRsaUVVUXVSYQ0KLUVQQ2tLdmJkQU5IeHJ2elkNCi1FUENqanZiZGVBVVJNd2pHDQotRVBES2p2YmRab09JZUV6Sw0KLURvREtqdmJkbXVWWmtKcWYNCi1EbmNMS3ZiZGFOTENUVWxnDQotRG9Da0t2YmRuUVp4dkxZYg0KLURuY0xLdmJkaGZpY1pXSnUNCi1EbmNLanZiZGF0YkhZTFVJDQotRG9Damp2YmRkbmRyanRVUw0KLUVPY0xLdmJkc0JmTWtnS3kNCi1EbmJqanZiZEJpS2FrSWZLDQotRG5iamp2YmRTUVRmakZjdw0KLURvQ2pqdmJkbW95eHZLeUMNCi1Eb0NrS3ZiZEdjanVpYktLDQotRG5ia0t2YmRaUWxkaU1lUg0KLUVPYmtLdmJkcXF1S25LYU4NCi1Eb0NqanZiZFpSTkVobGRxDQotRVBDamp2YmRCaUtiTEpGag0KLUVQQ2pqdmJkeVhoakNQeWsNCi1EbmNMS3ZiZHRUU1N4ekVjDQotRVBDamp2YmRuQ0p3WG5tdQ0KLURvRExLdmJkYkJXRWZRUHcNCi1FT2NMS3ZiZGVtR1hITktMDQotRG9ETEt2YmRtZmR4TW5HeQ0KLUVPY0xLdmJkVHFRbnR0aE4NCi1FT2NMS3ZiZHJNeWl4bElKDQotRU9jTEt2YmRWVU1zZWxXSw0KLUVPY0xLdmJkQnZ6Y2hlUHYNCi1Eb0NqanZiZGJWQ0hYanNoDQotRVBDamp2YmRaUk1kaGxlUg0KLUVPY0xLdmJkaGJPYmVYUlINCi1FUENrS3ZiZEZXWlBwTWllDQotRG5jTEt2YmRYRnladEFPcw0KLURuYmtLdmJkVHFRb1V1SG0NCi1FUENqanZiZENTYURVRnZyDQotRG9ES2p2YmRRWk5BSFRTSw0KLUVPY0xLdmJkbW95eVZrWkMNCi1Eb0NrS3ZiZEdMRXJiaE11DQotRU9jTEt2YmR0dk53alJUQQ0KLUVPYmtLdmJkRmpkc0RJTlYNCi1FT2NLanZiZGVPZHNMVVVTDQotRG5jS2p2YmRNdHJyS21BWA0KLUVPYmtLdmJkQnNCQ3RHV3INCi1FT2NMS3ZiZFZCQ1JUUlNaDQotRG9ES2p2YmRLUXlkb0ZtZQ0KLURuY0xLdmJkbkhGWG1PR3kNCi1EbmJrS3ZiZEdBbnFZaXptDQotRU9jTEt2YmRqbGFrekVmbw0KLUVPY0tqdmJkZWdrV1NPUWcNCi1Eb0NqanZiZHRrd3dBc2FYDQotRVBDa0t2YmRlS0tTV1V6bg0KLUVPYmpqdmJkclJ0am5MQk4NCi1FUENrS3ZiZGVBVHFNeEtHDQotRG5ia0t2YmRaTVJkVG1sTg0KLURvREtqdmJkTnNVV0dlVlENCi1FT2JqanZiZHlYaUtCcFprDQotRU9jTEt2YmRKS0VBSnBIRQ0KLURvREtqdmJkelFvTkpKd0ENCi1Eb0NrS3ZiZHd5Z2Vld2RyDQotRU9ia0t2YmRzQ0dOTUhLeQ0KLUVPY0xLdmJkbGhkVVF1UmENCi1FT2JqanZiZHlOc0h3c0ljDQotRG9ETEt2YmRXUm5YYkZMYw0KLUVPYmpqdmJkdUNjVXZ2UFANCi1FT2NMS3ZiZHJFRWhvbldCDQotRVBDamp2YmRSanlGdGdLcw0KLUVQQ2pqdmJka05DTHpGR28NCi1Eb0NrS3ZiZFJEYmFQcGNyDQotRG9ES2p2YmRRZENhUVFkUw0KLURuY0tqdmJkd3loRmV4RlMNCi1FUERMS3ZiZEJoamFrSkdLDQotRVBES2p2YmRhTkthcnVNZw0KLUVPYmtLdmJkelFubGlKd0ENCi1EbmJqanZiZHB0VGZyU0xVDQotRG9ES2p2YmRGV1pQcE5KZQ0KLUVPYmtLdmJkWnhjak9Da3INCi1Eb0RLanZiZGVoTFdSblFnDQotRU9jTEt2YmRjU2JrVUVLQg0KLUVPYmpqdmJkYlVhZnhMVGgNCi1FT2JrS3ZiZEJjcEF2S05HDQotRG9ETEt2YmR5U21pTlNCZw0KLURuY0xLdmJkbUlkVVF1UmENCi1FUENrS3ZiZHVERFV2dW9QDQotRG9ETEt2YmRNdHJxam1BWA0KLURvRExLdmJkVlpIdFprT24NCi1FT2NMS3ZiZGladUdMcG5HDQotRU9jS2p2YmR4bXJneFNoYw0KLURvQ2pqdmJkTXBZUXZOZnMNCi1FT2NLanZiZENJa0NLaUZqDQotRVBETEt2YmRhYVZkZXBQdw0KLUVPYmtLdmJkWEZ5WnRBT3MNCi1FUERMS3ZiZGJLbEZubkRBDQotRG5jTEt2YmRxR0VGVHVhSQ0KLUVPY0tqdmJkcUZjZHN2QWgNCi1FUENrS3ZiZGNTYmtVRGpCDQotRG5jS2p2YmRySkFKZU1vRg0KLUVPYmpqdmJkWk1SZFVOa20NCi1EbmNLanZiZENFUGFWak5HDQotRG5iamp2YmRwdFVIU1NMVQ0KLUVQQ2tLdmJkVXROVGVrdWoNCi1Eb0NrS3ZiZFZxbXdhZGxEDQotRU9iamp2YmRDSWtCamlGag0KLUVPY0xLdmJkYlZDR3drVUkNCi1FT2JqanZiZEZmS1NOaVRxDQotRVBES2p2YmRKWHRDSGxSUQ0KLUVQREtqdmJkVHZNUUp0QlINCi1FUENqanZiZFpNUmRUbkxtDQotRVBDamp2YmRlbUdYR2xqTA0KLUVQREtqdmJkeG1zSHhUSkQNCi1FT2NLanZiZGlWWmR2clZDDQotRG5ia0t2YmRtU1pVelNkSg0KLUVQQ2tLdmJkVWFDUlRSU1oNCi1EbmNMS3ZiZG9BS3p0SURuDQotRU9iamp2YmRIZmZ5eVh4SA0KLUVQQ2tLdmJkYU1qYlN0bUgNCi1FT2JqanZiZFp5RGluRE1TDQotRG9ES2p2YmRqbGJNWmRnUA0KLURuY0tqdmJkUXdPRURNSGMNCi1EbmNMS3ZiZEdMRlNiZ21WDQotRVBDa0t2YmRqdlhPRUNYdw0KLURvQ2tLdmJkU0JjZUxoeUwNCi1Eb0RMS3ZiZEV2WXBQbUtGDQotRU9jS2p2YmRyYkZsa2ZrWg0KLUVQREtqdmJkVHZNUUpzYVINCi1EbmNMS3ZiZGp2WE5jYXhYDQotRG5ia0t2YmRpakdJS05Ycg0KLUVPY0xLdmJkaUhKY1pWaXUNCi1Eb0NqanZiZGxxeHVac0RpDQotRG5ia0t2YmRodVplWFJ0Yg0KLURuY0xLdmJkQUNxeEp6SlENCi1FT2JqanZiZGpsYkx5ZGdQDQotRVBES2p2YmR4WmdlZlhkcg0KLUVPY0tqdmJkU0NFRkxpWWsNCi1FT2JqanZiZEtlZklDQXB1DQotRVBES2p2YmRqbGJMeWVHbw0KLURuY0xLdmJkYkF2RWVwUVgNCi1FUENrS3ZiZHJTVktuTEFtDQotRG5jTEt2YmRaalRIcEhCZg0KLURuYmtLdmJkQ1d6ZElkb3YNCi1Eb0RMS3ZiZHhVbUZReUxuDQotRG5ia0t2YmR4Vk5GUllrbg0KLURvQ2tLdmJkWmlzSHBIQ0cNCi1Eb0RLanZiZHdrWEVIenpHDQotRG9Damp2YmRTUHRISmVkWA0KLUVPY0xLdmJkQmlMQmtJZWoNCi1Eb0NrS3ZiZGlMZGNuVkN5DQotRG5ia0t2YmRsaGNzcVVxYQ0KLUVQQ2pqdmJkd3pJR0Z4RXINCi1FUENrS3ZiZHlTbWlOUmFnDQotRG5jTEt2YmRIRUt1akNLSw0KLUVQRExLdmJkZGVPckNYREsNCi1Eb0RMS3ZiZE5HYm9scFVrDQotRU9jTEt2YmR0bFlYQlRhWA0KLUVPY0xLdmJkcXdRTGNJeVINCi1FT2JqanZiZElyeGFTbHhNDQotRU9iamp2YmRicmNLdEVLQg0KLUVPY0tqdmJkcHhuZ2ZxRHgNCi1Eb0RMS3ZiZEtmRmhDQXB1DQotRG9ETEt2YmRKdlVmRUVmaQ0KLURuY0tqdmJkc1FXT2lidWYNCi1Eb0NqanZiZEhnR3l4eFhnDQotRG9Da0t2YmRaSFdkQVBUSg0KLURuY0tqdmJkYXVCZ1lMVGgNCi1Eb0RMS3ZiZEpZVUNJTVJRDQotRG5jS2p2YmRicmJqdEVKYQ0KLURuYmpqdmJkZW1Gd0hOSmsNCi1EbmJrS3ZiZEJ2emNoZVFXDQotRVBDa0t2YmRKcVplUEdOZQ0KLUVQQ2tLdmJkU0t4ZXVHa1QNCi1FUERMS3ZiZElyeUJUTXhNDQotRVBDamp2YmR3V2xBdWFWdQ0KLUVPY0xLdmJkeVRPSk5SYkgNCi1FUENqanZiZFF2bWRDbElEDQotRG5iamp2YmR5VE9KTXFhZw0KLURuY0tqdmJkclhRTURKWXENCi1FUENrS3ZiZEdkTFZqQmlqDQotRU9jTEt2YmRqSmVoSm1Ycg0KLURuYmtLdmJkQ0pLYWtKR0sNCi1Eb0NqanZiZExyV2x6VXB6DQotRVBDa0t2YmRoelZGbFJOZg0KLURvQ2pqdmJkUkRjQXBSRVMNCi1FT2JrS3ZiZHpST21KS1hBDQotRG5jS2p2YmR4VW1GUllsTw0KLUVQQ2tLdmJkVVJRb1ZWSU4NCi1FUERMS3ZiZFZaSHRaa1BPDQotRG5ia0t2YmRhdGFmd2pzaA0KLUVPYmpqdmJkTnJ0V0dkdHANCi1Eb0RMS3ZiZEJpTENMSkZqDQotRU9jS2p2YmRtZ0ZYbU9IWg0KLUVPYmpqdmJkWlJNZUltRXENCi1Eb0NqanZiZGlNRWROdGNaDQotRG5iamp2YmRnRmt6TmZnQQ0KLURuYmpqdmJkR0tkc0RIbVYNCi1EbmNMS3ZiZEl4VUJoTVJRDQotRG9ETEt2YmRqU3pocmppeg0KLURvRExLdmJkcHlQSGdSRHgNCi1Eb0RMS3ZiZHFZb0lHcGRZDQotRG9Da0t2YmRVUXFQVXVIbQ0KLUVQQ2tLdmJkQnJhRFRmWFMNCi1EbmNLanZiZE5ydFdHZVVwDQotRG5jS2p2YmRKcVpkbmVuRg0KLUVQQ2pqdmJkQ1d6ZEllUHYNCi1Eb0RLanZiZHJYUGxESXhxDQotRVBES2p2YmRhdUJnWUxVSQ0KLUVQQ2pqdmJkUW1YYlluVXoNCi1Eb0NqanZiZEdHSnFuSlVSDQotRVBETEt2YmRrVnZuRUJ3dw0KLUVQQ2pqdmJkVHVrb2l0QlINCi1Eb0NqanZiZFJrWkZ0Z0xUDQotRG9ES2p2YmRFdXlQcE1pZQ0KLUVQQ2tLdmJkU0xZZlVnTFQNCi1EbmJqanZiZEl3dEJnbFFwDQotRG5ia0t2YmR6bnBRZURNWQ0KLUVPY0tqdmJkem5wUkZDa3gNCi1FUERMS3ZiZHR1bXdqUXNBDQotRG9ETEt2YmRCaGphamlHSw0KLURvREtqdmJkaGxGRG11RFoNCi1EbmJrS3ZiZHFxdUtuS2FODQotRG5jTEt2YmRNb3dxVm1mcw0KLUVPY0tqdmJkcXJVam5MQW0NCi1FT2JqanZiZHF3UU1ESXlSDQotRVBES2p2YmRuQ0tYWVBPVg0KLURuYmtLdmJkSGZmeXlYeEgNCi1Eb0NqanZiZGxaU3JUWkd0DQotRG9ETEt2YmR6bnBSRkRNWQ0KLUVQREtqdmJkV1dpWHZEZGcNCi1Eb0RLanZiZFJXbkVDbElEDQotRG5iamp2YmRKY0tDcUtEWQ0KLUVQREtqdmJkSmJqRFFpY1kNCi1EbmNMS3ZiZGhhb0RFd1JSDQotRG5jTEt2YmR2QWRaU29FaA0KLURuY0xLdmJkZUVuckNXYmoNCi1Eb0RLanZiZFZ2aHd2RGVIDQotRU9jS2p2YmRWQWFwc1FxeQ0KLUVQQ2tLdmJkeG5USVlTaUQNCi1FUENrS3ZiZHJvdW9KYnVmDQotRU9iamp2YmRlUEVzS3RVUw0KLUVQRExLdmJkaXJ6aVNrSnoNCi1EbmJqanZiZGhhb0NkdnFSDQotRVBDa0t2YmRHWlZWQWRZQw0KLURuY0tqdmJkdGJidVd1b1ANCi1Eb0NrS3ZiZExGZWhDQlJWDQotRG9ES2p2YmRMWlJKcnp0Zg0KLUVPYmtLdmJka0hmbEdGbWsNCi1FT2NLanZiZEpZVUNJTVFwDQotRVBETEt2YmR1Q2NWWFdPbw0KLUVQQ2tLdmJkcHRUZnFxa1UNCi1Eb0RLanZiZEdRQVRXZ0daDQotRG5jS2p2YmRFenRRZU1DaQ0KLUVPYmtLdmJkWnRKSlpFVE8NCi1Eb0NqanZiZFpzaUl5RVRPDQotRU9ia0t2YmRkbmRyanN0Uw0KLUVPY0xLdmJkZGVPcWJYREsNCi1EbmJrS3ZiZENUQkRVR1hTDQotRVBES2p2YmRRbHdheU9Veg0KLUVQQ2pqdmJkbHF5VXpURUoNCi1Eb0RMS3ZiZGh0eWR2clViDQotRU9jS2p2YmRsWlRTU3lHdA0KLUVPY0tqdmJkbUpEdFF1U0INCi1EbmJqanZiZHRTcXNaWmVEDQotRG9ETEt2YmRVYUJwc1JTWg0KLUVQREtqdmJkTEdGaEJhUlYNCi1EbmJrS3ZiZFNCY2RraHhrDQotRG9Damp2YmREb0RLa1hERQ0KLURvREtqdmJkd3loRmZZRlMNCi1FUERLanZiZE9FY3RKSWpkDQotRVBDamp2YmRFT2Jqa1djRQ0KLUVQRExLdmJkaHR6RXZxdUMNCi1FT2JrS3ZiZFpqU2hRSENHDQotRVBDamp2YmRtSWN0UXVSYQ0KLUVQQ2tLdmJkVndJd3VjZGcNCi1FT2NMS3ZiZEFEUnhKekpRDQotRU9jTEt2YmRXV2lYdkVFZw0KLUVQQ2pqdmJkVEFGSWhCb0UNCi1FUERMS3ZiZFpMcWRUbk1ODQotRVBETEt2YmRaUWxkaG1FcQ0KLUVPY0tqdmJkTExCSVdBSnkNCi1EbmNMS3ZiZHJNektZbElKDQotRVBDamp2YmR6aXRvb2RTdA0KLUVQRExLdmJkTEZlaENBcVYNCi1Eb0NrS3ZiZHJNeWl5TUhpDQotRVBES2p2YmRrVnZtY2F4WA0KLUVPY0tqdmJkbXBaeHZLeGINCi1FUENrS3ZiZGxpRHRSVXJCDQotRG5jTEt2YmRreHNSc1lmdA0KLUVQREtqdmJkVHFST3VWSG0NCi1FUENqanZiZFNRVGdKZWRYDQotRVBETEt2YmRIbEJ6blhSTA0KLURuY0tqdmJkUWREQlFSRHINCi1FUERMS3ZiZGxpRHNxVlJhDQotRG9ES2p2YmRqZ2ZsRmZPTA0KLUVQREtqdmJkZUVvU0NXYmoNCi1EbmJrS3ZiZGZTQld6a2NQDQotRU9ia0t2YmRtSWNzcHVTQg0KLUVQQ2pqdmJkdkFkWlRQRWgNCi1Eb0NrS3ZiZElHZnl4d3hIDQotRG5iamp2YmRXV2lZV0RlSA0KLUVPYmtLdmJkWlFsZUltRlINCi1EbmNMS3ZiZFF3TmRDa2djDQotRU9jTEt2YmRRZERCUHFFUw0KLURuYmpqdmJkcnBXUEpidWYNCi1Eb0NrS3ZiZFR1bFFLVGFSDQotRG9ETEt2YmRlVUFVQVNsdg0KLUVQQ2pqdmJkWlFtRkpORXENCi1EbmNMS3ZiZFZCQnFTcVNaDQotRU9jS2p2YmRxY2VKUG12Qg0KLURuY0xLdmJkWnRJaVljcm4NCi1FT2NMS3ZiZEpTeGFTbVlNDQotRG9Da0t2YmRxcXRrT0xCTg0KLUVPYmtLdmJkZ0ZreW1mZ0ENCi1EbmJqanZiZFZxbXdhZGxEDQotRG5jTEt2YmRzQmZOTUdrWg0KLUVQREtqdmJkRVBES2p3Q2QNCi1FT2JqanZiZEhEanZLQmpLDQotRG5jTEt2YmRDVEFic2V2cg0KLUVPYmtLdmJkRnh1VWFFWGINCi1Eb0NqanZiZGN5eVFZWlFiDQotRU9iamp2YmRac2lJeGRTbg0KLUVQRExLdmJkWlFtRWhtRXENCi1EbmJrS3ZiZHhuVElYcmlEDQotRG5jS2p2YmRmSGtWck9SSA0KLUVPY0tqdmJkZGRvU0NYREsNCi1FUENrS3ZiZGhhbmJkdnBxDQotRU9jS2p2YmRSeWloVERXQQ0KLURuYmpqdmJkYWprZW9PREENCi1FT2NMS3ZiZGxoZFRwdVNCDQotRVBETEt2YmRoZ0pieHVpdQ0KLUVQQ2pqdmJkbkhGWG1OZ1oNCi1FUENrS3ZiZHBlY2RzdkFoDQotRG5ia0t2YmRWWklVWmpubg0KLURuY0tqdmJkYkF2RkdQcFgNCi1EbmJqanZiZGtNYWxaZUhQDQotRU9jTEt2YmRZU2xBbVVPeA0KLURvQ2pqdmJkSERrV0tDS0sNCi1FUERMS3ZiZGFSZWNIc2VrDQotRVBDamp2YmRKWHNhZ2txUQ0KLUVPYmpqdmJkUk13YlpOdHoNCi1FUENrS3ZiZHJiR01sSEt5DQotRG5jTEt2YmRLZkdJQ0FwdQ0KLUVQRExLdmJkVXROVGZMdksNCi1FUENrS3ZiZE1KQ01SWUFTDQotRU9jTEt2YmRDSktiTEpGag0KLURvREtqdmJkZnBCenZjeEkNCi1FT2JrS3ZiZFlwbGRobUZSDQotRU9jTEt2YmRTUHNmaWVjdw0KLURvQ2pqdmJkSEVLdktDS0sNCi1EbmJqanZiZFVHem1rd1ZlDQotRG5iamp2YmRmTWZYR21Kaw0KLURuYmtLdmJkWm9PSWVFeWoNCi1FT2JrS3ZiZFpubWhkZVpqDQotRU9jS2p2YmRUa3VvQlZvSg0KLUVQQ2pqdmJkR0tkc0NoTXUNCi1Eb0RMS3ZiZEpZVGFoTHBwDQotRVBDamp2YmRiaG1Ka0Z3WQ0KLURvRExLdmJka0lITUdHT0wNCi1FUERLanZiZFpzaUl4ZFNuDQotRVBDamp2YmRNZ0NwTlFVaw0KLURuY0xLdmJkamJsS3FHdGcNCi1EbmNMS3ZiZE9ZT3V6ZE50DQotRG5jS2p2YmRUdk1QalRhUg0KLUVQRExLdmJkaWllaEtOWHINCi1Eb0NqanZiZFpkeEd6Z2hiDQotRG9ETEt2YmRlT2RzS3Nzcg0KLURvRExLdmJkZEJzTXJBVU4NCi1Eb0NrS3ZiZHh4SWpCb3pMDQotRG9ES2p2YmRkb0Vya1VUcg0KLUVPY0xLdmJkd3pJRmV3ZVMNCi1Eb0RMS3ZiZFJFREJRUkVTDQotRU9ia0t2YmRobEVkT1VieQ0KLURvQ2pqdmJkTlB4UldOZ1QNCi1Eb0RMS3ZiZFpMcWN0TmxODQotRU9iamp2YmRiVWJIWGtVSQ0KLURuYmtLdmJkaHR5ZHdTVkMNCi1FUERLanZiZGVVQVVBU21XDQotRU9iamp2YmRoZ0tEWXZKdQ0KLUVPY0xLdmJkWm5taGRkeWoNCi1Eb0RMS3ZiZFVWbFFLVUFxDQotRG9ES2p2YmREaWhKdlhqQQ0KLURuYmtLdmJkWkxyRVRtbE4NCi1FUENqanZiZHh4SkpiUVprDQotRVBDa0t2YmRyb3VuakRWZg0KLURvQ2pqdmJkZGlpclZ0em4NCi1Eb0RMS3ZiZG10dHlqaXFmDQotRG5jS2p2YmRmSGp2U05wZw0KLURvQ2pqdmJkbVJ4dVpzRUoNCi1Eb0NrS3ZiZGpBUUdhUUdqDQotRG5jTEt2YmRuVlV6TEpyRw0KLUVQQ2pqdmJkTEFqZ05DWHENCi1Eb0RMS3ZiZHFtWml4bEhpDQotRVBETEt2YmRWVU1zZWt2Sw0KLUVQREtqdmJkck16S1pNSUoNCi1FUENrS3ZiZEtES0NwaWNZDQotRU9jTEt2YmR3dG1FcVpNTw0KLUVQRExLdmJkbWdGWGxuR3kNCi1EbmNLanZiZHlUTmhscWJIDQotRG5jS2p2YmRuSEZYbG5IWg0KLURvRExLdmJkVHFST3VVZ20NCi1Eb0RLanZiZFJNd2JaT1V6DQotRVBES2p2YmRSTXdiWW10eg0KLURvREtqdmJkWm5taGVFeWoNCi1FUENrS3ZiZGJCV0VmUG93DQotRG9ES2p2YmRRd05jY0xnYw0KLURvQ2pqdmJkaHR6RldxdGINCi1Eb0RLanZiZFJvdEhLR0VYDQotRG5jS2p2YmRac2lKWkVUTw0KLUVPYmpqdmJkYU5LYlN0bGcNCi1Eb0NrS3ZiZHNabFFUQWhPDQotRU9iamp2YmRqaEdsR0dOaw0KLUVPYmtLdmJkUWREQlFRY3INCi1Eb0RLanZiZE10cnJMTkFYDQotRVBDamp2YmRSb3RIS0dEdw0KLUVQQ2pqdmJkcVpQSUdxRHgNCi1FT2NMS3ZiZGlHaWNaVml1DQotRG5iamp2YmRKdlZHRUZHaQ0KLURvQ2tLdmJkS05BRVpmdUINCi1FUERMS3ZiZExaUkpyenVHDQotRG5ia0t2YmRoeXRmTHBuRw0KLUVQREtqdmJkUmJFRWtpWWsNCi1FT2NMS3ZiZGNKTWpMRnZ4DQotRG5jS2p2YmRGZktSbkl0Ug0KLURvRExLdmJkZWdqdXJPUkgNCi1EbmJqanZiZEVQREtqdmNFDQotRVBDamp2YmRrSGdMZWVuTA0KLURuY0xLdmJkWm5taGVFeksNCi1EbmNLanZiZFpqU2dwSENHDQotRG9Da0t2YmRiQlZkZW9vdw0KLURvRExLdmJkWlFtRWhsZVINCi1FUERMS3ZiZHB4b0hmcGN4DQotRVBDa0t2YmRTUHRHakdFWA0KLURuY0tqdmJkUmJEZUxoeGsNCi1FT2JrS3ZiZHJwV09pYnZHDQotRG5iamp2YmRmSUt1ck5wZw0KLUVQRExLdmJkWnlFS05ia3INCi1Eb0RMS3ZiZHdYTUF2QldWDQotRU9jTEt2YmRXV2lYdkRkZw0KLUVPY0tqdmJkZWxmV2ZsakwNCi1EbmNMS3ZiZGp1dm5FQnhYDQotRG5jTEt2YmRsaURzcHVSYQ0KLUVPYmpqdmJkVlRsc2VrdWoNCi1Eb0NqanZiZGVyQXZ6bERQDQotRVBES2p2YmROZUR0SWhrRQ0KLURuYmpqdmJkZHd5c3NxZXoNCi1FT2JrS3ZiZEdHS1JuSXRSDQotRG9Da0t2YmRIYkx6RXpBRA0KLUVQQ2tLdmJkVHZNUGpVQlINCi1FT2JqanZiZFRBRWlJQm9FDQotRG9Damp2YmRSanhmVWdMVA0KLURuYmtLdmJkblV1WmtLUmYNCi1FUERMS3ZiZGptQmt5ZGdQDQotRU9ia0t2YmROZURzaUlqZA0KLURuY0tqdmJkcm91bmpEV0cNCi1EbmJqanZiZHJXb2tiaHhxDQotRG9ETEt2YmRzUHZQS0RXRw0KLURuY0tqdmJkWmR3ZnpnaUMNCi1FT2NMS3ZiZFpMcWRVTmxODQotRG9Damp2YmRrRE1MUkhWSA0KLUVQREtqdmJkaXJ6aVNqaXoNCi1FT2JrS3ZiZHVERFV2dW5vDQotRG9ETEt2YmRrSGdNR0dPTA0KLURuY0xLdmJkaGtkY211Q3kNCi1FT2JrS3ZiZENKTENMSWVqDQotRG5ia0t2YmRlRlBSYXdDag0KLURuY0tqdmJkc1FWb0tEVmYNCi1FUERMS3ZiZFJYTmNjTGhEDQotRU9ia0t2YmRGeHR0YUR4Qw0KLUVPYmtLdmJkcXJWS25LYU4NCi1FUENqanZiZGRvRXNLdFVTDQotRU9iamp2YmR6YUFPZmZiTQ0KLURvQ2pqdmJkV1NOeEJkbEQNCi1FUENqanZiZHFsektZbElKDQotRU9jTEt2YmRRZERBcFJEcg0KLURuY0tqdmJkY3paUHd5UkMNCi1FT2NMS3ZiZHRsWHdCVUJYDQotRU9jS2p2YmRtZ0ZZTk9HeQ0KLURvQ2pqdmJkS1Z0ZkVGR2kNCi1FT2JrS3ZiZHJOWmpaTGdpDQotRU9jS2p2YmRsaUVUcVZTQg0KLUVPY0tqdmJkYlZCZ1hrVUkNCi1EbmNMS3ZiZE5IRFBtUHRrDQotRG5iamp2YmRqbGFrekVmbw0KLUVPY0tqdmJkVlVOVGZMdksNCi1FUERLanZiZFRYamttemp4DQotRG5jTEt2YmRyeWxRVEJJTw0KLUVQQ2tLdmJkSnB6RW9HT0YNCi1EbmNLanZiZEZlaXFtaHRSDQotRG5jTEt2YmRabm5KRkZaag0KLUVQRExLdmJkbHJaVXpURUoNCi1FUERLanZiZExGZklDQlJWDQotRVBDamp2YmRjeXhwWHlSQw0KLURvRExLdmJkUWRDYVFRY3INCi1EbmNMS3ZiZFpzaUpaRHNPDQotRU9iamp2YmR6UW9OSWpYQQ0KLURuY0xLdmJkVnFteEJkbEQNCi1Eb0RLanZiZFJqeGZVZ0xUDQotRU9iamp2YmRXSVlWeEhZeg0KLURvQ2tLdmJkSUdmelpYeEgNCi1EbmNLanZiZHhzTmhscWFnDQotRG9ES2p2YmRGV1lvcE5KZQ0KLUVQREtqdmJkVkJDUlRSU1oNCi1FUERLanZiZHd5aEZmWGVTDQotRG9Damp2YmR6aXVQb2NzVQ0KLUVQREtqdmJkWVNrYU5VUFkNCi1FT2JqanZiZHpub3BkY0x4DQotRU9jTEt2YmR1TVlXYVVCWA0KLUVQREtqdmJkblB6WldLeUMNCi1FT2JrS3ZiZFp4Y2ltYmtyDQotRU9ia0t2YmRCaGpiS2lGag0KLUVPY0xLdmJkanV3TmRCd3cNCi1FUERLanZiZG1iS1d4T25WDQotRG9Da0t2YmRuSEZZTk5nWg0KLURvRExLdmJkck16S1lraEoNCi1FT2NMS3ZiZHFkRklwTnZCDQotRVBES2p2YmRjU2NLdERqQg0KLUVPY0xLdmJkeWdaTUFNZHcNCi1FT2NMS3ZiZHNDR05MZ0xaDQotRG9ETEt2YmRhTWtCc1VsZw0KLURuY0tqdmJkbFpTcXNZZnQNCi1EbmJrS3ZiZG5WVXpMS1JmDQotRG9Da0t2YmRuSEZYbG1nWg0KLUVQREtqdmJkeFpnZkdZRlMNCi1Eb0NrS3ZiZHh3aUtDUHpMDQotRG5ia0t2YmRCY3BBdktNZg0KLURvQ2pqdmJkZFp5UVh4cGINCi1EbmNMS3ZiZHpRbm1JalhBDQotRVBES2p2YmRGV1pRUU1qRg0KLURuYmpqdmJkTWdEUU1wVWsNCi1EbmNMS3ZiZE9GRHRJaUtkDQotRG9ES2p2YmRLTkFFWmZ0YQ0KLUVPY0tqdmJkaHl1R01RbWYNCi1EbmJqanZiZFpubWhkZVpqDQotRG5jTEt2YmRoYk9jRlhSUg0KLUVPY0xLdmJkdkJFWlNvRWgNCi1FT2NLanZiZFlrckVVT0xtDQotRVBDa0t2YmROcnRXR2R1UQ0KLUVQREtqdmJkWmpTZ3BIQ0cNCi1FT2JrS3ZiZHl6ZG1ySGhoDQotRG9ETEt2YmR6bnBRZGJsWQ0KLURuY0xLdmJkWnNoaHlEcm4NCi1EbmJrS3ZiZGp2V21kQ1lYDQotRU9jTEt2YmRBTWd4c1d6WQ0KLURuYmpqdmJkd3pJR0dYZHINCi1FUERLanZiZHJOWml4bElKDQotRG9ES2p2YmRzUVdPaWNWZg0KLURvREtqdmJkanV2bWRCeFgNCi1FT2JrS3ZiZHpIWk1BTkZYDQotRG9ETEt2YmRkakpxdXR6bg0KLUVPY0tqdmJkd05XQU1kRk4NCi1EbmJrS3ZiZFRxUlBVdGdtDQotRU9jS2p2YmRWWWd0WmtPbg0KLUVQREtqdmJkTkdjUGxvdGsNCi1EbmJqanZiZEpiakRSSmNZDQotRVBETEt2YmRadEpJeUVTbg0KLURvREtqdmJkdGNDdVhWb1ANCi1Eb0NqanZiZFpNU0VUbWxODQotRG9Damp2YmRnR0x6TmZnQQ0KLUVQREtqdmJkeEt2Y2d6eWYNCi1FT2JqanZiZHJNektaTUlKDQotRG5jTEt2YmRNb3hRdW1mcw0KLUVQQ2pqdmJkYmhsaWtGdngNCi1Eb0RMS3ZiZFJhZEZNSllrDQotRG5iamp2YmRIZ0d6WXhZSA0KLUVPYmpqdmJkVlpIdFprT24NCi1EbmJrS3ZiZGFrTGZQTmNBDQotRG9Damp2YmRtZmVYbU9HeQ0KLURvRExLdmJkclJ0am1qYU4NCi1EbmJqanZiZFV4Z3N5am9PDQotRG5iamp2YmRiaGxpa0Z2eA0KLUVQRExLdmJkUmJFRk1KWWsNCi1FT2NLanZiZFJYTmNibEhjDQotRG5ia0t2YmRxbVppeGxIaQ0KLURvQ2pqdmJkcnpMcFRCSU8NCi1Eb0NqanZiZElMYXpuWFJMDQotRVBETEt2YmRSanlHVkdrVA0KLUVPY0xLdmJkZWhLdXJPUWcNCi1EbmNMS3ZiZFlrckRzbkxtDQotRG9ES2p2YmRaaXNIcEdhZg0KLURuY0xLdmJkcHlQSUdwY3gNCi1FT2NMS3ZiZGlqRmhLTllTDQotRU9jS2p2YmRNdVNxa05BWA0KLUVPYmpqdmJkYWpsRm5uREENCi1FT2NLanZiZHVMeFhBc2FYDQotRG5iamp2YmRpaWVnak13cg0KLUVQQ2tLdmJkaU1FZE51Q3kNCi1FUENrS3ZiZHFUdEhTUmtVDQotRVBDa0t2YmRJcnlCVE5YbA0KLURuY0xLdmJkRmpkcmNIbHUNCi1FUERLanZiZFpvT0llRlpqDQotRG5jTEt2YmRjYlROU0FUbQ0KLURvREtqdmJkZGVQU0NXY0sNCi1Eb0RLanZiZFpzaUpZY3NPDQotRG9ES2p2YmRwZWNlVHVhSQ0KLUVPY0tqdmJkamhITUdGbkwNCi1FT2NMS3ZiZGpjTGtSR3RnDQotRG5iamp2YmRDSkxDS2lGag0KLUVQRExLdmJkWnNpSXhkU24NCi1FT2JrS3ZiZFZUbHNla3ZLDQotRU9ia0t2YmRDVEFjVGV3Uw0KLURvRExLdmJkT1lPdXpjblUNCi1FUENrS3ZiZGlVeWR3UnVDDQotRG5jTEt2YmRHUUFUWEdleQ0KLUVQRExLdmJkRGpJSnZYakENCi1EbmNLanZiZHB4b0lIUWRZDQotRU9ia0t2YmRaTVNEc21rbQ0KLUVPY0xLdmJkQnZ6Y2hkb3YNCi1FT2NMS3ZiZEtSWmVPZW5GDQotRG5ia0t2YmR3eklGZllFcg0KLURuYmtLdmJkU0t5RnVIS3MNCi1FUERLanZiZGRDU2xyQVRtDQotRU9ia0t2YmRTQ0RlTUl5TA0KLUVQQ2pqdmJkc0NGbGxHankNCi1EbmJqanZiZEhnR3l5WVlIDQotRG5jS2p2YmRqS0ZnaWx3cg0KLURuY0xLdmJkRXZZb29tSmUNCi1FT2JrS3ZiZGxoZFRwdVNCDQotRG9ES2p2YmRXV2lZVmNlSA0KLURuYmpqdmJkTEdHSGJCUXUNCi1FT2JrS3ZiZE9Yb1Z6Y25VDQotRG5iamp2YmRic0NqdERqQg0KLURuYmpqdmJkUXdPRUNraEQNCi1EbmJqanZiZE1nQ29tUVZMDQotRG9Damp2YmRSb3RHakZjdw0KLURuYmpqdmJkbWFqV3hPbXUNCi1FUENrS3ZiZGJQZmdEa3pkDQotRG5iamp2YmRweG5nZnBjeA0KLURvQ2tLdmJkQnJhQ3RHV3INCi1EbmNLanZiZHVEQ3R3V1BQDQotRVBETEt2YmRZemNGcktWeQ0KLUVPYmpqdmJkYlZCZ1hrVGgNCi1EbmJrS3ZiZHlZSWliUHlrDQotRG5jTEt2YmRVVmxQaXRBcQ0KLUVPYmtLdmJkYktsR09uREENCi1EbmJqanZiZHJKQUtGTlBGDQotRVBETEt2YmRMQWpnTWJZUg0KLURvQ2pqdmJkU3hMTG16angNCi1EbmNLanZiZGVFbnFhd0NqDQotRU9ia0t2YmRGV1pRUG1LRg0KLUVPY0tqdmJkR2RLdkpiSmoNCi1EbmJrS3ZiZGpjTGpxSFVnDQotRVBDamp2YmRRdm5EY0xnYw0KLUVQQ2tLdmJkZG9GVExUdFMNCi1EbmJrS3ZiZFp0SWh5RHJuDQotRVBES2p2YmRCdnpkSWRwVw0KLUVPYmpqdmJkRVlZTHN0VU0NCi1FUENrS3ZiZHl6ZG5TSGlJDQotRU9iamp2YmRaTHFkVG1sTg0KLUVQRExLdmJkSUhIWnlYd2cNCi1Eb0NrS3ZiZGJWQmZ4S3RJDQotRG5ia0t2YmRNcFlSV09Hcw0KLUVPY0tqdmJkY3pZb3hZcUMNCi1FUENqanZiZGR3eXRUcWV6DQotRVBDamp2YmR1YUR5U29FaA0KLUVPYmtLdmJkVEpaaXFBQWwNCi1FT2JqanZiZG1veXlXTFliDQotRVBES2p2YmRuUHl4dWtaQw0KLUVPYmpqdmJkcldvbERKWlINCi1Eb0NrS3ZiZHVDYnR2dlBQDQotRVBETEt2YmRKYmljUWlieA0KLURuY0xLdmJkSEVMVmliSmoNCi1EbmJqanZiZEtlZkhiQXFWDQotRG5jTEt2YmRzWmtwVEJIbg0KLURvREtqdmJkdUNjVlhXT28NCi1EbmJrS3ZiZGlka0d0b0FPDQotRG5iamp2YmRyRUZJb25XQg0KLUVQQ2tLdmJkZnBCendFWUkNCi1EbmNMS3ZiZHd1TkZSWk1PDQotRVBETEt2YmRyb3VuakN2Rw0KLURuY0xLdmJkeHhKSmFveWsNCi1FUENqanZiZEptQUR6SFVhDQotRVBETEt2YmRxR0VGVHZCSQ0KLUVQRExLdmJkeU9TaFlUSkQNCi1FUENqanZiZEp1dGVjZGZpDQotRVBETEt2YmRJTUJ6blhRaw0KLURuY0tqdmJkbW95eHZLeUMNCi1FUERMS3ZiZHJYUU1DaHlSDQotRG9Da0t2YmRkd3l0VVNGeg0KLURuY0tqdmJkWmpUSG9mYkcNCi1FUERLanZiZEdjanVqQ0pqDQotRVBDa0t2YmR2QkVZc09lSQ0KLURuY0tqdmJkQ1RBY1VHV3INCi1FUENrS3ZiZG1iS1d3bm5WDQotRG5iamp2YmRweG5oSFJFWQ0KLUVPYmpqdmJkbFpUUnNZZnQNCi1Eb0NqanZiZGhrZGNtdGNaDQotRU9iamp2YmRNZmNQbVB0aw0KLUVQQ2tLdmJkSlh0Q0hrcHANCi1EbmJqanZiZHJTVWpta0JODQotRU9jTEt2YmRZU2xCTXRPeA0KLUVPYmpqdmJkem5vcGRia3gNCi1EbmNMS3ZiZGRkb1NDWERLDQotRG9Damp2YmRPWG51emNuVQ0KLUVQQ2tLdmJkWkd3RUFPc0oNCi1FT2NLanZiZGF1Q0d3anRJDQotRVBETEt2YmROSERQbVB1TA0KLUVPY0xLdmJkTkhDcE1wVWsNCi1Eb0NqanZiZG1TWXR5c0RpDQotRG5jS2p2YmRGamVURElOVg0KLURuY0tqdmJkTnJ0V0hGVXANCi1FUENqanZiZG1KRVRxVXFhDQotRG5jS2p2YmRFenNxRWtjSg0KLUVPY0xLdmJkbW95eVZqeUMNCi1FT2NMS3ZiZFpNU0VUbk1ODQotRU9jTEt2YmRCc0FidEZ2cg0KLUVQQ2pqdmJkSnV0ZkVGSEoNCi1Eb0NrS3ZiZGlCb0RFd1JSDQotRVBETEt2YmRaUW1GSW1GUg0KLUVQRExLdmJkcGZEZHN1YUkNCi1EbmJrS3ZiZG1iS1hZUE51DQotRU9iamp2YmRqS0dIak5Ycg0KLUVPY0xLdmJkcHNzZ1NSanQNCi1Eb0RMS3ZiZEtSWmVQR09GDQotRG5ia0t2YmRmZWt5bWdIQQ0KLURvRExLdmJkaUNPY0ZXcVINCi1EbmJqanZiZGlISmJ5V0tWDQotRG9ES2p2YmRzQ0dOTUhLeQ0KLURvQ2pqdmJkR0tlU2JnbVYNCi1Eb0RMS3ZiZGtJR2tmRm5MDQotRG5jS2p2YmRmSUxXUm5SSA0KLURvREtqdmJkR0xFc0NoTlYNCi1FUENqanZiZFZyTnhCZU1EDQotRVBES2p2YmRTTFpHVkhLcw0KLUVQRExLdmJkUWx4QnlPVXoNCi1FT2NMS3ZiZE1nRFFOUVZMDQotRG9ETEt2YmRyUnRqbkxBbQ0KLUVPYmpqdmJkQ0lrQmpoZksNCi1EbmNLanZiZER3d2xUc3NsDQotRG9ETEt2YmRBTklZc1d6WQ0KLURuYmpqdmJkeFZNZHFZa24NCi1Eb0NrS3ZiZHpkeW56ZHpRDQotRG5iamp2YmR4c05obVJhZw0KLUVPYmpqdmJkempWUVBjcnQNCi1Eb0NrS3ZiZGJCV0ZGb3BYDQotRVBES2p2YmRoZmlieHZLVg0KLURuYmtLdmJkZWdqdlJtcUgNCi1FUENqanZiZGtOQ01aZGdQDQotRU9jTEt2YmRtdHVaa0pxZg0KLUVPYmpqdmJkZW1GdmZsakwNCi1EbmNMS3ZiZHlZSWliUHlrDQotRU9iamp2YmRpZUtmdG9BTw0KLURuY0tqdmJkdk9zenFLb1UNCi1EbmNMS3ZiZFZVTlRlbFdLDQotRU9jS2p2YmRDRG9hV0tNZg0KLUVQQ2tLdmJkYnNES3REakINCi1FUERMS3ZiZG1TWXVac0RpDQotRG5jTEt2YmR3V2xCV0JXVg0KLUVPYmpqdmJka1Z3T0VCd3cNCi1FT2JrS3ZiZFdTTndiRkxjDQotRG5iamp2YmRaUk5GSW1FcQ0KLURvREtqdmJkcm91bmpEVmYNCi1FUERLanZiZENKS2JLaGVqDQotRG5jS2p2YmRzcnJUWXllRA0KLURvQ2pqdmJkUXZuRURNSGMNCi1Eb0NrS3ZiZEdRQVN3R2ZaDQotRU9jTEt2YmRmU0JXemtibw0KLURvRExLdmJkUmtaR1ZHa1QNCi1FT2NLanZiZHlYaGpDUHpMDQotRVBDa0t2YmRicmJrVGRKYQ0KLUVQRExLdmJkc1FWbmlidkcNCi1EbmJqanZiZHB5T2dmcGRZDQotRG9ETEt2YmR0dW5YaXFUQQ0KLUVQREtqdmJkcUdEZHN2QWgNCi1EbmNLanZiZGpFa0hVb0FPDQotRVBDamp2YmRHUUFUWEdmWg0KLUVPY0tqdmJkS0RKY1JLQ3gNCi1EbmNLanZiZGh5dUdNUW5HDQotRG9Da0t2YmRZa3JEc25NTg0KLURvQ2pqdmJkYU5LYlN1TWcNCi1FT2NMS3ZiZHJ5a3BUQWhPDQotRG5ia0t2YmRyU1VrTmtBbQ0KLUVQQ2pqdmJkd3pIZWV3ZVMNCi1Eb0RMS3ZiZFNCZEZNSllrDQotRG5iamp2YmRxVVVHclJqdA0KLURvREtqdmJkeml0b29jcnQNCi1FUERLanZiZHhuU2hYcmlEDQotRG9Da0t2YmRWdmlYdkVFZw0KLUVPYmtLdmJkRnh1VWFEeEMNCi1FT2JrS3ZiZHlnWk1BTWVYDQotRG5iamp2YmRpaWZIaWx4Uw0KLUVQREtqdmJkWnhjak9ETVMNCi1Eb0RMS3ZiZFdXaHhXRUZIDQotRVBDamp2YmR6b1FRZUNsWQ0KLUVPY0xLdmJkcHRVSFJxanQNCi1Eb0RLanZiZFZ2aVh1ZEVnDQotRVBETEt2YmRVUXBudVZIbQ0KLUVQQ2pqdmJkd3pIZkZ3ZVMNCi1FT2NMS3ZiZFp4Y2pOYmtyDQotRU9ia0t2YmRabm1oZGR5ag0KLURvRExLdmJkdmx2QU5EZG0NCi1FT2NLanZiZE1mYm9scFZMDQotRU9iamp2YmRiQXZGRnBRWA0KLUVPY0tqdmJkQmRQYVdKbGYNCi1EbmNLanZiZHFjZUlvbldCDQotRG9Da0t2YmR0Y0RWV3ZPbw0KLURvQ2tLdmJkZG9GVEtzc3INCi1Eb0RLanZiZGFNa0JydU1nDQotRVBDamp2YmRFdXlQb2xpZQ0KLURuYmtLdmJkT0Vjc2lKTEUNCi1EbmNLanZiZEhsQnpuV3FMDQotRVBES2p2YmRiaGxpamV3WQ0KLUVPYmpqdmJkZm9hendEd2gNCi1FT2NMS3ZiZGFOS2JTdGxnDQotRG9Da0t2YmRxZEVpUU9XQg0KLURvQ2tLdmJkVHZMcEtVQlINCi1EbmNLanZiZGtOQmt6RkhQDQotRU9ia0t2YmRGa0VyY0hsdQ0KLURvQ2tLdmJkWnNoaVljcm4NCi1FT2JqanZiZEVKaEp2WUtBDQotRG5ia0t2YmRPVFVXSEZVcA0KLURvRExLdmJkVmhYdlhmeHoNCi1FUERMS3ZiZEJkUGFXS01mDQotRU9iamp2YmRGZWpSbkpUcQ0KLUVQRExLdmJkVUx2UEJWb0oNCi1FUERLanZiZEp6cEZ3ZEFODQotRVBES2p2YmRxd1BrYmlaUg0KLUVQRExLdmJkckVGSW9tdWENCi1FT2NMS3ZiZGlqRmhKbHhTDQotRG5ia0t2YmRZa3JFVU9MbQ0KLURuYmtLdmJkSU1Cem5YUWsNCi1EbmNLanZiZFppc0hwSENHDQotRVBETEt2YmR6alVvcEVTdA0KLURuYmpqdmJkempVcFBjcnQNCi1FUERLanZiZHFaT2dmcGRZDQotRG9ES2p2YmR1THhYQXNhWA0KLUVPYmtLdmJkck15aXlNSGkNCi1FUENrS3ZiZHFUc2Zxckt0DQotRG9ES2p2YmRUZnpuTVhWZQ0KLUVPYmtLdmJkZG9FcmtVVHINCi1FT2NMS3ZiZEhFTFdLQ0pqDQotRG5jTEt2YmRVVmtwSnRBcQ0KLUVQQ2pqdmJkUk14QnhtdHoNCi1FUERLanZiZGpFamZ0b0FPDQotRU9jTEt2YmRZa3JEc21rbQ0KLURvRExLdmJkYWpsRm9OY0ENCi1Eb0NqanZiZG1KRHRSVXFhDQotRVBES2p2YmRUcVFvVXVJTg0KLURuYmtLdmJkdGNEVXZ2UFANCi1EbmNMS3ZiZHJiR01sSExaDQotRG5ia0t2YmRLZkdIYkFwdQ0KLURuY0xLdmJkR0ZqUm5Jc3ENCi1FUERMS3ZiZEp6cEdZRUFODQotRG9Damp2YmRreVNyU3lIVQ0KLUVPYmpqdmJkS1Z0ZkRkZmkNCi1FUERLanZiZE5yc3VnRlVwDQotRG9Da0t2YmROeE91emNtdA0KLURvRExLdmJkRGloSnV4S0ENCi1EbmJrS3ZiZHpkek96ZHpRDQotRG5jS2p2YmRtU1l1WnJjaQ0KLUVPY0xLdmJkcHRUZnFxa1UNCi1FUENrS3ZiZFZVTlRmTHZLDQotRG9Da0t2YmRHZEt1akJqSw0KLURvQ2pqdmJkeml0b3BFVFUNCi1Eb0RLanZiZHF2b2tiaVlxDQotRVBETEt2YmRHRmpTT0pUcQ0KLURvREtqdmJkbGlFVHFVckINCi1Eb0RLanZiZFppc0lRR2JHDQotRG9Damp2YmRuUVp5V0xaQw0KLUVPY0xLdmJkR2RLdWpDSmoNCi1FUENrS3ZiZGFSZkRJVUdMDQotRU9jS2p2YmRhdUNIWGp0SQ0KLURuYmtLdmJkYlFISERremQNCi1Eb0NqanZiZGRaeHBZWXBiDQotRU9ia0t2YmRiQldFZXBQdw0KLURuY0tqdmJkU0xZZlZHa1QNCi1FT2JrS3ZiZFZneFZ4SFl6DQotRG9Damp2YmRmcEJ6d0VZSQ0KLURvREtqdmJkbWZkeE1tZnkNCi1EbmNLanZiZGhhbmNFd1JSDQotRG5ia0t2YmRFQVNKTXpYWA0KLUVPYmpqdmJkbWZkd21OZnkNCi1EbmJqanZiZGhiT2NGWFFxDQotRG9Damp2YmRWZ3hWeEd4eg0KLUVQQ2tLdmJkUWNiYVFRZFMNCi1FUENqanZiZGhiT2JlWFJSDQotRVBES2p2YmRlUEZTa1VUcg0KLUVQRExLdmJkTW94UXVtZ1QNCi1Eb0NrS3ZiZElCa3lkekFEDQotRU9jTEt2YmRjYXNNckFVTg0KLURvQ2tLdmJkVVFxT3R0Z20NCi1EbmJrS3ZiZGVsZXZmbGpMDQotRU9iamp2YmRaZVhmemdpQw0KLUVQQ2pqdmJkUVltQUdycksNCi1FT2JqanZiZHhaaEdGeEZTDQotRU9iamp2YmRKdXVHRUVnSg0KLURvRExLdmJkRUFSaGx5dncNCi1FUERLanZiZFpkeEd6aEpDDQotRG9Da0t2YmR6UlBNaGl3QQ0KLURvQ2tLdmJkWnhjaW5DbFMNCi1FT2NLanZiZEZ5VlZCRVlDDQotRU9jTEt2YmR0YmNVd1ZvUA0KLURuY0xLdmJkbFpTclRZZnQNCi1FT2JrS3ZiZGFhVmVHUG93DQotRG5jTEt2YmRFS0lKdlhqQQ0KLURuY0xLdmJkYmhsaktmV3gNCi1FT2JrS3ZiZFZoWVZ4R3h6DQotRVBES2p2YmRtcFp4dWtaQw0KLURvRExLdmJkbkJpdnhPblYNCi1FT2JqanZiZFJiRUVraVpMDQotRVBDa0t2YmRaUk5GSWxlUg0KLURvRExLdmJkWnlFSm1ibFMNCi1EbmNLanZiZGtJR2tlZk5rDQotRVBES2p2YmRSa1pHVkdqcw0KLURuYmtLdmJkaUhKYnlWalYNCi1FUERMS3ZiZEZqZVNiZ2x1DQotRG5jTEt2YmRxRmNkdFZhSQ0KLUVPY0tqdmJkR1l1VkFkWUMNCi1Eb0NqanZiZHVhRVpTbmVJDQotRG5iamp2YmRLV1ZGZEZISg0KLUVPYmpqdmJkR2RMVmpDSmoNCi1EbmJrS3ZiZHBzc2dTU0t0DQotRG9Damp2YmRzc1JyeVpkYw0KLUVQREtqdmJkWmlzSVFIQ0cNCi1FT2NLanZiZENJamFqaGZLDQotRG9ES2p2YmRyYWZOTUdqeQ0KLUVPYmtLdmJkZ1FCendFWGgNCi1EbmJqanZiZGdRQnp3RHdoDQotRG5jS2p2YmRDRVFBdktNZg0KLUVQQ2tLdmJkaUNPY0ZXcHENCi1FUERMS3ZiZExGZkhiQlF1DQotRVBDamp2YmRKVFlhU21YbA0KLUVQQ2pqdmJkUmp5RnVHa1QNCi1Eb0NrS3ZiZGpGS2Z0b0FPDQotRG5jS2p2YmRtYWl3WG9OdQ0KLURvQ2pqdmJkVlpJVHlqbm4NCi1Eb0RMS3ZiZER4WUx0VVRsDQotRG5iamp2YmRxdnBMY0pZcQ0KLUVPY0xLdmJkbHF4dVpzRGkNCi1Eb0RLanZiZFpzaGh5RHNPDQotRG9Damp2YmRHRmpTT0lzcQ0KLURuYmtLdmJkY1NjS3RFS0INCi1FUENqanZiZE1wWHFWbWZzDQotRVBDamp2YmR1b1R6cGpvVQ0KLURvRExLdmJkWWtxY3ROa20NCi1FT2JrS3ZiZGRvRXJqc3RTDQotRG5iamp2YmR1THhXYVVBdw0KLURvQ2tLdmJkUlhPRGJrZ2MNCi1Eb0NqanZiZHd6SUdGd2VTDQotRG9Da0t2YmRaeUVLT0NsUw0KLUVPYmpqdmJkaUdqQ3h2SnUNCi1FT2JrS3ZiZGJpTWlqZXdZDQotRG9ES2p2YmRxclZLbWtCTg0KLURvQ2tLdmJkRnlVdUJFWUMNCi1Eb0RMS3ZiZE5zVHVmZHVRDQotRG9ETEt2YmRFUENrS3ZjRQ0KLURvRExLdmJkTlFZUldOZ1QNCi1EbmJqanZiZE5ydFdHZVVwDQotRG9Damp2YmRQeG1BR3Jxag0KLUVQREtqdmJkS05BRVpnVkINCi1FUERLanZiZG10dHpLalNHDQotRVBES2p2YmRzc1NTeHlkYw0KLURvQ2pqdmJkVGxXUEF1bmkNCi1FT2JqanZiZERITGVnQXpjDQotRU9iamp2YmRYblJBWHR2VQ0KLUVPYmtLdmJkS2ZGZ2FhUXUNCi1FT2NLanZiZGh0ekZYU1ViDQotRVBDa0t2YmRKVFpBc013bA0KLUVPY0tqdmJkUVltQUdzU0sNCi1Eb0NrS3ZiZGpoSExlZW1rDQotRU9jTEt2YmRpaWZJSm1ZUw0KLUVQREtqdmJkTHJXbHpWUXoNCi1Eb0NqanZiZHhzT0lsckJnDQotRVBETEt2YmROUHhRdk5mcw0KLURuYmtLdmJkSUdmeXh3eEgNCi1Eb0NqanZiZGpLRmhLTXdyDQotRG5iamp2YmRkaktTVnR6bg0KLURvQ2pqdmJkWm9OaUZFeksNCi1FUENqanZiZGVGT3FhdmNLDQotRG9ETEt2YmRFdXhwUU1pZQ0KLUVPYmpqdmJkWmpTaFFIQ0cNCi1Eb0RMS3ZiZFpNU0RzbWttDQotRG9ETEt2YmRHWXR1QkVZQw0KLUVQQ2pqdmJkVWFCcHJxUnkNCi1FT2NMS3ZiZG1velpXTFpDDQotRG5jTEt2YmRVV0xwS1VCUg0KLUVQQ2pqdmJkcVluaEhRY3gNCi1Eb0RMS3ZiZFVhQnBycHF5DQotRVBES2p2YmRyek1RU2FIbg0KLURuYmpqdmJkR2RMV0tDSmoNCi1FT2JrS3ZiZGZJTFZyTnFIDQotRVBDamp2YmRlaEt2Um1xSA0KLUVQREtqdmJkT1NzdkdlVlENCi1EbmNMS3ZiZHh4Skphb3pMDQotRVBDamp2YmRaTHFjdE5rbQ0KLUVPY0xLdmJkWnhjaW5Da3INCi1EbmNMS3ZiZGtXV21jYlh3DQotRG9ETEt2YmR1Q2NWWFdQUA0KLURuY0xLdmJkeVROaGxxYkgNCi1EbmNLanZiZFlUTUFsc29ZDQotRG9Da0t2YmRSb3NmakZjdw0KLUVQRExLdmJkRHd4THNzdE0NCi1FT2NLanZiZGxaVFJyeUhVDQotRG9Damp2YmROR2JwTXBWTA0KLUVPY0xLdmJkWWdXZEFPcmkNCi1Eb0NqanZiZER4WUxzdFRsDQotRU9iamp2YmRJd3RCZ2xSUQ0KLUVPY0tqdmJkdlBUenBrUFUNCi1Eb0NqanZiZHVMeFhBdEJYDQotRG9Damp2YmRpTGVFTnVDeQ0KLURuYmpqdmJkVWFDUlNxUnkNCi1EbmJqanZiZFlwbUVobGVSDQotRU9iamp2YmRzUHZPakRXRw0KLURvQ2tLdmJkTEZmSUNBcHUNCi1EbmNLanZiZGR4WnN0UmV6DQotRVBDa0t2YmRGeVZWQWRYYg0KLURvQ2pqdmJkRnlWVkJEeEMNCi1Eb0RMS3ZiZEZlaXJOaVRxDQotRVBDamp2YmR4blNneFRJYw0KLUVPY0tqdmJkQU1neVN3WngNCi1FT2JrS3ZiZGt5VFJyeUhVDQotRG9Da0t2YmRNUndNelVweg0KLURuYmpqdmJkQ1d6ZEpFb3YNCi1Eb0NrS3ZiZFV5SVR6TFBPDQotRVBDa0t2YmRjU2Jqc2RLQg0KLURvQ2tLdmJkcWNlSW9uVmENCi1Eb0NrS3ZiZGptQ01aZUdvDQotRG5jS2p2YmRmTWV3R2xqTA0KLUVPYmtLdmJkcGZFRXRWYUkNCi1Eb0RMS3ZiZGN6WlFZWXFDDQotRG9ETEt2YmRSTlhiWW10eg0KLUVPYmpqdmJkVHZMb2pVQlINCi1FUENrS3ZiZHRiY1ZYV1BQDQotRG5jTEt2YmRtU1l1WnJkSg0KLURvRExLdmJkVHVrcEtVQlINCi1FUERMS3ZiZHNRVm9LQ3ZHDQotRVBETEt2YmRCcmFDdEZ2cg0KLUVQRExLdmJkWlFtRWlORXENCi1FUENqanZiZHJ6TG9zQWduDQotRVBDamp2YmRzc1JzWlpkYw0KLURuY0tqdmJkYkF1ZGVwUVgNCi1EbmNLanZiZGNUREtzY2lhDQotRG5jTEt2YmRscXlWWnNFSg0KLUVPY0xLdmJkYlZDSFhrVGgNCi1FT2JrS3ZiZFlUTUJNc254DQotRG5iamp2YmRVTHZQQXVvSg0KLURvQ2pqdmJkZHRBVUFTbHYNCi1Eb0RLanZiZHhVbUVweGtuDQotRG5jS2p2YmRRd09FRExnYw0KLURvQ2tLdmJkU1BzZ0tHRHcNCi1EbmNLanZiZGlDT2NGWFFxDQotRVBES2p2YmRSa1lmVWZrVA0KLUVPYmtLdmJkS0NqRFJKY1kNCi1Eb0NqanZiZFpMcWN0T01ODQotRVBDamp2YmRVV0xwS1RhUg0KLUVQQ2pqdmJkTHF3TXpWUXoNCi1EbmJqanZiZG5CaXZ4UE51DQotRU9ia0t2YmRScFVIS0ZkWA0KLUVQQ2pqdmJkZUFUcU5YaWYNCi1Eb0NqanZiZGZJTFZyT1FnDQotRG9ES2p2YmROcnRWZmVVcA0KLUVPY0xLdmJkTlVyckttQVgNCi1FUENqanZiZHJiRmxsSExaDQotRG5jS2p2YmRrRE1MUWdVZw0KLURvQ2tLdmJkVnZod3ZEZUgNCi1EbmJqanZiZEtlZWdhYVJWDQotRG9ES2p2YmRjSk1qS2ZYWQ0KLURuYmpqdmJkWnRKSlljcm4NCi1Eb0RMS3ZiZHlxT2xpSndBDQotRG9ETEt2YmRNZ0RQbVB1TA0KLURvQ2tLdmJkSGZmelpYeEgNCi1Eb0NqanZiZFp4ZEtOYmxTDQotRVBES2p2YmRrRExqcUd0Zw0KLUVQREtqdmJkWXpiZXFqVnkNCi1EbmNMS3ZiZFRwcG50dGdtDQotRU9ia0t2YmRWWWd0Wmpubg0KLUVQQ2pqdmJkemFBT2dIQ00NCi1FT2NLanZiZGN5eG94WlJDDQotRVBETEt2YmR4blNneFRKRA0KLUVPYmtLdmJkZk1mWEhOSmsNCi1FUERLanZiZHVuc3pwam9VDQotRU9ia0t2YmRGZktSbWhzcQ0KLUVPY0xLdmJkaHR5ZHdSdGINCi1Eb0RMS3ZiZFlrckRzbkxtDQotRVBETEt2YmRHR0tTT0l0Ug0KLUVQQ2tLdmJkdURDdVhWbm8NCi1FUERMS3ZiZHJFRkpRT1ZhDQotRVBETEt2YmRJakVBS1FHZA0KLUVPYmpqdmJkSXJ5QXJtWU0NCi1Eb0RMS3ZiZFlrcWN0T01ODQotRVBDa0t2YmRpWnRla3FPRw0KLURuY0tqdmJkemR6T3plWnANCi1Eb0RMS3ZiZGJpTktMRndZDQotRG5ia0t2YmRsaGNzcVVyQg0KLURuYmtLdmJkS3lSSnJ6dUcNCi1Eb0RLanZiZE9GRHRJaUtkDQotRG5iamp2YmR2dmxCV0JWdQ0KLURuYmtLdmJkbHJaVXlyZEoNCi1FT2JrS3ZiZHhaZ2Vld2RyDQotRG5jS2p2YmRlZ2tWck5wZw0KLURvQ2pqdmJkckpBSmVOUEYNCi1FT2JqanZiZG1mZVhtT0haDQotRG9Damp2YmROUHdxVm1mcw0KLURuYmpqdmJkblB6WXZMWkMNCi1FUERLanZiZFpzaGlZY3JuDQotRU9jTEt2YmRoZ0pjWXZKdQ0KLURvRExLdmJkWHJsQW1Ub1kNCi1EbmJrS3ZiZHdXbEF2QlZ1DQotRG5ia0t2YmRqdlduRUJ3dw0KLURvRExLdmJkVFlMTG16angNCi1FT2NLanZiZERpaEp1eEtBDQotRG5jTEt2YmRUZnpuTHZ1ZQ0KLURvQ2pqdmJkVmd3dlhnWXoNCi1FT2JqanZiZHNCZk1rZ0t5DQotRVBDamp2YmRVYUJxVFFyWg0KLURuYmpqdmJkYmhtSmtHV3gNCi1FUENqanZiZExCTEdtQ1lSDQotRG9ES2p2YmR3andFSHp5Zg0KLUVQRExLdmJkZWdrVnJOcGcNCi1Eb0NrS3ZiZEpwekVuZk9GDQotRVBDa0t2YmRGZWpTT0l0Ug0KLURuYmpqdmJkVHFRbnVVaE4NCi1FT2NMS3ZiZFVNVm9Bdk9pDQotRVBDa0t2YmRTQ0VGTGlaTA0KLUVQQ2tLdmJkbkNLWFlQTnUNCi1FUERMS3ZiZFp5RUtOYmtyDQotRG5jTEt2YmRaaXNJUUdhZg0KLUVPYmpqdmJkR0xFc0RIbVYNCi1Eb0NqanZiZEJjcEF1ak5HDQotRU9iamp2YmRaUk5GSWxlUg0KLURuYmpqdmJkVnJPWGFlTGMNCi1FUENqanZiZEhFTFZpYWlqDQotRU9jTEt2YmRxY2RocE52Qg0KLUVQQ2tLdmJkaVp1RmtxT0cNCi1Eb0NrS3ZiZE9Tc3VmZVZRDQotRG9ETEt2YmR1b1R6cGpudA0KLUVPY0xLdmJkVHFSUFV1SG0NCi1Eb0RMS3ZiZENEcEF1aWxmDQotRU9jS2p2YmRaTVNEc25NTg0KLURvRExLdmJkWXFORkpNZVINCi1EbmJrS3ZiZGJBdkZGcFB3DQotRU9jS2p2YmRWcW13YWVNRA0KLUVQQ2tLdmJkVXlIc3lqbm4NCi1FUENqanZiZEtlZWhCYVF1DQotRG9Damp2YmRac2hpWWRUTw0KLUVPYmtLdmJkVHZNUUpzYVINCi1FUENqanZiZGpibEtxSFVnDQotRG5ia0t2YmRZbFNEdE9NTg0KLUVPYmtLdmJkcldwTUNpWlINCi1FT2NLanZiZFVHem1sV3VlDQotRG5jS2p2YmRGeVV1QWN3Yg0KLUVQQ2tLdmJkTFpRalN6dGYNCi1FUENqanZiZGZqZnpiZkFFDQotRG5jS2p2YmRGV1pRUU1pZQ0KLURvQ2pqdmJkVmd4VnhIWXoNCi1FT2NLanZiZFdXaHhXRUZIDQotRG9ETEt2YmRVV0xvaXRBcQ0KLURvRExLdmJkemFBT2ZmYk0NCi1FT2NMS3ZiZHJYUGtiaVlxDQotRG9Da0t2YmRZemJlcktWeQ0KLURuY0xLdmJkSU1Cem5XcGsNCi1FUENrS3ZiZEVQQ2tLd0RFDQotRG5ia0t2YmRXV2lZVmNkZw0KLURvQ2tLdmJkQ1d6Y2hkcFcNCi1FT2NMS3ZiZGp2WE5jYllYDQotRVBETEt2YmRTeExNTnpqeA0KLURuYmpqdmJkaGZpY1l1aXUNCi1EbmNMS3ZiZHZtV0FNZEVtDQotRU9iamp2YmR1YUR5VE9kaA0KLURuY0tqdmJkd1dsQXZCV1YNCi1Eb0RLanZiZFZ2aVlXRGVIDQotRU9jS2p2YmROc1VXR2R0cA0KLURvQ2pqdmJkempWUG9kVFUNCi1FUENrS3ZiZG1JY3NwdHFhDQotRVBETEt2YmRJSEhaeHhZSA0KLUVQRExLdmJkVXlJVVprUE8NCi1FT2JrS3ZiZENEcEJXSmxmDQotRVBES2p2YmRXU053YWVNRA0KLURvQ2pqdmJkQUNyWGpaaHANCi1FUERMS3ZiZHd1TWRxWWxPDQotRG5iamp2YmRIbEJ6bldwaw0KLURuYmpqdmJkdWFEeVRQRWgNCi1EbmJqanZiZHd1TkZSWkxuDQotRU9iamp2YmRhamtmT25EQQ0KLURuYmtLdmJkV1dpWVdFRWcNCi1FUERMS3ZiZGZmTHltZ0hBDQotRU9jTEt2YmRrRE1LcGZ1SA0KLUVQRExLdmJkTW94UXZPSFQNCi1EbmJrS3ZiZGJLa2VubWNBDQotRG9Damp2YmRoeXRmTVJOZg0KLURvQ2pqdmJkSXNaQXNOWGwNCi1Eb0RLanZiZExpQmtxWUFTDQotRG5jTEt2YmR5emRtckhpSQ0KLURuYmpqdmJkZW1GdmZtSmsNCi1FT2NMS3ZiZFNDRUVraVlrDQotRG9ES2p2YmRiaU5LS2V2eA0KLURvRExLdmJkYWFWZGVvb3cNCi1EbmJqanZiZE5HY1FOUHVMDQotRG5jTEt2YmRRWW1BR3JySw0KLUVQREtqdmJkcmJHTWtmankNCi1FUENqanZiZFpqU2hQZmJHDQotRG5iamp2YmRKbUFEeWZ1Qg0KLURuYmpqdmJkaHR6RldxdUMNCi1EbmJqanZiZFF2bWRETUlEDQotRG5jTEt2YmRqdlduRUJ3dw0KLUVQQ2pqdmJkeFpnZkdYZHINCi1FT2JrS3ZiZERpaEtXWGpBDQotRVBDa0t2YmRaTVNFVG5MbQ0KLUVQREtqdmJkWkxxY3NuTU4NCi1FT2JrS3ZiZHF3UGxESlpSDQotRG9ES2p2YmRaaXNJUUdhZg0KLUVPYmpqdmJkamxhbFplR28NCi1EbmNLanZiZHhzT0pNcWFnDQotRG9ES2p2YmRPRkVVSWhrRQ0KLURvQ2tLdmJkeml0b29kU3QNCi1EbmNMS3ZiZFZyTndhZU1EDQotRG9Damp2YmRlenV5RWlUdw0KLUVQREtqdmJkaUNPY0V2cHENCi1Eb0NqanZiZHZ2bEF2QXZWDQotRG5iamp2YmRKdXVGY2VISg0KLURvQ2pqdmJkbFlyclN5R3QNCi1FUENrS3ZiZGZJTFZyTnFIDQotRG9ETEt2YmR4c09KTlJiSA0KLURuY0tqdmJkSXd0QmdrcHANCi1EbmJrS3ZiZE9UVVdIRXRwDQotRVBES2p2YmRGZWpSbklzcQ0KLURuYmpqdmJkVkJDUlRRcloNCi1FUENqanZiZGlNRWNuVWNaDQotRU9ia0t2YmRpWnVHTVJOZg0KLUVPY0tqdmJkYXRiSFlMVGgNCi1Eb0NrS3ZiZG1TWlZacmRKDQotRG9ES2p2YmRxVHNnUnFqdA0KLURvRExLdmJkQ0VRQldLTkcNCi1EbmJqanZiZFp0SkpaRVNuDQotRG5jTEt2YmRJSEd6Wlh3Zw0KLUVQRExLdmJkd3RtRlJaTU8NCi1Eb0NqanZiZEtESmJxSmNZDQotRU9ia0t2YmRhdGJIWGtVSQ0KLURuYmtLdmJkWXFORWhsZVINCi1FT2JqanZiZE5IQ29sb3RrDQotRVBES2p2YmRlZ2tXU05wZw0KLURvRExLdmJkUmp5RnRmanMNCi1Eb0NqanZiZGRvRXNLdFVTDQotRU9jTEt2YmRzUVdPakN2Rw0KLURvQ2tLdmJkdkFjeHNPZUkNCi1FT2JqanZiZGJBdWVHUVFYDQotRU9jTEt2YmR4S3dFSHp6Rw0KLURvREtqdmJkcVR0SFNSa1UNCi1FT2NLanZiZE9BSXNVS1NBDQotRVBDamp2YmRXU054Q0VsRA0KLUVQRExLdmJkbkNLV3dvTnUNCi1EbmNMS3ZiZEVBUmlNelhYDQotRG9Da0t2YmRiQXZFZW9vdw0KLUVPY0tqdmJkaGdKY1l2SnUNCi1EbmJqanZiZFR1bFBpc2FSDQotRG5iamp2YmRJaWRBS1FHZA0KLUVQREtqdmJkeU9USVhyaGMNCi1FUENrS3ZiZHJiRm1MZ0xaDQotRVBDamp2YmRkZU9xYlhESw0KLURuY0tqdmJkUmFjZGxKWkwNCi1FT2NMS3ZiZGJzREt0RGpCDQotRVBDamp2YmRVeUh0WmtPbg0KLUVPYmtLdmJkeVRPSW1TQmcNCi1EbmNLanZiZHRiYnR3V1BQDQotRVBES2p2YmRLREtEUkpjWQ0KLUVPYmpqdmJkaGFuYmVYUXENCi1FT2NMS3ZiZHZ2bEF1YVdWDQotRVBETEt2YmRWWWdzeWpvTw0KLUVQRExLdmJkS2FLZmxhd3ENCi1FT2NMS3ZiZENJamFqaUZqDQotRU9ia0t2YmRVc21VR01XSw0KLUVQRExLdmJkSWpFQUpvZmQNCi1FT2NMS3ZiZHFCSkZBV2hFDQotRVBDa0t2YmRFSmdpdlhqQQ0KLURuYmtLdmJkWWtxZFRta20NCi1FUENrS3ZiZGxpRHNxVXJCDQotRU9iamp2YmRLVnRmRUVmaQ0KLUVPYmtLdmJkbWdGWU1tZ1oNCi1FT2JqanZiZEVBUmhseXZ3DQotRG5jS2p2YmRhUmVjSHRHTA0KLURuYmpqdmJkTlFZUlZtZnMNCi1FT2NMS3ZiZEZmS1JuSlRxDQotRG5jTEt2YmRNZ0RRTlFVaw0KLUVPYmtLdmJkSGdHeXlYd2cNCi1FUENrS3ZiZENKS2JLaUZqDQotRVBDa0t2YmRCcmFEVUdYUw0KLUVQRExLdmJkaU1FY25WQ3kNCi1Eb0RMS3ZiZGtDa2tRZnVIDQotRU9jTEt2YmR3dG1GUlpMbg0KLUVQREtqdmJkS2VmSGJBcHUNCi1EbmJrS3ZiZGt4cnFzWkd0DQotRVBDa0t2YmRmSUt2Um1xSA0KLUVPY0tqdmJkRG5ia0xXYmQNCi1FUERMS3ZiZGFSZWJoVGVrDQotRG9ETEt2YmRqdXdPRGF4WA0KLURuYmpqdmJkUkVEQlBwZFMNCi1EbmNMS3ZiZGp1d05jYXd3DQotRU9jS2p2YmRiaU1qS2V2eA0KLUVQREtqdmJkcXZwTGNJeVINCi1FUENqanZiZGlqR0lLTXhTDQotRVBETEt2YmRRbVlDWk50eg0KLUVPYmpqdmJkQ0RwQXZLTWYNCi1FT2NMS3ZiZEpKZEFLUGdFDQotRG9ES2p2YmRVeGdzekxPbg0KLURuYmpqdmJkT0Vjc2hoamQNCi1Eb0NqanZiZFVhQ1JTcHJaDQotRVBDa0t2YmR4bXJoWVRKRA0KLUVQREtqdmJkSUNMeWR6QUQNCi1FUENqanZiZEtSWmRvRm1lDQotRU9ia0t2YmROZGN0SklqZA0KLUVQQ2pqdmJkS1Z1RmRFZ0oNCi1FT2JqanZiZHJYUGxESXlSDQotRG9Da0t2YmRmTWV3R21LTA0KLURuYmtLdmJkSXdzYWhNUXANCi1FT2NMS3ZiZFJhY2VNSXhrDQotRVBDa0t2YmRjeXhveFpRYg0KLUVPYmpqdmJkUmtZZXVHa1QNCi1EbmNMS3ZiZGJWQmZ3a1RoDQotRU9iamp2YmRUcHBvVlVoTg0KLUVQQ2pqdmJkaHl0Zk1ST0cNCi1FT2NLanZiZFV4Z3N6S29PDQotRG9Damp2YmRHTEVzREhsdQ0KLUVPYmtLdmJkZWdrVnFtcUgNCi1EbmNLanZiZGtNYkx5ZUdvDQotRG5jS2p2YmR5emRtcWdoaA0KLUVQQ2tLdmJkR0ZpcW5Jc3ENCi1FUERLanZiZHBzdEdxcWp0DQotRVBES2p2YmRZa3JEc21rbQ0KLUVQQ2tLdmJkS2FMR2xiWHENCi1Eb0NrS3ZiZHh3aUpiUHlrDQotRVBDa0t2YmRKY0tEUWlieA0KLUVQQ2tLdmJkdURDdVhXUFANCi1EbmJqanZiZGlHaWNaV0tWDQotRG9Da0t2YmRzUHVuaWNXRw0KLURuYmpqdmJkS05BRVpnVkINCi1FUERMS3ZiZG5QeXh1anlDDQotRU9ia0t2YmRKWHNhZ2twcA0KLUVPYmtLdmJkTmRkVUlpS2QNCi1EbmJqanZiZFF3T0VDbElEDQotRG5ia0t2YmRGVnhwUU1pZQ0KLUVQQ2tLdmJkVnJOeEJlTGMNCi1FUENqanZiZFVzbVVHTHVqDQotRVBETEt2YmRHWlZWQkR3Yg0KLURvQ2pqdmJkbVJ5VXlyZEoNCi1EbmNLanZiZGRaeG94WlFiDQotRG5iamp2YmRHS2RzRElOVg0KLUVPYmpqdmJkcmFmTkxnS3kNCi1Eb0NqanZiZEpiakNxSmJ4DQotRG5iamp2YmRsWXNTVFlnVQ0KLURvQ2tLdmJkUXZuRGJsSUQNCi1Eb0RLanZiZHNzU1RZekZEDQotRG5jS2p2YmRtb3paVmtaQw0KLUVQREtqdmJkamJra1JHdUgNCi1Eb0RMS3ZiZHhtcmd3cmlEDQotRG9ES2p2YmRmSGtWck9SSA0KLUVQQ2tLdmJkSnV1RmNlSEoNCi1Eb0RLanZiZGNiU2xyQVRtDQotRVBDa0t2YmRlQVRwbVhpZg0KLURuY0xLdmJkQmlLYWpoZWoNCi1FUENrS3ZiZHJOWml4bElKDQotRVBETEt2YmRLVnRlY2VHaQ0KLUVPYmtLdmJkempWUG9kVFUNCi1Eb0RMS3ZiZFdTTnhDRWtjDQotRU9jS2p2YmRaeGNpbWNMcg0KLUVPY0tqdmJkWm5uSWVFeWoNCi1EbmJrS3ZiZG1iS1d4UE9WDQotRVBDa0t2YmRaTHJFVG1rbQ0KLUVQREtqdmJkblV0eWppcWYNCi1Eb0NrS3ZiZHJXcExjSlpSDQotRG9Da0t2YmRhTWtDU3RtSA0KLURuY0xLdmJkRlZ4cFFNaWUNCi1FUENqanZiZHJwV09pY1dHDQotRU9jS2p2YmR5T1RJWVNoYw0KLUVPYmtLdmJkcXJWTE5rQk4NCi1FT2NMS3ZiZFF2bkRia2hEDQotRU9jTEt2YmREaWdpdXhLQQ0KLURuY0xLdmJkZG9FcmtUdFMNCi1Eb0RLanZiZFJXbWRETGdjDQotRVBDamp2YmRpSEtEWlZqVg0KLURuYmtLdmJkQURTWUtaaVENCi1EbmJrS3ZiZHNQdW5pYnVmDQotRG9Damp2YmRTUHNmaWVkWA0KLUVQREtqdmJkSm1BRVpmdGENCi1FT2NLanZiZFpNUmNzbkxtDQotRG9Da0t2YmRpTGRkT1VjWg0KLUVPYmtLdmJkcXF0a09MQW0NCi1Eb0RMS3ZiZFlwbUZJbUZSDQotRU9iamp2YmRWaFlXWGZ4eg0KLURuYmpqdmJkTW93cVdOZnMNCi1FT2JrS3ZiZFZnd3V3Z1l6DQotRG9ES2p2YmREeFlMc3NzbA0KLURuYmpqdmJkWnRJaVljc08NCi1EbmJrS3ZiZHh3aUtCcFprDQotRG9ES2p2YmRFdXhwUG1LRg0KLUVPY0tqdmJkSmNLRFJLQ3gNCi1FT2JrS3ZiZFV0TlVGbFdLDQotRU9jS2p2YmRqaEhMZkZuTA0KLURvQ2tLdmJkU1FUZ0tHRHcNCi1EbmNMS3ZiZFFjY0JRUkRyDQotRG5jTEt2YmRJTGF6bXdSTA0KLURvREtqdmJkWVRNQk5VUFkNCi1Eb0RMS3ZiZEthS2ZtQ1hxDQotRVBDamp2YmRrSUhNR0dPTA0KLURuYmpqdmJkQ0lqYktoZksNCi1EbmJrS3ZiZFZnd3V3Znh6DQotRVBDamp2YmR3dG1GUXhrbg0KLUVQRExLdmJkY3l5UVlaUkMNCi1Eb0RLanZiZFB5TkFHc1JqDQotRU9iamp2YmRTTFlldGdMVA0KLURvRExLdmJkTVJ3Tlp1UXoNCi1EbmNLanZiZEZqZHJjSGx1DQotRG9Damp2YmRaeURpbWJrcg0KLURuYmtLdmJkUlhOZENsSUQNCi1FT2JqanZiZEVZWUx0VVRsDQotRU9ia0t2YmRWcW14QmRsRA0KLURvRExLdmJkcHRUZ1Jxa1UNCi1FT2NMS3ZiZEJkUGFXS01mDQotRVBDamp2YmRpQm5jRXZwcQ0KLURvRExLdmJkelFvTkpLWEENCi1Eb0RLanZiZFVRcG9VdGdtDQotRG5ia0t2YmRyekxwVEJIbg0KLURvQ2pqdmJkdW5zenBrUFUNCi1FUERMS3ZiZFNaakhzQ3ZBDQotRG5jS2p2YmRSb3RISmZEdw0KLURuYmtLdmJkRmVqU09JdFINCi1FT2NLanZiZGVGT3JCd0NqDQotRG9ETEt2YmRrVndOZENYdw0KLUVQQ2tLdmJkZU9kcmp0VHINCi1FUENqanZiZGh1WmR3UnVDDQotRG5ia0t2YmRmSUxWcW1xSA0KLURuY0tqdmJkblB6WXZMWWINCi1EbmNLanZiZEhnR3paWVhnDQotRG5jS2p2YmRrVndOY2F4WA0KLURvRExLdmJkT0FKU3NqU0ENCi1EbmNLanZiZE9GRHRKSWpkDQotRU9jTEt2YmRWZ3d2WUd4eg0KLUVPYmtLdmJkc1FWbmpEV0cNCi1Eb0NqanZiZFpqU2hRSENHDQotRG5jS2p2YmR6b1BwZUNreA0KLURvRExLdmJkU0xaRnRmanMNCi1EbmJrS3ZiZEJzQkN0RnZyDQotRU9jTEt2YmRGeVV1QWN3Yg0KLURuYmpqdmJkcVVUZnFyS3QNCi1Eb0NqanZiZFp4ZEptY0xyDQotRG5jTEt2YmRtYkp3WVBPVg0KLUVPYmpqdmJkRU9iamtYREUNCi1FT2NLanZiZGFTRmNJVUdMDQotRVBDa0t2YmRxWW9JSFFjeA0KLUVPY0tqdmJkZk5HV2dNakwNCi1Eb0NqanZiZGJyY0t0RUtCDQotRVBDa0t2YmR2QkR4c09kaA0KLURuYmpqdmJkdGNDdVhWb1ANCi1EbmJqanZiZHJwV1BLRFZmDQotRU9jS2p2YmR3eWhGZllGUw0KLUVQQ2pqdmJkblB5eVdMWkMNCi1FUERMS3ZiZHVNWVhCVUF3DQotRG9ES2p2YmR1YUR5U29GSQ0KLURvQ2pqdmJkeVhpS0NQekwNCi1EbmNMS3ZiZEdGalNPSXNxDQotRG9ETEt2YmRlRW9SYlhESw0KLURuY0xLdmJkY1RDanREaWENCi1EbmJqanZiZG5VdVpqaXFmDQotRG5iamp2YmRqbGFrekZIUA0KLUVPY0xLdmJkd1dsQldBdlYNCi1EbmJrS3ZiZFdXaVh1Y2VIDQotRU9ia0t2YmRlbUdXZm1LTA0KLUVPYmtLdmJkbXVVeWtKckcNCi1Eb0NrS3ZiZG1vell2S3hiDQotRG5jS2p2YmRRWk5BR3NTSw0KLUVPYmpqdmJkamJsS3BnVWcNCi1EbmNLanZiZFNaaWdzRFdBDQotRU9jTEt2YmRaeUVKbWJsUw0KLURvQ2pqdmJkbkNKd1lPbXUNCi1FUERLanZiZHRreFdhVGFYDQotRVBES2p2YmRHWlV1QWN3Yg0KLURvQ2tLdmJkeWZ4bEFORXcNCi1FUENrS3ZiZFRBRkpJQm5kDQotRG5jS2p2YmRaTHFjdE9NTg0KLURuY0tqdmJkVU1XUEJXUEoNCi1FUENrS3ZiZER3d2tzc3RNDQotRVBES2p2YmRFT2JqanZiZA0KLUVPYmpqdmJkV1hKWVdFRWcNCi1EbmJqanZiZHBhSWVBWElFDQotRG9Damp2YmRxWW9JSFJFWQ0KLURuYmpqdmJkdm1XQU1jZU4NCi1FT2JrS3ZiZExGZkhhYVF1DQotRU9jTEt2YmRwYUllQVdnZA0KLUVQRExLdmJka0Nra1FnVWcNCi1EbmJqanZiZGVQRXJrVHRTDQotRG5ia0t2YmROR2JvbVFWTA0KLURvRExLdmJkRVBDamtXY0UNCi1Eb0NrS3ZiZGVoTFdSblJIDQotRU9jS2p2YmR5WGhpYlFaaw0KLUVPY0xLdmJkWnlFS09Da3INCi1Eb0NqanZiZGtETGtSR3RnDQotRG9ETEt2YmRrYU5QTkFMQQ0KLUVPYmtLdmJkcldwTGJpWXENCi1Eb0RMS3ZiZGZIa1ZxbXFIDQotRG9ETEt2YmRFT2NMS3dDZA0KLURvREtqdmJkcnlrcFRCSG4NCi1EbmNLanZiZHhaZ2VmWUZTDQotRG5ia0t2YmRKcHpGUEZuRg0KLURvQ2tLdmJkTkdjUG1QdGsNCi1FUENqanZiZGh6VWVsUk5mDQotRU9ia0t2YmRWVGx0RmxXSw0KLURvQ2tLdmJkdWFEeHJuZUkNCi1FT2JrS3ZiZFNRVGdKZkVYDQotRU9jS2p2YmRWaFlWeEhZeg0KLUVPY0tqdmJka0Nra1FnVWcNCi1FT2JrS3ZiZHFVVUhTU0xVDQotRU9jTEt2YmR1THd3QXRBdw0KLUVQREtqdmJkWkxyRVRuTU4NCi1FT2JrS3ZiZG10dHlqalJmDQotRG9ES2p2YmRZcU1kaU1kcQ0KLURvQ2tLdmJka05Ca3pFZm8NCi1EbmNLanZiZGlMZURuVWNaDQotRG9ES2p2YmRaTHJEc25MbQ0KLUVQQ2tLdmJkdVZuWUtSVEENCi1FUENqanZiZENJa0NMSkZqDQotRVBES2p2YmRzc1JyeHllRA0KLURuY0tqdmJkUXdPRUNsSGMNCi1FUENrS3ZiZHdYTGFXQXV1DQotRVBDa0t2YmRVeUhzektvTw0KLUVQQ2tLdmJkSllUYWdrcVENCi1Eb0NrS3ZiZHd1TkZSWWxPDQotRVBDamp2YmRmSGtXUm1xSA0KLUVPY0tqdmJkZGVPcWJYQ2oNCi1FT2JrS3ZiZGhmaWNZdWpWDQotRVBDa0t2YmRtU1l0elRFSg0KLUVQQ2pqdmJkdGt4V2FUYVgNCi1FUERMS3ZiZHd5Z2ZHWUVyDQotRVBES2p2YmRtcFp4dkt5Qw0KLURvQ2pqdmJkcHN0R3JTTFUNCi1FUERLanZiZFV0TXRHTHVqDQotRU9jS2p2YmRqbGJMekZHbw0KLUVPYmtLdmJka3lUU1RaR3QNCi1FT2NMS3ZiZExZcGpTenVHDQotRVBETEt2YmR5WGhpYlFaaw0KLURuY0tqdmJkcHRVSFNSa1UNCi1EbmJqanZiZEZmS1JtaHRSDQotRG9Damp2YmR0YmNVd1ZvUA0KLUVQREtqdmJkaHl1RmtwbkcNCi1FUERMS3ZiZEZwQVN3SEZ5DQotRVBDamp2YmRSYkRlTGlZaw0KLURuY0xLdmJkWG1xQVlVdXQNCi1FT2JqanZiZHFseWpaTGdpDQotRG9Damp2YmRzc1NUWXlkYw0KLURuYmtLdmJkVEl6SnFBQk0NCi1FUENrS3ZiZHhzT0pOUmFnDQotRVBDamp2YmRsaGNzcHVTQg0KLUVPYmtLdmJkcVVUZ1NSanQNCi1FT2NLanZiZE9FY3NoaGtFDQotRU9iamp2YmR6alVwUGRUVQ0KLURuYmtLdmJkdndMYVZhV1YNCi1FUENqanZiZG1veXlWa1liDQotRG9Da0t2YmRPRkVUaUpLZA0KLUVQQ2pqdmJkZUVucWF3Q2oNCi1FT2JqanZiZG11VXpLalJmDQotRVBETEt2YmRWdmh4VmRGSA0KLUVQQ2tLdmJkYVNHREhzZWsNCi1FUENqanZiZGt5U3JUWkhVDQotRU9iamp2YmR0QUdxSUFCUw0KLUVPYmtLdmJkWnlFSm1ibFMNCi1EbmNLanZiZHlUT0pNckNIDQotRG5jTEt2YmRGV1lvb2xpZQ0KLURvRExLdmJkVHZNUGpVQXENCi1FT2JqanZiZFpMcWN0T0xtDQotRG5ia0t2YmRtSWN0UXVTQg0KLURvQ2tLdmJkWkd2ZEFQVEoNCi1Eb0NqanZiZGtETUxSR3VIDQotRG9ETEt2YmRuVlV5a0tTRw0KLURvREtqdmJkTEdGaEJhUlYNCi1EbmNMS3ZiZHh3aUtCb3pMDQotRG5jTEt2YmRXSVlXWGdZeg0KLURuY0xLdmJkRmtGU2JnbHUNCi1Eb0RLanZiZElHZ1p4eFhnDQotRG5iamp2YmRFenRSRk1ESg0KLURvRExLdmJkWlFsZGlORXENCi1FT2NMS3ZiZHdXa2FXQXZWDQotRG9ES2p2YmRMQkxITWF3cQ0KLURvRExLdmJka01iTHpGR28NCi1FUERLanZiZFJFREFvcGNyDQotRG9Da0t2YmRab05pRWR5ag0KLUVQRExLdmJkZG5lU2tVVVMNCi1EbmJrS3ZiZFNRVUhKZWN3DQotRG9Damp2YmRac2hoeGNybg0KLURuYmpqdmJkUmtaRnVITFQNCi1FUERLanZiZHd1TkVxWWtuDQotRG9ETEt2YmRlbUdYR21Kaw0KLUVPY0xLdmJkS1dWR0RlR2kNCi1Eb0NrS3ZiZFdTT1hhZGtjDQotRU9iamp2YmRWVG1UZWxXSw0KLURuY0tqdmJkaGtlRG11RFoNCi1FUENrS3ZiZFJXbkVETUlEDQotRG5iamp2YmROUVlSVm5Hcw0KLURuYmtLdmJkVGZ6bWxXdkYNCi1Eb0NrS3ZiZEZwQVN2Z0daDQotRG9Damp2YmRxVHNmcXFrVQ0KLUVPYmtLdmJkVVZrcEtVQXENCi1Eb0RMS3ZiZHJSdGtOamFODQotRVBDa0t2YmRySkFLRW1PZQ0KLURuY0tqdmJkSUdmeXlZWGcNCi1EbmJqanZiZFpMckR0TmttDQotRU9iamp2YmRpTUVjbXVDeQ0KLURuY0tqdmJka3lUU1RaSFUNCi1EbmNMS3ZiZEJzQWJ0RnZyDQotRG5ia0t2YmRycFdQS0RXRw0KLURuY0tqdmJkYkJXRkZvb3cNCi1Eb0RMS3ZiZHhtc0lYc0pEDQotRG5ia0t2YmRlaExXUm5SSA0KLUVPYmtLdmJkaVZaZVhSdUMNCi1EbmJrS3ZiZE9UVVZmZHVRDQotRG5jTEt2YmRaalRJUUhDRw0KLURvRExLdmJkT1NzdWdGVlENCi1Eb0NqanZiZHJhZk5MZ0t5DQotRVBETEt2YmROUHhSVm1nVA0KLUVQREtqdmJkSGxCem5YUWsNCi1FUENrS3ZiZENFUUJXS01mDQotRU9iamp2YmR0Y0RVd1dPbw0KLURvQ2pqdmJkWk1TRHRObE4NCi1Eb0RMS3ZiZHZBY3hybmVJDQotRU9iamp2YmRJeFVDSUxwcA0KLUVPY0tqdmJkZlNCV3prYm8NCi1FT2JrS3ZiZFNoektSQUFsDQotRG5iamp2YmRHWlV1QkR4Qw0KLUVPYmtLdmJkcWx6S1lraEoNCi1FUERLanZiZFp5RUtOYmtyDQotRG9ETEt2YmRzcnJUWXpGRA0KLURvQ2tLdmJkZlNBdnprY1ANCi1EbmJqanZiZHFsektZbEhpDQotRVBES2p2YmRZVExhTlRvWQ0KLUVQQ2pqdmJkakVqZ1VvQU8NCi1FT2NLanZiZFRKWmpSQUJNDQotRU9ia0t2YmRZT1JBWHR2VQ0KLURvRExLdmJkR0tkcmNIbVYNCi1Eb0RMS3ZiZGJyY0xVRUphDQotRG5jTEt2YmRxdnBMY0paUg0KLURuYmtLdmJkRmVpcW5Jc3ENCi1FUERLanZiZFpubkllRXpLDQotRVBDamp2YmRuVXR6TEtSZg0KLURvRExLdmJkRHhYbFVVVGwNCi1Eb0RLanZiZGlNRWNuVWJ5DQotRU9ia0t2YmRZemJlcWpXWg0KLURuY0tqdmJkVHZMb2pVQXENCi1FT2NMS3ZiZGp1dm1kQnhYDQotRG5iamp2YmR6b1BwZGNNWQ0KLURvREtqdmJkcm92T2lidWYNCi1Eb0RLanZiZEZXWlBvbUplDQotRG9ES2p2YmRxR0RlVVdCSQ0KLURvQ2tLdmJkV1dpWVZkRWcNCi1FT2JrS3ZiZHR2T1hpcVRBDQotRG5iamp2YmRxWlBJR3BkWQ0KLUVPYmtLdmJkTEJLZ05DWVINCi1Eb0NqanZiZExCS2dOQ1lSDQotRU9iamp2YmRac2lKWkVTbg0KLURvQ2tLdmJkVHFST3R1SU4NCi1FUENqanZiZHlmeU1BTWR3DQotRU9jTEt2YmRwdFRnU1NMVQ0KLURuY0xLdmJkUHhtQUhUU0sNCi1EbmJqanZiZFJrWkZ0ZmtUDQotRVBETEt2YmR0bFh2YVVBdw0KLUVQQ2tLdmJkcUJKRkFXaEUNCi1FUENrS3ZiZElpZEFKb2dFDQotRVBETEt2YmRLUXlkb0dPRg0KLUVPYmtLdmJkYXVDR3drVGgNCi1FUENqanZiZE5kZFVJaUtkDQotRG9ETEt2YmRGZktSbWhzcQ0KLUVQQ2tLdmJkZUVucWJYQ2oNCi1FT2JrS3ZiZEp2VkdEZGZpDQotRG9ES2p2YmRXUm13YWVMYw0KLUVPYmtLdmJkU0NEZUxpWkwNCi1FUERLanZiZERvRExMV2NFDQotRVBETEt2YmRpTUVjblVieQ0KLURuYmpqdmJkTEJMR21CeFINCi1FUENqanZiZFpubWlFZHlqDQotRU9iamp2YmRWaFh1d2dZeg0KLURuY0xLdmJkVXROVGZNVmoNCi1FUERMS3ZiZEthS2dNYXhSDQotRG5jS2p2YmRKY0picGljWQ0KLURuYmtLdmJkU0t5R1ZITFQNCi1Eb0RLanZiZHpST2xoalhBDQotRG5ia0t2YmRsclpVeXNFSg0KLURvQ2tLdmJkblFaeVdMWWINCi1Eb0NqanZiZGVGT3FiV2JqDQotRU9jTEt2YmRqZ2ZrZkdPTA0KLUVPYmtLdmJkaUhKYnlXS1YNCi1EbmJrS3ZiZEdkTFZpYkpqDQotRG9ES2p2YmRHTEVyY0lOVg0KLUVQQ2pqdmJkTkdjUGxwVWsNCi1FT2NLanZiZGpGTEd0b0FPDQotRU9jS2p2YmRzQmZNbEdrWg0KLUVPYmpqdmJkaHR5ZHZxdUMNCi1Eb0NqanZiZHpucFJGQ2t4DQotRG5jTEt2YmRZU2thTlVPeA0KLURvQ2pqdmJkVnZoeFZkRkgNCi1FUERMS3ZiZE5lRVRpSkxFDQotRG9ES2p2YmRjU2NMVGRKYQ0KLUVPY0xLdmJkUXdOZERMZ2MNCi1Eb0RMS3ZiZFVNV1BCV1BKDQotRG5jS2p2YmRxRmRFdFZhSQ0KLUVPYmpqdmJkaGJQQ2VYUlINCi1Eb0NqanZiZEtlZWhDQXB1DQotRG5jS2p2YmRZTnFBWHVWdA0KLURvRExLdmJkam1DTHpGR28NCi1Eb0NrS3ZiZHRsWHdCVUF3DQotRU9ia0t2YmR3dG1FcVlsTw0KLUVPYmpqdmJkcm92T2pDdkcNCi1FT2JrS3ZiZHFyVkxPTEJODQotRG9Damp2YmRTQmNka2h4aw0KLURuY0xLdmJkckVFaG9tdWENCi1FT2JrS3ZiZHRiYnR2dW5vDQotRVBETEt2YmRaalNoUUdhZg0KLUVQQ2pqdmJkVEFGSkhiUEUNCi1EbmJqanZiZGNTY0xUY2lhDQotRU9ia0t2YmRic0RMVURpYQ0KLURuYmtLdmJka3lUU1RZZ1UNCi1EbmNLanZiZHlTbWhtU0NIDQotRG9Damp2YmRuQml2eFBOdQ0KLURuY0tqdmJkRVh4THRUdE0NCi1FT2JqanZiZFpzaGh5RVNuDQotRG9ES2p2YmRrTWJMekVmbw0KLUVPYmpqdmJkc3NScnh5ZUQNCi1Eb0RLanZiZGNTYmtUZEtCDQotRVBETEt2YmRIRGp2SmJLSw0KLURuY0xLdmJkc1FWbmpDdkcNCi1EbmJqanZiZEpTeUJUTXdsDQotRU9jTEt2YmRkWnhwWVlxQw0KLUVQQ2pqdmJkclhRTGNKWlINCi1Eb0NrS3ZiZG5IRXdsbWZ5DQotRU9jS2p2YmRHWlV1QkR3Yg0KLUVPYmpqdmJkdk9zenFLbnQNCi1FT2NMS3ZiZFJvc2dLRmRYDQotRVBDamp2YmRNcFhxV05mcw0KLUVQQ2tLdmJkSmJpYnFKY1kNCi1EbmNLanZiZEp2VkZkRWdKDQotRU9ia0t2YmRxd1BrY0l5Ug0KLURuYmtLdmJkRHd4TVVUdE0NCi1EbmNLanZiZHRjRFZYVm5vDQotRVBETEt2YmRsWlNyU3hmdA0KLURvQ2tLdmJkS2VlaENBcHUNCi1FUERMS3ZiZFFseENZbXR6DQotRU9jTEt2YmRZcU5GSk5GUg0KLURvQ2tLdmJkbkNLV3dvT1YNCi1FT2JqanZiZHd6SUZmWUVyDQotRU9jS2p2YmRrRE1MUWZ1SA0KLUVQQ2pqdmJkclNVam5MQk4NCi1FUENrS3ZiZFRmem5NWFZlDQotRVBDa0t2YmRaeGRLTmNNUw0KLURvQ2pqdmJkSlhzYWdsUlENCi1Eb0NqanZiZE5Qd3FXTmdUDQotRG9Damp2YmRMcXdNelVweg0KLUVPY0tqdmJkQ0RvYVdKbGYNCi1EbmJqanZiZGxZc1JzWkd0DQotRG5jS2p2YmRlT2RzTFVVUw0KLUVPY0tqdmJkRXZaUVBtSmUNCi1Eb0NrS3ZiZHFCSkZBWEhkDQotRG5iamp2YmR0a3d3QlVCWA0KLUVPYmpqdmJkTEZmSGFhUXUNCi1Eb0RMS3ZiZGJMTUZvTmNBDQotRVBETEt2YmRpTGRjblVieQ0KLURuYmtLdmJkVVFxUFZVZ20NCi1FT2NMS3ZiZEVPY0xMWERFDQotRG9ES2p2YmRyRUVocE9XQg0KLURuY0tqdmJka0Nra1FmdGcNCi1EbmNMS3ZiZE1mYnBOUVVrDQotRG5iamp2YmRUdWxRS1VBcQ0KLURvRExLdmJkVXROVUZrdksNCi1EbmNLanZiZGRuZHNLdFRyDQotRVBES2p2YmRsaURzcVZTQg0KLUVQQ2tLdmJkaGJPY0V2cVINCi1Eb0NrS3ZiZHFjZUpRTnVhDQotRG9Da0t2YmRyV3BMY0l5Ug0KLURuY0tqdmJkclNWTE5rQW0NCi1Eb0RMS3ZiZHlPU2hZVEpEDQotRG5jS2p2YmR5WUpLQm95aw0KLURuYmpqdmJkWlFsZGlORlINCi1FUERMS3ZiZGVQRXNLc3RTDQotRVBDamp2YmRjU2NLdERpYQ0KLURuY0xLdmJkeHNPSk5SYkgNCi1FT2JqanZiZEVZWGxVVVRsDQotRG9Da0t2YmR4VWxkcVpNTw0KLUVPY0tqdmJkUmp4ZXVHa1QNCi1FT2NMS3ZiZHFyVkxOamFODQotRG9Da0t2YmREd3drdFVVTQ0KLUVPY0xLdmJkWlFtRWlORlINCi1FUENrS3ZiZE1TWE15dHB6DQotRG5ia0t2YmRuVXR6S2lxZg0KLURvQ2pqdmJkUkVEQW9xRHINCi1FUENqanZiZFp5RGluRE1TDQotRVBDamp2YmRpQ1BERXdSUg0KLUVQQ2tLdmJkbVNaVXpTY2kNCi1Eb0RLanZiZGtXV21kQ1h3DQotRG5ia0t2YmRtSkRzcVZSYQ0KLUVQREtqdmJkaHpWR0xwbkcNCi1Eb0NrS3ZiZHNQdW9LRFdHDQotRG9ETEt2YmRyeWxQc0Fnbg0KLUVQQ2pqdmJkc1B1b0pidWYNCi1FT2NLanZiZHJFRkpRT1ZhDQotRVBDamp2YmRFUERMTFhDZA0KLURuY0tqdmJka1Z3T0VCeFgNCi1FUENrS3ZiZHFHRUZVV0FoDQotRG5jTEt2YmR0YmNVdnVubw0KLUVPY0tqdmJkV0lZV1lHeHoNCi1FUERMS3ZiZFpMcWNzbWttDQotRG9ES2p2YmRtYWl2d25uVg0KLURvQ2tLdmJkT1lQVnpjbXQNCi1Eb0NqanZiZFZ3SXd2RGVIDQotRG9Damp2YmRZa3JFVG1rbQ0KLURvREtqdmJkTEZmSGJBcVYNCi1FT2JqanZiZGtJSExlZk9MDQotRVBES2p2YmRaalNoUGZhZg0KLURvQ2pqdmJkZWhMV1NPUkgNCi1EbmNMS3ZiZEtmRmdiQlF1DQotRU9ia0t2YmRzUHVuakRWZg0KLURuY0tqdmJkaU1FZE51Q3kNCi1EbmNLanZiZEZmS1NOaHRSDQotRU9jS2p2YmRGVnhwUU5LRg0KLURuY0xLdmJkZkhrVnJPUkgNCi1FT2JqanZiZEtlZklCYVF1DQotRVBES2p2YmR1Q2J0dnVvUA0KLUVQQ2tLdmJkR2RMV0tDS0sNCi1EbmNMS3ZiZExBa0dtQndxDQotRG5jTEt2YmRac2hpWkVTbg0KLURuYmpqdmJkeVNtaG1TQ0gNCi1Eb0RLanZiZEFDcXhKeWlRDQotRG5jTEt2YmRtYWpYWU9tdQ0KLURuYmpqdmJkeFZORlJaTU8NCi1EbmJqanZiZFZxbXhCZGxEDQotRG5ia0t2YmRJR2daeVlYZw0KLURuY0tqdmJkZGRuckJ2Y0sNCi1FUENqanZiZFVHem1rd1ZlDQotRG5jTEt2YmRhTkxDVFZOSA0KLURvQ2tLdmJkV1dod3VjZGcNCi1EbmNLanZiZGtXV21jYXhYDQotRG9ES2p2YmRhUmZDaFVHTA0KLUVQRExLdmJkT0Vjc2lKS2QNCi1Eb0RMS3ZiZEdMRlRDaE11DQotRU9iamp2YmRqbUJrekZIUA0KLURuY0xLdmJkcldva2NKWXENCi1FT2JqanZiZERITUdIQXpjDQotRU9ia0t2YmRSeWpJVEN2QQ0KLURuYmpqdmJkV1JuWGJFbEQNCi1Eb0NqanZiZEVBUmlOWnZ3DQotRG5ia0t2YmRSanlGdGZqcw0KLURvQ2tLdmJkTWdEUU5RVkwNCi1Eb0RLanZiZENFUGFXSm1HDQotRG9Da0t2YmRVdE5UZkx1ag0KLURvREtqdmJkTkdjUU1wVkwNCi1Eb0RLanZiZFpRbUZJbUVxDQotRU9iamp2YmR5WUlpYlB5aw0KLURvRExLdmJkY1NianREakINCi1FUENqanZiZFB4bUFHc1NLDQotRVBDamp2YmRuVXVaamlyRw0KLUVQQ2tLdmJkZGlqU1Z0em4NCi1FT2NLanZiZHhVbUVxWWxPDQotRU9jS2p2YmR4cm1pTlJhZw0KLUVQQ2tLdmJkam1CbFplSFANCi1FT2NLanZiZHZCRHlTbmRoDQotRU9iamp2YmRsaURzcVZTQg0KLUVPY0tqdmJkVHZNUUtVQlINCi1EbmNMS3ZiZFJOWGJZblV6DQotRG5iamp2YmR5WUlpYW96TA0KLURvQ2tLdmJkaGJQREV3UlINCi1FUERLanZiZHB0VUdyU0xVDQotRG9ES2p2YmRGamVUQ2hNdQ0KLURuYmtLdmJkRlZ4b29tSmUNCi1FT2JrS3ZiZGxZcnJTeUd0DQotRVBETEt2YmRWWkhzektubg0KLURuY0xLdmJkRHd3a3RVVU0NCi1EbmNMS3ZiZERuYmtLdmNFDQotRVBDa0t2YmRqSmZIak13cg0KLUVQREtqdmJkVXROVGZNV0sNCi1FT2JqanZiZGJobGlrR1d4DQotRG5jTEt2YmRLZkZoQ0JRdQ0KLURvREtqdmJkVmd3dlhnWXoNCi1FUERMS3ZiZGlCb0Nkd1JSDQotRVBETEt2YmR6ZHpPemVacA0KLUVPYmtLdmJkTW94UldOZ1QNCi1FUERLanZiZGp2WE5kQnd3DQotRU9ia0t2YmRVdE1zZkx1ag0KLUVPY0xLdmJkblV1WmpqUmYNCi1EbmJrS3ZiZHVDYnR3Vm9QDQotRVBETEt2YmRHR0tSbWhzcQ0KLUVPYmtLdmJkZVBFc0xUdFMNCi1Eb0NqanZiZFNLeUdVZ0xUDQotRU9jTEt2YmRSYkRkbEl5TA0KLURvRExLdmJkTnhQVnpjblUNCi1FT2JqanZiZGtDa2tSR3RnDQotRG5jS2p2YmRWVG1VRmt2Sw0KLURuY0tqdmJkVXNsdEZrdWoNCi1FUERLanZiZFNDRUVsSlpMDQotRU9jS2p2YmRaeGNqTmNNUw0KLURvQ2pqdmJkRUpnaldZS0ENCi1EbmNMS3ZiZFJFREJRUkRyDQotRG5jS2p2YmRkb0VyanRVUw0KLUVQRExLdmJkQURTWUp5aVENCi1FUERLanZiZGF0YWZ4S3NoDQotRVBETEt2YmRrSUdrZWVtaw0KLURvRExLdmJkbVJ4dHpTY2kNCi1EbmJrS3ZiZFRsV1BBdlBKDQotRG5jS2p2YmRqSmVnak13cg0KLURvQ2tLdmJkcVR0SFNTS3QNCi1FT2NLanZiZGtNYWt6RkhQDQotRG5jTEt2YmRkWnlQd3hwYg0KLURuYmtLdmJkVHBwbnVVZ20NCi1FT2JrS3ZiZG5QeXh1a1pDDQotRG9ES2p2YmRiaU5KamV3WQ0KLUVQREtqdmJkSlN5QXJsd2wNCi1FUERMS3ZiZHZ2bEJWYVZ1DQotRU9jTEt2YmRqSmZJS014Uw0KLUVQRExLdmJkbGlFVHFWUmENCi1Eb0NrS3ZiZFdYSlh2RUZIDQotRG5jTEt2YmRpSEtEWldLVg0KLUVPYmtLdmJkRVh3a3RVVU0NCi1FT2NLanZiZFJXbkRjTUlEDQotRVBETEt2YmRiaGxqS2ZXeA0KLURuYmtLdmJkVlRsc2ZNVmoNCi1EbmJqanZiZFpvT0lkZVpqDQotRG9ES2p2YmREeFlMdFVUbA0KLUVPYmpqdmJkbUlkVHFVcWENCi1FUENqanZiZGladGVrcU5mDQotRG9ETEt2YmRNZmNQbVB0aw0KLUVQRExLdmJkS3hwaXJ6dGYNCi1EbmJrS3ZiZEVBUmhseld3DQotRU9jS2p2YmRxaUFKZU1uZQ0KLURuYmpqdmJkVXNsdEdNV0sNCi1EbmJrS3ZiZE1veFJXTmZzDQotRVBDamp2YmRUcVFudHVJTg0KLUVQREtqdmJkTEZmSGJBcHUNCi1FT2NMS3ZiZEFOSVpTd1p4DQotRG9Damp2YmRTTFpHVWZqcw0KLURvRExLdmJkSlN5QXJseE0NCi1FT2NMS3ZiZGRaeG94WlJDDQotRG9ETEt2YmRScFRmakZjdw0KLUVPYmpqdmJkS2VmSGJCUlYNCi1FUENrS3ZiZGpsYWt5ZUdvDQotRG9ETEt2YmRpQm5jRlhSUg0KLUVPYmtLdmJka0hma2VmT0wNCi1EbmJqanZiZGZJTFZyT1JIDQotRG5iamp2YmRic0RLdERpYQ0KLURvQ2pqdmJkcWlBS0VsbmUNCi1FT2JrS3ZiZEVYeE1UdFVNDQotRG5jS2p2YmRIZmdaeHhYZw0KLUVQREtqdmJkUXZuRGNNSUQNCi1Eb0RLanZiZENTYUNzZXdTDQotRG5jTEt2YmRTWmlnc0RXQQ0KLURuYmtLdmJkaVV5ZVhTVWINCi1EbmJrS3ZiZFpSTkZKTWVSDQotRVBES2p2YmREeFhsVHN0TQ0KLUVQQ2pqdmJka05CbFpkZm8NCi1EbmJrS3ZiZGh1WmR2cXRiDQotRG5jTEt2YmRIRGtXSmFqSw0KLUVPY0tqdmJkaGZpY1pXS1YNCi1Eb0RMS3ZiZHh3aUtDUHlrDQotRVBETEt2YmRaUWxlSk1lUg0KLURvRExLdmJkTHJYTXl0cHoNCi1EbmNLanZiZGNUQ2p0RUphDQotRG5ia0t2YmRVTVZuYVdQSg0KLURvQ2pqdmJkbkJqWFlQT1YNCi1FT2JqanZiZHVXTndqUXNBDQotRG9Damp2YmRScFVISmVjdw0KLURuYmtLdmJkSllVQmdsUXANCi1FT2NMS3ZiZHVvVHpxS29VDQotRU9iamp2YmRaTVJjdE5sTg0KLUVPYmtLdmJkeml1UHBFU3QNCi1Eb0RMS3ZiZHVMeFdhVGFYDQotRU9jTEt2YmRoZ0tEWldLVg0KLURuYmtLdmJkWlFsZGhtRlINCi1FT2NMS3ZiZGN5eVB4WlFiDQotRU9jS2p2YmRSV25EY0xnYw0KLURuY0xLdmJkeFpnZkZ3ZVMNCi1FUENrS3ZiZHlxT2xpSndBDQotRG5iamp2YmRzUHZQS0N1Zg0KLURvQ2pqdmJkTWdDcE5RVkwNCi1EbmNMS3ZiZE9FZFRpSktkDQotRVBES2p2YmRFQVJpTXl2dw0KLUVPY0xLdmJkSmJpYnFLRFkNCi1Eb0NrS3ZiZGVFbnJDV2JqDQotRG9Da0t2YmRHS2RyY0lNdQ0KLURuYmtLdmJkVU1XT2FWb0oNCi1Eb0NrS3ZiZEthS2dOQ1hxDQotRG5ia0t2YmRvQUt6dEhkTw0KLUVQREtqdmJkRHhYbFVVVGwNCi1FT2NMS3ZiZEZWeG9vbUplDQotRU9jS2p2YmRweVBIZnBkWQ0KLUVQQ2pqdmJkeHdpSmFveWsNCi1Eb0NrS3ZiZGxxeHR5cmNpDQotRU9jS2p2YmRmSGtXUm1wZw0KLURvQ2pqdmJka01hbFpkZm8NCi1FUENqanZiZEpweWVQR09GDQotRG5jTEt2YmRxVVVIUnFqdA0KLURvRExLdmJkeml1UVBkU3QNCi1Eb0RLanZiZEJoamFqaUdLDQotRVBES2p2YmRqY0xqcGZ0Zw0KLUVQREtqdmJkVndKWVdFRkgNCi1EbmJqanZiZE5kY3NpSkxFDQotRG9Damp2YmRRd09EY0xnYw0KLUVPY0xLdmJkdGt4WEF0QXcNCi1FUERLanZiZHdNdkFORUVtDQotRG9Damp2YmRxRmRFc3VhSQ0KLUVPYmpqdmJkclNVam1qYU4NCi1Eb0RMS3ZiZG5HZVlNbkd5DQotRU9jTEt2YmRQeU5BSFRTSw0KLURuYmtLdmJkTW93cHZOZ1QNCi1Eb0NqanZiZEdkTFZpYktLDQotRG9ETEt2YmR0Y0RWWFZubw0KLUVPYmtLdmJkdGxYd0JVQXcNCi1Eb0NqanZiZFNQc2dLR0VYDQotRVBDamp2YmRVUlFudHVIbQ0KLURuY0xLdmJkck15alpMZ2kNCi1FUERLanZiZHdYTUF2QlZ1DQotRU9jTEt2YmRSanhmVWZrVA0KLURuYmtLdmJkR0ZqUm5KVHENCi1Eb0NrS3ZiZGJVYkhZTFRoDQotRVBES2p2YmRvem5FS3hQQQ0KLUVQQ2pqdmJkTGlCbFF4QVMNCi1EbmNLanZiZGZWenhQaXpzDQotRG5iamp2YmRTS3lGdGdMVA0KLUVQREtqdmJkclhQbENpWlINCi1EbmNMS3ZiZGh6VkdMcG5HDQotRU9iamp2YmRWd0pZVmRGSA0KLUVQREtqdmJkd1hMYVdCVnUNCi1FUENqanZiZGpoSE1HRm1rDQotRU9ia0t2YmRLeVFqU3p1Rw0KLURvQ2pqdmJkbWZlWU5PSFoNCi1Eb0RMS3ZiZFppcmdvZmFmDQotRU9jTEt2YmRab09JZGVaag0KLUVQQ2tLdmJkTEZmSGJBcHUNCi1FUENrS3ZiZGp2V25FQnd3DQotRG9ES2p2YmRjU2NMVUVLQg0KLURvQ2tLdmJka0NranFIVWcNCi1Eb0RLanZiZHlUTmhtU0JnDQotRG9Da0t2YmRrSGdMZkZuTA0KLUVQQ2pqdmJkem9RUWRjTHgNCi1Eb0NqanZiZE9UVHZIRXRwDQotRVBDa0t2YmR6bm9wZURMeA0KLUVQQ2tLdmJkR0ZqUm1odFINCi1FUENrS3ZiZFVhQ1FycHF5DQotRU9jS2p2YmRuR2VYbU9IWg0KLURvREtqdmJkaUNQREV3UlINCi1Eb0NqanZiZFJiRUZMaVlrDQotRG5jS2p2YmRSWE9FQ2tnYw0KLUVQQ2pqdmJkS1dVZWRFZ0oNCi1EbmNLanZiZERqSUp2WUtBDQotRG9ES2p2YmR5VE9KTlJiSA0KLURvQ2pqdmJkZVBGVEt0VHINCi1Eb0RLanZiZGh0eWVXclZDDQotRVBDa0t2YmRxdm9sQ2laUg0KLURvRExLdmJkYXBISEVMemQNCi1FT2JqanZiZGxoZFVRdHJCDQotRU9jS2p2YmRwdFVHclJrVQ0KLUVQQ2pqdmJkcVVUZnFyTFUNCi1FUENrS3ZiZGNKTWlrR1d4DQotRG9ES2p2YmRsaGN0UlZSYQ0KLUVPY0xLdmJkQU5IeVRYWngNCi1FUERLanZiZHBzc2Zxckt0DQotRVBDa0t2YmRGZWlxbkpUcQ0KLURvQ2tLdmJkeFpnZkdYZHINCi1FT2NMS3ZiZFJXbWNibEhjDQotRG5jTEt2YmRqZ2dNRmVtaw0KLURvREtqdmJkS2VlZ2JCUXUNCmRpZmYgLS1naXQgYS9ob3RzcG90L3Rlc3QvcnVudGltZS83MTU4ODA0L1Rlc3Q3MTU4ODA0LnNoIGIvaG90c3BvdC90ZXN0L3J1bnRpbWUvNzE1ODgwNC9UZXN0NzE1ODgwNC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2U1MTk3Ci0tLSAvZGV2L251bGwKKysrIGIvaG90c3BvdC90ZXN0L3J1bnRpbWUvNzE1ODgwNC9UZXN0NzE1ODgwNC5zaApAQCAtMCwwICsxLDMwIEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDEyIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyMKKworIyMKKyMjIEB0ZXN0IFRlc3Q3MTU4ODA0LnNoCisjIyBAYnVnIDcxNTg4MDQKKyMjIEBzdW1tYXJ5IEltcHJvdmUgY29uZmlnIGZpbGUgcGFyc2luZworIyMgQHJ1biBzaGVsbCBUZXN0NzE1ODgwNC5zaAorIyMKKworaWYgWyAiJHtURVNUSkFWQX0iID0gIiIgXQordGhlbgorICBlY2hvICJURVNUSkFWQSBub3Qgc2V0LiAgVGVzdCBjYW5ub3QgZXhlY3V0ZS4gIEZhaWxlZC4iCisgIGV4aXQgMQorZmkKK2VjaG8gIlRFU1RKQVZBPSR7VEVTVEpBVkF9IgorCitybSAtZiAuaG90c3BvdHJjCitlY2hvIC1YWDorYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYSA+LmhvdHNwb3RyYworJHtURVNUSkFWQX0vYmluL2phdmEgJHtURVNUVk1PUFRTfSAtWFg6K0lnbm9yZVVucmVjb2duaXplZFZNT3B0aW9ucyAtWFg6RmxhZ3M9LmhvdHNwb3RyYyAtdmVyc2lvbgoraWYgWyAkPyAtbmUgMCBdCit0aGVuCisgICAgZWNobyAiVGVzdCBGYWlsZWQiCisgICAgZXhpdCAxCitmaQorcm0gLWYgLmhvdHNwb3RyYworZXhpdCAwCmRpZmYgLS1naXQgYS9qYXhwLy5oZ3RhZ3MgYi9qYXhwLy5oZ3RhZ3MKaW5kZXggNWMzMjkxMy4uMGFiNTViMCAxMDA2NDQKLS0tIGEvamF4cC8uaGd0YWdzCisrKyBiL2pheHAvLmhndGFncwpAQCAtMTgzLDMgKzE4Myw0IEBACiBhZjllOGIwZjE5MDBiNjMxYThhMGZjY2NmZjlmMTUxNGZlNThjODA4IGpkazgtYjU5CiAyZDFkZmY1MzEwZGFhZjIyNjQyMWE4YzkyODIzY2I4YWZjZjM1ZjMxIGpkazgtYjYwCiA2YjFkYjBiNDFkMmY2ZTJhN2IzYmRiYzhhOGRiODIzYjQ3NzUyOTA2IGpkazgtYjYxCis1ZDBmYTAxMDhkMDI4YzA1NzUzYTQ3YmNmMmE1OTgzNTdkYWJmMGMwIGpkazgtYjYyCmRpZmYgLS1naXQgYS9qYXhwL21ha2VmaWxlcy9CdWlsZEpheHAuZ21rIGIvamF4cC9tYWtlZmlsZXMvQnVpbGRKYXhwLmdtawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTY0OTg0Ci0tLSAvZGV2L251bGwKKysrIGIvamF4cC9tYWtlZmlsZXMvQnVpbGRKYXhwLmdtawpAQCAtMCwwICsxLDYxIEBACisjCisjIENvcHlyaWdodCAoYykgMjAwNywgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorIworIyBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMKKyMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorIyBieSBPcmFjbGUgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyMKKyMgVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisjIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorIyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyMgYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorIyAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyMKKyMgUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyMgb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQorIyBxdWVzdGlvbnMuCisjCisKKyMgVGhpcyBtdXN0IGJlIHRoZSBmaXJzdCBydWxlCitkZWZhdWx0OiBhbGwKKworLWluY2x1ZGUgJChTUEVDKQoraW5jbHVkZSBNYWtlQmFzZS5nbWsKK2luY2x1ZGUgSmF2YUNvbXBpbGF0aW9uLmdtaworCitKQVZBQ19KQVJTID89ICItWGJvb3RjbGFzc3BhdGgvcDokKExBTkdUT09MU19PVVRQVVRESVIpL2Rpc3QvYm9vdHN0cmFwL2xpYi9qYXZhYy5qYXIiIFwKKwkJLWphciAkKExBTkdUT09MU19PVVRQVVRESVIpL2Rpc3QvYm9vdHN0cmFwL2xpYi9qYXZhYy5qYXIKK0RJU0FCTEVfSkFYUF9XQVJOSU5HUzo9LVhsaW50OmFsbCwtZGVwcmVjYXRpb24sLXVuY2hlY2tlZCwtcmF3dHlwZXMsLWNhc3QsLXNlcmlhbCwtZGVwLWFubiwtc3RhdGljLC1mYWxsdGhyb3VnaAorCisjIFRoZSBnZW5lcmF0ZSBuZXcgYnl0ZWNvZGUgdXNlcyB0aGUgbmV3IGNvbXBpbGVyIGZvciB0byBnZW5lcmF0ZSBieXRlY29kZQorIyBmb3IgdGhlIG5ldyBqZGsgdGhhdCBpcyBiZWluZyBidWlsdC4gVGhlIGNvZGUgY29tcGlsZWQgYnkgdGhpcyBzZXR1cAorIyBjYW5ub3QgbmVjZXNzYXJpbHkgYmUgcnVuIHdpdGggdGhlIGJvb3QgamRrLgorJChldmFsICQoY2FsbCBTZXR1cEphdmFDb21waWxlcixHRU5FUkFURV9ORVdCWVRFQ09ERV9ERUJVRyxcCisgICAgIEpWTTo9JChKQVZBKSxcCisgICAgIEpBVkFDOj0kKEpBVkFDX0pBUlMpLFwKKyAgICAgRkxBR1M6PS1YRGlnbm9yZS5zeW1ib2wuZmlsZT10cnVlICQoRElTQUJMRV9KQVhQX1dBUk5JTkdTKSAtZyxcCisgICAgIFNFUlZFUl9ESVI6PSQoU0pBVkFDX1NFUlZFUl9ESVIpLFwKKyAgICAgU0VSVkVSX0pWTTo9JChTSkFWQUNfU0VSVkVSX0pBVkEpKSkKKworJChldmFsICQoY2FsbCBTZXR1cEphdmFDb21waWxhdGlvbixCVUlMRF9KQVhQLFwKKwkJU0VUVVA6PUdFTkVSQVRFX05FV0JZVEVDT0RFX0RFQlVHLFwKKwkJU1JDOj0kKEpBWFBfVE9QRElSKS9zcmMsXAorCQlDTEVBTjo9LnByb3BlcnRpZXMsXAorCQlCSU46PSQoSkFYUF9PVVRQVVRESVIpL2NsYXNzZXMsXAorCQlTUkNaSVA6PSQoSkFYUF9PVVRQVVRESVIpL2Rpc3QvbGliL3NyYy56aXApKQorCiskKGV2YWwgJChjYWxsIFNldHVwQXJjaGl2ZSxBUkNISVZFX0pBWFAsJChCVUlMRF9KQVhQKSxcCisJCVNSQ1M6PSQoSkFYUF9PVVRQVVRESVIpL2NsYXNzZXMsXAorCQlTVUZGSVhFUzo9LmNsYXNzIC5wcm9wZXJ0aWVzLFwKKwkJSkFSOj0kKEpBWFBfT1VUUFVURElSKS9kaXN0L2xpYi9jbGFzc2VzLmphcikpCisKK2FsbDogJChKQVhQX09VVFBVVERJUikvZGlzdC9saWIvY2xhc3Nlcy5qYXIgJChKQVhQX09VVFBVVERJUikvZGlzdC9saWIvc3JjLnppcAorCisuUEhPTlk6IGRlZmF1bHQgYWxsIApkaWZmIC0tZ2l0IGEvamF4cC9tYWtlZmlsZXMvTWFrZWZpbGUgYi9qYXhwL21ha2VmaWxlcy9NYWtlZmlsZQppbmRleCA4NTY0OTg0Li45NTM5ZmUwIDEwMDY0NAotLS0gYS9qYXhwL21ha2VmaWxlcy9NYWtlZmlsZQorKysgYi9qYXhwL21ha2VmaWxlcy9NYWtlZmlsZQpAQCAtMSw1ICsxLDUgQEAKICMKLSMgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBDb3B5cmlnaHQgKGMpIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAjIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICMKICMgVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIzLDM5ICsyMywyNyBAQAogIyBxdWVzdGlvbnMuCiAjCiAKLSMgVGhpcyBtdXN0IGJlIHRoZSBmaXJzdCBydWxlCi1kZWZhdWx0OiBhbGwKKyMgTG9jYXRlIHRoaXMgTWFrZWZpbGUKK2lmZXEgKCQoZmlsdGVyIC8lLCQobGFzdHdvcmQgJChNQUtFRklMRV9MSVNUKSkpLCkKKyAgICBtYWtlZmlsZV9wYXRoOj0kKENVUkRJUikvJChsYXN0d29yZCAkKE1BS0VGSUxFX0xJU1QpKQorZWxzZQorICAgIG1ha2VmaWxlX3BhdGg6PSQobGFzdHdvcmQgJChNQUtFRklMRV9MSVNUKSkKK2VuZGlmCityZXBvX2Rpcjo9JChwYXRzdWJzdCAlL21ha2VmaWxlcy9NYWtlZmlsZSwlLCQobWFrZWZpbGVfcGF0aCkpCiAKLS1pbmNsdWRlICQoU1BFQykKLWluY2x1ZGUgTWFrZUJhc2UuZ21rCi1pbmNsdWRlIEphdmFDb21waWxhdGlvbi5nbWsKKyMgV2hhdCBpcyB0aGUgbmFtZSBvZiB0aGlzIHN1YnN5c3RlbSAobGFuZ3Rvb2xzLCBjb3JiYSwgZXRjKT8KK3N1YnN5c3RlbV9uYW1lOj0kKG5vdGRpciAkKHJlcG9fZGlyKSkKIAotSkFWQUNfSkFSUyA/PSAiLVhib290Y2xhc3NwYXRoL3A6JChMQU5HVE9PTFNfT1VUUFVURElSKS9kaXN0L2Jvb3RzdHJhcC9saWIvamF2YWMuamFyIiBcCi0JCS1qYXIgJChMQU5HVE9PTFNfT1VUUFVURElSKS9kaXN0L2Jvb3RzdHJhcC9saWIvamF2YWMuamFyCi1ESVNBQkxFX0pBWFBfV0FSTklOR1M6PS1YbGludDphbGwsLWRlcHJlY2F0aW9uLC11bmNoZWNrZWQsLXJhd3R5cGVzLC1jYXN0LC1zZXJpYWwsLWRlcC1hbm4sLXN0YXRpYywtZmFsbHRocm91Z2gKKyMgVHJ5IHRvIGxvY2F0ZSB0b3AtbGV2ZWwgbWFrZWZpbGUKK3RvcF9sZXZlbF9tYWtlZmlsZTo9JChyZXBvX2RpcikvLi4vY29tbW9uL21ha2VmaWxlcy9NYWtlZmlsZQoraWZuZXEgKCQod2lsZGNhcmQgJCh0b3BfbGV2ZWxfbWFrZWZpbGUpKSwpCisgICQoaW5mbyBXaWxsIHJ1biAkKHN1YnN5c3RlbV9uYW1lKSB0YXJnZXQgb24gdG9wLWxldmVsIE1ha2VmaWxlKQorICAkKGluZm8gV0FSTklORzogVGhpcyBpcyBhIG5vbi1yZWNvbW1lbmRlZCB3YXkgb2YgYnVpbGRpbmchKQorICAkKGluZm8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09KQorZWxzZQorICAkKGluZm8gQ2Fubm90IGxvY2F0ZSB0b3AtbGV2ZWwgTWFrZWZpbGUuIElzIHRoaXMgcmVwbyBub3QgY2hlY2tlZCBvdXQgYXMgcGFydCBvZiBhIGNvbXBsZXRlIGZvcmVzdD8pCisgICQoZXJyb3IgQnVpbGQgZnJvbSB0b3AtbGV2ZWwgTWFrZWZpbGUgaW5zdGVhZCkKK2VuZGlmCiAKLSMgVGhlIGdlbmVyYXRlIG5ldyBieXRlY29kZSB1c2VzIHRoZSBuZXcgY29tcGlsZXIgZm9yIHRvIGdlbmVyYXRlIGJ5dGVjb2RlCi0jIGZvciB0aGUgbmV3IGpkayB0aGF0IGlzIGJlaW5nIGJ1aWx0LiBUaGUgY29kZSBjb21waWxlZCBieSB0aGlzIHNldHVwCi0jIGNhbm5vdCBuZWNlc3NhcmlseSBiZSBydW4gd2l0aCB0aGUgYm9vdCBqZGsuCi0kKGV2YWwgJChjYWxsIFNldHVwSmF2YUNvbXBpbGVyLEdFTkVSQVRFX05FV0JZVEVDT0RFX0RFQlVHLFwKLSAgICAgSlZNOj0kKEpBVkEpLFwKLSAgICAgSkFWQUM6PSQoSkFWQUNfSkFSUyksXAotICAgICBGTEFHUzo9LVhEaWdub3JlLnN5bWJvbC5maWxlPXRydWUgJChESVNBQkxFX0pBWFBfV0FSTklOR1MpIC1nLFwKLSAgICAgU0VSVkVSX0RJUjo9JChTSkFWQUNfU0VSVkVSX0RJUiksXAotICAgICBTRVJWRVJfSlZNOj0kKFNKQVZBQ19TRVJWRVJfSkFWQSkpKQotCi0kKGV2YWwgJChjYWxsIFNldHVwSmF2YUNvbXBpbGF0aW9uLEJVSUxEX0pBWFAsXAotCQlTRVRVUDo9R0VORVJBVEVfTkVXQllURUNPREVfREVCVUcsXAotCQlTUkM6PSQoSkFYUF9UT1BESVIpL3NyYyxcCi0JCUNMRUFOOj0ucHJvcGVydGllcyxcCi0JCUJJTjo9JChKQVhQX09VVFBVVERJUikvY2xhc3NlcyxcCi0JCVNSQ1pJUDo9JChKQVhQX09VVFBVVERJUikvZGlzdC9saWIvc3JjLnppcCkpCi0KLSQoZXZhbCAkKGNhbGwgU2V0dXBBcmNoaXZlLEFSQ0hJVkVfSkFYUCwkKEJVSUxEX0pBWFApLFwKLQkJU1JDUzo9JChKQVhQX09VVFBVVERJUikvY2xhc3NlcyxcCi0JCVNVRkZJWEVTOj0uY2xhc3MgLnByb3BlcnRpZXMsXAotCQlKQVI6PSQoSkFYUF9PVVRQVVRESVIpL2Rpc3QvbGliL2NsYXNzZXMuamFyKSkKLQotYWxsOiAkKEpBWFBfT1VUUFVURElSKS9kaXN0L2xpYi9jbGFzc2VzLmphciAkKEpBWFBfT1VUUFVURElSKS9kaXN0L2xpYi9zcmMuemlwCi0KLS5QSE9OWTogZGVmYXVsdCBhbGwgCithbGw6CisJQCQoTUFLRSkgLWYgJCh0b3BfbGV2ZWxfbWFrZWZpbGUpICQoc3Vic3lzdGVtX25hbWUpCmRpZmYgLS1naXQgYS9qYXhwL3NyYy9jb20vc3VuL29yZy9hcGFjaGUveGVyY2VzL2ludGVybmFsL2ltcGwvWE1MRG9jdW1lbnRGcmFnbWVudFNjYW5uZXJJbXBsLmphdmEgYi9qYXhwL3NyYy9jb20vc3VuL29yZy9hcGFjaGUveGVyY2VzL2ludGVybmFsL2ltcGwvWE1MRG9jdW1lbnRGcmFnbWVudFNjYW5uZXJJbXBsLmphdmEKaW5kZXggZDY2ODBlYy4uOGEyYjU5NCAxMDA2NDQKLS0tIGEvamF4cC9zcmMvY29tL3N1bi9vcmcvYXBhY2hlL3hlcmNlcy9pbnRlcm5hbC9pbXBsL1hNTERvY3VtZW50RnJhZ21lbnRTY2FubmVySW1wbC5qYXZhCisrKyBiL2pheHAvc3JjL2NvbS9zdW4vb3JnL2FwYWNoZS94ZXJjZXMvaW50ZXJuYWwvaW1wbC9YTUxEb2N1bWVudEZyYWdtZW50U2Nhbm5lckltcGwuamF2YQpAQCAtODA2LDYgKzgwNiw3IEBACiAgICAgICogICAgICAgICAgICAgICAgIHdoZXJlIHRoZSBlbnRpdHkgZW5jb2RpbmcgaXMgbm90IGF1dG8tZGV0ZWN0ZWQgKGUuZy4KICAgICAgKiAgICAgICAgICAgICAgICAgaW50ZXJuYWwgZW50aXRpZXMgb3IgYSBkb2N1bWVudCBlbnRpdHkgdGhhdCBpcwogICAgICAqICAgICAgICAgICAgICAgICBwYXJzZWQgZnJvbSBhIGphdmEuaW8uUmVhZGVyKS4KKyAgICAgKiBAcGFyYW0gYXVncyAgICAgQWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0aGF0IG1heSBpbmNsdWRlIGluZm9zZXQgYXVnbWVudGF0aW9ucwogICAgICAqCiAgICAgICogQHRocm93cyBYTklFeGNlcHRpb24gVGhyb3duIGJ5IGhhbmRsZXIgdG8gc2lnbmFsIGFuIGVycm9yLgogICAgICAqLwpAQCAtODMzLDcgKzgzNCw3IEBACiAgICAgICAgIC8vIGNhbGwgaGFuZGxlcgogICAgICAgICBpZiAoZkRvY3VtZW50SGFuZGxlciAhPSBudWxsICYmICFmU2Nhbm5pbmdBdHRyaWJ1dGUpIHsKICAgICAgICAgICAgIGlmICghbmFtZS5lcXVhbHMoIlt4bWxdIikpIHsKLSAgICAgICAgICAgICAgICBmRG9jdW1lbnRIYW5kbGVyLnN0YXJ0R2VuZXJhbEVudGl0eShuYW1lLCBpZGVudGlmaWVyLCBlbmNvZGluZywgbnVsbCk7CisgICAgICAgICAgICAgICAgZkRvY3VtZW50SGFuZGxlci5zdGFydEdlbmVyYWxFbnRpdHkobmFtZSwgaWRlbnRpZmllciwgZW5jb2RpbmcsIGF1Z3MpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTg0NSw2ICs4NDYsNyBAQAogICAgICAqIGFyZSBqdXN0IHNwZWNpZmllZCBieSB0aGVpciBuYW1lLgogICAgICAqCiAgICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGVudGl0eS4KKyAgICAgKiBAcGFyYW0gYXVncyBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIHRoYXQgbWF5IGluY2x1ZGUgaW5mb3NldCBhdWdtZW50YXRpb25zCiAgICAgICoKICAgICAgKiBAdGhyb3dzIFhOSUV4Y2VwdGlvbiBUaHJvd24gYnkgaGFuZGxlciB0byBzaWduYWwgYW4gZXJyb3IuCiAgICAgICovCkBAIC04NjksNyArODcxLDcgQEAKICAgICAgICAgLy8gY2FsbCBoYW5kbGVyCiAgICAgICAgIGlmIChmRG9jdW1lbnRIYW5kbGVyICE9IG51bGwgJiYgIWZTY2FubmluZ0F0dHJpYnV0ZSkgewogICAgICAgICAgICAgaWYgKCFuYW1lLmVxdWFscygiW3htbF0iKSkgewotICAgICAgICAgICAgICAgIGZEb2N1bWVudEhhbmRsZXIuZW5kR2VuZXJhbEVudGl0eShuYW1lLCBudWxsKTsKKyAgICAgICAgICAgICAgICBmRG9jdW1lbnRIYW5kbGVyLmVuZEdlbmVyYWxFbnRpdHkobmFtZSwgYXVncyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvamF4d3MvLmhndGFncyBiL2pheHdzLy5oZ3RhZ3MKaW5kZXggN2Q2YTZkZi4uZjM4NTRiNCAxMDA2NDQKLS0tIGEvamF4d3MvLmhndGFncworKysgYi9qYXh3cy8uaGd0YWdzCkBAIC0xODMsMyArMTgzLDQgQEAKIGFlMTA3NDAxYmUxMTZmOWUzODRkM2EyMzE5MmY1NDM4MjhlMDNkYTUgamRrOC1iNTkKIDVjNWE2NWFkNTI5MWI3Y2VmY2RjMzA4ZjYyN2NmMmIxOTVjZjJiNjkgamRrOC1iNjAKIDk3ZTVlNzRlMmEzNDFkOTE0MmNlMjgwNDM5MTJhM2MyNTVlMjhlMDMgamRrOC1iNjEKK2QyNjViOWI0YzBmNTVjMjNhMWM5ZmRhMDJhODA1MmZkOWRmMmVlYzUgamRrOC1iNjIKZGlmZiAtLWdpdCBhL2pheHdzL21ha2VmaWxlcy9CdWlsZEpheHdzLmdtayBiL2pheHdzL21ha2VmaWxlcy9CdWlsZEpheHdzLmdtawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzQ1ZWM4Ci0tLSAvZGV2L251bGwKKysrIGIvamF4d3MvbWFrZWZpbGVzL0J1aWxkSmF4d3MuZ21rCkBAIC0wLDAgKzEsOTIgQEAKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisjCisjIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcworIyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisjIGJ5IE9yYWNsZSBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorIworIyBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisjIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorIyBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisjIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorIworIyBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQorIyBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CisjIHF1ZXN0aW9ucy4KKyMKKworIyBUaGlzIG11c3QgYmUgdGhlIGZpcnN0IHJ1bGUKK2RlZmF1bHQ6IGFsbAorCitpbmNsdWRlICQoU1BFQykKK2luY2x1ZGUgTWFrZUJhc2UuZ21rCitpbmNsdWRlIEphdmFDb21waWxhdGlvbi5nbWsKKworSkFWQUNfSkFSUyA/PSAtWGJvb3RjbGFzc3BhdGgvcDokKExBTkdUT09MU19PVVRQVVRESVIpL2Rpc3QvYm9vdHN0cmFwL2xpYi9qYXZhYy5qYXIgXAorCQktamFyICQoTEFOR1RPT0xTX09VVFBVVERJUikvZGlzdC9ib290c3RyYXAvbGliL2phdmFjLmphcgorRElTQUJMRV9KQVhXU19XQVJOSU5HUzo9LVhsaW50OmFsbCwtdmFyYXJncywtcmF3dHlwZXMsLWRlcHJlY2F0aW9uLC11bmNoZWNrZWQsLXNlcmlhbCwtZGVwLWFubiwtY2FzdCwtZmFsbHRocm91Z2gsLXN0YXRpYworCisjIFRoZSBnZW5lcmF0ZSBuZXcgYnl0ZWNvZGUgdXNlcyB0aGUgbmV3IGNvbXBpbGVyIGZvciB0byBnZW5lcmF0ZSBieXRlY29kZQorIyBmb3IgdGhlIG5ldyBqZGsgdGhhdCBpcyBiZWluZyBidWlsdC4gVGhlIGNvZGUgY29tcGlsZWQgYnkgdGhpcyBzZXR1cAorIyBjYW5ub3QgbmVjZXNzYXJpbHkgYmUgcnVuIHdpdGggdGhlIGJvb3QgamRrLgorJChldmFsICQoY2FsbCBTZXR1cEphdmFDb21waWxlcixHRU5FUkFURV9ORVdCWVRFQ09ERV9ERUJVRyxcCisgICAgIEpWTTo9JChKQVZBKSxcCisgICAgIEpBVkFDOj0kKEpBVkFDX0pBUlMpLFwKKyAgICAgRkxBR1M6PS1YRGlnbm9yZS5zeW1ib2wuZmlsZT10cnVlICQoRElTQUJMRV9KQVhXU19XQVJOSU5HUykgLWcsXAorICAgICBTRVJWRVJfRElSOj0kKFNKQVZBQ19TRVJWRVJfRElSKSxcCisgICAgIFNFUlZFUl9KVk06PSQoU0pBVkFDX1NFUlZFUl9KQVZBKSkpCisKKyMgRHVtbXkgaGVyZSBpcyBuZWVkZWQgdG8gdHJpZ2dlciBjb3B5aW5nIG9mIE1FVEEtSU5GCiskKGV2YWwgJChjYWxsIFNldHVwSmF2YUNvbXBpbGF0aW9uLEJVSUxEX0pBRixcCisJCVNFVFVQOj1HRU5FUkFURV9ORVdCWVRFQ09ERV9ERUJVRyxcCisJCVNSQzo9JChKQVhXU19UT1BESVIpL3NyYy9zaGFyZS9qYWZfY2xhc3NlcyxcCisJCUNMRUFOOj0ucHJvcGVydGllcyxcCisJCUNPUFk6PSJkdW1teSIsXAorCQlCSU46PSQoSkFYV1NfT1VUUFVURElSKS9qYWZfY2xhc3NlcykpCisKKyQoZXZhbCAkKGNhbGwgU2V0dXBKYXZhQ29tcGlsYXRpb24sQlVJTERfSkFYV1MsXAorCQlTRVRVUDo9R0VORVJBVEVfTkVXQllURUNPREVfREVCVUcsXAorCQlTUkM6PSQoSkFYV1NfVE9QRElSKS9zcmMvc2hhcmUvamF4d3NfY2xhc3NlcyxcCisJCUNMRUFOOj0ucHJvcGVydGllcyxcCisJCUJJTjo9JChKQVhXU19PVVRQVVRESVIpL2pheHdzX2NsYXNzZXMsXAorCQlDT1BZOj0ueHNkLFwKKwkJQ09QWV9GSUxFUzo9JChKQVhXU19UT1BESVIpL3NyYy9zaGFyZS9qYXh3c19jbGFzc2VzL2NvbS9zdW4vdG9vbHMvaW50ZXJuYWwveGpjL3J1bnRpbWUvSkFYQkNvbnRleHRGYWN0b3J5LmphdmEgXAorCQkJICAgICQoSkFYV1NfVE9QRElSKS9zcmMvc2hhcmUvamF4d3NfY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9ydW50aW1lL1plcm9PbmVCb29sZWFuQWRhcHRlci5qYXZhLFwKKwkJQUREX0pBVkFDX0ZMQUdTPS1jcCAkKE9VVFBVVF9ST09UKS9qYXhwL2Rpc3QvbGliL2NsYXNzZXMuamFyKSkKKworJChKQVhXU19PVVRQVVRESVIpL2pheHdzX2NsYXNzZXMvTUVUQS1JTkYvc2VydmljZXMvY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2NvbXBpbGUuUGx1Z2luOiBcCisJCSAgICAgICAgICQoSkFYV1NfVE9QRElSKS9zcmMvc2hhcmUvamF4d3NfY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2V0Yy9NRVRBLUlORi9zZXJ2aWNlcy9jb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzY29tcGlsZS5QbHVnaW4KKwlta2RpciAtcCAkKEBEKQorCWNwICQ8ICRACisKKyQoSkFYV1NfT1VUUFVURElSKS9qYXh3c19jbGFzc2VzL01FVEEtSU5GL3NlcnZpY2VzL2NvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLlBsdWdpbjogXAorCQkgICAgICAgICAkKEpBWFdTX1RPUERJUikvc3JjL3NoYXJlL2pheHdzX2NsYXNzZXMvY29tL3N1bi90b29scy9ldGMvTUVUQS1JTkYvc2VydmljZXMvY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuUGx1Z2luCisJbWtkaXIgLXAgJChARCkKKwljcCAkPCAkQAorCisjIFRoZXJlIGFyZSB0d28gTUVUQS1JTkYgc2VydmljZXMgZmlsZXMgdGhhdCBhcmUgbmVlZGVkLCBhZGQgdGhlc2UgdG8gdGhlIGxpc3Qgb2YgZ29hbHMKK0JVSUxEX0pBWFdTICs9ICQoSkFYV1NfT1VUUFVURElSKS9qYXh3c19jbGFzc2VzL01FVEEtSU5GL3NlcnZpY2VzL2NvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3Njb21waWxlLlBsdWdpbiBcCisgICAgICAgICAgICAgICAkKEpBWFdTX09VVFBVVERJUikvamF4d3NfY2xhc3Nlcy9NRVRBLUlORi9zZXJ2aWNlcy9jb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5QbHVnaW4KKworJChldmFsICQoY2FsbCBTZXR1cEFyY2hpdmUsQVJDSElWRV9KQVhXUywkKEJVSUxEX0pBWFdTKSAkKEJVSUxEX0pBRiksXAorCQlTUkNTOj0kKEpBWFdTX09VVFBVVERJUikvamF4d3NfY2xhc3NlcyAkKEpBWFdTX09VVFBVVERJUikvamFmX2NsYXNzZXMsXAorCQlTVUZGSVhFUzo9LmNsYXNzIC5wcm9wZXJ0aWVzIC54c2QgLmphdmEgXAorCQkJICBjb20uc3VuLm1pcnJvci5hcHQuQW5ub3RhdGlvblByb2Nlc3NvckZhY3RvcnkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5QbHVnaW4sXAorCQlKQVI6PSQoSkFYV1NfT1VUUFVURElSKS9kaXN0L2xpYi9jbGFzc2VzLmphcikpCisKKyQoZXZhbCAkKGNhbGwgU2V0dXBaaXBBcmNoaXZlLFpJUF9KQVhXU19TT1VSQ0VTLFwKKwkJU1JDOj0kKEpBWFdTX1RPUERJUikvc3JjL3NoYXJlL2phZl9jbGFzc2VzICQoSkFYV1NfVE9QRElSKS9zcmMvc2hhcmUvamF4d3NfY2xhc3NlcyxcCisJCVpJUDo9JChKQVhXU19PVVRQVVRESVIpL2Rpc3QvbGliL3NyYy56aXApKQorCithbGw6ICQoSkFYV1NfT1VUUFVURElSKS9kaXN0L2xpYi9jbGFzc2VzLmphciAkKEpBWFdTX09VVFBVVERJUikvZGlzdC9saWIvc3JjLnppcAorCisuUEhPTlk6IGRlZmF1bHQgYWxsIApkaWZmIC0tZ2l0IGEvamF4d3MvbWFrZWZpbGVzL01ha2VmaWxlIGIvamF4d3MvbWFrZWZpbGVzL01ha2VmaWxlCmluZGV4IGE3NDVlYzguLjk1MzlmZTAgMTAwNjQ0Ci0tLSBhL2pheHdzL21ha2VmaWxlcy9NYWtlZmlsZQorKysgYi9qYXh3cy9tYWtlZmlsZXMvTWFrZWZpbGUKQEAgLTEsNSArMSw1IEBACiAjCi0jIENvcHlyaWdodCAoYykgMjAwNywgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgQ29weXJpZ2h0IChjKSAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogIyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAjCiAjIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMyw3MCArMjMsMjcgQEAKICMgcXVlc3Rpb25zLgogIwogCi0jIFRoaXMgbXVzdCBiZSB0aGUgZmlyc3QgcnVsZQotZGVmYXVsdDogYWxsCisjIExvY2F0ZSB0aGlzIE1ha2VmaWxlCitpZmVxICgkKGZpbHRlciAvJSwkKGxhc3R3b3JkICQoTUFLRUZJTEVfTElTVCkpKSwpCisgICAgbWFrZWZpbGVfcGF0aDo9JChDVVJESVIpLyQobGFzdHdvcmQgJChNQUtFRklMRV9MSVNUKSkKK2Vsc2UKKyAgICBtYWtlZmlsZV9wYXRoOj0kKGxhc3R3b3JkICQoTUFLRUZJTEVfTElTVCkpCitlbmRpZgorcmVwb19kaXI6PSQocGF0c3Vic3QgJS9tYWtlZmlsZXMvTWFrZWZpbGUsJSwkKG1ha2VmaWxlX3BhdGgpKQogCi1pbmNsdWRlICQoU1BFQykKLWluY2x1ZGUgTWFrZUJhc2UuZ21rCi1pbmNsdWRlIEphdmFDb21waWxhdGlvbi5nbWsKKyMgV2hhdCBpcyB0aGUgbmFtZSBvZiB0aGlzIHN1YnN5c3RlbSAobGFuZ3Rvb2xzLCBjb3JiYSwgZXRjKT8KK3N1YnN5c3RlbV9uYW1lOj0kKG5vdGRpciAkKHJlcG9fZGlyKSkKIAotSkFWQUNfSkFSUyA/PSAtWGJvb3RjbGFzc3BhdGgvcDokKExBTkdUT09MU19PVVRQVVRESVIpL2Rpc3QvYm9vdHN0cmFwL2xpYi9qYXZhYy5qYXIgXAotCQktamFyICQoTEFOR1RPT0xTX09VVFBVVERJUikvZGlzdC9ib290c3RyYXAvbGliL2phdmFjLmphcgotRElTQUJMRV9KQVhXU19XQVJOSU5HUzo9LVhsaW50OmFsbCwtdmFyYXJncywtcmF3dHlwZXMsLWRlcHJlY2F0aW9uLC11bmNoZWNrZWQsLXNlcmlhbCwtZGVwLWFubiwtY2FzdCwtZmFsbHRocm91Z2gsLXN0YXRpYworIyBUcnkgdG8gbG9jYXRlIHRvcC1sZXZlbCBtYWtlZmlsZQordG9wX2xldmVsX21ha2VmaWxlOj0kKHJlcG9fZGlyKS8uLi9jb21tb24vbWFrZWZpbGVzL01ha2VmaWxlCitpZm5lcSAoJCh3aWxkY2FyZCAkKHRvcF9sZXZlbF9tYWtlZmlsZSkpLCkKKyAgJChpbmZvIFdpbGwgcnVuICQoc3Vic3lzdGVtX25hbWUpIHRhcmdldCBvbiB0b3AtbGV2ZWwgTWFrZWZpbGUpCisgICQoaW5mbyBXQVJOSU5HOiBUaGlzIGlzIGEgbm9uLXJlY29tbWVuZGVkIHdheSBvZiBidWlsZGluZyEpCisgICQoaW5mbyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0pCitlbHNlCisgICQoaW5mbyBDYW5ub3QgbG9jYXRlIHRvcC1sZXZlbCBNYWtlZmlsZS4gSXMgdGhpcyByZXBvIG5vdCBjaGVja2VkIG91dCBhcyBwYXJ0IG9mIGEgY29tcGxldGUgZm9yZXN0PykKKyAgJChlcnJvciBCdWlsZCBmcm9tIHRvcC1sZXZlbCBNYWtlZmlsZSBpbnN0ZWFkKQorZW5kaWYKIAotIyBUaGUgZ2VuZXJhdGUgbmV3IGJ5dGVjb2RlIHVzZXMgdGhlIG5ldyBjb21waWxlciBmb3IgdG8gZ2VuZXJhdGUgYnl0ZWNvZGUKLSMgZm9yIHRoZSBuZXcgamRrIHRoYXQgaXMgYmVpbmcgYnVpbHQuIFRoZSBjb2RlIGNvbXBpbGVkIGJ5IHRoaXMgc2V0dXAKLSMgY2Fubm90IG5lY2Vzc2FyaWx5IGJlIHJ1biB3aXRoIHRoZSBib290IGpkay4KLSQoZXZhbCAkKGNhbGwgU2V0dXBKYXZhQ29tcGlsZXIsR0VORVJBVEVfTkVXQllURUNPREVfREVCVUcsXAotICAgICBKVk06PSQoSkFWQSksXAotICAgICBKQVZBQzo9JChKQVZBQ19KQVJTKSxcCi0gICAgIEZMQUdTOj0tWERpZ25vcmUuc3ltYm9sLmZpbGU9dHJ1ZSAkKERJU0FCTEVfSkFYV1NfV0FSTklOR1MpIC1nLFwKLSAgICAgU0VSVkVSX0RJUjo9JChTSkFWQUNfU0VSVkVSX0RJUiksXAotICAgICBTRVJWRVJfSlZNOj0kKFNKQVZBQ19TRVJWRVJfSkFWQSkpKQotCi0jIER1bW15IGhlcmUgaXMgbmVlZGVkIHRvIHRyaWdnZXIgY29weWluZyBvZiBNRVRBLUlORgotJChldmFsICQoY2FsbCBTZXR1cEphdmFDb21waWxhdGlvbixCVUlMRF9KQUYsXAotCQlTRVRVUDo9R0VORVJBVEVfTkVXQllURUNPREVfREVCVUcsXAotCQlTUkM6PSQoSkFYV1NfVE9QRElSKS9zcmMvc2hhcmUvamFmX2NsYXNzZXMsXAotCQlDTEVBTjo9LnByb3BlcnRpZXMsXAotCQlDT1BZOj0iZHVtbXkiLFwKLQkJQklOOj0kKEpBWFdTX09VVFBVVERJUikvamFmX2NsYXNzZXMpKQotCi0kKGV2YWwgJChjYWxsIFNldHVwSmF2YUNvbXBpbGF0aW9uLEJVSUxEX0pBWFdTLFwKLQkJU0VUVVA6PUdFTkVSQVRFX05FV0JZVEVDT0RFX0RFQlVHLFwKLQkJU1JDOj0kKEpBWFdTX1RPUERJUikvc3JjL3NoYXJlL2pheHdzX2NsYXNzZXMsXAotCQlDTEVBTjo9LnByb3BlcnRpZXMsXAotCQlCSU46PSQoSkFYV1NfT1VUUFVURElSKS9qYXh3c19jbGFzc2VzLFwKLQkJQ09QWTo9LnhzZCxcCi0JCUNPUFlfRklMRVM6PSQoSkFYV1NfVE9QRElSKS9zcmMvc2hhcmUvamF4d3NfY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2ludGVybmFsL3hqYy9ydW50aW1lL0pBWEJDb250ZXh0RmFjdG9yeS5qYXZhIFwKLQkJCSAgICAkKEpBWFdTX1RPUERJUikvc3JjL3NoYXJlL2pheHdzX2NsYXNzZXMvY29tL3N1bi90b29scy9pbnRlcm5hbC94amMvcnVudGltZS9aZXJvT25lQm9vbGVhbkFkYXB0ZXIuamF2YSxcCi0JCUFERF9KQVZBQ19GTEFHUz0tY3AgJChPVVRQVVRfUk9PVCkvamF4cC9kaXN0L2xpYi9jbGFzc2VzLmphcikpCi0KLSQoSkFYV1NfT1VUUFVURElSKS9qYXh3c19jbGFzc2VzL01FVEEtSU5GL3NlcnZpY2VzL2NvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3Njb21waWxlLlBsdWdpbjogXAotCQkgICAgICAgICAkKEpBWFdTX1RPUERJUikvc3JjL3NoYXJlL2pheHdzX2NsYXNzZXMvY29tL3N1bi90b29scy9ldGMvTUVUQS1JTkYvc2VydmljZXMvY29tLnN1bi50b29scy5pbnRlcm5hbC53cy53c2NvbXBpbGUuUGx1Z2luCi0JbWtkaXIgLXAgJChARCkKLQljcCAkPCAkQAotCi0kKEpBWFdTX09VVFBVVERJUikvamF4d3NfY2xhc3Nlcy9NRVRBLUlORi9zZXJ2aWNlcy9jb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5QbHVnaW46IFwKLQkJICAgICAgICAgJChKQVhXU19UT1BESVIpL3NyYy9zaGFyZS9qYXh3c19jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZXRjL01FVEEtSU5GL3NlcnZpY2VzL2NvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLlBsdWdpbgotCW1rZGlyIC1wICQoQEQpCi0JY3AgJDwgJEAKLQotIyBUaGVyZSBhcmUgdHdvIE1FVEEtSU5GIHNlcnZpY2VzIGZpbGVzIHRoYXQgYXJlIG5lZWRlZCwgYWRkIHRoZXNlIHRvIHRoZSBsaXN0IG9mIGdvYWxzCi1CVUlMRF9KQVhXUyArPSAkKEpBWFdTX09VVFBVVERJUikvamF4d3NfY2xhc3Nlcy9NRVRBLUlORi9zZXJ2aWNlcy9jb20uc3VuLnRvb2xzLmludGVybmFsLndzLndzY29tcGlsZS5QbHVnaW4gXAotICAgICAgICAgICAgICAgJChKQVhXU19PVVRQVVRESVIpL2pheHdzX2NsYXNzZXMvTUVUQS1JTkYvc2VydmljZXMvY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuUGx1Z2luCi0KLSQoZXZhbCAkKGNhbGwgU2V0dXBBcmNoaXZlLEFSQ0hJVkVfSkFYV1MsJChCVUlMRF9KQVhXUykgJChCVUlMRF9KQUYpLFwKLQkJU1JDUzo9JChKQVhXU19PVVRQVVRESVIpL2pheHdzX2NsYXNzZXMgJChKQVhXU19PVVRQVVRESVIpL2phZl9jbGFzc2VzLFwKLQkJU1VGRklYRVM6PS5jbGFzcyAucHJvcGVydGllcyAueHNkIC5qYXZhIFwKLQkJCSAgY29tLnN1bi5taXJyb3IuYXB0LkFubm90YXRpb25Qcm9jZXNzb3JGYWN0b3J5IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuUGx1Z2luLFwKLQkJSkFSOj0kKEpBWFdTX09VVFBVVERJUikvZGlzdC9saWIvY2xhc3Nlcy5qYXIpKQotCi0kKGV2YWwgJChjYWxsIFNldHVwWmlwQXJjaGl2ZSxaSVBfSkFYV1NfU09VUkNFUyxcCi0JCVNSQzo9JChKQVhXU19UT1BESVIpL3NyYy9zaGFyZS9qYWZfY2xhc3NlcyAkKEpBWFdTX1RPUERJUikvc3JjL3NoYXJlL2pheHdzX2NsYXNzZXMsXAotCQlaSVA6PSQoSkFYV1NfT1VUUFVURElSKS9kaXN0L2xpYi9zcmMuemlwKSkKLQotYWxsOiAkKEpBWFdTX09VVFBVVERJUikvZGlzdC9saWIvY2xhc3Nlcy5qYXIgJChKQVhXU19PVVRQVVRESVIpL2Rpc3QvbGliL3NyYy56aXAKLQotLlBIT05ZOiBkZWZhdWx0IGFsbCAKK2FsbDoKKwlAJChNQUtFKSAtZiAkKHRvcF9sZXZlbF9tYWtlZmlsZSkgJChzdWJzeXN0ZW1fbmFtZSkKZGlmZiAtLWdpdCBhL2pkay8uaGd0YWdzIGIvamRrLy5oZ3RhZ3MKaW5kZXggYzBhNGMzMi4uZGUxYTU0MyAxMDA2NDQKLS0tIGEvamRrLy5oZ3RhZ3MKKysrIGIvamRrLy5oZ3RhZ3MKQEAgLTE4MywzICsxODMsNCBAQAogYWJhZDFmNDE3YmQzZGY0Mjk2NjMxZmM5NDNjZDNiN2Y1MDYyYzg4YSBqZGs4LWI1OQogY2VjOGZhMDJmMTU2MzRhY2Q3ZDAyZDA0YjBiMmQ4YzA0NGNkYmFhYSBqZGs4LWI2MAogNjFkZGIzZmQwMDBhMDlhYjA1YmZmMTk0MGIwYWMyMTE2NjFlOTRjZiBqZGs4LWI2MQorNTBiOGIxNzQ0OWQyMDBjNjZiZmQ2OGZiNGYzYTkxOTc0MzJjOWUyYiBqZGs4LWI2MgpkaWZmIC0tZ2l0IGEvamRrL1RISVJEX1BBUlRZX1JFQURNRSBiL2pkay9USElSRF9QQVJUWV9SRUFETUUKaW5kZXggNzU5NzMzYi4uNmRjMWIzMyAxMDA2NDQKLS0tIGEvamRrL1RISVJEX1BBUlRZX1JFQURNRQorKysgYi9qZGsvVEhJUkRfUEFSVFlfUkVBRE1FCkBAIC0yLDExICsyLDExIEBACiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAlJSBUaGlzIG5vdGljZSBpcyBwcm92aWRlZCB3aXRoIHJlc3BlY3QgdG8gQVNNIEJ5dGVjb2RlIE1hbmlwdWxhdGlvbiAKLUZyYW1ld29yayB2My4xLCB3aGljaCBpcyBpbmNsdWRlZCB3aXRoIEpSRSA3LCBKREsgNywgYW5kIE9wZW5KREsgNy4KK0ZyYW1ld29yayB2NC4wLCB3aGljaCBpcyBpbmNsdWRlZCB3aXRoIEpSRSA4LCBhbmQgSkRLIDguCiAKIC0tLSBiZWdpbiBvZiBMSUNFTlNFIC0tLQogCi1Db3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBJTlJJQSwgRnJhbmNlIFRlbGVjb20KK0NvcHlyaWdodCAoYykgMjAwMC0yMDExIEZyYW5jZSBU6WzpY29tCiBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKZGlmZiAtLWdpdCBhL2pkay9tYWtlL01ha2VmaWxlIGIvamRrL21ha2UvTWFrZWZpbGUKaW5kZXggMmU1MDMyZC4uY2ViMTQ5MiAxMDA2NDQKLS0tIGEvamRrL21ha2UvTWFrZWZpbGUKKysrIGIvamRrL21ha2UvTWFrZWZpbGUKQEAgLTIzMyw3ICsyMzMsNyBAQAogCiBhbGwgYnVpbGQ6OiBzYW5pdHktYWxsIHBvc3Qtc2FuaXR5LWFsbAogCi1TVUJESVJTICAgICAgID0gdG9vbHMgamF2YSBqYXZheCBzdW4gY29tCitTVUJESVJTICAgICAgID0gdG9vbHMgamF2YSBqYXZheCBzdW4gY29tIGpkawogaWZlcSAoJChQTEFURk9STSksIG1hY29zeCkKICAgU1VCRElSUyArPSBhcHBsZQogZW5kaWYKZGlmZiAtLWdpdCBhL2pkay9tYWtlL2NvbW1vbi9SZWxlYXNlLmdtayBiL2pkay9tYWtlL2NvbW1vbi9SZWxlYXNlLmdtawppbmRleCAyZjJiMTY5My4uMTVhYTdjOSAxMDA2NDQKLS0tIGEvamRrL21ha2UvY29tbW9uL1JlbGVhc2UuZ21rCisrKyBiL2pkay9tYWtlL2NvbW1vbi9SZWxlYXNlLmdtawpAQCAtMzQ4LDE1ICszNDgsMTUgQEAKIAlzdW4vdG9vbHMvc2VyaWFsdmVyCVwKIAlzdW4vdG9vbHMvdHJlZQkJXAogCXN1bi90b29scy91dGlsCQlcCi0Jc3VuL3NlY3VyaXR5L3Rvb2xzL0phckJBU0U2NEVuY29kZXIuY2xhc3MgXAotCXN1bi9zZWN1cml0eS90b29scy9KYXJTaWduZXIuY2xhc3MgXAotCXN1bi9zZWN1cml0eS90b29scy9KYXJTaWduZXJQYXJhbWV0ZXJzLmNsYXNzIFwKLQlzdW4vc2VjdXJpdHkvdG9vbHMvSmFyU2lnbmVyUmVzb3VyY2VzLmNsYXNzIFwKLQlzdW4vc2VjdXJpdHkvdG9vbHMvSmFyU2lnbmVyUmVzb3VyY2VzX2phLmNsYXNzIFwKLQlzdW4vc2VjdXJpdHkvdG9vbHMvSmFyU2lnbmVyUmVzb3VyY2VzX3poX0NOLmNsYXNzIFwKLQlzdW4vc2VjdXJpdHkvdG9vbHMvU2lnbmF0dXJlRmlsZVwkJEJsb2NrLmNsYXNzIFwKLQlzdW4vc2VjdXJpdHkvdG9vbHMvU2lnbmF0dXJlRmlsZS5jbGFzcyBcCi0Jc3VuL3NlY3VyaXR5L3Rvb2xzL1RpbWVzdGFtcGVkU2lnbmVyLmNsYXNzIFwKKwlzdW4vc2VjdXJpdHkvdG9vbHMvamFyc2lnbmVyL0phckJBU0U2NEVuY29kZXIuY2xhc3MgXAorCXN1bi9zZWN1cml0eS90b29scy9qYXJzaWduZXIvTWFpbi5jbGFzcyBcCisJc3VuL3NlY3VyaXR5L3Rvb2xzL2phcnNpZ25lci9KYXJTaWduZXJQYXJhbWV0ZXJzLmNsYXNzIFwKKwlzdW4vc2VjdXJpdHkvdG9vbHMvamFyc2lnbmVyL1Jlc291cmNlcy5jbGFzcyBcCisJc3VuL3NlY3VyaXR5L3Rvb2xzL2phcnNpZ25lci9SZXNvdXJjZXNfamEuY2xhc3MgXAorCXN1bi9zZWN1cml0eS90b29scy9qYXJzaWduZXIvUmVzb3VyY2VzX3poX0NOLmNsYXNzIFwKKwlzdW4vc2VjdXJpdHkvdG9vbHMvamFyc2lnbmVyL1NpZ25hdHVyZUZpbGVcJCRCbG9jay5jbGFzcyBcCisJc3VuL3NlY3VyaXR5L3Rvb2xzL2phcnNpZ25lci9TaWduYXR1cmVGaWxlLmNsYXNzIFwKKwlzdW4vc2VjdXJpdHkvdG9vbHMvamFyc2lnbmVyL1RpbWVzdGFtcGVkU2lnbmVyLmNsYXNzIFwKIAlzdW4vcm1pL3JtaWMJCVwKIAlzdW4vYXBwbGV0CQlcCiAJc3VuL2p2bXN0YXQJCVwKQEAgLTU3MiwxNSArNTcyLDE1IEBACiAJJChFQ0hPKSAic3VuL3Rvb2xzL3NlcmlhbHZlci8iID4+ICRACiAJJChFQ0hPKSAic3VuL3Rvb2xzL3RyZWUvIiA+PiAkQAogCSQoRUNITykgInN1bi90b29scy91dGlsLyIgPj4gJEAKLQkkKEVDSE8pICJzdW4vc2VjdXJpdHkvdG9vbHMvSmFyQkFTRTY0RW5jb2Rlci5jbGFzcyIgPj4gJEAKLQkkKEVDSE8pICJzdW4vc2VjdXJpdHkvdG9vbHMvSmFyU2lnbmVyLmNsYXNzIiA+PiAkQAotCSQoRUNITykgInN1bi9zZWN1cml0eS90b29scy9KYXJTaWduZXJQYXJhbWV0ZXJzLmNsYXNzIiA+PiAkQAotCSQoRUNITykgInN1bi9zZWN1cml0eS90b29scy9KYXJTaWduZXJSZXNvdXJjZXMuY2xhc3MiID4+ICRACi0JJChFQ0hPKSAic3VuL3NlY3VyaXR5L3Rvb2xzL0phclNpZ25lclJlc291cmNlc19qYS5jbGFzcyIgPj4gJEAKLQkkKEVDSE8pICJzdW4vc2VjdXJpdHkvdG9vbHMvSmFyU2lnbmVyUmVzb3VyY2VzX3poX0NOLmNsYXNzIiA+PiAkQAotCSQoRUNITykgInN1bi9zZWN1cml0eS90b29scy9TaWduYXR1cmVGaWxlXCQkQmxvY2suY2xhc3MiID4+ICRACi0JJChFQ0hPKSAic3VuL3NlY3VyaXR5L3Rvb2xzL1NpZ25hdHVyZUZpbGUuY2xhc3MiID4+ICRACi0JJChFQ0hPKSAic3VuL3NlY3VyaXR5L3Rvb2xzL1RpbWVzdGFtcGVkU2lnbmVyLmNsYXNzIiA+PiAkQAorCSQoRUNITykgInN1bi9zZWN1cml0eS90b29scy9qYXJzaWduZXIvSmFyQkFTRTY0RW5jb2Rlci5jbGFzcyIgPj4gJEAKKwkkKEVDSE8pICJzdW4vc2VjdXJpdHkvdG9vbHMvamFyc2lnbmVyL01haW4uY2xhc3MiID4+ICRACisJJChFQ0hPKSAic3VuL3NlY3VyaXR5L3Rvb2xzL2phcnNpZ25lci9KYXJTaWduZXJQYXJhbWV0ZXJzLmNsYXNzIiA+PiAkQAorCSQoRUNITykgInN1bi9zZWN1cml0eS90b29scy9qYXJzaWduZXIvUmVzb3VyY2VzLmNsYXNzIiA+PiAkQAorCSQoRUNITykgInN1bi9zZWN1cml0eS90b29scy9qYXJzaWduZXIvUmVzb3VyY2VzX2phLmNsYXNzIiA+PiAkQAorCSQoRUNITykgInN1bi9zZWN1cml0eS90b29scy9qYXJzaWduZXIvUmVzb3VyY2VzX3poX0NOLmNsYXNzIiA+PiAkQAorCSQoRUNITykgInN1bi9zZWN1cml0eS90b29scy9qYXJzaWduZXIvU2lnbmF0dXJlRmlsZVwkJEJsb2NrLmNsYXNzIiA+PiAkQAorCSQoRUNITykgInN1bi9zZWN1cml0eS90b29scy9qYXJzaWduZXIvU2lnbmF0dXJlRmlsZS5jbGFzcyIgPj4gJEAKKwkkKEVDSE8pICJzdW4vc2VjdXJpdHkvdG9vbHMvamFyc2lnbmVyL1RpbWVzdGFtcGVkU2lnbmVyLmNsYXNzIiA+PiAkQAogCSQoRUNITykgInN1bi9zZWN1cml0eS9wcm92aWRlci9TdW4uY2xhc3MiID4+ICRACiAJJChFQ0hPKSAic3VuL3NlY3VyaXR5L3JzYS9TdW5Sc2FTaWduLmNsYXNzIiA+PiAkQAogCSQoRUNITykgInN1bi9zZWN1cml0eS9zc2wvIiA+PiAkQApkaWZmIC0tZ2l0IGEvamRrL21ha2UvY29tbW9uL2ludGVybmFsL0RlZnMtamF4d3MuZ21rIGIvamRrL21ha2UvY29tbW9uL2ludGVybmFsL0RlZnMtamF4d3MuZ21rCmluZGV4IGYwYmExMmIuLjJjZWU2M2EgMTAwNjQ0Ci0tLSBhL2pkay9tYWtlL2NvbW1vbi9pbnRlcm5hbC9EZWZzLWpheHdzLmdtaworKysgYi9qZGsvbWFrZS9jb21tb24vaW50ZXJuYWwvRGVmcy1qYXh3cy5nbWsKQEAgLTM0LDYgKzM0LDEwIEBACiAgICAgIGphdmF4L3htbC93cyBcCiAgICAgIGphdmF4L2p3cyBcCiAgICAgIGphdmF4L2Fubm90YXRpb24gXAorICAgICBjb20vc3VuL29yZy9nbGFzc2Zpc2ggXAorICAgICBjb20vc3VuL2lzdGFjay9pbnRlcm5hbCBcCisgICAgIGNvbS9zdW4vaXN0YWNrL2ludGVybmFsL2xvY2FsaXphdGlvbiBcCisgICAgIGNvbS9zdW4vaXN0YWNrL2ludGVybmFsL2xvZ2dpbmcgXAogICAgICBjb20vc3VuL3htbC9pbnRlcm5hbC9iaW5kIFwKICAgICAgY29tL3N1bi94bWwvaW50ZXJuYWwvZmFzdGluZm9zZXQgXAogICAgICBjb20vc3VuL3htbC9pbnRlcm5hbC9tZXNzYWdpbmcgXApkaWZmIC0tZ2l0IGEvamRrL21ha2UvamF2YS9qYXZhL01ha2VmaWxlIGIvamRrL21ha2UvamF2YS9qYXZhL01ha2VmaWxlCmluZGV4IDY2OTNhODIuLmIyZDFjNWEgMTAwNjQ0Ci0tLSBhL2pkay9tYWtlL2phdmEvamF2YS9NYWtlZmlsZQorKysgYi9qZGsvbWFrZS9qYXZhL2phdmEvTWFrZWZpbGUKQEAgLTEsNSArMSw1IEBACiAjCi0jIENvcHlyaWdodCAoYykgMTk5NywgMjAxMSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgQ29weXJpZ2h0IChjKSAxOTk3LCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogIyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAjCiAjIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC02NCwxMyArNjQsMTEgQEAKIGluY2x1ZGUgRXhwb3J0ZWRmaWxlcy5nbWsKIAogaWZlcSAoJChQTEFURk9STSksd2luZG93cykKLUZJTEVTX2phdmEgKz0gCWphdmEvaW8vV2luMzJGaWxlU3lzdGVtLmphdmEgXAotCQlqYXZhL2lvL1dpbk5URmlsZVN5c3RlbS5qYXZhIFwKK0ZJTEVTX2phdmEgKz0gCWphdmEvaW8vV2luTlRGaWxlU3lzdGVtLmphdmEgXAogCQlqYXZhL3V0aWwvcHJlZnMvV2luZG93c1ByZWZlcmVuY2VzLmphdmEgXAogICAgICAgICAgICAgICAgIGphdmEvdXRpbC9wcmVmcy9XaW5kb3dzUHJlZmVyZW5jZXNGYWN0b3J5LmphdmEKIAogRklMRVNfYyAgICArPSAgIFByb2Nlc3NJbXBsX21kLmMgXAotCQlXaW4zMkZpbGVTeXN0ZW1fbWQuYyBcCiAJCVdpbk5URmlsZVN5c3RlbV9tZC5jIFwKIAkJY2Fub25pY2FsaXplX21kLmMgXAogCQlkaXJlbnRfbWQuYyBcCmRpZmYgLS1naXQgYS9qZGsvbWFrZWZpbGVzL21hcGZpbGVzL2xhdW5jaGVycy9tYXBmaWxlLWFtZDY0IGIvamRrL21ha2UvamRrL01ha2VmaWxlCnNpbWlsYXJpdHkgaW5kZXggNzMlCnJlbmFtZSBmcm9tIGpkay9tYWtlZmlsZXMvbWFwZmlsZXMvbGF1bmNoZXJzL21hcGZpbGUtYW1kNjQKcmVuYW1lIHRvIGpkay9tYWtlL2pkay9NYWtlZmlsZQppbmRleCA3NjBmY2MxLi5iOGFjNzQyIDEwMDY0NAotLS0gYS9qZGsvbWFrZWZpbGVzL21hcGZpbGVzL2xhdW5jaGVycy9tYXBmaWxlLWFtZDY0CisrKyBiL2pkay9tYWtlL2pkay9NYWtlZmlsZQpAQCAtMSw1ICsxLDUgQEAKICMKLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDExLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBDb3B5cmlnaHQgKGMpIDE5OTcsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAjIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICMKICMgVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIyLDE4ICsyMiwxNyBAQAogIyBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CiAjIHF1ZXN0aW9ucy4KICMKKwogIwotIyBTcGVjaWZ5IHdoYXQgZ2xvYmFsIHN5bWJvbHMgd2UgZXhwb3J0LiAgTm90ZSB0aGF0IHdlJ3JlIG5vdCByZWFsbHkKLSMgaW50ZXJlc3RlZCBpbiBkZWNsYXJpbmcgYSB2ZXJzaW9uLCBzaW1wbHkgc2NvcGluZyB0aGUgZmlsZSBpcyBzdWZmaWNpZW50LgorIyBNYWtlZmlsZSBmb3IgYnVpbGRpbmcgYWxsIG9mIGphdmEKICMKIAotU1VOV3ByaXZhdGVfMS4xIHsKLQlnbG9iYWw6Ci0JCW1haW47CQkjIFByb3ZpZGVzIGJhc2ljIGFkYiBzeW1ib2wgb2Zmc2V0cwotCQllbnZpcm9uOwkjIFB1YmxpYyBzeW1ib2xzIGFuZCByZXF1aXJlZCBieSBKYXZhIHJ1biB0aW1lCi0JCV9lbnZpcm9uOwotCQlfX2Vudmlyb25fbG9jazsKK0JVSUxERElSID0gLi4KK1BST0RVQ1QgPSBqZGsKK2luY2x1ZGUgJChCVUlMRERJUikvY29tbW9uL0RlZnMuZ21rCiAKLQlsb2NhbDoKLQkJKjsKLX07CitTVUJESVJTID0gYXNtCitpbmNsdWRlICQoQlVJTERESVIpL2NvbW1vbi9TdWJkaXJzLmdtaworCithbGwgYnVpbGQgY2xlYW4gY2xvYmJlcjo6CisJJChTVUJESVJTLWxvb3ApCmRpZmYgLS1naXQgYS9qZGsvbWFrZWZpbGVzL21hcGZpbGVzL2xhdW5jaGVycy9tYXBmaWxlLWFtZDY0IGIvamRrL21ha2UvamRrL2FzbS9NYWtlZmlsZQpzaW1pbGFyaXR5IGluZGV4IDczJQpjb3B5IGZyb20gamRrL21ha2VmaWxlcy9tYXBmaWxlcy9sYXVuY2hlcnMvbWFwZmlsZS1hbWQ2NApjb3B5IHRvIGpkay9tYWtlL2pkay9hc20vTWFrZWZpbGUKaW5kZXggNzYwZmNjMS4uNDhiOGY2MCAxMDA2NDQKLS0tIGEvamRrL21ha2VmaWxlcy9tYXBmaWxlcy9sYXVuY2hlcnMvbWFwZmlsZS1hbWQ2NAorKysgYi9qZGsvbWFrZS9qZGsvYXNtL01ha2VmaWxlCkBAIC0xLDUgKzEsNSBAQAogIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMTEsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIENvcHlyaWdodCAoYykgMTk5NSwgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICMgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogIwogIyBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjIsMTggKzIyLDE5IEBACiAjIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKICMgcXVlc3Rpb25zLgogIwotIwotIyBTcGVjaWZ5IHdoYXQgZ2xvYmFsIHN5bWJvbHMgd2UgZXhwb3J0LiAgTm90ZSB0aGF0IHdlJ3JlIG5vdCByZWFsbHkKLSMgaW50ZXJlc3RlZCBpbiBkZWNsYXJpbmcgYSB2ZXJzaW9uLCBzaW1wbHkgc2NvcGluZyB0aGUgZmlsZSBpcyBzdWZmaWNpZW50LgotIwogCi1TVU5XcHJpdmF0ZV8xLjEgewotCWdsb2JhbDoKLQkJbWFpbjsJCSMgUHJvdmlkZXMgYmFzaWMgYWRiIHN5bWJvbCBvZmZzZXRzCi0JCWVudmlyb247CSMgUHVibGljIHN5bWJvbHMgYW5kIHJlcXVpcmVkIGJ5IEphdmEgcnVuIHRpbWUKLQkJX2Vudmlyb247Ci0JCV9fZW52aXJvbl9sb2NrOworQlVJTERESVIgPSAuLi8uLgorUEFDS0FHRSA9IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbQorUFJPRFVDVCA9IGpkaworSkFWQUNfTElOVF9PUFRJT05TPS1YbGludDphbGwKK2luY2x1ZGUgJChCVUlMRERJUikvY29tbW9uL0RlZnMuZ21rCiAKLQlsb2NhbDoKLQkJKjsKLX07CisjCisjIEZpbGVzIHRvIGNvbXBpbGUKKyMKK0FVVE9fRklMRVNfSkFWQV9ESVJTID0gamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtCisKKyMKKyMgUnVsZXMKKyMKK2luY2x1ZGUgJChCVUlMRERJUikvY29tbW9uL0NsYXNzZXMuZ21rCmRpZmYgLS1naXQgYS9qZGsvbWFrZS9qcHJ0LnByb3BlcnRpZXMgYi9qZGsvbWFrZS9qcHJ0LnByb3BlcnRpZXMKaW5kZXggZjQxYTIyNy4uMmMxZWIyYyAxMDA2NDQKLS0tIGEvamRrL21ha2UvanBydC5wcm9wZXJ0aWVzCisrKyBiL2pkay9tYWtlL2pwcnQucHJvcGVydGllcwpAQCAtNzcsMjAgKzc3LDE4IEBACiAgICAgJHtqcHJ0Lm15LnRlc3QudGFyZ2V0LnNldDpURVNUTkFNRT1qZGtfdXRpbH0sICAgICAgICAgICAgICAgXAogICAgICR7anBydC5teS50ZXN0LnRhcmdldC5zZXQ6VEVTVE5BTUU9amRrX2lvfSwgICAgICAgICAgICAgICAgIFwKICAgICAke2pwcnQubXkudGVzdC50YXJnZXQuc2V0OlRFU1ROQU1FPWpka19uZXR9LCAgICAgICAgICAgICAgICBcCi0gICAgJHtqcHJ0Lm15LnRlc3QudGFyZ2V0LnNldDpURVNUTkFNRT1qZGtfbmlvMX0sICAgICAgICAgICAgICAgXAotICAgICR7anBydC5teS50ZXN0LnRhcmdldC5zZXQ6VEVTVE5BTUU9amRrX25pbzJ9LCAgICAgICAgICAgICAgIFwKLSAgICAke2pwcnQubXkudGVzdC50YXJnZXQuc2V0OlRFU1ROQU1FPWpka19uaW8zfSwgICAgICAgICAgICAgICBcCisgICAgJHtqcHJ0Lm15LnRlc3QudGFyZ2V0LnNldDpURVNUTkFNRT1qZGtfbmlvfSwgICAgICAgICAgICAgICAgXAogICAgICR7anBydC5teS50ZXN0LnRhcmdldC5zZXQ6VEVTVE5BTUU9amRrX3NlY3VyaXR5MX0sICAgICAgICAgIFwKICAgICAke2pwcnQubXkudGVzdC50YXJnZXQuc2V0OlRFU1ROQU1FPWpka19zZWN1cml0eTJ9LCAgICAgICAgICBcCiAgICAgJHtqcHJ0Lm15LnRlc3QudGFyZ2V0LnNldDpURVNUTkFNRT1qZGtfc2VjdXJpdHkzfSwgICAgICAgICAgXAogICAgICR7anBydC5teS50ZXN0LnRhcmdldC5zZXQ6VEVTVE5BTUU9amRrX3JtaX0sICAgICAgICAgICAgICAgIFwKLSAgICAke2pwcnQubXkudGVzdC50YXJnZXQuc2V0OlRFU1ROQU1FPWpka19tYW5hZ2VtZW50MX0sICAgICAgICBcCi0gICAgJHtqcHJ0Lm15LnRlc3QudGFyZ2V0LnNldDpURVNUTkFNRT1qZGtfbWFuYWdlbWVudDJ9LCAgICAgICAgXAorICAgICR7anBydC5teS50ZXN0LnRhcmdldC5zZXQ6VEVTVE5BTUU9amRrX21hbmFnZW1lbnR9LCAgICAgICAgIFwKKyAgICAke2pwcnQubXkudGVzdC50YXJnZXQuc2V0OlRFU1ROQU1FPWpka19qbXh9LCAgICAgICAgICAgICAgICBcCiAgICAgJHtqcHJ0Lm15LnRlc3QudGFyZ2V0LnNldDpURVNUTkFNRT1qZGtfdGV4dH0sICAgICAgICAgICAgICAgXAotICAgICR7anBydC5teS50ZXN0LnRhcmdldC5zZXQ6VEVTVE5BTUU9amRrX3Rvb2xzMX0sICAgICAgICAgICAgIFwKLSAgICAke2pwcnQubXkudGVzdC50YXJnZXQuc2V0OlRFU1ROQU1FPWpka190b29sczJ9LCAgICAgICAgICAgICBcCisgICAgJHtqcHJ0Lm15LnRlc3QudGFyZ2V0LnNldDpURVNUTkFNRT1qZGtfdG9vbHN9LCAgICAgICAgICAgICAgXAorICAgICR7anBydC5teS50ZXN0LnRhcmdldC5zZXQ6VEVTVE5BTUU9amRrX2pkaX0sICAgICAgICAgICAgICAgIFwKICAgICAke2pwcnQubXkudGVzdC50YXJnZXQuc2V0OlRFU1ROQU1FPWpka19qZnJ9LCAgICAgICAgICAgICAgICBcCi0gICAgJHtqcHJ0Lm15LnRlc3QudGFyZ2V0LnNldDpURVNUTkFNRT1qZGtfbWlzY30KKyAgICAke2pwcnQubXkudGVzdC50YXJnZXQuc2V0OlRFU1ROQU1FPWpka19vdGhlcn0KIAogIyBBbGwgdm0gdGVzdCB0YXJnZXRzICh0ZXN0c2V0PWFsbCkKIGpwcnQudm0uYWxsLnRlc3QudGFyZ2V0cz0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCmRpZmYgLS1naXQgYS9qZGsvbWFrZS9sYXVuY2hlcnMvTWFrZWZpbGUgYi9qZGsvbWFrZS9sYXVuY2hlcnMvTWFrZWZpbGUKaW5kZXggOTk3OWQ5Ny4uM2Q5NTExNCAxMDA2NDQKLS0tIGEvamRrL21ha2UvbGF1bmNoZXJzL01ha2VmaWxlCisrKyBiL2pkay9tYWtlL2xhdW5jaGVycy9NYWtlZmlsZQpAQCAtNTgsNyArNTgsNyBAQAogJChjYWxsIG1ha2UtbGF1bmNoZXIsIGV4dGNoZWNrLCBjb20uc3VuLnRvb2xzLmV4dGNoZWNrLk1haW4sICwgKQogJChjYWxsIG1ha2UtbGF1bmNoZXIsIGlkbGosIGNvbS5zdW4udG9vbHMuY29yYmEuc2UuaWRsLnRvSmF2YVBvcnRhYmxlLkNvbXBpbGUsICwgKQogJChjYWxsIG1ha2UtbGF1bmNoZXIsIGphciwgc3VuLnRvb2xzLmphci5NYWluLCAsICkKLSQoY2FsbCBtYWtlLWxhdW5jaGVyLCBqYXJzaWduZXIsIHN1bi5zZWN1cml0eS50b29scy5KYXJTaWduZXIsICwgKQorJChjYWxsIG1ha2UtbGF1bmNoZXIsIGphcnNpZ25lciwgc3VuLnNlY3VyaXR5LnRvb2xzLmphcnNpZ25lci5NYWluLCAsICkKICQoY2FsbCBtYWtlLWxhdW5jaGVyLCBqYXZhYywgY29tLnN1bi50b29scy5qYXZhYy5NYWluLCAsICkKICQoY2FsbCBtYWtlLWxhdW5jaGVyLCBqYXZhZG9jLCBjb20uc3VuLnRvb2xzLmphdmFkb2MuTWFpbiwgLCApCiAkKGNhbGwgbWFrZS1sYXVuY2hlciwgamF2YWgsIGNvbS5zdW4udG9vbHMuamF2YWguTWFpbiwgLCApCmRpZmYgLS1naXQgYS9qZGsvbWFrZS9zdW4vbmV0L0ZJTEVTX2phdmEuZ21rIGIvamRrL21ha2Uvc3VuL25ldC9GSUxFU19qYXZhLmdtawppbmRleCA2YzE0MGFiLi45YzVmZWI0IDEwMDY0NAotLS0gYS9qZGsvbWFrZS9zdW4vbmV0L0ZJTEVTX2phdmEuZ21rCisrKyBiL2pkay9tYWtlL3N1bi9uZXQvRklMRVNfamF2YS5nbWsKQEAgLTEyOCw4ICsxMjgsNiBAQAogCXN1bi9uZXQvd3d3L2NvbnRlbnQvYXVkaW8veF93YXYuamF2YSBcCiAJc3VuL25ldC93d3cvcHJvdG9jb2wvZnRwL0hhbmRsZXIuamF2YSBcCiAJc3VuL25ldC93d3cvcHJvdG9jb2wvZnRwL0Z0cFVSTENvbm5lY3Rpb24uamF2YSBcCi0Jc3VuL25ldC93d3cvcHJvdG9jb2wvZ29waGVyL0dvcGhlckNsaWVudC5qYXZhIFwKLQlzdW4vbmV0L3d3dy9wcm90b2NvbC9nb3BoZXIvSGFuZGxlci5qYXZhIFwKIAlzdW4vbmV0L3d3dy9wcm90b2NvbC9tYWlsdG8vSGFuZGxlci5qYXZhIFwKIAlzdW4vbmV0L3d3dy9wcm90b2NvbC9tYWlsdG8vTWFpbFRvVVJMQ29ubmVjdGlvbi5qYXZhIFwKIAlzdW4vbmV0L2lkbi9QdW55Y29kZS5qYXZhIFwKZGlmZiAtLWdpdCBhL2pkay9tYWtlL3N1bi9zZWN1cml0eS90b29scy9NYWtlZmlsZSBiL2pkay9tYWtlL3N1bi9zZWN1cml0eS90b29scy9NYWtlZmlsZQppbmRleCBmNDYwNzBkLi5hMDNmODVkIDEwMDY0NAotLS0gYS9qZGsvbWFrZS9zdW4vc2VjdXJpdHkvdG9vbHMvTWFrZWZpbGUKKysrIGIvamRrL21ha2Uvc3VuL3NlY3VyaXR5L3Rvb2xzL01ha2VmaWxlCkBAIC0xLDUgKzEsNSBAQAogIwotIyBDb3B5cmlnaHQgKGMpIDE5OTcsIDIwMTEsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIENvcHlyaWdodCAoYykgMTk5NywgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICMgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogIwogIyBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMzcsNyArMzcsNyBAQAogIyBSZXNvdXJjZXMKICMKIExPQ0FMRV9TRVRfREVGSU5JVElPTiA9IGpkawotUkVTT1VSQ0VfQlVORExFU19KQVZBID0gc3VuL3NlY3VyaXR5L3Rvb2xzL0phclNpZ25lclJlc291cmNlcy5qYXZhCitSRVNPVVJDRV9CVU5ETEVTX0pBVkEgPSBzdW4vc2VjdXJpdHkvdG9vbHMvamFyc2lnbmVyL1Jlc291cmNlcy5qYXZhCiAKICMKICMgUnVsZXMKQEAgLTQ1LDcgKzQ1LDcgQEAKIGluY2x1ZGUgJChCVUlMRERJUikvY29tbW9uL0NsYXNzZXMuZ21rCiAKIGJ1aWxkOgotCSQoY2FsbCBtYWtlLWxhdW5jaGVyLCBrZXl0b29sLCBzdW4uc2VjdXJpdHkudG9vbHMuS2V5VG9vbCwgLCApCisJJChjYWxsIG1ha2UtbGF1bmNoZXIsIGtleXRvb2wsIHN1bi5zZWN1cml0eS50b29scy5rZXl0b29sLk1haW4sICwgKQogaWZuZGVmIEJVSUxEX0hFQURMRVNTX09OTFkKIAkkKGNhbGwgbWFrZS1sYXVuY2hlciwgcG9saWN5dG9vbCwgc3VuLnNlY3VyaXR5LnRvb2xzLnBvbGljeXRvb2wuUG9saWN5VG9vbCwgLCApCiBlbmRpZgpkaWZmIC0tZ2l0IGEvamRrL21ha2VmaWxlcy9CdWlsZEpkay5nbWsgYi9qZGsvbWFrZWZpbGVzL0J1aWxkSmRrLmdtawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWJhZDc3Ci0tLSAvZGV2L251bGwKKysrIGIvamRrL21ha2VmaWxlcy9CdWlsZEpkay5nbWsKQEAgLTAsMCArMSwxMjQgQEAKKyMKKyMgQ29weXJpZ2h0IChjKSAxOTk1LCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisjCisjIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcworIyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisjIGJ5IE9yYWNsZSBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorIworIyBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisjIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorIyBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisjIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorIworIyBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQorIyBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CisjIHF1ZXN0aW9ucy4KKyMKKworIyBUaGlzIG11c3QgYmUgdGhlIGZpcnN0IHJ1bGUKK2RlZmF1bHQ6IGFsbAorCisjIEluY2x1c2lvbiBvZiB0aGlzIHBzZXVkby10YXJnZXQgd2lsbCBjYXVzZSBtYWtlIHRvIGV4ZWN1dGUgdGhpcyBmaWxlCisjIHNlcmlhbGx5LCByZWdhcmRsZXNzIG9mIC1qLiBSZWN1cnNpdmVseSBjYWxsZWQgbWFrZWZpbGVzIHdpbGwgbm90IGJlCisjIGFmZmVjdGVkLCBob3dldmVyLiBUaGlzIGlzIHJlcXVpcmVkIGZvciBjb3JyZWN0IGRlcGVuZGVuY3kgbWFuYWdlbWVudC4KKy5OT1RQQVJBTExFTDoKKworaW5jbHVkZSAkKFNQRUMpCitpbmNsdWRlIE1ha2VCYXNlLmdtaworaW5jbHVkZSBKYXZhQ29tcGlsYXRpb24uZ21rCitpbmNsdWRlIE5hdGl2ZUNvbXBpbGF0aW9uLmdtaworCisjIFNldHVwIHRoZSBqYXZhIGNvbXBpbGVycyBmb3IgdGhlIEpESyBidWlsZC4KK2luY2x1ZGUgU2V0dXAuZ21rCisKKyMgU2V0dXAgdGhlIGJ1aWxkIHRvb2xzLgoraW5jbHVkZSBUb29scy5nbWsKKworaW1wb3J0OiAkKEJVSUxEX1RPT0xTKSBpbXBvcnQtb25seQoraW1wb3J0LW9ubHk6CisjICAgICAgIEltcG9ydCAoY29yYmEgamF4cCBqYXh3cyBsYW5ndG9vbHMgaG90c3BvdCkKKwkrJChNQUtFKSAtZiBJbXBvcnQuZ21rCisKK2dlbnNyYzogaW1wb3J0IGdlbnNyYy1vbmx5CitnZW5zcmMtb25seToKKwkrJChNQUtFKSAtZiBHZW5lcmF0ZUphdmFTb3VyY2VzLmdtaworIyAgICAgICBPaywgbm93IGdlbnNyYyBpcyBmdWxseSBwb3B1bGF0ZWQuCisKK2dlbmRhdGE6IGdlbnNyYyBnZW5kYXRhLW9ubHkKK2dlbmRhdGEtb25seToKKwkrJChNQUtFKSAtZiBHZW5lcmF0ZURhdGEuZ21rCisKK2NsYXNzZXM6IGdlbmRhdGEgY2xhc3Nlcy1vbmx5CitjbGFzc2VzLW9ubHk6CisJKyQoTUFLRSkgLWYgQ29tcGlsZUphdmFDbGFzc2VzLmdtaworIyAgICAgICBUaGUgY2xhc3NlcyBhcmUgbm93IGJ1aWx0IGFuZAorIyAgICAgICBhbnkgamF2YWggZmlsZXMgaGF2ZSBub3cgYmVlbiBnZW5lcmF0ZWQuCisKK2xpYnM6IGNsYXNzZXMgbGlicy1vbmx5CitsaWJzLW9ubHk6CisJKyQoTUFLRSkgLWYgQ29tcGlsZU5hdGl2ZUxpYnJhcmllcy5nbWsKKworbGF1bmNoZXJzOiBsaWJzIGxhdW5jaGVycy1vbmx5CitsYXVuY2hlcnMtb25seToKKyMgICAgICAgRmluYWxseSBjb21waWxlIHRoZSBsYXVuY2hlcnMuCisJKyQoTUFLRSkgLWYgQ29tcGlsZUxhdW5jaGVycy5nbWsKKworZ2VuY2xhc3NlczogbGF1bmNoZXJzIGdlbmNsYXNzZXMtb25seQorZ2VuY2xhc3Nlcy1vbmx5OgorIwlHZW5lcmF0ZSBjbGFzc2VzIHRoYXQgaGF2ZSBvdGhlciBzb3VyY2VzLiBOZWVkcworIyAgICAgICB0byBleGVjdXRlIGxhdW5jaGVycy4KKwkrJChNQUtFKSAtZiBHZW5lcmF0ZUNsYXNzZXMuZ21rCisKK2pkazogZ2VuY2xhc3NlcworIyAgICAgICBOb3cgd2UgaGF2ZSBhIGNvbXBsZXRlIGpkaywgd2hpY2ggeW91IGNhbiBydW4uCisjICAgICAgIEl0IGlzIG5vdCB5ZXQgd3JhcHBlZCB1cCBhcyBhbiBpbnN0YWxsZWQgaW1hZ2UuCisKK2RlbW9zOgorIyAgICAgICBUaGUgZGVtb3MgYXJlIGNvbXBpbGVkIGFnYWluc3QgdGhpcyBqZGsuCisJKyQoTUFLRSkgLWYgQ29tcGlsZURlbW9zLmdtaworIwlOb3cgY29weSB0aGUgc2FtcGxlIHNvdXJjZXMgaW50byB0aGUgamRrLgorCSskKE1BS0UpIC1mIENvcHlTYW1wbGVzLmdtaworCisjIENyZWF0ZSB0aGUgZmluYWwgamRrIGFuZCBqcmUgaW1hZ2VzLCB0byBiZSB3cmFwcGVkIHVwCisjIGludG8gcGFja2FnZXMsIG9yIGluc3RhbGxlZC4KK2ltYWdlczoKKwkrJChNQUtFKSAtZiBDcmVhdGVKYXJzLmdtaworCSskKE1BS0UpIC1mIEltYWdlcy5nbWsgCisKK292ZXJsYXktaW1hZ2VzOgorCSskKE1BS0UpIC1mIENvbXBpbGVMYXVuY2hlcnMuZ21rIE9WRVJMQVlfSU1BR0VTPXRydWUKKwkrJChNQUtFKSAtZiBJbWFnZXMuZ21rIG92ZXJsYXktaW1hZ2VzCisKKyMgQ3JlYXRlIHBsYXRmb3JtIHNwZWNpZmljIGltYWdlIGxheW91dHMKK2J1bmRsZXM6CisJKyQoTUFLRSkgLWYgQnVuZGxlcy5nbWsKKworQklOQVJJRVM6PSQobm90ZGlyICQod2lsZGNhcmQgJChJTUFHRVNfT1VUUFVURElSKS9qMnNkay1pbWFnZS9iaW4vKikpCitJTlNUQUxMRElSOj1vcGVuamRrLSQoUkVMRUFTRSkKKworIyBJbnN0YWxsIHRoZSBqZGsgaW1hZ2UsIGluIGEgdmVyeSBjcnVkZSB3YXkuIE5vdCB0YWtpbmcgaW50bworIyBhY2NvdW50LCBob3cgdG8gaW5zdGFsbCBwcm9wZXJseSBvbiBtYWNvc3ggb3Igd2luZG93cyBldGMuCitpbnN0YWxsOgorCWVjaG8gSW5zdGFsbGluZyBqZGsgaW1hZ2UgaW50byAkKElOU1RBTExfUFJFRklYKS9qdm0vJChJTlNUQUxMRElSKQorCWVjaG8gYW5kIGNyZWF0aW5nICQod29yZHMgJChCSU5BUklFUykpIGxpbmtzIGZyb20gJChJTlNUQUxMX1BSRUZJWCkvYmluIGludG8gdGhlIGpkay4KKwkkKE1LRElSKSAtcCAkKElOU1RBTExfUFJFRklYKS9qdm0vJChJTlNUQUxMRElSKQorCSQoUk0pIC1yICQoSU5TVEFMTF9QUkVGSVgpL2p2bS8kKElOU1RBTExESVIpLyoKKwkkKENQKSAtcnAgJChJTUFHRVNfT1VUUFVURElSKS9qMnNkay1pbWFnZS8qICQoSU5TVEFMTF9QUkVGSVgpL2p2bS8kKElOU1RBTExESVIpCisJJChNS0RJUikgLXAgJChJTlNUQUxMX1BSRUZJWCkvYmluCisJJChSTSkgJChhZGRwcmVmaXggJChJTlNUQUxMX1BSRUZJWCkvYmluLywkKEJJTkFSSUVTKSkKKwkkKGZvcmVhY2ggYiwkKEJJTkFSSUVTKSwkKExOKSAtcyAkKElOU1RBTExfUFJFRklYKS9qdm0vJChJTlNUQUxMRElSKS9iaW4vJGIgJChJTlNUQUxMX1BSRUZJWCkvYmluLyRiICYmKSB0cnVlCisKKyMgVGhlIGFsbCB0YXJnZXQgYnVpbGRzIHRoZSBKREssIGJ1dCBub3QgdGhlIGltYWdlcworYWxsOiBqZGsKKworLlBIT05ZOiBpbXBvcnQgZ2Vuc3JjIGdlbmRhdGEgY2xhc3NlcyBsaWJzIGxhdW5jaGVycyBnZW5jbGFzc2VzCisuUEhPTlk6IGltcG9ydC1vbmx5IGdlbnNyYy1vbmx5IGdlbmRhdGEtb25seSBjbGFzc2VzLW9ubHkgbGlicy1vbmx5IGxhdW5jaGVycy1vbmx5IGdlbmNsYXNzZXMtb25seQorLlBIT05ZOiBhbGwgamRrIGRlbW9zIGltYWdlcyBvdmVybGF5LWltYWdlcyBidW5kbGVzIGluc3RhbGwKZGlmZiAtLWdpdCBhL2pkay9tYWtlZmlsZXMvQnVuZGxlcy5nbWsgYi9qZGsvbWFrZWZpbGVzL0J1bmRsZXMuZ21rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiMTE4M2EKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvbWFrZWZpbGVzL0J1bmRsZXMuZ21rCkBAIC0wLDAgKzEsMTQxIEBACisjCisjIENvcHlyaWdodCAoYykgMjAxMSwgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorIworIyBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMKKyMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorIyBieSBPcmFjbGUgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyMKKyMgVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisjIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorIyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyMgYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorIyAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyMKKyMgUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyMgb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQorIyBxdWVzdGlvbnMuCisjCisKK2luY2x1ZGUgJChTUEVDKQoraW5jbHVkZSBNYWtlQmFzZS5nbWsKKworZGVmYXVsdDogYnVuZGxlcworCisjIE9ubHkgbWFjb3N4IGhhcyBidW5kbGVzIGRlZmluZWQuCitpZmVxICgkKE9QRU5KREtfVEFSR0VUX09TKSwgbWFjb3N4KQorCitidW5kbGVzOiBqcmUtYnVuZGxlIGpkay1idW5kbGUKKworCitKREtfQlVORExFX0RJUiA6PSAkKElNQUdFU19PVVRQVVRESVIpL2oyc2RrLWJ1bmRsZS9qZGskKEpES19WRVJTSU9OKS5qZGsvQ29udGVudHMKK0pSRV9CVU5ETEVfRElSIDo9ICQoSU1BR0VTX09VVFBVVERJUikvajJyZS1idW5kbGUvanJlJChKREtfVkVSU0lPTikuanJlL0NvbnRlbnRzCisKK01BQ09TWF9TUkMgOj0gJChKREtfVE9QRElSKS9zcmMvbWFjb3N4CisKKyMgQWxsIHRoZXNlIE9QRU5KREsgY2hlY2tzIGFyZSBuZWVkZWQgc2luY2UgdGhlcmUgaXMgbm8gY29oZXJlbmN5IGJldHdlZW4KKyMgdGhlc2UgdmFsdWVzIGluIG9wZW4gYW5kIGNsb3NlZC4gU2hvdWxkIHByb2JhYmx5IGJlIGZpeGVkLgoraWZuZGVmIE9QRU5KREsKKyAgICBCVU5ETEVfSUQgOj0gJChNQUNPU1hfQlVORExFX0lEX0JBU0UpLiQoSkRLX01JTk9SX1ZFUlNJT04pdSQoSkRLX1VQREFURV9WRVJTSU9OKQorZWxzZQorICAgIEJVTkRMRV9JRCA6PSAkKE1BQ09TWF9CVU5ETEVfSURfQkFTRSkKK2VuZGlmCitCVU5ETEVfSURfSlJFIDo9ICQoQlVORExFX0lEKS5qcmUKK0JVTkRMRV9JRF9KREsgOj0gJChCVU5ETEVfSUQpLmpkaworCitCVU5ETEVfTkFNRSA6PSAkKE1BQ09TWF9CVU5ETEVfTkFNRV9CQVNFKSAkKEpES19NSU5PUl9WRVJTSU9OKQorQlVORExFX05BTUVfSlJFIDo9ICQoQlVORExFX05BTUUpCitCVU5ETEVfTkFNRV9KREsgOj0gJChCVU5ETEVfTkFNRSkKKworaWZuZGVmIE9QRU5KREsKKyAgICBCVU5ETEVfSU5GTyA6PSAkKE1BQ09TWF9CVU5ETEVfTkFNRV9CQVNFKSAkKEpES19WRVJTSU9OKQorZWxzZQorICAgIEJVTkRMRV9JTkZPIDo9ICQoTUFDT1NYX0JVTkRMRV9OQU1FX0JBU0UpICgkKEpES19WRVJTSU9OKSkKK2VuZGlmCitCVU5ETEVfSU5GT19KUkUgOj0gJChCVU5ETEVfSU5GTykKK0JVTkRMRV9JTkZPX0pESyA6PSAkKEJVTkRMRV9JTkZPKQorCitCVU5ETEVfUExBVEZPUk1fVkVSU0lPTiA6PSAkKEpES19NQUpPUl9WRVJTSU9OKS4kKEpES19NSU5PUl9WRVJTSU9OKQorQlVORExFX1ZFUlNJT04gOj0gJChKREtfVkVSU0lPTikKK2lmZXEgKCQoQ09NUEFOWV9OQU1FKSxOL0EpCisgICAgQlVORExFX1ZFTkRPUiA6PSBVTkRFRklORUQKK2Vsc2UKKyAgICBCVU5ETEVfVkVORE9SIDo9ICQoQ09NUEFOWV9OQU1FKQorZW5kaWYKKworCitKREtfRklMRV9MSVNUIDo9ICQoc2hlbGwgJChGSU5EKSAkKElNQUdFU19PVVRQVVRESVIpL2oyc2RrLWltYWdlICEgLXR5cGUgZCkKK0pSRV9GSUxFX0xJU1QgOj0gJChzaGVsbCAkKEZJTkQpICQoSU1BR0VTX09VVFBVVERJUikvajJyZS1pbWFnZSAhIC10eXBlIGQpCisKK0pES19UQVJHRVRfTElTVCA6PSAkKHN1YnN0ICQoSU1BR0VTX09VVFBVVERJUikvajJzZGstaW1hZ2UsJChKREtfQlVORExFX0RJUikvSG9tZSwkKEpES19GSUxFX0xJU1QpKQorSlJFX1RBUkdFVF9MSVNUIDo9ICQoc3Vic3QgJChJTUFHRVNfT1VUUFVURElSKS9qMnJlLWltYWdlLCQoSlJFX0JVTkRMRV9ESVIpL0hvbWUsJChKUkVfRklMRV9MSVNUKSkKKworIyBUaGUgb2xkIGJ1aWxkcyBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGRpZCBub3QgcHJlc2VydmUgc3ltbGlua3Mgc28KKyMgbWFrZSBzdXJlIHRoZXkgYXJlIGZvbGxvd2VkIGFuZCB0aGUgY29udGVudHMgY29waWVkIGluc3RlYWQuCisjIFRvIGZpeCB0aGlzLCBqdXN0IHJlcGxhY2UgY29weSB3aXRoIGluc3RhbGwtZmlsZSBtYWNyby4KKyQoSkRLX0JVTkRMRV9ESVIpL0hvbWUvJTogJChJTUFHRVNfT1VUUFVURElSKS9qMnNkay1pbWFnZS8lCisJJChFQ0hPKSBDb3B5aW5nICQocGF0c3Vic3QgJChPVVRQVVRfUk9PVCkvJSwlLCRAKQorCSQoTUtESVIpIC1wICQoQEQpCisJJChDUCkgLWYgLVIgLUwgJyQ8JyAnJEAnCisKKyQoSlJFX0JVTkRMRV9ESVIpL0hvbWUvJTogJChJTUFHRVNfT1VUUFVURElSKS9qMnJlLWltYWdlLyUKKwkkKEVDSE8pIENvcHlpbmcgJChwYXRzdWJzdCAkKE9VVFBVVF9ST09UKS8lLCUsJEApCisJJChNS0RJUikgLXAgJChARCkKKwkkKENQKSAtZiAtUiAtTCAnJDwnICckQCcKKworJChKREtfQlVORExFX0RJUikvTWFjT1MvbGliamxpLmR5bGliOgorCSQoRUNITykgQ3JlYXRpbmcgbGluayAkKHBhdHN1YnN0ICQoT1VUUFVUX1JPT1QpLyUsJSwkQCkKKwkkKE1LRElSKSAtcCAkKEBEKQorCSQoUk0pICRACisJJChMTikgLXMgLi4vSG9tZS9saWIvamxpL2xpYmpsaS5keWxpYiAkQAorCiskKEpSRV9CVU5ETEVfRElSKS9NYWNPUy9saWJqbGkuZHlsaWI6CisJJChFQ0hPKSBDcmVhdGluZyBsaW5rICQocGF0c3Vic3QgJChPVVRQVVRfUk9PVCkvJSwlLCRAKQorCSQoTUtESVIpIC1wICQoQEQpCisJJChSTSkgJEAKKwkkKExOKSAtcyAuLi9Ib21lL2xpYi9qbGkvbGliamxpLmR5bGliICRACisKKyQoSkRLX0JVTkRMRV9ESVIpL0luZm8ucGxpc3Q6ICQoU1BFQykKKwkkKEVDSE8pIENyZWF0aW5nICQocGF0c3Vic3QgJChPVVRQVVRfUk9PVCkvJSwlLCRAKQorCSQoTUtESVIpIC1wICQoQEQpCisJJChTRUQpICAtZSAicy9AQElEQEAvJChCVU5ETEVfSURfSkRLKS9nIiBcCisJCS1lICJzL0BATkFNRUBALyQoQlVORExFX05BTUVfSkRLKS9nIiBcCisJCS1lICJzL0BASU5GT0BALyQoQlVORExFX0lORk9fSkRLKS9nIiBcCisJCS1lICJzL0BAUExBVEZPUk1fVkVSU0lPTkBALyQoQlVORExFX1BMQVRGT1JNX1ZFUlNJT04pL2ciIFwKKwkJLWUgInMvQEBWRVJTSU9OQEAvJChCVU5ETEVfVkVSU0lPTikvZyIgXAorCQktZSAicy9AQFZFTkRPUkBALyQoQlVORExFX1ZFTkRPUikvZyIgXAorCQk8ICQoTUFDT1NYX1NSQykvYnVuZGxlL0pESy1JbmZvLnBsaXN0ID4gJEAKKworJChKUkVfQlVORExFX0RJUikvSW5mby5wbGlzdDogJChTUEVDKQorCSQoRUNITykgQ3JlYXRpbmcgJChwYXRzdWJzdCAkKE9VVFBVVF9ST09UKS8lLCUsJEApCisJJChNS0RJUikgLXAgJChARCkKKwkkKFNFRCkgIC1lICJzL0BASURAQC8kKEJVTkRMRV9JRF9KUkUpL2ciIFwKKwkJLWUgInMvQEBOQU1FQEAvJChCVU5ETEVfTkFNRV9KUkUpL2ciIFwKKwkJLWUgInMvQEBJTkZPQEAvJChCVU5ETEVfSU5GT19KUkUpL2ciIFwKKwkJLWUgInMvQEBQTEFURk9STV9WRVJTSU9OQEAvJChCVU5ETEVfUExBVEZPUk1fVkVSU0lPTikvZyIgXAorCQktZSAicy9AQFZFUlNJT05AQC8kKEJVTkRMRV9WRVJTSU9OKS9nIiBcCisJCS1lICJzL0BAVkVORE9SQEAvJChCVU5ETEVfVkVORE9SKS9nIiBcCisJCTwgJChNQUNPU1hfU1JDKS9idW5kbGUvSlJFLUluZm8ucGxpc3QgPiAkQAorCitqZGstYnVuZGxlOiAkKEpES19UQVJHRVRfTElTVCkgJChKREtfQlVORExFX0RJUikvTWFjT1MvbGliamxpLmR5bGliIFwKKwkJJChKREtfQlVORExFX0RJUikvSW5mby5wbGlzdAorCSQoU0VURklMRSkgLWEgQiAkKGRpciAkKEpES19CVU5ETEVfRElSKSkKKworanJlLWJ1bmRsZTogJChKUkVfVEFSR0VUX0xJU1QpICQoSlJFX0JVTkRMRV9ESVIpL01hY09TL2xpYmpsaS5keWxpYiBcCisJCSQoSlJFX0JVTkRMRV9ESVIpL0luZm8ucGxpc3QKKwkkKFNFVEZJTEUpIC1hIEIgJChkaXIgJChKUkVfQlVORExFX0RJUikpCisKK2Vsc2UgIyBOb3QgbWFjb3N4CisKK2J1bmRsZXM6CisJJChFQ0hPKSAiTm8gYnVuZGxlcyBkZWZpbmVkIGZvciAkKE9QRU5KREtfVEFSR0VUX09TKSIKKworZW5kaWYgIyBtYWNvc3gKKworLlBIT05ZOiBqZGstYnVuZGxlIGpyZS1idW5kbGUgYnVuZGxlcwpkaWZmIC0tZ2l0IGEvamRrL21ha2VmaWxlcy9Db21waWxlRGVtb3MuZ21rIGIvamRrL21ha2VmaWxlcy9Db21waWxlRGVtb3MuZ21rCmluZGV4IDRmODRiNWMuLjdkZTkxNjYgMTAwNjQ0Ci0tLSBhL2pkay9tYWtlZmlsZXMvQ29tcGlsZURlbW9zLmdtaworKysgYi9qZGsvbWFrZWZpbGVzL0NvbXBpbGVEZW1vcy5nbWsKQEAgLTEwNywxMCArMTA3LDcgQEAKICAgICAgICAgJDFfSkFSRklMRSA6PSAkMS5qYXIKICAgICBlbmRpZgogCi0gICAgIyBDb21waWxlIGphdmEgY2xhc3NlcyBpZiB0aGVyZSBhcmUgYW55LgotICAgICQxX0pBVkFfRklMRVNfRVhJU1QgOj0gJCQoc2hlbGwgJCQoRklORCkgJCQoJDFfTUFJTl9TUkMpIC1uYW1lICIqLmphdmEiKQotCi0gICAgaWZuZXEgKCQkKCQxX0pBVkFfRklMRVNfRVhJU1QpLCkKKyAgICBpZmVxICgkKGZpbmRzdHJpbmcgJDEsTGFmZnkgU3dpbmdTZXQzKSwpCiAgICAgICAgICQkKGV2YWwgJCQoY2FsbCBTZXR1cEphdmFDb21waWxhdGlvbixCVUlMRF9ERU1PXyQxLFwKICAgICAgICAgICAgICAgICBTRVRVUDo9R0VORVJBVEVfVVNJTkdKREtCWVRFQ09ERSxcCiAgICAgICAgICAgICAgICAgQUREX0pBVkFDX0ZMQUdTOj0kMyxcCkBAIC0yNjQsOSArMjYxLDkgQEAKIAkJTERGTEFHU19TVUZGSVhfbGludXg6PSQ4LFwKIAkJVkVSU0lPTklORk9fUkVTT1VSQ0U6PSQoSkRLX1RPUERJUikvc3JjL3dpbmRvd3MvcmVzb3VyY2UvdmVyc2lvbi5yYyxcCiAJCVJDX0ZMQUdTOj0kJChSQ19GTEFHUykgXAotCQkJICAvRCAiSkRLX0ZOQU1FPSQxLmRsbCIgXAotCQkJICAvRCAiSkRLX0lOVEVSTkFMX05BTUU9JDEiIFwKLQkJCSAgL0QgIkpES19GVFlQRT0weDJMIixcCisJCQkgIC1EICJKREtfRk5BTUU9JDEuZGxsIiBcCisJCQkgIC1EICJKREtfSU5URVJOQUxfTkFNRT0kMSIgXAorCQkJICAtRCAiSkRLX0ZUWVBFPTB4MkwiLFwKIAkJT0JKRUNUX0RJUjo9JChKREtfT1VUUFVURElSKS9kZW1vb2Jqcy9qdm10aS8kMSxcCiAJCU9VVFBVVF9ESVI6PSQoSkRLX09VVFBVVERJUikvZGVtby9qdm10aS8kMS9saWIsXAogCQlMSUJSQVJZOj0kMSkpCkBAIC00NTYsNyArNDUzLDcgQEAKICAgICAkKEpES19PVVRQVVRESVIpL2RlbW8vX3RoZS5kYi51bnppcHBlZDogJChEQl9ERU1PX1pJUEZJTEUpCiAJJChNS0RJUikgLXAgJChARCkKIAkkKFJNKSAtciAkKEpES19PVVRQVVRESVIpL2RlbW8vZGIgJChKREtfT1VUUFVURElSKS9kZW1vL2RlbW8KLQkkKENEKSAkKEpES19PVVRQVVRESVIpL2RlbW8gJiYgJChVTlpJUCkgLW8gJDwKKwkkKENEKSAkKEpES19PVVRQVVRESVIpL2RlbW8gJiYgJChVTlpJUCkgLXEgLW8gJDwKIAkkKE1WKSAkKEpES19PVVRQVVRESVIpL2RlbW8vZGVtbyAkKEpES19PVVRQVVRESVIpL2RlbW8vZGIKIAkkKFRPVUNIKSAkQAogCmRpZmYgLS1naXQgYS9qZGsvbWFrZWZpbGVzL0NvbXBpbGVKYXZhQ2xhc3Nlcy5nbWsgYi9qZGsvbWFrZWZpbGVzL0NvbXBpbGVKYXZhQ2xhc3Nlcy5nbWsKaW5kZXggODc5ZmZhZC4uNDYwZDllMiAxMDA2NDQKLS0tIGEvamRrL21ha2VmaWxlcy9Db21waWxlSmF2YUNsYXNzZXMuZ21rCisrKyBiL2pkay9tYWtlZmlsZXMvQ29tcGlsZUphdmFDbGFzc2VzLmdtawpAQCAtNzYsOSArNzYsMTQgQEAKIAlTb2xhcmlzQWNsRmlsZUF0dHJpYnV0ZVZpZXcuamF2YSBcCiAJU29sYXJpc0xvZ2luTW9kdWxlLmphdmEgXAogCVNvbGFyaXNTeXN0ZW0uamF2YSBcCisgICAgICAgIHN1bi9uaW8vY2gvRGV2UG9sbEFycmF5V3JhcHBlci5qYXZhIFwKKyAgICAgICAgc3VuL25pby9jaC9EZXZQb2xsU2VsZWN0b3JJbXBsLmphdmEgXAorICAgICAgICBzdW4vbmlvL2NoL0RldlBvbGxTZWxlY3RvclByb3ZpZGVyLmphdmEgXAogCXN1bi9uaW8vY2gvRXZlbnRQb3J0U2VsZWN0b3JJbXBsLmphdmEgXAogCXN1bi9uaW8vY2gvRXZlbnRQb3J0U2VsZWN0b3JQcm92aWRlci5qYXZhIFwKIAlzdW4vbmlvL2NoL0V2ZW50UG9ydFdyYXBwZXIuamF2YSBcCisgICAgICAgIHN1bi9uaW8vY2gvU29sYXJpc0FzeW5jaHJvbm91c0NoYW5uZWxQcm92aWRlci5qYXZhIFwKKyAgICAgICAgc3VuL25pby9jaC9Tb2xhcmlzRXZlbnRQb3J0LmphdmEgXAogCXN1bi90b29scy9hdHRhY2gvU29sYXJpc0F0dGFjaFByb3ZpZGVyLmphdmEgXAogCXN1bi90b29scy9hdHRhY2gvU29sYXJpc1ZpcnR1YWxNYWNoaW5lLmphdmEKIGVuZGlmCkBAIC0xMDUsMTggKzExMCwyNyBAQAogCiBpZm5lcSAoJChPUEVOSkRLX1RBUkdFVF9PUyksbGludXgpCiAgICAgRVhGSUxFUys9c3VuL3Rvb2xzL2F0dGFjaC9MaW51eEF0dGFjaFByb3ZpZGVyLmphdmEgXAotCXN1bi90b29scy9hdHRhY2gvTGludXhWaXJ0dWFsTWFjaGluZS5qYXZhIFwKLQlzdW4vbmlvL2ZzL0xpbnV4RG9zRmlsZUF0dHJpYnV0ZVZpZXcuamF2YSBcCi0Jc3VuL25pby9mcy9MaW51eEZpbGVTdG9yZS5qYXZhIFwKLQlzdW4vbmlvL2ZzL0xpbnV4RmlsZVN5c3RlbS5qYXZhIFwKLQlzdW4vbmlvL2ZzL0xpbnV4RmlsZVN5c3RlbVByb3ZpZGVyLmphdmEgXAotCXN1bi9uaW8vZnMvTGludXhOYXRpdmVEaXNwYXRjaGVyLmphdmEgXAotCXN1bi9uaW8vZnMvTGludXhVc2VyRGVmaW5lZEZpbGVBdHRyaWJ1dGVWaWV3LmphdmEgXAotCXN1bi9uaW8vZnMvTGludXhXYXRjaFNlcnZpY2UuamF2YQorCSAgICAgc3VuL3Rvb2xzL2F0dGFjaC9MaW51eFZpcnR1YWxNYWNoaW5lLmphdmEgXAorICAgICAgICAgICAgIHN1bi9uaW8vY2gvRVBvbGwuamF2YSBcCisgICAgICAgICAgICAgc3VuL25pby9jaC9FUG9sbEFycmF5V3JhcHBlci5qYXZhIFwKKyAgICAgICAgICAgICBzdW4vbmlvL2NoL0VQb2xsUG9ydC5qYXZhIFwKKyAgICAgICAgICAgICBzdW4vbmlvL2NoL0VQb2xsU2VsZWN0b3JJbXBsLmphdmEgXAorICAgICAgICAgICAgIHN1bi9uaW8vY2gvRVBvbGxTZWxlY3RvclByb3ZpZGVyLmphdmEgXAorICAgICAgICAgICAgIHN1bi9uaW8vY2gvTGludXhBc3luY2hyb25vdXNDaGFubmVsUHJvdmlkZXIuamF2YSBcCisJICAgICBzdW4vbmlvL2ZzL0xpbnV4RG9zRmlsZUF0dHJpYnV0ZVZpZXcuamF2YSBcCisJICAgICBzdW4vbmlvL2ZzL0xpbnV4RmlsZVN0b3JlLmphdmEgXAorCSAgICAgc3VuL25pby9mcy9MaW51eEZpbGVTeXN0ZW0uamF2YSBcCisJICAgICBzdW4vbmlvL2ZzL0xpbnV4RmlsZVN5c3RlbVByb3ZpZGVyLmphdmEgXAorCSAgICAgc3VuL25pby9mcy9MaW51eE5hdGl2ZURpc3BhdGNoZXIuamF2YSBcCisJICAgICBzdW4vbmlvL2ZzL0xpbnV4VXNlckRlZmluZWRGaWxlQXR0cmlidXRlVmlldy5qYXZhIFwKKwkgICAgIHN1bi9uaW8vZnMvTGludXhXYXRjaFNlcnZpY2UuamF2YQogZW5kaWYKIAogaWZuZXEgKCQoT1BFTkpES19UQVJHRVRfT1MpLG1hY29zeCkKLSAgICBFWEZJTEVTKz1zdW4vbmlvL2ZzL0JzZEZpbGVTdG9yZS5qYXZhIFwKKyAgICBFWEZJTEVTKz1zdW4vbmlvL2NoL0JzZEFzeW5jaHJvbm91c0NoYW5uZWxQcm92aWRlci5qYXZhIFwKKyAgICAgICAgICAgICBzdW4vbmlvL2NoL0tRdWV1ZS5qYXZhIFwKKyAgICAgICAgICAgICBzdW4vbmlvL2NoL0tRdWV1ZVBvcnQuamF2YSBcCisgICAgICAgICAgICAgc3VuL25pby9mcy9Cc2RGaWxlU3RvcmUuamF2YSBcCiAJICAgICBzdW4vbmlvL2ZzL0JzZEZpbGVTeXN0ZW0uamF2YSBcCiAgICAgICAgICAgICAgc3VuL25pby9mcy9Cc2RGaWxlU3lzdGVtUHJvdmlkZXIuamF2YSBcCiAgICAgICAgICAgICAgc3VuL25pby9mcy9Cc2ROYXRpdmVEaXNwYXRjaGVyLmphdmEgXApAQCAtMTQ3LDUxICsxNjEsNDggQEAKIGVuZGlmCiAKIGlmbmVxICgkKE9QRU5KREtfVEFSR0VUX09TKSwgbWFjb3N4KQotIwotIyBOb3QgaW4gcnQuamFyIG9uIHNvbGFyaXMgYW5kIGxpbnV4Li4uKHdpbmRvd3Mgbm90IGNoZWNrZWQpCi0jICAgICBpbiBydC5qYXIgb24gbWFjb3N4ID8/Ci1FWEZJTEVTKz1zdW4vYXd0L1gxMS9TY3JlZW5Gb3JtYXQuamF2YSBcCi0gICAgICAgICBzdW4vYXd0L1gxMS9YQXJjLmphdmEgXAotICAgICAgICAgc3VuL2F3dC9YMTEvWENoYXIyYi5qYXZhIFwKLSAgICAgICAgIHN1bi9hd3QvWDExL1hDaGFyU3RydWN0LmphdmEgXAotICAgICAgICAgc3VuL2F3dC9YMTEvWENsYXNzSGludC5qYXZhIFwKLSAgICAgICAgIHN1bi9hd3QvWDExL1hDb21wb3NlU3RhdHVzLmphdmEgXAotICAgICAgICAgc3VuL2F3dC9YMTEvWEV4dENvZGVzLmphdmEgXAotICAgICAgICAgc3VuL2F3dC9YMTEvWEZvbnRQcm9wLmphdmEgXAotICAgICAgICAgc3VuL2F3dC9YMTEvWEZvbnRTZXRFeHRlbnRzLmphdmEgXAotICAgICAgICAgc3VuL2F3dC9YMTEvWEZvbnRTdHJ1Y3QuamF2YSBcCi0gICAgICAgICBzdW4vYXd0L1gxMS9YR0NWYWx1ZXMuamF2YSBcCi0gICAgICAgICBzdW4vYXd0L1gxMS9YSG9zdEFkZHJlc3MuamF2YSBcCi0gICAgICAgICBzdW4vYXd0L1gxMS9YSU1DYWxsYmFjay5qYXZhIFwKLSAgICAgICAgIHN1bi9hd3QvWDExL1hJTUhvdEtleVRyaWdnZXIuamF2YSBcCi0gICAgICAgICBzdW4vYXd0L1gxMS9YSU1Ib3RLZXlUcmlnZ2Vycy5qYXZhIFwKLSAgICAgICAgIHN1bi9hd3QvWDExL1hJTVByZWVkaXRDYXJldENhbGxiYWNrU3RydWN0LmphdmEgXAotICAgICAgICAgc3VuL2F3dC9YMTEvWElNUHJlZWRpdERyYXdDYWxsYmFja1N0cnVjdC5qYXZhIFwKLSAgICAgICAgIHN1bi9hd3QvWDExL1hJTVByZWVkaXRTdGF0ZU5vdGlmeUNhbGxiYWNrU3RydWN0LmphdmEgXAotICAgICAgICAgc3VuL2F3dC9YMTEvWElNU3RhdHVzRHJhd0NhbGxiYWNrU3RydWN0LmphdmEgXAotICAgICAgICAgc3VuL2F3dC9YMTEvWElNU3RyaW5nQ29udmVyc2lvbkNhbGxiYWNrU3RydWN0LmphdmEgXAotICAgICAgICAgc3VuL2F3dC9YMTEvWElNU3RyaW5nQ29udmVyc2lvblRleHQuamF2YSBcCi0gICAgICAgICBzdW4vYXd0L1gxMS9YSU1TdHlsZXMuamF2YSBcCi0gICAgICAgICBzdW4vYXd0L1gxMS9YSU1UZXh0LmphdmEgXAotICAgICAgICAgc3VuL2F3dC9YMTEvWElNVmFsdWVzTGlzdC5qYXZhIFwKLSAgICAgICAgIHN1bi9hd3QvWDExL1hJbWFnZS5qYXZhIFwKLSAgICAgICAgIHN1bi9hd3QvWDExL1hLZXlib2FyZENvbnRyb2wuamF2YSBcCi0gICAgICAgICBzdW4vYXd0L1gxMS9YS2V5Ym9hcmRTdGF0ZS5qYXZhIFwKLSAgICAgICAgIHN1bi9hd3QvWDExL1hPTUNoYXJTZXRMaXN0LmphdmEgXAotICAgICAgICAgc3VuL2F3dC9YMTEvWE9NRm9udEluZm8uamF2YSBcCi0gICAgICAgICBzdW4vYXd0L1gxMS9YT01PcmllbnRhdGlvbi5qYXZhIFwKLSAgICAgICAgIHN1bi9hd3QvWDExL1hQb2ludC5qYXZhIFwKLSAgICAgICAgIHN1bi9hd3QvWDExL1hSZWN0YW5nbGUuamF2YSBcCi0gICAgICAgICBzdW4vYXd0L1gxMS9YU2VnbWVudC5qYXZhIFwKLSAgICAgICAgIHN1bi9hd3QvWDExL1hTdGFuZGFyZENvbG9ybWFwLmphdmEgXAotICAgICAgICAgc3VuL2F3dC9YMTEvWFRleHRJdGVtLmphdmEgXAotICAgICAgICAgc3VuL2F3dC9YMTEvWFRleHRJdGVtMTYuamF2YSBcCi0gICAgICAgICBzdW4vYXd0L1gxMS9YVGV4dFByb3BlcnR5LmphdmEgXAotICAgICAgICAgc3VuL2F3dC9YMTEvWFRpbWVDb29yZC5qYXZhIFwKLSAgICAgICAgIHN1bi9hd3QvWDExL1hXaW5kb3dDaGFuZ2VzLmphdmEgXAotICAgICAgICAgc3VuL2F3dC9YMTEvWGRiZVN3YXBJbmZvLmphdmEgXAotICAgICAgICAgc3VuL2F3dC9YMTEvWG1iVGV4dEl0ZW0uamF2YSBcCi0gICAgICAgICBzdW4vYXd0L1gxMS9Yd2NUZXh0SXRlbS5qYXZhCisgICAgRVhGSUxFUys9c3VuL2F3dC9YMTEvU2NyZWVuRm9ybWF0LmphdmEgXAorICAgICAgICAgICAgIHN1bi9hd3QvWDExL1hBcmMuamF2YSBcCisgICAgICAgICAgICAgc3VuL2F3dC9YMTEvWENoYXIyYi5qYXZhIFwKKyAgICAgICAgICAgICBzdW4vYXd0L1gxMS9YQ2hhclN0cnVjdC5qYXZhIFwKKyAgICAgICAgICAgICBzdW4vYXd0L1gxMS9YQ2xhc3NIaW50LmphdmEgXAorICAgICAgICAgICAgIHN1bi9hd3QvWDExL1hDb21wb3NlU3RhdHVzLmphdmEgXAorICAgICAgICAgICAgIHN1bi9hd3QvWDExL1hFeHRDb2Rlcy5qYXZhIFwKKyAgICAgICAgICAgICBzdW4vYXd0L1gxMS9YRm9udFByb3AuamF2YSBcCisgICAgICAgICAgICAgc3VuL2F3dC9YMTEvWEZvbnRTZXRFeHRlbnRzLmphdmEgXAorICAgICAgICAgICAgIHN1bi9hd3QvWDExL1hGb250U3RydWN0LmphdmEgXAorICAgICAgICAgICAgIHN1bi9hd3QvWDExL1hHQ1ZhbHVlcy5qYXZhIFwKKyAgICAgICAgICAgICBzdW4vYXd0L1gxMS9YSG9zdEFkZHJlc3MuamF2YSBcCisgICAgICAgICAgICAgc3VuL2F3dC9YMTEvWElNQ2FsbGJhY2suamF2YSBcCisgICAgICAgICAgICAgc3VuL2F3dC9YMTEvWElNSG90S2V5VHJpZ2dlci5qYXZhIFwKKyAgICAgICAgICAgICBzdW4vYXd0L1gxMS9YSU1Ib3RLZXlUcmlnZ2Vycy5qYXZhIFwKKyAgICAgICAgICAgICBzdW4vYXd0L1gxMS9YSU1QcmVlZGl0Q2FyZXRDYWxsYmFja1N0cnVjdC5qYXZhIFwKKyAgICAgICAgICAgICBzdW4vYXd0L1gxMS9YSU1QcmVlZGl0RHJhd0NhbGxiYWNrU3RydWN0LmphdmEgXAorICAgICAgICAgICAgIHN1bi9hd3QvWDExL1hJTVByZWVkaXRTdGF0ZU5vdGlmeUNhbGxiYWNrU3RydWN0LmphdmEgXAorICAgICAgICAgICAgIHN1bi9hd3QvWDExL1hJTVN0YXR1c0RyYXdDYWxsYmFja1N0cnVjdC5qYXZhIFwKKyAgICAgICAgICAgICBzdW4vYXd0L1gxMS9YSU1TdHJpbmdDb252ZXJzaW9uQ2FsbGJhY2tTdHJ1Y3QuamF2YSBcCisgICAgICAgICAgICAgc3VuL2F3dC9YMTEvWElNU3RyaW5nQ29udmVyc2lvblRleHQuamF2YSBcCisgICAgICAgICAgICAgc3VuL2F3dC9YMTEvWElNU3R5bGVzLmphdmEgXAorICAgICAgICAgICAgIHN1bi9hd3QvWDExL1hJTVRleHQuamF2YSBcCisgICAgICAgICAgICAgc3VuL2F3dC9YMTEvWElNVmFsdWVzTGlzdC5qYXZhIFwKKyAgICAgICAgICAgICBzdW4vYXd0L1gxMS9YSW1hZ2UuamF2YSBcCisgICAgICAgICAgICAgc3VuL2F3dC9YMTEvWEtleWJvYXJkQ29udHJvbC5qYXZhIFwKKyAgICAgICAgICAgICBzdW4vYXd0L1gxMS9YS2V5Ym9hcmRTdGF0ZS5qYXZhIFwKKyAgICAgICAgICAgICBzdW4vYXd0L1gxMS9YT01DaGFyU2V0TGlzdC5qYXZhIFwKKyAgICAgICAgICAgICBzdW4vYXd0L1gxMS9YT01Gb250SW5mby5qYXZhIFwKKyAgICAgICAgICAgICBzdW4vYXd0L1gxMS9YT01PcmllbnRhdGlvbi5qYXZhIFwKKyAgICAgICAgICAgICBzdW4vYXd0L1gxMS9YUG9pbnQuamF2YSBcCisgICAgICAgICAgICAgc3VuL2F3dC9YMTEvWFJlY3RhbmdsZS5qYXZhIFwKKyAgICAgICAgICAgICBzdW4vYXd0L1gxMS9YU2VnbWVudC5qYXZhIFwKKyAgICAgICAgICAgICBzdW4vYXd0L1gxMS9YU3RhbmRhcmRDb2xvcm1hcC5qYXZhIFwKKyAgICAgICAgICAgICBzdW4vYXd0L1gxMS9YVGV4dEl0ZW0uamF2YSBcCisgICAgICAgICAgICAgc3VuL2F3dC9YMTEvWFRleHRJdGVtMTYuamF2YSBcCisgICAgICAgICAgICAgc3VuL2F3dC9YMTEvWFRleHRQcm9wZXJ0eS5qYXZhIFwKKyAgICAgICAgICAgICBzdW4vYXd0L1gxMS9YVGltZUNvb3JkLmphdmEgXAorICAgICAgICAgICAgIHN1bi9hd3QvWDExL1hXaW5kb3dDaGFuZ2VzLmphdmEgXAorICAgICAgICAgICAgIHN1bi9hd3QvWDExL1hkYmVTd2FwSW5mby5qYXZhIFwKKyAgICAgICAgICAgICBzdW4vYXd0L1gxMS9YbWJUZXh0SXRlbS5qYXZhIFwKKyAgICAgICAgICAgICBzdW4vYXd0L1gxMS9Yd2NUZXh0SXRlbS5qYXZhCiBlbmRpZgogCiAjIEV4Y2x1ZGUgYW5vdGhlciBpbXBsaWNpdGx5IG5vdCBpbmNsdWRlZCBmaWxlLgpAQCAtMjI5LDMxICsyNDAsMjQgQEAKICAgICBFWEZJTEVTKz1zdW4vbmV0L3d3dy9wcm90b2NvbC9odHRwL250bG0vTlRMTUF1dGhTZXF1ZW5jZS5qYXZhCiBlbmRpZgogCi1pZmRlZiBESVNBQkxFX05JTUJVUwotICAgICMgVE9ETzogbmVlZCB0byBjaGVjayB3aGVuIGl0IGhhcHBlbnMKLSAgICAjIEV4Y2x1ZGUgbmltdXMgaWYgZGlzYWJsZWQKLSAgICBFWENMVURFUys9CWphdmF4L3N3aW5nL3BsYWYvbmltYnVzIFwKLQkJY29tL3N1bi9qYXZhL3N3aW5nL3BsYWYvbmltYnVzCi1lbHNlCi0jCi0jIFRoZXNlIGFyZSBuZXZlciBwdXQgaW50byBydC5qYXIKLSMKLUVYRklMRVMrPSAgamF2YXgvc3dpbmcvcGxhZi9uaW1idXMvSW50ZXJuYWxGcmFtZVRpdGxlUGFuZVBhaW50ZXIuamF2YSBcCi0gICAgICAgICAgIGphdmF4L3N3aW5nL3BsYWYvbmltYnVzL09wdGlvblBhbmVNZXNzYWdlQXJlYVBhaW50ZXIuamF2YSBcCi0gICAgICAgICAgIGphdmF4L3N3aW5nL3BsYWYvbmltYnVzL1Njcm9sbEJhclBhaW50ZXIuamF2YSBcCi0gICAgICAgICAgIGphdmF4L3N3aW5nL3BsYWYvbmltYnVzL1NsaWRlclBhaW50ZXIuamF2YSBcCi0gICAgICAgICAgIGphdmF4L3N3aW5nL3BsYWYvbmltYnVzL1NwaW5uZXJQYWludGVyLmphdmEgXAotICAgICAgICAgICBqYXZheC9zd2luZy9wbGFmL25pbWJ1cy9TcGxpdFBhbmVQYWludGVyLmphdmEgXAotICAgICAgICAgICBqYXZheC9zd2luZy9wbGFmL25pbWJ1cy9UYWJiZWRQYW5lUGFpbnRlci5qYXZhCi1lbmRpZgorIyBFeGNsdWRlIG5pbWJ1cyBmaWxlcyBmcm9tIHJ0LmphcgorRVhGSUxFUys9amF2YXgvc3dpbmcvcGxhZi9uaW1idXMvSW50ZXJuYWxGcmFtZVRpdGxlUGFuZVBhaW50ZXIuamF2YSBcCisJCQkJIGphdmF4L3N3aW5nL3BsYWYvbmltYnVzL09wdGlvblBhbmVNZXNzYWdlQXJlYVBhaW50ZXIuamF2YSBcCisJCQkJIGphdmF4L3N3aW5nL3BsYWYvbmltYnVzL1Njcm9sbEJhclBhaW50ZXIuamF2YSBcCisJCQkJIGphdmF4L3N3aW5nL3BsYWYvbmltYnVzL1NsaWRlclBhaW50ZXIuamF2YSBcCisJCQkJIGphdmF4L3N3aW5nL3BsYWYvbmltYnVzL1NwaW5uZXJQYWludGVyLmphdmEgXAorCQkJCSBqYXZheC9zd2luZy9wbGFmL25pbWJ1cy9TcGxpdFBhbmVQYWludGVyLmphdmEgXAorCQkJCSBqYXZheC9zd2luZy9wbGFmL25pbWJ1cy9UYWJiZWRQYW5lUGFpbnRlci5qYXZhCiAKICMgQWNxdWlyZSBhIGxpc3Qgb2YgZmlsZXMgdGhhdCBzaG91bGQgYmUgY29waWVkIHN0cmFpZ2h0IG92ZXIgdG8gdGhlIGNsYXNzZXMuCiBpbmNsdWRlIENvcHlJbnRvQ2xhc3Nlcy5nbWsKICMgTm93IHdlIGhhdmUgQ09QWV9QQVRURVJOUywgQ09QWV9GSUxFUyBhbmQgQ09QWV9FWFRSQQogCiBpZm5kZWYgT1BFTkpESwotICAgIENMT1NFRF9TUkNfRElSUzo9JChKREtfVE9QRElSKS9zcmMvY2xvc2VkL3NoYXJlL2NsYXNzZXMgXAotCQkgICAgICQoSkRLX1RPUERJUikvc3JjL2Nsb3NlZC8kKE9QRU5KREtfVEFSR0VUX09TX0FQSV9ESVIpL2NsYXNzZXMKKyAgICBDTE9TRURfU1JDX0RJUlM6PSQoSkRLX1RPUERJUikvc3JjL2Nsb3NlZC9zaGFyZS9jbGFzc2VzCisgICAgaWZuZXEgKCQoT1BFTkpES19UQVJHRVRfT1NfQVBJX0RJUiksd2luZG93cykKKyAgICAgIENMT1NFRF9TUkNfRElSUyArPSAkKEpES19UT1BESVIpL3NyYy9jbG9zZWQvJChPUEVOSkRLX1RBUkdFVF9PU19BUElfRElSKS9jbGFzc2VzCisgICAgZW5kaWYKIGVuZGlmCiAKIE1BQ09TWF9TUkNfRElSUyA6PQpAQCAtMjk0LDcgKzI5OCw2IEBACiAJCSAgICAgJChKREtfVE9QRElSKS9zcmMvJChPUEVOSkRLX1RBUkdFVF9PU19BUElfRElSKS9jbGFzc2VzIFwKIAkJICAgICAkKE1BQ09TWF9TUkNfRElSUykgXAogCQkgICAgICQoSkRLX09VVFBVVERJUikvZ2Vuc3JjIFwKLQkJICAgICAkKEpES19PVVRQVVRESVIpL2dlbnNyY19zd2luZy9qYXZheC9zd2luZy9iZWFuaW5mbyBcCiAJCSAgICAgJChDTE9TRURfU1JDX0RJUlMpLFwKIAkJSU5DTFVERVM6PSQoSkRLX1VTRVJfREVGSU5FRF9GSUxURVIpLFwKIAkJRVhDTFVERVM6PSQoRVhDTFVERVMpLFwKQEAgLTMyNiw3ICszMjksNyBAQAogCiAjIFNldCBwcmVyZXFzIHRvIHRoZSBqYXZhIGZpbGVzIHNpbmNlIG1ha2UgZG9lc24ndCBrbm93IGFib3V0IHRoZSBjbGFzcyBmaWxlcy4gQWRkIEJVSUxEX0pESwogIyBhcyBhbiBvcmRlciBvbmx5IGRlcGVuZGVuY3kgdG8gYXZvaWQgcmFjZSB3aXRoIHRoZSBqYXZhIGNvbXBpbGF0aW9uLgotJChKREtfT1VUUFVURElSKS9jbGFzc2VzL190aGUuamRrLmJhc2UuaGVhZGVyczogJChKREtfQkFTRV9IRUFERVJfSkFWQV9GSUxFUykgfCAkKEJVSUxEX0pESykKKyQoSkRLX09VVFBVVERJUikvZ2Vuc3JjX2hlYWRlcnMvX3RoZS5qZGsuYmFzZS5oZWFkZXJzOiAkKEpES19CQVNFX0hFQURFUl9KQVZBX0ZJTEVTKSB8ICQoQlVJTERfSkRLKQogCSQoRUNITykgR2VuZXJhdGluZyBoZWFkZXJzIGZvciBqZGsgYmFzZSBjbGFzc2VzCiAJJChKQVZBSCkgLWJvb3RjbGFzc3BhdGggJChKREtfT1VUUFVURElSKS9jbGFzc2VzIC1kICQoSkRLX09VVFBVVERJUikvZ2Vuc3JjX2hlYWRlcnMgXAogCQkkKEpES19CQVNFX0hFQURFUl9DTEFTU0VTKQpAQCAtNDE2LDYgKzQxOSw2IEBACiAKICMgY29weSB3aXRoIC1hIHRvIHByZXNlcnZlIHRpbWVzdGFtcHMgc28gZGVwZW5kZW5jaWVzIGRvd24gdGhlIGxpbmUgYXJlbid0IG1lc3NlZCB1cAogYWxsOiAkKEJVSUxEX0pESykgJChKQVJTKSAkKENPUFlfRVhUUkEpICQoSkRLX09VVFBVVERJUikvY2xhc3Nlcy9NRVRBLUlORi9zZXJ2aWNlcy9jb20uc3VuLnRvb2xzLnhqYy5QbHVnaW4gXAotCSQoSkRLX09VVFBVVERJUikvY2xhc3Nlcy9fdGhlLmpkay5iYXNlLmhlYWRlcnMKKwkkKEpES19PVVRQVVRESVIpL2dlbnNyY19oZWFkZXJzL190aGUuamRrLmJhc2UuaGVhZGVycwogCiAuUEhPTlk6IGFsbApkaWZmIC0tZ2l0IGEvamRrL21ha2VmaWxlcy9Db21waWxlTGF1bmNoZXJzLmdtayBiL2pkay9tYWtlZmlsZXMvQ29tcGlsZUxhdW5jaGVycy5nbWsKaW5kZXggY2U2NTE2Ny4uNTg2ZWNkNCAxMDA2NDQKLS0tIGEvamRrL21ha2VmaWxlcy9Db21waWxlTGF1bmNoZXJzLmdtaworKysgYi9qZGsvbWFrZWZpbGVzL0NvbXBpbGVMYXVuY2hlcnMuZ21rCkBAIC0xLDU1NyArMSw1OTEgQEAKLSMNCi0jIENvcHlyaWdodCAoYykgMjAxMSwgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCi0jIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4NCi0jDQotIyBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdA0KLSMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMNCi0jIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcw0KLSMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZA0KLSMgYnkgT3JhY2xlIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuDQotIw0KLSMgVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUDQotIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3INCi0jIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQ0KLSMgdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQNCi0jIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuDQotIw0KLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbg0KLSMgMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLA0KLSMgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLg0KLSMNCi0jIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBDQotIyBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55DQotIyBxdWVzdGlvbnMuDQotIw0KLQ0KLWRlZmFsdDogYWxsDQotDQotaW5jbHVkZSAkKFNQRUMpDQotaW5jbHVkZSBNYWtlQmFzZS5nbWsNCi1pbmNsdWRlIE5hdGl2ZUNvbXBpbGF0aW9uLmdtaw0KLQ0KLSMgU2V0dXAgdGhlIGphdmEgY29tcGlsZXJzIGZvciB0aGUgSkRLIGJ1aWxkLg0KLWluY2x1ZGUgU2V0dXAuZ21rDQotDQotIyBCdWlsZCB0b29scw0KLWluY2x1ZGUgVG9vbHMuZ21rDQotDQotQlVJTERfTEFVTkNIRVJTPQ0KLQ0KLSMgV2hlbiBidWlsZGluZyBhIGxlZ2FjeSBvdmVybGF5IGltYWdlIChvbiBzb2xhcmlzIDY0IGJpdCksIHRoZSBsYXVuY2hlcnMgDQotIyBuZWVkIHRvIGJlIGJ1aWx0IHdpdGggYSBkaWZmZXJlbnQgcnBhdGggYW5kIGEgZGlmZmVyZW50IG91dHB1dCBkaXIuDQotaWZlcSAoJChPVkVSTEFZX0lNQUdFUyksdHJ1ZSkNCi0gICAgT1JJR0lOX1JPT1Q6PS8uLi8uLg0KLSAgICBPVVRQVVRfU1VCRElSOj0kKE9QRU5KREtfVEFSR0VUX0NQVV9JU0FESVIpDQotZWxzZQ0KLSAgICBPUklHSU5fUk9PVDo9Ly4uDQotZW5kaWYNCi0NCi1pZmVxICgkKE9QRU5KREtfVEFSR0VUX09TKSwgbWFjb3N4KQ0KLSAgICBPUklHSU5fQVJHOj0kKGNhbGwgU0VUX0VYRUNVVEFCTEVfT1JJR0lOKQ0KLWVsc2UNCi0gICAgT1JJR0lOX0FSRzo9JChjYWxsIFNFVF9FWEVDVVRBQkxFX09SSUdJTiwkKE9SSUdJTl9ST09UKS9saWIkKE9QRU5KREtfVEFSR0VUX0NQVV9MSUJESVIpL2psaSkgXA0KLSAgICAgICAgICAgICAgICAkKGNhbGwgU0VUX0VYRUNVVEFCTEVfT1JJR0lOLCQoT1JJR0lOX1JPT1QpL2pyZS9saWIkKE9QRU5KREtfVEFSR0VUX0NQVV9MSUJESVIpL2psaSkNCi1lbmRpZg0KLQ0KLSMNCi0jIEFwcGxpY2F0aW9ucyBleHBlY3QgdG8gYmUgYWJsZSB0byBsaW5rIGFnYWluc3QgbGliamF3dCB3aXRob3V0IGludm9raW5nDQotIyBTeXN0ZW0ubG9hZExpYnJhcnkoImphd3QiKSBmaXJzdC4gVGhpcyB3YXMgdGhlIGJlaGF2aW91ciBkZXNjcmliZWQgaW4gdGhlDQotIyBkZXZsb3BlciBkb2N1bWVudGF0aW9uIG9mIEpBV1QgYW5kIHdoYXQgd29ya2VkIHdpdGggT3BlbkpESzYuDQotIw0KLWlmbmVxICgkKGZpbmRzdHJpbmcgJChPUEVOSkRLX1RBUkdFVF9PUyksIGxpbnV4IHNvbGFyaXMpLCkNCi0gICAgT1JJR0lOX0FSRys9JChjYWxsIFNFVF9FWEVDVVRBQkxFX09SSUdJTiwkKE9SSUdJTl9ST09UKS9saWIkKE9QRU5KREtfVEFSR0VUX0NQVV9MSUJESVIpKSBcDQotICAgICAgICAgICAgICAgICQoY2FsbCBTRVRfRVhFQ1VUQUJMRV9PUklHSU4sJChPUklHSU5fUk9PVCkvanJlL2xpYiQoT1BFTkpES19UQVJHRVRfQ1BVX0xJQkRJUikpIA0KLWVuZGlmDQotDQotZGVmaW5lIFNldHVwTGF1bmNoZXINCi0gICAgIyBUT0RPOiBGaXggbWFwZmlsZSBvbiBzb2xhcmlzLiBXb24ndCB3b3JrIHdpdGggbGQgYXMgbGlua2VyLg0KLSAgICAjIFBhcmFtZXRlciAxIGlzIHRoZSBuYW1lIG9mIHRoZSBsYXVuY2hlciAoamF2YSxqYXZhYyxqYXIuLi4pDQotICAgICMgUGFyYW1ldGVyIDIgaXMgZXh0cmEgQ0ZMQUdTDQotICAgICMgUGFyYW1ldGVyIDMgaXMgZXh0cmEgTERGTEFHUw0KLSAgICAjIFBhcmFtZXRlciA0IGlzIGV4dHJhIExERkxBR1NfU1VGRklYX3Bvc2l4DQotICAgICMgUGFyYW1ldGVyIDUgaXMgZXh0cmEgTERGTEFHU19TVUZGSVhfd2luZG93cw0KLSAgICAjIFBhcmFtZXRlciA2IGlzIG9wdGlvbmFsIFdpbmRvd3MgSkxJIGxpYnJhcnkgKGZ1bGwgcGF0aCkNCi0gICAgIyBQYXJhbWV0ZXIgNyBpcyBvcHRpb25hbCBXaW5kb3dzIHJlc291cmNlIChSQykgZmxhZ3MNCi0gICAgIyBQYXJhbWV0ZXIgOCBpcyBvcHRpb25hbCBXaW5kb3dzIHZlcnNpb24gcmVzb3VyY2UgZmlsZSAoLnJjKQ0KLSAgICAjIFBhcmFtZXRlciA5ICBpcyBkaWZmZXJlbnQgb3V0cHV0IGRpcg0KLSAgICAjIFBhcmFtZXRlciAxMCBpZiBzZXQsIGxpbmsgc3RhdGljYWxseSB3aXRoIGMgcnVudGltZSBvbiB3aW5kb3dzLg0KLSAgICAjIFBhcmFtZXRlciAxMSBpZiBzZXQsIG92ZXJyaWRlIHBsaXN0IGZpbGUgb24gbWFjb3N4Lg0KLQ0KLSAgICAkMV9XSU5ET1dTX0pMSV9MSUI6PSQoSkRLX09VVFBVVERJUikvb2Jqcy9saWJqbGkvamxpLmxpYg0KLSAgICBpZm5lcSAoJDYsKQ0KLSAgICAgICAgJDFfV0lORE9XU19KTElfTElCOj0kNg0KLSAgICBlbmRpZg0KLSAgICAkMV9WRVJTSU9OX0lORk9fUkVTT1VSQ0U6PSQoSkRLX1RPUERJUikvc3JjL3dpbmRvd3MvcmVzb3VyY2UvdmVyc2lvbi5yYw0KLSAgICBpZm5lcSAoJDgsKQ0KLSAgICAgICAgJDFfVkVSU0lPTl9JTkZPX1JFU09VUkNFOj0kOA0KLSAgICBlbmRpZg0KLQ0KLSAgICAkMV9MREZMQUdTIDo9ICQzDQotICAgICQxX0xERkxBR1NfU1VGRklYIDo9DQotICAgIGlmZXEgKCQoT1BFTkpES19UQVJHRVRfT1MpLCBtYWNvc3gpDQotICAgICAgICAkMV9QTElTVF9GSUxFOj1JbmZvLWNtZGxpbmUucGxpc3QNCi0gICAgICAgIGlmbmVxICgkKDExKSwpDQotICAgICAgICAgICAgJDFfUExJU1RfRklMRTo9JCgxMSkNCi0gICAgICAgIGVuZGlmDQotDQotICAgICAgICAkMV9MREZMQUdTICs9IC1XbCwtYWxsX2xvYWQgJChKREtfT1VUUFVURElSKS9vYmpzL2xpYmpsaV9zdGF0aWMuYSBcDQotICAgICAgICAgICAgICAgICAgICAgIC1mcmFtZXdvcmsgQ29jb2EgLWZyYW1ld29yayBTZWN1cml0eSAtZnJhbWV3b3JrIEFwcGxpY2F0aW9uU2VydmljZXMgXA0KLSAgICAgICAgICAgICAgICAgICAgICAtc2VjdGNyZWF0ZSBfX1RFWFQgX19pbmZvX3BsaXN0ICQoSkRLX1RPUERJUikvc3JjL21hY29zeC9saWIvJCQoJDFfUExJU1RfRklMRSkNCi0gICAgICAgICQxX0xERkxBR1NfU1VGRklYICs9IC1wdGhyZWFkDQotICAgIGVuZGlmDQotDQotICAgIGlmZXEgKCQoVVNFX0VYVEVSTkFMX0xJQlopLCB0cnVlKQ0KLSAgICAgICAgJDFfTERGTEFHU19TVUZGSVggKz0gLWx6DQotICAgIGVuZGlmDQotDQotICAgICQxX09VVFBVVF9ESVJfQVJHOj0kOQ0KLSAgICBpZmVxICgsJCQoJDFfT1VUUFVUX0RJUl9BUkcpKQ0KLSAgICAgICAgJDFfT1VUUFVUX0RJUl9BUkc6PSQoSkRLX09VVFBVVERJUikvYmluDQotICAgIGVuZGlmDQotDQotICAgICMgVE9ETzogbWF5YmUgaXQncyBiZXR0ZXIgdG8gbW92ZSB0aGlzIGlmLXN0YXRlbWVudCBvdXQgb2YgdGhpcyBmdW5jdGlvbg0KLSAgICBpZmVxICgkMSxqYXZhKQ0KLSAgICAgICAgJDFfT1BUSU1JWkFUSU9OX0FSRzo9SElHSA0KLQkkMV9MREZMQUdTX3NvbGFyaXM6PS1SJChPUEVOV0lOX0hPTUUpL2xpYiQoT1BFTkpES19UQVJHRVRfQ1BVX0lTQURJUikNCi0gICAgZWxzZQ0KLSAgICAgICAgJDFfT1BUSU1JWkFUSU9OX0FSRzo9TE9XDQotICAgIGVuZGlmDQotDQotICAgICQxX0NGTEFHUzo9JChDRkxBR1NfSkRLRVhFKQ0KLSAgICBpZmVxICgkKDEwKSx0cnVlKQ0KLSAgICAgICAgJDFfQ0ZMQUdTOj0kKGZpbHRlci1vdXQgLU1ELCQoQ0ZMQUdTX0pES0VYRSkpDQotICAgIGVuZGlmDQotDQotICAgICQoY2FsbCBTZXR1cE5hdGl2ZUNvbXBpbGF0aW9uLEJVSUxEX0xBVU5DSEVSXyQxLFwNCi0JU1JDOj0kKEpES19UT1BESVIpL3NyYy9zaGFyZS9iaW4sXA0KLQlJTkNMVURFX0ZJTEVTOj1tYWluLmMsXA0KLQlMQU5HOj1DLFwNCi0JT1BUSU1JWkFUSU9OOj0kJCgkMV9PUFRJTUlaQVRJT05fQVJHKSwgXA0KLQlDRkxBR1M6PSQkKCQxX0NGTEFHUykgXA0KLQkJLUkkKEpES19UT1BESVIpL3NyYy9zaGFyZS9iaW4gXA0KLQkJLUkkKEpES19UT1BESVIpL3NyYy8kKE9QRU5KREtfVEFSR0VUX09TX0FQSV9ESVIpL2JpbiBcDQotCQktSSQoSkRLX1RPUERJUikvc3JjLyQoT1BFTkpES19UQVJHRVRfT1MpL2JpbiBcDQotICAgICAgICAgICAgICAgIC1ERlVMTF9WRVJTSU9OPSciJChGVUxMX1ZFUlNJT04pIicgXA0KLSAgICAgICAgICAgICAgICAtREpES19NQUpPUl9WRVJTSU9OPSciJChKREtfTUFKT1JfVkVSU0lPTikiJyBcDQotICAgICAgICAgICAgICAgIC1ESkRLX01JTk9SX1ZFUlNJT049JyIkKEpES19NSU5PUl9WRVJTSU9OKSInIFwNCi0JCS1ETElCQVJDSE5BTUU9JyIkKE9QRU5KREtfVEFSR0VUX0NQVV9MRUdBQ1kpIicgXA0KLQkJLURMQVVOQ0hFUl9OQU1FPSciJChMQVVOQ0hFUl9OQU1FKSInIFwNCi0JCS1EUFJPR05BTUU9JyIkMSInICQoRFBBQ0tBR0VQQVRIKSBcDQotCQkkMixcDQotCUNGTEFHU19saW51eDo9LWZQSUMsXA0KLSAgICAgICAgQ0ZMQUdTX3NvbGFyaXM6PS1LUElDIC1ESEFWRV9HRVRIUlRJTUUsXA0KLQlMREZMQUdTOj0kKExERkxBR1NfSkRLRVhFKSBcDQotICAgICAgICAgICAgICAgICAkKE9SSUdJTl9BUkcpIFwNCi0JCSAkJCgkMV9MREZMQUdTKSxcDQotCUxERkxBR1NfbWFjb3N4Oj0kKGNhbGwgU0VUX1NIQVJFRF9MSUJSQVJZX05BTUUsJDEpLFwNCi0JTERGTEFHU19saW51eDo9LWxwdGhyZWFkIFwNCi0gICAgICAgICAgICAgICAgICAgICAgICQoY2FsbCBTRVRfU0hBUkVEX0xJQlJBUllfTkFNRSwkKExJQlJBUllfUFJFRklYKSQoU0hBUkVEX0xJQlJBUllfU1VGRklYKSksXA0KLQlMREZMQUdTX3NvbGFyaXM6PSQkKCQxX0xERkxBR1Nfc29sYXJpcykgXA0KLSAgICAgICAgICAgICAgICAgICAgICAgJChjYWxsIFNFVF9TSEFSRURfTElCUkFSWV9OQU1FLCQoTElCUkFSWV9QUkVGSVgpJChTSEFSRURfTElCUkFSWV9TVUZGSVgpKSxcDQotCU1BUEZJTEUgOj0gJChKREtfVE9QRElSKS9tYWtlZmlsZXMvbWFwZmlsZXMvbGF1bmNoZXJzL21hcGZpbGUtJChPUEVOSkRLX1RBUkdFVF9DUFUpLCBcDQotICAgICAgICBMREZMQUdTX1NVRkZJWDo9JChMREZMQUdTX0pES0VYRV9TVUZGSVgpICQkKCQxX0xERkxBR1NfU1VGRklYKSxcDQotCUxERkxBR1NfU1VGRklYX3Bvc2l4Oj0kNCxcDQotCUxERkxBR1NfU1VGRklYX3dpbmRvd3M6PSQkKCQxX1dJTkRPV1NfSkxJX0xJQikgXA0KLQkJCSAgICAgICAkKEpES19PVVRQVVRESVIpL29ianMvbGliamF2YS9qYXZhLmxpYiBhZHZhcGkzMi5saWIgJDUsXA0KLQlMREZMQUdTX1NVRkZJWF9saW51eDo9LUwkKEpES19PVVRQVVRESVIpL2xpYiQoT1BFTkpES19UQVJHRVRfQ1BVX0xJQkRJUikvamxpIC1samxpICQoTElCREwpIC1sYywgXA0KLQlMREZMQUdTX1NVRkZJWF9zb2xhcmlzOj0tTCQoSkRLX09VVFBVVERJUikvbGliJChPUEVOSkRLX1RBUkdFVF9DUFVfTElCRElSKS9qbGkgLWxqbGkgLWx0aHJlYWQgJChMSUJETCkgLWxjLCBcDQotCU9CSkVDVF9ESVI6PSQoSkRLX09VVFBVVERJUikvb2Jqcy8kMV9vYmpzJChPVVRQVVRfU1VCRElSKSxcDQotCU9VVFBVVF9ESVI6PSQkKCQxX09VVFBVVF9ESVJfQVJHKSQoT1VUUFVUX1NVQkRJUiksXA0KLQlQUk9HUkFNOj0kMSxcDQotCURFQlVHX1NZTUJPTFM6PXRydWUsXA0KLQlWRVJTSU9OSU5GT19SRVNPVVJDRTo9JCQoJDFfVkVSU0lPTl9JTkZPX1JFU09VUkNFKSxcDQotCVJDX0ZMQUdTOj0kKFJDX0ZMQUdTKVwNCi0JCSAgL0QgIkpES19GTkFNRT0kMSQoRVhFX1NVRkZJWCkiIFwNCi0JCSAgL0QgIkpES19JTlRFUk5BTF9OQU1FPSQxIiBcDQotCQkgIC9EICJKREtfRlRZUEU9MHgxTCIgXA0KLQkJICAkNyxcDQotCU1BTklGRVNUOj0kKEpES19UT1BESVIpL3NyYy93aW5kb3dzL3Jlc291cmNlL2phdmEubWFuaWZlc3QpDQotDQotICAgIEJVSUxEX0xBVU5DSEVSUyArPSAkJChCVUlMRF9MQVVOQ0hFUl8kMSkNCi0NCi0gICAgaWZlcSAoJChPUEVOSkRLX1RBUkdFVF9PUyksbWFjb3N4KQ0KLSAgICAgICAgJCQoQlVJTERfTEFVTkNIRVJfJDEpIDogJChKREtfT1VUUFVURElSKS9vYmpzL2xpYmpsaV9zdGF0aWMuYQ0KLSAgICBlbmRpZg0KLQ0KLSAgICBpZmVxICgkKE9QRU5KREtfVEFSR0VUX09TKSx3aW5kb3dzKQ0KLSAgICAgICAgJCQoQlVJTERfTEFVTkNIRVJfJDEpIDogJChKREtfT1VUUFVURElSKS9vYmpzL2xpYmphdmEvamF2YS5saWIgXA0KLQkJCQkkJCgkMV9XSU5ET1dTX0pMSV9MSUIpDQotICAgIGVuZGlmICAgIAkgDQotZW5kZWYNCi0NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0NCi1YTElCUzo9JChYX0xJQlMpIC1sWDExDQotaWZlcSAoJChPUEVOSkRLX1RBUkdFVF9PUyksbWFjb3N4KQ0KLSAgICBEUEFDS0FHRVBBVEg6PS1EUEFDS0FHRV9QQVRIPSciJChQQUNLQUdFX1BBVEgpIicNCi0gICAgWExJQlM6PQ0KLWVuZGlmDQotDQotaWZkZWYgT1BFTkpESw0KLSAgICBKQVZBX1JDX0ZMQUdTICs9IC1pICIkKEpES19UT1BESVIpL3NyYy93aW5kb3dzL3Jlc291cmNlL2ljb25zIg0KLWVsc2UNCi0gICAgSkFWQV9SQ19GTEFHUyArPSAtaSAiJChKREtfVE9QRElSKS9zcmMvY2xvc2VkL3dpbmRvd3MvbmF0aXZlL3N1bi93aW5kb3dzIg0KLWVuZGlmDQotDQotIyBPbiB3aW5kb3dzLCB0aGUgZGVidWdpbmZvIGZpbGVzIGdldCB0aGUgc2FtZSBuYW1lIGFzIGZvciBqYXZhLmRsbC4gQnVpbGQNCi0jIGludG8gYW5vdGhlciBkaXIgYW5kIGNvcHkgc2VsZWN0aXZlbHkgc28gZGVidWdpbmZvIGZvciBqYXZhLmRsbCBpc24ndA0KLSMgb3ZlcndyaXR0ZW4uDQotJChldmFsICQoY2FsbCBTZXR1cExhdW5jaGVyLGphdmEsXA0KLSAgICAtREVYUEFORF9DTEFTU1BBVEhfV0lMRENBUkRTLCwsdXNlcjMyLmxpYiBjb21jdGwzMi5saWIsXA0KLSAgICAkKEpES19PVVRQVVRESVIpL29ianMvamxpX3N0YXRpYy5saWIsJChKQVZBX1JDX0ZMQUdTKSxcDQotICAgICQoSkRLX1RPUERJUikvc3JjL3dpbmRvd3MvcmVzb3VyY2UvamF2YS5yYywkKEpES19PVVRQVVRESVIpL29ianMvamF2YV9vYmpzLHRydWUpKQ0KLQ0KLSQoSkRLX09VVFBVVERJUikvYmluJChPVVRQVVRfU1VCRElSKS9qYXZhJChFWEVfU1VGRklYKTogJChCVUlMRF9MQVVOQ0hFUl9qYXZhKQ0KLQkkKE1LRElSKSAtcCAkKEBEKQ0KLQkkKFJNKSAkQA0KLQkkKENQKSAkKEpES19PVVRQVVRESVIpL29ianMvamF2YV9vYmpzJChPVVRQVVRfU1VCRElSKS9qYXZhJChFWEVfU1VGRklYKSAkQA0KLQ0KLUJVSUxEX0xBVU5DSEVSUyArPSAkKEpES19PVVRQVVRESVIpL2JpbiQoT1VUUFVUX1NVQkRJUikvamF2YSQoRVhFX1NVRkZJWCkNCi0NCi1pZmVxICgkKE9QRU5KREtfVEFSR0VUX09TKSx3aW5kb3dzKQ0KLSAgICAkKGV2YWwgJChjYWxsIFNldHVwTGF1bmNoZXIsamF2YXcsXA0KLSAgICAgICAgLURKQVZBVyAtREVYUEFORF9DTEFTU1BBVEhfV0lMRENBUkRTLCwsdXNlcjMyLmxpYiBjb21jdGwzMi5saWIsXA0KLSAgICAgICAgJChKREtfT1VUUFVURElSKS9vYmpzL2psaV9zdGF0aWMubGliLCQoSkFWQV9SQ19GTEFHUyksXA0KLSAgICAgICAgJChKREtfVE9QRElSKS9zcmMvd2luZG93cy9yZXNvdXJjZS9qYXZhLnJjLCx0cnVlKSkNCi1lbmRpZg0KLQ0KLQ0KLWlmbmRlZiBCVUlMRF9IRUFETEVTU19PTkxZDQotJChldmFsICQoY2FsbCBTZXR1cExhdW5jaGVyLGFwcGxldHZpZXdlcixcDQotICAgIC1ESkFWQV9BUkdTPSd7ICItSi1tczhtIiQoQ09NTUEpICJzdW4uYXBwbGV0Lk1haW4iJChDT01NQSkgfScsLFwNCi0gICAgJChYTElCUykpKQ0KLWVuZGlmDQotDQotJChldmFsICQoY2FsbCBTZXR1cExhdW5jaGVyLGV4dGNoZWNrLFwNCi0gICAgLURKQVZBX0FSR1M9J3sgIi1KLW1zOG0iJChDT01NQSkgImNvbS5zdW4udG9vbHMuZXh0Y2hlY2suTWFpbiIkKENPTU1BKSB9JykpDQotDQotJChldmFsICQoY2FsbCBTZXR1cExhdW5jaGVyLGlkbGosXA0KLSAgICAtREpBVkFfQVJHUz0neyAiLUotbXM4bSIkKENPTU1BKSAiY29tLnN1bi50b29scy5jb3JiYS5zZS5pZGwudG9KYXZhUG9ydGFibGUuQ29tcGlsZSIkKENPTU1BKSB9JykpDQotDQotJChldmFsICQoY2FsbCBTZXR1cExhdW5jaGVyLGphcixcDQotICAgIC1ESkFWQV9BUkdTPSd7ICItSi1tczhtIiQoQ09NTUEpICJzdW4udG9vbHMuamFyLk1haW4iJChDT01NQSkgfScpKQ0KLQ0KLSQoZXZhbCAkKGNhbGwgU2V0dXBMYXVuY2hlcixqYXJzaWduZXIsXA0KLSAgICAtREpBVkFfQVJHUz0neyAiLUotbXM4bSIkKENPTU1BKSAic3VuLnNlY3VyaXR5LnRvb2xzLkphclNpZ25lciIkKENPTU1BKSB9JykpDQotDQotJChldmFsICQoY2FsbCBTZXR1cExhdW5jaGVyLGphdmFjLFwNCi0gICAgLURFWFBBTkRfQ0xBU1NQQVRIX1dJTERDQVJEUyBcDQotICAgIC1ETkVWRVJfQUNUX0FTX1NFUlZFUl9DTEFTU19NQUNISU5FIFwNCi0gICAgLURKQVZBX0FSR1M9J3sgIi1KLW1zOG0iJChDT01NQSkgImNvbS5zdW4udG9vbHMuamF2YWMuTWFpbiIkKENPTU1BKSB9JykpDQotDQotJChldmFsICQoY2FsbCBTZXR1cExhdW5jaGVyLGphdmFkb2MsXA0KLSAgICAtREVYUEFORF9DTEFTU1BBVEhfV0lMRENBUkRTIFwNCi0gICAgLURORVZFUl9BQ1RfQVNfU0VSVkVSX0NMQVNTX01BQ0hJTkUgXA0KLSAgICAtREpBVkFfQVJHUz0neyAiLUotbXM4bSIkKENPTU1BKSAiY29tLnN1bi50b29scy5qYXZhZG9jLk1haW4iJChDT01NQSkgfScpKQ0KLQ0KLSQoZXZhbCAkKGNhbGwgU2V0dXBMYXVuY2hlcixqYXZhaCxcDQotICAgIC1ERVhQQU5EX0NMQVNTUEFUSF9XSUxEQ0FSRFMgXA0KLSAgICAtRE5FVkVSX0FDVF9BU19TRVJWRVJfQ0xBU1NfTUFDSElORSBcDQotICAgIC1ESkFWQV9BUkdTPSd7ICItSi1tczhtIiQoQ09NTUEpICJjb20uc3VuLnRvb2xzLmphdmFoLk1haW4iJChDT01NQSkgfScpKQ0KLQ0KLSQoZXZhbCAkKGNhbGwgU2V0dXBMYXVuY2hlcixqYXZhcCxcDQotICAgIC1ERVhQQU5EX0NMQVNTUEFUSF9XSUxEQ0FSRFMgXA0KLSAgICAtRE5FVkVSX0FDVF9BU19TRVJWRVJfQ0xBU1NfTUFDSElORSBcDQotICAgIC1ESkFWQV9BUkdTPSd7ICItSi1tczhtIiQoQ09NTUEpICJjb20uc3VuLnRvb2xzLmphdmFwLk1haW4iJChDT01NQSkgfScpKQ0KLQ0KLUJVSUxEX0xBVU5DSEVSX2pjb25zb2xlX0NGTEFHU193aW5kb3dzOj0tREpBVkFXDQotQlVJTERfTEFVTkNIRVJfamNvbnNvbGVfTERGTEFHU193aW5kb3dzOj11c2VyMzIubGliDQotDQotJChldmFsICQoY2FsbCBTZXR1cExhdW5jaGVyLGpjb25zb2xlLFwNCi0gICAgLURKQVZBX0FSR1M9J3sgIi1KLW1zOG0iJChDT01NQSkgIi1KLURqY29uc29sZS5zaG93T3V0cHV0Vmlld2VyIiQoQ09NTUEpICJzdW4udG9vbHMuamNvbnNvbGUuSkNvbnNvbGUiJChDT01NQSkgfScgXA0KLSAgICAtREFQUF9DTEFTU1BBVEg9J3sgIi9saWIvamNvbnNvbGUuamFyIiQoQ09NTUEpICIvbGliL3Rvb2xzLmphciIkKENPTU1BKSAiL2NsYXNzZXMiIH0nKSkNCi0NCi0kKGV2YWwgJChjYWxsIFNldHVwTGF1bmNoZXIsamRiLFwNCi0gICAgLURKQVZBX0FSR1M9J3sgIi1KLW1zOG0iJChDT01NQSkgImNvbS5zdW4udG9vbHMuZXhhbXBsZS5kZWJ1Zy50dHkuVFRZIiQoQ09NTUEpIH0nIFwNCi0gICAgLURBUFBfQ0xBU1NQQVRIPSd7ICIvbGliL3Rvb2xzLmphciIkKENPTU1BKSAiL2xpYi9zYS1qZGkuamFyIiQoQ09NTUEpICIvY2xhc3NlcyIgfScpKQ0KLQ0KLSQoZXZhbCAkKGNhbGwgU2V0dXBMYXVuY2hlcixqaGF0LFwNCi0gICAgLURKQVZBX0FSR1M9J3sgIi1KLW1zOG0iJChDT01NQSkgImNvbS5zdW4udG9vbHMuaGF0Lk1haW4iJChDT01NQSkgfScpKQ0KLQ0KLSQoZXZhbCAkKGNhbGwgU2V0dXBMYXVuY2hlcixqaW5mbyxcDQotICAgIC1ESkFWQV9BUkdTPSd7ICItSi1tczhtIiQoQ09NTUEpIFwNCi0JCSAgICItSi1Ec3VuLmp2bS5ob3RzcG90LmRlYnVnZ2VyLnVzZVByb2NEZWJ1Z2dlciIkKENPTU1BKSBcDQotCQkgICAiLUotRHN1bi5qdm0uaG90c3BvdC5kZWJ1Z2dlci51c2VXaW5kYmdEZWJ1Z2dlciIkKENPTU1BKSBcDQotCQkgICAic3VuLnRvb2xzLmppbmZvLkpJbmZvIiQoQ09NTUEpIH0nIFwNCi0gICAgLURBUFBfQ0xBU1NQQVRIPSd7ICIvbGliL3Rvb2xzLmphciIkKENPTU1BKSAiL2xpYi9zYS1qZGkuamFyIiQoQ09NTUEpICIvY2xhc3NlcyIgfScgXA0KLSAgICAsLCwsLCwsLCxJbmZvLXByaXZpbGVnZWQucGxpc3QpKQ0KLQ0KLSQoZXZhbCAkKGNhbGwgU2V0dXBMYXVuY2hlcixqbWFwLFwNCi0gICAgLURKQVZBX0FSR1M9J3sgIi1KLW1zOG0iJChDT01NQSkgXA0KLQkJICAgIi1KLURzdW4uanZtLmhvdHNwb3QuZGVidWdnZXIudXNlUHJvY0RlYnVnZ2VyIiQoQ09NTUEpIFwNCi0JCSAgICItSi1Ec3VuLmp2bS5ob3RzcG90LmRlYnVnZ2VyLnVzZVdpbmRiZ0RlYnVnZ2VyIiQoQ09NTUEpIFwNCi0JCSAgICJzdW4udG9vbHMuam1hcC5KTWFwIiQoQ09NTUEpIH0nIFwNCi0gICAgLURBUFBfQ0xBU1NQQVRIPSd7ICIvbGliL3Rvb2xzLmphciIkKENPTU1BKSAiL2xpYi9zYS1qZGkuamFyIiQoQ09NTUEpICIvY2xhc3NlcyIgfScgXA0KLSAgICAsLCwsLCwsLCxJbmZvLXByaXZpbGVnZWQucGxpc3QpKQ0KLQ0KLSQoZXZhbCAkKGNhbGwgU2V0dXBMYXVuY2hlcixqcHMsXA0KLSAgICAtREpBVkFfQVJHUz0neyAiLUotbXM4bSIkKENPTU1BKSAic3VuLnRvb2xzLmpwcy5KcHMiJChDT01NQSkgfScpKQ0KLQ0KLSQoZXZhbCAkKGNhbGwgU2V0dXBMYXVuY2hlcixqcnVuc2NyaXB0LFwNCi0gICAgLURKQVZBX0FSR1M9J3sgIi1KLW1zOG0iJChDT01NQSkgImNvbS5zdW4udG9vbHMuc2NyaXB0LnNoZWxsLk1haW4iJChDT01NQSkgfScpKQ0KLQ0KLSQoZXZhbCAkKGNhbGwgU2V0dXBMYXVuY2hlcixqc2FkZWJ1Z2QsXA0KLSAgICAtREpBVkFfQVJHUz0neyAiLUotbXM4bSIkKENPTU1BKSAic3VuLmp2bS5ob3RzcG90LmpkaS5TQURlYnVnU2VydmVyIiQoQ09NTUEpIH0nIFwNCi0gICAgLURBUFBfQ0xBU1NQQVRIPSd7ICIvbGliL3Rvb2xzLmphciIkKENPTU1BKSAiL2xpYi9zYS1qZGkuamFyIiQoQ09NTUEpICIvY2xhc3NlcyIgfScgXA0KLSAgICAsLCwsLCwsLCxJbmZvLXByaXZpbGVnZWQucGxpc3QpKQ0KLQ0KLSQoZXZhbCAkKGNhbGwgU2V0dXBMYXVuY2hlcixqc3RhY2ssXA0KLSAgICAtREpBVkFfQVJHUz0neyAiLUotbXM4bSIkKENPTU1BKSBcDQotCQkgICAiLUotRHN1bi5qdm0uaG90c3BvdC5kZWJ1Z2dlci51c2VQcm9jRGVidWdnZXIiJChDT01NQSkgXA0KLQkJICAgIi1KLURzdW4uanZtLmhvdHNwb3QuZGVidWdnZXIudXNlV2luZGJnRGVidWdnZXIiJChDT01NQSkgXA0KLQkJICAgInN1bi50b29scy5qc3RhY2suSlN0YWNrIiQoQ09NTUEpIH0nIFwNCi0gICAgLURBUFBfQ0xBU1NQQVRIPSd7ICIvbGliL3Rvb2xzLmphciIkKENPTU1BKSAiL2xpYi9zYS1qZGkuamFyIiQoQ09NTUEpICIvY2xhc3NlcyIgfScgXA0KLSAgICAsLCwsLCwsLCxJbmZvLXByaXZpbGVnZWQucGxpc3QpKQ0KLQ0KLSQoZXZhbCAkKGNhbGwgU2V0dXBMYXVuY2hlcixqc3RhdCxcDQotICAgIC1ESkFWQV9BUkdTPSd7ICItSi1tczhtIiQoQ09NTUEpICJzdW4udG9vbHMuanN0YXQuSnN0YXQiJChDT01NQSkgfScpKQ0KLQ0KLSQoZXZhbCAkKGNhbGwgU2V0dXBMYXVuY2hlcixqc3RhdGQsXA0KLSAgICAtREpBVkFfQVJHUz0neyAiLUotbXM4bSIkKENPTU1BKSAic3VuLnRvb2xzLmpzdGF0ZC5Kc3RhdGQiJChDT01NQSkgfScpKQ0KLQ0KLSQoZXZhbCAkKGNhbGwgU2V0dXBMYXVuY2hlcixrZXl0b29sLFwNCi0gICAgLURKQVZBX0FSR1M9J3sgIi1KLW1zOG0iJChDT01NQSkgInN1bi5zZWN1cml0eS50b29scy5LZXlUb29sIiQoQ09NTUEpIH0nKSkNCi0NCi0kKGV2YWwgJChjYWxsIFNldHVwTGF1bmNoZXIsbmF0aXZlMmFzY2lpLFwNCi0gICAgLURKQVZBX0FSR1M9J3sgIi1KLW1zOG0iJChDT01NQSkgInN1bi50b29scy5uYXRpdmUyYXNjaWkuTWFpbiIkKENPTU1BKSB9JykpDQotDQotaWZuZGVmIEJVSUxEX0hFQURMRVNTX09OTFkNCi0kKGV2YWwgJChjYWxsIFNldHVwTGF1bmNoZXIscG9saWN5dG9vbCxcDQotICAgIC1ESkFWQV9BUkdTPSd7ICItSi1tczhtIiQoQ09NTUEpICJzdW4uc2VjdXJpdHkudG9vbHMucG9saWN5dG9vbC5Qb2xpY3lUb29sIiQoQ09NTUEpIH0nLCxcDQotICAgICQoWExJQlMpKSkNCi1lbmRpZg0KLQ0KLSQoZXZhbCAkKGNhbGwgU2V0dXBMYXVuY2hlcixybWljLFwNCi0gICAgLURFWFBBTkRfQ0xBU1NQQVRIX1dJTERDQVJEUyBcDQotICAgIC1ESkFWQV9BUkdTPSd7ICItSi1tczhtIiQoQ09NTUEpICJzdW4ucm1pLnJtaWMuTWFpbiIkKENPTU1BKSB9JykpDQotDQotJChldmFsICQoY2FsbCBTZXR1cExhdW5jaGVyLHNjaGVtYWdlbixcDQotICAgIC1ESkFWQV9BUkdTPSd7ICItSi1tczhtIiQoQ09NTUEpICJjb20uc3VuLnRvb2xzLmludGVybmFsLmp4Yy5TY2hlbWFHZW5lcmF0b3IiJChDT01NQSkgfScpKQ0KLQ0KLSQoZXZhbCAkKGNhbGwgU2V0dXBMYXVuY2hlcixzZXJpYWx2ZXIsXA0KLSAgICAtREVYUEFORF9DTEFTU1BBVEhfV0lMRENBUkRTIFwNCi0gICAgLURKQVZBX0FSR1M9J3sgIi1KLW1zOG0iJChDT01NQSkgInN1bi50b29scy5zZXJpYWx2ZXIuU2VyaWFsVmVyIiQoQ09NTUEpIH0nKSkNCi0NCi0kKGV2YWwgJChjYWxsIFNldHVwTGF1bmNoZXIseGpjLFwNCi0gICAgLURKQVZBX0FSR1M9J3sgIi1KLW1zOG0iJChDT01NQSkgImNvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLkRyaXZlciIkKENPTU1BKSB9JykpDQotDQotJChldmFsICQoY2FsbCBTZXR1cExhdW5jaGVyLHdzZ2VuLFwNCi0gICAgLURKQVZBX0FSR1M9J3sgIi1KLW1zOG0iJChDT01NQSkgImNvbS5zdW4udG9vbHMuaW50ZXJuYWwud3MuV3NHZW4iJChDT01NQSkgfScpKQ0KLQ0KLSQoZXZhbCAkKGNhbGwgU2V0dXBMYXVuY2hlcix3c2ltcG9ydCxcDQotICAgIC1ESkFWQV9BUkdTPSd7ICItSi1tczhtIiQoQ09NTUEpICJjb20uc3VuLnRvb2xzLmludGVybmFsLndzLldzSW1wb3J0IiQoQ09NTUEpIH0nKSkNCi0NCi0kKGV2YWwgJChjYWxsIFNldHVwTGF1bmNoZXIsb3JiZCxcDQotICAgIC1ESkFWQV9BUkdTPSd7IAkiLUotbXM4bSIkKENPTU1BKSBcDQotCQkJIi1KLURjb20uc3VuLkNPUkJBLmFjdGl2YXRpb24uRGJEaXI9Li9vcmIuZGIiJChDT01NQSkgXA0KLQkJCSItSi1EY29tLnN1bi5DT1JCQS5hY3RpdmF0aW9uLlBvcnQ9MTA0OSIkKENPTU1BKSBcDQotCQkJIi1KLURjb20uc3VuLkNPUkJBLlBPQS5PUkJTZXJ2ZXJJZD0xIiQoQ09NTUEpIFwNCi0JCQkiY29tLnN1bi5jb3JiYS5zZS5pbXBsLmFjdGl2YXRpb24uT1JCRCIkKENPTU1BKSB9JykpDQotDQotJChldmFsICQoY2FsbCBTZXR1cExhdW5jaGVyLHNlcnZlcnRvb2wsXA0KLSAgICAtREpBVkFfQVJHUz0neyAiLUotbXM4bSIkKENPTU1BKSAiY29tLnN1bi5jb3JiYS5zZS5pbXBsLmFjdGl2YXRpb24uU2VydmVyVG9vbCIkKENPTU1BKSB9JykpDQotDQotJChldmFsICQoY2FsbCBTZXR1cExhdW5jaGVyLHRuYW1lc2VydixcDQotICAgIC1ESkFWQV9BUkdTPSd7IAkiLUotbXM4bSIkKENPTU1BKSBcDQotCQkJIi1KLURjb20uc3VuLkNPUkJBLmFjdGl2YXRpb24uRGJEaXI9Li9vcmIuZGIiJChDT01NQSkgXA0KLQkJCSItSi1EamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2luZ1Blcm1pc3Npb249Y29udG9sIiQoQ09NTUEpIFwNCi0JCQkiLUotRGNvbS5zdW4uQ09SQkEuUE9BLk9SQlNlcnZlcklkPTEiJChDT01NQSkgXA0KLQkJCSJjb20uc3VuLmNvcmJhLnNlLmltcGwubmFtaW5nLmNvc25hbWluZy5UcmFuc2llbnROYW1lU2VydmVyIiQoQ09NTUEpIH0nKSkNCi0NCi0kKGV2YWwgJChjYWxsIFNldHVwTGF1bmNoZXIscGFjazIwMCxcDQotICAgIC1ESkFWQV9BUkdTPSd7CSItSi1tczhtIiQoQ09NTUEpICJjb20uc3VuLmphdmEudXRpbC5qYXIucGFjay5Ecml2ZXIiJChDT01NQSkgIi0tcGFjayIgfScpKQ0KLQ0KLSQoZXZhbCAkKGNhbGwgU2V0dXBMYXVuY2hlcixybWlkLFwNCi0gICAgLURKQVZBX0FSR1M9J3sJIi1KLW1zOG0iJChDT01NQSkgInN1bi5ybWkuc2VydmVyLkFjdGl2YXRpb24iJChDT01NQSkgfScpKQ0KLQ0KLSQoZXZhbCAkKGNhbGwgU2V0dXBMYXVuY2hlcixybWlyZWdpc3RyeSxcDQotICAgIC1ESkFWQV9BUkdTPSd7CSItSi1tczhtIiQoQ09NTUEpICJzdW4ucm1pLnJlZ2lzdHJ5LlJlZ2lzdHJ5SW1wbCIkKENPTU1BKSB9JykpDQotDQotJChldmFsICQoY2FsbCBTZXR1cExhdW5jaGVyLGpjbWQsXA0KLSAgICAtREpBVkFfQVJHUz0newkiLUotbXM4bSIkKENPTU1BKSAic3VuLnRvb2xzLmpjbWQuSkNtZCIkKENPTU1BKSB9JykpDQotDQotaWZlcSAoJChPUEVOSkRLX1RBUkdFVF9PUyksd2luZG93cykNCi0gICAgJChldmFsICQoY2FsbCBTZXR1cExhdW5jaGVyLGtpbml0LFwNCi0gICAgICAgIC1ESkFWQV9BUkdTPSd7CSItSi1tczhtIiQoQ09NTUEpICJzdW4uc2VjdXJpdHkua3JiNS5pbnRlcm5hbC50b29scy5LaW5pdCIkKENPTU1BKSB9JykpDQotDQotICAgICQoZXZhbCAkKGNhbGwgU2V0dXBMYXVuY2hlcixrbGlzdCxcDQotICAgICAgICAtREpBVkFfQVJHUz0newkiLUotbXM4bSIkKENPTU1BKSAic3VuLnNlY3VyaXR5LmtyYjUuaW50ZXJuYWwudG9vbHMuS2xpc3QiJChDT01NQSkgfScpKQ0KLQ0KLSAgICAkKGV2YWwgJChjYWxsIFNldHVwTGF1bmNoZXIsa3RhYixcDQotICAgICAgICAtREpBVkFfQVJHUz0newkiLUotbXM4bSIkKENPTU1BKSAic3VuLnNlY3VyaXR5LmtyYjUuaW50ZXJuYWwudG9vbHMuS3RhYiIkKENPTU1BKSB9JykpDQotZW5kaWYNCi0NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIFRoZSBvcmRlciBvZiB0aGUgb2JqZWN0IGZpbGVzIG9uIHRoZSBsaW5rIGNvbW1hbmQgbGluZSBhZmZlY3RzIHRoZSBzaXplIG9mIHRoZSByZXN1bHRpbmcNCi0jIGJpbmFyeSAoYXQgbGVhc3Qgb24gbGludXgpIHdoaWNoIGNhdXNlcyB0aGUgc2l6ZSB0byBkaWZmZXIgYmV0d2VlbiBvbGQgYW5kIG5ldyBidWlsZC4NCi1pZmVxICgkKFVTRV9FWFRFUk5BTF9MSUJaKSwgdHJ1ZSkNCi1VTlBBQ0tFWEVfQ0ZMQUdTIDo9IC1EU1lTVEVNX1pMSUINCi1VTlBBQ0tFWEVfWklQT0JKUyA6PSAtbHoNCi1lbHNlDQotVU5QQUNLRVhFX0NGTEFHUyA6PSAtSSQoSkRLX1RPUERJUikvc3JjL3NoYXJlL25hdGl2ZS9qYXZhL3V0aWwvemlwL3psaWItMS4yLjUNCi1VTlBBQ0tFWEVfWklQT0JKUyA6PSAJJChKREtfT1VUUFVURElSKS9vYmpzL2xpYnppcC96Y3JjMzIkKE9CSl9TVUZGSVgpIFwNCi0JCSAgICAgCSQoSkRLX09VVFBVVERJUikvb2Jqcy9saWJ6aXAvZGVmbGF0ZSQoT0JKX1NVRkZJWCkgXA0KLQkJCSQoSkRLX09VVFBVVERJUikvb2Jqcy9saWJ6aXAvdHJlZXMkKE9CSl9TVUZGSVgpIFwNCi0JCQkkKEpES19PVVRQVVRESVIpL29ianMvbGliemlwL3phZGxlcjMyJChPQkpfU1VGRklYKSBcDQotCQkJJChKREtfT1VUUFVURElSKS9vYmpzL2xpYnppcC9jb21wcmVzcyQoT0JKX1NVRkZJWCkgXA0KLQkJCSQoSkRLX09VVFBVVERJUikvb2Jqcy9saWJ6aXAvenV0aWwkKE9CSl9TVUZGSVgpIFwNCi0JCQkkKEpES19PVVRQVVRESVIpL29ianMvbGliemlwL2luZmxhdGUkKE9CSl9TVUZGSVgpIFwNCi0JCQkkKEpES19PVVRQVVRESVIpL29ianMvbGliemlwL2luZmJhY2skKE9CSl9TVUZGSVgpIFwNCi0JCQkkKEpES19PVVRQVVRESVIpL29ianMvbGliemlwL2luZnRyZWVzJChPQkpfU1VGRklYKSBcDQotCQkJJChKREtfT1VUUFVURElSKS9vYmpzL2xpYnppcC9pbmZmYXN0JChPQkpfU1VGRklYKQ0KLQ0KLWVuZGlmDQotDQotaWZlcSAoJChPUEVOSkRLX1RBUkdFVF9DUFVfQVJDSCksIHNwYXJjKQ0KLSAgICBVTlBBQ0tFWEVfQ0ZMQUdTICs9IC14cmVncz1ubyVhcHBsDQotZW5kaWYNCi0NCi1VTlBBQ0tFWEVfTEFORzo9Qw0KLWlmZXEgKCQoT1BFTkpES19UQVJHRVRfT1MpLHNvbGFyaXMpDQotICAgIFVOUEFDS0VYRV9MQU5HOj1DKysNCi1lbmRpZg0KLQ0KLSQoZXZhbCAkKGNhbGwgU2V0dXBOYXRpdmVDb21waWxhdGlvbixCVUlMRF9VTlBBQ0tFWEUsXA0KLSAgICAgICAgICAgICAgICBTUkM6PSQoSkRLX1RPUERJUikvc3JjL3NoYXJlL25hdGl2ZS9jb20vc3VuL2phdmEvdXRpbC9qYXIvcGFjayxcDQotCQlFWENMVURFX0ZJTEVTOj1qbmkuY3BwLFwNCi0JCUxBTkc6PSQoVU5QQUNLRVhFX0xBTkcpLFwNCi0JCU9QVElNSVpBVElPTiA6PSBMT1csIFwNCi0JCUNGTEFHUzo9JChVTlBBQ0tFWEVfQ0ZMQUdTKSAkKENYWEZMQUdTX0pES0VYRSlcDQotICAgICAgICAgICAgICAgICAgICAgICAgLURGVUxMLCBcDQotCQlDRkxBR1NfcmVsZWFzZTo9LURQUk9EVUNULFwNCi0JCUNGTEFHU19saW51eDo9LWZQSUMsXA0KLQkJQ0ZMQUdTX3NvbGFyaXMgOj0gLUtQSUMsIFwNCi0JCUNGTEFHU19tYWNvc3ggOj0gLWZQSUMsIFwNCi0JCU1BUEZJTEU6PSQoSkRLX1RPUERJUikvbWFrZWZpbGVzL21hcGZpbGVzL2xpYnVucGFjay9tYXBmaWxlLXZlcnMtdW5wYWNrMjAwLCBcDQotCQlMREZMQUdTOj0kKExERkxBR1NfSkRLRVhFKSAkKExERkxBR1NfQ1hYX0pESykgXA0KLQkJCSAkKGNhbGwgU0VUX1NIQVJFRF9MSUJSQVJZX05BTUUsJChMSUJSQVJZX1BSRUZJWCl1bnBhY2skKFNIQVJFRF9MSUJSQVJZX1NVRkZJWCkpIFwNCi0JCQkgJChjYWxsIFNFVF9TSEFSRURfTElCUkFSWV9PUklHSU4pIFwNCi0JCQkgJChVTlBBQ0tFWEVfWklQT0JKUyksXA0KLQkJTERGTEFHU19saW51eDo9LWxjLFwNCi0JCUxERkxBR1NfU1VGRklYOj0kKExJQkNYWCksXA0KLQkJTERGTEFHU19TVUZGSVhfc29sYXJpczo9LWxjLFwNCi0JCU9CSkVDVF9ESVI6PSQoSkRLX09VVFBVVERJUikvb2Jqcy91bnBhY2tleGUkKE9VVFBVVF9TVUJESVIpLFwNCi0JCU9VVFBVVF9ESVI6PSQoSkRLX09VVFBVVERJUikvYmluJChPVVRQVVRfU1VCRElSKSxcDQotCQlQUk9HUkFNOj11bnBhY2syMDAsXA0KLQkJVkVSU0lPTklORk9fUkVTT1VSQ0U6PSQoSkRLX1RPUERJUikvc3JjL3dpbmRvd3MvcmVzb3VyY2UvdmVyc2lvbi5yYyxcDQotCQlSQ19GTEFHUzo9JChSQ19GTEFHUylcDQotCQkJICAvRCAiSkRLX0ZOQU1FPXVucGFjazIwMC5leGUiIFwNCi0JCQkgIC9EICJKREtfSU5URVJOQUxfTkFNRT11bnBhY2syMDAiIFwNCi0JCQkgIC9EICJKREtfRlRZUEU9MHgxTCIsXA0KLQkJTUFOSUZFU1Q6PSQoSkRLX1RPUERJUikvc3JjL3dpbmRvd3MvcmVzb3VyY2UvdW5wYWNrMjAwX3Byb3RvLmV4ZS5tYW5pZmVzdCkpDQotDQotaWZuZXEgKCQoVVNFX0VYVEVSTkFMX0xJQlopLCB0cnVlKQ0KLQ0KLSQoQlVJTERfVU5QQUNLRVhFKSA6ICQoVU5QQUNLRVhFX1pJUE9CSlMpDQotDQotZW5kaWYNCi0NCi1CVUlMRF9MQVVOQ0hFUlMgKz0gJChCVUlMRF9VTlBBQ0tFWEUpDQotDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotDQotQlVJTERfSkVYRUMgOj0gDQotQlVJTERfSkVYRUNfU1JDIDo9DQotQlVJTERfSkVYRUNfSU5DIDo9DQotQlVJTERfSkVYRUNfRFNUX0RJUiA6PSAkKEpES19PVVRQVVRESVIpL2xpYiQoT1BFTkpES19UQVJHRVRfQ1BVX0xJQkRJUikNCi0NCi0jDQotIyBVTkhBTkRMRUQ6DQotIyAtIENPTVBJTEVfQVBQUk9BQ0ggPSBub3JtYWwNCi0jDQotDQotIw0KLSMgamRrL21ha2UvamF2YS9NYWtlZmlsZQ0KLSMNCi1pZmVxICgkKE9QRU5KREtfVEFSR0VUX09TKSwgc29sYXJpcykNCi0JaWZlcSAoJChPUEVOSkRLX1RBUkdFVF9DUFVfQklUUyksIDMyKQ0KLQkJQlVJTERfSkVYRUMgOj0gMQ0KLQllbmRpZg0KLWVuZGlmDQotDQotaWZlcSAoJChPUEVOSkRLX1RBUkdFVF9PUyksIGxpbnV4KQ0KLQlCVUlMRF9KRVhFQyA6PSAxDQotZW5kaWYgIyBPUEVOSkRLX1RBUkdFVF9PUw0KLQ0KLSMNCi0jIGpkay9tYWtlL2phdmEvamV4ZWMvTWFrZWZpbGUNCi0jDQotaWZlcSAoJChCVUlMRF9KRVhFQyksIDEpDQotDQotCWlmZXEgKCQoT1BFTkpES19UQVJHRVRfT1MpLHdpbmRvd3MpDQotCWVsc2UgaWZlcSAoJChPUEVOSkRLX1RBUkdFVF9PUyksbWFjb3N4KQ0KLQkJQlVJTERfSkVYRUNfU1JDIDo9ICQoSkRLX1RPUERJUikvc3JjL21hY29zeC9iaW4NCi0JZWxzZQ0KLQkJQlVJTERfSkVYRUNfU1JDIDo9ICQoSkRLX1RPUERJUikvc3JjL3NvbGFyaXMvYmluDQotCWVuZGlmDQotDQotCWlmZXEgKCQoT1BFTkpES19UQVJHRVRfT1MpLCBsaW51eCkNCi0gICAgICAgICAgICAgICAgQlVJTERfSkVYRUNfRFNUX0RJUiA6PSAkKEpES19PVVRQVVRESVIpL2xpYg0KLQkJQlVJTERfSkVYRUNfSU5DICs9IC1JJChKREtfVE9QRElSKS9zcmMvc2hhcmUvYmluDQotCWVuZGlmDQotZW5kaWYNCi0NCi0jDQotIyBOb3RlIHRoYXQgdGhlIHR3byBNYWtlZmlsZSdzIHNlZW1zIHRvIGNvbnRyYWRpY3QgZWFjaCBvdGhlciwNCi0jICAgYW5kIHRoYXQgc3JjL21hY29zeC9iaW4vamV4ZWMuYyBzZWVtcyB1bnVzZWQNCi0jDQotaWZuZXEgKCQoQlVJTERfSkVYRUNfU1JDKSwpDQotICAgICAgICAkKGV2YWwgJChjYWxsIFNldHVwTmF0aXZlQ29tcGlsYXRpb24sQlVJTERfSkVYRUMsXA0KLQkJU1JDOj0kKEJVSUxEX0pFWEVDX1NSQyksXA0KLQkJSU5DTFVERV9GSUxFUzo9amV4ZWMuYyxcDQotCQlMQU5HOj1DLFwNCi0JCU9QVElNSVpBVElPTiA6PSBMT1csIFwNCi0JCUNGTEFHUzo9JChDRkxBR1NfSkRLRVhFKVwNCi0gICAgICAgICAgICAgICAgICAgICAgICAkKEJVSUxEX0pFWEVDX0lOQyksIFwNCi0JCUNGTEFHU19saW51eDo9LWZQSUMsXA0KLQkJQ0ZMQUdTX3NvbGFyaXM6PS1LUElDLFwNCi0JCUxERkxBR1M6PSQoTERGTEFHU19KREtFWEUpIFwNCi0JCQkgJChjYWxsIFNFVF9TSEFSRURfTElCUkFSWV9OQU1FLCQoTElCUkFSWV9QUkVGSVgpJChTSEFSRURfTElCUkFSWV9TVUZGSVgpKSwgXA0KLQkJT0JKRUNUX0RJUjo9JChKREtfT1VUUFVURElSKS9vYmpzL2pleGVjX29iaixcDQotCQlPVVRQVVRfRElSOj0kKEJVSUxEX0pFWEVDX0RTVF9ESVIpLFwNCi0JCVBST0dSQU06PWpleGVjKSkNCi0NCi0JQlVJTERfTEFVTkNIRVJTICs9ICQoQlVJTERfSkVYRUMpDQotZW5kaWYNCi0NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0NCi0jDQotIyBUaGUgamF2YS1ybWkuY2dpIHNjcmlwdCBpbiBiaW4vIG9ubHkgZ2V0cyBkZWxpdmVyZWQgaW4gY2VydGFpbiBzaXR1YXRpb25zDQotIw0KLUpBVkFfUk1JX0NHSTo9JChKREtfT1VUUFVURElSKS9iaW4kKE9VVFBVVF9TVUJESVIpL2phdmEtcm1pLmNnaQ0KLWlmZXEgKCQoT1BFTkpES19UQVJHRVRfT1MpLCBsaW51eCkNCi0gIEJVSUxEX0xBVU5DSEVSUyArPSAkKEpBVkFfUk1JX0NHSSkNCi1lbmRpZg0KLWlmZXEgKCQoT1BFTkpES19UQVJHRVRfT1MpLCBzb2xhcmlzKQ0KLSAgaWZlcSAoJChPUEVOSkRLX1RBUkdFVF9DUFVfQklUUyksIDMyKQ0KLSAgICBCVUlMRF9MQVVOQ0hFUlMgKz0gJChKQVZBX1JNSV9DR0kpDQotICBlbmRpZg0KLWVuZGlmDQotDQotIyBUT0RPOiANCi0jIE9uIHdpbmRvd3MgamF2YS1ybWkuY2dpIHNob3VsZG4ndCBiZSBidW5kbGVkIHNpbmNlIEphdmEgMS4yLCBidXQgaGFzIGJlZW4gYnVpbHQgYWxsDQotIyB0aGlzIHRpbWUgYW55d2F5LiBTaW5jZSBqZGs2LCBpdCBoYXMgYmVlbiBidWlsdCBmcm9tIHRoZSB3cm9uZyBzb3VyY2UgYW5kIHJlc3VsdGVkDQotIyBpbiBhIGNvcHkgb2YgdGhlIHN0YW5kYXJkIGphdmEgbGF1bmNoZXIgbmFtZWQgImphdmEtcm1pLmV4ZSIgZW5kaW5nIHVwIGluIHRoZSBmaW5hbA0KLSMgaW1hZ2VzIGJpbiBkaXIuIFRoaXMgd2VpcmQgYmVoYXZpb3IgaXMgbWltaWNrZWQgaGVyZSBpbiB0aGUgY29udmVydGVkIG1ha2VmaWxlcyBmb3INCi0jIG5vdy4gU2hvdWxkIHByb2JhYmx5IGp1c3QgYmUgZGVsZXRlZC4NCi0jIGh0dHA6Ly9idWdzLnN1bi5jb20vYnVnZGF0YWJhc2Uvdmlld19idWcuZG8/YnVnX2lkPTY1MTIwNTINCi1pZmVxICgkKE9QRU5KREtfVEFSR0VUX09TKSx3aW5kb3dzKQ0KLSAgICAkKGV2YWwgJChjYWxsIFNldHVwTGF1bmNoZXIsamF2YS1ybWksXA0KLSAgICAgICAgLURFWFBBTkRfQ0xBU1NQQVRIX1dJTERDQVJEUyxcDQotICAgICAgICAkKGNhbGwgU0VUX1NIQVJFRF9MSUJSQVJZX01BUEZJTEUsJChKREtfVE9QRElSKS9tYWtlZmlsZXMvamF2YS9tYWluL2phdmEvbWFwZmlsZS0kKE9QRU5KREtfVEFSR0VUX0NQVSkpKSkNCi1lbHNlDQotICAgICQoSkFWQV9STUlfQ0dJKTogJChKREtfVE9QRElSKS9zcmMvc29sYXJpcy9iaW4vamF2YS1ybWkuY2dpLnNoDQotCSQoTUtESVIpIC1wICQoQEQpDQotCSQoQ1ApICQ8ICRADQotCSQoQ0hNT0QpIGEreCAkQA0KLWVuZGlmDQotDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotJChCVUlMRF9MQVVOQ0hFUlMpIDogJChKREtfVE9QRElSKS9tYWtlZmlsZXMvQ29tcGlsZUxhdW5jaGVycy5nbWsNCi0NCi1hbGw6ICQoQlVJTERfTEFVTkNIRVJTKQ0KLQ0KLS5QSE9OWTogYWxsDQorIworIyBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyMKKyMgVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzCisjIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyMgYnkgT3JhY2xlIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisjCisjIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyMgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisjIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyMgMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisjCisjIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCisjIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKKyMgcXVlc3Rpb25zLgorIworCitkZWZhbHQ6IGFsbAorCitpbmNsdWRlICQoU1BFQykKK2luY2x1ZGUgTWFrZUJhc2UuZ21rCitpbmNsdWRlIE5hdGl2ZUNvbXBpbGF0aW9uLmdtaworCisjIFNldHVwIHRoZSBqYXZhIGNvbXBpbGVycyBmb3IgdGhlIEpESyBidWlsZC4KK2luY2x1ZGUgU2V0dXAuZ21rCisKKyMgQnVpbGQgdG9vbHMKK2luY2x1ZGUgVG9vbHMuZ21rCisKK0JVSUxEX0xBVU5DSEVSUz0KKworIyBXaGVuIGJ1aWxkaW5nIGEgbGVnYWN5IG92ZXJsYXkgaW1hZ2UgKG9uIHNvbGFyaXMgNjQgYml0KSwgdGhlIGxhdW5jaGVycyAKKyMgbmVlZCB0byBiZSBidWlsdCB3aXRoIGEgZGlmZmVyZW50IHJwYXRoIGFuZCBhIGRpZmZlcmVudCBvdXRwdXQgZGlyLgoraWZlcSAoJChPVkVSTEFZX0lNQUdFUyksdHJ1ZSkKKyAgICBPUklHSU5fUk9PVDo9Ly4uLy4uCisgICAgT1VUUFVUX1NVQkRJUjo9JChPUEVOSkRLX1RBUkdFVF9DUFVfSVNBRElSKQorZWxzZQorICAgIE9SSUdJTl9ST09UOj0vLi4KK2VuZGlmCisKK2lmZXEgKCQoT1BFTkpES19UQVJHRVRfT1MpLCBtYWNvc3gpCisgICAgT1JJR0lOX0FSRzo9JChjYWxsIFNFVF9FWEVDVVRBQkxFX09SSUdJTikKK2Vsc2UKKyAgICBPUklHSU5fQVJHOj0kKGNhbGwgU0VUX0VYRUNVVEFCTEVfT1JJR0lOLCQoT1JJR0lOX1JPT1QpL2xpYiQoT1BFTkpES19UQVJHRVRfQ1BVX0xJQkRJUikvamxpKSBcCisgICAgICAgICAgICAgICAgJChjYWxsIFNFVF9FWEVDVVRBQkxFX09SSUdJTiwkKE9SSUdJTl9ST09UKS9qcmUvbGliJChPUEVOSkRLX1RBUkdFVF9DUFVfTElCRElSKS9qbGkpCitlbmRpZgorCisjCisjIEFwcGxpY2F0aW9ucyBleHBlY3QgdG8gYmUgYWJsZSB0byBsaW5rIGFnYWluc3QgbGliamF3dCB3aXRob3V0IGludm9raW5nCisjIFN5c3RlbS5sb2FkTGlicmFyeSgiamF3dCIpIGZpcnN0LiBUaGlzIHdhcyB0aGUgYmVoYXZpb3VyIGRlc2NyaWJlZCBpbiB0aGUKKyMgZGV2bG9wZXIgZG9jdW1lbnRhdGlvbiBvZiBKQVdUIGFuZCB3aGF0IHdvcmtlZCB3aXRoIE9wZW5KREs2LgorIworaWZuZXEgKCQoZmluZHN0cmluZyAkKE9QRU5KREtfVEFSR0VUX09TKSwgbGludXggc29sYXJpcyksKQorICAgIE9SSUdJTl9BUkcrPSQoY2FsbCBTRVRfRVhFQ1VUQUJMRV9PUklHSU4sJChPUklHSU5fUk9PVCkvbGliJChPUEVOSkRLX1RBUkdFVF9DUFVfTElCRElSKSkgXAorICAgICAgICAgICAgICAgICQoY2FsbCBTRVRfRVhFQ1VUQUJMRV9PUklHSU4sJChPUklHSU5fUk9PVCkvanJlL2xpYiQoT1BFTkpES19UQVJHRVRfQ1BVX0xJQkRJUikpIAorZW5kaWYKKworZGVmaW5lIFNldHVwTGF1bmNoZXIKKyAgICAjIFRPRE86IEZpeCBtYXBmaWxlIG9uIHNvbGFyaXMuIFdvbid0IHdvcmsgd2l0aCBsZCBhcyBsaW5rZXIuCisgICAgIyBQYXJhbWV0ZXIgMSBpcyB0aGUgbmFtZSBvZiB0aGUgbGF1bmNoZXIgKGphdmEsamF2YWMsamFyLi4uKQorICAgICMgUGFyYW1ldGVyIDIgaXMgZXh0cmEgQ0ZMQUdTCisgICAgIyBQYXJhbWV0ZXIgMyBpcyBleHRyYSBMREZMQUdTCisgICAgIyBQYXJhbWV0ZXIgNCBpcyBleHRyYSBMREZMQUdTX1NVRkZJWF9wb3NpeAorICAgICMgUGFyYW1ldGVyIDUgaXMgZXh0cmEgTERGTEFHU19TVUZGSVhfd2luZG93cworICAgICMgUGFyYW1ldGVyIDYgaXMgb3B0aW9uYWwgV2luZG93cyBKTEkgbGlicmFyeSAoZnVsbCBwYXRoKQorICAgICMgUGFyYW1ldGVyIDcgaXMgb3B0aW9uYWwgV2luZG93cyByZXNvdXJjZSAoUkMpIGZsYWdzCisgICAgIyBQYXJhbWV0ZXIgOCBpcyBvcHRpb25hbCBXaW5kb3dzIHZlcnNpb24gcmVzb3VyY2UgZmlsZSAoLnJjKQorICAgICMgUGFyYW1ldGVyIDkgIGlzIGRpZmZlcmVudCBvdXRwdXQgZGlyCisgICAgIyBQYXJhbWV0ZXIgMTAgaWYgc2V0LCBsaW5rIHN0YXRpY2FsbHkgd2l0aCBjIHJ1bnRpbWUgb24gd2luZG93cy4KKyAgICAjIFBhcmFtZXRlciAxMSBpZiBzZXQsIG92ZXJyaWRlIHBsaXN0IGZpbGUgb24gbWFjb3N4LgorCisgICAgJDFfV0lORE9XU19KTElfTElCOj0kKEpES19PVVRQVVRESVIpL29ianMvbGliamxpL2psaS5saWIKKyAgICBpZm5lcSAoJDYsKQorICAgICAgICAkMV9XSU5ET1dTX0pMSV9MSUI6PSQ2CisgICAgZW5kaWYKKyAgICAkMV9WRVJTSU9OX0lORk9fUkVTT1VSQ0U6PSQoSkRLX1RPUERJUikvc3JjL3dpbmRvd3MvcmVzb3VyY2UvdmVyc2lvbi5yYworICAgIGlmbmVxICgkOCwpCisgICAgICAgICQxX1ZFUlNJT05fSU5GT19SRVNPVVJDRTo9JDgKKyAgICBlbmRpZgorCisgICAgJDFfTERGTEFHUyA6PSAkMworICAgICQxX0xERkxBR1NfU1VGRklYIDo9CisgICAgaWZlcSAoJChPUEVOSkRLX1RBUkdFVF9PUyksIG1hY29zeCkKKyAgICAgICAgJDFfUExJU1RfRklMRTo9SW5mby1jbWRsaW5lLnBsaXN0CisgICAgICAgIGlmbmVxICgkKDExKSwpCisgICAgICAgICAgICAkMV9QTElTVF9GSUxFOj0kKDExKQorICAgICAgICBlbmRpZgorCisgICAgICAgICQxX0xERkxBR1MgKz0gLVdsLC1hbGxfbG9hZCAkKEpES19PVVRQVVRESVIpL29ianMvbGliamxpX3N0YXRpYy5hIFwKKyAgICAgICAgICAgICAgICAgICAgICAtZnJhbWV3b3JrIENvY29hIC1mcmFtZXdvcmsgU2VjdXJpdHkgLWZyYW1ld29yayBBcHBsaWNhdGlvblNlcnZpY2VzIFwKKyAgICAgICAgICAgICAgICAgICAgICAtc2VjdGNyZWF0ZSBfX1RFWFQgX19pbmZvX3BsaXN0ICQoSkRLX1RPUERJUikvc3JjL21hY29zeC9saWIvJCQoJDFfUExJU1RfRklMRSkKKyAgICAgICAgJDFfTERGTEFHU19TVUZGSVggKz0gLXB0aHJlYWQKKyAgICBlbmRpZgorCisgICAgaWZlcSAoJChVU0VfRVhURVJOQUxfTElCWiksIHRydWUpCisgICAgICAgICQxX0xERkxBR1NfU1VGRklYICs9IC1segorICAgIGVuZGlmCisKKyAgICAkMV9PVVRQVVRfRElSX0FSRzo9JDkKKyAgICBpZmVxICgsJCQoJDFfT1VUUFVUX0RJUl9BUkcpKQorICAgICAgICAkMV9PVVRQVVRfRElSX0FSRzo9JChKREtfT1VUUFVURElSKS9iaW4KKyAgICBlbmRpZgorCisgICAgIyBUT0RPOiBtYXliZSBpdCdzIGJldHRlciB0byBtb3ZlIHRoaXMgaWYtc3RhdGVtZW50IG91dCBvZiB0aGlzIGZ1bmN0aW9uCisgICAgaWZlcSAoJDEsamF2YSkKKyAgICAgICAgJDFfT1BUSU1JWkFUSU9OX0FSRzo9SElHSAorCSQxX0xERkxBR1Nfc29sYXJpczo9LVIkKE9QRU5XSU5fSE9NRSkvbGliJChPUEVOSkRLX1RBUkdFVF9DUFVfSVNBRElSKQorICAgIGVsc2UKKyAgICAgICAgJDFfT1BUSU1JWkFUSU9OX0FSRzo9TE9XCisgICAgZW5kaWYKKworICAgICQxX0NGTEFHUzo9JChDRkxBR1NfSkRLRVhFKQorICAgIGlmZXEgKCQoMTApLHRydWUpCisgICAgICAgICQxX0NGTEFHUzo9JChmaWx0ZXItb3V0IC1NRCwkKENGTEFHU19KREtFWEUpKQorICAgIGVuZGlmCisKKyAgICBpZm5lcSAoJCh3aWxkY2FyZCAkKEpES19UT1BESVIpL21ha2VmaWxlcy9tYXBmaWxlcy9sYXVuY2hlcnMvbWFwZmlsZS0kKE9QRU5KREtfVEFSR0VUX0NQVSkpLCkKKyAgICAgICAgJDFfTUFQRklMRTo9JChKREtfVE9QRElSKS9tYWtlZmlsZXMvbWFwZmlsZXMvbGF1bmNoZXJzL21hcGZpbGUtJChPUEVOSkRLX1RBUkdFVF9DUFUpCisgICAgZWxzZQorICAgICAgICAkMV9NQVBGSUxFOj0KKyAgICBlbmRpZgorCisgICAgJChjYWxsIFNldHVwTmF0aXZlQ29tcGlsYXRpb24sQlVJTERfTEFVTkNIRVJfJDEsXAorCVNSQzo9JChKREtfVE9QRElSKS9zcmMvc2hhcmUvYmluLFwKKwlJTkNMVURFX0ZJTEVTOj1tYWluLmMsXAorCUxBTkc6PUMsXAorCU9QVElNSVpBVElPTjo9JCQoJDFfT1BUSU1JWkFUSU9OX0FSRyksIFwKKwlDRkxBR1M6PSQkKCQxX0NGTEFHUykgXAorCQktSSQoSkRLX1RPUERJUikvc3JjL3NoYXJlL2JpbiBcCisJCS1JJChKREtfVE9QRElSKS9zcmMvJChPUEVOSkRLX1RBUkdFVF9PU19BUElfRElSKS9iaW4gXAorCQktSSQoSkRLX1RPUERJUikvc3JjLyQoT1BFTkpES19UQVJHRVRfT1MpL2JpbiBcCisgICAgICAgICAgICAgICAgLURGVUxMX1ZFUlNJT049JyIkKEZVTExfVkVSU0lPTikiJyBcCisgICAgICAgICAgICAgICAgLURKREtfTUFKT1JfVkVSU0lPTj0nIiQoSkRLX01BSk9SX1ZFUlNJT04pIicgXAorICAgICAgICAgICAgICAgIC1ESkRLX01JTk9SX1ZFUlNJT049JyIkKEpES19NSU5PUl9WRVJTSU9OKSInIFwKKwkJLURMSUJBUkNITkFNRT0nIiQoT1BFTkpES19UQVJHRVRfQ1BVX0xFR0FDWSkiJyBcCisJCS1ETEFVTkNIRVJfTkFNRT0nIiQoTEFVTkNIRVJfTkFNRSkiJyBcCisJCS1EUFJPR05BTUU9JyIkMSInICQoRFBBQ0tBR0VQQVRIKSBcCisJCSQyLFwKKwlDRkxBR1NfbGludXg6PS1mUElDLFwKKyAgICAgICAgQ0ZMQUdTX3NvbGFyaXM6PS1LUElDIC1ESEFWRV9HRVRIUlRJTUUsXAorCUxERkxBR1M6PSQoTERGTEFHU19KREtFWEUpIFwKKyAgICAgICAgICAgICAgICAgJChPUklHSU5fQVJHKSBcCisJCSAkJCgkMV9MREZMQUdTKSxcCisJTERGTEFHU19tYWNvc3g6PSQoY2FsbCBTRVRfU0hBUkVEX0xJQlJBUllfTkFNRSwkMSksXAorCUxERkxBR1NfbGludXg6PS1scHRocmVhZCBcCisgICAgICAgICAgICAgICAgICAgICAgICQoY2FsbCBTRVRfU0hBUkVEX0xJQlJBUllfTkFNRSwkKExJQlJBUllfUFJFRklYKSQoU0hBUkVEX0xJQlJBUllfU1VGRklYKSksXAorCUxERkxBR1Nfc29sYXJpczo9JCQoJDFfTERGTEFHU19zb2xhcmlzKSBcCisgICAgICAgICAgICAgICAgICAgICAgICQoY2FsbCBTRVRfU0hBUkVEX0xJQlJBUllfTkFNRSwkKExJQlJBUllfUFJFRklYKSQoU0hBUkVEX0xJQlJBUllfU1VGRklYKSksXAorCU1BUEZJTEUgOj0gJCQoJDFfTUFQRklMRSksIFwKKyAgICAgICAgTERGTEFHU19TVUZGSVg6PSQoTERGTEFHU19KREtFWEVfU1VGRklYKSAkJCgkMV9MREZMQUdTX1NVRkZJWCksXAorCUxERkxBR1NfU1VGRklYX3Bvc2l4Oj0kNCxcCisJTERGTEFHU19TVUZGSVhfd2luZG93czo9JCQoJDFfV0lORE9XU19KTElfTElCKSBcCisJCQkgICAgICAgJChKREtfT1VUUFVURElSKS9vYmpzL2xpYmphdmEvamF2YS5saWIgYWR2YXBpMzIubGliICQ1LFwKKwlMREZMQUdTX1NVRkZJWF9saW51eDo9LUwkKEpES19PVVRQVVRESVIpL2xpYiQoT1BFTkpES19UQVJHRVRfQ1BVX0xJQkRJUikvamxpIC1samxpICQoTElCREwpIC1sYywgXAorCUxERkxBR1NfU1VGRklYX3NvbGFyaXM6PS1MJChKREtfT1VUUFVURElSKS9saWIkKE9QRU5KREtfVEFSR0VUX0NQVV9MSUJESVIpL2psaSAtbGpsaSAtbHRocmVhZCAkKExJQkRMKSAtbGMsIFwKKwlPQkpFQ1RfRElSOj0kKEpES19PVVRQVVRESVIpL29ianMvJDFfb2JqcyQoT1VUUFVUX1NVQkRJUiksXAorCU9VVFBVVF9ESVI6PSQkKCQxX09VVFBVVF9ESVJfQVJHKSQoT1VUUFVUX1NVQkRJUiksXAorCVBST0dSQU06PSQxLFwKKwlERUJVR19TWU1CT0xTOj10cnVlLFwKKwlWRVJTSU9OSU5GT19SRVNPVVJDRTo9JCQoJDFfVkVSU0lPTl9JTkZPX1JFU09VUkNFKSxcCisJUkNfRkxBR1M6PSQoUkNfRkxBR1MpXAorCQkgIC1EICJKREtfRk5BTUU9JDEkKEVYRV9TVUZGSVgpIiBcCisJCSAgLUQgIkpES19JTlRFUk5BTF9OQU1FPSQxIiBcCisJCSAgLUQgIkpES19GVFlQRT0weDFMIiBcCisJCSAgJDcsXAorCU1BTklGRVNUOj0kKEpES19UT1BESVIpL3NyYy93aW5kb3dzL3Jlc291cmNlL2phdmEubWFuaWZlc3QpCisKKyAgICBCVUlMRF9MQVVOQ0hFUlMgKz0gJCQoQlVJTERfTEFVTkNIRVJfJDEpCisKKyAgICBpZmVxICgkKE9QRU5KREtfVEFSR0VUX09TKSxtYWNvc3gpCisgICAgICAgICQkKEJVSUxEX0xBVU5DSEVSXyQxKSA6ICQoSkRLX09VVFBVVERJUikvb2Jqcy9saWJqbGlfc3RhdGljLmEKKyAgICBlbmRpZgorCisgICAgaWZlcSAoJChPUEVOSkRLX1RBUkdFVF9PUyksd2luZG93cykKKyAgICAgICAgJCQoQlVJTERfTEFVTkNIRVJfJDEpIDogJChKREtfT1VUUFVURElSKS9vYmpzL2xpYmphdmEvamF2YS5saWIgXAorCQkJCSQkKCQxX1dJTkRPV1NfSkxJX0xJQikKKyAgICBlbmRpZiAgICAJIAorZW5kZWYKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK1hMSUJTOj0kKFhfTElCUykgLWxYMTEKK2lmZXEgKCQoT1BFTkpES19UQVJHRVRfT1MpLG1hY29zeCkKKyAgICBEUEFDS0FHRVBBVEg6PS1EUEFDS0FHRV9QQVRIPSciJChQQUNLQUdFX1BBVEgpIicKKyAgICBYTElCUzo9CitlbmRpZgorCitpZmRlZiBPUEVOSkRLCisgICAgSkFWQV9SQ19GTEFHUyArPSAtaSAiJChKREtfVE9QRElSKS9zcmMvd2luZG93cy9yZXNvdXJjZS9pY29ucyIKK2Vsc2UKKyAgICBKQVZBX1JDX0ZMQUdTICs9IC1pICIkKEpES19UT1BESVIpL3NyYy9jbG9zZWQvd2luZG93cy9uYXRpdmUvc3VuL3dpbmRvd3MiCitlbmRpZgorCisjIE9uIHdpbmRvd3MsIHRoZSBkZWJ1Z2luZm8gZmlsZXMgZ2V0IHRoZSBzYW1lIG5hbWUgYXMgZm9yIGphdmEuZGxsLiBCdWlsZAorIyBpbnRvIGFub3RoZXIgZGlyIGFuZCBjb3B5IHNlbGVjdGl2ZWx5IHNvIGRlYnVnaW5mbyBmb3IgamF2YS5kbGwgaXNuJ3QKKyMgb3ZlcndyaXR0ZW4uCiskKGV2YWwgJChjYWxsIFNldHVwTGF1bmNoZXIsamF2YSxcCisgICAgLURFWFBBTkRfQ0xBU1NQQVRIX1dJTERDQVJEUywsLHVzZXIzMi5saWIgY29tY3RsMzIubGliLFwKKyAgICAkKEpES19PVVRQVVRESVIpL29ianMvamxpX3N0YXRpYy5saWIsJChKQVZBX1JDX0ZMQUdTKSxcCisgICAgJChKREtfVE9QRElSKS9zcmMvd2luZG93cy9yZXNvdXJjZS9qYXZhLnJjLCQoSkRLX09VVFBVVERJUikvb2Jqcy9qYXZhX29ianMsdHJ1ZSkpCisKKyQoSkRLX09VVFBVVERJUikvYmluJChPVVRQVVRfU1VCRElSKS9qYXZhJChFWEVfU1VGRklYKTogJChCVUlMRF9MQVVOQ0hFUl9qYXZhKQorCSQoTUtESVIpIC1wICQoQEQpCisJJChSTSkgJEAKKwkkKENQKSAkKEpES19PVVRQVVRESVIpL29ianMvamF2YV9vYmpzJChPVVRQVVRfU1VCRElSKS9qYXZhJChFWEVfU1VGRklYKSAkQAorCitCVUlMRF9MQVVOQ0hFUlMgKz0gJChKREtfT1VUUFVURElSKS9iaW4kKE9VVFBVVF9TVUJESVIpL2phdmEkKEVYRV9TVUZGSVgpCisKK2lmZXEgKCQoT1BFTkpES19UQVJHRVRfT1MpLHdpbmRvd3MpCisgICAgJChldmFsICQoY2FsbCBTZXR1cExhdW5jaGVyLGphdmF3LFwKKyAgICAgICAgLURKQVZBVyAtREVYUEFORF9DTEFTU1BBVEhfV0lMRENBUkRTLCwsdXNlcjMyLmxpYiBjb21jdGwzMi5saWIsXAorICAgICAgICAkKEpES19PVVRQVVRESVIpL29ianMvamxpX3N0YXRpYy5saWIsJChKQVZBX1JDX0ZMQUdTKSxcCisgICAgICAgICQoSkRLX1RPUERJUikvc3JjL3dpbmRvd3MvcmVzb3VyY2UvamF2YS5yYywsdHJ1ZSkpCitlbmRpZgorCisKK2lmbmRlZiBCVUlMRF9IRUFETEVTU19PTkxZCiskKGV2YWwgJChjYWxsIFNldHVwTGF1bmNoZXIsYXBwbGV0dmlld2VyLFwKKyAgICAtREpBVkFfQVJHUz0neyAiLUotbXM4bSIkKENPTU1BKSAic3VuLmFwcGxldC5NYWluIiQoQ09NTUEpIH0nLCxcCisgICAgJChYTElCUykpKQorZW5kaWYKKworJChldmFsICQoY2FsbCBTZXR1cExhdW5jaGVyLGV4dGNoZWNrLFwKKyAgICAtREpBVkFfQVJHUz0neyAiLUotbXM4bSIkKENPTU1BKSAiY29tLnN1bi50b29scy5leHRjaGVjay5NYWluIiQoQ09NTUEpIH0nKSkKKworJChldmFsICQoY2FsbCBTZXR1cExhdW5jaGVyLGlkbGosXAorICAgIC1ESkFWQV9BUkdTPSd7ICItSi1tczhtIiQoQ09NTUEpICJjb20uc3VuLnRvb2xzLmNvcmJhLnNlLmlkbC50b0phdmFQb3J0YWJsZS5Db21waWxlIiQoQ09NTUEpIH0nKSkKKworJChldmFsICQoY2FsbCBTZXR1cExhdW5jaGVyLGphcixcCisgICAgLURKQVZBX0FSR1M9J3sgIi1KLW1zOG0iJChDT01NQSkgInN1bi50b29scy5qYXIuTWFpbiIkKENPTU1BKSB9JykpCisKKyQoZXZhbCAkKGNhbGwgU2V0dXBMYXVuY2hlcixqYXJzaWduZXIsXAorICAgIC1ESkFWQV9BUkdTPSd7ICItSi1tczhtIiQoQ09NTUEpICJzdW4uc2VjdXJpdHkudG9vbHMuamFyU2lnbmVyLk1haW4iJChDT01NQSkgfScpKQorCiskKGV2YWwgJChjYWxsIFNldHVwTGF1bmNoZXIsamF2YWMsXAorICAgIC1ERVhQQU5EX0NMQVNTUEFUSF9XSUxEQ0FSRFMgXAorICAgIC1ETkVWRVJfQUNUX0FTX1NFUlZFUl9DTEFTU19NQUNISU5FIFwKKyAgICAtREpBVkFfQVJHUz0neyAiLUotbXM4bSIkKENPTU1BKSAiY29tLnN1bi50b29scy5qYXZhYy5NYWluIiQoQ09NTUEpIH0nKSkKKworaWZlcSAoJChFTkFCTEVfU0pBVkFDKSx5ZXMpCiskKGV2YWwgJChjYWxsIFNldHVwTGF1bmNoZXIsc2phdmFjLFwKKyAgICAtREVYUEFORF9DTEFTU1BBVEhfV0lMRENBUkRTIFwKKyAgICAtRE5FVkVSX0FDVF9BU19TRVJWRVJfQ0xBU1NfTUFDSElORSBcCisgICAgLURKQVZBX0FSR1M9J3sgIi1KLW1zOG0iJChDT01NQSkgImNvbS5zdW4udG9vbHMuc2phdmFjLk1haW4iJChDT01NQSkgfScpKQorZW5kaWYKKworJChldmFsICQoY2FsbCBTZXR1cExhdW5jaGVyLGphdmFkb2MsXAorICAgIC1ERVhQQU5EX0NMQVNTUEFUSF9XSUxEQ0FSRFMgXAorICAgIC1ETkVWRVJfQUNUX0FTX1NFUlZFUl9DTEFTU19NQUNISU5FIFwKKyAgICAtREpBVkFfQVJHUz0neyAiLUotbXM4bSIkKENPTU1BKSAiY29tLnN1bi50b29scy5qYXZhZG9jLk1haW4iJChDT01NQSkgfScpKQorCiskKGV2YWwgJChjYWxsIFNldHVwTGF1bmNoZXIsamF2YWgsXAorICAgIC1ERVhQQU5EX0NMQVNTUEFUSF9XSUxEQ0FSRFMgXAorICAgIC1ETkVWRVJfQUNUX0FTX1NFUlZFUl9DTEFTU19NQUNISU5FIFwKKyAgICAtREpBVkFfQVJHUz0neyAiLUotbXM4bSIkKENPTU1BKSAiY29tLnN1bi50b29scy5qYXZhaC5NYWluIiQoQ09NTUEpIH0nKSkKKworJChldmFsICQoY2FsbCBTZXR1cExhdW5jaGVyLGphdmFwLFwKKyAgICAtREVYUEFORF9DTEFTU1BBVEhfV0lMRENBUkRTIFwKKyAgICAtRE5FVkVSX0FDVF9BU19TRVJWRVJfQ0xBU1NfTUFDSElORSBcCisgICAgLURKQVZBX0FSR1M9J3sgIi1KLW1zOG0iJChDT01NQSkgImNvbS5zdW4udG9vbHMuamF2YXAuTWFpbiIkKENPTU1BKSB9JykpCisKK0JVSUxEX0xBVU5DSEVSX2pjb25zb2xlX0NGTEFHU193aW5kb3dzOj0tREpBVkFXCitCVUlMRF9MQVVOQ0hFUl9qY29uc29sZV9MREZMQUdTX3dpbmRvd3M6PXVzZXIzMi5saWIKKworJChldmFsICQoY2FsbCBTZXR1cExhdW5jaGVyLGpjb25zb2xlLFwKKyAgICAtREpBVkFfQVJHUz0neyAiLUotbXM4bSIkKENPTU1BKSAiLUotRGpjb25zb2xlLnNob3dPdXRwdXRWaWV3ZXIiJChDT01NQSkgInN1bi50b29scy5qY29uc29sZS5KQ29uc29sZSIkKENPTU1BKSB9JyBcCisgICAgLURBUFBfQ0xBU1NQQVRIPSd7ICIvbGliL2pjb25zb2xlLmphciIkKENPTU1BKSAiL2xpYi90b29scy5qYXIiJChDT01NQSkgIi9jbGFzc2VzIiB9JykpCisKKyQoZXZhbCAkKGNhbGwgU2V0dXBMYXVuY2hlcixqZGIsXAorICAgIC1ESkFWQV9BUkdTPSd7ICItSi1tczhtIiQoQ09NTUEpICJjb20uc3VuLnRvb2xzLmV4YW1wbGUuZGVidWcudHR5LlRUWSIkKENPTU1BKSB9JyBcCisgICAgLURBUFBfQ0xBU1NQQVRIPSd7ICIvbGliL3Rvb2xzLmphciIkKENPTU1BKSAiL2xpYi9zYS1qZGkuamFyIiQoQ09NTUEpICIvY2xhc3NlcyIgfScpKQorCiskKGV2YWwgJChjYWxsIFNldHVwTGF1bmNoZXIsamhhdCxcCisgICAgLURKQVZBX0FSR1M9J3sgIi1KLW1zOG0iJChDT01NQSkgImNvbS5zdW4udG9vbHMuaGF0Lk1haW4iJChDT01NQSkgfScpKQorCiskKGV2YWwgJChjYWxsIFNldHVwTGF1bmNoZXIsamluZm8sXAorICAgIC1ESkFWQV9BUkdTPSd7ICItSi1tczhtIiQoQ09NTUEpIFwKKwkJICAgIi1KLURzdW4uanZtLmhvdHNwb3QuZGVidWdnZXIudXNlUHJvY0RlYnVnZ2VyIiQoQ09NTUEpIFwKKwkJICAgIi1KLURzdW4uanZtLmhvdHNwb3QuZGVidWdnZXIudXNlV2luZGJnRGVidWdnZXIiJChDT01NQSkgXAorCQkgICAic3VuLnRvb2xzLmppbmZvLkpJbmZvIiQoQ09NTUEpIH0nIFwKKyAgICAtREFQUF9DTEFTU1BBVEg9J3sgIi9saWIvdG9vbHMuamFyIiQoQ09NTUEpICIvbGliL3NhLWpkaS5qYXIiJChDT01NQSkgIi9jbGFzc2VzIiB9JyBcCisgICAgLCwsLCwsLCwsSW5mby1wcml2aWxlZ2VkLnBsaXN0KSkKKworJChldmFsICQoY2FsbCBTZXR1cExhdW5jaGVyLGptYXAsXAorICAgIC1ESkFWQV9BUkdTPSd7ICItSi1tczhtIiQoQ09NTUEpIFwKKwkJICAgIi1KLURzdW4uanZtLmhvdHNwb3QuZGVidWdnZXIudXNlUHJvY0RlYnVnZ2VyIiQoQ09NTUEpIFwKKwkJICAgIi1KLURzdW4uanZtLmhvdHNwb3QuZGVidWdnZXIudXNlV2luZGJnRGVidWdnZXIiJChDT01NQSkgXAorCQkgICAic3VuLnRvb2xzLmptYXAuSk1hcCIkKENPTU1BKSB9JyBcCisgICAgLURBUFBfQ0xBU1NQQVRIPSd7ICIvbGliL3Rvb2xzLmphciIkKENPTU1BKSAiL2xpYi9zYS1qZGkuamFyIiQoQ09NTUEpICIvY2xhc3NlcyIgfScgXAorICAgICwsLCwsLCwsLEluZm8tcHJpdmlsZWdlZC5wbGlzdCkpCisKKyQoZXZhbCAkKGNhbGwgU2V0dXBMYXVuY2hlcixqcHMsXAorICAgIC1ESkFWQV9BUkdTPSd7ICItSi1tczhtIiQoQ09NTUEpICJzdW4udG9vbHMuanBzLkpwcyIkKENPTU1BKSB9JykpCisKKyQoZXZhbCAkKGNhbGwgU2V0dXBMYXVuY2hlcixqcnVuc2NyaXB0LFwKKyAgICAtREpBVkFfQVJHUz0neyAiLUotbXM4bSIkKENPTU1BKSAiY29tLnN1bi50b29scy5zY3JpcHQuc2hlbGwuTWFpbiIkKENPTU1BKSB9JykpCisKKyQoZXZhbCAkKGNhbGwgU2V0dXBMYXVuY2hlcixqc2FkZWJ1Z2QsXAorICAgIC1ESkFWQV9BUkdTPSd7ICItSi1tczhtIiQoQ09NTUEpICJzdW4uanZtLmhvdHNwb3QuamRpLlNBRGVidWdTZXJ2ZXIiJChDT01NQSkgfScgXAorICAgIC1EQVBQX0NMQVNTUEFUSD0neyAiL2xpYi90b29scy5qYXIiJChDT01NQSkgIi9saWIvc2EtamRpLmphciIkKENPTU1BKSAiL2NsYXNzZXMiIH0nIFwKKyAgICAsLCwsLCwsLCxJbmZvLXByaXZpbGVnZWQucGxpc3QpKQorCiskKGV2YWwgJChjYWxsIFNldHVwTGF1bmNoZXIsanN0YWNrLFwKKyAgICAtREpBVkFfQVJHUz0neyAiLUotbXM4bSIkKENPTU1BKSBcCisJCSAgICItSi1Ec3VuLmp2bS5ob3RzcG90LmRlYnVnZ2VyLnVzZVByb2NEZWJ1Z2dlciIkKENPTU1BKSBcCisJCSAgICItSi1Ec3VuLmp2bS5ob3RzcG90LmRlYnVnZ2VyLnVzZVdpbmRiZ0RlYnVnZ2VyIiQoQ09NTUEpIFwKKwkJICAgInN1bi50b29scy5qc3RhY2suSlN0YWNrIiQoQ09NTUEpIH0nIFwKKyAgICAtREFQUF9DTEFTU1BBVEg9J3sgIi9saWIvdG9vbHMuamFyIiQoQ09NTUEpICIvbGliL3NhLWpkaS5qYXIiJChDT01NQSkgIi9jbGFzc2VzIiB9JyBcCisgICAgLCwsLCwsLCwsSW5mby1wcml2aWxlZ2VkLnBsaXN0KSkKKworJChldmFsICQoY2FsbCBTZXR1cExhdW5jaGVyLGpzdGF0LFwKKyAgICAtREpBVkFfQVJHUz0neyAiLUotbXM4bSIkKENPTU1BKSAic3VuLnRvb2xzLmpzdGF0LkpzdGF0IiQoQ09NTUEpIH0nKSkKKworJChldmFsICQoY2FsbCBTZXR1cExhdW5jaGVyLGpzdGF0ZCxcCisgICAgLURKQVZBX0FSR1M9J3sgIi1KLW1zOG0iJChDT01NQSkgInN1bi50b29scy5qc3RhdGQuSnN0YXRkIiQoQ09NTUEpIH0nKSkKKworJChldmFsICQoY2FsbCBTZXR1cExhdW5jaGVyLGtleXRvb2wsXAorICAgIC1ESkFWQV9BUkdTPSd7ICItSi1tczhtIiQoQ09NTUEpICJzdW4uc2VjdXJpdHkudG9vbHMua2V5dG9vbC5NYWluIiQoQ09NTUEpIH0nKSkKKworJChldmFsICQoY2FsbCBTZXR1cExhdW5jaGVyLG5hdGl2ZTJhc2NpaSxcCisgICAgLURKQVZBX0FSR1M9J3sgIi1KLW1zOG0iJChDT01NQSkgInN1bi50b29scy5uYXRpdmUyYXNjaWkuTWFpbiIkKENPTU1BKSB9JykpCisKK2lmbmRlZiBCVUlMRF9IRUFETEVTU19PTkxZCiskKGV2YWwgJChjYWxsIFNldHVwTGF1bmNoZXIscG9saWN5dG9vbCxcCisgICAgLURKQVZBX0FSR1M9J3sgIi1KLW1zOG0iJChDT01NQSkgInN1bi5zZWN1cml0eS50b29scy5wb2xpY3l0b29sLlBvbGljeVRvb2wiJChDT01NQSkgfScsLFwKKyAgICAkKFhMSUJTKSkpCitlbmRpZgorCiskKGV2YWwgJChjYWxsIFNldHVwTGF1bmNoZXIscm1pYyxcCisgICAgLURFWFBBTkRfQ0xBU1NQQVRIX1dJTERDQVJEUyBcCisgICAgLURKQVZBX0FSR1M9J3sgIi1KLW1zOG0iJChDT01NQSkgInN1bi5ybWkucm1pYy5NYWluIiQoQ09NTUEpIH0nKSkKKworJChldmFsICQoY2FsbCBTZXR1cExhdW5jaGVyLHNjaGVtYWdlbixcCisgICAgLURKQVZBX0FSR1M9J3sgIi1KLW1zOG0iJChDT01NQSkgImNvbS5zdW4udG9vbHMuaW50ZXJuYWwuanhjLlNjaGVtYUdlbmVyYXRvciIkKENPTU1BKSB9JykpCisKKyQoZXZhbCAkKGNhbGwgU2V0dXBMYXVuY2hlcixzZXJpYWx2ZXIsXAorICAgIC1ERVhQQU5EX0NMQVNTUEFUSF9XSUxEQ0FSRFMgXAorICAgIC1ESkFWQV9BUkdTPSd7ICItSi1tczhtIiQoQ09NTUEpICJzdW4udG9vbHMuc2VyaWFsdmVyLlNlcmlhbFZlciIkKENPTU1BKSB9JykpCisKKyQoZXZhbCAkKGNhbGwgU2V0dXBMYXVuY2hlcix4amMsXAorICAgIC1ESkFWQV9BUkdTPSd7ICItSi1tczhtIiQoQ09NTUEpICJjb20uc3VuLnRvb2xzLmludGVybmFsLnhqYy5Ecml2ZXIiJChDT01NQSkgfScpKQorCiskKGV2YWwgJChjYWxsIFNldHVwTGF1bmNoZXIsd3NnZW4sXAorICAgIC1ESkFWQV9BUkdTPSd7ICItSi1tczhtIiQoQ09NTUEpICJjb20uc3VuLnRvb2xzLmludGVybmFsLndzLldzR2VuIiQoQ09NTUEpIH0nKSkKKworJChldmFsICQoY2FsbCBTZXR1cExhdW5jaGVyLHdzaW1wb3J0LFwKKyAgICAtREpBVkFfQVJHUz0neyAiLUotbXM4bSIkKENPTU1BKSAiY29tLnN1bi50b29scy5pbnRlcm5hbC53cy5Xc0ltcG9ydCIkKENPTU1BKSB9JykpCisKKyQoZXZhbCAkKGNhbGwgU2V0dXBMYXVuY2hlcixvcmJkLFwKKyAgICAtREpBVkFfQVJHUz0neyAJIi1KLW1zOG0iJChDT01NQSkgXAorCQkJIi1KLURjb20uc3VuLkNPUkJBLmFjdGl2YXRpb24uRGJEaXI9Li9vcmIuZGIiJChDT01NQSkgXAorCQkJIi1KLURjb20uc3VuLkNPUkJBLmFjdGl2YXRpb24uUG9ydD0xMDQ5IiQoQ09NTUEpIFwKKwkJCSItSi1EY29tLnN1bi5DT1JCQS5QT0EuT1JCU2VydmVySWQ9MSIkKENPTU1BKSBcCisJCQkiY29tLnN1bi5jb3JiYS5zZS5pbXBsLmFjdGl2YXRpb24uT1JCRCIkKENPTU1BKSB9JykpCisKKyQoZXZhbCAkKGNhbGwgU2V0dXBMYXVuY2hlcixzZXJ2ZXJ0b29sLFwKKyAgICAtREpBVkFfQVJHUz0neyAiLUotbXM4bSIkKENPTU1BKSAiY29tLnN1bi5jb3JiYS5zZS5pbXBsLmFjdGl2YXRpb24uU2VydmVyVG9vbCIkKENPTU1BKSB9JykpCisKKyQoZXZhbCAkKGNhbGwgU2V0dXBMYXVuY2hlcix0bmFtZXNlcnYsXAorICAgIC1ESkFWQV9BUkdTPSd7IAkiLUotbXM4bSIkKENPTU1BKSBcCisJCQkiLUotRGNvbS5zdW4uQ09SQkEuYWN0aXZhdGlvbi5EYkRpcj0uL29yYi5kYiIkKENPTU1BKSBcCisJCQkiLUotRGphdmEudXRpbC5sb2dnaW5nLkxvZ2dpbmdQZXJtaXNzaW9uPWNvbnRvbCIkKENPTU1BKSBcCisJCQkiLUotRGNvbS5zdW4uQ09SQkEuUE9BLk9SQlNlcnZlcklkPTEiJChDT01NQSkgXAorCQkJImNvbS5zdW4uY29yYmEuc2UuaW1wbC5uYW1pbmcuY29zbmFtaW5nLlRyYW5zaWVudE5hbWVTZXJ2ZXIiJChDT01NQSkgfScpKQorCiskKGV2YWwgJChjYWxsIFNldHVwTGF1bmNoZXIscGFjazIwMCxcCisgICAgLURKQVZBX0FSR1M9J3sJIi1KLW1zOG0iJChDT01NQSkgImNvbS5zdW4uamF2YS51dGlsLmphci5wYWNrLkRyaXZlciIkKENPTU1BKSAiLS1wYWNrIiB9JykpCisKKyQoZXZhbCAkKGNhbGwgU2V0dXBMYXVuY2hlcixybWlkLFwKKyAgICAtREpBVkFfQVJHUz0newkiLUotbXM4bSIkKENPTU1BKSAic3VuLnJtaS5zZXJ2ZXIuQWN0aXZhdGlvbiIkKENPTU1BKSB9JykpCisKKyQoZXZhbCAkKGNhbGwgU2V0dXBMYXVuY2hlcixybWlyZWdpc3RyeSxcCisgICAgLURKQVZBX0FSR1M9J3sJIi1KLW1zOG0iJChDT01NQSkgInN1bi5ybWkucmVnaXN0cnkuUmVnaXN0cnlJbXBsIiQoQ09NTUEpIH0nKSkKKworJChldmFsICQoY2FsbCBTZXR1cExhdW5jaGVyLGpjbWQsXAorICAgIC1ESkFWQV9BUkdTPSd7CSItSi1tczhtIiQoQ09NTUEpICJzdW4udG9vbHMuamNtZC5KQ21kIiQoQ09NTUEpIH0nKSkKKworaWZlcSAoJChPUEVOSkRLX1RBUkdFVF9PUyksd2luZG93cykKKyAgICAkKGV2YWwgJChjYWxsIFNldHVwTGF1bmNoZXIsa2luaXQsXAorICAgICAgICAtREpBVkFfQVJHUz0newkiLUotbXM4bSIkKENPTU1BKSAic3VuLnNlY3VyaXR5LmtyYjUuaW50ZXJuYWwudG9vbHMuS2luaXQiJChDT01NQSkgfScpKQorCisgICAgJChldmFsICQoY2FsbCBTZXR1cExhdW5jaGVyLGtsaXN0LFwKKyAgICAgICAgLURKQVZBX0FSR1M9J3sJIi1KLW1zOG0iJChDT01NQSkgInN1bi5zZWN1cml0eS5rcmI1LmludGVybmFsLnRvb2xzLktsaXN0IiQoQ09NTUEpIH0nKSkKKworICAgICQoZXZhbCAkKGNhbGwgU2V0dXBMYXVuY2hlcixrdGFiLFwKKyAgICAgICAgLURKQVZBX0FSR1M9J3sJIi1KLW1zOG0iJChDT01NQSkgInN1bi5zZWN1cml0eS5rcmI1LmludGVybmFsLnRvb2xzLkt0YWIiJChDT01NQSkgfScpKQorZW5kaWYKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFRoZSBvcmRlciBvZiB0aGUgb2JqZWN0IGZpbGVzIG9uIHRoZSBsaW5rIGNvbW1hbmQgbGluZSBhZmZlY3RzIHRoZSBzaXplIG9mIHRoZSByZXN1bHRpbmcKKyMgYmluYXJ5IChhdCBsZWFzdCBvbiBsaW51eCkgd2hpY2ggY2F1c2VzIHRoZSBzaXplIHRvIGRpZmZlciBiZXR3ZWVuIG9sZCBhbmQgbmV3IGJ1aWxkLgoraWZlcSAoJChVU0VfRVhURVJOQUxfTElCWiksIHRydWUpCitVTlBBQ0tFWEVfQ0ZMQUdTIDo9IC1EU1lTVEVNX1pMSUIKK1VOUEFDS0VYRV9aSVBPQkpTIDo9IC1segorZWxzZQorVU5QQUNLRVhFX0NGTEFHUyA6PSAtSSQoSkRLX1RPUERJUikvc3JjL3NoYXJlL25hdGl2ZS9qYXZhL3V0aWwvemlwL3psaWItMS4yLjUKK1VOUEFDS0VYRV9aSVBPQkpTIDo9IAkkKEpES19PVVRQVVRESVIpL29ianMvbGliemlwL3pjcmMzMiQoT0JKX1NVRkZJWCkgXAorCQkgICAgIAkkKEpES19PVVRQVVRESVIpL29ianMvbGliemlwL2RlZmxhdGUkKE9CSl9TVUZGSVgpIFwKKwkJCSQoSkRLX09VVFBVVERJUikvb2Jqcy9saWJ6aXAvdHJlZXMkKE9CSl9TVUZGSVgpIFwKKwkJCSQoSkRLX09VVFBVVERJUikvb2Jqcy9saWJ6aXAvemFkbGVyMzIkKE9CSl9TVUZGSVgpIFwKKwkJCSQoSkRLX09VVFBVVERJUikvb2Jqcy9saWJ6aXAvY29tcHJlc3MkKE9CSl9TVUZGSVgpIFwKKwkJCSQoSkRLX09VVFBVVERJUikvb2Jqcy9saWJ6aXAvenV0aWwkKE9CSl9TVUZGSVgpIFwKKwkJCSQoSkRLX09VVFBVVERJUikvb2Jqcy9saWJ6aXAvaW5mbGF0ZSQoT0JKX1NVRkZJWCkgXAorCQkJJChKREtfT1VUUFVURElSKS9vYmpzL2xpYnppcC9pbmZiYWNrJChPQkpfU1VGRklYKSBcCisJCQkkKEpES19PVVRQVVRESVIpL29ianMvbGliemlwL2luZnRyZWVzJChPQkpfU1VGRklYKSBcCisJCQkkKEpES19PVVRQVVRESVIpL29ianMvbGliemlwL2luZmZhc3QkKE9CSl9TVUZGSVgpCisKK2VuZGlmCisKK2lmZXEgKCQoT1BFTkpES19UQVJHRVRfQ1BVX0FSQ0gpLCBzcGFyYykKKyAgICBVTlBBQ0tFWEVfQ0ZMQUdTICs9IC14cmVncz1ubyVhcHBsCisgICAgVU5QQUNLRVhFX0xERkxBR1Nfc29sYXJpcyArPSAteG1lbWFsaWduPTRzCitlbmRpZgorCitVTlBBQ0tFWEVfTEFORzo9QworaWZlcSAoJChPUEVOSkRLX1RBUkdFVF9PUyksc29sYXJpcykKKyAgICBVTlBBQ0tFWEVfTEFORzo9QysrCitlbmRpZgorIyBPbiB3aW5kb3dzLCB1bnBhY2syMDAgaXMgbGlua2VkIGNvbXBsZXRlbHkgZGlmZmVyZW50bHkgdG8gYWxsIG90aGVyCisjIGV4ZWN1dGFibGVzLCB1c2luZyB0aGUgY29tcGlsZXIgd2l0aCB0aGUgY29tcGlsZXIgYXJndW1lbnRzLgorIyBJdCdzIGFsc28gbGlua2VkIGluY3JlbWVudGFsbHksIHByb2R1Y2luZyBhIC5pbGsgZmlsZSB0aGF0IG5lZWRzIHRvIAorIyBiZSBrZXB0IGF3YXkuCitpZmVxICgkKE9QRU5KREtfVEFSR0VUX09TKSx3aW5kb3dzKQorICAgIEJVSUxEX1VOUEFDS0VYRV9MREVYRTo9JChDQykKKyAgICBFWEVfT1VUX09QVElPTl9zYXZlOj0kKEVYRV9PVVRfT1BUSU9OKQorICAgIEVYRV9PVVRfT1BUSU9OOj0tRmUKK2VuZGlmCiskKGV2YWwgJChjYWxsIFNldHVwTmF0aXZlQ29tcGlsYXRpb24sQlVJTERfVU5QQUNLRVhFLFwKKyAgICAgICAgICAgICAgICBTUkM6PSQoSkRLX1RPUERJUikvc3JjL3NoYXJlL25hdGl2ZS9jb20vc3VuL2phdmEvdXRpbC9qYXIvcGFjayxcCisJCUVYQ0xVREVfRklMRVM6PWpuaS5jcHAsXAorCQlMQU5HOj0kKFVOUEFDS0VYRV9MQU5HKSxcCisJCU9QVElNSVpBVElPTjo9TE9XLCBcCisJCUNGTEFHUzo9JChVTlBBQ0tFWEVfQ0ZMQUdTKSAkKENYWEZMQUdTX0pES0VYRSlcCisgICAgICAgICAgICAgICAgICAgICAgICAtREZVTEwsIFwKKwkJQ0ZMQUdTX3JlbGVhc2U6PS1EUFJPRFVDVCxcCisJCUNGTEFHU19saW51eDo9LWZQSUMsXAorCQlDRkxBR1Nfc29sYXJpczo9LUtQSUMsIFwKKwkJQ0ZMQUdTX21hY29zeDo9LWZQSUMsIFwKKwkJTUFQRklMRTo9JChKREtfVE9QRElSKS9tYWtlZmlsZXMvbWFwZmlsZXMvbGlidW5wYWNrL21hcGZpbGUtdmVycy11bnBhY2syMDAsXAorCQlMREZMQUdTOj0kKFVOUEFDS0VYRV9aSVBPQkpTKSxcCisJCUxERkxBR1Nfd2luZG93czo9JChDWFhGTEFHU19KREtFWEUpLFwKKwkJTERGTEFHU19wb3NpeDo9JChMREZMQUdTX0pES0VYRSkgJChMREZMQUdTX0NYWF9KREspIFwKKwkJCSAkKGNhbGwgU0VUX1NIQVJFRF9MSUJSQVJZX05BTUUsJChMSUJSQVJZX1BSRUZJWCl1bnBhY2skKFNIQVJFRF9MSUJSQVJZX1NVRkZJWCkpIFwKKwkJCSAkKGNhbGwgU0VUX1NIQVJFRF9MSUJSQVJZX09SSUdJTiksXAorCQlMREZMQUdTX2xpbnV4Oj0tbGMsXAorCQlMREZMQUdTX3NvbGFyaXM6PSQoVU5QQUNLRVhFX0xERkxBR1Nfc29sYXJpcykgLWxjLFwKKwkJTERGTEFHU19TVUZGSVg6PSQoTElCQ1hYKSxcCisJCU9CSkVDVF9ESVI6PSQoSkRLX09VVFBVVERJUikvb2Jqcy91bnBhY2tleGUkKE9VVFBVVF9TVUJESVIpLFwKKwkJT1VUUFVUX0RJUjo9JChKREtfT1VUUFVURElSKS9vYmpzL3VucGFja2V4ZSQoT1VUUFVUX1NVQkRJUiksXAorCQlQUk9HUkFNOj11bnBhY2syMDAsXAorCQlWRVJTSU9OSU5GT19SRVNPVVJDRTo9JChKREtfVE9QRElSKS9zcmMvd2luZG93cy9yZXNvdXJjZS92ZXJzaW9uLnJjLFwKKwkJUkNfRkxBR1M6PSQoUkNfRkxBR1MpXAorCQkJICAtRCAiSkRLX0ZOQU1FPXVucGFjazIwMC5leGUiIFwKKwkJCSAgLUQgIkpES19JTlRFUk5BTF9OQU1FPXVucGFjazIwMCIgXAorCQkJICAtRCAiSkRLX0ZUWVBFPTB4MUwiLFwKKwkJTUFOSUZFU1Q6PSQoSkRLX1RPUERJUikvc3JjL3dpbmRvd3MvcmVzb3VyY2UvdW5wYWNrMjAwX3Byb3RvLmV4ZS5tYW5pZmVzdCkpCisKK2lmZXEgKCQoT1BFTkpES19UQVJHRVRfT1MpLHdpbmRvd3MpCisgICAgRVhFX09VVF9PUFRJT046PSQoRVhFX09VVF9PUFRJT05fc2F2ZSkKK2VuZGlmCisKK2lmbmVxICgkKFVTRV9FWFRFUk5BTF9MSUJaKSwgdHJ1ZSkKKworJChCVUlMRF9VTlBBQ0tFWEUpIDogJChVTlBBQ0tFWEVfWklQT0JKUykKKworZW5kaWYKKworIyBCdWlsZCBpbnRvIG9iamVjdCBkaXIgYW5kIGNvcHkgZXhlY3V0YWJsZSBhZnRlcndhcmRzIHRvIGF2b2lkIC5pbGsgZmlsZSBpbgorIyBpbWFnZS4gVGhlIHJlYWwgZml4IHdvdWxkIGJlIGNsZWFuIHVwIGxpbmtpbmcgb2YgdW5wYWNrMjAwIHVzaW5nIAorIyAtbGluayAtaW5jcmVtZW50YWw6bm8KKyMgbGlrZSBhbGwgb3RoZXIgbGF1bmNoZXJzLgorJChKREtfT1VUUFVURElSKS9iaW4kKE9VVFBVVF9TVUJESVIpL3VucGFjazIwMCQoRVhFX1NVRkZJWCk6ICQoQlVJTERfVU5QQUNLRVhFKQorCSQoTUtESVIpIC1wICQoQEQpCisJJChDUCkgJyQ8JyAnJEAnCisKK0JVSUxEX0xBVU5DSEVSUyArPSAkKEpES19PVVRQVVRESVIpL2JpbiQoT1VUUFVUX1NVQkRJUikvdW5wYWNrMjAwJChFWEVfU1VGRklYKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworCitCVUlMRF9KRVhFQyA6PSAKK0JVSUxEX0pFWEVDX1NSQyA6PQorQlVJTERfSkVYRUNfSU5DIDo9CitCVUlMRF9KRVhFQ19EU1RfRElSIDo9ICQoSkRLX09VVFBVVERJUikvbGliJChPUEVOSkRLX1RBUkdFVF9DUFVfTElCRElSKQorCisjCisjIFVOSEFORExFRDoKKyMgLSBDT01QSUxFX0FQUFJPQUNIID0gbm9ybWFsCisjCisKKyMKKyMgamRrL21ha2UvamF2YS9NYWtlZmlsZQorIworaWZlcSAoJChPUEVOSkRLX1RBUkdFVF9PUyksIHNvbGFyaXMpCisJaWZlcSAoJChPUEVOSkRLX1RBUkdFVF9DUFVfQklUUyksIDMyKQorCQlCVUlMRF9KRVhFQyA6PSAxCisJZW5kaWYKK2VuZGlmCisKK2lmZXEgKCQoT1BFTkpES19UQVJHRVRfT1MpLCBsaW51eCkKKwlCVUlMRF9KRVhFQyA6PSAxCitlbmRpZiAjIE9QRU5KREtfVEFSR0VUX09TCisKKyMKKyMgamRrL21ha2UvamF2YS9qZXhlYy9NYWtlZmlsZQorIworaWZlcSAoJChCVUlMRF9KRVhFQyksIDEpCisKKwlpZmVxICgkKE9QRU5KREtfVEFSR0VUX09TKSx3aW5kb3dzKQorCWVsc2UgaWZlcSAoJChPUEVOSkRLX1RBUkdFVF9PUyksbWFjb3N4KQorCQlCVUlMRF9KRVhFQ19TUkMgOj0gJChKREtfVE9QRElSKS9zcmMvbWFjb3N4L2JpbgorCWVsc2UKKwkJQlVJTERfSkVYRUNfU1JDIDo9ICQoSkRLX1RPUERJUikvc3JjL3NvbGFyaXMvYmluCisJZW5kaWYKKworCWlmZXEgKCQoT1BFTkpES19UQVJHRVRfT1MpLCBsaW51eCkKKyAgICAgICAgICAgICAgICBCVUlMRF9KRVhFQ19EU1RfRElSIDo9ICQoSkRLX09VVFBVVERJUikvbGliCisJCUJVSUxEX0pFWEVDX0lOQyArPSAtSSQoSkRLX1RPUERJUikvc3JjL3NoYXJlL2JpbgorCWVuZGlmCitlbmRpZgorCisjCisjIE5vdGUgdGhhdCB0aGUgdHdvIE1ha2VmaWxlJ3Mgc2VlbXMgdG8gY29udHJhZGljdCBlYWNoIG90aGVyLAorIyAgIGFuZCB0aGF0IHNyYy9tYWNvc3gvYmluL2pleGVjLmMgc2VlbXMgdW51c2VkCisjCitpZm5lcSAoJChCVUlMRF9KRVhFQ19TUkMpLCkKKyAgICAgICAgJChldmFsICQoY2FsbCBTZXR1cE5hdGl2ZUNvbXBpbGF0aW9uLEJVSUxEX0pFWEVDLFwKKwkJU1JDOj0kKEJVSUxEX0pFWEVDX1NSQyksXAorCQlJTkNMVURFX0ZJTEVTOj1qZXhlYy5jLFwKKwkJTEFORzo9QyxcCisJCU9QVElNSVpBVElPTiA6PSBMT1csIFwKKwkJQ0ZMQUdTOj0kKENGTEFHU19KREtFWEUpXAorICAgICAgICAgICAgICAgICAgICAgICAgJChCVUlMRF9KRVhFQ19JTkMpLCBcCisJCUNGTEFHU19saW51eDo9LWZQSUMsXAorCQlDRkxBR1Nfc29sYXJpczo9LUtQSUMsXAorCQlMREZMQUdTOj0kKExERkxBR1NfSkRLRVhFKSBcCisJCQkgJChjYWxsIFNFVF9TSEFSRURfTElCUkFSWV9OQU1FLCQoTElCUkFSWV9QUkVGSVgpJChTSEFSRURfTElCUkFSWV9TVUZGSVgpKSwgXAorCQlPQkpFQ1RfRElSOj0kKEpES19PVVRQVVRESVIpL29ianMvamV4ZWNfb2JqLFwKKwkJT1VUUFVUX0RJUjo9JChCVUlMRF9KRVhFQ19EU1RfRElSKSxcCisJCVBST0dSQU06PWpleGVjKSkKKworCUJVSUxEX0xBVU5DSEVSUyArPSAkKEJVSUxEX0pFWEVDKQorZW5kaWYKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMKKyMgVGhlIGphdmEtcm1pLmNnaSBzY3JpcHQgaW4gYmluLyBvbmx5IGdldHMgZGVsaXZlcmVkIGluIGNlcnRhaW4gc2l0dWF0aW9ucworIworSkFWQV9STUlfQ0dJOj0kKEpES19PVVRQVVRESVIpL2JpbiQoT1VUUFVUX1NVQkRJUikvamF2YS1ybWkuY2dpCitpZmVxICgkKE9QRU5KREtfVEFSR0VUX09TKSwgbGludXgpCisgIEJVSUxEX0xBVU5DSEVSUyArPSAkKEpBVkFfUk1JX0NHSSkKK2VuZGlmCitpZmVxICgkKE9QRU5KREtfVEFSR0VUX09TKSwgc29sYXJpcykKKyAgaWZlcSAoJChPUEVOSkRLX1RBUkdFVF9DUFVfQklUUyksIDMyKQorICAgIEJVSUxEX0xBVU5DSEVSUyArPSAkKEpBVkFfUk1JX0NHSSkKKyAgZW5kaWYKK2VuZGlmCisKKyMgVE9ETzogCisjIE9uIHdpbmRvd3MgamF2YS1ybWkuY2dpIHNob3VsZG4ndCBiZSBidW5kbGVkIHNpbmNlIEphdmEgMS4yLCBidXQgaGFzIGJlZW4gYnVpbHQgYWxsCisjIHRoaXMgdGltZSBhbnl3YXkuIFNpbmNlIGpkazYsIGl0IGhhcyBiZWVuIGJ1aWx0IGZyb20gdGhlIHdyb25nIHNvdXJjZSBhbmQgcmVzdWx0ZWQKKyMgaW4gYSAoYWxtb3N0KSBjb3B5IG9mIHRoZSBzdGFuZGFyZCBqYXZhIGxhdW5jaGVyIG5hbWVkICJqYXZhLXJtaS5leGUiIGVuZGluZyB1cCBpbiAKKyMgdGhlIGZpbmFsIGltYWdlcyBiaW4gZGlyLiBUaGlzIHdlaXJkIGJlaGF2aW9yIGlzIG1pbWlja2VkIGhlcmUgaW4gdGhlIGNvbnZlcnRlZCAKKyMgbWFrZWZpbGVzIGZvciBub3cuIFNob3VsZCBwcm9iYWJseSBqdXN0IGJlIGRlbGV0ZWQuCisjIGh0dHA6Ly9idWdzLnN1bi5jb20vYnVnZGF0YWJhc2Uvdmlld19idWcuZG8/YnVnX2lkPTY1MTIwNTIKK2lmZXEgKCQoT1BFTkpES19UQVJHRVRfT1MpLHdpbmRvd3MpCisgICAgJChldmFsICQoY2FsbCBTZXR1cExhdW5jaGVyLGphdmEtcm1pLCxcCisgICAgICAgICQoY2FsbCBTRVRfU0hBUkVEX0xJQlJBUllfTUFQRklMRSwkKEpES19UT1BESVIpL21ha2VmaWxlcy9qYXZhL21haW4vamF2YS9tYXBmaWxlLSQoT1BFTkpES19UQVJHRVRfQ1BVKSkpKQorZWxzZQorICAgICQoSkFWQV9STUlfQ0dJKTogJChKREtfVE9QRElSKS9zcmMvc29sYXJpcy9iaW4vamF2YS1ybWkuY2dpLnNoCisJJChNS0RJUikgLXAgJChARCkKKwkkKENQKSAkPCAkQAorCSQoQ0hNT0QpIGEreCAkQAorZW5kaWYKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyQoQlVJTERfTEFVTkNIRVJTKSA6ICQoSkRLX1RPUERJUikvbWFrZWZpbGVzL0NvbXBpbGVMYXVuY2hlcnMuZ21rCisKK2FsbDogJChCVUlMRF9MQVVOQ0hFUlMpCisKKy5QSE9OWTogYWxsCmRpZmYgLS1naXQgYS9qZGsvbWFrZWZpbGVzL0NvbXBpbGVOYXRpdmVMaWJyYXJpZXMuZ21rIGIvamRrL21ha2VmaWxlcy9Db21waWxlTmF0aXZlTGlicmFyaWVzLmdtawppbmRleCA1YTNiZTQ2Li40N2M5MDUwIDEwMDY0NAotLS0gYS9qZGsvbWFrZWZpbGVzL0NvbXBpbGVOYXRpdmVMaWJyYXJpZXMuZ21rCisrKyBiL2pkay9tYWtlZmlsZXMvQ29tcGlsZU5hdGl2ZUxpYnJhcmllcy5nbWsKQEAgLTE0Niw5ICsxNDYsOSBAQAogCQlMREZMQUdTX1NVRkZJWF93aW5kb3dzOj1qdm0ubGliLFwKIAkJVkVSU0lPTklORk9fUkVTT1VSQ0U6PSQoSkRLX1RPUERJUikvc3JjL3dpbmRvd3MvcmVzb3VyY2UvdmVyc2lvbi5yYyxcCiAJCVJDX0ZMQUdTOj0kKFJDX0ZMQUdTKSBcCi0JCQkgIC9EICJKREtfRk5BTUU9dmVyaWZ5LmRsbCIgXAotCQkJICAvRCAiSkRLX0lOVEVSTkFMX05BTUU9dmVyaWZ5IiBcCi0JCQkgIC9EICJKREtfRlRZUEU9MHgyTCIsXAorCQkJICAtRCAiSkRLX0ZOQU1FPXZlcmlmeS5kbGwiIFwKKwkJCSAgLUQgIkpES19JTlRFUk5BTF9OQU1FPXZlcmlmeSIgXAorCQkJICAtRCAiSkRLX0ZUWVBFPTB4MkwiLFwKIAkJUkVPUkRFUjo9JChCVUlMRF9MSUJWRVJJRllfUkVPUkRFUiksXAogCQlPQkpFQ1RfRElSOj0kKEpES19PVVRQVVRESVIpL29ianMvbGlidmVyaWZ5LFwKIAkJREVCVUdfU1lNQk9MUzo9dHJ1ZSkpCkBAIC0xNzEsMTUgKzE3MSwxOSBAQAogCQkkKEpES19UT1BESVIpL3NyYy9zaGFyZS9uYXRpdmUvamF2YS91dGlsIFwKIAkJJChKREtfVE9QRElSKS9zcmMvc2hhcmUvbmF0aXZlL2phdmEvdXRpbC9jb25jdXJyZW50L2F0b21pYyBcCiAJCSQoSkRLX1RPUERJUikvc3JjLyQoT1BFTkpES19UQVJHRVRfT1NfQVBJX0RJUikvbmF0aXZlL2NvbW1vbiBcCi0JCSQoSkRLX1RPUERJUikvc3JjLyQoT1BFTkpES19UQVJHRVRfT1NfQVBJX0RJUikvbmF0aXZlL2phdmEvdXRpbCBcCi0JCSQoSkRLX1RPUERJUikvc3JjLyQoT1BFTkpES19UQVJHRVRfT1NfQVBJX0RJUikvbmF0aXZlL3N1bi9zZWN1cml0eS9wcm92aWRlciBcCi0JCSQoSkRLX1RPUERJUikvc3JjLyQoT1BFTkpES19UQVJHRVRfT1NfQVBJX0RJUikvbmF0aXZlL3N1bi9pbworCQkkKEpES19UT1BESVIpL3NyYy8kKE9QRU5KREtfVEFSR0VUX09TX0FQSV9ESVIpL25hdGl2ZS9qYXZhL3V0aWwKKwogaWZuZXEgKCQoT1BFTkpES19UQVJHRVRfT1MpLG1hY29zeCkKICAgICBMSUJKQVZBX1NSQ19ESVJTKz0kKEpES19UT1BESVIpL3NyYy8kKE9QRU5KREtfVEFSR0VUX09TX0FQSV9ESVIpL25hdGl2ZS9zdW4vdXRpbC9sb2NhbGUvcHJvdmlkZXIKIGVsc2UKICAgICBMSUJKQVZBX1NSQ19ESVJTKz0kKEpES19UT1BESVIpL3NyYy9tYWNvc3gvbmF0aXZlL3N1bi91dGlsL2xvY2FsZS9wcm92aWRlcgogZW5kaWYKIAoraWZlcSAoJChPUEVOSkRLX1RBUkdFVF9PUyksd2luZG93cykKKyAgICBMSUJKQVZBX1NSQ19ESVJTKz0kKEpES19UT1BESVIpL3NyYy8kKE9QRU5KREtfVEFSR0VUX09TX0FQSV9ESVIpL25hdGl2ZS9zdW4vc2VjdXJpdHkvcHJvdmlkZXIgXAorCQkkKEpES19UT1BESVIpL3NyYy8kKE9QRU5KREtfVEFSR0VUX09TX0FQSV9ESVIpL25hdGl2ZS9zdW4vaW8KK2VuZGlmCisKIExJQkpBVkFfQ0ZMQUdTOj0kKGZvcmVhY2ggZGlyLCQoTElCSkFWQV9TUkNfRElSUyksLUkkKGRpcikpIFwKIAkJICAtSSQoSkRLX1RPUERJUikvc3JjL3NoYXJlL25hdGl2ZS9qYXZhL2xhbmcvZmRsaWJtL2luY2x1ZGUgXAogICAgICAgICAgICAgICAgICAgLURBUkNIUFJPUE5BTUU9JyIkKE9QRU5KREtfVEFSR0VUX0NQVV9PU0FSQ0gpIicKQEAgLTIwOSw3ICsyMTMsNiBAQAogZWxzZQogCUxJQkpBVkFfRVhDTFVERV9GSUxFUyArPSBcCiAJCVByb2Nlc3NJbXBsX21kLmMgXAotCQlXaW4zMkZpbGVTeXN0ZW1fbWQuYyBcCiAJCVdpbk5URmlsZVN5c3RlbV9tZC5jIFwKIAkJZGlyZW50X21kLmMgXAogCQlXaW5kb3dzUHJlZmVyZW5jZXMuYyBcCkBAIC0yMzYsMjEgKzIzOSwyMSBAQAogCQlNQVBGSUxFOj0kKEpES19UT1BESVIpL21ha2VmaWxlcy9tYXBmaWxlcy9saWJqYXZhL21hcGZpbGUtdmVycywgXAogCQlMREZMQUdTOj0kKExERkxBR1NfSkRLTElCKSBcCiAJCQkgJChjYWxsIFNFVF9TSEFSRURfTElCUkFSWV9PUklHSU4pLCBcCi0JCUxERkxBR1Nfd2luZG93czo9LWV4cG9ydDp3aW5GaWxlSGFuZGxlT3BlbiAtZXhwb3J0OmhhbmRsZUxzZWVrIFwKLQkJCQkgJChCVUlMRF9MSUJGRExJQk0pICQoV0lOX1ZFUklGWV9MSUIpIGp2bS5saWIgXAotCQkJCSBzaGVsbDMyLmxpYiBkZWxheWltcC5saWIgL0RFTEFZTE9BRDpzaGVsbDMyLmRsbCBcCi0JCQkJIGFkdmFwaTMyLmxpYixcCiAJCUxERkxBR1NfU1VGRklYX3Bvc2l4Oj0tbGp2bSAtbHZlcmlmeSwgXAogCQlMREZMQUdTX1NVRkZJWF9zb2xhcmlzOj0tbG5zbCAtbHNvY2tldCAtbHNjZiAkKExJQkRMKSAkKEJVSUxEX0xJQkZETElCTSkgLWxjLFwKIAkJTERGTEFHU19TVUZGSVhfbGludXg6PSQoTElCREwpICQoQlVJTERfTElCRkRMSUJNKSxcCiAJCUxERkxBR1NfU1VGRklYX21hY29zeDo9LUwkKEpES19PVVRQVVRESVIpL29ianMvIC1sZmRsaWJtIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLWZyYW1ld29yayBDb3JlRm91bmRhdGlvbiBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1mcmFtZXdvcmsgU2VjdXJpdHkgLWZyYW1ld29yayBTeXN0ZW1Db25maWd1cmF0aW9uLCBcCisJCUxERkxBR1NfU1VGRklYX3dpbmRvd3M6PS1leHBvcnQ6d2luRmlsZUhhbmRsZU9wZW4gLWV4cG9ydDpoYW5kbGVMc2VlayBcCisJCQkJCWp2bS5saWIgJChCVUlMRF9MSUJGRExJQk0pICQoV0lOX1ZFUklGWV9MSUIpIFwKKwkJCQkJc2hlbGwzMi5saWIgZGVsYXlpbXAubGliIC1ERUxBWUxPQUQ6c2hlbGwzMi5kbGwgXAorCQkJCQlhZHZhcGkzMi5saWIsXAogCQlWRVJTSU9OSU5GT19SRVNPVVJDRTo9JChKREtfVE9QRElSKS9zcmMvd2luZG93cy9yZXNvdXJjZS92ZXJzaW9uLnJjLFwKIAkJUkNfRkxBR1M6PSQoUkNfRkxBR1MpXAotCQkJICAvRCAiSkRLX0ZOQU1FPWphdmEuZGxsIiBcCi0JCQkgIC9EICJKREtfSU5URVJOQUxfTkFNRT1qYXZhIiBcCi0JCQkgIC9EICJKREtfRlRZUEU9MHgyTCIsXAorCQkJICAtRCAiSkRLX0ZOQU1FPWphdmEuZGxsIiBcCisJCQkgIC1EICJKREtfSU5URVJOQUxfTkFNRT1qYXZhIiBcCisJCQkgIC1EICJKREtfRlRZUEU9MHgyTCIsXAogCQlSRU9SREVSOj0kKExJQkpBVkFfUkVPUkRFUiksIFwKIAkJT0JKRUNUX0RJUjo9JChKREtfT1VUUFVURElSKS9vYmpzL2xpYmphdmEsXAogCQlERUJVR19TWU1CT0xTOj0kKFdJTkRPV1NfT05MWSkpKQpAQCAtMjk5LDkgKzMwMiw5IEBACiAJCQkJJChMREZMQUdTX0pES0xJQl9TVUZGSVgpLFwKIAkJVkVSU0lPTklORk9fUkVTT1VSQ0U6PSQoSkRLX1RPUERJUikvc3JjL3dpbmRvd3MvcmVzb3VyY2UvdmVyc2lvbi5yYyxcCiAJCVJDX0ZMQUdTOj0kKFJDX0ZMQUdTKVwKLQkJCSAgL0QgIkpES19GTkFNRT1tbGliX2ltYWdlLmRsbCIgXAotCQkJICAvRCAiSkRLX0lOVEVSTkFMX05BTUU9bWxpYl9pbWFnZSIgXAotCQkJICAvRCAiSkRLX0ZUWVBFPTB4MkwiLFwKKwkJCSAgLUQgIkpES19GTkFNRT1tbGliX2ltYWdlLmRsbCIgXAorCQkJICAtRCAiSkRLX0lOVEVSTkFMX05BTUU9bWxpYl9pbWFnZSIgXAorCQkJICAtRCAiSkRLX0ZUWVBFPTB4MkwiLFwKIAkJT0JKRUNUX0RJUjo9JChKREtfT1VUUFVURElSKS9vYmpzL2xpYm1saWJfaW1hZ2UsXAogCQlERUJVR19TWU1CT0xTOj0kKFdJTkRPV1NfT05MWSkpKQogCkBAIC00MjMsMTAgKzQyNiwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICQoQ0ZMQUdTX0pES0xJQiksIFwKIAkJTUFQRklMRTo9JChCVUlMRF9MSUJNTElCX0lNQUdFX01BUEZJTEUpLCBcCiAJCUxERkxBR1M6PSQoTERGTEFHU19KREtMSUIpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAkKEJVSUxEX0xJQk1MSUJfTERMSUJTKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgJChCVUlMRF9MSUJNTElCX0xETElCUykgLWxqYXZhIC1sanZtIFwKIAkJCSAkKGNhbGwgU0VUX1NIQVJFRF9MSUJSQVJZX09SSUdJTiksXAogCQlPQkpFQ1RfRElSOj0kKEpES19PVVRQVVRESVIpL29ianMvbGlibWxpYl9pbWFnZV92KSkKIAorJChCVUlMRF9MSUJNTElCX0lNQUdFX1YpOiAkKEJVSUxEX0xJQkpBVkEpCisKIEJVSUxEX0xJQlJBUklFUyArPSAkKEJVSUxEX0xJQk1MSUJfSU1BR0VfVikKIAogZW5kaWYKQEAgLTQzOSw3ICs0NDQsNiBAQAogCSQoSkRLX1RPUERJUikvc3JjL3NoYXJlL25hdGl2ZS9zdW4vYXd0L2ltYWdlIFwKIAkkKEpES19UT1BESVIpL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2F3dC9pbWFnZS9naWYgXAogCSQoSkRLX1RPUERJUikvc3JjL3NoYXJlL25hdGl2ZS9zdW4vYXd0L2ltYWdlL2N2dXRpbHMgXAotCSQoSkRLX1RPUERJUikvc3JjL3NoYXJlL25hdGl2ZS9zdW4vYXd0L3NoZWxsIFwKIAkkKEpES19UT1BESVIpL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2F3dC9tZWRpYWxpYiBcCiAJJChKREtfVE9QRElSKS9zcmMvc2hhcmUvbmF0aXZlL3N1bi9hd3QvZGVidWcgXAogCSQoSkRLX1RPUERJUikvc3JjL3NoYXJlL25hdGl2ZS9zdW4vYXd0L3V0aWxpdHkgXApAQCAtNDUwLDEyICs0NTQsMTcgQEAKIAkkKEpES19UT1BESVIpL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2F3dC9pbWFnZSBcCiAJJChKREtfVE9QRElSKS9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQvb3BlbmdsIFwKIAkkKEpES19UT1BESVIpL3NyYy8kKE9QRU5KREtfVEFSR0VUX09TX0FQSV9ESVIpL25hdGl2ZS9zdW4vamF2YTJkL29wZW5nbCBcCi0JJChKREtfVE9QRElSKS9zcmMvJChPUEVOSkRLX1RBUkdFVF9PU19BUElfRElSKS9uYXRpdmUvc3VuL2phdmEyZC94MTEgXAotCSQoSkRLX1RPUERJUikvc3JjL3NoYXJlL25hdGl2ZS9zdW4vZm9udCBcCisJJChKREtfVE9QRElSKS9zcmMvc2hhcmUvbmF0aXZlL3N1bi9mb250CisKK2lmZXEgKCQoT1BFTkpES19UQVJHRVRfT1MpLHdpbmRvd3MpCisgICAgTElCQVdUX0RJUlMrPVwKIAkkKEpES19UT1BESVIpL3NyYy8kKE9QRU5KREtfVEFSR0VUX09TX0FQSV9ESVIpL25hdGl2ZS9zdW4vd2luZG93cyBcCiAJJChKREtfVE9QRElSKS9zcmMvJChPUEVOSkRLX1RBUkdFVF9PU19BUElfRElSKS9uYXRpdmUvc3VuL2phdmEyZC93aW5kb3dzIFwKIAkkKEpES19UT1BESVIpL3NyYy8kKE9QRU5KREtfVEFSR0VUX09TX0FQSV9ESVIpL25hdGl2ZS9zdW4vamF2YTJkL2QzZAotCitlbHNlCisgICAgTElCQVdUX0RJUlMrPVwKKwkkKEpES19UT1BESVIpL3NyYy8kKE9QRU5KREtfVEFSR0VUX09TX0FQSV9ESVIpL25hdGl2ZS9zdW4vamF2YTJkL3gxMQorZW5kaWYKIAogTElCQVdUX0NGTEFHUzo9LURfX01FRElBTElCX09MRF9OQU1FUyAtRF9fVVNFX0oyRF9OQU1FUyBcCiAJJChYX0NGTEFHUykgXApAQCAtNjUwLDcgKzY1OSwyMSBAQAogCQkJRGxsVXRpbC5jcHAgXAogCQkJaW5pdElEcy5jcHAgXAogCQkJTW91c2VJbmZvLmNwcCBcCi0JCQlyZWN0LmMKKwkJCXJlY3QuYyBcCisJCQlPR0xCbGl0TG9vcHMuYyBcCisJCQlPR0xCdWZJbWdPcHMuYyBcCisJCSAgICAgICAgT0dMQ29udGV4dC5jIFwKKwkJICAgICAgICBPR0xGdW5jcy5jIFwKKwkJICAgICAgICBPR0xNYXNrQmxpdC5jIFwKKwkJICAgICAgICBPR0xNYXNrRmlsbC5jIFwKKwkJICAgICAgICBPR0xQYWludHMuYyBcCisJCSAgICAgICAgT0dMUmVuZGVyUXVldWUuYyBcCisJCSAgICAgICAgT0dMUmVuZGVyZXIuYyBcCisJCSAgICAgICAgT0dMU3VyZmFjZURhdGEuYyBcCisJCSAgICAgICAgT0dMVGV4dFJlbmRlcmVyLmMgXAorCQkgICAgICAgIE9HTFZlcnRleENhY2hlLmMgXAorCQkgICAgICAgIFdHTEdyYXBoaWNzQ29uZmlnLmMgXAorCQkgICAgICAgIFdHTFN1cmZhY2VEYXRhLmMKIAlMSUJBV1RfTEFORzo9QysrCiAJTElCQVdUX0NGTEFHUyArPSAtRUhzYyAtRFVOSUNPREUgLURfVU5JQ09ERQogCWlmZXEgKCQoT1BFTkpES19UQVJHRVRfQ1BVX0JJVFMpLCA2NCkKQEAgLTY4NSwxNSArNzA4LDYgQEAKIAkJQVNGTEFHUzo9JChMSUJBV1RfQVNGTEFHUyksXAogCQlNQVBGSUxFOj0kKExJQkFXVF9NQVBGSUxFKSwgXAogCQlMREZMQUdTOj0kKExERkxBR1NfSkRLTElCKSAkKGNhbGwgU0VUX1NIQVJFRF9MSUJSQVJZX09SSUdJTiksXAotCQlMREZMQUdTX3dpbmRvd3M6PWFkdmFwaTMyLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIFwKLQkJCQkgaW1tMzIubGliIG9sZTMyLmxpYiB1dWlkLmxpYiBzaGVsbDMyLmxpYiBcCi0JCQkJIGNvbWRsZzMyLmxpYiB3aW5tbS5saWIgY29tY3RsMzIubGliIFwKLQkJCQkgc2hsd2FwaS5saWIgZGVsYXlpbXAubGliICQoV0lOX0pBVkFfTElCKSBqdm0ubGliIFwKLQkJCQkgL0RFTEFZTE9BRDp1c2VyMzIuZGxsIC9ERUxBWUxPQUQ6Z2RpMzIuZGxsIFwKLQkJCQkgL0RFTEFZTE9BRDpzaGVsbDMyLmRsbCAvREVMQVlMT0FEOndpbm1tLmRsbCBcCi0JCQkJIC9ERUxBWUxPQUQ6d2luc3Bvb2wuZHJ2IC9ERUxBWUxPQUQ6aW1tMzIuZGxsIFwKLQkJCQkgL0RFTEFZTE9BRDpvbGUzMi5kbGwgL0RFTEFZTE9BRDpjb21kbGczMi5kbGwgXAotCQkJCSAvREVMQVlMT0FEOmNvbWN0bDMyLmRsbCAvREVMQVlMT0FEOnNobHdhcGkuZGxsLFwKIAkJTERGTEFHU19zb2xhcmlzOj0tUi91c3IvZHQvbGliJChPUEVOSkRLX1RBUkdFVF9DUFVfSVNBRElSKSAtUiQoT1BFTldJTl9MSUIpJChPUEVOSkRLX1RBUkdFVF9DUFVfSVNBRElSKSxcCiAJCUxERkxBR1NfU1VGRklYX2xpbnV4Oj0tbGp2bSAkKExJQk0pICQoTElCREwpIC1samF2YSxcCiAJCUxERkxBR1NfU1VGRklYX3NvbGFyaXM6PS1sanZtICQoTElCTSkgJChMSUJETCkgLWxqYXZhLFwKQEAgLTcwNiwxMSArNzIwLDIwIEBACiAJCQkJICAgICAgIC1mcmFtZXdvcmsgQXBwbGljYXRpb25TZXJ2aWNlcyBcCiAJCQkJICAgICAgIC1mcmFtZXdvcmsgQXVkaW9Ub29sYm94IFwKIAkJCQkgICAgICAgLWxqYXZhLFwKKwkJTERGTEFHU19TVUZGSVhfd2luZG93czo9a2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBcCisJCQkJCWltbTMyLmxpYiBvbGUzMi5saWIgdXVpZC5saWIgc2hlbGwzMi5saWIgXAorCQkJCQljb21kbGczMi5saWIgd2lubW0ubGliIGNvbWN0bDMyLmxpYiBzaGx3YXBpLmxpYiBcCisJCQkJCWRlbGF5aW1wLmxpYiBqdm0ubGliICQoV0lOX0pBVkFfTElCKSBhZHZhcGkzMi5saWIgXAorCQkJCQktREVMQVlMT0FEOnVzZXIzMi5kbGwgLURFTEFZTE9BRDpnZGkzMi5kbGwgXAorCQkJCQktREVMQVlMT0FEOnNoZWxsMzIuZGxsIC1ERUxBWUxPQUQ6d2lubW0uZGxsIFwKKwkJCQkJLURFTEFZTE9BRDp3aW5zcG9vbC5kcnYgLURFTEFZTE9BRDppbW0zMi5kbGwgXAorCQkJCQktREVMQVlMT0FEOm9sZTMyLmRsbCAtREVMQVlMT0FEOmNvbWRsZzMyLmRsbCBcCisJCQkJCS1ERUxBWUxPQUQ6Y29tY3RsMzIuZGxsIC1ERUxBWUxPQUQ6c2hsd2FwaS5kbGwsXAogCQlWRVJTSU9OSU5GT19SRVNPVVJDRTo9JChMSUJBV1RfVkVSU0lPTklORk9fUkVTT1VSQ0UpLFwKIAkJUkNfRkxBR1M6PSQoUkNfRkxBR1MpICQoTElCQVdUX1JDX0ZMQUdTKSBcCi0JCQkgIC9EICJKREtfRk5BTUU9YXd0LmRsbCIgXAotCQkJICAvRCAiSkRLX0lOVEVSTkFMX05BTUU9YXd0IiBcCi0JCQkgIC9EICJKREtfRlRZUEU9MHgyTCIsXAorCQkJICAtRCAiSkRLX0ZOQU1FPWF3dC5kbGwiIFwKKwkJCSAgLUQgIkpES19JTlRFUk5BTF9OQU1FPWF3dCIgXAorCQkJICAtRCAiSkRLX0ZUWVBFPTB4MkwiLFwKIAkJT0JKRUNUX0RJUjo9JChKREtfT1VUUFVURElSKS9vYmpzL2xpYmF3dCxcCiAJCURFQlVHX1NZTUJPTFM6PSQoV0lORE9XU19PTkxZKSkpCiAKQEAgLTg2NCw5ICs4ODcsOSBAQAogCQlMREZMQUdTX1NVRkZJWDo9JChMSUJBV1RfWEFXVF9MREZMQUdTX1NVRkZJWCksXAogCQlWRVJTSU9OSU5GT19SRVNPVVJDRTo9JChKREtfVE9QRElSKS9zcmMvd2luZG93cy9yZXNvdXJjZS92ZXJzaW9uLnJjLFwKIAkJUkNfRkxBR1M6PSQoUkNfRkxBR1MpXAotCQkJICAvRCAiSkRLX0ZOQU1FPXhhd3QuZGxsIiBcCi0JCQkgIC9EICJKREtfSU5URVJOQUxfTkFNRT14YXd0IiBcCi0JCQkgIC9EICJKREtfRlRZUEU9MHgyTCIsXAorCQkJICAtRCAiSkRLX0ZOQU1FPXhhd3QuZGxsIiBcCisJCQkgIC1EICJKREtfSU5URVJOQUxfTkFNRT14YXd0IiBcCisJCQkgIC1EICJKREtfRlRZUEU9MHgyTCIsXAogCQlPQkpFQ1RfRElSOj0kKEpES19PVVRQVVRESVIpL29ianMvbGliYXd0X3hhd3QpKQogCiAkKEJVSUxEX0xJQkFXVF9YQVdUKSA6ICQoQlVJTERfTElCSkFWQSkKQEAgLTk0Nyw5ICs5NzAsOSBAQAogCQlMREZMQUdTX1NVRkZJWF9tYWNvc3g6PSQoTElCWikgLWxqYXZhIC1sanZtLFwKIAkJVkVSU0lPTklORk9fUkVTT1VSQ0U6PSQoSkRLX1RPUERJUikvc3JjL3dpbmRvd3MvcmVzb3VyY2UvdmVyc2lvbi5yYyxcCiAJCVJDX0ZMQUdTOj0kKFJDX0ZMQUdTKVwKLQkJCSAgL0QgIkpES19GTkFNRT16aXAuZGxsIiBcCi0JCQkgIC9EICJKREtfSU5URVJOQUxfTkFNRT16aXAiIFwKLQkJCSAgL0QgIkpES19GVFlQRT0weDJMIixcCisJCQkgIC1EICJKREtfRk5BTUU9emlwLmRsbCIgXAorCQkJICAtRCAiSkRLX0lOVEVSTkFMX05BTUU9emlwIiBcCisJCQkgIC1EICJKREtfRlRZUEU9MHgyTCIsXAogCQlPQkpFQ1RfRElSOj0kKEpES19PVVRQVVRESVIpL29ianMvbGliemlwLFwKIAkJREVCVUdfU1lNQk9MUzo9JChXSU5ET1dTX09OTFkpKSkKIApAQCAtOTcyLDE1ICs5OTUsMTUgQEAKIAkJTUFQRklMRTo9JChKREtfVE9QRElSKS9tYWtlZmlsZXMvbWFwZmlsZXMvbGlidW5wYWNrL21hcGZpbGUtdmVycywgXAogCQlMREZMQUdTOj0kKExERkxBR1NfSkRLTElCKSAkKExERkxBR1NfQ1hYX0pESykgXAogCQkJICQoY2FsbCBTRVRfU0hBUkVEX0xJQlJBUllfT1JJR0lOKSxcCi0JCUxERkxBR1Nfd2luZG93czo9LW1hcDokKEpES19PVVRQVVRESVIpL29ianMvdW5wYWNrLm1hcCAvZGVidWcgXAorCQlMREZMQUdTX3dpbmRvd3M6PS1tYXA6JChKREtfT1VUUFVURElSKS9vYmpzL3VucGFjay5tYXAgLWRlYnVnIFwKIAkJCQlqdm0ubGliICQoV0lOX0pBVkFfTElCKSxcCiAJCUxERkxBR1NfU1VGRklYX3Bvc2l4Oj0tbGp2bSAkKExJQkNYWCkgLWxqYXZhIC1sYyxcCiAJCU9CSkVDVF9ESVI6PSQoSkRLX09VVFBVVERJUikvb2Jqcy9saWJ1bnBhY2ssXAogCQlWRVJTSU9OSU5GT19SRVNPVVJDRTo9JChKREtfVE9QRElSKS9zcmMvd2luZG93cy9yZXNvdXJjZS92ZXJzaW9uLnJjLFwKIAkJUkNfRkxBR1M6PSQoUkNfRkxBR1MpXAotCQkJICAvRCAiSkRLX0ZOQU1FPXVucGFjay5kbGwiIFwKLQkJCSAgL0QgIkpES19JTlRFUk5BTF9OQU1FPXVucGFjayIgXAotCQkJICAvRCAiSkRLX0ZUWVBFPTB4MkwiLFwKKwkJCSAgLUQgIkpES19GTkFNRT11bnBhY2suZGxsIiBcCisJCQkgIC1EICJKREtfSU5URVJOQUxfTkFNRT11bnBhY2siIFwKKwkJCSAgLUQgIkpES19GVFlQRT0weDJMIixcCiAJCURFQlVHX1NZTUJPTFM6PSQoV0lORE9XU19PTkxZKSkpCiAKICQoQlVJTERfTElCVU5QQUNLKSA6ICQoQlVJTERfTElCSkFWQSkKQEAgLTEwMjEsMTQgKzEwNDQsMTQgQEAKIAkJTUFQRklMRTo9JChKREtfVE9QRElSKS9tYWtlZmlsZXMvbWFwZmlsZXMvbGliYXR0YWNoL21hcGZpbGUtJChPUEVOSkRLX1RBUkdFVF9PUyksIFwKIAkJVkVSU0lPTklORk9fUkVTT1VSQ0U6PSQoSkRLX1RPUERJUikvc3JjL3dpbmRvd3MvcmVzb3VyY2UvdmVyc2lvbi5yYyxcCiAJCVJDX0ZMQUdTOj0kKFJDX0ZMQUdTKSBcCi0JCQkgIC9EICJKREtfRk5BTUU9YXR0YWNoLmRsbCIgXAotCQkJICAvRCAiSkRLX0lOVEVSTkFMX05BTUU9YXR0YWNoIiBcCi0JCQkgIC9EICJKREtfRlRZUEU9MHgyTCIsXAorCQkJICAtRCAiSkRLX0ZOQU1FPWF0dGFjaC5kbGwiIFwKKwkJCSAgLUQgIkpES19JTlRFUk5BTF9OQU1FPWF0dGFjaCIgXAorCQkJICAtRCAiSkRLX0ZUWVBFPTB4MkwiLFwKIAkJTERGTEFHUzo9JChMREZMQUdTX0pES0xJQikgXAogCQkJICQoY2FsbCBTRVRfU0hBUkVEX0xJQlJBUllfT1JJR0lOKSxcCiAJCUxERkxBR1Nfc29sYXJpczo9LWxkb29yLFwKLQkJTERGTEFHU193aW5kb3dzOj1wc2FwaS5saWIgYWR2YXBpMzIubGliICQoV0lOX0pBVkFfTElCKSBqdm0ubGliLFwKIAkJTERGTEFHU19TVUZGSVg6PSQoTERGTEFHU19KREtMSUJfU1VGRklYKSxcCisJCUxERkxBR1NfU1VGRklYX3dpbmRvd3M6PSQoV0lOX0pBVkFfTElCKSBhZHZhcGkzMi5saWIgcHNhcGkubGliLFwKIAkJT0JKRUNUX0RJUjo9JChKREtfT1VUUFVURElSKS9vYmpzL2xpYmF0dGFjaCxcCiAJCURFQlVHX1NZTUJPTFM6PXRydWUpKQogCkBAIC0xMDU5LDkgKzEwODIsOSBAQAogCQlMREZMQUdTX1NVRkZJWF93aW5kb3dzOj0kKExERkxBR1NfSkRLTElCX1NVRkZJWCkgLWV4cG9ydDpqZHdwVHJhbnNwb3J0X09uTG9hZCB3czJfMzIubGliLFwKIAkJVkVSU0lPTklORk9fUkVTT1VSQ0U6PSQoSkRLX1RPUERJUikvc3JjL3dpbmRvd3MvcmVzb3VyY2UvdmVyc2lvbi5yYyxcCiAJCVJDX0ZMQUdTOj0kKFJDX0ZMQUdTKVwKLQkJCSAgL0QgIkpES19GTkFNRT1kdF9zb2NrZXQuZGxsIiBcCi0JCQkgIC9EICJKREtfSU5URVJOQUxfTkFNRT1kdF9zb2NrZXQiIFwKLQkJCSAgL0QgIkpES19GVFlQRT0weDJMIixcCisJCQkgIC1EICJKREtfRk5BTUU9ZHRfc29ja2V0LmRsbCIgXAorCQkJICAtRCAiSkRLX0lOVEVSTkFMX05BTUU9ZHRfc29ja2V0IiBcCisJCQkgIC1EICJKREtfRlRZUEU9MHgyTCIsXAogCQlPQkpFQ1RfRElSOj0kKEpES19PVVRQVVRESVIpL29ianMvbGliZHRfc29ja2V0LFwKIAkJREVCVUdfU1lNQk9MUzo9dHJ1ZSkpCiAKQEAgLTEwOTEsOSArMTExNCw5IEBACiAJCUxERkxBR1NfU1VGRklYOj0kKExERkxBR1NfSkRLTElCX1NVRkZJWCksXAogCQlWRVJTSU9OSU5GT19SRVNPVVJDRTo9JChKREtfVE9QRElSKS9zcmMvd2luZG93cy9yZXNvdXJjZS92ZXJzaW9uLnJjLFwKIAkJUkNfRkxBR1M6PSQoUkNfRkxBR1MpXAotCQkJICAvRCAiSkRLX0ZOQU1FPWR0X3NobWVtLmRsbCIgXAotCQkJICAvRCAiSkRLX0lOVEVSTkFMX05BTUU9ZHRfc2htZW0iIFwKLQkJCSAgL0QgIkpES19GVFlQRT0weDJMIixcCisJCQkgIC1EICJKREtfRk5BTUU9ZHRfc2htZW0uZGxsIiBcCisJCQkgIC1EICJKREtfSU5URVJOQUxfTkFNRT1kdF9zaG1lbSIgXAorCQkJICAtRCAiSkRLX0ZUWVBFPTB4MkwiLFwKIAkJT0JKRUNUX0RJUjo9JChKREtfT1VUUFVURElSKS9vYmpzL2xpYmR0X3NobWVtLFwKIAkJREVCVUdfU1lNQk9MUzo9JChXSU5ET1dTX09OTFkpKSkKIApAQCAtMTEyNiw5ICsxMTQ5LDkgQEAKIAkJTERGTEFHU19TVUZGSVg6PSxcCiAJCVZFUlNJT05JTkZPX1JFU09VUkNFOj0kKEpES19UT1BESVIpL3NyYy93aW5kb3dzL3Jlc291cmNlL3ZlcnNpb24ucmMsXAogCQlSQ19GTEFHUzo9JChSQ19GTEFHUylcCi0JCQkgIC9EICJKREtfRk5BTUU9amR3cC5kbGwiIFwKLQkJCSAgL0QgIkpES19JTlRFUk5BTF9OQU1FPWpkd3AiIFwKLQkJCSAgL0QgIkpES19GVFlQRT0weDJMIixcCisJCQkgIC1EICJKREtfRk5BTUU9amR3cC5kbGwiIFwKKwkJCSAgLUQgIkpES19JTlRFUk5BTF9OQU1FPWpkd3AiIFwKKwkJCSAgLUQgIkpES19GVFlQRT0weDJMIixcCiAJCU9CSkVDVF9ESVI6PSQoSkRLX09VVFBVVERJUikvb2Jqcy9saWJqZHdwLFwKIAkJREVCVUdfU1lNQk9MUzo9JChXSU5ET1dTX09OTFkpKSkKIApAQCAtMTE2Nyw5ICsxMTkwLDkgQEAKIAkJRVhDTFVERV9GSUxFUzo9JChMSUJKQUFTX0VYQ0xVREVfRklMRVMpLFwKIAkJVkVSU0lPTklORk9fUkVTT1VSQ0U6PSQoSkRLX1RPUERJUikvc3JjL3dpbmRvd3MvcmVzb3VyY2UvdmVyc2lvbi5yYyxcCiAJCVJDX0ZMQUdTOj0kKFJDX0ZMQUdTKSBcCi0JCQkgIC9EICJKREtfRk5BTUU9JChMSUJKQUFTX05BTUUpLmRsbCIgXAotCQkJICAvRCAiSkRLX0lOVEVSTkFMX05BTUU9JChMSUJKQUFTX05BTUUpIiBcCi0JCQkgIC9EICJKREtfRlRZUEU9MHgyTCIsXAorCQkJICAtRCAiSkRLX0ZOQU1FPSQoTElCSkFBU19OQU1FKS5kbGwiIFwKKwkJCSAgLUQgIkpES19JTlRFUk5BTF9OQU1FPSQoTElCSkFBU19OQU1FKSIgXAorCQkJICAtRCAiSkRLX0ZUWVBFPTB4MkwiLFwKIAkJT0JKRUNUX0RJUjo9JChKREtfT1VUUFVURElSKS9vYmpzL2xpYmphYXMsXAogCQlERUJVR19TWU1CT0xTOj0kKFdJTkRPV1NfT05MWSkpKQogCkBAIC0xMTk3LDkgKzEyMjAsOSBAQAogCQlMREZMQUdTX1NVRkZJWDo9LFwKIAkJVkVSU0lPTklORk9fUkVTT1VSQ0U6PSQoSkRLX1RPUERJUikvc3JjL3dpbmRvd3MvcmVzb3VyY2UvdmVyc2lvbi5yYyxcCiAJCVJDX0ZMQUdTOj0kKFJDX0ZMQUdTKVwKLQkJCSAgL0QgIkpES19GTkFNRT1qc2R0LmRsbCIgXAotCQkJICAvRCAiSkRLX0lOVEVSTkFMX05BTUU9anNkdCIgXAotCQkJICAvRCAiSkRLX0ZUWVBFPTB4MkwiLFwKKwkJCSAgLUQgIkpES19GTkFNRT1qc2R0LmRsbCIgXAorCQkJICAtRCAiSkRLX0lOVEVSTkFMX05BTUU9anNkdCIgXAorCQkJICAtRCAiSkRLX0ZUWVBFPTB4MkwiLFwKIAkJT0JKRUNUX0RJUjo9JChKREtfT1VUUFVURElSKS9vYmpzL2xpYmpzZHQsIFwKICAgICAgICAgICAgICAgICBERUJVR19TWU1CT0xTOj10cnVlKSkKIApAQCAtMTI0MSwxMCArMTI2NCwxMSBAQAogCQlMREZMQUdTX1NVRkZJWF9saW51eDo9LWxtIC1sYXd0IC1samF2YSAtbGp2bSxcCiAJCVZFUlNJT05JTkZPX1JFU09VUkNFOj0kKEpES19UT1BESVIpL3NyYy93aW5kb3dzL3Jlc291cmNlL3ZlcnNpb24ucmMsXAogCQlSQ19GTEFHUzo9JChSQ19GTEFHUylcCi0JCQkgIC9EICJKREtfRk5BTUU9bGNtcy5kbGwiIFwKLQkJCSAgL0QgIkpES19JTlRFUk5BTF9OQU1FPWxjbXMiIFwKLQkJCSAgL0QgIkpES19GVFlQRT0weDJMIixcCi0JCU9CSkVDVF9ESVI6PSQoSkRLX09VVFBVVERJUikvb2Jqcy9saWJsY21zKSkKKwkJCSAgLUQgIkpES19GTkFNRT1sY21zLmRsbCIgXAorCQkJICAtRCAiSkRLX0lOVEVSTkFMX05BTUU9bGNtcyIgXAorCQkJICAtRCAiSkRLX0ZUWVBFPTB4MkwiLFwKKwkJT0JKRUNUX0RJUjo9JChKREtfT1VUUFVURElSKS9vYmpzL2xpYmxjbXMsXAorCQlERUJVR19TWU1CT0xTOj0kKFdJTkRPV1NfT05MWSkpKQogCiAgICAgQlVJTERfTElCUkFSSUVTICs9ICQoQlVJTERfTElCTENNUykKIApAQCAtMTMwMCw5ICsxMzI0LDkgQEAKIAkJTERGTEFHU19TVUZGSVg6PSQoTERGTEFHU19KREtMSUJfU1VGRklYKSxcCiAJCVZFUlNJT05JTkZPX1JFU09VUkNFOj0kKEpES19UT1BESVIpL3NyYy93aW5kb3dzL3Jlc291cmNlL3ZlcnNpb24ucmMsXAogCQlSQ19GTEFHUzo9JChSQ19GTEFHUylcCi0JCQkgIC9EICJKREtfRk5BTUU9anBlZy5kbGwiIFwKLQkJCSAgL0QgIkpES19JTlRFUk5BTF9OQU1FPWpwZWciIFwKLQkJCSAgL0QgIkpES19GVFlQRT0weDJMIixcCisJCQkgIC1EICJKREtfRk5BTUU9anBlZy5kbGwiIFwKKwkJCSAgLUQgIkpES19JTlRFUk5BTF9OQU1FPWpwZWciIFwKKwkJCSAgLUQgIkpES19GVFlQRT0weDJMIixcCiAJCVJFT1JERVI6PSQoQlVJTERfTElCSlBFR19SRU9SREVSKSxcCiAJCU9CSkVDVF9ESVI6PSQoSkRLX09VVFBVVERJUikvb2Jqcy9saWJqcGVnLFwKIAkJREVCVUdfU1lNQk9MUzo9JChXSU5ET1dTX09OTFkpKSkKQEAgLTEzMTQsNyArMTMzOCw3IEBACiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAogaWZuZGVmIE9QRU5KREsKLSAgICBGT05UX0hFQURFUlM6PS1JJChDTE9TRURfU1JDKS9zaGFyZS9uYXRpdmUvJChQS0dESVIpL3QyaworICAgIEZPTlRfSEVBREVSUzo9LUkkKEpES19UT1BESVIpL3NyYy9jbG9zZWQvc2hhcmUvbmF0aXZlL3N1bi9mb250L3QyawogICAgIEJVSUxEX0xJQkZPTlRNQU5BR0VSX01BUEZJTEU6PSQoSkRLX1RPUERJUikvbWFrZWZpbGVzL21hcGZpbGVzL2xpYmZvbnRtYW5hZ2VyL21hcGZpbGUtdmVycwogICAgIExJQkZPTlRNQU5BR0VSX0VYQ0xVREVfRklMRVMgKz0gZnJlZXR5cGVTY2FsZXIuYwogZWxzZQpAQCAtMTM2OSwxNiArMTM5MywxOCBAQAogCQlNQVBGSUxFOj0kKEJVSUxEX0xJQkZPTlRNQU5BR0VSX01BUEZJTEUpLCBcCiAJCUxERkxBR1M6PSQoc3Vic3QgLVhsaW5rZXIgLXogLVhsaW5rZXIgZGVmcywsJChMREZMQUdTX0pES0xJQikpICQoTERGTEFHU19DWFhfSkRLKSBcCiAJCQkgJChjYWxsIFNFVF9TSEFSRURfTElCUkFSWV9PUklHSU4pLFwKLQkJTERGTEFHU193aW5kb3dzOj1hZHZhcGkzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgJChXSU5fQVdUX0xJQikgJChXSU5fSkFWQV9MSUIpLFwKIAkJTERGTEFHU19TVUZGSVg6PSQoQlVJTERfTElCRk9OVE1BTkFHRVJfRk9OVExJQiksXAogCQlMREZMQUdTX1NVRkZJWF9saW51eDo9LWxhd3QgJChMSUJNKSAkKExJQkNYWCkgLWxqYXZhIC1sanZtIC1sYyxcCiAJCUxERkxBR1NfU1VGRklYX3NvbGFyaXM6PS1sYXd0IC1sYXd0X3hhd3QgLWxjICQoTElCTSkgJChMSUJDWFgpIC1samF2YSAtbGp2bSxcCi0JCUxERkxBR1NfU1VGRklYX21hY29zeDo9LWxhd3QgJChMSUJNKSAkKExJQkNYWCkgLXVuZGVmaW5lZCBkeW5hbWljX2xvb2t1cCAtbGphdmEgLWxqdm0sXAorCQlMREZMQUdTX1NVRkZJWF9tYWNvc3g6PS1sYXd0ICQoTElCTSkgJChMSUJDWFgpIC11bmRlZmluZWQgZHluYW1pY19sb29rdXAgXAorCQkJCSAgICAgICAtbGphdmEgLWxqdm0sXAorCQlMREZMQUdTX1NVRkZJWF93aW5kb3dzOj0kKFdJTl9KQVZBX0xJQikgYWR2YXBpMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIFwKKwkJCQkJJChXSU5fQVdUX0xJQiksXAogCQlWRVJTSU9OSU5GT19SRVNPVVJDRTo9JChKREtfVE9QRElSKS9zcmMvd2luZG93cy9yZXNvdXJjZS92ZXJzaW9uLnJjLFwKIAkJUkNfRkxBR1M6PSQoUkNfRkxBR1MpXAotCQkJICAvRCAiSkRLX0ZOQU1FPWZvbnRtYW5hZ2VyLmRsbCIgXAotCQkJICAvRCAiSkRLX0lOVEVSTkFMX05BTUU9Zm9udG1hbmFnZXIiIFwKLQkJCSAgL0QgIkpES19GVFlQRT0weDJMIixcCisJCQkgIC1EICJKREtfRk5BTUU9Zm9udG1hbmFnZXIuZGxsIiBcCisJCQkgIC1EICJKREtfSU5URVJOQUxfTkFNRT1mb250bWFuYWdlciIgXAorCQkJICAtRCAiSkRLX0ZUWVBFPTB4MkwiLFwKIAkJT0JKRUNUX0RJUjo9JChKREtfT1VUUFVURElSKS9vYmpzL2xpYmZvbnRtYW5hZ2VyLFwKIAkJREVCVUdfU1lNQk9MUzo9JChXSU5ET1dTX09OTFkpKSkKIApAQCAtMTQzMyw5ICsxNDU5LDkgQEAKIAkJTERGTEFHU19TVUZGSVhfc29sYXJpczo9LWxhd3QgLWxhd3RfeGF3dCxcCiAJCVZFUlNJT05JTkZPX1JFU09VUkNFOj0kKEpES19UT1BESVIpL3NyYy93aW5kb3dzL3Jlc291cmNlL3ZlcnNpb24ucmMsXAogCQlSQ19GTEFHUzo9JChSQ19GTEFHUylcCi0JCQkgIC9EICJKREtfRk5BTUU9dDJrLmRsbCIgXAotCQkJICAvRCAiSkRLX0lOVEVSTkFMX05BTUU9dDJrIiBcCi0JCQkgIC9EICJKREtfRlRZUEU9MHgyTCIsXAorCQkJICAtRCAiSkRLX0ZOQU1FPXQyay5kbGwiIFwKKwkJCSAgLUQgIkpES19JTlRFUk5BTF9OQU1FPXQyayIgXAorCQkJICAtRCAiSkRLX0ZUWVBFPTB4MkwiLFwKIAkJT0JKRUNUX0RJUjo9JChKREtfT1VUUFVURElSKS9vYmpzL2xpYnQyayxcCiAJCURFQlVHX1NZTUJPTFM6PSQoV0lORE9XU19PTkxZKSkpCiAKQEAgLTE0NzAsOSArMTQ5Niw5IEBACiAJCUxERkxBR1NfU1VGRklYOj0kKExERkxBR1NfSkRLTElCX1NVRkZJWCksXAogCQlWRVJTSU9OSU5GT19SRVNPVVJDRTo9JChKREtfVE9QRElSKS9zcmMvd2luZG93cy9yZXNvdXJjZS92ZXJzaW9uLnJjLFwKIAkJUkNfRkxBR1M6PSQoUkNfRkxBR1MpXAotCQkJICAvRCAiSkRLX0ZOQU1FPWphd3QuZGxsIiBcCi0JCQkgIC9EICJKREtfSU5URVJOQUxfTkFNRT1qYXd0IiBcCi0JCQkgIC9EICJKREtfRlRZUEU9MHgyTCIsXAorCQkJICAtRCAiSkRLX0ZOQU1FPWphd3QuZGxsIiBcCisJCQkgIC1EICJKREtfSU5URVJOQUxfTkFNRT1qYXd0IiBcCisJCQkgIC1EICJKREtfRlRZUEU9MHgyTCIsXAogCQlPQkpFQ1RfRElSOj0kKEpES19PVVRQVVRESVIpL29ianMvbGliamF3dCxcCiAJCURFQlVHX1NZTUJPTFM6PSQoV0lORE9XU19PTkxZKSkpCiAKQEAgLTE1ODMsOSArMTYwOSw5IEBACiAJCUxERkxBR1NfU1VGRklYOj0kKExERkxBR1NfSkRLTElCX1NVRkZJWCkgJChMSUJKREJDT0RCQ19TT05BTUUpLFwKIAkJVkVSU0lPTklORk9fUkVTT1VSQ0U6PSQoSkRLX1RPUERJUikvc3JjL3dpbmRvd3MvcmVzb3VyY2UvdmVyc2lvbi5yYyxcCiAJCVJDX0ZMQUdTOj0kKFJDX0ZMQUdTKVwKLQkJCSAgL0QgIkpES19GTkFNRT1KZGJjT2RiYy5kbGwiIFwKLQkJCSAgL0QgIkpES19JTlRFUk5BTF9OQU1FPUpkYmNPZGJjIiBcCi0JCQkgIC9EICJKREtfRlRZUEU9MHgyTCIsXAorCQkJICAtRCAiSkRLX0ZOQU1FPUpkYmNPZGJjLmRsbCIgXAorCQkJICAtRCAiSkRLX0lOVEVSTkFMX05BTUU9SmRiY09kYmMiIFwKKwkJCSAgLUQgIkpES19GVFlQRT0weDJMIixcCiAJCU9CSkVDVF9ESVI6PSQoTElCSkRCQ09EQkNfRElSKSxcCiAJCURFQlVHX1NZTUJPTFM6PSQoV0lORE9XU19PTkxZKSkpCiAKQEAgLTE2OTQsOSArMTcyMCw5IEBACiAJCUxERkxBR1NfU1VGRklYX2xpbnV4Oj0kKExJQlopIC1MICQoSU5TVEFMTF9MSUJSQVJJRVNfSEVSRSkvamxpIC1samxpICQoTElCREwpLFwKIAkJVkVSU0lPTklORk9fUkVTT1VSQ0U6PSQoSkRLX1RPUERJUikvc3JjL3dpbmRvd3MvcmVzb3VyY2UvdmVyc2lvbi5yYyxcCiAJCVJDX0ZMQUdTOj0kKFJDX0ZMQUdTKVwKLQkJCSAgL0QgIkpES19GTkFNRT1pbnN0cnVtZW50LmRsbCIgXAotCQkJICAvRCAiSkRLX0lOVEVSTkFMX05BTUU9aW5zdHJ1bWVudCIgXAotCQkJICAvRCAiSkRLX0ZUWVBFPTB4MkwiLFwKKwkJCSAgLUQgIkpES19GTkFNRT1pbnN0cnVtZW50LmRsbCIgXAorCQkJICAtRCAiSkRLX0lOVEVSTkFMX05BTUU9aW5zdHJ1bWVudCIgXAorCQkJICAtRCAiSkRLX0ZUWVBFPTB4MkwiLFwKIAkJT0JKRUNUX0RJUjo9JChMSUJJTlNUUlVNRU5UX0RJUiksXAogCQlERUJVR19TWU1CT0xTOj10cnVlKSkKIApAQCAtMTc1NSwxNCArMTc4MSwxNCBAQAogCQlNQVBGSUxFOj0kKEpES19UT1BESVIpL21ha2VmaWxlcy9tYXBmaWxlcy9saWJtYW5hZ2VtZW50L21hcGZpbGUtdmVycywgXAogCQlMREZMQUdTOj0kKExERkxBR1NfSkRLTElCKSBcCiAJCQkgJChjYWxsIFNFVF9TSEFSRURfTElCUkFSWV9PUklHSU4pLFwKLQkJTERGTEFHU193aW5kb3dzOj0kKFdJTl9KQVZBX0xJQikganZtLmxpYiBhZHZhcGkzMi5saWIgcHNhcGkubGliLFwKIAkJTERGTEFHU19zb2xhcmlzOj0tbGtzdGF0LFwKIAkJTERGTEFHU19TVUZGSVg6PSQoTERGTEFHU19KREtMSUJfU1VGRklYKSxcCisJCUxERkxBR1NfU1VGRklYX3dpbmRvd3M6PWp2bS5saWIgcHNhcGkubGliICQoV0lOX0pBVkFfTElCKSBhZHZhcGkzMi5saWIsXAogCQlWRVJTSU9OSU5GT19SRVNPVVJDRTo9JChKREtfVE9QRElSKS9zcmMvd2luZG93cy9yZXNvdXJjZS92ZXJzaW9uLnJjLFwKIAkJUkNfRkxBR1M6PSQoUkNfRkxBR1MpXAotCQkJICAvRCAiSkRLX0ZOQU1FPW1hbmFnZW1lbnQuZGxsIiBcCi0JCQkgIC9EICJKREtfSU5URVJOQUxfTkFNRT1tYW5hZ2VtZW50IiBcCi0JCQkgIC9EICJKREtfRlRZUEU9MHgyTCIsXAorCQkJICAtRCAiSkRLX0ZOQU1FPW1hbmFnZW1lbnQuZGxsIiBcCisJCQkgIC1EICJKREtfSU5URVJOQUxfTkFNRT1tYW5hZ2VtZW50IiBcCisJCQkgIC1EICJKREtfRlRZUEU9MHgyTCIsXAogCQlPQkpFQ1RfRElSOj0kKEpES19PVVRQVVRESVIpL29ianMvbGlibWFuYWdlbWVudCxcCiAJCURFQlVHX1NZTUJPTFM6PXRydWUpKQogCkBAIC0xODExLDkgKzE4MzcsOSBAQAogCQlMREZMQUdTX1NVRkZJWDo9JChCVUlMRF9MSUJIUFJPRl9MREZMQUdTKSxcCiAJCVZFUlNJT05JTkZPX1JFU09VUkNFOj0kKEpES19UT1BESVIpL3NyYy93aW5kb3dzL3Jlc291cmNlL3ZlcnNpb24ucmMsXAogCQlSQ19GTEFHUzo9JChSQ19GTEFHUylcCi0JCQkgIC9EICJKREtfRk5BTUU9aHByb2YuZGxsIiBcCi0JCQkgIC9EICJKREtfSU5URVJOQUxfTkFNRT1ocHJvZiIgXAotCQkJICAvRCAiSkRLX0ZUWVBFPTB4MkwiLFwKKwkJCSAgLUQgIkpES19GTkFNRT1ocHJvZi5kbGwiIFwKKwkJCSAgLUQgIkpES19JTlRFUk5BTF9OQU1FPWhwcm9mIiBcCisJCQkgIC1EICJKREtfRlRZUEU9MHgyTCIsXAogCQlPQkpFQ1RfRElSOj0kKEpES19PVVRQVVRESVIpL29ianMvbGliaHByb2ZfanZtdGksXAogCQlERUJVR19TWU1CT0xTOj10cnVlKSkKIApAQCAtMTgzNCw5ICsxODYwLDkgQEAKIAkJCSAkKGNhbGwgU0VUX1NIQVJFRF9MSUJSQVJZX09SSUdJTiksXAogCQlWRVJTSU9OSU5GT19SRVNPVVJDRTo9JChKREtfVE9QRElSKS9zcmMvd2luZG93cy9yZXNvdXJjZS92ZXJzaW9uLnJjLFwKIAkJUkNfRkxBR1M6PSQoUkNfRkxBR1MpXAotCQkJICAvRCAiSkRLX0ZOQU1FPWphdmFfY3J3X2RlbW8uZGxsIiBcCi0JCQkgIC9EICJKREtfSU5URVJOQUxfTkFNRT1qYXZhX2Nyd19kZW1vIiBcCi0JCQkgIC9EICJKREtfRlRZUEU9MHgyTCIsXAorCQkJICAtRCAiSkRLX0ZOQU1FPWphdmFfY3J3X2RlbW8uZGxsIiBcCisJCQkgIC1EICJKREtfSU5URVJOQUxfTkFNRT1qYXZhX2Nyd19kZW1vIiBcCisJCQkgIC1EICJKREtfRlRZUEU9MHgyTCIsXAogCQlPQkpFQ1RfRElSOj0kKEpES19PVVRQVVRESVIpL29ianMvbGliamF2YV9jcndfZGVtbyxcCiAJCURFQlVHX1NZTUJPTFM6PXRydWUpKQogCkBAIC0xODYwLDkgKzE4ODYsOSBAQAogCQlMREZMQUdTX1NVRkZJWF93aW5kb3dzOj0tZXhwb3J0Om5wdEluaXRpYWxpemUgLWV4cG9ydDpucHRUZXJtaW5hdGUsXAogCQlWRVJTSU9OSU5GT19SRVNPVVJDRTo9JChKREtfVE9QRElSKS9zcmMvd2luZG93cy9yZXNvdXJjZS92ZXJzaW9uLnJjLFwKIAkJUkNfRkxBR1M6PSQoUkNfRkxBR1MpXAotCQkJICAvRCAiSkRLX0ZOQU1FPW5wdC5kbGwiIFwKLQkJCSAgL0QgIkpES19JTlRFUk5BTF9OQU1FPW5wdCIgXAotCQkJICAvRCAiSkRLX0ZUWVBFPTB4MkwiLFwKKwkJCSAgLUQgIkpES19GTkFNRT1ucHQuZGxsIiBcCisJCQkgIC1EICJKREtfSU5URVJOQUxfTkFNRT1ucHQiIFwKKwkJCSAgLUQgIkpES19GVFlQRT0weDJMIixcCiAJCU9CSkVDVF9ESVI6PSQoSkRLX09VVFBVVERJUikvb2Jqcy9saWJucHQsXAogCQlERUJVR19TWU1CT0xTOj10cnVlKSkKIApAQCAtMTg3MywxMCArMTg5OSwxNCBAQAogTElCTkVUX1NSQ19ESVJTOj0kKEpES19UT1BESVIpL3NyYy9zaGFyZS9uYXRpdmUvamF2YS9uZXQgXAogICAgICAgICAgICAgICAgICAgICQoSkRLX1RPUERJUikvc3JjLyQoT1BFTkpES19UQVJHRVRfT1NfQVBJX0RJUikvbmF0aXZlL2phdmEvbmV0IFwKICAgICAgICAgICAgICAgICAgICAkKEpES19UT1BESVIpL3NyYy8kKE9QRU5KREtfVEFSR0VUX09TX0FQSV9ESVIpL25hdGl2ZS9zdW4vbmV0L2RucyBcCi0gICAgICAgICAgICAgICAgICAgJChKREtfVE9QRElSKS9zcmMvJChPUEVOSkRLX1RBUkdFVF9PU19BUElfRElSKS9uYXRpdmUvc3VuL25ldC93d3cvcHJvdG9jb2wvaHR0cC9udGxtIFwKLSAgICAgICAgICAgICAgICAgICAkKEpES19UT1BESVIpL3NyYy8kKE9QRU5KREtfVEFSR0VUX09TX0FQSV9ESVIpL25hdGl2ZS9zdW4vbmV0L3NkcCBcCiAgICAgICAgICAgICAgICAgICAgJChKREtfVE9QRElSKS9zcmMvJChPUEVOSkRLX1RBUkdFVF9PU19BUElfRElSKS9uYXRpdmUvc3VuL25ldC9zcGkKIAoraWZlcSAoJChPUEVOSkRLX1RBUkdFVF9PUyksd2luZG93cykKKyAgICBMSUJORVRfU1JDX0RJUlMrPSQoSkRLX1RPUERJUikvc3JjLyQoT1BFTkpES19UQVJHRVRfT1NfQVBJX0RJUikvbmF0aXZlL3N1bi9uZXQvd3d3L3Byb3RvY29sL2h0dHAvbnRsbQorZWxzZQorICAgIExJQk5FVF9TUkNfRElSUys9JChKREtfVE9QRElSKS9zcmMvJChPUEVOSkRLX1RBUkdFVF9PU19BUElfRElSKS9uYXRpdmUvc3VuL25ldC9zZHAKK2VuZGlmCisKIExJQk5FVF9DRkxBR1M6PSQoZm9yZWFjaCBkaXIsJChMSUJORVRfU1JDX0RJUlMpLC1JJChkaXIpKQogCiBMSUJORVRfRVhDTFVERV9GSUxFUzo9CkBAIC0xOTExLDE0ICsxOTQxLDE0IEBACiAJCUxERkxBR1NfU1VGRklYX21hY29zeDo9LWxqdm0gLWxqYXZhLFwKIAkJTERGTEFHU19TVUZGSVhfc29sYXJpczo9LWxqdm0gLWxqYXZhIC1sbnNsIC1sc29ja2V0ICQoTElCREwpICxcCiAJCUxERkxBR1NfU1VGRklYX2xpbnV4Oj0kKExJQkRMKSAtbGp2bSAtbHB0aHJlYWQgLWxqYXZhLFwKLQkJTERGTEFHU19TVUZGSVhfd2luZG93czo9d3MyXzMyLmxpYiAkKEpWTUxJQikgc2VjdXIzMi5saWIgaXBobHBhcGkubGliIFwKLQkJCQkJICBkZWxheWltcC5saWIgJChXSU5fSkFWQV9MSUIpIGp2bS5saWIgYWR2YXBpMzIubGliIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC9ERUxBWUxPQUQ6c2VjdXIzMi5kbGwgL0RFTEFZTE9BRDppcGhscGFwaS5kbGwsIFwKKwkJTERGTEFHU19TVUZGSVhfd2luZG93czo9d3MyXzMyLmxpYiBqdm0ubGliIHNlY3VyMzIubGliIGlwaGxwYXBpLmxpYiBcCisJCQkJCWRlbGF5aW1wLmxpYiAkKFdJTl9KQVZBX0xJQikgYWR2YXBpMzIubGliIFwKKwkJCQkJLURFTEFZTE9BRDpzZWN1cjMyLmRsbCAtREVMQVlMT0FEOmlwaGxwYXBpLmRsbCwgXAogCQlWRVJTSU9OSU5GT19SRVNPVVJDRTo9JChKREtfVE9QRElSKS9zcmMvd2luZG93cy9yZXNvdXJjZS92ZXJzaW9uLnJjLFwKIAkJUkNfRkxBR1M6PSQoUkNfRkxBR1MpXAotCQkJICAvRCAiSkRLX0ZOQU1FPW5ldC5kbGwiIFwKLQkJCSAgL0QgIkpES19JTlRFUk5BTF9OQU1FPW5ldCIgXAotCQkJICAvRCAiSkRLX0ZUWVBFPTB4MkwiLFwKKwkJCSAgLUQgIkpES19GTkFNRT1uZXQuZGxsIiBcCisJCQkgIC1EICJKREtfSU5URVJOQUxfTkFNRT1uZXQiIFwKKwkJCSAgLUQgIkpES19GVFlQRT0weDJMIixcCiAJCU9CSkVDVF9ESVI6PSQoSkRLX09VVFBVVERJUikvb2Jqcy9saWJuZXQsXAogCQlERUJVR19TWU1CT0xTOj0kKFdJTkRPV1NfT05MWSkpKQogCkBAIC0xOTI3LDcgKzE5NTcsNyBAQAogQlVJTERfTElCUkFSSUVTICs9ICQoQlVJTERfTElCTkVUKQogCiAkKEpES19PVVRQVVRESVIpL2xpYi9uZXQucHJvcGVydGllczogJChKREtfVE9QRElSKS9zcmMvc2hhcmUvbGliL25ldC5wcm9wZXJ0aWVzCi0JJChFQ0hPKSBDb3B5aW5nICQoQEYpCisJJChFQ0hPKSAkKExPR19JTkZPKSBDb3B5aW5nICQoQEYpCiAJJChNS0RJUikgLXAgJChARCkKIAkkKENQKSAkPCAkQAogCkBAIC0xOTM1LDcgKzE5NjUsNyBAQAogCiBpZmVxICgkKE9QRU5KREtfVEFSR0VUX09TKSwgc29sYXJpcykKICQoSkRLX09VVFBVVERJUikvbGliL3NkcC9zZHAuY29uZi50ZW1wbGF0ZSA6ICQoSkRLX1RPUERJUikvc3JjLyR7T1BFTkpES19UQVJHRVRfT1NfQVBJX0RJUn0vbGliL3NkcC9zZHAuY29uZi50ZW1wbGF0ZQotCSQoRUNITykgQ29weWluZyAkKEBGKQorCSQoRUNITykgJChMT0dfSU5GTykgQ29weWluZyAkKEBGKQogCSQoTUtESVIpIC1wICQoQEQpCiAJJChDUCkgJDwgJEAKIApAQCAtMjA0NywxOCArMjA3NywxOCBAQAogCQlMREZMQUdTX1NVRkZJWF9saW51eDo9LWxqYXZhIC1sbmV0IC1scHRocmVhZCAkKExJQkRMKSxcCiAJCUxERkxBR1NfU1VGRklYX3NvbGFyaXM6PS1sanZtIC1sc29ja2V0IC1scG9zaXg0ICQoTElCREwpIFwKIAkJCQkgICAgICAgIC1sc2VuZGZpbGUgLWxqYXZhIC1sbmV0IC1sYyxcCi0JCUxERkxBR1NfU1VGRklYX3dpbmRvd3M6PSQoTERGTEFHU19KREtMSUJfU1VGRklYKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChXSU5fSkFWQV9MSUIpICQoSkRLX09VVFBVVERJUikvb2Jqcy9saWJuZXQvbmV0LmxpYiBcCi0JCQkJCWFkdmFwaTMyLmxpYiBqdm0ubGliIHdzMl8zMi5saWJcCisJCUxERkxBR1NfU1VGRklYX3dpbmRvd3M6PWp2bS5saWIgd3MyXzMyLmxpYiAkKFdJTl9KQVZBX0xJQikgXAorCQkJCQkkKEpES19PVVRQVVRESVIpL29ianMvbGlibmV0L25ldC5saWIgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoSkRLX09VVFBVVERJUikvb2Jqcy9saWJqYXZhL2lvX3V0aWwub2JqIFwKLQkJICAgICAgICAgICAgICAgICAgICAgICAgJChKREtfT1VUUFVURElSKS9vYmpzL2xpYmphdmEvRmlsZURlc2NyaXB0b3JfbWQub2JqICxcCisJCSAgICAgICAgICAgICAgICAgICAgICAgICQoSkRLX09VVFBVVERJUikvb2Jqcy9saWJqYXZhL0ZpbGVEZXNjcmlwdG9yX21kLm9iaiBcCisJCQkJCWFkdmFwaTMyLmxpYixcCiAJCUxERkxBR1NfU1VGRklYX21hY29zeDo9LWxqYXZhIC1sbmV0IC1wdGhyZWFkIC1mcmFtZXdvcmsgQ29yZUZvdW5kYXRpb24sXAogCQlMREZMQUdTX1NVRkZJWDo9LFwKIAkJVkVSU0lPTklORk9fUkVTT1VSQ0U6PSQoSkRLX1RPUERJUikvc3JjL3dpbmRvd3MvcmVzb3VyY2UvdmVyc2lvbi5yYyxcCiAJCVJDX0ZMQUdTOj0kKFJDX0ZMQUdTKVwKLQkJCSAgL0QgIkpES19GTkFNRT1uaW8uZGxsIiBcCi0JCQkgIC9EICJKREtfSU5URVJOQUxfTkFNRT1uaW8iIFwKLQkJCSAgL0QgIkpES19GVFlQRT0weDJMIixcCisJCQkgIC1EICJKREtfRk5BTUU9bmlvLmRsbCIgXAorCQkJICAtRCAiSkRLX0lOVEVSTkFMX05BTUU9bmlvIiBcCisJCQkgIC1EICJKREtfRlRZUEU9MHgyTCIsXAogCQlPQkpFQ1RfRElSOj0kKEpES19PVVRQVVRESVIpL29ianMvbGlibmlvLFwKIAkJREVCVUdfU1lNQk9MUzo9JChXSU5ET1dTX09OTFkpKSkKIApAQCAtMjIxOCw5ICsyMjQ4LDkgQEAKIAkJCXVzZXIzMi5saWIsXAogCQlWRVJTSU9OSU5GT19SRVNPVVJDRTo9JChKREtfVE9QRElSKS9zcmMvd2luZG93cy9yZXNvdXJjZS92ZXJzaW9uLnJjLFwKIAkJUkNfRkxBR1M6PSQoUkNfRkxBR1MpIFwKLQkJCSAgL0QgIkpES19GTkFNRT1qbGkuZGxsIiBcCi0JCQkgIC9EICJKREtfSU5URVJOQUxfTkFNRT1qbGkiIFwKLQkJCSAgL0QgIkpES19GVFlQRT0weDJMIixcCisJCQkgIC1EICJKREtfRk5BTUU9amxpLmRsbCIgXAorCQkJICAtRCAiSkRLX0lOVEVSTkFMX05BTUU9amxpIiBcCisJCQkgIC1EICJKREtfRlRZUEU9MHgyTCIsXAogCQlPQkpFQ1RfRElSOj0kKEpES19PVVRQVVRESVIpL29ianMvbGliamxpLFwKIAkJREVCVUdfU1lNQk9MUzo9JChXSU5ET1dTX09OTFkpKSkKIApAQCAtMjI2Nyw2ICsyMjk3LDcgQEAKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKK2lmbmRlZiBPUEVOSkRLCiBpZmVxICgkKEVOQUJMRV9KRlIpLCB0cnVlKQogCiAkKGV2YWwgJChjYWxsIFNldHVwTmF0aXZlQ29tcGlsYXRpb24sQlVJTERfTElCSkZSLFwKQEAgLTIyODIsMTUgKzIzMTMsMTYgQEAKIAkJCSAkKGNhbGwgU0VUX1NIQVJFRF9MSUJSQVJZX09SSUdJTiksXAogCQlWRVJTSU9OSU5GT19SRVNPVVJDRTo9JChKREtfVE9QRElSKS9zcmMvd2luZG93cy9yZXNvdXJjZS92ZXJzaW9uLnJjLFwKIAkJUkNfRkxBR1M6PSQoUkNfRkxBR1MpXAotCQkJICAvRCAiSkRLX0ZOQU1FPWpmci5kbGwiIFwKLQkJCSAgL0QgIkpES19JTlRFUk5BTF9OQU1FPWpmciIgXAotCQkJICAvRCAiSkRLX0ZUWVBFPTB4MkwiLFwKKwkJCSAgLUQgIkpES19GTkFNRT1qZnIuZGxsIiBcCisJCQkgIC1EICJKREtfSU5URVJOQUxfTkFNRT1qZnIiIFwKKwkJCSAgLUQgIkpES19GVFlQRT0weDJMIixcCiAJCU9CSkVDVF9ESVI6PSQoSkRLX09VVFBVVERJUikvb2Jqcy9saWJqZnIsXAogCQlERUJVR19TWU1CT0xTOj0kKFdJTkRPV1NfT05MWSkpKQogCiBCVUlMRF9MSUJSQVJJRVMgKz0gJChCVUlMRF9MSUJKRlIpCiAKIGVuZGlmCitlbmRpZgogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIApAQCAtMjMzMiw5ICsyMzY0LDkgQEAKIAkJVkVSU0lPTklORk9fUkVTT1VSQ0U6PSQoSkRLX1RPUERJUikvc3JjL2Nsb3NlZC9zaGFyZS9uYXRpdmUvc3VuL2phdmEyZC9jbW0va2Ntcy9jbW0ucmMsXAogCQlWRVJTSU9OSU5GT19SRVNPVVJDRTo9JChKREtfVE9QRElSKS9zcmMvY2xvc2VkL3NoYXJlL25hdGl2ZS9zdW4vamF2YTJkL2NtbS9rY21zL2NtbS5yYyxcCiAJCVJDX0ZMQUdTOj0kKFJDX0ZMQUdTKVwKLQkJCSAgL0QgIkpES19GTkFNRT1rY21zLmRsbCIgXAotCQkJICAvRCAiSkRLX0lOVEVSTkFMX05BTUU9a2NtcyIgXAotCQkJICAvRCAiSkRLX0ZUWVBFPTB4MkwiLFwKKwkJCSAgLUQgIkpES19GTkFNRT1rY21zLmRsbCIgXAorCQkJICAtRCAiSkRLX0lOVEVSTkFMX05BTUU9a2NtcyIgXAorCQkJICAtRCAiSkRLX0ZUWVBFPTB4MkwiLFwKIAkJT0JKRUNUX0RJUjo9JChKREtfT1VUUFVURElSKS9vYmpzL2xpYmtjbXMsXAogCQlERUJVR19TWU1CT0xTOj0kKFdJTkRPV1NfT05MWSkpKQogCkBAIC0yNjE0LDcgKzI2NDYsNyBAQAogZWxzZSBpZm5lcSAoJChPUEVOSkRLX1RBUkdFVF9PUyksIHdpbmRvd3MpCiAJTElCU1BMQVNIU0NSRUVOX0xERkxBR1NfU1VGRklYICs9IC1MJChPUEVOV0lOX0xJQikkKE9QRU5KREtfVEFSR0VUX0NQVV9JU0FESVIpIC1sWDExIC1sWGV4dCAkKExJQk0pIC1scHRocmVhZAogZWxzZSAjIE9QRU5KREtfVEFSR0VUX09TCi0JTElCU1BMQVNIU0NSRUVOX0xERkxBR1NfU1VGRklYICs9IGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiBkZWxheWltcC5saWIgL0RFTEFZTE9BRDp1c2VyMzIuZGxsCisJTElCU1BMQVNIU0NSRUVOX0xERkxBR1NfU1VGRklYICs9IGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiBkZWxheWltcC5saWIgLURFTEFZTE9BRDp1c2VyMzIuZGxsCiBlbmRpZiAjIE9QRU5KREtfVEFSR0VUX09TCiAKICQoZXZhbCAkKGNhbGwgU2V0dXBOYXRpdmVDb21waWxhdGlvbixMSUJTUExBU0hTQ1JFRU4sXApAQCAtMjYzMSw5ICsyNjYzLDkgQEAKIAkJTERGTEFHU19TVUZGSVg6PSQoTElCU1BMQVNIU0NSRUVOX0xERkxBR1NfU1VGRklYKSAkKExJQlopLFwKIAkJVkVSU0lPTklORk9fUkVTT1VSQ0U6PSQoSkRLX1RPUERJUikvc3JjL3dpbmRvd3MvcmVzb3VyY2UvdmVyc2lvbi5yYyxcCiAJCVJDX0ZMQUdTOj0kKFJDX0ZMQUdTKVwKLQkJCSAgL0QgIkpES19GTkFNRT1zcGxhc2hzY3JlZW4uZGxsIiBcCi0JCQkgIC9EICJKREtfSU5URVJOQUxfTkFNRT1zcGxhc2hzY3JlZW4iIFwKLQkJCSAgL0QgIkpES19GVFlQRT0weDJMIixcCisJCQkgIC1EICJKREtfRk5BTUU9c3BsYXNoc2NyZWVuLmRsbCIgXAorCQkJICAtRCAiSkRLX0lOVEVSTkFMX05BTUU9c3BsYXNoc2NyZWVuIiBcCisJCQkgIC1EICJKREtfRlRZUEU9MHgyTCIsXAogCQlPQkpFQ1RfRElSOj0kKEpES19PVVRQVVRESVIpL29ianMvbGlic3BsYXNoc2NyZWVuLFwKIAkJREVCVUdfU1lNQk9MUzo9JChXSU5ET1dTX09OTFkpKSkKIApAQCAtMjY3Myw5ICsyNzA1LDkgQEAKIAkJTERGTEFHU19TVUZGSVhfcG9zaXg6PS1sbSxcCiAJCVZFUlNJT05JTkZPX1JFU09VUkNFOj0kKEpES19UT1BESVIpL3NyYy93aW5kb3dzL3Jlc291cmNlL3ZlcnNpb24ucmMsXAogCQlSQ19GTEFHUzo9JChSQ19GTEFHUylcCi0JCQkgIC9EICJKREtfRk5BTUU9ZGNwci5kbGwiIFwKLQkJCSAgL0QgIkpES19JTlRFUk5BTF9OQU1FPWRjcHIiIFwKLQkJCSAgL0QgIkpES19GVFlQRT0weDJMIixcCisJCQkgIC1EICJKREtfRk5BTUU9ZGNwci5kbGwiIFwKKwkJCSAgLUQgIkpES19JTlRFUk5BTF9OQU1FPWRjcHIiIFwKKwkJCSAgLUQgIkpES19GVFlQRT0weDJMIixcCiAJCU9CSkVDVF9ESVI6PSQoSkRLX09VVFBVVERJUikvb2Jqcy9saWJkY3ByLFwKIAkJREVCVUdfU1lNQk9MUzo9JChXSU5ET1dTX09OTFkpKSkKIApAQCAtMjcwNiw5ICsyNzM4LDkgQEAKIAkJTERGTEFHU19TVUZGSVhfd2luZG93czo9d2luc2NhcmQubGliLFwKIAkJVkVSU0lPTklORk9fUkVTT1VSQ0U6PSQoSkRLX1RPUERJUikvc3JjL3dpbmRvd3MvcmVzb3VyY2UvdmVyc2lvbi5yYyxcCiAJCVJDX0ZMQUdTOj0kKFJDX0ZMQUdTKVwKLQkJCSAgL0QgIkpES19GTkFNRT1qMnBjc2MuZGxsIiBcCi0JCQkgIC9EICJKREtfSU5URVJOQUxfTkFNRT1qMnBjc2MiIFwKLQkJCSAgL0QgIkpES19GVFlQRT0weDJMIixcCisJCQkgIC1EICJKREtfRk5BTUU9ajJwY3NjLmRsbCIgXAorCQkJICAtRCAiSkRLX0lOVEVSTkFMX05BTUU9ajJwY3NjIiBcCisJCQkgIC1EICJKREtfRlRZUEU9MHgyTCIsXAogCQlPQkpFQ1RfRElSOj0kKEpES19PVVRQVVRESVIpL29ianMvbGliajJwY3NjLFwKIAkJREVCVUdfU1lNQk9MUzo9JChXSU5ET1dTX09OTFkpKSkKIApAQCAtMjc0MywxMCArMjc3NSw5IEBACiAgICAgIEJVSUxEX0xJQktSQjVfTkFNRTo9dzJrX2xzYV9hdXRoCiAgICAgIEJVSUxEX0xJQktSQjVfRklMRVM6PU5hdGl2ZUNyZWRzLmMgV2luZG93c0RpcmVjdG9yeS5jCiAgICAgIEJVSUxEX0xJQktSQjVfU1JDOj0kKEpES19UT1BESVIpL3NyYy8kKE9QRU5KREtfVEFSR0VUX09TX0FQSV9ESVIpL25hdGl2ZS9zdW4vc2VjdXJpdHkva3JiNQotICAgICBCVUlMRF9MSUJLUkI1X0xJQlM6PVNlY3VyMzIubGliIG5ldGFwaTMyLmxpYiBcCi0Ja2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgXAotCWFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgXAotCW9kYmNjcDMyLmxpYiB3c29jazMyLmxpYgorICAgICBCVUlMRF9MSUJLUkI1X0xJQlM6PWFkdmFwaTMyLmxpYiBTZWN1cjMyLmxpYiBuZXRhcGkzMi5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgXAorCQkJIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBcCisJCQkgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiB3c29jazMyLmxpYgogZWxzZSBpZmVxICgkKE9QRU5KREtfVEFSR0VUX09TKSwgbWFjb3N4KQogICAgICBCVUlMRF9MSUJLUkI1X05BTUU6PW9zeGtyYjUKICAgICAgQlVJTERfTElCS1JCNV9GSUxFUzo9bmF0aXZlY2NhY2hlLmMKQEAgLTI3NzAsOSArMjgwMSw5IEBACiAJCUxERkxBR1NfU1VGRklYOj0kKEJVSUxEX0xJQktSQjVfTElCUykgLFwKIAkJVkVSU0lPTklORk9fUkVTT1VSQ0U6PSQoSkRLX1RPUERJUikvc3JjL3dpbmRvd3MvcmVzb3VyY2UvdmVyc2lvbi5yYyxcCiAJCVJDX0ZMQUdTOj0kKFJDX0ZMQUdTKVwKLQkJCSAgL0QgIkpES19GTkFNRT0kKEJVSUxEX0xJQktSQjVfTkFNRSkuZGxsIiBcCi0JCQkgIC9EICJKREtfSU5URVJOQUxfTkFNRT0kKEJVSUxEX0xJQktSQjVfTkFNRSkiIFwKLQkJCSAgL0QgIkpES19GVFlQRT0weDJMIixcCisJCQkgIC1EICJKREtfRk5BTUU9JChCVUlMRF9MSUJLUkI1X05BTUUpLmRsbCIgXAorCQkJICAtRCAiSkRLX0lOVEVSTkFMX05BTUU9JChCVUlMRF9MSUJLUkI1X05BTUUpIiBcCisJCQkgIC1EICJKREtfRlRZUEU9MHgyTCIsXAogCQlPQkpFQ1RfRElSOj0kKEpES19PVVRQVVRESVIpL29ianMvbGlia3JiNSxcCiAJCURFQlVHX1NZTUJPTFM6PSQoV0lORE9XU19PTkxZKSkpCiAKQEAgLTI3ODYsMjIgKzI4MTcsMjAgQEAKICQoZXZhbCAkKGNhbGwgU2V0dXBOYXRpdmVDb21waWxhdGlvbixCVUlMRF9MSUJTVU5NU0NBUEksXAogCQlMSUJSQVJZOj1zdW5tc2NhcGksXAogICAgICAgICAgICAgICAgIE9VVFBVVF9ESVI6PSQoSU5TVEFMTF9MSUJSQVJJRVNfSEVSRSksXAotCQlTUkM6PSQoSkRLX1RPUERJUikvc3JjL3NoYXJlL25hdGl2ZS9zdW4vc2VjdXJpdHkvbXNjYXBpIFwKLQkJICAgICAkKEpES19UT1BESVIpL3NyYy8kKE9QRU5KREtfVEFSR0VUX09TX0FQSV9ESVIpL25hdGl2ZS9zdW4vc2VjdXJpdHkvbXNjYXBpLFwKKwkJU1JDOj0kKEpES19UT1BESVIpL3NyYy8kKE9QRU5KREtfVEFSR0VUX09TX0FQSV9ESVIpL25hdGl2ZS9zdW4vc2VjdXJpdHkvbXNjYXBpLFwKIAkJSU5DTFVERV9GSUxFUzo9c2VjdXJpdHkuY3BwLCBcCiAJCUxBTkc6PUMrKyxcCiAJCU9QVElNSVpBVElPTjo9TE9XLCBcCiAJCUNGTEFHUzo9JChDRkxBR1NfSkRLTElCKSBcCi0JCSAgICAgICAgLUkkKEpES19UT1BESVIpL3NyYy9zaGFyZS9uYXRpdmUvc3VuL3NlY3VyaXR5L21zY2FwaSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAtSSQoSkRLX1RPUERJUikvc3JjLyQoT1BFTkpES19UQVJHRVRfT1NfQVBJX0RJUikvbmF0aXZlL3N1bi9zZWN1cml0eS9tc2NhcGkgLFwKIAkJTERGTEFHUzo9JChMREZMQUdTX0pES0xJQikgJChMREZMQUdTX0NYWF9KREspIFwKIAkJCSAkKGNhbGwgU0VUX1NIQVJFRF9MSUJSQVJZX09SSUdJTiksXAogCQlMREZMQUdTX1NVRkZJWDo9Q3J5cHQzMi5MaWIgYWR2YXBpMzIubGliLFwKIAkJVkVSU0lPTklORk9fUkVTT1VSQ0U6PSQoSkRLX1RPUERJUikvc3JjL3dpbmRvd3MvcmVzb3VyY2UvdmVyc2lvbi5yYyxcCiAJCVJDX0ZMQUdTOj0kKFJDX0ZMQUdTKVwKLQkJCSAgL0QgIkpES19GTkFNRT1zdW5tc2NhcGkuZGxsIiBcCi0JCQkgIC9EICJKREtfSU5URVJOQUxfTkFNRT1zdW5tc2NhcGkiIFwKLQkJCSAgL0QgIkpES19GVFlQRT0weDJMIixcCisJCQkgIC1EICJKREtfRk5BTUU9c3VubXNjYXBpLmRsbCIgXAorCQkJICAtRCAiSkRLX0lOVEVSTkFMX05BTUU9c3VubXNjYXBpIiBcCisJCQkgIC1EICJKREtfRlRZUEU9MHgyTCIsXAogCQlPQkpFQ1RfRElSOj0kKEpES19PVVRQVVRESVIpL29ianMvbGlic3VubXNjYXBpLFwKIAkJREVCVUdfU1lNQk9MUzo9JChXSU5ET1dTX09OTFkpKSkKIApAQCAtMjgzMCw5ICsyODU5LDkgQEAKIAkJTERGTEFHU19TVUZGSVhfcG9zaXg6PSQoTElCREwpLCBcCiAJCVZFUlNJT05JTkZPX1JFU09VUkNFOj0kKEpES19UT1BESVIpL3NyYy93aW5kb3dzL3Jlc291cmNlL3ZlcnNpb24ucmMsXAogCQlSQ19GTEFHUzo9JChSQ19GTEFHUylcCi0JCQkgIC9EICJKREtfRk5BTUU9ajJwa2NzMTEuZGxsIiBcCi0JCQkgIC9EICJKREtfSU5URVJOQUxfTkFNRT1qMnBrY3MxMSIgXAotCQkJICAvRCAiSkRLX0ZUWVBFPTB4MkwiLFwKKwkJCSAgLUQgIkpES19GTkFNRT1qMnBrY3MxMS5kbGwiIFwKKwkJCSAgLUQgIkpES19JTlRFUk5BTF9OQU1FPWoycGtjczExIiBcCisJCQkgIC1EICJKREtfRlRZUEU9MHgyTCIsXAogCQlPQkpFQ1RfRElSOj0kKEpES19PVVRQVVRESVIpL29ianMvbGliajJwa2NzMTEsXAogCQlERUJVR19TWU1CT0xTOj0kKFdJTkRPV1NfT05MWSkpKQogCkBAIC0yODc5LDkgKzI5MDgsOSBAQAogICAgICAgICAgICAgICAgIExERkxBR1NfU1VGRklYX3NvbGFyaXM6PS1sYyAsXAogCQlWRVJTSU9OSU5GT19SRVNPVVJDRTo9JChKREtfVE9QRElSKS9zcmMvd2luZG93cy9yZXNvdXJjZS92ZXJzaW9uLnJjLFwKIAkJUkNfRkxBR1M6PSQoUkNfRkxBR1MpXAotCQkJICAvRCAiSkRLX0ZOQU1FPXN1bmVjLmRsbCIgXAotCQkJICAvRCAiSkRLX0lOVEVSTkFMX05BTUU9c3VuZWMiIFwKLQkJCSAgL0QgIkpES19GVFlQRT0weDJMIixcCisJCQkgIC1EICJKREtfRk5BTUU9c3VuZWMuZGxsIiBcCisJCQkgIC1EICJKREtfSU5URVJOQUxfTkFNRT1zdW5lYyIgXAorCQkJICAtRCAiSkRLX0ZUWVBFPTB4MkwiLFwKIAkJT0JKRUNUX0RJUjo9JChKREtfT1VUUFVURElSKS9vYmpzL2xpYnN1bmVjLFwKIAkJREVCVUdfU1lNQk9MUzo9JChXSU5ET1dTX09OTFkpKSkKIApAQCAtMzAxOSwxMyArMzA0OCwxMyBAQAogCQkJCS1mcmFtZXdvcmsgQ29yZVNlcnZpY2VzIC1mcmFtZXdvcmsgQXVkaW9Vbml0ICQoTElCQ1hYKSBcCiAJCQkJLWZyYW1ld29yayBDb3JlTUlESSAtZnJhbWV3b3JrIEF1ZGlvVG9vbGJveCxcCiAJCUxERkxBR1Nfd2luZG93czo9JChXSU5fSkFWQV9MSUIpIGFkdmFwaTMyLmxpYiB3aW5tbS5saWIsXAotCQlMREZMQUdTX1NVRkZJWDo9LWxqYXZhIC1sanZtLFwKKwkJTERGTEFHU19TVUZGSVhfcG9zaXg6PS1samF2YSAtbGp2bSxcCiAJCUxERkxBR1NfU1VGRklYX3NvbGFyaXM6PS1sYyAsXAogCQlWRVJTSU9OSU5GT19SRVNPVVJDRTo9JChKREtfVE9QRElSKS9zcmMvd2luZG93cy9yZXNvdXJjZS92ZXJzaW9uLnJjLFwKIAkJUkNfRkxBR1M6PSQoUkNfRkxBR1MpXAotCQkJICAvRCAiSkRLX0ZOQU1FPWpzb3VuZC5kbGwiIFwKLQkJCSAgL0QgIkpES19JTlRFUk5BTF9OQU1FPWpzb3VuZCIgXAotCQkJICAvRCAiSkRLX0ZUWVBFPTB4MkwiLFwKKwkJCSAgLUQgIkpES19GTkFNRT1qc291bmQuZGxsIiBcCisJCQkgIC1EICJKREtfSU5URVJOQUxfTkFNRT1qc291bmQiIFwKKwkJCSAgLUQgIkpES19GVFlQRT0weDJMIixcCiAJCU9CSkVDVF9ESVI6PSQoSkRLX09VVFBVVERJUikvb2Jqcy9saWJqc291bmQsXAogCQlERUJVR19TWU1CT0xTOj0kKFdJTkRPV1NfT05MWSkpKQogCkBAIC0zMDkwLDkgKzMxMTksOSBAQAogCQlMREZMQUdTX1NVRkZJWDo9JChMREZMQUdTX0pES0xJQl9TVUZGSVgpIGRzb3VuZC5saWIgd2lubW0ubGliIHVzZXIzMi5saWIgb2xlMzIubGliLFwKIAkJVkVSU0lPTklORk9fUkVTT1VSQ0U6PSQoSkRLX1RPUERJUikvc3JjL3dpbmRvd3MvcmVzb3VyY2UvdmVyc2lvbi5yYyxcCiAJCVJDX0ZMQUdTOj0kKFJDX0ZMQUdTKVwKLQkJCSAgL0QgIkpES19GTkFNRT1qc291bmRkcy5kbGwiIFwKLQkJCSAgL0QgIkpES19JTlRFUk5BTF9OQU1FPWpzb3VuZGRzIiBcCi0JCQkgIC9EICJKREtfRlRZUEU9MHgyTCIsXAorCQkJICAtRCAiSkRLX0ZOQU1FPWpzb3VuZGRzLmRsbCIgXAorCQkJICAtRCAiSkRLX0lOVEVSTkFMX05BTUU9anNvdW5kZHMiIFwKKwkJCSAgLUQgIkpES19GVFlQRT0weDJMIixcCiAJCU9CSkVDVF9ESVI6PSQoSkRLX09VVFBVVERJUikvb2Jqcy9saWJqc291bmRkcyxcCiAJCURFQlVHX1NZTUJPTFM6PSQoV0lORE9XU19PTkxZKSkpCiAKQEAgLTMxODIsNiArMzIxMSw3IEBACiAJCU9QVElNSVpBVElPTjo9TE9XLCBcCiAJCUNGTEFHUzo9JChDRkxBR1NfSkRLTElCKSBcCiAJCQktSSQoSkRLX1RPUERJUikvc3JjL21hY29zeC9uYXRpdmUvc3VuL29zeGFwcCBcCisJCQktSSQoSkRLX09VVFBVVERJUikvZ2Vuc3JjL3N1bi9vc3hhcHAgXAogICAgICAgICAgICAgICAgICAgICAgICAgLUYvU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3Jrcy9KYXZhVk0uZnJhbWV3b3JrL0ZyYW1ld29ya3MgXAogICAgICAgICAgICAgICAgICAgICAgICAgLUYvU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3Jrcy9BcHBsaWNhdGlvblNlcnZpY2VzLmZyYW1ld29yay9GcmFtZXdvcmtzLFwKIAkJTERGTEFHUzo9JChMREZMQUdTX0pES0xJQilcCkBAIC0zMzU0LDYgKzMzODQsOCBAQAogCQlJTkNMVURFX0ZJTEVTOj0kKExJQkFXVF9MV0FXVF9GSUxFUyksXAogCQlPUFRJTUlaQVRJT046PUxPVywgXAogCQlDRkxBR1M6PSQoQ0ZMQUdTX0pES0xJQikgXAorICAgICAgICAgICAgICAgICAgICAgICAgJChYX0NGTEFHUykgXAorICAgICAgICAgICAgICAgICAgICAgICAgJChYX0xJQlMpIFwKICAgICAgICAgICAgICAgICAgICAgICAgICQoZm9yZWFjaCBkaXIsJChMSUJBV1RfTFdBV1RfRElSUyksLUkkKGRpcikpIFwKICAgICAgICAgICAgICAgICAgICAgICAgIC1JJChKREtfVE9QRElSKS9zcmMvbWFjb3N4L25hdGl2ZS9zdW4vb3N4YXBwIFwKICAgICAgICAgICAgICAgICAgICAgICAgIC1JJChKREtfVE9QRElSKS9zcmMvc2hhcmUvbmF0aXZlL3N1bi9qYXZhMmQgXApkaWZmIC0tZ2l0IGEvamRrL21ha2VmaWxlcy9Db3B5RmlsZXMuZ21rIGIvamRrL21ha2VmaWxlcy9Db3B5RmlsZXMuZ21rCmluZGV4IGI1MmE0MTEuLmUwYzhkNjIgMTAwNjQ0Ci0tLSBhL2pkay9tYWtlZmlsZXMvQ29weUZpbGVzLmdtaworKysgYi9qZGsvbWFrZWZpbGVzL0NvcHlGaWxlcy5nbWsKQEAgLTI2MywxNiArMjYzLDE2IEBACiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCi0jIENvcHkgbXN2Y3IxMDAuZGxsIG9uIHdpbmRvd3MKKyMgQ29weSBtc3ZjclhYLmRsbCBvbiB3aW5kb3dzCiAKIGlmZXEgKCQoT1BFTkpES19UQVJHRVRfT1MpLHdpbmRvd3MpCi0gICAgTVNWQ1JOTl9UQVJHRVQgOj0gJChKREtfT1VUUFVURElSKS9iaW4vJChub3RkaXIgJChNU1ZDUk5OX0RMTCkpCi0gICAgJChNU1ZDUk5OX1RBUkdFVCk6ICQoTVNWQ1JOTl9ETEwpCisgICAgTVNWQ1JfVEFSR0VUIDo9ICQoSkRLX09VVFBVVERJUikvYmluLyQobm90ZGlyICQoTVNWQ1JfRExMKSkKKyAgICAkKE1TVkNSX1RBUkdFVCk6ICQoTVNWQ1JfRExMKQogCSQoTUtESVIpIC1wICQoQEQpCiAJJChSTSkgJEAKIAkkKENQKSAkPCAkQAogCi0gICAgQ09QWV9GSUxFUyArPSAkKE1TVkNSTk5fVEFSR0VUKQorICAgIENPUFlfRklMRVMgKz0gJChNU1ZDUl9UQVJHRVQpCiBlbmRpZgogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKQEAgLTU1Myw3ICs1NTMsNyBAQAogJChKREtfT1VUUFVURElSKS9saWIkKE9QRU5KREtfVEFSR0VUX0NQVV9MSUJESVIpL2xpYmpkZ2FTVU5XYWZiLnNvOiAkKEpES19PVVRQVVRESVIpL2xpYiQoT1BFTkpES19UQVJHRVRfQ1BVX0xJQkRJUikvbGliamRnYVNVTldmZmIuc28KIAkkKE1LRElSKSAtcCAkKEBEKQogCSQoUk0pICRACi0JJChMTikgLXMgJDwgJEAKKwkkKExOKSAtcyAkKDxGKSAkQAogCiBDT1BZX0ZJTEVTICs9ICQoREdBTElCUykKIApkaWZmIC0tZ2l0IGEvamRrL21ha2VmaWxlcy9Db3B5SW50b0NsYXNzZXMuZ21rIGIvamRrL21ha2VmaWxlcy9Db3B5SW50b0NsYXNzZXMuZ21rCmluZGV4IDU1MTlmMjkuLjIxM2I3OWIgMTAwNjQ0Ci0tLSBhL2pkay9tYWtlZmlsZXMvQ29weUludG9DbGFzc2VzLmdtaworKysgYi9qZGsvbWFrZWZpbGVzL0NvcHlJbnRvQ2xhc3Nlcy5nbWsKQEAgLTE0MywxMyArMTQzLDExIEBACiBlbmRpZgogIyBFTkQ6IFN3aW5nIHBsYWYgcmVzb3VyY2VzCiAKLSMgVGhlIGV4Y2VwdGlvbiBoYW5kbGluZyBvZiBzd2luZyBiZWFuaW5mbwotIyBUaGVzZSByZXNvdXJjZXMgdmlvbGF0ZXMgdGhlIGNvbnZlbnRpb24gb2YgaGF2aW5nIGNvZGUgYW5kIHJlc291cmNlcyB0b2dldGhlciB1bmRlcgotIyAkKEpES19UT1BESVIpL3NyYy8uLi4vY2xhc3NlcyBkaXJlY3RvcmllcyAKIFNXSU5HX0JFQU5JTkZPX1JFU09VUkNFU19TUkNfRElSID0gJChKREtfVE9QRElSKS9tYWtlL3Rvb2xzL3N3aW5nLWJlYW5zL2JlYW5pbmZvL2ltYWdlcwogU1dJTkdfQkVBTklORk9fUkVTT1VSQ0VTX1NSQyA9ICQod2lsZGNhcmQgJChTV0lOR19CRUFOSU5GT19SRVNPVVJDRVNfU1JDX0RJUikvKi5naWYpCi1PVVRfQkVBTklORk9fUkVTT1VSQ0VTID0gJChhZGRwcmVmaXggJChKREtfT1VUUFVURElSKS9jbGFzc2VzL2phdmF4L3N3aW5nL2JlYW5pbmZvL2ltYWdlcy8sXAotCSQoc2hlbGwgJChQUklOVEYpICIkKFNXSU5HX0JFQU5JTkZPX1JFU09VUkNFU19TUkMpXG4iIHwgJChTRUQpIC1lICdzfC9bXiBdKi9iZWFuaW5mby9pbWFnZXMvfHxnJykpCitPVVRfQkVBTklORk9fUkVTT1VSQ0VTID0gJChwYXRzdWJzdCAkKFNXSU5HX0JFQU5JTkZPX1JFU09VUkNFU19TUkNfRElSKSUsXAorCQkJCSAgICAkKEpES19PVVRQVVRESVIpL2NsYXNzZXMvamF2YXgvc3dpbmcvYmVhbmluZm8vaW1hZ2VzLyUsXAorCQkJCSAgICAkKFNXSU5HX0JFQU5JTkZPX1JFU09VUkNFU19TUkMpKQogCiBDT1BZX0VYVFJBICs9ICQoT1VUX0JFQU5JTkZPX1JFU09VUkNFUykKICMgRU5EOiBTd2luZyBiZWFuaW5mbyByZXNvdXJjZXMKQEAgLTIyOCw3ICsyMjYsNyBAQAogIyBFdmFsIHRoZSBuZXdseSBjcmVhdGVkIHJ1bGVzIHRvIGluY29ycG9yYXRlIHRoZW0gaW50byB0aGUgbWFrZSB0cmVlLgogZGVmaW5lIGFkZHRvX21ldGEtaW5mX3NlcnZpY2VzCiAkMQotCWVjaG8gSW5zdGFsbGluZyBNRVRBLUlORi9zZXJ2aWNlcy8kJChARikgCisJZWNobyAkKExPR19JTkZPKSBJbnN0YWxsaW5nIE1FVEEtSU5GL3NlcnZpY2VzLyQkKEBGKSAKIAkkKENBVCkgJCQ8IHwgJChTRUQpIC1lICJzL14jXFskKE9QRU5KREtfVEFSR0VUX09TKVxdLy8iID4gJCRACiBlbmRlZgogJChmb3JlYWNoIGksJChNRVRBLUlORl9SVUxFU19TRVJWSUNFUyksJChldmFsICQoY2FsbCBhZGR0b19tZXRhLWluZl9zZXJ2aWNlcywkaSkpKQpkaWZmIC0tZ2l0IGEvamRrL21ha2VmaWxlcy9DcmVhdGVKYXJzLmdtayBiL2pkay9tYWtlZmlsZXMvQ3JlYXRlSmFycy5nbWsKaW5kZXggMjdhYzkzZi4uYjVkNTAxMyAxMDA2NDQKLS0tIGEvamRrL21ha2VmaWxlcy9DcmVhdGVKYXJzLmdtaworKysgYi9qZGsvbWFrZWZpbGVzL0NyZWF0ZUphcnMuZ21rCkBAIC00MiwzNSArNDIsMzAgQEAKIAogSkFSUzo9CiAKKyQoZXZhbCAkKGNhbGwgTWFrZURpciwkKElNQUdFU19PVVRQVVRESVIpL2xpYikpCisKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCi1KQ09OU09MRV9KQVJfREVQUyA6PSBcCi0gICQoc2hlbGwgJChGSU5EKSAkKEpES19PVVRQVVRESVIpL2NsYXNzZXMvc3VuL3Rvb2xzL2pjb25zb2xlLyAtbmFtZSAiX3RoZS5wYWNrYWdlIikgXAotICAkKHNoZWxsICQoRklORCkgJChKREtfT1VUUFVURElSKS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamNvbnNvbGUvIC1uYW1lICJfdGhlLnBhY2thZ2UiKQotCi0kKGV2YWwgJChjYWxsIFNldHVwQXJjaGl2ZSxCVUlMRF9KQ09OU09MRV9KQVIsJChKQ09OU09MRV9KQVJfREVQUyksXAorJChldmFsICQoY2FsbCBTZXR1cEFyY2hpdmUsQlVJTERfSkNPTlNPTEVfSkFSLCxcCiAJCVNSQ1M6PSQoSkRLX09VVFBVVERJUikvY2xhc3NlcyxcCiAJCVNVRkZJWEVTOj0uY2xhc3MgLmdpZiAucG5nIC5wcm9wZXJ0aWVzLFwKIAkJSU5DTFVERVM6PXN1bi90b29scy9qY29uc29sZSBjb20vc3VuL3Rvb2xzL2pjb25zb2xlLFwKIAkJSkFSTUFJTjo9c3VuLnRvb2xzLmpjb25zb2xlLkpDb25zb2xlLFwKLQkJSkFSOj0kKEpES19PVVRQVVRESVIpL2xpYi9qY29uc29sZS5qYXIsXAorCQlKQVI6PSQoSU1BR0VTX09VVFBVVERJUikvbGliL2pjb25zb2xlLmphcixcCiAJCVNLSVBfTUVUQUlORjo9dHJ1ZSkpCiAKLUpBUlMrPSQoSkRLX09VVFBVVERJUikvbGliL2pjb25zb2xlLmphcgorSkFSUys9JChJTUFHRVNfT1VUUFVURElSKS9saWIvamNvbnNvbGUuamFyCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCi1ETlNfSkFSX0RFUFMgOj0gXAotICAkKHNoZWxsICQoRklORCkgJChKREtfT1VUUFVURElSKS9jbGFzc2VzL3N1bi9uZXQvc3BpL25hbWVzZXJ2aWNlL2Rucy8gLW5hbWUgIl90aGUucGFja2FnZSIpIFwKLQotJChldmFsICQoY2FsbCBTZXR1cEFyY2hpdmUsQlVJTERfRE5TX0pBUiwkKEROU19KQVJfREVQUyksXAorJChldmFsICQoY2FsbCBTZXR1cEFyY2hpdmUsQlVJTERfRE5TX0pBUiwsXAogCQlTUkNTOj0kKEpES19PVVRQVVRESVIpL2NsYXNzZXMsXAogCQlJTkNMVURFUzo9c3VuL25ldC9zcGkvbmFtZXNlcnZpY2UvZG5zLFwKIAkJRVhUUkFfRklMRVM6PU1FVEEtSU5GL3NlcnZpY2VzL3N1bi5uZXQuc3BpLm5hbWVzZXJ2aWNlLk5hbWVTZXJ2aWNlRGVzY3JpcHRvcixcCi0JCUpBUjo9JChKREtfT1VUUFVURElSKS9saWIvZXh0L2Ruc25zLmphcixcCisJCUpBUjo9JChJTUFHRVNfT1VUUFVURElSKS9saWIvZXh0L2Ruc25zLmphcixcCiAJCVNLSVBfTUVUQUlORjo9dHJ1ZSkpCiAKLUpBUlMrPSQoSkRLX09VVFBVVERJUikvbGliL2V4dC9kbnNucy5qYXIKK0pBUlMrPSQoSU1BR0VTX09VVFBVVERJUikvbGliL2V4dC9kbnNucy5qYXIKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKQEAgLTgzLDEwICs3OCwxMCBAQAogCQlTVUZGSVhFUzo9LmNsYXNzIF9kaWN0IF90aCxcCiAJCUlOQ0xVREVTOj0kKExPQ0FMRURBVEFfSU5DTFVERVMpLFwKIAkJRVhDTFVERVM6PXN1bi90ZXh0L3Jlc291cmNlcy90aC9CcmVha0l0ZXJhdG9yUnVsZXNfdGguY2xhc3MsXAotCQlKQVI6PSQoSkRLX09VVFBVVERJUikvbGliL2V4dC9sb2NhbGVkYXRhLmphcixcCisJCUpBUjo9JChJTUFHRVNfT1VUUFVURElSKS9saWIvZXh0L2xvY2FsZWRhdGEuamFyLFwKIAkJU0tJUF9NRVRBSU5GOj10cnVlKSkKIAotSkFSUys9JChKREtfT1VUUFVURElSKS9saWIvZXh0L2xvY2FsZWRhdGEuamFyCitKQVJTKz0kKElNQUdFU19PVVRQVVRESVIpL2xpYi9leHQvbG9jYWxlZGF0YS5qYXIKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIHJ0LmphciBhbmQgcmVzb3VyY2VzLmphciBhcmUgYmVpbmcgYnVpbHQgaW4gdGhlIHNhbWUgd2F5IGFzIGluIHRoZSBvbGQgYnVpbGQuIFRoZXkgcmVxdWlyZQpAQCAtMTMxLDE1ICsxMjYsMTUgQEAKIAlzdW4vdG9vbHMvc2VyaWFsdmVyIFwKIAlzdW4vdG9vbHMvdHJlZSBcCiAJc3VuL3Rvb2xzL3V0aWwgXAotCXN1bi9zZWN1cml0eS90b29scy9KYXJCQVNFNjRFbmNvZGVyLmNsYXNzIFwKLQlzdW4vc2VjdXJpdHkvdG9vbHMvSmFyU2lnbmVyLmNsYXNzIFwKLQlzdW4vc2VjdXJpdHkvdG9vbHMvSmFyU2lnbmVyUGFyYW1ldGVycy5jbGFzcyBcCi0Jc3VuL3NlY3VyaXR5L3Rvb2xzL0phclNpZ25lclJlc291cmNlcy5jbGFzcyBcCi0Jc3VuL3NlY3VyaXR5L3Rvb2xzL0phclNpZ25lclJlc291cmNlc19qYS5jbGFzcyBcCi0Jc3VuL3NlY3VyaXR5L3Rvb2xzL0phclNpZ25lclJlc291cmNlc196aF9DTi5jbGFzcyBcCi0Jc3VuL3NlY3VyaXR5L3Rvb2xzL1NpZ25hdHVyZUZpbGVcJCQkJEJsb2NrLmNsYXNzIFwKLQlzdW4vc2VjdXJpdHkvdG9vbHMvU2lnbmF0dXJlRmlsZS5jbGFzcyBcCi0Jc3VuL3NlY3VyaXR5L3Rvb2xzL1RpbWVzdGFtcGVkU2lnbmVyLmNsYXNzIFwKKwlzdW4vc2VjdXJpdHkvdG9vbHMvamFyc2lnbmVyL0phckJBU0U2NEVuY29kZXIuY2xhc3MgXAorCXN1bi9zZWN1cml0eS90b29scy9qYXJzaWduZXIvTWFpbi5jbGFzcyBcCisJc3VuL3NlY3VyaXR5L3Rvb2xzL2phcnNpZ25lci9KYXJTaWduZXJQYXJhbWV0ZXJzLmNsYXNzIFwKKwlzdW4vc2VjdXJpdHkvdG9vbHMvamFyc2lnbmVyL1Jlc291cmNlcy5jbGFzcyBcCisJc3VuL3NlY3VyaXR5L3Rvb2xzL2phcnNpZ25lci9SZXNvdXJjZXNfamEuY2xhc3MgXAorCXN1bi9zZWN1cml0eS90b29scy9qYXJzaWduZXIvUmVzb3VyY2VzX3poX0NOLmNsYXNzIFwKKwlzdW4vc2VjdXJpdHkvdG9vbHMvamFyc2lnbmVyL1NpZ25hdHVyZUZpbGVcJCQkJEJsb2NrLmNsYXNzIFwKKwlzdW4vc2VjdXJpdHkvdG9vbHMvamFyc2lnbmVyL1NpZ25hdHVyZUZpbGUuY2xhc3MgXAorCXN1bi9zZWN1cml0eS90b29scy9qYXJzaWduZXIvVGltZXN0YW1wZWRTaWduZXIuY2xhc3MgXAogCXN1bi9zZWN1cml0eS9wcm92aWRlci9TdW4uY2xhc3MgXAogCXN1bi9zZWN1cml0eS9yc2EvU3VuUnNhU2lnbi5jbGFzcyBcCiAJc3VuL3NlY3VyaXR5L3NzbCBcCkBAIC0yNDksMjMgKzI0NCwxNSBAQAogaWZlcSAoJChPUEVOSkRLX1RBUkdFVF9PUyksIG1hY29zeCkKICAgICAgICAgUlRfSkFSX0VYQ0xVREVTICs9IGNvbS9zdW4vbmlvL3NjdHAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VuL25pby9jaC9zY3RwIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bi9qZGJjIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bi9uaW8vY2gvRGV2UG9sbEFycmF5V3JhcHBlclwkJCQkVXBkYXRvci5jbGFzcyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdW4vbmlvL2NoL0RldlBvbGxBcnJheVdyYXBwZXIuY2xhc3MgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VuL25pby9jaC9EZXZQb2xsU2VsZWN0b3JJbXBsLmNsYXNzIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bi9uaW8vY2gvRGV2UG9sbFNlbGVjdG9yUHJvdmlkZXIuY2xhc3MgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VuL25pby9jaC9FUG9sbEFycmF5V3JhcHBlclwkJCQkVXBkYXRvci5jbGFzcyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdW4vbmlvL2NoL0VQb2xsQXJyYXlXcmFwcGVyLmNsYXNzIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bi9uaW8vY2gvRVBvbGxTZWxlY3RvckltcGwuY2xhc3MgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VuL25pby9jaC9FUG9sbFNlbGVjdG9yUHJvdmlkZXIuY2xhc3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bi9qZGJjCiBlbmRpZgogCiAjIEZpbmQgYWxsIGZpbGVzIGluIHRoZSBjbGFzc2VzIGRpciB0byB1c2UgYXMgZGVwZW5kZW5jaWVzLiBUaGlzIGNvdWxkIGJlIG1vcmUgZmluZSBncmFudWxhci4KIEFMTF9GSUxFU19JTl9DTEFTU0VTIDo9ICQoc2hlbGwgJChGSU5EKSAkKEpES19PVVRQVVRESVIpL2NsYXNzZXMgLXR5cGUgZiBcCiAJCQl8ICQoR1JFUCkgLXYgLWUgJy9fdGhlXC4qJyAtZSAnXl90aGVcLionIC1lICdqYXZhY19zdGF0ZScpCiAKLVJUX0pBUl9NQU5JRkVTVF9GSUxFIDo9ICQoSkRLX09VVFBVVERJUikvbGliL190aGUucnQuamFyX21hbmlmZXN0Ci1SRVNPVVJDRV9KQVJfTUFOSUZFU1RfRklMRSA6PSAkKEpES19PVVRQVVRESVIpL2xpYi9fdGhlLnJlc291cmNlcy5qYXJfbWFuaWZlc3QKK1JUX0pBUl9NQU5JRkVTVF9GSUxFIDo9ICQoSU1BR0VTX09VVFBVVERJUikvbGliL190aGUucnQuamFyX21hbmlmZXN0CitSRVNPVVJDRV9KQVJfTUFOSUZFU1RfRklMRSA6PSAkKElNQUdFU19PVVRQVVRESVIpL2xpYi9fdGhlLnJlc291cmNlcy5qYXJfbWFuaWZlc3QKIAogJChSVF9KQVJfTUFOSUZFU1RfRklMRSk6ICQoTUFJTk1BTklGRVNUKSAkKEJFQU5NQU5JRkVTVCkKIAkkKE1LRElSKSAtcCAkKEBEKQpAQCAtMjg1LDQwICsyNzIsNDAgQEAKIAkgICAgICAgJChNQUlOTUFOSUZFU1QpID4+ICRALnRtcAogCSQoTVYpICRALnRtcCAkQAogCi0kKEpES19PVVRQVVRESVIpL2xpYi9fdGhlLmphcnMuZXhjbHVkZTogJChNQUtFRklMRSkKKyQoSU1BR0VTX09VVFBVVERJUikvbGliL190aGUuamFycy5leGNsdWRlOiAkKE1BS0VGSUxFKQogCSQoTUtESVIpIC1wICQoQEQpCiAJJChSTSkgJEAgJEAudG1wCiAJJChjYWxsIExpc3RQYXRoc1NhZmVseSxSVF9KQVJfRVhDTFVERVMsXG4sID4+ICRALnRtcCkKIAkkKE1WKSAkQC50bXAgJEAKIAotJChKREtfT1VUUFVURElSKS9saWIvY2xhc3NsaXN0IDogJChKREtfVE9QRElSKS9tYWtlL3Rvb2xzL3NoYXJpbmcvY2xhc3NsaXN0LiQoT1BFTkpES19UQVJHRVRfT1MpIFwKKyQoSU1BR0VTX09VVFBVVERJUikvbGliL2NsYXNzbGlzdCA6ICQoSkRLX1RPUERJUikvbWFrZS90b29scy9zaGFyaW5nL2NsYXNzbGlzdC4kKE9QRU5KREtfVEFSR0VUX09TKSBcCiAgICQoTUFLRUZJTEUpCiAJJChNS0RJUikgLXAgJChARCkKIAkkKFJNKSAkQCAkQC50bXAKIAkkKFRPT0xfQURESlNVTSkgJDwgJEAudG1wCiAJJChNVikgJEAudG1wICRACiAKLSQoSkRLX09VVFBVVERJUikvbGliL190aGUuamFycy5jb250ZW50czogJChCVUlMRF9UT09MUykgJChKREtfT1VUUFVURElSKS9saWIvX3RoZS5qYXJzLmV4Y2x1ZGUgXAotCQkJCQkgJChBTExfRklMRVNfSU5fQ0xBU1NFUykgJChKREtfT1VUUFVURElSKS9saWIvY2xhc3NsaXN0CiskKElNQUdFU19PVVRQVVRESVIpL2xpYi9fdGhlLmphcnMuY29udGVudHM6ICQoQlVJTERfVE9PTFMpICQoSU1BR0VTX09VVFBVVERJUikvbGliL190aGUuamFycy5leGNsdWRlIFwKKwkJCQkJICQoQUxMX0ZJTEVTX0lOX0NMQVNTRVMpICQoSU1BR0VTX09VVFBVVERJUikvbGliL2NsYXNzbGlzdAogCSQoTUtESVIpIC1wICQoQEQpCiAJJChSTSkgJEAgJEAudG1wCiAJKCQoQ0QpICQoSkRLX09VVFBVVERJUikvY2xhc3NlcyAmJiBcCiAJICAgICQoVE9PTF9KQVJSRU9SREVSKSBcCi0JCS1vICAkQC50bXAgJChKREtfT1VUUFVURElSKS9saWIvY2xhc3NsaXN0ICQoSkRLX09VVFBVVERJUikvbGliL190aGUuamFycy5leGNsdWRlIC4gKQorCQktbyAgJEAudG1wICQoSU1BR0VTX09VVFBVVERJUikvbGliL2NsYXNzbGlzdCAkKElNQUdFU19PVVRQVVRESVIpL2xpYi9fdGhlLmphcnMuZXhjbHVkZSAuICkKIAkkKE1WKSAkQC50bXAgJEAKIAotJChKREtfT1VUUFVURElSKS9saWIvX3RoZS5ydC5qYXIuY29udGVudHM6ICQoSkRLX09VVFBVVERJUikvbGliL190aGUuamFycy5jb250ZW50cworJChJTUFHRVNfT1VUUFVURElSKS9saWIvX3RoZS5ydC5qYXIuY29udGVudHM6ICQoSU1BR0VTX09VVFBVVERJUikvbGliL190aGUuamFycy5jb250ZW50cwogCSQoTUtESVIpIC1wICQoQEQpCiAJJChSTSkgJEAgJEAudG1wCi0JJChHUkVQKSAtZSAnXC5jbGFzcyQkJyAkKEpES19PVVRQVVRESVIpL2xpYi9fdGhlLmphcnMuY29udGVudHMgPiAkQC50bXAKKwkkKEdSRVApIC1lICdcLmNsYXNzJCQnICQoSU1BR0VTX09VVFBVVERJUikvbGliL190aGUuamFycy5jb250ZW50cyA+ICRALnRtcAogCSQoTVYpICRALnRtcCAkQAogCi0kKEpES19PVVRQVVRESVIpL2xpYi9fdGhlLnJlc291cmNlcy5qYXIuY29udGVudHM6ICQoSkRLX09VVFBVVERJUikvbGliL190aGUuamFycy5jb250ZW50cworJChJTUFHRVNfT1VUUFVURElSKS9saWIvX3RoZS5yZXNvdXJjZXMuamFyLmNvbnRlbnRzOiAkKElNQUdFU19PVVRQVVRESVIpL2xpYi9fdGhlLmphcnMuY29udGVudHMKIAkkKE1LRElSKSAtcCAkKEBEKQogCSQoUk0pICRAICRALnRtcAogCSQoR1JFUCkgLXYgLWUgJ1wuY2xhc3MkJCcgXAogCSAgICAtZSAnL190aGVcLionIC1lICdeX3RoZVwuKicgLWUgJ1xcX3RoZVwuKicgLWUgJ2phdmFjX3N0YXRlJyBcCi0JICAgICQoSkRLX09VVFBVVERJUikvbGliL190aGUuamFycy5jb250ZW50cyA+ICRALnRtcAorCSAgICAkKElNQUdFU19PVVRQVVRESVIpL2xpYi9fdGhlLmphcnMuY29udGVudHMgPiAkQC50bXAKIAkkKE1WKSAkQC50bXAgJEAKIAogUlRfSkFSX0NSRUFURV9PUFRJT05TIDo9IGMwZm0KQEAgLTMyNiwzMSArMzEzLDI5IEBACiAgICAgUlRfSkFSX0NSRUFURV9PUFRJT05TIDo9IGNmbQogZW5kaWYKIAotJChKREtfT1VUUFVURElSKS9saWIvcnQuamFyOiAkKEpES19PVVRQVVRESVIpL2xpYi9fdGhlLnJ0Lmphci5jb250ZW50cyAkKFJUX0pBUl9NQU5JRkVTVF9GSUxFKQorJChJTUFHRVNfT1VUUFVURElSKS9saWIvcnQuamFyOiAkKElNQUdFU19PVVRQVVRESVIpL2xpYi9fdGhlLnJ0Lmphci5jb250ZW50cyAkKFJUX0pBUl9NQU5JRkVTVF9GSUxFKQogCSQoRUNITykgQ3JlYXRpbmcgcnQuamFyCiAJJChNS0RJUikgLXAgJChARCkKIAkkKFJNKSAkQCAkQC50bXAKIAkkKENEKSAkKEpES19PVVRQVVRESVIpL2NsYXNzZXMgJiYgXAogCSAgICAkKEpBUikgJChSVF9KQVJfQ1JFQVRFX09QVElPTlMpICRALnRtcCAkKFJUX0pBUl9NQU5JRkVTVF9GSUxFKSBcCi0JICAgICAgICBAJChKREtfT1VUUFVURElSKS9saWIvX3RoZS5ydC5qYXIuY29udGVudHMKKwkgICAgICAgIEAkKElNQUdFU19PVVRQVVRESVIpL2xpYi9fdGhlLnJ0Lmphci5jb250ZW50cwogCSQoTVYpICRALnRtcCAkQAogCi0kKEpES19PVVRQVVRESVIpL2xpYi9yZXNvdXJjZXMuamFyOiAkKEpES19PVVRQVVRESVIpL2xpYi9fdGhlLnJlc291cmNlcy5qYXIuY29udGVudHMgXAorJChJTUFHRVNfT1VUUFVURElSKS9saWIvcmVzb3VyY2VzLmphcjogJChJTUFHRVNfT1VUUFVURElSKS9saWIvX3RoZS5yZXNvdXJjZXMuamFyLmNvbnRlbnRzIFwKIAkJCQkgICAgJChSRVNPVVJDRV9KQVJfTUFOSUZFU1RfRklMRSkKIAkkKEVDSE8pIENyZWF0aW5nIHJlc291cmNlcy5qYXIKIAkkKE1LRElSKSAtcCAkKEBEKQogCSQoUk0pICRAICRALnRtcAogCSQoQ0QpICQoSkRLX09VVFBVVERJUikvY2xhc3NlcyAmJiBcCiAJICAgICQoSkFSKSAkKFJUX0pBUl9DUkVBVEVfT1BUSU9OUykgJEAudG1wICQoUkVTT1VSQ0VfSkFSX01BTklGRVNUX0ZJTEUpIFwKLQkgICAgICAgIEAkKEpES19PVVRQVVRESVIpL2xpYi9fdGhlLnJlc291cmNlcy5qYXIuY29udGVudHMKKwkgICAgICAgIEAkKElNQUdFU19PVVRQVVRESVIpL2xpYi9fdGhlLnJlc291cmNlcy5qYXIuY29udGVudHMKIAkkKE1WKSAkQC50bXAgJEAKIAotSkFSUys9JChKREtfT1VUUFVURElSKS9saWIvcnQuamFyICQoSkRLX09VVFBVVERJUikvbGliL3Jlc291cmNlcy5qYXIKK0pBUlMrPSQoSU1BR0VTX09VVFBVVERJUikvbGliL3J0LmphciAkKElNQUdFU19PVVRQVVRESVIpL2xpYi9yZXNvdXJjZXMuamFyCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCi1DSEFSU0VUU19KQVJfREVQUyA6PQotCiBpZm5lcSAoJChPUEVOSkRLX1RBUkdFVF9PUyksIHdpbmRvd3MpCiAgICAgQ0hBUlNFVFNfRVhUUkFfRklMRVM6PXN1bi9hd3QvbW90aWYvWDExR0JLLmNsYXNzIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VuL2F3dC9tb3RpZi9YMTFHQjIzMTJcJCQkJERlY29kZXIuY2xhc3MgXApAQCAtMzYyLDMyICszNDcsMzQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VuL2F3dC9tb3RpZi9YMTFLU0M1NjAxLmNsYXNzCiBlbmRpZgogCi0kKGV2YWwgJChjYWxsIFNldHVwQXJjaGl2ZSxCVUlMRF9DSEFSU0VUU19KQVIsJChDSEFSU0VUU19KQVJfREVQUyksXAorJChldmFsICQoY2FsbCBTZXR1cEFyY2hpdmUsQlVJTERfQ0hBUlNFVFNfSkFSLCxcCiAJCVNSQ1M6PSQoSkRLX09VVFBVVERJUikvY2xhc3NlcywgXAogCQlTVUZGSVhFUzo9LmNsYXNzIC5kYXQsXAogCQlJTkNMVURFUzo9c3VuL25pby9jcy9leHQsXAogCQlFWFRSQV9GSUxFUyA6PSBzdW4vYXd0L0hLU0NTLmNsYXNzIFwKIAkJCSAgICAgICAkKENIQVJTRVRTX0VYVFJBX0ZJTEVTKSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVUQS1JTkYvc2VydmljZXMvamF2YS5uaW8uY2hhcnNldC5zcGkuQ2hhcnNldFByb3ZpZGVyLCBcCi0JCUpBUjo9JChKREtfT1VUUFVURElSKS9saWIvY2hhcnNldHMuamFyLCBcCisJCUpBUjo9JChJTUFHRVNfT1VUUFVURElSKS9saWIvY2hhcnNldHMuamFyLCBcCiAJCVNLSVBfTUVUQUlORiA6PSB0cnVlLCBcCiAgICAgICAgICAgICAgICAgQ0hFQ0tfQ09NUFJFU1NfSkFSOj10cnVlKSkKIAotSkFSUys9JChKREtfT1VUUFVURElSKS9saWIvY2hhcnNldHMuamFyCitKQVJTKz0kKElNQUdFU19PVVRQVVRESVIpL2xpYi9jaGFyc2V0cy5qYXIKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKK2lmbmRlZiBPUEVOSkRLCiBpZmVxICgkKEVOQUJMRV9KRlIpLCB0cnVlKQogICAgICQoZXZhbCAkKGNhbGwgU2V0dXBBcmNoaXZlLEJVSUxEX0pGUl9KQVIsLFwKIAkJU1JDUzo9JChKREtfT1VUUFVURElSKS9jbGFzc2VzLFwKIAkJSU5DTFVERVM6PWNvbS9vcmFjbGUvanJvY2tpdC9qZnIgXAogCQkJICBvcmFjbGUvanJvY2tpdC9qZnIsXAotCQlKQVI6PSQoSkRLX09VVFBVVERJUikvbGliL2pmci5qYXIsXAorCQlKQVI6PSQoSU1BR0VTX09VVFBVVERJUikvbGliL2pmci5qYXIsXAogCQlTS0lQX01FVEFJTkY6PXRydWUsXAogCQlNQU5JRkVTVDo9JChNQUlOTUFOSUZFU1QpLCBcCiAgICAgICAgICAgICAgICAgQ0hFQ0tfQ09NUFJFU1NfSkFSOj10cnVlKSkKIAotICAgIEpBUlMrPSQoSkRLX09VVFBVVERJUikvbGliL2pmci5qYXIKKyAgICBKQVJTKz0kKElNQUdFU19PVVRQVVRESVIpL2xpYi9qZnIuamFyCitlbmRpZgogZW5kaWYKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCkBAIC0zOTgsMzAgKzM4NSwzMCBAQAogCQkJICBzdW4vc2VjdXJpdHkvcnNhL1N1blJzYVNpZ24uY2xhc3MgXAogCQkJICBzdW4vc2VjdXJpdHkvc3NsIFwKIAkJCSAgY29tL3N1bi9uZXQvc3NsL2ludGVybmFsL3NzbCxcCi0JCUpBUjo9JChKREtfT1VUUFVURElSKS9saWIvanNzZS5qYXIsXAorCQlKQVI6PSQoSU1BR0VTX09VVFBVVERJUikvbGliL2pzc2UuamFyLFwKIAkJU0tJUF9NRVRBSU5GOj10cnVlLFwKIAkJTUFOSUZFU1Q6PSQoTUFJTk1BTklGRVNUKSwgXAogICAgICAgICAgICAgICAgIENIRUNLX0NPTVBSRVNTX0pBUjo9dHJ1ZSkpCiAKLUpBUlMrPSQoSkRLX09VVFBVVERJUikvbGliL2pzc2UuamFyCitKQVJTKz0kKElNQUdFU19PVVRQVVRESVIpL2xpYi9qc3NlLmphcgogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAotU1VOUEtDUzExX0pBUl9EU1QgOj0gJChKREtfT1VUUFVURElSKS9saWIvZXh0L3N1bnBrY3MxMS5qYXIKK1NVTlBLQ1MxMV9KQVJfRFNUIDo9ICQoSU1BR0VTX09VVFBVVERJUikvbGliL2V4dC9zdW5wa2NzMTEuamFyCiAKIGlmbmRlZiBPUEVOSkRLCiAKICAgICBTVU5QS0NTMTFfSkFSX1NSQyA6PSAkKEpES19UT1BESVIpL21ha2UvY2xvc2VkL3Rvb2xzL2NyeXB0by9wa2NzMTEvc3VucGtjczExLmphcgogCiAgICAgJChTVU5QS0NTMTFfSkFSX0RTVCkgOiAkKFNVTlBLQ1MxMV9KQVJfU1JDKQotCUAkKEVDSE8pICJcbj4+Pkluc3RhbGxpbmcgcHJlYnVpbHQgU3VuUEtDUzExIHByb3ZpZGVyLi4uIgorCUAkKEVDSE8pICQoTE9HX0lORk8pICJcbj4+Pkluc3RhbGxpbmcgcHJlYnVpbHQgU3VuUEtDUzExIHByb3ZpZGVyLi4uIgogCSQoTUtESVIpIC1wICQoQEQpCiAJJChSTSkgJEAKIAkkKENQKSAkPCAkQAogCiBlbHNlCiAKLSAgICAkKGV2YWwgJChjYWxsIFNldHVwQXJjaGl2ZSxCVUlMRF9TVU5QS0NTMTFfSkFSLCQoU1VOUEtDUzExX0pBUl9ERVBTKSxcCisgICAgJChldmFsICQoY2FsbCBTZXR1cEFyY2hpdmUsQlVJTERfU1VOUEtDUzExX0pBUiwsXAogCVNSQ1M6PSQoSkRLX09VVFBVVERJUikvY2xhc3NlcywgXAogCVNVRkZJWEVTOj0uY2xhc3MsXAogCUlOQ0xVREVTOj1zdW4vc2VjdXJpdHkvcGtjczExLFwKQEAgLTQzNCwxNCArNDIxLDE0IEBACiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCi1TVU5FQ19KQVJfRFNUIDo9ICQoSkRLX09VVFBVVERJUikvbGliL2V4dC9zdW5lYy5qYXIKK1NVTkVDX0pBUl9EU1QgOj0gJChJTUFHRVNfT1VUUFVURElSKS9saWIvZXh0L3N1bmVjLmphcgogCiBpZm5kZWYgT1BFTkpESwogCiBTVU5FQ19KQVJfU1JDIDo9ICQoSkRLX1RPUERJUikvbWFrZS9jbG9zZWQvdG9vbHMvY3J5cHRvL2VjL3N1bmVjLmphcgogCiAkKFNVTkVDX0pBUl9EU1QpIDogJChTVU5FQ19KQVJfU1JDKQotCUAkKEVDSE8pICJcbj4+Pkluc3RhbGxpbmcgcHJlYnVpbHQgU3VuRUMgcHJvdmlkZXIuLi4iCisJQCQoRUNITykgJChMT0dfSU5GTykgIlxuPj4+SW5zdGFsbGluZyBwcmVidWlsdCBTdW5FQyBwcm92aWRlci4uLiIKIAkkKE1LRElSKSAtcCAkKEBEKQogCSQoUk0pICRACiAJJChDUCkgJDwgJEAKQEAgLTQ2NywyNiArNDU0LDI2IEBACiAJCUlOQ0xVREVTOj1qYXZheC9zd2luZyBzdW4vc3dpbmcsXAogCQlFWENMVURFUzo9amF2YXgvc3dpbmcvcGxhZixcCiAJCUVYVFJBX0ZJTEVTOj1qYXZheC9zd2luZy9Td2luZ0JlYW5JbmZvQmFzZS5jbGFzcyBzdW4vc3dpbmcvQmVhbkluZm9VdGlscy5jbGFzcyxcCi0JCUpBUjo9JChKREtfT1VUUFVURElSKS9saWIvZHQuamFyLFwKKwkJSkFSOj0kKElNQUdFU19PVVRQVVRESVIpL2xpYi9kdC5qYXIsXAogCQlTS0lQX01FVEFJTkY6PXRydWUpKQogCi1KQVJTKz0kKEpES19PVVRQVVRESVIpL2xpYi9kdC5qYXIKK0pBUlMrPSQoSU1BR0VTX09VVFBVVERJUikvbGliL2R0LmphcgogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAotU1VOSkNFX1BST1ZJREVSX0pBUl9EU1QgOj0gJChKREtfT1VUUFVURElSKS9saWIvZXh0L3N1bmpjZV9wcm92aWRlci5qYXIKK1NVTkpDRV9QUk9WSURFUl9KQVJfRFNUIDo9ICQoSU1BR0VTX09VVFBVVERJUikvbGliL2V4dC9zdW5qY2VfcHJvdmlkZXIuamFyCiAKIGlmbmRlZiBPUEVOSkRLCiAgICAgU1VOSkNFX1BST1ZJREVSX0pBUl9TUkMgOj0gJChKREtfVE9QRElSKS9tYWtlL2Nsb3NlZC90b29scy9jcnlwdG8vamNlL3N1bmpjZV9wcm92aWRlci5qYXIKIAogICAgICQoU1VOSkNFX1BST1ZJREVSX0pBUl9EU1QpIDogJChTVU5KQ0VfUFJPVklERVJfSkFSX1NSQykKLQlAJChFQ0hPKSAiXG4+Pj5JbnN0YWxsaW5nIHByZWJ1aWx0IFN1bkpDRSBwcm92aWRlci4uLiIKKwlAJChFQ0hPKSAkKExPR19JTkZPKSAiXG4+Pj5JbnN0YWxsaW5nIHByZWJ1aWx0IFN1bkpDRSBwcm92aWRlci4uLiIKIAkkKE1LRElSKSAtcCAkKEBEKQogCSQoUk0pICRACiAJJChDUCkgJDwgJEAKIGVsc2UKIAotICAgICQoZXZhbCAkKGNhbGwgU2V0dXBBcmNoaXZlLEJVSUxEX1NVTkpDRV9QUk9WSURFUl9KQVIsJChTVU5KQ0VfUFJPVklERVJfSkFSX0RFUFMpLFwKKyAgICAkKGV2YWwgJChjYWxsIFNldHVwQXJjaGl2ZSxCVUlMRF9TVU5KQ0VfUFJPVklERVJfSkFSLCxcCiAJCVNSQ1M6PSQoSkRLX09VVFBVVERJUikvY2xhc3NlcywgXAogCQlTVUZGSVhFUzo9LmNsYXNzLFwKIAkJSU5DTFVERVM6PSBjb20vc3VuL2NyeXB0by9wcm92aWRlcixcCkBAIC00OTgsMjEgKzQ4NSwyMSBAQAogCiBKQVJTICs9ICQoU1VOSkNFX1BST1ZJREVSX0pBUl9EU1QpCiAKLUpDRV9KQVJfRFNUIDo9ICQoSkRLX09VVFBVVERJUikvbGliL2pjZS5qYXIKK0pDRV9KQVJfRFNUIDo9ICQoSU1BR0VTX09VVFBVVERJUikvbGliL2pjZS5qYXIKIAogaWZuZGVmIE9QRU5KREsKIAogSkNFX0pBUl9TUkMgOj0gJChKREtfVE9QRElSKS9tYWtlL2Nsb3NlZC90b29scy9jcnlwdG8vamNlL2pjZS5qYXIKIAogJChKQ0VfSkFSX0RTVCkgOiAkKEpDRV9KQVJfU1JDKQotCUAkKEVDSE8pICJcbj4+Pkluc3RhbGxpbmcgcHJlYnVpbHQgamNlLmphci4uLiIKKwlAJChFQ0hPKSAkKExPR19JTkZPKSAiXG4+Pj5JbnN0YWxsaW5nIHByZWJ1aWx0IGpjZS5qYXIuLi4iCiAJJChNS0RJUikgLXAgJChARCkKIAkkKFJNKSAkQAogCSQoQ1ApICQ8ICRACiAKIGVsc2UKIAotJChldmFsICQoY2FsbCBTZXR1cEFyY2hpdmUsQlVJTERfSkNFX0pBUiwkKEpDRV9KQVJfREVQUyksXAorJChldmFsICQoY2FsbCBTZXR1cEFyY2hpdmUsQlVJTERfSkNFX0pBUiwsXAogCQlTUkNTOj0kKEpES19PVVRQVVRESVIpL2NsYXNzZXMsIFwKIAkJU1VGRklYRVM6PS5jbGFzcyxcCiAJCUlOQ0xVREVTOj0gamF2YXgvY3J5cHRvIHN1bi9zZWN1cml0eS9pbnRlcm5hbCxcCkBAIC01MzIsOSArNTE5LDEyIEBACiAjIFRPRE8gZml4IHNvIHRoYXQgU2V0dXBBcmNoaXZlIGRvZXMgbm90IHdyaXRlIGZpbGVzIGludG8gU1JDUwogIyAgIHRoZW4gd2UgZG9uJ3QgbmVlZCB0aGlzIGV4dHJhIGNvcHlpbmcKICMKLVVTX0VYUE9SVF9QT0xJQ1lfSkFSX0RTVCA6PSAkKEpES19PVVRQVVRESVIpL2xpYi9zZWN1cml0eS9VU19leHBvcnRfcG9saWN5LmphcgorIyBOT1RFOiAgV2UgY3VycmVudGx5IGRvIG5vdCBwbGFjZSByZXN0cmljdGlvbnMgb24gb3VyIGxpbWl0ZWQgZXhwb3J0CisjIHBvbGljeS4gIFRoaXMgd2FzIG5vdCBhIHR5cG8uCisjCitVU19FWFBPUlRfUE9MSUNZX0pBUl9EU1QgOj0gJChJTUFHRVNfT1VUUFVURElSKS9saWIvc2VjdXJpdHkvVVNfZXhwb3J0X3BvbGljeS5qYXIKIFVTX0VYUE9SVF9QT0xJQ1lfSkFSX1NSQ19ESVIgOj0gJChKREtfVE9QRElSKS9tYWtlL2phdmF4L2NyeXB0by9wb2xpY3kvdW5saW1pdGVkCi1VU19FWFBPUlRfUE9MSUNZX0pBUl9UTVAgOj0gJChKREtfT1VUUFVURElSKS9VU19leHBvcnRfcG9saWN5X2phci50bXAKK1VTX0VYUE9SVF9QT0xJQ1lfSkFSX1RNUCA6PSAkKElNQUdFU19PVVRQVVRESVIpL1VTX2V4cG9ydF9wb2xpY3lfamFyLnRtcAogCiAkKFVTX0VYUE9SVF9QT0xJQ1lfSkFSX1RNUCkvJSA6ICQoVVNfRVhQT1JUX1BPTElDWV9KQVJfU1JDX0RJUikvJQogCSQoTUtESVIpIC1wICQoQEQpCkBAIC01NjMsMTEgKzU1MywxOSBAQAogIyBUT0RPIGZpeCBzbyB0aGF0IFNldHVwQXJjaGl2ZSBkb2VzIG5vdCB3cml0ZSBmaWxlcyBpbnRvIFNSQ1MKICMgICB0aGVuIHdlIGRvbid0IG5lZWQgdGhpcyBleHRyYSBjb3B5aW5nCiAjCi1MT0NBTF9QT0xJQ1lfSkFSX0RTVCA6PSAkKEpES19PVVRQVVRESVIpL2xpYi9zZWN1cml0eS9sb2NhbF9wb2xpY3kuamFyCi1MT0NBTF9QT0xJQ1lfSkFSX1NSQ19ESVIgOj0gJChKREtfVE9QRElSKS9tYWtlL2phdmF4L2NyeXB0by9wb2xpY3kvbGltaXRlZAotTE9DQUxfUE9MSUNZX0pBUl9UTVAgOj0gJChKREtfT1VUUFVURElSKS9sb2NhbF9wb2xpY3lfamFyLnRtcAorTE9DQUxfUE9MSUNZX0pBUl9EU1QgOj0gJChJTUFHRVNfT1VUUFVURElSKS9saWIvc2VjdXJpdHkvbG9jYWxfcG9saWN5LmphcgorTE9DQUxfUE9MSUNZX0pBUl9UTVAgOj0gJChJTUFHRVNfT1VUUFVURElSKS9sb2NhbF9wb2xpY3lfamFyLnRtcAogCi1MT0NBTF9QT0xJQ1lfSkFSX0RFUFMgOj0gJChMT0NBTF9QT0xJQ1lfSkFSX1RNUCkvZXhlbXB0X2xvY2FsLnBvbGljeSAkKExPQ0FMX1BPTElDWV9KQVJfVE1QKS9kZWZhdWx0X2xvY2FsLnBvbGljeQoraWZlcSAoJChVTkxJTUlURURfQ1JZUFRPKSwgdHJ1ZSkKKyAgICBMT0NBTF9QT0xJQ1lfSkFSX1NSQ19ESVIgOj0gJChKREtfVE9QRElSKS9tYWtlL2phdmF4L2NyeXB0by9wb2xpY3kvdW5saW1pdGVkCisgICAgTE9DQUxfUE9MSUNZX0pBUl9ERVBTIDo9ICQoTE9DQUxfUE9MSUNZX0pBUl9UTVApL2RlZmF1bHRfbG9jYWwucG9saWN5CisgICAgTE9DQUxfUE9MSUNZX0pBUl9BVFRSIDo9IENyeXB0by1TdHJlbmd0aDogdW5saW1pdGVkCitlbHNlCisgICAgTE9DQUxfUE9MSUNZX0pBUl9TUkNfRElSIDo9ICQoSkRLX1RPUERJUikvbWFrZS9qYXZheC9jcnlwdG8vcG9saWN5L2xpbWl0ZWQKKyAgICBMT0NBTF9QT0xJQ1lfSkFSX0RFUFMgOj0gJChMT0NBTF9QT0xJQ1lfSkFSX1RNUCkvZXhlbXB0X2xvY2FsLnBvbGljeSBcCisJCQkgJChMT0NBTF9QT0xJQ1lfSkFSX1RNUCkvZGVmYXVsdF9sb2NhbC5wb2xpY3kKKyAgICBMT0NBTF9QT0xJQ1lfSkFSX0FUVFIgOj0gQ3J5cHRvLVN0cmVuZ3RoOiBsaW1pdGVkCitlbmRpZgogCiAkKExPQ0FMX1BPTElDWV9KQVJfVE1QKS8lIDogJChMT0NBTF9QT0xJQ1lfSkFSX1NSQ19ESVIpLyUKIAkkKE1LRElSKSAtcCAkKEBEKQpAQCAtNTc4LDcgKzU3Niw3IEBACiAJCVNSQ1M6PSQoTE9DQUxfUE9MSUNZX0pBUl9UTVApLFwKIAkJU1VGRklYRVM6PSAucG9saWN5LFwKIAkJSkFSOj0kKExPQ0FMX1BPTElDWV9KQVJfRFNUKSwgXAotCQlFWFRSQV9NQU5JRkVTVF9BVFRSIDo9IENyeXB0by1TdHJlbmd0aDogbGltaXRlZCwgXAorCQlFWFRSQV9NQU5JRkVTVF9BVFRSIDo9ICQoTE9DQUxfUE9MSUNZX0pBUl9BVFRSKSwgXAogCQlTS0lQX01FVEFJTkYgOj0gdHJ1ZSkpCiAKIEpBUlMgKz0gJChMT0NBTF9QT0xJQ1lfSkFSX0RTVCkKQEAgLTU4OSwyNiArNTg3LDI0IEBACiAKIGlmZXEgKCQoT1BFTkpES19UQVJHRVRfT1MpLHdpbmRvd3MpCiAKLVNVTk1TQ0FQSV9KQVJfRFNUIDo9ICQoSkRLX09VVFBVVERJUikvbGliL2V4dC9zdW5tc2NhcGkuamFyCitTVU5NU0NBUElfSkFSX0RTVCA6PSAkKElNQUdFU19PVVRQVVRESVIpL2xpYi9leHQvc3VubXNjYXBpLmphcgogCiBpZm5kZWYgT1BFTkpESwogU1VOTVNDQVBJX0pBUl9TUkMgOj0gJChKREtfVE9QRElSKS9tYWtlL2Nsb3NlZC90b29scy9jcnlwdG8vbXNjYXBpL3N1bm1zY2FwaS5qYXIKIAogJChTVU5NU0NBUElfSkFSX0RTVCkgOiAkKFNVTk1TQ0FQSV9KQVJfU1JDKQotCUAkKEVDSE8pICJcbj4+Pkluc3RhbGxpbmcgcHJlYnVpbHQgU3VuTVNDQVBJIHByb3ZpZGVyLi4uIgorCUAkKEVDSE8pICQoTE9HX0lORk8pICJcbj4+Pkluc3RhbGxpbmcgcHJlYnVpbHQgU3VuTVNDQVBJIHByb3ZpZGVyLi4uIgogCSQoTUtESVIpIC1wICQoQEQpCiAJJChSTSkgJEAKIAkkKENQKSAkPCAkQAogCiBlbHNlCiAKLSQoZXZhbCAkKGNhbGwgU2V0dXBBcmNoaXZlLEJVSUxEX1NVTk1TQ0FQSV9KQVIsJChTVU5NU0NBUElfSkFSX0RFUFMpLFwKKyQoZXZhbCAkKGNhbGwgU2V0dXBBcmNoaXZlLEJVSUxEX1NVTk1TQ0FQSV9KQVIsLFwKIAkJU1JDUzo9JChKREtfT1VUUFVURElSKS9jbGFzc2VzLCBcCiAJCVNVRkZJWEVTOj0uY2xhc3MsXAogCQlJTkNMVURFUzo9IHN1bi9zZWN1cml0eS9tc2NhcGksXAogCQlKQVI6PSQoU1VOTVNDQVBJX0pBUl9EU1QpLCBcCi0JCU1BTklGRVNUOj0kKEpES19UT1BESVIpL21ha2UvdG9vbHMvbWFuaWZlc3QubWYsIFwKLQkJRVhUUkFfTUFOSUZFU1RfQVRUUjo9RXh0ZW5zaW9uLU5hbWU6IGphdmF4LmNyeXB0b1xuSW1wbGVtZW50YXRpb24tVmVuZG9yLUlkOiBjb20uc3VuLCBcCiAJCVNLSVBfTUVUQUlORjo9dHJ1ZSkpCiBlbmRpZgogCkBAIC02MjEsMTEgKzYxNywxMSBAQAogaWZlcSAoJChPUEVOSkRLX1RBUkdFVF9PUyksc29sYXJpcykKIGlmbmRlZiBPUEVOSkRLCiAKLVVDUllQVE9fSkFSX0RTVCA6PSAkKEpES19PVVRQVVRESVIpL2xpYi9leHQvdWNyeXB0by5qYXIKK1VDUllQVE9fSkFSX0RTVCA6PSAkKElNQUdFU19PVVRQVVRESVIpL2xpYi9leHQvdWNyeXB0by5qYXIKIFVDUllQVE9fSkFSX1NSQyA6PSAkKEpES19UT1BESVIpL21ha2UvY2xvc2VkL3Rvb2xzL2NyeXB0by91Y3J5cHRvL3VjcnlwdG8uamFyCiAKICQoVUNSWVBUT19KQVJfRFNUKSA6ICQoVUNSWVBUT19KQVJfU1JDKQotCUAkKEVDSE8pICJcbj4+Pkluc3RhbGxpbmcgcHJlYnVpbHQgT3JhY2xlVWNyeXB0byBwcm92aWRlci4uLiIKKwlAJChFQ0hPKSAkKExPR19JTkZPKSAiXG4+Pj5JbnN0YWxsaW5nIHByZWJ1aWx0IE9yYWNsZVVjcnlwdG8gcHJvdmlkZXIuLi4iCiAJJChNS0RJUikgLXAgJChARCkKIAkkKFJNKSAkQAogCSQoQ1ApICQ8ICRACkBAIC02NDAsOSArNjM2LDkgQEAKICMgR2V0IHRoZSBDTERSVkVSU0lPTgogaW5jbHVkZSBHZW5zcmNDTERSLmdtawogCi1DTERSREFUQV9KQVJfRFNUIDo9ICQoSkRLX09VVFBVVERJUikvbGliL2V4dC9jbGRyZGF0YS5qYXIKK0NMRFJEQVRBX0pBUl9EU1QgOj0gJChJTUFHRVNfT1VUUFVURElSKS9saWIvZXh0L2NsZHJkYXRhLmphcgogCi0kKGV2YWwgJChjYWxsIFNldHVwQXJjaGl2ZSxCVUlMRF9DTERSREFUQV9KQVIsJChDTERSREFUQV9ERVBTKSxcCiskKGV2YWwgJChjYWxsIFNldHVwQXJjaGl2ZSxCVUlMRF9DTERSREFUQV9KQVIsLFwKIAkJU1JDUzo9JChKREtfT1VUUFVURElSKS9jbGFzc2VzLFwKIAkJU1VGRklYRVM6PS5jbGFzcyxcCiAJCUlOQ0xVREVTOj1zdW4vdGV4dC9yZXNvdXJjZXMvY2xkciBcCkBAIC03MTUsMjEgKzcxMSwyNSBAQAogCXN1bi90b29scy9qaW5mbyAgICAgICAgIFwKIAlzdW4vdG9vbHMvam1hcAogCi0kKGV2YWwgJChjYWxsIFNldHVwQXJjaGl2ZSxCVUlMRF9UT09MU19KQVIsJChUT09MU19KQVJfREVQUyksXAorIyBUaGUgc2phdmFjIHRvb2xzIGlzIG5vdCByZWFkeSBmb3IgcHVibGljIGNvbnN1bXB0aW9uLgorVE9PTFNfSkFSX0VYQ0xVREVTPWNvbS9zdW4vdG9vbHMvc2phdmFjCisKKyQoZXZhbCAkKGNhbGwgU2V0dXBBcmNoaXZlLEJVSUxEX1RPT0xTX0pBUiwsXAogCQlTUkNTOj0kKEpES19PVVRQVVRESVIpL2NsYXNzZXMsXAogCQlTVUZGSVhFUzo9LmNsYXNzIC5wcnAgLmdpZiAucHJvcGVydGllcyAueG1sIC5jc3MgLnhzZCAuanMgLmh0bWwgLnR4dCAuamF2YSBcCiAJCQkgIFRvb2wgYWxpYXNtYXAgb3B0aW9ucyxcCiAJCUlOQ0xVREVTOj0kKFRPT0xTX0pBUl9JTkNMVURFUyksXAorCQlFWENMVURFUzo9JChUT09MU19KQVJfRVhDTFVERVMpLFwKIAkJRVhUUkFfRklMRVM6PU1FVEEtSU5GL3NlcnZpY2VzL2NvbS5zdW4uamRpLmNvbm5lY3QuQ29ubmVjdG9yIFwKIAkJCSAgICAgTUVUQS1JTkYvc2VydmljZXMvY29tLnN1bi5qZGkuY29ubmVjdC5zcGkuVHJhbnNwb3J0U2VydmljZSBcCiAJCQkgICAgIE1FVEEtSU5GL3NlcnZpY2VzL2NvbS5zdW4udG9vbHMuYXR0YWNoLnNwaS5BdHRhY2hQcm92aWRlciBcCiAJCQkgICAgIE1FVEEtSU5GL3NlcnZpY2VzL2NvbS5zdW4udG9vbHMuaW50ZXJuYWwud3Mud3Njb21waWxlLlBsdWdpbiBcCiAJCQkgICAgIE1FVEEtSU5GL3NlcnZpY2VzL2NvbS5zdW4udG9vbHMuaW50ZXJuYWwueGpjLlBsdWdpbixcCi0JCUpBUjo9JChKREtfT1VUUFVURElSKS9saWIvdG9vbHMuamFyLFwKKwkJSkFSOj0kKElNQUdFU19PVVRQVVRESVIpL2xpYi90b29scy5qYXIsXAogCQlTS0lQX01FVEFJTkY6PXRydWUsIFwKICAgICAgICAgICAgICAgICBDSEVDS19DT01QUkVTU19KQVI6PXRydWUpKQogCi1KQVJTKz0kKEpES19PVVRQVVRESVIpL2xpYi90b29scy5qYXIKK0pBUlMrPSQoSU1BR0VTX09VVFBVVERJUikvbGliL3Rvb2xzLmphcgogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIApAQCAtNzYxLDcgKzc2MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBjb20ub3JhY2xlLm5ldCBcCiAgICAgICAgICAgICAgICAgICAgICAgICBjb20ub3JhY2xlLm5pbwogCi0kKElNQUdFU19PVVRQVVRESVIpL3N5bWJvbHMvX3RoZS5zeW1ib2xzOiAkKEpES19PVVRQVVRESVIpL2xpYi9ydC5qYXIKKyQoSU1BR0VTX09VVFBVVERJUikvc3ltYm9scy9fdGhlLnN5bWJvbHM6ICQoSU1BR0VTX09VVFBVVERJUikvbGliL3J0LmphcgogCSQoUk0pIC1yICQoSU1BR0VTX09VVFBVVERJUikvc3ltYm9scy9NRVRBLUlORi9zeW0KIAkkKE1LRElSKSAtcCAkKElNQUdFU19PVVRQVVRESVIpL3N5bWJvbHMvTUVUQS1JTkYvc3ltCiAJJChKQVZBKSBcCkBAIC03NjksMTkgKzc2OSwxOSBAQAogCQkkKEpBVkFDX0pBUlMpIFwKIAkgICAgLVhEcHJvY2Vzcy5wYWNrYWdlcyAtcHJvYzpvbmx5IFwKIAkgICAgLXByb2Nlc3NvciBjb20uc3VuLnRvb2xzLmphdmFjLnN5bS5DcmVhdGVTeW1ib2xzIFwKLQkgICAgLUFjb20uc3VuLnRvb2xzLmphdmFjLnN5bS5KYXI9JChKREtfT1VUUFVURElSKS9saWIvcnQuamFyIFwKKwkgICAgLUFjb20uc3VuLnRvb2xzLmphdmFjLnN5bS5KYXI9JChJTUFHRVNfT1VUUFVURElSKS9saWIvcnQuamFyIFwKIAkgICAgLUFjb20uc3VuLnRvb2xzLmphdmFjLnN5bS5EZXN0PSQoSU1BR0VTX09VVFBVVERJUikvc3ltYm9scy9NRVRBLUlORi9zeW0vcnQuamFyIFwKIAkgICAgJChDT1JFX1BLR1MpICQoTk9OX0NPUkVfUEtHUykgJChFWENMVURFX1BST1BXQVJOX1BLR1MpICQoRVhQT1JURURfUFJJVkFURV9QS0dTKQogCSQoVE9VQ0gpICRACiAKLU1BS0VfU1VSRV9ESVJfRVhJU1RTX0RVTU1ZIDo9ICQoc2hlbGwgJChNS0RJUikgLXAgJChJTUFHRVNfT1VUUFVURElSKS9zeW1ib2xzKQorJChzaGVsbCAkKE1LRElSKSAtcCAkKElNQUdFU19PVVRQVVRESVIpL3N5bWJvbHMpCiAkKGV2YWwgJChjYWxsIFNldHVwQXJjaGl2ZSxCVUlMRF9DVF9TWU0sJChJTUFHRVNfT1VUUFVURElSKS9zeW1ib2xzL190aGUuc3ltYm9scyxcCiAJCVNSQ1M6PSQoSU1BR0VTX09VVFBVVERJUikvc3ltYm9scyxcCiAJCUlOQ0xVREVTOj1NRVRBLUlORi9zeW0sXAotCQlKQVI6PSQoSkRLX09VVFBVVERJUikvbGliL2N0LnN5bSwgXAorCQlKQVI6PSQoSU1BR0VTX09VVFBVVERJUikvbGliL2N0LnN5bSwgXAogCQlDSEVDS19DT01QUkVTU19KQVI6PXRydWUpKQogCi1KQVJTKz0kKEpES19PVVRQVVRESVIpL2xpYi9jdC5zeW0KK0pBUlMrPSQoSU1BR0VTX09VVFBVVERJUikvbGliL2N0LnN5bQogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIApAQCAtODYxLDExICs4NjEsMTIgQEAKIAogJChJTUFHRVNfT1VUUFVURElSKS9zcmMuemlwOiAkKExBVU5DSEVSX1pJUF9TUkMpCiAKLSMgVGhpcyBkaXIgbmVlZHMgdG8gZXhzaXN0IGJlZm9yZSBtYWNybyBpcyBldmFsdWF0ZWQgdG8gYXZvaWQgd2FybmluZyBmcm9tIGZpbmQuCi1NQUtFX1NVUkVfRElSX0VYSVNUU19EVU1NWSA6PSAkKHNoZWxsICQoTUtESVIpIC1wICQoSU1BR0VTX09VVFBVVERJUikvc3JjKQorIyBUaGlzIGRpciBuZWVkcyB0byBleGlzdCBiZWZvcmUgbWFjcm8gaXMgZXZhbHVhdGVkIHRvIGF2b2lkIHdhcm5pbmcgZnJvbSBmaW5kLgorJChldmFsICQoY2FsbCBNYWtlRGlyLCQoSU1BR0VTX09VVFBVVERJUikvc3JjKSkKICQoZXZhbCAkKGNhbGwgU2V0dXBaaXBBcmNoaXZlLEJVSUxEX1NSQ19aSVAsXAogCQlTUkM6PSQoU1JDX1pJUF9TUkNTKSAkKElNQUdFU19PVVRQVVRESVIpL3NyYyxcCiAJCUlOQ0xVREVTOj0kKFNSQ19aSVBfSU5DTFVERVMpIGxhdW5jaGVyLFwKKwkJRVhDTFVERVM6PWphdmF4L3N3aW5nL2JlYW5pbmZvLFwKIAkJU1VGRklYRVM6PS5qYXZhIC5jIC5oLFwKIAkJWklQOj0kKElNQUdFU19PVVRQVVRESVIpL3NyYy56aXAsXAogCQlFWFRSQV9ERVBTOj0kKExBVU5DSEVSX1pJUF9TUkMpKSkKZGlmZiAtLWdpdCBhL2pkay9tYWtlZmlsZXMvR2VuZGF0YUJyZWFrSXRlcmF0b3IuZ21rIGIvamRrL21ha2VmaWxlcy9HZW5kYXRhQnJlYWtJdGVyYXRvci5nbWsKaW5kZXggNTJjNmY2ZS4uZTA3YzkwYiAxMDA2NDQKLS0tIGEvamRrL21ha2VmaWxlcy9HZW5kYXRhQnJlYWtJdGVyYXRvci5nbWsKKysrIGIvamRrL21ha2VmaWxlcy9HZW5kYXRhQnJlYWtJdGVyYXRvci5nbWsKQEAgLTc1LDcgKzc1LDcgQEAKICQoQklGSUxFUyk6ICQoREFUQV9QS0dfRElSKS9fdGhlLmJpZmlsZXMKICQoREFUQV9QS0dfRElSKS9fdGhlLmJpZmlsZXM6IEpBVkFfRkxBR1MgKz0gLVhib290Y2xhc3NwYXRoL3A6JChCUkVBS19JVEVSQVRPUl9DTEFTU0VTKQogJChEQVRBX1BLR19ESVIpL190aGUuYmlmaWxlczogJChCVUlMRF9UT09MUykgJChVTklDT0RFREFUQSkgJChCVUlMRF9CUkVBS0lURVJBVE9SKQotCSQoRUNITykgIkdlbmVyYXRpbmcgQnJlYWtJdGVyYXRvckRhdGEiCisJJChFQ0hPKSAkKExPR19JTkZPKSAiR2VuZXJhdGluZyBCcmVha0l0ZXJhdG9yRGF0YSIKIAkkKE1LRElSKSAtcCAgJChEQVRBX1BLR19ESVIpCiAJJChSTSkgJChCSUZJTEVTKQogCSQoVE9PTF9HRU5FUkFURUJSRUFLSVRFUkFUT1JEQVRBKSBcCkBAIC04Niw3ICs4Niw3IEBACiAkKEJJRklMRVNfVEgpOiAkKERBVEFfUEtHX0RJUikvX3RoZS5iaWZpbGVzX3RoCiAkKERBVEFfUEtHX0RJUikvX3RoZS5iaWZpbGVzX3RoOiBKQVZBX0ZMQUdTICs9IC1YYm9vdGNsYXNzcGF0aC9wOiQoQlJFQUtfSVRFUkFUT1JfQ0xBU1NFUykKICQoREFUQV9QS0dfRElSKS9fdGhlLmJpZmlsZXNfdGg6ICQoQlVJTERfVE9PTFMpICQoVU5JQ09ERURBVEEpICQoQlVJTERfQlJFQUtJVEVSQVRPUikKLQkkKEVDSE8pICJHZW5lcmF0aW5nIEJyZWFrSXRlcmF0b3JEYXRhX3RoIgorCSQoRUNITykgJChMT0dfSU5GTykgIkdlbmVyYXRpbmcgQnJlYWtJdGVyYXRvckRhdGFfdGgiCiAJJChNS0RJUikgLXAgICQoREFUQV9QS0dfRElSKS90aAogCSQoUk0pICQoQklGSUxFU19USCkKIAkkKFRPT0xfR0VORVJBVEVCUkVBS0lURVJBVE9SREFUQSkgXApkaWZmIC0tZ2l0IGEvamRrL21ha2VmaWxlcy9HZW5kYXRhRm9udENvbmZpZy5nbWsgYi9qZGsvbWFrZWZpbGVzL0dlbmRhdGFGb250Q29uZmlnLmdtawppbmRleCBkNzQ4OTk4Li43ZjUzOTA4IDEwMDY0NAotLS0gYS9qZGsvbWFrZWZpbGVzL0dlbmRhdGFGb250Q29uZmlnLmdtaworKysgYi9qZGsvbWFrZWZpbGVzL0dlbmRhdGFGb250Q29uZmlnLmdtawpAQCAtNzUsNyArNzUsNiBAQAogCSQoUk0pICRACiAJJChNS0RJUikgLXAgJChARCkKIAkkKENQKSAkPCAkQAotCSQoQ0hNT0QpIDY0NCAkQAogCiAkKEdFTkRBVEFfRk9OVF9DT05GSUdfRFNUKS8lLmJmYyA6IFwKICAgICAkKEdFTkRBVEFfRk9OVF9DT05GSUdfU1JDX0RJUikvJChHRU5EQVRBX0ZPTlRfQ09ORklHX1NSQ19QUkVGSVgpJS5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9qZGsvbWFrZWZpbGVzL0dlbmRhdGFIdG1sMzJkdGQuZ21rIGIvamRrL21ha2VmaWxlcy9HZW5kYXRhSHRtbDMyZHRkLmdtawppbmRleCBmMWEyYzk1Li40NWE3MDVkIDEwMDY0NAotLS0gYS9qZGsvbWFrZWZpbGVzL0dlbmRhdGFIdG1sMzJkdGQuZ21rCisrKyBiL2pkay9tYWtlZmlsZXMvR2VuZGF0YUh0bWwzMmR0ZC5nbWsKQEAgLTMwLDYgKzMwLDYgQEAKIAkkKEVDSE8pICJHZW5lcmF0aW5nIEhUTUwgRFREIGZpbGUiCiAJJChNS0RJUikgLXAgJChARCkKIAkkKFJNKSAkQAotCSgkKFRPT0xfRFREQlVJTERFUikgaHRtbDMyID4gJEApIHx8IGV4aXQgMQorCSgkKFRPT0xfRFREQlVJTERFUikgJChMT0dfSU5GTykgaHRtbDMyID4gJEApIHx8IGV4aXQgMQogCi1HRU5EQVRBX0hUTUwzMkRURCArPSAkKEhUTUwzMkRURCkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitHRU5EQVRBX0hUTUwzMkRURCArPSAkKEhUTUwzMkRURCkKZGlmZiAtLWdpdCBhL2pkay9tYWtlZmlsZXMvR2VuZXJhdGVDbGFzc2VzLmdtayBiL2pkay9tYWtlZmlsZXMvR2VuZXJhdGVDbGFzc2VzLmdtawppbmRleCA0ZWJjNTZjLi4zZWUyYTA1IDEwMDY0NAotLS0gYS9qZGsvbWFrZWZpbGVzL0dlbmVyYXRlQ2xhc3Nlcy5nbWsKKysrIGIvamRrL21ha2VmaWxlcy9HZW5lcmF0ZUNsYXNzZXMuZ21rCkBAIC0zMiwxMyArMzIsMTMgQEAKICMgVG8gZW5zdXJlIHRoZSBsYXRlc3Qgc3R1YiBnZW5lcmF0b3IgZmlsZXMgYXJlIHBpY2tlZCB1cCBmcm9tIGNvcmJhIHJlcG8KICMgd2hlbiBhdmFpbGFibGUsIHdlIG5lZWQgdG8gcnVuIHdpdGggbGF0ZXN0IHJtaWMgdmVyc2lvbiBhdmFpbGFibGUuIAogaWZuZXEgKCQoQ09NUElMRV9UWVBFKSxjcm9zcykKLSAgICBSTUlDIDo9ICQoVU5DWUdEUklWRSkgJChKREtfT1VUUFVURElSKS9iaW4vcm1pYworICAgIFJNSUMgOj0gJChGSVhQQVRIKSAkKEpES19PVVRQVVRESVIpL2Jpbi9ybWljCiBlbmRpZiAgCiAKIENMQVNTRVNfRElSIDo9ICQoSkRLX09VVFBVVERJUikvY2xhc3NlcwogIyBOT1RFOiBJZiB0aGUgc21hcnQgamF2YWMgZGVwZW5kZW5jeSBtYW5hZ2VtZW50IGlzIHJlaW50cm9kdWNlZCwgdGhlc2UgY2xhc3NlcyByaXNrIAogIyBpbnRlcmZlcmluZyB3aXRoIHRoZSBkZXBlbmRlbmN5IGNoZWNraW5nLiBJbiB0aGF0IGNhc2UgdGhleSB3aWxsIG5lZWQgdG8gYmUga2VwdCBzZXBhcmF0ZS4KLVNUVUJfQ0xBU1NFU19ESVIgOj0gJChKREtfT1VUUFVURElSKS9ybWljY2xhc3NlcworU1RVQl9DTEFTU0VTX0RJUiA6PSAkKEpES19PVVRQVVRESVIpL2NsYXNzZXMKIFJNSUNfR0VOU1JDX0RJUiA6PSAkKEpES19PVVRQVVRESVIpL2dlbmRvY3NyY19ybWljCiAKIEdFTkNMQVNTRVMgOj0KQEAgLTkxLDggKzkxLDEwIEBACiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCi1hbGw6ICQoR0VOQ0xBU1NFUykKKyQoUk1JQ19HRU5TUkNfRElSKS9fdGhlLmNsYXNzZXMucmVtb3ZlZDogJChHRU5DTEFTU0VTKQogCSQoRklORCkgJChSTUlDX0dFTlNSQ19ESVIpIC1uYW1lICIqLmNsYXNzIiAkKEZJTkRfREVMRVRFKQotCSQoQ1ApIC1ycCAkKFNUVUJfQ0xBU1NFU19ESVIpLyogJChDTEFTU0VTX0RJUikKKwkkKFRPVUNIKSAkQAorCithbGw6ICQoUk1JQ19HRU5TUkNfRElSKS9fdGhlLmNsYXNzZXMucmVtb3ZlZCAkKEdFTkNMQVNTRVMpCiAKIC5QSE9OWTogYWxsCmRpZmYgLS1naXQgYS9qZGsvbWFrZWZpbGVzL0dlbmVyYXRlSmF2YVNvdXJjZXMuZ21rIGIvamRrL21ha2VmaWxlcy9HZW5lcmF0ZUphdmFTb3VyY2VzLmdtawppbmRleCA1NDZiN2U5Li5kYjcwYzczIDEwMDY0NAotLS0gYS9qZGsvbWFrZWZpbGVzL0dlbmVyYXRlSmF2YVNvdXJjZXMuZ21rCisrKyBiL2pkay9tYWtlZmlsZXMvR2VuZXJhdGVKYXZhU291cmNlcy5nbWsKQEAgLTY3LDcgKzY3LDExIEBACiAKIGlmbmVxICgkKE9QRU5KREtfVEFSR0VUX09TKSx3aW5kb3dzKQogaW5jbHVkZSBHZW5zcmNJY29ucy5nbWsKLUdFTlNSQyArPSAkKEdFTlNSQ19JQ09OUykKK0dFTlNSQyArPSAkKEdFTlNSQ19YMTFfSUNPTlMpCisKK2lmZXEgKCQoT1BFTkpES19UQVJHRVRfT1MpLG1hY29zeCkKK0dFTlNSQyArPSAkKEdFTlNSQ19PU1hfSUNPTlMpCitlbmRpZgogCiBpbmNsdWRlIEdlbnNyY1gxMVdyYXBwZXJzLmdtawogR0VOU1JDICs9ICQoR0VOU1JDX1gxMVdSQVBQRVJTKQpAQCAtNzcsOSArODEsNyBAQAogR0VOU1JDICs9ICQoR0VOU1JDX0NMRFIpCiAKIGluY2x1ZGUgR2Vuc3JjU3dpbmcuZ21rCi1pZm5kZWYgRElTQUJMRV9OSU1CVVMKLSAgR0VOU1JDICs9ICQoR0VOU1JDX1NXSU5HX05JTUJVUykKLWVuZGlmCitHRU5TUkMgKz0gJChHRU5TUkNfU1dJTkdfQkVBTklORk8pICQoR0VOU1JDX1NXSU5HX05JTUJVUykKIAogaWZlcSAoJChPUEVOSkRLX1RBUkdFVF9PUyksIG1hY29zeCkKICAgICAgaW5jbHVkZSBHZW5zcmNKT2JqQy5nbWsKQEAgLTg4LDM0ICs5MCw3IEBACiAKICQoR0VOU1JDKSA6ICQoQlVJTERfVE9PTFMpCiAKLSMgVGhlIGV4Y2VwdGlvbiBoYW5kbGluZyBvZiBzd2luZyBiZWFuaW5mbwotIyBnZW5zcmNfc3dpbmcvamF2YXgvc3dpbmcvYmVhbmluZm8vKiBoYXZlIG5vdCBiZSBpbiBzcmMuemlwCi1hbGw6ICQoR0VOU1JDKSAkKEdFTlNSQ19TV0lOR19CRUFOSU5GTykKLQkkKE1LRElSKSAtcCAkKEpES19PVVRQVVRESVIpL2dlbnNyYwotCShjZCAkKEpES19PVVRQVVRESVIpICYmIFwKLQkJJChDSE1PRCkgLVIgdStydyBnZW5zcmMgJiYgXAotCQkkKENQKSAtcnAgZ2Vuc3JjX2NoYXJhY3RlcmRhdGEvKiBnZW5zcmMgJiYgXAotCQkkKENQKSAtcnAgZ2Vuc3JjX3Byb3BlcnRpZXMvKiBnZW5zcmMgJiYgXAotCQkkKENQKSAtcnAgZ2Vuc3JjX2xvY2FsZWRhdGFtZXRhaW5mby8qIGdlbnNyYyAmJiBcCi0JCSQoQ1ApIC1ycCBnZW5zcmNfamR3cC8qIGdlbnNyYyAmJiBcCi0JCSQoQ1ApIC1ycCBnZW5zcmNfbWlzYy8qIGdlbnNyYyAmJiBcCi0JCSQoQ1ApIC1ycCBnZW5zcmNfY2hhcnNldG1hcHBpbmcvKiBnZW5zcmMgJiYgXAotCQkkKENQKSAtcnAgZ2Vuc3JjX2NoYXJzZXRjb2Rlci8qIGdlbnNyYyAmJiBcCi0JCSQoQ1ApIC1ycCBnZW5zcmNfZXhjZXB0aW9ucy8qIGdlbnNyYyAmJiBcCi0JCSQoQ1ApIC1ycCBnZW5zcmNfYnVmZmVyLyogZ2Vuc3JjICYmIFwKLQkJJChDUCkgLXJwIGdlbnNyY19jbGRyLyogZ2Vuc3JjKQotCWlmIFsgLWQgICQoSkRLX09VVFBVVERJUikvZ2Vuc3JjX3N3aW5nL2phdmF4L3N3aW5nL3BsYWYgXSA7IHRoZW4gXAotCQkoY2QgJChKREtfT1VUUFVURElSKSAmJiBcCi0JCSQoTUtESVIpIC1wIGdlbnNyYy9qYXZheC9zd2luZy9wbGFmICYmIFwKLQkJJChDUCkgLXJwIGdlbnNyY19zd2luZy9qYXZheC9zd2luZy9wbGFmLyogZ2Vuc3JjL2phdmF4L3N3aW5nL3BsYWYpIFwKLQlmaQotCWlmIFsgLWQgJChKREtfT1VUUFVURElSKS9nZW5zcmNfam9iamMgXSA7IHRoZW4gXAotCQkoY2QgJChKREtfT1VUUFVURElSKSAmJiBjcCAtcnAgZ2Vuc3JjX2pvYmpjL3NyYy8qIGdlbnNyYykgXAotCWZpCi1pZm5lcSAoJChPUEVOSkRLX1RBUkdFVF9PUyksd2luZG93cykKLQkoY2QgJChKREtfT1VUUFVURElSKSAmJiBcCi0JCSQoQ1ApIC1ycCBnZW5zcmNfaWNvbnMvKiBnZW5zcmMgJiYgXAotCQkkKENQKSAtcnAgZ2Vuc3JjX3gxMXdyYXBwZXJzL2NsYXNzZXMvKiBnZW5zcmMpCi1lbmRpZgorYWxsOiAkKEdFTlNSQykKKwogCiAuUEhPTlk6IGFsbApkaWZmIC0tZ2l0IGEvamRrL21ha2VmaWxlcy9HZW5zcmNCdWZmZXIuZ21rIGIvamRrL21ha2VmaWxlcy9HZW5zcmNCdWZmZXIuZ21rCmluZGV4IGYyZjQ1MGIuLjNlNTViMWMgMTAwNjQ0Ci0tLSBhL2pkay9tYWtlZmlsZXMvR2Vuc3JjQnVmZmVyLmdtaworKysgYi9qZGsvbWFrZWZpbGVzL0dlbnNyY0J1ZmZlci5nbWsKQEAgLTI1LDE0ICsyNSwxNCBAQAogCiBHRU5TUkNfQlVGRkVSIDo9CiAKLUdFTlNSQ19CVUZGRVJfVE1QIDo9ICQoSkRLX09VVFBVVERJUikvZ2Vuc3JjX2J1ZmZlcgotR0VOU1JDX0JVRkZFUl9EU1QgOj0gJChKREtfT1VUUFVURElSKS9nZW5zcmNfYnVmZmVyL2phdmEvbmlvCitHRU5TUkNfQlVGRkVSX1RNUCA6PSAkKEpES19PVVRQVVRESVIpL2dlbnNyYworR0VOU1JDX0JVRkZFUl9EU1QgOj0gJChKREtfT1VUUFVURElSKS9nZW5zcmMvamF2YS9uaW8KIAogR0VOU1JDX0JVRkZFUl9TUkMgOj0gJChKREtfVE9QRElSKS9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL25pbwogCiAjIyMKIAotJChHRU5TUkNfQlVGRkVSX0RTVCkvX3RoZS5kaXIgOgorJChHRU5TUkNfQlVGRkVSX0RTVCkvX3RoZS5idWZmZXIuZGlyIDoKIAkkKEVDSE8pICJHZW5lcmF0aW5nIGJ1ZmZlciBjbGFzc2VzIgogCSQoTUtESVIpIC1wICQoQEQpCiAJJChUT1VDSCkgJEAKQEAgLTE5OCw3ICsxOTgsOSBAQAogCSQoaWYgJCgxMiksJDFfJChzdHJpcCAkKDEyKSkpCiAJJChpZiAkKDEzKSwkMV8kKHN0cmlwICQoMTMpKSkKIAkkKGlmICQoMTQpLCQxXyQoc3RyaXAgJCgxNCkpKQotCSQoaWYgJCgxNSksJChlcnJvciBJbnRlcm5hbCBtYWtlZmlsZSBlcnJvcjogVG9vIG1hbnkgYXJndW1lbnRzIHRvIFNldHVwR2VuQnVmZmVyLCBwbGVhc2UgdXBkYXRlIEdlbnNyY0J1ZmZlci5nbWspKQorCSQoZm9yZWFjaCBpLDMgNCA1IDYgNyA4IDkgMTAgMTEgMTIgMTMgMTQgMTUsJChpZiAkKCRpKSwkMV8kKHN0cmlwICQoJGkpKSkkKE5FV0xJTkUpKQorCSQoY2FsbCBMb2dTZXR1cE1hY3JvRW50cnksU2V0dXBHZW5CdWZmZXIoJDEpLCQyLCQzLCQ0LCQ1LCQ2LCQ3LCQ4LCQ5LCQoMTApLCQoMTEpLCQoMTIpLCQoMTMpLCQoMTQpLCQoMTUpKQorCSQoaWYgJCgxNiksJChlcnJvciBJbnRlcm5hbCBtYWtlZmlsZSBlcnJvcjogVG9vIG1hbnkgYXJndW1lbnRzIHRvIFNldHVwR2VuQnVmZmVyLCBwbGVhc2UgdXBkYXRlIEdlbnNyY0J1ZmZlci5nbWspKQogCiAJJChjYWxsIGZpeFJ3LCQxLCQkKCQxX1JXKSkKIAkkKGNhbGwgdHlwZXNBbmRCaXRzLCQxLCQkKCQxX3R5cGUpLCQkKCQxX0JPKSkKQEAgLTIyNSw3ICsyMjcsNyBAQAogCQkkKGNhbGwgZ2VuQmluT3BzLCQxX2RvdWJsZSxkb3VibGUsJCQoJDFfQk8pLCQkKCQxX1JXKSxlaWdodCxzZXZlbikKIAllbmRpZgogCi0kJCgkMV9EU1QpIDogJCQoJDFfREVQKSAkKEdFTlNSQ19CVUZGRVJfRFNUKS9fdGhlLmRpcgorJCQoJDFfRFNUKSA6ICQkKCQxX0RFUCkgJChHRU5TUkNfQlVGRkVSX0RTVCkvX3RoZS5idWZmZXIuZGlyCiAJJChUT09MX1NQUCkgPCAkJCgkMV9TUkMpID4gJCQoJDFfT1VUKS50bXAgXAogCQktSyQkKCQxX3R5cGUpIFwKIAkJLUskJCgkMV9jYXRlZ29yeSkgXApkaWZmIC0tZ2l0IGEvamRrL21ha2VmaWxlcy9HZW5zcmNDTERSLmdtayBiL2pkay9tYWtlZmlsZXMvR2Vuc3JjQ0xEUi5nbWsKaW5kZXggMWNkMzc0OS4uYTg2YzEyMiAxMDA2NDQKLS0tIGEvamRrL21ha2VmaWxlcy9HZW5zcmNDTERSLmdtaworKysgYi9qZGsvbWFrZWZpbGVzL0dlbnNyY0NMRFIuZ21rCkBAIC0yNiw3ICsyNiw3IEBACiBDTERSVkVSU0lPTiA6PSAyMS4wLjEKIENMRFJTUkNESVIgOj0gJChKREtfVE9QRElSKS9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vdXRpbC9jbGRyL3Jlc291cmNlcy8kKHN1YnN0IC4sXywkKENMRFJWRVJTSU9OKSkKIAotR0VOU1JDX0RJUiA6PSAkKEpES19PVVRQVVRESVIpL2dlbnNyY19jbGRyCitHRU5TUkNfRElSIDo9ICQoSkRLX09VVFBVVERJUikvZ2Vuc3JjCiAKIENMRFJfTUVUQUlORk9fRklMRSA6PSAkKEdFTlNSQ19ESVIpL3N1bi91dGlsL2NsZHIvQ0xEUkxvY2FsZURhdGFNZXRhSW5mby5qYXZhCiAKZGlmZiAtLWdpdCBhL2pkay9tYWtlZmlsZXMvR2Vuc3JjQ2hhcmFjdGVyRGF0YS5nbWsgYi9qZGsvbWFrZWZpbGVzL0dlbnNyY0NoYXJhY3RlckRhdGEuZ21rCmluZGV4IDYzMGI1NDcuLmU3MjBhYjggMTAwNjQ0Ci0tLSBhL2pkay9tYWtlZmlsZXMvR2Vuc3JjQ2hhcmFjdGVyRGF0YS5nbWsKKysrIGIvamRrL21ha2VmaWxlcy9HZW5zcmNDaGFyYWN0ZXJEYXRhLmdtawpAQCAtMjQsNyArMjQsNyBAQAogIwogCiAjCi0jIFJ1bGVzIHRvIGNyZWF0ZSAkKEpES19PVVRQVVRESVIpL2dlbnNyY19jaGFyYWN0ZXJkYXRhL3N1bi9sYW5nL0NoYXJhY3RlckRhdGEqLmphdmEgCisjIFJ1bGVzIHRvIGNyZWF0ZSAkKEpES19PVVRQVVRESVIpL2dlbnNyYy9zdW4vbGFuZy9DaGFyYWN0ZXJEYXRhKi5qYXZhIAogIwogCiBHRU5TUkNfQ0hBUkFDVEVSREFUQTo9CkBAIC0zMywxOCArMzMsMTggQEAKIFVOSUNPREVEQVRBICAgPSAkKEpES19UT1BESVIpL21ha2UvdG9vbHMvVW5pY29kZURhdGEKIAogZGVmaW5lIFNldHVwQ2hhcmFjdGVyRGF0YQotICAgICQoSkRLX09VVFBVVERJUikvZ2Vuc3JjX2NoYXJhY3RlcmRhdGEvamF2YS9sYW5nLyQxLmphdmEgOiAkKENIQVJBQ1RFUkRBVEEpLyQxLmphdmEudGVtcGxhdGUgJChCVUlMRF9UT09MUykKKyAgICAkKEpES19PVVRQVVRESVIpL2dlbnNyYy9qYXZhL2xhbmcvJDEuamF2YSA6ICQoQ0hBUkFDVEVSREFUQSkvJDEuamF2YS50ZW1wbGF0ZSAkKEJVSUxEX1RPT0xTKQogCSQoTUtESVIpIC1wICQkKEBEKQotCSQoRUNITykgR2VuZXJhdGluZyAkMS5qYXZhCisJJChFQ0hPKSAkKExPR19JTkZPKSBHZW5lcmF0aW5nICQxLmphdmEKIAkkKFRPT0xfR0VORVJBVEVDSEFSQUNURVIpICQyIFwKIAkJLXRlbXBsYXRlICQoQ0hBUkFDVEVSREFUQSkvJDEuamF2YS50ZW1wbGF0ZSBcCiAJCS1zcGVjICQoVU5JQ09ERURBVEEpL1VuaWNvZGVEYXRhLnR4dCBcCiAJCS1zcGVjaWFsY2FzaW5nICQoVU5JQ09ERURBVEEpL1NwZWNpYWxDYXNpbmcudHh0IFwKIAkJLXByb3BsaXN0ICQoVU5JQ09ERURBVEEpL1Byb3BMaXN0LnR4dCBcCi0JCS1vICQoSkRLX09VVFBVVERJUikvZ2Vuc3JjX2NoYXJhY3RlcmRhdGEvamF2YS9sYW5nLyQxLmphdmEgLXN0cmluZyBcCisJCS1vICQoSkRLX09VVFBVVERJUikvZ2Vuc3JjL2phdmEvbGFuZy8kMS5qYXZhIC1zdHJpbmcgXAogCQktdXNlY2hhcmZvcmJ5dGUgJDMKIAotICAgIEdFTlNSQ19DSEFSQUNURVJEQVRBICs9ICQoSkRLX09VVFBVVERJUikvZ2Vuc3JjX2NoYXJhY3RlcmRhdGEvamF2YS9sYW5nLyQxLmphdmEKKyAgICBHRU5TUkNfQ0hBUkFDVEVSREFUQSArPSAkKEpES19PVVRQVVRESVIpL2dlbnNyYy9qYXZhL2xhbmcvJDEuamF2YQogZW5kZWYKIAogJChldmFsICQoY2FsbCBTZXR1cENoYXJhY3RlckRhdGEsQ2hhcmFjdGVyRGF0YUxhdGluMSwsLWxhdGluMSA4KSkKQEAgLTU0LDEyICs1NCwxMiBAQAogJChldmFsICQoY2FsbCBTZXR1cENoYXJhY3RlckRhdGEsQ2hhcmFjdGVyRGF0YTBFLC1wbGFuZSAxNCwxMSA0IDEpKQogCiAjIENvcHkgdHdvIEphdmEgZmlsZXMgdGhhdCBuZWVkIG5vIHByZXByb2Nlc3NpbmcuCi0kKEpES19PVVRQVVRESVIpL2dlbnNyY19jaGFyYWN0ZXJkYXRhL2phdmEvbGFuZy8lLmphdmEgOiAkKENIQVJBQ1RFUkRBVEEpLyUuamF2YS50ZW1wbGF0ZQorJChKREtfT1VUUFVURElSKS9nZW5zcmMvamF2YS9sYW5nLyUuamF2YSA6ICQoQ0hBUkFDVEVSREFUQSkvJS5qYXZhLnRlbXBsYXRlCiAJJChNS0RJUikgLXAgJChARCkKLQkkKEVDSE8pIEdlbmVyYXRpbmcgJChARikKKwkkKEVDSE8pICQoTE9HX0lORk8pIEdlbmVyYXRpbmcgJChARikKIAkkKENQKSAtZiAkPCAkQAogCi1HRU5TUkNfQ0hBUkFDVEVSREFUQSArPSAkKEpES19PVVRQVVRESVIpL2dlbnNyY19jaGFyYWN0ZXJkYXRhL2phdmEvbGFuZy9DaGFyYWN0ZXJEYXRhVW5kZWZpbmVkLmphdmEgXAotICAgICAgICAgICAgICAgICAgICAgICAkKEpES19PVVRQVVRESVIpL2dlbnNyY19jaGFyYWN0ZXJkYXRhL2phdmEvbGFuZy9DaGFyYWN0ZXJEYXRhUHJpdmF0ZVVzZS5qYXZhCitHRU5TUkNfQ0hBUkFDVEVSREFUQSArPSAkKEpES19PVVRQVVRESVIpL2dlbnNyYy9qYXZhL2xhbmcvQ2hhcmFjdGVyRGF0YVVuZGVmaW5lZC5qYXZhIFwKKyAgICAgICAgICAgICAgICAgICAgICAgJChKREtfT1VUUFVURElSKS9nZW5zcmMvamF2YS9sYW5nL0NoYXJhY3RlckRhdGFQcml2YXRlVXNlLmphdmEKIAogJChHRU5TUkNfQ0hBUkFDVEVSREFUQSkgOiAkKEJVSUxEX1RPT0xTKQpkaWZmIC0tZ2l0IGEvamRrL21ha2VmaWxlcy9HZW5zcmNDaGFyc2V0Q29kZXIuZ21rIGIvamRrL21ha2VmaWxlcy9HZW5zcmNDaGFyc2V0Q29kZXIuZ21rCmluZGV4IDc0YzFhMWUuLjFhZTcxNDkgMTAwNjQ0Ci0tLSBhL2pkay9tYWtlZmlsZXMvR2Vuc3JjQ2hhcnNldENvZGVyLmdtaworKysgYi9qZGsvbWFrZWZpbGVzL0dlbnNyY0NoYXJzZXRDb2Rlci5nbWsKQEAgLTI1LDggKzI1LDggQEAKIAogR0VOU1JDX0NIQVJTRVRDT0RFUiA6PQogCi1HRU5TUkNfQ0hBUlNFVENPREVSX1RNUCA6PSAkKEpES19PVVRQVVRESVIpL2dlbnNyY19jaGFyc2V0Y29kZXIKLUdFTlNSQ19DSEFSU0VUQ09ERVJfRFNUIDo9ICQoSkRLX09VVFBVVERJUikvZ2Vuc3JjX2NoYXJzZXRjb2Rlci9qYXZhL25pby9jaGFyc2V0CitHRU5TUkNfQ0hBUlNFVENPREVSX1RNUCA6PSAkKEpES19PVVRQVVRESVIpL2dlbnNyYworR0VOU1JDX0NIQVJTRVRDT0RFUl9EU1QgOj0gJChKREtfT1VUUFVURElSKS9nZW5zcmMvamF2YS9uaW8vY2hhcnNldAogCiBHRU5TUkNfQ0hBUlNFVENPREVSX1NSQyA6PSAkKEpES19UT1BESVIpL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvbmlvCiAKZGlmZiAtLWdpdCBhL2pkay9tYWtlZmlsZXMvR2Vuc3JjQ2hhcnNldE1hcHBpbmcuZ21rIGIvamRrL21ha2VmaWxlcy9HZW5zcmNDaGFyc2V0TWFwcGluZy5nbWsKaW5kZXggNmZmMjFhZC4uNWQzMjA5MiAxMDA2NDQKLS0tIGEvamRrL21ha2VmaWxlcy9HZW5zcmNDaGFyc2V0TWFwcGluZy5nbWsKKysrIGIvamRrL21ha2VmaWxlcy9HZW5zcmNDaGFyc2V0TWFwcGluZy5nbWsKQEAgLTI1LDggKzI1LDggQEAKIAogR0VOU1JDX0NIQVJTRVRNQVBQSU5HOj0KIAotR0VOU1JDX1RNUCA6PSAkKEpES19PVVRQVVRESVIpL2dlbnNyY19jaGFyc2V0bWFwcGluZwotR0VOU1JDX0RTVCA6PSAkKEpES19PVVRQVVRESVIpL2dlbnNyY19jaGFyc2V0bWFwcGluZy9zdW4vbmlvL2NzCitHRU5TUkNfVE1QIDo9ICQoSkRLX09VVFBVVERJUikvZ2Vuc3JjCitHRU5TUkNfRFNUIDo9ICQoSkRLX09VVFBVVERJUikvZ2Vuc3JjL3N1bi9uaW8vY3MKIAogR0VOU1JDX1NSQyA6PSAkKEpES19UT1BESVIpL21ha2UvdG9vbHMvQ2hhcnNldE1hcHBpbmcKIEdFTlNSQ19KQVZBX1NSQyA6PSAkKEpES19UT1BESVIpL21ha2UvdG9vbHMvc3JjL2J1aWxkL3Rvb2xzL2NoYXJzZXRtYXBwaW5nCkBAIC0zNSwxNyArMzUsMTcgQEAKIAogIyMjCiAKLSQoR0VOU1JDX1RNUCkvX3RoZS5kaXIgOgorJChHRU5TUkNfVE1QKS9fdGhlLmNoYXJzZXRtYXBwaW5nLmRpciA6CiAJJChFQ0hPKSBHZW5lcmF0aW5nIGNoYXJzZXRtYXBwaW5nIGNsYXNzZXMKIAkkKE1LRElSKSAtcCAkKEdFTlNSQ19EU1QpL2V4dAogCSQoVE9VQ0gpICRACiAKICMjIwogCi1HRU5TUkNfU0IgOj0gJChHRU5TUkNfVE1QKS9nZW5zcmNfdGhlLmNoYXJzZXRtYXBwaW5nLnNiY3MKK0dFTlNSQ19TQiA6PSAkKEdFTlNSQ19UTVApL190aGUuY2hhcnNldG1hcHBpbmcuc2JjcwogCi0kKEdFTlNSQ19TQikgOiAkKEdFTlNSQ19TUkMpL3NiY3MgJChHRU5TUkNfVEVNUExBVEVTKSAkKEdFTlNSQ19UTVApL190aGUuZGlyCi0JJChUT09MX0NIQVJTRVRNQVBQSU5HKSAkKEdFTlNSQ19TUkMpICQoR0VOU1JDX0RTVCkgc2JjcworJChHRU5TUkNfU0IpIDogJChHRU5TUkNfU1JDKS9zYmNzICQoR0VOU1JDX1RFTVBMQVRFUykgJChHRU5TUkNfVE1QKS9fdGhlLmNoYXJzZXRtYXBwaW5nLmRpcgorCSQoVE9PTF9DSEFSU0VUTUFQUElORykgJChMT0dfSU5GTykgJChHRU5TUkNfU1JDKSAkKEdFTlNSQ19EU1QpIHNiY3MKIAkkKFRPVUNIKSAkQAogCiBHRU5TUkNfQ0hBUlNFVE1BUFBJTkcgKz0gJChHRU5TUkNfU0IpCkBAIC01MywyOCArNTMsMjggQEAKICMjIwogCiAkKEdFTlNSQ19EU1QpL2V4dC9zamlzMDIxMy5kYXQgOiAkKEdFTlNSQ19TUkMpL3NqaXMwMjEzLm1hcCAkKEdFTlNSQ19TQikKLQkkKFRPT0xfQ0hBUlNFVE1BUFBJTkcpICQ8ICRAIHNqaXMwMjEzCisJJChUT09MX0NIQVJTRVRNQVBQSU5HKSAkKExPR19JTkZPKSAkPCAkQCBzamlzMDIxMwogCiBHRU5TUkNfQ0hBUlNFVE1BUFBJTkcgKz0gJChHRU5TUkNfRFNUKS9leHQvc2ppczAyMTMuZGF0CiAKICMjIwogCiAkKEdFTlNSQ19EU1QpL2V4dC9FVUNfVFdNYXBwaW5nLmphdmEgOiAkKEdFTlNSQ19KQVZBX1NSQykvRVVDX1RXLmphdmEgJChHRU5TUkNfU0IpCi0JJChUT09MX0NIQVJTRVRNQVBQSU5HKSAkKEdFTlNSQ19TUkMpICQoR0VOU1JDX0RTVCkvZXh0IGV1Y3R3ICQoR0VOU1JDX0pBVkFfU1JDKS9FVUNfVFcuamF2YQorCSQoVE9PTF9DSEFSU0VUTUFQUElORykgJChMT0dfSU5GTykgJChHRU5TUkNfU1JDKSAkKEdFTlNSQ19EU1QpL2V4dCBldWN0dyAkKEdFTlNSQ19KQVZBX1NSQykvRVVDX1RXLmphdmEKIAogR0VOU1JDX0NIQVJTRVRNQVBQSU5HICs9ICQoR0VOU1JDX0RTVCkvZXh0L0VVQ19UV01hcHBpbmcuamF2YQogCiAjIyMKIAogJChHRU5TUkNfRFNUKS9leHQvSEtTQ1NNYXBwaW5nLmphdmEgOiAkKEdFTlNSQ19KQVZBX1NSQykvSEtTQ1MuamF2YSAkKEdFTlNSQ19TQikKLQkkKFRPT0xfQ0hBUlNFVE1BUFBJTkcpICQoR0VOU1JDX1NSQykgJChHRU5TUkNfRFNUKS9leHQgaGtzY3MgJChHRU5TUkNfSkFWQV9TUkMpL0hLU0NTLmphdmEKKwkkKFRPT0xfQ0hBUlNFVE1BUFBJTkcpICQoTE9HX0lORk8pICQoR0VOU1JDX1NSQykgJChHRU5TUkNfRFNUKS9leHQgaGtzY3MgJChHRU5TUkNfSkFWQV9TUkMpL0hLU0NTLmphdmEKIAogR0VOU1JDX0NIQVJTRVRNQVBQSU5HICs9ICQoR0VOU1JDX0RTVCkvZXh0L0hLU0NTTWFwcGluZy5qYXZhCiAKICMjIwogCiAkKEdFTlNSQ19UTVApL2dlbnNyY190aGUuY2hhcnNldG1hcHBpbmcuZXh0c2JjcyA6ICQoR0VOU1JDX1NSQykvZXh0c2JjcyAkKEdFTlNSQ19URU1QTEFURVMpICQoR0VOU1JDX1NCKQotCSQoVE9PTF9DSEFSU0VUTUFQUElORykgJChHRU5TUkNfU1JDKSAkKEdFTlNSQ19EU1QpL2V4dCBleHRzYmNzCisJJChUT09MX0NIQVJTRVRNQVBQSU5HKSAkKEdFTlNSQ19TUkMpICQoTE9HX0lORk8pICQoR0VOU1JDX0RTVCkvZXh0IGV4dHNiY3MKIAkkKFRPVUNIKSAkQAogCiBHRU5TUkNfQ0hBUlNFVE1BUFBJTkcgKz0gJChHRU5TUkNfVE1QKS9nZW5zcmNfdGhlLmNoYXJzZXRtYXBwaW5nLmV4dHNiY3MKQEAgLTgyLDcgKzgyLDcgQEAKICMjIwogCiAkKEdFTlNSQ19UTVApL2dlbnNyY190aGUuY2hhcnNldG1hcHBpbmcuZGJjcyA6ICQoR0VOU1JDX1NSQykvZGJjcyAkKEdFTlNSQ19URU1QTEFURVMpICQoR0VOU1JDX1NCKQotCSQoVE9PTF9DSEFSU0VUTUFQUElORykgJChHRU5TUkNfU1JDKSAkKEdFTlNSQ19EU1QpL2V4dCBkYmNzCisJJChUT09MX0NIQVJTRVRNQVBQSU5HKSAkKEdFTlNSQ19TUkMpICQoTE9HX0lORk8pICQoR0VOU1JDX0RTVCkvZXh0IGRiY3MKIAkkKFRPVUNIKSAkQAogCiBHRU5TUkNfQ0hBUlNFVE1BUFBJTkcgKz0gJChHRU5TUkNfVE1QKS9nZW5zcmNfdGhlLmNoYXJzZXRtYXBwaW5nLmRiY3MKQEAgLTkzLDEyICs5MywxMiBAQAogCiAkKEdFTlNSQ19EU1QpL1N0YW5kYXJkQ2hhcnNldHMuamF2YSA6ICQoSkRLX1RPUERJUikvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL25pby9jcy9zdGFuZGFyZC1jaGFyc2V0cyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoR0VOU1JDX0NIQVJTRVRfUFJPVklERVJfQ01EKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoR0VOU1JDX1RNUCkvX3RoZS5kaXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChHRU5TUkNfVE1QKS9fdGhlLmNoYXJzZXRtYXBwaW5nLmRpcgogCiAJTkFXSz0iJChOQVdLKSIgVEVNUERJUj0iJChHRU5TUkNfVE1QKSIgU0g9IiQoU0gpIiBcCiAJICBIQVNIRVI9IiQoVE9PTF9IQVNIRVIpIiBcCiAgICAgICAgICAgU0NSSVBUUz0iJChKREtfVE9QRElSKS9tYWtlZmlsZXMvc2NyaXB0cyIgXAotCSAgJChTSCkgLWUgJChHRU5TUkNfQ0hBUlNFVF9QUk9WSURFUl9DTUQpICQ8ICQoQEQpCisJICAkKFNIKSAtZSAkKEdFTlNSQ19DSEFSU0VUX1BST1ZJREVSX0NNRCkgJChMT0dfSU5GTykgJDwgJChARCkKIAogR0VOU1JDX0NIQVJTRVRNQVBQSU5HICs9ICQoR0VOU1JDX0RTVCkvU3RhbmRhcmRDaGFyc2V0cy5qYXZhCiAKZGlmZiAtLWdpdCBhL2pkay9tYWtlZmlsZXMvR2Vuc3JjRXhjZXB0aW9ucy5nbWsgYi9qZGsvbWFrZWZpbGVzL0dlbnNyY0V4Y2VwdGlvbnMuZ21rCmluZGV4IDFhMWY3MTcuLmExY2QzOTMgMTAwNjQ0Ci0tLSBhL2pkay9tYWtlZmlsZXMvR2Vuc3JjRXhjZXB0aW9ucy5nbWsKKysrIGIvamRrL21ha2VmaWxlcy9HZW5zcmNFeGNlcHRpb25zLmdtawpAQCAtMjUsOCArMjUsOCBAQAogCiBHRU5TUkNfRVhDRVBUSU9OUyA6PQogCi1HRU5TUkNfRVhDRVBUSU9OU19UTVAgOj0gJChKREtfT1VUUFVURElSKS9nZW5zcmNfZXhjZXB0aW9ucwotR0VOU1JDX0VYQ0VQVElPTlNfRFNUIDo9ICQoSkRLX09VVFBVVERJUikvZ2Vuc3JjX2V4Y2VwdGlvbnMvamF2YS9uaW8KK0dFTlNSQ19FWENFUFRJT05TX1RNUCA6PSAkKEpES19PVVRQVVRESVIpL2dlbnNyYworR0VOU1JDX0VYQ0VQVElPTlNfRFNUIDo9ICQoSkRLX09VVFBVVERJUikvZ2Vuc3JjL2phdmEvbmlvCiAKIEdFTlNSQ19FWENFUFRJT05TX1NSQyA6PSAkKEpES19UT1BESVIpL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvbmlvCiBHRU5TUkNfRVhDRVBUSU9OU19DTUQgOj0gJChKREtfVE9QRElSKS9tYWtlZmlsZXMvc2NyaXB0cy9nZW5FeGNlcHRpb25zLnNoCkBAIC0zNSw3ICszNSw3IEBACiAKICMjIwogCi0kKEdFTlNSQ19FWENFUFRJT05TX0RTVCkvX3RoZS5kaXIgOgorJChHRU5TUkNfRVhDRVBUSU9OU19EU1QpL190aGUuZXhjZXB0aW9ucy5kaXIgOgogCSQoRUNITykgIkdlbmVyYXRpbmcgZXhjZXB0aW9ucyBjbGFzc2VzIgogCSQoTUtESVIpIC1wICQoQEQpCiAJJChUT1VDSCkgJEAKQEAgLTQ1LDkgKzQ1LDkgQEAKIAogJChHRU5TUkNfRVhDRVBUSU9OU19EU1QpL190aGUuJSA6ICQoR0VOU1JDX0VYQ0VQVElPTlNfU1JDKS8lL2V4Y2VwdGlvbnMgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoR0VOU1JDX0VYQ0VQVElPTlNfQ01EKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChHRU5TUkNfRVhDRVBUSU9OU19EU1QpL190aGUuZGlyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChHRU5TUkNfRVhDRVBUSU9OU19EU1QpL190aGUuZXhjZXB0aW9ucy5kaXIKIAkkKE1LRElSKSAtcCAkKEBEKS8kKgotCVNDUklQVFM9IiQoSkRLX1RPUERJUikvbWFrZWZpbGVzL3NjcmlwdHMiIE5BV0s9IiQoTkFXSykiIFNIPSIkKFNIKSIgJChTSCkgJChHRU5TUkNfRVhDRVBUSU9OU19DTUQpICQ8ICQoQEQpLyQqCisJU0NSSVBUUz0iJChKREtfVE9QRElSKS9tYWtlZmlsZXMvc2NyaXB0cyIgTkFXSz0iJChOQVdLKSIgU0g9IiQoU0gpIiAkKFNIKSAkKEdFTlNSQ19FWENFUFRJT05TX0NNRCkgJDwgJChARCkvJCogJChMT0dfSU5GTykgCiAJJChUT1VDSCkgJEAKIAogR0VOU1JDX0VYQ0VQVElPTlMgKz0gJChmb3JlYWNoIEQsJChHRU5TUkNfRVhDRVBUSU9OU19TUkNfRElSUyksJChHRU5TUkNfRVhDRVBUSU9OU19EU1QpL190aGUuJChEKSkKZGlmZiAtLWdpdCBhL2pkay9tYWtlZmlsZXMvR2Vuc3JjSWNvbnMuZ21rIGIvamRrL21ha2VmaWxlcy9HZW5zcmNJY29ucy5nbWsKaW5kZXggNTJjYjQxOC4uYTZhOGEwMSAxMDA2NDQKLS0tIGEvamRrL21ha2VmaWxlcy9HZW5zcmNJY29ucy5nbWsKKysrIGIvamRrL21ha2VmaWxlcy9HZW5zcmNJY29ucy5nbWsKQEAgLTIzLDg0ICsyMywxMDUgQEAKICMgcXVlc3Rpb25zLgogIwogCi1HRU5TUkNfSUNPTlMgOj0KLUdFTlNSQ19JQ09OU19TUkMgOj0KLUdFTlNSQ19JQ09OU19UTVAgOj0gJChKREtfT1VUUFVURElSKS9nZW5zcmNfaWNvbnMKLUdFTlNSQ19JQ09OU19EU1QgOj0gJChHRU5TUkNfSUNPTlNfVE1QKS9zdW4vYXd0L1gxMQorR0VOU1JDX1gxMV9JQ09OUyA6PQorR0VOU1JDX1gxMV9JQ09OU19TUkMgOj0KK0dFTlNSQ19YMTFfSUNPTlNfVE1QIDo9ICQoSkRLX09VVFBVVERJUikvZ2Vuc3JjCitHRU5TUkNfWDExX0lDT05TX0RTVCA6PSAkKEdFTlNSQ19YMTFfSUNPTlNfVE1QKS9zdW4vYXd0L1gxMQogCiBpZmRlZiBPUEVOSkRLCi0JSUNPTlNfUEFUSF9QUkVGSVggOj0gJChKREtfVE9QRElSKS9zcmMvJChPUEVOSkRLX1RBUkdFVF9PU19BUElfRElSKQorICBYMTFfSUNPTlNfUEFUSF9QUkVGSVggOj0gJChKREtfVE9QRElSKS9zcmMvJChPUEVOSkRLX1RBUkdFVF9PU19BUElfRElSKQogZWxzZQotCUlDT05TX1BBVEhfUFJFRklYIDo9ICQoSkRLX1RPUERJUikvc3JjL2Nsb3NlZC9zb2xhcmlzCisgIFgxMV9JQ09OU19QQVRIX1BSRUZJWCA6PSAkKEpES19UT1BESVIpL3NyYy9jbG9zZWQvc29sYXJpcwogZW5kaWYKIAotR0VOU1JDX0lDT05TX1NSQyArPSBcCi0gICAgJChJQ09OU19QQVRIX1BSRUZJWCkvY2xhc3Nlcy9zdW4vYXd0L1gxMS9qYXZhLWljb24xNi5wbmcgXAotICAgICQoSUNPTlNfUEFUSF9QUkVGSVgpL2NsYXNzZXMvc3VuL2F3dC9YMTEvamF2YS1pY29uMjQucG5nIFwKLSAgICAkKElDT05TX1BBVEhfUFJFRklYKS9jbGFzc2VzL3N1bi9hd3QvWDExL2phdmEtaWNvbjMyLnBuZyBcCi0gICAgJChJQ09OU19QQVRIX1BSRUZJWCkvY2xhc3Nlcy9zdW4vYXd0L1gxMS9qYXZhLWljb240OC5wbmcKK0dFTlNSQ19YMTFfSUNPTlNfU1JDICs9IFwKKyAgICAkKFgxMV9JQ09OU19QQVRIX1BSRUZJWCkvY2xhc3Nlcy9zdW4vYXd0L1gxMS9qYXZhLWljb24xNi5wbmcgXAorICAgICQoWDExX0lDT05TX1BBVEhfUFJFRklYKS9jbGFzc2VzL3N1bi9hd3QvWDExL2phdmEtaWNvbjI0LnBuZyBcCisgICAgJChYMTFfSUNPTlNfUEFUSF9QUkVGSVgpL2NsYXNzZXMvc3VuL2F3dC9YMTEvamF2YS1pY29uMzIucG5nIFwKKyAgICAkKFgxMV9JQ09OU19QQVRIX1BSRUZJWCkvY2xhc3Nlcy9zdW4vYXd0L1gxMS9qYXZhLWljb240OC5wbmcKIAogCi1JQ09OUEFUSCA6PSAkKEpES19UT1BESVIpL3NyYy8kKE9QRU5KREtfVEFSR0VUX09TX0FQSV9ESVIpL2NsYXNzZXMvc3VuL2F3dC9YMTEKK1gxMV9JQ09OUEFUSCA6PSAkKEpES19UT1BESVIpL3NyYy8kKE9QRU5KREtfVEFSR0VUX09TX0FQSV9ESVIpL2NsYXNzZXMvc3VuL2F3dC9YMTEKIAotR0VOU1JDX0lDT05TX1NSQyArPSBcCi0gICAkKElDT05QQVRIKS9zZWN1cml0eS1pY29uLWJ3MTYucG5nIFwKLSAgICQoSUNPTlBBVEgpL3NlY3VyaXR5LWljb24taW50ZXJpbTE2LnBuZyBcCi0gICAkKElDT05QQVRIKS9zZWN1cml0eS1pY29uLXllbGxvdzE2LnBuZyBcCi0gICAkKElDT05QQVRIKS9zZWN1cml0eS1pY29uLWJ3MjQucG5nIFwKLSAgICQoSUNPTlBBVEgpL3NlY3VyaXR5LWljb24taW50ZXJpbTI0LnBuZyBcCi0gICAkKElDT05QQVRIKS9zZWN1cml0eS1pY29uLXllbGxvdzI0LnBuZyBcCi0gICAkKElDT05QQVRIKS9zZWN1cml0eS1pY29uLWJ3MzIucG5nIFwKLSAgICQoSUNPTlBBVEgpL3NlY3VyaXR5LWljb24taW50ZXJpbTMyLnBuZyBcCi0gICAkKElDT05QQVRIKS9zZWN1cml0eS1pY29uLXllbGxvdzMyLnBuZyBcCi0gICAkKElDT05QQVRIKS9zZWN1cml0eS1pY29uLWJ3NDgucG5nIFwKLSAgICQoSUNPTlBBVEgpL3NlY3VyaXR5LWljb24taW50ZXJpbTQ4LnBuZyBcCi0gICAkKElDT05QQVRIKS9zZWN1cml0eS1pY29uLXllbGxvdzQ4LnBuZworR0VOU1JDX1gxMV9JQ09OU19TUkMgKz0gXAorICAgJChYMTFfSUNPTlBBVEgpL3NlY3VyaXR5LWljb24tYncxNi5wbmcgXAorICAgJChYMTFfSUNPTlBBVEgpL3NlY3VyaXR5LWljb24taW50ZXJpbTE2LnBuZyBcCisgICAkKFgxMV9JQ09OUEFUSCkvc2VjdXJpdHktaWNvbi15ZWxsb3cxNi5wbmcgXAorICAgJChYMTFfSUNPTlBBVEgpL3NlY3VyaXR5LWljb24tYncyNC5wbmcgXAorICAgJChYMTFfSUNPTlBBVEgpL3NlY3VyaXR5LWljb24taW50ZXJpbTI0LnBuZyBcCisgICAkKFgxMV9JQ09OUEFUSCkvc2VjdXJpdHktaWNvbi15ZWxsb3cyNC5wbmcgXAorICAgJChYMTFfSUNPTlBBVEgpL3NlY3VyaXR5LWljb24tYnczMi5wbmcgXAorICAgJChYMTFfSUNPTlBBVEgpL3NlY3VyaXR5LWljb24taW50ZXJpbTMyLnBuZyBcCisgICAkKFgxMV9JQ09OUEFUSCkvc2VjdXJpdHktaWNvbi15ZWxsb3czMi5wbmcgXAorICAgJChYMTFfSUNPTlBBVEgpL3NlY3VyaXR5LWljb24tYnc0OC5wbmcgXAorICAgJChYMTFfSUNPTlBBVEgpL3NlY3VyaXR5LWljb24taW50ZXJpbTQ4LnBuZyBcCisgICAkKFgxMV9JQ09OUEFUSCkvc2VjdXJpdHktaWNvbi15ZWxsb3c0OC5wbmcKIAotR0VOU1JDX0lDT05TX0ZJTEVTIDo9ICQobm90ZGlyICQoR0VOU1JDX0lDT05TX1NSQykpCitHRU5TUkNfWDExX0lDT05TX0ZJTEVTIDo9ICQobm90ZGlyICQoR0VOU1JDX1gxMV9JQ09OU19TUkMpKQogCi1HRU5TUkNfSUNPTlNfU0hPUlRfTkFNRSA9ICQoc3Vic3QgLixfLCQoc3Vic3QgLSxfLCQoMSkpKQotR0VOU1JDX0lDT05TX0RTVF9OQU1FID0gWEFXVEljb24kKDIpXyQoc3Vic3QgLixfLCQoc3Vic3QgLSxfLCQoMSkpKQorR0VOU1JDX1gxMV9JQ09OU19TSE9SVF9OQU1FID0gJChzdWJzdCAuLF8sJChzdWJzdCAtLF8sJCgxKSkpCitHRU5TUkNfWDExX0lDT05TX0RTVF9OQU1FID0gWEFXVEljb24kKDIpXyQoc3Vic3QgLixfLCQoc3Vic3QgLSxfLCQoMSkpKQogCiAjIyMKIAotJChHRU5TUkNfSUNPTlNfVE1QKS9fdGhlLmRpciA6CiskKEdFTlNSQ19YMTFfSUNPTlNfVE1QKS9fdGhlLmljb25zLmRpciA6CiAJJChFQ0hPKSBHZW5lcmF0aW5nIGljb24gY2xhc3NlcwotCSQoTUtESVIpIC1wICQoR0VOU1JDX0lDT05TX0RTVCkKKwkkKE1LRElSKSAtcCAkKEdFTlNSQ19YMTFfSUNPTlNfRFNUKQogCSQoVE9VQ0gpICRACiAKICMjIwogCi1kZWZpbmUgU2V0dXBHZW5zcmNJY29uCitkZWZpbmUgU2V0dXBHZW5zcmNYMTFJY29uCiAgICAgICAgICMgcGFyYW0gMSBpcyBmb3Igc3JjLWZpbGUKICAgICAgICAgIyBwYXJhbSAyIGlzIGZvciBzcmMtZGlyCi0JJDFfU0hPUlROQU1FIDo9ICQoY2FsbCBHRU5TUkNfSUNPTlNfU0hPUlRfTkFNRSwkMSkKLQkkMV9OQU1FMzIgOj0gJChjYWxsIEdFTlNSQ19JQ09OU19EU1RfTkFNRSwkMSwzMikKLQkkMV9UQVJHRVQzMiA6PSAkKEdFTlNSQ19JQ09OU19EU1QpLyQkKCQxX05BTUUzMikuamF2YQotCSQxX05BTUU2NCA6PSAkKGNhbGwgR0VOU1JDX0lDT05TX0RTVF9OQU1FLCQxLDY0KQotCSQxX1RBUkdFVDY0IDo9ICQoR0VOU1JDX0lDT05TX0RTVCkvJCQoJDFfTkFNRTY0KS5qYXZhCisJJDFfU0hPUlROQU1FIDo9ICQoY2FsbCBHRU5TUkNfWDExX0lDT05TX1NIT1JUX05BTUUsJDEpCisJJDFfTkFNRTMyIDo9ICQoY2FsbCBHRU5TUkNfWDExX0lDT05TX0RTVF9OQU1FLCQxLDMyKQorCSQxX1RBUkdFVDMyIDo9ICQoR0VOU1JDX1gxMV9JQ09OU19EU1QpLyQkKCQxX05BTUUzMikuamF2YQorCSQxX05BTUU2NCA6PSAkKGNhbGwgR0VOU1JDX1gxMV9JQ09OU19EU1RfTkFNRSwkMSw2NCkKKwkkMV9UQVJHRVQ2NCA6PSAkKEdFTlNSQ19YMTFfSUNPTlNfRFNUKS8kJCgkMV9OQU1FNjQpLmphdmEKIAotJCQoJDFfVEFSR0VUMzIpIDogJDIvJDEgJChHRU5TUkNfSUNPTlNfVE1QKS9fdGhlLmRpcgorJCQoJDFfVEFSR0VUMzIpIDogJDIvJDEgJChHRU5TUkNfWDExX0lDT05TX1RNUCkvX3RoZS5pY29ucy5kaXIKIAkkKFJNKSAkJEAgJCRALnRtcAogCSQoRUNITykgInBhY2thZ2Ugc3VuLmF3dC5YMTE7IiA+ICQkQC50bXAKIAkkKEVDSE8pICJwdWJsaWMgY2xhc3MgJCQoJDFfTkFNRTMyKSB7IiA+PiAkJEAudG1wCiAJJChFQ0hPKSAicHVibGljIHN0YXRpYyBpbnRbXSAkJCgkMV9TSE9SVE5BTUUpID0geyAiID4+ICQkQC50bXAKLQkkKENBVCkgJCQ8IHwgJChUT09MX1RPQklOKSA+PiAkJEAudG1wCisJJChDQVQpICQkPCB8ICQoVE9PTF9YMTFfVE9CSU4pID4+ICQkQC50bXAKIAkkKEVDSE8pICJ9OyB9IiA+PiAkJEAudG1wCiAJJChNVikgJCRALnRtcCAkJEAKIAotR0VOU1JDX0lDT05TICs9ICQkKCQxX1RBUkdFVDMyKQorR0VOU1JDX1gxMV9JQ09OUyArPSAkJCgkMV9UQVJHRVQzMikKIAotJCQoJDFfVEFSR0VUNjQpIDogJDIvJDEgJChHRU5TUkNfSUNPTlNfVE1QKS9fdGhlLmRpcgorJCQoJDFfVEFSR0VUNjQpIDogJDIvJDEgJChHRU5TUkNfWDExX0lDT05TX1RNUCkvX3RoZS5pY29ucy5kaXIKIAkkKFJNKSAkJEAgJCRALnRtcAogCSQoRUNITykgInBhY2thZ2Ugc3VuLmF3dC5YMTE7IiA+ICQkQC50bXAKIAkkKEVDSE8pICJwdWJsaWMgY2xhc3MgJCQoJDFfTkFNRTY0KSB7IiA+PiAkJEAudG1wCiAJJChFQ0hPKSAicHVibGljIHN0YXRpYyBsb25nW10gJCQoJDFfU0hPUlROQU1FKSA9IHsgIiA+PiAkJEAudG1wCi0JJChDQVQpICQkPCB8ICQoVE9PTF9UT0JJTikgPj4gJCRALnRtcAorCSQoQ0FUKSAkJDwgfCAkKFRPT0xfWDExX1RPQklOKSA+PiAkJEAudG1wCiAJJChFQ0hPKSAifTsgfSIgPj4gJCRALnRtcAogCSQoTVYpICQkQC50bXAgJCRACiAKLUdFTlNSQ19JQ09OUyArPSAkJCgkMV9UQVJHRVQ2NCkKK0dFTlNSQ19YMTFfSUNPTlMgKz0gJCQoJDFfVEFSR0VUNjQpCiBlbmRlZgogCi0kKGZvcmVhY2ggSSwkKEdFTlNSQ19JQ09OU19TUkMpLCAkKGV2YWwgJChjYWxsIFNldHVwR2Vuc3JjSWNvbiwkKG5vdGRpciAkKEkpKSwkKGRpciAkKEkpKSkpKQorJChmb3JlYWNoIEksJChHRU5TUkNfWDExX0lDT05TX1NSQyksICQoZXZhbCAkKGNhbGwgU2V0dXBHZW5zcmNYMTFJY29uLCQobm90ZGlyICQoSSkpLCQoZGlyICQoSSkpKSkpCisKKyMjIworCitpZmVxICgkKE9QRU5KREtfVEFSR0VUX09TKSxtYWNvc3gpCisKKyAgR0VOU1JDX09TWF9JQ09OUyAgICAgID0gJChHRU5TUkNfT1NYX0lDT05TX0RTVCkvQVdUSWNvbkRhdGEuaAorICBHRU5TUkNfT1NYX0lDT05TX1NSQyAgPQorICBHRU5TUkNfT1NYX0lDT05TX1RNUCAgPSAkKEpES19PVVRQVVRESVIpL2dlbnNyYworICBHRU5TUkNfT1NYX0lDT05TX0RTVCAgPSAkKEdFTlNSQ19PU1hfSUNPTlNfVE1QKS9zdW4vb3N4YXBwCisgIAorJChHRU5TUkNfT1NYX0lDT05TX0RTVCkvQVdUSWNvbkRhdGEuaDogXAorICAgICQoSkRLX1RPUERJUikvc3JjL21hY29zeC9uYXRpdmUvc3VuL29zeGFwcC9yZXNvdXJjZS9pY29ucy9KYXZhQXBwLmljbnMgCisJJChSTSkgJEAgJEAudG1wCisJJChNS0RJUikgLXAgJChkaXIgJEApCisJJChFQ0hPKSAic3RhdGljIHVuc2lnbmVkIGNoYXIgc0FXVEljb25EYXRhW10gPSB7ICIgPj4gJEAudG1wCisJJChDQVQpICQ8IHwgJChUT09MX09TWF9UT0JJTikgPj4gJEAudG1wCisJJChFQ0hPKSAifTsiID4+ICRALnRtcAorCSQoTVYpICRALnRtcCAkQAorCitlbmRpZgorCmRpZmYgLS1naXQgYS9qZGsvbWFrZWZpbGVzL0dlbnNyY0pEV1AuZ21rIGIvamRrL21ha2VmaWxlcy9HZW5zcmNKRFdQLmdtawppbmRleCA0MmU5MTgxLi5lMjEwMzUzIDEwMDY0NAotLS0gYS9qZGsvbWFrZWZpbGVzL0dlbnNyY0pEV1AuZ21rCisrKyBiL2pkay9tYWtlZmlsZXMvR2Vuc3JjSkRXUC5nbWsKQEAgLTI4LDIwICsyOCwxOSBAQAogCiAkKEpES19PVVRQVVRESVIpL2dlbnNyY19qZHdwX2hlYWRlcnMvSkRXUENvbW1hbmRzLmggOiAkKEpES19UT1BESVIpL21ha2VmaWxlcy9qcGRhL2pkd3AvamR3cC5zcGVjCiAKLSQoSkRLX09VVFBVVERJUikvZ2Vuc3JjX2pkd3AvY29tL3N1bi90b29scy9qZGkvSkRXUC5qYXZhIDogJChKREtfVE9QRElSKS9tYWtlZmlsZXMvanBkYS9qZHdwL2pkd3Auc3BlYworJChKREtfT1VUUFVURElSKS9nZW5zcmMvY29tL3N1bi90b29scy9qZGkvSkRXUC5qYXZhIDogJChKREtfVE9QRElSKS9tYWtlZmlsZXMvanBkYS9qZHdwL2pkd3Auc3BlYwogCSQoTUtESVIpIC1wICQoQEQpCiAJJChNS0RJUikgLXAgJChKREtfT1VUUFVURElSKS9nZW5zcmNfamR3cF9oZWFkZXJzCiAJJChSTSkgJEAgJChKREtfT1VUUFVURElSKS9nZW5zcmNfamR3cF9oZWFkZXJzL0pEV1BDb21tYW5kcy5oCi0JJChFQ0hPKSBDcmVhdGluZyBKRFdQLmphdmEgYW5kIEpEV1BDb21tYW5kcy5oIGZyb20gamR3cC5zcGVjCisJJChFQ0hPKSAkKExPR19JTkZPKSBDcmVhdGluZyBKRFdQLmphdmEgYW5kIEpEV1BDb21tYW5kcy5oIGZyb20gamR3cC5zcGVjCiAJJChUT09MX0pEV1BHRU4pICQ8IC1qZGkgJEAgLWluY2x1ZGUgJChKREtfT1VUUFVURElSKS9nZW5zcmNfamR3cF9oZWFkZXJzL0pEV1BDb21tYW5kcy5oCiAKICQoSkRLX09VVFBVVERJUikvZ2Vuc3JjX2pkd3BfZG9jL2pkd3AtcHJvdG9jb2wuaHRtbCA6ICQoSkRLX1RPUERJUikvbWFrZWZpbGVzL2pwZGEvamR3cC9qZHdwLnNwZWMKIAkkKE1LRElSKSAtcCAkKEBEKQogCSQoUk0pICRACi0JJChFQ0hPKSBDcmVhdGluZyAkKEBGKSBmcm9tIGpkd3Auc3BlYworCSQoRUNITykgJChMT0dfSU5GTykgQ3JlYXRpbmcgJChARikgZnJvbSBqZHdwLnNwZWMKIAkkKFRPT0xfSkRXUEdFTikgJDwgLWRvYyAkQAogCi1HRU5TUkNfSkRXUDo9CSQoSkRLX09VVFBVVERJUikvZ2Vuc3JjX2pkd3AvY29tL3N1bi90b29scy9qZGkvSkRXUC5qYXZhIFwKK0dFTlNSQ19KRFdQOj0JJChKREtfT1VUUFVURElSKS9nZW5zcmMvY29tL3N1bi90b29scy9qZGkvSkRXUC5qYXZhIFwKIAkJJChKREtfT1VUUFVURElSKS9nZW5zcmNfamR3cF9oZWFkZXJzL0pEV1BDb21tYW5kcy5oIFwKIAkJJChKREtfT1VUUFVURElSKS9nZW5zcmNfamR3cF9kb2MvamR3cC1wcm90b2NvbC5odG1sCi0KZGlmZiAtLWdpdCBhL2pkay9tYWtlZmlsZXMvR2Vuc3JjSk9iakMuZ21rIGIvamRrL21ha2VmaWxlcy9HZW5zcmNKT2JqQy5nbWsKaW5kZXggODRhZWJlMS4uZTNjM2Q3YSAxMDA2NDQKLS0tIGEvamRrL21ha2VmaWxlcy9HZW5zcmNKT2JqQy5nbWsKKysrIGIvamRrL21ha2VmaWxlcy9HZW5zcmNKT2JqQy5nbWsKQEAgLTY0LDcgKzY0LDcgQEAKIGlmIFsgLWYgJChGUkFNRVdPUktTX0RJUikvJDEuZnJhbWV3b3JrL1Jlc291cmNlcy9CcmlkZ2VTdXBwb3J0LyQoQEYpIF07IHRoZW4gXAogICAgICQoQ1ApICQoRlJBTUVXT1JLU19ESVIpLyQxLmZyYW1ld29yay9SZXNvdXJjZXMvQnJpZGdlU3VwcG9ydC8kKEBGKSAkQC50bXAgO1wKIGVsc2UgXAotICAgICQoR0JNKSAtRiBjb21wbGV0ZSAtLWZyYW1ld29yayAkMSAtbyAkQC50bXAgOyBcCisgICAgJChHQk0pICQoTE9HX0lORk8pIC1GIGNvbXBsZXRlIC0tZnJhbWV3b3JrICQxIC1vICRALnRtcCA7IFwKIGZpCiAkKE1WKSAkQC50bXAgJEAKIGVuZGVmCkBAIC04OCw4ICs4OCw5IEBACiAjICAgICBjbGFzc3BhdGggdGhhdCBlbmRzIHdpdGggIkpPYmpDLmphciIsIGFuZCBlbWl0IHRoZSBuZXcgYm9vdGNsYXNzcGF0aC4KICMKICQoSk9CSkNfVE1QKS9fdGhlLmdlbmVyYXRvcl9ib290Y2xhc3NwYXRoIDogJChCVUlMRF9KT0JKQ19QUklNSVRJVkVfQ09ERVIpCisJJChFQ0hPKSBHZW5lcmF0aW5nIGpvYmpjIGZyYW1ld29yayBicmlkZ2UKIAkkKFJNKSAkQAotCSQoSkFWQSkgLWNwICQoSk9CSkNfVE1QKS9iaW4gY29tLmFwcGxlLmludGVybmFsLmpvYmpjLmdlbmVyYXRvci5Cb290Q2xhc3NQYXRoTWludXMgSk9iakMuamFyID4gJEAudG1wCisJJChKQVZBKSAkKExPR19JTkZPKSAtY3AgJChKT0JKQ19UTVApL2JpbiBjb20uYXBwbGUuaW50ZXJuYWwuam9iamMuZ2VuZXJhdG9yLkJvb3RDbGFzc1BhdGhNaW51cyBKT2JqQy5qYXIgPiAkQC50bXAKIAkkKE1WKSAkQC50bXAgJEAKIAogIwpAQCAtMTAxLDggKzEwMiwxNCBAQAogIwogJChKT0JKQ19UTVApL190aGUuZ2VuZXJhdG9yIDogJChKT0JKQ19UTVApL190aGUuZ2VuZXJhdG9yX2Jvb3RjbGFzc3BhdGggfCAkKEJSSURHRVNVUFBPUlQpCiAJJChSTSkgJEAKLQkkKEpBVkEpIC1kNjQgLVhib290Y2xhc3NwYXRoOmAkKENBVCkgJChKT0JKQ19UTVApL190aGUuZ2VuZXJhdG9yX2Jvb3RjbGFzc3BhdGhgIC1jcCAkKEpPQkpDX1RNUCkvYmluIC1lYSBjb20uYXBwbGUuaW50ZXJuYWwuam9iamMuZ2VuZXJhdG9yLkdlbmVyYXRvciBkc3Q9JChKT0JKQ19EU1QpIGZyYW1ld29ya3M9JChKT0JKQ19UTVApL2JyaWRnZQorCSQoSkFWQSkgJChMT0dfSU5GTykgLWQ2NCAtWGJvb3RjbGFzc3BhdGg6YCQoQ0FUKSAkKEpPQkpDX1RNUCkvX3RoZS5nZW5lcmF0b3JfYm9vdGNsYXNzcGF0aGAgLWNwICQoSk9CSkNfVE1QKS9iaW4gLWVhIGNvbS5hcHBsZS5pbnRlcm5hbC5qb2JqYy5nZW5lcmF0b3IuR2VuZXJhdG9yIGRzdD0kKEpPQkpDX0RTVCkgZnJhbWV3b3Jrcz0kKEpPQkpDX1RNUCkvYnJpZGdlCiAJJChUT1VDSCkgJEAKIAotR0VOU1JDX0pPQkpDICs9ICQoSk9CSkNfVE1QKS9fdGhlLmdlbmVyYXRvcgorIyBUaGUgZ2VuZXJhdG9yIGRlbGV0cyBhbGwgZmlsZXMgaW4gdGhlIHRhcmdldCBkaXIgc28gaXQgaGFzIHRvIHdvcmsgaW4gaXRzCisjIG93biBkaXIgYW5kIGhhdmUgdGhlIGZpbGVzIGNvcGllZCBvdmVyIHRvIGdlbnNyYyBhZnRld2FyZHMuCiskKEpES19PVVRQVVRESVIpL2dlbnNyYy9fdGhlLmpvYmpjLmZpbGVzIDogJChKT0JKQ19UTVApL190aGUuZ2VuZXJhdG9yCisJJChNS0RJUikgLXAgJChARCkKKwkkKENQKSAtcnAgJChKT0JKQ19EU1QpLyogJChARCkKKwkkKFRPVUNIKSAkQAogCitHRU5TUkNfSk9CSkMgKz0gJChKREtfT1VUUFVURElSKS9nZW5zcmMvX3RoZS5qb2JqYy5maWxlcwpkaWZmIC0tZ2l0IGEvamRrL21ha2VmaWxlcy9HZW5zcmNMb2NhbGVEYXRhTWV0YUluZm8uZ21rIGIvamRrL21ha2VmaWxlcy9HZW5zcmNMb2NhbGVEYXRhTWV0YUluZm8uZ21rCmluZGV4IDgxMWQ5ZDQuLjVmODhlYzAgMTAwNjQ0Ci0tLSBhL2pkay9tYWtlZmlsZXMvR2Vuc3JjTG9jYWxlRGF0YU1ldGFJbmZvLmdtaworKysgYi9qZGsvbWFrZWZpbGVzL0dlbnNyY0xvY2FsZURhdGFNZXRhSW5mby5nbWsKQEAgLTQwLDE0ICs0MCwxNCBAQAogTE9DQUxFX1JFU09VUkNFUzo9JChzb3J0ICQoc3Vic3QgLnByb3BlcnRpZXMsLCQoc3Vic3QgLmphdmEsLCQobm90ZGlyICQoTE9DQUxFX0ZJTEVTKSkpKSkKIAogIyBJbmNsdWRlIHRoZSBsaXN0IG9mIHJlc291cmNlcyBmb3VuZCBkdXJpbmcgdGhlIHByZXZpb3VzIGNvbXBpbGUuCi0taW5jbHVkZSAkKEpES19PVVRQVVRESVIpL2dlbnNyY19sb2NhbGVkYXRhbWV0YWluZm8vX3RoZS5sb2NhbGVfcmVzb3VyY2VzCistaW5jbHVkZSAkKEpES19PVVRQVVRESVIpL2dlbnNyYy9fdGhlLmxvY2FsZV9yZXNvdXJjZXMKIAogTUlTU0lOR19SRVNPVVJDRVM6PSQoZmlsdGVyLW91dCAkKExPQ0FMRV9SRVNPVVJDRVMpLCQoUFJFVl9MT0NBTEVfUkVTT1VSQ0VTKSkKIE5FV19SRVNPVVJDRVM6PSQoZmlsdGVyLW91dCAkKFBSRVZfTE9DQUxFX1JFU09VUkNFUyksJChMT0NBTEVfUkVTT1VSQ0VTKSkKIAogaWZuZXEgKCwkKE1JU1NJTkdfUkVTT1VSQ0VTKSQoTkVXX1JFU09VUkNFUykpCiAgICAgIyBUaGVyZSBpcyBhIGRpZmZlcmVuY2UgaW4gdGhlIG51bWJlciBvZiBzdXBwb3J0ZWQgcmVzb3VyY2VzLiBUcmlnZ2VyIGEgcmVnZW5lcmF0aW9uLgotICAgICQoc2hlbGwgJChSTSkgJChKREtfT1VUUFVURElSKS9nZW5zcmNfbG9jYWxlZGF0YW1ldGFpbmZvL3N1bi91dGlsL2xvY2FsZS9wcm92aWRlci9Mb2NhbGVEYXRhTWV0YUluZm8uamF2YSkKKyAgICAkKHNoZWxsICQoUk0pICQoSkRLX09VVFBVVERJUikvZ2Vuc3JjL3N1bi91dGlsL2xvY2FsZS9wcm92aWRlci9Mb2NhbGVEYXRhTWV0YUluZm8uamF2YSkKIGVuZGlmCiAKICMgVGhlIG5vbi1ldXJvIHpvbmUgbG9jYWxlcyBoYXZlIHRvIGJlIHNlcGFyYXRlZCBmcm9tIHRoZSBldXJvLXpvbmUgbG9jYWxlcy4KQEAgLTkzLDE4ICs5MywxOCBAQAogU0VEX0FSR1MrPSAtZSAncy8kKEhBU0gpQXZhaWxhYmxlTG9jYWxlc19FdXJvTG9jYWxlcyQoSEFTSCkvJChzb3J0ICQoQUxMX0VVUk9fTE9DQUxFUykpL2cnCiBTRURfQVJHUys9IC1lICdzLyQoSEFTSClBdmFpbGFibGVMb2NhbGVzX05vbkV1cm9Mb2NhbGVzJChIQVNIKS8kKHNvcnQgJChBTExfTk9OX0VVUk9fTE9DQUxFUykpL2cnCiAKLSQoSkRLX09VVFBVVERJUikvZ2Vuc3JjX2xvY2FsZWRhdGFtZXRhaW5mby9zdW4vdXRpbC9sb2NhbGUvcHJvdmlkZXIvTG9jYWxlRGF0YU1ldGFJbmZvLmphdmE6IFwKKyQoSkRLX09VVFBVVERJUikvZ2Vuc3JjL3N1bi91dGlsL2xvY2FsZS9wcm92aWRlci9Mb2NhbGVEYXRhTWV0YUluZm8uamF2YTogXAogCQkkKEpES19UT1BESVIpL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi91dGlsL2xvY2FsZS9wcm92aWRlci9Mb2NhbGVEYXRhTWV0YUluZm8tWExvY2FsZXMuamF2YS50ZW1wbGF0ZQogCSQoTUtESVIpIC1wICQoQEQpCiAJJChFQ0hPKSBDcmVhdGluZyBzdW4vdXRpbC9Mb2NhbGVEYXRhTWV0YUluZm8uamF2YSBmcm9tICQod29yZHMgJChMT0NBTEVfUkVTT1VSQ0VTKSkgZm91bmQgcmVzb3VyY2VzLgotCSQoUFJJTlRGKSAiUFJFVl9MT0NBTEVfUkVTT1VSQ0VTOj0kKExPQ0FMRV9SRVNPVVJDRVMpIiA+ICQoSkRLX09VVFBVVERJUikvZ2Vuc3JjX2xvY2FsZWRhdGFtZXRhaW5mby9fdGhlLmxvY2FsZV9yZXNvdXJjZXMKKwkkKFBSSU5URikgIlBSRVZfTE9DQUxFX1JFU09VUkNFUzo9JChMT0NBTEVfUkVTT1VSQ0VTKSIgPiAkKEpES19PVVRQVVRESVIpL2dlbnNyYy9fdGhlLmxvY2FsZV9yZXNvdXJjZXMKIAkkKFNFRCkgJChTRURfQVJHUykgJDwgPiAkQAogCi1HRU5TUkNfTE9DQUxFREFUQU1FVEFJTkZPOj0kKEpES19PVVRQVVRESVIpL2dlbnNyY19sb2NhbGVkYXRhbWV0YWluZm8vc3VuL3V0aWwvbG9jYWxlL3Byb3ZpZGVyL0xvY2FsZURhdGFNZXRhSW5mby5qYXZhCitHRU5TUkNfTE9DQUxFREFUQU1FVEFJTkZPOj0kKEpES19PVVRQVVRESVIpL2dlbnNyYy9zdW4vdXRpbC9sb2NhbGUvcHJvdmlkZXIvTG9jYWxlRGF0YU1ldGFJbmZvLmphdmEKIAogIyMjCiAKLUdFTlNSQ19DUkJDX0RTVCA6PSAkKEpES19PVVRQVVRESVIpL2dlbnNyY19sb2NhbGVkYXRhbWV0YWluZm8vc3VuL3V0aWwvQ29yZVJlc291cmNlQnVuZGxlQ29udHJvbC5qYXZhCitHRU5TUkNfQ1JCQ19EU1QgOj0gJChKREtfT1VUUFVURElSKS9nZW5zcmMvc3VuL3V0aWwvQ29yZVJlc291cmNlQnVuZGxlQ29udHJvbC5qYXZhCiBHRU5TUkNfQ1JCQ19DTUQgOj0gJChKREtfVE9QRElSKS9tYWtlZmlsZXMvc2NyaXB0cy9sb2NhbGVsaXN0LnNoCiAKIEpSRV9OT05FWElTVF9MT0NBTEVTIDo9IGVuIGVuX1VTIGRlX0RFIGVzX0VTIGZyX0ZSIGl0X0lUIGphX0pQIGtvX0tSIHN2X1NFIHpoCmRpZmYgLS1naXQgYS9qZGsvbWFrZWZpbGVzL0dlbnNyY01pc2MuZ21rIGIvamRrL21ha2VmaWxlcy9HZW5zcmNNaXNjLmdtawppbmRleCBmMzczNDYyLi41NWY4NjM2IDEwMDY0NAotLS0gYS9qZGsvbWFrZWZpbGVzL0dlbnNyY01pc2MuZ21rCisrKyBiL2pkay9tYWtlZmlsZXMvR2Vuc3JjTWlzYy5nbWsKQEAgLTI4LDExICsyOCwxMSBAQAogIyBzdHJpbmcgYW5kIHRoZSBydW50aW1lIG5hbWUgaW50byB0aGUgVmVyc2lvbi5qYXZhIGZpbGUuCiAjIFRvIGJlIHByaW50ZWQgYnkgamF2YSAtdmVyc2lvbgogCi0kKEpES19PVVRQVVRESVIpL2dlbnNyY19taXNjL3N1bi9taXNjL1ZlcnNpb24uamF2YTogXAorJChKREtfT1VUUFVURElSKS9nZW5zcmMvc3VuL21pc2MvVmVyc2lvbi5qYXZhOiBcCiAJJChKREtfVE9QRElSKS9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vbWlzYy9WZXJzaW9uLmphdmEudGVtcGxhdGUKIAkkKE1LRElSKSAtcCAkKEBEKQogCSQoUk0pICRAICRALnRtcAotCSQoRUNITykgR2VuZXJhdGluZyBzdW4vbWlzYy9WZXJzaW9uLmphdmEKKwkkKEVDSE8pICQoTE9HX0lORk8pIEdlbmVyYXRpbmcgc3VuL21pc2MvVmVyc2lvbi5qYXZhCiAJJChTRUQpIC1lICdzL0BAbGF1bmNoZXJfbmFtZUBALyQoTEFVTkNIRVJfTkFNRSkvZycgXAogCSAgICAgICAtZSAncy9AQGphdmFfdmVyc2lvbkBALyQoUkVMRUFTRSkvZycgXAogCSAgICAgICAtZSAncy9AQGphdmFfcnVudGltZV92ZXJzaW9uQEAvJChGVUxMX1ZFUlNJT04pL2cnIFwKQEAgLTQwLDIwICs0MCwyMCBAQAogICAgICAgICAgICAgJDwgPiAkQC50bXAKIAkkKE1WKSAkQC50bXAgJEAKIAotR0VOU1JDX01JU0MgKz0gJChKREtfT1VUUFVURElSKS9nZW5zcmNfbWlzYy9zdW4vbWlzYy9WZXJzaW9uLmphdmEKK0dFTlNSQ19NSVNDICs9ICQoSkRLX09VVFBVVERJUikvZ2Vuc3JjL3N1bi9taXNjL1ZlcnNpb24uamF2YQogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMgVmVyc2lvbiBmaWxlIGZvciBqY29uc29sZQogCi0kKEpES19PVVRQVVRESVIpL2dlbnNyY19taXNjL3N1bi90b29scy9qY29uc29sZS9WZXJzaW9uLmphdmE6IFwKKyQoSkRLX09VVFBVVERJUikvZ2Vuc3JjL3N1bi90b29scy9qY29uc29sZS9WZXJzaW9uLmphdmE6IFwKICAgICAgICAgICAgICAgICAkKEpES19UT1BESVIpL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi90b29scy9qY29uc29sZS9WZXJzaW9uLmphdmEudGVtcGxhdGUKIAkkKE1LRElSKSAtcCAkKEBEKQogCSQoUk0pICRAICRALnRtcAotCSQoRUNITykgR2VuZXJhdGluZyBzdW4vdG9vbHMvamNvbnNvbGUvVmVyc2lvbi5qYXZhCisJJChFQ0hPKSAkKExPR19JTkZPKSBHZW5lcmF0aW5nIHN1bi90b29scy9qY29uc29sZS9WZXJzaW9uLmphdmEKIAkkKFNFRCkgLWUgJ3MvQEBqY29uc29sZV92ZXJzaW9uQEAvJChGVUxMX1ZFUlNJT04pL2cnICQ8ID4gJEAudG1wCiAJJChNVikgJEAudG1wICRACiAKLUdFTlNSQ19NSVNDICs9ICQoSkRLX09VVFBVVERJUikvZ2Vuc3JjX21pc2Mvc3VuL3Rvb2xzL2pjb25zb2xlL1ZlcnNpb24uamF2YQorR0VOU1JDX01JU0MgKz0gJChKREtfT1VUUFVURElSKS9nZW5zcmMvc3VuL3Rvb2xzL2pjb25zb2xlL1ZlcnNpb24uamF2YQogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIApAQCAtNjUsMTQgKzY1LDE0IEBACiAgICAgIyBVTklYUHJvY2Vzcy5qYXZhIGlzIGRpZmZlcmVudCBmb3Igc29sYXJpcyBhbmQgbGludXguIFdlIG5lZWQgdG8gY29weQogICAgICMgdGhlIGNvcnJlY3QgVU5JWFByb2Nlc3MuamF2YSBvdmVyIHRvICQoSkRLX09VVFBVVERJUikvZ2Vuc3JjL2phdmEvbGFuZy8uCiAKLSAgICAkKEpES19PVVRQVVRESVIpL2dlbnNyY19taXNjL2phdmEvbGFuZy9VTklYUHJvY2Vzcy5qYXZhIDogXAorICAgICQoSkRLX09VVFBVVERJUikvZ2Vuc3JjL2phdmEvbGFuZy9VTklYUHJvY2Vzcy5qYXZhIDogXAogICAgICAgICAgICAgICAkKEpES19UT1BESVIpL3NyYy9zb2xhcmlzL2NsYXNzZXMvamF2YS9sYW5nL1VOSVhQcm9jZXNzLmphdmEuJChVUFNVRkZJWCkKIAkkKE1LRElSKSAtcCAkKEBEKQotCSQoRUNITykgQ29weWluZyBVTklYUHJvY2Vzcy5qYXZhLiQoT1BFTkpES19UQVJHRVRfT1MpIHRvIGphdmEvbGFuZy9VTklYUHJvY2Vzcy5qYXZhCisJJChFQ0hPKSAkKExPR19JTkZPKSBDb3B5aW5nIFVOSVhQcm9jZXNzLmphdmEuJChPUEVOSkRLX1RBUkdFVF9PUykgdG8gamF2YS9sYW5nL1VOSVhQcm9jZXNzLmphdmEKIAkkKENQKSAkPCAkQAogCSQoQ0hNT0QpIHUrcncgJEAKIAotICAgIEdFTlNSQ19NSVNDICs9ICQoSkRLX09VVFBVVERJUikvZ2Vuc3JjX21pc2MvamF2YS9sYW5nL1VOSVhQcm9jZXNzLmphdmEKKyAgICBHRU5TUkNfTUlTQyArPSAkKEpES19PVVRQVVRESVIpL2dlbnNyYy9qYXZhL2xhbmcvVU5JWFByb2Nlc3MuamF2YQogZW5kaWYKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCkBAIC04NSwxNiArODUsMTQgQEAKICAgICAkKEpES19PVVRQVVRESVIpL2dlbnNyY19jL2xpYmpkYmNvZGJjL2R1bW15b2RiYzEuYyA6IAogCSQoTUtESVIpIC1wICQoQEQpCiAJJChSTSkgJEAKLQkkKEVDSE8pIENyZWF0aW5nICRACisJJChFQ0hPKSAkKExPR19JTkZPKSBDcmVhdGluZyAkQAogCSQoUFJJTlRGKSAidm9pZCBkdW1teU9kYmModm9pZCl7fVxuIiA+ICRACi0JJChFQ0hPKSBDcmVhdGVkICRACiAKICAgICAkKEpES19PVVRQVVRESVIpL2dlbnNyY19jL2xpYmpkYmNvZGJjL2R1bW15b2RiYzIuYyA6IAogCSQoTUtESVIpIC1wICQoQEQpCiAJJChSTSkgJEAKLQkkKEVDSE8pIENyZWF0aW5nICRACisJJChFQ0hPKSAkKExPR19JTkZPKSBDcmVhdGluZyAkQAogCSQoUFJJTlRGKSAidm9pZCBkdW1teU9kYmModm9pZCl7fVxuIiA+ICRACi0JJChFQ0hPKSBDcmVhdGVkICRACiAKICAgICBHRU5TUkNfTUlTQyArPSAkKEpES19PVVRQVVRESVIpL2dlbnNyY19jL2xpYmpkYmNvZGJjL2R1bW15b2RiYzEuYyAkKEpES19PVVRQVVRESVIpL2dlbnNyY19jL2xpYmpkYmNvZGJjL2R1bW15b2RiYzIuYwogZW5kaWYKQEAgLTEwMywxMSArMTAxLDExIEBACiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCi1HRU5TUkNfTUlTQyArPSAkKEpES19PVVRQVVRESVIpL2dlbnNyY19taXNjL3N1bi9uaW8vY2gvU29ja2V0T3B0aW9uUmVnaXN0cnkuamF2YQorR0VOU1JDX01JU0MgKz0gJChKREtfT1VUUFVURElSKS9nZW5zcmMvc3VuL25pby9jaC9Tb2NrZXRPcHRpb25SZWdpc3RyeS5qYXZhCiAKIEdFTlNSQ19TT1JfU1JDIDo9ICQoSkRLX1RPUERJUikvc3JjL3NoYXJlL25hdGl2ZS9zdW4vbmlvL2NoCiBHRU5TUkNfU09SX1NSQ19GSUxFIDo9IGdlblNvY2tldE9wdGlvblJlZ2lzdHJ5LmMKLUdFTlNSQ19TT1JfQklOIDo9ICQoSkRLX09VVFBVVERJUikvZ2Vuc3JjX21pc2MvZ2VuU29ja2V0T3B0aW9uUmVnaXN0cnkKK0dFTlNSQ19TT1JfQklOIDo9ICQoSkRLX09VVFBVVERJUikvZ2Vuc3JjL2dlblNvY2tldE9wdGlvblJlZ2lzdHJ5CiAKIFNPUl9DT1BZUklHSFRfWUVBUlMgPSAkKHNoZWxsICQoQ0FUKSAkKEdFTlNSQ19TT1JfU1JDKS8kKEdFTlNSQ19TT1JfU1JDX0ZJTEUpIHwgXAogCSQoTkFXSykgJy9eLipDb3B5cmlnaHQuKk9yYWNsZS8geyBwcmludGYgIiVzICVzIiwkJDQsJCQ1IH0nKSAKQEAgLTEyNiwxNSArMTI0LDE1IEBACiAgIEhBU19TT0NLRVRfT1BUSU9OX1JFR0lTVFJZOj10cnVlCiBlbmRpZgogCi1pZm5lcSAoJChIQVNfU09DS0VUX09USU9OX1JFR0lTVFJZKSx0cnVlKQotJChKREtfT1VUUFVURElSKS9nZW5zcmNfbWlzYy9zdW4vbmlvL2NoL1NvY2tldE9wdGlvblJlZ2lzdHJ5LmphdmEgOiAkKEJVSUxEX0dFTlNSQ19TT1JfRVhFKQoraWZuZXEgKCQoSEFTX1NPQ0tFVF9PUFRJT05fUkVHSVNUUlkpLHRydWUpCiskKEpES19PVVRQVVRESVIpL2dlbnNyYy9zdW4vbmlvL2NoL1NvY2tldE9wdGlvblJlZ2lzdHJ5LmphdmEgOiAkKEJVSUxEX0dFTlNSQ19TT1JfRVhFKQogCSQoTUtESVIpIC1wICQoQEQpCiAJJChSTSkgJEAgJEAudG1wCiAJTkFXSz0iJChOQVdLKSIgU0g9IiQoU0gpIiAkKFNIKSAtZSAkKEpES19UT1BESVIpL21ha2VmaWxlcy9zY3JpcHRzL2FkZE5vdGljZXMuc2ggIiQoU09SX0NPUFlSSUdIVF9ZRUFSUykiID4gJEAudG1wCiAJJChCVUlMRF9HRU5TUkNfU09SX0VYRSkgPj4gJEAudG1wCiAJJChNVikgJEAudG1wICRACiBlbHNlCi0kKEpES19PVVRQVVRESVIpL2dlbnNyY19taXNjL3N1bi9uaW8vY2gvU29ja2V0T3B0aW9uUmVnaXN0cnkuamF2YSA6ICQoSkRLX1RPUERJUikvc3JjL2Nsb3NlZC9zb2xhcmlzL2NsYXNzZXMvc3VuL25pby9jaC9Tb2NrZXRPcHRpb25SZWdpc3RyeS0kKE9QRU5KREtfVEFSR0VUX09TKS0kKE9QRU5KREtfVEFSR0VUX0NQVV9BUkNIKS5qYXZhCiskKEpES19PVVRQVVRESVIpL2dlbnNyYy9zdW4vbmlvL2NoL1NvY2tldE9wdGlvblJlZ2lzdHJ5LmphdmEgOiAkKEpES19UT1BESVIpL3NyYy9jbG9zZWQvc29sYXJpcy9jbGFzc2VzL3N1bi9uaW8vY2gvU29ja2V0T3B0aW9uUmVnaXN0cnktJChPUEVOSkRLX1RBUkdFVF9PUyktJChPUEVOSkRLX1RBUkdFVF9DUFVfQVJDSCkuamF2YQogCSQoTUtESVIpIC1wICQoQEQpCiAJJChSTSkgJEAKIAkkKENQKSAkPCAkQApAQCAtMTQ0LDExICsxNDIsMTEgQEAKIAogaWZuZXEgKCQoT1BFTkpES19UQVJHRVRfT1MpLHdpbmRvd3MpCiAKLUdFTlNSQ19NSVNDICs9ICQoSkRLX09VVFBVVERJUikvZ2Vuc3JjX21pc2Mvc3VuL25pby9mcy9Vbml4Q29uc3RhbnRzLmphdmEKK0dFTlNSQ19NSVNDICs9ICQoSkRLX09VVFBVVERJUikvZ2Vuc3JjL3N1bi9uaW8vZnMvVW5peENvbnN0YW50cy5qYXZhCiAKIEdFTlNSQ19VQ19TUkMgOj0gJChKREtfVE9QRElSKS9zcmMvJChPUEVOSkRLX1RBUkdFVF9PU19BUElfRElSKS9uYXRpdmUvc3VuL25pby9mcwogR0VOU1JDX1VDX1NSQ19GSUxFIDo9IGdlblVuaXhDb25zdGFudHMuYwotR0VOU1JDX1VDX0JJTiA6PSAkKEpES19PVVRQVVRESVIpL2dlbnNyY19taXNjL2dlblVuaXhDb25zdGFudHMKK0dFTlNSQ19VQ19CSU4gOj0gJChKREtfT1VUUFVURElSKS9nZW5zcmMvZ2VuVW5peENvbnN0YW50cwogCiBVQ19DT1BZUklHSFRfWUVBUlMgPSAkKHNoZWxsICQoQ0FUKSAkKEdFTlNSQ19VQ19TUkMpLyQoR0VOU1JDX1VDX1NSQ19GSUxFKSB8IFwKIAkkKE5BV0spICcvXi4qQ29weXJpZ2h0LipPcmFjbGUvIHsgcHJpbnRmICIlcyAlcyIsJCQ0LCQkNSB9JykgCkBAIC0xNTksNiArMTU3LDcgQEAKIAkJTEFORzo9QyxcCiAJCUNDOj0kKEJVSUxEX0NDKSxcCiAJCUxERVhFOj0kKEJVSUxEX0NDKSxcCisJCUNGTEFHUzo9JChmaWx0ZXIgLUQlLCQoQ0ZMQUdTX0pES0VYRSkpLFwKIAkJT0JKRUNUX0RJUjo9JChHRU5TUkNfVUNfQklOKSxcCiAgICAgICAgICAgICAgICAgT1VUUFVUX0RJUjo9JChHRU5TUkNfVUNfQklOKSxcCiAJCVBST0dSQU06PWdlblVuaXhDb25zdGFudHMpKQpAQCAtMTY4LDE0ICsxNjcsMTQgQEAKIGVuZGlmCiAKIGlmbmVxICgkKEhBU19VTklYX0NPTlNUQU5UUyksdHJ1ZSkKLSQoSkRLX09VVFBVVERJUikvZ2Vuc3JjX21pc2Mvc3VuL25pby9mcy9Vbml4Q29uc3RhbnRzLmphdmEgOiAkKEJVSUxEX0dFTlNSQ19VQ19FWEUpCiskKEpES19PVVRQVVRESVIpL2dlbnNyYy9zdW4vbmlvL2ZzL1VuaXhDb25zdGFudHMuamF2YSA6ICQoQlVJTERfR0VOU1JDX1VDX0VYRSkKIAkkKE1LRElSKSAtcCAkKEBEKQogCSQoUk0pICRAICRALnRtcAogCU5BV0s9IiQoTkFXSykiIFNIPSIkKFNIKSIgJChTSCkgLWUgJChKREtfVE9QRElSKS9tYWtlZmlsZXMvc2NyaXB0cy9hZGROb3RpY2VzLnNoICIkKFVDX0NPUFlSSUdIVF9ZRUFSUykiID4gJEAudG1wCiAJJChCVUlMRF9HRU5TUkNfVUNfRVhFKSA+PiAkQC50bXAKIAkkKE1WKSAkQC50bXAgJEAKIGVsc2UKLSQoSkRLX09VVFBVVERJUikvZ2Vuc3JjX21pc2Mvc3VuL25pby9mcy9Vbml4Q29uc3RhbnRzLmphdmEgOiAkKEpES19UT1BESVIpL3NyYy9jbG9zZWQvc29sYXJpcy9jbGFzc2VzL3N1bi9uaW8vZnMvVW5peENvbnN0YW50cy0kKE9QRU5KREtfVEFSR0VUX09TKS0kKE9QRU5KREtfVEFSR0VUX0NQVV9BUkNIKS5qYXZhCiskKEpES19PVVRQVVRESVIpL2dlbnNyYy9zdW4vbmlvL2ZzL1VuaXhDb25zdGFudHMuamF2YSA6ICQoSkRLX1RPUERJUikvc3JjL2Nsb3NlZC9zb2xhcmlzL2NsYXNzZXMvc3VuL25pby9mcy9Vbml4Q29uc3RhbnRzLSQoT1BFTkpES19UQVJHRVRfT1MpLSQoT1BFTkpES19UQVJHRVRfQ1BVX0FSQ0gpLmphdmEKIAkkKE1LRElSKSAtcCAkKEBEKQogCSQoUk0pICRACiAJJChDUCkgJDwgJEAKQEAgLTE4NywxMSArMTg2LDExIEBACiAKIGlmZXEgKCQoT1BFTkpES19UQVJHRVRfT1MpLHNvbGFyaXMpCiAKLUdFTlNSQ19NSVNDICs9ICQoSkRLX09VVFBVVERJUikvZ2Vuc3JjX21pc2Mvc3VuL25pby9mcy9Tb2xhcmlzQ29uc3RhbnRzLmphdmEKK0dFTlNSQ19NSVNDICs9ICQoSkRLX09VVFBVVERJUikvZ2Vuc3JjL3N1bi9uaW8vZnMvU29sYXJpc0NvbnN0YW50cy5qYXZhCiAKIEdFTlNSQ19TT0xfU1JDIDo9ICQoSkRLX1RPUERJUikvc3JjLyQoT1BFTkpES19UQVJHRVRfT1NfQVBJX0RJUikvbmF0aXZlL3N1bi9uaW8vZnMKIEdFTlNSQ19TT0xfU1JDX0ZJTEUgOj0gZ2VuU29sYXJpc0NvbnN0YW50cy5jCi1HRU5TUkNfU09MX0JJTiA6PSAkKEpES19PVVRQVVRESVIpL2dlbnNyY19taXNjL2dlblNvbGFyaXNDb25zdGFudHMKK0dFTlNSQ19TT0xfQklOIDo9ICQoSkRLX09VVFBVVERJUikvZ2Vuc3JjL2dlblNvbGFyaXNDb25zdGFudHMKIAogU09MX0NPUFlSSUdIVF9ZRUFSUyA9ICQoc2hlbGwgJChDQVQpICQoR0VOU1JDX1NPTF9TUkMpLyQoR0VOU1JDX1NPTF9TUkNfRklMRSkgfCBcCiAJJChOQVdLKSAnL14uKkNvcHlyaWdodC4qT3JhY2xlLyB7IHByaW50ZiAiJXMgJXMiLCQkNCwkJDUgfScpIApAQCAtMjA2LDcgKzIwNSw3IEBACiAJCU9VVFBVVF9ESVI6PSQoR0VOU1JDX1NPTF9CSU4pLFwKIAkJUFJPR1JBTTo9Z2VuU29sYXJpc0NvbnN0YW50cykpCiAKLSQoSkRLX09VVFBVVERJUikvZ2Vuc3JjX21pc2Mvc3VuL25pby9mcy9Tb2xhcmlzQ29uc3RhbnRzLmphdmEgOiAkKEJVSUxEX0dFTlNSQ19TT0xfRVhFKQorJChKREtfT1VUUFVURElSKS9nZW5zcmMvc3VuL25pby9mcy9Tb2xhcmlzQ29uc3RhbnRzLmphdmEgOiAkKEJVSUxEX0dFTlNSQ19TT0xfRVhFKQogCSQoTUtESVIpIC1wICQoQEQpCiAJJChSTSkgJEAgJEAudG1wCiAJTkFXSz0iJChOQVdLKSIgU0g9IiQoU0gpIiAkKFNIKSAtZSAkKEpES19UT1BESVIpL21ha2VmaWxlcy9zY3JpcHRzL2FkZE5vdGljZXMuc2ggIiQoU09MX0NPUFlSSUdIVF9ZRUFSUykiID4gJEAudG1wCmRpZmYgLS1naXQgYS9qZGsvbWFrZWZpbGVzL0dlbnNyY1Byb3BlcnRpZXMuZ21rIGIvamRrL21ha2VmaWxlcy9HZW5zcmNQcm9wZXJ0aWVzLmdtawppbmRleCA4OTA2YjYwLi5hMDBmNTQ2IDEwMDY0NAotLS0gYS9qZGsvbWFrZWZpbGVzL0dlbnNyY1Byb3BlcnRpZXMuZ21rCisrKyBiL2pkay9tYWtlZmlsZXMvR2Vuc3JjUHJvcGVydGllcy5nbWsKQEAgLTU3LDEzICs1NywxMyBAQAogICBBTExfQ09NUElMRURfUFJPUFNPVVJDRVMrPSQyCiAKICAgIyBHZW5lcmF0ZSB0aGUgbGlzdCBvZiB0byBiZSBjcmVhdGVkIGphdmEgZmlsZXMuCi0gIEFMTF9DT01QSUxFRF9QUk9QSkFWQVMrPSQkKHBhdHN1YnN0ICUsJChKREtfT1VUUFVURElSKS9nZW5zcmNfcHJvcGVydGllcy8lLmphdmEsJCQoJDFfUFJPUFBBVEhTKSkKKyAgQUxMX0NPTVBJTEVEX1BST1BKQVZBUys9JCQocGF0c3Vic3QgJSwkKEpES19PVVRQVVRESVIpL2dlbnNyYy8lLmphdmEsJCQoJDFfUFJPUFBBVEhTKSkKIAogICAjIE5vdyBnZW5lcmF0ZSBhIHNlcXVlbmNlIG9mICItY29tcGlsZSAuLi5DdXJyZW5jeU5hbWVzX3N2LnByb3BlcnRpZXMgLi4uQ3VycmVuY3lOYW1lc19zdi5qYXZhIExpc3RSZXNvdXJjZUJ1bmRsZSIKICAgIyBzdWl0YWJsZSB0byBiZSBmZWQgaW50byB0aGUgQ29tcGlsZVByb3BlcnRpZXMgY29tbWFuZC4KICAgQ09NUElMRV9QUk9QQ01ETElORSs9JCQoc3Vic3QgX1NQQUNFXywkKFNQQUNFKSwkJChqb2luICQkKGFkZHByZWZpeCAtY29tcGlsZV9TUEFDRV8sJDIpLCBcCiAJCSQkKGFkZHN1ZmZpeCBfU1BBQ0VfJChzdHJpcCAkMyksXAotICAgICAgICAgICAgICAgICAgICAkJChhZGRwcmVmaXggX1NQQUNFXyQoSkRLX09VVFBVVERJUikvZ2Vuc3JjX3Byb3BlcnRpZXMvLFwKKyAgICAgICAgICAgICAgICAgICAgJCQoYWRkcHJlZml4IF9TUEFDRV8kKEpES19PVVRQVVRESVIpL2dlbnNyYy8sXAogICAgICAgICAgICAgICAgICAgICAgICAgJCQoYWRkc3VmZml4IC5qYXZhLCQkKCQxX1BST1BQQVRIUykpKSkpKQogZW5kZWYKIApAQCAtMzAzLDEzICszMDMsMTIgQEAKIAkJc3VuLnV0aWwucmVzb3VyY2VzLkxvY2FsZU5hbWVzQnVuZGxlKSkKIAogIyBOb3cgc2V0dXAgdGhlIHJ1bGUgZm9yIHRoZSBnZW5lcmF0aW9uIG9mIHRoZSByZXNvdXJjZSBidW5kbGVzLgotJChKREtfT1VUUFVURElSKS9nZW5zcmNfcHJvcGVydGllcy9fdGhlLmNvbXBpbGVkX3Byb3BlcnRpZXMgOiAkKEFMTF9DT01QSUxFRF9QUk9QU09VUkNFUykgJChCVUlMRF9UT09MUykKLQkkKFJNKSAtciAkKEpES19PVVRQVVRESVIpL2dlbnNyY19wcm9wZXJ0aWVzLyoKKyQoSkRLX09VVFBVVERJUikvZ2Vuc3JjL190aGUuY29tcGlsZWRfcHJvcGVydGllcyA6ICQoQUxMX0NPTVBJTEVEX1BST1BTT1VSQ0VTKSAkKEJVSUxEX1RPT0xTKQogIwlHZW5lcmF0ZSBhbGwgb3V0cHV0IGRpcmVjdG9yaWVzIGluIGFkdmFuY2Ugc2luY2UgdGhlIGJ1aWxkIHRvb2wgZG9lcyBub3QgZG8gdGhhdC4uLgogCSQoTUtESVIpIC1wICQoc29ydCAkKGRpciAkKEFMTF9DT01QSUxFRF9QUk9QSkFWQVMpKSkKIAkkKEVDSE8pIENvbXBpbGluZyAkKHdvcmRzICQoQUxMX0NPTVBJTEVEX1BST1BTT1VSQ0VTKSkgcHJvcGVydGllcyBpbnRvIHJlc291cmNlIGJ1bmRsZXMKLQkkKGNhbGwgTGlzdFBhdGhzU2FmZWx5LENPTVBJTEVfUFJPUENNRExJTkUsXG4sID4+ICQoSkRLX09VVFBVVERJUikvZ2Vuc3JjX3Byb3BlcnRpZXMvX3RoZS5jbWRsaW5lKQotCSQoVE9PTF9DT01QSUxFUFJPUEVSVElFUykgLXF1aWV0IEAkKEpES19PVVRQVVRESVIpL2dlbnNyY19wcm9wZXJ0aWVzL190aGUuY21kbGluZQorCSQoY2FsbCBMaXN0UGF0aHNTYWZlbHksQ09NUElMRV9QUk9QQ01ETElORSxcbiwgPj4gJChKREtfT1VUUFVURElSKS9nZW5zcmMvX3RoZS5jbWRsaW5lKQorCSQoVE9PTF9DT01QSUxFUFJPUEVSVElFUykgLXF1aWV0IEAkKEpES19PVVRQVVRESVIpL2dlbnNyYy9fdGhlLmNtZGxpbmUKIAkkKFRPVUNIKSAkQAogCiAjIE5vdyBzZXR1cCB0aGUgcnVsZSBmb3IgdGhlIGdlbmVyYXRpb24gb2YgdGhlIGNsZWFuZWQgcHJvcGVydGllcy4KQEAgLTMyMywxMyArMzIyLDEzIEBACiAJJChUT09MX1NUUklQUFJPUEVSVElFUykgQCQoSkRLX09VVFBVVERJUikvY2xhc3Nlcy9fdGhlLmNsZWFuZWRfcHJvcGVydGllcy5jbWRsaW5lCiAJJChUT1VDSCkgJEAKIAotJChBTExfQ09NUElMRURfUFJPUEpBVkFTKSA6ICQoSkRLX09VVFBVVERJUikvZ2Vuc3JjX3Byb3BlcnRpZXMvX3RoZS5jb21waWxlZF9wcm9wZXJ0aWVzCiskKEFMTF9DT01QSUxFRF9QUk9QSkFWQVMpIDogJChKREtfT1VUUFVURElSKS9nZW5zcmMvX3RoZS5jb21waWxlZF9wcm9wZXJ0aWVzCiAKICQoQUxMX0NMRUFORURfUFJPUE9VVFBVVCkgOiAkKEpES19PVVRQVVRESVIpL2NsYXNzZXMvX3RoZS5jbGVhbmVkX3Byb3BlcnRpZXMKIAogCiAjIFNvbWUgemhfSEsgcmVzb3VyY2VzIGFyZSBqdXN0IGNvcGllZCBvZiB6aF9UVwotJChKREtfT1VUUFVURElSKS9nZW5zcmNfcHJvcGVydGllcy8lX3poX0hLLmphdmE6ICQoSkRLX1RPUERJUikvc3JjL3NoYXJlL2NsYXNzZXMvJV96aF9UVy5qYXZhCiskKEpES19PVVRQVVRESVIpL2dlbnNyYy8lX3poX0hLLmphdmE6ICQoSkRLX1RPUERJUikvc3JjL3NoYXJlL2NsYXNzZXMvJV96aF9UVy5qYXZhCiAJJChNS0RJUikgLXAgJChARCkKIAkkKENBVCkgJDwgfCAkKFNFRCkgLWUgJy9jbGFzcy9zL196aF9UVy9femhfSEsvJyA+ICRACiAKQEAgLTMzOCw3ICszMzcsNyBAQAogCQlzdW4vc2VjdXJpdHkvdXRpbC9BdXRoUmVzb3VyY2VzX3poX0hLLmphdmEgXAogICAgICAgICAgICAgICAgIHN1bi9zZWN1cml0eS91dGlsL1Jlc291cmNlc196aF9ISy5qYXZhCiAKLVpIX0hLX0pBVkFfRklMRVM6PSQoYWRkcHJlZml4ICQoSkRLX09VVFBVVERJUikvZ2Vuc3JjX3Byb3BlcnRpZXMvLCQoWkhfSEtfSkFWQSkpCitaSF9IS19KQVZBX0ZJTEVTOj0kKGFkZHByZWZpeCAkKEpES19PVVRQVVRESVIpL2dlbnNyYy8sJChaSF9IS19KQVZBKSkKIAogCiBHRU5TUkNfUFJPUEVSVElFUzo9JChBTExfQ09NUElMRURfUFJPUEpBVkFTKSAkKEFMTF9DTEVBTkVEX1BST1BPVVRQVVQpICQoWkhfSEtfSkFWQV9GSUxFUykKZGlmZiAtLWdpdCBhL2pkay9tYWtlZmlsZXMvR2Vuc3JjU3dpbmcuZ21rIGIvamRrL21ha2VmaWxlcy9HZW5zcmNTd2luZy5nbWsKaW5kZXggM2MwMDQzZS4uOTIxOGZkYSAxMDA2NDQKLS0tIGEvamRrL21ha2VmaWxlcy9HZW5zcmNTd2luZy5nbWsKKysrIGIvamRrL21ha2VmaWxlcy9HZW5zcmNTd2luZy5nbWsKQEAgLTI3LDI1ICsyNywyNSBAQAogIyBHZW5lcmF0ZSBqYXZhIGZpbGVzIGZvciBqYXZheC5zd2luZy5wbGFmIHBhY2thZ2UKICMgCiBOSU1CVVNfUEFDS0FHRSA9IGphdmF4LnN3aW5nLnBsYWYKLU5JTUJVU19HRU5TUkNfRElSID0gJChKREtfT1VUUFVURElSKS9nZW5zcmNfc3dpbmcvamF2YXgvc3dpbmcvcGxhZi9uaW1idXMKK05JTUJVU19HRU5TUkNfRElSID0gJChKREtfT1VUUFVURElSKS9nZW5zcmMvamF2YXgvc3dpbmcvcGxhZi9uaW1idXMKIE5JTUJVU19TS0lOX0ZJTEUgPSAkKEpES19UT1BESVIpL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3BsYWYvbmltYnVzL3NraW4ubGFmCiAKLSQoSkRLX09VVFBVVERJUikvZ2Vuc3JjX3N3aW5nL190aGUuZ2VuZXJhdGVkX25pbWJ1czogJChOSU1CVVNfU0tJTl9GSUxFKSAkKEJVSUxEX1RPT0xTKQorJChKREtfT1VUUFVURElSKS9nZW5zcmMvX3RoZS5nZW5lcmF0ZWRfbmltYnVzOiAkKE5JTUJVU19TS0lOX0ZJTEUpICQoQlVJTERfVE9PTFMpCiAJJChNS0RJUikgLXAgJChARCkKLQkkKEVDSE8pICJHZW5lcmF0aW5nIE5pbWJ1cyBzb3VyY2UgZmlsZXM6IgotCSQoVE9PTF9HRU5FUkFURU5JTUJVUykgXAotCSAgICAtc2tpbkZpbGUgJChOSU1CVVNfU0tJTl9GSUxFKSAtYnVpbGREaXIgJChKREtfT1VUUFVURElSKS9nZW5zcmNfc3dpbmcgXAorCSQoRUNITykgIkdlbmVyYXRpbmcgTmltYnVzIHNvdXJjZSBmaWxlcyIKKwkkKFRPT0xfR0VORVJBVEVOSU1CVVMpICQoTE9HX0lORk8pIFwKKwkgICAgLXNraW5GaWxlICQoTklNQlVTX1NLSU5fRklMRSkgLWJ1aWxkRGlyICQoSkRLX09VVFBVVERJUikvZ2Vuc3JjIFwKIAkgICAgLXBhY2thZ2VQcmVmaXggJChOSU1CVVNfUEFDS0FHRSkubmltYnVzIC1sYWZOYW1lIE5pbWJ1cwotCSQoRUNITykgIkZpbmlzaGVkIGdlbmVyYXRpbmcgTmltYnVzIHNvdXJjZSBmaWxlcyIKKwkkKEVDSE8pICQoTE9HX0lORk8pICJGaW5pc2hlZCBnZW5lcmF0aW5nIE5pbWJ1cyBzb3VyY2UgZmlsZXMiCiAJJChUT1VDSCkgJEAKIAotR0VOU1JDX1NXSU5HX05JTUJVUyA6PSAkKEpES19PVVRQVVRESVIpL2dlbnNyY19zd2luZy9fdGhlLmdlbmVyYXRlZF9uaW1idXMKK0dFTlNSQ19TV0lOR19OSU1CVVMgOj0gJChKREtfT1VUUFVURElSKS9nZW5zcmMvX3RoZS5nZW5lcmF0ZWRfbmltYnVzCiAKICMKICMgR2VuZXJhdGUgYmVhbmluZm8gamF2YSBmaWxlcwogIwogCi1CRUFOX0dFTlNSQ19ESVIgPSAkKEpES19PVVRQVVRESVIpL2dlbnNyY19zd2luZy9qYXZheC9zd2luZy9iZWFuaW5mbworQkVBTl9HRU5TUkNfRElSID0gJChKREtfT1VUUFVURElSKS9nZW5zcmMvamF2YXgvc3dpbmcvYmVhbmluZm8KIERPQ0xFVFNSQ19ESVIgPSAkKEpES19UT1BESVIpL21ha2UvdG9vbHMvc3dpbmctYmVhbnMKIAogIyBqYXZheC5zd2luZyBwYWNrYWdlCkBAIC02OSw5ICs2OSwxMSBAQAogIyBEdW1teSB2YXJpYWJsZSBzbyBmYXIsIGluIHRoZSBvbGQgYnVpbGQgc3lzdGVtIGl0IHdhcyBmYWxzZSBieSBkZWZhdWx0CiBTV0lOR0JFQU5fREVCVUdfRkxBRyA9IGZhbHNlCiAjIEdlbkRvY2xldEJlYW5JbmZvIGlzIGNvbXBpbGVkIGluIFRvb2xzLmdtayBhbmQgcGlja3MgdXAgZnJvbSAkKEpES19PVVRQVVRESVIpL2J0Y2xhc3NlcwotJChKREtfT1VUUFVURElSKS9nZW5zcmNfc3dpbmcvX3RoZS5nZW5lcmF0ZWRfYmVhbmluZm86ICQoQkVBTlNfU1JDKSAkKEJFQU5fR0VOU1JDX0RJUikvU3dpbmdCZWFuSW5mb0Jhc2UuamF2YSAkKEJFQU5fR0VOU1JDX0RJUikvQmVhbkluZm9VdGlscy5qYXZhICQoQlVJTERfVE9PTFMpCiskKEpES19PVVRQVVRESVIpL2dlbnNyYy9fdGhlLmdlbmVyYXRlZF9iZWFuaW5mbzogJChCRUFOU19TUkMpICQoQkVBTl9HRU5TUkNfRElSKS9Td2luZ0JlYW5JbmZvQmFzZS5qYXZhICQoQkVBTl9HRU5TUkNfRElSKS9CZWFuSW5mb1V0aWxzLmphdmEgJChCVUlMRF9UT09MUykKKwkkKEVDSE8pIEdlbmVyYXRpbmcgYmVhbmluZm8KIAkkKEpBVkEpIC1EamF2YS5hd3QuaGVhZGxlc3M9dHJ1ZSAtamFyICQoSkFWQURPQ19KQVJTKSAtZG9jbGV0IEdlbkRvY2xldEJlYW5JbmZvIC14ICQoU1dJTkdCRUFOX0RFQlVHX0ZMQUcpIC1kICQoQkVBTl9HRU5TUkNfRElSKSAtdCAkKERPQ0xFVFNSQ19ESVIpL1N3aW5nQmVhbkluZm8udGVtcGxhdGUgLWRvY2xldHBhdGggJChKREtfT1VUUFVURElSKS9idGNsYXNzZXMgXAotCSAgICAtY2xhc3NwYXRoICQoSkRLX09VVFBVVERJUikvYnRjbGFzc2VzICQoQkVBTlNfU1JDKQorCS1YRGlnbm9yZS5zeW1ib2wuZmlsZT10cnVlIFwKKwktY2xhc3NwYXRoICQoSkRLX09VVFBVVERJUikvYnRjbGFzc2VzICQoQkVBTlNfU1JDKSAkKExPR19JTkZPKQogCSQoVE9VQ0gpICRACiAKICMgVGhpcyBmaWxlIGlzIHRoZSBwYXJ0IG9mIGR0LmphcgpAQCAtODgsNCArOTAsNCBAQAogCSQoTUtESVIpIC1wICQoQEQpCiAJJChDUCkgJDwgJEAKIAotR0VOU1JDX1NXSU5HX0JFQU5JTkZPID0gJChKREtfT1VUUFVURElSKS9nZW5zcmNfc3dpbmcvX3RoZS5nZW5lcmF0ZWRfYmVhbmluZm8KK0dFTlNSQ19TV0lOR19CRUFOSU5GTyA9ICQoSkRLX09VVFBVVERJUikvZ2Vuc3JjL190aGUuZ2VuZXJhdGVkX2JlYW5pbmZvCmRpZmYgLS1naXQgYS9qZGsvbWFrZWZpbGVzL0dlbnNyY1gxMVdyYXBwZXJzLmdtayBiL2pkay9tYWtlZmlsZXMvR2Vuc3JjWDExV3JhcHBlcnMuZ21rCmluZGV4IDY5NWY2YmIuLmJhZDg0ZmMgMTAwNjQ0Ci0tLSBhL2pkay9tYWtlZmlsZXMvR2Vuc3JjWDExV3JhcHBlcnMuZ21rCisrKyBiL2pkay9tYWtlZmlsZXMvR2Vuc3JjWDExV3JhcHBlcnMuZ21rCkBAIC0zMyw2ICszMyw3IEBACiAKIEdFTlNSQ19YMTFXUkFQUEVSUyA6PQogR0VOU1JDX1gxMVdSQVBQRVJTX1RNUCA6PSAkKEpES19PVVRQVVRESVIpL2dlbnNyY194MTF3cmFwcGVycworR0VOU1JDX1gxMVdSQVBQRVJTX0RTVCA6PSAkKEpES19PVVRQVVRESVIpL2dlbnNyYwogCiBHRU5TUkNfU0laRVJfU1JDIDo9ICQoSkRLX1RPUERJUikvc3JjL3NvbGFyaXMvY2xhc3Nlcy9zdW4vYXd0L1gxMS9nZW5lcmF0b3IKIApAQCAtNDUsOCArNDYsOCBAQAogR0VOU1JDX1NJWkVTIDo9IHNpemVzLjMyIHNpemVzLjY0CiBlbmRpZgogZWxzZQotaWZlcSAoJChPUEVOSkRLX1RBUkdFVF9PUyktJChPUEVOSkRLX1RBUkdFVF9DUFUpLCBzb2xhcmlzLXg4NikKLSMgQXMgYSBzcGVjaWFsIGNhc2UsIHNvbGFyaXMgb24geDg2ICgzMi1iaXQpIGFsc28gZ2VuZXJhdGVzIHRoZSA2NC1iaXQgdmVyc2lvbgoraWZlcSAoJChPUEVOSkRLX1RBUkdFVF9PUyksIHNvbGFyaXMpCisjIEFzIGEgc3BlY2lhbCBjYXNlLCBzb2xhcmlzIDMyLWJpdCBhbHNvIGdlbmVyYXRlcyB0aGUgNjQtYml0IHZlcnNpb24KIEdFTlNSQ19TSVpFUyA6PSBzaXplcy4zMiBzaXplcy42NAogZW5kaWYKIGVuZGlmCkBAIC01NCw2ICs1NSw3IEBACiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAogJChHRU5TUkNfWDExV1JBUFBFUlNfVE1QKS9zaXplci9zaXplci4lLmMgOiAkKEdFTlNSQ19TSVpFUl9TUkMpL3hsaWJ0eXBlcy50eHQKKwkkKEVDSE8pICJHZW5lcmF0aW5nIFgxMSB3cmFwcGVyICgkKi1iaXQgdmVyc2lvbikiCiAJJChNS0RJUikgLXAgJChARCkKIAkkKFJNKSAkQAogCSQoVE9PTF9XUkFQUEVSR0VORVJBVE9SKSAkKEBEKSAkPCAic2l6ZXIiICQqCkBAIC02Miw2ICs2NCw4IEBACiAJJChNS0RJUikgLXAgJChARCkKIAkkKFJNKSAkQCAkQC50bXAKIAkoY2QgJChARCkgJiYgJChCVUlMRF9DQykgLW0kKiAtbyAkQC50bXAgJDwgXAorICAgICAgICAgICAgICAkKFhfQ0ZMQUdTKSBcCisgICAgICAgICAgICAgICQoWF9MSUJTKSBcCiAgICAgICAgICAgICAgIC1JJChKREtfT1VUUFVURElSKS9pbmNsdWRlIFwKICAgICAgICAgICAgICAgLUkkKEpES19UT1BESVIpL3NyYy9zaGFyZS9qYXZhdm0vZXhwb3J0IFwKICAgICAgICAgICAgICAgLUkkKEpES19UT1BESVIpL3NyYy8kKE9QRU5KREtfVEFSR0VUX09TX0FQSV9ESVIpL2phdmF2bS9leHBvcnQgXApAQCAtODgsMTAgKzkyLDkgQEAKIAkkKENQKSAkPCAkQAogZW5kaWYKIAotJChHRU5TUkNfWDExV1JBUFBFUlNfVE1QKS9jbGFzc2VzL190aGUuY2xhc3NlcyA6ICQoZm9yZWFjaCBTLCQoR0VOU1JDX1NJWkVTKSwkKEdFTlNSQ19YMTFXUkFQUEVSU19UTVApL3NpemVyLyQoUykpCiskKEdFTlNSQ19YMTFXUkFQUEVSU19EU1QpL190aGUuZ2VuZXJhdGVkLngxMSA6ICQoZm9yZWFjaCBTLCQoR0VOU1JDX1NJWkVTKSwkKEdFTlNSQ19YMTFXUkFQUEVSU19UTVApL3NpemVyLyQoUykpCiAJJChSTSkgJEAKIAkkKE1LRElSKSAtcCAkKEBEKS9zdW4vYXd0L1gxMQotCSQoUk0pICQoQEQpL3N1bi9hd3QvWDExLyoKIAkkKFRPT0xfV1JBUFBFUkdFTkVSQVRPUikgJChARCkvc3VuL2F3dC9YMTEgJChHRU5TUkNfU0laRVJfU1JDKS94bGlidHlwZXMudHh0ICJnZW4iICQoR0VOU1JDX1gxMVdSQVBQRVJTX1RNUCkvc2l6ZXIvc2l6ZXMKIGlmZXEgKCQoT1BFTkpES19UQVJHRVRfT1MpLSQoT1BFTkpES19UQVJHRVRfQ1BVKSwgc29sYXJpcy14ODZfNjQpCiAgICMgT24gc29sYXJpcy14ODZfNjQsIGFzIGEgc2FmZXR5IG1lYXN1cmUsIGNvbXBhcmUgdGhlIGdlbmVyYXRlZCBmaWxlIHdpdGggdGhlIGNoZWNrZWQtaW4gdmVyc2lvbiAKQEAgLTEwMCw0ICsxMDMsNCBAQAogZW5kaWYKIAkkKFRPVUNIKSAkQAogCi1HRU5TUkNfWDExV1JBUFBFUlMgKz0gJChHRU5TUkNfWDExV1JBUFBFUlNfVE1QKS9jbGFzc2VzL190aGUuY2xhc3NlcworR0VOU1JDX1gxMVdSQVBQRVJTICs9ICQoR0VOU1JDX1gxMVdSQVBQRVJTX0RTVCkvX3RoZS5nZW5lcmF0ZWQueDExCmRpZmYgLS1naXQgYS9qZGsvbWFrZWZpbGVzL0ltYWdlcy5nbWsgYi9qZGsvbWFrZWZpbGVzL0ltYWdlcy5nbWsKaW5kZXggMDUyNmY5Ny4uNjRkOGJiMSAxMDA2NDQKLS0tIGEvamRrL21ha2VmaWxlcy9JbWFnZXMuZ21rCisrKyBiL2pkay9tYWtlZmlsZXMvSW1hZ2VzLmdtawpAQCAtNDIsMzUgKzQyLDMxIEBACiAtaW5jbHVkZSAkKENVU1RPTV9NQUtFX0RJUikvSW1hZ2VzLmdtawogCiAKLWlmZXEgKCQoT1BFTkpES19UQVJHRVRfT1MpLHNvbGFyaXMpCi0jIE9uIFNvbGFyaXMsIGlmIHRoZSB0YXJnZXQgaXMgYSBzeW1saW5rIGFuZCBleGlzdHMsIGNwIHdvbid0IG92ZXJ3cml0ZS4KLWRlZmluZSBpbnN0YWxsLWZpbGUKLQkkKE1LRElSKSAtcCAkKEBEKQotCSQoUk0pICckQCcKLQkkKENQKSAtZiAtciAtUCAnJDwnICckKEBEKScKLWVuZGVmCi1lbHNlIGlmZXEgKCQoT1BFTkpES19UQVJHRVRfT1MpLG1hY29zeCkKLWRlZmluZSBpbnN0YWxsLWZpbGUKLQkkKE1LRElSKSAtcCAkKEBEKQotCSQoQ1ApIC1mcFJQICckPCcgJyRAJwotZW5kZWYKLWVsc2UKLWRlZmluZSBpbnN0YWxsLWZpbGUKLQkkKE1LRElSKSAtcCAkKEBEKQotCSQoQ1ApIC1mUCAnJDwnICckQCcKLWVuZGVmCi1lbmRpZgotCiAjIFByb2Nlc3NpbmcgbGljZW5zZSBmaWxlcyBmcm9tIHNvdXJjZSBhcmVhIHRvIGltYWdlIGFyZWEKICMgVGhlc2Ugd2lsbCBiZSBtb2RpZmllZCB0byBoYXZlIHRoZSBwbGF0Zm9ybSBzcGVjaWZpYyBFT0wgY2hhcnMuCiBkZWZpbmUgcHJvY2Vzcy1kb2MtZmlsZQotCSQoRUNITykgUHJvY2Vzc2luZyAkKHBhdHN1YnN0ICQoT1VUUFVUX1JPT1QpLyUsJSwkQCkKKwkkKEVDSE8pICQoTE9HX0lORk8pIFByb2Nlc3NpbmcgJChwYXRzdWJzdCAkKE9VVFBVVF9ST09UKS8lLCUsJEApCiAJJChNS0RJUikgLXAgJChARCkKIAkkKFJNKSAkQAogCSQoU0VEKSAncy8kJC8vZycgJDwgPiAkQAogCSQoQ0hNT0QpIDQ0NCAkQAogZW5kZWYKIAorZGVmaW5lIEFkZEZpbGVUb0NvcHkKKyAgIyBQYXJhbSAxIC0gc3JjIHJvb3QgZGlyCisgICMgUGFyYW0gMiAtIGRlc3Qgcm9vdCBkaXIKKyAgIyBQYXJhbSAzIC0gc3JjIGZpbGUKKyAgIyBQYXJhbSA0IC0gdmFyaWFibGUgdG8gYWRkIHRhcmdldHMgdG8KKworICAjIFJlbW92ZSBzcmMgZGlyIHJvb3QgZnJvbSBzcmMgZmlsZQorICAkMl8kM19GSUxFIDo9ICQkKHBhdHN1YnN0ICQxLyUsJSwkMykKKworICAkMi8kJCgkMl8kM19GSUxFKTogJDMKKwkkKEVDSE8pICQoTE9HX0lORk8pIENvcHlpbmcgJCQocGF0c3Vic3QgJChPVVRQVVRfUk9PVCkvJSwlLCQkQCkKKwkkJChpbnN0YWxsLWZpbGUpCisKKyAgJDQgKz0gJDIvJCQoJDJfJDNfRklMRSkKK2VuZGVmCiAKIEpES19JTUFHRV9ESVI6PSQoSU1BR0VTX09VVFBVVERJUikvajJzZGstaW1hZ2UKIEpSRV9JTUFHRV9ESVI6PSQoSU1BR0VTX09VVFBVVERJUikvajJyZS1pbWFnZQpAQCAtOTMsMzEgKzg5LDYgQEAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIC9iaW4gZGlyCiAKLSQoSlJFX0lNQUdFX0RJUikvYmluLyU6ICQoSkRLX09VVFBVVERJUikvYmluLyUKLQkkKEVDSE8pIENvcHlpbmcgJChwYXRzdWJzdCAkKE9VVFBVVF9ST09UKS8lLCUsJEApCi0JJChpbnN0YWxsLWZpbGUpCi0KLSQoSkRLX0lNQUdFX0RJUikvYmluLyU6ICQoSkRLX09VVFBVVERJUikvYmluLyUKLQkkKEVDSE8pIENvcHlpbmcgJChwYXRzdWJzdCAkKE9VVFBVVF9ST09UKS8lLCUsJEApCi0JJChpbnN0YWxsLWZpbGUpCi0KLSQoSkRLX0lNQUdFX0RJUikvanJlL2Jpbi8lOiAkKEpES19PVVRQVVRESVIpL2Jpbi8lCi0JJChFQ0hPKSBDb3B5aW5nICQocGF0c3Vic3QgJChPVVRQVVRfUk9PVCkvJSwlLCRAKQotCSQoaW5zdGFsbC1maWxlKQotCi0jIE92ZXJhbHkgaW1hZ2UgdGFyZ2V0cwotJChKUkVfT1ZFUkxBWV9JTUFHRV9ESVIpL2Jpbi8lOiAkKEpES19PVVRQVVRESVIpL2Jpbi8lCi0JJChFQ0hPKSBDb3B5aW5nICQocGF0c3Vic3QgJChPVVRQVVRfUk9PVCkvJSwlLCRAKQotCSQoaW5zdGFsbC1maWxlKQotCi0kKEpES19PVkVSTEFZX0lNQUdFX0RJUikvYmluLyU6ICQoSkRLX09VVFBVVERJUikvYmluLyUKLQkkKEVDSE8pIENvcHlpbmcgJChwYXRzdWJzdCAkKE9VVFBVVF9ST09UKS8lLCUsJEApCi0JJChpbnN0YWxsLWZpbGUpCi0KLSQoSkRLX09WRVJMQVlfSU1BR0VfRElSKS9qcmUvYmluLyU6ICQoSkRLX09VVFBVVERJUikvYmluLyUKLQkkKEVDSE8pIENvcHlpbmcgJChwYXRzdWJzdCAkKE9VVFBVVF9ST09UKS8lLCUsJEApCi0JJChpbnN0YWxsLWZpbGUpCi0KIE5PVF9KUkVfQklOX0ZJTEVTIDo9IFwKIAlhcHBsZXR2aWV3ZXIkKEVYRV9TVUZGSVgpIFwKIAlleHRjaGVjayQoRVhFX1NVRkZJWCkgXApAQCAtMTU0LDcgKzEyNSw3IEBACiBXSU5ET1dTX0pES19CSU5fRklMRVMgPSBcCiAJJChFWEVfU1VGRklYKSBcCiAJJChMSUJSQVJZX1BSRUZJWClqbGkkKFNIQVJFRF9MSUJSQVJZX1NVRkZJWCkgXAotCSQobm90ZGlyICQoTVNWQ1JOTl9ETEwpKQorCSQobm90ZGlyICQoTVNWQ1JfRExMKSkKIAogV0lORE9XU19KREtKUkVfQklOX0ZJTEVTIDo9IFwKIAkkKExJQlJBUllfUFJFRklYKWF0dGFjaCQoU0hBUkVEX0xJQlJBUllfU1VGRklYKSBcCkBAIC0xNjMsNiArMTM0LDkgQEAKICMgRmluZCBhbGwgZmlsZXMgaW4gYmluIGRpcgogQUxMX0JJTl9MSVNUIDo9ICQoc2hlbGwgJChGSU5EKSAkKEpES19PVVRQVVRESVIpL2JpbiAtdHlwZSBmKQogCisjIFByZXZlbnQgc2phdmFjIGZyb20gZW50ZXJpbmcgdGhlIGltYWdlcy4KK0FMTF9CSU5fTElTVCA6PSAkKGZpbHRlci1vdXQgJS9zamF2YWMsJChBTExfQklOX0xJU1QpKQorCiAjIEZvciB1bmtub3duIHJlYXNvbiB0aGUgZGVidWdpbmZvIGZpbGVzIGZvciBleGVjdXRhYmxlcyBhcmUgbm90IHB1dCBpbnRvIGltYWdlcwogIyBlLmcgZmlsdGVyIHRoZW0gb3V0CiBpZm5lcSAoJChPUEVOSkRLX1RBUkdFVF9PUyksd2luZG93cykKQEAgLTE3Niw2MCArMTUwLDQyIEBACiAgICAgQUxMX0JJTl9MSVNUIDo9ICQoZmlsdGVyLW91dCAkKEFMTF9CSU5fREVCVUdfRklMVEVSKSwkKEFMTF9CSU5fTElTVCkpCiBlbmRpZgogCitKREtKUkVfQklOX0xJU1QgOj0gJChmaWx0ZXItb3V0ICQoYWRkcHJlZml4ICUsJChOT1RfSlJFX0JJTl9GSUxFUykpLCAkKEFMTF9CSU5fTElTVCkpCitKUkVfQklOX0xJU1QgOj0gJChmaWx0ZXItb3V0ICQoYWRkcHJlZml4ICUsJChXSU5ET1dTX0pES0pSRV9CSU5fRklMRVMpKSwgJChKREtKUkVfQklOX0xJU1QpKQorCiBpZmVxICgkKE9QRU5KREtfVEFSR0VUX09TKSx3aW5kb3dzKQogICAgIEpES19CSU5fTElTVCA6PSAkKGZpbHRlciAkKGFkZHByZWZpeCAlLCQoV0lORE9XU19KREtfQklOX0ZJTEVTKSksICQoQUxMX0JJTl9MSVNUKSkKKyAgICAjIE9uIHdpbmRvd3MgeDg2LCB0aGUgc2VydmVyIGp2bSBpcyBmaWx0ZXJlZCBvdXQgZnJvbSB0aGUgajJyZSBpbWFnZS4gVGhpcyBjb3VsZCBwb3NzaWJseSAKKyAgICAjIGJlIGhhbmRsZWQgYnkgcHJvZmlsZXMgaW4gdGhlIGZ1dHVyZS4gSWYgbm8gY2xpZW50IGp2bSBpcyBidWlsdCwgbGVhdmUgc2VydmVyIGluLgorICAgIGlmZXEgKCQoT1BFTkpES19UQVJHRVRfQ1BVKSx4ODYpCisgICAgICAgIGlmZXEgKCQoSlZNX1ZBUklBTlRfQ0xJRU5UKSx0cnVlKQorICAgICAgICAgICAgSlJFX0JJTl9MSVNUIDo9ICQoZmlsdGVyLW91dCAkKEpES19PVVRQVVRESVIpL2Jpbi9zZXJ2ZXIvJSwkKEpSRV9CSU5fTElTVCkpCisJZW5kaWYKKyAgICBlbmRpZgogZWxzZQogICAgIEpES19CSU5fTElTVCA6PSAkKEFMTF9CSU5fTElTVCkKIGVuZGlmCi1KREtKUkVfQklOX0xJU1QgOj0gJChmaWx0ZXItb3V0ICQoYWRkcHJlZml4ICUsJChOT1RfSlJFX0JJTl9GSUxFUykpLCAkKEFMTF9CSU5fTElTVCkpCi1KUkVfQklOX0xJU1QgOj0gJChmaWx0ZXItb3V0ICQoYWRkcHJlZml4ICUsJChXSU5ET1dTX0pES0pSRV9CSU5fRklMRVMpKSwgJChKREtKUkVfQklOX0xJU1QpKQogCiBpZm5lcSAoJChPUEVOSkRLX1RBUkdFVF9DUFVfSVNBRElSKSwpCiAgICAgT1ZFUkxBWV9GSUxURVIgOj0gJChKREtfT1VUUFVURElSKS9iaW4kKE9QRU5KREtfVEFSR0VUX0NQVV9JU0FESVIpJQogZW5kaWYKIAotSlJFX0JJTl9UQVJHRVRTIDo9ICQocGF0c3Vic3QgJChKREtfT1VUUFVURElSKS8lLCQoSlJFX0lNQUdFX0RJUikvJSwgXAotCQkJJChmaWx0ZXItb3V0ICQoT1ZFUkxBWV9GSUxURVIpLCQoSlJFX0JJTl9MSVNUKSkpCi1KREtfQklOX1RBUkdFVFMgOj0gJChwYXRzdWJzdCAkKEpES19PVVRQVVRESVIpLyUsJChKREtfSU1BR0VfRElSKS8lLCBcCi0JCQkkKGZpbHRlci1vdXQgJChPVkVSTEFZX0ZJTFRFUiksJChKREtfQklOX0xJU1QpKSkKLUpES0pSRV9CSU5fVEFSR0VUUyA6PSAkKHBhdHN1YnN0ICQoSkRLX09VVFBVVERJUikvJSwkKEpES19JTUFHRV9ESVIpL2pyZS8lLCBcCi0JCQkkKGZpbHRlci1vdXQgJChPVkVSTEFZX0ZJTFRFUiksJChKREtKUkVfQklOX0xJU1QpKSkKKyQoZm9yZWFjaCBmLCQoZmlsdGVyLW91dCAkKE9WRVJMQVlfRklMVEVSKSwkKEpSRV9CSU5fTElTVCkpLFwKKyAgICAkKGV2YWwgJChjYWxsIEFkZEZpbGVUb0NvcHksJChKREtfT1VUUFVURElSKSwkKEpSRV9JTUFHRV9ESVIpLCRmLEpSRV9CSU5fVEFSR0VUUykpKQorJChmb3JlYWNoIGYsJChmaWx0ZXItb3V0ICQoT1ZFUkxBWV9GSUxURVIpLCQoSkRLX0JJTl9MSVNUKSksXAorICAgICQoZXZhbCAkKGNhbGwgQWRkRmlsZVRvQ29weSwkKEpES19PVVRQVVRESVIpLCQoSkRLX0lNQUdFX0RJUiksJGYsSkRLX0JJTl9UQVJHRVRTKSkpCiskKGZvcmVhY2ggZiwkKGZpbHRlci1vdXQgJChPVkVSTEFZX0ZJTFRFUiksJChKREtKUkVfQklOX0xJU1QpKSxcCisgICAgJChldmFsICQoY2FsbCBBZGRGaWxlVG9Db3B5LCQoSkRLX09VVFBVVERJUiksJChKREtfSU1BR0VfRElSKS9qcmUsJGYsSkRLSlJFX0JJTl9UQVJHRVRTKSkpCiAKLUpSRV9PVkVSTEFZX0JJTl9UQVJHRVRTIDo9ICQocGF0c3Vic3QgJChKREtfT1VUUFVURElSKS8lLCQoSlJFX09WRVJMQVlfSU1BR0VfRElSKS8lLCBcCi0JCQkJJChmaWx0ZXIgJChPVkVSTEFZX0ZJTFRFUiksJChKUkVfQklOX0xJU1QpKSkKLUpES19PVkVSTEFZX0JJTl9UQVJHRVRTIDo9ICQocGF0c3Vic3QgJChKREtfT1VUUFVURElSKS8lLCQoSkRLX09WRVJMQVlfSU1BR0VfRElSKS8lLCBcCi0JCQkJJChmaWx0ZXIgJChPVkVSTEFZX0ZJTFRFUiksJChKREtfQklOX0xJU1QpKSkKLUpES0pSRV9PVkVSTEFZX0JJTl9UQVJHRVRTIDo9ICQocGF0c3Vic3QgJChKREtfT1VUUFVURElSKS8lLCQoSkRLX09WRVJMQVlfSU1BR0VfRElSKS9qcmUvJSwgXAotCQkJCSQoZmlsdGVyICQoT1ZFUkxBWV9GSUxURVIpLCQoSkRLSlJFX0JJTl9MSVNUKSkpCiskKGZvcmVhY2ggZiwkKGZpbHRlciAkKE9WRVJMQVlfRklMVEVSKSwkKEpSRV9CSU5fTElTVCkpLFwKKyAgICAkKGV2YWwgJChjYWxsIEFkZEZpbGVUb0NvcHksJChKREtfT1VUUFVURElSKSwkKEpSRV9PVkVSTEFZX0lNQUdFX0RJUiksJGYsSlJFX0JJTl9UQVJHRVRTKSkpCiskKGZvcmVhY2ggZiwkKGZpbHRlciAkKE9WRVJMQVlfRklMVEVSKSwkKEpES19CSU5fTElTVCkpLFwKKyAgICAkKGV2YWwgJChjYWxsIEFkZEZpbGVUb0NvcHksJChKREtfT1VUUFVURElSKSwkKEpES19PVkVSTEFZX0lNQUdFX0RJUiksJGYsSkRLX0JJTl9UQVJHRVRTKSkpCiskKGZvcmVhY2ggZiwkKGZpbHRlciAkKE9WRVJMQVlfRklMVEVSKSwkKEpES0pSRV9CSU5fTElTVCkpLFwKKyAgICAkKGV2YWwgJChjYWxsIEFkZEZpbGVUb0NvcHksJChKREtfT1VUUFVURElSKSwkKEpES19PVkVSTEFZX0lNQUdFX0RJUikvanJlLCRmLEpES0pSRV9CSU5fVEFSR0VUUykpKQogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyAvbGliIGRpcgotCi0kKEpSRV9JTUFHRV9ESVIpL2xpYi8lOiAkKEpES19PVVRQVVRESVIpL2xpYi8lCi0JJChFQ0hPKSBDb3B5aW5nICQocGF0c3Vic3QgJChPVVRQVVRfUk9PVCkvJSwlLCRAKQotCSQoaW5zdGFsbC1maWxlKQotCi0kKEpES19JTUFHRV9ESVIpL2xpYi8lOiAkKEpES19PVVRQVVRESVIpL2xpYi8lCi0JJChFQ0hPKSBDb3B5aW5nICQocGF0c3Vic3QgJChPVVRQVVRfUk9PVCkvJSwlLCRAKQotCSQoaW5zdGFsbC1maWxlKQotCi0kKEpES19JTUFHRV9ESVIpL2pyZS9saWIvJTogJChKREtfT1VUUFVURElSKS9saWIvJQotCSQoRUNITykgQ29weWluZyAkKHBhdHN1YnN0ICQoT1VUUFVUX1JPT1QpLyUsJSwkQCkKLQkkKGluc3RhbGwtZmlsZSkKLQotIyBPdmVybGF5IGltYWdlIHRhcmdldHMKLSQoSlJFX09WRVJMQVlfSU1BR0VfRElSKS9saWIvJTogJChKREtfT1VUUFVURElSKS9saWIvJQotCSQoRUNITykgQ29weWluZyAkKHBhdHN1YnN0ICQoT1VUUFVUX1JPT1QpLyUsJSwkQCkKLQkkKGluc3RhbGwtZmlsZSkKLQotJChKREtfT1ZFUkxBWV9JTUFHRV9ESVIpL2xpYi8lOiAkKEpES19PVVRQVVRESVIpL2xpYi8lCi0JJChFQ0hPKSBDb3B5aW5nICQocGF0c3Vic3QgJChPVVRQVVRfUk9PVCkvJSwlLCRAKQotCSQoaW5zdGFsbC1maWxlKQotCi0kKEpES19PVkVSTEFZX0lNQUdFX0RJUikvanJlL2xpYi8lOiAkKEpES19PVVRQVVRESVIpL2xpYi8lCi0JJChFQ0hPKSBDb3B5aW5nICQocGF0c3Vic3QgJChPVVRQVVRfUk9PVCkvJSwlLCRAKQotCSQoaW5zdGFsbC1maWxlKQotCiBpZm5lcSAoJChPUEVOSkRLX1RBUkdFVF9PUyksIG1hY29zeCkKICAgICBKREtKUkVfTElCX0ZJTEVTIDo9IFwKIAkkKExJQlJBUllfUFJFRklYKWF0dGFjaCQoU0hBUkVEX0xJQlJBUllfU1VGRklYKSBcCkBAIC0yNTQsNTIgKzIxMCw4MCBAQAogICAgIEpES19MSUJfRklMRVMgKz0gamV4ZWMKIGVuZGlmCiAKLUFMTF9MSUJfTElTVCA6PSAkKHNoZWxsICQoRklORCkgJChKREtfT1VUUFVURElSKS9saWIgXCggLXR5cGUgZiAtbyAtdHlwZSBsIFwpIC1hICEgXCggLW5hbWUgIl90aGUqIiAtbyAtbmFtZSAiamF2YWNfc3RhdGUgIiBcKSApCi1KUkVfTElCX0xJU1QgOj0gJChmaWx0ZXItb3V0ICQoYWRkcHJlZml4ICUsJChOT1RfSlJFX0xJQl9GSUxFUykgJChKREtKUkVfTElCX0ZJTEVTKSksJChBTExfTElCX0xJU1QpKQotSkRLSlJFX0xJQl9MSVNUIDo9ICQoZmlsdGVyLW91dCAkKGFkZHByZWZpeCAlLCQoTk9UX0pSRV9MSUJfRklMRVMpKSwkKEFMTF9MSUJfTElTVCkpCi1KREtfTElCX0xJU1QgOj0gJChmaWx0ZXIgJChhZGRwcmVmaXggJSwkKEpES19MSUJfRklMRVMpKSwkKEFMTF9MSUJfTElTVCkpCisjIEZpbmQgYWxsIGZpbGVzIHRvIGNvcHkgZnJvbSAkKEpES19PVVRQVVRESVIpL2xpYgorQUxMX0pES09VVF9MSUJfTElTVCA6PSAkKHNoZWxsICQoRklORCkgJChKREtfT1VUUFVURElSKS9saWIgXCggLXR5cGUgZiAtbyAtdHlwZSBsIFwpIC1hICEgXAorICAgICAgICAgICAgICAgICAgICAgICBcKCAtbmFtZSAiX3RoZSoiIC1vIC1uYW1lICJqYXZhY19zdGF0ZSAiIFwpICkKKyMgRmluZCBhbGwgZmlsZXMgdG8gY29weSBmcm9tICQoSU1BR0VTX09VVFBVVERJUikvbGliCisjIFRoaXMgbWlnaHQgbm90IGV4aXN0IGlmIGJ1aWxkaW5nIG92ZXJsYXktaW1hZ2VzCitpZm5lcSAoJCh3aWxkY2FyZCAkKElNQUdFU19PVVRQVVRESVIpL2xpYiksKQorICAgIEFMTF9JTUFHRVNfTElCX0xJU1QgOj0gJChzaGVsbCAkKEZJTkQpICQoSU1BR0VTX09VVFBVVERJUikvbGliIFwoIC10eXBlIGYgLW8gLXR5cGUgbCBcKSAtYSAhIFwKKyAgICAgICAgICAgICAgICAgICAgICAgXCggLW5hbWUgIl90aGUqIiAtbyAtbmFtZSAiamF2YWNfc3RhdGUgIiBcKSApCitlbmRpZgogCi1KUkVfTElCX1RBUkdFVFMgOj0gJChwYXRzdWJzdCAkKEpES19PVVRQVVRESVIpLyUsJChKUkVfSU1BR0VfRElSKS8lLCQoSlJFX0xJQl9MSVNUKSkKLUpES19MSUJfVEFSR0VUUyA6PSAkKHBhdHN1YnN0ICQoSkRLX09VVFBVVERJUikvJSwkKEpES19JTUFHRV9ESVIpLyUsJChKREtfTElCX0xJU1QpKQotSkRLSlJFX0xJQl9UQVJHRVRTIDo9ICQocGF0c3Vic3QgJChKREtfT1VUUFVURElSKS8lLCQoSkRLX0lNQUdFX0RJUikvanJlLyUsJChKREtKUkVfTElCX0xJU1QpKQorIyBGaWx0ZXIgZmlsZXMgdG8gY29weSBmb3IgZWFjaCBkZXN0aW5hdGlvbgorSlJFX0pES09VVF9MSUJfTElTVCA6PSAkKGZpbHRlci1vdXQgJChhZGRwcmVmaXggJSwkKE5PVF9KUkVfTElCX0ZJTEVTKSAkKEpES0pSRV9MSUJfRklMRVMpKSxcCisgICAgICAgICAgICAgICAgICAgICAgICQoQUxMX0pES09VVF9MSUJfTElTVCkpCitKREtKUkVfSkRLT1VUX0xJQl9MSVNUIDo9ICQoZmlsdGVyLW91dCAkKGFkZHByZWZpeCAlLCQoTk9UX0pSRV9MSUJfRklMRVMpKSwkKEFMTF9KREtPVVRfTElCX0xJU1QpKQorSkRLX0pES09VVF9MSUJfTElTVCA6PSAkKGZpbHRlciAkKGFkZHByZWZpeCAlLCQoSkRLX0xJQl9GSUxFUykpLCQoQUxMX0pES09VVF9MSUJfTElTVCkpCiAKLUpSRV9PVkVSTEFZX0xJQl9UQVJHRVRTIDo9ICQoc3Vic3QgJChKUkVfSU1BR0VfRElSKSwkKEpSRV9PVkVSTEFZX0lNQUdFX0RJUiksXAotCQkJCSQoZmlsdGVyICQoSlJFX0lNQUdFX0RJUikvbGliJChPUEVOSkRLX1RBUkdFVF9DUFVfSVNBRElSKS8lLCQoSlJFX0xJQl9UQVJHRVRTKSkpCi1KREtfT1ZFUkxBWV9MSUJfVEFSR0VUUyA6PSAkKHN1YnN0ICQoSkRLX0lNQUdFX0RJUiksJChKREtfT1ZFUkxBWV9JTUFHRV9ESVIpLFwKLQkJCQkkKGZpbHRlciAkKEpES19JTUFHRV9ESVIpL2xpYiQoT1BFTkpES19UQVJHRVRfQ1BVX0lTQURJUikvJSwkKEpES19MSUJfVEFSR0VUUykpKQotSkRLSlJFX09WRVJMQVlfTElCX1RBUkdFVFMgOj0gJChzdWJzdCAkKEpES19JTUFHRV9ESVIpLCQoSkRLX09WRVJMQVlfSU1BR0VfRElSKSxcCi0JCQkJJChmaWx0ZXIgJChKREtfSU1BR0VfRElSKS9qcmUvbGliJChPUEVOSkRLX1RBUkdFVF9DUFVfSVNBRElSKS8lLCQoSkRLSlJFX0xJQl9UQVJHRVRTKSkpCitKUkVfSU1BR0VTX0xJQl9MSVNUIDo9ICQoZmlsdGVyLW91dCAkKGFkZHByZWZpeCAlLCQoTk9UX0pSRV9MSUJfRklMRVMpICQoSkRLSlJFX0xJQl9GSUxFUykpLFwKKyAgICAgICAgICAgICAgICAgICAgICAgJChBTExfSU1BR0VTX0xJQl9MSVNUKSkKK0pES0pSRV9JTUFHRVNfTElCX0xJU1QgOj0gJChmaWx0ZXItb3V0ICQoYWRkcHJlZml4ICUsJChOT1RfSlJFX0xJQl9GSUxFUykpLCQoQUxMX0lNQUdFU19MSUJfTElTVCkpCitKREtfSU1BR0VTX0xJQl9MSVNUIDo9ICQoZmlsdGVyICQoYWRkcHJlZml4ICUsJChKREtfTElCX0ZJTEVTKSksJChBTExfSU1BR0VTX0xJQl9MSVNUKSkKKworIyBJdGVyYXRlIG92ZXIgZmlsZXMgdG8gY29weSB0byBjcmVhdGUgcnVsZXMgZm9yIGVhY2ggb25lCiskKGZvcmVhY2ggZiwkKEpSRV9KREtPVVRfTElCX0xJU1QpLFwKKyAgICAkKGV2YWwgJChjYWxsIEFkZEZpbGVUb0NvcHksJChKREtfT1VUUFVURElSKSwkKEpSRV9JTUFHRV9ESVIpLCRmLEpSRV9MSUJfVEFSR0VUUykpKQorJChmb3JlYWNoIGYsJChKREtfSkRLT1VUX0xJQl9MSVNUKSxcCisgICAgJChldmFsICQoY2FsbCBBZGRGaWxlVG9Db3B5LCQoSkRLX09VVFBVVERJUiksJChKREtfSU1BR0VfRElSKSwkZixKREtfTElCX1RBUkdFVFMpKSkKKyQoZm9yZWFjaCBmLCQoSkRLSlJFX0pES09VVF9MSUJfTElTVCksXAorICAgICQoZXZhbCAkKGNhbGwgQWRkRmlsZVRvQ29weSwkKEpES19PVVRQVVRESVIpLCQoSkRLX0lNQUdFX0RJUikvanJlLCRmLEpES0pSRV9MSUJfVEFSR0VUUykpKQorCiskKGZvcmVhY2ggZiwkKEpSRV9JTUFHRVNfTElCX0xJU1QpLFwKKyAgICAkKGV2YWwgJChjYWxsIEFkZEZpbGVUb0NvcHksJChJTUFHRVNfT1VUUFVURElSKSwkKEpSRV9JTUFHRV9ESVIpLCRmLEpSRV9MSUJfVEFSR0VUUykpKQorJChmb3JlYWNoIGYsJChKREtfSU1BR0VTX0xJQl9MSVNUKSxcCisgICAgJChldmFsICQoY2FsbCBBZGRGaWxlVG9Db3B5LCQoSU1BR0VTX09VVFBVVERJUiksJChKREtfSU1BR0VfRElSKSwkZixKREtfTElCX1RBUkdFVFMpKSkKKyQoZm9yZWFjaCBmLCQoSkRLSlJFX0lNQUdFU19MSUJfTElTVCksXAorICAgICQoZXZhbCAkKGNhbGwgQWRkRmlsZVRvQ29weSwkKElNQUdFU19PVVRQVVRESVIpLCQoSkRLX0lNQUdFX0RJUikvanJlLCRmLEpES0pSRV9MSUJfVEFSR0VUUykpKQorCiskKGZvcmVhY2ggZiwkKGZpbHRlciAkKEpES19PVVRQVVRESVIpL2xpYiQoT1BFTkpES19UQVJHRVRfQ1BVX0lTQURJUikvJSwkKEpSRV9KREtPVVRfTElCX0xJU1QpKSxcCisgICAgJChldmFsICQoY2FsbCBBZGRGaWxlVG9Db3B5LCQoSkRLX09VVFBVVERJUiksJChKUkVfT1ZFUkxBWV9JTUFHRV9ESVIpLCRmLEpSRV9PVkVSTEFZX0xJQl9UQVJHRVRTKSkpCiskKGZvcmVhY2ggZiwkKGZpbHRlciAkKEpES19PVVRQVVRESVIpL2xpYiQoT1BFTkpES19UQVJHRVRfQ1BVX0lTQURJUikvJSwkKEpES19KREtPVVRfTElCX0xJU1QpKSxcCisgICAgJChldmFsICQoY2FsbCBBZGRGaWxlVG9Db3B5LCQoSkRLX09VVFBVVERJUiksJChKREtfT1ZFUkxBWV9JTUFHRV9ESVIpLCRmLEpES19PVkVSTEFZX0xJQl9UQVJHRVRTKSkpCiskKGZvcmVhY2ggZiwkKGZpbHRlciAkKEpES19PVVRQVVRESVIpL2xpYiQoT1BFTkpES19UQVJHRVRfQ1BVX0lTQURJUikvJSwkKEpES0pSRV9KREtPVVRfTElCX0xJU1QpKSxcCisgICAgJChldmFsICQoY2FsbCBBZGRGaWxlVG9Db3B5LCQoSkRLX09VVFBVVERJUiksJChKREtfT1ZFUkxBWV9JTUFHRV9ESVIpL2pyZSwkZixKREtKUkVfT1ZFUkxBWV9MSUJfVEFSR0VUUykpKQogCiAjIENURSBwbHVnaW4gc2VjdXJpdHkgY2hhbmdlIHJlcXVpcmUgbmV3IGVtcHR5IGRpcmVjdG9yeSBsaWIvYXBwbGV0CiAkKEpSRV9JTUFHRV9ESVIpL2xpYi9hcHBsZXQ6IAotCSQoRUNITykgQ3JlYXRpbmcgJChwYXRzdWJzdCAkKE9VVFBVVF9ST09UKS8lLCUsJEApCisJJChFQ0hPKSAkKExPR19JTkZPKSBDcmVhdGluZyAkKHBhdHN1YnN0ICQoT1VUUFVUX1JPT1QpLyUsJSwkQCkKIAkkKE1LRElSKSAtcCAkQAogCiAkKEpES19JTUFHRV9ESVIpL2pyZS9saWIvYXBwbGV0OiAKLQkkKEVDSE8pIENyZWF0aW5nICQocGF0c3Vic3QgJChPVVRQVVRfUk9PVCkvJSwlLCRAKQorCSQoRUNITykgJChMT0dfSU5GTykgQ3JlYXRpbmcgJChwYXRzdWJzdCAkKE9VVFBVVF9ST09UKS8lLCUsJEApCiAJJChNS0RJUikgLXAgJEAKIAogIyBJbiB0aGUgb2xkIGJ1aWxkLCBKT2JqQy5qYXIgaXMgbm90IHBhcnQgb2YgdGhlIG1ldGEtaW5kZXgKICQoSlJFX0lNQUdFX0RJUikvbGliL21ldGEtaW5kZXg6ICQoSlJFX0xJQl9UQVJHRVRTKQotCSQoRUNITykgR2VuZXJhdGluZyAkKHBhdHN1YnN0ICQoT1VUUFVUX1JPT1QpLyUsJSwkQCkKKwkkKEVDSE8pICQoTE9HX0lORk8pIEdlbmVyYXRpbmcgJChwYXRzdWJzdCAkKE9VVFBVVF9ST09UKS8lLCUsJEApCiAJJChDRCkgJChARCkgJiYgJChUT09MX0JVSUxETUVUQUlOREVYKSAtbyBtZXRhLWluZGV4IGAkKExTKSAqLmphciB8ICQoU0VEKSAncy9KT2JqQ1wuamFyLy9nJ2AKIAogJChKREtfSU1BR0VfRElSKS9qcmUvbGliL21ldGEtaW5kZXg6ICQoSkRLSlJFX0xJQl9UQVJHRVRTKQotCSQoRUNITykgR2VuZXJhdGluZyAkKHBhdHN1YnN0ICQoT1VUUFVUX1JPT1QpLyUsJSwkQCkKKwkkKEVDSE8pICQoTE9HX0lORk8pIEdlbmVyYXRpbmcgJChwYXRzdWJzdCAkKE9VVFBVVF9ST09UKS8lLCUsJEApCiAJJChDRCkgJChARCkgJiYgJChUT09MX0JVSUxETUVUQUlOREVYKSAtbyBtZXRhLWluZGV4IGAkKExTKSAqLmphciB8ICQoU0VEKSAncy9KT2JqQ1wuamFyLy9nJ2AKIAogJChKUkVfSU1BR0VfRElSKS9saWIvZXh0L21ldGEtaW5kZXg6ICQoSlJFX0xJQl9UQVJHRVRTKQotCSQoRUNITykgR2VuZXJhdGluZyAkKHBhdHN1YnN0ICQoT1VUUFVUX1JPT1QpLyUsJSwkQCkKKwkkKEVDSE8pICQoTE9HX0lORk8pIEdlbmVyYXRpbmcgJChwYXRzdWJzdCAkKE9VVFBVVF9ST09UKS8lLCUsJEApCiAJJChDRCkgJChARCkgJiYgJChUT09MX0JVSUxETUVUQUlOREVYKSAtbyBtZXRhLWluZGV4ICouamFyCiAKICQoSkRLX0lNQUdFX0RJUikvanJlL2xpYi9leHQvbWV0YS1pbmRleDogJChKREtKUkVfTElCX1RBUkdFVFMpCi0JJChFQ0hPKSBHZW5lcmF0aW5nICQocGF0c3Vic3QgJChPVVRQVVRfUk9PVCkvJSwlLCRAKQorCSQoRUNITykgJChMT0dfSU5GTykgR2VuZXJhdGluZyAkKHBhdHN1YnN0ICQoT1VUUFVUX1JPT1QpLyUsJSwkQCkKIAkkKENEKSAkKEBEKSAmJiAkKFRPT0xfQlVJTERNRVRBSU5ERVgpIC1vIG1ldGEtaW5kZXggKi5qYXIKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMgL21hbiBkaXIKLQotSlJFX01BTl9QQUdFUyA6PSBcCisjIEF2b2lkIGV2YWx1YXRpbmcgdGhpcyB3aG9sZSBzZWN0aW9uIG9uIHdpbmRvd3MgZm9yIHNwZWVkIGFuZCBzdGFiaWxpdHkKK2lmbmVxICgkKE9QRU5KREtfVEFSR0VUX09TKSx3aW5kb3dzKQorICAgIEpSRV9NQU5fUEFHRVMgOj0gXAogCWphdmEuMQkJXAogCWtleXRvb2wuMQlcCiAJb3JiZC4xICAgICAgICAgIFwKQEAgLTMxMSwxMSArMjk1LDExIEBACiAJdG5hbWVzZXJ2LjEgICAgIFwKIAl1bnBhY2syMDAuMQogCi1pZm5kZWYgT1BFTkpESwotICBKUkVfTUFOX1BBR0VTICs9IGphdmF3cy4xCi1lbmRpZgorICAgIGlmbmRlZiBPUEVOSkRLCisgICAgICAgIEpSRV9NQU5fUEFHRVMgKz0gamF2YXdzLjEKKyAgICBlbmRpZgogCi1KREtfTUFOX1BBR0VTID0gICAgICAgICAgICBcCisgICAgSkRLX01BTl9QQUdFUyA9ICAgICAgICBcCiAJJChKUkVfTUFOX1BBR0VTKSAgIFwKIAlhcHBsZXR2aWV3ZXIuMSAgICAgXAogCWV4dGNoZWNrLjEgICAgICAgICBcCkBAIC0zNDYsMTg2ICszMzAsMTc2IEBACiAgICAgICAgIHdzaW1wb3J0LjEgICAgICAgICBcCiAgICAgICAgIHhqYy4xCiAKLWlmbmRlZiBPUEVOSkRLCi0gIEpES19NQU5fUEFHRVMgKz0ganZpc3VhbHZtLjEKLWVuZGlmCisgICAgaWZuZGVmIE9QRU5KREsKKyAgICAgICAgSkRLX01BTl9QQUdFUyArPSBqdmlzdWFsdm0uMQorICAgIGVuZGlmCiAKLWlmZXEgKCQoT1BFTkpES19UQVJHRVRfT1MpLCBsaW51eCkKLSAgICBNQU5fU1JDX0RJUjo9JChKREtfVE9QRElSKS9zcmMvbGludXgvZG9jCi0gICAgTUFOMV9TVUJESVI6PW1hbgotZW5kaWYKLWlmZXEgKCQoT1BFTkpES19UQVJHRVRfT1MpLCBzb2xhcmlzKQotICAgIE1BTl9TUkNfRElSOj0kKEpES19UT1BESVIpL3NyYy9zb2xhcmlzL2RvYwotICAgIE1BTjFfU1VCRElSOj1zdW4vbWFuL21hbjEKLWVuZGlmCi1pZmVxICgkKE9QRU5KREtfVEFSR0VUX09TKSwgbWFjb3N4KQotICAgIE1BTl9TUkNfRElSOj0kKEpES19UT1BESVIpL3NyYy9ic2QvZG9jCi0gICAgTUFOMV9TVUJESVI6PW1hbgotICAgIEpES19NQU5fUEFHRVMgOj0gJChmaWx0ZXItb3V0IGpjbWQuMSwgJChKREtfTUFOX1BBR0VTKSkKLSAgICBKREtfTUFOX1BBR0VTIDo9ICQoZmlsdGVyLW91dCBqdmlzdWFsdm0uMSwgJChKREtfTUFOX1BBR0VTKSkKLWVuZGlmCisgICAgaWZlcSAoJChPUEVOSkRLX1RBUkdFVF9PUyksIGxpbnV4KQorICAgICAgICBNQU5fU1JDX0RJUjo9JChKREtfVE9QRElSKS9zcmMvbGludXgvZG9jCisgICAgICAgIE1BTjFfU1VCRElSOj1tYW4KKyAgICBlbmRpZgorICAgIGlmZXEgKCQoT1BFTkpES19UQVJHRVRfT1MpLCBzb2xhcmlzKQorICAgICAgICBNQU5fU1JDX0RJUjo9JChKREtfVE9QRElSKS9zcmMvc29sYXJpcy9kb2MKKyAgICAgICAgTUFOMV9TVUJESVI6PXN1bi9tYW4vbWFuMQorICAgIGVuZGlmCisgICAgaWZlcSAoJChPUEVOSkRLX1RBUkdFVF9PUyksIG1hY29zeCkKKyAgICAgICAgTUFOX1NSQ19ESVI6PSQoSkRLX1RPUERJUikvc3JjL2JzZC9kb2MKKyAgICAgICAgTUFOMV9TVUJESVI6PW1hbgorICAgICAgICBKREtfTUFOX1BBR0VTIDo9ICQoZmlsdGVyLW91dCBqY21kLjEsICQoSkRLX01BTl9QQUdFUykpCisgICAgICAgIEpES19NQU5fUEFHRVMgOj0gJChmaWx0ZXItb3V0IGp2aXN1YWx2bS4xLCAkKEpES19NQU5fUEFHRVMpKQorICAgIGVuZGlmCiAKIAotJChKUkVfSU1BR0VfRElSKS9tYW4vbWFuMS8lOiAkKE1BTl9TUkNfRElSKS8kKE1BTjFfU1VCRElSKS8lCi0JJChFQ0hPKSBDb3B5aW5nICQocGF0c3Vic3QgJChPVVRQVVRfUk9PVCkvJSwlLCRAKQorICAgICQoSlJFX0lNQUdFX0RJUikvbWFuL21hbjEvJTogJChNQU5fU1JDX0RJUikvJChNQU4xX1NVQkRJUikvJQorCSQoRUNITykgJChMT0dfSU5GTykgQ29weWluZyAkKHBhdHN1YnN0ICQoT1VUUFVUX1JPT1QpLyUsJSwkQCkKIAkkKGluc3RhbGwtZmlsZSkKIAotJChKREtfSU1BR0VfRElSKS9tYW4vbWFuMS8lOiAkKE1BTl9TUkNfRElSKS8kKE1BTjFfU1VCRElSKS8lCi0JJChFQ0hPKSBDb3B5aW5nICQocGF0c3Vic3QgJChPVVRQVVRfUk9PVCkvJSwlLCRAKQorICAgICQoSkRLX0lNQUdFX0RJUikvbWFuL21hbjEvJTogJChNQU5fU1JDX0RJUikvJChNQU4xX1NVQkRJUikvJQorCSQoRUNITykgJChMT0dfSU5GTykgQ29weWluZyAkKHBhdHN1YnN0ICQoT1VUUFVUX1JPT1QpLyUsJSwkQCkKIAkkKGluc3RhbGwtZmlsZSkKIAotJChKUkVfSU1BR0VfRElSKS9tYW4vbWFuMS8lOiAkKEpES19PVVRQVVRESVIpL2ltcGRvYy8kKE1BTjFfU1VCRElSKS8lCi0JJChFQ0hPKSBDb3B5aW5nICQocGF0c3Vic3QgJChPVVRQVVRfUk9PVCkvJSwlLCRAKQorICAgICQoSlJFX0lNQUdFX0RJUikvbWFuL21hbjEvJTogJChKREtfT1VUUFVURElSKS9pbXBkb2MvJChNQU4xX1NVQkRJUikvJQorCSQoRUNITykgJChMT0dfSU5GTykgQ29weWluZyAkKHBhdHN1YnN0ICQoT1VUUFVUX1JPT1QpLyUsJSwkQCkKIAkkKGluc3RhbGwtZmlsZSkKIAotJChKREtfSU1BR0VfRElSKS9tYW4vbWFuMS8lOiAkKEpES19PVVRQVVRESVIpL2ltcGRvYy8kKE1BTjFfU1VCRElSKS8lCi0JJChFQ0hPKSBDb3B5aW5nICQocGF0c3Vic3QgJChPVVRQVVRfUk9PVCkvJSwlLCRAKQorICAgICQoSkRLX0lNQUdFX0RJUikvbWFuL21hbjEvJTogJChKREtfT1VUUFVURElSKS9pbXBkb2MvJChNQU4xX1NVQkRJUikvJQorCSQoRUNITykgJChMT0dfSU5GTykgQ29weWluZyAkKHBhdHN1YnN0ICQoT1VUUFVUX1JPT1QpLyUsJSwkQCkKIAkkKGluc3RhbGwtZmlsZSkKIAotZGVmaW5lIGluc3RhbGwtamEtbWFucGFnZQorICAgIGRlZmluZSBpbnN0YWxsLWphLW1hbnBhZ2UKIAkkKE1LRElSKSAtcCAkKEBEKQogCSQoQ0FUKSAkPCBcCiAJCXwgJChOQVRJVkUyQVNDSUkpIC1lbmNvZGluZyBldWNKUCBcCiAJCXwgJChTRUQpICdzL0BAVkVSU0lPTkBALyQoVEhJU19KREtfVkVSU0lPTikvZycgXAogCQl8ICQoTkFUSVZFMkFTQ0lJKSAtcmV2ZXJzZSAtZW5jb2RpbmcgJDEgXAogCQk+ICRACi1lbmRlZgorICAgIGVuZGVmCiAKLSQoSlJFX0lNQUdFX0RJUikvbWFuL2phX0pQLlVURi04L21hbjEvJTogJChNQU5fU1JDX0RJUikvJChNQU4xX1NVQkRJUikvamEvJQotCSQoRUNITykgQ29udmVydGluZyAkKHBhdHN1YnN0ICQoT1VUUFVUX1JPT1QpLyUsJSwkQCkKKyAgICAkKEpSRV9JTUFHRV9ESVIpL21hbi9qYV9KUC5VVEYtOC9tYW4xLyU6ICQoTUFOX1NSQ19ESVIpLyQoTUFOMV9TVUJESVIpL2phLyUKKwkkKEVDSE8pICQoTE9HX0lORk8pIENvbnZlcnRpbmcgJChwYXRzdWJzdCAkKE9VVFBVVF9ST09UKS8lLCUsJEApCiAJJChjYWxsIGluc3RhbGwtamEtbWFucGFnZSxVVEYtOCkKIAotJChKREtfSU1BR0VfRElSKS9tYW4vamFfSlAuVVRGLTgvbWFuMS8lOiAkKE1BTl9TUkNfRElSKS8kKE1BTjFfU1VCRElSKS9qYS8lCi0JJChFQ0hPKSBDb252ZXJ0aW5nICQocGF0c3Vic3QgJChPVVRQVVRfUk9PVCkvJSwlLCRAKQorICAgICQoSkRLX0lNQUdFX0RJUikvbWFuL2phX0pQLlVURi04L21hbjEvJTogJChNQU5fU1JDX0RJUikvJChNQU4xX1NVQkRJUikvamEvJQorCSQoRUNITykgJChMT0dfSU5GTykgQ29udmVydGluZyAkKHBhdHN1YnN0ICQoT1VUUFVUX1JPT1QpLyUsJSwkQCkKIAkkKGNhbGwgaW5zdGFsbC1qYS1tYW5wYWdlLFVURi04KQogCi0kKEpSRV9JTUFHRV9ESVIpL21hbi9qYV9KUC5QQ0svbWFuMS8lOiAkKE1BTl9TUkNfRElSKS8kKE1BTjFfU1VCRElSKS9qYS8lCi0JJChFQ0hPKSBDb252ZXJ0aW5nICQocGF0c3Vic3QgJChPVVRQVVRfUk9PVCkvJSwlLCRAKQorICAgICQoSlJFX0lNQUdFX0RJUikvbWFuL2phX0pQLlBDSy9tYW4xLyU6ICQoTUFOX1NSQ19ESVIpLyQoTUFOMV9TVUJESVIpL2phLyUKKwkkKEVDSE8pICQoTE9HX0lORk8pIENvbnZlcnRpbmcgJChwYXRzdWJzdCAkKE9VVFBVVF9ST09UKS8lLCUsJEApCiAJJChjYWxsIGluc3RhbGwtamEtbWFucGFnZSxQQ0spCiAKLSQoSkRLX0lNQUdFX0RJUikvbWFuL2phX0pQLlBDSy9tYW4xLyU6ICQoTUFOX1NSQ19ESVIpLyQoTUFOMV9TVUJESVIpL2phLyUKLQkkKEVDSE8pIENvbnZlcnRpbmcgJChwYXRzdWJzdCAkKE9VVFBVVF9ST09UKS8lLCUsJEApCisgICAgJChKREtfSU1BR0VfRElSKS9tYW4vamFfSlAuUENLL21hbjEvJTogJChNQU5fU1JDX0RJUikvJChNQU4xX1NVQkRJUikvamEvJQorCSQoRUNITykgJChMT0dfSU5GTykgQ29udmVydGluZyAkKHBhdHN1YnN0ICQoT1VUUFVUX1JPT1QpLyUsJSwkQCkKIAkkKGNhbGwgaW5zdGFsbC1qYS1tYW5wYWdlLFBDSykKIAotaWZlcSAoJChPUEVOSkRLX1RBUkdFVF9PUyksIHNvbGFyaXMpCi0gICAgJChKUkVfSU1BR0VfRElSKS9tYW4vamEvbWFuMS8lOiAkKE1BTl9TUkNfRElSKS8kKE1BTjFfU1VCRElSKS9qYS8lCi0JJChFQ0hPKSBDb252ZXJ0aW5nICQocGF0c3Vic3QgJChPVVRQVVRfUk9PVCkvJSwlLCRAKQotCSQoaW5zdGFsbC1maWxlKQorICAgIGlmZXEgKCQoT1BFTkpES19UQVJHRVRfT1MpLCBzb2xhcmlzKQorICAgICAgICAkKEpSRV9JTUFHRV9ESVIpL21hbi9qYS9tYW4xLyU6ICQoTUFOX1NSQ19ESVIpLyQoTUFOMV9TVUJESVIpL2phLyUKKwkJJChFQ0hPKSAkKExPR19JTkZPKSBDb252ZXJ0aW5nICQocGF0c3Vic3QgJChPVVRQVVRfUk9PVCkvJSwlLCRAKQorCQkkKGluc3RhbGwtZmlsZSkKIAotICAgICQoSkRLX0lNQUdFX0RJUikvbWFuL2phL21hbjEvJTogJChNQU5fU1JDX0RJUikvJChNQU4xX1NVQkRJUikvamEvJQotCSQoRUNITykgQ29udmVydGluZyAkKHBhdHN1YnN0ICQoT1VUUFVUX1JPT1QpLyUsJSwkQCkKLQkkKGluc3RhbGwtZmlsZSkKLWVuZGlmCisgICAgICAgICQoSkRLX0lNQUdFX0RJUikvbWFuL2phL21hbjEvJTogJChNQU5fU1JDX0RJUikvJChNQU4xX1NVQkRJUikvamEvJQorCQkkKEVDSE8pICQoTE9HX0lORk8pIENvbnZlcnRpbmcgJChwYXRzdWJzdCAkKE9VVFBVVF9ST09UKS8lLCUsJEApCisJCSQoaW5zdGFsbC1maWxlKQorICAgIGVuZGlmCiAKLSMgT2xkIGJ1aWxkIGNyZWF0ZXMgZW1wdHkgbWFuIHBhZ2UgZm9yIHRoaXMsIG1pbWljaW5nIGJlaGF2aW91ci4KLSQoSkRLX0lNQUdFX0RJUikvbWFuL2phX0pQLlVURi04L21hbjEvamNtZC4xICQoSkRLX0lNQUdFX0RJUikvbWFuL2phX0pQLlBDSy9tYW4xL2pjbWQuMSAkKEpES19JTUFHRV9ESVIpL21hbi9qYS9tYW4xL2pjbWQuMToKLQkkKEVDSE8pIENyZWF0aW5nIGR1bW15ICQocGF0c3Vic3QgJChPVVRQVVRfUk9PVCkvJSwlLCRAKQorICAgICMgT2xkIGJ1aWxkIGNyZWF0ZXMgZW1wdHkgbWFuIHBhZ2UgZm9yIHRoaXMsIG1pbWljaW5nIGJlaGF2aW91ci4KKyAgICAkKEpES19JTUFHRV9ESVIpL21hbi9qYV9KUC5VVEYtOC9tYW4xL2pjbWQuMSAkKEpES19JTUFHRV9ESVIpL21hbi9qYV9KUC5QQ0svbWFuMS9qY21kLjEgJChKREtfSU1BR0VfRElSKS9tYW4vamEvbWFuMS9qY21kLjE6CisJJChFQ0hPKSAkKExPR19JTkZPKSBDcmVhdGluZyBkdW1teSAkKHBhdHN1YnN0ICQoT1VUUFVUX1JPT1QpLyUsJSwkQCkKIAkkKE1LRElSKSAtcCAkKEBEKQogCSQoVE9VQ0gpICRACiAKLWlmZXEgKCQoT1BFTkpES19UQVJHRVRfT1MpLCBsaW51eCkKLSAgICAkKEpSRV9JTUFHRV9ESVIpL21hbi9qYToKLQkkKEVDSE8pIENyZWF0aW5nICQocGF0c3Vic3QgJChPVVRQVVRfUk9PVCkvJSwlLCRAKQotCSQoQ0QpICQoQEQpICYmICQoUk0pIGphICYmICQoTE4pIC1zIGphX0pQLlVURi04IGphCisgICAgaWZlcSAoJChPUEVOSkRLX1RBUkdFVF9PUyksIGxpbnV4KQorICAgICAgICAkKEpSRV9JTUFHRV9ESVIpL21hbi9qYToKKwkJJChFQ0hPKSAkKExPR19JTkZPKSBDcmVhdGluZyAkKHBhdHN1YnN0ICQoT1VUUFVUX1JPT1QpLyUsJSwkQCkKKwkJJChDRCkgJChARCkgJiYgJChSTSkgamEgJiYgJChMTikgLXMgamFfSlAuVVRGLTggamEKIAotICAgICQoSkRLX0lNQUdFX0RJUikvbWFuL2phOgotCSQoRUNITykgQ3JlYXRpbmcgJChwYXRzdWJzdCAkKE9VVFBVVF9ST09UKS8lLCUsJEApCi0JJChDRCkgJChARCkgJiYgJChSTSkgamEgJiYgJChMTikgLXMgamFfSlAuVVRGLTggamEKLWVuZGlmCisgICAgICAgICQoSkRLX0lNQUdFX0RJUikvbWFuL2phOgorCQkkKEVDSE8pICQoTE9HX0lORk8pIENyZWF0aW5nICQocGF0c3Vic3QgJChPVVRQVVRfUk9PVCkvJSwlLCRAKQorCQkkKENEKSAkKEBEKSAmJiAkKFJNKSBqYSAmJiAkKExOKSAtcyBqYV9KUC5VVEYtOCBqYQorICAgIGVuZGlmCiAKLWlmZXEgKCQoT1BFTkpES19UQVJHRVRfT1MpLCBtYWNvc3gpCi0gICAgJChKUkVfSU1BR0VfRElSKS9tYW4vamE6Ci0JJChFQ0hPKSBDcmVhdGluZyAkKHBhdHN1YnN0ICQoT1VUUFVUX1JPT1QpLyUsJSwkQCkKLQkkKENEKSAkKEBEKSAmJiAkKFJNKSBqYSAmJiAkKExOKSAtcyBqYV9KUC5VVEYtOCBqYQorICAgIGlmZXEgKCQoT1BFTkpES19UQVJHRVRfT1MpLCBtYWNvc3gpCisgICAgICAgICQoSlJFX0lNQUdFX0RJUikvbWFuL2phOgorCQkkKEVDSE8pICQoTE9HX0lORk8pIENyZWF0aW5nICQocGF0c3Vic3QgJChPVVRQVVRfUk9PVCkvJSwlLCRAKQorCQkkKENEKSAkKEBEKSAmJiAkKFJNKSBqYSAmJiAkKExOKSAtcyBqYV9KUC5VVEYtOCBqYQogCi0gICAgJChKREtfSU1BR0VfRElSKS9tYW4vamE6Ci0JJChFQ0hPKSBDcmVhdGluZyAkKHBhdHN1YnN0ICQoT1VUUFVUX1JPT1QpLyUsJSwkQCkKLQkkKENEKSAkKEBEKSAmJiAkKFJNKSBqYSAmJiAkKExOKSAtcyBqYV9KUC5VVEYtOCBqYQotZW5kaWYKKyAgICAgICAgJChKREtfSU1BR0VfRElSKS9tYW4vamE6CisJCSQoRUNITykgJChMT0dfSU5GTykgQ3JlYXRpbmcgJChwYXRzdWJzdCAkKE9VVFBVVF9ST09UKS8lLCUsJEApCisJCSQoQ0QpICQoQEQpICYmICQoUk0pIGphICYmICQoTE4pIC1zIGphX0pQLlVURi04IGphCisgICAgZW5kaWYKIAotaWZlcSAoJChPUEVOSkRLX1RBUkdFVF9PUyksIGxpbnV4KQotICAgIEpSRV9NQU5fUEFHRV9MSVNUIDo9ICQoYWRkcHJlZml4ICQoSlJFX0lNQUdFX0RJUikvbWFuL21hbjEvLCQoSlJFX01BTl9QQUdFUykpIFwKLQkJCSAkKGFkZHByZWZpeCAkKEpSRV9JTUFHRV9ESVIpL21hbi9qYV9KUC5VVEYtOC9tYW4xLywkKEpSRV9NQU5fUEFHRVMpKSBcCi0JCQkgJChKUkVfSU1BR0VfRElSKS9tYW4vamEKKyAgICBpZmVxICgkKE9QRU5KREtfVEFSR0VUX09TKSwgbGludXgpCisgICAgICAgIEpSRV9NQU5fUEFHRV9MSVNUIDo9ICQoYWRkcHJlZml4ICQoSlJFX0lNQUdFX0RJUikvbWFuL21hbjEvLCQoSlJFX01BTl9QQUdFUykpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChhZGRwcmVmaXggJChKUkVfSU1BR0VfRElSKS9tYW4vamFfSlAuVVRGLTgvbWFuMS8sJChKUkVfTUFOX1BBR0VTKSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKEpSRV9JTUFHRV9ESVIpL21hbi9qYQogCi0gICAgSkRLX01BTl9QQUdFX0xJU1QgOj0gJChhZGRwcmVmaXggJChKREtfSU1BR0VfRElSKS9tYW4vbWFuMS8sJChKREtfTUFOX1BBR0VTKSkgXAotCQkJICQoYWRkcHJlZml4ICQoSkRLX0lNQUdFX0RJUikvbWFuL2phX0pQLlVURi04L21hbjEvLCQoSkRLX01BTl9QQUdFUykpIFwKLQkJCSAkKEpES19JTUFHRV9ESVIpL21hbi9qYQotZW5kaWYKKyAgICAgICAgSkRLX01BTl9QQUdFX0xJU1QgOj0gJChhZGRwcmVmaXggJChKREtfSU1BR0VfRElSKS9tYW4vbWFuMS8sJChKREtfTUFOX1BBR0VTKSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGFkZHByZWZpeCAkKEpES19JTUFHRV9ESVIpL21hbi9qYV9KUC5VVEYtOC9tYW4xLywkKEpES19NQU5fUEFHRVMpKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoSkRLX0lNQUdFX0RJUikvbWFuL2phCisgICAgZW5kaWYKIAotaWZlcSAoJChPUEVOSkRLX1RBUkdFVF9PUyksIHNvbGFyaXMpCi0gICAgSlJFX01BTl9QQUdFX0xJU1QgOj0gJChhZGRwcmVmaXggJChKUkVfSU1BR0VfRElSKS9tYW4vbWFuMS8sJChKUkVfTUFOX1BBR0VTKSkgXAotCQkJICQoYWRkcHJlZml4ICQoSlJFX0lNQUdFX0RJUikvbWFuL2phL21hbjEvLCQoSlJFX01BTl9QQUdFUykpIFwKLQkJCSAkKGFkZHByZWZpeCAkKEpSRV9JTUFHRV9ESVIpL21hbi9qYV9KUC5VVEYtOC9tYW4xLywkKEpSRV9NQU5fUEFHRVMpKSBcCi0JCQkgJChhZGRwcmVmaXggJChKUkVfSU1BR0VfRElSKS9tYW4vamFfSlAuUENLL21hbjEvLCQoSlJFX01BTl9QQUdFUykpCisgICAgaWZlcSAoJChPUEVOSkRLX1RBUkdFVF9PUyksIHNvbGFyaXMpCisgICAgICAgIEpSRV9NQU5fUEFHRV9MSVNUIDo9ICQoYWRkcHJlZml4ICQoSlJFX0lNQUdFX0RJUikvbWFuL21hbjEvLCQoSlJFX01BTl9QQUdFUykpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChhZGRwcmVmaXggJChKUkVfSU1BR0VfRElSKS9tYW4vamEvbWFuMS8sJChKUkVfTUFOX1BBR0VTKSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGFkZHByZWZpeCAkKEpSRV9JTUFHRV9ESVIpL21hbi9qYV9KUC5VVEYtOC9tYW4xLywkKEpSRV9NQU5fUEFHRVMpKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoYWRkcHJlZml4ICQoSlJFX0lNQUdFX0RJUikvbWFuL2phX0pQLlBDSy9tYW4xLywkKEpSRV9NQU5fUEFHRVMpKQogCi0gICAgSkRLX01BTl9QQUdFX0xJU1QgOj0gJChhZGRwcmVmaXggJChKREtfSU1BR0VfRElSKS9tYW4vbWFuMS8sJChKREtfTUFOX1BBR0VTKSkgXAotCQkJICQoYWRkcHJlZml4ICQoSkRLX0lNQUdFX0RJUikvbWFuL2phL21hbjEvLCQoSkRLX01BTl9QQUdFUykpIFwKLQkJCSAkKGFkZHByZWZpeCAkKEpES19JTUFHRV9ESVIpL21hbi9qYV9KUC5VVEYtOC9tYW4xLywkKEpES19NQU5fUEFHRVMpKSBcCi0JCQkgJChhZGRwcmVmaXggJChKREtfSU1BR0VfRElSKS9tYW4vamFfSlAuUENLL21hbjEvLCQoSkRLX01BTl9QQUdFUykpCi1lbmRpZgorICAgICAgICBKREtfTUFOX1BBR0VfTElTVCA6PSAkKGFkZHByZWZpeCAkKEpES19JTUFHRV9ESVIpL21hbi9tYW4xLywkKEpES19NQU5fUEFHRVMpKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoYWRkcHJlZml4ICQoSkRLX0lNQUdFX0RJUikvbWFuL2phL21hbjEvLCQoSkRLX01BTl9QQUdFUykpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChhZGRwcmVmaXggJChKREtfSU1BR0VfRElSKS9tYW4vamFfSlAuVVRGLTgvbWFuMS8sJChKREtfTUFOX1BBR0VTKSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGFkZHByZWZpeCAkKEpES19JTUFHRV9ESVIpL21hbi9qYV9KUC5QQ0svbWFuMS8sJChKREtfTUFOX1BBR0VTKSkKKyAgICBlbmRpZgogCi1pZmVxICgkKE9QRU5KREtfVEFSR0VUX09TKSwgbWFjb3N4KQotICAgIEpSRV9NQU5fUEFHRV9MSVNUIDo9ICQoYWRkcHJlZml4ICQoSlJFX0lNQUdFX0RJUikvbWFuL21hbjEvLCQoSlJFX01BTl9QQUdFUykpIFwKLQkJCSAkKGFkZHByZWZpeCAkKEpSRV9JTUFHRV9ESVIpL21hbi9qYV9KUC5VVEYtOC9tYW4xLywkKEpSRV9NQU5fUEFHRVMpKSBcCi0JCQkgJChKUkVfSU1BR0VfRElSKS9tYW4vamEKKyAgICBpZmVxICgkKE9QRU5KREtfVEFSR0VUX09TKSwgbWFjb3N4KQorICAgICAgICBKUkVfTUFOX1BBR0VfTElTVCA6PSAkKGFkZHByZWZpeCAkKEpSRV9JTUFHRV9ESVIpL21hbi9tYW4xLywkKEpSRV9NQU5fUEFHRVMpKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoYWRkcHJlZml4ICQoSlJFX0lNQUdFX0RJUikvbWFuL2phX0pQLlVURi04L21hbjEvLCQoSlJFX01BTl9QQUdFUykpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChKUkVfSU1BR0VfRElSKS9tYW4vamEKIAotICAgIEpES19NQU5fUEFHRV9MSVNUIDo9ICQoYWRkcHJlZml4ICQoSkRLX0lNQUdFX0RJUikvbWFuL21hbjEvLCQoSkRLX01BTl9QQUdFUykpIFwKLQkJCSAkKGFkZHByZWZpeCAkKEpES19JTUFHRV9ESVIpL21hbi9qYV9KUC5VVEYtOC9tYW4xLywkKEpES19NQU5fUEFHRVMpKSBcCi0JCQkgJChKREtfSU1BR0VfRElSKS9tYW4vamEKLWVuZGlmCisgICAgICAgIEpES19NQU5fUEFHRV9MSVNUIDo9ICQoYWRkcHJlZml4ICQoSkRLX0lNQUdFX0RJUikvbWFuL21hbjEvLCQoSkRLX01BTl9QQUdFUykpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChhZGRwcmVmaXggJChKREtfSU1BR0VfRElSKS9tYW4vamFfSlAuVVRGLTgvbWFuMS8sJChKREtfTUFOX1BBR0VTKSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKEpES19JTUFHRV9ESVIpL21hbi9qYQorICAgIGVuZGlmCisKK2VuZGlmICMgV2luZG93cwogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyAvZGVtbyBkaXIKIAotaWZuZGVmIE5PX0RFTU9TCiAjIEZJWE1FOiBkZW1vL2FwcGxldHMvR3JhcGhMYXlvdXQvR3JhcGhQYW5lbCQyLmNsYXNzIGlzIHNvbWV0aW1lcyBub3QgY29waWVkLgogCiAjICAgVGhlIGRiIGRlbW8gY29udGFpbnMgYW4gZW1wdHkgZGlyIHRoYXQgbmVlZHMgdG8gYmUgY29waWVkLiBUaGUgb3RoZXIgCiAjICAgZGlyZWN0b3JpZXMgd2lsbCBhbHdheXMgdHJpZ2dlciB0aGUgcnVsZSBmb3IgcmVjb21waWxlIHNpbmNlIAogIyAgIF90aGUubGlzdF9vZl9wYWNrYWdlcyBmaWxlcyBhcmUgdG91Y2hlZC4KLSAgICAkKEpES19JTUFHRV9ESVIpL2RlbW8vJTogJChKREtfT1VUUFVURElSKS9kZW1vLyUKKyQoSkRLX0lNQUdFX0RJUikvZGVtby8lOiAkKEpES19PVVRQVVRESVIpL2RlbW8vJQogCWlmIFsgISAtZCAiJEAiIF07IHRoZW4gXAotCSAgJChFQ0hPKSBDb3B5aW5nICckKHBhdHN1YnN0ICQoT1VUUFVUX1JPT1QpLyUsJSwkQCknOyBcCisJICAkKEVDSE8pICQoTE9HX0lORk8pIENvcHlpbmcgJyQocGF0c3Vic3QgJChPVVRQVVRfUk9PVCkvJSwlLCRAKSc7IFwKIAkgICQoTUtESVIpIC1wICQoQEQpOyBcCiAJICBpZiBbIC1kICIkPCIgXTsgdGhlbiAkKE1LRElSKSAtcCAkQDsgZWxzZSAkKENQKSAnJDwnICckQCc7IGZpIFwKIAlmaQogCiAjICAgRmluZCBhbGwgZmlsZXMgaW5jbHVkaW5nIGRpcmVjdG9yaWVzCi0gICAgSkRLX0RFTU9fVEFSR0VUUyA6PSAkKHBhdHN1YnN0ICQoSkRLX09VVFBVVERJUikvZGVtby8lLCQoSkRLX0lNQUdFX0RJUikvZGVtby8lLFwKK0pES19ERU1PX1RBUkdFVFMgOj0gJChwYXRzdWJzdCAkKEpES19PVVRQVVRESVIpL2RlbW8vJSwkKEpES19JTUFHRV9ESVIpL2RlbW8vJSxcCiAJCQkkKHNoZWxsICQoRklORCkgJChKREtfT1VUUFVURElSKS9kZW1vICEgXCggLW5hbWUgIl90aGUqIiAtbyAtbmFtZSAiamF2YWNfc3RhdGUiIFwpICkpCiAKIAogCi0gICAgIyBQYXJhbSAxIGlzIHNvdXJjZSBmaWxlCi0gICAgZGVmaW5lIENyZWF0ZU92ZXJsYXlEZW1vUnVsZQotICAgICAgICAkMV9UQVJHRVQ6PSQkKHN1YnN0ICQoSkRLX09VVFBVVERJUiksJChKREtfT1ZFUkxBWV9JTUFHRV9ESVIpLFwKKyMgUGFyYW0gMSBpcyBzb3VyY2UgZmlsZQorZGVmaW5lIENyZWF0ZU92ZXJsYXlEZW1vUnVsZQorICAgICQxX1RBUkdFVDo9JCQoc3Vic3QgJChKREtfT1VUUFVURElSKSwkKEpES19PVkVSTEFZX0lNQUdFX0RJUiksXAogCQkJJCQoZGlyICQxKSQoT1BFTkpES19UQVJHRVRfQ1BVX0lTQURJUikvJCQobm90ZGlyICQxKSkKLSAgICAgICAgJCQoJDFfVEFSR0VUKTogJDEKLQkJJChFQ0hPKSBDb3B5aW5nICckJChwYXRzdWJzdCAkKE9VVFBVVF9ST09UKS8lLCUsJCRAKScKLQkJJChNS0RJUikgLXAgJCQoQEQpCi0JCSQoUk0pICQkQAotCQkkKENQKSAtZiAnJCQ8JyAnJCRAJworICAgICQkKCQxX1RBUkdFVCk6ICQxCisJCSQoRUNITykgJChMT0dfSU5GTykgQ29weWluZyAnJCQocGF0c3Vic3QgJChPVVRQVVRfUk9PVCkvJSwlLCQkQCknCisJCSQkKGNhbGwgaW5zdGFsbC1maWxlKQogCi0gICAgICAgIEpES19PVkVSTEFZX0RFTU9fVEFSR0VUUyArPSAkJCgkMV9UQVJHRVQpCi0gICAgZW5kZWYKLSAgICBKREtfT1ZFUkxBWV9ERU1PX1NPVVJDRVMgOj0gJChzaGVsbCAkKEZJTkQpICQoSkRLX09VVFBVVERJUikvZGVtbyAtbmFtZSAiKiQoU0hBUkVEX0xJQlJBUllfU1VGRklYKSIpCi0gICAgJChmb3JlYWNoIGxpYiwkKEpES19PVkVSTEFZX0RFTU9fU09VUkNFUyksJChldmFsICQoY2FsbCBDcmVhdGVPdmVybGF5RGVtb1J1bGUsJChsaWIpKSkpCi0KLWVuZGlmCisgICAgSkRLX09WRVJMQVlfREVNT19UQVJHRVRTICs9ICQkKCQxX1RBUkdFVCkKK2VuZGVmCitKREtfT1ZFUkxBWV9ERU1PX1NPVVJDRVMgOj0gJChzaGVsbCAkKEZJTkQpICQoSkRLX09VVFBVVERJUikvZGVtbyAtbmFtZSAiKiQoU0hBUkVEX0xJQlJBUllfU1VGRklYKSIpCiskKGZvcmVhY2ggbGliLCQoSkRLX09WRVJMQVlfREVNT19TT1VSQ0VTKSwkKGV2YWwgJChjYWxsIENyZWF0ZU92ZXJsYXlEZW1vUnVsZSwkKGxpYikpKSkKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMgL3NhbXBsZSBkaXIKIAotaWZuZGVmIE5PX1NBTVBMRVMKLSAgICAkKEpES19JTUFHRV9ESVIpL3NhbXBsZS8lOiAkKEpES19PVVRQVVRESVIpL3NhbXBsZS8lCi0JJChFQ0hPKSBDb3B5aW5nICckKHBhdHN1YnN0ICQoT1VUUFVUX1JPT1QpLyUsJSwkQCknCi0JJChpbnN0YWxsLWZpbGUpCi0KLSAgICBKREtfU0FNUExFX1RBUkdFVFMgOj0gJChwYXRzdWJzdCAkKEpES19PVVRQVVRESVIpL3NhbXBsZS8lLCQoSkRLX0lNQUdFX0RJUikvc2FtcGxlLyUsXAotCQkJJChzaGVsbCAkKEZJTkQpICQoSkRLX09VVFBVVERJUikvc2FtcGxlIC10eXBlIGYpKQotCi1lbmRpZgorJChmb3JlYWNoIGYsJChzaGVsbCAkKEZJTkQpICQoSkRLX09VVFBVVERJUikvc2FtcGxlIC10eXBlIGYpLFwKKyAgICAkKGV2YWwgJChjYWxsIEFkZEZpbGVUb0NvcHksJChKREtfT1VUUFVURElSKSwkKEpES19JTUFHRV9ESVIpLCRmLEpES19TQU1QTEVfVEFSR0VUUykpKQogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyAvZGIgZGlyCkBAIC01MzQsMTQgKzUwOCwxMyBAQAogICAgICQoSU1BR0VTX09VVFBVVERJUikvX3VuemlwLyUudW56aXBwZWQ6ICQoSkRLX1RPUERJUikvc3JjL2Nsb3NlZC9zaGFyZS9kYi8lCiAJJChFQ0hPKSBVbnppcHBpbmcgJChwYXRzdWJzdCAkKFNSQ19ST09UKS8lLCUsJDwpCiAJJChNS0RJUikgLXAgJChKREtfSU1BR0VfRElSKS9kYgotCWNkICQoSkRLX0lNQUdFX0RJUikvZGIgJiYgJChVTlpJUCkgLW8gJDwgLXggaW5kZXguaHRtbCAyPiAvZGV2L251bGwKKwljZCAkKEpES19JTUFHRV9ESVIpL2RiICYmICQoVU5aSVApIC1xIC1vICQ8IC14IGluZGV4Lmh0bWwgMj4gL2Rldi9udWxsCiAJJChNS0RJUikgLXAgJChARCkKIAkkKFRPVUNIKSAkQAogCiAgICAgJChKREtfSU1BR0VfRElSKS9kYi9SRUFETUUtSkRLLmh0bWw6ICQoSkRLX1RPUERJUikvc3JjL2Nsb3NlZC9zaGFyZS9kYi9SRUFETUUtSkRLLmh0bWwKLQkkKEVDSE8pIENvcHlpbmcgJyQocGF0c3Vic3QgJChPVVRQVVRfUk9PVCkvJSwlLCRAKScKKwkkKEVDSE8pICQoTE9HX0lORk8pIENvcHlpbmcgJyQocGF0c3Vic3QgJChPVVRQVVRfUk9PVCkvJSwlLCRAKScKIAkkKGluc3RhbGwtZmlsZSkKLQkkKENITU9EKSA2NDQgJChAKQogCiAgICAgSkRLX0RCX1RBUkdFVFMgOj0gJChwYXRzdWJzdCAkKEpES19UT1BESVIpL3NyYy9jbG9zZWQvc2hhcmUvZGIvJSwkKElNQUdFU19PVVRQVVRESVIpL191bnppcC8lLnVuemlwcGVkLFwKIAkJCSQoc2hlbGwgJChGSU5EKSAkKEpES19UT1BESVIpL3NyYy9jbG9zZWQvc2hhcmUvZGIgLW5hbWUgIiouemlwIiAhIC1uYW1lICIqZGVtbyoiKSkgXApAQCAtNTUyLDEyICs1MjUsOCBAQAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMgL2luY2x1ZGUgZGlyCiAKLSQoSkRLX0lNQUdFX0RJUikvaW5jbHVkZS8lOiAkKEpES19PVVRQVVRESVIpL2luY2x1ZGUvJQotCSQoRUNITykgQ29weWluZyAnJChwYXRzdWJzdCAkKE9VVFBVVF9ST09UKS8lLCUsJEApJwotCSQoaW5zdGFsbC1maWxlKQotCi0gICAgSkRLX0lOQ0xVREVfVEFSR0VUUyA6PSAkKHBhdHN1YnN0ICQoSkRLX09VVFBVVERJUikvaW5jbHVkZS8lLCQoSkRLX0lNQUdFX0RJUikvaW5jbHVkZS8lLFwKLQkJCSQoc2hlbGwgJChGSU5EKSAkKEpES19PVVRQVVRESVIpL2luY2x1ZGUgLXR5cGUgZikpCiskKGZvcmVhY2ggZiwkKHNoZWxsICQoRklORCkgJChKREtfT1VUUFVURElSKS9pbmNsdWRlIC10eXBlIGYpLFwKKyAgICAkKGV2YWwgJChjYWxsIEFkZEZpbGVUb0NvcHksJChKREtfT1VUUFVURElSKSwkKEpES19JTUFHRV9ESVIpLCRmLEpES19JTkNMVURFX1RBUkdFVFMpKSkKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMgZG9jIGZpbGVzCkBAIC01NzUsMTIgKzU0NCw3IEBACiAgICAgZWxzZQogICAgICAgICBKUkVfRE9DX0ZJTEVTICs9IFJFQURNRQogICAgIGVuZGlmCi0gICAgaWZuZGVmIE5PX0RFTU9TCi0gICAgICAgIEpES19ET0NfRklMRVMgKz0gZGVtby9ERU1PU19MSUNFTlNFCi0gICAgZW5kaWYKLSAgICBpZm5kZWYgTk9fU0FNUExFUwotICAgICAgICBKREtfRE9DX0ZJTEVTICs9IHNhbXBsZS9TQU1QTEVTX0xJQ0VOU0UKLSAgICBlbmRpZgorICAgIEpES19ET0NfRklMRVMgKz0gZGVtby9ERU1PU19MSUNFTlNFIHNhbXBsZS9TQU1QTEVTX0xJQ0VOU0UKICAgICBKUkVfRE9DX0xPQ0FUSU9OIDo9ICQoSkRLX1RPUERJUikvc3JjL2Nsb3NlZC9zaGFyZS9kb2MvanJlCiAgICAgSkRLX0RPQ19MT0NBVElPTiA6PSAkKEpES19UT1BESVIpL3NyYy9jbG9zZWQvc2hhcmUvZG9jL2pkawogZW5kaWYKQEAgLTYzNiwyMyArNjAwLDIzIEBACiAgIGZpKQogCiAkKEpSRV9JTkZPX0ZJTEUpOiAkKE9VVFBVVF9ST09UKS9zcGVjLmdtayAkKE9VVFBVVF9ST09UKS9zb3VyY2VfdGlwcwotCSQoRUNITykgR2VuZXJhdGluZyAkKHBhdHN1YnN0ICQoT1VUUFVUX1JPT1QpLyUsJSwkQCkKKwkkKEVDSE8pICQoTE9HX0lORk8pIEdlbmVyYXRpbmcgJChwYXRzdWJzdCAkKE9VVFBVVF9ST09UKS8lLCUsJEApCiAJJChjYWxsIGNyZWF0ZS1pbmZvLWZpbGUpCiAKICQoSkRLX0lORk9fRklMRSk6ICQoT1VUUFVUX1JPT1QpL3NwZWMuZ21rICQoT1VUUFVUX1JPT1QpL3NvdXJjZV90aXBzCi0JJChFQ0hPKSBHZW5lcmF0aW5nICQocGF0c3Vic3QgJChPVVRQVVRfUk9PVCkvJSwlLCRAKQorCSQoRUNITykgJChMT0dfSU5GTykgR2VuZXJhdGluZyAkKHBhdHN1YnN0ICQoT1VUUFVUX1JPT1QpLyUsJSwkQCkKIAkkKGNhbGwgY3JlYXRlLWluZm8tZmlsZSkKIAogJChKUkVfT1ZFUkxBWV9JTkZPX0ZJTEUpOiAkKE9VVFBVVF9ST09UKS9zcGVjLmdtayAkKE9VVFBVVF9ST09UKS9zb3VyY2VfdGlwcwotCSQoRUNITykgR2VuZXJhdGluZyAkKHBhdHN1YnN0ICQoT1VUUFVUX1JPT1QpLyUsJSwkQCkKKwkkKEVDSE8pICQoTE9HX0lORk8pIEdlbmVyYXRpbmcgJChwYXRzdWJzdCAkKE9VVFBVVF9ST09UKS8lLCUsJEApCiAJJChjYWxsIGNyZWF0ZS1pbmZvLWZpbGUpCiAKICQoSkRLX09WRVJMQVlfSU5GT19GSUxFKTogJChPVVRQVVRfUk9PVCkvc3BlYy5nbWsgJChPVVRQVVRfUk9PVCkvc291cmNlX3RpcHMKLQkkKEVDSE8pIEdlbmVyYXRpbmcgJChwYXRzdWJzdCAkKE9VVFBVVF9ST09UKS8lLCUsJEApCisJJChFQ0hPKSAkKExPR19JTkZPKSBHZW5lcmF0aW5nICQocGF0c3Vic3QgJChPVVRQVVRfUk9PVCkvJSwlLCRAKQogCSQoY2FsbCBjcmVhdGUtaW5mby1maWxlKQogCiAkKEpES19JTUFHRV9ESVIpL3NyYy56aXA6ICQoSU1BR0VTX09VVFBVVERJUikvc3JjLnppcAotCSQoRUNITykgQ29weWluZyAkKHBhdHN1YnN0ICQoT1VUUFVUX1JPT1QpLyUsJSwkQCkKKwkkKEVDSE8pICQoTE9HX0lORk8pIENvcHlpbmcgJChwYXRzdWJzdCAkKE9VVFBVVF9ST09UKS8lLCUsJEApCiAJJChpbnN0YWxsLWZpbGUpCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCkBAIC02NjEsNyArNjI1LDcgQEAKIGlmbmVxICgkKFBPU1RfU1RSSVBfQ01EKSwpCiAgICAgaWZlcSAoJChPUEVOSkRLX1RBUkdFVF9PUyksIHdpbmRvd3MpCiAgICAgICAgIEVYRUNfTElTVF9CSU46PSQoc2hlbGwgJChGSU5EKSAkKEpES19PVVRQVVRESVIpL2JpbiAtdHlwZSBmIC1uYW1lIFwqLmV4ZSBcCi0JCS1vIC1uYW1lIFwqLmRsbCB8ICQoRUdSRVApIC12IC1pICIkKE1TVkNSTk5fRExMKSIpCisJCS1vIC1uYW1lIFwqLmRsbCB8ICQoRUdSRVApIC12IC1pICIkKE1TVkNSX0RMTCkiKQogICAgIGVsc2UKICAgICAgICAgIyBGaW5kIGFsbCBleGVjdXRhYmxlcyBpbiBKREtfT1VUUFVURElSIHNpbmNlIHRoZXkgZXhpc3Qgd2hlbiB0aGlzIG1ha2VmaWxlIGlzIHBhcnNlZAogICAgICAgICBFWEVDX0xJU1RfQklOOj0kKHNoZWxsICQoRklMRSkgYCQoRklORCkgJChKREtfT1VUUFVURElSKS9iaW4gLXR5cGUgZiAtbmFtZSBcKiQoRVhFX1NVRkZJWClgIFwKQEAgLTY3Miw2ICs2MzYsOCBAQAogICAgICAgICAgICAgRVhFQ19MSVNUX0xJQjo9JChzaGVsbCAkKEZJTkQpICQoSkRLX09VVFBVVERJUikvbGliIC10eXBlIGYgLW5hbWUgXCokKFNIQVJFRF9MSUJSQVJZX1NVRkZJWCkpCiAJZW5kaWYKICAgICBlbmRpZgorICAgICMgRmlsdGVyIG91dCBzamF2YWMKKyAgICBFWEVDX0xJU1RfQklOOj0kKGZpbHRlci1vdXQgJXNqYXZhYyQoRVhFX1NVRkZJWCksJChFWEVDX0xJU1RfQklOKSkKIAogICAgICMgRmlsdGVyIG91dCB0aGUgb3ZlcmxheSBzcGVjaWZpYyBiaW4gZmlsZXMKICAgICBFWEVDX0xJU1Q6PSQoZmlsdGVyLW91dCAkKE9WRVJMQVlfRklMVEVSKSwkKEVYRUNfTElTVF9CSU4pKSAkKEVYRUNfTElTVF9MSUIpCkBAIC03MDgsNyArNjc0LDcgQEAKICAgICBlbmRlZgogCiAgICAgZGVmaW5lIHN0cmlwLWZpbGUKLQkkKEVDSE8pIFN0cmlwcGluZyAkKHBhdHN1YnN0ICQoT1VUUFVUX1JPT1QpLyUsJSwkPCkKKwkkKEVDSE8pIFN0cmlwcGluZyAkKExPR19JTkZPKSAkKHBhdHN1YnN0ICQoT1VUUFVUX1JPT1QpLyUsJSwkPCkKIAkkKENITU9EKSB1K3cgJDwKIAkkKFBPU1RfU1RSSVBfQ01EKSAkPAogCSQoY2FsbCBtY3MtZmlsZSkKZGlmZiAtLWdpdCBhL2pkay9tYWtlZmlsZXMvSW1wb3J0LmdtayBiL2pkay9tYWtlZmlsZXMvSW1wb3J0LmdtawppbmRleCA0YzA3MzA3Li43NjI3MmRhIDEwMDY0NAotLS0gYS9qZGsvbWFrZWZpbGVzL0ltcG9ydC5nbWsKKysrIGIvamRrL21ha2VmaWxlcy9JbXBvcnQuZ21rCkBAIC0xMjUsNyArMTI1LDcgQEAKICAgICAgICAgJDFfRFNUX0ZJTEVTIDo9ICQkKHBhdHN1YnN0ICQyLyUsJDMvJSwkJCgkMV9TUkNfRklMRVMpKQogICAgICAgICBJTVBPUlRfVEFSR0VUX0ZJTEVTICs9ICQkKCQxX0RTVF9GSUxFUykKICQzLyUgOiAkMi8lCi0JJChFQ0hPKSBDb3B5aW5nICQkKEBGKQorCSQoRUNITykgJChMT0dfSU5GTykgQ29weWluZyAkJChARikKIAkkKGRvLWluc3RhbGwtZmlsZSkKIGVuZGVmCiAKQEAgLTIzNCwxOSArMjM0LDE0IEBACiAKIElNUE9SVF9UQVJHRVRfRklMRVMgKz0gXAogICAgICAgICAgICAgJChKREtfT1VUUFVURElSKS9saWIvc2VjdXJpdHkvVVNfZXhwb3J0X3BvbGljeS5qYXIgXAotICAgICAgICAgICAgJChKREtfT1VUUFVURElSKS9saWIvc2VjdXJpdHkvbG9jYWxfcG9saWN5LmphciBcCi0gICAgICAgICAgICAkKEpES19PVVRQVVRESVIpL2xpYi9qY2UuamFyCi0KLSQoSkRLX09VVFBVVERJUikvbGliL2pjZS5qYXIgOiAkKEpES19UT1BESVIpL21ha2UvY2xvc2VkL3Rvb2xzL2NyeXB0by9qY2UvamNlLmphcgotCSQoRUNITykgQ29weWluZyAkKEBGKQotCSQoaW5zdGFsbC1maWxlKQorICAgICAgICAgICAgJChKREtfT1VUUFVURElSKS9saWIvc2VjdXJpdHkvbG9jYWxfcG9saWN5LmphcgogCiAkKEpES19PVVRQVVRESVIpL2xpYi9zZWN1cml0eS9sb2NhbF9wb2xpY3kuamFyOiAkKEpES19UT1BESVIpL21ha2UvY2xvc2VkL3Rvb2xzL2NyeXB0by9qY2UvbG9jYWxfcG9saWN5LmphcgotCSQoRUNITykgQ29weWluZyAkKEBGKQorCSQoRUNITykgJChMT0dfSU5GTykgQ29weWluZyAkKEBGKQogCSQoaW5zdGFsbC1maWxlKQogCiAkKEpES19PVVRQVVRESVIpL2xpYi9zZWN1cml0eS9VU19leHBvcnRfcG9saWN5LmphcjogJChKREtfVE9QRElSKS9tYWtlL2Nsb3NlZC90b29scy9jcnlwdG8vamNlL1VTX2V4cG9ydF9wb2xpY3kuamFyCi0JJChFQ0hPKSBDb3B5aW5nICQoQEYpCisJJChFQ0hPKSAkKExPR19JTkZPKSBDb3B5aW5nICQoQEYpCiAJJChpbnN0YWxsLWZpbGUpCiAKIGVuZGlmICMgT1BFTkpESwpkaWZmIC0tZ2l0IGEvamRrL21ha2VmaWxlcy9NYWtlZmlsZSBiL2pkay9tYWtlZmlsZXMvTWFrZWZpbGUKaW5kZXggMDYwYTQ4My4uOTUzOWZlMCAxMDA2NDQKLS0tIGEvamRrL21ha2VmaWxlcy9NYWtlZmlsZQorKysgYi9qZGsvbWFrZWZpbGVzL01ha2VmaWxlCkBAIC0xLDUgKzEsNSBAQAogIwotIyBDb3B5cmlnaHQgKGMpIDE5OTUsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIENvcHlyaWdodCAoYykgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICMgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogIwogIyBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjMsMTAyICsyMywyNyBAQAogIyBxdWVzdGlvbnMuCiAjCiAKLSMgVGhpcyBtdXN0IGJlIHRoZSBmaXJzdCBydWxlCi1kZWZhdWx0OiBhbGwKKyMgTG9jYXRlIHRoaXMgTWFrZWZpbGUKK2lmZXEgKCQoZmlsdGVyIC8lLCQobGFzdHdvcmQgJChNQUtFRklMRV9MSVNUKSkpLCkKKyAgICBtYWtlZmlsZV9wYXRoOj0kKENVUkRJUikvJChsYXN0d29yZCAkKE1BS0VGSUxFX0xJU1QpKQorZWxzZQorICAgIG1ha2VmaWxlX3BhdGg6PSQobGFzdHdvcmQgJChNQUtFRklMRV9MSVNUKSkKK2VuZGlmCityZXBvX2Rpcjo9JChwYXRzdWJzdCAlL21ha2VmaWxlcy9NYWtlZmlsZSwlLCQobWFrZWZpbGVfcGF0aCkpCiAKLSMgSW5jbHVzaW9uIG9mIHRoaXMgcHNldWRvLXRhcmdldCB3aWxsIGNhdXNlIG1ha2UgdG8gZXhlY3V0ZSB0aGlzIGZpbGUKLSMgc2VyaWFsbHksIHJlZ2FyZGxlc3Mgb2YgLWouIFJlY3Vyc2l2ZWx5IGNhbGxlZCBtYWtlZmlsZXMgd2lsbCBub3QgYmUKLSMgYWZmZWN0ZWQsIGhvd2V2ZXIuIFRoaXMgaXMgcmVxdWlyZWQgZm9yIGNvcnJlY3QgZGVwZW5kZW5jeSBtYW5hZ2VtZW50LgotLk5PVFBBUkFMTEVMOgorIyBXaGF0IGlzIHRoZSBuYW1lIG9mIHRoaXMgc3Vic3lzdGVtIChsYW5ndG9vbHMsIGNvcmJhLCBldGMpPworc3Vic3lzdGVtX25hbWU6PSQobm90ZGlyICQocmVwb19kaXIpKQogCi1pbmNsdWRlICQoU1BFQykKLWluY2x1ZGUgTWFrZUJhc2UuZ21rCi1pbmNsdWRlIEphdmFDb21waWxhdGlvbi5nbWsKLWluY2x1ZGUgTmF0aXZlQ29tcGlsYXRpb24uZ21rCi0KLSMgU2V0dXAgdGhlIGphdmEgY29tcGlsZXJzIGZvciB0aGUgSkRLIGJ1aWxkLgotaW5jbHVkZSBTZXR1cC5nbWsKLQotIyBTZXR1cCB0aGUgYnVpbGQgdG9vbHMuCi1pbmNsdWRlIFRvb2xzLmdtawotCi1pbXBvcnQ6ICQoQlVJTERfVE9PTFMpIGltcG9ydC1vbmx5Ci1pbXBvcnQtb25seToKLSMgICAgICAgSW1wb3J0IChjb3JiYSBqYXhwIGpheHdzIGxhbmd0b29scyBob3RzcG90KQotCSskKE1BS0UpIC1mIEltcG9ydC5nbWsKLQotZ2Vuc3JjOiBpbXBvcnQgZ2Vuc3JjLW9ubHkKLWdlbnNyYy1vbmx5OgotCSskKE1BS0UpIC1mIEdlbmVyYXRlSmF2YVNvdXJjZXMuZ21rCi0jICAgICAgIE9rLCBub3cgZ2Vuc3JjIGlzIGZ1bGx5IHBvcHVsYXRlZC4KLQotZ2VuZGF0YTogZ2Vuc3JjIGdlbmRhdGEtb25seQotZ2VuZGF0YS1vbmx5OgotCSskKE1BS0UpIC1mIEdlbmVyYXRlRGF0YS5nbWsKLQotY2xhc3NlczogZ2VuZGF0YSBjbGFzc2VzLW9ubHkKLWNsYXNzZXMtb25seToKLQkrJChNQUtFKSAtZiBDb21waWxlSmF2YUNsYXNzZXMuZ21rCi0jICAgICAgIFRoZSBjbGFzc2VzIGFyZSBub3cgYnVpbHQgYW5kCi0jICAgICAgIGFueSBqYXZhaCBmaWxlcyBoYXZlIG5vdyBiZWVuIGdlbmVyYXRlZC4KLQotbGliczogY2xhc3NlcyBsaWJzLW9ubHkKLWxpYnMtb25seToKLQkrJChNQUtFKSAtZiBDb21waWxlTmF0aXZlTGlicmFyaWVzLmdtawotCi1sYXVuY2hlcnM6IGxpYnMgbGF1bmNoZXJzLW9ubHkKLWxhdW5jaGVycy1vbmx5OgotIyAgICAgICBGaW5hbGx5IGNvbXBpbGUgdGhlIGxhdW5jaGVycy4KLQkrJChNQUtFKSAtZiBDb21waWxlTGF1bmNoZXJzLmdtawotCi1nZW5jbGFzc2VzOiBsYXVuY2hlcnMgZ2VuY2xhc3Nlcy1vbmx5Ci1nZW5jbGFzc2VzLW9ubHk6Ci0jCUdlbmVyYXRlIGNsYXNzZXMgdGhhdCBoYXZlIG90aGVyIHNvdXJjZXMuIE5lZWRzCi0jICAgICAgIHRvIGV4ZWN1dGUgbGF1bmNoZXJzLgotCSskKE1BS0UpIC1mIEdlbmVyYXRlQ2xhc3Nlcy5nbWsKLQotZGVtb3M6IGdlbmNsYXNzZXMgZGVtb3Mtb25seQotZGVtb3Mtb25seToKLSMgICAgICAgTm93IHdlIGhhdmUgYSBjb21wbGV0ZSBqZGssIHdoaWNoIHlvdSBjYW4gcnVuLgotIyAgICAgICBJdCBpcyBub3QgeWV0IHdyYXBwZWQgdXAgYXMgYW4gaW5zdGFsbGVkIGltYWdlLgotIyAgICAgICBUaGUgZGVtb3MgYXJlIGNvbXBpbGVkIGFnYWluc3QgdGhpcyBqZGsuCi1pZm5kZWYgTk9fREVNT1MKLQkrJChNQUtFKSAtZiBDb21waWxlRGVtb3MuZ21rCisjIFRyeSB0byBsb2NhdGUgdG9wLWxldmVsIG1ha2VmaWxlCit0b3BfbGV2ZWxfbWFrZWZpbGU6PSQocmVwb19kaXIpLy4uL2NvbW1vbi9tYWtlZmlsZXMvTWFrZWZpbGUKK2lmbmVxICgkKHdpbGRjYXJkICQodG9wX2xldmVsX21ha2VmaWxlKSksKQorICAkKGluZm8gV2lsbCBydW4gJChzdWJzeXN0ZW1fbmFtZSkgdGFyZ2V0IG9uIHRvcC1sZXZlbCBNYWtlZmlsZSkKKyAgJChpbmZvIFdBUk5JTkc6IFRoaXMgaXMgYSBub24tcmVjb21tZW5kZWQgd2F5IG9mIGJ1aWxkaW5nISkKKyAgJChpbmZvID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSkKK2Vsc2UKKyAgJChpbmZvIENhbm5vdCBsb2NhdGUgdG9wLWxldmVsIE1ha2VmaWxlLiBJcyB0aGlzIHJlcG8gbm90IGNoZWNrZWQgb3V0IGFzIHBhcnQgb2YgYSBjb21wbGV0ZSBmb3Jlc3Q/KQorICAkKGVycm9yIEJ1aWxkIGZyb20gdG9wLWxldmVsIE1ha2VmaWxlIGluc3RlYWQpCiBlbmRpZgogCi1zYW1wbGVzOiBkZW1vcyBzYW1wbGVzLW9ubHkKLXNhbXBsZXMtb25seToKLSMJTm93IGNvcHkgdGhlIHNhbXBsZSBzb3VyY2VzIGludG8gdGhlIGpkay4KLWlmbmRlZiBOT19TQU1QTEVTCi0JKyQoTUFLRSkgLWYgQ29weVNhbXBsZXMuZ21rCi1lbmRpZgotCi0jIFRoZSBhbGwgdGFyZ2V0IGJ1aWxkcyB0aGUgSkRLLCBidXQgbm90IHRoZSBpbWFnZXMKLWFsbDogaW1wb3J0IGdlbnNyYyBnZW5kYXRhIGNsYXNzZXMgbGlicyBsYXVuY2hlcnMgZ2VuY2xhc3NlcyBkZW1vcyBzYW1wbGVzCi0KLS5QSE9OWTogYWxsIGltYWdlcyBpbnN0YWxsIG92ZXJsYXktaW1hZ2VzIGltcG9ydC1vbmx5IGdlbnNyYy1vbmx5IGdlbmRhdGEtb25seSBjbGFzc2VzLW9ubHkgCi0uUEhPTlk6IGxpYnMtb25seSBsYXVuY2hlcnMtb25seSBnZW5jbGFzc2VzLW9ubHkgZGVtb3Mtb25seSBzYW1wbGVzLW9ubHkKLQotIyBDcmVhdGUgdGhlIGZpbmFsIGpkayBhbmQganJlIGltYWdlcywgdG8gYmUgd3JhcHBlZCB1cAotIyBpbnRvIHBhY2thZ2VzLCBvciBpbnN0YWxsZWQuCi1pbWFnZXM6Ci0JKyQoTUFLRSkgLWYgQ3JlYXRlSmFycy5nbWsKLQkrJChNQUtFKSAtZiBJbWFnZXMuZ21rIAotCi1vdmVybGF5LWltYWdlczoKLQkrJChNQUtFKSAtZiBDb21waWxlTGF1bmNoZXJzLmdtayBPVkVSTEFZX0lNQUdFUz10cnVlCi0JKyQoTUFLRSkgLWYgSW1hZ2VzLmdtayBvdmVybGF5LWltYWdlcwotCi1CSU5BUklFUzo9JChzaGVsbCBpZiB0ZXN0IC1kICQoSU1BR0VTX09VVFBVVERJUikvajJzZGstaW1hZ2UvYmluOyB0aGVuIGNkICQoSU1BR0VTX09VVFBVVERJUikvajJzZGstaW1hZ2UvYmluICYmICQoTFMpIDsgZmkpCi1JTlNUQUxMRElSOj1vcGVuamRrLSQoUkVMRUFTRSkKLQotIyBJbnN0YWxsIHRoZSBqZGsgaW1hZ2UsIGluIGEgdmVyeSBjcnVkZSB3YXkuIE5vdCB0YWtpbmcgaW50bwotIyBhY2NvdW50LCBob3cgdG8gaW5zdGFsbCBwcm9wZXJseSBvbiBtYWNvc3ggb3Igd2luZG93cyBldGMuCi1pbnN0YWxsOiBpbWFnZXMKLQllY2hvIEluc3RhbGxpbmcgamRrIGltYWdlIGludG8gJChJTlNUQUxMX1BSRUZJWCkvanZtLyQoSU5TVEFMTERJUikKLQllY2hvIGFuZCBjcmVhdGluZyAkKHdvcmRzICQoQklOQVJJRVMpKSBsaW5rcyBmcm9tICQoSU5TVEFMTF9QUkVGSVgpL2JpbiBpbnRvIHRoZSBqZGsuCi0JJChNS0RJUikgLXAgJChJTlNUQUxMX1BSRUZJWCkvanZtLyQoSU5TVEFMTERJUikKLQkkKFJNKSAtciAkKElOU1RBTExfUFJFRklYKS9qdm0vJChJTlNUQUxMRElSKS8qCi0JJChDUCkgLXJwICQoSU1BR0VTX09VVFBVVERJUikvajJzZGstaW1hZ2UvKiAkKElOU1RBTExfUFJFRklYKS9qdm0vJChJTlNUQUxMRElSKQotCSQoUk0pICQoYWRkcHJlZml4ICQoSU5TVEFMTF9QUkVGSVgpL2Jpbi8sJChCSU5BUklFUykpCi0JJChmb3JlYWNoIGIsJChCSU5BUklFUyksJChMTikgLXMgJChJTlNUQUxMX1BSRUZJWCkvanZtLyQoSU5TVEFMTERJUikvYmluLyRiICQoSU5TVEFMTF9QUkVGSVgpL2Jpbi8kYiAmJikgdHJ1ZQorYWxsOgorCUAkKE1BS0UpIC1mICQodG9wX2xldmVsX21ha2VmaWxlKSAkKHN1YnN5c3RlbV9uYW1lKQpkaWZmIC0tZ2l0IGEvamRrL21ha2VmaWxlcy9Ub29scy5nbWsgYi9qZGsvbWFrZWZpbGVzL1Rvb2xzLmdtawppbmRleCAzMzA4NzU2Li41NDVmZTNkIDEwMDY0NAotLS0gYS9qZGsvbWFrZWZpbGVzL1Rvb2xzLmdtaworKysgYi9qZGsvbWFrZWZpbGVzL1Rvb2xzLmdtawpAQCAtMjksMTQgKzI5LDEzIEBACiAgICAgICAgICAgICAgICAgU0VUVVA6PUdFTkVSQVRFX09MREJZVEVDT0RFLFwKIAkJU1JDOj0kKEpES19UT1BESVIpL21ha2UvdG9vbHMvc3JjIFwKICAgICAgICAgICAgICAgICAgICAgICQoSkRLX1RPUERJUikvc3JjL3NvbGFyaXMvY2xhc3Nlcy9zdW4vYXd0L1gxMS9nZW5lcmF0b3IgXAotICAgICAgICAgICAgICAgICAgICAgJChKREtfVE9QRElSKS9tYWtlZmlsZXMvc3VuL3hhd3QgXAorICAgICAgICAgICAgICAgICAgICAgJChKREtfVE9QRElSKS9tYWtlZmlsZXMvc3VuL2F3dC9YMTEgXAorICAgICAgICAgICAgICAgICAgICAgJChKREtfVE9QRElSKS9tYWtlZmlsZXMvc3VuL29zeGFwcCBcCiAgICAgICAgICAgICAgICAgICAgICAkKEpES19UT1BESVIpL21ha2UvdG9vbHMvc3dpbmctYmVhbnMsXAogCQlCSU46PSQoSkRLX09VVFBVVERJUikvYnRjbGFzc2VzKSkKIAogZW5kaWYKIAotaWZuZGVmIERJU0FCTEVfTklNQlVTCi0KICQoSkRLX09VVFBVVERJUikvYnRjbGFzc2VzL2J1aWxkL3Rvb2xzL2dlbmVyYXRlbmltYnVzL3Jlc291cmNlcy8lLnRlbXBsYXRlIDogXAogCSQoSkRLX1RPUERJUikvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvcGxhZi9uaW1idXMvJS50ZW1wbGF0ZQogCSQoTUtESVIpIC1wICQoQEQpCkBAIC00NCw5ICs0Myw2IEBACiAKIEJVSUxEX1RPT0xTICs9ICQoZm9yZWFjaCBpLCQod2lsZGNhcmQgJChKREtfVE9QRElSKS9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy9wbGFmL25pbWJ1cy8qLnRlbXBsYXRlKSwkKEpES19PVVRQVVRESVIpL2J0Y2xhc3Nlcy9idWlsZC90b29scy9nZW5lcmF0ZW5pbWJ1cy9yZXNvdXJjZXMvJChub3RkaXIgJGkpKQogCi1lbmRpZgotCi0KICMgQWRkIGEgY2hlY2tzdW0gKCJqc3VtIikgdG8gdGhlIGVuZCBvZiBhIHRleHQgZmlsZS4gUHJldmVudHMgdHJpdmlhbCB0YW1wZXJpbmcgd2l0aCBjbGFzcyBsaXN0cy4KIFRPT0xfQURESlNVTT0kKEpBVkEpIC1jcCAkKEpES19PVVRQVVRESVIpL2J0Y2xhc3NlcyBcCiAJYnVpbGQudG9vbHMuYWRkanN1bS5BZGRKc3VtCkBAIC0xMjEsOSArMTE3LDEyIEBACiBUT09MX1dSQVBQRVJHRU5FUkFUT1I9JChKQVZBKSAtY3AgJChKREtfT1VUUFVURElSKS9idGNsYXNzZXMgXAogCVdyYXBwZXJHZW5lcmF0b3IKIAotVE9PTF9UT0JJTj0kKEpBVkEpIC1EamF2YS5hd3QuaGVhZGxlc3M9dHJ1ZSAtY3AgJChKREtfT1VUUFVURElSKS9idGNsYXNzZXMgXAorVE9PTF9YMTFfVE9CSU49JChKQVZBKSAtRGphdmEuYXd0LmhlYWRsZXNzPXRydWUgLWNwICQoSkRLX09VVFBVVERJUikvYnRjbGFzc2VzIFwKIAlzdW4uYXd0LlgxMS5Ub0JpbgogCitUT09MX09TWF9UT0JJTj0kKEpBVkEpIC1EamF2YS5hd3QuaGVhZGxlc3M9dHJ1ZSAtY3AgJChKREtfT1VUUFVURElSKS9idGNsYXNzZXMgXAorCXN1bi5vc3hhcHAuVG9CaW4KKwogVE9PTF9DTERSQ09OVkVSVEVSPSQoSkFWQSkgLWNwICQoSkRLX09VVFBVVERJUikvYnRjbGFzc2VzIFwKIAlidWlsZC50b29scy5jbGRyY29udmVydGVyLkNMRFJDb252ZXJ0ZXIKIApkaWZmIC0tZ2l0IGEvamRrL21ha2VmaWxlcy9kb2NzL0NPUkVfUEtHUy5nbWsgYi9qZGsvbWFrZWZpbGVzL2RvY3MvQ09SRV9QS0dTLmdtawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI5Mjg2OS4uMDAwMDAwMAotLS0gYS9qZGsvbWFrZWZpbGVzL2RvY3MvQ09SRV9QS0dTLmdtaworKysgL2Rldi9udWxsCkBAIC0xLDI5MyArMCwwIEBACi0jCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotIwotIyBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotIyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMKLSMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotIyBieSBPcmFjbGUgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSMKLSMgVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0jIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotIyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSMgYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotIyAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0jIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSMKLSMgUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKLSMgb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQotIyBxdWVzdGlvbnMuCi0jCi0KLSMgRVhDTFVERV9QS0dTIGlzIHRoZSBsaXN0IG9mIHBhY2thZ2VzIHRvIGV4Y2x1ZGUgZnJvbSB0aGUKLSMgSmF2YSBBUEkgU3BlY2lmaWNhdGlvbi4gIERvIG5vdCBhZGQgdGhlc2UgdG8gQ09SRV9QS0dTLgotIyBUaGUgY29uY2F0ZW5hdGlvbiBvZiBFWENMVURFX1BLR1MgYW5kIENPUkVfUEtHUwotIyBzaG91bGQgbWFrZSB1cCB0aGUgbGlzdCBvZiBhbGwgcGFja2FnZXMgdW5kZXIgdGhlCi0jIHNyYy9zaGFyZWQvY2xhc3NlcyBkaXJlY3Rvcnkgb2YgdGhlIEpESyBzb3VyY2UgdHJlZS4KLSMKLUVYQ0xVREVfUEtHUyA9ICAgICAgICAgICAgIFwKLSAgamF2YS5hd3QucGVlciAgICAgICAgICAgIFwKLSAgamF2YS5hd3QuZG5kLnBlZXIgICAgICAgIFwKLSAgc3VuLiogICAgICAgICAgICAgICAgICAgIFwKLSAgY29tLnN1bi4qICAgICAgICAgICAgICAgIFwKLSAgb3JnLmFwYWNoZS4qICAgICAgICAgICAgIFwKLSAgb3JnLmpjcC4qCQkgICBcCi0gIG9yZy53M2MuZG9tLmNzcyAgICAgICAgICBcCi0gIG9yZy53M2MuZG9tLmh0bWwgICAgICAgICBcCi0gIG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzICBcCi0gIG9yZy53M2MuZG9tLnRyYXZlcnNhbCAgICBcCi0gIG9yZy53M2MuZG9tLnJhbmdlcyAgICAgICBcCi0gIG9yZy53M2MuZG9tLnZpZXdzICAgICAgICBcCi0gIG9yZy5vbWcuc3R1Yi5qYXZheC5tYW5hZ2VtZW50LnJlbW90ZS5ybWkKLQotIwotIyBBQ1RJVkVfSlNSX1BLR1MgYXJlIHBhY2thZ2VzIHRoYXQgYXJlIHBhcnQgb2YgYW4gYWN0aXZlIEpTUiBwcm9jZXNzLS0KLSMgb25lIHRoYXQgaXMgZG9pbmcgaXRzIG93biByZXZpZXcuIFRoZXNlIHBhY2thZ2VzIGFyZSBub3QgaW5jbHVkZWQgd2hlbgotIyBjcmVhdGluZyBkaWZmIHBhZ2VzIGZvciB0aGUgcGxhdGZvcm0ncyBKQ1AgcHJvY2Vzcy4KLSMgCi0jICAgICAgIChzZWUgL2phdmEvcHVicy9hcGlzcmMvamRrLzYuMC9iZXRhL21ha2UvZG9jcy9hY3RpdmVfanNyX3BrZ3MpCi0jIE5vdGU6Ci0jIFRoaXMgaXMgYSBsaXN0IG9mIHJlZ3VsYXIgZXhwcmVzc2lvbnMuIFNvIGZvby4qIG1hdGNoZXMgImZvbyIgYW5kICJmb28uYmFyIi4KLSMKLUFDVElWRV9KU1JfUEtHUz0gXAotICBqYXZhLmxhbmcuaW52b2tlIFwKLSAgamF2YS5zcWwgIFwKLSAgamF2YXguYWN0aXZhdGlvbiAgXAotICBqYXZheC5hbm5vdGF0aW9uLiogIFwKLSAgamF2YXguandzLiogIFwKLSAgamF2YXgubGFuZy4qICBcCi0gIGphdmF4Lm1hbmFnZW1lbnQuKiAgXAotICBqYXZheC5zY3JpcHQgIFwKLSAgamF2YXguc3FsLiogIFwKLSAgamF2YXgudG9vbHMuKiAgXAotICBqYXZheC54bWwuKiAgXAotICBvcmcudzNjLiogIFwKLSAgb3JnLnhtbC5zYXgKLQotIwotIyBDT1JFX1BLR1MgaXMgdGhlIGxpc3Qgb2YgcGFja2FnZXMgdGhhdCBmb3JtIHRoZQotIyBKYXZhIEFQSSBTcGVjaWZpY2F0aW9uLgotIwotIyMjICoqKklNUE9SVEFOVCBOT1RFKioqCi0jIyMgVGhlcmUgaXMgYWxzbyBhICJSRUdFWFAiIHZhcmlhYmxlIGluIHRoZSBkb2NzL21ha2VmaWxlIHRoYXQKLSMjIyBkZXRlcm1pbmVzIHdoaWNoIHRhYmxlIHRoZSBwYWNrYWdlcyBnbyBpbiBvbiB0aGUgbWFpbiBwYWdlLgotIyMjIEN1cnJlbnRseSwgdGhlcmUgaXMgb25seSB0YWJsZSAoIlBsYXRmb3JtIFBhY2thZ2VzIikgYW5kCi0jIyMgZXZlcnl0aGluZyBnb2VzIGluIGl0LCBzbyBSRUdFWFAgaXMgIioiLiBCdXQgaWYgdGhhdCBwb2xpY3kKLSMjIyBjaGFuZ2VzLCBwYWNrYWdlcyBhZGRlZCB3aWxsIG5lZWQgdG8gYmUgcmVmbGVjdGVkIGluICB0aGF0Ci0jIyMgbGlzdCBvZiB3aWxkY2FyZCBleHByZXNzaW9ucywgYXMgd2VsbC4KLSMjIwotQ09SRV9QS0dTID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgamF2YS5hcHBsZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGphdmEuYXd0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBqYXZhLmF3dC5jb2xvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgamF2YS5hd3QuZGF0YXRyYW5zZmVyICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGphdmEuYXd0LmRuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBqYXZhLmF3dC5ldmVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgamF2YS5hd3QuZm9udCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGphdmEuYXd0Lmdlb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBqYXZhLmF3dC5pbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgamF2YS5hd3QuaW0uc3BpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGphdmEuYXd0LmltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBqYXZhLmF3dC5pbWFnZS5yZW5kZXJhYmxlICAgICAgICAgICAgICAgICAgICAgIFwKLSAgamF2YS5hd3QucHJpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGphdmEuYmVhbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBqYXZhLmJlYW5zLmJlYW5jb250ZXh0ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgamF2YS5pbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGphdmEubGFuZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBqYXZhLmxhbmcuYW5ub3RhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgamF2YS5sYW5nLmluc3RydW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGphdmEubGFuZy5pbnZva2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBqYXZhLmxhbmcubWFuYWdlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgamF2YS5sYW5nLnJlZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGphdmEubGFuZy5yZWZsZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBqYXZhLm1hdGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgamF2YS5uZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGphdmEubmlvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBqYXZhLm5pby5jaGFubmVscyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgamF2YS5uaW8uY2hhbm5lbHMuc3BpICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGphdmEubmlvLmNoYXJzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBqYXZhLm5pby5jaGFyc2V0LnNwaSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgamF2YS5uaW8uZmlsZQkJCQkJIFwKLSAgamF2YS5uaW8uZmlsZS5hdHRyaWJ1dGUJCQkgXAotICBqYXZhLm5pby5maWxlLnNwaQkJCQkgXAotICBqYXZhLnJtaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgamF2YS5ybWkuYWN0aXZhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGphdmEucm1pLmRnYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBqYXZhLnJtaS5yZWdpc3RyeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgamF2YS5ybWkuc2VydmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGphdmEuc2VjdXJpdHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBqYXZhLnNlY3VyaXR5LmFjbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgamF2YS5zZWN1cml0eS5jZXJ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGphdmEuc2VjdXJpdHkuaW50ZXJmYWNlcyAgICAgICAgICAgICAgICAgICAgICAgXAotICBqYXZhLnNlY3VyaXR5LnNwZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgamF2YS5zcWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGphdmEudGV4dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBqYXZhLnRleHQuc3BpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgamF2YS51dGlsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGphdmEudXRpbC5jb25jdXJyZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMgICAgICAgICAgICAgICAgICAgIFwKLSAgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MgICAgICAgICAgICAgICAgICAgICBcCi0gIGphdmEudXRpbC5qYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBqYXZhLnV0aWwubG9nZ2luZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgamF2YS51dGlsLnByZWZzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGphdmEudXRpbC5yZWdleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBqYXZhLnV0aWwuc3BpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgamF2YS51dGlsLnppcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGphdmF4LmFjY2Vzc2liaWxpdHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBqYXZheC5hY3RpdmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgamF2YXguYWN0aXZpdHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGphdmF4LmFubm90YXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBqYXZheC5hbm5vdGF0aW9uLnByb2Nlc3NpbmcgICAgICAgICAgICAgICAgICAgIFwKLSAgamF2YXguY3J5cHRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGphdmF4LmNyeXB0by5pbnRlcmZhY2VzICAgICAgICAgICAgICAgICAgICAgICAgXAotICBqYXZheC5jcnlwdG8uc3BlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgamF2YXguaW1hZ2VpbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGphdmF4LmltYWdlaW8uZXZlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBqYXZheC5pbWFnZWlvLm1ldGFkYXRhICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgamF2YXguaW1hZ2Vpby5wbHVnaW5zLmpwZWcgICAgICAgICAgICAgICAgICAgICBcCi0gIGphdmF4LmltYWdlaW8ucGx1Z2lucy5ibXAgICAgICAgICAgICAgICAgICAgICAgXAotICBqYXZheC5pbWFnZWlvLnNwaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgamF2YXguaW1hZ2Vpby5zdHJlYW0gICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGphdmF4Lmp3cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBqYXZheC5qd3Muc29hcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgamF2YXgubGFuZy5tb2RlbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGphdmF4LmxhbmcubW9kZWwuZWxlbWVudCAgICAgICAgICAgICAgICAgICAgICAgXAotICBqYXZheC5sYW5nLm1vZGVsLnR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgamF2YXgubGFuZy5tb2RlbC51dGlsICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGphdmF4Lm1hbmFnZW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBqYXZheC5tYW5hZ2VtZW50LmxvYWRpbmcgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgamF2YXgubWFuYWdlbWVudC5tb25pdG9yICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGphdmF4Lm1hbmFnZW1lbnQucmVsYXRpb24gICAgICAgICAgICAgICAgICAgICAgXAotICBqYXZheC5tYW5hZ2VtZW50Lm9wZW5tYmVhbiAgICAgICAgICAgICAgICAgICAgIFwKLSAgamF2YXgubWFuYWdlbWVudC50aW1lciAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGphdmF4Lm1hbmFnZW1lbnQubW9kZWxtYmVhbiAgICAgICAgICAgICAgICAgICAgXAotICBqYXZheC5tYW5hZ2VtZW50LnJlbW90ZSAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgamF2YXgubWFuYWdlbWVudC5yZW1vdGUucm1pICAgICAgICAgICAgICAgICAgICBcCi0gIGphdmF4Lm5hbWluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBqYXZheC5uYW1pbmcuZGlyZWN0b3J5ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgamF2YXgubmFtaW5nLmV2ZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGphdmF4Lm5hbWluZy5sZGFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBqYXZheC5uYW1pbmcuc3BpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgamF2YXgubmV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGphdmF4Lm5ldC5zc2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBqYXZheC5wcmludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgamF2YXgucHJpbnQuYXR0cmlidXRlICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGphdmF4LnByaW50LmF0dHJpYnV0ZS5zdGFuZGFyZCAgICAgICAgICAgICAgICAgXAotICBqYXZheC5wcmludC5ldmVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgamF2YXgucm1pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGphdmF4LnJtaS5DT1JCQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBqYXZheC5ybWkuc3NsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgamF2YXguc2NyaXB0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGphdmF4LnNlY3VyaXR5LmF1dGggICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBqYXZheC5zZWN1cml0eS5hdXRoLmNhbGxiYWNrICAgICAgICAgICAgICAgICAgIFwKLSAgamF2YXguc2VjdXJpdHkuYXV0aC5rZXJiZXJvcyAgICAgICAgICAgICAgICAgICBcCi0gIGphdmF4LnNlY3VyaXR5LmF1dGgubG9naW4gICAgICAgICAgICAgICAgICAgICAgXAotICBqYXZheC5zZWN1cml0eS5hdXRoLnNwaSAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgamF2YXguc2VjdXJpdHkuYXV0aC54NTAwICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGphdmF4LnNlY3VyaXR5LmNlcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBqYXZheC5zZWN1cml0eS5zYXNsICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgamF2YXguc291bmQuc2FtcGxlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGphdmF4LnNvdW5kLnNhbXBsZWQuc3BpICAgICAgICAgICAgICAgICAgICAgICAgXAotICBqYXZheC5zb3VuZC5taWRpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgamF2YXguc291bmQubWlkaS5zcGkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGphdmF4LnNxbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBqYXZheC5zcWwucm93c2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgamF2YXguc3FsLnJvd3NldC5zZXJpYWwgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGphdmF4LnNxbC5yb3dzZXQuc3BpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBqYXZheC5zd2luZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgamF2YXguc3dpbmcuYm9yZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGphdmF4LnN3aW5nLmNvbG9yY2hvb3NlciAgICAgICAgICAgICAgICAgICAgICAgXAotICBqYXZheC5zd2luZy5maWxlY2hvb3NlciAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgamF2YXguc3dpbmcuZXZlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGphdmF4LnN3aW5nLnRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBqYXZheC5zd2luZy50ZXh0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgamF2YXguc3dpbmcudGV4dC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGphdmF4LnN3aW5nLnRleHQuaHRtbC5wYXJzZXIgICAgICAgICAgICAgICAgICAgXAotICBqYXZheC5zd2luZy50ZXh0LnJ0ZiAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgamF2YXguc3dpbmcudHJlZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGphdmF4LnN3aW5nLnVuZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBqYXZheC5zd2luZy5wbGFmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgamF2YXguc3dpbmcucGxhZi5iYXNpYyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGphdmF4LnN3aW5nLnBsYWYubWV0YWwgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBqYXZheC5zd2luZy5wbGFmLm11bHRpICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgamF2YXguc3dpbmcucGxhZi5uaW1idXMgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGphdmF4LnN3aW5nLnBsYWYuc3ludGggICAgICAgICAgICAgICAgICAgICAgICAgXAotICBqYXZheC50b29scyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgamF2YXgudG9vbHMuYW5ub3RhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGphdmF4LnRyYW5zYWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBqYXZheC50cmFuc2FjdGlvbi54YSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgamF2YXgueG1sLnBhcnNlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGphdmF4LnhtbC5iaW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uICAgICAgICAgICAgICAgICAgICAgIFwKLSAgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycyAgICAgICAgICAgICBcCi0gIGphdmF4LnhtbC5iaW5kLmF0dGFjaG1lbnQgICAgICAgICAgICAgICAgICAgICAgXAotICBqYXZheC54bWwuYmluZC5oZWxwZXJzICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgamF2YXgueG1sLmJpbmQudXRpbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGphdmF4LnhtbC5zb2FwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBqYXZheC54bWwud3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgamF2YXgueG1sLndzLmhhbmRsZXIgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGphdmF4LnhtbC53cy5oYW5kbGVyLnNvYXAgICAgICAgICAgICAgICAgICAgICAgXAotICBqYXZheC54bWwud3MuaHR0cCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgamF2YXgueG1sLndzLnNvYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGphdmF4LnhtbC53cy5zcGkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBqYXZheC54bWwud3Muc3BpLmh0dHAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgamF2YXgueG1sLndzLndzYWRkcmVzc2luZyAgICAgICAgICAgICAgICAgICAgICBcCi0gIGphdmF4LnhtbC50cmFuc2Zvcm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBqYXZheC54bWwudHJhbnNmb3JtLnNheCAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgamF2YXgueG1sLnRyYW5zZm9ybS5kb20gICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGphdmF4LnhtbC50cmFuc2Zvcm0uc3RheCAgICAgICAgICAgICAgICAgICAgICAgXAotICBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbSAgICAgICAgICAgICAgICAgICAgIFwKLSAgamF2YXgueG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGphdmF4LnhtbC5jcnlwdG8JCQkJIFwKLSAgamF2YXgueG1sLmNyeXB0by5kb20JCQkJIFwKLSAgamF2YXgueG1sLmNyeXB0by5kc2lnCQkJCSBcCi0gIGphdmF4LnhtbC5jcnlwdG8uZHNpZy5kb20JCQkgXAotICBqYXZheC54bWwuY3J5cHRvLmRzaWcua2V5aW5mbwkJCSBcCi0gIGphdmF4LnhtbC5jcnlwdG8uZHNpZy5zcGVjCQkJIFwKLSAgamF2YXgueG1sLmRhdGF0eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGphdmF4LnhtbC52YWxpZGF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBqYXZheC54bWwubmFtZXNwYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgamF2YXgueG1sLnhwYXRoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGphdmF4LnhtbC5zdHJlYW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBqYXZheC54bWwuc3RyZWFtLmV2ZW50cyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgamF2YXgueG1sLnN0cmVhbS51dGlsICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIG9yZy5pZXRmLmpnc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBvcmcub21nLkNPUkJBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgb3JnLm9tZy5DT1JCQS5EeW5BbnlQYWNrYWdlICAgICAgICAgICAgICAgICAgICBcCi0gIG9yZy5vbWcuQ09SQkEuT1JCUGFja2FnZSAgICAgICAgICAgICAgICAgICAgICAgXAotICBvcmcub21nLkNPUkJBLlR5cGVDb2RlUGFja2FnZSAgICAgICAgICAgICAgICAgIFwKLSAgb3JnLm9tZy5zdHViLmphdmEucm1pICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIG9yZy5vbWcuQ09SQkEucG9ydGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBvcmcub21nLkNPUkJBXzJfMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgb3JnLm9tZy5DT1JCQV8yXzMucG9ydGFibGUgICAgICAgICAgICAgICAgICAgICBcCi0gIG9yZy5vbWcuQ29zTmFtaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBvcmcub21nLkNvc05hbWluZy5OYW1pbmdDb250ZXh0RXh0UGFja2FnZSAgICAgIFwKLSAgb3JnLm9tZy5Db3NOYW1pbmcuTmFtaW5nQ29udGV4dFBhY2thZ2UgICAgICAgICBcCi0gIG9yZy5vbWcuU2VuZGluZ0NvbnRleHQgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBvcmcub21nLlBvcnRhYmxlU2VydmVyICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgb3JnLm9tZy5Qb3J0YWJsZVNlcnZlci5DdXJyZW50UGFja2FnZSAgICAgICAgICBcCi0gIG9yZy5vbWcuUG9ydGFibGVTZXJ2ZXIuUE9BUGFja2FnZSAgICAgICAgICAgICAgXAotICBvcmcub21nLlBvcnRhYmxlU2VydmVyLlBPQU1hbmFnZXJQYWNrYWdlICAgICAgIFwKLSAgb3JnLm9tZy5Qb3J0YWJsZVNlcnZlci5TZXJ2YW50TG9jYXRvclBhY2thZ2UgICBcCi0gIG9yZy5vbWcuUG9ydGFibGVTZXJ2ZXIucG9ydGFibGUgICAgICAgICAgICAgICAgXAotICBvcmcub21nLlBvcnRhYmxlSW50ZXJjZXB0b3IgICAgICAgICAgICAgICAgICAgIFwKLSAgb3JnLm9tZy5Qb3J0YWJsZUludGVyY2VwdG9yLk9SQkluaXRJbmZvUGFja2FnZSBcCi0gIG9yZy5vbWcuTWVzc2FnaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBvcmcub21nLklPUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgb3JnLm9tZy5JT1AuQ29kZWNGYWN0b3J5UGFja2FnZSAgICAgICAgICAgICAgICBcCi0gIG9yZy5vbWcuSU9QLkNvZGVjUGFja2FnZSAgICAgICAgICAgICAgICAgICAgICAgXAotICBvcmcub21nLkR5bmFtaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgb3JnLm9tZy5EeW5hbWljQW55ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIG9yZy5vbWcuRHluYW1pY0FueS5EeW5BbnlQYWNrYWdlICAgICAgICAgICAgICAgXAotICBvcmcub21nLkR5bmFtaWNBbnkuRHluQW55RmFjdG9yeVBhY2thZ2UgICAgICAgIFwKLSAgb3JnLnczYy5kb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIG9yZy53M2MuZG9tLmV2ZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBvcmcudzNjLmRvbS5ib290c3RyYXAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgb3JnLnczYy5kb20ubHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIG9yZy54bWwuc2F4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBvcmcueG1sLnNheC5leHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgb3JnLnhtbC5zYXguaGVscGVycwpkaWZmIC0tZ2l0IGEvamRrL21ha2VmaWxlcy9kb2NzL01ha2VmaWxlIGIvamRrL21ha2VmaWxlcy9kb2NzL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTM5NWRhLi4wMDAwMDAwCi0tLSBhL2pkay9tYWtlZmlsZXMvZG9jcy9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDExNzQgKzAsMCBAQAotIyBDb3B5cmlnaHQgKGMpIDE5OTcsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSMKLSMgVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzCi0jIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSMgYnkgT3JhY2xlIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0jCi0jIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSMgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0jIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSMgMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotIyBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0jCi0jIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCi0jIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKLSMgcXVlc3Rpb25zLgotIwotCi0jCi0jIERlZmluaXRpb25zIGZvciAkKERPQ1NESVIpLCAkKE1LRElSKSwgJChCSU5ESVIpLCBldGMuCi0jCi1CVUlMRERJUj0uLgotUFJPRFVDVD1kb2NzCi1pbmNsdWRlICQoQlVJTERESVIpL2NvbW1vbi9EZWZzLmdtawotCi0jIEdldCBDb3B5cmlnaHRMaW5lIG1hY3JvIGFuZCBvdGhlciBzaGFyZWQgdmFyaWFibGVzCi1pbmNsdWRlICQoQlVJTERESVIpL2NvbW1vbi9zaGFyZWQvRGVmcy1qYXZhZG9jLmdtawotCi0jIFVybCB0byByb290IG9mIGRvY3VtZW50cwotRE9DU0RJUl9VUkwgPSB7QGRvY3Jvb3R9LyQoR0VUMkRPQ1NESVIpCi0KLSMgVXJsIHRvIGNvcHlyaWdodCBodG1sIGZpbGUKLUNPUFlSSUdIVF9VUkwtNyA9ICQoRE9DU0RJUl9VUkwpL2xlZ2FsL2NweXIuaHRtbAotQ09QWVJJR0hUX1VSTCA9ICQoQ09QWVJJR0hUX1VSTC0kKEpES19NSU5PUl9WRVJTSU9OKSkKLQotIyBVcmwgdG8gYnVnIGZpbGluZyBzaXRlCi1CVUdfU1VCTUlUX1VSTCA9IGh0dHA6Ly9idWdyZXBvcnQuc3VuLmNvbS9idWdyZXBvcnQvCi0KLSMgQ29tbW9uIGxpbmUgZm9yIGhvdyB0byBzdWJtaXQgYSBidWcgb3IgcmZlCi1CVUdfU1VCTUlUX0xJTkUgPSA8YSBocmVmPSIkKEJVR19TVUJNSVRfVVJMKSI+U3VibWl0IGEgYnVnIG9yIGZlYXR1cmU8L2E+Ci0KLSMgVXJsIHRvIGRldmRvY3MgcGFnZQotIyAgIFdhczogaHR0cDovL2phdmEuc3VuLmNvbS9qYXZhc2UvNi93ZWJub3Rlcy9kZXZkb2NzLXZzLXNwZWNzLmh0bWwKLURFVl9ET0NTX1VSTC01ID0gaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNS4wL2RvY3MvaW5kZXguaHRtbAotREVWX0RPQ1NfVVJMLTYgPSBodHRwOi8vZG93bmxvYWQub3JhY2xlLmNvbS9qYXZhc2UvNi9kb2NzL2luZGV4Lmh0bWwKLURFVl9ET0NTX1VSTC03ID0gaHR0cDovL2Rvd25sb2FkLm9yYWNsZS5jb20vamF2YXNlLzcvZG9jcy9pbmRleC5odG1sCi1ERVZfRE9DU19VUkwgPSAkKERFVl9ET0NTX1VSTC0kKEpES19NSU5PUl9WRVJTSU9OKSkKLURPQ1NfQkFTRV9VUkwgPSBodHRwOi8vZG93bmxvYWQub3JhY2xlLmNvbS9qYXZhc2UvNy9kb2NzCi0KLSMgVXJsIHRvIEphdmEgTGFuZ3VhZ2UgU3BlYwotI0pMUzNfVVJMID0gaHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy8KLQotIyBDb21tb24gSmF2YSB0cmFkZW1hcmsgbGluZQotSkFWQV9UUkFERU1BUktfTElORSA9IEphdmEgaXMgYSB0cmFkZW1hcmsgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmsgb2YgXAotJChGVUxMX0NPTVBBTllfTkFNRSkgaW4gdGhlIFVTIGFuZCBvdGhlciBjb3VudHJpZXMuCi0KLSMKLSMgRGVmaW5pdGlvbnMgZm9yIGltcG9ydGVkIGNvbXBvbmVudHMKLSMKLWluY2x1ZGUgJChCVUlMRERJUikvY29tbW9uL2ludGVybmFsL0ltcG9ydENvbXBvbmVudHMuZ21rCi0KLSMgV2Ugb3ZlcnJpZGUgd2hhdGV2ZXIgdGhlIG1heCBWTSBtZW1vcnkgc2V0dGluZyBpcyBoZXJlLgotIyAgICBOT1RFOiBqYXZhZG9jIHdpbGwgbm90IGNvbXBsZXRlIHdpdGhvdXQgdGhlc2UgbGFyZ2VyIHNldHRpbmdzLgotIyAgICBXQVJOSU5HOiBUaGlzIGNvdWxkIGNhdXNlIHRocmFzaGluZyBvbiBsb3cgbWVtb3J5IG1hY2hpbmVzLgotaWZlcSAoJChBUkNIX0RBVEFfTU9ERUwpLDY0KQotICBNQVhfVk1fTUVNT1JZID0gMTAyNAotZWxzZSBpZmVxICgkKEFSQ0gpLHVuaXZlcnNhbCkKLSAgTUFYX1ZNX01FTU9SWSA9IDEwMjQKLWVsc2UKLSAgTUFYX1ZNX01FTU9SWSA9IDYxMgotZW5kaWYKLQotIyBMaXN0IG9mIGFsbCBwb3NzaWJsZSBkaXJlY3RvcmllcyBmb3IgamF2YWRvYyB0byBsb29rIGZvciBzb3VyY2VzCi0jICAgIE5PVEU6IFF1b3RlcyBhcmUgcmVxdWlyZWQgYXJvdW5kIHNvdXJjZXBhdGggYXJndW1lbnQgb25seSBvbiBXaW5kb3dzLgotIyAgICAgICAgICBPdGhlcndpc2UsIHlvdSBnZXQgIk5vIHBhY2thZ2VzIG9yIGNsYXNzZXMgc3BlY2lmaWVkLiIgZHVlIAotIyAgICAgICAgICB0byAkKENMQVNTUEFUSF9TRVBBUkFUT1IpIGJlaW5nIGludGVycHJldGVkIGFzIGFuIGVuZCBvZiAKLSMgICAgICAgICAgY29tbWFuZCAobmV3bGluZSBvciBzaGVsbCA7IGNoYXJhY3RlcikKLUFMTF9TT1VSQ0VfRElSUyA9ICQoU0hBUkVfU1JDKS9jbGFzc2VzIFwKLSAgICAgICAgICAgICAgICAgICQoSU1QT1JUU1JDRElSKSBcCi0gICAgICAgICAgICAgICAgICAkKEdFTlNSQ0RJUikgXAotICAgICAgICAgICAgICAgICAgJChTSEFSRV9TUkMpLy4uL3NvbGFyaXMvY2xhc3NlcyBcCi0JICAgICAgICAgICQoU0hBUkVfU1JDKS8uLi93aW5kb3dzL2NsYXNzZXMgXAotCQkgICQoU0hBUkVfU1JDKS9kb2Mvc3R1YgotCi0jIExpc3Qgb2YgZGlyZWN0b3JpZXMgdGhhdCBhY3R1YWxseSBleGlzdAotQUxMX0VYSVNUSU5HX1NPVVJDRV9ESVJTIDo9ICQod2lsZGNhcmQgJChBTExfU09VUkNFX0RJUlMpKQotCi0jIExpc3Qgd2l0aCBjbGFzc3BhdGggc2VwYXJhdG9yIGJldHdlZW4gdGhlbQotRU1QVFk6PQotU1BBQ0U6PSAkKEVNUFRZKSAkKEVNUFRZKQotUkVMRUFTRURPQ1NfU09VUkNFUEFUSCA9IFwKLSAgICAkKHN1YnN0ICQoU1BBQ0UpLCQoQ0xBU1NQQVRIX1NFUEFSQVRPUiksJChzdHJpcCAkKEFMTF9TT1VSQ0VfRElSUykpKQotCi0jIFByZXAgZm9yIGphdmFkb2MgY3JlYXRpb24sIGFzc3VtZXMgJEAgaXMgYW4gaW5kZXguaHRtbCBmaWxlCi1kZWZpbmUgcHJlcC1qYXZhZG9jCi1AaWYgWyAtZiAiJEAiIC1hICIkPyIgIT0gIiIgXSA7IHRoZW4gXAotICAkKEVDSE8pICIjIERlcGVuZGVuY2llcyBoYXZlIGNoYW5nZWQ6ICQ/IjsgXAotZmkKLSQoUk0pIC1yICQoQEQpCi0kKE1LRElSKSAtcCAkKEBEKQotZW5kZWYKLQotIyBBIGNhY2hlIG9mIHRoZSBkaXJlY3RvcmllcyBpbiBBTExfU09VUkNFX0RJUlMKLURJUkVDVE9SWV9DQUNIRSA9ICQoRE9DU1RNUERJUikvZGlyZWN0b3J5LmNhY2hlCi0KLSMgR2l2ZW4gYSBsaXN0IG9mIHBhY2thZ2VzLCByZXR1cm4gYSBsaXN0IG9mIGZpbGVzIG9yIGRpcnMgdG8gYmUgZGVwZW5kZW50IG9uCi0jICAgKEN1cnJlbnRseSBvbmx5IHJldHVybmluZyBhIGxpc3Qgb2YgZGlyZWN0b3JpZXMpCi1kZWZpbmUgUGFja2FnZURlcGVuZGVuY2llcyAjIHBhY2thZ2VzCi0kKHNoZWxsCQkJCQkJCVwKLSAgaWYgWyAiJDEiICE9ICIiIC1hIC1mICQoRElSRUNUT1JZX0NBQ0hFKSBdIDsgdGhlbglcCi0gICAgZm9yIHAgaW4gJDEgOyBkbyAJCQkJCVwKLSAgICAgIHBkPWAkKEVDSE8pICQke3B9IHwgJChTRUQpIC1lICdzQFsuXUAvQGcnYDsJXAotICAgICAgJChDQVQpICQoRElSRUNUT1JZX0NBQ0hFKSB8ICQoR1JFUCkgIi8kJHtwZH0vIiA7IAlcCi0gICAgZG9uZTsgCQkJCQkJXAotICBmaQkJCQkJCQlcCi0pCi1lbmRlZgotCi0jIEdpdmVuIGEgbGlzdCBvZiBwYWNrYWdlcywgYWRkIHBhY2thZ2VzIHRoYXQgZXhpc3QgdG8gJEAsIHByaW50IHN1bW1hcnkKLWRlZmluZSBQYWNrYWdlRmlsdGVyICMgcGFja2FnZXMKLUBpZiBbICIkMSIgIT0gIiIgXSA7IHRoZW4gCQkJCVwKLSAgZm9yIHAgaW4gJDEgOyBkbyAJCQkJCVwKLSAgICBwZD1gJChFQ0hPKSAkJHtwfSB8ICQoU0VEKSAtZSAnc0BbLl1AL0BnJ2A7IAlcCi0gICAgZm91bmQ9ImZhbHNlIjsgCQkJCQlcCi0gICAgZm9yIGNwIGluICQoQUxMX1NPVVJDRV9ESVJTKSA7IGRvIAkJCVwKLSAgICAgIGlmIFsgLWQgJCR7Y3B9LyQke3BkfSBdIDsgdGhlbiAJCQlcCi0gICAgICAgICQoRUNITykgIiQke3B9IiA+PiAkQDsgCQkJCVwKLQlmb3VuZD0idHJ1ZSI7CQkJCQlcCi0JYnJlYWs7IAkJCQkJCVwKLSAgICAgIGZpOyAJCQkJCQlcCi0gICAgZG9uZTsgCQkJCQkJXAotICAgIGlmIFsgIiQke2ZvdW5kfSIgPSAiZmFsc2UiIF0gOyB0aGVuIAkJXAotICAgICAgJChFQ0hPKSAiV0FSTklORzogUGFja2FnZSBub3QgZm91bmQ6ICQke3B9IjsgCVwKLSAgICBmaTsgCQkJCQkJXAotICBkb25lOyAJCQkJCQlcCi1maQotZW5kZWYKLQotIyBQcmludCBvdXQgYSBzdW1tYXJ5IG9mIHRoZSBqYXZhZG9jIGNvbW1hbmQgYWJvdXQgdG8gYmUgcnVuCi1kZWZpbmUgSmF2YWRvY1N1bW1hcnkgIyBvcHRpb25zZmlsZSBwYWNrYWdlc2ZpbGUKLUAkKEVDSE8pICIjIFN1bW1hcnkgZm9yICRAIjtcCi0gJChFQ0hPKSAiIyBPcHRpb25zIChgJChCQVNFTkFNRSkgJDFgKToiOyAkKFNFRCkgLWUgJ3NAXkAjICAgQCcgJDE7IFwKLSAkKEVDSE8pICIjIFBhY2thZ2VzIChgJChCQVNFTkFNRSkgJDJgKToiOyQoU0VEKSAtZSAnc0BeQCMgICBAJyAkMgotZW5kZWYKLQotIwotIyBUZW1wb3JhcnkgZGlyZWN0b3J5IGZvciBqYXZhZG9jIGNyZWF0aW9uCi0jCi1ET0NTVE1QRElSID0gJChURU1QRElSKS9kb2N0bXAKLQotIwotIyBEaWZmZXJlbnQgYXBpIGRpcmVjdG9yaWVzIGNyZWF0ZWQgZnJvbSByb290IGRpcmVjdG9yeQotIwotQ09SRUFQSV9ET0NTRElSICAgPSAkKERPQ1NESVIpL2FwaQotSkRLX0FQSV9ET0NTRElSICAgPSAkKERPQ1NESVIpL2pkay9hcGkKLUpSRV9BUElfRE9DU0RJUiAgID0gJChET0NTRElSKS9qcmUvYXBpCi1QTEFURk9STV9ET0NTRElSICA9ICQoRE9DU0RJUikvcGxhdGZvcm0KLQotIyBUaGUgbm9uLWNvcmUgYXBpIGphdmFkb2NzIG5lZWQgdG8gYmUgYWJsZSB0byBhY2Nlc3MgdGhlIHJvb3Qgb2YgdGhlIGNvcmUKLSMgICBhcGkgZGlyZWN0b3J5LCBzbyBmb3IgamRrL2FwaSBvciBqcmUvYXBpIHRvIGdldCB0byB0aGUgY29yZSBhcGkvCi0jICAgZGlyZWN0b3J5IHdlIHdvdWxkIHVzZSB0aGlzOgotSkRLSlJFMkNPUkVBUEkgICAgPSAuLi8uLi9hcGkKLQotIyBDb21tb24gYm90dG9tIGFyZ3VtZW50Ci1kZWZpbmUgQ29tbW9uQm90dG9tICMgeWVhcgotPGZvbnQgc2l6ZT0iLTEiPjxicj4gJChjYWxsIENvcHlyaWdodExpbmUsLCQxLCk8L2ZvbnQ+Ci1lbmRlZgotCi0jIENvbW1vbiB0cmFkZW1hcmsgYm90dG9tIGFyZ3VtZW50IChOb3Qgc3VyZSB3aHkgdGhpcyBpcyB1c2VkIHNvbWV0aW1lcykKLWRlZmluZSBDb21tb25UcmFkZW1hcmtCb3R0b20gIyB5ZWFyCi08Zm9udCBzaXplPSItMSI+XAotJChCVUdfU1VCTUlUX0xJTkUpPGJyPiQoSkFWQV9UUkFERU1BUktfTElORSk8YnI+XAotJChjYWxsIENvcHlyaWdodExpbmUsLCQxLCQoQ09NUEFOWV9BRERSRVNTKSlcCi08L2ZvbnQ+Ci1lbmRlZgotCi0jIENvbW1vbiBlY2hvIG9mIG9wdGlvbgotZGVmaW5lIE9wdGlvbk9ubHkgIyBvcHQKLSQoUFJJTlRGKSAiJXNcbiIgIiQxIgotZW5kZWYKLWRlZmluZSBPcHRpb25QYWlyICMgb3B0IGFyZwotJChQUklOVEYpICIlcyAnJXMnXG4iICIkMSIgJyQyJwotZW5kZWYKLWRlZmluZSBPcHRpb25UcmlwICMgb3B0IGFyZyBhcmcKLSQoUFJJTlRGKSAiJXMgJyVzJyAnJXMnXG4iICIkMSIgJyQyJyAnJDMnCi1lbmRlZgotCi0jIENvcmUgYXBpIGJvdHRvbSBhcmd1bWVudCAod2l0aCBzcGVjaWFsIHNhdWNlKQotQ09SRUFQSV9CT1RUT00gPSA8Zm9udCBzaXplPSItMSI+ICQoQlVHX1NVQk1JVF9MSU5FKVwKLTxicj5Gb3IgZnVydGhlciBBUEkgcmVmZXJlbmNlIGFuZCBkZXZlbG9wZXIgZG9jdW1lbnRhdGlvbiwgXAotc2VlIDxhIGhyZWY9IiQoREVWX0RPQ1NfVVJMKSIgdGFyZ2V0PSJfYmxhbmsiPkphdmEgU0UgRG9jdW1lbnRhdGlvbjwvYT4uIFwKLVRoYXQgZG9jdW1lbnRhdGlvbiBjb250YWlucyBtb3JlIGRldGFpbGVkLCBkZXZlbG9wZXItdGFyZ2V0ZWQgZGVzY3JpcHRpb25zLCBcCi13aXRoIGNvbmNlcHR1YWwgb3ZlcnZpZXdzLCBkZWZpbml0aW9ucyBvZiB0ZXJtcywgd29ya2Fyb3VuZHMsIFwKLWFuZCB3b3JraW5nIGNvZGUgZXhhbXBsZXMuPGJyPlwKLSQoY2FsbCBDb3B5cmlnaHRMaW5lLCQoQ09QWVJJR0hUX1VSTCksJChGSVJTVF9DT1BZUklHSFRfWUVBUiksKVwKLTwvZm9udD4KLQotIyBDb21tb24gamF2YWRvYyBvcHRpb25zIHVzZWQgYnkgYWxsCi1DT01NT05fSkFWQURPQ0ZMQUdTID0JCQkJCVwKLSAgICAgICAgICAgICAgICAkKE5PX1BST1BSSUVUQVJZX0FQSV9XQVJOSU5HUykgICAgICAgICAgXAotCQktcXVpZXQJCQkJCVwKLSAgICAgICAgICAgICAgICAtdXNlCQkJCQlcCi0gICAgICAgICAgICAgICAgLWtleXdvcmRzCQkJCVwKLQkJJChBRERJVElPTkFMX0pBVkFET0NGTEFHUykKLQotaWZkZWYgT1BFTkpESwotICBBRERJVElPTkFMX0pBVkFET0NGTEFHUyA9CQkJCVwKLSAgICAgICAgICAgICAgICAtWGRvY3Jvb3RwYXJlbnQgJChET0NTX0JBU0VfVVJMKQotZWxzZQotICBBRERJVElPTkFMX0pBVkFET0NGTEFHUyA9Ci1lbmRpZgotCi0jIERyYWZ0IHVzZWQgZm9yIG5vbi1mY3MgZG9jdW1lbnRzCi1KREtfSVNfRkNTID0gZmFsc2UKLURSQUZUX0hFQURFUiA9Ci1pZmVxICgkKEpES19NSU5PUl9WRVJTSU9OKSw1KQotICBKREtfSVNfRkNTID0gdHJ1ZQotZW5kaWYKLWlmZXEgKCQoSkRLX01JTk9SX1ZFUlNJT04pLDYpCi0gIEpES19JU19GQ1MgPSB0cnVlCi1lbmRpZgotaWZlcSAoJChKREtfTUlOT1JfVkVSU0lPTiksNykKLSAgSkRLX0lTX0ZDUyA9IHRydWUKLWVuZGlmCi1pZmVxICgkKEpES19JU19GQ1MpLGZhbHNlKQotICBpZm5lcSAoJChNSUxFU1RPTkUpLCBmY3MpCi0gICAgRFJBRlRfSEVBREVSID0gPGJyPjxzdHJvbmc+RFJBRlQmbmJzcDskKE1JTEVTVE9ORSktJChCVUlMRF9OVU1CRVIpPC9zdHJvbmc+Ci0gICAgRFJBRlRfQk9UVE9NID0gPGJyPjxzdHJvbmc+RFJBRlQmbmJzcDskKE1JTEVTVE9ORSktJChCVUlMRF9OVU1CRVIpPC9zdHJvbmc+Ci0gICAgRFJBRlRfV0lOVElUTEUgPSAkKEJVSUxEX05VTUJFUikKLSAgICAjIEVhcmx5IGFjY2VzcyB0b3AgdGV4dCAobm90IHVzZWQgaW4gRkNTIHJlbGVhc2VzKQotICAgIENPUkVBUElfVE9QX0VBUkxZQUNDRVNTID0gXAotPGRpdiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogXCNFRUVFRUUiPiBcCi08ZGl2IHN0eWxlPSJwYWRkaW5nOiA2cHg7IG1hcmdpbi10b3A6IDJweDsgbWFyZ2luLWJvdHRvbTogNnB4OyBcCi1tYXJnaW4tbGVmdDogNnB4OyBtYXJnaW4tcmlnaHQ6IDZweDsgdGV4dC1hbGlnbjoganVzdGlmeTsgXAotZm9udC1zaXplOiA4MCU7IGZvbnQtZmFtaWx5OiBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmOyBcCi1mb250LXdlaWdodDogbm9ybWFsOyI+IFwKLVBsZWFzZSBub3RlIHRoYXQgdGhlIHNwZWNpZmljYXRpb25zIGFuZCBvdGhlciBpbmZvcm1hdGlvbiBcCi1jb250YWluZWQgaGVyZWluIGFyZSBub3QgZmluYWwgYW5kIGFyZSBzdWJqZWN0IHRvIGNoYW5nZS4gXAotVGhlIGluZm9ybWF0aW9uIGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIHRvIHlvdSBzb2xlbHkgZm9yIHB1cnBvc2Ugb2YgXAotZXZhbHVhdGlvbi4gXAotPC9kaXY+IDwvZGl2PgotICBlbmRpZgotZW5kaWYKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIwotIyBDT1JFX1BLR1MgZW52aXJvbm1lbnQgdmFyaWFibGUgaGFzIGJlZW4gbW92ZWQgdG8gdGhlIGZvbGxvd2luZyBmaWxlCi0jCi1pbmNsdWRlIENPUkVfUEtHUy5nbWsKLQotIwotIyBMb2FkIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgQVBJIHBhY2thZ2UgbmFtZXMgdGhhdCBhcmUgbm90IHBhcnQgb2YKLSMgdGhlIEphdmEgU0UgcGxhdGZvcm0KLSMKLWluY2x1ZGUgTk9OX0NPUkVfUEtHUy5nbWsKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIwotIyBEZWZhdWx0IHRhcmdldCBpcyBzYW1lIGFzIGRvY3MgdGFyZ2V0LCBjcmVhdGUgY29yZSBhcGkgYW5kIGFsbCBvdGhlcnMgaXQgY2FuCi0jCi0KLWFsbDogZG9jcwotZG9jczogY29yZWRvY3Mgb3RoZXJkb2NzCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFByb2R1Y3Rpb24gVGFyZ2V0cyAtLSBVU0UgVEhFU0UgVEFSR0VUUyBXSEVOOgotIyAgICBhKSBZb3UncmUgZ2VuZXJhdGluZyBkb2NzIG91dHNpZGUgb2YgcmVsZWFzZSBlbmdpbmVlcmluZydzCi0jICAgICAgIHN0YW5kYXJkIGNvbnRyb2wgYnVpbGQuCi0jICAgIGIpIFRoZSBkb2NzIHdpbGwgYmUgcHVzaGVkIHRvIHRoZSB3ZWIgYW5kL29yIGluY2x1ZGVkIGluCi0jICAgICAgIHRoZSBkb3dubG9hZGVkIGRvYyBidW5kbGUuCi0jCi0jIFNlZTogIE5vdGVzLmh0bWwjcmVsZWFzZVRhcmdldHMKLSMgTm90ZTogU3BhY2VzIHByZWNlZGUgaWZkZWYvaWZuZGVmIGluZGVudHMuIFRhYnMgcHJlY2VkZSB0YXJnZXQgY29tbWFuZHMgKCEpCi0jCi0KLXNhbml0eWNoZWNrY29yZWRvY3M6Ci0JQCQoRUNITykgIiIKLQlAJChFQ0hPKSAiQnVpbGRpbmcgY29yZSBhcGkgZG9jcyB3aXRoIHRoZXNlIHZhbHVlczoiCi0JQCQoRUNITykgIiAgICBCVUlMRF9OVU1CRVIgPSAkKEJVSUxEX05VTUJFUikiCi0JQCQoRUNITykgIiAgICBNSUxFU1RPTkUgPSAkKE1JTEVTVE9ORSkiCi0JQCQoRUNITykgIiIKLSAgaWZlcSAoJChCVUlMRF9OVU1CRVIpLCBiMDApCi0JQCQoRUNITykgIkVSUk9SOiBCdWlsZCBudW1iZXIgbXVzdCBiZSBkZWZpbmVkIgotCUAkKEVDSE8pICJNSUxFU1RPTkUgaXMgc2V0IHRvICQoTUlMRVNUT05FKSIKLQlAJChFQ0hPKSAiIgotCWV4aXQgMQotICBlbmRpZgotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jIGNvcmVkb2NzCi0jCi1DT1JFQVBJX0RPQ1RJVExFICA9IEphdmEkKFRSQURFTUFSSykgUGxhdGZvcm0sIFN0YW5kYXJkIEVkaXRpb24gXAotJChKREtfTUlOT1JfVkVSU0lPTik8YnI+QVBJIFNwZWNpZmljYXRpb24KLUNPUkVBUElfV0lORE9XVElUTEUgID0gSmF2YSBQbGF0Zm9ybSBTRSAkKEpES19NSU5PUl9WRVJTSU9OKQotQ09SRUFQSV9IRUFERVIgPSBcCi08c3Ryb25nPkphdmEkKFRSQURFTUFSSykmbmJzcDtQbGF0Zm9ybTxicj5TdGFuZGFyZCZuYnNwO0VkLiZuYnNwOyQoSkRLX01JTk9SX1ZFUlNJT04pPC9zdHJvbmc+Ci0KLSMgSmF2YSBsYW5ndWFnZSBzcGVjaWZpY2F0aW9uIGNpdGUKLVRBR19KTFMgPSBqbHM6YTpTZWUgPGNpdGU+IFwKLVRoZSBKYXZhJnRyYWRlOyBMYW5ndWFnZSBTcGVjaWZpY2F0aW9uPC9jaXRlPjoKLQotIyBPdmVydmlldyBmaWxlIGZvciBjb3JlIGFwaXMKLUNPUkVBUElfT1ZFUlZJRVcgPSAkKFNIQVJFX1NSQykvY2xhc3Nlcy9vdmVydmlldy1jb3JlLmh0bWwKLQotIyBUaGUgaW5kZXguaHRtbCwgb3B0aW9ucywgYW5kIHBhY2thZ2VzIGZpbGVzCi1DT1JFQVBJX0lOREVYX0ZJTEUgICAgPSAkKENPUkVBUElfRE9DU0RJUikvaW5kZXguaHRtbAotQ09SRUFQSV9PUFRJT05TX0ZJTEUgID0gJChET0NTVE1QRElSKS9jb3JlZG9jcy5vcHRpb25zCi1DT1JFQVBJX1BBQ0tBR0VTX0ZJTEUgPSAkKERPQ1NUTVBESVIpL2NvcmVkb2NzLnBhY2thZ2VzCi0KLWNvcmVkb2NzOiAkKENPUkVBUElfSU5ERVhfRklMRSkKLQotIyBTZXQgcmVsYXRpdmUgbG9jYXRpb24gdG8gY29yZSBhcGkgZG9jdW1lbnQgcm9vdAotJChDT1JFQVBJX0lOREVYX0ZJTEUpOiBHRVQyRE9DU0RJUj0uLgotCi0jIFJ1biBqYXZhZG9jIGlmIHRoZSBpbmRleCBmaWxlIGlzIG91dCBvZiBkYXRlIG9yIG1pc3NpbmcKLSQoQ09SRUFQSV9JTkRFWF9GSUxFKTogJChDT1JFQVBJX09QVElPTlNfRklMRSkgJChDT1JFQVBJX1BBQ0tBR0VTX0ZJTEUpCi0JJChwcmVwLWphdmFkb2MpCi0JJChjYWxsIEphdmFkb2NTdW1tYXJ5LCQoQ09SRUFQSV9PUFRJT05TX0ZJTEUpLCQoQ09SRUFQSV9QQUNLQUdFU19GSUxFKSkKLQkkKEpBVkFET0NfQ01EKSAkKEpBVkFET0NfVk1fTUVNT1JZX0ZMQUdTKSAtZCAkKEBEKSBcCi0JICBAJChDT1JFQVBJX09QVElPTlNfRklMRSkgQCQoQ09SRUFQSV9QQUNLQUdFU19GSUxFKQotCi0jIENyZWF0ZSBmaWxlIHdpdGggamF2YWRvYyBvcHRpb25zIGluIGl0Ci0kKENPUkVBUElfT1BUSU9OU19GSUxFKTogJChDT1JFQVBJX09WRVJWSUVXKQotCSQocHJlcC10YXJnZXQpCi0JQCgkKGNhbGwgT3B0aW9uT25seSwkKENPTU1PTl9KQVZBRE9DRkxBR1MpKQkJCTsgXAotCSAgJChjYWxsIE9wdGlvblBhaXIsLXNvdXJjZXBhdGgsJChSRUxFQVNFRE9DU19TT1VSQ0VQQVRIKSkJOyBcCi0JICAkKGNhbGwgT3B0aW9uUGFpciwtZW5jb2RpbmcsSVNPLTg4NTktMSkJCQk7IFwKLQkgICQoY2FsbCBPcHRpb25QYWlyLC10YWcsYmVhbmluZm86WCkJCQkJOyBcCi0JICAkKGNhbGwgT3B0aW9uUGFpciwtdGFnLHJldmlzZWQ6WCkJCQkJOyBcCi0JICAkKGNhbGwgT3B0aW9uUGFpciwtdGFnLHNpbmNlLnVuYnVuZGxlZDpYKQkJCTsgXAotCSAgJChjYWxsIE9wdGlvblBhaXIsLXRhZyxzcGVjOlgpCQkJCTsgXAotCSAgJChjYWxsIE9wdGlvblBhaXIsLXRhZyxzcGVjZGVmYXVsdDpYKQkJCQk7IFwKLQkgICQoY2FsbCBPcHRpb25QYWlyLC10YWcsTm90ZTpYKQkJCQk7IFwKLQkgICQoY2FsbCBPcHRpb25QYWlyLC10YWcsVG9EbzpYKQkJCQk7IFwKLSAgICAgICAgICAkKGNhbGwgT3B0aW9uUGFpciwtdGFnLCQoVEFHX0pMUykpIAkJCQk7IFwKLQkgICQoY2FsbCBPcHRpb25Pbmx5LC1zcGxpdEluZGV4KQkJCQk7IFwKLQkgICQoY2FsbCBPcHRpb25QYWlyLC1vdmVydmlldywkKENPUkVBUElfT1ZFUlZJRVcpKQkJOyBcCi0JICAkKGNhbGwgT3B0aW9uUGFpciwtZG9jdGl0bGUsJChDT1JFQVBJX0RPQ1RJVExFKSkJCTsgXAotCSAgJChjYWxsIE9wdGlvblBhaXIsLXdpbmRvd3RpdGxlLCQoQ09SRUFQSV9XSU5ET1dUSVRMRSkgJChEUkFGVF9XSU5USVRMRSkpIDtcCi0JICAkKGNhbGwgT3B0aW9uUGFpciwtaGVhZGVyLCQoQ09SRUFQSV9IRUFERVIpJChEUkFGVF9IRUFERVIpKQk7IFwKLQkgICQoY2FsbCBPcHRpb25QYWlyLC1ib3R0b20sJChDT1JFQVBJX0JPVFRPTSkkKERSQUZUX0JPVFRPTSkpCTsgXAotICAgICAgICApID4+ICRACi1pZmRlZiBDT1JFQVBJX1RPUF9FQVJMWUFDQ0VTUwotCUAkKGNhbGwgT3B0aW9uUGFpciwtdG9wLCQoQ09SRUFQSV9UT1BfRUFSTFlBQ0NFU1MpKSA+PiAkQAotZW5kaWYKLQotIyBDcmVhdGUgYSBmaWxlIHdpdGggdGhlIHBhY2thZ2UgbmFtZXMgaW4gaXQKLSQoQ09SRUFQSV9QQUNLQUdFU19GSUxFKTogJChESVJFQ1RPUllfQ0FDSEUpICQoY2FsbCBQYWNrYWdlRGVwZW5kZW5jaWVzLCQoQ09SRV9QS0dTKSkKLQkkKHByZXAtdGFyZ2V0KQotCSQoY2FsbCBQYWNrYWdlRmlsdGVyLCQoQ09SRV9QS0dTKSkKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyBkb2NsZXRhcGlkb2NzCi0jCi0KLSMgUGFydCBvZiBsYW5ndG9vbHMKLWlmZGVmIExBTkdUT09MU19ESVNUCi0gIEFMTF9PVEhFUl9UQVJHRVRTICs9IGRvY2xldGFwaWRvY3MKLWVuZGlmCi0KLURPQ0xFVEFQSV9ET0NESVIgICAgICAgOj0gJChKREtfQVBJX0RPQ1NESVIpL2phdmFkb2MvZG9jbGV0Ci1ET0NMRVRBUEkyQ09SRUFQSSAgICAgIDo9IC4uLy4uLyQoSkRLSlJFMkNPUkVBUEkpCi1ET0NMRVRBUElfRE9DVElUTEUgICAgIDo9IERvY2xldCBBUEkKLURPQ0xFVEFQSV9XSU5ET1dUSVRMRSAgOj0gRG9jbGV0IEFQSQotRE9DTEVUQVBJX0hFQURFUiAgICAgICA6PSA8c3Ryb25nPkRvY2xldCBBUEk8L3N0cm9uZz4KLURPQ0xFVEFQSV9CT1RUT00gICAgICAgOj0gJChjYWxsIENvbW1vblRyYWRlbWFya0JvdHRvbSwkKERPQ0xFVEFQSV9GSVJTVF9DT1BZUklHSFRfWUVBUikpCi1ET0NMRVRBUElfR1JPVVBOQU1FICAgIDo9IFBhY2thZ2VzCi1ET0NMRVRBUElfUkVHRVhQICAgICAgIDo9IGNvbS5zdW4uamF2YWRvYwotIyBET0NMRVRBUElfUEtHUyBpcyBsb2NhdGVkIGluIE5PTl9DT1JFX1BLR1MuZ21rCi0KLSMgVGhlIGluZGV4Lmh0bWwsIG9wdGlvbnMsIGFuZCBwYWNrYWdlcyBmaWxlcwotRE9DTEVUQVBJX0lOREVYX0ZJTEUgICAgPSAkKERPQ0xFVEFQSV9ET0NESVIpL2luZGV4Lmh0bWwKLURPQ0xFVEFQSV9PUFRJT05TX0ZJTEUgID0gJChET0NTVE1QRElSKS9kb2NsZXRhcGkub3B0aW9ucwotRE9DTEVUQVBJX1BBQ0tBR0VTX0ZJTEUgPSAkKERPQ1NUTVBESVIpL2RvY2xldGFwaS5wYWNrYWdlcwotCi1kb2NsZXRhcGlkb2NzOiAkKERPQ0xFVEFQSV9JTkRFWF9GSUxFKQotCi0jIFNldCByZWxhdGl2ZSBsb2NhdGlvbiB0byBjb3JlIGFwaSBkb2N1bWVudCByb290Ci0kKERPQ0xFVEFQSV9JTkRFWF9GSUxFKTogR0VUMkRPQ1NESVI9JChET0NMRVRBUEkyQ09SRUFQSSkvLi4KLQotIyBSdW4gamF2YWRvYyBpZiB0aGUgaW5kZXggZmlsZSBpcyBvdXQgb2YgZGF0ZSBvciBtaXNzaW5nCi0kKERPQ0xFVEFQSV9JTkRFWF9GSUxFKTogJChET0NMRVRBUElfT1BUSU9OU19GSUxFKSAkKERPQ0xFVEFQSV9QQUNLQUdFU19GSUxFKQotCSQocHJlcC1qYXZhZG9jKQotCSQoY2FsbCBKYXZhZG9jU3VtbWFyeSwkKERPQ0xFVEFQSV9PUFRJT05TX0ZJTEUpLCQoRE9DTEVUQVBJX1BBQ0tBR0VTX0ZJTEUpKQotCSQoSkFWQURPQ19DTUQpICQoSkFWQURPQ19WTV9NRU1PUllfRkxBR1MpIC1kICQoQEQpIFwKLQkgIEAkKERPQ0xFVEFQSV9PUFRJT05TX0ZJTEUpIEAkKERPQ0xFVEFQSV9QQUNLQUdFU19GSUxFKQotCi0jIENyZWF0ZSBmaWxlIHdpdGggamF2YWRvYyBvcHRpb25zIGluIGl0Ci0kKERPQ0xFVEFQSV9PUFRJT05TX0ZJTEUpOgotCSQocHJlcC10YXJnZXQpCi0JQCgkKGNhbGwgT3B0aW9uT25seSwkKENPTU1PTl9KQVZBRE9DRkxBR1MpKQkJCTsgXAotCSAgJChjYWxsIE9wdGlvblBhaXIsLXNvdXJjZXBhdGgsJChSRUxFQVNFRE9DU19TT1VSQ0VQQVRIKSkJOyBcCi0JICAkKGNhbGwgT3B0aW9uUGFpciwtZW5jb2RpbmcsYXNjaWkpCQkJCTsgXAotCSAgJChjYWxsIE9wdGlvbk9ubHksLWJyZWFraXRlcmF0b3IpCQkJCTsgXAotCSAgJChjYWxsIE9wdGlvblBhaXIsLWRvY3RpdGxlLCQoRE9DTEVUQVBJX0RPQ1RJVExFKSkJCTsgXAotCSAgJChjYWxsIE9wdGlvblBhaXIsLXdpbmRvd3RpdGxlLCQoRE9DTEVUQVBJX1dJTkRPV1RJVExFKSAkKERSQUZUX1dJTlRJVExFKSk7XAotCSAgJChjYWxsIE9wdGlvblBhaXIsLWhlYWRlciwkKERPQ0xFVEFQSV9IRUFERVIpJChEUkFGVF9IRUFERVIpKQk7IFwKLQkgICQoY2FsbCBPcHRpb25QYWlyLC1ib3R0b20sJChET0NMRVRBUElfQk9UVE9NKSQoRFJBRlRfQk9UVE9NKSkJOyBcCi0JICAkKGNhbGwgT3B0aW9uVHJpcCwtZ3JvdXAsJChET0NMRVRBUElfR1JPVVBOQU1FKSwkKERPQ0xFVEFQSV9SRUdFWFApKTsgXAotCSAgJChjYWxsIE9wdGlvblRyaXAsLWxpbmtvZmZsaW5lLCQoRE9DTEVUQVBJMkNPUkVBUEkpLCQoQ09SRUFQSV9ET0NTRElSKS8pOyBcCi0gICAgICAgICkgPj4gJEAKLQotIyBDcmVhdGUgYSBmaWxlIHdpdGggdGhlIHBhY2thZ2UgbmFtZXMgaW4gaXQKLSQoRE9DTEVUQVBJX1BBQ0tBR0VTX0ZJTEUpOiAkKERJUkVDVE9SWV9DQUNIRSkgJChjYWxsIFBhY2thZ2VEZXBlbmRlbmNpZXMsJChET0NMRVRBUElfUEtHUykpCi0JJChwcmVwLXRhcmdldCkKLQkkKGNhbGwgUGFja2FnZUZpbHRlciwkKERPQ0xFVEFQSV9QS0dTKSkKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyB0YWdsZXRhcGlkb2NzCi0jCi0KLSMgUGFydCBvZiBsYW5ndG9vbHMKLWlmZGVmIExBTkdUT09MU19ESVNUCi0gIEFMTF9PVEhFUl9UQVJHRVRTICs9IHRhZ2xldGFwaWRvY3MKLWVuZGlmCi0KLVRBR0xFVEFQSV9ET0NESVIgICA6PSAkKEpES19BUElfRE9DU0RJUikvamF2YWRvYy90YWdsZXQKLVRBR0xFVEFQSTJDT1JFQVBJICA6PSAuLi8uLi8kKEpES0pSRTJDT1JFQVBJKQotVEFHTEVUQVBJX0JPVFRPTSAgIDo9ICQoY2FsbCBDb21tb25UcmFkZW1hcmtCb3R0b20sJChUQUdMRVRBUElfRklSU1RfQ09QWVJJR0hUX1lFQVIpKQotIyBUQUdMRVRBUElfRklMRSBpcyBsb2NhdGVkIGluIE5PTl9DT1JFX1BLR1MuZ21rCi0KLSMgVGVtcG9yYXJ5IGRpcmVjdG9yeSAoc3BlY2lhbCBnZW5lcmF0aW9uIHJ1bGVzKQotVEFHTEVUQVBJX1RFTVBESVIgICAgICAgPSAkKERPQ1NUTVBESVIpL3RhZ2xldHNfdGVtcAotCi0jIFRoZSBpbmRleC5odG1sLCBvcHRpb25zLCBhbmQgcGFja2FnZXMgZmlsZXMKLVRBR0xFVEFQSV9JTkRFWF9GSUxFICAgID0gJChUQUdMRVRBUElfRE9DRElSKS9pbmRleC5odG1sCi1UQUdMRVRBUElfT1BUSU9OU19GSUxFICA9ICQoRE9DU1RNUERJUikvdGFnbGV0YXBpLm9wdGlvbnMKLVRBR0xFVEFQSV9QQUNLQUdFU19GSUxFID0gJChET0NTVE1QRElSKS90YWdsZXRhcGkucGFja2FnZXMKLQotdGFnbGV0YXBpZG9jczogJChUQUdMRVRBUElfSU5ERVhfRklMRSkKLQotIyBTZXQgcmVsYXRpdmUgbG9jYXRpb24gdG8gY29yZSBhcGkgZG9jdW1lbnQgcm9vdAotJChUQUdMRVRBUElfSU5ERVhfRklMRSk6IEdFVDJET0NTRElSPSQoVEFHTEVUQVBJMkNPUkVBUEkpLy4uCi0KLSMgUnVuIGphdmFkb2MgaWYgdGhlIGluZGV4IGZpbGUgaXMgb3V0IG9mIGRhdGUgb3IgbWlzc2luZwotJChUQUdMRVRBUElfSU5ERVhfRklMRSk6ICQoVEFHTEVUQVBJX09QVElPTlNfRklMRSkgJChUQUdMRVRBUElfUEFDS0FHRVNfRklMRSkKLQkkKHByZXAtamF2YWRvYykKLQkkKFJNKSAtciAkKFRBR0xFVEFQSV9URU1QRElSKQotCSQoTUtESVIpIC1wICQoVEFHTEVUQVBJX1RFTVBESVIpCi0JJChjYWxsIEphdmFkb2NTdW1tYXJ5LCQoVEFHTEVUQVBJX09QVElPTlNfRklMRSksJChUQUdMRVRBUElfUEFDS0FHRVNfRklMRSkpCi0JJChKQVZBRE9DX0NNRCkgJChKQVZBRE9DX1ZNX01FTU9SWV9GTEFHUykgLWQgJChUQUdMRVRBUElfVEVNUERJUikgXAotCSAgQCQoVEFHTEVUQVBJX09QVElPTlNfRklMRSkgQCQoVEFHTEVUQVBJX1BBQ0tBR0VTX0ZJTEUpCi0JY3AgLXIgJChUQUdMRVRBUElfVEVNUERJUikvY29tICQoQEQpCi0JY3AgJChUQUdMRVRBUElfVEVNUERJUikvc3R5bGVzaGVldC5jc3MgJChARCkKLQkkKFJNKSAtciAkKFRBR0xFVEFQSV9URU1QRElSKQotCi0jIENyZWF0ZSBmaWxlIHdpdGggamF2YWRvYyBvcHRpb25zIGluIGl0Ci0kKFRBR0xFVEFQSV9PUFRJT05TX0ZJTEUpOgotCSQocHJlcC10YXJnZXQpCi0JQCgkKGNhbGwgT3B0aW9uT25seSwkKENPTU1PTl9KQVZBRE9DRkxBR1MpKQkJCTsgXAotCSAgJChjYWxsIE9wdGlvblBhaXIsLXNvdXJjZXBhdGgsJChSRUxFQVNFRE9DU19TT1VSQ0VQQVRIKSkJOyBcCi0JICAkKGNhbGwgT3B0aW9uUGFpciwtZW5jb2RpbmcsYXNjaWkpCQkJCTsgXAotCSAgJChjYWxsIE9wdGlvbk9ubHksLW5vbmF2YmFyKQkJCQkJOyBcCi0JICAkKGNhbGwgT3B0aW9uT25seSwtbm9pbmRleCkJCQkJCTsgXAotCSAgJChjYWxsIE9wdGlvblBhaXIsLWJvdHRvbSwkKFRBR0xFVEFQSV9CT1RUT00pJChEUkFGVF9CT1RUT00pKQk7IFwKLQkgICQoY2FsbCBPcHRpb25UcmlwLC1saW5rb2ZmbGluZSwkKFRBR0xFVEFQSTJDT1JFQVBJKSwkKENPUkVBUElfRE9DU0RJUikvKTsgXAotICAgICAgICApID4+ICRACi0KLSMgQ3JlYXRlIGEgZmlsZSB3aXRoIHRoZSBwYWNrYWdlIG5hbWVzIGluIGl0Ci0kKFRBR0xFVEFQSV9QQUNLQUdFU19GSUxFKTogJChJTVBPUlRTUkNESVIpLyQoVEFHTEVUQVBJX0ZJTEUpCi0JJChwcmVwLXRhcmdldCkKLQlAKCQoRUNITykgIiQoSU1QT1JUU1JDRElSKS8kKFRBR0xFVEFQSV9GSUxFKSIgKSA+ICRACi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgZG9tYXBpZG9jcwotIwotCi1BTExfT1RIRVJfVEFSR0VUUyArPSBkb21hcGlkb2NzCi0KLURPTUFQSV9ET0NESVIgICAgICAgOj0gJChKUkVfQVBJX0RPQ1NESVIpL3BsdWdpbi9kb20KLURPTUFQSTJDT1JFQVBJICAgICAgOj0gLi4vLi4vJChKREtKUkUyQ09SRUFQSSkKLURPTUFQSV9ET0NUSVRMRSAgICAgOj0gQ29tbW9uIERPTSBBUEkKLURPTUFQSV9XSU5ET1dUSVRMRSAgOj0gQ29tbW9uIERPTSBBUEkKLURPTUFQSV9IRUFERVIgICAgICAgOj0gPHN0cm9uZz5Db21tb24gRE9NIEFQSTwvc3Ryb25nPgotRE9NQVBJX0JPVFRPTSAgICAgICA6PSAkKGNhbGwgQ29tbW9uVHJhZGVtYXJrQm90dG9tLCQoRE9NQVBJX0ZJUlNUX0NPUFlSSUdIVF9ZRUFSKSkKLURPTUFQSV9HUk9VUE5BTUUgICAgOj0gUGFja2FnZXMKLURPTUFQSV9SRUdFWFAgICAgICAgOj0gY29tLnN1bi5qYXZhLmJyb3dzZXIuZG9tOm9yZy53M2MuZG9tKgotIyBET01BUElfUEtHUyBpcyBsb2NhdGVkIGluIE5PTl9DT1JFX1BLR1MuZ21rCi0KLSMgVGhlIGluZGV4Lmh0bWwsIG9wdGlvbnMsIGFuZCBwYWNrYWdlcyBmaWxlcwotRE9NQVBJX0lOREVYX0ZJTEUgICAgPSAkKERPTUFQSV9ET0NESVIpL2luZGV4Lmh0bWwKLURPTUFQSV9PUFRJT05TX0ZJTEUgID0gJChET0NTVE1QRElSKS9kb21hcGkub3B0aW9ucwotRE9NQVBJX1BBQ0tBR0VTX0ZJTEUgPSAkKERPQ1NUTVBESVIpL2RvbWFwaS5wYWNrYWdlcwotCi1kb21hcGlkb2NzOiAkKERPTUFQSV9JTkRFWF9GSUxFKQotCi0jIFNldCByZWxhdGl2ZSBsb2NhdGlvbiB0byBjb3JlIGFwaSBkb2N1bWVudCByb290Ci0kKERPTUFQSV9JTkRFWF9GSUxFKTogR0VUMkRPQ1NESVI9JChET01BUEkyQ09SRUFQSSkvLi4KLQotIyBSdW4gamF2YWRvYyBpZiB0aGUgaW5kZXggZmlsZSBpcyBvdXQgb2YgZGF0ZSBvciBtaXNzaW5nCi0kKERPTUFQSV9JTkRFWF9GSUxFKTogJChET01BUElfT1BUSU9OU19GSUxFKSAkKERPTUFQSV9QQUNLQUdFU19GSUxFKQotCSQocHJlcC1qYXZhZG9jKQotCSQoY2FsbCBKYXZhZG9jU3VtbWFyeSwkKERPTUFQSV9PUFRJT05TX0ZJTEUpLCQoRE9NQVBJX1BBQ0tBR0VTX0ZJTEUpKQotCSQoSkFWQURPQ19DTUQpICQoSkFWQURPQ19WTV9NRU1PUllfRkxBR1MpIC1kICQoQEQpIFwKLQkgIEAkKERPTUFQSV9PUFRJT05TX0ZJTEUpIEAkKERPTUFQSV9QQUNLQUdFU19GSUxFKQotCi0jIENyZWF0ZSBmaWxlIHdpdGggamF2YWRvYyBvcHRpb25zIGluIGl0Ci0kKERPTUFQSV9PUFRJT05TX0ZJTEUpOgotCSQocHJlcC10YXJnZXQpCi0JQCgkKGNhbGwgT3B0aW9uT25seSwkKENPTU1PTl9KQVZBRE9DRkxBR1MpKQkJCTsgXAotCSAgJChjYWxsIE9wdGlvblBhaXIsLXNvdXJjZXBhdGgsJChSRUxFQVNFRE9DU19TT1VSQ0VQQVRIKSkJOyBcCi0JICAkKGNhbGwgT3B0aW9uUGFpciwtZW5jb2RpbmcsYXNjaWkpCQkJCTsgXAotCSAgJChjYWxsIE9wdGlvbk9ubHksLXNwbGl0SW5kZXgpCQkJCTsgXAotCSAgJChjYWxsIE9wdGlvblBhaXIsLWRvY3RpdGxlLCQoRE9NQVBJX0RPQ1RJVExFKSkJCTsgXAotCSAgJChjYWxsIE9wdGlvblBhaXIsLXdpbmRvd3RpdGxlLCQoRE9NQVBJX1dJTkRPV1RJVExFKSAkKERSQUZUX1dJTlRJVExFKSk7XAotCSAgJChjYWxsIE9wdGlvblBhaXIsLWhlYWRlciwkKERPTUFQSV9IRUFERVIpJChEUkFGVF9IRUFERVIpKQk7IFwKLQkgICQoY2FsbCBPcHRpb25QYWlyLC1ib3R0b20sJChET01BUElfQk9UVE9NKSQoRFJBRlRfQk9UVE9NKSkJOyBcCi0JICAkKGNhbGwgT3B0aW9uVHJpcCwtZ3JvdXAsJChET01BUElfR1JPVVBOQU1FKSwkKERPTUFQSV9SRUdFWFApKTsgXAotCSAgJChjYWxsIE9wdGlvblRyaXAsLWxpbmtvZmZsaW5lLCQoRE9NQVBJMkNPUkVBUEkpLCQoQ09SRUFQSV9ET0NTRElSKS8pOyBcCi0gICAgICAgICkgPj4gJEAKLQotIyBDcmVhdGUgYSBmaWxlIHdpdGggdGhlIHBhY2thZ2UgbmFtZXMgaW4gaXQKLSQoRE9NQVBJX1BBQ0tBR0VTX0ZJTEUpOiAkKERJUkVDVE9SWV9DQUNIRSkgJChjYWxsIFBhY2thZ2VEZXBlbmRlbmNpZXMsJChET01BUElfUEtHUykpCi0JJChwcmVwLXRhcmdldCkKLQkkKGNhbGwgUGFja2FnZUZpbHRlciwkKERPTUFQSV9QS0dTKSkKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyBqcGRhZG9jcwotIwotCi1BTExfT1RIRVJfVEFSR0VUUyArPSBqcGRhZG9jcwotCi1qcGRhZG9jczogamRpZG9jcyBqZHdwZG9jcyBqdm10aWRvY3MKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyBqZGlkb2NzCi0jCi0KLUFMTF9PVEhFUl9UQVJHRVRTICs9IGpkaWRvY3MKLQotSkRJX0RPQ0RJUiAgICAgIDo9ICQoSkRLX0FQSV9ET0NTRElSKS9qcGRhL2pkaQotSkRJMkNPUkVBUEkgICAgIDo9IC4uLy4uLyQoSkRLSlJFMkNPUkVBUEkpCi1KRElfRE9DVElUTEUgICAgOj0gSmF2YSQoVFJBREVNQVJLKSBEZWJ1ZyBJbnRlcmZhY2UKLUpESV9XSU5ET1dUSVRMRSA6PSBKYXZhIERlYnVnIEludGVyZmFjZQotSkRJX0hFQURFUiAgICAgIDo9IDxzdHJvbmc+SmF2YSBEZWJ1ZyBJbnRlcmZhY2U8L3N0cm9uZz4KLUpESV9CT1RUT00gICAgICA6PSAkKGNhbGwgQ29tbW9uQm90dG9tLCQoSkRJX0ZJUlNUX0NPUFlSSUdIVF9ZRUFSKSkKLUpESV9PVkVSVklFVyAgICA6PSAkKFNIQVJFX1NSQykvY2xhc3Nlcy9qZGktb3ZlcnZpZXcuaHRtbAotIyBKRElfUEtHUyBpcyBsb2NhdGVkIGluIE5PTl9DT1JFX1BLR1MuZ21rCi0KLSMgVGhlIGluZGV4Lmh0bWwsIG9wdGlvbnMsIGFuZCBwYWNrYWdlcyBmaWxlcwotSkRJX0lOREVYX0ZJTEUgICAgPSAkKEpESV9ET0NESVIpL2luZGV4Lmh0bWwKLUpESV9PUFRJT05TX0ZJTEUgID0gJChET0NTVE1QRElSKS9qZGkub3B0aW9ucwotSkRJX1BBQ0tBR0VTX0ZJTEUgPSAkKERPQ1NUTVBESVIpL2pkaS5wYWNrYWdlcwotCi1qZGlkb2NzOiAkKEpESV9JTkRFWF9GSUxFKQotCi0jIFNldCByZWxhdGl2ZSBsb2NhdGlvbiB0byBjb3JlIGFwaSBkb2N1bWVudCByb290Ci0kKEpESV9JTkRFWF9GSUxFKTogR0VUMkRPQ1NESVI9JChKREkyQ09SRUFQSSkvLi4KLQotIyBSdW4gamF2YWRvYyBpZiB0aGUgaW5kZXggZmlsZSBpcyBvdXQgb2YgZGF0ZSBvciBtaXNzaW5nCi0kKEpESV9JTkRFWF9GSUxFKTogJChKRElfT1BUSU9OU19GSUxFKSAkKEpESV9QQUNLQUdFU19GSUxFKQotCSQocHJlcC1qYXZhZG9jKQotCSQoY2FsbCBKYXZhZG9jU3VtbWFyeSwkKEpESV9PUFRJT05TX0ZJTEUpLCQoSkRJX1BBQ0tBR0VTX0ZJTEUpKQotCSQoSkFWQURPQ19DTUQpICQoSkFWQURPQ19WTV9NRU1PUllfRkxBR1MpIC1kICQoQEQpIFwKLQkgIEAkKEpESV9PUFRJT05TX0ZJTEUpIEAkKEpESV9QQUNLQUdFU19GSUxFKQotCi0jIENyZWF0ZSBmaWxlIHdpdGggamF2YWRvYyBvcHRpb25zIGluIGl0Ci0kKEpESV9PUFRJT05TX0ZJTEUpOiAkKEpESV9PVkVSVklFVykKLQkkKHByZXAtdGFyZ2V0KQotCUAoJChjYWxsIE9wdGlvbk9ubHksJChDT01NT05fSkFWQURPQ0ZMQUdTKSkJCQk7IFwKLQkgICQoY2FsbCBPcHRpb25QYWlyLC1zb3VyY2VwYXRoLCQoUkVMRUFTRURPQ1NfU09VUkNFUEFUSCkpCTsgXAotCSAgJChjYWxsIE9wdGlvblBhaXIsLWVuY29kaW5nLGFzY2lpKQkJCQk7IFwKLQkgICQoY2FsbCBPcHRpb25QYWlyLC1vdmVydmlldywkKEpESV9PVkVSVklFVykpCQkJOyBcCi0JICAkKGNhbGwgT3B0aW9uUGFpciwtZG9jdGl0bGUsJChKRElfRE9DVElUTEUpKQkJCTsgXAotCSAgJChjYWxsIE9wdGlvblBhaXIsLXdpbmRvd3RpdGxlLCQoSkRJX1dJTkRPV1RJVExFKSAkKERSQUZUX1dJTlRJVExFKSk7IFwKLQkgICQoY2FsbCBPcHRpb25QYWlyLC1oZWFkZXIsJChKRElfSEVBREVSKSQoRFJBRlRfSEVBREVSKSkJOyBcCi0JICAkKGNhbGwgT3B0aW9uUGFpciwtYm90dG9tLCQoSkRJX0JPVFRPTSkkKERSQUZUX0JPVFRPTSkpCTsgXAotCSAgJChjYWxsIE9wdGlvblRyaXAsLWxpbmtvZmZsaW5lLCQoSkRJMkNPUkVBUEkpLCQoQ09SRUFQSV9ET0NTRElSKS8pOyBcCi0gICAgICAgICkgPj4gJEAKLQotIyBDcmVhdGUgYSBmaWxlIHdpdGggdGhlIHBhY2thZ2UgbmFtZXMgaW4gaXQKLSQoSkRJX1BBQ0tBR0VTX0ZJTEUpOiAkKERJUkVDVE9SWV9DQUNIRSkgJChjYWxsIFBhY2thZ2VEZXBlbmRlbmNpZXMsJChKRElfUEtHUykpCi0JJChwcmVwLXRhcmdldCkKLQkkKGNhbGwgUGFja2FnZUZpbHRlciwkKEpESV9QS0dTKSkKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyBqZHdwZG9jcwotIwotCi1BTExfT1RIRVJfVEFSR0VUUyArPSBqZHdwZG9jcwotCi1KRFdQX0RPQ0RJUiAgICAgPSAkKFBMQVRGT1JNX0RPQ1NESVIpL2pwZGEvamR3cAotSkRXUF9TUEVDICAgICAgID0gJChCVUlMRERJUikvanBkYS9qZHdwL2pkd3Auc3BlYwotCi1qZHdwZG9jczogJChKRFdQX0RPQ0RJUikvamR3cC1wcm90b2NvbC5odG1sCi0kKEpEV1BfRE9DRElSKS9qZHdwLXByb3RvY29sLmh0bWw6ICQoQlVJTERfVE9PTFMpICQoSkRXUF9TUEVDKQotCSQocHJlcC1qYXZhZG9jKQotCSQoVE9PTF9KRFdQR0VOKSAkKEpEV1BfU1BFQykgLWRvYyAkQAotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jIGp2bXRpZG9jcwotIwotCi1BTExfT1RIRVJfVEFSR0VUUyArPSBqdm10aWRvY3MKLQotSlZNVElfRE9DRElSICAgICAgPSAkKFBMQVRGT1JNX0RPQ1NESVIpL2p2bXRpCi1KVk1USV9IVE1MICAgICAgICA9ICQoSE9UU1BPVF9ET0NTX0lNUE9SVF9QQVRIKS9wbGF0Zm9ybS9qdm10aS9qdm10aS5odG1sCi0KLWp2bXRpZG9jczogICQoSlZNVElfRE9DRElSKS9qdm10aS5odG1sCi0kKEpWTVRJX0RPQ0RJUikvanZtdGkuaHRtbDoKLQlAJChwcmVwLWphdmFkb2MpCi0JQGlmIFsgLWYgJChKVk1USV9IVE1MKSBdIDsgdGhlbgkJICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSAgJChFQ0hPKSAiJChDUCkgJChKVk1USV9IVE1MKSAkQCI7ICAgICAgICAgICAgICAgICAJICAgICAgICAgICBcCi0JICAkKENQKSAkKEpWTVRJX0hUTUwpICRAOyAJICAgICAgICAgICAgICAgICAJICAgICAgICAgICBcCi0JZWxzZSAJCQkJCQkgICAgICAgICAgICAgICAgICAgXAotCSAgJChFQ0hPKSAiV0FSTklORzogR2VuZXJhdGVkIGZpbGUgZG9lcyBub3QgZXhpc3Q6ICQoSlZNVElfSFRNTCkiOyBcCi0JZmkKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyBqYWFzZG9jcwotIwotCi1BTExfT1RIRVJfVEFSR0VUUyArPSBqYWFzZG9jcwotCi1KQUFTX0RPQ0RJUgkgOj0gJChKUkVfQVBJX0RPQ1NESVIpL3NlY3VyaXR5L2phYXMvc3BlYwotSkFBUzJDT1JFQVBJICAgICA6PSAuLi8uLi8uLi8kKEpES0pSRTJDT1JFQVBJKQotSkFBU19ET0NUSVRMRSAgICA6PSBKYXZhJChUUkFERU1BUkspIEF1dGhlbnRpY2F0aW9uIGFuZCBBdXRob3JpemF0aW9uIFNlcnZpY2UKLUpBQVNfV0lORE9XVElUTEUgOj0gSmF2YSBBdXRoZW50aWNhdGlvbiBhbmQgQXV0aG9yaXphdGlvbiBTZXJ2aWNlCi1KQUFTX0hFQURFUiAgICAgIDo9IDxzdHJvbmc+SmF2YSBBdXRoZW50aWNhdGlvbiBhbmQgQXV0aG9yaXphdGlvbiBTZXJ2aWNlPC9zdHJvbmc+Ci1KQUFTX0JPVFRPTSAgICAgIDo9ICQoY2FsbCBDb21tb25Cb3R0b20sJChKQUFTX0ZJUlNUX0NPUFlSSUdIVF9ZRUFSKSkKLSMgSkFBU19QS0dTIGlzIGxvY2F0ZWQgaW4gTk9OX0NPUkVfUEtHUy5nbWsKLUpBQVNfT1ZFUlZJRVcgICAgOj0gJChTSEFSRV9TUkMpL2NsYXNzZXMvY29tL3N1bi9zZWN1cml0eS9hdXRoL2phYXMtb3ZlcnZpZXcuaHRtbAotCi0jIFRoZSBpbmRleC5odG1sLCBvcHRpb25zLCBhbmQgcGFja2FnZXMgZmlsZXMKLUpBQVNfSU5ERVhfRklMRSAgICA9ICQoSkFBU19ET0NESVIpL2luZGV4Lmh0bWwKLUpBQVNfT1BUSU9OU19GSUxFICA9ICQoRE9DU1RNUERJUikvamFhcy5vcHRpb25zCi1KQUFTX1BBQ0tBR0VTX0ZJTEUgPSAkKERPQ1NUTVBESVIpL2phYXMucGFja2FnZXMKLQotamFhc2RvY3M6ICQoSkFBU19JTkRFWF9GSUxFKQotCi0jIFNldCByZWxhdGl2ZSBsb2NhdGlvbiB0byBjb3JlIGFwaSBkb2N1bWVudCByb290Ci0kKEpBQVNfSU5ERVhfRklMRSk6IEdFVDJET0NTRElSPSQoSkFBUzJDT1JFQVBJKS8uLgotCi0jIFJ1biBqYXZhZG9jIGlmIHRoZSBpbmRleCBmaWxlIGlzIG91dCBvZiBkYXRlIG9yIG1pc3NpbmcKLSQoSkFBU19JTkRFWF9GSUxFKTogJChKQUFTX09QVElPTlNfRklMRSkgJChKQUFTX1BBQ0tBR0VTX0ZJTEUpCi0JJChwcmVwLWphdmFkb2MpCi0JJChjYWxsIEphdmFkb2NTdW1tYXJ5LCQoSkFBU19PUFRJT05TX0ZJTEUpLCQoSkFBU19QQUNLQUdFU19GSUxFKSkKLQkkKEpBVkFET0NfQ01EKSAkKEpBVkFET0NfVk1fTUVNT1JZX0ZMQUdTKSAtZCAkKEBEKSBcCi0JICBAJChKQUFTX09QVElPTlNfRklMRSkgQCQoSkFBU19QQUNLQUdFU19GSUxFKQotCi0jIENyZWF0ZSBmaWxlIHdpdGggamF2YWRvYyBvcHRpb25zIGluIGl0Ci0kKEpBQVNfT1BUSU9OU19GSUxFKTogJChKQUFTX09WRVJWSUVXKQotCSQocHJlcC10YXJnZXQpCi0JQCgkKGNhbGwgT3B0aW9uT25seSwkKENPTU1PTl9KQVZBRE9DRkxBR1MpKQkJCTsgXAotCSAgJChjYWxsIE9wdGlvblBhaXIsLXNvdXJjZXBhdGgsJChSRUxFQVNFRE9DU19TT1VSQ0VQQVRIKSkJOyBcCi0JICAkKGNhbGwgT3B0aW9uUGFpciwtZW5jb2RpbmcsYXNjaWkpCQkJCTsgXAotCSAgJChjYWxsIE9wdGlvblBhaXIsLW92ZXJ2aWV3LCQoSkFBU19PVkVSVklFVykpCQkJOyBcCi0JICAkKGNhbGwgT3B0aW9uUGFpciwtZG9jdGl0bGUsJChKQUFTX0RPQ1RJVExFKSkJCQk7IFwKLQkgICQoY2FsbCBPcHRpb25QYWlyLC13aW5kb3d0aXRsZSwkKEpBQVNfV0lORE9XVElUTEUpICQoRFJBRlRfV0lOVElUTEUpKTsgXAotCSAgJChjYWxsIE9wdGlvblBhaXIsLWhlYWRlciwkKEpBQVNfSEVBREVSKSQoRFJBRlRfSEVBREVSKSkJOyBcCi0JICAkKGNhbGwgT3B0aW9uUGFpciwtYm90dG9tLCQoSkFBU19CT1RUT00pJChEUkFGVF9CT1RUT00pKQk7IFwKLQkgICQoY2FsbCBPcHRpb25UcmlwLC1saW5rb2ZmbGluZSwkKEpBQVMyQ09SRUFQSSksJChDT1JFQVBJX0RPQ1NESVIpLyk7IFwKLSAgICAgICAgKSA+PiAkQAotCi0jIENyZWF0ZSBhIGZpbGUgd2l0aCB0aGUgcGFja2FnZSBuYW1lcyBpbiBpdAotJChKQUFTX1BBQ0tBR0VTX0ZJTEUpOiAkKERJUkVDVE9SWV9DQUNIRSkgJChjYWxsIFBhY2thZ2VEZXBlbmRlbmNpZXMsJChKQUFTX1BLR1MpKQotCSQocHJlcC10YXJnZXQpCi0JJChjYWxsIFBhY2thZ2VGaWx0ZXIsJChKQUFTX1BLR1MpKQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jIGpnc3Nkb2NzCi0jCi0KLUFMTF9PVEhFUl9UQVJHRVRTICs9IGpnc3Nkb2NzCi0KLUpHU1NfRE9DRElSCSA6PSAkKEpSRV9BUElfRE9DU0RJUikvc2VjdXJpdHkvamdzcy9zcGVjCi1KR1NTMkNPUkVBUEkgICAgIDo9IC4uLy4uLy4uLyQoSkRLSlJFMkNPUkVBUEkpCi1KR1NTX0RPQ1RJVExFICAgIDo9IEphdmEkKFRSQURFTUFSSykgR1NTLUFQSSBVdGlsaXRpZXMKLUpHU1NfV0lORE9XVElUTEUgOj0gSmF2YSBHU1MtQVBJIFV0aWxpdGllcwotSkdTU19IRUFERVIgICAgICA6PSA8c3Ryb25nPkphdmEgR1NTLUFQSSBVdGlsaXRpZXM8L3N0cm9uZz4KLUpHU1NfQk9UVE9NICAgICAgOj0gJChjYWxsIENvbW1vbkJvdHRvbSwkKEpHU1NfRklSU1RfQ09QWVJJR0hUX1lFQVIpKQotSkdTU19PVkVSVklFVyAgICA6PSAkKFNIQVJFX1NSQykvY2xhc3Nlcy9jb20vc3VuL3NlY3VyaXR5L2pnc3Mvamdzcy1vdmVydmlldy5odG1sCi0jIEpHU1NfUEtHUyBpcyBsb2NhdGVkIGluIE5PTl9DT1JFX1BLR1MuZ21rCi0KLSMgVGhlIGluZGV4Lmh0bWwsIG9wdGlvbnMsIGFuZCBwYWNrYWdlcyBmaWxlcwotSkdTU19JTkRFWF9GSUxFICAgID0gJChKR1NTX0RPQ0RJUikvaW5kZXguaHRtbAotSkdTU19PUFRJT05TX0ZJTEUgID0gJChET0NTVE1QRElSKS9qZ3NzLm9wdGlvbnMKLUpHU1NfUEFDS0FHRVNfRklMRSA9ICQoRE9DU1RNUERJUikvamdzcy5wYWNrYWdlcwotCi1qZ3NzZG9jczogJChKR1NTX0lOREVYX0ZJTEUpCi0KLSMgU2V0IHJlbGF0aXZlIGxvY2F0aW9uIHRvIGNvcmUgYXBpIGRvY3VtZW50IHJvb3QKLSQoSkdTU19JTkRFWF9GSUxFKTogR0VUMkRPQ1NESVI9JChKR1NTMkNPUkVBUEkpLy4uCi0KLSMgUnVuIGphdmFkb2MgaWYgdGhlIGluZGV4IGZpbGUgaXMgb3V0IG9mIGRhdGUgb3IgbWlzc2luZwotJChKR1NTX0lOREVYX0ZJTEUpOiAkKEpHU1NfT1BUSU9OU19GSUxFKSAkKEpHU1NfUEFDS0FHRVNfRklMRSkKLQkkKHByZXAtamF2YWRvYykKLQkkKGNhbGwgSmF2YWRvY1N1bW1hcnksJChKR1NTX09QVElPTlNfRklMRSksJChKR1NTX1BBQ0tBR0VTX0ZJTEUpKQotCSQoSkFWQURPQ19DTUQpICQoSkFWQURPQ19WTV9NRU1PUllfRkxBR1MpIC1kICQoQEQpIFwKLQkgIEAkKEpHU1NfT1BUSU9OU19GSUxFKSBAJChKR1NTX1BBQ0tBR0VTX0ZJTEUpCi0KLSMgQ3JlYXRlIGZpbGUgd2l0aCBqYXZhZG9jIG9wdGlvbnMgaW4gaXQKLSQoSkdTU19PUFRJT05TX0ZJTEUpOiAkKEpHU1NfT1ZFUlZJRVcpCi0JJChwcmVwLXRhcmdldCkKLQlAKCQoY2FsbCBPcHRpb25Pbmx5LCQoQ09NTU9OX0pBVkFET0NGTEFHUykpCQkJOyBcCi0JICAkKGNhbGwgT3B0aW9uUGFpciwtc291cmNlcGF0aCwkKFJFTEVBU0VET0NTX1NPVVJDRVBBVEgpKQk7IFwKLQkgICQoY2FsbCBPcHRpb25QYWlyLC1lbmNvZGluZyxhc2NpaSkJCQkJOyBcCi0JICAkKGNhbGwgT3B0aW9uT25seSwtbm9kZXByZWNhdGVkbGlzdCkJCQkJOyBcCi0JICAkKGNhbGwgT3B0aW9uUGFpciwtb3ZlcnZpZXcsJChKR1NTX09WRVJWSUVXKSkJCQk7IFwKLQkgICQoY2FsbCBPcHRpb25QYWlyLC1kb2N0aXRsZSwkKEpHU1NfRE9DVElUTEUpKQkJCTsgXAotCSAgJChjYWxsIE9wdGlvblBhaXIsLXdpbmRvd3RpdGxlLCQoSkdTU19XSU5ET1dUSVRMRSkgJChEUkFGVF9XSU5USVRMRSkpOyBcCi0JICAkKGNhbGwgT3B0aW9uUGFpciwtaGVhZGVyLCQoSkdTU19IRUFERVIpJChEUkFGVF9IRUFERVIpKQk7IFwKLQkgICQoY2FsbCBPcHRpb25QYWlyLC1ib3R0b20sJChKR1NTX0JPVFRPTSkkKERSQUZUX0JPVFRPTSkpCTsgXAotCSAgJChjYWxsIE9wdGlvblRyaXAsLWxpbmtvZmZsaW5lLCQoSkdTUzJDT1JFQVBJKSwkKENPUkVBUElfRE9DU0RJUikvKTsgXAotICAgICAgICApID4+ICRACi0KLSMgQ3JlYXRlIGEgZmlsZSB3aXRoIHRoZSBwYWNrYWdlIG5hbWVzIGluIGl0Ci0kKEpHU1NfUEFDS0FHRVNfRklMRSk6ICQoRElSRUNUT1JZX0NBQ0hFKSAkKGNhbGwgUGFja2FnZURlcGVuZGVuY2llcywkKEpHU1NfUEtHUykpCi0JJChwcmVwLXRhcmdldCkKLQkkKGNhbGwgUGFja2FnZUZpbHRlciwkKEpHU1NfUEtHUykpCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgc21hcnRjYXJkaW9kb2NzCi0jCi0KLUFMTF9PVEhFUl9UQVJHRVRTICs9IHNtYXJ0Y2FyZGlvZG9jcwotCi1TTUFSVENBUkRJT19ET0NESVIJOj0gJChKUkVfQVBJX0RPQ1NESVIpL3NlY3VyaXR5L3NtYXJ0Y2FyZGlvL3NwZWMKLVNNQVJUQ0FSRElPMkNPUkVBUEkgICAgIDo9IC4uLy4uLy4uLyQoSkRLSlJFMkNPUkVBUEkpCi1TTUFSVENBUkRJT19ET0NUSVRMRSAgICA6PSBKYXZhJChUUkFERU1BUkspIFNtYXJ0IENhcmQgSS9PCi1TTUFSVENBUkRJT19XSU5ET1dUSVRMRSA6PSBKYXZhIFNtYXJ0IENhcmQgSS9PCi1TTUFSVENBUkRJT19IRUFERVIgICAgICA6PSA8c3Ryb25nPkphdmEgU21hcnQgQ2FyZCBJL088L3N0cm9uZz4KLVNNQVJUQ0FSRElPX0JPVFRPTSAgICAgIDo9ICQoY2FsbCBDb21tb25Cb3R0b20sJChTTUFSVENBUkRJT19GSVJTVF9DT1BZUklHSFRfWUVBUikpCi0jIFNNQVJUQ0FSRElPX1BLR1MgaXMgbG9jYXRlZCBpbiBOT05fQ09SRV9QS0dTLmdtawotCi0jIFRoZSBpbmRleC5odG1sLCBvcHRpb25zLCBhbmQgcGFja2FnZXMgZmlsZXMKLVNNQVJUQ0FSRElPX0lOREVYX0ZJTEUgICAgPSAkKFNNQVJUQ0FSRElPX0RPQ0RJUikvaW5kZXguaHRtbAotU01BUlRDQVJESU9fT1BUSU9OU19GSUxFICA9ICQoRE9DU1RNUERJUikvc21hcnRjYXJkaW8ub3B0aW9ucwotU01BUlRDQVJESU9fUEFDS0FHRVNfRklMRSA9ICQoRE9DU1RNUERJUikvc21hcnRjYXJkaW8ucGFja2FnZXMKLQotc21hcnRjYXJkaW9kb2NzOiAkKFNNQVJUQ0FSRElPX0lOREVYX0ZJTEUpCi0KLSMgU2V0IHJlbGF0aXZlIGxvY2F0aW9uIHRvIGNvcmUgYXBpIGRvY3VtZW50IHJvb3QKLSQoU01BUlRDQVJESU9fSU5ERVhfRklMRSk6IEdFVDJET0NTRElSPSQoU01BUlRDQVJESU8yQ09SRUFQSSkvLi4KLQotIyBSdW4gamF2YWRvYyBpZiB0aGUgaW5kZXggZmlsZSBpcyBvdXQgb2YgZGF0ZSBvciBtaXNzaW5nCi0kKFNNQVJUQ0FSRElPX0lOREVYX0ZJTEUpOiAkKFNNQVJUQ0FSRElPX09QVElPTlNfRklMRSkgJChTTUFSVENBUkRJT19QQUNLQUdFU19GSUxFKQotCSQocHJlcC1qYXZhZG9jKQotCSQoY2FsbCBKYXZhZG9jU3VtbWFyeSwkKFNNQVJUQ0FSRElPX09QVElPTlNfRklMRSksJChTTUFSVENBUkRJT19QQUNLQUdFU19GSUxFKSkKLQkkKEpBVkFET0NfQ01EKSAkKEpBVkFET0NfVk1fTUVNT1JZX0ZMQUdTKSAtZCAkKEBEKSBcCi0JICBAJChTTUFSVENBUkRJT19PUFRJT05TX0ZJTEUpIEAkKFNNQVJUQ0FSRElPX1BBQ0tBR0VTX0ZJTEUpCi0KLSMgQ3JlYXRlIGZpbGUgd2l0aCBqYXZhZG9jIG9wdGlvbnMgaW4gaXQKLSQoU01BUlRDQVJESU9fT1BUSU9OU19GSUxFKToKLQkkKHByZXAtdGFyZ2V0KQotCUAoJChjYWxsIE9wdGlvbk9ubHksJChDT01NT05fSkFWQURPQ0ZMQUdTKSkJCQk7IFwKLQkgICQoY2FsbCBPcHRpb25QYWlyLC1zb3VyY2VwYXRoLCQoUkVMRUFTRURPQ1NfU09VUkNFUEFUSCkpCTsgXAotCSAgJChjYWxsIE9wdGlvblBhaXIsLWVuY29kaW5nLGFzY2lpKQkJCQk7IFwKLQkgICQoY2FsbCBPcHRpb25Pbmx5LC1ub2RlcHJlY2F0ZWRsaXN0KQkJCQk7IFwKLQkgICQoY2FsbCBPcHRpb25QYWlyLC1kb2N0aXRsZSwkKFNNQVJUQ0FSRElPX0RPQ1RJVExFKSkJCTsgXAotCSAgJChjYWxsIE9wdGlvblBhaXIsLXdpbmRvd3RpdGxlLCQoU01BUlRDQVJESU9fV0lORE9XVElUTEUpICQoRFJBRlRfV0lOVElUTEUpKTtcCi0JICAkKGNhbGwgT3B0aW9uUGFpciwtaGVhZGVyLCQoU01BUlRDQVJESU9fSEVBREVSKSQoRFJBRlRfSEVBREVSKSk7IFwKLQkgICQoY2FsbCBPcHRpb25QYWlyLC1ib3R0b20sJChTTUFSVENBUkRJT19CT1RUT00pJChEUkFGVF9CT1RUT00pKTsgXAotCSAgJChjYWxsIE9wdGlvblRyaXAsLWxpbmtvZmZsaW5lLCQoU01BUlRDQVJESU8yQ09SRUFQSSksJChDT1JFQVBJX0RPQ1NESVIpLyk7IFwKLSAgICAgICAgKSA+PiAkQAotCi0jIENyZWF0ZSBhIGZpbGUgd2l0aCB0aGUgcGFja2FnZSBuYW1lcyBpbiBpdAotJChTTUFSVENBUkRJT19QQUNLQUdFU19GSUxFKTogJChESVJFQ1RPUllfQ0FDSEUpICQoY2FsbCBQYWNrYWdlRGVwZW5kZW5jaWVzLCQoU01BUlRDQVJESU9fUEtHUykpCi0JJChwcmVwLXRhcmdldCkKLQkkKGNhbGwgUGFja2FnZUZpbHRlciwkKFNNQVJUQ0FSRElPX1BLR1MpKQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jIGh0dHBzZXJ2ZXJkb2NzCi0jCi0KLUFMTF9PVEhFUl9UQVJHRVRTICs9IGh0dHBzZXJ2ZXJkb2NzCi0KLUhUVFBTRVJWRVJfRE9DRElSICAgICAgOj0gJChKUkVfQVBJX0RPQ1NESVIpL25ldC9odHRwc2VydmVyL3NwZWMKLUhUVFBTRVJWRVIyQ09SRUFQSSAgICAgOj0gLi4vLi4vLi4vJChKREtKUkUyQ09SRUFQSSkKLUhUVFBTRVJWRVJfRE9DVElUTEUgICAgOj0gSmF2YSQoVFJBREVNQVJLKSBIVFRQIFNlcnZlcgotSFRUUFNFUlZFUl9XSU5ET1dUSVRMRSA6PSBKYXZhIEhUVFAgU2VydmVyCi1IVFRQU0VSVkVSX0hFQURFUiAgICAgIDo9IDxzdHJvbmc+SmF2YSBIVFRQIFNlcnZlcjwvc3Ryb25nPgotSFRUUFNFUlZFUl9CT1RUT00gICAgICA6PSAkKGNhbGwgQ29tbW9uQm90dG9tLCQoSFRUUFNFUlZFUl9GSVJTVF9DT1BZUklHSFRfWUVBUikpCi0jIEhUVFBTRVJWRVJfUEtHUyBpcyBsb2NhdGVkIGluIE5PTl9DT1JFX1BLR1MuZ21rCi0KLUhUVFBTRVJWRVJfSU5ERVhfSFRNTCAgICA9ICQoSFRUUFNFUlZFUl9ET0NESVIpL2luZGV4Lmh0bWwKLUhUVFBTRVJWRVJfT1BUSU9OU19GSUxFICA9ICQoRE9DU1RNUERJUikvaHR0cHNlcnZlci5vcHRpb25zCi1IVFRQU0VSVkVSX1BBQ0tBR0VTX0ZJTEUgPSAkKERPQ1NUTVBESVIpL2h0dHBzZXJ2ZXIucGFja2FnZXMKLQotaHR0cHNlcnZlcmRvY3M6ICQoSFRUUFNFUlZFUl9JTkRFWF9IVE1MKQotCi0jIFNldCByZWxhdGl2ZSBsb2NhdGlvbiB0byBjb3JlIGFwaSBkb2N1bWVudCByb290Ci0kKEhUVFBTRVJWRVJfSU5ERVhfSFRNTCk6IEdFVDJET0NTRElSPSQoSFRUUFNFUlZFUjJDT1JFQVBJKS8uLgotCi0jIFJ1biBqYXZhZG9jIGlmIHRoZSBpbmRleCBmaWxlIGlzIG91dCBvZiBkYXRlIG9yIG1pc3NpbmcKLSQoSFRUUFNFUlZFUl9JTkRFWF9IVE1MKTogJChIVFRQU0VSVkVSX09QVElPTlNfRklMRSkgJChIVFRQU0VSVkVSX1BBQ0tBR0VTX0ZJTEUpCi0JJChwcmVwLWphdmFkb2MpCi0JJChjYWxsIEphdmFkb2NTdW1tYXJ5LCQoSFRUUFNFUlZFUl9PUFRJT05TX0ZJTEUpLCQoSFRUUFNFUlZFUl9QQUNLQUdFU19GSUxFKSkKLQkkKEpBVkFET0NfQ01EKSAkKEpBVkFET0NfVk1fTUVNT1JZX0ZMQUdTKSAtZCAkKEBEKSBcCi0JICBAJChIVFRQU0VSVkVSX09QVElPTlNfRklMRSkgQCQoSFRUUFNFUlZFUl9QQUNLQUdFU19GSUxFKQotCi0jIENyZWF0ZSBmaWxlIHdpdGggamF2YWRvYyBvcHRpb25zIGluIGl0Ci0kKEhUVFBTRVJWRVJfT1BUSU9OU19GSUxFKToKLQkkKHByZXAtdGFyZ2V0KQotCUAoJChjYWxsIE9wdGlvbk9ubHksJChDT01NT05fSkFWQURPQ0ZMQUdTKSkJCQk7IFwKLQkgICQoY2FsbCBPcHRpb25QYWlyLC1zb3VyY2VwYXRoLCQoUkVMRUFTRURPQ1NfU09VUkNFUEFUSCkpCTsgXAotCSAgJChjYWxsIE9wdGlvblBhaXIsLWVuY29kaW5nLGFzY2lpKQkJCQk7IFwKLQkgICQoY2FsbCBPcHRpb25Pbmx5LC1ub2RlcHJlY2F0ZWRsaXN0KQkJCQk7IFwKLQkgICQoY2FsbCBPcHRpb25QYWlyLC1kb2N0aXRsZSwkKEhUVFBTRVJWRVJfRE9DVElUTEUpKQkJOyBcCi0JICAkKGNhbGwgT3B0aW9uUGFpciwtd2luZG93dGl0bGUsJChIVFRQU0VSVkVSX1dJTkRPV1RJVExFKSAkKERSQUZUX1dJTlRJVExFKSk7XAotCSAgJChjYWxsIE9wdGlvblBhaXIsLWhlYWRlciwkKEhUVFBTRVJWRVJfSEVBREVSKSQoRFJBRlRfSEVBREVSKSk7IFwKLQkgICQoY2FsbCBPcHRpb25QYWlyLC1ib3R0b20sJChIVFRQU0VSVkVSX0JPVFRPTSkkKERSQUZUX0JPVFRPTSkpOyBcCi0JICAkKGNhbGwgT3B0aW9uVHJpcCwtbGlua29mZmxpbmUsJChIVFRQU0VSVkVSMkNPUkVBUEkpLCQoQ09SRUFQSV9ET0NTRElSKS8pOyBcCi0gICAgICAgICkgPj4gJEAKLQotIyBDcmVhdGUgYSBmaWxlIHdpdGggdGhlIHBhY2thZ2UgbmFtZXMgaW4gaXQKLSQoSFRUUFNFUlZFUl9QQUNLQUdFU19GSUxFKTogJChESVJFQ1RPUllfQ0FDSEUpICQoY2FsbCBQYWNrYWdlRGVwZW5kZW5jaWVzLCQoSFRUUFNFUlZFUl9QS0dTKSkKLQkkKHByZXAtdGFyZ2V0KQotCSQoY2FsbCBQYWNrYWdlRmlsdGVyLCQoSFRUUFNFUlZFUl9QS0dTKSkKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyBtZ210ZG9jcwotIwotCi1BTExfT1RIRVJfVEFSR0VUUyArPSBtZ210ZG9jcwotCi1NR01UX0RPQ0RJUgkgOj0gJChKUkVfQVBJX0RPQ1NESVIpL21hbmFnZW1lbnQvZXh0ZW5zaW9uCi1NR01UMkNPUkVBUEkgICAgIDo9IC4uLy4uLyQoSkRLSlJFMkNPUkVBUEkpCi1KVk1fTUlCX05BTUUgICAgIDo9IEpWTS1NQU5BR0VNRU5ULU1JQi5taWIKLUpWTV9NSUJfU1JDICAgICAgOj0gJChDTE9TRURfU1JDKS9zaGFyZS9jbGFzc2VzL3N1bi9tYW5hZ2VtZW50L3NubXAvJChKVk1fTUlCX05BTUUpCi1NR01UX0RPQ1RJVExFICAgIDo9IE1vbml0b3JpbmcgYW5kIE1hbmFnZW1lbnQgSW50ZXJmYWNlIGZvciB0aGUgSmF2YSQoVFJBREVNQVJLKSBQbGF0Zm9ybQotTUdNVF9XSU5ET1dUSVRMRSA6PSBNb25pdG9yaW5nIGFuZCBNYW5hZ2VtZW50IEludGVyZmFjZSBmb3IgdGhlIEphdmEgUGxhdGZvcm0KLU1HTVRfSEVBREVSICAgICAgOj0gPHN0cm9uZz5Nb25pdG9yaW5nIGFuZCBNYW5hZ2VtZW50IEludGVyZmFjZSBmb3IgdGhlIEphdmEgUGxhdGZvcm08L3N0cm9uZz4KLU1HTVRfQk9UVE9NICAgICAgOj0gJChjYWxsIENvbW1vbkJvdHRvbSwkKE1HTVRfRklSU1RfQ09QWVJJR0hUX1lFQVIpKQotTUdNVF9PVkVSVklFVyAgICA6PSAkKFNIQVJFX1NSQykvY2xhc3Nlcy9jb20vc3VuL21hbmFnZW1lbnQvbWdtdC1vdmVydmlldy5odG1sCi0jIE1HTVRfUEtHUyBpcyBsb2NhdGVkIGluIE5PTl9DT1JFX1BLR1MuZ21rCi0KLSMgVGhlIGluZGV4Lmh0bWwsIG9wdGlvbnMsIGFuZCBwYWNrYWdlcyBmaWxlcwotTUdNVF9JTkRFWF9GSUxFICAgID0gJChNR01UX0RPQ0RJUikvaW5kZXguaHRtbAotTUdNVF9PUFRJT05TX0ZJTEUgID0gJChET0NTVE1QRElSKS9tZ210Lm9wdGlvbnMKLU1HTVRfUEFDS0FHRVNfRklMRSA9ICQoRE9DU1RNUERJUikvbWdtdC5wYWNrYWdlcwotCi1tZ210ZG9jczogJChNR01UX0lOREVYX0ZJTEUpCi0KLSMgU2V0IHJlbGF0aXZlIGxvY2F0aW9uIHRvIGNvcmUgYXBpIGRvY3VtZW50IHJvb3QKLSQoTUdNVF9JTkRFWF9GSUxFKTogR0VUMkRPQ1NESVI9JChNR01UMkNPUkVBUEkpLy4uCi0KLSMgUnVuIGphdmFkb2MgaWYgdGhlIGluZGV4IGZpbGUgaXMgb3V0IG9mIGRhdGUgb3IgbWlzc2luZwotJChNR01UX0lOREVYX0ZJTEUpOiAkKE1HTVRfT1BUSU9OU19GSUxFKSAkKE1HTVRfUEFDS0FHRVNfRklMRSkKLQkkKHByZXAtamF2YWRvYykKLQlAaWYgWyAtZiAkKEpWTV9NSUJfU1JDKSBdIDsgdGhlbiAJCQkJXAotCSAgJChFQ0hPKSAiJChDUCkgJChKVk1fTUlCX1NSQykgJChARCkvLi4iOyAJCQlcCi0JICAkKENQKSAkKEpWTV9NSUJfU1JDKSAkKEBEKS8uLiA7IAkJCQlcCi0JZWxzZSAJCQkJCQkJCVwKLQkgICQoRUNITykgIldBUk5JTkc6IEZpbGUgJChKVk1fTUlCX05BTUUpIG5vdCBhdmFpbGFibGUuIjsgCVwKLQlmaQotCSQoY2FsbCBKYXZhZG9jU3VtbWFyeSwkKE1HTVRfT1BUSU9OU19GSUxFKSwkKE1HTVRfUEFDS0FHRVNfRklMRSkpCi0JJChKQVZBRE9DX0NNRCkgJChKQVZBRE9DX1ZNX01FTU9SWV9GTEFHUykgLWQgJChARCkgXAotCSAgQCQoTUdNVF9PUFRJT05TX0ZJTEUpIEAkKE1HTVRfUEFDS0FHRVNfRklMRSkKLQotIyBDcmVhdGUgZmlsZSB3aXRoIGphdmFkb2Mgb3B0aW9ucyBpbiBpdAotJChNR01UX09QVElPTlNfRklMRSk6ICQoTUdNVF9PVkVSVklFVykKLQkkKHByZXAtdGFyZ2V0KQotCUAoJChjYWxsIE9wdGlvbk9ubHksJChDT01NT05fSkFWQURPQ0ZMQUdTKSkJCQk7IFwKLQkgICQoY2FsbCBPcHRpb25QYWlyLC1zb3VyY2VwYXRoLCQoUkVMRUFTRURPQ1NfU09VUkNFUEFUSCkpCTsgXAotCSAgJChjYWxsIE9wdGlvblBhaXIsLWVuY29kaW5nLGFzY2lpKQkJCQk7IFwKLQkgICQoY2FsbCBPcHRpb25Pbmx5LC1ub2RlcHJlY2F0ZWRsaXN0KQkJCQk7IFwKLQkgICQoY2FsbCBPcHRpb25QYWlyLC1vdmVydmlldywkKE1HTVRfT1ZFUlZJRVcpKQkJCTsgXAotCSAgJChjYWxsIE9wdGlvblBhaXIsLWRvY3RpdGxlLCQoTUdNVF9ET0NUSVRMRSkpCQkJOyBcCi0JICAkKGNhbGwgT3B0aW9uUGFpciwtd2luZG93dGl0bGUsJChNR01UX1dJTkRPV1RJVExFKSAkKERSQUZUX1dJTlRJVExFKSk7IFwKLQkgICQoY2FsbCBPcHRpb25QYWlyLC1oZWFkZXIsJChNR01UX0hFQURFUikkKERSQUZUX0hFQURFUikpCTsgXAotCSAgJChjYWxsIE9wdGlvblBhaXIsLWJvdHRvbSwkKE1HTVRfQk9UVE9NKSQoRFJBRlRfQk9UVE9NKSkJOyBcCi0JICAkKGNhbGwgT3B0aW9uVHJpcCwtbGlua29mZmxpbmUsJChNR01UMkNPUkVBUEkpLCQoQ09SRUFQSV9ET0NTRElSKS8pOyBcCi0gICAgICAgICkgPj4gJEAKLQotIyBDcmVhdGUgYSBmaWxlIHdpdGggdGhlIHBhY2thZ2UgbmFtZXMgaW4gaXQKLSQoTUdNVF9QQUNLQUdFU19GSUxFKTogJChESVJFQ1RPUllfQ0FDSEUpICQoY2FsbCBQYWNrYWdlRGVwZW5kZW5jaWVzLCQoTUdNVF9QS0dTKSkKLQkkKHByZXAtdGFyZ2V0KQotCSQoY2FsbCBQYWNrYWdlRmlsdGVyLCQoTUdNVF9QS0dTKSkKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyBhdHRhY2hkb2NzCi0jCi0KLUFMTF9PVEhFUl9UQVJHRVRTICs9IGF0dGFjaGRvY3MKLQotQVRUQUNIX0RPQ0RJUiAgICAgIDo9ICQoSkRLX0FQSV9ET0NTRElSKS9hdHRhY2gvc3BlYwotQVRUQUNIMkNPUkVBUEkgICAgIDo9IC4uLy4uLyQoSkRLSlJFMkNPUkVBUEkpCi1BVFRBQ0hfRE9DVElUTEUgICAgOj0gQXR0YWNoIEFQSQotQVRUQUNIX1dJTkRPV1RJVExFIDo9IEF0dGFjaCBBUEkKLUFUVEFDSF9IRUFERVIgICAgICA6PSA8c3Ryb25nPkF0dGFjaCBBUEk8L3N0cm9uZz4KLUFUVEFDSF9CT1RUT00gICAgICA6PSAkKGNhbGwgQ29tbW9uQm90dG9tLCQoQVRUQUNIX0ZJUlNUX0NPUFlSSUdIVF9ZRUFSKSkKLSMgQVRUQUNIX1BLR1MgaXMgbG9jYXRlZCBpbiBOT05fQ09SRV9QS0dTLmdtawotCi1BVFRBQ0hfSU5ERVhfSFRNTCAgICA9ICQoQVRUQUNIX0RPQ0RJUikvaW5kZXguaHRtbAotQVRUQUNIX09QVElPTlNfRklMRSAgPSAkKERPQ1NUTVBESVIpL2F0dGFjaC5vcHRpb25zCi1BVFRBQ0hfUEFDS0FHRVNfRklMRSA9ICQoRE9DU1RNUERJUikvYXR0YWNoLnBhY2thZ2VzCi0KLWF0dGFjaGRvY3M6ICQoQVRUQUNIX0lOREVYX0hUTUwpCi0KLSMgU2V0IHJlbGF0aXZlIGxvY2F0aW9uIHRvIGNvcmUgYXBpIGRvY3VtZW50IHJvb3QKLSQoQVRUQUNIX0lOREVYX0hUTUwpOiBHRVQyRE9DU0RJUj0kKEFUVEFDSDJDT1JFQVBJKS8uLgotCi0jIFJ1biBqYXZhZG9jIGlmIHRoZSBpbmRleCBmaWxlIGlzIG91dCBvZiBkYXRlIG9yIG1pc3NpbmcKLSQoQVRUQUNIX0lOREVYX0hUTUwpOiAkKEFUVEFDSF9PUFRJT05TX0ZJTEUpICQoQVRUQUNIX1BBQ0tBR0VTX0ZJTEUpCi0JJChwcmVwLWphdmFkb2MpCi0JJChjYWxsIEphdmFkb2NTdW1tYXJ5LCQoQVRUQUNIX09QVElPTlNfRklMRSksJChBVFRBQ0hfUEFDS0FHRVNfRklMRSkpCi0JJChKQVZBRE9DX0NNRCkgJChKQVZBRE9DX1ZNX01FTU9SWV9GTEFHUykgLWQgJChARCkgXAotCSAgQCQoQVRUQUNIX09QVElPTlNfRklMRSkgQCQoQVRUQUNIX1BBQ0tBR0VTX0ZJTEUpCi0KLSMgQ3JlYXRlIGZpbGUgd2l0aCBqYXZhZG9jIG9wdGlvbnMgaW4gaXQKLSQoQVRUQUNIX09QVElPTlNfRklMRSk6Ci0JJChwcmVwLXRhcmdldCkKLQlAKCQoY2FsbCBPcHRpb25Pbmx5LCQoQ09NTU9OX0pBVkFET0NGTEFHUykpCQkJOyBcCi0JICAkKGNhbGwgT3B0aW9uUGFpciwtc291cmNlcGF0aCwkKFJFTEVBU0VET0NTX1NPVVJDRVBBVEgpKQk7IFwKLQkgICQoY2FsbCBPcHRpb25QYWlyLC1lbmNvZGluZyxhc2NpaSkJCQkJOyBcCi0JICAkKGNhbGwgT3B0aW9uT25seSwtbm9kZXByZWNhdGVkbGlzdCkJCQkJOyBcCi0JICAkKGNhbGwgT3B0aW9uUGFpciwtZG9jdGl0bGUsJChBVFRBQ0hfRE9DVElUTEUpKQkJOyBcCi0JICAkKGNhbGwgT3B0aW9uUGFpciwtd2luZG93dGl0bGUsJChBVFRBQ0hfV0lORE9XVElUTEUpICQoRFJBRlRfV0lOVElUTEUpKTtcCi0JICAkKGNhbGwgT3B0aW9uUGFpciwtaGVhZGVyLCQoQVRUQUNIX0hFQURFUikkKERSQUZUX0hFQURFUikpCTsgXAotCSAgJChjYWxsIE9wdGlvblBhaXIsLWJvdHRvbSwkKEFUVEFDSF9CT1RUT00pJChEUkFGVF9CT1RUT00pKQk7IFwKLQkgICQoY2FsbCBPcHRpb25UcmlwLC1saW5rb2ZmbGluZSwkKEFUVEFDSDJDT1JFQVBJKSwkKENPUkVBUElfRE9DU0RJUikvKTsgXAotICAgICAgICApID4+ICRACi0KLSMgQ3JlYXRlIGEgZmlsZSB3aXRoIHRoZSBwYWNrYWdlIG5hbWVzIGluIGl0Ci0kKEFUVEFDSF9QQUNLQUdFU19GSUxFKTogJChESVJFQ1RPUllfQ0FDSEUpICQoY2FsbCBQYWNrYWdlRGVwZW5kZW5jaWVzLCQoQVRUQUNIX1BLR1MpKQotCSQocHJlcC10YXJnZXQpCi0JJChjYWxsIFBhY2thZ2VGaWx0ZXIsJChBVFRBQ0hfUEtHUykpCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgamNvbnNvbGVkb2NzCi0jCi0KLUFMTF9PVEhFUl9UQVJHRVRTICs9IGpjb25zb2xlZG9jcwotCi1KQ09OU09MRV9ET0NESVIgICAgICA6PSAkKEpES19BUElfRE9DU0RJUikvamNvbnNvbGUvc3BlYwotSkNPTlNPTEUyQ09SRUFQSSAgICAgOj0gLi4vLi4vJChKREtKUkUyQ09SRUFQSSkKLUpDT05TT0xFX0RPQ1RJVExFICAgIDo9IEpDb25zb2xlIEFQSQotSkNPTlNPTEVfV0lORE9XVElUTEUgOj0gSkNvbnNvbGUgQVBJCi1KQ09OU09MRV9IRUFERVIgICAgICA6PSA8c3Ryb25nPkpDb25zb2xlIEFQSTwvc3Ryb25nPgotSkNPTlNPTEVfQk9UVE9NICAgICAgOj0gJChjYWxsIENvbW1vbkJvdHRvbSwkKEpDT05TT0xFX0ZJUlNUX0NPUFlSSUdIVF9ZRUFSKSkKLSMgSkNPTlNPTEVfUEtHUyBpcyBsb2NhdGVkIGluIE5PTl9DT1JFX1BLR1MuZ21rCi0KLUpDT05TT0xFX0lOREVYX0hUTUwgICAgPSAkKEpDT05TT0xFX0RPQ0RJUikvaW5kZXguaHRtbAotSkNPTlNPTEVfT1BUSU9OU19GSUxFICA9ICQoRE9DU1RNUERJUikvamNvbnNvbGUub3B0aW9ucwotSkNPTlNPTEVfUEFDS0FHRVNfRklMRSA9ICQoRE9DU1RNUERJUikvamNvbnNvbGUucGFja2FnZXMKLQotamNvbnNvbGVkb2NzOiAkKEpDT05TT0xFX0lOREVYX0hUTUwpCi0KLSMgU2V0IHJlbGF0aXZlIGxvY2F0aW9uIHRvIGNvcmUgYXBpIGRvY3VtZW50IHJvb3QKLSQoSkNPTlNPTEVfSU5ERVhfSFRNTCk6IEdFVDJET0NTRElSPSQoSkNPTlNPTEUyQ09SRUFQSSkvLi4KLQotIyBSdW4gamF2YWRvYyBpZiB0aGUgaW5kZXggZmlsZSBpcyBvdXQgb2YgZGF0ZSBvciBtaXNzaW5nCi0kKEpDT05TT0xFX0lOREVYX0hUTUwpOiAkKEpDT05TT0xFX09QVElPTlNfRklMRSkgJChKQ09OU09MRV9QQUNLQUdFU19GSUxFKQotCSQocHJlcC1qYXZhZG9jKQotCSQoY2FsbCBKYXZhZG9jU3VtbWFyeSwkKEpDT05TT0xFX09QVElPTlNfRklMRSksJChKQ09OU09MRV9QQUNLQUdFU19GSUxFKSkKLQkkKEpBVkFET0NfQ01EKSAkKEpBVkFET0NfVk1fTUVNT1JZX0ZMQUdTKSAtZCAkKEBEKSBcCi0JICBAJChKQ09OU09MRV9PUFRJT05TX0ZJTEUpIEAkKEpDT05TT0xFX1BBQ0tBR0VTX0ZJTEUpCi0KLSMgQ3JlYXRlIGZpbGUgd2l0aCBqYXZhZG9jIG9wdGlvbnMgaW4gaXQKLSQoSkNPTlNPTEVfT1BUSU9OU19GSUxFKToKLQkkKHByZXAtdGFyZ2V0KQotCUAoJChjYWxsIE9wdGlvbk9ubHksJChDT01NT05fSkFWQURPQ0ZMQUdTKSkJCQk7IFwKLQkgICQoY2FsbCBPcHRpb25QYWlyLC1zb3VyY2VwYXRoLCQoUkVMRUFTRURPQ1NfU09VUkNFUEFUSCkpCTsgXAotCSAgJChjYWxsIE9wdGlvblBhaXIsLWVuY29kaW5nLGFzY2lpKQkJCQk7IFwKLQkgICQoY2FsbCBPcHRpb25Pbmx5LC1ub2RlcHJlY2F0ZWRsaXN0KQkJCQk7IFwKLQkgICQoY2FsbCBPcHRpb25QYWlyLC1kb2N0aXRsZSwkKEpDT05TT0xFX0RPQ1RJVExFKSkJCTsgXAotCSAgJChjYWxsIE9wdGlvblBhaXIsLXdpbmRvd3RpdGxlLCQoSkNPTlNPTEVfV0lORE9XVElUTEUpICQoRFJBRlRfV0lOVElUTEUpKTtcCi0JICAkKGNhbGwgT3B0aW9uUGFpciwtaGVhZGVyLCQoSkNPTlNPTEVfSEVBREVSKSQoRFJBRlRfSEVBREVSKSkJOyBcCi0JICAkKGNhbGwgT3B0aW9uUGFpciwtYm90dG9tLCQoSkNPTlNPTEVfQk9UVE9NKSQoRFJBRlRfQk9UVE9NKSkJOyBcCi0JICAkKGNhbGwgT3B0aW9uVHJpcCwtbGlua29mZmxpbmUsJChKQ09OU09MRTJDT1JFQVBJKSwkKENPUkVBUElfRE9DU0RJUikvKTsgXAotICAgICAgICApID4+ICRACi0KLSMgQ3JlYXRlIGEgZmlsZSB3aXRoIHRoZSBwYWNrYWdlIG5hbWVzIGluIGl0Ci0kKEpDT05TT0xFX1BBQ0tBR0VTX0ZJTEUpOiAkKERJUkVDVE9SWV9DQUNIRSkgJChjYWxsIFBhY2thZ2VEZXBlbmRlbmNpZXMsJChKQ09OU09MRV9QS0dTKSkKLQkkKHByZXAtdGFyZ2V0KQotCSQoY2FsbCBQYWNrYWdlRmlsdGVyLCQoSkNPTlNPTEVfUEtHUykpCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgdHJlZWFwaWRvY3MKLSMKLQotIyBQYXJ0IG9mIGxhbmd0b29scwotaWZkZWYgTEFOR1RPT0xTX0RJU1QKLSAgQUxMX09USEVSX1RBUkdFVFMgKz0gdHJlZWFwaWRvY3MKLWVuZGlmCi0KLVRSRUVBUElfRE9DRElSICAgICAgIDo9ICQoSkRLX0FQSV9ET0NTRElSKS9qYXZhYy90cmVlCi1UUkVFQVBJMkNPUkVBUEkgICAgICA6PSAuLi8uLi8kKEpES0pSRTJDT1JFQVBJKQotVFJFRUFQSV9ET0NUSVRMRSAgICAgOj0gQ29tcGlsZXIgVHJlZSBBUEkKLVRSRUVBUElfV0lORE9XVElUTEUgIDo9IENvbXBpbGVyIFRyZWUgQVBJCi1UUkVFQVBJX0hFQURFUiAgICAgICA6PSA8c3Ryb25nPkNvbXBpbGVyIFRyZWUgQVBJPC9zdHJvbmc+Ci1UUkVFQVBJX0JPVFRPTSAgICAgICA6PSAkKGNhbGwgQ29tbW9uQm90dG9tLCQoVFJFRUFQSV9GSVJTVF9DT1BZUklHSFRfWUVBUikpCi1UUkVFQVBJX0dST1VQTkFNRSAgICA6PSBQYWNrYWdlcwotVFJFRUFQSV9SRUdFWFAgICAgICAgOj0gY29tLnN1bi5zb3VyY2UuKgotIyBUUkVFQVBJX1BLR1MgaXMgbG9jYXRlZCBpbiBOT05fQ09SRV9QS0dTLmdtawotCi1UUkVFQVBJX0lOREVYX0hUTUwgICAgPSAkKFRSRUVBUElfRE9DRElSKS9pbmRleC5odG1sCi1UUkVFQVBJX09QVElPTlNfRklMRSAgPSAkKERPQ1NUTVBESVIpL3RyZWVhcGkub3B0aW9ucwotVFJFRUFQSV9QQUNLQUdFU19GSUxFID0gJChET0NTVE1QRElSKS90cmVlYXBpLnBhY2thZ2VzCi0KLXRyZWVhcGlkb2NzOiAkKFRSRUVBUElfSU5ERVhfSFRNTCkKLQotIyBTZXQgcmVsYXRpdmUgbG9jYXRpb24gdG8gY29yZSBhcGkgZG9jdW1lbnQgcm9vdAotJChUUkVFQVBJX0lOREVYX0hUTUwpOiBHRVQyRE9DU0RJUj0kKFRSRUVBUEkyQ09SRUFQSSkvLi4KLQotIyBSdW4gamF2YWRvYyBpZiB0aGUgaW5kZXggZmlsZSBpcyBvdXQgb2YgZGF0ZSBvciBtaXNzaW5nCi0kKFRSRUVBUElfSU5ERVhfSFRNTCk6ICQoVFJFRUFQSV9PUFRJT05TX0ZJTEUpICQoVFJFRUFQSV9QQUNLQUdFU19GSUxFKQotCSQocHJlcC1qYXZhZG9jKQotCSQoY2FsbCBKYXZhZG9jU3VtbWFyeSwkKFRSRUVBUElfT1BUSU9OU19GSUxFKSwkKFRSRUVBUElfUEFDS0FHRVNfRklMRSkpCi0JJChKQVZBRE9DX0NNRCkgJChKQVZBRE9DX1ZNX01FTU9SWV9GTEFHUykgLWQgJChARCkgXAotCSAgQCQoVFJFRUFQSV9PUFRJT05TX0ZJTEUpIEAkKFRSRUVBUElfUEFDS0FHRVNfRklMRSkKLQotIyBDcmVhdGUgZmlsZSB3aXRoIGphdmFkb2Mgb3B0aW9ucyBpbiBpdAotJChUUkVFQVBJX09QVElPTlNfRklMRSk6Ci0JJChwcmVwLXRhcmdldCkKLQlAKCQoY2FsbCBPcHRpb25Pbmx5LCQoQ09NTU9OX0pBVkFET0NGTEFHUykpCQkJOyBcCi0JICAkKGNhbGwgT3B0aW9uUGFpciwtc291cmNlcGF0aCwkKFJFTEVBU0VET0NTX1NPVVJDRVBBVEgpKQk7IFwKLQkgICQoY2FsbCBPcHRpb25QYWlyLC1lbmNvZGluZyxhc2NpaSkJCQkJOyBcCi0JICAkKGNhbGwgT3B0aW9uUGFpciwtZG9jdGl0bGUsJChUUkVFQVBJX0RPQ1RJVExFKSkJCTsgXAotCSAgJChjYWxsIE9wdGlvblBhaXIsLXdpbmRvd3RpdGxlLCQoVFJFRUFQSV9XSU5ET1dUSVRMRSkgJChEUkFGVF9XSU5USVRMRSkpO1wKLQkgICQoY2FsbCBPcHRpb25QYWlyLC1oZWFkZXIsJChUUkVFQVBJX0hFQURFUikkKERSQUZUX0hFQURFUikpCTsgXAotICAgICAgICAgICQoY2FsbCBPcHRpb25QYWlyLC10YWcsJChUQUdfSkxTKSkgCQkJCTsgXAotCSAgJChjYWxsIE9wdGlvblBhaXIsLWJvdHRvbSwkKFRSRUVBUElfQk9UVE9NKSQoRFJBRlRfQk9UVE9NKSkJOyBcCi0JICAkKGNhbGwgT3B0aW9uVHJpcCwtZ3JvdXAsJChUUkVFQVBJX0dST1VQTkFNRSksJChUUkVFQVBJX1JFR0VYUCkpOyBcCi0JICAkKGNhbGwgT3B0aW9uVHJpcCwtbGlua29mZmxpbmUsJChUUkVFQVBJMkNPUkVBUEkpLCQoQ09SRUFQSV9ET0NTRElSKS8pOyBcCi0gICAgICAgICkgPj4gJEAKLQotIyBDcmVhdGUgYSBmaWxlIHdpdGggdGhlIHBhY2thZ2UgbmFtZXMgaW4gaXQKLSQoVFJFRUFQSV9QQUNLQUdFU19GSUxFKTogJChESVJFQ1RPUllfQ0FDSEUpICQoY2FsbCBQYWNrYWdlRGVwZW5kZW5jaWVzLCQoVFJFRUFQSV9QS0dTKSkKLQkkKHByZXAtdGFyZ2V0KQotCSQoY2FsbCBQYWNrYWdlRmlsdGVyLCQoVFJFRUFQSV9QS0dTKSkKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyBzY3RwZG9jcwotIwotCi1BTExfT1RIRVJfVEFSR0VUUyArPSBzY3RwZG9jcwotCi1TQ1RQQVBJX0RPQ0RJUiAgICAgIDo9ICQoSlJFX0FQSV9ET0NTRElSKS9uaW8vc2N0cC9zcGVjCi1TQ1RQQVBJMkNPUkVBUEkgICAgIDo9IC4uLy4uLy4uLyQoSkRLSlJFMkNPUkVBUEkpCi1TQ1RQQVBJX0RPQ1RJVExFICAgIDo9IFNDVFAgQVBJCi1TQ1RQQVBJX1dJTkRPV1RJVExFIDo9IFNDVFAgQVBJCi1TQ1RQQVBJX0hFQURFUiAgICAgIDo9IDxzdHJvbmc+U0NUUCBBUEk8L3N0cm9uZz4KLVNDVFBBUElfQk9UVE9NICAgICAgOj0gJChjYWxsIENvbW1vbkJvdHRvbSwkKFNDVFBBUElfRklSU1RfQ09QWVJJR0hUX1lFQVIpKQotIyBTQ1RQQVBJX1BLR1MgaXMgbG9jYXRlZCBpbiBOT05fQ09SRV9QS0dTLmdtawotCi1TQ1RQQVBJX0lOREVYX0hUTUwgICAgPSAkKFNDVFBBUElfRE9DRElSKS9pbmRleC5odG1sCi1TQ1RQQVBJX09QVElPTlNfRklMRSAgPSAkKERPQ1NUTVBESVIpL3NjdHAub3B0aW9ucwotU0NUUEFQSV9QQUNLQUdFU19GSUxFID0gJChET0NTVE1QRElSKS9zY3RwLnBhY2thZ2VzCi0KLXNjdHBkb2NzOiAkKFNDVFBBUElfSU5ERVhfSFRNTCkKLQotIyBTZXQgcmVsYXRpdmUgbG9jYXRpb24gdG8gY29yZSBhcGkgZG9jdW1lbnQgcm9vdAotJChTQ1RTQ1RTQ1RQOiBHRVQyRE9DU0RJUj0kKFNDVFBBUEkyQ09SRUFQSSkvLi4KLQotIyBSdW4gamF2YWRvYyBpZiB0aGUgaW5kZXggZmlsZSBpcyBvdXQgb2YgZGF0ZSBvciBtaXNzaW5nCi0kKFNDVFBBUElfSU5ERVhfSFRNTCk6ICQoU0NUUEFQSV9PUFRJT05TX0ZJTEUpICQoU0NUUEFQSV9QQUNLQUdFU19GSUxFKQotCSQocHJlcC1qYXZhZG9jKQotCSQoY2FsbCBKYXZhZG9jU3VtbWFyeSwkKFNDVFBBUElfT1BUSU9OU19GSUxFKSwkKFNDVFBBUElfUEFDS0FHRVNfRklMRSkpCi0JJChKQVZBRE9DX0NNRCkgJChKQVZBRE9DX1ZNX01FTU9SWV9GTEFHUykgLWQgJChARCkgXAotCSAgQCQoU0NUUEFQSV9PUFRJT05TX0ZJTEUpIEAkKFNDVFBBUElfUEFDS0FHRVNfRklMRSkKLQotIyBDcmVhdGUgZmlsZSB3aXRoIGphdmFkb2Mgb3B0aW9ucyBpbiBpdAotJChTQ1RQQVBJX09QVElPTlNfRklMRSk6Ci0JJChwcmVwLXRhcmdldCkKLQlAKCQoY2FsbCBPcHRpb25Pbmx5LCQoQ09NTU9OX0pBVkFET0NGTEFHUykpCQkJOyBcCi0JICAkKGNhbGwgT3B0aW9uUGFpciwtc291cmNlcGF0aCwkKFJFTEVBU0VET0NTX1NPVVJDRVBBVEgpKQk7IFwKLQkgICQoY2FsbCBPcHRpb25QYWlyLC1lbmNvZGluZyxhc2NpaSkJCQkJOyBcCi0JICAkKGNhbGwgT3B0aW9uT25seSwtbm9kZXByZWNhdGVkbGlzdCkJCQkJOyBcCi0JICAkKGNhbGwgT3B0aW9uUGFpciwtZG9jdGl0bGUsJChTQ1RQQVBJX0RPQ1RJVExFKSkJCTsgXAotCSAgJChjYWxsIE9wdGlvblBhaXIsLXdpbmRvd3RpdGxlLCQoU0NUUEFQSV9XSU5ET1dUSVRMRSkgJChEUkFGVF9XSU5USVRMRSkpO1wKLQkgICQoY2FsbCBPcHRpb25QYWlyLC1oZWFkZXIsJChTQ1RQQVBJX0hFQURFUikkKERSQUZUX0hFQURFUikpCTsgXAotCSAgJChjYWxsIE9wdGlvblBhaXIsLWJvdHRvbSwkKFNDVFBBUElfQk9UVE9NKSQoRFJBRlRfQk9UVE9NKSkJOyBcCi0JICAkKGNhbGwgT3B0aW9uVHJpcCwtbGlua29mZmxpbmUsJChTQ1RQQVBJMkNPUkVBUEkpLCQoQ09SRUFQSV9ET0NTRElSKS8pOyBcCi0gICAgICAgICkgPj4gJEAKLQotIyBDcmVhdGUgYSBmaWxlIHdpdGggdGhlIHBhY2thZ2UgbmFtZXMgaW4gaXQKLSQoU0NUUEFQSV9QQUNLQUdFU19GSUxFKTogJChESVJFQ1RPUllfQ0FDSEUpICQoY2FsbCBQYWNrYWdlRGVwZW5kZW5jaWVzLCQoU0NUUEFQSV9QS0dTKSkKLQkkKHByZXAtdGFyZ2V0KQotCSQoY2FsbCBQYWNrYWdlRmlsdGVyLCQoU0NUUEFQSV9QS0dTKSkKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyBHZXQgYSBjYWNoZSBvZiBhbGwgdGhlIGRpcmVjdG9yaWVzCi0KLSQoRElSRUNUT1JZX0NBQ0hFKTogJChBTExfRVhJU1RJTkdfU09VUkNFX0RJUlMpCi0JJChwcmVwLXRhcmdldCkKLQlAZm9yIGNwIGluICQoQUxMX0VYSVNUSU5HX1NPVVJDRV9ESVJTKSA7IGRvIAlcCi0JICAkKEVDSE8pICIkKEZJTkQpICQke2NwfSAtdHlwZSBmID4+ICRAIjsgCVwKLQkgICQoRklORCkgJCR7Y3B9IC10eXBlIGYgPj4gJEA7IAkJXAotCWRvbmUKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotI3JlbGVhc2UgdmVyc2lvbiBvZiBjb3JlIHBhY2thZ2VzICMjIyMjIyMjCi0jIE1heGltaXplIHBlcmZvcm1hbmNlIGFuZCBlbnN1cmUgdGhhdCBidWlsZCBudW1iZXIgJiBtaWxlc3RvbmUgYXJlIHNldC4KLQotcmVsLWNvcmVkb2NzOiBzYW5pdHljaGVja2NvcmVkb2NzCi0JJChNQUtFKSBjb3JlZG9jcwotCi1yZWwtZG9jczogcmVsLWNvcmVkb2NzICQoQUxMX09USEVSX1RBUkdFVFMpCi0jCi0jIGVuZCBvZiBwcm9kdWN0aW9uIHRhcmdldHMKLQotb3RoZXJkb2NzOiAkKEFMTF9PVEhFUl9UQVJHRVRTKQotCi1jbGVhbjoKLQkkKFJNKSAtciAkKERPQ1NESVIpICQoRE9DU1RNUERJUikKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBERUJVRyBUQVJHRVQKLSMgTGlzdCB0aGUgdmFsdWVzIGRlZmluZWQgaW4gdGhlIG1ha2VmaWxlIGhpZXJhcmNoeSwgdG8gbWFrZSBzdXJlIGV2ZXJ5dGhpbmcKLSMgaXMgc2V0IHByb3Blcmx5LCBhbmQgdG8gaGVscCBpZGVudGlmeSB2YWx1ZXMgd2UgY2FuIHVzZSBpbnN0ZWFkIG9mIG1ha2luZyBuZXcgb25lcy4KLSMgKE1vc3Qgb2YgdGhlbSBjb21lIGZyb20gY29tbW9uL3NoYXJlZC9EZWZzLmdtaykKLSMKLSMgIE5vdGVzOgotIyAgICAqIEJVSUxEX05VTUJFUiBkZWZhdWx0cyB0byBiMDAgaWYgbm90IHNldCBvbiBjb21tYW5kIGxpbmUgd2l0aCBCVUlMRF9OVU1CRVI9PHZhbHVlPgotIyAgICAqIE1JTEVTVE9ORSBkZWZhdWx0cyB0byBpbnRlcm5hbCB1bmxlc3Mgc2V0IHRvIGJldGEsIHJjLCBvciBmY3Mgb24gY29tbWFuZCBsaW5lCi0jCi0KLWVjaG92YWx1ZXM6Ci0JQCQoRUNITykgIiIKLQlAJChFQ0hPKSAtLS0tLS0tLS0tLS0tLUltcG9ydHMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlAJChFQ0hPKSAiSU1QT1JUX1BBQ0tBR0VTID0gJChJTVBPUlRfUEFDS0FHRVMpIgotCUAkKEVDSE8pICJJTVBPUlRfUEFDS0FHRV9GSUxURVIgPSAkKElNUE9SVF9QQUNLQUdFX0ZJTFRFUikiCi0JQCQoRUNITykgLS0tLS0tLS0tLS0tLS1JbXBvcnRzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JQCQoRUNITykgIiIKLQlAJChFQ0hPKSAtLS0tLS0tLS0tLS0tLVNoYXJlZC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCUAkKEVDSE8pIEJVSUxEX05VTUJFUiA9ICQoQlVJTERfTlVNQkVSKQotCUAkKEVDSE8pIEZVTExfVkVSU0lPTiA9ICQoRlVMTF9WRVJTSU9OKQotCUAkKEVDSE8pIEpES19WRVJTSU9OID0gJChKREtfVkVSU0lPTikKLQlAJChFQ0hPKSBKREtfTUFKT1JfVkVSU0lPTiA9ICQoSkRLX01BSk9SX1ZFUlNJT04pCi0JQCQoRUNITykgSkRLX01JTk9SX1ZFUlNJT04gPSAkKEpES19NSU5PUl9WRVJTSU9OKQotCUAkKEVDSE8pIEpES19NSUNST19WRVJTSU9OID0gJChKREtfTUlDUk9fVkVSU0lPTikKLQlAJChFQ0hPKSBKREtfVVBEQVRFX1ZFUlNJT04gPSAkKEpES19VUERBVEVfVkVSU0lPTikKLQlAJChFQ0hPKSBKREtfTUtUR19WRVJTSU9OID0gJChKREtfTUtUR19WRVJTSU9OKQotCUAkKEVDSE8pIEpES19VTkRFUlNDT1JFX1ZFUlNJT04gPSAkKEpES19VTkRFUlNDT1JFX1ZFUlNJT04pCi0JQCQoRUNITykgSkRLX01LVEdfVU5ERVJTQ09SRV9WRVJTSU9OID0gJChKREtfTUtUR19VTkRFUlNDT1JFX1ZFUlNJT04pCi0JQCQoRUNITykgTUFSS0VUSU5HX05VTUJFUiA9ICQoTUFSS0VUSU5HX05VTUJFUikKLQlAJChFQ0hPKSBNQVJLRVRfTkFNRSA9ICQoTUFSS0VUX05BTUUpCi0JQCQoRUNITykgTUlMRVNUT05FID0gJChNSUxFU1RPTkUpCi0JQCQoRUNITykgUkVMRUFTRSA9ICQoUkVMRUFTRSkKLQlAJChFQ0hPKSBVU0VSX1JFTEVBU0VfU1VGRklYID0gJChVU0VSX1JFTEVBU0VfU1VGRklYKQotCUAkKEVDSE8pIC0tLS0tLS0tLS0tLS0tU2hhcmVkLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JQCQoRUNITykgIiIKLQlAJChFQ0hPKSAtLS0tLS0tLS0tLS0tLWNvbW1vbi9EZWZzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JQCQoRUNITykgIlJFTEVBU0VET0NTX1NPVVJDRVBBVEgiCi0JQCQoRUNITykgIiAgIFNIQVJFX1NSQy9jbGFzc2VzOiAkKFNIQVJFX1NSQykvY2xhc3NlcyIKLQlAJChFQ0hPKSAiICAgUExBVEZPUk1fU1JDL2NsYXNzZXM6ICQoUExBVEZPUk1fU1JDKS9jbGFzc2VzIgotCUAkKEVDSE8pICIgICBHRU5TUkNESVI6ICQoR0VOU1JDRElSKSIKLQlAJChFQ0hPKSAiICAgU0hBUkVfU1JDL2RvYy9zdHViOiAkKFNIQVJFX1NSQykvZG9jL3N0dWIiCi0JQCQoRUNITykgIiAgIElNUE9SVFNSQ0RJUjogJChJTVBPUlRTUkNESVIpIgotCUAkKEVDSE8pIC0tLS0tLS0tLS0tLS0tY29tbW9uL0RlZnMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlAJChFQ0hPKSAiIgotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0uUEhPTlk6IGFsbCBkb2NzIGNvcmVkb2NzIHJlbC1kb2NzIGVjaG92YWx1ZXMgb3RoZXJkb2NzIHJlbC1jb3JlZG9jcyBcCi0gICAgICAgIHNhbml0eWNoZWNrY29yZWRvY3MgJChBTExfT1RIRVJfVEFSR0VUUykKLQpkaWZmIC0tZ2l0IGEvamRrL21ha2VmaWxlcy9kb2NzL05PTl9DT1JFX1BLR1MuZ21rIGIvamRrL21ha2VmaWxlcy9kb2NzL05PTl9DT1JFX1BLR1MuZ21rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjgyMDhiLi4wMDAwMDAwCi0tLSBhL2pkay9tYWtlZmlsZXMvZG9jcy9OT05fQ09SRV9QS0dTLmdtaworKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0jCi0jIENvcHlyaWdodCAoYykgMjAwMiwgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotIwotIyBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotIyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMKLSMgcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotIyBieSBPcmFjbGUgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSMKLSMgVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0jIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotIyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSMgYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotIyAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0jIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSMKLSMgUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKLSMgb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQotIyBxdWVzdGlvbnMuCi0jCi0KLSMKLSMgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBwYWNrYWdlIG5hbWVzIG9mIGFsbCB0aGUgIm5vbi1jb3JlIiAKLSMgQVBJIHB1Ymxpc2hlZCBpbiB0aGUgSmF2YSAyIFNESyBkb2N1bWVudGF0aW9uLiAgIk5vbi1jb3JlIiBtZWFucwotIyBpdCBpbmNsdWRlcyBhbGwgcHVibGlzaGVkIEFQSSBvdXRzaWRlIG9mIHRoZSBKREsgQVBJIHNwZWNpZmljYXRpb24uCi0jCi0jIFRoZXNlIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgdXNlZCBieSBqYXZhZG9jIGluIAotIyBtYWtlL2RvY3MvTWFrZWZpbGUgYW5kIGFyZSByZWZlcmVuY2VkIGJ5IHRoZSBsb2NhbGl6YXRpb24KLSMgdGVhbSB3aGVuIGRldGVybWluaW5nIHdoaWNoIEFQSXMgdG8gZXh0cmFjdCBqYXZhZG9jCi0jIGNvbW1lbnRzIGZyb20uCi0KLURPTUFQSV9QS0dTICAgICAgPSBjb20uc3VuLmphdmEuYnJvd3Nlci5kb20gICBcCi0gICAgICAgICAgICAgICAgICAgb3JnLnczYy5kb20gICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgIG9yZy53M2MuZG9tLmJvb3RzdHJhcCAgICAgIFwKLSAgICAgICAgICAgICAgICAgICBvcmcudzNjLmRvbS5scyAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgb3JnLnczYy5kb20ucmFuZ2VzICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgIG9yZy53M2MuZG9tLnRyYXZlcnNhbCAgICAgIFwKLSAgICAgICAgICAgICAgICAgICBvcmcudzNjLmRvbS5odG1sICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgb3JnLnczYy5kb20uc3R5bGVzaGVldHMgICAgXAotICAgICAgICAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcyAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICBvcmcudzNjLmRvbS5ldmVudHMgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgb3JnLnczYy5kb20udmlld3MKLQotSkRJX1BLR1MgICAgICAgICA9IGNvbS5zdW4uamRpICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICBjb20uc3VuLmpkaS5ldmVudCAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgY29tLnN1bi5qZGkucmVxdWVzdCAgICAgICAgXAotICAgICAgICAgICAgICAgICAgIGNvbS5zdW4uamRpLmNvbm5lY3QgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICBjb20uc3VuLmpkaS5jb25uZWN0LnNwaQotCi1NR01UX1BLR1MgICAgICAgID0gY29tLnN1bi5tYW5hZ2VtZW50Ci0KLUpBQVNfUEtHUyAgICAgICAgPSBjb20uc3VuLnNlY3VyaXR5LmF1dGggICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgIGNvbS5zdW4uc2VjdXJpdHkuYXV0aC5jYWxsYmFjayBcCi0gICAgICAgICAgICAgICAgICAgY29tLnN1bi5zZWN1cml0eS5hdXRoLmxvZ2luICAgIFwKLSAgICAgICAgICAgICAgICAgICBjb20uc3VuLnNlY3VyaXR5LmF1dGgubW9kdWxlCi0KLUpHU1NfUEtHUyAgICAgICAgPSBjb20uc3VuLnNlY3VyaXR5Lmpnc3MKLQotT0xEX0pTU0VfUEtHUyAgICA9IGNvbS5zdW4ubmV0LnNzbAotCi1IVFRQU0VSVkVSX1BLR1MgID0gY29tLnN1bi5uZXQuaHR0cHNlcnZlciAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgY29tLnN1bi5uZXQuaHR0cHNlcnZlci5zcGkgCi0KLU5JT19QS0dTICAgICAgICAgPSBjb20uc3VuLm5pby5maWxlCi0KLURPQ0xFVEFQSV9QS0dTICAgPSBjb20uc3VuLmphdmFkb2MKLQotVEFHTEVUQVBJX0ZJTEUgICA9IGNvbS9zdW4vdG9vbHMvZG9jbGV0cy9UYWdsZXQuamF2YQotCi1BVFRBQ0hfUEtHUyAgICAgID0gY29tLnN1bi50b29scy5hdHRhY2ggICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgY29tLnN1bi50b29scy5hdHRhY2guc3BpCi0KLUpDT05TT0xFX1BLR1MgICAgPSBjb20uc3VuLnRvb2xzLmpjb25zb2xlCi0KLVRSRUVBUElfUEtHUyAJID0gY29tLnN1bi5zb3VyY2UudHJlZSBcCi0JCSAgIGNvbS5zdW4uc291cmNlLnV0aWwKLQotU01BUlRDQVJESU9fUEtHUyA9IGphdmF4LnNtYXJ0Y2FyZGlvCi0KLVNDVFBBUElfUEtHUyAgICAgPSBjb20uc3VuLm5pby5zY3RwCi0KLWlmZXEgKCQoUExBVEZPUk0pLCBtYWNvc3gpCi1BUFBMRV9FWFRfUEtHUyAgID0gY29tLmFwcGxlLmNvbmN1cnJlbnQgICBcCi0gICAgICAgICAgICAgICAgICAgY29tLmFwcGxlLmVhd3QgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgY29tLmFwcGxlLmVhd3QuZXZlbnQgICBcCi0gICAgICAgICAgICAgICAgICAgY29tLmFwcGxlLmVpbwotZW5kaWYKLQotIyBub24tY29yZSBwYWNrYWdlcyBpbiBydC5qYXIKLU5PTl9DT1JFX1BLR1MgICAgPSAkKERPTUFQSV9QS0dTKSBcCi0gICAgICAgICAgICAgICAgICAgJChNR01UX1BLR1MpIFwKLSAgICAgICAgICAgICAgICAgICAkKEpBQVNfUEtHUykgXAotICAgICAgICAgICAgICAgICAgICQoSkdTU19QS0dTKSBcCi0gICAgICAgICAgICAgICAgICAgJChOSU9fUEtHUykgXAotICAgICAgICAgICAgICAgICAgICQoT0xEX0pTU0VfUEtHUykgXAotICAgICAgICAgICAgICAgICAgICQoSFRUUFNFUlZFUl9QS0dTKSBcCi0gICAgICAgICAgICAgICAgICAgJChTTUFSVENBUkRJT19QS0dTKSBcCi0gICAgICAgICAgICAgICAgICAgJChTQ1RQQVBJX1BLR1MpIFwKLSAgICAgICAgICAgICAgICAgICAkKEFQUExFX0VYVF9QS0dTKQotCmRpZmYgLS1naXQgYS9qZGsvbWFrZWZpbGVzL2RvY3MvTm90ZXMuaHRtbCBiL2pkay9tYWtlZmlsZXMvZG9jcy9Ob3Rlcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2Q4YWUxLi4wMDAwMDAwCi0tLSBhL2pkay9tYWtlZmlsZXMvZG9jcy9Ob3Rlcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkRvYyBQcm9jZXNzIE5vdGVzPC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMz48YSBuYW1lPSJSRUdFWFAiPjwvYT48YnI+Ci1SRUdFWFA8L2gzPgotPHA+IFJFR0VYUCBpcyBhIGxpc3Qgb2Ygd2lsZGNhcmQgcGF0dGVybnMgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhY2thZ2VzIGxpc3RlZCAKLSAgaW4gQ09SRV9QS0dTLmdtayBnbyBpbnRvIHdoaWNoIHN1bW1hcnktdGFibGUgb24gdGhlIG1haW4gQVBJIGluZGV4IHBhZ2UuIEl0IAotICB3YXMgbW90aXZhdGVkIGJ5IHRoZSBuZWVkIHRvIGRpdmlkZSB0aGUgd29ybGQgaW50byAmcXVvdDtjb3JlIHBhY2thZ2VzJnF1b3Q7IAotICAoamF2YS4qKSBhbmQgJnF1b3Q7ZXh0ZW5zaW9uIHBhY2thZ2VzJnF1b3Q7IChqYXZheC4qKS4gSW4gdGltZSwgdGhlIGRpc3RpbmN0aW9uIAotICB3ZW50IGF3YXkuIFRoZSB3aG9sZSB0YWJsZSBpcyBub3cgY2FsbGVkICZxdW90O1BsYXRmb3JtIFBhY2thZ2VzJnF1b3Q7LS13aGljaCAKLSAgZWxpbWluYXRlZCB0aGUgbmVlZCBmb3IgdGhpcyBsaXN0IG9mIHJlZ3VsYXIgZXhwcmVzc2lvbnMuIEJ1dCBpdCBsaW5nZXJlZCBvbiwgCi0gIGFjY3JldGluZyBhbGwgb2YgdGhlIHBhY2thZ2VzIGluIHRoZSBKVk0sIG9uZSBieSBvbmUuIEkgcHJ1bmVkIGl0IGJhY2sgdG8gJnF1b3Q7KiZxdW90OywgCi0gIHNvIGl0IG5vdyBjb3ZlcnMgZXZlcnkgcGFja2FnZSBpbiB0aGUgSmF2YSBwbGF0Zm9ybSBBUEkgZG9jcy4gSWYgc29tZSBzZXBhcmF0aW9uIAotICBpcyBuZWVkZWQgaW4gdGhlIGZ1dHVyZSwgaXQgY2FuIGdyb3cgYmFjayBpbnRvIGEgY29sb24tc2VwYXJhdGVkIGxpc3QsIHN0YXJ0aW5nIAotICB3aXRoIHRoaXMsIHdoaWNoIGlzIGluIGFsbCByZXNwZWN0cyBlcXVpdmFsZW50IHRvICZxdW90OyomcXVvdDsgYXQgdGhpcyBwb2ludCAKLSAgaW4gdGltZTo8L3A+Ci08YmxvY2txdW90ZT4gCi0gIDxwcmU+UkVHRVhQID0gJnF1b3Q7amF2YS4qOmphdmF4Lio6b3JnLmlldGYqOm9yZy5vbWcuPC9wcmU+Ci08L2Jsb2NrcXVvdGU+Ci08aDM+PGEgbmFtZT0icmVsZWFzZVRhcmdldHMiPjwvYT48YnI+Ci0gIFJlbGVhc2UgVGFyZ2V0czwvaDM+Ci08cD4gKFRoYW5rcyB0byBLZWxseSBPJ0hhaXIgZm9yIHRoaXMgaW5mby4pPC9wPgotPHA+IFRoZSA8dHQ+cmVsLWNvcmVkb2NzPC90dD4gYW5kIDx0dD5yZWwtZG9jczwvdHQ+IHRhcmdldHMgd2VyZSBhZGRlZCBieSBFcmljIAotICBBcm1zdHJvbmcuIDx0dD5yZWwtY29yZWRvY3M8L3R0PiBhc3N1bWVzIHRoZSBraW5kIG9mIGxhcmdlLCAzMi1iaXQgbWFjaGluZSB1c2VkIAotICBpbiB0aGUgamF2YXB1YnMgZ3JvdXAncyBkb2NzLXJlbGVhc2UgcHJvY2Vzcy4gSXQgc3BlY2lmaWVzIG1lbW9yeSBzZXR0aW5ncyBhY2NvcmRpbmdseSAKLSAgdG8gbWF4aW1pemUgcGVyZm9ybWFuY2UuPC9wPgotPHA+IFRoZSBwZXJmb3JtYW5jZSBzZXR0aW5ncywgbGlrZSB0aGUgc2FuaXR5IGNoZWNrLCBhcmUgbW9zdCBpbXBvcnRhbnQgZm9yIHRoZSAKLSAgY29yZSBkb2NzLS10aGUgcGxhdGZvcm0gQVBJcy4gUnVubmluZyBqYXZhZG9jIG9uIHRob3NlIEFQSXMgdGFrZXMgYSBzaWduaWZpY2FudCAKLSAgYW1vdW50IG9mIHRpbWUgYW5kIG1lbW9yeS4gU2V0dGluZyB0aGUgaW5pdGlhbCBoZWFwIHNpemUgYXMgbGFyZ2UgYXMgcG9zc2libGUgCi0gIGlzIGltcG9ydGFudCB0byBwcmV2ZW50IHRocmFzaGluZyBhcyB0aGUgaGVhcCBncm93cy4gU2V0dGluZyB0aGUgbWF4aW11bSBhcyAKLSAgbGFyZ2UgYXMgbmVjZXNzYXJ5IGlzIGFsc28gaW1wb3J0YW50IHRvIGtlZXAgdGhlIGpvYiBmcm9tIGZhaWxpbmcuPC9wPgotPGJsb2NrcXVvdGU+Ci0gIDxwPiA8dHQ+LUotWG14NTEyPC90dD4gc2V0cyBhIG1heGltdW0gb2YgNTEyLCB3aGljaCBiZWNhbWUgbmVjZXNzYXJ5IGluIDYuMDxicj4KLSAgICA8dHQ+LUotWG1zMjU2PC90dD4gc2V0cyBzdGFydGluZyBzaXplIHRvIDI1NiAoZGVmYXVsdCBpcyA4KTwvcD4KLTwvYmxvY2txdW90ZT4KLTxwPiA8dHQ+cmVsLWNvcmVkb2NzPC90dD4gYWxzbyBpbmNsdWRlcyBhIHNhbml0eSBjaGVjayB0byBoZWxwIGVuc3VyZSB0aGF0IDx0dD5CVUlMRF9OVU1CRVI8L3R0PiAKLSAgYW5kIDx0dD5NSUxFU1RPTkU8L3R0PiBhcmUgc3BlY2lmaWVkIHByb3Blcmx5IHdoZW4gZG9jcyBhcmUgYnVpbHQgb3V0c2lkZSBvZiAKLSAgdGhlIG5vcm1hbCByZWxlYXNlIGVuZ2luZWVyaW5nIHByb2Nlc3MsIHdpdGggdGhlIGludGVudGlvbiBvZiByZWxlYXNpbmcgdGhlbSAKLSAgb24gdGhlIHdlYiBvciBpbiBhIGRvd25sb2FkZWQgZG9jcyBidW5kbGUuIChXaGVuIGludm9rZWQgaW4gcmVsZWFzZSBlbmdpbmVlcmluZydzIAotICBjb250cm9sIGJ1aWxkLCB0aGUgdmFsdWVzIGFyZSBhbHdheXMgc2V0IHByb3Blcmx5LiBCdXQgd2hlbiB0aGUgdGFyZ2V0cyBhcmUgCi0gIHJ1biBieSB0aGVtc2VsdmVzLCB0aGV5IGRlZmF1bHQgdG8gYjAwIGFuZCAmcXVvdDtpbnRlcm5hbCZxdW90Oy0td2hpY2ggc2lsZW50bHkgCi0gIHNhYm90YWdlIHRoZSByZXN1bHQgb2YgYSBidWlsZCB0aGF0IGNhbiB0YWtlIG1hbnkgaG91cnMgdG8gY29tcGxldGUuPC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvamRrL21ha2VmaWxlcy9tYXBmaWxlcy9sYXVuY2hlcnMvbWFwZmlsZS1pNTg2IGIvamRrL21ha2VmaWxlcy9tYXBmaWxlcy9sYXVuY2hlcnMvbWFwZmlsZS1pNTg2CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODA2MWRkLi4wMDAwMDAwCi0tLSBhL2pkay9tYWtlZmlsZXMvbWFwZmlsZXMvbGF1bmNoZXJzL21hcGZpbGUtaTU4NgorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDExLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0jCi0jIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0jIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0jIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcwotIyBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0jIGJ5IE9yYWNsZSBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotIwotIyBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0jIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotIyBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0jIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSMgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotIwotIyBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQotIyBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55Ci0jIHF1ZXN0aW9ucy4KLSMKLSMKLSMgU3BlY2lmeSB3aGF0IGdsb2JhbCBzeW1ib2xzIHdlIGV4cG9ydC4gIE5vdGUgdGhhdCB3ZSdyZSBub3QgcmVhbGx5Ci0jIGludGVyZXN0ZWQgaW4gZGVjbGFyaW5nIGEgdmVyc2lvbiwgc2ltcGx5IHNjb3BpbmcgdGhlIGZpbGUgaXMgc3VmZmljaWVudC4KLSMKLQotU1VOV3ByaXZhdGVfMS4xIHsKLQlnbG9iYWw6Ci0JCW1haW47CQkjIFByb3ZpZGVzIGJhc2ljIGFkYiBzeW1ib2wgb2Zmc2V0cwotCQllbnZpcm9uOwkjIFB1YmxpYyBzeW1ib2xzIGFuZCByZXF1aXJlZCBieSBKYXZhIHJ1biB0aW1lCi0JCV9lbnZpcm9uOwotCQlfX2Vudmlyb25fbG9jazsKLQkJX19fQXJndjsJIyBUaGUgZm9sbG93aW5nIGFyZSBwcml2YXRlLCBidXQgYXMgdGhleSBhcmUKLQkJX3N0YXJ0OwkJIyBleHBvcnRlZCBmcm9tIGN0cjEvY3J0biwgdGhlIGNsZXZlciBoYWNrZXIKLQkJX2luaXQ7CQkjIG1pZ2h0IGtub3cgYWJvdXQgdGhlbS4gIEhvd2V2ZXIgbm90ZSwgdGhhdAotCQlfZmluaTsJCSMgdGhlaXIgdXNlIGlzIHN0cmljdGx5IG5vdCBzdXBwb3J0ZWQuCi0JCV9saWJfdmVyc2lvbjsKLSMJCV9tY291bnQ7Ci0JCV9fZnNyOwotCQlfX2Zzcl9pbml0X3ZhbHVlOwotCQlfX2xvbmdkb3VibGVfdXNlZDsKLQotCWxvY2FsOgotCQkqOwotfTsKZGlmZiAtLWdpdCBhL2pkay9tYWtlZmlsZXMvbWFwZmlsZXMvbGliYXd0X2hlYWRsZXNzL3Jlb3JkZXItaTU4NiBiL2pkay9tYWtlZmlsZXMvbWFwZmlsZXMvbGliYXd0X2hlYWRsZXNzL3Jlb3JkZXItaTU4NgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRlOTIzYi4uMDAwMDAwMAotLS0gYS9qZGsvbWFrZWZpbGVzL21hcGZpbGVzL2xpYmF3dF9oZWFkbGVzcy9yZW9yZGVyLWk1ODYKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jIFRlbXBvcmFyeSBmaWxlIGZvciBoZWFkbGVzcwpkaWZmIC0tZ2l0IGEvamRrL21ha2VmaWxlcy9tYXBmaWxlcy9saWJqYXZhL3Jlb3JkZXItaTU4NiBiL2pkay9tYWtlZmlsZXMvbWFwZmlsZXMvbGliamF2YS9yZW9yZGVyLWk1ODYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlYjc4ZmIuLjAwMDAwMDAKLS0tIGEvamRrL21ha2VmaWxlcy9tYXBmaWxlcy9saWJqYXZhL3Jlb3JkZXItaTU4NgorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi1kYXRhID0gUjB4MjAwMDsKLXRleHQgPSBMT0FEID9SWE87Ci0jIFRlc3QgTnVsbAotdGV4dDogLnRleHQlX2luaXQ7Ci10ZXh0OiAudGV4dCVpbml0NjRJTzogT1VUUFVURElSL1VuaXhGaWxlU3lzdGVtX21kLm87Ci10ZXh0OiAudGV4dCVKTklfT25Mb2FkOwotdGV4dDogLnRleHQlQ2Fub25pY2FsaXplOwotdGV4dDogLnRleHQlY2Fub25pY2FsaXplOwotdGV4dDogLnRleHQlY29sbGFwc2U6IE9VVFBVVERJUi9jYW5vbmljYWxpemVfbWQubzsKLXRleHQ6IC50ZXh0JUphdmFfamF2YV9sYW5nX09iamVjdF9yZWdpc3Rlck5hdGl2ZXM7Ci10ZXh0OiAudGV4dCVKYXZhX2phdmFfbGFuZ19TeXN0ZW1fcmVnaXN0ZXJOYXRpdmVzOwotdGV4dDogLnRleHQlSmF2YV9qYXZhX2xhbmdfVGhyZWFkX3JlZ2lzdGVyTmF0aXZlczsKLXRleHQ6IC50ZXh0JUphdmFfamF2YV9zZWN1cml0eV9BY2Nlc3NDb250cm9sbGVyX2dldFN0YWNrQWNjZXNzQ29udHJvbENvbnRleHQ7Ci10ZXh0OiAudGV4dCVKYXZhX2phdmFfc2VjdXJpdHlfQWNjZXNzQ29udHJvbGxlcl9nZXRJbmhlcml0ZWRBY2Nlc3NDb250cm9sQ29udGV4dDsKLXRleHQ6IC50ZXh0JUphdmFfamF2YV9sYW5nX0NsYXNzTG9hZGVyX3JlZ2lzdGVyTmF0aXZlczsKLXRleHQ6IC50ZXh0JUphdmFfamF2YV9zZWN1cml0eV9BY2Nlc3NDb250cm9sbGVyX2RvUHJpdmlsZWdlZF9fTGphdmFfc2VjdXJpdHlfUHJpdmlsZWdlZEFjdGlvbl8yOwotdGV4dDogLnRleHQlSmF2YV9qYXZhX2xhbmdfQ2xhc3NfcmVnaXN0ZXJOYXRpdmVzOwotdGV4dDogLnRleHQlSmF2YV9qYXZhX2xhbmdfQ2xhc3NfZ2V0UHJpbWl0aXZlQ2xhc3M7Ci10ZXh0OiAudGV4dCVKYXZhX2phdmFfbGFuZ19TeXN0ZW1faW5pdFByb3BlcnRpZXM7Ci10ZXh0OiAudGV4dCVHZXRKYXZhUHJvcGVydGllczsKLXRleHQ6IC50ZXh0JXVuYW1lOiBPVVRQVVRESVIvamF2YV9wcm9wc19tZC5vOwotdGV4dDogLnRleHQlbWFwTG9va3VwOiBPVVRQVVRESVIvamF2YV9wcm9wc19tZC5vOwotdGV4dDogLnRleHQlc2V0UGF0aEVudmlyb25tZW50OiBPVVRQVVRESVIvamF2YV9wcm9wc19tZC5vOwotdGV4dDogLnRleHQlSk5VX05ld1N0cmluZ1BsYXRmb3JtOwotdGV4dDogLnRleHQlSk5VX0NhbGxTdGF0aWNNZXRob2RCeU5hbWU7Ci10ZXh0OiAudGV4dCVOZXdTdHJpbmdQbGF0Zm9ybTsKLXRleHQ6IC50ZXh0JUphdmFfamF2YV9pb19GaWxlSW5wdXRTdHJlYW1faW5pdElEczsKLXRleHQ6IC50ZXh0JUphdmFfamF2YV9pb19GaWxlRGVzY3JpcHRvcl9pbml0SURzOwotdGV4dDogLnRleHQlSmF2YV9qYXZhX2lvX0ZpbGVPdXRwdXRTdHJlYW1faW5pdElEczsKLXRleHQ6IC50ZXh0JUphdmFfamF2YV9sYW5nX1N5c3RlbV9zZXRJbjA7Ci10ZXh0OiAudGV4dCVKYXZhX3N1bl9yZWZsZWN0X1JlZmxlY3Rpb25fZ2V0Q2FsbGVyQ2xhc3M7Ci10ZXh0OiAudGV4dCVKYXZhX2phdmFfbGFuZ19DbGFzc19mb3JOYW1lMDsKLXRleHQ6IC50ZXh0JUphdmFfamF2YV9sYW5nX1N0cmluZ19pbnRlcm47Ci10ZXh0OiAudGV4dCVKYXZhX3N1bl9yZWZsZWN0X05hdGl2ZUNvbnN0cnVjdG9yQWNjZXNzb3JJbXBsX25ld0luc3RhbmNlMDsKLXRleHQ6IC50ZXh0JUphdmFfamF2YV9sYW5nX1Rocm93YWJsZV9maWxsSW5TdGFja1RyYWNlOwotdGV4dDogLnRleHQlSmF2YV9qYXZhX2xhbmdfU3lzdGVtX3NldE91dDA7Ci10ZXh0OiAudGV4dCVKYXZhX2phdmFfbGFuZ19TeXN0ZW1fc2V0RXJyMDsKLXRleHQ6IC50ZXh0JUphdmFfamF2YV9sYW5nX0NvbXBpbGVyX3JlZ2lzdGVyTmF0aXZlczsKLXRleHQ6IC50ZXh0JUphdmFfamF2YV9pb19GaWxlU3lzdGVtX2dldEZpbGVTeXN0ZW07Ci10ZXh0OiAudGV4dCVKTlVfTmV3T2JqZWN0QnlOYW1lOwotdGV4dDogLnRleHQlSmF2YV9qYXZhX2lvX1VuaXhGaWxlU3lzdGVtX2luaXRJRHM7Ci10ZXh0OiAudGV4dCVKYXZhX2phdmFfc2VjdXJpdHlfQWNjZXNzQ29udHJvbGxlcl9kb1ByaXZpbGVnZWRfX0xqYXZhX3NlY3VyaXR5X1ByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb25fMjsKLXRleHQ6IC50ZXh0JUphdmFfamF2YV9pb19Vbml4RmlsZVN5c3RlbV9saXN0OwotdGV4dDogLnRleHQlSk5VX0dldFN0cmluZ1BsYXRmb3JtQ2hhcnM7Ci10ZXh0OiAudGV4dCVKTlVfUmVsZWFzZVN0cmluZ1BsYXRmb3JtQ2hhcnM7Ci10ZXh0OiAudGV4dCVKTlVfQ2xhc3NTdHJpbmc7Ci10ZXh0OiAudGV4dCVKTlVfQ29weU9iamVjdEFycmF5OwotdGV4dDogLnRleHQlSmF2YV9qYXZhX2lvX1VuaXhGaWxlU3lzdGVtX2Nhbm9uaWNhbGl6ZTsKLXRleHQ6IC50ZXh0JUphdmFfamF2YV9pb19Vbml4RmlsZVN5c3RlbV9nZXRCb29sZWFuQXR0cmlidXRlczA7Ci10ZXh0OiAudGV4dCVKYXZhX2phdmFfbGFuZ19DbGFzc0xvYWRlcl9maW5kTG9hZGVkQ2xhc3M7Ci10ZXh0OiAudGV4dCVKYXZhX2phdmFfbGFuZ19DbGFzc0xvYWRlcl9maW5kQm9vdHN0cmFwQ2xhc3M7Ci10ZXh0OiAudGV4dCVKYXZhX2phdmFfc2VjdXJpdHlfQWNjZXNzQ29udHJvbGxlcl9kb1ByaXZpbGVnZWRfX0xqYXZhX3NlY3VyaXR5X1ByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb25fMkxqYXZhX3NlY3VyaXR5X0FjY2Vzc0NvbnRyb2xDb250ZXh0XzI7Ci10ZXh0OiAudGV4dCVKYXZhX2phdmFfbGFuZ19TeXN0ZW1fbWFwTGlicmFyeU5hbWU7Ci10ZXh0OiAudGV4dCVjcGNoYXJzOiBPVVRQVVRESVIvU3lzdGVtLm87Ci10ZXh0OiAudGV4dCVKYXZhX2phdmFfbGFuZ19DbGFzc0xvYWRlcl8wMDAyNE5hdGl2ZUxpYnJhcnlfbG9hZDsKLXRleHQ6IC50ZXh0JUphdmFfamF2YV9sYW5nX0NsYXNzTG9hZGVyXzAwMDI0TmF0aXZlTGlicmFyeV9maW5kOwotdGV4dDogLnRleHQlSmF2YV9qYXZhX2xhbmdfRmxvYXRfZmxvYXRUb0ludEJpdHM7Ci10ZXh0OiAudGV4dCVKYXZhX2phdmFfbGFuZ19Eb3VibGVfZG91YmxlVG9Mb25nQml0czsKLXRleHQ6IC50ZXh0JUphdmFfamF2YV9pb19GaWxlSW5wdXRTdHJlYW1fb3BlbjsKLXRleHQ6IC50ZXh0JWZpbGVPcGVuOwotdGV4dDogLnRleHQlSmF2YV9qYXZhX2lvX1VuaXhGaWxlU3lzdGVtX2dldExlbmd0aDsKLXRleHQ6IC50ZXh0JUphdmFfamF2YV9pb19GaWxlSW5wdXRTdHJlYW1fcmVhZEJ5dGVzOwotdGV4dDogLnRleHQlcmVhZEJ5dGVzOwotdGV4dDogLnRleHQlSmF2YV9qYXZhX2lvX0ZpbGVJbnB1dFN0cmVhbV9jbG9zZTA7Ci10ZXh0OiAudGV4dCVKYXZhX2phdmFfbGFuZ19PYmplY3RfZ2V0Q2xhc3M7Ci10ZXh0OiAudGV4dCVKYXZhX2phdmFfbGFuZ19DbGFzc0xvYWRlcl9kZWZpbmVDbGFzczA7Ci10ZXh0OiAudGV4dCVWZXJpZnlDbGFzc0NvZGVzOwotIyBUZXN0IEV4aXQKLXRleHQ6IC50ZXh0JUphdmFfamF2YV9sYW5nX1NodXRkb3duX2hhbHQ7Ci0jIFRlc3QgSGVsbG8KLXRleHQ6IC50ZXh0JUphdmFfamF2YV9pb19GaWxlT3V0cHV0U3RyZWFtX3dyaXRlQnl0ZXM7Ci10ZXh0OiAudGV4dCV3cml0ZUJ5dGVzOwotIyBUZXN0IFNsZWVwCi0jIFRlc3QgSW50VG9TdHJpbmcKLSMgVGVzdCBMb2FkVG9vbGtpdAotdGV4dDogLnRleHQlSmF2YV9qYXZhX3V0aWxfUmVzb3VyY2VCdW5kbGVfZ2V0Q2xhc3NDb250ZXh0OwotdGV4dDogLnRleHQlSmF2YV9qYXZhX3NlY3VyaXR5X0FjY2Vzc0NvbnRyb2xsZXJfZG9Qcml2aWxlZ2VkX19MamF2YV9zZWN1cml0eV9Qcml2aWxlZ2VkQWN0aW9uXzJMamF2YV9zZWN1cml0eV9BY2Nlc3NDb250cm9sQ29udGV4dF8yOwotdGV4dDogLnRleHQlSk5VX0dldEVudjsKLXRleHQ6IC50ZXh0JUphdmFfamF2YV9pb19Vbml4RmlsZVN5c3RlbV9jaGVja0FjY2VzczsKLXRleHQ6IC50ZXh0JUphdmFfc3VuX3JlZmxlY3RfTmF0aXZlTWV0aG9kQWNjZXNzb3JJbXBsX2ludm9rZTA7Ci10ZXh0OiAudGV4dCVKYXZhX2phdmFfbGFuZ19yZWZfRmluYWxpemVyX2ludm9rZUZpbmFsaXplTWV0aG9kOwotdGV4dDogLnRleHQlSmF2YV9qYXZhX2lvX0ZpbGVJbnB1dFN0cmVhbV9hdmFpbGFibGU7Ci10ZXh0OiAudGV4dCVKYXZhX2phdmFfbGFuZ19yZWZsZWN0X0FycmF5X25ld0FycmF5OwotdGV4dDogLnRleHQlSmF2YV9qYXZhX2xhbmdfVGhyb3dhYmxlX2dldFN0YWNrVHJhY2VEZXB0aDsKLXRleHQ6IC50ZXh0JUphdmFfamF2YV9sYW5nX1Rocm93YWJsZV9nZXRTdGFja1RyYWNlRWxlbWVudDsKLXRleHQ6IC50ZXh0JUphdmFfamF2YV9sYW5nX1N5c3RlbV9pZGVudGl0eUhhc2hDb2RlOwotdGV4dDogLnRleHQlSmF2YV9zdW5fbWlzY19TaWduYWxfZmluZFNpZ25hbDsKLXRleHQ6IC50ZXh0JUphdmFfc3VuX21pc2NfU2lnbmFsX2hhbmRsZTA7Ci10ZXh0OiAudGV4dCVKTlVfTm90aWZ5QWxsOwotIyBUZXN0IExvYWRGcmFtZQotdGV4dDogLnRleHQlSk5VX0NhbGxNZXRob2RCeU5hbWU7Ci10ZXh0OiAudGV4dCVKTlVfQ2FsbE1ldGhvZEJ5TmFtZVY7Ci10ZXh0OiAudGV4dCVKYXZhX2phdmFfdXRpbF9sb2dnaW5nX0ZpbGVIYW5kbGVyX2xvY2tGaWxlOwotdGV4dDogLnRleHQlSmF2YV9qYXZhX2lvX0ZpbGVPdXRwdXRTdHJlYW1fb3BlbjsKLXRleHQ6IC50ZXh0JUphdmFfamF2YV9pb19Vbml4RmlsZVN5c3RlbV9jcmVhdGVEaXJlY3Rvcnk7Ci10ZXh0OiAudGV4dCVKYXZhX2phdmFfaW9fVW5peEZpbGVTeXN0ZW1fZ2V0TGFzdE1vZGlmaWVkVGltZTsKLXRleHQ6IC50ZXh0JUphdmFfamF2YV91dGlsX3ByZWZzX0ZpbGVTeXN0ZW1QcmVmZXJlbmNlc19sb2NrRmlsZTA7Ci10ZXh0OiAudGV4dCVKYXZhX2phdmFfaW9fVW5peEZpbGVTeXN0ZW1fc2V0TGFzdE1vZGlmaWVkVGltZTsKLXRleHQ6IC50ZXh0JUphdmFfamF2YV91dGlsX3ByZWZzX0ZpbGVTeXN0ZW1QcmVmZXJlbmNlc191bmxvY2tGaWxlMDsKLXRleHQ6IC50ZXh0JUphdmFfamF2YV9pb19GaWxlT3V0cHV0U3RyZWFtX2Nsb3NlMDsKLXRleHQ6IC50ZXh0JUphdmFfamF2YV91dGlsX2xvZ2dpbmdfRmlsZUhhbmRsZXJfdW5sb2NrRmlsZTsKLSMgVGVzdCBMb2FkSkZyYW1lCi10ZXh0OiAudGV4dCVKYXZhX2phdmFfbGFuZ19DbGFzc19pc0Fzc2lnbmFibGVGcm9tOwotdGV4dDogLnRleHQlSmF2YV9qYXZhX2xhbmdfQ2xhc3NfaXNJbnN0YW5jZTsKLSMgVGVzdCBKSGVsbG8KLSMgU3dpbmdTZXQKLXRleHQ6IC50ZXh0JUphdmFfamF2YV91dGlsX1RpbWVab25lX2dldFN5c3RlbVRpbWVab25lSUQ7Ci10ZXh0OiAudGV4dCVmaW5kSmF2YVRaX21kOwotdGV4dDogLnRleHQlSmF2YV9qYXZhX2xhbmdfU3RyaWN0TWF0aF9sb2c7CmRpZmYgLS1naXQgYS9qZGsvbWFrZWZpbGVzL21hcGZpbGVzL2xpYmpwZWcvcmVvcmRlci1pNTg2IGIvamRrL21ha2VmaWxlcy9tYXBmaWxlcy9saWJqcGVnL3Jlb3JkZXItaTU4NgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI4YzZkYy4uMDAwMDAwMAotLS0gYS9qZGsvbWFrZWZpbGVzL21hcGZpbGVzL2xpYmpwZWcvcmVvcmRlci1pNTg2CisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLWRhdGEgPSBSMHgyMDAwOwotdGV4dCA9IExPQUQgP1JYTzsKLSMgVGVzdCBOdWxsCi0jIFRlc3QgRXhpdAotIyBUZXN0IEhlbGxvCi0jIFRlc3QgU2xlZXAKLSMgVGVzdCBJbnRUb1N0cmluZwotIyBUZXN0IExvYWRUb29sa2l0Ci0jIFRlc3QgTG9hZEZyYW1lCi0jIFRlc3QgTG9hZEpGcmFtZQotIyBUZXN0IEpIZWxsbwotIyBTd2luZ1NldAotdGV4dDogLnRleHQlSk5JX09uTG9hZDsKLXRleHQ6IC50ZXh0JUphdmFfc3VuX2F3dF9pbWFnZV9KUEVHSW1hZ2VEZWNvZGVyX2luaXRJRHM7Ci10ZXh0OiAudGV4dCVKYXZhX3N1bl9hd3RfaW1hZ2VfSlBFR0ltYWdlRGVjb2Rlcl9yZWFkSW1hZ2U7Ci10ZXh0OiAudGV4dCVqU3RkRXJyb3I7Ci10ZXh0OiAudGV4dCVqQ3JlYURlY29tcHJlc3M7Ci10ZXh0OiAudGV4dCVqSU1lbU1ncjsKLXRleHQ6IC50ZXh0JWpNZW1Jbml0OwotdGV4dDogLnRleHQlakdldFNtYWxsOwotdGV4dDogLnRleHQlaklNUmVhZGVyOwotdGV4dDogLnRleHQlYWxsb2Nfc21hbGw6IE9VVFBVVERJUi9qbWVtbWdyLm87Ci10ZXh0OiAudGV4dCVyZXNldF9tYXJrZXJfcmVhZGVyOiBPVVRQVVRESVIvamRtYXJrZXIubzsKLXRleHQ6IC50ZXh0JWpJSW5DdGxyOwotIyB0ZXh0OiAudGV4dCVHRVRfQVJSQVlTOiBPVVRQVVRESVIvanBlZ2RlY29kZXIubzsKLXRleHQ6IC50ZXh0JWpSZWFkSGVhZGVyOwotdGV4dDogLnRleHQlakNvbnN1bWVJbnB1dDsKLXRleHQ6IC50ZXh0JXJlc2V0X2lucHV0X2NvbnRyb2xsZXI6IE9VVFBVVERJUi9qZGlucHV0Lm87Ci10ZXh0OiAudGV4dCVyZXNldF9lcnJvcl9tZ3I6IE9VVFBVVERJUi9qZXJyb3IubzsKLXRleHQ6IC50ZXh0JXN1bl9qcGVnX2luaXRfc291cmNlOwotdGV4dDogLnRleHQlY29uc3VtZV9tYXJrZXJzOiBPVVRQVVRESVIvamRpbnB1dC5vOwotdGV4dDogLnRleHQlcmVhZF9tYXJrZXJzOiBPVVRQVVRESVIvamRtYXJrZXIubzsKLSMgdGV4dDogLnRleHQlZmlyc3RfbWFya2VyOiBPVVRQVVRESVIvamRtYXJrZXIubzsKLXRleHQ6IC50ZXh0JXN1bl9qcGVnX2ZpbGxfaW5wdXRfYnVmZmVyOwotIyB0ZXh0OiAudGV4dCVSRUxFQVNFX0FSUkFZUzogT1VUUFVURElSL2pwZWdkZWNvZGVyLm87Ci0jIHRleHQ6IC50ZXh0JWdldF9zb2k6IE9VVFBVVERJUi9qZG1hcmtlci5vOwotdGV4dDogLnRleHQlZW1pdF9tZXNzYWdlOiBPVVRQVVRESVIvamVycm9yLm87Ci0jIHRleHQ6IC50ZXh0JW5leHRfbWFya2VyOiBPVVRQVVRESVIvamRtYXJrZXIubzsKLXRleHQ6IC50ZXh0JWdldF9pbnRlcmVzdGluZ19hcHBuOiBPVVRQVVRESVIvamRtYXJrZXIubzsKLSMgdGV4dDogLnRleHQlZXhhbWluZV9hcHAwOiBPVVRQVVRESVIvamRtYXJrZXIubzsKLXRleHQ6IC50ZXh0JXNraXBfdmFyaWFibGU6IE9VVFBVVERJUi9qZG1hcmtlci5vOwotdGV4dDogLnRleHQlc3VuX2pwZWdfc2tpcF9pbnB1dF9kYXRhOwotIyB0ZXh0OiAudGV4dCVleGFtaW5lX2FwcDE0OiBPVVRQVVRESVIvamRtYXJrZXIubzsKLXRleHQ6IC50ZXh0JWdldF9kcXQ6IE9VVFBVVERJUi9qZG1hcmtlci5vOwotdGV4dDogLnRleHQlakFsY1FUYWJsZTsKLXRleHQ6IC50ZXh0JWdldF9zb2Y6IE9VVFBVVERJUi9qZG1hcmtlci5vOwotIyB0ZXh0OiAudGV4dCVnZXRfZHJpOiBPVVRQVVRESVIvamRtYXJrZXIubzsKLXRleHQ6IC50ZXh0JWdldF9kaHQ6IE9VVFBVVERJUi9qZG1hcmtlci5vOwotdGV4dDogLnRleHQlakFsY0hUYWJsZTsKLXRleHQ6IC50ZXh0JWdldF9zb3M6IE9VVFBVVERJUi9qZG1hcmtlci5vOwotIyB0ZXh0OiAudGV4dCVpbml0aWFsX3NldHVwOiBPVVRQVVRESVIvamRpbnB1dC5vOwotdGV4dDogLnRleHQlakRpdlJvdW5kOwotIyB0ZXh0OiAudGV4dCVkZWZhdWx0X2RlY29tcHJlc3NfcGFybXM6IE9VVFBVVERJUi9qZGFwaW1pbi5vOwotdGV4dDogLnRleHQlakhhc011bHRTY247Ci10ZXh0OiAudGV4dCVqU3RydERlY29tcHJlc3M7Ci10ZXh0OiAudGV4dCVqSURNYXN0ZXI7Ci0jIHRleHQ6IC50ZXh0JW1hc3Rlcl9zZWxlY3Rpb246IE9VVFBVVERJUi9qZG1hc3Rlci5vOwotdGV4dDogLnRleHQlakNhbGNEaW1lbnNpb25zOwotIyB0ZXh0OiAudGV4dCV1c2VfbWVyZ2VkX3Vwc2FtcGxlOiBPVVRQVVRESVIvamRtYXN0ZXIubzsKLSMgdGV4dDogLnRleHQlcHJlcGFyZV9yYW5nZV9saW1pdF90YWJsZTogT1VUUFVURElSL2pkbWFzdGVyLm87Ci10ZXh0OiAudGV4dCVqSURDb2xvcjsKLSMgdGV4dDogLnRleHQlYnVpbGRfeWNjX3JnYl90YWJsZTogT1VUUFVURElSL2pkY29sb3IubzsKLXRleHQ6IC50ZXh0JWpJVXBzYW1wbGVyOwotdGV4dDogLnRleHQlalJvdW5kOwotdGV4dDogLnRleHQlYWxsb2Nfc2FycmF5OiBPVVRQVVRESVIvam1lbW1nci5vOwotdGV4dDogLnRleHQlYWxsb2NfbGFyZ2U6IE9VVFBVVERJUi9qbWVtbWdyLm87Ci10ZXh0OiAudGV4dCVqR2V0TGFyZ2U7Ci10ZXh0OiAudGV4dCVqSURQb3N0QzsKLXRleHQ6IC50ZXh0JWpJSURDVDsKLXRleHQ6IC50ZXh0JWpJSERlY29kZXI7Ci10ZXh0OiAudGV4dCVqSURDb2VmQzsKLXRleHQ6IC50ZXh0JWpJRE1haW5DOwotIyB0ZXh0OiAudGV4dCVhbGxvY19mdW5ueV9wb2ludGVyczogT1VUUFVURElSL2pkbWFpbmN0Lm87Ci10ZXh0OiAudGV4dCVyZWFsaXplX3ZpcnRfYXJyYXlzOiBPVVRQVVRESVIvam1lbW1nci5vOwotdGV4dDogLnRleHQlc3RhcnRfaW5wdXRfcGFzczogT1VUUFVURElSL2pkaW5wdXQubzsKLSMgdGV4dDogLnRleHQlcGVyX3NjYW5fc2V0dXA6IE9VVFBVVERJUi9qZGlucHV0Lm87Ci0jIHRleHQ6IC50ZXh0JWxhdGNoX3F1YW50X3RhYmxlczogT1VUUFVURElSL2pkaW5wdXQubzsKLXRleHQ6IC50ZXh0JXN0YXJ0X3Bhc3NfaHVmZl9kZWNvZGVyOiBPVVRQVVRESVIvamRodWZmLm87Ci10ZXh0OiAudGV4dCVqTWtERGVyaXZlZDsKLXRleHQ6IC50ZXh0JXN0YXJ0X2lucHV0X3Bhc3M6IE9VVFBVVERJUi9qZGNvZWZjdC5vOwotIyB0ZXh0OiAudGV4dCVzdGFydF9pTUNVX3JvdzogT1VUUFVURElSL2pkY29lZmN0Lm87Ci0jIHRleHQ6IC50ZXh0JW91dHB1dF9wYXNzX3NldHVwOiBPVVRQVVRESVIvamRhcGlzdGQubzsKLXRleHQ6IC50ZXh0JXByZXBhcmVfZm9yX291dHB1dF9wYXNzOiBPVVRQVVRESVIvamRtYXN0ZXIubzsKLXRleHQ6IC50ZXh0JXN0YXJ0X3Bhc3M6IE9VVFBVVERJUi9qZGRjdG1nci5vOwotdGV4dDogLnRleHQlc3RhcnRfb3V0cHV0X3Bhc3M6IE9VVFBVVERJUi9qZGNvZWZjdC5vOwotdGV4dDogLnRleHQlc3RhcnRfcGFzc19kY29sb3I6IE9VVFBVVERJUi9qZGNvbG9yLm87Ci10ZXh0OiAudGV4dCVzdGFydF9wYXNzX3Vwc2FtcGxlOiBPVVRQVVRESVIvamRzYW1wbGUubzsKLXRleHQ6IC50ZXh0JXN0YXJ0X3Bhc3NfZHBvc3Q6IE9VVFBVVERJUi9qZHBvc3RjdC5vOwotdGV4dDogLnRleHQlc3RhcnRfcGFzc19tYWluOiBPVVRQVVRESVIvamRtYWluY3QubzsKLSMgdGV4dDogLnRleHQlbWFrZV9mdW5ueV9wb2ludGVyczogT1VUUFVURElSL2pkbWFpbmN0Lm87Ci10ZXh0OiAudGV4dCVqUmVhZFNjYW5saW5lczsKLXRleHQ6IC50ZXh0JXByb2Nlc3NfZGF0YV9jb250ZXh0X21haW46IE9VVFBVVERJUi9qZG1haW5jdC5vOwotdGV4dDogLnRleHQlZGVjb21wcmVzc19vbmVwYXNzOiBPVVRQVVRESVIvamRjb2VmY3QubzsKLXRleHQ6IC50ZXh0JWpaZXJvRmFyOwotdGV4dDogLnRleHQlZGVjb2RlX21jdTogT1VUUFVURElSL2pkaHVmZi5vOwotdGV4dDogLnRleHQlakZpbEJpdEJ1ZjsKLXRleHQ6IC50ZXh0JWpIdWZEZWNvZGU7Ci10ZXh0OiAudGV4dCVqUkRpc2xvdzsKLXRleHQ6IC50ZXh0JXNlcF91cHNhbXBsZTogT1VUUFVURElSL2pkc2FtcGxlLm87Ci10ZXh0OiAudGV4dCVmdWxsc2l6ZV91cHNhbXBsZTogT1VUUFVURElSL2pkc2FtcGxlLm87Ci10ZXh0OiAudGV4dCVoMnYyX2ZhbmN5X3Vwc2FtcGxlOiBPVVRQVVRESVIvamRzYW1wbGUubzsKLXRleHQ6IC50ZXh0JXljY19yZ2JfY29udmVydDogT1VUUFVURElSL2pkY29sb3IubzsKLSMgdGV4dDogLnRleHQlc2V0X3dyYXBhcm91bmRfcG9pbnRlcnM6IE9VVFBVVERJUi9qZG1haW5jdC5vOwotIyB0ZXh0OiAudGV4dCVwcm9jZXNzX3Jlc3RhcnQ6IE9VVFBVVERJUi9qZGh1ZmYubzsKLXRleHQ6IC50ZXh0JXJlYWRfcmVzdGFydF9tYXJrZXI6IE9VVFBVVERJUi9qZG1hcmtlci5vOwotdGV4dDogLnRleHQlZmluaXNoX2lucHV0X3Bhc3M6IE9VVFBVVERJUi9qZGlucHV0Lm87Ci0jIHRleHQ6IC50ZXh0JXNldF9ib3R0b21fcG9pbnRlcnM6IE9VVFBVVERJUi9qZG1haW5jdC5vOwotdGV4dDogLnRleHQlakZpbkRlY29tcHJlc3M7Ci10ZXh0OiAudGV4dCVmaW5pc2hfb3V0cHV0X3Bhc3M6IE9VVFBVVERJUi9qZG1hc3Rlci5vOwotdGV4dDogLnRleHQlc3VuX2pwZWdfdGVybV9zb3VyY2U7Ci10ZXh0OiAudGV4dCVqQWJvcnQ7Ci10ZXh0OiAudGV4dCVmcmVlX3Bvb2w6IE9VVFBVVERJUi9qbWVtbWdyLm87Ci10ZXh0OiAudGV4dCVqRnJlZUxhcmdlOwotdGV4dDogLnRleHQlakZyZWVTbWFsbDsKLXRleHQ6IC50ZXh0JWpEZXN0RGVjb21wcmVzczsKLXRleHQ6IC50ZXh0JWpEZXN0cm95OwotdGV4dDogLnRleHQlc2VsZl9kZXN0cnVjdDogT1VUUFVURElSL2ptZW1tZ3IubzsKLXRleHQ6IC50ZXh0JWpNZW1UZXJtOwotdGV4dDogLnRleHQlcHJvY2Vzc19kYXRhX3NpbXBsZV9tYWluOiBPVVRQVVRESVIvamRtYWluY3QubzsKZGlmZiAtLWdpdCBhL2pkay9tYWtlZmlsZXMvbWFwZmlsZXMvbGlibmlvL21hcGZpbGUtYnNkIGIvamRrL21ha2VmaWxlcy9tYXBmaWxlcy9saWJuaW8vbWFwZmlsZS1ic2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzZjUwZmYuLjAwMDAwMDAKLS0tIGEvamRrL21ha2VmaWxlcy9tYXBmaWxlcy9saWJuaW8vbWFwZmlsZS1ic2QKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTEsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSMKLSMgVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzCi0jIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSMgYnkgT3JhY2xlIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0jCi0jIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSMgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0jIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSMgMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotIyBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0jCi0jIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCi0jIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKLSMgcXVlc3Rpb25zLgotIwotCi1TVU5XcHJpdmF0ZV8xLjEgewotCWdsb2JhbDoKLSAgICAgICAgICAgICAgICBKYXZhX2phdmFfbmlvX01hcHBlZEJ5dGVCdWZmZXJfZm9yY2UwOwotICAgICAgICAgICAgICAgIEphdmFfamF2YV9uaW9fTWFwcGVkQnl0ZUJ1ZmZlcl9pc0xvYWRlZDA7Ci0gICAgICAgICAgICAgICAgSmF2YV9qYXZhX25pb19NYXBwZWRCeXRlQnVmZmVyX2xvYWQwOwotICAgICAgICAgICAgICAgIEphdmFfc3VuX25pb19jaF9EYXRhZ3JhbUNoYW5uZWxJbXBsX2Rpc2Nvbm5lY3QwOwotICAgICAgICAgICAgICAgIEphdmFfc3VuX25pb19jaF9EYXRhZ3JhbUNoYW5uZWxJbXBsX2luaXRJRHM7Ci0gICAgICAgICAgICAgICAgSmF2YV9zdW5fbmlvX2NoX0RhdGFncmFtQ2hhbm5lbEltcGxfcmVjZWl2ZTA7Ci0gICAgICAgICAgICAgICAgSmF2YV9zdW5fbmlvX2NoX0RhdGFncmFtQ2hhbm5lbEltcGxfc2VuZDA7Ci0gICAgICAgICAgICAgICAgSmF2YV9zdW5fbmlvX2NoX0RhdGFncmFtRGlzcGF0Y2hlcl9yZWFkMDsKLSAgICAgICAgICAgICAgICBKYXZhX3N1bl9uaW9fY2hfRGF0YWdyYW1EaXNwYXRjaGVyX3JlYWR2MDsKLSAgICAgICAgICAgICAgICBKYXZhX3N1bl9uaW9fY2hfRGF0YWdyYW1EaXNwYXRjaGVyX3dyaXRlMDsKLSAgICAgICAgICAgICAgICBKYXZhX3N1bl9uaW9fY2hfRGF0YWdyYW1EaXNwYXRjaGVyX3dyaXRldjA7Ci0gICAgICAgICAgICAgICAgSmF2YV9zdW5fbmlvX2NoX0ZpbGVDaGFubmVsSW1wbF9jbG9zZTA7Ci0gICAgICAgICAgICAgICAgSmF2YV9zdW5fbmlvX2NoX0ZpbGVDaGFubmVsSW1wbF9pbml0SURzOwotICAgICAgICAgICAgICAgIEphdmFfc3VuX25pb19jaF9GaWxlQ2hhbm5lbEltcGxfbWFwMDsKLSAgICAgICAgICAgICAgICBKYXZhX3N1bl9uaW9fY2hfRmlsZUNoYW5uZWxJbXBsX3Bvc2l0aW9uMDsKLSAgICAgICAgICAgICAgICBKYXZhX3N1bl9uaW9fY2hfRmlsZUNoYW5uZWxJbXBsX3RyYW5zZmVyVG8wOwotICAgICAgICAgICAgICAgIEphdmFfc3VuX25pb19jaF9GaWxlQ2hhbm5lbEltcGxfdW5tYXAwOwotICAgICAgICAgICAgICAgIEphdmFfc3VuX25pb19jaF9GaWxlRGlzcGF0Y2hlckltcGxfY2xvc2UwOwotICAgICAgICAgICAgICAgIEphdmFfc3VuX25pb19jaF9GaWxlRGlzcGF0Y2hlckltcGxfY2xvc2VJbnRGRDsKLQkJSmF2YV9zdW5fbmlvX2NoX0ZpbGVEaXNwYXRjaGVySW1wbF9mb3JjZTA7Ci0gICAgICAgICAgICAgICAgSmF2YV9zdW5fbmlvX2NoX0ZpbGVEaXNwYXRjaGVySW1wbF9pbml0OwotCQlKYXZhX3N1bl9uaW9fY2hfRmlsZURpc3BhdGNoZXJJbXBsX2xvY2swOwotICAgICAgICAgICAgICAgIEphdmFfc3VuX25pb19jaF9GaWxlRGlzcGF0Y2hlckltcGxfcHJlQ2xvc2UwOwotICAgICAgICAgICAgICAgIEphdmFfc3VuX25pb19jaF9GaWxlRGlzcGF0Y2hlckltcGxfcHJlYWQwOwotICAgICAgICAgICAgICAgIEphdmFfc3VuX25pb19jaF9GaWxlRGlzcGF0Y2hlckltcGxfcHdyaXRlMDsKLSAgICAgICAgICAgICAgICBKYXZhX3N1bl9uaW9fY2hfRmlsZURpc3BhdGNoZXJJbXBsX3JlYWQwOwotICAgICAgICAgICAgICAgIEphdmFfc3VuX25pb19jaF9GaWxlRGlzcGF0Y2hlckltcGxfcmVhZHYwOwotCQlKYXZhX3N1bl9uaW9fY2hfRmlsZURpc3BhdGNoZXJJbXBsX3JlbGVhc2UwOwotCQlKYXZhX3N1bl9uaW9fY2hfRmlsZURpc3BhdGNoZXJJbXBsX3NpemUwOwotCQlKYXZhX3N1bl9uaW9fY2hfRmlsZURpc3BhdGNoZXJJbXBsX3RydW5jYXRlMDsKLSAgICAgICAgICAgICAgICBKYXZhX3N1bl9uaW9fY2hfRmlsZURpc3BhdGNoZXJJbXBsX3dyaXRlMDsKLSAgICAgICAgICAgICAgICBKYXZhX3N1bl9uaW9fY2hfRmlsZURpc3BhdGNoZXJJbXBsX3dyaXRldjA7Ci0gICAgICAgICAgICAgICAgSmF2YV9zdW5fbmlvX2NoX0ZpbGVLZXlfaW5pdDsKLSAgICAgICAgICAgICAgICBKYXZhX3N1bl9uaW9fY2hfRmlsZUtleV9pbml0SURzOwotCQlKYXZhX3N1bl9uaW9fY2hfSW5oZXJpdGVkQ2hhbm5lbF9jbG9zZTA7Ci0JCUphdmFfc3VuX25pb19jaF9Jbmhlcml0ZWRDaGFubmVsX2R1cDsKLQkJSmF2YV9zdW5fbmlvX2NoX0luaGVyaXRlZENoYW5uZWxfZHVwMjsKLQkJSmF2YV9zdW5fbmlvX2NoX0luaGVyaXRlZENoYW5uZWxfb3BlbjA7Ci0JCUphdmFfc3VuX25pb19jaF9Jbmhlcml0ZWRDaGFubmVsX3BlZXJBZGRyZXNzMDsKLQkJSmF2YV9zdW5fbmlvX2NoX0luaGVyaXRlZENoYW5uZWxfcGVlclBvcnQwOwotCQlKYXZhX3N1bl9uaW9fY2hfSW5oZXJpdGVkQ2hhbm5lbF9zb1R5cGUwOwotICAgICAgICAgICAgICAgIEphdmFfc3VuX25pb19jaF9JT1V0aWxfY29uZmlndXJlQmxvY2tpbmc7Ci0gICAgICAgICAgICAgICAgSmF2YV9zdW5fbmlvX2NoX0lPVXRpbF9kcmFpbjsKLSAgICAgICAgICAgICAgICBKYXZhX3N1bl9uaW9fY2hfSU9VdGlsX2ZkVmFsOwotICAgICAgICAgICAgICAgIEphdmFfc3VuX25pb19jaF9JT1V0aWxfaW5pdElEczsKLSAgICAgICAgICAgICAgICBKYXZhX3N1bl9uaW9fY2hfSU9VdGlsX21ha2VQaXBlOwotICAgICAgICAgICAgICAgIEphdmFfc3VuX25pb19jaF9JT1V0aWxfcmFuZG9tQnl0ZXM7Ci0gICAgICAgICAgICAgICAgSmF2YV9zdW5fbmlvX2NoX0lPVXRpbF9zZXRmZFZhbDsKLQkJSmF2YV9zdW5fbmlvX2NoX0tRdWV1ZV9rcXVldWU7Ci0JCUphdmFfc3VuX25pb19jaF9LUXVldWVfa2V2ZW50UmVnaXN0ZXI7Ci0JCUphdmFfc3VuX25pb19jaF9LUXVldWVfa2V2ZW50UG9sbDsKLQkJSmF2YV9zdW5fbmlvX2NoX0tRdWV1ZV9rZXZlbnRTaXplOwotCQlKYXZhX3N1bl9uaW9fY2hfS1F1ZXVlX2lkZW50T2Zmc2V0OwotCQlKYXZhX3N1bl9uaW9fY2hfS1F1ZXVlX2ZpbHRlck9mZnNldDsKLQkJSmF2YV9zdW5fbmlvX2NoX0tRdWV1ZV9mbGFnc09mZnNldDsKLQkJSmF2YV9zdW5fbmlvX2NoX0tRdWV1ZVBvcnRfc29ja2V0cGFpcjsKLQkJSmF2YV9zdW5fbmlvX2NoX0tRdWV1ZVBvcnRfaW50ZXJydXB0OwotCQlKYXZhX3N1bl9uaW9fY2hfS1F1ZXVlUG9ydF9kcmFpbjE7Ci0JCUphdmFfc3VuX25pb19jaF9LUXVldWVQb3J0X2Nsb3NlMDsKLQkJSmF2YV9zdW5fbmlvX2NoX05hdGl2ZVRocmVhZF9jdXJyZW50OwotCQlKYXZhX3N1bl9uaW9fY2hfTmF0aXZlVGhyZWFkX2luaXQ7Ci0JCUphdmFfc3VuX25pb19jaF9OYXRpdmVUaHJlYWRfc2lnbmFsOwotCQlKYXZhX3N1bl9uaW9fY2hfTmV0X2NhbklQdjZTb2NrZXRKb2luSVB2NEdyb3VwMDsKLQkJSmF2YV9zdW5fbmlvX2NoX05ldF9jYW5Kb2luNldpdGhJUHY0R3JvdXAwOwotCQlKYXZhX3N1bl9uaW9fY2hfTmV0X3NvY2tldDA7Ci0JCUphdmFfc3VuX25pb19jaF9OZXRfYmluZDA7Ci0JCUphdmFfc3VuX25pb19jaF9OZXRfY29ubmVjdDA7Ci0JCUphdmFfc3VuX25pb19jaF9OZXRfbGlzdGVuOwotCQlKYXZhX3N1bl9uaW9fY2hfTmV0X2xvY2FsUG9ydDsKLQkJSmF2YV9zdW5fbmlvX2NoX05ldF9sb2NhbEluZXRBZGRyZXNzOwotCQlKYXZhX3N1bl9uaW9fY2hfTmV0X2dldEludE9wdGlvbjA7Ci0JCUphdmFfc3VuX25pb19jaF9OZXRfc2V0SW50T3B0aW9uMDsKLSAgICAgICAgICAgICAgICBKYXZhX3N1bl9uaW9fY2hfTmV0X2luaXRJRHM7Ci0JCUphdmFfc3VuX25pb19jaF9OZXRfaXNJUHY2QXZhaWxhYmxlMDsKLQkJSmF2YV9zdW5fbmlvX2NoX05ldF9qb2luT3JEcm9wNDsKLQkJSmF2YV9zdW5fbmlvX2NoX05ldF9ibG9ja09yVW5ibG9jazQ7Ci0JCUphdmFfc3VuX25pb19jaF9OZXRfam9pbk9yRHJvcDY7Ci0JCUphdmFfc3VuX25pb19jaF9OZXRfYmxvY2tPclVuYmxvY2s2OwotCQlKYXZhX3N1bl9uaW9fY2hfTmV0X3NldEludGVyZmFjZTQ7Ci0JCUphdmFfc3VuX25pb19jaF9OZXRfZ2V0SW50ZXJmYWNlNDsKLQkJSmF2YV9zdW5fbmlvX2NoX05ldF9zZXRJbnRlcmZhY2U2OwotCQlKYXZhX3N1bl9uaW9fY2hfTmV0X2dldEludGVyZmFjZTY7Ci0JCUphdmFfc3VuX25pb19jaF9OZXRfc2h1dGRvd247Ci0gICAgICAgICAgICAgICAgSmF2YV9zdW5fbmlvX2NoX1BvbGxBcnJheVdyYXBwZXJfaW50ZXJydXB0OwotICAgICAgICAgICAgICAgIEphdmFfc3VuX25pb19jaF9Qb2xsQXJyYXlXcmFwcGVyX3BvbGwwOwotICAgICAgICAgICAgICAgIEphdmFfc3VuX25pb19jaF9TZXJ2ZXJTb2NrZXRDaGFubmVsSW1wbF9hY2NlcHQwOwotICAgICAgICAgICAgICAgIEphdmFfc3VuX25pb19jaF9TZXJ2ZXJTb2NrZXRDaGFubmVsSW1wbF9pbml0SURzOwotICAgICAgICAgICAgICAgIEphdmFfc3VuX25pb19jaF9Tb2NrZXRDaGFubmVsSW1wbF9jaGVja0Nvbm5lY3Q7Ci0JCUphdmFfc3VuX25pb19jaF9Tb2NrZXRDaGFubmVsSW1wbF9zZW5kT3V0T2ZCYW5kRGF0YTsKLQkJSmF2YV9zdW5fbmlvX2NoX1VuaXhBc3luY2hyb25vdXNTZXJ2ZXJTb2NrZXRDaGFubmVsSW1wbF9hY2NlcHQwOwotCQlKYXZhX3N1bl9uaW9fY2hfVW5peEFzeW5jaHJvbm91c1NlcnZlclNvY2tldENoYW5uZWxJbXBsX2luaXRJRHM7Ci0JCUphdmFfc3VuX25pb19jaF9Vbml4QXN5bmNocm9ub3VzU29ja2V0Q2hhbm5lbEltcGxfY2hlY2tDb25uZWN0OwotCQlKYXZhX3N1bl9uaW9fZnNfQnNkTmF0aXZlRGlzcGF0Y2hlcl9pbml0SURzOwotCQlKYXZhX3N1bl9uaW9fZnNfQnNkTmF0aXZlRGlzcGF0Y2hlcl9nZXRmc3N0YXQ7Ci0JCUphdmFfc3VuX25pb19mc19Cc2ROYXRpdmVEaXNwYXRjaGVyX2Zzc3RhdEVudHJ5OwotCQlKYXZhX3N1bl9uaW9fZnNfQnNkTmF0aXZlRGlzcGF0Y2hlcl9lbmRmc3N0YXQ7Ci0JCUphdmFfc3VuX25pb19mc19Hbm9tZUZpbGVUeXBlRGV0ZWN0b3JfaW5pdGlhbGl6ZUdpbzsKLQkJSmF2YV9zdW5fbmlvX2ZzX0dub21lRmlsZVR5cGVEZXRlY3Rvcl9wcm9iZVVzaW5nR2lvOwotCQlKYXZhX3N1bl9uaW9fZnNfR25vbWVGaWxlVHlwZURldGVjdG9yX2luaXRpYWxpemVHbm9tZVZmczsKLQkJSmF2YV9zdW5fbmlvX2ZzX0dub21lRmlsZVR5cGVEZXRlY3Rvcl9wcm9iZVVzaW5nR25vbWVWZnM7Ci0JCUphdmFfc3VuX25pb19mc19Vbml4TmF0aXZlRGlzcGF0Y2hlcl9pbml0OwotCQlKYXZhX3N1bl9uaW9fZnNfVW5peE5hdGl2ZURpc3BhdGNoZXJfZ2V0Y3dkOwotCQlKYXZhX3N1bl9uaW9fZnNfVW5peE5hdGl2ZURpc3BhdGNoZXJfc3RyZXJyb3I7Ci0JCUphdmFfc3VuX25pb19mc19Vbml4TmF0aXZlRGlzcGF0Y2hlcl9kdXA7Ci0JCUphdmFfc3VuX25pb19mc19Vbml4TmF0aXZlRGlzcGF0Y2hlcl9hY2Nlc3MwOwotCQlKYXZhX3N1bl9uaW9fZnNfVW5peE5hdGl2ZURpc3BhdGNoZXJfc3RhdDA7Ci0JCUphdmFfc3VuX25pb19mc19Vbml4TmF0aXZlRGlzcGF0Y2hlcl9sc3RhdDA7Ci0JCUphdmFfc3VuX25pb19mc19Vbml4TmF0aXZlRGlzcGF0Y2hlcl9mc3RhdDsKLQkJSmF2YV9zdW5fbmlvX2ZzX1VuaXhOYXRpdmVEaXNwYXRjaGVyX2ZzdGF0YXQwOwotCQlKYXZhX3N1bl9uaW9fZnNfVW5peE5hdGl2ZURpc3BhdGNoZXJfY2htb2QwOwotCQlKYXZhX3N1bl9uaW9fZnNfVW5peE5hdGl2ZURpc3BhdGNoZXJfZmNobW9kOwotCQlKYXZhX3N1bl9uaW9fZnNfVW5peE5hdGl2ZURpc3BhdGNoZXJfY2hvd24wOwotCQlKYXZhX3N1bl9uaW9fZnNfVW5peE5hdGl2ZURpc3BhdGNoZXJfbGNob3duMDsKLQkJSmF2YV9zdW5fbmlvX2ZzX1VuaXhOYXRpdmVEaXNwYXRjaGVyX2ZjaG93bjsKLQkJSmF2YV9zdW5fbmlvX2ZzX1VuaXhOYXRpdmVEaXNwYXRjaGVyX3V0aW1lczA7Ci0JCUphdmFfc3VuX25pb19mc19Vbml4TmF0aXZlRGlzcGF0Y2hlcl9mdXRpbWVzOwotCQlKYXZhX3N1bl9uaW9fZnNfVW5peE5hdGl2ZURpc3BhdGNoZXJfb3BlbjA7Ci0JCUphdmFfc3VuX25pb19mc19Vbml4TmF0aXZlRGlzcGF0Y2hlcl9vcGVuYXQwOwotCQlKYXZhX3N1bl9uaW9fZnNfVW5peE5hdGl2ZURpc3BhdGNoZXJfY2xvc2U7Ci0JCUphdmFfc3VuX25pb19mc19Vbml4TmF0aXZlRGlzcGF0Y2hlcl9yZWFkOwotCQlKYXZhX3N1bl9uaW9fZnNfVW5peE5hdGl2ZURpc3BhdGNoZXJfd3JpdGU7Ci0JCUphdmFfc3VuX25pb19mc19Vbml4TmF0aXZlRGlzcGF0Y2hlcl9mb3BlbjA7Ci0JCUphdmFfc3VuX25pb19mc19Vbml4TmF0aXZlRGlzcGF0Y2hlcl9mY2xvc2U7Ci0JCUphdmFfc3VuX25pb19mc19Vbml4TmF0aXZlRGlzcGF0Y2hlcl9vcGVuZGlyMDsKLQkJSmF2YV9zdW5fbmlvX2ZzX1VuaXhOYXRpdmVEaXNwYXRjaGVyX2Zkb3BlbmRpcjsKLQkJSmF2YV9zdW5fbmlvX2ZzX1VuaXhOYXRpdmVEaXNwYXRjaGVyX3JlYWRkaXI7Ci0JCUphdmFfc3VuX25pb19mc19Vbml4TmF0aXZlRGlzcGF0Y2hlcl9jbG9zZWRpcjsKLQkJSmF2YV9zdW5fbmlvX2ZzX1VuaXhOYXRpdmVEaXNwYXRjaGVyX2xpbmswOwotCQlKYXZhX3N1bl9uaW9fZnNfVW5peE5hdGl2ZURpc3BhdGNoZXJfdW5saW5rMDsKLQkJSmF2YV9zdW5fbmlvX2ZzX1VuaXhOYXRpdmVEaXNwYXRjaGVyX3VubGlua2F0MDsKLQkJSmF2YV9zdW5fbmlvX2ZzX1VuaXhOYXRpdmVEaXNwYXRjaGVyX3JlbmFtZTA7Ci0JCUphdmFfc3VuX25pb19mc19Vbml4TmF0aXZlRGlzcGF0Y2hlcl9yZW5hbWVhdDA7Ci0JCUphdmFfc3VuX25pb19mc19Vbml4TmF0aXZlRGlzcGF0Y2hlcl9ta2RpcjA7Ci0JCUphdmFfc3VuX25pb19mc19Vbml4TmF0aXZlRGlzcGF0Y2hlcl9ybWRpcjA7Ci0JCUphdmFfc3VuX25pb19mc19Vbml4TmF0aXZlRGlzcGF0Y2hlcl9zeW1saW5rMDsKLQkJSmF2YV9zdW5fbmlvX2ZzX1VuaXhOYXRpdmVEaXNwYXRjaGVyX3JlYWRsaW5rMDsKLQkJSmF2YV9zdW5fbmlvX2ZzX1VuaXhOYXRpdmVEaXNwYXRjaGVyX3JlYWxwYXRoMDsKLQkJSmF2YV9zdW5fbmlvX2ZzX1VuaXhOYXRpdmVEaXNwYXRjaGVyX3N0YXR2ZnMwOwotCQlKYXZhX3N1bl9uaW9fZnNfVW5peE5hdGl2ZURpc3BhdGNoZXJfcGF0aGNvbmYwOwotCQlKYXZhX3N1bl9uaW9fZnNfVW5peE5hdGl2ZURpc3BhdGNoZXJfZnBhdGhjb25mOwotCQlKYXZhX3N1bl9uaW9fZnNfVW5peE5hdGl2ZURpc3BhdGNoZXJfbWtub2QwOwotCQlKYXZhX3N1bl9uaW9fZnNfVW5peE5hdGl2ZURpc3BhdGNoZXJfZ2V0cHd1aWQ7Ci0JCUphdmFfc3VuX25pb19mc19Vbml4TmF0aXZlRGlzcGF0Y2hlcl9nZXRncmdpZDsKLQkJSmF2YV9zdW5fbmlvX2ZzX1VuaXhOYXRpdmVEaXNwYXRjaGVyX2dldHB3bmFtMDsKLQkJSmF2YV9zdW5fbmlvX2ZzX1VuaXhOYXRpdmVEaXNwYXRjaGVyX2dldGdybmFtMDsKLQkJSmF2YV9zdW5fbmlvX2ZzX1VuaXhOYXRpdmVEaXNwYXRjaGVyX2dldGV4dG1udGVudDsKLQkJSmF2YV9zdW5fbmlvX2ZzX1VuaXhDb3B5RmlsZV90cmFuc2ZlcjsKLQkJaGFuZGxlU29ja2V0RXJyb3I7Ci0KLQlsb2NhbDoKLQkJKjsKLX07CmRpZmYgLS1naXQgYS9qZGsvbWFrZWZpbGVzL21hcGZpbGVzL2xpYm5pby9tYXBmaWxlLWxpbnV4IGIvamRrL21ha2VmaWxlcy9tYXBmaWxlcy9saWJuaW8vbWFwZmlsZS1saW51eAppbmRleCA0Y2MzYjI5Li4zNzk5OWNiIDEwMDY0NAotLS0gYS9qZGsvbWFrZWZpbGVzL21hcGZpbGVzL2xpYm5pby9tYXBmaWxlLWxpbnV4CisrKyBiL2pkay9tYWtlZmlsZXMvbWFwZmlsZXMvbGlibmlvL21hcGZpbGUtbGludXgKQEAgLTExNiw2ICsxMTYsNyBAQAogCQlKYXZhX3N1bl9uaW9fY2hfTmV0X3NldEludGVyZmFjZTY7CiAJCUphdmFfc3VuX25pb19jaF9OZXRfZ2V0SW50ZXJmYWNlNjsKIAkJSmF2YV9zdW5fbmlvX2NoX05ldF9zaHV0ZG93bjsKKwkJSmF2YV9zdW5fbmlvX2NoX05ldF9wb2xsOwogICAgICAgICAgICAgICAgIEphdmFfc3VuX25pb19jaF9Qb2xsQXJyYXlXcmFwcGVyX2ludGVycnVwdDsKICAgICAgICAgICAgICAgICBKYXZhX3N1bl9uaW9fY2hfUG9sbEFycmF5V3JhcHBlcl9wb2xsMDsKICAgICAgICAgICAgICAgICBKYXZhX3N1bl9uaW9fY2hfU2VydmVyU29ja2V0Q2hhbm5lbEltcGxfYWNjZXB0MDsKZGlmZiAtLWdpdCBhL2pkay9tYWtlZmlsZXMvbWFwZmlsZXMvbGlibmlvL21hcGZpbGUtbWFjb3N4IGIvamRrL21ha2VmaWxlcy9tYXBmaWxlcy9saWJuaW8vbWFwZmlsZS1tYWNvc3gKaW5kZXggMDcwNjQ2Yi4uNDViMjNhYiAxMDA2NDQKLS0tIGEvamRrL21ha2VmaWxlcy9tYXBmaWxlcy9saWJuaW8vbWFwZmlsZS1tYWNvc3gKKysrIGIvamRrL21ha2VmaWxlcy9tYXBmaWxlcy9saWJuaW8vbWFwZmlsZS1tYWNvc3gKQEAgLTEwOCw2ICsxMDgsNyBAQAogCQlKYXZhX3N1bl9uaW9fY2hfTmV0X3NldEludGVyZmFjZTY7CiAJCUphdmFfc3VuX25pb19jaF9OZXRfZ2V0SW50ZXJmYWNlNjsKIAkJSmF2YV9zdW5fbmlvX2NoX05ldF9zaHV0ZG93bjsKKwkJSmF2YV9zdW5fbmlvX2NoX05ldF9wb2xsOwogICAgICAgICAgICAgICAgIEphdmFfc3VuX25pb19jaF9Qb2xsQXJyYXlXcmFwcGVyX2ludGVycnVwdDsKICAgICAgICAgICAgICAgICBKYXZhX3N1bl9uaW9fY2hfUG9sbEFycmF5V3JhcHBlcl9wb2xsMDsKICAgICAgICAgICAgICAgICBKYXZhX3N1bl9uaW9fY2hfU2VydmVyU29ja2V0Q2hhbm5lbEltcGxfYWNjZXB0MDsKZGlmZiAtLWdpdCBhL2pkay9tYWtlZmlsZXMvbWFwZmlsZXMvbGlibmlvL21hcGZpbGUtc29sYXJpcyBiL2pkay9tYWtlZmlsZXMvbWFwZmlsZXMvbGlibmlvL21hcGZpbGUtc29sYXJpcwppbmRleCBlMDVlYTcyLi5iZWIxM2UyIDEwMDY0NAotLS0gYS9qZGsvbWFrZWZpbGVzL21hcGZpbGVzL2xpYm5pby9tYXBmaWxlLXNvbGFyaXMKKysrIGIvamRrL21ha2VmaWxlcy9tYXBmaWxlcy9saWJuaW8vbWFwZmlsZS1zb2xhcmlzCkBAIC0xMDQsNiArMTA0LDcgQEAKIAkJSmF2YV9zdW5fbmlvX2NoX05ldF9zZXRJbnRlcmZhY2U2OwogCQlKYXZhX3N1bl9uaW9fY2hfTmV0X2dldEludGVyZmFjZTY7CiAJCUphdmFfc3VuX25pb19jaF9OZXRfc2h1dGRvd247CisJCUphdmFfc3VuX25pb19jaF9OZXRfcG9sbDsKICAgICAgICAgICAgICAgICBKYXZhX3N1bl9uaW9fY2hfUG9sbEFycmF5V3JhcHBlcl9pbnRlcnJ1cHQ7CiAgICAgICAgICAgICAgICAgSmF2YV9zdW5fbmlvX2NoX1BvbGxBcnJheVdyYXBwZXJfcG9sbDA7CiAgICAgICAgICAgICAgICAgSmF2YV9zdW5fbmlvX2NoX1NlcnZlclNvY2tldENoYW5uZWxJbXBsX2FjY2VwdDA7CmRpZmYgLS1naXQgYS9qZGsvbWFrZWZpbGVzL21hcGZpbGVzL2xpYm5pby9yZW9yZGVyLWk1ODYgYi9qZGsvbWFrZWZpbGVzL21hcGZpbGVzL2xpYm5pby9yZW9yZGVyLWk1ODYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxZWYxMTMuLjAwMDAwMDAKLS0tIGEvamRrL21ha2VmaWxlcy9tYXBmaWxlcy9saWJuaW8vcmVvcmRlci1pNTg2CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotZGF0YSA9IFIweDIwMDA7Ci10ZXh0ID0gTE9BRCA/UlhPOwotIyBUZXN0IE51bGwKLSMgVGVzdCBFeGl0Ci0jIFRlc3QgSGVsbG8KLSMgVGVzdCBTbGVlcAotIyBUZXN0IEludFRvU3RyaW5nCi0jIFRlc3QgTG9hZFRvb2xraXQKLXRleHQ6IC50ZXh0JUphdmFfc3VuX25pb19jaF9GaWxlQ2hhbm5lbEltcGxfaW5pdElEczsKLXRleHQ6IC50ZXh0JUphdmFfc3VuX25pb19jaF9GaWxlRGlzcGF0Y2hlcl9pbml0SURzOwotdGV4dDogLnRleHQlSmF2YV9zdW5fbmlvX2NoX0lPVXRpbF9pbml0SURzOwotdGV4dDogLnRleHQlSmF2YV9zdW5fbmlvX2NoX0ZpbGVEaXNwYXRjaGVyX3JlYWQwOwotdGV4dDogLnRleHQlY29udmVydFJldHVyblZhbDsKLSMgVGVzdCBMb2FkRnJhbWUKLSMgVGVzdCBMb2FkSkZyYW1lCi0jIFRlc3QgSkhlbGxvCi0jIFN3aW5nU2V0CmRpZmYgLS1naXQgYS9qZGsvbWFrZWZpbGVzL21hcGZpbGVzL2xpYnZlcmlmeS9yZW9yZGVyLWk1ODYgYi9qZGsvbWFrZWZpbGVzL21hcGZpbGVzL2xpYnZlcmlmeS9yZW9yZGVyLWk1ODYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyZjAyNTQuLjAwMDAwMDAKLS0tIGEvamRrL21ha2VmaWxlcy9tYXBmaWxlcy9saWJ2ZXJpZnkvcmVvcmRlci1pNTg2CisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotZGF0YSA9IFIweDIwMDA7Ci10ZXh0ID0gTE9BRCA/UlhPOwotIyBUZXN0IE51bGwKLXRleHQ6IC50ZXh0JVZlcmlmeUZpeENsYXNzbmFtZTsKLXRleHQ6IC50ZXh0JVZlcmlmeUNsYXNzbmFtZTsKLXRleHQ6IC50ZXh0JXNraXBfb3Zlcl9maWVsZG5hbWU6IE9VVFBVVERJUi9jaGVja19mb3JtYXQubzsKLXRleHQ6IC50ZXh0JXNraXBfb3Zlcl9maWVsZF9zaWduYXR1cmU6IE9VVFBVVERJUi9jaGVja19mb3JtYXQubzsKLXRleHQ6IC50ZXh0JVZlcmlmeUNsYXNzOwotdGV4dDogLnRleHQlbWFrZV9jbGFzc19pbmZvX2Zyb21fbmFtZTogT1VUUFVURElSL2NoZWNrX2NvZGUubzsKLXRleHQ6IC50ZXh0JWNsYXNzX25hbWVfdG9fSUQ6IE9VVFBVVERJUi9jaGVja19jb2RlLm87Ci10ZXh0OiAudGV4dCVtYWtlX2NsYXNzX2luZm86IE9VVFBVVERJUi9jaGVja19jb2RlLm87Ci10ZXh0OiAudGV4dCVmcmVlX2Jsb2NrOiBPVVRQVVRESVIvY2hlY2tfY29kZS5vOwotdGV4dDogLnRleHQldmVyaWZ5X21ldGhvZDogT1VUUFVURElSL2NoZWNrX2NvZGUubzsKLXRleHQ6IC50ZXh0JXZlcmlmeV9vcGNvZGVfb3BlcmFuZHM6IE9VVFBVVERJUi9jaGVja19jb2RlLm87Ci10ZXh0OiAudGV4dCVpbml0aWFsaXplX2RhdGFmbG93OiBPVVRQVVRESVIvY2hlY2tfY29kZS5vOwotdGV4dDogLnRleHQlc2lnbmF0dXJlX3RvX2ZpZWxkdHlwZTogT1VUUFVURElSL2NoZWNrX2NvZGUubzsKLXRleHQ6IC50ZXh0JWNoZWNrX3JlZ2lzdGVyX3ZhbHVlczogT1VUUFVURElSL2NoZWNrX2NvZGUubzsKLXRleHQ6IC50ZXh0JXBvcF9zdGFjazogT1VUUFVURElSL2NoZWNrX2NvZGUubzsKLXRleHQ6IC50ZXh0JXVwZGF0ZV9yZWdpc3RlcnM6IE9VVFBVVERJUi9jaGVja19jb2RlLm87Ci10ZXh0OiAudGV4dCVwdXNoX3N0YWNrOiBPVVRQVVRESVIvY2hlY2tfY29kZS5vOwotdGV4dDogLnRleHQlbWVyZ2VfaW50b19zdWNjZXNzb3JzOiBPVVRQVVRESVIvY2hlY2tfY29kZS5vOwotdGV4dDogLnRleHQlY3BfaW5kZXhfdG9fY2xhc3NfZnVsbGluZm86IE9VVFBVVERJUi9jaGVja19jb2RlLm87Ci10ZXh0OiAudGV4dCVzZXRfcHJvdGVjdGVkOiBPVVRQVVRESVIvY2hlY2tfY29kZS5vOwotdGV4dDogLnRleHQlbWVyZ2VfaW50b19vbmVfc3VjY2Vzc29yOiBPVVRQVVRESVIvY2hlY2tfY29kZS5vOwotdGV4dDogLnRleHQlbWVyZ2VfcmVnaXN0ZXJzOiBPVVRQVVRESVIvY2hlY2tfY29kZS5vOwotIyBUZXN0IEV4aXQKLSMgVGVzdCBIZWxsbwotdGV4dDogLnRleHQlbWVyZ2VfZnVsbGluZm9fdHlwZXM6IE9VVFBVVERJUi9jaGVja19jb2RlLm87Ci10ZXh0OiAudGV4dCVpc0Fzc2lnbmFibGVUbzogT1VUUFVURElSL2NoZWNrX2NvZGUubzsKLSMgVGVzdCBTbGVlcAotdGV4dDogLnRleHQlaXNMZWdhbFRhcmdldDogT1VUUFVURElSL2NoZWNrX2NvZGUubzsKLXRleHQ6IC50ZXh0JXZlcmlmeV9jb25zdGFudF9wb29sX3R5cGU6IE9VVFBVVERJUi9jaGVja19jb2RlLm87Ci0jIFRlc3QgSW50VG9TdHJpbmcKLSMgVGVzdCBMb2FkVG9vbGtpdAotIyBUZXN0IExvYWRGcmFtZQotIyBUZXN0IExvYWRKRnJhbWUKLSMgVGVzdCBKSGVsbG8KLSMgU3dpbmdTZXQKLXRleHQ6IC50ZXh0JWNvcHlfc3RhY2s6IE9VVFBVVERJUi9jaGVja19jb2RlLm87Ci10ZXh0OiAudGV4dCVudG9obDogT1VUUFVURElSL2NoZWNrX2NvZGUubzsKZGlmZiAtLWdpdCBhL2pkay9tYWtlZmlsZXMvbWFwZmlsZXMvbGliemlwL3Jlb3JkZXItaTU4NiBiL2pkay9tYWtlZmlsZXMvbWFwZmlsZXMvbGliemlwL3Jlb3JkZXItaTU4NgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZiYzBkZS4uMDAwMDAwMAotLS0gYS9qZGsvbWFrZWZpbGVzL21hcGZpbGVzL2xpYnppcC9yZW9yZGVyLWk1ODYKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi1kYXRhID0gUjB4MjAwMDsKLXRleHQgPSBMT0FEID9SWE87Ci0jIFRlc3QgTnVsbAotdGV4dDogLnRleHQlWklQX09wZW47Ci10ZXh0OiAudGV4dCVaSVBfT3Blbl9HZW5lcmljOwotdGV4dDogLnRleHQlSW5pdGlhbGl6ZVppcDsKLXRleHQ6IC50ZXh0JWFsbG9jWmlwOwotdGV4dDogLnRleHQlcmVhZENFTjogT1VUUFVURElSL3ppcF91dGlsLm87Ci10ZXh0OiAudGV4dCVmaW5kRU5EOiBPVVRQVVRESVIvemlwX3V0aWwubzsKLXRleHQ6IC50ZXh0JWhhc2g6IE9VVFBVVERJUi96aXBfdXRpbC5vOwotdGV4dDogLnRleHQlaXNNZXRhTmFtZTogT1VUUFVURElSL3ppcF91dGlsLm87Ci10ZXh0OiAudGV4dCVhZGRNZXRhTmFtZTogT1VUUFVURElSL3ppcF91dGlsLm87Ci10ZXh0OiAudGV4dCVaSVBfRmluZEVudHJ5OwotdGV4dDogLnRleHQlWklQX0dldEVudHJ5OwotdGV4dDogLnRleHQlWklQX0xvY2s7Ci10ZXh0OiAudGV4dCVyZWFkTE9DOiBPVVRQVVRESVIvemlwX3V0aWwubzsKLXRleHQ6IC50ZXh0JVpJUF9VbmxvY2s7Ci10ZXh0OiAudGV4dCVaSVBfRnJlZUVudHJ5OwotdGV4dDogLnRleHQlSmF2YV9qYXZhX3V0aWxfemlwX1ppcEZpbGVfaW5pdElEczsKLXRleHQ6IC50ZXh0JUphdmFfamF2YV91dGlsX3ppcF9aaXBGaWxlX29wZW47Ci10ZXh0OiAudGV4dCVKYXZhX2phdmFfdXRpbF96aXBfWmlwRmlsZV9nZXRUb3RhbDsKLXRleHQ6IC50ZXh0JUphdmFfamF2YV91dGlsX3ppcF9aaXBGaWxlX2dldEVudHJ5OwotdGV4dDogLnRleHQlSmF2YV9qYXZhX3V0aWxfemlwX1ppcEZpbGVfZnJlZUVudHJ5OwotdGV4dDogLnRleHQlSmF2YV9qYXZhX3V0aWxfemlwX1ppcEZpbGVfZ2V0RW50cnlUaW1lOwotdGV4dDogLnRleHQlSmF2YV9qYXZhX3V0aWxfemlwX1ppcEZpbGVfZ2V0RW50cnlDcmM7Ci10ZXh0OiAudGV4dCVKYXZhX2phdmFfdXRpbF96aXBfWmlwRmlsZV9nZXRFbnRyeUNTaXplOwotdGV4dDogLnRleHQlSmF2YV9qYXZhX3V0aWxfemlwX1ppcEZpbGVfZ2V0RW50cnlTaXplOwotdGV4dDogLnRleHQlSmF2YV9qYXZhX3V0aWxfemlwX1ppcEZpbGVfZ2V0RW50cnlGbGFnOwotdGV4dDogLnRleHQlSmF2YV9qYXZhX3V0aWxfemlwX1ppcEZpbGVfZ2V0RW50cnlNZXRob2Q7Ci10ZXh0OiAudGV4dCVKYXZhX2phdmFfdXRpbF96aXBfWmlwRmlsZV9nZXRFbnRyeUJ5dGVzOwotdGV4dDogLnRleHQlSmF2YV9qYXZhX3V0aWxfemlwX0luZmxhdGVyX2luaXRJRHM7Ci10ZXh0OiAudGV4dCVKYXZhX2phdmFfdXRpbF96aXBfSW5mbGF0ZXJfaW5pdDsKLXRleHQ6IC50ZXh0JWluZmxhdGVJbml0Ml87Ci10ZXh0OiAudGV4dCV6Y2FsbG9jOwotdGV4dDogLnRleHQlaW5mbGF0ZVJlc2V0OwotdGV4dDogLnRleHQlSmF2YV9qYXZhX3V0aWxfemlwX0luZmxhdGVyX2luZmxhdGVCeXRlczsKLXRleHQ6IC50ZXh0JWluZmxhdGU7Ci10ZXh0OiAudGV4dCVKYXZhX2phdmFfdXRpbF96aXBfWmlwRmlsZV9yZWFkOwotdGV4dDogLnRleHQlWklQX1JlYWQ7Ci10ZXh0OiAudGV4dCVodWZ0X2J1aWxkOiBPVVRQVVRESVIvaW5mdHJlZXMubzsKLXRleHQ6IC50ZXh0JXpjZnJlZTsKLXRleHQ6IC50ZXh0JUphdmFfamF2YV91dGlsX2phcl9KYXJGaWxlX2dldE1ldGFJbmZFbnRyeU5hbWVzOwotdGV4dDogLnRleHQlWklQX1JlYWRFbnRyeTsKLXRleHQ6IC50ZXh0JUluZmxhdGVGdWxseTsKLXRleHQ6IC50ZXh0JWluZmxhdGVFbmQ7Ci10ZXh0OiAudGV4dCVKYXZhX2phdmFfdXRpbF96aXBfSW5mbGF0ZXJfcmVzZXQ7Ci10ZXh0OiAudGV4dCVKYXZhX2phdmFfdXRpbF96aXBfWmlwRmlsZV9jbG9zZTsKLXRleHQ6IC50ZXh0JVpJUF9DbG9zZTsKLXRleHQ6IC50ZXh0JUphdmFfamF2YV91dGlsX3ppcF9JbmZsYXRlcl9lbmQ7CmRpZmYgLS1naXQgYS9qZGsvbWFrZWZpbGVzL3N1bi94YXd0L1RvQmluLmphdmEgYi9qZGsvbWFrZWZpbGVzL3N1bi9hd3QvWDExL1RvQmluLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGpkay9tYWtlZmlsZXMvc3VuL3hhd3QvVG9CaW4uamF2YQpyZW5hbWUgdG8gamRrL21ha2VmaWxlcy9zdW4vYXd0L1gxMS9Ub0Jpbi5qYXZhCmRpZmYgLS1naXQgYS9qZGsvbWFrZWZpbGVzL3N1bi9vc3hhcHAvVG9CaW4uamF2YSBiL2pkay9tYWtlZmlsZXMvc3VuL29zeGFwcC9Ub0Jpbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmZGNiYTMKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvbWFrZWZpbGVzL3N1bi9vc3hhcHAvVG9CaW4uamF2YQpAQCAtMCwwICsxLDUwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBPcmFjbGUgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKKyAqIHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIHN1bi5vc3hhcHA7CisKK2ltcG9ydCBqYXZhLmlvLio7CisKK3B1YmxpYyBjbGFzcyBUb0JpbiB7CisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICBpbnQgblJlYWQ7CisgICAgICAgIGJ5dGVbXSBkYXRhID0gbmV3IGJ5dGVbNDA5Nl07CisKKyAgICAgICAgd2hpbGUgKChuUmVhZCA9IFN5c3RlbS5pbi5yZWFkKGRhdGEsIDAsIGRhdGEubGVuZ3RoKSkgIT0gLTEpIHsKKyAgICAgICAgICAgIGJhb3Mud3JpdGUoZGF0YSwgMCwgblJlYWQpOworICAgICAgICB9CisKKyAgICAgICAgYmFvcy5mbHVzaCgpOworCisgICAgICAgIGJ5dGVbXSBidWYgPSBiYW9zLnRvQnl0ZUFycmF5KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnVmLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KFN0cmluZy5mb3JtYXQoIjB4JTEkMDJYIiwgYnVmW2ldKSArICIsICIpOworICAgICAgICAgICAgaWYgKGkgJSAyMCA9PSAwKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvc3JjL21hY29zeC9jbGFzc2VzL2NvbS9hcHBsZS9sYWYvQXF1YUZpbGVDaG9vc2VyVUkuamF2YSBiL2pkay9zcmMvbWFjb3N4L2NsYXNzZXMvY29tL2FwcGxlL2xhZi9BcXVhRmlsZUNob29zZXJVSS5qYXZhCmluZGV4IGY1ZGJhNWIuLmI3NTk4ZjkgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvbWFjb3N4L2NsYXNzZXMvY29tL2FwcGxlL2xhZi9BcXVhRmlsZUNob29zZXJVSS5qYXZhCisrKyBiL2pkay9zcmMvbWFjb3N4L2NsYXNzZXMvY29tL2FwcGxlL2xhZi9BcXVhRmlsZUNob29zZXJVSS5qYXZhCkBAIC0zNzksNiArMzc5LDE5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgdXBkYXRlQnV0dG9uU3RhdGUoZ2V0RmlsZUNob29zZXIoKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wLmVxdWFscyhKRmlsZUNob29zZXIuU0VMRUNURURfRklMRVNfQ0hBTkdFRF9QUk9QRVJUWSkpIHsKKyAgICAgICAgICAgICAgICAgICAgSkZpbGVDaG9vc2VyIGZpbGVDaG9vc2VyID0gZ2V0RmlsZUNob29zZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWxlQ2hvb3Nlci5pc0RpcmVjdG9yeVNlbGVjdGlvbkVuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRmlsZVtdIGZpbGVzID0gKEZpbGVbXSkgZS5nZXROZXdWYWx1ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBzZWxlY3RlZFJvdyA6IGZGaWxlTGlzdC5nZXRTZWxlY3RlZFJvd3MoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlIGZpbGUgPSAoRmlsZSkgZkZpbGVMaXN0LmdldFZhbHVlQXQoc2VsZWN0ZWRSb3csIDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZUNob29zZXIuaXNUcmF2ZXJzYWJsZShmaWxlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZkZpbGVMaXN0LnJlbW92ZVNlbGVjdGVkSW5kZXgoc2VsZWN0ZWRSb3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wLmVxdWFscyhKRmlsZUNob29zZXIuRElSRUNUT1JZX0NIQU5HRURfUFJPUEVSVFkpKSB7CiAgICAgICAgICAgICAgICAgICAgIGZGaWxlTGlzdC5jbGVhclNlbGVjdGlvbigpOwogICAgICAgICAgICAgICAgICAgICBmaW5hbCBGaWxlIGN1cnJlbnREaXJlY3RvcnkgPSBnZXRGaWxlQ2hvb3NlcigpLmdldEN1cnJlbnREaXJlY3RvcnkoKTsKZGlmZiAtLWdpdCBhL2pkay9zcmMvbWFjb3N4L2NsYXNzZXMvamF2YS91dGlsL3ByZWZzL01hY09TWFByZWZlcmVuY2VzLmphdmEgYi9qZGsvc3JjL21hY29zeC9jbGFzc2VzL2phdmEvdXRpbC9wcmVmcy9NYWNPU1hQcmVmZXJlbmNlcy5qYXZhCmluZGV4IDQyYzYxMDAuLjA1OTQzZWQgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvbWFjb3N4L2NsYXNzZXMvamF2YS91dGlsL3ByZWZzL01hY09TWFByZWZlcmVuY2VzLmphdmEKKysrIGIvamRrL3NyYy9tYWNvc3gvY2xhc3Nlcy9qYXZhL3V0aWwvcHJlZnMvTWFjT1NYUHJlZmVyZW5jZXMuamF2YQpAQCAtMTAwLDcgKzEwMCw3IEBACiAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHRoaXMuaXNVc2VyID0gaXNVc2VyTm9kZSgpOwogICAgICAgICBwYXRoID0gaXNSb290ID8gYWJzb2x1dGVQYXRoKCkgOiBhYnNvbHV0ZVBhdGgoKSArICIvIjsKLSAgICAgICAgZmlsZSA9IGNmRmlsZUZvck5vZGUoaXNVc2VyKTsKKyAgICAgICAgZmlsZSA9IGNmRmlsZUZvck5vZGUodGhpcy5pc1VzZXIpOwogICAgICAgICBpZiAoaXNOZXcpCiAgICAgICAgICAgICBuZXdOb2RlID0gaXNOZXc7CiAgICAgICAgIGVsc2UKZGlmZiAtLWdpdCBhL2pkay9zcmMvbWFjb3N4L2NsYXNzZXMvc3VuL2F3dC9DR3JhcGhpY3NEZXZpY2UuamF2YSBiL2pkay9zcmMvbWFjb3N4L2NsYXNzZXMvc3VuL2F3dC9DR3JhcGhpY3NEZXZpY2UuamF2YQppbmRleCA0MzFhMWUwLi4yYjg4NDUzIDEwMDY0NAotLS0gYS9qZGsvc3JjL21hY29zeC9jbGFzc2VzL3N1bi9hd3QvQ0dyYXBoaWNzRGV2aWNlLmphdmEKKysrIGIvamRrL3NyYy9tYWNvc3gvY2xhc3Nlcy9zdW4vYXd0L0NHcmFwaGljc0RldmljZS5qYXZhCkBAIC0zMyw5ICszMyw3IEBACiAKIGltcG9ydCBzdW4uamF2YTJkLm9wZW5nbC5DR0xHcmFwaGljc0NvbmZpZzsKIAotaW1wb3J0IHN1bi5hd3QuRnVsbFNjcmVlbkNhcGFibGU7Ci0KLXB1YmxpYyBjbGFzcyBDR3JhcGhpY3NEZXZpY2UgZXh0ZW5kcyBHcmFwaGljc0RldmljZSB7CitwdWJsaWMgZmluYWwgY2xhc3MgQ0dyYXBoaWNzRGV2aWNlIGV4dGVuZHMgR3JhcGhpY3NEZXZpY2UgewogCiAgICAgLy8gQ29yZUdyYXBoaWNzIGRpc3BsYXkgSUQKICAgICBwcml2YXRlIGZpbmFsIGludCBkaXNwbGF5SUQ7CkBAIC0xMDgsMTEgKzEwNiw2IEBACiAgICAgICAgIHJldHVybiBuYXRpdmVHZXRZUmVzb2x1dGlvbihkaXNwbGF5SUQpOwogICAgIH0KIAotICAgIHB1YmxpYyBpbnQgZ2V0U2NyZWVuUmVzb2x1dGlvbigpIHsKLSAgICAgICAgLy8gVE9ETzogcmVwb3J0IG5vbi03MiB2YWx1ZSB3aGVuIEhpRFBJIGlzIHR1cm5lZCBvbgotICAgICAgICByZXR1cm4gNzI7Ci0gICAgfQotCiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGRvdWJsZSBuYXRpdmVHZXRYUmVzb2x1dGlvbihpbnQgZGlzcGxheUlEKTsKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgZG91YmxlIG5hdGl2ZUdldFlSZXNvbHV0aW9uKGludCBkaXNwbGF5SUQpOwogCkBAIC0xOTQsNiArMTg3LDkgQEAKIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldERpc3BsYXlNb2RlKERpc3BsYXlNb2RlIGRtKSB7CisgICAgICAgIGlmIChkbSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIGRpc3BsYXkgbW9kZSIpOworICAgICAgICB9CiAgICAgICAgIG5hdGl2ZVNldERpc3BsYXlNb2RlKGRpc3BsYXlJRCwgZG0uZ2V0V2lkdGgoKSwgZG0uZ2V0SGVpZ2h0KCksIGRtLmdldEJpdERlcHRoKCksIGRtLmdldFJlZnJlc2hSYXRlKCkpOwogICAgICAgICBpZiAoaXNGdWxsU2NyZWVuU3VwcG9ydGVkKCkgJiYgZ2V0RnVsbFNjcmVlbldpbmRvdygpICE9IG51bGwpIHsKICAgICAgICAgICAgIGdldEZ1bGxTY3JlZW5XaW5kb3coKS5zZXRTaXplKGRtLmdldFdpZHRoKCksIGRtLmdldEhlaWdodCgpKTsKZGlmZiAtLWdpdCBhL2pkay9zcmMvbWFjb3N4L2NsYXNzZXMvc3VuL2x3YXd0L21hY29zeC9DUGxhdGZvcm1XaW5kb3cuamF2YSBiL2pkay9zcmMvbWFjb3N4L2NsYXNzZXMvc3VuL2x3YXd0L21hY29zeC9DUGxhdGZvcm1XaW5kb3cuamF2YQppbmRleCAxNTUwMmQxLi42MTQ2Y2EyIDEwMDY0NAotLS0gYS9qZGsvc3JjL21hY29zeC9jbGFzc2VzL3N1bi9sd2F3dC9tYWNvc3gvQ1BsYXRmb3JtV2luZG93LmphdmEKKysrIGIvamRrL3NyYy9tYWNvc3gvY2xhc3Nlcy9zdW4vbHdhd3QvbWFjb3N4L0NQbGF0Zm9ybVdpbmRvdy5qYXZhCkBAIC02NSw3ICs2NSw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgbmF0aXZlRGlzcG9zZShsb25nIG5zV2luZG93UHRyKTsKICAgICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgQ1BsYXRmb3JtV2luZG93IG5hdGl2ZUdldFRvcG1vc3RQbGF0Zm9ybVdpbmRvd1VuZGVyTW91c2UoKTsKIAotICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlR2V0TlNXaW5kb3dEaXNwbGF5SURfQXBwS2l0VGhyZWFkKGxvbmcgbnNXaW5kb3dQdHIpOworICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlR2V0TlNXaW5kb3dEaXNwbGF5SUQobG9uZyBuc1dpbmRvd1B0cik7CiAKICAgICAvLyBMb2dlciB0byByZXBvcnQgaXNzdWVzIGhhcHBlbmVkIGR1cmluZyBleGVjdXRpb24gYnV0IHRoYXQgZG8gbm90IGFmZmVjdCBmdW5jdGlvbmFsaXR5CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGxhdGZvcm1Mb2dnZXIgbG9nZ2VyID0gUGxhdGZvcm1Mb2dnZXIuZ2V0TG9nZ2VyKCJzdW4ubHdhd3QubWFjb3N4LkNQbGF0Zm9ybVdpbmRvdyIpOwpAQCAtNDQ0LDcgKzQ0NCw3IEBACiAgICAgcHVibGljIEdyYXBoaWNzRGV2aWNlIGdldEdyYXBoaWNzRGV2aWNlKCkgewogICAgICAgICBHcmFwaGljc0Vudmlyb25tZW50IGdlID0gR3JhcGhpY3NFbnZpcm9ubWVudC5nZXRMb2NhbEdyYXBoaWNzRW52aXJvbm1lbnQoKTsKICAgICAgICAgQ0dyYXBoaWNzRW52aXJvbm1lbnQgY2dlID0gKENHcmFwaGljc0Vudmlyb25tZW50KWdlOwotICAgICAgICBpbnQgZGlzcGxheUlEID0gbmF0aXZlR2V0TlNXaW5kb3dEaXNwbGF5SURfQXBwS2l0VGhyZWFkKGdldE5TV2luZG93UHRyKCkpOworICAgICAgICBpbnQgZGlzcGxheUlEID0gbmF0aXZlR2V0TlNXaW5kb3dEaXNwbGF5SUQoZ2V0TlNXaW5kb3dQdHIoKSk7CiAgICAgICAgIEdyYXBoaWNzRGV2aWNlIGdkID0gY2dlLmdldFNjcmVlbkRldmljZShkaXNwbGF5SUQpOwogICAgICAgICBpZiAoZ2QgPT0gbnVsbCkgewogICAgICAgICAgICAgLy8gdGhpcyBjb3VsZCBwb3NzaWJseSBoYXBwZW4gZHVyaW5nIGRldmljZSByZW1vdmFsCmRpZmYgLS1naXQgYS9qZGsvc3JjL21hY29zeC9jbGFzc2VzL3N1bi9sd2F3dC9tYWNvc3gvQ1RyYXlJY29uLmphdmEgYi9qZGsvc3JjL21hY29zeC9jbGFzc2VzL3N1bi9sd2F3dC9tYWNvc3gvQ1RyYXlJY29uLmphdmEKaW5kZXggZmFjODQ0ZS4uNGExOWU1YSAxMDA2NDQKLS0tIGEvamRrL3NyYy9tYWNvc3gvY2xhc3Nlcy9zdW4vbHdhd3QvbWFjb3N4L0NUcmF5SWNvbi5qYXZhCisrKyBiL2pkay9zcmMvbWFjb3N4L2NsYXNzZXMvc3VuL2x3YXd0L21hY29zeC9DVHJheUljb24uamF2YQpAQCAtMjYsNiArMjYsNyBAQAogcGFja2FnZSBzdW4ubHdhd3QubWFjb3N4OwogCiBpbXBvcnQgc3VuLmF3dC5TdW5Ub29sa2l0OworaW1wb3J0IHN1bi5sd2F3dC5tYWNvc3guZXZlbnQuTlNFdmVudDsKIAogaW1wb3J0IGphdmF4LnN3aW5nLio7CiBpbXBvcnQgamF2YS5hd3QuKjsKQEAgLTQyLDYgKzQzLDE2IEBACiAgICAgcHJpdmF0ZSBKRGlhbG9nIG1lc3NhZ2VEaWFsb2c7CiAgICAgcHJpdmF0ZSBEaWFsb2dFdmVudEhhbmRsZXIgaGFuZGxlcjsKIAorICAgIC8vIEluIG9yZGVyIHRvIGNvbnN0cnVjdCBNb3VzZUV2ZW50IG9iamVjdCwgd2UgbmVlZCB0byBzcGVjaWZ5IGEKKyAgICAvLyBDb21wb25lbnQgdGFyZ2V0LiBCZWNhdXNlIFRyYXlJY29uIGlzbid0IENvbXBvbmVudCdzIHN1YmNsYXNzLAorICAgIC8vIHdlIHVzZSB0aGlzIGR1bW15IGZyYW1lIGluc3RlYWQKKyAgICBwcml2YXRlIGZpbmFsIEZyYW1lIGR1bW15RnJhbWU7CisKKyAgICAvLyBBIGJpdG1hc2sgdGhhdCBpbmRpY2F0ZXMgd2hhdCBtb3VzZSBidXR0b25zIHByb2R1Y2UgTU9VU0VfQ0xJQ0tFRCBldmVudHMKKyAgICAvLyBvbiBNT1VTRV9SRUxFQVNFLiBDbGljayBldmVudHMgYXJlIG9ubHkgZ2VuZXJhdGVkIGlmIHRoZXJlIHdlcmUgbm8gZHJhZworICAgIC8vIGV2ZW50cyBiZXR3ZWVuIE1PVVNFX1BSRVNTRUQgYW5kIE1PVVNFX1JFTEVBU0VEIGZvciBwYXJ0aWN1bGFyIGJ1dHRvbgorICAgIHByaXZhdGUgc3RhdGljIGludCBtb3VzZUNsaWNrQnV0dG9ucyA9IDA7CisKICAgICBDVHJheUljb24oVHJheUljb24gdGFyZ2V0KSB7CiAgICAgICAgIHN1cGVyKDAsIHRydWUpOwogCkBAIC00OSw2ICs2MCw3IEBACiAgICAgICAgIHRoaXMuaGFuZGxlciA9IG51bGw7CiAgICAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0OwogICAgICAgICB0aGlzLnBvcHVwID0gdGFyZ2V0LmdldFBvcHVwTWVudSgpOworICAgICAgICB0aGlzLmR1bW15RnJhbWUgPSBuZXcgRnJhbWUoKTsKICAgICAgICAgc2V0UHRyKGNyZWF0ZU1vZGVsKCkpOwogCiAgICAgICAgIC8vaWYgbm8gb25lIGVsc2UgaXMgY3JlYXRpbmcgdGhlIHBlZXIuCkBAIC0xMTksNiArMTMxLDggQEAKICAgICAgICAgICAgIGRpc3Bvc2VNZXNzYWdlRGlhbG9nKCk7CiAgICAgICAgIH0KIAorICAgICAgICBkdW1teUZyYW1lLmRpc3Bvc2UoKTsKKwogICAgICAgICBMV0NUb29sa2l0LnRhcmdldERpc3Bvc2VkUGVlcih0YXJnZXQsIHRoaXMpOwogICAgICAgICB0YXJnZXQgPSBudWxsOwogCkBAIC0xNjEsMTcgKzE3NSw3OCBAQAogCiAgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBzZXROYXRpdmVJbWFnZShmaW5hbCBsb25nIG1vZGVsLCBmaW5hbCBsb25nIG5zaW1hZ2UsIGZpbmFsIGJvb2xlYW4gYXV0b3NpemUpOwogCi0gICAgLy9pbnZvY2F0aW9uIGZyb20gdGhlIEFXVFRyYXlJY29uLm0KLSAgICBwdWJsaWMgdm9pZCBwZXJmb3JtQWN0aW9uKCkgeworICAgIHByaXZhdGUgdm9pZCBwb3N0RXZlbnQoZmluYWwgQVdURXZlbnQgZXZlbnQpIHsKICAgICAgICAgU3VuVG9vbGtpdC5leGVjdXRlT25FdmVudEhhbmRsZXJUaHJlYWQodGFyZ2V0LCBuZXcgUnVubmFibGUoKSB7CiAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNtZCA9IHRhcmdldC5nZXRBY3Rpb25Db21tYW5kKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgQWN0aW9uRXZlbnQgZXZlbnQgPSBuZXcgQWN0aW9uRXZlbnQodGFyZ2V0LCBBY3Rpb25FdmVudC5BQ1RJT05fUEVSRk9STUVELCBjbWQpOwogICAgICAgICAgICAgICAgIFN1blRvb2xraXQucG9zdEV2ZW50KFN1blRvb2xraXQudGFyZ2V0VG9BcHBDb250ZXh0KHRhcmdldCksIGV2ZW50KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSk7CiAgICAgfQogCisgICAgLy9pbnZvY2F0aW9uIGZyb20gdGhlIEFXVFRyYXlJY29uLm0KKyAgICBwcml2YXRlIHZvaWQgaGFuZGxlTW91c2VFdmVudChOU0V2ZW50IG5zRXZlbnQpIHsKKyAgICAgICAgaW50IGJ1dHRvbk51bWJlciA9IG5zRXZlbnQuZ2V0QnV0dG9uTnVtYmVyKCk7CisgICAgICAgIGZpbmFsIFN1blRvb2xraXQgdGsgPSAoU3VuVG9vbGtpdClUb29sa2l0LmdldERlZmF1bHRUb29sa2l0KCk7CisgICAgICAgIGlmICgoYnV0dG9uTnVtYmVyID4gMiAmJiAhdGsuYXJlRXh0cmFNb3VzZUJ1dHRvbnNFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgfHwgYnV0dG9uTnVtYmVyID4gdGsuZ2V0TnVtYmVyT2ZCdXR0b25zKCkgLSAxKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpbnQgamV2ZW50VHlwZSA9IE5TRXZlbnQubnNUb0phdmFFdmVudFR5cGUobnNFdmVudC5nZXRUeXBlKCkpOworCisgICAgICAgIGludCBqYnV0dG9uTnVtYmVyID0gTW91c2VFdmVudC5OT0JVVFRPTjsKKyAgICAgICAgaW50IGpjbGlja0NvdW50ID0gMDsKKyAgICAgICAgaWYgKGpldmVudFR5cGUgIT0gTW91c2VFdmVudC5NT1VTRV9NT1ZFRCkgeworICAgICAgICAgICAgamJ1dHRvbk51bWJlciA9IE5TRXZlbnQubnNUb0phdmFCdXR0b24oYnV0dG9uTnVtYmVyKTsKKyAgICAgICAgICAgIGpjbGlja0NvdW50ID0gbnNFdmVudC5nZXRDbGlja0NvdW50KCk7CisgICAgICAgIH0KKworICAgICAgICBpbnQgam1vZGlmaWVycyA9IE5TRXZlbnQubnNUb0phdmFNb3VzZU1vZGlmaWVycyhidXR0b25OdW1iZXIsCisgICAgICAgICAgICAgICAgbnNFdmVudC5nZXRNb2RpZmllckZsYWdzKCkpOworICAgICAgICBib29sZWFuIGlzUG9wdXBUcmlnZ2VyID0gTlNFdmVudC5pc1BvcHVwVHJpZ2dlcihqbW9kaWZpZXJzKTsKKworICAgICAgICBpbnQgZXZlbnRCdXR0b25NYXNrID0gKGpidXR0b25OdW1iZXIgPiAwKT8KKyAgICAgICAgICAgICAgICBNb3VzZUV2ZW50LmdldE1hc2tGb3JCdXR0b24oamJ1dHRvbk51bWJlcikgOiAwOworICAgICAgICBsb25nIHdoZW4gPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKworICAgICAgICBpZiAoamV2ZW50VHlwZSA9PSBNb3VzZUV2ZW50Lk1PVVNFX1BSRVNTRUQpIHsKKyAgICAgICAgICAgIG1vdXNlQ2xpY2tCdXR0b25zIHw9IGV2ZW50QnV0dG9uTWFzazsKKyAgICAgICAgfSBlbHNlIGlmIChqZXZlbnRUeXBlID09IE1vdXNlRXZlbnQuTU9VU0VfRFJBR0dFRCkgeworICAgICAgICAgICAgbW91c2VDbGlja0J1dHRvbnMgPSAwOworICAgICAgICB9CisKKyAgICAgICAgLy8gVGhlIE1vdXNlRXZlbnQncyBjb29yZGluYXRlcyBhcmUgcmVsYXRpdmUgdG8gc2NyZWVuCisgICAgICAgIGludCBhYnNYID0gbnNFdmVudC5nZXRBYnNYKCk7CisgICAgICAgIGludCBhYnNZID0gbnNFdmVudC5nZXRBYnNZKCk7CisKKyAgICAgICAgTW91c2VFdmVudCBtb3VzZUV2ZW50ID0gbmV3IE1vdXNlRXZlbnQoZHVtbXlGcmFtZSwgamV2ZW50VHlwZSwgd2hlbiwKKyAgICAgICAgICAgICAgICBqbW9kaWZpZXJzLCBhYnNYLCBhYnNZLCBhYnNYLCBhYnNZLCBqY2xpY2tDb3VudCwgaXNQb3B1cFRyaWdnZXIsCisgICAgICAgICAgICAgICAgamJ1dHRvbk51bWJlcik7CisgICAgICAgIG1vdXNlRXZlbnQuc2V0U291cmNlKHRhcmdldCk7CisgICAgICAgIHBvc3RFdmVudChtb3VzZUV2ZW50KTsKKworICAgICAgICAvLyBmaXJlIEFDVElPTiBldmVudAorICAgICAgICBpZiAoamV2ZW50VHlwZSA9PSBNb3VzZUV2ZW50Lk1PVVNFX1BSRVNTRUQgJiYgaXNQb3B1cFRyaWdnZXIpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjbWQgPSB0YXJnZXQuZ2V0QWN0aW9uQ29tbWFuZCgpOworICAgICAgICAgICAgZmluYWwgQWN0aW9uRXZlbnQgZXZlbnQgPSBuZXcgQWN0aW9uRXZlbnQodGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICBBY3Rpb25FdmVudC5BQ1RJT05fUEVSRk9STUVELCBjbWQpOworICAgICAgICAgICAgcG9zdEV2ZW50KGV2ZW50KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHN5bnRoZXNpemUgQ0xJQ0tFRCBldmVudAorICAgICAgICBpZiAoamV2ZW50VHlwZSA9PSBNb3VzZUV2ZW50Lk1PVVNFX1JFTEVBU0VEKSB7CisgICAgICAgICAgICBpZiAoKG1vdXNlQ2xpY2tCdXR0b25zICYgZXZlbnRCdXR0b25NYXNrKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgTW91c2VFdmVudCBjbGlja0V2ZW50ID0gbmV3IE1vdXNlRXZlbnQoZHVtbXlGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1vdXNlRXZlbnQuTU9VU0VfQ0xJQ0tFRCwgd2hlbiwgam1vZGlmaWVycywgYWJzWCwgYWJzWSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFic1gsIGFic1ksIGpjbGlja0NvdW50LCBpc1BvcHVwVHJpZ2dlciwgamJ1dHRvbk51bWJlcik7CisgICAgICAgICAgICAgICAgY2xpY2tFdmVudC5zZXRTb3VyY2UodGFyZ2V0KTsKKyAgICAgICAgICAgICAgICBwb3N0RXZlbnQoY2xpY2tFdmVudCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1vdXNlQ2xpY2tCdXR0b25zICY9IH5ldmVudEJ1dHRvbk1hc2s7CisgICAgICAgIH0KKyAgICB9CisKICAgICBwcml2YXRlIG5hdGl2ZSBQb2ludDJEIG5hdGl2ZUdldEljb25Mb2NhdGlvbihsb25nIHRyYXlJY29uTW9kZWwpOwogCiAgICAgcHVibGljIHZvaWQgZGlzcGxheU1lc3NhZ2VPbkVEVChTdHJpbmcgY2FwdGlvbiwgU3RyaW5nIHRleHQsCkBAIC0yNTYsNiArMzMxLDkgQEAKIAogICAgICAgICBkaWFsb2cuc2V0RGVmYXVsdENsb3NlT3BlcmF0aW9uKEpEaWFsb2cuRE9fTk9USElOR19PTl9DTE9TRSk7CiAgICAgICAgIGRpYWxvZy5zZXRNb2RhbChmYWxzZSk7CisgICAgICAgIGRpYWxvZy5zZXRNb2RhbEV4Y2x1c2lvblR5cGUoRGlhbG9nLk1vZGFsRXhjbHVzaW9uVHlwZS5UT09MS0lUX0VYQ0xVREUpOworICAgICAgICBkaWFsb2cuc2V0QWx3YXlzT25Ub3AodHJ1ZSk7CisgICAgICAgIGRpYWxvZy5zZXRBdXRvUmVxdWVzdEZvY3VzKGZhbHNlKTsKICAgICAgICAgZGlhbG9nLnNldFJlc2l6YWJsZShmYWxzZSk7CiAgICAgICAgIGRpYWxvZy5zZXRDb250ZW50UGFuZShvcCk7CiAKZGlmZiAtLWdpdCBhL2pkay9zcmMvbWFjb3N4L2NsYXNzZXMvc3VuL2x3YXd0L21hY29zeC9MV0NUb29sa2l0LmphdmEgYi9qZGsvc3JjL21hY29zeC9jbGFzc2VzL3N1bi9sd2F3dC9tYWNvc3gvTFdDVG9vbGtpdC5qYXZhCmluZGV4IDIzZGY0ZmIuLjMyYTk4MDggMTAwNjQ0Ci0tLSBhL2pkay9zcmMvbWFjb3N4L2NsYXNzZXMvc3VuL2x3YXd0L21hY29zeC9MV0NUb29sa2l0LmphdmEKKysrIGIvamRrL3NyYy9tYWNvc3gvY2xhc3Nlcy9zdW4vbHdhd3QvbWFjb3N4L0xXQ1Rvb2xraXQuamF2YQpAQCAtNTMsNyArNTMsNyBAQAogLyoqCiAgKiBNYWMgT1MgWCBDb2NvYS1iYXNlZCBBV1QgVG9vbGtpdC4KICAqLwotcHVibGljIGNsYXNzIExXQ1Rvb2xraXQgZXh0ZW5kcyBMV1Rvb2xraXQgeworcHVibGljIGZpbmFsIGNsYXNzIExXQ1Rvb2xraXQgZXh0ZW5kcyBMV1Rvb2xraXQgewogICAgIC8vIFdoaWxlIGl0IGlzIHBvc3NpYmxlIHRvIGVudW1lcmF0ZSBhbGwgbW91c2UgZGV2aWNlcwogICAgIC8vIGFuZCBxdWVyeSB0aGVtIGZvciB0aGUgbnVtYmVyIG9mIGJ1dHRvbnMsIHRoZSBjb2RlCiAgICAgLy8gdGhhdCBkb2VzIGl0IGlzIHJhdGhlciBjb21wbGV4LiBJbnN0ZWFkLCB3ZSBvcHQgZm9yCkBAIC0yNzgsNyArMjc4LDYgQEAKICAgICAgICAgcmV0dXJuIG5ldyBDTW91c2VJbmZvUGVlcigpOwogICAgIH0KIAotCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIGludCBnZXRTY3JlZW5IZWlnaHQoKSB7CiAgICAgICAgIHJldHVybiBHcmFwaGljc0Vudmlyb25tZW50LmdldExvY2FsR3JhcGhpY3NFbnZpcm9ubWVudCgpCkBAIC0zMzMsOCArMzMyLDkgQEAKIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgZ2V0U2NyZWVuUmVzb2x1dGlvbigpIHRocm93cyBIZWFkbGVzc0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiAoKENHcmFwaGljc0RldmljZSkgR3JhcGhpY3NFbnZpcm9ubWVudAotICAgICAgICAgICAgICAgIC5nZXRMb2NhbEdyYXBoaWNzRW52aXJvbm1lbnQoKS5nZXREZWZhdWx0U2NyZWVuRGV2aWNlKCkpLmdldFNjcmVlblJlc29sdXRpb24oKTsKKyAgICAgICAgcmV0dXJuIChpbnQpICgoQ0dyYXBoaWNzRGV2aWNlKSBHcmFwaGljc0Vudmlyb25tZW50CisgICAgICAgICAgICAgICAgLmdldExvY2FsR3JhcGhpY3NFbnZpcm9ubWVudCgpLmdldERlZmF1bHRTY3JlZW5EZXZpY2UoKSkKKyAgICAgICAgICAgICAgICAuZ2V0WFJlc29sdXRpb24oKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL2pkay9zcmMvbWFjb3N4L25hdGl2ZS9zdW4vYXd0L0FXVFdpbmRvdy5tIGIvamRrL3NyYy9tYWNvc3gvbmF0aXZlL3N1bi9hd3QvQVdUV2luZG93Lm0KaW5kZXggMmUyYjg1NC4uZjI5NThlMyAxMDA2NDQKLS0tIGEvamRrL3NyYy9tYWNvc3gvbmF0aXZlL3N1bi9hd3QvQVdUV2luZG93Lm0KKysrIGIvamRrL3NyYy9tYWNvc3gvbmF0aXZlL3N1bi9hd3QvQVdUV2luZG93Lm0KQEAgLTMyNCw2ICszMjQsMTMgQEAKICAgICB9CiB9CiAKKysgKE5TTnVtYmVyICopIGdldE5TV2luZG93RGlzcGxheUlEX0FwcEtpdFRocmVhZDooTlNXaW5kb3cgKil3aW5kb3cgeworICAgIEFXVF9BU1NFUlRfQVBQS0lUX1RIUkVBRDsKKyAgICBOU1NjcmVlbiAqc2NyZWVuID0gW3dpbmRvdyBzY3JlZW5dOworICAgIE5TRGljdGlvbmFyeSAqZGV2aWNlRGVzY3JpcHRpb24gPSBbc2NyZWVuIGRldmljZURlc2NyaXB0aW9uXTsKKyAgICByZXR1cm4gW2RldmljZURlc2NyaXB0aW9uIG9iamVjdEZvcktleTpAIk5TU2NyZWVuTnVtYmVyIl07Cit9CisKIC0gKHZvaWQpIGRlYWxsb2MgewogQVdUX0FTU0VSVF9BUFBLSVRfVEhSRUFEOwogCkBAIC0xMTEzLDE5ICsxMTIwLDIyIEBACiAgKiBTaWduYXR1cmU6IChKKUkKICAqLwogSk5JRVhQT1JUIGppbnQgSk5JQ0FMTAotSmF2YV9zdW5fbHdhd3RfbWFjb3N4X0NQbGF0Zm9ybVdpbmRvd19uYXRpdmVHZXROU1dpbmRvd0Rpc3BsYXlJRF8xQXBwS2l0VGhyZWFkCitKYXZhX3N1bl9sd2F3dF9tYWNvc3hfQ1BsYXRmb3JtV2luZG93X25hdGl2ZUdldE5TV2luZG93RGlzcGxheUlECiAoSk5JRW52ICplbnYsIGpjbGFzcyBjbGF6eiwgamxvbmcgd2luZG93UHRyKQogewotICAgIGppbnQgcmV0OyAvLyBDR0RpcmVjdERpc3BsYXlJRAorICAgIF9fYmxvY2sgamludCByZXQ7IC8vIENHRGlyZWN0RGlzcGxheUlECiAKIEpORl9DT0NPQV9FTlRFUihlbnYpOwotQVdUX0FTU0VSVF9BUFBLSVRfVEhSRUFEOwogCiAgICAgTlNXaW5kb3cgKndpbmRvdyA9IE9CSkMod2luZG93UHRyKTsKLSAgICBOU1NjcmVlbiAqc2NyZWVuID0gW3dpbmRvdyBzY3JlZW5dOwotICAgIE5TRGljdGlvbmFyeSAqZGV2aWNlRGVzY3JpcHRpb24gPSBbc2NyZWVuIGRldmljZURlc2NyaXB0aW9uXTsKLSAgICBOU051bWJlciAqZGlzcGxheUlEID0gW2RldmljZURlc2NyaXB0aW9uIG9iamVjdEZvcktleTpAIk5TU2NyZWVuTnVtYmVyIl07Ci0gICAgcmV0ID0gKGppbnQpW2Rpc3BsYXlJRCBpbnRWYWx1ZV07CisKKyAgICBpZiAoW05TVGhyZWFkIGlzTWFpblRocmVhZF0pIHsKKyAgICAgICAgcmV0ID0gKGppbnQpW1tBV1RXaW5kb3cgZ2V0TlNXaW5kb3dEaXNwbGF5SURfQXBwS2l0VGhyZWFkOiB3aW5kb3ddIGludFZhbHVlXTsKKyAgICB9IGVsc2UgeworICAgICAgICBbSk5GUnVuTG9vcCBwZXJmb3JtT25NYWluVGhyZWFkV2FpdGluZzpZRVMgd2l0aEJsb2NrOl4oKXsKKyAgICAgICAgICAgIHJldCA9IChqaW50KVtbQVdUV2luZG93IGdldE5TV2luZG93RGlzcGxheUlEX0FwcEtpdFRocmVhZDogd2luZG93XSBpbnRWYWx1ZV07CisgICAgICAgIH1dOworICAgIH0KIAogSk5GX0NPQ09BX0VYSVQoZW52KTsKIApkaWZmIC0tZ2l0IGEvamRrL3NyYy9tYWNvc3gvbmF0aXZlL3N1bi9hd3QvQ1RyYXlJY29uLmggYi9qZGsvc3JjL21hY29zeC9uYXRpdmUvc3VuL2F3dC9DVHJheUljb24uaAppbmRleCBjNWNlZWJmLi45NTAxZTdkIDEwMDY0NAotLS0gYS9qZGsvc3JjL21hY29zeC9uYXRpdmUvc3VuL2F3dC9DVHJheUljb24uaAorKysgYi9qZGsvc3JjL21hY29zeC9uYXRpdmUvc3VuL2F3dC9DVHJheUljb24uaApAQCAtNTMsNiArNTMsNyBAQAogLSAoam9iamVjdCkgcGVlcjsKIC0gKHZvaWQpIHNldEltYWdlOihOU0ltYWdlICopIGltYWdlUHRyIHNpemluZzooQk9PTClhdXRvc2l6ZTsKIC0gKE5TUG9pbnQpIGdldExvY2F0aW9uT25TY3JlZW47CistICh2b2lkKSBkZWxpdmVySmF2YU1vdXNlRXZlbnQ6KE5TRXZlbnQqKSBldmVudDsKIAogQGVuZCAvL0FXVFRyYXlJY29uCiAKQEAgLTY4LDYgKzY5LDcgQEAKIC0oaWQpaW5pdFdpdGhUcmF5SWNvbjooQVdUVHJheUljb24gKil0aGVUcmF5SWNvbjsKIC0odm9pZClzZXRIaWdobGlnaHRlZDooQk9PTClhRmxhZzsKIC0odm9pZClzZXRJbWFnZTooTlNJbWFnZSopYW5JbWFnZTsKKy0odm9pZClzZXRUcmF5SWNvbjooQVdUVHJheUljb24qKXRoZVRyYXlJY29uOwogCiBAZW5kIC8vQVdUVHJheUljb25WaWV3CiAKZGlmZiAtLWdpdCBhL2pkay9zcmMvbWFjb3N4L25hdGl2ZS9zdW4vYXd0L0NUcmF5SWNvbi5tIGIvamRrL3NyYy9tYWNvc3gvbmF0aXZlL3N1bi9hd3QvQ1RyYXlJY29uLm0KaW5kZXggYjljMjk0Mi4uYTY5OTk1ZiAxMDA2NDQKLS0tIGEvamRrL3NyYy9tYWNvc3gvbmF0aXZlL3N1bi9hd3QvQ1RyYXlJY29uLm0KKysrIGIvamRrL3NyYy9tYWNvc3gvbmF0aXZlL3N1bi9hd3QvQ1RyYXlJY29uLm0KQEAgLTI5LDYgKzI5LDcgQEAKICNpbXBvcnQgIkNUcmF5SWNvbi5oIgogI2ltcG9ydCAiVGhyZWFkVXRpbGl0aWVzLmgiCiAjaW5jbHVkZSAiR2VvbVV0aWxpdGllcy5oIgorI2ltcG9ydCAiTFdDVG9vbGtpdC5oIgogCiAjZGVmaW5lIGtJbWFnZUluc2V0IDQuMAogCkBAIC03Niw4ICs3Nyw5IEBACiAgICAgLy8gSXRzIGEgYmFkIGlkZWEgdG8gZm9yY2UgdGhlIGl0ZW0gdG8gcmVsZWFzZSBvdXIgdmlldyBieSBzZXR0aW5nCiAgICAgLy8gdGhlIGl0ZW0ncyB2aWV3IHRvIG5pbDogaXQgY2FuIGxlYWQgdG8gYSBjcmFzaCBpbiBzb21lIHNjZW5hcmlvcy4KICAgICAvLyBUaGUgaXRlbSB3aWxsIHJlbGVhc2UgdGhlIHZpZXcgbGF0ZXIgb24sIHNvIGp1c3Qgc2V0IHRoZSB2aWV3J3MgaW1hZ2UKLSAgICAvLyB0byBuaWwgc2luY2Ugd2UgYXJlIGRvbmUgd2l0aCBpdC4KKyAgICAvLyBhbmQgdHJheSBpY29uIHRvIG5pbCBzaW5jZSB3ZSBhcmUgZG9uZSB3aXRoIGl0LgogICAgIFt2aWV3IHNldEltYWdlOiBuaWxdOworICAgIFt2aWV3IHNldFRyYXlJY29uOiBuaWxdOwogICAgIFt2aWV3IHJlbGVhc2VdOwogCiAgICAgW3RoZUl0ZW0gcmVsZWFzZV07CkBAIC0xMTUsNiArMTE3LDQ1IEBACiAgICAgcmV0dXJuIFtbdmlldyB3aW5kb3ddIGNvbnZlcnRCYXNlVG9TY3JlZW46IE5TWmVyb1BvaW50XTsKIH0KIAorLSh2b2lkKSBkZWxpdmVySmF2YU1vdXNlRXZlbnQ6IChOU0V2ZW50ICopIGV2ZW50IHsKKyAgICBbQVdUVG9vbGtpdCBldmVudENvdW50UGx1c1BsdXNdOworCisgICAgSk5JRW52ICplbnYgPSBbVGhyZWFkVXRpbGl0aWVzIGdldEpOSUVudl07CisKKyAgICBOU1BvaW50IGV2ZW50TG9jYXRpb24gPSBbZXZlbnQgbG9jYXRpb25JbldpbmRvd107CisgICAgTlNQb2ludCBsb2NhbFBvaW50ID0gW3ZpZXcgY29udmVydFBvaW50OiBldmVudExvY2F0aW9uIGZyb21WaWV3OiBuaWxdOworICAgIGxvY2FsUG9pbnQueSA9IFt2aWV3IGJvdW5kc10uc2l6ZS5oZWlnaHQgLSBsb2NhbFBvaW50Lnk7CisKKyAgICBOU1BvaW50IGFic1AgPSBbTlNFdmVudCBtb3VzZUxvY2F0aW9uXTsKKyAgICBOU0V2ZW50VHlwZSB0eXBlID0gW2V2ZW50IHR5cGVdOworCisgICAgTlNSZWN0IHNjcmVlblJlY3QgPSBbW05TU2NyZWVuIG1haW5TY3JlZW5dIGZyYW1lXTsKKyAgICBhYnNQLnkgPSBzY3JlZW5SZWN0LnNpemUuaGVpZ2h0IC0gYWJzUC55OworICAgIGppbnQgY2xpY2tDb3VudDsKKworICAgIGNsaWNrQ291bnQgPSBbZXZlbnQgY2xpY2tDb3VudF07CisKKyAgICBzdGF0aWMgSk5GX0NMQVNTX0NBQ0hFKGpjX05TRXZlbnQsICJzdW4vbHdhd3QvbWFjb3N4L2V2ZW50L05TRXZlbnQiKTsKKyAgICBzdGF0aWMgSk5GX0NUT1JfQ0FDSEUoamN0b3JfTlNFdmVudCwgamNfTlNFdmVudCwgIihJSUlJSUlJSUREKVYiKTsKKyAgICBqb2JqZWN0IGpFdmVudCA9IEpORk5ld09iamVjdChlbnYsIGpjdG9yX05TRXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2V2ZW50IHR5cGVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtldmVudCBtb2RpZmllckZsYWdzXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlja0NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtldmVudCBidXR0b25OdW1iZXJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChqaW50KWxvY2FsUG9pbnQueCwgKGppbnQpbG9jYWxQb2ludC55LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChqaW50KWFic1AueCwgKGppbnQpYWJzUC55LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtldmVudCBkZWx0YVldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtldmVudCBkZWx0YVhdKTsKKyAgICBpZiAoakV2ZW50ID09IG5pbCkgeworICAgICAgICAvLyBVbmFibGUgdG8gY3JlYXRlIGV2ZW50IGJ5IHNvbWUgcmVhc29uLgorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3RhdGljIEpORl9DTEFTU19DQUNIRShqY19UcmF5SWNvbiwgInN1bi9sd2F3dC9tYWNvc3gvQ1RyYXlJY29uIik7CisgICAgc3RhdGljIEpORl9NRU1CRVJfQ0FDSEUoam1faGFuZGxlTW91c2VFdmVudCwgamNfVHJheUljb24sICJoYW5kbGVNb3VzZUV2ZW50IiwgIihMc3VuL2x3YXd0L21hY29zeC9ldmVudC9OU0V2ZW50OylWIik7CisgICAgSk5GQ2FsbFZvaWRNZXRob2QoZW52LCBwZWVyLCBqbV9oYW5kbGVNb3VzZUV2ZW50LCBqRXZlbnQpOworfQorCiBAZW5kIC8vQVdUVHJheUljb24KIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09EwogCkBAIC0xMjMsNyArMTY0LDcgQEAKIC0oaWQpaW5pdFdpdGhUcmF5SWNvbjooQVdUVHJheUljb24gKil0aGVUcmF5SWNvbiB7CiAgICAgc2VsZiA9IFtzdXBlciBpbml0V2l0aEZyYW1lOk5TTWFrZVJlY3QoMCwgMCwgMSwgMSldOwogCi0gICAgdHJheUljb24gPSB0aGVUcmF5SWNvbjsKKyAgICBbc2VsZiBzZXRUcmF5SWNvbjogdGhlVHJheUljb25dOwogICAgIGlzSGlnaGxpZ2h0ZWQgPSBOTzsKICAgICBpbWFnZSA9IG5pbDsKIApAQCAtMTUzLDYgKzE5NCwxMCBAQAogICAgIH0KIH0KIAorLSh2b2lkKXNldFRyYXlJY29uOihBV1RUcmF5SWNvbiopdGhlVHJheUljb24geworICAgIHRyYXlJY29uID0gdGhlVHJheUljb247Cit9CisKIC0gKHZvaWQpbWVudVdpbGxPcGVuOihOU01lbnUgKiltZW51CiB7CiAgICAgW3NlbGYgc2V0SGlnaGxpZ2h0ZWQ6WUVTXTsKQEAgLTE5MSwzMCArMjM2LDU3IEBACiAgICAgIF07CiB9CiAKLS0gKHZvaWQpIG1vdXNlRG93bjooTlNFdmVudCAqKWUgewotICAgIC8vZmluZCBDVHJheUljb24uZ2V0UG9wdXBNZW51TW9kZWwgbWV0aG9kIGFuZCBjYWxsIGl0IHRvIGdldCBwb3B1cCBtZW51IHB0ci4KLSAgICBKTklFbnYgKmVudiA9IFtUaHJlYWRVdGlsaXRpZXMgZ2V0Sk5JRW52XTsKLSAgICBzdGF0aWMgSk5GX0NMQVNTX0NBQ0hFKGpjX0NUcmF5SWNvbiwgInN1bi9sd2F3dC9tYWNvc3gvQ1RyYXlJY29uIik7Ci0gICAgc3RhdGljIEpORl9NRU1CRVJfQ0FDSEUoam1fZ2V0UG9wdXBNZW51TW9kZWwsIGpjX0NUcmF5SWNvbiwgImdldFBvcHVwTWVudU1vZGVsIiwgIigpSiIpOwotICAgIHN0YXRpYyBKTkZfTUVNQkVSX0NBQ0hFKGptX3BlcmZvcm1BY3Rpb24sIGpjX0NUcmF5SWNvbiwgInBlcmZvcm1BY3Rpb24iLCAiKClWIik7Ci0gICAgamxvbmcgcmVzID0gSk5GQ2FsbExvbmdNZXRob2QoZW52LCB0cmF5SWNvbi5wZWVyLCBqbV9nZXRQb3B1cE1lbnVNb2RlbCk7Ci0gICAgaWYgKHJlcyAhPSAwKSB7Ci0gICAgICAgIENQb3B1cE1lbnUgKmNtZW51ID0gamxvbmdfdG9fcHRyKHJlcyk7Ci0gICAgICAgIE5TTWVudSogbWVudSA9IFtjbWVudSBtZW51XTsKLSAgICAgICAgW21lbnUgc2V0RGVsZWdhdGU6c2VsZl07Ci0gICAgICAgIFt0cmF5SWNvbi50aGVJdGVtIHBvcFVwU3RhdHVzSXRlbU1lbnU6bWVudV07Ci0gICAgICAgIFtzZWxmIHNldE5lZWRzRGlzcGxheTpZRVNdOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEpORkNhbGxWb2lkTWV0aG9kKGVudiwgdHJheUljb24ucGVlciwgam1fcGVyZm9ybUFjdGlvbik7CistICh2b2lkKW1vdXNlRG93bjooTlNFdmVudCAqKWV2ZW50IHsKKyAgICBbdHJheUljb24gZGVsaXZlckphdmFNb3VzZUV2ZW50OiBldmVudF07CisKKyAgICAvLyBkb24ndCBzaG93IHRoZSBtZW51IG9uIGN0cmwrY2xpY2s6IGl0IHRyaWdnZXJzIEFDVElPTiBldmVudCwgbGlrZSByaWdodCBjbGljaworICAgIGlmICgoW2V2ZW50IG1vZGlmaWVyRmxhZ3NdICYgTlNDb250cm9sS2V5TWFzaykgPT0gMCkgeworICAgICAgICAvL2ZpbmQgQ1RyYXlJY29uLmdldFBvcHVwTWVudU1vZGVsIG1ldGhvZCBhbmQgY2FsbCBpdCB0byBnZXQgcG9wdXAgbWVudSBwdHIuCisgICAgICAgIEpOSUVudiAqZW52ID0gW1RocmVhZFV0aWxpdGllcyBnZXRKTklFbnZdOworICAgICAgICBzdGF0aWMgSk5GX0NMQVNTX0NBQ0hFKGpjX0NUcmF5SWNvbiwgInN1bi9sd2F3dC9tYWNvc3gvQ1RyYXlJY29uIik7CisgICAgICAgIHN0YXRpYyBKTkZfTUVNQkVSX0NBQ0hFKGptX2dldFBvcHVwTWVudU1vZGVsLCBqY19DVHJheUljb24sICJnZXRQb3B1cE1lbnVNb2RlbCIsICIoKUoiKTsKKyAgICAgICAgamxvbmcgcmVzID0gSk5GQ2FsbExvbmdNZXRob2QoZW52LCB0cmF5SWNvbi5wZWVyLCBqbV9nZXRQb3B1cE1lbnVNb2RlbCk7CisKKyAgICAgICAgaWYgKHJlcyAhPSAwKSB7CisgICAgICAgICAgICBDUG9wdXBNZW51ICpjbWVudSA9IGpsb25nX3RvX3B0cihyZXMpOworICAgICAgICAgICAgTlNNZW51KiBtZW51ID0gW2NtZW51IG1lbnVdOworICAgICAgICAgICAgW21lbnUgc2V0RGVsZWdhdGU6c2VsZl07CisgICAgICAgICAgICBbdHJheUljb24udGhlSXRlbSBwb3BVcFN0YXR1c0l0ZW1NZW51Om1lbnVdOworICAgICAgICAgICAgW3NlbGYgc2V0TmVlZHNEaXNwbGF5OllFU107CisgICAgICAgIH0KICAgICB9CiB9CiAKLS0gKHZvaWQpIHJpZ2h0TW91c2VEb3duOihOU0V2ZW50ICopZSB7Ci0gICAgLy8gQ2FsbCBDVHJheUljb24ucGVyZm9ybUFjdGlvbigpIG1ldGhvZCBvbiByaWdodCBtb3VzZSBwcmVzcwotICAgIEpOSUVudiAqZW52ID0gW1RocmVhZFV0aWxpdGllcyBnZXRKTklFbnZdOwotICAgIHN0YXRpYyBKTkZfQ0xBU1NfQ0FDSEUoamNfQ1RyYXlJY29uLCAic3VuL2x3YXd0L21hY29zeC9DVHJheUljb24iKTsKLSAgICBzdGF0aWMgSk5GX01FTUJFUl9DQUNIRShqbV9wZXJmb3JtQWN0aW9uLCBqY19DVHJheUljb24sICJwZXJmb3JtQWN0aW9uIiwgIigpViIpOwotICAgIEpORkNhbGxWb2lkTWV0aG9kKGVudiwgdHJheUljb24ucGVlciwgam1fcGVyZm9ybUFjdGlvbik7CistICh2b2lkKSBtb3VzZVVwOihOU0V2ZW50ICopZXZlbnQgeworICAgIFt0cmF5SWNvbiBkZWxpdmVySmF2YU1vdXNlRXZlbnQ6IGV2ZW50XTsKK30KKworLSAodm9pZCkgbW91c2VEcmFnZ2VkOihOU0V2ZW50ICopZXZlbnQgeworICAgIFt0cmF5SWNvbiBkZWxpdmVySmF2YU1vdXNlRXZlbnQ6IGV2ZW50XTsKK30KKworLSAodm9pZCkgcmlnaHRNb3VzZURvd246KE5TRXZlbnQgKilldmVudCB7CisgICAgW3RyYXlJY29uIGRlbGl2ZXJKYXZhTW91c2VFdmVudDogZXZlbnRdOworfQorCistICh2b2lkKSByaWdodE1vdXNlVXA6KE5TRXZlbnQgKilldmVudCB7CisgICAgW3RyYXlJY29uIGRlbGl2ZXJKYXZhTW91c2VFdmVudDogZXZlbnRdOworfQorCistICh2b2lkKSByaWdodE1vdXNlRHJhZ2dlZDooTlNFdmVudCAqKWV2ZW50IHsKKyAgICBbdHJheUljb24gZGVsaXZlckphdmFNb3VzZUV2ZW50OiBldmVudF07Cit9CisKKy0gKHZvaWQpIG90aGVyTW91c2VEb3duOihOU0V2ZW50ICopZXZlbnQgeworICAgIFt0cmF5SWNvbiBkZWxpdmVySmF2YU1vdXNlRXZlbnQ6IGV2ZW50XTsKK30KKworLSAodm9pZCkgb3RoZXJNb3VzZVVwOihOU0V2ZW50ICopZXZlbnQgeworICAgIFt0cmF5SWNvbiBkZWxpdmVySmF2YU1vdXNlRXZlbnQ6IGV2ZW50XTsKK30KKworLSAodm9pZCkgb3RoZXJNb3VzZURyYWdnZWQ6KE5TRXZlbnQgKilldmVudCB7CisgICAgW3RyYXlJY29uIGRlbGl2ZXJKYXZhTW91c2VFdmVudDogZXZlbnRdOwogfQogCiAKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2JlYW5zL2RlY29kZXIvRG9jdW1lbnRIYW5kbGVyLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9iZWFucy9kZWNvZGVyL0RvY3VtZW50SGFuZGxlci5qYXZhCmluZGV4IGY0NTQwMDYuLjRiYmI4ZjQgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2JlYW5zL2RlY29kZXIvRG9jdW1lbnRIYW5kbGVyLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vYmVhbnMvZGVjb2Rlci9Eb2N1bWVudEhhbmRsZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTM3LDYgKzM3LDkgQEAKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbENvbnRleHQ7CitpbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjsKIAogaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247CiBpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKQEAgLTQ2LDYgKzQ5LDggQEAKIGltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CiBpbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcjsKIAoraW1wb3J0IHN1bi5taXNjLlNoYXJlZFNlY3JldHM7CisKIC8qKgogICogVGhlIG1haW4gY2xhc3MgdG8gcGFyc2UgSmF2YUJlYW5zIFhNTCBhcmNoaXZlLgogICoKQEAgLTU2LDExICs2MSwxMCBAQAogICogQHNlZSBFbGVtZW50SGFuZGxlcgogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgRG9jdW1lbnRIYW5kbGVyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIgewotICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgQ2xhc3M8PyBleHRlbmRzIEVsZW1lbnRIYW5kbGVyPj4gaGFuZGxlcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIENsYXNzPD8gZXh0ZW5kcyBFbGVtZW50SGFuZGxlcj4+KCk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gZW52aXJvbm1lbnQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLQotICAgIHByaXZhdGUgZmluYWwgTGlzdDxPYmplY3Q+IG9iamVjdHMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKKyAgICBwcml2YXRlIGZpbmFsIEFjY2Vzc0NvbnRyb2xDb250ZXh0IGFjYyA9IEFjY2Vzc0NvbnRyb2xsZXIuZ2V0Q29udGV4dCgpOworICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgQ2xhc3M8PyBleHRlbmRzIEVsZW1lbnRIYW5kbGVyPj4gaGFuZGxlcnMgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IGVudmlyb25tZW50ID0gbmV3IEhhc2hNYXA8PigpOworICAgIHByaXZhdGUgZmluYWwgTGlzdDxPYmplY3Q+IG9iamVjdHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAogICAgIHByaXZhdGUgUmVmZXJlbmNlPENsYXNzTG9hZGVyPiBsb2FkZXI7CiAgICAgcHJpdmF0ZSBFeGNlcHRpb25MaXN0ZW5lciBsaXN0ZW5lcjsKQEAgLTM1MSwyMyArMzU1LDMyIEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gaW5wdXQgIHRoZSBpbnB1dCBzb3VyY2UgdG8gcGFyc2UKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwYXJzZShJbnB1dFNvdXJjZSBpbnB1dCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1NBWFBhcnNlcigpLnBhcnNlKGlucHV0LCB0aGlzKTsKKyAgICBwdWJsaWMgdm9pZCBwYXJzZShmaW5hbCBJbnB1dFNvdXJjZSBpbnB1dCkgeworICAgICAgICBpZiAoKHRoaXMuYWNjID09IG51bGwpICYmIChudWxsICE9IFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbigiQWNjZXNzQ29udHJvbENvbnRleHQgaXMgbm90IHNldCIpOwogICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotICAgICAgICAgICAgaGFuZGxlRXhjZXB0aW9uKGV4Y2VwdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFNBWEV4Y2VwdGlvbiB3cmFwcGVyKSB7Ci0gICAgICAgICAgICBFeGNlcHRpb24gZXhjZXB0aW9uID0gd3JhcHBlci5nZXRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIGlmIChleGNlcHRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGV4Y2VwdGlvbiA9IHdyYXBwZXI7CisgICAgICAgIEFjY2Vzc0NvbnRyb2xDb250ZXh0IHN0YWNrID0gQWNjZXNzQ29udHJvbGxlci5nZXRDb250ZXh0KCk7CisgICAgICAgIFNoYXJlZFNlY3JldHMuZ2V0SmF2YVNlY3VyaXR5QWNjZXNzKCkuZG9JbnRlcnNlY3Rpb25Qcml2aWxlZ2UobmV3IFByaXZpbGVnZWRBY3Rpb248Vm9pZD4oKSB7CisgICAgICAgICAgICBwdWJsaWMgVm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1NBWFBhcnNlcigpLnBhcnNlKGlucHV0LCBEb2N1bWVudEhhbmRsZXIudGhpcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgICAgICBoYW5kbGVFeGNlcHRpb24oZXhjZXB0aW9uKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKFNBWEV4Y2VwdGlvbiB3cmFwcGVyKSB7CisgICAgICAgICAgICAgICAgICAgIEV4Y2VwdGlvbiBleGNlcHRpb24gPSB3cmFwcGVyLmdldEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICBpZiAoZXhjZXB0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbiA9IHdyYXBwZXI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlRXhjZXB0aW9uKGV4Y2VwdGlvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBleGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlRXhjZXB0aW9uKGV4Y2VwdGlvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaGFuZGxlRXhjZXB0aW9uKGV4Y2VwdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotICAgICAgICAgICAgaGFuZGxlRXhjZXB0aW9uKGV4Y2VwdGlvbik7Ci0gICAgICAgIH0KKyAgICAgICAgfSwgc3RhY2ssIHRoaXMuYWNjKTsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2JlYW5zL2RlY29kZXIvUHJvcGVydHlFbGVtZW50SGFuZGxlci5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vYmVhbnMvZGVjb2Rlci9Qcm9wZXJ0eUVsZW1lbnRIYW5kbGVyLmphdmEKaW5kZXggZjIwODI5My4uOGY0YzQwYyAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vYmVhbnMvZGVjb2Rlci9Qcm9wZXJ0eUVsZW1lbnRIYW5kbGVyLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vYmVhbnMvZGVjb2Rlci9Qcm9wZXJ0eUVsZW1lbnRIYW5kbGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0zNSw2ICszNSw4IEBACiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CiAKK2ltcG9ydCBzdW4ucmVmbGVjdC5taXNjLk1ldGhvZFV0aWw7CisKIC8qKgogICogVGhpcyBjbGFzcyBpcyBpbnRlbmRlZCB0byBoYW5kbGUgJmx0O3Byb3BlcnR5Jmd0OyBlbGVtZW50LgogICogVGhpcyBlbGVtZW50IHNpbXBsaWZpZXMgYWNjZXNzIHRvIHRoZSBwcm9wZXJ0aWVzLgpAQCAtMTY4LDExICsxNzAsMTEgQEAKICAgICBwcml2YXRlIHN0YXRpYyBPYmplY3QgZ2V0UHJvcGVydHlWYWx1ZShPYmplY3QgYmVhbiwgU3RyaW5nIG5hbWUsIEludGVnZXIgaW5kZXgpIHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbnRyb3NwZWN0aW9uRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewogICAgICAgICBDbGFzczw/PiB0eXBlID0gYmVhbi5nZXRDbGFzcygpOwogICAgICAgICBpZiAoaW5kZXggPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGZpbmRHZXR0ZXIodHlwZSwgbmFtZSkuaW52b2tlKGJlYW4pOworICAgICAgICAgICAgcmV0dXJuIE1ldGhvZFV0aWwuaW52b2tlKGZpbmRHZXR0ZXIodHlwZSwgbmFtZSksIGJlYW4sIG5ldyBPYmplY3RbXSB7fSk7CiAgICAgICAgIH0gZWxzZSBpZiAodHlwZS5pc0FycmF5KCkgJiYgKG5hbWUgPT0gbnVsbCkpIHsKICAgICAgICAgICAgIHJldHVybiBBcnJheS5nZXQoYmVhbiwgaW5kZXgpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGZpbmRHZXR0ZXIodHlwZSwgbmFtZSwgaW50LmNsYXNzKS5pbnZva2UoYmVhbiwgaW5kZXgpOworICAgICAgICAgICAgcmV0dXJuIE1ldGhvZFV0aWwuaW52b2tlKGZpbmRHZXR0ZXIodHlwZSwgbmFtZSwgaW50LmNsYXNzKSwgYmVhbiwgbmV3IE9iamVjdFtdIHtpbmRleH0pOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xOTcsMTEgKzE5OSwxMSBAQAogICAgICAgICAgICAgICAgIDogbnVsbDsKIAogICAgICAgICBpZiAoaW5kZXggPT0gbnVsbCkgewotICAgICAgICAgICAgZmluZFNldHRlcih0eXBlLCBuYW1lLCBwYXJhbSkuaW52b2tlKGJlYW4sIHZhbHVlKTsKKyAgICAgICAgICAgIE1ldGhvZFV0aWwuaW52b2tlKGZpbmRTZXR0ZXIodHlwZSwgbmFtZSwgcGFyYW0pLCBiZWFuLCBuZXcgT2JqZWN0W10ge3ZhbHVlfSk7CiAgICAgICAgIH0gZWxzZSBpZiAodHlwZS5pc0FycmF5KCkgJiYgKG5hbWUgPT0gbnVsbCkpIHsKICAgICAgICAgICAgIEFycmF5LnNldChiZWFuLCBpbmRleCwgdmFsdWUpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZmluZFNldHRlcih0eXBlLCBuYW1lLCBpbnQuY2xhc3MsIHBhcmFtKS5pbnZva2UoYmVhbiwgaW5kZXgsIHZhbHVlKTsKKyAgICAgICAgICAgIE1ldGhvZFV0aWwuaW52b2tlKGZpbmRTZXR0ZXIodHlwZSwgbmFtZSwgaW50LmNsYXNzLCBwYXJhbSksIGJlYW4sIG5ldyBPYmplY3RbXSB7aW5kZXgsIHZhbHVlfSk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2pteC9yZW1vdGUvaW50ZXJuYWwvU2VydmVyTm90aWZGb3J3YXJkZXIuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2pteC9yZW1vdGUvaW50ZXJuYWwvU2VydmVyTm90aWZGb3J3YXJkZXIuamF2YQppbmRleCBiYTA3MTQxLi41OGNjZmI0IDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9qbXgvcmVtb3RlL2ludGVybmFsL1NlcnZlck5vdGlmRm9yd2FyZGVyLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vam14L3JlbW90ZS9pbnRlcm5hbC9TZXJ2ZXJOb3RpZkZvcndhcmRlci5qYXZhCkBAIC02OCw5ICs2OCw5IEBACiAgICAgICAgIHRoaXMubm90aWZCdWZmZXIgPSBub3RpZkJ1ZmZlcjsKICAgICAgICAgdGhpcy5jb25uZWN0aW9uSWQgPSBjb25uZWN0aW9uSWQ7CiAgICAgICAgIGNvbm5lY3Rpb25UaW1lb3V0ID0gRW52SGVscC5nZXRTZXJ2ZXJDb25uZWN0aW9uVGltZW91dChlbnYpOwotICAgICAgICBjaGVja05vdGlmaWNhdGlvbkVtaXNzaW9uID0gRW52SGVscC5jb21wdXRlQm9vbGVhbkZyb21TdHJpbmcoCi0gICAgICAgICAgICBlbnYsCi0gICAgICAgICAgICAiam14LnJlbW90ZS54LmNoZWNrLm5vdGlmaWNhdGlvbi5lbWlzc2lvbiIsZmFsc2UpOworCisgICAgICAgIFN0cmluZyBzdHJpbmdCb29sZWFuID0gKFN0cmluZykgZW52LmdldCgiam14LnJlbW90ZS54LmNoZWNrLm5vdGlmaWNhdGlvbi5lbWlzc2lvbiIpOworICAgICAgICBjaGVja05vdGlmaWNhdGlvbkVtaXNzaW9uID0gRW52SGVscC5jb21wdXRlQm9vbGVhbkZyb21TdHJpbmcoIHN0cmluZ0Jvb2xlYW4gKTsKICAgICAgICAgbm90aWZpY2F0aW9uQWNjZXNzQ29udHJvbGxlciA9CiAgICAgICAgICAgICAgICAgRW52SGVscC5nZXROb3RpZmljYXRpb25BY2Nlc3NDb250cm9sbGVyKGVudik7CiAgICAgfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vam14L3JlbW90ZS91dGlsL0VudkhlbHAuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2pteC9yZW1vdGUvdXRpbC9FbnZIZWxwLmphdmEKaW5kZXggZTYxZDlkMC4uYjhiZjlkMyAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vam14L3JlbW90ZS91dGlsL0VudkhlbHAuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9qbXgvcmVtb3RlL3V0aWwvRW52SGVscC5qYXZhCkBAIC02NjUsOTcgKzY2NSw1NyBAQAogICAgICAqIENvbXB1dGVzIGEgYm9vbGVhbiB2YWx1ZSBmcm9tIGEgc3RyaW5nIHZhbHVlIHJldHJpZXZlZCBmcm9tIGEKICAgICAgKiBwcm9wZXJ0eSBpbiB0aGUgZ2l2ZW4gbWFwLgogICAgICAqCi0gICAgICogQHBhcmFtIGVudiB0aGUgZW52aXJvbm1lbnQgbWFwLgotICAgICAqIEBwYXJhbSBwcm9wIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBpbiB0aGUgZW52aXJvbm1lbnQgbWFwIHdob3NlCi0gICAgICogcmV0dXJuZWQgc3RyaW5nIHZhbHVlIG11c3QgYmUgY29udmVydGVkIGludG8gYSBib29sZWFuIHZhbHVlLgotICAgICAqIEBwYXJhbSBzeXN0ZW1Qcm9wZXJ0eSBpZiB0cnVlLCBjb25zdWx0IGEgc3lzdGVtIHByb3BlcnR5IG9mIHRoZQotICAgICAqIHNhbWUgbmFtZSBpZiB0aGVyZSBpcyBubyBlbnRyeSBpbiB0aGUgZW52aXJvbm1lbnQgbWFwLgorICAgICAqIEBwYXJhbSBzdHJpbmdCb29sZWFuIHRoZSBzdHJpbmcgdmFsdWUgdGhhdCBtdXN0IGJlIGNvbnZlcnRlZAorICAgICAqIGludG8gYSBib29sZWFuIHZhbHVlLgogICAgICAqCiAgICAgICogQHJldHVybgogICAgICAqICAgPHVsPgotICAgICAqICAgPGxpPntAY29kZSBmYWxzZX0gaWYge0Bjb2RlIGVudi5nZXQocHJvcCl9IGlzIHtAY29kZSBudWxsfTwvbGk+CisgICAgICogICA8bGk+e0Bjb2RlIGZhbHNlfSBpZiB7QGNvZGUgc3RyaW5nQm9vbGVhbn0gaXMge0Bjb2RlIG51bGx9PC9saT4KICAgICAgKiAgIDxsaT57QGNvZGUgZmFsc2V9IGlmCi0gICAgICogICAgICAge0Bjb2RlICgoU3RyaW5nKWVudi5nZXQocHJvcCkpLmVxdWFsc0lnbm9yZUNhc2UoImZhbHNlIil9CisgICAgICogICAgICAge0Bjb2RlIHN0cmluZ0Jvb2xlYW4uZXF1YWxzSWdub3JlQ2FzZSgiZmFsc2UiKX0KICAgICAgKiAgICAgICBpcyB7QGNvZGUgdHJ1ZX08L2xpPgogICAgICAqICAgPGxpPntAY29kZSB0cnVlfSBpZgotICAgICAqICAgICAgIHtAY29kZSAoKFN0cmluZyllbnYuZ2V0KHByb3ApKS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIil9CisgICAgICogICAgICAge0Bjb2RlIHN0cmluZ0Jvb2xlYW4uZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpfQogICAgICAqICAgICAgIGlzIHtAY29kZSB0cnVlfTwvbGk+CiAgICAgICogICA8L3VsPgogICAgICAqCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYge0Bjb2RlIGVudn0gaXMge0Bjb2RlIG51bGx9IG9yCi0gICAgICoge0Bjb2RlIGVudi5nZXQocHJvcCl9IGlzIG5vdCB7QGNvZGUgbnVsbH0gYW5kCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYKICAgICAgKiB7QGNvZGUgKChTdHJpbmcpZW52LmdldChwcm9wKSkuZXF1YWxzSWdub3JlQ2FzZSgiZmFsc2UiKX0gYW5kCiAgICAgICoge0Bjb2RlICgoU3RyaW5nKWVudi5nZXQocHJvcCkpLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKX0gYXJlCiAgICAgICoge0Bjb2RlIGZhbHNlfS4KLSAgICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiBpZiB7QGNvZGUgZW52LmdldChwcm9wKX0gY2Fubm90IGJlIGNhc3QKLSAgICAgKiB0byB7QGNvZGUgU3RyaW5nfS4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29tcHV0ZUJvb2xlYW5Gcm9tU3RyaW5nKAotICAgICAgICAgICAgTWFwPFN0cmluZywgPz4gZW52LCBTdHJpbmcgcHJvcCwgYm9vbGVhbiBzeXN0ZW1Qcm9wZXJ0eSkgewotCi0gICAgICAgIGlmIChlbnYgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImVudiBtYXAgY2Fubm90IGJlIG51bGwiKTsKLQorICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb21wdXRlQm9vbGVhbkZyb21TdHJpbmcoU3RyaW5nIHN0cmluZ0Jvb2xlYW4pIHsKICAgICAgICAgLy8gcmV0dXJucyBhIGRlZmF1bHQgdmFsdWUgb2YgJ2ZhbHNlJyBpZiBubyBwcm9wZXJ0eSBpcyBmb3VuZC4uLgotICAgICAgICByZXR1cm4gY29tcHV0ZUJvb2xlYW5Gcm9tU3RyaW5nKGVudixwcm9wLHN5c3RlbVByb3BlcnR5LGZhbHNlKTsKKyAgICAgICAgcmV0dXJuIGNvbXB1dGVCb29sZWFuRnJvbVN0cmluZyhzdHJpbmdCb29sZWFuLGZhbHNlKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBDb21wdXRlcyBhIGJvb2xlYW4gdmFsdWUgZnJvbSBhIHN0cmluZyB2YWx1ZSByZXRyaWV2ZWQgZnJvbSBhCiAgICAgICogcHJvcGVydHkgaW4gdGhlIGdpdmVuIG1hcC4KICAgICAgKgotICAgICAqIEBwYXJhbSBlbnYgdGhlIGVudmlyb25tZW50IG1hcC4KLSAgICAgKiBAcGFyYW0gcHJvcCB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgaW4gdGhlIGVudmlyb25tZW50IG1hcCB3aG9zZQotICAgICAqIHJldHVybmVkIHN0cmluZyB2YWx1ZSBtdXN0IGJlIGNvbnZlcnRlZCBpbnRvIGEgYm9vbGVhbiB2YWx1ZS4KLSAgICAgKiBAcGFyYW0gc3lzdGVtUHJvcGVydHkgaWYgdHJ1ZSwgY29uc3VsdCBhIHN5c3RlbSBwcm9wZXJ0eSBvZiB0aGUKLSAgICAgKiBzYW1lIG5hbWUgaWYgdGhlcmUgaXMgbm8gZW50cnkgaW4gdGhlIGVudmlyb25tZW50IG1hcC4KKyAgICAgKiBAcGFyYW0gc3RyaW5nQm9vbGVhbiB0aGUgc3RyaW5nIHZhbHVlIHRoYXQgbXVzdCBiZSBjb252ZXJ0ZWQKKyAgICAgKiBpbnRvIGEgYm9vbGVhbiB2YWx1ZS4KICAgICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIGEgZGVmYXVsdCB2YWx1ZSB0byByZXR1cm4gaW4gY2FzZSBubyBwcm9wZXJ0eQogICAgICAqICAgICAgICB3YXMgZGVmaW5lZC4KICAgICAgKgogICAgICAqIEByZXR1cm4KICAgICAgKiAgIDx1bD4KLSAgICAgKiAgIDxsaT57QGNvZGUgZGVmYXVsdFZhbHVlfSBpZiB7QGNvZGUgZW52LmdldChwcm9wKX0gaXMge0Bjb2RlIG51bGx9Ci0gICAgICogICAgICAgYW5kIHtAY29kZSBzeXN0ZW1Qcm9wZXJ0eX0gaXMge0Bjb2RlIGZhbHNlfTwvbGk+Ci0gICAgICogICA8bGk+e0Bjb2RlIGRlZmF1bHRWYWx1ZX0gaWYge0Bjb2RlIGVudi5nZXQocHJvcCl9IGlzIHtAY29kZSBudWxsfQotICAgICAqICAgICAgIGFuZCB7QGNvZGUgc3lzdGVtUHJvcGVydHl9IGlzIHtAY29kZSB0cnVlfSBhbmQKLSAgICAgKiAgICAgICB7QGNvZGUgU3lzdGVtLmdldFByb3BlcnR5KHByb3ApfSBpcyB7QGNvZGUgbnVsbH08L2xpPgotICAgICAqICAgPGxpPntAY29kZSBmYWxzZX0gaWYge0Bjb2RlIGVudi5nZXQocHJvcCl9IGlzIHtAY29kZSBudWxsfQotICAgICAqICAgICAgIGFuZCB7QGNvZGUgc3lzdGVtUHJvcGVydHl9IGlzIHtAY29kZSB0cnVlfSBhbmQKLSAgICAgKiAgICAgICB7QGNvZGUgU3lzdGVtLmdldFByb3BlcnR5KHByb3ApLmVxdWFsc0lnbm9yZUNhc2UoImZhbHNlIil9Ci0gICAgICogICAgICAgaXMge0Bjb2RlIHRydWV9PC9saT4KLSAgICAgKiAgIDxsaT57QGNvZGUgdHJ1ZX0gaWYge0Bjb2RlIGVudi5nZXQocHJvcCl9IGlzIHtAY29kZSBudWxsfQotICAgICAqICAgICAgIGFuZCB7QGNvZGUgc3lzdGVtUHJvcGVydHl9IGlzIHtAY29kZSB0cnVlfSBhbmQKLSAgICAgKiAgICAgICB7QGNvZGUgU3lzdGVtLmdldFByb3BlcnR5KHByb3ApLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKX0KLSAgICAgKiAgICAgICBpcyB7QGNvZGUgdHJ1ZX08L2xpPgorICAgICAqICAgPGxpPntAY29kZSBkZWZhdWx0VmFsdWV9IGlmIHtAY29kZSBzdHJpbmdCb29sZWFufQorICAgICAqICAgaXMge0Bjb2RlIG51bGx9PC9saT4KICAgICAgKiAgIDxsaT57QGNvZGUgZmFsc2V9IGlmCi0gICAgICogICAgICAge0Bjb2RlICgoU3RyaW5nKWVudi5nZXQocHJvcCkpLmVxdWFsc0lnbm9yZUNhc2UoImZhbHNlIil9CisgICAgICogICAgICAge0Bjb2RlIHN0cmluZ0Jvb2xlYW4uZXF1YWxzSWdub3JlQ2FzZSgiZmFsc2UiKX0KICAgICAgKiAgICAgICBpcyB7QGNvZGUgdHJ1ZX08L2xpPgogICAgICAqICAgPGxpPntAY29kZSB0cnVlfSBpZgotICAgICAqICAgICAgIHtAY29kZSAoKFN0cmluZyllbnYuZ2V0KHByb3ApKS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIil9CisgICAgICogICAgICAge0Bjb2RlIHN0cmluZ0Jvb2xlYW4uZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpfQogICAgICAqICAgICAgIGlzIHtAY29kZSB0cnVlfTwvbGk+CiAgICAgICogICA8L3VsPgogICAgICAqCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYge0Bjb2RlIGVudn0gaXMge0Bjb2RlIG51bGx9IG9yCi0gICAgICoge0Bjb2RlIGVudi5nZXQocHJvcCl9IGlzIG5vdCB7QGNvZGUgbnVsbH0gYW5kCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYKICAgICAgKiB7QGNvZGUgKChTdHJpbmcpZW52LmdldChwcm9wKSkuZXF1YWxzSWdub3JlQ2FzZSgiZmFsc2UiKX0gYW5kCiAgICAgICoge0Bjb2RlICgoU3RyaW5nKWVudi5nZXQocHJvcCkpLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKX0gYXJlCiAgICAgICoge0Bjb2RlIGZhbHNlfS4KLSAgICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiBpZiB7QGNvZGUgZW52LmdldChwcm9wKX0gY2Fubm90IGJlIGNhc3QKLSAgICAgKiB0byB7QGNvZGUgU3RyaW5nfS4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29tcHV0ZUJvb2xlYW5Gcm9tU3RyaW5nKAotICAgICAgICAgICAgTWFwPFN0cmluZywgPz4gZW52LCBTdHJpbmcgcHJvcCwKLSAgICAgICAgICAgIGJvb2xlYW4gc3lzdGVtUHJvcGVydHksIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0KLSAgICAgICAgaWYgKGVudiA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZW52IG1hcCBjYW5ub3QgYmUgbnVsbCIpOwotCi0gICAgICAgIFN0cmluZyBzdHJpbmdCb29sZWFuID0gKFN0cmluZykgZW52LmdldChwcm9wKTsKLSAgICAgICAgaWYgKHN0cmluZ0Jvb2xlYW4gPT0gbnVsbCAmJiBzeXN0ZW1Qcm9wZXJ0eSkgewotICAgICAgICAgICAgc3RyaW5nQm9vbGVhbiA9Ci0gICAgICAgICAgICAgICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBHZXRQcm9wZXJ0eUFjdGlvbihwcm9wKSk7Ci0gICAgICAgIH0KLQorICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb21wdXRlQm9vbGVhbkZyb21TdHJpbmcoIFN0cmluZyBzdHJpbmdCb29sZWFuLCBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewogICAgICAgICBpZiAoc3RyaW5nQm9vbGVhbiA9PSBudWxsKQogICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKICAgICAgICAgZWxzZSBpZiAoc3RyaW5nQm9vbGVhbi5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikpCkBAIC03NjMsOCArNzIzLDggQEAKICAgICAgICAgZWxzZSBpZiAoc3RyaW5nQm9vbGVhbi5lcXVhbHNJZ25vcmVDYXNlKCJmYWxzZSIpKQogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICBlbHNlCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHByb3AgKwotICAgICAgICAgICAgICAgICIgbXVzdCBiZSBcInRydWVcIiBvciBcImZhbHNlXCIgaW5zdGVhZCBvZiBcIiIgKworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiUHJvcGVydHkgdmFsdWUgbXVzdCBiZSBcInRydWVcIiBvciBcImZhbHNlXCIgaW5zdGVhZCBvZiBcIiIgKwogICAgICAgICAgICAgICAgIHN0cmluZ0Jvb2xlYW4gKyAiXCIiKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2puZGkvbGRhcC9Db25uZWN0aW9uLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9qbmRpL2xkYXAvQ29ubmVjdGlvbi5qYXZhCmluZGV4IDJiOGI0MTAuLjBkOTZhZjcgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2puZGkvbGRhcC9Db25uZWN0aW9uLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vam5kaS9sZGFwL0Nvbm5lY3Rpb24uamF2YQpAQCAtMTU3LDcgKzE1Nyw4IEBACiAgICAgdm9sYXRpbGUgSU9FeGNlcHRpb24gY2xvc3VyZVJlYXNvbiA9IG51bGw7CiAgICAgdm9sYXRpbGUgYm9vbGVhbiB1c2VhYmxlID0gdHJ1ZTsgIC8vIGlzIENvbm5lY3Rpb24gc3RpbGwgdXNlYWJsZQogCi0gICAgcHJpdmF0ZSBpbnQgcmVhZFRpbWVvdXQ7CisgICAgaW50IHJlYWRUaW1lb3V0OworICAgIGludCBjb25uZWN0VGltZW91dDsKIAogICAgIC8vIHRydWUgbWVhbnMgdjM7IGZhbHNlIG1lYW5zIHYyCiAgICAgLy8gQ2FsbGVkIGluIExkYXBDbGllbnQuYXV0aGVudGljYXRlKCkgKHdoaWNoIGlzIHN5bmNocm9uaXplZCkKQEAgLTE4Nyw2ICsxODgsNyBAQAogICAgICAgICB0aGlzLnBvcnQgPSBwb3J0OwogICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKICAgICAgICAgdGhpcy5yZWFkVGltZW91dCA9IHJlYWRUaW1lb3V0OworICAgICAgICB0aGlzLmNvbm5lY3RUaW1lb3V0ID0gY29ubmVjdFRpbWVvdXQ7CiAKICAgICAgICAgaWYgKHRyYWNlICE9IG51bGwpIHsKICAgICAgICAgICAgIHRyYWNlRmlsZSA9IHRyYWNlOwpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vam5kaS9sZGFwL0xkYXBDbGllbnQuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2puZGkvbGRhcC9MZGFwQ2xpZW50LmphdmEKaW5kZXggNzg4MTUyOS4uZTBkMDQ1NCAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vam5kaS9sZGFwL0xkYXBDbGllbnQuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9qbmRpL2xkYXAvTGRhcENsaWVudC5qYXZhCkBAIC0xNTAsMTQ5ICsxNTAsMTU1IEBACiAgICAgICAgIFN0cmluZyBhdXRoTWVjaGFuaXNtLCBDb250cm9sW10gY3RscywgIEhhc2h0YWJsZTw/LD8+IGVudikKICAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CiAKLSAgICAgICAgYXV0aGVudGljYXRlQ2FsbGVkID0gdHJ1ZTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgZW5zdXJlT3BlbigpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBOYW1pbmdFeGNlcHRpb24gbmUgPSBuZXcgQ29tbXVuaWNhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgICAgICAgbmUuc2V0Um9vdENhdXNlKGUpOwotICAgICAgICAgICAgdGhyb3cgbmU7Ci0gICAgICAgIH0KLQotICAgICAgICBzd2l0Y2ggKHZlcnNpb24pIHsKLSAgICAgICAgY2FzZSBMREFQX1ZFUlNJT04zX1ZFUlNJT04yOgotICAgICAgICBjYXNlIExEQVBfVkVSU0lPTjM6Ci0gICAgICAgICAgICBpc0xkYXB2MyA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBMREFQX1ZFUlNJT04yOgotICAgICAgICAgICAgaXNMZGFwdjMgPSBmYWxzZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgdGhyb3cgbmV3IENvbW11bmljYXRpb25FeGNlcHRpb24oIlByb3RvY29sIHZlcnNpb24gIiArIHZlcnNpb24gKwotICAgICAgICAgICAgICAgICIgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICB9Ci0KKyAgICAgICAgaW50IHJlYWRUaW1lb3V0ID0gY29ubi5yZWFkVGltZW91dDsKKyAgICAgICAgY29ubi5yZWFkVGltZW91dCA9IGNvbm4uY29ubmVjdFRpbWVvdXQ7CiAgICAgICAgIExkYXBSZXN1bHQgcmVzID0gbnVsbDsKIAotICAgICAgICBpZiAoYXV0aE1lY2hhbmlzbS5lcXVhbHNJZ25vcmVDYXNlKCJub25lIikgfHwKLSAgICAgICAgICAgIGF1dGhNZWNoYW5pc20uZXF1YWxzSWdub3JlQ2FzZSgiYW5vbnltb3VzIikpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGF1dGhlbnRpY2F0ZUNhbGxlZCA9IHRydWU7CiAKLSAgICAgICAgICAgIC8vIFBlcmZvcm0gTERBUCBiaW5kIGlmIHdlIGFyZSByZWF1dGhlbnRpY2F0aW5nLCB1c2luZyBMREFQdjIsCi0gICAgICAgICAgICAvLyBzdXBwb3J0aW5nIGZhaWxvdmVyIHRvIExEQVB2Miwgb3IgY29udHJvbHMgaGF2ZSBiZWVuIHN1cHBsaWVkLgotICAgICAgICAgICAgaWYgKCFpbml0aWFsIHx8Ci0gICAgICAgICAgICAgICAgKHZlcnNpb24gPT0gTERBUF9WRVJTSU9OMikgfHwKLSAgICAgICAgICAgICAgICAodmVyc2lvbiA9PSBMREFQX1ZFUlNJT04zX1ZFUlNJT04yKSB8fAotICAgICAgICAgICAgICAgICgoY3RscyAhPSBudWxsKSAmJiAoY3Rscy5sZW5ndGggPiAwKSkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZW5zdXJlT3BlbigpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIE5hbWluZ0V4Y2VwdGlvbiBuZSA9IG5ldyBDb21tdW5pY2F0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgbmUuc2V0Um9vdENhdXNlKGUpOworICAgICAgICAgICAgICAgIHRocm93IG5lOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKHZlcnNpb24pIHsKKyAgICAgICAgICAgIGNhc2UgTERBUF9WRVJTSU9OM19WRVJTSU9OMjoKKyAgICAgICAgICAgIGNhc2UgTERBUF9WRVJTSU9OMzoKKyAgICAgICAgICAgICAgICBpc0xkYXB2MyA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIExEQVBfVkVSU0lPTjI6CisgICAgICAgICAgICAgICAgaXNMZGFwdjMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbW11bmljYXRpb25FeGNlcHRpb24oIlByb3RvY29sIHZlcnNpb24gIiArIHZlcnNpb24gKworICAgICAgICAgICAgICAgICAgICAiIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGF1dGhNZWNoYW5pc20uZXF1YWxzSWdub3JlQ2FzZSgibm9uZSIpIHx8CisgICAgICAgICAgICAgICAgYXV0aE1lY2hhbmlzbS5lcXVhbHNJZ25vcmVDYXNlKCJhbm9ueW1vdXMiKSkgeworCisgICAgICAgICAgICAgICAgLy8gUGVyZm9ybSBMREFQIGJpbmQgaWYgd2UgYXJlIHJlYXV0aGVudGljYXRpbmcsIHVzaW5nIExEQVB2MiwKKyAgICAgICAgICAgICAgICAvLyBzdXBwb3J0aW5nIGZhaWxvdmVyIHRvIExEQVB2Miwgb3IgY29udHJvbHMgaGF2ZSBiZWVuIHN1cHBsaWVkLgorICAgICAgICAgICAgICAgIGlmICghaW5pdGlhbCB8fAorICAgICAgICAgICAgICAgICAgICAodmVyc2lvbiA9PSBMREFQX1ZFUlNJT04yKSB8fAorICAgICAgICAgICAgICAgICAgICAodmVyc2lvbiA9PSBMREFQX1ZFUlNJT04zX1ZFUlNJT04yKSB8fAorICAgICAgICAgICAgICAgICAgICAoKGN0bHMgIT0gbnVsbCkgJiYgKGN0bHMubGVuZ3RoID4gMCkpKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbm9ueW1vdXMgYmluZDsgdXBkYXRlIG5hbWUvcHcgZm9yIExEQVB2MiByZXRyeQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gbGRhcEJpbmQobmFtZT1udWxsLCAoYnl0ZVtdKShwdz1udWxsKSwgY3RscywgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzLnN0YXR1cyA9PSBMZGFwQ2xpZW50LkxEQVBfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm4uc2V0Qm91bmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTmFtaW5nRXhjZXB0aW9uIG5lID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ29tbXVuaWNhdGlvbkV4Y2VwdGlvbigiYW5vbnltb3VzIGJpbmQgZmFpbGVkOiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uLmhvc3QgKyAiOiIgKyBjb25uLnBvcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgbmUuc2V0Um9vdENhdXNlKGUpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIExEQVAgYmluZCBmb3IgTERBUHYzIGFub255bW91cyBiaW5kCisgICAgICAgICAgICAgICAgICAgIHJlcyA9IG5ldyBMZGFwUmVzdWx0KCk7CisgICAgICAgICAgICAgICAgICAgIHJlcy5zdGF0dXMgPSBMZGFwQ2xpZW50LkxEQVBfU1VDQ0VTUzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGF1dGhNZWNoYW5pc20uZXF1YWxzSWdub3JlQ2FzZSgic2ltcGxlIikpIHsKKyAgICAgICAgICAgICAgICAvLyBzaW1wbGUgYXV0aGVudGljYXRpb24KKyAgICAgICAgICAgICAgICBieXRlW10gZW5jb2RlZFB3ID0gbnVsbDsKICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAvLyBhbm9ueW1vdXMgYmluZDsgdXBkYXRlIG5hbWUvcHcgZm9yIExEQVB2MiByZXRyeQotICAgICAgICAgICAgICAgICAgICByZXMgPSBsZGFwQmluZChuYW1lPW51bGwsIChieXRlW10pKHB3PW51bGwpLCBjdGxzLCBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBlbmNvZGVkUHcgPSBlbmNvZGVQYXNzd29yZChwdywgaXNMZGFwdjMpOworICAgICAgICAgICAgICAgICAgICByZXMgPSBsZGFwQmluZChuYW1lLCBlbmNvZGVkUHcsIGN0bHMsIG51bGwsIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcy5zdGF0dXMgPT0gTGRhcENsaWVudC5MREFQX1NVQ0NFU1MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm4uc2V0Qm91bmQoKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAgTmFtaW5nRXhjZXB0aW9uIG5lID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDb21tdW5pY2F0aW9uRXhjZXB0aW9uKCJhbm9ueW1vdXMgYmluZCBmYWlsZWQ6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENvbW11bmljYXRpb25FeGNlcHRpb24oInNpbXBsZSBiaW5kIGZhaWxlZDogIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubi5ob3N0ICsgIjoiICsgY29ubi5wb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgbmUuc2V0Um9vdENhdXNlKGUpOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZTsKKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICAvLyBJZiBwdyB3YXMgY29waWVkIHRvIGEgbmV3IGFycmF5LCBjbGVhciB0aGF0IGFycmF5IGFzCisgICAgICAgICAgICAgICAgICAgIC8vIGEgc2VjdXJpdHkgcHJlY2F1dGlvbi4KKyAgICAgICAgICAgICAgICAgICAgaWYgKGVuY29kZWRQdyAhPSBwdyAmJiBlbmNvZGVkUHcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbmNvZGVkUHcubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVkUHdbaV0gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChpc0xkYXB2MykgeworICAgICAgICAgICAgICAgIC8vIFNBU0wgYXV0aGVudGljYXRpb24KKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByZXMgPSBMZGFwU2FzbC5zYXNsQmluZCh0aGlzLCBjb25uLCBjb25uLmhvc3QsIG5hbWUsIHB3LAorICAgICAgICAgICAgICAgICAgICAgICAgYXV0aE1lY2hhbmlzbSwgZW52LCBjdGxzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlcy5zdGF0dXMgPT0gTGRhcENsaWVudC5MREFQX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbm4uc2V0Qm91bmQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTmFtaW5nRXhjZXB0aW9uIG5lID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDb21tdW5pY2F0aW9uRXhjZXB0aW9uKCJTQVNMIGJpbmQgZmFpbGVkOiAiICsKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm4uaG9zdCArICI6IiArIGNvbm4ucG9ydCk7CiAgICAgICAgICAgICAgICAgICAgIG5lLnNldFJvb3RDYXVzZShlKTsKICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBTa2lwIExEQVAgYmluZCBmb3IgTERBUHYzIGFub255bW91cyBiaW5kCi0gICAgICAgICAgICAgICAgcmVzID0gbmV3IExkYXBSZXN1bHQoKTsKLSAgICAgICAgICAgICAgICByZXMuc3RhdHVzID0gTGRhcENsaWVudC5MREFQX1NVQ0NFU1M7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF1dGhlbnRpY2F0aW9uTm90U3VwcG9ydGVkRXhjZXB0aW9uKGF1dGhNZWNoYW5pc20pOwogICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGF1dGhNZWNoYW5pc20uZXF1YWxzSWdub3JlQ2FzZSgic2ltcGxlIikpIHsKLSAgICAgICAgICAgIC8vIHNpbXBsZSBhdXRoZW50aWNhdGlvbgotICAgICAgICAgICAgYnl0ZVtdIGVuY29kZWRQdyA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGVuY29kZWRQdyA9IGVuY29kZVBhc3N3b3JkKHB3LCBpc0xkYXB2Myk7Ci0gICAgICAgICAgICAgICAgcmVzID0gbGRhcEJpbmQobmFtZSwgZW5jb2RlZFB3LCBjdGxzLCBudWxsLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlcy5zdGF0dXMgPT0gTGRhcENsaWVudC5MREFQX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgICAgICAgICAgY29ubi5zZXRCb3VuZCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBOYW1pbmdFeGNlcHRpb24gbmUgPQotICAgICAgICAgICAgICAgICAgICBuZXcgQ29tbXVuaWNhdGlvbkV4Y2VwdGlvbigic2ltcGxlIGJpbmQgZmFpbGVkOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbm4uaG9zdCArICI6IiArIGNvbm4ucG9ydCk7Ci0gICAgICAgICAgICAgICAgbmUuc2V0Um9vdENhdXNlKGUpOwotICAgICAgICAgICAgICAgIHRocm93IG5lOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAvLyBJZiBwdyB3YXMgY29waWVkIHRvIGEgbmV3IGFycmF5LCBjbGVhciB0aGF0IGFycmF5IGFzCi0gICAgICAgICAgICAgICAgLy8gYSBzZWN1cml0eSBwcmVjYXV0aW9uLgotICAgICAgICAgICAgICAgIGlmIChlbmNvZGVkUHcgIT0gcHcgJiYgZW5jb2RlZFB3ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbmNvZGVkUHcubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZWRQd1tpXSA9IDA7CisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyByZS10cnkgbG9naW4gdXNpbmcgdjIgaWYgZmFpbGluZyBvdmVyCisgICAgICAgICAgICAvLworICAgICAgICAgICAgaWYgKGluaXRpYWwgJiYKKyAgICAgICAgICAgICAgICAocmVzLnN0YXR1cyA9PSBMZGFwQ2xpZW50LkxEQVBfUFJPVE9DT0xfRVJST1IpICYmCisgICAgICAgICAgICAgICAgKHZlcnNpb24gPT0gTGRhcENsaWVudC5MREFQX1ZFUlNJT04zX1ZFUlNJT04yKSAmJgorICAgICAgICAgICAgICAgIChhdXRoTWVjaGFuaXNtLmVxdWFsc0lnbm9yZUNhc2UoIm5vbmUiKSB8fAorICAgICAgICAgICAgICAgICAgICBhdXRoTWVjaGFuaXNtLmVxdWFsc0lnbm9yZUNhc2UoImFub255bW91cyIpIHx8CisgICAgICAgICAgICAgICAgICAgIGF1dGhNZWNoYW5pc20uZXF1YWxzSWdub3JlQ2FzZSgic2ltcGxlIikpKSB7CisKKyAgICAgICAgICAgICAgICBieXRlW10gZW5jb2RlZFB3ID0gbnVsbDsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpc0xkYXB2MyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBlbmNvZGVkUHcgPSBlbmNvZGVQYXNzd29yZChwdywgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICByZXMgPSBsZGFwQmluZChuYW1lLCBlbmNvZGVkUHcsIGN0bHMsIG51bGwsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlcy5zdGF0dXMgPT0gTGRhcENsaWVudC5MREFQX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbm4uc2V0Qm91bmQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTmFtaW5nRXhjZXB0aW9uIG5lID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDb21tdW5pY2F0aW9uRXhjZXB0aW9uKGF1dGhNZWNoYW5pc20gKyAiOiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm4uaG9zdCArICAgICAiOiIgKyBjb25uLnBvcnQpOworICAgICAgICAgICAgICAgICAgICBuZS5zZXRSb290Q2F1c2UoZSk7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5lOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIC8vIElmIHB3IHdhcyBjb3BpZWQgdG8gYSBuZXcgYXJyYXksIGNsZWFyIHRoYXQgYXJyYXkgYXMKKyAgICAgICAgICAgICAgICAgICAgLy8gYSBzZWN1cml0eSBwcmVjYXV0aW9uLgorICAgICAgICAgICAgICAgICAgICBpZiAoZW5jb2RlZFB3ICE9IHB3ICYmIGVuY29kZWRQdyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVuY29kZWRQdy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZWRQd1tpXSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoaXNMZGFwdjMpIHsKLSAgICAgICAgICAgIC8vIFNBU0wgYXV0aGVudGljYXRpb24KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmVzID0gTGRhcFNhc2wuc2FzbEJpbmQodGhpcywgY29ubiwgY29ubi5ob3N0LCBuYW1lLCBwdywKLSAgICAgICAgICAgICAgICAgICAgYXV0aE1lY2hhbmlzbSwgZW52LCBjdGxzKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzLnN0YXR1cyA9PSBMZGFwQ2xpZW50LkxEQVBfU1VDQ0VTUykgewotICAgICAgICAgICAgICAgICAgICBjb25uLnNldEJvdW5kKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIE5hbWluZ0V4Y2VwdGlvbiBuZSA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBDb21tdW5pY2F0aW9uRXhjZXB0aW9uKCJTQVNMIGJpbmQgZmFpbGVkOiAiICsKLSAgICAgICAgICAgICAgICAgICAgY29ubi5ob3N0ICsgIjoiICsgY29ubi5wb3J0KTsKLSAgICAgICAgICAgICAgICBuZS5zZXRSb290Q2F1c2UoZSk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmU7CisKKyAgICAgICAgICAgIC8vIHByaW5jaXBhbCBuYW1lIG5vdCBmb3VuZAorICAgICAgICAgICAgLy8gKG1hcCBOYW1lTm90Rm91bmRFeGNlcHRpb24gdG8gQXV0aGVudGljYXRpb25FeGNlcHRpb24pCisgICAgICAgICAgICAvLyAlJSUgVGhpcyBpcyBhIHdvcmthcm91bmQgZm9yIE5ldHNjYXBlIHNlcnZlcnMgcmV0dXJuaW5nCisgICAgICAgICAgICAvLyAlJSUgbm8gc3VjaCBvYmplY3Qgd2hlbiB0aGUgcHJpbmNpcGFsIG5hbWUgaXMgbm90IGZvdW5kCisgICAgICAgICAgICAvLyAlJSUgTm90ZSB0aGF0IHdoZW4gdGhpcyB3b3JrYXJvdW5kIGlzIGFwcGxpZWQsIGl0IGRvZXMgbm90IGFsbG93CisgICAgICAgICAgICAvLyAlJSUgcmVzcG9uc2UgY29udHJvbHMgdG8gYmUgcmVjb3JkZWQgYnkgdGhlIGNhbGxpbmcgY29udGV4dAorICAgICAgICAgICAgaWYgKHJlcy5zdGF0dXMgPT0gTGRhcENsaWVudC5MREFQX05PX1NVQ0hfT0JKRUNUKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEF1dGhlbnRpY2F0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBnZXRFcnJvck1lc3NhZ2UocmVzLnN0YXR1cywgcmVzLmVycm9yTWVzc2FnZSkpOwogICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IEF1dGhlbnRpY2F0aW9uTm90U3VwcG9ydGVkRXhjZXB0aW9uKGF1dGhNZWNoYW5pc20pOworICAgICAgICAgICAgY29ubi5zZXRWMyhpc0xkYXB2Myk7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgY29ubi5yZWFkVGltZW91dCA9IHJlYWRUaW1lb3V0OwogICAgICAgICB9Ci0KLSAgICAgICAgLy8KLSAgICAgICAgLy8gcmUtdHJ5IGxvZ2luIHVzaW5nIHYyIGlmIGZhaWxpbmcgb3ZlcgotICAgICAgICAvLwotICAgICAgICBpZiAoaW5pdGlhbCAmJgotICAgICAgICAgICAgKHJlcy5zdGF0dXMgPT0gTGRhcENsaWVudC5MREFQX1BST1RPQ09MX0VSUk9SKSAmJgotICAgICAgICAgICAgKHZlcnNpb24gPT0gTGRhcENsaWVudC5MREFQX1ZFUlNJT04zX1ZFUlNJT04yKSAmJgotICAgICAgICAgICAgKGF1dGhNZWNoYW5pc20uZXF1YWxzSWdub3JlQ2FzZSgibm9uZSIpIHx8Ci0gICAgICAgICAgICAgICAgYXV0aE1lY2hhbmlzbS5lcXVhbHNJZ25vcmVDYXNlKCJhbm9ueW1vdXMiKSB8fAotICAgICAgICAgICAgICAgIGF1dGhNZWNoYW5pc20uZXF1YWxzSWdub3JlQ2FzZSgic2ltcGxlIikpKSB7Ci0KLSAgICAgICAgICAgIGJ5dGVbXSBlbmNvZGVkUHcgPSBudWxsOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpc0xkYXB2MyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGVuY29kZWRQdyA9IGVuY29kZVBhc3N3b3JkKHB3LCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgcmVzID0gbGRhcEJpbmQobmFtZSwgZW5jb2RlZFB3LCBjdGxzLCBudWxsLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlcy5zdGF0dXMgPT0gTGRhcENsaWVudC5MREFQX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgICAgICAgICAgY29ubi5zZXRCb3VuZCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBOYW1pbmdFeGNlcHRpb24gbmUgPQotICAgICAgICAgICAgICAgICAgICBuZXcgQ29tbXVuaWNhdGlvbkV4Y2VwdGlvbihhdXRoTWVjaGFuaXNtICsgIjoiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbm4uaG9zdCArICAgICAiOiIgKyBjb25uLnBvcnQpOwotICAgICAgICAgICAgICAgIG5lLnNldFJvb3RDYXVzZShlKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgLy8gSWYgcHcgd2FzIGNvcGllZCB0byBhIG5ldyBhcnJheSwgY2xlYXIgdGhhdCBhcnJheSBhcwotICAgICAgICAgICAgICAgIC8vIGEgc2VjdXJpdHkgcHJlY2F1dGlvbi4KLSAgICAgICAgICAgICAgICBpZiAoZW5jb2RlZFB3ICE9IHB3ICYmIGVuY29kZWRQdyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW5jb2RlZFB3Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVkUHdbaV0gPSAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gcHJpbmNpcGFsIG5hbWUgbm90IGZvdW5kCi0gICAgICAgIC8vIChtYXAgTmFtZU5vdEZvdW5kRXhjZXB0aW9uIHRvIEF1dGhlbnRpY2F0aW9uRXhjZXB0aW9uKQotICAgICAgICAvLyAlJSUgVGhpcyBpcyBhIHdvcmthcm91bmQgZm9yIE5ldHNjYXBlIHNlcnZlcnMgcmV0dXJuaW5nCi0gICAgICAgIC8vICUlJSBubyBzdWNoIG9iamVjdCB3aGVuIHRoZSBwcmluY2lwYWwgbmFtZSBpcyBub3QgZm91bmQKLSAgICAgICAgLy8gJSUlIE5vdGUgdGhhdCB3aGVuIHRoaXMgd29ya2Fyb3VuZCBpcyBhcHBsaWVkLCBpdCBkb2VzIG5vdCBhbGxvdwotICAgICAgICAvLyAlJSUgcmVzcG9uc2UgY29udHJvbHMgdG8gYmUgcmVjb3JkZWQgYnkgdGhlIGNhbGxpbmcgY29udGV4dAotICAgICAgICBpZiAocmVzLnN0YXR1cyA9PSBMZGFwQ2xpZW50LkxEQVBfTk9fU1VDSF9PQkpFQ1QpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBnZXRFcnJvck1lc3NhZ2UocmVzLnN0YXR1cywgcmVzLmVycm9yTWVzc2FnZSkpOwotICAgICAgICB9Ci0gICAgICAgIGNvbm4uc2V0VjMoaXNMZGFwdjMpOwotICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vcm93c2V0L0NhY2hlZFJvd1NldEltcGwuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Jvd3NldC9DYWNoZWRSb3dTZXRJbXBsLmphdmEKaW5kZXggZGY2Y2JkMC4uYWYwYzk4OCAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vcm93c2V0L0NhY2hlZFJvd1NldEltcGwuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9yb3dzZXQvQ2FjaGVkUm93U2V0SW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMTc0NiwxMiArMTc0Niw3IEBACiAKICAgICAgICAgLy8gY29udmVydCB0byBhIERvdWJsZSBhbmQgY29tcGFyZSB0byB6ZXJvCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBEb3VibGUgZCA9IG5ldyBEb3VibGUodmFsdWUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBpZiAoZC5jb21wYXJlVG8obmV3IERvdWJsZSgoZG91YmxlKTApKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBEb3VibGUuY29tcGFyZShEb3VibGUucGFyc2VEb3VibGUodmFsdWUudG9TdHJpbmcoKSksIDApICE9IDA7CiAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IFNRTEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdChyZXNCdW5kbGUuaGFuZGxlR2V0T2JqZWN0KCJjYWNoZWRyb3dzZXRpbXBsLmJvb2xmYWlsIikudG9TdHJpbmcoKSwKICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7dmFsdWUudG9TdHJpbmcoKS50cmltKCksIGNvbHVtbkluZGV4fSkpOwpAQCAtMjAzOSw2ICsyMDM0LDcgQEAKICAgICAgKiAgICAgICAgICAgIHRoZSBjdXJzb3IgaXMgbm90IG9uIGEgdmFsaWQgcm93LCBvciB0aGlzIG1ldGhvZCBmYWlscwogICAgICAqIEBkZXByZWNhdGVkCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgQmlnRGVjaW1hbCBnZXRCaWdEZWNpbWFsKGludCBjb2x1bW5JbmRleCwgaW50IHNjYWxlKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgT2JqZWN0IHZhbHVlOwogICAgICAgICBCaWdEZWNpbWFsIGJEZWNpbWFsLCByZXRWYWw7CkBAIC0yMzc0LDYgKzIzNzAsNyBAQAogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwogICAgICAqIEBkZXByZWNhdGVkCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgamF2YS5pby5JbnB1dFN0cmVhbSBnZXRVbmljb2RlU3RyZWFtKGludCBjb2x1bW5JbmRleCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIGFsd2F5cyBmcmVlIGFuIG9sZCBzdHJlYW0KICAgICAgICAgdW5pY29kZVN0cmVhbSA9IG51bGw7CkBAIC0yNjQzLDYgKzI2NDAsNyBAQAogICAgICAqIEBkZXByZWNhdGVkIFVzZSB0aGUgPGNvZGU+Z2V0QmlnRGVjaW1hbChTdHJpbmcgY29sdW1uTmFtZSk8L2NvZGU+CiAgICAgICogICAgICAgICAgICAgbWV0aG9kIGluc3RlYWQKICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBCaWdEZWNpbWFsIGdldEJpZ0RlY2ltYWwoU3RyaW5nIGNvbHVtbk5hbWUsIGludCBzY2FsZSkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBnZXRCaWdEZWNpbWFsKGdldENvbElkeEJ5TmFtZShjb2x1bW5OYW1lKSwgc2NhbGUpOwogICAgIH0KQEAgLTI3NzQsNiArMjc3Miw3IEBACiAgICAgICogICAgICAgICAgICB0aGlzIHJvd3NldCdzIHJvd3Mgb3IgaXRzIGluc2VydCByb3cKICAgICAgKiBAZGVwcmVjYXRlZCB1c2UgdGhlIG1ldGhvZCA8Y29kZT5nZXRDaGFyYWN0ZXJTdHJlYW08L2NvZGU+IGluc3RlYWQKICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBqYXZhLmlvLklucHV0U3RyZWFtIGdldFVuaWNvZGVTdHJlYW0oU3RyaW5nIGNvbHVtbk5hbWUpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICByZXR1cm4gZ2V0VW5pY29kZVN0cmVhbShnZXRDb2xJZHhCeU5hbWUoY29sdW1uTmFtZSkpOwogICAgIH0KQEAgLTQ0MjgsNyArNDQyNyw3IEBACiAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgY3Vyc29yIGlzIG9uIGEgdmFsaWQgcm93CiAgICAgICAgIGNoZWNrQ3Vyc29yKCk7CiAKLSAgICAgICAgT2JqZWN0IG9iaiA9IGNvbnZlcnROdW1lcmljKG5ldyBGbG9hdCh4KSwKKyAgICAgICAgT2JqZWN0IG9iaiA9IGNvbnZlcnROdW1lcmljKEZsb2F0LnZhbHVlT2YoeCksCiAgICAgICAgIGphdmEuc3FsLlR5cGVzLlJFQUwsCiAgICAgICAgIFJvd1NldE1ELmdldENvbHVtblR5cGUoY29sdW1uSW5kZXgpKTsKIApAQCAtNDQ2Myw3ICs0NDYyLDcgQEAKICAgICAgICAgY2hlY2tJbmRleChjb2x1bW5JbmRleCk7CiAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgY3Vyc29yIGlzIG9uIGEgdmFsaWQgcm93CiAgICAgICAgIGNoZWNrQ3Vyc29yKCk7Ci0gICAgICAgIE9iamVjdCBvYmogPSBjb252ZXJ0TnVtZXJpYyhuZXcgRG91YmxlKHgpLAorICAgICAgICBPYmplY3Qgb2JqID0gY29udmVydE51bWVyaWMoRG91YmxlLnZhbHVlT2YoeCksCiAgICAgICAgIGphdmEuc3FsLlR5cGVzLkRPVUJMRSwKICAgICAgICAgUm93U2V0TUQuZ2V0Q29sdW1uVHlwZShjb2x1bW5JbmRleCkpOwogCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9yb3dzZXQvRmlsdGVyZWRSb3dTZXRJbXBsLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9yb3dzZXQvRmlsdGVyZWRSb3dTZXRJbXBsLmphdmEKaW5kZXggMjBjMjc0My4uZWVkYTRiNyAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vcm93c2V0L0ZpbHRlcmVkUm93U2V0SW1wbC5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Jvd3NldC9GaWx0ZXJlZFJvd1NldEltcGwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTAsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTgzOSw3ICs4MzksNyBAQAogCiAgICAgICBpZihvbkluc2VydFJvdykgewogICAgICAgICAgaWYocCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBib29sID0gcC5ldmFsdWF0ZShuZXcgRmxvYXQoeCkgLCBjb2x1bW5JbmRleCk7CisgICAgICAgICAgICBib29sID0gcC5ldmFsdWF0ZShGbG9hdC52YWx1ZU9mKHgpLCBjb2x1bW5JbmRleCk7CiAKICAgICAgICAgICAgIGlmKCFib29sKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU1FMRXhjZXB0aW9uKHJlc0J1bmRsZS5oYW5kbGVHZXRPYmplY3QoImZpbHRlcmVkcm93c2V0aW1wbC5ub3RhbGxvd2VkIikudG9TdHJpbmcoKSk7CkBAIC05MDYsNyArOTA2LDcgQEAKIAogICAgICAgaWYob25JbnNlcnRSb3cpIHsKICAgICAgICAgIGlmKHAgIT0gbnVsbCkgewotICAgICAgICAgICAgYm9vbCA9IHAuZXZhbHVhdGUobmV3IERvdWJsZSh4KSAsIGNvbHVtbkluZGV4KTsKKyAgICAgICAgICAgIGJvb2wgPSBwLmV2YWx1YXRlKERvdWJsZS52YWx1ZU9mKHgpICwgY29sdW1uSW5kZXgpOwogCiAgICAgICAgICAgICBpZighYm9vbCkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNRTEV4Y2VwdGlvbihyZXNCdW5kbGUuaGFuZGxlR2V0T2JqZWN0KCJmaWx0ZXJlZHJvd3NldGltcGwubm90YWxsb3dlZCIpLnRvU3RyaW5nKCkpOwpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vcm93c2V0L0pkYmNSb3dTZXRJbXBsLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9yb3dzZXQvSmRiY1Jvd1NldEltcGwuamF2YQppbmRleCAzNjYxMmFkLi44MzAyYzI5IDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9yb3dzZXQvSmRiY1Jvd1NldEltcGwuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9yb3dzZXQvSmRiY1Jvd1NldEltcGwuamF2YQpAQCAtMTAxNiw2ICsxMDE2LDcgQEAKICAgICAgKiAgICAgICAgICAgIHByZXBhcmVkIHN0YXRlbWVudCwgYW5kIHJlc3VsdCBzZXQKICAgICAgKiBAZGVwcmVjYXRlZAogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIEJpZ0RlY2ltYWwgZ2V0QmlnRGVjaW1hbChpbnQgY29sdW1uSW5kZXgsIGludCBzY2FsZSkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CiAgICAgICAgIGNoZWNrU3RhdGUoKTsKIApAQCAtMTE1NCw2ICsxMTU1LDcgQEAKICAgICAgKiBAZGVwcmVjYXRlZCB1c2UgPGNvZGU+Z2V0Q2hhcmFjdGVyU3RyZWFtPC9jb2RlPiBpbiBwbGFjZSBvZgogICAgICAqICAgICAgICAgICAgICA8Y29kZT5nZXRVbmljb2RlU3RyZWFtPC9jb2RlPgogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIGphdmEuaW8uSW5wdXRTdHJlYW0gZ2V0VW5pY29kZVN0cmVhbShpbnQgY29sdW1uSW5kZXgpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICBjaGVja1N0YXRlKCk7CiAKQEAgLTEzMzYsNiArMTMzOCw3IEBACiAgICAgICogICAgICAgICAgICBwcmVwYXJlZCBzdGF0ZW1lbnQsIGFuZCByZXN1bHQgc2V0CiAgICAgICogQGRlcHJlY2F0ZWQKICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBCaWdEZWNpbWFsIGdldEJpZ0RlY2ltYWwoU3RyaW5nIGNvbHVtbk5hbWUsIGludCBzY2FsZSkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBnZXRCaWdEZWNpbWFsKGZpbmRDb2x1bW4oY29sdW1uTmFtZSksIHNjYWxlKTsKICAgICB9CkBAIC0xNDYxLDYgKzE0NjQsNyBAQAogICAgICAqICAgICAgICAgICAgcHJlcGFyZWQgc3RhdGVtZW50LCBhbmQgcmVzdWx0IHNldAogICAgICAqIEBkZXByZWNhdGVkCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgamF2YS5pby5JbnB1dFN0cmVhbSBnZXRVbmljb2RlU3RyZWFtKFN0cmluZyBjb2x1bW5OYW1lKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIGdldFVuaWNvZGVTdHJlYW0oZmluZENvbHVtbihjb2x1bW5OYW1lKSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vcm93c2V0L0pvaW5Sb3dTZXRJbXBsLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9yb3dzZXQvSm9pblJvd1NldEltcGwuamF2YQppbmRleCAwZjcxMmY5Li40NTkzNzk0IDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9yb3dzZXQvSm9pblJvd1NldEltcGwuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9yb3dzZXQvSm9pblJvd1NldEltcGwuamF2YQpAQCAtMTE1Myw2ICsxMTUzLDcgQEAKICAgICAgKiAgICAgICAgICAgIHRoZSBjdXJzb3IgaXMgbm90IG9uIGEgdmFsaWQgcm93LCBvciB0aGlzIG1ldGhvZCBmYWlscwogICAgICAqIEBkZXByZWNhdGVkCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgQmlnRGVjaW1hbCBnZXRCaWdEZWNpbWFsKGludCBjb2x1bW5JbmRleCwgaW50IHNjYWxlKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIGNyc0ludGVybmFsLmdldEJpZ0RlY2ltYWwoY29sdW1uSW5kZXgpOwogICAgIH0KQEAgLTEyNjQsNiArMTI2NSw3IEBACiAgICAgICogQHRocm93cyBTUUxFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCiAgICAgICogQGRlcHJlY2F0ZWQKICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBqYXZhLmlvLklucHV0U3RyZWFtIGdldFVuaWNvZGVTdHJlYW0oaW50IGNvbHVtbkluZGV4KSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIGNyc0ludGVybmFsLmdldFVuaWNvZGVTdHJlYW0oY29sdW1uSW5kZXgpOwogICAgIH0KQEAgLTE0MzYsNiArMTQzOCw3IEBACiAgICAgICogQGRlcHJlY2F0ZWQgdXNlIHRoZSBtZXRob2QgPGNvZGU+Z2V0QmlnRGVjaW1hbChTdHJpbmcgY29sdW1uTmFtZSk8L2NvZGU+CiAgICAgICogICAgICAgICAgICAgaW5zdGVhZAogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIEJpZ0RlY2ltYWwgZ2V0QmlnRGVjaW1hbChTdHJpbmcgY29sdW1uTmFtZSwgaW50IHNjYWxlKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIGNyc0ludGVybmFsLmdldEJpZ0RlY2ltYWwoY29sdW1uTmFtZSk7CiAgICAgfQpAQCAtMTU1Miw2ICsxNTU1LDcgQEAKICAgICAgKiAgICAgICAgICAgIHRoaXMgcm93c2V0J3Mgcm93cyBvciBpdHMgaW5zZXJ0IHJvdwogICAgICAqIEBkZXByZWNhdGVkIHVzZSB0aGUgbWV0aG9kIDxjb2RlPmdldENoYXJhY3RlclN0cmVhbTwvY29kZT4gaW5zdGVhZAogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIGphdmEuaW8uSW5wdXRTdHJlYW0gZ2V0VW5pY29kZVN0cmVhbShTdHJpbmcgY29sdW1uTmFtZSkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBjcnNJbnRlcm5hbC5nZXRVbmljb2RlU3RyZWFtKGNvbHVtbk5hbWUpOwogICAgIH0KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Jvd3NldC9pbnRlcm5hbC9TeW5jUmVzb2x2ZXJJbXBsLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9yb3dzZXQvaW50ZXJuYWwvU3luY1Jlc29sdmVySW1wbC5qYXZhCmluZGV4IDkxMWIxZDEuLjUxNjU0YTggMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Jvd3NldC9pbnRlcm5hbC9TeW5jUmVzb2x2ZXJJbXBsLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vcm93c2V0L2ludGVybmFsL1N5bmNSZXNvbHZlckltcGwuamF2YQpAQCAtMTI4OCw2ICsxMjg4LDcgQEAKICAgICAgKiAgICAgICAgICAgIHRoZSBjdXJzb3IgaXMgbm90IG9uIGEgdmFsaWQgcm93LCBvciB0aGlzIG1ldGhvZCBmYWlscwogICAgICAqIEBkZXByZWNhdGVkCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgQmlnRGVjaW1hbCBnZXRCaWdEZWNpbWFsKGludCBjb2x1bW5JbmRleCwgaW50IHNjYWxlKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKICAgICB9CkBAIC0xNDI0LDYgKzE0MjUsNyBAQAogICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwogICAgICAqIEBkZXByZWNhdGVkCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgamF2YS5pby5JbnB1dFN0cmVhbSBnZXRVbmljb2RlU3RyZWFtKGludCBjb2x1bW5JbmRleCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CiAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CiAgICAgfQpAQCAtMTY1Myw2ICsxNjU1LDcgQEAKICAgICAgKiBAZGVwcmVjYXRlZCBVc2UgdGhlIDxjb2RlPmdldEJpZ0RlY2ltYWwoU3RyaW5nIGNvbHVtbk5hbWUpPC9jb2RlPgogICAgICAqICAgICAgICAgICAgIG1ldGhvZCBpbnN0ZWFkCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgQmlnRGVjaW1hbCBnZXRCaWdEZWNpbWFsKFN0cmluZyBjb2x1bW5OYW1lLCBpbnQgc2NhbGUpIHRocm93cyBTUUxFeGNlcHRpb24gewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKICAgICB9CkBAIC0xNzg0LDYgKzE3ODcsNyBAQAogICAgICAqICAgICAgICAgICAgdGhpcyByb3dzZXQncyByb3dzIG9yIGl0cyBpbnNlcnQgcm93CiAgICAgICogQGRlcHJlY2F0ZWQgdXNlIHRoZSBtZXRob2QgPGNvZGU+Z2V0Q2hhcmFjdGVyU3RyZWFtPC9jb2RlPiBpbnN0ZWFkCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgamF2YS5pby5JbnB1dFN0cmVhbSBnZXRVbmljb2RlU3RyZWFtKFN0cmluZyBjb2x1bW5OYW1lKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vc2VjdXJpdHkvYXV0aC9tb2R1bGUvS3JiNUxvZ2luTW9kdWxlLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9zZWN1cml0eS9hdXRoL21vZHVsZS9LcmI1TG9naW5Nb2R1bGUuamF2YQppbmRleCAyZjJhNDk0Li5hYWFiNWE5IDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9zZWN1cml0eS9hdXRoL21vZHVsZS9LcmI1TG9naW5Nb2R1bGUuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9zZWN1cml0eS9hdXRoL21vZHVsZS9LcmI1TG9naW5Nb2R1bGUuamF2YQpAQCAtODAyLDcgKzgwMiw3IEBACiAKICAgICAgICAgaWYgKGRvTm90UHJvbXB0KSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgTG9naW5FeGNlcHRpb24KLSAgICAgICAgICAgICAgICAoIlVuYWJsZSB0byBvYnRhaW4gUHJpbmNwYWwgTmFtZSBmb3IgYXV0aGVudGljYXRpb24gIik7CisgICAgICAgICAgICAgICAgKCJVbmFibGUgdG8gb2J0YWluIFByaW5jaXBhbCBOYW1lIGZvciBhdXRoZW50aWNhdGlvbiAiKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIChjYWxsYmFja0hhbmRsZXIgPT0gbnVsbCkKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTG9naW5FeGNlcHRpb24oIk5vIENhbGxiYWNrSGFuZGxlciAiCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9iZWFucy9YTUxEZWNvZGVyLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9iZWFucy9YTUxEZWNvZGVyLmphdmEKaW5kZXggYWNjZWYxMS4uMmZiMmZkMCAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvYmVhbnMvWE1MRGVjb2Rlci5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL2JlYW5zL1hNTERlY29kZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTAsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI5LDYgKzI5LDkgQEAKIGltcG9ydCBqYXZhLmlvLkNsb3NlYWJsZTsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sQ29udGV4dDsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOwogCiBpbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7CiBpbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcjsKQEAgLTYxLDYgKzY0LDcgQEAKICAqIEBhdXRob3IgUGhpbGlwIE1pbG5lCiAgKi8KIHB1YmxpYyBjbGFzcyBYTUxEZWNvZGVyIGltcGxlbWVudHMgQXV0b0Nsb3NlYWJsZSB7CisgICAgcHJpdmF0ZSBmaW5hbCBBY2Nlc3NDb250cm9sQ29udGV4dCBhY2MgPSBBY2Nlc3NDb250cm9sbGVyLmdldENvbnRleHQoKTsKICAgICBwcml2YXRlIGZpbmFsIERvY3VtZW50SGFuZGxlciBoYW5kbGVyID0gbmV3IERvY3VtZW50SGFuZGxlcigpOwogICAgIHByaXZhdGUgZmluYWwgSW5wdXRTb3VyY2UgaW5wdXQ7CiAgICAgcHJpdmF0ZSBPYmplY3Qgb3duZXI7CkBAIC0xODksNyArMTkzLDE1IEBACiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHRoaXMuYXJyYXkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5oYW5kbGVyLnBhcnNlKHRoaXMuaW5wdXQpOworICAgICAgICAgICAgaWYgKCh0aGlzLmFjYyA9PSBudWxsKSAmJiAobnVsbCAhPSBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKCJBY2Nlc3NDb250cm9sQ29udGV4dCBpcyBub3Qgc2V0Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbjxWb2lkPigpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgVm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIFhNTERlY29kZXIudGhpcy5oYW5kbGVyLnBhcnNlKFhNTERlY29kZXIudGhpcy5pbnB1dCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sIHRoaXMuYWNjKTsKICAgICAgICAgICAgIHRoaXMuYXJyYXkgPSB0aGlzLmhhbmRsZXIuZ2V0T2JqZWN0cygpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiB0cnVlOwpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvaW8vRmlsZVBlcm1pc3Npb24uamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL2lvL0ZpbGVQZXJtaXNzaW9uLmphdmEKaW5kZXggOTdjYTE5NS4uZTcwZDI5MiAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvaW8vRmlsZVBlcm1pc3Npb24uamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9pby9GaWxlUGVybWlzc2lvbi5qYXZhCkBAIC00MDcsNyArNDA3LDcgQEAKICAgICAgKiBAcmV0dXJuIGEgaGFzaCBjb2RlIHZhbHVlIGZvciB0aGlzIG9iamVjdC4KICAgICAgKi8KICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICByZXR1cm4gdGhpcy5jcGF0aC5oYXNoQ29kZSgpOworICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL2xhbmcvaW52b2tlL01ldGhvZEhhbmRsZUltcGwuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL2xhbmcvaW52b2tlL01ldGhvZEhhbmRsZUltcGwuamF2YQppbmRleCA2MzZiZmViLi4zZjU4ZTYxIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9sYW5nL2ludm9rZS9NZXRob2RIYW5kbGVJbXBsLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvbGFuZy9pbnZva2UvTWV0aG9kSGFuZGxlSW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMTMgKzI1LDE0IEBACiAKIHBhY2thZ2UgamF2YS5sYW5nLmludm9rZTsKIAotaW1wb3J0IHN1bi5pbnZva2UudXRpbC5WZXJpZnlUeXBlOwotCitpbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgc3VuLmludm9rZS5lbXB0eS5FbXB0eTsKIGltcG9ydCBzdW4uaW52b2tlLnV0aWwuVmFsdWVDb252ZXJzaW9uczsKK2ltcG9ydCBzdW4uaW52b2tlLnV0aWwuVmVyaWZ5VHlwZTsKIGltcG9ydCBzdW4uaW52b2tlLnV0aWwuV3JhcHBlcjsKIGltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmludm9rZS5MYW1iZGFGb3JtLio7CiBpbXBvcnQgc3RhdGljIGphdmEubGFuZy5pbnZva2UuTWV0aG9kSGFuZGxlU3RhdGljcy4qOwpAQCAtNzgxLDQgKzc4MiwxNjggQEAKICAgICAgICAgcmV0dXJuIG1oOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIENyZWF0ZSBhbiBhbGlhcyBmb3IgdGhlIG1ldGhvZCBoYW5kbGUgd2hpY2gsIHdoZW4gY2FsbGVkLAorICAgICAqIGFwcGVhcnMgdG8gYmUgY2FsbGVkIGZyb20gdGhlIHNhbWUgY2xhc3MgbG9hZGVyIGFuZCBwcm90ZWN0aW9uIGRvbWFpbgorICAgICAqIGFzIGhvc3RDbGFzcy4KKyAgICAgKiBUaGlzIGlzIGFuIGV4cGVuc2l2ZSBuby1vcCB1bmxlc3MgdGhlIG1ldGhvZCB3aGljaCBpcyBjYWxsZWQKKyAgICAgKiBpcyBzZW5zaXRpdmUgdG8gaXRzIGNhbGxlci4gIEEgc21hbGwgbnVtYmVyIG9mIHN5c3RlbSBtZXRob2RzCisgICAgICogYXJlIGluIHRoaXMgY2F0ZWdvcnksIGluY2x1ZGluZyBDbGFzcy5mb3JOYW1lIGFuZCBNZXRob2QuaW52b2tlLgorICAgICAqLworICAgIHN0YXRpYworICAgIE1ldGhvZEhhbmRsZSBiaW5kQ2FsbGVyKE1ldGhvZEhhbmRsZSBtaCwgQ2xhc3M8Pz4gaG9zdENsYXNzKSB7CisgICAgICAgIHJldHVybiBCaW5kQ2FsbGVyLmJpbmRDYWxsZXIobWgsIGhvc3RDbGFzcyk7CisgICAgfQorCisgICAgLy8gUHV0IHRoZSB3aG9sZSBtZXNzIGludG8gaXRzIG93biBuZXN0ZWQgY2xhc3MuCisgICAgLy8gVGhhdCB3YXkgd2UgY2FuIGxhemlseSBsb2FkIHRoZSBjb2RlIGFuZCBzZXQgdXAgdGhlIGNvbnN0YW50cy4KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBCaW5kQ2FsbGVyIHsKKyAgICAgICAgc3RhdGljCisgICAgICAgIE1ldGhvZEhhbmRsZSBiaW5kQ2FsbGVyKE1ldGhvZEhhbmRsZSBtaCwgQ2xhc3M8Pz4gaG9zdENsYXNzKSB7CisgICAgICAgICAgICAvLyBEbyBub3QgdXNlIHRoaXMgZnVuY3Rpb24gdG8gaW5qZWN0IGNhbGxzIGludG8gc3lzdGVtIGNsYXNzZXMuCisgICAgICAgICAgICBpZiAoaG9zdENsYXNzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBob3N0Q2xhc3MgPSBDX1RyYW1wb2xpbmU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGhvc3RDbGFzcy5pc0FycmF5KCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgaG9zdENsYXNzLmlzUHJpbWl0aXZlKCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgaG9zdENsYXNzLmdldE5hbWUoKS5zdGFydHNXaXRoKCJqYXZhLiIpIHx8CisgICAgICAgICAgICAgICAgICAgICAgIGhvc3RDbGFzcy5nZXROYW1lKCkuc3RhcnRzV2l0aCgic3VuLiIpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoKTsgIC8vIGRvZXMgbm90IGhhcHBlbiwgYW5kIHNob3VsZCBub3QgYW55d2F5CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBGb3Igc2ltcGxpY2l0eSwgY29udmVydCBtaCB0byBhIHZhcmFyZ3MtbGlrZSBtZXRob2QuCisgICAgICAgICAgICBNZXRob2RIYW5kbGUgdmFtaCA9IHByZXBhcmVGb3JJbnZva2VyKG1oKTsKKyAgICAgICAgICAgIC8vIENhY2hlIHRoZSByZXN1bHQgb2YgbWFrZUluamVjdGVkSW52b2tlciBvbmNlIHBlciBhcmd1bWVudCBjbGFzcy4KKyAgICAgICAgICAgIE1ldGhvZEhhbmRsZSBiY2NJbnZva2VyID0gQ1ZfbWFrZUluamVjdGVkSW52b2tlci5nZXQoaG9zdENsYXNzKTsKKyAgICAgICAgICAgIHJldHVybiByZXN0b3JlVG9UeXBlKGJjY0ludm9rZXIuYmluZFRvKHZhbWgpLCBtaC50eXBlKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gVGhpcyBjbGFzcyAoIlRyYW1wb2xpbmUiKSBpcyBrbm93biB0byBiZSBpbnNpZGUgYSBkZWFkLWVuZCBjbGFzcyBsb2FkZXIuCisgICAgICAgIC8vIEluamVjdCBhbGwgZG91YnRmdWwgY2FsbHMgaW50byB0aGlzIGNsYXNzLgorICAgICAgICBwcml2YXRlIHN0YXRpYyBDbGFzczw/PiBDX1RyYW1wb2xpbmU7CisgICAgICAgIHN0YXRpYyB7CisgICAgICAgICAgICBDbGFzczw/PiB0cmFtcCA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGZpbmFsIGludCBGUkFNRV9DT1VOVF9BUkcgPSAxOyAgLy8gWzBdIFJlZmxlY3Rpb24gWzFdIFRyYW1wb2xpbmUKKyAgICAgICAgICAgICAgICBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgZ2NjID0gc3VuLnJlZmxlY3QuUmVmbGVjdGlvbi5jbGFzcy5nZXRNZXRob2QoImdldENhbGxlckNsYXNzIiwgaW50LmNsYXNzKTsKKyAgICAgICAgICAgICAgICB0cmFtcCA9IChDbGFzczw/Pikgc3VuLnJlZmxlY3QubWlzYy5NZXRob2RVdGlsLmludm9rZShnY2MsIG51bGwsIG5ldyBPYmplY3RbXXsgRlJBTUVfQ09VTlRfQVJHIH0pOworICAgICAgICAgICAgICAgIGlmICh0cmFtcC5nZXRDbGFzc0xvYWRlcigpID09IEJpbmRDYWxsZXIuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24odHJhbXAuZ2V0TmFtZSgpKyIgY2xhc3MgbG9hZGVyIik7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZXgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihleCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDX1RyYW1wb2xpbmUgPSB0cmFtcDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIE1ldGhvZEhhbmRsZSBtYWtlSW5qZWN0ZWRJbnZva2VyKENsYXNzPD8+IGhvc3RDbGFzcykgeworICAgICAgICAgICAgQ2xhc3M8Pz4gYmNjID0gVU5TQUZFLmRlZmluZUFub255bW91c0NsYXNzKGhvc3RDbGFzcywgVF9CWVRFUywgbnVsbCk7CisgICAgICAgICAgICBpZiAoaG9zdENsYXNzLmdldENsYXNzTG9hZGVyKCkgIT0gYmNjLmdldENsYXNzTG9hZGVyKCkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoaG9zdENsYXNzLmdldE5hbWUoKSsiIChDTCkiKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKGhvc3RDbGFzcy5nZXRQcm90ZWN0aW9uRG9tYWluKCkgIT0gYmNjLmdldFByb3RlY3Rpb25Eb21haW4oKSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoaG9zdENsYXNzLmdldE5hbWUoKSsiIChQRCkiKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgLy8gU2VsZi1jaGVjayB3YXMgYmxvY2tlZCBieSBzZWN1cml0eSBtYW5hZ2VyLiAgVGhpcyBpcyBPSy4KKyAgICAgICAgICAgICAgICAvLyBJbiBmYWN0IHRoZSB3aG9sZSB0cnkgYm9keSBjb3VsZCBiZSB0dXJuZWQgaW50byBhbiBhc3NlcnRpb24uCisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIE1ldGhvZEhhbmRsZSBpbml0ID0gSU1QTF9MT09LVVAuZmluZFN0YXRpYyhiY2MsICJpbml0IiwgTWV0aG9kVHlwZS5tZXRob2RUeXBlKHZvaWQuY2xhc3MpKTsKKyAgICAgICAgICAgICAgICBpbml0Lmludm9rZUV4YWN0KCk7ICAvLyBmb3JjZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgY2xhc3MKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBleCkgeworICAgICAgICAgICAgICAgIHRocm93IHVuY2F1Z2h0RXhjZXB0aW9uKGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE1ldGhvZEhhbmRsZSBiY2NJbnZva2VyOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBNZXRob2RUeXBlIGludm9rZXJNVCA9IE1ldGhvZFR5cGUubWV0aG9kVHlwZShPYmplY3QuY2xhc3MsIE1ldGhvZEhhbmRsZS5jbGFzcywgT2JqZWN0W10uY2xhc3MpOworICAgICAgICAgICAgICAgIGJjY0ludm9rZXIgPSBJTVBMX0xPT0tVUC5maW5kU3RhdGljKGJjYywgImludm9rZV9WIiwgaW52b2tlck1UKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlZmxlY3RpdmVPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyB1bmNhdWdodEV4Y2VwdGlvbihleCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBUZXN0IHRoZSBpbnZva2VyLCB0byBlbnN1cmUgdGhhdCBpdCByZWFsbHkgaW5qZWN0cyBpbnRvIHRoZSByaWdodCBwbGFjZS4KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgTWV0aG9kSGFuZGxlIHZhbWggPSBwcmVwYXJlRm9ySW52b2tlcihNSF9jaGVja0NhbGxlckNsYXNzKTsKKyAgICAgICAgICAgICAgICBPYmplY3Qgb2sgPSBiY2NJbnZva2VyLmludm9rZUV4YWN0KHZhbWgsIG5ldyBPYmplY3RbXXtob3N0Q2xhc3MsIGJjY30pOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGV4KSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoZXgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGJjY0ludm9rZXI7CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3NWYWx1ZTxNZXRob2RIYW5kbGU+IENWX21ha2VJbmplY3RlZEludm9rZXIgPSBuZXcgQ2xhc3NWYWx1ZTxNZXRob2RIYW5kbGU+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlIHByb3RlY3RlZCBNZXRob2RIYW5kbGUgY29tcHV0ZVZhbHVlKENsYXNzPD8+IGhvc3RDbGFzcykgeworICAgICAgICAgICAgICAgIHJldHVybiBtYWtlSW5qZWN0ZWRJbnZva2VyKGhvc3RDbGFzcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgLy8gQWRhcHQgbWggc28gdGhhdCBpdCBjYW4gYmUgY2FsbGVkIGRpcmVjdGx5IGZyb20gYW4gaW5qZWN0ZWQgaW52b2tlcjoKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgTWV0aG9kSGFuZGxlIHByZXBhcmVGb3JJbnZva2VyKE1ldGhvZEhhbmRsZSBtaCkgeworICAgICAgICAgICAgbWggPSBtaC5hc0ZpeGVkQXJpdHkoKTsKKyAgICAgICAgICAgIE1ldGhvZFR5cGUgbXQgPSBtaC50eXBlKCk7CisgICAgICAgICAgICBpbnQgYXJpdHkgPSBtdC5wYXJhbWV0ZXJDb3VudCgpOworICAgICAgICAgICAgTWV0aG9kSGFuZGxlIHZhbWggPSBtaC5hc1R5cGUobXQuZ2VuZXJpYygpKTsKKyAgICAgICAgICAgIHZhbWguaW50ZXJuYWxGb3JtKCkuY29tcGlsZVRvQnl0ZWNvZGUoKTsgIC8vIGVsaW1pbmF0ZSBMRkkgc3RhY2sgZnJhbWVzCisgICAgICAgICAgICB2YW1oID0gdmFtaC5hc1NwcmVhZGVyKE9iamVjdFtdLmNsYXNzLCBhcml0eSk7CisgICAgICAgICAgICB2YW1oLmludGVybmFsRm9ybSgpLmNvbXBpbGVUb0J5dGVjb2RlKCk7ICAvLyBlbGltaW5hdGUgTEZJIHN0YWNrIGZyYW1lcworICAgICAgICAgICAgcmV0dXJuIHZhbWg7CisgICAgICAgIH0KKworICAgICAgICAvLyBVbmRvIHRoZSBhZGFwdGVyIGVmZmVjdCBvZiBwcmVwYXJlRm9ySW52b2tlcjoKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgTWV0aG9kSGFuZGxlIHJlc3RvcmVUb1R5cGUoTWV0aG9kSGFuZGxlIHZhbWgsIE1ldGhvZFR5cGUgdHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIHZhbWguYXNDb2xsZWN0b3IoT2JqZWN0W10uY2xhc3MsIHR5cGUucGFyYW1ldGVyQ291bnQoKSkuYXNUeXBlKHR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWV0aG9kSGFuZGxlIE1IX2NoZWNrQ2FsbGVyQ2xhc3M7CisgICAgICAgIHN0YXRpYyB7CisgICAgICAgICAgICBmaW5hbCBDbGFzczw/PiBUSElTX0NMQVNTID0gQmluZENhbGxlci5jbGFzczsKKyAgICAgICAgICAgIGFzc2VydChjaGVja0NhbGxlckNsYXNzKFRISVNfQ0xBU1MsIFRISVNfQ0xBU1MpKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgTUhfY2hlY2tDYWxsZXJDbGFzcyA9IElNUExfTE9PS1VQCisgICAgICAgICAgICAgICAgICAgIC5maW5kU3RhdGljKFRISVNfQ0xBU1MsICJjaGVja0NhbGxlckNsYXNzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kVHlwZS5tZXRob2RUeXBlKGJvb2xlYW4uY2xhc3MsIENsYXNzLmNsYXNzLCBDbGFzcy5jbGFzcykpOworICAgICAgICAgICAgICAgIGFzc2VydCgoYm9vbGVhbikgTUhfY2hlY2tDYWxsZXJDbGFzcy5pbnZva2VFeGFjdChUSElTX0NMQVNTLCBUSElTX0NMQVNTKSk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZXgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNoZWNrQ2FsbGVyQ2xhc3MoQ2xhc3M8Pz4gZXhwZWN0ZWQsIENsYXNzPD8+IGV4cGVjdGVkMikgeworICAgICAgICAgICAgZmluYWwgaW50IEZSQU1FX0NPVU5UX0FSRyA9IDI7ICAvLyBbMF0gUmVmbGVjdGlvbiBbMV0gQmluZENhbGxlciBbMl0gRXhwZWN0ZWQKKyAgICAgICAgICAgIENsYXNzPD8+IGFjdHVhbCA9IHN1bi5yZWZsZWN0LlJlZmxlY3Rpb24uZ2V0Q2FsbGVyQ2xhc3MoRlJBTUVfQ09VTlRfQVJHKTsKKyAgICAgICAgICAgIGlmIChhY3R1YWwgIT0gZXhwZWN0ZWQgJiYgYWN0dWFsICE9IGV4cGVjdGVkMikKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigiZm91bmQgIithY3R1YWwuZ2V0TmFtZSgpKyIsIGV4cGVjdGVkICIrZXhwZWN0ZWQuZ2V0TmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyhleHBlY3RlZCA9PSBleHBlY3RlZDIgPyAiIiA6ICIsIG9yIGVsc2UgIitleHBlY3RlZDIuZ2V0TmFtZSgpKSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBUX0JZVEVTOworICAgICAgICBzdGF0aWMgeworICAgICAgICAgICAgZmluYWwgT2JqZWN0W10gdmFsdWVzID0ge251bGx9OworICAgICAgICAgICAgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb248Vm9pZD4oKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBWb2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3M8VD4gdENsYXNzID0gVC5jbGFzczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdE5hbWUgPSB0Q2xhc3MuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0UmVzb3VyY2UgPSB0TmFtZS5zdWJzdHJpbmcodE5hbWUubGFzdEluZGV4T2YoJy4nKSsxKSsiLmNsYXNzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLm5ldC5VUkxDb25uZWN0aW9uIHVjb25uID0gdENsYXNzLmdldFJlc291cmNlKHRSZXNvdXJjZSkub3BlbkNvbm5lY3Rpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuID0gdWNvbm4uZ2V0Q29udGVudExlbmd0aCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW2xlbl07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IChqYXZhLmlvLklucHV0U3RyZWFtIHN0ciA9IHVjb25uLmdldElucHV0U3RyZWFtKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5yID0gc3RyLnJlYWQoYnl0ZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobnIgIT0gbGVuKSAgdGhyb3cgbmV3IGphdmEuaW8uSU9FeGNlcHRpb24odFJlc291cmNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzWzBdID0gYnl0ZXM7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIFRfQllURVMgPSAoYnl0ZVtdKSB2YWx1ZXNbMF07CisgICAgICAgIH0KKworICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGNsYXNzIGlzIHVzZWQgYXMgYSB0ZW1wbGF0ZSBmb3IgVW5zYWZlLmRlZmluZUFub255bW91c0NsYXNzOgorICAgICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBUIHsKKyAgICAgICAgICAgIHN0YXRpYyB2b2lkIGluaXQoKSB7IH0gIC8vIHNpZGUgZWZmZWN0OiBpbml0aWFsaXplcyB0aGlzIGNsYXNzCisgICAgICAgICAgICBzdGF0aWMgT2JqZWN0IGludm9rZV9WKE1ldGhvZEhhbmRsZSB2YW1oLCBPYmplY3RbXSBhcmdzKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFtaC5pbnZva2VFeGFjdChhcmdzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL2xhbmcvaW52b2tlL01ldGhvZEhhbmRsZU5hdGl2ZXMuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL2xhbmcvaW52b2tlL01ldGhvZEhhbmRsZU5hdGl2ZXMuamF2YQppbmRleCBkMjcyNTZmYi4uMDZhOWJhMiAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvbGFuZy9pbnZva2UvTWV0aG9kSGFuZGxlTmF0aXZlcy5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL2xhbmcvaW52b2tlL01ldGhvZEhhbmRsZU5hdGl2ZXMuamF2YQpAQCAtMzg1LDQgKzM4NSwxMDEgQEAKICAgICAgICAgICAgIHRocm93IGVycjsKICAgICAgICAgfQogICAgIH0KKworICAgIC8qKgorICAgICAqIElzIHRoaXMgbWV0aG9kIGEgY2FsbGVyLXNlbnNpdGl2ZSBtZXRob2Q/CisgICAgICogSS5lLiwgZG9lcyBpdCBjYWxsIFJlZmxlY3Rpb24uZ2V0Q2FsbGVyQ2xhc3Mgb3IgYSBzaW1pbGVyIG1ldGhvZAorICAgICAqIHRvIGFzayBhYm91dCB0aGUgaWRlbnRpdHkgb2YgaXRzIGNhbGxlcj8KKyAgICAgKi8KKyAgICAvLyBGSVhNRTogUmVwbGFjZSB0aGlzIHBhdHRlcm4gbWF0Y2ggYnkgYW4gYW5ub3RhdGlvbiBAc3VuLnJlZmxlY3QuQ2FsbGVyU2Vuc2l0aXZlLgorICAgIHN0YXRpYyBib29sZWFuIGlzQ2FsbGVyU2Vuc2l0aXZlKE1lbWJlck5hbWUgbWVtKSB7CisgICAgICAgIGFzc2VydChtZW0uaXNJbnZvY2FibGUoKSk7CisgICAgICAgIENsYXNzPD8+IGRlZmMgPSBtZW0uZ2V0RGVjbGFyaW5nQ2xhc3MoKTsKKyAgICAgICAgc3dpdGNoIChtZW0uZ2V0TmFtZSgpKSB7CisgICAgICAgIGNhc2UgImRvUHJpdmlsZWdlZCI6CisgICAgICAgICAgICByZXR1cm4gZGVmYyA9PSBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXIuY2xhc3M7CisgICAgICAgIGNhc2UgImdldFVuc2FmZSI6CisgICAgICAgICAgICByZXR1cm4gZGVmYyA9PSBzdW4ubWlzYy5VbnNhZmUuY2xhc3M7CisgICAgICAgIGNhc2UgImxvb2t1cCI6CisgICAgICAgICAgICByZXR1cm4gZGVmYyA9PSBqYXZhLmxhbmcuaW52b2tlLk1ldGhvZEhhbmRsZXMuY2xhc3M7CisgICAgICAgIGNhc2UgImludm9rZSI6CisgICAgICAgICAgICByZXR1cm4gZGVmYyA9PSBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QuY2xhc3M7CisgICAgICAgIGNhc2UgImdldCI6CisgICAgICAgIGNhc2UgImdldEJvb2xlYW4iOgorICAgICAgICBjYXNlICJnZXRCeXRlIjoKKyAgICAgICAgY2FzZSAiZ2V0Q2hhciI6CisgICAgICAgIGNhc2UgImdldFNob3J0IjoKKyAgICAgICAgY2FzZSAiZ2V0SW50IjoKKyAgICAgICAgY2FzZSAiZ2V0TG9uZyI6CisgICAgICAgIGNhc2UgImdldEZsb2F0IjoKKyAgICAgICAgY2FzZSAiZ2V0RG91YmxlIjoKKyAgICAgICAgY2FzZSAic2V0IjoKKyAgICAgICAgY2FzZSAic2V0Qm9vbGVhbiI6CisgICAgICAgIGNhc2UgInNldEJ5dGUiOgorICAgICAgICBjYXNlICJzZXRDaGFyIjoKKyAgICAgICAgY2FzZSAic2V0U2hvcnQiOgorICAgICAgICBjYXNlICJzZXRJbnQiOgorICAgICAgICBjYXNlICJzZXRMb25nIjoKKyAgICAgICAgY2FzZSAic2V0RmxvYXQiOgorICAgICAgICBjYXNlICJzZXREb3VibGUiOgorICAgICAgICAgICAgcmV0dXJuIGRlZmMgPT0gamF2YS5sYW5nLnJlZmxlY3QuRmllbGQuY2xhc3M7CisgICAgICAgIGNhc2UgIm5ld0luc3RhbmNlIjoKKyAgICAgICAgICAgIGlmIChkZWZjID09IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yLmNsYXNzKSAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBpZiAoZGVmYyA9PSBqYXZhLmxhbmcuQ2xhc3MuY2xhc3MpICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICJmb3JOYW1lIjoKKyAgICAgICAgY2FzZSAiZ2V0Q2xhc3NMb2FkZXIiOgorICAgICAgICBjYXNlICJnZXRDbGFzc2VzIjoKKyAgICAgICAgY2FzZSAiZ2V0RmllbGRzIjoKKyAgICAgICAgY2FzZSAiZ2V0TWV0aG9kcyI6CisgICAgICAgIGNhc2UgImdldENvbnN0cnVjdG9ycyI6CisgICAgICAgIGNhc2UgImdldERlY2xhcmVkQ2xhc3NlcyI6CisgICAgICAgIGNhc2UgImdldERlY2xhcmVkRmllbGRzIjoKKyAgICAgICAgY2FzZSAiZ2V0RGVjbGFyZWRNZXRob2RzIjoKKyAgICAgICAgY2FzZSAiZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcnMiOgorICAgICAgICBjYXNlICJnZXRGaWVsZCI6CisgICAgICAgIGNhc2UgImdldE1ldGhvZCI6CisgICAgICAgIGNhc2UgImdldENvbnN0cnVjdG9yIjoKKyAgICAgICAgY2FzZSAiZ2V0RGVjbGFyZWRGaWVsZCI6CisgICAgICAgIGNhc2UgImdldERlY2xhcmVkTWV0aG9kIjoKKyAgICAgICAgY2FzZSAiZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvciI6CisgICAgICAgICAgICByZXR1cm4gZGVmYyA9PSBqYXZhLmxhbmcuQ2xhc3MuY2xhc3M7CisgICAgICAgIGNhc2UgImdldENvbm5lY3Rpb24iOgorICAgICAgICBjYXNlICJnZXREcml2ZXIiOgorICAgICAgICBjYXNlICJnZXREcml2ZXJzIjoKKyAgICAgICAgY2FzZSAiZGVyZWdpc3RlckRyaXZlciI6CisgICAgICAgICAgICByZXR1cm4gZGVmYyA9PSBqYXZhLnNxbC5Ecml2ZXJNYW5hZ2VyLmNsYXNzOworICAgICAgICBjYXNlICJuZXdVcGRhdGVyIjoKKyAgICAgICAgICAgIGlmIChkZWZjID09IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyRmllbGRVcGRhdGVyLmNsYXNzKSAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBpZiAoZGVmYyA9PSBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljTG9uZ0ZpZWxkVXBkYXRlci5jbGFzcykgIHJldHVybiB0cnVlOworICAgICAgICAgICAgaWYgKGRlZmMgPT0gamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY1JlZmVyZW5jZUZpZWxkVXBkYXRlci5jbGFzcykgIHJldHVybiB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgImdldENvbnRleHRDbGFzc0xvYWRlciI6CisgICAgICAgICAgICByZXR1cm4gZGVmYyA9PSBqYXZhLmxhbmcuVGhyZWFkLmNsYXNzOworICAgICAgICBjYXNlICJnZXRQYWNrYWdlIjoKKyAgICAgICAgY2FzZSAiZ2V0UGFja2FnZXMiOgorICAgICAgICAgICAgcmV0dXJuIGRlZmMgPT0gamF2YS5sYW5nLlBhY2thZ2UuY2xhc3M7CisgICAgICAgIGNhc2UgImdldFBhcmVudCI6CisgICAgICAgIGNhc2UgImdldFN5c3RlbUNsYXNzTG9hZGVyIjoKKyAgICAgICAgICAgIHJldHVybiBkZWZjID09IGphdmEubGFuZy5DbGFzc0xvYWRlci5jbGFzczsKKyAgICAgICAgY2FzZSAibG9hZCI6CisgICAgICAgIGNhc2UgImxvYWRMaWJyYXJ5IjoKKyAgICAgICAgICAgIGlmIChkZWZjID09IGphdmEubGFuZy5SdW50aW1lLmNsYXNzKSAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBpZiAoZGVmYyA9PSBqYXZhLmxhbmcuU3lzdGVtLmNsYXNzKSAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAiZ2V0Q2FsbGVyQ2xhc3MiOgorICAgICAgICAgICAgaWYgKGRlZmMgPT0gc3VuLnJlZmxlY3QuUmVmbGVjdGlvbi5jbGFzcykgIHJldHVybiB0cnVlOworICAgICAgICAgICAgaWYgKGRlZmMgPT0gamF2YS5sYW5nLlN5c3RlbS5jbGFzcykgIHJldHVybiB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgImdldENhbGxlckNsYXNzTG9hZGVyIjoKKyAgICAgICAgICAgIHJldHVybiBkZWZjID09IGphdmEubGFuZy5DbGFzc0xvYWRlci5jbGFzczsKKyAgICAgICAgY2FzZSAiZ2V0UHJveHlDbGFzcyI6CisgICAgICAgIGNhc2UgIm5ld1Byb3h5SW5zdGFuY2UiOgorICAgICAgICAgICAgcmV0dXJuIGRlZmMgPT0gamF2YS5sYW5nLnJlZmxlY3QuUHJveHkuY2xhc3M7CisgICAgICAgIGNhc2UgImdldEJ1bmRsZSI6CisgICAgICAgIGNhc2UgImNsZWFyQ2FjaGUiOgorICAgICAgICAgICAgcmV0dXJuIGRlZmMgPT0gamF2YS51dGlsLlJlc291cmNlQnVuZGxlLmNsYXNzOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9sYW5nL2ludm9rZS9NZXRob2RIYW5kbGVTdGF0aWNzLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9sYW5nL2ludm9rZS9NZXRob2RIYW5kbGVTdGF0aWNzLmphdmEKaW5kZXggMWMwNjlhYS4uOGE4ZWVkZiAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvbGFuZy9pbnZva2UvTWV0aG9kSGFuZGxlU3RhdGljcy5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL2xhbmcvaW52b2tlL01ldGhvZEhhbmRsZVN0YXRpY3MuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTExNCw3ICsxMTQsNyBAQAogICAgIC8qbm9uLXB1YmxpYyovIHN0YXRpYyBSdW50aW1lRXhjZXB0aW9uIG5ld0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgT2JqZWN0IG9iaiwgT2JqZWN0IG9iajIpIHsKICAgICAgICAgcmV0dXJuIG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24obWVzc2FnZShtZXNzYWdlLCBvYmosIG9iajIpKTsKICAgICB9Ci0gICAgLypub24tcHVibGljKi8gc3RhdGljIEVycm9yIHVuY2F1Z2h0RXhjZXB0aW9uKEV4Y2VwdGlvbiBleCkgeworICAgIC8qbm9uLXB1YmxpYyovIHN0YXRpYyBFcnJvciB1bmNhdWdodEV4Y2VwdGlvbihUaHJvd2FibGUgZXgpIHsKICAgICAgICAgdGhyb3cgbmV3SW50ZXJuYWxFcnJvcigidW5jYXVnaHQgZXhjZXB0aW9uIiwgZXgpOwogICAgIH0KICAgICBzdGF0aWMgRXJyb3IgTllJKCkgewpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvbGFuZy9pbnZva2UvTWV0aG9kSGFuZGxlcy5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvbGFuZy9pbnZva2UvTWV0aG9kSGFuZGxlcy5qYXZhCmluZGV4IDVjNTVmMjAuLmU3MDA3ZGQgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL2xhbmcvaW52b2tlL01ldGhvZEhhbmRsZXMuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9sYW5nL2ludm9rZS9NZXRob2RIYW5kbGVzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0zMjksNiArMzI5LDcgQEAKICAgICAgKiAgICAgd2hlcmUge0Bjb2RlIGRlZmNQa2d9IGlzIHRoZSBwYWNrYWdlIG9mIHtAY29kZSBkZWZjfS4KICAgICAgKiA8L3VsPgogICAgICAqLworICAgIC8vIEZJWE1FIGluIE1SMTogY2xhcmlmeSB0aGF0IHRoZSBieXRlY29kZSBiZWhhdmlvciBvZiBhIGNhbGxlci1JRCBtZXRob2QgKGxpa2UgQ2xhc3MuZm9yTmFtZSkgaXMgcmVsYXRpdmUgdG8gdGhlIGxvb2t1cENsYXNzIHVzZWQgdG8gY3JlYXRlIHRoZSBtZXRob2QgaGFuZGxlLCBub3QgdGhlIGR5bmFtaWMgY2FsbGVyIG9mIHRoZSBtZXRob2QgaGFuZGxlCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbAogICAgIGNsYXNzIExvb2t1cCB7CiAgICAgICAgIC8qKiBUaGUgY2xhc3Mgb24gYmVoYWxmIG9mIHdob20gdGhlIGxvb2t1cCBpcyBiZWluZyBwZXJmb3JtZWQuICovCkBAIC0xMjA5LDYgKzEyMTAsNyBAQAogICAgICAgICAgICAgaWYgKG1ldGhvZC5pc01ldGhvZEhhbmRsZUludm9rZSgpKQogICAgICAgICAgICAgICAgIHJldHVybiBmYWtlTWV0aG9kSGFuZGxlSW52b2tlKG1ldGhvZCk7CiAgICAgICAgICAgICBNZXRob2RIYW5kbGUgbWggPSBEaXJlY3RNZXRob2RIYW5kbGUubWFrZShyZWZjLCBtZXRob2QpOworICAgICAgICAgICAgbWggPSBtYXliZUJpbmRDYWxsZXIobWV0aG9kLCBtaCk7CiAgICAgICAgICAgICBtaCA9IG1oLnNldFZhcmFyZ3MobWV0aG9kKTsKICAgICAgICAgICAgIGlmIChkb1Jlc3RyaWN0KQogICAgICAgICAgICAgICAgIG1oID0gcmVzdHJpY3RSZWNlaXZlcihtZXRob2QsIG1oLCBsb29rdXBDbGFzcygpKTsKQEAgLTEyMTcsNiArMTIxOSwxNiBAQAogICAgICAgICBwcml2YXRlIE1ldGhvZEhhbmRsZSBmYWtlTWV0aG9kSGFuZGxlSW52b2tlKE1lbWJlck5hbWUgbWV0aG9kKSB7CiAgICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24obWV0aG9kLmdldFJldHVyblR5cGUoKSwgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uY2xhc3MpOwogICAgICAgICB9CisgICAgICAgIHByaXZhdGUgTWV0aG9kSGFuZGxlIG1heWJlQmluZENhbGxlcihNZW1iZXJOYW1lIG1ldGhvZCwgTWV0aG9kSGFuZGxlIG1oKSB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAoYWxsb3dlZE1vZGVzID09IFRSVVNURUQgfHwgIU1ldGhvZEhhbmRsZU5hdGl2ZXMuaXNDYWxsZXJTZW5zaXRpdmUobWV0aG9kKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gbWg7CisgICAgICAgICAgICBDbGFzczw/PiBob3N0Q2xhc3MgPSBsb29rdXBDbGFzczsKKyAgICAgICAgICAgIGlmICgoYWxsb3dlZE1vZGVzICYgUFJJVkFURSkgPT0gMCkgIC8vIGNhbGxlciBtdXN0IHVzZSBmdWxsLXBvd2VyIGxvb2t1cAorICAgICAgICAgICAgICAgIGhvc3RDbGFzcyA9IG51bGw7CisgICAgICAgICAgICBNZXRob2RIYW5kbGUgY2JtaCA9IE1ldGhvZEhhbmRsZUltcGwuYmluZENhbGxlcihtaCwgaG9zdENsYXNzKTsKKyAgICAgICAgICAgIC8vIE5vdGU6IGNhbGxlciB3aWxsIGFwcGx5IHZhcmFyZ3MgYWZ0ZXIgdGhpcyBzdGVwIGhhcHBlbnMuCisgICAgICAgICAgICByZXR1cm4gY2JtaDsKKyAgICAgICAgfQogICAgICAgICBwcml2YXRlIE1ldGhvZEhhbmRsZSBnZXREaXJlY3RGaWVsZChieXRlIHJlZktpbmQsIENsYXNzPD8+IHJlZmMsIE1lbWJlck5hbWUgZmllbGQpIHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsKICAgICAgICAgICAgIGNoZWNrRmllbGQocmVmS2luZCwgcmVmYywgZmllbGQpOwogICAgICAgICAgICAgTWV0aG9kSGFuZGxlIG1oID0gRGlyZWN0TWV0aG9kSGFuZGxlLm1ha2UocmVmYywgZmllbGQpOwpAQCAtMTIyOSw2ICsxMjQxLDcgQEAKICAgICAgICAgcHJpdmF0ZSBNZXRob2RIYW5kbGUgZ2V0RGlyZWN0Q29uc3RydWN0b3IoQ2xhc3M8Pz4gcmVmYywgTWVtYmVyTmFtZSBjdG9yKSB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7CiAgICAgICAgICAgICBhc3NlcnQoY3Rvci5pc0NvbnN0cnVjdG9yKCkpOwogICAgICAgICAgICAgY2hlY2tBY2Nlc3MoUkVGX25ld0ludm9rZVNwZWNpYWwsIHJlZmMsIGN0b3IpOworICAgICAgICAgICAgYXNzZXJ0KCFNZXRob2RIYW5kbGVOYXRpdmVzLmlzQ2FsbGVyU2Vuc2l0aXZlKGN0b3IpKTsgIC8vIG1heWJlQmluZENhbGxlciBub3QgcmVsZXZhbnQgaGVyZQogICAgICAgICAgICAgcmV0dXJuIERpcmVjdE1ldGhvZEhhbmRsZS5tYWtlKGN0b3IpLnNldFZhcmFyZ3MoY3Rvcik7CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvbmV0L0Fic3RyYWN0UGxhaW5Tb2NrZXRJbXBsLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9uZXQvQWJzdHJhY3RQbGFpblNvY2tldEltcGwuamF2YQppbmRleCA3NDk1ODA1Li5jZTM2NDc5IDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9uZXQvQWJzdHJhY3RQbGFpblNvY2tldEltcGwuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9uZXQvQWJzdHJhY3RQbGFpblNvY2tldEltcGwuamF2YQpAQCAtNTIsNiArNTIsNyBAQAogICAgIHByaXZhdGUgYm9vbGVhbiBzaHV0X3dyID0gZmFsc2U7CiAKICAgICBwcml2YXRlIFNvY2tldElucHV0U3RyZWFtIHNvY2tldElucHV0U3RyZWFtID0gbnVsbDsKKyAgICBwcml2YXRlIFNvY2tldE91dHB1dFN0cmVhbSBzb2NrZXRPdXRwdXRTdHJlYW0gPSBudWxsOwogCiAgICAgLyogbnVtYmVyIG9mIHRocmVhZHMgdXNpbmcgdGhlIEZpbGVEZXNjcmlwdG9yICovCiAgICAgcHJvdGVjdGVkIGludCBmZFVzZUNvdW50ID0gMDsKQEAgLTQzNiw3ICs0MzcsMTAgQEAKICAgICAgICAgaWYgKHNodXRfd3IpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiU29ja2V0IG91dHB1dCBpcyBzaHV0ZG93biIpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgU29ja2V0T3V0cHV0U3RyZWFtKHRoaXMpOworICAgICAgICBpZiAoc29ja2V0T3V0cHV0U3RyZWFtID09IG51bGwpIHsKKyAgICAgICAgICAgIHNvY2tldE91dHB1dFN0cmVhbSA9IG5ldyBTb2NrZXRPdXRwdXRTdHJlYW0odGhpcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNvY2tldE91dHB1dFN0cmVhbTsKICAgICB9CiAKICAgICB2b2lkIHNldEZpbGVEZXNjcmlwdG9yKEZpbGVEZXNjcmlwdG9yIGZkKSB7CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9uZXQvUHJveHlTZWxlY3Rvci5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvbmV0L1Byb3h5U2VsZWN0b3IuamF2YQppbmRleCA4OGYyNGEyLi45N2QxOWExIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9uZXQvUHJveHlTZWxlY3Rvci5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL25ldC9Qcm94eVNlbGVjdG9yLmphdmEKQEAgLTEyNyw3ICsxMjcsNiBAQAogICAgICAqIDxVTD4KICAgICAgKiA8TEk+aHR0cCBVUkkgZm9yIGh0dHAgY29ubmVjdGlvbnM8L0xJPgogICAgICAqIDxMST5odHRwcyBVUkkgZm9yIGh0dHBzIGNvbm5lY3Rpb25zCi0gICAgICogPExJPmZ0cCBVUkkgZm9yIGZ0cCBjb25uZWN0aW9uczwvTEk+CiAgICAgICogPExJPjxjb2RlPnNvY2tldDovL2hvc3Q6cG9ydDwvY29kZT48YnI+CiAgICAgICogICAgIGZvciB0Y3AgY2xpZW50IHNvY2tldHMgY29ubmVjdGlvbnM8L0xJPgogICAgICAqIDwvVUw+CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9uZXQvVVJMLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9uZXQvVVJMLmphdmEKaW5kZXggZTdlOWRkYS4uNWNiM2Y2ZCAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvbmV0L1VSTC5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL25ldC9VUkwuamF2YQpAQCAtMjc0LDcgKzI3NCw3IEBACiAgICAgICogPHA+UHJvdG9jb2wgaGFuZGxlcnMgZm9yIHRoZSBmb2xsb3dpbmcgcHJvdG9jb2xzIGFyZSBndWFyYW50ZWVkCiAgICAgICogdG8gZXhpc3Qgb24gdGhlIHNlYXJjaCBwYXRoIDotCiAgICAgICogPGJsb2NrcXVvdGU+PHByZT4KLSAgICAgKiAgICAgaHR0cCwgaHR0cHMsIGZ0cCwgZmlsZSwgYW5kIGphcgorICAgICAqICAgICBodHRwLCBodHRwcywgZmlsZSwgYW5kIGphcgogICAgICAqIDwvcHJlPjwvYmxvY2txdW90ZT4KICAgICAgKiBQcm90b2NvbCBoYW5kbGVycyBmb3IgYWRkaXRpb25hbCBwcm90b2NvbHMgbWF5IGFsc28gYmUKICAgICAgKiBhdmFpbGFibGUuCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9uZXQvVVJMU3RyZWFtSGFuZGxlci5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvbmV0L1VSTFN0cmVhbUhhbmRsZXIuamF2YQppbmRleCBjOTg1ODhhLi5iYTdmYTI2IDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9uZXQvVVJMU3RyZWFtSGFuZGxlci5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL25ldC9VUkxTdHJlYW1IYW5kbGVyLmphdmEKQEAgLTM3LDggKzM3LDcgQEAKICAqIFRoZSBhYnN0cmFjdCBjbGFzcyA8Y29kZT5VUkxTdHJlYW1IYW5kbGVyPC9jb2RlPiBpcyB0aGUgY29tbW9uCiAgKiBzdXBlcmNsYXNzIGZvciBhbGwgc3RyZWFtIHByb3RvY29sIGhhbmRsZXJzLiBBIHN0cmVhbSBwcm90b2NvbAogICogaGFuZGxlciBrbm93cyBob3cgdG8gbWFrZSBhIGNvbm5lY3Rpb24gZm9yIGEgcGFydGljdWxhciBwcm90b2NvbAotICogdHlwZSwgc3VjaCBhcyA8Y29kZT5odHRwPC9jb2RlPiwgPGNvZGU+ZnRwPC9jb2RlPiwgb3IKLSAqIDxjb2RlPmdvcGhlcjwvY29kZT4uCisgKiB0eXBlLCBzdWNoIGFzIDxjb2RlPmh0dHA8L2NvZGU+IG9yIDxjb2RlPmh0dHBzPC9jb2RlPi4KICAqIDxwPgogICogSW4gbW9zdCBjYXNlcywgYW4gaW5zdGFuY2Ugb2YgYSA8Y29kZT5VUkxTdHJlYW1IYW5kbGVyPC9jb2RlPgogICogc3ViY2xhc3MgaXMgbm90IGNyZWF0ZWQgZGlyZWN0bHkgYnkgYW4gYXBwbGljYXRpb24uIFJhdGhlciwgdGhlCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9uZXQvcGFja2FnZS5odG1sIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvbmV0L3BhY2thZ2UuaHRtbAppbmRleCBiNWJkMjYxLi4yY2Q4YTI0IDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9uZXQvcGFja2FnZS5odG1sCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL25ldC9wYWNrYWdlLmh0bWwKQEAgLTcyLDcgKzcyLDcgQEAKIDx1bD4KICAgICAgIDxsaT57QGxpbmsgamF2YS5uZXQuVVJJfSBpcyB0aGUgY2xhc3MgcmVwcmVzZW50aW5nIGEgVW5pdmVyc2FsIFJlc291cmNlIElkZW50aWZpZXIsIGFzIHNwZWNpZmllZCBpbiBSRkMgMjM5Ni4gQXMgdGhlIG5hbWUgaW5kaWNhdGVzLCB0aGlzIGlzIGp1c3QgYW4gSWRlbnRpZmllciBhbmQgZG9lc24ndCBwcm92aWRlIGRpcmVjdGx5IHRoZSBtZWFucyB0byBhY2Nlc3MgdGhlIHJlc291cmNlLjwvbGk+CiAgICAgICA8bGk+e0BsaW5rIGphdmEubmV0LlVSTH0gaXMgdGhlIGNsYXNzIHJlcHJlc2VudGluZyBhIFVuaXZlcnNhbCBSZXNvdXJjZSBMb2NhdG9yLCB3aGljaCBpcyBib3RoIGFuIG9sZGVyIGNvbmNlcHQgZm9yIFVSSXMgYW5kIGEgbWVhbnMgdG8gYWNjZXNzIHRoZSByZXNvdXJjZXMuPC9saT4KLSAgICAgIDxsaT57QGxpbmsgamF2YS5uZXQuVVJMQ29ubmVjdGlvbn0gaXMgY3JlYXRlZCBmcm9tIGEgVVJMIGFuZCBpcyB0aGUgY29tbXVuaWNhdGlvbiBsaW5rIHVzZWQgdG8gYWNjZXNzIHRoZSByZXNvdXJjZSBwb2ludGVkIGJ5IHRoZSBVUkwuIFRoaXMgYWJzdHJhY3QgY2xhc3Mgd2lsbCBkZWxlZ2F0ZSBtb3N0IG9mIHRoZSB3b3JrIHRvIHRoZSB1bmRlcmx5aW5nIHByb3RvY29sIGhhbmRsZXJzIGxpa2UgaHR0cCBvciBmdHAuPC9saT4KKyAgICAgIDxsaT57QGxpbmsgamF2YS5uZXQuVVJMQ29ubmVjdGlvbn0gaXMgY3JlYXRlZCBmcm9tIGEgVVJMIGFuZCBpcyB0aGUgY29tbXVuaWNhdGlvbiBsaW5rIHVzZWQgdG8gYWNjZXNzIHRoZSByZXNvdXJjZSBwb2ludGVkIGJ5IHRoZSBVUkwuIFRoaXMgYWJzdHJhY3QgY2xhc3Mgd2lsbCBkZWxlZ2F0ZSBtb3N0IG9mIHRoZSB3b3JrIHRvIHRoZSB1bmRlcmx5aW5nIHByb3RvY29sIGhhbmRsZXJzIGxpa2UgaHR0cCBvciBodHRwcy48L2xpPgogICAgICAgPGxpPntAbGluayBqYXZhLm5ldC5IdHRwVVJMQ29ubmVjdGlvbn0gaXMgYSBzdWJjbGFzcyBvZiBVUkxDb25uZWN0aW9uIGFuZCBwcm92aWRlcyBzb21lIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0aWVzIHNwZWNpZmljIHRvIHRoZSBIVFRQIHByb3RvY29sLjwvbGk+CiA8L3VsPgogPHA+VGhlIHJlY29tbWVuZGVkIHVzYWdlIGlzIHRvIHVzZSB7QGxpbmsgamF2YS5uZXQuVVJJfSB0byBpZGVudGlmeSByZXNvdXJjZXMsIHRoZW4gY29udmVydCBpdCBpbnRvIGEge0BsaW5rIGphdmEubmV0LlVSTH0gd2hlbiBpdCBpcyB0aW1lIHRvIGFjY2VzcyB0aGUgcmVzb3VyY2UuIEZyb20gdGhhdCBVUkwsIHlvdSBjYW4gZWl0aGVyIGdldCB0aGUge0BsaW5rIGphdmEubmV0LlVSTENvbm5lY3Rpb259IGZvciBmaW5lIGNvbnRyb2wsIG9yIGdldCBkaXJlY3RseSB0aGUgSW5wdXRTdHJlYW0uPHA+CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9zZWN1cml0eS9BY2Nlc3NDb250cm9sbGVyLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9zZWN1cml0eS9BY2Nlc3NDb250cm9sbGVyLmphdmEKaW5kZXggOTczODNmNS4uNGU3OTBmZiAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvc2VjdXJpdHkvQWNjZXNzQ29udHJvbGxlci5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3NlY3VyaXR5L0FjY2Vzc0NvbnRyb2xsZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTcsIDIwMTEsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI5MCwxMSArMjkwLDExIEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyA8VD4gVCBkb1ByaXZpbGVnZWRXaXRoQ29tYmluZXIoUHJpdmlsZWdlZEFjdGlvbjxUPiBhY3Rpb24pIHsKIAotICAgICAgICBEb21haW5Db21iaW5lciBkYyA9IG51bGw7CiAgICAgICAgIEFjY2Vzc0NvbnRyb2xDb250ZXh0IGFjYyA9IGdldFN0YWNrQWNjZXNzQ29udHJvbENvbnRleHQoKTsKLSAgICAgICAgaWYgKGFjYyA9PSBudWxsIHx8IChkYyA9IGFjYy5nZXRBc3NpZ25lZENvbWJpbmVyKCkpID09IG51bGwpIHsKKyAgICAgICAgaWYgKGFjYyA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoYWN0aW9uKTsKICAgICAgICAgfQorICAgICAgICBEb21haW5Db21iaW5lciBkYyA9IGFjYy5nZXRBc3NpZ25lZENvbWJpbmVyKCk7CiAgICAgICAgIHJldHVybiBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChhY3Rpb24sIHByZXNlcnZlQ29tYmluZXIoZGMpKTsKICAgICB9CiAKQEAgLTM4NiwxMSArMzg2LDExIEBACiAgICAgcHVibGljIHN0YXRpYyA8VD4gVCBkb1ByaXZpbGVnZWRXaXRoQ29tYmluZXIKICAgICAgICAgKFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb248VD4gYWN0aW9uKSB0aHJvd3MgUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiB7CiAKLSAgICAgICAgRG9tYWluQ29tYmluZXIgZGMgPSBudWxsOwogICAgICAgICBBY2Nlc3NDb250cm9sQ29udGV4dCBhY2MgPSBnZXRTdGFja0FjY2Vzc0NvbnRyb2xDb250ZXh0KCk7Ci0gICAgICAgIGlmIChhY2MgPT0gbnVsbCB8fCAoZGMgPSBhY2MuZ2V0QXNzaWduZWRDb21iaW5lcigpKSA9PSBudWxsKSB7CisgICAgICAgIGlmIChhY2MgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKGFjdGlvbik7CiAgICAgICAgIH0KKyAgICAgICAgRG9tYWluQ29tYmluZXIgZGMgPSBhY2MuZ2V0QXNzaWduZWRDb21iaW5lcigpOwogICAgICAgICByZXR1cm4gQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoYWN0aW9uLCBwcmVzZXJ2ZUNvbWJpbmVyKGRjKSk7CiAgICAgfQogCkBAIC00MTcsNyArNDE3LDEyIEBACiAgICAgICAgIC8vIHBlcmZvcm0gJ2NvbWJpbmUnIG9uIHRoZSBjYWxsZXIgb2YgZG9Qcml2aWxlZ2VkLAogICAgICAgICAvLyBldmVuIGlmIHRoZSBjYWxsZXIgaXMgZnJvbSB0aGUgYm9vdGNsYXNzcGF0aAogICAgICAgICBQcm90ZWN0aW9uRG9tYWluW10gcGRzID0gbmV3IFByb3RlY3Rpb25Eb21haW5bXSB7Y2FsbGVyUGR9OwotICAgICAgICByZXR1cm4gbmV3IEFjY2Vzc0NvbnRyb2xDb250ZXh0KGNvbWJpbmVyLmNvbWJpbmUocGRzLCBudWxsKSwgY29tYmluZXIpOworICAgICAgICBpZiAoY29tYmluZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBBY2Nlc3NDb250cm9sQ29udGV4dChwZHMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBBY2Nlc3NDb250cm9sQ29udGV4dChjb21iaW5lci5jb21iaW5lKHBkcywgbnVsbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbWJpbmVyKTsKKyAgICAgICAgfQogICAgIH0KIAogCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9zcWwvQ2FsbGFibGVTdGF0ZW1lbnQuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3NxbC9DYWxsYWJsZVN0YXRlbWVudC5qYXZhCmluZGV4IDQ2MGIwMjguLjI4MTNiNmMgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3NxbC9DYWxsYWJsZVN0YXRlbWVudC5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3NxbC9DYWxsYWJsZVN0YXRlbWVudC5qYXZhCkBAIC0yOTUsNiArMjk1LDcgQEAKICAgICAgKiAgICAgICAgICAgICBvciA8Y29kZT5nZXRCaWdEZWNpbWFsKFN0cmluZyBwYXJhbWV0ZXJOYW1lKTwvY29kZT4KICAgICAgKiBAc2VlICNzZXRCaWdEZWNpbWFsCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBCaWdEZWNpbWFsIGdldEJpZ0RlY2ltYWwoaW50IHBhcmFtZXRlckluZGV4LCBpbnQgc2NhbGUpCiAgICAgICAgIHRocm93cyBTUUxFeGNlcHRpb247CiAKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3NxbC9EYXRlLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9zcWwvRGF0ZS5qYXZhCmluZGV4IGRlMzlkMTQuLjVkNmNkNmIgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3NxbC9EYXRlLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvc3FsL0RhdGUuamF2YQpAQCAtNTEsNiArNTEsNyBAQAogICAgICAqIEBwYXJhbSBkYXkgMSB0byAzMQogICAgICAqIEBkZXByZWNhdGVkIGluc3RlYWQgdXNlIHRoZSBjb25zdHJ1Y3RvciA8Y29kZT5EYXRlKGxvbmcgZGF0ZSk8L2NvZGU+CiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgRGF0ZShpbnQgeWVhciwgaW50IG1vbnRoLCBpbnQgZGF5KSB7CiAgICAgICAgIHN1cGVyKHllYXIsIG1vbnRoLCBkYXkpOwogICAgIH0KQEAgLTE3OSw2ICsxODAsNyBAQAogICAgICogQGV4Y2VwdGlvbiBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoaXMgbWV0aG9kIGlzIGludm9rZWQKICAgICAqIEBzZWUgI3NldEhvdXJzCiAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBpbnQgZ2V0SG91cnMoKSB7CiAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CiAgICAgfQpAQCAtMTkxLDYgKzE5Myw3IEBACiAgICAgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhpcyBtZXRob2QgaXMgaW52b2tlZAogICAgICogQHNlZSAjc2V0TWludXRlcwogICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgaW50IGdldE1pbnV0ZXMoKSB7CiAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CiAgICAgfQpAQCAtMjAzLDYgKzIwNiw3IEBACiAgICAgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhpcyBtZXRob2QgaXMgaW52b2tlZAogICAgICogQHNlZSAjc2V0U2Vjb25kcwogICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgaW50IGdldFNlY29uZHMoKSB7CiAgICAgICAgIHRocm93IG5ldyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CiAgICAgfQpAQCAtMjE1LDYgKzIxOSw3IEBACiAgICAgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhpcyBtZXRob2QgaXMgaW52b2tlZAogICAgICogQHNlZSAjZ2V0SG91cnMKICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIHZvaWQgc2V0SG91cnMoaW50IGkpIHsKICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKICAgICB9CkBAIC0yMjcsNiArMjMyLDcgQEAKICAgICAqIEBleGNlcHRpb24gamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGlzIG1ldGhvZCBpcyBpbnZva2VkCiAgICAgKiBAc2VlICNnZXRNaW51dGVzCiAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyB2b2lkIHNldE1pbnV0ZXMoaW50IGkpIHsKICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKICAgICB9CkBAIC0yMzksNiArMjQ1LDcgQEAKICAgICAqIEBleGNlcHRpb24gamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGlzIG1ldGhvZCBpcyBpbnZva2VkCiAgICAgKiBAc2VlICNnZXRTZWNvbmRzCiAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyB2b2lkIHNldFNlY29uZHMoaW50IGkpIHsKICAgICAgICAgdGhyb3cgbmV3IGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKICAgICB9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9zcWwvRHJpdmVyTWFuYWdlci5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvc3FsL0RyaXZlck1hbmFnZXIuamF2YQppbmRleCA4MTk1NDRhLi40MDIxZmEyIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9zcWwvRHJpdmVyTWFuYWdlci5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3NxbC9Ecml2ZXJNYW5hZ2VyLmphdmEKQEAgLTQxMiwxMyArNDEyLDE0IEBACiAgICAgICogbWV0aG9kIHRocm93cyBhIDxjb2RlPmphdmEubGFuZy5TZWN1cml0eUV4Y2VwdGlvbjwvY29kZT4uCiAgICAgICoKICAgICAgKiBAcGFyYW0gb3V0IHRoZSBuZXcgbG9nZ2luZy90cmFjaW5nIFByaW50U3RyZWFtOyB0byBkaXNhYmxlLCBzZXQgdG8gPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKiBAZGVwcmVjYXRlZAorICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGNvZGUgc2V0TG9nV3JpdGVyfQogICAgICAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24gaWYgYSBzZWN1cml0eSBtYW5hZ2VyIGV4aXN0cyBhbmQgaXRzCiAgICAgICogICAgPGNvZGU+Y2hlY2tQZXJtaXNzaW9uPC9jb2RlPiBtZXRob2QgZGVuaWVzIHNldHRpbmcgdGhlIGxvZyBzdHJlYW0KICAgICAgKgogICAgICAqIEBzZWUgU2VjdXJpdHlNYW5hZ2VyI2NoZWNrUGVybWlzc2lvbgogICAgICAqIEBzZWUgI2dldExvZ1N0cmVhbQogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldExvZ1N0cmVhbShqYXZhLmlvLlByaW50U3RyZWFtIG91dCkgewogCiAgICAgICAgIFNlY3VyaXR5TWFuYWdlciBzZWMgPSBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCk7CkBAIC00MzgsOSArNDM5LDEwIEBACiAgICAgICogYW5kIGFsbCBkcml2ZXJzLgogICAgICAqCiAgICAgICogQHJldHVybiB0aGUgbG9nZ2luZy90cmFjaW5nIFByaW50U3RyZWFtOyBpZiBkaXNhYmxlZCwgaXMgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKiBAZGVwcmVjYXRlZAorICAgICAqIEBkZXByZWNhdGVkICBVc2Uge0Bjb2RlIGdldExvZ1dyaXRlcn0KICAgICAgKiBAc2VlICNzZXRMb2dTdHJlYW0KICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBzdGF0aWMgamF2YS5pby5QcmludFN0cmVhbSBnZXRMb2dTdHJlYW0oKSB7CiAgICAgICAgIHJldHVybiBsb2dTdHJlYW07CiAgICAgfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvc3FsL1ByZXBhcmVkU3RhdGVtZW50LmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9zcWwvUHJlcGFyZWRTdGF0ZW1lbnQuamF2YQppbmRleCA4ZDZjYTYwLi5kNjc1MDVmIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9zcWwvUHJlcGFyZWRTdGF0ZW1lbnQuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9zcWwvUHJlcGFyZWRTdGF0ZW1lbnQuamF2YQpAQCAtMzQyLDggKzM0Miw5IEBACiAgICAgICogdGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uIGEgY2xvc2VkIDxjb2RlPlByZXBhcmVkU3RhdGVtZW50PC9jb2RlPgogICAgICAqIEBleGNlcHRpb24gU1FMRmVhdHVyZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBpZiB0aGUgSkRCQyBkcml2ZXIgZG9lcyBub3Qgc3VwcG9ydAogICAgICAqIHRoaXMgbWV0aG9kCi0gICAgICogQGRlcHJlY2F0ZWQKKyAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0Bjb2RlIHNldENoYXJhY3RlclN0cmVhbX0KICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHZvaWQgc2V0VW5pY29kZVN0cmVhbShpbnQgcGFyYW1ldGVySW5kZXgsIGphdmEuaW8uSW5wdXRTdHJlYW0geCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCkgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKIApkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvc3FsL1Jlc3VsdFNldC5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvc3FsL1Jlc3VsdFNldC5qYXZhCmluZGV4IGZjNGRiZjYuLjM5MDRhMmUgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3NxbC9SZXN1bHRTZXQuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS9zcWwvUmVzdWx0U2V0LmphdmEKQEAgLTM1Niw4ICszNTYsMTAgQEAKICAgICAgKiAgICAgICAgICAgIGNhbGxlZCBvbiBhIGNsb3NlZCByZXN1bHQgc2V0CiAgICAgICogQGV4Y2VwdGlvbiBTUUxGZWF0dXJlTm90U3VwcG9ydGVkRXhjZXB0aW9uIGlmIHRoZSBKREJDIGRyaXZlciBkb2VzIG5vdCBzdXBwb3J0CiAgICAgICogdGhpcyBtZXRob2QKLSAgICAgKiBAZGVwcmVjYXRlZAorICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGNvZGUgZ2V0QmlnRGVjaW1hbChpbnQgY29sdW1uSW5kZXgpfQorICAgICAqICAgICAgICAgICAgIG9yIHtAY29kZSBnZXRCaWdEZWNpbWFsKFN0cmluZyBjb2x1bW5MYWJlbCl9CiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBCaWdEZWNpbWFsIGdldEJpZ0RlY2ltYWwoaW50IGNvbHVtbkluZGV4LCBpbnQgc2NhbGUpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKQEAgLTQ3Nyw2ICs0NzksNyBAQAogICAgICAqIEBkZXByZWNhdGVkIHVzZSA8Y29kZT5nZXRDaGFyYWN0ZXJTdHJlYW08L2NvZGU+IGluIHBsYWNlIG9mCiAgICAgICogICAgICAgICAgICAgIDxjb2RlPmdldFVuaWNvZGVTdHJlYW08L2NvZGU+CiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBqYXZhLmlvLklucHV0U3RyZWFtIGdldFVuaWNvZGVTdHJlYW0oaW50IGNvbHVtbkluZGV4KSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCkBAIC02NDEsOCArNjQ0LDEwIEBACiAgICAgICogICAgICAgICAgICBjYWxsZWQgb24gYSBjbG9zZWQgcmVzdWx0IHNldAogICAgICAqIEBleGNlcHRpb24gU1FMRmVhdHVyZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBpZiB0aGUgSkRCQyBkcml2ZXIgZG9lcyBub3Qgc3VwcG9ydAogICAgICAqIHRoaXMgbWV0aG9kCi0gICAgICogQGRlcHJlY2F0ZWQKKyAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0Bjb2RlIGdldEJpZ0RlY2ltYWwoaW50IGNvbHVtbkluZGV4KX0KKyAgICAgKiAgICAgICAgICAgICBvciB7QGNvZGUgZ2V0QmlnRGVjaW1hbChTdHJpbmcgY29sdW1uTGFiZWwpfQogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgQmlnRGVjaW1hbCBnZXRCaWdEZWNpbWFsKFN0cmluZyBjb2x1bW5MYWJlbCwgaW50IHNjYWxlKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwogCiAgICAgLyoqCkBAIC03NjAsNiArNzY1LDcgQEAKICAgICAgKiB0aGlzIG1ldGhvZAogICAgICAqIEBkZXByZWNhdGVkIHVzZSA8Y29kZT5nZXRDaGFyYWN0ZXJTdHJlYW08L2NvZGU+IGluc3RlYWQKICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIGphdmEuaW8uSW5wdXRTdHJlYW0gZ2V0VW5pY29kZVN0cmVhbShTdHJpbmcgY29sdW1uTGFiZWwpIHRocm93cyBTUUxFeGNlcHRpb247CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3RleHQvRGF0ZUZvcm1hdFN5bWJvbHMuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3RleHQvRGF0ZUZvcm1hdFN5bWJvbHMuamF2YQppbmRleCAzZTcwMWIxLi5lZTY4OGFiIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS90ZXh0L0RhdGVGb3JtYXRTeW1ib2xzLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvdGV4dC9EYXRlRm9ybWF0U3ltYm9scy5qYXZhCkBAIC00NSw2ICs0NSw3IEBACiBpbXBvcnQgamF2YS50ZXh0LnNwaS5EYXRlRm9ybWF0U3ltYm9sc1Byb3ZpZGVyOwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKIGltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7CiBpbXBvcnQgamF2YS51dGlsLlRpbWVab25lOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwOwpAQCAtMzY2LDYgKzM2Nyw3IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RXJhcyhTdHJpbmdbXSBuZXdFcmFzKSB7CiAgICAgICAgIGVyYXMgPSBBcnJheXMuY29weU9mKG5ld0VyYXMsIG5ld0VyYXMubGVuZ3RoKTsKKyAgICAgICAgY2FjaGVkSGFzaENvZGUgPSAwOwogICAgIH0KIAogICAgIC8qKgpAQCAtMzkzLDYgKzM5NSw3IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0TW9udGhzKFN0cmluZ1tdIG5ld01vbnRocykgewogICAgICAgICBtb250aHMgPSBBcnJheXMuY29weU9mKG5ld01vbnRocywgbmV3TW9udGhzLmxlbmd0aCk7CisgICAgICAgIGNhY2hlZEhhc2hDb2RlID0gMDsKICAgICB9CiAKICAgICAvKioKQEAgLTQyMCw2ICs0MjMsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFNob3J0TW9udGhzKFN0cmluZ1tdIG5ld1Nob3J0TW9udGhzKSB7CiAgICAgICAgIHNob3J0TW9udGhzID0gQXJyYXlzLmNvcHlPZihuZXdTaG9ydE1vbnRocywgbmV3U2hvcnRNb250aHMubGVuZ3RoKTsKKyAgICAgICAgY2FjaGVkSGFzaENvZGUgPSAwOwogICAgIH0KIAogICAgIC8qKgpAQCAtNDM5LDYgKzQ0Myw3IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0V2Vla2RheXMoU3RyaW5nW10gbmV3V2Vla2RheXMpIHsKICAgICAgICAgd2Vla2RheXMgPSBBcnJheXMuY29weU9mKG5ld1dlZWtkYXlzLCBuZXdXZWVrZGF5cy5sZW5ndGgpOworICAgICAgICBjYWNoZWRIYXNoQ29kZSA9IDA7CiAgICAgfQogCiAgICAgLyoqCkBAIC00NTgsNiArNDYzLDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRTaG9ydFdlZWtkYXlzKFN0cmluZ1tdIG5ld1Nob3J0V2Vla2RheXMpIHsKICAgICAgICAgc2hvcnRXZWVrZGF5cyA9IEFycmF5cy5jb3B5T2YobmV3U2hvcnRXZWVrZGF5cywgbmV3U2hvcnRXZWVrZGF5cy5sZW5ndGgpOworICAgICAgICBjYWNoZWRIYXNoQ29kZSA9IDA7CiAgICAgfQogCiAgICAgLyoqCkBAIC00NzQsNiArNDgwLDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRBbVBtU3RyaW5ncyhTdHJpbmdbXSBuZXdBbXBtcykgewogICAgICAgICBhbXBtcyA9IEFycmF5cy5jb3B5T2YobmV3QW1wbXMsIG5ld0FtcG1zLmxlbmd0aCk7CisgICAgICAgIGNhY2hlZEhhc2hDb2RlID0gMDsKICAgICB9CiAKICAgICAvKioKQEAgLTU1OCw2ICs1NjUsNyBAQAogICAgICAgICB9CiAgICAgICAgIHpvbmVTdHJpbmdzID0gYUNvcHk7CiAgICAgICAgIGlzWm9uZVN0cmluZ3NTZXQgPSB0cnVlOworICAgICAgICBjYWNoZWRIYXNoQ29kZSA9IDA7CiAgICAgfQogCiAgICAgLyoqCkBAIC01NzYsNiArNTg0LDcgQEAKICAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbFBhdHRlcm5DaGFycyhTdHJpbmcgbmV3TG9jYWxQYXR0ZXJuQ2hhcnMpIHsKICAgICAgICAgLy8gQ2FsbCB0b1N0cmluZygpIHRvIHRocm93IGFuIE5QRSBpbiBjYXNlIHRoZSBhcmd1bWVudCBpcyBudWxsCiAgICAgICAgIGxvY2FsUGF0dGVybkNoYXJzID0gbmV3TG9jYWxQYXR0ZXJuQ2hhcnMudG9TdHJpbmcoKTsKKyAgICAgICAgY2FjaGVkSGFzaENvZGUgPSAwOwogICAgIH0KIAogICAgIC8qKgpAQCAtNTk3LDEyICs2MDYsMjMgQEAKICAgICAgKiBPdmVycmlkZSBoYXNoQ29kZS4KICAgICAgKiBHZW5lcmF0ZXMgYSBoYXNoIGNvZGUgZm9yIHRoZSBEYXRlRm9ybWF0U3ltYm9scyBvYmplY3QuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgaW50IGhhc2hjb2RlID0gMDsKLSAgICAgICAgU3RyaW5nW11bXSB6b25lU3RyaW5ncyA9IGdldFpvbmVTdHJpbmdzV3JhcHBlcigpOwotICAgICAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgem9uZVN0cmluZ3NbMF0ubGVuZ3RoOyArK2luZGV4KQotICAgICAgICAgICAgaGFzaGNvZGUgXj0gem9uZVN0cmluZ3NbMF1baW5kZXhdLmhhc2hDb2RlKCk7Ci0gICAgICAgIHJldHVybiBoYXNoY29kZTsKKyAgICAgICAgaW50IGhhc2hDb2RlID0gY2FjaGVkSGFzaENvZGU7CisgICAgICAgIGlmIChoYXNoQ29kZSA9PSAwKSB7CisgICAgICAgICAgICBoYXNoQ29kZSA9IDU7CisgICAgICAgICAgICBoYXNoQ29kZSA9IDExICogaGFzaENvZGUgKyBBcnJheXMuaGFzaENvZGUoZXJhcyk7CisgICAgICAgICAgICBoYXNoQ29kZSA9IDExICogaGFzaENvZGUgKyBBcnJheXMuaGFzaENvZGUobW9udGhzKTsKKyAgICAgICAgICAgIGhhc2hDb2RlID0gMTEgKiBoYXNoQ29kZSArIEFycmF5cy5oYXNoQ29kZShzaG9ydE1vbnRocyk7CisgICAgICAgICAgICBoYXNoQ29kZSA9IDExICogaGFzaENvZGUgKyBBcnJheXMuaGFzaENvZGUod2Vla2RheXMpOworICAgICAgICAgICAgaGFzaENvZGUgPSAxMSAqIGhhc2hDb2RlICsgQXJyYXlzLmhhc2hDb2RlKHNob3J0V2Vla2RheXMpOworICAgICAgICAgICAgaGFzaENvZGUgPSAxMSAqIGhhc2hDb2RlICsgQXJyYXlzLmhhc2hDb2RlKGFtcG1zKTsKKyAgICAgICAgICAgIGhhc2hDb2RlID0gMTEgKiBoYXNoQ29kZSArIEFycmF5cy5kZWVwSGFzaENvZGUoZ2V0Wm9uZVN0cmluZ3NXcmFwcGVyKCkpOworICAgICAgICAgICAgaGFzaENvZGUgPSAxMSAqIGhhc2hDb2RlICsgT2JqZWN0cy5oYXNoQ29kZShsb2NhbFBhdHRlcm5DaGFycyk7CisgICAgICAgICAgICBjYWNoZWRIYXNoQ29kZSA9IGhhc2hDb2RlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGhhc2hDb2RlOwogICAgIH0KIAogICAgIC8qKgpAQCAtNjQxLDYgKzY2MSwxMSBAQAogCiAgICAgcHJpdmF0ZSB0cmFuc2llbnQgaW50IGxhc3Rab25lSW5kZXggPSAwOwogCisgICAgLyoqCisgICAgICogQ2FjaGVkIGhhc2ggY29kZQorICAgICAqLworICAgIHRyYW5zaWVudCB2b2xhdGlsZSBpbnQgY2FjaGVkSGFzaENvZGUgPSAwOworCiAgICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVEYXRhKExvY2FsZSBkZXNpcmVkTG9jYWxlKSB7CiAgICAgICAgIGxvY2FsZSA9IGRlc2lyZWRMb2NhbGU7CiAKQEAgLTc4Miw2ICs4MDcsNyBAQAogICAgICAgICAgICAgZHN0LnpvbmVTdHJpbmdzID0gbnVsbDsKICAgICAgICAgfQogICAgICAgICBkc3QubG9jYWxQYXR0ZXJuQ2hhcnMgPSBzcmMubG9jYWxQYXR0ZXJuQ2hhcnM7CisgICAgICAgIGRzdC5jYWNoZWRIYXNoQ29kZSA9IDA7CiAgICAgfQogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS91dGlsL0hhc2h0YWJsZS5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvdXRpbC9IYXNodGFibGUuamF2YQppbmRleCBmODJjMzAwLi43ODViMjY2IDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS91dGlsL0hhc2h0YWJsZS5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3V0aWwvSGFzaHRhYmxlLmphdmEKQEAgLTEwNTksNyArMTA1OSw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICAgICAgcmV0dXJuIGhhc2ggXiAodmFsdWU9PW51bGwgPyAwIDogdmFsdWUuaGFzaENvZGUoKSk7CisgICAgICAgICAgICByZXR1cm4gKE9iamVjdHMuaGFzaENvZGUoa2V5KSBeIE9iamVjdHMuaGFzaENvZGUodmFsdWUpKTsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS91dGlsL1Byb3BlcnRpZXMuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3V0aWwvUHJvcGVydGllcy5qYXZhCmluZGV4IGM4YmRhYjcuLmUwODQ0NzkgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3V0aWwvUHJvcGVydGllcy5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3V0aWwvUHJvcGVydGllcy5qYXZhCkBAIC04MSw4ICs4MSw5IEBACiAgKiA8cD4gVGhlIHtAbGluayAjbG9hZEZyb21YTUwoSW5wdXRTdHJlYW0pfSBhbmQge0BsaW5rCiAgKiAjc3RvcmVUb1hNTChPdXRwdXRTdHJlYW0sIFN0cmluZywgU3RyaW5nKX0gbWV0aG9kcyBsb2FkIGFuZCBzdG9yZSBwcm9wZXJ0aWVzCiAgKiBpbiBhIHNpbXBsZSBYTUwgZm9ybWF0LiAgQnkgZGVmYXVsdCB0aGUgVVRGLTggY2hhcmFjdGVyIGVuY29kaW5nIGlzIHVzZWQsCi0gKiBob3dldmVyIGEgc3BlY2lmaWMgZW5jb2RpbmcgbWF5IGJlIHNwZWNpZmllZCBpZiByZXF1aXJlZC4gIEFuIFhNTCBwcm9wZXJ0aWVzCi0gKiBkb2N1bWVudCBoYXMgdGhlIGZvbGxvd2luZyBET0NUWVBFIGRlY2xhcmF0aW9uOgorICogaG93ZXZlciBhIHNwZWNpZmljIGVuY29kaW5nIG1heSBiZSBzcGVjaWZpZWQgaWYgcmVxdWlyZWQuIEltcGxlbWVudGF0aW9ucworICogYXJlIHJlcXVpcmVkIHRvIHN1cHBvcnQgVVRGLTggYW5kIFVURi0xNiBhbmQgbWF5IHN1cHBvcnQgb3RoZXIgZW5jb2RpbmdzLgorICogQW4gWE1MIHByb3BlcnRpZXMgZG9jdW1lbnQgaGFzIHRoZSBmb2xsb3dpbmcgRE9DVFlQRSBkZWNsYXJhdGlvbjoKICAqCiAgKiA8cHJlPgogICogJmx0OyFET0NUWVBFIHByb3BlcnRpZXMgU1lTVEVNICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC9wcm9wZXJ0aWVzLmR0ZCImZ3Q7CkBAIC04NTMsMjMgKzg1NCwzMCBAQAogICAgICAqIEZ1cnRoZXJtb3JlLCB0aGUgZG9jdW1lbnQgbXVzdCBzYXRpc2Z5IHRoZSBwcm9wZXJ0aWVzIERURCBkZXNjcmliZWQKICAgICAgKiBhYm92ZS4KICAgICAgKgorICAgICAqIDxwPiBBbiBpbXBsZW1lbnRhdGlvbiBpcyByZXF1aXJlZCB0byByZWFkIFhNTCBkb2N1bWVudHMgdGhhdCB1c2UgdGhlCisgICAgICogIntAY29kZSBVVEYtOH0iIG9yICJ7QGNvZGUgVVRGLTE2fSIgZW5jb2RpbmcuIEFuIGltcGxlbWVudGF0aW9uIG1heQorICAgICAqIHN1cHBvcnQgYWRkaXRpb25hbCBlbmNvZGluZ3MuCisgICAgICoKICAgICAgKiA8cD5UaGUgc3BlY2lmaWVkIHN0cmVhbSBpcyBjbG9zZWQgYWZ0ZXIgdGhpcyBtZXRob2QgcmV0dXJucy4KICAgICAgKgogICAgICAqIEBwYXJhbSBpbiB0aGUgaW5wdXQgc3RyZWFtIGZyb20gd2hpY2ggdG8gcmVhZCB0aGUgWE1MIGRvY3VtZW50LgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgcmVhZGluZyBmcm9tIHRoZSBzcGVjaWZpZWQgaW5wdXQgc3RyZWFtCiAgICAgICogICAgICAgICByZXN1bHRzIGluIGFuIDx0dD5JT0V4Y2VwdGlvbjwvdHQ+LgorICAgICAqIEB0aHJvd3MgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGlmIHRoZSBkb2N1bWVudCdzIGVuY29kaW5nCisgICAgICogICAgICAgICBkZWNsYXJhdGlvbiBjYW4gYmUgcmVhZCBhbmQgaXQgc3BlY2lmaWVzIGFuIGVuY29kaW5nIHRoYXQgaXMgbm90CisgICAgICogICAgICAgICBzdXBwb3J0ZWQKICAgICAgKiBAdGhyb3dzIEludmFsaWRQcm9wZXJ0aWVzRm9ybWF0RXhjZXB0aW9uIERhdGEgb24gaW5wdXQgc3RyZWFtIGRvZXMgbm90CiAgICAgICogICAgICAgICBjb25zdGl0dXRlIGEgdmFsaWQgWE1MIGRvY3VtZW50IHdpdGggdGhlIG1hbmRhdGVkIGRvY3VtZW50IHR5cGUuCiAgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB7QGNvZGUgaW59IGlzIG51bGwuCiAgICAgICogQHNlZSAgICAjc3RvcmVUb1hNTChPdXRwdXRTdHJlYW0sIFN0cmluZywgU3RyaW5nKQorICAgICAqIEBzZWUgICAgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLXhtbC8jY2hhcmVuY29kaW5nIj5DaGFyYWN0ZXIKKyAgICAgKiAgICAgICAgIEVuY29kaW5nIGluIEVudGl0aWVzPC9hPgogICAgICAqIEBzaW5jZSAxLjUKICAgICAgKi8KICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgbG9hZEZyb21YTUwoSW5wdXRTdHJlYW0gaW4pCiAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgSW52YWxpZFByb3BlcnRpZXNGb3JtYXRFeGNlcHRpb24KICAgICB7Ci0gICAgICAgIGlmIChpbiA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0gICAgICAgIFhtbFN1cHBvcnQubG9hZCh0aGlzLCBpbik7CisgICAgICAgIFhtbFN1cHBvcnQubG9hZCh0aGlzLCBPYmplY3RzLnJlcXVpcmVOb25OdWxsKGluKSk7CiAgICAgICAgIGluLmNsb3NlKCk7CiAgICAgfQogCkBAIC04OTYsOCArOTA0LDYgQEAKICAgICBwdWJsaWMgdm9pZCBzdG9yZVRvWE1MKE91dHB1dFN0cmVhbSBvcywgU3RyaW5nIGNvbW1lbnQpCiAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgaWYgKG9zID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKICAgICAgICAgc3RvcmVUb1hNTChvcywgY29tbWVudCwgIlVURi04Iik7CiAgICAgfQogCkBAIC05MTAsOSArOTE2LDEzIEBACiAgICAgICogJmx0OyFET0NUWVBFIHByb3BlcnRpZXMgU1lTVEVNICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC9wcm9wZXJ0aWVzLmR0ZCImZ3Q7CiAgICAgICogPC9wcmU+CiAgICAgICoKLSAgICAgKjxwPklmIHRoZSBzcGVjaWZpZWQgY29tbWVudCBpcyB7QGNvZGUgbnVsbH0gdGhlbiBubyBjb21tZW50CisgICAgICogPHA+SWYgdGhlIHNwZWNpZmllZCBjb21tZW50IGlzIHtAY29kZSBudWxsfSB0aGVuIG5vIGNvbW1lbnQKICAgICAgKiB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgZG9jdW1lbnQuCiAgICAgICoKKyAgICAgKiA8cD4gQW4gaW1wbGVtZW50YXRpb24gaXMgcmVxdWlyZWQgdG8gc3VwcG9ydCB3cml0aW5nIG9mIFhNTCBkb2N1bWVudHMKKyAgICAgKiB0aGF0IHVzZSB0aGUgIntAY29kZSBVVEYtOH0iIG9yICJ7QGNvZGUgVVRGLTE2fSIgZW5jb2RpbmcuIEFuCisgICAgICogaW1wbGVtZW50YXRpb24gbWF5IHN1cHBvcnQgYWRkaXRpb25hbCBlbmNvZGluZ3MuCisgICAgICoKICAgICAgKiA8cD5UaGUgc3BlY2lmaWVkIHN0cmVhbSByZW1haW5zIG9wZW4gYWZ0ZXIgdGhpcyBtZXRob2QgcmV0dXJucy4KICAgICAgKgogICAgICAqIEBwYXJhbSBvcyAgICAgICAgdGhlIG91dHB1dCBzdHJlYW0gb24gd2hpY2ggdG8gZW1pdCB0aGUgWE1MIGRvY3VtZW50LgpAQCAtOTI0LDIwICs5MzQsMjMgQEAKICAgICAgKgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgd3JpdGluZyB0byB0aGUgc3BlY2lmaWVkIG91dHB1dCBzdHJlYW0KICAgICAgKiAgICAgICAgIHJlc3VsdHMgaW4gYW4gPHR0PklPRXhjZXB0aW9uPC90dD4uCisgICAgICogQHRocm93cyBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gaWYgdGhlIGVuY29kaW5nIGlzIG5vdAorICAgICAqICAgICAgICAgc3VwcG9ydGVkIGJ5IHRoZSBpbXBsZW1lbnRhdGlvbi4KICAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHtAY29kZSBvc30gaXMge0Bjb2RlIG51bGx9LAogICAgICAqICAgICAgICAgb3IgaWYge0Bjb2RlIGVuY29kaW5nfSBpcyB7QGNvZGUgbnVsbH0uCiAgICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gIGlmIHRoaXMge0Bjb2RlIFByb3BlcnRpZXN9IG9iamVjdAogICAgICAqICAgICAgICAgY29udGFpbnMgYW55IGtleXMgb3IgdmFsdWVzIHRoYXQgYXJlIG5vdAogICAgICAqICAgICAgICAge0Bjb2RlIFN0cmluZ3N9LgogICAgICAqIEBzZWUgICAgI2xvYWRGcm9tWE1MKElucHV0U3RyZWFtKQorICAgICAqIEBzZWUgICAgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLXhtbC8jY2hhcmVuY29kaW5nIj5DaGFyYWN0ZXIKKyAgICAgKiAgICAgICAgIEVuY29kaW5nIGluIEVudGl0aWVzPC9hPgogICAgICAqIEBzaW5jZSAxLjUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzdG9yZVRvWE1MKE91dHB1dFN0cmVhbSBvcywgU3RyaW5nIGNvbW1lbnQsIFN0cmluZyBlbmNvZGluZykKICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewotICAgICAgICBpZiAob3MgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotICAgICAgICBYbWxTdXBwb3J0LnNhdmUodGhpcywgb3MsIGNvbW1lbnQsIGVuY29kaW5nKTsKKyAgICAgICAgWG1sU3VwcG9ydC5zYXZlKHRoaXMsIE9iamVjdHMucmVxdWlyZU5vbk51bGwob3MpLCBjb21tZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0cy5yZXF1aXJlTm9uTnVsbChlbmNvZGluZykpOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvdXRpbC9TZXJ2aWNlTG9hZGVyLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS91dGlsL1NlcnZpY2VMb2FkZXIuamF2YQppbmRleCAwNjc1MzdhLi4wMWE1ZjQ0IDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS91dGlsL1NlcnZpY2VMb2FkZXIuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS91dGlsL1NlcnZpY2VMb2FkZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIxNCw3ICsyMTQsNyBAQAogCiAgICAgcHJpdmF0ZSBTZXJ2aWNlTG9hZGVyKENsYXNzPFM+IHN2YywgQ2xhc3NMb2FkZXIgY2wpIHsKICAgICAgICAgc2VydmljZSA9IE9iamVjdHMucmVxdWlyZU5vbk51bGwoc3ZjLCAiU2VydmljZSBpbnRlcmZhY2UgY2Fubm90IGJlIG51bGwiKTsKLSAgICAgICAgbG9hZGVyID0gY2w7CisgICAgICAgIGxvYWRlciA9IChjbCA9PSBudWxsKSA/IENsYXNzTG9hZGVyLmdldFN5c3RlbUNsYXNzTG9hZGVyKCkgOiBjbDsKICAgICAgICAgcmVsb2FkKCk7CiAgICAgfQogCkBAIC0zNTgsMTQgKzM1OCwyMSBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgU3RyaW5nIGNuID0gbmV4dE5hbWU7CiAgICAgICAgICAgICBuZXh0TmFtZSA9IG51bGw7CisgICAgICAgICAgICBDbGFzczw/PiBjID0gbnVsbDsKICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgUyBwID0gc2VydmljZS5jYXN0KENsYXNzLmZvck5hbWUoY24sIHRydWUsIGxvYWRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm5ld0luc3RhbmNlKCkpOwotICAgICAgICAgICAgICAgIHByb3ZpZGVycy5wdXQoY24sIHApOwotICAgICAgICAgICAgICAgIHJldHVybiBwOworICAgICAgICAgICAgICAgIGMgPSBDbGFzcy5mb3JOYW1lKGNuLCBmYWxzZSwgbG9hZGVyKTsKICAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24geCkgewogICAgICAgICAgICAgICAgIGZhaWwoc2VydmljZSwKICAgICAgICAgICAgICAgICAgICAgICJQcm92aWRlciAiICsgY24gKyAiIG5vdCBmb3VuZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFzZXJ2aWNlLmlzQXNzaWduYWJsZUZyb20oYykpIHsKKyAgICAgICAgICAgICAgICBmYWlsKHNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAiUHJvdmlkZXIgIiArIGNuICArICIgbm90IGEgc3VidHlwZSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBTIHAgPSBzZXJ2aWNlLmNhc3QoYy5uZXdJbnN0YW5jZSgpKTsKKyAgICAgICAgICAgICAgICBwcm92aWRlcnMucHV0KGNuLCBwKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcDsKICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB4KSB7CiAgICAgICAgICAgICAgICAgZmFpbChzZXJ2aWNlLAogICAgICAgICAgICAgICAgICAgICAgIlByb3ZpZGVyICIgKyBjbiArICIgY291bGQgbm90IGJlIGluc3RhbnRpYXRlZDogIiArIHgsCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS91dGlsL1RpbWVab25lLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS91dGlsL1RpbWVab25lLmphdmEKaW5kZXggNjQ4MTkxYS4uMTNlZGU5YyAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvdXRpbC9UaW1lWm9uZS5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3V0aWwvVGltZVpvbmUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTYsIDIwMTEsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTcxOSwxNSArNzE5LDE2IEBACiAgICAgICogUmV0dXJucyB0aGUgZGVmYXVsdCBUaW1lWm9uZSBpbiBhbiBBcHBDb250ZXh0IGlmIGFueSBBcHBDb250ZXh0CiAgICAgICogaGFzIGV2ZXIgdXNlZC4gbnVsbCBpcyByZXR1cm5lZCBpZiBhbnkgQXBwQ29udGV4dCBoYXNuJ3QgYmVlbgogICAgICAqIHVzZWQgb3IgaWYgdGhlIEFwcENvbnRleHQgZG9lc24ndCBoYXZlIHRoZSBkZWZhdWx0IFRpbWVab25lLgorICAgICAqCisgICAgICogTm90ZSB0aGF0IGphdmFBV1RBY2Nlc3MgbWF5IGJlIG51bGwgaWYgc3VuLmF3dC5BcHBDb250ZXh0IGNsYXNzIGhhc24ndAorICAgICAqIGJlZW4gbG9hZGVkLiBJZiBzbywgaXQgaW1wbGllcyB0aGF0IEFXVFNlY3VyaXR5TWFuYWdlciBpcyBub3Qgb3VyCisgICAgICogU2VjdXJpdHlNYW5hZ2VyIGFuZCB3ZSBjYW4gdXNlIGEgbG9jYWwgc3RhdGljIHZhcmlhYmxlLgorICAgICAqIFRoaXMgd29ya3MgYXJvdW5kIGEgYnVpbGQgdGltZSBpc3N1ZS4KICAgICAgKi8KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCBzdGF0aWMgVGltZVpvbmUgZ2V0RGVmYXVsdEluQXBwQ29udGV4dCgpIHsKKyAgICBwcml2YXRlIHN0YXRpYyBUaW1lWm9uZSBnZXREZWZhdWx0SW5BcHBDb250ZXh0KCkgewogICAgICAgICAvLyBKYXZhQVdUQWNjZXNzIHByb3ZpZGVzIGFjY2VzcyBpbXBsZW1lbnRhdGlvbi1wcml2YXRlIG1ldGhvZHMgd2l0aG91dCB1c2luZyByZWZsZWN0aW9uLgogICAgICAgICBKYXZhQVdUQWNjZXNzIGphdmFBV1RBY2Nlc3MgPSBTaGFyZWRTZWNyZXRzLmdldEphdmFBV1RBY2Nlc3MoKTsKIAotICAgICAgICAvLyBOb3RlIHRoYXQgamF2YUFXVEFjY2VzcyBtYXkgYmUgbnVsbCBpZiBzdW4uYXd0LkFwcENvbnRleHQgY2xhc3MgaGFzbid0Ci0gICAgICAgIC8vIGJlZW4gbG9hZGVkLiBJZiBzbywgaXQgaW1wbGllcyB0aGF0IEFXVFNlY3VyaXR5TWFuYWdlciBpcyBub3Qgb3VyCi0gICAgICAgIC8vIFNlY3VyaXR5TWFuYWdlciBhbmQgd2UgY2FuIHVzZSBhIGxvY2FsIHN0YXRpYyB2YXJpYWJsZS4KLSAgICAgICAgLy8gVGhpcyB3b3JrcyBhcm91bmQgYSBidWlsZCB0aW1lIGlzc3VlLgogICAgICAgICBpZiAoamF2YUFXVEFjY2VzcyA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gbWFpbkFwcENvbnRleHREZWZhdWx0OwogICAgICAgICB9IGVsc2UgewpAQCAtNzQ5LDE1ICs3NTAsMTYgQEAKICAgICAgKiB0ei4gbnVsbCBpcyBoYW5kbGVkIHNwZWNpYWw6IGRvIG5vdGhpbmcgaWYgYW55IEFwcENvbnRleHQKICAgICAgKiBoYXNuJ3QgYmVlbiB1c2VkLCByZW1vdmUgdGhlIGRlZmF1bHQgVGltZVpvbmUgaW4gdGhlCiAgICAgICogQXBwQ29udGV4dCBvdGhlcndpc2UuCisgICAgICoKKyAgICAgKiBOb3RlIHRoYXQgamF2YUFXVEFjY2VzcyBtYXkgYmUgbnVsbCBpZiBzdW4uYXd0LkFwcENvbnRleHQgY2xhc3MgaGFzbid0CisgICAgICogYmVlbiBsb2FkZWQuIElmIHNvLCBpdCBpbXBsaWVzIHRoYXQgQVdUU2VjdXJpdHlNYW5hZ2VyIGlzIG5vdCBvdXIKKyAgICAgKiBTZWN1cml0eU1hbmFnZXIgYW5kIHdlIGNhbiB1c2UgYSBsb2NhbCBzdGF0aWMgdmFyaWFibGUuCisgICAgICogVGhpcyB3b3JrcyBhcm91bmQgYSBidWlsZCB0aW1lIGlzc3VlLgogICAgICAqLwotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHN0YXRpYyB2b2lkIHNldERlZmF1bHRJbkFwcENvbnRleHQoVGltZVpvbmUgdHopIHsKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHNldERlZmF1bHRJbkFwcENvbnRleHQoVGltZVpvbmUgdHopIHsKICAgICAgICAgLy8gSmF2YUFXVEFjY2VzcyBwcm92aWRlcyBhY2Nlc3MgaW1wbGVtZW50YXRpb24tcHJpdmF0ZSBtZXRob2RzIHdpdGhvdXQgdXNpbmcgcmVmbGVjdGlvbi4KICAgICAgICAgSmF2YUFXVEFjY2VzcyBqYXZhQVdUQWNjZXNzID0gU2hhcmVkU2VjcmV0cy5nZXRKYXZhQVdUQWNjZXNzKCk7CiAKLSAgICAgICAgLy8gTm90ZSB0aGF0IGphdmFBV1RBY2Nlc3MgbWF5IGJlIG51bGwgaWYgc3VuLmF3dC5BcHBDb250ZXh0IGNsYXNzIGhhc24ndAotICAgICAgICAvLyBiZWVuIGxvYWRlZC4gSWYgc28sIGl0IGltcGxpZXMgdGhhdCBBV1RTZWN1cml0eU1hbmFnZXIgaXMgbm90IG91cgotICAgICAgICAvLyBTZWN1cml0eU1hbmFnZXIgYW5kIHdlIGNhbiB1c2UgYSBsb2NhbCBzdGF0aWMgdmFyaWFibGUuCi0gICAgICAgIC8vIFRoaXMgd29ya3MgYXJvdW5kIGEgYnVpbGQgdGltZSBpc3N1ZS4KICAgICAgICAgaWYgKGphdmFBV1RBY2Nlc3MgPT0gbnVsbCkgewogICAgICAgICAgICAgbWFpbkFwcENvbnRleHREZWZhdWx0ID0gdHo7CiAgICAgICAgIH0gZWxzZSB7CkBAIC04MjIsNyArODI0LDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgICAgR01UX0lEX0xFTkdUSCA9IDM7CiAKICAgICAvLyBhIHN0YXRpYyBUaW1lWm9uZSB3ZSBjYW4gcmVmZXJlbmNlIGlmIG5vIEFwcENvbnRleHQgaXMgaW4gcGxhY2UKLSAgICBwcml2YXRlIHN0YXRpYyBUaW1lWm9uZSBtYWluQXBwQ29udGV4dERlZmF1bHQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgdm9sYXRpbGUgVGltZVpvbmUgbWFpbkFwcENvbnRleHREZWZhdWx0OwogCiAgICAgLyoqCiAgICAgICogUGFyc2VzIGEgY3VzdG9tIHRpbWUgem9uZSBpZGVudGlmaWVyIGFuZCByZXR1cm5zIGEgY29ycmVzcG9uZGluZyB6b25lLgpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvdXRpbC9jb25jdXJyZW50L0V4ZWN1dG9ycy5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvdXRpbC9jb25jdXJyZW50L0V4ZWN1dG9ycy5qYXZhCmluZGV4IDRmZjcxNDEuLjc4NzA4ZjggMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3V0aWwvY29uY3VycmVudC9FeGVjdXRvcnMuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS91dGlsL2NvbmN1cnJlbnQvRXhlY3V0b3JzLmphdmEKQEAgLTUzMCwxOCArNTMwLDE3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAogICAgICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjxUPigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBUIHJ1bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzTG9hZGVyIHNhdmVkY2wgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZCB0ID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc0xvYWRlciBjbCA9IHQuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjY2wgIT0gY2wpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuc2V0Q29udGV4dENsYXNzTG9hZGVyKGNjbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYXZlZGNsID0gY2w7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc0xvYWRlciBjbCA9IHQuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNjbCA9PSBjbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFzay5jYWxsKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNhdmVkY2wgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuc2V0Q29udGV4dENsYXNzTG9hZGVyKHNhdmVkY2wpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuc2V0Q29udGV4dENsYXNzTG9hZGVyKGNjbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFzay5jYWxsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnNldENvbnRleHRDbGFzc0xvYWRlcihjbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0sIGFjYyk7CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS91dGlsL2phci9QYWNrMjAwLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS91dGlsL2phci9QYWNrMjAwLmphdmEKaW5kZXggMGYyOGExNC4uNmYyNDRmMyAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvdXRpbC9qYXIvUGFjazIwMC5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3V0aWwvamFyL1BhY2syMDAuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtNDU2LDEyICs0NTYsMTIgQEAKICAgICAgICAgICogVGhlIHVucGFja2VyJ3MgcHJvZ3Jlc3MgYXMgYSBwZXJjZW50YWdlLCBhcyBwZXJpb2RpY2FsbHkKICAgICAgICAgICogdXBkYXRlZCBieSB0aGUgdW5wYWNrZXIuCiAgICAgICAgICAqIFZhbHVlcyBvZiAwIC0gMTAwIGFyZSBub3JtYWwsIGFuZCAtMSBpbmRpY2F0ZXMgYSBzdGFsbC4KLSAgICAgICAgICogT2JzZXJ2ZSB0aGlzIHByb3BlcnR5IHdpdGggYSB7QGxpbmsgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcn0uCisgICAgICAgICAqIFByb2dyZXNzIGNhbiBiZSBtb25pdG9yZWQgYnkgcG9sbGluZyB0aGUgdmFsdWUgb2YgdGhpcworICAgICAgICAgKiBwcm9wZXJ0eS4KICAgICAgICAgICogPHA+CiAgICAgICAgICAqIEF0IGEgbWluaW11bSwgdGhlIHVucGFja2VyIG11c3Qgc2V0IHByb2dyZXNzIHRvIDAKICAgICAgICAgICogYXQgdGhlIGJlZ2lubmluZyBvZiBhIHBhY2tpbmcgb3BlcmF0aW9uLCBhbmQgdG8gMTAwCiAgICAgICAgICAqIGF0IHRoZSBlbmQuCi0gICAgICAgICAqIEBzZWUgICNhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyCiAgICAgICAgICAqLwogICAgICAgICBTdHJpbmcgUFJPR1JFU1MgICAgICAgICAgICAgICAgID0gInBhY2sucHJvZ3Jlc3MiOwogCkBAIC01NzcsNyArNTc3LDE1IEBACiAgICAgICAgICAqIEBzZWUgI3Byb3BlcnRpZXMKICAgICAgICAgICogQHNlZSAjUFJPR1JFU1MKICAgICAgICAgICogQHBhcmFtIGxpc3RlbmVyICBBbiBvYmplY3QgdG8gYmUgaW52b2tlZCB3aGVuIGEgcHJvcGVydHkgaXMgY2hhbmdlZC4KKyAgICAgICAgICogQGRlcHJlY2F0ZWQgVGhlIGRlcGVuZGVuY3kgb24ge0Bjb2RlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJ9IGNyZWF0ZXMKKyAgICAgICAgICogICAgICAgICAgICAgYSBzaWduaWZpY2FudCBpbXBlZGltZW50IHRvIGZ1dHVyZSBtb2R1bGFyaXphdGlvbiBvZiB0aGUKKyAgICAgICAgICogICAgICAgICAgICAgSmF2YSBwbGF0Zm9ybS4gVGhpcyBtZXRob2Qgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlCisgICAgICAgICAqICAgICAgICAgICAgIHJlbGVhc2UuCisgICAgICAgICAqICAgICAgICAgICAgIEFwcGxpY2F0aW9ucyB0aGF0IG5lZWQgdG8gbW9uaXRvciBwcm9ncmVzcyBvZiB0aGUgcGFja2VyCisgICAgICAgICAqICAgICAgICAgICAgIGNhbiBwb2xsIHRoZSB2YWx1ZSBvZiB0aGUge0BsaW5rICNQUk9HUkVTUyBQUk9HUkVTU30KKyAgICAgICAgICogICAgICAgICAgICAgcHJvcGVydHkgaW5zdGVhZC4KICAgICAgICAgICovCisgICAgICAgIEBEZXByZWNhdGVkCiAgICAgICAgIHZvaWQgYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSA7CiAKICAgICAgICAgLyoqCkBAIC01ODYsNyArNTk0LDEyIEBACiAgICAgICAgICAqCiAgICAgICAgICAqIEBzZWUgI2FkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIKICAgICAgICAgICogQHBhcmFtIGxpc3RlbmVyICBUaGUgUHJvcGVydHlDaGFuZ2UgbGlzdGVuZXIgdG8gYmUgcmVtb3ZlZC4KKyAgICAgICAgICogQGRlcHJlY2F0ZWQgVGhlIGRlcGVuZGVuY3kgb24ge0Bjb2RlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJ9IGNyZWF0ZXMKKyAgICAgICAgICogICAgICAgICAgICAgYSBzaWduaWZpY2FudCBpbXBlZGltZW50IHRvIGZ1dHVyZSBtb2R1bGFyaXphdGlvbiBvZiB0aGUKKyAgICAgICAgICogICAgICAgICAgICAgSmF2YSBwbGF0Zm9ybS4gVGhpcyBtZXRob2Qgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlCisgICAgICAgICAqICAgICAgICAgICAgIHJlbGVhc2UuCiAgICAgICAgICAqLworICAgICAgICBARGVwcmVjYXRlZAogICAgICAgICB2b2lkIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcik7CiAKICAgICB9CkBAIC02NDAsMTIgKzY1MywxMiBAQAogICAgICAgICAgKiBUaGUgdW5wYWNrZXIncyBwcm9ncmVzcyBhcyBhIHBlcmNlbnRhZ2UsIGFzIHBlcmlvZGljYWxseQogICAgICAgICAgKiB1cGRhdGVkIGJ5IHRoZSB1bnBhY2tlci4KICAgICAgICAgICogVmFsdWVzIG9mIDAgLSAxMDAgYXJlIG5vcm1hbCwgYW5kIC0xIGluZGljYXRlcyBhIHN0YWxsLgotICAgICAgICAgKiBPYnNlcnZlIHRoaXMgcHJvcGVydHkgd2l0aCBhIHtAbGluayBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyfS4KKyAgICAgICAgICogUHJvZ3Jlc3MgY2FuIGJlIG1vbml0b3JlZCBieSBwb2xsaW5nIHRoZSB2YWx1ZSBvZiB0aGlzCisgICAgICAgICAqIHByb3BlcnR5LgogICAgICAgICAgKiA8cD4KICAgICAgICAgICogQXQgYSBtaW5pbXVtLCB0aGUgdW5wYWNrZXIgbXVzdCBzZXQgcHJvZ3Jlc3MgdG8gMAogICAgICAgICAgKiBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgcGFja2luZyBvcGVyYXRpb24sIGFuZCB0byAxMDAKICAgICAgICAgICogYXQgdGhlIGVuZC4KLSAgICAgICAgICogQHNlZSAjYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcgogICAgICAgICAgKi8KICAgICAgICAgU3RyaW5nIFBST0dSRVNTICAgICAgICAgPSAidW5wYWNrLnByb2dyZXNzIjsKIApAQCAtNzA4LDcgKzcyMSwxNSBAQAogICAgICAgICAgKiBAc2VlICNwcm9wZXJ0aWVzCiAgICAgICAgICAqIEBzZWUgI1BST0dSRVNTCiAgICAgICAgICAqIEBwYXJhbSBsaXN0ZW5lciAgQW4gb2JqZWN0IHRvIGJlIGludm9rZWQgd2hlbiBhIHByb3BlcnR5IGlzIGNoYW5nZWQuCisgICAgICAgICAqIEBkZXByZWNhdGVkIFRoZSBkZXBlbmRlbmN5IG9uIHtAY29kZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyfSBjcmVhdGVzCisgICAgICAgICAqICAgICAgICAgICAgIGEgc2lnbmlmaWNhbnQgaW1wZWRpbWVudCB0byBmdXR1cmUgbW9kdWxhcml6YXRpb24gb2YgdGhlCisgICAgICAgICAqICAgICAgICAgICAgIEphdmEgcGxhdGZvcm0uIFRoaXMgbWV0aG9kIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZQorICAgICAgICAgKiAgICAgICAgICAgICByZWxlYXNlLgorICAgICAgICAgKiAgICAgICAgICAgICBBcHBsaWNhdGlvbnMgdGhhdCBuZWVkIHRvIG1vbml0b3IgcHJvZ3Jlc3Mgb2YgdGhlCisgICAgICAgICAqICAgICAgICAgICAgIHVucGFja2VyIGNhbiBwb2xsIHRoZSB2YWx1ZSBvZiB0aGUge0BsaW5rICNQUk9HUkVTUworICAgICAgICAgKiAgICAgICAgICAgICBQUk9HUkVTU30gcHJvcGVydHkgaW5zdGVhZC4KICAgICAgICAgICovCisgICAgICAgIEBEZXByZWNhdGVkCiAgICAgICAgIHZvaWQgYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSA7CiAKICAgICAgICAgLyoqCkBAIC03MTcsNyArNzM4LDEyIEBACiAgICAgICAgICAqCiAgICAgICAgICAqIEBzZWUgI2FkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIKICAgICAgICAgICogQHBhcmFtIGxpc3RlbmVyICBUaGUgUHJvcGVydHlDaGFuZ2UgbGlzdGVuZXIgdG8gYmUgcmVtb3ZlZC4KKyAgICAgICAgICogQGRlcHJlY2F0ZWQgVGhlIGRlcGVuZGVuY3kgb24ge0Bjb2RlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJ9IGNyZWF0ZXMKKyAgICAgICAgICogICAgICAgICAgICAgYSBzaWduaWZpY2FudCBpbXBlZGltZW50IHRvIGZ1dHVyZSBtb2R1bGFyaXphdGlvbiBvZiB0aGUKKyAgICAgICAgICogICAgICAgICAgICAgSmF2YSBwbGF0Zm9ybS4gVGhpcyBtZXRob2Qgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlCisgICAgICAgICAqICAgICAgICAgICAgIHJlbGVhc2UuCiAgICAgICAgICAqLworICAgICAgICBARGVwcmVjYXRlZAogICAgICAgICB2b2lkIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcik7CiAgICAgfQogCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS91dGlsL2xvZ2dpbmcvRmlsZUhhbmRsZXIuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3V0aWwvbG9nZ2luZy9GaWxlSGFuZGxlci5qYXZhCmluZGV4IGZiM2I2N2MuLmI5YTVkNzMgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3V0aWwvbG9nZ2luZy9GaWxlSGFuZGxlci5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3V0aWwvbG9nZ2luZy9GaWxlSGFuZGxlci5qYXZhCkBAIC0yMjAsNyArMjIwLDcgQEAKICAgICAgKiBAZXhjZXB0aW9uICBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBwYXR0ZXJuIHByb3BlcnR5IGlzIGFuIGVtcHR5IFN0cmluZy4KICAgICAgKi8KICAgICBwdWJsaWMgRmlsZUhhbmRsZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFNlY3VyaXR5RXhjZXB0aW9uIHsKLSAgICAgICAgY2hlY2tBY2Nlc3MoKTsKKyAgICAgICAgY2hlY2tQZXJtaXNzaW9uKCk7CiAgICAgICAgIGNvbmZpZ3VyZSgpOwogICAgICAgICBvcGVuRmlsZXMoKTsKICAgICB9CkBAIC0yNDYsNyArMjQ2LDcgQEAKICAgICAgICAgaWYgKHBhdHRlcm4ubGVuZ3RoKCkgPCAxICkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwogICAgICAgICB9Ci0gICAgICAgIGNoZWNrQWNjZXNzKCk7CisgICAgICAgIGNoZWNrUGVybWlzc2lvbigpOwogICAgICAgICBjb25maWd1cmUoKTsKICAgICAgICAgdGhpcy5wYXR0ZXJuID0gcGF0dGVybjsKICAgICAgICAgdGhpcy5saW1pdCA9IDA7CkBAIC0yNzgsNyArMjc4LDcgQEAKICAgICAgICAgaWYgKHBhdHRlcm4ubGVuZ3RoKCkgPCAxICkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwogICAgICAgICB9Ci0gICAgICAgIGNoZWNrQWNjZXNzKCk7CisgICAgICAgIGNoZWNrUGVybWlzc2lvbigpOwogICAgICAgICBjb25maWd1cmUoKTsKICAgICAgICAgdGhpcy5wYXR0ZXJuID0gcGF0dGVybjsKICAgICAgICAgdGhpcy5saW1pdCA9IDA7CkBAIC0zMTUsNyArMzE1LDcgQEAKICAgICAgICAgaWYgKGxpbWl0IDwgMCB8fCBjb3VudCA8IDEgfHwgcGF0dGVybi5sZW5ndGgoKSA8IDEpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKICAgICAgICAgfQotICAgICAgICBjaGVja0FjY2VzcygpOworICAgICAgICBjaGVja1Blcm1pc3Npb24oKTsKICAgICAgICAgY29uZmlndXJlKCk7CiAgICAgICAgIHRoaXMucGF0dGVybiA9IHBhdHRlcm47CiAgICAgICAgIHRoaXMubGltaXQgPSBsaW1pdDsKQEAgLTM1NCw3ICszNTQsNyBAQAogICAgICAgICBpZiAobGltaXQgPCAwIHx8IGNvdW50IDwgMSB8fCBwYXR0ZXJuLmxlbmd0aCgpIDwgMSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwogICAgICAgICB9Ci0gICAgICAgIGNoZWNrQWNjZXNzKCk7CisgICAgICAgIGNoZWNrUGVybWlzc2lvbigpOwogICAgICAgICBjb25maWd1cmUoKTsKICAgICAgICAgdGhpcy5wYXR0ZXJuID0gcGF0dGVybjsKICAgICAgICAgdGhpcy5saW1pdCA9IGxpbWl0OwpAQCAtMzY3LDcgKzM2Nyw3IEBACiAgICAgLy8gY29uZmlndXJlZCBpbnN0YW5jZSB2YXJpYWJsZXMuCiAgICAgcHJpdmF0ZSB2b2lkIG9wZW5GaWxlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIExvZ01hbmFnZXIgbWFuYWdlciA9IExvZ01hbmFnZXIuZ2V0TG9nTWFuYWdlcigpOwotICAgICAgICBtYW5hZ2VyLmNoZWNrQWNjZXNzKCk7CisgICAgICAgIG1hbmFnZXIuY2hlY2tQZXJtaXNzaW9uKCk7CiAgICAgICAgIGlmIChjb3VudCA8IDEpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZmlsZSBjb3VudCA9ICIgKyBjb3VudCk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3V0aWwvbG9nZ2luZy9IYW5kbGVyLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS91dGlsL2xvZ2dpbmcvSGFuZGxlci5qYXZhCmluZGV4IDEzMTdiNTcuLmZkMDRjMmMgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3V0aWwvbG9nZ2luZy9IYW5kbGVyLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvdXRpbC9sb2dnaW5nL0hhbmRsZXIuamF2YQpAQCAtMTExLDcgKzExMSw3IEBACiAgICAgICogICAgICAgICAgICAgdGhlIGNhbGxlciBkb2VzIG5vdCBoYXZlIDx0dD5Mb2dnaW5nUGVybWlzc2lvbigiY29udHJvbCIpPC90dD4uCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0Rm9ybWF0dGVyKEZvcm1hdHRlciBuZXdGb3JtYXR0ZXIpIHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiB7Ci0gICAgICAgIGNoZWNrQWNjZXNzKCk7CisgICAgICAgIGNoZWNrUGVybWlzc2lvbigpOwogICAgICAgICAvLyBDaGVjayBmb3IgYSBudWxsIHBvaW50ZXI6CiAgICAgICAgIG5ld0Zvcm1hdHRlci5nZXRDbGFzcygpOwogICAgICAgICBmb3JtYXR0ZXIgPSBuZXdGb3JtYXR0ZXI7CkBAIC0xNDAsNyArMTQwLDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRFbmNvZGluZyhTdHJpbmcgZW5jb2RpbmcpCiAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24sIGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIGNoZWNrQWNjZXNzKCk7CisgICAgICAgIGNoZWNrUGVybWlzc2lvbigpOwogICAgICAgICBpZiAoZW5jb2RpbmcgIT0gbnVsbCkgewogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBpZighamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0LmlzU3VwcG9ydGVkKGVuY29kaW5nKSkgewpAQCAtMTc1LDcgKzE3NSw3IEBACiAgICAgICogICAgICAgICAgICAgdGhlIGNhbGxlciBkb2VzIG5vdCBoYXZlIDx0dD5Mb2dnaW5nUGVybWlzc2lvbigiY29udHJvbCIpPC90dD4uCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RmlsdGVyKEZpbHRlciBuZXdGaWx0ZXIpIHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiB7Ci0gICAgICAgIGNoZWNrQWNjZXNzKCk7CisgICAgICAgIGNoZWNrUGVybWlzc2lvbigpOwogICAgICAgICBmaWx0ZXIgPSBuZXdGaWx0ZXI7CiAgICAgfQogCkBAIC0xOTksNyArMTk5LDcgQEAKICAgICAgKiAgICAgICAgICAgICB0aGUgY2FsbGVyIGRvZXMgbm90IGhhdmUgPHR0PkxvZ2dpbmdQZXJtaXNzaW9uKCJjb250cm9sIik8L3R0Pi4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRFcnJvck1hbmFnZXIoRXJyb3JNYW5hZ2VyIGVtKSB7Ci0gICAgICAgIGNoZWNrQWNjZXNzKCk7CisgICAgICAgIGNoZWNrUGVybWlzc2lvbigpOwogICAgICAgICBpZiAoZW0gPT0gbnVsbCkgewogICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKICAgICAgICAgfQpAQCAtMjEzLDcgKzIxMyw3IEBACiAgICAgICogICAgICAgICAgICAgdGhlIGNhbGxlciBkb2VzIG5vdCBoYXZlIDx0dD5Mb2dnaW5nUGVybWlzc2lvbigiY29udHJvbCIpPC90dD4uCiAgICAgICovCiAgICAgcHVibGljIEVycm9yTWFuYWdlciBnZXRFcnJvck1hbmFnZXIoKSB7Ci0gICAgICAgIGNoZWNrQWNjZXNzKCk7CisgICAgICAgIGNoZWNrUGVybWlzc2lvbigpOwogICAgICAgICByZXR1cm4gZXJyb3JNYW5hZ2VyOwogICAgIH0KIApAQCAtMjUzLDcgKzI1Myw3IEBACiAgICAgICAgIGlmIChuZXdMZXZlbCA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKICAgICAgICAgfQotICAgICAgICBjaGVja0FjY2VzcygpOworICAgICAgICBjaGVja1Blcm1pc3Npb24oKTsKICAgICAgICAgbG9nTGV2ZWwgPSBuZXdMZXZlbDsKICAgICB9CiAKQEAgLTI5Niw5ICsyOTYsOSBAQAogICAgIC8vIElmICJzZWFsZWQiIGlzIHRydWUsIHdlIGNoZWNrIHRoYXQgdGhlIGNhbGxlciBoYXMKICAgICAvLyBhcHByb3ByaWF0ZSBzZWN1cml0eSBwcml2aWxlZ2VzIHRvIHVwZGF0ZSBIYW5kbGVyCiAgICAgLy8gc3RhdGUgYW5kIGlmIG5vdCB0aHJvdyBhIFNlY3VyaXR5RXhjZXB0aW9uLgotICAgIHZvaWQgY2hlY2tBY2Nlc3MoKSB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24geworICAgIHZvaWQgY2hlY2tQZXJtaXNzaW9uKCkgdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uIHsKICAgICAgICAgaWYgKHNlYWxlZCkgewotICAgICAgICAgICAgbWFuYWdlci5jaGVja0FjY2VzcygpOworICAgICAgICAgICAgbWFuYWdlci5jaGVja1Blcm1pc3Npb24oKTsKICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3V0aWwvbG9nZ2luZy9Mb2dNYW5hZ2VyLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS91dGlsL2xvZ2dpbmcvTG9nTWFuYWdlci5qYXZhCmluZGV4IDI0ZjYxYjQuLmExMDBlYjkgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3V0aWwvbG9nZ2luZy9Mb2dNYW5hZ2VyLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvdXRpbC9sb2dnaW5nL0xvZ01hbmFnZXIuamF2YQpAQCAtMzExLDEwICszMTEsMTcgQEAKICAgICAgKiBAZXhjZXB0aW9uICBTZWN1cml0eUV4Y2VwdGlvbiAgaWYgYSBzZWN1cml0eSBtYW5hZ2VyIGV4aXN0cyBhbmQgaWYKICAgICAgKiAgICAgICAgICAgICB0aGUgY2FsbGVyIGRvZXMgbm90IGhhdmUgTG9nZ2luZ1Blcm1pc3Npb24oImNvbnRyb2wiKS4KICAgICAgKiBAZXhjZXB0aW9uIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGlzIG51bGwuCisgICAgICogQGRlcHJlY2F0ZWQgVGhlIGRlcGVuZGVuY3kgb24ge0Bjb2RlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJ9IGNyZWF0ZXMgYQorICAgICAqICAgICAgICAgICAgIHNpZ25pZmljYW50IGltcGVkaW1lbnQgdG8gZnV0dXJlIG1vZHVsYXJpemF0aW9uIG9mIHRoZSBKYXZhCisgICAgICogICAgICAgICAgICAgcGxhdGZvcm0uIFRoaXMgbWV0aG9kIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSByZWxlYXNlLgorICAgICAqICAgICAgICAgICAgIFRoZSBnbG9iYWwge0Bjb2RlIExvZ01hbmFnZXJ9IGNhbiBkZXRlY3QgY2hhbmdlcyB0byB0aGUKKyAgICAgKiAgICAgICAgICAgICBsb2dnaW5nIGNvbmZpZ3VyYXRpb24gYnkgb3ZlcnJpZGRpbmcgdGhlIHtAbGluaworICAgICAqICAgICAgICAgICAgICNyZWFkQ29uZmlndXJhdGlvbiByZWFkQ29uZmlndXJhdGlvbn0gbWV0aG9kLgogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIHZvaWQgYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGwpIHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiB7CiAgICAgICAgIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBPYmplY3RzLnJlcXVpcmVOb25OdWxsKGwpOwotICAgICAgICBjaGVja0FjY2VzcygpOworICAgICAgICBjaGVja1Blcm1pc3Npb24oKTsKICAgICAgICAgc3luY2hyb25pemVkIChsaXN0ZW5lck1hcCkgewogICAgICAgICAgICAgLy8gaW5jcmVtZW50IHRoZSByZWdpc3RyYXRpb24gY291bnQgaWYgYWxyZWFkeSByZWdpc3RlcmVkCiAgICAgICAgICAgICBJbnRlZ2VyIHZhbHVlID0gbGlzdGVuZXJNYXAuZ2V0KGxpc3RlbmVyKTsKQEAgLTMzNiw5ICszNDMsMTYgQEAKICAgICAgKiBAcGFyYW0gbCAgZXZlbnQgbGlzdGVuZXIgKGNhbiBiZSBudWxsKQogICAgICAqIEBleGNlcHRpb24gIFNlY3VyaXR5RXhjZXB0aW9uICBpZiBhIHNlY3VyaXR5IG1hbmFnZXIgZXhpc3RzIGFuZCBpZgogICAgICAqICAgICAgICAgICAgIHRoZSBjYWxsZXIgZG9lcyBub3QgaGF2ZSBMb2dnaW5nUGVybWlzc2lvbigiY29udHJvbCIpLgorICAgICAqIEBkZXByZWNhdGVkIFRoZSBkZXBlbmRlbmN5IG9uIHtAY29kZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyfSBjcmVhdGVzIGEKKyAgICAgKiAgICAgICAgICAgICBzaWduaWZpY2FudCBpbXBlZGltZW50IHRvIGZ1dHVyZSBtb2R1bGFyaXphdGlvbiBvZiB0aGUgSmF2YQorICAgICAqICAgICAgICAgICAgIHBsYXRmb3JtLiBUaGlzIG1ldGhvZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgcmVsZWFzZS4KKyAgICAgKiAgICAgICAgICAgICBUaGUgZ2xvYmFsIHtAY29kZSBMb2dNYW5hZ2VyfSBjYW4gZGV0ZWN0IGNoYW5nZXMgdG8gdGhlCisgICAgICogICAgICAgICAgICAgbG9nZ2luZyBjb25maWd1cmF0aW9uIGJ5IG92ZXJyaWRkaW5nIHRoZSB7QGxpbmsKKyAgICAgKiAgICAgICAgICAgICAjcmVhZENvbmZpZ3VyYXRpb24gcmVhZENvbmZpZ3VyYXRpb259IG1ldGhvZC4KICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsKSB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24gewotICAgICAgICBjaGVja0FjY2VzcygpOworICAgICAgICBjaGVja1Blcm1pc3Npb24oKTsKICAgICAgICAgaWYgKGwgIT0gbnVsbCkgewogICAgICAgICAgICAgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IGw7CiAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGxpc3RlbmVyTWFwKSB7CkBAIC03OTMsNyArODA3LDcgQEAKICAgICAgKiBAZXhjZXB0aW9uICBJT0V4Y2VwdGlvbiBpZiB0aGVyZSBhcmUgSU8gcHJvYmxlbXMgcmVhZGluZyB0aGUgY29uZmlndXJhdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCByZWFkQ29uZmlndXJhdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VjdXJpdHlFeGNlcHRpb24gewotICAgICAgICBjaGVja0FjY2VzcygpOworICAgICAgICBjaGVja1Blcm1pc3Npb24oKTsKIAogICAgICAgICAvLyBpZiBhIGNvbmZpZ3VyYXRpb24gY2xhc3MgaXMgc3BlY2lmaWVkLCBsb2FkIGl0IGFuZCB1c2UgaXQuCiAgICAgICAgIFN0cmluZyBjbmFtZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS51dGlsLmxvZ2dpbmcuY29uZmlnLmNsYXNzIik7CkBAIC04NTEsNyArODY1LDcgQEAKICAgICAgKi8KIAogICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uIHsKLSAgICAgICAgY2hlY2tBY2Nlc3MoKTsKKyAgICAgICAgY2hlY2tQZXJtaXNzaW9uKCk7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOwogICAgICAgICAgICAgLy8gU2luY2Ugd2UgYXJlIGRvaW5nIGEgcmVzZXQgd2Ugbm8gbG9uZ2VyIHdhbnQgdG8gaW5pdGlhbGl6ZQpAQCAtOTM2LDcgKzk1MCw3IEBACiAgICAgICogQGV4Y2VwdGlvbiAgSU9FeGNlcHRpb24gaWYgdGhlcmUgYXJlIHByb2JsZW1zIHJlYWRpbmcgZnJvbSB0aGUgc3RyZWFtLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJlYWRDb25maWd1cmF0aW9uKElucHV0U3RyZWFtIGlucykgdGhyb3dzIElPRXhjZXB0aW9uLCBTZWN1cml0eUV4Y2VwdGlvbiB7Ci0gICAgICAgIGNoZWNrQWNjZXNzKCk7CisgICAgICAgIGNoZWNrUGVybWlzc2lvbigpOwogICAgICAgICByZXNldCgpOwogCiAgICAgICAgIC8vIExvYWQgdGhlIHByb3BlcnRpZXMKQEAgLTExMTMsOCArMTEyNywxMyBAQAogICAgICAgICBsb2FkTG9nZ2VySGFuZGxlcnMocm9vdExvZ2dlciwgbnVsbCwgImhhbmRsZXJzIik7CiAgICAgfQogCisgICAgcHJpdmF0ZSBmaW5hbCBQZXJtaXNzaW9uIGNvbnRyb2xQZXJtaXNzaW9uID0gbmV3IExvZ2dpbmdQZXJtaXNzaW9uKCJjb250cm9sIiwgbnVsbCk7CiAKLSAgICBwcml2YXRlIFBlcm1pc3Npb24gb3VyUGVybWlzc2lvbiA9IG5ldyBMb2dnaW5nUGVybWlzc2lvbigiY29udHJvbCIsIG51bGwpOworICAgIHZvaWQgY2hlY2tQZXJtaXNzaW9uKCkgeworICAgICAgICBTZWN1cml0eU1hbmFnZXIgc20gPSBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCk7CisgICAgICAgIGlmIChzbSAhPSBudWxsKQorICAgICAgICAgICAgc20uY2hlY2tQZXJtaXNzaW9uKGNvbnRyb2xQZXJtaXNzaW9uKTsKKyAgICB9CiAKICAgICAvKioKICAgICAgKiBDaGVjayB0aGF0IHRoZSBjdXJyZW50IGNvbnRleHQgaXMgdHJ1c3RlZCB0byBtb2RpZnkgdGhlIGxvZ2dpbmcKQEAgLTExMjcsMTEgKzExNDYsNyBAQAogICAgICAqICAgICAgICAgICAgIHRoZSBjYWxsZXIgZG9lcyBub3QgaGF2ZSBMb2dnaW5nUGVybWlzc2lvbigiY29udHJvbCIpLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNoZWNrQWNjZXNzKCkgdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uIHsKLSAgICAgICAgU2VjdXJpdHlNYW5hZ2VyIHNtID0gU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpOwotICAgICAgICBpZiAoc20gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHNtLmNoZWNrUGVybWlzc2lvbihvdXJQZXJtaXNzaW9uKTsKKyAgICAgICAgY2hlY2tQZXJtaXNzaW9uKCk7CiAgICAgfQogCiAgICAgLy8gTmVzdGVkIGNsYXNzIHRvIHJlcHJlc2VudCBhIG5vZGUgaW4gb3VyIHRyZWUgb2YgbmFtZWQgbG9nZ2Vycy4KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3V0aWwvbG9nZ2luZy9Mb2dnZXIuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3V0aWwvbG9nZ2luZy9Mb2dnZXIuamF2YQppbmRleCBhZWJmNjNlLi5mMWQ2ZjcyIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS91dGlsL2xvZ2dpbmcvTG9nZ2VyLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvdXRpbC9sb2dnaW5nL0xvZ2dlci5qYXZhCkBAIC0yNzYsMTMgKzI3NiwxMyBAQAogICAgICAgICB0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBjaGVja0FjY2VzcygpIHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiB7CisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrUGVybWlzc2lvbigpIHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiB7CiAgICAgICAgIGlmICghYW5vbnltb3VzKSB7CiAgICAgICAgICAgICBpZiAobWFuYWdlciA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgLy8gQ29tcGxldGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGdsb2JhbCBMb2dnZXIuCiAgICAgICAgICAgICAgICAgbWFuYWdlciA9IExvZ01hbmFnZXIuZ2V0TG9nTWFuYWdlcigpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWFuYWdlci5jaGVja0FjY2VzcygpOworICAgICAgICAgICAgbWFuYWdlci5jaGVja1Blcm1pc3Npb24oKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNDgyLDcgKzQ4Miw3IEBACiAgICAgICogICAgICAgICAgICAgdGhlIGNhbGxlciBkb2VzIG5vdCBoYXZlIExvZ2dpbmdQZXJtaXNzaW9uKCJjb250cm9sIikuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RmlsdGVyKEZpbHRlciBuZXdGaWx0ZXIpIHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiB7Ci0gICAgICAgIGNoZWNrQWNjZXNzKCk7CisgICAgICAgIGNoZWNrUGVybWlzc2lvbigpOwogICAgICAgICBmaWx0ZXIgPSBuZXdGaWx0ZXI7CiAgICAgfQogCkBAIC0xMTY4LDcgKzExNjgsNyBAQAogICAgICAqICAgICAgICAgICAgIHRoZSBjYWxsZXIgZG9lcyBub3QgaGF2ZSBMb2dnaW5nUGVybWlzc2lvbigiY29udHJvbCIpLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldExldmVsKExldmVsIG5ld0xldmVsKSB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24gewotICAgICAgICBjaGVja0FjY2VzcygpOworICAgICAgICBjaGVja1Blcm1pc3Npb24oKTsKICAgICAgICAgc3luY2hyb25pemVkICh0cmVlTG9jaykgewogICAgICAgICAgICAgbGV2ZWxPYmplY3QgPSBuZXdMZXZlbDsKICAgICAgICAgICAgIHVwZGF0ZUVmZmVjdGl2ZUxldmVsKCk7CkBAIC0xMjIzLDcgKzEyMjMsNyBAQAogICAgIHB1YmxpYyB2b2lkIGFkZEhhbmRsZXIoSGFuZGxlciBoYW5kbGVyKSB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24gewogICAgICAgICAvLyBDaGVjayBmb3IgbnVsbCBoYW5kbGVyCiAgICAgICAgIGhhbmRsZXIuZ2V0Q2xhc3MoKTsKLSAgICAgICAgY2hlY2tBY2Nlc3MoKTsKKyAgICAgICAgY2hlY2tQZXJtaXNzaW9uKCk7CiAgICAgICAgIGhhbmRsZXJzLmFkZChoYW5kbGVyKTsKICAgICB9CiAKQEAgLTEyMzcsNyArMTIzNyw3IEBACiAgICAgICogICAgICAgICAgICAgdGhlIGNhbGxlciBkb2VzIG5vdCBoYXZlIExvZ2dpbmdQZXJtaXNzaW9uKCJjb250cm9sIikuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcmVtb3ZlSGFuZGxlcihIYW5kbGVyIGhhbmRsZXIpIHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiB7Ci0gICAgICAgIGNoZWNrQWNjZXNzKCk7CisgICAgICAgIGNoZWNrUGVybWlzc2lvbigpOwogICAgICAgICBpZiAoaGFuZGxlciA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KQEAgLTEyNjUsNyArMTI2NSw3IEBACiAgICAgICogICAgICAgICAgICAgdGhlIGNhbGxlciBkb2VzIG5vdCBoYXZlIExvZ2dpbmdQZXJtaXNzaW9uKCJjb250cm9sIikuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0VXNlUGFyZW50SGFuZGxlcnMoYm9vbGVhbiB1c2VQYXJlbnRIYW5kbGVycykgewotICAgICAgICBjaGVja0FjY2VzcygpOworICAgICAgICBjaGVja1Blcm1pc3Npb24oKTsKICAgICAgICAgdGhpcy51c2VQYXJlbnRIYW5kbGVycyA9IHVzZVBhcmVudEhhbmRsZXJzOwogICAgIH0KIApAQCAtMTQyMCw3ICsxNDIwLDcgQEAKICAgICAgICAgaWYgKHBhcmVudCA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKICAgICAgICAgfQotICAgICAgICBtYW5hZ2VyLmNoZWNrQWNjZXNzKCk7CisgICAgICAgIG1hbmFnZXIuY2hlY2tQZXJtaXNzaW9uKCk7CiAgICAgICAgIGRvU2V0UGFyZW50KHBhcmVudCk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS91dGlsL2xvZ2dpbmcvTWVtb3J5SGFuZGxlci5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvdXRpbC9sb2dnaW5nL01lbW9yeUhhbmRsZXIuamF2YQppbmRleCAyYzI5NzMwLi4wNmMwOTMwIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS91dGlsL2xvZ2dpbmcvTWVtb3J5SGFuZGxlci5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3V0aWwvbG9nZ2luZy9NZW1vcnlIYW5kbGVyLmphdmEKQEAgLTIzOCw3ICsyMzgsNyBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CiAgICAgICAgIH0KICAgICAgICAgTG9nTWFuYWdlciBtYW5hZ2VyID0gTG9nTWFuYWdlci5nZXRMb2dNYW5hZ2VyKCk7Ci0gICAgICAgIGNoZWNrQWNjZXNzKCk7CisgICAgICAgIGNoZWNrUGVybWlzc2lvbigpOwogICAgICAgICBwdXNoTGV2ZWwgPSBuZXdMZXZlbDsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3V0aWwvbG9nZ2luZy9TdHJlYW1IYW5kbGVyLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YS91dGlsL2xvZ2dpbmcvU3RyZWFtSGFuZGxlci5qYXZhCmluZGV4IDllZDllNTcuLmY2NDA3ZWMgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZhL3V0aWwvbG9nZ2luZy9TdHJlYW1IYW5kbGVyLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmEvdXRpbC9sb2dnaW5nL1N0cmVhbUhhbmRsZXIuamF2YQpAQCAtMjQ5LDcgKzI0OSw3IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBmbHVzaEFuZENsb3NlKCkgdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uIHsKLSAgICAgICAgY2hlY2tBY2Nlc3MoKTsKKyAgICAgICAgY2hlY2tQZXJtaXNzaW9uKCk7CiAgICAgICAgIGlmICh3cml0ZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBpZiAoIWRvbmVIZWFkZXIpIHsKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9tYW5hZ2VtZW50L21vZGVsbWJlYW4vRGVzY3JpcHRvclN1cHBvcnQuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9tYW5hZ2VtZW50L21vZGVsbWJlYW4vRGVzY3JpcHRvclN1cHBvcnQuamF2YQppbmRleCA1N2I0YjQ2Li4wNjgwNDc5IDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvbWFuYWdlbWVudC9tb2RlbG1iZWFuL0Rlc2NyaXB0b3JTdXBwb3J0LmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L21hbmFnZW1lbnQvbW9kZWxtYmVhbi9EZXNjcmlwdG9yU3VwcG9ydC5qYXZhCkBAIC0xMjQ1LDEzICsxMjQ1LDEyIEBACiAgICAgICAgICAgICByZXR1cm4gcy5zdWJzdHJpbmcoMSwgcy5sZW5ndGgoKSAtIDEpOwogICAgICAgICB9CiAgICAgICAgIGZpbmFsIFN0cmluZyBjbGFzc05hbWUgPSBzLnN1YnN0cmluZygxLCBzbGFzaCk7CisKICAgICAgICAgZmluYWwgQ29uc3RydWN0b3I8Pz4gY29uc3RyOwogICAgICAgICB0cnkgeworICAgICAgICAgICAgUmVmbGVjdFV0aWwuY2hlY2tQYWNrYWdlQWNjZXNzKGNsYXNzTmFtZSk7CiAgICAgICAgICAgICBmaW5hbCBDbGFzc0xvYWRlciBjb250ZXh0Q2xhc3NMb2FkZXIgPQogICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7Ci0gICAgICAgICAgICBpZiAoY29udGV4dENsYXNzTG9hZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBSZWZsZWN0VXRpbC5jaGVja1BhY2thZ2VBY2Nlc3MoY2xhc3NOYW1lKTsKLSAgICAgICAgICAgIH0KICAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IGMgPQogICAgICAgICAgICAgICAgIENsYXNzLmZvck5hbWUoY2xhc3NOYW1lLCBmYWxzZSwgY29udGV4dENsYXNzTG9hZGVyKTsKICAgICAgICAgICAgIGNvbnN0ciA9IGMuZ2V0Q29uc3RydWN0b3IobmV3IENsYXNzPD8+W10ge1N0cmluZy5jbGFzc30pOwpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L21hbmFnZW1lbnQvcmVtb3RlL3JtaS9STUlDb25uZWN0aW9uSW1wbC5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L21hbmFnZW1lbnQvcmVtb3RlL3JtaS9STUlDb25uZWN0aW9uSW1wbC5qYXZhCmluZGV4IGYzMjJhZjAuLjNmODgwZDAgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9tYW5hZ2VtZW50L3JlbW90ZS9ybWkvUk1JQ29ubmVjdGlvbkltcGwuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvbWFuYWdlbWVudC9yZW1vdGUvcm1pL1JNSUNvbm5lY3Rpb25JbXBsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA4LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSw2ICsyNSwzMCBAQAogCiBwYWNrYWdlIGphdmF4Lm1hbmFnZW1lbnQucmVtb3RlLnJtaTsKIAoraW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5ybWkuTWFyc2hhbGxlZE9iamVjdDsKK2ltcG9ydCBqYXZhLnJtaS5Vbm1hcnNoYWxFeGNlcHRpb247CitpbXBvcnQgamF2YS5ybWkuc2VydmVyLlVucmVmZXJlbmNlZDsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xDb250ZXh0OworaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb25zOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJvdGVjdGlvbkRvbWFpbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lio7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5yZW1vdGUuSk1YU2VydmVyRXJyb3JFeGNlcHRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5yZW1vdGUuTm90aWZpY2F0aW9uUmVzdWx0OworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQucmVtb3RlLlRhcmdldGVkTm90aWZpY2F0aW9uOworaW1wb3J0IGphdmF4LnNlY3VyaXR5LmF1dGguU3ViamVjdDsKKwogaW1wb3J0IHN0YXRpYyBjb20uc3VuLmpteC5tYmVhbnNlcnZlci5VdGlsLmNhc3Q7CiBpbXBvcnQgY29tLnN1bi5qbXgucmVtb3RlLmludGVybmFsLlNlcnZlckNvbW11bmljYXRvckFkbWluOwogaW1wb3J0IGNvbS5zdW4uam14LnJlbW90ZS5pbnRlcm5hbC5TZXJ2ZXJOb3RpZkZvcndhcmRlcjsKQEAgLTM1LDQ0ICs1OSw2IEBACiBpbXBvcnQgY29tLnN1bi5qbXgucmVtb3RlLnV0aWwuRW52SGVscDsKIGltcG9ydCBjb20uc3VuLmpteC5yZW1vdGUudXRpbC5PcmRlckNsYXNzTG9hZGVyczsKIAotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5ybWkuTWFyc2hhbGxlZE9iamVjdDsKLWltcG9ydCBqYXZhLnJtaS5Vbm1hcnNoYWxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5ybWkuc2VydmVyLlVucmVmZXJlbmNlZDsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xDb250ZXh0OwotaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50LkF0dHJpYnV0ZTsKLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50LkF0dHJpYnV0ZUxpc3Q7Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5BdHRyaWJ1dGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lkluc3RhbmNlQWxyZWFkeUV4aXN0c0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lkluc3RhbmNlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5JbnRyb3NwZWN0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuSW52YWxpZEF0dHJpYnV0ZVZhbHVlRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTGlzdGVuZXJOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5JbmZvOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5SZWdpc3RyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk5vdENvbXBsaWFudE1CZWFuRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTm90aWZpY2F0aW9uRmlsdGVyOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0SW5zdGFuY2U7Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuUXVlcnlFeHA7Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5SZWZsZWN0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuUnVudGltZU9wZXJhdGlvbnNFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5yZW1vdGUuSk1YU2VydmVyRXJyb3JFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5yZW1vdGUuTm90aWZpY2F0aW9uUmVzdWx0OwotaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQucmVtb3RlLlRhcmdldGVkTm90aWZpY2F0aW9uOwotaW1wb3J0IGphdmF4LnNlY3VyaXR5LmF1dGguU3ViamVjdDsKLQogLyoqCiAgKiA8cD5JbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIFJNSUNvbm5lY3Rpb259IGludGVyZmFjZS4gIFVzZXIKICAqIGNvZGUgd2lsbCBub3QgdXN1YWxseSByZWZlcmVuY2UgdGhpcyBjbGFzcy48L3A+CkBAIC0xNDMsNiArMTI5LDcgQEAKICAgICAgICAgdGhpcy5tYmVhblNlcnZlciA9IHJtaVNlcnZlci5nZXRNQmVhblNlcnZlcigpOwogCiAgICAgICAgIGZpbmFsIENsYXNzTG9hZGVyIGRjbCA9IGRlZmF1bHRDbGFzc0xvYWRlcjsKKwogICAgICAgICB0aGlzLmNsYXNzTG9hZGVyV2l0aFJlcG9zaXRvcnkgPQogICAgICAgICAgICAgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCiAgICAgICAgICAgICAgICAgbmV3IFByaXZpbGVnZWRBY3Rpb248Q2xhc3NMb2FkZXJXaXRoUmVwb3NpdG9yeT4oKSB7CkBAIC0xNTEsMTMgKzEzOCw0MCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYmVhblNlcnZlci5nZXRDbGFzc0xvYWRlclJlcG9zaXRvcnkoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGNsKTsKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0sCisKKyAgICAgICAgICAgICAgICB3aXRoUGVybWlzc2lvbnMoIG5ldyBNQmVhblBlcm1pc3Npb24oIioiLCAiZ2V0Q2xhc3NMb2FkZXJSZXBvc2l0b3J5IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUnVudGltZVBlcm1pc3Npb24oImNyZWF0ZUNsYXNzTG9hZGVyIikpCisgICAgICAgICAgICApOworCisKKyAgICAgICAgdGhpcy5kZWZhdWx0Q29udGV4dENsYXNzTG9hZGVyID0KKyAgICAgICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAorICAgICAgICAgICAgICAgIG5ldyBQcml2aWxlZ2VkQWN0aW9uPENsYXNzTG9hZGVyPigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgQ2xhc3NMb2FkZXIgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21iaW5lZENsYXNzTG9hZGVyKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRjbCk7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9KTsKKwogICAgICAgICBzZXJ2ZXJDb21tdW5pY2F0b3JBZG1pbiA9IG5ldwogICAgICAgICAgIFJNSVNlcnZlckNvbW11bmljYXRvckFkbWluKEVudkhlbHAuZ2V0U2VydmVyQ29ubmVjdGlvblRpbWVvdXQoZW52KSk7CiAKICAgICAgICAgdGhpcy5lbnYgPSBlbnY7CiAgICAgfQogCisgICAgcHJpdmF0ZSBzdGF0aWMgQWNjZXNzQ29udHJvbENvbnRleHQgd2l0aFBlcm1pc3Npb25zKFBlcm1pc3Npb24gLi4uIHBlcm1zKXsKKyAgICAgICAgUGVybWlzc2lvbnMgY29sID0gbmV3IFBlcm1pc3Npb25zKCk7CisKKyAgICAgICAgZm9yIChQZXJtaXNzaW9uIHRoZVBlcm0gOiBwZXJtcyApIHsKKyAgICAgICAgICAgIGNvbC5hZGQodGhlUGVybSk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBQcm90ZWN0aW9uRG9tYWluIHBkID0gbmV3IFByb3RlY3Rpb25Eb21haW4obnVsbCwgY29sKTsKKyAgICAgICAgcmV0dXJuIG5ldyBBY2Nlc3NDb250cm9sQ29udGV4dCggbmV3IFByb3RlY3Rpb25Eb21haW5bXSB7IHBkIH0pOworICAgIH0KKwogICAgIHByaXZhdGUgc3luY2hyb25pemVkIFNlcnZlck5vdGlmRm9yd2FyZGVyIGdldFNlcnZlck5vdGlmRndkKCkgewogICAgICAgICAvLyBMYXppbHkgY3JlYXRlZCB3aGVuIGZpcnN0IHVzZS4gTWFpbmx5IHdoZW4KICAgICAgICAgLy8gYWRkTm90aWZpY2F0aW9uTGlzdGVuZXIgaXMgZmlyc3QgY2FsbGVkLgpAQCAtNTA3LDcgKzUyMSw3IEBACiAgICAgICAgICAgICAgICAgICJjb25uZWN0aW9uSWQ9IiArIGNvbm5lY3Rpb25JZAogICAgICAgICAgICAgICAgICArIiB1bndyYXBwaW5nIHF1ZXJ5IHdpdGggZGVmYXVsdENsYXNzTG9hZGVyLiIpOwogCi0gICAgICAgIHF1ZXJ5VmFsdWUgPSB1bndyYXAocXVlcnksIGRlZmF1bHRDbGFzc0xvYWRlciwgUXVlcnlFeHAuY2xhc3MpOworICAgICAgICBxdWVyeVZhbHVlID0gdW53cmFwKHF1ZXJ5LCBkZWZhdWx0Q29udGV4dENsYXNzTG9hZGVyLCBRdWVyeUV4cC5jbGFzcyk7CiAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBwYXJhbXNbXSA9IG5ldyBPYmplY3RbXSB7IG5hbWUsIHF1ZXJ5VmFsdWUgfTsKQEAgLTU0Miw3ICs1NTYsNyBAQAogICAgICAgICAgICAgICAgICAiY29ubmVjdGlvbklkPSIgKyBjb25uZWN0aW9uSWQKICAgICAgICAgICAgICAgICAgKyIgdW53cmFwcGluZyBxdWVyeSB3aXRoIGRlZmF1bHRDbGFzc0xvYWRlci4iKTsKIAotICAgICAgICBxdWVyeVZhbHVlID0gdW53cmFwKHF1ZXJ5LCBkZWZhdWx0Q2xhc3NMb2FkZXIsIFF1ZXJ5RXhwLmNsYXNzKTsKKyAgICAgICAgcXVlcnlWYWx1ZSA9IHVud3JhcChxdWVyeSwgZGVmYXVsdENvbnRleHRDbGFzc0xvYWRlciwgUXVlcnlFeHAuY2xhc3MpOwogCiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBmaW5hbCBPYmplY3QgcGFyYW1zW10gPSBuZXcgT2JqZWN0W10geyBuYW1lLCBxdWVyeVZhbHVlIH07CkBAIC0xMzMwLDcgKzEzNDQsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIENsYXNzTG9hZGVyIHJ1bigpIHRocm93cyBJbnN0YW5jZU5vdEZvdW5kRXhjZXB0aW9uIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWJlYW5TZXJ2ZXIuZ2V0Q2xhc3NMb2FkZXIobmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICB3aXRoUGVybWlzc2lvbnMobmV3IE1CZWFuUGVybWlzc2lvbigiKiIsICJnZXRDbGFzc0xvYWRlciIpKQorICAgICAgICAgICAgKTsKICAgICAgICAgfSBjYXRjaCAoUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBwZSkgewogICAgICAgICAgICAgdGhyb3cgKEluc3RhbmNlTm90Rm91bmRFeGNlcHRpb24pIGV4dHJhY3RFeGNlcHRpb24ocGUpOwogICAgICAgICB9CkBAIC0xMzQ1LDcgKzEzNjEsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgSW5zdGFuY2VOb3RGb3VuZEV4Y2VwdGlvbiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1iZWFuU2VydmVyLmdldENsYXNzTG9hZGVyRm9yKG5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgd2l0aFBlcm1pc3Npb25zKG5ldyBNQmVhblBlcm1pc3Npb24oIioiLCAiZ2V0Q2xhc3NMb2FkZXJGb3IiKSkKKyAgICAgICAgICAgICk7CiAgICAgICAgIH0gY2F0Y2ggKFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gcGUpIHsKICAgICAgICAgICAgIHRocm93IChJbnN0YW5jZU5vdEZvdW5kRXhjZXB0aW9uKSBleHRyYWN0RXhjZXB0aW9uKHBlKTsKICAgICAgICAgfQpAQCAtMTU3Miw3ICsxNTkwLDggQEAKICAgICAgICAgICAgIENsYXNzTG9hZGVyIG9yZGVyQ0wgPSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKICAgICAgICAgICAgICAgICBuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjxDbGFzc0xvYWRlcj4oKSB7CiAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBDbGFzc0xvYWRlciBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgT3JkZXJDbGFzc0xvYWRlcnMoY2wxLCBjbDIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21iaW5lZENsYXNzTG9hZGVyKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPcmRlckNsYXNzTG9hZGVycyhjbDEsIGNsMikpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgKTsKQEAgLTE2NjQsNiArMTY4Myw4IEBACiAKICAgICBwcml2YXRlIGZpbmFsIENsYXNzTG9hZGVyIGRlZmF1bHRDbGFzc0xvYWRlcjsKIAorICAgIHByaXZhdGUgZmluYWwgQ2xhc3NMb2FkZXIgZGVmYXVsdENvbnRleHRDbGFzc0xvYWRlcjsKKwogICAgIHByaXZhdGUgZmluYWwgQ2xhc3NMb2FkZXJXaXRoUmVwb3NpdG9yeSBjbGFzc0xvYWRlcldpdGhSZXBvc2l0b3J5OwogCiAgICAgcHJpdmF0ZSBib29sZWFuIHRlcm1pbmF0ZWQgPSBmYWxzZTsKQEAgLTE3NDYsNCArMTc2Nyw0MyBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3NMb2dnZXIgbG9nZ2VyID0KICAgICAgICAgbmV3IENsYXNzTG9nZ2VyKCJqYXZheC5tYW5hZ2VtZW50LnJlbW90ZS5ybWkiLCAiUk1JQ29ubmVjdGlvbkltcGwiKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIENvbWJpbmVkQ2xhc3NMb2FkZXIgZXh0ZW5kcyBDbGFzc0xvYWRlciB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgY2xhc3MgQ2xhc3NMb2FkZXJXcmFwcGVyIGV4dGVuZHMgQ2xhc3NMb2FkZXIgeworICAgICAgICAgICAgQ2xhc3NMb2FkZXJXcmFwcGVyKENsYXNzTG9hZGVyIGNsKSB7CisgICAgICAgICAgICAgICAgc3VwZXIoY2wpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCBDbGFzczw/PiBsb2FkQ2xhc3MoU3RyaW5nIG5hbWUsIGJvb2xlYW4gcmVzb2x2ZSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5sb2FkQ2xhc3MobmFtZSwgcmVzb2x2ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgZmluYWwgQ2xhc3NMb2FkZXJXcmFwcGVyIGRlZmF1bHRDTDsKKworICAgICAgICBwcml2YXRlIENvbWJpbmVkQ2xhc3NMb2FkZXIoQ2xhc3NMb2FkZXIgcGFyZW50LCBDbGFzc0xvYWRlciBkZWZhdWx0Q0wpIHsKKyAgICAgICAgICAgIHN1cGVyKHBhcmVudCk7CisgICAgICAgICAgICB0aGlzLmRlZmF1bHRDTCA9IG5ldyBDbGFzc0xvYWRlcldyYXBwZXIoZGVmYXVsdENMKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgQ2xhc3M8Pz4gbG9hZENsYXNzKFN0cmluZyBuYW1lLCBib29sZWFuIHJlc29sdmUpCisgICAgICAgIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc3VwZXIubG9hZENsYXNzKG5hbWUsIHJlc29sdmUpOworICAgICAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGZvcihUaHJvd2FibGUgdCA9IGU7IHQgIT0gbnVsbDsgdCA9IHQuZ2V0Q2F1c2UoKSkgeworICAgICAgICAgICAgICAgICAgICBpZih0IGluc3RhbmNlb2YgU2VjdXJpdHlFeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHQ9PWU/KFNlY3VyaXR5RXhjZXB0aW9uKXQ6bmV3IFNlY3VyaXR5RXhjZXB0aW9uKHQuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IGNsID0gZGVmYXVsdENMLmxvYWRDbGFzcyhuYW1lLCByZXNvbHZlKTsKKyAgICAgICAgICAgIHJldHVybiBjbDsKKyAgICAgICAgfQorCisgICAgfQogfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L21hbmFnZW1lbnQvcmVtb3RlL3JtaS9STUlDb25uZWN0b3IuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9tYW5hZ2VtZW50L3JlbW90ZS9ybWkvUk1JQ29ubmVjdG9yLmphdmEKaW5kZXggZjUzNTlmOS4uZjZkMTdkNiAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L21hbmFnZW1lbnQvcmVtb3RlL3JtaS9STUlDb25uZWN0b3IuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvbWFuYWdlbWVudC9yZW1vdGUvcm1pL1JNSUNvbm5lY3Rvci5qYXZhCkBAIC0yNzcsOSArMjc3LDkgQEAKICAgICAgICAgICAgIC8vIENoZWNrIGZvciBzZWN1cmUgUk1JU2VydmVyIHN0dWIgaWYgdGhlIGNvcnJlc3BvbmRpbmcKICAgICAgICAgICAgIC8vIGNsaWVudC1zaWRlIGVudmlyb25tZW50IHByb3BlcnR5IGlzIHNldCB0byAidHJ1ZSIuCiAgICAgICAgICAgICAvLwotICAgICAgICAgICAgYm9vbGVhbiBjaGVja1N0dWIgPSBFbnZIZWxwLmNvbXB1dGVCb29sZWFuRnJvbVN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgdXNlbWFwLAotICAgICAgICAgICAgICAgICAgICAiam14LnJlbW90ZS54LmNoZWNrLnN0dWIiLGZhbHNlKTsKKyAgICAgICAgICAgIFN0cmluZyBzdHJpbmdCb29sZWFuID0gIChTdHJpbmcpIHVzZW1hcC5nZXQoImpteC5yZW1vdGUueC5jaGVjay5zdHViIik7CisgICAgICAgICAgICBib29sZWFuIGNoZWNrU3R1YiA9IEVudkhlbHAuY29tcHV0ZUJvb2xlYW5Gcm9tU3RyaW5nKHN0cmluZ0Jvb2xlYW4pOworCiAgICAgICAgICAgICBpZiAoY2hlY2tTdHViKSBjaGVja1N0dWIoc3R1Yiwgcm1pU2VydmVySW1wbFN0dWJDbGFzcyk7CiAKICAgICAgICAgICAgIC8vIENvbm5lY3QgSUlPUCBTdHViIGlmIG5lZWRlZC4KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9tYW5hZ2VtZW50L3JlbW90ZS9ybWkvUk1JQ29ubmVjdG9yU2VydmVyLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvbWFuYWdlbWVudC9yZW1vdGUvcm1pL1JNSUNvbm5lY3RvclNlcnZlci5qYXZhCmluZGV4IDkwOWI5Y2IuLmRhOTJmNDkgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9tYW5hZ2VtZW50L3JlbW90ZS9ybWkvUk1JQ29ubmVjdG9yU2VydmVyLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L21hbmFnZW1lbnQvcmVtb3RlL3JtaS9STUlDb25uZWN0b3JTZXJ2ZXIuamF2YQpAQCAtNDEyLDkgKzQxMiw4IEBACiAgICAgICAgICAgICAgICAgaWYgKHRyYWNpbmcpCiAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgic3RhcnQiLCAiVXNpbmcgZXh0ZXJuYWwgZGlyZWN0b3J5OiAiICsgam5kaVVybCk7CiAKLSAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHJlYmluZCA9IEVudkhlbHAuY29tcHV0ZUJvb2xlYW5Gcm9tU3RyaW5nKAotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgICAgICBKTkRJX1JFQklORF9BVFRSSUJVVEUsZmFsc2UpOworICAgICAgICAgICAgICAgIFN0cmluZyBzdHJpbmdCb29sZWFuID0gKFN0cmluZykgYXR0cmlidXRlcy5nZXQoSk5ESV9SRUJJTkRfQVRUUklCVVRFKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHJlYmluZCA9IEVudkhlbHAuY29tcHV0ZUJvb2xlYW5Gcm9tU3RyaW5nKCBzdHJpbmdCb29sZWFuICk7CiAKICAgICAgICAgICAgICAgICBpZiAodHJhY2luZykKICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJzdGFydCIsIEpORElfUkVCSU5EX0FUVFJJQlVURSArICI9IiArIHJlYmluZCk7CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvbWFuYWdlbWVudC90aW1lci9UaW1lci5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L21hbmFnZW1lbnQvdGltZXIvVGltZXIuamF2YQppbmRleCAyNTE2ZGU1Li5hYWZkMGFiIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvbWFuYWdlbWVudC90aW1lci9UaW1lci5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9tYW5hZ2VtZW50L3RpbWVyL1RpbWVyLmphdmEKQEAgLTI4LDggKzI4LDcgQEAKIGltcG9ydCBzdGF0aWMgY29tLnN1bi5qbXguZGVmYXVsdHMuSm14UHJvcGVydGllcy5USU1FUl9MT0dHRVI7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7CkBAIC0xMjgsOCArMTI3LDggQEAKICAgICAgKiBUYWJsZSBjb250YWluaW5nIGFsbCB0aGUgdGltZXIgbm90aWZpY2F0aW9ucyBvZiB0aGlzIHRpbWVyLAogICAgICAqIHdpdGggdGhlIGFzc29jaWF0ZWQgZGF0ZSwgcGVyaW9kIGFuZCBudW1iZXIgb2Ygb2NjdXJyZW5jZXMuCiAgICAgICovCi0gICAgcHJpdmF0ZSBNYXA8SW50ZWdlcixPYmplY3RbXT4gdGltZXJUYWJsZSA9Ci0gICAgICAgIG5ldyBIYXNodGFibGU8SW50ZWdlcixPYmplY3RbXT4oKTsKKyAgICBmaW5hbCBwcml2YXRlIE1hcDxJbnRlZ2VyLE9iamVjdFtdPiB0aW1lclRhYmxlID0KKyAgICAgICAgbmV3IEhhc2hNYXA8PigpOwogCiAgICAgLyoqCiAgICAgICogUGFzdCBub3RpZmljYXRpb25zIHNlbmRpbmcgb24vb2ZmIGZsYWcgdmFsdWUuCkBAIC0xNjMsNyArMTYyLDcgQEAKICAgICAgKiBUaGUgbm90aWZpY2F0aW9uIGNvdW50ZXIgSUQuCiAgICAgICogVXNlZCB0byBrZWVwIHRoZSBtYXgga2V5IHZhbHVlIGluc2VydGVkIGludG8gdGhlIHRpbWVyIHRhYmxlLgogICAgICAqLwotICAgIHByaXZhdGUgaW50IGNvdW50ZXJJRCA9IDA7CisgICAgdm9sYXRpbGUgcHJpdmF0ZSBpbnQgY291bnRlcklEID0gMDsKIAogICAgIHByaXZhdGUgamF2YS51dGlsLlRpbWVyIHRpbWVyOwogCkBAIC03NzYsNyArNzc1LDcgQEAKICAgICAgKgogICAgICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiB0aW1lciBub3RpZmljYXRpb25zLgogICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0TmJOb3RpZmljYXRpb25zKCkgeworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldE5iTm90aWZpY2F0aW9ucygpIHsKICAgICAgICAgcmV0dXJuIHRpbWVyVGFibGUuc2l6ZSgpOwogICAgIH0KIApAQCAtODI0LDcgKzgyMyw3IEBACiAgICAgICogQHJldHVybiBUaGUgdGltZXIgbm90aWZpY2F0aW9uIHR5cGUgb3IgbnVsbCBpZiB0aGUgaWRlbnRpZmllciBpcyBub3QgbWFwcGVkIHRvIGFueQogICAgICAqIHRpbWVyIG5vdGlmaWNhdGlvbiByZWdpc3RlcmVkIGZvciB0aGlzIHRpbWVyIE1CZWFuLgogICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Tm90aWZpY2F0aW9uVHlwZShJbnRlZ2VyIGlkKSB7CisgICAgcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgZ2V0Tm90aWZpY2F0aW9uVHlwZShJbnRlZ2VyIGlkKSB7CiAKICAgICAgICAgT2JqZWN0W10gb2JqID0gdGltZXJUYWJsZS5nZXQoaWQpOwogICAgICAgICBpZiAob2JqICE9IG51bGwpIHsKQEAgLTg0MSw3ICs4NDAsNyBAQAogICAgICAqIEByZXR1cm4gVGhlIHRpbWVyIG5vdGlmaWNhdGlvbiBkZXRhaWxlZCBtZXNzYWdlIG9yIG51bGwgaWYgdGhlIGlkZW50aWZpZXIgaXMgbm90IG1hcHBlZCB0byBhbnkKICAgICAgKiB0aW1lciBub3RpZmljYXRpb24gcmVnaXN0ZXJlZCBmb3IgdGhpcyB0aW1lciBNQmVhbi4KICAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5vdGlmaWNhdGlvbk1lc3NhZ2UoSW50ZWdlciBpZCkgeworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIGdldE5vdGlmaWNhdGlvbk1lc3NhZ2UoSW50ZWdlciBpZCkgewogCiAgICAgICAgIE9iamVjdFtdIG9iaiA9IHRpbWVyVGFibGUuZ2V0KGlkKTsKICAgICAgICAgaWYgKG9iaiAhPSBudWxsKSB7CkBAIC04NjIsNyArODYxLDcgQEAKICAgICAvL3B1YmxpYyBTZXJpYWxpemFibGUgZ2V0Tm90aWZpY2F0aW9uVXNlckRhdGEoSW50ZWdlciBpZCkgewogICAgIC8vIGVuZCBvZiBOUENURSBmaXggZm9yIGJ1Z0lkIDQ0NjQzODgKIAotICAgIHB1YmxpYyBPYmplY3QgZ2V0Tm90aWZpY2F0aW9uVXNlckRhdGEoSW50ZWdlciBpZCkgeworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgT2JqZWN0IGdldE5vdGlmaWNhdGlvblVzZXJEYXRhKEludGVnZXIgaWQpIHsKICAgICAgICAgT2JqZWN0W10gb2JqID0gdGltZXJUYWJsZS5nZXQoaWQpOwogICAgICAgICBpZiAob2JqICE9IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiAoICgoVGltZXJOb3RpZmljYXRpb24pb2JqW1RJTUVSX05PVElGX0lOREVYXSkuZ2V0VXNlckRhdGEoKSApOwpAQCAtODc4LDcgKzg3Nyw3IEBACiAgICAgICogQHJldHVybiBBIGNvcHkgb2YgdGhlIGRhdGUgb3IgbnVsbCBpZiB0aGUgaWRlbnRpZmllciBpcyBub3QgbWFwcGVkIHRvIGFueQogICAgICAqIHRpbWVyIG5vdGlmaWNhdGlvbiByZWdpc3RlcmVkIGZvciB0aGlzIHRpbWVyIE1CZWFuLgogICAgICAqLwotICAgIHB1YmxpYyBEYXRlIGdldERhdGUoSW50ZWdlciBpZCkgeworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgRGF0ZSBnZXREYXRlKEludGVnZXIgaWQpIHsKIAogICAgICAgICBPYmplY3RbXSBvYmogPSB0aW1lclRhYmxlLmdldChpZCk7CiAgICAgICAgIGlmIChvYmogIT0gbnVsbCkgewpAQCAtODk2LDcgKzg5NSw3IEBACiAgICAgICogQHJldHVybiBBIGNvcHkgb2YgdGhlIHBlcmlvZCBvciBudWxsIGlmIHRoZSBpZGVudGlmaWVyIGlzIG5vdCBtYXBwZWQgdG8gYW55CiAgICAgICogdGltZXIgbm90aWZpY2F0aW9uIHJlZ2lzdGVyZWQgZm9yIHRoaXMgdGltZXIgTUJlYW4uCiAgICAgICovCi0gICAgcHVibGljIExvbmcgZ2V0UGVyaW9kKEludGVnZXIgaWQpIHsKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIExvbmcgZ2V0UGVyaW9kKEludGVnZXIgaWQpIHsKIAogICAgICAgICBPYmplY3RbXSBvYmogPSB0aW1lclRhYmxlLmdldChpZCk7CiAgICAgICAgIGlmIChvYmogIT0gbnVsbCkgewpAQCAtOTEzLDcgKzkxMiw3IEBACiAgICAgICogQHJldHVybiBBIGNvcHkgb2YgdGhlIHJlbWFpbmluZyBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgb3IgbnVsbCBpZiB0aGUgaWRlbnRpZmllciBpcyBub3QgbWFwcGVkIHRvIGFueQogICAgICAqIHRpbWVyIG5vdGlmaWNhdGlvbiByZWdpc3RlcmVkIGZvciB0aGlzIHRpbWVyIE1CZWFuLgogICAgICAqLwotICAgIHB1YmxpYyBMb25nIGdldE5iT2NjdXJlbmNlcyhJbnRlZ2VyIGlkKSB7CisgICAgcHVibGljIHN5bmNocm9uaXplZCBMb25nIGdldE5iT2NjdXJlbmNlcyhJbnRlZ2VyIGlkKSB7CiAKICAgICAgICAgT2JqZWN0W10gb2JqID0gdGltZXJUYWJsZS5nZXQoaWQpOwogICAgICAgICBpZiAob2JqICE9IG51bGwpIHsKQEAgLTkzMSw3ICs5MzAsNyBAQAogICAgICAqIEByZXR1cm4gQSBjb3B5IG9mIHRoZSBmbGFnIGluZGljYXRpbmcgd2hldGhlciBhIHBlcmlvZGljIG5vdGlmaWNhdGlvbiBpcwogICAgICAqICAgICAgICAgZXhlY3V0ZWQgYXQgPGk+Zml4ZWQtZGVsYXk8L2k+IG9yIGF0IDxpPmZpeGVkLXJhdGU8L2k+LgogICAgICAqLwotICAgIHB1YmxpYyBCb29sZWFuIGdldEZpeGVkUmF0ZShJbnRlZ2VyIGlkKSB7CisgICAgcHVibGljIHN5bmNocm9uaXplZCBCb29sZWFuIGdldEZpeGVkUmF0ZShJbnRlZ2VyIGlkKSB7CiAKICAgICAgIE9iamVjdFtdIG9iaiA9IHRpbWVyVGFibGUuZ2V0KGlkKTsKICAgICAgIGlmIChvYmogIT0gbnVsbCkgewpAQCAtOTgyLDcgKzk4MSw3IEBACiAgICAgICoKICAgICAgKiBAcmV0dXJuIDxDT0RFPnRydWU8L0NPREU+IGlmIHRoZSBsaXN0IG9mIHRpbWVyIG5vdGlmaWNhdGlvbnMgaXMgZW1wdHksIDxDT0RFPmZhbHNlPC9DT0RFPiBvdGhlcndpc2UuCiAgICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNFbXB0eSgpIHsKICAgICAgICAgcmV0dXJuICh0aW1lclRhYmxlLmlzRW1wdHkoKSk7CiAgICAgfQogCkBAIC0xMTg0LDExICsxMTgzLDEzIEBACiAgICAgICAgIC8vCiAgICAgICAgIFRpbWVyQWxhcm1DbG9jayBhbGFybUNsb2NrID0gKFRpbWVyQWxhcm1DbG9jaylub3RpZmljYXRpb24uZ2V0U291cmNlKCk7CiAKLSAgICAgICAgZm9yIChPYmplY3RbXSBvYmogOiB0aW1lclRhYmxlLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICBpZiAob2JqW0FMQVJNX0NMT0NLX0lOREVYXSA9PSBhbGFybUNsb2NrKSB7Ci0gICAgICAgICAgICAgICAgdGltZXJOb3RpZmljYXRpb24gPSAoVGltZXJOb3RpZmljYXRpb24pb2JqW1RJTUVSX05PVElGX0lOREVYXTsKLSAgICAgICAgICAgICAgICB0aW1lckRhdGUgPSAoRGF0ZSlvYmpbVElNRVJfREFURV9JTkRFWF07Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHN5bmNocm9uaXplZChUaW1lci50aGlzKSB7CisgICAgICAgICAgICBmb3IgKE9iamVjdFtdIG9iaiA6IHRpbWVyVGFibGUudmFsdWVzKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAob2JqW0FMQVJNX0NMT0NLX0lOREVYXSA9PSBhbGFybUNsb2NrKSB7CisgICAgICAgICAgICAgICAgICAgIHRpbWVyTm90aWZpY2F0aW9uID0gKFRpbWVyTm90aWZpY2F0aW9uKW9ialtUSU1FUl9OT1RJRl9JTkRFWF07CisgICAgICAgICAgICAgICAgICAgIHRpbWVyRGF0ZSA9IChEYXRlKW9ialtUSU1FUl9EQVRFX0lOREVYXTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9uZXQvc3NsL0V4dGVuZGVkU1NMU2Vzc2lvbi5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L25ldC9zc2wvRXh0ZW5kZWRTU0xTZXNzaW9uLmphdmEKaW5kZXggOGFmZDk2My4uNzBmOThjZSAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L25ldC9zc2wvRXh0ZW5kZWRTU0xTZXNzaW9uLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L25ldC9zc2wvRXh0ZW5kZWRTU0xTZXNzaW9uLmphdmEKQEAgLTI1LDYgKzI1LDggQEAKIAogcGFja2FnZSBqYXZheC5uZXQuc3NsOwogCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKIC8qKgogICogRXh0ZW5kcyB0aGUgPGNvZGU+U1NMU2Vzc2lvbjwvY29kZT4gaW50ZXJmYWNlIHRvIHN1cHBvcnQgYWRkaXRpb25hbAogICogc2Vzc2lvbiBhdHRyaWJ1dGVzLgpAQCAtODMsNCArODUsMzQgQEAKICAgICAgKiBAc2VlIFg1MDlFeHRlbmRlZEtleU1hbmFnZXIKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nW10gZ2V0UGVlclN1cHBvcnRlZFNpZ25hdHVyZUFsZ29yaXRobXMoKTsKKworICAgIC8qKgorICAgICAqIE9idGFpbnMgYSB7QGxpbmsgTGlzdH0gY29udGFpbmluZyBhbGwge0BsaW5rIFNOSVNlcnZlck5hbWV9cworICAgICAqIG9mIHRoZSByZXF1ZXN0ZWQgU2VydmVyIE5hbWUgSW5kaWNhdGlvbiAoU05JKSBleHRlbnNpb24uCisgICAgICogPFA+CisgICAgICogSW4gc2VydmVyIG1vZGUsIHVubGVzcyB0aGUgcmV0dXJuIHtAbGluayBMaXN0fSBpcyBlbXB0eSwKKyAgICAgKiB0aGUgc2VydmVyIHNob3VsZCB1c2UgdGhlIHJlcXVlc3RlZCBzZXJ2ZXIgbmFtZXMgdG8gZ3VpZGUgaXRzCisgICAgICogc2VsZWN0aW9uIG9mIGFuIGFwcHJvcHJpYXRlIGF1dGhlbnRpY2F0aW9uIGNlcnRpZmljYXRlLCBhbmQvb3IKKyAgICAgKiBvdGhlciBhc3BlY3RzIG9mIHNlY3VyaXR5IHBvbGljeS4KKyAgICAgKiA8UD4KKyAgICAgKiBJbiBjbGllbnQgbW9kZSwgdW5sZXNzIHRoZSByZXR1cm4ge0BsaW5rIExpc3R9IGlzIGVtcHR5LAorICAgICAqIHRoZSBjbGllbnQgc2hvdWxkIHVzZSB0aGUgcmVxdWVzdGVkIHNlcnZlciBuYW1lcyB0byBndWlkZSBpdHMKKyAgICAgKiBlbmRwb2ludCBpZGVudGlmaWNhdGlvbiBvZiB0aGUgcGVlcidzIGlkZW50aXR5LCBhbmQvb3IKKyAgICAgKiBvdGhlciBhc3BlY3RzIG9mIHNlY3VyaXR5IHBvbGljeS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBub24tbnVsbCBpbW11dGFibGUgbGlzdCBvZiB7QGxpbmsgU05JU2VydmVyTmFtZX1zIG9mIHRoZQorICAgICAqICAgICAgICAgcmVxdWVzdGVkIHNlcnZlciBuYW1lIGluZGljYXRpb25zLiBUaGUgcmV0dXJuZWQgbGlzdCBtYXkgYmUKKyAgICAgKiAgICAgICAgIGVtcHR5IGlmIG5vIHNlcnZlciBuYW1lIGluZGljYXRpb25zIHdlcmUgcmVxdWVzdGVkLgorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhlIHVuZGVybHlpbmcgcHJvdmlkZXIKKyAgICAgKiAgICAgICAgIGRvZXMgbm90IGltcGxlbWVudCB0aGUgb3BlcmF0aW9uCisgICAgICoKKyAgICAgKiBAc2VlIFNOSVNlcnZlck5hbWUKKyAgICAgKiBAc2VlIFg1MDlFeHRlbmRlZFRydXN0TWFuYWdlcgorICAgICAqIEBzZWUgWDUwOUV4dGVuZGVkS2V5TWFuYWdlcgorICAgICAqCisgICAgICogQHNpbmNlIDEuOAorICAgICAqLworICAgIHB1YmxpYyBMaXN0PFNOSVNlcnZlck5hbWU+IGdldFJlcXVlc3RlZFNlcnZlck5hbWVzKCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvbmV0L3NzbC9IYW5kc2hha2VDb21wbGV0ZWRFdmVudC5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L25ldC9zc2wvSGFuZHNoYWtlQ29tcGxldGVkRXZlbnQuamF2YQppbmRleCBiOWZlOTIwLi4zOWU4MDJjIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvbmV0L3NzbC9IYW5kc2hha2VDb21wbGV0ZWRFdmVudC5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9uZXQvc3NsL0hhbmRzaGFrZUNvbXBsZXRlZEV2ZW50LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAxOTk3LCAyMDAzLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0xODYsOCArMTg2LDcgQEAKICAgICAgICAgICAgIC8vIGlmIHRoZSBwcm92aWRlciBkb2VzIG5vdCBzdXBwb3J0IGl0LCBmYWxsYmFjayB0byBwZWVyIGNlcnRzLgogICAgICAgICAgICAgLy8gcmV0dXJuIHRoZSBYNTAwUHJpbmNpcGFsIG9mIHRoZSBlbmQtZW50aXR5IGNlcnQuCiAgICAgICAgICAgICBDZXJ0aWZpY2F0ZVtdIGNlcnRzID0gZ2V0UGVlckNlcnRpZmljYXRlcygpOwotICAgICAgICAgICAgcHJpbmNpcGFsID0gKFg1MDBQcmluY2lwYWwpCi0gICAgICAgICAgICAgICAgKChYNTA5Q2VydGlmaWNhdGUpY2VydHNbMF0pLmdldFN1YmplY3RYNTAwUHJpbmNpcGFsKCk7CisgICAgICAgICAgICBwcmluY2lwYWwgPSAoKFg1MDlDZXJ0aWZpY2F0ZSljZXJ0c1swXSkuZ2V0U3ViamVjdFg1MDBQcmluY2lwYWwoKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gcHJpbmNpcGFsOwogICAgIH0KQEAgLTIxNiw3ICsyMTUsNyBAQAogICAgICAgICAgICAgLy8gcmV0dXJuIHRoZSBYNTAwUHJpbmNpcGFsIG9mIHRoZSBlbmQtZW50aXR5IGNlcnQuCiAgICAgICAgICAgICBDZXJ0aWZpY2F0ZVtdIGNlcnRzID0gZ2V0TG9jYWxDZXJ0aWZpY2F0ZXMoKTsKICAgICAgICAgICAgIGlmIChjZXJ0cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcHJpbmNpcGFsID0gKFg1MDBQcmluY2lwYWwpCisgICAgICAgICAgICAgICAgcHJpbmNpcGFsID0KICAgICAgICAgICAgICAgICAgICAgICAgICgoWDUwOUNlcnRpZmljYXRlKWNlcnRzWzBdKS5nZXRTdWJqZWN0WDUwMFByaW5jaXBhbCgpOwogICAgICAgICAgICAgfQogICAgICAgICB9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvbmV0L3NzbC9TTklIb3N0TmFtZS5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L25ldC9zc2wvU05JSG9zdE5hbWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjIwOTJjCi0tLSAvZGV2L251bGwKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L25ldC9zc2wvU05JSG9zdE5hbWUuamF2YQpAQCAtMCwwICsxLDM5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgT3JhY2xlIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCisgKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CisgKiBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBqYXZheC5uZXQuc3NsOworCitpbXBvcnQgamF2YS5uZXQuSUROOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5Db2RpbmdFcnJvckFjdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0RGVjb2RlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJhY3RlckNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworCisvKioKKyAqIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIHNlcnZlciBuYW1lIG9mIHR5cGUKKyAqIHtAbGluayBTdGFuZGFyZENvbnN0YW50cyNTTklfSE9TVF9OQU1FIGhvc3RfbmFtZX0gaW4gYSBTZXJ2ZXIgTmFtZQorICogSW5kaWNhdGlvbiAoU05JKSBleHRlbnNpb24uCisgKiA8UD4KKyAqIEFzIGRlc2NyaWJlZCBpbiBzZWN0aW9uIDMsICJTZXJ2ZXIgTmFtZSBJbmRpY2F0aW9uIiwgb2YKKyAqIDxBIEhSRUY9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzYwNjYudHh0Ij5UTFMgRXh0ZW5zaW9ucyAoUkZDIDYwNjYpPC9BPiwKKyAqICJIb3N0TmFtZSIgY29udGFpbnMgdGhlIGZ1bGx5IHF1YWxpZmllZCBETlMgaG9zdG5hbWUgb2YgdGhlIHNlcnZlciwgYXMKKyAqIHVuZGVyc3Rvb2QgYnkgdGhlIGNsaWVudC4gIFRoZSBlbmNvZGVkIHNlcnZlciBuYW1lIHZhbHVlIG9mIGEgaG9zdG5hbWUgaXMKKyAqIHJlcHJlc2VudGVkIGFzIGEgYnl0ZSBzdHJpbmcgdXNpbmcgQVNDSUkgZW5jb2Rpbmcgd2l0aG91dCBhIHRyYWlsaW5nIGRvdC4KKyAqIFRoaXMgYWxsb3dzIHRoZSBzdXBwb3J0IG9mIEludGVybmF0aW9uYWxpemVkIERvbWFpbiBOYW1lcyAoSUROKSB0aHJvdWdoCisgKiB0aGUgdXNlIG9mIEEtbGFiZWxzICh0aGUgQVNDSUktQ29tcGF0aWJsZSBFbmNvZGluZyAoQUNFKSBmb3JtIG9mIGEgdmFsaWQKKyAqIHN0cmluZyBvZiBJbnRlcm5hdGlvbmFsaXplZCBEb21haW4gTmFtZXMgZm9yIEFwcGxpY2F0aW9ucyAoSUROQSkpIGRlZmluZWQKKyAqIGluIDxBIEhSRUY9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzU4OTAudHh0Ij5SRkMgNTg5MDwvQT4uCisgKiA8UD4KKyAqIE5vdGUgdGhhdCB7QGNvZGUgU05JSG9zdE5hbWV9IG9iamVjdHMgYXJlIGltbXV0YWJsZS4KKyAqCisgKiBAc2VlIFNOSVNlcnZlck5hbWUKKyAqIEBzZWUgU3RhbmRhcmRDb25zdGFudHMjU05JX0hPU1RfTkFNRQorICoKKyAqIEBzaW5jZSAxLjgKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFNOSUhvc3ROYW1lIGV4dGVuZHMgU05JU2VydmVyTmFtZSB7CisKKyAgICAvLyB0aGUgZGVjb2RlZCBzdHJpbmcgdmFsdWUgb2YgdGhlIHNlcnZlciBuYW1lCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgaG9zdG5hbWU7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuIHtAY29kZSBTTklIb3N0TmFtZX0gdXNpbmcgdGhlIHNwZWNpZmllZCBob3N0bmFtZS4KKyAgICAgKiA8UD4KKyAgICAgKiBOb3RlIHRoYXQgcGVyIDxBIEhSRUY9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzYwNjYudHh0Ij5SRkMgNjA2NjwvQT4sCisgICAgICogdGhlIGVuY29kZWQgc2VydmVyIG5hbWUgdmFsdWUgb2YgYSBob3N0bmFtZSBpcworICAgICAqIHtAbGluayBTdGFuZGFyZENoYXJzZXRzI1VTX0FTQ0lJfS1jb21wbGlhbnQuICBJbiB0aGlzIG1ldGhvZCwKKyAgICAgKiB7QGNvZGUgaG9zdG5hbWV9IGNhbiBiZSBhIHVzZXItZnJpZW5kbHkgSW50ZXJuYXRpb25hbGl6ZWQgRG9tYWluIE5hbWUKKyAgICAgKiAoSUROKS4gIHtAbGluayBJRE4jdG9BU0NJSShTdHJpbmcsIGludCl9IGlzIHVzZWQgdG8gZW5mb3JjZSB0aGUKKyAgICAgKiByZXN0cmljdGlvbnMgb24gQVNDSUkgY2hhcmFjdGVycyBpbiBob3N0bmFtZXMgKHNlZQorICAgICAqIDxBIEhSRUY9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzM0OTAudHh0Ij5SRkMgMzQ5MDwvQT4sCisgICAgICogPEEgSFJFRj0iaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMTEyMi50eHQiPlJGQyAxMTIyPC9BPiwKKyAgICAgKiA8QSBIUkVGPSJodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMxMTIzLnR4dCI+UkZDIDExMjM8L0E+KSBhbmQKKyAgICAgKiB0cmFuc2xhdGUgdGhlIHtAY29kZSBob3N0bmFtZX0gaW50byBBU0NJSSBDb21wYXRpYmxlIEVuY29kaW5nIChBQ0UpLCBhczoKKyAgICAgKiA8cHJlPgorICAgICAqICAgICBJRE4udG9BU0NJSShob3N0bmFtZSwgSUROLlVTRV9TVEQzX0FTQ0lJX1JVTEVTKTsKKyAgICAgKiA8L3ByZT4KKyAgICAgKiA8UD4KKyAgICAgKiBUaGUge0Bjb2RlIGhvc3RuYW1lfSBhcmd1bWVudCBpcyBpbGxlZ2FsIGlmIGl0OgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+IHtAY29kZSBob3N0bmFtZX0gaXMgZW1wdHksPC9saT4KKyAgICAgKiA8bGk+IHtAY29kZSBob3N0bmFtZX0gZW5kcyB3aXRoIGEgdHJhaWxpbmcgZG90LDwvbGk+CisgICAgICogPGxpPiB7QGNvZGUgaG9zdG5hbWV9IGlzIG5vdCBhIHZhbGlkIEludGVybmF0aW9uYWxpemVkCisgICAgICogICAgICBEb21haW4gTmFtZSAoSUROKSBjb21wbGlhbnQgd2l0aCB0aGUgUkZDIDM0OTAgc3BlY2lmaWNhdGlvbi48L2xpPgorICAgICAqIDwvdWw+CisgICAgICogQHBhcmFtICBob3N0bmFtZQorICAgICAqICAgICAgICAgdGhlIGhvc3RuYW1lIG9mIHRoaXMgc2VydmVyIG5hbWUKKyAgICAgKgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYge0Bjb2RlIGhvc3RuYW1lfSBpcyB7QGNvZGUgbnVsbH0KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB7QGNvZGUgaG9zdG5hbWV9IGlzIGlsbGVnYWwKKyAgICAgKi8KKyAgICBwdWJsaWMgU05JSG9zdE5hbWUoU3RyaW5nIGhvc3RuYW1lKSB7CisgICAgICAgIC8vIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB3aWxsIGJlIHRocm93biBpZiB7QGNvZGUgaG9zdG5hbWV9IGlzCisgICAgICAgIC8vIG5vdCBhIHZhbGlkIElETi4KKyAgICAgICAgc3VwZXIoU3RhbmRhcmRDb25zdGFudHMuU05JX0hPU1RfTkFNRSwKKyAgICAgICAgICAgICAgICAoaG9zdG5hbWUgPSBJRE4udG9BU0NJSSgKKyAgICAgICAgICAgICAgICAgICAgT2JqZWN0cy5yZXF1aXJlTm9uTnVsbChob3N0bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJTZXJ2ZXIgbmFtZSB2YWx1ZSBvZiBob3N0X25hbWUgY2Fubm90IGJlIG51bGwiKSwKKyAgICAgICAgICAgICAgICAgICAgSUROLlVTRV9TVEQzX0FTQ0lJX1JVTEVTKSkKKyAgICAgICAgICAgICAgICAuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VU19BU0NJSSkpOworCisgICAgICAgIHRoaXMuaG9zdG5hbWUgPSBob3N0bmFtZTsKKworICAgICAgICAvLyBjaGVjayB0aGUgdmFsaWRpdHkgb2YgdGhlIHN0cmluZyBob3N0bmFtZQorICAgICAgICBjaGVja0hvc3ROYW1lKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbiB7QGNvZGUgU05JSG9zdE5hbWV9IHVzaW5nIHRoZSBzcGVjaWZpZWQgZW5jb2RlZCB2YWx1ZS4KKyAgICAgKiA8UD4KKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBub3JtYWxseSB1c2VkIHRvIHBhcnNlIHRoZSBlbmNvZGVkIG5hbWUgdmFsdWUgaW4gYQorICAgICAqIHJlcXVlc3RlZCBTTkkgZXh0ZW5zaW9uLgorICAgICAqIDxQPgorICAgICAqIFBlciA8QSBIUkVGPSJodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmM2MDY2LnR4dCI+UkZDIDYwNjY8L0E+LAorICAgICAqIHRoZSBlbmNvZGVkIG5hbWUgdmFsdWUgb2YgYSBob3N0bmFtZSBpcworICAgICAqIHtAbGluayBTdGFuZGFyZENoYXJzZXRzI1VTX0FTQ0lJfS1jb21wbGlhbnQuICBIb3dldmVyLCBpbiB0aGUgcHJldmlvdXMKKyAgICAgKiB2ZXJzaW9uIG9mIHRoZSBTTkkgZXh0ZW5zaW9uICgKKyAgICAgKiA8QSBIUkVGPSJodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmM0MzY2LnR4dCI+UkZDIDQzNjY8L0E+KSwKKyAgICAgKiB0aGUgZW5jb2RlZCBob3N0bmFtZSBpcyByZXByZXNlbnRlZCBhcyBhIGJ5dGUgc3RyaW5nIHVzaW5nIFVURi04CisgICAgICogZW5jb2RpbmcuICBGb3IgdGhlIHB1cnBvc2Ugb2YgdmVyc2lvbiB0b2xlcmFuY2UsIHRoaXMgbWV0aG9kIGFsbG93cworICAgICAqIHRoYXQgdGhlIGNoYXJzZXQgb2Yge0Bjb2RlIGVuY29kZWR9IGFyZ3VtZW50IGNhbiBiZQorICAgICAqIHtAbGluayBTdGFuZGFyZENoYXJzZXRzI1VURl84fSwgYXMgd2VsbCBhcworICAgICAqIHtAbGluayBTdGFuZGFyZENoYXJzZXRzI1VTX0FTQ0lJfS4gIHtAbGluayBJRE4jdG9BU0NJSShTdHJpbmcpfSBpcyB1c2VkCisgICAgICogdG8gdHJhbnNsYXRlIHRoZSB7QGNvZGUgZW5jb2RlZH0gYXJndW1lbnQgaW50byBBU0NJSSBDb21wYXRpYmxlCisgICAgICogRW5jb2RpbmcgKEFDRSkgaG9zdG5hbWUuCisgICAgICogPFA+CisgICAgICogSXQgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQgdGhhdCB0aGlzIGNvbnN0cnVjdG9yIGlzIG9ubHkgdXNlZCB0byBwYXJzZQorICAgICAqIHRoZSBlbmNvZGVkIG5hbWUgdmFsdWUgaW4gYSByZXF1ZXN0ZWQgU05JIGV4dGVuc2lvbi4gIE90aGVyd2lzZSwgdG8KKyAgICAgKiBjb21wbHkgd2l0aCA8QSBIUkVGPSJodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmM2MDY2LnR4dCI+UkZDIDYwNjY8L0E+LAorICAgICAqIHBsZWFzZSBhbHdheXMgdXNlIHtAbGluayBTdGFuZGFyZENoYXJzZXRzI1VTX0FTQ0lJfS1jb21wbGlhbnQgY2hhcnNldAorICAgICAqIGFuZCBlbmZvcmNlIHRoZSByZXN0cmljdGlvbnMgb24gQVNDSUkgY2hhcmFjdGVycyBpbiBob3N0bmFtZXMgKHNlZQorICAgICAqIDxBIEhSRUY9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzM0OTAudHh0Ij5SRkMgMzQ5MDwvQT4sCisgICAgICogPEEgSFJFRj0iaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMTEyMi50eHQiPlJGQyAxMTIyPC9BPiwKKyAgICAgKiA8QSBIUkVGPSJodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMxMTIzLnR4dCI+UkZDIDExMjM8L0E+KQorICAgICAqIGZvciB7QGNvZGUgZW5jb2RlZH0gYXJndW1lbnQsIG9yIHVzZSB7QGxpbmsgU05JSG9zdE5hbWUoU3RyaW5nKX0gaW5zdGVhZC4KKyAgICAgKiA8UD4KKyAgICAgKiBUaGUge0Bjb2RlIGVuY29kZWR9IGFyZ3VtZW50IGlzIGlsbGVnYWwgaWYgaXQ6CisgICAgICogPHVsPgorICAgICAqIDxsaT4ge0Bjb2RlIGVuY29kZWR9IGlzIGVtcHR5LDwvbGk+CisgICAgICogPGxpPiB7QGNvZGUgZW5jb2RlZH0gZW5kcyB3aXRoIGEgdHJhaWxpbmcgZG90LDwvbGk+CisgICAgICogPGxpPiB7QGNvZGUgZW5jb2RlZH0gaXMgbm90IGVuY29kZWQgaW4KKyAgICAgKiAgICAgIHtAbGluayBTdGFuZGFyZENoYXJzZXRzI1VTX0FTQ0lJfSBvcgorICAgICAqICAgICAge0BsaW5rIFN0YW5kYXJkQ2hhcnNldHMjVVRGXzh9LWNvbXBsaWFudCBjaGFyc2V0LDwvbGk+CisgICAgICogPGxpPiB7QGNvZGUgZW5jb2RlZH0gaXMgbm90IGEgdmFsaWQgSW50ZXJuYXRpb25hbGl6ZWQKKyAgICAgKiAgICAgIERvbWFpbiBOYW1lIChJRE4pIGNvbXBsaWFudCB3aXRoIHRoZSBSRkMgMzQ5MCBzcGVjaWZpY2F0aW9uLjwvbGk+CisgICAgICogPC91bD4KKyAgICAgKgorICAgICAqIDxQPgorICAgICAqIE5vdGUgdGhhdCB0aGUge0Bjb2RlIGVuY29kZWR9IGJ5dGUgYXJyYXkgaXMgY2xvbmVkCisgICAgICogdG8gcHJvdGVjdCBhZ2FpbnN0IHN1YnNlcXVlbnQgbW9kaWZpY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtICBlbmNvZGVkCisgICAgICogICAgICAgICB0aGUgZW5jb2RlZCBob3N0bmFtZSBvZiB0aGlzIHNlcnZlciBuYW1lCisgICAgICoKKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHtAY29kZSBlbmNvZGVkfSBpcyB7QGNvZGUgbnVsbH0KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB7QGNvZGUgZW5jb2RlZH0gaXMgaWxsZWdhbAorICAgICAqLworICAgIHB1YmxpYyBTTklIb3N0TmFtZShieXRlW10gZW5jb2RlZCkgeworICAgICAgICAvLyBOdWxsUG9pbnRlckV4Y2VwdGlvbiB3aWxsIGJlIHRocm93biBpZiB7QGNvZGUgZW5jb2RlZH0gaXMgbnVsbAorICAgICAgICBzdXBlcihTdGFuZGFyZENvbnN0YW50cy5TTklfSE9TVF9OQU1FLCBlbmNvZGVkKTsKKworICAgICAgICAvLyBDb21wbGlhbmNlOiBSRkMgNDM2NiByZXF1aXJlcyB0aGF0IHRoZSBob3N0bmFtZSBpcyByZXByZXNlbnRlZAorICAgICAgICAvLyBhcyBhIGJ5dGUgc3RyaW5nIHVzaW5nIFVURl84IGVuY29kaW5nIFtVVEY4XQorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gUGxlYXNlIGRvbid0IHVzZSB7QGxpbmsgU3RyaW5nfSBjb25zdHJ1Y3RvcnMgYmVjYXVzZSB0aGV5CisgICAgICAgICAgICAvLyBkbyBub3QgcmVwb3J0IGNvZGluZyBlcnJvcnMuCisgICAgICAgICAgICBDaGFyc2V0RGVjb2RlciBkZWNvZGVyID0gU3RhbmRhcmRDaGFyc2V0cy5VVEZfOC5uZXdEZWNvZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgLm9uTWFsZm9ybWVkSW5wdXQoQ29kaW5nRXJyb3JBY3Rpb24uUkVQT1JUKQorICAgICAgICAgICAgICAgICAgICAub25Vbm1hcHBhYmxlQ2hhcmFjdGVyKENvZGluZ0Vycm9yQWN0aW9uLlJFUE9SVCk7CisKKyAgICAgICAgICAgIHRoaXMuaG9zdG5hbWUgPSBJRE4udG9BU0NJSSgKKyAgICAgICAgICAgICAgICAgICAgZGVjb2Rlci5kZWNvZGUoQnl0ZUJ1ZmZlci53cmFwKGVuY29kZWQpKS50b1N0cmluZygpKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiB8IENoYXJhY3RlckNvZGluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBlbmNvZGVkIHNlcnZlciBuYW1lIHZhbHVlIGlzIGludmFsaWQiLCBlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNoZWNrIHRoZSB2YWxpZGl0eSBvZiB0aGUgc3RyaW5nIGhvc3RuYW1lCisgICAgICAgIGNoZWNrSG9zdE5hbWUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgU3RhbmRhcmRDaGFyc2V0cyNVU19BU0NJSX0tY29tcGxpYW50IGhvc3RuYW1lIG9mCisgICAgICogdGhpcyB7QGNvZGUgU05JSG9zdE5hbWV9IG9iamVjdC4KKyAgICAgKiA8UD4KKyAgICAgKiBOb3RlIHRoYXQsIHBlcgorICAgICAqIDxBIEhSRUY9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzYwNjYudHh0Ij5SRkMgNjA2NjwvQT4sIHRoZQorICAgICAqIHJldHVybmVkIGhvc3RuYW1lIG1heSBiZSBhbiBpbnRlcm5hdGlvbmFsaXplZCBkb21haW4gbmFtZSB0aGF0CisgICAgICogY29udGFpbnMgQS1sYWJlbHMuIFNlZQorICAgICAqIDxBIEhSRUY9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzU4OTAudHh0Ij5SRkMgNTg5MDwvQT4KKyAgICAgKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZGV0YWlsZWQgQS1sYWJlbCBzcGVjaWZpY2F0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUge0BsaW5rIFN0YW5kYXJkQ2hhcnNldHMjVVNfQVNDSUl9LWNvbXBsaWFudCBob3N0bmFtZQorICAgICAqICAgICAgICAgb2YgdGhpcyB7QGNvZGUgU05JSG9zdE5hbWV9IG9iamVjdAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXNjaWlOYW1lKCkgeworICAgICAgICByZXR1cm4gaG9zdG5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tcGFyZXMgdGhpcyBzZXJ2ZXIgbmFtZSB0byB0aGUgc3BlY2lmaWVkIG9iamVjdC4KKyAgICAgKiA8UD4KKyAgICAgKiBQZXIgPEEgSFJFRj0iaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjNjA2Ni50eHQiPlJGQyA2MDY2PC9BPiwgRE5TCisgICAgICogaG9zdG5hbWVzIGFyZSBjYXNlLWluc2Vuc2l0aXZlLiAgVHdvIHNlcnZlciBob3N0bmFtZXMgYXJlIGVxdWFsIGlmLAorICAgICAqIGFuZCBvbmx5IGlmLCB0aGV5IGhhdmUgdGhlIHNhbWUgbmFtZSB0eXBlLCBhbmQgdGhlIGhvc3RuYW1lcyBhcmUKKyAgICAgKiBlcXVhbCBpbiBhIGNhc2UtaW5kZXBlbmRlbnQgY29tcGFyaXNvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgb3RoZXIKKyAgICAgKiAgICAgICAgIHRoZSBvdGhlciBzZXJ2ZXIgbmFtZSBvYmplY3QgdG8gY29tcGFyZSB3aXRoLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiwgYW5kIG9ubHkgaWYsIHRoZSB7QGNvZGUgb3RoZXJ9IGlzIGNvbnNpZGVyZWQKKyAgICAgKiAgICAgICAgIGVxdWFsIHRvIHRoaXMgaW5zdGFuY2UKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7CisgICAgICAgIGlmICh0aGlzID09IG90aGVyKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChvdGhlciBpbnN0YW5jZW9mIFNOSUhvc3ROYW1lKSB7CisgICAgICAgICAgICByZXR1cm4gaG9zdG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgoKFNOSUhvc3ROYW1lKW90aGVyKS5ob3N0bmFtZSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGhhc2ggY29kZSB2YWx1ZSBmb3IgdGhpcyB7QGNvZGUgU05JSG9zdE5hbWV9LgorICAgICAqIDxQPgorICAgICAqIFRoZSBoYXNoIGNvZGUgdmFsdWUgaXMgZ2VuZXJhdGVkIHVzaW5nIHRoZSBjYXNlLWluc2Vuc2l0aXZlIGhvc3RuYW1lCisgICAgICogb2YgdGhpcyB7QGNvZGUgU05JSG9zdE5hbWV9LgorICAgICAqCisgICAgICogQHJldHVybiBhIGhhc2ggY29kZSB2YWx1ZSBmb3IgdGhpcyB7QGNvZGUgU05JSG9zdE5hbWV9LgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIGludCByZXN1bHQgPSAxNzsgICAgICAgIC8vIDE3LzMxOiBwcmltZSBudW1iZXIgdG8gZGVjcmVhc2UgY29sbGlzaW9ucworICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIGhvc3RuYW1lLnRvVXBwZXJDYXNlKExvY2FsZS5FTkdMSVNIKS5oYXNoQ29kZSgpOworCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgb2JqZWN0LCBpbmNsdWRpbmcgdGhlIEROUworICAgICAqIGhvc3RuYW1lIGluIHRoaXMge0Bjb2RlIFNOSUhvc3ROYW1lfSBvYmplY3QuCisgICAgICogPFA+CisgICAgICogVGhlIGV4YWN0IGRldGFpbHMgb2YgdGhlIHJlcHJlc2VudGF0aW9uIGFyZSB1bnNwZWNpZmllZCBhbmQgc3ViamVjdAorICAgICAqIHRvIGNoYW5nZSwgYnV0IHRoZSBmb2xsb3dpbmcgbWF5IGJlIHJlZ2FyZGVkIGFzIHR5cGljYWw6CisgICAgICogPHByZT4KKyAgICAgKiAgICAgInR5cGU9aG9zdF9uYW1lICgwKSwgdmFsdWU9e0BsaXRlcmFsIDxob3N0bmFtZT59IgorICAgICAqIDwvcHJlPgorICAgICAqIFRoZSAie0BsaXRlcmFsIDxob3N0bmFtZT59IiBpcyBhbiBBU0NJSSByZXByZXNlbnRhdGlvbiBvZiB0aGUgaG9zdG5hbWUsCisgICAgICogd2hpY2ggbWF5IGNvbnRhaW5zIEEtbGFiZWxzLiAgRm9yIGV4YW1wbGUsIGEgcmV0dXJuZWQgdmFsdWUgb2YgYW4gcHNldWRvCisgICAgICogaG9zdG5hbWUgbWF5IGxvb2sgbGlrZToKKyAgICAgKiA8cHJlPgorICAgICAqICAgICAidHlwZT1ob3N0X25hbWUgKDApLCB2YWx1ZT13d3cuZXhhbXBsZS5jb20iCisgICAgICogPC9wcmU+CisgICAgICogb3IKKyAgICAgKiA8cHJlPgorICAgICAqICAgICAidHlwZT1ob3N0X25hbWUgKDApLCB2YWx1ZT14bi0tZnNxdTAwYS54bi0tMHp3bTU2ZCIKKyAgICAgKiA8L3ByZT4KKyAgICAgKiA8UD4KKyAgICAgKiBQbGVhc2UgTk9URSB0aGF0IHRoZSBleGFjdCBkZXRhaWxzIG9mIHRoZSByZXByZXNlbnRhdGlvbiBhcmUgdW5zcGVjaWZpZWQKKyAgICAgKiBhbmQgc3ViamVjdCB0byBjaGFuZ2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBvYmplY3QuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJ0eXBlPWhvc3RfbmFtZSAoMCksIHZhbHVlPSIgKyBob3N0bmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuIHtAbGluayBTTklNYXRjaGVyfSBvYmplY3QgZm9yIHtAY29kZSBTTklIb3N0TmFtZX1zLgorICAgICAqIDxQPgorICAgICAqIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIGJ5IGEgc2VydmVyIHRvIHZlcmlmeSB0aGUgYWNjZXB0YWJsZQorICAgICAqIHtAY29kZSBTTklIb3N0TmFtZX1zLiAgRm9yIGV4YW1wbGUsCisgICAgICogPHByZT4KKyAgICAgKiAgICAgU05JTWF0Y2hlciBtYXRjaGVyID0KKyAgICAgKiAgICAgICAgIFNOSUhvc3ROYW1lLmNyZWF0ZVNOSU1hdGNoZXIoInd3d1xcLmV4YW1wbGVcXC5jb20iKTsKKyAgICAgKiA8L3ByZT4KKyAgICAgKiB3aWxsIGFjY2VwdCB0aGUgaG9zdG5hbWUgInd3dy5leGFtcGxlLmNvbSIuCisgICAgICogPHByZT4KKyAgICAgKiAgICAgU05JTWF0Y2hlciBtYXRjaGVyID0KKyAgICAgKiAgICAgICAgIFNOSUhvc3ROYW1lLmNyZWF0ZVNOSU1hdGNoZXIoInd3d1xcLmV4YW1wbGVcXC4oY29tfG9yZykiKTsKKyAgICAgKiA8L3ByZT4KKyAgICAgKiB3aWxsIGFjY2VwdCBob3N0bmFtZXMgInd3dy5leGFtcGxlLmNvbSIgYW5kICJ3d3cuZXhhbXBsZS5vcmciLgorICAgICAqCisgICAgICogQHBhcmFtICByZWdleAorICAgICAqICAgICAgICAgdGhlIDxhIGhyZWY9IntAZG9jUm9vdH0vamF2YS91dGlsL3JlZ2V4L1BhdHRlcm4uaHRtbCNzdW0iPgorICAgICAqICAgICAgICAgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm48L2E+CisgICAgICogICAgICAgICByZXByZXNlbnRpbmcgdGhlIGhvc3RuYW1lKHMpIHRvIG1hdGNoCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB7QGNvZGUgcmVnZXh9IGlzCisgICAgICogICAgICAgICB7QGNvZGUgbnVsbH0KKyAgICAgKiBAdGhyb3dzIFBhdHRlcm5TeW50YXhFeGNlcHRpb24gaWYgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbidzIHN5bnRheAorICAgICAqICAgICAgICAgaXMgaW52YWxpZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU05JTWF0Y2hlciBjcmVhdGVTTklNYXRjaGVyKFN0cmluZyByZWdleCkgeworICAgICAgICBpZiAocmVnZXggPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJUaGUgcmVndWxhciBleHByZXNzaW9uIGNhbm5vdCBiZSBudWxsIik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmV3IFNOSUhvc3ROYW1lTWF0Y2hlcihyZWdleCk7CisgICAgfQorCisgICAgLy8gY2hlY2sgdGhlIHZhbGlkaXR5IG9mIHRoZSBzdHJpbmcgaG9zdG5hbWUKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tIb3N0TmFtZSgpIHsKKyAgICAgICAgaWYgKGhvc3RuYW1lLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiU2VydmVyIG5hbWUgdmFsdWUgb2YgaG9zdF9uYW1lIGNhbm5vdCBiZSBlbXB0eSIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGhvc3RuYW1lLmVuZHNXaXRoKCIuIikpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIlNlcnZlciBuYW1lIHZhbHVlIG9mIGhvc3RfbmFtZSBjYW5ub3QgaGF2ZSB0aGUgdHJhaWxpbmcgZG90Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBjbGFzcyBTTklIb3N0TmFtZU1hdGNoZXIgZXh0ZW5kcyBTTklNYXRjaGVyIHsKKworICAgICAgICAvLyB0aGUgY29tcGlsZWQgcmVwcmVzZW50YXRpb24gb2YgYSByZWd1bGFyIGV4cHJlc3Npb24uCisgICAgICAgIHByaXZhdGUgZmluYWwgUGF0dGVybiBwYXR0ZXJuOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGFuIFNOSUhvc3ROYW1lTWF0Y2hlciBvYmplY3QuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSAgcmVnZXgKKyAgICAgICAgICogICAgICAgICB0aGUgPGEgaHJlZj0ie0Bkb2NSb290fS9qYXZhL3V0aWwvcmVnZXgvUGF0dGVybi5odG1sI3N1bSI+CisgICAgICAgICAqICAgICAgICAgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm48L2E+CisgICAgICAgICAqICAgICAgICAgcmVwcmVzZW50aW5nIHRoZSBob3N0bmFtZShzKSB0byBtYXRjaAorICAgICAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHtAY29kZSByZWdleH0gaXMKKyAgICAgICAgICogICAgICAgICB7QGNvZGUgbnVsbH0KKyAgICAgICAgICogQHRocm93cyBQYXR0ZXJuU3ludGF4RXhjZXB0aW9uIGlmIHRoZSByZWd1bGFyIGV4cHJlc3Npb24ncyBzeW50YXgKKyAgICAgICAgICogICAgICAgICBpcyBpbnZhbGlkCisgICAgICAgICAqLworICAgICAgICBTTklIb3N0TmFtZU1hdGNoZXIoU3RyaW5nIHJlZ2V4KSB7CisgICAgICAgICAgICBzdXBlcihTdGFuZGFyZENvbnN0YW50cy5TTklfSE9TVF9OQU1FKTsKKyAgICAgICAgICAgIHBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUocmVnZXgsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQXR0ZW1wdHMgdG8gbWF0Y2ggdGhlIGdpdmVuIHtAbGluayBTTklTZXJ2ZXJOYW1lfS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtICBzZXJ2ZXJOYW1lCisgICAgICAgICAqICAgICAgICAgdGhlIHtAbGluayBTTklTZXJ2ZXJOYW1lfSBpbnN0YW5jZSBvbiB3aGljaCB0aGlzIG1hdGNoZXIKKyAgICAgICAgICogICAgICAgICBwZXJmb3JtcyBtYXRjaCBvcGVyYXRpb25zCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmLCBhbmQgb25seSBpZiwgdGhlIG1hdGNoZXIgbWF0Y2hlcyB0aGUKKyAgICAgICAgICogICAgICAgICBnaXZlbiB7QGNvZGUgc2VydmVyTmFtZX0KKyAgICAgICAgICoKKyAgICAgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB7QGNvZGUgc2VydmVyTmFtZX0gaXMge0Bjb2RlIG51bGx9CisgICAgICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHtAY29kZSBzZXJ2ZXJOYW1lfSBpcworICAgICAgICAgKiAgICAgICAgIG5vdCBvZiB7QGNvZGUgU3RhbmRhcmRDb25zdGFudHMjU05JX0hPU1RfTkFNRX0gdHlwZQorICAgICAgICAgKgorICAgICAgICAgKiBAc2VlIFNOSVNlcnZlck5hbWUKKyAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKFNOSVNlcnZlck5hbWUgc2VydmVyTmFtZSkgeworICAgICAgICAgICAgaWYgKHNlcnZlck5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIlRoZSBTTklTZXJ2ZXJOYW1lIGFyZ3VtZW50IGNhbm5vdCBiZSBudWxsIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFNOSUhvc3ROYW1lIGhvc3RuYW1lOworICAgICAgICAgICAgaWYgKCEoc2VydmVyTmFtZSBpbnN0YW5jZW9mIFNOSUhvc3ROYW1lKSkgeworICAgICAgICAgICAgICAgIGlmIChzZXJ2ZXJOYW1lLmdldFR5cGUoKSAhPSBTdGFuZGFyZENvbnN0YW50cy5TTklfSE9TVF9OQU1FKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiVGhlIHNlcnZlciBuYW1lIHR5cGUgaXMgbm90IGhvc3RfbmFtZSIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGhvc3RuYW1lID0gbmV3IFNOSUhvc3ROYW1lKHNlcnZlck5hbWUuZ2V0RW5jb2RlZCgpKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiB8IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGhvc3RuYW1lID0gKFNOSUhvc3ROYW1lKXNlcnZlck5hbWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIExldCdzIGZpcnN0IHRyeSB0aGUgYXNjaWkgbmFtZSBtYXRjaGluZworICAgICAgICAgICAgU3RyaW5nIGFzY2lpTmFtZSA9IGhvc3RuYW1lLmdldEFzY2lpTmFtZSgpOworICAgICAgICAgICAgaWYgKHBhdHRlcm4ubWF0Y2hlcihhc2NpaU5hbWUpLm1hdGNoZXMoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBNYXkgYmUgYW4gaW50ZXJuYXRpb25hbGl6ZWQgZG9tYWluIG5hbWUsIGNoZWNrIHRoZSBVbmljb2RlCisgICAgICAgICAgICAvLyByZXByZXNlbnRhdGlvbnMuCisgICAgICAgICAgICByZXR1cm4gcGF0dGVybi5tYXRjaGVyKElETi50b1VuaWNvZGUoYXNjaWlOYW1lKSkubWF0Y2hlcygpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L25ldC9zc2wvU05JTWF0Y2hlci5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L25ldC9zc2wvU05JTWF0Y2hlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwMjViOTkKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvbmV0L3NzbC9TTklNYXRjaGVyLmphdmEKQEAgLTAsMCArMSwxMDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IE9yYWNsZSBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQorICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQorICogcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2UgamF2YXgubmV0LnNzbDsKKworLyoqCisgKiBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSBtYXRjaGVyIHRoYXQgcGVyZm9ybXMgbWF0Y2gKKyAqIG9wZXJhdGlvbnMgb24gYW4ge0BsaW5rIFNOSVNlcnZlck5hbWV9IGluc3RhbmNlLgorICogPFA+CisgKiBTZXJ2ZXJzIGNhbiB1c2UgU2VydmVyIE5hbWUgSW5kaWNhdGlvbiAoU05JKSBpbmZvcm1hdGlvbiB0byBkZWNpZGUgaWYKKyAqIHNwZWNpZmljIHtAbGluayBTU0xTb2NrZXR9IG9yIHtAbGluayBTU0xFbmdpbmV9IGluc3RhbmNlcyBzaG91bGQgYWNjZXB0CisgKiBhIGNvbm5lY3Rpb24uICBGb3IgZXhhbXBsZSwgd2hlbiBtdWx0aXBsZSAidmlydHVhbCIgb3IgIm5hbWUtYmFzZWQiCisgKiBzZXJ2ZXJzIGFyZSBob3N0ZWQgb24gYSBzaW5nbGUgdW5kZXJseWluZyBuZXR3b3JrIGFkZHJlc3MsIHRoZSBzZXJ2ZXIKKyAqIGFwcGxpY2F0aW9uIGNhbiB1c2UgU05JIGluZm9ybWF0aW9uIHRvIGRldGVybWluZSB3aGV0aGVyIHRoaXMgc2VydmVyIGlzCisgKiB0aGUgZXhhY3Qgc2VydmVyIHRoYXQgdGhlIGNsaWVudCB3YW50cyB0byBhY2Nlc3MuICBJbnN0YW5jZXMgb2YgdGhpcworICogY2xhc3MgY2FuIGJlIHVzZWQgYnkgYSBzZXJ2ZXIgdG8gdmVyaWZ5IHRoZSBhY2NlcHRhYmxlIHNlcnZlciBuYW1lcyBvZgorICogYSBwYXJ0aWN1bGFyIHR5cGUsIHN1Y2ggYXMgaG9zdCBuYW1lcy4KKyAqIDxQPgorICoge0Bjb2RlIFNOSU1hdGNoZXJ9IG9iamVjdHMgYXJlIGltbXV0YWJsZS4gIFN1YmNsYXNzZXMgc2hvdWxkIG5vdCBwcm92aWRlCisgKiBtZXRob2RzIHRoYXQgY2FuIGNoYW5nZSB0aGUgc3RhdGUgb2YgYW4gaW5zdGFuY2Ugb25jZSBpdCBoYXMgYmVlbiBjcmVhdGVkLgorICoKKyAqIEBzZWUgU05JU2VydmVyTmFtZQorICogQHNlZSBTTklIb3N0TmFtZQorICogQHNlZSBTU0xQYXJhbWV0ZXJzI2dldFNOSU1hdGNoZXJzKCkKKyAqIEBzZWUgU1NMUGFyYW1ldGVycyNzZXRTTklNYXRjaGVycyhDb2xsZWN0aW9uPFNOSU1hdGNoZXI+KQorICoKKyAqIEBzaW5jZSAxLjgKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFNOSU1hdGNoZXIgeworCisgICAgLy8gdGhlIHR5cGUgb2YgdGhlIHNlcnZlciBuYW1lIHRoYXQgdGhpcyBtYXRjaGVyIHBlcmZvcm1zIG9uCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgdHlwZTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW4ge0Bjb2RlIFNOSU1hdGNoZXJ9IHVzaW5nIHRoZSBzcGVjaWZpZWQgc2VydmVyIG5hbWUgdHlwZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgdHlwZQorICAgICAqICAgICAgICAgdGhlIHR5cGUgb2YgdGhlIHNlcnZlciBuYW1lIHRoYXQgdGhpcyBtYXRjaGVyIHBlcmZvcm1zIG9uCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB7QGNvZGUgdHlwZX0gaXMgbm90IGluIHRoZSByYW5nZQorICAgICAqICAgICAgICAgb2YgMCB0byAyNTUsIGluY2x1c2l2ZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU05JTWF0Y2hlcihpbnQgdHlwZSkgeworICAgICAgICBpZiAodHlwZSA8IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIlNlcnZlciBuYW1lIHR5cGUgY2Fubm90IGJlIGxlc3MgdGhhbiB6ZXJvIik7CisgICAgICAgIH0gZWxzZSBpZiAodHlwZSA+IDI1NSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiU2VydmVyIG5hbWUgdHlwZSBjYW5ub3QgYmUgZ3JlYXRlciB0aGFuIDI1NSIpOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzZXJ2ZXIgbmFtZSB0eXBlIG9mIHRoaXMge0Bjb2RlIFNOSU1hdGNoZXJ9IG9iamVjdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHNlcnZlciBuYW1lIHR5cGUgb2YgdGhpcyB7QGNvZGUgU05JTWF0Y2hlcn0gb2JqZWN0LgorICAgICAqCisgICAgICogQHNlZSBTTklTZXJ2ZXJOYW1lCisgICAgICovCisgICAgcHVibGljIGZpbmFsIGludCBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gdHlwZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBdHRlbXB0cyB0byBtYXRjaCB0aGUgZ2l2ZW4ge0BsaW5rIFNOSVNlcnZlck5hbWV9LgorICAgICAqCisgICAgICogQHBhcmFtICBzZXJ2ZXJOYW1lCisgICAgICogICAgICAgICB0aGUge0BsaW5rIFNOSVNlcnZlck5hbWV9IGluc3RhbmNlIG9uIHdoaWNoIHRoaXMgbWF0Y2hlcgorICAgICAqICAgICAgICAgcGVyZm9ybXMgbWF0Y2ggb3BlcmF0aW9ucworICAgICAqCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYsIGFuZCBvbmx5IGlmLCB0aGUgbWF0Y2hlciBtYXRjaGVzIHRoZQorICAgICAqICAgICAgICAgZ2l2ZW4ge0Bjb2RlIHNlcnZlck5hbWV9CisgICAgICoKKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHtAY29kZSBzZXJ2ZXJOYW1lfSBpcyB7QGNvZGUgbnVsbH0KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB7QGNvZGUgc2VydmVyTmFtZX0gaXMKKyAgICAgKiAgICAgICAgIG5vdCBvZiB0aGUgZ2l2ZW4gc2VydmVyIG5hbWUgdHlwZSBvZiB0aGlzIG1hdGNoZXIKKyAgICAgKgorICAgICAqIEBzZWUgU05JU2VydmVyTmFtZQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIG1hdGNoZXMoU05JU2VydmVyTmFtZSBzZXJ2ZXJOYW1lKTsKK30KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9uZXQvc3NsL1NOSVNlcnZlck5hbWUuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9uZXQvc3NsL1NOSVNlcnZlck5hbWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmMyMjg2Ci0tLSAvZGV2L251bGwKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L25ldC9zc2wvU05JU2VydmVyTmFtZS5qYXZhCkBAIC0wLDAgKzEsMjEzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBPcmFjbGUgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKKyAqIHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGphdmF4Lm5ldC5zc2w7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCisvKioKKyAqIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIHNlcnZlciBuYW1lIGluIGEgU2VydmVyIE5hbWUKKyAqIEluZGljYXRpb24gKFNOSSkgZXh0ZW5zaW9uLgorICogPFA+CisgKiBUaGUgU05JIGV4dGVuc2lvbiBpcyBhIGZlYXR1cmUgdGhhdCBleHRlbmRzIHRoZSBTU0wvVExTIHByb3RvY29scyB0bworICogaW5kaWNhdGUgd2hhdCBzZXJ2ZXIgbmFtZSB0aGUgY2xpZW50IGlzIGF0dGVtcHRpbmcgdG8gY29ubmVjdCB0byBkdXJpbmcKKyAqIGhhbmRzaGFraW5nLiAgU2VlIHNlY3Rpb24gMywgIlNlcnZlciBOYW1lIEluZGljYXRpb24iLCBvZiA8QQorICogSFJFRj0iaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjNjA2Ni50eHQiPlRMUyBFeHRlbnNpb25zIChSRkMgNjA2Nik8L0E+LgorICogPFA+CisgKiB7QGNvZGUgU05JU2VydmVyTmFtZX0gb2JqZWN0cyBhcmUgaW1tdXRhYmxlLiAgU3ViY2xhc3NlcyBzaG91bGQgbm90IHByb3ZpZGUKKyAqIG1ldGhvZHMgdGhhdCBjYW4gY2hhbmdlIHRoZSBzdGF0ZSBvZiBhbiBpbnN0YW5jZSBvbmNlIGl0IGhhcyBiZWVuIGNyZWF0ZWQuCisgKgorICogQHNlZSBTU0xQYXJhbWV0ZXJzI2dldFNlcnZlck5hbWVzKCkKKyAqIEBzZWUgU1NMUGFyYW1ldGVycyNzZXRTZXJ2ZXJOYW1lcyhMaXN0PFNOSVNlcnZlck5hbWU+KQorICoKKyAqIEBzaW5jZSAxLjgKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFNOSVNlcnZlck5hbWUgeworCisgICAgLy8gdGhlIHR5cGUgb2YgdGhlIHNlcnZlciBuYW1lCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgdHlwZTsKKworICAgIC8vIHRoZSBlbmNvZGVkIHZhbHVlIG9mIHRoZSBzZXJ2ZXIgbmFtZQorICAgIHByaXZhdGUgZmluYWwgYnl0ZVtdIGVuY29kZWQ7CisKKyAgICAvLyB0aGUgaGV4IGRpZ2l0YWxzCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIEhFWEVTID0gIjAxMjM0NTY3ODlBQkNERUYiLnRvQ2hhckFycmF5KCk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuIHtAY29kZSBTTklTZXJ2ZXJOYW1lfSB1c2luZyB0aGUgc3BlY2lmaWVkIG5hbWUgdHlwZSBhbmQKKyAgICAgKiBlbmNvZGVkIHZhbHVlLgorICAgICAqIDxQPgorICAgICAqIE5vdGUgdGhhdCB0aGUge0Bjb2RlIGVuY29kZWR9IGJ5dGUgYXJyYXkgaXMgY2xvbmVkIHRvIHByb3RlY3QgYWdhaW5zdAorICAgICAqIHN1YnNlcXVlbnQgbW9kaWZpY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtICB0eXBlCisgICAgICogICAgICAgICB0aGUgdHlwZSBvZiB0aGUgc2VydmVyIG5hbWUKKyAgICAgKiBAcGFyYW0gIGVuY29kZWQKKyAgICAgKiAgICAgICAgIHRoZSBlbmNvZGVkIHZhbHVlIG9mIHRoZSBzZXJ2ZXIgbmFtZQorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYge0Bjb2RlIHR5cGV9IGlzIG5vdCBpbiB0aGUgcmFuZ2UKKyAgICAgKiAgICAgICAgIG9mIDAgdG8gMjU1LCBpbmNsdXNpdmUuCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB7QGNvZGUgZW5jb2RlZH0gaXMgbnVsbAorICAgICAqLworICAgIHByb3RlY3RlZCBTTklTZXJ2ZXJOYW1lKGludCB0eXBlLCBieXRlW10gZW5jb2RlZCkgeworICAgICAgICBpZiAodHlwZSA8IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIlNlcnZlciBuYW1lIHR5cGUgY2Fubm90IGJlIGxlc3MgdGhhbiB6ZXJvIik7CisgICAgICAgIH0gZWxzZSBpZiAodHlwZSA+IDI1NSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiU2VydmVyIG5hbWUgdHlwZSBjYW5ub3QgYmUgZ3JlYXRlciB0aGFuIDI1NSIpOworICAgICAgICB9CisgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisKKyAgICAgICAgaWYgKGVuY29kZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJTZXJ2ZXIgbmFtZSBlbmNvZGVkIHZhbHVlIGNhbm5vdCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5lbmNvZGVkID0gZW5jb2RlZC5jbG9uZSgpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmFtZSB0eXBlIG9mIHRoaXMgc2VydmVyIG5hbWUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIHR5cGUgb2YgdGhpcyBzZXJ2ZXIgbmFtZQorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGNvcHkgb2YgdGhlIGVuY29kZWQgc2VydmVyIG5hbWUgdmFsdWUgb2YgdGhpcyBzZXJ2ZXIgbmFtZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBjb3B5IG9mIHRoZSBlbmNvZGVkIHNlcnZlciBuYW1lIHZhbHVlIG9mIHRoaXMgc2VydmVyIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgYnl0ZVtdIGdldEVuY29kZWQoKSB7CisgICAgICAgIHJldHVybiBlbmNvZGVkLmNsb25lKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgc29tZSBvdGhlciBvYmplY3QgaXMgImVxdWFsIHRvIiB0aGlzIHNlcnZlciBuYW1lLgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmLCBhbmQgb25seSBpZiwge0Bjb2RlIG90aGVyfSBpcyBvZiB0aGUgc2FtZSBjbGFzcworICAgICAqICAgICAgICAgb2YgdGhpcyBvYmplY3QsIGFuZCBoYXMgdGhlIHNhbWUgbmFtZSB0eXBlIGFuZAorICAgICAqICAgICAgICAgZW5jb2RlZCB2YWx1ZSBhcyB0aGlzIHNlcnZlciBuYW1lLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsKKyAgICAgICAgaWYgKHRoaXMgPT0gb3RoZXIpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRoaXMuZ2V0Q2xhc3MoKSAhPSBvdGhlci5nZXRDbGFzcygpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBTTklTZXJ2ZXJOYW1lIHRoYXQgPSAoU05JU2VydmVyTmFtZSlvdGhlcjsKKyAgICAgICAgcmV0dXJuICh0aGlzLnR5cGUgPT0gdGhhdC50eXBlKSAmJgorICAgICAgICAgICAgICAgICAgICBBcnJheXMuZXF1YWxzKHRoaXMuZW5jb2RlZCwgdGhhdC5lbmNvZGVkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgaGFzaCBjb2RlIHZhbHVlIGZvciB0aGlzIHNlcnZlciBuYW1lLgorICAgICAqIDxQPgorICAgICAqIFRoZSBoYXNoIGNvZGUgdmFsdWUgaXMgZ2VuZXJhdGVkIHVzaW5nIHRoZSBuYW1lIHR5cGUgYW5kIGVuY29kZWQKKyAgICAgKiB2YWx1ZSBvZiB0aGlzIHNlcnZlciBuYW1lLgorICAgICAqCisgICAgICogQHJldHVybiBhIGhhc2ggY29kZSB2YWx1ZSBmb3IgdGhpcyBzZXJ2ZXIgbmFtZS4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgcmVzdWx0ID0gMTc7ICAgIC8vIDE3LzMxOiBwcmltZSBudW1iZXIgdG8gZGVjcmVhc2UgY29sbGlzaW9ucworICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIHR5cGU7CisgICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgQXJyYXlzLmhhc2hDb2RlKGVuY29kZWQpOworCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHNlcnZlciBuYW1lLCBpbmNsdWRpbmcgdGhlIHNlcnZlcgorICAgICAqIG5hbWUgdHlwZSBhbmQgdGhlIGVuY29kZWQgc2VydmVyIG5hbWUgdmFsdWUgaW4gdGhpcworICAgICAqIHtAY29kZSBTTklTZXJ2ZXJOYW1lfSBvYmplY3QuCisgICAgICogPFA+CisgICAgICogVGhlIGV4YWN0IGRldGFpbHMgb2YgdGhlIHJlcHJlc2VudGF0aW9uIGFyZSB1bnNwZWNpZmllZCBhbmQgc3ViamVjdAorICAgICAqIHRvIGNoYW5nZSwgYnV0IHRoZSBmb2xsb3dpbmcgbWF5IGJlIHJlZ2FyZGVkIGFzIHR5cGljYWw6CisgICAgICogPHByZT4KKyAgICAgKiAgICAgInR5cGU9e0BsaXRlcmFsIDxuYW1lIHR5cGU+fSwgdmFsdWU9e0BsaXRlcmFsIDxuYW1lIHZhbHVlPn0iCisgICAgICogPC9wcmU+CisgICAgICogPFA+CisgICAgICogSW4gdGhpcyBjbGFzcywgdGhlIGZvcm1hdCBvZiAie0BsaXRlcmFsIDxuYW1lIHR5cGU+fSIgaXMKKyAgICAgKiAiW0xJVEVSQUxdIChJTlRFR0VSKSIsIHdoZXJlIHRoZSBvcHRpb25hbCAiTElURVJBTCIgaXMgdGhlIGxpdGVyYWwKKyAgICAgKiBuYW1lLCBhbmQgSU5URUdFUiBpcyB0aGUgaW50ZWdlciB2YWx1ZSBvZiB0aGUgbmFtZSB0eXBlLiAgVGhlIGZvcm1hdAorICAgICAqIG9mICJ7QGxpdGVyYWwgPG5hbWUgdmFsdWU+fSIgaXMgIlhYOi4uLjpYWCIsIHdoZXJlICJYWCIgaXMgdGhlCisgICAgICogaGV4YWRlY2ltYWwgZGlnaXQgcmVwcmVzZW50YXRpb24gb2YgYSBieXRlIHZhbHVlLiBGb3IgZXhhbXBsZSwgYQorICAgICAqIHJldHVybmVkIHZhbHVlIG9mIGFuIHBzZXVkbyBzZXJ2ZXIgbmFtZSBtYXkgbG9vayBsaWtlOgorICAgICAqIDxwcmU+CisgICAgICogICAgICJ0eXBlPSgzMSksIHZhbHVlPTc3Ojc3Ojc3OjJFOjY1Ojc4OjYxOjZEOjcwOjZDOjY1OjJFOjYzOjZFIgorICAgICAqIDwvcHJlPgorICAgICAqIG9yCisgICAgICogPHByZT4KKyAgICAgKiAgICAgInR5cGU9aG9zdF9uYW1lICgwKSwgdmFsdWU9Nzc6Nzc6Nzc6MkU6NjU6Nzg6NjE6NkQ6NzA6NkM6NjU6MkU6NjM6NkUiCisgICAgICogPC9wcmU+CisgICAgICoKKyAgICAgKiA8UD4KKyAgICAgKiBQbGVhc2UgTk9URSB0aGF0IHRoZSBleGFjdCBkZXRhaWxzIG9mIHRoZSByZXByZXNlbnRhdGlvbiBhcmUgdW5zcGVjaWZpZWQKKyAgICAgKiBhbmQgc3ViamVjdCB0byBjaGFuZ2UsIGFuZCBzdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGUgbWV0aG9kIHdpdGgKKyAgICAgKiB0aGVpciBvd24gZm9ybWF0cy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBzZXJ2ZXIgbmFtZQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIGlmICh0eXBlID09IFN0YW5kYXJkQ29uc3RhbnRzLlNOSV9IT1NUX05BTUUpIHsKKyAgICAgICAgICAgIHJldHVybiAidHlwZT1ob3N0X25hbWUgKDApLCB2YWx1ZT0iICsgdG9IZXhTdHJpbmcoZW5jb2RlZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gInR5cGU9KCIgKyB0eXBlICsgIiksIHZhbHVlPSIgKyB0b0hleFN0cmluZyhlbmNvZGVkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGNvbnZlcnQgYnl0ZSBhcnJheSB0byBoZXggc3RyaW5nCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRvSGV4U3RyaW5nKGJ5dGVbXSBieXRlcykgeworICAgICAgICBpZiAoYnl0ZXMubGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiAiKGVtcHR5KSI7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoYnl0ZXMubGVuZ3RoICogMyAtIDEpOworICAgICAgICBib29sZWFuIGlzSW5pdGlhbCA9IHRydWU7CisgICAgICAgIGZvciAoYnl0ZSBiIDogYnl0ZXMpIHsKKyAgICAgICAgICAgIGlmIChpc0luaXRpYWwpIHsKKyAgICAgICAgICAgICAgICBpc0luaXRpYWwgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCc6Jyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCBrID0gYiAmIDB4RkY7CisgICAgICAgICAgICBzYi5hcHBlbmQoSEVYRVNbayA+Pj4gNF0pOworICAgICAgICAgICAgc2IuYXBwZW5kKEhFWEVTW2sgJiAweEZdKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L25ldC9zc2wvU1NMRW5naW5lLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvbmV0L3NzbC9TU0xFbmdpbmUuamF2YQppbmRleCA0MTE2MjZjLi40MzMzNjFjIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvbmV0L3NzbC9TU0xFbmdpbmUuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvbmV0L3NzbC9TU0xFbmdpbmUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTEsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTEyMTQsMTUgKzEyMTQsMTkgQEAKICAgICAgKgogICAgICAqIDxwPlRoaXMgbWVhbnM6CiAgICAgICogPHVsPgotICAgICAqIDxsaT5pZiA8Y29kZT5wYXJhbXMuZ2V0Q2lwaGVyU3VpdGVzKCk8L2NvZGU+IGlzIG5vbi1udWxsLAotICAgICAqICAgPGNvZGU+c2V0RW5hYmxlZENpcGhlclN1aXRlcygpPC9jb2RlPiBpcyBjYWxsZWQgd2l0aCB0aGF0IHZhbHVlCi0gICAgICogPGxpPmlmIDxjb2RlPnBhcmFtcy5nZXRQcm90b2NvbHMoKTwvY29kZT4gaXMgbm9uLW51bGwsCi0gICAgICogICA8Y29kZT5zZXRFbmFibGVkUHJvdG9jb2xzKCk8L2NvZGU+IGlzIGNhbGxlZCB3aXRoIHRoYXQgdmFsdWUKLSAgICAgKiA8bGk+aWYgPGNvZGU+cGFyYW1zLmdldE5lZWRDbGllbnRBdXRoKCk8L2NvZGU+IG9yCi0gICAgICogICA8Y29kZT5wYXJhbXMuZ2V0V2FudENsaWVudEF1dGgoKTwvY29kZT4gcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+LAotICAgICAqICAgPGNvZGU+c2V0TmVlZENsaWVudEF1dGgodHJ1ZSk8L2NvZGU+IGFuZAotICAgICAqICAgPGNvZGU+c2V0V2FudENsaWVudEF1dGgodHJ1ZSk8L2NvZGU+IGFyZSBjYWxsZWQsIHJlc3BlY3RpdmVseTsKLSAgICAgKiAgIG90aGVyd2lzZSA8Y29kZT5zZXRXYW50Q2xpZW50QXV0aChmYWxzZSk8L2NvZGU+IGlzIGNhbGxlZC4KKyAgICAgKiA8bGk+SWYge0Bjb2RlIHBhcmFtcy5nZXRDaXBoZXJTdWl0ZXMoKX0gaXMgbm9uLW51bGwsCisgICAgICogICB7QGNvZGUgc2V0RW5hYmxlZENpcGhlclN1aXRlcygpfSBpcyBjYWxsZWQgd2l0aCB0aGF0IHZhbHVlLjwvbGk+CisgICAgICogPGxpPklmIHtAY29kZSBwYXJhbXMuZ2V0UHJvdG9jb2xzKCl9IGlzIG5vbi1udWxsLAorICAgICAqICAge0Bjb2RlIHNldEVuYWJsZWRQcm90b2NvbHMoKX0gaXMgY2FsbGVkIHdpdGggdGhhdCB2YWx1ZS48L2xpPgorICAgICAqIDxsaT5JZiB7QGNvZGUgcGFyYW1zLmdldE5lZWRDbGllbnRBdXRoKCl9IG9yCisgICAgICogICB7QGNvZGUgcGFyYW1zLmdldFdhbnRDbGllbnRBdXRoKCl9IHJldHVybiB7QGNvZGUgdHJ1ZX0sCisgICAgICogICB7QGNvZGUgc2V0TmVlZENsaWVudEF1dGgodHJ1ZSl9IGFuZAorICAgICAqICAge0Bjb2RlIHNldFdhbnRDbGllbnRBdXRoKHRydWUpfSBhcmUgY2FsbGVkLCByZXNwZWN0aXZlbHk7CisgICAgICogICBvdGhlcndpc2Uge0Bjb2RlIHNldFdhbnRDbGllbnRBdXRoKGZhbHNlKX0gaXMgY2FsbGVkLjwvbGk+CisgICAgICogPGxpPklmIHtAY29kZSBwYXJhbXMuZ2V0U2VydmVyTmFtZXMoKX0gaXMgbm9uLW51bGwsIHRoZSBlbmdpbmUgd2lsbAorICAgICAqICAgY29uZmlndXJlIGl0cyBzZXJ2ZXIgbmFtZXMgd2l0aCB0aGF0IHZhbHVlLjwvbGk+CisgICAgICogPGxpPklmIHtAY29kZSBwYXJhbXMuZ2V0U05JTWF0Y2hlcnMoKX0gaXMgbm9uLW51bGwsIHRoZSBlbmdpbmUgd2lsbAorICAgICAqICAgY29uZmlndXJlIGl0cyBTTkkgbWF0Y2hlcnMgd2l0aCB0aGF0IHZhbHVlLjwvbGk+CiAgICAgICogPC91bD4KICAgICAgKgogICAgICAqIEBwYXJhbSBwYXJhbXMgdGhlIHBhcmFtZXRlcnMKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9uZXQvc3NsL1NTTFBhcmFtZXRlcnMuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9uZXQvc3NsL1NTTFBhcmFtZXRlcnMuamF2YQppbmRleCAwY2I1YjdkLi5kMjA3ZjZmIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvbmV0L3NzbC9TU0xQYXJhbWV0ZXJzLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L25ldC9zc2wvU1NMUGFyYW1ldGVycy5qYXZhCkBAIC0yNiwxMyArMjYsMjMgQEAKIHBhY2thZ2UgamF2YXgubmV0LnNzbDsKIAogaW1wb3J0IGphdmEuc2VjdXJpdHkuQWxnb3JpdGhtQ29uc3RyYWludHM7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKIAogLyoqCiAgKiBFbmNhcHN1bGF0ZXMgcGFyYW1ldGVycyBmb3IgYW4gU1NML1RMUyBjb25uZWN0aW9uLiBUaGUgcGFyYW1ldGVycwogICogYXJlIHRoZSBsaXN0IG9mIGNpcGhlcnN1aXRlcyB0byBiZSBhY2NlcHRlZCBpbiBhbiBTU0wvVExTIGhhbmRzaGFrZSwKICAqIHRoZSBsaXN0IG9mIHByb3RvY29scyB0byBiZSBhbGxvd2VkLCB0aGUgZW5kcG9pbnQgaWRlbnRpZmljYXRpb24KLSAqIGFsZ29yaXRobSBkdXJpbmcgU1NML1RMUyBoYW5kc2hha2luZywgdGhlIGFsZ29yaXRobSBjb25zdHJhaW50cyBhbmQKLSAqIHdoZXRoZXIgU1NML1RMUyBzZXJ2ZXJzIHNob3VsZCByZXF1ZXN0IG9yIHJlcXVpcmUgY2xpZW50IGF1dGhlbnRpY2F0aW9uLgorICogYWxnb3JpdGhtIGR1cmluZyBTU0wvVExTIGhhbmRzaGFraW5nLCB0aGUgU2VydmVyIE5hbWUgSW5kaWNhdGlvbiAoU05JKSwKKyAqIHRoZSBhbGdvcml0aG0gY29uc3RyYWludHMgYW5kIHdoZXRoZXIgU1NML1RMUyBzZXJ2ZXJzIHNob3VsZCByZXF1ZXN0CisgKiBvciByZXF1aXJlIGNsaWVudCBhdXRoZW50aWNhdGlvbi4KICAqIDxwPgogICogU1NMUGFyYW1ldGVycyBjYW4gYmUgY3JlYXRlZCB2aWEgdGhlIGNvbnN0cnVjdG9ycyBpbiB0aGlzIGNsYXNzLgogICogT2JqZWN0cyBjYW4gYWxzbyBiZSBvYnRhaW5lZCB1c2luZyB0aGUgPGNvZGU+Z2V0U1NMUGFyYW1ldGVycygpPC9jb2RlPgpAQCAtNDcsNyArNTcsNyBAQAogICogU1NMUGFyYW1ldGVycyBjYW4gYmUgYXBwbGllZCB0byBhIGNvbm5lY3Rpb24gdmlhIHRoZSBtZXRob2RzCiAgKiB7QGxpbmsgU1NMU29ja2V0I3NldFNTTFBhcmFtZXRlcnMgU1NMU29ja2V0LnNldFNTTFBhcmFtZXRlcnMoKX0gYW5kCiAgKiB7QGxpbmsgU1NMU2VydmVyU29ja2V0I3NldFNTTFBhcmFtZXRlcnMgU1NMU2VydmVyU29ja2V0LnNldFNTTFBhcmFtZXRlcnMoKX0KLSAqIGFuZCB7QGxpbmsgU1NMRW5naW5lI3NldFNTTFBhcmFtZXRlcnMgU1NMRW5naW5lLmdldFNTTFBhcmFtZXRlcnMoKX0uCisgKiBhbmQge0BsaW5rIFNTTEVuZ2luZSNzZXRTU0xQYXJhbWV0ZXJzIFNTTEVuZ2luZS5zZXRTU0xQYXJhbWV0ZXJzKCl9LgogICoKICAqIEBzZWUgU1NMU29ja2V0CiAgKiBAc2VlIFNTTEVuZ2luZQpAQCAtNjMsMTEgKzczLDE1IEBACiAgICAgcHJpdmF0ZSBib29sZWFuIG5lZWRDbGllbnRBdXRoOwogICAgIHByaXZhdGUgU3RyaW5nIGlkZW50aWZpY2F0aW9uQWxnb3JpdGhtOwogICAgIHByaXZhdGUgQWxnb3JpdGhtQ29uc3RyYWludHMgYWxnb3JpdGhtQ29uc3RyYWludHM7CisgICAgcHJpdmF0ZSBNYXA8SW50ZWdlciwgU05JU2VydmVyTmFtZT4gc25pTmFtZXMgPSBudWxsOworICAgIHByaXZhdGUgTWFwPEludGVnZXIsIFNOSU1hdGNoZXI+IHNuaU1hdGNoZXJzID0gbnVsbDsKIAogICAgIC8qKgogICAgICAqIENvbnN0cnVjdHMgU1NMUGFyYW1ldGVycy4KICAgICAgKiA8cD4KLSAgICAgKiBUaGUgY2lwaGVyU3VpdGVzIGFuZCBwcm90b2NvbHMgdmFsdWVzIGFyZSBzZXQgdG8gPGNvZGU+bnVsbDwvY29kZT4sCisgICAgICogVGhlIHZhbHVlcyBvZiBjaXBoZXJTdWl0ZXMsIHByb3RvY29scywgY3J5cHRvZ3JhcGhpYyBhbGdvcml0aG0KKyAgICAgKiBjb25zdHJhaW50cywgZW5kcG9pbnQgaWRlbnRpZmljYXRpb24gYWxnb3JpdGhtLCBzZXJ2ZXIgbmFtZXMgYW5kCisgICAgICogc2VydmVyIG5hbWUgbWF0Y2hlcnMgYXJlIHNldCB0byA8Y29kZT5udWxsPC9jb2RlPiwKICAgICAgKiB3YW50Q2xpZW50QXV0aCBhbmQgbmVlZENsaWVudEF1dGggYXJlIHNldCB0byA8Y29kZT5mYWxzZTwvY29kZT4uCiAgICAgICovCiAgICAgcHVibGljIFNTTFBhcmFtZXRlcnMoKSB7CkBAIC0yNTQsNCArMjY4LDE3MyBAQAogICAgICAgICB0aGlzLmlkZW50aWZpY2F0aW9uQWxnb3JpdGhtID0gYWxnb3JpdGhtOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFNldHMgdGhlIGRlc2lyZWQge0BsaW5rIFNOSVNlcnZlck5hbWV9cyBvZiB0aGUgU2VydmVyIE5hbWUKKyAgICAgKiBJbmRpY2F0aW9uIChTTkkpIHBhcmFtZXRlci4KKyAgICAgKiA8UD4KKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBvbmx5IHVzZWZ1bCB0byB7QGxpbmsgU1NMU29ja2V0fXMgb3Ige0BsaW5rIFNTTEVuZ2luZX1zCisgICAgICogb3BlcmF0aW5nIGluIGNsaWVudCBtb2RlLgorICAgICAqIDxQPgorICAgICAqIE5vdGUgdGhhdCB0aGUge0Bjb2RlIHNlcnZlck5hbWVzfSBsaXN0IGlzIGNsb25lZAorICAgICAqIHRvIHByb3RlY3QgYWdhaW5zdCBzdWJzZXF1ZW50IG1vZGlmaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgc2VydmVyTmFtZXMKKyAgICAgKiAgICAgICAgIHRoZSBsaXN0IG9mIGRlc2lyZWQge0BsaW5rIFNOSVNlcnZlck5hbWV9cyAob3IgbnVsbCkKKyAgICAgKgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIHtAY29kZSBzZXJ2ZXJOYW1lc30KKyAgICAgKiAgICAgICAgIGNvbnRhaW5zIHtAY29kZSBudWxsfSBlbGVtZW50CisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHtAY29kZSBzZXJ2ZXJOYW1lc30KKyAgICAgKiAgICAgICAgIGNvbnRhaW5zIG1vcmUgdGhhbiBvbmUgbmFtZSBvZiB0aGUgc2FtZSBuYW1lIHR5cGUKKyAgICAgKgorICAgICAqIEBzZWUgU05JU2VydmVyTmFtZQorICAgICAqIEBzZWUgI2dldFNlcnZlck5hbWVzKCkKKyAgICAgKgorICAgICAqIEBzaW5jZSAxLjgKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRTZXJ2ZXJOYW1lcyhMaXN0PFNOSVNlcnZlck5hbWU+IHNlcnZlck5hbWVzKSB7CisgICAgICAgIGlmIChzZXJ2ZXJOYW1lcyAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoIXNlcnZlck5hbWVzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHNuaU5hbWVzID0gbmV3IExpbmtlZEhhc2hNYXA8PihzZXJ2ZXJOYW1lcy5zaXplKCkpOworICAgICAgICAgICAgICAgIGZvciAoU05JU2VydmVyTmFtZSBzZXJ2ZXJOYW1lIDogc2VydmVyTmFtZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNuaU5hbWVzLnB1dChzZXJ2ZXJOYW1lLmdldFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlck5hbWUpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRHVwbGljYXRlZCBzZXJ2ZXIgbmFtZSBvZiB0eXBlICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyTmFtZS5nZXRUeXBlKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzbmlOYW1lcyA9IENvbGxlY3Rpb25zLjxJbnRlZ2VyLCBTTklTZXJ2ZXJOYW1lPmVtcHR5TWFwKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzbmlOYW1lcyA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEge0BsaW5rIExpc3R9IGNvbnRhaW5pbmcgYWxsIHtAbGluayBTTklTZXJ2ZXJOYW1lfXMgb2YgdGhlCisgICAgICogU2VydmVyIE5hbWUgSW5kaWNhdGlvbiAoU05JKSBwYXJhbWV0ZXIsIG9yIG51bGwgaWYgbm9uZSBoYXMgYmVlbiBzZXQuCisgICAgICogPFA+CisgICAgICogVGhpcyBtZXRob2QgaXMgb25seSB1c2VmdWwgdG8ge0BsaW5rIFNTTFNvY2tldH1zIG9yIHtAbGluayBTU0xFbmdpbmV9cworICAgICAqIG9wZXJhdGluZyBpbiBjbGllbnQgbW9kZS4KKyAgICAgKiA8UD4KKyAgICAgKiBGb3IgU1NML1RMUyBjb25uZWN0aW9ucywgdGhlIHVuZGVybHlpbmcgU1NML1RMUyBwcm92aWRlcgorICAgICAqIG1heSBzcGVjaWZ5IGEgZGVmYXVsdCB2YWx1ZSBmb3IgYSBjZXJ0YWluIHNlcnZlciBuYW1lIHR5cGUuICBJbgorICAgICAqIGNsaWVudCBtb2RlLCBpdCBpcyByZWNvbW1lbmRlZCB0aGF0LCBieSBkZWZhdWx0LCBwcm92aWRlcnMgc2hvdWxkCisgICAgICogaW5jbHVkZSB0aGUgc2VydmVyIG5hbWUgaW5kaWNhdGlvbiB3aGVuZXZlciB0aGUgc2VydmVyIGNhbiBiZSBsb2NhdGVkCisgICAgICogYnkgYSBzdXBwb3J0ZWQgc2VydmVyIG5hbWUgdHlwZS4KKyAgICAgKiA8UD4KKyAgICAgKiBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IHByb3ZpZGVycyBpbml0aWFsaXplIGRlZmF1bHQgU2VydmVyIE5hbWUKKyAgICAgKiBJbmRpY2F0aW9ucyB3aGVuIGNyZWF0aW5nIHtAY29kZSBTU0xTb2NrZXR9L3tAY29kZSBTU0xFbmdpbmV9cy4KKyAgICAgKiBJbiB0aGUgZm9sbG93aW5nIGV4YW1wbGVzLCB0aGUgc2VydmVyIG5hbWUgY291bGQgYmUgcmVwcmVzZW50ZWQgYnkgYW4KKyAgICAgKiBpbnN0YW5jZSBvZiB7QGxpbmsgU05JSG9zdE5hbWV9IHdoaWNoIGhhcyBiZWVuIGluaXRpYWxpemVkIHdpdGggdGhlCisgICAgICogaG9zdG5hbWUgInd3dy5leGFtcGxlLmNvbSIgYW5kIHR5cGUKKyAgICAgKiB7QGxpbmsgU3RhbmRhcmRDb25zdGFudHMjU05JX0hPU1RfTkFNRX0uCisgICAgICoKKyAgICAgKiA8cHJlPgorICAgICAqICAgICBTb2NrZXQgc29ja2V0ID0KKyAgICAgKiAgICAgICAgIHNzbFNvY2tldEZhY3RvcnkuY3JlYXRlU29ja2V0KCJ3d3cuZXhhbXBsZS5jb20iLCA0NDMpOworICAgICAqIDwvcHJlPgorICAgICAqIG9yCisgICAgICogPHByZT4KKyAgICAgKiAgICAgU1NMRW5naW5lIGVuZ2luZSA9CisgICAgICogICAgICAgICBzc2xDb250ZXh0LmNyZWF0ZVNTTEVuZ2luZSgid3d3LmV4YW1wbGUuY29tIiwgNDQzKTsKKyAgICAgKiA8L3ByZT4KKyAgICAgKiA8UD4KKyAgICAgKgorICAgICAqIEByZXR1cm4gbnVsbCBvciBhbiBpbW11dGFibGUgbGlzdCBvZiBub24tbnVsbCB7QGxpbmsgU05JU2VydmVyTmFtZX1zCisgICAgICoKKyAgICAgKiBAc2VlIExpc3QKKyAgICAgKiBAc2VlICNzZXRTZXJ2ZXJOYW1lcyhMaXN0PFNOSVNlcnZlck5hbWU+KQorICAgICAqCisgICAgICogQHNpbmNlIDEuOAorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBMaXN0PFNOSVNlcnZlck5hbWU+IGdldFNlcnZlck5hbWVzKCkgeworICAgICAgICBpZiAoc25pTmFtZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKCFzbmlOYW1lcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuPFNOSVNlcnZlck5hbWU+dW5tb2RpZmlhYmxlTGlzdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PD4oc25pTmFtZXMudmFsdWVzKCkpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLjxTTklTZXJ2ZXJOYW1lPmVtcHR5TGlzdCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUge0BsaW5rIFNOSU1hdGNoZXJ9cyBvZiB0aGUgU2VydmVyIE5hbWUgSW5kaWNhdGlvbiAoU05JKQorICAgICAqIHBhcmFtZXRlci4KKyAgICAgKiA8UD4KKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBvbmx5IHVzZWZ1bCB0byB7QGxpbmsgU1NMU29ja2V0fXMgb3Ige0BsaW5rIFNTTEVuZ2luZX1zCisgICAgICogb3BlcmF0aW5nIGluIHNlcnZlciBtb2RlLgorICAgICAqIDxQPgorICAgICAqIE5vdGUgdGhhdCB0aGUge0Bjb2RlIG1hdGNoZXJzfSBjb2xsZWN0aW9uIGlzIGNsb25lZCB0byBwcm90ZWN0CisgICAgICogYWdhaW5zdCBzdWJzZXF1ZW50IG1vZGlmaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgbWF0Y2hlcnMKKyAgICAgKiAgICAgICAgIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBTTklNYXRjaGVyfXMgKG9yIG51bGwpCisgICAgICoKKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSB7QGNvZGUgbWF0Y2hlcnN9CisgICAgICogICAgICAgICBjb250YWlucyB7QGNvZGUgbnVsbH0gZWxlbWVudAorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSB7QGNvZGUgbWF0Y2hlcnN9CisgICAgICogICAgICAgICBjb250YWlucyBtb3JlIHRoYW4gb25lIG5hbWUgb2YgdGhlIHNhbWUgbmFtZSB0eXBlCisgICAgICoKKyAgICAgKiBAc2VlIENvbGxlY3Rpb24KKyAgICAgKiBAc2VlIFNOSU1hdGNoZXIKKyAgICAgKiBAc2VlICNnZXRTTklNYXRjaGVycygpCisgICAgICoKKyAgICAgKiBAc2luY2UgMS44CisgICAgICovCisgICAgcHVibGljIGZpbmFsIHZvaWQgc2V0U05JTWF0Y2hlcnMoQ29sbGVjdGlvbjxTTklNYXRjaGVyPiBtYXRjaGVycykgeworICAgICAgICBpZiAobWF0Y2hlcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKCFtYXRjaGVycy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBzbmlNYXRjaGVycyA9IG5ldyBIYXNoTWFwPD4obWF0Y2hlcnMuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBmb3IgKFNOSU1hdGNoZXIgbWF0Y2hlciA6IG1hdGNoZXJzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzbmlNYXRjaGVycy5wdXQobWF0Y2hlci5nZXRUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVyKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkR1cGxpY2F0ZWQgc2VydmVyIG5hbWUgb2YgdHlwZSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXIuZ2V0VHlwZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc25pTWF0Y2hlcnMgPSBDb2xsZWN0aW9ucy48SW50ZWdlciwgU05JTWF0Y2hlcj5lbXB0eU1hcCgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc25pTWF0Y2hlcnMgPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHtAbGluayBDb2xsZWN0aW9ufSBjb250YWluaW5nIGFsbCB7QGxpbmsgU05JTWF0Y2hlcn1zIG9mIHRoZQorICAgICAqIFNlcnZlciBOYW1lIEluZGljYXRpb24gKFNOSSkgcGFyYW1ldGVyLCBvciBudWxsIGlmIG5vbmUgaGFzIGJlZW4gc2V0LgorICAgICAqIDxQPgorICAgICAqIFRoaXMgbWV0aG9kIGlzIG9ubHkgdXNlZnVsIHRvIHtAbGluayBTU0xTb2NrZXR9cyBvciB7QGxpbmsgU1NMRW5naW5lfXMKKyAgICAgKiBvcGVyYXRpbmcgaW4gc2VydmVyIG1vZGUuCisgICAgICogPFA+CisgICAgICogRm9yIGJldHRlciBpbnRlcm9wZXJhYmlsaXR5LCBwcm92aWRlcnMgZ2VuZXJhbGx5IHdpbGwgbm90IGRlZmluZQorICAgICAqIGRlZmF1bHQgbWF0Y2hlcnMgc28gdGhhdCBieSBkZWZhdWx0IHNlcnZlcnMgd2lsbCBpZ25vcmUgdGhlIFNOSQorICAgICAqIGV4dGVuc2lvbiBhbmQgY29udGludWUgdGhlIGhhbmRzaGFrZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gbnVsbCBvciBhbiBpbW11dGFibGUgY29sbGVjdGlvbiBvZiBub24tbnVsbCB7QGxpbmsgU05JTWF0Y2hlcn1zCisgICAgICoKKyAgICAgKiBAc2VlIFNOSU1hdGNoZXIKKyAgICAgKiBAc2VlICNzZXRTTklNYXRjaGVycyhDb2xsZWN0aW9uPFNOSU1hdGNoZXI+KQorICAgICAqCisgICAgICogQHNpbmNlIDEuOAorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBDb2xsZWN0aW9uPFNOSU1hdGNoZXI+IGdldFNOSU1hdGNoZXJzKCkgeworICAgICAgICBpZiAoc25pTWF0Y2hlcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKCFzbmlNYXRjaGVycy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuPFNOSU1hdGNoZXI+dW5tb2RpZmlhYmxlTGlzdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PD4oc25pTWF0Y2hlcnMudmFsdWVzKCkpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLjxTTklNYXRjaGVyPmVtcHR5TGlzdCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQogfQorCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvbmV0L3NzbC9TU0xTZXJ2ZXJTb2NrZXQuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9uZXQvc3NsL1NTTFNlcnZlclNvY2tldC5qYXZhCmluZGV4IGQ1YmJhYWYuLjQ4ZGM3ZmEgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9uZXQvc3NsL1NTTFNlcnZlclNvY2tldC5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9uZXQvc3NsL1NTTFNlcnZlclNvY2tldC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMTk5NywgMjAxMCwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5NywgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtNDg0LDE1ICs0ODQsMTkgQEAKICAgICAgKgogICAgICAqIDxwPlRoaXMgbWVhbnM6CiAgICAgICogPHVsPgotICAgICAqIDxsaT5pZiA8Y29kZT5wYXJhbXMuZ2V0Q2lwaGVyU3VpdGVzKCk8L2NvZGU+IGlzIG5vbi1udWxsLAotICAgICAqICAgPGNvZGU+c2V0RW5hYmxlZENpcGhlclN1aXRlcygpPC9jb2RlPiBpcyBjYWxsZWQgd2l0aCB0aGF0IHZhbHVlCi0gICAgICogPGxpPmlmIDxjb2RlPnBhcmFtcy5nZXRQcm90b2NvbHMoKTwvY29kZT4gaXMgbm9uLW51bGwsCi0gICAgICogICA8Y29kZT5zZXRFbmFibGVkUHJvdG9jb2xzKCk8L2NvZGU+IGlzIGNhbGxlZCB3aXRoIHRoYXQgdmFsdWUKLSAgICAgKiA8bGk+aWYgPGNvZGU+cGFyYW1zLmdldE5lZWRDbGllbnRBdXRoKCk8L2NvZGU+IG9yCi0gICAgICogICA8Y29kZT5wYXJhbXMuZ2V0V2FudENsaWVudEF1dGgoKTwvY29kZT4gcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+LAotICAgICAqICAgPGNvZGU+c2V0TmVlZENsaWVudEF1dGgodHJ1ZSk8L2NvZGU+IGFuZAotICAgICAqICAgPGNvZGU+c2V0V2FudENsaWVudEF1dGgodHJ1ZSk8L2NvZGU+IGFyZSBjYWxsZWQsIHJlc3BlY3RpdmVseTsKLSAgICAgKiAgIG90aGVyd2lzZSA8Y29kZT5zZXRXYW50Q2xpZW50QXV0aChmYWxzZSk8L2NvZGU+IGlzIGNhbGxlZC4KKyAgICAgKiA8bGk+SWYge0Bjb2RlIHBhcmFtcy5nZXRDaXBoZXJTdWl0ZXMoKX0gaXMgbm9uLW51bGwsCisgICAgICogICB7QGNvZGUgc2V0RW5hYmxlZENpcGhlclN1aXRlcygpfSBpcyBjYWxsZWQgd2l0aCB0aGF0IHZhbHVlLjwvbGk+CisgICAgICogPGxpPklmIHtAY29kZSBwYXJhbXMuZ2V0UHJvdG9jb2xzKCl9IGlzIG5vbi1udWxsLAorICAgICAqICAge0Bjb2RlIHNldEVuYWJsZWRQcm90b2NvbHMoKX0gaXMgY2FsbGVkIHdpdGggdGhhdCB2YWx1ZS48L2xpPgorICAgICAqIDxsaT5JZiB7QGNvZGUgcGFyYW1zLmdldE5lZWRDbGllbnRBdXRoKCl9IG9yCisgICAgICogICB7QGNvZGUgcGFyYW1zLmdldFdhbnRDbGllbnRBdXRoKCl9IHJldHVybiB7QGNvZGUgdHJ1ZX0sCisgICAgICogICB7QGNvZGUgc2V0TmVlZENsaWVudEF1dGgodHJ1ZSl9IGFuZAorICAgICAqICAge0Bjb2RlIHNldFdhbnRDbGllbnRBdXRoKHRydWUpfSBhcmUgY2FsbGVkLCByZXNwZWN0aXZlbHk7CisgICAgICogICBvdGhlcndpc2Uge0Bjb2RlIHNldFdhbnRDbGllbnRBdXRoKGZhbHNlKX0gaXMgY2FsbGVkLjwvbGk+CisgICAgICogPGxpPklmIHtAY29kZSBwYXJhbXMuZ2V0U2VydmVyTmFtZXMoKX0gaXMgbm9uLW51bGwsIHRoZSBzb2NrZXQgd2lsbAorICAgICAqICAgY29uZmlndXJlIGl0cyBzZXJ2ZXIgbmFtZXMgd2l0aCB0aGF0IHZhbHVlLjwvbGk+CisgICAgICogPGxpPklmIHtAY29kZSBwYXJhbXMuZ2V0U05JTWF0Y2hlcnMoKX0gaXMgbm9uLW51bGwsIHRoZSBzb2NrZXQgd2lsbAorICAgICAqICAgY29uZmlndXJlIGl0cyBTTkkgbWF0Y2hlcnMgd2l0aCB0aGF0IHZhbHVlLjwvbGk+CiAgICAgICogPC91bD4KICAgICAgKgogICAgICAqIEBwYXJhbSBwYXJhbXMgdGhlIHBhcmFtZXRlcnMKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9uZXQvc3NsL1NTTFNvY2tldC5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L25ldC9zc2wvU1NMU29ja2V0LmphdmEKaW5kZXggYjYxZjk0YS4uYWIwOTAxMyAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L25ldC9zc2wvU1NMU29ja2V0LmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L25ldC9zc2wvU1NMU29ja2V0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAxOTk3LCAyMDEwLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC02MjYsMTUgKzYyNiwxOSBAQAogICAgICAqCiAgICAgICogPHA+VGhpcyBtZWFuczoKICAgICAgKiA8dWw+Ci0gICAgICogPGxpPmlmIDxjb2RlPnBhcmFtcy5nZXRDaXBoZXJTdWl0ZXMoKTwvY29kZT4gaXMgbm9uLW51bGwsCi0gICAgICogICA8Y29kZT5zZXRFbmFibGVkQ2lwaGVyU3VpdGVzKCk8L2NvZGU+IGlzIGNhbGxlZCB3aXRoIHRoYXQgdmFsdWUKLSAgICAgKiA8bGk+aWYgPGNvZGU+cGFyYW1zLmdldFByb3RvY29scygpPC9jb2RlPiBpcyBub24tbnVsbCwKLSAgICAgKiAgIDxjb2RlPnNldEVuYWJsZWRQcm90b2NvbHMoKTwvY29kZT4gaXMgY2FsbGVkIHdpdGggdGhhdCB2YWx1ZQotICAgICAqIDxsaT5pZiA8Y29kZT5wYXJhbXMuZ2V0TmVlZENsaWVudEF1dGgoKTwvY29kZT4gb3IKLSAgICAgKiAgIDxjb2RlPnBhcmFtcy5nZXRXYW50Q2xpZW50QXV0aCgpPC9jb2RlPiByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4sCi0gICAgICogICA8Y29kZT5zZXROZWVkQ2xpZW50QXV0aCh0cnVlKTwvY29kZT4gYW5kCi0gICAgICogICA8Y29kZT5zZXRXYW50Q2xpZW50QXV0aCh0cnVlKTwvY29kZT4gYXJlIGNhbGxlZCwgcmVzcGVjdGl2ZWx5OwotICAgICAqICAgb3RoZXJ3aXNlIDxjb2RlPnNldFdhbnRDbGllbnRBdXRoKGZhbHNlKTwvY29kZT4gaXMgY2FsbGVkLgorICAgICAqIDxsaT5JZiB7QGNvZGUgcGFyYW1zLmdldENpcGhlclN1aXRlcygpfSBpcyBub24tbnVsbCwKKyAgICAgKiAgIHtAY29kZSBzZXRFbmFibGVkQ2lwaGVyU3VpdGVzKCl9IGlzIGNhbGxlZCB3aXRoIHRoYXQgdmFsdWUuPC9saT4KKyAgICAgKiA8bGk+SWYge0Bjb2RlIHBhcmFtcy5nZXRQcm90b2NvbHMoKX0gaXMgbm9uLW51bGwsCisgICAgICogICB7QGNvZGUgc2V0RW5hYmxlZFByb3RvY29scygpfSBpcyBjYWxsZWQgd2l0aCB0aGF0IHZhbHVlLjwvbGk+CisgICAgICogPGxpPklmIHtAY29kZSBwYXJhbXMuZ2V0TmVlZENsaWVudEF1dGgoKX0gb3IKKyAgICAgKiAgIHtAY29kZSBwYXJhbXMuZ2V0V2FudENsaWVudEF1dGgoKX0gcmV0dXJuIHtAY29kZSB0cnVlfSwKKyAgICAgKiAgIHtAY29kZSBzZXROZWVkQ2xpZW50QXV0aCh0cnVlKX0gYW5kCisgICAgICogICB7QGNvZGUgc2V0V2FudENsaWVudEF1dGgodHJ1ZSl9IGFyZSBjYWxsZWQsIHJlc3BlY3RpdmVseTsKKyAgICAgKiAgIG90aGVyd2lzZSB7QGNvZGUgc2V0V2FudENsaWVudEF1dGgoZmFsc2UpfSBpcyBjYWxsZWQuPC9saT4KKyAgICAgKiA8bGk+SWYge0Bjb2RlIHBhcmFtcy5nZXRTZXJ2ZXJOYW1lcygpfSBpcyBub24tbnVsbCwgdGhlIHNvY2tldCB3aWxsCisgICAgICogICBjb25maWd1cmUgaXRzIHNlcnZlciBuYW1lcyB3aXRoIHRoYXQgdmFsdWUuPC9saT4KKyAgICAgKiA8bGk+SWYge0Bjb2RlIHBhcmFtcy5nZXRTTklNYXRjaGVycygpfSBpcyBub24tbnVsbCwgdGhlIHNvY2tldCB3aWxsCisgICAgICogICBjb25maWd1cmUgaXRzIFNOSSBtYXRjaGVycyB3aXRoIHRoYXQgdmFsdWUuPC9saT4KICAgICAgKiA8L3VsPgogICAgICAqCiAgICAgICogQHBhcmFtIHBhcmFtcyB0aGUgcGFyYW1ldGVycwpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L25ldC9zc2wvU1NMU29ja2V0RmFjdG9yeS5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L25ldC9zc2wvU1NMU29ja2V0RmFjdG9yeS5qYXZhCmluZGV4IGMzZDMzYzMuLjczZjQ4ZDEgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9uZXQvc3NsL1NTTFNvY2tldEZhY3RvcnkuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvbmV0L3NzbC9TU0xTb2NrZXRGYWN0b3J5LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAxOTk3LCAyMDExLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yOSw2ICsyOSw3IEBACiBpbXBvcnQgamF2YS5uZXQuKjsKIGltcG9ydCBqYXZheC5uZXQuU29ja2V0RmFjdG9yeTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5zZWN1cml0eS4qOwogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiAKQEAgLTE4MCw4ICsxODEsNTUgQEAKICAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBwYXJhbWV0ZXIgcyBpcyBudWxsCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IFNvY2tldCBjcmVhdGVTb2NrZXQoU29ja2V0IHMsIFN0cmluZyBob3N0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwb3J0LCBib29sZWFuIGF1dG9DbG9zZSkKLSAgICB0aHJvd3MgSU9FeGNlcHRpb247CisgICAgICAgICAgICBpbnQgcG9ydCwgYm9vbGVhbiBhdXRvQ2xvc2UpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBzZXJ2ZXIgbW9kZSB7QGxpbmsgU29ja2V0fSBsYXllcmVkIG92ZXIgYW4KKyAgICAgKiBleGlzdGluZyBjb25uZWN0ZWQgc29ja2V0LCBhbmQgaXMgYWJsZSB0byByZWFkIGRhdGEgd2hpY2ggaGFzCisgICAgICogYWxyZWFkeSBiZWVuIGNvbnN1bWVkL3JlbW92ZWQgZnJvbSB0aGUge0BsaW5rIFNvY2tldH0ncworICAgICAqIHVuZGVybHlpbmcge0BsaW5rIElucHV0U3RyZWFtfS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCBieSBhIHNlcnZlciBhcHBsaWNhdGlvbiB0aGF0IG5lZWRzIHRvCisgICAgICogb2JzZXJ2ZSB0aGUgaW5ib3VuZCBkYXRhIGJ1dCBzdGlsbCBjcmVhdGUgdmFsaWQgU1NML1RMUworICAgICAqIGNvbm5lY3Rpb25zOiBmb3IgZXhhbXBsZSwgaW5zcGVjdGlvbiBvZiBTZXJ2ZXIgTmFtZSBJbmRpY2F0aW9uCisgICAgICogKFNOSSkgZXh0ZW5zaW9ucyAoU2VlIHNlY3Rpb24gMyBvZiA8QQorICAgICAqIEhSRUY9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzYwNjYudHh0Ij5UTFMgRXh0ZW5zaW9ucworICAgICAqIChSRkM2MDY2KTwvQT4pLiAgRGF0YSB0aGF0IGhhcyBiZWVuIGFscmVhZHkgcmVtb3ZlZCBmcm9tIHRoZQorICAgICAqIHVuZGVybHlpbmcge0BsaW5rIElucHV0U3RyZWFtfSBzaG91bGQgYmUgbG9hZGVkIGludG8gdGhlCisgICAgICoge0Bjb2RlIGNvbnN1bWVkfSBzdHJlYW0gYmVmb3JlIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwgcGVyaGFwcworICAgICAqIHVzaW5nIGEge0BsaW5rIEJ5dGVBcnJheUlucHV0U3RyZWFtfS4gIFdoZW4gdGhpcyB7QGxpbmsgU29ja2V0fQorICAgICAqIGJlZ2lucyBoYW5kc2hha2luZywgaXQgd2lsbCByZWFkIGFsbCBvZiB0aGUgZGF0YSBpbgorICAgICAqIHtAY29kZSBjb25zdW1lZH0gdW50aWwgaXQgcmVhY2hlcyB7QGNvZGUgRU9GfSwgdGhlbiBhbGwgZnVydGhlcgorICAgICAqIGRhdGEgaXMgcmVhZCBmcm9tIHRoZSB1bmRlcmx5aW5nIHtAbGluayBJbnB1dFN0cmVhbX0gYXMKKyAgICAgKiB1c3VhbC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgcmV0dXJuZWQgc29ja2V0IGlzIGNvbmZpZ3VyZWQgdXNpbmcgdGhlIHNvY2tldCBvcHRpb25zCisgICAgICogZXN0YWJsaXNoZWQgZm9yIHRoaXMgZmFjdG9yeSwgYW5kIGlzIHNldCB0byB1c2Ugc2VydmVyIG1vZGUgd2hlbgorICAgICAqIGhhbmRzaGFraW5nIChzZWUge0BsaW5rIFNTTFNvY2tldCNzZXRVc2VDbGllbnRNb2RlKGJvb2xlYW4pfSkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gIHMKKyAgICAgKiAgICAgICAgIHRoZSBleGlzdGluZyBzb2NrZXQKKyAgICAgKiBAcGFyYW0gIGNvbnN1bWVkCisgICAgICogICAgICAgICB0aGUgY29uc3VtZWQgaW5ib3VuZCBuZXR3b3JrIGRhdGEgdGhhdCBoYXMgYWxyZWFkeSBiZWVuCisgICAgICogICAgICAgICByZW1vdmVkIGZyb20gdGhlIGV4aXN0aW5nIHtAbGluayBTb2NrZXR9CisgICAgICogICAgICAgICB7QGxpbmsgSW5wdXRTdHJlYW19LiAgVGhpcyBwYXJhbWV0ZXIgbWF5IGJlCisgICAgICogICAgICAgICB7QGNvZGUgbnVsbH0gaWYgbm8gZGF0YSBoYXMgYmVlbiByZW1vdmVkLgorICAgICAqIEBwYXJhbSAgYXV0b0Nsb3NlIGNsb3NlIHRoZSB1bmRlcmx5aW5nIHNvY2tldCB3aGVuIHRoaXMgc29ja2V0IGlzIGNsb3NlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHtAbGluayBTb2NrZXR9IGNvbXBsaWFudCB3aXRoIHRoZSBzb2NrZXQgb3B0aW9ucworICAgICAqICAgICAgICAgZXN0YWJsaXNoZWQgZm9yIHRoaXMgZmFjdG9yeQorICAgICAqCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBJL08gZXJyb3Igb2NjdXJzIHdoZW4gY3JlYXRpbmcgdGhlIHNvY2tldAorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhlIHVuZGVybHlpbmcgcHJvdmlkZXIKKyAgICAgKiAgICAgICAgIGRvZXMgbm90IGltcGxlbWVudCB0aGUgb3BlcmF0aW9uCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB7QGNvZGUgc30gaXMge0Bjb2RlIG51bGx9CisgICAgICoKKyAgICAgKiBAc2luY2UgMS44CisgICAgICovCisgICAgcHVibGljIFNvY2tldCBjcmVhdGVTb2NrZXQoU29ja2V0IHMsIElucHV0U3RyZWFtIGNvbnN1bWVkLAorICAgICAgICAgICAgYm9vbGVhbiBhdXRvQ2xvc2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KIH0KIAogCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvbmV0L3NzbC9TdGFuZGFyZENvbnN0YW50cy5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L25ldC9zc2wvU3RhbmRhcmRDb25zdGFudHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTFkZjk3Ci0tLSAvZGV2L251bGwKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L25ldC9zc2wvU3RhbmRhcmRDb25zdGFudHMuamF2YQpAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBPcmFjbGUgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKKyAqIHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIGphdmF4Lm5ldC5zc2w7CisKKy8qKgorICogU3RhbmRhcmQgY29uc3RhbnRzIGRlZmluaXRpb25zCisgKgorICogQHNpbmNlIDEuOAorICovCitwdWJsaWMgZmluYWwgY2xhc3MgU3RhbmRhcmRDb25zdGFudHMgeworCisgICAgLy8gU3VwcHJlc3MgZGVmYXVsdCBjb25zdHJ1Y3RvciBmb3Igbm9uaW5zdGFudGlhYmlsaXR5CisgICAgcHJpdmF0ZSBTdGFuZGFyZENvbnN0YW50cygpIHsKKyAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKAorICAgICAgICAgICAgIk5vIGphdmF4Lm5ldC5zc2wuU3RhbmRhcmRDb25zdGFudHMgaW5zdGFuY2VzIGZvciB5b3UhIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlICJob3N0X25hbWUiIHR5cGUgcmVwcmVzZW50aW5nIG9mIGEgRE5TIGhvc3RuYW1lCisgICAgICogKHNlZSB7QGxpbmsgU05JSG9zdE5hbWV9KSBpbiBhIFNlcnZlciBOYW1lIEluZGljYXRpb24gKFNOSSkgZXh0ZW5zaW9uLgorICAgICAqIDxQPgorICAgICAqIFRoZSBTTkkgZXh0ZW5zaW9uIGlzIGEgZmVhdHVyZSB0aGF0IGV4dGVuZHMgdGhlIFNTTC9UTFMgcHJvdG9jb2xzIHRvCisgICAgICogaW5kaWNhdGUgd2hhdCBzZXJ2ZXIgbmFtZSB0aGUgY2xpZW50IGlzIGF0dGVtcHRpbmcgdG8gY29ubmVjdCB0byBkdXJpbmcKKyAgICAgKiBoYW5kc2hha2luZy4gIFNlZSBzZWN0aW9uIDMsICJTZXJ2ZXIgTmFtZSBJbmRpY2F0aW9uIiwgb2YgPEEKKyAgICAgKiBIUkVGPSJodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmM2MDY2LnR4dCI+VExTIEV4dGVuc2lvbnMgKFJGQyA2MDY2KTwvQT4uCisgICAgICogPFA+CisgICAgICogVGhlIHZhbHVlIG9mIHRoaXMgY29uc3RhbnQgaXMge0B2YWx1ZX0uCisgICAgICoKKyAgICAgKiBAc2VlIFNOSVNlcnZlck5hbWUKKyAgICAgKiBAc2VlIFNOSUhvc3ROYW1lCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU05JX0hPU1RfTkFNRSA9IDB4MDA7Cit9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3FsL3Jvd3NldC9CYXNlUm93U2V0LmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3FsL3Jvd3NldC9CYXNlUm93U2V0LmphdmEKaW5kZXggYmJiMTg1Mi4uYWRmMmU1MSAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3NxbC9yb3dzZXQvQmFzZVJvd1NldC5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zcWwvcm93c2V0L0Jhc2VSb3dTZXQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTEsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTE4NTAsNyArMTg1MCw3IEBACiAgICAgICAgIGlmKHBhcmFtcyA9PSBudWxsKXsKICAgICAgICAgICAgICB0aHJvdyBuZXcgU1FMRXhjZXB0aW9uKCJTZXQgaW5pdFBhcmFtcygpIGJlZm9yZSBzZXRGbG9hdCIpOwogICAgICAgICB9Ci0gICAgICAgIHBhcmFtcy5wdXQoSW50ZWdlci52YWx1ZU9mKHBhcmFtZXRlckluZGV4IC0gMSksIG5ldyBGbG9hdCh4KSk7CisgICAgICAgIHBhcmFtcy5wdXQoSW50ZWdlci52YWx1ZU9mKHBhcmFtZXRlckluZGV4IC0gMSksIEZsb2F0LnZhbHVlT2YoeCkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTg4Miw3ICsxODgyLDcgQEAKICAgICAgICAgaWYocGFyYW1zID09IG51bGwpewogICAgICAgICAgICAgIHRocm93IG5ldyBTUUxFeGNlcHRpb24oIlNldCBpbml0UGFyYW1zKCkgYmVmb3JlIHNldERvdWJsZSIpOwogICAgICAgICB9Ci0gICAgICAgIHBhcmFtcy5wdXQoSW50ZWdlci52YWx1ZU9mKHBhcmFtZXRlckluZGV4IC0gMSksIG5ldyBEb3VibGUoeCkpOworICAgICAgICBwYXJhbXMucHV0KEludGVnZXIudmFsdWVPZihwYXJhbWV0ZXJJbmRleCAtIDEpLCBEb3VibGUudmFsdWVPZih4KSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yMzg5LDcgKzIzODksNyBAQAogICAgICAqIEBkZXByZWNhdGVkIGdldENoYXJhY3RlclN0cmVhbSBzaG91bGQgYmUgdXNlZCBpbiBpdHMgcGxhY2UKICAgICAgKiBAc2VlICNnZXRQYXJhbXMKICAgICAgKi8KLQorICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIHZvaWQgc2V0VW5pY29kZVN0cmVhbShpbnQgcGFyYW1ldGVySW5kZXgsIGphdmEuaW8uSW5wdXRTdHJlYW0geCwgaW50IGxlbmd0aCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CiAgICAgICAgIE9iamVjdCB1bmljb2RlU3RyZWFtW107CiAgICAgICAgIGNoZWNrUGFyYW1JbmRleChwYXJhbWV0ZXJJbmRleCk7CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3FsL3Jvd3NldC9zZXJpYWwvU1FMT3V0cHV0SW1wbC5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3NxbC9yb3dzZXQvc2VyaWFsL1NRTE91dHB1dEltcGwuamF2YQppbmRleCBiNDZhODgwLi5mYmU0YTc0IDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3FsL3Jvd3NldC9zZXJpYWwvU1FMT3V0cHV0SW1wbC5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zcWwvcm93c2V0L3NlcmlhbC9TUUxPdXRwdXRJbXBsLmphdmEKQEAgLTIxNSw3ICsyMTUsNyBAQAogICAgICAqLwogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogICAgIHB1YmxpYyB2b2lkIHdyaXRlRmxvYXQoZmxvYXQgeCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7Ci0gICAgICAgIGF0dHJpYnMuYWRkKG5ldyBGbG9hdCh4KSk7CisgICAgICAgIGF0dHJpYnMuYWRkKEZsb2F0LnZhbHVlT2YoeCkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjMwLDcgKzIzMCw3IEBACiAgICAgICovCiAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAgICAgcHVibGljIHZvaWQgd3JpdGVEb3VibGUoZG91YmxlIHgpIHRocm93cyBTUUxFeGNlcHRpb257Ci0gICAgICAgIGF0dHJpYnMuYWRkKG5ldyBEb3VibGUoeCkpOworICAgICAgICBhdHRyaWJzLmFkZChEb3VibGUudmFsdWVPZih4KSk7CiAgICAgfQogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3FsL3Jvd3NldC9zcGkvU3luY0ZhY3RvcnkuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zcWwvcm93c2V0L3NwaS9TeW5jRmFjdG9yeS5qYXZhCmluZGV4IDExYTU5YzQuLjEwZTYxNTggMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zcWwvcm93c2V0L3NwaS9TeW5jRmFjdG9yeS5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zcWwvcm93c2V0L3NwaS9TeW5jRmFjdG9yeS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjI5LDExICsyMjksNyBAQAogICAgICAqIFRoZSBzdGFuZGFyZCByZXNvdXJjZSBmaWxlIG5hbWUuCiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFJPV1NFVF9QUk9QRVJUSUVTID0gInJvd3NldC5wcm9wZXJ0aWVzIjsKLSAgICAvKioKLSAgICAgKiBUaGUgUkkgT3B0aW1pc3RpYyBQcm92aWRlci4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVmYXVsdF9wcm92aWRlciA9Ci0gICAgICAgICAgICAiY29tLnN1bi5yb3dzZXQucHJvdmlkZXJzLlJJT3B0aW1pc3RpY1Byb3ZpZGVyIjsKKwogICAgIC8qKgogICAgICAqICBQZXJtaXNzaW9uIHJlcXVpcmVkIHRvIGludm9rZSBzZXRKTkRJQ29udGV4dCBhbmQgc2V0TG9nZ2VyCiAgICAgICovCkBAIC0yNDgsMjQgKzI0NCwxMyBAQAogICAgICAqIFRoZSA8Y29kZT5Mb2dnZXI8L2NvZGU+IG9iamVjdCB0byBiZSB1c2VkIGJ5IHRoZSA8Y29kZT5TeW5jRmFjdG9yeTwvY29kZT4uCiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9sYXRpbGUgTG9nZ2VyIHJzTG9nZ2VyOwotICAgIC8qKgotICAgICAqCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgTGV2ZWwgcnNMZXZlbDsKKwogICAgIC8qKgogICAgICAqIFRoZSByZWdpc3RyeSBvZiBhdmFpbGFibGUgPGNvZGU+U3luY1Byb3ZpZGVyPC9jb2RlPiBpbXBsZW1lbnRhdGlvbnMuCiAgICAgICogU2VlIHNlY3Rpb24gMi4wIG9mIHRoZSBjbGFzcyBjb21tZW50IGZvciA8Y29kZT5TeW5jRmFjdG9yeTwvY29kZT4gZm9yIGFuCiAgICAgICogZXhwbGFuYXRpb24gb2YgaG93IGEgcHJvdmlkZXIgY2FuIGJlIGFkZGVkIHRvIHRoaXMgcmVnaXN0cnkuCiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgSGFzaHRhYmxlPFN0cmluZywgU3luY1Byb3ZpZGVyPiBpbXBsZW1lbnRhdGlvbnM7Ci0gICAgLyoqCi0gICAgICogSW50ZXJuYWwgc3luYyBvYmplY3QgdXNlZCB0byBtYWludGFpbiB0aGUgU1BJIGFzIGEgc2luZ2xldG9uCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IGxvZ1N5bmMgPSBuZXcgT2JqZWN0KCk7Ci0gICAgLyoqCi0gICAgICogSW50ZXJuYWwgUHJpbnRXcml0ZXIgZmllbGQgZm9yIGxvZ2dpbmcgZmFjaWxpdHkKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBqYXZhLmlvLlByaW50V3JpdGVyIGxvZ1dyaXRlciA9IG51bGw7CiAKICAgICAvKioKICAgICAgKiBBZGRzIHRoZSB0aGUgZ2l2ZW4gc3luY2hyb25pemF0aW9uIHByb3ZpZGVyIHRvIHRoZSBmYWN0b3J5IHJlZ2lzdGVyLiBHdWlkZWxpbmVzCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvdGV4dC9EZWZhdWx0Rm9ybWF0dGVyLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvc3dpbmcvdGV4dC9EZWZhdWx0Rm9ybWF0dGVyLmphdmEKaW5kZXggNWUwMDNiNS4uYjY3OTY2YSAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3N3aW5nL3RleHQvRGVmYXVsdEZvcm1hdHRlci5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9zd2luZy90ZXh0L0RlZmF1bHRGb3JtYXR0ZXIuamF2YQpAQCAtMjQsNiArMjQsOCBAQAogICovCiBwYWNrYWdlIGphdmF4LnN3aW5nLnRleHQ7CiAKK2ltcG9ydCBzdW4ucmVmbGVjdC5taXNjLkNvbnN0cnVjdG9yVXRpbDsKKwogaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7CiBpbXBvcnQgamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uOwpAQCAtMjQ1LDcgKzI0Nyw3IEBACiAgICAgICAgICAgICBDb25zdHJ1Y3RvciBjb25zOwogCiAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGNvbnMgPSB2Yy5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXSB7IFN0cmluZy5jbGFzcyB9KTsKKyAgICAgICAgICAgICAgICBjb25zID0gQ29uc3RydWN0b3JVdGlsLmdldENvbnN0cnVjdG9yKHZjLCBuZXcgQ2xhc3NbXXtTdHJpbmcuY2xhc3N9KTsKIAogICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIG5zbWUpIHsKICAgICAgICAgICAgICAgICBjb25zID0gbnVsbDsKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vQW5ub3RhdGlvblZpc2l0b3IuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vQW5ub3RhdGlvblZpc2l0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjkwYWZlCi0tLSAvZGV2L251bGwKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS9Bbm5vdGF0aW9uVmlzaXRvci5qYXZhCkBAIC0wLDAgKzEsMTg2IEBACisvKgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBPcmFjbGUgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKKyAqIHF1ZXN0aW9ucy4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGlzIGF2YWlsYWJsZSB1bmRlciBhbmQgZ292ZXJuZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiBIb3dldmVyLCB0aGUgZm9sbG93aW5nIG5vdGljZSBhY2NvbXBhbmllZCB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGlzCisgKiBmaWxlOgorICoKKyAqIEFTTTogYSB2ZXJ5IHNtYWxsIGFuZCBmYXN0IEphdmEgYnl0ZWNvZGUgbWFuaXB1bGF0aW9uIGZyYW1ld29yaworICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMTEgSU5SSUEsIEZyYW5jZSBUZWxlY29tCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2UgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtOworCisvKioKKyAqIEEgdmlzaXRvciB0byB2aXNpdCBhIEphdmEgYW5ub3RhdGlvbi4gVGhlIG1ldGhvZHMgb2YgdGhpcyBjbGFzcyBtdXN0IGJlCisgKiBjYWxsZWQgaW4gdGhlIGZvbGxvd2luZyBvcmRlcjogKCA8dHQ+dmlzaXQ8L3R0PiB8IDx0dD52aXNpdEVudW08L3R0PiB8CisgKiA8dHQ+dmlzaXRBbm5vdGF0aW9uPC90dD4gfCA8dHQ+dmlzaXRBcnJheTwvdHQ+ICkqIDx0dD52aXNpdEVuZDwvdHQ+LgorICoKKyAqIEBhdXRob3IgRXJpYyBCcnVuZXRvbgorICogQGF1dGhvciBFdWdlbmUgS3VsZXNob3YKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFubm90YXRpb25WaXNpdG9yIHsKKworICAgIC8qKgorICAgICAqIFRoZSBBU00gQVBJIHZlcnNpb24gaW1wbGVtZW50ZWQgYnkgdGhpcyB2aXNpdG9yLiBUaGUgdmFsdWUgb2YgdGhpcyBmaWVsZAorICAgICAqIG11c3QgYmUgb25lIG9mIHtAbGluayBPcGNvZGVzI0FTTTR9LgorICAgICAqLworICAgIHByb3RlY3RlZCBmaW5hbCBpbnQgYXBpOworCisgICAgLyoqCisgICAgICogVGhlIGFubm90YXRpb24gdmlzaXRvciB0byB3aGljaCB0aGlzIHZpc2l0b3IgbXVzdCBkZWxlZ2F0ZSBtZXRob2QgY2FsbHMuCisgICAgICogTWF5IGJlIG51bGwuCisgICAgICovCisgICAgcHJvdGVjdGVkIEFubm90YXRpb25WaXNpdG9yIGF2OworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGxpbmsgQW5ub3RhdGlvblZpc2l0b3J9LgorICAgICAqCisgICAgICogQHBhcmFtIGFwaSB0aGUgQVNNIEFQSSB2ZXJzaW9uIGltcGxlbWVudGVkIGJ5IHRoaXMgdmlzaXRvci4gTXVzdCBiZSBvbmUKKyAgICAgKiAgICAgICAgb2Yge0BsaW5rIE9wY29kZXMjQVNNNH0uCisgICAgICovCisgICAgcHVibGljIEFubm90YXRpb25WaXNpdG9yKGZpbmFsIGludCBhcGkpIHsKKyAgICAgICAgdGhpcyhhcGksIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0BsaW5rIEFubm90YXRpb25WaXNpdG9yfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcGkgdGhlIEFTTSBBUEkgdmVyc2lvbiBpbXBsZW1lbnRlZCBieSB0aGlzIHZpc2l0b3IuIE11c3QgYmUgb25lCisgICAgICogICAgICAgIG9mIHtAbGluayBPcGNvZGVzI0FTTTR9LgorICAgICAqIEBwYXJhbSBhdiB0aGUgYW5ub3RhdGlvbiB2aXNpdG9yIHRvIHdoaWNoIHRoaXMgdmlzaXRvciBtdXN0IGRlbGVnYXRlCisgICAgICogICAgICAgIG1ldGhvZCBjYWxscy4gTWF5IGJlIG51bGwuCisgICAgICovCisgICAgcHVibGljIEFubm90YXRpb25WaXNpdG9yKGZpbmFsIGludCBhcGksIGZpbmFsIEFubm90YXRpb25WaXNpdG9yIGF2KSB7CisgICAgICAgIC8qaWYgKGFwaSAhPSBPcGNvZGVzLkFTTTQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgfSovCisgICAgICAgIHRoaXMuYXBpID0gYXBpOworICAgICAgICB0aGlzLmF2ID0gYXY7CisgICAgfQorCisgICAgLyoqCisgICAgICogVmlzaXRzIGEgcHJpbWl0aXZlIHZhbHVlIG9mIHRoZSBhbm5vdGF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgdGhlIHZhbHVlIG5hbWUuCisgICAgICogQHBhcmFtIHZhbHVlIHRoZSBhY3R1YWwgdmFsdWUsIHdob3NlIHR5cGUgbXVzdCBiZSB7QGxpbmsgQnl0ZX0sCisgICAgICogICAgICAgIHtAbGluayBCb29sZWFufSwge0BsaW5rIENoYXJhY3Rlcn0sIHtAbGluayBTaG9ydH0sIHtAbGluayBJbnRlZ2VyfQorICAgICAqICAgICAgICAsIHtAbGluayBMb25nfSwge0BsaW5rIEZsb2F0fSwge0BsaW5rIERvdWJsZX0sIHtAbGluayBTdHJpbmd9IG9yCisgICAgICogICAgICAgIHtAbGluayBUeXBlfSBvciBPQkpFQ1Qgb3IgQVJSQVkgc29ydC4gVGhpcyB2YWx1ZSBjYW4gYWxzbyBiZSBhbgorICAgICAqICAgICAgICBhcnJheSBvZiBieXRlLCBib29sZWFuLCBzaG9ydCwgY2hhciwgaW50LCBsb25nLCBmbG9hdCBvciBkb3VibGUKKyAgICAgKiAgICAgICAgdmFsdWVzICh0aGlzIGlzIGVxdWl2YWxlbnQgdG8gdXNpbmcge0BsaW5rICN2aXNpdEFycmF5IHZpc2l0QXJyYXl9CisgICAgICogICAgICAgIGFuZCB2aXNpdGluZyBlYWNoIGFycmF5IGVsZW1lbnQgaW4gdHVybiwgYnV0IGlzIG1vcmUgY29udmVuaWVudCkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdmlzaXQoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICBpZiAoYXYgIT0gbnVsbCkgeworICAgICAgICAgICAgYXYudmlzaXQobmFtZSwgdmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVmlzaXRzIGFuIGVudW1lcmF0aW9uIHZhbHVlIG9mIHRoZSBhbm5vdGF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgdGhlIHZhbHVlIG5hbWUuCisgICAgICogQHBhcmFtIGRlc2MgdGhlIGNsYXNzIGRlc2NyaXB0b3Igb2YgdGhlIGVudW1lcmF0aW9uIGNsYXNzLgorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgYWN0dWFsIGVudW1lcmF0aW9uIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZpc2l0RW51bShTdHJpbmcgbmFtZSwgU3RyaW5nIGRlc2MsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICBpZiAoYXYgIT0gbnVsbCkgeworICAgICAgICAgICAgYXYudmlzaXRFbnVtKG5hbWUsIGRlc2MsIHZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFZpc2l0cyBhIG5lc3RlZCBhbm5vdGF0aW9uIHZhbHVlIG9mIHRoZSBhbm5vdGF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgdGhlIHZhbHVlIG5hbWUuCisgICAgICogQHBhcmFtIGRlc2MgdGhlIGNsYXNzIGRlc2NyaXB0b3Igb2YgdGhlIG5lc3RlZCBhbm5vdGF0aW9uIGNsYXNzLgorICAgICAqIEByZXR1cm4gYSB2aXNpdG9yIHRvIHZpc2l0IHRoZSBhY3R1YWwgbmVzdGVkIGFubm90YXRpb24gdmFsdWUsIG9yCisgICAgICogICAgICAgICA8dHQ+bnVsbDwvdHQ+IGlmIHRoaXMgdmlzaXRvciBpcyBub3QgaW50ZXJlc3RlZCBpbiB2aXNpdGluZworICAgICAqICAgICAgICAgdGhpcyBuZXN0ZWQgYW5ub3RhdGlvbi4gPGk+VGhlIG5lc3RlZCBhbm5vdGF0aW9uIHZhbHVlIG11c3QgYmUKKyAgICAgKiAgICAgICAgIGZ1bGx5IHZpc2l0ZWQgYmVmb3JlIGNhbGxpbmcgb3RoZXIgbWV0aG9kcyBvbiB0aGlzIGFubm90YXRpb24KKyAgICAgKiAgICAgICAgIHZpc2l0b3I8L2k+LgorICAgICAqLworICAgIHB1YmxpYyBBbm5vdGF0aW9uVmlzaXRvciB2aXNpdEFubm90YXRpb24oU3RyaW5nIG5hbWUsIFN0cmluZyBkZXNjKSB7CisgICAgICAgIGlmIChhdiAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gYXYudmlzaXRBbm5vdGF0aW9uKG5hbWUsIGRlc2MpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZpc2l0cyBhbiBhcnJheSB2YWx1ZSBvZiB0aGUgYW5ub3RhdGlvbi4gTm90ZSB0aGF0IGFycmF5cyBvZiBwcmltaXRpdmUKKyAgICAgKiB0eXBlcyAoc3VjaCBhcyBieXRlLCBib29sZWFuLCBzaG9ydCwgY2hhciwgaW50LCBsb25nLCBmbG9hdCBvciBkb3VibGUpCisgICAgICogY2FuIGJlIHBhc3NlZCBhcyB2YWx1ZSB0byB7QGxpbmsgI3Zpc2l0IHZpc2l0fS4gVGhpcyBpcyB3aGF0CisgICAgICoge0BsaW5rIENsYXNzUmVhZGVyfSBkb2VzLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgdGhlIHZhbHVlIG5hbWUuCisgICAgICogQHJldHVybiBhIHZpc2l0b3IgdG8gdmlzaXQgdGhlIGFjdHVhbCBhcnJheSB2YWx1ZSBlbGVtZW50cywgb3IKKyAgICAgKiAgICAgICAgIDx0dD5udWxsPC90dD4gaWYgdGhpcyB2aXNpdG9yIGlzIG5vdCBpbnRlcmVzdGVkIGluIHZpc2l0aW5nCisgICAgICogICAgICAgICB0aGVzZSB2YWx1ZXMuIFRoZSAnbmFtZScgcGFyYW1ldGVycyBwYXNzZWQgdG8gdGhlIG1ldGhvZHMgb2YgdGhpcworICAgICAqICAgICAgICAgdmlzaXRvciBhcmUgaWdub3JlZC4gPGk+QWxsIHRoZSBhcnJheSB2YWx1ZXMgbXVzdCBiZSB2aXNpdGVkCisgICAgICogICAgICAgICBiZWZvcmUgY2FsbGluZyBvdGhlciBtZXRob2RzIG9uIHRoaXMgYW5ub3RhdGlvbiB2aXNpdG9yPC9pPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQW5ub3RhdGlvblZpc2l0b3IgdmlzaXRBcnJheShTdHJpbmcgbmFtZSkgeworICAgICAgICBpZiAoYXYgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGF2LnZpc2l0QXJyYXkobmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogVmlzaXRzIHRoZSBlbmQgb2YgdGhlIGFubm90YXRpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdmlzaXRFbmQoKSB7CisgICAgICAgIGlmIChhdiAhPSBudWxsKSB7CisgICAgICAgICAgICBhdi52aXNpdEVuZCgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS9Bbm5vdGF0aW9uV3JpdGVyLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL0Fubm90YXRpb25Xcml0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTcyODM5Ci0tLSAvZGV2L251bGwKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS9Bbm5vdGF0aW9uV3JpdGVyLmphdmEKQEAgLTAsMCArMSwzNTEgQEAKKy8qCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IE9yYWNsZSBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQorICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQorICogcXVlc3Rpb25zLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgaXMgYXZhaWxhYmxlIHVuZGVyIGFuZCBnb3Zlcm5lZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIEhvd2V2ZXIsIHRoZSBmb2xsb3dpbmcgbm90aWNlIGFjY29tcGFuaWVkIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoaXMKKyAqIGZpbGU6CisgKgorICogQVNNOiBhIHZlcnkgc21hbGwgYW5kIGZhc3QgSmF2YSBieXRlY29kZSBtYW5pcHVsYXRpb24gZnJhbWV3b3JrCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAxMSBJTlJJQSwgRnJhbmNlIFRlbGVjb20KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc207CisKKy8qKgorICogQW4ge0BsaW5rIEFubm90YXRpb25WaXNpdG9yfSB0aGF0IGdlbmVyYXRlcyBhbm5vdGF0aW9ucyBpbiBieXRlY29kZSBmb3JtLgorICoKKyAqIEBhdXRob3IgRXJpYyBCcnVuZXRvbgorICogQGF1dGhvciBFdWdlbmUgS3VsZXNob3YKKyAqLworZmluYWwgY2xhc3MgQW5ub3RhdGlvbldyaXRlciBleHRlbmRzIEFubm90YXRpb25WaXNpdG9yIHsKKworICAgIC8qKgorICAgICAqIFRoZSBjbGFzcyB3cml0ZXIgdG8gd2hpY2ggdGhpcyBhbm5vdGF0aW9uIG11c3QgYmUgYWRkZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBDbGFzc1dyaXRlciBjdzsKKworICAgIC8qKgorICAgICAqIFRoZSBudW1iZXIgb2YgdmFsdWVzIGluIHRoaXMgYW5ub3RhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBzaXplOworCisgICAgLyoqCisgICAgICogPHR0PnRydWU8dHQ+IGlmIHZhbHVlcyBhcmUgbmFtZWQsIDx0dD5mYWxzZTwvdHQ+IG90aGVyd2lzZS4gQW5ub3RhdGlvbgorICAgICAqIHdyaXRlcnMgdXNlZCBmb3IgYW5ub3RhdGlvbiBkZWZhdWx0IGFuZCBhbm5vdGF0aW9uIGFycmF5cyB1c2UgdW5uYW1lZAorICAgICAqIHZhbHVlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbmFtZWQ7CisKKyAgICAvKioKKyAgICAgKiBUaGUgYW5ub3RhdGlvbiB2YWx1ZXMgaW4gYnl0ZWNvZGUgZm9ybS4gVGhpcyBieXRlIHZlY3RvciBvbmx5IGNvbnRhaW5zCisgICAgICogdGhlIHZhbHVlcyB0aGVtc2VsdmVzLCBpLmUuIHRoZSBudW1iZXIgb2YgdmFsdWVzIG11c3QgYmUgc3RvcmVkIGFzIGEKKyAgICAgKiB1bnNpZ25lZCBzaG9ydCBqdXN0IGJlZm9yZSB0aGVzZSBieXRlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIEJ5dGVWZWN0b3IgYnY7CisKKyAgICAvKioKKyAgICAgKiBUaGUgYnl0ZSB2ZWN0b3IgdG8gYmUgdXNlZCB0byBzdG9yZSB0aGUgbnVtYmVyIG9mIHZhbHVlcyBvZiB0aGlzCisgICAgICogYW5ub3RhdGlvbi4gU2VlIHtAbGluayAjYnZ9LgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgQnl0ZVZlY3RvciBwYXJlbnQ7CisKKyAgICAvKioKKyAgICAgKiBXaGVyZSB0aGUgbnVtYmVyIG9mIHZhbHVlcyBvZiB0aGlzIGFubm90YXRpb24gbXVzdCBiZSBzdG9yZWQgaW4KKyAgICAgKiB7QGxpbmsgI3BhcmVudH0uCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgb2Zmc2V0OworCisgICAgLyoqCisgICAgICogTmV4dCBhbm5vdGF0aW9uIHdyaXRlci4gVGhpcyBmaWVsZCBpcyB1c2VkIHRvIHN0b3JlIGFubm90YXRpb24gbGlzdHMuCisgICAgICovCisgICAgQW5ub3RhdGlvbldyaXRlciBuZXh0OworCisgICAgLyoqCisgICAgICogUHJldmlvdXMgYW5ub3RhdGlvbiB3cml0ZXIuIFRoaXMgZmllbGQgaXMgdXNlZCB0byBzdG9yZSBhbm5vdGF0aW9uIGxpc3RzLgorICAgICAqLworICAgIEFubm90YXRpb25Xcml0ZXIgcHJldjsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIENvbnN0cnVjdG9yCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAbGluayBBbm5vdGF0aW9uV3JpdGVyfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjdyB0aGUgY2xhc3Mgd3JpdGVyIHRvIHdoaWNoIHRoaXMgYW5ub3RhdGlvbiBtdXN0IGJlIGFkZGVkLgorICAgICAqIEBwYXJhbSBuYW1lZCA8dHQ+dHJ1ZTx0dD4gaWYgdmFsdWVzIGFyZSBuYW1lZCwgPHR0PmZhbHNlPC90dD4gb3RoZXJ3aXNlLgorICAgICAqIEBwYXJhbSBidiB3aGVyZSB0aGUgYW5ub3RhdGlvbiB2YWx1ZXMgbXVzdCBiZSBzdG9yZWQuCisgICAgICogQHBhcmFtIHBhcmVudCB3aGVyZSB0aGUgbnVtYmVyIG9mIGFubm90YXRpb24gdmFsdWVzIG11c3QgYmUgc3RvcmVkLgorICAgICAqIEBwYXJhbSBvZmZzZXQgd2hlcmUgaW4gPHR0PnBhcmVudDwvdHQ+IHRoZSBudW1iZXIgb2YgYW5ub3RhdGlvbiB2YWx1ZXMgbXVzdAorICAgICAqICAgICAgYmUgc3RvcmVkLgorICAgICAqLworICAgIEFubm90YXRpb25Xcml0ZXIoCisgICAgICAgIGZpbmFsIENsYXNzV3JpdGVyIGN3LAorICAgICAgICBmaW5hbCBib29sZWFuIG5hbWVkLAorICAgICAgICBmaW5hbCBCeXRlVmVjdG9yIGJ2LAorICAgICAgICBmaW5hbCBCeXRlVmVjdG9yIHBhcmVudCwKKyAgICAgICAgZmluYWwgaW50IG9mZnNldCkKKyAgICB7CisgICAgICAgIHN1cGVyKE9wY29kZXMuQVNNNCk7CisgICAgICAgIHRoaXMuY3cgPSBjdzsKKyAgICAgICAgdGhpcy5uYW1lZCA9IG5hbWVkOworICAgICAgICB0aGlzLmJ2ID0gYnY7CisgICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OworICAgICAgICB0aGlzLm9mZnNldCA9IG9mZnNldDsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgQW5ub3RhdGlvblZpc2l0b3IgYWJzdHJhY3QgY2xhc3MKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgKytzaXplOworICAgICAgICBpZiAobmFtZWQpIHsKKyAgICAgICAgICAgIGJ2LnB1dFNob3J0KGN3Lm5ld1VURjgobmFtZSkpOworICAgICAgICB9CisgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgeworICAgICAgICAgICAgYnYucHV0MTIoJ3MnLCBjdy5uZXdVVEY4KChTdHJpbmcpIHZhbHVlKSk7CisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBCeXRlKSB7CisgICAgICAgICAgICBidi5wdXQxMignQicsIGN3Lm5ld0ludGVnZXIoKChCeXRlKSB2YWx1ZSkuYnl0ZVZhbHVlKCkpLmluZGV4KTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEJvb2xlYW4pIHsKKyAgICAgICAgICAgIGludCB2ID0gKChCb29sZWFuKSB2YWx1ZSkuYm9vbGVhblZhbHVlKCkgPyAxIDogMDsKKyAgICAgICAgICAgIGJ2LnB1dDEyKCdaJywgY3cubmV3SW50ZWdlcih2KS5pbmRleCk7CisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsKKyAgICAgICAgICAgIGJ2LnB1dDEyKCdDJywgY3cubmV3SW50ZWdlcigoKENoYXJhY3RlcikgdmFsdWUpLmNoYXJWYWx1ZSgpKS5pbmRleCk7CisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTaG9ydCkgeworICAgICAgICAgICAgYnYucHV0MTIoJ1MnLCBjdy5uZXdJbnRlZ2VyKCgoU2hvcnQpIHZhbHVlKS5zaG9ydFZhbHVlKCkpLmluZGV4KTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFR5cGUpIHsKKyAgICAgICAgICAgIGJ2LnB1dDEyKCdjJywgY3cubmV3VVRGOCgoKFR5cGUpIHZhbHVlKS5nZXREZXNjcmlwdG9yKCkpKTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIGJ5dGVbXSkgeworICAgICAgICAgICAgYnl0ZVtdIHYgPSAoYnl0ZVtdKSB2YWx1ZTsKKyAgICAgICAgICAgIGJ2LnB1dDEyKCdbJywgdi5sZW5ndGgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2Lmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgYnYucHV0MTIoJ0InLCBjdy5uZXdJbnRlZ2VyKHZbaV0pLmluZGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIGJvb2xlYW5bXSkgeworICAgICAgICAgICAgYm9vbGVhbltdIHYgPSAoYm9vbGVhbltdKSB2YWx1ZTsKKyAgICAgICAgICAgIGJ2LnB1dDEyKCdbJywgdi5sZW5ndGgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2Lmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgYnYucHV0MTIoJ1onLCBjdy5uZXdJbnRlZ2VyKHZbaV0gPyAxIDogMCkuaW5kZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2Ygc2hvcnRbXSkgeworICAgICAgICAgICAgc2hvcnRbXSB2ID0gKHNob3J0W10pIHZhbHVlOworICAgICAgICAgICAgYnYucHV0MTIoJ1snLCB2Lmxlbmd0aCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHYubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBidi5wdXQxMignUycsIGN3Lm5ld0ludGVnZXIodltpXSkuaW5kZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgY2hhcltdKSB7CisgICAgICAgICAgICBjaGFyW10gdiA9IChjaGFyW10pIHZhbHVlOworICAgICAgICAgICAgYnYucHV0MTIoJ1snLCB2Lmxlbmd0aCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHYubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBidi5wdXQxMignQycsIGN3Lm5ld0ludGVnZXIodltpXSkuaW5kZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgaW50W10pIHsKKyAgICAgICAgICAgIGludFtdIHYgPSAoaW50W10pIHZhbHVlOworICAgICAgICAgICAgYnYucHV0MTIoJ1snLCB2Lmxlbmd0aCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHYubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBidi5wdXQxMignSScsIGN3Lm5ld0ludGVnZXIodltpXSkuaW5kZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgbG9uZ1tdKSB7CisgICAgICAgICAgICBsb25nW10gdiA9IChsb25nW10pIHZhbHVlOworICAgICAgICAgICAgYnYucHV0MTIoJ1snLCB2Lmxlbmd0aCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHYubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBidi5wdXQxMignSicsIGN3Lm5ld0xvbmcodltpXSkuaW5kZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgZmxvYXRbXSkgeworICAgICAgICAgICAgZmxvYXRbXSB2ID0gKGZsb2F0W10pIHZhbHVlOworICAgICAgICAgICAgYnYucHV0MTIoJ1snLCB2Lmxlbmd0aCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHYubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBidi5wdXQxMignRicsIGN3Lm5ld0Zsb2F0KHZbaV0pLmluZGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIGRvdWJsZVtdKSB7CisgICAgICAgICAgICBkb3VibGVbXSB2ID0gKGRvdWJsZVtdKSB2YWx1ZTsKKyAgICAgICAgICAgIGJ2LnB1dDEyKCdbJywgdi5sZW5ndGgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2Lmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgYnYucHV0MTIoJ0QnLCBjdy5uZXdEb3VibGUodltpXSkuaW5kZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgSXRlbSBpID0gY3cubmV3Q29uc3RJdGVtKHZhbHVlKTsKKyAgICAgICAgICAgIGJ2LnB1dDEyKCIucy5JRkpEQ1MiLmNoYXJBdChpLnR5cGUpLCBpLmluZGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0RW51bSgKKyAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUsCisgICAgICAgIGZpbmFsIFN0cmluZyBkZXNjLAorICAgICAgICBmaW5hbCBTdHJpbmcgdmFsdWUpCisgICAgeworICAgICAgICArK3NpemU7CisgICAgICAgIGlmIChuYW1lZCkgeworICAgICAgICAgICAgYnYucHV0U2hvcnQoY3cubmV3VVRGOChuYW1lKSk7CisgICAgICAgIH0KKyAgICAgICAgYnYucHV0MTIoJ2UnLCBjdy5uZXdVVEY4KGRlc2MpKS5wdXRTaG9ydChjdy5uZXdVVEY4KHZhbHVlKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEFubm90YXRpb25WaXNpdG9yIHZpc2l0QW5ub3RhdGlvbigKKyAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUsCisgICAgICAgIGZpbmFsIFN0cmluZyBkZXNjKQorICAgIHsKKyAgICAgICAgKytzaXplOworICAgICAgICBpZiAobmFtZWQpIHsKKyAgICAgICAgICAgIGJ2LnB1dFNob3J0KGN3Lm5ld1VURjgobmFtZSkpOworICAgICAgICB9CisgICAgICAgIC8vIHdyaXRlIHRhZyBhbmQgdHlwZSwgYW5kIHJlc2VydmUgc3BhY2UgZm9yIHZhbHVlcyBjb3VudAorICAgICAgICBidi5wdXQxMignQCcsIGN3Lm5ld1VURjgoZGVzYykpLnB1dFNob3J0KDApOworICAgICAgICByZXR1cm4gbmV3IEFubm90YXRpb25Xcml0ZXIoY3csIHRydWUsIGJ2LCBidiwgYnYubGVuZ3RoIC0gMik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEFubm90YXRpb25WaXNpdG9yIHZpc2l0QXJyYXkoZmluYWwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgKytzaXplOworICAgICAgICBpZiAobmFtZWQpIHsKKyAgICAgICAgICAgIGJ2LnB1dFNob3J0KGN3Lm5ld1VURjgobmFtZSkpOworICAgICAgICB9CisgICAgICAgIC8vIHdyaXRlIHRhZywgYW5kIHJlc2VydmUgc3BhY2UgZm9yIGFycmF5IHNpemUKKyAgICAgICAgYnYucHV0MTIoJ1snLCAwKTsKKyAgICAgICAgcmV0dXJuIG5ldyBBbm5vdGF0aW9uV3JpdGVyKGN3LCBmYWxzZSwgYnYsIGJ2LCBidi5sZW5ndGggLSAyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEVuZCgpIHsKKyAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKSB7CisgICAgICAgICAgICBieXRlW10gZGF0YSA9IHBhcmVudC5kYXRhOworICAgICAgICAgICAgZGF0YVtvZmZzZXRdID0gKGJ5dGUpIChzaXplID4+PiA4KTsKKyAgICAgICAgICAgIGRhdGFbb2Zmc2V0ICsgMV0gPSAoYnl0ZSkgc2l6ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIFV0aWxpdHkgbWV0aG9kcworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGlzIGFubm90YXRpb24gd3JpdGVyIGxpc3QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBzaXplIG9mIHRoaXMgYW5ub3RhdGlvbiB3cml0ZXIgbGlzdC4KKyAgICAgKi8KKyAgICBpbnQgZ2V0U2l6ZSgpIHsKKyAgICAgICAgaW50IHNpemUgPSAwOworICAgICAgICBBbm5vdGF0aW9uV3JpdGVyIGF3ID0gdGhpczsKKyAgICAgICAgd2hpbGUgKGF3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNpemUgKz0gYXcuYnYubGVuZ3RoOworICAgICAgICAgICAgYXcgPSBhdy5uZXh0OworICAgICAgICB9CisgICAgICAgIHJldHVybiBzaXplOworICAgIH0KKworICAgIC8qKgorICAgICAqIFB1dHMgdGhlIGFubm90YXRpb25zIG9mIHRoaXMgYW5ub3RhdGlvbiB3cml0ZXIgbGlzdCBpbnRvIHRoZSBnaXZlbiBieXRlCisgICAgICogdmVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIG91dCB3aGVyZSB0aGUgYW5ub3RhdGlvbnMgbXVzdCBiZSBwdXQuCisgICAgICovCisgICAgdm9pZCBwdXQoZmluYWwgQnl0ZVZlY3RvciBvdXQpIHsKKyAgICAgICAgaW50IG4gPSAwOworICAgICAgICBpbnQgc2l6ZSA9IDI7CisgICAgICAgIEFubm90YXRpb25Xcml0ZXIgYXcgPSB0aGlzOworICAgICAgICBBbm5vdGF0aW9uV3JpdGVyIGxhc3QgPSBudWxsOworICAgICAgICB3aGlsZSAoYXcgIT0gbnVsbCkgeworICAgICAgICAgICAgKytuOworICAgICAgICAgICAgc2l6ZSArPSBhdy5idi5sZW5ndGg7CisgICAgICAgICAgICBhdy52aXNpdEVuZCgpOyAvLyBpbiBjYXNlIHVzZXIgZm9yZ290IHRvIGNhbGwgdmlzaXRFbmQKKyAgICAgICAgICAgIGF3LnByZXYgPSBsYXN0OworICAgICAgICAgICAgbGFzdCA9IGF3OworICAgICAgICAgICAgYXcgPSBhdy5uZXh0OworICAgICAgICB9CisgICAgICAgIG91dC5wdXRJbnQoc2l6ZSk7CisgICAgICAgIG91dC5wdXRTaG9ydChuKTsKKyAgICAgICAgYXcgPSBsYXN0OworICAgICAgICB3aGlsZSAoYXcgIT0gbnVsbCkgeworICAgICAgICAgICAgb3V0LnB1dEJ5dGVBcnJheShhdy5idi5kYXRhLCAwLCBhdy5idi5sZW5ndGgpOworICAgICAgICAgICAgYXcgPSBhdy5wcmV2OworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUHV0cyB0aGUgZ2l2ZW4gYW5ub3RhdGlvbiBsaXN0cyBpbnRvIHRoZSBnaXZlbiBieXRlIHZlY3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYW5ucyBhbiBhcnJheSBvZiBhbm5vdGF0aW9uIHdyaXRlciBsaXN0cy4KKyAgICAgKiBAcGFyYW0gb2ZmIGluZGV4IG9mIHRoZSBmaXJzdCBhbm5vdGF0aW9uIHRvIGJlIHdyaXR0ZW4uCisgICAgICogQHBhcmFtIG91dCB3aGVyZSB0aGUgYW5ub3RhdGlvbnMgbXVzdCBiZSBwdXQuCisgICAgICovCisgICAgc3RhdGljIHZvaWQgcHV0KAorICAgICAgICBmaW5hbCBBbm5vdGF0aW9uV3JpdGVyW10gcGFubnMsCisgICAgICAgIGZpbmFsIGludCBvZmYsCisgICAgICAgIGZpbmFsIEJ5dGVWZWN0b3Igb3V0KQorICAgIHsKKyAgICAgICAgaW50IHNpemUgPSAxICsgMiAqIChwYW5ucy5sZW5ndGggLSBvZmYpOworICAgICAgICBmb3IgKGludCBpID0gb2ZmOyBpIDwgcGFubnMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIHNpemUgKz0gcGFubnNbaV0gPT0gbnVsbCA/IDAgOiBwYW5uc1tpXS5nZXRTaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgb3V0LnB1dEludChzaXplKS5wdXRCeXRlKHBhbm5zLmxlbmd0aCAtIG9mZik7CisgICAgICAgIGZvciAoaW50IGkgPSBvZmY7IGkgPCBwYW5ucy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgQW5ub3RhdGlvbldyaXRlciBhdyA9IHBhbm5zW2ldOworICAgICAgICAgICAgQW5ub3RhdGlvbldyaXRlciBsYXN0ID0gbnVsbDsKKyAgICAgICAgICAgIGludCBuID0gMDsKKyAgICAgICAgICAgIHdoaWxlIChhdyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgKytuOworICAgICAgICAgICAgICAgIGF3LnZpc2l0RW5kKCk7IC8vIGluIGNhc2UgdXNlciBmb3Jnb3QgdG8gY2FsbCB2aXNpdEVuZAorICAgICAgICAgICAgICAgIGF3LnByZXYgPSBsYXN0OworICAgICAgICAgICAgICAgIGxhc3QgPSBhdzsKKyAgICAgICAgICAgICAgICBhdyA9IGF3Lm5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXQucHV0U2hvcnQobik7CisgICAgICAgICAgICBhdyA9IGxhc3Q7CisgICAgICAgICAgICB3aGlsZSAoYXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG91dC5wdXRCeXRlQXJyYXkoYXcuYnYuZGF0YSwgMCwgYXcuYnYubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBhdyA9IGF3LnByZXY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL0F0dHJpYnV0ZS5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS9BdHRyaWJ1dGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzgxN2JjCi0tLSAvZGV2L251bGwKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS9BdHRyaWJ1dGUuamF2YQpAQCAtMCwwICsxLDI4MyBAQAorLyoKKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgT3JhY2xlIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCisgKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CisgKiBxdWVzdGlvbnMuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBpcyBhdmFpbGFibGUgdW5kZXIgYW5kIGdvdmVybmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogSG93ZXZlciwgdGhlIGZvbGxvd2luZyBub3RpY2UgYWNjb21wYW5pZWQgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhpcworICogZmlsZToKKyAqCisgKiBBU006IGEgdmVyeSBzbWFsbCBhbmQgZmFzdCBKYXZhIGJ5dGVjb2RlIG1hbmlwdWxhdGlvbiBmcmFtZXdvcmsKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDExIElOUklBLCBGcmFuY2UgVGVsZWNvbQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbTsKKworLyoqCisgKiBBIG5vbiBzdGFuZGFyZCBjbGFzcywgZmllbGQsIG1ldGhvZCBvciBjb2RlIGF0dHJpYnV0ZS4KKyAqCisgKiBAYXV0aG9yIEVyaWMgQnJ1bmV0b24KKyAqIEBhdXRob3IgRXVnZW5lIEt1bGVzaG92CisgKi8KK3B1YmxpYyBjbGFzcyBBdHRyaWJ1dGUgeworCisgICAgLyoqCisgICAgICogVGhlIHR5cGUgb2YgdGhpcyBhdHRyaWJ1dGUuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIFN0cmluZyB0eXBlOworCisgICAgLyoqCisgICAgICogVGhlIHJhdyB2YWx1ZSBvZiB0aGlzIGF0dHJpYnV0ZSwgdXNlZCBvbmx5IGZvciB1bmtub3duIGF0dHJpYnV0ZXMuCisgICAgICovCisgICAgYnl0ZVtdIHZhbHVlOworCisgICAgLyoqCisgICAgICogVGhlIG5leHQgYXR0cmlidXRlIGluIHRoaXMgYXR0cmlidXRlIGxpc3QuIE1heSBiZSA8dHQ+bnVsbDwvdHQ+LgorICAgICAqLworICAgIEF0dHJpYnV0ZSBuZXh0OworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBlbXB0eSBhdHRyaWJ1dGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBvZiB0aGUgYXR0cmlidXRlLgorICAgICAqLworICAgIHByb3RlY3RlZCBBdHRyaWJ1dGUoZmluYWwgU3RyaW5nIHR5cGUpIHsKKyAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIDx0dD50cnVlPC90dD4gaWYgdGhpcyB0eXBlIG9mIGF0dHJpYnV0ZSBpcyB1bmtub3duLiBUaGUgZGVmYXVsdAorICAgICAqIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIGFsd2F5cyByZXR1cm5zIDx0dD50cnVlPC90dD4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIDx0dD50cnVlPC90dD4gaWYgdGhpcyB0eXBlIG9mIGF0dHJpYnV0ZSBpcyB1bmtub3duLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzVW5rbm93bigpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyA8dHQ+dHJ1ZTwvdHQ+IGlmIHRoaXMgdHlwZSBvZiBhdHRyaWJ1dGUgaXMgYSBjb2RlIGF0dHJpYnV0ZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gPHR0PnRydWU8L3R0PiBpZiB0aGlzIHR5cGUgb2YgYXR0cmlidXRlIGlzIGEgY29kZSBhdHRyaWJ1dGUuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNDb2RlQXR0cmlidXRlKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbGFiZWxzIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBhdHRyaWJ1dGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBsYWJlbHMgY29ycmVzcG9uZGluZyB0byB0aGlzIGF0dHJpYnV0ZSwgb3IgPHR0Pm51bGw8L3R0PiBpZgorICAgICAqICAgICAgICAgdGhpcyBhdHRyaWJ1dGUgaXMgbm90IGEgY29kZSBhdHRyaWJ1dGUgdGhhdCBjb250YWlucyBsYWJlbHMuCisgICAgICovCisgICAgcHJvdGVjdGVkIExhYmVsW10gZ2V0TGFiZWxzKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkcyBhIHtAbGluayAjdHlwZSB0eXBlfSBhdHRyaWJ1dGUuIFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIGEgPGk+bmV3PC9pPgorICAgICAqIHtAbGluayBBdHRyaWJ1dGV9IG9iamVjdCwgb2YgdHlwZSB7QGxpbmsgI3R5cGUgdHlwZX0sIGNvcnJlc3BvbmRpbmcgdG8KKyAgICAgKiB0aGUgPHR0PmxlbjwvdHQ+IGJ5dGVzIHN0YXJ0aW5nIGF0IHRoZSBnaXZlbiBvZmZzZXQsIGluIHRoZSBnaXZlbiBjbGFzcworICAgICAqIHJlYWRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjciB0aGUgY2xhc3MgdGhhdCBjb250YWlucyB0aGUgYXR0cmlidXRlIHRvIGJlIHJlYWQuCisgICAgICogQHBhcmFtIG9mZiBpbmRleCBvZiB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgYXR0cmlidXRlJ3MgY29udGVudCBpbiB7QGxpbmsKKyAgICAgKiAgICAgICAgQ2xhc3NSZWFkZXIjYiBjci5ifS4gVGhlIDYgYXR0cmlidXRlIGhlYWRlciBieXRlcywgY29udGFpbmluZyB0aGUKKyAgICAgKiAgICAgICAgdHlwZSBhbmQgdGhlIGxlbmd0aCBvZiB0aGUgYXR0cmlidXRlLCBhcmUgbm90IHRha2VuIGludG8gYWNjb3VudAorICAgICAqICAgICAgICBoZXJlLgorICAgICAqIEBwYXJhbSBsZW4gdGhlIGxlbmd0aCBvZiB0aGUgYXR0cmlidXRlJ3MgY29udGVudC4KKyAgICAgKiBAcGFyYW0gYnVmIGJ1ZmZlciB0byBiZSB1c2VkIHRvIGNhbGwKKyAgICAgKiAgICAgICAge0BsaW5rIENsYXNzUmVhZGVyI3JlYWRVVEY4IHJlYWRVVEY4fSwKKyAgICAgKiAgICAgICAge0BsaW5rIENsYXNzUmVhZGVyI3JlYWRDbGFzcyhpbnQsY2hhcltdKSByZWFkQ2xhc3N9IG9yCisgICAgICogICAgICAgIHtAbGluayBDbGFzc1JlYWRlciNyZWFkQ29uc3QgcmVhZENvbnN0fS4KKyAgICAgKiBAcGFyYW0gY29kZU9mZiBpbmRleCBvZiB0aGUgZmlyc3QgYnl0ZSBvZiBjb2RlJ3MgYXR0cmlidXRlIGNvbnRlbnQgaW4KKyAgICAgKiAgICAgICAge0BsaW5rIENsYXNzUmVhZGVyI2IgY3IuYn0sIG9yIC0xIGlmIHRoZSBhdHRyaWJ1dGUgdG8gYmUgcmVhZCBpcworICAgICAqICAgICAgICBub3QgYSBjb2RlIGF0dHJpYnV0ZS4gVGhlIDYgYXR0cmlidXRlIGhlYWRlciBieXRlcywgY29udGFpbmluZyB0aGUKKyAgICAgKiAgICAgICAgdHlwZSBhbmQgdGhlIGxlbmd0aCBvZiB0aGUgYXR0cmlidXRlLCBhcmUgbm90IHRha2VuIGludG8gYWNjb3VudAorICAgICAqICAgICAgICBoZXJlLgorICAgICAqIEBwYXJhbSBsYWJlbHMgdGhlIGxhYmVscyBvZiB0aGUgbWV0aG9kJ3MgY29kZSwgb3IgPHR0Pm51bGw8L3R0PiBpZiB0aGUKKyAgICAgKiAgICAgICAgYXR0cmlidXRlIHRvIGJlIHJlYWQgaXMgbm90IGEgY29kZSBhdHRyaWJ1dGUuCisgICAgICogQHJldHVybiBhIDxpPm5ldzwvaT4ge0BsaW5rIEF0dHJpYnV0ZX0gb2JqZWN0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuCisgICAgICogICAgICAgICBieXRlcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQXR0cmlidXRlIHJlYWQoCisgICAgICAgIGZpbmFsIENsYXNzUmVhZGVyIGNyLAorICAgICAgICBmaW5hbCBpbnQgb2ZmLAorICAgICAgICBmaW5hbCBpbnQgbGVuLAorICAgICAgICBmaW5hbCBjaGFyW10gYnVmLAorICAgICAgICBmaW5hbCBpbnQgY29kZU9mZiwKKyAgICAgICAgZmluYWwgTGFiZWxbXSBsYWJlbHMpCisgICAgeworICAgICAgICBBdHRyaWJ1dGUgYXR0ciA9IG5ldyBBdHRyaWJ1dGUodHlwZSk7CisgICAgICAgIGF0dHIudmFsdWUgPSBuZXcgYnl0ZVtsZW5dOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGNyLmIsIG9mZiwgYXR0ci52YWx1ZSwgMCwgbGVuKTsKKyAgICAgICAgcmV0dXJuIGF0dHI7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYnl0ZSBhcnJheSBmb3JtIG9mIHRoaXMgYXR0cmlidXRlLgorICAgICAqCisgICAgICogQHBhcmFtIGN3IHRoZSBjbGFzcyB0byB3aGljaCB0aGlzIGF0dHJpYnV0ZSBtdXN0IGJlIGFkZGVkLiBUaGlzIHBhcmFtZXRlcgorICAgICAqICAgICAgICBjYW4gYmUgdXNlZCB0byBhZGQgdG8gdGhlIGNvbnN0YW50IHBvb2wgb2YgdGhpcyBjbGFzcyB0aGUgaXRlbXMKKyAgICAgKiAgICAgICAgdGhhdCBjb3JyZXNwb25kcyB0byB0aGlzIGF0dHJpYnV0ZS4KKyAgICAgKiBAcGFyYW0gY29kZSB0aGUgYnl0ZWNvZGUgb2YgdGhlIG1ldGhvZCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgY29kZQorICAgICAqICAgICAgICBhdHRyaWJ1dGUsIG9yIDx0dD5udWxsPC90dD4gaWYgdGhpcyBhdHRyaWJ1dGUgaXMgbm90IGEgY29kZQorICAgICAqICAgICAgICBhdHRyaWJ1dGVzLgorICAgICAqIEBwYXJhbSBsZW4gdGhlIGxlbmd0aCBvZiB0aGUgYnl0ZWNvZGUgb2YgdGhlIG1ldGhvZCBjb3JyZXNwb25kaW5nIHRvIHRoaXMKKyAgICAgKiAgICAgICAgY29kZSBhdHRyaWJ1dGUsIG9yIDx0dD5udWxsPC90dD4gaWYgdGhpcyBhdHRyaWJ1dGUgaXMgbm90IGEgY29kZQorICAgICAqICAgICAgICBhdHRyaWJ1dGUuCisgICAgICogQHBhcmFtIG1heFN0YWNrIHRoZSBtYXhpbXVtIHN0YWNrIHNpemUgb2YgdGhlIG1ldGhvZCBjb3JyZXNwb25kaW5nIHRvCisgICAgICogICAgICAgIHRoaXMgY29kZSBhdHRyaWJ1dGUsIG9yIC0xIGlmIHRoaXMgYXR0cmlidXRlIGlzIG5vdCBhIGNvZGUKKyAgICAgKiAgICAgICAgYXR0cmlidXRlLgorICAgICAqIEBwYXJhbSBtYXhMb2NhbHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGxvY2FsIHZhcmlhYmxlcyBvZiB0aGUgbWV0aG9kCisgICAgICogICAgICAgIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBjb2RlIGF0dHJpYnV0ZSwgb3IgLTEgaWYgdGhpcyBhdHRyaWJ1dGUgaXMKKyAgICAgKiAgICAgICAgbm90IGEgY29kZSBhdHRyaWJ1dGUuCisgICAgICogQHJldHVybiB0aGUgYnl0ZSBhcnJheSBmb3JtIG9mIHRoaXMgYXR0cmlidXRlLgorICAgICAqLworICAgIHByb3RlY3RlZCBCeXRlVmVjdG9yIHdyaXRlKAorICAgICAgICBmaW5hbCBDbGFzc1dyaXRlciBjdywKKyAgICAgICAgZmluYWwgYnl0ZVtdIGNvZGUsCisgICAgICAgIGZpbmFsIGludCBsZW4sCisgICAgICAgIGZpbmFsIGludCBtYXhTdGFjaywKKyAgICAgICAgZmluYWwgaW50IG1heExvY2FscykKKyAgICB7CisgICAgICAgIEJ5dGVWZWN0b3IgdiA9IG5ldyBCeXRlVmVjdG9yKCk7CisgICAgICAgIHYuZGF0YSA9IHZhbHVlOworICAgICAgICB2Lmxlbmd0aCA9IHZhbHVlLmxlbmd0aDsKKyAgICAgICAgcmV0dXJuIHY7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBhdHRyaWJ1dGUgbGlzdCB0aGF0IGJlZ2lucyB3aXRoIHRoaXMgYXR0cmlidXRlLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBhdHRyaWJ1dGUgbGlzdCB0aGF0IGJlZ2lucyB3aXRoIHRoaXMgYXR0cmlidXRlLgorICAgICAqLworICAgIGZpbmFsIGludCBnZXRDb3VudCgpIHsKKyAgICAgICAgaW50IGNvdW50ID0gMDsKKyAgICAgICAgQXR0cmlidXRlIGF0dHIgPSB0aGlzOworICAgICAgICB3aGlsZSAoYXR0ciAhPSBudWxsKSB7CisgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgYXR0ciA9IGF0dHIubmV4dDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY291bnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc2l6ZSBvZiBhbGwgdGhlIGF0dHJpYnV0ZXMgaW4gdGhpcyBhdHRyaWJ1dGUgbGlzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjdyB0aGUgY2xhc3Mgd3JpdGVyIHRvIGJlIHVzZWQgdG8gY29udmVydCB0aGUgYXR0cmlidXRlcyBpbnRvIGJ5dGUKKyAgICAgKiAgICAgICAgYXJyYXlzLCB3aXRoIHRoZSB7QGxpbmsgI3dyaXRlIHdyaXRlfSBtZXRob2QuCisgICAgICogQHBhcmFtIGNvZGUgdGhlIGJ5dGVjb2RlIG9mIHRoZSBtZXRob2QgY29ycmVzcG9uZGluZyB0byB0aGVzZSBjb2RlCisgICAgICogICAgICAgIGF0dHJpYnV0ZXMsIG9yIDx0dD5udWxsPC90dD4gaWYgdGhlc2UgYXR0cmlidXRlcyBhcmUgbm90IGNvZGUKKyAgICAgKiAgICAgICAgYXR0cmlidXRlcy4KKyAgICAgKiBAcGFyYW0gbGVuIHRoZSBsZW5ndGggb2YgdGhlIGJ5dGVjb2RlIG9mIHRoZSBtZXRob2QgY29ycmVzcG9uZGluZyB0bworICAgICAqICAgICAgICB0aGVzZSBjb2RlIGF0dHJpYnV0ZXMsIG9yIDx0dD5udWxsPC90dD4gaWYgdGhlc2UgYXR0cmlidXRlcyBhcmUKKyAgICAgKiAgICAgICAgbm90IGNvZGUgYXR0cmlidXRlcy4KKyAgICAgKiBAcGFyYW0gbWF4U3RhY2sgdGhlIG1heGltdW0gc3RhY2sgc2l6ZSBvZiB0aGUgbWV0aG9kIGNvcnJlc3BvbmRpbmcgdG8KKyAgICAgKiAgICAgICAgdGhlc2UgY29kZSBhdHRyaWJ1dGVzLCBvciAtMSBpZiB0aGVzZSBhdHRyaWJ1dGVzIGFyZSBub3QgY29kZQorICAgICAqICAgICAgICBhdHRyaWJ1dGVzLgorICAgICAqIEBwYXJhbSBtYXhMb2NhbHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGxvY2FsIHZhcmlhYmxlcyBvZiB0aGUgbWV0aG9kCisgICAgICogICAgICAgIGNvcnJlc3BvbmRpbmcgdG8gdGhlc2UgY29kZSBhdHRyaWJ1dGVzLCBvciAtMSBpZiB0aGVzZSBhdHRyaWJ1dGVzCisgICAgICogICAgICAgIGFyZSBub3QgY29kZSBhdHRyaWJ1dGVzLgorICAgICAqIEByZXR1cm4gdGhlIHNpemUgb2YgYWxsIHRoZSBhdHRyaWJ1dGVzIGluIHRoaXMgYXR0cmlidXRlIGxpc3QuIFRoaXMgc2l6ZQorICAgICAqICAgICAgICAgaW5jbHVkZXMgdGhlIHNpemUgb2YgdGhlIGF0dHJpYnV0ZSBoZWFkZXJzLgorICAgICAqLworICAgIGZpbmFsIGludCBnZXRTaXplKAorICAgICAgICBmaW5hbCBDbGFzc1dyaXRlciBjdywKKyAgICAgICAgZmluYWwgYnl0ZVtdIGNvZGUsCisgICAgICAgIGZpbmFsIGludCBsZW4sCisgICAgICAgIGZpbmFsIGludCBtYXhTdGFjaywKKyAgICAgICAgZmluYWwgaW50IG1heExvY2FscykKKyAgICB7CisgICAgICAgIEF0dHJpYnV0ZSBhdHRyID0gdGhpczsKKyAgICAgICAgaW50IHNpemUgPSAwOworICAgICAgICB3aGlsZSAoYXR0ciAhPSBudWxsKSB7CisgICAgICAgICAgICBjdy5uZXdVVEY4KGF0dHIudHlwZSk7CisgICAgICAgICAgICBzaXplICs9IGF0dHIud3JpdGUoY3csIGNvZGUsIGxlbiwgbWF4U3RhY2ssIG1heExvY2FscykubGVuZ3RoICsgNjsKKyAgICAgICAgICAgIGF0dHIgPSBhdHRyLm5leHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNpemU7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGVzIGFsbCB0aGUgYXR0cmlidXRlcyBvZiB0aGlzIGF0dHJpYnV0ZSBsaXN0IGluIHRoZSBnaXZlbiBieXRlCisgICAgICogdmVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIGN3IHRoZSBjbGFzcyB3cml0ZXIgdG8gYmUgdXNlZCB0byBjb252ZXJ0IHRoZSBhdHRyaWJ1dGVzIGludG8gYnl0ZQorICAgICAqICAgICAgICBhcnJheXMsIHdpdGggdGhlIHtAbGluayAjd3JpdGUgd3JpdGV9IG1ldGhvZC4KKyAgICAgKiBAcGFyYW0gY29kZSB0aGUgYnl0ZWNvZGUgb2YgdGhlIG1ldGhvZCBjb3JyZXNwb25kaW5nIHRvIHRoZXNlIGNvZGUKKyAgICAgKiAgICAgICAgYXR0cmlidXRlcywgb3IgPHR0Pm51bGw8L3R0PiBpZiB0aGVzZSBhdHRyaWJ1dGVzIGFyZSBub3QgY29kZQorICAgICAqICAgICAgICBhdHRyaWJ1dGVzLgorICAgICAqIEBwYXJhbSBsZW4gdGhlIGxlbmd0aCBvZiB0aGUgYnl0ZWNvZGUgb2YgdGhlIG1ldGhvZCBjb3JyZXNwb25kaW5nIHRvCisgICAgICogICAgICAgIHRoZXNlIGNvZGUgYXR0cmlidXRlcywgb3IgPHR0Pm51bGw8L3R0PiBpZiB0aGVzZSBhdHRyaWJ1dGVzIGFyZQorICAgICAqICAgICAgICBub3QgY29kZSBhdHRyaWJ1dGVzLgorICAgICAqIEBwYXJhbSBtYXhTdGFjayB0aGUgbWF4aW11bSBzdGFjayBzaXplIG9mIHRoZSBtZXRob2QgY29ycmVzcG9uZGluZyB0bworICAgICAqICAgICAgICB0aGVzZSBjb2RlIGF0dHJpYnV0ZXMsIG9yIC0xIGlmIHRoZXNlIGF0dHJpYnV0ZXMgYXJlIG5vdCBjb2RlCisgICAgICogICAgICAgIGF0dHJpYnV0ZXMuCisgICAgICogQHBhcmFtIG1heExvY2FscyB0aGUgbWF4aW11bSBudW1iZXIgb2YgbG9jYWwgdmFyaWFibGVzIG9mIHRoZSBtZXRob2QKKyAgICAgKiAgICAgICAgY29ycmVzcG9uZGluZyB0byB0aGVzZSBjb2RlIGF0dHJpYnV0ZXMsIG9yIC0xIGlmIHRoZXNlIGF0dHJpYnV0ZXMKKyAgICAgKiAgICAgICAgYXJlIG5vdCBjb2RlIGF0dHJpYnV0ZXMuCisgICAgICogQHBhcmFtIG91dCB3aGVyZSB0aGUgYXR0cmlidXRlcyBtdXN0IGJlIHdyaXR0ZW4uCisgICAgICovCisgICAgZmluYWwgdm9pZCBwdXQoCisgICAgICAgIGZpbmFsIENsYXNzV3JpdGVyIGN3LAorICAgICAgICBmaW5hbCBieXRlW10gY29kZSwKKyAgICAgICAgZmluYWwgaW50IGxlbiwKKyAgICAgICAgZmluYWwgaW50IG1heFN0YWNrLAorICAgICAgICBmaW5hbCBpbnQgbWF4TG9jYWxzLAorICAgICAgICBmaW5hbCBCeXRlVmVjdG9yIG91dCkKKyAgICB7CisgICAgICAgIEF0dHJpYnV0ZSBhdHRyID0gdGhpczsKKyAgICAgICAgd2hpbGUgKGF0dHIgIT0gbnVsbCkgeworICAgICAgICAgICAgQnl0ZVZlY3RvciBiID0gYXR0ci53cml0ZShjdywgY29kZSwgbGVuLCBtYXhTdGFjaywgbWF4TG9jYWxzKTsKKyAgICAgICAgICAgIG91dC5wdXRTaG9ydChjdy5uZXdVVEY4KGF0dHIudHlwZSkpLnB1dEludChiLmxlbmd0aCk7CisgICAgICAgICAgICBvdXQucHV0Qnl0ZUFycmF5KGIuZGF0YSwgMCwgYi5sZW5ndGgpOworICAgICAgICAgICAgYXR0ciA9IGF0dHIubmV4dDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vQnl0ZVZlY3Rvci5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS9CeXRlVmVjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmEwMGY5ZAotLS0gL2Rldi9udWxsCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vQnl0ZVZlY3Rvci5qYXZhCkBAIC0wLDAgKzEsMzIyIEBACisvKgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBPcmFjbGUgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKKyAqIHF1ZXN0aW9ucy4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGlzIGF2YWlsYWJsZSB1bmRlciBhbmQgZ292ZXJuZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiBIb3dldmVyLCB0aGUgZm9sbG93aW5nIG5vdGljZSBhY2NvbXBhbmllZCB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGlzCisgKiBmaWxlOgorICoKKyAqIEFTTTogYSB2ZXJ5IHNtYWxsIGFuZCBmYXN0IEphdmEgYnl0ZWNvZGUgbWFuaXB1bGF0aW9uIGZyYW1ld29yaworICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMTEgSU5SSUEsIEZyYW5jZSBUZWxlY29tCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2UgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtOworCisvKioKKyAqIEEgZHluYW1pY2FsbHkgZXh0ZW5zaWJsZSB2ZWN0b3Igb2YgYnl0ZXMuIFRoaXMgY2xhc3MgaXMgcm91Z2hseSBlcXVpdmFsZW50IHRvCisgKiBhIERhdGFPdXRwdXRTdHJlYW0gb24gdG9wIG9mIGEgQnl0ZUFycmF5T3V0cHV0U3RyZWFtLCBidXQgaXMgbW9yZSBlZmZpY2llbnQuCisgKgorICogQGF1dGhvciBFcmljIEJydW5ldG9uCisgKi8KK3B1YmxpYyBjbGFzcyBCeXRlVmVjdG9yIHsKKworICAgIC8qKgorICAgICAqIFRoZSBjb250ZW50IG9mIHRoaXMgdmVjdG9yLgorICAgICAqLworICAgIGJ5dGVbXSBkYXRhOworCisgICAgLyoqCisgICAgICogQWN0dWFsIG51bWJlciBvZiBieXRlcyBpbiB0aGlzIHZlY3Rvci4KKyAgICAgKi8KKyAgICBpbnQgbGVuZ3RoOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGxpbmsgQnl0ZVZlY3RvciBCeXRlVmVjdG9yfSB3aXRoIGEgZGVmYXVsdCBpbml0aWFsCisgICAgICogc2l6ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQnl0ZVZlY3RvcigpIHsKKyAgICAgICAgZGF0YSA9IG5ldyBieXRlWzY0XTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAbGluayBCeXRlVmVjdG9yIEJ5dGVWZWN0b3J9IHdpdGggdGhlIGdpdmVuIGluaXRpYWwKKyAgICAgKiBzaXplLgorICAgICAqCisgICAgICogQHBhcmFtIGluaXRpYWxTaXplIHRoZSBpbml0aWFsIHNpemUgb2YgdGhlIGJ5dGUgdmVjdG9yIHRvIGJlIGNvbnN0cnVjdGVkLgorICAgICAqLworICAgIHB1YmxpYyBCeXRlVmVjdG9yKGZpbmFsIGludCBpbml0aWFsU2l6ZSkgeworICAgICAgICBkYXRhID0gbmV3IGJ5dGVbaW5pdGlhbFNpemVdOworICAgIH0KKworICAgIC8qKgorICAgICAqIFB1dHMgYSBieXRlIGludG8gdGhpcyBieXRlIHZlY3Rvci4gVGhlIGJ5dGUgdmVjdG9yIGlzIGF1dG9tYXRpY2FsbHkKKyAgICAgKiBlbmxhcmdlZCBpZiBuZWNlc3NhcnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYiBhIGJ5dGUuCisgICAgICogQHJldHVybiB0aGlzIGJ5dGUgdmVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBCeXRlVmVjdG9yIHB1dEJ5dGUoZmluYWwgaW50IGIpIHsKKyAgICAgICAgaW50IGxlbmd0aCA9IHRoaXMubGVuZ3RoOworICAgICAgICBpZiAobGVuZ3RoICsgMSA+IGRhdGEubGVuZ3RoKSB7CisgICAgICAgICAgICBlbmxhcmdlKDEpOworICAgICAgICB9CisgICAgICAgIGRhdGFbbGVuZ3RoKytdID0gKGJ5dGUpIGI7CisgICAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQdXRzIHR3byBieXRlcyBpbnRvIHRoaXMgYnl0ZSB2ZWN0b3IuIFRoZSBieXRlIHZlY3RvciBpcyBhdXRvbWF0aWNhbGx5CisgICAgICogZW5sYXJnZWQgaWYgbmVjZXNzYXJ5LgorICAgICAqCisgICAgICogQHBhcmFtIGIxIGEgYnl0ZS4KKyAgICAgKiBAcGFyYW0gYjIgYW5vdGhlciBieXRlLgorICAgICAqIEByZXR1cm4gdGhpcyBieXRlIHZlY3Rvci4KKyAgICAgKi8KKyAgICBCeXRlVmVjdG9yIHB1dDExKGZpbmFsIGludCBiMSwgZmluYWwgaW50IGIyKSB7CisgICAgICAgIGludCBsZW5ndGggPSB0aGlzLmxlbmd0aDsKKyAgICAgICAgaWYgKGxlbmd0aCArIDIgPiBkYXRhLmxlbmd0aCkgeworICAgICAgICAgICAgZW5sYXJnZSgyKTsKKyAgICAgICAgfQorICAgICAgICBieXRlW10gZGF0YSA9IHRoaXMuZGF0YTsKKyAgICAgICAgZGF0YVtsZW5ndGgrK10gPSAoYnl0ZSkgYjE7CisgICAgICAgIGRhdGFbbGVuZ3RoKytdID0gKGJ5dGUpIGIyOworICAgICAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHV0cyBhIHNob3J0IGludG8gdGhpcyBieXRlIHZlY3Rvci4gVGhlIGJ5dGUgdmVjdG9yIGlzIGF1dG9tYXRpY2FsbHkKKyAgICAgKiBlbmxhcmdlZCBpZiBuZWNlc3NhcnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcyBhIHNob3J0LgorICAgICAqIEByZXR1cm4gdGhpcyBieXRlIHZlY3Rvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgQnl0ZVZlY3RvciBwdXRTaG9ydChmaW5hbCBpbnQgcykgeworICAgICAgICBpbnQgbGVuZ3RoID0gdGhpcy5sZW5ndGg7CisgICAgICAgIGlmIChsZW5ndGggKyAyID4gZGF0YS5sZW5ndGgpIHsKKyAgICAgICAgICAgIGVubGFyZ2UoMik7CisgICAgICAgIH0KKyAgICAgICAgYnl0ZVtdIGRhdGEgPSB0aGlzLmRhdGE7CisgICAgICAgIGRhdGFbbGVuZ3RoKytdID0gKGJ5dGUpIChzID4+PiA4KTsKKyAgICAgICAgZGF0YVtsZW5ndGgrK10gPSAoYnl0ZSkgczsKKyAgICAgICAgdGhpcy5sZW5ndGggPSBsZW5ndGg7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFB1dHMgYSBieXRlIGFuZCBhIHNob3J0IGludG8gdGhpcyBieXRlIHZlY3Rvci4gVGhlIGJ5dGUgdmVjdG9yIGlzCisgICAgICogYXV0b21hdGljYWxseSBlbmxhcmdlZCBpZiBuZWNlc3NhcnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYiBhIGJ5dGUuCisgICAgICogQHBhcmFtIHMgYSBzaG9ydC4KKyAgICAgKiBAcmV0dXJuIHRoaXMgYnl0ZSB2ZWN0b3IuCisgICAgICovCisgICAgQnl0ZVZlY3RvciBwdXQxMihmaW5hbCBpbnQgYiwgZmluYWwgaW50IHMpIHsKKyAgICAgICAgaW50IGxlbmd0aCA9IHRoaXMubGVuZ3RoOworICAgICAgICBpZiAobGVuZ3RoICsgMyA+IGRhdGEubGVuZ3RoKSB7CisgICAgICAgICAgICBlbmxhcmdlKDMpOworICAgICAgICB9CisgICAgICAgIGJ5dGVbXSBkYXRhID0gdGhpcy5kYXRhOworICAgICAgICBkYXRhW2xlbmd0aCsrXSA9IChieXRlKSBiOworICAgICAgICBkYXRhW2xlbmd0aCsrXSA9IChieXRlKSAocyA+Pj4gOCk7CisgICAgICAgIGRhdGFbbGVuZ3RoKytdID0gKGJ5dGUpIHM7CisgICAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQdXRzIGFuIGludCBpbnRvIHRoaXMgYnl0ZSB2ZWN0b3IuIFRoZSBieXRlIHZlY3RvciBpcyBhdXRvbWF0aWNhbGx5CisgICAgICogZW5sYXJnZWQgaWYgbmVjZXNzYXJ5LgorICAgICAqCisgICAgICogQHBhcmFtIGkgYW4gaW50LgorICAgICAqIEByZXR1cm4gdGhpcyBieXRlIHZlY3Rvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgQnl0ZVZlY3RvciBwdXRJbnQoZmluYWwgaW50IGkpIHsKKyAgICAgICAgaW50IGxlbmd0aCA9IHRoaXMubGVuZ3RoOworICAgICAgICBpZiAobGVuZ3RoICsgNCA+IGRhdGEubGVuZ3RoKSB7CisgICAgICAgICAgICBlbmxhcmdlKDQpOworICAgICAgICB9CisgICAgICAgIGJ5dGVbXSBkYXRhID0gdGhpcy5kYXRhOworICAgICAgICBkYXRhW2xlbmd0aCsrXSA9IChieXRlKSAoaSA+Pj4gMjQpOworICAgICAgICBkYXRhW2xlbmd0aCsrXSA9IChieXRlKSAoaSA+Pj4gMTYpOworICAgICAgICBkYXRhW2xlbmd0aCsrXSA9IChieXRlKSAoaSA+Pj4gOCk7CisgICAgICAgIGRhdGFbbGVuZ3RoKytdID0gKGJ5dGUpIGk7CisgICAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQdXRzIGEgbG9uZyBpbnRvIHRoaXMgYnl0ZSB2ZWN0b3IuIFRoZSBieXRlIHZlY3RvciBpcyBhdXRvbWF0aWNhbGx5CisgICAgICogZW5sYXJnZWQgaWYgbmVjZXNzYXJ5LgorICAgICAqCisgICAgICogQHBhcmFtIGwgYSBsb25nLgorICAgICAqIEByZXR1cm4gdGhpcyBieXRlIHZlY3Rvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgQnl0ZVZlY3RvciBwdXRMb25nKGZpbmFsIGxvbmcgbCkgeworICAgICAgICBpbnQgbGVuZ3RoID0gdGhpcy5sZW5ndGg7CisgICAgICAgIGlmIChsZW5ndGggKyA4ID4gZGF0YS5sZW5ndGgpIHsKKyAgICAgICAgICAgIGVubGFyZ2UoOCk7CisgICAgICAgIH0KKyAgICAgICAgYnl0ZVtdIGRhdGEgPSB0aGlzLmRhdGE7CisgICAgICAgIGludCBpID0gKGludCkgKGwgPj4+IDMyKTsKKyAgICAgICAgZGF0YVtsZW5ndGgrK10gPSAoYnl0ZSkgKGkgPj4+IDI0KTsKKyAgICAgICAgZGF0YVtsZW5ndGgrK10gPSAoYnl0ZSkgKGkgPj4+IDE2KTsKKyAgICAgICAgZGF0YVtsZW5ndGgrK10gPSAoYnl0ZSkgKGkgPj4+IDgpOworICAgICAgICBkYXRhW2xlbmd0aCsrXSA9IChieXRlKSBpOworICAgICAgICBpID0gKGludCkgbDsKKyAgICAgICAgZGF0YVtsZW5ndGgrK10gPSAoYnl0ZSkgKGkgPj4+IDI0KTsKKyAgICAgICAgZGF0YVtsZW5ndGgrK10gPSAoYnl0ZSkgKGkgPj4+IDE2KTsKKyAgICAgICAgZGF0YVtsZW5ndGgrK10gPSAoYnl0ZSkgKGkgPj4+IDgpOworICAgICAgICBkYXRhW2xlbmd0aCsrXSA9IChieXRlKSBpOworICAgICAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHV0cyBhbiBVVEY4IHN0cmluZyBpbnRvIHRoaXMgYnl0ZSB2ZWN0b3IuIFRoZSBieXRlIHZlY3RvciBpcworICAgICAqIGF1dG9tYXRpY2FsbHkgZW5sYXJnZWQgaWYgbmVjZXNzYXJ5LgorICAgICAqCisgICAgICogQHBhcmFtIHMgYSBTdHJpbmcuCisgICAgICogQHJldHVybiB0aGlzIGJ5dGUgdmVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBCeXRlVmVjdG9yIHB1dFVURjgoZmluYWwgU3RyaW5nIHMpIHsKKyAgICAgICAgaW50IGNoYXJMZW5ndGggPSBzLmxlbmd0aCgpOworICAgICAgICBpbnQgbGVuID0gbGVuZ3RoOworICAgICAgICBpZiAobGVuICsgMiArIGNoYXJMZW5ndGggPiBkYXRhLmxlbmd0aCkgeworICAgICAgICAgICAgZW5sYXJnZSgyICsgY2hhckxlbmd0aCk7CisgICAgICAgIH0KKyAgICAgICAgYnl0ZVtdIGRhdGEgPSB0aGlzLmRhdGE7CisgICAgICAgIC8vIG9wdGltaXN0aWMgYWxnb3JpdGhtOiBpbnN0ZWFkIG9mIGNvbXB1dGluZyB0aGUgYnl0ZSBsZW5ndGggYW5kIHRoZW4KKyAgICAgICAgLy8gc2VyaWFsaXppbmcgdGhlIHN0cmluZyAod2hpY2ggcmVxdWlyZXMgdHdvIGxvb3BzKSwgd2UgYXNzdW1lIHRoZSBieXRlCisgICAgICAgIC8vIGxlbmd0aCBpcyBlcXVhbCB0byBjaGFyIGxlbmd0aCAod2hpY2ggaXMgdGhlIG1vc3QgZnJlcXVlbnQgY2FzZSksIGFuZAorICAgICAgICAvLyB3ZSBzdGFydCBzZXJpYWxpemluZyB0aGUgc3RyaW5nIHJpZ2h0IGF3YXkuIER1cmluZyB0aGUgc2VyaWFsaXphdGlvbiwKKyAgICAgICAgLy8gaWYgd2UgZmluZCB0aGF0IHRoaXMgYXNzdW1wdGlvbiBpcyB3cm9uZywgd2UgY29udGludWUgd2l0aCB0aGUKKyAgICAgICAgLy8gZ2VuZXJhbCBtZXRob2QuCisgICAgICAgIGRhdGFbbGVuKytdID0gKGJ5dGUpIChjaGFyTGVuZ3RoID4+PiA4KTsKKyAgICAgICAgZGF0YVtsZW4rK10gPSAoYnl0ZSkgY2hhckxlbmd0aDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFyTGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIGNoYXIgYyA9IHMuY2hhckF0KGkpOworICAgICAgICAgICAgaWYgKGMgPj0gJ1wwMDEnICYmIGMgPD0gJ1wxNzcnKSB7CisgICAgICAgICAgICAgICAgZGF0YVtsZW4rK10gPSAoYnl0ZSkgYzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW50IGJ5dGVMZW5ndGggPSBpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSBpOyBqIDwgY2hhckxlbmd0aDsgKytqKSB7CisgICAgICAgICAgICAgICAgICAgIGMgPSBzLmNoYXJBdChqKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGMgPj0gJ1wwMDEnICYmIGMgPD0gJ1wxNzcnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBieXRlTGVuZ3RoKys7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA+ICdcdTA3RkYnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBieXRlTGVuZ3RoICs9IDM7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBieXRlTGVuZ3RoICs9IDI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGF0YVtsZW5ndGhdID0gKGJ5dGUpIChieXRlTGVuZ3RoID4+PiA4KTsKKyAgICAgICAgICAgICAgICBkYXRhW2xlbmd0aCArIDFdID0gKGJ5dGUpIGJ5dGVMZW5ndGg7CisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCArIDIgKyBieXRlTGVuZ3RoID4gZGF0YS5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gbGVuOworICAgICAgICAgICAgICAgICAgICBlbmxhcmdlKDIgKyBieXRlTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHRoaXMuZGF0YTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IGk7IGogPCBjaGFyTGVuZ3RoOyArK2opIHsKKyAgICAgICAgICAgICAgICAgICAgYyA9IHMuY2hhckF0KGopOworICAgICAgICAgICAgICAgICAgICBpZiAoYyA+PSAnXDAwMScgJiYgYyA8PSAnXDE3NycpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbbGVuKytdID0gKGJ5dGUpIGM7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA+ICdcdTA3RkYnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhW2xlbisrXSA9IChieXRlKSAoMHhFMCB8IGMgPj4gMTIgJiAweEYpOworICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVtsZW4rK10gPSAoYnl0ZSkgKDB4ODAgfCBjID4+IDYgJiAweDNGKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbbGVuKytdID0gKGJ5dGUpICgweDgwIHwgYyAmIDB4M0YpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVtsZW4rK10gPSAoYnl0ZSkgKDB4QzAgfCBjID4+IDYgJiAweDFGKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbbGVuKytdID0gKGJ5dGUpICgweDgwIHwgYyAmIDB4M0YpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGxlbmd0aCA9IGxlbjsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHV0cyBhbiBhcnJheSBvZiBieXRlcyBpbnRvIHRoaXMgYnl0ZSB2ZWN0b3IuIFRoZSBieXRlIHZlY3RvciBpcworICAgICAqIGF1dG9tYXRpY2FsbHkgZW5sYXJnZWQgaWYgbmVjZXNzYXJ5LgorICAgICAqCisgICAgICogQHBhcmFtIGIgYW4gYXJyYXkgb2YgYnl0ZXMuIE1heSBiZSA8dHQ+bnVsbDwvdHQ+IHRvIHB1dCA8dHQ+bGVuPC90dD4KKyAgICAgKiAgICAgICAgbnVsbCBieXRlcyBpbnRvIHRoaXMgYnl0ZSB2ZWN0b3IuCisgICAgICogQHBhcmFtIG9mZiBpbmRleCBvZiB0aGUgZmlzdCBieXRlIG9mIGIgdGhhdCBtdXN0IGJlIGNvcGllZC4KKyAgICAgKiBAcGFyYW0gbGVuIG51bWJlciBvZiBieXRlcyBvZiBiIHRoYXQgbXVzdCBiZSBjb3BpZWQuCisgICAgICogQHJldHVybiB0aGlzIGJ5dGUgdmVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBCeXRlVmVjdG9yIHB1dEJ5dGVBcnJheShmaW5hbCBieXRlW10gYiwgZmluYWwgaW50IG9mZiwgZmluYWwgaW50IGxlbikKKyAgICB7CisgICAgICAgIGlmIChsZW5ndGggKyBsZW4gPiBkYXRhLmxlbmd0aCkgeworICAgICAgICAgICAgZW5sYXJnZShsZW4pOworICAgICAgICB9CisgICAgICAgIGlmIChiICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYiwgb2ZmLCBkYXRhLCBsZW5ndGgsIGxlbik7CisgICAgICAgIH0KKyAgICAgICAgbGVuZ3RoICs9IGxlbjsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5sYXJnZSB0aGlzIGJ5dGUgdmVjdG9yIHNvIHRoYXQgaXQgY2FuIHJlY2VpdmUgbiBtb3JlIGJ5dGVzLgorICAgICAqCisgICAgICogQHBhcmFtIHNpemUgbnVtYmVyIG9mIGFkZGl0aW9uYWwgYnl0ZXMgdGhhdCB0aGlzIGJ5dGUgdmVjdG9yIHNob3VsZCBiZQorICAgICAqICAgICAgICBhYmxlIHRvIHJlY2VpdmUuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGVubGFyZ2UoZmluYWwgaW50IHNpemUpIHsKKyAgICAgICAgaW50IGxlbmd0aDEgPSAyICogZGF0YS5sZW5ndGg7CisgICAgICAgIGludCBsZW5ndGgyID0gbGVuZ3RoICsgc2l6ZTsKKyAgICAgICAgYnl0ZVtdIG5ld0RhdGEgPSBuZXcgYnl0ZVtsZW5ndGgxID4gbGVuZ3RoMiA/IGxlbmd0aDEgOiBsZW5ndGgyXTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShkYXRhLCAwLCBuZXdEYXRhLCAwLCBsZW5ndGgpOworICAgICAgICBkYXRhID0gbmV3RGF0YTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL0NsYXNzUmVhZGVyLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL0NsYXNzUmVhZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTlkOGExMAotLS0gL2Rldi9udWxsCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vQ2xhc3NSZWFkZXIuamF2YQpAQCAtMCwwICsxLDIyNDUgQEAKKy8qCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IE9yYWNsZSBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQorICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQorICogcXVlc3Rpb25zLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgaXMgYXZhaWxhYmxlIHVuZGVyIGFuZCBnb3Zlcm5lZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIEhvd2V2ZXIsIHRoZSBmb2xsb3dpbmcgbm90aWNlIGFjY29tcGFuaWVkIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoaXMKKyAqIGZpbGU6CisgKgorICogQVNNOiBhIHZlcnkgc21hbGwgYW5kIGZhc3QgSmF2YSBieXRlY29kZSBtYW5pcHVsYXRpb24gZnJhbWV3b3JrCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAxMSBJTlJJQSwgRnJhbmNlIFRlbGVjb20KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc207CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CisKKy8qKgorICogQSBKYXZhIGNsYXNzIHBhcnNlciB0byBtYWtlIGEge0BsaW5rIENsYXNzVmlzaXRvcn0gdmlzaXQgYW4gZXhpc3RpbmcgY2xhc3MuCisgKiBUaGlzIGNsYXNzIHBhcnNlcyBhIGJ5dGUgYXJyYXkgY29uZm9ybWluZyB0byB0aGUgSmF2YSBjbGFzcyBmaWxlIGZvcm1hdCBhbmQKKyAqIGNhbGxzIHRoZSBhcHByb3ByaWF0ZSB2aXNpdCBtZXRob2RzIG9mIGEgZ2l2ZW4gY2xhc3MgdmlzaXRvciBmb3IgZWFjaCBmaWVsZCwKKyAqIG1ldGhvZCBhbmQgYnl0ZWNvZGUgaW5zdHJ1Y3Rpb24gZW5jb3VudGVyZWQuCisgKgorICogQGF1dGhvciBFcmljIEJydW5ldG9uCisgKiBAYXV0aG9yIEV1Z2VuZSBLdWxlc2hvdgorICovCitwdWJsaWMgY2xhc3MgQ2xhc3NSZWFkZXIgeworCisgICAgLyoqCisgICAgICogVHJ1ZSB0byBlbmFibGUgc2lnbmF0dXJlcyBzdXBwb3J0LgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIFNJR05BVFVSRVMgPSB0cnVlOworCisgICAgLyoqCisgICAgICogVHJ1ZSB0byBlbmFibGUgYW5ub3RhdGlvbnMgc3VwcG9ydC4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBBTk5PVEFUSU9OUyA9IHRydWU7CisKKyAgICAvKioKKyAgICAgKiBUcnVlIHRvIGVuYWJsZSBzdGFjayBtYXAgZnJhbWVzIHN1cHBvcnQuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gRlJBTUVTID0gdHJ1ZTsKKworICAgIC8qKgorICAgICAqIFRydWUgdG8gZW5hYmxlIGJ5dGVjb2RlIHdyaXRpbmcgc3VwcG9ydC4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBXUklURVIgPSB0cnVlOworCisgICAgLyoqCisgICAgICogVHJ1ZSB0byBlbmFibGUgSlNSX1cgYW5kIEdPVE9fVyBzdXBwb3J0LgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIFJFU0laRSA9IHRydWU7CisKKyAgICAvKioKKyAgICAgKiBGbGFnIHRvIHNraXAgbWV0aG9kIGNvZGUuIElmIHRoaXMgY2xhc3MgaXMgc2V0IDxjb2RlPkNPREU8L2NvZGU+CisgICAgICogYXR0cmlidXRlIHdvbid0IGJlIHZpc2l0ZWQuIFRoaXMgY2FuIGJlIHVzZWQsIGZvciBleGFtcGxlLCB0byByZXRyaWV2ZQorICAgICAqIGFubm90YXRpb25zIGZvciBtZXRob2RzIGFuZCBtZXRob2QgcGFyYW1ldGVycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTS0lQX0NPREUgPSAxOworCisgICAgLyoqCisgICAgICogRmxhZyB0byBza2lwIHRoZSBkZWJ1ZyBpbmZvcm1hdGlvbiBpbiB0aGUgY2xhc3MuIElmIHRoaXMgZmxhZyBpcyBzZXQgdGhlCisgICAgICogZGVidWcgaW5mb3JtYXRpb24gb2YgdGhlIGNsYXNzIGlzIG5vdCB2aXNpdGVkLCBpLmUuIHRoZQorICAgICAqIHtAbGluayBNZXRob2RWaXNpdG9yI3Zpc2l0TG9jYWxWYXJpYWJsZSB2aXNpdExvY2FsVmFyaWFibGV9IGFuZAorICAgICAqIHtAbGluayBNZXRob2RWaXNpdG9yI3Zpc2l0TGluZU51bWJlciB2aXNpdExpbmVOdW1iZXJ9IG1ldGhvZHMgd2lsbCBub3QgYmUKKyAgICAgKiBjYWxsZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0tJUF9ERUJVRyA9IDI7CisKKyAgICAvKioKKyAgICAgKiBGbGFnIHRvIHNraXAgdGhlIHN0YWNrIG1hcCBmcmFtZXMgaW4gdGhlIGNsYXNzLiBJZiB0aGlzIGZsYWcgaXMgc2V0IHRoZQorICAgICAqIHN0YWNrIG1hcCBmcmFtZXMgb2YgdGhlIGNsYXNzIGlzIG5vdCB2aXNpdGVkLCBpLmUuIHRoZQorICAgICAqIHtAbGluayBNZXRob2RWaXNpdG9yI3Zpc2l0RnJhbWUgdmlzaXRGcmFtZX0gbWV0aG9kIHdpbGwgbm90IGJlIGNhbGxlZC4KKyAgICAgKiBUaGlzIGZsYWcgaXMgdXNlZnVsIHdoZW4gdGhlIHtAbGluayBDbGFzc1dyaXRlciNDT01QVVRFX0ZSQU1FU30gb3B0aW9uIGlzCisgICAgICogdXNlZDogaXQgYXZvaWRzIHZpc2l0aW5nIGZyYW1lcyB0aGF0IHdpbGwgYmUgaWdub3JlZCBhbmQgcmVjb21wdXRlZCBmcm9tCisgICAgICogc2NyYXRjaCBpbiB0aGUgY2xhc3Mgd3JpdGVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNLSVBfRlJBTUVTID0gNDsKKworICAgIC8qKgorICAgICAqIEZsYWcgdG8gZXhwYW5kIHRoZSBzdGFjayBtYXAgZnJhbWVzLiBCeSBkZWZhdWx0IHN0YWNrIG1hcCBmcmFtZXMgYXJlCisgICAgICogdmlzaXRlZCBpbiB0aGVpciBvcmlnaW5hbCBmb3JtYXQgKGkuZS4gImV4cGFuZGVkIiBmb3IgY2xhc3NlcyB3aG9zZQorICAgICAqIHZlcnNpb24gaXMgbGVzcyB0aGFuIFYxXzYsIGFuZCAiY29tcHJlc3NlZCIgZm9yIHRoZSBvdGhlciBjbGFzc2VzKS4gSWYKKyAgICAgKiB0aGlzIGZsYWcgaXMgc2V0LCBzdGFjayBtYXAgZnJhbWVzIGFyZSBhbHdheXMgdmlzaXRlZCBpbiBleHBhbmRlZCBmb3JtYXQKKyAgICAgKiAodGhpcyBvcHRpb24gYWRkcyBhIGRlY29tcHJlc3Npb24vcmVjb21wcmVzc2lvbiBzdGVwIGluIENsYXNzUmVhZGVyIGFuZAorICAgICAqIENsYXNzV3JpdGVyIHdoaWNoIGRlZ3JhZGVzIHBlcmZvcm1hbmNlcyBxdWl0ZSBhIGxvdCkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhQQU5EX0ZSQU1FUyA9IDg7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY2xhc3MgdG8gYmUgcGFyc2VkLiA8aT5UaGUgY29udGVudCBvZiB0aGlzIGFycmF5IG11c3Qgbm90IGJlCisgICAgICogbW9kaWZpZWQuIFRoaXMgZmllbGQgaXMgaW50ZW5kZWQgZm9yIHtAbGluayBBdHRyaWJ1dGV9IHN1YiBjbGFzc2VzLCBhbmQKKyAgICAgKiBpcyBub3JtYWxseSBub3QgbmVlZGVkIGJ5IGNsYXNzIGdlbmVyYXRvcnMgb3IgYWRhcHRlcnMuPC9pPgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBieXRlW10gYjsKKworICAgIC8qKgorICAgICAqIFRoZSBzdGFydCBpbmRleCBvZiBlYWNoIGNvbnN0YW50IHBvb2wgaXRlbSBpbiB7QGxpbmsgI2IgYn0sIHBsdXMgb25lLgorICAgICAqIFRoZSBvbmUgYnl0ZSBvZmZzZXQgc2tpcHMgdGhlIGNvbnN0YW50IHBvb2wgaXRlbSB0YWcgdGhhdCBpbmRpY2F0ZXMgaXRzCisgICAgICogdHlwZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIGludFtdIGl0ZW1zOworCisgICAgLyoqCisgICAgICogVGhlIFN0cmluZyBvYmplY3RzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIENPTlNUQU5UX1V0ZjggaXRlbXMuIFRoaXMgY2FjaGUKKyAgICAgKiBhdm9pZHMgbXVsdGlwbGUgcGFyc2luZyBvZiBhIGdpdmVuIENPTlNUQU5UX1V0ZjggY29uc3RhbnQgcG9vbCBpdGVtLAorICAgICAqIHdoaWNoIEdSRUFUTFkgaW1wcm92ZXMgcGVyZm9ybWFuY2VzIChieSBhIGZhY3RvciAyIHRvIDMpLiBUaGlzIGNhY2hpbmcKKyAgICAgKiBzdHJhdGVneSBjb3VsZCBiZSBleHRlbmRlZCB0byBhbGwgY29uc3RhbnQgcG9vbCBpdGVtcywgYnV0IGl0cyBiZW5lZml0CisgICAgICogd291bGQgbm90IGJlIHNvIGdyZWF0IGZvciB0aGVzZSBpdGVtcyAoYmVjYXVzZSB0aGV5IGFyZSBtdWNoIGxlc3MKKyAgICAgKiBleHBlbnNpdmUgdG8gcGFyc2UgdGhhbiBDT05TVEFOVF9VdGY4IGl0ZW1zKS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZ1tdIHN0cmluZ3M7CisKKyAgICAvKioKKyAgICAgKiBNYXhpbXVtIGxlbmd0aCBvZiB0aGUgc3RyaW5ncyBjb250YWluZWQgaW4gdGhlIGNvbnN0YW50IHBvb2wgb2YgdGhlCisgICAgICogY2xhc3MuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbWF4U3RyaW5nTGVuZ3RoOworCisgICAgLyoqCisgICAgICogU3RhcnQgaW5kZXggb2YgdGhlIGNsYXNzIGhlYWRlciBpbmZvcm1hdGlvbiAoYWNjZXNzLCBuYW1lLi4uKSBpbgorICAgICAqIHtAbGluayAjYiBifS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IGhlYWRlcjsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIENvbnN0cnVjdG9ycworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGxpbmsgQ2xhc3NSZWFkZXJ9IG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiIHRoZSBieXRlY29kZSBvZiB0aGUgY2xhc3MgdG8gYmUgcmVhZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3NSZWFkZXIoZmluYWwgYnl0ZVtdIGIpIHsKKyAgICAgICAgdGhpcyhiLCAwLCBiLmxlbmd0aCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGxpbmsgQ2xhc3NSZWFkZXJ9IG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiIHRoZSBieXRlY29kZSBvZiB0aGUgY2xhc3MgdG8gYmUgcmVhZC4KKyAgICAgKiBAcGFyYW0gb2ZmIHRoZSBzdGFydCBvZmZzZXQgb2YgdGhlIGNsYXNzIGRhdGEuCisgICAgICogQHBhcmFtIGxlbiB0aGUgbGVuZ3RoIG9mIHRoZSBjbGFzcyBkYXRhLgorICAgICAqLworICAgIHB1YmxpYyBDbGFzc1JlYWRlcihmaW5hbCBieXRlW10gYiwgZmluYWwgaW50IG9mZiwgZmluYWwgaW50IGxlbikgeworICAgICAgICB0aGlzLmIgPSBiOworICAgICAgICAvLyBjaGVja3MgdGhlIGNsYXNzIHZlcnNpb24KKyAgICAgICAgaWYgKHJlYWRTaG9ydCg2KSA+IE9wY29kZXMuVjFfNykgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIC8vIHBhcnNlcyB0aGUgY29uc3RhbnQgcG9vbAorICAgICAgICBpdGVtcyA9IG5ldyBpbnRbcmVhZFVuc2lnbmVkU2hvcnQob2ZmICsgOCldOworICAgICAgICBpbnQgbiA9IGl0ZW1zLmxlbmd0aDsKKyAgICAgICAgc3RyaW5ncyA9IG5ldyBTdHJpbmdbbl07CisgICAgICAgIGludCBtYXggPSAwOworICAgICAgICBpbnQgaW5kZXggPSBvZmYgKyAxMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBuOyArK2kpIHsKKyAgICAgICAgICAgIGl0ZW1zW2ldID0gaW5kZXggKyAxOworICAgICAgICAgICAgaW50IHNpemU7CisgICAgICAgICAgICBzd2l0Y2ggKGJbaW5kZXhdKSB7CisgICAgICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5GSUVMRDoKKyAgICAgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLk1FVEg6CisgICAgICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5JTUVUSDoKKyAgICAgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLklOVDoKKyAgICAgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLkZMT0FUOgorICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuTkFNRV9UWVBFOgorICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuSU5EWToKKyAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuTE9ORzoKKyAgICAgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLkRPVUJMRToKKyAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDk7CisgICAgICAgICAgICAgICAgICAgICsraTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5VVEY4OgorICAgICAgICAgICAgICAgICAgICBzaXplID0gMyArIHJlYWRVbnNpZ25lZFNob3J0KGluZGV4ICsgMSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzaXplID4gbWF4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXggPSBzaXplOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuSEFORExFOgorICAgICAgICAgICAgICAgICAgICBzaXplID0gNDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgLy8gY2FzZSBDbGFzc1dyaXRlci5DTEFTUzoKKyAgICAgICAgICAgICAgICAvLyBjYXNlIENsYXNzV3JpdGVyLlNUUjoKKyAgICAgICAgICAgICAgICAvLyBjYXNlIENsYXNzV3JpdGVyLk1UWVBFCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDM7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5kZXggKz0gc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBtYXhTdHJpbmdMZW5ndGggPSBtYXg7CisgICAgICAgIC8vIHRoZSBjbGFzcyBoZWFkZXIgaW5mb3JtYXRpb24gc3RhcnRzIGp1c3QgYWZ0ZXIgdGhlIGNvbnN0YW50IHBvb2wKKyAgICAgICAgaGVhZGVyID0gaW5kZXg7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY2xhc3MncyBhY2Nlc3MgZmxhZ3MgKHNlZSB7QGxpbmsgT3Bjb2Rlc30pLiBUaGlzIHZhbHVlIG1heQorICAgICAqIG5vdCByZWZsZWN0IERlcHJlY2F0ZWQgYW5kIFN5bnRoZXRpYyBmbGFncyB3aGVuIGJ5dGVjb2RlIGlzIGJlZm9yZSAxLjUKKyAgICAgKiBhbmQgdGhvc2UgZmxhZ3MgYXJlIHJlcHJlc2VudGVkIGJ5IGF0dHJpYnV0ZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBjbGFzcyBhY2Nlc3MgZmxhZ3MKKyAgICAgKgorICAgICAqIEBzZWUgQ2xhc3NWaXNpdG9yI3Zpc2l0KGludCwgaW50LCBTdHJpbmcsIFN0cmluZywgU3RyaW5nLCBTdHJpbmdbXSkKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEFjY2VzcygpIHsKKyAgICAgICAgcmV0dXJuIHJlYWRVbnNpZ25lZFNob3J0KGhlYWRlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgaW50ZXJuYWwgbmFtZSBvZiB0aGUgY2xhc3MgKHNlZQorICAgICAqIHtAbGluayBUeXBlI2dldEludGVybmFsTmFtZSgpIGdldEludGVybmFsTmFtZX0pLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgaW50ZXJuYWwgY2xhc3MgbmFtZQorICAgICAqCisgICAgICogQHNlZSBDbGFzc1Zpc2l0b3IjdmlzaXQoaW50LCBpbnQsIFN0cmluZywgU3RyaW5nLCBTdHJpbmcsIFN0cmluZ1tdKQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgeworICAgICAgICByZXR1cm4gcmVhZENsYXNzKGhlYWRlciArIDIsIG5ldyBjaGFyW21heFN0cmluZ0xlbmd0aF0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGludGVybmFsIG9mIG5hbWUgb2YgdGhlIHN1cGVyIGNsYXNzIChzZWUKKyAgICAgKiB7QGxpbmsgVHlwZSNnZXRJbnRlcm5hbE5hbWUoKSBnZXRJbnRlcm5hbE5hbWV9KS4gRm9yIGludGVyZmFjZXMsIHRoZQorICAgICAqIHN1cGVyIGNsYXNzIGlzIHtAbGluayBPYmplY3R9LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgaW50ZXJuYWwgbmFtZSBvZiBzdXBlciBjbGFzcywgb3IgPHR0Pm51bGw8L3R0PiBmb3IKKyAgICAgKiAgICAgICAgIHtAbGluayBPYmplY3R9IGNsYXNzLgorICAgICAqCisgICAgICogQHNlZSBDbGFzc1Zpc2l0b3IjdmlzaXQoaW50LCBpbnQsIFN0cmluZywgU3RyaW5nLCBTdHJpbmcsIFN0cmluZ1tdKQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3VwZXJOYW1lKCkgeworICAgICAgICBpbnQgbiA9IGl0ZW1zW3JlYWRVbnNpZ25lZFNob3J0KGhlYWRlciArIDQpXTsKKyAgICAgICAgcmV0dXJuIG4gPT0gMCA/IG51bGwgOiByZWFkVVRGOChuLCBuZXcgY2hhclttYXhTdHJpbmdMZW5ndGhdKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBpbnRlcm5hbCBuYW1lcyBvZiB0aGUgY2xhc3MncyBpbnRlcmZhY2VzIChzZWUKKyAgICAgKiB7QGxpbmsgVHlwZSNnZXRJbnRlcm5hbE5hbWUoKSBnZXRJbnRlcm5hbE5hbWV9KS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGFycmF5IG9mIGludGVybmFsIG5hbWVzIGZvciBhbGwgaW1wbGVtZW50ZWQgaW50ZXJmYWNlcyBvcgorICAgICAqICAgICAgICAgPHR0Pm51bGw8L3R0Pi4KKyAgICAgKgorICAgICAqIEBzZWUgQ2xhc3NWaXNpdG9yI3Zpc2l0KGludCwgaW50LCBTdHJpbmcsIFN0cmluZywgU3RyaW5nLCBTdHJpbmdbXSkKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0SW50ZXJmYWNlcygpIHsKKyAgICAgICAgaW50IGluZGV4ID0gaGVhZGVyICsgNjsKKyAgICAgICAgaW50IG4gPSByZWFkVW5zaWduZWRTaG9ydChpbmRleCk7CisgICAgICAgIFN0cmluZ1tdIGludGVyZmFjZXMgPSBuZXcgU3RyaW5nW25dOworICAgICAgICBpZiAobiA+IDApIHsKKyAgICAgICAgICAgIGNoYXJbXSBidWYgPSBuZXcgY2hhclttYXhTdHJpbmdMZW5ndGhdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kpIHsKKyAgICAgICAgICAgICAgICBpbmRleCArPSAyOworICAgICAgICAgICAgICAgIGludGVyZmFjZXNbaV0gPSByZWFkQ2xhc3MoaW5kZXgsIGJ1Zik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGludGVyZmFjZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29waWVzIHRoZSBjb25zdGFudCBwb29sIGRhdGEgaW50byB0aGUgZ2l2ZW4ge0BsaW5rIENsYXNzV3JpdGVyfS4gU2hvdWxkCisgICAgICogYmUgY2FsbGVkIGJlZm9yZSB0aGUge0BsaW5rICNhY2NlcHQoQ2xhc3NWaXNpdG9yLGludCl9IG1ldGhvZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGFzc1dyaXRlciB0aGUge0BsaW5rIENsYXNzV3JpdGVyfSB0byBjb3B5IGNvbnN0YW50IHBvb2wgaW50by4KKyAgICAgKi8KKyAgICB2b2lkIGNvcHlQb29sKGZpbmFsIENsYXNzV3JpdGVyIGNsYXNzV3JpdGVyKSB7CisgICAgICAgIGNoYXJbXSBidWYgPSBuZXcgY2hhclttYXhTdHJpbmdMZW5ndGhdOworICAgICAgICBpbnQgbGwgPSBpdGVtcy5sZW5ndGg7CisgICAgICAgIEl0ZW1bXSBpdGVtczIgPSBuZXcgSXRlbVtsbF07CisgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbGw7IGkrKykgeworICAgICAgICAgICAgaW50IGluZGV4ID0gaXRlbXNbaV07CisgICAgICAgICAgICBpbnQgdGFnID0gYltpbmRleCAtIDFdOworICAgICAgICAgICAgSXRlbSBpdGVtID0gbmV3IEl0ZW0oaSk7CisgICAgICAgICAgICBpbnQgbmFtZVR5cGU7CisgICAgICAgICAgICBzd2l0Y2ggKHRhZykgeworICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuRklFTEQ6CisgICAgICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5NRVRIOgorICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuSU1FVEg6CisgICAgICAgICAgICAgICAgICAgIG5hbWVUeXBlID0gaXRlbXNbcmVhZFVuc2lnbmVkU2hvcnQoaW5kZXggKyAyKV07CisgICAgICAgICAgICAgICAgICAgIGl0ZW0uc2V0KHRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkQ2xhc3MoaW5kZXgsIGJ1ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZFVURjgobmFtZVR5cGUsIGJ1ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZFVURjgobmFtZVR5cGUgKyAyLCBidWYpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLklOVDoKKyAgICAgICAgICAgICAgICAgICAgaXRlbS5zZXQocmVhZEludChpbmRleCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuRkxPQVQ6CisgICAgICAgICAgICAgICAgICAgIGl0ZW0uc2V0KEZsb2F0LmludEJpdHNUb0Zsb2F0KHJlYWRJbnQoaW5kZXgpKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5OQU1FX1RZUEU6CisgICAgICAgICAgICAgICAgICAgIGl0ZW0uc2V0KHRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkVVRGOChpbmRleCwgYnVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkVVRGOChpbmRleCArIDIsIGJ1ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5MT05HOgorICAgICAgICAgICAgICAgICAgICBpdGVtLnNldChyZWFkTG9uZyhpbmRleCkpOworICAgICAgICAgICAgICAgICAgICArK2k7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5ET1VCTEU6CisgICAgICAgICAgICAgICAgICAgIGl0ZW0uc2V0KERvdWJsZS5sb25nQml0c1RvRG91YmxlKHJlYWRMb25nKGluZGV4KSkpOworICAgICAgICAgICAgICAgICAgICArK2k7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5VVEY4OiB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzID0gc3RyaW5nc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBpdGVtc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBzdHJpbmdzW2ldID0gcmVhZFVURihpbmRleCArIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRVbnNpZ25lZFNob3J0KGluZGV4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpdGVtLnNldCh0YWcsIHMsIG51bGwsIG51bGwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLkhBTkRMRTogeworICAgICAgICAgICAgICAgICAgICBpbnQgZmllbGRPck1ldGhvZFJlZiA9IGl0ZW1zW3JlYWRVbnNpZ25lZFNob3J0KGluZGV4ICsgMSldOworICAgICAgICAgICAgICAgICAgICBuYW1lVHlwZSA9IGl0ZW1zW3JlYWRVbnNpZ25lZFNob3J0KGZpZWxkT3JNZXRob2RSZWYgKyAyKV07CisgICAgICAgICAgICAgICAgICAgIGl0ZW0uc2V0KENsYXNzV3JpdGVyLkhBTkRMRV9CQVNFICsgcmVhZEJ5dGUoaW5kZXgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRDbGFzcyhmaWVsZE9yTWV0aG9kUmVmLCBidWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRVVEY4KG5hbWVUeXBlLCBidWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRVVEY4KG5hbWVUeXBlICsgMiwgYnVmKSk7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisKKyAgICAgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLklORFk6CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGFzc1dyaXRlci5ib290c3RyYXBNZXRob2RzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvcHlCb290c3RyYXBNZXRob2RzKGNsYXNzV3JpdGVyLCBpdGVtczIsIGJ1Zik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbmFtZVR5cGUgPSBpdGVtc1tyZWFkVW5zaWduZWRTaG9ydChpbmRleCArIDIpXTsKKyAgICAgICAgICAgICAgICAgICAgaXRlbS5zZXQocmVhZFVURjgobmFtZVR5cGUsIGJ1ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZFVURjgobmFtZVR5cGUgKyAyLCBidWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRVbnNpZ25lZFNob3J0KGluZGV4KSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisKKyAgICAgICAgICAgICAgICAvLyBjYXNlIENsYXNzV3JpdGVyLlNUUjoKKyAgICAgICAgICAgICAgICAvLyBjYXNlIENsYXNzV3JpdGVyLkNMQVNTOgorICAgICAgICAgICAgICAgIC8vIGNhc2UgQ2xhc3NXcml0ZXIuTVRZUEUKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBpdGVtLnNldCh0YWcsIHJlYWRVVEY4KGluZGV4LCBidWYpLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCBpbmRleDIgPSBpdGVtLmhhc2hDb2RlICUgaXRlbXMyLmxlbmd0aDsKKyAgICAgICAgICAgIGl0ZW0ubmV4dCA9IGl0ZW1zMltpbmRleDJdOworICAgICAgICAgICAgaXRlbXMyW2luZGV4Ml0gPSBpdGVtOworICAgICAgICB9CisKKyAgICAgICAgaW50IG9mZiA9IGl0ZW1zWzFdIC0gMTsKKyAgICAgICAgY2xhc3NXcml0ZXIucG9vbC5wdXRCeXRlQXJyYXkoYiwgb2ZmLCBoZWFkZXIgLSBvZmYpOworICAgICAgICBjbGFzc1dyaXRlci5pdGVtcyA9IGl0ZW1zMjsKKyAgICAgICAgY2xhc3NXcml0ZXIudGhyZXNob2xkID0gKGludCkgKDAuNzVkICogbGwpOworICAgICAgICBjbGFzc1dyaXRlci5pbmRleCA9IGxsOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjb3B5Qm9vdHN0cmFwTWV0aG9kcyhDbGFzc1dyaXRlciBjbGFzc1dyaXRlciwgSXRlbVtdIGl0ZW1zMiwgY2hhcltdIGJ1ZikgeworICAgICAgICBpbnQgaSwgaiwgaywgdSwgdjsKKworICAgICAgICAvLyBza2lwIGNsYXNzIGhlYWRlcgorICAgICAgICB2ID0gaGVhZGVyOworICAgICAgICB2ICs9IDggKyAocmVhZFVuc2lnbmVkU2hvcnQodiArIDYpIDw8IDEpOworCisgICAgICAgIC8vIHNraXBzIGZpZWxkcyBhbmQgbWV0aG9kcworICAgICAgICBpID0gcmVhZFVuc2lnbmVkU2hvcnQodik7CisgICAgICAgIHYgKz0gMjsKKyAgICAgICAgZm9yICg7IGkgPiAwOyAtLWkpIHsKKyAgICAgICAgICAgIGogPSByZWFkVW5zaWduZWRTaG9ydCh2ICsgNik7CisgICAgICAgICAgICB2ICs9IDg7CisgICAgICAgICAgICBmb3IgKDsgaiA+IDA7IC0taikgeworICAgICAgICAgICAgICAgIHYgKz0gNiArIHJlYWRJbnQodiArIDIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGkgPSByZWFkVW5zaWduZWRTaG9ydCh2KTsKKyAgICAgICAgdiArPSAyOworICAgICAgICBmb3IgKDsgaSA+IDA7IC0taSkgeworICAgICAgICAgICAgaiA9IHJlYWRVbnNpZ25lZFNob3J0KHYgKyA2KTsKKyAgICAgICAgICAgIHYgKz0gODsKKyAgICAgICAgICAgIGZvciAoOyBqID4gMDsgLS1qKSB7CisgICAgICAgICAgICAgICAgdiArPSA2ICsgcmVhZEludCh2ICsgMik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyByZWFkIGNsYXNzIGF0dHJpYnV0ZXMKKyAgICAgICAgaSA9IHJlYWRVbnNpZ25lZFNob3J0KHYpOworICAgICAgICB2ICs9IDI7CisgICAgICAgIGZvciAoOyBpID4gMDsgLS1pKSB7CisgICAgICAgICAgICBTdHJpbmcgYXR0ck5hbWUgPSByZWFkVVRGOCh2LCBidWYpOworICAgICAgICAgICAgaW50IHNpemUgPSByZWFkSW50KHYgKyAyKTsKKyAgICAgICAgICAgIGlmICgiQm9vdHN0cmFwTWV0aG9kcyIuZXF1YWxzKGF0dHJOYW1lKSkgeworICAgICAgICAgICAgICAgIGludCBib29zdHJhcE1ldGhvZENvdW50ID0gcmVhZFVuc2lnbmVkU2hvcnQodiArIDYpOworICAgICAgICAgICAgICAgIGludCB4ID0gdiArIDg7CisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGJvb3N0cmFwTWV0aG9kQ291bnQ7IGorKykgeworICAgICAgICAgICAgICAgICAgICBpbnQgaGFzaENvZGUgPSByZWFkQ29uc3QocmVhZFVuc2lnbmVkU2hvcnQoeCksIGJ1ZikuaGFzaENvZGUoKTsKKyAgICAgICAgICAgICAgICAgICAgayA9IHJlYWRVbnNpZ25lZFNob3J0KHggKyAyKTsKKyAgICAgICAgICAgICAgICAgICAgdSA9IHggKyA0OworICAgICAgICAgICAgICAgICAgICBmb3IoOyBrID4gMDsgLS1rKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBoYXNoQ29kZSBePSByZWFkQ29uc3QocmVhZFVuc2lnbmVkU2hvcnQodSksIGJ1ZikuaGFzaENvZGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHUgKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBJdGVtIGl0ZW0gPSBuZXcgSXRlbShqKTsKKyAgICAgICAgICAgICAgICAgICAgaXRlbS5zZXQoeCAtIHYgLSA4LCBoYXNoQ29kZSAmIDB4N0ZGRkZGRkYpOworCisgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDIgPSBpdGVtLmhhc2hDb2RlICUgaXRlbXMyLmxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgaXRlbS5uZXh0ID0gaXRlbXMyW2luZGV4Ml07CisgICAgICAgICAgICAgICAgICAgIGl0ZW1zMltpbmRleDJdID0gaXRlbTsKKworICAgICAgICAgICAgICAgICAgICB4ID0gdTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjbGFzc1dyaXRlci5ib290c3RyYXBNZXRob2RzQ291bnQgPSBib29zdHJhcE1ldGhvZENvdW50OworICAgICAgICAgICAgICAgIEJ5dGVWZWN0b3IgYm9vdHN0cmFwTWV0aG9kcyA9IG5ldyBCeXRlVmVjdG9yKHNpemUgKyA2Mik7CisgICAgICAgICAgICAgICAgYm9vdHN0cmFwTWV0aG9kcy5wdXRCeXRlQXJyYXkoYiwgdiArIDgsIHNpemUgLSAyKTsKKyAgICAgICAgICAgICAgICBjbGFzc1dyaXRlci5ib290c3RyYXBNZXRob2RzID0gYm9vdHN0cmFwTWV0aG9kczsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2ICs9IDYgKyBzaXplOworICAgICAgICB9CisKKyAgICAgICAgLy8gd2UgYXJlIGluIHRyb3VibGUgISEhCisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGxpbmsgQ2xhc3NSZWFkZXJ9IG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpcyBhbiBpbnB1dCBzdHJlYW0gZnJvbSB3aGljaCB0byByZWFkIHRoZSBjbGFzcy4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGEgcHJvYmxlbSBvY2N1cnMgZHVyaW5nIHJlYWRpbmcuCisgICAgICovCisgICAgcHVibGljIENsYXNzUmVhZGVyKGZpbmFsIElucHV0U3RyZWFtIGlzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0aGlzKHJlYWRDbGFzcyhpcywgZmFsc2UpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAbGluayBDbGFzc1JlYWRlcn0gb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgdGhlIGJpbmFyeSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgY2xhc3MgdG8gYmUgcmVhZC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgZHVyaW5nIHJlYWRpbmcuCisgICAgICovCisgICAgcHVibGljIENsYXNzUmVhZGVyKGZpbmFsIFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0aGlzKHJlYWRDbGFzcyhDbGFzc0xvYWRlci5nZXRTeXN0ZW1SZXNvdXJjZUFzU3RyZWFtKG5hbWUucmVwbGFjZSgnLicsICcvJykKKyAgICAgICAgICAgICAgICArICIuY2xhc3MiKSwgdHJ1ZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWRzIHRoZSBieXRlY29kZSBvZiBhIGNsYXNzLgorICAgICAqCisgICAgICogQHBhcmFtIGlzIGFuIGlucHV0IHN0cmVhbSBmcm9tIHdoaWNoIHRvIHJlYWQgdGhlIGNsYXNzLgorICAgICAqIEBwYXJhbSBjbG9zZSB0cnVlIHRvIGNsb3NlIHRoZSBpbnB1dCBzdHJlYW0gYWZ0ZXIgcmVhZGluZy4KKyAgICAgKiBAcmV0dXJuIHRoZSBieXRlY29kZSByZWFkIGZyb20gdGhlIGdpdmVuIGlucHV0IHN0cmVhbS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGEgcHJvYmxlbSBvY2N1cnMgZHVyaW5nIHJlYWRpbmcuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIHJlYWRDbGFzcyhmaW5hbCBJbnB1dFN0cmVhbSBpcywgYm9vbGVhbiBjbG9zZSkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaWYgKGlzID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiQ2xhc3Mgbm90IGZvdW5kIik7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJ5dGVbXSBiID0gbmV3IGJ5dGVbaXMuYXZhaWxhYmxlKCldOworICAgICAgICAgICAgaW50IGxlbiA9IDA7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgIGludCBuID0gaXMucmVhZChiLCBsZW4sIGIubGVuZ3RoIC0gbGVuKTsKKyAgICAgICAgICAgICAgICBpZiAobiA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICBpZiAobGVuIDwgYi5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBjID0gbmV3IGJ5dGVbbGVuXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYiwgMCwgYywgMCwgbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBjOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsZW4gKz0gbjsKKyAgICAgICAgICAgICAgICBpZiAobGVuID09IGIubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBsYXN0ID0gaXMucmVhZCgpOworICAgICAgICAgICAgICAgICAgICBpZiAobGFzdCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBjID0gbmV3IGJ5dGVbYi5sZW5ndGggKyAxMDAwXTsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShiLCAwLCBjLCAwLCBsZW4pOworICAgICAgICAgICAgICAgICAgICBjW2xlbisrXSA9IChieXRlKSBsYXN0OworICAgICAgICAgICAgICAgICAgICBiID0gYzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoY2xvc2UpIHsKKyAgICAgICAgICAgICAgICBpcy5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gUHVibGljIG1ldGhvZHMKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8qKgorICAgICAqIE1ha2VzIHRoZSBnaXZlbiB2aXNpdG9yIHZpc2l0IHRoZSBKYXZhIGNsYXNzIG9mIHRoaXMge0BsaW5rIENsYXNzUmVhZGVyfS4KKyAgICAgKiBUaGlzIGNsYXNzIGlzIHRoZSBvbmUgc3BlY2lmaWVkIGluIHRoZSBjb25zdHJ1Y3RvciAoc2VlCisgICAgICoge0BsaW5rICNDbGFzc1JlYWRlcihieXRlW10pIENsYXNzUmVhZGVyfSkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xhc3NWaXNpdG9yIHRoZSB2aXNpdG9yIHRoYXQgbXVzdCB2aXNpdCB0aGlzIGNsYXNzLgorICAgICAqIEBwYXJhbSBmbGFncyBvcHRpb24gZmxhZ3MgdGhhdCBjYW4gYmUgdXNlZCB0byBtb2RpZnkgdGhlIGRlZmF1bHQgYmVoYXZpb3IKKyAgICAgKiAgICAgICAgb2YgdGhpcyBjbGFzcy4gU2VlIHtAbGluayAjU0tJUF9ERUJVR30sIHtAbGluayAjRVhQQU5EX0ZSQU1FU30sCisgICAgICogICAgICAgIHtAbGluayAjU0tJUF9GUkFNRVN9LCB7QGxpbmsgI1NLSVBfQ09ERX0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWNjZXB0KGZpbmFsIENsYXNzVmlzaXRvciBjbGFzc1Zpc2l0b3IsIGZpbmFsIGludCBmbGFncykgeworICAgICAgICBhY2NlcHQoY2xhc3NWaXNpdG9yLCBuZXcgQXR0cmlidXRlWzBdLCBmbGFncyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFrZXMgdGhlIGdpdmVuIHZpc2l0b3IgdmlzaXQgdGhlIEphdmEgY2xhc3Mgb2YgdGhpcyB7QGxpbmsgQ2xhc3NSZWFkZXJ9LgorICAgICAqIFRoaXMgY2xhc3MgaXMgdGhlIG9uZSBzcGVjaWZpZWQgaW4gdGhlIGNvbnN0cnVjdG9yIChzZWUKKyAgICAgKiB7QGxpbmsgI0NsYXNzUmVhZGVyKGJ5dGVbXSkgQ2xhc3NSZWFkZXJ9KS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGFzc1Zpc2l0b3IgdGhlIHZpc2l0b3IgdGhhdCBtdXN0IHZpc2l0IHRoaXMgY2xhc3MuCisgICAgICogQHBhcmFtIGF0dHJzIHByb3RvdHlwZXMgb2YgdGhlIGF0dHJpYnV0ZXMgdGhhdCBtdXN0IGJlIHBhcnNlZCBkdXJpbmcgdGhlCisgICAgICogICAgICAgIHZpc2l0IG9mIHRoZSBjbGFzcy4gQW55IGF0dHJpYnV0ZSB3aG9zZSB0eXBlIGlzIG5vdCBlcXVhbCB0byB0aGUKKyAgICAgKiAgICAgICAgdHlwZSBvZiBvbmUgdGhlIHByb3RvdHlwZXMgd2lsbCBub3QgYmUgcGFyc2VkOiBpdHMgYnl0ZSBhcnJheQorICAgICAqICAgICAgICB2YWx1ZSB3aWxsIGJlIHBhc3NlZCB1bmNoYW5nZWQgdG8gdGhlIENsYXNzV3JpdGVyLiA8aT5UaGlzIG1heQorICAgICAqICAgICAgICBjb3JydXB0IGl0IGlmIHRoaXMgdmFsdWUgY29udGFpbnMgcmVmZXJlbmNlcyB0byB0aGUgY29uc3RhbnQgcG9vbCwKKyAgICAgKiAgICAgICAgb3IgaGFzIHN5bnRhY3RpYyBvciBzZW1hbnRpYyBsaW5rcyB3aXRoIGEgY2xhc3MgZWxlbWVudCB0aGF0IGhhcworICAgICAqICAgICAgICBiZWVuIHRyYW5zZm9ybWVkIGJ5IGEgY2xhc3MgYWRhcHRlciBiZXR3ZWVuIHRoZSByZWFkZXIgYW5kIHRoZQorICAgICAqICAgICAgICB3cml0ZXI8L2k+LgorICAgICAqIEBwYXJhbSBmbGFncyBvcHRpb24gZmxhZ3MgdGhhdCBjYW4gYmUgdXNlZCB0byBtb2RpZnkgdGhlIGRlZmF1bHQgYmVoYXZpb3IKKyAgICAgKiAgICAgICAgb2YgdGhpcyBjbGFzcy4gU2VlIHtAbGluayAjU0tJUF9ERUJVR30sIHtAbGluayAjRVhQQU5EX0ZSQU1FU30sCisgICAgICogICAgICAgIHtAbGluayAjU0tJUF9GUkFNRVN9LCB7QGxpbmsgI1NLSVBfQ09ERX0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWNjZXB0KAorICAgICAgICBmaW5hbCBDbGFzc1Zpc2l0b3IgY2xhc3NWaXNpdG9yLAorICAgICAgICBmaW5hbCBBdHRyaWJ1dGVbXSBhdHRycywKKyAgICAgICAgZmluYWwgaW50IGZsYWdzKQorICAgIHsKKyAgICAgICAgYnl0ZVtdIGIgPSB0aGlzLmI7IC8vIHRoZSBieXRlY29kZSBhcnJheQorICAgICAgICBjaGFyW10gYyA9IG5ldyBjaGFyW21heFN0cmluZ0xlbmd0aF07IC8vIGJ1ZmZlciB1c2VkIHRvIHJlYWQgc3RyaW5ncworICAgICAgICBpbnQgaSwgaiwgazsgLy8gbG9vcCB2YXJpYWJsZXMKKyAgICAgICAgaW50IHUsIHYsIHc7IC8vIGluZGV4ZXMgaW4gYgorICAgICAgICBBdHRyaWJ1dGUgYXR0cjsKKworICAgICAgICBpbnQgYWNjZXNzOworICAgICAgICBTdHJpbmcgbmFtZTsKKyAgICAgICAgU3RyaW5nIGRlc2M7CisgICAgICAgIFN0cmluZyBhdHRyTmFtZTsKKyAgICAgICAgU3RyaW5nIHNpZ25hdHVyZTsKKyAgICAgICAgaW50IGFubnMgPSAwOworICAgICAgICBpbnQgaWFubnMgPSAwOworICAgICAgICBBdHRyaWJ1dGUgY2F0dHJzID0gbnVsbDsKKworICAgICAgICAvLyB2aXNpdHMgdGhlIGhlYWRlcgorICAgICAgICB1ID0gaGVhZGVyOworICAgICAgICBhY2Nlc3MgPSByZWFkVW5zaWduZWRTaG9ydCh1KTsKKyAgICAgICAgbmFtZSA9IHJlYWRDbGFzcyh1ICsgMiwgYyk7CisgICAgICAgIHYgPSBpdGVtc1tyZWFkVW5zaWduZWRTaG9ydCh1ICsgNCldOworICAgICAgICBTdHJpbmcgc3VwZXJDbGFzc05hbWUgPSB2ID09IDAgPyBudWxsIDogcmVhZFVURjgodiwgYyk7CisgICAgICAgIFN0cmluZ1tdIGltcGxlbWVudGVkSXRmcyA9IG5ldyBTdHJpbmdbcmVhZFVuc2lnbmVkU2hvcnQodSArIDYpXTsKKyAgICAgICAgdyA9IDA7CisgICAgICAgIHUgKz0gODsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGltcGxlbWVudGVkSXRmcy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgaW1wbGVtZW50ZWRJdGZzW2ldID0gcmVhZENsYXNzKHUsIGMpOworICAgICAgICAgICAgdSArPSAyOworICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiBza2lwQ29kZSA9IChmbGFncyAmIFNLSVBfQ09ERSkgIT0gMDsKKyAgICAgICAgYm9vbGVhbiBza2lwRGVidWcgPSAoZmxhZ3MgJiBTS0lQX0RFQlVHKSAhPSAwOworICAgICAgICBib29sZWFuIHVuemlwID0gKGZsYWdzICYgRVhQQU5EX0ZSQU1FUykgIT0gMDsKKworICAgICAgICAvLyBza2lwcyBmaWVsZHMgYW5kIG1ldGhvZHMKKyAgICAgICAgdiA9IHU7CisgICAgICAgIGkgPSByZWFkVW5zaWduZWRTaG9ydCh2KTsKKyAgICAgICAgdiArPSAyOworICAgICAgICBmb3IgKDsgaSA+IDA7IC0taSkgeworICAgICAgICAgICAgaiA9IHJlYWRVbnNpZ25lZFNob3J0KHYgKyA2KTsKKyAgICAgICAgICAgIHYgKz0gODsKKyAgICAgICAgICAgIGZvciAoOyBqID4gMDsgLS1qKSB7CisgICAgICAgICAgICAgICAgdiArPSA2ICsgcmVhZEludCh2ICsgMik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaSA9IHJlYWRVbnNpZ25lZFNob3J0KHYpOworICAgICAgICB2ICs9IDI7CisgICAgICAgIGZvciAoOyBpID4gMDsgLS1pKSB7CisgICAgICAgICAgICBqID0gcmVhZFVuc2lnbmVkU2hvcnQodiArIDYpOworICAgICAgICAgICAgdiArPSA4OworICAgICAgICAgICAgZm9yICg7IGogPiAwOyAtLWopIHsKKyAgICAgICAgICAgICAgICB2ICs9IDYgKyByZWFkSW50KHYgKyAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyByZWFkcyB0aGUgY2xhc3MncyBhdHRyaWJ1dGVzCisgICAgICAgIHNpZ25hdHVyZSA9IG51bGw7CisgICAgICAgIFN0cmluZyBzb3VyY2VGaWxlID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIHNvdXJjZURlYnVnID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIGVuY2xvc2luZ093bmVyID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIGVuY2xvc2luZ05hbWUgPSBudWxsOworICAgICAgICBTdHJpbmcgZW5jbG9zaW5nRGVzYyA9IG51bGw7CisgICAgICAgIGludFtdIGJvb3RzdHJhcE1ldGhvZHMgPSBudWxsOyAgLy8gc3RhcnQgaW5kZXhlZCBvZiB0aGUgYnNtcworCisgICAgICAgIGkgPSByZWFkVW5zaWduZWRTaG9ydCh2KTsKKyAgICAgICAgdiArPSAyOworICAgICAgICBmb3IgKDsgaSA+IDA7IC0taSkgeworICAgICAgICAgICAgYXR0ck5hbWUgPSByZWFkVVRGOCh2LCBjKTsKKyAgICAgICAgICAgIC8vIHRlc3RzIGFyZSBzb3J0ZWQgaW4gZGVjcmVhc2luZyBmcmVxdWVuY3kgb3JkZXIKKyAgICAgICAgICAgIC8vIChiYXNlZCBvbiBmcmVxdWVuY2llcyBvYnNlcnZlZCBvbiB0eXBpY2FsIGNsYXNzZXMpCisgICAgICAgICAgICBpZiAoIlNvdXJjZUZpbGUiLmVxdWFscyhhdHRyTmFtZSkpIHsKKyAgICAgICAgICAgICAgICBzb3VyY2VGaWxlID0gcmVhZFVURjgodiArIDYsIGMpOworICAgICAgICAgICAgfSBlbHNlIGlmICgiSW5uZXJDbGFzc2VzIi5lcXVhbHMoYXR0ck5hbWUpKSB7CisgICAgICAgICAgICAgICAgdyA9IHYgKyA2OworICAgICAgICAgICAgfSBlbHNlIGlmICgiRW5jbG9zaW5nTWV0aG9kIi5lcXVhbHMoYXR0ck5hbWUpKSB7CisgICAgICAgICAgICAgICAgZW5jbG9zaW5nT3duZXIgPSByZWFkQ2xhc3ModiArIDYsIGMpOworICAgICAgICAgICAgICAgIGludCBpdGVtID0gcmVhZFVuc2lnbmVkU2hvcnQodiArIDgpOworICAgICAgICAgICAgICAgIGlmIChpdGVtICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZW5jbG9zaW5nTmFtZSA9IHJlYWRVVEY4KGl0ZW1zW2l0ZW1dLCBjKTsKKyAgICAgICAgICAgICAgICAgICAgZW5jbG9zaW5nRGVzYyA9IHJlYWRVVEY4KGl0ZW1zW2l0ZW1dICsgMiwgYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChTSUdOQVRVUkVTICYmICJTaWduYXR1cmUiLmVxdWFscyhhdHRyTmFtZSkpIHsKKyAgICAgICAgICAgICAgICBzaWduYXR1cmUgPSByZWFkVVRGOCh2ICsgNiwgYyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKEFOTk9UQVRJT05TICYmICJSdW50aW1lVmlzaWJsZUFubm90YXRpb25zIi5lcXVhbHMoYXR0ck5hbWUpKSB7CisgICAgICAgICAgICAgICAgYW5ucyA9IHYgKyA2OworICAgICAgICAgICAgfSBlbHNlIGlmICgiRGVwcmVjYXRlZCIuZXF1YWxzKGF0dHJOYW1lKSkgeworICAgICAgICAgICAgICAgIGFjY2VzcyB8PSBPcGNvZGVzLkFDQ19ERVBSRUNBVEVEOworICAgICAgICAgICAgfSBlbHNlIGlmICgiU3ludGhldGljIi5lcXVhbHMoYXR0ck5hbWUpKSB7CisgICAgICAgICAgICAgICAgYWNjZXNzIHw9IE9wY29kZXMuQUNDX1NZTlRIRVRJQyB8IENsYXNzV3JpdGVyLkFDQ19TWU5USEVUSUNfQVRUUklCVVRFOworICAgICAgICAgICAgfSBlbHNlIGlmICgiU291cmNlRGVidWdFeHRlbnNpb24iLmVxdWFscyhhdHRyTmFtZSkpIHsKKyAgICAgICAgICAgICAgICBpbnQgbGVuID0gcmVhZEludCh2ICsgMik7CisgICAgICAgICAgICAgICAgc291cmNlRGVidWcgPSByZWFkVVRGKHYgKyA2LCBsZW4sIG5ldyBjaGFyW2xlbl0pOworICAgICAgICAgICAgfSBlbHNlIGlmIChBTk5PVEFUSU9OUyAmJiAiUnVudGltZUludmlzaWJsZUFubm90YXRpb25zIi5lcXVhbHMoYXR0ck5hbWUpKSB7CisgICAgICAgICAgICAgICAgaWFubnMgPSB2ICsgNjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIkJvb3RzdHJhcE1ldGhvZHMiLmVxdWFscyhhdHRyTmFtZSkpIHsKKyAgICAgICAgICAgICAgICBpbnQgYm9vc3RyYXBNZXRob2RDb3VudCA9IHJlYWRVbnNpZ25lZFNob3J0KHYgKyA2KTsKKyAgICAgICAgICAgICAgICBib290c3RyYXBNZXRob2RzID0gbmV3IGludFtib29zdHJhcE1ldGhvZENvdW50XTsKKyAgICAgICAgICAgICAgICBpbnQgeCA9IHYgKyA4OworICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBib29zdHJhcE1ldGhvZENvdW50OyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgYm9vdHN0cmFwTWV0aG9kc1tqXSA9IHg7CisgICAgICAgICAgICAgICAgICAgIHggKz0gMiArIHJlYWRVbnNpZ25lZFNob3J0KHggKyAyKSA8PCAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXR0ciA9IHJlYWRBdHRyaWJ1dGUoYXR0cnMsCisgICAgICAgICAgICAgICAgICAgICAgICBhdHRyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHYgKyA2LAorICAgICAgICAgICAgICAgICAgICAgICAgcmVhZEludCh2ICsgMiksCisgICAgICAgICAgICAgICAgICAgICAgICBjLAorICAgICAgICAgICAgICAgICAgICAgICAgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKKyAgICAgICAgICAgICAgICBpZiAoYXR0ciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGF0dHIubmV4dCA9IGNhdHRyczsKKyAgICAgICAgICAgICAgICAgICAgY2F0dHJzID0gYXR0cjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2ICs9IDYgKyByZWFkSW50KHYgKyAyKTsKKyAgICAgICAgfQorICAgICAgICAvLyBjYWxscyB0aGUgdmlzaXQgbWV0aG9kCisgICAgICAgIGNsYXNzVmlzaXRvci52aXNpdChyZWFkSW50KDQpLAorICAgICAgICAgICAgICAgIGFjY2VzcywKKyAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgIHNpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICBzdXBlckNsYXNzTmFtZSwKKyAgICAgICAgICAgICAgICBpbXBsZW1lbnRlZEl0ZnMpOworCisgICAgICAgIC8vIGNhbGxzIHRoZSB2aXNpdFNvdXJjZSBtZXRob2QKKyAgICAgICAgaWYgKCFza2lwRGVidWcgJiYgKHNvdXJjZUZpbGUgIT0gbnVsbCB8fCBzb3VyY2VEZWJ1ZyAhPSBudWxsKSkgeworICAgICAgICAgICAgY2xhc3NWaXNpdG9yLnZpc2l0U291cmNlKHNvdXJjZUZpbGUsIHNvdXJjZURlYnVnKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNhbGxzIHRoZSB2aXNpdE91dGVyQ2xhc3MgbWV0aG9kCisgICAgICAgIGlmIChlbmNsb3NpbmdPd25lciAhPSBudWxsKSB7CisgICAgICAgICAgICBjbGFzc1Zpc2l0b3IudmlzaXRPdXRlckNsYXNzKGVuY2xvc2luZ093bmVyLAorICAgICAgICAgICAgICAgICAgICBlbmNsb3NpbmdOYW1lLAorICAgICAgICAgICAgICAgICAgICBlbmNsb3NpbmdEZXNjKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHZpc2l0cyB0aGUgY2xhc3MgYW5ub3RhdGlvbnMKKyAgICAgICAgaWYgKEFOTk9UQVRJT05TKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAxOyBpID49IDA7IC0taSkgeworICAgICAgICAgICAgICAgIHYgPSBpID09IDAgPyBpYW5ucyA6IGFubnM7CisgICAgICAgICAgICAgICAgaWYgKHYgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBqID0gcmVhZFVuc2lnbmVkU2hvcnQodik7CisgICAgICAgICAgICAgICAgICAgIHYgKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgZm9yICg7IGogPiAwOyAtLWopIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHYgPSByZWFkQW5ub3RhdGlvblZhbHVlcyh2ICsgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NWaXNpdG9yLnZpc2l0QW5ub3RhdGlvbihyZWFkVVRGOCh2LCBjKSwgaSAhPSAwKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyB2aXNpdHMgdGhlIGNsYXNzIGF0dHJpYnV0ZXMKKyAgICAgICAgd2hpbGUgKGNhdHRycyAhPSBudWxsKSB7CisgICAgICAgICAgICBhdHRyID0gY2F0dHJzLm5leHQ7CisgICAgICAgICAgICBjYXR0cnMubmV4dCA9IG51bGw7CisgICAgICAgICAgICBjbGFzc1Zpc2l0b3IudmlzaXRBdHRyaWJ1dGUoY2F0dHJzKTsKKyAgICAgICAgICAgIGNhdHRycyA9IGF0dHI7CisgICAgICAgIH0KKworICAgICAgICAvLyBjYWxscyB0aGUgdmlzaXRJbm5lckNsYXNzIG1ldGhvZAorICAgICAgICBpZiAodyAhPSAwKSB7CisgICAgICAgICAgICBpID0gcmVhZFVuc2lnbmVkU2hvcnQodyk7CisgICAgICAgICAgICB3ICs9IDI7CisgICAgICAgICAgICBmb3IgKDsgaSA+IDA7IC0taSkgeworICAgICAgICAgICAgICAgIGNsYXNzVmlzaXRvci52aXNpdElubmVyQ2xhc3MocmVhZFVuc2lnbmVkU2hvcnQodykgPT0gMAorICAgICAgICAgICAgICAgICAgICAgICAgPyBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICA6IHJlYWRDbGFzcyh3LCBjKSwgcmVhZFVuc2lnbmVkU2hvcnQodyArIDIpID09IDAKKyAgICAgICAgICAgICAgICAgICAgICAgID8gbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgOiByZWFkQ2xhc3ModyArIDIsIGMpLCByZWFkVW5zaWduZWRTaG9ydCh3ICsgNCkgPT0gMAorICAgICAgICAgICAgICAgICAgICAgICAgPyBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICA6IHJlYWRVVEY4KHcgKyA0LCBjKSwgcmVhZFVuc2lnbmVkU2hvcnQodyArIDYpKTsKKyAgICAgICAgICAgICAgICB3ICs9IDg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyB2aXNpdHMgdGhlIGZpZWxkcworICAgICAgICBpID0gcmVhZFVuc2lnbmVkU2hvcnQodSk7CisgICAgICAgIHUgKz0gMjsKKyAgICAgICAgZm9yICg7IGkgPiAwOyAtLWkpIHsKKyAgICAgICAgICAgIGFjY2VzcyA9IHJlYWRVbnNpZ25lZFNob3J0KHUpOworICAgICAgICAgICAgbmFtZSA9IHJlYWRVVEY4KHUgKyAyLCBjKTsKKyAgICAgICAgICAgIGRlc2MgPSByZWFkVVRGOCh1ICsgNCwgYyk7CisgICAgICAgICAgICAvLyB2aXNpdHMgdGhlIGZpZWxkJ3MgYXR0cmlidXRlcyBhbmQgbG9va3MgZm9yIGEgQ29uc3RhbnRWYWx1ZQorICAgICAgICAgICAgLy8gYXR0cmlidXRlCisgICAgICAgICAgICBpbnQgZmllbGRWYWx1ZUl0ZW0gPSAwOworICAgICAgICAgICAgc2lnbmF0dXJlID0gbnVsbDsKKyAgICAgICAgICAgIGFubnMgPSAwOworICAgICAgICAgICAgaWFubnMgPSAwOworICAgICAgICAgICAgY2F0dHJzID0gbnVsbDsKKworICAgICAgICAgICAgaiA9IHJlYWRVbnNpZ25lZFNob3J0KHUgKyA2KTsKKyAgICAgICAgICAgIHUgKz0gODsKKyAgICAgICAgICAgIGZvciAoOyBqID4gMDsgLS1qKSB7CisgICAgICAgICAgICAgICAgYXR0ck5hbWUgPSByZWFkVVRGOCh1LCBjKTsKKyAgICAgICAgICAgICAgICAvLyB0ZXN0cyBhcmUgc29ydGVkIGluIGRlY3JlYXNpbmcgZnJlcXVlbmN5IG9yZGVyCisgICAgICAgICAgICAgICAgLy8gKGJhc2VkIG9uIGZyZXF1ZW5jaWVzIG9ic2VydmVkIG9uIHR5cGljYWwgY2xhc3NlcykKKyAgICAgICAgICAgICAgICBpZiAoIkNvbnN0YW50VmFsdWUiLmVxdWFscyhhdHRyTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZmllbGRWYWx1ZUl0ZW0gPSByZWFkVW5zaWduZWRTaG9ydCh1ICsgNik7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChTSUdOQVRVUkVTICYmICJTaWduYXR1cmUiLmVxdWFscyhhdHRyTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlID0gcmVhZFVURjgodSArIDYsIGMpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIkRlcHJlY2F0ZWQiLmVxdWFscyhhdHRyTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgYWNjZXNzIHw9IE9wY29kZXMuQUNDX0RFUFJFQ0FURUQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgiU3ludGhldGljIi5lcXVhbHMoYXR0ck5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIGFjY2VzcyB8PSBPcGNvZGVzLkFDQ19TWU5USEVUSUMgIHwgQ2xhc3NXcml0ZXIuQUNDX1NZTlRIRVRJQ19BVFRSSUJVVEU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChBTk5PVEFUSU9OUyAmJiAiUnVudGltZVZpc2libGVBbm5vdGF0aW9ucyIuZXF1YWxzKGF0dHJOYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBhbm5zID0gdSArIDY7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChBTk5PVEFUSU9OUyAmJiAiUnVudGltZUludmlzaWJsZUFubm90YXRpb25zIi5lcXVhbHMoYXR0ck5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIGlhbm5zID0gdSArIDY7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYXR0ciA9IHJlYWRBdHRyaWJ1dGUoYXR0cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdSArIDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZEludCh1ICsgMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci5uZXh0ID0gY2F0dHJzOworICAgICAgICAgICAgICAgICAgICAgICAgY2F0dHJzID0gYXR0cjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB1ICs9IDYgKyByZWFkSW50KHUgKyAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIHZpc2l0cyB0aGUgZmllbGQKKyAgICAgICAgICAgIEZpZWxkVmlzaXRvciBmdiA9IGNsYXNzVmlzaXRvci52aXNpdEZpZWxkKGFjY2VzcywKKyAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgZGVzYywKKyAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlLAorICAgICAgICAgICAgICAgICAgICBmaWVsZFZhbHVlSXRlbSA9PSAwID8gbnVsbCA6IHJlYWRDb25zdChmaWVsZFZhbHVlSXRlbSwgYykpOworICAgICAgICAgICAgLy8gdmlzaXRzIHRoZSBmaWVsZCBhbm5vdGF0aW9ucyBhbmQgYXR0cmlidXRlcworICAgICAgICAgICAgaWYgKGZ2ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoQU5OT1RBVElPTlMpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMTsgaiA+PSAwOyAtLWopIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBqID09IDAgPyBpYW5ucyA6IGFubnM7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodiAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgayA9IHJlYWRVbnNpZ25lZFNob3J0KHYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDsgayA+IDA7IC0taykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gcmVhZEFubm90YXRpb25WYWx1ZXModiArIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ2LnZpc2l0QW5ub3RhdGlvbihyZWFkVVRGOCh2LCBjKSwgaiAhPSAwKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdoaWxlIChjYXR0cnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBhdHRyID0gY2F0dHJzLm5leHQ7CisgICAgICAgICAgICAgICAgICAgIGNhdHRycy5uZXh0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgZnYudmlzaXRBdHRyaWJ1dGUoY2F0dHJzKTsKKyAgICAgICAgICAgICAgICAgICAgY2F0dHJzID0gYXR0cjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZnYudmlzaXRFbmQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHZpc2l0cyB0aGUgbWV0aG9kcworICAgICAgICBpID0gcmVhZFVuc2lnbmVkU2hvcnQodSk7CisgICAgICAgIHUgKz0gMjsKKyAgICAgICAgZm9yICg7IGkgPiAwOyAtLWkpIHsKKyAgICAgICAgICAgIGludCB1MCA9IHUgKyA2OworICAgICAgICAgICAgYWNjZXNzID0gcmVhZFVuc2lnbmVkU2hvcnQodSk7CisgICAgICAgICAgICBuYW1lID0gcmVhZFVURjgodSArIDIsIGMpOworICAgICAgICAgICAgZGVzYyA9IHJlYWRVVEY4KHUgKyA0LCBjKTsKKyAgICAgICAgICAgIHNpZ25hdHVyZSA9IG51bGw7CisgICAgICAgICAgICBhbm5zID0gMDsKKyAgICAgICAgICAgIGlhbm5zID0gMDsKKyAgICAgICAgICAgIGludCBkYW5uID0gMDsKKyAgICAgICAgICAgIGludCBtcGFubnMgPSAwOworICAgICAgICAgICAgaW50IGltcGFubnMgPSAwOworICAgICAgICAgICAgY2F0dHJzID0gbnVsbDsKKyAgICAgICAgICAgIHYgPSAwOworICAgICAgICAgICAgdyA9IDA7CisKKyAgICAgICAgICAgIC8vIGxvb2tzIGZvciBDb2RlIGFuZCBFeGNlcHRpb25zIGF0dHJpYnV0ZXMKKyAgICAgICAgICAgIGogPSByZWFkVW5zaWduZWRTaG9ydCh1ICsgNik7CisgICAgICAgICAgICB1ICs9IDg7CisgICAgICAgICAgICBmb3IgKDsgaiA+IDA7IC0taikgeworICAgICAgICAgICAgICAgIGF0dHJOYW1lID0gcmVhZFVURjgodSwgYyk7CisgICAgICAgICAgICAgICAgaW50IGF0dHJTaXplID0gcmVhZEludCh1ICsgMik7CisgICAgICAgICAgICAgICAgdSArPSA2OworICAgICAgICAgICAgICAgIC8vIHRlc3RzIGFyZSBzb3J0ZWQgaW4gZGVjcmVhc2luZyBmcmVxdWVuY3kgb3JkZXIKKyAgICAgICAgICAgICAgICAvLyAoYmFzZWQgb24gZnJlcXVlbmNpZXMgb2JzZXJ2ZWQgb24gdHlwaWNhbCBjbGFzc2VzKQorICAgICAgICAgICAgICAgIGlmICgiQ29kZSIuZXF1YWxzKGF0dHJOYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXNraXBDb2RlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2ID0gdTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIkV4Y2VwdGlvbnMiLmVxdWFscyhhdHRyTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdyA9IHU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChTSUdOQVRVUkVTICYmICJTaWduYXR1cmUiLmVxdWFscyhhdHRyTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlID0gcmVhZFVURjgodSwgYyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgiRGVwcmVjYXRlZCIuZXF1YWxzKGF0dHJOYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBhY2Nlc3MgfD0gT3Bjb2Rlcy5BQ0NfREVQUkVDQVRFRDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEFOTk9UQVRJT05TICYmICJSdW50aW1lVmlzaWJsZUFubm90YXRpb25zIi5lcXVhbHMoYXR0ck5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIGFubnMgPSB1OworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQU5OT1RBVElPTlMgJiYgIkFubm90YXRpb25EZWZhdWx0Ii5lcXVhbHMoYXR0ck5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIGRhbm4gPSB1OworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIlN5bnRoZXRpYyIuZXF1YWxzKGF0dHJOYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBhY2Nlc3MgfD0gT3Bjb2Rlcy5BQ0NfU1lOVEhFVElDIHwgQ2xhc3NXcml0ZXIuQUNDX1NZTlRIRVRJQ19BVFRSSUJVVEU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChBTk5PVEFUSU9OUyAmJiAiUnVudGltZUludmlzaWJsZUFubm90YXRpb25zIi5lcXVhbHMoYXR0ck5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIGlhbm5zID0gdTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEFOTk9UQVRJT05TICYmICJSdW50aW1lVmlzaWJsZVBhcmFtZXRlckFubm90YXRpb25zIi5lcXVhbHMoYXR0ck5hbWUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbXBhbm5zID0gdTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEFOTk9UQVRJT05TICYmICJSdW50aW1lSW52aXNpYmxlUGFyYW1ldGVyQW5ub3RhdGlvbnMiLmVxdWFscyhhdHRyTmFtZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbXBhbm5zID0gdTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhdHRyID0gcmVhZEF0dHJpYnV0ZShhdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChhdHRyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIubmV4dCA9IGNhdHRyczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhdHRycyA9IGF0dHI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdSArPSBhdHRyU2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIHJlYWRzIGRlY2xhcmVkIGV4Y2VwdGlvbnMKKyAgICAgICAgICAgIFN0cmluZ1tdIGV4Y2VwdGlvbnM7CisgICAgICAgICAgICBpZiAodyA9PSAwKSB7CisgICAgICAgICAgICAgICAgZXhjZXB0aW9ucyA9IG51bGw7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGV4Y2VwdGlvbnMgPSBuZXcgU3RyaW5nW3JlYWRVbnNpZ25lZFNob3J0KHcpXTsKKyAgICAgICAgICAgICAgICB3ICs9IDI7CisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGV4Y2VwdGlvbnMubGVuZ3RoOyArK2opIHsKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uc1tqXSA9IHJlYWRDbGFzcyh3LCBjKTsKKyAgICAgICAgICAgICAgICAgICAgdyArPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gdmlzaXRzIHRoZSBtZXRob2QncyBjb2RlLCBpZiBhbnkKKyAgICAgICAgICAgIE1ldGhvZFZpc2l0b3IgbXYgPSBjbGFzc1Zpc2l0b3IudmlzaXRNZXRob2QoYWNjZXNzLAorICAgICAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgICAgICBkZXNjLAorICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmUsCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbnMpOworCisgICAgICAgICAgICBpZiAobXYgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogaWYgdGhlIHJldHVybmVkIE1ldGhvZFZpc2l0b3IgaXMgaW4gZmFjdCBhIE1ldGhvZFdyaXRlciwgaXQKKyAgICAgICAgICAgICAgICAgKiBtZWFucyB0aGVyZSBpcyBubyBtZXRob2QgYWRhcHRlciBiZXR3ZWVuIHRoZSByZWFkZXIgYW5kIHRoZQorICAgICAgICAgICAgICAgICAqIHdyaXRlci4gSWYsIGluIGFkZGl0aW9uLCB0aGUgd3JpdGVyJ3MgY29uc3RhbnQgcG9vbCB3YXMKKyAgICAgICAgICAgICAgICAgKiBjb3BpZWQgZnJvbSB0aGlzIHJlYWRlciAobXcuY3cuY3IgPT0gdGhpcyksIGFuZCB0aGUgc2lnbmF0dXJlCisgICAgICAgICAgICAgICAgICogYW5kIGV4Y2VwdGlvbnMgb2YgdGhlIG1ldGhvZCBoYXZlIG5vdCBiZWVuIGNoYW5nZWQsIHRoZW4gaXQKKyAgICAgICAgICAgICAgICAgKiBpcyBwb3NzaWJsZSB0byBza2lwIGFsbCB2aXNpdCBldmVudHMgYW5kIGp1c3QgY29weSB0aGUKKyAgICAgICAgICAgICAgICAgKiBvcmlnaW5hbCBjb2RlIG9mIHRoZSBtZXRob2QgdG8gdGhlIHdyaXRlciAodGhlIGFjY2VzcywgbmFtZQorICAgICAgICAgICAgICAgICAqIGFuZCBkZXNjcmlwdG9yIGNhbiBoYXZlIGJlZW4gY2hhbmdlZCwgdGhpcyBpcyBub3QgaW1wb3J0YW50CisgICAgICAgICAgICAgICAgICogc2luY2UgdGhleSBhcmUgbm90IGNvcGllZCBhcyBpcyBmcm9tIHRoZSByZWFkZXIpLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmIChXUklURVIgJiYgbXYgaW5zdGFuY2VvZiBNZXRob2RXcml0ZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgTWV0aG9kV3JpdGVyIG13ID0gKE1ldGhvZFdyaXRlcikgbXY7CisgICAgICAgICAgICAgICAgICAgIGlmIChtdy5jdy5jciA9PSB0aGlzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2lnbmF0dXJlID09IG13LnNpZ25hdHVyZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2FtZUV4Y2VwdGlvbnMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXhjZXB0aW9ucyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbWVFeGNlcHRpb25zID0gbXcuZXhjZXB0aW9uQ291bnQgPT0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXhjZXB0aW9ucy5sZW5ndGggPT0gbXcuZXhjZXB0aW9uQ291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbWVFeGNlcHRpb25zID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IGV4Y2VwdGlvbnMubGVuZ3RoIC0gMTsgaiA+PSAwOyAtLWopCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdyAtPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtdy5leGNlcHRpb25zW2pdICE9IHJlYWRVbnNpZ25lZFNob3J0KHcpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtZUV4Y2VwdGlvbnMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzYW1lRXhjZXB0aW9ucykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB3ZSBkbyBub3QgY29weSBkaXJlY3RseSB0aGUgY29kZSBpbnRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIE1ldGhvZFdyaXRlciB0byBzYXZlIGEgYnl0ZSBhcnJheSBjb3B5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG9wZXJhdGlvbi4gVGhlIHJlYWwgY29weSB3aWxsIGJlIGRvbmUgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQ2xhc3NXcml0ZXIudG9CeXRlQXJyYXkoKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG13LmNsYXNzUmVhZGVyT2Zmc2V0ID0gdTA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG13LmNsYXNzUmVhZGVyTGVuZ3RoID0gdSAtIHUwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoQU5OT1RBVElPTlMgJiYgZGFubiAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25WaXNpdG9yIGR2ID0gbXYudmlzaXRBbm5vdGF0aW9uRGVmYXVsdCgpOworICAgICAgICAgICAgICAgICAgICByZWFkQW5ub3RhdGlvblZhbHVlKGRhbm4sIGMsIG51bGwsIGR2KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGR2ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGR2LnZpc2l0RW5kKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKEFOTk9UQVRJT05TKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDE7IGogPj0gMDsgLS1qKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB3ID0gaiA9PSAwID8gaWFubnMgOiBhbm5zOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHcgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsgPSByZWFkVW5zaWduZWRTaG9ydCh3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ICs9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7IGsgPiAwOyAtLWspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdyA9IHJlYWRBbm5vdGF0aW9uVmFsdWVzKHcgKyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdi52aXNpdEFubm90YXRpb24ocmVhZFVURjgodywgYyksIGogIT0gMCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoQU5OT1RBVElPTlMgJiYgbXBhbm5zICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmVhZFBhcmFtZXRlckFubm90YXRpb25zKG1wYW5ucywgZGVzYywgYywgdHJ1ZSwgbXYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoQU5OT1RBVElPTlMgJiYgaW1wYW5ucyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJlYWRQYXJhbWV0ZXJBbm5vdGF0aW9ucyhpbXBhbm5zLCBkZXNjLCBjLCBmYWxzZSwgbXYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3aGlsZSAoY2F0dHJzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYXR0ciA9IGNhdHRycy5uZXh0OworICAgICAgICAgICAgICAgICAgICBjYXR0cnMubmV4dCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIG12LnZpc2l0QXR0cmlidXRlKGNhdHRycyk7CisgICAgICAgICAgICAgICAgICAgIGNhdHRycyA9IGF0dHI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobXYgIT0gbnVsbCAmJiB2ICE9IDApIHsKKyAgICAgICAgICAgICAgICBpbnQgbWF4U3RhY2sgPSByZWFkVW5zaWduZWRTaG9ydCh2KTsKKyAgICAgICAgICAgICAgICBpbnQgbWF4TG9jYWxzID0gcmVhZFVuc2lnbmVkU2hvcnQodiArIDIpOworICAgICAgICAgICAgICAgIGludCBjb2RlTGVuZ3RoID0gcmVhZEludCh2ICsgNCk7CisgICAgICAgICAgICAgICAgdiArPSA4OworCisgICAgICAgICAgICAgICAgaW50IGNvZGVTdGFydCA9IHY7CisgICAgICAgICAgICAgICAgaW50IGNvZGVFbmQgPSB2ICsgY29kZUxlbmd0aDsKKworICAgICAgICAgICAgICAgIG12LnZpc2l0Q29kZSgpOworCisgICAgICAgICAgICAgICAgLy8gMXN0IHBoYXNlOiBmaW5kcyB0aGUgbGFiZWxzCisgICAgICAgICAgICAgICAgaW50IGxhYmVsOworICAgICAgICAgICAgICAgIExhYmVsW10gbGFiZWxzID0gbmV3IExhYmVsW2NvZGVMZW5ndGggKyAyXTsKKyAgICAgICAgICAgICAgICByZWFkTGFiZWwoY29kZUxlbmd0aCArIDEsIGxhYmVscyk7CisgICAgICAgICAgICAgICAgd2hpbGUgKHYgPCBjb2RlRW5kKSB7CisgICAgICAgICAgICAgICAgICAgIHcgPSB2IC0gY29kZVN0YXJ0OworICAgICAgICAgICAgICAgICAgICBpbnQgb3Bjb2RlID0gYlt2XSAmIDB4RkY7CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoQ2xhc3NXcml0ZXIuVFlQRVtvcGNvZGVdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLk5PQVJHX0lOU046CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLklNUExWQVJfSU5TTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ICs9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLkxBQkVMX0lOU046CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZExhYmVsKHcgKyByZWFkU2hvcnQodiArIDEpLCBsYWJlbHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgKz0gMzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuTEFCRUxXX0lOU046CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZExhYmVsKHcgKyByZWFkSW50KHYgKyAxKSwgbGFiZWxzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ICs9IDU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLldJREVfSU5TTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGNvZGUgPSBiW3YgKyAxXSAmIDB4RkY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wY29kZSA9PSBPcGNvZGVzLklJTkMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiArPSA2OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgKz0gNDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLlRBQkxfSU5TTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBza2lwcyAwIHRvIDMgcGFkZGluZyBieXRlcyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gdiArIDQgLSAodyAmIDMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlYWRzIGluc3RydWN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZExhYmVsKHcgKyByZWFkSW50KHYpLCBsYWJlbHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGogPSByZWFkSW50KHYgKyA4KSAtIHJlYWRJbnQodiArIDQpICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ICs9IDEyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoOyBqID4gMDsgLS1qKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRMYWJlbCh3ICsgcmVhZEludCh2KSwgbGFiZWxzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiArPSA0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuTE9PS19JTlNOOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNraXBzIDAgdG8gMyBwYWRkaW5nIGJ5dGVzKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSB2ICsgNCAtICh3ICYgMyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVhZHMgaW5zdHJ1Y3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkTGFiZWwodyArIHJlYWRJbnQodiksIGxhYmVscyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiA9IHJlYWRJbnQodiArIDQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgKz0gODsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDsgaiA+IDA7IC0taikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkTGFiZWwodyArIHJlYWRJbnQodiArIDQpLCBsYWJlbHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ICs9IDg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5WQVJfSU5TTjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuU0JZVEVfSU5TTjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuTERDX0lOU046CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiArPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5TSE9SVF9JTlNOOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5MRENXX0lOU046CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLkZJRUxET1JNRVRIX0lOU046CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLlRZUEVfSU5TTjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuSUlOQ19JTlNOOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgKz0gMzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuSVRGTUVUSF9JTlNOOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5JTkRZTUVUSF9JTlNOOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgKz0gNTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhc2UgTUFOQV9JTlNOOgorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ICs9IDQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gcGFyc2VzIHRoZSB0cnkgY2F0Y2ggZW50cmllcworICAgICAgICAgICAgICAgIGogPSByZWFkVW5zaWduZWRTaG9ydCh2KTsKKyAgICAgICAgICAgICAgICB2ICs9IDI7CisgICAgICAgICAgICAgICAgZm9yICg7IGogPiAwOyAtLWopIHsKKyAgICAgICAgICAgICAgICAgICAgTGFiZWwgc3RhcnQgPSByZWFkTGFiZWwocmVhZFVuc2lnbmVkU2hvcnQodiksIGxhYmVscyk7CisgICAgICAgICAgICAgICAgICAgIExhYmVsIGVuZCA9IHJlYWRMYWJlbChyZWFkVW5zaWduZWRTaG9ydCh2ICsgMiksIGxhYmVscyk7CisgICAgICAgICAgICAgICAgICAgIExhYmVsIGhhbmRsZXIgPSByZWFkTGFiZWwocmVhZFVuc2lnbmVkU2hvcnQodiArIDQpLCBsYWJlbHMpOworICAgICAgICAgICAgICAgICAgICBpbnQgdHlwZSA9IHJlYWRVbnNpZ25lZFNob3J0KHYgKyA2KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbXYudmlzaXRUcnlDYXRjaEJsb2NrKHN0YXJ0LCBlbmQsIGhhbmRsZXIsIG51bGwpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbXYudmlzaXRUcnlDYXRjaEJsb2NrKHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRVVEY4KGl0ZW1zW3R5cGVdLCBjKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdiArPSA4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBwYXJzZXMgdGhlIGxvY2FsIHZhcmlhYmxlLCBsaW5lIG51bWJlciB0YWJsZXMsIGFuZCBjb2RlCisgICAgICAgICAgICAgICAgLy8gYXR0cmlidXRlcworICAgICAgICAgICAgICAgIGludCB2YXJUYWJsZSA9IDA7CisgICAgICAgICAgICAgICAgaW50IHZhclR5cGVUYWJsZSA9IDA7CisgICAgICAgICAgICAgICAgaW50IHN0YWNrTWFwID0gMDsKKyAgICAgICAgICAgICAgICBpbnQgc3RhY2tNYXBTaXplID0gMDsKKyAgICAgICAgICAgICAgICBpbnQgZnJhbWVDb3VudCA9IDA7CisgICAgICAgICAgICAgICAgaW50IGZyYW1lTW9kZSA9IDA7CisgICAgICAgICAgICAgICAgaW50IGZyYW1lT2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICBpbnQgZnJhbWVMb2NhbENvdW50ID0gMDsKKyAgICAgICAgICAgICAgICBpbnQgZnJhbWVMb2NhbERpZmYgPSAwOworICAgICAgICAgICAgICAgIGludCBmcmFtZVN0YWNrQ291bnQgPSAwOworICAgICAgICAgICAgICAgIE9iamVjdFtdIGZyYW1lTG9jYWwgPSBudWxsOworICAgICAgICAgICAgICAgIE9iamVjdFtdIGZyYW1lU3RhY2sgPSBudWxsOworICAgICAgICAgICAgICAgIGJvb2xlYW4gemlwID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBjYXR0cnMgPSBudWxsOworICAgICAgICAgICAgICAgIGogPSByZWFkVW5zaWduZWRTaG9ydCh2KTsKKyAgICAgICAgICAgICAgICB2ICs9IDI7CisgICAgICAgICAgICAgICAgZm9yICg7IGogPiAwOyAtLWopIHsKKyAgICAgICAgICAgICAgICAgICAgYXR0ck5hbWUgPSByZWFkVVRGOCh2LCBjKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCJMb2NhbFZhcmlhYmxlVGFibGUiLmVxdWFscyhhdHRyTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2tpcERlYnVnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyVGFibGUgPSB2ICsgNjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrID0gcmVhZFVuc2lnbmVkU2hvcnQodiArIDYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcgPSB2ICsgODsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDsgayA+IDA7IC0taykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IHJlYWRVbnNpZ25lZFNob3J0KHcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFiZWxzW2xhYmVsXSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkTGFiZWwobGFiZWwsIGxhYmVscykuc3RhdHVzIHw9IExhYmVsLkRFQlVHOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsICs9IHJlYWRVbnNpZ25lZFNob3J0KHcgKyAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhYmVsc1tsYWJlbF0gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZExhYmVsKGxhYmVsLCBsYWJlbHMpLnN0YXR1cyB8PSBMYWJlbC5ERUJVRzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ICs9IDEwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgiTG9jYWxWYXJpYWJsZVR5cGVUYWJsZSIuZXF1YWxzKGF0dHJOYW1lKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyVHlwZVRhYmxlID0gdiArIDY7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIkxpbmVOdW1iZXJUYWJsZSIuZXF1YWxzKGF0dHJOYW1lKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFza2lwRGVidWcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrID0gcmVhZFVuc2lnbmVkU2hvcnQodiArIDYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcgPSB2ICsgODsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDsgayA+IDA7IC0taykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IHJlYWRVbnNpZ25lZFNob3J0KHcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFiZWxzW2xhYmVsXSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkTGFiZWwobGFiZWwsIGxhYmVscykuc3RhdHVzIHw9IExhYmVsLkRFQlVHOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsc1tsYWJlbF0ubGluZSA9IHJlYWRVbnNpZ25lZFNob3J0KHcgKyAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdyArPSA0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChGUkFNRVMgJiYgIlN0YWNrTWFwVGFibGUiLmVxdWFscyhhdHRyTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoZmxhZ3MgJiBTS0lQX0ZSQU1FUykgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrTWFwID0gdiArIDg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2tNYXBTaXplID0gcmVhZEludCh2ICsgMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCA9IHJlYWRVbnNpZ25lZFNob3J0KHYgKyA2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBoZXJlIHdlIGRvIG5vdCBleHRyYWN0IHRoZSBsYWJlbHMgY29ycmVzcG9uZGluZyB0bworICAgICAgICAgICAgICAgICAgICAgICAgICogdGhlIGF0dHJpYnV0ZSBjb250ZW50LiBUaGlzIHdvdWxkIHJlcXVpcmUgYSBmdWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBwYXJzaW5nIG9mIHRoZSBhdHRyaWJ1dGUsIHdoaWNoIHdvdWxkIG5lZWQgdG8gYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHJlcGVhdGVkIGluIHRoZSBzZWNvbmQgcGhhc2UgKHNlZSBiZWxvdykuIEluc3RlYWQgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBjb250ZW50IG9mIHRoZSBhdHRyaWJ1dGUgaXMgcmVhZCBvbmUgZnJhbWUgYXQgYSB0aW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgKiAoaS5lLiBhZnRlciBhIGZyYW1lIGhhcyBiZWVuIHZpc2l0ZWQsIHRoZSBuZXh0IGZyYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBpcyByZWFkKSwgYW5kIHRoZSBsYWJlbHMgaXQgY29udGFpbnMgYXJlIGFsc28KKyAgICAgICAgICAgICAgICAgICAgICAgICAqIGV4dHJhY3RlZCBvbmUgZnJhbWUgYXQgYSB0aW1lLiBUaGFua3MgdG8gdGhlIG9yZGVyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBvZiBmcmFtZXMsIGhhdmluZyBvbmx5IGEgIm9uZSBmcmFtZSBsb29rYWhlYWQiIGlzIG5vdAorICAgICAgICAgICAgICAgICAgICAgICAgICogYSBwcm9ibGVtLCBpLmUuIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBzZWUgYW4gb2Zmc2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgKiBzbWFsbGVyIHRoYW4gdGhlIG9mZnNldCBvZiB0aGUgY3VycmVudCBpbnNuIGFuZCBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHdoaWNoIG5vIExhYmVsIGV4aXN0LgorICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgICAgICogVGhpcyBpcyBub3QgdHJ1ZSBmb3IgVU5JTklUSUFMSVpFRCB0eXBlIG9mZnNldHMuIFdlCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBzb2x2ZSB0aGlzIGJ5IHBhcnNpbmcgdGhlIHN0YWNrIG1hcCB0YWJsZSB3aXRob3V0IGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIGZ1bGwgZGVjb2RpbmcgKHNlZSBiZWxvdykuCisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChGUkFNRVMgJiYgIlN0YWNrTWFwIi5lcXVhbHMoYXR0ck5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGZsYWdzICYgU0tJUF9GUkFNRVMpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFja01hcCA9IHYgKyA4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrTWFwU2l6ZSA9IHJlYWRJbnQodiArIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQgPSByZWFkVW5zaWduZWRTaG9ydCh2ICsgNik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgemlwID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgICAgICogSU1QT1JUQU5UISBoZXJlIHdlIGFzc3VtZSB0aGF0IHRoZSBmcmFtZXMgYXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBvcmRlcmVkLCBhcyBpbiB0aGUgU3RhY2tNYXBUYWJsZSBhdHRyaWJ1dGUsIGFsdGhvdWdoCisgICAgICAgICAgICAgICAgICAgICAgICAgKiB0aGlzIGlzIG5vdCBndWFyYW50ZWVkIGJ5IHRoZSBhdHRyaWJ1dGUgZm9ybWF0LgorICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgYXR0cnMubGVuZ3RoOyArK2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXR0cnNba10udHlwZS5lcXVhbHMoYXR0ck5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIgPSBhdHRyc1trXS5yZWFkKHRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiArIDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZEludCh2ICsgMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlU3RhcnQgLSA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdHRyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIubmV4dCA9IGNhdHRyczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdHRycyA9IGF0dHI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdiArPSA2ICsgcmVhZEludCh2ICsgMik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gMm5kIHBoYXNlOiB2aXNpdHMgZWFjaCBpbnN0cnVjdGlvbgorICAgICAgICAgICAgICAgIGlmIChGUkFNRVMgJiYgc3RhY2tNYXAgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGVzIHRoZSB2ZXJ5IGZpcnN0IChpbXBsaWNpdCkgZnJhbWUgZnJvbSB0aGUgbWV0aG9kCisgICAgICAgICAgICAgICAgICAgIC8vIGRlc2NyaXB0b3IKKyAgICAgICAgICAgICAgICAgICAgZnJhbWVMb2NhbCA9IG5ldyBPYmplY3RbbWF4TG9jYWxzXTsKKyAgICAgICAgICAgICAgICAgICAgZnJhbWVTdGFjayA9IG5ldyBPYmplY3RbbWF4U3RhY2tdOworICAgICAgICAgICAgICAgICAgICBpZiAodW56aXApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBsb2NhbCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGFjY2VzcyAmIE9wY29kZXMuQUNDX1NUQVRJQykgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgiPGluaXQ+Ii5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVMb2NhbFtsb2NhbCsrXSA9IE9wY29kZXMuVU5JTklUSUFMSVpFRF9USElTOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lTG9jYWxbbG9jYWwrK10gPSByZWFkQ2xhc3MoaGVhZGVyICsgMiwgYyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaiA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBsb29wOiB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsgPSBqOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZGVzYy5jaGFyQXQoaisrKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdaJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnQyc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0InOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdTJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnSSc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUxvY2FsW2xvY2FsKytdID0gT3Bjb2Rlcy5JTlRFR0VSOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0YnOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVMb2NhbFtsb2NhbCsrXSA9IE9wY29kZXMuRkxPQVQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnSic6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUxvY2FsW2xvY2FsKytdID0gT3Bjb2Rlcy5MT05HOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0QnOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVMb2NhbFtsb2NhbCsrXSA9IE9wY29kZXMuRE9VQkxFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1snOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGRlc2MuY2hhckF0KGopID09ICdbJykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrajsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjLmNoYXJBdChqKSA9PSAnTCcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2o7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGRlc2MuY2hhckF0KGopICE9ICc7JykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2o7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVMb2NhbFtsb2NhbCsrXSA9IGRlc2Muc3Vic3RyaW5nKGssICsraik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnTCc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZGVzYy5jaGFyQXQoaikgIT0gJzsnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytqOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVMb2NhbFtsb2NhbCsrXSA9IGRlc2Muc3Vic3RyaW5nKGsgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqKyspOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBsb29wOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lTG9jYWxDb3VudCA9IGxvY2FsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAqIGZvciB0aGUgZmlyc3QgZXhwbGljaXQgZnJhbWUgdGhlIG9mZnNldCBpcyBub3QKKyAgICAgICAgICAgICAgICAgICAgICogb2Zmc2V0X2RlbHRhICsgMSBidXQgb25seSBvZmZzZXRfZGVsdGE7IHNldHRpbmcgdGhlCisgICAgICAgICAgICAgICAgICAgICAqIGltcGxpY2l0IGZyYW1lIG9mZnNldCB0byAtMSBhbGxvdyB0aGUgdXNlIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgKiAib2Zmc2V0X2RlbHRhICsgMSIgcnVsZSBpbiBhbGwgY2FzZXMKKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGZyYW1lT2Zmc2V0ID0gLTE7CisgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAqIEZpbmRzIGxhYmVscyBmb3IgVU5JTklUSUFMSVpFRCBmcmFtZSB0eXBlcy4gSW5zdGVhZCBvZgorICAgICAgICAgICAgICAgICAgICAgKiBkZWNvZGluZyBlYWNoIGVsZW1lbnQgb2YgdGhlIHN0YWNrIG1hcCB0YWJsZSwgd2UgbG9vaworICAgICAgICAgICAgICAgICAgICAgKiBmb3IgMyBjb25zZWN1dGl2ZSBieXRlcyB0aGF0ICJsb29rIGxpa2UiIGFuIFVOSU5JVElBTElaRUQKKyAgICAgICAgICAgICAgICAgICAgICogdHlwZSAodGFnIDgsIG9mZnNldCB3aXRoaW4gY29kZSBib3VuZHMsIE5FVyBpbnN0cnVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgKiBhdCB0aGlzIG9mZnNldCkuIFdlIG1heSBmaW5kIGZhbHNlIHBvc2l0aXZlcyAoaS5lLiBub3QKKyAgICAgICAgICAgICAgICAgICAgICogcmVhbCBVTklOSVRJQUxJWkVEIHR5cGVzKSwgYnV0IHRoaXMgc2hvdWxkIGJlIHJhcmUsIGFuZAorICAgICAgICAgICAgICAgICAgICAgKiB0aGUgb25seSBjb25zZXF1ZW5jZSB3aWxsIGJlIHRoZSBjcmVhdGlvbiBvZiBhbiB1bm5lZWRlZAorICAgICAgICAgICAgICAgICAgICAgKiBsYWJlbC4gVGhpcyBpcyBiZXR0ZXIgdGhhbiBjcmVhdGluZyBhIGxhYmVsIGZvciBlYWNoIE5FVworICAgICAgICAgICAgICAgICAgICAgKiBpbnN0cnVjdGlvbiwgYW5kIGZhc3RlciB0aGFuIGZ1bGx5IGRlY29kaW5nIHRoZSB3aG9sZQorICAgICAgICAgICAgICAgICAgICAgKiBzdGFjayBtYXAgdGFibGUuCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSBzdGFja01hcDsgaiA8IHN0YWNrTWFwICsgc3RhY2tNYXBTaXplIC0gMjsgKytqKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYltqXSA9PSA4KSB7IC8vIFVOSU5JVElBTElaRUQgRlJBTUUgVFlQRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsgPSByZWFkVW5zaWduZWRTaG9ydChqICsgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGsgPj0gMCAmJiBrIDwgY29kZUxlbmd0aCkgeyAvLyBwb3RlbnRpYWwgb2Zmc2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoYltjb2RlU3RhcnQgKyBrXSAmIDB4RkYpID09IE9wY29kZXMuTkVXKSB7IC8vIE5FVyBhdCB0aGlzIG9mZnNldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZExhYmVsKGssIGxhYmVscyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdiA9IGNvZGVTdGFydDsKKyAgICAgICAgICAgICAgICBMYWJlbCBsOworICAgICAgICAgICAgICAgIHdoaWxlICh2IDwgY29kZUVuZCkgeworICAgICAgICAgICAgICAgICAgICB3ID0gdiAtIGNvZGVTdGFydDsKKworICAgICAgICAgICAgICAgICAgICBsID0gbGFiZWxzW3ddOworICAgICAgICAgICAgICAgICAgICBpZiAobCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtdi52aXNpdExhYmVsKGwpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFza2lwRGVidWcgJiYgbC5saW5lID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG12LnZpc2l0TGluZU51bWJlcihsLmxpbmUsIGwpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKEZSQU1FUyAmJiBmcmFtZUxvY2FsICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoZnJhbWVPZmZzZXQgPT0gdyB8fCBmcmFtZU9mZnNldCA9PSAtMSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIGEgZnJhbWUgZm9yIHRoaXMgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFrZXMgdGhlIHZpc2l0b3IgdmlzaXQgaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgcmVhZHMgdGhlIG5leHQgZnJhbWUgaWYgdGhlcmUgaXMgb25lLgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF6aXAgfHwgdW56aXApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdi52aXNpdEZyYW1lKE9wY29kZXMuRl9ORVcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUxvY2FsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUxvY2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVTdGFja0NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVTdGFjayk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZyYW1lT2Zmc2V0ICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXYudmlzaXRGcmFtZShmcmFtZU1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUxvY2FsRGlmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lTG9jYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZVN0YWNrQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZVN0YWNrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZyYW1lQ291bnQgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRhZywgZGVsdGEsIG47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHppcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWcgPSBiW3N0YWNrTWFwKytdICYgMHhGRjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWcgPSBNZXRob2RXcml0ZXIuRlVMTF9GUkFNRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVPZmZzZXQgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVMb2NhbERpZmYgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YWcgPCBNZXRob2RXcml0ZXIuU0FNRV9MT0NBTFNfMV9TVEFDS19JVEVNX0ZSQU1FKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEgPSB0YWc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lTW9kZSA9IE9wY29kZXMuRl9TQU1FOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZVN0YWNrQ291bnQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGFnIDwgTWV0aG9kV3JpdGVyLlJFU0VSVkVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhID0gdGFnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBNZXRob2RXcml0ZXIuU0FNRV9MT0NBTFNfMV9TVEFDS19JVEVNX0ZSQU1FOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFja01hcCA9IHJlYWRGcmFtZVR5cGUoZnJhbWVTdGFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrTWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVNb2RlID0gT3Bjb2Rlcy5GX1NBTUUxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZVN0YWNrQ291bnQgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhID0gcmVhZFVuc2lnbmVkU2hvcnQoc3RhY2tNYXApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFja01hcCArPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFnID09IE1ldGhvZFdyaXRlci5TQU1FX0xPQ0FMU18xX1NUQUNLX0lURU1fRlJBTUVfRVhURU5ERUQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrTWFwID0gcmVhZEZyYW1lVHlwZShmcmFtZVN0YWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFja01hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lTW9kZSA9IE9wY29kZXMuRl9TQU1FMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lU3RhY2tDb3VudCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGFnID49IE1ldGhvZFdyaXRlci5DSE9QX0ZSQU1FCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgdGFnIDwgTWV0aG9kV3JpdGVyLlNBTUVfRlJBTUVfRVhURU5ERUQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lTW9kZSA9IE9wY29kZXMuRl9DSE9QOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVMb2NhbERpZmYgPSBNZXRob2RXcml0ZXIuU0FNRV9GUkFNRV9FWFRFTkRFRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHRhZzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lTG9jYWxDb3VudCAtPSBmcmFtZUxvY2FsRGlmZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lU3RhY2tDb3VudCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGFnID09IE1ldGhvZFdyaXRlci5TQU1FX0ZSQU1FX0VYVEVOREVEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZU1vZGUgPSBPcGNvZGVzLkZfU0FNRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lU3RhY2tDb3VudCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGFnIDwgTWV0aG9kV3JpdGVyLkZVTExfRlJBTUUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGogPSB1bnppcCA/IGZyYW1lTG9jYWxDb3VudCA6IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGsgPSB0YWcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBNZXRob2RXcml0ZXIuU0FNRV9GUkFNRV9FWFRFTkRFRDsgayA+IDA7IGstLSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFja01hcCA9IHJlYWRGcmFtZVR5cGUoZnJhbWVMb2NhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGorKywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrTWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZU1vZGUgPSBPcGNvZGVzLkZfQVBQRU5EOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVMb2NhbERpZmYgPSB0YWcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBNZXRob2RXcml0ZXIuU0FNRV9GUkFNRV9FWFRFTkRFRDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lTG9jYWxDb3VudCArPSBmcmFtZUxvY2FsRGlmZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lU3RhY2tDb3VudCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIGlmICh0YWcgPT0gRlVMTF9GUkFNRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVNb2RlID0gT3Bjb2Rlcy5GX0ZVTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gZnJhbWVMb2NhbERpZmYgPSBmcmFtZUxvY2FsQ291bnQgPSByZWFkVW5zaWduZWRTaG9ydChzdGFja01hcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFja01hcCArPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgbiA+IDA7IG4tLSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrTWFwID0gcmVhZEZyYW1lVHlwZShmcmFtZUxvY2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaisrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2tNYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBmcmFtZVN0YWNrQ291bnQgPSByZWFkVW5zaWduZWRTaG9ydChzdGFja01hcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFja01hcCArPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgbiA+IDA7IG4tLSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrTWFwID0gcmVhZEZyYW1lVHlwZShmcmFtZVN0YWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaisrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2tNYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZU9mZnNldCArPSBkZWx0YSArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZExhYmVsKGZyYW1lT2Zmc2V0LCBsYWJlbHMpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1mcmFtZUNvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUxvY2FsID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGludCBvcGNvZGUgPSBiW3ZdICYgMHhGRjsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChDbGFzc1dyaXRlci5UWVBFW29wY29kZV0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuTk9BUkdfSU5TTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdi52aXNpdEluc24ob3Bjb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ICs9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLklNUExWQVJfSU5TTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3Bjb2RlID4gT3Bjb2Rlcy5JU1RPUkUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlIC09IDU5OyAvLyBJU1RPUkVfMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdi52aXNpdFZhckluc24oT3Bjb2Rlcy5JU1RPUkUgKyAob3Bjb2RlID4+IDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZSAmIDB4Myk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlIC09IDI2OyAvLyBJTE9BRF8wCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG12LnZpc2l0VmFySW5zbihPcGNvZGVzLklMT0FEICsgKG9wY29kZSA+PiAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGNvZGUgJiAweDMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ICs9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLkxBQkVMX0lOU046CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXYudmlzaXRKdW1wSW5zbihvcGNvZGUsIGxhYmVsc1t3CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHJlYWRTaG9ydCh2ICsgMSldKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ICs9IDM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLkxBQkVMV19JTlNOOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG12LnZpc2l0SnVtcEluc24ob3Bjb2RlIC0gMzMsIGxhYmVsc1t3CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHJlYWRJbnQodiArIDEpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiArPSA1OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5XSURFX0lOU046CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlID0gYlt2ICsgMV0gJiAweEZGOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcGNvZGUgPT0gT3Bjb2Rlcy5JSU5DKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG12LnZpc2l0SWluY0luc24ocmVhZFVuc2lnbmVkU2hvcnQodiArIDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRTaG9ydCh2ICsgNCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ICs9IDY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXYudmlzaXRWYXJJbnNuKG9wY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkVW5zaWduZWRTaG9ydCh2ICsgMikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ICs9IDQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5UQUJMX0lOU046CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2tpcHMgMCB0byAzIHBhZGRpbmcgYnl0ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gdiArIDQgLSAodyAmIDMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlYWRzIGluc3RydWN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSB3ICsgcmVhZEludCh2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWluID0gcmVhZEludCh2ICsgNCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heCA9IHJlYWRJbnQodiArIDgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgKz0gMTI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGFiZWxbXSB0YWJsZSA9IG5ldyBMYWJlbFttYXggLSBtaW4gKyAxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgdGFibGUubGVuZ3RoOyArK2opIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVbal0gPSBsYWJlbHNbdyArIHJlYWRJbnQodildOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ICs9IDQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG12LnZpc2l0VGFibGVTd2l0Y2hJbnNuKG1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsc1tsYWJlbF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLkxPT0tfSU5TTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBza2lwcyAwIHRvIDMgcGFkZGluZyBieXRlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSB2ICsgNCAtICh3ICYgMyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVhZHMgaW5zdHJ1Y3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IHcgKyByZWFkSW50KHYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGogPSByZWFkSW50KHYgKyA0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ICs9IDg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50W10ga2V5cyA9IG5ldyBpbnRbal07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGFiZWxbXSB2YWx1ZXMgPSBuZXcgTGFiZWxbal07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGtleXMubGVuZ3RoOyArK2opIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5c1tqXSA9IHJlYWRJbnQodik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlc1tqXSA9IGxhYmVsc1t3ICsgcmVhZEludCh2ICsgNCldOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ICs9IDg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG12LnZpc2l0TG9va3VwU3dpdGNoSW5zbihsYWJlbHNbbGFiZWxdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLlZBUl9JTlNOOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG12LnZpc2l0VmFySW5zbihvcGNvZGUsIGJbdiArIDFdICYgMHhGRik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiArPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5TQllURV9JTlNOOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG12LnZpc2l0SW50SW5zbihvcGNvZGUsIGJbdiArIDFdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ICs9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLlNIT1JUX0lOU046CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXYudmlzaXRJbnRJbnNuKG9wY29kZSwgcmVhZFNob3J0KHYgKyAxKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiArPSAzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5MRENfSU5TTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdi52aXNpdExkY0luc24ocmVhZENvbnN0KGJbdiArIDFdICYgMHhGRiwgYykpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuTERDV19JTlNOOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG12LnZpc2l0TGRjSW5zbihyZWFkQ29uc3QocmVhZFVuc2lnbmVkU2hvcnQodiArIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYykpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgKz0gMzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuRklFTERPUk1FVEhfSU5TTjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuSVRGTUVUSF9JTlNOOiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNwSW5kZXggPSBpdGVtc1tyZWFkVW5zaWduZWRTaG9ydCh2ICsgMSldOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBpb3duZXIgPSByZWFkQ2xhc3MoY3BJbmRleCwgYyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3BJbmRleCA9IGl0ZW1zW3JlYWRVbnNpZ25lZFNob3J0KGNwSW5kZXggKyAyKV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGluYW1lID0gcmVhZFVURjgoY3BJbmRleCwgYyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGlkZXNjID0gcmVhZFVURjgoY3BJbmRleCArIDIsIGMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcGNvZGUgPCBPcGNvZGVzLklOVk9LRVZJUlRVQUwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXYudmlzaXRGaWVsZEluc24ob3Bjb2RlLCBpb3duZXIsIGluYW1lLCBpZGVzYyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXYudmlzaXRNZXRob2RJbnNuKG9wY29kZSwgaW93bmVyLCBpbmFtZSwgaWRlc2MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3Bjb2RlID09IE9wY29kZXMuSU5WT0tFSU5URVJGQUNFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgKz0gNTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ICs9IDM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5JTkRZTUVUSF9JTlNOOiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNwSW5kZXggPSBpdGVtc1tyZWFkVW5zaWduZWRTaG9ydCh2ICsgMSldOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBic21JbmRleCA9IGJvb3RzdHJhcE1ldGhvZHNbcmVhZFVuc2lnbmVkU2hvcnQoY3BJbmRleCldOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwSW5kZXggPSBpdGVtc1tyZWFkVW5zaWduZWRTaG9ydChjcEluZGV4ICsgMildOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBpbmFtZSA9IHJlYWRVVEY4KGNwSW5kZXgsIGMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBpZGVzYyA9IHJlYWRVVEY4KGNwSW5kZXggKyAyLCBjKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtaEluZGV4ID0gcmVhZFVuc2lnbmVkU2hvcnQoYnNtSW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZSBic20gPSAoSGFuZGxlKSByZWFkQ29uc3QobWhJbmRleCwgYyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJzbUFyZ0NvdW50ID0gcmVhZFVuc2lnbmVkU2hvcnQoYnNtSW5kZXggKyAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RbXSBic21BcmdzID0gbmV3IE9iamVjdFtic21BcmdDb3VudF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnNtSW5kZXggKz0gNDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IoaW50IGEgPSAwOyBhIDwgYnNtQXJnQ291bnQ7IGErKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXJnSW5kZXggPSByZWFkVW5zaWduZWRTaG9ydChic21JbmRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJzbUFyZ3NbYV0gPSByZWFkQ29uc3QoYXJnSW5kZXgsIGMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBic21JbmRleCArPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdi52aXNpdEludm9rZUR5bmFtaWNJbnNuKGluYW1lLCBpZGVzYywgYnNtLCBic21BcmdzKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgKz0gNTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuVFlQRV9JTlNOOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG12LnZpc2l0VHlwZUluc24ob3Bjb2RlLCByZWFkQ2xhc3ModiArIDEsIGMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ICs9IDM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLklJTkNfSU5TTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdi52aXNpdElpbmNJbnNuKGJbdiArIDFdICYgMHhGRiwgYlt2ICsgMl0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgKz0gMzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhc2UgTUFOQV9JTlNOOgorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdi52aXNpdE11bHRpQU5ld0FycmF5SW5zbihyZWFkQ2xhc3ModiArIDEsIGMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlt2ICsgM10gJiAweEZGKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ICs9IDQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbCA9IGxhYmVsc1tjb2RlRW5kIC0gY29kZVN0YXJ0XTsKKyAgICAgICAgICAgICAgICBpZiAobCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG12LnZpc2l0TGFiZWwobCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIHZpc2l0cyB0aGUgbG9jYWwgdmFyaWFibGUgdGFibGVzCisgICAgICAgICAgICAgICAgaWYgKCFza2lwRGVidWcgJiYgdmFyVGFibGUgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBpbnRbXSB0eXBlVGFibGUgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBpZiAodmFyVHlwZVRhYmxlICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGsgPSByZWFkVW5zaWduZWRTaG9ydCh2YXJUeXBlVGFibGUpICogMzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHcgPSB2YXJUeXBlVGFibGUgKyAyOworICAgICAgICAgICAgICAgICAgICAgICAgdHlwZVRhYmxlID0gbmV3IGludFtrXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChrID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVUYWJsZVstLWtdID0gdyArIDY7IC8vIHNpZ25hdHVyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVUYWJsZVstLWtdID0gcmVhZFVuc2lnbmVkU2hvcnQodyArIDgpOyAvLyBpbmRleAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVUYWJsZVstLWtdID0gcmVhZFVuc2lnbmVkU2hvcnQodyk7IC8vIHN0YXJ0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdyArPSAxMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBrID0gcmVhZFVuc2lnbmVkU2hvcnQodmFyVGFibGUpOworICAgICAgICAgICAgICAgICAgICB3ID0gdmFyVGFibGUgKyAyOworICAgICAgICAgICAgICAgICAgICBmb3IgKDsgayA+IDA7IC0taykgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0ID0gcmVhZFVuc2lnbmVkU2hvcnQodyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoID0gcmVhZFVuc2lnbmVkU2hvcnQodyArIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gcmVhZFVuc2lnbmVkU2hvcnQodyArIDgpOworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZzaWduYXR1cmUgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVUYWJsZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgYSA9IDA7IGEgPCB0eXBlVGFibGUubGVuZ3RoOyBhICs9IDMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVUYWJsZVthXSA9PSBzdGFydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHR5cGVUYWJsZVthICsgMV0gPT0gaW5kZXgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZzaWduYXR1cmUgPSByZWFkVVRGOCh0eXBlVGFibGVbYSArIDJdLCBjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbXYudmlzaXRMb2NhbFZhcmlhYmxlKHJlYWRVVEY4KHcgKyA0LCBjKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZFVURjgodyArIDYsIGMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2c2lnbmF0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHNbc3RhcnRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHNbc3RhcnQgKyBsZW5ndGhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICB3ICs9IDEwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIHZpc2l0cyB0aGUgb3RoZXIgYXR0cmlidXRlcworICAgICAgICAgICAgICAgIHdoaWxlIChjYXR0cnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBhdHRyID0gY2F0dHJzLm5leHQ7CisgICAgICAgICAgICAgICAgICAgIGNhdHRycy5uZXh0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgbXYudmlzaXRBdHRyaWJ1dGUoY2F0dHJzKTsKKyAgICAgICAgICAgICAgICAgICAgY2F0dHJzID0gYXR0cjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gdmlzaXRzIHRoZSBtYXggc3RhY2sgYW5kIG1heCBsb2NhbHMgdmFsdWVzCisgICAgICAgICAgICAgICAgbXYudmlzaXRNYXhzKG1heFN0YWNrLCBtYXhMb2NhbHMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobXYgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG12LnZpc2l0RW5kKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyB2aXNpdHMgdGhlIGVuZCBvZiB0aGUgY2xhc3MKKyAgICAgICAgY2xhc3NWaXNpdG9yLnZpc2l0RW5kKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZHMgcGFyYW1ldGVyIGFubm90YXRpb25zIGFuZCBtYWtlcyB0aGUgZ2l2ZW4gdmlzaXRvciB2aXNpdCB0aGVtLgorICAgICAqCisgICAgICogQHBhcmFtIHYgc3RhcnQgb2Zmc2V0IGluIHtAbGluayAjYiBifSBvZiB0aGUgYW5ub3RhdGlvbnMgdG8gYmUgcmVhZC4KKyAgICAgKiBAcGFyYW0gZGVzYyB0aGUgbWV0aG9kIGRlc2NyaXB0b3IuCisgICAgICogQHBhcmFtIGJ1ZiBidWZmZXIgdG8gYmUgdXNlZCB0byBjYWxsIHtAbGluayAjcmVhZFVURjggcmVhZFVURjh9LAorICAgICAqICAgICAgICB7QGxpbmsgI3JlYWRDbGFzcyhpbnQsY2hhcltdKSByZWFkQ2xhc3N9IG9yCisgICAgICogICAgICAgIHtAbGluayAjcmVhZENvbnN0IHJlYWRDb25zdH0uCisgICAgICogQHBhcmFtIHZpc2libGUgPHR0PnRydWU8L3R0PiBpZiB0aGUgYW5ub3RhdGlvbnMgdG8gYmUgcmVhZCBhcmUgdmlzaWJsZQorICAgICAqICAgICAgICBhdCBydW50aW1lLgorICAgICAqIEBwYXJhbSBtdiB0aGUgdmlzaXRvciB0aGF0IG11c3QgdmlzaXQgdGhlIGFubm90YXRpb25zLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCByZWFkUGFyYW1ldGVyQW5ub3RhdGlvbnMoCisgICAgICAgIGludCB2LAorICAgICAgICBmaW5hbCBTdHJpbmcgZGVzYywKKyAgICAgICAgZmluYWwgY2hhcltdIGJ1ZiwKKyAgICAgICAgZmluYWwgYm9vbGVhbiB2aXNpYmxlLAorICAgICAgICBmaW5hbCBNZXRob2RWaXNpdG9yIG12KQorICAgIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGludCBuID0gYlt2KytdICYgMHhGRjsKKyAgICAgICAgLy8gd29ya2Fyb3VuZCBmb3IgYSBidWcgaW4gamF2YWMgKGphdmFjIGNvbXBpbGVyIGdlbmVyYXRlcyBhIHBhcmFtZXRlcgorICAgICAgICAvLyBhbm5vdGF0aW9uIGFycmF5IHdob3NlIHNpemUgaXMgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzIGluCisgICAgICAgIC8vIHRoZSBKYXZhIHNvdXJjZSBmaWxlLCB3aGlsZSBpdCBzaG91bGQgZ2VuZXJhdGUgYW4gYXJyYXkgd2hvc2Ugc2l6ZSBpcworICAgICAgICAvLyBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMgaW4gdGhlIG1ldGhvZCBkZXNjcmlwdG9yIC0gd2hpY2gKKyAgICAgICAgLy8gaW5jbHVkZXMgdGhlIHN5bnRoZXRpYyBwYXJhbWV0ZXJzIGFkZGVkIGJ5IHRoZSBjb21waWxlcikuIFRoaXMgd29yay0KKyAgICAgICAgLy8gYXJvdW5kIHN1cHBvc2VzIHRoYXQgdGhlIHN5bnRoZXRpYyBwYXJhbWV0ZXJzIGFyZSB0aGUgZmlyc3Qgb25lcy4KKyAgICAgICAgaW50IHN5bnRoZXRpY3MgPSBUeXBlLmdldEFyZ3VtZW50VHlwZXMoZGVzYykubGVuZ3RoIC0gbjsKKyAgICAgICAgQW5ub3RhdGlvblZpc2l0b3IgYXY7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzeW50aGV0aWNzOyArK2kpIHsKKyAgICAgICAgICAgIC8vIHZpcnR1YWwgYW5ub3RhdGlvbiB0byBkZXRlY3Qgc3ludGhldGljIHBhcmFtZXRlcnMgaW4gTWV0aG9kV3JpdGVyCisgICAgICAgICAgICBhdiA9IG12LnZpc2l0UGFyYW1ldGVyQW5ub3RhdGlvbihpLCAiTGphdmEvbGFuZy9TeW50aGV0aWM7IiwgZmFsc2UpOworICAgICAgICAgICAgaWYgKGF2ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBhdi52aXNpdEVuZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciAoOyBpIDwgbiArIHN5bnRoZXRpY3M7ICsraSkgeworICAgICAgICAgICAgaW50IGogPSByZWFkVW5zaWduZWRTaG9ydCh2KTsKKyAgICAgICAgICAgIHYgKz0gMjsKKyAgICAgICAgICAgIGZvciAoOyBqID4gMDsgLS1qKSB7CisgICAgICAgICAgICAgICAgYXYgPSBtdi52aXNpdFBhcmFtZXRlckFubm90YXRpb24oaSwgcmVhZFVURjgodiwgYnVmKSwgdmlzaWJsZSk7CisgICAgICAgICAgICAgICAgdiA9IHJlYWRBbm5vdGF0aW9uVmFsdWVzKHYgKyAyLCBidWYsIHRydWUsIGF2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWRzIHRoZSB2YWx1ZXMgb2YgYW4gYW5ub3RhdGlvbiBhbmQgbWFrZXMgdGhlIGdpdmVuIHZpc2l0b3IgdmlzaXQgdGhlbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2IHRoZSBzdGFydCBvZmZzZXQgaW4ge0BsaW5rICNiIGJ9IG9mIHRoZSB2YWx1ZXMgdG8gYmUgcmVhZAorICAgICAqICAgICAgICAoaW5jbHVkaW5nIHRoZSB1bnNpZ25lZCBzaG9ydCB0aGF0IGdpdmVzIHRoZSBudW1iZXIgb2YgdmFsdWVzKS4KKyAgICAgKiBAcGFyYW0gYnVmIGJ1ZmZlciB0byBiZSB1c2VkIHRvIGNhbGwge0BsaW5rICNyZWFkVVRGOCByZWFkVVRGOH0sCisgICAgICogICAgICAgIHtAbGluayAjcmVhZENsYXNzKGludCxjaGFyW10pIHJlYWRDbGFzc30gb3IKKyAgICAgKiAgICAgICAge0BsaW5rICNyZWFkQ29uc3QgcmVhZENvbnN0fS4KKyAgICAgKiBAcGFyYW0gbmFtZWQgaWYgdGhlIGFubm90YXRpb24gdmFsdWVzIGFyZSBuYW1lZCBvciBub3QuCisgICAgICogQHBhcmFtIGF2IHRoZSB2aXNpdG9yIHRoYXQgbXVzdCB2aXNpdCB0aGUgdmFsdWVzLgorICAgICAqIEByZXR1cm4gdGhlIGVuZCBvZmZzZXQgb2YgdGhlIGFubm90YXRpb24gdmFsdWVzLgorICAgICAqLworICAgIHByaXZhdGUgaW50IHJlYWRBbm5vdGF0aW9uVmFsdWVzKAorICAgICAgICBpbnQgdiwKKyAgICAgICAgZmluYWwgY2hhcltdIGJ1ZiwKKyAgICAgICAgZmluYWwgYm9vbGVhbiBuYW1lZCwKKyAgICAgICAgZmluYWwgQW5ub3RhdGlvblZpc2l0b3IgYXYpCisgICAgeworICAgICAgICBpbnQgaSA9IHJlYWRVbnNpZ25lZFNob3J0KHYpOworICAgICAgICB2ICs9IDI7CisgICAgICAgIGlmIChuYW1lZCkgeworICAgICAgICAgICAgZm9yICg7IGkgPiAwOyAtLWkpIHsKKyAgICAgICAgICAgICAgICB2ID0gcmVhZEFubm90YXRpb25WYWx1ZSh2ICsgMiwgYnVmLCByZWFkVVRGOCh2LCBidWYpLCBhdik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKDsgaSA+IDA7IC0taSkgeworICAgICAgICAgICAgICAgIHYgPSByZWFkQW5ub3RhdGlvblZhbHVlKHYsIGJ1ZiwgbnVsbCwgYXYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChhdiAhPSBudWxsKSB7CisgICAgICAgICAgICBhdi52aXNpdEVuZCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB2OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWRzIGEgdmFsdWUgb2YgYW4gYW5ub3RhdGlvbiBhbmQgbWFrZXMgdGhlIGdpdmVuIHZpc2l0b3IgdmlzaXQgaXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdiB0aGUgc3RhcnQgb2Zmc2V0IGluIHtAbGluayAjYiBifSBvZiB0aGUgdmFsdWUgdG8gYmUgcmVhZCAoPGk+bm90CisgICAgICogICAgICAgIGluY2x1ZGluZyB0aGUgdmFsdWUgbmFtZSBjb25zdGFudCBwb29sIGluZGV4PC9pPikuCisgICAgICogQHBhcmFtIGJ1ZiBidWZmZXIgdG8gYmUgdXNlZCB0byBjYWxsIHtAbGluayAjcmVhZFVURjggcmVhZFVURjh9LAorICAgICAqICAgICAgICB7QGxpbmsgI3JlYWRDbGFzcyhpbnQsY2hhcltdKSByZWFkQ2xhc3N9IG9yCisgICAgICogICAgICAgIHtAbGluayAjcmVhZENvbnN0IHJlYWRDb25zdH0uCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHZhbHVlIHRvIGJlIHJlYWQuCisgICAgICogQHBhcmFtIGF2IHRoZSB2aXNpdG9yIHRoYXQgbXVzdCB2aXNpdCB0aGUgdmFsdWUuCisgICAgICogQHJldHVybiB0aGUgZW5kIG9mZnNldCBvZiB0aGUgYW5ub3RhdGlvbiB2YWx1ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCByZWFkQW5ub3RhdGlvblZhbHVlKAorICAgICAgICBpbnQgdiwKKyAgICAgICAgZmluYWwgY2hhcltdIGJ1ZiwKKyAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUsCisgICAgICAgIGZpbmFsIEFubm90YXRpb25WaXNpdG9yIGF2KQorICAgIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGlmIChhdiA9PSBudWxsKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGJbdl0gJiAweEZGKSB7CisgICAgICAgICAgICAgICAgY2FzZSAnZSc6IC8vIGVudW1fY29uc3RfdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHYgKyA1OworICAgICAgICAgICAgICAgIGNhc2UgJ0AnOiAvLyBhbm5vdGF0aW9uX3ZhbHVlCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWFkQW5ub3RhdGlvblZhbHVlcyh2ICsgMywgYnVmLCB0cnVlLCBudWxsKTsKKyAgICAgICAgICAgICAgICBjYXNlICdbJzogLy8gYXJyYXlfdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWRBbm5vdGF0aW9uVmFsdWVzKHYgKyAxLCBidWYsIGZhbHNlLCBudWxsKTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdiArIDM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChiW3YrK10gJiAweEZGKSB7CisgICAgICAgICAgICBjYXNlICdJJzogLy8gcG9pbnRlciB0byBDT05TVEFOVF9JbnRlZ2VyCisgICAgICAgICAgICBjYXNlICdKJzogLy8gcG9pbnRlciB0byBDT05TVEFOVF9Mb25nCisgICAgICAgICAgICBjYXNlICdGJzogLy8gcG9pbnRlciB0byBDT05TVEFOVF9GbG9hdAorICAgICAgICAgICAgY2FzZSAnRCc6IC8vIHBvaW50ZXIgdG8gQ09OU1RBTlRfRG91YmxlCisgICAgICAgICAgICAgICAgYXYudmlzaXQobmFtZSwgcmVhZENvbnN0KHJlYWRVbnNpZ25lZFNob3J0KHYpLCBidWYpKTsKKyAgICAgICAgICAgICAgICB2ICs9IDI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdCJzogLy8gcG9pbnRlciB0byBDT05TVEFOVF9CeXRlCisgICAgICAgICAgICAgICAgYXYudmlzaXQobmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCeXRlKChieXRlKSByZWFkSW50KGl0ZW1zW3JlYWRVbnNpZ25lZFNob3J0KHYpXSkpKTsKKyAgICAgICAgICAgICAgICB2ICs9IDI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdaJzogLy8gcG9pbnRlciB0byBDT05TVEFOVF9Cb29sZWFuCisgICAgICAgICAgICAgICAgYXYudmlzaXQobmFtZSwgcmVhZEludChpdGVtc1tyZWFkVW5zaWduZWRTaG9ydCh2KV0pID09IDAKKyAgICAgICAgICAgICAgICAgICAgICAgID8gQm9vbGVhbi5GQUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgOiBCb29sZWFuLlRSVUUpOworICAgICAgICAgICAgICAgIHYgKz0gMjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ1MnOiAvLyBwb2ludGVyIHRvIENPTlNUQU5UX1Nob3J0CisgICAgICAgICAgICAgICAgYXYudmlzaXQobmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTaG9ydCgoc2hvcnQpIHJlYWRJbnQoaXRlbXNbcmVhZFVuc2lnbmVkU2hvcnQodildKSkpOworICAgICAgICAgICAgICAgIHYgKz0gMjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ0MnOiAvLyBwb2ludGVyIHRvIENPTlNUQU5UX0NoYXIKKyAgICAgICAgICAgICAgICBhdi52aXNpdChuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENoYXJhY3RlcigoY2hhcikgcmVhZEludChpdGVtc1tyZWFkVW5zaWduZWRTaG9ydCh2KV0pKSk7CisgICAgICAgICAgICAgICAgdiArPSAyOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAncyc6IC8vIHBvaW50ZXIgdG8gQ09OU1RBTlRfVXRmOAorICAgICAgICAgICAgICAgIGF2LnZpc2l0KG5hbWUsIHJlYWRVVEY4KHYsIGJ1ZikpOworICAgICAgICAgICAgICAgIHYgKz0gMjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ2UnOiAvLyBlbnVtX2NvbnN0X3ZhbHVlCisgICAgICAgICAgICAgICAgYXYudmlzaXRFbnVtKG5hbWUsIHJlYWRVVEY4KHYsIGJ1ZiksIHJlYWRVVEY4KHYgKyAyLCBidWYpKTsKKyAgICAgICAgICAgICAgICB2ICs9IDQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdjJzogLy8gY2xhc3NfaW5mbworICAgICAgICAgICAgICAgIGF2LnZpc2l0KG5hbWUsIFR5cGUuZ2V0VHlwZShyZWFkVVRGOCh2LCBidWYpKSk7CisgICAgICAgICAgICAgICAgdiArPSAyOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnQCc6IC8vIGFubm90YXRpb25fdmFsdWUKKyAgICAgICAgICAgICAgICB2ID0gcmVhZEFubm90YXRpb25WYWx1ZXModiArIDIsCisgICAgICAgICAgICAgICAgICAgICAgICBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgYXYudmlzaXRBbm5vdGF0aW9uKG5hbWUsIHJlYWRVVEY4KHYsIGJ1ZikpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ1snOiAvLyBhcnJheV92YWx1ZQorICAgICAgICAgICAgICAgIGludCBzaXplID0gcmVhZFVuc2lnbmVkU2hvcnQodik7CisgICAgICAgICAgICAgICAgdiArPSAyOworICAgICAgICAgICAgICAgIGlmIChzaXplID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWRBbm5vdGF0aW9uVmFsdWVzKHYgLSAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdi52aXNpdEFycmF5KG5hbWUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmJbdisrXSAmIDB4RkYpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnQic6CisgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gYnYgPSBuZXcgYnl0ZVtzaXplXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBidltpXSA9IChieXRlKSByZWFkSW50KGl0ZW1zW3JlYWRVbnNpZ25lZFNob3J0KHYpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiArPSAzOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYXYudmlzaXQobmFtZSwgYnYpOworICAgICAgICAgICAgICAgICAgICAgICAgLS12OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1onOgorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbltdIHp2ID0gbmV3IGJvb2xlYW5bc2l6ZV07CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgenZbaV0gPSByZWFkSW50KGl0ZW1zW3JlYWRVbnNpZ25lZFNob3J0KHYpXSkgIT0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ICs9IDM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBhdi52aXNpdChuYW1lLCB6dik7CisgICAgICAgICAgICAgICAgICAgICAgICAtLXY7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnUyc6CisgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydFtdIHN2ID0gbmV3IHNob3J0W3NpemVdOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN2W2ldID0gKHNob3J0KSByZWFkSW50KGl0ZW1zW3JlYWRVbnNpZ25lZFNob3J0KHYpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiArPSAzOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYXYudmlzaXQobmFtZSwgc3YpOworICAgICAgICAgICAgICAgICAgICAgICAgLS12OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0MnOgorICAgICAgICAgICAgICAgICAgICAgICAgY2hhcltdIGN2ID0gbmV3IGNoYXJbc2l6ZV07CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3ZbaV0gPSAoY2hhcikgcmVhZEludChpdGVtc1tyZWFkVW5zaWduZWRTaG9ydCh2KV0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgKz0gMzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGF2LnZpc2l0KG5hbWUsIGN2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC0tdjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlICdJJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGludFtdIGl2ID0gbmV3IGludFtzaXplXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdltpXSA9IHJlYWRJbnQoaXRlbXNbcmVhZFVuc2lnbmVkU2hvcnQodildKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ICs9IDM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBhdi52aXNpdChuYW1lLCBpdik7CisgICAgICAgICAgICAgICAgICAgICAgICAtLXY7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnSic6CisgICAgICAgICAgICAgICAgICAgICAgICBsb25nW10gbHYgPSBuZXcgbG9uZ1tzaXplXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsdltpXSA9IHJlYWRMb25nKGl0ZW1zW3JlYWRVbnNpZ25lZFNob3J0KHYpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiArPSAzOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYXYudmlzaXQobmFtZSwgbHYpOworICAgICAgICAgICAgICAgICAgICAgICAgLS12OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0YnOgorICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXRbXSBmdiA9IG5ldyBmbG9hdFtzaXplXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdltpXSA9IEZsb2F0LmludEJpdHNUb0Zsb2F0KHJlYWRJbnQoaXRlbXNbcmVhZFVuc2lnbmVkU2hvcnQodildKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiArPSAzOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYXYudmlzaXQobmFtZSwgZnYpOworICAgICAgICAgICAgICAgICAgICAgICAgLS12OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0QnOgorICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlW10gZHYgPSBuZXcgZG91YmxlW3NpemVdOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR2W2ldID0gRG91YmxlLmxvbmdCaXRzVG9Eb3VibGUocmVhZExvbmcoaXRlbXNbcmVhZFVuc2lnbmVkU2hvcnQodildKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiArPSAzOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYXYudmlzaXQobmFtZSwgZHYpOworICAgICAgICAgICAgICAgICAgICAgICAgLS12OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICB2ID0gcmVhZEFubm90YXRpb25WYWx1ZXModiAtIDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2LnZpc2l0QXJyYXkobmFtZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdjsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCByZWFkRnJhbWVUeXBlKAorICAgICAgICBmaW5hbCBPYmplY3RbXSBmcmFtZSwKKyAgICAgICAgZmluYWwgaW50IGluZGV4LAorICAgICAgICBpbnQgdiwKKyAgICAgICAgZmluYWwgY2hhcltdIGJ1ZiwKKyAgICAgICAgZmluYWwgTGFiZWxbXSBsYWJlbHMpCisgICAgeworICAgICAgICBpbnQgdHlwZSA9IGJbdisrXSAmIDB4RkY7CisgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIGZyYW1lW2luZGV4XSA9IE9wY29kZXMuVE9QOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIGZyYW1lW2luZGV4XSA9IE9wY29kZXMuSU5URUdFUjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICBmcmFtZVtpbmRleF0gPSBPcGNvZGVzLkZMT0FUOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgIGZyYW1lW2luZGV4XSA9IE9wY29kZXMuRE9VQkxFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgIGZyYW1lW2luZGV4XSA9IE9wY29kZXMuTE9ORzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICBmcmFtZVtpbmRleF0gPSBPcGNvZGVzLk5VTEw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgZnJhbWVbaW5kZXhdID0gT3Bjb2Rlcy5VTklOSVRJQUxJWkVEX1RISVM7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDc6IC8vIE9iamVjdAorICAgICAgICAgICAgICAgIGZyYW1lW2luZGV4XSA9IHJlYWRDbGFzcyh2LCBidWYpOworICAgICAgICAgICAgICAgIHYgKz0gMjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6IC8vIFVuaW5pdGlhbGl6ZWQKKyAgICAgICAgICAgICAgICBmcmFtZVtpbmRleF0gPSByZWFkTGFiZWwocmVhZFVuc2lnbmVkU2hvcnQodiksIGxhYmVscyk7CisgICAgICAgICAgICAgICAgdiArPSAyOworICAgICAgICB9CisgICAgICAgIHJldHVybiB2OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGxhYmVsIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIG9mZnNldC4gVGhlIGRlZmF1bHQKKyAgICAgKiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBjcmVhdGVzIGEgbGFiZWwgZm9yIHRoZSBnaXZlbiBvZmZzZXQgaWYgaXQKKyAgICAgKiBoYXMgbm90IGJlZW4gYWxyZWFkeSBjcmVhdGVkLgorICAgICAqCisgICAgICogQHBhcmFtIG9mZnNldCBhIGJ5dGVjb2RlIG9mZnNldCBpbiBhIG1ldGhvZC4KKyAgICAgKiBAcGFyYW0gbGFiZWxzIHRoZSBhbHJlYWR5IGNyZWF0ZWQgbGFiZWxzLCBpbmRleGVkIGJ5IHRoZWlyIG9mZnNldC4gSWYgYQorICAgICAqICAgICAgICBsYWJlbCBhbHJlYWR5IGV4aXN0cyBmb3Igb2Zmc2V0IHRoaXMgbWV0aG9kIG11c3Qgbm90IGNyZWF0ZSBhIG5ldworICAgICAqICAgICAgICBvbmUuIE90aGVyd2lzZSBpdCBtdXN0IHN0b3JlIHRoZSBuZXcgbGFiZWwgaW4gdGhpcyBhcnJheS4KKyAgICAgKiBAcmV0dXJuIGEgbm9uIG51bGwgTGFiZWwsIHdoaWNoIG11c3QgYmUgZXF1YWwgdG8gbGFiZWxzW29mZnNldF0uCisgICAgICovCisgICAgcHJvdGVjdGVkIExhYmVsIHJlYWRMYWJlbChpbnQgb2Zmc2V0LCBMYWJlbFtdIGxhYmVscykgeworICAgICAgICBpZiAobGFiZWxzW29mZnNldF0gPT0gbnVsbCkgeworICAgICAgICAgICAgbGFiZWxzW29mZnNldF0gPSBuZXcgTGFiZWwoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbGFiZWxzW29mZnNldF07CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZHMgYW4gYXR0cmlidXRlIGluIHtAbGluayAjYiBifS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhdHRycyBwcm90b3R5cGVzIG9mIHRoZSBhdHRyaWJ1dGVzIHRoYXQgbXVzdCBiZSBwYXJzZWQgZHVyaW5nIHRoZQorICAgICAqICAgICAgICB2aXNpdCBvZiB0aGUgY2xhc3MuIEFueSBhdHRyaWJ1dGUgd2hvc2UgdHlwZSBpcyBub3QgZXF1YWwgdG8gdGhlCisgICAgICogICAgICAgIHR5cGUgb2Ygb25lIHRoZSBwcm90b3R5cGVzIGlzIGlnbm9yZWQgKGkuZS4gYW4gZW1wdHkKKyAgICAgKiAgICAgICAge0BsaW5rIEF0dHJpYnV0ZX0gaW5zdGFuY2UgaXMgcmV0dXJuZWQpLgorICAgICAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIG9mIHRoZSBhdHRyaWJ1dGUuCisgICAgICogQHBhcmFtIG9mZiBpbmRleCBvZiB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgYXR0cmlidXRlJ3MgY29udGVudCBpbgorICAgICAqICAgICAgICB7QGxpbmsgI2IgYn0uIFRoZSA2IGF0dHJpYnV0ZSBoZWFkZXIgYnl0ZXMsIGNvbnRhaW5pbmcgdGhlIHR5cGUKKyAgICAgKiAgICAgICAgYW5kIHRoZSBsZW5ndGggb2YgdGhlIGF0dHJpYnV0ZSwgYXJlIG5vdCB0YWtlbiBpbnRvIGFjY291bnQgaGVyZQorICAgICAqICAgICAgICAodGhleSBoYXZlIGFscmVhZHkgYmVlbiByZWFkKS4KKyAgICAgKiBAcGFyYW0gbGVuIHRoZSBsZW5ndGggb2YgdGhlIGF0dHJpYnV0ZSdzIGNvbnRlbnQuCisgICAgICogQHBhcmFtIGJ1ZiBidWZmZXIgdG8gYmUgdXNlZCB0byBjYWxsIHtAbGluayAjcmVhZFVURjggcmVhZFVURjh9LAorICAgICAqICAgICAgICB7QGxpbmsgI3JlYWRDbGFzcyhpbnQsY2hhcltdKSByZWFkQ2xhc3N9IG9yCisgICAgICogICAgICAgIHtAbGluayAjcmVhZENvbnN0IHJlYWRDb25zdH0uCisgICAgICogQHBhcmFtIGNvZGVPZmYgaW5kZXggb2YgdGhlIGZpcnN0IGJ5dGUgb2YgY29kZSdzIGF0dHJpYnV0ZSBjb250ZW50IGluCisgICAgICogICAgICAgIHtAbGluayAjYiBifSwgb3IgLTEgaWYgdGhlIGF0dHJpYnV0ZSB0byBiZSByZWFkIGlzIG5vdCBhIGNvZGUKKyAgICAgKiAgICAgICAgYXR0cmlidXRlLiBUaGUgNiBhdHRyaWJ1dGUgaGVhZGVyIGJ5dGVzLCBjb250YWluaW5nIHRoZSB0eXBlIGFuZAorICAgICAqICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSBhdHRyaWJ1dGUsIGFyZSBub3QgdGFrZW4gaW50byBhY2NvdW50IGhlcmUuCisgICAgICogQHBhcmFtIGxhYmVscyB0aGUgbGFiZWxzIG9mIHRoZSBtZXRob2QncyBjb2RlLCBvciA8dHQ+bnVsbDwvdHQ+IGlmIHRoZQorICAgICAqICAgICAgICBhdHRyaWJ1dGUgdG8gYmUgcmVhZCBpcyBub3QgYSBjb2RlIGF0dHJpYnV0ZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBhdHRyaWJ1dGUgdGhhdCBoYXMgYmVlbiByZWFkLCBvciA8dHQ+bnVsbDwvdHQ+IHRvIHNraXAgdGhpcworICAgICAqICAgICAgICAgYXR0cmlidXRlLgorICAgICAqLworICAgIHByaXZhdGUgQXR0cmlidXRlIHJlYWRBdHRyaWJ1dGUoCisgICAgICAgIGZpbmFsIEF0dHJpYnV0ZVtdIGF0dHJzLAorICAgICAgICBmaW5hbCBTdHJpbmcgdHlwZSwKKyAgICAgICAgZmluYWwgaW50IG9mZiwKKyAgICAgICAgZmluYWwgaW50IGxlbiwKKyAgICAgICAgZmluYWwgY2hhcltdIGJ1ZiwKKyAgICAgICAgZmluYWwgaW50IGNvZGVPZmYsCisgICAgICAgIGZpbmFsIExhYmVsW10gbGFiZWxzKQorICAgIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRycy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgaWYgKGF0dHJzW2ldLnR5cGUuZXF1YWxzKHR5cGUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF0dHJzW2ldLnJlYWQodGhpcywgb2ZmLCBsZW4sIGJ1ZiwgY29kZU9mZiwgbGFiZWxzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IEF0dHJpYnV0ZSh0eXBlKS5yZWFkKHRoaXMsIG9mZiwgbGVuLCBudWxsLCAtMSwgbnVsbCk7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gVXRpbGl0eSBtZXRob2RzOiBsb3cgbGV2ZWwgcGFyc2luZworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLyoqCisgICAgICogIFJldHVybnMgdGhlIG51bWJlciBvZiBjb25zdGFudCBwb29sIGl0ZW1zIGluIHtAbGluayAjYiBifS4KKyAgICAgKgorICAgICAqICBAcmV0dXJuIHRoZSBudW1iZXIgb2YgY29uc3RhbnQgcG9vbCBpdGVtcyBpbiB7QGxpbmsgI2IgYn0uCisgICAgICovCisgICAgcHVibGljIGludCBnZXRJdGVtQ291bnQoKSB7CisgICAgICAgIHJldHVybiBpdGVtcy5sZW5ndGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc3RhcnQgaW5kZXggb2YgdGhlIGNvbnN0YW50IHBvb2wgaXRlbSBpbiB7QGxpbmsgI2IgYn0sIHBsdXMKKyAgICAgKiBvbmUuIDxpPlRoaXMgbWV0aG9kIGlzIGludGVuZGVkIGZvciB7QGxpbmsgQXR0cmlidXRlfSBzdWIgY2xhc3NlcywgYW5kIGlzCisgICAgICogbm9ybWFsbHkgbm90IG5lZWRlZCBieSBjbGFzcyBnZW5lcmF0b3JzIG9yIGFkYXB0ZXJzLjwvaT4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpdGVtIHRoZSBpbmRleCBhIGNvbnN0YW50IHBvb2wgaXRlbS4KKyAgICAgKiBAcmV0dXJuIHRoZSBzdGFydCBpbmRleCBvZiB0aGUgY29uc3RhbnQgcG9vbCBpdGVtIGluIHtAbGluayAjYiBifSwgcGx1cworICAgICAqICAgICAgICAgb25lLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0SXRlbShmaW5hbCBpbnQgaXRlbSkgeworICAgICAgICByZXR1cm4gaXRlbXNbaXRlbV07CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbWF4aW11bSBsZW5ndGggb2YgdGhlIHN0cmluZ3MgY29udGFpbmVkIGluIHRoZSBjb25zdGFudCBwb29sCisgICAgICogb2YgdGhlIGNsYXNzLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbWF4aW11bSBsZW5ndGggb2YgdGhlIHN0cmluZ3MgY29udGFpbmVkIGluIHRoZSBjb25zdGFudCBwb29sCisgICAgICogICAgICAgICBvZiB0aGUgY2xhc3MuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRNYXhTdHJpbmdMZW5ndGgoKSB7CisgICAgICAgIHJldHVybiBtYXhTdHJpbmdMZW5ndGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZHMgYSBieXRlIHZhbHVlIGluIHtAbGluayAjYiBifS4gPGk+VGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgZm9yCisgICAgICoge0BsaW5rIEF0dHJpYnV0ZX0gc3ViIGNsYXNzZXMsIGFuZCBpcyBub3JtYWxseSBub3QgbmVlZGVkIGJ5IGNsYXNzCisgICAgICogZ2VuZXJhdG9ycyBvciBhZGFwdGVycy48L2k+CisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5kZXggdGhlIHN0YXJ0IGluZGV4IG9mIHRoZSB2YWx1ZSB0byBiZSByZWFkIGluIHtAbGluayAjYiBifS4KKyAgICAgKiBAcmV0dXJuIHRoZSByZWFkIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgcmVhZEJ5dGUoZmluYWwgaW50IGluZGV4KSB7CisgICAgICAgIHJldHVybiBiW2luZGV4XSAmIDB4RkY7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZHMgYW4gdW5zaWduZWQgc2hvcnQgdmFsdWUgaW4ge0BsaW5rICNiIGJ9LiA8aT5UaGlzIG1ldGhvZCBpcworICAgICAqIGludGVuZGVkIGZvciB7QGxpbmsgQXR0cmlidXRlfSBzdWIgY2xhc3NlcywgYW5kIGlzIG5vcm1hbGx5IG5vdCBuZWVkZWQgYnkKKyAgICAgKiBjbGFzcyBnZW5lcmF0b3JzIG9yIGFkYXB0ZXJzLjwvaT4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbmRleCB0aGUgc3RhcnQgaW5kZXggb2YgdGhlIHZhbHVlIHRvIGJlIHJlYWQgaW4ge0BsaW5rICNiIGJ9LgorICAgICAqIEByZXR1cm4gdGhlIHJlYWQgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIGludCByZWFkVW5zaWduZWRTaG9ydChmaW5hbCBpbnQgaW5kZXgpIHsKKyAgICAgICAgYnl0ZVtdIGIgPSB0aGlzLmI7CisgICAgICAgIHJldHVybiAoKGJbaW5kZXhdICYgMHhGRikgPDwgOCkgfCAoYltpbmRleCArIDFdICYgMHhGRik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZHMgYSBzaWduZWQgc2hvcnQgdmFsdWUgaW4ge0BsaW5rICNiIGJ9LiA8aT5UaGlzIG1ldGhvZCBpcyBpbnRlbmRlZAorICAgICAqIGZvciB7QGxpbmsgQXR0cmlidXRlfSBzdWIgY2xhc3NlcywgYW5kIGlzIG5vcm1hbGx5IG5vdCBuZWVkZWQgYnkgY2xhc3MKKyAgICAgKiBnZW5lcmF0b3JzIG9yIGFkYXB0ZXJzLjwvaT4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbmRleCB0aGUgc3RhcnQgaW5kZXggb2YgdGhlIHZhbHVlIHRvIGJlIHJlYWQgaW4ge0BsaW5rICNiIGJ9LgorICAgICAqIEByZXR1cm4gdGhlIHJlYWQgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHNob3J0IHJlYWRTaG9ydChmaW5hbCBpbnQgaW5kZXgpIHsKKyAgICAgICAgYnl0ZVtdIGIgPSB0aGlzLmI7CisgICAgICAgIHJldHVybiAoc2hvcnQpICgoKGJbaW5kZXhdICYgMHhGRikgPDwgOCkgfCAoYltpbmRleCArIDFdICYgMHhGRikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWRzIGEgc2lnbmVkIGludCB2YWx1ZSBpbiB7QGxpbmsgI2IgYn0uIDxpPlRoaXMgbWV0aG9kIGlzIGludGVuZGVkIGZvcgorICAgICAqIHtAbGluayBBdHRyaWJ1dGV9IHN1YiBjbGFzc2VzLCBhbmQgaXMgbm9ybWFsbHkgbm90IG5lZWRlZCBieSBjbGFzcworICAgICAqIGdlbmVyYXRvcnMgb3IgYWRhcHRlcnMuPC9pPgorICAgICAqCisgICAgICogQHBhcmFtIGluZGV4IHRoZSBzdGFydCBpbmRleCBvZiB0aGUgdmFsdWUgdG8gYmUgcmVhZCBpbiB7QGxpbmsgI2IgYn0uCisgICAgICogQHJldHVybiB0aGUgcmVhZCB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHJlYWRJbnQoZmluYWwgaW50IGluZGV4KSB7CisgICAgICAgIGJ5dGVbXSBiID0gdGhpcy5iOworICAgICAgICByZXR1cm4gKChiW2luZGV4XSAmIDB4RkYpIDw8IDI0KSB8ICgoYltpbmRleCArIDFdICYgMHhGRikgPDwgMTYpCisgICAgICAgICAgICAgICAgfCAoKGJbaW5kZXggKyAyXSAmIDB4RkYpIDw8IDgpIHwgKGJbaW5kZXggKyAzXSAmIDB4RkYpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWRzIGEgc2lnbmVkIGxvbmcgdmFsdWUgaW4ge0BsaW5rICNiIGJ9LiA8aT5UaGlzIG1ldGhvZCBpcyBpbnRlbmRlZAorICAgICAqIGZvciB7QGxpbmsgQXR0cmlidXRlfSBzdWIgY2xhc3NlcywgYW5kIGlzIG5vcm1hbGx5IG5vdCBuZWVkZWQgYnkgY2xhc3MKKyAgICAgKiBnZW5lcmF0b3JzIG9yIGFkYXB0ZXJzLjwvaT4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbmRleCB0aGUgc3RhcnQgaW5kZXggb2YgdGhlIHZhbHVlIHRvIGJlIHJlYWQgaW4ge0BsaW5rICNiIGJ9LgorICAgICAqIEByZXR1cm4gdGhlIHJlYWQgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIGxvbmcgcmVhZExvbmcoZmluYWwgaW50IGluZGV4KSB7CisgICAgICAgIGxvbmcgbDEgPSByZWFkSW50KGluZGV4KTsKKyAgICAgICAgbG9uZyBsMCA9IHJlYWRJbnQoaW5kZXggKyA0KSAmIDB4RkZGRkZGRkZMOworICAgICAgICByZXR1cm4gKGwxIDw8IDMyKSB8IGwwOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWRzIGFuIFVURjggc3RyaW5nIGNvbnN0YW50IHBvb2wgaXRlbSBpbiB7QGxpbmsgI2IgYn0uIDxpPlRoaXMgbWV0aG9kCisgICAgICogaXMgaW50ZW5kZWQgZm9yIHtAbGluayBBdHRyaWJ1dGV9IHN1YiBjbGFzc2VzLCBhbmQgaXMgbm9ybWFsbHkgbm90IG5lZWRlZAorICAgICAqIGJ5IGNsYXNzIGdlbmVyYXRvcnMgb3IgYWRhcHRlcnMuPC9pPgorICAgICAqCisgICAgICogQHBhcmFtIGluZGV4IHRoZSBzdGFydCBpbmRleCBvZiBhbiB1bnNpZ25lZCBzaG9ydCB2YWx1ZSBpbiB7QGxpbmsgI2IgYn0sCisgICAgICogICAgICAgIHdob3NlIHZhbHVlIGlzIHRoZSBpbmRleCBvZiBhbiBVVEY4IGNvbnN0YW50IHBvb2wgaXRlbS4KKyAgICAgKiBAcGFyYW0gYnVmIGJ1ZmZlciB0byBiZSB1c2VkIHRvIHJlYWQgdGhlIGl0ZW0uIFRoaXMgYnVmZmVyIG11c3QgYmUKKyAgICAgKiAgICAgICAgc3VmZmljaWVudGx5IGxhcmdlLiBJdCBpcyBub3QgYXV0b21hdGljYWxseSByZXNpemVkLgorICAgICAqIEByZXR1cm4gdGhlIFN0cmluZyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgVVRGOCBpdGVtLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgcmVhZFVURjgoaW50IGluZGV4LCBmaW5hbCBjaGFyW10gYnVmKSB7CisgICAgICAgIGludCBpdGVtID0gcmVhZFVuc2lnbmVkU2hvcnQoaW5kZXgpOworICAgICAgICBTdHJpbmcgcyA9IHN0cmluZ3NbaXRlbV07CisgICAgICAgIGlmIChzICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBzOworICAgICAgICB9CisgICAgICAgIGluZGV4ID0gaXRlbXNbaXRlbV07CisgICAgICAgIHJldHVybiBzdHJpbmdzW2l0ZW1dID0gcmVhZFVURihpbmRleCArIDIsIHJlYWRVbnNpZ25lZFNob3J0KGluZGV4KSwgYnVmKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkcyBVVEY4IHN0cmluZyBpbiB7QGxpbmsgI2IgYn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5kZXggc3RhcnQgb2Zmc2V0IG9mIHRoZSBVVEY4IHN0cmluZyB0byBiZSByZWFkLgorICAgICAqIEBwYXJhbSB1dGZMZW4gbGVuZ3RoIG9mIHRoZSBVVEY4IHN0cmluZyB0byBiZSByZWFkLgorICAgICAqIEBwYXJhbSBidWYgYnVmZmVyIHRvIGJlIHVzZWQgdG8gcmVhZCB0aGUgc3RyaW5nLiBUaGlzIGJ1ZmZlciBtdXN0IGJlCisgICAgICogICAgICAgIHN1ZmZpY2llbnRseSBsYXJnZS4gSXQgaXMgbm90IGF1dG9tYXRpY2FsbHkgcmVzaXplZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBTdHJpbmcgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIFVURjggc3RyaW5nLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHJlYWRVVEYoaW50IGluZGV4LCBmaW5hbCBpbnQgdXRmTGVuLCBmaW5hbCBjaGFyW10gYnVmKSB7CisgICAgICAgIGludCBlbmRJbmRleCA9IGluZGV4ICsgdXRmTGVuOworICAgICAgICBieXRlW10gYiA9IHRoaXMuYjsKKyAgICAgICAgaW50IHN0ckxlbiA9IDA7CisgICAgICAgIGludCBjOworICAgICAgICBpbnQgc3QgPSAwOworICAgICAgICBjaGFyIGNjID0gMDsKKyAgICAgICAgd2hpbGUgKGluZGV4IDwgZW5kSW5kZXgpIHsKKyAgICAgICAgICAgIGMgPSBiW2luZGV4KytdOworICAgICAgICAgICAgc3dpdGNoIChzdCkgeworICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgYyA9IGMgJiAweEZGOworICAgICAgICAgICAgICAgICAgICBpZiAoYyA8IDB4ODApIHsgIC8vIDB4eHh4eHh4CisgICAgICAgICAgICAgICAgICAgICAgICBidWZbc3RyTGVuKytdID0gKGNoYXIpIGM7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA8IDB4RTAgJiYgYyA+IDB4QkYpIHsgIC8vIDExMHggeHh4eCAxMHh4IHh4eHgKKyAgICAgICAgICAgICAgICAgICAgICAgIGNjID0gKGNoYXIpIChjICYgMHgxRik7CisgICAgICAgICAgICAgICAgICAgICAgICBzdCA9IDE7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAvLyAxMTEwIHh4eHggMTB4eCB4eHh4IDEweHggeHh4eAorICAgICAgICAgICAgICAgICAgICAgICAgY2MgPSAoY2hhcikgKGMgJiAweDBGKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ID0gMjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgMTogIC8vIGJ5dGUgMiBvZiAyLWJ5dGUgY2hhciBvciBieXRlIDMgb2YgMy1ieXRlIGNoYXIKKyAgICAgICAgICAgICAgICAgICAgYnVmW3N0ckxlbisrXSA9IChjaGFyKSAoKGNjIDw8IDYpIHwgKGMgJiAweDNGKSk7CisgICAgICAgICAgICAgICAgICAgIHN0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIDI6ICAvLyBieXRlIDIgb2YgMy1ieXRlIGNoYXIKKyAgICAgICAgICAgICAgICAgICAgY2MgPSAoY2hhcikgKChjYyA8PCA2KSB8IChjICYgMHgzRikpOworICAgICAgICAgICAgICAgICAgICBzdCA9IDE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGJ1ZiwgMCwgc3RyTGVuKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkcyBhIGNsYXNzIGNvbnN0YW50IHBvb2wgaXRlbSBpbiB7QGxpbmsgI2IgYn0uIDxpPlRoaXMgbWV0aG9kIGlzCisgICAgICogaW50ZW5kZWQgZm9yIHtAbGluayBBdHRyaWJ1dGV9IHN1YiBjbGFzc2VzLCBhbmQgaXMgbm9ybWFsbHkgbm90IG5lZWRlZCBieQorICAgICAqIGNsYXNzIGdlbmVyYXRvcnMgb3IgYWRhcHRlcnMuPC9pPgorICAgICAqCisgICAgICogQHBhcmFtIGluZGV4IHRoZSBzdGFydCBpbmRleCBvZiBhbiB1bnNpZ25lZCBzaG9ydCB2YWx1ZSBpbiB7QGxpbmsgI2IgYn0sCisgICAgICogICAgICAgIHdob3NlIHZhbHVlIGlzIHRoZSBpbmRleCBvZiBhIGNsYXNzIGNvbnN0YW50IHBvb2wgaXRlbS4KKyAgICAgKiBAcGFyYW0gYnVmIGJ1ZmZlciB0byBiZSB1c2VkIHRvIHJlYWQgdGhlIGl0ZW0uIFRoaXMgYnVmZmVyIG11c3QgYmUKKyAgICAgKiAgICAgICAgc3VmZmljaWVudGx5IGxhcmdlLiBJdCBpcyBub3QgYXV0b21hdGljYWxseSByZXNpemVkLgorICAgICAqIEByZXR1cm4gdGhlIFN0cmluZyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXRlbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHJlYWRDbGFzcyhmaW5hbCBpbnQgaW5kZXgsIGZpbmFsIGNoYXJbXSBidWYpIHsKKyAgICAgICAgLy8gY29tcHV0ZXMgdGhlIHN0YXJ0IGluZGV4IG9mIHRoZSBDT05TVEFOVF9DbGFzcyBpdGVtIGluIGIKKyAgICAgICAgLy8gYW5kIHJlYWRzIHRoZSBDT05TVEFOVF9VdGY4IGl0ZW0gZGVzaWduYXRlZCBieQorICAgICAgICAvLyB0aGUgZmlyc3QgdHdvIGJ5dGVzIG9mIHRoaXMgQ09OU1RBTlRfQ2xhc3MgaXRlbQorICAgICAgICByZXR1cm4gcmVhZFVURjgoaXRlbXNbcmVhZFVuc2lnbmVkU2hvcnQoaW5kZXgpXSwgYnVmKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkcyBhIG51bWVyaWMgb3Igc3RyaW5nIGNvbnN0YW50IHBvb2wgaXRlbSBpbiB7QGxpbmsgI2IgYn0uIDxpPlRoaXMKKyAgICAgKiBtZXRob2QgaXMgaW50ZW5kZWQgZm9yIHtAbGluayBBdHRyaWJ1dGV9IHN1YiBjbGFzc2VzLCBhbmQgaXMgbm9ybWFsbHkgbm90CisgICAgICogbmVlZGVkIGJ5IGNsYXNzIGdlbmVyYXRvcnMgb3IgYWRhcHRlcnMuPC9pPgorICAgICAqCisgICAgICogQHBhcmFtIGl0ZW0gdGhlIGluZGV4IG9mIGEgY29uc3RhbnQgcG9vbCBpdGVtLgorICAgICAqIEBwYXJhbSBidWYgYnVmZmVyIHRvIGJlIHVzZWQgdG8gcmVhZCB0aGUgaXRlbS4gVGhpcyBidWZmZXIgbXVzdCBiZQorICAgICAqICAgICAgICBzdWZmaWNpZW50bHkgbGFyZ2UuIEl0IGlzIG5vdCBhdXRvbWF0aWNhbGx5IHJlc2l6ZWQuCisgICAgICogQHJldHVybiB0aGUge0BsaW5rIEludGVnZXJ9LCB7QGxpbmsgRmxvYXR9LCB7QGxpbmsgTG9uZ30sIHtAbGluayBEb3VibGV9LAorICAgICAqICAgICAgICAge0BsaW5rIFN0cmluZ30sIHtAbGluayBUeXBlfSBvciB7QGxpbmsgSGFuZGxlfSBjb3JyZXNwb25kaW5nIHRvCisgICAgICogICAgICAgICB0aGUgZ2l2ZW4gY29uc3RhbnQgcG9vbCBpdGVtLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgcmVhZENvbnN0KGZpbmFsIGludCBpdGVtLCBmaW5hbCBjaGFyW10gYnVmKSB7CisgICAgICAgIGludCBpbmRleCA9IGl0ZW1zW2l0ZW1dOworICAgICAgICBzd2l0Y2ggKGJbaW5kZXggLSAxXSkgeworICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5JTlQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnRlZ2VyKHJlYWRJbnQoaW5kZXgpKTsKKyAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuRkxPQVQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGbG9hdChGbG9hdC5pbnRCaXRzVG9GbG9hdChyZWFkSW50KGluZGV4KSkpOworICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5MT05HOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTG9uZyhyZWFkTG9uZyhpbmRleCkpOworICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5ET1VCTEU6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEb3VibGUoRG91YmxlLmxvbmdCaXRzVG9Eb3VibGUocmVhZExvbmcoaW5kZXgpKSk7CisgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLkNMQVNTOgorICAgICAgICAgICAgICAgIHJldHVybiBUeXBlLmdldE9iamVjdFR5cGUocmVhZFVURjgoaW5kZXgsIGJ1ZikpOworICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5TVFI6CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWRVVEY4KGluZGV4LCBidWYpOworICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5NVFlQRToKKyAgICAgICAgICAgICAgICByZXR1cm4gVHlwZS5nZXRNZXRob2RUeXBlKHJlYWRVVEY4KGluZGV4LCBidWYpKTsKKworICAgICAgICAgICAgLy9jYXNlIENsYXNzV3JpdGVyLkhBTkRMRV9CQVNFICsgWzEuLjldOgorICAgICAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgICAgIGludCB0YWcgPSByZWFkQnl0ZShpbmRleCk7CisgICAgICAgICAgICAgICAgaW50W10gaXRlbXMgPSB0aGlzLml0ZW1zOworICAgICAgICAgICAgICAgIGludCBjcEluZGV4ID0gaXRlbXNbcmVhZFVuc2lnbmVkU2hvcnQoaW5kZXggKyAxKV07CisgICAgICAgICAgICAgICAgU3RyaW5nIG93bmVyID0gcmVhZENsYXNzKGNwSW5kZXgsIGJ1Zik7CisgICAgICAgICAgICAgICAgY3BJbmRleCA9IGl0ZW1zW3JlYWRVbnNpZ25lZFNob3J0KGNwSW5kZXggKyAyKV07CisgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSByZWFkVVRGOChjcEluZGV4LCBidWYpOworICAgICAgICAgICAgICAgIFN0cmluZyBkZXNjID0gcmVhZFVURjgoY3BJbmRleCArIDIsIGJ1Zik7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBIYW5kbGUodGFnLCBvd25lciwgbmFtZSwgZGVzYyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL0NsYXNzVmlzaXRvci5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS9DbGFzc1Zpc2l0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzA5NmZhCi0tLSAvZGV2L251bGwKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS9DbGFzc1Zpc2l0b3IuamF2YQpAQCAtMCwwICsxLDMwNiBAQAorLyoKKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgT3JhY2xlIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCisgKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CisgKiBxdWVzdGlvbnMuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBpcyBhdmFpbGFibGUgdW5kZXIgYW5kIGdvdmVybmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogSG93ZXZlciwgdGhlIGZvbGxvd2luZyBub3RpY2UgYWNjb21wYW5pZWQgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhpcworICogZmlsZToKKyAqCisgKiBBU006IGEgdmVyeSBzbWFsbCBhbmQgZmFzdCBKYXZhIGJ5dGVjb2RlIG1hbmlwdWxhdGlvbiBmcmFtZXdvcmsKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDExIElOUklBLCBGcmFuY2UgVGVsZWNvbQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbTsKKworLyoqCisgKiBBIHZpc2l0b3IgdG8gdmlzaXQgYSBKYXZhIGNsYXNzLiBUaGUgbWV0aG9kcyBvZiB0aGlzIGNsYXNzIG11c3QgYmUgY2FsbGVkCisgKiBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOiA8dHQ+dmlzaXQ8L3R0PiBbIDx0dD52aXNpdFNvdXJjZTwvdHQ+IF0gWworICogPHR0PnZpc2l0T3V0ZXJDbGFzczwvdHQ+IF0gKCA8dHQ+dmlzaXRBbm5vdGF0aW9uPC90dD4gfAorICogPHR0PnZpc2l0QXR0cmlidXRlPC90dD4gKSogKCA8dHQ+dmlzaXRJbm5lckNsYXNzPC90dD4gfAorICogPHR0PnZpc2l0RmllbGQ8L3R0PiB8IDx0dD52aXNpdE1ldGhvZDwvdHQ+ICkqIDx0dD52aXNpdEVuZDwvdHQ+LgorICoKKyAqIEBhdXRob3IgRXJpYyBCcnVuZXRvbgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ2xhc3NWaXNpdG9yIHsKKworICAgIC8qKgorICAgICAqIFRoZSBBU00gQVBJIHZlcnNpb24gaW1wbGVtZW50ZWQgYnkgdGhpcyB2aXNpdG9yLiBUaGUgdmFsdWUgb2YgdGhpcyBmaWVsZAorICAgICAqIG11c3QgYmUgb25lIG9mIHtAbGluayBPcGNvZGVzI0FTTTR9LgorICAgICAqLworICAgIHByb3RlY3RlZCBmaW5hbCBpbnQgYXBpOworCisgICAgLyoqCisgICAgICogVGhlIGNsYXNzIHZpc2l0b3IgdG8gd2hpY2ggdGhpcyB2aXNpdG9yIG11c3QgZGVsZWdhdGUgbWV0aG9kIGNhbGxzLiBNYXkKKyAgICAgKiBiZSBudWxsLgorICAgICAqLworICAgIHByb3RlY3RlZCBDbGFzc1Zpc2l0b3IgY3Y7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAbGluayBDbGFzc1Zpc2l0b3J9LgorICAgICAqCisgICAgICogQHBhcmFtIGFwaSB0aGUgQVNNIEFQSSB2ZXJzaW9uIGltcGxlbWVudGVkIGJ5IHRoaXMgdmlzaXRvci4gTXVzdCBiZSBvbmUKKyAgICAgKiAgICAgICAgb2Yge0BsaW5rIE9wY29kZXMjQVNNNH0uCisgICAgICovCisgICAgcHVibGljIENsYXNzVmlzaXRvcihmaW5hbCBpbnQgYXBpKSB7CisgICAgICAgIHRoaXMoYXBpLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAbGluayBDbGFzc1Zpc2l0b3J9LgorICAgICAqCisgICAgICogQHBhcmFtIGFwaSB0aGUgQVNNIEFQSSB2ZXJzaW9uIGltcGxlbWVudGVkIGJ5IHRoaXMgdmlzaXRvci4gTXVzdCBiZSBvbmUKKyAgICAgKiAgICAgICAgb2Yge0BsaW5rIE9wY29kZXMjQVNNNH0uCisgICAgICogQHBhcmFtIGN2IHRoZSBjbGFzcyB2aXNpdG9yIHRvIHdoaWNoIHRoaXMgdmlzaXRvciBtdXN0IGRlbGVnYXRlIG1ldGhvZAorICAgICAqICAgICAgICBjYWxscy4gTWF5IGJlIG51bGwuCisgICAgICovCisgICAgcHVibGljIENsYXNzVmlzaXRvcihmaW5hbCBpbnQgYXBpLCBmaW5hbCBDbGFzc1Zpc2l0b3IgY3YpIHsKKyAgICAgICAgLyppZiAoYXBpICE9IE9wY29kZXMuQVNNNCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICB9Ki8KKyAgICAgICAgdGhpcy5hcGkgPSBhcGk7CisgICAgICAgIHRoaXMuY3YgPSBjdjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWaXNpdHMgdGhlIGhlYWRlciBvZiB0aGUgY2xhc3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmVyc2lvbiB0aGUgY2xhc3MgdmVyc2lvbi4KKyAgICAgKiBAcGFyYW0gYWNjZXNzIHRoZSBjbGFzcydzIGFjY2VzcyBmbGFncyAoc2VlIHtAbGluayBPcGNvZGVzfSkuIFRoaXMKKyAgICAgKiAgICAgICAgcGFyYW1ldGVyIGFsc28gaW5kaWNhdGVzIGlmIHRoZSBjbGFzcyBpcyBkZXByZWNhdGVkLgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBpbnRlcm5hbCBuYW1lIG9mIHRoZSBjbGFzcyAoc2VlCisgICAgICogICAgICAgIHtAbGluayBUeXBlI2dldEludGVybmFsTmFtZSgpIGdldEludGVybmFsTmFtZX0pLgorICAgICAqIEBwYXJhbSBzaWduYXR1cmUgdGhlIHNpZ25hdHVyZSBvZiB0aGlzIGNsYXNzLiBNYXkgYmUgPHR0Pm51bGw8L3R0PiBpZgorICAgICAqICAgICAgICB0aGUgY2xhc3MgaXMgbm90IGEgZ2VuZXJpYyBvbmUsIGFuZCBkb2VzIG5vdCBleHRlbmQgb3IgaW1wbGVtZW50CisgICAgICogICAgICAgIGdlbmVyaWMgY2xhc3NlcyBvciBpbnRlcmZhY2VzLgorICAgICAqIEBwYXJhbSBzdXBlck5hbWUgdGhlIGludGVybmFsIG9mIG5hbWUgb2YgdGhlIHN1cGVyIGNsYXNzIChzZWUKKyAgICAgKiAgICAgICAge0BsaW5rIFR5cGUjZ2V0SW50ZXJuYWxOYW1lKCkgZ2V0SW50ZXJuYWxOYW1lfSkuIEZvciBpbnRlcmZhY2VzLAorICAgICAqICAgICAgICB0aGUgc3VwZXIgY2xhc3MgaXMge0BsaW5rIE9iamVjdH0uIE1heSBiZSA8dHQ+bnVsbDwvdHQ+LCBidXQKKyAgICAgKiAgICAgICAgb25seSBmb3IgdGhlIHtAbGluayBPYmplY3R9IGNsYXNzLgorICAgICAqIEBwYXJhbSBpbnRlcmZhY2VzIHRoZSBpbnRlcm5hbCBuYW1lcyBvZiB0aGUgY2xhc3MncyBpbnRlcmZhY2VzIChzZWUKKyAgICAgKiAgICAgICAge0BsaW5rIFR5cGUjZ2V0SW50ZXJuYWxOYW1lKCkgZ2V0SW50ZXJuYWxOYW1lfSkuIE1heSBiZQorICAgICAqICAgICAgICA8dHQ+bnVsbDwvdHQ+LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZpc2l0KAorICAgICAgICBpbnQgdmVyc2lvbiwKKyAgICAgICAgaW50IGFjY2VzcywKKyAgICAgICAgU3RyaW5nIG5hbWUsCisgICAgICAgIFN0cmluZyBzaWduYXR1cmUsCisgICAgICAgIFN0cmluZyBzdXBlck5hbWUsCisgICAgICAgIFN0cmluZ1tdIGludGVyZmFjZXMpCisgICAgeworICAgICAgICBpZiAoY3YgIT0gbnVsbCkgeworICAgICAgICAgICAgY3YudmlzaXQodmVyc2lvbiwgYWNjZXNzLCBuYW1lLCBzaWduYXR1cmUsIHN1cGVyTmFtZSwgaW50ZXJmYWNlcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWaXNpdHMgdGhlIHNvdXJjZSBvZiB0aGUgY2xhc3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc291cmNlIHRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZSBmcm9tIHdoaWNoIHRoZSBjbGFzcyB3YXMKKyAgICAgKiAgICAgICAgY29tcGlsZWQuIE1heSBiZSA8dHQ+bnVsbDwvdHQ+LgorICAgICAqIEBwYXJhbSBkZWJ1ZyBhZGRpdGlvbmFsIGRlYnVnIGluZm9ybWF0aW9uIHRvIGNvbXB1dGUgdGhlIGNvcnJlc3BvbmRhbmNlCisgICAgICogICAgICAgIGJldHdlZW4gc291cmNlIGFuZCBjb21waWxlZCBlbGVtZW50cyBvZiB0aGUgY2xhc3MuIE1heSBiZQorICAgICAqICAgICAgICA8dHQ+bnVsbDwvdHQ+LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZpc2l0U291cmNlKFN0cmluZyBzb3VyY2UsIFN0cmluZyBkZWJ1ZykgeworICAgICAgICBpZiAoY3YgIT0gbnVsbCkgeworICAgICAgICAgICAgY3YudmlzaXRTb3VyY2Uoc291cmNlLCBkZWJ1Zyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWaXNpdHMgdGhlIGVuY2xvc2luZyBjbGFzcyBvZiB0aGUgY2xhc3MuIFRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIG9ubHkKKyAgICAgKiBpZiB0aGUgY2xhc3MgaGFzIGFuIGVuY2xvc2luZyBjbGFzcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvd25lciBpbnRlcm5hbCBuYW1lIG9mIHRoZSBlbmNsb3NpbmcgY2xhc3Mgb2YgdGhlIGNsYXNzLgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBtZXRob2QgdGhhdCBjb250YWlucyB0aGUgY2xhc3MsIG9yCisgICAgICogICAgICAgIDx0dD5udWxsPC90dD4gaWYgdGhlIGNsYXNzIGlzIG5vdCBlbmNsb3NlZCBpbiBhIG1ldGhvZCBvZiBpdHMKKyAgICAgKiAgICAgICAgZW5jbG9zaW5nIGNsYXNzLgorICAgICAqIEBwYXJhbSBkZXNjIHRoZSBkZXNjcmlwdG9yIG9mIHRoZSBtZXRob2QgdGhhdCBjb250YWlucyB0aGUgY2xhc3MsIG9yCisgICAgICogICAgICAgIDx0dD5udWxsPC90dD4gaWYgdGhlIGNsYXNzIGlzIG5vdCBlbmNsb3NlZCBpbiBhIG1ldGhvZCBvZiBpdHMKKyAgICAgKiAgICAgICAgZW5jbG9zaW5nIGNsYXNzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZpc2l0T3V0ZXJDbGFzcyhTdHJpbmcgb3duZXIsIFN0cmluZyBuYW1lLCBTdHJpbmcgZGVzYykgeworICAgICAgICBpZiAoY3YgIT0gbnVsbCkgIHsKKyAgICAgICAgICAgIGN2LnZpc2l0T3V0ZXJDbGFzcyhvd25lciwgbmFtZSwgZGVzYyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWaXNpdHMgYW4gYW5ub3RhdGlvbiBvZiB0aGUgY2xhc3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGVzYyB0aGUgY2xhc3MgZGVzY3JpcHRvciBvZiB0aGUgYW5ub3RhdGlvbiBjbGFzcy4KKyAgICAgKiBAcGFyYW0gdmlzaWJsZSA8dHQ+dHJ1ZTwvdHQ+IGlmIHRoZSBhbm5vdGF0aW9uIGlzIHZpc2libGUgYXQgcnVudGltZS4KKyAgICAgKiBAcmV0dXJuIGEgdmlzaXRvciB0byB2aXNpdCB0aGUgYW5ub3RhdGlvbiB2YWx1ZXMsIG9yIDx0dD5udWxsPC90dD4gaWYKKyAgICAgKiAgICAgICAgIHRoaXMgdmlzaXRvciBpcyBub3QgaW50ZXJlc3RlZCBpbiB2aXNpdGluZyB0aGlzIGFubm90YXRpb24uCisgICAgICovCisgICAgcHVibGljIEFubm90YXRpb25WaXNpdG9yIHZpc2l0QW5ub3RhdGlvbihTdHJpbmcgZGVzYywgYm9vbGVhbiB2aXNpYmxlKSB7CisgICAgICAgIGlmIChjdiAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gY3YudmlzaXRBbm5vdGF0aW9uKGRlc2MsIHZpc2libGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZpc2l0cyBhIG5vbiBzdGFuZGFyZCBhdHRyaWJ1dGUgb2YgdGhlIGNsYXNzLgorICAgICAqCisgICAgICogQHBhcmFtIGF0dHIgYW4gYXR0cmlidXRlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZpc2l0QXR0cmlidXRlKEF0dHJpYnV0ZSBhdHRyKSB7CisgICAgICAgIGlmIChjdiAhPSBudWxsKSB7CisgICAgICAgICAgICBjdi52aXNpdEF0dHJpYnV0ZShhdHRyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFZpc2l0cyBpbmZvcm1hdGlvbiBhYm91dCBhbiBpbm5lciBjbGFzcy4gVGhpcyBpbm5lciBjbGFzcyBpcyBub3QKKyAgICAgKiBuZWNlc3NhcmlseSBhIG1lbWJlciBvZiB0aGUgY2xhc3MgYmVpbmcgdmlzaXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBpbnRlcm5hbCBuYW1lIG9mIGFuIGlubmVyIGNsYXNzIChzZWUKKyAgICAgKiAgICAgICAge0BsaW5rIFR5cGUjZ2V0SW50ZXJuYWxOYW1lKCkgZ2V0SW50ZXJuYWxOYW1lfSkuCisgICAgICogQHBhcmFtIG91dGVyTmFtZSB0aGUgaW50ZXJuYWwgbmFtZSBvZiB0aGUgY2xhc3MgdG8gd2hpY2ggdGhlIGlubmVyIGNsYXNzCisgICAgICogICAgICAgIGJlbG9uZ3MgKHNlZSB7QGxpbmsgVHlwZSNnZXRJbnRlcm5hbE5hbWUoKSBnZXRJbnRlcm5hbE5hbWV9KS4gTWF5CisgICAgICogICAgICAgIGJlIDx0dD5udWxsPC90dD4gZm9yIG5vdCBtZW1iZXIgY2xhc3Nlcy4KKyAgICAgKiBAcGFyYW0gaW5uZXJOYW1lIHRoZSAoc2ltcGxlKSBuYW1lIG9mIHRoZSBpbm5lciBjbGFzcyBpbnNpZGUgaXRzCisgICAgICogICAgICAgIGVuY2xvc2luZyBjbGFzcy4gTWF5IGJlIDx0dD5udWxsPC90dD4gZm9yIGFub255bW91cyBpbm5lcgorICAgICAqICAgICAgICBjbGFzc2VzLgorICAgICAqIEBwYXJhbSBhY2Nlc3MgdGhlIGFjY2VzcyBmbGFncyBvZiB0aGUgaW5uZXIgY2xhc3MgYXMgb3JpZ2luYWxseSBkZWNsYXJlZAorICAgICAqICAgICAgICBpbiB0aGUgZW5jbG9zaW5nIGNsYXNzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZpc2l0SW5uZXJDbGFzcygKKyAgICAgICAgU3RyaW5nIG5hbWUsCisgICAgICAgIFN0cmluZyBvdXRlck5hbWUsCisgICAgICAgIFN0cmluZyBpbm5lck5hbWUsCisgICAgICAgIGludCBhY2Nlc3MpCisgICAgeworICAgICAgICBpZiAoY3YgIT0gbnVsbCkgeworICAgICAgICAgICAgY3YudmlzaXRJbm5lckNsYXNzKG5hbWUsIG91dGVyTmFtZSwgaW5uZXJOYW1lLCBhY2Nlc3MpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVmlzaXRzIGEgZmllbGQgb2YgdGhlIGNsYXNzLgorICAgICAqCisgICAgICogQHBhcmFtIGFjY2VzcyB0aGUgZmllbGQncyBhY2Nlc3MgZmxhZ3MgKHNlZSB7QGxpbmsgT3Bjb2Rlc30pLiBUaGlzCisgICAgICogICAgICAgIHBhcmFtZXRlciBhbHNvIGluZGljYXRlcyBpZiB0aGUgZmllbGQgaXMgc3ludGhldGljIGFuZC9vcgorICAgICAqICAgICAgICBkZXByZWNhdGVkLgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBmaWVsZCdzIG5hbWUuCisgICAgICogQHBhcmFtIGRlc2MgdGhlIGZpZWxkJ3MgZGVzY3JpcHRvciAoc2VlIHtAbGluayBUeXBlIFR5cGV9KS4KKyAgICAgKiBAcGFyYW0gc2lnbmF0dXJlIHRoZSBmaWVsZCdzIHNpZ25hdHVyZS4gTWF5IGJlIDx0dD5udWxsPC90dD4gaWYgdGhlCisgICAgICogICAgICAgIGZpZWxkJ3MgdHlwZSBkb2VzIG5vdCB1c2UgZ2VuZXJpYyB0eXBlcy4KKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIGZpZWxkJ3MgaW5pdGlhbCB2YWx1ZS4gVGhpcyBwYXJhbWV0ZXIsIHdoaWNoIG1heSBiZQorICAgICAqICAgICAgICA8dHQ+bnVsbDwvdHQ+IGlmIHRoZSBmaWVsZCBkb2VzIG5vdCBoYXZlIGFuIGluaXRpYWwgdmFsdWUsIG11c3QKKyAgICAgKiAgICAgICAgYmUgYW4ge0BsaW5rIEludGVnZXJ9LCBhIHtAbGluayBGbG9hdH0sIGEge0BsaW5rIExvbmd9LCBhCisgICAgICogICAgICAgIHtAbGluayBEb3VibGV9IG9yIGEge0BsaW5rIFN0cmluZ30gKGZvciA8dHQ+aW50PC90dD4sCisgICAgICogICAgICAgIDx0dD5mbG9hdDwvdHQ+LCA8dHQ+bG9uZzwvdHQ+IG9yIDx0dD5TdHJpbmc8L3R0PiBmaWVsZHMKKyAgICAgKiAgICAgICAgcmVzcGVjdGl2ZWx5KS4gPGk+VGhpcyBwYXJhbWV0ZXIgaXMgb25seSB1c2VkIGZvciBzdGF0aWMgZmllbGRzPC9pPi4KKyAgICAgKiAgICAgICAgSXRzIHZhbHVlIGlzIGlnbm9yZWQgZm9yIG5vbiBzdGF0aWMgZmllbGRzLCB3aGljaCBtdXN0IGJlCisgICAgICogICAgICAgIGluaXRpYWxpemVkIHRocm91Z2ggYnl0ZWNvZGUgaW5zdHJ1Y3Rpb25zIGluIGNvbnN0cnVjdG9ycyBvcgorICAgICAqICAgICAgICBtZXRob2RzLgorICAgICAqIEByZXR1cm4gYSB2aXNpdG9yIHRvIHZpc2l0IGZpZWxkIGFubm90YXRpb25zIGFuZCBhdHRyaWJ1dGVzLCBvcgorICAgICAqICAgICAgICAgPHR0Pm51bGw8L3R0PiBpZiB0aGlzIGNsYXNzIHZpc2l0b3IgaXMgbm90IGludGVyZXN0ZWQgaW4KKyAgICAgKiAgICAgICAgIHZpc2l0aW5nIHRoZXNlIGFubm90YXRpb25zIGFuZCBhdHRyaWJ1dGVzLgorICAgICAqLworICAgIHB1YmxpYyBGaWVsZFZpc2l0b3IgdmlzaXRGaWVsZCgKKyAgICAgICAgaW50IGFjY2VzcywKKyAgICAgICAgU3RyaW5nIG5hbWUsCisgICAgICAgIFN0cmluZyBkZXNjLAorICAgICAgICBTdHJpbmcgc2lnbmF0dXJlLAorICAgICAgICBPYmplY3QgdmFsdWUpCisgICAgeworICAgICAgICBpZiAoY3YgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGN2LnZpc2l0RmllbGQoYWNjZXNzLCBuYW1lLCBkZXNjLCBzaWduYXR1cmUsIHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWaXNpdHMgYSBtZXRob2Qgb2YgdGhlIGNsYXNzLiBUaGlzIG1ldGhvZCA8aT5tdXN0PC9pPiByZXR1cm4gYSBuZXcKKyAgICAgKiB7QGxpbmsgTWV0aG9kVmlzaXRvcn0gaW5zdGFuY2UgKG9yIDx0dD5udWxsPC90dD4pIGVhY2ggdGltZSBpdCBpcworICAgICAqIGNhbGxlZCwgaS5lLiwgaXQgc2hvdWxkIG5vdCByZXR1cm4gYSBwcmV2aW91c2x5IHJldHVybmVkIHZpc2l0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWNjZXNzIHRoZSBtZXRob2QncyBhY2Nlc3MgZmxhZ3MgKHNlZSB7QGxpbmsgT3Bjb2Rlc30pLiBUaGlzCisgICAgICogICAgICAgIHBhcmFtZXRlciBhbHNvIGluZGljYXRlcyBpZiB0aGUgbWV0aG9kIGlzIHN5bnRoZXRpYyBhbmQvb3IKKyAgICAgKiAgICAgICAgZGVwcmVjYXRlZC4KKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbWV0aG9kJ3MgbmFtZS4KKyAgICAgKiBAcGFyYW0gZGVzYyB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRvciAoc2VlIHtAbGluayBUeXBlIFR5cGV9KS4KKyAgICAgKiBAcGFyYW0gc2lnbmF0dXJlIHRoZSBtZXRob2QncyBzaWduYXR1cmUuIE1heSBiZSA8dHQ+bnVsbDwvdHQ+IGlmIHRoZQorICAgICAqICAgICAgICBtZXRob2QgcGFyYW1ldGVycywgcmV0dXJuIHR5cGUgYW5kIGV4Y2VwdGlvbnMgZG8gbm90IHVzZSBnZW5lcmljCisgICAgICogICAgICAgIHR5cGVzLgorICAgICAqIEBwYXJhbSBleGNlcHRpb25zIHRoZSBpbnRlcm5hbCBuYW1lcyBvZiB0aGUgbWV0aG9kJ3MgZXhjZXB0aW9uIGNsYXNzZXMKKyAgICAgKiAgICAgICAgKHNlZSB7QGxpbmsgVHlwZSNnZXRJbnRlcm5hbE5hbWUoKSBnZXRJbnRlcm5hbE5hbWV9KS4gTWF5IGJlCisgICAgICogICAgICAgIDx0dD5udWxsPC90dD4uCisgICAgICogQHJldHVybiBhbiBvYmplY3QgdG8gdmlzaXQgdGhlIGJ5dGUgY29kZSBvZiB0aGUgbWV0aG9kLCBvciA8dHQ+bnVsbDwvdHQ+CisgICAgICogICAgICAgICBpZiB0aGlzIGNsYXNzIHZpc2l0b3IgaXMgbm90IGludGVyZXN0ZWQgaW4gdmlzaXRpbmcgdGhlIGNvZGUgb2YKKyAgICAgKiAgICAgICAgIHRoaXMgbWV0aG9kLgorICAgICAqLworICAgIHB1YmxpYyBNZXRob2RWaXNpdG9yIHZpc2l0TWV0aG9kKAorICAgICAgICBpbnQgYWNjZXNzLAorICAgICAgICBTdHJpbmcgbmFtZSwKKyAgICAgICAgU3RyaW5nIGRlc2MsCisgICAgICAgIFN0cmluZyBzaWduYXR1cmUsCisgICAgICAgIFN0cmluZ1tdIGV4Y2VwdGlvbnMpCisgICAgeworICAgICAgICBpZiAoY3YgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGN2LnZpc2l0TWV0aG9kKGFjY2VzcywgbmFtZSwgZGVzYywgc2lnbmF0dXJlLCBleGNlcHRpb25zKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWaXNpdHMgdGhlIGVuZCBvZiB0aGUgY2xhc3MuIFRoaXMgbWV0aG9kLCB3aGljaCBpcyB0aGUgbGFzdCBvbmUgdG8gYmUKKyAgICAgKiBjYWxsZWQsIGlzIHVzZWQgdG8gaW5mb3JtIHRoZSB2aXNpdG9yIHRoYXQgYWxsIHRoZSBmaWVsZHMgYW5kIG1ldGhvZHMgb2YKKyAgICAgKiB0aGUgY2xhc3MgaGF2ZSBiZWVuIHZpc2l0ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdmlzaXRFbmQoKSB7CisgICAgICAgIGlmIChjdiAhPSBudWxsKSB7CisgICAgICAgICAgICBjdi52aXNpdEVuZCgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS9DbGFzc1dyaXRlci5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS9DbGFzc1dyaXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzYzk4MjkKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL0NsYXNzV3JpdGVyLmphdmEKQEAgLTAsMCArMSwxNzAxIEBACisvKgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBPcmFjbGUgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKKyAqIHF1ZXN0aW9ucy4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGlzIGF2YWlsYWJsZSB1bmRlciBhbmQgZ292ZXJuZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiBIb3dldmVyLCB0aGUgZm9sbG93aW5nIG5vdGljZSBhY2NvbXBhbmllZCB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGlzCisgKiBmaWxlOgorICoKKyAqIEFTTTogYSB2ZXJ5IHNtYWxsIGFuZCBmYXN0IEphdmEgYnl0ZWNvZGUgbWFuaXB1bGF0aW9uIGZyYW1ld29yaworICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMTEgSU5SSUEsIEZyYW5jZSBUZWxlY29tCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2UgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtOworCisvKioKKyAqIEEge0BsaW5rIENsYXNzVmlzaXRvcn0gdGhhdCBnZW5lcmF0ZXMgY2xhc3NlcyBpbiBieXRlY29kZSBmb3JtLiBNb3JlCisgKiBwcmVjaXNlbHkgdGhpcyB2aXNpdG9yIGdlbmVyYXRlcyBhIGJ5dGUgYXJyYXkgY29uZm9ybWluZyB0byB0aGUgSmF2YSBjbGFzcworICogZmlsZSBmb3JtYXQuIEl0IGNhbiBiZSB1c2VkIGFsb25lLCB0byBnZW5lcmF0ZSBhIEphdmEgY2xhc3MgImZyb20gc2NyYXRjaCIsCisgKiBvciB3aXRoIG9uZSBvciBtb3JlIHtAbGluayBDbGFzc1JlYWRlciBDbGFzc1JlYWRlcn0gYW5kIGFkYXB0ZXIgY2xhc3MgdmlzaXRvcgorICogdG8gZ2VuZXJhdGUgYSBtb2RpZmllZCBjbGFzcyBmcm9tIG9uZSBvciBtb3JlIGV4aXN0aW5nIEphdmEgY2xhc3Nlcy4KKyAqCisgKiBAYXV0aG9yIEVyaWMgQnJ1bmV0b24KKyAqLworcHVibGljIGNsYXNzIENsYXNzV3JpdGVyIGV4dGVuZHMgQ2xhc3NWaXNpdG9yIHsKKworICAgIC8qKgorICAgICAqIEZsYWcgdG8gYXV0b21hdGljYWxseSBjb21wdXRlIHRoZSBtYXhpbXVtIHN0YWNrIHNpemUgYW5kIHRoZSBtYXhpbXVtCisgICAgICogbnVtYmVyIG9mIGxvY2FsIHZhcmlhYmxlcyBvZiBtZXRob2RzLiBJZiB0aGlzIGZsYWcgaXMgc2V0LCB0aGVuIHRoZQorICAgICAqIGFyZ3VtZW50cyBvZiB0aGUge0BsaW5rIE1ldGhvZFZpc2l0b3IjdmlzaXRNYXhzIHZpc2l0TWF4c30gbWV0aG9kIG9mIHRoZQorICAgICAqIHtAbGluayBNZXRob2RWaXNpdG9yfSByZXR1cm5lZCBieSB0aGUge0BsaW5rICN2aXNpdE1ldGhvZCB2aXNpdE1ldGhvZH0KKyAgICAgKiBtZXRob2Qgd2lsbCBiZSBpZ25vcmVkLCBhbmQgY29tcHV0ZWQgYXV0b21hdGljYWxseSBmcm9tIHRoZSBzaWduYXR1cmUgYW5kCisgICAgICogdGhlIGJ5dGVjb2RlIG9mIGVhY2ggbWV0aG9kLgorICAgICAqCisgICAgICogQHNlZSAjQ2xhc3NXcml0ZXIoaW50KQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTVBVVEVfTUFYUyA9IDE7CisKKyAgICAvKioKKyAgICAgKiBGbGFnIHRvIGF1dG9tYXRpY2FsbHkgY29tcHV0ZSB0aGUgc3RhY2sgbWFwIGZyYW1lcyBvZiBtZXRob2RzIGZyb20KKyAgICAgKiBzY3JhdGNoLiBJZiB0aGlzIGZsYWcgaXMgc2V0LCB0aGVuIHRoZSBjYWxscyB0byB0aGUKKyAgICAgKiB7QGxpbmsgTWV0aG9kVmlzaXRvciN2aXNpdEZyYW1lfSBtZXRob2QgYXJlIGlnbm9yZWQsIGFuZCB0aGUgc3RhY2sgbWFwCisgICAgICogZnJhbWVzIGFyZSByZWNvbXB1dGVkIGZyb20gdGhlIG1ldGhvZHMgYnl0ZWNvZGUuIFRoZSBhcmd1bWVudHMgb2YgdGhlCisgICAgICoge0BsaW5rIE1ldGhvZFZpc2l0b3IjdmlzaXRNYXhzIHZpc2l0TWF4c30gbWV0aG9kIGFyZSBhbHNvIGlnbm9yZWQgYW5kCisgICAgICogcmVjb21wdXRlZCBmcm9tIHRoZSBieXRlY29kZS4gSW4gb3RoZXIgd29yZHMsIGNvbXB1dGVGcmFtZXMgaW1wbGllcworICAgICAqIGNvbXB1dGVNYXhzLgorICAgICAqCisgICAgICogQHNlZSAjQ2xhc3NXcml0ZXIoaW50KQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTVBVVEVfRlJBTUVTID0gMjsKKworICAgIC8qKgorICAgICAqIFBzZXVkbyBhY2Nlc3MgZmxhZyB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIHRoZSBzeW50aGV0aWMgYXR0cmlidXRlIGFuZAorICAgICAqIHRoZSBzeW50aGV0aWMgYWNjZXNzIGZsYWcuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBBQ0NfU1lOVEhFVElDX0FUVFJJQlVURSA9IDB4NDAwMDA7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiBpbnN0cnVjdGlvbnMgd2l0aG91dCBhbnkgYXJndW1lbnQuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBOT0FSR19JTlNOID0gMDsKKworICAgIC8qKgorICAgICAqIFRoZSB0eXBlIG9mIGluc3RydWN0aW9ucyB3aXRoIGFuIHNpZ25lZCBieXRlIGFyZ3VtZW50LgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgU0JZVEVfSU5TTiA9IDE7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiBpbnN0cnVjdGlvbnMgd2l0aCBhbiBzaWduZWQgc2hvcnQgYXJndW1lbnQuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBTSE9SVF9JTlNOID0gMjsKKworICAgIC8qKgorICAgICAqIFRoZSB0eXBlIG9mIGluc3RydWN0aW9ucyB3aXRoIGEgbG9jYWwgdmFyaWFibGUgaW5kZXggYXJndW1lbnQuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBWQVJfSU5TTiA9IDM7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiBpbnN0cnVjdGlvbnMgd2l0aCBhbiBpbXBsaWNpdCBsb2NhbCB2YXJpYWJsZSBpbmRleCBhcmd1bWVudC4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IElNUExWQVJfSU5TTiA9IDQ7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiBpbnN0cnVjdGlvbnMgd2l0aCBhIHR5cGUgZGVzY3JpcHRvciBhcmd1bWVudC4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IFRZUEVfSU5TTiA9IDU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiBmaWVsZCBhbmQgbWV0aG9kIGludm9jYXRpb25zIGluc3RydWN0aW9ucy4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IEZJRUxET1JNRVRIX0lOU04gPSA2OworCisgICAgLyoqCisgICAgICogVGhlIHR5cGUgb2YgdGhlIElOVk9LRUlOVEVSRkFDRS9JTlZPS0VEWU5BTUlDIGluc3RydWN0aW9uLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgSVRGTUVUSF9JTlNOID0gNzsKKworICAgIC8qKgorICAgICAqIFRoZSB0eXBlIG9mIHRoZSBJTlZPS0VEWU5BTUlDIGluc3RydWN0aW9uLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgSU5EWU1FVEhfSU5TTiA9IDg7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiBpbnN0cnVjdGlvbnMgd2l0aCBhIDIgYnl0ZXMgYnl0ZWNvZGUgb2Zmc2V0IGxhYmVsLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgTEFCRUxfSU5TTiA9IDk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiBpbnN0cnVjdGlvbnMgd2l0aCBhIDQgYnl0ZXMgYnl0ZWNvZGUgb2Zmc2V0IGxhYmVsLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgTEFCRUxXX0lOU04gPSAxMDsKKworICAgIC8qKgorICAgICAqIFRoZSB0eXBlIG9mIHRoZSBMREMgaW5zdHJ1Y3Rpb24uCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBMRENfSU5TTiA9IDExOworCisgICAgLyoqCisgICAgICogVGhlIHR5cGUgb2YgdGhlIExEQ19XIGFuZCBMREMyX1cgaW5zdHJ1Y3Rpb25zLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgTERDV19JTlNOID0gMTI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiB0aGUgSUlOQyBpbnN0cnVjdGlvbi4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IElJTkNfSU5TTiA9IDEzOworCisgICAgLyoqCisgICAgICogVGhlIHR5cGUgb2YgdGhlIFRBQkxFU1dJVENIIGluc3RydWN0aW9uLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgVEFCTF9JTlNOID0gMTQ7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiB0aGUgTE9PS1VQU1dJVENIIGluc3RydWN0aW9uLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgTE9PS19JTlNOID0gMTU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiB0aGUgTVVMVElBTkVXQVJSQVkgaW5zdHJ1Y3Rpb24uCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBNQU5BX0lOU04gPSAxNjsKKworICAgIC8qKgorICAgICAqIFRoZSB0eXBlIG9mIHRoZSBXSURFIGluc3RydWN0aW9uLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgV0lERV9JTlNOID0gMTc7CisKKyAgICAvKioKKyAgICAgKiBUaGUgaW5zdHJ1Y3Rpb24gdHlwZXMgb2YgYWxsIEpWTSBvcGNvZGVzLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBieXRlW10gVFlQRTsKKworICAgIC8qKgorICAgICAqIFRoZSB0eXBlIG9mIENPTlNUQU5UX0NsYXNzIGNvbnN0YW50IHBvb2wgaXRlbXMuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBDTEFTUyA9IDc7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiBDT05TVEFOVF9GaWVsZHJlZiBjb25zdGFudCBwb29sIGl0ZW1zLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgRklFTEQgPSA5OworCisgICAgLyoqCisgICAgICogVGhlIHR5cGUgb2YgQ09OU1RBTlRfTWV0aG9kcmVmIGNvbnN0YW50IHBvb2wgaXRlbXMuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBNRVRIID0gMTA7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiBDT05TVEFOVF9JbnRlcmZhY2VNZXRob2RyZWYgY29uc3RhbnQgcG9vbCBpdGVtcy4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IElNRVRIID0gMTE7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiBDT05TVEFOVF9TdHJpbmcgY29uc3RhbnQgcG9vbCBpdGVtcy4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IFNUUiA9IDg7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiBDT05TVEFOVF9JbnRlZ2VyIGNvbnN0YW50IHBvb2wgaXRlbXMuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBJTlQgPSAzOworCisgICAgLyoqCisgICAgICogVGhlIHR5cGUgb2YgQ09OU1RBTlRfRmxvYXQgY29uc3RhbnQgcG9vbCBpdGVtcy4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IEZMT0FUID0gNDsKKworICAgIC8qKgorICAgICAqIFRoZSB0eXBlIG9mIENPTlNUQU5UX0xvbmcgY29uc3RhbnQgcG9vbCBpdGVtcy4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IExPTkcgPSA1OworCisgICAgLyoqCisgICAgICogVGhlIHR5cGUgb2YgQ09OU1RBTlRfRG91YmxlIGNvbnN0YW50IHBvb2wgaXRlbXMuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBET1VCTEUgPSA2OworCisgICAgLyoqCisgICAgICogVGhlIHR5cGUgb2YgQ09OU1RBTlRfTmFtZUFuZFR5cGUgY29uc3RhbnQgcG9vbCBpdGVtcy4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IE5BTUVfVFlQRSA9IDEyOworCisgICAgLyoqCisgICAgICogVGhlIHR5cGUgb2YgQ09OU1RBTlRfVXRmOCBjb25zdGFudCBwb29sIGl0ZW1zLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgVVRGOCA9IDE7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiBDT05TVEFOVF9NZXRob2RUeXBlIGNvbnN0YW50IHBvb2wgaXRlbXMuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBNVFlQRSA9IDE2OworCisgICAgLyoqCisgICAgICogVGhlIHR5cGUgb2YgQ09OU1RBTlRfTWV0aG9kSGFuZGxlIGNvbnN0YW50IHBvb2wgaXRlbXMuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBIQU5ETEUgPSAxNTsKKworICAgIC8qKgorICAgICAqIFRoZSB0eXBlIG9mIENPTlNUQU5UX0ludm9rZUR5bmFtaWMgY29uc3RhbnQgcG9vbCBpdGVtcy4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IElORFkgPSAxODsKKworICAgIC8qKgorICAgICAqIFRoZSBiYXNlIHZhbHVlIGZvciBhbGwgQ09OU1RBTlRfTWV0aG9kSGFuZGxlIGNvbnN0YW50IHBvb2wgaXRlbXMuCisgICAgICogSW50ZXJuYWxseSwgQVNNIHN0b3JlIHRoZSA5IHZhcmlhdGlvbnMgb2YgQ09OU1RBTlRfTWV0aG9kSGFuZGxlIGludG8KKyAgICAgKiA5IGRpZmZlcmVudCBpdGVtcy4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IEhBTkRMRV9CQVNFID0gMjA7CisKKyAgICAvKioKKyAgICAgKiBOb3JtYWwgdHlwZSBJdGVtIHN0b3JlZCBpbiB0aGUgQ2xhc3NXcml0ZXIge0BsaW5rIENsYXNzV3JpdGVyI3R5cGVUYWJsZX0sCisgICAgICogaW5zdGVhZCBvZiB0aGUgY29uc3RhbnQgcG9vbCwgaW4gb3JkZXIgdG8gYXZvaWQgY2xhc2hlcyB3aXRoIG5vcm1hbAorICAgICAqIGNvbnN0YW50IHBvb2wgaXRlbXMgaW4gdGhlIENsYXNzV3JpdGVyIGNvbnN0YW50IHBvb2wncyBoYXNoIHRhYmxlLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9OT1JNQUwgPSAzMDsKKworICAgIC8qKgorICAgICAqIFVuaW5pdGlhbGl6ZWQgdHlwZSBJdGVtIHN0b3JlZCBpbiB0aGUgQ2xhc3NXcml0ZXIKKyAgICAgKiB7QGxpbmsgQ2xhc3NXcml0ZXIjdHlwZVRhYmxlfSwgaW5zdGVhZCBvZiB0aGUgY29uc3RhbnQgcG9vbCwgaW4gb3JkZXIgdG8KKyAgICAgKiBhdm9pZCBjbGFzaGVzIHdpdGggbm9ybWFsIGNvbnN0YW50IHBvb2wgaXRlbXMgaW4gdGhlIENsYXNzV3JpdGVyIGNvbnN0YW50CisgICAgICogcG9vbCdzIGhhc2ggdGFibGUuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBUWVBFX1VOSU5JVCA9IDMxOworCisgICAgLyoqCisgICAgICogTWVyZ2VkIHR5cGUgSXRlbSBzdG9yZWQgaW4gdGhlIENsYXNzV3JpdGVyIHtAbGluayBDbGFzc1dyaXRlciN0eXBlVGFibGV9LAorICAgICAqIGluc3RlYWQgb2YgdGhlIGNvbnN0YW50IHBvb2wsIGluIG9yZGVyIHRvIGF2b2lkIGNsYXNoZXMgd2l0aCBub3JtYWwKKyAgICAgKiBjb25zdGFudCBwb29sIGl0ZW1zIGluIHRoZSBDbGFzc1dyaXRlciBjb25zdGFudCBwb29sJ3MgaGFzaCB0YWJsZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IFRZUEVfTUVSR0VEID0gMzI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiBCb290c3RyYXBNZXRob2RzIGl0ZW1zLiBUaGVzZSBpdGVtcyBhcmUgc3RvcmVkIGluIGEKKyAgICAgKiBzcGVjaWFsIGNsYXNzIGF0dHJpYnV0ZSBuYW1lZCBCb290c3RyYXBNZXRob2RzIGFuZAorICAgICAqIG5vdCBpbiB0aGUgY29uc3RhbnQgcG9vbC4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IEJTTSA9IDMzOworCisgICAgLyoqCisgICAgICogVGhlIGNsYXNzIHJlYWRlciBmcm9tIHdoaWNoIHRoaXMgY2xhc3Mgd3JpdGVyIHdhcyBjb25zdHJ1Y3RlZCwgaWYgYW55LgorICAgICAqLworICAgIENsYXNzUmVhZGVyIGNyOworCisgICAgLyoqCisgICAgICogTWlub3IgYW5kIG1ham9yIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgY2xhc3MgdG8gYmUgZ2VuZXJhdGVkLgorICAgICAqLworICAgIGludCB2ZXJzaW9uOworCisgICAgLyoqCisgICAgICogSW5kZXggb2YgdGhlIG5leHQgaXRlbSB0byBiZSBhZGRlZCBpbiB0aGUgY29uc3RhbnQgcG9vbC4KKyAgICAgKi8KKyAgICBpbnQgaW5kZXg7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY29uc3RhbnQgcG9vbCBvZiB0aGlzIGNsYXNzLgorICAgICAqLworICAgIGZpbmFsIEJ5dGVWZWN0b3IgcG9vbDsKKworICAgIC8qKgorICAgICAqIFRoZSBjb25zdGFudCBwb29sJ3MgaGFzaCB0YWJsZSBkYXRhLgorICAgICAqLworICAgIEl0ZW1bXSBpdGVtczsKKworICAgIC8qKgorICAgICAqIFRoZSB0aHJlc2hvbGQgb2YgdGhlIGNvbnN0YW50IHBvb2wncyBoYXNoIHRhYmxlLgorICAgICAqLworICAgIGludCB0aHJlc2hvbGQ7CisKKyAgICAvKioKKyAgICAgKiBBIHJldXNhYmxlIGtleSB1c2VkIHRvIGxvb2sgZm9yIGl0ZW1zIGluIHRoZSB7QGxpbmsgI2l0ZW1zfSBoYXNoIHRhYmxlLgorICAgICAqLworICAgIGZpbmFsIEl0ZW0ga2V5OworCisgICAgLyoqCisgICAgICogQSByZXVzYWJsZSBrZXkgdXNlZCB0byBsb29rIGZvciBpdGVtcyBpbiB0aGUge0BsaW5rICNpdGVtc30gaGFzaCB0YWJsZS4KKyAgICAgKi8KKyAgICBmaW5hbCBJdGVtIGtleTI7CisKKyAgICAvKioKKyAgICAgKiBBIHJldXNhYmxlIGtleSB1c2VkIHRvIGxvb2sgZm9yIGl0ZW1zIGluIHRoZSB7QGxpbmsgI2l0ZW1zfSBoYXNoIHRhYmxlLgorICAgICAqLworICAgIGZpbmFsIEl0ZW0ga2V5MzsKKworICAgIC8qKgorICAgICAqIEEgcmV1c2FibGUga2V5IHVzZWQgdG8gbG9vayBmb3IgaXRlbXMgaW4gdGhlIHtAbGluayAjaXRlbXN9IGhhc2ggdGFibGUuCisgICAgICovCisgICAgZmluYWwgSXRlbSBrZXk0OworCisgICAgLyoqCisgICAgICogQSB0eXBlIHRhYmxlIHVzZWQgdG8gdGVtcG9yYXJpbHkgc3RvcmUgaW50ZXJuYWwgbmFtZXMgdGhhdCB3aWxsIG5vdAorICAgICAqIG5lY2Vzc2FyaWx5IGJlIHN0b3JlZCBpbiB0aGUgY29uc3RhbnQgcG9vbC4gVGhpcyB0eXBlIHRhYmxlIGlzIHVzZWQgYnkKKyAgICAgKiB0aGUgY29udHJvbCBmbG93IGFuZCBkYXRhIGZsb3cgYW5hbHlzaXMgYWxnb3JpdGhtIHVzZWQgdG8gY29tcHV0ZSBzdGFjaworICAgICAqIG1hcCBmcmFtZXMgZnJvbSBzY3JhdGNoLiBUaGlzIGFycmF5IGFzc29jaWF0ZXMgdG8gZWFjaCBpbmRleCA8dHQ+aTwvdHQ+CisgICAgICogdGhlIEl0ZW0gd2hvc2UgaW5kZXggaXMgPHR0Pmk8L3R0Pi4gQWxsIEl0ZW0gb2JqZWN0cyBzdG9yZWQgaW4gdGhpcworICAgICAqIGFycmF5IGFyZSBhbHNvIHN0b3JlZCBpbiB0aGUge0BsaW5rICNpdGVtc30gaGFzaCB0YWJsZS4gVGhlc2UgdHdvIGFycmF5cworICAgICAqIGFsbG93IHRvIHJldHJpZXZlIGFuIEl0ZW0gZnJvbSBpdHMgaW5kZXggb3IsIGNvbnZlcnNlbHksIHRvIGdldCB0aGUgaW5kZXgKKyAgICAgKiBvZiBhbiBJdGVtIGZyb20gaXRzIHZhbHVlLiBFYWNoIEl0ZW0gc3RvcmVzIGFuIGludGVybmFsIG5hbWUgaW4gaXRzCisgICAgICoge0BsaW5rIEl0ZW0jc3RyVmFsMX0gZmllbGQuCisgICAgICovCisgICAgSXRlbVtdIHR5cGVUYWJsZTsKKworICAgIC8qKgorICAgICAqIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUge0BsaW5rICN0eXBlVGFibGV9IGFycmF5LgorICAgICAqLworICAgIHByaXZhdGUgc2hvcnQgdHlwZUNvdW50OworCisgICAgLyoqCisgICAgICogVGhlIGFjY2VzcyBmbGFncyBvZiB0aGlzIGNsYXNzLgorICAgICAqLworICAgIHByaXZhdGUgaW50IGFjY2VzczsKKworICAgIC8qKgorICAgICAqIFRoZSBjb25zdGFudCBwb29sIGl0ZW0gdGhhdCBjb250YWlucyB0aGUgaW50ZXJuYWwgbmFtZSBvZiB0aGlzIGNsYXNzLgorICAgICAqLworICAgIHByaXZhdGUgaW50IG5hbWU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgaW50ZXJuYWwgbmFtZSBvZiB0aGlzIGNsYXNzLgorICAgICAqLworICAgIFN0cmluZyB0aGlzTmFtZTsKKworICAgIC8qKgorICAgICAqIFRoZSBjb25zdGFudCBwb29sIGl0ZW0gdGhhdCBjb250YWlucyB0aGUgc2lnbmF0dXJlIG9mIHRoaXMgY2xhc3MuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgc2lnbmF0dXJlOworCisgICAgLyoqCisgICAgICogVGhlIGNvbnN0YW50IHBvb2wgaXRlbSB0aGF0IGNvbnRhaW5zIHRoZSBpbnRlcm5hbCBuYW1lIG9mIHRoZSBzdXBlciBjbGFzcworICAgICAqIG9mIHRoaXMgY2xhc3MuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgc3VwZXJOYW1lOworCisgICAgLyoqCisgICAgICogTnVtYmVyIG9mIGludGVyZmFjZXMgaW1wbGVtZW50ZWQgb3IgZXh0ZW5kZWQgYnkgdGhpcyBjbGFzcyBvciBpbnRlcmZhY2UuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgaW50ZXJmYWNlQ291bnQ7CisKKyAgICAvKioKKyAgICAgKiBUaGUgaW50ZXJmYWNlcyBpbXBsZW1lbnRlZCBvciBleHRlbmRlZCBieSB0aGlzIGNsYXNzIG9yIGludGVyZmFjZS4gTW9yZQorICAgICAqIHByZWNpc2VseSwgdGhpcyBhcnJheSBjb250YWlucyB0aGUgaW5kZXhlcyBvZiB0aGUgY29uc3RhbnQgcG9vbCBpdGVtcworICAgICAqIHRoYXQgY29udGFpbiB0aGUgaW50ZXJuYWwgbmFtZXMgb2YgdGhlc2UgaW50ZXJmYWNlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludFtdIGludGVyZmFjZXM7CisKKyAgICAvKioKKyAgICAgKiBUaGUgaW5kZXggb2YgdGhlIGNvbnN0YW50IHBvb2wgaXRlbSB0aGF0IGNvbnRhaW5zIHRoZSBuYW1lIG9mIHRoZSBzb3VyY2UKKyAgICAgKiBmaWxlIGZyb20gd2hpY2ggdGhpcyBjbGFzcyB3YXMgY29tcGlsZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgc291cmNlRmlsZTsKKworICAgIC8qKgorICAgICAqIFRoZSBTb3VyY2VEZWJ1ZyBhdHRyaWJ1dGUgb2YgdGhpcyBjbGFzcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIEJ5dGVWZWN0b3Igc291cmNlRGVidWc7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY29uc3RhbnQgcG9vbCBpdGVtIHRoYXQgY29udGFpbnMgdGhlIG5hbWUgb2YgdGhlIGVuY2xvc2luZyBjbGFzcyBvZgorICAgICAqIHRoaXMgY2xhc3MuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgZW5jbG9zaW5nTWV0aG9kT3duZXI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY29uc3RhbnQgcG9vbCBpdGVtIHRoYXQgY29udGFpbnMgdGhlIG5hbWUgYW5kIGRlc2NyaXB0b3Igb2YgdGhlCisgICAgICogZW5jbG9zaW5nIG1ldGhvZCBvZiB0aGlzIGNsYXNzLgorICAgICAqLworICAgIHByaXZhdGUgaW50IGVuY2xvc2luZ01ldGhvZDsKKworICAgIC8qKgorICAgICAqIFRoZSBydW50aW1lIHZpc2libGUgYW5ub3RhdGlvbnMgb2YgdGhpcyBjbGFzcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIEFubm90YXRpb25Xcml0ZXIgYW5uczsKKworICAgIC8qKgorICAgICAqIFRoZSBydW50aW1lIGludmlzaWJsZSBhbm5vdGF0aW9ucyBvZiB0aGlzIGNsYXNzLgorICAgICAqLworICAgIHByaXZhdGUgQW5ub3RhdGlvbldyaXRlciBpYW5uczsKKworICAgIC8qKgorICAgICAqIFRoZSBub24gc3RhbmRhcmQgYXR0cmlidXRlcyBvZiB0aGlzIGNsYXNzLgorICAgICAqLworICAgIHByaXZhdGUgQXR0cmlidXRlIGF0dHJzOworCisgICAgLyoqCisgICAgICogVGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBJbm5lckNsYXNzZXMgYXR0cmlidXRlLgorICAgICAqLworICAgIHByaXZhdGUgaW50IGlubmVyQ2xhc3Nlc0NvdW50OworCisgICAgLyoqCisgICAgICogVGhlIElubmVyQ2xhc3NlcyBhdHRyaWJ1dGUuCisgICAgICovCisgICAgcHJpdmF0ZSBCeXRlVmVjdG9yIGlubmVyQ2xhc3NlczsKKworICAgIC8qKgorICAgICAqIFRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgQm9vdHN0cmFwTWV0aG9kcyBhdHRyaWJ1dGUuCisgICAgICovCisgICAgaW50IGJvb3RzdHJhcE1ldGhvZHNDb3VudDsKKworICAgIC8qKgorICAgICAqIFRoZSBCb290c3RyYXBNZXRob2RzIGF0dHJpYnV0ZS4KKyAgICAgKi8KKyAgICBCeXRlVmVjdG9yIGJvb3RzdHJhcE1ldGhvZHM7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZmllbGRzIG9mIHRoaXMgY2xhc3MuIFRoZXNlIGZpZWxkcyBhcmUgc3RvcmVkIGluIGEgbGlua2VkIGxpc3Qgb2YKKyAgICAgKiB7QGxpbmsgRmllbGRXcml0ZXJ9IG9iamVjdHMsIGxpbmtlZCB0byBlYWNoIG90aGVyIGJ5IHRoZWlyCisgICAgICoge0BsaW5rIEZpZWxkV3JpdGVyI2Z2fSBmaWVsZC4gVGhpcyBmaWVsZCBzdG9yZXMgdGhlIGZpcnN0IGVsZW1lbnQgb2YKKyAgICAgKiB0aGlzIGxpc3QuCisgICAgICovCisgICAgRmllbGRXcml0ZXIgZmlyc3RGaWVsZDsKKworICAgIC8qKgorICAgICAqIFRoZSBmaWVsZHMgb2YgdGhpcyBjbGFzcy4gVGhlc2UgZmllbGRzIGFyZSBzdG9yZWQgaW4gYSBsaW5rZWQgbGlzdCBvZgorICAgICAqIHtAbGluayBGaWVsZFdyaXRlcn0gb2JqZWN0cywgbGlua2VkIHRvIGVhY2ggb3RoZXIgYnkgdGhlaXIKKyAgICAgKiB7QGxpbmsgRmllbGRXcml0ZXIjZnZ9IGZpZWxkLiBUaGlzIGZpZWxkIHN0b3JlcyB0aGUgbGFzdCBlbGVtZW50IG9mCisgICAgICogdGhpcyBsaXN0LgorICAgICAqLworICAgIEZpZWxkV3JpdGVyIGxhc3RGaWVsZDsKKworICAgIC8qKgorICAgICAqIFRoZSBtZXRob2RzIG9mIHRoaXMgY2xhc3MuIFRoZXNlIG1ldGhvZHMgYXJlIHN0b3JlZCBpbiBhIGxpbmtlZCBsaXN0IG9mCisgICAgICoge0BsaW5rIE1ldGhvZFdyaXRlcn0gb2JqZWN0cywgbGlua2VkIHRvIGVhY2ggb3RoZXIgYnkgdGhlaXIKKyAgICAgKiB7QGxpbmsgTWV0aG9kV3JpdGVyI212fSBmaWVsZC4gVGhpcyBmaWVsZCBzdG9yZXMgdGhlIGZpcnN0IGVsZW1lbnQgb2YKKyAgICAgKiB0aGlzIGxpc3QuCisgICAgICovCisgICAgTWV0aG9kV3JpdGVyIGZpcnN0TWV0aG9kOworCisgICAgLyoqCisgICAgICogVGhlIG1ldGhvZHMgb2YgdGhpcyBjbGFzcy4gVGhlc2UgbWV0aG9kcyBhcmUgc3RvcmVkIGluIGEgbGlua2VkIGxpc3Qgb2YKKyAgICAgKiB7QGxpbmsgTWV0aG9kV3JpdGVyfSBvYmplY3RzLCBsaW5rZWQgdG8gZWFjaCBvdGhlciBieSB0aGVpcgorICAgICAqIHtAbGluayBNZXRob2RXcml0ZXIjbXZ9IGZpZWxkLiBUaGlzIGZpZWxkIHN0b3JlcyB0aGUgbGFzdCBlbGVtZW50IG9mCisgICAgICogdGhpcyBsaXN0LgorICAgICAqLworICAgIE1ldGhvZFdyaXRlciBsYXN0TWV0aG9kOworCisgICAgLyoqCisgICAgICogPHR0PnRydWU8L3R0PiBpZiB0aGUgbWF4aW11bSBzdGFjayBzaXplIGFuZCBudW1iZXIgb2YgbG9jYWwgdmFyaWFibGVzCisgICAgICogbXVzdCBiZSBhdXRvbWF0aWNhbGx5IGNvbXB1dGVkLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBjb21wdXRlTWF4czsKKworICAgIC8qKgorICAgICAqIDx0dD50cnVlPC90dD4gaWYgdGhlIHN0YWNrIG1hcCBmcmFtZXMgbXVzdCBiZSByZWNvbXB1dGVkIGZyb20gc2NyYXRjaC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gY29tcHV0ZUZyYW1lczsKKworICAgIC8qKgorICAgICAqIDx0dD50cnVlPC90dD4gaWYgdGhlIHN0YWNrIG1hcCB0YWJsZXMgb2YgdGhpcyBjbGFzcyBhcmUgaW52YWxpZC4gVGhlCisgICAgICoge0BsaW5rIE1ldGhvZFdyaXRlciNyZXNpemVJbnN0cnVjdGlvbnN9IG1ldGhvZCBjYW5ub3QgdHJhbnNmb3JtIGV4aXN0aW5nCisgICAgICogc3RhY2sgbWFwIHRhYmxlcywgYW5kIHNvIHByb2R1Y2VzIHBvdGVudGlhbGx5IGludmFsaWQgY2xhc3NlcyB3aGVuIGl0IGlzCisgICAgICogZXhlY3V0ZWQuIEluIHRoaXMgY2FzZSB0aGUgY2xhc3MgaXMgcmVyZWFkIGFuZCByZXdyaXR0ZW4gd2l0aCB0aGUKKyAgICAgKiB7QGxpbmsgI0NPTVBVVEVfRlJBTUVTfSBvcHRpb24gKHRoZSByZXNpemVJbnN0cnVjdGlvbnMgbWV0aG9kIGNhbiByZXNpemUKKyAgICAgKiBzdGFjayBtYXAgdGFibGVzIHdoZW4gdGhpcyBvcHRpb24gaXMgdXNlZCkuCisgICAgICovCisgICAgYm9vbGVhbiBpbnZhbGlkRnJhbWVzOworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gU3RhdGljIGluaXRpYWxpemVyCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvKioKKyAgICAgKiBDb21wdXRlcyB0aGUgaW5zdHJ1Y3Rpb24gdHlwZXMgb2YgSlZNIG9wY29kZXMuCisgICAgICovCisgICAgc3RhdGljIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGJ5dGVbXSBiID0gbmV3IGJ5dGVbMjIwXTsKKyAgICAgICAgU3RyaW5nIHMgPSAiQUFBQUFBQUFBQUFBQUFBQUJDTE1NRERERERFRUVFRUVFRUVFRUVFRUVFRUVFRUFBQUFBQUFBREQiCisgICAgICAgICAgICAgICAgKyAiRERERUVFRUVFRUVFRUVFRUVFRUVFRUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEiCisgICAgICAgICAgICAgICAgKyAiQUFBQUFBQUFBQUFBQUFBQUFOQUFBQUFBQUFBQUFBQUFBQUFBQUFKSkpKSkpKSkpKSkpKSkpKRE9QQUEiCisgICAgICAgICAgICAgICAgKyAiQUFBQUdHR0dHR0dISUZCRkFBRkZBQVJRSkpLS0pKSkpKSkpKSkpKSkpKSkpKSiI7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBiLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBiW2ldID0gKGJ5dGUpIChzLmNoYXJBdChpKSAtICdBJyk7CisgICAgICAgIH0KKyAgICAgICAgVFlQRSA9IGI7CisKKyAgICAgICAgLy8gY29kZSB0byBnZW5lcmF0ZSB0aGUgYWJvdmUgc3RyaW5nCisgICAgICAgIC8vCisgICAgICAgIC8vIC8vIFNCWVRFX0lOU04gaW5zdHJ1Y3Rpb25zCisgICAgICAgIC8vIGJbQ29uc3RhbnRzLk5FV0FSUkFZXSA9IFNCWVRFX0lOU047CisgICAgICAgIC8vIGJbQ29uc3RhbnRzLkJJUFVTSF0gPSBTQllURV9JTlNOOworICAgICAgICAvLworICAgICAgICAvLyAvLyBTSE9SVF9JTlNOIGluc3RydWN0aW9ucworICAgICAgICAvLyBiW0NvbnN0YW50cy5TSVBVU0hdID0gU0hPUlRfSU5TTjsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gLy8gKElNUEwpVkFSX0lOU04gaW5zdHJ1Y3Rpb25zCisgICAgICAgIC8vIGJbQ29uc3RhbnRzLlJFVF0gPSBWQVJfSU5TTjsKKyAgICAgICAgLy8gZm9yIChpID0gQ29uc3RhbnRzLklMT0FEOyBpIDw9IENvbnN0YW50cy5BTE9BRDsgKytpKSB7CisgICAgICAgIC8vIGJbaV0gPSBWQVJfSU5TTjsKKyAgICAgICAgLy8gfQorICAgICAgICAvLyBmb3IgKGkgPSBDb25zdGFudHMuSVNUT1JFOyBpIDw9IENvbnN0YW50cy5BU1RPUkU7ICsraSkgeworICAgICAgICAvLyBiW2ldID0gVkFSX0lOU047CisgICAgICAgIC8vIH0KKyAgICAgICAgLy8gZm9yIChpID0gMjY7IGkgPD0gNDU7ICsraSkgeyAvLyBJTE9BRF8wIHRvIEFMT0FEXzMKKyAgICAgICAgLy8gYltpXSA9IElNUExWQVJfSU5TTjsKKyAgICAgICAgLy8gfQorICAgICAgICAvLyBmb3IgKGkgPSA1OTsgaSA8PSA3ODsgKytpKSB7IC8vIElTVE9SRV8wIHRvIEFTVE9SRV8zCisgICAgICAgIC8vIGJbaV0gPSBJTVBMVkFSX0lOU047CisgICAgICAgIC8vIH0KKyAgICAgICAgLy8KKyAgICAgICAgLy8gLy8gVFlQRV9JTlNOIGluc3RydWN0aW9ucworICAgICAgICAvLyBiW0NvbnN0YW50cy5ORVddID0gVFlQRV9JTlNOOworICAgICAgICAvLyBiW0NvbnN0YW50cy5BTkVXQVJSQVldID0gVFlQRV9JTlNOOworICAgICAgICAvLyBiW0NvbnN0YW50cy5DSEVDS0NBU1RdID0gVFlQRV9JTlNOOworICAgICAgICAvLyBiW0NvbnN0YW50cy5JTlNUQU5DRU9GXSA9IFRZUEVfSU5TTjsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gLy8gKFNldClGSUVMRE9STUVUSF9JTlNOIGluc3RydWN0aW9ucworICAgICAgICAvLyBmb3IgKGkgPSBDb25zdGFudHMuR0VUU1RBVElDOyBpIDw9IENvbnN0YW50cy5JTlZPS0VTVEFUSUM7ICsraSkgeworICAgICAgICAvLyBiW2ldID0gRklFTERPUk1FVEhfSU5TTjsKKyAgICAgICAgLy8gfQorICAgICAgICAvLyBiW0NvbnN0YW50cy5JTlZPS0VJTlRFUkZBQ0VdID0gSVRGTUVUSF9JTlNOOworICAgICAgICAvLyBiW0NvbnN0YW50cy5JTlZPS0VEWU5BTUlDXSA9IElORFlNRVRIX0lOU047CisgICAgICAgIC8vCisgICAgICAgIC8vIC8vIExBQkVMKFcpX0lOU04gaW5zdHJ1Y3Rpb25zCisgICAgICAgIC8vIGZvciAoaSA9IENvbnN0YW50cy5JRkVROyBpIDw9IENvbnN0YW50cy5KU1I7ICsraSkgeworICAgICAgICAvLyBiW2ldID0gTEFCRUxfSU5TTjsKKyAgICAgICAgLy8gfQorICAgICAgICAvLyBiW0NvbnN0YW50cy5JRk5VTExdID0gTEFCRUxfSU5TTjsKKyAgICAgICAgLy8gYltDb25zdGFudHMuSUZOT05OVUxMXSA9IExBQkVMX0lOU047CisgICAgICAgIC8vIGJbMjAwXSA9IExBQkVMV19JTlNOOyAvLyBHT1RPX1cKKyAgICAgICAgLy8gYlsyMDFdID0gTEFCRUxXX0lOU047IC8vIEpTUl9XCisgICAgICAgIC8vIC8vIHRlbXBvcmFyeSBvcGNvZGVzIHVzZWQgaW50ZXJuYWxseSBieSBBU00gLSBzZWUgTGFiZWwgYW5kCisgICAgICAgIC8vIE1ldGhvZFdyaXRlcgorICAgICAgICAvLyBmb3IgKGkgPSAyMDI7IGkgPCAyMjA7ICsraSkgeworICAgICAgICAvLyBiW2ldID0gTEFCRUxfSU5TTjsKKyAgICAgICAgLy8gfQorICAgICAgICAvLworICAgICAgICAvLyAvLyBMREMoX1cpIGluc3RydWN0aW9ucworICAgICAgICAvLyBiW0NvbnN0YW50cy5MRENdID0gTERDX0lOU047CisgICAgICAgIC8vIGJbMTldID0gTERDV19JTlNOOyAvLyBMRENfVworICAgICAgICAvLyBiWzIwXSA9IExEQ1dfSU5TTjsgLy8gTERDMl9XCisgICAgICAgIC8vCisgICAgICAgIC8vIC8vIHNwZWNpYWwgaW5zdHJ1Y3Rpb25zCisgICAgICAgIC8vIGJbQ29uc3RhbnRzLklJTkNdID0gSUlOQ19JTlNOOworICAgICAgICAvLyBiW0NvbnN0YW50cy5UQUJMRVNXSVRDSF0gPSBUQUJMX0lOU047CisgICAgICAgIC8vIGJbQ29uc3RhbnRzLkxPT0tVUFNXSVRDSF0gPSBMT09LX0lOU047CisgICAgICAgIC8vIGJbQ29uc3RhbnRzLk1VTFRJQU5FV0FSUkFZXSA9IE1BTkFfSU5TTjsKKyAgICAgICAgLy8gYlsxOTZdID0gV0lERV9JTlNOOyAvLyBXSURFCisgICAgICAgIC8vCisgICAgICAgIC8vIGZvciAoaSA9IDA7IGkgPCBiLmxlbmd0aDsgKytpKSB7CisgICAgICAgIC8vIFN5c3RlbS5lcnIucHJpbnQoKGNoYXIpKCdBJyArIGJbaV0pKTsKKyAgICAgICAgLy8gfQorICAgICAgICAvLyBTeXN0ZW0uZXJyLnByaW50bG4oKTsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBDb25zdHJ1Y3RvcgorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGxpbmsgQ2xhc3NXcml0ZXJ9IG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmbGFncyBvcHRpb24gZmxhZ3MgdGhhdCBjYW4gYmUgdXNlZCB0byBtb2RpZnkgdGhlIGRlZmF1bHQgYmVoYXZpb3IKKyAgICAgKiAgICAgICAgb2YgdGhpcyBjbGFzcy4gU2VlIHtAbGluayAjQ09NUFVURV9NQVhTfSwge0BsaW5rICNDT01QVVRFX0ZSQU1FU30uCisgICAgICovCisgICAgcHVibGljIENsYXNzV3JpdGVyKGZpbmFsIGludCBmbGFncykgeworICAgICAgICBzdXBlcihPcGNvZGVzLkFTTTQpOworICAgICAgICBpbmRleCA9IDE7CisgICAgICAgIHBvb2wgPSBuZXcgQnl0ZVZlY3RvcigpOworICAgICAgICBpdGVtcyA9IG5ldyBJdGVtWzI1Nl07CisgICAgICAgIHRocmVzaG9sZCA9IChpbnQpICgwLjc1ZCAqIGl0ZW1zLmxlbmd0aCk7CisgICAgICAgIGtleSA9IG5ldyBJdGVtKCk7CisgICAgICAgIGtleTIgPSBuZXcgSXRlbSgpOworICAgICAgICBrZXkzID0gbmV3IEl0ZW0oKTsKKyAgICAgICAga2V5NCA9IG5ldyBJdGVtKCk7CisgICAgICAgIHRoaXMuY29tcHV0ZU1heHMgPSAoZmxhZ3MgJiBDT01QVVRFX01BWFMpICE9IDA7CisgICAgICAgIHRoaXMuY29tcHV0ZUZyYW1lcyA9IChmbGFncyAmIENPTVBVVEVfRlJBTUVTKSAhPSAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0BsaW5rIENsYXNzV3JpdGVyfSBvYmplY3QgYW5kIGVuYWJsZXMgb3B0aW1pemF0aW9ucyBmb3IKKyAgICAgKiAibW9zdGx5IGFkZCIgYnl0ZWNvZGUgdHJhbnNmb3JtYXRpb25zLiBUaGVzZSBvcHRpbWl6YXRpb25zIGFyZSB0aGUKKyAgICAgKiBmb2xsb3dpbmc6CisgICAgICoKKyAgICAgKiA8dWw+IDxsaT5UaGUgY29uc3RhbnQgcG9vbCBmcm9tIHRoZSBvcmlnaW5hbCBjbGFzcyBpcyBjb3BpZWQgYXMgaXMgaW4gdGhlCisgICAgICogbmV3IGNsYXNzLCB3aGljaCBzYXZlcyB0aW1lLiBOZXcgY29uc3RhbnQgcG9vbCBlbnRyaWVzIHdpbGwgYmUgYWRkZWQgYXQKKyAgICAgKiB0aGUgZW5kIGlmIG5lY2Vzc2FyeSwgYnV0IHVudXNlZCBjb25zdGFudCBwb29sIGVudHJpZXMgPGk+d29uJ3QgYmUKKyAgICAgKiByZW1vdmVkPC9pPi48L2xpPiA8bGk+TWV0aG9kcyB0aGF0IGFyZSBub3QgdHJhbnNmb3JtZWQgYXJlIGNvcGllZCBhcyBpcworICAgICAqIGluIHRoZSBuZXcgY2xhc3MsIGRpcmVjdGx5IGZyb20gdGhlIG9yaWdpbmFsIGNsYXNzIGJ5dGVjb2RlIChpLmUuIHdpdGhvdXQKKyAgICAgKiBlbWl0dGluZyB2aXNpdCBldmVudHMgZm9yIGFsbCB0aGUgbWV0aG9kIGluc3RydWN0aW9ucyksIHdoaWNoIHNhdmVzIGEKKyAgICAgKiA8aT5sb3Q8L2k+IG9mIHRpbWUuIFVudHJhbnNmb3JtZWQgbWV0aG9kcyBhcmUgZGV0ZWN0ZWQgYnkgdGhlIGZhY3QgdGhhdAorICAgICAqIHRoZSB7QGxpbmsgQ2xhc3NSZWFkZXJ9IHJlY2VpdmVzIHtAbGluayBNZXRob2RWaXNpdG9yfSBvYmplY3RzIHRoYXQgY29tZQorICAgICAqIGZyb20gYSB7QGxpbmsgQ2xhc3NXcml0ZXJ9IChhbmQgbm90IGZyb20gYW55IG90aGVyIHtAbGluayBDbGFzc1Zpc2l0b3J9CisgICAgICogaW5zdGFuY2UpLjwvbGk+IDwvdWw+CisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xhc3NSZWFkZXIgdGhlIHtAbGluayBDbGFzc1JlYWRlcn0gdXNlZCB0byByZWFkIHRoZSBvcmlnaW5hbAorICAgICAqICAgICAgICBjbGFzcy4gSXQgd2lsbCBiZSB1c2VkIHRvIGNvcHkgdGhlIGVudGlyZSBjb25zdGFudCBwb29sIGZyb20gdGhlCisgICAgICogICAgICAgIG9yaWdpbmFsIGNsYXNzIGFuZCBhbHNvIHRvIGNvcHkgb3RoZXIgZnJhZ21lbnRzIG9mIG9yaWdpbmFsCisgICAgICogICAgICAgIGJ5dGVjb2RlIHdoZXJlIGFwcGxpY2FibGUuCisgICAgICogQHBhcmFtIGZsYWdzIG9wdGlvbiBmbGFncyB0aGF0IGNhbiBiZSB1c2VkIHRvIG1vZGlmeSB0aGUgZGVmYXVsdCBiZWhhdmlvcgorICAgICAqICAgICAgICBvZiB0aGlzIGNsYXNzLiA8aT5UaGVzZSBvcHRpb24gZmxhZ3MgZG8gbm90IGFmZmVjdCBtZXRob2RzIHRoYXQKKyAgICAgKiAgICAgICAgYXJlIGNvcGllZCBhcyBpcyBpbiB0aGUgbmV3IGNsYXNzLiBUaGlzIG1lYW5zIHRoYXQgdGhlIG1heGltdW0KKyAgICAgKiAgICAgICAgc3RhY2sgc2l6ZSBub3IgdGhlIHN0YWNrIGZyYW1lcyB3aWxsIGJlIGNvbXB1dGVkIGZvciB0aGVzZQorICAgICAqICAgICAgICBtZXRob2RzPC9pPi4gU2VlIHtAbGluayAjQ09NUFVURV9NQVhTfSwge0BsaW5rICNDT01QVVRFX0ZSQU1FU30uCisgICAgICovCisgICAgcHVibGljIENsYXNzV3JpdGVyKGZpbmFsIENsYXNzUmVhZGVyIGNsYXNzUmVhZGVyLCBmaW5hbCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgdGhpcyhmbGFncyk7CisgICAgICAgIGNsYXNzUmVhZGVyLmNvcHlQb29sKHRoaXMpOworICAgICAgICB0aGlzLmNyID0gY2xhc3NSZWFkZXI7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gSW1wbGVtZW50YXRpb24gb2YgdGhlIENsYXNzVmlzaXRvciBhYnN0cmFjdCBjbGFzcworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGZpbmFsIHZvaWQgdmlzaXQoCisgICAgICAgIGZpbmFsIGludCB2ZXJzaW9uLAorICAgICAgICBmaW5hbCBpbnQgYWNjZXNzLAorICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSwKKyAgICAgICAgZmluYWwgU3RyaW5nIHNpZ25hdHVyZSwKKyAgICAgICAgZmluYWwgU3RyaW5nIHN1cGVyTmFtZSwKKyAgICAgICAgZmluYWwgU3RyaW5nW10gaW50ZXJmYWNlcykKKyAgICB7CisgICAgICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb247CisgICAgICAgIHRoaXMuYWNjZXNzID0gYWNjZXNzOworICAgICAgICB0aGlzLm5hbWUgPSBuZXdDbGFzcyhuYW1lKTsKKyAgICAgICAgdGhpc05hbWUgPSBuYW1lOworICAgICAgICBpZiAoQ2xhc3NSZWFkZXIuU0lHTkFUVVJFUyAmJiBzaWduYXR1cmUgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5zaWduYXR1cmUgPSBuZXdVVEY4KHNpZ25hdHVyZSk7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5zdXBlck5hbWUgPSBzdXBlck5hbWUgPT0gbnVsbCA/IDAgOiBuZXdDbGFzcyhzdXBlck5hbWUpOworICAgICAgICBpZiAoaW50ZXJmYWNlcyAhPSBudWxsICYmIGludGVyZmFjZXMubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgaW50ZXJmYWNlQ291bnQgPSBpbnRlcmZhY2VzLmxlbmd0aDsKKyAgICAgICAgICAgIHRoaXMuaW50ZXJmYWNlcyA9IG5ldyBpbnRbaW50ZXJmYWNlQ291bnRdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnRlcmZhY2VDb3VudDsgKytpKSB7CisgICAgICAgICAgICAgICAgdGhpcy5pbnRlcmZhY2VzW2ldID0gbmV3Q2xhc3MoaW50ZXJmYWNlc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB2aXNpdFNvdXJjZShmaW5hbCBTdHJpbmcgZmlsZSwgZmluYWwgU3RyaW5nIGRlYnVnKSB7CisgICAgICAgIGlmIChmaWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNvdXJjZUZpbGUgPSBuZXdVVEY4KGZpbGUpOworICAgICAgICB9CisgICAgICAgIGlmIChkZWJ1ZyAhPSBudWxsKSB7CisgICAgICAgICAgICBzb3VyY2VEZWJ1ZyA9IG5ldyBCeXRlVmVjdG9yKCkucHV0VVRGOChkZWJ1Zyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB2aXNpdE91dGVyQ2xhc3MoCisgICAgICAgIGZpbmFsIFN0cmluZyBvd25lciwKKyAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUsCisgICAgICAgIGZpbmFsIFN0cmluZyBkZXNjKQorICAgIHsKKyAgICAgICAgZW5jbG9zaW5nTWV0aG9kT3duZXIgPSBuZXdDbGFzcyhvd25lcik7CisgICAgICAgIGlmIChuYW1lICE9IG51bGwgJiYgZGVzYyAhPSBudWxsKSB7CisgICAgICAgICAgICBlbmNsb3NpbmdNZXRob2QgPSBuZXdOYW1lVHlwZShuYW1lLCBkZXNjKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBmaW5hbCBBbm5vdGF0aW9uVmlzaXRvciB2aXNpdEFubm90YXRpb24oCisgICAgICAgIGZpbmFsIFN0cmluZyBkZXNjLAorICAgICAgICBmaW5hbCBib29sZWFuIHZpc2libGUpCisgICAgeworICAgICAgICBpZiAoIUNsYXNzUmVhZGVyLkFOTk9UQVRJT05TKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBCeXRlVmVjdG9yIGJ2ID0gbmV3IEJ5dGVWZWN0b3IoKTsKKyAgICAgICAgLy8gd3JpdGUgdHlwZSwgYW5kIHJlc2VydmUgc3BhY2UgZm9yIHZhbHVlcyBjb3VudAorICAgICAgICBidi5wdXRTaG9ydChuZXdVVEY4KGRlc2MpKS5wdXRTaG9ydCgwKTsKKyAgICAgICAgQW5ub3RhdGlvbldyaXRlciBhdyA9IG5ldyBBbm5vdGF0aW9uV3JpdGVyKHRoaXMsIHRydWUsIGJ2LCBidiwgMik7CisgICAgICAgIGlmICh2aXNpYmxlKSB7CisgICAgICAgICAgICBhdy5uZXh0ID0gYW5uczsKKyAgICAgICAgICAgIGFubnMgPSBhdzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF3Lm5leHQgPSBpYW5uczsKKyAgICAgICAgICAgIGlhbm5zID0gYXc7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGF3OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHZpc2l0QXR0cmlidXRlKGZpbmFsIEF0dHJpYnV0ZSBhdHRyKSB7CisgICAgICAgIGF0dHIubmV4dCA9IGF0dHJzOworICAgICAgICBhdHRycyA9IGF0dHI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGZpbmFsIHZvaWQgdmlzaXRJbm5lckNsYXNzKAorICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSwKKyAgICAgICAgZmluYWwgU3RyaW5nIG91dGVyTmFtZSwKKyAgICAgICAgZmluYWwgU3RyaW5nIGlubmVyTmFtZSwKKyAgICAgICAgZmluYWwgaW50IGFjY2VzcykKKyAgICB7CisgICAgICAgIGlmIChpbm5lckNsYXNzZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgaW5uZXJDbGFzc2VzID0gbmV3IEJ5dGVWZWN0b3IoKTsKKyAgICAgICAgfQorICAgICAgICArK2lubmVyQ2xhc3Nlc0NvdW50OworICAgICAgICBpbm5lckNsYXNzZXMucHV0U2hvcnQobmFtZSA9PSBudWxsID8gMCA6IG5ld0NsYXNzKG5hbWUpKTsKKyAgICAgICAgaW5uZXJDbGFzc2VzLnB1dFNob3J0KG91dGVyTmFtZSA9PSBudWxsID8gMCA6IG5ld0NsYXNzKG91dGVyTmFtZSkpOworICAgICAgICBpbm5lckNsYXNzZXMucHV0U2hvcnQoaW5uZXJOYW1lID09IG51bGwgPyAwIDogbmV3VVRGOChpbm5lck5hbWUpKTsKKyAgICAgICAgaW5uZXJDbGFzc2VzLnB1dFNob3J0KGFjY2Vzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGZpbmFsIEZpZWxkVmlzaXRvciB2aXNpdEZpZWxkKAorICAgICAgICBmaW5hbCBpbnQgYWNjZXNzLAorICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSwKKyAgICAgICAgZmluYWwgU3RyaW5nIGRlc2MsCisgICAgICAgIGZpbmFsIFN0cmluZyBzaWduYXR1cmUsCisgICAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgRmllbGRXcml0ZXIodGhpcywgYWNjZXNzLCBuYW1lLCBkZXNjLCBzaWduYXR1cmUsIHZhbHVlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgZmluYWwgTWV0aG9kVmlzaXRvciB2aXNpdE1ldGhvZCgKKyAgICAgICAgZmluYWwgaW50IGFjY2VzcywKKyAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUsCisgICAgICAgIGZpbmFsIFN0cmluZyBkZXNjLAorICAgICAgICBmaW5hbCBTdHJpbmcgc2lnbmF0dXJlLAorICAgICAgICBmaW5hbCBTdHJpbmdbXSBleGNlcHRpb25zKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNZXRob2RXcml0ZXIodGhpcywKKyAgICAgICAgICAgICAgICBhY2Nlc3MsCisgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICBkZXNjLAorICAgICAgICAgICAgICAgIHNpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICBleGNlcHRpb25zLAorICAgICAgICAgICAgICAgIGNvbXB1dGVNYXhzLAorICAgICAgICAgICAgICAgIGNvbXB1dGVGcmFtZXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHZpc2l0RW5kKCkgeworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIE90aGVyIHB1YmxpYyBtZXRob2RzCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBieXRlY29kZSBvZiB0aGUgY2xhc3MgdGhhdCB3YXMgYnVpbGQgd2l0aCB0aGlzIGNsYXNzIHdyaXRlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGJ5dGVjb2RlIG9mIHRoZSBjbGFzcyB0aGF0IHdhcyBidWlsZCB3aXRoIHRoaXMgY2xhc3Mgd3JpdGVyLgorICAgICAqLworICAgIHB1YmxpYyBieXRlW10gdG9CeXRlQXJyYXkoKSB7CisgICAgICAgIGlmIChpbmRleCA+IFNob3J0Lk1BWF9WQUxVRSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkNsYXNzIGZpbGUgdG9vIGxhcmdlISIpOworICAgICAgICB9CisgICAgICAgIC8vIGNvbXB1dGVzIHRoZSByZWFsIHNpemUgb2YgdGhlIGJ5dGVjb2RlIG9mIHRoaXMgY2xhc3MKKyAgICAgICAgaW50IHNpemUgPSAyNCArIDIgKiBpbnRlcmZhY2VDb3VudDsKKyAgICAgICAgaW50IG5iRmllbGRzID0gMDsKKyAgICAgICAgRmllbGRXcml0ZXIgZmIgPSBmaXJzdEZpZWxkOworICAgICAgICB3aGlsZSAoZmIgIT0gbnVsbCkgeworICAgICAgICAgICAgKytuYkZpZWxkczsKKyAgICAgICAgICAgIHNpemUgKz0gZmIuZ2V0U2l6ZSgpOworICAgICAgICAgICAgZmIgPSAoRmllbGRXcml0ZXIpIGZiLmZ2OworICAgICAgICB9CisgICAgICAgIGludCBuYk1ldGhvZHMgPSAwOworICAgICAgICBNZXRob2RXcml0ZXIgbWIgPSBmaXJzdE1ldGhvZDsKKyAgICAgICAgd2hpbGUgKG1iICE9IG51bGwpIHsKKyAgICAgICAgICAgICsrbmJNZXRob2RzOworICAgICAgICAgICAgc2l6ZSArPSBtYi5nZXRTaXplKCk7CisgICAgICAgICAgICBtYiA9IChNZXRob2RXcml0ZXIpIG1iLm12OworICAgICAgICB9CisgICAgICAgIGludCBhdHRyaWJ1dGVDb3VudCA9IDA7CisgICAgICAgIGlmIChib290c3RyYXBNZXRob2RzICE9IG51bGwpIHsgIC8vIHdlIHB1dCBpdCBhcyBmaXJzdCBhcmd1bWVudCBpbiBvcmRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBpbXByb3ZlIGEgYml0IENsYXNzUmVhZGVyLmNvcHlCb290c3RyYXBNZXRob2RzCisgICAgICAgICAgICArK2F0dHJpYnV0ZUNvdW50OworICAgICAgICAgICAgc2l6ZSArPSA4ICsgYm9vdHN0cmFwTWV0aG9kcy5sZW5ndGg7CisgICAgICAgICAgICBuZXdVVEY4KCJCb290c3RyYXBNZXRob2RzIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKENsYXNzUmVhZGVyLlNJR05BVFVSRVMgJiYgc2lnbmF0dXJlICE9IDApIHsKKyAgICAgICAgICAgICsrYXR0cmlidXRlQ291bnQ7CisgICAgICAgICAgICBzaXplICs9IDg7CisgICAgICAgICAgICBuZXdVVEY4KCJTaWduYXR1cmUiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc291cmNlRmlsZSAhPSAwKSB7CisgICAgICAgICAgICArK2F0dHJpYnV0ZUNvdW50OworICAgICAgICAgICAgc2l6ZSArPSA4OworICAgICAgICAgICAgbmV3VVRGOCgiU291cmNlRmlsZSIpOworICAgICAgICB9CisgICAgICAgIGlmIChzb3VyY2VEZWJ1ZyAhPSBudWxsKSB7CisgICAgICAgICAgICArK2F0dHJpYnV0ZUNvdW50OworICAgICAgICAgICAgc2l6ZSArPSBzb3VyY2VEZWJ1Zy5sZW5ndGggKyA0OworICAgICAgICAgICAgbmV3VVRGOCgiU291cmNlRGVidWdFeHRlbnNpb24iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZW5jbG9zaW5nTWV0aG9kT3duZXIgIT0gMCkgeworICAgICAgICAgICAgKythdHRyaWJ1dGVDb3VudDsKKyAgICAgICAgICAgIHNpemUgKz0gMTA7CisgICAgICAgICAgICBuZXdVVEY4KCJFbmNsb3NpbmdNZXRob2QiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGFjY2VzcyAmIE9wY29kZXMuQUNDX0RFUFJFQ0FURUQpICE9IDApIHsKKyAgICAgICAgICAgICsrYXR0cmlidXRlQ291bnQ7CisgICAgICAgICAgICBzaXplICs9IDY7CisgICAgICAgICAgICBuZXdVVEY4KCJEZXByZWNhdGVkIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChhY2Nlc3MgJiBPcGNvZGVzLkFDQ19TWU5USEVUSUMpICE9IDAKKyAgICAgICAgICAgICAgICAmJiAoKHZlcnNpb24gJiAweEZGRkYpIDwgT3Bjb2Rlcy5WMV81IHx8IChhY2Nlc3MgJiBBQ0NfU1lOVEhFVElDX0FUVFJJQlVURSkgIT0gMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgICsrYXR0cmlidXRlQ291bnQ7CisgICAgICAgICAgICBzaXplICs9IDY7CisgICAgICAgICAgICBuZXdVVEY4KCJTeW50aGV0aWMiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5uZXJDbGFzc2VzICE9IG51bGwpIHsKKyAgICAgICAgICAgICsrYXR0cmlidXRlQ291bnQ7CisgICAgICAgICAgICBzaXplICs9IDggKyBpbm5lckNsYXNzZXMubGVuZ3RoOworICAgICAgICAgICAgbmV3VVRGOCgiSW5uZXJDbGFzc2VzIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKENsYXNzUmVhZGVyLkFOTk9UQVRJT05TICYmIGFubnMgIT0gbnVsbCkgeworICAgICAgICAgICAgKythdHRyaWJ1dGVDb3VudDsKKyAgICAgICAgICAgIHNpemUgKz0gOCArIGFubnMuZ2V0U2l6ZSgpOworICAgICAgICAgICAgbmV3VVRGOCgiUnVudGltZVZpc2libGVBbm5vdGF0aW9ucyIpOworICAgICAgICB9CisgICAgICAgIGlmIChDbGFzc1JlYWRlci5BTk5PVEFUSU9OUyAmJiBpYW5ucyAhPSBudWxsKSB7CisgICAgICAgICAgICArK2F0dHJpYnV0ZUNvdW50OworICAgICAgICAgICAgc2l6ZSArPSA4ICsgaWFubnMuZ2V0U2l6ZSgpOworICAgICAgICAgICAgbmV3VVRGOCgiUnVudGltZUludmlzaWJsZUFubm90YXRpb25zIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGF0dHJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGF0dHJpYnV0ZUNvdW50ICs9IGF0dHJzLmdldENvdW50KCk7CisgICAgICAgICAgICBzaXplICs9IGF0dHJzLmdldFNpemUodGhpcywgbnVsbCwgMCwgLTEsIC0xKTsKKyAgICAgICAgfQorICAgICAgICBzaXplICs9IHBvb2wubGVuZ3RoOworICAgICAgICAvLyBhbGxvY2F0ZXMgYSBieXRlIHZlY3RvciBvZiB0aGlzIHNpemUsIGluIG9yZGVyIHRvIGF2b2lkIHVubmVjZXNzYXJ5CisgICAgICAgIC8vIGFycmF5Y29weSBvcGVyYXRpb25zIGluIHRoZSBCeXRlVmVjdG9yLmVubGFyZ2UoKSBtZXRob2QKKyAgICAgICAgQnl0ZVZlY3RvciBvdXQgPSBuZXcgQnl0ZVZlY3RvcihzaXplKTsKKyAgICAgICAgb3V0LnB1dEludCgweENBRkVCQUJFKS5wdXRJbnQodmVyc2lvbik7CisgICAgICAgIG91dC5wdXRTaG9ydChpbmRleCkucHV0Qnl0ZUFycmF5KHBvb2wuZGF0YSwgMCwgcG9vbC5sZW5ndGgpOworICAgICAgICBpbnQgbWFzayA9IE9wY29kZXMuQUNDX0RFUFJFQ0FURUQKKyAgICAgICAgICAgICAgICB8IENsYXNzV3JpdGVyLkFDQ19TWU5USEVUSUNfQVRUUklCVVRFCisgICAgICAgICAgICAgICAgfCAoKGFjY2VzcyAmIENsYXNzV3JpdGVyLkFDQ19TWU5USEVUSUNfQVRUUklCVVRFKSAvIChDbGFzc1dyaXRlci5BQ0NfU1lOVEhFVElDX0FUVFJJQlVURSAvIE9wY29kZXMuQUNDX1NZTlRIRVRJQykpOworICAgICAgICBvdXQucHV0U2hvcnQoYWNjZXNzICYgfm1hc2spLnB1dFNob3J0KG5hbWUpLnB1dFNob3J0KHN1cGVyTmFtZSk7CisgICAgICAgIG91dC5wdXRTaG9ydChpbnRlcmZhY2VDb3VudCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW50ZXJmYWNlQ291bnQ7ICsraSkgeworICAgICAgICAgICAgb3V0LnB1dFNob3J0KGludGVyZmFjZXNbaV0pOworICAgICAgICB9CisgICAgICAgIG91dC5wdXRTaG9ydChuYkZpZWxkcyk7CisgICAgICAgIGZiID0gZmlyc3RGaWVsZDsKKyAgICAgICAgd2hpbGUgKGZiICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZiLnB1dChvdXQpOworICAgICAgICAgICAgZmIgPSAoRmllbGRXcml0ZXIpIGZiLmZ2OworICAgICAgICB9CisgICAgICAgIG91dC5wdXRTaG9ydChuYk1ldGhvZHMpOworICAgICAgICBtYiA9IGZpcnN0TWV0aG9kOworICAgICAgICB3aGlsZSAobWIgIT0gbnVsbCkgeworICAgICAgICAgICAgbWIucHV0KG91dCk7CisgICAgICAgICAgICBtYiA9IChNZXRob2RXcml0ZXIpIG1iLm12OworICAgICAgICB9CisgICAgICAgIG91dC5wdXRTaG9ydChhdHRyaWJ1dGVDb3VudCk7CisgICAgICAgIGlmIChib290c3RyYXBNZXRob2RzICE9IG51bGwpIHsgICAvLyBzaG91bGQgYmUgdGhlIGZpcnN0IGNsYXNzIGF0dHJpYnV0ZSA/CisgICAgICAgICAgICBvdXQucHV0U2hvcnQobmV3VVRGOCgiQm9vdHN0cmFwTWV0aG9kcyIpKTsKKyAgICAgICAgICAgIG91dC5wdXRJbnQoYm9vdHN0cmFwTWV0aG9kcy5sZW5ndGggKyAyKS5wdXRTaG9ydChib290c3RyYXBNZXRob2RzQ291bnQpOworICAgICAgICAgICAgb3V0LnB1dEJ5dGVBcnJheShib290c3RyYXBNZXRob2RzLmRhdGEsIDAsIGJvb3RzdHJhcE1ldGhvZHMubGVuZ3RoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoQ2xhc3NSZWFkZXIuU0lHTkFUVVJFUyAmJiBzaWduYXR1cmUgIT0gMCkgeworICAgICAgICAgICAgb3V0LnB1dFNob3J0KG5ld1VURjgoIlNpZ25hdHVyZSIpKS5wdXRJbnQoMikucHV0U2hvcnQoc2lnbmF0dXJlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc291cmNlRmlsZSAhPSAwKSB7CisgICAgICAgICAgICBvdXQucHV0U2hvcnQobmV3VVRGOCgiU291cmNlRmlsZSIpKS5wdXRJbnQoMikucHV0U2hvcnQoc291cmNlRmlsZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNvdXJjZURlYnVnICE9IG51bGwpIHsKKyAgICAgICAgICAgIGludCBsZW4gPSBzb3VyY2VEZWJ1Zy5sZW5ndGggLSAyOworICAgICAgICAgICAgb3V0LnB1dFNob3J0KG5ld1VURjgoIlNvdXJjZURlYnVnRXh0ZW5zaW9uIikpLnB1dEludChsZW4pOworICAgICAgICAgICAgb3V0LnB1dEJ5dGVBcnJheShzb3VyY2VEZWJ1Zy5kYXRhLCAyLCBsZW4pOworICAgICAgICB9CisgICAgICAgIGlmIChlbmNsb3NpbmdNZXRob2RPd25lciAhPSAwKSB7CisgICAgICAgICAgICBvdXQucHV0U2hvcnQobmV3VVRGOCgiRW5jbG9zaW5nTWV0aG9kIikpLnB1dEludCg0KTsKKyAgICAgICAgICAgIG91dC5wdXRTaG9ydChlbmNsb3NpbmdNZXRob2RPd25lcikucHV0U2hvcnQoZW5jbG9zaW5nTWV0aG9kKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGFjY2VzcyAmIE9wY29kZXMuQUNDX0RFUFJFQ0FURUQpICE9IDApIHsKKyAgICAgICAgICAgIG91dC5wdXRTaG9ydChuZXdVVEY4KCJEZXByZWNhdGVkIikpLnB1dEludCgwKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGFjY2VzcyAmIE9wY29kZXMuQUNDX1NZTlRIRVRJQykgIT0gMAorICAgICAgICAgICAgICAgICYmICgodmVyc2lvbiAmIDB4RkZGRikgPCBPcGNvZGVzLlYxXzUgfHwgKGFjY2VzcyAmIEFDQ19TWU5USEVUSUNfQVRUUklCVVRFKSAhPSAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0LnB1dFNob3J0KG5ld1VURjgoIlN5bnRoZXRpYyIpKS5wdXRJbnQoMCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlubmVyQ2xhc3NlcyAhPSBudWxsKSB7CisgICAgICAgICAgICBvdXQucHV0U2hvcnQobmV3VVRGOCgiSW5uZXJDbGFzc2VzIikpOworICAgICAgICAgICAgb3V0LnB1dEludChpbm5lckNsYXNzZXMubGVuZ3RoICsgMikucHV0U2hvcnQoaW5uZXJDbGFzc2VzQ291bnQpOworICAgICAgICAgICAgb3V0LnB1dEJ5dGVBcnJheShpbm5lckNsYXNzZXMuZGF0YSwgMCwgaW5uZXJDbGFzc2VzLmxlbmd0aCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKENsYXNzUmVhZGVyLkFOTk9UQVRJT05TICYmIGFubnMgIT0gbnVsbCkgeworICAgICAgICAgICAgb3V0LnB1dFNob3J0KG5ld1VURjgoIlJ1bnRpbWVWaXNpYmxlQW5ub3RhdGlvbnMiKSk7CisgICAgICAgICAgICBhbm5zLnB1dChvdXQpOworICAgICAgICB9CisgICAgICAgIGlmIChDbGFzc1JlYWRlci5BTk5PVEFUSU9OUyAmJiBpYW5ucyAhPSBudWxsKSB7CisgICAgICAgICAgICBvdXQucHV0U2hvcnQobmV3VVRGOCgiUnVudGltZUludmlzaWJsZUFubm90YXRpb25zIikpOworICAgICAgICAgICAgaWFubnMucHV0KG91dCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGF0dHJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGF0dHJzLnB1dCh0aGlzLCBudWxsLCAwLCAtMSwgLTEsIG91dCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGludmFsaWRGcmFtZXMpIHsKKyAgICAgICAgICAgIENsYXNzV3JpdGVyIGN3ID0gbmV3IENsYXNzV3JpdGVyKENPTVBVVEVfRlJBTUVTKTsKKyAgICAgICAgICAgIG5ldyBDbGFzc1JlYWRlcihvdXQuZGF0YSkuYWNjZXB0KGN3LCBDbGFzc1JlYWRlci5TS0lQX0ZSQU1FUyk7CisgICAgICAgICAgICByZXR1cm4gY3cudG9CeXRlQXJyYXkoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gb3V0LmRhdGE7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gVXRpbGl0eSBtZXRob2RzOiBjb25zdGFudCBwb29sIG1hbmFnZW1lbnQKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBudW1iZXIgb3Igc3RyaW5nIGNvbnN0YW50IHRvIHRoZSBjb25zdGFudCBwb29sIG9mIHRoZSBjbGFzcyBiZWluZworICAgICAqIGJ1aWxkLiBEb2VzIG5vdGhpbmcgaWYgdGhlIGNvbnN0YW50IHBvb2wgYWxyZWFkeSBjb250YWlucyBhIHNpbWlsYXIgaXRlbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjc3QgdGhlIHZhbHVlIG9mIHRoZSBjb25zdGFudCB0byBiZSBhZGRlZCB0byB0aGUgY29uc3RhbnQgcG9vbC4KKyAgICAgKiAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhbiB7QGxpbmsgSW50ZWdlcn0sIGEge0BsaW5rIEZsb2F0fSwgYQorICAgICAqICAgICAgICB7QGxpbmsgTG9uZ30sIGEge0BsaW5rIERvdWJsZX0sIGEge0BsaW5rIFN0cmluZ30gb3IgYQorICAgICAqICAgICAgICB7QGxpbmsgVHlwZX0uCisgICAgICogQHJldHVybiBhIG5ldyBvciBhbHJlYWR5IGV4aXN0aW5nIGNvbnN0YW50IGl0ZW0gd2l0aCB0aGUgZ2l2ZW4gdmFsdWUuCisgICAgICovCisgICAgSXRlbSBuZXdDb25zdEl0ZW0oZmluYWwgT2JqZWN0IGNzdCkgeworICAgICAgICBpZiAoY3N0IGluc3RhbmNlb2YgSW50ZWdlcikgeworICAgICAgICAgICAgaW50IHZhbCA9ICgoSW50ZWdlcikgY3N0KS5pbnRWYWx1ZSgpOworICAgICAgICAgICAgcmV0dXJuIG5ld0ludGVnZXIodmFsKTsKKyAgICAgICAgfSBlbHNlIGlmIChjc3QgaW5zdGFuY2VvZiBCeXRlKSB7CisgICAgICAgICAgICBpbnQgdmFsID0gKChCeXRlKSBjc3QpLmludFZhbHVlKCk7CisgICAgICAgICAgICByZXR1cm4gbmV3SW50ZWdlcih2YWwpOworICAgICAgICB9IGVsc2UgaWYgKGNzdCBpbnN0YW5jZW9mIENoYXJhY3RlcikgeworICAgICAgICAgICAgaW50IHZhbCA9ICgoQ2hhcmFjdGVyKSBjc3QpLmNoYXJWYWx1ZSgpOworICAgICAgICAgICAgcmV0dXJuIG5ld0ludGVnZXIodmFsKTsKKyAgICAgICAgfSBlbHNlIGlmIChjc3QgaW5zdGFuY2VvZiBTaG9ydCkgeworICAgICAgICAgICAgaW50IHZhbCA9ICgoU2hvcnQpIGNzdCkuaW50VmFsdWUoKTsKKyAgICAgICAgICAgIHJldHVybiBuZXdJbnRlZ2VyKHZhbCk7CisgICAgICAgIH0gZWxzZSBpZiAoY3N0IGluc3RhbmNlb2YgQm9vbGVhbikgeworICAgICAgICAgICAgaW50IHZhbCA9ICgoQm9vbGVhbikgY3N0KS5ib29sZWFuVmFsdWUoKSA/IDEgOiAwOworICAgICAgICAgICAgcmV0dXJuIG5ld0ludGVnZXIodmFsKTsKKyAgICAgICAgfSBlbHNlIGlmIChjc3QgaW5zdGFuY2VvZiBGbG9hdCkgeworICAgICAgICAgICAgZmxvYXQgdmFsID0gKChGbG9hdCkgY3N0KS5mbG9hdFZhbHVlKCk7CisgICAgICAgICAgICByZXR1cm4gbmV3RmxvYXQodmFsKTsKKyAgICAgICAgfSBlbHNlIGlmIChjc3QgaW5zdGFuY2VvZiBMb25nKSB7CisgICAgICAgICAgICBsb25nIHZhbCA9ICgoTG9uZykgY3N0KS5sb25nVmFsdWUoKTsKKyAgICAgICAgICAgIHJldHVybiBuZXdMb25nKHZhbCk7CisgICAgICAgIH0gZWxzZSBpZiAoY3N0IGluc3RhbmNlb2YgRG91YmxlKSB7CisgICAgICAgICAgICBkb3VibGUgdmFsID0gKChEb3VibGUpIGNzdCkuZG91YmxlVmFsdWUoKTsKKyAgICAgICAgICAgIHJldHVybiBuZXdEb3VibGUodmFsKTsKKyAgICAgICAgfSBlbHNlIGlmIChjc3QgaW5zdGFuY2VvZiBTdHJpbmcpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXdTdHJpbmcoKFN0cmluZykgY3N0KTsKKyAgICAgICAgfSBlbHNlIGlmIChjc3QgaW5zdGFuY2VvZiBUeXBlKSB7CisgICAgICAgICAgICBUeXBlIHQgPSAoVHlwZSkgY3N0OworICAgICAgICAgICAgaW50IHMgPSB0LmdldFNvcnQoKTsKKyAgICAgICAgICAgIGlmIChzID09IFR5cGUuQVJSQVkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3Q2xhc3NJdGVtKHQuZ2V0RGVzY3JpcHRvcigpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocyA9PSBUeXBlLk9CSkVDVCkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXdDbGFzc0l0ZW0odC5nZXRJbnRlcm5hbE5hbWUoKSk7CisgICAgICAgICAgICB9IGVsc2UgeyAvLyBzID09IFR5cGUuTUVUSE9ECisgICAgICAgICAgICAgICAgcmV0dXJuIG5ld01ldGhvZFR5cGVJdGVtKHQuZ2V0RGVzY3JpcHRvcigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChjc3QgaW5zdGFuY2VvZiBIYW5kbGUpIHsKKyAgICAgICAgICAgIEhhbmRsZSBoID0gKEhhbmRsZSkgY3N0OworICAgICAgICAgICAgcmV0dXJuIG5ld0hhbmRsZUl0ZW0oaC50YWcsIGgub3duZXIsIGgubmFtZSwgaC5kZXNjKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInZhbHVlICIgKyBjc3QpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIG51bWJlciBvciBzdHJpbmcgY29uc3RhbnQgdG8gdGhlIGNvbnN0YW50IHBvb2wgb2YgdGhlIGNsYXNzIGJlaW5nCisgICAgICogYnVpbGQuIERvZXMgbm90aGluZyBpZiB0aGUgY29uc3RhbnQgcG9vbCBhbHJlYWR5IGNvbnRhaW5zIGEgc2ltaWxhciBpdGVtLgorICAgICAqIDxpPlRoaXMgbWV0aG9kIGlzIGludGVuZGVkIGZvciB7QGxpbmsgQXR0cmlidXRlfSBzdWIgY2xhc3NlcywgYW5kIGlzCisgICAgICogbm9ybWFsbHkgbm90IG5lZWRlZCBieSBjbGFzcyBnZW5lcmF0b3JzIG9yIGFkYXB0ZXJzLjwvaT4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjc3QgdGhlIHZhbHVlIG9mIHRoZSBjb25zdGFudCB0byBiZSBhZGRlZCB0byB0aGUgY29uc3RhbnQgcG9vbC4KKyAgICAgKiAgICAgICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBhbiB7QGxpbmsgSW50ZWdlcn0sIGEge0BsaW5rIEZsb2F0fSwgYQorICAgICAqICAgICAgICB7QGxpbmsgTG9uZ30sIGEge0BsaW5rIERvdWJsZX0gb3IgYSB7QGxpbmsgU3RyaW5nfS4KKyAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCBvZiBhIG5ldyBvciBhbHJlYWR5IGV4aXN0aW5nIGNvbnN0YW50IGl0ZW0gd2l0aCB0aGUKKyAgICAgKiAgICAgICAgIGdpdmVuIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgbmV3Q29uc3QoZmluYWwgT2JqZWN0IGNzdCkgeworICAgICAgICByZXR1cm4gbmV3Q29uc3RJdGVtKGNzdCkuaW5kZXg7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhbiBVVEY4IHN0cmluZyB0byB0aGUgY29uc3RhbnQgcG9vbCBvZiB0aGUgY2xhc3MgYmVpbmcgYnVpbGQuIERvZXMKKyAgICAgKiBub3RoaW5nIGlmIHRoZSBjb25zdGFudCBwb29sIGFscmVhZHkgY29udGFpbnMgYSBzaW1pbGFyIGl0ZW0uIDxpPlRoaXMKKyAgICAgKiBtZXRob2QgaXMgaW50ZW5kZWQgZm9yIHtAbGluayBBdHRyaWJ1dGV9IHN1YiBjbGFzc2VzLCBhbmQgaXMgbm9ybWFsbHkgbm90CisgICAgICogbmVlZGVkIGJ5IGNsYXNzIGdlbmVyYXRvcnMgb3IgYWRhcHRlcnMuPC9pPgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlIHRoZSBTdHJpbmcgdmFsdWUuCisgICAgICogQHJldHVybiB0aGUgaW5kZXggb2YgYSBuZXcgb3IgYWxyZWFkeSBleGlzdGluZyBVVEY4IGl0ZW0uCisgICAgICovCisgICAgcHVibGljIGludCBuZXdVVEY4KGZpbmFsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICBrZXkuc2V0KFVURjgsIHZhbHVlLCBudWxsLCBudWxsKTsKKyAgICAgICAgSXRlbSByZXN1bHQgPSBnZXQoa2V5KTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7CisgICAgICAgICAgICBwb29sLnB1dEJ5dGUoVVRGOCkucHV0VVRGOCh2YWx1ZSk7CisgICAgICAgICAgICByZXN1bHQgPSBuZXcgSXRlbShpbmRleCsrLCBrZXkpOworICAgICAgICAgICAgcHV0KHJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5pbmRleDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgY2xhc3MgcmVmZXJlbmNlIHRvIHRoZSBjb25zdGFudCBwb29sIG9mIHRoZSBjbGFzcyBiZWluZyBidWlsZC4KKyAgICAgKiBEb2VzIG5vdGhpbmcgaWYgdGhlIGNvbnN0YW50IHBvb2wgYWxyZWFkeSBjb250YWlucyBhIHNpbWlsYXIgaXRlbS4KKyAgICAgKiA8aT5UaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBmb3Ige0BsaW5rIEF0dHJpYnV0ZX0gc3ViIGNsYXNzZXMsIGFuZCBpcworICAgICAqIG5vcm1hbGx5IG5vdCBuZWVkZWQgYnkgY2xhc3MgZ2VuZXJhdG9ycyBvciBhZGFwdGVycy48L2k+CisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIGludGVybmFsIG5hbWUgb2YgdGhlIGNsYXNzLgorICAgICAqIEByZXR1cm4gYSBuZXcgb3IgYWxyZWFkeSBleGlzdGluZyBjbGFzcyByZWZlcmVuY2UgaXRlbS4KKyAgICAgKi8KKyAgICBJdGVtIG5ld0NsYXNzSXRlbShmaW5hbCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAga2V5Mi5zZXQoQ0xBU1MsIHZhbHVlLCBudWxsLCBudWxsKTsKKyAgICAgICAgSXRlbSByZXN1bHQgPSBnZXQoa2V5Mik7CisgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgeworICAgICAgICAgICAgcG9vbC5wdXQxMihDTEFTUywgbmV3VVRGOCh2YWx1ZSkpOworICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEl0ZW0oaW5kZXgrKywga2V5Mik7CisgICAgICAgICAgICBwdXQocmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBjbGFzcyByZWZlcmVuY2UgdG8gdGhlIGNvbnN0YW50IHBvb2wgb2YgdGhlIGNsYXNzIGJlaW5nIGJ1aWxkLgorICAgICAqIERvZXMgbm90aGluZyBpZiB0aGUgY29uc3RhbnQgcG9vbCBhbHJlYWR5IGNvbnRhaW5zIGEgc2ltaWxhciBpdGVtLgorICAgICAqIDxpPlRoaXMgbWV0aG9kIGlzIGludGVuZGVkIGZvciB7QGxpbmsgQXR0cmlidXRlfSBzdWIgY2xhc3NlcywgYW5kIGlzCisgICAgICogbm9ybWFsbHkgbm90IG5lZWRlZCBieSBjbGFzcyBnZW5lcmF0b3JzIG9yIGFkYXB0ZXJzLjwvaT4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgaW50ZXJuYWwgbmFtZSBvZiB0aGUgY2xhc3MuCisgICAgICogQHJldHVybiB0aGUgaW5kZXggb2YgYSBuZXcgb3IgYWxyZWFkeSBleGlzdGluZyBjbGFzcyByZWZlcmVuY2UgaXRlbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IG5ld0NsYXNzKGZpbmFsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICByZXR1cm4gbmV3Q2xhc3NJdGVtKHZhbHVlKS5pbmRleDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgbWV0aG9kIHR5cGUgcmVmZXJlbmNlIHRvIHRoZSBjb25zdGFudCBwb29sIG9mIHRoZSBjbGFzcyBiZWluZworICAgICAqIGJ1aWxkLiBEb2VzIG5vdGhpbmcgaWYgdGhlIGNvbnN0YW50IHBvb2wgYWxyZWFkeSBjb250YWlucyBhIHNpbWlsYXIgaXRlbS4KKyAgICAgKiA8aT5UaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBmb3Ige0BsaW5rIEF0dHJpYnV0ZX0gc3ViIGNsYXNzZXMsIGFuZCBpcworICAgICAqIG5vcm1hbGx5IG5vdCBuZWVkZWQgYnkgY2xhc3MgZ2VuZXJhdG9ycyBvciBhZGFwdGVycy48L2k+CisgICAgICoKKyAgICAgKiBAcGFyYW0gbWV0aG9kRGVzYyBtZXRob2QgZGVzY3JpcHRvciBvZiB0aGUgbWV0aG9kIHR5cGUuCisgICAgICogQHJldHVybiBhIG5ldyBvciBhbHJlYWR5IGV4aXN0aW5nIG1ldGhvZCB0eXBlIHJlZmVyZW5jZSBpdGVtLgorICAgICAqLworICAgIEl0ZW0gbmV3TWV0aG9kVHlwZUl0ZW0oZmluYWwgU3RyaW5nIG1ldGhvZERlc2MpIHsKKyAgICAgICAga2V5Mi5zZXQoTVRZUEUsIG1ldGhvZERlc2MsIG51bGwsIG51bGwpOworICAgICAgICBJdGVtIHJlc3VsdCA9IGdldChrZXkyKTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7CisgICAgICAgICAgICBwb29sLnB1dDEyKE1UWVBFLCBuZXdVVEY4KG1ldGhvZERlc2MpKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBJdGVtKGluZGV4KyssIGtleTIpOworICAgICAgICAgICAgcHV0KHJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgbWV0aG9kIHR5cGUgcmVmZXJlbmNlIHRvIHRoZSBjb25zdGFudCBwb29sIG9mIHRoZSBjbGFzcyBiZWluZworICAgICAqIGJ1aWxkLiBEb2VzIG5vdGhpbmcgaWYgdGhlIGNvbnN0YW50IHBvb2wgYWxyZWFkeSBjb250YWlucyBhIHNpbWlsYXIgaXRlbS4KKyAgICAgKiA8aT5UaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBmb3Ige0BsaW5rIEF0dHJpYnV0ZX0gc3ViIGNsYXNzZXMsIGFuZCBpcworICAgICAqIG5vcm1hbGx5IG5vdCBuZWVkZWQgYnkgY2xhc3MgZ2VuZXJhdG9ycyBvciBhZGFwdGVycy48L2k+CisgICAgICoKKyAgICAgKiBAcGFyYW0gbWV0aG9kRGVzYyBtZXRob2QgZGVzY3JpcHRvciBvZiB0aGUgbWV0aG9kIHR5cGUuCisgICAgICogQHJldHVybiB0aGUgaW5kZXggb2YgYSBuZXcgb3IgYWxyZWFkeSBleGlzdGluZyBtZXRob2QgdHlwZSByZWZlcmVuY2UKKyAgICAgKiAgICAgICAgIGl0ZW0uCisgICAgICovCisgICAgcHVibGljIGludCBuZXdNZXRob2RUeXBlKGZpbmFsIFN0cmluZyBtZXRob2REZXNjKSB7CisgICAgICAgIHJldHVybiBuZXdNZXRob2RUeXBlSXRlbShtZXRob2REZXNjKS5pbmRleDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgaGFuZGxlIHRvIHRoZSBjb25zdGFudCBwb29sIG9mIHRoZSBjbGFzcyBiZWluZyBidWlsZC4gRG9lcyBub3RoaW5nCisgICAgICogaWYgdGhlIGNvbnN0YW50IHBvb2wgYWxyZWFkeSBjb250YWlucyBhIHNpbWlsYXIgaXRlbS4gPGk+VGhpcyBtZXRob2QgaXMKKyAgICAgKiBpbnRlbmRlZCBmb3Ige0BsaW5rIEF0dHJpYnV0ZX0gc3ViIGNsYXNzZXMsIGFuZCBpcyBub3JtYWxseSBub3QgbmVlZGVkIGJ5CisgICAgICogY2xhc3MgZ2VuZXJhdG9ycyBvciBhZGFwdGVycy48L2k+CisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFnIHRoZSBraW5kIG9mIHRoaXMgaGFuZGxlLiBNdXN0IGJlIHtAbGluayBPcGNvZGVzI0hfR0VURklFTER9LAorICAgICAqICAgICAgICB7QGxpbmsgT3Bjb2RlcyNIX0dFVFNUQVRJQ30sIHtAbGluayBPcGNvZGVzI0hfUFVURklFTER9LAorICAgICAqICAgICAgICB7QGxpbmsgT3Bjb2RlcyNIX1BVVFNUQVRJQ30sIHtAbGluayBPcGNvZGVzI0hfSU5WT0tFVklSVFVBTH0sCisgICAgICogICAgICAgIHtAbGluayBPcGNvZGVzI0hfSU5WT0tFU1RBVElDfSwge0BsaW5rIE9wY29kZXMjSF9JTlZPS0VTUEVDSUFMfSwKKyAgICAgKiAgICAgICAge0BsaW5rIE9wY29kZXMjSF9ORVdJTlZPS0VTUEVDSUFMfSBvcgorICAgICAqICAgICAgICB7QGxpbmsgT3Bjb2RlcyNIX0lOVk9LRUlOVEVSRkFDRX0uCisgICAgICogQHBhcmFtIG93bmVyIHRoZSBpbnRlcm5hbCBuYW1lIG9mIHRoZSBmaWVsZCBvciBtZXRob2Qgb3duZXIgY2xhc3MuCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpZWxkIG9yIG1ldGhvZC4KKyAgICAgKiBAcGFyYW0gZGVzYyB0aGUgZGVzY3JpcHRvciBvZiB0aGUgZmllbGQgb3IgbWV0aG9kLgorICAgICAqIEByZXR1cm4gYSBuZXcgb3IgYW4gYWxyZWFkeSBleGlzdGluZyBtZXRob2QgdHlwZSByZWZlcmVuY2UgaXRlbS4KKyAgICAgKi8KKyAgICBJdGVtIG5ld0hhbmRsZUl0ZW0oCisgICAgICAgIGZpbmFsIGludCB0YWcsCisgICAgICAgIGZpbmFsIFN0cmluZyBvd25lciwKKyAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUsCisgICAgICAgIGZpbmFsIFN0cmluZyBkZXNjKQorICAgIHsKKyAgICAgICAga2V5NC5zZXQoSEFORExFX0JBU0UgKyB0YWcsIG93bmVyLCBuYW1lLCBkZXNjKTsKKyAgICAgICAgSXRlbSByZXN1bHQgPSBnZXQoa2V5NCk7CisgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHRhZyA8PSBPcGNvZGVzLkhfUFVUU1RBVElDKSB7CisgICAgICAgICAgICAgICAgcHV0MTEyKEhBTkRMRSwgdGFnLCBuZXdGaWVsZChvd25lciwgbmFtZSwgZGVzYykpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwdXQxMTIoSEFORExFLCB0YWcsIG5ld01ldGhvZChvd25lciwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgdGFnID09IE9wY29kZXMuSF9JTlZPS0VJTlRFUkZBQ0UpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBJdGVtKGluZGV4KyssIGtleTQpOworICAgICAgICAgICAgcHV0KHJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgaGFuZGxlIHRvIHRoZSBjb25zdGFudCBwb29sIG9mIHRoZSBjbGFzcyBiZWluZworICAgICAqIGJ1aWxkLiBEb2VzIG5vdGhpbmcgaWYgdGhlIGNvbnN0YW50IHBvb2wgYWxyZWFkeSBjb250YWlucyBhIHNpbWlsYXIgaXRlbS4KKyAgICAgKiA8aT5UaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBmb3Ige0BsaW5rIEF0dHJpYnV0ZX0gc3ViIGNsYXNzZXMsIGFuZCBpcworICAgICAqIG5vcm1hbGx5IG5vdCBuZWVkZWQgYnkgY2xhc3MgZ2VuZXJhdG9ycyBvciBhZGFwdGVycy48L2k+CisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFnIHRoZSBraW5kIG9mIHRoaXMgaGFuZGxlLiBNdXN0IGJlIHtAbGluayBPcGNvZGVzI0hfR0VURklFTER9LAorICAgICAqICAgICAgICB7QGxpbmsgT3Bjb2RlcyNIX0dFVFNUQVRJQ30sIHtAbGluayBPcGNvZGVzI0hfUFVURklFTER9LAorICAgICAqICAgICAgICB7QGxpbmsgT3Bjb2RlcyNIX1BVVFNUQVRJQ30sIHtAbGluayBPcGNvZGVzI0hfSU5WT0tFVklSVFVBTH0sCisgICAgICogICAgICAgIHtAbGluayBPcGNvZGVzI0hfSU5WT0tFU1RBVElDfSwge0BsaW5rIE9wY29kZXMjSF9JTlZPS0VTUEVDSUFMfSwKKyAgICAgKiAgICAgICAge0BsaW5rIE9wY29kZXMjSF9ORVdJTlZPS0VTUEVDSUFMfSBvcgorICAgICAqICAgICAgICB7QGxpbmsgT3Bjb2RlcyNIX0lOVk9LRUlOVEVSRkFDRX0uCisgICAgICogQHBhcmFtIG93bmVyIHRoZSBpbnRlcm5hbCBuYW1lIG9mIHRoZSBmaWVsZCBvciBtZXRob2Qgb3duZXIgY2xhc3MuCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpZWxkIG9yIG1ldGhvZC4KKyAgICAgKiBAcGFyYW0gZGVzYyB0aGUgZGVzY3JpcHRvciBvZiB0aGUgZmllbGQgb3IgbWV0aG9kLgorICAgICAqIEByZXR1cm4gdGhlIGluZGV4IG9mIGEgbmV3IG9yIGFscmVhZHkgZXhpc3RpbmcgbWV0aG9kIHR5cGUgcmVmZXJlbmNlCisgICAgICogICAgICAgICBpdGVtLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgbmV3SGFuZGxlKAorICAgICAgICBmaW5hbCBpbnQgdGFnLAorICAgICAgICBmaW5hbCBTdHJpbmcgb3duZXIsCisgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lLAorICAgICAgICBmaW5hbCBTdHJpbmcgZGVzYykKKyAgICB7CisgICAgICAgIHJldHVybiBuZXdIYW5kbGVJdGVtKHRhZywgb3duZXIsIG5hbWUsIGRlc2MpLmluZGV4OworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYW4gaW52b2tlZHluYW1pYyByZWZlcmVuY2UgdG8gdGhlIGNvbnN0YW50IHBvb2wgb2YgdGhlIGNsYXNzIGJlaW5nCisgICAgICogYnVpbGQuIERvZXMgbm90aGluZyBpZiB0aGUgY29uc3RhbnQgcG9vbCBhbHJlYWR5IGNvbnRhaW5zIGEgc2ltaWxhciBpdGVtLgorICAgICAqIDxpPlRoaXMgbWV0aG9kIGlzIGludGVuZGVkIGZvciB7QGxpbmsgQXR0cmlidXRlfSBzdWIgY2xhc3NlcywgYW5kIGlzCisgICAgICogbm9ybWFsbHkgbm90IG5lZWRlZCBieSBjbGFzcyBnZW5lcmF0b3JzIG9yIGFkYXB0ZXJzLjwvaT4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIG5hbWUgb2YgdGhlIGludm9rZWQgbWV0aG9kLgorICAgICAqIEBwYXJhbSBkZXNjIGRlc2NyaXB0b3Igb2YgdGhlIGludm9rZSBtZXRob2QuCisgICAgICogQHBhcmFtIGJzbSB0aGUgYm9vdHN0cmFwIG1ldGhvZC4KKyAgICAgKiBAcGFyYW0gYnNtQXJncyB0aGUgYm9vdHN0cmFwIG1ldGhvZCBjb25zdGFudCBhcmd1bWVudHMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgbmV3IG9yIGFuIGFscmVhZHkgZXhpc3RpbmcgaW52b2tlZHluYW1pYyB0eXBlIHJlZmVyZW5jZSBpdGVtLgorICAgICAqLworICAgIEl0ZW0gbmV3SW52b2tlRHluYW1pY0l0ZW0oCisgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lLAorICAgICAgICBmaW5hbCBTdHJpbmcgZGVzYywKKyAgICAgICAgZmluYWwgSGFuZGxlIGJzbSwKKyAgICAgICAgZmluYWwgT2JqZWN0Li4uIGJzbUFyZ3MpCisgICAgeworICAgICAgICAvLyBjYWNoZSBmb3IgcGVyZm9ybWFuY2UKKyAgICAgICAgQnl0ZVZlY3RvciBib290c3RyYXBNZXRob2RzID0gdGhpcy5ib290c3RyYXBNZXRob2RzOworICAgICAgICBpZiAoYm9vdHN0cmFwTWV0aG9kcyA9PSBudWxsKSB7CisgICAgICAgICAgICBib290c3RyYXBNZXRob2RzID0gdGhpcy5ib290c3RyYXBNZXRob2RzID0gbmV3IEJ5dGVWZWN0b3IoKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBwb3NpdGlvbiA9IGJvb3RzdHJhcE1ldGhvZHMubGVuZ3RoOyAvLyByZWNvcmQgY3VycmVudCBwb3NpdGlvbgorCisgICAgICAgIGludCBoYXNoQ29kZSA9IGJzbS5oYXNoQ29kZSgpOworICAgICAgICBib290c3RyYXBNZXRob2RzLnB1dFNob3J0KG5ld0hhbmRsZShic20udGFnLAorICAgICAgICAgICAgICAgIGJzbS5vd25lciwKKyAgICAgICAgICAgICAgICBic20ubmFtZSwKKyAgICAgICAgICAgICAgICBic20uZGVzYykpOworCisgICAgICAgIGludCBhcmdzTGVuZ3RoID0gYnNtQXJncy5sZW5ndGg7CisgICAgICAgIGJvb3RzdHJhcE1ldGhvZHMucHV0U2hvcnQoYXJnc0xlbmd0aCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzTGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIE9iamVjdCBic21BcmcgPSBic21BcmdzW2ldOworICAgICAgICAgICAgaGFzaENvZGUgXj0gYnNtQXJnLmhhc2hDb2RlKCk7CisgICAgICAgICAgICBib290c3RyYXBNZXRob2RzLnB1dFNob3J0KG5ld0NvbnN0KGJzbUFyZykpOworICAgICAgICB9CisKKyAgICAgICAgYnl0ZVtdIGRhdGEgPSBib290c3RyYXBNZXRob2RzLmRhdGE7CisgICAgICAgIGludCBsZW5ndGggPSAoMSArIDEgKyBhcmdzTGVuZ3RoKSA8PCAxOyAvLyAoYnNtICsgYXJnQ291bnQgKyBhcmd1bWVudHMpCisgICAgICAgIGhhc2hDb2RlICY9IDB4N0ZGRkZGRkY7CisgICAgICAgIEl0ZW0gcmVzdWx0ID0gaXRlbXNbaGFzaENvZGUgJSBpdGVtcy5sZW5ndGhdOworICAgICAgICBsb29wOiB3aGlsZSAocmVzdWx0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChyZXN1bHQudHlwZSAhPSBCU00gfHwgcmVzdWx0Lmhhc2hDb2RlICE9IGhhc2hDb2RlKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0Lm5leHQ7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhlIGRhdGEgZW5jb2RlIHRoZSBzaXplIG9mIHRoZSBhcmd1bWVudAorICAgICAgICAgICAgLy8gd2UgZG9uJ3QgbmVlZCB0byB0ZXN0IGlmIHRoZXNlIHNpemUgYXJlIGVxdWFscworICAgICAgICAgICAgaW50IHJlc3VsdFBvc2l0aW9uID0gcmVzdWx0LmludFZhbDsKKyAgICAgICAgICAgIGZvciAoaW50IHAgPSAwOyBwIDwgbGVuZ3RoOyBwKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoZGF0YVtwb3NpdGlvbiArIHBdICE9IGRhdGFbcmVzdWx0UG9zaXRpb24gKyBwXSkgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQubmV4dDsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUgbG9vcDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGludCBib290c3RyYXBNZXRob2RJbmRleDsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7CisgICAgICAgICAgICBib290c3RyYXBNZXRob2RJbmRleCA9IHJlc3VsdC5pbmRleDsKKyAgICAgICAgICAgIGJvb3RzdHJhcE1ldGhvZHMubGVuZ3RoID0gcG9zaXRpb247IC8vIHJldmVydCB0byBvbGQgcG9zaXRpb24KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJvb3RzdHJhcE1ldGhvZEluZGV4ID0gYm9vdHN0cmFwTWV0aG9kc0NvdW50Kys7CisgICAgICAgICAgICByZXN1bHQgPSBuZXcgSXRlbShib290c3RyYXBNZXRob2RJbmRleCk7CisgICAgICAgICAgICByZXN1bHQuc2V0KHBvc2l0aW9uLCBoYXNoQ29kZSk7CisgICAgICAgICAgICBwdXQocmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG5vdywgY3JlYXRlIHRoZSBJbnZva2VEeW5hbWljIGNvbnN0YW50CisgICAgICAgIGtleTMuc2V0KG5hbWUsIGRlc2MsIGJvb3RzdHJhcE1ldGhvZEluZGV4KTsKKyAgICAgICAgcmVzdWx0ID0gZ2V0KGtleTMpOworICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHB1dDEyMihJTkRZLCBib290c3RyYXBNZXRob2RJbmRleCwgbmV3TmFtZVR5cGUobmFtZSwgZGVzYykpOworICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEl0ZW0oaW5kZXgrKywga2V5Myk7CisgICAgICAgICAgICBwdXQocmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYW4gaW52b2tlZHluYW1pYyByZWZlcmVuY2UgdG8gdGhlIGNvbnN0YW50IHBvb2wgb2YgdGhlIGNsYXNzIGJlaW5nCisgICAgICogYnVpbGQuIERvZXMgbm90aGluZyBpZiB0aGUgY29uc3RhbnQgcG9vbCBhbHJlYWR5IGNvbnRhaW5zIGEgc2ltaWxhciBpdGVtLgorICAgICAqIDxpPlRoaXMgbWV0aG9kIGlzIGludGVuZGVkIGZvciB7QGxpbmsgQXR0cmlidXRlfSBzdWIgY2xhc3NlcywgYW5kIGlzCisgICAgICogbm9ybWFsbHkgbm90IG5lZWRlZCBieSBjbGFzcyBnZW5lcmF0b3JzIG9yIGFkYXB0ZXJzLjwvaT4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIG5hbWUgb2YgdGhlIGludm9rZWQgbWV0aG9kLgorICAgICAqIEBwYXJhbSBkZXNjIGRlc2NyaXB0b3Igb2YgdGhlIGludm9rZSBtZXRob2QuCisgICAgICogQHBhcmFtIGJzbSB0aGUgYm9vdHN0cmFwIG1ldGhvZC4KKyAgICAgKiBAcGFyYW0gYnNtQXJncyB0aGUgYm9vdHN0cmFwIG1ldGhvZCBjb25zdGFudCBhcmd1bWVudHMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCBvZiBhIG5ldyBvciBhbHJlYWR5IGV4aXN0aW5nIGludm9rZWR5bmFtaWMKKyAgICAgKiAgICAgICAgIHJlZmVyZW5jZSBpdGVtLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgbmV3SW52b2tlRHluYW1pYygKKyAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUsCisgICAgICAgIGZpbmFsIFN0cmluZyBkZXNjLAorICAgICAgICBmaW5hbCBIYW5kbGUgYnNtLAorICAgICAgICBmaW5hbCBPYmplY3QuLi4gYnNtQXJncykKKyAgICB7CisgICAgICAgIHJldHVybiBuZXdJbnZva2VEeW5hbWljSXRlbShuYW1lLCBkZXNjLCBic20sIGJzbUFyZ3MpLmluZGV4OworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBmaWVsZCByZWZlcmVuY2UgdG8gdGhlIGNvbnN0YW50IHBvb2wgb2YgdGhlIGNsYXNzIGJlaW5nIGJ1aWxkLgorICAgICAqIERvZXMgbm90aGluZyBpZiB0aGUgY29uc3RhbnQgcG9vbCBhbHJlYWR5IGNvbnRhaW5zIGEgc2ltaWxhciBpdGVtLgorICAgICAqCisgICAgICogQHBhcmFtIG93bmVyIHRoZSBpbnRlcm5hbCBuYW1lIG9mIHRoZSBmaWVsZCdzIG93bmVyIGNsYXNzLgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBmaWVsZCdzIG5hbWUuCisgICAgICogQHBhcmFtIGRlc2MgdGhlIGZpZWxkJ3MgZGVzY3JpcHRvci4KKyAgICAgKiBAcmV0dXJuIGEgbmV3IG9yIGFscmVhZHkgZXhpc3RpbmcgZmllbGQgcmVmZXJlbmNlIGl0ZW0uCisgICAgICovCisgICAgSXRlbSBuZXdGaWVsZEl0ZW0oZmluYWwgU3RyaW5nIG93bmVyLCBmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgU3RyaW5nIGRlc2MpCisgICAgeworICAgICAgICBrZXkzLnNldChGSUVMRCwgb3duZXIsIG5hbWUsIGRlc2MpOworICAgICAgICBJdGVtIHJlc3VsdCA9IGdldChrZXkzKTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7CisgICAgICAgICAgICBwdXQxMjIoRklFTEQsIG5ld0NsYXNzKG93bmVyKSwgbmV3TmFtZVR5cGUobmFtZSwgZGVzYykpOworICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEl0ZW0oaW5kZXgrKywga2V5Myk7CisgICAgICAgICAgICBwdXQocmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBmaWVsZCByZWZlcmVuY2UgdG8gdGhlIGNvbnN0YW50IHBvb2wgb2YgdGhlIGNsYXNzIGJlaW5nIGJ1aWxkLgorICAgICAqIERvZXMgbm90aGluZyBpZiB0aGUgY29uc3RhbnQgcG9vbCBhbHJlYWR5IGNvbnRhaW5zIGEgc2ltaWxhciBpdGVtLgorICAgICAqIDxpPlRoaXMgbWV0aG9kIGlzIGludGVuZGVkIGZvciB7QGxpbmsgQXR0cmlidXRlfSBzdWIgY2xhc3NlcywgYW5kIGlzCisgICAgICogbm9ybWFsbHkgbm90IG5lZWRlZCBieSBjbGFzcyBnZW5lcmF0b3JzIG9yIGFkYXB0ZXJzLjwvaT4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvd25lciB0aGUgaW50ZXJuYWwgbmFtZSBvZiB0aGUgZmllbGQncyBvd25lciBjbGFzcy4KKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgZmllbGQncyBuYW1lLgorICAgICAqIEBwYXJhbSBkZXNjIHRoZSBmaWVsZCdzIGRlc2NyaXB0b3IuCisgICAgICogQHJldHVybiB0aGUgaW5kZXggb2YgYSBuZXcgb3IgYWxyZWFkeSBleGlzdGluZyBmaWVsZCByZWZlcmVuY2UgaXRlbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IG5ld0ZpZWxkKGZpbmFsIFN0cmluZyBvd25lciwgZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIFN0cmluZyBkZXNjKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ld0ZpZWxkSXRlbShvd25lciwgbmFtZSwgZGVzYykuaW5kZXg7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIG1ldGhvZCByZWZlcmVuY2UgdG8gdGhlIGNvbnN0YW50IHBvb2wgb2YgdGhlIGNsYXNzIGJlaW5nIGJ1aWxkLgorICAgICAqIERvZXMgbm90aGluZyBpZiB0aGUgY29uc3RhbnQgcG9vbCBhbHJlYWR5IGNvbnRhaW5zIGEgc2ltaWxhciBpdGVtLgorICAgICAqCisgICAgICogQHBhcmFtIG93bmVyIHRoZSBpbnRlcm5hbCBuYW1lIG9mIHRoZSBtZXRob2QncyBvd25lciBjbGFzcy4KKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbWV0aG9kJ3MgbmFtZS4KKyAgICAgKiBAcGFyYW0gZGVzYyB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRvci4KKyAgICAgKiBAcGFyYW0gaXRmIDx0dD50cnVlPC90dD4gaWYgPHR0Pm93bmVyPC90dD4gaXMgYW4gaW50ZXJmYWNlLgorICAgICAqIEByZXR1cm4gYSBuZXcgb3IgYWxyZWFkeSBleGlzdGluZyBtZXRob2QgcmVmZXJlbmNlIGl0ZW0uCisgICAgICovCisgICAgSXRlbSBuZXdNZXRob2RJdGVtKAorICAgICAgICBmaW5hbCBTdHJpbmcgb3duZXIsCisgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lLAorICAgICAgICBmaW5hbCBTdHJpbmcgZGVzYywKKyAgICAgICAgZmluYWwgYm9vbGVhbiBpdGYpCisgICAgeworICAgICAgICBpbnQgdHlwZSA9IGl0ZiA/IElNRVRIIDogTUVUSDsKKyAgICAgICAga2V5My5zZXQodHlwZSwgb3duZXIsIG5hbWUsIGRlc2MpOworICAgICAgICBJdGVtIHJlc3VsdCA9IGdldChrZXkzKTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7CisgICAgICAgICAgICBwdXQxMjIodHlwZSwgbmV3Q2xhc3Mob3duZXIpLCBuZXdOYW1lVHlwZShuYW1lLCBkZXNjKSk7CisgICAgICAgICAgICByZXN1bHQgPSBuZXcgSXRlbShpbmRleCsrLCBrZXkzKTsKKyAgICAgICAgICAgIHB1dChyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIG1ldGhvZCByZWZlcmVuY2UgdG8gdGhlIGNvbnN0YW50IHBvb2wgb2YgdGhlIGNsYXNzIGJlaW5nIGJ1aWxkLgorICAgICAqIERvZXMgbm90aGluZyBpZiB0aGUgY29uc3RhbnQgcG9vbCBhbHJlYWR5IGNvbnRhaW5zIGEgc2ltaWxhciBpdGVtLgorICAgICAqIDxpPlRoaXMgbWV0aG9kIGlzIGludGVuZGVkIGZvciB7QGxpbmsgQXR0cmlidXRlfSBzdWIgY2xhc3NlcywgYW5kIGlzCisgICAgICogbm9ybWFsbHkgbm90IG5lZWRlZCBieSBjbGFzcyBnZW5lcmF0b3JzIG9yIGFkYXB0ZXJzLjwvaT4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvd25lciB0aGUgaW50ZXJuYWwgbmFtZSBvZiB0aGUgbWV0aG9kJ3Mgb3duZXIgY2xhc3MuCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG1ldGhvZCdzIG5hbWUuCisgICAgICogQHBhcmFtIGRlc2MgdGhlIG1ldGhvZCdzIGRlc2NyaXB0b3IuCisgICAgICogQHBhcmFtIGl0ZiA8dHQ+dHJ1ZTwvdHQ+IGlmIDx0dD5vd25lcjwvdHQ+IGlzIGFuIGludGVyZmFjZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCBvZiBhIG5ldyBvciBhbHJlYWR5IGV4aXN0aW5nIG1ldGhvZCByZWZlcmVuY2UgaXRlbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IG5ld01ldGhvZCgKKyAgICAgICAgZmluYWwgU3RyaW5nIG93bmVyLAorICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSwKKyAgICAgICAgZmluYWwgU3RyaW5nIGRlc2MsCisgICAgICAgIGZpbmFsIGJvb2xlYW4gaXRmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ld01ldGhvZEl0ZW0ob3duZXIsIG5hbWUsIGRlc2MsIGl0ZikuaW5kZXg7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhbiBpbnRlZ2VyIHRvIHRoZSBjb25zdGFudCBwb29sIG9mIHRoZSBjbGFzcyBiZWluZyBidWlsZC4gRG9lcworICAgICAqIG5vdGhpbmcgaWYgdGhlIGNvbnN0YW50IHBvb2wgYWxyZWFkeSBjb250YWlucyBhIHNpbWlsYXIgaXRlbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgaW50IHZhbHVlLgorICAgICAqIEByZXR1cm4gYSBuZXcgb3IgYWxyZWFkeSBleGlzdGluZyBpbnQgaXRlbS4KKyAgICAgKi8KKyAgICBJdGVtIG5ld0ludGVnZXIoZmluYWwgaW50IHZhbHVlKSB7CisgICAgICAgIGtleS5zZXQodmFsdWUpOworICAgICAgICBJdGVtIHJlc3VsdCA9IGdldChrZXkpOworICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHBvb2wucHV0Qnl0ZShJTlQpLnB1dEludCh2YWx1ZSk7CisgICAgICAgICAgICByZXN1bHQgPSBuZXcgSXRlbShpbmRleCsrLCBrZXkpOworICAgICAgICAgICAgcHV0KHJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgZmxvYXQgdG8gdGhlIGNvbnN0YW50IHBvb2wgb2YgdGhlIGNsYXNzIGJlaW5nIGJ1aWxkLiBEb2VzIG5vdGhpbmcKKyAgICAgKiBpZiB0aGUgY29uc3RhbnQgcG9vbCBhbHJlYWR5IGNvbnRhaW5zIGEgc2ltaWxhciBpdGVtLgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlIHRoZSBmbG9hdCB2YWx1ZS4KKyAgICAgKiBAcmV0dXJuIGEgbmV3IG9yIGFscmVhZHkgZXhpc3RpbmcgZmxvYXQgaXRlbS4KKyAgICAgKi8KKyAgICBJdGVtIG5ld0Zsb2F0KGZpbmFsIGZsb2F0IHZhbHVlKSB7CisgICAgICAgIGtleS5zZXQodmFsdWUpOworICAgICAgICBJdGVtIHJlc3VsdCA9IGdldChrZXkpOworICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHBvb2wucHV0Qnl0ZShGTE9BVCkucHV0SW50KGtleS5pbnRWYWwpOworICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEl0ZW0oaW5kZXgrKywga2V5KTsKKyAgICAgICAgICAgIHB1dChyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIGxvbmcgdG8gdGhlIGNvbnN0YW50IHBvb2wgb2YgdGhlIGNsYXNzIGJlaW5nIGJ1aWxkLiBEb2VzIG5vdGhpbmcKKyAgICAgKiBpZiB0aGUgY29uc3RhbnQgcG9vbCBhbHJlYWR5IGNvbnRhaW5zIGEgc2ltaWxhciBpdGVtLgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlIHRoZSBsb25nIHZhbHVlLgorICAgICAqIEByZXR1cm4gYSBuZXcgb3IgYWxyZWFkeSBleGlzdGluZyBsb25nIGl0ZW0uCisgICAgICovCisgICAgSXRlbSBuZXdMb25nKGZpbmFsIGxvbmcgdmFsdWUpIHsKKyAgICAgICAga2V5LnNldCh2YWx1ZSk7CisgICAgICAgIEl0ZW0gcmVzdWx0ID0gZ2V0KGtleSk7CisgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgeworICAgICAgICAgICAgcG9vbC5wdXRCeXRlKExPTkcpLnB1dExvbmcodmFsdWUpOworICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEl0ZW0oaW5kZXgsIGtleSk7CisgICAgICAgICAgICBpbmRleCArPSAyOworICAgICAgICAgICAgcHV0KHJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgZG91YmxlIHRvIHRoZSBjb25zdGFudCBwb29sIG9mIHRoZSBjbGFzcyBiZWluZyBidWlsZC4gRG9lcyBub3RoaW5nCisgICAgICogaWYgdGhlIGNvbnN0YW50IHBvb2wgYWxyZWFkeSBjb250YWlucyBhIHNpbWlsYXIgaXRlbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgZG91YmxlIHZhbHVlLgorICAgICAqIEByZXR1cm4gYSBuZXcgb3IgYWxyZWFkeSBleGlzdGluZyBkb3VibGUgaXRlbS4KKyAgICAgKi8KKyAgICBJdGVtIG5ld0RvdWJsZShmaW5hbCBkb3VibGUgdmFsdWUpIHsKKyAgICAgICAga2V5LnNldCh2YWx1ZSk7CisgICAgICAgIEl0ZW0gcmVzdWx0ID0gZ2V0KGtleSk7CisgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgeworICAgICAgICAgICAgcG9vbC5wdXRCeXRlKERPVUJMRSkucHV0TG9uZyhrZXkubG9uZ1ZhbCk7CisgICAgICAgICAgICByZXN1bHQgPSBuZXcgSXRlbShpbmRleCwga2V5KTsKKyAgICAgICAgICAgIGluZGV4ICs9IDI7CisgICAgICAgICAgICBwdXQocmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBzdHJpbmcgdG8gdGhlIGNvbnN0YW50IHBvb2wgb2YgdGhlIGNsYXNzIGJlaW5nIGJ1aWxkLiBEb2VzIG5vdGhpbmcKKyAgICAgKiBpZiB0aGUgY29uc3RhbnQgcG9vbCBhbHJlYWR5IGNvbnRhaW5zIGEgc2ltaWxhciBpdGVtLgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlIHRoZSBTdHJpbmcgdmFsdWUuCisgICAgICogQHJldHVybiBhIG5ldyBvciBhbHJlYWR5IGV4aXN0aW5nIHN0cmluZyBpdGVtLgorICAgICAqLworICAgIHByaXZhdGUgSXRlbSBuZXdTdHJpbmcoZmluYWwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIGtleTIuc2V0KFNUUiwgdmFsdWUsIG51bGwsIG51bGwpOworICAgICAgICBJdGVtIHJlc3VsdCA9IGdldChrZXkyKTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7CisgICAgICAgICAgICBwb29sLnB1dDEyKFNUUiwgbmV3VVRGOCh2YWx1ZSkpOworICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEl0ZW0oaW5kZXgrKywga2V5Mik7CisgICAgICAgICAgICBwdXQocmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBuYW1lIGFuZCB0eXBlIHRvIHRoZSBjb25zdGFudCBwb29sIG9mIHRoZSBjbGFzcyBiZWluZyBidWlsZC4gRG9lcworICAgICAqIG5vdGhpbmcgaWYgdGhlIGNvbnN0YW50IHBvb2wgYWxyZWFkeSBjb250YWlucyBhIHNpbWlsYXIgaXRlbS4gPGk+VGhpcworICAgICAqIG1ldGhvZCBpcyBpbnRlbmRlZCBmb3Ige0BsaW5rIEF0dHJpYnV0ZX0gc3ViIGNsYXNzZXMsIGFuZCBpcyBub3JtYWxseSBub3QKKyAgICAgKiBuZWVkZWQgYnkgY2xhc3MgZ2VuZXJhdG9ycyBvciBhZGFwdGVycy48L2k+CisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBhIG5hbWUuCisgICAgICogQHBhcmFtIGRlc2MgYSB0eXBlIGRlc2NyaXB0b3IuCisgICAgICogQHJldHVybiB0aGUgaW5kZXggb2YgYSBuZXcgb3IgYWxyZWFkeSBleGlzdGluZyBuYW1lIGFuZCB0eXBlIGl0ZW0uCisgICAgICovCisgICAgcHVibGljIGludCBuZXdOYW1lVHlwZShmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgU3RyaW5nIGRlc2MpIHsKKyAgICAgICAgcmV0dXJuIG5ld05hbWVUeXBlSXRlbShuYW1lLCBkZXNjKS5pbmRleDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgbmFtZSBhbmQgdHlwZSB0byB0aGUgY29uc3RhbnQgcG9vbCBvZiB0aGUgY2xhc3MgYmVpbmcgYnVpbGQuIERvZXMKKyAgICAgKiBub3RoaW5nIGlmIHRoZSBjb25zdGFudCBwb29sIGFscmVhZHkgY29udGFpbnMgYSBzaW1pbGFyIGl0ZW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBhIG5hbWUuCisgICAgICogQHBhcmFtIGRlc2MgYSB0eXBlIGRlc2NyaXB0b3IuCisgICAgICogQHJldHVybiBhIG5ldyBvciBhbHJlYWR5IGV4aXN0aW5nIG5hbWUgYW5kIHR5cGUgaXRlbS4KKyAgICAgKi8KKyAgICBJdGVtIG5ld05hbWVUeXBlSXRlbShmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgU3RyaW5nIGRlc2MpIHsKKyAgICAgICAga2V5Mi5zZXQoTkFNRV9UWVBFLCBuYW1lLCBkZXNjLCBudWxsKTsKKyAgICAgICAgSXRlbSByZXN1bHQgPSBnZXQoa2V5Mik7CisgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgeworICAgICAgICAgICAgcHV0MTIyKE5BTUVfVFlQRSwgbmV3VVRGOChuYW1lKSwgbmV3VVRGOChkZXNjKSk7CisgICAgICAgICAgICByZXN1bHQgPSBuZXcgSXRlbShpbmRleCsrLCBrZXkyKTsKKyAgICAgICAgICAgIHB1dChyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyB0aGUgZ2l2ZW4gaW50ZXJuYWwgbmFtZSB0byB7QGxpbmsgI3R5cGVUYWJsZX0gYW5kIHJldHVybnMgaXRzIGluZGV4LgorICAgICAqIERvZXMgbm90aGluZyBpZiB0aGUgdHlwZSB0YWJsZSBhbHJlYWR5IGNvbnRhaW5zIHRoaXMgaW50ZXJuYWwgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlIHRoZSBpbnRlcm5hbCBuYW1lIHRvIGJlIGFkZGVkIHRvIHRoZSB0eXBlIHRhYmxlLgorICAgICAqIEByZXR1cm4gdGhlIGluZGV4IG9mIHRoaXMgaW50ZXJuYWwgbmFtZSBpbiB0aGUgdHlwZSB0YWJsZS4KKyAgICAgKi8KKyAgICBpbnQgYWRkVHlwZShmaW5hbCBTdHJpbmcgdHlwZSkgeworICAgICAgICBrZXkuc2V0KFRZUEVfTk9STUFMLCB0eXBlLCBudWxsLCBudWxsKTsKKyAgICAgICAgSXRlbSByZXN1bHQgPSBnZXQoa2V5KTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXN1bHQgPSBhZGRUeXBlKGtleSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5pbmRleDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIHRoZSBnaXZlbiAidW5pbml0aWFsaXplZCIgdHlwZSB0byB7QGxpbmsgI3R5cGVUYWJsZX0gYW5kIHJldHVybnMgaXRzCisgICAgICogaW5kZXguIFRoaXMgbWV0aG9kIGlzIHVzZWQgZm9yIFVOSU5JVElBTElaRUQgdHlwZXMsIG1hZGUgb2YgYW4gaW50ZXJuYWwKKyAgICAgKiBuYW1lIGFuZCBhIGJ5dGVjb2RlIG9mZnNldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlIHRoZSBpbnRlcm5hbCBuYW1lIHRvIGJlIGFkZGVkIHRvIHRoZSB0eXBlIHRhYmxlLgorICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIGJ5dGVjb2RlIG9mZnNldCBvZiB0aGUgTkVXIGluc3RydWN0aW9uIHRoYXQgY3JlYXRlZAorICAgICAqICAgICAgICB0aGlzIFVOSU5JVElBTElaRUQgdHlwZSB2YWx1ZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCBvZiB0aGlzIGludGVybmFsIG5hbWUgaW4gdGhlIHR5cGUgdGFibGUuCisgICAgICovCisgICAgaW50IGFkZFVuaW5pdGlhbGl6ZWRUeXBlKGZpbmFsIFN0cmluZyB0eXBlLCBmaW5hbCBpbnQgb2Zmc2V0KSB7CisgICAgICAgIGtleS50eXBlID0gVFlQRV9VTklOSVQ7CisgICAgICAgIGtleS5pbnRWYWwgPSBvZmZzZXQ7CisgICAgICAgIGtleS5zdHJWYWwxID0gdHlwZTsKKyAgICAgICAga2V5Lmhhc2hDb2RlID0gMHg3RkZGRkZGRiAmIChUWVBFX1VOSU5JVCArIHR5cGUuaGFzaENvZGUoKSArIG9mZnNldCk7CisgICAgICAgIEl0ZW0gcmVzdWx0ID0gZ2V0KGtleSk7CisgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmVzdWx0ID0gYWRkVHlwZShrZXkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQuaW5kZXg7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyB0aGUgZ2l2ZW4gSXRlbSB0byB7QGxpbmsgI3R5cGVUYWJsZX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gaXRlbSB0aGUgdmFsdWUgdG8gYmUgYWRkZWQgdG8gdGhlIHR5cGUgdGFibGUuCisgICAgICogQHJldHVybiB0aGUgYWRkZWQgSXRlbSwgd2hpY2ggYSBuZXcgSXRlbSBpbnN0YW5jZSB3aXRoIHRoZSBzYW1lIHZhbHVlIGFzCisgICAgICogICAgICAgICB0aGUgZ2l2ZW4gSXRlbS4KKyAgICAgKi8KKyAgICBwcml2YXRlIEl0ZW0gYWRkVHlwZShmaW5hbCBJdGVtIGl0ZW0pIHsKKyAgICAgICAgKyt0eXBlQ291bnQ7CisgICAgICAgIEl0ZW0gcmVzdWx0ID0gbmV3IEl0ZW0odHlwZUNvdW50LCBrZXkpOworICAgICAgICBwdXQocmVzdWx0KTsKKyAgICAgICAgaWYgKHR5cGVUYWJsZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0eXBlVGFibGUgPSBuZXcgSXRlbVsxNl07CisgICAgICAgIH0KKyAgICAgICAgaWYgKHR5cGVDb3VudCA9PSB0eXBlVGFibGUubGVuZ3RoKSB7CisgICAgICAgICAgICBJdGVtW10gbmV3VGFibGUgPSBuZXcgSXRlbVsyICogdHlwZVRhYmxlLmxlbmd0aF07CisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHR5cGVUYWJsZSwgMCwgbmV3VGFibGUsIDAsIHR5cGVUYWJsZS5sZW5ndGgpOworICAgICAgICAgICAgdHlwZVRhYmxlID0gbmV3VGFibGU7CisgICAgICAgIH0KKyAgICAgICAgdHlwZVRhYmxlW3R5cGVDb3VudF0gPSByZXN1bHQ7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGNvbW1vbiBzdXBlciB0eXBlIG9mIHRoZSB0d28gZ2l2ZW4gdHlwZXMuIFRoaXMKKyAgICAgKiBtZXRob2QgY2FsbHMge0BsaW5rICNnZXRDb21tb25TdXBlckNsYXNzfSBhbmQgY2FjaGVzIHRoZSByZXN1bHQgaW4gdGhlCisgICAgICoge0BsaW5rICNpdGVtc30gaGFzaCB0YWJsZSB0byBzcGVlZHVwIGZ1dHVyZSBjYWxscyB3aXRoIHRoZSBzYW1lCisgICAgICogcGFyYW1ldGVycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlMSBpbmRleCBvZiBhbiBpbnRlcm5hbCBuYW1lIGluIHtAbGluayAjdHlwZVRhYmxlfS4KKyAgICAgKiBAcGFyYW0gdHlwZTIgaW5kZXggb2YgYW4gaW50ZXJuYWwgbmFtZSBpbiB7QGxpbmsgI3R5cGVUYWJsZX0uCisgICAgICogQHJldHVybiB0aGUgaW5kZXggb2YgdGhlIGNvbW1vbiBzdXBlciB0eXBlIG9mIHRoZSB0d28gZ2l2ZW4gdHlwZXMuCisgICAgICovCisgICAgaW50IGdldE1lcmdlZFR5cGUoZmluYWwgaW50IHR5cGUxLCBmaW5hbCBpbnQgdHlwZTIpIHsKKyAgICAgICAga2V5Mi50eXBlID0gVFlQRV9NRVJHRUQ7CisgICAgICAgIGtleTIubG9uZ1ZhbCA9IHR5cGUxIHwgKCgobG9uZykgdHlwZTIpIDw8IDMyKTsKKyAgICAgICAga2V5Mi5oYXNoQ29kZSA9IDB4N0ZGRkZGRkYgJiAoVFlQRV9NRVJHRUQgKyB0eXBlMSArIHR5cGUyKTsKKyAgICAgICAgSXRlbSByZXN1bHQgPSBnZXQoa2V5Mik7CisgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nIHQgPSB0eXBlVGFibGVbdHlwZTFdLnN0clZhbDE7CisgICAgICAgICAgICBTdHJpbmcgdSA9IHR5cGVUYWJsZVt0eXBlMl0uc3RyVmFsMTsKKyAgICAgICAgICAgIGtleTIuaW50VmFsID0gYWRkVHlwZShnZXRDb21tb25TdXBlckNsYXNzKHQsIHUpKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBJdGVtKChzaG9ydCkgMCwga2V5Mik7CisgICAgICAgICAgICBwdXQocmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0LmludFZhbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjb21tb24gc3VwZXIgdHlwZSBvZiB0aGUgdHdvIGdpdmVuIHR5cGVzLiBUaGUgZGVmYXVsdAorICAgICAqIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIDxpPmxvYWRzPGk+IHRoZSB0d28gZ2l2ZW4gY2xhc3NlcyBhbmQgdXNlcworICAgICAqIHRoZSBqYXZhLmxhbmcuQ2xhc3MgbWV0aG9kcyB0byBmaW5kIHRoZSBjb21tb24gc3VwZXIgY2xhc3MuIEl0IGNhbiBiZQorICAgICAqIG92ZXJyaWRkZW4gdG8gY29tcHV0ZSB0aGlzIGNvbW1vbiBzdXBlciB0eXBlIGluIG90aGVyIHdheXMsIGluIHBhcnRpY3VsYXIKKyAgICAgKiB3aXRob3V0IGFjdHVhbGx5IGxvYWRpbmcgYW55IGNsYXNzLCBvciB0byB0YWtlIGludG8gYWNjb3VudCB0aGUgY2xhc3MKKyAgICAgKiB0aGF0IGlzIGN1cnJlbnRseSBiZWluZyBnZW5lcmF0ZWQgYnkgdGhpcyBDbGFzc1dyaXRlciwgd2hpY2ggY2FuIG9mCisgICAgICogY291cnNlIG5vdCBiZSBsb2FkZWQgc2luY2UgaXQgaXMgdW5kZXIgY29uc3RydWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHR5cGUxIHRoZSBpbnRlcm5hbCBuYW1lIG9mIGEgY2xhc3MuCisgICAgICogQHBhcmFtIHR5cGUyIHRoZSBpbnRlcm5hbCBuYW1lIG9mIGFub3RoZXIgY2xhc3MuCisgICAgICogQHJldHVybiB0aGUgaW50ZXJuYWwgbmFtZSBvZiB0aGUgY29tbW9uIHN1cGVyIGNsYXNzIG9mIHRoZSB0d28gZ2l2ZW4KKyAgICAgKiAgICAgICAgIGNsYXNzZXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDb21tb25TdXBlckNsYXNzKGZpbmFsIFN0cmluZyB0eXBlMSwgZmluYWwgU3RyaW5nIHR5cGUyKQorICAgIHsKKyAgICAgICAgQ2xhc3M8Pz4gYywgZDsKKyAgICAgICAgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIgPSBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjID0gQ2xhc3MuZm9yTmFtZSh0eXBlMS5yZXBsYWNlKCcvJywgJy4nKSwgZmFsc2UsIGNsYXNzTG9hZGVyKTsKKyAgICAgICAgICAgIGQgPSBDbGFzcy5mb3JOYW1lKHR5cGUyLnJlcGxhY2UoJy8nLCAnLicpLCBmYWxzZSwgY2xhc3NMb2FkZXIpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZS50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYy5pc0Fzc2lnbmFibGVGcm9tKGQpKSB7CisgICAgICAgICAgICByZXR1cm4gdHlwZTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGQuaXNBc3NpZ25hYmxlRnJvbShjKSkgeworICAgICAgICAgICAgcmV0dXJuIHR5cGUyOworICAgICAgICB9CisgICAgICAgIGlmIChjLmlzSW50ZXJmYWNlKCkgfHwgZC5pc0ludGVyZmFjZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gImphdmEvbGFuZy9PYmplY3QiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGMgPSBjLmdldFN1cGVyY2xhc3MoKTsKKyAgICAgICAgICAgIH0gd2hpbGUgKCFjLmlzQXNzaWduYWJsZUZyb20oZCkpOworICAgICAgICAgICAgcmV0dXJuIGMuZ2V0TmFtZSgpLnJlcGxhY2UoJy4nLCAnLycpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY29uc3RhbnQgcG9vbCdzIGhhc2ggdGFibGUgaXRlbSB3aGljaCBpcyBlcXVhbCB0byB0aGUgZ2l2ZW4KKyAgICAgKiBpdGVtLgorICAgICAqCisgICAgICogQHBhcmFtIGtleSBhIGNvbnN0YW50IHBvb2wgaXRlbS4KKyAgICAgKiBAcmV0dXJuIHRoZSBjb25zdGFudCBwb29sJ3MgaGFzaCB0YWJsZSBpdGVtIHdoaWNoIGlzIGVxdWFsIHRvIHRoZSBnaXZlbgorICAgICAqICAgICAgICAgaXRlbSwgb3IgPHR0Pm51bGw8L3R0PiBpZiB0aGVyZSBpcyBubyBzdWNoIGl0ZW0uCisgICAgICovCisgICAgcHJpdmF0ZSBJdGVtIGdldChmaW5hbCBJdGVtIGtleSkgeworICAgICAgICBJdGVtIGkgPSBpdGVtc1trZXkuaGFzaENvZGUgJSBpdGVtcy5sZW5ndGhdOworICAgICAgICB3aGlsZSAoaSAhPSBudWxsICYmIChpLnR5cGUgIT0ga2V5LnR5cGUgfHwgIWtleS5pc0VxdWFsVG8oaSkpKSB7CisgICAgICAgICAgICBpID0gaS5uZXh0OworICAgICAgICB9CisgICAgICAgIHJldHVybiBpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFB1dHMgdGhlIGdpdmVuIGl0ZW0gaW4gdGhlIGNvbnN0YW50IHBvb2wncyBoYXNoIHRhYmxlLiBUaGUgaGFzaCB0YWJsZQorICAgICAqIDxpPm11c3Q8L2k+IG5vdCBhbHJlYWR5IGNvbnRhaW5zIHRoaXMgaXRlbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpIHRoZSBpdGVtIHRvIGJlIGFkZGVkIHRvIHRoZSBjb25zdGFudCBwb29sJ3MgaGFzaCB0YWJsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcHV0KGZpbmFsIEl0ZW0gaSkgeworICAgICAgICBpZiAoaW5kZXggKyB0eXBlQ291bnQgPiB0aHJlc2hvbGQpIHsKKyAgICAgICAgICAgIGludCBsbCA9IGl0ZW1zLmxlbmd0aDsKKyAgICAgICAgICAgIGludCBubCA9IGxsICogMiArIDE7CisgICAgICAgICAgICBJdGVtW10gbmV3SXRlbXMgPSBuZXcgSXRlbVtubF07CisgICAgICAgICAgICBmb3IgKGludCBsID0gbGwgLSAxOyBsID49IDA7IC0tbCkgeworICAgICAgICAgICAgICAgIEl0ZW0gaiA9IGl0ZW1zW2xdOworICAgICAgICAgICAgICAgIHdoaWxlIChqICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gai5oYXNoQ29kZSAlIG5ld0l0ZW1zLmxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgSXRlbSBrID0gai5uZXh0OworICAgICAgICAgICAgICAgICAgICBqLm5leHQgPSBuZXdJdGVtc1tpbmRleF07CisgICAgICAgICAgICAgICAgICAgIG5ld0l0ZW1zW2luZGV4XSA9IGo7CisgICAgICAgICAgICAgICAgICAgIGogPSBrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGl0ZW1zID0gbmV3SXRlbXM7CisgICAgICAgICAgICB0aHJlc2hvbGQgPSAoaW50KSAobmwgKiAwLjc1KTsKKyAgICAgICAgfQorICAgICAgICBpbnQgaW5kZXggPSBpLmhhc2hDb2RlICUgaXRlbXMubGVuZ3RoOworICAgICAgICBpLm5leHQgPSBpdGVtc1tpbmRleF07CisgICAgICAgIGl0ZW1zW2luZGV4XSA9IGk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHV0cyBvbmUgYnl0ZSBhbmQgdHdvIHNob3J0cyBpbnRvIHRoZSBjb25zdGFudCBwb29sLgorICAgICAqCisgICAgICogQHBhcmFtIGIgYSBieXRlLgorICAgICAqIEBwYXJhbSBzMSBhIHNob3J0LgorICAgICAqIEBwYXJhbSBzMiBhbm90aGVyIHNob3J0LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwdXQxMjIoZmluYWwgaW50IGIsIGZpbmFsIGludCBzMSwgZmluYWwgaW50IHMyKSB7CisgICAgICAgIHBvb2wucHV0MTIoYiwgczEpLnB1dFNob3J0KHMyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQdXRzIHR3byBieXRlcyBhbmQgb25lIHNob3J0IGludG8gdGhlIGNvbnN0YW50IHBvb2wuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYjEgYSBieXRlLgorICAgICAqIEBwYXJhbSBiMiBhbm90aGVyIGJ5dGUuCisgICAgICogQHBhcmFtIHMgYSBzaG9ydC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcHV0MTEyKGZpbmFsIGludCBiMSwgZmluYWwgaW50IGIyLCBmaW5hbCBpbnQgcykgeworICAgICAgICBwb29sLnB1dDExKGIxLCBiMikucHV0U2hvcnQocyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS9FZGdlLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL0VkZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmUxZTZkCi0tLSAvZGV2L251bGwKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS9FZGdlLmphdmEKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IE9yYWNsZSBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQorICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQorICogcXVlc3Rpb25zLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgaXMgYXZhaWxhYmxlIHVuZGVyIGFuZCBnb3Zlcm5lZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIEhvd2V2ZXIsIHRoZSBmb2xsb3dpbmcgbm90aWNlIGFjY29tcGFuaWVkIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoaXMKKyAqIGZpbGU6CisgKgorICogQVNNOiBhIHZlcnkgc21hbGwgYW5kIGZhc3QgSmF2YSBieXRlY29kZSBtYW5pcHVsYXRpb24gZnJhbWV3b3JrCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAxMSBJTlJJQSwgRnJhbmNlIFRlbGVjb20KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc207CisKKy8qKgorICogQW4gZWRnZSBpbiB0aGUgY29udHJvbCBmbG93IGdyYXBoIG9mIGEgbWV0aG9kIGJvZHkuIFNlZSB7QGxpbmsgTGFiZWwgTGFiZWx9LgorICoKKyAqIEBhdXRob3IgRXJpYyBCcnVuZXRvbgorICovCitjbGFzcyBFZGdlIHsKKworICAgIC8qKgorICAgICAqIERlbm90ZXMgYSBub3JtYWwgY29udHJvbCBmbG93IGdyYXBoIGVkZ2UuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBOT1JNQUwgPSAwOworCisgICAgLyoqCisgICAgICogRGVub3RlcyBhIGNvbnRyb2wgZmxvdyBncmFwaCBlZGdlIGNvcnJlc3BvbmRpbmcgdG8gYW4gZXhjZXB0aW9uIGhhbmRsZXIuCisgICAgICogTW9yZSBwcmVjaXNlbHkgYW55IHtAbGluayBFZGdlfSB3aG9zZSB7QGxpbmsgI2luZm99IGlzIHN0cmljdGx5IHBvc2l0aXZlCisgICAgICogY29ycmVzcG9uZHMgdG8gYW4gZXhjZXB0aW9uIGhhbmRsZXIuIFRoZSBhY3R1YWwgdmFsdWUgb2Yge0BsaW5rICNpbmZvfSBpcworICAgICAqIHRoZSBpbmRleCwgaW4gdGhlIHtAbGluayBDbGFzc1dyaXRlcn0gdHlwZSB0YWJsZSwgb2YgdGhlIGV4Y2VwdGlvbiB0aGF0CisgICAgICogaXMgY2F0Y2hlZC4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IEVYQ0VQVElPTiA9IDB4N0ZGRkZGRkY7CisKKyAgICAvKioKKyAgICAgKiBJbmZvcm1hdGlvbiBhYm91dCB0aGlzIGNvbnRyb2wgZmxvdyBncmFwaCBlZGdlLiBJZgorICAgICAqIHtAbGluayBDbGFzc1dyaXRlciNDT01QVVRFX01BWFN9IGlzIHVzZWQgdGhpcyBmaWVsZCBpcyB0aGUgKHJlbGF0aXZlKQorICAgICAqIHN0YWNrIHNpemUgaW4gdGhlIGJhc2ljIGJsb2NrIGZyb20gd2hpY2ggdGhpcyBlZGdlIG9yaWdpbmF0ZXMuIFRoaXMgc2l6ZQorICAgICAqIGlzIGVxdWFsIHRvIHRoZSBzdGFjayBzaXplIGF0IHRoZSAianVtcCIgaW5zdHJ1Y3Rpb24gdG8gd2hpY2ggdGhpcyBlZGdlCisgICAgICogY29ycmVzcG9uZHMsIHJlbGF0aXZlbHkgdG8gdGhlIHN0YWNrIHNpemUgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUKKyAgICAgKiBvcmlnaW5hdGluZyBiYXNpYyBibG9jay4gSWYge0BsaW5rIENsYXNzV3JpdGVyI0NPTVBVVEVfRlJBTUVTfSBpcyB1c2VkLAorICAgICAqIHRoaXMgZmllbGQgaXMgdGhlIGtpbmQgb2YgdGhpcyBjb250cm9sIGZsb3cgZ3JhcGggZWRnZSAoaS5lLiBOT1JNQUwgb3IKKyAgICAgKiBFWENFUFRJT04pLgorICAgICAqLworICAgIGludCBpbmZvOworCisgICAgLyoqCisgICAgICogVGhlIHN1Y2Nlc3NvciBibG9jayBvZiB0aGUgYmFzaWMgYmxvY2sgZnJvbSB3aGljaCB0aGlzIGVkZ2Ugb3JpZ2luYXRlcy4KKyAgICAgKi8KKyAgICBMYWJlbCBzdWNjZXNzb3I7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbmV4dCBlZGdlIGluIHRoZSBsaXN0IG9mIHN1Y2Nlc3NvcnMgb2YgdGhlIG9yaWdpbmF0aW5nIGJhc2ljIGJsb2NrLgorICAgICAqIFNlZSB7QGxpbmsgTGFiZWwjc3VjY2Vzc29ycyBzdWNjZXNzb3JzfS4KKyAgICAgKi8KKyAgICBFZGdlIG5leHQ7Cit9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL0ZpZWxkVmlzaXRvci5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS9GaWVsZFZpc2l0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTZiZTlmCi0tLSAvZGV2L251bGwKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS9GaWVsZFZpc2l0b3IuamF2YQpAQCAtMCwwICsxLDE0NCBAQAorLyoKKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgT3JhY2xlIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCisgKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CisgKiBxdWVzdGlvbnMuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBpcyBhdmFpbGFibGUgdW5kZXIgYW5kIGdvdmVybmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogSG93ZXZlciwgdGhlIGZvbGxvd2luZyBub3RpY2UgYWNjb21wYW5pZWQgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhpcworICogZmlsZToKKyAqCisgKiBBU006IGEgdmVyeSBzbWFsbCBhbmQgZmFzdCBKYXZhIGJ5dGVjb2RlIG1hbmlwdWxhdGlvbiBmcmFtZXdvcmsKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDExIElOUklBLCBGcmFuY2UgVGVsZWNvbQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbTsKKworLyoqCisgKiBBIHZpc2l0b3IgdG8gdmlzaXQgYSBKYXZhIGZpZWxkLiBUaGUgbWV0aG9kcyBvZiB0aGlzIGNsYXNzIG11c3QgYmUgY2FsbGVkCisgKiBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOiAoIDx0dD52aXNpdEFubm90YXRpb248L3R0PiB8CisgKiA8dHQ+dmlzaXRBdHRyaWJ1dGU8L3R0PiApKiA8dHQ+dmlzaXRFbmQ8L3R0Pi4KKyAqCisgKiBAYXV0aG9yIEVyaWMgQnJ1bmV0b24KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEZpZWxkVmlzaXRvciB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgQVNNIEFQSSB2ZXJzaW9uIGltcGxlbWVudGVkIGJ5IHRoaXMgdmlzaXRvci4gVGhlIHZhbHVlIG9mIHRoaXMgZmllbGQKKyAgICAgKiBtdXN0IGJlIG9uZSBvZiB7QGxpbmsgT3Bjb2RlcyNBU000fS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZmluYWwgaW50IGFwaTsKKworICAgIC8qKgorICAgICAqIFRoZSBmaWVsZCB2aXNpdG9yIHRvIHdoaWNoIHRoaXMgdmlzaXRvciBtdXN0IGRlbGVnYXRlIG1ldGhvZCBjYWxscy4gTWF5CisgICAgICogYmUgbnVsbC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRmllbGRWaXNpdG9yIGZ2OworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGxpbmsgRmllbGRWaXNpdG9yfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcGkgdGhlIEFTTSBBUEkgdmVyc2lvbiBpbXBsZW1lbnRlZCBieSB0aGlzIHZpc2l0b3IuIE11c3QgYmUgb25lCisgICAgICogICAgICAgIG9mIHtAbGluayBPcGNvZGVzI0FTTTR9LgorICAgICAqLworICAgIHB1YmxpYyBGaWVsZFZpc2l0b3IoZmluYWwgaW50IGFwaSkgeworICAgICAgICB0aGlzKGFwaSwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGxpbmsgRmllbGRWaXNpdG9yfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcGkgdGhlIEFTTSBBUEkgdmVyc2lvbiBpbXBsZW1lbnRlZCBieSB0aGlzIHZpc2l0b3IuIE11c3QgYmUgb25lCisgICAgICogICAgICAgIG9mIHtAbGluayBPcGNvZGVzI0FTTTR9LgorICAgICAqIEBwYXJhbSBmdiB0aGUgZmllbGQgdmlzaXRvciB0byB3aGljaCB0aGlzIHZpc2l0b3IgbXVzdCBkZWxlZ2F0ZSBtZXRob2QKKyAgICAgKiAgICAgICAgY2FsbHMuIE1heSBiZSBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBGaWVsZFZpc2l0b3IoZmluYWwgaW50IGFwaSwgZmluYWwgRmllbGRWaXNpdG9yIGZ2KSB7CisgICAgICAgIC8qaWYgKGFwaSAhPSBPcGNvZGVzLkFTTTQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgfSovCisgICAgICAgIHRoaXMuYXBpID0gYXBpOworICAgICAgICB0aGlzLmZ2ID0gZnY7CisgICAgfQorCisgICAgLyoqCisgICAgICogVmlzaXRzIGFuIGFubm90YXRpb24gb2YgdGhlIGZpZWxkLgorICAgICAqCisgICAgICogQHBhcmFtIGRlc2MgdGhlIGNsYXNzIGRlc2NyaXB0b3Igb2YgdGhlIGFubm90YXRpb24gY2xhc3MuCisgICAgICogQHBhcmFtIHZpc2libGUgPHR0PnRydWU8L3R0PiBpZiB0aGUgYW5ub3RhdGlvbiBpcyB2aXNpYmxlIGF0IHJ1bnRpbWUuCisgICAgICogQHJldHVybiBhIHZpc2l0b3IgdG8gdmlzaXQgdGhlIGFubm90YXRpb24gdmFsdWVzLCBvciA8dHQ+bnVsbDwvdHQ+IGlmCisgICAgICogICAgICAgICB0aGlzIHZpc2l0b3IgaXMgbm90IGludGVyZXN0ZWQgaW4gdmlzaXRpbmcgdGhpcyBhbm5vdGF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBBbm5vdGF0aW9uVmlzaXRvciB2aXNpdEFubm90YXRpb24oU3RyaW5nIGRlc2MsIGJvb2xlYW4gdmlzaWJsZSkgeworICAgICAgICBpZiAoZnYgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZ2LnZpc2l0QW5ub3RhdGlvbihkZXNjLCB2aXNpYmxlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWaXNpdHMgYSBub24gc3RhbmRhcmQgYXR0cmlidXRlIG9mIHRoZSBmaWVsZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhdHRyIGFuIGF0dHJpYnV0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB2aXNpdEF0dHJpYnV0ZShBdHRyaWJ1dGUgYXR0cikgeworICAgICAgICBpZiAoZnYgIT0gbnVsbCkgeworICAgICAgICAgICAgZnYudmlzaXRBdHRyaWJ1dGUoYXR0cik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWaXNpdHMgdGhlIGVuZCBvZiB0aGUgZmllbGQuIFRoaXMgbWV0aG9kLCB3aGljaCBpcyB0aGUgbGFzdCBvbmUgdG8gYmUKKyAgICAgKiBjYWxsZWQsIGlzIHVzZWQgdG8gaW5mb3JtIHRoZSB2aXNpdG9yIHRoYXQgYWxsIHRoZSBhbm5vdGF0aW9ucyBhbmQKKyAgICAgKiBhdHRyaWJ1dGVzIG9mIHRoZSBmaWVsZCBoYXZlIGJlZW4gdmlzaXRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB2aXNpdEVuZCgpIHsKKyAgICAgICAgaWYgKGZ2ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZ2LnZpc2l0RW5kKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL0ZpZWxkV3JpdGVyLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL0ZpZWxkV3JpdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNkM2ZhMgotLS0gL2Rldi9udWxsCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vRmllbGRXcml0ZXIuamF2YQpAQCAtMCwwICsxLDMwMCBAQAorLyoKKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgT3JhY2xlIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCisgKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CisgKiBxdWVzdGlvbnMuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBpcyBhdmFpbGFibGUgdW5kZXIgYW5kIGdvdmVybmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogSG93ZXZlciwgdGhlIGZvbGxvd2luZyBub3RpY2UgYWNjb21wYW5pZWQgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhpcworICogZmlsZToKKyAqCisgKiBBU006IGEgdmVyeSBzbWFsbCBhbmQgZmFzdCBKYXZhIGJ5dGVjb2RlIG1hbmlwdWxhdGlvbiBmcmFtZXdvcmsKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDExIElOUklBLCBGcmFuY2UgVGVsZWNvbQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbTsKKworLyoqCisgKiBBbiB7QGxpbmsgRmllbGRWaXNpdG9yfSB0aGF0IGdlbmVyYXRlcyBKYXZhIGZpZWxkcyBpbiBieXRlY29kZSBmb3JtLgorICoKKyAqIEBhdXRob3IgRXJpYyBCcnVuZXRvbgorICovCitmaW5hbCBjbGFzcyBGaWVsZFdyaXRlciBleHRlbmRzIEZpZWxkVmlzaXRvciB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY2xhc3Mgd3JpdGVyIHRvIHdoaWNoIHRoaXMgZmllbGQgbXVzdCBiZSBhZGRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIENsYXNzV3JpdGVyIGN3OworCisgICAgLyoqCisgICAgICogQWNjZXNzIGZsYWdzIG9mIHRoaXMgZmllbGQuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgYWNjZXNzOworCisgICAgLyoqCisgICAgICogVGhlIGluZGV4IG9mIHRoZSBjb25zdGFudCBwb29sIGl0ZW0gdGhhdCBjb250YWlucyB0aGUgbmFtZSBvZiB0aGlzCisgICAgICogbWV0aG9kLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgaW50IG5hbWU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgaW5kZXggb2YgdGhlIGNvbnN0YW50IHBvb2wgaXRlbSB0aGF0IGNvbnRhaW5zIHRoZSBkZXNjcmlwdG9yIG9mIHRoaXMKKyAgICAgKiBmaWVsZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIGludCBkZXNjOworCisgICAgLyoqCisgICAgICogVGhlIGluZGV4IG9mIHRoZSBjb25zdGFudCBwb29sIGl0ZW0gdGhhdCBjb250YWlucyB0aGUgc2lnbmF0dXJlIG9mIHRoaXMKKyAgICAgKiBmaWVsZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBzaWduYXR1cmU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgaW5kZXggb2YgdGhlIGNvbnN0YW50IHBvb2wgaXRlbSB0aGF0IGNvbnRhaW5zIHRoZSBjb25zdGFudCB2YWx1ZSBvZgorICAgICAqIHRoaXMgZmllbGQuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgdmFsdWU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcnVudGltZSB2aXNpYmxlIGFubm90YXRpb25zIG9mIHRoaXMgZmllbGQuIE1heSBiZSA8dHQ+bnVsbDwvdHQ+LgorICAgICAqLworICAgIHByaXZhdGUgQW5ub3RhdGlvbldyaXRlciBhbm5zOworCisgICAgLyoqCisgICAgICogVGhlIHJ1bnRpbWUgaW52aXNpYmxlIGFubm90YXRpb25zIG9mIHRoaXMgZmllbGQuIE1heSBiZSA8dHQ+bnVsbDwvdHQ+LgorICAgICAqLworICAgIHByaXZhdGUgQW5ub3RhdGlvbldyaXRlciBpYW5uczsKKworICAgIC8qKgorICAgICAqIFRoZSBub24gc3RhbmRhcmQgYXR0cmlidXRlcyBvZiB0aGlzIGZpZWxkLiBNYXkgYmUgPHR0Pm51bGw8L3R0Pi4KKyAgICAgKi8KKyAgICBwcml2YXRlIEF0dHJpYnV0ZSBhdHRyczsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIENvbnN0cnVjdG9yCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAbGluayBGaWVsZFdyaXRlcn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY3cgdGhlIGNsYXNzIHdyaXRlciB0byB3aGljaCB0aGlzIGZpZWxkIG11c3QgYmUgYWRkZWQuCisgICAgICogQHBhcmFtIGFjY2VzcyB0aGUgZmllbGQncyBhY2Nlc3MgZmxhZ3MgKHNlZSB7QGxpbmsgT3Bjb2Rlc30pLgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBmaWVsZCdzIG5hbWUuCisgICAgICogQHBhcmFtIGRlc2MgdGhlIGZpZWxkJ3MgZGVzY3JpcHRvciAoc2VlIHtAbGluayBUeXBlfSkuCisgICAgICogQHBhcmFtIHNpZ25hdHVyZSB0aGUgZmllbGQncyBzaWduYXR1cmUuIE1heSBiZSA8dHQ+bnVsbDwvdHQ+LgorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgZmllbGQncyBjb25zdGFudCB2YWx1ZS4gTWF5IGJlIDx0dD5udWxsPC90dD4uCisgICAgICovCisgICAgRmllbGRXcml0ZXIoCisgICAgICAgIGZpbmFsIENsYXNzV3JpdGVyIGN3LAorICAgICAgICBmaW5hbCBpbnQgYWNjZXNzLAorICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSwKKyAgICAgICAgZmluYWwgU3RyaW5nIGRlc2MsCisgICAgICAgIGZpbmFsIFN0cmluZyBzaWduYXR1cmUsCisgICAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSkKKyAgICB7CisgICAgICAgIHN1cGVyKE9wY29kZXMuQVNNNCk7CisgICAgICAgIGlmIChjdy5maXJzdEZpZWxkID09IG51bGwpIHsKKyAgICAgICAgICAgIGN3LmZpcnN0RmllbGQgPSB0aGlzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY3cubGFzdEZpZWxkLmZ2ID0gdGhpczsKKyAgICAgICAgfQorICAgICAgICBjdy5sYXN0RmllbGQgPSB0aGlzOworICAgICAgICB0aGlzLmN3ID0gY3c7CisgICAgICAgIHRoaXMuYWNjZXNzID0gYWNjZXNzOworICAgICAgICB0aGlzLm5hbWUgPSBjdy5uZXdVVEY4KG5hbWUpOworICAgICAgICB0aGlzLmRlc2MgPSBjdy5uZXdVVEY4KGRlc2MpOworICAgICAgICBpZiAoQ2xhc3NSZWFkZXIuU0lHTkFUVVJFUyAmJiBzaWduYXR1cmUgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5zaWduYXR1cmUgPSBjdy5uZXdVVEY4KHNpZ25hdHVyZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMudmFsdWUgPSBjdy5uZXdDb25zdEl0ZW0odmFsdWUpLmluZGV4OworICAgICAgICB9CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gSW1wbGVtZW50YXRpb24gb2YgdGhlIEZpZWxkVmlzaXRvciBhYnN0cmFjdCBjbGFzcworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEFubm90YXRpb25WaXNpdG9yIHZpc2l0QW5ub3RhdGlvbigKKyAgICAgICAgZmluYWwgU3RyaW5nIGRlc2MsCisgICAgICAgIGZpbmFsIGJvb2xlYW4gdmlzaWJsZSkKKyAgICB7CisgICAgICAgIGlmICghQ2xhc3NSZWFkZXIuQU5OT1RBVElPTlMpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIEJ5dGVWZWN0b3IgYnYgPSBuZXcgQnl0ZVZlY3RvcigpOworICAgICAgICAvLyB3cml0ZSB0eXBlLCBhbmQgcmVzZXJ2ZSBzcGFjZSBmb3IgdmFsdWVzIGNvdW50CisgICAgICAgIGJ2LnB1dFNob3J0KGN3Lm5ld1VURjgoZGVzYykpLnB1dFNob3J0KDApOworICAgICAgICBBbm5vdGF0aW9uV3JpdGVyIGF3ID0gbmV3IEFubm90YXRpb25Xcml0ZXIoY3csIHRydWUsIGJ2LCBidiwgMik7CisgICAgICAgIGlmICh2aXNpYmxlKSB7CisgICAgICAgICAgICBhdy5uZXh0ID0gYW5uczsKKyAgICAgICAgICAgIGFubnMgPSBhdzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF3Lm5leHQgPSBpYW5uczsKKyAgICAgICAgICAgIGlhbm5zID0gYXc7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGF3OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0QXR0cmlidXRlKGZpbmFsIEF0dHJpYnV0ZSBhdHRyKSB7CisgICAgICAgIGF0dHIubmV4dCA9IGF0dHJzOworICAgICAgICBhdHRycyA9IGF0dHI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRFbmQoKSB7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gVXRpbGl0eSBtZXRob2RzCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzaXplIG9mIHRoaXMgZmllbGQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBzaXplIG9mIHRoaXMgZmllbGQuCisgICAgICovCisgICAgaW50IGdldFNpemUoKSB7CisgICAgICAgIGludCBzaXplID0gODsKKyAgICAgICAgaWYgKHZhbHVlICE9IDApIHsKKyAgICAgICAgICAgIGN3Lm5ld1VURjgoIkNvbnN0YW50VmFsdWUiKTsKKyAgICAgICAgICAgIHNpemUgKz0gODsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGFjY2VzcyAmIE9wY29kZXMuQUNDX1NZTlRIRVRJQykgIT0gMAorICAgICAgICAgICAgICAgICYmICgoY3cudmVyc2lvbiAmIDB4RkZGRikgPCBPcGNvZGVzLlYxXzUgfHwgKGFjY2VzcyAmIENsYXNzV3JpdGVyLkFDQ19TWU5USEVUSUNfQVRUUklCVVRFKSAhPSAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgY3cubmV3VVRGOCgiU3ludGhldGljIik7CisgICAgICAgICAgICBzaXplICs9IDY7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChhY2Nlc3MgJiBPcGNvZGVzLkFDQ19ERVBSRUNBVEVEKSAhPSAwKSB7CisgICAgICAgICAgICBjdy5uZXdVVEY4KCJEZXByZWNhdGVkIik7CisgICAgICAgICAgICBzaXplICs9IDY7CisgICAgICAgIH0KKyAgICAgICAgaWYgKENsYXNzUmVhZGVyLlNJR05BVFVSRVMgJiYgc2lnbmF0dXJlICE9IDApIHsKKyAgICAgICAgICAgIGN3Lm5ld1VURjgoIlNpZ25hdHVyZSIpOworICAgICAgICAgICAgc2l6ZSArPSA4OworICAgICAgICB9CisgICAgICAgIGlmIChDbGFzc1JlYWRlci5BTk5PVEFUSU9OUyAmJiBhbm5zICE9IG51bGwpIHsKKyAgICAgICAgICAgIGN3Lm5ld1VURjgoIlJ1bnRpbWVWaXNpYmxlQW5ub3RhdGlvbnMiKTsKKyAgICAgICAgICAgIHNpemUgKz0gOCArIGFubnMuZ2V0U2l6ZSgpOworICAgICAgICB9CisgICAgICAgIGlmIChDbGFzc1JlYWRlci5BTk5PVEFUSU9OUyAmJiBpYW5ucyAhPSBudWxsKSB7CisgICAgICAgICAgICBjdy5uZXdVVEY4KCJSdW50aW1lSW52aXNpYmxlQW5ub3RhdGlvbnMiKTsKKyAgICAgICAgICAgIHNpemUgKz0gOCArIGlhbm5zLmdldFNpemUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYXR0cnMgIT0gbnVsbCkgeworICAgICAgICAgICAgc2l6ZSArPSBhdHRycy5nZXRTaXplKGN3LCBudWxsLCAwLCAtMSwgLTEpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzaXplOworICAgIH0KKworICAgIC8qKgorICAgICAqIFB1dHMgdGhlIGNvbnRlbnQgb2YgdGhpcyBmaWVsZCBpbnRvIHRoZSBnaXZlbiBieXRlIHZlY3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvdXQgd2hlcmUgdGhlIGNvbnRlbnQgb2YgdGhpcyBmaWVsZCBtdXN0IGJlIHB1dC4KKyAgICAgKi8KKyAgICB2b2lkIHB1dChmaW5hbCBCeXRlVmVjdG9yIG91dCkgeworICAgICAgICBpbnQgbWFzayA9IE9wY29kZXMuQUNDX0RFUFJFQ0FURUQKKyAgICAgICAgICAgICAgICB8IENsYXNzV3JpdGVyLkFDQ19TWU5USEVUSUNfQVRUUklCVVRFCisgICAgICAgICAgICAgICAgfCAoKGFjY2VzcyAmIENsYXNzV3JpdGVyLkFDQ19TWU5USEVUSUNfQVRUUklCVVRFKSAvIChDbGFzc1dyaXRlci5BQ0NfU1lOVEhFVElDX0FUVFJJQlVURSAvIE9wY29kZXMuQUNDX1NZTlRIRVRJQykpOworICAgICAgICBvdXQucHV0U2hvcnQoYWNjZXNzICYgfm1hc2spLnB1dFNob3J0KG5hbWUpLnB1dFNob3J0KGRlc2MpOworICAgICAgICBpbnQgYXR0cmlidXRlQ291bnQgPSAwOworICAgICAgICBpZiAodmFsdWUgIT0gMCkgeworICAgICAgICAgICAgKythdHRyaWJ1dGVDb3VudDsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGFjY2VzcyAmIE9wY29kZXMuQUNDX1NZTlRIRVRJQykgIT0gMAorICAgICAgICAgICAgICAgICYmICgoY3cudmVyc2lvbiAmIDB4RkZGRikgPCBPcGNvZGVzLlYxXzUgfHwgKGFjY2VzcyAmIENsYXNzV3JpdGVyLkFDQ19TWU5USEVUSUNfQVRUUklCVVRFKSAhPSAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgKythdHRyaWJ1dGVDb3VudDsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGFjY2VzcyAmIE9wY29kZXMuQUNDX0RFUFJFQ0FURUQpICE9IDApIHsKKyAgICAgICAgICAgICsrYXR0cmlidXRlQ291bnQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKENsYXNzUmVhZGVyLlNJR05BVFVSRVMgJiYgc2lnbmF0dXJlICE9IDApIHsKKyAgICAgICAgICAgICsrYXR0cmlidXRlQ291bnQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKENsYXNzUmVhZGVyLkFOTk9UQVRJT05TICYmIGFubnMgIT0gbnVsbCkgeworICAgICAgICAgICAgKythdHRyaWJ1dGVDb3VudDsKKyAgICAgICAgfQorICAgICAgICBpZiAoQ2xhc3NSZWFkZXIuQU5OT1RBVElPTlMgJiYgaWFubnMgIT0gbnVsbCkgeworICAgICAgICAgICAgKythdHRyaWJ1dGVDb3VudDsKKyAgICAgICAgfQorICAgICAgICBpZiAoYXR0cnMgIT0gbnVsbCkgeworICAgICAgICAgICAgYXR0cmlidXRlQ291bnQgKz0gYXR0cnMuZ2V0Q291bnQoKTsKKyAgICAgICAgfQorICAgICAgICBvdXQucHV0U2hvcnQoYXR0cmlidXRlQ291bnQpOworICAgICAgICBpZiAodmFsdWUgIT0gMCkgeworICAgICAgICAgICAgb3V0LnB1dFNob3J0KGN3Lm5ld1VURjgoIkNvbnN0YW50VmFsdWUiKSk7CisgICAgICAgICAgICBvdXQucHV0SW50KDIpLnB1dFNob3J0KHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGFjY2VzcyAmIE9wY29kZXMuQUNDX1NZTlRIRVRJQykgIT0gMAorICAgICAgICAgICAgICAgICYmICgoY3cudmVyc2lvbiAmIDB4RkZGRikgPCBPcGNvZGVzLlYxXzUgfHwgKGFjY2VzcyAmIENsYXNzV3JpdGVyLkFDQ19TWU5USEVUSUNfQVRUUklCVVRFKSAhPSAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0LnB1dFNob3J0KGN3Lm5ld1VURjgoIlN5bnRoZXRpYyIpKS5wdXRJbnQoMCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChhY2Nlc3MgJiBPcGNvZGVzLkFDQ19ERVBSRUNBVEVEKSAhPSAwKSB7CisgICAgICAgICAgICBvdXQucHV0U2hvcnQoY3cubmV3VVRGOCgiRGVwcmVjYXRlZCIpKS5wdXRJbnQoMCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKENsYXNzUmVhZGVyLlNJR05BVFVSRVMgJiYgc2lnbmF0dXJlICE9IDApIHsKKyAgICAgICAgICAgIG91dC5wdXRTaG9ydChjdy5uZXdVVEY4KCJTaWduYXR1cmUiKSk7CisgICAgICAgICAgICBvdXQucHV0SW50KDIpLnB1dFNob3J0KHNpZ25hdHVyZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKENsYXNzUmVhZGVyLkFOTk9UQVRJT05TICYmIGFubnMgIT0gbnVsbCkgeworICAgICAgICAgICAgb3V0LnB1dFNob3J0KGN3Lm5ld1VURjgoIlJ1bnRpbWVWaXNpYmxlQW5ub3RhdGlvbnMiKSk7CisgICAgICAgICAgICBhbm5zLnB1dChvdXQpOworICAgICAgICB9CisgICAgICAgIGlmIChDbGFzc1JlYWRlci5BTk5PVEFUSU9OUyAmJiBpYW5ucyAhPSBudWxsKSB7CisgICAgICAgICAgICBvdXQucHV0U2hvcnQoY3cubmV3VVRGOCgiUnVudGltZUludmlzaWJsZUFubm90YXRpb25zIikpOworICAgICAgICAgICAgaWFubnMucHV0KG91dCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGF0dHJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGF0dHJzLnB1dChjdywgbnVsbCwgMCwgLTEsIC0xLCBvdXQpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS9GcmFtZS5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS9GcmFtZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4ZTMzMWQKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL0ZyYW1lLmphdmEKQEAgLTAsMCArMSwxNDY0IEBACisvKgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBPcmFjbGUgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKKyAqIHF1ZXN0aW9ucy4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGlzIGF2YWlsYWJsZSB1bmRlciBhbmQgZ292ZXJuZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiBIb3dldmVyLCB0aGUgZm9sbG93aW5nIG5vdGljZSBhY2NvbXBhbmllZCB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGlzCisgKiBmaWxlOgorICoKKyAqIEFTTTogYSB2ZXJ5IHNtYWxsIGFuZCBmYXN0IEphdmEgYnl0ZWNvZGUgbWFuaXB1bGF0aW9uIGZyYW1ld29yaworICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMTEgSU5SSUEsIEZyYW5jZSBUZWxlY29tCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2UgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtOworCisvKioKKyAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBpbnB1dCBhbmQgb3V0cHV0IHN0YWNrIG1hcCBmcmFtZXMgb2YgYSBiYXNpYyBibG9jay4KKyAqCisgKiBAYXV0aG9yIEVyaWMgQnJ1bmV0b24KKyAqLworZmluYWwgY2xhc3MgRnJhbWUgeworCisgICAgLyoKKyAgICAgKiBGcmFtZXMgYXJlIGNvbXB1dGVkIGluIGEgdHdvIHN0ZXBzIHByb2Nlc3M6IGR1cmluZyB0aGUgdmlzaXQgb2YgZWFjaAorICAgICAqIGluc3RydWN0aW9uLCB0aGUgc3RhdGUgb2YgdGhlIGZyYW1lIGF0IHRoZSBlbmQgb2YgY3VycmVudCBiYXNpYyBibG9jayBpcworICAgICAqIHVwZGF0ZWQgYnkgc2ltdWxhdGluZyB0aGUgYWN0aW9uIG9mIHRoZSBpbnN0cnVjdGlvbiBvbiB0aGUgcHJldmlvdXMgc3RhdGUKKyAgICAgKiBvZiB0aGlzIHNvIGNhbGxlZCAib3V0cHV0IGZyYW1lIi4gSW4gdmlzaXRNYXhzLCBhIGZpeCBwb2ludCBhbGdvcml0aG0gaXMKKyAgICAgKiB1c2VkIHRvIGNvbXB1dGUgdGhlICJpbnB1dCBmcmFtZSIgb2YgZWFjaCBiYXNpYyBibG9jaywgaS5lLiB0aGUgc3RhY2sgbWFwCisgICAgICogZnJhbWUgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYmFzaWMgYmxvY2ssIHN0YXJ0aW5nIGZyb20gdGhlIGlucHV0IGZyYW1lCisgICAgICogb2YgdGhlIGZpcnN0IGJhc2ljIGJsb2NrICh3aGljaCBpcyBjb21wdXRlZCBmcm9tIHRoZSBtZXRob2QgZGVzY3JpcHRvciksCisgICAgICogYW5kIGJ5IHVzaW5nIHRoZSBwcmV2aW91c2x5IGNvbXB1dGVkIG91dHB1dCBmcmFtZXMgdG8gY29tcHV0ZSB0aGUgaW5wdXQKKyAgICAgKiBzdGF0ZSBvZiB0aGUgb3RoZXIgYmxvY2tzLgorICAgICAqCisgICAgICogQWxsIG91dHB1dCBhbmQgaW5wdXQgZnJhbWVzIGFyZSBzdG9yZWQgYXMgYXJyYXlzIG9mIGludGVnZXJzLiBSZWZlcmVuY2UKKyAgICAgKiBhbmQgYXJyYXkgdHlwZXMgYXJlIHJlcHJlc2VudGVkIGJ5IGFuIGluZGV4IGludG8gYSB0eXBlIHRhYmxlICh3aGljaCBpcworICAgICAqIG5vdCB0aGUgc2FtZSBhcyB0aGUgY29uc3RhbnQgcG9vbCBvZiB0aGUgY2xhc3MsIGluIG9yZGVyIHRvIGF2b2lkIGFkZGluZworICAgICAqIHVubmVjZXNzYXJ5IGNvbnN0YW50cyBpbiB0aGUgcG9vbCAtIG5vdCBhbGwgY29tcHV0ZWQgZnJhbWVzIHdpbGwgZW5kIHVwCisgICAgICogYmVpbmcgc3RvcmVkIGluIHRoZSBzdGFjayBtYXAgdGFibGUpLiBUaGlzIGFsbG93cyB2ZXJ5IGZhc3QgdHlwZQorICAgICAqIGNvbXBhcmlzb25zLgorICAgICAqCisgICAgICogT3V0cHV0IHN0YWNrIG1hcCBmcmFtZXMgYXJlIGNvbXB1dGVkIHJlbGF0aXZlbHkgdG8gdGhlIGlucHV0IGZyYW1lIG9mIHRoZQorICAgICAqIGJhc2ljIGJsb2NrLCB3aGljaCBpcyBub3QgeWV0IGtub3duIHdoZW4gb3V0cHV0IGZyYW1lcyBhcmUgY29tcHV0ZWQuIEl0CisgICAgICogaXMgdGhlcmVmb3JlIG5lY2Vzc2FyeSB0byBiZSBhYmxlIHRvIHJlcHJlc2VudCBhYnN0cmFjdCB0eXBlcyBzdWNoIGFzCisgICAgICogInRoZSB0eXBlIGF0IHBvc2l0aW9uIHggaW4gdGhlIGlucHV0IGZyYW1lIGxvY2FscyIgb3IgInRoZSB0eXBlIGF0CisgICAgICogcG9zaXRpb24geCBmcm9tIHRoZSB0b3Agb2YgdGhlIGlucHV0IGZyYW1lIHN0YWNrIiBvciBldmVuICJ0aGUgdHlwZSBhdAorICAgICAqIHBvc2l0aW9uIHggaW4gdGhlIGlucHV0IGZyYW1lLCB3aXRoIHkgbW9yZSAob3IgbGVzcykgYXJyYXkgZGltZW5zaW9ucyIuCisgICAgICogVGhpcyBleHBsYWlucyB0aGUgcmF0aGVyIGNvbXBsaWNhdGVkIHR5cGUgZm9ybWF0IHVzZWQgaW4gb3V0cHV0IGZyYW1lcy4KKyAgICAgKgorICAgICAqIFRoaXMgZm9ybWF0IGlzIHRoZSBmb2xsb3dpbmc6IERJTSBLSU5EIFZBTFVFICg0LCA0IGFuZCAyNCBiaXRzKS4gRElNIGlzIGEKKyAgICAgKiBzaWduZWQgbnVtYmVyIG9mIGFycmF5IGRpbWVuc2lvbnMgKGZyb20gLTggdG8gNykuIEtJTkQgaXMgZWl0aGVyIEJBU0UsCisgICAgICogTE9DQUwgb3IgU1RBQ0suIEJBU0UgaXMgdXNlZCBmb3IgdHlwZXMgdGhhdCBhcmUgbm90IHJlbGF0aXZlIHRvIHRoZSBpbnB1dAorICAgICAqIGZyYW1lLiBMT0NBTCBpcyB1c2VkIGZvciB0eXBlcyB0aGF0IGFyZSByZWxhdGl2ZSB0byB0aGUgaW5wdXQgbG9jYWwKKyAgICAgKiB2YXJpYWJsZSB0eXBlcy4gU1RBQ0sgaXMgdXNlZCBmb3IgdHlwZXMgdGhhdCBhcmUgcmVsYXRpdmUgdG8gdGhlIGlucHV0CisgICAgICogc3RhY2sgdHlwZXMuIFZBTFVFIGRlcGVuZHMgb24gS0lORC4gRm9yIExPQ0FMIHR5cGVzLCBpdCBpcyBhbiBpbmRleCBpbgorICAgICAqIHRoZSBpbnB1dCBsb2NhbCB2YXJpYWJsZSB0eXBlcy4gRm9yIFNUQUNLIHR5cGVzLCBpdCBpcyBhIHBvc2l0aW9uCisgICAgICogcmVsYXRpdmVseSB0byB0aGUgdG9wIG9mIGlucHV0IGZyYW1lIHN0YWNrLiBGb3IgQkFTRSB0eXBlcywgaXQgaXMgZWl0aGVyCisgICAgICogb25lIG9mIHRoZSBjb25zdGFudHMgZGVmaW5lZCBpbiBGcmFtZVZpc2l0b3IsIG9yIGZvciBPQkpFQ1QgYW5kCisgICAgICogVU5JTklUSUFMSVpFRCB0eXBlcywgYSB0YWcgYW5kIGFuIGluZGV4IGluIHRoZSB0eXBlIHRhYmxlLgorICAgICAqCisgICAgICogT3V0cHV0IGZyYW1lcyBjYW4gY29udGFpbiB0eXBlcyBvZiBhbnkga2luZCBhbmQgd2l0aCBhIHBvc2l0aXZlIG9yCisgICAgICogbmVnYXRpdmUgZGltZW5zaW9uIChhbmQgZXZlbiB1bmFzc2lnbmVkIHR5cGVzLCByZXByZXNlbnRlZCBieSAwIC0gd2hpY2gKKyAgICAgKiBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIGFueSB2YWxpZCB0eXBlIHZhbHVlKS4gSW5wdXQgZnJhbWVzIGNhbiBvbmx5CisgICAgICogY29udGFpbiBCQVNFIHR5cGVzIG9mIHBvc2l0aXZlIG9yIG51bGwgZGltZW5zaW9uLiBJbiBhbGwgY2FzZXMgdGhlIHR5cGUKKyAgICAgKiB0YWJsZSBjb250YWlucyBvbmx5IGludGVybmFsIHR5cGUgbmFtZXMgKGFycmF5IHR5cGUgZGVzY3JpcHRvcnMgYXJlCisgICAgICogZm9yYmlkZGVuIC0gZGltZW5zaW9ucyBtdXN0IGJlIHJlcHJlc2VudGVkIHRocm91Z2ggdGhlIERJTSBmaWVsZCkuCisgICAgICoKKyAgICAgKiBUaGUgTE9ORyBhbmQgRE9VQkxFIHR5cGVzIGFyZSBhbHdheXMgcmVwcmVzZW50ZWQgYnkgdXNpbmcgdHdvIHNsb3RzIChMT05HICsKKyAgICAgKiBUT1Agb3IgRE9VQkxFICsgVE9QKSwgZm9yIGxvY2FsIHZhcmlhYmxlIHR5cGVzIGFzIHdlbGwgYXMgaW4gdGhlIG9wZXJhbmQKKyAgICAgKiBzdGFjay4gVGhpcyBpcyBuZWNlc3NhcnkgdG8gYmUgYWJsZSB0byBzaW11bGF0ZSBEVVB4X3kgaW5zdHJ1Y3Rpb25zLAorICAgICAqIHdob3NlIGVmZmVjdCB3b3VsZCBiZSBkZXBlbmRlbnQgb24gdGhlIGFjdHVhbCB0eXBlIHZhbHVlcyBpZiB0eXBlcyB3ZXJlCisgICAgICogYWx3YXlzIHJlcHJlc2VudGVkIGJ5IGEgc2luZ2xlIHNsb3QgaW4gdGhlIHN0YWNrIChhbmQgdGhpcyBpcyBub3QKKyAgICAgKiBwb3NzaWJsZSwgc2luY2UgYWN0dWFsIHR5cGUgdmFsdWVzIGFyZSBub3QgYWx3YXlzIGtub3duIC0gY2YgTE9DQUwgYW5kCisgICAgICogU1RBQ0sgdHlwZSBraW5kcykuCisgICAgICovCisKKyAgICAvKioKKyAgICAgKiBNYXNrIHRvIGdldCB0aGUgZGltZW5zaW9uIG9mIGEgZnJhbWUgdHlwZS4gVGhpcyBkaW1lbnNpb24gaXMgYSBzaWduZWQKKyAgICAgKiBpbnRlZ2VyIGJldHdlZW4gLTggYW5kIDcuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBESU0gPSAweEYwMDAwMDAwOworCisgICAgLyoqCisgICAgICogQ29uc3RhbnQgdG8gYmUgYWRkZWQgdG8gYSB0eXBlIHRvIGdldCBhIHR5cGUgd2l0aCBvbmUgbW9yZSBkaW1lbnNpb24uCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBBUlJBWV9PRiA9IDB4MTAwMDAwMDA7CisKKyAgICAvKioKKyAgICAgKiBDb25zdGFudCB0byBiZSBhZGRlZCB0byBhIHR5cGUgdG8gZ2V0IGEgdHlwZSB3aXRoIG9uZSBsZXNzIGRpbWVuc2lvbi4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IEVMRU1FTlRfT0YgPSAweEYwMDAwMDAwOworCisgICAgLyoqCisgICAgICogTWFzayB0byBnZXQgdGhlIGtpbmQgb2YgYSBmcmFtZSB0eXBlLgorICAgICAqCisgICAgICogQHNlZSAjQkFTRQorICAgICAqIEBzZWUgI0xPQ0FMCisgICAgICogQHNlZSAjU1RBQ0sKKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IEtJTkQgPSAweEYwMDAwMDA7CisKKyAgICAvKioKKyAgICAgKiBGbGFnIHVzZWQgZm9yIExPQ0FMIGFuZCBTVEFDSyB0eXBlcy4gSW5kaWNhdGVzIHRoYXQgaWYgdGhpcyB0eXBlIGhhcHBlbnMKKyAgICAgKiB0byBiZSBhIGxvbmcgb3IgZG91YmxlIHR5cGUgKGR1cmluZyB0aGUgY29tcHV0YXRpb25zIG9mIGlucHV0IGZyYW1lcyksCisgICAgICogdGhlbiBpdCBtdXN0IGJlIHNldCB0byBUT1AgYmVjYXVzZSB0aGUgc2Vjb25kIHdvcmQgb2YgdGhpcyB2YWx1ZSBoYXMKKyAgICAgKiBiZWVuIHJldXNlZCB0byBzdG9yZSBvdGhlciBkYXRhIGluIHRoZSBiYXNpYyBibG9jay4gSGVuY2UgdGhlIGZpcnN0IHdvcmQKKyAgICAgKiBubyBsb25nZXIgc3RvcmVzIGEgdmFsaWQgbG9uZyBvciBkb3VibGUgdmFsdWUuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBUT1BfSUZfTE9OR19PUl9ET1VCTEUgPSAweDgwMDAwMDsKKworICAgIC8qKgorICAgICAqIE1hc2sgdG8gZ2V0IHRoZSB2YWx1ZSBvZiBhIGZyYW1lIHR5cGUuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBWQUxVRSA9IDB4N0ZGRkZGOworCisgICAgLyoqCisgICAgICogTWFzayB0byBnZXQgdGhlIGtpbmQgb2YgYmFzZSB0eXBlcy4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IEJBU0VfS0lORCA9IDB4RkYwMDAwMDsKKworICAgIC8qKgorICAgICAqIE1hc2sgdG8gZ2V0IHRoZSB2YWx1ZSBvZiBiYXNlIHR5cGVzLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgQkFTRV9WQUxVRSA9IDB4RkZGRkY7CisKKyAgICAvKioKKyAgICAgKiBLaW5kIG9mIHRoZSB0eXBlcyB0aGF0IGFyZSBub3QgcmVsYXRpdmUgdG8gYW4gaW5wdXQgc3RhY2sgbWFwIGZyYW1lLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgQkFTRSA9IDB4MTAwMDAwMDsKKworICAgIC8qKgorICAgICAqIEJhc2Uga2luZCBvZiB0aGUgYmFzZSByZWZlcmVuY2UgdHlwZXMuIFRoZSBCQVNFX1ZBTFVFIG9mIHN1Y2ggdHlwZXMgaXMgYW4KKyAgICAgKiBpbmRleCBpbnRvIHRoZSB0eXBlIHRhYmxlLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgT0JKRUNUID0gQkFTRSB8IDB4NzAwMDAwOworCisgICAgLyoqCisgICAgICogQmFzZSBraW5kIG9mIHRoZSB1bmluaXRpYWxpemVkIGJhc2UgdHlwZXMuIFRoZSBCQVNFX1ZBTFVFIG9mIHN1Y2ggdHlwZXMKKyAgICAgKiBpbiBhbiBpbmRleCBpbnRvIHRoZSB0eXBlIHRhYmxlICh0aGUgSXRlbSBhdCB0aGF0IGluZGV4IGNvbnRhaW5zIGJvdGggYW4KKyAgICAgKiBpbnN0cnVjdGlvbiBvZmZzZXQgYW5kIGFuIGludGVybmFsIGNsYXNzIG5hbWUpLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgVU5JTklUSUFMSVpFRCA9IEJBU0UgfCAweDgwMDAwMDsKKworICAgIC8qKgorICAgICAqIEtpbmQgb2YgdGhlIHR5cGVzIHRoYXQgYXJlIHJlbGF0aXZlIHRvIHRoZSBsb2NhbCB2YXJpYWJsZSB0eXBlcyBvZiBhbgorICAgICAqIGlucHV0IHN0YWNrIG1hcCBmcmFtZS4gVGhlIHZhbHVlIG9mIHN1Y2ggdHlwZXMgaXMgYSBsb2NhbCB2YXJpYWJsZSBpbmRleC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTE9DQUwgPSAweDIwMDAwMDA7CisKKyAgICAvKioKKyAgICAgKiBLaW5kIG9mIHRoZSB0aGUgdHlwZXMgdGhhdCBhcmUgcmVsYXRpdmUgdG8gdGhlIHN0YWNrIG9mIGFuIGlucHV0IHN0YWNrCisgICAgICogbWFwIGZyYW1lLiBUaGUgdmFsdWUgb2Ygc3VjaCB0eXBlcyBpcyBhIHBvc2l0aW9uIHJlbGF0aXZlbHkgdG8gdGhlIHRvcCBvZgorICAgICAqIHRoaXMgc3RhY2suCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQUNLID0gMHgzMDAwMDAwOworCisgICAgLyoqCisgICAgICogVGhlIFRPUCB0eXBlLiBUaGlzIGlzIGEgQkFTRSB0eXBlLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgVE9QID0gQkFTRSB8IDA7CisKKyAgICAvKioKKyAgICAgKiBUaGUgQk9PTEVBTiB0eXBlLiBUaGlzIGlzIGEgQkFTRSB0eXBlIG1haW5seSB1c2VkIGZvciBhcnJheSB0eXBlcy4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IEJPT0xFQU4gPSBCQVNFIHwgOTsKKworICAgIC8qKgorICAgICAqIFRoZSBCWVRFIHR5cGUuIFRoaXMgaXMgYSBCQVNFIHR5cGUgbWFpbmx5IHVzZWQgZm9yIGFycmF5IHR5cGVzLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgQllURSA9IEJBU0UgfCAxMDsKKworICAgIC8qKgorICAgICAqIFRoZSBDSEFSIHR5cGUuIFRoaXMgaXMgYSBCQVNFIHR5cGUgbWFpbmx5IHVzZWQgZm9yIGFycmF5IHR5cGVzLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgQ0hBUiA9IEJBU0UgfCAxMTsKKworICAgIC8qKgorICAgICAqIFRoZSBTSE9SVCB0eXBlLiBUaGlzIGlzIGEgQkFTRSB0eXBlIG1haW5seSB1c2VkIGZvciBhcnJheSB0eXBlcy4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IFNIT1JUID0gQkFTRSB8IDEyOworCisgICAgLyoqCisgICAgICogVGhlIElOVEVHRVIgdHlwZS4gVGhpcyBpcyBhIEJBU0UgdHlwZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IElOVEVHRVIgPSBCQVNFIHwgMTsKKworICAgIC8qKgorICAgICAqIFRoZSBGTE9BVCB0eXBlLiBUaGlzIGlzIGEgQkFTRSB0eXBlLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgRkxPQVQgPSBCQVNFIHwgMjsKKworICAgIC8qKgorICAgICAqIFRoZSBET1VCTEUgdHlwZS4gVGhpcyBpcyBhIEJBU0UgdHlwZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IERPVUJMRSA9IEJBU0UgfCAzOworCisgICAgLyoqCisgICAgICogVGhlIExPTkcgdHlwZS4gVGhpcyBpcyBhIEJBU0UgdHlwZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IExPTkcgPSBCQVNFIHwgNDsKKworICAgIC8qKgorICAgICAqIFRoZSBOVUxMIHR5cGUuIFRoaXMgaXMgYSBCQVNFIHR5cGUuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBOVUxMID0gQkFTRSB8IDU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgVU5JTklUSUFMSVpFRF9USElTIHR5cGUuIFRoaXMgaXMgYSBCQVNFIHR5cGUuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBVTklOSVRJQUxJWkVEX1RISVMgPSBCQVNFIHwgNjsKKworICAgIC8qKgorICAgICAqIFRoZSBzdGFjayBzaXplIHZhcmlhdGlvbiBjb3JyZXNwb25kaW5nIHRvIGVhY2ggSlZNIGluc3RydWN0aW9uLiBUaGlzCisgICAgICogc3RhY2sgdmFyaWF0aW9uIGlzIGVxdWFsIHRvIHRoZSBzaXplIG9mIHRoZSB2YWx1ZXMgcHJvZHVjZWQgYnkgYW4KKyAgICAgKiBpbnN0cnVjdGlvbiwgbWludXMgdGhlIHNpemUgb2YgdGhlIHZhbHVlcyBjb25zdW1lZCBieSB0aGlzIGluc3RydWN0aW9uLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnRbXSBTSVpFOworCisgICAgLyoqCisgICAgICogQ29tcHV0ZXMgdGhlIHN0YWNrIHNpemUgdmFyaWF0aW9uIGNvcnJlc3BvbmRpbmcgdG8gZWFjaCBKVk0gaW5zdHJ1Y3Rpb24uCisgICAgICovCisgICAgc3RhdGljIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGludFtdIGIgPSBuZXcgaW50WzIwMl07CisgICAgICAgIFN0cmluZyBzID0gIkVGRkZGRkZGRkdHRkZGR0dGRkZFRUZHRkdGRUVFRUVFRUVFRUVFRUVFRUVFRUVERURFREREREQiCisgICAgICAgICAgICAgICAgKyAiQ0RDREVFRUVFRUVFRUVFRUVFRUVFRUVFQkFCQUJCQkJEQ0ZGRkdHR0VEQ0RDRENEQ0RDRENEQ0RDRCIKKyAgICAgICAgICAgICAgICArICJDRENFRUVFRERERERERENEQ0RDRUZFRkRERUVGRkRFREVFRUJEREJCREREREREQ0NDQ0NDQ0NFRkVEIgorICAgICAgICAgICAgICAgICsgIkREQ0RDREVFRUVFRUVFRUVGRUVFRUVFRERFRURERUUiOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYi5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgYltpXSA9IHMuY2hhckF0KGkpIC0gJ0UnOworICAgICAgICB9CisgICAgICAgIFNJWkUgPSBiOworCisgICAgICAgIC8vIGNvZGUgdG8gZ2VuZXJhdGUgdGhlIGFib3ZlIHN0cmluZworICAgICAgICAvLworICAgICAgICAvLyBpbnQgTkEgPSAwOyAvLyBub3QgYXBwbGljYWJsZSAodW51c2VkIG9wY29kZSBvciB2YXJpYWJsZSBzaXplIG9wY29kZSkKKyAgICAgICAgLy8KKyAgICAgICAgLy8gYiA9IG5ldyBpbnRbXSB7CisgICAgICAgIC8vIDAsIC8vTk9QLCAvLyB2aXNpdEluc24KKyAgICAgICAgLy8gMSwgLy9BQ09OU1RfTlVMTCwgLy8gLQorICAgICAgICAvLyAxLCAvL0lDT05TVF9NMSwgLy8gLQorICAgICAgICAvLyAxLCAvL0lDT05TVF8wLCAvLyAtCisgICAgICAgIC8vIDEsIC8vSUNPTlNUXzEsIC8vIC0KKyAgICAgICAgLy8gMSwgLy9JQ09OU1RfMiwgLy8gLQorICAgICAgICAvLyAxLCAvL0lDT05TVF8zLCAvLyAtCisgICAgICAgIC8vIDEsIC8vSUNPTlNUXzQsIC8vIC0KKyAgICAgICAgLy8gMSwgLy9JQ09OU1RfNSwgLy8gLQorICAgICAgICAvLyAyLCAvL0xDT05TVF8wLCAvLyAtCisgICAgICAgIC8vIDIsIC8vTENPTlNUXzEsIC8vIC0KKyAgICAgICAgLy8gMSwgLy9GQ09OU1RfMCwgLy8gLQorICAgICAgICAvLyAxLCAvL0ZDT05TVF8xLCAvLyAtCisgICAgICAgIC8vIDEsIC8vRkNPTlNUXzIsIC8vIC0KKyAgICAgICAgLy8gMiwgLy9EQ09OU1RfMCwgLy8gLQorICAgICAgICAvLyAyLCAvL0RDT05TVF8xLCAvLyAtCisgICAgICAgIC8vIDEsIC8vQklQVVNILCAvLyB2aXNpdEludEluc24KKyAgICAgICAgLy8gMSwgLy9TSVBVU0gsIC8vIC0KKyAgICAgICAgLy8gMSwgLy9MREMsIC8vIHZpc2l0TGRjSW5zbgorICAgICAgICAvLyBOQSwgLy9MRENfVywgLy8gLQorICAgICAgICAvLyBOQSwgLy9MREMyX1csIC8vIC0KKyAgICAgICAgLy8gMSwgLy9JTE9BRCwgLy8gdmlzaXRWYXJJbnNuCisgICAgICAgIC8vIDIsIC8vTExPQUQsIC8vIC0KKyAgICAgICAgLy8gMSwgLy9GTE9BRCwgLy8gLQorICAgICAgICAvLyAyLCAvL0RMT0FELCAvLyAtCisgICAgICAgIC8vIDEsIC8vQUxPQUQsIC8vIC0KKyAgICAgICAgLy8gTkEsIC8vSUxPQURfMCwgLy8gLQorICAgICAgICAvLyBOQSwgLy9JTE9BRF8xLCAvLyAtCisgICAgICAgIC8vIE5BLCAvL0lMT0FEXzIsIC8vIC0KKyAgICAgICAgLy8gTkEsIC8vSUxPQURfMywgLy8gLQorICAgICAgICAvLyBOQSwgLy9MTE9BRF8wLCAvLyAtCisgICAgICAgIC8vIE5BLCAvL0xMT0FEXzEsIC8vIC0KKyAgICAgICAgLy8gTkEsIC8vTExPQURfMiwgLy8gLQorICAgICAgICAvLyBOQSwgLy9MTE9BRF8zLCAvLyAtCisgICAgICAgIC8vIE5BLCAvL0ZMT0FEXzAsIC8vIC0KKyAgICAgICAgLy8gTkEsIC8vRkxPQURfMSwgLy8gLQorICAgICAgICAvLyBOQSwgLy9GTE9BRF8yLCAvLyAtCisgICAgICAgIC8vIE5BLCAvL0ZMT0FEXzMsIC8vIC0KKyAgICAgICAgLy8gTkEsIC8vRExPQURfMCwgLy8gLQorICAgICAgICAvLyBOQSwgLy9ETE9BRF8xLCAvLyAtCisgICAgICAgIC8vIE5BLCAvL0RMT0FEXzIsIC8vIC0KKyAgICAgICAgLy8gTkEsIC8vRExPQURfMywgLy8gLQorICAgICAgICAvLyBOQSwgLy9BTE9BRF8wLCAvLyAtCisgICAgICAgIC8vIE5BLCAvL0FMT0FEXzEsIC8vIC0KKyAgICAgICAgLy8gTkEsIC8vQUxPQURfMiwgLy8gLQorICAgICAgICAvLyBOQSwgLy9BTE9BRF8zLCAvLyAtCisgICAgICAgIC8vIC0xLCAvL0lBTE9BRCwgLy8gdmlzaXRJbnNuCisgICAgICAgIC8vIDAsIC8vTEFMT0FELCAvLyAtCisgICAgICAgIC8vIC0xLCAvL0ZBTE9BRCwgLy8gLQorICAgICAgICAvLyAwLCAvL0RBTE9BRCwgLy8gLQorICAgICAgICAvLyAtMSwgLy9BQUxPQUQsIC8vIC0KKyAgICAgICAgLy8gLTEsIC8vQkFMT0FELCAvLyAtCisgICAgICAgIC8vIC0xLCAvL0NBTE9BRCwgLy8gLQorICAgICAgICAvLyAtMSwgLy9TQUxPQUQsIC8vIC0KKyAgICAgICAgLy8gLTEsIC8vSVNUT1JFLCAvLyB2aXNpdFZhckluc24KKyAgICAgICAgLy8gLTIsIC8vTFNUT1JFLCAvLyAtCisgICAgICAgIC8vIC0xLCAvL0ZTVE9SRSwgLy8gLQorICAgICAgICAvLyAtMiwgLy9EU1RPUkUsIC8vIC0KKyAgICAgICAgLy8gLTEsIC8vQVNUT1JFLCAvLyAtCisgICAgICAgIC8vIE5BLCAvL0lTVE9SRV8wLCAvLyAtCisgICAgICAgIC8vIE5BLCAvL0lTVE9SRV8xLCAvLyAtCisgICAgICAgIC8vIE5BLCAvL0lTVE9SRV8yLCAvLyAtCisgICAgICAgIC8vIE5BLCAvL0lTVE9SRV8zLCAvLyAtCisgICAgICAgIC8vIE5BLCAvL0xTVE9SRV8wLCAvLyAtCisgICAgICAgIC8vIE5BLCAvL0xTVE9SRV8xLCAvLyAtCisgICAgICAgIC8vIE5BLCAvL0xTVE9SRV8yLCAvLyAtCisgICAgICAgIC8vIE5BLCAvL0xTVE9SRV8zLCAvLyAtCisgICAgICAgIC8vIE5BLCAvL0ZTVE9SRV8wLCAvLyAtCisgICAgICAgIC8vIE5BLCAvL0ZTVE9SRV8xLCAvLyAtCisgICAgICAgIC8vIE5BLCAvL0ZTVE9SRV8yLCAvLyAtCisgICAgICAgIC8vIE5BLCAvL0ZTVE9SRV8zLCAvLyAtCisgICAgICAgIC8vIE5BLCAvL0RTVE9SRV8wLCAvLyAtCisgICAgICAgIC8vIE5BLCAvL0RTVE9SRV8xLCAvLyAtCisgICAgICAgIC8vIE5BLCAvL0RTVE9SRV8yLCAvLyAtCisgICAgICAgIC8vIE5BLCAvL0RTVE9SRV8zLCAvLyAtCisgICAgICAgIC8vIE5BLCAvL0FTVE9SRV8wLCAvLyAtCisgICAgICAgIC8vIE5BLCAvL0FTVE9SRV8xLCAvLyAtCisgICAgICAgIC8vIE5BLCAvL0FTVE9SRV8yLCAvLyAtCisgICAgICAgIC8vIE5BLCAvL0FTVE9SRV8zLCAvLyAtCisgICAgICAgIC8vIC0zLCAvL0lBU1RPUkUsIC8vIHZpc2l0SW5zbgorICAgICAgICAvLyAtNCwgLy9MQVNUT1JFLCAvLyAtCisgICAgICAgIC8vIC0zLCAvL0ZBU1RPUkUsIC8vIC0KKyAgICAgICAgLy8gLTQsIC8vREFTVE9SRSwgLy8gLQorICAgICAgICAvLyAtMywgLy9BQVNUT1JFLCAvLyAtCisgICAgICAgIC8vIC0zLCAvL0JBU1RPUkUsIC8vIC0KKyAgICAgICAgLy8gLTMsIC8vQ0FTVE9SRSwgLy8gLQorICAgICAgICAvLyAtMywgLy9TQVNUT1JFLCAvLyAtCisgICAgICAgIC8vIC0xLCAvL1BPUCwgLy8gLQorICAgICAgICAvLyAtMiwgLy9QT1AyLCAvLyAtCisgICAgICAgIC8vIDEsIC8vRFVQLCAvLyAtCisgICAgICAgIC8vIDEsIC8vRFVQX1gxLCAvLyAtCisgICAgICAgIC8vIDEsIC8vRFVQX1gyLCAvLyAtCisgICAgICAgIC8vIDIsIC8vRFVQMiwgLy8gLQorICAgICAgICAvLyAyLCAvL0RVUDJfWDEsIC8vIC0KKyAgICAgICAgLy8gMiwgLy9EVVAyX1gyLCAvLyAtCisgICAgICAgIC8vIDAsIC8vU1dBUCwgLy8gLQorICAgICAgICAvLyAtMSwgLy9JQURELCAvLyAtCisgICAgICAgIC8vIC0yLCAvL0xBREQsIC8vIC0KKyAgICAgICAgLy8gLTEsIC8vRkFERCwgLy8gLQorICAgICAgICAvLyAtMiwgLy9EQURELCAvLyAtCisgICAgICAgIC8vIC0xLCAvL0lTVUIsIC8vIC0KKyAgICAgICAgLy8gLTIsIC8vTFNVQiwgLy8gLQorICAgICAgICAvLyAtMSwgLy9GU1VCLCAvLyAtCisgICAgICAgIC8vIC0yLCAvL0RTVUIsIC8vIC0KKyAgICAgICAgLy8gLTEsIC8vSU1VTCwgLy8gLQorICAgICAgICAvLyAtMiwgLy9MTVVMLCAvLyAtCisgICAgICAgIC8vIC0xLCAvL0ZNVUwsIC8vIC0KKyAgICAgICAgLy8gLTIsIC8vRE1VTCwgLy8gLQorICAgICAgICAvLyAtMSwgLy9JRElWLCAvLyAtCisgICAgICAgIC8vIC0yLCAvL0xESVYsIC8vIC0KKyAgICAgICAgLy8gLTEsIC8vRkRJViwgLy8gLQorICAgICAgICAvLyAtMiwgLy9ERElWLCAvLyAtCisgICAgICAgIC8vIC0xLCAvL0lSRU0sIC8vIC0KKyAgICAgICAgLy8gLTIsIC8vTFJFTSwgLy8gLQorICAgICAgICAvLyAtMSwgLy9GUkVNLCAvLyAtCisgICAgICAgIC8vIC0yLCAvL0RSRU0sIC8vIC0KKyAgICAgICAgLy8gMCwgLy9JTkVHLCAvLyAtCisgICAgICAgIC8vIDAsIC8vTE5FRywgLy8gLQorICAgICAgICAvLyAwLCAvL0ZORUcsIC8vIC0KKyAgICAgICAgLy8gMCwgLy9ETkVHLCAvLyAtCisgICAgICAgIC8vIC0xLCAvL0lTSEwsIC8vIC0KKyAgICAgICAgLy8gLTEsIC8vTFNITCwgLy8gLQorICAgICAgICAvLyAtMSwgLy9JU0hSLCAvLyAtCisgICAgICAgIC8vIC0xLCAvL0xTSFIsIC8vIC0KKyAgICAgICAgLy8gLTEsIC8vSVVTSFIsIC8vIC0KKyAgICAgICAgLy8gLTEsIC8vTFVTSFIsIC8vIC0KKyAgICAgICAgLy8gLTEsIC8vSUFORCwgLy8gLQorICAgICAgICAvLyAtMiwgLy9MQU5ELCAvLyAtCisgICAgICAgIC8vIC0xLCAvL0lPUiwgLy8gLQorICAgICAgICAvLyAtMiwgLy9MT1IsIC8vIC0KKyAgICAgICAgLy8gLTEsIC8vSVhPUiwgLy8gLQorICAgICAgICAvLyAtMiwgLy9MWE9SLCAvLyAtCisgICAgICAgIC8vIDAsIC8vSUlOQywgLy8gdmlzaXRJaW5jSW5zbgorICAgICAgICAvLyAxLCAvL0kyTCwgLy8gdmlzaXRJbnNuCisgICAgICAgIC8vIDAsIC8vSTJGLCAvLyAtCisgICAgICAgIC8vIDEsIC8vSTJELCAvLyAtCisgICAgICAgIC8vIC0xLCAvL0wySSwgLy8gLQorICAgICAgICAvLyAtMSwgLy9MMkYsIC8vIC0KKyAgICAgICAgLy8gMCwgLy9MMkQsIC8vIC0KKyAgICAgICAgLy8gMCwgLy9GMkksIC8vIC0KKyAgICAgICAgLy8gMSwgLy9GMkwsIC8vIC0KKyAgICAgICAgLy8gMSwgLy9GMkQsIC8vIC0KKyAgICAgICAgLy8gLTEsIC8vRDJJLCAvLyAtCisgICAgICAgIC8vIDAsIC8vRDJMLCAvLyAtCisgICAgICAgIC8vIC0xLCAvL0QyRiwgLy8gLQorICAgICAgICAvLyAwLCAvL0kyQiwgLy8gLQorICAgICAgICAvLyAwLCAvL0kyQywgLy8gLQorICAgICAgICAvLyAwLCAvL0kyUywgLy8gLQorICAgICAgICAvLyAtMywgLy9MQ01QLCAvLyAtCisgICAgICAgIC8vIC0xLCAvL0ZDTVBMLCAvLyAtCisgICAgICAgIC8vIC0xLCAvL0ZDTVBHLCAvLyAtCisgICAgICAgIC8vIC0zLCAvL0RDTVBMLCAvLyAtCisgICAgICAgIC8vIC0zLCAvL0RDTVBHLCAvLyAtCisgICAgICAgIC8vIC0xLCAvL0lGRVEsIC8vIHZpc2l0SnVtcEluc24KKyAgICAgICAgLy8gLTEsIC8vSUZORSwgLy8gLQorICAgICAgICAvLyAtMSwgLy9JRkxULCAvLyAtCisgICAgICAgIC8vIC0xLCAvL0lGR0UsIC8vIC0KKyAgICAgICAgLy8gLTEsIC8vSUZHVCwgLy8gLQorICAgICAgICAvLyAtMSwgLy9JRkxFLCAvLyAtCisgICAgICAgIC8vIC0yLCAvL0lGX0lDTVBFUSwgLy8gLQorICAgICAgICAvLyAtMiwgLy9JRl9JQ01QTkUsIC8vIC0KKyAgICAgICAgLy8gLTIsIC8vSUZfSUNNUExULCAvLyAtCisgICAgICAgIC8vIC0yLCAvL0lGX0lDTVBHRSwgLy8gLQorICAgICAgICAvLyAtMiwgLy9JRl9JQ01QR1QsIC8vIC0KKyAgICAgICAgLy8gLTIsIC8vSUZfSUNNUExFLCAvLyAtCisgICAgICAgIC8vIC0yLCAvL0lGX0FDTVBFUSwgLy8gLQorICAgICAgICAvLyAtMiwgLy9JRl9BQ01QTkUsIC8vIC0KKyAgICAgICAgLy8gMCwgLy9HT1RPLCAvLyAtCisgICAgICAgIC8vIDEsIC8vSlNSLCAvLyAtCisgICAgICAgIC8vIDAsIC8vUkVULCAvLyB2aXNpdFZhckluc24KKyAgICAgICAgLy8gLTEsIC8vVEFCTEVTV0lUQ0gsIC8vIHZpc2lUYWJsZVN3aXRjaEluc24KKyAgICAgICAgLy8gLTEsIC8vTE9PS1VQU1dJVENILCAvLyB2aXNpdExvb2t1cFN3aXRjaAorICAgICAgICAvLyAtMSwgLy9JUkVUVVJOLCAvLyB2aXNpdEluc24KKyAgICAgICAgLy8gLTIsIC8vTFJFVFVSTiwgLy8gLQorICAgICAgICAvLyAtMSwgLy9GUkVUVVJOLCAvLyAtCisgICAgICAgIC8vIC0yLCAvL0RSRVRVUk4sIC8vIC0KKyAgICAgICAgLy8gLTEsIC8vQVJFVFVSTiwgLy8gLQorICAgICAgICAvLyAwLCAvL1JFVFVSTiwgLy8gLQorICAgICAgICAvLyBOQSwgLy9HRVRTVEFUSUMsIC8vIHZpc2l0RmllbGRJbnNuCisgICAgICAgIC8vIE5BLCAvL1BVVFNUQVRJQywgLy8gLQorICAgICAgICAvLyBOQSwgLy9HRVRGSUVMRCwgLy8gLQorICAgICAgICAvLyBOQSwgLy9QVVRGSUVMRCwgLy8gLQorICAgICAgICAvLyBOQSwgLy9JTlZPS0VWSVJUVUFMLCAvLyB2aXNpdE1ldGhvZEluc24KKyAgICAgICAgLy8gTkEsIC8vSU5WT0tFU1BFQ0lBTCwgLy8gLQorICAgICAgICAvLyBOQSwgLy9JTlZPS0VTVEFUSUMsIC8vIC0KKyAgICAgICAgLy8gTkEsIC8vSU5WT0tFSU5URVJGQUNFLCAvLyAtCisgICAgICAgIC8vIE5BLCAvL0lOVk9LRURZTkFNSUMsIC8vIHZpc2l0SW52b2tlRHluYW1pY0luc24KKyAgICAgICAgLy8gMSwgLy9ORVcsIC8vIHZpc2l0VHlwZUluc24KKyAgICAgICAgLy8gMCwgLy9ORVdBUlJBWSwgLy8gdmlzaXRJbnRJbnNuCisgICAgICAgIC8vIDAsIC8vQU5FV0FSUkFZLCAvLyB2aXNpdFR5cGVJbnNuCisgICAgICAgIC8vIDAsIC8vQVJSQVlMRU5HVEgsIC8vIHZpc2l0SW5zbgorICAgICAgICAvLyBOQSwgLy9BVEhST1csIC8vIC0KKyAgICAgICAgLy8gMCwgLy9DSEVDS0NBU1QsIC8vIHZpc2l0VHlwZUluc24KKyAgICAgICAgLy8gMCwgLy9JTlNUQU5DRU9GLCAvLyAtCisgICAgICAgIC8vIC0xLCAvL01PTklUT1JFTlRFUiwgLy8gdmlzaXRJbnNuCisgICAgICAgIC8vIC0xLCAvL01PTklUT1JFWElULCAvLyAtCisgICAgICAgIC8vIE5BLCAvL1dJREUsIC8vIE5PVCBWSVNJVEVECisgICAgICAgIC8vIE5BLCAvL01VTFRJQU5FV0FSUkFZLCAvLyB2aXNpdE11bHRpQU5ld0FycmF5SW5zbgorICAgICAgICAvLyAtMSwgLy9JRk5VTEwsIC8vIHZpc2l0SnVtcEluc24KKyAgICAgICAgLy8gLTEsIC8vSUZOT05OVUxMLCAvLyAtCisgICAgICAgIC8vIE5BLCAvL0dPVE9fVywgLy8gLQorICAgICAgICAvLyBOQSwgLy9KU1JfVywgLy8gLQorICAgICAgICAvLyB9OworICAgICAgICAvLyBmb3IgKGkgPSAwOyBpIDwgYi5sZW5ndGg7ICsraSkgeworICAgICAgICAvLyBTeXN0ZW0uZXJyLnByaW50KChjaGFyKSgnRScgKyBiW2ldKSk7CisgICAgICAgIC8vIH0KKyAgICAgICAgLy8gU3lzdGVtLmVyci5wcmludGxuKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGxhYmVsIChpLmUuIGJhc2ljIGJsb2NrKSB0byB3aGljaCB0aGVzZSBpbnB1dCBhbmQgb3V0cHV0IHN0YWNrIG1hcAorICAgICAqIGZyYW1lcyBjb3JyZXNwb25kLgorICAgICAqLworICAgIExhYmVsIG93bmVyOworCisgICAgLyoqCisgICAgICogVGhlIGlucHV0IHN0YWNrIG1hcCBmcmFtZSBsb2NhbHMuCisgICAgICovCisgICAgaW50W10gaW5wdXRMb2NhbHM7CisKKyAgICAvKioKKyAgICAgKiBUaGUgaW5wdXQgc3RhY2sgbWFwIGZyYW1lIHN0YWNrLgorICAgICAqLworICAgIGludFtdIGlucHV0U3RhY2s7CisKKyAgICAvKioKKyAgICAgKiBUaGUgb3V0cHV0IHN0YWNrIG1hcCBmcmFtZSBsb2NhbHMuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnRbXSBvdXRwdXRMb2NhbHM7CisKKyAgICAvKioKKyAgICAgKiBUaGUgb3V0cHV0IHN0YWNrIG1hcCBmcmFtZSBzdGFjay4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludFtdIG91dHB1dFN0YWNrOworCisgICAgLyoqCisgICAgICogUmVsYXRpdmUgc2l6ZSBvZiB0aGUgb3V0cHV0IHN0YWNrLiBUaGUgZXhhY3Qgc2VtYW50aWNzIG9mIHRoaXMgZmllbGQKKyAgICAgKiBkZXBlbmRzIG9uIHRoZSBhbGdvcml0aG0gdGhhdCBpcyB1c2VkLgorICAgICAqCisgICAgICogV2hlbiBvbmx5IHRoZSBtYXhpbXVtIHN0YWNrIHNpemUgaXMgY29tcHV0ZWQsIHRoaXMgZmllbGQgaXMgdGhlIHNpemUgb2YKKyAgICAgKiB0aGUgb3V0cHV0IHN0YWNrIHJlbGF0aXZlbHkgdG8gdGhlIHRvcCBvZiB0aGUgaW5wdXQgc3RhY2suCisgICAgICoKKyAgICAgKiBXaGVuIHRoZSBzdGFjayBtYXAgZnJhbWVzIGFyZSBjb21wbGV0ZWx5IGNvbXB1dGVkLCB0aGlzIGZpZWxkIGlzIHRoZQorICAgICAqIGFjdHVhbCBudW1iZXIgb2YgdHlwZXMgaW4ge0BsaW5rICNvdXRwdXRTdGFja30uCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgb3V0cHV0U3RhY2tUb3A7CisKKyAgICAvKioKKyAgICAgKiBOdW1iZXIgb2YgdHlwZXMgdGhhdCBhcmUgaW5pdGlhbGl6ZWQgaW4gdGhlIGJhc2ljIGJsb2NrLgorICAgICAqCisgICAgICogQHNlZSAjaW5pdGlhbGl6YXRpb25zCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgaW5pdGlhbGl6YXRpb25Db3VudDsKKworICAgIC8qKgorICAgICAqIFRoZSB0eXBlcyB0aGF0IGFyZSBpbml0aWFsaXplZCBpbiB0aGUgYmFzaWMgYmxvY2suIEEgY29uc3RydWN0b3IKKyAgICAgKiBpbnZvY2F0aW9uIG9uIGFuIFVOSU5JVElBTElaRUQgb3IgVU5JTklUSUFMSVpFRF9USElTIHR5cGUgbXVzdCByZXBsYWNlCisgICAgICogPGk+ZXZlcnkgb2NjdXJlbmNlPC9pPiBvZiB0aGlzIHR5cGUgaW4gdGhlIGxvY2FsIHZhcmlhYmxlcyBhbmQgaW4gdGhlCisgICAgICogb3BlcmFuZCBzdGFjay4gVGhpcyBjYW5ub3QgYmUgZG9uZSBkdXJpbmcgdGhlIGZpcnN0IHBoYXNlIG9mIHRoZQorICAgICAqIGFsZ29yaXRobSBzaW5jZSwgZHVyaW5nIHRoaXMgcGhhc2UsIHRoZSBsb2NhbCB2YXJpYWJsZXMgYW5kIHRoZSBvcGVyYW5kCisgICAgICogc3RhY2sgYXJlIG5vdCBjb21wbGV0ZWx5IGNvbXB1dGVkLiBJdCBpcyB0aGVyZWZvcmUgbmVjZXNzYXJ5IHRvIHN0b3JlIHRoZQorICAgICAqIHR5cGVzIG9uIHdoaWNoIGNvbnN0cnVjdG9ycyBhcmUgaW52b2tlZCBpbiB0aGUgYmFzaWMgYmxvY2ssIGluIG9yZGVyIHRvCisgICAgICogZG8gdGhpcyByZXBsYWNlbWVudCBkdXJpbmcgdGhlIHNlY29uZCBwaGFzZSBvZiB0aGUgYWxnb3JpdGhtLCB3aGVyZSB0aGUKKyAgICAgKiBmcmFtZXMgYXJlIGZ1bGx5IGNvbXB1dGVkLiBOb3RlIHRoYXQgdGhpcyBhcnJheSBjYW4gY29udGFpbiB0eXBlcyB0aGF0CisgICAgICogYXJlIHJlbGF0aXZlIHRvIGlucHV0IGxvY2FscyBvciB0byB0aGUgaW5wdXQgc3RhY2sgKHNlZSBiZWxvdyBmb3IgdGhlCisgICAgICogZGVzY3JpcHRpb24gb2YgdGhlIGFsZ29yaXRobSkuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnRbXSBpbml0aWFsaXphdGlvbnM7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBvdXRwdXQgZnJhbWUgbG9jYWwgdmFyaWFibGUgdHlwZSBhdCB0aGUgZ2l2ZW4gaW5kZXguCisgICAgICoKKyAgICAgKiBAcGFyYW0gbG9jYWwgdGhlIGluZGV4IG9mIHRoZSBsb2NhbCB0aGF0IG11c3QgYmUgcmV0dXJuZWQuCisgICAgICogQHJldHVybiB0aGUgb3V0cHV0IGZyYW1lIGxvY2FsIHZhcmlhYmxlIHR5cGUgYXQgdGhlIGdpdmVuIGluZGV4LgorICAgICAqLworICAgIHByaXZhdGUgaW50IGdldChmaW5hbCBpbnQgbG9jYWwpIHsKKyAgICAgICAgaWYgKG91dHB1dExvY2FscyA9PSBudWxsIHx8IGxvY2FsID49IG91dHB1dExvY2Fscy5sZW5ndGgpIHsKKyAgICAgICAgICAgIC8vIHRoaXMgbG9jYWwgaGFzIG5ldmVyIGJlZW4gYXNzaWduZWQgaW4gdGhpcyBiYXNpYyBibG9jaywKKyAgICAgICAgICAgIC8vIHNvIGl0IGlzIHN0aWxsIGVxdWFsIHRvIGl0cyB2YWx1ZSBpbiB0aGUgaW5wdXQgZnJhbWUKKyAgICAgICAgICAgIHJldHVybiBMT0NBTCB8IGxvY2FsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IHR5cGUgPSBvdXRwdXRMb2NhbHNbbG9jYWxdOworICAgICAgICAgICAgaWYgKHR5cGUgPT0gMCkgeworICAgICAgICAgICAgICAgIC8vIHRoaXMgbG9jYWwgaGFzIG5ldmVyIGJlZW4gYXNzaWduZWQgaW4gdGhpcyBiYXNpYyBibG9jaywKKyAgICAgICAgICAgICAgICAvLyBzbyBpdCBpcyBzdGlsbCBlcXVhbCB0byBpdHMgdmFsdWUgaW4gdGhlIGlucHV0IGZyYW1lCisgICAgICAgICAgICAgICAgdHlwZSA9IG91dHB1dExvY2Fsc1tsb2NhbF0gPSBMT0NBTCB8IGxvY2FsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBvdXRwdXQgZnJhbWUgbG9jYWwgdmFyaWFibGUgdHlwZSBhdCB0aGUgZ2l2ZW4gaW5kZXguCisgICAgICoKKyAgICAgKiBAcGFyYW0gbG9jYWwgdGhlIGluZGV4IG9mIHRoZSBsb2NhbCB0aGF0IG11c3QgYmUgc2V0LgorICAgICAqIEBwYXJhbSB0eXBlIHRoZSB2YWx1ZSBvZiB0aGUgbG9jYWwgdGhhdCBtdXN0IGJlIHNldC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2V0KGZpbmFsIGludCBsb2NhbCwgZmluYWwgaW50IHR5cGUpIHsKKyAgICAgICAgLy8gY3JlYXRlcyBhbmQvb3IgcmVzaXplcyB0aGUgb3V0cHV0IGxvY2FsIHZhcmlhYmxlcyBhcnJheSBpZiBuZWNlc3NhcnkKKyAgICAgICAgaWYgKG91dHB1dExvY2FscyA9PSBudWxsKSB7CisgICAgICAgICAgICBvdXRwdXRMb2NhbHMgPSBuZXcgaW50WzEwXTsKKyAgICAgICAgfQorICAgICAgICBpbnQgbiA9IG91dHB1dExvY2Fscy5sZW5ndGg7CisgICAgICAgIGlmIChsb2NhbCA+PSBuKSB7CisgICAgICAgICAgICBpbnRbXSB0ID0gbmV3IGludFtNYXRoLm1heChsb2NhbCArIDEsIDIgKiBuKV07CisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG91dHB1dExvY2FscywgMCwgdCwgMCwgbik7CisgICAgICAgICAgICBvdXRwdXRMb2NhbHMgPSB0OworICAgICAgICB9CisgICAgICAgIC8vIHNldHMgdGhlIGxvY2FsIHZhcmlhYmxlCisgICAgICAgIG91dHB1dExvY2Fsc1tsb2NhbF0gPSB0eXBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFB1c2hlcyBhIG5ldyB0eXBlIG9udG8gdGhlIG91dHB1dCBmcmFtZSBzdGFjay4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIHRoYXQgbXVzdCBiZSBwdXNoZWQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHB1c2goZmluYWwgaW50IHR5cGUpIHsKKyAgICAgICAgLy8gY3JlYXRlcyBhbmQvb3IgcmVzaXplcyB0aGUgb3V0cHV0IHN0YWNrIGFycmF5IGlmIG5lY2Vzc2FyeQorICAgICAgICBpZiAob3V0cHV0U3RhY2sgPT0gbnVsbCkgeworICAgICAgICAgICAgb3V0cHV0U3RhY2sgPSBuZXcgaW50WzEwXTsKKyAgICAgICAgfQorICAgICAgICBpbnQgbiA9IG91dHB1dFN0YWNrLmxlbmd0aDsKKyAgICAgICAgaWYgKG91dHB1dFN0YWNrVG9wID49IG4pIHsKKyAgICAgICAgICAgIGludFtdIHQgPSBuZXcgaW50W01hdGgubWF4KG91dHB1dFN0YWNrVG9wICsgMSwgMiAqIG4pXTsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkob3V0cHV0U3RhY2ssIDAsIHQsIDAsIG4pOworICAgICAgICAgICAgb3V0cHV0U3RhY2sgPSB0OworICAgICAgICB9CisgICAgICAgIC8vIHB1c2hlcyB0aGUgdHlwZSBvbiB0aGUgb3V0cHV0IHN0YWNrCisgICAgICAgIG91dHB1dFN0YWNrW291dHB1dFN0YWNrVG9wKytdID0gdHlwZTsKKyAgICAgICAgLy8gdXBkYXRlcyB0aGUgbWF4aW11biBoZWlnaHQgcmVhY2hlZCBieSB0aGUgb3V0cHV0IHN0YWNrLCBpZiBuZWVkZWQKKyAgICAgICAgaW50IHRvcCA9IG93bmVyLmlucHV0U3RhY2tUb3AgKyBvdXRwdXRTdGFja1RvcDsKKyAgICAgICAgaWYgKHRvcCA+IG93bmVyLm91dHB1dFN0YWNrTWF4KSB7CisgICAgICAgICAgICBvd25lci5vdXRwdXRTdGFja01heCA9IHRvcDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFB1c2hlcyBhIG5ldyB0eXBlIG9udG8gdGhlIG91dHB1dCBmcmFtZSBzdGFjay4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjdyB0aGUgQ2xhc3NXcml0ZXIgdG8gd2hpY2ggdGhpcyBsYWJlbCBiZWxvbmdzLgorICAgICAqIEBwYXJhbSBkZXNjIHRoZSBkZXNjcmlwdG9yIG9mIHRoZSB0eXBlIHRvIGJlIHB1c2hlZC4gQ2FuIGFsc28gYmUgYSBtZXRob2QKKyAgICAgKiAgICAgICAgZGVzY3JpcHRvciAoaW4gdGhpcyBjYXNlIHRoaXMgbWV0aG9kIHB1c2hlcyBpdHMgcmV0dXJuIHR5cGUgb250bworICAgICAqICAgICAgICB0aGUgb3V0cHV0IGZyYW1lIHN0YWNrKS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcHVzaChmaW5hbCBDbGFzc1dyaXRlciBjdywgZmluYWwgU3RyaW5nIGRlc2MpIHsKKyAgICAgICAgaW50IHR5cGUgPSB0eXBlKGN3LCBkZXNjKTsKKyAgICAgICAgaWYgKHR5cGUgIT0gMCkgeworICAgICAgICAgICAgcHVzaCh0eXBlKTsKKyAgICAgICAgICAgIGlmICh0eXBlID09IExPTkcgfHwgdHlwZSA9PSBET1VCTEUpIHsKKyAgICAgICAgICAgICAgICBwdXNoKFRPUCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBpbnQgZW5jb2Rpbmcgb2YgdGhlIGdpdmVuIHR5cGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY3cgdGhlIENsYXNzV3JpdGVyIHRvIHdoaWNoIHRoaXMgbGFiZWwgYmVsb25ncy4KKyAgICAgKiBAcGFyYW0gZGVzYyBhIHR5cGUgZGVzY3JpcHRvci4KKyAgICAgKiBAcmV0dXJuIHRoZSBpbnQgZW5jb2Rpbmcgb2YgdGhlIGdpdmVuIHR5cGUuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IHR5cGUoZmluYWwgQ2xhc3NXcml0ZXIgY3csIGZpbmFsIFN0cmluZyBkZXNjKSB7CisgICAgICAgIFN0cmluZyB0OworICAgICAgICBpbnQgaW5kZXggPSBkZXNjLmNoYXJBdCgwKSA9PSAnKCcgPyBkZXNjLmluZGV4T2YoJyknKSArIDEgOiAwOworICAgICAgICBzd2l0Y2ggKGRlc2MuY2hhckF0KGluZGV4KSkgeworICAgICAgICAgICAgY2FzZSAnVic6CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBjYXNlICdaJzoKKyAgICAgICAgICAgIGNhc2UgJ0MnOgorICAgICAgICAgICAgY2FzZSAnQic6CisgICAgICAgICAgICBjYXNlICdTJzoKKyAgICAgICAgICAgIGNhc2UgJ0knOgorICAgICAgICAgICAgICAgIHJldHVybiBJTlRFR0VSOworICAgICAgICAgICAgY2FzZSAnRic6CisgICAgICAgICAgICAgICAgcmV0dXJuIEZMT0FUOworICAgICAgICAgICAgY2FzZSAnSic6CisgICAgICAgICAgICAgICAgcmV0dXJuIExPTkc7CisgICAgICAgICAgICBjYXNlICdEJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gRE9VQkxFOworICAgICAgICAgICAgY2FzZSAnTCc6CisgICAgICAgICAgICAgICAgLy8gc3RvcmVzIHRoZSBpbnRlcm5hbCBuYW1lLCBub3QgdGhlIGRlc2NyaXB0b3IhCisgICAgICAgICAgICAgICAgdCA9IGRlc2Muc3Vic3RyaW5nKGluZGV4ICsgMSwgZGVzYy5sZW5ndGgoKSAtIDEpOworICAgICAgICAgICAgICAgIHJldHVybiBPQkpFQ1QgfCBjdy5hZGRUeXBlKHQpOworICAgICAgICAgICAgICAgIC8vIGNhc2UgJ1snOgorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAvLyBleHRyYWN0cyB0aGUgZGltZW5zaW9ucyBhbmQgdGhlIGVsZW1lbnQgdHlwZQorICAgICAgICAgICAgICAgIGludCBkYXRhOworICAgICAgICAgICAgICAgIGludCBkaW1zID0gaW5kZXggKyAxOworICAgICAgICAgICAgICAgIHdoaWxlIChkZXNjLmNoYXJBdChkaW1zKSA9PSAnWycpIHsKKyAgICAgICAgICAgICAgICAgICAgKytkaW1zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGRlc2MuY2hhckF0KGRpbXMpKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1onOgorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IEJPT0xFQU47CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnQyc6CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gQ0hBUjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlICdCJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBCWVRFOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1MnOgorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IFNIT1JUOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0knOgorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IElOVEVHRVI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnRic6CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gRkxPQVQ7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnSic6CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gTE9ORzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlICdEJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBET1VCTEU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgLy8gY2FzZSAnTCc6CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdG9yZXMgdGhlIGludGVybmFsIG5hbWUsIG5vdCB0aGUgZGVzY3JpcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgdCA9IGRlc2Muc3Vic3RyaW5nKGRpbXMgKyAxLCBkZXNjLmxlbmd0aCgpIC0gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gT0JKRUNUIHwgY3cuYWRkVHlwZSh0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIChkaW1zIC0gaW5kZXgpIDw8IDI4IHwgZGF0YTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFBvcHMgYSB0eXBlIGZyb20gdGhlIG91dHB1dCBmcmFtZSBzdGFjayBhbmQgcmV0dXJucyBpdHMgdmFsdWUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSB0eXBlIHRoYXQgaGFzIGJlZW4gcG9wcGVkIGZyb20gdGhlIG91dHB1dCBmcmFtZSBzdGFjay4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBwb3AoKSB7CisgICAgICAgIGlmIChvdXRwdXRTdGFja1RvcCA+IDApIHsKKyAgICAgICAgICAgIHJldHVybiBvdXRwdXRTdGFja1stLW91dHB1dFN0YWNrVG9wXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGlmIHRoZSBvdXRwdXQgZnJhbWUgc3RhY2sgaXMgZW1wdHksIHBvcHMgZnJvbSB0aGUgaW5wdXQgc3RhY2sKKyAgICAgICAgICAgIHJldHVybiBTVEFDSyB8IC0oLS1vd25lci5pbnB1dFN0YWNrVG9wKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFBvcHMgdGhlIGdpdmVuIG51bWJlciBvZiB0eXBlcyBmcm9tIHRoZSBvdXRwdXQgZnJhbWUgc3RhY2suCisgICAgICoKKyAgICAgKiBAcGFyYW0gZWxlbWVudHMgdGhlIG51bWJlciBvZiB0eXBlcyB0aGF0IG11c3QgYmUgcG9wcGVkLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwb3AoZmluYWwgaW50IGVsZW1lbnRzKSB7CisgICAgICAgIGlmIChvdXRwdXRTdGFja1RvcCA+PSBlbGVtZW50cykgeworICAgICAgICAgICAgb3V0cHV0U3RhY2tUb3AgLT0gZWxlbWVudHM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBpZiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIGJlIHBvcHBlZCBpcyBncmVhdGVyIHRoYW4gdGhlIG51bWJlcgorICAgICAgICAgICAgLy8gb2YgZWxlbWVudHMgaW4gdGhlIG91dHB1dCBzdGFjaywgY2xlYXIgaXQsIGFuZCBwb3BzIHRoZSByZW1haW5pbmcKKyAgICAgICAgICAgIC8vIGVsZW1lbnRzIGZyb20gdGhlIGlucHV0IHN0YWNrLgorICAgICAgICAgICAgb3duZXIuaW5wdXRTdGFja1RvcCAtPSBlbGVtZW50cyAtIG91dHB1dFN0YWNrVG9wOworICAgICAgICAgICAgb3V0cHV0U3RhY2tUb3AgPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUG9wcyBhIHR5cGUgZnJvbSB0aGUgb3V0cHV0IGZyYW1lIHN0YWNrLgorICAgICAqCisgICAgICogQHBhcmFtIGRlc2MgdGhlIGRlc2NyaXB0b3Igb2YgdGhlIHR5cGUgdG8gYmUgcG9wcGVkLiBDYW4gYWxzbyBiZSBhIG1ldGhvZAorICAgICAqICAgICAgICBkZXNjcmlwdG9yIChpbiB0aGlzIGNhc2UgdGhpcyBtZXRob2QgcG9wcyB0aGUgdHlwZXMgY29ycmVzcG9uZGluZworICAgICAqICAgICAgICB0byB0aGUgbWV0aG9kIGFyZ3VtZW50cykuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHBvcChmaW5hbCBTdHJpbmcgZGVzYykgeworICAgICAgICBjaGFyIGMgPSBkZXNjLmNoYXJBdCgwKTsKKyAgICAgICAgaWYgKGMgPT0gJygnKSB7CisgICAgICAgICAgICBwb3AoKFR5cGUuZ2V0QXJndW1lbnRzQW5kUmV0dXJuU2l6ZXMoZGVzYykgPj4gMikgLSAxKTsKKyAgICAgICAgfSBlbHNlIGlmIChjID09ICdKJyB8fCBjID09ICdEJykgeworICAgICAgICAgICAgcG9wKDIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcG9wKDEpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIG5ldyB0eXBlIHRvIHRoZSBsaXN0IG9mIHR5cGVzIG9uIHdoaWNoIGEgY29uc3RydWN0b3IgaXMgaW52b2tlZCBpbgorICAgICAqIHRoZSBiYXNpYyBibG9jay4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YXIgYSB0eXBlIG9uIGEgd2hpY2ggYSBjb25zdHJ1Y3RvciBpcyBpbnZva2VkLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBpbml0KGZpbmFsIGludCB2YXIpIHsKKyAgICAgICAgLy8gY3JlYXRlcyBhbmQvb3IgcmVzaXplcyB0aGUgaW5pdGlhbGl6YXRpb25zIGFycmF5IGlmIG5lY2Vzc2FyeQorICAgICAgICBpZiAoaW5pdGlhbGl6YXRpb25zID09IG51bGwpIHsKKyAgICAgICAgICAgIGluaXRpYWxpemF0aW9ucyA9IG5ldyBpbnRbMl07CisgICAgICAgIH0KKyAgICAgICAgaW50IG4gPSBpbml0aWFsaXphdGlvbnMubGVuZ3RoOworICAgICAgICBpZiAoaW5pdGlhbGl6YXRpb25Db3VudCA+PSBuKSB7CisgICAgICAgICAgICBpbnRbXSB0ID0gbmV3IGludFtNYXRoLm1heChpbml0aWFsaXphdGlvbkNvdW50ICsgMSwgMiAqIG4pXTsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoaW5pdGlhbGl6YXRpb25zLCAwLCB0LCAwLCBuKTsKKyAgICAgICAgICAgIGluaXRpYWxpemF0aW9ucyA9IHQ7CisgICAgICAgIH0KKyAgICAgICAgLy8gc3RvcmVzIHRoZSB0eXBlIHRvIGJlIGluaXRpYWxpemVkCisgICAgICAgIGluaXRpYWxpemF0aW9uc1tpbml0aWFsaXphdGlvbkNvdW50KytdID0gdmFyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcGxhY2VzIHRoZSBnaXZlbiB0eXBlIHdpdGggdGhlIGFwcHJvcHJpYXRlIHR5cGUgaWYgaXQgaXMgb25lIG9mIHRoZQorICAgICAqIHR5cGVzIG9uIHdoaWNoIGEgY29uc3RydWN0b3IgaXMgaW52b2tlZCBpbiB0aGUgYmFzaWMgYmxvY2suCisgICAgICoKKyAgICAgKiBAcGFyYW0gY3cgdGhlIENsYXNzV3JpdGVyIHRvIHdoaWNoIHRoaXMgbGFiZWwgYmVsb25ncy4KKyAgICAgKiBAcGFyYW0gdCBhIHR5cGUKKyAgICAgKiBAcmV0dXJuIHQgb3IsIGlmIHQgaXMgb25lIG9mIHRoZSB0eXBlcyBvbiB3aGljaCBhIGNvbnN0cnVjdG9yIGlzIGludm9rZWQKKyAgICAgKiAgICAgICAgIGluIHRoZSBiYXNpYyBibG9jaywgdGhlIHR5cGUgY29ycmVzcG9uZGluZyB0byB0aGlzIGNvbnN0cnVjdG9yLgorICAgICAqLworICAgIHByaXZhdGUgaW50IGluaXQoZmluYWwgQ2xhc3NXcml0ZXIgY3csIGZpbmFsIGludCB0KSB7CisgICAgICAgIGludCBzOworICAgICAgICBpZiAodCA9PSBVTklOSVRJQUxJWkVEX1RISVMpIHsKKyAgICAgICAgICAgIHMgPSBPQkpFQ1QgfCBjdy5hZGRUeXBlKGN3LnRoaXNOYW1lKTsKKyAgICAgICAgfSBlbHNlIGlmICgodCAmIChESU0gfCBCQVNFX0tJTkQpKSA9PSBVTklOSVRJQUxJWkVEKSB7CisgICAgICAgICAgICBTdHJpbmcgdHlwZSA9IGN3LnR5cGVUYWJsZVt0ICYgQkFTRV9WQUxVRV0uc3RyVmFsMTsKKyAgICAgICAgICAgIHMgPSBPQkpFQ1QgfCBjdy5hZGRUeXBlKHR5cGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHQ7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBpbml0aWFsaXphdGlvbkNvdW50OyArK2opIHsKKyAgICAgICAgICAgIGludCB1ID0gaW5pdGlhbGl6YXRpb25zW2pdOworICAgICAgICAgICAgaW50IGRpbSA9IHUgJiBESU07CisgICAgICAgICAgICBpbnQga2luZCA9IHUgJiBLSU5EOworICAgICAgICAgICAgaWYgKGtpbmQgPT0gTE9DQUwpIHsKKyAgICAgICAgICAgICAgICB1ID0gZGltICsgaW5wdXRMb2NhbHNbdSAmIFZBTFVFXTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoa2luZCA9PSBTVEFDSykgeworICAgICAgICAgICAgICAgIHUgPSBkaW0gKyBpbnB1dFN0YWNrW2lucHV0U3RhY2subGVuZ3RoIC0gKHUgJiBWQUxVRSldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHQgPT0gdSkgeworICAgICAgICAgICAgICAgIHJldHVybiBzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemVzIHRoZSBpbnB1dCBmcmFtZSBvZiB0aGUgZmlyc3QgYmFzaWMgYmxvY2sgZnJvbSB0aGUgbWV0aG9kCisgICAgICogZGVzY3JpcHRvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjdyB0aGUgQ2xhc3NXcml0ZXIgdG8gd2hpY2ggdGhpcyBsYWJlbCBiZWxvbmdzLgorICAgICAqIEBwYXJhbSBhY2Nlc3MgdGhlIGFjY2VzcyBmbGFncyBvZiB0aGUgbWV0aG9kIHRvIHdoaWNoIHRoaXMgbGFiZWwgYmVsb25ncy4KKyAgICAgKiBAcGFyYW0gYXJncyB0aGUgZm9ybWFsIHBhcmFtZXRlciB0eXBlcyBvZiB0aGlzIG1ldGhvZC4KKyAgICAgKiBAcGFyYW0gbWF4TG9jYWxzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBsb2NhbCB2YXJpYWJsZXMgb2YgdGhpcyBtZXRob2QuCisgICAgICovCisgICAgdm9pZCBpbml0SW5wdXRGcmFtZSgKKyAgICAgICAgZmluYWwgQ2xhc3NXcml0ZXIgY3csCisgICAgICAgIGZpbmFsIGludCBhY2Nlc3MsCisgICAgICAgIGZpbmFsIFR5cGVbXSBhcmdzLAorICAgICAgICBmaW5hbCBpbnQgbWF4TG9jYWxzKQorICAgIHsKKyAgICAgICAgaW5wdXRMb2NhbHMgPSBuZXcgaW50W21heExvY2Fsc107CisgICAgICAgIGlucHV0U3RhY2sgPSBuZXcgaW50WzBdOworICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgIGlmICgoYWNjZXNzICYgT3Bjb2Rlcy5BQ0NfU1RBVElDKSA9PSAwKSB7CisgICAgICAgICAgICBpZiAoKGFjY2VzcyAmIE1ldGhvZFdyaXRlci5BQ0NfQ09OU1RSVUNUT1IpID09IDApIHsKKyAgICAgICAgICAgICAgICBpbnB1dExvY2Fsc1tpKytdID0gT0JKRUNUIHwgY3cuYWRkVHlwZShjdy50aGlzTmFtZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlucHV0TG9jYWxzW2krK10gPSBVTklOSVRJQUxJWkVEX1RISVM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBhcmdzLmxlbmd0aDsgKytqKSB7CisgICAgICAgICAgICBpbnQgdCA9IHR5cGUoY3csIGFyZ3Nbal0uZ2V0RGVzY3JpcHRvcigpKTsKKyAgICAgICAgICAgIGlucHV0TG9jYWxzW2krK10gPSB0OworICAgICAgICAgICAgaWYgKHQgPT0gTE9ORyB8fCB0ID09IERPVUJMRSkgeworICAgICAgICAgICAgICAgIGlucHV0TG9jYWxzW2krK10gPSBUT1A7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKGkgPCBtYXhMb2NhbHMpIHsKKyAgICAgICAgICAgIGlucHV0TG9jYWxzW2krK10gPSBUT1A7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTaW11bGF0ZXMgdGhlIGFjdGlvbiBvZiB0aGUgZ2l2ZW4gaW5zdHJ1Y3Rpb24gb24gdGhlIG91dHB1dCBzdGFjayBmcmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvcGNvZGUgdGhlIG9wY29kZSBvZiB0aGUgaW5zdHJ1Y3Rpb24uCisgICAgICogQHBhcmFtIGFyZyB0aGUgb3BlcmFuZCBvZiB0aGUgaW5zdHJ1Y3Rpb24sIGlmIGFueS4KKyAgICAgKiBAcGFyYW0gY3cgdGhlIGNsYXNzIHdyaXRlciB0byB3aGljaCB0aGlzIGxhYmVsIGJlbG9uZ3MuCisgICAgICogQHBhcmFtIGl0ZW0gdGhlIG9wZXJhbmQgb2YgdGhlIGluc3RydWN0aW9ucywgaWYgYW55LgorICAgICAqLworICAgIHZvaWQgZXhlY3V0ZSgKKyAgICAgICAgZmluYWwgaW50IG9wY29kZSwKKyAgICAgICAgZmluYWwgaW50IGFyZywKKyAgICAgICAgZmluYWwgQ2xhc3NXcml0ZXIgY3csCisgICAgICAgIGZpbmFsIEl0ZW0gaXRlbSkKKyAgICB7CisgICAgICAgIGludCB0MSwgdDIsIHQzLCB0NDsKKyAgICAgICAgc3dpdGNoIChvcGNvZGUpIHsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5OT1A6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSU5FRzoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5MTkVHOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkZORUc6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRE5FRzoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JMkI6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSTJDOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkkyUzoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5HT1RPOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLlJFVFVSTjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5BQ09OU1RfTlVMTDoKKyAgICAgICAgICAgICAgICBwdXNoKE5VTEwpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLklDT05TVF9NMToKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JQ09OU1RfMDoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JQ09OU1RfMToKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JQ09OU1RfMjoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JQ09OU1RfMzoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JQ09OU1RfNDoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JQ09OU1RfNToKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5CSVBVU0g6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuU0lQVVNIOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLklMT0FEOgorICAgICAgICAgICAgICAgIHB1c2goSU5URUdFUik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuTENPTlNUXzA6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuTENPTlNUXzE6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuTExPQUQ6CisgICAgICAgICAgICAgICAgcHVzaChMT05HKTsKKyAgICAgICAgICAgICAgICBwdXNoKFRPUCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRkNPTlNUXzA6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRkNPTlNUXzE6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRkNPTlNUXzI6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRkxPQUQ6CisgICAgICAgICAgICAgICAgcHVzaChGTE9BVCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRENPTlNUXzA6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRENPTlNUXzE6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRExPQUQ6CisgICAgICAgICAgICAgICAgcHVzaChET1VCTEUpOworICAgICAgICAgICAgICAgIHB1c2goVE9QKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5MREM6CisgICAgICAgICAgICAgICAgc3dpdGNoIChpdGVtLnR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5JTlQ6CisgICAgICAgICAgICAgICAgICAgICAgICBwdXNoKElOVEVHRVIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuTE9ORzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1c2goTE9ORyk7CisgICAgICAgICAgICAgICAgICAgICAgICBwdXNoKFRPUCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5GTE9BVDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1c2goRkxPQVQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuRE9VQkxFOgorICAgICAgICAgICAgICAgICAgICAgICAgcHVzaChET1VCTEUpOworICAgICAgICAgICAgICAgICAgICAgICAgcHVzaChUT1ApOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuQ0xBU1M6CisgICAgICAgICAgICAgICAgICAgICAgICBwdXNoKE9CSkVDVCB8IGN3LmFkZFR5cGUoImphdmEvbGFuZy9DbGFzcyIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLlNUUjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1c2goT0JKRUNUIHwgY3cuYWRkVHlwZSgiamF2YS9sYW5nL1N0cmluZyIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLk1UWVBFOgorICAgICAgICAgICAgICAgICAgICAgICAgcHVzaChPQkpFQ1QgfCBjdy5hZGRUeXBlKCJqYXZhL2xhbmcvaW52b2tlL01ldGhvZFR5cGUiKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgLy8gY2FzZSBDbGFzc1dyaXRlci5IQU5ETEVfQkFTRSArIFsxLi45XToKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1c2goT0JKRUNUIHwgY3cuYWRkVHlwZSgiamF2YS9sYW5nL2ludm9rZS9NZXRob2RIYW5kbGUiKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkFMT0FEOgorICAgICAgICAgICAgICAgIHB1c2goZ2V0KGFyZykpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLklBTE9BRDoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5CQUxPQUQ6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuQ0FMT0FEOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLlNBTE9BRDoKKyAgICAgICAgICAgICAgICBwb3AoMik7CisgICAgICAgICAgICAgICAgcHVzaChJTlRFR0VSKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5MQUxPQUQ6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRDJMOgorICAgICAgICAgICAgICAgIHBvcCgyKTsKKyAgICAgICAgICAgICAgICBwdXNoKExPTkcpOworICAgICAgICAgICAgICAgIHB1c2goVE9QKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5GQUxPQUQ6CisgICAgICAgICAgICAgICAgcG9wKDIpOworICAgICAgICAgICAgICAgIHB1c2goRkxPQVQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkRBTE9BRDoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5MMkQ6CisgICAgICAgICAgICAgICAgcG9wKDIpOworICAgICAgICAgICAgICAgIHB1c2goRE9VQkxFKTsKKyAgICAgICAgICAgICAgICBwdXNoKFRPUCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuQUFMT0FEOgorICAgICAgICAgICAgICAgIHBvcCgxKTsKKyAgICAgICAgICAgICAgICB0MSA9IHBvcCgpOworICAgICAgICAgICAgICAgIHB1c2goRUxFTUVOVF9PRiArIHQxKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JU1RPUkU6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRlNUT1JFOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkFTVE9SRToKKyAgICAgICAgICAgICAgICB0MSA9IHBvcCgpOworICAgICAgICAgICAgICAgIHNldChhcmcsIHQxKTsKKyAgICAgICAgICAgICAgICBpZiAoYXJnID4gMCkgeworICAgICAgICAgICAgICAgICAgICB0MiA9IGdldChhcmcgLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgdDIgaXMgb2Yga2luZCBTVEFDSyBvciBMT0NBTCB3ZSBjYW5ub3Qga25vdyBpdHMgc2l6ZSEKKyAgICAgICAgICAgICAgICAgICAgaWYgKHQyID09IExPTkcgfHwgdDIgPT0gRE9VQkxFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXQoYXJnIC0gMSwgVE9QKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodDIgJiBLSU5EKSAhPSBCQVNFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXQoYXJnIC0gMSwgdDIgfCBUT1BfSUZfTE9OR19PUl9ET1VCTEUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkxTVE9SRToKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5EU1RPUkU6CisgICAgICAgICAgICAgICAgcG9wKDEpOworICAgICAgICAgICAgICAgIHQxID0gcG9wKCk7CisgICAgICAgICAgICAgICAgc2V0KGFyZywgdDEpOworICAgICAgICAgICAgICAgIHNldChhcmcgKyAxLCBUT1ApOworICAgICAgICAgICAgICAgIGlmIChhcmcgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIHQyID0gZ2V0KGFyZyAtIDEpOworICAgICAgICAgICAgICAgICAgICAvLyBpZiB0MiBpcyBvZiBraW5kIFNUQUNLIG9yIExPQ0FMIHdlIGNhbm5vdCBrbm93IGl0cyBzaXplIQorICAgICAgICAgICAgICAgICAgICBpZiAodDIgPT0gTE9ORyB8fCB0MiA9PSBET1VCTEUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldChhcmcgLSAxLCBUT1ApOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCh0MiAmIEtJTkQpICE9IEJBU0UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldChhcmcgLSAxLCB0MiB8IFRPUF9JRl9MT05HX09SX0RPVUJMRSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSUFTVE9SRToKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5CQVNUT1JFOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkNBU1RPUkU6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuU0FTVE9SRToKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5GQVNUT1JFOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkFBU1RPUkU6CisgICAgICAgICAgICAgICAgcG9wKDMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkxBU1RPUkU6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuREFTVE9SRToKKyAgICAgICAgICAgICAgICBwb3AoNCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuUE9QOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLklGRVE6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSUZORToKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JRkxUOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLklGR0U6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSUZHVDoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JRkxFOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLklSRVRVUk46CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRlJFVFVSTjoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5BUkVUVVJOOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLlRBQkxFU1dJVENIOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkxPT0tVUFNXSVRDSDoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5BVEhST1c6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuTU9OSVRPUkVOVEVSOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLk1PTklUT1JFWElUOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLklGTlVMTDoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JRk5PTk5VTEw6CisgICAgICAgICAgICAgICAgcG9wKDEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLlBPUDI6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSUZfSUNNUEVROgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLklGX0lDTVBORToKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JRl9JQ01QTFQ6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSUZfSUNNUEdFOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLklGX0lDTVBHVDoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JRl9JQ01QTEU6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSUZfQUNNUEVROgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLklGX0FDTVBORToKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5MUkVUVVJOOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkRSRVRVUk46CisgICAgICAgICAgICAgICAgcG9wKDIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkRVUDoKKyAgICAgICAgICAgICAgICB0MSA9IHBvcCgpOworICAgICAgICAgICAgICAgIHB1c2godDEpOworICAgICAgICAgICAgICAgIHB1c2godDEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkRVUF9YMToKKyAgICAgICAgICAgICAgICB0MSA9IHBvcCgpOworICAgICAgICAgICAgICAgIHQyID0gcG9wKCk7CisgICAgICAgICAgICAgICAgcHVzaCh0MSk7CisgICAgICAgICAgICAgICAgcHVzaCh0Mik7CisgICAgICAgICAgICAgICAgcHVzaCh0MSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRFVQX1gyOgorICAgICAgICAgICAgICAgIHQxID0gcG9wKCk7CisgICAgICAgICAgICAgICAgdDIgPSBwb3AoKTsKKyAgICAgICAgICAgICAgICB0MyA9IHBvcCgpOworICAgICAgICAgICAgICAgIHB1c2godDEpOworICAgICAgICAgICAgICAgIHB1c2godDMpOworICAgICAgICAgICAgICAgIHB1c2godDIpOworICAgICAgICAgICAgICAgIHB1c2godDEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkRVUDI6CisgICAgICAgICAgICAgICAgdDEgPSBwb3AoKTsKKyAgICAgICAgICAgICAgICB0MiA9IHBvcCgpOworICAgICAgICAgICAgICAgIHB1c2godDIpOworICAgICAgICAgICAgICAgIHB1c2godDEpOworICAgICAgICAgICAgICAgIHB1c2godDIpOworICAgICAgICAgICAgICAgIHB1c2godDEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkRVUDJfWDE6CisgICAgICAgICAgICAgICAgdDEgPSBwb3AoKTsKKyAgICAgICAgICAgICAgICB0MiA9IHBvcCgpOworICAgICAgICAgICAgICAgIHQzID0gcG9wKCk7CisgICAgICAgICAgICAgICAgcHVzaCh0Mik7CisgICAgICAgICAgICAgICAgcHVzaCh0MSk7CisgICAgICAgICAgICAgICAgcHVzaCh0Myk7CisgICAgICAgICAgICAgICAgcHVzaCh0Mik7CisgICAgICAgICAgICAgICAgcHVzaCh0MSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRFVQMl9YMjoKKyAgICAgICAgICAgICAgICB0MSA9IHBvcCgpOworICAgICAgICAgICAgICAgIHQyID0gcG9wKCk7CisgICAgICAgICAgICAgICAgdDMgPSBwb3AoKTsKKyAgICAgICAgICAgICAgICB0NCA9IHBvcCgpOworICAgICAgICAgICAgICAgIHB1c2godDIpOworICAgICAgICAgICAgICAgIHB1c2godDEpOworICAgICAgICAgICAgICAgIHB1c2godDQpOworICAgICAgICAgICAgICAgIHB1c2godDMpOworICAgICAgICAgICAgICAgIHB1c2godDIpOworICAgICAgICAgICAgICAgIHB1c2godDEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLlNXQVA6CisgICAgICAgICAgICAgICAgdDEgPSBwb3AoKTsKKyAgICAgICAgICAgICAgICB0MiA9IHBvcCgpOworICAgICAgICAgICAgICAgIHB1c2godDEpOworICAgICAgICAgICAgICAgIHB1c2godDIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLklBREQ6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSVNVQjoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JTVVMOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLklESVY6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSVJFTToKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JQU5EOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLklPUjoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JWE9SOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLklTSEw6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSVNIUjoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JVVNIUjoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5MMkk6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRDJJOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkZDTVBMOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkZDTVBHOgorICAgICAgICAgICAgICAgIHBvcCgyKTsKKyAgICAgICAgICAgICAgICBwdXNoKElOVEVHRVIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkxBREQ6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuTFNVQjoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5MTVVMOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkxESVY6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuTFJFTToKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5MQU5EOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkxPUjoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5MWE9SOgorICAgICAgICAgICAgICAgIHBvcCg0KTsKKyAgICAgICAgICAgICAgICBwdXNoKExPTkcpOworICAgICAgICAgICAgICAgIHB1c2goVE9QKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5GQUREOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkZTVUI6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRk1VTDoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5GRElWOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkZSRU06CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuTDJGOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkQyRjoKKyAgICAgICAgICAgICAgICBwb3AoMik7CisgICAgICAgICAgICAgICAgcHVzaChGTE9BVCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuREFERDoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5EU1VCOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkRNVUw6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRERJVjoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5EUkVNOgorICAgICAgICAgICAgICAgIHBvcCg0KTsKKyAgICAgICAgICAgICAgICBwdXNoKERPVUJMRSk7CisgICAgICAgICAgICAgICAgcHVzaChUT1ApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkxTSEw6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuTFNIUjoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5MVVNIUjoKKyAgICAgICAgICAgICAgICBwb3AoMyk7CisgICAgICAgICAgICAgICAgcHVzaChMT05HKTsKKyAgICAgICAgICAgICAgICBwdXNoKFRPUCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSUlOQzoKKyAgICAgICAgICAgICAgICBzZXQoYXJnLCBJTlRFR0VSKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JMkw6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRjJMOgorICAgICAgICAgICAgICAgIHBvcCgxKTsKKyAgICAgICAgICAgICAgICBwdXNoKExPTkcpOworICAgICAgICAgICAgICAgIHB1c2goVE9QKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JMkY6CisgICAgICAgICAgICAgICAgcG9wKDEpOworICAgICAgICAgICAgICAgIHB1c2goRkxPQVQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkkyRDoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5GMkQ6CisgICAgICAgICAgICAgICAgcG9wKDEpOworICAgICAgICAgICAgICAgIHB1c2goRE9VQkxFKTsKKyAgICAgICAgICAgICAgICBwdXNoKFRPUCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRjJJOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkFSUkFZTEVOR1RIOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLklOU1RBTkNFT0Y6CisgICAgICAgICAgICAgICAgcG9wKDEpOworICAgICAgICAgICAgICAgIHB1c2goSU5URUdFUik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuTENNUDoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5EQ01QTDoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5EQ01QRzoKKyAgICAgICAgICAgICAgICBwb3AoNCk7CisgICAgICAgICAgICAgICAgcHVzaChJTlRFR0VSKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5KU1I6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuUkVUOgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJKU1IvUkVUIGFyZSBub3Qgc3VwcG9ydGVkIHdpdGggY29tcHV0ZUZyYW1lcyBvcHRpb24iKTsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5HRVRTVEFUSUM6CisgICAgICAgICAgICAgICAgcHVzaChjdywgaXRlbS5zdHJWYWwzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5QVVRTVEFUSUM6CisgICAgICAgICAgICAgICAgcG9wKGl0ZW0uc3RyVmFsMyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuR0VURklFTEQ6CisgICAgICAgICAgICAgICAgcG9wKDEpOworICAgICAgICAgICAgICAgIHB1c2goY3csIGl0ZW0uc3RyVmFsMyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuUFVURklFTEQ6CisgICAgICAgICAgICAgICAgcG9wKGl0ZW0uc3RyVmFsMyk7CisgICAgICAgICAgICAgICAgcG9wKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSU5WT0tFVklSVFVBTDoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JTlZPS0VTUEVDSUFMOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLklOVk9LRVNUQVRJQzoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JTlZPS0VJTlRFUkZBQ0U6CisgICAgICAgICAgICAgICAgcG9wKGl0ZW0uc3RyVmFsMyk7CisgICAgICAgICAgICAgICAgaWYgKG9wY29kZSAhPSBPcGNvZGVzLklOVk9LRVNUQVRJQykgeworICAgICAgICAgICAgICAgICAgICB0MSA9IHBvcCgpOworICAgICAgICAgICAgICAgICAgICBpZiAob3Bjb2RlID09IE9wY29kZXMuSU5WT0tFU1BFQ0lBTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGl0ZW0uc3RyVmFsMi5jaGFyQXQoMCkgPT0gJzwnKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbml0KHQxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwdXNoKGN3LCBpdGVtLnN0clZhbDMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLklOVk9LRURZTkFNSUM6CisgICAgICAgICAgICAgICAgcG9wKGl0ZW0uc3RyVmFsMik7CisgICAgICAgICAgICAgICAgcHVzaChjdywgaXRlbS5zdHJWYWwyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5ORVc6CisgICAgICAgICAgICAgICAgcHVzaChVTklOSVRJQUxJWkVEIHwgY3cuYWRkVW5pbml0aWFsaXplZFR5cGUoaXRlbS5zdHJWYWwxLCBhcmcpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5ORVdBUlJBWToKKyAgICAgICAgICAgICAgICBwb3AoKTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFyZykgeworICAgICAgICAgICAgICAgICAgICBjYXNlIE9wY29kZXMuVF9CT09MRUFOOgorICAgICAgICAgICAgICAgICAgICAgICAgcHVzaChBUlJBWV9PRiB8IEJPT0xFQU4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5UX0NIQVI6CisgICAgICAgICAgICAgICAgICAgICAgICBwdXNoKEFSUkFZX09GIHwgQ0hBUik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBPcGNvZGVzLlRfQllURToKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1c2goQVJSQVlfT0YgfCBCWVRFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIE9wY29kZXMuVF9TSE9SVDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1c2goQVJSQVlfT0YgfCBTSE9SVCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBPcGNvZGVzLlRfSU5UOgorICAgICAgICAgICAgICAgICAgICAgICAgcHVzaChBUlJBWV9PRiB8IElOVEVHRVIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5UX0ZMT0FUOgorICAgICAgICAgICAgICAgICAgICAgICAgcHVzaChBUlJBWV9PRiB8IEZMT0FUKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIE9wY29kZXMuVF9ET1VCTEU6CisgICAgICAgICAgICAgICAgICAgICAgICBwdXNoKEFSUkFZX09GIHwgRE9VQkxFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAvLyBjYXNlIE9wY29kZXMuVF9MT05HOgorICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgcHVzaChBUlJBWV9PRiB8IExPTkcpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkFORVdBUlJBWToKKyAgICAgICAgICAgICAgICBTdHJpbmcgcyA9IGl0ZW0uc3RyVmFsMTsKKyAgICAgICAgICAgICAgICBwb3AoKTsKKyAgICAgICAgICAgICAgICBpZiAocy5jaGFyQXQoMCkgPT0gJ1snKSB7CisgICAgICAgICAgICAgICAgICAgIHB1c2goY3csICdbJyArIHMpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHB1c2goQVJSQVlfT0YgfCBPQkpFQ1QgfCBjdy5hZGRUeXBlKHMpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuQ0hFQ0tDQVNUOgorICAgICAgICAgICAgICAgIHMgPSBpdGVtLnN0clZhbDE7CisgICAgICAgICAgICAgICAgcG9wKCk7CisgICAgICAgICAgICAgICAgaWYgKHMuY2hhckF0KDApID09ICdbJykgeworICAgICAgICAgICAgICAgICAgICBwdXNoKGN3LCBzKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBwdXNoKE9CSkVDVCB8IGN3LmFkZFR5cGUocykpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIC8vIGNhc2UgT3Bjb2Rlcy5NVUxUSUFORVdBUlJBWToKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcG9wKGFyZyk7CisgICAgICAgICAgICAgICAgcHVzaChjdywgaXRlbS5zdHJWYWwxKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIE1lcmdlcyB0aGUgaW5wdXQgZnJhbWUgb2YgdGhlIGdpdmVuIGJhc2ljIGJsb2NrIHdpdGggdGhlIGlucHV0IGFuZCBvdXRwdXQKKyAgICAgKiBmcmFtZXMgb2YgdGhpcyBiYXNpYyBibG9jay4gUmV0dXJucyA8dHQ+dHJ1ZTwvdHQ+IGlmIHRoZSBpbnB1dCBmcmFtZSBvZgorICAgICAqIHRoZSBnaXZlbiBsYWJlbCBoYXMgYmVlbiBjaGFuZ2VkIGJ5IHRoaXMgb3BlcmF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGN3IHRoZSBDbGFzc1dyaXRlciB0byB3aGljaCB0aGlzIGxhYmVsIGJlbG9uZ3MuCisgICAgICogQHBhcmFtIGZyYW1lIHRoZSBiYXNpYyBibG9jayB3aG9zZSBpbnB1dCBmcmFtZSBtdXN0IGJlIHVwZGF0ZWQuCisgICAgICogQHBhcmFtIGVkZ2UgdGhlIGtpbmQgb2YgdGhlIHtAbGluayBFZGdlfSBiZXR3ZWVuIHRoaXMgbGFiZWwgYW5kICdsYWJlbCcuCisgICAgICogICAgICAgIFNlZSB7QGxpbmsgRWRnZSNpbmZvfS4KKyAgICAgKiBAcmV0dXJuIDx0dD50cnVlPC90dD4gaWYgdGhlIGlucHV0IGZyYW1lIG9mIHRoZSBnaXZlbiBsYWJlbCBoYXMgYmVlbgorICAgICAqICAgICAgICAgY2hhbmdlZCBieSB0aGlzIG9wZXJhdGlvbi4KKyAgICAgKi8KKyAgICBib29sZWFuIG1lcmdlKGZpbmFsIENsYXNzV3JpdGVyIGN3LCBmaW5hbCBGcmFtZSBmcmFtZSwgZmluYWwgaW50IGVkZ2UpIHsKKyAgICAgICAgYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7CisgICAgICAgIGludCBpLCBzLCBkaW0sIGtpbmQsIHQ7CisKKyAgICAgICAgaW50IG5Mb2NhbCA9IGlucHV0TG9jYWxzLmxlbmd0aDsKKyAgICAgICAgaW50IG5TdGFjayA9IGlucHV0U3RhY2subGVuZ3RoOworICAgICAgICBpZiAoZnJhbWUuaW5wdXRMb2NhbHMgPT0gbnVsbCkgeworICAgICAgICAgICAgZnJhbWUuaW5wdXRMb2NhbHMgPSBuZXcgaW50W25Mb2NhbF07CisgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuTG9jYWw7ICsraSkgeworICAgICAgICAgICAgaWYgKG91dHB1dExvY2FscyAhPSBudWxsICYmIGkgPCBvdXRwdXRMb2NhbHMubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgcyA9IG91dHB1dExvY2Fsc1tpXTsKKyAgICAgICAgICAgICAgICBpZiAocyA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHQgPSBpbnB1dExvY2Fsc1tpXTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBkaW0gPSBzICYgRElNOworICAgICAgICAgICAgICAgICAgICBraW5kID0gcyAmIEtJTkQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChraW5kID09IEJBU0UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBzOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPT0gTE9DQUwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gZGltICsgaW5wdXRMb2NhbHNbcyAmIFZBTFVFXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IGRpbSArIGlucHV0U3RhY2tbblN0YWNrIC0gKHMgJiBWQUxVRSldOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzICYgVE9QX0lGX0xPTkdfT1JfRE9VQkxFKSAhPSAwICYmICh0ID09IExPTkcgfHwgdCA9PSBET1VCTEUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IFRPUDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdCA9IGlucHV0TG9jYWxzW2ldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGluaXRpYWxpemF0aW9ucyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdCA9IGluaXQoY3csIHQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2hhbmdlZCB8PSBtZXJnZShjdywgdCwgZnJhbWUuaW5wdXRMb2NhbHMsIGkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGVkZ2UgPiAwKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbkxvY2FsOyArK2kpIHsKKyAgICAgICAgICAgICAgICB0ID0gaW5wdXRMb2NhbHNbaV07CisgICAgICAgICAgICAgICAgY2hhbmdlZCB8PSBtZXJnZShjdywgdCwgZnJhbWUuaW5wdXRMb2NhbHMsIGkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZyYW1lLmlucHV0U3RhY2sgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZyYW1lLmlucHV0U3RhY2sgPSBuZXcgaW50WzFdOworICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2hhbmdlZCB8PSBtZXJnZShjdywgZWRnZSwgZnJhbWUuaW5wdXRTdGFjaywgMCk7CisgICAgICAgICAgICByZXR1cm4gY2hhbmdlZDsKKyAgICAgICAgfQorCisgICAgICAgIGludCBuSW5wdXRTdGFjayA9IGlucHV0U3RhY2subGVuZ3RoICsgb3duZXIuaW5wdXRTdGFja1RvcDsKKyAgICAgICAgaWYgKGZyYW1lLmlucHV0U3RhY2sgPT0gbnVsbCkgeworICAgICAgICAgICAgZnJhbWUuaW5wdXRTdGFjayA9IG5ldyBpbnRbbklucHV0U3RhY2sgKyBvdXRwdXRTdGFja1RvcF07CisgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuSW5wdXRTdGFjazsgKytpKSB7CisgICAgICAgICAgICB0ID0gaW5wdXRTdGFja1tpXTsKKyAgICAgICAgICAgIGlmIChpbml0aWFsaXphdGlvbnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHQgPSBpbml0KGN3LCB0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNoYW5nZWQgfD0gbWVyZ2UoY3csIHQsIGZyYW1lLmlucHV0U3RhY2ssIGkpOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBvdXRwdXRTdGFja1RvcDsgKytpKSB7CisgICAgICAgICAgICBzID0gb3V0cHV0U3RhY2tbaV07CisgICAgICAgICAgICBkaW0gPSBzICYgRElNOworICAgICAgICAgICAga2luZCA9IHMgJiBLSU5EOworICAgICAgICAgICAgaWYgKGtpbmQgPT0gQkFTRSkgeworICAgICAgICAgICAgICAgIHQgPSBzOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoa2luZCA9PSBMT0NBTCkgeworICAgICAgICAgICAgICAgICAgICB0ID0gZGltICsgaW5wdXRMb2NhbHNbcyAmIFZBTFVFXTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0ID0gZGltICsgaW5wdXRTdGFja1tuU3RhY2sgLSAocyAmIFZBTFVFKV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgocyAmIFRPUF9JRl9MT05HX09SX0RPVUJMRSkgIT0gMCAmJiAodCA9PSBMT05HIHx8IHQgPT0gRE9VQkxFKSkgeworICAgICAgICAgICAgICAgICAgICB0ID0gVE9QOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpbml0aWFsaXphdGlvbnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHQgPSBpbml0KGN3LCB0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNoYW5nZWQgfD0gbWVyZ2UoY3csIHQsIGZyYW1lLmlucHV0U3RhY2ssIG5JbnB1dFN0YWNrICsgaSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNoYW5nZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWVyZ2VzIHRoZSB0eXBlIGF0IHRoZSBnaXZlbiBpbmRleCBpbiB0aGUgZ2l2ZW4gdHlwZSBhcnJheSB3aXRoIHRoZSBnaXZlbgorICAgICAqIHR5cGUuIFJldHVybnMgPHR0PnRydWU8L3R0PiBpZiB0aGUgdHlwZSBhcnJheSBoYXMgYmVlbiBtb2RpZmllZCBieSB0aGlzCisgICAgICogb3BlcmF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGN3IHRoZSBDbGFzc1dyaXRlciB0byB3aGljaCB0aGlzIGxhYmVsIGJlbG9uZ3MuCisgICAgICogQHBhcmFtIHQgdGhlIHR5cGUgd2l0aCB3aGljaCB0aGUgdHlwZSBhcnJheSBlbGVtZW50IG11c3QgYmUgbWVyZ2VkLgorICAgICAqIEBwYXJhbSB0eXBlcyBhbiBhcnJheSBvZiB0eXBlcy4KKyAgICAgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IG9mIHRoZSB0eXBlIHRoYXQgbXVzdCBiZSBtZXJnZWQgaW4gJ3R5cGVzJy4KKyAgICAgKiBAcmV0dXJuIDx0dD50cnVlPC90dD4gaWYgdGhlIHR5cGUgYXJyYXkgaGFzIGJlZW4gbW9kaWZpZWQgYnkgdGhpcworICAgICAqICAgICAgICAgb3BlcmF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gbWVyZ2UoCisgICAgICAgIGZpbmFsIENsYXNzV3JpdGVyIGN3LAorICAgICAgICBpbnQgdCwKKyAgICAgICAgZmluYWwgaW50W10gdHlwZXMsCisgICAgICAgIGZpbmFsIGludCBpbmRleCkKKyAgICB7CisgICAgICAgIGludCB1ID0gdHlwZXNbaW5kZXhdOworICAgICAgICBpZiAodSA9PSB0KSB7CisgICAgICAgICAgICAvLyBpZiB0aGUgdHlwZXMgYXJlIGVxdWFsLCBtZXJnZSh1LHQpPXUsIHNvIHRoZXJlIGlzIG5vIGNoYW5nZQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICgodCAmIH5ESU0pID09IE5VTEwpIHsKKyAgICAgICAgICAgIGlmICh1ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0ID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAodSA9PSAwKSB7CisgICAgICAgICAgICAvLyBpZiB0eXBlc1tpbmRleF0gaGFzIG5ldmVyIGJlZW4gYXNzaWduZWQsIG1lcmdlKHUsdCk9dAorICAgICAgICAgICAgdHlwZXNbaW5kZXhdID0gdDsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGludCB2OworICAgICAgICBpZiAoKHUgJiBCQVNFX0tJTkQpID09IE9CSkVDVCB8fCAodSAmIERJTSkgIT0gMCkgeworICAgICAgICAgICAgLy8gaWYgdSBpcyBhIHJlZmVyZW5jZSB0eXBlIG9mIGFueSBkaW1lbnNpb24KKyAgICAgICAgICAgIGlmICh0ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAvLyBpZiB0IGlzIHRoZSBOVUxMIHR5cGUsIG1lcmdlKHUsdCk9dSwgc28gdGhlcmUgaXMgbm8gY2hhbmdlCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIGlmICgodCAmIChESU0gfCBCQVNFX0tJTkQpKSA9PSAodSAmIChESU0gfCBCQVNFX0tJTkQpKSkgeworICAgICAgICAgICAgICAgIGlmICgodSAmIEJBU0VfS0lORCkgPT0gT0JKRUNUKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGlmIHQgaXMgYWxzbyBhIHJlZmVyZW5jZSB0eXBlLCBhbmQgaWYgdSBhbmQgdCBoYXZlIHRoZQorICAgICAgICAgICAgICAgICAgICAvLyBzYW1lIGRpbWVuc2lvbiBtZXJnZSh1LHQpID0gZGltKHQpIHwgY29tbW9uIHBhcmVudCBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgLy8gZWxlbWVudCB0eXBlcyBvZiB1IGFuZCB0CisgICAgICAgICAgICAgICAgICAgIHYgPSAodCAmIERJTSkgfCBPQkpFQ1QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGN3LmdldE1lcmdlZFR5cGUodCAmIEJBU0VfVkFMVUUsIHUgJiBCQVNFX1ZBTFVFKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBpZiB1IGFuZCB0IGFyZSBhcnJheSB0eXBlcywgYnV0IG5vdCB3aXRoIHRoZSBzYW1lIGVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgLy8gdHlwZSwgbWVyZ2UodSx0KT1qYXZhL2xhbmcvT2JqZWN0CisgICAgICAgICAgICAgICAgICAgIHYgPSBPQkpFQ1QgfCBjdy5hZGRUeXBlKCJqYXZhL2xhbmcvT2JqZWN0Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmICgodCAmIEJBU0VfS0lORCkgPT0gT0JKRUNUIHx8ICh0ICYgRElNKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgLy8gaWYgdCBpcyBhbnkgb3RoZXIgcmVmZXJlbmNlIG9yIGFycmF5IHR5cGUsCisgICAgICAgICAgICAgICAgLy8gbWVyZ2UodSx0KT1qYXZhL2xhbmcvT2JqZWN0CisgICAgICAgICAgICAgICAgdiA9IE9CSkVDVCB8IGN3LmFkZFR5cGUoImphdmEvbGFuZy9PYmplY3QiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gaWYgdCBpcyBhbnkgb3RoZXIgdHlwZSwgbWVyZ2UodSx0KT1UT1AKKyAgICAgICAgICAgICAgICB2ID0gVE9QOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHUgPT0gTlVMTCkgeworICAgICAgICAgICAgLy8gaWYgdSBpcyB0aGUgTlVMTCB0eXBlLCBtZXJnZSh1LHQpPXQsCisgICAgICAgICAgICAvLyBvciBUT1AgaWYgdCBpcyBub3QgYSByZWZlcmVuY2UgdHlwZQorICAgICAgICAgICAgdiA9ICh0ICYgQkFTRV9LSU5EKSA9PSBPQkpFQ1QgfHwgKHQgJiBESU0pICE9IDAgPyB0IDogVE9QOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gaWYgdSBpcyBhbnkgb3RoZXIgdHlwZSwgbWVyZ2UodSx0KT1UT1Agd2hhdGV2ZXIgdAorICAgICAgICAgICAgdiA9IFRPUDsKKyAgICAgICAgfQorICAgICAgICBpZiAodSAhPSB2KSB7CisgICAgICAgICAgICB0eXBlc1tpbmRleF0gPSB2OworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vSGFuZGxlLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL0hhbmRsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3MGUzODUKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL0hhbmRsZS5qYXZhCkBAIC0wLDAgKzEsMTg4IEBACisvKgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBPcmFjbGUgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKKyAqIHF1ZXN0aW9ucy4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGlzIGF2YWlsYWJsZSB1bmRlciBhbmQgZ292ZXJuZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiBIb3dldmVyLCB0aGUgZm9sbG93aW5nIG5vdGljZSBhY2NvbXBhbmllZCB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGlzCisgKiBmaWxlOgorICoKKyAqIEFTTTogYSB2ZXJ5IHNtYWxsIGFuZCBmYXN0IEphdmEgYnl0ZWNvZGUgbWFuaXB1bGF0aW9uIGZyYW1ld29yaworICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMTEgSU5SSUEsIEZyYW5jZSBUZWxlY29tCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworcGFja2FnZSBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc207CisKKy8qKgorICogQSByZWZlcmVuY2UgdG8gYSBmaWVsZCBvciBhIG1ldGhvZC4KKyAqCisgKiBAYXV0aG9yIFJlbWkgRm9yYXgKKyAqIEBhdXRob3IgRXJpYyBCcnVuZXRvbgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgSGFuZGxlIHsKKworICAgIC8qKgorICAgICAqIFRoZSBraW5kIG9mIGZpZWxkIG9yIG1ldGhvZCBkZXNpZ25hdGVkIGJ5IHRoaXMgSGFuZGxlLiBTaG91bGQgYmUKKyAgICAgKiB7QGxpbmsgT3Bjb2RlcyNIX0dFVEZJRUxEfSwge0BsaW5rIE9wY29kZXMjSF9HRVRTVEFUSUN9LAorICAgICAqIHtAbGluayBPcGNvZGVzI0hfUFVURklFTER9LCB7QGxpbmsgT3Bjb2RlcyNIX1BVVFNUQVRJQ30sCisgICAgICoge0BsaW5rIE9wY29kZXMjSF9JTlZPS0VWSVJUVUFMfSwge0BsaW5rIE9wY29kZXMjSF9JTlZPS0VTVEFUSUN9LAorICAgICAqIHtAbGluayBPcGNvZGVzI0hfSU5WT0tFU1BFQ0lBTH0sIHtAbGluayBPcGNvZGVzI0hfTkVXSU5WT0tFU1BFQ0lBTH0gb3IKKyAgICAgKiB7QGxpbmsgT3Bjb2RlcyNIX0lOVk9LRUlOVEVSRkFDRX0uCisgICAgICovCisgICAgZmluYWwgaW50IHRhZzsKKworICAgIC8qKgorICAgICAqIFRoZSBpbnRlcm5hbCBuYW1lIG9mIHRoZSBmaWVsZCBvciBtZXRob2QgZGVzaWduZWQgYnkgdGhpcyBoYW5kbGUuCisgICAgICovCisgICAgZmluYWwgU3RyaW5nIG93bmVyOworCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhlIGZpZWxkIG9yIG1ldGhvZCBkZXNpZ25hdGVkIGJ5IHRoaXMgaGFuZGxlLgorICAgICAqLworICAgIGZpbmFsIFN0cmluZyBuYW1lOworCisgICAgLyoqCisgICAgICogVGhlIGRlc2NyaXB0b3Igb2YgdGhlIGZpZWxkIG9yIG1ldGhvZCBkZXNpZ25hdGVkIGJ5IHRoaXMgaGFuZGxlLgorICAgICAqLworICAgIGZpbmFsIFN0cmluZyBkZXNjOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBmaWVsZCBvciBtZXRob2QgaGFuZGxlLgorICAgICAqCisgICAgICogQHBhcmFtIHRhZyB0aGUga2luZCBvZiBmaWVsZCBvciBtZXRob2QgZGVzaWduYXRlZCBieSB0aGlzIEhhbmRsZS4gTXVzdCBiZQorICAgICAqICAgICAgICB7QGxpbmsgT3Bjb2RlcyNIX0dFVEZJRUxEfSwge0BsaW5rIE9wY29kZXMjSF9HRVRTVEFUSUN9LAorICAgICAqICAgICAgICB7QGxpbmsgT3Bjb2RlcyNIX1BVVEZJRUxEfSwge0BsaW5rIE9wY29kZXMjSF9QVVRTVEFUSUN9LAorICAgICAqICAgICAgICB7QGxpbmsgT3Bjb2RlcyNIX0lOVk9LRVZJUlRVQUx9LCB7QGxpbmsgT3Bjb2RlcyNIX0lOVk9LRVNUQVRJQ30sCisgICAgICogICAgICAgIHtAbGluayBPcGNvZGVzI0hfSU5WT0tFU1BFQ0lBTH0sCisgICAgICogICAgICAgIHtAbGluayBPcGNvZGVzI0hfTkVXSU5WT0tFU1BFQ0lBTH0gb3IKKyAgICAgKiAgICAgICAge0BsaW5rIE9wY29kZXMjSF9JTlZPS0VJTlRFUkZBQ0V9LgorICAgICAqIEBwYXJhbSBvd25lciB0aGUgaW50ZXJuYWwgbmFtZSBvZiB0aGUgZmllbGQgb3IgbWV0aG9kIGRlc2lnbmVkIGJ5IHRoaXMKKyAgICAgKiAgICAgICAgaGFuZGxlLgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCBvciBtZXRob2QgZGVzaWduYXRlZCBieSB0aGlzIGhhbmRsZS4KKyAgICAgKiBAcGFyYW0gZGVzYyB0aGUgZGVzY3JpcHRvciBvZiB0aGUgZmllbGQgb3IgbWV0aG9kIGRlc2lnbmF0ZWQgYnkgdGhpcworICAgICAqICAgICAgICBoYW5kbGUuCisgICAgICovCisgICAgcHVibGljIEhhbmRsZShpbnQgdGFnLCBTdHJpbmcgb3duZXIsIFN0cmluZyBuYW1lLCBTdHJpbmcgZGVzYykgeworICAgICAgICB0aGlzLnRhZyA9IHRhZzsKKyAgICAgICAgdGhpcy5vd25lciA9IG93bmVyOworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB0aGlzLmRlc2MgPSBkZXNjOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGtpbmQgb2YgZmllbGQgb3IgbWV0aG9kIGRlc2lnbmF0ZWQgYnkgdGhpcyBoYW5kbGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHtAbGluayBPcGNvZGVzI0hfR0VURklFTER9LCB7QGxpbmsgT3Bjb2RlcyNIX0dFVFNUQVRJQ30sCisgICAgICogICAgICAgICB7QGxpbmsgT3Bjb2RlcyNIX1BVVEZJRUxEfSwge0BsaW5rIE9wY29kZXMjSF9QVVRTVEFUSUN9LAorICAgICAqICAgICAgICAge0BsaW5rIE9wY29kZXMjSF9JTlZPS0VWSVJUVUFMfSwge0BsaW5rIE9wY29kZXMjSF9JTlZPS0VTVEFUSUN9LAorICAgICAqICAgICAgICAge0BsaW5rIE9wY29kZXMjSF9JTlZPS0VTUEVDSUFMfSwKKyAgICAgKiAgICAgICAgIHtAbGluayBPcGNvZGVzI0hfTkVXSU5WT0tFU1BFQ0lBTH0gb3IKKyAgICAgKiAgICAgICAgIHtAbGluayBPcGNvZGVzI0hfSU5WT0tFSU5URVJGQUNFfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFRhZygpIHsKKyAgICAgICAgcmV0dXJuIHRhZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBpbnRlcm5hbCBuYW1lIG9mIHRoZSBmaWVsZCBvciBtZXRob2QgZGVzaWduZWQgYnkgdGhpcworICAgICAqIGhhbmRsZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGludGVybmFsIG5hbWUgb2YgdGhlIGZpZWxkIG9yIG1ldGhvZCBkZXNpZ25lZCBieSB0aGlzCisgICAgICogICAgICAgICBoYW5kbGUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRPd25lcigpIHsKKyAgICAgICAgcmV0dXJuIG93bmVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGZpZWxkIG9yIG1ldGhvZCBkZXNpZ25hdGVkIGJ5IHRoaXMgaGFuZGxlLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgZmllbGQgb3IgbWV0aG9kIGRlc2lnbmF0ZWQgYnkgdGhpcyBoYW5kbGUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBkZXNjcmlwdG9yIG9mIHRoZSBmaWVsZCBvciBtZXRob2QgZGVzaWduYXRlZCBieSB0aGlzIGhhbmRsZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGRlc2NyaXB0b3Igb2YgdGhlIGZpZWxkIG9yIG1ldGhvZCBkZXNpZ25hdGVkIGJ5IHRoaXMgaGFuZGxlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzYygpIHsKKyAgICAgICAgcmV0dXJuIGRlc2M7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgICAgaWYgKG9iaiA9PSB0aGlzKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBIYW5kbGUpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgSGFuZGxlIGggPSAoSGFuZGxlKSBvYmo7CisgICAgICAgIHJldHVybiB0YWcgPT0gaC50YWcgJiYgb3duZXIuZXF1YWxzKGgub3duZXIpCisgICAgICAgICAgICAgICAgJiYgbmFtZS5lcXVhbHMoaC5uYW1lKSAmJiBkZXNjLmVxdWFscyhoLmRlc2MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIHJldHVybiB0YWcgKyBvd25lci5oYXNoQ29kZSgpICogbmFtZS5oYXNoQ29kZSgpICogZGVzYy5oYXNoQ29kZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBoYW5kbGUuIFRoZSB0ZXh0dWFsCisgICAgICogcmVwcmVzZW50YXRpb24gaXM6IDxwcmU+b3duZXIgJy4nIG5hbWUgZGVzYyAnICcgJygnIHRhZyAnKSc8L3ByZT4uIEFzCisgICAgICogdGhpcyBmb3JtYXQgaXMgdW5hbWJpZ3VvdXMsIGl0IGNhbiBiZSBwYXJzZWQgaWYgbmVjZXNzYXJ5LgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBvd25lciArICcuJyArIG5hbWUgKyBkZXNjICsgIiAoIiArIHRhZyArICcpJzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL0hhbmRsZXIuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vSGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyMjExYTMKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL0hhbmRsZXIuamF2YQpAQCAtMCwwICsxLDE0NyBAQAorLyoKKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgT3JhY2xlIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCisgKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CisgKiBxdWVzdGlvbnMuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBpcyBhdmFpbGFibGUgdW5kZXIgYW5kIGdvdmVybmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogSG93ZXZlciwgdGhlIGZvbGxvd2luZyBub3RpY2UgYWNjb21wYW5pZWQgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhpcworICogZmlsZToKKyAqCisgKiBBU006IGEgdmVyeSBzbWFsbCBhbmQgZmFzdCBKYXZhIGJ5dGVjb2RlIG1hbmlwdWxhdGlvbiBmcmFtZXdvcmsKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDExIElOUklBLCBGcmFuY2UgVGVsZWNvbQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbTsKKworLyoqCisgKiBJbmZvcm1hdGlvbiBhYm91dCBhbiBleGNlcHRpb24gaGFuZGxlciBibG9jay4KKyAqCisgKiBAYXV0aG9yIEVyaWMgQnJ1bmV0b24KKyAqLworY2xhc3MgSGFuZGxlciB7CisKKyAgICAvKioKKyAgICAgKiBCZWdpbm5pbmcgb2YgdGhlIGV4Y2VwdGlvbiBoYW5kbGVyJ3Mgc2NvcGUgKGluY2x1c2l2ZSkuCisgICAgICovCisgICAgTGFiZWwgc3RhcnQ7CisKKyAgICAvKioKKyAgICAgKiBFbmQgb2YgdGhlIGV4Y2VwdGlvbiBoYW5kbGVyJ3Mgc2NvcGUgKGV4Y2x1c2l2ZSkuCisgICAgICovCisgICAgTGFiZWwgZW5kOworCisgICAgLyoqCisgICAgICogQmVnaW5uaW5nIG9mIHRoZSBleGNlcHRpb24gaGFuZGxlcidzIGNvZGUuCisgICAgICovCisgICAgTGFiZWwgaGFuZGxlcjsKKworICAgIC8qKgorICAgICAqIEludGVybmFsIG5hbWUgb2YgdGhlIHR5cGUgb2YgZXhjZXB0aW9ucyBoYW5kbGVkIGJ5IHRoaXMgaGFuZGxlciwgb3IKKyAgICAgKiA8dHQ+bnVsbDwvdHQ+IHRvIGNhdGNoIGFueSBleGNlcHRpb25zLgorICAgICAqLworICAgIFN0cmluZyBkZXNjOworCisgICAgLyoqCisgICAgICogQ29uc3RhbnQgcG9vbCBpbmRleCBvZiB0aGUgaW50ZXJuYWwgbmFtZSBvZiB0aGUgdHlwZSBvZiBleGNlcHRpb25zCisgICAgICogaGFuZGxlZCBieSB0aGlzIGhhbmRsZXIsIG9yIDAgdG8gY2F0Y2ggYW55IGV4Y2VwdGlvbnMuCisgICAgICovCisgICAgaW50IHR5cGU7CisKKyAgICAvKioKKyAgICAgKiBOZXh0IGV4Y2VwdGlvbiBoYW5kbGVyIGJsb2NrIGluZm8uCisgICAgICovCisgICAgSGFuZGxlciBuZXh0OworCisgICAgLyoqCisgICAgICogUmVtb3ZlcyB0aGUgcmFuZ2UgYmV0d2VlbiBzdGFydCBhbmQgZW5kIGZyb20gdGhlIGdpdmVuIGV4Y2VwdGlvbgorICAgICAqIGhhbmRsZXJzLgorICAgICAqCisgICAgICogQHBhcmFtIGggYW4gZXhjZXB0aW9uIGhhbmRsZXIgbGlzdC4KKyAgICAgKiBAcGFyYW0gc3RhcnQgdGhlIHN0YXJ0IG9mIHRoZSByYW5nZSB0byBiZSByZW1vdmVkLgorICAgICAqIEBwYXJhbSBlbmQgdGhlIGVuZCBvZiB0aGUgcmFuZ2UgdG8gYmUgcmVtb3ZlZC4gTWF5YmUgbnVsbC4KKyAgICAgKiBAcmV0dXJuIHRoZSBleGNlcHRpb24gaGFuZGxlciBsaXN0IHdpdGggdGhlIHN0YXJ0LWVuZCByYW5nZSByZW1vdmVkLgorICAgICAqLworICAgIHN0YXRpYyBIYW5kbGVyIHJlbW92ZShIYW5kbGVyIGgsIExhYmVsIHN0YXJ0LCBMYWJlbCBlbmQpIHsKKyAgICAgICAgaWYgKGggPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBoLm5leHQgPSByZW1vdmUoaC5uZXh0LCBzdGFydCwgZW5kKTsKKyAgICAgICAgfQorICAgICAgICBpbnQgaHN0YXJ0ID0gaC5zdGFydC5wb3NpdGlvbjsKKyAgICAgICAgaW50IGhlbmQgPSBoLmVuZC5wb3NpdGlvbjsKKyAgICAgICAgaW50IHMgPSBzdGFydC5wb3NpdGlvbjsKKyAgICAgICAgaW50IGUgPSBlbmQgPT0gbnVsbCA/IEludGVnZXIuTUFYX1ZBTFVFIDogZW5kLnBvc2l0aW9uOworICAgICAgICAvLyBpZiBbaHN0YXJ0LGhlbmRbIGFuZCBbcyxlWyBpbnRlcnZhbHMgaW50ZXJzZWN0Li4uCisgICAgICAgIGlmIChzIDwgaGVuZCAmJiBlID4gaHN0YXJ0KSB7CisgICAgICAgICAgICBpZiAocyA8PSBoc3RhcnQpIHsKKyAgICAgICAgICAgICAgICBpZiAoZSA+PSBoZW5kKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFtoc3RhcnQsaGVuZFsgZnVsbHkgaW5jbHVkZWQgaW4gW3MsZVssIGggcmVtb3ZlZAorICAgICAgICAgICAgICAgICAgICBoID0gaC5uZXh0OworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFtoc3RhcnQsaGVuZFsgbWludXMgW3MsZVsgPSBbZSxoZW5kWworICAgICAgICAgICAgICAgICAgICBoLnN0YXJ0ID0gZW5kOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZSA+PSBoZW5kKSB7CisgICAgICAgICAgICAgICAgLy8gW2hzdGFydCxoZW5kWyBtaW51cyBbcyxlWyA9IFtoc3RhcnQsc1sKKyAgICAgICAgICAgICAgICBoLmVuZCA9IHN0YXJ0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBbaHN0YXJ0LGhlbmRbIG1pbnVzIFtzLGVbID0gW2hzdGFydCxzWyArIFtlLGhlbmRbCisgICAgICAgICAgICAgICAgSGFuZGxlciBnID0gbmV3IEhhbmRsZXIoKTsKKyAgICAgICAgICAgICAgICBnLnN0YXJ0ID0gZW5kOworICAgICAgICAgICAgICAgIGcuZW5kID0gaC5lbmQ7CisgICAgICAgICAgICAgICAgZy5oYW5kbGVyID0gaC5oYW5kbGVyOworICAgICAgICAgICAgICAgIGcuZGVzYyA9IGguZGVzYzsKKyAgICAgICAgICAgICAgICBnLnR5cGUgPSBoLnR5cGU7CisgICAgICAgICAgICAgICAgZy5uZXh0ID0gaC5uZXh0OworICAgICAgICAgICAgICAgIGguZW5kID0gc3RhcnQ7CisgICAgICAgICAgICAgICAgaC5uZXh0ID0gZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL0l0ZW0uamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vSXRlbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3YjU2ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL0l0ZW0uamF2YQpAQCAtMCwwICsxLDMyNiBAQAorLyoKKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgT3JhY2xlIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCisgKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CisgKiBxdWVzdGlvbnMuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBpcyBhdmFpbGFibGUgdW5kZXIgYW5kIGdvdmVybmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogSG93ZXZlciwgdGhlIGZvbGxvd2luZyBub3RpY2UgYWNjb21wYW5pZWQgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhpcworICogZmlsZToKKyAqCisgKiBBU006IGEgdmVyeSBzbWFsbCBhbmQgZmFzdCBKYXZhIGJ5dGVjb2RlIG1hbmlwdWxhdGlvbiBmcmFtZXdvcmsKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDExIElOUklBLCBGcmFuY2UgVGVsZWNvbQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbTsKKworLyoqCisgKiBBIGNvbnN0YW50IHBvb2wgaXRlbS4gQ29uc3RhbnQgcG9vbCBpdGVtcyBjYW4gYmUgY3JlYXRlZCB3aXRoIHRoZSAnbmV3WFhYJworICogbWV0aG9kcyBpbiB0aGUge0BsaW5rIENsYXNzV3JpdGVyfSBjbGFzcy4KKyAqCisgKiBAYXV0aG9yIEVyaWMgQnJ1bmV0b24KKyAqLworZmluYWwgY2xhc3MgSXRlbSB7CisKKyAgICAvKioKKyAgICAgKiBJbmRleCBvZiB0aGlzIGl0ZW0gaW4gdGhlIGNvbnN0YW50IHBvb2wuCisgICAgICovCisgICAgaW50IGluZGV4OworCisgICAgLyoqCisgICAgICogVHlwZSBvZiB0aGlzIGNvbnN0YW50IHBvb2wgaXRlbS4gQSBzaW5nbGUgY2xhc3MgaXMgdXNlZCB0byByZXByZXNlbnQgYWxsCisgICAgICogY29uc3RhbnQgcG9vbCBpdGVtIHR5cGVzLCBpbiBvcmRlciB0byBtaW5pbWl6ZSB0aGUgYnl0ZWNvZGUgc2l6ZSBvZiB0aGlzCisgICAgICogcGFja2FnZS4gVGhlIHZhbHVlIG9mIHRoaXMgZmllbGQgaXMgb25lIG9mIHtAbGluayBDbGFzc1dyaXRlciNJTlR9LAorICAgICAqIHtAbGluayBDbGFzc1dyaXRlciNMT05HfSwge0BsaW5rIENsYXNzV3JpdGVyI0ZMT0FUfSwKKyAgICAgKiB7QGxpbmsgQ2xhc3NXcml0ZXIjRE9VQkxFfSwge0BsaW5rIENsYXNzV3JpdGVyI1VURjh9LAorICAgICAqIHtAbGluayBDbGFzc1dyaXRlciNTVFJ9LCB7QGxpbmsgQ2xhc3NXcml0ZXIjQ0xBU1N9LAorICAgICAqIHtAbGluayBDbGFzc1dyaXRlciNOQU1FX1RZUEV9LCB7QGxpbmsgQ2xhc3NXcml0ZXIjRklFTER9LAorICAgICAqIHtAbGluayBDbGFzc1dyaXRlciNNRVRIfSwge0BsaW5rIENsYXNzV3JpdGVyI0lNRVRIfSwKKyAgICAgKiB7QGxpbmsgQ2xhc3NXcml0ZXIjTVRZUEV9LCB7QGxpbmsgQ2xhc3NXcml0ZXIjSU5EWX0uCisgICAgICoKKyAgICAgKiBNZXRob2RIYW5kbGUgY29uc3RhbnQgOSB2YXJpYXRpb25zIGFyZSBzdG9yZWQgdXNpbmcgYSByYW5nZQorICAgICAqIG9mIDkgdmFsdWVzIGZyb20ge0BsaW5rIENsYXNzV3JpdGVyI0hBTkRMRV9CQVNFfSArIDEgdG8KKyAgICAgKiB7QGxpbmsgQ2xhc3NXcml0ZXIjSEFORExFX0JBU0V9ICsgOS4KKyAgICAgKgorICAgICAqIFNwZWNpYWwgSXRlbSB0eXBlcyBhcmUgdXNlZCBmb3IgSXRlbXMgdGhhdCBhcmUgc3RvcmVkIGluIHRoZSBDbGFzc1dyaXRlcgorICAgICAqIHtAbGluayBDbGFzc1dyaXRlciN0eXBlVGFibGV9LCBpbnN0ZWFkIG9mIHRoZSBjb25zdGFudCBwb29sLCBpbiBvcmRlciB0bworICAgICAqIGF2b2lkIGNsYXNoZXMgd2l0aCBub3JtYWwgY29uc3RhbnQgcG9vbCBpdGVtcyBpbiB0aGUgQ2xhc3NXcml0ZXIgY29uc3RhbnQKKyAgICAgKiBwb29sJ3MgaGFzaCB0YWJsZS4gVGhlc2Ugc3BlY2lhbCBpdGVtIHR5cGVzIGFyZQorICAgICAqIHtAbGluayBDbGFzc1dyaXRlciNUWVBFX05PUk1BTH0sIHtAbGluayBDbGFzc1dyaXRlciNUWVBFX1VOSU5JVH0gYW5kCisgICAgICoge0BsaW5rIENsYXNzV3JpdGVyI1RZUEVfTUVSR0VEfS4KKyAgICAgKi8KKyAgICBpbnQgdHlwZTsKKworICAgIC8qKgorICAgICAqIFZhbHVlIG9mIHRoaXMgaXRlbSwgZm9yIGFuIGludGVnZXIgaXRlbS4KKyAgICAgKi8KKyAgICBpbnQgaW50VmFsOworCisgICAgLyoqCisgICAgICogVmFsdWUgb2YgdGhpcyBpdGVtLCBmb3IgYSBsb25nIGl0ZW0uCisgICAgICovCisgICAgbG9uZyBsb25nVmFsOworCisgICAgLyoqCisgICAgICogRmlyc3QgcGFydCBvZiB0aGUgdmFsdWUgb2YgdGhpcyBpdGVtLCBmb3IgaXRlbXMgdGhhdCBkbyBub3QgaG9sZCBhCisgICAgICogcHJpbWl0aXZlIHZhbHVlLgorICAgICAqLworICAgIFN0cmluZyBzdHJWYWwxOworCisgICAgLyoqCisgICAgICogU2Vjb25kIHBhcnQgb2YgdGhlIHZhbHVlIG9mIHRoaXMgaXRlbSwgZm9yIGl0ZW1zIHRoYXQgZG8gbm90IGhvbGQgYQorICAgICAqIHByaW1pdGl2ZSB2YWx1ZS4KKyAgICAgKi8KKyAgICBTdHJpbmcgc3RyVmFsMjsKKworICAgIC8qKgorICAgICAqIFRoaXJkIHBhcnQgb2YgdGhlIHZhbHVlIG9mIHRoaXMgaXRlbSwgZm9yIGl0ZW1zIHRoYXQgZG8gbm90IGhvbGQgYQorICAgICAqIHByaW1pdGl2ZSB2YWx1ZS4KKyAgICAgKi8KKyAgICBTdHJpbmcgc3RyVmFsMzsKKworICAgIC8qKgorICAgICAqIFRoZSBoYXNoIGNvZGUgdmFsdWUgb2YgdGhpcyBjb25zdGFudCBwb29sIGl0ZW0uCisgICAgICovCisgICAgaW50IGhhc2hDb2RlOworCisgICAgLyoqCisgICAgICogTGluayB0byBhbm90aGVyIGNvbnN0YW50IHBvb2wgaXRlbSwgdXNlZCBmb3IgY29sbGlzaW9uIGxpc3RzIGluIHRoZQorICAgICAqIGNvbnN0YW50IHBvb2wncyBoYXNoIHRhYmxlLgorICAgICAqLworICAgIEl0ZW0gbmV4dDsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYW4gdW5pbml0aWFsaXplZCB7QGxpbmsgSXRlbX0uCisgICAgICovCisgICAgSXRlbSgpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIHVuaW5pdGlhbGl6ZWQge0BsaW5rIEl0ZW19IGZvciBjb25zdGFudCBwb29sIGVsZW1lbnQgYXQKKyAgICAgKiBnaXZlbiBwb3NpdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbmRleCBpbmRleCBvZiB0aGUgaXRlbSB0byBiZSBjb25zdHJ1Y3RlZC4KKyAgICAgKi8KKyAgICBJdGVtKGZpbmFsIGludCBpbmRleCkgeworICAgICAgICB0aGlzLmluZGV4ID0gaW5kZXg7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIGNvcHkgb2YgdGhlIGdpdmVuIGl0ZW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5kZXggaW5kZXggb2YgdGhlIGl0ZW0gdG8gYmUgY29uc3RydWN0ZWQuCisgICAgICogQHBhcmFtIGkgdGhlIGl0ZW0gdGhhdCBtdXN0IGJlIGNvcGllZCBpbnRvIHRoZSBpdGVtIHRvIGJlIGNvbnN0cnVjdGVkLgorICAgICAqLworICAgIEl0ZW0oZmluYWwgaW50IGluZGV4LCBmaW5hbCBJdGVtIGkpIHsKKyAgICAgICAgdGhpcy5pbmRleCA9IGluZGV4OworICAgICAgICB0eXBlID0gaS50eXBlOworICAgICAgICBpbnRWYWwgPSBpLmludFZhbDsKKyAgICAgICAgbG9uZ1ZhbCA9IGkubG9uZ1ZhbDsKKyAgICAgICAgc3RyVmFsMSA9IGkuc3RyVmFsMTsKKyAgICAgICAgc3RyVmFsMiA9IGkuc3RyVmFsMjsKKyAgICAgICAgc3RyVmFsMyA9IGkuc3RyVmFsMzsKKyAgICAgICAgaGFzaENvZGUgPSBpLmhhc2hDb2RlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhpcyBpdGVtIHRvIGFuIGludGVnZXIgaXRlbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnRWYWwgdGhlIHZhbHVlIG9mIHRoaXMgaXRlbS4KKyAgICAgKi8KKyAgICB2b2lkIHNldChmaW5hbCBpbnQgaW50VmFsKSB7CisgICAgICAgIHRoaXMudHlwZSA9IENsYXNzV3JpdGVyLklOVDsKKyAgICAgICAgdGhpcy5pbnRWYWwgPSBpbnRWYWw7CisgICAgICAgIHRoaXMuaGFzaENvZGUgPSAweDdGRkZGRkZGICYgKHR5cGUgKyBpbnRWYWwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhpcyBpdGVtIHRvIGEgbG9uZyBpdGVtLgorICAgICAqCisgICAgICogQHBhcmFtIGxvbmdWYWwgdGhlIHZhbHVlIG9mIHRoaXMgaXRlbS4KKyAgICAgKi8KKyAgICB2b2lkIHNldChmaW5hbCBsb25nIGxvbmdWYWwpIHsKKyAgICAgICAgdGhpcy50eXBlID0gQ2xhc3NXcml0ZXIuTE9ORzsKKyAgICAgICAgdGhpcy5sb25nVmFsID0gbG9uZ1ZhbDsKKyAgICAgICAgdGhpcy5oYXNoQ29kZSA9IDB4N0ZGRkZGRkYgJiAodHlwZSArIChpbnQpIGxvbmdWYWwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhpcyBpdGVtIHRvIGEgZmxvYXQgaXRlbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmbG9hdFZhbCB0aGUgdmFsdWUgb2YgdGhpcyBpdGVtLgorICAgICAqLworICAgIHZvaWQgc2V0KGZpbmFsIGZsb2F0IGZsb2F0VmFsKSB7CisgICAgICAgIHRoaXMudHlwZSA9IENsYXNzV3JpdGVyLkZMT0FUOworICAgICAgICB0aGlzLmludFZhbCA9IEZsb2F0LmZsb2F0VG9SYXdJbnRCaXRzKGZsb2F0VmFsKTsKKyAgICAgICAgdGhpcy5oYXNoQ29kZSA9IDB4N0ZGRkZGRkYgJiAodHlwZSArIChpbnQpIGZsb2F0VmFsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoaXMgaXRlbSB0byBhIGRvdWJsZSBpdGVtLgorICAgICAqCisgICAgICogQHBhcmFtIGRvdWJsZVZhbCB0aGUgdmFsdWUgb2YgdGhpcyBpdGVtLgorICAgICAqLworICAgIHZvaWQgc2V0KGZpbmFsIGRvdWJsZSBkb3VibGVWYWwpIHsKKyAgICAgICAgdGhpcy50eXBlID0gQ2xhc3NXcml0ZXIuRE9VQkxFOworICAgICAgICB0aGlzLmxvbmdWYWwgPSBEb3VibGUuZG91YmxlVG9SYXdMb25nQml0cyhkb3VibGVWYWwpOworICAgICAgICB0aGlzLmhhc2hDb2RlID0gMHg3RkZGRkZGRiAmICh0eXBlICsgKGludCkgZG91YmxlVmFsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoaXMgaXRlbSB0byBhbiBpdGVtIHRoYXQgZG8gbm90IGhvbGQgYSBwcmltaXRpdmUgdmFsdWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBvZiB0aGlzIGl0ZW0uCisgICAgICogQHBhcmFtIHN0clZhbDEgZmlyc3QgcGFydCBvZiB0aGUgdmFsdWUgb2YgdGhpcyBpdGVtLgorICAgICAqIEBwYXJhbSBzdHJWYWwyIHNlY29uZCBwYXJ0IG9mIHRoZSB2YWx1ZSBvZiB0aGlzIGl0ZW0uCisgICAgICogQHBhcmFtIHN0clZhbDMgdGhpcmQgcGFydCBvZiB0aGUgdmFsdWUgb2YgdGhpcyBpdGVtLgorICAgICAqLworICAgIHZvaWQgc2V0KAorICAgICAgICBmaW5hbCBpbnQgdHlwZSwKKyAgICAgICAgZmluYWwgU3RyaW5nIHN0clZhbDEsCisgICAgICAgIGZpbmFsIFN0cmluZyBzdHJWYWwyLAorICAgICAgICBmaW5hbCBTdHJpbmcgc3RyVmFsMykKKyAgICB7CisgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgICAgIHRoaXMuc3RyVmFsMSA9IHN0clZhbDE7CisgICAgICAgIHRoaXMuc3RyVmFsMiA9IHN0clZhbDI7CisgICAgICAgIHRoaXMuc3RyVmFsMyA9IHN0clZhbDM7CisgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5VVEY4OgorICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5TVFI6CisgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLkNMQVNTOgorICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5NVFlQRToKKyAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuVFlQRV9OT1JNQUw6CisgICAgICAgICAgICAgICAgaGFzaENvZGUgPSAweDdGRkZGRkZGICYgKHR5cGUgKyBzdHJWYWwxLmhhc2hDb2RlKCkpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuTkFNRV9UWVBFOgorICAgICAgICAgICAgICAgIGhhc2hDb2RlID0gMHg3RkZGRkZGRiAmICh0eXBlICsgc3RyVmFsMS5oYXNoQ29kZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAqIHN0clZhbDIuaGFzaENvZGUoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIC8vIENsYXNzV3JpdGVyLkZJRUxEOgorICAgICAgICAgICAgICAgIC8vIENsYXNzV3JpdGVyLk1FVEg6CisgICAgICAgICAgICAgICAgLy8gQ2xhc3NXcml0ZXIuSU1FVEg6CisgICAgICAgICAgICAgICAgLy8gQ2xhc3NXcml0ZXIuSEFORExFX0JBU0UgKyAxLi45CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGhhc2hDb2RlID0gMHg3RkZGRkZGRiAmICh0eXBlICsgc3RyVmFsMS5oYXNoQ29kZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAqIHN0clZhbDIuaGFzaENvZGUoKSAqIHN0clZhbDMuaGFzaENvZGUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBpdGVtIHRvIGFuIEludm9rZUR5bmFtaWMgaXRlbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIGludm9rZWR5bmFtaWMncyBuYW1lLgorICAgICAqIEBwYXJhbSBkZXNjIGludm9rZWR5bmFtaWMncyBkZXNjLgorICAgICAqIEBwYXJhbSBic21JbmRleCB6ZXJvIGJhc2VkIGluZGV4IGludG8gdGhlIGNsYXNzIGF0dHJpYnV0ZSBCb290cmFwTWV0aG9kcy4KKyAgICAgKi8KKyAgICB2b2lkIHNldChTdHJpbmcgbmFtZSwgU3RyaW5nIGRlc2MsIGludCBic21JbmRleCkgeworICAgICAgICB0aGlzLnR5cGUgPSBDbGFzc1dyaXRlci5JTkRZOworICAgICAgICB0aGlzLmxvbmdWYWwgPSBic21JbmRleDsKKyAgICAgICAgdGhpcy5zdHJWYWwxID0gbmFtZTsKKyAgICAgICAgdGhpcy5zdHJWYWwyID0gZGVzYzsKKyAgICAgICAgdGhpcy5oYXNoQ29kZSA9IDB4N0ZGRkZGRkYgJiAoQ2xhc3NXcml0ZXIuSU5EWSArIGJzbUluZGV4CisgICAgICAgICAgICAgICAgKiBzdHJWYWwxLmhhc2hDb2RlKCkgKiBzdHJWYWwyLmhhc2hDb2RlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGl0ZW0gdG8gYSBCb290c3RyYXBNZXRob2QgaXRlbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwb3NpdGlvbiBwb3NpdGlvbiBpbiBieXRlIGluIHRoZSBjbGFzcyBhdHRyaWJ1dGUgQm9vdHJhcE1ldGhvZHMuCisgICAgICogQHBhcmFtIGhhc2hDb2RlIGhhc2hjb2RlIG9mIHRoZSBpdGVtLiBUaGlzIGhhc2hjb2RlIGlzIHByb2Nlc3NlZCBmcm9tCisgICAgICogICAgICAgIHRoZSBoYXNoY29kZSBvZiB0aGUgYm9vdHN0cmFwIG1ldGhvZCBhbmQgdGhlIGhhc2hjb2RlIG9mCisgICAgICogICAgICAgIGFsbCBib290c3RyYXAgYXJndW1lbnRzLgorICAgICAqLworICAgIHZvaWQgc2V0KGludCBwb3NpdGlvbiwgaW50IGhhc2hDb2RlKSB7CisgICAgICAgIHRoaXMudHlwZSA9IENsYXNzV3JpdGVyLkJTTTsKKyAgICAgICAgdGhpcy5pbnRWYWwgPSBwb3NpdGlvbjsKKyAgICAgICAgdGhpcy5oYXNoQ29kZSA9IGhhc2hDb2RlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyBpZiB0aGUgZ2l2ZW4gaXRlbSBpcyBlcXVhbCB0byB0aGlzIG9uZS4gPGk+VGhpcyBtZXRob2QgYXNzdW1lcworICAgICAqIHRoYXQgdGhlIHR3byBpdGVtcyBoYXZlIHRoZSBzYW1lIHtAbGluayAjdHlwZX08L2k+LgorICAgICAqCisgICAgICogQHBhcmFtIGkgdGhlIGl0ZW0gdG8gYmUgY29tcGFyZWQgdG8gdGhpcyBvbmUuIEJvdGggaXRlbXMgbXVzdCBoYXZlIHRoZQorICAgICAqICAgICAgIHNhbWUge0BsaW5rICN0eXBlfS4KKyAgICAgKiBAcmV0dXJuIDx0dD50cnVlPC90dD4gaWYgdGhlIGdpdmVuIGl0ZW0gaWYgZXF1YWwgdG8gdGhpcyBvbmUsCisgICAgICogICAgICAgICA8dHQ+ZmFsc2U8L3R0PiBvdGhlcndpc2UuCisgICAgICovCisgICAgYm9vbGVhbiBpc0VxdWFsVG8oZmluYWwgSXRlbSBpKSB7CisgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5VVEY4OgorICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5TVFI6CisgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLkNMQVNTOgorICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5NVFlQRToKKyAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuVFlQRV9OT1JNQUw6CisgICAgICAgICAgICAgICAgcmV0dXJuIGkuc3RyVmFsMS5lcXVhbHMoc3RyVmFsMSk7CisgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLlRZUEVfTUVSR0VEOgorICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5MT05HOgorICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5ET1VCTEU6CisgICAgICAgICAgICAgICAgcmV0dXJuIGkubG9uZ1ZhbCA9PSBsb25nVmFsOworICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5JTlQ6CisgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLkZMT0FUOgorICAgICAgICAgICAgICAgIHJldHVybiBpLmludFZhbCA9PSBpbnRWYWw7CisgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLlRZUEVfVU5JTklUOgorICAgICAgICAgICAgICAgIHJldHVybiBpLmludFZhbCA9PSBpbnRWYWwgJiYgaS5zdHJWYWwxLmVxdWFscyhzdHJWYWwxKTsKKyAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuTkFNRV9UWVBFOgorICAgICAgICAgICAgICAgIHJldHVybiBpLnN0clZhbDEuZXF1YWxzKHN0clZhbDEpICYmIGkuc3RyVmFsMi5lcXVhbHMoc3RyVmFsMik7CisgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLklORFk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGkubG9uZ1ZhbCA9PSBsb25nVmFsICYmIGkuc3RyVmFsMS5lcXVhbHMoc3RyVmFsMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGkuc3RyVmFsMi5lcXVhbHMoc3RyVmFsMik7CisKKyAgICAgICAgICAgIC8vIGNhc2UgQ2xhc3NXcml0ZXIuRklFTEQ6CisgICAgICAgICAgICAvLyBjYXNlIENsYXNzV3JpdGVyLk1FVEg6CisgICAgICAgICAgICAvLyBjYXNlIENsYXNzV3JpdGVyLklNRVRIOgorICAgICAgICAgICAgLy8gY2FzZSBDbGFzc1dyaXRlci5IQU5ETEVfQkFTRSArIDEuLjkKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGkuc3RyVmFsMS5lcXVhbHMoc3RyVmFsMSkgJiYgaS5zdHJWYWwyLmVxdWFscyhzdHJWYWwyKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgaS5zdHJWYWwzLmVxdWFscyhzdHJWYWwzKTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS9MYWJlbC5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS9MYWJlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyMGE2ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL0xhYmVsLmphdmEKQEAgLTAsMCArMSw1ODQgQEAKKy8qCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IE9yYWNsZSBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQorICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQorICogcXVlc3Rpb25zLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgaXMgYXZhaWxhYmxlIHVuZGVyIGFuZCBnb3Zlcm5lZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIEhvd2V2ZXIsIHRoZSBmb2xsb3dpbmcgbm90aWNlIGFjY29tcGFuaWVkIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoaXMKKyAqIGZpbGU6CisgKgorICogQVNNOiBhIHZlcnkgc21hbGwgYW5kIGZhc3QgSmF2YSBieXRlY29kZSBtYW5pcHVsYXRpb24gZnJhbWV3b3JrCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAxMSBJTlJJQSwgRnJhbmNlIFRlbGVjb20KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc207CisKKy8qKgorICogQSBsYWJlbCByZXByZXNlbnRzIGEgcG9zaXRpb24gaW4gdGhlIGJ5dGVjb2RlIG9mIGEgbWV0aG9kLiBMYWJlbHMgYXJlIHVzZWQKKyAqIGZvciBqdW1wLCBnb3RvLCBhbmQgc3dpdGNoIGluc3RydWN0aW9ucywgYW5kIGZvciB0cnkgY2F0Y2ggYmxvY2tzLiBBIGxhYmVsCisgKiBkZXNpZ25hdGVzIHRoZSA8aT5pbnN0cnVjdGlvbjwvaT4gdGhhdCBpcyBqdXN0IGFmdGVyLiBOb3RlIGhvd2V2ZXIgdGhhdAorICogdGhlcmUgY2FuIGJlIG90aGVyIGVsZW1lbnRzIGJldHdlZW4gYSBsYWJlbCBhbmQgdGhlIGluc3RydWN0aW9uIGl0CisgKiBkZXNpZ25hdGVzIChzdWNoIGFzIG90aGVyIGxhYmVscywgc3RhY2sgbWFwIGZyYW1lcywgbGluZSBudW1iZXJzLCBldGMuKS4KKyAqCisgKiBAYXV0aG9yIEVyaWMgQnJ1bmV0b24KKyAqLworcHVibGljIGNsYXNzIExhYmVsIHsKKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyBpZiB0aGlzIGxhYmVsIGlzIG9ubHkgdXNlZCBmb3IgZGVidWcgYXR0cmlidXRlcy4gU3VjaCBhIGxhYmVsCisgICAgICogaXMgbm90IHRoZSBzdGFydCBvZiBhIGJhc2ljIGJsb2NrLCB0aGUgdGFyZ2V0IG9mIGEganVtcCBpbnN0cnVjdGlvbiwgb3IKKyAgICAgKiBhbiBleGNlcHRpb24gaGFuZGxlci4gSXQgY2FuIGJlIHNhZmVseSBpZ25vcmVkIGluIGNvbnRyb2wgZmxvdyBncmFwaAorICAgICAqIGFuYWx5c2lzIGFsZ29yaXRobXMgKGZvciBvcHRpbWl6YXRpb24gcHVycG9zZXMpLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgREVCVUcgPSAxOworCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIGlmIHRoZSBwb3NpdGlvbiBvZiB0aGlzIGxhYmVsIGlzIGtub3duLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgUkVTT0xWRUQgPSAyOworCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIGlmIHRoaXMgbGFiZWwgaGFzIGJlZW4gdXBkYXRlZCwgYWZ0ZXIgaW5zdHJ1Y3Rpb24gcmVzaXppbmcuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBSRVNJWkVEID0gNDsKKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyBpZiB0aGlzIGJhc2ljIGJsb2NrIGhhcyBiZWVuIHB1c2hlZCBpbiB0aGUgYmFzaWMgYmxvY2sgc3RhY2suCisgICAgICogU2VlIHtAbGluayBNZXRob2RXcml0ZXIjdmlzaXRNYXhzIHZpc2l0TWF4c30uCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBQVVNIRUQgPSA4OworCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIGlmIHRoaXMgbGFiZWwgaXMgdGhlIHRhcmdldCBvZiBhIGp1bXAgaW5zdHJ1Y3Rpb24sIG9yIHRoZSBzdGFydAorICAgICAqIG9mIGFuIGV4Y2VwdGlvbiBoYW5kbGVyLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgVEFSR0VUID0gMTY7CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgaWYgYSBzdGFjayBtYXAgZnJhbWUgbXVzdCBiZSBzdG9yZWQgZm9yIHRoaXMgbGFiZWwuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBTVE9SRSA9IDMyOworCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIGlmIHRoaXMgbGFiZWwgY29ycmVzcG9uZHMgdG8gYSByZWFjaGFibGUgYmFzaWMgYmxvY2suCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBSRUFDSEFCTEUgPSA2NDsKKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyBpZiB0aGlzIGJhc2ljIGJsb2NrIGVuZHMgd2l0aCBhIEpTUiBpbnN0cnVjdGlvbi4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IEpTUiA9IDEyODsKKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyBpZiB0aGlzIGJhc2ljIGJsb2NrIGVuZHMgd2l0aCBhIFJFVCBpbnN0cnVjdGlvbi4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IFJFVCA9IDI1NjsKKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyBpZiB0aGlzIGJhc2ljIGJsb2NrIGlzIHRoZSBzdGFydCBvZiBhIHN1YnJvdXRpbmUuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBTVUJST1VUSU5FID0gNTEyOworCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIGlmIHRoaXMgc3Vicm91dGluZSBiYXNpYyBibG9jayBoYXMgYmVlbiB2aXNpdGVkIGJ5IGEKKyAgICAgKiB2aXNpdFN1YnJvdXRpbmUobnVsbCwgLi4uKSBjYWxsLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgVklTSVRFRCA9IDEwMjQ7CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgaWYgdGhpcyBzdWJyb3V0aW5lIGJhc2ljIGJsb2NrIGhhcyBiZWVuIHZpc2l0ZWQgYnkgYQorICAgICAqIHZpc2l0U3Vicm91dGluZSghbnVsbCwgLi4uKSBjYWxsLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgVklTSVRFRDIgPSAyMDQ4OworCisgICAgLyoqCisgICAgICogRmllbGQgdXNlZCB0byBhc3NvY2lhdGUgdXNlciBpbmZvcm1hdGlvbiB0byBhIGxhYmVsLiBXYXJuaW5nOiB0aGlzIGZpZWxkCisgICAgICogaXMgdXNlZCBieSB0aGUgQVNNIHRyZWUgcGFja2FnZS4gSW4gb3JkZXIgdG8gdXNlIGl0IHdpdGggdGhlIEFTTSB0cmVlCisgICAgICogcGFja2FnZSB5b3UgbXVzdCBvdmVycmlkZSB0aGUge0BsaW5rCisgICAgICogamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLnRyZWUuTWV0aG9kTm9kZSNnZXRMYWJlbE5vZGV9IG1ldGhvZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGluZm87CisKKyAgICAvKioKKyAgICAgKiBGbGFncyB0aGF0IGluZGljYXRlIHRoZSBzdGF0dXMgb2YgdGhpcyBsYWJlbC4KKyAgICAgKgorICAgICAqIEBzZWUgI0RFQlVHCisgICAgICogQHNlZSAjUkVTT0xWRUQKKyAgICAgKiBAc2VlICNSRVNJWkVECisgICAgICogQHNlZSAjUFVTSEVECisgICAgICogQHNlZSAjVEFSR0VUCisgICAgICogQHNlZSAjU1RPUkUKKyAgICAgKiBAc2VlICNSRUFDSEFCTEUKKyAgICAgKiBAc2VlICNKU1IKKyAgICAgKiBAc2VlICNSRVQKKyAgICAgKi8KKyAgICBpbnQgc3RhdHVzOworCisgICAgLyoqCisgICAgICogVGhlIGxpbmUgbnVtYmVyIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBsYWJlbCwgaWYga25vd24uCisgICAgICovCisgICAgaW50IGxpbmU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcG9zaXRpb24gb2YgdGhpcyBsYWJlbCBpbiB0aGUgY29kZSwgaWYga25vd24uCisgICAgICovCisgICAgaW50IHBvc2l0aW9uOworCisgICAgLyoqCisgICAgICogTnVtYmVyIG9mIGZvcndhcmQgcmVmZXJlbmNlcyB0byB0aGlzIGxhYmVsLCB0aW1lcyB0d28uCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgcmVmZXJlbmNlQ291bnQ7CisKKyAgICAvKioKKyAgICAgKiBJbmZvcm1hdGlvbnMgYWJvdXQgZm9yd2FyZCByZWZlcmVuY2VzLiBFYWNoIGZvcndhcmQgcmVmZXJlbmNlIGlzCisgICAgICogZGVzY3JpYmVkIGJ5IHR3byBjb25zZWN1dGl2ZSBpbnRlZ2VycyBpbiB0aGlzIGFycmF5OiB0aGUgZmlyc3Qgb25lIGlzIHRoZQorICAgICAqIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBieXRlY29kZSBpbnN0cnVjdGlvbiB0aGF0IGNvbnRhaW5zIHRoZQorICAgICAqIGZvcndhcmQgcmVmZXJlbmNlLCB3aGlsZSB0aGUgc2Vjb25kIGlzIHRoZSBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgYnl0ZSBvZgorICAgICAqIHRoZSBmb3J3YXJkIHJlZmVyZW5jZSBpdHNlbGYuIEluIGZhY3QgdGhlIHNpZ24gb2YgdGhlIGZpcnN0IGludGVnZXIKKyAgICAgKiBpbmRpY2F0ZXMgaWYgdGhpcyByZWZlcmVuY2UgdXNlcyAyIG9yIDQgYnl0ZXMsIGFuZCBpdHMgYWJzb2x1dGUgdmFsdWUKKyAgICAgKiBnaXZlcyB0aGUgcG9zaXRpb24gb2YgdGhlIGJ5dGVjb2RlIGluc3RydWN0aW9uLiBUaGlzIGFycmF5IGlzIGFsc28gdXNlZAorICAgICAqIGFzIGEgYml0c2V0IHRvIHN0b3JlIHRoZSBzdWJyb3V0aW5lcyB0byB3aGljaCBhIGJhc2ljIGJsb2NrIGJlbG9uZ3MuIFRoaXMKKyAgICAgKiBpbmZvcm1hdGlvbiBpcyBuZWVkZWQgaW4ge0BsaW5rZWQgIE1ldGhvZFdyaXRlciN2aXNpdE1heHN9LCBhZnRlciBhbGwKKyAgICAgKiBmb3J3YXJkIHJlZmVyZW5jZXMgaGF2ZSBiZWVuIHJlc29sdmVkLiBIZW5jZSB0aGUgc2FtZSBhcnJheSBjYW4gYmUgdXNlZAorICAgICAqIGZvciBib3RoIHB1cnBvc2VzIHdpdGhvdXQgcHJvYmxlbXMuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnRbXSBzcmNBbmRSZWZQb3NpdGlvbnM7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8qCisgICAgICogRmllbGRzIGZvciB0aGUgY29udHJvbCBmbG93IGFuZCBkYXRhIGZsb3cgZ3JhcGggYW5hbHlzaXMgYWxnb3JpdGhtcyAodXNlZAorICAgICAqIHRvIGNvbXB1dGUgdGhlIG1heGltdW0gc3RhY2sgc2l6ZSBvciB0aGUgc3RhY2sgbWFwIGZyYW1lcykuIEEgY29udHJvbAorICAgICAqIGZsb3cgZ3JhcGggY29udGFpbnMgb25lIG5vZGUgcGVyICJiYXNpYyBibG9jayIsIGFuZCBvbmUgZWRnZSBwZXIgImp1bXAiCisgICAgICogZnJvbSBvbmUgYmFzaWMgYmxvY2sgdG8gYW5vdGhlci4gRWFjaCBub2RlIChpLmUuLCBlYWNoIGJhc2ljIGJsb2NrKSBpcworICAgICAqIHJlcHJlc2VudGVkIGJ5IHRoZSBMYWJlbCBvYmplY3QgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24KKyAgICAgKiBvZiB0aGlzIGJhc2ljIGJsb2NrLiBFYWNoIG5vZGUgYWxzbyBzdG9yZXMgdGhlIGxpc3Qgb2YgaXRzIHN1Y2Nlc3NvcnMgaW4KKyAgICAgKiB0aGUgZ3JhcGgsIGFzIGEgbGlua2VkIGxpc3Qgb2YgRWRnZSBvYmplY3RzLgorICAgICAqCisgICAgICogVGhlIGNvbnRyb2wgZmxvdyBhbmFseXNpcyBhbGdvcml0aG1zIHVzZWQgdG8gY29tcHV0ZSB0aGUgbWF4aW11bSBzdGFjaworICAgICAqIHNpemUgb3IgdGhlIHN0YWNrIG1hcCBmcmFtZXMgYXJlIHNpbWlsYXIgYW5kIHVzZSB0d28gc3RlcHMuIFRoZSBmaXJzdAorICAgICAqIHN0ZXAsIGR1cmluZyB0aGUgdmlzaXQgb2YgZWFjaCBpbnN0cnVjdGlvbiwgYnVpbGRzIGluZm9ybWF0aW9uIGFib3V0IHRoZQorICAgICAqIHN0YXRlIG9mIHRoZSBsb2NhbCB2YXJpYWJsZXMgYW5kIHRoZSBvcGVyYW5kIHN0YWNrIGF0IHRoZSBlbmQgb2YgZWFjaAorICAgICAqIGJhc2ljIGJsb2NrLCBjYWxsZWQgdGhlICJvdXRwdXQgZnJhbWUiLCA8aT5yZWxhdGl2ZWx5PC9pPiB0byB0aGUgZnJhbWUKKyAgICAgKiBzdGF0ZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBiYXNpYyBibG9jaywgd2hpY2ggaXMgY2FsbGVkIHRoZSAiaW5wdXQKKyAgICAgKiBmcmFtZSIsIGFuZCB3aGljaCBpcyA8aT51bmtub3duPC9pPiBkdXJpbmcgdGhpcyBzdGVwLiBUaGUgc2Vjb25kIHN0ZXAsCisgICAgICogaW4ge0BsaW5rIE1ldGhvZFdyaXRlciN2aXNpdE1heHN9LCBpcyBhIGZpeCBwb2ludCBhbGdvcml0aG0gdGhhdAorICAgICAqIGNvbXB1dGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBpbnB1dCBmcmFtZSBvZiBlYWNoIGJhc2ljIGJsb2NrLCBmcm9tIHRoZQorICAgICAqIGlucHV0IHN0YXRlIG9mIHRoZSBmaXJzdCBiYXNpYyBibG9jayAoa25vd24gZnJvbSB0aGUgbWV0aG9kIHNpZ25hdHVyZSksCisgICAgICogYW5kIGJ5IHRoZSB1c2luZyB0aGUgcHJldmlvdXNseSBjb21wdXRlZCByZWxhdGl2ZSBvdXRwdXQgZnJhbWVzLgorICAgICAqCisgICAgICogVGhlIGFsZ29yaXRobSB1c2VkIHRvIGNvbXB1dGUgdGhlIG1heGltdW0gc3RhY2sgc2l6ZSBvbmx5IGNvbXB1dGVzIHRoZQorICAgICAqIHJlbGF0aXZlIG91dHB1dCBhbmQgYWJzb2x1dGUgaW5wdXQgc3RhY2sgaGVpZ2h0cywgd2hpbGUgdGhlIGFsZ29yaXRobQorICAgICAqIHVzZWQgdG8gY29tcHV0ZSBzdGFjayBtYXAgZnJhbWVzIGNvbXB1dGVzIHJlbGF0aXZlIG91dHB1dCBmcmFtZXMgYW5kCisgICAgICogYWJzb2x1dGUgaW5wdXQgZnJhbWVzLgorICAgICAqLworCisgICAgLyoqCisgICAgICogU3RhcnQgb2YgdGhlIG91dHB1dCBzdGFjayByZWxhdGl2ZWx5IHRvIHRoZSBpbnB1dCBzdGFjay4gVGhlIGV4YWN0CisgICAgICogc2VtYW50aWNzIG9mIHRoaXMgZmllbGQgZGVwZW5kcyBvbiB0aGUgYWxnb3JpdGhtIHRoYXQgaXMgdXNlZC4KKyAgICAgKgorICAgICAqIFdoZW4gb25seSB0aGUgbWF4aW11bSBzdGFjayBzaXplIGlzIGNvbXB1dGVkLCB0aGlzIGZpZWxkIGlzIHRoZSBudW1iZXIgb2YKKyAgICAgKiBlbGVtZW50cyBpbiB0aGUgaW5wdXQgc3RhY2suCisgICAgICoKKyAgICAgKiBXaGVuIHRoZSBzdGFjayBtYXAgZnJhbWVzIGFyZSBjb21wbGV0ZWx5IGNvbXB1dGVkLCB0aGlzIGZpZWxkIGlzIHRoZQorICAgICAqIG9mZnNldCBvZiB0aGUgZmlyc3Qgb3V0cHV0IHN0YWNrIGVsZW1lbnQgcmVsYXRpdmVseSB0byB0aGUgdG9wIG9mIHRoZQorICAgICAqIGlucHV0IHN0YWNrLiBUaGlzIG9mZnNldCBpcyBhbHdheXMgbmVnYXRpdmUgb3IgbnVsbC4gQSBudWxsIG9mZnNldCBtZWFucworICAgICAqIHRoYXQgdGhlIG91dHB1dCBzdGFjayBtdXN0IGJlIGFwcGVuZGVkIHRvIHRoZSBpbnB1dCBzdGFjay4gQSAtbiBvZmZzZXQKKyAgICAgKiBtZWFucyB0aGF0IHRoZSBmaXJzdCBuIG91dHB1dCBzdGFjayBlbGVtZW50cyBtdXN0IHJlcGxhY2UgdGhlIHRvcCBuIGlucHV0CisgICAgICogc3RhY2sgZWxlbWVudHMsIGFuZCB0aGF0IHRoZSBvdGhlciBlbGVtZW50cyBtdXN0IGJlIGFwcGVuZGVkIHRvIHRoZSBpbnB1dAorICAgICAqIHN0YWNrLgorICAgICAqLworICAgIGludCBpbnB1dFN0YWNrVG9wOworCisgICAgLyoqCisgICAgICogTWF4aW11bSBoZWlnaHQgcmVhY2hlZCBieSB0aGUgb3V0cHV0IHN0YWNrLCByZWxhdGl2ZWx5IHRvIHRoZSB0b3Agb2YgdGhlCisgICAgICogaW5wdXQgc3RhY2suIFRoaXMgbWF4aW11bSBpcyBhbHdheXMgcG9zaXRpdmUgb3IgbnVsbC4KKyAgICAgKi8KKyAgICBpbnQgb3V0cHV0U3RhY2tNYXg7CisKKyAgICAvKioKKyAgICAgKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgaW5wdXQgYW5kIG91dHB1dCBzdGFjayBtYXAgZnJhbWVzIG9mIHRoaXMgYmFzaWMKKyAgICAgKiBibG9jay4gVGhpcyBmaWVsZCBpcyBvbmx5IHVzZWQgd2hlbiB7QGxpbmsgQ2xhc3NXcml0ZXIjQ09NUFVURV9GUkFNRVN9CisgICAgICogb3B0aW9uIGlzIHVzZWQuCisgICAgICovCisgICAgRnJhbWUgZnJhbWU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc3VjY2Vzc29yIG9mIHRoaXMgbGFiZWwsIGluIHRoZSBvcmRlciB0aGV5IGFyZSB2aXNpdGVkLiBUaGlzIGxpbmtlZAorICAgICAqIGxpc3QgZG9lcyBub3QgaW5jbHVkZSBsYWJlbHMgdXNlZCBmb3IgZGVidWcgaW5mbyBvbmx5LiBJZgorICAgICAqIHtAbGluayBDbGFzc1dyaXRlciNDT01QVVRFX0ZSQU1FU30gb3B0aW9uIGlzIHVzZWQgdGhlbiwgaW4gYWRkaXRpb24sIGl0CisgICAgICogZG9lcyBub3QgY29udGFpbiBzdWNjZXNzaXZlIGxhYmVscyB0aGF0IGRlbm90ZSB0aGUgc2FtZSBieXRlY29kZSBwb3NpdGlvbgorICAgICAqIChpbiB0aGlzIGNhc2Ugb25seSB0aGUgZmlyc3QgbGFiZWwgYXBwZWFycyBpbiB0aGlzIGxpc3QpLgorICAgICAqLworICAgIExhYmVsIHN1Y2Nlc3NvcjsKKworICAgIC8qKgorICAgICAqIFRoZSBzdWNjZXNzb3JzIG9mIHRoaXMgbm9kZSBpbiB0aGUgY29udHJvbCBmbG93IGdyYXBoLiBUaGVzZSBzdWNjZXNzb3JzCisgICAgICogYXJlIHN0b3JlZCBpbiBhIGxpbmtlZCBsaXN0IG9mIHtAbGluayBFZGdlIEVkZ2V9IG9iamVjdHMsIGxpbmtlZCB0byBlYWNoCisgICAgICogb3RoZXIgYnkgdGhlaXIge0BsaW5rIEVkZ2UjbmV4dH0gZmllbGQuCisgICAgICovCisgICAgRWRnZSBzdWNjZXNzb3JzOworCisgICAgLyoqCisgICAgICogVGhlIG5leHQgYmFzaWMgYmxvY2sgaW4gdGhlIGJhc2ljIGJsb2NrIHN0YWNrLiBUaGlzIHN0YWNrIGlzIHVzZWQgaW4gdGhlCisgICAgICogbWFpbiBsb29wIG9mIHRoZSBmaXggcG9pbnQgYWxnb3JpdGhtIHVzZWQgaW4gdGhlIHNlY29uZCBzdGVwIG9mIHRoZQorICAgICAqIGNvbnRyb2wgZmxvdyBhbmFseXNpcyBhbGdvcml0aG1zLiBJdCBpcyBhbHNvIHVzZWQgaW4KKyAgICAgKiB7QGxpbmsgI3Zpc2l0U3Vicm91dGluZX0gdG8gYXZvaWQgdXNpbmcgYSByZWN1cnNpdmUgbWV0aG9kLgorICAgICAqCisgICAgICogQHNlZSBNZXRob2RXcml0ZXIjdmlzaXRNYXhzCisgICAgICovCisgICAgTGFiZWwgbmV4dDsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIENvbnN0cnVjdG9yCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGxhYmVsLgorICAgICAqLworICAgIHB1YmxpYyBMYWJlbCgpIHsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBNZXRob2RzIHRvIGNvbXB1dGUgb2Zmc2V0cyBhbmQgdG8gbWFuYWdlIGZvcndhcmQgcmVmZXJlbmNlcworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgb2Zmc2V0IGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBsYWJlbC4gVGhpcyBvZmZzZXQgaXMgY29tcHV0ZWQKKyAgICAgKiBmcm9tIHRoZSBzdGFydCBvZiB0aGUgbWV0aG9kJ3MgYnl0ZWNvZGUuIDxpPlRoaXMgbWV0aG9kIGlzIGludGVuZGVkIGZvcgorICAgICAqIHtAbGluayBBdHRyaWJ1dGV9IHN1YiBjbGFzc2VzLCBhbmQgaXMgbm9ybWFsbHkgbm90IG5lZWRlZCBieSBjbGFzcworICAgICAqIGdlbmVyYXRvcnMgb3IgYWRhcHRlcnMuPC9pPgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgb2Zmc2V0IGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBsYWJlbC4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGlzIGxhYmVsIGlzIG5vdCByZXNvbHZlZCB5ZXQuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRPZmZzZXQoKSB7CisgICAgICAgIGlmICgoc3RhdHVzICYgUkVTT0xWRUQpID09IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkxhYmVsIG9mZnNldCBwb3NpdGlvbiBoYXMgbm90IGJlZW4gcmVzb2x2ZWQgeWV0Iik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBvc2l0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFB1dHMgYSByZWZlcmVuY2UgdG8gdGhpcyBsYWJlbCBpbiB0aGUgYnl0ZWNvZGUgb2YgYSBtZXRob2QuIElmIHRoZQorICAgICAqIHBvc2l0aW9uIG9mIHRoZSBsYWJlbCBpcyBrbm93biwgdGhlIG9mZnNldCBpcyBjb21wdXRlZCBhbmQgd3JpdHRlbgorICAgICAqIGRpcmVjdGx5LiBPdGhlcndpc2UsIGEgbnVsbCBvZmZzZXQgaXMgd3JpdHRlbiBhbmQgYSBuZXcgZm9yd2FyZCByZWZlcmVuY2UKKyAgICAgKiBpcyBkZWNsYXJlZCBmb3IgdGhpcyBsYWJlbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvd25lciB0aGUgY29kZSB3cml0ZXIgdGhhdCBjYWxscyB0aGlzIG1ldGhvZC4KKyAgICAgKiBAcGFyYW0gb3V0IHRoZSBieXRlY29kZSBvZiB0aGUgbWV0aG9kLgorICAgICAqIEBwYXJhbSBzb3VyY2UgdGhlIHBvc2l0aW9uIG9mIGZpcnN0IGJ5dGUgb2YgdGhlIGJ5dGVjb2RlIGluc3RydWN0aW9uIHRoYXQKKyAgICAgKiAgICAgICAgY29udGFpbnMgdGhpcyBsYWJlbC4KKyAgICAgKiBAcGFyYW0gd2lkZU9mZnNldCA8dHQ+dHJ1ZTwvdHQ+IGlmIHRoZSByZWZlcmVuY2UgbXVzdCBiZSBzdG9yZWQgaW4gNAorICAgICAqICAgICAgICBieXRlcywgb3IgPHR0PmZhbHNlPC90dD4gaWYgaXQgbXVzdCBiZSBzdG9yZWQgd2l0aCAyIGJ5dGVzLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoaXMgbGFiZWwgaGFzIG5vdCBiZWVuIGNyZWF0ZWQgYnkKKyAgICAgKiAgICAgICAgIHRoZSBnaXZlbiBjb2RlIHdyaXRlci4KKyAgICAgKi8KKyAgICB2b2lkIHB1dCgKKyAgICAgICAgZmluYWwgTWV0aG9kV3JpdGVyIG93bmVyLAorICAgICAgICBmaW5hbCBCeXRlVmVjdG9yIG91dCwKKyAgICAgICAgZmluYWwgaW50IHNvdXJjZSwKKyAgICAgICAgZmluYWwgYm9vbGVhbiB3aWRlT2Zmc2V0KQorICAgIHsKKyAgICAgICAgaWYgKChzdGF0dXMgJiBSRVNPTFZFRCkgPT0gMCkgeworICAgICAgICAgICAgaWYgKHdpZGVPZmZzZXQpIHsKKyAgICAgICAgICAgICAgICBhZGRSZWZlcmVuY2UoLTEgLSBzb3VyY2UsIG91dC5sZW5ndGgpOworICAgICAgICAgICAgICAgIG91dC5wdXRJbnQoLTEpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhZGRSZWZlcmVuY2Uoc291cmNlLCBvdXQubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBvdXQucHV0U2hvcnQoLTEpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHdpZGVPZmZzZXQpIHsKKyAgICAgICAgICAgICAgICBvdXQucHV0SW50KHBvc2l0aW9uIC0gc291cmNlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb3V0LnB1dFNob3J0KHBvc2l0aW9uIC0gc291cmNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBmb3J3YXJkIHJlZmVyZW5jZSB0byB0aGlzIGxhYmVsLiBUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBvbmx5CisgICAgICogZm9yIGEgdHJ1ZSBmb3J3YXJkIHJlZmVyZW5jZSwgaS5lLiBvbmx5IGlmIHRoaXMgbGFiZWwgaXMgbm90IHJlc29sdmVkCisgICAgICogeWV0LiBGb3IgYmFja3dhcmQgcmVmZXJlbmNlcywgdGhlIG9mZnNldCBvZiB0aGUgcmVmZXJlbmNlIGNhbiBiZSwgYW5kCisgICAgICogbXVzdCBiZSwgY29tcHV0ZWQgYW5kIHN0b3JlZCBkaXJlY3RseS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzb3VyY2VQb3NpdGlvbiB0aGUgcG9zaXRpb24gb2YgdGhlIHJlZmVyZW5jaW5nIGluc3RydWN0aW9uLiBUaGlzCisgICAgICogICAgICAgIHBvc2l0aW9uIHdpbGwgYmUgdXNlZCB0byBjb21wdXRlIHRoZSBvZmZzZXQgb2YgdGhpcyBmb3J3YXJkCisgICAgICogICAgICAgIHJlZmVyZW5jZS4KKyAgICAgKiBAcGFyYW0gcmVmZXJlbmNlUG9zaXRpb24gdGhlIHBvc2l0aW9uIHdoZXJlIHRoZSBvZmZzZXQgZm9yIHRoaXMgZm9yd2FyZAorICAgICAqICAgICAgICByZWZlcmVuY2UgbXVzdCBiZSBzdG9yZWQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFkZFJlZmVyZW5jZSgKKyAgICAgICAgZmluYWwgaW50IHNvdXJjZVBvc2l0aW9uLAorICAgICAgICBmaW5hbCBpbnQgcmVmZXJlbmNlUG9zaXRpb24pCisgICAgeworICAgICAgICBpZiAoc3JjQW5kUmVmUG9zaXRpb25zID09IG51bGwpIHsKKyAgICAgICAgICAgIHNyY0FuZFJlZlBvc2l0aW9ucyA9IG5ldyBpbnRbNl07CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlZmVyZW5jZUNvdW50ID49IHNyY0FuZFJlZlBvc2l0aW9ucy5sZW5ndGgpIHsKKyAgICAgICAgICAgIGludFtdIGEgPSBuZXcgaW50W3NyY0FuZFJlZlBvc2l0aW9ucy5sZW5ndGggKyA2XTsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoc3JjQW5kUmVmUG9zaXRpb25zLAorICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICBhLAorICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICBzcmNBbmRSZWZQb3NpdGlvbnMubGVuZ3RoKTsKKyAgICAgICAgICAgIHNyY0FuZFJlZlBvc2l0aW9ucyA9IGE7CisgICAgICAgIH0KKyAgICAgICAgc3JjQW5kUmVmUG9zaXRpb25zW3JlZmVyZW5jZUNvdW50KytdID0gc291cmNlUG9zaXRpb247CisgICAgICAgIHNyY0FuZFJlZlBvc2l0aW9uc1tyZWZlcmVuY2VDb3VudCsrXSA9IHJlZmVyZW5jZVBvc2l0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc29sdmVzIGFsbCBmb3J3YXJkIHJlZmVyZW5jZXMgdG8gdGhpcyBsYWJlbC4gVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQKKyAgICAgKiB3aGVuIHRoaXMgbGFiZWwgaXMgYWRkZWQgdG8gdGhlIGJ5dGVjb2RlIG9mIHRoZSBtZXRob2QsIGkuZS4gd2hlbiBpdHMKKyAgICAgKiBwb3NpdGlvbiBiZWNvbWVzIGtub3duLiBUaGlzIG1ldGhvZCBmaWxscyBpbiB0aGUgYmxhbmtzIHRoYXQgd2hlcmUgbGVmdAorICAgICAqIGluIHRoZSBieXRlY29kZSBieSBlYWNoIGZvcndhcmQgcmVmZXJlbmNlIHByZXZpb3VzbHkgYWRkZWQgdG8gdGhpcyBsYWJlbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvd25lciB0aGUgY29kZSB3cml0ZXIgdGhhdCBjYWxscyB0aGlzIG1ldGhvZC4KKyAgICAgKiBAcGFyYW0gcG9zaXRpb24gdGhlIHBvc2l0aW9uIG9mIHRoaXMgbGFiZWwgaW4gdGhlIGJ5dGVjb2RlLgorICAgICAqIEBwYXJhbSBkYXRhIHRoZSBieXRlY29kZSBvZiB0aGUgbWV0aG9kLgorICAgICAqIEByZXR1cm4gPHR0PnRydWU8L3R0PiBpZiBhIGJsYW5rIHRoYXQgd2FzIGxlZnQgZm9yIHRoaXMgbGFiZWwgd2FzIHRvCisgICAgICogICAgICAgICBzbWFsbCB0byBzdG9yZSB0aGUgb2Zmc2V0LiBJbiBzdWNoIGEgY2FzZSB0aGUgY29ycmVzcG9uZGluZyBqdW1wCisgICAgICogICAgICAgICBpbnN0cnVjdGlvbiBpcyByZXBsYWNlZCB3aXRoIGEgcHNldWRvIGluc3RydWN0aW9uICh1c2luZyB1bnVzZWQKKyAgICAgKiAgICAgICAgIG9wY29kZXMpIHVzaW5nIGFuIHVuc2lnbmVkIHR3byBieXRlcyBvZmZzZXQuIFRoZXNlIHBzZXVkbworICAgICAqICAgICAgICAgaW5zdHJ1Y3Rpb25zIHdpbGwgbmVlZCB0byBiZSByZXBsYWNlZCB3aXRoIHRydWUgaW5zdHJ1Y3Rpb25zIHdpdGgKKyAgICAgKiAgICAgICAgIHdpZGVyIG9mZnNldHMgKDQgYnl0ZXMgaW5zdGVhZCBvZiAyKS4gVGhpcyBpcyBkb25lIGluCisgICAgICogICAgICAgICB7QGxpbmsgTWV0aG9kV3JpdGVyI3Jlc2l6ZUluc3RydWN0aW9uc30uCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhpcyBsYWJlbCBoYXMgYWxyZWFkeSBiZWVuIHJlc29sdmVkLAorICAgICAqICAgICAgICAgb3IgaWYgaXQgaGFzIG5vdCBiZWVuIGNyZWF0ZWQgYnkgdGhlIGdpdmVuIGNvZGUgd3JpdGVyLgorICAgICAqLworICAgIGJvb2xlYW4gcmVzb2x2ZSgKKyAgICAgICAgZmluYWwgTWV0aG9kV3JpdGVyIG93bmVyLAorICAgICAgICBmaW5hbCBpbnQgcG9zaXRpb24sCisgICAgICAgIGZpbmFsIGJ5dGVbXSBkYXRhKQorICAgIHsKKyAgICAgICAgYm9vbGVhbiBuZWVkVXBkYXRlID0gZmFsc2U7CisgICAgICAgIHRoaXMuc3RhdHVzIHw9IFJFU09MVkVEOworICAgICAgICB0aGlzLnBvc2l0aW9uID0gcG9zaXRpb247CisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgd2hpbGUgKGkgPCByZWZlcmVuY2VDb3VudCkgeworICAgICAgICAgICAgaW50IHNvdXJjZSA9IHNyY0FuZFJlZlBvc2l0aW9uc1tpKytdOworICAgICAgICAgICAgaW50IHJlZmVyZW5jZSA9IHNyY0FuZFJlZlBvc2l0aW9uc1tpKytdOworICAgICAgICAgICAgaW50IG9mZnNldDsKKyAgICAgICAgICAgIGlmIChzb3VyY2UgPj0gMCkgeworICAgICAgICAgICAgICAgIG9mZnNldCA9IHBvc2l0aW9uIC0gc291cmNlOworICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPCBTaG9ydC5NSU5fVkFMVUUgfHwgb2Zmc2V0ID4gU2hvcnQuTUFYX1ZBTFVFKSB7CisgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAqIGNoYW5nZXMgdGhlIG9wY29kZSBvZiB0aGUganVtcCBpbnN0cnVjdGlvbiwgaW4gb3JkZXIgdG8KKyAgICAgICAgICAgICAgICAgICAgICogYmUgYWJsZSB0byBmaW5kIGl0IGxhdGVyIChzZWUgcmVzaXplSW5zdHJ1Y3Rpb25zIGluCisgICAgICAgICAgICAgICAgICAgICAqIE1ldGhvZFdyaXRlcikuIFRoZXNlIHRlbXBvcmFyeSBvcGNvZGVzIGFyZSBzaW1pbGFyIHRvCisgICAgICAgICAgICAgICAgICAgICAqIGp1bXAgaW5zdHJ1Y3Rpb24gb3Bjb2RlcywgZXhjZXB0IHRoYXQgdGhlIDIgYnl0ZXMgb2Zmc2V0CisgICAgICAgICAgICAgICAgICAgICAqIGlzIHVuc2lnbmVkIChhbmQgY2FuIHRoZXJlZm9yZSByZXByZXNlbnQgdmFsdWVzIGZyb20gMCB0bworICAgICAgICAgICAgICAgICAgICAgKiA2NTUzNSwgd2hpY2ggaXMgc3VmZmljaWVudCBzaW5jZSB0aGUgc2l6ZSBvZiBhIG1ldGhvZCBpcworICAgICAgICAgICAgICAgICAgICAgKiBsaW1pdGVkIHRvIDY1NTM1IGJ5dGVzKS4KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGludCBvcGNvZGUgPSBkYXRhW3JlZmVyZW5jZSAtIDFdICYgMHhGRjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9wY29kZSA8PSBPcGNvZGVzLkpTUikgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hhbmdlcyBJRkVRIC4uLiBKU1IgdG8gb3Bjb2RlcyAyMDIgdG8gMjE3CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhW3JlZmVyZW5jZSAtIDFdID0gKGJ5dGUpIChvcGNvZGUgKyA0OSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGFuZ2VzIElGTlVMTCBhbmQgSUZOT05OVUxMIHRvIG9wY29kZXMgMjE4IGFuZCAyMTkKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbcmVmZXJlbmNlIC0gMV0gPSAoYnl0ZSkgKG9wY29kZSArIDIwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBuZWVkVXBkYXRlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGF0YVtyZWZlcmVuY2UrK10gPSAoYnl0ZSkgKG9mZnNldCA+Pj4gOCk7CisgICAgICAgICAgICAgICAgZGF0YVtyZWZlcmVuY2VdID0gKGJ5dGUpIG9mZnNldDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb2Zmc2V0ID0gcG9zaXRpb24gKyBzb3VyY2UgKyAxOworICAgICAgICAgICAgICAgIGRhdGFbcmVmZXJlbmNlKytdID0gKGJ5dGUpIChvZmZzZXQgPj4+IDI0KTsKKyAgICAgICAgICAgICAgICBkYXRhW3JlZmVyZW5jZSsrXSA9IChieXRlKSAob2Zmc2V0ID4+PiAxNik7CisgICAgICAgICAgICAgICAgZGF0YVtyZWZlcmVuY2UrK10gPSAoYnl0ZSkgKG9mZnNldCA+Pj4gOCk7CisgICAgICAgICAgICAgICAgZGF0YVtyZWZlcmVuY2VdID0gKGJ5dGUpIG9mZnNldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmVlZFVwZGF0ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBmaXJzdCBsYWJlbCBvZiB0aGUgc2VyaWVzIHRvIHdoaWNoIHRoaXMgbGFiZWwgYmVsb25ncy4gRm9yIGFuCisgICAgICogaXNvbGF0ZWQgbGFiZWwgb3IgZm9yIHRoZSBmaXJzdCBsYWJlbCBpbiBhIHNlcmllcyBvZiBzdWNjZXNzaXZlIGxhYmVscywKKyAgICAgKiB0aGlzIG1ldGhvZCByZXR1cm5zIHRoZSBsYWJlbCBpdHNlbGYuIEZvciBvdGhlciBsYWJlbHMgaXQgcmV0dXJucyB0aGUKKyAgICAgKiBmaXJzdCBsYWJlbCBvZiB0aGUgc2VyaWVzLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgZmlyc3QgbGFiZWwgb2YgdGhlIHNlcmllcyB0byB3aGljaCB0aGlzIGxhYmVsIGJlbG9uZ3MuCisgICAgICovCisgICAgTGFiZWwgZ2V0Rmlyc3QoKSB7CisgICAgICAgIHJldHVybiAhQ2xhc3NSZWFkZXIuRlJBTUVTIHx8IGZyYW1lID09IG51bGwgPyB0aGlzIDogZnJhbWUub3duZXI7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gTWV0aG9kcyByZWxhdGVkIHRvIHN1YnJvdXRpbmVzCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaXMgdGhpcyBiYXNpYyBibG9jayBiZWxvbmdzIHRvIHRoZSBnaXZlbiBzdWJyb3V0aW5lLgorICAgICAqCisgICAgICogQHBhcmFtIGlkIGEgc3Vicm91dGluZSBpZC4KKyAgICAgKiBAcmV0dXJuIHRydWUgaXMgdGhpcyBiYXNpYyBibG9jayBiZWxvbmdzIHRvIHRoZSBnaXZlbiBzdWJyb3V0aW5lLgorICAgICAqLworICAgIGJvb2xlYW4gaW5TdWJyb3V0aW5lKGZpbmFsIGxvbmcgaWQpIHsKKyAgICAgICAgaWYgKChzdGF0dXMgJiBMYWJlbC5WSVNJVEVEKSAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gKHNyY0FuZFJlZlBvc2l0aW9uc1soaW50KSAoaWQgPj4+IDMyKV0gJiAoaW50KSBpZCkgIT0gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgYmFzaWMgYmxvY2sgYW5kIHRoZSBnaXZlbiBvbmUgYmVsb25nIHRvIGEgY29tbW9uCisgICAgICogc3Vicm91dGluZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBibG9jayBhbm90aGVyIGJhc2ljIGJsb2NrLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGJhc2ljIGJsb2NrIGFuZCB0aGUgZ2l2ZW4gb25lIGJlbG9uZyB0byBhIGNvbW1vbgorICAgICAqICAgICAgICAgc3Vicm91dGluZS4KKyAgICAgKi8KKyAgICBib29sZWFuIGluU2FtZVN1YnJvdXRpbmUoZmluYWwgTGFiZWwgYmxvY2spIHsKKyAgICAgICAgaWYgKChzdGF0dXMgJiBWSVNJVEVEKSA9PSAwIHx8IChibG9jay5zdGF0dXMgJiBWSVNJVEVEKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcmNBbmRSZWZQb3NpdGlvbnMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIGlmICgoc3JjQW5kUmVmUG9zaXRpb25zW2ldICYgYmxvY2suc3JjQW5kUmVmUG9zaXRpb25zW2ldKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1hcmtzIHRoaXMgYmFzaWMgYmxvY2sgYXMgYmVsb25naW5nIHRvIHRoZSBnaXZlbiBzdWJyb3V0aW5lLgorICAgICAqCisgICAgICogQHBhcmFtIGlkIGEgc3Vicm91dGluZSBpZC4KKyAgICAgKiBAcGFyYW0gbmJTdWJyb3V0aW5lcyB0aGUgdG90YWwgbnVtYmVyIG9mIHN1YnJvdXRpbmVzIGluIHRoZSBtZXRob2QuCisgICAgICovCisgICAgdm9pZCBhZGRUb1N1YnJvdXRpbmUoZmluYWwgbG9uZyBpZCwgZmluYWwgaW50IG5iU3Vicm91dGluZXMpIHsKKyAgICAgICAgaWYgKChzdGF0dXMgJiBWSVNJVEVEKSA9PSAwKSB7CisgICAgICAgICAgICBzdGF0dXMgfD0gVklTSVRFRDsKKyAgICAgICAgICAgIHNyY0FuZFJlZlBvc2l0aW9ucyA9IG5ldyBpbnRbKG5iU3Vicm91dGluZXMgLSAxKSAvIDMyICsgMV07CisgICAgICAgIH0KKyAgICAgICAgc3JjQW5kUmVmUG9zaXRpb25zWyhpbnQpIChpZCA+Pj4gMzIpXSB8PSAoaW50KSBpZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kcyB0aGUgYmFzaWMgYmxvY2tzIHRoYXQgYmVsb25nIHRvIGEgZ2l2ZW4gc3Vicm91dGluZSwgYW5kIG1hcmtzIHRoZXNlCisgICAgICogYmxvY2tzIGFzIGJlbG9uZ2luZyB0byB0aGlzIHN1YnJvdXRpbmUuIFRoaXMgbWV0aG9kIGZvbGxvd3MgdGhlIGNvbnRyb2wKKyAgICAgKiBmbG93IGdyYXBoIHRvIGZpbmQgYWxsIHRoZSBibG9ja3MgdGhhdCBhcmUgcmVhY2hhYmxlIGZyb20gdGhlIGN1cnJlbnQKKyAgICAgKiBibG9jayBXSVRIT1VUIGZvbGxvd2luZyBhbnkgSlNSIHRhcmdldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBKU1IgYSBKU1IgYmxvY2sgdGhhdCBqdW1wcyB0byB0aGlzIHN1YnJvdXRpbmUuIElmIHRoaXMgSlNSIGlzIG5vdAorICAgICAqICAgICAgICBudWxsIGl0IGlzIGFkZGVkIHRvIHRoZSBzdWNjZXNzb3Igb2YgdGhlIFJFVCBibG9ja3MgZm91bmQgaW4gdGhlCisgICAgICogICAgICAgIHN1YnJvdXRpbmUuCisgICAgICogQHBhcmFtIGlkIHRoZSBpZCBvZiB0aGlzIHN1YnJvdXRpbmUuCisgICAgICogQHBhcmFtIG5iU3Vicm91dGluZXMgdGhlIHRvdGFsIG51bWJlciBvZiBzdWJyb3V0aW5lcyBpbiB0aGUgbWV0aG9kLgorICAgICAqLworICAgIHZvaWQgdmlzaXRTdWJyb3V0aW5lKGZpbmFsIExhYmVsIEpTUiwgZmluYWwgbG9uZyBpZCwgZmluYWwgaW50IG5iU3Vicm91dGluZXMpCisgICAgeworICAgICAgICAvLyB1c2VyIG1hbmFnZWQgc3RhY2sgb2YgbGFiZWxzLCB0byBhdm9pZCB1c2luZyBhIHJlY3Vyc2l2ZSBtZXRob2QKKyAgICAgICAgLy8gKHJlY3Vyc2l2aXR5IGNhbiBsZWFkIHRvIHN0YWNrIG92ZXJmbG93IHdpdGggdmVyeSBsYXJnZSBtZXRob2RzKQorICAgICAgICBMYWJlbCBzdGFjayA9IHRoaXM7CisgICAgICAgIHdoaWxlIChzdGFjayAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyByZW1vdmVzIGEgbGFiZWwgbCBmcm9tIHRoZSBzdGFjaworICAgICAgICAgICAgTGFiZWwgbCA9IHN0YWNrOworICAgICAgICAgICAgc3RhY2sgPSBsLm5leHQ7CisgICAgICAgICAgICBsLm5leHQgPSBudWxsOworCisgICAgICAgICAgICBpZiAoSlNSICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoKGwuc3RhdHVzICYgVklTSVRFRDIpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGwuc3RhdHVzIHw9IFZJU0lURUQyOworICAgICAgICAgICAgICAgIC8vIGFkZHMgSlNSIHRvIHRoZSBzdWNjZXNzb3JzIG9mIGwsIGlmIGl0IGlzIGEgUkVUIGJsb2NrCisgICAgICAgICAgICAgICAgaWYgKChsLnN0YXR1cyAmIFJFVCkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWwuaW5TYW1lU3Vicm91dGluZShKU1IpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBFZGdlIGUgPSBuZXcgRWRnZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgZS5pbmZvID0gbC5pbnB1dFN0YWNrVG9wOworICAgICAgICAgICAgICAgICAgICAgICAgZS5zdWNjZXNzb3IgPSBKU1Iuc3VjY2Vzc29ycy5zdWNjZXNzb3I7CisgICAgICAgICAgICAgICAgICAgICAgICBlLm5leHQgPSBsLnN1Y2Nlc3NvcnM7CisgICAgICAgICAgICAgICAgICAgICAgICBsLnN1Y2Nlc3NvcnMgPSBlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBpZiB0aGUgbCBibG9jayBhbHJlYWR5IGJlbG9uZ3MgdG8gc3Vicm91dGluZSAnaWQnLCBjb250aW51ZQorICAgICAgICAgICAgICAgIGlmIChsLmluU3Vicm91dGluZShpZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIG1hcmtzIHRoZSBsIGJsb2NrIGFzIGJlbG9uZ2luZyB0byBzdWJyb3V0aW5lICdpZCcKKyAgICAgICAgICAgICAgICBsLmFkZFRvU3Vicm91dGluZShpZCwgbmJTdWJyb3V0aW5lcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBwdXNoZXMgZWFjaCBzdWNjZXNzb3Igb2YgbCBvbiB0aGUgc3RhY2ssIGV4Y2VwdCBKU1IgdGFyZ2V0cworICAgICAgICAgICAgRWRnZSBlID0gbC5zdWNjZXNzb3JzOworICAgICAgICAgICAgd2hpbGUgKGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBsIGJsb2NrIGlzIGEgSlNSIGJsb2NrLCB0aGVuICdsLnN1Y2Nlc3NvcnMubmV4dCcgbGVhZHMKKyAgICAgICAgICAgICAgICAvLyB0byB0aGUgSlNSIHRhcmdldCAoc2VlIHtAbGluayAjdmlzaXRKdW1wSW5zbn0pIGFuZCBtdXN0CisgICAgICAgICAgICAgICAgLy8gdGhlcmVmb3JlIG5vdCBiZSBmb2xsb3dlZAorICAgICAgICAgICAgICAgIGlmICgobC5zdGF0dXMgJiBMYWJlbC5KU1IpID09IDAgfHwgZSAhPSBsLnN1Y2Nlc3NvcnMubmV4dCkgeworICAgICAgICAgICAgICAgICAgICAvLyBwdXNoZXMgZS5zdWNjZXNzb3Igb24gdGhlIHN0YWNrIGlmIGl0IG5vdCBhbHJlYWR5IGFkZGVkCisgICAgICAgICAgICAgICAgICAgIGlmIChlLnN1Y2Nlc3Nvci5uZXh0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGUuc3VjY2Vzc29yLm5leHQgPSBzdGFjazsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrID0gZS5zdWNjZXNzb3I7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZSA9IGUubmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIE92ZXJyaWRlbiBPYmplY3QgbWV0aG9kcworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGxhYmVsLgorICAgICAqCisgICAgICogQHJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGxhYmVsLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiTCIgKyBTeXN0ZW0uaWRlbnRpdHlIYXNoQ29kZSh0aGlzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL01ldGhvZFZpc2l0b3IuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vTWV0aG9kVmlzaXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MWY0ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL01ldGhvZFZpc2l0b3IuamF2YQpAQCAtMCwwICsxLDYxNyBAQAorLyoKKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgT3JhY2xlIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCisgKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CisgKiBxdWVzdGlvbnMuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBpcyBhdmFpbGFibGUgdW5kZXIgYW5kIGdvdmVybmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogSG93ZXZlciwgdGhlIGZvbGxvd2luZyBub3RpY2UgYWNjb21wYW5pZWQgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhpcworICogZmlsZToKKyAqCisgKiBBU006IGEgdmVyeSBzbWFsbCBhbmQgZmFzdCBKYXZhIGJ5dGVjb2RlIG1hbmlwdWxhdGlvbiBmcmFtZXdvcmsKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDExIElOUklBLCBGcmFuY2UgVGVsZWNvbQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbTsKKworLyoqCisgKiBBIHZpc2l0b3IgdG8gdmlzaXQgYSBKYXZhIG1ldGhvZC4gVGhlIG1ldGhvZHMgb2YgdGhpcyBjbGFzcyBtdXN0IGJlCisgKiBjYWxsZWQgaW4gdGhlIGZvbGxvd2luZyBvcmRlcjogWyA8dHQ+dmlzaXRBbm5vdGF0aW9uRGVmYXVsdDwvdHQ+IF0gKAorICogPHR0PnZpc2l0QW5ub3RhdGlvbjwvdHQ+IHwgPHR0PnZpc2l0UGFyYW1ldGVyQW5ub3RhdGlvbjwvdHQ+IHwKKyAqIDx0dD52aXNpdEF0dHJpYnV0ZTwvdHQ+ICkqIFsgPHR0PnZpc2l0Q29kZTwvdHQ+ICggPHR0PnZpc2l0RnJhbWU8L3R0PiB8CisgKiA8dHQ+dmlzaXQ8L3R0PjxpPlg8L2k+SW5zbjwvdHQ+IHwgPHR0PnZpc2l0TGFiZWw8L3R0PiB8IDx0dD52aXNpdFRyeUNhdGNoQmxvY2s8L3R0PiB8CisgKiA8dHQ+dmlzaXRMb2NhbFZhcmlhYmxlPC90dD4gfCA8dHQ+dmlzaXRMaW5lTnVtYmVyPC90dD4gKSogPHR0PnZpc2l0TWF4czwvdHQ+IF0KKyAqIDx0dD52aXNpdEVuZDwvdHQ+LiBJbiBhZGRpdGlvbiwgdGhlIDx0dD52aXNpdDwvdHQ+PGk+WDwvaT5JbnNuPC90dD4KKyAqIGFuZCA8dHQ+dmlzaXRMYWJlbDwvdHQ+IG1ldGhvZHMgbXVzdCBiZSBjYWxsZWQgaW4gdGhlIHNlcXVlbnRpYWwgb3JkZXIgb2YKKyAqIHRoZSBieXRlY29kZSBpbnN0cnVjdGlvbnMgb2YgdGhlIHZpc2l0ZWQgY29kZSwgPHR0PnZpc2l0VHJ5Q2F0Y2hCbG9jazwvdHQ+CisgKiBtdXN0IGJlIGNhbGxlZCA8aT5iZWZvcmU8L2k+IHRoZSBsYWJlbHMgcGFzc2VkIGFzIGFyZ3VtZW50cyBoYXZlIGJlZW4KKyAqIHZpc2l0ZWQsIGFuZCB0aGUgPHR0PnZpc2l0TG9jYWxWYXJpYWJsZTwvdHQ+IGFuZCA8dHQ+dmlzaXRMaW5lTnVtYmVyPC90dD4KKyAqIG1ldGhvZHMgbXVzdCBiZSBjYWxsZWQgPGk+YWZ0ZXI8L2k+IHRoZSBsYWJlbHMgcGFzc2VkIGFzIGFyZ3VtZW50cyBoYXZlIGJlZW4KKyAqIHZpc2l0ZWQuCisgKgorICogQGF1dGhvciBFcmljIEJydW5ldG9uCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBNZXRob2RWaXNpdG9yIHsKKworICAgIC8qKgorICAgICAqIFRoZSBBU00gQVBJIHZlcnNpb24gaW1wbGVtZW50ZWQgYnkgdGhpcyB2aXNpdG9yLiBUaGUgdmFsdWUgb2YgdGhpcyBmaWVsZAorICAgICAqIG11c3QgYmUgb25lIG9mIHtAbGluayBPcGNvZGVzI0FTTTR9LgorICAgICAqLworICAgIHByb3RlY3RlZCBmaW5hbCBpbnQgYXBpOworCisgICAgLyoqCisgICAgICogVGhlIG1ldGhvZCB2aXNpdG9yIHRvIHdoaWNoIHRoaXMgdmlzaXRvciBtdXN0IGRlbGVnYXRlIG1ldGhvZCBjYWxscy4gTWF5CisgICAgICogYmUgbnVsbC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTWV0aG9kVmlzaXRvciBtdjsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0BsaW5rIE1ldGhvZFZpc2l0b3J9LgorICAgICAqCisgICAgICogQHBhcmFtIGFwaSB0aGUgQVNNIEFQSSB2ZXJzaW9uIGltcGxlbWVudGVkIGJ5IHRoaXMgdmlzaXRvci4gTXVzdCBiZSBvbmUKKyAgICAgKiAgICAgICAgb2Yge0BsaW5rIE9wY29kZXMjQVNNNH0uCisgICAgICovCisgICAgcHVibGljIE1ldGhvZFZpc2l0b3IoZmluYWwgaW50IGFwaSkgeworICAgICAgICB0aGlzKGFwaSwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGxpbmsgTWV0aG9kVmlzaXRvcn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXBpIHRoZSBBU00gQVBJIHZlcnNpb24gaW1wbGVtZW50ZWQgYnkgdGhpcyB2aXNpdG9yLiBNdXN0IGJlIG9uZQorICAgICAqICAgICAgICBvZiB7QGxpbmsgT3Bjb2RlcyNBU000fS4KKyAgICAgKiBAcGFyYW0gbXYgdGhlIG1ldGhvZCB2aXNpdG9yIHRvIHdoaWNoIHRoaXMgdmlzaXRvciBtdXN0IGRlbGVnYXRlIG1ldGhvZAorICAgICAqICAgICAgICBjYWxscy4gTWF5IGJlIG51bGwuCisgICAgICovCisgICAgcHVibGljIE1ldGhvZFZpc2l0b3IoZmluYWwgaW50IGFwaSwgZmluYWwgTWV0aG9kVmlzaXRvciBtdikgeworICAgICAgICAvKmlmIChhcGkgIT0gT3Bjb2Rlcy5BU000KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgIH0qLworICAgICAgICB0aGlzLmFwaSA9IGFwaTsKKyAgICAgICAgdGhpcy5tdiA9IG12OworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBBbm5vdGF0aW9ucyBhbmQgbm9uIHN0YW5kYXJkIGF0dHJpYnV0ZXMKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvKioKKyAgICAgKiBWaXNpdHMgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhpcyBhbm5vdGF0aW9uIGludGVyZmFjZSBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgdmlzaXRvciB0byB0aGUgdmlzaXQgdGhlIGFjdHVhbCBkZWZhdWx0IHZhbHVlIG9mIHRoaXMKKyAgICAgKiAgICAgICAgIGFubm90YXRpb24gaW50ZXJmYWNlIG1ldGhvZCwgb3IgPHR0Pm51bGw8L3R0PiBpZiB0aGlzIHZpc2l0b3IKKyAgICAgKiAgICAgICAgIGlzIG5vdCBpbnRlcmVzdGVkIGluIHZpc2l0aW5nIHRoaXMgZGVmYXVsdCB2YWx1ZS4gVGhlICduYW1lJworICAgICAqICAgICAgICAgcGFyYW1ldGVycyBwYXNzZWQgdG8gdGhlIG1ldGhvZHMgb2YgdGhpcyBhbm5vdGF0aW9uIHZpc2l0b3IgYXJlCisgICAgICogICAgICAgICBpZ25vcmVkLiBNb3Jlb3ZlciwgZXhhY2x5IG9uZSB2aXNpdCBtZXRob2QgbXVzdCBiZSBjYWxsZWQgb24gdGhpcworICAgICAqICAgICAgICAgYW5ub3RhdGlvbiB2aXNpdG9yLCBmb2xsb3dlZCBieSB2aXNpdEVuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQW5ub3RhdGlvblZpc2l0b3IgdmlzaXRBbm5vdGF0aW9uRGVmYXVsdCgpIHsKKyAgICAgICAgaWYgKG12ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBtdi52aXNpdEFubm90YXRpb25EZWZhdWx0KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogVmlzaXRzIGFuIGFubm90YXRpb24gb2YgdGhpcyBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGVzYyB0aGUgY2xhc3MgZGVzY3JpcHRvciBvZiB0aGUgYW5ub3RhdGlvbiBjbGFzcy4KKyAgICAgKiBAcGFyYW0gdmlzaWJsZSA8dHQ+dHJ1ZTwvdHQ+IGlmIHRoZSBhbm5vdGF0aW9uIGlzIHZpc2libGUgYXQgcnVudGltZS4KKyAgICAgKiBAcmV0dXJuIGEgdmlzaXRvciB0byB2aXNpdCB0aGUgYW5ub3RhdGlvbiB2YWx1ZXMsIG9yIDx0dD5udWxsPC90dD4gaWYKKyAgICAgKiAgICAgICAgIHRoaXMgdmlzaXRvciBpcyBub3QgaW50ZXJlc3RlZCBpbiB2aXNpdGluZyB0aGlzIGFubm90YXRpb24uCisgICAgICovCisgICAgcHVibGljIEFubm90YXRpb25WaXNpdG9yIHZpc2l0QW5ub3RhdGlvbihTdHJpbmcgZGVzYywgYm9vbGVhbiB2aXNpYmxlKSB7CisgICAgICAgIGlmIChtdiAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbXYudmlzaXRBbm5vdGF0aW9uKGRlc2MsIHZpc2libGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZpc2l0cyBhbiBhbm5vdGF0aW9uIG9mIGEgcGFyYW1ldGVyIHRoaXMgbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmFtZXRlciB0aGUgcGFyYW1ldGVyIGluZGV4LgorICAgICAqIEBwYXJhbSBkZXNjIHRoZSBjbGFzcyBkZXNjcmlwdG9yIG9mIHRoZSBhbm5vdGF0aW9uIGNsYXNzLgorICAgICAqIEBwYXJhbSB2aXNpYmxlIDx0dD50cnVlPC90dD4gaWYgdGhlIGFubm90YXRpb24gaXMgdmlzaWJsZSBhdCBydW50aW1lLgorICAgICAqIEByZXR1cm4gYSB2aXNpdG9yIHRvIHZpc2l0IHRoZSBhbm5vdGF0aW9uIHZhbHVlcywgb3IgPHR0Pm51bGw8L3R0PiBpZgorICAgICAqICAgICAgICAgdGhpcyB2aXNpdG9yIGlzIG5vdCBpbnRlcmVzdGVkIGluIHZpc2l0aW5nIHRoaXMgYW5ub3RhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQW5ub3RhdGlvblZpc2l0b3IgdmlzaXRQYXJhbWV0ZXJBbm5vdGF0aW9uKAorICAgICAgICBpbnQgcGFyYW1ldGVyLAorICAgICAgICBTdHJpbmcgZGVzYywKKyAgICAgICAgYm9vbGVhbiB2aXNpYmxlKQorICAgIHsKKyAgICAgICAgaWYgKG12ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBtdi52aXNpdFBhcmFtZXRlckFubm90YXRpb24ocGFyYW1ldGVyLCBkZXNjLCB2aXNpYmxlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWaXNpdHMgYSBub24gc3RhbmRhcmQgYXR0cmlidXRlIG9mIHRoaXMgbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtIGF0dHIgYW4gYXR0cmlidXRlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZpc2l0QXR0cmlidXRlKEF0dHJpYnV0ZSBhdHRyKSB7CisgICAgICAgIGlmIChtdiAhPSBudWxsKSB7CisgICAgICAgICAgICBtdi52aXNpdEF0dHJpYnV0ZShhdHRyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0cyB0aGUgdmlzaXQgb2YgdGhlIG1ldGhvZCdzIGNvZGUsIGlmIGFueSAoaS5lLiBub24gYWJzdHJhY3QgbWV0aG9kKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB2aXNpdENvZGUoKSB7CisgICAgICAgIGlmIChtdiAhPSBudWxsKSB7CisgICAgICAgICAgICBtdi52aXNpdENvZGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFZpc2l0cyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgbG9jYWwgdmFyaWFibGVzIGFuZCBvcGVyYW5kIHN0YWNrCisgICAgICogZWxlbWVudHMuIFRoaXMgbWV0aG9kIG11c3QoKikgYmUgY2FsbGVkIDxpPmp1c3QgYmVmb3JlPC9pPiBhbnkKKyAgICAgKiBpbnN0cnVjdGlvbiA8Yj5pPC9iPiB0aGF0IGZvbGxvd3MgYW4gdW5jb25kaXRpb25hbCBicmFuY2ggaW5zdHJ1Y3Rpb24KKyAgICAgKiBzdWNoIGFzIEdPVE8gb3IgVEhST1csIHRoYXQgaXMgdGhlIHRhcmdldCBvZiBhIGp1bXAgaW5zdHJ1Y3Rpb24sIG9yIHRoYXQKKyAgICAgKiBzdGFydHMgYW4gZXhjZXB0aW9uIGhhbmRsZXIgYmxvY2suIFRoZSB2aXNpdGVkIHR5cGVzIG11c3QgZGVzY3JpYmUgdGhlCisgICAgICogdmFsdWVzIG9mIHRoZSBsb2NhbCB2YXJpYWJsZXMgYW5kIG9mIHRoZSBvcGVyYW5kIHN0YWNrIGVsZW1lbnRzIDxpPmp1c3QKKyAgICAgKiBiZWZvcmU8L2k+IDxiPmk8L2I+IGlzIGV4ZWN1dGVkLiA8YnI+IDxicj4gKCopIHRoaXMgaXMgbWFuZGF0b3J5IG9ubHkKKyAgICAgKiBmb3IgY2xhc3NlcyB3aG9zZSB2ZXJzaW9uIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0bworICAgICAqIHtAbGluayBPcGNvZGVzI1YxXzYgVjFfNn0uIDxicj4gPGJyPiBQYWNrZWQgZnJhbWVzIGFyZSBiYXNpY2FsbHkKKyAgICAgKiAiZGVsdGFzIiBmcm9tIHRoZSBzdGF0ZSBvZiB0aGUgcHJldmlvdXMgZnJhbWUgKHZlcnkgZmlyc3QgZnJhbWUgaXMKKyAgICAgKiBpbXBsaWNpdGx5IGRlZmluZWQgYnkgdGhlIG1ldGhvZCdzIHBhcmFtZXRlcnMgYW5kIGFjY2VzcyBmbGFncyk6IDx1bD4KKyAgICAgKiA8bGk+e0BsaW5rIE9wY29kZXMjRl9TQU1FfSByZXByZXNlbnRpbmcgZnJhbWUgd2l0aCBleGFjdGx5IHRoZSBzYW1lCisgICAgICogbG9jYWxzIGFzIHRoZSBwcmV2aW91cyBmcmFtZSBhbmQgd2l0aCB0aGUgZW1wdHkgc3RhY2suPC9saT4gPGxpPntAbGluayBPcGNvZGVzI0ZfU0FNRTF9CisgICAgICogcmVwcmVzZW50aW5nIGZyYW1lIHdpdGggZXhhY3RseSB0aGUgc2FtZSBsb2NhbHMgYXMgdGhlIHByZXZpb3VzIGZyYW1lIGFuZAorICAgICAqIHdpdGggc2luZ2xlIHZhbHVlIG9uIHRoZSBzdGFjayAoPGNvZGU+blN0YWNrPC9jb2RlPiBpcyAxIGFuZAorICAgICAqIDxjb2RlPnN0YWNrWzBdPC9jb2RlPiBjb250YWlucyB2YWx1ZSBmb3IgdGhlIHR5cGUgb2YgdGhlIHN0YWNrIGl0ZW0pLjwvbGk+CisgICAgICogPGxpPntAbGluayBPcGNvZGVzI0ZfQVBQRU5EfSByZXByZXNlbnRpbmcgZnJhbWUgd2l0aCBjdXJyZW50IGxvY2FscyBhcmUKKyAgICAgKiB0aGUgc2FtZSBhcyB0aGUgbG9jYWxzIGluIHRoZSBwcmV2aW91cyBmcmFtZSwgZXhjZXB0IHRoYXQgYWRkaXRpb25hbAorICAgICAqIGxvY2FscyBhcmUgZGVmaW5lZCAoPGNvZGU+bkxvY2FsPC9jb2RlPiBpcyAxLCAyIG9yIDMgYW5kCisgICAgICogPGNvZGU+bG9jYWw8L2NvZGU+IGVsZW1lbnRzIGNvbnRhaW5zIHZhbHVlcyByZXByZXNlbnRpbmcgYWRkZWQgdHlwZXMpLjwvbGk+CisgICAgICogPGxpPntAbGluayBPcGNvZGVzI0ZfQ0hPUH0gcmVwcmVzZW50aW5nIGZyYW1lIHdpdGggY3VycmVudCBsb2NhbHMgYXJlCisgICAgICogdGhlIHNhbWUgYXMgdGhlIGxvY2FscyBpbiB0aGUgcHJldmlvdXMgZnJhbWUsIGV4Y2VwdCB0aGF0IHRoZSBsYXN0IDEtMworICAgICAqIGxvY2FscyBhcmUgYWJzZW50IGFuZCB3aXRoIHRoZSBlbXB0eSBzdGFjayAoPGNvZGU+bkxvY2FsczwvY29kZT4gaXMgMSwKKyAgICAgKiAyIG9yIDMpLiA8L2xpPiA8bGk+e0BsaW5rIE9wY29kZXMjRl9GVUxMfSByZXByZXNlbnRpbmcgY29tcGxldGUgZnJhbWUKKyAgICAgKiBkYXRhLjwvbGk+IDwvbGk+IDwvdWw+CisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBvZiB0aGlzIHN0YWNrIG1hcCBmcmFtZS4gTXVzdCBiZQorICAgICAqICAgICAgICB7QGxpbmsgT3Bjb2RlcyNGX05FV30gZm9yIGV4cGFuZGVkIGZyYW1lcywgb3IKKyAgICAgKiAgICAgICAge0BsaW5rIE9wY29kZXMjRl9GVUxMfSwge0BsaW5rIE9wY29kZXMjRl9BUFBFTkR9LAorICAgICAqICAgICAgICB7QGxpbmsgT3Bjb2RlcyNGX0NIT1B9LCB7QGxpbmsgT3Bjb2RlcyNGX1NBTUV9IG9yCisgICAgICogICAgICAgIHtAbGluayBPcGNvZGVzI0ZfQVBQRU5EfSwge0BsaW5rIE9wY29kZXMjRl9TQU1FMX0gZm9yIGNvbXByZXNzZWQKKyAgICAgKiAgICAgICAgZnJhbWVzLgorICAgICAqIEBwYXJhbSBuTG9jYWwgdGhlIG51bWJlciBvZiBsb2NhbCB2YXJpYWJsZXMgaW4gdGhlIHZpc2l0ZWQgZnJhbWUuCisgICAgICogQHBhcmFtIGxvY2FsIHRoZSBsb2NhbCB2YXJpYWJsZSB0eXBlcyBpbiB0aGlzIGZyYW1lLiBUaGlzIGFycmF5IG11c3Qgbm90CisgICAgICogICAgICAgIGJlIG1vZGlmaWVkLiBQcmltaXRpdmUgdHlwZXMgYXJlIHJlcHJlc2VudGVkIGJ5CisgICAgICogICAgICAgIHtAbGluayBPcGNvZGVzI1RPUH0sIHtAbGluayBPcGNvZGVzI0lOVEVHRVJ9LAorICAgICAqICAgICAgICB7QGxpbmsgT3Bjb2RlcyNGTE9BVH0sIHtAbGluayBPcGNvZGVzI0xPTkd9LAorICAgICAqICAgICAgICB7QGxpbmsgT3Bjb2RlcyNET1VCTEV9LHtAbGluayBPcGNvZGVzI05VTEx9IG9yCisgICAgICogICAgICAgIHtAbGluayBPcGNvZGVzI1VOSU5JVElBTElaRURfVEhJU30gKGxvbmcgYW5kIGRvdWJsZSBhcmUKKyAgICAgKiAgICAgICAgcmVwcmVzZW50ZWQgYnkgYSBzaW5nbGUgZWxlbWVudCkuIFJlZmVyZW5jZSB0eXBlcyBhcmUgcmVwcmVzZW50ZWQKKyAgICAgKiAgICAgICAgYnkgU3RyaW5nIG9iamVjdHMgKHJlcHJlc2VudGluZyBpbnRlcm5hbCBuYW1lcyksIGFuZCB1bmluaXRpYWxpemVkCisgICAgICogICAgICAgIHR5cGVzIGJ5IExhYmVsIG9iamVjdHMgKHRoaXMgbGFiZWwgZGVzaWduYXRlcyB0aGUgTkVXIGluc3RydWN0aW9uCisgICAgICogICAgICAgIHRoYXQgY3JlYXRlZCB0aGlzIHVuaW5pdGlhbGl6ZWQgdmFsdWUpLgorICAgICAqIEBwYXJhbSBuU3RhY2sgdGhlIG51bWJlciBvZiBvcGVyYW5kIHN0YWNrIGVsZW1lbnRzIGluIHRoZSB2aXNpdGVkIGZyYW1lLgorICAgICAqIEBwYXJhbSBzdGFjayB0aGUgb3BlcmFuZCBzdGFjayB0eXBlcyBpbiB0aGlzIGZyYW1lLiBUaGlzIGFycmF5IG11c3Qgbm90CisgICAgICogICAgICAgIGJlIG1vZGlmaWVkLiBJdHMgY29udGVudCBoYXMgdGhlIHNhbWUgZm9ybWF0IGFzIHRoZSAibG9jYWwiIGFycmF5LgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIGEgZnJhbWUgaXMgdmlzaXRlZCBqdXN0IGFmdGVyIGFub3RoZXIKKyAgICAgKiAgICAgICAgb25lLCB3aXRob3V0IGFueSBpbnN0cnVjdGlvbiBiZXR3ZWVuIHRoZSB0d28gKHVubGVzcyB0aGlzIGZyYW1lCisgICAgICogICAgICAgIGlzIGEgT3Bjb2RlcyNGX1NBTUUgZnJhbWUsIGluIHdoaWNoIGNhc2UgaXQgaXMgc2lsZW50bHkgaWdub3JlZCkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdmlzaXRGcmFtZSgKKyAgICAgICAgaW50IHR5cGUsCisgICAgICAgIGludCBuTG9jYWwsCisgICAgICAgIE9iamVjdFtdIGxvY2FsLAorICAgICAgICBpbnQgblN0YWNrLAorICAgICAgICBPYmplY3RbXSBzdGFjaykKKyAgICB7CisgICAgICAgIGlmIChtdiAhPSBudWxsKSB7CisgICAgICAgICAgICBtdi52aXNpdEZyYW1lKHR5cGUsIG5Mb2NhbCwgbG9jYWwsIG5TdGFjaywgc3RhY2spOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIE5vcm1hbCBpbnN0cnVjdGlvbnMKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvKioKKyAgICAgKiBWaXNpdHMgYSB6ZXJvIG9wZXJhbmQgaW5zdHJ1Y3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3Bjb2RlIHRoZSBvcGNvZGUgb2YgdGhlIGluc3RydWN0aW9uIHRvIGJlIHZpc2l0ZWQuIFRoaXMgb3Bjb2RlIGlzCisgICAgICogICAgICAgIGVpdGhlciBOT1AsIEFDT05TVF9OVUxMLCBJQ09OU1RfTTEsIElDT05TVF8wLCBJQ09OU1RfMSwgSUNPTlNUXzIsCisgICAgICogICAgICAgIElDT05TVF8zLCBJQ09OU1RfNCwgSUNPTlNUXzUsIExDT05TVF8wLCBMQ09OU1RfMSwgRkNPTlNUXzAsCisgICAgICogICAgICAgIEZDT05TVF8xLCBGQ09OU1RfMiwgRENPTlNUXzAsIERDT05TVF8xLCBJQUxPQUQsIExBTE9BRCwgRkFMT0FELAorICAgICAqICAgICAgICBEQUxPQUQsIEFBTE9BRCwgQkFMT0FELCBDQUxPQUQsIFNBTE9BRCwgSUFTVE9SRSwgTEFTVE9SRSwgRkFTVE9SRSwKKyAgICAgKiAgICAgICAgREFTVE9SRSwgQUFTVE9SRSwgQkFTVE9SRSwgQ0FTVE9SRSwgU0FTVE9SRSwgUE9QLCBQT1AyLCBEVVAsCisgICAgICogICAgICAgIERVUF9YMSwgRFVQX1gyLCBEVVAyLCBEVVAyX1gxLCBEVVAyX1gyLCBTV0FQLCBJQURELCBMQURELCBGQURELAorICAgICAqICAgICAgICBEQURELCBJU1VCLCBMU1VCLCBGU1VCLCBEU1VCLCBJTVVMLCBMTVVMLCBGTVVMLCBETVVMLCBJRElWLCBMRElWLAorICAgICAqICAgICAgICBGRElWLCBERElWLCBJUkVNLCBMUkVNLCBGUkVNLCBEUkVNLCBJTkVHLCBMTkVHLCBGTkVHLCBETkVHLCBJU0hMLAorICAgICAqICAgICAgICBMU0hMLCBJU0hSLCBMU0hSLCBJVVNIUiwgTFVTSFIsIElBTkQsIExBTkQsIElPUiwgTE9SLCBJWE9SLCBMWE9SLAorICAgICAqICAgICAgICBJMkwsIEkyRiwgSTJELCBMMkksIEwyRiwgTDJELCBGMkksIEYyTCwgRjJELCBEMkksIEQyTCwgRDJGLCBJMkIsCisgICAgICogICAgICAgIEkyQywgSTJTLCBMQ01QLCBGQ01QTCwgRkNNUEcsIERDTVBMLCBEQ01QRywgSVJFVFVSTiwgTFJFVFVSTiwKKyAgICAgKiAgICAgICAgRlJFVFVSTiwgRFJFVFVSTiwgQVJFVFVSTiwgUkVUVVJOLCBBUlJBWUxFTkdUSCwgQVRIUk9XLAorICAgICAqICAgICAgICBNT05JVE9SRU5URVIsIG9yIE1PTklUT1JFWElULgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZpc2l0SW5zbihpbnQgb3Bjb2RlKSB7CisgICAgICAgIGlmIChtdiAhPSBudWxsKSB7CisgICAgICAgICAgICBtdi52aXNpdEluc24ob3Bjb2RlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFZpc2l0cyBhbiBpbnN0cnVjdGlvbiB3aXRoIGEgc2luZ2xlIGludCBvcGVyYW5kLgorICAgICAqCisgICAgICogQHBhcmFtIG9wY29kZSB0aGUgb3Bjb2RlIG9mIHRoZSBpbnN0cnVjdGlvbiB0byBiZSB2aXNpdGVkLiBUaGlzIG9wY29kZSBpcworICAgICAqICAgICAgICBlaXRoZXIgQklQVVNILCBTSVBVU0ggb3IgTkVXQVJSQVkuCisgICAgICogQHBhcmFtIG9wZXJhbmQgdGhlIG9wZXJhbmQgb2YgdGhlIGluc3RydWN0aW9uIHRvIGJlIHZpc2l0ZWQuPGJyPiBXaGVuCisgICAgICogICAgICAgIG9wY29kZSBpcyBCSVBVU0gsIG9wZXJhbmQgdmFsdWUgc2hvdWxkIGJlIGJldHdlZW4gQnl0ZS5NSU5fVkFMVUUKKyAgICAgKiAgICAgICAgYW5kIEJ5dGUuTUFYX1ZBTFVFLjxicj4gV2hlbiBvcGNvZGUgaXMgU0lQVVNILCBvcGVyYW5kIHZhbHVlCisgICAgICogICAgICAgIHNob3VsZCBiZSBiZXR3ZWVuIFNob3J0Lk1JTl9WQUxVRSBhbmQgU2hvcnQuTUFYX1ZBTFVFLjxicj4gV2hlbgorICAgICAqICAgICAgICBvcGNvZGUgaXMgTkVXQVJSQVksIG9wZXJhbmQgdmFsdWUgc2hvdWxkIGJlIG9uZSBvZgorICAgICAqICAgICAgICB7QGxpbmsgT3Bjb2RlcyNUX0JPT0xFQU59LCB7QGxpbmsgT3Bjb2RlcyNUX0NIQVJ9LAorICAgICAqICAgICAgICB7QGxpbmsgT3Bjb2RlcyNUX0ZMT0FUfSwge0BsaW5rIE9wY29kZXMjVF9ET1VCTEV9LAorICAgICAqICAgICAgICB7QGxpbmsgT3Bjb2RlcyNUX0JZVEV9LCB7QGxpbmsgT3Bjb2RlcyNUX1NIT1JUfSwKKyAgICAgKiAgICAgICAge0BsaW5rIE9wY29kZXMjVF9JTlR9IG9yIHtAbGluayBPcGNvZGVzI1RfTE9OR30uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdmlzaXRJbnRJbnNuKGludCBvcGNvZGUsIGludCBvcGVyYW5kKSB7CisgICAgICAgIGlmIChtdiAhPSBudWxsKSB7CisgICAgICAgICAgICBtdi52aXNpdEludEluc24ob3Bjb2RlLCBvcGVyYW5kKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFZpc2l0cyBhIGxvY2FsIHZhcmlhYmxlIGluc3RydWN0aW9uLiBBIGxvY2FsIHZhcmlhYmxlIGluc3RydWN0aW9uIGlzIGFuCisgICAgICogaW5zdHJ1Y3Rpb24gdGhhdCBsb2FkcyBvciBzdG9yZXMgdGhlIHZhbHVlIG9mIGEgbG9jYWwgdmFyaWFibGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3Bjb2RlIHRoZSBvcGNvZGUgb2YgdGhlIGxvY2FsIHZhcmlhYmxlIGluc3RydWN0aW9uIHRvIGJlIHZpc2l0ZWQuCisgICAgICogICAgICAgIFRoaXMgb3Bjb2RlIGlzIGVpdGhlciBJTE9BRCwgTExPQUQsIEZMT0FELCBETE9BRCwgQUxPQUQsIElTVE9SRSwKKyAgICAgKiAgICAgICAgTFNUT1JFLCBGU1RPUkUsIERTVE9SRSwgQVNUT1JFIG9yIFJFVC4KKyAgICAgKiBAcGFyYW0gdmFyIHRoZSBvcGVyYW5kIG9mIHRoZSBpbnN0cnVjdGlvbiB0byBiZSB2aXNpdGVkLiBUaGlzIG9wZXJhbmQgaXMKKyAgICAgKiAgICAgICAgdGhlIGluZGV4IG9mIGEgbG9jYWwgdmFyaWFibGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdmlzaXRWYXJJbnNuKGludCBvcGNvZGUsIGludCB2YXIpIHsKKyAgICAgICAgaWYgKG12ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG12LnZpc2l0VmFySW5zbihvcGNvZGUsIHZhcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWaXNpdHMgYSB0eXBlIGluc3RydWN0aW9uLiBBIHR5cGUgaW5zdHJ1Y3Rpb24gaXMgYW4gaW5zdHJ1Y3Rpb24gdGhhdAorICAgICAqIHRha2VzIHRoZSBpbnRlcm5hbCBuYW1lIG9mIGEgY2xhc3MgYXMgcGFyYW1ldGVyLgorICAgICAqCisgICAgICogQHBhcmFtIG9wY29kZSB0aGUgb3Bjb2RlIG9mIHRoZSB0eXBlIGluc3RydWN0aW9uIHRvIGJlIHZpc2l0ZWQuIFRoaXMKKyAgICAgKiAgICAgICAgb3Bjb2RlIGlzIGVpdGhlciBORVcsIEFORVdBUlJBWSwgQ0hFQ0tDQVNUIG9yIElOU1RBTkNFT0YuCisgICAgICogQHBhcmFtIHR5cGUgdGhlIG9wZXJhbmQgb2YgdGhlIGluc3RydWN0aW9uIHRvIGJlIHZpc2l0ZWQuIFRoaXMgb3BlcmFuZAorICAgICAqICAgICAgICBtdXN0IGJlIHRoZSBpbnRlcm5hbCBuYW1lIG9mIGFuIG9iamVjdCBvciBhcnJheSBjbGFzcyAoc2VlIHtAbGluaworICAgICAqICAgICAgICBUeXBlI2dldEludGVybmFsTmFtZSgpIGdldEludGVybmFsTmFtZX0pLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZpc2l0VHlwZUluc24oaW50IG9wY29kZSwgU3RyaW5nIHR5cGUpIHsKKyAgICAgICAgaWYgKG12ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG12LnZpc2l0VHlwZUluc24ob3Bjb2RlLCB0eXBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFZpc2l0cyBhIGZpZWxkIGluc3RydWN0aW9uLiBBIGZpZWxkIGluc3RydWN0aW9uIGlzIGFuIGluc3RydWN0aW9uIHRoYXQKKyAgICAgKiBsb2FkcyBvciBzdG9yZXMgdGhlIHZhbHVlIG9mIGEgZmllbGQgb2YgYW4gb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIG9wY29kZSB0aGUgb3Bjb2RlIG9mIHRoZSB0eXBlIGluc3RydWN0aW9uIHRvIGJlIHZpc2l0ZWQuIFRoaXMKKyAgICAgKiAgICAgICAgb3Bjb2RlIGlzIGVpdGhlciBHRVRTVEFUSUMsIFBVVFNUQVRJQywgR0VURklFTEQgb3IgUFVURklFTEQuCisgICAgICogQHBhcmFtIG93bmVyIHRoZSBpbnRlcm5hbCBuYW1lIG9mIHRoZSBmaWVsZCdzIG93bmVyIGNsYXNzIChzZWUge0BsaW5rCisgICAgICogICAgICAgIFR5cGUjZ2V0SW50ZXJuYWxOYW1lKCkgZ2V0SW50ZXJuYWxOYW1lfSkuCisgICAgICogQHBhcmFtIG5hbWUgdGhlIGZpZWxkJ3MgbmFtZS4KKyAgICAgKiBAcGFyYW0gZGVzYyB0aGUgZmllbGQncyBkZXNjcmlwdG9yIChzZWUge0BsaW5rIFR5cGUgVHlwZX0pLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZpc2l0RmllbGRJbnNuKGludCBvcGNvZGUsIFN0cmluZyBvd25lciwgU3RyaW5nIG5hbWUsIFN0cmluZyBkZXNjKSB7CisgICAgICAgIGlmIChtdiAhPSBudWxsKSB7CisgICAgICAgICAgICBtdi52aXNpdEZpZWxkSW5zbihvcGNvZGUsIG93bmVyLCBuYW1lLCBkZXNjKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFZpc2l0cyBhIG1ldGhvZCBpbnN0cnVjdGlvbi4gQSBtZXRob2QgaW5zdHJ1Y3Rpb24gaXMgYW4gaW5zdHJ1Y3Rpb24gdGhhdAorICAgICAqIGludm9rZXMgYSBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3Bjb2RlIHRoZSBvcGNvZGUgb2YgdGhlIHR5cGUgaW5zdHJ1Y3Rpb24gdG8gYmUgdmlzaXRlZC4gVGhpcworICAgICAqICAgICAgICBvcGNvZGUgaXMgZWl0aGVyIElOVk9LRVZJUlRVQUwsIElOVk9LRVNQRUNJQUwsIElOVk9LRVNUQVRJQworICAgICAqICAgICAgICBvciBJTlZPS0VJTlRFUkZBQ0UuCisgICAgICogQHBhcmFtIG93bmVyIHRoZSBpbnRlcm5hbCBuYW1lIG9mIHRoZSBtZXRob2QncyBvd25lciBjbGFzcyAoc2VlIHtAbGluaworICAgICAqICAgICAgICBUeXBlI2dldEludGVybmFsTmFtZSgpIGdldEludGVybmFsTmFtZX0pLgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBtZXRob2QncyBuYW1lLgorICAgICAqIEBwYXJhbSBkZXNjIHRoZSBtZXRob2QncyBkZXNjcmlwdG9yIChzZWUge0BsaW5rIFR5cGUgVHlwZX0pLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZpc2l0TWV0aG9kSW5zbihpbnQgb3Bjb2RlLCBTdHJpbmcgb3duZXIsIFN0cmluZyBuYW1lLCBTdHJpbmcgZGVzYykgeworICAgICAgICBpZiAobXYgIT0gbnVsbCkgeworICAgICAgICAgICAgbXYudmlzaXRNZXRob2RJbnNuKG9wY29kZSwgb3duZXIsIG5hbWUsIGRlc2MpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVmlzaXRzIGFuIGludm9rZWR5bmFtaWMgaW5zdHJ1Y3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbWV0aG9kJ3MgbmFtZS4KKyAgICAgKiBAcGFyYW0gZGVzYyB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRvciAoc2VlIHtAbGluayBUeXBlIFR5cGV9KS4KKyAgICAgKiBAcGFyYW0gYnNtIHRoZSBib290c3RyYXAgbWV0aG9kLgorICAgICAqIEBwYXJhbSBic21BcmdzIHRoZSBib290c3RyYXAgbWV0aG9kIGNvbnN0YW50IGFyZ3VtZW50cy4gRWFjaCBhcmd1bWVudAorICAgICAqICAgICAgICBtdXN0IGJlIGFuIHtAbGluayBJbnRlZ2VyfSwge0BsaW5rIEZsb2F0fSwge0BsaW5rIExvbmd9LAorICAgICAqICAgICAgICB7QGxpbmsgRG91YmxlfSwge0BsaW5rIFN0cmluZ30sIHtAbGluayBUeXBlfSBvciB7QGxpbmsgSGFuZGxlfQorICAgICAqICAgICAgICB2YWx1ZS4gVGhpcyBtZXRob2QgaXMgYWxsb3dlZCB0byBtb2RpZnkgdGhlIGNvbnRlbnQgb2YgdGhlIGFycmF5CisgICAgICogICAgICAgIHNvIGEgY2FsbGVyIHNob3VsZCBleHBlY3QgdGhhdCB0aGlzIGFycmF5IG1heSBjaGFuZ2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdmlzaXRJbnZva2VEeW5hbWljSW5zbihTdHJpbmcgbmFtZSwgU3RyaW5nIGRlc2MsIEhhbmRsZSBic20sIE9iamVjdC4uLiBic21BcmdzKSB7CisgICAgICAgIGlmIChtdiAhPSBudWxsKSB7CisgICAgICAgICAgICBtdi52aXNpdEludm9rZUR5bmFtaWNJbnNuKG5hbWUsIGRlc2MsIGJzbSwgYnNtQXJncyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWaXNpdHMgYSBqdW1wIGluc3RydWN0aW9uLiBBIGp1bXAgaW5zdHJ1Y3Rpb24gaXMgYW4gaW5zdHJ1Y3Rpb24gdGhhdCBtYXkKKyAgICAgKiBqdW1wIHRvIGFub3RoZXIgaW5zdHJ1Y3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3Bjb2RlIHRoZSBvcGNvZGUgb2YgdGhlIHR5cGUgaW5zdHJ1Y3Rpb24gdG8gYmUgdmlzaXRlZC4gVGhpcworICAgICAqICAgICAgICBvcGNvZGUgaXMgZWl0aGVyIElGRVEsIElGTkUsIElGTFQsIElGR0UsIElGR1QsIElGTEUsIElGX0lDTVBFUSwKKyAgICAgKiAgICAgICAgSUZfSUNNUE5FLCBJRl9JQ01QTFQsIElGX0lDTVBHRSwgSUZfSUNNUEdULCBJRl9JQ01QTEUsIElGX0FDTVBFUSwKKyAgICAgKiAgICAgICAgSUZfQUNNUE5FLCBHT1RPLCBKU1IsIElGTlVMTCBvciBJRk5PTk5VTEwuCisgICAgICogQHBhcmFtIGxhYmVsIHRoZSBvcGVyYW5kIG9mIHRoZSBpbnN0cnVjdGlvbiB0byBiZSB2aXNpdGVkLiBUaGlzIG9wZXJhbmQKKyAgICAgKiAgICAgICAgaXMgYSBsYWJlbCB0aGF0IGRlc2lnbmF0ZXMgdGhlIGluc3RydWN0aW9uIHRvIHdoaWNoIHRoZSBqdW1wCisgICAgICogICAgICAgIGluc3RydWN0aW9uIG1heSBqdW1wLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZpc2l0SnVtcEluc24oaW50IG9wY29kZSwgTGFiZWwgbGFiZWwpIHsKKyAgICAgICAgaWYgKG12ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG12LnZpc2l0SnVtcEluc24ob3Bjb2RlLCBsYWJlbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWaXNpdHMgYSBsYWJlbC4gQSBsYWJlbCBkZXNpZ25hdGVzIHRoZSBpbnN0cnVjdGlvbiB0aGF0IHdpbGwgYmUgdmlzaXRlZAorICAgICAqIGp1c3QgYWZ0ZXIgaXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGFiZWwgYSB7QGxpbmsgTGFiZWwgTGFiZWx9IG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB2aXNpdExhYmVsKExhYmVsIGxhYmVsKSB7CisgICAgICAgIGlmIChtdiAhPSBudWxsKSB7CisgICAgICAgICAgICBtdi52aXNpdExhYmVsKGxhYmVsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBTcGVjaWFsIGluc3RydWN0aW9ucworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8qKgorICAgICAqIFZpc2l0cyBhIExEQyBpbnN0cnVjdGlvbi4gTm90ZSB0aGF0IG5ldyBjb25zdGFudCB0eXBlcyBtYXkgYmUgYWRkZWQgaW4KKyAgICAgKiBmdXR1cmUgdmVyc2lvbnMgb2YgdGhlIEphdmEgVmlydHVhbCBNYWNoaW5lLiBUbyBlYXNpbHkgZGV0ZWN0IG5ldworICAgICAqIGNvbnN0YW50IHR5cGVzLCBpbXBsZW1lbnRhdGlvbnMgb2YgdGhpcyBtZXRob2Qgc2hvdWxkIGNoZWNrIGZvcgorICAgICAqIHVuZXhwZWN0ZWQgY29uc3RhbnQgdHlwZXMsIGxpa2UgdGhpczoKKyAgICAgKiA8cHJlPgorICAgICAqIGlmIChjc3QgaW5zdGFuY2VvZiBJbnRlZ2VyKSB7CisgICAgICogICAvLyAuLi4KKyAgICAgKiB9IGVsc2UgaWYgKGNzdCBpbnN0YW5jZW9mIEZsb2F0KSB7CisgICAgICogICAvLyAuLi4KKyAgICAgKiB9IGVsc2UgaWYgKGNzdCBpbnN0YW5jZW9mIExvbmcpIHsKKyAgICAgKiAgIC8vIC4uLgorICAgICAqIH0gZWxzZSBpZiAoY3N0IGluc3RhbmNlb2YgRG91YmxlKSB7CisgICAgICogICAvLyAuLi4KKyAgICAgKiB9IGVsc2UgaWYgKGNzdCBpbnN0YW5jZW9mIFN0cmluZykgeworICAgICAqICAgLy8gLi4uCisgICAgICogfSBlbHNlIGlmIChjc3QgaW5zdGFuY2VvZiBUeXBlKSB7CisgICAgICogICBpbnQgc29ydCA9ICgoVHlwZSkgY3N0KS5nZXRTb3J0KCk7CisgICAgICogICBpZiAoc29ydCA9PSBUeXBlLk9CSkVDVCkgeworICAgICAqICAgICAvLyAuLi4KKyAgICAgKiAgIH0gZWxzZSBpZiAoc29ydCA9PSBUeXBlLkFSUkFZKSB7CisgICAgICogICAgIC8vIC4uLgorICAgICAqICAgfSBlbHNlIGlmIChzb3J0ID09IFR5cGUuTUVUSE9EKSB7CisgICAgICogICAgIC8vIC4uLgorICAgICAqICAgfSBlbHNlIHsKKyAgICAgKiAgICAgLy8gdGhyb3cgYW4gZXhjZXB0aW9uCisgICAgICogICB9CisgICAgICogfSBlbHNlIGlmIChjc3QgaW5zdGFuY2VvZiBIYW5kbGUpIHsKKyAgICAgKiAgIC8vIC4uLgorICAgICAqIH0gZWxzZSB7CisgICAgICogICAvLyB0aHJvdyBhbiBleGNlcHRpb24KKyAgICAgKiB9PC9wcmU+CisgICAgICoKKyAgICAgKiBAcGFyYW0gY3N0IHRoZSBjb25zdGFudCB0byBiZSBsb2FkZWQgb24gdGhlIHN0YWNrLiBUaGlzIHBhcmFtZXRlciBtdXN0IGJlCisgICAgICogICAgICAgIGEgbm9uIG51bGwge0BsaW5rIEludGVnZXJ9LCBhIHtAbGluayBGbG9hdH0sIGEge0BsaW5rIExvbmd9LCBhCisgICAgICogICAgICAgIHtAbGluayBEb3VibGV9LCBhIHtAbGluayBTdHJpbmd9LCBhIHtAbGluayBUeXBlfSBvZiBPQkpFQ1Qgb3IgQVJSQVkKKyAgICAgKiAgICAgICAgc29ydCBmb3IgPHR0Pi5jbGFzczwvdHQ+IGNvbnN0YW50cywgZm9yIGNsYXNzZXMgd2hvc2UgdmVyc2lvbiBpcworICAgICAqICAgICAgICA0OS4wLCBhIHtAbGluayBUeXBlfSBvZiBNRVRIT0Qgc29ydCBvciBhIHtAbGluayBIYW5kbGV9IGZvcgorICAgICAqICAgICAgICBNZXRob2RUeXBlIGFuZCBNZXRob2RIYW5kbGUgY29uc3RhbnRzLCBmb3IgY2xhc3NlcyB3aG9zZSB2ZXJzaW9uCisgICAgICogICAgICAgIGlzIDUxLjAuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdmlzaXRMZGNJbnNuKE9iamVjdCBjc3QpIHsKKyAgICAgICAgaWYgKG12ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG12LnZpc2l0TGRjSW5zbihjc3QpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVmlzaXRzIGFuIElJTkMgaW5zdHJ1Y3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFyIGluZGV4IG9mIHRoZSBsb2NhbCB2YXJpYWJsZSB0byBiZSBpbmNyZW1lbnRlZC4KKyAgICAgKiBAcGFyYW0gaW5jcmVtZW50IGFtb3VudCB0byBpbmNyZW1lbnQgdGhlIGxvY2FsIHZhcmlhYmxlIGJ5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZpc2l0SWluY0luc24oaW50IHZhciwgaW50IGluY3JlbWVudCkgeworICAgICAgICBpZiAobXYgIT0gbnVsbCkgeworICAgICAgICAgICAgbXYudmlzaXRJaW5jSW5zbih2YXIsIGluY3JlbWVudCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWaXNpdHMgYSBUQUJMRVNXSVRDSCBpbnN0cnVjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtaW4gdGhlIG1pbmltdW0ga2V5IHZhbHVlLgorICAgICAqIEBwYXJhbSBtYXggdGhlIG1heGltdW0ga2V5IHZhbHVlLgorICAgICAqIEBwYXJhbSBkZmx0IGJlZ2lubmluZyBvZiB0aGUgZGVmYXVsdCBoYW5kbGVyIGJsb2NrLgorICAgICAqIEBwYXJhbSBsYWJlbHMgYmVnaW5uaW5ncyBvZiB0aGUgaGFuZGxlciBibG9ja3MuIDx0dD5sYWJlbHNbaV08L3R0PiBpcworICAgICAqICAgICAgICB0aGUgYmVnaW5uaW5nIG9mIHRoZSBoYW5kbGVyIGJsb2NrIGZvciB0aGUgPHR0Pm1pbiArIGk8L3R0PiBrZXkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdmlzaXRUYWJsZVN3aXRjaEluc24oaW50IG1pbiwgaW50IG1heCwgTGFiZWwgZGZsdCwgTGFiZWwuLi4gbGFiZWxzKSB7CisgICAgICAgIGlmIChtdiAhPSBudWxsKSB7CisgICAgICAgICAgICBtdi52aXNpdFRhYmxlU3dpdGNoSW5zbihtaW4sIG1heCwgZGZsdCwgbGFiZWxzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFZpc2l0cyBhIExPT0tVUFNXSVRDSCBpbnN0cnVjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZmx0IGJlZ2lubmluZyBvZiB0aGUgZGVmYXVsdCBoYW5kbGVyIGJsb2NrLgorICAgICAqIEBwYXJhbSBrZXlzIHRoZSB2YWx1ZXMgb2YgdGhlIGtleXMuCisgICAgICogQHBhcmFtIGxhYmVscyBiZWdpbm5pbmdzIG9mIHRoZSBoYW5kbGVyIGJsb2Nrcy4gPHR0PmxhYmVsc1tpXTwvdHQ+IGlzCisgICAgICogICAgICAgIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGhhbmRsZXIgYmxvY2sgZm9yIHRoZSA8dHQ+a2V5c1tpXTwvdHQ+IGtleS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB2aXNpdExvb2t1cFN3aXRjaEluc24oTGFiZWwgZGZsdCwgaW50W10ga2V5cywgTGFiZWxbXSBsYWJlbHMpIHsKKyAgICAgICAgaWYgKG12ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG12LnZpc2l0TG9va3VwU3dpdGNoSW5zbihkZmx0LCBrZXlzLCBsYWJlbHMpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVmlzaXRzIGEgTVVMVElBTkVXQVJSQVkgaW5zdHJ1Y3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGVzYyBhbiBhcnJheSB0eXBlIGRlc2NyaXB0b3IgKHNlZSB7QGxpbmsgVHlwZSBUeXBlfSkuCisgICAgICogQHBhcmFtIGRpbXMgbnVtYmVyIG9mIGRpbWVuc2lvbnMgb2YgdGhlIGFycmF5IHRvIGFsbG9jYXRlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZpc2l0TXVsdGlBTmV3QXJyYXlJbnNuKFN0cmluZyBkZXNjLCBpbnQgZGltcykgeworICAgICAgICBpZiAobXYgIT0gbnVsbCkgeworICAgICAgICAgICAgbXYudmlzaXRNdWx0aUFOZXdBcnJheUluc24oZGVzYywgZGltcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gRXhjZXB0aW9ucyB0YWJsZSBlbnRyaWVzLCBkZWJ1ZyBpbmZvcm1hdGlvbiwgbWF4IHN0YWNrIGFuZCBtYXggbG9jYWxzCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLyoqCisgICAgICogVmlzaXRzIGEgdHJ5IGNhdGNoIGJsb2NrLgorICAgICAqCisgICAgICogQHBhcmFtIHN0YXJ0IGJlZ2lubmluZyBvZiB0aGUgZXhjZXB0aW9uIGhhbmRsZXIncyBzY29wZSAoaW5jbHVzaXZlKS4KKyAgICAgKiBAcGFyYW0gZW5kIGVuZCBvZiB0aGUgZXhjZXB0aW9uIGhhbmRsZXIncyBzY29wZSAoZXhjbHVzaXZlKS4KKyAgICAgKiBAcGFyYW0gaGFuZGxlciBiZWdpbm5pbmcgb2YgdGhlIGV4Y2VwdGlvbiBoYW5kbGVyJ3MgY29kZS4KKyAgICAgKiBAcGFyYW0gdHlwZSBpbnRlcm5hbCBuYW1lIG9mIHRoZSB0eXBlIG9mIGV4Y2VwdGlvbnMgaGFuZGxlZCBieSB0aGUKKyAgICAgKiAgICAgICAgaGFuZGxlciwgb3IgPHR0Pm51bGw8L3R0PiB0byBjYXRjaCBhbnkgZXhjZXB0aW9ucyAoZm9yICJmaW5hbGx5IgorICAgICAqICAgICAgICBibG9ja3MpLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIG9uZSBvZiB0aGUgbGFiZWxzIGhhcyBhbHJlYWR5IGJlZW4KKyAgICAgKiAgICAgICAgIHZpc2l0ZWQgYnkgdGhpcyB2aXNpdG9yIChieSB0aGUge0BsaW5rICN2aXNpdExhYmVsIHZpc2l0TGFiZWx9CisgICAgICogICAgICAgICBtZXRob2QpLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZpc2l0VHJ5Q2F0Y2hCbG9jayhMYWJlbCBzdGFydCwgTGFiZWwgZW5kLCBMYWJlbCBoYW5kbGVyLCBTdHJpbmcgdHlwZSkgeworICAgICAgICBpZiAobXYgIT0gbnVsbCkgeworICAgICAgICAgICAgbXYudmlzaXRUcnlDYXRjaEJsb2NrKHN0YXJ0LCBlbmQsIGhhbmRsZXIsIHR5cGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVmlzaXRzIGEgbG9jYWwgdmFyaWFibGUgZGVjbGFyYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiBhIGxvY2FsIHZhcmlhYmxlLgorICAgICAqIEBwYXJhbSBkZXNjIHRoZSB0eXBlIGRlc2NyaXB0b3Igb2YgdGhpcyBsb2NhbCB2YXJpYWJsZS4KKyAgICAgKiBAcGFyYW0gc2lnbmF0dXJlIHRoZSB0eXBlIHNpZ25hdHVyZSBvZiB0aGlzIGxvY2FsIHZhcmlhYmxlLiBNYXkgYmUKKyAgICAgKiAgICAgICAgPHR0Pm51bGw8L3R0PiBpZiB0aGUgbG9jYWwgdmFyaWFibGUgdHlwZSBkb2VzIG5vdCB1c2UgZ2VuZXJpYworICAgICAqICAgICAgICB0eXBlcy4KKyAgICAgKiBAcGFyYW0gc3RhcnQgdGhlIGZpcnN0IGluc3RydWN0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNjb3BlIG9mIHRoaXMKKyAgICAgKiAgICAgICAgbG9jYWwgdmFyaWFibGUgKGluY2x1c2l2ZSkuCisgICAgICogQHBhcmFtIGVuZCB0aGUgbGFzdCBpbnN0cnVjdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBzY29wZSBvZiB0aGlzIGxvY2FsCisgICAgICogICAgICAgIHZhcmlhYmxlIChleGNsdXNpdmUpLgorICAgICAqIEBwYXJhbSBpbmRleCB0aGUgbG9jYWwgdmFyaWFibGUncyBpbmRleC4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBvbmUgb2YgdGhlIGxhYmVscyBoYXMgbm90IGFscmVhZHkKKyAgICAgKiAgICAgICAgIGJlZW4gdmlzaXRlZCBieSB0aGlzIHZpc2l0b3IgKGJ5IHRoZQorICAgICAqICAgICAgICAge0BsaW5rICN2aXNpdExhYmVsIHZpc2l0TGFiZWx9IG1ldGhvZCkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdmlzaXRMb2NhbFZhcmlhYmxlKAorICAgICAgICBTdHJpbmcgbmFtZSwKKyAgICAgICAgU3RyaW5nIGRlc2MsCisgICAgICAgIFN0cmluZyBzaWduYXR1cmUsCisgICAgICAgIExhYmVsIHN0YXJ0LAorICAgICAgICBMYWJlbCBlbmQsCisgICAgICAgIGludCBpbmRleCkKKyAgICB7CisgICAgICAgIGlmIChtdiAhPSBudWxsKSB7CisgICAgICAgICAgICBtdi52aXNpdExvY2FsVmFyaWFibGUobmFtZSwgZGVzYywgc2lnbmF0dXJlLCBzdGFydCwgZW5kLCBpbmRleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWaXNpdHMgYSBsaW5lIG51bWJlciBkZWNsYXJhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaW5lIGEgbGluZSBudW1iZXIuIFRoaXMgbnVtYmVyIHJlZmVycyB0byB0aGUgc291cmNlIGZpbGUgZnJvbQorICAgICAqICAgICAgICB3aGljaCB0aGUgY2xhc3Mgd2FzIGNvbXBpbGVkLgorICAgICAqIEBwYXJhbSBzdGFydCB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24gY29ycmVzcG9uZGluZyB0byB0aGlzIGxpbmUgbnVtYmVyLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIDx0dD5zdGFydDwvdHQ+IGhhcyBub3QgYWxyZWFkeSBiZWVuCisgICAgICogICAgICAgICB2aXNpdGVkIGJ5IHRoaXMgdmlzaXRvciAoYnkgdGhlIHtAbGluayAjdmlzaXRMYWJlbCB2aXNpdExhYmVsfQorICAgICAqICAgICAgICAgbWV0aG9kKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB2aXNpdExpbmVOdW1iZXIoaW50IGxpbmUsIExhYmVsIHN0YXJ0KSB7CisgICAgICAgIGlmIChtdiAhPSBudWxsKSB7CisgICAgICAgICAgICBtdi52aXNpdExpbmVOdW1iZXIobGluZSwgc3RhcnQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVmlzaXRzIHRoZSBtYXhpbXVtIHN0YWNrIHNpemUgYW5kIHRoZSBtYXhpbXVtIG51bWJlciBvZiBsb2NhbCB2YXJpYWJsZXMKKyAgICAgKiBvZiB0aGUgbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtIG1heFN0YWNrIG1heGltdW0gc3RhY2sgc2l6ZSBvZiB0aGUgbWV0aG9kLgorICAgICAqIEBwYXJhbSBtYXhMb2NhbHMgbWF4aW11bSBudW1iZXIgb2YgbG9jYWwgdmFyaWFibGVzIGZvciB0aGUgbWV0aG9kLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZpc2l0TWF4cyhpbnQgbWF4U3RhY2ssIGludCBtYXhMb2NhbHMpIHsKKyAgICAgICAgaWYgKG12ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG12LnZpc2l0TWF4cyhtYXhTdGFjaywgbWF4TG9jYWxzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFZpc2l0cyB0aGUgZW5kIG9mIHRoZSBtZXRob2QuIFRoaXMgbWV0aG9kLCB3aGljaCBpcyB0aGUgbGFzdCBvbmUgdG8gYmUKKyAgICAgKiBjYWxsZWQsIGlzIHVzZWQgdG8gaW5mb3JtIHRoZSB2aXNpdG9yIHRoYXQgYWxsIHRoZSBhbm5vdGF0aW9ucyBhbmQKKyAgICAgKiBhdHRyaWJ1dGVzIG9mIHRoZSBtZXRob2QgaGF2ZSBiZWVuIHZpc2l0ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdmlzaXRFbmQoKSB7CisgICAgICAgIGlmIChtdiAhPSBudWxsKSB7CisgICAgICAgICAgICBtdi52aXNpdEVuZCgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS9NZXRob2RXcml0ZXIuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vTWV0aG9kV3JpdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQzZWNiMQotLS0gL2Rldi9udWxsCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vTWV0aG9kV3JpdGVyLmphdmEKQEAgLTAsMCArMSwyNjk1IEBACisvKgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBPcmFjbGUgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKKyAqIHF1ZXN0aW9ucy4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGlzIGF2YWlsYWJsZSB1bmRlciBhbmQgZ292ZXJuZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiBIb3dldmVyLCB0aGUgZm9sbG93aW5nIG5vdGljZSBhY2NvbXBhbmllZCB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGlzCisgKiBmaWxlOgorICoKKyAqIEFTTTogYSB2ZXJ5IHNtYWxsIGFuZCBmYXN0IEphdmEgYnl0ZWNvZGUgbWFuaXB1bGF0aW9uIGZyYW1ld29yaworICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMTEgSU5SSUEsIEZyYW5jZSBUZWxlY29tCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2UgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtOworCisvKioKKyAqIEEge0BsaW5rIE1ldGhvZFZpc2l0b3J9IHRoYXQgZ2VuZXJhdGVzIG1ldGhvZHMgaW4gYnl0ZWNvZGUgZm9ybS4gRWFjaCB2aXNpdAorICogbWV0aG9kIG9mIHRoaXMgY2xhc3MgYXBwZW5kcyB0aGUgYnl0ZWNvZGUgY29ycmVzcG9uZGluZyB0byB0aGUgdmlzaXRlZAorICogaW5zdHJ1Y3Rpb24gdG8gYSBieXRlIHZlY3RvciwgaW4gdGhlIG9yZGVyIHRoZXNlIG1ldGhvZHMgYXJlIGNhbGxlZC4KKyAqCisgKiBAYXV0aG9yIEVyaWMgQnJ1bmV0b24KKyAqIEBhdXRob3IgRXVnZW5lIEt1bGVzaG92CisgKi8KK2NsYXNzIE1ldGhvZFdyaXRlciBleHRlbmRzIE1ldGhvZFZpc2l0b3IgeworCisgICAgLyoqCisgICAgICogUHNldWRvIGFjY2VzcyBmbGFnIHVzZWQgdG8gZGVub3RlIGNvbnN0cnVjdG9ycy4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IEFDQ19DT05TVFJVQ1RPUiA9IDI2MjE0NDsKKworICAgIC8qKgorICAgICAqIEZyYW1lIGhhcyBleGFjdGx5IHRoZSBzYW1lIGxvY2FscyBhcyB0aGUgcHJldmlvdXMgc3RhY2sgbWFwIGZyYW1lIGFuZAorICAgICAqIG51bWJlciBvZiBzdGFjayBpdGVtcyBpcyB6ZXJvLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgU0FNRV9GUkFNRSA9IDA7IC8vIHRvIDYzICgwLTNmKQorCisgICAgLyoqCisgICAgICogRnJhbWUgaGFzIGV4YWN0bHkgdGhlIHNhbWUgbG9jYWxzIGFzIHRoZSBwcmV2aW91cyBzdGFjayBtYXAgZnJhbWUgYW5kCisgICAgICogbnVtYmVyIG9mIHN0YWNrIGl0ZW1zIGlzIDEKKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IFNBTUVfTE9DQUxTXzFfU1RBQ0tfSVRFTV9GUkFNRSA9IDY0OyAvLyB0byAxMjcgKDQwLTdmKQorCisgICAgLyoqCisgICAgICogUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UKKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IFJFU0VSVkVEID0gMTI4OworCisgICAgLyoqCisgICAgICogRnJhbWUgaGFzIGV4YWN0bHkgdGhlIHNhbWUgbG9jYWxzIGFzIHRoZSBwcmV2aW91cyBzdGFjayBtYXAgZnJhbWUgYW5kCisgICAgICogbnVtYmVyIG9mIHN0YWNrIGl0ZW1zIGlzIDEuIE9mZnNldCBpcyBiaWdnZXIgdGhlbiA2MzsKKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IFNBTUVfTE9DQUxTXzFfU1RBQ0tfSVRFTV9GUkFNRV9FWFRFTkRFRCA9IDI0NzsgLy8gZjcKKworICAgIC8qKgorICAgICAqIEZyYW1lIHdoZXJlIGN1cnJlbnQgbG9jYWxzIGFyZSB0aGUgc2FtZSBhcyB0aGUgbG9jYWxzIGluIHRoZSBwcmV2aW91cworICAgICAqIGZyYW1lLCBleGNlcHQgdGhhdCB0aGUgayBsYXN0IGxvY2FscyBhcmUgYWJzZW50LiBUaGUgdmFsdWUgb2YgayBpcyBnaXZlbgorICAgICAqIGJ5IHRoZSBmb3JtdWxhIDI1MS1mcmFtZV90eXBlLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgQ0hPUF9GUkFNRSA9IDI0ODsgLy8gdG8gMjUwIChmOC1mQSkKKworICAgIC8qKgorICAgICAqIEZyYW1lIGhhcyBleGFjdGx5IHRoZSBzYW1lIGxvY2FscyBhcyB0aGUgcHJldmlvdXMgc3RhY2sgbWFwIGZyYW1lIGFuZAorICAgICAqIG51bWJlciBvZiBzdGFjayBpdGVtcyBpcyB6ZXJvLiBPZmZzZXQgaXMgYmlnZ2VyIHRoZW4gNjM7CisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBTQU1FX0ZSQU1FX0VYVEVOREVEID0gMjUxOyAvLyBmYgorCisgICAgLyoqCisgICAgICogRnJhbWUgd2hlcmUgY3VycmVudCBsb2NhbHMgYXJlIHRoZSBzYW1lIGFzIHRoZSBsb2NhbHMgaW4gdGhlIHByZXZpb3VzCisgICAgICogZnJhbWUsIGV4Y2VwdCB0aGF0IGsgYWRkaXRpb25hbCBsb2NhbHMgYXJlIGRlZmluZWQuIFRoZSB2YWx1ZSBvZiBrIGlzCisgICAgICogZ2l2ZW4gYnkgdGhlIGZvcm11bGEgZnJhbWVfdHlwZS0yNTEuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBBUFBFTkRfRlJBTUUgPSAyNTI7IC8vIHRvIDI1NCAvLyBmYy1mZQorCisgICAgLyoqCisgICAgICogRnVsbCBmcmFtZQorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgRlVMTF9GUkFNRSA9IDI1NTsgLy8gZmYKKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB0aGF0IHRoZSBzdGFjayBtYXAgZnJhbWVzIG11c3QgYmUgcmVjb21wdXRlZCBmcm9tIHNjcmF0Y2guIEluCisgICAgICogdGhpcyBjYXNlIHRoZSBtYXhpbXVtIHN0YWNrIHNpemUgYW5kIG51bWJlciBvZiBsb2NhbCB2YXJpYWJsZXMgaXMgYWxzbworICAgICAqIHJlY29tcHV0ZWQgZnJvbSBzY3JhdGNoLgorICAgICAqCisgICAgICogQHNlZSAjY29tcHV0ZQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGUkFNRVMgPSAwOworCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIG1heGltdW0gc3RhY2sgc2l6ZSBhbmQgbnVtYmVyIG9mIGxvY2FsIHZhcmlhYmxlcyBtdXN0CisgICAgICogYmUgYXV0b21hdGljYWxseSBjb21wdXRlZC4KKyAgICAgKgorICAgICAqIEBzZWUgI2NvbXB1dGUKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYUyA9IDE7CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgdGhhdCBub3RoaW5nIG11c3QgYmUgYXV0b21hdGljYWxseSBjb21wdXRlZC4KKyAgICAgKgorICAgICAqIEBzZWUgI2NvbXB1dGUKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTk9USElORyA9IDI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY2xhc3Mgd3JpdGVyIHRvIHdoaWNoIHRoaXMgbWV0aG9kIG11c3QgYmUgYWRkZWQuCisgICAgICovCisgICAgZmluYWwgQ2xhc3NXcml0ZXIgY3c7CisKKyAgICAvKioKKyAgICAgKiBBY2Nlc3MgZmxhZ3Mgb2YgdGhpcyBtZXRob2QuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgYWNjZXNzOworCisgICAgLyoqCisgICAgICogVGhlIGluZGV4IG9mIHRoZSBjb25zdGFudCBwb29sIGl0ZW0gdGhhdCBjb250YWlucyB0aGUgbmFtZSBvZiB0aGlzCisgICAgICogbWV0aG9kLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgaW50IG5hbWU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgaW5kZXggb2YgdGhlIGNvbnN0YW50IHBvb2wgaXRlbSB0aGF0IGNvbnRhaW5zIHRoZSBkZXNjcmlwdG9yIG9mIHRoaXMKKyAgICAgKiBtZXRob2QuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgZGVzYzsKKworICAgIC8qKgorICAgICAqIFRoZSBkZXNjcmlwdG9yIG9mIHRoaXMgbWV0aG9kLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGRlc2NyaXB0b3I7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc2lnbmF0dXJlIG9mIHRoaXMgbWV0aG9kLgorICAgICAqLworICAgIFN0cmluZyBzaWduYXR1cmU7CisKKyAgICAvKioKKyAgICAgKiBJZiBub3QgemVybywgaW5kaWNhdGVzIHRoYXQgdGhlIGNvZGUgb2YgdGhpcyBtZXRob2QgbXVzdCBiZSBjb3BpZWQgZnJvbQorICAgICAqIHRoZSBDbGFzc1JlYWRlciBhc3NvY2lhdGVkIHRvIHRoaXMgd3JpdGVyIGluIDxjb2RlPmN3LmNyPC9jb2RlPi4gTW9yZQorICAgICAqIHByZWNpc2VseSwgdGhpcyBmaWVsZCBnaXZlcyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGJ5dGUgdG8gY29waWVkIGZyb20KKyAgICAgKiA8Y29kZT5jdy5jci5iPC9jb2RlPi4KKyAgICAgKi8KKyAgICBpbnQgY2xhc3NSZWFkZXJPZmZzZXQ7CisKKyAgICAvKioKKyAgICAgKiBJZiBub3QgemVybywgaW5kaWNhdGVzIHRoYXQgdGhlIGNvZGUgb2YgdGhpcyBtZXRob2QgbXVzdCBiZSBjb3BpZWQgZnJvbQorICAgICAqIHRoZSBDbGFzc1JlYWRlciBhc3NvY2lhdGVkIHRvIHRoaXMgd3JpdGVyIGluIDxjb2RlPmN3LmNyPC9jb2RlPi4gTW9yZQorICAgICAqIHByZWNpc2VseSwgdGhpcyBmaWVsZCBnaXZlcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGNvcGllZCBmcm9tCisgICAgICogPGNvZGU+Y3cuY3IuYjwvY29kZT4uCisgICAgICovCisgICAgaW50IGNsYXNzUmVhZGVyTGVuZ3RoOworCisgICAgLyoqCisgICAgICogTnVtYmVyIG9mIGV4Y2VwdGlvbnMgdGhhdCBjYW4gYmUgdGhyb3duIGJ5IHRoaXMgbWV0aG9kLgorICAgICAqLworICAgIGludCBleGNlcHRpb25Db3VudDsKKworICAgIC8qKgorICAgICAqIFRoZSBleGNlcHRpb25zIHRoYXQgY2FuIGJlIHRocm93biBieSB0aGlzIG1ldGhvZC4gTW9yZSBwcmVjaXNlbHksIHRoaXMKKyAgICAgKiBhcnJheSBjb250YWlucyB0aGUgaW5kZXhlcyBvZiB0aGUgY29uc3RhbnQgcG9vbCBpdGVtcyB0aGF0IGNvbnRhaW4gdGhlCisgICAgICogaW50ZXJuYWwgbmFtZXMgb2YgdGhlc2UgZXhjZXB0aW9uIGNsYXNzZXMuCisgICAgICovCisgICAgaW50W10gZXhjZXB0aW9uczsKKworICAgIC8qKgorICAgICAqIFRoZSBhbm5vdGF0aW9uIGRlZmF1bHQgYXR0cmlidXRlIG9mIHRoaXMgbWV0aG9kLiBNYXkgYmUgPHR0Pm51bGw8L3R0Pi4KKyAgICAgKi8KKyAgICBwcml2YXRlIEJ5dGVWZWN0b3IgYW5uZDsKKworICAgIC8qKgorICAgICAqIFRoZSBydW50aW1lIHZpc2libGUgYW5ub3RhdGlvbnMgb2YgdGhpcyBtZXRob2QuIE1heSBiZSA8dHQ+bnVsbDwvdHQ+LgorICAgICAqLworICAgIHByaXZhdGUgQW5ub3RhdGlvbldyaXRlciBhbm5zOworCisgICAgLyoqCisgICAgICogVGhlIHJ1bnRpbWUgaW52aXNpYmxlIGFubm90YXRpb25zIG9mIHRoaXMgbWV0aG9kLiBNYXkgYmUgPHR0Pm51bGw8L3R0Pi4KKyAgICAgKi8KKyAgICBwcml2YXRlIEFubm90YXRpb25Xcml0ZXIgaWFubnM7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcnVudGltZSB2aXNpYmxlIHBhcmFtZXRlciBhbm5vdGF0aW9ucyBvZiB0aGlzIG1ldGhvZC4gTWF5IGJlCisgICAgICogPHR0Pm51bGw8L3R0Pi4KKyAgICAgKi8KKyAgICBwcml2YXRlIEFubm90YXRpb25Xcml0ZXJbXSBwYW5uczsKKworICAgIC8qKgorICAgICAqIFRoZSBydW50aW1lIGludmlzaWJsZSBwYXJhbWV0ZXIgYW5ub3RhdGlvbnMgb2YgdGhpcyBtZXRob2QuIE1heSBiZQorICAgICAqIDx0dD5udWxsPC90dD4uCisgICAgICovCisgICAgcHJpdmF0ZSBBbm5vdGF0aW9uV3JpdGVyW10gaXBhbm5zOworCisgICAgLyoqCisgICAgICogVGhlIG51bWJlciBvZiBzeW50aGV0aWMgcGFyYW1ldGVycyBvZiB0aGlzIG1ldGhvZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBzeW50aGV0aWNzOworCisgICAgLyoqCisgICAgICogVGhlIG5vbiBzdGFuZGFyZCBhdHRyaWJ1dGVzIG9mIHRoZSBtZXRob2QuCisgICAgICovCisgICAgcHJpdmF0ZSBBdHRyaWJ1dGUgYXR0cnM7CisKKyAgICAvKioKKyAgICAgKiBUaGUgYnl0ZWNvZGUgb2YgdGhpcyBtZXRob2QuCisgICAgICovCisgICAgcHJpdmF0ZSBCeXRlVmVjdG9yIGNvZGUgPSBuZXcgQnl0ZVZlY3RvcigpOworCisgICAgLyoqCisgICAgICogTWF4aW11bSBzdGFjayBzaXplIG9mIHRoaXMgbWV0aG9kLgorICAgICAqLworICAgIHByaXZhdGUgaW50IG1heFN0YWNrOworCisgICAgLyoqCisgICAgICogTWF4aW11bSBudW1iZXIgb2YgbG9jYWwgdmFyaWFibGVzIGZvciB0aGlzIG1ldGhvZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBtYXhMb2NhbHM7CisKKyAgICAvKioKKyAgICAgKiAgTnVtYmVyIG9mIGxvY2FsIHZhcmlhYmxlcyBpbiB0aGUgY3VycmVudCBzdGFjayBtYXAgZnJhbWUuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgY3VycmVudExvY2FsczsKKworICAgIC8qKgorICAgICAqIE51bWJlciBvZiBzdGFjayBtYXAgZnJhbWVzIGluIHRoZSBTdGFja01hcFRhYmxlIGF0dHJpYnV0ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBmcmFtZUNvdW50OworCisgICAgLyoqCisgICAgICogVGhlIFN0YWNrTWFwVGFibGUgYXR0cmlidXRlLgorICAgICAqLworICAgIHByaXZhdGUgQnl0ZVZlY3RvciBzdGFja01hcDsKKworICAgIC8qKgorICAgICAqIFRoZSBvZmZzZXQgb2YgdGhlIGxhc3QgZnJhbWUgdGhhdCB3YXMgd3JpdHRlbiBpbiB0aGUgU3RhY2tNYXBUYWJsZQorICAgICAqIGF0dHJpYnV0ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBwcmV2aW91c0ZyYW1lT2Zmc2V0OworCisgICAgLyoqCisgICAgICogVGhlIGxhc3QgZnJhbWUgdGhhdCB3YXMgd3JpdHRlbiBpbiB0aGUgU3RhY2tNYXBUYWJsZSBhdHRyaWJ1dGUuCisgICAgICoKKyAgICAgKiBAc2VlICNmcmFtZQorICAgICAqLworICAgIHByaXZhdGUgaW50W10gcHJldmlvdXNGcmFtZTsKKworICAgIC8qKgorICAgICAqIEluZGV4IG9mIHRoZSBuZXh0IGVsZW1lbnQgdG8gYmUgYWRkZWQgaW4ge0BsaW5rICNmcmFtZX0uCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgZnJhbWVJbmRleDsKKworICAgIC8qKgorICAgICAqIFRoZSBjdXJyZW50IHN0YWNrIG1hcCBmcmFtZS4gVGhlIGZpcnN0IGVsZW1lbnQgY29udGFpbnMgdGhlIG9mZnNldCBvZiB0aGUKKyAgICAgKiBpbnN0cnVjdGlvbiB0byB3aGljaCB0aGUgZnJhbWUgY29ycmVzcG9uZHMsIHRoZSBzZWNvbmQgZWxlbWVudCBpcyB0aGUKKyAgICAgKiBudW1iZXIgb2YgbG9jYWxzIGFuZCB0aGUgdGhpcmQgb25lIGlzIHRoZSBudW1iZXIgb2Ygc3RhY2sgZWxlbWVudHMuIFRoZQorICAgICAqIGxvY2FsIHZhcmlhYmxlcyBzdGFydCBhdCBpbmRleCAzIGFuZCBhcmUgZm9sbG93ZWQgYnkgdGhlIG9wZXJhbmQgc3RhY2sKKyAgICAgKiB2YWx1ZXMuIEluIHN1bW1hcnkgZnJhbWVbMF0gPSBvZmZzZXQsIGZyYW1lWzFdID0gbkxvY2FsLCBmcmFtZVsyXSA9CisgICAgICogblN0YWNrLCBmcmFtZVszXSA9IG5Mb2NhbC4gQWxsIHR5cGVzIGFyZSBlbmNvZGVkIGFzIGludGVnZXJzLCB3aXRoIHRoZQorICAgICAqIHNhbWUgZm9ybWF0IGFzIHRoZSBvbmUgdXNlZCBpbiB7QGxpbmsgTGFiZWx9LCBidXQgbGltaXRlZCB0byBCQVNFIHR5cGVzLgorICAgICAqLworICAgIHByaXZhdGUgaW50W10gZnJhbWU7CisKKyAgICAvKioKKyAgICAgKiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGV4Y2VwdGlvbiBoYW5kbGVyIGxpc3QuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgaGFuZGxlckNvdW50OworCisgICAgLyoqCisgICAgICogVGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIGV4Y2VwdGlvbiBoYW5kbGVyIGxpc3QuCisgICAgICovCisgICAgcHJpdmF0ZSBIYW5kbGVyIGZpcnN0SGFuZGxlcjsKKworICAgIC8qKgorICAgICAqIFRoZSBsYXN0IGVsZW1lbnQgaW4gdGhlIGV4Y2VwdGlvbiBoYW5kbGVyIGxpc3QuCisgICAgICovCisgICAgcHJpdmF0ZSBIYW5kbGVyIGxhc3RIYW5kbGVyOworCisgICAgLyoqCisgICAgICogTnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIExvY2FsVmFyaWFibGVUYWJsZSBhdHRyaWJ1dGUuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgbG9jYWxWYXJDb3VudDsKKworICAgIC8qKgorICAgICAqIFRoZSBMb2NhbFZhcmlhYmxlVGFibGUgYXR0cmlidXRlLgorICAgICAqLworICAgIHByaXZhdGUgQnl0ZVZlY3RvciBsb2NhbFZhcjsKKworICAgIC8qKgorICAgICAqIE51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBMb2NhbFZhcmlhYmxlVHlwZVRhYmxlIGF0dHJpYnV0ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBsb2NhbFZhclR5cGVDb3VudDsKKworICAgIC8qKgorICAgICAqIFRoZSBMb2NhbFZhcmlhYmxlVHlwZVRhYmxlIGF0dHJpYnV0ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIEJ5dGVWZWN0b3IgbG9jYWxWYXJUeXBlOworCisgICAgLyoqCisgICAgICogTnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIExpbmVOdW1iZXJUYWJsZSBhdHRyaWJ1dGUuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgbGluZU51bWJlckNvdW50OworCisgICAgLyoqCisgICAgICogVGhlIExpbmVOdW1iZXJUYWJsZSBhdHRyaWJ1dGUuCisgICAgICovCisgICAgcHJpdmF0ZSBCeXRlVmVjdG9yIGxpbmVOdW1iZXI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbm9uIHN0YW5kYXJkIGF0dHJpYnV0ZXMgb2YgdGhlIG1ldGhvZCdzIGNvZGUuCisgICAgICovCisgICAgcHJpdmF0ZSBBdHRyaWJ1dGUgY2F0dHJzOworCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIGlmIHNvbWUganVtcCBpbnN0cnVjdGlvbnMgYXJlIHRvbyBzbWFsbCBhbmQgbmVlZCB0byBiZSByZXNpemVkLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiByZXNpemU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbnVtYmVyIG9mIHN1YnJvdXRpbmVzIGluIHRoaXMgbWV0aG9kLgorICAgICAqLworICAgIHByaXZhdGUgaW50IHN1YnJvdXRpbmVzOworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvKgorICAgICAqIEZpZWxkcyBmb3IgdGhlIGNvbnRyb2wgZmxvdyBncmFwaCBhbmFseXNpcyBhbGdvcml0aG0gKHVzZWQgdG8gY29tcHV0ZSB0aGUKKyAgICAgKiBtYXhpbXVtIHN0YWNrIHNpemUpLiBBIGNvbnRyb2wgZmxvdyBncmFwaCBjb250YWlucyBvbmUgbm9kZSBwZXIgImJhc2ljCisgICAgICogYmxvY2siLCBhbmQgb25lIGVkZ2UgcGVyICJqdW1wIiBmcm9tIG9uZSBiYXNpYyBibG9jayB0byBhbm90aGVyLiBFYWNoCisgICAgICogbm9kZSAoaS5lLiwgZWFjaCBiYXNpYyBibG9jaykgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIExhYmVsIG9iamVjdCB0aGF0CisgICAgICogY29ycmVzcG9uZHMgdG8gdGhlIGZpcnN0IGluc3RydWN0aW9uIG9mIHRoaXMgYmFzaWMgYmxvY2suIEVhY2ggbm9kZSBhbHNvCisgICAgICogc3RvcmVzIHRoZSBsaXN0IG9mIGl0cyBzdWNjZXNzb3JzIGluIHRoZSBncmFwaCwgYXMgYSBsaW5rZWQgbGlzdCBvZiBFZGdlCisgICAgICogb2JqZWN0cy4KKyAgICAgKi8KKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB3aGF0IG11c3QgYmUgYXV0b21hdGljYWxseSBjb21wdXRlZC4KKyAgICAgKgorICAgICAqIEBzZWUgI0ZSQU1FUworICAgICAqIEBzZWUgI01BWFMKKyAgICAgKiBAc2VlICNOT1RISU5HCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgY29tcHV0ZTsKKworICAgIC8qKgorICAgICAqIEEgbGlzdCBvZiBsYWJlbHMuIFRoaXMgbGlzdCBpcyB0aGUgbGlzdCBvZiBiYXNpYyBibG9ja3MgaW4gdGhlIG1ldGhvZCwKKyAgICAgKiBpLmUuIGEgbGlzdCBvZiBMYWJlbCBvYmplY3RzIGxpbmtlZCB0byBlYWNoIG90aGVyIGJ5IHRoZWlyCisgICAgICoge0BsaW5rIExhYmVsI3N1Y2Nlc3Nvcn0gZmllbGQsIGluIHRoZSBvcmRlciB0aGV5IGFyZSB2aXNpdGVkIGJ5CisgICAgICoge0BsaW5rIE1ldGhvZFZpc2l0b3IjdmlzaXRMYWJlbH0sIGFuZCBzdGFydGluZyB3aXRoIHRoZSBmaXJzdCBiYXNpYyBibG9jay4KKyAgICAgKi8KKyAgICBwcml2YXRlIExhYmVsIGxhYmVsczsKKworICAgIC8qKgorICAgICAqIFRoZSBwcmV2aW91cyBiYXNpYyBibG9jay4KKyAgICAgKi8KKyAgICBwcml2YXRlIExhYmVsIHByZXZpb3VzQmxvY2s7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY3VycmVudCBiYXNpYyBibG9jay4KKyAgICAgKi8KKyAgICBwcml2YXRlIExhYmVsIGN1cnJlbnRCbG9jazsKKworICAgIC8qKgorICAgICAqIFRoZSAocmVsYXRpdmUpIHN0YWNrIHNpemUgYWZ0ZXIgdGhlIGxhc3QgdmlzaXRlZCBpbnN0cnVjdGlvbi4gVGhpcyBzaXplCisgICAgICogaXMgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgY3VycmVudCBiYXNpYyBibG9jaywgaS5lLiwgdGhlIHRydWUKKyAgICAgKiBzdGFjayBzaXplIGFmdGVyIHRoZSBsYXN0IHZpc2l0ZWQgaW5zdHJ1Y3Rpb24gaXMgZXF1YWwgdG8gdGhlCisgICAgICoge0BsaW5rIExhYmVsI2lucHV0U3RhY2tUb3AgYmVnaW5TdGFja1NpemV9IG9mIHRoZSBjdXJyZW50IGJhc2ljIGJsb2NrCisgICAgICogcGx1cyA8dHQ+c3RhY2tTaXplPC90dD4uCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgc3RhY2tTaXplOworCisgICAgLyoqCisgICAgICogVGhlIChyZWxhdGl2ZSkgbWF4aW11bSBzdGFjayBzaXplIGFmdGVyIHRoZSBsYXN0IHZpc2l0ZWQgaW5zdHJ1Y3Rpb24uCisgICAgICogVGhpcyBzaXplIGlzIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGN1cnJlbnQgYmFzaWMgYmxvY2ssIGkuZS4sCisgICAgICogdGhlIHRydWUgbWF4aW11bSBzdGFjayBzaXplIGFmdGVyIHRoZSBsYXN0IHZpc2l0ZWQgaW5zdHJ1Y3Rpb24gaXMgZXF1YWwKKyAgICAgKiB0byB0aGUge0BsaW5rIExhYmVsI2lucHV0U3RhY2tUb3AgYmVnaW5TdGFja1NpemV9IG9mIHRoZSBjdXJyZW50IGJhc2ljCisgICAgICogYmxvY2sgcGx1cyA8dHQ+c3RhY2tTaXplPC90dD4uCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgbWF4U3RhY2tTaXplOworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gQ29uc3RydWN0b3IKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0BsaW5rIE1ldGhvZFdyaXRlcn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY3cgdGhlIGNsYXNzIHdyaXRlciBpbiB3aGljaCB0aGUgbWV0aG9kIG11c3QgYmUgYWRkZWQuCisgICAgICogQHBhcmFtIGFjY2VzcyB0aGUgbWV0aG9kJ3MgYWNjZXNzIGZsYWdzIChzZWUge0BsaW5rIE9wY29kZXN9KS4KKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbWV0aG9kJ3MgbmFtZS4KKyAgICAgKiBAcGFyYW0gZGVzYyB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRvciAoc2VlIHtAbGluayBUeXBlfSkuCisgICAgICogQHBhcmFtIHNpZ25hdHVyZSB0aGUgbWV0aG9kJ3Mgc2lnbmF0dXJlLiBNYXkgYmUgPHR0Pm51bGw8L3R0Pi4KKyAgICAgKiBAcGFyYW0gZXhjZXB0aW9ucyB0aGUgaW50ZXJuYWwgbmFtZXMgb2YgdGhlIG1ldGhvZCdzIGV4Y2VwdGlvbnMuIE1heSBiZQorICAgICAqICAgICAgICA8dHQ+bnVsbDwvdHQ+LgorICAgICAqIEBwYXJhbSBjb21wdXRlTWF4cyA8dHQ+dHJ1ZTwvdHQ+IGlmIHRoZSBtYXhpbXVtIHN0YWNrIHNpemUgYW5kIG51bWJlcgorICAgICAqICAgICAgICBvZiBsb2NhbCB2YXJpYWJsZXMgbXVzdCBiZSBhdXRvbWF0aWNhbGx5IGNvbXB1dGVkLgorICAgICAqIEBwYXJhbSBjb21wdXRlRnJhbWVzIDx0dD50cnVlPC90dD4gaWYgdGhlIHN0YWNrIG1hcCB0YWJsZXMgbXVzdCBiZQorICAgICAqICAgICAgICByZWNvbXB1dGVkIGZyb20gc2NyYXRjaC4KKyAgICAgKi8KKyAgICBNZXRob2RXcml0ZXIoCisgICAgICAgIGZpbmFsIENsYXNzV3JpdGVyIGN3LAorICAgICAgICBmaW5hbCBpbnQgYWNjZXNzLAorICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSwKKyAgICAgICAgZmluYWwgU3RyaW5nIGRlc2MsCisgICAgICAgIGZpbmFsIFN0cmluZyBzaWduYXR1cmUsCisgICAgICAgIGZpbmFsIFN0cmluZ1tdIGV4Y2VwdGlvbnMsCisgICAgICAgIGZpbmFsIGJvb2xlYW4gY29tcHV0ZU1heHMsCisgICAgICAgIGZpbmFsIGJvb2xlYW4gY29tcHV0ZUZyYW1lcykKKyAgICB7CisgICAgICAgIHN1cGVyKE9wY29kZXMuQVNNNCk7CisgICAgICAgIGlmIChjdy5maXJzdE1ldGhvZCA9PSBudWxsKSB7CisgICAgICAgICAgICBjdy5maXJzdE1ldGhvZCA9IHRoaXM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjdy5sYXN0TWV0aG9kLm12ID0gdGhpczsKKyAgICAgICAgfQorICAgICAgICBjdy5sYXN0TWV0aG9kID0gdGhpczsKKyAgICAgICAgdGhpcy5jdyA9IGN3OworICAgICAgICB0aGlzLmFjY2VzcyA9IGFjY2VzczsKKyAgICAgICAgdGhpcy5uYW1lID0gY3cubmV3VVRGOChuYW1lKTsKKyAgICAgICAgdGhpcy5kZXNjID0gY3cubmV3VVRGOChkZXNjKTsKKyAgICAgICAgdGhpcy5kZXNjcmlwdG9yID0gZGVzYzsKKyAgICAgICAgaWYgKENsYXNzUmVhZGVyLlNJR05BVFVSRVMpIHsKKyAgICAgICAgICAgIHRoaXMuc2lnbmF0dXJlID0gc2lnbmF0dXJlOworICAgICAgICB9CisgICAgICAgIGlmIChleGNlcHRpb25zICE9IG51bGwgJiYgZXhjZXB0aW9ucy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICBleGNlcHRpb25Db3VudCA9IGV4Y2VwdGlvbnMubGVuZ3RoOworICAgICAgICAgICAgdGhpcy5leGNlcHRpb25zID0gbmV3IGludFtleGNlcHRpb25Db3VudF07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4Y2VwdGlvbkNvdW50OyArK2kpIHsKKyAgICAgICAgICAgICAgICB0aGlzLmV4Y2VwdGlvbnNbaV0gPSBjdy5uZXdDbGFzcyhleGNlcHRpb25zW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0aGlzLmNvbXB1dGUgPSBjb21wdXRlRnJhbWVzID8gRlJBTUVTIDogKGNvbXB1dGVNYXhzID8gTUFYUyA6IE5PVEhJTkcpOworICAgICAgICBpZiAoY29tcHV0ZU1heHMgfHwgY29tcHV0ZUZyYW1lcykgeworICAgICAgICAgICAgaWYgKGNvbXB1dGVGcmFtZXMgJiYgIjxpbml0PiIuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgdGhpcy5hY2Nlc3MgfD0gQUNDX0NPTlNUUlVDVE9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gdXBkYXRlcyBtYXhMb2NhbHMKKyAgICAgICAgICAgIGludCBzaXplID0gVHlwZS5nZXRBcmd1bWVudHNBbmRSZXR1cm5TaXplcyhkZXNjcmlwdG9yKSA+PiAyOworICAgICAgICAgICAgaWYgKChhY2Nlc3MgJiBPcGNvZGVzLkFDQ19TVEFUSUMpICE9IDApIHsKKyAgICAgICAgICAgICAgICAtLXNpemU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXhMb2NhbHMgPSBzaXplOworICAgICAgICAgICAgY3VycmVudExvY2FscyA9IHNpemU7CisgICAgICAgICAgICAvLyBjcmVhdGVzIGFuZCB2aXNpdHMgdGhlIGxhYmVsIGZvciB0aGUgZmlyc3QgYmFzaWMgYmxvY2sKKyAgICAgICAgICAgIGxhYmVscyA9IG5ldyBMYWJlbCgpOworICAgICAgICAgICAgbGFiZWxzLnN0YXR1cyB8PSBMYWJlbC5QVVNIRUQ7CisgICAgICAgICAgICB2aXNpdExhYmVsKGxhYmVscyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgTWV0aG9kVmlzaXRvciBhYnN0cmFjdCBjbGFzcworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEFubm90YXRpb25WaXNpdG9yIHZpc2l0QW5ub3RhdGlvbkRlZmF1bHQoKSB7CisgICAgICAgIGlmICghQ2xhc3NSZWFkZXIuQU5OT1RBVElPTlMpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIGFubmQgPSBuZXcgQnl0ZVZlY3RvcigpOworICAgICAgICByZXR1cm4gbmV3IEFubm90YXRpb25Xcml0ZXIoY3csIGZhbHNlLCBhbm5kLCBudWxsLCAwKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQW5ub3RhdGlvblZpc2l0b3IgdmlzaXRBbm5vdGF0aW9uKAorICAgICAgICBmaW5hbCBTdHJpbmcgZGVzYywKKyAgICAgICAgZmluYWwgYm9vbGVhbiB2aXNpYmxlKQorICAgIHsKKyAgICAgICAgaWYgKCFDbGFzc1JlYWRlci5BTk5PVEFUSU9OUykgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgQnl0ZVZlY3RvciBidiA9IG5ldyBCeXRlVmVjdG9yKCk7CisgICAgICAgIC8vIHdyaXRlIHR5cGUsIGFuZCByZXNlcnZlIHNwYWNlIGZvciB2YWx1ZXMgY291bnQKKyAgICAgICAgYnYucHV0U2hvcnQoY3cubmV3VVRGOChkZXNjKSkucHV0U2hvcnQoMCk7CisgICAgICAgIEFubm90YXRpb25Xcml0ZXIgYXcgPSBuZXcgQW5ub3RhdGlvbldyaXRlcihjdywgdHJ1ZSwgYnYsIGJ2LCAyKTsKKyAgICAgICAgaWYgKHZpc2libGUpIHsKKyAgICAgICAgICAgIGF3Lm5leHQgPSBhbm5zOworICAgICAgICAgICAgYW5ucyA9IGF3OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXcubmV4dCA9IGlhbm5zOworICAgICAgICAgICAgaWFubnMgPSBhdzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYXc7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEFubm90YXRpb25WaXNpdG9yIHZpc2l0UGFyYW1ldGVyQW5ub3RhdGlvbigKKyAgICAgICAgZmluYWwgaW50IHBhcmFtZXRlciwKKyAgICAgICAgZmluYWwgU3RyaW5nIGRlc2MsCisgICAgICAgIGZpbmFsIGJvb2xlYW4gdmlzaWJsZSkKKyAgICB7CisgICAgICAgIGlmICghQ2xhc3NSZWFkZXIuQU5OT1RBVElPTlMpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIEJ5dGVWZWN0b3IgYnYgPSBuZXcgQnl0ZVZlY3RvcigpOworICAgICAgICBpZiAoIkxqYXZhL2xhbmcvU3ludGhldGljOyIuZXF1YWxzKGRlc2MpKSB7CisgICAgICAgICAgICAvLyB3b3JrYXJvdW5kIGZvciBhIGJ1ZyBpbiBqYXZhYyB3aXRoIHN5bnRoZXRpYyBwYXJhbWV0ZXJzCisgICAgICAgICAgICAvLyBzZWUgQ2xhc3NSZWFkZXIucmVhZFBhcmFtZXRlckFubm90YXRpb25zCisgICAgICAgICAgICBzeW50aGV0aWNzID0gTWF0aC5tYXgoc3ludGhldGljcywgcGFyYW1ldGVyICsgMSk7CisgICAgICAgICAgICByZXR1cm4gbmV3IEFubm90YXRpb25Xcml0ZXIoY3csIGZhbHNlLCBidiwgbnVsbCwgMCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gd3JpdGUgdHlwZSwgYW5kIHJlc2VydmUgc3BhY2UgZm9yIHZhbHVlcyBjb3VudAorICAgICAgICBidi5wdXRTaG9ydChjdy5uZXdVVEY4KGRlc2MpKS5wdXRTaG9ydCgwKTsKKyAgICAgICAgQW5ub3RhdGlvbldyaXRlciBhdyA9IG5ldyBBbm5vdGF0aW9uV3JpdGVyKGN3LCB0cnVlLCBidiwgYnYsIDIpOworICAgICAgICBpZiAodmlzaWJsZSkgeworICAgICAgICAgICAgaWYgKHBhbm5zID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBwYW5ucyA9IG5ldyBBbm5vdGF0aW9uV3JpdGVyW1R5cGUuZ2V0QXJndW1lbnRUeXBlcyhkZXNjcmlwdG9yKS5sZW5ndGhdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXcubmV4dCA9IHBhbm5zW3BhcmFtZXRlcl07CisgICAgICAgICAgICBwYW5uc1twYXJhbWV0ZXJdID0gYXc7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoaXBhbm5zID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpcGFubnMgPSBuZXcgQW5ub3RhdGlvbldyaXRlcltUeXBlLmdldEFyZ3VtZW50VHlwZXMoZGVzY3JpcHRvcikubGVuZ3RoXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF3Lm5leHQgPSBpcGFubnNbcGFyYW1ldGVyXTsKKyAgICAgICAgICAgIGlwYW5uc1twYXJhbWV0ZXJdID0gYXc7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGF3OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0QXR0cmlidXRlKGZpbmFsIEF0dHJpYnV0ZSBhdHRyKSB7CisgICAgICAgIGlmIChhdHRyLmlzQ29kZUF0dHJpYnV0ZSgpKSB7CisgICAgICAgICAgICBhdHRyLm5leHQgPSBjYXR0cnM7CisgICAgICAgICAgICBjYXR0cnMgPSBhdHRyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXR0ci5uZXh0ID0gYXR0cnM7CisgICAgICAgICAgICBhdHRycyA9IGF0dHI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdENvZGUoKSB7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRGcmFtZSgKKyAgICAgICAgZmluYWwgaW50IHR5cGUsCisgICAgICAgIGZpbmFsIGludCBuTG9jYWwsCisgICAgICAgIGZpbmFsIE9iamVjdFtdIGxvY2FsLAorICAgICAgICBmaW5hbCBpbnQgblN0YWNrLAorICAgICAgICBmaW5hbCBPYmplY3RbXSBzdGFjaykKKyAgICB7CisgICAgICAgIGlmICghQ2xhc3NSZWFkZXIuRlJBTUVTIHx8IGNvbXB1dGUgPT0gRlJBTUVTKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAodHlwZSA9PSBPcGNvZGVzLkZfTkVXKSB7CisgICAgICAgICAgICBjdXJyZW50TG9jYWxzID0gbkxvY2FsOworICAgICAgICAgICAgc3RhcnRGcmFtZShjb2RlLmxlbmd0aCwgbkxvY2FsLCBuU3RhY2spOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuTG9jYWw7ICsraSkgeworICAgICAgICAgICAgICAgIGlmIChsb2NhbFtpXSBpbnN0YW5jZW9mIFN0cmluZykgeworICAgICAgICAgICAgICAgICAgICBmcmFtZVtmcmFtZUluZGV4KytdID0gRnJhbWUuT0JKRUNUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBjdy5hZGRUeXBlKChTdHJpbmcpIGxvY2FsW2ldKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxvY2FsW2ldIGluc3RhbmNlb2YgSW50ZWdlcikgeworICAgICAgICAgICAgICAgICAgICBmcmFtZVtmcmFtZUluZGV4KytdID0gKChJbnRlZ2VyKSBsb2NhbFtpXSkuaW50VmFsdWUoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmcmFtZVtmcmFtZUluZGV4KytdID0gRnJhbWUuVU5JTklUSUFMSVpFRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgY3cuYWRkVW5pbml0aWFsaXplZFR5cGUoIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKExhYmVsKSBsb2NhbFtpXSkucG9zaXRpb24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgblN0YWNrOyArK2kpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RhY2tbaV0gaW5zdGFuY2VvZiBTdHJpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgZnJhbWVbZnJhbWVJbmRleCsrXSA9IEZyYW1lLk9CSkVDVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgY3cuYWRkVHlwZSgoU3RyaW5nKSBzdGFja1tpXSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGFja1tpXSBpbnN0YW5jZW9mIEludGVnZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgZnJhbWVbZnJhbWVJbmRleCsrXSA9ICgoSW50ZWdlcikgc3RhY2tbaV0pLmludFZhbHVlKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZnJhbWVbZnJhbWVJbmRleCsrXSA9IEZyYW1lLlVOSU5JVElBTElaRUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGN3LmFkZFVuaW5pdGlhbGl6ZWRUeXBlKCIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChMYWJlbCkgc3RhY2tbaV0pLnBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbmRGcmFtZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IGRlbHRhOworICAgICAgICAgICAgaWYgKHN0YWNrTWFwID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzdGFja01hcCA9IG5ldyBCeXRlVmVjdG9yKCk7CisgICAgICAgICAgICAgICAgZGVsdGEgPSBjb2RlLmxlbmd0aDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZGVsdGEgPSBjb2RlLmxlbmd0aCAtIHByZXZpb3VzRnJhbWVPZmZzZXQgLSAxOworICAgICAgICAgICAgICAgIGlmIChkZWx0YSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gT3Bjb2Rlcy5GX1NBTUUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkZfRlVMTDoKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudExvY2FscyA9IG5Mb2NhbDsKKyAgICAgICAgICAgICAgICAgICAgc3RhY2tNYXAucHV0Qnl0ZShGVUxMX0ZSQU1FKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wdXRTaG9ydChkZWx0YSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHV0U2hvcnQobkxvY2FsKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuTG9jYWw7ICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVGcmFtZVR5cGUobG9jYWxbaV0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN0YWNrTWFwLnB1dFNob3J0KG5TdGFjayk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgblN0YWNrOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlRnJhbWVUeXBlKHN0YWNrW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE9wY29kZXMuRl9BUFBFTkQ6CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRMb2NhbHMgKz0gbkxvY2FsOworICAgICAgICAgICAgICAgICAgICBzdGFja01hcC5wdXRCeXRlKFNBTUVfRlJBTUVfRVhURU5ERUQgKyBuTG9jYWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnB1dFNob3J0KGRlbHRhKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuTG9jYWw7ICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVGcmFtZVR5cGUobG9jYWxbaV0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5GX0NIT1A6CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRMb2NhbHMgLT0gbkxvY2FsOworICAgICAgICAgICAgICAgICAgICBzdGFja01hcC5wdXRCeXRlKFNBTUVfRlJBTUVfRVhURU5ERUQgLSBuTG9jYWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnB1dFNob3J0KGRlbHRhKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkZfU0FNRToKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRlbHRhIDwgNjQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrTWFwLnB1dEJ5dGUoZGVsdGEpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2tNYXAucHV0Qnl0ZShTQU1FX0ZSQU1FX0VYVEVOREVEKS5wdXRTaG9ydChkZWx0YSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkZfU0FNRTE6CisgICAgICAgICAgICAgICAgICAgIGlmIChkZWx0YSA8IDY0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGFja01hcC5wdXRCeXRlKFNBTUVfTE9DQUxTXzFfU1RBQ0tfSVRFTV9GUkFNRSArIGRlbHRhKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrTWFwLnB1dEJ5dGUoU0FNRV9MT0NBTFNfMV9TVEFDS19JVEVNX0ZSQU1FX0VYVEVOREVEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHV0U2hvcnQoZGVsdGEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHdyaXRlRnJhbWVUeXBlKHN0YWNrWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByZXZpb3VzRnJhbWVPZmZzZXQgPSBjb2RlLmxlbmd0aDsKKyAgICAgICAgICAgICsrZnJhbWVDb3VudDsKKyAgICAgICAgfQorCisgICAgICAgIG1heFN0YWNrID0gTWF0aC5tYXgobWF4U3RhY2ssIG5TdGFjayk7CisgICAgICAgIG1heExvY2FscyA9IE1hdGgubWF4KG1heExvY2FscywgY3VycmVudExvY2Fscyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRJbnNuKGZpbmFsIGludCBvcGNvZGUpIHsKKyAgICAgICAgLy8gYWRkcyB0aGUgaW5zdHJ1Y3Rpb24gdG8gdGhlIGJ5dGVjb2RlIG9mIHRoZSBtZXRob2QKKyAgICAgICAgY29kZS5wdXRCeXRlKG9wY29kZSk7CisgICAgICAgIC8vIHVwZGF0ZSBjdXJyZW50QmxvY2sKKyAgICAgICAgLy8gTGFiZWwgY3VycmVudEJsb2NrID0gdGhpcy5jdXJyZW50QmxvY2s7CisgICAgICAgIGlmIChjdXJyZW50QmxvY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGNvbXB1dGUgPT0gRlJBTUVTKSB7CisgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrLmZyYW1lLmV4ZWN1dGUob3Bjb2RlLCAwLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gdXBkYXRlcyBjdXJyZW50IGFuZCBtYXggc3RhY2sgc2l6ZXMKKyAgICAgICAgICAgICAgICBpbnQgc2l6ZSA9IHN0YWNrU2l6ZSArIEZyYW1lLlNJWkVbb3Bjb2RlXTsKKyAgICAgICAgICAgICAgICBpZiAoc2l6ZSA+IG1heFN0YWNrU2l6ZSkgeworICAgICAgICAgICAgICAgICAgICBtYXhTdGFja1NpemUgPSBzaXplOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdGFja1NpemUgPSBzaXplOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gaWYgb3Bjb2RlID09IEFUSFJPVyBvciB4UkVUVVJOLCBlbmRzIGN1cnJlbnQgYmxvY2sgKG5vIHN1Y2Nlc3NvcikKKyAgICAgICAgICAgIGlmICgob3Bjb2RlID49IE9wY29kZXMuSVJFVFVSTiAmJiBvcGNvZGUgPD0gT3Bjb2Rlcy5SRVRVUk4pCisgICAgICAgICAgICAgICAgICAgIHx8IG9wY29kZSA9PSBPcGNvZGVzLkFUSFJPVykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBub1N1Y2Nlc3NvcigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRJbnRJbnNuKGZpbmFsIGludCBvcGNvZGUsIGZpbmFsIGludCBvcGVyYW5kKSB7CisgICAgICAgIC8vIExhYmVsIGN1cnJlbnRCbG9jayA9IHRoaXMuY3VycmVudEJsb2NrOworICAgICAgICBpZiAoY3VycmVudEJsb2NrICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChjb21wdXRlID09IEZSQU1FUykgeworICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9jay5mcmFtZS5leGVjdXRlKG9wY29kZSwgb3BlcmFuZCwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG9wY29kZSAhPSBPcGNvZGVzLk5FV0FSUkFZKSB7CisgICAgICAgICAgICAgICAgLy8gdXBkYXRlcyBjdXJyZW50IGFuZCBtYXggc3RhY2sgc2l6ZXMgb25seSBmb3IgTkVXQVJSQVkKKyAgICAgICAgICAgICAgICAvLyAoc3RhY2sgc2l6ZSB2YXJpYXRpb24gPSAwIGZvciBCSVBVU0ggb3IgU0lQVVNIKQorICAgICAgICAgICAgICAgIGludCBzaXplID0gc3RhY2tTaXplICsgMTsKKyAgICAgICAgICAgICAgICBpZiAoc2l6ZSA+IG1heFN0YWNrU2l6ZSkgeworICAgICAgICAgICAgICAgICAgICBtYXhTdGFja1NpemUgPSBzaXplOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdGFja1NpemUgPSBzaXplOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIGFkZHMgdGhlIGluc3RydWN0aW9uIHRvIHRoZSBieXRlY29kZSBvZiB0aGUgbWV0aG9kCisgICAgICAgIGlmIChvcGNvZGUgPT0gT3Bjb2Rlcy5TSVBVU0gpIHsKKyAgICAgICAgICAgIGNvZGUucHV0MTIob3Bjb2RlLCBvcGVyYW5kKTsKKyAgICAgICAgfSBlbHNlIHsgLy8gQklQVVNIIG9yIE5FV0FSUkFZCisgICAgICAgICAgICBjb2RlLnB1dDExKG9wY29kZSwgb3BlcmFuZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFZhckluc24oZmluYWwgaW50IG9wY29kZSwgZmluYWwgaW50IHZhcikgeworICAgICAgICAvLyBMYWJlbCBjdXJyZW50QmxvY2sgPSB0aGlzLmN1cnJlbnRCbG9jazsKKyAgICAgICAgaWYgKGN1cnJlbnRCbG9jayAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoY29tcHV0ZSA9PSBGUkFNRVMpIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50QmxvY2suZnJhbWUuZXhlY3V0ZShvcGNvZGUsIHZhciwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIHVwZGF0ZXMgY3VycmVudCBhbmQgbWF4IHN0YWNrIHNpemVzCisgICAgICAgICAgICAgICAgaWYgKG9wY29kZSA9PSBPcGNvZGVzLlJFVCkgeworICAgICAgICAgICAgICAgICAgICAvLyBubyBzdGFjayBjaGFuZ2UsIGJ1dCBlbmQgb2YgY3VycmVudCBibG9jayAobm8gc3VjY2Vzc29yKQorICAgICAgICAgICAgICAgICAgICBjdXJyZW50QmxvY2suc3RhdHVzIHw9IExhYmVsLlJFVDsKKyAgICAgICAgICAgICAgICAgICAgLy8gc2F2ZSAnc3RhY2tTaXplJyBoZXJlIGZvciBmdXR1cmUgdXNlCisgICAgICAgICAgICAgICAgICAgIC8vIChzZWUge0BsaW5rICNmaW5kU3Vicm91dGluZVN1Y2Nlc3NvcnN9KQorICAgICAgICAgICAgICAgICAgICBjdXJyZW50QmxvY2suaW5wdXRTdGFja1RvcCA9IHN0YWNrU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgbm9TdWNjZXNzb3IoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyB4TE9BRCBvciB4U1RPUkUKKyAgICAgICAgICAgICAgICAgICAgaW50IHNpemUgPSBzdGFja1NpemUgKyBGcmFtZS5TSVpFW29wY29kZV07CisgICAgICAgICAgICAgICAgICAgIGlmIChzaXplID4gbWF4U3RhY2tTaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXhTdGFja1NpemUgPSBzaXplOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN0YWNrU2l6ZSA9IHNpemU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChjb21wdXRlICE9IE5PVEhJTkcpIHsKKyAgICAgICAgICAgIC8vIHVwZGF0ZXMgbWF4IGxvY2FscworICAgICAgICAgICAgaW50IG47CisgICAgICAgICAgICBpZiAob3Bjb2RlID09IE9wY29kZXMuTExPQUQgfHwgb3Bjb2RlID09IE9wY29kZXMuRExPQUQKKyAgICAgICAgICAgICAgICAgICAgfHwgb3Bjb2RlID09IE9wY29kZXMuTFNUT1JFIHx8IG9wY29kZSA9PSBPcGNvZGVzLkRTVE9SRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuID0gdmFyICsgMjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbiA9IHZhciArIDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobiA+IG1heExvY2FscykgeworICAgICAgICAgICAgICAgIG1heExvY2FscyA9IG47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gYWRkcyB0aGUgaW5zdHJ1Y3Rpb24gdG8gdGhlIGJ5dGVjb2RlIG9mIHRoZSBtZXRob2QKKyAgICAgICAgaWYgKHZhciA8IDQgJiYgb3Bjb2RlICE9IE9wY29kZXMuUkVUKSB7CisgICAgICAgICAgICBpbnQgb3B0OworICAgICAgICAgICAgaWYgKG9wY29kZSA8IE9wY29kZXMuSVNUT1JFKSB7CisgICAgICAgICAgICAgICAgLyogSUxPQURfMCAqLworICAgICAgICAgICAgICAgIG9wdCA9IDI2ICsgKChvcGNvZGUgLSBPcGNvZGVzLklMT0FEKSA8PCAyKSArIHZhcjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogSVNUT1JFXzAgKi8KKyAgICAgICAgICAgICAgICBvcHQgPSA1OSArICgob3Bjb2RlIC0gT3Bjb2Rlcy5JU1RPUkUpIDw8IDIpICsgdmFyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29kZS5wdXRCeXRlKG9wdCk7CisgICAgICAgIH0gZWxzZSBpZiAodmFyID49IDI1NikgeworICAgICAgICAgICAgY29kZS5wdXRCeXRlKDE5NiAvKiBXSURFICovKS5wdXQxMihvcGNvZGUsIHZhcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb2RlLnB1dDExKG9wY29kZSwgdmFyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAob3Bjb2RlID49IE9wY29kZXMuSVNUT1JFICYmIGNvbXB1dGUgPT0gRlJBTUVTICYmIGhhbmRsZXJDb3VudCA+IDApIHsKKyAgICAgICAgICAgIHZpc2l0TGFiZWwobmV3IExhYmVsKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRUeXBlSW5zbihmaW5hbCBpbnQgb3Bjb2RlLCBmaW5hbCBTdHJpbmcgdHlwZSkgeworICAgICAgICBJdGVtIGkgPSBjdy5uZXdDbGFzc0l0ZW0odHlwZSk7CisgICAgICAgIC8vIExhYmVsIGN1cnJlbnRCbG9jayA9IHRoaXMuY3VycmVudEJsb2NrOworICAgICAgICBpZiAoY3VycmVudEJsb2NrICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChjb21wdXRlID09IEZSQU1FUykgeworICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9jay5mcmFtZS5leGVjdXRlKG9wY29kZSwgY29kZS5sZW5ndGgsIGN3LCBpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAob3Bjb2RlID09IE9wY29kZXMuTkVXKSB7CisgICAgICAgICAgICAgICAgLy8gdXBkYXRlcyBjdXJyZW50IGFuZCBtYXggc3RhY2sgc2l6ZXMgb25seSBpZiBvcGNvZGUgPT0gTkVXCisgICAgICAgICAgICAgICAgLy8gKG5vIHN0YWNrIGNoYW5nZSBmb3IgQU5FV0FSUkFZLCBDSEVDS0NBU1QsIElOU1RBTkNFT0YpCisgICAgICAgICAgICAgICAgaW50IHNpemUgPSBzdGFja1NpemUgKyAxOworICAgICAgICAgICAgICAgIGlmIChzaXplID4gbWF4U3RhY2tTaXplKSB7CisgICAgICAgICAgICAgICAgICAgIG1heFN0YWNrU2l6ZSA9IHNpemU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0YWNrU2l6ZSA9IHNpemU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gYWRkcyB0aGUgaW5zdHJ1Y3Rpb24gdG8gdGhlIGJ5dGVjb2RlIG9mIHRoZSBtZXRob2QKKyAgICAgICAgY29kZS5wdXQxMihvcGNvZGUsIGkuaW5kZXgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0RmllbGRJbnNuKAorICAgICAgICBmaW5hbCBpbnQgb3Bjb2RlLAorICAgICAgICBmaW5hbCBTdHJpbmcgb3duZXIsCisgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lLAorICAgICAgICBmaW5hbCBTdHJpbmcgZGVzYykKKyAgICB7CisgICAgICAgIEl0ZW0gaSA9IGN3Lm5ld0ZpZWxkSXRlbShvd25lciwgbmFtZSwgZGVzYyk7CisgICAgICAgIC8vIExhYmVsIGN1cnJlbnRCbG9jayA9IHRoaXMuY3VycmVudEJsb2NrOworICAgICAgICBpZiAoY3VycmVudEJsb2NrICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChjb21wdXRlID09IEZSQU1FUykgeworICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9jay5mcmFtZS5leGVjdXRlKG9wY29kZSwgMCwgY3csIGkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQgc2l6ZTsKKyAgICAgICAgICAgICAgICAvLyBjb21wdXRlcyB0aGUgc3RhY2sgc2l6ZSB2YXJpYXRpb24KKyAgICAgICAgICAgICAgICBjaGFyIGMgPSBkZXNjLmNoYXJBdCgwKTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKG9wY29kZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIE9wY29kZXMuR0VUU1RBVElDOgorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IHN0YWNrU2l6ZSArIChjID09ICdEJyB8fCBjID09ICdKJyA/IDIgOiAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIE9wY29kZXMuUFVUU1RBVElDOgorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IHN0YWNrU2l6ZSArIChjID09ICdEJyB8fCBjID09ICdKJyA/IC0yIDogLTEpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5HRVRGSUVMRDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBzdGFja1NpemUgKyAoYyA9PSAnRCcgfHwgYyA9PSAnSicgPyAxIDogMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgLy8gY2FzZSBDb25zdGFudHMuUFVURklFTEQ6CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gc3RhY2tTaXplICsgKGMgPT0gJ0QnIHx8IGMgPT0gJ0onID8gLTMgOiAtMik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gdXBkYXRlcyBjdXJyZW50IGFuZCBtYXggc3RhY2sgc2l6ZXMKKyAgICAgICAgICAgICAgICBpZiAoc2l6ZSA+IG1heFN0YWNrU2l6ZSkgeworICAgICAgICAgICAgICAgICAgICBtYXhTdGFja1NpemUgPSBzaXplOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdGFja1NpemUgPSBzaXplOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIGFkZHMgdGhlIGluc3RydWN0aW9uIHRvIHRoZSBieXRlY29kZSBvZiB0aGUgbWV0aG9kCisgICAgICAgIGNvZGUucHV0MTIob3Bjb2RlLCBpLmluZGV4KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdE1ldGhvZEluc24oCisgICAgICAgIGZpbmFsIGludCBvcGNvZGUsCisgICAgICAgIGZpbmFsIFN0cmluZyBvd25lciwKKyAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUsCisgICAgICAgIGZpbmFsIFN0cmluZyBkZXNjKQorICAgIHsKKyAgICAgICAgYm9vbGVhbiBpdGYgPSBvcGNvZGUgPT0gT3Bjb2Rlcy5JTlZPS0VJTlRFUkZBQ0U7CisgICAgICAgIEl0ZW0gaSA9IGN3Lm5ld01ldGhvZEl0ZW0ob3duZXIsIG5hbWUsIGRlc2MsIGl0Zik7CisgICAgICAgIGludCBhcmdTaXplID0gaS5pbnRWYWw7CisgICAgICAgIC8vIExhYmVsIGN1cnJlbnRCbG9jayA9IHRoaXMuY3VycmVudEJsb2NrOworICAgICAgICBpZiAoY3VycmVudEJsb2NrICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChjb21wdXRlID09IEZSQU1FUykgeworICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9jay5mcmFtZS5leGVjdXRlKG9wY29kZSwgMCwgY3csIGkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIGNvbXB1dGVzIHRoZSBzdGFjayBzaXplIHZhcmlhdGlvbi4gSW4gb3JkZXIgbm90IHRvIHJlY29tcHV0ZQorICAgICAgICAgICAgICAgICAqIHNldmVyYWwgdGltZXMgdGhpcyB2YXJpYXRpb24gZm9yIHRoZSBzYW1lIEl0ZW0sIHdlIHVzZSB0aGUKKyAgICAgICAgICAgICAgICAgKiBpbnRWYWwgZmllbGQgb2YgdGhpcyBpdGVtIHRvIHN0b3JlIHRoaXMgdmFyaWF0aW9uLCBvbmNlIGl0CisgICAgICAgICAgICAgICAgICogaGFzIGJlZW4gY29tcHV0ZWQuIE1vcmUgcHJlY2lzZWx5IHRoaXMgaW50VmFsIGZpZWxkIHN0b3JlcworICAgICAgICAgICAgICAgICAqIHRoZSBzaXplcyBvZiB0aGUgYXJndW1lbnRzIGFuZCBvZiB0aGUgcmV0dXJuIHZhbHVlCisgICAgICAgICAgICAgICAgICogY29ycmVzcG9uZGluZyB0byBkZXNjLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmIChhcmdTaXplID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGFib3ZlIHNpemVzIGhhdmUgbm90IGJlZW4gY29tcHV0ZWQgeWV0LAorICAgICAgICAgICAgICAgICAgICAvLyBzbyB3ZSBjb21wdXRlIHRoZW0uLi4KKyAgICAgICAgICAgICAgICAgICAgYXJnU2l6ZSA9IFR5cGUuZ2V0QXJndW1lbnRzQW5kUmV0dXJuU2l6ZXMoZGVzYyk7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uLiBhbmQgd2Ugc2F2ZSB0aGVtIGluIG9yZGVyCisgICAgICAgICAgICAgICAgICAgIC8vIG5vdCB0byByZWNvbXB1dGUgdGhlbSBpbiB0aGUgZnV0dXJlCisgICAgICAgICAgICAgICAgICAgIGkuaW50VmFsID0gYXJnU2l6ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50IHNpemU7CisgICAgICAgICAgICAgICAgaWYgKG9wY29kZSA9PSBPcGNvZGVzLklOVk9LRVNUQVRJQykgeworICAgICAgICAgICAgICAgICAgICBzaXplID0gc3RhY2tTaXplIC0gKGFyZ1NpemUgPj4gMikgKyAoYXJnU2l6ZSAmIDB4MDMpICsgMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzaXplID0gc3RhY2tTaXplIC0gKGFyZ1NpemUgPj4gMikgKyAoYXJnU2l6ZSAmIDB4MDMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyB1cGRhdGVzIGN1cnJlbnQgYW5kIG1heCBzdGFjayBzaXplcworICAgICAgICAgICAgICAgIGlmIChzaXplID4gbWF4U3RhY2tTaXplKSB7CisgICAgICAgICAgICAgICAgICAgIG1heFN0YWNrU2l6ZSA9IHNpemU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0YWNrU2l6ZSA9IHNpemU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gYWRkcyB0aGUgaW5zdHJ1Y3Rpb24gdG8gdGhlIGJ5dGVjb2RlIG9mIHRoZSBtZXRob2QKKyAgICAgICAgaWYgKGl0ZikgeworICAgICAgICAgICAgaWYgKGFyZ1NpemUgPT0gMCkgeworICAgICAgICAgICAgICAgIGFyZ1NpemUgPSBUeXBlLmdldEFyZ3VtZW50c0FuZFJldHVyblNpemVzKGRlc2MpOworICAgICAgICAgICAgICAgIGkuaW50VmFsID0gYXJnU2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvZGUucHV0MTIoT3Bjb2Rlcy5JTlZPS0VJTlRFUkZBQ0UsIGkuaW5kZXgpLnB1dDExKGFyZ1NpemUgPj4gMiwgMCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb2RlLnB1dDEyKG9wY29kZSwgaS5pbmRleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEludm9rZUR5bmFtaWNJbnNuKAorICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSwKKyAgICAgICAgZmluYWwgU3RyaW5nIGRlc2MsCisgICAgICAgIGZpbmFsIEhhbmRsZSBic20sCisgICAgICAgIGZpbmFsIE9iamVjdC4uLiBic21BcmdzKQorICAgIHsKKyAgICAgICAgSXRlbSBpID0gY3cubmV3SW52b2tlRHluYW1pY0l0ZW0obmFtZSwgZGVzYywgYnNtLCBic21BcmdzKTsKKyAgICAgICAgaW50IGFyZ1NpemUgPSBpLmludFZhbDsKKyAgICAgICAgLy8gTGFiZWwgY3VycmVudEJsb2NrID0gdGhpcy5jdXJyZW50QmxvY2s7CisgICAgICAgIGlmIChjdXJyZW50QmxvY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGNvbXB1dGUgPT0gRlJBTUVTKSB7CisgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrLmZyYW1lLmV4ZWN1dGUoT3Bjb2Rlcy5JTlZPS0VEWU5BTUlDLCAwLCBjdywgaSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogY29tcHV0ZXMgdGhlIHN0YWNrIHNpemUgdmFyaWF0aW9uLiBJbiBvcmRlciBub3QgdG8gcmVjb21wdXRlCisgICAgICAgICAgICAgICAgICogc2V2ZXJhbCB0aW1lcyB0aGlzIHZhcmlhdGlvbiBmb3IgdGhlIHNhbWUgSXRlbSwgd2UgdXNlIHRoZQorICAgICAgICAgICAgICAgICAqIGludFZhbCBmaWVsZCBvZiB0aGlzIGl0ZW0gdG8gc3RvcmUgdGhpcyB2YXJpYXRpb24sIG9uY2UgaXQKKyAgICAgICAgICAgICAgICAgKiBoYXMgYmVlbiBjb21wdXRlZC4gTW9yZSBwcmVjaXNlbHkgdGhpcyBpbnRWYWwgZmllbGQgc3RvcmVzCisgICAgICAgICAgICAgICAgICogdGhlIHNpemVzIG9mIHRoZSBhcmd1bWVudHMgYW5kIG9mIHRoZSByZXR1cm4gdmFsdWUKKyAgICAgICAgICAgICAgICAgKiBjb3JyZXNwb25kaW5nIHRvIGRlc2MuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYgKGFyZ1NpemUgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYWJvdmUgc2l6ZXMgaGF2ZSBub3QgYmVlbiBjb21wdXRlZCB5ZXQsCisgICAgICAgICAgICAgICAgICAgIC8vIHNvIHdlIGNvbXB1dGUgdGhlbS4uLgorICAgICAgICAgICAgICAgICAgICBhcmdTaXplID0gVHlwZS5nZXRBcmd1bWVudHNBbmRSZXR1cm5TaXplcyhkZXNjKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4uIGFuZCB3ZSBzYXZlIHRoZW0gaW4gb3JkZXIKKyAgICAgICAgICAgICAgICAgICAgLy8gbm90IHRvIHJlY29tcHV0ZSB0aGVtIGluIHRoZSBmdXR1cmUKKyAgICAgICAgICAgICAgICAgICAgaS5pbnRWYWwgPSBhcmdTaXplOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnQgc2l6ZSA9IHN0YWNrU2l6ZSAtIChhcmdTaXplID4+IDIpICsgKGFyZ1NpemUgJiAweDAzKSArIDE7CisKKyAgICAgICAgICAgICAgICAvLyB1cGRhdGVzIGN1cnJlbnQgYW5kIG1heCBzdGFjayBzaXplcworICAgICAgICAgICAgICAgIGlmIChzaXplID4gbWF4U3RhY2tTaXplKSB7CisgICAgICAgICAgICAgICAgICAgIG1heFN0YWNrU2l6ZSA9IHNpemU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0YWNrU2l6ZSA9IHNpemU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gYWRkcyB0aGUgaW5zdHJ1Y3Rpb24gdG8gdGhlIGJ5dGVjb2RlIG9mIHRoZSBtZXRob2QKKyAgICAgICAgY29kZS5wdXQxMihPcGNvZGVzLklOVk9LRURZTkFNSUMsIGkuaW5kZXgpOworICAgICAgICBjb2RlLnB1dFNob3J0KDApOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0SnVtcEluc24oZmluYWwgaW50IG9wY29kZSwgZmluYWwgTGFiZWwgbGFiZWwpIHsKKyAgICAgICAgTGFiZWwgbmV4dEluc24gPSBudWxsOworICAgICAgICAvLyBMYWJlbCBjdXJyZW50QmxvY2sgPSB0aGlzLmN1cnJlbnRCbG9jazsKKyAgICAgICAgaWYgKGN1cnJlbnRCbG9jayAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoY29tcHV0ZSA9PSBGUkFNRVMpIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50QmxvY2suZnJhbWUuZXhlY3V0ZShvcGNvZGUsIDAsIG51bGwsIG51bGwpOworICAgICAgICAgICAgICAgIC8vICdsYWJlbCcgaXMgdGhlIHRhcmdldCBvZiBhIGp1bXAgaW5zdHJ1Y3Rpb24KKyAgICAgICAgICAgICAgICBsYWJlbC5nZXRGaXJzdCgpLnN0YXR1cyB8PSBMYWJlbC5UQVJHRVQ7CisgICAgICAgICAgICAgICAgLy8gYWRkcyAnbGFiZWwnIGFzIGEgc3VjY2Vzc29yIG9mIHRoaXMgYmFzaWMgYmxvY2sKKyAgICAgICAgICAgICAgICBhZGRTdWNjZXNzb3IoRWRnZS5OT1JNQUwsIGxhYmVsKTsKKyAgICAgICAgICAgICAgICBpZiAob3Bjb2RlICE9IE9wY29kZXMuR09UTykgeworICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGVzIGEgTGFiZWwgZm9yIHRoZSBuZXh0IGJhc2ljIGJsb2NrCisgICAgICAgICAgICAgICAgICAgIG5leHRJbnNuID0gbmV3IExhYmVsKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAob3Bjb2RlID09IE9wY29kZXMuSlNSKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgobGFiZWwuc3RhdHVzICYgTGFiZWwuU1VCUk9VVElORSkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwuc3RhdHVzIHw9IExhYmVsLlNVQlJPVVRJTkU7CisgICAgICAgICAgICAgICAgICAgICAgICArK3N1YnJvdXRpbmVzOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9jay5zdGF0dXMgfD0gTGFiZWwuSlNSOworICAgICAgICAgICAgICAgICAgICBhZGRTdWNjZXNzb3Ioc3RhY2tTaXplICsgMSwgbGFiZWwpOworICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGVzIGEgTGFiZWwgZm9yIHRoZSBuZXh0IGJhc2ljIGJsb2NrCisgICAgICAgICAgICAgICAgICAgIG5leHRJbnNuID0gbmV3IExhYmVsKCk7CisgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAqIG5vdGUgdGhhdCwgYnkgY29uc3RydWN0aW9uIGluIHRoaXMgbWV0aG9kLCBhIEpTUiBibG9jaworICAgICAgICAgICAgICAgICAgICAgKiBoYXMgYXQgbGVhc3QgdHdvIHN1Y2Nlc3NvcnMgaW4gdGhlIGNvbnRyb2wgZmxvdyBncmFwaDoKKyAgICAgICAgICAgICAgICAgICAgICogdGhlIGZpcnN0IG9uZSBsZWFkcyB0aGUgbmV4dCBpbnN0cnVjdGlvbiBhZnRlciB0aGUgSlNSLAorICAgICAgICAgICAgICAgICAgICAgKiB3aGlsZSB0aGUgc2Vjb25kIG9uZSBsZWFkcyB0byB0aGUgSlNSIHRhcmdldC4KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlcyBjdXJyZW50IHN0YWNrIHNpemUgKG1heCBzdGFjayBzaXplIHVuY2hhbmdlZAorICAgICAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIHN0YWNrIHNpemUgdmFyaWF0aW9uIGFsd2F5cyBuZWdhdGl2ZSBpbiB0aGlzCisgICAgICAgICAgICAgICAgICAgIC8vIGNhc2UpCisgICAgICAgICAgICAgICAgICAgIHN0YWNrU2l6ZSArPSBGcmFtZS5TSVpFW29wY29kZV07CisgICAgICAgICAgICAgICAgICAgIGFkZFN1Y2Nlc3NvcihzdGFja1NpemUsIGxhYmVsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gYWRkcyB0aGUgaW5zdHJ1Y3Rpb24gdG8gdGhlIGJ5dGVjb2RlIG9mIHRoZSBtZXRob2QKKyAgICAgICAgaWYgKChsYWJlbC5zdGF0dXMgJiBMYWJlbC5SRVNPTFZFRCkgIT0gMAorICAgICAgICAgICAgICAgICYmIGxhYmVsLnBvc2l0aW9uIC0gY29kZS5sZW5ndGggPCBTaG9ydC5NSU5fVkFMVUUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBjYXNlIG9mIGEgYmFja3dhcmQganVtcCB3aXRoIGFuIG9mZnNldCA8IC0zMjc2OC4gSW4gdGhpcyBjYXNlIHdlCisgICAgICAgICAgICAgKiBhdXRvbWF0aWNhbGx5IHJlcGxhY2UgR09UTyB3aXRoIEdPVE9fVywgSlNSIHdpdGggSlNSX1cgYW5kIElGeHh4CisgICAgICAgICAgICAgKiA8bD4gd2l0aCBJRk5PVHh4eCA8bCc+IEdPVE9fVyA8bD4sIHdoZXJlIElGTk9UeHh4IGlzIHRoZQorICAgICAgICAgICAgICogIm9wcG9zaXRlIiBvcGNvZGUgb2YgSUZ4eHggKGkuZS4sIElGTkUgZm9yIElGRVEpIGFuZCB3aGVyZSA8bCc+CisgICAgICAgICAgICAgKiBkZXNpZ25hdGVzIHRoZSBpbnN0cnVjdGlvbiBqdXN0IGFmdGVyIHRoZSBHT1RPX1cuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChvcGNvZGUgPT0gT3Bjb2Rlcy5HT1RPKSB7CisgICAgICAgICAgICAgICAgY29kZS5wdXRCeXRlKDIwMCk7IC8vIEdPVE9fVworICAgICAgICAgICAgfSBlbHNlIGlmIChvcGNvZGUgPT0gT3Bjb2Rlcy5KU1IpIHsKKyAgICAgICAgICAgICAgICBjb2RlLnB1dEJ5dGUoMjAxKTsgLy8gSlNSX1cKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gaWYgdGhlIElGIGluc3RydWN0aW9uIGlzIHRyYW5zZm9ybWVkIGludG8gSUZOT1QgR09UT19XIHRoZQorICAgICAgICAgICAgICAgIC8vIG5leHQgaW5zdHJ1Y3Rpb24gYmVjb21lcyB0aGUgdGFyZ2V0IG9mIHRoZSBJRk5PVCBpbnN0cnVjdGlvbgorICAgICAgICAgICAgICAgIGlmIChuZXh0SW5zbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG5leHRJbnNuLnN0YXR1cyB8PSBMYWJlbC5UQVJHRVQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvZGUucHV0Qnl0ZShvcGNvZGUgPD0gMTY2CisgICAgICAgICAgICAgICAgICAgICAgICA/ICgob3Bjb2RlICsgMSkgXiAxKSAtIDEKKyAgICAgICAgICAgICAgICAgICAgICAgIDogb3Bjb2RlIF4gMSk7CisgICAgICAgICAgICAgICAgY29kZS5wdXRTaG9ydCg4KTsgLy8ganVtcCBvZmZzZXQKKyAgICAgICAgICAgICAgICBjb2RlLnB1dEJ5dGUoMjAwKTsgLy8gR09UT19XCisgICAgICAgICAgICB9CisgICAgICAgICAgICBsYWJlbC5wdXQodGhpcywgY29kZSwgY29kZS5sZW5ndGggLSAxLCB0cnVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBjYXNlIG9mIGEgYmFja3dhcmQganVtcCB3aXRoIGFuIG9mZnNldCA+PSAtMzI3NjgsIG9yIG9mIGEgZm9yd2FyZAorICAgICAgICAgICAgICoganVtcCB3aXRoLCBvZiBjb3Vyc2UsIGFuIHVua25vd24gb2Zmc2V0LiBJbiB0aGVzZSBjYXNlcyB3ZSBzdG9yZQorICAgICAgICAgICAgICogdGhlIG9mZnNldCBpbiAyIGJ5dGVzICh3aGljaCB3aWxsIGJlIGluY3JlYXNlZCBpbgorICAgICAgICAgICAgICogcmVzaXplSW5zdHJ1Y3Rpb25zLCBpZiBuZWVkZWQpLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBjb2RlLnB1dEJ5dGUob3Bjb2RlKTsKKyAgICAgICAgICAgIGxhYmVsLnB1dCh0aGlzLCBjb2RlLCBjb2RlLmxlbmd0aCAtIDEsIGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY3VycmVudEJsb2NrICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChuZXh0SW5zbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGp1bXAgaW5zdHJ1Y3Rpb24gaXMgbm90IGEgR09UTywgdGhlIG5leHQgaW5zdHJ1Y3Rpb24KKyAgICAgICAgICAgICAgICAvLyBpcyBhbHNvIGEgc3VjY2Vzc29yIG9mIHRoaXMgaW5zdHJ1Y3Rpb24uIENhbGxpbmcgdmlzaXRMYWJlbAorICAgICAgICAgICAgICAgIC8vIGFkZHMgdGhlIGxhYmVsIG9mIHRoaXMgbmV4dCBpbnN0cnVjdGlvbiBhcyBhIHN1Y2Nlc3NvciBvZiB0aGUKKyAgICAgICAgICAgICAgICAvLyBjdXJyZW50IGJsb2NrLCBhbmQgc3RhcnRzIGEgbmV3IGJhc2ljIGJsb2NrCisgICAgICAgICAgICAgICAgdmlzaXRMYWJlbChuZXh0SW5zbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob3Bjb2RlID09IE9wY29kZXMuR09UTykgeworICAgICAgICAgICAgICAgIG5vU3VjY2Vzc29yKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdExhYmVsKGZpbmFsIExhYmVsIGxhYmVsKSB7CisgICAgICAgIC8vIHJlc29sdmVzIHByZXZpb3VzIGZvcndhcmQgcmVmZXJlbmNlcyB0byBsYWJlbCwgaWYgYW55CisgICAgICAgIHJlc2l6ZSB8PSBsYWJlbC5yZXNvbHZlKHRoaXMsIGNvZGUubGVuZ3RoLCBjb2RlLmRhdGEpOworICAgICAgICAvLyB1cGRhdGVzIGN1cnJlbnRCbG9jaworICAgICAgICBpZiAoKGxhYmVsLnN0YXR1cyAmIExhYmVsLkRFQlVHKSAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvbXB1dGUgPT0gRlJBTUVTKSB7CisgICAgICAgICAgICBpZiAoY3VycmVudEJsb2NrICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAobGFiZWwucG9zaXRpb24gPT0gY3VycmVudEJsb2NrLnBvc2l0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHN1Y2Nlc3NpdmUgbGFiZWxzLCBkbyBub3Qgc3RhcnQgYSBuZXcgYmFzaWMgYmxvY2sKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrLnN0YXR1cyB8PSAobGFiZWwuc3RhdHVzICYgTGFiZWwuVEFSR0VUKTsKKyAgICAgICAgICAgICAgICAgICAgbGFiZWwuZnJhbWUgPSBjdXJyZW50QmxvY2suZnJhbWU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gZW5kcyBjdXJyZW50IGJsb2NrICh3aXRoIG9uZSBuZXcgc3VjY2Vzc29yKQorICAgICAgICAgICAgICAgIGFkZFN1Y2Nlc3NvcihFZGdlLk5PUk1BTCwgbGFiZWwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gYmVnaW5zIGEgbmV3IGN1cnJlbnQgYmxvY2sKKyAgICAgICAgICAgIGN1cnJlbnRCbG9jayA9IGxhYmVsOworICAgICAgICAgICAgaWYgKGxhYmVsLmZyYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBsYWJlbC5mcmFtZSA9IG5ldyBGcmFtZSgpOworICAgICAgICAgICAgICAgIGxhYmVsLmZyYW1lLm93bmVyID0gbGFiZWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyB1cGRhdGVzIHRoZSBiYXNpYyBibG9jayBsaXN0CisgICAgICAgICAgICBpZiAocHJldmlvdXNCbG9jayAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKGxhYmVsLnBvc2l0aW9uID09IHByZXZpb3VzQmxvY2sucG9zaXRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNCbG9jay5zdGF0dXMgfD0gKGxhYmVsLnN0YXR1cyAmIExhYmVsLlRBUkdFVCk7CisgICAgICAgICAgICAgICAgICAgIGxhYmVsLmZyYW1lID0gcHJldmlvdXNCbG9jay5mcmFtZTsKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrID0gcHJldmlvdXNCbG9jazsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwcmV2aW91c0Jsb2NrLnN1Y2Nlc3NvciA9IGxhYmVsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJldmlvdXNCbG9jayA9IGxhYmVsOworICAgICAgICB9IGVsc2UgaWYgKGNvbXB1dGUgPT0gTUFYUykgeworICAgICAgICAgICAgaWYgKGN1cnJlbnRCbG9jayAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gZW5kcyBjdXJyZW50IGJsb2NrICh3aXRoIG9uZSBuZXcgc3VjY2Vzc29yKQorICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9jay5vdXRwdXRTdGFja01heCA9IG1heFN0YWNrU2l6ZTsKKyAgICAgICAgICAgICAgICBhZGRTdWNjZXNzb3Ioc3RhY2tTaXplLCBsYWJlbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBiZWdpbnMgYSBuZXcgY3VycmVudCBibG9jaworICAgICAgICAgICAgY3VycmVudEJsb2NrID0gbGFiZWw7CisgICAgICAgICAgICAvLyByZXNldHMgdGhlIHJlbGF0aXZlIGN1cnJlbnQgYW5kIG1heCBzdGFjayBzaXplcworICAgICAgICAgICAgc3RhY2tTaXplID0gMDsKKyAgICAgICAgICAgIG1heFN0YWNrU2l6ZSA9IDA7CisgICAgICAgICAgICAvLyB1cGRhdGVzIHRoZSBiYXNpYyBibG9jayBsaXN0CisgICAgICAgICAgICBpZiAocHJldmlvdXNCbG9jayAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcHJldmlvdXNCbG9jay5zdWNjZXNzb3IgPSBsYWJlbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByZXZpb3VzQmxvY2sgPSBsYWJlbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TGRjSW5zbihmaW5hbCBPYmplY3QgY3N0KSB7CisgICAgICAgIEl0ZW0gaSA9IGN3Lm5ld0NvbnN0SXRlbShjc3QpOworICAgICAgICAvLyBMYWJlbCBjdXJyZW50QmxvY2sgPSB0aGlzLmN1cnJlbnRCbG9jazsKKyAgICAgICAgaWYgKGN1cnJlbnRCbG9jayAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoY29tcHV0ZSA9PSBGUkFNRVMpIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50QmxvY2suZnJhbWUuZXhlY3V0ZShPcGNvZGVzLkxEQywgMCwgY3csIGkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQgc2l6ZTsKKyAgICAgICAgICAgICAgICAvLyBjb21wdXRlcyB0aGUgc3RhY2sgc2l6ZSB2YXJpYXRpb24KKyAgICAgICAgICAgICAgICBpZiAoaS50eXBlID09IENsYXNzV3JpdGVyLkxPTkcgfHwgaS50eXBlID09IENsYXNzV3JpdGVyLkRPVUJMRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNpemUgPSBzdGFja1NpemUgKyAyOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNpemUgPSBzdGFja1NpemUgKyAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyB1cGRhdGVzIGN1cnJlbnQgYW5kIG1heCBzdGFjayBzaXplcworICAgICAgICAgICAgICAgIGlmIChzaXplID4gbWF4U3RhY2tTaXplKSB7CisgICAgICAgICAgICAgICAgICAgIG1heFN0YWNrU2l6ZSA9IHNpemU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0YWNrU2l6ZSA9IHNpemU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gYWRkcyB0aGUgaW5zdHJ1Y3Rpb24gdG8gdGhlIGJ5dGVjb2RlIG9mIHRoZSBtZXRob2QKKyAgICAgICAgaW50IGluZGV4ID0gaS5pbmRleDsKKyAgICAgICAgaWYgKGkudHlwZSA9PSBDbGFzc1dyaXRlci5MT05HIHx8IGkudHlwZSA9PSBDbGFzc1dyaXRlci5ET1VCTEUpIHsKKyAgICAgICAgICAgIGNvZGUucHV0MTIoMjAgLyogTERDMl9XICovLCBpbmRleCk7CisgICAgICAgIH0gZWxzZSBpZiAoaW5kZXggPj0gMjU2KSB7CisgICAgICAgICAgICBjb2RlLnB1dDEyKDE5IC8qIExEQ19XICovLCBpbmRleCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb2RlLnB1dDExKE9wY29kZXMuTERDLCBpbmRleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdElpbmNJbnNuKGZpbmFsIGludCB2YXIsIGZpbmFsIGludCBpbmNyZW1lbnQpIHsKKyAgICAgICAgaWYgKGN1cnJlbnRCbG9jayAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoY29tcHV0ZSA9PSBGUkFNRVMpIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50QmxvY2suZnJhbWUuZXhlY3V0ZShPcGNvZGVzLklJTkMsIHZhciwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvbXB1dGUgIT0gTk9USElORykgeworICAgICAgICAgICAgLy8gdXBkYXRlcyBtYXggbG9jYWxzCisgICAgICAgICAgICBpbnQgbiA9IHZhciArIDE7CisgICAgICAgICAgICBpZiAobiA+IG1heExvY2FscykgeworICAgICAgICAgICAgICAgIG1heExvY2FscyA9IG47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gYWRkcyB0aGUgaW5zdHJ1Y3Rpb24gdG8gdGhlIGJ5dGVjb2RlIG9mIHRoZSBtZXRob2QKKyAgICAgICAgaWYgKCh2YXIgPiAyNTUpIHx8IChpbmNyZW1lbnQgPiAxMjcpIHx8IChpbmNyZW1lbnQgPCAtMTI4KSkgeworICAgICAgICAgICAgY29kZS5wdXRCeXRlKDE5NiAvKiBXSURFICovKQorICAgICAgICAgICAgICAgICAgICAucHV0MTIoT3Bjb2Rlcy5JSU5DLCB2YXIpCisgICAgICAgICAgICAgICAgICAgIC5wdXRTaG9ydChpbmNyZW1lbnQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29kZS5wdXRCeXRlKE9wY29kZXMuSUlOQykucHV0MTEodmFyLCBpbmNyZW1lbnQpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRUYWJsZVN3aXRjaEluc24oCisgICAgICAgIGZpbmFsIGludCBtaW4sCisgICAgICAgIGZpbmFsIGludCBtYXgsCisgICAgICAgIGZpbmFsIExhYmVsIGRmbHQsCisgICAgICAgIGZpbmFsIExhYmVsLi4uIGxhYmVscykKKyAgICB7CisgICAgICAgIC8vIGFkZHMgdGhlIGluc3RydWN0aW9uIHRvIHRoZSBieXRlY29kZSBvZiB0aGUgbWV0aG9kCisgICAgICAgIGludCBzb3VyY2UgPSBjb2RlLmxlbmd0aDsKKyAgICAgICAgY29kZS5wdXRCeXRlKE9wY29kZXMuVEFCTEVTV0lUQ0gpOworICAgICAgICBjb2RlLnB1dEJ5dGVBcnJheShudWxsLCAwLCAoNCAtIGNvZGUubGVuZ3RoICUgNCkgJSA0KTsKKyAgICAgICAgZGZsdC5wdXQodGhpcywgY29kZSwgc291cmNlLCB0cnVlKTsKKyAgICAgICAgY29kZS5wdXRJbnQobWluKS5wdXRJbnQobWF4KTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsYWJlbHMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIGxhYmVsc1tpXS5wdXQodGhpcywgY29kZSwgc291cmNlLCB0cnVlKTsKKyAgICAgICAgfQorICAgICAgICAvLyB1cGRhdGVzIGN1cnJlbnRCbG9jaworICAgICAgICB2aXNpdFN3aXRjaEluc24oZGZsdCwgbGFiZWxzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdExvb2t1cFN3aXRjaEluc24oCisgICAgICAgIGZpbmFsIExhYmVsIGRmbHQsCisgICAgICAgIGZpbmFsIGludFtdIGtleXMsCisgICAgICAgIGZpbmFsIExhYmVsW10gbGFiZWxzKQorICAgIHsKKyAgICAgICAgLy8gYWRkcyB0aGUgaW5zdHJ1Y3Rpb24gdG8gdGhlIGJ5dGVjb2RlIG9mIHRoZSBtZXRob2QKKyAgICAgICAgaW50IHNvdXJjZSA9IGNvZGUubGVuZ3RoOworICAgICAgICBjb2RlLnB1dEJ5dGUoT3Bjb2Rlcy5MT09LVVBTV0lUQ0gpOworICAgICAgICBjb2RlLnB1dEJ5dGVBcnJheShudWxsLCAwLCAoNCAtIGNvZGUubGVuZ3RoICUgNCkgJSA0KTsKKyAgICAgICAgZGZsdC5wdXQodGhpcywgY29kZSwgc291cmNlLCB0cnVlKTsKKyAgICAgICAgY29kZS5wdXRJbnQobGFiZWxzLmxlbmd0aCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGFiZWxzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBjb2RlLnB1dEludChrZXlzW2ldKTsKKyAgICAgICAgICAgIGxhYmVsc1tpXS5wdXQodGhpcywgY29kZSwgc291cmNlLCB0cnVlKTsKKyAgICAgICAgfQorICAgICAgICAvLyB1cGRhdGVzIGN1cnJlbnRCbG9jaworICAgICAgICB2aXNpdFN3aXRjaEluc24oZGZsdCwgbGFiZWxzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdmlzaXRTd2l0Y2hJbnNuKGZpbmFsIExhYmVsIGRmbHQsIGZpbmFsIExhYmVsW10gbGFiZWxzKSB7CisgICAgICAgIC8vIExhYmVsIGN1cnJlbnRCbG9jayA9IHRoaXMuY3VycmVudEJsb2NrOworICAgICAgICBpZiAoY3VycmVudEJsb2NrICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChjb21wdXRlID09IEZSQU1FUykgeworICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9jay5mcmFtZS5leGVjdXRlKE9wY29kZXMuTE9PS1VQU1dJVENILCAwLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgICAgICAvLyBhZGRzIGN1cnJlbnQgYmxvY2sgc3VjY2Vzc29ycworICAgICAgICAgICAgICAgIGFkZFN1Y2Nlc3NvcihFZGdlLk5PUk1BTCwgZGZsdCk7CisgICAgICAgICAgICAgICAgZGZsdC5nZXRGaXJzdCgpLnN0YXR1cyB8PSBMYWJlbC5UQVJHRVQ7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsYWJlbHMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkU3VjY2Vzc29yKEVkZ2UuTk9STUFMLCBsYWJlbHNbaV0pOworICAgICAgICAgICAgICAgICAgICBsYWJlbHNbaV0uZ2V0Rmlyc3QoKS5zdGF0dXMgfD0gTGFiZWwuVEFSR0VUOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gdXBkYXRlcyBjdXJyZW50IHN0YWNrIHNpemUgKG1heCBzdGFjayBzaXplIHVuY2hhbmdlZCkKKyAgICAgICAgICAgICAgICAtLXN0YWNrU2l6ZTsKKyAgICAgICAgICAgICAgICAvLyBhZGRzIGN1cnJlbnQgYmxvY2sgc3VjY2Vzc29ycworICAgICAgICAgICAgICAgIGFkZFN1Y2Nlc3NvcihzdGFja1NpemUsIGRmbHQpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGFiZWxzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIGFkZFN1Y2Nlc3NvcihzdGFja1NpemUsIGxhYmVsc1tpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gZW5kcyBjdXJyZW50IGJsb2NrCisgICAgICAgICAgICBub1N1Y2Nlc3NvcigpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRNdWx0aUFOZXdBcnJheUluc24oZmluYWwgU3RyaW5nIGRlc2MsIGZpbmFsIGludCBkaW1zKSB7CisgICAgICAgIEl0ZW0gaSA9IGN3Lm5ld0NsYXNzSXRlbShkZXNjKTsKKyAgICAgICAgLy8gTGFiZWwgY3VycmVudEJsb2NrID0gdGhpcy5jdXJyZW50QmxvY2s7CisgICAgICAgIGlmIChjdXJyZW50QmxvY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGNvbXB1dGUgPT0gRlJBTUVTKSB7CisgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrLmZyYW1lLmV4ZWN1dGUoT3Bjb2Rlcy5NVUxUSUFORVdBUlJBWSwgZGltcywgY3csIGkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyB1cGRhdGVzIGN1cnJlbnQgc3RhY2sgc2l6ZSAobWF4IHN0YWNrIHNpemUgdW5jaGFuZ2VkIGJlY2F1c2UKKyAgICAgICAgICAgICAgICAvLyBzdGFjayBzaXplIHZhcmlhdGlvbiBhbHdheXMgbmVnYXRpdmUgb3IgbnVsbCkKKyAgICAgICAgICAgICAgICBzdGFja1NpemUgKz0gMSAtIGRpbXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gYWRkcyB0aGUgaW5zdHJ1Y3Rpb24gdG8gdGhlIGJ5dGVjb2RlIG9mIHRoZSBtZXRob2QKKyAgICAgICAgY29kZS5wdXQxMihPcGNvZGVzLk1VTFRJQU5FV0FSUkFZLCBpLmluZGV4KS5wdXRCeXRlKGRpbXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0VHJ5Q2F0Y2hCbG9jaygKKyAgICAgICAgZmluYWwgTGFiZWwgc3RhcnQsCisgICAgICAgIGZpbmFsIExhYmVsIGVuZCwKKyAgICAgICAgZmluYWwgTGFiZWwgaGFuZGxlciwKKyAgICAgICAgZmluYWwgU3RyaW5nIHR5cGUpCisgICAgeworICAgICAgICArK2hhbmRsZXJDb3VudDsKKyAgICAgICAgSGFuZGxlciBoID0gbmV3IEhhbmRsZXIoKTsKKyAgICAgICAgaC5zdGFydCA9IHN0YXJ0OworICAgICAgICBoLmVuZCA9IGVuZDsKKyAgICAgICAgaC5oYW5kbGVyID0gaGFuZGxlcjsKKyAgICAgICAgaC5kZXNjID0gdHlwZTsKKyAgICAgICAgaC50eXBlID0gdHlwZSAhPSBudWxsID8gY3cubmV3Q2xhc3ModHlwZSkgOiAwOworICAgICAgICBpZiAobGFzdEhhbmRsZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgZmlyc3RIYW5kbGVyID0gaDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxhc3RIYW5kbGVyLm5leHQgPSBoOworICAgICAgICB9CisgICAgICAgIGxhc3RIYW5kbGVyID0gaDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdExvY2FsVmFyaWFibGUoCisgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lLAorICAgICAgICBmaW5hbCBTdHJpbmcgZGVzYywKKyAgICAgICAgZmluYWwgU3RyaW5nIHNpZ25hdHVyZSwKKyAgICAgICAgZmluYWwgTGFiZWwgc3RhcnQsCisgICAgICAgIGZpbmFsIExhYmVsIGVuZCwKKyAgICAgICAgZmluYWwgaW50IGluZGV4KQorICAgIHsKKyAgICAgICAgaWYgKHNpZ25hdHVyZSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAobG9jYWxWYXJUeXBlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBsb2NhbFZhclR5cGUgPSBuZXcgQnl0ZVZlY3RvcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKytsb2NhbFZhclR5cGVDb3VudDsKKyAgICAgICAgICAgIGxvY2FsVmFyVHlwZS5wdXRTaG9ydChzdGFydC5wb3NpdGlvbikKKyAgICAgICAgICAgICAgICAgICAgLnB1dFNob3J0KGVuZC5wb3NpdGlvbiAtIHN0YXJ0LnBvc2l0aW9uKQorICAgICAgICAgICAgICAgICAgICAucHV0U2hvcnQoY3cubmV3VVRGOChuYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgLnB1dFNob3J0KGN3Lm5ld1VURjgoc2lnbmF0dXJlKSkKKyAgICAgICAgICAgICAgICAgICAgLnB1dFNob3J0KGluZGV4KTsKKyAgICAgICAgfQorICAgICAgICBpZiAobG9jYWxWYXIgPT0gbnVsbCkgeworICAgICAgICAgICAgbG9jYWxWYXIgPSBuZXcgQnl0ZVZlY3RvcigpOworICAgICAgICB9CisgICAgICAgICsrbG9jYWxWYXJDb3VudDsKKyAgICAgICAgbG9jYWxWYXIucHV0U2hvcnQoc3RhcnQucG9zaXRpb24pCisgICAgICAgICAgICAgICAgLnB1dFNob3J0KGVuZC5wb3NpdGlvbiAtIHN0YXJ0LnBvc2l0aW9uKQorICAgICAgICAgICAgICAgIC5wdXRTaG9ydChjdy5uZXdVVEY4KG5hbWUpKQorICAgICAgICAgICAgICAgIC5wdXRTaG9ydChjdy5uZXdVVEY4KGRlc2MpKQorICAgICAgICAgICAgICAgIC5wdXRTaG9ydChpbmRleCk7CisgICAgICAgIGlmIChjb21wdXRlICE9IE5PVEhJTkcpIHsKKyAgICAgICAgICAgIC8vIHVwZGF0ZXMgbWF4IGxvY2FscworICAgICAgICAgICAgY2hhciBjID0gZGVzYy5jaGFyQXQoMCk7CisgICAgICAgICAgICBpbnQgbiA9IGluZGV4ICsgKGMgPT0gJ0onIHx8IGMgPT0gJ0QnID8gMiA6IDEpOworICAgICAgICAgICAgaWYgKG4gPiBtYXhMb2NhbHMpIHsKKyAgICAgICAgICAgICAgICBtYXhMb2NhbHMgPSBuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRMaW5lTnVtYmVyKGZpbmFsIGludCBsaW5lLCBmaW5hbCBMYWJlbCBzdGFydCkgeworICAgICAgICBpZiAobGluZU51bWJlciA9PSBudWxsKSB7CisgICAgICAgICAgICBsaW5lTnVtYmVyID0gbmV3IEJ5dGVWZWN0b3IoKTsKKyAgICAgICAgfQorICAgICAgICArK2xpbmVOdW1iZXJDb3VudDsKKyAgICAgICAgbGluZU51bWJlci5wdXRTaG9ydChzdGFydC5wb3NpdGlvbik7CisgICAgICAgIGxpbmVOdW1iZXIucHV0U2hvcnQobGluZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRNYXhzKGZpbmFsIGludCBtYXhTdGFjaywgZmluYWwgaW50IG1heExvY2FscykgeworICAgICAgICBpZiAoQ2xhc3NSZWFkZXIuRlJBTUVTICYmIGNvbXB1dGUgPT0gRlJBTUVTKSB7CisgICAgICAgICAgICAvLyBjb21wbGV0ZXMgdGhlIGNvbnRyb2wgZmxvdyBncmFwaCB3aXRoIGV4Y2VwdGlvbiBoYW5kbGVyIGJsb2NrcworICAgICAgICAgICAgSGFuZGxlciBoYW5kbGVyID0gZmlyc3RIYW5kbGVyOworICAgICAgICAgICAgd2hpbGUgKGhhbmRsZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIExhYmVsIGwgPSBoYW5kbGVyLnN0YXJ0LmdldEZpcnN0KCk7CisgICAgICAgICAgICAgICAgTGFiZWwgaCA9IGhhbmRsZXIuaGFuZGxlci5nZXRGaXJzdCgpOworICAgICAgICAgICAgICAgIExhYmVsIGUgPSBoYW5kbGVyLmVuZC5nZXRGaXJzdCgpOworICAgICAgICAgICAgICAgIC8vIGNvbXB1dGVzIHRoZSBraW5kIG9mIHRoZSBlZGdlcyB0byAnaCcKKyAgICAgICAgICAgICAgICBTdHJpbmcgdCA9IGhhbmRsZXIuZGVzYyA9PSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICA/ICJqYXZhL2xhbmcvVGhyb3dhYmxlIgorICAgICAgICAgICAgICAgICAgICAgICAgOiBoYW5kbGVyLmRlc2M7CisgICAgICAgICAgICAgICAgaW50IGtpbmQgPSBGcmFtZS5PQkpFQ1QgfCBjdy5hZGRUeXBlKHQpOworICAgICAgICAgICAgICAgIC8vIGggaXMgYW4gZXhjZXB0aW9uIGhhbmRsZXIKKyAgICAgICAgICAgICAgICBoLnN0YXR1cyB8PSBMYWJlbC5UQVJHRVQ7CisgICAgICAgICAgICAgICAgLy8gYWRkcyAnaCcgYXMgYSBzdWNjZXNzb3Igb2YgbGFiZWxzIGJldHdlZW4gJ3N0YXJ0JyBhbmQgJ2VuZCcKKyAgICAgICAgICAgICAgICB3aGlsZSAobCAhPSBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZXMgYW4gZWRnZSB0byAnaCcKKyAgICAgICAgICAgICAgICAgICAgRWRnZSBiID0gbmV3IEVkZ2UoKTsKKyAgICAgICAgICAgICAgICAgICAgYi5pbmZvID0ga2luZDsKKyAgICAgICAgICAgICAgICAgICAgYi5zdWNjZXNzb3IgPSBoOworICAgICAgICAgICAgICAgICAgICAvLyBhZGRzIGl0IHRvIHRoZSBzdWNjZXNzb3JzIG9mICdsJworICAgICAgICAgICAgICAgICAgICBiLm5leHQgPSBsLnN1Y2Nlc3NvcnM7CisgICAgICAgICAgICAgICAgICAgIGwuc3VjY2Vzc29ycyA9IGI7CisgICAgICAgICAgICAgICAgICAgIC8vIGdvZXMgdG8gdGhlIG5leHQgbGFiZWwKKyAgICAgICAgICAgICAgICAgICAgbCA9IGwuc3VjY2Vzc29yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBoYW5kbGVyID0gaGFuZGxlci5uZXh0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBjcmVhdGVzIGFuZCB2aXNpdHMgdGhlIGZpcnN0IChpbXBsaWNpdCkgZnJhbWUKKyAgICAgICAgICAgIEZyYW1lIGYgPSBsYWJlbHMuZnJhbWU7CisgICAgICAgICAgICBUeXBlW10gYXJncyA9IFR5cGUuZ2V0QXJndW1lbnRUeXBlcyhkZXNjcmlwdG9yKTsKKyAgICAgICAgICAgIGYuaW5pdElucHV0RnJhbWUoY3csIGFjY2VzcywgYXJncywgdGhpcy5tYXhMb2NhbHMpOworICAgICAgICAgICAgdmlzaXRGcmFtZShmKTsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIGZpeCBwb2ludCBhbGdvcml0aG06IG1hcmsgdGhlIGZpcnN0IGJhc2ljIGJsb2NrIGFzICdjaGFuZ2VkJworICAgICAgICAgICAgICogKGkuZS4gcHV0IGl0IGluIHRoZSAnY2hhbmdlZCcgbGlzdCkgYW5kLCB3aGlsZSB0aGVyZSBhcmUgY2hhbmdlZAorICAgICAgICAgICAgICogYmFzaWMgYmxvY2tzLCBjaG9vc2Ugb25lLCBtYXJrIGl0IGFzIHVuY2hhbmdlZCwgYW5kIHVwZGF0ZSBpdHMKKyAgICAgICAgICAgICAqIHN1Y2Nlc3NvcnMgKHdoaWNoIGNhbiBiZSBjaGFuZ2VkIGluIHRoZSBwcm9jZXNzKS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaW50IG1heCA9IDA7CisgICAgICAgICAgICBMYWJlbCBjaGFuZ2VkID0gbGFiZWxzOworICAgICAgICAgICAgd2hpbGUgKGNoYW5nZWQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIHJlbW92ZXMgYSBiYXNpYyBibG9jayBmcm9tIHRoZSBsaXN0IG9mIGNoYW5nZWQgYmFzaWMgYmxvY2tzCisgICAgICAgICAgICAgICAgTGFiZWwgbCA9IGNoYW5nZWQ7CisgICAgICAgICAgICAgICAgY2hhbmdlZCA9IGNoYW5nZWQubmV4dDsKKyAgICAgICAgICAgICAgICBsLm5leHQgPSBudWxsOworICAgICAgICAgICAgICAgIGYgPSBsLmZyYW1lOworICAgICAgICAgICAgICAgIC8vIGEgcmVhY2hhYmxlIGp1bXAgdGFyZ2V0IG11c3QgYmUgc3RvcmVkIGluIHRoZSBzdGFjayBtYXAKKyAgICAgICAgICAgICAgICBpZiAoKGwuc3RhdHVzICYgTGFiZWwuVEFSR0VUKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGwuc3RhdHVzIHw9IExhYmVsLlNUT1JFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBhbGwgdmlzaXRlZCBsYWJlbHMgYXJlIHJlYWNoYWJsZSwgYnkgZGVmaW5pdGlvbgorICAgICAgICAgICAgICAgIGwuc3RhdHVzIHw9IExhYmVsLlJFQUNIQUJMRTsKKyAgICAgICAgICAgICAgICAvLyB1cGRhdGVzIHRoZSAoYWJzb2x1dGUpIG1heGltdW0gc3RhY2sgc2l6ZQorICAgICAgICAgICAgICAgIGludCBibG9ja01heCA9IGYuaW5wdXRTdGFjay5sZW5ndGggKyBsLm91dHB1dFN0YWNrTWF4OworICAgICAgICAgICAgICAgIGlmIChibG9ja01heCA+IG1heCkgeworICAgICAgICAgICAgICAgICAgICBtYXggPSBibG9ja01heDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gdXBkYXRlcyB0aGUgc3VjY2Vzc29ycyBvZiB0aGUgY3VycmVudCBiYXNpYyBibG9jaworICAgICAgICAgICAgICAgIEVkZ2UgZSA9IGwuc3VjY2Vzc29yczsKKyAgICAgICAgICAgICAgICB3aGlsZSAoZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIExhYmVsIG4gPSBlLnN1Y2Nlc3Nvci5nZXRGaXJzdCgpOworICAgICAgICAgICAgICAgICAgICBib29sZWFuIGNoYW5nZSA9IGYubWVyZ2UoY3csIG4uZnJhbWUsIGUuaW5mbyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjaGFuZ2UgJiYgbi5uZXh0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIG4gaGFzIGNoYW5nZWQgYW5kIGlzIG5vdCBhbHJlYWR5IGluIHRoZSAnY2hhbmdlZCcKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxpc3QsIGFkZHMgaXQgdG8gdGhpcyBsaXN0CisgICAgICAgICAgICAgICAgICAgICAgICBuLm5leHQgPSBjaGFuZ2VkOworICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCA9IG47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZSA9IGUubmV4dDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHZpc2l0cyBhbGwgdGhlIGZyYW1lcyB0aGF0IG11c3QgYmUgc3RvcmVkIGluIHRoZSBzdGFjayBtYXAKKyAgICAgICAgICAgIExhYmVsIGwgPSBsYWJlbHM7CisgICAgICAgICAgICB3aGlsZSAobCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZiA9IGwuZnJhbWU7CisgICAgICAgICAgICAgICAgaWYgKChsLnN0YXR1cyAmIExhYmVsLlNUT1JFKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHZpc2l0RnJhbWUoZik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgobC5zdGF0dXMgJiBMYWJlbC5SRUFDSEFCTEUpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZmluZHMgc3RhcnQgYW5kIGVuZCBvZiBkZWFkIGJhc2ljIGJsb2NrCisgICAgICAgICAgICAgICAgICAgIExhYmVsIGsgPSBsLnN1Y2Nlc3NvcjsKKyAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0ID0gbC5wb3NpdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgaW50IGVuZCA9IChrID09IG51bGwgPyBjb2RlLmxlbmd0aCA6IGsucG9zaXRpb24pIC0gMTsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgbm9uIGVtcHR5IGJhc2ljIGJsb2NrCisgICAgICAgICAgICAgICAgICAgIGlmIChlbmQgPj0gc3RhcnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heCA9IE1hdGgubWF4KG1heCwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYWNlcyBpbnN0cnVjdGlvbnMgd2l0aCBOT1AgLi4uIE5PUCBBVEhST1cKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZS5kYXRhW2ldID0gT3Bjb2Rlcy5OT1A7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBjb2RlLmRhdGFbZW5kXSA9IChieXRlKSBPcGNvZGVzLkFUSFJPVzsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVtaXRzIGEgZnJhbWUgZm9yIHRoaXMgdW5yZWFjaGFibGUgYmxvY2sKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0RnJhbWUoc3RhcnQsIDAsIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVbZnJhbWVJbmRleCsrXSA9IEZyYW1lLk9CSkVDVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGN3LmFkZFR5cGUoImphdmEvbGFuZy9UaHJvd2FibGUiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZEZyYW1lKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmVzIHRoZSBzdGFydC1lbmQgcmFuZ2UgZnJvbSB0aGUgZXhjZXB0aW9uIGhhbmRsZXJzCisgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEhhbmRsZXIgPSBIYW5kbGVyLnJlbW92ZShmaXJzdEhhbmRsZXIsIGwsIGspOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGwgPSBsLnN1Y2Nlc3NvcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaGFuZGxlciA9IGZpcnN0SGFuZGxlcjsKKyAgICAgICAgICAgIGhhbmRsZXJDb3VudCA9IDA7CisgICAgICAgICAgICB3aGlsZSAoaGFuZGxlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaGFuZGxlckNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgaGFuZGxlciA9IGhhbmRsZXIubmV4dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhpcy5tYXhTdGFjayA9IG1heDsKKyAgICAgICAgfSBlbHNlIGlmIChjb21wdXRlID09IE1BWFMpIHsKKyAgICAgICAgICAgIC8vIGNvbXBsZXRlcyB0aGUgY29udHJvbCBmbG93IGdyYXBoIHdpdGggZXhjZXB0aW9uIGhhbmRsZXIgYmxvY2tzCisgICAgICAgICAgICBIYW5kbGVyIGhhbmRsZXIgPSBmaXJzdEhhbmRsZXI7CisgICAgICAgICAgICB3aGlsZSAoaGFuZGxlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgTGFiZWwgbCA9IGhhbmRsZXIuc3RhcnQ7CisgICAgICAgICAgICAgICAgTGFiZWwgaCA9IGhhbmRsZXIuaGFuZGxlcjsKKyAgICAgICAgICAgICAgICBMYWJlbCBlID0gaGFuZGxlci5lbmQ7CisgICAgICAgICAgICAgICAgLy8gYWRkcyAnaCcgYXMgYSBzdWNjZXNzb3Igb2YgbGFiZWxzIGJldHdlZW4gJ3N0YXJ0JyBhbmQgJ2VuZCcKKyAgICAgICAgICAgICAgICB3aGlsZSAobCAhPSBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZXMgYW4gZWRnZSB0byAnaCcKKyAgICAgICAgICAgICAgICAgICAgRWRnZSBiID0gbmV3IEVkZ2UoKTsKKyAgICAgICAgICAgICAgICAgICAgYi5pbmZvID0gRWRnZS5FWENFUFRJT047CisgICAgICAgICAgICAgICAgICAgIGIuc3VjY2Vzc29yID0gaDsKKyAgICAgICAgICAgICAgICAgICAgLy8gYWRkcyBpdCB0byB0aGUgc3VjY2Vzc29ycyBvZiAnbCcKKyAgICAgICAgICAgICAgICAgICAgaWYgKChsLnN0YXR1cyAmIExhYmVsLkpTUikgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYi5uZXh0ID0gbC5zdWNjZXNzb3JzOworICAgICAgICAgICAgICAgICAgICAgICAgbC5zdWNjZXNzb3JzID0gYjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGwgaXMgYSBKU1IgYmxvY2ssIGFkZHMgYiBhZnRlciB0aGUgZmlyc3QgdHdvIGVkZ2VzCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBwcmVzZXJ2ZSB0aGUgaHlwb3RoZXNpcyBhYm91dCBKU1IgYmxvY2sgc3VjY2Vzc29ycworICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3JkZXIgKHNlZSB7QGxpbmsgI3Zpc2l0SnVtcEluc259KQorICAgICAgICAgICAgICAgICAgICAgICAgYi5uZXh0ID0gbC5zdWNjZXNzb3JzLm5leHQubmV4dDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGwuc3VjY2Vzc29ycy5uZXh0Lm5leHQgPSBiOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIGdvZXMgdG8gdGhlIG5leHQgbGFiZWwKKyAgICAgICAgICAgICAgICAgICAgbCA9IGwuc3VjY2Vzc29yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBoYW5kbGVyID0gaGFuZGxlci5uZXh0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc3Vicm91dGluZXMgPiAwKSB7CisgICAgICAgICAgICAgICAgLy8gY29tcGxldGVzIHRoZSBjb250cm9sIGZsb3cgZ3JhcGggd2l0aCB0aGUgUkVUIHN1Y2Nlc3NvcnMKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIGZpcnN0IHN0ZXA6IGZpbmRzIHRoZSBzdWJyb3V0aW5lcy4gVGhpcyBzdGVwIGRldGVybWluZXMsIGZvcgorICAgICAgICAgICAgICAgICAqIGVhY2ggYmFzaWMgYmxvY2ssIHRvIHdoaWNoIHN1YnJvdXRpbmUocykgaXQgYmVsb25ncy4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAvLyBmaW5kcyB0aGUgYmFzaWMgYmxvY2tzIHRoYXQgYmVsb25nIHRvIHRoZSAibWFpbiIgc3Vicm91dGluZQorICAgICAgICAgICAgICAgIGludCBpZCA9IDA7CisgICAgICAgICAgICAgICAgbGFiZWxzLnZpc2l0U3Vicm91dGluZShudWxsLCAxLCBzdWJyb3V0aW5lcyk7CisgICAgICAgICAgICAgICAgLy8gZmluZHMgdGhlIGJhc2ljIGJsb2NrcyB0aGF0IGJlbG9uZyB0byB0aGUgcmVhbCBzdWJyb3V0aW5lcworICAgICAgICAgICAgICAgIExhYmVsIGwgPSBsYWJlbHM7CisgICAgICAgICAgICAgICAgd2hpbGUgKGwgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoKGwuc3RhdHVzICYgTGFiZWwuSlNSKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc3Vicm91dGluZSBpcyBkZWZpbmVkIGJ5IGwncyBUQVJHRVQsIG5vdCBieSBsCisgICAgICAgICAgICAgICAgICAgICAgICBMYWJlbCBzdWJyb3V0aW5lID0gbC5zdWNjZXNzb3JzLm5leHQuc3VjY2Vzc29yOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBzdWJyb3V0aW5lIGhhcyBub3QgYmVlbiB2aXNpdGVkIHlldC4uLgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzdWJyb3V0aW5lLnN0YXR1cyAmIExhYmVsLlZJU0lURUQpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi5hc3NpZ25zIGl0IGEgbmV3IGlkIGFuZCBmaW5kcyBpdHMgYmFzaWMgYmxvY2tzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJyb3V0aW5lLnZpc2l0U3Vicm91dGluZShudWxsLCAoaWQgLyAzMkwpIDw8IDMyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgxTCA8PCAoaWQgJSAzMikpLCBzdWJyb3V0aW5lcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbCA9IGwuc3VjY2Vzc29yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBzZWNvbmQgc3RlcDogZmluZHMgdGhlIHN1Y2Nlc3NvcnMgb2YgUkVUIGJsb2NrcworICAgICAgICAgICAgICAgIGwgPSBsYWJlbHM7CisgICAgICAgICAgICAgICAgd2hpbGUgKGwgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoKGwuc3RhdHVzICYgTGFiZWwuSlNSKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMYWJlbCBMID0gbGFiZWxzOworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKEwgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwuc3RhdHVzICY9IH5MYWJlbC5WSVNJVEVEMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMID0gTC5zdWNjZXNzb3I7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc3Vicm91dGluZSBpcyBkZWZpbmVkIGJ5IGwncyBUQVJHRVQsIG5vdCBieSBsCisgICAgICAgICAgICAgICAgICAgICAgICBMYWJlbCBzdWJyb3V0aW5lID0gbC5zdWNjZXNzb3JzLm5leHQuc3VjY2Vzc29yOworICAgICAgICAgICAgICAgICAgICAgICAgc3Vicm91dGluZS52aXNpdFN1YnJvdXRpbmUobCwgMCwgc3Vicm91dGluZXMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGwgPSBsLnN1Y2Nlc3NvcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBjb250cm9sIGZsb3cgYW5hbHlzaXMgYWxnb3JpdGhtOiB3aGlsZSB0aGUgYmxvY2sgc3RhY2sgaXMgbm90CisgICAgICAgICAgICAgKiBlbXB0eSwgcG9wIGEgYmxvY2sgZnJvbSB0aGlzIHN0YWNrLCB1cGRhdGUgdGhlIG1heCBzdGFjayBzaXplLAorICAgICAgICAgICAgICogY29tcHV0ZSB0aGUgdHJ1ZSAobm9uIHJlbGF0aXZlKSBiZWdpbiBzdGFjayBzaXplIG9mIHRoZQorICAgICAgICAgICAgICogc3VjY2Vzc29ycyBvZiB0aGlzIGJsb2NrLCBhbmQgcHVzaCB0aGVzZSBzdWNjZXNzb3JzIG9udG8gdGhlCisgICAgICAgICAgICAgKiBzdGFjayAodW5sZXNzIHRoZXkgaGF2ZSBhbHJlYWR5IGJlZW4gcHVzaGVkIG9udG8gdGhlIHN0YWNrKS4KKyAgICAgICAgICAgICAqIE5vdGU6IGJ5IGh5cG90aGVzaXMsIHRoZSB7QGxpbmsgTGFiZWwjaW5wdXRTdGFja1RvcH0gb2YgdGhlCisgICAgICAgICAgICAgKiBibG9ja3MgaW4gdGhlIGJsb2NrIHN0YWNrIGFyZSB0aGUgdHJ1ZSAobm9uIHJlbGF0aXZlKSBiZWdpbm5pbmcKKyAgICAgICAgICAgICAqIHN0YWNrIHNpemVzIG9mIHRoZXNlIGJsb2Nrcy4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaW50IG1heCA9IDA7CisgICAgICAgICAgICBMYWJlbCBzdGFjayA9IGxhYmVsczsKKyAgICAgICAgICAgIHdoaWxlIChzdGFjayAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gcG9wcyBhIGJsb2NrIGZyb20gdGhlIHN0YWNrCisgICAgICAgICAgICAgICAgTGFiZWwgbCA9IHN0YWNrOworICAgICAgICAgICAgICAgIHN0YWNrID0gc3RhY2submV4dDsKKyAgICAgICAgICAgICAgICAvLyBjb21wdXRlcyB0aGUgdHJ1ZSAobm9uIHJlbGF0aXZlKSBtYXggc3RhY2sgc2l6ZSBvZiB0aGlzIGJsb2NrCisgICAgICAgICAgICAgICAgaW50IHN0YXJ0ID0gbC5pbnB1dFN0YWNrVG9wOworICAgICAgICAgICAgICAgIGludCBibG9ja01heCA9IHN0YXJ0ICsgbC5vdXRwdXRTdGFja01heDsKKyAgICAgICAgICAgICAgICAvLyB1cGRhdGVzIHRoZSBnbG9iYWwgbWF4IHN0YWNrIHNpemUKKyAgICAgICAgICAgICAgICBpZiAoYmxvY2tNYXggPiBtYXgpIHsKKyAgICAgICAgICAgICAgICAgICAgbWF4ID0gYmxvY2tNYXg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIGFuYWx5emVzIHRoZSBzdWNjZXNzb3JzIG9mIHRoZSBibG9jaworICAgICAgICAgICAgICAgIEVkZ2UgYiA9IGwuc3VjY2Vzc29yczsKKyAgICAgICAgICAgICAgICBpZiAoKGwuc3RhdHVzICYgTGFiZWwuSlNSKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZXMgdGhlIGZpcnN0IGVkZ2Ugb2YgSlNSIGJsb2NrcyAodmlydHVhbCBzdWNjZXNzb3IpCisgICAgICAgICAgICAgICAgICAgIGIgPSBiLm5leHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdoaWxlIChiICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbCA9IGIuc3VjY2Vzc29yOworICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIHN1Y2Nlc3NvciBoYXMgbm90IGFscmVhZHkgYmVlbiBwdXNoZWQuLi4KKyAgICAgICAgICAgICAgICAgICAgaWYgKChsLnN0YXR1cyAmIExhYmVsLlBVU0hFRCkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29tcHV0ZXMgaXRzIHRydWUgYmVnaW5uaW5nIHN0YWNrIHNpemUuLi4KKyAgICAgICAgICAgICAgICAgICAgICAgIGwuaW5wdXRTdGFja1RvcCA9IGIuaW5mbyA9PSBFZGdlLkVYQ0VQVElPTiA/IDEgOiBzdGFydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGIuaW5mbzsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uLmFuZCBwdXNoZXMgaXQgb250byB0aGUgc3RhY2sKKyAgICAgICAgICAgICAgICAgICAgICAgIGwuc3RhdHVzIHw9IExhYmVsLlBVU0hFRDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGwubmV4dCA9IHN0YWNrOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sgPSBsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGIgPSBiLm5leHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhpcy5tYXhTdGFjayA9IE1hdGgubWF4KG1heFN0YWNrLCBtYXgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhpcy5tYXhTdGFjayA9IG1heFN0YWNrOworICAgICAgICAgICAgdGhpcy5tYXhMb2NhbHMgPSBtYXhMb2NhbHM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEVuZCgpIHsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBVdGlsaXR5IG1ldGhvZHM6IGNvbnRyb2wgZmxvdyBhbmFseXNpcyBhbGdvcml0aG0KKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBzdWNjZXNzb3IgdG8gdGhlIHtAbGluayAjY3VycmVudEJsb2NrIGN1cnJlbnRCbG9ja30gYmxvY2suCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5mbyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29udHJvbCBmbG93IGVkZ2UgdG8gYmUgYWRkZWQuCisgICAgICogQHBhcmFtIHN1Y2Nlc3NvciB0aGUgc3VjY2Vzc29yIGJsb2NrIHRvIGJlIGFkZGVkIHRvIHRoZSBjdXJyZW50IGJsb2NrLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhZGRTdWNjZXNzb3IoZmluYWwgaW50IGluZm8sIGZpbmFsIExhYmVsIHN1Y2Nlc3NvcikgeworICAgICAgICAvLyBjcmVhdGVzIGFuZCBpbml0aWFsaXplcyBhbiBFZGdlIG9iamVjdC4uLgorICAgICAgICBFZGdlIGIgPSBuZXcgRWRnZSgpOworICAgICAgICBiLmluZm8gPSBpbmZvOworICAgICAgICBiLnN1Y2Nlc3NvciA9IHN1Y2Nlc3NvcjsKKyAgICAgICAgLy8gLi4uYW5kIGFkZHMgaXQgdG8gdGhlIHN1Y2Nlc3NvciBsaXN0IG9mIHRoZSBjdXJyZW50QmxvY2sgYmxvY2sKKyAgICAgICAgYi5uZXh0ID0gY3VycmVudEJsb2NrLnN1Y2Nlc3NvcnM7CisgICAgICAgIGN1cnJlbnRCbG9jay5zdWNjZXNzb3JzID0gYjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmRzIHRoZSBjdXJyZW50IGJhc2ljIGJsb2NrLiBUaGlzIG1ldGhvZCBtdXN0IGJlIHVzZWQgaW4gdGhlIGNhc2Ugd2hlcmUKKyAgICAgKiB0aGUgY3VycmVudCBiYXNpYyBibG9jayBkb2VzIG5vdCBoYXZlIGFueSBzdWNjZXNzb3IuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIG5vU3VjY2Vzc29yKCkgeworICAgICAgICBpZiAoY29tcHV0ZSA9PSBGUkFNRVMpIHsKKyAgICAgICAgICAgIExhYmVsIGwgPSBuZXcgTGFiZWwoKTsKKyAgICAgICAgICAgIGwuZnJhbWUgPSBuZXcgRnJhbWUoKTsKKyAgICAgICAgICAgIGwuZnJhbWUub3duZXIgPSBsOworICAgICAgICAgICAgbC5yZXNvbHZlKHRoaXMsIGNvZGUubGVuZ3RoLCBjb2RlLmRhdGEpOworICAgICAgICAgICAgcHJldmlvdXNCbG9jay5zdWNjZXNzb3IgPSBsOworICAgICAgICAgICAgcHJldmlvdXNCbG9jayA9IGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjdXJyZW50QmxvY2sub3V0cHV0U3RhY2tNYXggPSBtYXhTdGFja1NpemU7CisgICAgICAgIH0KKyAgICAgICAgY3VycmVudEJsb2NrID0gbnVsbDsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBVdGlsaXR5IG1ldGhvZHM6IHN0YWNrIG1hcCBmcmFtZXMKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8qKgorICAgICAqIFZpc2l0cyBhIGZyYW1lIHRoYXQgaGFzIGJlZW4gY29tcHV0ZWQgZnJvbSBzY3JhdGNoLgorICAgICAqCisgICAgICogQHBhcmFtIGYgdGhlIGZyYW1lIHRoYXQgbXVzdCBiZSB2aXNpdGVkLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB2aXNpdEZyYW1lKGZpbmFsIEZyYW1lIGYpIHsKKyAgICAgICAgaW50IGksIHQ7CisgICAgICAgIGludCBuVG9wID0gMDsKKyAgICAgICAgaW50IG5Mb2NhbCA9IDA7CisgICAgICAgIGludCBuU3RhY2sgPSAwOworICAgICAgICBpbnRbXSBsb2NhbHMgPSBmLmlucHV0TG9jYWxzOworICAgICAgICBpbnRbXSBzdGFja3MgPSBmLmlucHV0U3RhY2s7CisgICAgICAgIC8vIGNvbXB1dGVzIHRoZSBudW1iZXIgb2YgbG9jYWxzIChpZ25vcmVzIFRPUCB0eXBlcyB0aGF0IGFyZSBqdXN0IGFmdGVyCisgICAgICAgIC8vIGEgTE9ORyBvciBhIERPVUJMRSwgYW5kIGFsbCB0cmFpbGluZyBUT1AgdHlwZXMpCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsb2NhbHMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIHQgPSBsb2NhbHNbaV07CisgICAgICAgICAgICBpZiAodCA9PSBGcmFtZS5UT1ApIHsKKyAgICAgICAgICAgICAgICArK25Ub3A7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG5Mb2NhbCArPSBuVG9wICsgMTsKKyAgICAgICAgICAgICAgICBuVG9wID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0ID09IEZyYW1lLkxPTkcgfHwgdCA9PSBGcmFtZS5ET1VCTEUpIHsKKyAgICAgICAgICAgICAgICArK2k7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gY29tcHV0ZXMgdGhlIHN0YWNrIHNpemUgKGlnbm9yZXMgVE9QIHR5cGVzIHRoYXQgYXJlIGp1c3QgYWZ0ZXIKKyAgICAgICAgLy8gYSBMT05HIG9yIGEgRE9VQkxFKQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3RhY2tzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICB0ID0gc3RhY2tzW2ldOworICAgICAgICAgICAgKytuU3RhY2s7CisgICAgICAgICAgICBpZiAodCA9PSBGcmFtZS5MT05HIHx8IHQgPT0gRnJhbWUuRE9VQkxFKSB7CisgICAgICAgICAgICAgICAgKytpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIHZpc2l0cyB0aGUgZnJhbWUgYW5kIGl0cyBjb250ZW50CisgICAgICAgIHN0YXJ0RnJhbWUoZi5vd25lci5wb3NpdGlvbiwgbkxvY2FsLCBuU3RhY2spOworICAgICAgICBmb3IgKGkgPSAwOyBuTG9jYWwgPiAwOyArK2ksIC0tbkxvY2FsKSB7CisgICAgICAgICAgICB0ID0gbG9jYWxzW2ldOworICAgICAgICAgICAgZnJhbWVbZnJhbWVJbmRleCsrXSA9IHQ7CisgICAgICAgICAgICBpZiAodCA9PSBGcmFtZS5MT05HIHx8IHQgPT0gRnJhbWUuRE9VQkxFKSB7CisgICAgICAgICAgICAgICAgKytpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzdGFja3MubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIHQgPSBzdGFja3NbaV07CisgICAgICAgICAgICBmcmFtZVtmcmFtZUluZGV4KytdID0gdDsKKyAgICAgICAgICAgIGlmICh0ID09IEZyYW1lLkxPTkcgfHwgdCA9PSBGcmFtZS5ET1VCTEUpIHsKKyAgICAgICAgICAgICAgICArK2k7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZW5kRnJhbWUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdGFydHMgdGhlIHZpc2l0IG9mIGEgc3RhY2sgbWFwIGZyYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0IG9mIHRoZSBpbnN0cnVjdGlvbiB0byB3aGljaCB0aGUgZnJhbWUKKyAgICAgKiAgICAgICAgY29ycmVzcG9uZHMuCisgICAgICogQHBhcmFtIG5Mb2NhbCB0aGUgbnVtYmVyIG9mIGxvY2FsIHZhcmlhYmxlcyBpbiB0aGUgZnJhbWUuCisgICAgICogQHBhcmFtIG5TdGFjayB0aGUgbnVtYmVyIG9mIHN0YWNrIGVsZW1lbnRzIGluIHRoZSBmcmFtZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc3RhcnRGcmFtZShmaW5hbCBpbnQgb2Zmc2V0LCBmaW5hbCBpbnQgbkxvY2FsLCBmaW5hbCBpbnQgblN0YWNrKQorICAgIHsKKyAgICAgICAgaW50IG4gPSAzICsgbkxvY2FsICsgblN0YWNrOworICAgICAgICBpZiAoZnJhbWUgPT0gbnVsbCB8fCBmcmFtZS5sZW5ndGggPCBuKSB7CisgICAgICAgICAgICBmcmFtZSA9IG5ldyBpbnRbbl07CisgICAgICAgIH0KKyAgICAgICAgZnJhbWVbMF0gPSBvZmZzZXQ7CisgICAgICAgIGZyYW1lWzFdID0gbkxvY2FsOworICAgICAgICBmcmFtZVsyXSA9IG5TdGFjazsKKyAgICAgICAgZnJhbWVJbmRleCA9IDM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIGlmIHRoZSB2aXNpdCBvZiB0aGUgY3VycmVudCBmcmFtZSB7QGxpbmsgI2ZyYW1lfSBpcyBmaW5pc2hlZCwgYW5kCisgICAgICogaWYgeWVzLCB3cml0ZSBpdCBpbiB0aGUgU3RhY2tNYXBUYWJsZSBhdHRyaWJ1dGUuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGVuZEZyYW1lKCkgeworICAgICAgICBpZiAocHJldmlvdXNGcmFtZSAhPSBudWxsKSB7IC8vIGRvIG5vdCB3cml0ZSB0aGUgZmlyc3QgZnJhbWUKKyAgICAgICAgICAgIGlmIChzdGFja01hcCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgc3RhY2tNYXAgPSBuZXcgQnl0ZVZlY3RvcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd3JpdGVGcmFtZSgpOworICAgICAgICAgICAgKytmcmFtZUNvdW50OworICAgICAgICB9CisgICAgICAgIHByZXZpb3VzRnJhbWUgPSBmcmFtZTsKKyAgICAgICAgZnJhbWUgPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbXByZXNzIGFuZCB3cml0ZXMgdGhlIGN1cnJlbnQgZnJhbWUge0BsaW5rICNmcmFtZX0gaW4gdGhlIFN0YWNrTWFwVGFibGUKKyAgICAgKiBhdHRyaWJ1dGUuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlRnJhbWUoKSB7CisgICAgICAgIGludCBjbG9jYWxzU2l6ZSA9IGZyYW1lWzFdOworICAgICAgICBpbnQgY3N0YWNrU2l6ZSA9IGZyYW1lWzJdOworICAgICAgICBpZiAoKGN3LnZlcnNpb24gJiAweEZGRkYpIDwgT3Bjb2Rlcy5WMV82KSB7CisgICAgICAgICAgICBzdGFja01hcC5wdXRTaG9ydChmcmFtZVswXSkucHV0U2hvcnQoY2xvY2Fsc1NpemUpOworICAgICAgICAgICAgd3JpdGVGcmFtZVR5cGVzKDMsIDMgKyBjbG9jYWxzU2l6ZSk7CisgICAgICAgICAgICBzdGFja01hcC5wdXRTaG9ydChjc3RhY2tTaXplKTsKKyAgICAgICAgICAgIHdyaXRlRnJhbWVUeXBlcygzICsgY2xvY2Fsc1NpemUsIDMgKyBjbG9jYWxzU2l6ZSArIGNzdGFja1NpemUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGludCBsb2NhbHNTaXplID0gcHJldmlvdXNGcmFtZVsxXTsKKyAgICAgICAgaW50IHR5cGUgPSBGVUxMX0ZSQU1FOworICAgICAgICBpbnQgayA9IDA7CisgICAgICAgIGludCBkZWx0YTsKKyAgICAgICAgaWYgKGZyYW1lQ291bnQgPT0gMCkgeworICAgICAgICAgICAgZGVsdGEgPSBmcmFtZVswXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRlbHRhID0gZnJhbWVbMF0gLSBwcmV2aW91c0ZyYW1lWzBdIC0gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY3N0YWNrU2l6ZSA9PSAwKSB7CisgICAgICAgICAgICBrID0gY2xvY2Fsc1NpemUgLSBsb2NhbHNTaXplOworICAgICAgICAgICAgc3dpdGNoIChrKSB7CisgICAgICAgICAgICAgICAgY2FzZSAtMzoKKyAgICAgICAgICAgICAgICBjYXNlIC0yOgorICAgICAgICAgICAgICAgIGNhc2UgLTE6CisgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBDSE9QX0ZSQU1FOworICAgICAgICAgICAgICAgICAgICBsb2NhbHNTaXplID0gY2xvY2Fsc1NpemU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgdHlwZSA9IGRlbHRhIDwgNjQgPyBTQU1FX0ZSQU1FIDogU0FNRV9GUkFNRV9FWFRFTkRFRDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBBUFBFTkRfRlJBTUU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGNsb2NhbHNTaXplID09IGxvY2Fsc1NpemUgJiYgY3N0YWNrU2l6ZSA9PSAxKSB7CisgICAgICAgICAgICB0eXBlID0gZGVsdGEgPCA2MworICAgICAgICAgICAgICAgICAgICA/IFNBTUVfTE9DQUxTXzFfU1RBQ0tfSVRFTV9GUkFNRQorICAgICAgICAgICAgICAgICAgICA6IFNBTUVfTE9DQUxTXzFfU1RBQ0tfSVRFTV9GUkFNRV9FWFRFTkRFRDsKKyAgICAgICAgfQorICAgICAgICBpZiAodHlwZSAhPSBGVUxMX0ZSQU1FKSB7CisgICAgICAgICAgICAvLyB2ZXJpZnkgaWYgbG9jYWxzIGFyZSB0aGUgc2FtZQorICAgICAgICAgICAgaW50IGwgPSAzOworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBsb2NhbHNTaXplOyBqKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoZnJhbWVbbF0gIT0gcHJldmlvdXNGcmFtZVtsXSkgeworICAgICAgICAgICAgICAgICAgICB0eXBlID0gRlVMTF9GUkFNRTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGwrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgU0FNRV9GUkFNRToKKyAgICAgICAgICAgICAgICBzdGFja01hcC5wdXRCeXRlKGRlbHRhKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU0FNRV9MT0NBTFNfMV9TVEFDS19JVEVNX0ZSQU1FOgorICAgICAgICAgICAgICAgIHN0YWNrTWFwLnB1dEJ5dGUoU0FNRV9MT0NBTFNfMV9TVEFDS19JVEVNX0ZSQU1FICsgZGVsdGEpOworICAgICAgICAgICAgICAgIHdyaXRlRnJhbWVUeXBlcygzICsgY2xvY2Fsc1NpemUsIDQgKyBjbG9jYWxzU2l6ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNBTUVfTE9DQUxTXzFfU1RBQ0tfSVRFTV9GUkFNRV9FWFRFTkRFRDoKKyAgICAgICAgICAgICAgICBzdGFja01hcC5wdXRCeXRlKFNBTUVfTE9DQUxTXzFfU1RBQ0tfSVRFTV9GUkFNRV9FWFRFTkRFRCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5wdXRTaG9ydChkZWx0YSk7CisgICAgICAgICAgICAgICAgd3JpdGVGcmFtZVR5cGVzKDMgKyBjbG9jYWxzU2l6ZSwgNCArIGNsb2NhbHNTaXplKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU0FNRV9GUkFNRV9FWFRFTkRFRDoKKyAgICAgICAgICAgICAgICBzdGFja01hcC5wdXRCeXRlKFNBTUVfRlJBTUVfRVhURU5ERUQpLnB1dFNob3J0KGRlbHRhKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ0hPUF9GUkFNRToKKyAgICAgICAgICAgICAgICBzdGFja01hcC5wdXRCeXRlKFNBTUVfRlJBTUVfRVhURU5ERUQgKyBrKS5wdXRTaG9ydChkZWx0YSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFQUEVORF9GUkFNRToKKyAgICAgICAgICAgICAgICBzdGFja01hcC5wdXRCeXRlKFNBTUVfRlJBTUVfRVhURU5ERUQgKyBrKS5wdXRTaG9ydChkZWx0YSk7CisgICAgICAgICAgICAgICAgd3JpdGVGcmFtZVR5cGVzKDMgKyBsb2NhbHNTaXplLCAzICsgY2xvY2Fsc1NpemUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgLy8gY2FzZSBGVUxMX0ZSQU1FOgorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBzdGFja01hcC5wdXRCeXRlKEZVTExfRlJBTUUpCisgICAgICAgICAgICAgICAgICAgICAgICAucHV0U2hvcnQoZGVsdGEpCisgICAgICAgICAgICAgICAgICAgICAgICAucHV0U2hvcnQoY2xvY2Fsc1NpemUpOworICAgICAgICAgICAgICAgIHdyaXRlRnJhbWVUeXBlcygzLCAzICsgY2xvY2Fsc1NpemUpOworICAgICAgICAgICAgICAgIHN0YWNrTWFwLnB1dFNob3J0KGNzdGFja1NpemUpOworICAgICAgICAgICAgICAgIHdyaXRlRnJhbWVUeXBlcygzICsgY2xvY2Fsc1NpemUsIDMgKyBjbG9jYWxzU2l6ZSArIGNzdGFja1NpemUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGVzIHNvbWUgdHlwZXMgb2YgdGhlIGN1cnJlbnQgZnJhbWUge0BsaW5rICNmcmFtZX0gaW50byB0aGUKKyAgICAgKiBTdGFja01hcFRhYmxlQXR0cmlidXRlLiBUaGlzIG1ldGhvZCBjb252ZXJ0cyB0eXBlcyBmcm9tIHRoZSBmb3JtYXQgdXNlZAorICAgICAqIGluIHtAbGluayBMYWJlbH0gdG8gdGhlIGZvcm1hdCB1c2VkIGluIFN0YWNrTWFwVGFibGUgYXR0cmlidXRlcy4gSW4KKyAgICAgKiBwYXJ0aWN1bGFyLCBpdCBjb252ZXJ0cyB0eXBlIHRhYmxlIGluZGV4ZXMgdG8gY29uc3RhbnQgcG9vbCBpbmRleGVzLgorICAgICAqCisgICAgICogQHBhcmFtIHN0YXJ0IGluZGV4IG9mIHRoZSBmaXJzdCB0eXBlIGluIHtAbGluayAjZnJhbWV9IHRvIHdyaXRlLgorICAgICAqIEBwYXJhbSBlbmQgaW5kZXggb2YgbGFzdCB0eXBlIGluIHtAbGluayAjZnJhbWV9IHRvIHdyaXRlIChleGNsdXNpdmUpLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB3cml0ZUZyYW1lVHlwZXMoZmluYWwgaW50IHN0YXJ0LCBmaW5hbCBpbnQgZW5kKSB7CisgICAgICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7CisgICAgICAgICAgICBpbnQgdCA9IGZyYW1lW2ldOworICAgICAgICAgICAgaW50IGQgPSB0ICYgRnJhbWUuRElNOworICAgICAgICAgICAgaWYgKGQgPT0gMCkgeworICAgICAgICAgICAgICAgIGludCB2ID0gdCAmIEZyYW1lLkJBU0VfVkFMVUU7CisgICAgICAgICAgICAgICAgc3dpdGNoICh0ICYgRnJhbWUuQkFTRV9LSU5EKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgRnJhbWUuT0JKRUNUOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2tNYXAucHV0Qnl0ZSg3KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHV0U2hvcnQoY3cubmV3Q2xhc3MoY3cudHlwZVRhYmxlW3ZdLnN0clZhbDEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEZyYW1lLlVOSU5JVElBTElaRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGFja01hcC5wdXRCeXRlKDgpLnB1dFNob3J0KGN3LnR5cGVUYWJsZVt2XS5pbnRWYWwpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGFja01hcC5wdXRCeXRlKHYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgICAgICAgICBkID4+PSAyODsKKyAgICAgICAgICAgICAgICB3aGlsZSAoZC0tID4gMCkgeworICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCdbJyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgodCAmIEZyYW1lLkJBU0VfS0lORCkgPT0gRnJhbWUuT0JKRUNUKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoJ0wnKTsKKyAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChjdy50eXBlVGFibGVbdCAmIEZyYW1lLkJBU0VfVkFMVUVdLnN0clZhbDEpOworICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCc7Jyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0ICYgMHhGKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgnSScpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoJ0YnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCdEJyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgnWicpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCdCJyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDExOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoJ0MnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgnUycpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCdKJyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RhY2tNYXAucHV0Qnl0ZSg3KS5wdXRTaG9ydChjdy5uZXdDbGFzcyhidWYudG9TdHJpbmcoKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlRnJhbWVUeXBlKGZpbmFsIE9iamVjdCB0eXBlKSB7CisgICAgICAgIGlmICh0eXBlIGluc3RhbmNlb2YgU3RyaW5nKSB7CisgICAgICAgICAgICBzdGFja01hcC5wdXRCeXRlKDcpLnB1dFNob3J0KGN3Lm5ld0NsYXNzKChTdHJpbmcpIHR5cGUpKTsKKyAgICAgICAgfSBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgSW50ZWdlcikgeworICAgICAgICAgICAgc3RhY2tNYXAucHV0Qnl0ZSgoKEludGVnZXIpIHR5cGUpLmludFZhbHVlKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhY2tNYXAucHV0Qnl0ZSg4KS5wdXRTaG9ydCgoKExhYmVsKSB0eXBlKS5wb3NpdGlvbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBVdGlsaXR5IG1ldGhvZHM6IGR1bXAgYnl0ZWNvZGUgYXJyYXkKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHNpemUgb2YgdGhlIGJ5dGVjb2RlIG9mIHRoaXMgbWV0aG9kLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgYnl0ZWNvZGUgb2YgdGhpcyBtZXRob2QuCisgICAgICovCisgICAgZmluYWwgaW50IGdldFNpemUoKSB7CisgICAgICAgIGlmIChjbGFzc1JlYWRlck9mZnNldCAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gNiArIGNsYXNzUmVhZGVyTGVuZ3RoOworICAgICAgICB9CisgICAgICAgIGlmIChyZXNpemUpIHsKKyAgICAgICAgICAgIC8vIHJlcGxhY2VzIHRoZSB0ZW1wb3JhcnkganVtcCBvcGNvZGVzIGludHJvZHVjZWQgYnkgTGFiZWwucmVzb2x2ZS4KKyAgICAgICAgICAgIGlmIChDbGFzc1JlYWRlci5SRVNJWkUpIHsKKyAgICAgICAgICAgICAgICByZXNpemVJbnN0cnVjdGlvbnMoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk1ldGhvZCBjb2RlIHRvbyBsYXJnZSEiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbnQgc2l6ZSA9IDg7CisgICAgICAgIGlmIChjb2RlLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgIGlmIChjb2RlLmxlbmd0aCA+IDY1NTM2KSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk1ldGhvZCBjb2RlIHRvbyBsYXJnZSEiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGN3Lm5ld1VURjgoIkNvZGUiKTsKKyAgICAgICAgICAgIHNpemUgKz0gMTggKyBjb2RlLmxlbmd0aCArIDggKiBoYW5kbGVyQ291bnQ7CisgICAgICAgICAgICBpZiAobG9jYWxWYXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGN3Lm5ld1VURjgoIkxvY2FsVmFyaWFibGVUYWJsZSIpOworICAgICAgICAgICAgICAgIHNpemUgKz0gOCArIGxvY2FsVmFyLmxlbmd0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsb2NhbFZhclR5cGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGN3Lm5ld1VURjgoIkxvY2FsVmFyaWFibGVUeXBlVGFibGUiKTsKKyAgICAgICAgICAgICAgICBzaXplICs9IDggKyBsb2NhbFZhclR5cGUubGVuZ3RoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGxpbmVOdW1iZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGN3Lm5ld1VURjgoIkxpbmVOdW1iZXJUYWJsZSIpOworICAgICAgICAgICAgICAgIHNpemUgKz0gOCArIGxpbmVOdW1iZXIubGVuZ3RoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0YWNrTWFwICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBib29sZWFuIHppcCA9IChjdy52ZXJzaW9uICYgMHhGRkZGKSA+PSBPcGNvZGVzLlYxXzY7CisgICAgICAgICAgICAgICAgY3cubmV3VVRGOCh6aXAgPyAiU3RhY2tNYXBUYWJsZSIgOiAiU3RhY2tNYXAiKTsKKyAgICAgICAgICAgICAgICBzaXplICs9IDggKyBzdGFja01hcC5sZW5ndGg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2F0dHJzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzaXplICs9IGNhdHRycy5nZXRTaXplKGN3LAorICAgICAgICAgICAgICAgICAgICAgICAgY29kZS5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgY29kZS5sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICBtYXhTdGFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heExvY2Fscyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGV4Y2VwdGlvbkNvdW50ID4gMCkgeworICAgICAgICAgICAgY3cubmV3VVRGOCgiRXhjZXB0aW9ucyIpOworICAgICAgICAgICAgc2l6ZSArPSA4ICsgMiAqIGV4Y2VwdGlvbkNvdW50OworICAgICAgICB9CisgICAgICAgIGlmICgoYWNjZXNzICYgT3Bjb2Rlcy5BQ0NfU1lOVEhFVElDKSAhPSAwCisgICAgICAgICAgICAgICAgJiYgKChjdy52ZXJzaW9uICYgMHhGRkZGKSA8IE9wY29kZXMuVjFfNSB8fCAoYWNjZXNzICYgQ2xhc3NXcml0ZXIuQUNDX1NZTlRIRVRJQ19BVFRSSUJVVEUpICE9IDApKQorICAgICAgICB7CisgICAgICAgICAgICBjdy5uZXdVVEY4KCJTeW50aGV0aWMiKTsKKyAgICAgICAgICAgIHNpemUgKz0gNjsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGFjY2VzcyAmIE9wY29kZXMuQUNDX0RFUFJFQ0FURUQpICE9IDApIHsKKyAgICAgICAgICAgIGN3Lm5ld1VURjgoIkRlcHJlY2F0ZWQiKTsKKyAgICAgICAgICAgIHNpemUgKz0gNjsKKyAgICAgICAgfQorICAgICAgICBpZiAoQ2xhc3NSZWFkZXIuU0lHTkFUVVJFUyAmJiBzaWduYXR1cmUgIT0gbnVsbCkgeworICAgICAgICAgICAgY3cubmV3VVRGOCgiU2lnbmF0dXJlIik7CisgICAgICAgICAgICBjdy5uZXdVVEY4KHNpZ25hdHVyZSk7CisgICAgICAgICAgICBzaXplICs9IDg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKENsYXNzUmVhZGVyLkFOTk9UQVRJT05TICYmIGFubmQgIT0gbnVsbCkgeworICAgICAgICAgICAgY3cubmV3VVRGOCgiQW5ub3RhdGlvbkRlZmF1bHQiKTsKKyAgICAgICAgICAgIHNpemUgKz0gNiArIGFubmQubGVuZ3RoOworICAgICAgICB9CisgICAgICAgIGlmIChDbGFzc1JlYWRlci5BTk5PVEFUSU9OUyAmJiBhbm5zICE9IG51bGwpIHsKKyAgICAgICAgICAgIGN3Lm5ld1VURjgoIlJ1bnRpbWVWaXNpYmxlQW5ub3RhdGlvbnMiKTsKKyAgICAgICAgICAgIHNpemUgKz0gOCArIGFubnMuZ2V0U2l6ZSgpOworICAgICAgICB9CisgICAgICAgIGlmIChDbGFzc1JlYWRlci5BTk5PVEFUSU9OUyAmJiBpYW5ucyAhPSBudWxsKSB7CisgICAgICAgICAgICBjdy5uZXdVVEY4KCJSdW50aW1lSW52aXNpYmxlQW5ub3RhdGlvbnMiKTsKKyAgICAgICAgICAgIHNpemUgKz0gOCArIGlhbm5zLmdldFNpemUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoQ2xhc3NSZWFkZXIuQU5OT1RBVElPTlMgJiYgcGFubnMgIT0gbnVsbCkgeworICAgICAgICAgICAgY3cubmV3VVRGOCgiUnVudGltZVZpc2libGVQYXJhbWV0ZXJBbm5vdGF0aW9ucyIpOworICAgICAgICAgICAgc2l6ZSArPSA3ICsgMiAqIChwYW5ucy5sZW5ndGggLSBzeW50aGV0aWNzKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBwYW5ucy5sZW5ndGggLSAxOyBpID49IHN5bnRoZXRpY3M7IC0taSkgeworICAgICAgICAgICAgICAgIHNpemUgKz0gcGFubnNbaV0gPT0gbnVsbCA/IDAgOiBwYW5uc1tpXS5nZXRTaXplKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKENsYXNzUmVhZGVyLkFOTk9UQVRJT05TICYmIGlwYW5ucyAhPSBudWxsKSB7CisgICAgICAgICAgICBjdy5uZXdVVEY4KCJSdW50aW1lSW52aXNpYmxlUGFyYW1ldGVyQW5ub3RhdGlvbnMiKTsKKyAgICAgICAgICAgIHNpemUgKz0gNyArIDIgKiAoaXBhbm5zLmxlbmd0aCAtIHN5bnRoZXRpY3MpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IGlwYW5ucy5sZW5ndGggLSAxOyBpID49IHN5bnRoZXRpY3M7IC0taSkgeworICAgICAgICAgICAgICAgIHNpemUgKz0gaXBhbm5zW2ldID09IG51bGwgPyAwIDogaXBhbm5zW2ldLmdldFNpemUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoYXR0cnMgIT0gbnVsbCkgeworICAgICAgICAgICAgc2l6ZSArPSBhdHRycy5nZXRTaXplKGN3LCBudWxsLCAwLCAtMSwgLTEpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzaXplOworICAgIH0KKworICAgIC8qKgorICAgICAqIFB1dHMgdGhlIGJ5dGVjb2RlIG9mIHRoaXMgbWV0aG9kIGluIHRoZSBnaXZlbiBieXRlIHZlY3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvdXQgdGhlIGJ5dGUgdmVjdG9yIGludG8gd2hpY2ggdGhlIGJ5dGVjb2RlIG9mIHRoaXMgbWV0aG9kIG11c3QgYmUKKyAgICAgKiAgICAgICAgY29waWVkLgorICAgICAqLworICAgIGZpbmFsIHZvaWQgcHV0KGZpbmFsIEJ5dGVWZWN0b3Igb3V0KSB7CisgICAgICAgIGludCBtYXNrID0gT3Bjb2Rlcy5BQ0NfREVQUkVDQVRFRAorICAgICAgICAgICAgICAgIHwgQ2xhc3NXcml0ZXIuQUNDX1NZTlRIRVRJQ19BVFRSSUJVVEUKKyAgICAgICAgICAgICAgICB8ICgoYWNjZXNzICYgQ2xhc3NXcml0ZXIuQUNDX1NZTlRIRVRJQ19BVFRSSUJVVEUpIC8gKENsYXNzV3JpdGVyLkFDQ19TWU5USEVUSUNfQVRUUklCVVRFIC8gT3Bjb2Rlcy5BQ0NfU1lOVEhFVElDKSk7CisgICAgICAgIG91dC5wdXRTaG9ydChhY2Nlc3MgJiB+bWFzaykucHV0U2hvcnQobmFtZSkucHV0U2hvcnQoZGVzYyk7CisgICAgICAgIGlmIChjbGFzc1JlYWRlck9mZnNldCAhPSAwKSB7CisgICAgICAgICAgICBvdXQucHV0Qnl0ZUFycmF5KGN3LmNyLmIsIGNsYXNzUmVhZGVyT2Zmc2V0LCBjbGFzc1JlYWRlckxlbmd0aCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaW50IGF0dHJpYnV0ZUNvdW50ID0gMDsKKyAgICAgICAgaWYgKGNvZGUubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgKythdHRyaWJ1dGVDb3VudDsKKyAgICAgICAgfQorICAgICAgICBpZiAoZXhjZXB0aW9uQ291bnQgPiAwKSB7CisgICAgICAgICAgICArK2F0dHJpYnV0ZUNvdW50OworICAgICAgICB9CisgICAgICAgIGlmICgoYWNjZXNzICYgT3Bjb2Rlcy5BQ0NfU1lOVEhFVElDKSAhPSAwCisgICAgICAgICAgICAgICAgJiYgKChjdy52ZXJzaW9uICYgMHhGRkZGKSA8IE9wY29kZXMuVjFfNSB8fCAoYWNjZXNzICYgQ2xhc3NXcml0ZXIuQUNDX1NZTlRIRVRJQ19BVFRSSUJVVEUpICE9IDApKQorICAgICAgICB7CisgICAgICAgICAgICArK2F0dHJpYnV0ZUNvdW50OworICAgICAgICB9CisgICAgICAgIGlmICgoYWNjZXNzICYgT3Bjb2Rlcy5BQ0NfREVQUkVDQVRFRCkgIT0gMCkgeworICAgICAgICAgICAgKythdHRyaWJ1dGVDb3VudDsKKyAgICAgICAgfQorICAgICAgICBpZiAoQ2xhc3NSZWFkZXIuU0lHTkFUVVJFUyAmJiBzaWduYXR1cmUgIT0gbnVsbCkgeworICAgICAgICAgICAgKythdHRyaWJ1dGVDb3VudDsKKyAgICAgICAgfQorICAgICAgICBpZiAoQ2xhc3NSZWFkZXIuQU5OT1RBVElPTlMgJiYgYW5uZCAhPSBudWxsKSB7CisgICAgICAgICAgICArK2F0dHJpYnV0ZUNvdW50OworICAgICAgICB9CisgICAgICAgIGlmIChDbGFzc1JlYWRlci5BTk5PVEFUSU9OUyAmJiBhbm5zICE9IG51bGwpIHsKKyAgICAgICAgICAgICsrYXR0cmlidXRlQ291bnQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKENsYXNzUmVhZGVyLkFOTk9UQVRJT05TICYmIGlhbm5zICE9IG51bGwpIHsKKyAgICAgICAgICAgICsrYXR0cmlidXRlQ291bnQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKENsYXNzUmVhZGVyLkFOTk9UQVRJT05TICYmIHBhbm5zICE9IG51bGwpIHsKKyAgICAgICAgICAgICsrYXR0cmlidXRlQ291bnQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKENsYXNzUmVhZGVyLkFOTk9UQVRJT05TICYmIGlwYW5ucyAhPSBudWxsKSB7CisgICAgICAgICAgICArK2F0dHJpYnV0ZUNvdW50OworICAgICAgICB9CisgICAgICAgIGlmIChhdHRycyAhPSBudWxsKSB7CisgICAgICAgICAgICBhdHRyaWJ1dGVDb3VudCArPSBhdHRycy5nZXRDb3VudCgpOworICAgICAgICB9CisgICAgICAgIG91dC5wdXRTaG9ydChhdHRyaWJ1dGVDb3VudCk7CisgICAgICAgIGlmIChjb2RlLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgIGludCBzaXplID0gMTIgKyBjb2RlLmxlbmd0aCArIDggKiBoYW5kbGVyQ291bnQ7CisgICAgICAgICAgICBpZiAobG9jYWxWYXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNpemUgKz0gOCArIGxvY2FsVmFyLmxlbmd0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsb2NhbFZhclR5cGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNpemUgKz0gOCArIGxvY2FsVmFyVHlwZS5sZW5ndGg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobGluZU51bWJlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2l6ZSArPSA4ICsgbGluZU51bWJlci5sZW5ndGg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RhY2tNYXAgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNpemUgKz0gOCArIHN0YWNrTWFwLmxlbmd0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjYXR0cnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNpemUgKz0gY2F0dHJzLmdldFNpemUoY3csCisgICAgICAgICAgICAgICAgICAgICAgICBjb2RlLmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICBjb2RlLmxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heFN0YWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgbWF4TG9jYWxzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dC5wdXRTaG9ydChjdy5uZXdVVEY4KCJDb2RlIikpLnB1dEludChzaXplKTsKKyAgICAgICAgICAgIG91dC5wdXRTaG9ydChtYXhTdGFjaykucHV0U2hvcnQobWF4TG9jYWxzKTsKKyAgICAgICAgICAgIG91dC5wdXRJbnQoY29kZS5sZW5ndGgpLnB1dEJ5dGVBcnJheShjb2RlLmRhdGEsIDAsIGNvZGUubGVuZ3RoKTsKKyAgICAgICAgICAgIG91dC5wdXRTaG9ydChoYW5kbGVyQ291bnQpOworICAgICAgICAgICAgaWYgKGhhbmRsZXJDb3VudCA+IDApIHsKKyAgICAgICAgICAgICAgICBIYW5kbGVyIGggPSBmaXJzdEhhbmRsZXI7CisgICAgICAgICAgICAgICAgd2hpbGUgKGggIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBvdXQucHV0U2hvcnQoaC5zdGFydC5wb3NpdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHV0U2hvcnQoaC5lbmQucG9zaXRpb24pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnB1dFNob3J0KGguaGFuZGxlci5wb3NpdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHV0U2hvcnQoaC50eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgaCA9IGgubmV4dDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdHRyaWJ1dGVDb3VudCA9IDA7CisgICAgICAgICAgICBpZiAobG9jYWxWYXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICsrYXR0cmlidXRlQ291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobG9jYWxWYXJUeXBlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICArK2F0dHJpYnV0ZUNvdW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGxpbmVOdW1iZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICsrYXR0cmlidXRlQ291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RhY2tNYXAgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICsrYXR0cmlidXRlQ291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2F0dHJzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGVDb3VudCArPSBjYXR0cnMuZ2V0Q291bnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dC5wdXRTaG9ydChhdHRyaWJ1dGVDb3VudCk7CisgICAgICAgICAgICBpZiAobG9jYWxWYXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG91dC5wdXRTaG9ydChjdy5uZXdVVEY4KCJMb2NhbFZhcmlhYmxlVGFibGUiKSk7CisgICAgICAgICAgICAgICAgb3V0LnB1dEludChsb2NhbFZhci5sZW5ndGggKyAyKS5wdXRTaG9ydChsb2NhbFZhckNvdW50KTsKKyAgICAgICAgICAgICAgICBvdXQucHV0Qnl0ZUFycmF5KGxvY2FsVmFyLmRhdGEsIDAsIGxvY2FsVmFyLmxlbmd0aCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobG9jYWxWYXJUeXBlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBvdXQucHV0U2hvcnQoY3cubmV3VVRGOCgiTG9jYWxWYXJpYWJsZVR5cGVUYWJsZSIpKTsKKyAgICAgICAgICAgICAgICBvdXQucHV0SW50KGxvY2FsVmFyVHlwZS5sZW5ndGggKyAyKS5wdXRTaG9ydChsb2NhbFZhclR5cGVDb3VudCk7CisgICAgICAgICAgICAgICAgb3V0LnB1dEJ5dGVBcnJheShsb2NhbFZhclR5cGUuZGF0YSwgMCwgbG9jYWxWYXJUeXBlLmxlbmd0aCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobGluZU51bWJlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgb3V0LnB1dFNob3J0KGN3Lm5ld1VURjgoIkxpbmVOdW1iZXJUYWJsZSIpKTsKKyAgICAgICAgICAgICAgICBvdXQucHV0SW50KGxpbmVOdW1iZXIubGVuZ3RoICsgMikucHV0U2hvcnQobGluZU51bWJlckNvdW50KTsKKyAgICAgICAgICAgICAgICBvdXQucHV0Qnl0ZUFycmF5KGxpbmVOdW1iZXIuZGF0YSwgMCwgbGluZU51bWJlci5sZW5ndGgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0YWNrTWFwICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBib29sZWFuIHppcCA9IChjdy52ZXJzaW9uICYgMHhGRkZGKSA+PSBPcGNvZGVzLlYxXzY7CisgICAgICAgICAgICAgICAgb3V0LnB1dFNob3J0KGN3Lm5ld1VURjgoemlwID8gIlN0YWNrTWFwVGFibGUiIDogIlN0YWNrTWFwIikpOworICAgICAgICAgICAgICAgIG91dC5wdXRJbnQoc3RhY2tNYXAubGVuZ3RoICsgMikucHV0U2hvcnQoZnJhbWVDb3VudCk7CisgICAgICAgICAgICAgICAgb3V0LnB1dEJ5dGVBcnJheShzdGFja01hcC5kYXRhLCAwLCBzdGFja01hcC5sZW5ndGgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNhdHRycyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY2F0dHJzLnB1dChjdywgY29kZS5kYXRhLCBjb2RlLmxlbmd0aCwgbWF4TG9jYWxzLCBtYXhTdGFjaywgb3V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZXhjZXB0aW9uQ291bnQgPiAwKSB7CisgICAgICAgICAgICBvdXQucHV0U2hvcnQoY3cubmV3VVRGOCgiRXhjZXB0aW9ucyIpKQorICAgICAgICAgICAgICAgICAgICAucHV0SW50KDIgKiBleGNlcHRpb25Db3VudCArIDIpOworICAgICAgICAgICAgb3V0LnB1dFNob3J0KGV4Y2VwdGlvbkNvdW50KTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhjZXB0aW9uQ291bnQ7ICsraSkgeworICAgICAgICAgICAgICAgIG91dC5wdXRTaG9ydChleGNlcHRpb25zW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoKGFjY2VzcyAmIE9wY29kZXMuQUNDX1NZTlRIRVRJQykgIT0gMAorICAgICAgICAgICAgICAgICYmICgoY3cudmVyc2lvbiAmIDB4RkZGRikgPCBPcGNvZGVzLlYxXzUgfHwgKGFjY2VzcyAmIENsYXNzV3JpdGVyLkFDQ19TWU5USEVUSUNfQVRUUklCVVRFKSAhPSAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0LnB1dFNob3J0KGN3Lm5ld1VURjgoIlN5bnRoZXRpYyIpKS5wdXRJbnQoMCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChhY2Nlc3MgJiBPcGNvZGVzLkFDQ19ERVBSRUNBVEVEKSAhPSAwKSB7CisgICAgICAgICAgICBvdXQucHV0U2hvcnQoY3cubmV3VVRGOCgiRGVwcmVjYXRlZCIpKS5wdXRJbnQoMCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKENsYXNzUmVhZGVyLlNJR05BVFVSRVMgJiYgc2lnbmF0dXJlICE9IG51bGwpIHsKKyAgICAgICAgICAgIG91dC5wdXRTaG9ydChjdy5uZXdVVEY4KCJTaWduYXR1cmUiKSkKKyAgICAgICAgICAgICAgICAgICAgLnB1dEludCgyKQorICAgICAgICAgICAgICAgICAgICAucHV0U2hvcnQoY3cubmV3VVRGOChzaWduYXR1cmUpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoQ2xhc3NSZWFkZXIuQU5OT1RBVElPTlMgJiYgYW5uZCAhPSBudWxsKSB7CisgICAgICAgICAgICBvdXQucHV0U2hvcnQoY3cubmV3VVRGOCgiQW5ub3RhdGlvbkRlZmF1bHQiKSk7CisgICAgICAgICAgICBvdXQucHV0SW50KGFubmQubGVuZ3RoKTsKKyAgICAgICAgICAgIG91dC5wdXRCeXRlQXJyYXkoYW5uZC5kYXRhLCAwLCBhbm5kLmxlbmd0aCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKENsYXNzUmVhZGVyLkFOTk9UQVRJT05TICYmIGFubnMgIT0gbnVsbCkgeworICAgICAgICAgICAgb3V0LnB1dFNob3J0KGN3Lm5ld1VURjgoIlJ1bnRpbWVWaXNpYmxlQW5ub3RhdGlvbnMiKSk7CisgICAgICAgICAgICBhbm5zLnB1dChvdXQpOworICAgICAgICB9CisgICAgICAgIGlmIChDbGFzc1JlYWRlci5BTk5PVEFUSU9OUyAmJiBpYW5ucyAhPSBudWxsKSB7CisgICAgICAgICAgICBvdXQucHV0U2hvcnQoY3cubmV3VVRGOCgiUnVudGltZUludmlzaWJsZUFubm90YXRpb25zIikpOworICAgICAgICAgICAgaWFubnMucHV0KG91dCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKENsYXNzUmVhZGVyLkFOTk9UQVRJT05TICYmIHBhbm5zICE9IG51bGwpIHsKKyAgICAgICAgICAgIG91dC5wdXRTaG9ydChjdy5uZXdVVEY4KCJSdW50aW1lVmlzaWJsZVBhcmFtZXRlckFubm90YXRpb25zIikpOworICAgICAgICAgICAgQW5ub3RhdGlvbldyaXRlci5wdXQocGFubnMsIHN5bnRoZXRpY3MsIG91dCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKENsYXNzUmVhZGVyLkFOTk9UQVRJT05TICYmIGlwYW5ucyAhPSBudWxsKSB7CisgICAgICAgICAgICBvdXQucHV0U2hvcnQoY3cubmV3VVRGOCgiUnVudGltZUludmlzaWJsZVBhcmFtZXRlckFubm90YXRpb25zIikpOworICAgICAgICAgICAgQW5ub3RhdGlvbldyaXRlci5wdXQoaXBhbm5zLCBzeW50aGV0aWNzLCBvdXQpOworICAgICAgICB9CisgICAgICAgIGlmIChhdHRycyAhPSBudWxsKSB7CisgICAgICAgICAgICBhdHRycy5wdXQoY3csIG51bGwsIDAsIC0xLCAtMSwgb3V0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIFV0aWxpdHkgbWV0aG9kczogaW5zdHJ1Y3Rpb24gcmVzaXppbmcgKHVzZWQgdG8gaGFuZGxlIEdPVE9fVyBhbmQgSlNSX1cpCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvKioKKyAgICAgKiBSZXNpemVzIGFuZCByZXBsYWNlcyB0aGUgdGVtcG9yYXJ5IGluc3RydWN0aW9ucyBpbnNlcnRlZCBieQorICAgICAqIHtAbGluayBMYWJlbCNyZXNvbHZlfSBmb3Igd2lkZSBmb3J3YXJkIGp1bXBzLCB3aGlsZSBrZWVwaW5nIGp1bXAgb2Zmc2V0cworICAgICAqIGFuZCBpbnN0cnVjdGlvbiBhZGRyZXNzZXMgY29uc2lzdGVudC4gVGhpcyBtYXkgcmVxdWlyZSB0byByZXNpemUgb3RoZXIKKyAgICAgKiBleGlzdGluZyBpbnN0cnVjdGlvbnMsIG9yIGV2ZW4gdG8gaW50cm9kdWNlIG5ldyBpbnN0cnVjdGlvbnM6IGZvcgorICAgICAqIGV4YW1wbGUsIGluY3JlYXNpbmcgdGhlIHNpemUgb2YgYW4gaW5zdHJ1Y3Rpb24gYnkgMiBhdCB0aGUgbWlkZGxlIG9mIGEKKyAgICAgKiBtZXRob2QgY2FuIGluY3JlYXNlcyB0aGUgb2Zmc2V0IG9mIGFuIElGRVEgaW5zdHJ1Y3Rpb24gZnJvbSAzMjc2NiB0bworICAgICAqIDMyNzY4LCBpbiB3aGljaCBjYXNlIElGRVEgMzI3NjYgbXVzdCBiZSByZXBsYWNlZCB3aXRoIElGTkVRIDggR09UT19XCisgICAgICogMzI3NjUuIFRoaXMsIGluIHR1cm4sIG1heSByZXF1aXJlIHRvIGluY3JlYXNlIHRoZSBzaXplIG9mIGFub3RoZXIganVtcAorICAgICAqIGluc3RydWN0aW9uLCBhbmQgc28gb24uLi4gQWxsIHRoZXNlIG9wZXJhdGlvbnMgYXJlIGhhbmRsZWQgYXV0b21hdGljYWxseQorICAgICAqIGJ5IHRoaXMgbWV0aG9kLiA8cD4gPGk+VGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgYWxsIHRoZSBtZXRob2QKKyAgICAgKiB0aGF0IGlzIGJlaW5nIGJ1aWx0IGhhcyBiZWVuIHZpc2l0ZWQ8L2k+LiBJbiBwYXJ0aWN1bGFyLCB0aGUKKyAgICAgKiB7QGxpbmsgTGFiZWwgTGFiZWx9IG9iamVjdHMgdXNlZCB0byBjb25zdHJ1Y3QgdGhlIG1ldGhvZCBhcmUgbm8gbG9uZ2VyCisgICAgICogdmFsaWQgYWZ0ZXIgdGhpcyBtZXRob2QgaGFzIGJlZW4gY2FsbGVkLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCByZXNpemVJbnN0cnVjdGlvbnMoKSB7CisgICAgICAgIGJ5dGVbXSBiID0gY29kZS5kYXRhOyAvLyBieXRlY29kZSBvZiB0aGUgbWV0aG9kCisgICAgICAgIGludCB1LCB2LCBsYWJlbDsgLy8gaW5kZXhlcyBpbiBiCisgICAgICAgIGludCBpLCBqOyAvLyBsb29wIGluZGV4ZXMKKyAgICAgICAgLyoKKyAgICAgICAgICogMXN0IHN0ZXA6IEFzIGV4cGxhaW5lZCBhYm92ZSwgcmVzaXppbmcgYW4gaW5zdHJ1Y3Rpb24gbWF5IHJlcXVpcmUgdG8KKyAgICAgICAgICogcmVzaXplIGFub3RoZXIgb25lLCB3aGljaCBtYXkgcmVxdWlyZSB0byByZXNpemUgeWV0IGFub3RoZXIgb25lLCBhbmQKKyAgICAgICAgICogc28gb24uIFRoZSBmaXJzdCBzdGVwIG9mIHRoZSBhbGdvcml0aG0gY29uc2lzdHMgaW4gZmluZGluZyBhbGwgdGhlCisgICAgICAgICAqIGluc3RydWN0aW9ucyB0aGF0IG5lZWQgdG8gYmUgcmVzaXplZCwgd2l0aG91dCBtb2RpZnlpbmcgdGhlIGNvZGUuCisgICAgICAgICAqIFRoaXMgaXMgZG9uZSBieSB0aGUgZm9sbG93aW5nICJmaXggcG9pbnQiIGFsZ29yaXRobToKKyAgICAgICAgICoKKyAgICAgICAgICogUGFyc2UgdGhlIGNvZGUgdG8gZmluZCB0aGUganVtcCBpbnN0cnVjdGlvbnMgd2hvc2Ugb2Zmc2V0IHdpbGwgbmVlZAorICAgICAgICAgKiBtb3JlIHRoYW4gMiBieXRlcyB0byBiZSBzdG9yZWQgKHRoZSBmdXR1cmUgb2Zmc2V0IGlzIGNvbXB1dGVkIGZyb20KKyAgICAgICAgICogdGhlIGN1cnJlbnQgb2Zmc2V0IGFuZCBmcm9tIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3aWxsIGJlIGluc2VydGVkCisgICAgICAgICAqIG9yIHJlbW92ZWQgYmV0d2VlbiB0aGUgc291cmNlIGFuZCB0YXJnZXQgaW5zdHJ1Y3Rpb25zKS4gRm9yIGVhY2ggc3VjaAorICAgICAgICAgKiBpbnN0cnVjdGlvbiwgYWRkcyBhbiBlbnRyeSBpbiAoYSBjb3B5IG9mKSB0aGUgaW5kZXhlcyBhbmQgc2l6ZXMKKyAgICAgICAgICogYXJyYXlzIChpZiB0aGlzIGhhcyBub3QgYWxyZWFkeSBiZWVuIGRvbmUgaW4gYSBwcmV2aW91cyBpdGVyYXRpb24hKS4KKyAgICAgICAgICoKKyAgICAgICAgICogSWYgYXQgbGVhc3Qgb25lIGVudHJ5IGhhcyBiZWVuIGFkZGVkIGR1cmluZyB0aGUgcHJldmlvdXMgc3RlcCwgZ28KKyAgICAgICAgICogYmFjayB0byB0aGUgYmVnaW5uaW5nLCBvdGhlcndpc2Ugc3RvcC4KKyAgICAgICAgICoKKyAgICAgICAgICogSW4gZmFjdCB0aGUgcmVhbCBhbGdvcml0aG0gaXMgY29tcGxpY2F0ZWQgYnkgdGhlIGZhY3QgdGhhdCB0aGUgc2l6ZQorICAgICAgICAgKiBvZiBUQUJMRVNXSVRDSCBhbmQgTE9PS1VQU1dJVENIIGluc3RydWN0aW9ucyBkZXBlbmRzIG9uIHRoZWlyCisgICAgICAgICAqIHBvc2l0aW9uIGluIHRoZSBieXRlY29kZSAoYmVjYXVzZSBvZiBwYWRkaW5nKS4gSW4gb3JkZXIgdG8gZW5zdXJlIHRoZQorICAgICAgICAgKiBjb252ZXJnZW5jZSBvZiB0aGUgYWxnb3JpdGhtLCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIGFkZGVkIG9yCisgICAgICAgICAqIHJlbW92ZWQgZnJvbSB0aGVzZSBpbnN0cnVjdGlvbnMgaXMgb3ZlciBlc3RpbWF0ZWQgZHVyaW5nIHRoZSBwcmV2aW91cworICAgICAgICAgKiBsb29wLCBhbmQgY29tcHV0ZWQgZXhhY3RseSBvbmx5IGFmdGVyIHRoZSBsb29wIGlzIGZpbmlzaGVkICh0aGlzCisgICAgICAgICAqIHJlcXVpcmVzIGFub3RoZXIgcGFzcyB0byBwYXJzZSB0aGUgYnl0ZWNvZGUgb2YgdGhlIG1ldGhvZCkuCisgICAgICAgICAqLworICAgICAgICBpbnRbXSBhbGxJbmRleGVzID0gbmV3IGludFswXTsgLy8gY29weSBvZiBpbmRleGVzCisgICAgICAgIGludFtdIGFsbFNpemVzID0gbmV3IGludFswXTsgLy8gY29weSBvZiBzaXplcworICAgICAgICBib29sZWFuW10gcmVzaXplOyAvLyBpbnN0cnVjdGlvbnMgdG8gYmUgcmVzaXplZAorICAgICAgICBpbnQgbmV3T2Zmc2V0OyAvLyBmdXR1cmUgb2Zmc2V0IG9mIGEganVtcCBpbnN0cnVjdGlvbgorCisgICAgICAgIHJlc2l6ZSA9IG5ldyBib29sZWFuW2NvZGUubGVuZ3RoXTsKKworICAgICAgICAvLyAzID0gbG9vcCBhZ2FpbiwgMiA9IGxvb3AgZW5kZWQsIDEgPSBsYXN0IHBhc3MsIDAgPSBkb25lCisgICAgICAgIGludCBzdGF0ZSA9IDM7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGlmIChzdGF0ZSA9PSAzKSB7CisgICAgICAgICAgICAgICAgc3RhdGUgPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdSA9IDA7CisgICAgICAgICAgICB3aGlsZSAodSA8IGIubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgaW50IG9wY29kZSA9IGJbdV0gJiAweEZGOyAvLyBvcGNvZGUgb2YgY3VycmVudCBpbnN0cnVjdGlvbgorICAgICAgICAgICAgICAgIGludCBpbnNlcnQgPSAwOyAvLyBieXRlcyB0byBiZSBhZGRlZCBhZnRlciB0aGlzIGluc3RydWN0aW9uCisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKENsYXNzV3JpdGVyLlRZUEVbb3Bjb2RlXSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLk5PQVJHX0lOU046CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuSU1QTFZBUl9JTlNOOgorICAgICAgICAgICAgICAgICAgICAgICAgdSArPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuTEFCRUxfSU5TTjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcGNvZGUgPiAyMDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb252ZXJ0cyB0ZW1wb3Jhcnkgb3Bjb2RlcyAyMDIgdG8gMjE3LCAyMTggYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMjE5IHRvIElGRVEgLi4uIEpTUiAoaW5jbHVzaXZlKSwgSUZOVUxMIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElGTk9OTlVMTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZSA9IG9wY29kZSA8IDIxOCA/IG9wY29kZSAtIDQ5IDogb3Bjb2RlIC0gMjA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSB1ICsgcmVhZFVuc2lnbmVkU2hvcnQoYiwgdSArIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IHUgKyByZWFkU2hvcnQoYiwgdSArIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3T2Zmc2V0ID0gZ2V0TmV3T2Zmc2V0KGFsbEluZGV4ZXMsIGFsbFNpemVzLCB1LCBsYWJlbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3T2Zmc2V0IDwgU2hvcnQuTUlOX1ZBTFVFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG5ld09mZnNldCA+IFNob3J0Lk1BWF9WQUxVRSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc2l6ZVt1XSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3Bjb2RlID09IE9wY29kZXMuR09UTworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG9wY29kZSA9PSBPcGNvZGVzLkpTUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHdvIGFkZGl0aW9uYWwgYnl0ZXMgd2lsbCBiZSByZXF1aXJlZCB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGFjZSB0aGlzIEdPVE8gb3IgSlNSIGluc3RydWN0aW9uIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgR09UT19XIG9yIGEgSlNSX1cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydCA9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaXZlIGFkZGl0aW9uYWwgYnl0ZXMgd2lsbCBiZSByZXF1aXJlZCB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGFjZSB0aGlzIElGeHh4IDxsPiBpbnN0cnVjdGlvbiB3aXRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJRk5PVHh4eCA8bCc+IEdPVE9fVyA8bD4sIHdoZXJlIElGTk9UeHh4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyB0aGUgIm9wcG9zaXRlIiBvcGNvZGUgb2YgSUZ4eHggKGkuZS4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJRk5FIGZvciBJRkVRKSBhbmQgd2hlcmUgPGwnPiBkZXNpZ25hdGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgaW5zdHJ1Y3Rpb24ganVzdCBhZnRlciB0aGUgR09UT19XLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0ID0gNTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNpemVbdV0gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHUgKz0gMzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLkxBQkVMV19JTlNOOgorICAgICAgICAgICAgICAgICAgICAgICAgdSArPSA1OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuVEFCTF9JTlNOOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cnVlIG51bWJlciBvZiBieXRlcyB0byBiZSBhZGRlZCAob3IgcmVtb3ZlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmcm9tIHRoaXMgaW5zdHJ1Y3Rpb24gPSAoZnV0dXJlIG51bWJlciBvZiBwYWRkaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnl0ZXMgLSBjdXJyZW50IG51bWJlciBvZiBwYWRkaW5nIGJ5dGUpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcmV2aW91c2x5IG92ZXIgZXN0aW1hdGVkIHZhcmlhdGlvbiA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gPSAoKDMgLSBuZXdPZmZzZXQlNCkgLSAoMyAtIHUlNCkpIC0gdSU0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gPSAoLW5ld09mZnNldCU0ICsgdSU0KSAtIHUlNAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vID0gLShuZXdPZmZzZXQgJiAzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld09mZnNldCA9IGdldE5ld09mZnNldChhbGxJbmRleGVzLCBhbGxTaXplcywgMCwgdSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0ID0gLShuZXdPZmZzZXQgJiAzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXJlc2l6ZVt1XSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG92ZXIgZXN0aW1hdGlvbiBvZiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkZWQgdG8gdGhpcyBpbnN0cnVjdGlvbiA9IDMgLSBjdXJyZW50IG51bWJlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mIHBhZGRpbmcgYnl0ZXMgPSAzIC0gKDMgLSB1JTQpID0gdSU0ID0gdSAmIDMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnQgPSB1ICYgMzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNpemVbdV0gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2tpcHMgaW5zdHJ1Y3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIHUgPSB1ICsgNCAtICh1ICYgMyk7CisgICAgICAgICAgICAgICAgICAgICAgICB1ICs9IDQgKiAocmVhZEludChiLCB1ICsgOCkgLSByZWFkSW50KGIsIHUgKyA0KSArIDEpICsgMTI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5MT09LX0lOU046CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxpa2UgVEFCTF9JTlNOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3T2Zmc2V0ID0gZ2V0TmV3T2Zmc2V0KGFsbEluZGV4ZXMsIGFsbFNpemVzLCAwLCB1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnQgPSAtKG5ld09mZnNldCAmIDMpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghcmVzaXplW3VdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGlrZSBUQUJMX0lOU04KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnQgPSB1ICYgMzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNpemVbdV0gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2tpcHMgaW5zdHJ1Y3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIHUgPSB1ICsgNCAtICh1ICYgMyk7CisgICAgICAgICAgICAgICAgICAgICAgICB1ICs9IDggKiByZWFkSW50KGIsIHUgKyA0KSArIDg7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5XSURFX0lOU046CisgICAgICAgICAgICAgICAgICAgICAgICBvcGNvZGUgPSBiW3UgKyAxXSAmIDB4RkY7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3Bjb2RlID09IE9wY29kZXMuSUlOQykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUgKz0gNjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdSArPSA0OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuVkFSX0lOU046CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuU0JZVEVfSU5TTjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5MRENfSU5TTjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHUgKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLlNIT1JUX0lOU046CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuTERDV19JTlNOOgorICAgICAgICAgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLkZJRUxET1JNRVRIX0lOU046CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuVFlQRV9JTlNOOgorICAgICAgICAgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLklJTkNfSU5TTjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHUgKz0gMzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLklURk1FVEhfSU5TTjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5JTkRZTUVUSF9JTlNOOgorICAgICAgICAgICAgICAgICAgICAgICAgdSArPSA1OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIC8vIGNhc2UgQ2xhc3NXcml0ZXIuTUFOQV9JTlNOOgorICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgdSArPSA0OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChpbnNlcnQgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyBhZGRzIGEgbmV3ICh1LCBpbnNlcnQpIGVudHJ5IGluIHRoZSBhbGxJbmRleGVzIGFuZAorICAgICAgICAgICAgICAgICAgICAvLyBhbGxTaXplcyBhcnJheXMKKyAgICAgICAgICAgICAgICAgICAgaW50W10gbmV3SW5kZXhlcyA9IG5ldyBpbnRbYWxsSW5kZXhlcy5sZW5ndGggKyAxXTsKKyAgICAgICAgICAgICAgICAgICAgaW50W10gbmV3U2l6ZXMgPSBuZXcgaW50W2FsbFNpemVzLmxlbmd0aCArIDFdOworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGFsbEluZGV4ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdJbmRleGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsSW5kZXhlcy5sZW5ndGgpOworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGFsbFNpemVzLCAwLCBuZXdTaXplcywgMCwgYWxsU2l6ZXMubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgbmV3SW5kZXhlc1thbGxJbmRleGVzLmxlbmd0aF0gPSB1OworICAgICAgICAgICAgICAgICAgICBuZXdTaXplc1thbGxTaXplcy5sZW5ndGhdID0gaW5zZXJ0OworICAgICAgICAgICAgICAgICAgICBhbGxJbmRleGVzID0gbmV3SW5kZXhlczsKKyAgICAgICAgICAgICAgICAgICAgYWxsU2l6ZXMgPSBuZXdTaXplczsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluc2VydCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdGF0ZSA8IDMpIHsKKyAgICAgICAgICAgICAgICAtLXN0YXRlOworICAgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlIChzdGF0ZSAhPSAwKTsKKworICAgICAgICAvLyAybmQgc3RlcDoKKyAgICAgICAgLy8gY29waWVzIHRoZSBieXRlY29kZSBvZiB0aGUgbWV0aG9kIGludG8gYSBuZXcgYnl0ZXZlY3RvciwgdXBkYXRlcyB0aGUKKyAgICAgICAgLy8gb2Zmc2V0cywgYW5kIGluc2VydHMgKG9yIHJlbW92ZXMpIGJ5dGVzIGFzIHJlcXVlc3RlZC4KKworICAgICAgICBCeXRlVmVjdG9yIG5ld0NvZGUgPSBuZXcgQnl0ZVZlY3Rvcihjb2RlLmxlbmd0aCk7CisKKyAgICAgICAgdSA9IDA7CisgICAgICAgIHdoaWxlICh1IDwgY29kZS5sZW5ndGgpIHsKKyAgICAgICAgICAgIGludCBvcGNvZGUgPSBiW3VdICYgMHhGRjsKKyAgICAgICAgICAgIHN3aXRjaCAoQ2xhc3NXcml0ZXIuVFlQRVtvcGNvZGVdKSB7CisgICAgICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5OT0FSR19JTlNOOgorICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuSU1QTFZBUl9JTlNOOgorICAgICAgICAgICAgICAgICAgICBuZXdDb2RlLnB1dEJ5dGUob3Bjb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgdSArPSAxOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLkxBQkVMX0lOU046CisgICAgICAgICAgICAgICAgICAgIGlmIChvcGNvZGUgPiAyMDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoYW5nZXMgdGVtcG9yYXJ5IG9wY29kZXMgMjAyIHRvIDIxNyAoaW5jbHVzaXZlKSwgMjE4CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgMjE5IHRvIElGRVEgLi4uIEpTUiAoaW5jbHVzaXZlKSwgSUZOVUxMIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gSUZOT05OVUxMCisgICAgICAgICAgICAgICAgICAgICAgICBvcGNvZGUgPSBvcGNvZGUgPCAyMTggPyBvcGNvZGUgLSA0OSA6IG9wY29kZSAtIDIwOworICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSB1ICsgcmVhZFVuc2lnbmVkU2hvcnQoYiwgdSArIDEpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSB1ICsgcmVhZFNob3J0KGIsIHUgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBuZXdPZmZzZXQgPSBnZXROZXdPZmZzZXQoYWxsSW5kZXhlcywgYWxsU2l6ZXMsIHUsIGxhYmVsKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlc2l6ZVt1XSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGFjZXMgR09UTyB3aXRoIEdPVE9fVywgSlNSIHdpdGggSlNSX1cgYW5kIElGeHh4CisgICAgICAgICAgICAgICAgICAgICAgICAvLyA8bD4gd2l0aCBJRk5PVHh4eCA8bCc+IEdPVE9fVyA8bD4sIHdoZXJlIElGTk9UeHh4IGlzCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgIm9wcG9zaXRlIiBvcGNvZGUgb2YgSUZ4eHggKGkuZS4sIElGTkUgZm9yIElGRVEpCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgd2hlcmUgPGwnPiBkZXNpZ25hdGVzIHRoZSBpbnN0cnVjdGlvbiBqdXN0IGFmdGVyCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgR09UT19XLgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wY29kZSA9PSBPcGNvZGVzLkdPVE8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdDb2RlLnB1dEJ5dGUoMjAwKTsgLy8gR09UT19XCisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9wY29kZSA9PSBPcGNvZGVzLkpTUikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvZGUucHV0Qnl0ZSgyMDEpOyAvLyBKU1JfVworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdDb2RlLnB1dEJ5dGUob3Bjb2RlIDw9IDE2NgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAoKG9wY29kZSArIDEpIF4gMSkgLSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG9wY29kZSBeIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvZGUucHV0U2hvcnQoOCk7IC8vIGp1bXAgb2Zmc2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29kZS5wdXRCeXRlKDIwMCk7IC8vIEdPVE9fVworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ld09mZnNldCBub3cgY29tcHV0ZWQgZnJvbSBzdGFydCBvZiBHT1RPX1cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdPZmZzZXQgLT0gMzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvZGUucHV0SW50KG5ld09mZnNldCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdDb2RlLnB1dEJ5dGUob3Bjb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvZGUucHV0U2hvcnQobmV3T2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB1ICs9IDM7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuTEFCRUxXX0lOU046CisgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gdSArIHJlYWRJbnQoYiwgdSArIDEpOworICAgICAgICAgICAgICAgICAgICBuZXdPZmZzZXQgPSBnZXROZXdPZmZzZXQoYWxsSW5kZXhlcywgYWxsU2l6ZXMsIHUsIGxhYmVsKTsKKyAgICAgICAgICAgICAgICAgICAgbmV3Q29kZS5wdXRCeXRlKG9wY29kZSk7CisgICAgICAgICAgICAgICAgICAgIG5ld0NvZGUucHV0SW50KG5ld09mZnNldCk7CisgICAgICAgICAgICAgICAgICAgIHUgKz0gNTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5UQUJMX0lOU046CisgICAgICAgICAgICAgICAgICAgIC8vIHNraXBzIDAgdG8gMyBwYWRkaW5nIGJ5dGVzCisgICAgICAgICAgICAgICAgICAgIHYgPSB1OworICAgICAgICAgICAgICAgICAgICB1ID0gdSArIDQgLSAodiAmIDMpOworICAgICAgICAgICAgICAgICAgICAvLyByZWFkcyBhbmQgY29waWVzIGluc3RydWN0aW9uCisgICAgICAgICAgICAgICAgICAgIG5ld0NvZGUucHV0Qnl0ZShPcGNvZGVzLlRBQkxFU1dJVENIKTsKKyAgICAgICAgICAgICAgICAgICAgbmV3Q29kZS5wdXRCeXRlQXJyYXkobnVsbCwgMCwgKDQgLSBuZXdDb2RlLmxlbmd0aCAlIDQpICUgNCk7CisgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gdiArIHJlYWRJbnQoYiwgdSk7CisgICAgICAgICAgICAgICAgICAgIHUgKz0gNDsKKyAgICAgICAgICAgICAgICAgICAgbmV3T2Zmc2V0ID0gZ2V0TmV3T2Zmc2V0KGFsbEluZGV4ZXMsIGFsbFNpemVzLCB2LCBsYWJlbCk7CisgICAgICAgICAgICAgICAgICAgIG5ld0NvZGUucHV0SW50KG5ld09mZnNldCk7CisgICAgICAgICAgICAgICAgICAgIGogPSByZWFkSW50KGIsIHUpOworICAgICAgICAgICAgICAgICAgICB1ICs9IDQ7CisgICAgICAgICAgICAgICAgICAgIG5ld0NvZGUucHV0SW50KGopOworICAgICAgICAgICAgICAgICAgICBqID0gcmVhZEludChiLCB1KSAtIGogKyAxOworICAgICAgICAgICAgICAgICAgICB1ICs9IDQ7CisgICAgICAgICAgICAgICAgICAgIG5ld0NvZGUucHV0SW50KHJlYWRJbnQoYiwgdSAtIDQpKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yICg7IGogPiAwOyAtLWopIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gdiArIHJlYWRJbnQoYiwgdSk7CisgICAgICAgICAgICAgICAgICAgICAgICB1ICs9IDQ7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdPZmZzZXQgPSBnZXROZXdPZmZzZXQoYWxsSW5kZXhlcywgYWxsU2l6ZXMsIHYsIGxhYmVsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvZGUucHV0SW50KG5ld09mZnNldCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5MT09LX0lOU046CisgICAgICAgICAgICAgICAgICAgIC8vIHNraXBzIDAgdG8gMyBwYWRkaW5nIGJ5dGVzCisgICAgICAgICAgICAgICAgICAgIHYgPSB1OworICAgICAgICAgICAgICAgICAgICB1ID0gdSArIDQgLSAodiAmIDMpOworICAgICAgICAgICAgICAgICAgICAvLyByZWFkcyBhbmQgY29waWVzIGluc3RydWN0aW9uCisgICAgICAgICAgICAgICAgICAgIG5ld0NvZGUucHV0Qnl0ZShPcGNvZGVzLkxPT0tVUFNXSVRDSCk7CisgICAgICAgICAgICAgICAgICAgIG5ld0NvZGUucHV0Qnl0ZUFycmF5KG51bGwsIDAsICg0IC0gbmV3Q29kZS5sZW5ndGggJSA0KSAlIDQpOworICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IHYgKyByZWFkSW50KGIsIHUpOworICAgICAgICAgICAgICAgICAgICB1ICs9IDQ7CisgICAgICAgICAgICAgICAgICAgIG5ld09mZnNldCA9IGdldE5ld09mZnNldChhbGxJbmRleGVzLCBhbGxTaXplcywgdiwgbGFiZWwpOworICAgICAgICAgICAgICAgICAgICBuZXdDb2RlLnB1dEludChuZXdPZmZzZXQpOworICAgICAgICAgICAgICAgICAgICBqID0gcmVhZEludChiLCB1KTsKKyAgICAgICAgICAgICAgICAgICAgdSArPSA0OworICAgICAgICAgICAgICAgICAgICBuZXdDb2RlLnB1dEludChqKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yICg7IGogPiAwOyAtLWopIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvZGUucHV0SW50KHJlYWRJbnQoYiwgdSkpOworICAgICAgICAgICAgICAgICAgICAgICAgdSArPSA0OworICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSB2ICsgcmVhZEludChiLCB1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHUgKz0gNDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld09mZnNldCA9IGdldE5ld09mZnNldChhbGxJbmRleGVzLCBhbGxTaXplcywgdiwgbGFiZWwpOworICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29kZS5wdXRJbnQobmV3T2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLldJREVfSU5TTjoKKyAgICAgICAgICAgICAgICAgICAgb3Bjb2RlID0gYlt1ICsgMV0gJiAweEZGOworICAgICAgICAgICAgICAgICAgICBpZiAob3Bjb2RlID09IE9wY29kZXMuSUlOQykgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29kZS5wdXRCeXRlQXJyYXkoYiwgdSwgNik7CisgICAgICAgICAgICAgICAgICAgICAgICB1ICs9IDY7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdDb2RlLnB1dEJ5dGVBcnJheShiLCB1LCA0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHUgKz0gNDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLlZBUl9JTlNOOgorICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuU0JZVEVfSU5TTjoKKyAgICAgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLkxEQ19JTlNOOgorICAgICAgICAgICAgICAgICAgICBuZXdDb2RlLnB1dEJ5dGVBcnJheShiLCB1LCAyKTsKKyAgICAgICAgICAgICAgICAgICAgdSArPSAyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLlNIT1JUX0lOU046CisgICAgICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5MRENXX0lOU046CisgICAgICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5GSUVMRE9STUVUSF9JTlNOOgorICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuVFlQRV9JTlNOOgorICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuSUlOQ19JTlNOOgorICAgICAgICAgICAgICAgICAgICBuZXdDb2RlLnB1dEJ5dGVBcnJheShiLCB1LCAzKTsKKyAgICAgICAgICAgICAgICAgICAgdSArPSAzOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLklURk1FVEhfSU5TTjoKKyAgICAgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLklORFlNRVRIX0lOU046CisgICAgICAgICAgICAgICAgICAgIG5ld0NvZGUucHV0Qnl0ZUFycmF5KGIsIHUsIDUpOworICAgICAgICAgICAgICAgICAgICB1ICs9IDU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIC8vIGNhc2UgTUFOQV9JTlNOOgorICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIG5ld0NvZGUucHV0Qnl0ZUFycmF5KGIsIHUsIDQpOworICAgICAgICAgICAgICAgICAgICB1ICs9IDQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gcmVjb21wdXRlcyB0aGUgc3RhY2sgbWFwIGZyYW1lcworICAgICAgICBpZiAoZnJhbWVDb3VudCA+IDApIHsKKyAgICAgICAgICAgIGlmIChjb21wdXRlID09IEZSQU1FUykgeworICAgICAgICAgICAgICAgIGZyYW1lQ291bnQgPSAwOworICAgICAgICAgICAgICAgIHN0YWNrTWFwID0gbnVsbDsKKyAgICAgICAgICAgICAgICBwcmV2aW91c0ZyYW1lID0gbnVsbDsKKyAgICAgICAgICAgICAgICBmcmFtZSA9IG51bGw7CisgICAgICAgICAgICAgICAgRnJhbWUgZiA9IG5ldyBGcmFtZSgpOworICAgICAgICAgICAgICAgIGYub3duZXIgPSBsYWJlbHM7CisgICAgICAgICAgICAgICAgVHlwZVtdIGFyZ3MgPSBUeXBlLmdldEFyZ3VtZW50VHlwZXMoZGVzY3JpcHRvcik7CisgICAgICAgICAgICAgICAgZi5pbml0SW5wdXRGcmFtZShjdywgYWNjZXNzLCBhcmdzLCBtYXhMb2NhbHMpOworICAgICAgICAgICAgICAgIHZpc2l0RnJhbWUoZik7CisgICAgICAgICAgICAgICAgTGFiZWwgbCA9IGxhYmVsczsKKyAgICAgICAgICAgICAgICB3aGlsZSAobCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAqIGhlcmUgd2UgbmVlZCB0aGUgb3JpZ2luYWwgbGFiZWwgcG9zaXRpb24uIGdldE5ld09mZnNldAorICAgICAgICAgICAgICAgICAgICAgKiBtdXN0IHRoZXJlZm9yZSBuZXZlciBoYXZlIGJlZW4gY2FsbGVkIGZvciB0aGlzIGxhYmVsLgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgdSA9IGwucG9zaXRpb24gLSAzOworICAgICAgICAgICAgICAgICAgICBpZiAoKGwuc3RhdHVzICYgTGFiZWwuU1RPUkUpICE9IDAgfHwgKHUgPj0gMCAmJiByZXNpemVbdV0pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBnZXROZXdPZmZzZXQoYWxsSW5kZXhlcywgYWxsU2l6ZXMsIGwpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyB1cGRhdGUgb2Zmc2V0cyBpbiBVTklOSVRJQUxJWkVEIHZhbHVlcworICAgICAgICAgICAgICAgICAgICAgICAgdmlzaXRGcmFtZShsLmZyYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBsID0gbC5zdWNjZXNzb3I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIFJlc2l6aW5nIGFuIGV4aXN0aW5nIHN0YWNrIG1hcCBmcmFtZSB0YWJsZSBpcyByZWFsbHkgaGFyZC4KKyAgICAgICAgICAgICAgICAgKiBOb3Qgb25seSB0aGUgdGFibGUgbXVzdCBiZSBwYXJzZWQgdG8gdXBkYXRlIHRoZSBvZmZldHMsIGJ1dAorICAgICAgICAgICAgICAgICAqIG5ldyBmcmFtZXMgbWF5IGJlIG5lZWRlZCBmb3IganVtcCBpbnN0cnVjdGlvbnMgdGhhdCB3ZXJlCisgICAgICAgICAgICAgICAgICogaW5zZXJ0ZWQgYnkgdGhpcyBtZXRob2QuIEFuZCB1cGRhdGluZyB0aGUgb2Zmc2V0cyBvcgorICAgICAgICAgICAgICAgICAqIGluc2VydGluZyBmcmFtZXMgY2FuIGNoYW5nZSB0aGUgZm9ybWF0IG9mIHRoZSBmb2xsb3dpbmcKKyAgICAgICAgICAgICAgICAgKiBmcmFtZXMsIGluIGNhc2Ugb2YgcGFja2VkIGZyYW1lcy4gSW4gcHJhY3RpY2UgdGhlIHdob2xlIHRhYmxlCisgICAgICAgICAgICAgICAgICogbXVzdCBiZSByZWNvbXB1dGVkLiBGb3IgdGhpcyB0aGUgZnJhbWVzIGFyZSBtYXJrZWQgYXMKKyAgICAgICAgICAgICAgICAgKiBwb3RlbnRpYWxseSBpbnZhbGlkLiBUaGlzIHdpbGwgY2F1c2UgdGhlIHdob2xlIGNsYXNzIHRvIGJlCisgICAgICAgICAgICAgICAgICogcmVyZWFkIGFuZCByZXdyaXR0ZW4gd2l0aCB0aGUgQ09NUFVURV9GUkFNRVMgb3B0aW9uIChzZWUgdGhlCisgICAgICAgICAgICAgICAgICogQ2xhc3NXcml0ZXIudG9CeXRlQXJyYXkgbWV0aG9kKS4gVGhpcyBpcyBub3QgdmVyeSBlZmZpY2llbnQKKyAgICAgICAgICAgICAgICAgKiBidXQgaXMgbXVjaCBlYXNpZXIgYW5kIHJlcXVpcmVzIG11Y2ggbGVzcyBjb2RlIHRoYW4gYW55IG90aGVyCisgICAgICAgICAgICAgICAgICogbWV0aG9kIEkgY2FuIHRoaW5rIG9mLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGN3LmludmFsaWRGcmFtZXMgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIHVwZGF0ZXMgdGhlIGV4Y2VwdGlvbiBoYW5kbGVyIGJsb2NrIGxhYmVscworICAgICAgICBIYW5kbGVyIGggPSBmaXJzdEhhbmRsZXI7CisgICAgICAgIHdoaWxlIChoICE9IG51bGwpIHsKKyAgICAgICAgICAgIGdldE5ld09mZnNldChhbGxJbmRleGVzLCBhbGxTaXplcywgaC5zdGFydCk7CisgICAgICAgICAgICBnZXROZXdPZmZzZXQoYWxsSW5kZXhlcywgYWxsU2l6ZXMsIGguZW5kKTsKKyAgICAgICAgICAgIGdldE5ld09mZnNldChhbGxJbmRleGVzLCBhbGxTaXplcywgaC5oYW5kbGVyKTsKKyAgICAgICAgICAgIGggPSBoLm5leHQ7CisgICAgICAgIH0KKyAgICAgICAgLy8gdXBkYXRlcyB0aGUgaW5zdHJ1Y3Rpb25zIGFkZHJlc3NlcyBpbiB0aGUKKyAgICAgICAgLy8gbG9jYWwgdmFyIGFuZCBsaW5lIG51bWJlciB0YWJsZXMKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7ICsraSkgeworICAgICAgICAgICAgQnl0ZVZlY3RvciBidiA9IGkgPT0gMCA/IGxvY2FsVmFyIDogbG9jYWxWYXJUeXBlOworICAgICAgICAgICAgaWYgKGJ2ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBiID0gYnYuZGF0YTsKKyAgICAgICAgICAgICAgICB1ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAodSA8IGJ2Lmxlbmd0aCkgeworICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IHJlYWRVbnNpZ25lZFNob3J0KGIsIHUpOworICAgICAgICAgICAgICAgICAgICBuZXdPZmZzZXQgPSBnZXROZXdPZmZzZXQoYWxsSW5kZXhlcywgYWxsU2l6ZXMsIDAsIGxhYmVsKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVTaG9ydChiLCB1LCBuZXdPZmZzZXQpOworICAgICAgICAgICAgICAgICAgICBsYWJlbCArPSByZWFkVW5zaWduZWRTaG9ydChiLCB1ICsgMik7CisgICAgICAgICAgICAgICAgICAgIG5ld09mZnNldCA9IGdldE5ld09mZnNldChhbGxJbmRleGVzLCBhbGxTaXplcywgMCwgbGFiZWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBuZXdPZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlU2hvcnQoYiwgdSArIDIsIG5ld09mZnNldCk7CisgICAgICAgICAgICAgICAgICAgIHUgKz0gMTA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChsaW5lTnVtYmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGIgPSBsaW5lTnVtYmVyLmRhdGE7CisgICAgICAgICAgICB1ID0gMDsKKyAgICAgICAgICAgIHdoaWxlICh1IDwgbGluZU51bWJlci5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICB3cml0ZVNob3J0KGIsIHUsIGdldE5ld09mZnNldChhbGxJbmRleGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgYWxsU2l6ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVhZFVuc2lnbmVkU2hvcnQoYiwgdSkpKTsKKyAgICAgICAgICAgICAgICB1ICs9IDQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gdXBkYXRlcyB0aGUgbGFiZWxzIG9mIHRoZSBvdGhlciBhdHRyaWJ1dGVzCisgICAgICAgIEF0dHJpYnV0ZSBhdHRyID0gY2F0dHJzOworICAgICAgICB3aGlsZSAoYXR0ciAhPSBudWxsKSB7CisgICAgICAgICAgICBMYWJlbFtdIGxhYmVscyA9IGF0dHIuZ2V0TGFiZWxzKCk7CisgICAgICAgICAgICBpZiAobGFiZWxzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSBsYWJlbHMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2V0TmV3T2Zmc2V0KGFsbEluZGV4ZXMsIGFsbFNpemVzLCBsYWJlbHNbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF0dHIgPSBhdHRyLm5leHQ7CisgICAgICAgIH0KKworICAgICAgICAvLyByZXBsYWNlcyBvbGQgYnl0ZWNvZGVzIHdpdGggbmV3IG9uZXMKKyAgICAgICAgY29kZSA9IG5ld0NvZGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZHMgYW4gdW5zaWduZWQgc2hvcnQgdmFsdWUgaW4gdGhlIGdpdmVuIGJ5dGUgYXJyYXkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYiBhIGJ5dGUgYXJyYXkuCisgICAgICogQHBhcmFtIGluZGV4IHRoZSBzdGFydCBpbmRleCBvZiB0aGUgdmFsdWUgdG8gYmUgcmVhZC4KKyAgICAgKiBAcmV0dXJuIHRoZSByZWFkIHZhbHVlLgorICAgICAqLworICAgIHN0YXRpYyBpbnQgcmVhZFVuc2lnbmVkU2hvcnQoZmluYWwgYnl0ZVtdIGIsIGZpbmFsIGludCBpbmRleCkgeworICAgICAgICByZXR1cm4gKChiW2luZGV4XSAmIDB4RkYpIDw8IDgpIHwgKGJbaW5kZXggKyAxXSAmIDB4RkYpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWRzIGEgc2lnbmVkIHNob3J0IHZhbHVlIGluIHRoZSBnaXZlbiBieXRlIGFycmF5LgorICAgICAqCisgICAgICogQHBhcmFtIGIgYSBieXRlIGFycmF5LgorICAgICAqIEBwYXJhbSBpbmRleCB0aGUgc3RhcnQgaW5kZXggb2YgdGhlIHZhbHVlIHRvIGJlIHJlYWQuCisgICAgICogQHJldHVybiB0aGUgcmVhZCB2YWx1ZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgc2hvcnQgcmVhZFNob3J0KGZpbmFsIGJ5dGVbXSBiLCBmaW5hbCBpbnQgaW5kZXgpIHsKKyAgICAgICAgcmV0dXJuIChzaG9ydCkgKCgoYltpbmRleF0gJiAweEZGKSA8PCA4KSB8IChiW2luZGV4ICsgMV0gJiAweEZGKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZHMgYSBzaWduZWQgaW50IHZhbHVlIGluIHRoZSBnaXZlbiBieXRlIGFycmF5LgorICAgICAqCisgICAgICogQHBhcmFtIGIgYSBieXRlIGFycmF5LgorICAgICAqIEBwYXJhbSBpbmRleCB0aGUgc3RhcnQgaW5kZXggb2YgdGhlIHZhbHVlIHRvIGJlIHJlYWQuCisgICAgICogQHJldHVybiB0aGUgcmVhZCB2YWx1ZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgaW50IHJlYWRJbnQoZmluYWwgYnl0ZVtdIGIsIGZpbmFsIGludCBpbmRleCkgeworICAgICAgICByZXR1cm4gKChiW2luZGV4XSAmIDB4RkYpIDw8IDI0KSB8ICgoYltpbmRleCArIDFdICYgMHhGRikgPDwgMTYpCisgICAgICAgICAgICAgICAgfCAoKGJbaW5kZXggKyAyXSAmIDB4RkYpIDw8IDgpIHwgKGJbaW5kZXggKyAzXSAmIDB4RkYpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlcyBhIHNob3J0IHZhbHVlIGluIHRoZSBnaXZlbiBieXRlIGFycmF5LgorICAgICAqCisgICAgICogQHBhcmFtIGIgYSBieXRlIGFycmF5LgorICAgICAqIEBwYXJhbSBpbmRleCB3aGVyZSB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgc2hvcnQgdmFsdWUgbXVzdCBiZSB3cml0dGVuLgorICAgICAqIEBwYXJhbSBzIHRoZSB2YWx1ZSB0byBiZSB3cml0dGVuIGluIHRoZSBnaXZlbiBieXRlIGFycmF5LgorICAgICAqLworICAgIHN0YXRpYyB2b2lkIHdyaXRlU2hvcnQoZmluYWwgYnl0ZVtdIGIsIGZpbmFsIGludCBpbmRleCwgZmluYWwgaW50IHMpIHsKKyAgICAgICAgYltpbmRleF0gPSAoYnl0ZSkgKHMgPj4+IDgpOworICAgICAgICBiW2luZGV4ICsgMV0gPSAoYnl0ZSkgczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21wdXRlcyB0aGUgZnV0dXJlIHZhbHVlIG9mIGEgYnl0ZWNvZGUgb2Zmc2V0LiA8cD4gTm90ZTogaXQgaXMgcG9zc2libGUKKyAgICAgKiB0byBoYXZlIHNldmVyYWwgZW50cmllcyBmb3IgdGhlIHNhbWUgaW5zdHJ1Y3Rpb24gaW4gdGhlIDx0dD5pbmRleGVzPC90dD4KKyAgICAgKiBhbmQgPHR0PnNpemVzPC90dD46IHR3byBlbnRyaWVzIChpbmRleD1hLHNpemU9YikgYW5kIChpbmRleD1hLHNpemU9YicpCisgICAgICogYXJlIGVxdWl2YWxlbnQgdG8gYSBzaW5nbGUgZW50cnkgKGluZGV4PWEsc2l6ZT1iK2InKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbmRleGVzIGN1cnJlbnQgcG9zaXRpb25zIG9mIHRoZSBpbnN0cnVjdGlvbnMgdG8gYmUgcmVzaXplZC4gRWFjaAorICAgICAqICAgICAgICBpbnN0cnVjdGlvbiBtdXN0IGJlIGRlc2lnbmF0ZWQgYnkgdGhlIGluZGV4IG9mIGl0cyA8aT5sYXN0PC9pPgorICAgICAqICAgICAgICBieXRlLCBwbHVzIG9uZSAob3IsIGluIG90aGVyIHdvcmRzLCBieSB0aGUgaW5kZXggb2YgdGhlIDxpPmZpcnN0PC9pPgorICAgICAqICAgICAgICBieXRlIG9mIHRoZSA8aT5uZXh0PC9pPiBpbnN0cnVjdGlvbikuCisgICAgICogQHBhcmFtIHNpemVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgPGk+YWRkZWQ8L2k+IHRvIHRoZSBhYm92ZQorICAgICAqICAgICAgICBpbnN0cnVjdGlvbnMuIE1vcmUgcHJlY2lzZWx5LCBmb3IgZWFjaCBpIDwgPHR0PmxlbjwvdHQ+LAorICAgICAqICAgICAgICA8dHQ+c2l6ZXM8L3R0PltpXSBieXRlcyB3aWxsIGJlIGFkZGVkIGF0IHRoZSBlbmQgb2YgdGhlCisgICAgICogICAgICAgIGluc3RydWN0aW9uIGRlc2lnbmF0ZWQgYnkgPHR0PmluZGV4ZXM8L3R0PltpXSBvciwgaWYKKyAgICAgKiAgICAgICAgPHR0PnNpemVzPC90dD5baV0gaXMgbmVnYXRpdmUsIHRoZSA8aT5sYXN0PC9pPiB8PHR0PnNpemVzW2ldPC90dD58CisgICAgICogICAgICAgIGJ5dGVzIG9mIHRoZSBpbnN0cnVjdGlvbiB3aWxsIGJlIHJlbW92ZWQgKHRoZSBpbnN0cnVjdGlvbiBzaXplCisgICAgICogICAgICAgIDxpPm11c3Qgbm90PC9pPiBiZWNvbWUgbmVnYXRpdmUgb3IgbnVsbCkuCisgICAgICogQHBhcmFtIGJlZ2luIGluZGV4IG9mIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBzb3VyY2UgaW5zdHJ1Y3Rpb24uCisgICAgICogQHBhcmFtIGVuZCBpbmRleCBvZiB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgdGFyZ2V0IGluc3RydWN0aW9uLgorICAgICAqIEByZXR1cm4gdGhlIGZ1dHVyZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gYnl0ZWNvZGUgb2Zmc2V0LgorICAgICAqLworICAgIHN0YXRpYyBpbnQgZ2V0TmV3T2Zmc2V0KAorICAgICAgICBmaW5hbCBpbnRbXSBpbmRleGVzLAorICAgICAgICBmaW5hbCBpbnRbXSBzaXplcywKKyAgICAgICAgZmluYWwgaW50IGJlZ2luLAorICAgICAgICBmaW5hbCBpbnQgZW5kKQorICAgIHsKKyAgICAgICAgaW50IG9mZnNldCA9IGVuZCAtIGJlZ2luOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGluZGV4ZXMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChiZWdpbiA8IGluZGV4ZXNbaV0gJiYgaW5kZXhlc1tpXSA8PSBlbmQpIHsKKyAgICAgICAgICAgICAgICAvLyBmb3J3YXJkIGp1bXAKKyAgICAgICAgICAgICAgICBvZmZzZXQgKz0gc2l6ZXNbaV07CisgICAgICAgICAgICB9IGVsc2UgaWYgKGVuZCA8IGluZGV4ZXNbaV0gJiYgaW5kZXhlc1tpXSA8PSBiZWdpbikgeworICAgICAgICAgICAgICAgIC8vIGJhY2t3YXJkIGp1bXAKKyAgICAgICAgICAgICAgICBvZmZzZXQgLT0gc2l6ZXNbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG9mZnNldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVcGRhdGVzIHRoZSBvZmZzZXQgb2YgdGhlIGdpdmVuIGxhYmVsLgorICAgICAqCisgICAgICogQHBhcmFtIGluZGV4ZXMgY3VycmVudCBwb3NpdGlvbnMgb2YgdGhlIGluc3RydWN0aW9ucyB0byBiZSByZXNpemVkLiBFYWNoCisgICAgICogICAgICAgIGluc3RydWN0aW9uIG11c3QgYmUgZGVzaWduYXRlZCBieSB0aGUgaW5kZXggb2YgaXRzIDxpPmxhc3Q8L2k+CisgICAgICogICAgICAgIGJ5dGUsIHBsdXMgb25lIChvciwgaW4gb3RoZXIgd29yZHMsIGJ5IHRoZSBpbmRleCBvZiB0aGUgPGk+Zmlyc3Q8L2k+CisgICAgICogICAgICAgIGJ5dGUgb2YgdGhlIDxpPm5leHQ8L2k+IGluc3RydWN0aW9uKS4KKyAgICAgKiBAcGFyYW0gc2l6ZXMgdGhlIG51bWJlciBvZiBieXRlcyB0byBiZSA8aT5hZGRlZDwvaT4gdG8gdGhlIGFib3ZlCisgICAgICogICAgICAgIGluc3RydWN0aW9ucy4gTW9yZSBwcmVjaXNlbHksIGZvciBlYWNoIGkgPCA8dHQ+bGVuPC90dD4sCisgICAgICogICAgICAgIDx0dD5zaXplczwvdHQ+W2ldIGJ5dGVzIHdpbGwgYmUgYWRkZWQgYXQgdGhlIGVuZCBvZiB0aGUKKyAgICAgKiAgICAgICAgaW5zdHJ1Y3Rpb24gZGVzaWduYXRlZCBieSA8dHQ+aW5kZXhlczwvdHQ+W2ldIG9yLCBpZgorICAgICAqICAgICAgICA8dHQ+c2l6ZXM8L3R0PltpXSBpcyBuZWdhdGl2ZSwgdGhlIDxpPmxhc3Q8L2k+IHw8dHQ+c2l6ZXNbaV08L3R0PnwKKyAgICAgKiAgICAgICAgYnl0ZXMgb2YgdGhlIGluc3RydWN0aW9uIHdpbGwgYmUgcmVtb3ZlZCAodGhlIGluc3RydWN0aW9uIHNpemUKKyAgICAgKiAgICAgICAgPGk+bXVzdCBub3Q8L2k+IGJlY29tZSBuZWdhdGl2ZSBvciBudWxsKS4KKyAgICAgKiBAcGFyYW0gbGFiZWwgdGhlIGxhYmVsIHdob3NlIG9mZnNldCBtdXN0IGJlIHVwZGF0ZWQuCisgICAgICovCisgICAgc3RhdGljIHZvaWQgZ2V0TmV3T2Zmc2V0KAorICAgICAgICBmaW5hbCBpbnRbXSBpbmRleGVzLAorICAgICAgICBmaW5hbCBpbnRbXSBzaXplcywKKyAgICAgICAgZmluYWwgTGFiZWwgbGFiZWwpCisgICAgeworICAgICAgICBpZiAoKGxhYmVsLnN0YXR1cyAmIExhYmVsLlJFU0laRUQpID09IDApIHsKKyAgICAgICAgICAgIGxhYmVsLnBvc2l0aW9uID0gZ2V0TmV3T2Zmc2V0KGluZGV4ZXMsIHNpemVzLCAwLCBsYWJlbC5wb3NpdGlvbik7CisgICAgICAgICAgICBsYWJlbC5zdGF0dXMgfD0gTGFiZWwuUkVTSVpFRDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vT3Bjb2Rlcy5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS9PcGNvZGVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGYzZGNiYwotLS0gL2Rldi9udWxsCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vT3Bjb2Rlcy5qYXZhCkBAIC0wLDAgKzEsMzg3IEBACisvKgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBPcmFjbGUgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKKyAqIHF1ZXN0aW9ucy4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGlzIGF2YWlsYWJsZSB1bmRlciBhbmQgZ292ZXJuZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiBIb3dldmVyLCB0aGUgZm9sbG93aW5nIG5vdGljZSBhY2NvbXBhbmllZCB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGlzCisgKiBmaWxlOgorICoKKyAqIEFTTTogYSB2ZXJ5IHNtYWxsIGFuZCBmYXN0IEphdmEgYnl0ZWNvZGUgbWFuaXB1bGF0aW9uIGZyYW1ld29yaworICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMTEgSU5SSUEsIEZyYW5jZSBUZWxlY29tCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2UgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtOworCisvKioKKyAqIERlZmluZXMgdGhlIEpWTSBvcGNvZGVzLCBhY2Nlc3MgZmxhZ3MgYW5kIGFycmF5IHR5cGUgY29kZXMuIFRoaXMgaW50ZXJmYWNlCisgKiBkb2VzIG5vdCBkZWZpbmUgYWxsIHRoZSBKVk0gb3Bjb2RlcyBiZWNhdXNlIHNvbWUgb3Bjb2RlcyBhcmUgYXV0b21hdGljYWxseQorICogaGFuZGxlZC4gRm9yIGV4YW1wbGUsIHRoZSB4TE9BRCBhbmQgeFNUT1JFIG9wY29kZXMgYXJlIGF1dG9tYXRpY2FsbHkgcmVwbGFjZWQKKyAqIGJ5IHhMT0FEX24gYW5kIHhTVE9SRV9uIG9wY29kZXMgd2hlbiBwb3NzaWJsZS4gVGhlIHhMT0FEX24gYW5kIHhTVE9SRV9uCisgKiBvcGNvZGVzIGFyZSB0aGVyZWZvcmUgbm90IGRlZmluZWQgaW4gdGhpcyBpbnRlcmZhY2UuIExpa2V3aXNlIGZvciBMREMsCisgKiBhdXRvbWF0aWNhbGx5IHJlcGxhY2VkIGJ5IExEQ19XIG9yIExEQzJfVyB3aGVuIG5lY2Vzc2FyeSwgV0lERSwgR09UT19XIGFuZAorICogSlNSX1cuCisgKgorICogQGF1dGhvciBFcmljIEJydW5ldG9uCisgKiBAYXV0aG9yIEV1Z2VuZSBLdWxlc2hvdgorICovCitwdWJsaWMgaW50ZXJmYWNlIE9wY29kZXMgeworCisgICAgLy8gQVNNIEFQSSB2ZXJzaW9ucworCisgICAgaW50IEFTTTQgPSA0IDw8IDE2IHwgMCA8PCA4IHwgMDsKKworICAgIC8vIHZlcnNpb25zCisKKyAgICBpbnQgVjFfMSA9IDMgPDwgMTYgfCA0NTsKKyAgICBpbnQgVjFfMiA9IDAgPDwgMTYgfCA0NjsKKyAgICBpbnQgVjFfMyA9IDAgPDwgMTYgfCA0NzsKKyAgICBpbnQgVjFfNCA9IDAgPDwgMTYgfCA0ODsKKyAgICBpbnQgVjFfNSA9IDAgPDwgMTYgfCA0OTsKKyAgICBpbnQgVjFfNiA9IDAgPDwgMTYgfCA1MDsKKyAgICBpbnQgVjFfNyA9IDAgPDwgMTYgfCA1MTsKKworICAgIC8vIGFjY2VzcyBmbGFncworCisgICAgaW50IEFDQ19QVUJMSUMgPSAweDAwMDE7IC8vIGNsYXNzLCBmaWVsZCwgbWV0aG9kCisgICAgaW50IEFDQ19QUklWQVRFID0gMHgwMDAyOyAvLyBjbGFzcywgZmllbGQsIG1ldGhvZAorICAgIGludCBBQ0NfUFJPVEVDVEVEID0gMHgwMDA0OyAvLyBjbGFzcywgZmllbGQsIG1ldGhvZAorICAgIGludCBBQ0NfU1RBVElDID0gMHgwMDA4OyAvLyBmaWVsZCwgbWV0aG9kCisgICAgaW50IEFDQ19GSU5BTCA9IDB4MDAxMDsgLy8gY2xhc3MsIGZpZWxkLCBtZXRob2QKKyAgICBpbnQgQUNDX1NVUEVSID0gMHgwMDIwOyAvLyBjbGFzcworICAgIGludCBBQ0NfU1lOQ0hST05JWkVEID0gMHgwMDIwOyAvLyBtZXRob2QKKyAgICBpbnQgQUNDX1ZPTEFUSUxFID0gMHgwMDQwOyAvLyBmaWVsZAorICAgIGludCBBQ0NfQlJJREdFID0gMHgwMDQwOyAvLyBtZXRob2QKKyAgICBpbnQgQUNDX1ZBUkFSR1MgPSAweDAwODA7IC8vIG1ldGhvZAorICAgIGludCBBQ0NfVFJBTlNJRU5UID0gMHgwMDgwOyAvLyBmaWVsZAorICAgIGludCBBQ0NfTkFUSVZFID0gMHgwMTAwOyAvLyBtZXRob2QKKyAgICBpbnQgQUNDX0lOVEVSRkFDRSA9IDB4MDIwMDsgLy8gY2xhc3MKKyAgICBpbnQgQUNDX0FCU1RSQUNUID0gMHgwNDAwOyAvLyBjbGFzcywgbWV0aG9kCisgICAgaW50IEFDQ19TVFJJQ1QgPSAweDA4MDA7IC8vIG1ldGhvZAorICAgIGludCBBQ0NfU1lOVEhFVElDID0gMHgxMDAwOyAvLyBjbGFzcywgZmllbGQsIG1ldGhvZAorICAgIGludCBBQ0NfQU5OT1RBVElPTiA9IDB4MjAwMDsgLy8gY2xhc3MKKyAgICBpbnQgQUNDX0VOVU0gPSAweDQwMDA7IC8vIGNsYXNzKD8pIGZpZWxkIGlubmVyCisKKyAgICAvLyBBU00gc3BlY2lmaWMgcHNldWRvIGFjY2VzcyBmbGFncworCisgICAgaW50IEFDQ19ERVBSRUNBVEVEID0gMHgyMDAwMDsgLy8gY2xhc3MsIGZpZWxkLCBtZXRob2QKKworICAgIC8vIHR5cGVzIGZvciBORVdBUlJBWQorCisgICAgaW50IFRfQk9PTEVBTiA9IDQ7CisgICAgaW50IFRfQ0hBUiA9IDU7CisgICAgaW50IFRfRkxPQVQgPSA2OworICAgIGludCBUX0RPVUJMRSA9IDc7CisgICAgaW50IFRfQllURSA9IDg7CisgICAgaW50IFRfU0hPUlQgPSA5OworICAgIGludCBUX0lOVCA9IDEwOworICAgIGludCBUX0xPTkcgPSAxMTsKKworICAgIC8vIHRhZ3MgZm9yIEhhbmRsZQorCisgICAgaW50IEhfR0VURklFTEQgPSAxOworICAgIGludCBIX0dFVFNUQVRJQyA9IDI7CisgICAgaW50IEhfUFVURklFTEQgPSAzOworICAgIGludCBIX1BVVFNUQVRJQyA9IDQ7CisgICAgaW50IEhfSU5WT0tFVklSVFVBTCA9IDU7CisgICAgaW50IEhfSU5WT0tFU1RBVElDID0gNjsKKyAgICBpbnQgSF9JTlZPS0VTUEVDSUFMID0gNzsKKyAgICBpbnQgSF9ORVdJTlZPS0VTUEVDSUFMID0gODsKKyAgICBpbnQgSF9JTlZPS0VJTlRFUkZBQ0UgPSA5OworCisgICAgLy8gc3RhY2sgbWFwIGZyYW1lIHR5cGVzCisKKyAgICAvKioKKyAgICAgKiBSZXByZXNlbnRzIGFuIGV4cGFuZGVkIGZyYW1lLiBTZWUge0BsaW5rIENsYXNzUmVhZGVyI0VYUEFORF9GUkFNRVN9LgorICAgICAqLworICAgIGludCBGX05FVyA9IC0xOworCisgICAgLyoqCisgICAgICogUmVwcmVzZW50cyBhIGNvbXByZXNzZWQgZnJhbWUgd2l0aCBjb21wbGV0ZSBmcmFtZSBkYXRhLgorICAgICAqLworICAgIGludCBGX0ZVTEwgPSAwOworCisgICAgLyoqCisgICAgICogUmVwcmVzZW50cyBhIGNvbXByZXNzZWQgZnJhbWUgd2hlcmUgbG9jYWxzIGFyZSB0aGUgc2FtZSBhcyB0aGUgbG9jYWxzIGluCisgICAgICogdGhlIHByZXZpb3VzIGZyYW1lLCBleGNlcHQgdGhhdCBhZGRpdGlvbmFsIDEtMyBsb2NhbHMgYXJlIGRlZmluZWQsIGFuZAorICAgICAqIHdpdGggYW4gZW1wdHkgc3RhY2suCisgICAgICovCisgICAgaW50IEZfQVBQRU5EID0gMTsKKworICAgIC8qKgorICAgICAqIFJlcHJlc2VudHMgYSBjb21wcmVzc2VkIGZyYW1lIHdoZXJlIGxvY2FscyBhcmUgdGhlIHNhbWUgYXMgdGhlIGxvY2FscyBpbgorICAgICAqIHRoZSBwcmV2aW91cyBmcmFtZSwgZXhjZXB0IHRoYXQgdGhlIGxhc3QgMS0zIGxvY2FscyBhcmUgYWJzZW50IGFuZCB3aXRoCisgICAgICogYW4gZW1wdHkgc3RhY2suCisgICAgICovCisgICAgaW50IEZfQ0hPUCA9IDI7CisKKyAgICAvKioKKyAgICAgKiBSZXByZXNlbnRzIGEgY29tcHJlc3NlZCBmcmFtZSB3aXRoIGV4YWN0bHkgdGhlIHNhbWUgbG9jYWxzIGFzIHRoZQorICAgICAqIHByZXZpb3VzIGZyYW1lIGFuZCB3aXRoIGFuIGVtcHR5IHN0YWNrLgorICAgICAqLworICAgIGludCBGX1NBTUUgPSAzOworCisgICAgLyoqCisgICAgICogUmVwcmVzZW50cyBhIGNvbXByZXNzZWQgZnJhbWUgd2l0aCBleGFjdGx5IHRoZSBzYW1lIGxvY2FscyBhcyB0aGUKKyAgICAgKiBwcmV2aW91cyBmcmFtZSBhbmQgd2l0aCBhIHNpbmdsZSB2YWx1ZSBvbiB0aGUgc3RhY2suCisgICAgICovCisgICAgaW50IEZfU0FNRTEgPSA0OworCisgICAgSW50ZWdlciBUT1AgPSBuZXcgSW50ZWdlcigwKTsKKyAgICBJbnRlZ2VyIElOVEVHRVIgPSBuZXcgSW50ZWdlcigxKTsKKyAgICBJbnRlZ2VyIEZMT0FUID0gbmV3IEludGVnZXIoMik7CisgICAgSW50ZWdlciBET1VCTEUgPSBuZXcgSW50ZWdlcigzKTsKKyAgICBJbnRlZ2VyIExPTkcgPSBuZXcgSW50ZWdlcig0KTsKKyAgICBJbnRlZ2VyIE5VTEwgPSBuZXcgSW50ZWdlcig1KTsKKyAgICBJbnRlZ2VyIFVOSU5JVElBTElaRURfVEhJUyA9IG5ldyBJbnRlZ2VyKDYpOworCisgICAgLy8gb3Bjb2RlcyAvLyB2aXNpdCBtZXRob2QgKC0gPSBpZGVtKQorCisgICAgaW50IE5PUCA9IDA7IC8vIHZpc2l0SW5zbgorICAgIGludCBBQ09OU1RfTlVMTCA9IDE7IC8vIC0KKyAgICBpbnQgSUNPTlNUX00xID0gMjsgLy8gLQorICAgIGludCBJQ09OU1RfMCA9IDM7IC8vIC0KKyAgICBpbnQgSUNPTlNUXzEgPSA0OyAvLyAtCisgICAgaW50IElDT05TVF8yID0gNTsgLy8gLQorICAgIGludCBJQ09OU1RfMyA9IDY7IC8vIC0KKyAgICBpbnQgSUNPTlNUXzQgPSA3OyAvLyAtCisgICAgaW50IElDT05TVF81ID0gODsgLy8gLQorICAgIGludCBMQ09OU1RfMCA9IDk7IC8vIC0KKyAgICBpbnQgTENPTlNUXzEgPSAxMDsgLy8gLQorICAgIGludCBGQ09OU1RfMCA9IDExOyAvLyAtCisgICAgaW50IEZDT05TVF8xID0gMTI7IC8vIC0KKyAgICBpbnQgRkNPTlNUXzIgPSAxMzsgLy8gLQorICAgIGludCBEQ09OU1RfMCA9IDE0OyAvLyAtCisgICAgaW50IERDT05TVF8xID0gMTU7IC8vIC0KKyAgICBpbnQgQklQVVNIID0gMTY7IC8vIHZpc2l0SW50SW5zbgorICAgIGludCBTSVBVU0ggPSAxNzsgLy8gLQorICAgIGludCBMREMgPSAxODsgLy8gdmlzaXRMZGNJbnNuCisgICAgLy8gaW50IExEQ19XID0gMTk7IC8vIC0KKyAgICAvLyBpbnQgTERDMl9XID0gMjA7IC8vIC0KKyAgICBpbnQgSUxPQUQgPSAyMTsgLy8gdmlzaXRWYXJJbnNuCisgICAgaW50IExMT0FEID0gMjI7IC8vIC0KKyAgICBpbnQgRkxPQUQgPSAyMzsgLy8gLQorICAgIGludCBETE9BRCA9IDI0OyAvLyAtCisgICAgaW50IEFMT0FEID0gMjU7IC8vIC0KKyAgICAvLyBpbnQgSUxPQURfMCA9IDI2OyAvLyAtCisgICAgLy8gaW50IElMT0FEXzEgPSAyNzsgLy8gLQorICAgIC8vIGludCBJTE9BRF8yID0gMjg7IC8vIC0KKyAgICAvLyBpbnQgSUxPQURfMyA9IDI5OyAvLyAtCisgICAgLy8gaW50IExMT0FEXzAgPSAzMDsgLy8gLQorICAgIC8vIGludCBMTE9BRF8xID0gMzE7IC8vIC0KKyAgICAvLyBpbnQgTExPQURfMiA9IDMyOyAvLyAtCisgICAgLy8gaW50IExMT0FEXzMgPSAzMzsgLy8gLQorICAgIC8vIGludCBGTE9BRF8wID0gMzQ7IC8vIC0KKyAgICAvLyBpbnQgRkxPQURfMSA9IDM1OyAvLyAtCisgICAgLy8gaW50IEZMT0FEXzIgPSAzNjsgLy8gLQorICAgIC8vIGludCBGTE9BRF8zID0gMzc7IC8vIC0KKyAgICAvLyBpbnQgRExPQURfMCA9IDM4OyAvLyAtCisgICAgLy8gaW50IERMT0FEXzEgPSAzOTsgLy8gLQorICAgIC8vIGludCBETE9BRF8yID0gNDA7IC8vIC0KKyAgICAvLyBpbnQgRExPQURfMyA9IDQxOyAvLyAtCisgICAgLy8gaW50IEFMT0FEXzAgPSA0MjsgLy8gLQorICAgIC8vIGludCBBTE9BRF8xID0gNDM7IC8vIC0KKyAgICAvLyBpbnQgQUxPQURfMiA9IDQ0OyAvLyAtCisgICAgLy8gaW50IEFMT0FEXzMgPSA0NTsgLy8gLQorICAgIGludCBJQUxPQUQgPSA0NjsgLy8gdmlzaXRJbnNuCisgICAgaW50IExBTE9BRCA9IDQ3OyAvLyAtCisgICAgaW50IEZBTE9BRCA9IDQ4OyAvLyAtCisgICAgaW50IERBTE9BRCA9IDQ5OyAvLyAtCisgICAgaW50IEFBTE9BRCA9IDUwOyAvLyAtCisgICAgaW50IEJBTE9BRCA9IDUxOyAvLyAtCisgICAgaW50IENBTE9BRCA9IDUyOyAvLyAtCisgICAgaW50IFNBTE9BRCA9IDUzOyAvLyAtCisgICAgaW50IElTVE9SRSA9IDU0OyAvLyB2aXNpdFZhckluc24KKyAgICBpbnQgTFNUT1JFID0gNTU7IC8vIC0KKyAgICBpbnQgRlNUT1JFID0gNTY7IC8vIC0KKyAgICBpbnQgRFNUT1JFID0gNTc7IC8vIC0KKyAgICBpbnQgQVNUT1JFID0gNTg7IC8vIC0KKyAgICAvLyBpbnQgSVNUT1JFXzAgPSA1OTsgLy8gLQorICAgIC8vIGludCBJU1RPUkVfMSA9IDYwOyAvLyAtCisgICAgLy8gaW50IElTVE9SRV8yID0gNjE7IC8vIC0KKyAgICAvLyBpbnQgSVNUT1JFXzMgPSA2MjsgLy8gLQorICAgIC8vIGludCBMU1RPUkVfMCA9IDYzOyAvLyAtCisgICAgLy8gaW50IExTVE9SRV8xID0gNjQ7IC8vIC0KKyAgICAvLyBpbnQgTFNUT1JFXzIgPSA2NTsgLy8gLQorICAgIC8vIGludCBMU1RPUkVfMyA9IDY2OyAvLyAtCisgICAgLy8gaW50IEZTVE9SRV8wID0gNjc7IC8vIC0KKyAgICAvLyBpbnQgRlNUT1JFXzEgPSA2ODsgLy8gLQorICAgIC8vIGludCBGU1RPUkVfMiA9IDY5OyAvLyAtCisgICAgLy8gaW50IEZTVE9SRV8zID0gNzA7IC8vIC0KKyAgICAvLyBpbnQgRFNUT1JFXzAgPSA3MTsgLy8gLQorICAgIC8vIGludCBEU1RPUkVfMSA9IDcyOyAvLyAtCisgICAgLy8gaW50IERTVE9SRV8yID0gNzM7IC8vIC0KKyAgICAvLyBpbnQgRFNUT1JFXzMgPSA3NDsgLy8gLQorICAgIC8vIGludCBBU1RPUkVfMCA9IDc1OyAvLyAtCisgICAgLy8gaW50IEFTVE9SRV8xID0gNzY7IC8vIC0KKyAgICAvLyBpbnQgQVNUT1JFXzIgPSA3NzsgLy8gLQorICAgIC8vIGludCBBU1RPUkVfMyA9IDc4OyAvLyAtCisgICAgaW50IElBU1RPUkUgPSA3OTsgLy8gdmlzaXRJbnNuCisgICAgaW50IExBU1RPUkUgPSA4MDsgLy8gLQorICAgIGludCBGQVNUT1JFID0gODE7IC8vIC0KKyAgICBpbnQgREFTVE9SRSA9IDgyOyAvLyAtCisgICAgaW50IEFBU1RPUkUgPSA4MzsgLy8gLQorICAgIGludCBCQVNUT1JFID0gODQ7IC8vIC0KKyAgICBpbnQgQ0FTVE9SRSA9IDg1OyAvLyAtCisgICAgaW50IFNBU1RPUkUgPSA4NjsgLy8gLQorICAgIGludCBQT1AgPSA4NzsgLy8gLQorICAgIGludCBQT1AyID0gODg7IC8vIC0KKyAgICBpbnQgRFVQID0gODk7IC8vIC0KKyAgICBpbnQgRFVQX1gxID0gOTA7IC8vIC0KKyAgICBpbnQgRFVQX1gyID0gOTE7IC8vIC0KKyAgICBpbnQgRFVQMiA9IDkyOyAvLyAtCisgICAgaW50IERVUDJfWDEgPSA5MzsgLy8gLQorICAgIGludCBEVVAyX1gyID0gOTQ7IC8vIC0KKyAgICBpbnQgU1dBUCA9IDk1OyAvLyAtCisgICAgaW50IElBREQgPSA5NjsgLy8gLQorICAgIGludCBMQUREID0gOTc7IC8vIC0KKyAgICBpbnQgRkFERCA9IDk4OyAvLyAtCisgICAgaW50IERBREQgPSA5OTsgLy8gLQorICAgIGludCBJU1VCID0gMTAwOyAvLyAtCisgICAgaW50IExTVUIgPSAxMDE7IC8vIC0KKyAgICBpbnQgRlNVQiA9IDEwMjsgLy8gLQorICAgIGludCBEU1VCID0gMTAzOyAvLyAtCisgICAgaW50IElNVUwgPSAxMDQ7IC8vIC0KKyAgICBpbnQgTE1VTCA9IDEwNTsgLy8gLQorICAgIGludCBGTVVMID0gMTA2OyAvLyAtCisgICAgaW50IERNVUwgPSAxMDc7IC8vIC0KKyAgICBpbnQgSURJViA9IDEwODsgLy8gLQorICAgIGludCBMRElWID0gMTA5OyAvLyAtCisgICAgaW50IEZESVYgPSAxMTA7IC8vIC0KKyAgICBpbnQgRERJViA9IDExMTsgLy8gLQorICAgIGludCBJUkVNID0gMTEyOyAvLyAtCisgICAgaW50IExSRU0gPSAxMTM7IC8vIC0KKyAgICBpbnQgRlJFTSA9IDExNDsgLy8gLQorICAgIGludCBEUkVNID0gMTE1OyAvLyAtCisgICAgaW50IElORUcgPSAxMTY7IC8vIC0KKyAgICBpbnQgTE5FRyA9IDExNzsgLy8gLQorICAgIGludCBGTkVHID0gMTE4OyAvLyAtCisgICAgaW50IERORUcgPSAxMTk7IC8vIC0KKyAgICBpbnQgSVNITCA9IDEyMDsgLy8gLQorICAgIGludCBMU0hMID0gMTIxOyAvLyAtCisgICAgaW50IElTSFIgPSAxMjI7IC8vIC0KKyAgICBpbnQgTFNIUiA9IDEyMzsgLy8gLQorICAgIGludCBJVVNIUiA9IDEyNDsgLy8gLQorICAgIGludCBMVVNIUiA9IDEyNTsgLy8gLQorICAgIGludCBJQU5EID0gMTI2OyAvLyAtCisgICAgaW50IExBTkQgPSAxMjc7IC8vIC0KKyAgICBpbnQgSU9SID0gMTI4OyAvLyAtCisgICAgaW50IExPUiA9IDEyOTsgLy8gLQorICAgIGludCBJWE9SID0gMTMwOyAvLyAtCisgICAgaW50IExYT1IgPSAxMzE7IC8vIC0KKyAgICBpbnQgSUlOQyA9IDEzMjsgLy8gdmlzaXRJaW5jSW5zbgorICAgIGludCBJMkwgPSAxMzM7IC8vIHZpc2l0SW5zbgorICAgIGludCBJMkYgPSAxMzQ7IC8vIC0KKyAgICBpbnQgSTJEID0gMTM1OyAvLyAtCisgICAgaW50IEwySSA9IDEzNjsgLy8gLQorICAgIGludCBMMkYgPSAxMzc7IC8vIC0KKyAgICBpbnQgTDJEID0gMTM4OyAvLyAtCisgICAgaW50IEYySSA9IDEzOTsgLy8gLQorICAgIGludCBGMkwgPSAxNDA7IC8vIC0KKyAgICBpbnQgRjJEID0gMTQxOyAvLyAtCisgICAgaW50IEQySSA9IDE0MjsgLy8gLQorICAgIGludCBEMkwgPSAxNDM7IC8vIC0KKyAgICBpbnQgRDJGID0gMTQ0OyAvLyAtCisgICAgaW50IEkyQiA9IDE0NTsgLy8gLQorICAgIGludCBJMkMgPSAxNDY7IC8vIC0KKyAgICBpbnQgSTJTID0gMTQ3OyAvLyAtCisgICAgaW50IExDTVAgPSAxNDg7IC8vIC0KKyAgICBpbnQgRkNNUEwgPSAxNDk7IC8vIC0KKyAgICBpbnQgRkNNUEcgPSAxNTA7IC8vIC0KKyAgICBpbnQgRENNUEwgPSAxNTE7IC8vIC0KKyAgICBpbnQgRENNUEcgPSAxNTI7IC8vIC0KKyAgICBpbnQgSUZFUSA9IDE1MzsgLy8gdmlzaXRKdW1wSW5zbgorICAgIGludCBJRk5FID0gMTU0OyAvLyAtCisgICAgaW50IElGTFQgPSAxNTU7IC8vIC0KKyAgICBpbnQgSUZHRSA9IDE1NjsgLy8gLQorICAgIGludCBJRkdUID0gMTU3OyAvLyAtCisgICAgaW50IElGTEUgPSAxNTg7IC8vIC0KKyAgICBpbnQgSUZfSUNNUEVRID0gMTU5OyAvLyAtCisgICAgaW50IElGX0lDTVBORSA9IDE2MDsgLy8gLQorICAgIGludCBJRl9JQ01QTFQgPSAxNjE7IC8vIC0KKyAgICBpbnQgSUZfSUNNUEdFID0gMTYyOyAvLyAtCisgICAgaW50IElGX0lDTVBHVCA9IDE2MzsgLy8gLQorICAgIGludCBJRl9JQ01QTEUgPSAxNjQ7IC8vIC0KKyAgICBpbnQgSUZfQUNNUEVRID0gMTY1OyAvLyAtCisgICAgaW50IElGX0FDTVBORSA9IDE2NjsgLy8gLQorICAgIGludCBHT1RPID0gMTY3OyAvLyAtCisgICAgaW50IEpTUiA9IDE2ODsgLy8gLQorICAgIGludCBSRVQgPSAxNjk7IC8vIHZpc2l0VmFySW5zbgorICAgIGludCBUQUJMRVNXSVRDSCA9IDE3MDsgLy8gdmlzaVRhYmxlU3dpdGNoSW5zbgorICAgIGludCBMT09LVVBTV0lUQ0ggPSAxNzE7IC8vIHZpc2l0TG9va3VwU3dpdGNoCisgICAgaW50IElSRVRVUk4gPSAxNzI7IC8vIHZpc2l0SW5zbgorICAgIGludCBMUkVUVVJOID0gMTczOyAvLyAtCisgICAgaW50IEZSRVRVUk4gPSAxNzQ7IC8vIC0KKyAgICBpbnQgRFJFVFVSTiA9IDE3NTsgLy8gLQorICAgIGludCBBUkVUVVJOID0gMTc2OyAvLyAtCisgICAgaW50IFJFVFVSTiA9IDE3NzsgLy8gLQorICAgIGludCBHRVRTVEFUSUMgPSAxNzg7IC8vIHZpc2l0RmllbGRJbnNuCisgICAgaW50IFBVVFNUQVRJQyA9IDE3OTsgLy8gLQorICAgIGludCBHRVRGSUVMRCA9IDE4MDsgLy8gLQorICAgIGludCBQVVRGSUVMRCA9IDE4MTsgLy8gLQorICAgIGludCBJTlZPS0VWSVJUVUFMID0gMTgyOyAvLyB2aXNpdE1ldGhvZEluc24KKyAgICBpbnQgSU5WT0tFU1BFQ0lBTCA9IDE4MzsgLy8gLQorICAgIGludCBJTlZPS0VTVEFUSUMgPSAxODQ7IC8vIC0KKyAgICBpbnQgSU5WT0tFSU5URVJGQUNFID0gMTg1OyAvLyAtCisgICAgaW50IElOVk9LRURZTkFNSUMgPSAxODY7IC8vIHZpc2l0SW52b2tlRHluYW1pY0luc24KKyAgICBpbnQgTkVXID0gMTg3OyAvLyB2aXNpdFR5cGVJbnNuCisgICAgaW50IE5FV0FSUkFZID0gMTg4OyAvLyB2aXNpdEludEluc24KKyAgICBpbnQgQU5FV0FSUkFZID0gMTg5OyAvLyB2aXNpdFR5cGVJbnNuCisgICAgaW50IEFSUkFZTEVOR1RIID0gMTkwOyAvLyB2aXNpdEluc24KKyAgICBpbnQgQVRIUk9XID0gMTkxOyAvLyAtCisgICAgaW50IENIRUNLQ0FTVCA9IDE5MjsgLy8gdmlzaXRUeXBlSW5zbgorICAgIGludCBJTlNUQU5DRU9GID0gMTkzOyAvLyAtCisgICAgaW50IE1PTklUT1JFTlRFUiA9IDE5NDsgLy8gdmlzaXRJbnNuCisgICAgaW50IE1PTklUT1JFWElUID0gMTk1OyAvLyAtCisgICAgLy8gaW50IFdJREUgPSAxOTY7IC8vIE5PVCBWSVNJVEVECisgICAgaW50IE1VTFRJQU5FV0FSUkFZID0gMTk3OyAvLyB2aXNpdE11bHRpQU5ld0FycmF5SW5zbgorICAgIGludCBJRk5VTEwgPSAxOTg7IC8vIHZpc2l0SnVtcEluc24KKyAgICBpbnQgSUZOT05OVUxMID0gMTk5OyAvLyAtCisgICAgLy8gaW50IEdPVE9fVyA9IDIwMDsgLy8gLQorICAgIC8vIGludCBKU1JfVyA9IDIwMTsgLy8gLQorfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS9UeXBlLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL1R5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2M3YTdjCi0tLSAvZGV2L251bGwKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS9UeXBlLmphdmEKQEAgLTAsMCArMSw4OTQgQEAKKy8qCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IE9yYWNsZSBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQorICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQorICogcXVlc3Rpb25zLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgaXMgYXZhaWxhYmxlIHVuZGVyIGFuZCBnb3Zlcm5lZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIEhvd2V2ZXIsIHRoZSBmb2xsb3dpbmcgbm90aWNlIGFjY29tcGFuaWVkIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoaXMKKyAqIGZpbGU6CisgKgorICogQVNNOiBhIHZlcnkgc21hbGwgYW5kIGZhc3QgSmF2YSBieXRlY29kZSBtYW5pcHVsYXRpb24gZnJhbWV3b3JrCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAxMSBJTlJJQSwgRnJhbmNlIFRlbGVjb20KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc207CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CisKKy8qKgorICogQSBKYXZhIGZpZWxkIG9yIG1ldGhvZCB0eXBlLiBUaGlzIGNsYXNzIGNhbiBiZSB1c2VkIHRvIG1ha2UgaXQgZWFzaWVyIHRvCisgKiBtYW5pcHVsYXRlIHR5cGUgYW5kIG1ldGhvZCBkZXNjcmlwdG9ycy4KKyAqCisgKiBAYXV0aG9yIEVyaWMgQnJ1bmV0b24KKyAqIEBhdXRob3IgQ2hyaXMgTm9rbGViZXJnCisgKi8KK3B1YmxpYyBjbGFzcyBUeXBlIHsKKworICAgIC8qKgorICAgICAqIFRoZSBzb3J0IG9mIHRoZSA8dHQ+dm9pZDwvdHQ+IHR5cGUuIFNlZSB7QGxpbmsgI2dldFNvcnQgZ2V0U29ydH0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVk9JRCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc29ydCBvZiB0aGUgPHR0PmJvb2xlYW48L3R0PiB0eXBlLiBTZWUge0BsaW5rICNnZXRTb3J0IGdldFNvcnR9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJPT0xFQU4gPSAxOworCisgICAgLyoqCisgICAgICogVGhlIHNvcnQgb2YgdGhlIDx0dD5jaGFyPC90dD4gdHlwZS4gU2VlIHtAbGluayAjZ2V0U29ydCBnZXRTb3J0fS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSEFSID0gMjsKKworICAgIC8qKgorICAgICAqIFRoZSBzb3J0IG9mIHRoZSA8dHQ+Ynl0ZTwvdHQ+IHR5cGUuIFNlZSB7QGxpbmsgI2dldFNvcnQgZ2V0U29ydH0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQllURSA9IDM7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc29ydCBvZiB0aGUgPHR0PnNob3J0PC90dD4gdHlwZS4gU2VlIHtAbGluayAjZ2V0U29ydCBnZXRTb3J0fS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSE9SVCA9IDQ7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc29ydCBvZiB0aGUgPHR0PmludDwvdHQ+IHR5cGUuIFNlZSB7QGxpbmsgI2dldFNvcnQgZ2V0U29ydH0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5UID0gNTsKKworICAgIC8qKgorICAgICAqIFRoZSBzb3J0IG9mIHRoZSA8dHQ+ZmxvYXQ8L3R0PiB0eXBlLiBTZWUge0BsaW5rICNnZXRTb3J0IGdldFNvcnR9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMT0FUID0gNjsKKworICAgIC8qKgorICAgICAqIFRoZSBzb3J0IG9mIHRoZSA8dHQ+bG9uZzwvdHQ+IHR5cGUuIFNlZSB7QGxpbmsgI2dldFNvcnQgZ2V0U29ydH0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9ORyA9IDc7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc29ydCBvZiB0aGUgPHR0PmRvdWJsZTwvdHQ+IHR5cGUuIFNlZSB7QGxpbmsgI2dldFNvcnQgZ2V0U29ydH0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRE9VQkxFID0gODsKKworICAgIC8qKgorICAgICAqIFRoZSBzb3J0IG9mIGFycmF5IHJlZmVyZW5jZSB0eXBlcy4gU2VlIHtAbGluayAjZ2V0U29ydCBnZXRTb3J0fS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBUlJBWSA9IDk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc29ydCBvZiBvYmplY3QgcmVmZXJlbmNlIHR5cGVzLiBTZWUge0BsaW5rICNnZXRTb3J0IGdldFNvcnR9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9CSkVDVCA9IDEwOworCisgICAgLyoqCisgICAgICogVGhlIHNvcnQgb2YgbWV0aG9kIHR5cGVzLiBTZWUge0BsaW5rICNnZXRTb3J0IGdldFNvcnR9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FVEhPRCA9IDExOworCisgICAgLyoqCisgICAgICogVGhlIDx0dD52b2lkPC90dD4gdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGUgVk9JRF9UWVBFID0gbmV3IFR5cGUoVk9JRCwgbnVsbCwgKCdWJyA8PCAyNCkKKyAgICAgICAgICAgIHwgKDUgPDwgMTYpIHwgKDAgPDwgOCkgfCAwLCAxKTsKKworICAgIC8qKgorICAgICAqIFRoZSA8dHQ+Ym9vbGVhbjwvdHQ+IHR5cGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBUeXBlIEJPT0xFQU5fVFlQRSA9IG5ldyBUeXBlKEJPT0xFQU4sIG51bGwsICgnWicgPDwgMjQpCisgICAgICAgICAgICB8ICgwIDw8IDE2KSB8ICg1IDw8IDgpIHwgMSwgMSk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgPHR0PmNoYXI8L3R0PiB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZSBDSEFSX1RZUEUgPSBuZXcgVHlwZShDSEFSLCBudWxsLCAoJ0MnIDw8IDI0KQorICAgICAgICAgICAgfCAoMCA8PCAxNikgfCAoNiA8PCA4KSB8IDEsIDEpOworCisgICAgLyoqCisgICAgICogVGhlIDx0dD5ieXRlPC90dD4gdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGUgQllURV9UWVBFID0gbmV3IFR5cGUoQllURSwgbnVsbCwgKCdCJyA8PCAyNCkKKyAgICAgICAgICAgIHwgKDAgPDwgMTYpIHwgKDUgPDwgOCkgfCAxLCAxKTsKKworICAgIC8qKgorICAgICAqIFRoZSA8dHQ+c2hvcnQ8L3R0PiB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZSBTSE9SVF9UWVBFID0gbmV3IFR5cGUoU0hPUlQsIG51bGwsICgnUycgPDwgMjQpCisgICAgICAgICAgICB8ICgwIDw8IDE2KSB8ICg3IDw8IDgpIHwgMSwgMSk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgPHR0PmludDwvdHQ+IHR5cGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBUeXBlIElOVF9UWVBFID0gbmV3IFR5cGUoSU5ULCBudWxsLCAoJ0knIDw8IDI0KQorICAgICAgICAgICAgfCAoMCA8PCAxNikgfCAoMCA8PCA4KSB8IDEsIDEpOworCisgICAgLyoqCisgICAgICogVGhlIDx0dD5mbG9hdDwvdHQ+IHR5cGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBUeXBlIEZMT0FUX1RZUEUgPSBuZXcgVHlwZShGTE9BVCwgbnVsbCwgKCdGJyA8PCAyNCkKKyAgICAgICAgICAgIHwgKDIgPDwgMTYpIHwgKDIgPDwgOCkgfCAxLCAxKTsKKworICAgIC8qKgorICAgICAqIFRoZSA8dHQ+bG9uZzwvdHQ+IHR5cGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBUeXBlIExPTkdfVFlQRSA9IG5ldyBUeXBlKExPTkcsIG51bGwsICgnSicgPDwgMjQpCisgICAgICAgICAgICB8ICgxIDw8IDE2KSB8ICgxIDw8IDgpIHwgMiwgMSk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgPHR0PmRvdWJsZTwvdHQ+IHR5cGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBUeXBlIERPVUJMRV9UWVBFID0gbmV3IFR5cGUoRE9VQkxFLCBudWxsLCAoJ0QnIDw8IDI0KQorICAgICAgICAgICAgfCAoMyA8PCAxNikgfCAoMyA8PCA4KSB8IDIsIDEpOworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gRmllbGRzCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvKioKKyAgICAgKiBUaGUgc29ydCBvZiB0aGlzIEphdmEgdHlwZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIGludCBzb3J0OworCisgICAgLyoqCisgICAgICogQSBidWZmZXIgY29udGFpbmluZyB0aGUgaW50ZXJuYWwgbmFtZSBvZiB0aGlzIEphdmEgdHlwZS4gVGhpcyBmaWVsZCBpcworICAgICAqIG9ubHkgdXNlZCBmb3IgcmVmZXJlbmNlIHR5cGVzLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgY2hhcltdIGJ1ZjsKKworICAgIC8qKgorICAgICAqIFRoZSBvZmZzZXQgb2YgdGhlIGludGVybmFsIG5hbWUgb2YgdGhpcyBKYXZhIHR5cGUgaW4ge0BsaW5rICNidWYgYnVmfSBvciwKKyAgICAgKiBmb3IgcHJpbWl0aXZlIHR5cGVzLCB0aGUgc2l6ZSwgZGVzY3JpcHRvciBhbmQgZ2V0T3Bjb2RlIG9mZnNldHMgZm9yIHRoaXMKKyAgICAgKiB0eXBlIChieXRlIDAgY29udGFpbnMgdGhlIHNpemUsIGJ5dGUgMSB0aGUgZGVzY3JpcHRvciwgYnl0ZSAyIHRoZSBvZmZzZXQKKyAgICAgKiBmb3IgSUFMT0FEIG9yIElBU1RPUkUsIGJ5dGUgMyB0aGUgb2Zmc2V0IGZvciBhbGwgb3RoZXIgaW5zdHJ1Y3Rpb25zKS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIGludCBvZmY7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbGVuZ3RoIG9mIHRoZSBpbnRlcm5hbCBuYW1lIG9mIHRoaXMgSmF2YSB0eXBlLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgaW50IGxlbjsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIENvbnN0cnVjdG9ycworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIHJlZmVyZW5jZSB0eXBlLgorICAgICAqCisgICAgICogQHBhcmFtIHNvcnQgdGhlIHNvcnQgb2YgdGhlIHJlZmVyZW5jZSB0eXBlIHRvIGJlIGNvbnN0cnVjdGVkLgorICAgICAqIEBwYXJhbSBidWYgYSBidWZmZXIgY29udGFpbmluZyB0aGUgZGVzY3JpcHRvciBvZiB0aGUgcHJldmlvdXMgdHlwZS4KKyAgICAgKiBAcGFyYW0gb2ZmIHRoZSBvZmZzZXQgb2YgdGhpcyBkZXNjcmlwdG9yIGluIHRoZSBwcmV2aW91cyBidWZmZXIuCisgICAgICogQHBhcmFtIGxlbiB0aGUgbGVuZ3RoIG9mIHRoaXMgZGVzY3JpcHRvci4KKyAgICAgKi8KKyAgICBwcml2YXRlIFR5cGUoZmluYWwgaW50IHNvcnQsIGZpbmFsIGNoYXJbXSBidWYsIGZpbmFsIGludCBvZmYsIGZpbmFsIGludCBsZW4pCisgICAgeworICAgICAgICB0aGlzLnNvcnQgPSBzb3J0OworICAgICAgICB0aGlzLmJ1ZiA9IGJ1ZjsKKyAgICAgICAgdGhpcy5vZmYgPSBvZmY7CisgICAgICAgIHRoaXMubGVuID0gbGVuOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIEphdmEgdHlwZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiB0eXBlIGRlc2NyaXB0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZURlc2NyaXB0b3IgYSBmaWVsZCBvciBtZXRob2QgdHlwZSBkZXNjcmlwdG9yLgorICAgICAqIEByZXR1cm4gdGhlIEphdmEgdHlwZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiB0eXBlIGRlc2NyaXB0b3IuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBUeXBlIGdldFR5cGUoZmluYWwgU3RyaW5nIHR5cGVEZXNjcmlwdG9yKSB7CisgICAgICAgIHJldHVybiBnZXRUeXBlKHR5cGVEZXNjcmlwdG9yLnRvQ2hhckFycmF5KCksIDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIEphdmEgdHlwZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBpbnRlcm5hbCBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIGludGVybmFsTmFtZSBhbiBpbnRlcm5hbCBuYW1lLgorICAgICAqIEByZXR1cm4gdGhlIEphdmEgdHlwZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBpbnRlcm5hbCBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgVHlwZSBnZXRPYmplY3RUeXBlKGZpbmFsIFN0cmluZyBpbnRlcm5hbE5hbWUpIHsKKyAgICAgICAgY2hhcltdIGJ1ZiA9IGludGVybmFsTmFtZS50b0NoYXJBcnJheSgpOworICAgICAgICByZXR1cm4gbmV3IFR5cGUoYnVmWzBdID09ICdbJyA/IEFSUkFZIDogT0JKRUNULCBidWYsIDAsIGJ1Zi5sZW5ndGgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIEphdmEgdHlwZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBtZXRob2QgZGVzY3JpcHRvci4KKyAgICAgKiBFcXVpdmFsZW50IHRvIDxjb2RlPlR5cGUuZ2V0VHlwZShtZXRob2REZXNjcmlwdG9yKTwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWV0aG9kRGVzY3JpcHRvciBhIG1ldGhvZCBkZXNjcmlwdG9yLgorICAgICAqIEByZXR1cm4gdGhlIEphdmEgdHlwZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBtZXRob2QgZGVzY3JpcHRvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFR5cGUgZ2V0TWV0aG9kVHlwZShmaW5hbCBTdHJpbmcgbWV0aG9kRGVzY3JpcHRvcikgeworICAgICAgICByZXR1cm4gZ2V0VHlwZShtZXRob2REZXNjcmlwdG9yLnRvQ2hhckFycmF5KCksIDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIEphdmEgbWV0aG9kIHR5cGUgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYXJndW1lbnQgYW5kCisgICAgICogcmV0dXJuIHR5cGVzLgorICAgICAqCisgICAgICogQHBhcmFtIHJldHVyblR5cGUgdGhlIHJldHVybiB0eXBlIG9mIHRoZSBtZXRob2QuCisgICAgICogQHBhcmFtIGFyZ3VtZW50VHlwZXMgdGhlIGFyZ3VtZW50IHR5cGVzIG9mIHRoZSBtZXRob2QuCisgICAgICogQHJldHVybiB0aGUgSmF2YSB0eXBlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGFyZ3VtZW50IGFuZCByZXR1cm4gdHlwZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBUeXBlIGdldE1ldGhvZFR5cGUoZmluYWwgVHlwZSByZXR1cm5UeXBlLCBmaW5hbCBUeXBlLi4uIGFyZ3VtZW50VHlwZXMpIHsKKyAgICAgICAgcmV0dXJuIGdldFR5cGUoZ2V0TWV0aG9kRGVzY3JpcHRvcihyZXR1cm5UeXBlLCBhcmd1bWVudFR5cGVzKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgSmF2YSB0eXBlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGNsYXNzLgorICAgICAqCisgICAgICogQHBhcmFtIGMgYSBjbGFzcy4KKyAgICAgKiBAcmV0dXJuIHRoZSBKYXZhIHR5cGUgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gY2xhc3MuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBUeXBlIGdldFR5cGUoZmluYWwgQ2xhc3M8Pz4gYykgeworICAgICAgICBpZiAoYy5pc1ByaW1pdGl2ZSgpKSB7CisgICAgICAgICAgICBpZiAoYyA9PSBJbnRlZ2VyLlRZUEUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5UX1RZUEU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT0gVm9pZC5UWVBFKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFZPSURfVFlQRTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSBCb29sZWFuLlRZUEUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQk9PTEVBTl9UWVBFOworICAgICAgICAgICAgfSBlbHNlIGlmIChjID09IEJ5dGUuVFlQRSkgeworICAgICAgICAgICAgICAgIHJldHVybiBCWVRFX1RZUEU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT0gQ2hhcmFjdGVyLlRZUEUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ0hBUl9UWVBFOworICAgICAgICAgICAgfSBlbHNlIGlmIChjID09IFNob3J0LlRZUEUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gU0hPUlRfVFlQRTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSBEb3VibGUuVFlQRSkgeworICAgICAgICAgICAgICAgIHJldHVybiBET1VCTEVfVFlQRTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSBGbG9hdC5UWVBFKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZMT0FUX1RZUEU7CisgICAgICAgICAgICB9IGVsc2UgLyogaWYgKGMgPT0gTG9uZy5UWVBFKSAqL3sKKyAgICAgICAgICAgICAgICByZXR1cm4gTE9OR19UWVBFOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGdldFR5cGUoZ2V0RGVzY3JpcHRvcihjKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBKYXZhIG1ldGhvZCB0eXBlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGNvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIGMgYSB7QGxpbmsgQ29uc3RydWN0b3IgQ29uc3RydWN0b3J9IG9iamVjdC4KKyAgICAgKiBAcmV0dXJuIHRoZSBKYXZhIG1ldGhvZCB0eXBlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGNvbnN0cnVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgVHlwZSBnZXRUeXBlKGZpbmFsIENvbnN0cnVjdG9yPD8+IGMpIHsKKyAgICAgICAgcmV0dXJuIGdldFR5cGUoZ2V0Q29uc3RydWN0b3JEZXNjcmlwdG9yKGMpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBKYXZhIG1ldGhvZCB0eXBlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIG1ldGhvZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtIGEge0BsaW5rIE1ldGhvZCBNZXRob2R9IG9iamVjdC4KKyAgICAgKiBAcmV0dXJuIHRoZSBKYXZhIG1ldGhvZCB0eXBlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIG1ldGhvZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFR5cGUgZ2V0VHlwZShmaW5hbCBNZXRob2QgbSkgeworICAgICAgICByZXR1cm4gZ2V0VHlwZShnZXRNZXRob2REZXNjcmlwdG9yKG0pKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBKYXZhIHR5cGVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGFyZ3VtZW50IHR5cGVzIG9mIHRoZSBnaXZlbgorICAgICAqIG1ldGhvZCBkZXNjcmlwdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIG1ldGhvZERlc2NyaXB0b3IgYSBtZXRob2QgZGVzY3JpcHRvci4KKyAgICAgKiBAcmV0dXJuIHRoZSBKYXZhIHR5cGVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGFyZ3VtZW50IHR5cGVzIG9mIHRoZSBnaXZlbgorICAgICAqICAgICAgICAgbWV0aG9kIGRlc2NyaXB0b3IuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBUeXBlW10gZ2V0QXJndW1lbnRUeXBlcyhmaW5hbCBTdHJpbmcgbWV0aG9kRGVzY3JpcHRvcikgeworICAgICAgICBjaGFyW10gYnVmID0gbWV0aG9kRGVzY3JpcHRvci50b0NoYXJBcnJheSgpOworICAgICAgICBpbnQgb2ZmID0gMTsKKyAgICAgICAgaW50IHNpemUgPSAwOworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgY2hhciBjYXIgPSBidWZbb2ZmKytdOworICAgICAgICAgICAgaWYgKGNhciA9PSAnKScpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY2FyID09ICdMJykgeworICAgICAgICAgICAgICAgIHdoaWxlIChidWZbb2ZmKytdICE9ICc7JykgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICArK3NpemU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNhciAhPSAnWycpIHsKKyAgICAgICAgICAgICAgICArK3NpemU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgVHlwZVtdIGFyZ3MgPSBuZXcgVHlwZVtzaXplXTsKKyAgICAgICAgb2ZmID0gMTsKKyAgICAgICAgc2l6ZSA9IDA7CisgICAgICAgIHdoaWxlIChidWZbb2ZmXSAhPSAnKScpIHsKKyAgICAgICAgICAgIGFyZ3Nbc2l6ZV0gPSBnZXRUeXBlKGJ1Ziwgb2ZmKTsKKyAgICAgICAgICAgIG9mZiArPSBhcmdzW3NpemVdLmxlbiArIChhcmdzW3NpemVdLnNvcnQgPT0gT0JKRUNUID8gMiA6IDApOworICAgICAgICAgICAgc2l6ZSArPSAxOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhcmdzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIEphdmEgdHlwZXMgY29ycmVzcG9uZGluZyB0byB0aGUgYXJndW1lbnQgdHlwZXMgb2YgdGhlIGdpdmVuCisgICAgICogbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtIG1ldGhvZCBhIG1ldGhvZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBKYXZhIHR5cGVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGFyZ3VtZW50IHR5cGVzIG9mIHRoZSBnaXZlbgorICAgICAqICAgICAgICAgbWV0aG9kLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgVHlwZVtdIGdldEFyZ3VtZW50VHlwZXMoZmluYWwgTWV0aG9kIG1ldGhvZCkgeworICAgICAgICBDbGFzczw/PltdIGNsYXNzZXMgPSBtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKKyAgICAgICAgVHlwZVtdIHR5cGVzID0gbmV3IFR5cGVbY2xhc3Nlcy5sZW5ndGhdOworICAgICAgICBmb3IgKGludCBpID0gY2xhc3Nlcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkgeworICAgICAgICAgICAgdHlwZXNbaV0gPSBnZXRUeXBlKGNsYXNzZXNbaV0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0eXBlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBKYXZhIHR5cGUgY29ycmVzcG9uZGluZyB0byB0aGUgcmV0dXJuIHR5cGUgb2YgdGhlIGdpdmVuCisgICAgICogbWV0aG9kIGRlc2NyaXB0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWV0aG9kRGVzY3JpcHRvciBhIG1ldGhvZCBkZXNjcmlwdG9yLgorICAgICAqIEByZXR1cm4gdGhlIEphdmEgdHlwZSBjb3JyZXNwb25kaW5nIHRvIHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgZ2l2ZW4KKyAgICAgKiAgICAgICAgIG1ldGhvZCBkZXNjcmlwdG9yLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgVHlwZSBnZXRSZXR1cm5UeXBlKGZpbmFsIFN0cmluZyBtZXRob2REZXNjcmlwdG9yKSB7CisgICAgICAgIGNoYXJbXSBidWYgPSBtZXRob2REZXNjcmlwdG9yLnRvQ2hhckFycmF5KCk7CisgICAgICAgIHJldHVybiBnZXRUeXBlKGJ1ZiwgbWV0aG9kRGVzY3JpcHRvci5pbmRleE9mKCcpJykgKyAxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBKYXZhIHR5cGUgY29ycmVzcG9uZGluZyB0byB0aGUgcmV0dXJuIHR5cGUgb2YgdGhlIGdpdmVuCisgICAgICogbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtIG1ldGhvZCBhIG1ldGhvZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBKYXZhIHR5cGUgY29ycmVzcG9uZGluZyB0byB0aGUgcmV0dXJuIHR5cGUgb2YgdGhlIGdpdmVuCisgICAgICogICAgICAgICBtZXRob2QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBUeXBlIGdldFJldHVyblR5cGUoZmluYWwgTWV0aG9kIG1ldGhvZCkgeworICAgICAgICByZXR1cm4gZ2V0VHlwZShtZXRob2QuZ2V0UmV0dXJuVHlwZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21wdXRlcyB0aGUgc2l6ZSBvZiB0aGUgYXJndW1lbnRzIGFuZCBvZiB0aGUgcmV0dXJuIHZhbHVlIG9mIGEgbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtIGRlc2MgdGhlIGRlc2NyaXB0b3Igb2YgYSBtZXRob2QuCisgICAgICogQHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgYXJndW1lbnRzIG9mIHRoZSBtZXRob2QgKHBsdXMgb25lIGZvciB0aGUKKyAgICAgKiAgICAgICAgIGltcGxpY2l0IHRoaXMgYXJndW1lbnQpLCBhcmdTaXplLCBhbmQgdGhlIHNpemUgb2YgaXRzIHJldHVybgorICAgICAqICAgICAgICAgdmFsdWUsIHJldFNpemUsIHBhY2tlZCBpbnRvIGEgc2luZ2xlIGludCBpID0KKyAgICAgKiAgICAgICAgIDx0dD4oYXJnU2l6ZSA8PCAyKSB8IHJldFNpemU8L3R0PiAoYXJnU2l6ZSBpcyB0aGVyZWZvcmUgZXF1YWwKKyAgICAgKiAgICAgICAgIHRvIDx0dD5pID4+IDI8L3R0PiwgYW5kIHJldFNpemUgdG8gPHR0PmkgJiAweDAzPC90dD4pLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldEFyZ3VtZW50c0FuZFJldHVyblNpemVzKGZpbmFsIFN0cmluZyBkZXNjKSB7CisgICAgICAgIGludCBuID0gMTsKKyAgICAgICAgaW50IGMgPSAxOworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgY2hhciBjYXIgPSBkZXNjLmNoYXJBdChjKyspOworICAgICAgICAgICAgaWYgKGNhciA9PSAnKScpIHsKKyAgICAgICAgICAgICAgICBjYXIgPSBkZXNjLmNoYXJBdChjKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbiA8PCAyCisgICAgICAgICAgICAgICAgICAgICAgICB8IChjYXIgPT0gJ1YnID8gMCA6IChjYXIgPT0gJ0QnIHx8IGNhciA9PSAnSicgPyAyIDogMSkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChjYXIgPT0gJ0wnKSB7CisgICAgICAgICAgICAgICAgd2hpbGUgKGRlc2MuY2hhckF0KGMrKykgIT0gJzsnKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG4gKz0gMTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY2FyID09ICdbJykgeworICAgICAgICAgICAgICAgIHdoaWxlICgoY2FyID0gZGVzYy5jaGFyQXQoYykpID09ICdbJykgeworICAgICAgICAgICAgICAgICAgICArK2M7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjYXIgPT0gJ0QnIHx8IGNhciA9PSAnSicpIHsKKyAgICAgICAgICAgICAgICAgICAgbiAtPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY2FyID09ICdEJyB8fCBjYXIgPT0gJ0onKSB7CisgICAgICAgICAgICAgICAgbiArPSAyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBuICs9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBKYXZhIHR5cGUgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gdHlwZSBkZXNjcmlwdG9yLiBGb3IKKyAgICAgKiBtZXRob2QgZGVzY3JpcHRvcnMsIGJ1ZiBpcyBzdXBwb3NlZCB0byBjb250YWluIG5vdGhpbmcgbW9yZSB0aGFuIHRoZQorICAgICAqIGRlc2NyaXB0b3IgaXRzZWxmLgorICAgICAqCisgICAgICogQHBhcmFtIGJ1ZiBhIGJ1ZmZlciBjb250YWluaW5nIGEgdHlwZSBkZXNjcmlwdG9yLgorICAgICAqIEBwYXJhbSBvZmYgdGhlIG9mZnNldCBvZiB0aGlzIGRlc2NyaXB0b3IgaW4gdGhlIHByZXZpb3VzIGJ1ZmZlci4KKyAgICAgKiBAcmV0dXJuIHRoZSBKYXZhIHR5cGUgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gdHlwZSBkZXNjcmlwdG9yLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFR5cGUgZ2V0VHlwZShmaW5hbCBjaGFyW10gYnVmLCBmaW5hbCBpbnQgb2ZmKSB7CisgICAgICAgIGludCBsZW47CisgICAgICAgIHN3aXRjaCAoYnVmW29mZl0pIHsKKyAgICAgICAgICAgIGNhc2UgJ1YnOgorICAgICAgICAgICAgICAgIHJldHVybiBWT0lEX1RZUEU7CisgICAgICAgICAgICBjYXNlICdaJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gQk9PTEVBTl9UWVBFOworICAgICAgICAgICAgY2FzZSAnQyc6CisgICAgICAgICAgICAgICAgcmV0dXJuIENIQVJfVFlQRTsKKyAgICAgICAgICAgIGNhc2UgJ0InOgorICAgICAgICAgICAgICAgIHJldHVybiBCWVRFX1RZUEU7CisgICAgICAgICAgICBjYXNlICdTJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gU0hPUlRfVFlQRTsKKyAgICAgICAgICAgIGNhc2UgJ0knOgorICAgICAgICAgICAgICAgIHJldHVybiBJTlRfVFlQRTsKKyAgICAgICAgICAgIGNhc2UgJ0YnOgorICAgICAgICAgICAgICAgIHJldHVybiBGTE9BVF9UWVBFOworICAgICAgICAgICAgY2FzZSAnSic6CisgICAgICAgICAgICAgICAgcmV0dXJuIExPTkdfVFlQRTsKKyAgICAgICAgICAgIGNhc2UgJ0QnOgorICAgICAgICAgICAgICAgIHJldHVybiBET1VCTEVfVFlQRTsKKyAgICAgICAgICAgIGNhc2UgJ1snOgorICAgICAgICAgICAgICAgIGxlbiA9IDE7CisgICAgICAgICAgICAgICAgd2hpbGUgKGJ1ZltvZmYgKyBsZW5dID09ICdbJykgeworICAgICAgICAgICAgICAgICAgICArK2xlbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGJ1ZltvZmYgKyBsZW5dID09ICdMJykgeworICAgICAgICAgICAgICAgICAgICArK2xlbjsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGJ1ZltvZmYgKyBsZW5dICE9ICc7JykgeworICAgICAgICAgICAgICAgICAgICAgICAgKytsZW47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUeXBlKEFSUkFZLCBidWYsIG9mZiwgbGVuICsgMSk7CisgICAgICAgICAgICBjYXNlICdMJzoKKyAgICAgICAgICAgICAgICBsZW4gPSAxOworICAgICAgICAgICAgICAgIHdoaWxlIChidWZbb2ZmICsgbGVuXSAhPSAnOycpIHsKKyAgICAgICAgICAgICAgICAgICAgKytsZW47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVHlwZShPQkpFQ1QsIGJ1Ziwgb2ZmICsgMSwgbGVuIC0gMSk7CisgICAgICAgICAgICAvLyBjYXNlICcoJzoKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUeXBlKE1FVEhPRCwgYnVmLCAwLCBidWYubGVuZ3RoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIEFjY2Vzc29ycworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc29ydCBvZiB0aGlzIEphdmEgdHlwZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4ge0BsaW5rICNWT0lEIFZPSUR9LCB7QGxpbmsgI0JPT0xFQU4gQk9PTEVBTn0sCisgICAgICogICAgICAgICB7QGxpbmsgI0NIQVIgQ0hBUn0sIHtAbGluayAjQllURSBCWVRFfSwge0BsaW5rICNTSE9SVCBTSE9SVH0sCisgICAgICogICAgICAgICB7QGxpbmsgI0lOVCBJTlR9LCB7QGxpbmsgI0ZMT0FUIEZMT0FUfSwge0BsaW5rICNMT05HIExPTkd9LAorICAgICAqICAgICAgICAge0BsaW5rICNET1VCTEUgRE9VQkxFfSwge0BsaW5rICNBUlJBWSBBUlJBWX0sCisgICAgICogICAgICAgICB7QGxpbmsgI09CSkVDVCBPQkpFQ1R9IG9yIHtAbGluayAjTUVUSE9EIE1FVEhPRH0uCisgICAgICovCisgICAgcHVibGljIGludCBnZXRTb3J0KCkgeworICAgICAgICByZXR1cm4gc29ydDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZGltZW5zaW9ucyBvZiB0aGlzIGFycmF5IHR5cGUuIFRoaXMgbWV0aG9kIHNob3VsZAorICAgICAqIG9ubHkgYmUgdXNlZCBmb3IgYW4gYXJyYXkgdHlwZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBkaW1lbnNpb25zIG9mIHRoaXMgYXJyYXkgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldERpbWVuc2lvbnMoKSB7CisgICAgICAgIGludCBpID0gMTsKKyAgICAgICAgd2hpbGUgKGJ1ZltvZmYgKyBpXSA9PSAnWycpIHsKKyAgICAgICAgICAgICsraTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSBlbGVtZW50cyBvZiB0aGlzIGFycmF5IHR5cGUuIFRoaXMgbWV0aG9kIHNob3VsZAorICAgICAqIG9ubHkgYmUgdXNlZCBmb3IgYW4gYXJyYXkgdHlwZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgZWxlbWVudHMgb2YgdGhpcyBhcnJheSB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBUeXBlIGdldEVsZW1lbnRUeXBlKCkgeworICAgICAgICByZXR1cm4gZ2V0VHlwZShidWYsIG9mZiArIGdldERpbWVuc2lvbnMoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYmluYXJ5IG5hbWUgb2YgdGhlIGNsYXNzIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyB0eXBlLiBUaGlzCisgICAgICogbWV0aG9kIG11c3Qgbm90IGJlIHVzZWQgb24gbWV0aG9kIHR5cGVzLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgYmluYXJ5IG5hbWUgb2YgdGhlIGNsYXNzIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgeworICAgICAgICBzd2l0Y2ggKHNvcnQpIHsKKyAgICAgICAgICAgIGNhc2UgVk9JRDoKKyAgICAgICAgICAgICAgICByZXR1cm4gInZvaWQiOworICAgICAgICAgICAgY2FzZSBCT09MRUFOOgorICAgICAgICAgICAgICAgIHJldHVybiAiYm9vbGVhbiI7CisgICAgICAgICAgICBjYXNlIENIQVI6CisgICAgICAgICAgICAgICAgcmV0dXJuICJjaGFyIjsKKyAgICAgICAgICAgIGNhc2UgQllURToKKyAgICAgICAgICAgICAgICByZXR1cm4gImJ5dGUiOworICAgICAgICAgICAgY2FzZSBTSE9SVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gInNob3J0IjsKKyAgICAgICAgICAgIGNhc2UgSU5UOgorICAgICAgICAgICAgICAgIHJldHVybiAiaW50IjsKKyAgICAgICAgICAgIGNhc2UgRkxPQVQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICJmbG9hdCI7CisgICAgICAgICAgICBjYXNlIExPTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuICJsb25nIjsKKyAgICAgICAgICAgIGNhc2UgRE9VQkxFOgorICAgICAgICAgICAgICAgIHJldHVybiAiZG91YmxlIjsKKyAgICAgICAgICAgIGNhc2UgQVJSQVk6CisgICAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGIgPSBuZXcgU3RyaW5nQnVmZmVyKGdldEVsZW1lbnRUeXBlKCkuZ2V0Q2xhc3NOYW1lKCkpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBnZXREaW1lbnNpb25zKCk7IGkgPiAwOyAtLWkpIHsKKyAgICAgICAgICAgICAgICAgICAgYi5hcHBlbmQoIltdIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBiLnRvU3RyaW5nKCk7CisgICAgICAgICAgICBjYXNlIE9CSkVDVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhidWYsIG9mZiwgbGVuKS5yZXBsYWNlKCcvJywgJy4nKTsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBpbnRlcm5hbCBuYW1lIG9mIHRoZSBjbGFzcyBjb3JyZXNwb25kaW5nIHRvIHRoaXMgb2JqZWN0IG9yCisgICAgICogYXJyYXkgdHlwZS4gVGhlIGludGVybmFsIG5hbWUgb2YgYSBjbGFzcyBpcyBpdHMgZnVsbHkgcXVhbGlmaWVkIG5hbWUgKGFzCisgICAgICogcmV0dXJuZWQgYnkgQ2xhc3MuZ2V0TmFtZSgpLCB3aGVyZSAnLicgYXJlIHJlcGxhY2VkIGJ5ICcvJy4gVGhpcyBtZXRob2QKKyAgICAgKiBzaG91bGQgb25seSBiZSB1c2VkIGZvciBhbiBvYmplY3Qgb3IgYXJyYXkgdHlwZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGludGVybmFsIG5hbWUgb2YgdGhlIGNsYXNzIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBvYmplY3QgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEludGVybmFsTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoYnVmLCBvZmYsIGxlbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYXJndW1lbnQgdHlwZXMgb2YgbWV0aG9kcyBvZiB0aGlzIHR5cGUuIFRoaXMgbWV0aG9kIHNob3VsZAorICAgICAqIG9ubHkgYmUgdXNlZCBmb3IgbWV0aG9kIHR5cGVzLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgYXJndW1lbnQgdHlwZXMgb2YgbWV0aG9kcyBvZiB0aGlzIHR5cGUuCisgICAgICovCisgICAgcHVibGljIFR5cGVbXSBnZXRBcmd1bWVudFR5cGVzKCkgeworICAgICAgICByZXR1cm4gZ2V0QXJndW1lbnRUeXBlcyhnZXREZXNjcmlwdG9yKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHJldHVybiB0eXBlIG9mIG1ldGhvZHMgb2YgdGhpcyB0eXBlLiBUaGlzIG1ldGhvZCBzaG91bGQgb25seQorICAgICAqIGJlIHVzZWQgZm9yIG1ldGhvZCB0eXBlcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHJldHVybiB0eXBlIG9mIG1ldGhvZHMgb2YgdGhpcyB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBUeXBlIGdldFJldHVyblR5cGUoKSB7CisgICAgICAgIHJldHVybiBnZXRSZXR1cm5UeXBlKGdldERlc2NyaXB0b3IoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgYXJndW1lbnRzIGFuZCBvZiB0aGUgcmV0dXJuIHZhbHVlIG9mIG1ldGhvZHMgb2YKKyAgICAgKiB0aGlzIHR5cGUuIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIG1ldGhvZCB0eXBlcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHNpemUgb2YgdGhlIGFyZ3VtZW50cyAocGx1cyBvbmUgZm9yIHRoZSBpbXBsaWNpdCB0aGlzCisgICAgICogICAgICAgICBhcmd1bWVudCksIGFyZ1NpemUsIGFuZCB0aGUgc2l6ZSBvZiB0aGUgcmV0dXJuIHZhbHVlLCByZXRTaXplLAorICAgICAqICAgICAgICAgcGFja2VkIGludG8gYSBzaW5nbGUgaW50IGkgPSA8dHQ+KGFyZ1NpemUgPDwgMikgfCByZXRTaXplPC90dD4KKyAgICAgKiAgICAgICAgIChhcmdTaXplIGlzIHRoZXJlZm9yZSBlcXVhbCB0byA8dHQ+aSA+PiAyPC90dD4sIGFuZCByZXRTaXplIHRvCisgICAgICogICAgICAgICA8dHQ+aSAmIDB4MDM8L3R0PikuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRBcmd1bWVudHNBbmRSZXR1cm5TaXplcygpIHsKKyAgICAgICAgcmV0dXJuIGdldEFyZ3VtZW50c0FuZFJldHVyblNpemVzKGdldERlc2NyaXB0b3IoKSk7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gQ29udmVyc2lvbiB0byB0eXBlIGRlc2NyaXB0b3JzCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBkZXNjcmlwdG9yIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBKYXZhIHR5cGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBkZXNjcmlwdG9yIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBKYXZhIHR5cGUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdG9yKCkgeworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBnZXREZXNjcmlwdG9yKGJ1Zik7CisgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBkZXNjcmlwdG9yIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGFyZ3VtZW50IGFuZCByZXR1cm4KKyAgICAgKiB0eXBlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXR1cm5UeXBlIHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgbWV0aG9kLgorICAgICAqIEBwYXJhbSBhcmd1bWVudFR5cGVzIHRoZSBhcmd1bWVudCB0eXBlcyBvZiB0aGUgbWV0aG9kLgorICAgICAqIEByZXR1cm4gdGhlIGRlc2NyaXB0b3IgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYXJndW1lbnQgYW5kIHJldHVybgorICAgICAqICAgICAgICAgdHlwZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWV0aG9kRGVzY3JpcHRvcigKKyAgICAgICAgZmluYWwgVHlwZSByZXR1cm5UeXBlLAorICAgICAgICBmaW5hbCBUeXBlLi4uIGFyZ3VtZW50VHlwZXMpCisgICAgeworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBidWYuYXBwZW5kKCcoJyk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJndW1lbnRUeXBlcy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgYXJndW1lbnRUeXBlc1tpXS5nZXREZXNjcmlwdG9yKGJ1Zik7CisgICAgICAgIH0KKyAgICAgICAgYnVmLmFwcGVuZCgnKScpOworICAgICAgICByZXR1cm5UeXBlLmdldERlc2NyaXB0b3IoYnVmKTsKKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFwcGVuZHMgdGhlIGRlc2NyaXB0b3IgY29ycmVzcG9uZGluZyB0byB0aGlzIEphdmEgdHlwZSB0byB0aGUgZ2l2ZW4KKyAgICAgKiBzdHJpbmcgYnVmZmVyLgorICAgICAqCisgICAgICogQHBhcmFtIGJ1ZiB0aGUgc3RyaW5nIGJ1ZmZlciB0byB3aGljaCB0aGUgZGVzY3JpcHRvciBtdXN0IGJlIGFwcGVuZGVkLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBnZXREZXNjcmlwdG9yKGZpbmFsIFN0cmluZ0J1ZmZlciBidWYpIHsKKyAgICAgICAgaWYgKHRoaXMuYnVmID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIGRlc2NyaXB0b3IgaXMgaW4gYnl0ZSAzIG9mICdvZmYnIGZvciBwcmltaXRpdmUgdHlwZXMgKGJ1ZiA9PSBudWxsKQorICAgICAgICAgICAgYnVmLmFwcGVuZCgoY2hhcikgKChvZmYgJiAweEZGMDAwMDAwKSA+Pj4gMjQpKTsKKyAgICAgICAgfSBlbHNlIGlmIChzb3J0ID09IE9CSkVDVCkgeworICAgICAgICAgICAgYnVmLmFwcGVuZCgnTCcpOworICAgICAgICAgICAgYnVmLmFwcGVuZCh0aGlzLmJ1Ziwgb2ZmLCBsZW4pOworICAgICAgICAgICAgYnVmLmFwcGVuZCgnOycpOworICAgICAgICB9IGVsc2UgeyAvLyBzb3J0ID09IEFSUkFZIHx8IHNvcnQgPT0gTUVUSE9ECisgICAgICAgICAgICBidWYuYXBwZW5kKHRoaXMuYnVmLCBvZmYsIGxlbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBEaXJlY3QgY29udmVyc2lvbiBmcm9tIGNsYXNzZXMgdG8gdHlwZSBkZXNjcmlwdG9ycywKKyAgICAvLyB3aXRob3V0IGludGVybWVkaWF0ZSBUeXBlIG9iamVjdHMKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGludGVybmFsIG5hbWUgb2YgdGhlIGdpdmVuIGNsYXNzLiBUaGUgaW50ZXJuYWwgbmFtZSBvZiBhCisgICAgICogY2xhc3MgaXMgaXRzIGZ1bGx5IHF1YWxpZmllZCBuYW1lLCBhcyByZXR1cm5lZCBieSBDbGFzcy5nZXROYW1lKCksIHdoZXJlCisgICAgICogJy4nIGFyZSByZXBsYWNlZCBieSAnLycuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYyBhbiBvYmplY3Qgb3IgYXJyYXkgY2xhc3MuCisgICAgICogQHJldHVybiB0aGUgaW50ZXJuYWwgbmFtZSBvZiB0aGUgZ2l2ZW4gY2xhc3MuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SW50ZXJuYWxOYW1lKGZpbmFsIENsYXNzPD8+IGMpIHsKKyAgICAgICAgcmV0dXJuIGMuZ2V0TmFtZSgpLnJlcGxhY2UoJy4nLCAnLycpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGRlc2NyaXB0b3IgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gSmF2YSB0eXBlLgorICAgICAqCisgICAgICogQHBhcmFtIGMgYW4gb2JqZWN0IGNsYXNzLCBhIHByaW1pdGl2ZSBjbGFzcyBvciBhbiBhcnJheSBjbGFzcy4KKyAgICAgKiBAcmV0dXJuIHRoZSBkZXNjcmlwdG9yIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGNsYXNzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlc2NyaXB0b3IoZmluYWwgQ2xhc3M8Pz4gYykgeworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBnZXREZXNjcmlwdG9yKGJ1ZiwgYyk7CisgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBkZXNjcmlwdG9yIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGNvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIGMgYSB7QGxpbmsgQ29uc3RydWN0b3IgQ29uc3RydWN0b3J9IG9iamVjdC4KKyAgICAgKiBAcmV0dXJuIHRoZSBkZXNjcmlwdG9yIG9mIHRoZSBnaXZlbiBjb25zdHJ1Y3Rvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDb25zdHJ1Y3RvckRlc2NyaXB0b3IoZmluYWwgQ29uc3RydWN0b3I8Pz4gYykgeworICAgICAgICBDbGFzczw/PltdIHBhcmFtZXRlcnMgPSBjLmdldFBhcmFtZXRlclR5cGVzKCk7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGJ1Zi5hcHBlbmQoJygnKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBnZXREZXNjcmlwdG9yKGJ1ZiwgcGFyYW1ldGVyc1tpXSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1Zi5hcHBlbmQoIilWIikudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBkZXNjcmlwdG9yIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIG1ldGhvZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtIGEge0BsaW5rIE1ldGhvZCBNZXRob2R9IG9iamVjdC4KKyAgICAgKiBAcmV0dXJuIHRoZSBkZXNjcmlwdG9yIG9mIHRoZSBnaXZlbiBtZXRob2QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWV0aG9kRGVzY3JpcHRvcihmaW5hbCBNZXRob2QgbSkgeworICAgICAgICBDbGFzczw/PltdIHBhcmFtZXRlcnMgPSBtLmdldFBhcmFtZXRlclR5cGVzKCk7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGJ1Zi5hcHBlbmQoJygnKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBnZXREZXNjcmlwdG9yKGJ1ZiwgcGFyYW1ldGVyc1tpXSk7CisgICAgICAgIH0KKyAgICAgICAgYnVmLmFwcGVuZCgnKScpOworICAgICAgICBnZXREZXNjcmlwdG9yKGJ1ZiwgbS5nZXRSZXR1cm5UeXBlKCkpOworICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXBwZW5kcyB0aGUgZGVzY3JpcHRvciBvZiB0aGUgZ2l2ZW4gY2xhc3MgdG8gdGhlIGdpdmVuIHN0cmluZyBidWZmZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYnVmIHRoZSBzdHJpbmcgYnVmZmVyIHRvIHdoaWNoIHRoZSBkZXNjcmlwdG9yIG11c3QgYmUgYXBwZW5kZWQuCisgICAgICogQHBhcmFtIGMgdGhlIGNsYXNzIHdob3NlIGRlc2NyaXB0b3IgbXVzdCBiZSBjb21wdXRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGdldERlc2NyaXB0b3IoZmluYWwgU3RyaW5nQnVmZmVyIGJ1ZiwgZmluYWwgQ2xhc3M8Pz4gYykgeworICAgICAgICBDbGFzczw/PiBkID0gYzsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGlmIChkLmlzUHJpbWl0aXZlKCkpIHsKKyAgICAgICAgICAgICAgICBjaGFyIGNhcjsKKyAgICAgICAgICAgICAgICBpZiAoZCA9PSBJbnRlZ2VyLlRZUEUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FyID0gJ0knOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZCA9PSBWb2lkLlRZUEUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FyID0gJ1YnOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZCA9PSBCb29sZWFuLlRZUEUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FyID0gJ1onOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZCA9PSBCeXRlLlRZUEUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FyID0gJ0InOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZCA9PSBDaGFyYWN0ZXIuVFlQRSkgeworICAgICAgICAgICAgICAgICAgICBjYXIgPSAnQyc7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkID09IFNob3J0LlRZUEUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FyID0gJ1MnOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZCA9PSBEb3VibGUuVFlQRSkgeworICAgICAgICAgICAgICAgICAgICBjYXIgPSAnRCc7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkID09IEZsb2F0LlRZUEUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FyID0gJ0YnOworICAgICAgICAgICAgICAgIH0gZWxzZSAvKiBpZiAoZCA9PSBMb25nLlRZUEUpICoveworICAgICAgICAgICAgICAgICAgICBjYXIgPSAnSic7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoY2FyKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9IGVsc2UgaWYgKGQuaXNBcnJheSgpKSB7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgnWycpOworICAgICAgICAgICAgICAgIGQgPSBkLmdldENvbXBvbmVudFR5cGUoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgnTCcpOworICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gZC5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgaW50IGxlbiA9IG5hbWUubGVuZ3RoKCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47ICsraSkgeworICAgICAgICAgICAgICAgICAgICBjaGFyIGNhciA9IG5hbWUuY2hhckF0KGkpOworICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKGNhciA9PSAnLicgPyAnLycgOiBjYXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCc7Jyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gQ29ycmVzcG9uZGluZyBzaXplIGFuZCBvcGNvZGVzCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzaXplIG9mIHZhbHVlcyBvZiB0aGlzIHR5cGUuIFRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIHVzZWQgZm9yCisgICAgICogbWV0aG9kIHR5cGVzLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgc2l6ZSBvZiB2YWx1ZXMgb2YgdGhpcyB0eXBlLCBpLmUuLCAyIGZvciA8dHQ+bG9uZzwvdHQ+IGFuZAorICAgICAqICAgICAgICAgPHR0PmRvdWJsZTwvdHQ+LCAwIGZvciA8dHQ+dm9pZDwvdHQ+IGFuZCAxIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFNpemUoKSB7CisgICAgICAgIC8vIHRoZSBzaXplIGlzIGluIGJ5dGUgMCBvZiAnb2ZmJyBmb3IgcHJpbWl0aXZlIHR5cGVzIChidWYgPT0gbnVsbCkKKyAgICAgICAgcmV0dXJuIGJ1ZiA9PSBudWxsID8gKG9mZiAmIDB4RkYpIDogMTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgSlZNIGluc3RydWN0aW9uIG9wY29kZSBhZGFwdGVkIHRvIHRoaXMgSmF2YSB0eXBlLiBUaGlzIG1ldGhvZAorICAgICAqIG11c3Qgbm90IGJlIHVzZWQgZm9yIG1ldGhvZCB0eXBlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvcGNvZGUgYSBKVk0gaW5zdHJ1Y3Rpb24gb3Bjb2RlLiBUaGlzIG9wY29kZSBtdXN0IGJlIG9uZSBvZiBJTE9BRCwKKyAgICAgKiAgICAgICAgSVNUT1JFLCBJQUxPQUQsIElBU1RPUkUsIElBREQsIElTVUIsIElNVUwsIElESVYsIElSRU0sIElORUcsIElTSEwsCisgICAgICogICAgICAgIElTSFIsIElVU0hSLCBJQU5ELCBJT1IsIElYT1IgYW5kIElSRVRVUk4uCisgICAgICogQHJldHVybiBhbiBvcGNvZGUgdGhhdCBpcyBzaW1pbGFyIHRvIHRoZSBnaXZlbiBvcGNvZGUsIGJ1dCBhZGFwdGVkIHRvCisgICAgICogICAgICAgICB0aGlzIEphdmEgdHlwZS4gRm9yIGV4YW1wbGUsIGlmIHRoaXMgdHlwZSBpcyA8dHQ+ZmxvYXQ8L3R0PiBhbmQKKyAgICAgKiAgICAgICAgIDx0dD5vcGNvZGU8L3R0PiBpcyBJUkVUVVJOLCB0aGlzIG1ldGhvZCByZXR1cm5zIEZSRVRVUk4uCisgICAgICovCisgICAgcHVibGljIGludCBnZXRPcGNvZGUoZmluYWwgaW50IG9wY29kZSkgeworICAgICAgICBpZiAob3Bjb2RlID09IE9wY29kZXMuSUFMT0FEIHx8IG9wY29kZSA9PSBPcGNvZGVzLklBU1RPUkUpIHsKKyAgICAgICAgICAgIC8vIHRoZSBvZmZzZXQgZm9yIElBTE9BRCBvciBJQVNUT1JFIGlzIGluIGJ5dGUgMSBvZiAnb2ZmJyBmb3IKKyAgICAgICAgICAgIC8vIHByaW1pdGl2ZSB0eXBlcyAoYnVmID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gb3Bjb2RlICsgKGJ1ZiA9PSBudWxsID8gKG9mZiAmIDB4RkYwMCkgPj4gOCA6IDQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gdGhlIG9mZnNldCBmb3Igb3RoZXIgaW5zdHJ1Y3Rpb25zIGlzIGluIGJ5dGUgMiBvZiAnb2ZmJyBmb3IKKyAgICAgICAgICAgIC8vIHByaW1pdGl2ZSB0eXBlcyAoYnVmID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gb3Bjb2RlICsgKGJ1ZiA9PSBudWxsID8gKG9mZiAmIDB4RkYwMDAwKSA+PiAxNiA6IDQpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gRXF1YWxzLCBoYXNoQ29kZSBhbmQgdG9TdHJpbmcKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8qKgorICAgICAqIFRlc3RzIGlmIHRoZSBnaXZlbiBvYmplY3QgaXMgZXF1YWwgdG8gdGhpcyB0eXBlLgorICAgICAqCisgICAgICogQHBhcmFtIG8gdGhlIG9iamVjdCB0byBiZSBjb21wYXJlZCB0byB0aGlzIHR5cGUuCisgICAgICogQHJldHVybiA8dHQ+dHJ1ZTwvdHQ+IGlmIHRoZSBnaXZlbiBvYmplY3QgaXMgZXF1YWwgdG8gdGhpcyB0eXBlLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhmaW5hbCBPYmplY3QgbykgeworICAgICAgICBpZiAodGhpcyA9PSBvKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgVHlwZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBUeXBlIHQgPSAoVHlwZSkgbzsKKyAgICAgICAgaWYgKHNvcnQgIT0gdC5zb3J0KSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNvcnQgPj0gQVJSQVkpIHsKKyAgICAgICAgICAgIGlmIChsZW4gIT0gdC5sZW4pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGludCBpID0gb2ZmLCBqID0gdC5vZmYsIGVuZCA9IGkgKyBsZW47IGkgPCBlbmQ7IGkrKywgaisrKSB7CisgICAgICAgICAgICAgICAgaWYgKGJ1ZltpXSAhPSB0LmJ1ZltqXSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBoYXNoIGNvZGUgdmFsdWUgZm9yIHRoaXMgdHlwZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBoYXNoIGNvZGUgdmFsdWUgZm9yIHRoaXMgdHlwZS4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgaGMgPSAxMyAqIHNvcnQ7CisgICAgICAgIGlmIChzb3J0ID49IEFSUkFZKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gb2ZmLCBlbmQgPSBpICsgbGVuOyBpIDwgZW5kOyBpKyspIHsKKyAgICAgICAgICAgICAgICBoYyA9IDE3ICogKGhjICsgYnVmW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaGM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHR5cGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBkZXNjcmlwdG9yIG9mIHRoaXMgdHlwZS4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gZ2V0RGVzY3JpcHRvcigpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vY29tbW9ucy9BZHZpY2VBZGFwdGVyLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL2NvbW1vbnMvQWR2aWNlQWRhcHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkNmYyNjAKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL2NvbW1vbnMvQWR2aWNlQWRhcHRlci5qYXZhCkBAIC0wLDAgKzEsNjk0IEBACisvKgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBPcmFjbGUgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKKyAqIHF1ZXN0aW9ucy4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGlzIGF2YWlsYWJsZSB1bmRlciBhbmQgZ292ZXJuZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiBIb3dldmVyLCB0aGUgZm9sbG93aW5nIG5vdGljZSBhY2NvbXBhbmllZCB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGlzCisgKiBmaWxlOgorICoKKyAqIEFTTTogYSB2ZXJ5IHNtYWxsIGFuZCBmYXN0IEphdmEgYnl0ZWNvZGUgbWFuaXB1bGF0aW9uIGZyYW1ld29yaworICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMTEgSU5SSUEsIEZyYW5jZSBUZWxlY29tCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgR29vZ2xlCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2UgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLmNvbW1vbnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uSGFuZGxlOworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5MYWJlbDsKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uTWV0aG9kVmlzaXRvcjsKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uT3Bjb2RlczsKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uVHlwZTsKKworLyoqCisgKiBBIHtAbGluayBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uTWV0aG9kVmlzaXRvcn0gdG8gaW5zZXJ0IGJlZm9yZSwgYWZ0ZXIgYW5kIGFyb3VuZAorICogYWR2aWNlcyBpbiBtZXRob2RzIGFuZCBjb25zdHJ1Y3RvcnMuIDxwPiBUaGUgYmVoYXZpb3IgZm9yIGNvbnN0cnVjdG9ycyBpcworICogbGlrZSB0aGlzOiA8b2w+CisgKgorICogPGxpPmFzIGxvbmcgYXMgdGhlIElOVk9LRVNQRUNJQUwgZm9yIHRoZSBvYmplY3QgaW5pdGlhbGl6YXRpb24gaGFzIG5vdCBiZWVuCisgKiByZWFjaGVkLCBldmVyeSBieXRlY29kZSBpbnN0cnVjdGlvbiBpcyBkaXNwYXRjaGVkIGluIHRoZSBjdG9yIGNvZGUgdmlzaXRvcjwvbGk+CisgKgorICogPGxpPndoZW4gdGhpcyBvbmUgaXMgcmVhY2hlZCwgaXQgaXMgb25seSBhZGRlZCBpbiB0aGUgY3RvciBjb2RlIHZpc2l0b3IgYW5kCisgKiBhIEpQIGludm9rZSBpcyBhZGRlZDwvbGk+CisgKgorICogPGxpPmFmdGVyIHRoYXQsIG9ubHkgdGhlIG90aGVyIGNvZGUgdmlzaXRvciByZWNlaXZlcyB0aGUgaW5zdHJ1Y3Rpb25zPC9saT4KKyAqCisgKiA8L29sPgorICoKKyAqIEBhdXRob3IgRXVnZW5lIEt1bGVzaG92CisgKiBAYXV0aG9yIEVyaWMgQnJ1bmV0b24KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFkdmljZUFkYXB0ZXIgZXh0ZW5kcyBHZW5lcmF0b3JBZGFwdGVyIGltcGxlbWVudHMgT3Bjb2RlcworeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IFRISVMgPSBuZXcgT2JqZWN0KCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgT1RIRVIgPSBuZXcgT2JqZWN0KCk7CisKKyAgICBwcm90ZWN0ZWQgaW50IG1ldGhvZEFjY2VzczsKKworICAgIHByb3RlY3RlZCBTdHJpbmcgbWV0aG9kRGVzYzsKKworICAgIHByaXZhdGUgYm9vbGVhbiBjb25zdHJ1Y3RvcjsKKworICAgIHByaXZhdGUgYm9vbGVhbiBzdXBlckluaXRpYWxpemVkOworCisgICAgcHJpdmF0ZSBMaXN0PE9iamVjdD4gc3RhY2tGcmFtZTsKKworICAgIHByaXZhdGUgTWFwPExhYmVsLCBMaXN0PE9iamVjdD4+IGJyYW5jaGVzOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgQWR2aWNlQWRhcHRlcn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXBpIHRoZSBBU00gQVBJIHZlcnNpb24gaW1wbGVtZW50ZWQgYnkgdGhpcyB2aXNpdG9yLiBNdXN0IGJlIG9uZQorICAgICAqICAgICAgICBvZiB7QGxpbmsgT3Bjb2RlcyNBU000fS4KKyAgICAgKiBAcGFyYW0gbXYgdGhlIG1ldGhvZCB2aXNpdG9yIHRvIHdoaWNoIHRoaXMgYWRhcHRlciBkZWxlZ2F0ZXMgY2FsbHMuCisgICAgICogQHBhcmFtIGFjY2VzcyB0aGUgbWV0aG9kJ3MgYWNjZXNzIGZsYWdzIChzZWUge0BsaW5rIE9wY29kZXN9KS4KKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbWV0aG9kJ3MgbmFtZS4KKyAgICAgKiBAcGFyYW0gZGVzYyB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRvciAoc2VlIHtAbGluayBUeXBlIFR5cGV9KS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQWR2aWNlQWRhcHRlcigKKyAgICAgICAgZmluYWwgaW50IGFwaSwKKyAgICAgICAgZmluYWwgTWV0aG9kVmlzaXRvciBtdiwKKyAgICAgICAgZmluYWwgaW50IGFjY2VzcywKKyAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUsCisgICAgICAgIGZpbmFsIFN0cmluZyBkZXNjKQorICAgIHsKKyAgICAgICAgc3VwZXIoYXBpLCBtdiwgYWNjZXNzLCBuYW1lLCBkZXNjKTsKKyAgICAgICAgbWV0aG9kQWNjZXNzID0gYWNjZXNzOworICAgICAgICBtZXRob2REZXNjID0gZGVzYzsKKyAgICAgICAgY29uc3RydWN0b3IgPSAiPGluaXQ+Ii5lcXVhbHMobmFtZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRDb2RlKCkgeworICAgICAgICBtdi52aXNpdENvZGUoKTsKKyAgICAgICAgaWYgKGNvbnN0cnVjdG9yKSB7CisgICAgICAgICAgICBzdGFja0ZyYW1lID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7CisgICAgICAgICAgICBicmFuY2hlcyA9IG5ldyBIYXNoTWFwPExhYmVsLCBMaXN0PE9iamVjdD4+KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdXBlckluaXRpYWxpemVkID0gdHJ1ZTsKKyAgICAgICAgICAgIG9uTWV0aG9kRW50ZXIoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TGFiZWwoZmluYWwgTGFiZWwgbGFiZWwpIHsKKyAgICAgICAgbXYudmlzaXRMYWJlbChsYWJlbCk7CisgICAgICAgIGlmIChjb25zdHJ1Y3RvciAmJiBicmFuY2hlcyAhPSBudWxsKSB7CisgICAgICAgICAgICBMaXN0PE9iamVjdD4gZnJhbWUgPSBicmFuY2hlcy5nZXQobGFiZWwpOworICAgICAgICAgICAgaWYgKGZyYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzdGFja0ZyYW1lID0gZnJhbWU7CisgICAgICAgICAgICAgICAgYnJhbmNoZXMucmVtb3ZlKGxhYmVsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0SW5zbihmaW5hbCBpbnQgb3Bjb2RlKSB7CisgICAgICAgIGlmIChjb25zdHJ1Y3RvcikgeworICAgICAgICAgICAgaW50IHM7CisgICAgICAgICAgICBzd2l0Y2ggKG9wY29kZSkgeworICAgICAgICAgICAgICAgIGNhc2UgUkVUVVJOOiAvLyBlbXB0eSBzdGFjaworICAgICAgICAgICAgICAgICAgICBvbk1ldGhvZEV4aXQob3Bjb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIElSRVRVUk46IC8vIDEgYmVmb3JlIG4vYSBhZnRlcgorICAgICAgICAgICAgICAgIGNhc2UgRlJFVFVSTjogLy8gMSBiZWZvcmUgbi9hIGFmdGVyCisgICAgICAgICAgICAgICAgY2FzZSBBUkVUVVJOOiAvLyAxIGJlZm9yZSBuL2EgYWZ0ZXIKKyAgICAgICAgICAgICAgICBjYXNlIEFUSFJPVzogLy8gMSBiZWZvcmUgbi9hIGFmdGVyCisgICAgICAgICAgICAgICAgICAgIHBvcFZhbHVlKCk7CisgICAgICAgICAgICAgICAgICAgIG9uTWV0aG9kRXhpdChvcGNvZGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTFJFVFVSTjogLy8gMiBiZWZvcmUgbi9hIGFmdGVyCisgICAgICAgICAgICAgICAgY2FzZSBEUkVUVVJOOiAvLyAyIGJlZm9yZSBuL2EgYWZ0ZXIKKyAgICAgICAgICAgICAgICAgICAgcG9wVmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgcG9wVmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgb25NZXRob2RFeGl0KG9wY29kZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBOT1A6CisgICAgICAgICAgICAgICAgY2FzZSBMQUxPQUQ6IC8vIHJlbW92ZSAyIGFkZCAyCisgICAgICAgICAgICAgICAgY2FzZSBEQUxPQUQ6IC8vIHJlbW92ZSAyIGFkZCAyCisgICAgICAgICAgICAgICAgY2FzZSBMTkVHOgorICAgICAgICAgICAgICAgIGNhc2UgRE5FRzoKKyAgICAgICAgICAgICAgICBjYXNlIEZORUc6CisgICAgICAgICAgICAgICAgY2FzZSBJTkVHOgorICAgICAgICAgICAgICAgIGNhc2UgTDJEOgorICAgICAgICAgICAgICAgIGNhc2UgRDJMOgorICAgICAgICAgICAgICAgIGNhc2UgRjJJOgorICAgICAgICAgICAgICAgIGNhc2UgSTJCOgorICAgICAgICAgICAgICAgIGNhc2UgSTJDOgorICAgICAgICAgICAgICAgIGNhc2UgSTJTOgorICAgICAgICAgICAgICAgIGNhc2UgSTJGOgorICAgICAgICAgICAgICAgIGNhc2UgQVJSQVlMRU5HVEg6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBBQ09OU1RfTlVMTDoKKyAgICAgICAgICAgICAgICBjYXNlIElDT05TVF9NMToKKyAgICAgICAgICAgICAgICBjYXNlIElDT05TVF8wOgorICAgICAgICAgICAgICAgIGNhc2UgSUNPTlNUXzE6CisgICAgICAgICAgICAgICAgY2FzZSBJQ09OU1RfMjoKKyAgICAgICAgICAgICAgICBjYXNlIElDT05TVF8zOgorICAgICAgICAgICAgICAgIGNhc2UgSUNPTlNUXzQ6CisgICAgICAgICAgICAgICAgY2FzZSBJQ09OU1RfNToKKyAgICAgICAgICAgICAgICBjYXNlIEZDT05TVF8wOgorICAgICAgICAgICAgICAgIGNhc2UgRkNPTlNUXzE6CisgICAgICAgICAgICAgICAgY2FzZSBGQ09OU1RfMjoKKyAgICAgICAgICAgICAgICBjYXNlIEYyTDogLy8gMSBiZWZvcmUgMiBhZnRlcgorICAgICAgICAgICAgICAgIGNhc2UgRjJEOgorICAgICAgICAgICAgICAgIGNhc2UgSTJMOgorICAgICAgICAgICAgICAgIGNhc2UgSTJEOgorICAgICAgICAgICAgICAgICAgICBwdXNoVmFsdWUoT1RIRVIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTENPTlNUXzA6CisgICAgICAgICAgICAgICAgY2FzZSBMQ09OU1RfMToKKyAgICAgICAgICAgICAgICBjYXNlIERDT05TVF8wOgorICAgICAgICAgICAgICAgIGNhc2UgRENPTlNUXzE6CisgICAgICAgICAgICAgICAgICAgIHB1c2hWYWx1ZShPVEhFUik7CisgICAgICAgICAgICAgICAgICAgIHB1c2hWYWx1ZShPVEhFUik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBJQUxPQUQ6IC8vIHJlbW92ZSAyIGFkZCAxCisgICAgICAgICAgICAgICAgY2FzZSBGQUxPQUQ6IC8vIHJlbW92ZSAyIGFkZCAxCisgICAgICAgICAgICAgICAgY2FzZSBBQUxPQUQ6IC8vIHJlbW92ZSAyIGFkZCAxCisgICAgICAgICAgICAgICAgY2FzZSBCQUxPQUQ6IC8vIHJlbW92ZSAyIGFkZCAxCisgICAgICAgICAgICAgICAgY2FzZSBDQUxPQUQ6IC8vIHJlbW92ZSAyIGFkZCAxCisgICAgICAgICAgICAgICAgY2FzZSBTQUxPQUQ6IC8vIHJlbW92ZSAyIGFkZCAxCisgICAgICAgICAgICAgICAgY2FzZSBQT1A6CisgICAgICAgICAgICAgICAgY2FzZSBJQUREOgorICAgICAgICAgICAgICAgIGNhc2UgRkFERDoKKyAgICAgICAgICAgICAgICBjYXNlIElTVUI6CisgICAgICAgICAgICAgICAgY2FzZSBMU0hMOiAvLyAzIGJlZm9yZSAyIGFmdGVyCisgICAgICAgICAgICAgICAgY2FzZSBMU0hSOiAvLyAzIGJlZm9yZSAyIGFmdGVyCisgICAgICAgICAgICAgICAgY2FzZSBMVVNIUjogLy8gMyBiZWZvcmUgMiBhZnRlcgorICAgICAgICAgICAgICAgIGNhc2UgTDJJOiAvLyAyIGJlZm9yZSAxIGFmdGVyCisgICAgICAgICAgICAgICAgY2FzZSBMMkY6IC8vIDIgYmVmb3JlIDEgYWZ0ZXIKKyAgICAgICAgICAgICAgICBjYXNlIEQySTogLy8gMiBiZWZvcmUgMSBhZnRlcgorICAgICAgICAgICAgICAgIGNhc2UgRDJGOiAvLyAyIGJlZm9yZSAxIGFmdGVyCisgICAgICAgICAgICAgICAgY2FzZSBGU1VCOgorICAgICAgICAgICAgICAgIGNhc2UgRk1VTDoKKyAgICAgICAgICAgICAgICBjYXNlIEZESVY6CisgICAgICAgICAgICAgICAgY2FzZSBGUkVNOgorICAgICAgICAgICAgICAgIGNhc2UgRkNNUEw6IC8vIDIgYmVmb3JlIDEgYWZ0ZXIKKyAgICAgICAgICAgICAgICBjYXNlIEZDTVBHOiAvLyAyIGJlZm9yZSAxIGFmdGVyCisgICAgICAgICAgICAgICAgY2FzZSBJTVVMOgorICAgICAgICAgICAgICAgIGNhc2UgSURJVjoKKyAgICAgICAgICAgICAgICBjYXNlIElSRU06CisgICAgICAgICAgICAgICAgY2FzZSBJU0hMOgorICAgICAgICAgICAgICAgIGNhc2UgSVNIUjoKKyAgICAgICAgICAgICAgICBjYXNlIElVU0hSOgorICAgICAgICAgICAgICAgIGNhc2UgSUFORDoKKyAgICAgICAgICAgICAgICBjYXNlIElPUjoKKyAgICAgICAgICAgICAgICBjYXNlIElYT1I6CisgICAgICAgICAgICAgICAgY2FzZSBNT05JVE9SRU5URVI6CisgICAgICAgICAgICAgICAgY2FzZSBNT05JVE9SRVhJVDoKKyAgICAgICAgICAgICAgICAgICAgcG9wVmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFBPUDI6CisgICAgICAgICAgICAgICAgY2FzZSBMU1VCOgorICAgICAgICAgICAgICAgIGNhc2UgTE1VTDoKKyAgICAgICAgICAgICAgICBjYXNlIExESVY6CisgICAgICAgICAgICAgICAgY2FzZSBMUkVNOgorICAgICAgICAgICAgICAgIGNhc2UgTEFERDoKKyAgICAgICAgICAgICAgICBjYXNlIExBTkQ6CisgICAgICAgICAgICAgICAgY2FzZSBMT1I6CisgICAgICAgICAgICAgICAgY2FzZSBMWE9SOgorICAgICAgICAgICAgICAgIGNhc2UgREFERDoKKyAgICAgICAgICAgICAgICBjYXNlIERNVUw6CisgICAgICAgICAgICAgICAgY2FzZSBEU1VCOgorICAgICAgICAgICAgICAgIGNhc2UgRERJVjoKKyAgICAgICAgICAgICAgICBjYXNlIERSRU06CisgICAgICAgICAgICAgICAgICAgIHBvcFZhbHVlKCk7CisgICAgICAgICAgICAgICAgICAgIHBvcFZhbHVlKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBJQVNUT1JFOgorICAgICAgICAgICAgICAgIGNhc2UgRkFTVE9SRToKKyAgICAgICAgICAgICAgICBjYXNlIEFBU1RPUkU6CisgICAgICAgICAgICAgICAgY2FzZSBCQVNUT1JFOgorICAgICAgICAgICAgICAgIGNhc2UgQ0FTVE9SRToKKyAgICAgICAgICAgICAgICBjYXNlIFNBU1RPUkU6CisgICAgICAgICAgICAgICAgY2FzZSBMQ01QOiAvLyA0IGJlZm9yZSAxIGFmdGVyCisgICAgICAgICAgICAgICAgY2FzZSBEQ01QTDoKKyAgICAgICAgICAgICAgICBjYXNlIERDTVBHOgorICAgICAgICAgICAgICAgICAgICBwb3BWYWx1ZSgpOworICAgICAgICAgICAgICAgICAgICBwb3BWYWx1ZSgpOworICAgICAgICAgICAgICAgICAgICBwb3BWYWx1ZSgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgTEFTVE9SRToKKyAgICAgICAgICAgICAgICBjYXNlIERBU1RPUkU6CisgICAgICAgICAgICAgICAgICAgIHBvcFZhbHVlKCk7CisgICAgICAgICAgICAgICAgICAgIHBvcFZhbHVlKCk7CisgICAgICAgICAgICAgICAgICAgIHBvcFZhbHVlKCk7CisgICAgICAgICAgICAgICAgICAgIHBvcFZhbHVlKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBEVVA6CisgICAgICAgICAgICAgICAgICAgIHB1c2hWYWx1ZShwZWVrVmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBEVVBfWDE6CisgICAgICAgICAgICAgICAgICAgIHMgPSBzdGFja0ZyYW1lLnNpemUoKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhY2tGcmFtZS5hZGQocyAtIDIsIHN0YWNrRnJhbWUuZ2V0KHMgLSAxKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBEVVBfWDI6CisgICAgICAgICAgICAgICAgICAgIHMgPSBzdGFja0ZyYW1lLnNpemUoKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhY2tGcmFtZS5hZGQocyAtIDMsIHN0YWNrRnJhbWUuZ2V0KHMgLSAxKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBEVVAyOgorICAgICAgICAgICAgICAgICAgICBzID0gc3RhY2tGcmFtZS5zaXplKCk7CisgICAgICAgICAgICAgICAgICAgIHN0YWNrRnJhbWUuYWRkKHMgLSAyLCBzdGFja0ZyYW1lLmdldChzIC0gMSkpOworICAgICAgICAgICAgICAgICAgICBzdGFja0ZyYW1lLmFkZChzIC0gMiwgc3RhY2tGcmFtZS5nZXQocyAtIDEpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIERVUDJfWDE6CisgICAgICAgICAgICAgICAgICAgIHMgPSBzdGFja0ZyYW1lLnNpemUoKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhY2tGcmFtZS5hZGQocyAtIDMsIHN0YWNrRnJhbWUuZ2V0KHMgLSAxKSk7CisgICAgICAgICAgICAgICAgICAgIHN0YWNrRnJhbWUuYWRkKHMgLSAzLCBzdGFja0ZyYW1lLmdldChzIC0gMSkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgRFVQMl9YMjoKKyAgICAgICAgICAgICAgICAgICAgcyA9IHN0YWNrRnJhbWUuc2l6ZSgpOworICAgICAgICAgICAgICAgICAgICBzdGFja0ZyYW1lLmFkZChzIC0gNCwgc3RhY2tGcmFtZS5nZXQocyAtIDEpKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhY2tGcmFtZS5hZGQocyAtIDQsIHN0YWNrRnJhbWUuZ2V0KHMgLSAxKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBTV0FQOgorICAgICAgICAgICAgICAgICAgICBzID0gc3RhY2tGcmFtZS5zaXplKCk7CisgICAgICAgICAgICAgICAgICAgIHN0YWNrRnJhbWUuYWRkKHMgLSAyLCBzdGFja0ZyYW1lLmdldChzIC0gMSkpOworICAgICAgICAgICAgICAgICAgICBzdGFja0ZyYW1lLnJlbW92ZShzKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzd2l0Y2ggKG9wY29kZSkgeworICAgICAgICAgICAgICAgIGNhc2UgUkVUVVJOOgorICAgICAgICAgICAgICAgIGNhc2UgSVJFVFVSTjoKKyAgICAgICAgICAgICAgICBjYXNlIEZSRVRVUk46CisgICAgICAgICAgICAgICAgY2FzZSBBUkVUVVJOOgorICAgICAgICAgICAgICAgIGNhc2UgTFJFVFVSTjoKKyAgICAgICAgICAgICAgICBjYXNlIERSRVRVUk46CisgICAgICAgICAgICAgICAgY2FzZSBBVEhST1c6CisgICAgICAgICAgICAgICAgICAgIG9uTWV0aG9kRXhpdChvcGNvZGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtdi52aXNpdEluc24ob3Bjb2RlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFZhckluc24oZmluYWwgaW50IG9wY29kZSwgZmluYWwgaW50IHZhcikgeworICAgICAgICBzdXBlci52aXNpdFZhckluc24ob3Bjb2RlLCB2YXIpOworICAgICAgICBpZiAoY29uc3RydWN0b3IpIHsKKyAgICAgICAgICAgIHN3aXRjaCAob3Bjb2RlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBJTE9BRDoKKyAgICAgICAgICAgICAgICBjYXNlIEZMT0FEOgorICAgICAgICAgICAgICAgICAgICBwdXNoVmFsdWUoT1RIRVIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIExMT0FEOgorICAgICAgICAgICAgICAgIGNhc2UgRExPQUQ6CisgICAgICAgICAgICAgICAgICAgIHB1c2hWYWx1ZShPVEhFUik7CisgICAgICAgICAgICAgICAgICAgIHB1c2hWYWx1ZShPVEhFUik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQUxPQUQ6CisgICAgICAgICAgICAgICAgICAgIHB1c2hWYWx1ZSh2YXIgPT0gMCA/IFRISVMgOiBPVEhFUik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQVNUT1JFOgorICAgICAgICAgICAgICAgIGNhc2UgSVNUT1JFOgorICAgICAgICAgICAgICAgIGNhc2UgRlNUT1JFOgorICAgICAgICAgICAgICAgICAgICBwb3BWYWx1ZSgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIExTVE9SRToKKyAgICAgICAgICAgICAgICBjYXNlIERTVE9SRToKKyAgICAgICAgICAgICAgICAgICAgcG9wVmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgcG9wVmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEZpZWxkSW5zbigKKyAgICAgICAgZmluYWwgaW50IG9wY29kZSwKKyAgICAgICAgZmluYWwgU3RyaW5nIG93bmVyLAorICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSwKKyAgICAgICAgZmluYWwgU3RyaW5nIGRlc2MpCisgICAgeworICAgICAgICBtdi52aXNpdEZpZWxkSW5zbihvcGNvZGUsIG93bmVyLCBuYW1lLCBkZXNjKTsKKyAgICAgICAgaWYgKGNvbnN0cnVjdG9yKSB7CisgICAgICAgICAgICBjaGFyIGMgPSBkZXNjLmNoYXJBdCgwKTsKKyAgICAgICAgICAgIGJvb2xlYW4gbG9uZ09yRG91YmxlID0gYyA9PSAnSicgfHwgYyA9PSAnRCc7CisgICAgICAgICAgICBzd2l0Y2ggKG9wY29kZSkgeworICAgICAgICAgICAgICAgIGNhc2UgR0VUU1RBVElDOgorICAgICAgICAgICAgICAgICAgICBwdXNoVmFsdWUoT1RIRVIpOworICAgICAgICAgICAgICAgICAgICBpZiAobG9uZ09yRG91YmxlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwdXNoVmFsdWUoT1RIRVIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUFVUU1RBVElDOgorICAgICAgICAgICAgICAgICAgICBwb3BWYWx1ZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAobG9uZ09yRG91YmxlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwb3BWYWx1ZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUFVURklFTEQ6CisgICAgICAgICAgICAgICAgICAgIHBvcFZhbHVlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChsb25nT3JEb3VibGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvcFZhbHVlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwb3BWYWx1ZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIC8vIGNhc2UgR0VURklFTEQ6CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxvbmdPckRvdWJsZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHVzaFZhbHVlKE9USEVSKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRJbnRJbnNuKGZpbmFsIGludCBvcGNvZGUsIGZpbmFsIGludCBvcGVyYW5kKSB7CisgICAgICAgIG12LnZpc2l0SW50SW5zbihvcGNvZGUsIG9wZXJhbmQpOworICAgICAgICBpZiAoY29uc3RydWN0b3IgJiYgb3Bjb2RlICE9IE5FV0FSUkFZKSB7CisgICAgICAgICAgICBwdXNoVmFsdWUoT1RIRVIpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRMZGNJbnNuKGZpbmFsIE9iamVjdCBjc3QpIHsKKyAgICAgICAgbXYudmlzaXRMZGNJbnNuKGNzdCk7CisgICAgICAgIGlmIChjb25zdHJ1Y3RvcikgeworICAgICAgICAgICAgcHVzaFZhbHVlKE9USEVSKTsKKyAgICAgICAgICAgIGlmIChjc3QgaW5zdGFuY2VvZiBEb3VibGUgfHwgY3N0IGluc3RhbmNlb2YgTG9uZykgeworICAgICAgICAgICAgICAgIHB1c2hWYWx1ZShPVEhFUik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdE11bHRpQU5ld0FycmF5SW5zbihmaW5hbCBTdHJpbmcgZGVzYywgZmluYWwgaW50IGRpbXMpIHsKKyAgICAgICAgbXYudmlzaXRNdWx0aUFOZXdBcnJheUluc24oZGVzYywgZGltcyk7CisgICAgICAgIGlmIChjb25zdHJ1Y3RvcikgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaW1zOyBpKyspIHsKKyAgICAgICAgICAgICAgICBwb3BWYWx1ZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaFZhbHVlKE9USEVSKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0VHlwZUluc24oZmluYWwgaW50IG9wY29kZSwgZmluYWwgU3RyaW5nIHR5cGUpIHsKKyAgICAgICAgbXYudmlzaXRUeXBlSW5zbihvcGNvZGUsIHR5cGUpOworICAgICAgICAvLyBBTkVXQVJSQVksIENIRUNLQ0FTVCBvciBJTlNUQU5DRU9GIGRvbid0IGNoYW5nZSBzdGFjaworICAgICAgICBpZiAoY29uc3RydWN0b3IgJiYgb3Bjb2RlID09IE5FVykgeworICAgICAgICAgICAgcHVzaFZhbHVlKE9USEVSKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TWV0aG9kSW5zbigKKyAgICAgICAgZmluYWwgaW50IG9wY29kZSwKKyAgICAgICAgZmluYWwgU3RyaW5nIG93bmVyLAorICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSwKKyAgICAgICAgZmluYWwgU3RyaW5nIGRlc2MpCisgICAgeworICAgICAgICBtdi52aXNpdE1ldGhvZEluc24ob3Bjb2RlLCBvd25lciwgbmFtZSwgZGVzYyk7CisgICAgICAgIGlmIChjb25zdHJ1Y3RvcikgeworICAgICAgICAgICAgVHlwZVtdIHR5cGVzID0gVHlwZS5nZXRBcmd1bWVudFR5cGVzKGRlc2MpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIHBvcFZhbHVlKCk7CisgICAgICAgICAgICAgICAgaWYgKHR5cGVzW2ldLmdldFNpemUoKSA9PSAyKSB7CisgICAgICAgICAgICAgICAgICAgIHBvcFZhbHVlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoIChvcGNvZGUpIHsKKyAgICAgICAgICAgICAgICAvLyBjYXNlIElOVk9LRVNUQVRJQzoKKyAgICAgICAgICAgICAgICAvLyBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgSU5WT0tFSU5URVJGQUNFOgorICAgICAgICAgICAgICAgIGNhc2UgSU5WT0tFVklSVFVBTDoKKyAgICAgICAgICAgICAgICAgICAgcG9wVmFsdWUoKTsgLy8gb2JqZWN0cmVmCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBJTlZPS0VTUEVDSUFMOgorICAgICAgICAgICAgICAgICAgICBPYmplY3QgdHlwZSA9IHBvcFZhbHVlKCk7IC8vIG9iamVjdHJlZgorICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBUSElTICYmICFzdXBlckluaXRpYWxpemVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvbk1ldGhvZEVudGVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdXBlckluaXRpYWxpemVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uY2Ugc3VwZXIgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgaXQgaXMgbm8gbG9uZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWNlc3NhcnkgdG8ga2VlcCB0cmFjayBvZiBzdGFjayBzdGF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgVHlwZSByZXR1cm5UeXBlID0gVHlwZS5nZXRSZXR1cm5UeXBlKGRlc2MpOworICAgICAgICAgICAgaWYgKHJldHVyblR5cGUgIT0gVHlwZS5WT0lEX1RZUEUpIHsKKyAgICAgICAgICAgICAgICBwdXNoVmFsdWUoT1RIRVIpOworICAgICAgICAgICAgICAgIGlmIChyZXR1cm5UeXBlLmdldFNpemUoKSA9PSAyKSB7CisgICAgICAgICAgICAgICAgICAgIHB1c2hWYWx1ZShPVEhFUik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRJbnZva2VEeW5hbWljSW5zbigKKyAgICAgICAgU3RyaW5nIG5hbWUsCisgICAgICAgIFN0cmluZyBkZXNjLAorICAgICAgICBIYW5kbGUgYnNtLAorICAgICAgICBPYmplY3QuLi4gYnNtQXJncykKKyAgICB7CisgICAgICAgIG12LnZpc2l0SW52b2tlRHluYW1pY0luc24obmFtZSwgZGVzYywgYnNtLCBic21BcmdzKTsKKyAgICAgICAgaWYgKGNvbnN0cnVjdG9yKSB7CisgICAgICAgICAgICBUeXBlW10gdHlwZXMgPSBUeXBlLmdldEFyZ3VtZW50VHlwZXMoZGVzYyk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgcG9wVmFsdWUoKTsKKyAgICAgICAgICAgICAgICBpZiAodHlwZXNbaV0uZ2V0U2l6ZSgpID09IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgcG9wVmFsdWUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFR5cGUgcmV0dXJuVHlwZSA9IFR5cGUuZ2V0UmV0dXJuVHlwZShkZXNjKTsKKyAgICAgICAgICAgIGlmIChyZXR1cm5UeXBlICE9IFR5cGUuVk9JRF9UWVBFKSB7CisgICAgICAgICAgICAgICAgcHVzaFZhbHVlKE9USEVSKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0dXJuVHlwZS5nZXRTaXplKCkgPT0gMikgeworICAgICAgICAgICAgICAgICAgICBwdXNoVmFsdWUoT1RIRVIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0SnVtcEluc24oZmluYWwgaW50IG9wY29kZSwgZmluYWwgTGFiZWwgbGFiZWwpIHsKKyAgICAgICAgbXYudmlzaXRKdW1wSW5zbihvcGNvZGUsIGxhYmVsKTsKKyAgICAgICAgaWYgKGNvbnN0cnVjdG9yKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG9wY29kZSkgeworICAgICAgICAgICAgICAgIGNhc2UgSUZFUToKKyAgICAgICAgICAgICAgICBjYXNlIElGTkU6CisgICAgICAgICAgICAgICAgY2FzZSBJRkxUOgorICAgICAgICAgICAgICAgIGNhc2UgSUZHRToKKyAgICAgICAgICAgICAgICBjYXNlIElGR1Q6CisgICAgICAgICAgICAgICAgY2FzZSBJRkxFOgorICAgICAgICAgICAgICAgIGNhc2UgSUZOVUxMOgorICAgICAgICAgICAgICAgIGNhc2UgSUZOT05OVUxMOgorICAgICAgICAgICAgICAgICAgICBwb3BWYWx1ZSgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgSUZfSUNNUEVROgorICAgICAgICAgICAgICAgIGNhc2UgSUZfSUNNUE5FOgorICAgICAgICAgICAgICAgIGNhc2UgSUZfSUNNUExUOgorICAgICAgICAgICAgICAgIGNhc2UgSUZfSUNNUEdFOgorICAgICAgICAgICAgICAgIGNhc2UgSUZfSUNNUEdUOgorICAgICAgICAgICAgICAgIGNhc2UgSUZfSUNNUExFOgorICAgICAgICAgICAgICAgIGNhc2UgSUZfQUNNUEVROgorICAgICAgICAgICAgICAgIGNhc2UgSUZfQUNNUE5FOgorICAgICAgICAgICAgICAgICAgICBwb3BWYWx1ZSgpOworICAgICAgICAgICAgICAgICAgICBwb3BWYWx1ZSgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgSlNSOgorICAgICAgICAgICAgICAgICAgICBwdXNoVmFsdWUoT1RIRVIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFkZEJyYW5jaChsYWJlbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdExvb2t1cFN3aXRjaEluc24oCisgICAgICAgIGZpbmFsIExhYmVsIGRmbHQsCisgICAgICAgIGZpbmFsIGludFtdIGtleXMsCisgICAgICAgIGZpbmFsIExhYmVsW10gbGFiZWxzKQorICAgIHsKKyAgICAgICAgbXYudmlzaXRMb29rdXBTd2l0Y2hJbnNuKGRmbHQsIGtleXMsIGxhYmVscyk7CisgICAgICAgIGlmIChjb25zdHJ1Y3RvcikgeworICAgICAgICAgICAgcG9wVmFsdWUoKTsKKyAgICAgICAgICAgIGFkZEJyYW5jaGVzKGRmbHQsIGxhYmVscyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFRhYmxlU3dpdGNoSW5zbigKKyAgICAgICAgZmluYWwgaW50IG1pbiwKKyAgICAgICAgZmluYWwgaW50IG1heCwKKyAgICAgICAgZmluYWwgTGFiZWwgZGZsdCwKKyAgICAgICAgZmluYWwgTGFiZWwuLi4gbGFiZWxzKQorICAgIHsKKyAgICAgICAgbXYudmlzaXRUYWJsZVN3aXRjaEluc24obWluLCBtYXgsIGRmbHQsIGxhYmVscyk7CisgICAgICAgIGlmIChjb25zdHJ1Y3RvcikgeworICAgICAgICAgICAgcG9wVmFsdWUoKTsKKyAgICAgICAgICAgIGFkZEJyYW5jaGVzKGRmbHQsIGxhYmVscyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFRyeUNhdGNoQmxvY2soCisgICAgICAgIExhYmVsIHN0YXJ0LAorICAgICAgICBMYWJlbCBlbmQsCisgICAgICAgIExhYmVsIGhhbmRsZXIsCisgICAgICAgIFN0cmluZyB0eXBlKQorICAgIHsKKyAgICAgICAgc3VwZXIudmlzaXRUcnlDYXRjaEJsb2NrKHN0YXJ0LCBlbmQsIGhhbmRsZXIsIHR5cGUpOworICAgICAgICBpZiAoY29uc3RydWN0b3IgJiYgIWJyYW5jaGVzLmNvbnRhaW5zS2V5KGhhbmRsZXIpKSB7CisgICAgICAgICAgICBMaXN0PE9iamVjdD4gc3RhY2tGcmFtZSA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOworICAgICAgICAgICAgc3RhY2tGcmFtZS5hZGQoT1RIRVIpOworICAgICAgICAgICAgYnJhbmNoZXMucHV0KGhhbmRsZXIsIHN0YWNrRnJhbWUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFkZEJyYW5jaGVzKGZpbmFsIExhYmVsIGRmbHQsIGZpbmFsIExhYmVsW10gbGFiZWxzKSB7CisgICAgICAgIGFkZEJyYW5jaChkZmx0KTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsYWJlbHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGFkZEJyYW5jaChsYWJlbHNbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFkZEJyYW5jaChmaW5hbCBMYWJlbCBsYWJlbCkgeworICAgICAgICBpZiAoYnJhbmNoZXMuY29udGFpbnNLZXkobGFiZWwpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgYnJhbmNoZXMucHV0KGxhYmVsLCBuZXcgQXJyYXlMaXN0PE9iamVjdD4oc3RhY2tGcmFtZSkpOworICAgIH0KKworICAgIHByaXZhdGUgT2JqZWN0IHBvcFZhbHVlKCkgeworICAgICAgICByZXR1cm4gc3RhY2tGcmFtZS5yZW1vdmUoc3RhY2tGcmFtZS5zaXplKCkgLSAxKTsKKyAgICB9CisKKyAgICBwcml2YXRlIE9iamVjdCBwZWVrVmFsdWUoKSB7CisgICAgICAgIHJldHVybiBzdGFja0ZyYW1lLmdldChzdGFja0ZyYW1lLnNpemUoKSAtIDEpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwdXNoVmFsdWUoZmluYWwgT2JqZWN0IG8pIHsKKyAgICAgICAgc3RhY2tGcmFtZS5hZGQobyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG1ldGhvZCBvciBhZnRlciBzdXBlciBjbGFzcyBjbGFzcyBjYWxsIGluCisgICAgICogdGhlIGNvbnN0cnVjdG9yLiA8YnI+PGJyPgorICAgICAqCisgICAgICogPGk+Q3VzdG9tIGNvZGUgY2FuIHVzZSBvciBjaGFuZ2UgYWxsIHRoZSBsb2NhbCB2YXJpYWJsZXMsIGJ1dCBzaG91bGQgbm90CisgICAgICogY2hhbmdlIHN0YXRlIG9mIHRoZSBzdGFjay48L2k+CisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgb25NZXRob2RFbnRlcigpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYmVmb3JlIGV4cGxpY2l0IGV4aXQgZnJvbSB0aGUgbWV0aG9kIHVzaW5nIGVpdGhlciByZXR1cm4gb3IgdGhyb3cuCisgICAgICogVG9wIGVsZW1lbnQgb24gdGhlIHN0YWNrIGNvbnRhaW5zIHRoZSByZXR1cm4gdmFsdWUgb3IgZXhjZXB0aW9uIGluc3RhbmNlLgorICAgICAqIEZvciBleGFtcGxlOgorICAgICAqCisgICAgICogPHByZT4KKyAgICAgKiAgIHB1YmxpYyB2b2lkIG9uTWV0aG9kRXhpdChpbnQgb3Bjb2RlKSB7CisgICAgICogICAgIGlmKG9wY29kZT09UkVUVVJOKSB7CisgICAgICogICAgICAgICB2aXNpdEluc24oQUNPTlNUX05VTEwpOworICAgICAqICAgICB9IGVsc2UgaWYob3Bjb2RlPT1BUkVUVVJOIHx8IG9wY29kZT09QVRIUk9XKSB7CisgICAgICogICAgICAgICBkdXAoKTsKKyAgICAgKiAgICAgfSBlbHNlIHsKKyAgICAgKiAgICAgICAgIGlmKG9wY29kZT09TFJFVFVSTiB8fCBvcGNvZGU9PURSRVRVUk4pIHsKKyAgICAgKiAgICAgICAgICAgICBkdXAyKCk7CisgICAgICogICAgICAgICB9IGVsc2UgeworICAgICAqICAgICAgICAgICAgIGR1cCgpOworICAgICAqICAgICAgICAgfQorICAgICAqICAgICAgICAgYm94KFR5cGUuZ2V0UmV0dXJuVHlwZSh0aGlzLm1ldGhvZERlc2MpKTsKKyAgICAgKiAgICAgfQorICAgICAqICAgICB2aXNpdEludEluc24oU0lQVVNILCBvcGNvZGUpOworICAgICAqICAgICB2aXNpdE1ldGhvZEluc24oSU5WT0tFU1RBVElDLCBvd25lciwgIm9uRXhpdCIsICIoTGphdmEvbGFuZy9PYmplY3Q7SSlWIik7CisgICAgICogICB9CisgICAgICoKKyAgICAgKiAgIC8vIGFuIGFjdHVhbCBjYWxsIGJhY2sgbWV0aG9kCisgICAgICogICBwdWJsaWMgc3RhdGljIHZvaWQgb25FeGl0KE9iamVjdCBwYXJhbSwgaW50IG9wY29kZSkgeworICAgICAqICAgICAuLi4KKyAgICAgKiA8L3ByZT4KKyAgICAgKgorICAgICAqIDxicj48YnI+CisgICAgICoKKyAgICAgKiA8aT5DdXN0b20gY29kZSBjYW4gdXNlIG9yIGNoYW5nZSBhbGwgdGhlIGxvY2FsIHZhcmlhYmxlcywgYnV0IHNob3VsZCBub3QKKyAgICAgKiBjaGFuZ2Ugc3RhdGUgb2YgdGhlIHN0YWNrLjwvaT4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvcGNvZGUgb25lIG9mIHRoZSBSRVRVUk4sIElSRVRVUk4sIEZSRVRVUk4sIEFSRVRVUk4sIExSRVRVUk4sCisgICAgICogICAgICAgIERSRVRVUk4gb3IgQVRIUk9XCisgICAgICoKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBvbk1ldGhvZEV4aXQoaW50IG9wY29kZSkgeworICAgIH0KKworICAgIC8vIFRPRE8gb25FeGNlcHRpb24sIG9uTWV0aG9kQ2FsbAorfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS9jb21tb25zL0FuYWx5emVyQWRhcHRlci5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS9jb21tb25zL0FuYWx5emVyQWRhcHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2ODYxNDEKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL2NvbW1vbnMvQW5hbHl6ZXJBZGFwdGVyLmphdmEKQEAgLTAsMCArMSw5NzUgQEAKKy8qCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IE9yYWNsZSBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQorICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQorICogcXVlc3Rpb25zLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgaXMgYXZhaWxhYmxlIHVuZGVyIGFuZCBnb3Zlcm5lZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIEhvd2V2ZXIsIHRoZSBmb2xsb3dpbmcgbm90aWNlIGFjY29tcGFuaWVkIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoaXMKKyAqIGZpbGU6CisgKgorICogQVNNOiBhIHZlcnkgc21hbGwgYW5kIGZhc3QgSmF2YSBieXRlY29kZSBtYW5pcHVsYXRpb24gZnJhbWV3b3JrCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAxMSBJTlJJQSwgRnJhbmNlIFRlbGVjb20KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uY29tbW9uczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5IYW5kbGU7CitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLkxhYmVsOworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5NZXRob2RWaXNpdG9yOworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5PcGNvZGVzOworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5UeXBlOworCisvKioKKyAqIEEge0BsaW5rIE1ldGhvZFZpc2l0b3J9IHRoYXQga2VlcHMgdHJhY2sgb2Ygc3RhY2sgbWFwIGZyYW1lIGNoYW5nZXMgYmV0d2VlbgorICoge0BsaW5rICN2aXNpdEZyYW1lKGludCwgaW50LCBPYmplY3RbXSwgaW50LCBPYmplY3RbXSkgdmlzaXRGcmFtZX0gY2FsbHMuIFRoaXMKKyAqIGFkYXB0ZXIgbXVzdCBiZSB1c2VkIHdpdGggdGhlCisgKiB7QGxpbmsgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLkNsYXNzUmVhZGVyI0VYUEFORF9GUkFNRVN9IG9wdGlvbi4gRWFjaCB2aXNpdDxpPlg8L2k+CisgKiBpbnN0cnVjdGlvbiBkZWxlZ2F0ZXMgdG8gdGhlIG5leHQgdmlzaXRvciBpbiB0aGUgY2hhaW4sIGlmIGFueSwgYW5kIHRoZW4KKyAqIHNpbXVsYXRlcyB0aGUgZWZmZWN0IG9mIHRoaXMgaW5zdHJ1Y3Rpb24gb24gdGhlIHN0YWNrIG1hcCBmcmFtZSwgcmVwcmVzZW50ZWQKKyAqIGJ5IHtAbGluayAjbG9jYWxzfSBhbmQge0BsaW5rICNzdGFja30uIFRoZSBuZXh0IHZpc2l0b3IgaW4gdGhlIGNoYWluIGNhbiBnZXQKKyAqIHRoZSBzdGF0ZSBvZiB0aGUgc3RhY2sgbWFwIGZyYW1lIDxpPmJlZm9yZTwvaT4gZWFjaCBpbnN0cnVjdGlvbiBieSByZWFkaW5nCisgKiB0aGUgdmFsdWUgb2YgdGhlc2UgZmllbGRzIGluIGl0cyB2aXNpdDxpPlg8L2k+IG1ldGhvZHMgKHRoaXMgcmVxdWlyZXMgYQorICogcmVmZXJlbmNlIHRvIHRoZSBBbmFseXplckFkYXB0ZXIgdGhhdCBpcyBiZWZvcmUgaXQgaW4gdGhlIGNoYWluKS4KKyAqIElmIHRoaXMgYWRhcHRlciBpcyB1c2VkIHdpdGggYSBjbGFzcyB0aGF0IGRvZXMgbm90IGNvbnRhaW4gc3RhY2sgbWFwIHRhYmxlCisgKiBhdHRyaWJ1dGVzIChpLmUuLCBwcmUgSmF2YSA2IGNsYXNzZXMpIHRoZW4gdGhpcyBhZGFwdGVyIG1heSBub3QgYmUgYWJsZSB0bworICogY29tcHV0ZSB0aGUgc3RhY2sgbWFwIGZyYW1lIGZvciBlYWNoIGluc3RydWN0aW9uLiBJbiB0aGlzIGNhc2Ugbm8gZXhjZXB0aW9uCisgKiBpcyB0aHJvd24gYnV0IHRoZSB7QGxpbmsgI2xvY2Fsc30gYW5kIHtAbGluayAjc3RhY2t9IGZpZWxkcyB3aWxsIGJlIG51bGwgZm9yCisgKiB0aGVzZSBpbnN0cnVjdGlvbnMuCisgKgorICogQGF1dGhvciBFcmljIEJydW5ldG9uCisgKi8KK3B1YmxpYyBjbGFzcyBBbmFseXplckFkYXB0ZXIgZXh0ZW5kcyBNZXRob2RWaXNpdG9yIHsKKworICAgIC8qKgorICAgICAqIDxjb2RlPkxpc3Q8L2NvZGU+IG9mIHRoZSBsb2NhbCB2YXJpYWJsZSBzbG90cyBmb3IgY3VycmVudCBleGVjdXRpb24KKyAgICAgKiBmcmFtZS4gUHJpbWl0aXZlIHR5cGVzIGFyZSByZXByZXNlbnRlZCBieSB7QGxpbmsgT3Bjb2RlcyNUT1B9LAorICAgICAqIHtAbGluayBPcGNvZGVzI0lOVEVHRVJ9LCB7QGxpbmsgT3Bjb2RlcyNGTE9BVH0sIHtAbGluayBPcGNvZGVzI0xPTkd9LAorICAgICAqIHtAbGluayBPcGNvZGVzI0RPVUJMRX0se0BsaW5rIE9wY29kZXMjTlVMTH0gb3IKKyAgICAgKiB7QGxpbmsgT3Bjb2RlcyNVTklOSVRJQUxJWkVEX1RISVN9IChsb25nIGFuZCBkb3VibGUgYXJlIHJlcHJlc2VudGVkIGJ5IGEKKyAgICAgKiB0d28gZWxlbWVudHMsIHRoZSBzZWNvbmQgb25lIGJlaW5nIFRPUCkuIFJlZmVyZW5jZSB0eXBlcyBhcmUgcmVwcmVzZW50ZWQKKyAgICAgKiBieSBTdHJpbmcgb2JqZWN0cyAocmVwcmVzZW50aW5nIGludGVybmFsIG5hbWVzKSwgYW5kIHVuaW5pdGlhbGl6ZWQgdHlwZXMKKyAgICAgKiBieSBMYWJlbCBvYmplY3RzICh0aGlzIGxhYmVsIGRlc2lnbmF0ZXMgdGhlIE5FVyBpbnN0cnVjdGlvbiB0aGF0IGNyZWF0ZWQKKyAgICAgKiB0aGlzIHVuaW5pdGlhbGl6ZWQgdmFsdWUpLiBUaGlzIGZpZWxkIGlzIDx0dD5udWxsPC90dD4gZm9yIHVucmVhY2hlYWJsZQorICAgICAqIGluc3RydWN0aW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxPYmplY3Q+IGxvY2FsczsKKworICAgIC8qKgorICAgICAqIDxjb2RlPkxpc3Q8L2NvZGU+IG9mIHRoZSBvcGVyYW5kIHN0YWNrIHNsb3RzIGZvciBjdXJyZW50IGV4ZWN1dGlvbgorICAgICAqIGZyYW1lLiBQcmltaXRpdmUgdHlwZXMgYXJlIHJlcHJlc2VudGVkIGJ5IHtAbGluayBPcGNvZGVzI1RPUH0sCisgICAgICoge0BsaW5rIE9wY29kZXMjSU5URUdFUn0sIHtAbGluayBPcGNvZGVzI0ZMT0FUfSwge0BsaW5rIE9wY29kZXMjTE9OR30sCisgICAgICoge0BsaW5rIE9wY29kZXMjRE9VQkxFfSx7QGxpbmsgT3Bjb2RlcyNOVUxMfSBvcgorICAgICAqIHtAbGluayBPcGNvZGVzI1VOSU5JVElBTElaRURfVEhJU30gKGxvbmcgYW5kIGRvdWJsZSBhcmUgcmVwcmVzZW50ZWQgYnkgYQorICAgICAqIHR3byBlbGVtZW50cywgdGhlIHNlY29uZCBvbmUgYmVpbmcgVE9QKS4gUmVmZXJlbmNlIHR5cGVzIGFyZSByZXByZXNlbnRlZAorICAgICAqIGJ5IFN0cmluZyBvYmplY3RzIChyZXByZXNlbnRpbmcgaW50ZXJuYWwgbmFtZXMpLCBhbmQgdW5pbml0aWFsaXplZCB0eXBlcworICAgICAqIGJ5IExhYmVsIG9iamVjdHMgKHRoaXMgbGFiZWwgZGVzaWduYXRlcyB0aGUgTkVXIGluc3RydWN0aW9uIHRoYXQgY3JlYXRlZAorICAgICAqIHRoaXMgdW5pbml0aWFsaXplZCB2YWx1ZSkuIFRoaXMgZmllbGQgaXMgPHR0Pm51bGw8L3R0PiBmb3IgdW5yZWFjaGVhYmxlCisgICAgICogaW5zdHJ1Y3Rpb25zLgorICAgICAqLworICAgIHB1YmxpYyBMaXN0PE9iamVjdD4gc3RhY2s7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbGFiZWxzIHRoYXQgZGVzaWduYXRlIHRoZSBuZXh0IGluc3RydWN0aW9uIHRvIGJlIHZpc2l0ZWQuIE1heSBiZQorICAgICAqIDx0dD5udWxsPC90dD4uCisgICAgICovCisgICAgcHJpdmF0ZSBMaXN0PExhYmVsPiBsYWJlbHM7CisKKyAgICAvKioKKyAgICAgKiBJbmZvcm1hdGlvbiBhYm91dCB1bmluaXRpYWxpemVkIHR5cGVzIGluIHRoZSBjdXJyZW50IGV4ZWN1dGlvbiBmcmFtZS4KKyAgICAgKiBUaGlzIG1hcCBhc3NvY2lhdGVzIGludGVybmFsIG5hbWVzIHRvIExhYmVsIG9iamVjdHMuIEVhY2ggbGFiZWwKKyAgICAgKiBkZXNpZ25hdGVzIGEgTkVXIGluc3RydWN0aW9uIHRoYXQgY3JlYXRlZCB0aGUgY3VycmVudGx5IHVuaW5pdGlhbGl6ZWQKKyAgICAgKiB0eXBlcywgYW5kIHRoZSBhc3NvY2lhdGVkIGludGVybmFsIG5hbWUgcmVwcmVzZW50cyB0aGUgTkVXIG9wZXJhbmQsIGkuZS4KKyAgICAgKiB0aGUgZmluYWwsIGluaXRpYWxpemVkIHR5cGUgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIE1hcDxPYmplY3QsT2JqZWN0PiB1bmluaXRpYWxpemVkVHlwZXM7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbWF4aW11bSBzdGFjayBzaXplIG9mIHRoaXMgbWV0aG9kLgorICAgICAqLworICAgIHByaXZhdGUgaW50IG1heFN0YWNrOworCisgICAgLyoqCisgICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGxvY2FsIHZhcmlhYmxlcyBvZiB0aGlzIG1ldGhvZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBtYXhMb2NhbHM7CisKKyAgICAvKioKKyAgICAgKiBUaGUgb3duZXIncyBjbGFzcyBuYW1lLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG93bmVyOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgQW5hbHl6ZXJBZGFwdGVyfS4gPGk+U3ViY2xhc3NlcyBtdXN0IG5vdCB1c2UgdGhpcworICAgICAqIGNvbnN0cnVjdG9yPC9pPi4gSW5zdGVhZCwgdGhleSBtdXN0IHVzZSB0aGUKKyAgICAgKiB7QGxpbmsgI0FuYWx5emVyQWRhcHRlcihpbnQsIFN0cmluZywgaW50LCBTdHJpbmcsIFN0cmluZywgTWV0aG9kVmlzaXRvcil9CisgICAgICogdmVyc2lvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvd25lciB0aGUgb3duZXIncyBjbGFzcyBuYW1lLgorICAgICAqIEBwYXJhbSBhY2Nlc3MgdGhlIG1ldGhvZCdzIGFjY2VzcyBmbGFncyAoc2VlIHtAbGluayBPcGNvZGVzfSkuCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG1ldGhvZCdzIG5hbWUuCisgICAgICogQHBhcmFtIGRlc2MgdGhlIG1ldGhvZCdzIGRlc2NyaXB0b3IgKHNlZSB7QGxpbmsgVHlwZSBUeXBlfSkuCisgICAgICogQHBhcmFtIG12IHRoZSBtZXRob2QgdmlzaXRvciB0byB3aGljaCB0aGlzIGFkYXB0ZXIgZGVsZWdhdGVzIGNhbGxzLiBNYXkKKyAgICAgKiAgICAgICAgYmUgPHR0Pm51bGw8L3R0Pi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQW5hbHl6ZXJBZGFwdGVyKAorICAgICAgICBmaW5hbCBTdHJpbmcgb3duZXIsCisgICAgICAgIGZpbmFsIGludCBhY2Nlc3MsCisgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lLAorICAgICAgICBmaW5hbCBTdHJpbmcgZGVzYywKKyAgICAgICAgZmluYWwgTWV0aG9kVmlzaXRvciBtdikKKyAgICB7CisgICAgICAgIHRoaXMoT3Bjb2Rlcy5BU000LCBvd25lciwgYWNjZXNzLCBuYW1lLCBkZXNjLCBtdik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgQW5hbHl6ZXJBZGFwdGVyfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcGkgdGhlIEFTTSBBUEkgdmVyc2lvbiBpbXBsZW1lbnRlZCBieSB0aGlzIHZpc2l0b3IuIE11c3QgYmUgb25lCisgICAgICogICAgICAgIG9mIHtAbGluayBPcGNvZGVzI0FTTTR9LgorICAgICAqIEBwYXJhbSBvd25lciB0aGUgb3duZXIncyBjbGFzcyBuYW1lLgorICAgICAqIEBwYXJhbSBhY2Nlc3MgdGhlIG1ldGhvZCdzIGFjY2VzcyBmbGFncyAoc2VlIHtAbGluayBPcGNvZGVzfSkuCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG1ldGhvZCdzIG5hbWUuCisgICAgICogQHBhcmFtIGRlc2MgdGhlIG1ldGhvZCdzIGRlc2NyaXB0b3IgKHNlZSB7QGxpbmsgVHlwZSBUeXBlfSkuCisgICAgICogQHBhcmFtIG12IHRoZSBtZXRob2QgdmlzaXRvciB0byB3aGljaCB0aGlzIGFkYXB0ZXIgZGVsZWdhdGVzIGNhbGxzLiBNYXkKKyAgICAgKiAgICAgICAgYmUgPHR0Pm51bGw8L3R0Pi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQW5hbHl6ZXJBZGFwdGVyKAorICAgICAgICBmaW5hbCBpbnQgYXBpLAorICAgICAgICBmaW5hbCBTdHJpbmcgb3duZXIsCisgICAgICAgIGZpbmFsIGludCBhY2Nlc3MsCisgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lLAorICAgICAgICBmaW5hbCBTdHJpbmcgZGVzYywKKyAgICAgICAgZmluYWwgTWV0aG9kVmlzaXRvciBtdikKKyAgICB7CisgICAgICAgIHN1cGVyKGFwaSwgbXYpOworICAgICAgICB0aGlzLm93bmVyID0gb3duZXI7CisgICAgICAgIGxvY2FscyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOworICAgICAgICBzdGFjayA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOworICAgICAgICB1bmluaXRpYWxpemVkVHlwZXMgPSBuZXcgSGFzaE1hcDxPYmplY3QsIE9iamVjdD4oKTsKKworICAgICAgICBpZiAoKGFjY2VzcyAmIE9wY29kZXMuQUNDX1NUQVRJQykgPT0gMCkgeworICAgICAgICAgICAgaWYgKCI8aW5pdD4iLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgIGxvY2Fscy5hZGQoT3Bjb2Rlcy5VTklOSVRJQUxJWkVEX1RISVMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsb2NhbHMuYWRkKG93bmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBUeXBlW10gdHlwZXMgPSBUeXBlLmdldEFyZ3VtZW50VHlwZXMoZGVzYyk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIFR5cGUgdHlwZSA9IHR5cGVzW2ldOworICAgICAgICAgICAgc3dpdGNoICh0eXBlLmdldFNvcnQoKSkgeworICAgICAgICAgICAgICAgIGNhc2UgVHlwZS5CT09MRUFOOgorICAgICAgICAgICAgICAgIGNhc2UgVHlwZS5DSEFSOgorICAgICAgICAgICAgICAgIGNhc2UgVHlwZS5CWVRFOgorICAgICAgICAgICAgICAgIGNhc2UgVHlwZS5TSE9SVDoKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGUuSU5UOgorICAgICAgICAgICAgICAgICAgICBsb2NhbHMuYWRkKE9wY29kZXMuSU5URUdFUik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgVHlwZS5GTE9BVDoKKyAgICAgICAgICAgICAgICAgICAgbG9jYWxzLmFkZChPcGNvZGVzLkZMT0FUKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBUeXBlLkxPTkc6CisgICAgICAgICAgICAgICAgICAgIGxvY2Fscy5hZGQoT3Bjb2Rlcy5MT05HKTsKKyAgICAgICAgICAgICAgICAgICAgbG9jYWxzLmFkZChPcGNvZGVzLlRPUCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgVHlwZS5ET1VCTEU6CisgICAgICAgICAgICAgICAgICAgIGxvY2Fscy5hZGQoT3Bjb2Rlcy5ET1VCTEUpOworICAgICAgICAgICAgICAgICAgICBsb2NhbHMuYWRkKE9wY29kZXMuVE9QKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBUeXBlLkFSUkFZOgorICAgICAgICAgICAgICAgICAgICBsb2NhbHMuYWRkKHR5cGVzW2ldLmdldERlc2NyaXB0b3IoKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIC8vIGNhc2UgVHlwZS5PQkpFQ1Q6CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgbG9jYWxzLmFkZCh0eXBlc1tpXS5nZXRJbnRlcm5hbE5hbWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEZyYW1lKAorICAgICAgICBmaW5hbCBpbnQgdHlwZSwKKyAgICAgICAgZmluYWwgaW50IG5Mb2NhbCwKKyAgICAgICAgZmluYWwgT2JqZWN0W10gbG9jYWwsCisgICAgICAgIGZpbmFsIGludCBuU3RhY2ssCisgICAgICAgIGZpbmFsIE9iamVjdFtdIHN0YWNrKQorICAgIHsKKyAgICAgICAgaWYgKHR5cGUgIT0gT3Bjb2Rlcy5GX05FVykgeyAvLyB1bmNvbXByZXNzZWQgZnJhbWUKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNsYXNzUmVhZGVyLmFjY2VwdCgpIHNob3VsZCBiZSBjYWxsZWQgd2l0aCBFWFBBTkRfRlJBTUVTIGZsYWciKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtdiAhPSBudWxsKSB7CisgICAgICAgICAgICBtdi52aXNpdEZyYW1lKHR5cGUsIG5Mb2NhbCwgbG9jYWwsIG5TdGFjaywgc3RhY2spOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRoaXMubG9jYWxzICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMubG9jYWxzLmNsZWFyKCk7CisgICAgICAgICAgICB0aGlzLnN0YWNrLmNsZWFyKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aGlzLmxvY2FscyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOworICAgICAgICAgICAgdGhpcy5zdGFjayA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOworICAgICAgICB9CisgICAgICAgIHZpc2l0RnJhbWVUeXBlcyhuTG9jYWwsIGxvY2FsLCB0aGlzLmxvY2Fscyk7CisgICAgICAgIHZpc2l0RnJhbWVUeXBlcyhuU3RhY2ssIHN0YWNrLCB0aGlzLnN0YWNrKTsKKyAgICAgICAgbWF4U3RhY2sgPSBNYXRoLm1heChtYXhTdGFjaywgdGhpcy5zdGFjay5zaXplKCkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdmlzaXRGcmFtZVR5cGVzKAorICAgICAgICBmaW5hbCBpbnQgbiwKKyAgICAgICAgZmluYWwgT2JqZWN0W10gdHlwZXMsCisgICAgICAgIGZpbmFsIExpc3Q8T2JqZWN0PiByZXN1bHQpCisgICAgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkgeworICAgICAgICAgICAgT2JqZWN0IHR5cGUgPSB0eXBlc1tpXTsKKyAgICAgICAgICAgIHJlc3VsdC5hZGQodHlwZSk7CisgICAgICAgICAgICBpZiAodHlwZSA9PSBPcGNvZGVzLkxPTkcgfHwgdHlwZSA9PSBPcGNvZGVzLkRPVUJMRSkgeworICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoT3Bjb2Rlcy5UT1ApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRJbnNuKGZpbmFsIGludCBvcGNvZGUpIHsKKyAgICAgICAgaWYgKG12ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG12LnZpc2l0SW5zbihvcGNvZGUpOworICAgICAgICB9CisgICAgICAgIGV4ZWN1dGUob3Bjb2RlLCAwLCBudWxsKTsKKyAgICAgICAgaWYgKChvcGNvZGUgPj0gT3Bjb2Rlcy5JUkVUVVJOICYmIG9wY29kZSA8PSBPcGNvZGVzLlJFVFVSTikKKyAgICAgICAgICAgICAgICB8fCBvcGNvZGUgPT0gT3Bjb2Rlcy5BVEhST1cpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMubG9jYWxzID0gbnVsbDsKKyAgICAgICAgICAgIHRoaXMuc3RhY2sgPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRJbnRJbnNuKGZpbmFsIGludCBvcGNvZGUsIGZpbmFsIGludCBvcGVyYW5kKSB7CisgICAgICAgIGlmIChtdiAhPSBudWxsKSB7CisgICAgICAgICAgICBtdi52aXNpdEludEluc24ob3Bjb2RlLCBvcGVyYW5kKTsKKyAgICAgICAgfQorICAgICAgICBleGVjdXRlKG9wY29kZSwgb3BlcmFuZCwgbnVsbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRWYXJJbnNuKGZpbmFsIGludCBvcGNvZGUsIGZpbmFsIGludCB2YXIpIHsKKyAgICAgICAgaWYgKG12ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG12LnZpc2l0VmFySW5zbihvcGNvZGUsIHZhcik7CisgICAgICAgIH0KKyAgICAgICAgZXhlY3V0ZShvcGNvZGUsIHZhciwgbnVsbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRUeXBlSW5zbihmaW5hbCBpbnQgb3Bjb2RlLCBmaW5hbCBTdHJpbmcgdHlwZSkgeworICAgICAgICBpZiAob3Bjb2RlID09IE9wY29kZXMuTkVXKSB7CisgICAgICAgICAgICBpZiAobGFiZWxzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBMYWJlbCBsID0gbmV3IExhYmVsKCk7CisgICAgICAgICAgICAgICAgbGFiZWxzID0gbmV3IEFycmF5TGlzdDxMYWJlbD4oMyk7CisgICAgICAgICAgICAgICAgbGFiZWxzLmFkZChsKTsKKyAgICAgICAgICAgICAgICBpZiAobXYgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtdi52aXNpdExhYmVsKGwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGFiZWxzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgdW5pbml0aWFsaXplZFR5cGVzLnB1dChsYWJlbHMuZ2V0KGkpLCB0eXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobXYgIT0gbnVsbCkgeworICAgICAgICAgICAgbXYudmlzaXRUeXBlSW5zbihvcGNvZGUsIHR5cGUpOworICAgICAgICB9CisgICAgICAgIGV4ZWN1dGUob3Bjb2RlLCAwLCB0eXBlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEZpZWxkSW5zbigKKyAgICAgICAgZmluYWwgaW50IG9wY29kZSwKKyAgICAgICAgZmluYWwgU3RyaW5nIG93bmVyLAorICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSwKKyAgICAgICAgZmluYWwgU3RyaW5nIGRlc2MpCisgICAgeworICAgICAgICBpZiAobXYgIT0gbnVsbCkgeworICAgICAgICAgICAgbXYudmlzaXRGaWVsZEluc24ob3Bjb2RlLCBvd25lciwgbmFtZSwgZGVzYyk7CisgICAgICAgIH0KKyAgICAgICAgZXhlY3V0ZShvcGNvZGUsIDAsIGRlc2MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TWV0aG9kSW5zbigKKyAgICAgICAgZmluYWwgaW50IG9wY29kZSwKKyAgICAgICAgZmluYWwgU3RyaW5nIG93bmVyLAorICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSwKKyAgICAgICAgZmluYWwgU3RyaW5nIGRlc2MpCisgICAgeworICAgICAgICBpZiAobXYgIT0gbnVsbCkgeworICAgICAgICAgICAgbXYudmlzaXRNZXRob2RJbnNuKG9wY29kZSwgb3duZXIsIG5hbWUsIGRlc2MpOworICAgICAgICB9CisgICAgICAgIGlmICh0aGlzLmxvY2FscyA9PSBudWxsKSB7CisgICAgICAgICAgICBsYWJlbHMgPSBudWxsOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHBvcChkZXNjKTsKKyAgICAgICAgaWYgKG9wY29kZSAhPSBPcGNvZGVzLklOVk9LRVNUQVRJQykgeworICAgICAgICAgICAgT2JqZWN0IHQgPSBwb3AoKTsKKyAgICAgICAgICAgIGlmIChvcGNvZGUgPT0gT3Bjb2Rlcy5JTlZPS0VTUEVDSUFMICYmIG5hbWUuY2hhckF0KDApID09ICc8JykgeworICAgICAgICAgICAgICAgIE9iamVjdCB1OworICAgICAgICAgICAgICAgIGlmICh0ID09IE9wY29kZXMuVU5JTklUSUFMSVpFRF9USElTKSB7CisgICAgICAgICAgICAgICAgICAgIHUgPSB0aGlzLm93bmVyOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHUgPSB1bmluaXRpYWxpemVkVHlwZXMuZ2V0KHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxvY2Fscy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBpZiAobG9jYWxzLmdldChpKSA9PSB0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbHMuc2V0KGksIHUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RhY2suc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWNrLmdldChpKSA9PSB0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5zZXQoaSwgdSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHVzaERlc2MoZGVzYyk7CisgICAgICAgIGxhYmVscyA9IG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRJbnZva2VEeW5hbWljSW5zbigKKyAgICAgICAgU3RyaW5nIG5hbWUsCisgICAgICAgIFN0cmluZyBkZXNjLAorICAgICAgICBIYW5kbGUgYnNtLAorICAgICAgICBPYmplY3QuLi4gYnNtQXJncykKKyAgICB7CisgICAgICAgIGlmIChtdiAhPSBudWxsKSB7CisgICAgICAgICAgICBtdi52aXNpdEludm9rZUR5bmFtaWNJbnNuKG5hbWUsIGRlc2MsIGJzbSwgYnNtQXJncyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMubG9jYWxzID09IG51bGwpIHsKKyAgICAgICAgICAgIGxhYmVscyA9IG51bGw7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgcG9wKGRlc2MpOworICAgICAgICBwdXNoRGVzYyhkZXNjKTsKKyAgICAgICAgbGFiZWxzID0gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEp1bXBJbnNuKGZpbmFsIGludCBvcGNvZGUsIGZpbmFsIExhYmVsIGxhYmVsKSB7CisgICAgICAgIGlmIChtdiAhPSBudWxsKSB7CisgICAgICAgICAgICBtdi52aXNpdEp1bXBJbnNuKG9wY29kZSwgbGFiZWwpOworICAgICAgICB9CisgICAgICAgIGV4ZWN1dGUob3Bjb2RlLCAwLCBudWxsKTsKKyAgICAgICAgaWYgKG9wY29kZSA9PSBPcGNvZGVzLkdPVE8pIHsKKyAgICAgICAgICAgIHRoaXMubG9jYWxzID0gbnVsbDsKKyAgICAgICAgICAgIHRoaXMuc3RhY2sgPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRMYWJlbChmaW5hbCBMYWJlbCBsYWJlbCkgeworICAgICAgICBpZiAobXYgIT0gbnVsbCkgeworICAgICAgICAgICAgbXYudmlzaXRMYWJlbChsYWJlbCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxhYmVscyA9PSBudWxsKSB7CisgICAgICAgICAgICBsYWJlbHMgPSBuZXcgQXJyYXlMaXN0PExhYmVsPigzKTsKKyAgICAgICAgfQorICAgICAgICBsYWJlbHMuYWRkKGxhYmVsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdExkY0luc24oZmluYWwgT2JqZWN0IGNzdCkgeworICAgICAgICBpZiAobXYgIT0gbnVsbCkgeworICAgICAgICAgICAgbXYudmlzaXRMZGNJbnNuKGNzdCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMubG9jYWxzID09IG51bGwpIHsKKyAgICAgICAgICAgIGxhYmVscyA9IG51bGw7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNzdCBpbnN0YW5jZW9mIEludGVnZXIpIHsKKyAgICAgICAgICAgIHB1c2goT3Bjb2Rlcy5JTlRFR0VSKTsKKyAgICAgICAgfSBlbHNlIGlmIChjc3QgaW5zdGFuY2VvZiBMb25nKSB7CisgICAgICAgICAgICBwdXNoKE9wY29kZXMuTE9ORyk7CisgICAgICAgICAgICBwdXNoKE9wY29kZXMuVE9QKTsKKyAgICAgICAgfSBlbHNlIGlmIChjc3QgaW5zdGFuY2VvZiBGbG9hdCkgeworICAgICAgICAgICAgcHVzaChPcGNvZGVzLkZMT0FUKTsKKyAgICAgICAgfSBlbHNlIGlmIChjc3QgaW5zdGFuY2VvZiBEb3VibGUpIHsKKyAgICAgICAgICAgIHB1c2goT3Bjb2Rlcy5ET1VCTEUpOworICAgICAgICAgICAgcHVzaChPcGNvZGVzLlRPUCk7CisgICAgICAgIH0gZWxzZSBpZiAoY3N0IGluc3RhbmNlb2YgU3RyaW5nKSB7CisgICAgICAgICAgICBwdXNoKCJqYXZhL2xhbmcvU3RyaW5nIik7CisgICAgICAgIH0gZWxzZSBpZiAoY3N0IGluc3RhbmNlb2YgVHlwZSkgeworICAgICAgICAgICAgaW50IHNvcnQgPSAoKFR5cGUpIGNzdCkuZ2V0U29ydCgpOworICAgICAgICAgICAgaWYgKHNvcnQgPT0gVHlwZS5PQkpFQ1QgfHwgc29ydCA9PSBUeXBlLkFSUkFZKSB7CisgICAgICAgICAgICAgICAgcHVzaCgiamF2YS9sYW5nL0NsYXNzIik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHNvcnQgPT0gVHlwZS5NRVRIT0QpIHsKKyAgICAgICAgICAgICAgICBwdXNoKCJqYXZhL2xhbmcvaW52b2tlL01ldGhvZFR5cGUiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGNzdCBpbnN0YW5jZW9mIEhhbmRsZSkgeworICAgICAgICAgICAgcHVzaCgiamF2YS9sYW5nL2ludm9rZS9NZXRob2RIYW5kbGUiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBsYWJlbHMgPSBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0SWluY0luc24oZmluYWwgaW50IHZhciwgZmluYWwgaW50IGluY3JlbWVudCkgeworICAgICAgICBpZiAobXYgIT0gbnVsbCkgeworICAgICAgICAgICAgbXYudmlzaXRJaW5jSW5zbih2YXIsIGluY3JlbWVudCk7CisgICAgICAgIH0KKyAgICAgICAgZXhlY3V0ZShPcGNvZGVzLklJTkMsIHZhciwgbnVsbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRUYWJsZVN3aXRjaEluc24oCisgICAgICAgIGZpbmFsIGludCBtaW4sCisgICAgICAgIGZpbmFsIGludCBtYXgsCisgICAgICAgIGZpbmFsIExhYmVsIGRmbHQsCisgICAgICAgIGZpbmFsIExhYmVsLi4uIGxhYmVscykKKyAgICB7CisgICAgICAgIGlmIChtdiAhPSBudWxsKSB7CisgICAgICAgICAgICBtdi52aXNpdFRhYmxlU3dpdGNoSW5zbihtaW4sIG1heCwgZGZsdCwgbGFiZWxzKTsKKyAgICAgICAgfQorICAgICAgICBleGVjdXRlKE9wY29kZXMuVEFCTEVTV0lUQ0gsIDAsIG51bGwpOworICAgICAgICB0aGlzLmxvY2FscyA9IG51bGw7CisgICAgICAgIHRoaXMuc3RhY2sgPSBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TG9va3VwU3dpdGNoSW5zbigKKyAgICAgICAgZmluYWwgTGFiZWwgZGZsdCwKKyAgICAgICAgZmluYWwgaW50W10ga2V5cywKKyAgICAgICAgZmluYWwgTGFiZWxbXSBsYWJlbHMpCisgICAgeworICAgICAgICBpZiAobXYgIT0gbnVsbCkgeworICAgICAgICAgICAgbXYudmlzaXRMb29rdXBTd2l0Y2hJbnNuKGRmbHQsIGtleXMsIGxhYmVscyk7CisgICAgICAgIH0KKyAgICAgICAgZXhlY3V0ZShPcGNvZGVzLkxPT0tVUFNXSVRDSCwgMCwgbnVsbCk7CisgICAgICAgIHRoaXMubG9jYWxzID0gbnVsbDsKKyAgICAgICAgdGhpcy5zdGFjayA9IG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRNdWx0aUFOZXdBcnJheUluc24oZmluYWwgU3RyaW5nIGRlc2MsIGZpbmFsIGludCBkaW1zKSB7CisgICAgICAgIGlmIChtdiAhPSBudWxsKSB7CisgICAgICAgICAgICBtdi52aXNpdE11bHRpQU5ld0FycmF5SW5zbihkZXNjLCBkaW1zKTsKKyAgICAgICAgfQorICAgICAgICBleGVjdXRlKE9wY29kZXMuTVVMVElBTkVXQVJSQVksIGRpbXMsIGRlc2MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TWF4cyhmaW5hbCBpbnQgbWF4U3RhY2ssIGZpbmFsIGludCBtYXhMb2NhbHMpIHsKKyAgICAgICAgaWYgKG12ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMubWF4U3RhY2sgPSBNYXRoLm1heCh0aGlzLm1heFN0YWNrLCBtYXhTdGFjayk7CisgICAgICAgICAgICB0aGlzLm1heExvY2FscyA9IE1hdGgubWF4KHRoaXMubWF4TG9jYWxzLCBtYXhMb2NhbHMpOworICAgICAgICAgICAgbXYudmlzaXRNYXhzKHRoaXMubWF4U3RhY2ssIHRoaXMubWF4TG9jYWxzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgcHJpdmF0ZSBPYmplY3QgZ2V0KGZpbmFsIGludCBsb2NhbCkgeworICAgICAgICBtYXhMb2NhbHMgPSBNYXRoLm1heChtYXhMb2NhbHMsIGxvY2FsKTsKKyAgICAgICAgcmV0dXJuIGxvY2FsIDwgbG9jYWxzLnNpemUoKSA/IGxvY2Fscy5nZXQobG9jYWwpIDogT3Bjb2Rlcy5UT1A7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldChmaW5hbCBpbnQgbG9jYWwsIGZpbmFsIE9iamVjdCB0eXBlKSB7CisgICAgICAgIG1heExvY2FscyA9IE1hdGgubWF4KG1heExvY2FscywgbG9jYWwpOworICAgICAgICB3aGlsZSAobG9jYWwgPj0gbG9jYWxzLnNpemUoKSkgeworICAgICAgICAgICAgbG9jYWxzLmFkZChPcGNvZGVzLlRPUCk7CisgICAgICAgIH0KKyAgICAgICAgbG9jYWxzLnNldChsb2NhbCwgdHlwZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHB1c2goZmluYWwgT2JqZWN0IHR5cGUpIHsKKyAgICAgICAgc3RhY2suYWRkKHR5cGUpOworICAgICAgICBtYXhTdGFjayA9IE1hdGgubWF4KG1heFN0YWNrLCBzdGFjay5zaXplKCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwdXNoRGVzYyhmaW5hbCBTdHJpbmcgZGVzYykgeworICAgICAgICBpbnQgaW5kZXggPSBkZXNjLmNoYXJBdCgwKSA9PSAnKCcgPyBkZXNjLmluZGV4T2YoJyknKSArIDEgOiAwOworICAgICAgICBzd2l0Y2ggKGRlc2MuY2hhckF0KGluZGV4KSkgeworICAgICAgICAgICAgY2FzZSAnVic6CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgY2FzZSAnWic6CisgICAgICAgICAgICBjYXNlICdDJzoKKyAgICAgICAgICAgIGNhc2UgJ0InOgorICAgICAgICAgICAgY2FzZSAnUyc6CisgICAgICAgICAgICBjYXNlICdJJzoKKyAgICAgICAgICAgICAgICBwdXNoKE9wY29kZXMuSU5URUdFUik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgY2FzZSAnRic6CisgICAgICAgICAgICAgICAgcHVzaChPcGNvZGVzLkZMT0FUKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBjYXNlICdKJzoKKyAgICAgICAgICAgICAgICBwdXNoKE9wY29kZXMuTE9ORyk7CisgICAgICAgICAgICAgICAgcHVzaChPcGNvZGVzLlRPUCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgY2FzZSAnRCc6CisgICAgICAgICAgICAgICAgcHVzaChPcGNvZGVzLkRPVUJMRSk7CisgICAgICAgICAgICAgICAgcHVzaChPcGNvZGVzLlRPUCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgY2FzZSAnWyc6CisgICAgICAgICAgICAgICAgaWYgKGluZGV4ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcHVzaChkZXNjKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBwdXNoKGRlc2Muc3Vic3RyaW5nKGluZGV4LCBkZXNjLmxlbmd0aCgpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgLy8gY2FzZSAnTCc6CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHB1c2goZGVzYy5zdWJzdHJpbmcoMSwgZGVzYy5sZW5ndGgoKSAtIDEpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBwdXNoKGRlc2Muc3Vic3RyaW5nKGluZGV4ICsgMSwgZGVzYy5sZW5ndGgoKSAtIDEpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIE9iamVjdCBwb3AoKSB7CisgICAgICAgIHJldHVybiBzdGFjay5yZW1vdmUoc3RhY2suc2l6ZSgpIC0gMSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHBvcChmaW5hbCBpbnQgbikgeworICAgICAgICBpbnQgc2l6ZSA9IHN0YWNrLnNpemUoKTsKKyAgICAgICAgaW50IGVuZCA9IHNpemUgLSBuOworICAgICAgICBmb3IgKGludCBpID0gc2l6ZSAtIDE7IGkgPj0gZW5kOyAtLWkpIHsKKyAgICAgICAgICAgIHN0YWNrLnJlbW92ZShpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwb3AoZmluYWwgU3RyaW5nIGRlc2MpIHsKKyAgICAgICAgY2hhciBjID0gZGVzYy5jaGFyQXQoMCk7CisgICAgICAgIGlmIChjID09ICcoJykgeworICAgICAgICAgICAgaW50IG4gPSAwOworICAgICAgICAgICAgVHlwZVtdIHR5cGVzID0gVHlwZS5nZXRBcmd1bWVudFR5cGVzKGRlc2MpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgICAgIG4gKz0gdHlwZXNbaV0uZ2V0U2l6ZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcG9wKG4pOworICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJ0onIHx8IGMgPT0gJ0QnKSB7CisgICAgICAgICAgICBwb3AoMik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwb3AoMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZXhlY3V0ZShmaW5hbCBpbnQgb3Bjb2RlLCBmaW5hbCBpbnQgaWFyZywgZmluYWwgU3RyaW5nIHNhcmcpIHsKKyAgICAgICAgaWYgKHRoaXMubG9jYWxzID09IG51bGwpIHsKKyAgICAgICAgICAgIGxhYmVscyA9IG51bGw7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgT2JqZWN0IHQxLCB0MiwgdDMsIHQ0OworICAgICAgICBzd2l0Y2ggKG9wY29kZSkgeworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLk5PUDoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JTkVHOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkxORUc6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRk5FRzoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5ETkVHOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkkyQjoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JMkM6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSTJTOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkdPVE86CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuUkVUVVJOOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkFDT05TVF9OVUxMOgorICAgICAgICAgICAgICAgIHB1c2goT3Bjb2Rlcy5OVUxMKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JQ09OU1RfTTE6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSUNPTlNUXzA6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSUNPTlNUXzE6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSUNPTlNUXzI6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSUNPTlNUXzM6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSUNPTlNUXzQ6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSUNPTlNUXzU6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuQklQVVNIOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLlNJUFVTSDoKKyAgICAgICAgICAgICAgICBwdXNoKE9wY29kZXMuSU5URUdFUik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuTENPTlNUXzA6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuTENPTlNUXzE6CisgICAgICAgICAgICAgICAgcHVzaChPcGNvZGVzLkxPTkcpOworICAgICAgICAgICAgICAgIHB1c2goT3Bjb2Rlcy5UT1ApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkZDT05TVF8wOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkZDT05TVF8xOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkZDT05TVF8yOgorICAgICAgICAgICAgICAgIHB1c2goT3Bjb2Rlcy5GTE9BVCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRENPTlNUXzA6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRENPTlNUXzE6CisgICAgICAgICAgICAgICAgcHVzaChPcGNvZGVzLkRPVUJMRSk7CisgICAgICAgICAgICAgICAgcHVzaChPcGNvZGVzLlRPUCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSUxPQUQ6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRkxPQUQ6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuQUxPQUQ6CisgICAgICAgICAgICAgICAgcHVzaChnZXQoaWFyZykpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkxMT0FEOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkRMT0FEOgorICAgICAgICAgICAgICAgIHB1c2goZ2V0KGlhcmcpKTsKKyAgICAgICAgICAgICAgICBwdXNoKE9wY29kZXMuVE9QKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JQUxPQUQ6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuQkFMT0FEOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkNBTE9BRDoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5TQUxPQUQ6CisgICAgICAgICAgICAgICAgcG9wKDIpOworICAgICAgICAgICAgICAgIHB1c2goT3Bjb2Rlcy5JTlRFR0VSKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5MQUxPQUQ6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRDJMOgorICAgICAgICAgICAgICAgIHBvcCgyKTsKKyAgICAgICAgICAgICAgICBwdXNoKE9wY29kZXMuTE9ORyk7CisgICAgICAgICAgICAgICAgcHVzaChPcGNvZGVzLlRPUCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRkFMT0FEOgorICAgICAgICAgICAgICAgIHBvcCgyKTsKKyAgICAgICAgICAgICAgICBwdXNoKE9wY29kZXMuRkxPQVQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkRBTE9BRDoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5MMkQ6CisgICAgICAgICAgICAgICAgcG9wKDIpOworICAgICAgICAgICAgICAgIHB1c2goT3Bjb2Rlcy5ET1VCTEUpOworICAgICAgICAgICAgICAgIHB1c2goT3Bjb2Rlcy5UT1ApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkFBTE9BRDoKKyAgICAgICAgICAgICAgICBwb3AoMSk7CisgICAgICAgICAgICAgICAgdDEgPSBwb3AoKTsKKyAgICAgICAgICAgICAgICBpZiAodDEgaW5zdGFuY2VvZiBTdHJpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgcHVzaERlc2MoKChTdHJpbmcpIHQxKS5zdWJzdHJpbmcoMSkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHB1c2goImphdmEvbGFuZy9PYmplY3QiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSVNUT1JFOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkZTVE9SRToKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5BU1RPUkU6CisgICAgICAgICAgICAgICAgdDEgPSBwb3AoKTsKKyAgICAgICAgICAgICAgICBzZXQoaWFyZywgdDEpOworICAgICAgICAgICAgICAgIGlmIChpYXJnID4gMCkgeworICAgICAgICAgICAgICAgICAgICB0MiA9IGdldChpYXJnIC0gMSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0MiA9PSBPcGNvZGVzLkxPTkcgfHwgdDIgPT0gT3Bjb2Rlcy5ET1VCTEUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldChpYXJnIC0gMSwgT3Bjb2Rlcy5UT1ApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkxTVE9SRToKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5EU1RPUkU6CisgICAgICAgICAgICAgICAgcG9wKDEpOworICAgICAgICAgICAgICAgIHQxID0gcG9wKCk7CisgICAgICAgICAgICAgICAgc2V0KGlhcmcsIHQxKTsKKyAgICAgICAgICAgICAgICBzZXQoaWFyZyArIDEsIE9wY29kZXMuVE9QKTsKKyAgICAgICAgICAgICAgICBpZiAoaWFyZyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgdDIgPSBnZXQoaWFyZyAtIDEpOworICAgICAgICAgICAgICAgICAgICBpZiAodDIgPT0gT3Bjb2Rlcy5MT05HIHx8IHQyID09IE9wY29kZXMuRE9VQkxFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXQoaWFyZyAtIDEsIE9wY29kZXMuVE9QKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JQVNUT1JFOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkJBU1RPUkU6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuQ0FTVE9SRToKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5TQVNUT1JFOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkZBU1RPUkU6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuQUFTVE9SRToKKyAgICAgICAgICAgICAgICBwb3AoMyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuTEFTVE9SRToKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5EQVNUT1JFOgorICAgICAgICAgICAgICAgIHBvcCg0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5QT1A6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSUZFUToKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JRk5FOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLklGTFQ6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSUZHRToKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JRkdUOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLklGTEU6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSVJFVFVSTjoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5GUkVUVVJOOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkFSRVRVUk46CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuVEFCTEVTV0lUQ0g6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuTE9PS1VQU1dJVENIOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkFUSFJPVzoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5NT05JVE9SRU5URVI6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuTU9OSVRPUkVYSVQ6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSUZOVUxMOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLklGTk9OTlVMTDoKKyAgICAgICAgICAgICAgICBwb3AoMSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuUE9QMjoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JRl9JQ01QRVE6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSUZfSUNNUE5FOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLklGX0lDTVBMVDoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JRl9JQ01QR0U6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSUZfSUNNUEdUOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLklGX0lDTVBMRToKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JRl9BQ01QRVE6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSUZfQUNNUE5FOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkxSRVRVUk46CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRFJFVFVSTjoKKyAgICAgICAgICAgICAgICBwb3AoMik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRFVQOgorICAgICAgICAgICAgICAgIHQxID0gcG9wKCk7CisgICAgICAgICAgICAgICAgcHVzaCh0MSk7CisgICAgICAgICAgICAgICAgcHVzaCh0MSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRFVQX1gxOgorICAgICAgICAgICAgICAgIHQxID0gcG9wKCk7CisgICAgICAgICAgICAgICAgdDIgPSBwb3AoKTsKKyAgICAgICAgICAgICAgICBwdXNoKHQxKTsKKyAgICAgICAgICAgICAgICBwdXNoKHQyKTsKKyAgICAgICAgICAgICAgICBwdXNoKHQxKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5EVVBfWDI6CisgICAgICAgICAgICAgICAgdDEgPSBwb3AoKTsKKyAgICAgICAgICAgICAgICB0MiA9IHBvcCgpOworICAgICAgICAgICAgICAgIHQzID0gcG9wKCk7CisgICAgICAgICAgICAgICAgcHVzaCh0MSk7CisgICAgICAgICAgICAgICAgcHVzaCh0Myk7CisgICAgICAgICAgICAgICAgcHVzaCh0Mik7CisgICAgICAgICAgICAgICAgcHVzaCh0MSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRFVQMjoKKyAgICAgICAgICAgICAgICB0MSA9IHBvcCgpOworICAgICAgICAgICAgICAgIHQyID0gcG9wKCk7CisgICAgICAgICAgICAgICAgcHVzaCh0Mik7CisgICAgICAgICAgICAgICAgcHVzaCh0MSk7CisgICAgICAgICAgICAgICAgcHVzaCh0Mik7CisgICAgICAgICAgICAgICAgcHVzaCh0MSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRFVQMl9YMToKKyAgICAgICAgICAgICAgICB0MSA9IHBvcCgpOworICAgICAgICAgICAgICAgIHQyID0gcG9wKCk7CisgICAgICAgICAgICAgICAgdDMgPSBwb3AoKTsKKyAgICAgICAgICAgICAgICBwdXNoKHQyKTsKKyAgICAgICAgICAgICAgICBwdXNoKHQxKTsKKyAgICAgICAgICAgICAgICBwdXNoKHQzKTsKKyAgICAgICAgICAgICAgICBwdXNoKHQyKTsKKyAgICAgICAgICAgICAgICBwdXNoKHQxKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5EVVAyX1gyOgorICAgICAgICAgICAgICAgIHQxID0gcG9wKCk7CisgICAgICAgICAgICAgICAgdDIgPSBwb3AoKTsKKyAgICAgICAgICAgICAgICB0MyA9IHBvcCgpOworICAgICAgICAgICAgICAgIHQ0ID0gcG9wKCk7CisgICAgICAgICAgICAgICAgcHVzaCh0Mik7CisgICAgICAgICAgICAgICAgcHVzaCh0MSk7CisgICAgICAgICAgICAgICAgcHVzaCh0NCk7CisgICAgICAgICAgICAgICAgcHVzaCh0Myk7CisgICAgICAgICAgICAgICAgcHVzaCh0Mik7CisgICAgICAgICAgICAgICAgcHVzaCh0MSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuU1dBUDoKKyAgICAgICAgICAgICAgICB0MSA9IHBvcCgpOworICAgICAgICAgICAgICAgIHQyID0gcG9wKCk7CisgICAgICAgICAgICAgICAgcHVzaCh0MSk7CisgICAgICAgICAgICAgICAgcHVzaCh0Mik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSUFERDoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JU1VCOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLklNVUw6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSURJVjoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JUkVNOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLklBTkQ6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSU9SOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLklYT1I6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSVNITDoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JU0hSOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLklVU0hSOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkwySToKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5EMkk6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRkNNUEw6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRkNNUEc6CisgICAgICAgICAgICAgICAgcG9wKDIpOworICAgICAgICAgICAgICAgIHB1c2goT3Bjb2Rlcy5JTlRFR0VSKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5MQUREOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkxTVUI6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuTE1VTDoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5MRElWOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkxSRU06CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuTEFORDoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5MT1I6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuTFhPUjoKKyAgICAgICAgICAgICAgICBwb3AoNCk7CisgICAgICAgICAgICAgICAgcHVzaChPcGNvZGVzLkxPTkcpOworICAgICAgICAgICAgICAgIHB1c2goT3Bjb2Rlcy5UT1ApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkZBREQ6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRlNVQjoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5GTVVMOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkZESVY6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRlJFTToKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5MMkY6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRDJGOgorICAgICAgICAgICAgICAgIHBvcCgyKTsKKyAgICAgICAgICAgICAgICBwdXNoKE9wY29kZXMuRkxPQVQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkRBREQ6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRFNVQjoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5ETVVMOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkRESVY6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRFJFTToKKyAgICAgICAgICAgICAgICBwb3AoNCk7CisgICAgICAgICAgICAgICAgcHVzaChPcGNvZGVzLkRPVUJMRSk7CisgICAgICAgICAgICAgICAgcHVzaChPcGNvZGVzLlRPUCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuTFNITDoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5MU0hSOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkxVU0hSOgorICAgICAgICAgICAgICAgIHBvcCgzKTsKKyAgICAgICAgICAgICAgICBwdXNoKE9wY29kZXMuTE9ORyk7CisgICAgICAgICAgICAgICAgcHVzaChPcGNvZGVzLlRPUCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSUlOQzoKKyAgICAgICAgICAgICAgICBzZXQoaWFyZywgT3Bjb2Rlcy5JTlRFR0VSKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JMkw6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRjJMOgorICAgICAgICAgICAgICAgIHBvcCgxKTsKKyAgICAgICAgICAgICAgICBwdXNoKE9wY29kZXMuTE9ORyk7CisgICAgICAgICAgICAgICAgcHVzaChPcGNvZGVzLlRPUCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSTJGOgorICAgICAgICAgICAgICAgIHBvcCgxKTsKKyAgICAgICAgICAgICAgICBwdXNoKE9wY29kZXMuRkxPQVQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkkyRDoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5GMkQ6CisgICAgICAgICAgICAgICAgcG9wKDEpOworICAgICAgICAgICAgICAgIHB1c2goT3Bjb2Rlcy5ET1VCTEUpOworICAgICAgICAgICAgICAgIHB1c2goT3Bjb2Rlcy5UT1ApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkYySToKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5BUlJBWUxFTkdUSDoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JTlNUQU5DRU9GOgorICAgICAgICAgICAgICAgIHBvcCgxKTsKKyAgICAgICAgICAgICAgICBwdXNoKE9wY29kZXMuSU5URUdFUik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuTENNUDoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5EQ01QTDoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5EQ01QRzoKKyAgICAgICAgICAgICAgICBwb3AoNCk7CisgICAgICAgICAgICAgICAgcHVzaChPcGNvZGVzLklOVEVHRVIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkpTUjoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5SRVQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkpTUi9SRVQgYXJlIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5HRVRTVEFUSUM6CisgICAgICAgICAgICAgICAgcHVzaERlc2Moc2FyZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuUFVUU1RBVElDOgorICAgICAgICAgICAgICAgIHBvcChzYXJnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5HRVRGSUVMRDoKKyAgICAgICAgICAgICAgICBwb3AoMSk7CisgICAgICAgICAgICAgICAgcHVzaERlc2Moc2FyZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuUFVURklFTEQ6CisgICAgICAgICAgICAgICAgcG9wKHNhcmcpOworICAgICAgICAgICAgICAgIHBvcCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLk5FVzoKKyAgICAgICAgICAgICAgICBwdXNoKGxhYmVscy5nZXQoMCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLk5FV0FSUkFZOgorICAgICAgICAgICAgICAgIHBvcCgpOworICAgICAgICAgICAgICAgIHN3aXRjaCAoaWFyZykgeworICAgICAgICAgICAgICAgICAgICBjYXNlIE9wY29kZXMuVF9CT09MRUFOOgorICAgICAgICAgICAgICAgICAgICAgICAgcHVzaERlc2MoIltaIik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBPcGNvZGVzLlRfQ0hBUjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1c2hEZXNjKCJbQyIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5UX0JZVEU6CisgICAgICAgICAgICAgICAgICAgICAgICBwdXNoRGVzYygiW0IiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIE9wY29kZXMuVF9TSE9SVDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1c2hEZXNjKCJbUyIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5UX0lOVDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1c2hEZXNjKCJbSSIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5UX0ZMT0FUOgorICAgICAgICAgICAgICAgICAgICAgICAgcHVzaERlc2MoIltGIik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBPcGNvZGVzLlRfRE9VQkxFOgorICAgICAgICAgICAgICAgICAgICAgICAgcHVzaERlc2MoIltEIik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgLy8gY2FzZSBPcGNvZGVzLlRfTE9ORzoKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1c2hEZXNjKCJbSiIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkFORVdBUlJBWToKKyAgICAgICAgICAgICAgICBwb3AoKTsKKyAgICAgICAgICAgICAgICBwdXNoRGVzYygiWyIgKyBUeXBlLmdldE9iamVjdFR5cGUoc2FyZykpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkNIRUNLQ0FTVDoKKyAgICAgICAgICAgICAgICBwb3AoKTsKKyAgICAgICAgICAgICAgICBwdXNoRGVzYyhUeXBlLmdldE9iamVjdFR5cGUoc2FyZykuZ2V0RGVzY3JpcHRvcigpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIC8vIGNhc2UgT3Bjb2Rlcy5NVUxUSUFORVdBUlJBWToKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcG9wKGlhcmcpOworICAgICAgICAgICAgICAgIHB1c2hEZXNjKHNhcmcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGxhYmVscyA9IG51bGw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS9jb21tb25zL0NvZGVTaXplRXZhbHVhdG9yLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL2NvbW1vbnMvQ29kZVNpemVFdmFsdWF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzc3NmRkCi0tLSAvZGV2L251bGwKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS9jb21tb25zL0NvZGVTaXplRXZhbHVhdG9yLmphdmEKQEAgLTAsMCArMSwyNjUgQEAKKy8qCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IE9yYWNsZSBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQorICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQorICogcXVlc3Rpb25zLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgaXMgYXZhaWxhYmxlIHVuZGVyIGFuZCBnb3Zlcm5lZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIEhvd2V2ZXIsIHRoZSBmb2xsb3dpbmcgbm90aWNlIGFjY29tcGFuaWVkIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoaXMKKyAqIGZpbGU6CisgKgorICogQVNNOiBhIHZlcnkgc21hbGwgYW5kIGZhc3QgSmF2YSBieXRlY29kZSBtYW5pcHVsYXRpb24gZnJhbWV3b3JrCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAxMSBJTlJJQSwgRnJhbmNlIFRlbGVjb20KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uY29tbW9uczsKKworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5IYW5kbGU7CitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLkxhYmVsOworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5NZXRob2RWaXNpdG9yOworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5PcGNvZGVzOworCisvKioKKyAqIEEge0BsaW5rIE1ldGhvZFZpc2l0b3J9IHRoYXQgY2FuIGJlIHVzZWQgdG8gYXBwcm94aW1hdGUgbWV0aG9kIHNpemUuCisgKgorICogQGF1dGhvciBFdWdlbmUgS3VsZXNob3YKKyAqLworcHVibGljIGNsYXNzIENvZGVTaXplRXZhbHVhdG9yIGV4dGVuZHMgTWV0aG9kVmlzaXRvciBpbXBsZW1lbnRzIE9wY29kZXMgeworCisgICAgcHJpdmF0ZSBpbnQgbWluU2l6ZTsKKworICAgIHByaXZhdGUgaW50IG1heFNpemU7CisKKyAgICBwdWJsaWMgQ29kZVNpemVFdmFsdWF0b3IoZmluYWwgTWV0aG9kVmlzaXRvciBtdikgeworICAgICAgICB0aGlzKE9wY29kZXMuQVNNNCwgbXYpOworICAgIH0KKworICAgIHByb3RlY3RlZCBDb2RlU2l6ZUV2YWx1YXRvcihmaW5hbCBpbnQgYXBpLCBmaW5hbCBNZXRob2RWaXNpdG9yIG12KSB7CisgICAgICAgIHN1cGVyKGFwaSwgbXYpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0TWluU2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubWluU2l6ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldE1heFNpemUoKSB7CisgICAgICAgIHJldHVybiB0aGlzLm1heFNpemU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRJbnNuKGZpbmFsIGludCBvcGNvZGUpIHsKKyAgICAgICAgbWluU2l6ZSArPSAxOworICAgICAgICBtYXhTaXplICs9IDE7CisgICAgICAgIGlmIChtdiAhPSBudWxsKSB7CisgICAgICAgICAgICBtdi52aXNpdEluc24ob3Bjb2RlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0SW50SW5zbihmaW5hbCBpbnQgb3Bjb2RlLCBmaW5hbCBpbnQgb3BlcmFuZCkgeworICAgICAgICBpZiAob3Bjb2RlID09IFNJUFVTSCkgeworICAgICAgICAgICAgbWluU2l6ZSArPSAzOworICAgICAgICAgICAgbWF4U2l6ZSArPSAzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWluU2l6ZSArPSAyOworICAgICAgICAgICAgbWF4U2l6ZSArPSAyOworICAgICAgICB9CisgICAgICAgIGlmIChtdiAhPSBudWxsKSB7CisgICAgICAgICAgICBtdi52aXNpdEludEluc24ob3Bjb2RlLCBvcGVyYW5kKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0VmFySW5zbihmaW5hbCBpbnQgb3Bjb2RlLCBmaW5hbCBpbnQgdmFyKSB7CisgICAgICAgIGlmICh2YXIgPCA0ICYmIG9wY29kZSAhPSBSRVQpIHsKKyAgICAgICAgICAgIG1pblNpemUgKz0gMTsKKyAgICAgICAgICAgIG1heFNpemUgKz0gMTsKKyAgICAgICAgfSBlbHNlIGlmICh2YXIgPj0gMjU2KSB7CisgICAgICAgICAgICBtaW5TaXplICs9IDQ7CisgICAgICAgICAgICBtYXhTaXplICs9IDQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtaW5TaXplICs9IDI7CisgICAgICAgICAgICBtYXhTaXplICs9IDI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG12ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG12LnZpc2l0VmFySW5zbihvcGNvZGUsIHZhcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFR5cGVJbnNuKGZpbmFsIGludCBvcGNvZGUsIGZpbmFsIFN0cmluZyB0eXBlKSB7CisgICAgICAgIG1pblNpemUgKz0gMzsKKyAgICAgICAgbWF4U2l6ZSArPSAzOworICAgICAgICBpZiAobXYgIT0gbnVsbCkgeworICAgICAgICAgICAgbXYudmlzaXRUeXBlSW5zbihvcGNvZGUsIHR5cGUpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRGaWVsZEluc24oCisgICAgICAgIGZpbmFsIGludCBvcGNvZGUsCisgICAgICAgIGZpbmFsIFN0cmluZyBvd25lciwKKyAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUsCisgICAgICAgIGZpbmFsIFN0cmluZyBkZXNjKQorICAgIHsKKyAgICAgICAgbWluU2l6ZSArPSAzOworICAgICAgICBtYXhTaXplICs9IDM7CisgICAgICAgIGlmIChtdiAhPSBudWxsKSB7CisgICAgICAgICAgICBtdi52aXNpdEZpZWxkSW5zbihvcGNvZGUsIG93bmVyLCBuYW1lLCBkZXNjKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TWV0aG9kSW5zbigKKyAgICAgICAgZmluYWwgaW50IG9wY29kZSwKKyAgICAgICAgZmluYWwgU3RyaW5nIG93bmVyLAorICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSwKKyAgICAgICAgZmluYWwgU3RyaW5nIGRlc2MpCisgICAgeworICAgICAgICBpZiAob3Bjb2RlID09IElOVk9LRUlOVEVSRkFDRSkgeworICAgICAgICAgICAgbWluU2l6ZSArPSA1OworICAgICAgICAgICAgbWF4U2l6ZSArPSA1OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWluU2l6ZSArPSAzOworICAgICAgICAgICAgbWF4U2l6ZSArPSAzOworICAgICAgICB9CisgICAgICAgIGlmIChtdiAhPSBudWxsKSB7CisgICAgICAgICAgICBtdi52aXNpdE1ldGhvZEluc24ob3Bjb2RlLCBvd25lciwgbmFtZSwgZGVzYyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEludm9rZUR5bmFtaWNJbnNuKAorICAgICAgICBTdHJpbmcgbmFtZSwKKyAgICAgICAgU3RyaW5nIGRlc2MsCisgICAgICAgIEhhbmRsZSBic20sCisgICAgICAgIE9iamVjdC4uLiBic21BcmdzKQorICAgIHsKKyAgICAgICAgbWluU2l6ZSArPSA1OworICAgICAgICBtYXhTaXplICs9IDU7CisgICAgICAgIGlmIChtdiAhPSBudWxsKSB7CisgICAgICAgICAgICBtdi52aXNpdEludm9rZUR5bmFtaWNJbnNuKG5hbWUsIGRlc2MsIGJzbSwgYnNtQXJncyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEp1bXBJbnNuKGZpbmFsIGludCBvcGNvZGUsIGZpbmFsIExhYmVsIGxhYmVsKSB7CisgICAgICAgIG1pblNpemUgKz0gMzsKKyAgICAgICAgaWYgKG9wY29kZSA9PSBHT1RPIHx8IG9wY29kZSA9PSBKU1IpIHsKKyAgICAgICAgICAgIG1heFNpemUgKz0gNTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1heFNpemUgKz0gODsKKyAgICAgICAgfQorICAgICAgICBpZiAobXYgIT0gbnVsbCkgeworICAgICAgICAgICAgbXYudmlzaXRKdW1wSW5zbihvcGNvZGUsIGxhYmVsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TGRjSW5zbihmaW5hbCBPYmplY3QgY3N0KSB7CisgICAgICAgIGlmIChjc3QgaW5zdGFuY2VvZiBMb25nIHx8IGNzdCBpbnN0YW5jZW9mIERvdWJsZSkgeworICAgICAgICAgICAgbWluU2l6ZSArPSAzOworICAgICAgICAgICAgbWF4U2l6ZSArPSAzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWluU2l6ZSArPSAyOworICAgICAgICAgICAgbWF4U2l6ZSArPSAzOworICAgICAgICB9CisgICAgICAgIGlmIChtdiAhPSBudWxsKSB7CisgICAgICAgICAgICBtdi52aXNpdExkY0luc24oY3N0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0SWluY0luc24oZmluYWwgaW50IHZhciwgZmluYWwgaW50IGluY3JlbWVudCkgeworICAgICAgICBpZiAodmFyID4gMjU1IHx8IGluY3JlbWVudCA+IDEyNyB8fCBpbmNyZW1lbnQgPCAtMTI4KSB7CisgICAgICAgICAgICBtaW5TaXplICs9IDY7CisgICAgICAgICAgICBtYXhTaXplICs9IDY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtaW5TaXplICs9IDM7CisgICAgICAgICAgICBtYXhTaXplICs9IDM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG12ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG12LnZpc2l0SWluY0luc24odmFyLCBpbmNyZW1lbnQpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRUYWJsZVN3aXRjaEluc24oCisgICAgICAgIGZpbmFsIGludCBtaW4sCisgICAgICAgIGZpbmFsIGludCBtYXgsCisgICAgICAgIGZpbmFsIExhYmVsIGRmbHQsCisgICAgICAgIGZpbmFsIExhYmVsLi4uIGxhYmVscykKKyAgICB7CisgICAgICAgIG1pblNpemUgKz0gMTMgKyBsYWJlbHMubGVuZ3RoICogNDsKKyAgICAgICAgbWF4U2l6ZSArPSAxNiArIGxhYmVscy5sZW5ndGggKiA0OworICAgICAgICBpZiAobXYgIT0gbnVsbCkgeworICAgICAgICAgICAgbXYudmlzaXRUYWJsZVN3aXRjaEluc24obWluLCBtYXgsIGRmbHQsIGxhYmVscyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdExvb2t1cFN3aXRjaEluc24oCisgICAgICAgIGZpbmFsIExhYmVsIGRmbHQsCisgICAgICAgIGZpbmFsIGludFtdIGtleXMsCisgICAgICAgIGZpbmFsIExhYmVsW10gbGFiZWxzKQorICAgIHsKKyAgICAgICAgbWluU2l6ZSArPSA5ICsga2V5cy5sZW5ndGggKiA4OworICAgICAgICBtYXhTaXplICs9IDEyICsga2V5cy5sZW5ndGggKiA4OworICAgICAgICBpZiAobXYgIT0gbnVsbCkgeworICAgICAgICAgICAgbXYudmlzaXRMb29rdXBTd2l0Y2hJbnNuKGRmbHQsIGtleXMsIGxhYmVscyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdE11bHRpQU5ld0FycmF5SW5zbihmaW5hbCBTdHJpbmcgZGVzYywgZmluYWwgaW50IGRpbXMpIHsKKyAgICAgICAgbWluU2l6ZSArPSA0OworICAgICAgICBtYXhTaXplICs9IDQ7CisgICAgICAgIGlmIChtdiAhPSBudWxsKSB7CisgICAgICAgICAgICBtdi52aXNpdE11bHRpQU5ld0FycmF5SW5zbihkZXNjLCBkaW1zKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vY29tbW9ucy9HZW5lcmF0b3JBZGFwdGVyLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL2NvbW1vbnMvR2VuZXJhdG9yQWRhcHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4NmMxOTgKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL2NvbW1vbnMvR2VuZXJhdG9yQWRhcHRlci5qYXZhCkBAIC0wLDAgKzEsMTU3OCBAQAorLyoKKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgT3JhY2xlIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCisgKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CisgKiBxdWVzdGlvbnMuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBpcyBhdmFpbGFibGUgdW5kZXIgYW5kIGdvdmVybmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogSG93ZXZlciwgdGhlIGZvbGxvd2luZyBub3RpY2UgYWNjb21wYW5pZWQgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhpcworICogZmlsZToKKyAqCisgKiBBU006IGEgdmVyeSBzbWFsbCBhbmQgZmFzdCBKYXZhIGJ5dGVjb2RlIG1hbmlwdWxhdGlvbiBmcmFtZXdvcmsKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDExIElOUklBLCBGcmFuY2UgVGVsZWNvbQorICogQ29weXJpZ2h0IChjKSAyMDExIEdvb2dsZQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5jb21tb25zOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLkNsYXNzVmlzaXRvcjsKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uSGFuZGxlOworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5MYWJlbDsKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uTWV0aG9kVmlzaXRvcjsKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uT3Bjb2RlczsKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uVHlwZTsKKworLyoqCisgKiBBIHtAbGluayBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uTWV0aG9kVmlzaXRvcn0gd2l0aCBjb252ZW5pZW50IG1ldGhvZHMgdG8gZ2VuZXJhdGUKKyAqIGNvZGUuIEZvciBleGFtcGxlLCB1c2luZyB0aGlzIGFkYXB0ZXIsIHRoZSBjbGFzcyBiZWxvdworICoKKyAqIDxwcmU+CisgKiBwdWJsaWMgY2xhc3MgRXhhbXBsZSB7CisgKiAgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICogICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oJnF1b3Q7SGVsbG8gd29ybGQhJnF1b3Q7KTsKKyAqICAgICB9CisgKiB9CisgKiA8L3ByZT4KKyAqCisgKiBjYW4gYmUgZ2VuZXJhdGVkIGFzIGZvbGxvd3M6CisgKgorICogPHByZT4KKyAqIENsYXNzV3JpdGVyIGN3ID0gbmV3IENsYXNzV3JpdGVyKHRydWUpOworICogY3cudmlzaXQoVjFfMSwgQUNDX1BVQkxJQywgJnF1b3Q7RXhhbXBsZSZxdW90OywgbnVsbCwgJnF1b3Q7amF2YS9sYW5nL09iamVjdCZxdW90OywgbnVsbCk7CisgKgorICogTWV0aG9kIG0gPSBNZXRob2QuZ2V0TWV0aG9kKCZxdW90O3ZvaWQgJmx0O2luaXQmZ3Q7ICgpJnF1b3Q7KTsKKyAqIEdlbmVyYXRvckFkYXB0ZXIgbWcgPSBuZXcgR2VuZXJhdG9yQWRhcHRlcihBQ0NfUFVCTElDLCBtLCBudWxsLCBudWxsLCBjdyk7CisgKiBtZy5sb2FkVGhpcygpOworICogbWcuaW52b2tlQ29uc3RydWN0b3IoVHlwZS5nZXRUeXBlKE9iamVjdC5jbGFzcyksIG0pOworICogbWcucmV0dXJuVmFsdWUoKTsKKyAqIG1nLmVuZE1ldGhvZCgpOworICoKKyAqIG0gPSBNZXRob2QuZ2V0TWV0aG9kKCZxdW90O3ZvaWQgbWFpbiAoU3RyaW5nW10pJnF1b3Q7KTsKKyAqIG1nID0gbmV3IEdlbmVyYXRvckFkYXB0ZXIoQUNDX1BVQkxJQyArIEFDQ19TVEFUSUMsIG0sIG51bGwsIG51bGwsIGN3KTsKKyAqIG1nLmdldFN0YXRpYyhUeXBlLmdldFR5cGUoU3lzdGVtLmNsYXNzKSwgJnF1b3Q7b3V0JnF1b3Q7LCBUeXBlLmdldFR5cGUoUHJpbnRTdHJlYW0uY2xhc3MpKTsKKyAqIG1nLnB1c2goJnF1b3Q7SGVsbG8gd29ybGQhJnF1b3Q7KTsKKyAqIG1nLmludm9rZVZpcnR1YWwoVHlwZS5nZXRUeXBlKFByaW50U3RyZWFtLmNsYXNzKSwgTWV0aG9kLmdldE1ldGhvZCgmcXVvdDt2b2lkIHByaW50bG4gKFN0cmluZykmcXVvdDspKTsKKyAqIG1nLnJldHVyblZhbHVlKCk7CisgKiBtZy5lbmRNZXRob2QoKTsKKyAqCisgKiBjdy52aXNpdEVuZCgpOworICogPC9wcmU+CisgKgorICogQGF1dGhvciBKdW96YXMgQmFsaXVrYQorICogQGF1dGhvciBDaHJpcyBOb2tsZWJlcmcKKyAqIEBhdXRob3IgRXJpYyBCcnVuZXRvbgorICogQGF1dGhvciBQcmFzaGFudCBEZXZhCisgKi8KK3B1YmxpYyBjbGFzcyBHZW5lcmF0b3JBZGFwdGVyIGV4dGVuZHMgTG9jYWxWYXJpYWJsZXNTb3J0ZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMREVTQyA9ICJMamF2YS9sYW5nL0NsYXNzOyI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUeXBlIEJZVEVfVFlQRSA9IFR5cGUuZ2V0T2JqZWN0VHlwZSgiamF2YS9sYW5nL0J5dGUiKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFR5cGUgQk9PTEVBTl9UWVBFID0gVHlwZS5nZXRPYmplY3RUeXBlKCJqYXZhL2xhbmcvQm9vbGVhbiIpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHlwZSBTSE9SVF9UWVBFID0gVHlwZS5nZXRPYmplY3RUeXBlKCJqYXZhL2xhbmcvU2hvcnQiKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFR5cGUgQ0hBUkFDVEVSX1RZUEUgPSBUeXBlLmdldE9iamVjdFR5cGUoImphdmEvbGFuZy9DaGFyYWN0ZXIiKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFR5cGUgSU5URUdFUl9UWVBFID0gVHlwZS5nZXRPYmplY3RUeXBlKCJqYXZhL2xhbmcvSW50ZWdlciIpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHlwZSBGTE9BVF9UWVBFID0gVHlwZS5nZXRPYmplY3RUeXBlKCJqYXZhL2xhbmcvRmxvYXQiKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFR5cGUgTE9OR19UWVBFID0gVHlwZS5nZXRPYmplY3RUeXBlKCJqYXZhL2xhbmcvTG9uZyIpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHlwZSBET1VCTEVfVFlQRSA9IFR5cGUuZ2V0T2JqZWN0VHlwZSgiamF2YS9sYW5nL0RvdWJsZSIpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHlwZSBOVU1CRVJfVFlQRSA9IFR5cGUuZ2V0T2JqZWN0VHlwZSgiamF2YS9sYW5nL051bWJlciIpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHlwZSBPQkpFQ1RfVFlQRSA9IFR5cGUuZ2V0T2JqZWN0VHlwZSgiamF2YS9sYW5nL09iamVjdCIpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWV0aG9kIEJPT0xFQU5fVkFMVUUgPSBNZXRob2QuZ2V0TWV0aG9kKCJib29sZWFuIGJvb2xlYW5WYWx1ZSgpIik7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNZXRob2QgQ0hBUl9WQUxVRSA9IE1ldGhvZC5nZXRNZXRob2QoImNoYXIgY2hhclZhbHVlKCkiKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1ldGhvZCBJTlRfVkFMVUUgPSBNZXRob2QuZ2V0TWV0aG9kKCJpbnQgaW50VmFsdWUoKSIpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWV0aG9kIEZMT0FUX1ZBTFVFID0gTWV0aG9kLmdldE1ldGhvZCgiZmxvYXQgZmxvYXRWYWx1ZSgpIik7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNZXRob2QgTE9OR19WQUxVRSA9IE1ldGhvZC5nZXRNZXRob2QoImxvbmcgbG9uZ1ZhbHVlKCkiKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1ldGhvZCBET1VCTEVfVkFMVUUgPSBNZXRob2QuZ2V0TWV0aG9kKCJkb3VibGUgZG91YmxlVmFsdWUoKSIpOworCisgICAgLyoqCisgICAgICogQ29uc3RhbnQgZm9yIHRoZSB7QGxpbmsgI21hdGggbWF0aH0gbWV0aG9kLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFERCA9IE9wY29kZXMuSUFERDsKKworICAgIC8qKgorICAgICAqIENvbnN0YW50IGZvciB0aGUge0BsaW5rICNtYXRoIG1hdGh9IG1ldGhvZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVUIgPSBPcGNvZGVzLklTVUI7CisKKyAgICAvKioKKyAgICAgKiBDb25zdGFudCBmb3IgdGhlIHtAbGluayAjbWF0aCBtYXRofSBtZXRob2QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVVMID0gT3Bjb2Rlcy5JTVVMOworCisgICAgLyoqCisgICAgICogQ29uc3RhbnQgZm9yIHRoZSB7QGxpbmsgI21hdGggbWF0aH0gbWV0aG9kLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJViA9IE9wY29kZXMuSURJVjsKKworICAgIC8qKgorICAgICAqIENvbnN0YW50IGZvciB0aGUge0BsaW5rICNtYXRoIG1hdGh9IG1ldGhvZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRU0gPSBPcGNvZGVzLklSRU07CisKKyAgICAvKioKKyAgICAgKiBDb25zdGFudCBmb3IgdGhlIHtAbGluayAjbWF0aCBtYXRofSBtZXRob2QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkVHID0gT3Bjb2Rlcy5JTkVHOworCisgICAgLyoqCisgICAgICogQ29uc3RhbnQgZm9yIHRoZSB7QGxpbmsgI21hdGggbWF0aH0gbWV0aG9kLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNITCA9IE9wY29kZXMuSVNITDsKKworICAgIC8qKgorICAgICAqIENvbnN0YW50IGZvciB0aGUge0BsaW5rICNtYXRoIG1hdGh9IG1ldGhvZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSFIgPSBPcGNvZGVzLklTSFI7CisKKyAgICAvKioKKyAgICAgKiBDb25zdGFudCBmb3IgdGhlIHtAbGluayAjbWF0aCBtYXRofSBtZXRob2QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVVNIUiA9IE9wY29kZXMuSVVTSFI7CisKKyAgICAvKioKKyAgICAgKiBDb25zdGFudCBmb3IgdGhlIHtAbGluayAjbWF0aCBtYXRofSBtZXRob2QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQU5EID0gT3Bjb2Rlcy5JQU5EOworCisgICAgLyoqCisgICAgICogQ29uc3RhbnQgZm9yIHRoZSB7QGxpbmsgI21hdGggbWF0aH0gbWV0aG9kLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9SID0gT3Bjb2Rlcy5JT1I7CisKKyAgICAvKioKKyAgICAgKiBDb25zdGFudCBmb3IgdGhlIHtAbGluayAjbWF0aCBtYXRofSBtZXRob2QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE9SID0gT3Bjb2Rlcy5JWE9SOworCisgICAgLyoqCisgICAgICogQ29uc3RhbnQgZm9yIHRoZSB7QGxpbmsgI2lmQ21wIGlmQ21wfSBtZXRob2QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVEgPSBPcGNvZGVzLklGRVE7CisKKyAgICAvKioKKyAgICAgKiBDb25zdGFudCBmb3IgdGhlIHtAbGluayAjaWZDbXAgaWZDbXB9IG1ldGhvZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBORSA9IE9wY29kZXMuSUZORTsKKworICAgIC8qKgorICAgICAqIENvbnN0YW50IGZvciB0aGUge0BsaW5rICNpZkNtcCBpZkNtcH0gbWV0aG9kLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExUID0gT3Bjb2Rlcy5JRkxUOworCisgICAgLyoqCisgICAgICogQ29uc3RhbnQgZm9yIHRoZSB7QGxpbmsgI2lmQ21wIGlmQ21wfSBtZXRob2QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0UgPSBPcGNvZGVzLklGR0U7CisKKyAgICAvKioKKyAgICAgKiBDb25zdGFudCBmb3IgdGhlIHtAbGluayAjaWZDbXAgaWZDbXB9IG1ldGhvZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHVCA9IE9wY29kZXMuSUZHVDsKKworICAgIC8qKgorICAgICAqIENvbnN0YW50IGZvciB0aGUge0BsaW5rICNpZkNtcCBpZkNtcH0gbWV0aG9kLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExFID0gT3Bjb2Rlcy5JRkxFOworCisgICAgLyoqCisgICAgICogQWNjZXNzIGZsYWdzIG9mIHRoZSBtZXRob2QgdmlzaXRlZCBieSB0aGlzIGFkYXB0ZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgYWNjZXNzOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHR5cGUgb2YgdGhlIG1ldGhvZCB2aXNpdGVkIGJ5IHRoaXMgYWRhcHRlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIFR5cGUgcmV0dXJuVHlwZTsKKworICAgIC8qKgorICAgICAqIEFyZ3VtZW50IHR5cGVzIG9mIHRoZSBtZXRob2QgdmlzaXRlZCBieSB0aGlzIGFkYXB0ZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBUeXBlW10gYXJndW1lbnRUeXBlczsKKworICAgIC8qKgorICAgICAqIFR5cGVzIG9mIHRoZSBsb2NhbCB2YXJpYWJsZXMgb2YgdGhlIG1ldGhvZCB2aXNpdGVkIGJ5IHRoaXMgYWRhcHRlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8VHlwZT4gbG9jYWxUeXBlcyA9IG5ldyBBcnJheUxpc3Q8VHlwZT4oKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIEdlbmVyYXRvckFkYXB0ZXJ9LiA8aT5TdWJjbGFzc2VzIG11c3Qgbm90IHVzZSB0aGlzCisgICAgICogY29uc3RydWN0b3I8L2k+LiBJbnN0ZWFkLCB0aGV5IG11c3QgdXNlIHRoZQorICAgICAqIHtAbGluayAjR2VuZXJhdG9yQWRhcHRlcihpbnQsIE1ldGhvZFZpc2l0b3IsIGludCwgU3RyaW5nLCBTdHJpbmcpfQorICAgICAqIHZlcnNpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbXYgdGhlIG1ldGhvZCB2aXNpdG9yIHRvIHdoaWNoIHRoaXMgYWRhcHRlciBkZWxlZ2F0ZXMgY2FsbHMuCisgICAgICogQHBhcmFtIGFjY2VzcyB0aGUgbWV0aG9kJ3MgYWNjZXNzIGZsYWdzIChzZWUge0BsaW5rIE9wY29kZXN9KS4KKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbWV0aG9kJ3MgbmFtZS4KKyAgICAgKiBAcGFyYW0gZGVzYyB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRvciAoc2VlIHtAbGluayBUeXBlIFR5cGV9KS4KKyAgICAgKi8KKyAgICBwdWJsaWMgR2VuZXJhdG9yQWRhcHRlcigKKyAgICAgICAgZmluYWwgTWV0aG9kVmlzaXRvciBtdiwKKyAgICAgICAgZmluYWwgaW50IGFjY2VzcywKKyAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUsCisgICAgICAgIGZpbmFsIFN0cmluZyBkZXNjKQorICAgIHsKKyAgICAgICAgdGhpcyhPcGNvZGVzLkFTTTQsIG12LCBhY2Nlc3MsIG5hbWUsIGRlc2MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIEdlbmVyYXRvckFkYXB0ZXJ9LgorICAgICAqCisgICAgICogQHBhcmFtIGFwaSB0aGUgQVNNIEFQSSB2ZXJzaW9uIGltcGxlbWVudGVkIGJ5IHRoaXMgdmlzaXRvci4gTXVzdCBiZSBvbmUKKyAgICAgKiAgICAgICAgb2Yge0BsaW5rIE9wY29kZXMjQVNNNH0uCisgICAgICogQHBhcmFtIG12IHRoZSBtZXRob2QgdmlzaXRvciB0byB3aGljaCB0aGlzIGFkYXB0ZXIgZGVsZWdhdGVzIGNhbGxzLgorICAgICAqIEBwYXJhbSBhY2Nlc3MgdGhlIG1ldGhvZCdzIGFjY2VzcyBmbGFncyAoc2VlIHtAbGluayBPcGNvZGVzfSkuCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG1ldGhvZCdzIG5hbWUuCisgICAgICogQHBhcmFtIGRlc2MgdGhlIG1ldGhvZCdzIGRlc2NyaXB0b3IgKHNlZSB7QGxpbmsgVHlwZSBUeXBlfSkuCisgICAgICovCisgICAgcHJvdGVjdGVkIEdlbmVyYXRvckFkYXB0ZXIoCisgICAgICAgIGZpbmFsIGludCBhcGksCisgICAgICAgIGZpbmFsIE1ldGhvZFZpc2l0b3IgbXYsCisgICAgICAgIGZpbmFsIGludCBhY2Nlc3MsCisgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lLAorICAgICAgICBmaW5hbCBTdHJpbmcgZGVzYykKKyAgICB7CisgICAgICAgIHN1cGVyKGFwaSwgYWNjZXNzLCBkZXNjLCBtdik7CisgICAgICAgIHRoaXMuYWNjZXNzID0gYWNjZXNzOworICAgICAgICB0aGlzLnJldHVyblR5cGUgPSBUeXBlLmdldFJldHVyblR5cGUoZGVzYyk7CisgICAgICAgIHRoaXMuYXJndW1lbnRUeXBlcyA9IFR5cGUuZ2V0QXJndW1lbnRUeXBlcyhkZXNjKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBHZW5lcmF0b3JBZGFwdGVyfS4gPGk+U3ViY2xhc3NlcyBtdXN0IG5vdCB1c2UgdGhpcworICAgICAqIGNvbnN0cnVjdG9yPC9pPi4gSW5zdGVhZCwgdGhleSBtdXN0IHVzZSB0aGUKKyAgICAgKiB7QGxpbmsgI0dlbmVyYXRvckFkYXB0ZXIoaW50LCBNZXRob2RWaXNpdG9yLCBpbnQsIFN0cmluZywgU3RyaW5nKX0KKyAgICAgKiB2ZXJzaW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGFjY2VzcyBhY2Nlc3MgZmxhZ3Mgb2YgdGhlIGFkYXB0ZWQgbWV0aG9kLgorICAgICAqIEBwYXJhbSBtZXRob2QgdGhlIGFkYXB0ZWQgbWV0aG9kLgorICAgICAqIEBwYXJhbSBtdiB0aGUgbWV0aG9kIHZpc2l0b3IgdG8gd2hpY2ggdGhpcyBhZGFwdGVyIGRlbGVnYXRlcyBjYWxscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgR2VuZXJhdG9yQWRhcHRlcigKKyAgICAgICAgZmluYWwgaW50IGFjY2VzcywKKyAgICAgICAgZmluYWwgTWV0aG9kIG1ldGhvZCwKKyAgICAgICAgZmluYWwgTWV0aG9kVmlzaXRvciBtdikKKyAgICB7CisgICAgICAgIHRoaXMobXYsIGFjY2VzcywgbnVsbCwgbWV0aG9kLmdldERlc2NyaXB0b3IoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgR2VuZXJhdG9yQWRhcHRlcn0uIDxpPlN1YmNsYXNzZXMgbXVzdCBub3QgdXNlIHRoaXMKKyAgICAgKiBjb25zdHJ1Y3RvcjwvaT4uIEluc3RlYWQsIHRoZXkgbXVzdCB1c2UgdGhlCisgICAgICoge0BsaW5rICNHZW5lcmF0b3JBZGFwdGVyKGludCwgTWV0aG9kVmlzaXRvciwgaW50LCBTdHJpbmcsIFN0cmluZyl9CisgICAgICogdmVyc2lvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhY2Nlc3MgYWNjZXNzIGZsYWdzIG9mIHRoZSBhZGFwdGVkIG1ldGhvZC4KKyAgICAgKiBAcGFyYW0gbWV0aG9kIHRoZSBhZGFwdGVkIG1ldGhvZC4KKyAgICAgKiBAcGFyYW0gc2lnbmF0dXJlIHRoZSBzaWduYXR1cmUgb2YgdGhlIGFkYXB0ZWQgbWV0aG9kIChtYXkgYmUKKyAgICAgKiAgICAgICAgPHR0Pm51bGw8L3R0PikuCisgICAgICogQHBhcmFtIGV4Y2VwdGlvbnMgdGhlIGV4Y2VwdGlvbnMgdGhyb3duIGJ5IHRoZSBhZGFwdGVkIG1ldGhvZCAobWF5IGJlCisgICAgICogICAgICAgIDx0dD5udWxsPC90dD4pLgorICAgICAqIEBwYXJhbSBjdiB0aGUgY2xhc3MgdmlzaXRvciB0byB3aGljaCB0aGlzIGFkYXB0ZXIgZGVsZWdhdGVzIGNhbGxzLgorICAgICAqLworICAgIHB1YmxpYyBHZW5lcmF0b3JBZGFwdGVyKAorICAgICAgICBmaW5hbCBpbnQgYWNjZXNzLAorICAgICAgICBmaW5hbCBNZXRob2QgbWV0aG9kLAorICAgICAgICBmaW5hbCBTdHJpbmcgc2lnbmF0dXJlLAorICAgICAgICBmaW5hbCBUeXBlW10gZXhjZXB0aW9ucywKKyAgICAgICAgZmluYWwgQ2xhc3NWaXNpdG9yIGN2KQorICAgIHsKKyAgICAgICAgdGhpcyhhY2Nlc3MsIG1ldGhvZCwgY3YudmlzaXRNZXRob2QoYWNjZXNzLAorICAgICAgICAgICAgICAgIG1ldGhvZC5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgbWV0aG9kLmdldERlc2NyaXB0b3IoKSwKKyAgICAgICAgICAgICAgICBzaWduYXR1cmUsCisgICAgICAgICAgICAgICAgZ2V0SW50ZXJuYWxOYW1lcyhleGNlcHRpb25zKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGludGVybmFsIG5hbWVzIG9mIHRoZSBnaXZlbiB0eXBlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlcyBhIHNldCBvZiB0eXBlcy4KKyAgICAgKiBAcmV0dXJuIHRoZSBpbnRlcm5hbCBuYW1lcyBvZiB0aGUgZ2l2ZW4gdHlwZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gZ2V0SW50ZXJuYWxOYW1lcyhmaW5hbCBUeXBlW10gdHlwZXMpIHsKKyAgICAgICAgaWYgKHR5cGVzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIFN0cmluZ1tdIG5hbWVzID0gbmV3IFN0cmluZ1t0eXBlcy5sZW5ndGhdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBuYW1lc1tpXSA9IHR5cGVzW2ldLmdldEludGVybmFsTmFtZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuYW1lczsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBJbnN0cnVjdGlvbnMgdG8gcHVzaCBjb25zdGFudHMgb24gdGhlIHN0YWNrCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZXMgdGhlIGluc3RydWN0aW9uIHRvIHB1c2ggdGhlIGdpdmVuIHZhbHVlIG9uIHRoZSBzdGFjay4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gYmUgcHVzaGVkIG9uIHRoZSBzdGFjay4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwdXNoKGZpbmFsIGJvb2xlYW4gdmFsdWUpIHsKKyAgICAgICAgcHVzaCh2YWx1ZSA/IDEgOiAwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZXMgdGhlIGluc3RydWN0aW9uIHRvIHB1c2ggdGhlIGdpdmVuIHZhbHVlIG9uIHRoZSBzdGFjay4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gYmUgcHVzaGVkIG9uIHRoZSBzdGFjay4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwdXNoKGZpbmFsIGludCB2YWx1ZSkgeworICAgICAgICBpZiAodmFsdWUgPj0gLTEgJiYgdmFsdWUgPD0gNSkgeworICAgICAgICAgICAgbXYudmlzaXRJbnNuKE9wY29kZXMuSUNPTlNUXzAgKyB2YWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPj0gQnl0ZS5NSU5fVkFMVUUgJiYgdmFsdWUgPD0gQnl0ZS5NQVhfVkFMVUUpIHsKKyAgICAgICAgICAgIG12LnZpc2l0SW50SW5zbihPcGNvZGVzLkJJUFVTSCwgdmFsdWUpOworICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID49IFNob3J0Lk1JTl9WQUxVRSAmJiB2YWx1ZSA8PSBTaG9ydC5NQVhfVkFMVUUpIHsKKyAgICAgICAgICAgIG12LnZpc2l0SW50SW5zbihPcGNvZGVzLlNJUFVTSCwgdmFsdWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbXYudmlzaXRMZGNJbnNuKG5ldyBJbnRlZ2VyKHZhbHVlKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZXMgdGhlIGluc3RydWN0aW9uIHRvIHB1c2ggdGhlIGdpdmVuIHZhbHVlIG9uIHRoZSBzdGFjay4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gYmUgcHVzaGVkIG9uIHRoZSBzdGFjay4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwdXNoKGZpbmFsIGxvbmcgdmFsdWUpIHsKKyAgICAgICAgaWYgKHZhbHVlID09IDBMIHx8IHZhbHVlID09IDFMKSB7CisgICAgICAgICAgICBtdi52aXNpdEluc24oT3Bjb2Rlcy5MQ09OU1RfMCArIChpbnQpIHZhbHVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG12LnZpc2l0TGRjSW5zbihuZXcgTG9uZyh2YWx1ZSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2VuZXJhdGVzIHRoZSBpbnN0cnVjdGlvbiB0byBwdXNoIHRoZSBnaXZlbiB2YWx1ZSBvbiB0aGUgc3RhY2suCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIGJlIHB1c2hlZCBvbiB0aGUgc3RhY2suCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHVzaChmaW5hbCBmbG9hdCB2YWx1ZSkgeworICAgICAgICBpbnQgYml0cyA9IEZsb2F0LmZsb2F0VG9JbnRCaXRzKHZhbHVlKTsKKyAgICAgICAgaWYgKGJpdHMgPT0gMEwgfHwgYml0cyA9PSAweDNmODAwMDAwIHx8IGJpdHMgPT0gMHg0MDAwMDAwMCkgeyAvLyAwLi4yCisgICAgICAgICAgICBtdi52aXNpdEluc24oT3Bjb2Rlcy5GQ09OU1RfMCArIChpbnQpIHZhbHVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG12LnZpc2l0TGRjSW5zbihuZXcgRmxvYXQodmFsdWUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlcyB0aGUgaW5zdHJ1Y3Rpb24gdG8gcHVzaCB0aGUgZ2l2ZW4gdmFsdWUgb24gdGhlIHN0YWNrLgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBiZSBwdXNoZWQgb24gdGhlIHN0YWNrLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHB1c2goZmluYWwgZG91YmxlIHZhbHVlKSB7CisgICAgICAgIGxvbmcgYml0cyA9IERvdWJsZS5kb3VibGVUb0xvbmdCaXRzKHZhbHVlKTsKKyAgICAgICAgaWYgKGJpdHMgPT0gMEwgfHwgYml0cyA9PSAweDNmZjAwMDAwMDAwMDAwMDBMKSB7IC8vICswLjBkIGFuZCAxLjBkCisgICAgICAgICAgICBtdi52aXNpdEluc24oT3Bjb2Rlcy5EQ09OU1RfMCArIChpbnQpIHZhbHVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG12LnZpc2l0TGRjSW5zbihuZXcgRG91YmxlKHZhbHVlKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZXMgdGhlIGluc3RydWN0aW9uIHRvIHB1c2ggdGhlIGdpdmVuIHZhbHVlIG9uIHRoZSBzdGFjay4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gYmUgcHVzaGVkIG9uIHRoZSBzdGFjay4gTWF5IGJlIDx0dD5udWxsPC90dD4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHVzaChmaW5hbCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgIG12LnZpc2l0SW5zbihPcGNvZGVzLkFDT05TVF9OVUxMKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG12LnZpc2l0TGRjSW5zbih2YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZXMgdGhlIGluc3RydWN0aW9uIHRvIHB1c2ggdGhlIGdpdmVuIHZhbHVlIG9uIHRoZSBzdGFjay4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gYmUgcHVzaGVkIG9uIHRoZSBzdGFjay4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwdXNoKGZpbmFsIFR5cGUgdmFsdWUpIHsKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgIG12LnZpc2l0SW5zbihPcGNvZGVzLkFDT05TVF9OVUxMKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN3aXRjaCAodmFsdWUuZ2V0U29ydCgpKSB7CisgICAgICAgICAgICAgICAgY2FzZSBUeXBlLkJPT0xFQU46CisgICAgICAgICAgICAgICAgICAgIG12LnZpc2l0RmllbGRJbnNuKE9wY29kZXMuR0VUU1RBVElDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJqYXZhL2xhbmcvQm9vbGVhbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRZUEUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMREVTQyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgVHlwZS5DSEFSOgorICAgICAgICAgICAgICAgICAgICBtdi52aXNpdEZpZWxkSW5zbihPcGNvZGVzLkdFVFNUQVRJQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiamF2YS9sYW5nL0NoYXJhY3RlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRZUEUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMREVTQyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgVHlwZS5CWVRFOgorICAgICAgICAgICAgICAgICAgICBtdi52aXNpdEZpZWxkSW5zbihPcGNvZGVzLkdFVFNUQVRJQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiamF2YS9sYW5nL0J5dGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUWVBFIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTERFU0MpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGUuU0hPUlQ6CisgICAgICAgICAgICAgICAgICAgIG12LnZpc2l0RmllbGRJbnNuKE9wY29kZXMuR0VUU1RBVElDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJqYXZhL2xhbmcvU2hvcnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUWVBFIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTERFU0MpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGUuSU5UOgorICAgICAgICAgICAgICAgICAgICBtdi52aXNpdEZpZWxkSW5zbihPcGNvZGVzLkdFVFNUQVRJQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiamF2YS9sYW5nL0ludGVnZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUWVBFIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTERFU0MpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGUuRkxPQVQ6CisgICAgICAgICAgICAgICAgICAgIG12LnZpc2l0RmllbGRJbnNuKE9wY29kZXMuR0VUU1RBVElDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJqYXZhL2xhbmcvRmxvYXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUWVBFIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTERFU0MpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGUuTE9ORzoKKyAgICAgICAgICAgICAgICAgICAgbXYudmlzaXRGaWVsZEluc24oT3Bjb2Rlcy5HRVRTVEFUSUMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImphdmEvbGFuZy9Mb25nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVFlQRSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0xERVNDKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBUeXBlLkRPVUJMRToKKyAgICAgICAgICAgICAgICAgICAgbXYudmlzaXRGaWVsZEluc24oT3Bjb2Rlcy5HRVRTVEFUSUMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImphdmEvbGFuZy9Eb3VibGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUWVBFIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTERFU0MpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBtdi52aXNpdExkY0luc24odmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2VuZXJhdGVzIHRoZSBpbnN0cnVjdGlvbiB0byBwdXNoIGEgaGFuZGxlIG9uIHRoZSBzdGFjay4KKyAgICAgKgorICAgICAqIEBwYXJhbSBoYW5kbGUgdGhlIGhhbmRsZSB0byBiZSBwdXNoZWQgb24gdGhlIHN0YWNrLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHB1c2goZmluYWwgSGFuZGxlIGhhbmRsZSkgeworICAgICAgICBtdi52aXNpdExkY0luc24oaGFuZGxlKTsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBJbnN0cnVjdGlvbnMgdG8gbG9hZCBhbmQgc3RvcmUgbWV0aG9kIGFyZ3VtZW50cworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGdpdmVuIG1ldGhvZCBhcmd1bWVudCBpbiB0aGUgZnJhbWUncyBsb2NhbAorICAgICAqIHZhcmlhYmxlcyBhcnJheS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcmcgdGhlIGluZGV4IG9mIGEgbWV0aG9kIGFyZ3VtZW50LgorICAgICAqIEByZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBnaXZlbiBtZXRob2QgYXJndW1lbnQgaW4gdGhlIGZyYW1lJ3MgbG9jYWwKKyAgICAgKiAgICAgICAgIHZhcmlhYmxlcyBhcnJheS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBnZXRBcmdJbmRleChmaW5hbCBpbnQgYXJnKSB7CisgICAgICAgIGludCBpbmRleCA9IChhY2Nlc3MgJiBPcGNvZGVzLkFDQ19TVEFUSUMpID09IDAgPyAxIDogMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmc7IGkrKykgeworICAgICAgICAgICAgaW5kZXggKz0gYXJndW1lbnRUeXBlc1tpXS5nZXRTaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGluZGV4OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlcyB0aGUgaW5zdHJ1Y3Rpb24gdG8gcHVzaCBhIGxvY2FsIHZhcmlhYmxlIG9uIHRoZSBzdGFjay4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIG9mIHRoZSBsb2NhbCB2YXJpYWJsZSB0byBiZSBsb2FkZWQuCisgICAgICogQHBhcmFtIGluZGV4IGFuIGluZGV4IGluIHRoZSBmcmFtZSdzIGxvY2FsIHZhcmlhYmxlcyBhcnJheS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgbG9hZEluc24oZmluYWwgVHlwZSB0eXBlLCBmaW5hbCBpbnQgaW5kZXgpIHsKKyAgICAgICAgbXYudmlzaXRWYXJJbnNuKHR5cGUuZ2V0T3Bjb2RlKE9wY29kZXMuSUxPQUQpLCBpbmRleCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2VuZXJhdGVzIHRoZSBpbnN0cnVjdGlvbiB0byBzdG9yZSB0aGUgdG9wIHN0YWNrIHZhbHVlIGluIGEgbG9jYWwKKyAgICAgKiB2YXJpYWJsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIG9mIHRoZSBsb2NhbCB2YXJpYWJsZSB0byBiZSBzdG9yZWQuCisgICAgICogQHBhcmFtIGluZGV4IGFuIGluZGV4IGluIHRoZSBmcmFtZSdzIGxvY2FsIHZhcmlhYmxlcyBhcnJheS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc3RvcmVJbnNuKGZpbmFsIFR5cGUgdHlwZSwgZmluYWwgaW50IGluZGV4KSB7CisgICAgICAgIG12LnZpc2l0VmFySW5zbih0eXBlLmdldE9wY29kZShPcGNvZGVzLklTVE9SRSksIGluZGV4KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZXMgdGhlIGluc3RydWN0aW9uIHRvIGxvYWQgJ3RoaXMnIG9uIHRoZSBzdGFjay4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBsb2FkVGhpcygpIHsKKyAgICAgICAgaWYgKChhY2Nlc3MgJiBPcGNvZGVzLkFDQ19TVEFUSUMpICE9IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm5vICd0aGlzJyBwb2ludGVyIHdpdGhpbiBzdGF0aWMgbWV0aG9kIik7CisgICAgICAgIH0KKyAgICAgICAgbXYudmlzaXRWYXJJbnNuKE9wY29kZXMuQUxPQUQsIDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlcyB0aGUgaW5zdHJ1Y3Rpb24gdG8gbG9hZCB0aGUgZ2l2ZW4gbWV0aG9kIGFyZ3VtZW50IG9uIHRoZSBzdGFjay4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcmcgdGhlIGluZGV4IG9mIGEgbWV0aG9kIGFyZ3VtZW50LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGxvYWRBcmcoZmluYWwgaW50IGFyZykgeworICAgICAgICBsb2FkSW5zbihhcmd1bWVudFR5cGVzW2FyZ10sIGdldEFyZ0luZGV4KGFyZykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlcyB0aGUgaW5zdHJ1Y3Rpb25zIHRvIGxvYWQgdGhlIGdpdmVuIG1ldGhvZCBhcmd1bWVudHMgb24gdGhlCisgICAgICogc3RhY2suCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXJnIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgbWV0aG9kIGFyZ3VtZW50IHRvIGJlIGxvYWRlZC4KKyAgICAgKiBAcGFyYW0gY291bnQgdGhlIG51bWJlciBvZiBtZXRob2QgYXJndW1lbnRzIHRvIGJlIGxvYWRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBsb2FkQXJncyhmaW5hbCBpbnQgYXJnLCBmaW5hbCBpbnQgY291bnQpIHsKKyAgICAgICAgaW50IGluZGV4ID0gZ2V0QXJnSW5kZXgoYXJnKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisgICAgICAgICAgICBUeXBlIHQgPSBhcmd1bWVudFR5cGVzW2FyZyArIGldOworICAgICAgICAgICAgbG9hZEluc24odCwgaW5kZXgpOworICAgICAgICAgICAgaW5kZXggKz0gdC5nZXRTaXplKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZXMgdGhlIGluc3RydWN0aW9ucyB0byBsb2FkIGFsbCB0aGUgbWV0aG9kIGFyZ3VtZW50cyBvbiB0aGUgc3RhY2suCisgICAgICovCisgICAgcHVibGljIHZvaWQgbG9hZEFyZ3MoKSB7CisgICAgICAgIGxvYWRBcmdzKDAsIGFyZ3VtZW50VHlwZXMubGVuZ3RoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZXMgdGhlIGluc3RydWN0aW9ucyB0byBsb2FkIGFsbCB0aGUgbWV0aG9kIGFyZ3VtZW50cyBvbiB0aGUgc3RhY2ssCisgICAgICogYXMgYSBzaW5nbGUgb2JqZWN0IGFycmF5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGxvYWRBcmdBcnJheSgpIHsKKyAgICAgICAgcHVzaChhcmd1bWVudFR5cGVzLmxlbmd0aCk7CisgICAgICAgIG5ld0FycmF5KE9CSkVDVF9UWVBFKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd1bWVudFR5cGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBkdXAoKTsKKyAgICAgICAgICAgIHB1c2goaSk7CisgICAgICAgICAgICBsb2FkQXJnKGkpOworICAgICAgICAgICAgYm94KGFyZ3VtZW50VHlwZXNbaV0pOworICAgICAgICAgICAgYXJyYXlTdG9yZShPQkpFQ1RfVFlQRSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZXMgdGhlIGluc3RydWN0aW9uIHRvIHN0b3JlIHRoZSB0b3Agc3RhY2sgdmFsdWUgaW4gdGhlIGdpdmVuCisgICAgICogbWV0aG9kIGFyZ3VtZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGFyZyB0aGUgaW5kZXggb2YgYSBtZXRob2QgYXJndW1lbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcmVBcmcoZmluYWwgaW50IGFyZykgeworICAgICAgICBzdG9yZUluc24oYXJndW1lbnRUeXBlc1thcmddLCBnZXRBcmdJbmRleChhcmcpKTsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBJbnN0cnVjdGlvbnMgdG8gbG9hZCBhbmQgc3RvcmUgbG9jYWwgdmFyaWFibGVzCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSBnaXZlbiBsb2NhbCB2YXJpYWJsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsb2NhbCBhIGxvY2FsIHZhcmlhYmxlIGlkZW50aWZpZXIsIGFzIHJldHVybmVkIGJ5CisgICAgICogICAgICAgIHtAbGluayBMb2NhbFZhcmlhYmxlc1NvcnRlciNuZXdMb2NhbChUeXBlKSBuZXdMb2NhbCgpfS4KKyAgICAgKiBAcmV0dXJuIHRoZSB0eXBlIG9mIHRoZSBnaXZlbiBsb2NhbCB2YXJpYWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgVHlwZSBnZXRMb2NhbFR5cGUoZmluYWwgaW50IGxvY2FsKSB7CisgICAgICAgIHJldHVybiBsb2NhbFR5cGVzLmdldChsb2NhbCAtIGZpcnN0TG9jYWwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHNldExvY2FsVHlwZShmaW5hbCBpbnQgbG9jYWwsIGZpbmFsIFR5cGUgdHlwZSkgeworICAgICAgICBpbnQgaW5kZXggPSBsb2NhbCAtIGZpcnN0TG9jYWw7CisgICAgICAgIHdoaWxlIChsb2NhbFR5cGVzLnNpemUoKSA8IGluZGV4ICsgMSkgeworICAgICAgICAgICAgbG9jYWxUeXBlcy5hZGQobnVsbCk7CisgICAgICAgIH0KKyAgICAgICAgbG9jYWxUeXBlcy5zZXQoaW5kZXgsIHR5cGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlcyB0aGUgaW5zdHJ1Y3Rpb24gdG8gbG9hZCB0aGUgZ2l2ZW4gbG9jYWwgdmFyaWFibGUgb24gdGhlIHN0YWNrLgorICAgICAqCisgICAgICogQHBhcmFtIGxvY2FsIGEgbG9jYWwgdmFyaWFibGUgaWRlbnRpZmllciwgYXMgcmV0dXJuZWQgYnkKKyAgICAgKiAgICAgICAge0BsaW5rIExvY2FsVmFyaWFibGVzU29ydGVyI25ld0xvY2FsKFR5cGUpIG5ld0xvY2FsKCl9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGxvYWRMb2NhbChmaW5hbCBpbnQgbG9jYWwpIHsKKyAgICAgICAgbG9hZEluc24oZ2V0TG9jYWxUeXBlKGxvY2FsKSwgbG9jYWwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlcyB0aGUgaW5zdHJ1Y3Rpb24gdG8gbG9hZCB0aGUgZ2l2ZW4gbG9jYWwgdmFyaWFibGUgb24gdGhlIHN0YWNrLgorICAgICAqCisgICAgICogQHBhcmFtIGxvY2FsIGEgbG9jYWwgdmFyaWFibGUgaWRlbnRpZmllciwgYXMgcmV0dXJuZWQgYnkKKyAgICAgKiAgICAgICAge0BsaW5rIExvY2FsVmFyaWFibGVzU29ydGVyI25ld0xvY2FsKFR5cGUpIG5ld0xvY2FsKCl9LgorICAgICAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIG9mIHRoaXMgbG9jYWwgdmFyaWFibGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgbG9hZExvY2FsKGZpbmFsIGludCBsb2NhbCwgZmluYWwgVHlwZSB0eXBlKSB7CisgICAgICAgIHNldExvY2FsVHlwZShsb2NhbCwgdHlwZSk7CisgICAgICAgIGxvYWRJbnNuKHR5cGUsIGxvY2FsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZXMgdGhlIGluc3RydWN0aW9uIHRvIHN0b3JlIHRoZSB0b3Agc3RhY2sgdmFsdWUgaW4gdGhlIGdpdmVuIGxvY2FsCisgICAgICogdmFyaWFibGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbG9jYWwgYSBsb2NhbCB2YXJpYWJsZSBpZGVudGlmaWVyLCBhcyByZXR1cm5lZCBieQorICAgICAqICAgICAgICB7QGxpbmsgTG9jYWxWYXJpYWJsZXNTb3J0ZXIjbmV3TG9jYWwoVHlwZSkgbmV3TG9jYWwoKX0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcmVMb2NhbChmaW5hbCBpbnQgbG9jYWwpIHsKKyAgICAgICAgc3RvcmVJbnNuKGdldExvY2FsVHlwZShsb2NhbCksIGxvY2FsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZXMgdGhlIGluc3RydWN0aW9uIHRvIHN0b3JlIHRoZSB0b3Agc3RhY2sgdmFsdWUgaW4gdGhlIGdpdmVuIGxvY2FsCisgICAgICogdmFyaWFibGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbG9jYWwgYSBsb2NhbCB2YXJpYWJsZSBpZGVudGlmaWVyLCBhcyByZXR1cm5lZCBieQorICAgICAqICAgICAgICB7QGxpbmsgTG9jYWxWYXJpYWJsZXNTb3J0ZXIjbmV3TG9jYWwoVHlwZSkgbmV3TG9jYWwoKX0uCisgICAgICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgb2YgdGhpcyBsb2NhbCB2YXJpYWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9yZUxvY2FsKGZpbmFsIGludCBsb2NhbCwgZmluYWwgVHlwZSB0eXBlKSB7CisgICAgICAgIHNldExvY2FsVHlwZShsb2NhbCwgdHlwZSk7CisgICAgICAgIHN0b3JlSW5zbih0eXBlLCBsb2NhbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2VuZXJhdGVzIHRoZSBpbnN0cnVjdGlvbiB0byBsb2FkIGFuIGVsZW1lbnQgZnJvbSBhbiBhcnJheS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIG9mIHRoZSBhcnJheSBlbGVtZW50IHRvIGJlIGxvYWRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhcnJheUxvYWQoZmluYWwgVHlwZSB0eXBlKSB7CisgICAgICAgIG12LnZpc2l0SW5zbih0eXBlLmdldE9wY29kZShPcGNvZGVzLklBTE9BRCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlcyB0aGUgaW5zdHJ1Y3Rpb24gdG8gc3RvcmUgYW4gZWxlbWVudCBpbiBhbiBhcnJheS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIG9mIHRoZSBhcnJheSBlbGVtZW50IHRvIGJlIHN0b3JlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhcnJheVN0b3JlKGZpbmFsIFR5cGUgdHlwZSkgeworICAgICAgICBtdi52aXNpdEluc24odHlwZS5nZXRPcGNvZGUoT3Bjb2Rlcy5JQVNUT1JFKSk7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gSW5zdHJ1Y3Rpb25zIHRvIG1hbmFnZSB0aGUgc3RhY2sKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlcyBhIFBPUCBpbnN0cnVjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwb3AoKSB7CisgICAgICAgIG12LnZpc2l0SW5zbihPcGNvZGVzLlBPUCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2VuZXJhdGVzIGEgUE9QMiBpbnN0cnVjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwb3AyKCkgeworICAgICAgICBtdi52aXNpdEluc24oT3Bjb2Rlcy5QT1AyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZXMgYSBEVVAgaW5zdHJ1Y3Rpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgZHVwKCkgeworICAgICAgICBtdi52aXNpdEluc24oT3Bjb2Rlcy5EVVApOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlcyBhIERVUDIgaW5zdHJ1Y3Rpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgZHVwMigpIHsKKyAgICAgICAgbXYudmlzaXRJbnNuKE9wY29kZXMuRFVQMik7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2VuZXJhdGVzIGEgRFVQX1gxIGluc3RydWN0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGR1cFgxKCkgeworICAgICAgICBtdi52aXNpdEluc24oT3Bjb2Rlcy5EVVBfWDEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlcyBhIERVUF9YMiBpbnN0cnVjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkdXBYMigpIHsKKyAgICAgICAgbXYudmlzaXRJbnNuKE9wY29kZXMuRFVQX1gyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZXMgYSBEVVAyX1gxIGluc3RydWN0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGR1cDJYMSgpIHsKKyAgICAgICAgbXYudmlzaXRJbnNuKE9wY29kZXMuRFVQMl9YMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2VuZXJhdGVzIGEgRFVQMl9YMiBpbnN0cnVjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkdXAyWDIoKSB7CisgICAgICAgIG12LnZpc2l0SW5zbihPcGNvZGVzLkRVUDJfWDIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlcyBhIFNXQVAgaW5zdHJ1Y3Rpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3dhcCgpIHsKKyAgICAgICAgbXYudmlzaXRJbnNuKE9wY29kZXMuU1dBUCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2VuZXJhdGVzIHRoZSBpbnN0cnVjdGlvbnMgdG8gc3dhcCB0aGUgdG9wIHR3byBzdGFjayB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJldiB0eXBlIG9mIHRoZSB0b3AgLSAxIHN0YWNrIHZhbHVlLgorICAgICAqIEBwYXJhbSB0eXBlIHR5cGUgb2YgdGhlIHRvcCBzdGFjayB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzd2FwKGZpbmFsIFR5cGUgcHJldiwgZmluYWwgVHlwZSB0eXBlKSB7CisgICAgICAgIGlmICh0eXBlLmdldFNpemUoKSA9PSAxKSB7CisgICAgICAgICAgICBpZiAocHJldi5nZXRTaXplKCkgPT0gMSkgeworICAgICAgICAgICAgICAgIHN3YXAoKTsgLy8gc2FtZSBhcyBkdXBYMSgpLCBwb3AoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZHVwWDIoKTsKKyAgICAgICAgICAgICAgICBwb3AoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChwcmV2LmdldFNpemUoKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgZHVwMlgxKCk7CisgICAgICAgICAgICAgICAgcG9wMigpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkdXAyWDIoKTsKKyAgICAgICAgICAgICAgICBwb3AyKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBJbnN0cnVjdGlvbnMgdG8gZG8gbWF0aGVtYXRpY2FsIGFuZCBsb2dpY2FsIG9wZXJhdGlvbnMKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlcyB0aGUgaW5zdHJ1Y3Rpb24gdG8gZG8gdGhlIHNwZWNpZmllZCBtYXRoZW1hdGljYWwgb3IgbG9naWNhbAorICAgICAqIG9wZXJhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvcCBhIG1hdGhlbWF0aWNhbCBvciBsb2dpY2FsIG9wZXJhdGlvbi4gTXVzdCBiZSBvbmUgb2YgQURELCBTVUIsCisgICAgICogICAgICAgIE1VTCwgRElWLCBSRU0sIE5FRywgU0hMLCBTSFIsIFVTSFIsIEFORCwgT1IsIFhPUi4KKyAgICAgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBvZiB0aGUgb3BlcmFuZChzKSBmb3IgdGhpcyBvcGVyYXRpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgbWF0aChmaW5hbCBpbnQgb3AsIGZpbmFsIFR5cGUgdHlwZSkgeworICAgICAgICBtdi52aXNpdEluc24odHlwZS5nZXRPcGNvZGUob3ApKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZXMgdGhlIGluc3RydWN0aW9ucyB0byBjb21wdXRlIHRoZSBiaXR3aXNlIG5lZ2F0aW9uIG9mIHRoZSB0b3AKKyAgICAgKiBzdGFjayB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBub3QoKSB7CisgICAgICAgIG12LnZpc2l0SW5zbihPcGNvZGVzLklDT05TVF8xKTsKKyAgICAgICAgbXYudmlzaXRJbnNuKE9wY29kZXMuSVhPUik7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2VuZXJhdGVzIHRoZSBpbnN0cnVjdGlvbiB0byBpbmNyZW1lbnQgdGhlIGdpdmVuIGxvY2FsIHZhcmlhYmxlLgorICAgICAqCisgICAgICogQHBhcmFtIGxvY2FsIHRoZSBsb2NhbCB2YXJpYWJsZSB0byBiZSBpbmNyZW1lbnRlZC4KKyAgICAgKiBAcGFyYW0gYW1vdW50IHRoZSBhbW91bnQgYnkgd2hpY2ggdGhlIGxvY2FsIHZhcmlhYmxlIG11c3QgYmUgaW5jcmVtZW50ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgaWluYyhmaW5hbCBpbnQgbG9jYWwsIGZpbmFsIGludCBhbW91bnQpIHsKKyAgICAgICAgbXYudmlzaXRJaW5jSW5zbihsb2NhbCwgYW1vdW50KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZXMgdGhlIGluc3RydWN0aW9ucyB0byBjYXN0IGEgbnVtZXJpY2FsIHZhbHVlIGZyb20gb25lIHR5cGUgdG8KKyAgICAgKiBhbm90aGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGZyb20gdGhlIHR5cGUgb2YgdGhlIHRvcCBzdGFjayB2YWx1ZQorICAgICAqIEBwYXJhbSB0byB0aGUgdHlwZSBpbnRvIHdoaWNoIHRoaXMgdmFsdWUgbXVzdCBiZSBjYXN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNhc3QoZmluYWwgVHlwZSBmcm9tLCBmaW5hbCBUeXBlIHRvKSB7CisgICAgICAgIGlmIChmcm9tICE9IHRvKSB7CisgICAgICAgICAgICBpZiAoZnJvbSA9PSBUeXBlLkRPVUJMRV9UWVBFKSB7CisgICAgICAgICAgICAgICAgaWYgKHRvID09IFR5cGUuRkxPQVRfVFlQRSkgeworICAgICAgICAgICAgICAgICAgICBtdi52aXNpdEluc24oT3Bjb2Rlcy5EMkYpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodG8gPT0gVHlwZS5MT05HX1RZUEUpIHsKKyAgICAgICAgICAgICAgICAgICAgbXYudmlzaXRJbnNuKE9wY29kZXMuRDJMKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtdi52aXNpdEluc24oT3Bjb2Rlcy5EMkkpOworICAgICAgICAgICAgICAgICAgICBjYXN0KFR5cGUuSU5UX1RZUEUsIHRvKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGZyb20gPT0gVHlwZS5GTE9BVF9UWVBFKSB7CisgICAgICAgICAgICAgICAgaWYgKHRvID09IFR5cGUuRE9VQkxFX1RZUEUpIHsKKyAgICAgICAgICAgICAgICAgICAgbXYudmlzaXRJbnNuKE9wY29kZXMuRjJEKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRvID09IFR5cGUuTE9OR19UWVBFKSB7CisgICAgICAgICAgICAgICAgICAgIG12LnZpc2l0SW5zbihPcGNvZGVzLkYyTCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbXYudmlzaXRJbnNuKE9wY29kZXMuRjJJKTsKKyAgICAgICAgICAgICAgICAgICAgY2FzdChUeXBlLklOVF9UWVBFLCB0byk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChmcm9tID09IFR5cGUuTE9OR19UWVBFKSB7CisgICAgICAgICAgICAgICAgaWYgKHRvID09IFR5cGUuRE9VQkxFX1RZUEUpIHsKKyAgICAgICAgICAgICAgICAgICAgbXYudmlzaXRJbnNuKE9wY29kZXMuTDJEKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRvID09IFR5cGUuRkxPQVRfVFlQRSkgeworICAgICAgICAgICAgICAgICAgICBtdi52aXNpdEluc24oT3Bjb2Rlcy5MMkYpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG12LnZpc2l0SW5zbihPcGNvZGVzLkwySSk7CisgICAgICAgICAgICAgICAgICAgIGNhc3QoVHlwZS5JTlRfVFlQRSwgdG8pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHRvID09IFR5cGUuQllURV9UWVBFKSB7CisgICAgICAgICAgICAgICAgICAgIG12LnZpc2l0SW5zbihPcGNvZGVzLkkyQik7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0byA9PSBUeXBlLkNIQVJfVFlQRSkgeworICAgICAgICAgICAgICAgICAgICBtdi52aXNpdEluc24oT3Bjb2Rlcy5JMkMpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodG8gPT0gVHlwZS5ET1VCTEVfVFlQRSkgeworICAgICAgICAgICAgICAgICAgICBtdi52aXNpdEluc24oT3Bjb2Rlcy5JMkQpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodG8gPT0gVHlwZS5GTE9BVF9UWVBFKSB7CisgICAgICAgICAgICAgICAgICAgIG12LnZpc2l0SW5zbihPcGNvZGVzLkkyRik7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0byA9PSBUeXBlLkxPTkdfVFlQRSkgeworICAgICAgICAgICAgICAgICAgICBtdi52aXNpdEluc24oT3Bjb2Rlcy5JMkwpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodG8gPT0gVHlwZS5TSE9SVF9UWVBFKSB7CisgICAgICAgICAgICAgICAgICAgIG12LnZpc2l0SW5zbihPcGNvZGVzLkkyUyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gSW5zdHJ1Y3Rpb25zIHRvIGRvIGJveGluZyBhbmQgdW5ib3hpbmcgb3BlcmF0aW9ucworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgcHJpdmF0ZSBzdGF0aWMgVHlwZSBnZXRCb3hlZFR5cGUoZmluYWwgVHlwZSB0eXBlKSB7CisgICAgICAgIHN3aXRjaCAodHlwZS5nZXRTb3J0KCkpIHsKKyAgICAgICAgICAgIGNhc2UgVHlwZS5CWVRFOgorICAgICAgICAgICAgICAgIHJldHVybiBCWVRFX1RZUEU7CisgICAgICAgICAgICBjYXNlIFR5cGUuQk9PTEVBTjoKKyAgICAgICAgICAgICAgICByZXR1cm4gQk9PTEVBTl9UWVBFOworICAgICAgICAgICAgY2FzZSBUeXBlLlNIT1JUOgorICAgICAgICAgICAgICAgIHJldHVybiBTSE9SVF9UWVBFOworICAgICAgICAgICAgY2FzZSBUeXBlLkNIQVI6CisgICAgICAgICAgICAgICAgcmV0dXJuIENIQVJBQ1RFUl9UWVBFOworICAgICAgICAgICAgY2FzZSBUeXBlLklOVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5URUdFUl9UWVBFOworICAgICAgICAgICAgY2FzZSBUeXBlLkZMT0FUOgorICAgICAgICAgICAgICAgIHJldHVybiBGTE9BVF9UWVBFOworICAgICAgICAgICAgY2FzZSBUeXBlLkxPTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuIExPTkdfVFlQRTsKKyAgICAgICAgICAgIGNhc2UgVHlwZS5ET1VCTEU6CisgICAgICAgICAgICAgICAgcmV0dXJuIERPVUJMRV9UWVBFOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0eXBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlcyB0aGUgaW5zdHJ1Y3Rpb25zIHRvIGJveCB0aGUgdG9wIHN0YWNrIHZhbHVlLiBUaGlzIHZhbHVlIGlzCisgICAgICogcmVwbGFjZWQgYnkgaXRzIGJveGVkIGVxdWl2YWxlbnQgb24gdG9wIG9mIHRoZSBzdGFjay4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIG9mIHRoZSB0b3Agc3RhY2sgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYm94KGZpbmFsIFR5cGUgdHlwZSkgeworICAgICAgICBpZiAodHlwZS5nZXRTb3J0KCkgPT0gVHlwZS5PQkpFQ1QgfHwgdHlwZS5nZXRTb3J0KCkgPT0gVHlwZS5BUlJBWSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICh0eXBlID09IFR5cGUuVk9JRF9UWVBFKSB7CisgICAgICAgICAgICBwdXNoKChTdHJpbmcpIG51bGwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgVHlwZSBib3hlZCA9IGdldEJveGVkVHlwZSh0eXBlKTsKKyAgICAgICAgICAgIG5ld0luc3RhbmNlKGJveGVkKTsKKyAgICAgICAgICAgIGlmICh0eXBlLmdldFNpemUoKSA9PSAyKSB7CisgICAgICAgICAgICAgICAgLy8gUHAgLT4gUHBvIC0+IG9QcG8gLT4gb29QcG8gLT4gb29QcCAtPiBvCisgICAgICAgICAgICAgICAgZHVwWDIoKTsKKyAgICAgICAgICAgICAgICBkdXBYMigpOworICAgICAgICAgICAgICAgIHBvcCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBwIC0+IHBvIC0+IG9wbyAtPiBvb3AgLT4gbworICAgICAgICAgICAgICAgIGR1cFgxKCk7CisgICAgICAgICAgICAgICAgc3dhcCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW52b2tlQ29uc3RydWN0b3IoYm94ZWQsIG5ldyBNZXRob2QoIjxpbml0PiIsCisgICAgICAgICAgICAgICAgICAgIFR5cGUuVk9JRF9UWVBFLAorICAgICAgICAgICAgICAgICAgICBuZXcgVHlwZVtdIHsgdHlwZSB9KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZXMgdGhlIGluc3RydWN0aW9ucyB0byBib3ggdGhlIHRvcCBzdGFjayB2YWx1ZSB1c2luZyBKYXZhIDUncworICAgICAqIHZhbHVlT2YoKSBtZXRob2QuIFRoaXMgdmFsdWUgaXMgcmVwbGFjZWQgYnkgaXRzIGJveGVkIGVxdWl2YWxlbnQgb24gdG9wCisgICAgICogb2YgdGhlIHN0YWNrLgorICAgICAqCisgICAgICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgb2YgdGhlIHRvcCBzdGFjayB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB2YWx1ZU9mKGZpbmFsIFR5cGUgdHlwZSkgeworICAgICAgICBpZiAodHlwZS5nZXRTb3J0KCkgPT0gVHlwZS5PQkpFQ1QgfHwgdHlwZS5nZXRTb3J0KCkgPT0gVHlwZS5BUlJBWSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICh0eXBlID09IFR5cGUuVk9JRF9UWVBFKSB7CisgICAgICAgICAgICBwdXNoKChTdHJpbmcpIG51bGwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgVHlwZSBib3hlZCA9IGdldEJveGVkVHlwZSh0eXBlKTsKKyAgICAgICAgICAgIGludm9rZVN0YXRpYyhib3hlZCwgbmV3IE1ldGhvZCgidmFsdWVPZiIsCisgICAgICAgICAgICAgICAgICAgIGJveGVkLAorICAgICAgICAgICAgICAgICAgICBuZXcgVHlwZVtdIHsgdHlwZSB9KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZXMgdGhlIGluc3RydWN0aW9ucyB0byB1bmJveCB0aGUgdG9wIHN0YWNrIHZhbHVlLiBUaGlzIHZhbHVlIGlzCisgICAgICogcmVwbGFjZWQgYnkgaXRzIHVuYm94ZWQgZXF1aXZhbGVudCBvbiB0b3Agb2YgdGhlIHN0YWNrLgorICAgICAqCisgICAgICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgb2YgdGhlIHRvcCBzdGFjayB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB1bmJveChmaW5hbCBUeXBlIHR5cGUpIHsKKyAgICAgICAgVHlwZSB0ID0gTlVNQkVSX1RZUEU7CisgICAgICAgIE1ldGhvZCBzaWcgPSBudWxsOworICAgICAgICBzd2l0Y2ggKHR5cGUuZ2V0U29ydCgpKSB7CisgICAgICAgICAgICBjYXNlIFR5cGUuVk9JRDoKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBjYXNlIFR5cGUuQ0hBUjoKKyAgICAgICAgICAgICAgICB0ID0gQ0hBUkFDVEVSX1RZUEU7CisgICAgICAgICAgICAgICAgc2lnID0gQ0hBUl9WQUxVRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVHlwZS5CT09MRUFOOgorICAgICAgICAgICAgICAgIHQgPSBCT09MRUFOX1RZUEU7CisgICAgICAgICAgICAgICAgc2lnID0gQk9PTEVBTl9WQUxVRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVHlwZS5ET1VCTEU6CisgICAgICAgICAgICAgICAgc2lnID0gRE9VQkxFX1ZBTFVFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBUeXBlLkZMT0FUOgorICAgICAgICAgICAgICAgIHNpZyA9IEZMT0FUX1ZBTFVFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBUeXBlLkxPTkc6CisgICAgICAgICAgICAgICAgc2lnID0gTE9OR19WQUxVRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVHlwZS5JTlQ6CisgICAgICAgICAgICBjYXNlIFR5cGUuU0hPUlQ6CisgICAgICAgICAgICBjYXNlIFR5cGUuQllURToKKyAgICAgICAgICAgICAgICBzaWcgPSBJTlRfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNpZyA9PSBudWxsKSB7CisgICAgICAgICAgICBjaGVja0Nhc3QodHlwZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjaGVja0Nhc3QodCk7CisgICAgICAgICAgICBpbnZva2VWaXJ0dWFsKHQsIHNpZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBJbnN0cnVjdGlvbnMgdG8ganVtcCB0byBvdGhlciBpbnN0cnVjdGlvbnMKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIExhYmVsfS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBuZXcge0BsaW5rIExhYmVsfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGFiZWwgbmV3TGFiZWwoKSB7CisgICAgICAgIHJldHVybiBuZXcgTGFiZWwoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYXJrcyB0aGUgY3VycmVudCBjb2RlIHBvc2l0aW9uIHdpdGggdGhlIGdpdmVuIGxhYmVsLgorICAgICAqCisgICAgICogQHBhcmFtIGxhYmVsIGEgbGFiZWwuCisgICAgICovCisgICAgcHVibGljIHZvaWQgbWFyayhmaW5hbCBMYWJlbCBsYWJlbCkgeworICAgICAgICBtdi52aXNpdExhYmVsKGxhYmVsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYXJrcyB0aGUgY3VycmVudCBjb2RlIHBvc2l0aW9uIHdpdGggYSBuZXcgbGFiZWwuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBsYWJlbCB0aGF0IHdhcyBjcmVhdGVkIHRvIG1hcmsgdGhlIGN1cnJlbnQgY29kZSBwb3NpdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGFiZWwgbWFyaygpIHsKKyAgICAgICAgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoKTsKKyAgICAgICAgbXYudmlzaXRMYWJlbChsYWJlbCk7CisgICAgICAgIHJldHVybiBsYWJlbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZXMgdGhlIGluc3RydWN0aW9ucyB0byBqdW1wIHRvIGEgbGFiZWwgYmFzZWQgb24gdGhlIGNvbXBhcmlzb24gb2YKKyAgICAgKiB0aGUgdG9wIHR3byBzdGFjayB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBvZiB0aGUgdG9wIHR3byBzdGFjayB2YWx1ZXMuCisgICAgICogQHBhcmFtIG1vZGUgaG93IHRoZXNlIHZhbHVlcyBtdXN0IGJlIGNvbXBhcmVkLiBPbmUgb2YgRVEsIE5FLCBMVCwgR0UsIEdULAorICAgICAqICAgICAgICBMRS4KKyAgICAgKiBAcGFyYW0gbGFiZWwgd2hlcmUgdG8ganVtcCBpZiB0aGUgY29tcGFyaXNvbiByZXN1bHQgaXMgPHR0PnRydWU8L3R0Pi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpZkNtcChmaW5hbCBUeXBlIHR5cGUsIGZpbmFsIGludCBtb2RlLCBmaW5hbCBMYWJlbCBsYWJlbCkgeworICAgICAgICBzd2l0Y2ggKHR5cGUuZ2V0U29ydCgpKSB7CisgICAgICAgICAgICBjYXNlIFR5cGUuTE9ORzoKKyAgICAgICAgICAgICAgICBtdi52aXNpdEluc24oT3Bjb2Rlcy5MQ01QKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVHlwZS5ET1VCTEU6CisgICAgICAgICAgICAgICAgbXYudmlzaXRJbnNuKG1vZGUgPT0gR0UgfHwgbW9kZSA9PSBHVCA/IE9wY29kZXMuRENNUEcgOiBPcGNvZGVzLkRDTVBMKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVHlwZS5GTE9BVDoKKyAgICAgICAgICAgICAgICBtdi52aXNpdEluc24obW9kZSA9PSBHRSB8fCBtb2RlID09IEdUID8gT3Bjb2Rlcy5GQ01QRyA6IE9wY29kZXMuRkNNUEwpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBUeXBlLkFSUkFZOgorICAgICAgICAgICAgY2FzZSBUeXBlLk9CSkVDVDoKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKG1vZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBFUToKKyAgICAgICAgICAgICAgICAgICAgICAgIG12LnZpc2l0SnVtcEluc24oT3Bjb2Rlcy5JRl9BQ01QRVEsIGxhYmVsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBORToKKyAgICAgICAgICAgICAgICAgICAgICAgIG12LnZpc2l0SnVtcEluc24oT3Bjb2Rlcy5JRl9BQ01QTkUsIGxhYmVsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQmFkIGNvbXBhcmlzb24gZm9yIHR5cGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyB0eXBlKTsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaW50IGludE9wID0gLTE7CisgICAgICAgICAgICAgICAgc3dpdGNoIChtb2RlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgRVE6CisgICAgICAgICAgICAgICAgICAgICAgICBpbnRPcCA9IE9wY29kZXMuSUZfSUNNUEVROworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTkU6CisgICAgICAgICAgICAgICAgICAgICAgICBpbnRPcCA9IE9wY29kZXMuSUZfSUNNUE5FOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgR0U6CisgICAgICAgICAgICAgICAgICAgICAgICBpbnRPcCA9IE9wY29kZXMuSUZfSUNNUEdFOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTFQ6CisgICAgICAgICAgICAgICAgICAgICAgICBpbnRPcCA9IE9wY29kZXMuSUZfSUNNUExUOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTEU6CisgICAgICAgICAgICAgICAgICAgICAgICBpbnRPcCA9IE9wY29kZXMuSUZfSUNNUExFOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgR1Q6CisgICAgICAgICAgICAgICAgICAgICAgICBpbnRPcCA9IE9wY29kZXMuSUZfSUNNUEdUOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG12LnZpc2l0SnVtcEluc24oaW50T3AsIGxhYmVsKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbXYudmlzaXRKdW1wSW5zbihtb2RlLCBsYWJlbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2VuZXJhdGVzIHRoZSBpbnN0cnVjdGlvbnMgdG8ganVtcCB0byBhIGxhYmVsIGJhc2VkIG9uIHRoZSBjb21wYXJpc29uIG9mCisgICAgICogdGhlIHRvcCB0d28gaW50ZWdlciBzdGFjayB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbW9kZSBob3cgdGhlc2UgdmFsdWVzIG11c3QgYmUgY29tcGFyZWQuIE9uZSBvZiBFUSwgTkUsIExULCBHRSwgR1QsCisgICAgICogICAgICAgIExFLgorICAgICAqIEBwYXJhbSBsYWJlbCB3aGVyZSB0byBqdW1wIGlmIHRoZSBjb21wYXJpc29uIHJlc3VsdCBpcyA8dHQ+dHJ1ZTwvdHQ+LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGlmSUNtcChmaW5hbCBpbnQgbW9kZSwgZmluYWwgTGFiZWwgbGFiZWwpIHsKKyAgICAgICAgaWZDbXAoVHlwZS5JTlRfVFlQRSwgbW9kZSwgbGFiZWwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlcyB0aGUgaW5zdHJ1Y3Rpb25zIHRvIGp1bXAgdG8gYSBsYWJlbCBiYXNlZCBvbiB0aGUgY29tcGFyaXNvbiBvZgorICAgICAqIHRoZSB0b3AgaW50ZWdlciBzdGFjayB2YWx1ZSB3aXRoIHplcm8uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbW9kZSBob3cgdGhlc2UgdmFsdWVzIG11c3QgYmUgY29tcGFyZWQuIE9uZSBvZiBFUSwgTkUsIExULCBHRSwgR1QsCisgICAgICogICAgICAgIExFLgorICAgICAqIEBwYXJhbSBsYWJlbCB3aGVyZSB0byBqdW1wIGlmIHRoZSBjb21wYXJpc29uIHJlc3VsdCBpcyA8dHQ+dHJ1ZTwvdHQ+LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGlmWkNtcChmaW5hbCBpbnQgbW9kZSwgZmluYWwgTGFiZWwgbGFiZWwpIHsKKyAgICAgICAgbXYudmlzaXRKdW1wSW5zbihtb2RlLCBsYWJlbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2VuZXJhdGVzIHRoZSBpbnN0cnVjdGlvbiB0byBqdW1wIHRvIHRoZSBnaXZlbiBsYWJlbCBpZiB0aGUgdG9wIHN0YWNrCisgICAgICogdmFsdWUgaXMgbnVsbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsYWJlbCB3aGVyZSB0byBqdW1wIGlmIHRoZSBjb25kaXRpb24gaXMgPHR0PnRydWU8L3R0Pi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpZk51bGwoZmluYWwgTGFiZWwgbGFiZWwpIHsKKyAgICAgICAgbXYudmlzaXRKdW1wSW5zbihPcGNvZGVzLklGTlVMTCwgbGFiZWwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlcyB0aGUgaW5zdHJ1Y3Rpb24gdG8ganVtcCB0byB0aGUgZ2l2ZW4gbGFiZWwgaWYgdGhlIHRvcCBzdGFjaworICAgICAqIHZhbHVlIGlzIG5vdCBudWxsLgorICAgICAqCisgICAgICogQHBhcmFtIGxhYmVsIHdoZXJlIHRvIGp1bXAgaWYgdGhlIGNvbmRpdGlvbiBpcyA8dHQ+dHJ1ZTwvdHQ+LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGlmTm9uTnVsbChmaW5hbCBMYWJlbCBsYWJlbCkgeworICAgICAgICBtdi52aXNpdEp1bXBJbnNuKE9wY29kZXMuSUZOT05OVUxMLCBsYWJlbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2VuZXJhdGVzIHRoZSBpbnN0cnVjdGlvbiB0byBqdW1wIHRvIHRoZSBnaXZlbiBsYWJlbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsYWJlbCB3aGVyZSB0byBqdW1wIGlmIHRoZSBjb25kaXRpb24gaXMgPHR0PnRydWU8L3R0Pi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBnb1RvKGZpbmFsIExhYmVsIGxhYmVsKSB7CisgICAgICAgIG12LnZpc2l0SnVtcEluc24oT3Bjb2Rlcy5HT1RPLCBsYWJlbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2VuZXJhdGVzIGEgUkVUIGluc3RydWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGxvY2FsIGEgbG9jYWwgdmFyaWFibGUgaWRlbnRpZmllciwgYXMgcmV0dXJuZWQgYnkKKyAgICAgKiAgICAgICAge0BsaW5rIExvY2FsVmFyaWFibGVzU29ydGVyI25ld0xvY2FsKFR5cGUpIG5ld0xvY2FsKCl9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJldChmaW5hbCBpbnQgbG9jYWwpIHsKKyAgICAgICAgbXYudmlzaXRWYXJJbnNuKE9wY29kZXMuUkVULCBsb2NhbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2VuZXJhdGVzIHRoZSBpbnN0cnVjdGlvbnMgZm9yIGEgc3dpdGNoIHN0YXRlbWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXlzIHRoZSBzd2l0Y2ggY2FzZSBrZXlzLgorICAgICAqIEBwYXJhbSBnZW5lcmF0b3IgYSBnZW5lcmF0b3IgdG8gZ2VuZXJhdGUgdGhlIGNvZGUgZm9yIHRoZSBzd2l0Y2ggY2FzZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGFibGVTd2l0Y2goCisgICAgICAgIGZpbmFsIGludFtdIGtleXMsCisgICAgICAgIGZpbmFsIFRhYmxlU3dpdGNoR2VuZXJhdG9yIGdlbmVyYXRvcikKKyAgICB7CisgICAgICAgIGZsb2F0IGRlbnNpdHk7CisgICAgICAgIGlmIChrZXlzLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICBkZW5zaXR5ID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRlbnNpdHkgPSAoZmxvYXQpIGtleXMubGVuZ3RoCisgICAgICAgICAgICAgICAgICAgIC8gKGtleXNba2V5cy5sZW5ndGggLSAxXSAtIGtleXNbMF0gKyAxKTsKKyAgICAgICAgfQorICAgICAgICB0YWJsZVN3aXRjaChrZXlzLCBnZW5lcmF0b3IsIGRlbnNpdHkgPj0gMC41Zik7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2VuZXJhdGVzIHRoZSBpbnN0cnVjdGlvbnMgZm9yIGEgc3dpdGNoIHN0YXRlbWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXlzIHRoZSBzd2l0Y2ggY2FzZSBrZXlzLgorICAgICAqIEBwYXJhbSBnZW5lcmF0b3IgYSBnZW5lcmF0b3IgdG8gZ2VuZXJhdGUgdGhlIGNvZGUgZm9yIHRoZSBzd2l0Y2ggY2FzZXMuCisgICAgICogQHBhcmFtIHVzZVRhYmxlIDx0dD50cnVlPC90dD4gdG8gdXNlIGEgVEFCTEVTV0lUQ0ggaW5zdHJ1Y3Rpb24sIG9yCisgICAgICogICAgICAgIDx0dD5mYWxzZTwvdHQ+IHRvIHVzZSBhIExPT0tVUFNXSVRDSCBpbnN0cnVjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0YWJsZVN3aXRjaCgKKyAgICAgICAgZmluYWwgaW50W10ga2V5cywKKyAgICAgICAgZmluYWwgVGFibGVTd2l0Y2hHZW5lcmF0b3IgZ2VuZXJhdG9yLAorICAgICAgICBmaW5hbCBib29sZWFuIHVzZVRhYmxlKQorICAgIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBrZXlzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBpZiAoa2V5c1tpXSA8IGtleXNbaSAtIDFdKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigia2V5cyBtdXN0IGJlIHNvcnRlZCBhc2NlbmRpbmciKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBMYWJlbCBkZWYgPSBuZXdMYWJlbCgpOworICAgICAgICBMYWJlbCBlbmQgPSBuZXdMYWJlbCgpOworICAgICAgICBpZiAoa2V5cy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICBpbnQgbGVuID0ga2V5cy5sZW5ndGg7CisgICAgICAgICAgICBpbnQgbWluID0ga2V5c1swXTsKKyAgICAgICAgICAgIGludCBtYXggPSBrZXlzW2xlbiAtIDFdOworICAgICAgICAgICAgaW50IHJhbmdlID0gbWF4IC0gbWluICsgMTsKKyAgICAgICAgICAgIGlmICh1c2VUYWJsZSkgeworICAgICAgICAgICAgICAgIExhYmVsW10gbGFiZWxzID0gbmV3IExhYmVsW3JhbmdlXTsKKyAgICAgICAgICAgICAgICBBcnJheXMuZmlsbChsYWJlbHMsIGRlZik7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47ICsraSkgeworICAgICAgICAgICAgICAgICAgICBsYWJlbHNba2V5c1tpXSAtIG1pbl0gPSBuZXdMYWJlbCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtdi52aXNpdFRhYmxlU3dpdGNoSW5zbihtaW4sIG1heCwgZGVmLCBsYWJlbHMpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmFuZ2U7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBMYWJlbCBsYWJlbCA9IGxhYmVsc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxhYmVsICE9IGRlZikgeworICAgICAgICAgICAgICAgICAgICAgICAgbWFyayhsYWJlbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0b3IuZ2VuZXJhdGVDYXNlKGkgKyBtaW4sIGVuZCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIExhYmVsW10gbGFiZWxzID0gbmV3IExhYmVsW2xlbl07CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47ICsraSkgeworICAgICAgICAgICAgICAgICAgICBsYWJlbHNbaV0gPSBuZXdMYWJlbCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtdi52aXNpdExvb2t1cFN3aXRjaEluc24oZGVmLCBrZXlzLCBsYWJlbHMpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgbWFyayhsYWJlbHNbaV0pOworICAgICAgICAgICAgICAgICAgICBnZW5lcmF0b3IuZ2VuZXJhdGVDYXNlKGtleXNbaV0sIGVuZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1hcmsoZGVmKTsKKyAgICAgICAgZ2VuZXJhdG9yLmdlbmVyYXRlRGVmYXVsdCgpOworICAgICAgICBtYXJrKGVuZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2VuZXJhdGVzIHRoZSBpbnN0cnVjdGlvbiB0byByZXR1cm4gdGhlIHRvcCBzdGFjayB2YWx1ZSB0byB0aGUgY2FsbGVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJldHVyblZhbHVlKCkgeworICAgICAgICBtdi52aXNpdEluc24ocmV0dXJuVHlwZS5nZXRPcGNvZGUoT3Bjb2Rlcy5JUkVUVVJOKSk7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gSW5zdHJ1Y3Rpb25zIHRvIGxvYWQgYW5kIHN0b3JlIGZpZWxkcworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLyoqCisgICAgICogR2VuZXJhdGVzIGEgZ2V0IGZpZWxkIG9yIHNldCBmaWVsZCBpbnN0cnVjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvcGNvZGUgdGhlIGluc3RydWN0aW9uJ3Mgb3Bjb2RlLgorICAgICAqIEBwYXJhbSBvd25lclR5cGUgdGhlIGNsYXNzIGluIHdoaWNoIHRoZSBmaWVsZCBpcyBkZWZpbmVkLgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWVsZC4KKyAgICAgKiBAcGFyYW0gZmllbGRUeXBlIHRoZSB0eXBlIG9mIHRoZSBmaWVsZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZmllbGRJbnNuKAorICAgICAgICBmaW5hbCBpbnQgb3Bjb2RlLAorICAgICAgICBmaW5hbCBUeXBlIG93bmVyVHlwZSwKKyAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUsCisgICAgICAgIGZpbmFsIFR5cGUgZmllbGRUeXBlKQorICAgIHsKKyAgICAgICAgbXYudmlzaXRGaWVsZEluc24ob3Bjb2RlLAorICAgICAgICAgICAgICAgIG93bmVyVHlwZS5nZXRJbnRlcm5hbE5hbWUoKSwKKyAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgIGZpZWxkVHlwZS5nZXREZXNjcmlwdG9yKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlcyB0aGUgaW5zdHJ1Y3Rpb24gdG8gcHVzaCB0aGUgdmFsdWUgb2YgYSBzdGF0aWMgZmllbGQgb24gdGhlCisgICAgICogc3RhY2suCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3duZXIgdGhlIGNsYXNzIGluIHdoaWNoIHRoZSBmaWVsZCBpcyBkZWZpbmVkLgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWVsZC4KKyAgICAgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBvZiB0aGUgZmllbGQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZ2V0U3RhdGljKGZpbmFsIFR5cGUgb3duZXIsIGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBUeXBlIHR5cGUpCisgICAgeworICAgICAgICBmaWVsZEluc24oT3Bjb2Rlcy5HRVRTVEFUSUMsIG93bmVyLCBuYW1lLCB0eXBlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZXMgdGhlIGluc3RydWN0aW9uIHRvIHN0b3JlIHRoZSB0b3Agc3RhY2sgdmFsdWUgaW4gYSBzdGF0aWMgZmllbGQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3duZXIgdGhlIGNsYXNzIGluIHdoaWNoIHRoZSBmaWVsZCBpcyBkZWZpbmVkLgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWVsZC4KKyAgICAgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBvZiB0aGUgZmllbGQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHV0U3RhdGljKGZpbmFsIFR5cGUgb3duZXIsIGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBUeXBlIHR5cGUpCisgICAgeworICAgICAgICBmaWVsZEluc24oT3Bjb2Rlcy5QVVRTVEFUSUMsIG93bmVyLCBuYW1lLCB0eXBlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZXMgdGhlIGluc3RydWN0aW9uIHRvIHB1c2ggdGhlIHZhbHVlIG9mIGEgbm9uIHN0YXRpYyBmaWVsZCBvbiB0aGUKKyAgICAgKiBzdGFjay4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvd25lciB0aGUgY2xhc3MgaW4gd2hpY2ggdGhlIGZpZWxkIGlzIGRlZmluZWQuCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpZWxkLgorICAgICAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIG9mIHRoZSBmaWVsZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBnZXRGaWVsZChmaW5hbCBUeXBlIG93bmVyLCBmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgVHlwZSB0eXBlKSB7CisgICAgICAgIGZpZWxkSW5zbihPcGNvZGVzLkdFVEZJRUxELCBvd25lciwgbmFtZSwgdHlwZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2VuZXJhdGVzIHRoZSBpbnN0cnVjdGlvbiB0byBzdG9yZSB0aGUgdG9wIHN0YWNrIHZhbHVlIGluIGEgbm9uIHN0YXRpYworICAgICAqIGZpZWxkLgorICAgICAqCisgICAgICogQHBhcmFtIG93bmVyIHRoZSBjbGFzcyBpbiB3aGljaCB0aGUgZmllbGQgaXMgZGVmaW5lZC4KKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmllbGQuCisgICAgICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgb2YgdGhlIGZpZWxkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHB1dEZpZWxkKGZpbmFsIFR5cGUgb3duZXIsIGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBUeXBlIHR5cGUpIHsKKyAgICAgICAgZmllbGRJbnNuKE9wY29kZXMuUFVURklFTEQsIG93bmVyLCBuYW1lLCB0eXBlKTsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBJbnN0cnVjdGlvbnMgdG8gaW52b2tlIG1ldGhvZHMKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlcyBhbiBpbnZva2UgbWV0aG9kIGluc3RydWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIG9wY29kZSB0aGUgaW5zdHJ1Y3Rpb24ncyBvcGNvZGUuCisgICAgICogQHBhcmFtIHR5cGUgdGhlIGNsYXNzIGluIHdoaWNoIHRoZSBtZXRob2QgaXMgZGVmaW5lZC4KKyAgICAgKiBAcGFyYW0gbWV0aG9kIHRoZSBtZXRob2QgdG8gYmUgaW52b2tlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgaW52b2tlSW5zbigKKyAgICAgICAgZmluYWwgaW50IG9wY29kZSwKKyAgICAgICAgZmluYWwgVHlwZSB0eXBlLAorICAgICAgICBmaW5hbCBNZXRob2QgbWV0aG9kKQorICAgIHsKKyAgICAgICAgU3RyaW5nIG93bmVyID0gdHlwZS5nZXRTb3J0KCkgPT0gVHlwZS5BUlJBWQorICAgICAgICAgICAgICAgID8gdHlwZS5nZXREZXNjcmlwdG9yKCkKKyAgICAgICAgICAgICAgICA6IHR5cGUuZ2V0SW50ZXJuYWxOYW1lKCk7CisgICAgICAgIG12LnZpc2l0TWV0aG9kSW5zbihvcGNvZGUsCisgICAgICAgICAgICAgICAgb3duZXIsCisgICAgICAgICAgICAgICAgbWV0aG9kLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICBtZXRob2QuZ2V0RGVzY3JpcHRvcigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZXMgdGhlIGluc3RydWN0aW9uIHRvIGludm9rZSBhIG5vcm1hbCBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3duZXIgdGhlIGNsYXNzIGluIHdoaWNoIHRoZSBtZXRob2QgaXMgZGVmaW5lZC4KKyAgICAgKiBAcGFyYW0gbWV0aG9kIHRoZSBtZXRob2QgdG8gYmUgaW52b2tlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbnZva2VWaXJ0dWFsKGZpbmFsIFR5cGUgb3duZXIsIGZpbmFsIE1ldGhvZCBtZXRob2QpIHsKKyAgICAgICAgaW52b2tlSW5zbihPcGNvZGVzLklOVk9LRVZJUlRVQUwsIG93bmVyLCBtZXRob2QpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlcyB0aGUgaW5zdHJ1Y3Rpb24gdG8gaW52b2tlIGEgY29uc3RydWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZSB0aGUgY2xhc3MgaW4gd2hpY2ggdGhlIGNvbnN0cnVjdG9yIGlzIGRlZmluZWQuCisgICAgICogQHBhcmFtIG1ldGhvZCB0aGUgY29uc3RydWN0b3IgdG8gYmUgaW52b2tlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbnZva2VDb25zdHJ1Y3RvcihmaW5hbCBUeXBlIHR5cGUsIGZpbmFsIE1ldGhvZCBtZXRob2QpIHsKKyAgICAgICAgaW52b2tlSW5zbihPcGNvZGVzLklOVk9LRVNQRUNJQUwsIHR5cGUsIG1ldGhvZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2VuZXJhdGVzIHRoZSBpbnN0cnVjdGlvbiB0byBpbnZva2UgYSBzdGF0aWMgbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtIG93bmVyIHRoZSBjbGFzcyBpbiB3aGljaCB0aGUgbWV0aG9kIGlzIGRlZmluZWQuCisgICAgICogQHBhcmFtIG1ldGhvZCB0aGUgbWV0aG9kIHRvIGJlIGludm9rZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgaW52b2tlU3RhdGljKGZpbmFsIFR5cGUgb3duZXIsIGZpbmFsIE1ldGhvZCBtZXRob2QpIHsKKyAgICAgICAgaW52b2tlSW5zbihPcGNvZGVzLklOVk9LRVNUQVRJQywgb3duZXIsIG1ldGhvZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2VuZXJhdGVzIHRoZSBpbnN0cnVjdGlvbiB0byBpbnZva2UgYW4gaW50ZXJmYWNlIG1ldGhvZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvd25lciB0aGUgY2xhc3MgaW4gd2hpY2ggdGhlIG1ldGhvZCBpcyBkZWZpbmVkLgorICAgICAqIEBwYXJhbSBtZXRob2QgdGhlIG1ldGhvZCB0byBiZSBpbnZva2VkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGludm9rZUludGVyZmFjZShmaW5hbCBUeXBlIG93bmVyLCBmaW5hbCBNZXRob2QgbWV0aG9kKSB7CisgICAgICAgIGludm9rZUluc24oT3Bjb2Rlcy5JTlZPS0VJTlRFUkZBQ0UsIG93bmVyLCBtZXRob2QpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlcyBhbiBpbnZva2VkeW5hbWljIGluc3RydWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG1ldGhvZCdzIG5hbWUuCisgICAgICogQHBhcmFtIGRlc2MgdGhlIG1ldGhvZCdzIGRlc2NyaXB0b3IgKHNlZSB7QGxpbmsgVHlwZSBUeXBlfSkuCisgICAgICogQHBhcmFtIGJzbSB0aGUgYm9vdHN0cmFwIG1ldGhvZC4KKyAgICAgKiBAcGFyYW0gYnNtQXJncyB0aGUgYm9vdHN0cmFwIG1ldGhvZCBjb25zdGFudCBhcmd1bWVudHMuIEVhY2ggYXJndW1lbnQKKyAgICAgKiAgICAgICAgbXVzdCBiZSBhbiB7QGxpbmsgSW50ZWdlcn0sIHtAbGluayBGbG9hdH0sIHtAbGluayBMb25nfSwKKyAgICAgKiAgICAgICAge0BsaW5rIERvdWJsZX0sIHtAbGluayBTdHJpbmd9LCB7QGxpbmsgVHlwZX0gb3Ige0BsaW5rIEhhbmRsZX0KKyAgICAgKiAgICAgICAgdmFsdWUuIFRoaXMgbWV0aG9kIGlzIGFsbG93ZWQgdG8gbW9kaWZ5IHRoZSBjb250ZW50IG9mIHRoZSBhcnJheQorICAgICAqICAgICAgICBzbyBhIGNhbGxlciBzaG91bGQgZXhwZWN0IHRoYXQgdGhpcyBhcnJheSBtYXkgY2hhbmdlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGludm9rZUR5bmFtaWMoU3RyaW5nIG5hbWUsIFN0cmluZyBkZXNjLCBIYW5kbGUgYnNtLCBPYmplY3QuLi4gYnNtQXJncykgeworICAgICAgICBtdi52aXNpdEludm9rZUR5bmFtaWNJbnNuKG5hbWUsIGRlc2MsIGJzbSwgYnNtQXJncyk7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gSW5zdHJ1Y3Rpb25zIHRvIGNyZWF0ZSBvYmplY3RzIGFuZCBhcnJheXMKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlcyBhIHR5cGUgZGVwZW5kZW50IGluc3RydWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIG9wY29kZSB0aGUgaW5zdHJ1Y3Rpb24ncyBvcGNvZGUuCisgICAgICogQHBhcmFtIHR5cGUgdGhlIGluc3RydWN0aW9uJ3Mgb3BlcmFuZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgdHlwZUluc24oZmluYWwgaW50IG9wY29kZSwgZmluYWwgVHlwZSB0eXBlKSB7CisgICAgICAgIG12LnZpc2l0VHlwZUluc24ob3Bjb2RlLCB0eXBlLmdldEludGVybmFsTmFtZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZXMgdGhlIGluc3RydWN0aW9uIHRvIGNyZWF0ZSBhIG5ldyBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZSB0aGUgY2xhc3Mgb2YgdGhlIG9iamVjdCB0byBiZSBjcmVhdGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG5ld0luc3RhbmNlKGZpbmFsIFR5cGUgdHlwZSkgeworICAgICAgICB0eXBlSW5zbihPcGNvZGVzLk5FVywgdHlwZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2VuZXJhdGVzIHRoZSBpbnN0cnVjdGlvbiB0byBjcmVhdGUgYSBuZXcgYXJyYXkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBvZiB0aGUgYXJyYXkgZWxlbWVudHMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgbmV3QXJyYXkoZmluYWwgVHlwZSB0eXBlKSB7CisgICAgICAgIGludCB0eXA7CisgICAgICAgIHN3aXRjaCAodHlwZS5nZXRTb3J0KCkpIHsKKyAgICAgICAgICAgIGNhc2UgVHlwZS5CT09MRUFOOgorICAgICAgICAgICAgICAgIHR5cCA9IE9wY29kZXMuVF9CT09MRUFOOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBUeXBlLkNIQVI6CisgICAgICAgICAgICAgICAgdHlwID0gT3Bjb2Rlcy5UX0NIQVI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFR5cGUuQllURToKKyAgICAgICAgICAgICAgICB0eXAgPSBPcGNvZGVzLlRfQllURTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVHlwZS5TSE9SVDoKKyAgICAgICAgICAgICAgICB0eXAgPSBPcGNvZGVzLlRfU0hPUlQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFR5cGUuSU5UOgorICAgICAgICAgICAgICAgIHR5cCA9IE9wY29kZXMuVF9JTlQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFR5cGUuRkxPQVQ6CisgICAgICAgICAgICAgICAgdHlwID0gT3Bjb2Rlcy5UX0ZMT0FUOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBUeXBlLkxPTkc6CisgICAgICAgICAgICAgICAgdHlwID0gT3Bjb2Rlcy5UX0xPTkc7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFR5cGUuRE9VQkxFOgorICAgICAgICAgICAgICAgIHR5cCA9IE9wY29kZXMuVF9ET1VCTEU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHR5cGVJbnNuKE9wY29kZXMuQU5FV0FSUkFZLCB0eXBlKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbXYudmlzaXRJbnRJbnNuKE9wY29kZXMuTkVXQVJSQVksIHR5cCk7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gTWlzY2VsYW5lb3VzIGluc3RydWN0aW9ucworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLyoqCisgICAgICogR2VuZXJhdGVzIHRoZSBpbnN0cnVjdGlvbiB0byBjb21wdXRlIHRoZSBsZW5ndGggb2YgYW4gYXJyYXkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYXJyYXlMZW5ndGgoKSB7CisgICAgICAgIG12LnZpc2l0SW5zbihPcGNvZGVzLkFSUkFZTEVOR1RIKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZXMgdGhlIGluc3RydWN0aW9uIHRvIHRocm93IGFuIGV4Y2VwdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0aHJvd0V4Y2VwdGlvbigpIHsKKyAgICAgICAgbXYudmlzaXRJbnNuKE9wY29kZXMuQVRIUk9XKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZXMgdGhlIGluc3RydWN0aW9ucyB0byBjcmVhdGUgYW5kIHRocm93IGFuIGV4Y2VwdGlvbi4gVGhlCisgICAgICogZXhjZXB0aW9uIGNsYXNzIG11c3QgaGF2ZSBhIGNvbnN0cnVjdG9yIHdpdGggYSBzaW5nbGUgU3RyaW5nIGFyZ3VtZW50LgorICAgICAqCisgICAgICogQHBhcmFtIHR5cGUgdGhlIGNsYXNzIG9mIHRoZSBleGNlcHRpb24gdG8gYmUgdGhyb3duLgorICAgICAqIEBwYXJhbSBtc2cgdGhlIGRldGFpbGVkIG1lc3NhZ2Ugb2YgdGhlIGV4Y2VwdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0aHJvd0V4Y2VwdGlvbihmaW5hbCBUeXBlIHR5cGUsIGZpbmFsIFN0cmluZyBtc2cpIHsKKyAgICAgICAgbmV3SW5zdGFuY2UodHlwZSk7CisgICAgICAgIGR1cCgpOworICAgICAgICBwdXNoKG1zZyk7CisgICAgICAgIGludm9rZUNvbnN0cnVjdG9yKHR5cGUsIE1ldGhvZC5nZXRNZXRob2QoInZvaWQgPGluaXQ+IChTdHJpbmcpIikpOworICAgICAgICB0aHJvd0V4Y2VwdGlvbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlcyB0aGUgaW5zdHJ1Y3Rpb24gdG8gY2hlY2sgdGhhdCB0aGUgdG9wIHN0YWNrIHZhbHVlIGlzIG9mIHRoZQorICAgICAqIGdpdmVuIHR5cGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZSBhIGNsYXNzIG9yIGludGVyZmFjZSB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNoZWNrQ2FzdChmaW5hbCBUeXBlIHR5cGUpIHsKKyAgICAgICAgaWYgKCF0eXBlLmVxdWFscyhPQkpFQ1RfVFlQRSkpIHsKKyAgICAgICAgICAgIHR5cGVJbnNuKE9wY29kZXMuQ0hFQ0tDQVNULCB0eXBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlcyB0aGUgaW5zdHJ1Y3Rpb24gdG8gdGVzdCBpZiB0aGUgdG9wIHN0YWNrIHZhbHVlIGlzIG9mIHRoZSBnaXZlbgorICAgICAqIHR5cGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZSBhIGNsYXNzIG9yIGludGVyZmFjZSB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGluc3RhbmNlT2YoZmluYWwgVHlwZSB0eXBlKSB7CisgICAgICAgIHR5cGVJbnNuKE9wY29kZXMuSU5TVEFOQ0VPRiwgdHlwZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2VuZXJhdGVzIHRoZSBpbnN0cnVjdGlvbiB0byBnZXQgdGhlIG1vbml0b3Igb2YgdGhlIHRvcCBzdGFjayB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBtb25pdG9yRW50ZXIoKSB7CisgICAgICAgIG12LnZpc2l0SW5zbihPcGNvZGVzLk1PTklUT1JFTlRFUik7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2VuZXJhdGVzIHRoZSBpbnN0cnVjdGlvbiB0byByZWxlYXNlIHRoZSBtb25pdG9yIG9mIHRoZSB0b3Agc3RhY2sgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgbW9uaXRvckV4aXQoKSB7CisgICAgICAgIG12LnZpc2l0SW5zbihPcGNvZGVzLk1PTklUT1JFWElUKTsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBOb24gaW5zdHJ1Y3Rpb25zCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvKioKKyAgICAgKiBNYXJrcyB0aGUgZW5kIG9mIHRoZSB2aXNpdGVkIG1ldGhvZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBlbmRNZXRob2QoKSB7CisgICAgICAgIGlmICgoYWNjZXNzICYgT3Bjb2Rlcy5BQ0NfQUJTVFJBQ1QpID09IDApIHsKKyAgICAgICAgICAgIG12LnZpc2l0TWF4cygwLCAwKTsKKyAgICAgICAgfQorICAgICAgICBtdi52aXNpdEVuZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1hcmtzIHRoZSBzdGFydCBvZiBhbiBleGNlcHRpb24gaGFuZGxlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdGFydCBiZWdpbm5pbmcgb2YgdGhlIGV4Y2VwdGlvbiBoYW5kbGVyJ3Mgc2NvcGUgKGluY2x1c2l2ZSkuCisgICAgICogQHBhcmFtIGVuZCBlbmQgb2YgdGhlIGV4Y2VwdGlvbiBoYW5kbGVyJ3Mgc2NvcGUgKGV4Y2x1c2l2ZSkuCisgICAgICogQHBhcmFtIGV4Y2VwdGlvbiBpbnRlcm5hbCBuYW1lIG9mIHRoZSB0eXBlIG9mIGV4Y2VwdGlvbnMgaGFuZGxlZCBieSB0aGUKKyAgICAgKiAgICAgICAgaGFuZGxlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjYXRjaEV4Y2VwdGlvbigKKyAgICAgICAgZmluYWwgTGFiZWwgc3RhcnQsCisgICAgICAgIGZpbmFsIExhYmVsIGVuZCwKKyAgICAgICAgZmluYWwgVHlwZSBleGNlcHRpb24pCisgICAgeworICAgICAgICBpZiAoZXhjZXB0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgIG12LnZpc2l0VHJ5Q2F0Y2hCbG9jayhzdGFydCwgZW5kLCBtYXJrKCksIG51bGwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbXYudmlzaXRUcnlDYXRjaEJsb2NrKHN0YXJ0LCBlbmQsIG1hcmsoKSwgZXhjZXB0aW9uLmdldEludGVybmFsTmFtZSgpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vY29tbW9ucy9JbnN0cnVjdGlvbkFkYXB0ZXIuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vY29tbW9ucy9JbnN0cnVjdGlvbkFkYXB0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTYzYjIzCi0tLSAvZGV2L251bGwKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS9jb21tb25zL0luc3RydWN0aW9uQWRhcHRlci5qYXZhCkBAIC0wLDAgKzEsMTE3MCBAQAorLyoKKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgT3JhY2xlIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCisgKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CisgKiBxdWVzdGlvbnMuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBpcyBhdmFpbGFibGUgdW5kZXIgYW5kIGdvdmVybmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogSG93ZXZlciwgdGhlIGZvbGxvd2luZyBub3RpY2UgYWNjb21wYW5pZWQgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhpcworICogZmlsZToKKyAqCisgKiBBU006IGEgdmVyeSBzbWFsbCBhbmQgZmFzdCBKYXZhIGJ5dGVjb2RlIG1hbmlwdWxhdGlvbiBmcmFtZXdvcmsKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDExIElOUklBLCBGcmFuY2UgVGVsZWNvbQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK3BhY2thZ2UgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLmNvbW1vbnM7CisKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uSGFuZGxlOworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5MYWJlbDsKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uTWV0aG9kVmlzaXRvcjsKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uT3Bjb2RlczsKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uVHlwZTsKKworLyoqCisgKiBBIHtAbGluayBNZXRob2RWaXNpdG9yfSBwcm92aWRpbmcgYSBtb3JlIGRldGFpbGVkIEFQSSB0byBnZW5lcmF0ZSBhbmQKKyAqIHRyYW5zZm9ybSBpbnN0cnVjdGlvbnMuCisgKgorICogQGF1dGhvciBFcmljIEJydW5ldG9uCisgKi8KK3B1YmxpYyBjbGFzcyBJbnN0cnVjdGlvbkFkYXB0ZXIgZXh0ZW5kcyBNZXRob2RWaXNpdG9yIHsKKworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgVHlwZSBPQkpFQ1RfVFlQRSA9IFR5cGUuZ2V0VHlwZSgiTGphdmEvbGFuZy9PYmplY3Q7Iik7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBJbnN0cnVjdGlvbkFkYXB0ZXJ9LiA8aT5TdWJjbGFzc2VzIG11c3Qgbm90IHVzZSB0aGlzCisgICAgICogY29uc3RydWN0b3I8L2k+LiBJbnN0ZWFkLCB0aGV5IG11c3QgdXNlIHRoZQorICAgICAqIHtAbGluayAjSW5zdHJ1Y3Rpb25BZGFwdGVyKGludCwgTWV0aG9kVmlzaXRvcil9IHZlcnNpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbXYgdGhlIG1ldGhvZCB2aXNpdG9yIHRvIHdoaWNoIHRoaXMgYWRhcHRlciBkZWxlZ2F0ZXMgY2FsbHMuCisgICAgICovCisgICAgcHVibGljIEluc3RydWN0aW9uQWRhcHRlcihmaW5hbCBNZXRob2RWaXNpdG9yIG12KSB7CisgICAgICAgIHRoaXMoT3Bjb2Rlcy5BU000LCBtdik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgSW5zdHJ1Y3Rpb25BZGFwdGVyfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcGkgdGhlIEFTTSBBUEkgdmVyc2lvbiBpbXBsZW1lbnRlZCBieSB0aGlzIHZpc2l0b3IuIE11c3QgYmUgb25lCisgICAgICogICAgICAgIG9mIHtAbGluayBPcGNvZGVzI0FTTTR9LgorICAgICAqIEBwYXJhbSBtdiB0aGUgbWV0aG9kIHZpc2l0b3IgdG8gd2hpY2ggdGhpcyBhZGFwdGVyIGRlbGVnYXRlcyBjYWxscy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgSW5zdHJ1Y3Rpb25BZGFwdGVyKGZpbmFsIGludCBhcGksIGZpbmFsIE1ldGhvZFZpc2l0b3IgbXYpIHsKKyAgICAgICAgc3VwZXIoYXBpLCBtdik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRJbnNuKGZpbmFsIGludCBvcGNvZGUpIHsKKyAgICAgICAgc3dpdGNoIChvcGNvZGUpIHsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5OT1A6CisgICAgICAgICAgICAgICAgbm9wKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuQUNPTlNUX05VTEw6CisgICAgICAgICAgICAgICAgYWNvbnN0KG51bGwpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLklDT05TVF9NMToKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JQ09OU1RfMDoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JQ09OU1RfMToKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JQ09OU1RfMjoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JQ09OU1RfMzoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JQ09OU1RfNDoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JQ09OU1RfNToKKyAgICAgICAgICAgICAgICBpY29uc3Qob3Bjb2RlIC0gT3Bjb2Rlcy5JQ09OU1RfMCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuTENPTlNUXzA6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuTENPTlNUXzE6CisgICAgICAgICAgICAgICAgbGNvbnN0KG9wY29kZSAtIE9wY29kZXMuTENPTlNUXzApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkZDT05TVF8wOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkZDT05TVF8xOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkZDT05TVF8yOgorICAgICAgICAgICAgICAgIGZjb25zdChvcGNvZGUgLSBPcGNvZGVzLkZDT05TVF8wKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5EQ09OU1RfMDoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5EQ09OU1RfMToKKyAgICAgICAgICAgICAgICBkY29uc3Qob3Bjb2RlIC0gT3Bjb2Rlcy5EQ09OU1RfMCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSUFMT0FEOgorICAgICAgICAgICAgICAgIGFsb2FkKFR5cGUuSU5UX1RZUEUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkxBTE9BRDoKKyAgICAgICAgICAgICAgICBhbG9hZChUeXBlLkxPTkdfVFlQRSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRkFMT0FEOgorICAgICAgICAgICAgICAgIGFsb2FkKFR5cGUuRkxPQVRfVFlQRSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuREFMT0FEOgorICAgICAgICAgICAgICAgIGFsb2FkKFR5cGUuRE9VQkxFX1RZUEUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkFBTE9BRDoKKyAgICAgICAgICAgICAgICBhbG9hZChPQkpFQ1RfVFlQRSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuQkFMT0FEOgorICAgICAgICAgICAgICAgIGFsb2FkKFR5cGUuQllURV9UWVBFKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5DQUxPQUQ6CisgICAgICAgICAgICAgICAgYWxvYWQoVHlwZS5DSEFSX1RZUEUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLlNBTE9BRDoKKyAgICAgICAgICAgICAgICBhbG9hZChUeXBlLlNIT1JUX1RZUEUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLklBU1RPUkU6CisgICAgICAgICAgICAgICAgYXN0b3JlKFR5cGUuSU5UX1RZUEUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkxBU1RPUkU6CisgICAgICAgICAgICAgICAgYXN0b3JlKFR5cGUuTE9OR19UWVBFKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5GQVNUT1JFOgorICAgICAgICAgICAgICAgIGFzdG9yZShUeXBlLkZMT0FUX1RZUEUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkRBU1RPUkU6CisgICAgICAgICAgICAgICAgYXN0b3JlKFR5cGUuRE9VQkxFX1RZUEUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkFBU1RPUkU6CisgICAgICAgICAgICAgICAgYXN0b3JlKE9CSkVDVF9UWVBFKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5CQVNUT1JFOgorICAgICAgICAgICAgICAgIGFzdG9yZShUeXBlLkJZVEVfVFlQRSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuQ0FTVE9SRToKKyAgICAgICAgICAgICAgICBhc3RvcmUoVHlwZS5DSEFSX1RZUEUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLlNBU1RPUkU6CisgICAgICAgICAgICAgICAgYXN0b3JlKFR5cGUuU0hPUlRfVFlQRSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuUE9QOgorICAgICAgICAgICAgICAgIHBvcCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLlBPUDI6CisgICAgICAgICAgICAgICAgcG9wMigpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkRVUDoKKyAgICAgICAgICAgICAgICBkdXAoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5EVVBfWDE6CisgICAgICAgICAgICAgICAgZHVwWDEoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5EVVBfWDI6CisgICAgICAgICAgICAgICAgZHVwWDIoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5EVVAyOgorICAgICAgICAgICAgICAgIGR1cDIoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5EVVAyX1gxOgorICAgICAgICAgICAgICAgIGR1cDJYMSgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkRVUDJfWDI6CisgICAgICAgICAgICAgICAgZHVwMlgyKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuU1dBUDoKKyAgICAgICAgICAgICAgICBzd2FwKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSUFERDoKKyAgICAgICAgICAgICAgICBhZGQoVHlwZS5JTlRfVFlQRSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuTEFERDoKKyAgICAgICAgICAgICAgICBhZGQoVHlwZS5MT05HX1RZUEUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkZBREQ6CisgICAgICAgICAgICAgICAgYWRkKFR5cGUuRkxPQVRfVFlQRSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuREFERDoKKyAgICAgICAgICAgICAgICBhZGQoVHlwZS5ET1VCTEVfVFlQRSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSVNVQjoKKyAgICAgICAgICAgICAgICBzdWIoVHlwZS5JTlRfVFlQRSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuTFNVQjoKKyAgICAgICAgICAgICAgICBzdWIoVHlwZS5MT05HX1RZUEUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkZTVUI6CisgICAgICAgICAgICAgICAgc3ViKFR5cGUuRkxPQVRfVFlQRSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRFNVQjoKKyAgICAgICAgICAgICAgICBzdWIoVHlwZS5ET1VCTEVfVFlQRSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSU1VTDoKKyAgICAgICAgICAgICAgICBtdWwoVHlwZS5JTlRfVFlQRSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuTE1VTDoKKyAgICAgICAgICAgICAgICBtdWwoVHlwZS5MT05HX1RZUEUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkZNVUw6CisgICAgICAgICAgICAgICAgbXVsKFR5cGUuRkxPQVRfVFlQRSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRE1VTDoKKyAgICAgICAgICAgICAgICBtdWwoVHlwZS5ET1VCTEVfVFlQRSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSURJVjoKKyAgICAgICAgICAgICAgICBkaXYoVHlwZS5JTlRfVFlQRSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuTERJVjoKKyAgICAgICAgICAgICAgICBkaXYoVHlwZS5MT05HX1RZUEUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkZESVY6CisgICAgICAgICAgICAgICAgZGl2KFR5cGUuRkxPQVRfVFlQRSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRERJVjoKKyAgICAgICAgICAgICAgICBkaXYoVHlwZS5ET1VCTEVfVFlQRSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSVJFTToKKyAgICAgICAgICAgICAgICByZW0oVHlwZS5JTlRfVFlQRSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuTFJFTToKKyAgICAgICAgICAgICAgICByZW0oVHlwZS5MT05HX1RZUEUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkZSRU06CisgICAgICAgICAgICAgICAgcmVtKFR5cGUuRkxPQVRfVFlQRSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRFJFTToKKyAgICAgICAgICAgICAgICByZW0oVHlwZS5ET1VCTEVfVFlQRSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSU5FRzoKKyAgICAgICAgICAgICAgICBuZWcoVHlwZS5JTlRfVFlQRSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuTE5FRzoKKyAgICAgICAgICAgICAgICBuZWcoVHlwZS5MT05HX1RZUEUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkZORUc6CisgICAgICAgICAgICAgICAgbmVnKFR5cGUuRkxPQVRfVFlQRSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRE5FRzoKKyAgICAgICAgICAgICAgICBuZWcoVHlwZS5ET1VCTEVfVFlQRSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSVNITDoKKyAgICAgICAgICAgICAgICBzaGwoVHlwZS5JTlRfVFlQRSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuTFNITDoKKyAgICAgICAgICAgICAgICBzaGwoVHlwZS5MT05HX1RZUEUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLklTSFI6CisgICAgICAgICAgICAgICAgc2hyKFR5cGUuSU5UX1RZUEUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkxTSFI6CisgICAgICAgICAgICAgICAgc2hyKFR5cGUuTE9OR19UWVBFKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JVVNIUjoKKyAgICAgICAgICAgICAgICB1c2hyKFR5cGUuSU5UX1RZUEUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkxVU0hSOgorICAgICAgICAgICAgICAgIHVzaHIoVHlwZS5MT05HX1RZUEUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLklBTkQ6CisgICAgICAgICAgICAgICAgYW5kKFR5cGUuSU5UX1RZUEUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkxBTkQ6CisgICAgICAgICAgICAgICAgYW5kKFR5cGUuTE9OR19UWVBFKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JT1I6CisgICAgICAgICAgICAgICAgb3IoVHlwZS5JTlRfVFlQRSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuTE9SOgorICAgICAgICAgICAgICAgIG9yKFR5cGUuTE9OR19UWVBFKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JWE9SOgorICAgICAgICAgICAgICAgIHhvcihUeXBlLklOVF9UWVBFKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5MWE9SOgorICAgICAgICAgICAgICAgIHhvcihUeXBlLkxPTkdfVFlQRSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSTJMOgorICAgICAgICAgICAgICAgIGNhc3QoVHlwZS5JTlRfVFlQRSwgVHlwZS5MT05HX1RZUEUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkkyRjoKKyAgICAgICAgICAgICAgICBjYXN0KFR5cGUuSU5UX1RZUEUsIFR5cGUuRkxPQVRfVFlQRSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSTJEOgorICAgICAgICAgICAgICAgIGNhc3QoVHlwZS5JTlRfVFlQRSwgVHlwZS5ET1VCTEVfVFlQRSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuTDJJOgorICAgICAgICAgICAgICAgIGNhc3QoVHlwZS5MT05HX1RZUEUsIFR5cGUuSU5UX1RZUEUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkwyRjoKKyAgICAgICAgICAgICAgICBjYXN0KFR5cGUuTE9OR19UWVBFLCBUeXBlLkZMT0FUX1RZUEUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkwyRDoKKyAgICAgICAgICAgICAgICBjYXN0KFR5cGUuTE9OR19UWVBFLCBUeXBlLkRPVUJMRV9UWVBFKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5GMkk6CisgICAgICAgICAgICAgICAgY2FzdChUeXBlLkZMT0FUX1RZUEUsIFR5cGUuSU5UX1RZUEUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkYyTDoKKyAgICAgICAgICAgICAgICBjYXN0KFR5cGUuRkxPQVRfVFlQRSwgVHlwZS5MT05HX1RZUEUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkYyRDoKKyAgICAgICAgICAgICAgICBjYXN0KFR5cGUuRkxPQVRfVFlQRSwgVHlwZS5ET1VCTEVfVFlQRSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRDJJOgorICAgICAgICAgICAgICAgIGNhc3QoVHlwZS5ET1VCTEVfVFlQRSwgVHlwZS5JTlRfVFlQRSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRDJMOgorICAgICAgICAgICAgICAgIGNhc3QoVHlwZS5ET1VCTEVfVFlQRSwgVHlwZS5MT05HX1RZUEUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkQyRjoKKyAgICAgICAgICAgICAgICBjYXN0KFR5cGUuRE9VQkxFX1RZUEUsIFR5cGUuRkxPQVRfVFlQRSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSTJCOgorICAgICAgICAgICAgICAgIGNhc3QoVHlwZS5JTlRfVFlQRSwgVHlwZS5CWVRFX1RZUEUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkkyQzoKKyAgICAgICAgICAgICAgICBjYXN0KFR5cGUuSU5UX1RZUEUsIFR5cGUuQ0hBUl9UWVBFKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JMlM6CisgICAgICAgICAgICAgICAgY2FzdChUeXBlLklOVF9UWVBFLCBUeXBlLlNIT1JUX1RZUEUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkxDTVA6CisgICAgICAgICAgICAgICAgbGNtcCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkZDTVBMOgorICAgICAgICAgICAgICAgIGNtcGwoVHlwZS5GTE9BVF9UWVBFKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5GQ01QRzoKKyAgICAgICAgICAgICAgICBjbXBnKFR5cGUuRkxPQVRfVFlQRSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRENNUEw6CisgICAgICAgICAgICAgICAgY21wbChUeXBlLkRPVUJMRV9UWVBFKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5EQ01QRzoKKyAgICAgICAgICAgICAgICBjbXBnKFR5cGUuRE9VQkxFX1RZUEUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLklSRVRVUk46CisgICAgICAgICAgICAgICAgYXJldHVybihUeXBlLklOVF9UWVBFKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5MUkVUVVJOOgorICAgICAgICAgICAgICAgIGFyZXR1cm4oVHlwZS5MT05HX1RZUEUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkZSRVRVUk46CisgICAgICAgICAgICAgICAgYXJldHVybihUeXBlLkZMT0FUX1RZUEUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkRSRVRVUk46CisgICAgICAgICAgICAgICAgYXJldHVybihUeXBlLkRPVUJMRV9UWVBFKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5BUkVUVVJOOgorICAgICAgICAgICAgICAgIGFyZXR1cm4oT0JKRUNUX1RZUEUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLlJFVFVSTjoKKyAgICAgICAgICAgICAgICBhcmV0dXJuKFR5cGUuVk9JRF9UWVBFKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5BUlJBWUxFTkdUSDoKKyAgICAgICAgICAgICAgICBhcnJheWxlbmd0aCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkFUSFJPVzoKKyAgICAgICAgICAgICAgICBhdGhyb3coKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5NT05JVE9SRU5URVI6CisgICAgICAgICAgICAgICAgbW9uaXRvcmVudGVyKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuTU9OSVRPUkVYSVQ6CisgICAgICAgICAgICAgICAgbW9uaXRvcmV4aXQoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRJbnRJbnNuKGZpbmFsIGludCBvcGNvZGUsIGZpbmFsIGludCBvcGVyYW5kKSB7CisgICAgICAgIHN3aXRjaCAob3Bjb2RlKSB7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuQklQVVNIOgorICAgICAgICAgICAgICAgIGljb25zdChvcGVyYW5kKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5TSVBVU0g6CisgICAgICAgICAgICAgICAgaWNvbnN0KG9wZXJhbmQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLk5FV0FSUkFZOgorICAgICAgICAgICAgICAgIHN3aXRjaCAob3BlcmFuZCkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIE9wY29kZXMuVF9CT09MRUFOOgorICAgICAgICAgICAgICAgICAgICAgICAgbmV3YXJyYXkoVHlwZS5CT09MRUFOX1RZUEUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5UX0NIQVI6CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdhcnJheShUeXBlLkNIQVJfVFlQRSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBPcGNvZGVzLlRfQllURToKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld2FycmF5KFR5cGUuQllURV9UWVBFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIE9wY29kZXMuVF9TSE9SVDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld2FycmF5KFR5cGUuU0hPUlRfVFlQRSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBPcGNvZGVzLlRfSU5UOgorICAgICAgICAgICAgICAgICAgICAgICAgbmV3YXJyYXkoVHlwZS5JTlRfVFlQRSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBPcGNvZGVzLlRfRkxPQVQ6CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdhcnJheShUeXBlLkZMT0FUX1RZUEUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5UX0xPTkc6CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdhcnJheShUeXBlLkxPTkdfVFlQRSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBPcGNvZGVzLlRfRE9VQkxFOgorICAgICAgICAgICAgICAgICAgICAgICAgbmV3YXJyYXkoVHlwZS5ET1VCTEVfVFlQRSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0VmFySW5zbihmaW5hbCBpbnQgb3Bjb2RlLCBmaW5hbCBpbnQgdmFyKSB7CisgICAgICAgIHN3aXRjaCAob3Bjb2RlKSB7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSUxPQUQ6CisgICAgICAgICAgICAgICAgbG9hZCh2YXIsIFR5cGUuSU5UX1RZUEUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkxMT0FEOgorICAgICAgICAgICAgICAgIGxvYWQodmFyLCBUeXBlLkxPTkdfVFlQRSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRkxPQUQ6CisgICAgICAgICAgICAgICAgbG9hZCh2YXIsIFR5cGUuRkxPQVRfVFlQRSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRExPQUQ6CisgICAgICAgICAgICAgICAgbG9hZCh2YXIsIFR5cGUuRE9VQkxFX1RZUEUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkFMT0FEOgorICAgICAgICAgICAgICAgIGxvYWQodmFyLCBPQkpFQ1RfVFlQRSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSVNUT1JFOgorICAgICAgICAgICAgICAgIHN0b3JlKHZhciwgVHlwZS5JTlRfVFlQRSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuTFNUT1JFOgorICAgICAgICAgICAgICAgIHN0b3JlKHZhciwgVHlwZS5MT05HX1RZUEUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkZTVE9SRToKKyAgICAgICAgICAgICAgICBzdG9yZSh2YXIsIFR5cGUuRkxPQVRfVFlQRSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRFNUT1JFOgorICAgICAgICAgICAgICAgIHN0b3JlKHZhciwgVHlwZS5ET1VCTEVfVFlQRSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuQVNUT1JFOgorICAgICAgICAgICAgICAgIHN0b3JlKHZhciwgT0JKRUNUX1RZUEUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLlJFVDoKKyAgICAgICAgICAgICAgICByZXQodmFyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRUeXBlSW5zbihmaW5hbCBpbnQgb3Bjb2RlLCBmaW5hbCBTdHJpbmcgdHlwZSkgeworICAgICAgICBUeXBlIHQgPSBUeXBlLmdldE9iamVjdFR5cGUodHlwZSk7CisgICAgICAgIHN3aXRjaCAob3Bjb2RlKSB7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuTkVXOgorICAgICAgICAgICAgICAgIGFuZXcodCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuQU5FV0FSUkFZOgorICAgICAgICAgICAgICAgIG5ld2FycmF5KHQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkNIRUNLQ0FTVDoKKyAgICAgICAgICAgICAgICBjaGVja2Nhc3QodCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSU5TVEFOQ0VPRjoKKyAgICAgICAgICAgICAgICBpbnN0YW5jZU9mKHQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEZpZWxkSW5zbigKKyAgICAgICAgZmluYWwgaW50IG9wY29kZSwKKyAgICAgICAgZmluYWwgU3RyaW5nIG93bmVyLAorICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSwKKyAgICAgICAgZmluYWwgU3RyaW5nIGRlc2MpCisgICAgeworICAgICAgICBzd2l0Y2ggKG9wY29kZSkgeworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkdFVFNUQVRJQzoKKyAgICAgICAgICAgICAgICBnZXRzdGF0aWMob3duZXIsIG5hbWUsIGRlc2MpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLlBVVFNUQVRJQzoKKyAgICAgICAgICAgICAgICBwdXRzdGF0aWMob3duZXIsIG5hbWUsIGRlc2MpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkdFVEZJRUxEOgorICAgICAgICAgICAgICAgIGdldGZpZWxkKG93bmVyLCBuYW1lLCBkZXNjKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5QVVRGSUVMRDoKKyAgICAgICAgICAgICAgICBwdXRmaWVsZChvd25lciwgbmFtZSwgZGVzYyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TWV0aG9kSW5zbigKKyAgICAgICAgZmluYWwgaW50IG9wY29kZSwKKyAgICAgICAgZmluYWwgU3RyaW5nIG93bmVyLAorICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSwKKyAgICAgICAgZmluYWwgU3RyaW5nIGRlc2MpCisgICAgeworICAgICAgICBzd2l0Y2ggKG9wY29kZSkgeworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLklOVk9LRVNQRUNJQUw6CisgICAgICAgICAgICAgICAgaW52b2tlc3BlY2lhbChvd25lciwgbmFtZSwgZGVzYyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSU5WT0tFVklSVFVBTDoKKyAgICAgICAgICAgICAgICBpbnZva2V2aXJ0dWFsKG93bmVyLCBuYW1lLCBkZXNjKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JTlZPS0VTVEFUSUM6CisgICAgICAgICAgICAgICAgaW52b2tlc3RhdGljKG93bmVyLCBuYW1lLCBkZXNjKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JTlZPS0VJTlRFUkZBQ0U6CisgICAgICAgICAgICAgICAgaW52b2tlaW50ZXJmYWNlKG93bmVyLCBuYW1lLCBkZXNjKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRJbnZva2VEeW5hbWljSW5zbigKKyAgICAgICAgU3RyaW5nIG5hbWUsCisgICAgICAgIFN0cmluZyBkZXNjLAorICAgICAgICBIYW5kbGUgYnNtLAorICAgICAgICBPYmplY3QuLi4gYnNtQXJncykKKyAgICB7CisgICAgICAgaW52b2tlZHluYW1pYyhuYW1lLCBkZXNjLCBic20sIGJzbUFyZ3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0SnVtcEluc24oZmluYWwgaW50IG9wY29kZSwgZmluYWwgTGFiZWwgbGFiZWwpIHsKKyAgICAgICAgc3dpdGNoIChvcGNvZGUpIHsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JRkVROgorICAgICAgICAgICAgICAgIGlmZXEobGFiZWwpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLklGTkU6CisgICAgICAgICAgICAgICAgaWZuZShsYWJlbCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSUZMVDoKKyAgICAgICAgICAgICAgICBpZmx0KGxhYmVsKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JRkdFOgorICAgICAgICAgICAgICAgIGlmZ2UobGFiZWwpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLklGR1Q6CisgICAgICAgICAgICAgICAgaWZndChsYWJlbCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSUZMRToKKyAgICAgICAgICAgICAgICBpZmxlKGxhYmVsKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JRl9JQ01QRVE6CisgICAgICAgICAgICAgICAgaWZpY21wZXEobGFiZWwpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLklGX0lDTVBORToKKyAgICAgICAgICAgICAgICBpZmljbXBuZShsYWJlbCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSUZfSUNNUExUOgorICAgICAgICAgICAgICAgIGlmaWNtcGx0KGxhYmVsKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JRl9JQ01QR0U6CisgICAgICAgICAgICAgICAgaWZpY21wZ2UobGFiZWwpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLklGX0lDTVBHVDoKKyAgICAgICAgICAgICAgICBpZmljbXBndChsYWJlbCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSUZfSUNNUExFOgorICAgICAgICAgICAgICAgIGlmaWNtcGxlKGxhYmVsKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JRl9BQ01QRVE6CisgICAgICAgICAgICAgICAgaWZhY21wZXEobGFiZWwpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLklGX0FDTVBORToKKyAgICAgICAgICAgICAgICBpZmFjbXBuZShsYWJlbCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuR09UTzoKKyAgICAgICAgICAgICAgICBnb1RvKGxhYmVsKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5KU1I6CisgICAgICAgICAgICAgICAganNyKGxhYmVsKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JRk5VTEw6CisgICAgICAgICAgICAgICAgaWZudWxsKGxhYmVsKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JRk5PTk5VTEw6CisgICAgICAgICAgICAgICAgaWZub25udWxsKGxhYmVsKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRMYWJlbChmaW5hbCBMYWJlbCBsYWJlbCkgeworICAgICAgICBtYXJrKGxhYmVsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdExkY0luc24oZmluYWwgT2JqZWN0IGNzdCkgeworICAgICAgICBpZiAoY3N0IGluc3RhbmNlb2YgSW50ZWdlcikgeworICAgICAgICAgICAgaW50IHZhbCA9ICgoSW50ZWdlcikgY3N0KS5pbnRWYWx1ZSgpOworICAgICAgICAgICAgaWNvbnN0KHZhbCk7CisgICAgICAgIH0gZWxzZSBpZiAoY3N0IGluc3RhbmNlb2YgQnl0ZSkgeworICAgICAgICAgICAgaW50IHZhbCA9ICgoQnl0ZSkgY3N0KS5pbnRWYWx1ZSgpOworICAgICAgICAgICAgaWNvbnN0KHZhbCk7CisgICAgICAgIH0gZWxzZSBpZiAoY3N0IGluc3RhbmNlb2YgQ2hhcmFjdGVyKSB7CisgICAgICAgICAgICBpbnQgdmFsID0gKChDaGFyYWN0ZXIpIGNzdCkuY2hhclZhbHVlKCk7CisgICAgICAgICAgICBpY29uc3QodmFsKTsKKyAgICAgICAgfSBlbHNlIGlmIChjc3QgaW5zdGFuY2VvZiBTaG9ydCkgeworICAgICAgICAgICAgaW50IHZhbCA9ICgoU2hvcnQpIGNzdCkuaW50VmFsdWUoKTsKKyAgICAgICAgICAgIGljb25zdCh2YWwpOworICAgICAgICB9IGVsc2UgaWYgKGNzdCBpbnN0YW5jZW9mIEJvb2xlYW4pIHsKKyAgICAgICAgICAgIGludCB2YWwgPSAoKEJvb2xlYW4pIGNzdCkuYm9vbGVhblZhbHVlKCkgPyAxIDogMDsKKyAgICAgICAgICAgIGljb25zdCh2YWwpOworICAgICAgICB9IGVsc2UgaWYgKGNzdCBpbnN0YW5jZW9mIEZsb2F0KSB7CisgICAgICAgICAgICBmbG9hdCB2YWwgPSAoKEZsb2F0KSBjc3QpLmZsb2F0VmFsdWUoKTsKKyAgICAgICAgICAgIGZjb25zdCh2YWwpOworICAgICAgICB9IGVsc2UgaWYgKGNzdCBpbnN0YW5jZW9mIExvbmcpIHsKKyAgICAgICAgICAgIGxvbmcgdmFsID0gKChMb25nKSBjc3QpLmxvbmdWYWx1ZSgpOworICAgICAgICAgICAgbGNvbnN0KHZhbCk7CisgICAgICAgIH0gZWxzZSBpZiAoY3N0IGluc3RhbmNlb2YgRG91YmxlKSB7CisgICAgICAgICAgICBkb3VibGUgdmFsID0gKChEb3VibGUpIGNzdCkuZG91YmxlVmFsdWUoKTsKKyAgICAgICAgICAgIGRjb25zdCh2YWwpOworICAgICAgICB9IGVsc2UgaWYgKGNzdCBpbnN0YW5jZW9mIFN0cmluZykgeworICAgICAgICAgICAgYWNvbnN0KGNzdCk7CisgICAgICAgIH0gZWxzZSBpZiAoY3N0IGluc3RhbmNlb2YgVHlwZSkgeworICAgICAgICAgICAgdGNvbnN0KChUeXBlKSBjc3QpOworICAgICAgICB9IGVsc2UgaWYgKGNzdCBpbnN0YW5jZW9mIEhhbmRsZSkgeworICAgICAgICAgICAgaGNvbnN0KChIYW5kbGUpIGNzdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdElpbmNJbnNuKGZpbmFsIGludCB2YXIsIGZpbmFsIGludCBpbmNyZW1lbnQpIHsKKyAgICAgICAgaWluYyh2YXIsIGluY3JlbWVudCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRUYWJsZVN3aXRjaEluc24oCisgICAgICAgIGZpbmFsIGludCBtaW4sCisgICAgICAgIGZpbmFsIGludCBtYXgsCisgICAgICAgIGZpbmFsIExhYmVsIGRmbHQsCisgICAgICAgIGZpbmFsIExhYmVsLi4uIGxhYmVscykKKyAgICB7CisgICAgICAgIHRhYmxlc3dpdGNoKG1pbiwgbWF4LCBkZmx0LCBsYWJlbHMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TG9va3VwU3dpdGNoSW5zbigKKyAgICAgICAgZmluYWwgTGFiZWwgZGZsdCwKKyAgICAgICAgZmluYWwgaW50W10ga2V5cywKKyAgICAgICAgZmluYWwgTGFiZWxbXSBsYWJlbHMpCisgICAgeworICAgICAgICBsb29rdXBzd2l0Y2goZGZsdCwga2V5cywgbGFiZWxzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdE11bHRpQU5ld0FycmF5SW5zbihmaW5hbCBTdHJpbmcgZGVzYywgZmluYWwgaW50IGRpbXMpIHsKKyAgICAgICAgbXVsdGlhbmV3YXJyYXkoZGVzYywgZGltcyk7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIHB1YmxpYyB2b2lkIG5vcCgpIHsKKyAgICAgICAgbXYudmlzaXRJbnNuKE9wY29kZXMuTk9QKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhY29uc3QoZmluYWwgT2JqZWN0IGNzdCkgeworICAgICAgICBpZiAoY3N0ID09IG51bGwpIHsKKyAgICAgICAgICAgIG12LnZpc2l0SW5zbihPcGNvZGVzLkFDT05TVF9OVUxMKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG12LnZpc2l0TGRjSW5zbihjc3QpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaWNvbnN0KGZpbmFsIGludCBjc3QpIHsKKyAgICAgICAgaWYgKGNzdCA+PSAtMSAmJiBjc3QgPD0gNSkgeworICAgICAgICAgICAgbXYudmlzaXRJbnNuKE9wY29kZXMuSUNPTlNUXzAgKyBjc3QpOworICAgICAgICB9IGVsc2UgaWYgKGNzdCA+PSBCeXRlLk1JTl9WQUxVRSAmJiBjc3QgPD0gQnl0ZS5NQVhfVkFMVUUpIHsKKyAgICAgICAgICAgIG12LnZpc2l0SW50SW5zbihPcGNvZGVzLkJJUFVTSCwgY3N0KTsKKyAgICAgICAgfSBlbHNlIGlmIChjc3QgPj0gU2hvcnQuTUlOX1ZBTFVFICYmIGNzdCA8PSBTaG9ydC5NQVhfVkFMVUUpIHsKKyAgICAgICAgICAgIG12LnZpc2l0SW50SW5zbihPcGNvZGVzLlNJUFVTSCwgY3N0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG12LnZpc2l0TGRjSW5zbihuZXcgSW50ZWdlcihjc3QpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGxjb25zdChmaW5hbCBsb25nIGNzdCkgeworICAgICAgICBpZiAoY3N0ID09IDBMIHx8IGNzdCA9PSAxTCkgeworICAgICAgICAgICAgbXYudmlzaXRJbnNuKE9wY29kZXMuTENPTlNUXzAgKyAoaW50KSBjc3QpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbXYudmlzaXRMZGNJbnNuKG5ldyBMb25nKGNzdCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZmNvbnN0KGZpbmFsIGZsb2F0IGNzdCkgeworICAgICAgICBpbnQgYml0cyA9IEZsb2F0LmZsb2F0VG9JbnRCaXRzKGNzdCk7CisgICAgICAgIGlmIChiaXRzID09IDBMIHx8IGJpdHMgPT0gMHgzZjgwMDAwMCB8fCBiaXRzID09IDB4NDAwMDAwMDApIHsgLy8gMC4uMgorICAgICAgICAgICAgbXYudmlzaXRJbnNuKE9wY29kZXMuRkNPTlNUXzAgKyAoaW50KSBjc3QpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbXYudmlzaXRMZGNJbnNuKG5ldyBGbG9hdChjc3QpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRjb25zdChmaW5hbCBkb3VibGUgY3N0KSB7CisgICAgICAgIGxvbmcgYml0cyA9IERvdWJsZS5kb3VibGVUb0xvbmdCaXRzKGNzdCk7CisgICAgICAgIGlmIChiaXRzID09IDBMIHx8IGJpdHMgPT0gMHgzZmYwMDAwMDAwMDAwMDAwTCkgeyAvLyArMC4wZCBhbmQgMS4wZAorICAgICAgICAgICAgbXYudmlzaXRJbnNuKE9wY29kZXMuRENPTlNUXzAgKyAoaW50KSBjc3QpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbXYudmlzaXRMZGNJbnNuKG5ldyBEb3VibGUoY3N0KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0Y29uc3QoZmluYWwgVHlwZSB0eXBlKSB7CisgICAgICAgIG12LnZpc2l0TGRjSW5zbih0eXBlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBoY29uc3QoZmluYWwgSGFuZGxlIGhhbmRsZSkgeworICAgICAgICBtdi52aXNpdExkY0luc24oaGFuZGxlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBsb2FkKGZpbmFsIGludCB2YXIsIGZpbmFsIFR5cGUgdHlwZSkgeworICAgICAgICBtdi52aXNpdFZhckluc24odHlwZS5nZXRPcGNvZGUoT3Bjb2Rlcy5JTE9BRCksIHZhcik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWxvYWQoZmluYWwgVHlwZSB0eXBlKSB7CisgICAgICAgIG12LnZpc2l0SW5zbih0eXBlLmdldE9wY29kZShPcGNvZGVzLklBTE9BRCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0b3JlKGZpbmFsIGludCB2YXIsIGZpbmFsIFR5cGUgdHlwZSkgeworICAgICAgICBtdi52aXNpdFZhckluc24odHlwZS5nZXRPcGNvZGUoT3Bjb2Rlcy5JU1RPUkUpLCB2YXIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFzdG9yZShmaW5hbCBUeXBlIHR5cGUpIHsKKyAgICAgICAgbXYudmlzaXRJbnNuKHR5cGUuZ2V0T3Bjb2RlKE9wY29kZXMuSUFTVE9SRSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHBvcCgpIHsKKyAgICAgICAgbXYudmlzaXRJbnNuKE9wY29kZXMuUE9QKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwb3AyKCkgeworICAgICAgICBtdi52aXNpdEluc24oT3Bjb2Rlcy5QT1AyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkdXAoKSB7CisgICAgICAgIG12LnZpc2l0SW5zbihPcGNvZGVzLkRVUCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZHVwMigpIHsKKyAgICAgICAgbXYudmlzaXRJbnNuKE9wY29kZXMuRFVQMik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZHVwWDEoKSB7CisgICAgICAgIG12LnZpc2l0SW5zbihPcGNvZGVzLkRVUF9YMSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZHVwWDIoKSB7CisgICAgICAgIG12LnZpc2l0SW5zbihPcGNvZGVzLkRVUF9YMik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZHVwMlgxKCkgeworICAgICAgICBtdi52aXNpdEluc24oT3Bjb2Rlcy5EVVAyX1gxKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkdXAyWDIoKSB7CisgICAgICAgIG12LnZpc2l0SW5zbihPcGNvZGVzLkRVUDJfWDIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN3YXAoKSB7CisgICAgICAgIG12LnZpc2l0SW5zbihPcGNvZGVzLlNXQVApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZChmaW5hbCBUeXBlIHR5cGUpIHsKKyAgICAgICAgbXYudmlzaXRJbnNuKHR5cGUuZ2V0T3Bjb2RlKE9wY29kZXMuSUFERCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN1YihmaW5hbCBUeXBlIHR5cGUpIHsKKyAgICAgICAgbXYudmlzaXRJbnNuKHR5cGUuZ2V0T3Bjb2RlKE9wY29kZXMuSVNVQikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG11bChmaW5hbCBUeXBlIHR5cGUpIHsKKyAgICAgICAgbXYudmlzaXRJbnNuKHR5cGUuZ2V0T3Bjb2RlKE9wY29kZXMuSU1VTCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRpdihmaW5hbCBUeXBlIHR5cGUpIHsKKyAgICAgICAgbXYudmlzaXRJbnNuKHR5cGUuZ2V0T3Bjb2RlKE9wY29kZXMuSURJVikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbShmaW5hbCBUeXBlIHR5cGUpIHsKKyAgICAgICAgbXYudmlzaXRJbnNuKHR5cGUuZ2V0T3Bjb2RlKE9wY29kZXMuSVJFTSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG5lZyhmaW5hbCBUeXBlIHR5cGUpIHsKKyAgICAgICAgbXYudmlzaXRJbnNuKHR5cGUuZ2V0T3Bjb2RlKE9wY29kZXMuSU5FRykpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNobChmaW5hbCBUeXBlIHR5cGUpIHsKKyAgICAgICAgbXYudmlzaXRJbnNuKHR5cGUuZ2V0T3Bjb2RlKE9wY29kZXMuSVNITCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNocihmaW5hbCBUeXBlIHR5cGUpIHsKKyAgICAgICAgbXYudmlzaXRJbnNuKHR5cGUuZ2V0T3Bjb2RlKE9wY29kZXMuSVNIUikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVzaHIoZmluYWwgVHlwZSB0eXBlKSB7CisgICAgICAgIG12LnZpc2l0SW5zbih0eXBlLmdldE9wY29kZShPcGNvZGVzLklVU0hSKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYW5kKGZpbmFsIFR5cGUgdHlwZSkgeworICAgICAgICBtdi52aXNpdEluc24odHlwZS5nZXRPcGNvZGUoT3Bjb2Rlcy5JQU5EKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb3IoZmluYWwgVHlwZSB0eXBlKSB7CisgICAgICAgIG12LnZpc2l0SW5zbih0eXBlLmdldE9wY29kZShPcGNvZGVzLklPUikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHhvcihmaW5hbCBUeXBlIHR5cGUpIHsKKyAgICAgICAgbXYudmlzaXRJbnNuKHR5cGUuZ2V0T3Bjb2RlKE9wY29kZXMuSVhPUikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGlpbmMoZmluYWwgaW50IHZhciwgZmluYWwgaW50IGluY3JlbWVudCkgeworICAgICAgICBtdi52aXNpdElpbmNJbnNuKHZhciwgaW5jcmVtZW50KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjYXN0KGZpbmFsIFR5cGUgZnJvbSwgZmluYWwgVHlwZSB0bykgeworICAgICAgICBpZiAoZnJvbSAhPSB0bykgeworICAgICAgICAgICAgaWYgKGZyb20gPT0gVHlwZS5ET1VCTEVfVFlQRSkgeworICAgICAgICAgICAgICAgIGlmICh0byA9PSBUeXBlLkZMT0FUX1RZUEUpIHsKKyAgICAgICAgICAgICAgICAgICAgbXYudmlzaXRJbnNuKE9wY29kZXMuRDJGKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRvID09IFR5cGUuTE9OR19UWVBFKSB7CisgICAgICAgICAgICAgICAgICAgIG12LnZpc2l0SW5zbihPcGNvZGVzLkQyTCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbXYudmlzaXRJbnNuKE9wY29kZXMuRDJJKTsKKyAgICAgICAgICAgICAgICAgICAgY2FzdChUeXBlLklOVF9UWVBFLCB0byk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChmcm9tID09IFR5cGUuRkxPQVRfVFlQRSkgeworICAgICAgICAgICAgICAgIGlmICh0byA9PSBUeXBlLkRPVUJMRV9UWVBFKSB7CisgICAgICAgICAgICAgICAgICAgIG12LnZpc2l0SW5zbihPcGNvZGVzLkYyRCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0byA9PSBUeXBlLkxPTkdfVFlQRSkgeworICAgICAgICAgICAgICAgICAgICBtdi52aXNpdEluc24oT3Bjb2Rlcy5GMkwpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG12LnZpc2l0SW5zbihPcGNvZGVzLkYySSk7CisgICAgICAgICAgICAgICAgICAgIGNhc3QoVHlwZS5JTlRfVFlQRSwgdG8pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZnJvbSA9PSBUeXBlLkxPTkdfVFlQRSkgeworICAgICAgICAgICAgICAgIGlmICh0byA9PSBUeXBlLkRPVUJMRV9UWVBFKSB7CisgICAgICAgICAgICAgICAgICAgIG12LnZpc2l0SW5zbihPcGNvZGVzLkwyRCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0byA9PSBUeXBlLkZMT0FUX1RZUEUpIHsKKyAgICAgICAgICAgICAgICAgICAgbXYudmlzaXRJbnNuKE9wY29kZXMuTDJGKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtdi52aXNpdEluc24oT3Bjb2Rlcy5MMkkpOworICAgICAgICAgICAgICAgICAgICBjYXN0KFR5cGUuSU5UX1RZUEUsIHRvKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICh0byA9PSBUeXBlLkJZVEVfVFlQRSkgeworICAgICAgICAgICAgICAgICAgICBtdi52aXNpdEluc24oT3Bjb2Rlcy5JMkIpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodG8gPT0gVHlwZS5DSEFSX1RZUEUpIHsKKyAgICAgICAgICAgICAgICAgICAgbXYudmlzaXRJbnNuKE9wY29kZXMuSTJDKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRvID09IFR5cGUuRE9VQkxFX1RZUEUpIHsKKyAgICAgICAgICAgICAgICAgICAgbXYudmlzaXRJbnNuKE9wY29kZXMuSTJEKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRvID09IFR5cGUuRkxPQVRfVFlQRSkgeworICAgICAgICAgICAgICAgICAgICBtdi52aXNpdEluc24oT3Bjb2Rlcy5JMkYpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodG8gPT0gVHlwZS5MT05HX1RZUEUpIHsKKyAgICAgICAgICAgICAgICAgICAgbXYudmlzaXRJbnNuKE9wY29kZXMuSTJMKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRvID09IFR5cGUuU0hPUlRfVFlQRSkgeworICAgICAgICAgICAgICAgICAgICBtdi52aXNpdEluc24oT3Bjb2Rlcy5JMlMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGxjbXAoKSB7CisgICAgICAgIG12LnZpc2l0SW5zbihPcGNvZGVzLkxDTVApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNtcGwoZmluYWwgVHlwZSB0eXBlKSB7CisgICAgICAgIG12LnZpc2l0SW5zbih0eXBlID09IFR5cGUuRkxPQVRfVFlQRSA/IE9wY29kZXMuRkNNUEwgOiBPcGNvZGVzLkRDTVBMKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbXBnKGZpbmFsIFR5cGUgdHlwZSkgeworICAgICAgICBtdi52aXNpdEluc24odHlwZSA9PSBUeXBlLkZMT0FUX1RZUEUgPyBPcGNvZGVzLkZDTVBHIDogT3Bjb2Rlcy5EQ01QRyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaWZlcShmaW5hbCBMYWJlbCBsYWJlbCkgeworICAgICAgICBtdi52aXNpdEp1bXBJbnNuKE9wY29kZXMuSUZFUSwgbGFiZWwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGlmbmUoZmluYWwgTGFiZWwgbGFiZWwpIHsKKyAgICAgICAgbXYudmlzaXRKdW1wSW5zbihPcGNvZGVzLklGTkUsIGxhYmVsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpZmx0KGZpbmFsIExhYmVsIGxhYmVsKSB7CisgICAgICAgIG12LnZpc2l0SnVtcEluc24oT3Bjb2Rlcy5JRkxULCBsYWJlbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaWZnZShmaW5hbCBMYWJlbCBsYWJlbCkgeworICAgICAgICBtdi52aXNpdEp1bXBJbnNuKE9wY29kZXMuSUZHRSwgbGFiZWwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGlmZ3QoZmluYWwgTGFiZWwgbGFiZWwpIHsKKyAgICAgICAgbXYudmlzaXRKdW1wSW5zbihPcGNvZGVzLklGR1QsIGxhYmVsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpZmxlKGZpbmFsIExhYmVsIGxhYmVsKSB7CisgICAgICAgIG12LnZpc2l0SnVtcEluc24oT3Bjb2Rlcy5JRkxFLCBsYWJlbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaWZpY21wZXEoZmluYWwgTGFiZWwgbGFiZWwpIHsKKyAgICAgICAgbXYudmlzaXRKdW1wSW5zbihPcGNvZGVzLklGX0lDTVBFUSwgbGFiZWwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGlmaWNtcG5lKGZpbmFsIExhYmVsIGxhYmVsKSB7CisgICAgICAgIG12LnZpc2l0SnVtcEluc24oT3Bjb2Rlcy5JRl9JQ01QTkUsIGxhYmVsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpZmljbXBsdChmaW5hbCBMYWJlbCBsYWJlbCkgeworICAgICAgICBtdi52aXNpdEp1bXBJbnNuKE9wY29kZXMuSUZfSUNNUExULCBsYWJlbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaWZpY21wZ2UoZmluYWwgTGFiZWwgbGFiZWwpIHsKKyAgICAgICAgbXYudmlzaXRKdW1wSW5zbihPcGNvZGVzLklGX0lDTVBHRSwgbGFiZWwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGlmaWNtcGd0KGZpbmFsIExhYmVsIGxhYmVsKSB7CisgICAgICAgIG12LnZpc2l0SnVtcEluc24oT3Bjb2Rlcy5JRl9JQ01QR1QsIGxhYmVsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpZmljbXBsZShmaW5hbCBMYWJlbCBsYWJlbCkgeworICAgICAgICBtdi52aXNpdEp1bXBJbnNuKE9wY29kZXMuSUZfSUNNUExFLCBsYWJlbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaWZhY21wZXEoZmluYWwgTGFiZWwgbGFiZWwpIHsKKyAgICAgICAgbXYudmlzaXRKdW1wSW5zbihPcGNvZGVzLklGX0FDTVBFUSwgbGFiZWwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGlmYWNtcG5lKGZpbmFsIExhYmVsIGxhYmVsKSB7CisgICAgICAgIG12LnZpc2l0SnVtcEluc24oT3Bjb2Rlcy5JRl9BQ01QTkUsIGxhYmVsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnb1RvKGZpbmFsIExhYmVsIGxhYmVsKSB7CisgICAgICAgIG12LnZpc2l0SnVtcEluc24oT3Bjb2Rlcy5HT1RPLCBsYWJlbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQganNyKGZpbmFsIExhYmVsIGxhYmVsKSB7CisgICAgICAgIG12LnZpc2l0SnVtcEluc24oT3Bjb2Rlcy5KU1IsIGxhYmVsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZXQoZmluYWwgaW50IHZhcikgeworICAgICAgICBtdi52aXNpdFZhckluc24oT3Bjb2Rlcy5SRVQsIHZhcik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGFibGVzd2l0Y2goCisgICAgICAgIGZpbmFsIGludCBtaW4sCisgICAgICAgIGZpbmFsIGludCBtYXgsCisgICAgICAgIGZpbmFsIExhYmVsIGRmbHQsCisgICAgICAgIGZpbmFsIExhYmVsLi4uIGxhYmVscykKKyAgICB7CisgICAgICAgIG12LnZpc2l0VGFibGVTd2l0Y2hJbnNuKG1pbiwgbWF4LCBkZmx0LCBsYWJlbHMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGxvb2t1cHN3aXRjaCgKKyAgICAgICAgZmluYWwgTGFiZWwgZGZsdCwKKyAgICAgICAgZmluYWwgaW50W10ga2V5cywKKyAgICAgICAgZmluYWwgTGFiZWxbXSBsYWJlbHMpCisgICAgeworICAgICAgICBtdi52aXNpdExvb2t1cFN3aXRjaEluc24oZGZsdCwga2V5cywgbGFiZWxzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhcmV0dXJuKGZpbmFsIFR5cGUgdCkgeworICAgICAgICBtdi52aXNpdEluc24odC5nZXRPcGNvZGUoT3Bjb2Rlcy5JUkVUVVJOKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2V0c3RhdGljKAorICAgICAgICBmaW5hbCBTdHJpbmcgb3duZXIsCisgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lLAorICAgICAgICBmaW5hbCBTdHJpbmcgZGVzYykKKyAgICB7CisgICAgICAgIG12LnZpc2l0RmllbGRJbnNuKE9wY29kZXMuR0VUU1RBVElDLCBvd25lciwgbmFtZSwgZGVzYyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHV0c3RhdGljKAorICAgICAgICBmaW5hbCBTdHJpbmcgb3duZXIsCisgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lLAorICAgICAgICBmaW5hbCBTdHJpbmcgZGVzYykKKyAgICB7CisgICAgICAgIG12LnZpc2l0RmllbGRJbnNuKE9wY29kZXMuUFVUU1RBVElDLCBvd25lciwgbmFtZSwgZGVzYyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2V0ZmllbGQoCisgICAgICAgIGZpbmFsIFN0cmluZyBvd25lciwKKyAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUsCisgICAgICAgIGZpbmFsIFN0cmluZyBkZXNjKQorICAgIHsKKyAgICAgICAgbXYudmlzaXRGaWVsZEluc24oT3Bjb2Rlcy5HRVRGSUVMRCwgb3duZXIsIG5hbWUsIGRlc2MpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHB1dGZpZWxkKAorICAgICAgICBmaW5hbCBTdHJpbmcgb3duZXIsCisgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lLAorICAgICAgICBmaW5hbCBTdHJpbmcgZGVzYykKKyAgICB7CisgICAgICAgIG12LnZpc2l0RmllbGRJbnNuKE9wY29kZXMuUFVURklFTEQsIG93bmVyLCBuYW1lLCBkZXNjKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbnZva2V2aXJ0dWFsKAorICAgICAgICBmaW5hbCBTdHJpbmcgb3duZXIsCisgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lLAorICAgICAgICBmaW5hbCBTdHJpbmcgZGVzYykKKyAgICB7CisgICAgICAgIG12LnZpc2l0TWV0aG9kSW5zbihPcGNvZGVzLklOVk9LRVZJUlRVQUwsIG93bmVyLCBuYW1lLCBkZXNjKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbnZva2VzcGVjaWFsKAorICAgICAgICBmaW5hbCBTdHJpbmcgb3duZXIsCisgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lLAorICAgICAgICBmaW5hbCBTdHJpbmcgZGVzYykKKyAgICB7CisgICAgICAgIG12LnZpc2l0TWV0aG9kSW5zbihPcGNvZGVzLklOVk9LRVNQRUNJQUwsIG93bmVyLCBuYW1lLCBkZXNjKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbnZva2VzdGF0aWMoCisgICAgICAgIGZpbmFsIFN0cmluZyBvd25lciwKKyAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUsCisgICAgICAgIGZpbmFsIFN0cmluZyBkZXNjKQorICAgIHsKKyAgICAgICAgbXYudmlzaXRNZXRob2RJbnNuKE9wY29kZXMuSU5WT0tFU1RBVElDLCBvd25lciwgbmFtZSwgZGVzYyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW52b2tlaW50ZXJmYWNlKAorICAgICAgICBmaW5hbCBTdHJpbmcgb3duZXIsCisgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lLAorICAgICAgICBmaW5hbCBTdHJpbmcgZGVzYykKKyAgICB7CisgICAgICAgIG12LnZpc2l0TWV0aG9kSW5zbihPcGNvZGVzLklOVk9LRUlOVEVSRkFDRSwgb3duZXIsIG5hbWUsIGRlc2MpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGludm9rZWR5bmFtaWMoCisgICAgICAgIFN0cmluZyBuYW1lLAorICAgICAgICBTdHJpbmcgZGVzYywKKyAgICAgICAgSGFuZGxlIGJzbSwKKyAgICAgICAgT2JqZWN0W10gYnNtQXJncykKKyAgICB7CisgICAgICAgIG12LnZpc2l0SW52b2tlRHluYW1pY0luc24obmFtZSwgZGVzYywgYnNtLCBic21BcmdzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhbmV3KGZpbmFsIFR5cGUgdHlwZSkgeworICAgICAgICBtdi52aXNpdFR5cGVJbnNuKE9wY29kZXMuTkVXLCB0eXBlLmdldEludGVybmFsTmFtZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBuZXdhcnJheShmaW5hbCBUeXBlIHR5cGUpIHsKKyAgICAgICAgaW50IHR5cDsKKyAgICAgICAgc3dpdGNoICh0eXBlLmdldFNvcnQoKSkgeworICAgICAgICAgICAgY2FzZSBUeXBlLkJPT0xFQU46CisgICAgICAgICAgICAgICAgdHlwID0gT3Bjb2Rlcy5UX0JPT0xFQU47CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFR5cGUuQ0hBUjoKKyAgICAgICAgICAgICAgICB0eXAgPSBPcGNvZGVzLlRfQ0hBUjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVHlwZS5CWVRFOgorICAgICAgICAgICAgICAgIHR5cCA9IE9wY29kZXMuVF9CWVRFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBUeXBlLlNIT1JUOgorICAgICAgICAgICAgICAgIHR5cCA9IE9wY29kZXMuVF9TSE9SVDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVHlwZS5JTlQ6CisgICAgICAgICAgICAgICAgdHlwID0gT3Bjb2Rlcy5UX0lOVDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVHlwZS5GTE9BVDoKKyAgICAgICAgICAgICAgICB0eXAgPSBPcGNvZGVzLlRfRkxPQVQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFR5cGUuTE9ORzoKKyAgICAgICAgICAgICAgICB0eXAgPSBPcGNvZGVzLlRfTE9ORzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVHlwZS5ET1VCTEU6CisgICAgICAgICAgICAgICAgdHlwID0gT3Bjb2Rlcy5UX0RPVUJMRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgbXYudmlzaXRUeXBlSW5zbihPcGNvZGVzLkFORVdBUlJBWSwgdHlwZS5nZXRJbnRlcm5hbE5hbWUoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG12LnZpc2l0SW50SW5zbihPcGNvZGVzLk5FV0FSUkFZLCB0eXApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFycmF5bGVuZ3RoKCkgeworICAgICAgICBtdi52aXNpdEluc24oT3Bjb2Rlcy5BUlJBWUxFTkdUSCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXRocm93KCkgeworICAgICAgICBtdi52aXNpdEluc24oT3Bjb2Rlcy5BVEhST1cpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNoZWNrY2FzdChmaW5hbCBUeXBlIHR5cGUpIHsKKyAgICAgICAgbXYudmlzaXRUeXBlSW5zbihPcGNvZGVzLkNIRUNLQ0FTVCwgdHlwZS5nZXRJbnRlcm5hbE5hbWUoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5zdGFuY2VPZihmaW5hbCBUeXBlIHR5cGUpIHsKKyAgICAgICAgbXYudmlzaXRUeXBlSW5zbihPcGNvZGVzLklOU1RBTkNFT0YsIHR5cGUuZ2V0SW50ZXJuYWxOYW1lKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG1vbml0b3JlbnRlcigpIHsKKyAgICAgICAgbXYudmlzaXRJbnNuKE9wY29kZXMuTU9OSVRPUkVOVEVSKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBtb25pdG9yZXhpdCgpIHsKKyAgICAgICAgbXYudmlzaXRJbnNuKE9wY29kZXMuTU9OSVRPUkVYSVQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG11bHRpYW5ld2FycmF5KGZpbmFsIFN0cmluZyBkZXNjLCBmaW5hbCBpbnQgZGltcykgeworICAgICAgICBtdi52aXNpdE11bHRpQU5ld0FycmF5SW5zbihkZXNjLCBkaW1zKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpZm51bGwoZmluYWwgTGFiZWwgbGFiZWwpIHsKKyAgICAgICAgbXYudmlzaXRKdW1wSW5zbihPcGNvZGVzLklGTlVMTCwgbGFiZWwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGlmbm9ubnVsbChmaW5hbCBMYWJlbCBsYWJlbCkgeworICAgICAgICBtdi52aXNpdEp1bXBJbnNuKE9wY29kZXMuSUZOT05OVUxMLCBsYWJlbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbWFyayhmaW5hbCBMYWJlbCBsYWJlbCkgeworICAgICAgICBtdi52aXNpdExhYmVsKGxhYmVsKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL2NvbW1vbnMvSlNSSW5saW5lckFkYXB0ZXIuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vY29tbW9ucy9KU1JJbmxpbmVyQWRhcHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4ZGE2MWQKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL2NvbW1vbnMvSlNSSW5saW5lckFkYXB0ZXIuamF2YQpAQCAtMCwwICsxLDc3MCBAQAorLyoKKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgT3JhY2xlIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCisgKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CisgKiBxdWVzdGlvbnMuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBpcyBhdmFpbGFibGUgdW5kZXIgYW5kIGdvdmVybmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogSG93ZXZlciwgdGhlIGZvbGxvd2luZyBub3RpY2UgYWNjb21wYW5pZWQgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhpcworICogZmlsZToKKyAqCisgKiBBU006IGEgdmVyeSBzbWFsbCBhbmQgZmFzdCBKYXZhIGJ5dGVjb2RlIG1hbmlwdWxhdGlvbiBmcmFtZXdvcmsKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDExIElOUklBLCBGcmFuY2UgVGVsZWNvbQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5jb21tb25zOworCitpbXBvcnQgamF2YS51dGlsLkFic3RyYWN0TWFwOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkJpdFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLkxhYmVsOworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5NZXRob2RWaXNpdG9yOworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5PcGNvZGVzOworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5UeXBlOworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS50cmVlLkFic3RyYWN0SW5zbk5vZGU7CitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLnRyZWUuSW5zbkxpc3Q7CitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLnRyZWUuSW5zbk5vZGU7CitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLnRyZWUuSnVtcEluc25Ob2RlOworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS50cmVlLkxhYmVsTm9kZTsKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20udHJlZS5Mb2NhbFZhcmlhYmxlTm9kZTsKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20udHJlZS5Mb29rdXBTd2l0Y2hJbnNuTm9kZTsKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20udHJlZS5NZXRob2ROb2RlOworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS50cmVlLlRhYmxlU3dpdGNoSW5zbk5vZGU7CitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLnRyZWUuVHJ5Q2F0Y2hCbG9ja05vZGU7CisKKy8qKgorICogQSB7QGxpbmsgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLk1ldGhvZFZpc2l0b3J9IHRoYXQgcmVtb3ZlcyBKU1IgaW5zdHJ1Y3Rpb25zIGFuZAorICogaW5saW5lcyB0aGUgcmVmZXJlbmNlZCBzdWJyb3V0aW5lcy4KKyAqCisgKiA8Yj5FeHBsYW5hdGlvbiBvZiBob3cgaXQgd29ya3M8L2I+IFRPRE8KKyAqCisgKiBAYXV0aG9yIE5pa28gTWF0c2FraXMKKyAqLworcHVibGljIGNsYXNzIEpTUklubGluZXJBZGFwdGVyIGV4dGVuZHMgTWV0aG9kTm9kZSBpbXBsZW1lbnRzIE9wY29kZXMgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBMT0dHSU5HID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBGb3IgZWFjaCBsYWJlbCB0aGF0IGlzIGp1bXBlZCB0byBieSBhIEpTUiwgd2UgY3JlYXRlIGEgQml0U2V0CisgICAgICogaW5zdGFuY2UuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8TGFiZWxOb2RlLEJpdFNldD4gc3Vicm91dGluZUhlYWRzID0gbmV3IEhhc2hNYXA8TGFiZWxOb2RlLEJpdFNldD4oKTsKKworICAgIC8qKgorICAgICAqIFRoaXMgc3Vicm91dGluZSBpbnN0YW5jZSBkZW5vdGVzIHRoZSBsaW5lIG9mIGV4ZWN1dGlvbiB0aGF0IGlzIG5vdAorICAgICAqIGNvbnRhaW5lZCB3aXRoaW4gYW55IHN1YnJvdXRpbmU7IGkuZS4sIHRoZSAic3Vicm91dGluZSIgdGhhdCBpcyBleGVjdXRpbmcKKyAgICAgKiB3aGVuIGEgbWV0aG9kIGZpcnN0IGJlZ2lucy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIEJpdFNldCBtYWluU3Vicm91dGluZSA9IG5ldyBCaXRTZXQoKTsKKworICAgIC8qKgorICAgICAqIFRoaXMgQml0U2V0IGNvbnRhaW5zIHRoZSBpbmRleCBvZiBldmVyeSBpbnN0cnVjdGlvbiB0aGF0IGJlbG9uZ3MgdG8gbW9yZQorICAgICAqIHRoYW4gb25lIHN1YnJvdXRpbmUuIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gb2Z0ZW4uCisgICAgICovCisgICAgZmluYWwgQml0U2V0IGR1YWxDaXRpemVucyA9IG5ldyBCaXRTZXQoKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgSlNSSW5saW5lci4gPGk+U3ViY2xhc3NlcyBtdXN0IG5vdCB1c2UgdGhpcworICAgICAqIGNvbnN0cnVjdG9yPC9pPi4gSW5zdGVhZCwgdGhleSBtdXN0IHVzZSB0aGUKKyAgICAgKiB7QGxpbmsgI0pTUklubGluZXJBZGFwdGVyKGludCwgTWV0aG9kVmlzaXRvciwgaW50LCBTdHJpbmcsIFN0cmluZywgU3RyaW5nLCBTdHJpbmdbXSl9CisgICAgICogdmVyc2lvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtdiB0aGUgPGNvZGU+TWV0aG9kVmlzaXRvcjwvY29kZT4gdG8gc2VuZCB0aGUgcmVzdWx0aW5nIGlubGluZWQKKyAgICAgKiAgICAgICAgbWV0aG9kIGNvZGUgdG8gKHVzZSA8Y29kZT5udWxsPC9jb2RlPiBmb3Igbm9uZSkuCisgICAgICogQHBhcmFtIGFjY2VzcyB0aGUgbWV0aG9kJ3MgYWNjZXNzIGZsYWdzIChzZWUge0BsaW5rIE9wY29kZXN9KS4gVGhpcworICAgICAqICAgICAgICBwYXJhbWV0ZXIgYWxzbyBpbmRpY2F0ZXMgaWYgdGhlIG1ldGhvZCBpcyBzeW50aGV0aWMgYW5kL29yCisgICAgICogICAgICAgIGRlcHJlY2F0ZWQuCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG1ldGhvZCdzIG5hbWUuCisgICAgICogQHBhcmFtIGRlc2MgdGhlIG1ldGhvZCdzIGRlc2NyaXB0b3IgKHNlZSB7QGxpbmsgVHlwZX0pLgorICAgICAqIEBwYXJhbSBzaWduYXR1cmUgdGhlIG1ldGhvZCdzIHNpZ25hdHVyZS4gTWF5IGJlIDx0dD5udWxsPC90dD4uCisgICAgICogQHBhcmFtIGV4Y2VwdGlvbnMgdGhlIGludGVybmFsIG5hbWVzIG9mIHRoZSBtZXRob2QncyBleGNlcHRpb24gY2xhc3NlcworICAgICAqICAgICAgICAoc2VlIHtAbGluayBUeXBlI2dldEludGVybmFsTmFtZSgpIGdldEludGVybmFsTmFtZX0pLiBNYXkgYmUKKyAgICAgKiAgICAgICAgPHR0Pm51bGw8L3R0Pi4KKyAgICAgKi8KKyAgICBwdWJsaWMgSlNSSW5saW5lckFkYXB0ZXIoCisgICAgICAgIGZpbmFsIE1ldGhvZFZpc2l0b3IgbXYsCisgICAgICAgIGZpbmFsIGludCBhY2Nlc3MsCisgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lLAorICAgICAgICBmaW5hbCBTdHJpbmcgZGVzYywKKyAgICAgICAgZmluYWwgU3RyaW5nIHNpZ25hdHVyZSwKKyAgICAgICAgZmluYWwgU3RyaW5nW10gZXhjZXB0aW9ucykKKyAgICB7CisgICAgICAgIHRoaXMoT3Bjb2Rlcy5BU000LCBtdiwgYWNjZXNzLCBuYW1lLCBkZXNjLCBzaWduYXR1cmUsIGV4Y2VwdGlvbnMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgSlNSSW5saW5lci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcGkgdGhlIEFTTSBBUEkgdmVyc2lvbiBpbXBsZW1lbnRlZCBieSB0aGlzIHZpc2l0b3IuIE11c3QgYmUgb25lCisgICAgICogICAgICAgIG9mIHtAbGluayBPcGNvZGVzI0FTTTR9LgorICAgICAqIEBwYXJhbSBtdiB0aGUgPGNvZGU+TWV0aG9kVmlzaXRvcjwvY29kZT4gdG8gc2VuZCB0aGUgcmVzdWx0aW5nIGlubGluZWQKKyAgICAgKiAgICAgICAgbWV0aG9kIGNvZGUgdG8gKHVzZSA8Y29kZT5udWxsPC9jb2RlPiBmb3Igbm9uZSkuCisgICAgICogQHBhcmFtIGFjY2VzcyB0aGUgbWV0aG9kJ3MgYWNjZXNzIGZsYWdzIChzZWUge0BsaW5rIE9wY29kZXN9KS4gVGhpcworICAgICAqICAgICAgICBwYXJhbWV0ZXIgYWxzbyBpbmRpY2F0ZXMgaWYgdGhlIG1ldGhvZCBpcyBzeW50aGV0aWMgYW5kL29yCisgICAgICogICAgICAgIGRlcHJlY2F0ZWQuCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG1ldGhvZCdzIG5hbWUuCisgICAgICogQHBhcmFtIGRlc2MgdGhlIG1ldGhvZCdzIGRlc2NyaXB0b3IgKHNlZSB7QGxpbmsgVHlwZX0pLgorICAgICAqIEBwYXJhbSBzaWduYXR1cmUgdGhlIG1ldGhvZCdzIHNpZ25hdHVyZS4gTWF5IGJlIDx0dD5udWxsPC90dD4uCisgICAgICogQHBhcmFtIGV4Y2VwdGlvbnMgdGhlIGludGVybmFsIG5hbWVzIG9mIHRoZSBtZXRob2QncyBleGNlcHRpb24gY2xhc3NlcworICAgICAqICAgICAgICAoc2VlIHtAbGluayBUeXBlI2dldEludGVybmFsTmFtZSgpIGdldEludGVybmFsTmFtZX0pLiBNYXkgYmUKKyAgICAgKiAgICAgICAgPHR0Pm51bGw8L3R0Pi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgSlNSSW5saW5lckFkYXB0ZXIoCisgICAgICAgIGZpbmFsIGludCBhcGksCisgICAgICAgIGZpbmFsIE1ldGhvZFZpc2l0b3IgbXYsCisgICAgICAgIGZpbmFsIGludCBhY2Nlc3MsCisgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lLAorICAgICAgICBmaW5hbCBTdHJpbmcgZGVzYywKKyAgICAgICAgZmluYWwgU3RyaW5nIHNpZ25hdHVyZSwKKyAgICAgICAgZmluYWwgU3RyaW5nW10gZXhjZXB0aW9ucykKKyAgICB7CisgICAgICAgIHN1cGVyKGFwaSwgYWNjZXNzLCBuYW1lLCBkZXNjLCBzaWduYXR1cmUsIGV4Y2VwdGlvbnMpOworICAgICAgICB0aGlzLm12ID0gbXY7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGV0ZWN0cyBhIEpTUiBpbnN0cnVjdGlvbiBhbmQgc2V0cyBhIGZsYWcgdG8gaW5kaWNhdGUgd2Ugd2lsbCBuZWVkIHRvIGRvCisgICAgICogaW5saW5pbmcuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRKdW1wSW5zbihmaW5hbCBpbnQgb3Bjb2RlLCBmaW5hbCBMYWJlbCBsYmwpIHsKKyAgICAgICAgc3VwZXIudmlzaXRKdW1wSW5zbihvcGNvZGUsIGxibCk7CisgICAgICAgIExhYmVsTm9kZSBsbiA9ICgoSnVtcEluc25Ob2RlKSBpbnN0cnVjdGlvbnMuZ2V0TGFzdCgpKS5sYWJlbDsKKyAgICAgICAgaWYgKG9wY29kZSA9PSBKU1IgJiYgIXN1YnJvdXRpbmVIZWFkcy5jb250YWluc0tleShsbikpIHsKKyAgICAgICAgICAgIHN1YnJvdXRpbmVIZWFkcy5wdXQobG4sIG5ldyBCaXRTZXQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiBhbnkgSlNScyB3ZXJlIHNlZW4sIHRyaWdnZXJzIHRoZSBpbmxpbmluZyBwcm9jZXNzLiBPdGhlcndpc2UsIGZvcndhcmRzCisgICAgICogdGhlIGJ5dGUgY29kZXMgdW50b3VjaGVkLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0RW5kKCkgeworICAgICAgICBpZiAoIXN1YnJvdXRpbmVIZWFkcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIG1hcmtTdWJyb3V0aW5lcygpOworICAgICAgICAgICAgaWYgKExPR0dJTkcpIHsKKyAgICAgICAgICAgICAgICBsb2cobWFpblN1YnJvdXRpbmUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgSXRlcmF0b3I8Qml0U2V0PiBpdCA9IHN1YnJvdXRpbmVIZWFkcy52YWx1ZXMoKS5pdGVyYXRvcigpOworICAgICAgICAgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQml0U2V0IHN1YiA9IGl0Lm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgbG9nKHN1Yi50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbWl0Q29kZSgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRm9yd2FyZCB0aGUgdHJhbnNsYXRlIG9wY29kZXMgb24gaWYgYXBwcm9wcmlhdGU6CisgICAgICAgIGlmIChtdiAhPSBudWxsKSB7CisgICAgICAgICAgICBhY2NlcHQobXYpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogV2Fsa3MgdGhlIG1ldGhvZCBhbmQgZGV0ZXJtaW5lcyB3aGljaCBpbnRlcm5hbCBzdWJyb3V0aW5lKHMpLCBpZiBhbnksCisgICAgICogZWFjaCBpbnN0cnVjdGlvbiBpcyBhIG1ldGhvZCBvZi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgbWFya1N1YnJvdXRpbmVzKCkgeworICAgICAgICBCaXRTZXQgYW55dmlzaXRlZCA9IG5ldyBCaXRTZXQoKTsKKworICAgICAgICAvLyBGaXJzdCB3YWxrIHRoZSBtYWluIHN1YnJvdXRpbmUgYW5kIGZpbmQgYWxsIHRob3NlIGluc3RydWN0aW9ucyB3aGljaAorICAgICAgICAvLyBjYW4gYmUgcmVhY2hlZCB3aXRob3V0IGludm9raW5nIGFueSBKU1IgYXQgYWxsCisgICAgICAgIG1hcmtTdWJyb3V0aW5lV2FsayhtYWluU3Vicm91dGluZSwgMCwgYW55dmlzaXRlZCk7CisKKyAgICAgICAgLy8gR28gdGhyb3VnaCB0aGUgaGVhZCBvZiBlYWNoIHN1YnJvdXRpbmUgYW5kIGZpbmQgYW55IG5vZGVzIHJlYWNoYWJsZQorICAgICAgICAvLyB0byB0aGF0IHN1YnJvdXRpbmUgd2l0aG91dCBmb2xsb3dpbmcgYW55IEpTUiBsaW5rcy4KKyAgICAgICAgZm9yIChJdGVyYXRvcjxNYXAuRW50cnk8TGFiZWxOb2RlLEJpdFNldD4+IGl0ID0gc3Vicm91dGluZUhlYWRzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKKyAgICAgICAgeworICAgICAgICAgICAgTWFwLkVudHJ5PExhYmVsTm9kZSxCaXRTZXQ+IGVudHJ5ID0gaXQubmV4dCgpOworICAgICAgICAgICAgTGFiZWxOb2RlIGxhYiA9IGVudHJ5LmdldEtleSgpOworICAgICAgICAgICAgQml0U2V0IHN1YiA9IGVudHJ5LmdldFZhbHVlKCk7CisgICAgICAgICAgICBpbnQgaW5kZXggPSBpbnN0cnVjdGlvbnMuaW5kZXhPZihsYWIpOworICAgICAgICAgICAgbWFya1N1YnJvdXRpbmVXYWxrKHN1YiwgaW5kZXgsIGFueXZpc2l0ZWQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUGVyZm9ybXMgYSBkZXB0aCBmaXJzdCBzZWFyY2ggd2Fsa2luZyB0aGUgbm9ybWFsIGJ5dGUgY29kZSBwYXRoIHN0YXJ0aW5nCisgICAgICogYXQgPGNvZGU+aW5kZXg8L2NvZGU+LCBhbmQgYWRkaW5nIGVhY2ggaW5zdHJ1Y3Rpb24gZW5jb3VudGVyZWQgaW50bworICAgICAqIHRoZSBzdWJyb3V0aW5lIDxjb2RlPnN1YjwvY29kZT4uIEFmdGVyIHRoaXMgd2FsayBpcyBjb21wbGV0ZSwgaXRlcmF0ZXMKKyAgICAgKiBvdmVyIHRoZSBleGNlcHRpb24gaGFuZGxlcnMgdG8gZW5zdXJlIHRoYXQgd2UgYWxzbyBpbmNsdWRlIHRob3NlIGJ5dGUKKyAgICAgKiBjb2RlcyB3aGljaCBhcmUgcmVhY2hhYmxlIHRocm91Z2ggYW4gZXhjZXB0aW9uIHRoYXQgbWF5IGJlIHRocm93biBkdXJpbmcKKyAgICAgKiB0aGUgZXhlY3V0aW9uIG9mIHRoZSBzdWJyb3V0aW5lLiBJbnZva2VkIGZyb20KKyAgICAgKiA8Y29kZT5tYXJrU3Vicm91dGluZXMoKTwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3ViIHRoZSBzdWJyb3V0aW5lIHdob3NlIGluc3RydWN0aW9ucyBtdXN0IGJlIGNvbXB1dGVkLgorICAgICAqIEBwYXJhbSBpbmRleCBhbiBpbnN0cnVjdGlvbiBvZiB0aGlzIHN1YnJvdXRpbmUuCisgICAgICogQHBhcmFtIGFueXZpc2l0ZWQgaW5kZXhlcyBvZiB0aGUgYWxyZWFkeSB2aXNpdGVkIGluc3RydWN0aW9ucywgaS5lLgorICAgICAqICAgICAgICBtYXJrZWQgYXMgcGFydCBvZiB0aGlzIHN1YnJvdXRpbmUgb3IgYW55IHByZXZpb3VzbHkgY29tcHV0ZWQKKyAgICAgKiAgICAgICAgc3Vicm91dGluZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgbWFya1N1YnJvdXRpbmVXYWxrKAorICAgICAgICBmaW5hbCBCaXRTZXQgc3ViLAorICAgICAgICBmaW5hbCBpbnQgaW5kZXgsCisgICAgICAgIGZpbmFsIEJpdFNldCBhbnl2aXNpdGVkKQorICAgIHsKKyAgICAgICAgaWYgKExPR0dJTkcpIHsKKyAgICAgICAgICAgIGxvZygibWFya1N1YnJvdXRpbmVXYWxrOiBzdWI9IiArIHN1YiArICIgaW5kZXg9IiArIGluZGV4KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZpcnN0IGZpbmQgdGhvc2UgaW5zdHJ1Y3Rpb25zIHJlYWNoYWJsZSB2aWEgbm9ybWFsIGV4ZWN1dGlvbgorICAgICAgICBtYXJrU3Vicm91dGluZVdhbGtERlMoc3ViLCBpbmRleCwgYW55dmlzaXRlZCk7CisKKyAgICAgICAgLy8gTm93LCBtYWtlIHN1cmUgd2UgYWxzbyBpbmNsdWRlIGFueSBhcHBsaWNhYmxlIGV4Y2VwdGlvbiBoYW5kbGVycworICAgICAgICBib29sZWFuIGxvb3AgPSB0cnVlOworICAgICAgICB3aGlsZSAobG9vcCkgeworICAgICAgICAgICAgbG9vcCA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChJdGVyYXRvcjxUcnlDYXRjaEJsb2NrTm9kZT4gaXQgPSB0cnlDYXRjaEJsb2Nrcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgVHJ5Q2F0Y2hCbG9ja05vZGUgdHJ5Y2F0Y2ggPSBpdC5uZXh0KCk7CisKKyAgICAgICAgICAgICAgICBpZiAoTE9HR0lORykgeworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIHVzZSBvZiBkZWZhdWx0IHRvU3RyaW5nKCkuCisgICAgICAgICAgICAgICAgICAgIGxvZygiU2Nhbm5pbmcgdHJ5L2NhdGNoICIgKyB0cnljYXRjaCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGhhbmRsZXIgaGFzIGFscmVhZHkgYmVlbiBwcm9jZXNzZWQsIHNraXAgaXQuCisgICAgICAgICAgICAgICAgaW50IGhhbmRsZXJpbmRleCA9IGluc3RydWN0aW9ucy5pbmRleE9mKHRyeWNhdGNoLmhhbmRsZXIpOworICAgICAgICAgICAgICAgIGlmIChzdWIuZ2V0KGhhbmRsZXJpbmRleCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaW50IHN0YXJ0aW5kZXggPSBpbnN0cnVjdGlvbnMuaW5kZXhPZih0cnljYXRjaC5zdGFydCk7CisgICAgICAgICAgICAgICAgaW50IGVuZGluZGV4ID0gaW5zdHJ1Y3Rpb25zLmluZGV4T2YodHJ5Y2F0Y2guZW5kKTsKKyAgICAgICAgICAgICAgICBpbnQgbmV4dGJpdCA9IHN1Yi5uZXh0U2V0Qml0KHN0YXJ0aW5kZXgpOworICAgICAgICAgICAgICAgIGlmIChuZXh0Yml0ICE9IC0xICYmIG5leHRiaXQgPCBlbmRpbmRleCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoTE9HR0lORykgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJBZGRpbmcgZXhjZXB0aW9uIGhhbmRsZXI6ICIgKyBzdGFydGluZGV4ICsgJy0nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZW5kaW5kZXggKyAiIGR1ZSB0byAiICsgbmV4dGJpdCArICIgaGFuZGxlciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaGFuZGxlcmluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtYXJrU3Vicm91dGluZVdhbGtERlMoc3ViLCBoYW5kbGVyaW5kZXgsIGFueXZpc2l0ZWQpOworICAgICAgICAgICAgICAgICAgICBsb29wID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtcyBhIHNpbXBsZSBERlMgb2YgdGhlIGluc3RydWN0aW9ucywgYXNzaWduaW5nIGVhY2ggdG8gdGhlCisgICAgICogc3Vicm91dGluZSA8Y29kZT5zdWI8L2NvZGU+LiBTdGFydHMgZnJvbSA8Y29kZT5pbmRleDwvY29kZT4uCisgICAgICogSW52b2tlZCBvbmx5IGJ5IDxjb2RlPm1hcmtTdWJyb3V0aW5lV2FsaygpPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdWIgdGhlIHN1YnJvdXRpbmUgd2hvc2UgaW5zdHJ1Y3Rpb25zIG11c3QgYmUgY29tcHV0ZWQuCisgICAgICogQHBhcmFtIGluZGV4IGFuIGluc3RydWN0aW9uIG9mIHRoaXMgc3Vicm91dGluZS4KKyAgICAgKiBAcGFyYW0gYW55dmlzaXRlZCBpbmRleGVzIG9mIHRoZSBhbHJlYWR5IHZpc2l0ZWQgaW5zdHJ1Y3Rpb25zLCBpLmUuCisgICAgICogICAgICAgIG1hcmtlZCBhcyBwYXJ0IG9mIHRoaXMgc3Vicm91dGluZSBvciBhbnkgcHJldmlvdXNseSBjb21wdXRlZAorICAgICAqICAgICAgICBzdWJyb3V0aW5lLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBtYXJrU3Vicm91dGluZVdhbGtERlMoCisgICAgICAgIGZpbmFsIEJpdFNldCBzdWIsCisgICAgICAgIGludCBpbmRleCwKKyAgICAgICAgZmluYWwgQml0U2V0IGFueXZpc2l0ZWQpCisgICAgeworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgQWJzdHJhY3RJbnNuTm9kZSBub2RlID0gaW5zdHJ1Y3Rpb25zLmdldChpbmRleCk7CisKKyAgICAgICAgICAgIC8vIGRvbid0IHZpc2l0IGEgbm9kZSB0d2ljZQorICAgICAgICAgICAgaWYgKHN1Yi5nZXQoaW5kZXgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3ViLnNldChpbmRleCk7CisKKyAgICAgICAgICAgIC8vIGNoZWNrIGZvciB0aG9zZSBub2RlcyBhbHJlYWR5IHZpc2l0ZWQgYnkgYW5vdGhlciBzdWJyb3V0aW5lCisgICAgICAgICAgICBpZiAoYW55dmlzaXRlZC5nZXQoaW5kZXgpKSB7CisgICAgICAgICAgICAgICAgZHVhbENpdGl6ZW5zLnNldChpbmRleCk7CisgICAgICAgICAgICAgICAgaWYgKExPR0dJTkcpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nKCJJbnN0cnVjdGlvbiAjIiArIGluZGV4ICsgIiBpcyBkdWFsIGNpdGl6ZW4uIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYW55dmlzaXRlZC5zZXQoaW5kZXgpOworCisgICAgICAgICAgICBpZiAobm9kZS5nZXRUeXBlKCkgPT0gQWJzdHJhY3RJbnNuTm9kZS5KVU1QX0lOU04KKyAgICAgICAgICAgICAgICAgICAgJiYgbm9kZS5nZXRPcGNvZGUoKSAhPSBKU1IpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gd2UgZG8gbm90IGZvbGxvdyByZWN1cnNpdmVseSBjYWxsZWQgc3Vicm91dGluZXMgaGVyZTsgYnV0IGFueQorICAgICAgICAgICAgICAgIC8vIG90aGVyIHNvcnQgb2YgYnJhbmNoIHdlIGRvIGZvbGxvdworICAgICAgICAgICAgICAgIEp1bXBJbnNuTm9kZSBqbm9kZSA9IChKdW1wSW5zbk5vZGUpIG5vZGU7CisgICAgICAgICAgICAgICAgaW50IGRlc3RpZHggPSBpbnN0cnVjdGlvbnMuaW5kZXhPZihqbm9kZS5sYWJlbCk7CisgICAgICAgICAgICAgICAgbWFya1N1YnJvdXRpbmVXYWxrREZTKHN1YiwgZGVzdGlkeCwgYW55dmlzaXRlZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobm9kZS5nZXRUeXBlKCkgPT0gQWJzdHJhY3RJbnNuTm9kZS5UQUJMRVNXSVRDSF9JTlNOKSB7CisgICAgICAgICAgICAgICAgVGFibGVTd2l0Y2hJbnNuTm9kZSB0c25vZGUgPSAoVGFibGVTd2l0Y2hJbnNuTm9kZSkgbm9kZTsKKyAgICAgICAgICAgICAgICBpbnQgZGVzdGlkeCA9IGluc3RydWN0aW9ucy5pbmRleE9mKHRzbm9kZS5kZmx0KTsKKyAgICAgICAgICAgICAgICBtYXJrU3Vicm91dGluZVdhbGtERlMoc3ViLCBkZXN0aWR4LCBhbnl2aXNpdGVkKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gdHNub2RlLmxhYmVscy5zaXplKCkgLSAxOyBpID49IDA7IC0taSkgeworICAgICAgICAgICAgICAgICAgICBMYWJlbE5vZGUgbCA9IHRzbm9kZS5sYWJlbHMuZ2V0KGkpOworICAgICAgICAgICAgICAgICAgICBkZXN0aWR4ID0gaW5zdHJ1Y3Rpb25zLmluZGV4T2YobCk7CisgICAgICAgICAgICAgICAgICAgIG1hcmtTdWJyb3V0aW5lV2Fsa0RGUyhzdWIsIGRlc3RpZHgsIGFueXZpc2l0ZWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChub2RlLmdldFR5cGUoKSA9PSBBYnN0cmFjdEluc25Ob2RlLkxPT0tVUFNXSVRDSF9JTlNOKSB7CisgICAgICAgICAgICAgICAgTG9va3VwU3dpdGNoSW5zbk5vZGUgbHNub2RlID0gKExvb2t1cFN3aXRjaEluc25Ob2RlKSBub2RlOworICAgICAgICAgICAgICAgIGludCBkZXN0aWR4ID0gaW5zdHJ1Y3Rpb25zLmluZGV4T2YobHNub2RlLmRmbHQpOworICAgICAgICAgICAgICAgIG1hcmtTdWJyb3V0aW5lV2Fsa0RGUyhzdWIsIGRlc3RpZHgsIGFueXZpc2l0ZWQpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBsc25vZGUubGFiZWxzLnNpemUoKSAtIDE7IGkgPj0gMDsgLS1pKSB7CisgICAgICAgICAgICAgICAgICAgIExhYmVsTm9kZSBsID0gbHNub2RlLmxhYmVscy5nZXQoaSk7CisgICAgICAgICAgICAgICAgICAgIGRlc3RpZHggPSBpbnN0cnVjdGlvbnMuaW5kZXhPZihsKTsKKyAgICAgICAgICAgICAgICAgICAgbWFya1N1YnJvdXRpbmVXYWxrREZTKHN1YiwgZGVzdGlkeCwgYW55dmlzaXRlZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBjaGVjayB0byBzZWUgaWYgdGhpcyBvcGNvZGUgZmFsbHMgdGhyb3VnaCB0byB0aGUgbmV4dCBpbnN0cnVjdGlvbgorICAgICAgICAgICAgLy8gb3Igbm90OyBpZiBub3QsIHJldHVybi4KKyAgICAgICAgICAgIHN3aXRjaCAoaW5zdHJ1Y3Rpb25zLmdldChpbmRleCkuZ2V0T3Bjb2RlKCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEdPVE86CisgICAgICAgICAgICAgICAgY2FzZSBSRVQ6CisgICAgICAgICAgICAgICAgY2FzZSBUQUJMRVNXSVRDSDoKKyAgICAgICAgICAgICAgICBjYXNlIExPT0tVUFNXSVRDSDoKKyAgICAgICAgICAgICAgICBjYXNlIElSRVRVUk46CisgICAgICAgICAgICAgICAgY2FzZSBMUkVUVVJOOgorICAgICAgICAgICAgICAgIGNhc2UgRlJFVFVSTjoKKyAgICAgICAgICAgICAgICBjYXNlIERSRVRVUk46CisgICAgICAgICAgICAgICAgY2FzZSBBUkVUVVJOOgorICAgICAgICAgICAgICAgIGNhc2UgUkVUVVJOOgorICAgICAgICAgICAgICAgIGNhc2UgQVRIUk9XOgorICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgKiBub3RlOiB0aGlzIGVpdGhlciByZXR1cm5zIGZyb20gdGhpcyBzdWJyb3V0aW5lLCBvciBhCisgICAgICAgICAgICAgICAgICAgICAqIHBhcmVudCBzdWJyb3V0aW5lIHdoaWNoIGludm9rZWQgaXQKKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVXNlIHRhaWwgcmVjdXJzaW9uIGhlcmUgaW4gdGhlIGZvcm0gb2YgYW4gb3V0ZXIgd2hpbGUgbG9vcCB0bworICAgICAgICAgICAgLy8gYXZvaWQgb3VyIHN0YWNrIGdyb3dpbmcgbmVlZGxlc3NseToKKyAgICAgICAgICAgIGluZGV4Kys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIHRoZSBuZXcgaW5zdHJ1Y3Rpb25zLCBpbmxpbmluZyBlYWNoIGluc3RhbnRpYXRpb24gb2YgZWFjaAorICAgICAqIHN1YnJvdXRpbmUgdW50aWwgdGhlIGNvZGUgaXMgZnVsbHkgZWxhYm9yYXRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZW1pdENvZGUoKSB7CisgICAgICAgIExpbmtlZExpc3Q8SW5zdGFudGlhdGlvbj4gd29ya2xpc3QgPSBuZXcgTGlua2VkTGlzdDxJbnN0YW50aWF0aW9uPigpOworICAgICAgICAvLyBDcmVhdGUgYW4gaW5zdGFudGlhdGlvbiBvZiB0aGUgInJvb3QiIHN1YnJvdXRpbmUsIHdoaWNoIGlzIGp1c3QgdGhlCisgICAgICAgIC8vIG1haW4gcm91dGluZQorICAgICAgICB3b3JrbGlzdC5hZGQobmV3IEluc3RhbnRpYXRpb24obnVsbCwgbWFpblN1YnJvdXRpbmUpKTsKKworICAgICAgICAvLyBFbWl0IGluc3RhbnRpYXRpb25zIG9mIGVhY2ggc3Vicm91dGluZSB3ZSBlbmNvdW50ZXIsIGluY2x1ZGluZyB0aGUKKyAgICAgICAgLy8gbWFpbiBzdWJyb3V0aW5lCisgICAgICAgIEluc25MaXN0IG5ld0luc3RydWN0aW9ucyA9IG5ldyBJbnNuTGlzdCgpOworICAgICAgICBMaXN0PFRyeUNhdGNoQmxvY2tOb2RlPiBuZXdUcnlDYXRjaEJsb2NrcyA9IG5ldyBBcnJheUxpc3Q8VHJ5Q2F0Y2hCbG9ja05vZGU+KCk7CisgICAgICAgIExpc3Q8TG9jYWxWYXJpYWJsZU5vZGU+IG5ld0xvY2FsVmFyaWFibGVzID0gbmV3IEFycmF5TGlzdDxMb2NhbFZhcmlhYmxlTm9kZT4oKTsKKyAgICAgICAgd2hpbGUgKCF3b3JrbGlzdC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIEluc3RhbnRpYXRpb24gaW5zdCA9IHdvcmtsaXN0LnJlbW92ZUZpcnN0KCk7CisgICAgICAgICAgICBlbWl0U3Vicm91dGluZShpbnN0LAorICAgICAgICAgICAgICAgICAgICB3b3JrbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgbmV3SW5zdHJ1Y3Rpb25zLAorICAgICAgICAgICAgICAgICAgICBuZXdUcnlDYXRjaEJsb2NrcywKKyAgICAgICAgICAgICAgICAgICAgbmV3TG9jYWxWYXJpYWJsZXMpOworICAgICAgICB9CisgICAgICAgIGluc3RydWN0aW9ucyA9IG5ld0luc3RydWN0aW9uczsKKyAgICAgICAgdHJ5Q2F0Y2hCbG9ja3MgPSBuZXdUcnlDYXRjaEJsb2NrczsKKyAgICAgICAgbG9jYWxWYXJpYWJsZXMgPSBuZXdMb2NhbFZhcmlhYmxlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbWl0cyBvbmUgaW5zdGFudGlhdGlvbiBvZiBvbmUgc3Vicm91dGluZSwgc3BlY2lmaWVkIGJ5CisgICAgICogPGNvZGU+aW5zdGFudDwvY29kZT4uIE1heSBhZGQgbmV3IGluc3RhbnRpYXRpb25zIHRoYXQgYXJlIGludm9rZWQgYnkKKyAgICAgKiB0aGlzIG9uZSB0byB0aGUgPGNvZGU+d29ya2xpc3Q8L2NvZGU+IHBhcmFtZXRlciwgYW5kIG5ldyB0cnkvY2F0Y2gKKyAgICAgKiBibG9ja3MgdG8gPGNvZGU+bmV3VHJ5Q2F0Y2hCbG9ja3M8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIGluc3RhbnQgdGhlIGluc3RhbnRpYXRpb24gdGhhdCBtdXN0IGJlIHBlcmZvcm1lZC4KKyAgICAgKiBAcGFyYW0gd29ya2xpc3QgbGlzdCBvZiB0aGUgaW5zdGFudGlhdGlvbnMgdGhhdCByZW1haW4gdG8gYmUgZG9uZS4KKyAgICAgKiBAcGFyYW0gbmV3SW5zdHJ1Y3Rpb25zIHRoZSBpbnN0cnVjdGlvbiBsaXN0IHRvIHdoaWNoIHRoZSBpbnN0YW50aWF0ZWQKKyAgICAgKiAgICAgICAgY29kZSBtdXN0IGJlIGFwcGVuZGVkLgorICAgICAqIEBwYXJhbSBuZXdUcnlDYXRjaEJsb2NrcyB0aGUgZXhjZXB0aW9uIGhhbmRsZXIgbGlzdCB0byB3aGljaCB0aGUKKyAgICAgKiAgICAgICAgaW5zdGFudGlhdGVkIGhhbmRsZXJzIG11c3QgYmUgYXBwZW5kZWQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGVtaXRTdWJyb3V0aW5lKAorICAgICAgICBmaW5hbCBJbnN0YW50aWF0aW9uIGluc3RhbnQsCisgICAgICAgIGZpbmFsIExpc3Q8SW5zdGFudGlhdGlvbj4gd29ya2xpc3QsCisgICAgICAgIGZpbmFsIEluc25MaXN0IG5ld0luc3RydWN0aW9ucywKKyAgICAgICAgZmluYWwgTGlzdDxUcnlDYXRjaEJsb2NrTm9kZT4gbmV3VHJ5Q2F0Y2hCbG9ja3MsCisgICAgICAgIGZpbmFsIExpc3Q8TG9jYWxWYXJpYWJsZU5vZGU+IG5ld0xvY2FsVmFyaWFibGVzKQorICAgIHsKKyAgICAgICAgTGFiZWxOb2RlIGR1cGxibCA9IG51bGw7CisKKyAgICAgICAgaWYgKExPR0dJTkcpIHsKKyAgICAgICAgICAgIGxvZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKKyAgICAgICAgICAgIGxvZygiRW1pdHRpbmcgaW5zdGFudGlhdGlvbiBvZiBzdWJyb3V0aW5lICIgKyBpbnN0YW50LnN1YnJvdXRpbmUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRW1pdCB0aGUgcmVsZXZhbnQgaW5zdHJ1Y3Rpb25zIGZvciB0aGlzIGluc3RhbnRpYXRpb24sIHRyYW5zbGF0aW5nCisgICAgICAgIC8vIGxhYmVscyBhbmQganVtcCB0YXJnZXRzIGFzIHdlIGdvOgorICAgICAgICBmb3IgKGludCBpID0gMCwgYyA9IGluc3RydWN0aW9ucy5zaXplKCk7IGkgPCBjOyBpKyspIHsKKyAgICAgICAgICAgIEFic3RyYWN0SW5zbk5vZGUgaW5zbiA9IGluc3RydWN0aW9ucy5nZXQoaSk7CisgICAgICAgICAgICBJbnN0YW50aWF0aW9uIG93bmVyID0gaW5zdGFudC5maW5kT3duZXIoaSk7CisKKyAgICAgICAgICAgIC8vIEFsd2F5cyByZW1hcCBsYWJlbHM6CisgICAgICAgICAgICBpZiAoaW5zbi5nZXRUeXBlKCkgPT0gQWJzdHJhY3RJbnNuTm9kZS5MQUJFTCkgeworICAgICAgICAgICAgICAgIC8vIFRyYW5zbGF0ZSBsYWJlbHMgaW50byB0aGVpciByZW5hbWVkIGVxdWl2YWxlbnRzLgorICAgICAgICAgICAgICAgIC8vIEF2b2lkIGFkZGluZyB0aGUgc2FtZSBsYWJlbCBtb3JlIHRoYW4gb25jZS4gTm90ZQorICAgICAgICAgICAgICAgIC8vIHRoYXQgYmVjYXVzZSB3ZSBvd24gdGhpcyBpbnN0cnVjdGlvbiB0aGUgZ290b1RhYmxlCisgICAgICAgICAgICAgICAgLy8gYW5kIHRoZSByYW5nZVRhYmxlIHdpbGwgYWx3YXlzIGFncmVlLgorICAgICAgICAgICAgICAgIExhYmVsTm9kZSBpbGJsID0gKExhYmVsTm9kZSkgaW5zbjsKKyAgICAgICAgICAgICAgICBMYWJlbE5vZGUgcmVtYXAgPSBpbnN0YW50LnJhbmdlTGFiZWwoaWxibCk7CisgICAgICAgICAgICAgICAgaWYgKExPR0dJTkcpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyB1c2Ugb2YgZGVmYXVsdCB0b1N0cmluZygpLgorICAgICAgICAgICAgICAgICAgICBsb2coIlRyYW5zbGF0aW5nIGxibCAjIiArIGkgKyAnOicgKyBpbGJsICsgIiB0byAiICsgcmVtYXApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocmVtYXAgIT0gZHVwbGJsKSB7CisgICAgICAgICAgICAgICAgICAgIG5ld0luc3RydWN0aW9ucy5hZGQocmVtYXApOworICAgICAgICAgICAgICAgICAgICBkdXBsYmwgPSByZW1hcDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gZW1pdCBpbnN0cnVjdGlvbnMgdGhhdCB3ZXJlIGFscmVhZHkKKyAgICAgICAgICAgIC8vIGVtaXR0ZWQgYnkgYSBzdWJyb3V0aW5lIGhpZ2hlciBvbiB0aGUgc3RhY2suIE5vdGUgdGhhdAorICAgICAgICAgICAgLy8gaXQgaXMgc3RpbGwgcG9zc2libGUgZm9yIGEgZ2l2ZW4gaW5zdHJ1Y3Rpb24gdG8gYmUKKyAgICAgICAgICAgIC8vIGVtaXR0ZWQgdHdpY2UgYmVjYXVzZSBpdCBtYXkgYmVsb25nIHRvIHR3byBzdWJyb3V0aW5lcworICAgICAgICAgICAgLy8gdGhhdCBkbyBub3QgaW52b2tlIGVhY2ggb3RoZXIuCisgICAgICAgICAgICBpZiAob3duZXIgIT0gaW5zdGFudCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoTE9HR0lORykgeworICAgICAgICAgICAgICAgIGxvZygiRW1pdHRpbmcgaW5zdCAjIiArIGkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoaW5zbi5nZXRPcGNvZGUoKSA9PSBSRVQpIHsKKyAgICAgICAgICAgICAgICAvLyBUcmFuc2xhdGUgUkVUIGluc3RydWN0aW9uKHMpIHRvIGEganVtcCB0byB0aGUgcmV0dXJuIGxhYmVsCisgICAgICAgICAgICAgICAgLy8gZm9yIHRoZSBhcHByb3ByaWF0ZSBpbnN0YW50aWF0aW9uLiBUaGUgcHJvYmxlbSBpcyB0aGF0IHRoZQorICAgICAgICAgICAgICAgIC8vIHN1YnJvdXRpbmUgbWF5ICJmYWxsIHRocm91Z2giIHRvIHRoZSByZXQgb2YgYSBwYXJlbnQKKyAgICAgICAgICAgICAgICAvLyBzdWJyb3V0aW5lOyB0aGVyZWZvcmUsIHRvIGZpbmQgdGhlIGFwcHJvcHJpYXRlIHJldCBsYWJlbCB3ZQorICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIGxvd2VzdCBzdWJyb3V0aW5lIG9uIHRoZSBzdGFjayB0aGF0IGNsYWltcyB0byBvd24KKyAgICAgICAgICAgICAgICAvLyB0aGlzIGluc3RydWN0aW9uLiBTZWUgdGhlIGNsYXNzIGphdmFkb2MgY29tbWVudCBmb3IgYW4KKyAgICAgICAgICAgICAgICAvLyBleHBsYW5hdGlvbiBvbiB3aHkgdGhpcyB0ZWNobmlxdWUgaXMgc2FmZSAobm90ZTogaXQgaXMgb25seQorICAgICAgICAgICAgICAgIC8vIHNhZmUgaWYgdGhlIGlucHV0IGlzIHZlcmlmaWFibGUpLgorICAgICAgICAgICAgICAgIExhYmVsTm9kZSByZXRsYWJlbCA9IG51bGw7CisgICAgICAgICAgICAgICAgZm9yIChJbnN0YW50aWF0aW9uIHAgPSBpbnN0YW50OyBwICE9IG51bGw7IHAgPSBwLnByZXZpb3VzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwLnN1YnJvdXRpbmUuZ2V0KGkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXRsYWJlbCA9IHAucmV0dXJuTGFiZWw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHJldGxhYmVsID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBvbmx5IHBvc3NpYmxlIGlmIHRoZSBtYWluU3Vicm91dGluZSBvd25zIGEgUkVUCisgICAgICAgICAgICAgICAgICAgIC8vIGluc3RydWN0aW9uLCB3aGljaCBzaG91bGQgbmV2ZXIgaGFwcGVuIGZvciB2ZXJpZmlhYmxlCisgICAgICAgICAgICAgICAgICAgIC8vIGNvZGUuCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbnN0cnVjdGlvbiAjIiArIGkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaXMgYSBSRVQgbm90IG93bmVkIGJ5IGFueSBzdWJyb3V0aW5lIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG5ld0luc3RydWN0aW9ucy5hZGQobmV3IEp1bXBJbnNuTm9kZShHT1RPLCByZXRsYWJlbCkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChpbnNuLmdldE9wY29kZSgpID09IEpTUikgeworICAgICAgICAgICAgICAgIExhYmVsTm9kZSBsYmwgPSAoKEp1bXBJbnNuTm9kZSkgaW5zbikubGFiZWw7CisgICAgICAgICAgICAgICAgQml0U2V0IHN1YiA9IHN1YnJvdXRpbmVIZWFkcy5nZXQobGJsKTsKKyAgICAgICAgICAgICAgICBJbnN0YW50aWF0aW9uIG5ld2luc3QgPSBuZXcgSW5zdGFudGlhdGlvbihpbnN0YW50LCBzdWIpOworICAgICAgICAgICAgICAgIExhYmVsTm9kZSBzdGFydGxibCA9IG5ld2luc3QuZ290b0xhYmVsKGxibCk7CisKKyAgICAgICAgICAgICAgICBpZiAoTE9HR0lORykgeworICAgICAgICAgICAgICAgICAgICBsb2coIiBDcmVhdGluZyBpbnN0YW50aWF0aW9uIG9mIHN1YnIgIiArIHN1Yik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gUmF0aGVyIHRoYW4gSlNSaW5nLCB3ZSB3aWxsIGp1bXAgdG8gdGhlIGlubGluZSB2ZXJzaW9uIGFuZAorICAgICAgICAgICAgICAgIC8vIHB1c2ggTlVMTCBmb3Igd2hhdCB3YXMgb25jZSB0aGUgcmV0dXJuIHZhbHVlLiBUaGlzIGhhY2sKKyAgICAgICAgICAgICAgICAvLyBhbGxvd3MgdXMgdG8gYXZvaWQgZG9pbmcgYW55IHNvcnQgb2YgZGF0YSBmbG93IGFuYWx5c2lzIHRvCisgICAgICAgICAgICAgICAgLy8gZmlndXJlIG91dCB3aGljaCBpbnN0cnVjdGlvbnMgbWFuaXB1bGF0ZSB0aGUgb2xkIHJldHVybiB2YWx1ZQorICAgICAgICAgICAgICAgIC8vIHBvaW50ZXIgd2hpY2ggaXMgbm93IGtub3duIHRvIGJlIHVubmVlZGVkLgorICAgICAgICAgICAgICAgIG5ld0luc3RydWN0aW9ucy5hZGQobmV3IEluc25Ob2RlKEFDT05TVF9OVUxMKSk7CisgICAgICAgICAgICAgICAgbmV3SW5zdHJ1Y3Rpb25zLmFkZChuZXcgSnVtcEluc25Ob2RlKEdPVE8sIHN0YXJ0bGJsKSk7CisgICAgICAgICAgICAgICAgbmV3SW5zdHJ1Y3Rpb25zLmFkZChuZXdpbnN0LnJldHVybkxhYmVsKTsKKworICAgICAgICAgICAgICAgIC8vIEluc2VydCB0aGlzIG5ldyBpbnN0YW50aWF0aW9uIGludG8gdGhlIHF1ZXVlIHRvIGJlIGVtaXR0ZWQKKyAgICAgICAgICAgICAgICAvLyBsYXRlci4KKyAgICAgICAgICAgICAgICB3b3JrbGlzdC5hZGQobmV3aW5zdCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG5ld0luc3RydWN0aW9ucy5hZGQoaW5zbi5jbG9uZShpbnN0YW50KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBFbWl0IHRyeS9jYXRjaCBibG9ja3MgdGhhdCBhcmUgcmVsZXZhbnQgdG8gdGhpcyBtZXRob2QuCisgICAgICAgIGZvciAoSXRlcmF0b3I8VHJ5Q2F0Y2hCbG9ja05vZGU+IGl0ID0gdHJ5Q2F0Y2hCbG9ja3MuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgVHJ5Q2F0Y2hCbG9ja05vZGUgdHJ5Y2F0Y2ggPSBpdC5uZXh0KCk7CisKKyAgICAgICAgICAgIGlmIChMT0dHSU5HKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETyB1c2Ugb2YgZGVmYXVsdCB0b1N0cmluZygpLgorICAgICAgICAgICAgICAgIGxvZygidHJ5IGNhdGNoIGJsb2NrIG9yaWdpbmFsIGxhYmVscz0iICsgdHJ5Y2F0Y2guc3RhcnQgKyAnLScKKyAgICAgICAgICAgICAgICAgICAgICAgICsgdHJ5Y2F0Y2guZW5kICsgIi0+IiArIHRyeWNhdGNoLmhhbmRsZXIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBMYWJlbE5vZGUgc3RhcnQgPSBpbnN0YW50LnJhbmdlTGFiZWwodHJ5Y2F0Y2guc3RhcnQpOworICAgICAgICAgICAgZmluYWwgTGFiZWxOb2RlIGVuZCA9IGluc3RhbnQucmFuZ2VMYWJlbCh0cnljYXRjaC5lbmQpOworCisgICAgICAgICAgICAvLyBJZ25vcmUgZW1wdHkgdHJ5L2NhdGNoIHJlZ2lvbnMKKyAgICAgICAgICAgIGlmIChzdGFydCA9PSBlbmQpIHsKKyAgICAgICAgICAgICAgICBpZiAoTE9HR0lORykgeworICAgICAgICAgICAgICAgICAgICBsb2coIiB0cnkgY2F0Y2ggYmxvY2sgZW1wdHkgaW4gdGhpcyBzdWJyb3V0aW5lIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBMYWJlbE5vZGUgaGFuZGxlciA9IGluc3RhbnQuZ290b0xhYmVsKHRyeWNhdGNoLmhhbmRsZXIpOworCisgICAgICAgICAgICBpZiAoTE9HR0lORykgeworICAgICAgICAgICAgICAgIC8vIFRPRE8gdXNlIG9mIGRlZmF1bHQgdG9TdHJpbmcoKS4KKyAgICAgICAgICAgICAgICBsb2coIiB0cnkgY2F0Y2ggYmxvY2sgbmV3IGxhYmVscz0iICsgc3RhcnQgKyAnLScgKyBlbmQgKyAiLT4iCisgICAgICAgICAgICAgICAgICAgICAgICArIGhhbmRsZXIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc3RhcnQgPT0gbnVsbCB8fCBlbmQgPT0gbnVsbCB8fCBoYW5kbGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSW50ZXJuYWwgZXJyb3IhIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG5ld1RyeUNhdGNoQmxvY2tzLmFkZChuZXcgVHJ5Q2F0Y2hCbG9ja05vZGUoc3RhcnQsCisgICAgICAgICAgICAgICAgICAgIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgdHJ5Y2F0Y2gudHlwZSkpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChJdGVyYXRvcjxMb2NhbFZhcmlhYmxlTm9kZT4gaXQgPSBsb2NhbFZhcmlhYmxlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBMb2NhbFZhcmlhYmxlTm9kZSBsdm5vZGUgPSBpdC5uZXh0KCk7CisgICAgICAgICAgICBpZiAoTE9HR0lORykgeworICAgICAgICAgICAgICAgIGxvZygibG9jYWwgdmFyICIgKyBsdm5vZGUubmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBMYWJlbE5vZGUgc3RhcnQgPSBpbnN0YW50LnJhbmdlTGFiZWwobHZub2RlLnN0YXJ0KTsKKyAgICAgICAgICAgIGZpbmFsIExhYmVsTm9kZSBlbmQgPSBpbnN0YW50LnJhbmdlTGFiZWwobHZub2RlLmVuZCk7CisgICAgICAgICAgICBpZiAoc3RhcnQgPT0gZW5kKSB7CisgICAgICAgICAgICAgICAgaWYgKExPR0dJTkcpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nKCIgIGxvY2FsIHZhcmlhYmxlIGVtcHR5IGluIHRoaXMgc3ViIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbmV3TG9jYWxWYXJpYWJsZXMuYWRkKG5ldyBMb2NhbFZhcmlhYmxlTm9kZShsdm5vZGUubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgbHZub2RlLmRlc2MsCisgICAgICAgICAgICAgICAgICAgIGx2bm9kZS5zaWduYXR1cmUsCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICBlbmQsCisgICAgICAgICAgICAgICAgICAgIGx2bm9kZS5pbmRleCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2coZmluYWwgU3RyaW5nIHN0cikgeworICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oc3RyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIGNsYXNzIHRoYXQgcmVwcmVzZW50cyBhbiBpbnN0YW50aWF0aW9uIG9mIGEgc3Vicm91dGluZS4gRWFjaAorICAgICAqIGluc3RhbnRpYXRpb24gaGFzIGFuIGFzc29jaWF0ZSAic3RhY2siIC0tLSB3aGljaCBpcyBhIGxpc3Rpbmcgb2YgdGhvc2UKKyAgICAgKiBpbnN0YW50aWF0aW9ucyB0aGF0IHdlcmUgYWN0aXZlIHdoZW4gdGhpcyBwYXJ0aWN1bGFyIGluc3RhbmNlIG9mIHRoaXMKKyAgICAgKiBzdWJyb3V0aW5lIHdhcyBpbnZva2VkLiBFYWNoIGluc3RhbnRpYXRpb24gYWxzbyBoYXMgYSBtYXAgZnJvbSB0aGUKKyAgICAgKiBvcmlnaW5hbCBsYWJlbHMgb2YgdGhlIHByb2dyYW0gdG8gdGhlIGxhYmVscyBhcHByb3ByaWF0ZSBmb3IgdGhpcworICAgICAqIGluc3RhbnRpYXRpb24sIGFuZCBmaW5hbGx5IGEgbGFiZWwgdG8gcmV0dXJuIHRvLgorICAgICAqLworICAgIHByaXZhdGUgY2xhc3MgSW5zdGFudGlhdGlvbiBleHRlbmRzIEFic3RyYWN0TWFwPExhYmVsTm9kZSwgTGFiZWxOb2RlPiB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFByZXZpb3VzIGluc3RhbnRpYXRpb25zOyB0aGUgc3RhY2sgbXVzdCBiZSBzdGF0aWNhbGx5IHByZWRpY3RhYmxlIHRvCisgICAgICAgICAqIGJlIGlubGluYWJsZS4KKyAgICAgICAgICovCisgICAgICAgIGZpbmFsIEluc3RhbnRpYXRpb24gcHJldmlvdXM7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBzdWJyb3V0aW5lIHRoaXMgaXMgYW4gaW5zdGFudGlhdGlvbiBvZi4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBmaW5hbCBCaXRTZXQgc3Vicm91dGluZTsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyB0YWJsZSBtYXBzIExhYmVscyBmcm9tIHRoZSBvcmlnaW5hbCBzb3VyY2UgdG8gTGFiZWxzIHBvaW50aW5nIGF0CisgICAgICAgICAqIGNvZGUgc3BlY2lmaWMgdG8gdGhpcyBpbnN0YW50aWF0aW9uLCBmb3IgdXNlIGluIHJlbWFwcGluZyB0cnkvY2F0Y2gKKyAgICAgICAgICogYmxvY2tzLGFzIHdlbGwgYXMgZ290b3MuCisgICAgICAgICAqCisgICAgICAgICAqIE5vdGUgdGhhdCBpbiB0aGUgcHJlc2VuY2Ugb2YgZHVhbCBjaXRpemVucyBpbnN0cnVjdGlvbnMsIHRoYXQgaXMsCisgICAgICAgICAqIGluc3RydWN0aW9ucyB3aGljaCBiZWxvbmcgdG8gbW9yZSB0aGFuIG9uZSBzdWJyb3V0aW5lIGR1ZSB0byB0aGUKKyAgICAgICAgICogbWVyZ2luZyBvZiBjb250cm9sIGZsb3cgd2l0aG91dCBhIFJFVCBpbnN0cnVjdGlvbiwgd2Ugd2lsbCBtYXAgdGhlCisgICAgICAgICAqIHRhcmdldCBsYWJlbCBvZiBhIEdPVE8gdG8gdGhlIGxhYmVsIHVzZWQgYnkgdGhlIGluc3RhbnRpYXRpb24gbG93ZXN0CisgICAgICAgICAqIG9uIHRoZSBzdGFjay4gVGhpcyBhdm9pZHMgY29kZSBkdXBsaWNhdGlvbiBkdXJpbmcgaW5saW5pbmcgaW4gbW9zdAorICAgICAgICAgKiBjYXNlcy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHNlZSAjZmluZE93bmVyKGludCkKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBmaW5hbCBNYXA8TGFiZWxOb2RlLCBMYWJlbE5vZGU+IHJhbmdlVGFibGUgPSBuZXcgSGFzaE1hcDxMYWJlbE5vZGUsIExhYmVsTm9kZT4oKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQWxsIHJldHVybnMgZm9yIHRoaXMgaW5zdGFudGlhdGlvbiB3aWxsIGJlIG1hcHBlZCB0byB0aGlzIGxhYmVsCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgZmluYWwgTGFiZWxOb2RlIHJldHVybkxhYmVsOworCisgICAgICAgIEluc3RhbnRpYXRpb24oZmluYWwgSW5zdGFudGlhdGlvbiBwcmV2LCBmaW5hbCBCaXRTZXQgc3ViKSB7CisgICAgICAgICAgICBwcmV2aW91cyA9IHByZXY7CisgICAgICAgICAgICBzdWJyb3V0aW5lID0gc3ViOworICAgICAgICAgICAgZm9yIChJbnN0YW50aWF0aW9uIHAgPSBwcmV2OyBwICE9IG51bGw7IHAgPSBwLnByZXZpb3VzKSB7CisgICAgICAgICAgICAgICAgaWYgKHAuc3Vicm91dGluZSA9PSBzdWIpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlJlY3Vyc2l2ZSBpbnZvY2F0aW9uIG9mICIgKyBzdWIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIHRoZSBsYWJlbCB0byByZXR1cm4gdG8gd2hlbiB0aGlzIHN1YnJvdXRpbmUgdGVybWluYXRlcworICAgICAgICAgICAgLy8gdmlhIFJFVDogbm90ZSB0aGF0IHRoZSBtYWluIHN1YnJvdXRpbmUgbmV2ZXIgdGVybWluYXRlcyB2aWEgUkVULgorICAgICAgICAgICAgaWYgKHByZXYgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybkxhYmVsID0gbmV3IExhYmVsTm9kZSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm5MYWJlbCA9IG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEVhY2ggaW5zdGFudGlhdGlvbiB3aWxsIHJlbWFwIHRoZSBsYWJlbHMgZnJvbSB0aGUgY29kZSBhYm92ZSB0bworICAgICAgICAgICAgLy8gcmVmZXIgdG8gaXRzIHBhcnRpY3VsYXIgY29weSBvZiBpdHMgb3duIGluc3RydWN0aW9ucy4gTm90ZSB0aGF0CisgICAgICAgICAgICAvLyB3ZSBjb2xsYXBzZSBsYWJlbHMgd2hpY2ggcG9pbnQgYXQgdGhlIHNhbWUgaW5zdHJ1Y3Rpb24gaW50byBvbmU6CisgICAgICAgICAgICAvLyB0aGlzIGlzIGZhaXJseSBjb21tb24gYXMgd2UgYXJlIG9mdGVuIGlnbm9yaW5nIGxhcmdlIGNodW5rcyBvZgorICAgICAgICAgICAgLy8gaW5zdHJ1Y3Rpb25zLCBzbyB3aGF0IHdlcmUgcHJldmlvdXNseSBkaXN0aW5jdCBsYWJlbHMgYmVjb21lCisgICAgICAgICAgICAvLyBkdXBsaWNhdGVzLgorICAgICAgICAgICAgTGFiZWxOb2RlIGR1cGxibCA9IG51bGw7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMCwgYyA9IGluc3RydWN0aW9ucy5zaXplKCk7IGkgPCBjOyBpKyspIHsKKyAgICAgICAgICAgICAgICBBYnN0cmFjdEluc25Ob2RlIGluc24gPSBpbnN0cnVjdGlvbnMuZ2V0KGkpOworCisgICAgICAgICAgICAgICAgaWYgKGluc24uZ2V0VHlwZSgpID09IEFic3RyYWN0SW5zbk5vZGUuTEFCRUwpIHsKKyAgICAgICAgICAgICAgICAgICAgTGFiZWxOb2RlIGlsYmwgPSAoTGFiZWxOb2RlKSBpbnNuOworCisgICAgICAgICAgICAgICAgICAgIGlmIChkdXBsYmwgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgYWxyZWFkeSBoYXZlIGEgbGFiZWwgcG9pbnRpbmcgYXQgdGhpcyBzcG90LAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3QgcmVjcmVhdGUgaXQuCisgICAgICAgICAgICAgICAgICAgICAgICBkdXBsYmwgPSBuZXcgTGFiZWxOb2RlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBBZGQgYW4gZW50cnkgaW4gdGhlIHJhbmdlVGFibGUgZm9yIGV2ZXJ5IGxhYmVsCisgICAgICAgICAgICAgICAgICAgIC8vIGluIHRoZSBvcmlnaW5hbCBjb2RlIHdoaWNoIHBvaW50cyBhdCB0aGUgbmV4dAorICAgICAgICAgICAgICAgICAgICAvLyBpbnN0cnVjdGlvbiBvZiBvdXIgb3duIHRvIGJlIGVtaXR0ZWQuCisgICAgICAgICAgICAgICAgICAgIHJhbmdlVGFibGUucHV0KGlsYmwsIGR1cGxibCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmaW5kT3duZXIoaSkgPT0gdGhpcykgeworICAgICAgICAgICAgICAgICAgICAvLyBXZSB3aWxsIGVtaXQgdGhpcyBpbnN0cnVjdGlvbiwgc28gY2xlYXIgdGhlICdkdXBsYmwnIGZsYWcKKyAgICAgICAgICAgICAgICAgICAgLy8gc2luY2UgdGhlIG5leHQgTGFiZWwgd2lsbCByZWZlciB0byBhIGRpc3RpbmN0CisgICAgICAgICAgICAgICAgICAgIC8vIGluc3RydWN0aW9uLgorICAgICAgICAgICAgICAgICAgICBkdXBsYmwgPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSAib3duZXIiIG9mIGEgcGFydGljdWxhciBpbnN0cnVjdGlvbiByZWxhdGl2ZSB0byB0aGlzCisgICAgICAgICAqIGluc3RhbnRpYXRpb246IHRoZSBvd25lciByZWZlcmVzIHRvIHRoZSBJbnN0YW50aWF0aW9uIHdoaWNoIHdpbGwgZW1pdAorICAgICAgICAgKiB0aGUgdmVyc2lvbiBvZiB0aGlzIGluc3RydWN0aW9uIHRoYXQgd2Ugd2lsbCBleGVjdXRlLgorICAgICAgICAgKgorICAgICAgICAgKiBUeXBpY2FsbHksIHRoZSByZXR1cm4gdmFsdWUgaXMgZWl0aGVyIDxjb2RlPnRoaXM8L2NvZGU+IG9yCisgICAgICAgICAqIDxjb2RlPm51bGw8L2NvZGU+LiA8Y29kZT50aGlzPC9jb2RlPiBpbmRpY2F0ZXMgdGhhdCB0aGlzCisgICAgICAgICAqIGluc3RhbnRpYXRpb24gd2lsbCBnZW5lcmF0ZSB0aGUgdmVyc2lvbiBvZiB0aGlzIGluc3RydWN0aW9uIHRoYXQgd2UKKyAgICAgICAgICogd2lsbCBleGVjdXRlLCBhbmQgPGNvZGU+bnVsbDwvY29kZT4gaW5kaWNhdGVzIHRoYXQgdGhpcworICAgICAgICAgKiBpbnN0YW50aWF0aW9uIG5ldmVyIGV4ZWN1dGVzIHRoZSBnaXZlbiBpbnN0cnVjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogU29tZXRpbWVzLCBob3dldmVyLCBhbiBpbnN0cnVjdGlvbiBjYW4gYmVsb25nIHRvIG11bHRpcGxlCisgICAgICAgICAqIHN1YnJvdXRpbmVzOyB0aGlzIGlzIGNhbGxlZCBhICJkdWFsIGNpdGl6ZW4iIGluc3RydWN0aW9uICh0aG91Z2ggaXQKKyAgICAgICAgICogbWF5IGJlbG9uZyB0byBtb3JlIHRoYW4gMiBzdWJyb3V0aW5lcyksIGFuZCBvY2N1cnMgd2hlbiBtdWx0aXBsZQorICAgICAgICAgKiBzdWJyb3V0aW5lcyBicmFuY2ggdG8gY29tbW9uIHBvaW50cyBvZiBjb250cm9sLiBJbiB0aGlzIGNhc2UsIHRoZQorICAgICAgICAgKiBvd25lciBpcyB0aGUgc3Vicm91dGluZSB0aGF0IGFwcGVhcnMgbG93ZXN0IG9uIHRoZSBzdGFjaywgYW5kIHdoaWNoCisgICAgICAgICAqIGFsc28gb3ducyB0aGUgaW5zdHJ1Y3Rpb24gaW4gcXVlc3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBpIHRoZSBpbmRleCBvZiB0aGUgaW5zdHJ1Y3Rpb24gaW4gdGhlIG9yaWdpbmFsIGNvZGUKKyAgICAgICAgICogQHJldHVybiB0aGUgIm93bmVyIiBvZiBhIHBhcnRpY3VsYXIgaW5zdHJ1Y3Rpb24gcmVsYXRpdmUgdG8gdGhpcworICAgICAgICAgKiAgICAgICAgIGluc3RhbnRpYXRpb24uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgSW5zdGFudGlhdGlvbiBmaW5kT3duZXIoZmluYWwgaW50IGkpIHsKKyAgICAgICAgICAgIGlmICghc3Vicm91dGluZS5nZXQoaSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghZHVhbENpdGl6ZW5zLmdldChpKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgSW5zdGFudGlhdGlvbiBvd24gPSB0aGlzOworICAgICAgICAgICAgZm9yIChJbnN0YW50aWF0aW9uIHAgPSBwcmV2aW91czsgcCAhPSBudWxsOyBwID0gcC5wcmV2aW91cykgeworICAgICAgICAgICAgICAgIGlmIChwLnN1YnJvdXRpbmUuZ2V0KGkpKSB7CisgICAgICAgICAgICAgICAgICAgIG93biA9IHA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG93bjsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBMb29rcyB1cCB0aGUgbGFiZWwgPGNvZGU+bDwvY29kZT4gaW4gdGhlIDxjb2RlPmdvdG9UYWJsZTwvY29kZT4sCisgICAgICAgICAqIHRodXMgdHJhbnNsYXRpbmcgaXQgZnJvbSBhIExhYmVsIGluIHRoZSBvcmlnaW5hbCBjb2RlLCB0byBhIExhYmVsIGluCisgICAgICAgICAqIHRoZSBpbmxpbmVkIGNvZGUgdGhhdCBpcyBhcHByb3ByaWF0ZSBmb3IgdXNlIGJ5IGFuIGluc3RydWN0aW9uIHRoYXQKKyAgICAgICAgICogYnJhbmNoZWQgdG8gdGhlIG9yaWdpbmFsIGxhYmVsLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbCBUaGUgbGFiZWwgd2Ugd2lsbCBiZSB0cmFuc2xhdGluZworICAgICAgICAgKiBAcmV0dXJuIGEgbGFiZWwgZm9yIHVzZSBieSBhIGJyYW5jaCBpbnN0cnVjdGlvbiBpbiB0aGUgaW5saW5lZCBjb2RlCisgICAgICAgICAqIEBzZWUgI3JhbmdlTGFiZWwKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBMYWJlbE5vZGUgZ290b0xhYmVsKGZpbmFsIExhYmVsTm9kZSBsKSB7CisgICAgICAgICAgICAvLyBvd25lciBzaG91bGQgbmV2ZXIgYmUgbnVsbCwgYmVjYXVzZSBvd25lciBpcyBvbmx5IG51bGwKKyAgICAgICAgICAgIC8vIGlmIGFuIGluc3RydWN0aW9uIGNhbm5vdCBiZSByZWFjaGVkIGZyb20gdGhpcyBzdWJyb3V0aW5lCisgICAgICAgICAgICBJbnN0YW50aWF0aW9uIG93bmVyID0gZmluZE93bmVyKGluc3RydWN0aW9ucy5pbmRleE9mKGwpKTsKKyAgICAgICAgICAgIHJldHVybiBvd25lci5yYW5nZVRhYmxlLmdldChsKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBMb29rcyB1cCB0aGUgbGFiZWwgPGNvZGU+bDwvY29kZT4gaW4gdGhlIDxjb2RlPnJhbmdlVGFibGU8L2NvZGU+LAorICAgICAgICAgKiB0aHVzIHRyYW5zbGF0aW5nIGl0IGZyb20gYSBMYWJlbCBpbiB0aGUgb3JpZ2luYWwgY29kZSwgdG8gYSBMYWJlbCBpbgorICAgICAgICAgKiB0aGUgaW5saW5lZCBjb2RlIHRoYXQgaXMgYXBwcm9wcmlhdGUgZm9yIHVzZSBieSBhbiB0cnkvY2F0Y2ggb3IKKyAgICAgICAgICogdmFyaWFibGUgdXNlIGFubm90YXRpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBsIFRoZSBsYWJlbCB3ZSB3aWxsIGJlIHRyYW5zbGF0aW5nCisgICAgICAgICAqIEByZXR1cm4gYSBsYWJlbCBmb3IgdXNlIGJ5IGEgdHJ5L2NhdGNoIG9yIHZhcmlhYmxlIGFubm90YXRpb24gaW4gdGhlCisgICAgICAgICAqICAgICAgICAgb3JpZ2luYWwgY29kZQorICAgICAgICAgKiBAc2VlICNyYW5nZVRhYmxlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgTGFiZWxOb2RlIHJhbmdlTGFiZWwoZmluYWwgTGFiZWxOb2RlIGwpIHsKKyAgICAgICAgICAgIHJldHVybiByYW5nZVRhYmxlLmdldChsKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEFic3RyYWN0TWFwIGltcGxlbWVudGF0aW9uCisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTZXQ8TWFwLkVudHJ5PExhYmVsTm9kZSwgTGFiZWxOb2RlPj4gZW50cnlTZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTGFiZWxOb2RlIGdldChmaW5hbCBPYmplY3QgbykgeworICAgICAgICAgICAgcmV0dXJuIGdvdG9MYWJlbCgoTGFiZWxOb2RlKSBvKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vY29tbW9ucy9Mb2NhbFZhcmlhYmxlc1NvcnRlci5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS9jb21tb25zL0xvY2FsVmFyaWFibGVzU29ydGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRkNjdhOAotLS0gL2Rldi9udWxsCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vY29tbW9ucy9Mb2NhbFZhcmlhYmxlc1NvcnRlci5qYXZhCkBAIC0wLDAgKzEsMzcxIEBACisvKgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBPcmFjbGUgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKKyAqIHF1ZXN0aW9ucy4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGlzIGF2YWlsYWJsZSB1bmRlciBhbmQgZ292ZXJuZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiBIb3dldmVyLCB0aGUgZm9sbG93aW5nIG5vdGljZSBhY2NvbXBhbmllZCB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGlzCisgKiBmaWxlOgorICoKKyAqIEFTTTogYSB2ZXJ5IHNtYWxsIGFuZCBmYXN0IEphdmEgYnl0ZWNvZGUgbWFuaXB1bGF0aW9uIGZyYW1ld29yaworICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMTEgSU5SSUEsIEZyYW5jZSBUZWxlY29tCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2UgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLmNvbW1vbnM7CisKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uTGFiZWw7CitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLk1ldGhvZFZpc2l0b3I7CitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLk9wY29kZXM7CitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLlR5cGU7CisKKy8qKgorICogQSB7QGxpbmsgTWV0aG9kVmlzaXRvcn0gdGhhdCByZW51bWJlcnMgbG9jYWwgdmFyaWFibGVzIGluIHRoZWlyIG9yZGVyIG9mCisgKiBhcHBlYXJhbmNlLiBUaGlzIGFkYXB0ZXIgYWxsb3dzIG9uZSB0byBlYXNpbHkgYWRkIG5ldyBsb2NhbCB2YXJpYWJsZXMgdG8gYQorICogbWV0aG9kLiBJdCBtYXkgYmUgdXNlZCBieSBpbmhlcml0aW5nIGZyb20gdGhpcyBjbGFzcywgYnV0IHRoZSBwcmVmZXJyZWQgd2F5CisgKiBvZiB1c2luZyBpdCBpcyB2aWEgZGVsZWdhdGlvbjogdGhlIG5leHQgdmlzaXRvciBpbiB0aGUgY2hhaW4gY2FuIGluZGVlZCBhZGQKKyAqIG5ldyBsb2NhbHMgd2hlbiBuZWVkZWQgYnkgY2FsbGluZyB7QGxpbmsgI25ld0xvY2FsfSBvbiB0aGlzIGFkYXB0ZXIgKHRoaXMKKyAqIHJlcXVpcmVzIGEgcmVmZXJlbmNlIGJhY2sgdG8gdGhpcyB7QGxpbmsgTG9jYWxWYXJpYWJsZXNTb3J0ZXJ9KS4KKyAqCisgKiBAYXV0aG9yIENocmlzIE5va2xlYmVyZworICogQGF1dGhvciBFdWdlbmUgS3VsZXNob3YKKyAqIEBhdXRob3IgRXJpYyBCcnVuZXRvbgorICovCitwdWJsaWMgY2xhc3MgTG9jYWxWYXJpYWJsZXNTb3J0ZXIgZXh0ZW5kcyBNZXRob2RWaXNpdG9yIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFR5cGUgT0JKRUNUX1RZUEUgPSBUeXBlLmdldE9iamVjdFR5cGUoImphdmEvbGFuZy9PYmplY3QiKTsKKworICAgIC8qKgorICAgICAqIE1hcHBpbmcgZnJvbSBvbGQgdG8gbmV3IGxvY2FsIHZhcmlhYmxlIGluZGV4ZXMuIEEgbG9jYWwgdmFyaWFibGUgYXQgaW5kZXgKKyAgICAgKiBpIG9mIHNpemUgMSBpcyByZW1hcHBlZCB0byAnbWFwcGluZ1syKmldJywgd2hpbGUgYSBsb2NhbCB2YXJpYWJsZSBhdAorICAgICAqIGluZGV4IGkgb2Ygc2l6ZSAyIGlzIHJlbWFwcGVkIHRvICdtYXBwaW5nWzIqaSsxXScuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnRbXSBtYXBwaW5nID0gbmV3IGludFs0MF07CisKKyAgICAvKioKKyAgICAgKiBBcnJheSB1c2VkIHRvIHN0b3JlIHN0YWNrIG1hcCBsb2NhbCB2YXJpYWJsZSB0eXBlcyBhZnRlciByZW1hcHBpbmcuCisgICAgICovCisgICAgcHJpdmF0ZSBPYmplY3RbXSBuZXdMb2NhbHMgPSBuZXcgT2JqZWN0WzIwXTsKKworICAgIC8qKgorICAgICAqIEluZGV4IG9mIHRoZSBmaXJzdCBsb2NhbCB2YXJpYWJsZSwgYWZ0ZXIgZm9ybWFsIHBhcmFtZXRlcnMuCisgICAgICovCisgICAgcHJvdGVjdGVkIGZpbmFsIGludCBmaXJzdExvY2FsOworCisgICAgLyoqCisgICAgICogSW5kZXggb2YgdGhlIG5leHQgbG9jYWwgdmFyaWFibGUgdG8gYmUgY3JlYXRlZCBieSB7QGxpbmsgI25ld0xvY2FsfS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IG5leHRMb2NhbDsKKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyBpZiBhdCBsZWFzdCBvbmUgbG9jYWwgdmFyaWFibGUgaGFzIG1vdmVkIGR1ZSB0byByZW1hcHBpbmcuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGNoYW5nZWQ7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBMb2NhbFZhcmlhYmxlc1NvcnRlcn0uIDxpPlN1YmNsYXNzZXMgbXVzdCBub3QgdXNlCisgICAgICogdGhpcyBjb25zdHJ1Y3RvcjwvaT4uIEluc3RlYWQsIHRoZXkgbXVzdCB1c2UgdGhlCisgICAgICoge0BsaW5rICNMb2NhbFZhcmlhYmxlc1NvcnRlcihpbnQsIGludCwgU3RyaW5nLCBNZXRob2RWaXNpdG9yKX0gdmVyc2lvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhY2Nlc3MgYWNjZXNzIGZsYWdzIG9mIHRoZSBhZGFwdGVkIG1ldGhvZC4KKyAgICAgKiBAcGFyYW0gZGVzYyB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRvciAoc2VlIHtAbGluayBUeXBlIFR5cGV9KS4KKyAgICAgKiBAcGFyYW0gbXYgdGhlIG1ldGhvZCB2aXNpdG9yIHRvIHdoaWNoIHRoaXMgYWRhcHRlciBkZWxlZ2F0ZXMgY2FsbHMuCisgICAgICovCisgICAgcHVibGljIExvY2FsVmFyaWFibGVzU29ydGVyKAorICAgICAgICBmaW5hbCBpbnQgYWNjZXNzLAorICAgICAgICBmaW5hbCBTdHJpbmcgZGVzYywKKyAgICAgICAgZmluYWwgTWV0aG9kVmlzaXRvciBtdikKKyAgICB7CisgICAgICAgIHRoaXMoT3Bjb2Rlcy5BU000LCBhY2Nlc3MsIGRlc2MsIG12KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBMb2NhbFZhcmlhYmxlc1NvcnRlcn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXBpIHRoZSBBU00gQVBJIHZlcnNpb24gaW1wbGVtZW50ZWQgYnkgdGhpcyB2aXNpdG9yLiBNdXN0IGJlIG9uZQorICAgICAqICAgICAgICBvZiB7QGxpbmsgT3Bjb2RlcyNBU000fS4KKyAgICAgKiBAcGFyYW0gYWNjZXNzIGFjY2VzcyBmbGFncyBvZiB0aGUgYWRhcHRlZCBtZXRob2QuCisgICAgICogQHBhcmFtIGRlc2MgdGhlIG1ldGhvZCdzIGRlc2NyaXB0b3IgKHNlZSB7QGxpbmsgVHlwZSBUeXBlfSkuCisgICAgICogQHBhcmFtIG12IHRoZSBtZXRob2QgdmlzaXRvciB0byB3aGljaCB0aGlzIGFkYXB0ZXIgZGVsZWdhdGVzIGNhbGxzLgorICAgICAqLworICAgIHByb3RlY3RlZCBMb2NhbFZhcmlhYmxlc1NvcnRlcigKKyAgICAgICAgZmluYWwgaW50IGFwaSwKKyAgICAgICAgZmluYWwgaW50IGFjY2VzcywKKyAgICAgICAgZmluYWwgU3RyaW5nIGRlc2MsCisgICAgICAgIGZpbmFsIE1ldGhvZFZpc2l0b3IgbXYpCisgICAgeworICAgICAgICBzdXBlcihhcGksIG12KTsKKyAgICAgICAgVHlwZVtdIGFyZ3MgPSBUeXBlLmdldEFyZ3VtZW50VHlwZXMoZGVzYyk7CisgICAgICAgIG5leHRMb2NhbCA9IChPcGNvZGVzLkFDQ19TVEFUSUMgJiBhY2Nlc3MpID09IDAgPyAxIDogMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBuZXh0TG9jYWwgKz0gYXJnc1tpXS5nZXRTaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgZmlyc3RMb2NhbCA9IG5leHRMb2NhbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFZhckluc24oZmluYWwgaW50IG9wY29kZSwgZmluYWwgaW50IHZhcikgeworICAgICAgICBUeXBlIHR5cGU7CisgICAgICAgIHN3aXRjaCAob3Bjb2RlKSB7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuTExPQUQ6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuTFNUT1JFOgorICAgICAgICAgICAgICAgIHR5cGUgPSBUeXBlLkxPTkdfVFlQRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkRMT0FEOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkRTVE9SRToKKyAgICAgICAgICAgICAgICB0eXBlID0gVHlwZS5ET1VCTEVfVFlQRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkZMT0FEOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkZTVE9SRToKKyAgICAgICAgICAgICAgICB0eXBlID0gVHlwZS5GTE9BVF9UWVBFOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSUxPQUQ6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSVNUT1JFOgorICAgICAgICAgICAgICAgIHR5cGUgPSBUeXBlLklOVF9UWVBFOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLy8gY2FzZSBPcGNvZGVzLkFMT0FEOgorICAgICAgICAgICAgLy8gY2FzZSBPcGNvZGVzLkFTVE9SRToKKyAgICAgICAgICAgIC8vIGNhc2UgUkVUOgorICAgICAgICAgICAgICAgIHR5cGUgPSBPQkpFQ1RfVFlQRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBtdi52aXNpdFZhckluc24ob3Bjb2RlLCByZW1hcCh2YXIsIHR5cGUpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdElpbmNJbnNuKGZpbmFsIGludCB2YXIsIGZpbmFsIGludCBpbmNyZW1lbnQpIHsKKyAgICAgICAgbXYudmlzaXRJaW5jSW5zbihyZW1hcCh2YXIsIFR5cGUuSU5UX1RZUEUpLCBpbmNyZW1lbnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TWF4cyhmaW5hbCBpbnQgbWF4U3RhY2ssIGZpbmFsIGludCBtYXhMb2NhbHMpIHsKKyAgICAgICAgbXYudmlzaXRNYXhzKG1heFN0YWNrLCBuZXh0TG9jYWwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TG9jYWxWYXJpYWJsZSgKKyAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUsCisgICAgICAgIGZpbmFsIFN0cmluZyBkZXNjLAorICAgICAgICBmaW5hbCBTdHJpbmcgc2lnbmF0dXJlLAorICAgICAgICBmaW5hbCBMYWJlbCBzdGFydCwKKyAgICAgICAgZmluYWwgTGFiZWwgZW5kLAorICAgICAgICBmaW5hbCBpbnQgaW5kZXgpCisgICAgeworICAgICAgICBpbnQgbmV3SW5kZXggPSByZW1hcChpbmRleCwgVHlwZS5nZXRUeXBlKGRlc2MpKTsKKyAgICAgICAgbXYudmlzaXRMb2NhbFZhcmlhYmxlKG5hbWUsIGRlc2MsIHNpZ25hdHVyZSwgc3RhcnQsIGVuZCwgbmV3SW5kZXgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0RnJhbWUoCisgICAgICAgIGZpbmFsIGludCB0eXBlLAorICAgICAgICBmaW5hbCBpbnQgbkxvY2FsLAorICAgICAgICBmaW5hbCBPYmplY3RbXSBsb2NhbCwKKyAgICAgICAgZmluYWwgaW50IG5TdGFjaywKKyAgICAgICAgZmluYWwgT2JqZWN0W10gc3RhY2spCisgICAgeworICAgICAgICBpZiAodHlwZSAhPSBPcGNvZGVzLkZfTkVXKSB7IC8vIHVuY29tcHJlc3NlZCBmcmFtZQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ2xhc3NSZWFkZXIuYWNjZXB0KCkgc2hvdWxkIGJlIGNhbGxlZCB3aXRoIEVYUEFORF9GUkFNRVMgZmxhZyIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFjaGFuZ2VkKSB7IC8vIG9wdGltaXphdGlvbiBmb3IgdGhlIGNhc2Ugd2hlcmUgbWFwcGluZyA9IGlkZW50aXR5CisgICAgICAgICAgICBtdi52aXNpdEZyYW1lKHR5cGUsIG5Mb2NhbCwgbG9jYWwsIG5TdGFjaywgc3RhY2spOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gY3JlYXRlcyBhIGNvcHkgb2YgbmV3TG9jYWxzCisgICAgICAgIE9iamVjdFtdIG9sZExvY2FscyA9IG5ldyBPYmplY3RbbmV3TG9jYWxzLmxlbmd0aF07CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobmV3TG9jYWxzLCAwLCBvbGRMb2NhbHMsIDAsIG9sZExvY2Fscy5sZW5ndGgpOworCisgICAgICAgIC8vIGNvcGllcyB0eXBlcyBmcm9tICdsb2NhbCcgdG8gJ25ld0xvY2FscycKKyAgICAgICAgLy8gJ25ld0xvY2FscycgYWxyZWFkeSBjb250YWlucyB0aGUgdmFyaWFibGVzIGFkZGVkIHdpdGggJ25ld0xvY2FsJworCisgICAgICAgIGludCBpbmRleCA9IDA7IC8vIG9sZCBsb2NhbCB2YXJpYWJsZSBpbmRleAorICAgICAgICBpbnQgbnVtYmVyID0gMDsgLy8gb2xkIGxvY2FsIHZhcmlhYmxlIG51bWJlcgorICAgICAgICBmb3IgKDsgbnVtYmVyIDwgbkxvY2FsOyArK251bWJlcikgeworICAgICAgICAgICAgT2JqZWN0IHQgPSBsb2NhbFtudW1iZXJdOworICAgICAgICAgICAgaW50IHNpemUgPSB0ID09IE9wY29kZXMuTE9ORyB8fCB0ID09IE9wY29kZXMuRE9VQkxFID8gMiA6IDE7CisgICAgICAgICAgICBpZiAodCAhPSBPcGNvZGVzLlRPUCkgeworICAgICAgICAgICAgICAgIFR5cGUgdHlwID0gT0JKRUNUX1RZUEU7CisgICAgICAgICAgICAgICAgaWYgKHQgPT0gT3Bjb2Rlcy5JTlRFR0VSKSB7CisgICAgICAgICAgICAgICAgICAgIHR5cCA9IFR5cGUuSU5UX1RZUEU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0ID09IE9wY29kZXMuRkxPQVQpIHsKKyAgICAgICAgICAgICAgICAgICAgdHlwID0gVHlwZS5GTE9BVF9UWVBFOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodCA9PSBPcGNvZGVzLkxPTkcpIHsKKyAgICAgICAgICAgICAgICAgICAgdHlwID0gVHlwZS5MT05HX1RZUEU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0ID09IE9wY29kZXMuRE9VQkxFKSB7CisgICAgICAgICAgICAgICAgICAgIHR5cCA9IFR5cGUuRE9VQkxFX1RZUEU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0IGluc3RhbmNlb2YgU3RyaW5nKSB7CisgICAgICAgICAgICAgICAgICAgIHR5cCA9IFR5cGUuZ2V0T2JqZWN0VHlwZSgoU3RyaW5nKSB0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2V0RnJhbWVMb2NhbChyZW1hcChpbmRleCwgdHlwKSwgdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbmRleCArPSBzaXplOworICAgICAgICB9CisKKyAgICAgICAgLy8gcmVtb3ZlcyBUT1AgYWZ0ZXIgbG9uZyBhbmQgZG91YmxlIHR5cGVzIGFzIHdlbGwgYXMgdHJhaWxpbmcgVE9QcworCisgICAgICAgIGluZGV4ID0gMDsKKyAgICAgICAgbnVtYmVyID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGluZGV4IDwgbmV3TG9jYWxzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBPYmplY3QgdCA9IG5ld0xvY2Fsc1tpbmRleCsrXTsKKyAgICAgICAgICAgIGlmICh0ICE9IG51bGwgJiYgdCAhPSBPcGNvZGVzLlRPUCkgeworICAgICAgICAgICAgICAgIG5ld0xvY2Fsc1tpXSA9IHQ7CisgICAgICAgICAgICAgICAgbnVtYmVyID0gaSArIDE7CisgICAgICAgICAgICAgICAgaWYgKHQgPT0gT3Bjb2Rlcy5MT05HIHx8IHQgPT0gT3Bjb2Rlcy5ET1VCTEUpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG5ld0xvY2Fsc1tpXSA9IE9wY29kZXMuVE9QOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gdmlzaXRzIHJlbWFwcGVkIGZyYW1lCisgICAgICAgIG12LnZpc2l0RnJhbWUodHlwZSwgbnVtYmVyLCBuZXdMb2NhbHMsIG5TdGFjaywgc3RhY2spOworCisgICAgICAgIC8vIHJlc3RvcmVzIG9yaWdpbmFsIHZhbHVlIG9mICduZXdMb2NhbHMnCisgICAgICAgIG5ld0xvY2FscyA9IG9sZExvY2FsczsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGxvY2FsIHZhcmlhYmxlIG9mIHRoZSBnaXZlbiB0eXBlLgorICAgICAqCisgICAgICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgb2YgdGhlIGxvY2FsIHZhcmlhYmxlIHRvIGJlIGNyZWF0ZWQuCisgICAgICogQHJldHVybiB0aGUgaWRlbnRpZmllciBvZiB0aGUgbmV3bHkgY3JlYXRlZCBsb2NhbCB2YXJpYWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IG5ld0xvY2FsKGZpbmFsIFR5cGUgdHlwZSkgeworICAgICAgICBPYmplY3QgdDsKKyAgICAgICAgc3dpdGNoICh0eXBlLmdldFNvcnQoKSkgeworICAgICAgICAgICAgY2FzZSBUeXBlLkJPT0xFQU46CisgICAgICAgICAgICBjYXNlIFR5cGUuQ0hBUjoKKyAgICAgICAgICAgIGNhc2UgVHlwZS5CWVRFOgorICAgICAgICAgICAgY2FzZSBUeXBlLlNIT1JUOgorICAgICAgICAgICAgY2FzZSBUeXBlLklOVDoKKyAgICAgICAgICAgICAgICB0ID0gT3Bjb2Rlcy5JTlRFR0VSOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBUeXBlLkZMT0FUOgorICAgICAgICAgICAgICAgIHQgPSBPcGNvZGVzLkZMT0FUOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBUeXBlLkxPTkc6CisgICAgICAgICAgICAgICAgdCA9IE9wY29kZXMuTE9ORzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVHlwZS5ET1VCTEU6CisgICAgICAgICAgICAgICAgdCA9IE9wY29kZXMuRE9VQkxFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBUeXBlLkFSUkFZOgorICAgICAgICAgICAgICAgIHQgPSB0eXBlLmdldERlc2NyaXB0b3IoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIC8vIGNhc2UgVHlwZS5PQkpFQ1Q6CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHQgPSB0eXBlLmdldEludGVybmFsTmFtZSgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGludCBsb2NhbCA9IG5leHRMb2NhbDsKKyAgICAgICAgbmV4dExvY2FsICs9IHR5cGUuZ2V0U2l6ZSgpOworICAgICAgICBzZXRMb2NhbFR5cGUobG9jYWwsIHR5cGUpOworICAgICAgICBzZXRGcmFtZUxvY2FsKGxvY2FsLCB0KTsKKyAgICAgICAgcmV0dXJuIGxvY2FsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGN1cnJlbnQgdHlwZSBvZiB0aGUgZ2l2ZW4gbG9jYWwgdmFyaWFibGUuIFRoZSBkZWZhdWx0CisgICAgICogaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgZG9lcyBub3RoaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIGxvY2FsIGEgbG9jYWwgdmFyaWFibGUgaWRlbnRpZmllciwgYXMgcmV0dXJuZWQgYnkge0BsaW5rICNuZXdMb2NhbAorICAgICAqICAgICAgICBuZXdMb2NhbCgpfS4KKyAgICAgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBvZiB0aGUgdmFsdWUgYmVpbmcgc3RvcmVkIGluIHRoZSBsb2NhbCB2YXJpYWJsZQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHNldExvY2FsVHlwZShmaW5hbCBpbnQgbG9jYWwsIGZpbmFsIFR5cGUgdHlwZSkgeworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXRGcmFtZUxvY2FsKGZpbmFsIGludCBsb2NhbCwgZmluYWwgT2JqZWN0IHR5cGUpIHsKKyAgICAgICAgaW50IGwgPSBuZXdMb2NhbHMubGVuZ3RoOworICAgICAgICBpZiAobG9jYWwgPj0gbCkgeworICAgICAgICAgICAgT2JqZWN0W10gYSA9IG5ldyBPYmplY3RbTWF0aC5tYXgoMiAqIGwsIGxvY2FsICsgMSldOworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShuZXdMb2NhbHMsIDAsIGEsIDAsIGwpOworICAgICAgICAgICAgbmV3TG9jYWxzID0gYTsKKyAgICAgICAgfQorICAgICAgICBuZXdMb2NhbHNbbG9jYWxdID0gdHlwZTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCByZW1hcChmaW5hbCBpbnQgdmFyLCBmaW5hbCBUeXBlIHR5cGUpIHsKKyAgICAgICAgaWYgKHZhciArIHR5cGUuZ2V0U2l6ZSgpIDw9IGZpcnN0TG9jYWwpIHsKKyAgICAgICAgICAgIHJldHVybiB2YXI7CisgICAgICAgIH0KKyAgICAgICAgaW50IGtleSA9IDIgKiB2YXIgKyB0eXBlLmdldFNpemUoKSAtIDE7CisgICAgICAgIGludCBzaXplID0gbWFwcGluZy5sZW5ndGg7CisgICAgICAgIGlmIChrZXkgPj0gc2l6ZSkgeworICAgICAgICAgICAgaW50W10gbmV3TWFwcGluZyA9IG5ldyBpbnRbTWF0aC5tYXgoMiAqIHNpemUsIGtleSArIDEpXTsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobWFwcGluZywgMCwgbmV3TWFwcGluZywgMCwgc2l6ZSk7CisgICAgICAgICAgICBtYXBwaW5nID0gbmV3TWFwcGluZzsKKyAgICAgICAgfQorICAgICAgICBpbnQgdmFsdWUgPSBtYXBwaW5nW2tleV07CisgICAgICAgIGlmICh2YWx1ZSA9PSAwKSB7CisgICAgICAgICAgICB2YWx1ZSA9IG5ld0xvY2FsTWFwcGluZyh0eXBlKTsKKyAgICAgICAgICAgIHNldExvY2FsVHlwZSh2YWx1ZSwgdHlwZSk7CisgICAgICAgICAgICBtYXBwaW5nW2tleV0gPSB2YWx1ZSArIDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2YWx1ZS0tOworICAgICAgICB9CisgICAgICAgIGlmICh2YWx1ZSAhPSB2YXIpIHsKKyAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgaW50IG5ld0xvY2FsTWFwcGluZyhmaW5hbCBUeXBlIHR5cGUpIHsKKyAgICAgICAgaW50IGxvY2FsID0gbmV4dExvY2FsOworICAgICAgICBuZXh0TG9jYWwgKz0gdHlwZS5nZXRTaXplKCk7CisgICAgICAgIHJldHVybiBsb2NhbDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL2NvbW1vbnMvTWV0aG9kLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL2NvbW1vbnMvTWV0aG9kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEzZjk3YgotLS0gL2Rldi9udWxsCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vY29tbW9ucy9NZXRob2QuamF2YQpAQCAtMCwwICsxLDMwNyBAQAorLyoKKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgT3JhY2xlIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCisgKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CisgKiBxdWVzdGlvbnMuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBpcyBhdmFpbGFibGUgdW5kZXIgYW5kIGdvdmVybmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogSG93ZXZlciwgdGhlIGZvbGxvd2luZyBub3RpY2UgYWNjb21wYW5pZWQgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhpcworICogZmlsZToKKyAqCisgKiBBU006IGEgdmVyeSBzbWFsbCBhbmQgZmFzdCBKYXZhIGJ5dGVjb2RlIG1hbmlwdWxhdGlvbiBmcmFtZXdvcmsKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDExIElOUklBLCBGcmFuY2UgVGVsZWNvbQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5jb21tb25zOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5UeXBlOworCisvKioKKyAqIEEgbmFtZWQgbWV0aG9kIGRlc2NyaXB0b3IuCisgKgorICogQGF1dGhvciBKdW96YXMgQmFsaXVrYQorICogQGF1dGhvciBDaHJpcyBOb2tsZWJlcmcKKyAqIEBhdXRob3IgRXJpYyBCcnVuZXRvbgorICovCitwdWJsaWMgY2xhc3MgTWV0aG9kIHsKKworICAgIC8qKgorICAgICAqIFRoZSBtZXRob2QgbmFtZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOworCisgICAgLyoqCisgICAgICogVGhlIG1ldGhvZCBkZXNjcmlwdG9yLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGRlc2M7CisKKyAgICAvKioKKyAgICAgKiBNYXBzIHByaW1pdGl2ZSBKYXZhIHR5cGUgbmFtZXMgdG8gdGhlaXIgZGVzY3JpcHRvcnMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBERVNDUklQVE9SUzsKKworICAgIHN0YXRpYyB7CisgICAgICAgIERFU0NSSVBUT1JTID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisgICAgICAgIERFU0NSSVBUT1JTLnB1dCgidm9pZCIsICJWIik7CisgICAgICAgIERFU0NSSVBUT1JTLnB1dCgiYnl0ZSIsICJCIik7CisgICAgICAgIERFU0NSSVBUT1JTLnB1dCgiY2hhciIsICJDIik7CisgICAgICAgIERFU0NSSVBUT1JTLnB1dCgiZG91YmxlIiwgIkQiKTsKKyAgICAgICAgREVTQ1JJUFRPUlMucHV0KCJmbG9hdCIsICJGIik7CisgICAgICAgIERFU0NSSVBUT1JTLnB1dCgiaW50IiwgIkkiKTsKKyAgICAgICAgREVTQ1JJUFRPUlMucHV0KCJsb25nIiwgIkoiKTsKKyAgICAgICAgREVTQ1JJUFRPUlMucHV0KCJzaG9ydCIsICJTIik7CisgICAgICAgIERFU0NSSVBUT1JTLnB1dCgiYm9vbGVhbiIsICJaIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgTWV0aG9kfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBtZXRob2QncyBuYW1lLgorICAgICAqIEBwYXJhbSBkZXNjIHRoZSBtZXRob2QncyBkZXNjcmlwdG9yLgorICAgICAqLworICAgIHB1YmxpYyBNZXRob2QoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIFN0cmluZyBkZXNjKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMuZGVzYyA9IGRlc2M7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgTWV0aG9kfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBtZXRob2QncyBuYW1lLgorICAgICAqIEBwYXJhbSByZXR1cm5UeXBlIHRoZSBtZXRob2QncyByZXR1cm4gdHlwZS4KKyAgICAgKiBAcGFyYW0gYXJndW1lbnRUeXBlcyB0aGUgbWV0aG9kJ3MgYXJndW1lbnQgdHlwZXMuCisgICAgICovCisgICAgcHVibGljIE1ldGhvZCgKKyAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUsCisgICAgICAgIGZpbmFsIFR5cGUgcmV0dXJuVHlwZSwKKyAgICAgICAgZmluYWwgVHlwZVtdIGFyZ3VtZW50VHlwZXMpCisgICAgeworICAgICAgICB0aGlzKG5hbWUsIFR5cGUuZ2V0TWV0aG9kRGVzY3JpcHRvcihyZXR1cm5UeXBlLCBhcmd1bWVudFR5cGVzKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgTWV0aG9kfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtIGEgamF2YS5sYW5nLnJlZmxlY3QgbWV0aG9kIGRlc2NyaXB0b3IKKyAgICAgKiBAcmV0dXJuIGEge0BsaW5rIE1ldGhvZH0gY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gSmF2YSBtZXRob2QKKyAgICAgKiAgICAgICAgIGRlY2xhcmF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kIGdldE1ldGhvZChqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgbSkgeworICAgICAgICByZXR1cm4gbmV3IE1ldGhvZChtLmdldE5hbWUoKSwgVHlwZS5nZXRNZXRob2REZXNjcmlwdG9yKG0pKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBNZXRob2R9LgorICAgICAqCisgICAgICogQHBhcmFtIGMgYSBqYXZhLmxhbmcucmVmbGVjdCBjb25zdHJ1Y3RvciBkZXNjcmlwdG9yCisgICAgICogQHJldHVybiBhIHtAbGluayBNZXRob2R9IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIEphdmEgY29uc3RydWN0b3IKKyAgICAgKiAgICAgICAgIGRlY2xhcmF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kIGdldE1ldGhvZChqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3Rvcjw/PiBjKSB7CisgICAgICAgIHJldHVybiBuZXcgTWV0aG9kKCI8aW5pdD4iLCBUeXBlLmdldENvbnN0cnVjdG9yRGVzY3JpcHRvcihjKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHtAbGluayBNZXRob2R9IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIEphdmEgbWV0aG9kCisgICAgICogZGVjbGFyYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWV0aG9kIGEgSmF2YSBtZXRob2QgZGVjbGFyYXRpb24sIHdpdGhvdXQgYXJndW1lbnQgbmFtZXMsIG9mIHRoZQorICAgICAqICAgICAgICBmb3JtICJyZXR1cm5UeXBlIG5hbWUgKGFyZ3VtZW50VHlwZTEsIC4uLiBhcmd1bWVudFR5cGVOKSIsIHdoZXJlCisgICAgICogICAgICAgIHRoZSB0eXBlcyBhcmUgaW4gcGxhaW4gSmF2YSAoZS5nLiAiaW50IiwgImZsb2F0IiwKKyAgICAgKiAgICAgICAgImphdmEudXRpbC5MaXN0IiwgLi4uKS4gQ2xhc3NlcyBvZiB0aGUgamF2YS5sYW5nIHBhY2thZ2UgY2FuIGJlCisgICAgICogICAgICAgIHNwZWNpZmllZCBieSB0aGVpciB1bnF1YWxpZmllZCBuYW1lOyBhbGwgb3RoZXIgY2xhc3NlcyBuYW1lcyBtdXN0CisgICAgICogICAgICAgIGJlIGZ1bGx5IHF1YWxpZmllZC4KKyAgICAgKiBAcmV0dXJuIGEge0BsaW5rIE1ldGhvZH0gY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gSmF2YSBtZXRob2QKKyAgICAgKiAgICAgICAgIGRlY2xhcmF0aW9uLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIDxjb2RlPm1ldGhvZDwvY29kZT4gY291bGQgbm90IGdldAorICAgICAqICAgICAgICAgcGFyc2VkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kIGdldE1ldGhvZChmaW5hbCBTdHJpbmcgbWV0aG9kKQorICAgICAgICAgICAgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIGdldE1ldGhvZChtZXRob2QsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEge0BsaW5rIE1ldGhvZH0gY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gSmF2YSBtZXRob2QKKyAgICAgKiBkZWNsYXJhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXRob2QgYSBKYXZhIG1ldGhvZCBkZWNsYXJhdGlvbiwgd2l0aG91dCBhcmd1bWVudCBuYW1lcywgb2YgdGhlCisgICAgICogICAgICAgIGZvcm0gInJldHVyblR5cGUgbmFtZSAoYXJndW1lbnRUeXBlMSwgLi4uIGFyZ3VtZW50VHlwZU4pIiwgd2hlcmUKKyAgICAgKiAgICAgICAgdGhlIHR5cGVzIGFyZSBpbiBwbGFpbiBKYXZhIChlLmcuICJpbnQiLCAiZmxvYXQiLAorICAgICAqICAgICAgICAiamF2YS51dGlsLkxpc3QiLCAuLi4pLiBDbGFzc2VzIG9mIHRoZSBqYXZhLmxhbmcgcGFja2FnZSBtYXkgYmUKKyAgICAgKiAgICAgICAgc3BlY2lmaWVkIGJ5IHRoZWlyIHVucXVhbGlmaWVkIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUKKyAgICAgKiAgICAgICAgZGVmYXVsdFBhY2thZ2UgYXJndW1lbnQ7IGFsbCBvdGhlciBjbGFzc2VzIG5hbWVzIG11c3QgYmUgZnVsbHkKKyAgICAgKiAgICAgICAgcXVhbGlmaWVkLgorICAgICAqIEBwYXJhbSBkZWZhdWx0UGFja2FnZSB0cnVlIGlmIHVucXVhbGlmaWVkIGNsYXNzIG5hbWVzIGJlbG9uZyB0byB0aGUKKyAgICAgKiAgICAgICAgZGVmYXVsdCBwYWNrYWdlLCBvciBmYWxzZSBpZiB0aGV5IGNvcnJlc3BvbmQgdG8gamF2YS5sYW5nIGNsYXNzZXMuCisgICAgICogICAgICAgIEZvciBpbnN0YW5jZSAiT2JqZWN0IiBtZWFucyAiT2JqZWN0IiBpZiB0aGlzIG9wdGlvbiBpcyB0cnVlLCBvcgorICAgICAqICAgICAgICAiamF2YS5sYW5nLk9iamVjdCIgb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4gYSB7QGxpbmsgTWV0aG9kfSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBKYXZhIG1ldGhvZAorICAgICAqICAgICAgICAgZGVjbGFyYXRpb24uCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgPGNvZGU+bWV0aG9kPC9jb2RlPiBjb3VsZCBub3QgZ2V0CisgICAgICogICAgICAgICBwYXJzZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBNZXRob2QgZ2V0TWV0aG9kKAorICAgICAgICBmaW5hbCBTdHJpbmcgbWV0aG9kLAorICAgICAgICBmaW5hbCBib29sZWFuIGRlZmF1bHRQYWNrYWdlKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgeworICAgICAgICBpbnQgc3BhY2UgPSBtZXRob2QuaW5kZXhPZignICcpOworICAgICAgICBpbnQgc3RhcnQgPSBtZXRob2QuaW5kZXhPZignKCcsIHNwYWNlKSArIDE7CisgICAgICAgIGludCBlbmQgPSBtZXRob2QuaW5kZXhPZignKScsIHN0YXJ0KTsKKyAgICAgICAgaWYgKHNwYWNlID09IC0xIHx8IHN0YXJ0ID09IC0xIHx8IGVuZCA9PSAtMSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIFN0cmluZyByZXR1cm5UeXBlID0gbWV0aG9kLnN1YnN0cmluZygwLCBzcGFjZSk7CisgICAgICAgIFN0cmluZyBtZXRob2ROYW1lID0gbWV0aG9kLnN1YnN0cmluZyhzcGFjZSArIDEsIHN0YXJ0IC0gMSkudHJpbSgpOworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIHNiLmFwcGVuZCgnKCcpOworICAgICAgICBpbnQgcDsKKyAgICAgICAgZG8geworICAgICAgICAgICAgU3RyaW5nIHM7CisgICAgICAgICAgICBwID0gbWV0aG9kLmluZGV4T2YoJywnLCBzdGFydCk7CisgICAgICAgICAgICBpZiAocCA9PSAtMSkgeworICAgICAgICAgICAgICAgIHMgPSBtYXAobWV0aG9kLnN1YnN0cmluZyhzdGFydCwgZW5kKS50cmltKCksIGRlZmF1bHRQYWNrYWdlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcyA9IG1hcChtZXRob2Quc3Vic3RyaW5nKHN0YXJ0LCBwKS50cmltKCksIGRlZmF1bHRQYWNrYWdlKTsKKyAgICAgICAgICAgICAgICBzdGFydCA9IHAgKyAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2IuYXBwZW5kKHMpOworICAgICAgICB9IHdoaWxlIChwICE9IC0xKTsKKyAgICAgICAgc2IuYXBwZW5kKCcpJyk7CisgICAgICAgIHNiLmFwcGVuZChtYXAocmV0dXJuVHlwZSwgZGVmYXVsdFBhY2thZ2UpKTsKKyAgICAgICAgcmV0dXJuIG5ldyBNZXRob2QobWV0aG9kTmFtZSwgc2IudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG1hcChmaW5hbCBTdHJpbmcgdHlwZSwgZmluYWwgYm9vbGVhbiBkZWZhdWx0UGFja2FnZSkgeworICAgICAgICBpZiAoIiIuZXF1YWxzKHR5cGUpKSB7CisgICAgICAgICAgICByZXR1cm4gdHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgaW50IGluZGV4ID0gMDsKKyAgICAgICAgd2hpbGUgKChpbmRleCA9IHR5cGUuaW5kZXhPZigiW10iLCBpbmRleCkgKyAxKSA+IDApIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgnWycpOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHQgPSB0eXBlLnN1YnN0cmluZygwLCB0eXBlLmxlbmd0aCgpIC0gc2IubGVuZ3RoKCkgKiAyKTsKKyAgICAgICAgU3RyaW5nIGRlc2MgPSBERVNDUklQVE9SUy5nZXQodCk7CisgICAgICAgIGlmIChkZXNjICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZChkZXNjKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgnTCcpOworICAgICAgICAgICAgaWYgKHQuaW5kZXhPZignLicpIDwgMCkgeworICAgICAgICAgICAgICAgIGlmICghZGVmYXVsdFBhY2thZ2UpIHsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJqYXZhL2xhbmcvIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNiLmFwcGVuZCh0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHQucmVwbGFjZSgnLicsICcvJykpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2IuYXBwZW5kKCc7Jyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kIGRlc2NyaWJlZCBieSB0aGlzIG9iamVjdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIG1ldGhvZCBkZXNjcmliZWQgYnkgdGhpcyBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBkZXNjcmlwdG9yIG9mIHRoZSBtZXRob2QgZGVzY3JpYmVkIGJ5IHRoaXMgb2JqZWN0LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgZGVzY3JpcHRvciBvZiB0aGUgbWV0aG9kIGRlc2NyaWJlZCBieSB0aGlzIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0b3IoKSB7CisgICAgICAgIHJldHVybiBkZXNjOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHJldHVybiB0eXBlIG9mIHRoZSBtZXRob2QgZGVzY3JpYmVkIGJ5IHRoaXMgb2JqZWN0LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgcmV0dXJuIHR5cGUgb2YgdGhlIG1ldGhvZCBkZXNjcmliZWQgYnkgdGhpcyBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIFR5cGUgZ2V0UmV0dXJuVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIFR5cGUuZ2V0UmV0dXJuVHlwZShkZXNjKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBhcmd1bWVudCB0eXBlcyBvZiB0aGUgbWV0aG9kIGRlc2NyaWJlZCBieSB0aGlzIG9iamVjdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGFyZ3VtZW50IHR5cGVzIG9mIHRoZSBtZXRob2QgZGVzY3JpYmVkIGJ5IHRoaXMgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBUeXBlW10gZ2V0QXJndW1lbnRUeXBlcygpIHsKKyAgICAgICAgcmV0dXJuIFR5cGUuZ2V0QXJndW1lbnRUeXBlcyhkZXNjKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gbmFtZSArIGRlc2M7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIE9iamVjdCBvKSB7CisgICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBNZXRob2QpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgTWV0aG9kIG90aGVyID0gKE1ldGhvZCkgbzsKKyAgICAgICAgcmV0dXJuIG5hbWUuZXF1YWxzKG90aGVyLm5hbWUpICYmIGRlc2MuZXF1YWxzKG90aGVyLmRlc2MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIHJldHVybiBuYW1lLmhhc2hDb2RlKCkgXiBkZXNjLmhhc2hDb2RlKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS9jb21tb25zL1JlbWFwcGVyLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL2NvbW1vbnMvUmVtYXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDM1NTExCi0tLSAvZGV2L251bGwKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS9jb21tb25zL1JlbWFwcGVyLmphdmEKQEAgLTAsMCArMSwyNTAgQEAKKy8qCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IE9yYWNsZSBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQorICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQorICogcXVlc3Rpb25zLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgaXMgYXZhaWxhYmxlIHVuZGVyIGFuZCBnb3Zlcm5lZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIEhvd2V2ZXIsIHRoZSBmb2xsb3dpbmcgbm90aWNlIGFjY29tcGFuaWVkIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoaXMKKyAqIGZpbGU6CisgKgorICogQVNNOiBhIHZlcnkgc21hbGwgYW5kIGZhc3QgSmF2YSBieXRlY29kZSBtYW5pcHVsYXRpb24gZnJhbWV3b3JrCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAxMSBJTlJJQSwgRnJhbmNlIFRlbGVjb20KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCitwYWNrYWdlIGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5jb21tb25zOworCitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLkhhbmRsZTsKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uVHlwZTsKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uc2lnbmF0dXJlLlNpZ25hdHVyZVJlYWRlcjsKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uc2lnbmF0dXJlLlNpZ25hdHVyZVZpc2l0b3I7CitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLnNpZ25hdHVyZS5TaWduYXR1cmVXcml0ZXI7CisKKy8qKgorICogQSBjbGFzcyByZXNwb25zaWJsZSBmb3IgcmVtYXBwaW5nIHR5cGVzIGFuZCBuYW1lcy4KKyAqIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKKyAqCisgKiA8dWw+CisgKiA8bGk+e0BsaW5rICNtYXAoU3RyaW5nKX0gLSBtYXAgdHlwZTwvbGk+CisgKiA8bGk+e0BsaW5rICNtYXBGaWVsZE5hbWUoU3RyaW5nLCBTdHJpbmcsIFN0cmluZyl9IC0gbWFwIGZpZWxkIG5hbWU8L2xpPgorICogPGxpPntAbGluayAjbWFwTWV0aG9kTmFtZShTdHJpbmcsIFN0cmluZywgU3RyaW5nKX0gLSBtYXAgbWV0aG9kIG5hbWU8L2xpPgorICogPC91bD4KKyAqCisgKiBAYXV0aG9yIEV1Z2VuZSBLdWxlc2hvdgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmVtYXBwZXIgeworCisgICAgcHVibGljIFN0cmluZyBtYXBEZXNjKFN0cmluZyBkZXNjKSB7CisgICAgICAgIFR5cGUgdCA9IFR5cGUuZ2V0VHlwZShkZXNjKTsKKyAgICAgICAgc3dpdGNoICh0LmdldFNvcnQoKSkgeworICAgICAgICAgICAgY2FzZSBUeXBlLkFSUkFZOgorICAgICAgICAgICAgICAgIFN0cmluZyBzID0gbWFwRGVzYyh0LmdldEVsZW1lbnRUeXBlKCkuZ2V0RGVzY3JpcHRvcigpKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHQuZ2V0RGltZW5zaW9ucygpOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgcyA9ICdbJyArIHM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBzOworICAgICAgICAgICAgY2FzZSBUeXBlLk9CSkVDVDoKKyAgICAgICAgICAgICAgICBTdHJpbmcgbmV3VHlwZSA9IG1hcCh0LmdldEludGVybmFsTmFtZSgpKTsKKyAgICAgICAgICAgICAgICBpZiAobmV3VHlwZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAnTCcgKyBuZXdUeXBlICsgJzsnOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZGVzYzsKKyAgICB9CisKKyAgICBwcml2YXRlIFR5cGUgbWFwVHlwZShUeXBlIHQpIHsKKyAgICAgICAgc3dpdGNoICh0LmdldFNvcnQoKSkgeworICAgICAgICAgICAgY2FzZSBUeXBlLkFSUkFZOgorICAgICAgICAgICAgICAgIFN0cmluZyBzID0gbWFwRGVzYyh0LmdldEVsZW1lbnRUeXBlKCkuZ2V0RGVzY3JpcHRvcigpKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHQuZ2V0RGltZW5zaW9ucygpOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgcyA9ICdbJyArIHM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBUeXBlLmdldFR5cGUocyk7CisgICAgICAgICAgICBjYXNlIFR5cGUuT0JKRUNUOgorICAgICAgICAgICAgICAgIHMgPSBtYXAodC5nZXRJbnRlcm5hbE5hbWUoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHMgIT0gbnVsbCA/IFR5cGUuZ2V0T2JqZWN0VHlwZShzKSA6IHQ7CisgICAgICAgICAgICBjYXNlIFR5cGUuTUVUSE9EOgorICAgICAgICAgICAgICAgIHJldHVybiBUeXBlLmdldE1ldGhvZFR5cGUobWFwTWV0aG9kRGVzYyh0LmdldERlc2NyaXB0b3IoKSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0OworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgbWFwVHlwZShTdHJpbmcgdHlwZSkgeworICAgICAgICBpZiAodHlwZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbWFwVHlwZShUeXBlLmdldE9iamVjdFR5cGUodHlwZSkpLmdldEludGVybmFsTmFtZSgpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmdbXSBtYXBUeXBlcyhTdHJpbmdbXSB0eXBlcykgeworICAgICAgICBTdHJpbmdbXSBuZXdUeXBlcyA9IG51bGw7CisgICAgICAgIGJvb2xlYW4gbmVlZE1hcHBpbmcgPSBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgU3RyaW5nIHR5cGUgPSB0eXBlc1tpXTsKKyAgICAgICAgICAgIFN0cmluZyBuZXdUeXBlID0gbWFwKHR5cGUpOworICAgICAgICAgICAgaWYgKG5ld1R5cGUgIT0gbnVsbCAmJiBuZXdUeXBlcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbmV3VHlwZXMgPSBuZXcgU3RyaW5nW3R5cGVzLmxlbmd0aF07CisgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkodHlwZXMsIDAsIG5ld1R5cGVzLCAwLCBpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbmVlZE1hcHBpbmcgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG5lZWRNYXBwaW5nKSB7CisgICAgICAgICAgICAgICAgbmV3VHlwZXNbaV0gPSBuZXdUeXBlID09IG51bGwKKyAgICAgICAgICAgICAgICAgICAgPyB0eXBlCisgICAgICAgICAgICAgICAgICAgIDogbmV3VHlwZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmVlZE1hcHBpbmcKKyAgICAgICAgICAgPyBuZXdUeXBlcworICAgICAgICAgICA6IHR5cGVzOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgbWFwTWV0aG9kRGVzYyhTdHJpbmcgZGVzYykgeworICAgICAgICBpZigiKClWIi5lcXVhbHMoZGVzYykpIHsKKyAgICAgICAgICAgIHJldHVybiBkZXNjOworICAgICAgICB9CisKKyAgICAgICAgVHlwZVtdIGFyZ3MgPSBUeXBlLmdldEFyZ3VtZW50VHlwZXMoZGVzYyk7CisgICAgICAgIFN0cmluZ0J1ZmZlciBzID0gbmV3IFN0cmluZ0J1ZmZlcigiKCIpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHMuYXBwZW5kKG1hcERlc2MoYXJnc1tpXS5nZXREZXNjcmlwdG9yKCkpKTsKKyAgICAgICAgfQorICAgICAgICBUeXBlIHJldHVyblR5cGUgPSBUeXBlLmdldFJldHVyblR5cGUoZGVzYyk7CisgICAgICAgIGlmKHJldHVyblR5cGUgPT0gVHlwZS5WT0lEX1RZUEUpIHsKKyAgICAgICAgICAgIHMuYXBwZW5kKCIpViIpOworICAgICAgICAgICAgcmV0dXJuIHMudG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgICAgICBzLmFwcGVuZCgnKScpLmFwcGVuZChtYXBEZXNjKHJldHVyblR5cGUuZ2V0RGVzY3JpcHRvcigpKSk7CisgICAgICAgIHJldHVybiBzLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBtYXBWYWx1ZShPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIG1hcFR5cGUoKFR5cGUpIHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBIYW5kbGUpIHsKKyAgICAgICAgICAgIEhhbmRsZSBoID0gKEhhbmRsZSkgdmFsdWU7CisgICAgICAgICAgICByZXR1cm4gbmV3IEhhbmRsZShoLmdldFRhZygpLAorICAgICAgICAgICAgICAgICAgICBtYXBUeXBlKGguZ2V0T3duZXIoKSksCisgICAgICAgICAgICAgICAgICAgIG1hcE1ldGhvZE5hbWUoaC5nZXRPd25lcigpLCBoLmdldE5hbWUoKSwgaC5nZXREZXNjKCkpLAorICAgICAgICAgICAgICAgICAgICBtYXBNZXRob2REZXNjKGguZ2V0RGVzYygpKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqCisgICAgICogQHBhcmFtIHR5cGVTaWduYXR1cmUgdHJ1ZSBpZiBzaWduYXR1cmUgaXMgYSBGaWVsZFR5cGVTaWduYXR1cmUsIHN1Y2ggYXMKKyAgICAgKiAgICAgICAgdGhlIHNpZ25hdHVyZSBwYXJhbWV0ZXIgb2YgdGhlIENsYXNzVmlzaXRvci52aXNpdEZpZWxkIG9yCisgICAgICogICAgICAgIE1ldGhvZFZpc2l0b3IudmlzaXRMb2NhbFZhcmlhYmxlIG1ldGhvZHMKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIG1hcFNpZ25hdHVyZShTdHJpbmcgc2lnbmF0dXJlLCBib29sZWFuIHR5cGVTaWduYXR1cmUpIHsKKyAgICAgICAgaWYgKHNpZ25hdHVyZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBTaWduYXR1cmVSZWFkZXIgciA9IG5ldyBTaWduYXR1cmVSZWFkZXIoc2lnbmF0dXJlKTsKKyAgICAgICAgU2lnbmF0dXJlV3JpdGVyIHcgPSBuZXcgU2lnbmF0dXJlV3JpdGVyKCk7CisgICAgICAgIFNpZ25hdHVyZVZpc2l0b3IgYSA9IGNyZWF0ZVJlbWFwcGluZ1NpZ25hdHVyZUFkYXB0ZXIodyk7CisgICAgICAgIGlmICh0eXBlU2lnbmF0dXJlKSB7CisgICAgICAgICAgICByLmFjY2VwdFR5cGUoYSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByLmFjY2VwdChhKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdy50b1N0cmluZygpOworICAgIH0KKworICAgIHByb3RlY3RlZCBTaWduYXR1cmVWaXNpdG9yIGNyZWF0ZVJlbWFwcGluZ1NpZ25hdHVyZUFkYXB0ZXIoCisgICAgICAgIFNpZ25hdHVyZVZpc2l0b3IgdikKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgUmVtYXBwaW5nU2lnbmF0dXJlQWRhcHRlcih2LCB0aGlzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYXAgbWV0aG9kIG5hbWUgdG8gdGhlIG5ldyBuYW1lLiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvd25lciBvd25lciBvZiB0aGUgbWV0aG9kLgorICAgICAqIEBwYXJhbSBuYW1lIG5hbWUgb2YgdGhlIG1ldGhvZC4KKyAgICAgKiBAcGFyYW0gZGVzYyBkZXNjcmlwdG9yIG9mIHRoZSBtZXRob2QuCisgICAgICogQHJldHVybiBuZXcgbmFtZSBvZiB0aGUgbWV0aG9kCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBtYXBNZXRob2ROYW1lKFN0cmluZyBvd25lciwgU3RyaW5nIG5hbWUsIFN0cmluZyBkZXNjKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1hcCBpbnZva2VkeW5hbWljIG1ldGhvZCBuYW1lIHRvIHRoZSBuZXcgbmFtZS4gU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBuYW1lIG9mIHRoZSBpbnZva2VkeW5hbWljLgorICAgICAqIEBwYXJhbSBkZXNjIGRlc2NyaXB0b3Igb2YgdGhlIGludm9rZWR5bmFtaWMuCisgICAgICogQHJldHVybiBuZXcgaW52b2tkeW5hbWljIG5hbWUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBtYXBJbnZva2VEeW5hbWljTWV0aG9kTmFtZShTdHJpbmcgbmFtZSwgU3RyaW5nIGRlc2MpIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFwIGZpZWxkIG5hbWUgdG8gdGhlIG5ldyBuYW1lLiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvd25lciBvd25lciBvZiB0aGUgZmllbGQuCisgICAgICogQHBhcmFtIG5hbWUgbmFtZSBvZiB0aGUgZmllbGQKKyAgICAgKiBAcGFyYW0gZGVzYyBkZXNjcmlwdG9yIG9mIHRoZSBmaWVsZAorICAgICAqIEByZXR1cm4gbmV3IG5hbWUgb2YgdGhlIGZpZWxkLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgbWFwRmllbGROYW1lKFN0cmluZyBvd25lciwgU3RyaW5nIG5hbWUsIFN0cmluZyBkZXNjKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1hcCB0eXBlIG5hbWUgdG8gdGhlIG5ldyBuYW1lLiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZS4KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgbWFwKFN0cmluZyB0eXBlTmFtZSkgeworICAgICAgICByZXR1cm4gdHlwZU5hbWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS9jb21tb25zL1JlbWFwcGluZ0Fubm90YXRpb25BZGFwdGVyLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL2NvbW1vbnMvUmVtYXBwaW5nQW5ub3RhdGlvbkFkYXB0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmU1MTBkCi0tLSAvZGV2L251bGwKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS9jb21tb25zL1JlbWFwcGluZ0Fubm90YXRpb25BZGFwdGVyLmphdmEKQEAgLTAsMCArMSwxMTUgQEAKKy8qCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IE9yYWNsZSBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQorICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQorICogcXVlc3Rpb25zLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgaXMgYXZhaWxhYmxlIHVuZGVyIGFuZCBnb3Zlcm5lZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIEhvd2V2ZXIsIHRoZSBmb2xsb3dpbmcgbm90aWNlIGFjY29tcGFuaWVkIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoaXMKKyAqIGZpbGU6CisgKgorICogQVNNOiBhIHZlcnkgc21hbGwgYW5kIGZhc3QgSmF2YSBieXRlY29kZSBtYW5pcHVsYXRpb24gZnJhbWV3b3JrCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAxMSBJTlJJQSwgRnJhbmNlIFRlbGVjb20KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCitwYWNrYWdlIGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5jb21tb25zOworCitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLkFubm90YXRpb25WaXNpdG9yOworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5PcGNvZGVzOworCisvKioKKyAqIEFuIHtAbGluayBBbm5vdGF0aW9uVmlzaXRvcn0gYWRhcHRlciBmb3IgdHlwZSByZW1hcHBpbmcuCisgKgorICogQGF1dGhvciBFdWdlbmUgS3VsZXNob3YKKyAqLworcHVibGljIGNsYXNzIFJlbWFwcGluZ0Fubm90YXRpb25BZGFwdGVyIGV4dGVuZHMgQW5ub3RhdGlvblZpc2l0b3IgeworCisgICAgcHJvdGVjdGVkIGZpbmFsIFJlbWFwcGVyIHJlbWFwcGVyOworCisgICAgcHVibGljIFJlbWFwcGluZ0Fubm90YXRpb25BZGFwdGVyKAorICAgICAgICBmaW5hbCBBbm5vdGF0aW9uVmlzaXRvciBhdiwKKyAgICAgICAgZmluYWwgUmVtYXBwZXIgcmVtYXBwZXIpCisgICAgeworICAgICAgICB0aGlzKE9wY29kZXMuQVNNNCwgYXYsIHJlbWFwcGVyKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgUmVtYXBwaW5nQW5ub3RhdGlvbkFkYXB0ZXIoCisgICAgICAgIGZpbmFsIGludCBhcGksCisgICAgICAgIGZpbmFsIEFubm90YXRpb25WaXNpdG9yIGF2LAorICAgICAgICBmaW5hbCBSZW1hcHBlciByZW1hcHBlcikKKyAgICB7CisgICAgICAgIHN1cGVyKGFwaSwgYXYpOworICAgICAgICB0aGlzLnJlbWFwcGVyID0gcmVtYXBwZXI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICBhdi52aXNpdChuYW1lLCByZW1hcHBlci5tYXBWYWx1ZSh2YWx1ZSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0RW51bShTdHJpbmcgbmFtZSwgU3RyaW5nIGRlc2MsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICBhdi52aXNpdEVudW0obmFtZSwgcmVtYXBwZXIubWFwRGVzYyhkZXNjKSwgdmFsdWUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBBbm5vdGF0aW9uVmlzaXRvciB2aXNpdEFubm90YXRpb24oU3RyaW5nIG5hbWUsIFN0cmluZyBkZXNjKSB7CisgICAgICAgIEFubm90YXRpb25WaXNpdG9yIHYgPSBhdi52aXNpdEFubm90YXRpb24obmFtZSwgcmVtYXBwZXIubWFwRGVzYyhkZXNjKSk7CisgICAgICAgIHJldHVybiB2ID09IG51bGwgPyBudWxsIDogKHYgPT0gYXYKKyAgICAgICAgICAgICAgICA/IHRoaXMKKyAgICAgICAgICAgICAgICA6IG5ldyBSZW1hcHBpbmdBbm5vdGF0aW9uQWRhcHRlcih2LCByZW1hcHBlcikpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBBbm5vdGF0aW9uVmlzaXRvciB2aXNpdEFycmF5KFN0cmluZyBuYW1lKSB7CisgICAgICAgIEFubm90YXRpb25WaXNpdG9yIHYgPSBhdi52aXNpdEFycmF5KG5hbWUpOworICAgICAgICByZXR1cm4gdiA9PSBudWxsID8gbnVsbCA6ICh2ID09IGF2CisgICAgICAgICAgICAgICAgPyB0aGlzCisgICAgICAgICAgICAgICAgOiBuZXcgUmVtYXBwaW5nQW5ub3RhdGlvbkFkYXB0ZXIodiwgcmVtYXBwZXIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL2NvbW1vbnMvUmVtYXBwaW5nQ2xhc3NBZGFwdGVyLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL2NvbW1vbnMvUmVtYXBwaW5nQ2xhc3NBZGFwdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRmZTkzOQotLS0gL2Rldi9udWxsCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vY29tbW9ucy9SZW1hcHBpbmdDbGFzc0FkYXB0ZXIuamF2YQpAQCAtMCwwICsxLDE4OSBAQAorLyoKKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgT3JhY2xlIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCisgKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CisgKiBxdWVzdGlvbnMuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBpcyBhdmFpbGFibGUgdW5kZXIgYW5kIGdvdmVybmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogSG93ZXZlciwgdGhlIGZvbGxvd2luZyBub3RpY2UgYWNjb21wYW5pZWQgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhpcworICogZmlsZToKKyAqCisgKiBBU006IGEgdmVyeSBzbWFsbCBhbmQgZmFzdCBKYXZhIGJ5dGVjb2RlIG1hbmlwdWxhdGlvbiBmcmFtZXdvcmsKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDExIElOUklBLCBGcmFuY2UgVGVsZWNvbQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK3BhY2thZ2UgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLmNvbW1vbnM7CisKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uQW5ub3RhdGlvblZpc2l0b3I7CitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLkNsYXNzVmlzaXRvcjsKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uRmllbGRWaXNpdG9yOworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5NZXRob2RWaXNpdG9yOworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5PcGNvZGVzOworCisvKioKKyAqIEEge0BsaW5rIENsYXNzVmlzaXRvcn0gZm9yIHR5cGUgcmVtYXBwaW5nLgorICoKKyAqIEBhdXRob3IgRXVnZW5lIEt1bGVzaG92CisgKi8KK3B1YmxpYyBjbGFzcyBSZW1hcHBpbmdDbGFzc0FkYXB0ZXIgZXh0ZW5kcyBDbGFzc1Zpc2l0b3IgeworCisgICAgcHJvdGVjdGVkIGZpbmFsIFJlbWFwcGVyIHJlbWFwcGVyOworCisgICAgcHJvdGVjdGVkIFN0cmluZyBjbGFzc05hbWU7CisKKyAgICBwdWJsaWMgUmVtYXBwaW5nQ2xhc3NBZGFwdGVyKGZpbmFsIENsYXNzVmlzaXRvciBjdiwgZmluYWwgUmVtYXBwZXIgcmVtYXBwZXIpCisgICAgeworICAgICAgICB0aGlzKE9wY29kZXMuQVNNNCwgY3YsIHJlbWFwcGVyKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgUmVtYXBwaW5nQ2xhc3NBZGFwdGVyKAorICAgICAgICBmaW5hbCBpbnQgYXBpLAorICAgICAgICBmaW5hbCBDbGFzc1Zpc2l0b3IgY3YsCisgICAgICAgIGZpbmFsIFJlbWFwcGVyIHJlbWFwcGVyKQorICAgIHsKKyAgICAgICAgc3VwZXIoYXBpLCBjdik7CisgICAgICAgIHRoaXMucmVtYXBwZXIgPSByZW1hcHBlcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdCgKKyAgICAgICAgaW50IHZlcnNpb24sCisgICAgICAgIGludCBhY2Nlc3MsCisgICAgICAgIFN0cmluZyBuYW1lLAorICAgICAgICBTdHJpbmcgc2lnbmF0dXJlLAorICAgICAgICBTdHJpbmcgc3VwZXJOYW1lLAorICAgICAgICBTdHJpbmdbXSBpbnRlcmZhY2VzKQorICAgIHsKKyAgICAgICAgdGhpcy5jbGFzc05hbWUgPSBuYW1lOworICAgICAgICBzdXBlci52aXNpdCh2ZXJzaW9uLAorICAgICAgICAgICAgICAgIGFjY2VzcywKKyAgICAgICAgICAgICAgICByZW1hcHBlci5tYXBUeXBlKG5hbWUpLAorICAgICAgICAgICAgICAgIHJlbWFwcGVyLm1hcFNpZ25hdHVyZShzaWduYXR1cmUsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICByZW1hcHBlci5tYXBUeXBlKHN1cGVyTmFtZSksCisgICAgICAgICAgICAgICAgaW50ZXJmYWNlcyA9PSBudWxsID8gbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgOiByZW1hcHBlci5tYXBUeXBlcyhpbnRlcmZhY2VzKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEFubm90YXRpb25WaXNpdG9yIHZpc2l0QW5ub3RhdGlvbihTdHJpbmcgZGVzYywgYm9vbGVhbiB2aXNpYmxlKSB7CisgICAgICAgIEFubm90YXRpb25WaXNpdG9yIGF2OworICAgICAgICBhdiA9IHN1cGVyLnZpc2l0QW5ub3RhdGlvbihyZW1hcHBlci5tYXBEZXNjKGRlc2MpLCB2aXNpYmxlKTsKKyAgICAgICAgcmV0dXJuIGF2ID09IG51bGwgPyBudWxsIDogY3JlYXRlUmVtYXBwaW5nQW5ub3RhdGlvbkFkYXB0ZXIoYXYpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBGaWVsZFZpc2l0b3IgdmlzaXRGaWVsZCgKKyAgICAgICAgaW50IGFjY2VzcywKKyAgICAgICAgU3RyaW5nIG5hbWUsCisgICAgICAgIFN0cmluZyBkZXNjLAorICAgICAgICBTdHJpbmcgc2lnbmF0dXJlLAorICAgICAgICBPYmplY3QgdmFsdWUpCisgICAgeworICAgICAgICBGaWVsZFZpc2l0b3IgZnYgPSBzdXBlci52aXNpdEZpZWxkKGFjY2VzcywKKyAgICAgICAgICAgICAgICByZW1hcHBlci5tYXBGaWVsZE5hbWUoY2xhc3NOYW1lLCBuYW1lLCBkZXNjKSwKKyAgICAgICAgICAgICAgICByZW1hcHBlci5tYXBEZXNjKGRlc2MpLAorICAgICAgICAgICAgICAgIHJlbWFwcGVyLm1hcFNpZ25hdHVyZShzaWduYXR1cmUsIHRydWUpLAorICAgICAgICAgICAgICAgIHJlbWFwcGVyLm1hcFZhbHVlKHZhbHVlKSk7CisgICAgICAgIHJldHVybiBmdiA9PSBudWxsID8gbnVsbCA6IGNyZWF0ZVJlbWFwcGluZ0ZpZWxkQWRhcHRlcihmdik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE1ldGhvZFZpc2l0b3IgdmlzaXRNZXRob2QoCisgICAgICAgIGludCBhY2Nlc3MsCisgICAgICAgIFN0cmluZyBuYW1lLAorICAgICAgICBTdHJpbmcgZGVzYywKKyAgICAgICAgU3RyaW5nIHNpZ25hdHVyZSwKKyAgICAgICAgU3RyaW5nW10gZXhjZXB0aW9ucykKKyAgICB7CisgICAgICAgIFN0cmluZyBuZXdEZXNjID0gcmVtYXBwZXIubWFwTWV0aG9kRGVzYyhkZXNjKTsKKyAgICAgICAgTWV0aG9kVmlzaXRvciBtdiA9IHN1cGVyLnZpc2l0TWV0aG9kKGFjY2VzcywKKyAgICAgICAgICAgICAgICByZW1hcHBlci5tYXBNZXRob2ROYW1lKGNsYXNzTmFtZSwgbmFtZSwgZGVzYyksCisgICAgICAgICAgICAgICAgbmV3RGVzYywKKyAgICAgICAgICAgICAgICByZW1hcHBlci5tYXBTaWduYXR1cmUoc2lnbmF0dXJlLCBmYWxzZSksCisgICAgICAgICAgICAgICAgZXhjZXB0aW9ucyA9PSBudWxsID8gbnVsbCA6IHJlbWFwcGVyLm1hcFR5cGVzKGV4Y2VwdGlvbnMpKTsKKyAgICAgICAgcmV0dXJuIG12ID09IG51bGwgPyBudWxsIDogY3JlYXRlUmVtYXBwaW5nTWV0aG9kQWRhcHRlcihhY2Nlc3MsIG5ld0Rlc2MsIG12KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdElubmVyQ2xhc3MoCisgICAgICAgIFN0cmluZyBuYW1lLAorICAgICAgICBTdHJpbmcgb3V0ZXJOYW1lLAorICAgICAgICBTdHJpbmcgaW5uZXJOYW1lLAorICAgICAgICBpbnQgYWNjZXNzKQorICAgIHsKKyAgICAgICAgc3VwZXIudmlzaXRJbm5lckNsYXNzKHJlbWFwcGVyLm1hcFR5cGUobmFtZSksCisgICAgICAgICAgICAgICAgb3V0ZXJOYW1lID09IG51bGwgPyBudWxsIDogcmVtYXBwZXIubWFwVHlwZShvdXRlck5hbWUpLAorICAgICAgICAgICAgICAgIGlubmVyTmFtZSwgLy8gVE9ETyBzaG91bGQgaXQgYmUgY2hhbmdlZD8KKyAgICAgICAgICAgICAgICBhY2Nlc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0T3V0ZXJDbGFzcyhTdHJpbmcgb3duZXIsIFN0cmluZyBuYW1lLCBTdHJpbmcgZGVzYykgeworICAgICAgICBzdXBlci52aXNpdE91dGVyQ2xhc3MocmVtYXBwZXIubWFwVHlwZShvd25lciksCisgICAgICAgICAgICAgICAgbmFtZSA9PSBudWxsID8gbnVsbCA6IHJlbWFwcGVyLm1hcE1ldGhvZE5hbWUob3duZXIsIG5hbWUsIGRlc2MpLAorICAgICAgICAgICAgICAgIGRlc2MgPT0gbnVsbCA/IG51bGwgOiByZW1hcHBlci5tYXBNZXRob2REZXNjKGRlc2MpKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgRmllbGRWaXNpdG9yIGNyZWF0ZVJlbWFwcGluZ0ZpZWxkQWRhcHRlcihGaWVsZFZpc2l0b3IgZnYpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZW1hcHBpbmdGaWVsZEFkYXB0ZXIoZnYsIHJlbWFwcGVyKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgTWV0aG9kVmlzaXRvciBjcmVhdGVSZW1hcHBpbmdNZXRob2RBZGFwdGVyKAorICAgICAgICBpbnQgYWNjZXNzLAorICAgICAgICBTdHJpbmcgbmV3RGVzYywKKyAgICAgICAgTWV0aG9kVmlzaXRvciBtdikKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgUmVtYXBwaW5nTWV0aG9kQWRhcHRlcihhY2Nlc3MsIG5ld0Rlc2MsIG12LCByZW1hcHBlcik7CisgICAgfQorCisgICAgcHJvdGVjdGVkIEFubm90YXRpb25WaXNpdG9yIGNyZWF0ZVJlbWFwcGluZ0Fubm90YXRpb25BZGFwdGVyKAorICAgICAgICBBbm5vdGF0aW9uVmlzaXRvciBhdikKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgUmVtYXBwaW5nQW5ub3RhdGlvbkFkYXB0ZXIoYXYsIHJlbWFwcGVyKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL2NvbW1vbnMvUmVtYXBwaW5nRmllbGRBZGFwdGVyLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL2NvbW1vbnMvUmVtYXBwaW5nRmllbGRBZGFwdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ3ZGE3MAotLS0gL2Rldi9udWxsCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vY29tbW9ucy9SZW1hcHBpbmdGaWVsZEFkYXB0ZXIuamF2YQpAQCAtMCwwICsxLDk0IEBACisvKgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBPcmFjbGUgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKKyAqIHF1ZXN0aW9ucy4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGlzIGF2YWlsYWJsZSB1bmRlciBhbmQgZ292ZXJuZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiBIb3dldmVyLCB0aGUgZm9sbG93aW5nIG5vdGljZSBhY2NvbXBhbmllZCB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGlzCisgKiBmaWxlOgorICoKKyAqIEFTTTogYSB2ZXJ5IHNtYWxsIGFuZCBmYXN0IEphdmEgYnl0ZWNvZGUgbWFuaXB1bGF0aW9uIGZyYW1ld29yaworICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMTEgSU5SSUEsIEZyYW5jZSBUZWxlY29tCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworcGFja2FnZSBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uY29tbW9uczsKKworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5Bbm5vdGF0aW9uVmlzaXRvcjsKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uRmllbGRWaXNpdG9yOworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5PcGNvZGVzOworCisvKioKKyAqIEEge0BsaW5rIEZpZWxkVmlzaXRvcn0gYWRhcHRlciBmb3IgdHlwZSByZW1hcHBpbmcuCisgKgorICogQGF1dGhvciBFdWdlbmUgS3VsZXNob3YKKyAqLworcHVibGljIGNsYXNzIFJlbWFwcGluZ0ZpZWxkQWRhcHRlciBleHRlbmRzIEZpZWxkVmlzaXRvciB7CisKKyAgICBwcml2YXRlIGZpbmFsIFJlbWFwcGVyIHJlbWFwcGVyOworCisgICAgcHVibGljIFJlbWFwcGluZ0ZpZWxkQWRhcHRlcihmaW5hbCBGaWVsZFZpc2l0b3IgZnYsIGZpbmFsIFJlbWFwcGVyIHJlbWFwcGVyKQorICAgIHsKKyAgICAgICAgdGhpcyhPcGNvZGVzLkFTTTQsIGZ2LCByZW1hcHBlcik7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFJlbWFwcGluZ0ZpZWxkQWRhcHRlcigKKyAgICAgICAgZmluYWwgaW50IGFwaSwKKyAgICAgICAgZmluYWwgRmllbGRWaXNpdG9yIGZ2LAorICAgICAgICBmaW5hbCBSZW1hcHBlciByZW1hcHBlcikKKyAgICB7CisgICAgICAgIHN1cGVyKGFwaSwgZnYpOworICAgICAgICB0aGlzLnJlbWFwcGVyID0gcmVtYXBwZXI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEFubm90YXRpb25WaXNpdG9yIHZpc2l0QW5ub3RhdGlvbihTdHJpbmcgZGVzYywgYm9vbGVhbiB2aXNpYmxlKSB7CisgICAgICAgIEFubm90YXRpb25WaXNpdG9yIGF2ID0gZnYudmlzaXRBbm5vdGF0aW9uKHJlbWFwcGVyLm1hcERlc2MoZGVzYyksIHZpc2libGUpOworICAgICAgICByZXR1cm4gYXYgPT0gbnVsbCA/IG51bGwgOiBuZXcgUmVtYXBwaW5nQW5ub3RhdGlvbkFkYXB0ZXIoYXYsIHJlbWFwcGVyKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL2NvbW1vbnMvUmVtYXBwaW5nTWV0aG9kQWRhcHRlci5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS9jb21tb25zL1JlbWFwcGluZ01ldGhvZEFkYXB0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDYxMmIxCi0tLSAvZGV2L251bGwKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS9jb21tb25zL1JlbWFwcGluZ01ldGhvZEFkYXB0ZXIuamF2YQpAQCAtMCwwICsxLDIzNiBAQAorLyoKKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgT3JhY2xlIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCisgKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CisgKiBxdWVzdGlvbnMuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBpcyBhdmFpbGFibGUgdW5kZXIgYW5kIGdvdmVybmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogSG93ZXZlciwgdGhlIGZvbGxvd2luZyBub3RpY2UgYWNjb21wYW5pZWQgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhpcworICogZmlsZToKKyAqCisgKiBBU006IGEgdmVyeSBzbWFsbCBhbmQgZmFzdCBKYXZhIGJ5dGVjb2RlIG1hbmlwdWxhdGlvbiBmcmFtZXdvcmsKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDExIElOUklBLCBGcmFuY2UgVGVsZWNvbQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK3BhY2thZ2UgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLmNvbW1vbnM7CisKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uQW5ub3RhdGlvblZpc2l0b3I7CitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLkhhbmRsZTsKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uTGFiZWw7CitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLk1ldGhvZFZpc2l0b3I7CitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLk9wY29kZXM7CisKKy8qKgorICogQSB7QGxpbmsgTG9jYWxWYXJpYWJsZXNTb3J0ZXJ9IGZvciB0eXBlIG1hcHBpbmcuCisgKgorICogQGF1dGhvciBFdWdlbmUgS3VsZXNob3YKKyAqLworcHVibGljIGNsYXNzIFJlbWFwcGluZ01ldGhvZEFkYXB0ZXIgZXh0ZW5kcyBMb2NhbFZhcmlhYmxlc1NvcnRlciB7CisKKyAgICBwcm90ZWN0ZWQgZmluYWwgUmVtYXBwZXIgcmVtYXBwZXI7CisKKyAgICBwdWJsaWMgUmVtYXBwaW5nTWV0aG9kQWRhcHRlcigKKyAgICAgICAgZmluYWwgaW50IGFjY2VzcywKKyAgICAgICAgZmluYWwgU3RyaW5nIGRlc2MsCisgICAgICAgIGZpbmFsIE1ldGhvZFZpc2l0b3IgbXYsCisgICAgICAgIGZpbmFsIFJlbWFwcGVyIHJlbWFwcGVyKQorICAgIHsKKyAgICAgICAgdGhpcyhPcGNvZGVzLkFTTTQsIGFjY2VzcywgZGVzYywgbXYsIHJlbWFwcGVyKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgUmVtYXBwaW5nTWV0aG9kQWRhcHRlcigKKyAgICAgICAgZmluYWwgaW50IGFwaSwKKyAgICAgICAgZmluYWwgaW50IGFjY2VzcywKKyAgICAgICAgZmluYWwgU3RyaW5nIGRlc2MsCisgICAgICAgIGZpbmFsIE1ldGhvZFZpc2l0b3IgbXYsCisgICAgICAgIGZpbmFsIFJlbWFwcGVyIHJlbWFwcGVyKQorICAgIHsKKyAgICAgICAgc3VwZXIoYXBpLCBhY2Nlc3MsIGRlc2MsIG12KTsKKyAgICAgICAgdGhpcy5yZW1hcHBlciA9IHJlbWFwcGVyOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBBbm5vdGF0aW9uVmlzaXRvciB2aXNpdEFubm90YXRpb25EZWZhdWx0KCkgeworICAgICAgICBBbm5vdGF0aW9uVmlzaXRvciBhdiA9IG12LnZpc2l0QW5ub3RhdGlvbkRlZmF1bHQoKTsKKyAgICAgICAgcmV0dXJuIGF2ID09IG51bGwgPyBhdiA6IG5ldyBSZW1hcHBpbmdBbm5vdGF0aW9uQWRhcHRlcihhdiwgcmVtYXBwZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBBbm5vdGF0aW9uVmlzaXRvciB2aXNpdEFubm90YXRpb24oU3RyaW5nIGRlc2MsIGJvb2xlYW4gdmlzaWJsZSkgeworICAgICAgICBBbm5vdGF0aW9uVmlzaXRvciBhdiA9IG12LnZpc2l0QW5ub3RhdGlvbihyZW1hcHBlci5tYXBEZXNjKGRlc2MpLCB2aXNpYmxlKTsKKyAgICAgICAgcmV0dXJuIGF2ID09IG51bGwgPyBhdiA6IG5ldyBSZW1hcHBpbmdBbm5vdGF0aW9uQWRhcHRlcihhdiwgcmVtYXBwZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBBbm5vdGF0aW9uVmlzaXRvciB2aXNpdFBhcmFtZXRlckFubm90YXRpb24oCisgICAgICAgIGludCBwYXJhbWV0ZXIsCisgICAgICAgIFN0cmluZyBkZXNjLAorICAgICAgICBib29sZWFuIHZpc2libGUpCisgICAgeworICAgICAgICBBbm5vdGF0aW9uVmlzaXRvciBhdiA9IG12LnZpc2l0UGFyYW1ldGVyQW5ub3RhdGlvbihwYXJhbWV0ZXIsCisgICAgICAgICAgICAgICAgcmVtYXBwZXIubWFwRGVzYyhkZXNjKSwKKyAgICAgICAgICAgICAgICB2aXNpYmxlKTsKKyAgICAgICAgcmV0dXJuIGF2ID09IG51bGwgPyBhdiA6IG5ldyBSZW1hcHBpbmdBbm5vdGF0aW9uQWRhcHRlcihhdiwgcmVtYXBwZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0RnJhbWUoCisgICAgICAgIGludCB0eXBlLAorICAgICAgICBpbnQgbkxvY2FsLAorICAgICAgICBPYmplY3RbXSBsb2NhbCwKKyAgICAgICAgaW50IG5TdGFjaywKKyAgICAgICAgT2JqZWN0W10gc3RhY2spCisgICAgeworICAgICAgICBzdXBlci52aXNpdEZyYW1lKHR5cGUsIG5Mb2NhbCwgcmVtYXBFbnRyaWVzKG5Mb2NhbCwgbG9jYWwpLCBuU3RhY2ssIHJlbWFwRW50cmllcyhuU3RhY2ssIHN0YWNrKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBPYmplY3RbXSByZW1hcEVudHJpZXMoaW50IG4sIE9iamVjdFtdIGVudHJpZXMpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChlbnRyaWVzW2ldIGluc3RhbmNlb2YgU3RyaW5nKSB7CisgICAgICAgICAgICAgICAgT2JqZWN0W10gbmV3RW50cmllcyA9IG5ldyBPYmplY3Rbbl07CisgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoZW50cmllcywgMCwgbmV3RW50cmllcywgMCwgaSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHQgPSBlbnRyaWVzW2ldOworICAgICAgICAgICAgICAgICAgICBuZXdFbnRyaWVzW2krK10gPSB0IGluc3RhbmNlb2YgU3RyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyByZW1hcHBlci5tYXBUeXBlKChTdHJpbmcpIHQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0OworICAgICAgICAgICAgICAgIH0gd2hpbGUgKGkgPCBuKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3RW50cmllczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZW50cmllczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEZpZWxkSW5zbigKKyAgICAgICAgaW50IG9wY29kZSwKKyAgICAgICAgU3RyaW5nIG93bmVyLAorICAgICAgICBTdHJpbmcgbmFtZSwKKyAgICAgICAgU3RyaW5nIGRlc2MpCisgICAgeworICAgICAgICBzdXBlci52aXNpdEZpZWxkSW5zbihvcGNvZGUsCisgICAgICAgICAgICAgICAgcmVtYXBwZXIubWFwVHlwZShvd25lciksCisgICAgICAgICAgICAgICAgcmVtYXBwZXIubWFwRmllbGROYW1lKG93bmVyLCBuYW1lLCBkZXNjKSwKKyAgICAgICAgICAgICAgICByZW1hcHBlci5tYXBEZXNjKGRlc2MpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdE1ldGhvZEluc24oCisgICAgICAgIGludCBvcGNvZGUsCisgICAgICAgIFN0cmluZyBvd25lciwKKyAgICAgICAgU3RyaW5nIG5hbWUsCisgICAgICAgIFN0cmluZyBkZXNjKQorICAgIHsKKyAgICAgICAgc3VwZXIudmlzaXRNZXRob2RJbnNuKG9wY29kZSwKKyAgICAgICAgICAgICAgICByZW1hcHBlci5tYXBUeXBlKG93bmVyKSwKKyAgICAgICAgICAgICAgICByZW1hcHBlci5tYXBNZXRob2ROYW1lKG93bmVyLCBuYW1lLCBkZXNjKSwKKyAgICAgICAgICAgICAgICByZW1hcHBlci5tYXBNZXRob2REZXNjKGRlc2MpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEludm9rZUR5bmFtaWNJbnNuKAorICAgICAgICBTdHJpbmcgbmFtZSwKKyAgICAgICAgU3RyaW5nIGRlc2MsCisgICAgICAgIEhhbmRsZSBic20sCisgICAgICAgIE9iamVjdC4uLiBic21BcmdzKQorICAgIHsKKyAgICAgICAgZm9yKGludCBpPTA7IGk8YnNtQXJncy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgYnNtQXJnc1tpXSA9IHJlbWFwcGVyLm1hcFZhbHVlKGJzbUFyZ3NbaV0pOworICAgICAgICB9CisgICAgICAgIHN1cGVyLnZpc2l0SW52b2tlRHluYW1pY0luc24oCisgICAgICAgICAgICAgICAgcmVtYXBwZXIubWFwSW52b2tlRHluYW1pY01ldGhvZE5hbWUobmFtZSwgZGVzYyksCisgICAgICAgICAgICAgICAgcmVtYXBwZXIubWFwTWV0aG9kRGVzYyhkZXNjKSwKKyAgICAgICAgICAgICAgICAoSGFuZGxlKXJlbWFwcGVyLm1hcFZhbHVlKGJzbSksCisgICAgICAgICAgICAgICAgYnNtQXJncyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRUeXBlSW5zbihpbnQgb3Bjb2RlLCBTdHJpbmcgdHlwZSkgeworICAgICAgICBzdXBlci52aXNpdFR5cGVJbnNuKG9wY29kZSwgcmVtYXBwZXIubWFwVHlwZSh0eXBlKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRMZGNJbnNuKE9iamVjdCBjc3QpIHsKKyAgICAgICAgc3VwZXIudmlzaXRMZGNJbnNuKHJlbWFwcGVyLm1hcFZhbHVlKGNzdCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TXVsdGlBTmV3QXJyYXlJbnNuKFN0cmluZyBkZXNjLCBpbnQgZGltcykgeworICAgICAgICBzdXBlci52aXNpdE11bHRpQU5ld0FycmF5SW5zbihyZW1hcHBlci5tYXBEZXNjKGRlc2MpLCBkaW1zKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFRyeUNhdGNoQmxvY2soCisgICAgICAgIExhYmVsIHN0YXJ0LAorICAgICAgICBMYWJlbCBlbmQsCisgICAgICAgIExhYmVsIGhhbmRsZXIsCisgICAgICAgIFN0cmluZyB0eXBlKQorICAgIHsKKyAgICAgICAgc3VwZXIudmlzaXRUcnlDYXRjaEJsb2NrKHN0YXJ0LCBlbmQsIGhhbmRsZXIsCisgICAgICAgICAgICAgICAgdHlwZSA9PSBudWxsID8gbnVsbCA6IHJlbWFwcGVyLm1hcFR5cGUodHlwZSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TG9jYWxWYXJpYWJsZSgKKyAgICAgICAgU3RyaW5nIG5hbWUsCisgICAgICAgIFN0cmluZyBkZXNjLAorICAgICAgICBTdHJpbmcgc2lnbmF0dXJlLAorICAgICAgICBMYWJlbCBzdGFydCwKKyAgICAgICAgTGFiZWwgZW5kLAorICAgICAgICBpbnQgaW5kZXgpCisgICAgeworICAgICAgICBzdXBlci52aXNpdExvY2FsVmFyaWFibGUobmFtZSwKKyAgICAgICAgICAgICAgICByZW1hcHBlci5tYXBEZXNjKGRlc2MpLAorICAgICAgICAgICAgICAgIHJlbWFwcGVyLm1hcFNpZ25hdHVyZShzaWduYXR1cmUsIHRydWUpLAorICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgIGVuZCwKKyAgICAgICAgICAgICAgICBpbmRleCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS9jb21tb25zL1JlbWFwcGluZ1NpZ25hdHVyZUFkYXB0ZXIuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vY29tbW9ucy9SZW1hcHBpbmdTaWduYXR1cmVBZGFwdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRjODA3MQotLS0gL2Rldi9udWxsCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vY29tbW9ucy9SZW1hcHBpbmdTaWduYXR1cmVBZGFwdGVyLmphdmEKQEAgLTAsMCArMSwxODcgQEAKKy8qCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IE9yYWNsZSBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQorICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQorICogcXVlc3Rpb25zLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgaXMgYXZhaWxhYmxlIHVuZGVyIGFuZCBnb3Zlcm5lZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIEhvd2V2ZXIsIHRoZSBmb2xsb3dpbmcgbm90aWNlIGFjY29tcGFuaWVkIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoaXMKKyAqIGZpbGU6CisgKgorICogQVNNOiBhIHZlcnkgc21hbGwgYW5kIGZhc3QgSmF2YSBieXRlY29kZSBtYW5pcHVsYXRpb24gZnJhbWV3b3JrCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAxMSBJTlJJQSwgRnJhbmNlIFRlbGVjb20KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCitwYWNrYWdlIGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5jb21tb25zOworCitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLk9wY29kZXM7CitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLnNpZ25hdHVyZS5TaWduYXR1cmVWaXNpdG9yOworCisvKioKKyAqIEEge0BsaW5rIFNpZ25hdHVyZVZpc2l0b3J9IGFkYXB0ZXIgZm9yIHR5cGUgbWFwcGluZy4KKyAqCisgKiBAYXV0aG9yIEV1Z2VuZSBLdWxlc2hvdgorICovCitwdWJsaWMgY2xhc3MgUmVtYXBwaW5nU2lnbmF0dXJlQWRhcHRlciBleHRlbmRzIFNpZ25hdHVyZVZpc2l0b3IgeworCisgICAgcHJpdmF0ZSBmaW5hbCBTaWduYXR1cmVWaXNpdG9yIHY7CisKKyAgICBwcml2YXRlIGZpbmFsIFJlbWFwcGVyIHJlbWFwcGVyOworCisgICAgcHJpdmF0ZSBTdHJpbmcgY2xhc3NOYW1lOworCisgICAgcHVibGljIFJlbWFwcGluZ1NpZ25hdHVyZUFkYXB0ZXIoCisgICAgICAgIGZpbmFsIFNpZ25hdHVyZVZpc2l0b3IgdiwKKyAgICAgICAgZmluYWwgUmVtYXBwZXIgcmVtYXBwZXIpCisgICAgeworICAgICAgICB0aGlzKE9wY29kZXMuQVNNNCwgdiwgcmVtYXBwZXIpOworICAgIH0KKworICAgIHByb3RlY3RlZCBSZW1hcHBpbmdTaWduYXR1cmVBZGFwdGVyKAorICAgICAgICBmaW5hbCBpbnQgYXBpLAorICAgICAgICBmaW5hbCBTaWduYXR1cmVWaXNpdG9yIHYsCisgICAgICAgIGZpbmFsIFJlbWFwcGVyIHJlbWFwcGVyKQorICAgIHsKKyAgICAgICAgc3VwZXIoYXBpKTsKKyAgICAgICAgdGhpcy52ID0gdjsKKyAgICAgICAgdGhpcy5yZW1hcHBlciA9IHJlbWFwcGVyOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0Q2xhc3NUeXBlKFN0cmluZyBuYW1lKSB7CisgICAgICAgIGNsYXNzTmFtZSA9IG5hbWU7CisgICAgICAgIHYudmlzaXRDbGFzc1R5cGUocmVtYXBwZXIubWFwVHlwZShuYW1lKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRJbm5lckNsYXNzVHlwZShTdHJpbmcgbmFtZSkgeworICAgICAgICBjbGFzc05hbWUgPSBjbGFzc05hbWUgKyAnJCcgKyBuYW1lOworICAgICAgICBTdHJpbmcgcmVtYXBwZWROYW1lID0gcmVtYXBwZXIubWFwVHlwZShjbGFzc05hbWUpOworICAgICAgICB2LnZpc2l0SW5uZXJDbGFzc1R5cGUocmVtYXBwZWROYW1lLnN1YnN0cmluZyhyZW1hcHBlZE5hbWUubGFzdEluZGV4T2YoJyQnKSArIDEpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEZvcm1hbFR5cGVQYXJhbWV0ZXIoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdi52aXNpdEZvcm1hbFR5cGVQYXJhbWV0ZXIobmFtZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRUeXBlVmFyaWFibGUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdi52aXNpdFR5cGVWYXJpYWJsZShuYW1lKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2lnbmF0dXJlVmlzaXRvciB2aXNpdEFycmF5VHlwZSgpIHsKKyAgICAgICAgdi52aXNpdEFycmF5VHlwZSgpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEJhc2VUeXBlKGNoYXIgZGVzY3JpcHRvcikgeworICAgICAgICB2LnZpc2l0QmFzZVR5cGUoZGVzY3JpcHRvcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNpZ25hdHVyZVZpc2l0b3IgdmlzaXRDbGFzc0JvdW5kKCkgeworICAgICAgICB2LnZpc2l0Q2xhc3NCb3VuZCgpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2lnbmF0dXJlVmlzaXRvciB2aXNpdEV4Y2VwdGlvblR5cGUoKSB7CisgICAgICAgIHYudmlzaXRFeGNlcHRpb25UeXBlKCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTaWduYXR1cmVWaXNpdG9yIHZpc2l0SW50ZXJmYWNlKCkgeworICAgICAgICB2LnZpc2l0SW50ZXJmYWNlKCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTaWduYXR1cmVWaXNpdG9yIHZpc2l0SW50ZXJmYWNlQm91bmQoKSB7CisgICAgICAgIHYudmlzaXRJbnRlcmZhY2VCb3VuZCgpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2lnbmF0dXJlVmlzaXRvciB2aXNpdFBhcmFtZXRlclR5cGUoKSB7CisgICAgICAgIHYudmlzaXRQYXJhbWV0ZXJUeXBlKCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTaWduYXR1cmVWaXNpdG9yIHZpc2l0UmV0dXJuVHlwZSgpIHsKKyAgICAgICAgdi52aXNpdFJldHVyblR5cGUoKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNpZ25hdHVyZVZpc2l0b3IgdmlzaXRTdXBlcmNsYXNzKCkgeworICAgICAgICB2LnZpc2l0U3VwZXJjbGFzcygpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFR5cGVBcmd1bWVudCgpIHsKKyAgICAgICAgdi52aXNpdFR5cGVBcmd1bWVudCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTaWduYXR1cmVWaXNpdG9yIHZpc2l0VHlwZUFyZ3VtZW50KGNoYXIgd2lsZGNhcmQpIHsKKyAgICAgICAgdi52aXNpdFR5cGVBcmd1bWVudCh3aWxkY2FyZCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0RW5kKCkgeworICAgICAgICB2LnZpc2l0RW5kKCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL2NvbW1vbnMvU2VyaWFsVmVyc2lvblVJREFkZGVyLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL2NvbW1vbnMvU2VyaWFsVmVyc2lvblVJREFkZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNlMzZlZQotLS0gL2Rldi9udWxsCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vY29tbW9ucy9TZXJpYWxWZXJzaW9uVUlEQWRkZXIuamF2YQpAQCAtMCwwICsxLDU1OSBAQAorLyoKKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgT3JhY2xlIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCisgKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CisgKiBxdWVzdGlvbnMuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBpcyBhdmFpbGFibGUgdW5kZXIgYW5kIGdvdmVybmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogSG93ZXZlciwgdGhlIGZvbGxvd2luZyBub3RpY2UgYWNjb21wYW5pZWQgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhpcworICogZmlsZToKKyAqCisgKiBBU006IGEgdmVyeSBzbWFsbCBhbmQgZmFzdCBKYXZhIGJ5dGVjb2RlIG1hbmlwdWxhdGlvbiBmcmFtZXdvcmsKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDExIElOUklBLCBGcmFuY2UgVGVsZWNvbQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5jb21tb25zOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5EYXRhT3V0cHV0OworaW1wb3J0IGphdmEuaW8uRGF0YU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uQ2xhc3NWaXNpdG9yOworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5GaWVsZFZpc2l0b3I7CitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLk1ldGhvZFZpc2l0b3I7CitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLk9wY29kZXM7CisKKy8qKgorICogQSB7QGxpbmsgQ2xhc3NWaXNpdG9yfSB0aGF0IGFkZHMgYSBzZXJpYWwgdmVyc2lvbiB1bmlxdWUgaWRlbnRpZmllciB0byBhCisgKiBjbGFzcyBpZiBtaXNzaW5nLiBIZXJlIGlzIHR5cGljYWwgdXNhZ2Ugb2YgdGhpcyBjbGFzczoKKyAqCisgKiA8cHJlPgorICogICBDbGFzc1dyaXRlciBjdyA9IG5ldyBDbGFzc1dyaXRlciguLi4pOworICogICBDbGFzc1Zpc2l0b3Igc3YgPSBuZXcgU2VyaWFsVmVyc2lvblVJREFkZGVyKGN3KTsKKyAqICAgQ2xhc3NWaXNpdG9yIGNhID0gbmV3IE15Q2xhc3NBZGFwdGVyKHN2KTsKKyAqICAgbmV3IENsYXNzUmVhZGVyKG9yZ2luYWxDbGFzcykuYWNjZXB0KGNhLCBmYWxzZSk7CisgKiA8L3ByZT4KKyAqCisgKiBUaGUgU1ZVSUQgYWxnb3JpdGhtIGNhbiBiZSBmb3VuZCA8YSBocmVmPQorICogImh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjQuMi9kb2NzL2d1aWRlL3NlcmlhbGl6YXRpb24vc3BlYy9jbGFzcy5odG1sIgorICogPmh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjQuMi9kb2NzL2d1aWRlL3NlcmlhbGl6YXRpb24vc3BlYy9jbGFzcy5odG1sPC9hPjoKKyAqCisgKiA8cHJlPgorICogVGhlIHNlcmlhbFZlcnNpb25VSUQgaXMgY29tcHV0ZWQgdXNpbmcgdGhlIHNpZ25hdHVyZSBvZiBhIHN0cmVhbSBvZiBieXRlcworICogdGhhdCByZWZsZWN0IHRoZSBjbGFzcyBkZWZpbml0aW9uLiBUaGUgTmF0aW9uYWwgSW5zdGl0dXRlIG9mIFN0YW5kYXJkcyBhbmQKKyAqIFRlY2hub2xvZ3kgKE5JU1QpIFNlY3VyZSBIYXNoIEFsZ29yaXRobSAoU0hBLTEpIGlzIHVzZWQgdG8gY29tcHV0ZSBhCisgKiBzaWduYXR1cmUgZm9yIHRoZSBzdHJlYW0uIFRoZSBmaXJzdCB0d28gMzItYml0IHF1YW50aXRpZXMgYXJlIHVzZWQgdG8gZm9ybSBhCisgKiA2NC1iaXQgaGFzaC4gQSBqYXZhLmxhbmcuRGF0YU91dHB1dFN0cmVhbSBpcyB1c2VkIHRvIGNvbnZlcnQgcHJpbWl0aXZlIGRhdGEKKyAqIHR5cGVzIHRvIGEgc2VxdWVuY2Ugb2YgYnl0ZXMuIFRoZSB2YWx1ZXMgaW5wdXQgdG8gdGhlIHN0cmVhbSBhcmUgZGVmaW5lZCBieQorICogdGhlIEphdmEgVmlydHVhbCBNYWNoaW5lIChWTSkgc3BlY2lmaWNhdGlvbiBmb3IgY2xhc3Nlcy4KKyAqCisgKiBUaGUgc2VxdWVuY2Ugb2YgaXRlbXMgaW4gdGhlIHN0cmVhbSBpcyBhcyBmb2xsb3dzOgorICoKKyAqIDEuIFRoZSBjbGFzcyBuYW1lIHdyaXR0ZW4gdXNpbmcgVVRGIGVuY29kaW5nLgorICogMi4gVGhlIGNsYXNzIG1vZGlmaWVycyB3cml0dGVuIGFzIGEgMzItYml0IGludGVnZXIuCisgKiAzLiBUaGUgbmFtZSBvZiBlYWNoIGludGVyZmFjZSBzb3J0ZWQgYnkgbmFtZSB3cml0dGVuIHVzaW5nIFVURiBlbmNvZGluZy4KKyAqIDQuIEZvciBlYWNoIGZpZWxkIG9mIHRoZSBjbGFzcyBzb3J0ZWQgYnkgZmllbGQgbmFtZSAoZXhjZXB0IHByaXZhdGUgc3RhdGljCisgKiBhbmQgcHJpdmF0ZSB0cmFuc2llbnQgZmllbGRzKToKKyAqIDEuIFRoZSBuYW1lIG9mIHRoZSBmaWVsZCBpbiBVVEYgZW5jb2RpbmcuCisgKiAyLiBUaGUgbW9kaWZpZXJzIG9mIHRoZSBmaWVsZCB3cml0dGVuIGFzIGEgMzItYml0IGludGVnZXIuCisgKiAzLiBUaGUgZGVzY3JpcHRvciBvZiB0aGUgZmllbGQgaW4gVVRGIGVuY29kaW5nCisgKiA1LiBJZiBhIGNsYXNzIGluaXRpYWxpemVyIGV4aXN0cywgd3JpdGUgb3V0IHRoZSBmb2xsb3dpbmc6CisgKiAxLiBUaGUgbmFtZSBvZiB0aGUgbWV0aG9kLCAmbHQ7Y2xpbml0Jmd0OywgaW4gVVRGIGVuY29kaW5nLgorICogMi4gVGhlIG1vZGlmaWVyIG9mIHRoZSBtZXRob2QsIGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyLlNUQVRJQywKKyAqIHdyaXR0ZW4gYXMgYSAzMi1iaXQgaW50ZWdlci4KKyAqIDMuIFRoZSBkZXNjcmlwdG9yIG9mIHRoZSBtZXRob2QsICgpViwgaW4gVVRGIGVuY29kaW5nLgorICogNi4gRm9yIGVhY2ggbm9uLXByaXZhdGUgY29uc3RydWN0b3Igc29ydGVkIGJ5IG1ldGhvZCBuYW1lIGFuZCBzaWduYXR1cmU6CisgKiAxLiBUaGUgbmFtZSBvZiB0aGUgbWV0aG9kLCAmbHQ7aW5pdCZndDssIGluIFVURiBlbmNvZGluZy4KKyAqIDIuIFRoZSBtb2RpZmllcnMgb2YgdGhlIG1ldGhvZCB3cml0dGVuIGFzIGEgMzItYml0IGludGVnZXIuCisgKiAzLiBUaGUgZGVzY3JpcHRvciBvZiB0aGUgbWV0aG9kIGluIFVURiBlbmNvZGluZy4KKyAqIDcuIEZvciBlYWNoIG5vbi1wcml2YXRlIG1ldGhvZCBzb3J0ZWQgYnkgbWV0aG9kIG5hbWUgYW5kIHNpZ25hdHVyZToKKyAqIDEuIFRoZSBuYW1lIG9mIHRoZSBtZXRob2QgaW4gVVRGIGVuY29kaW5nLgorICogMi4gVGhlIG1vZGlmaWVycyBvZiB0aGUgbWV0aG9kIHdyaXR0ZW4gYXMgYSAzMi1iaXQgaW50ZWdlci4KKyAqIDMuIFRoZSBkZXNjcmlwdG9yIG9mIHRoZSBtZXRob2QgaW4gVVRGIGVuY29kaW5nLgorICogOC4gVGhlIFNIQS0xIGFsZ29yaXRobSBpcyBleGVjdXRlZCBvbiB0aGUgc3RyZWFtIG9mIGJ5dGVzIHByb2R1Y2VkIGJ5CisgKiBEYXRhT3V0cHV0U3RyZWFtIGFuZCBwcm9kdWNlcyBmaXZlIDMyLWJpdCB2YWx1ZXMgc2hhWzAuLjRdLgorICoKKyAqIDkuIFRoZSBoYXNoIHZhbHVlIGlzIGFzc2VtYmxlZCBmcm9tIHRoZSBmaXJzdCBhbmQgc2Vjb25kIDMyLWJpdCB2YWx1ZXMgb2YKKyAqIHRoZSBTSEEtMSBtZXNzYWdlIGRpZ2VzdC4gSWYgdGhlIHJlc3VsdCBvZiB0aGUgbWVzc2FnZSBkaWdlc3QsIHRoZSBmaXZlCisgKiAzMi1iaXQgd29yZHMgSDAgSDEgSDIgSDMgSDQsIGlzIGluIGFuIGFycmF5IG9mIGZpdmUgaW50IHZhbHVlcyBuYW1lZAorICogc2hhLCB0aGUgaGFzaCB2YWx1ZSB3b3VsZCBiZSBjb21wdXRlZCBhcyBmb2xsb3dzOgorICoKKyAqIGxvbmcgaGFzaCA9ICgoc2hhWzBdICZndDsmZ3Q7Jmd0OyAyNCkgJmFtcDsgMHhGRikgfAorICogKChzaGFbMF0gJmd0OyZndDsmZ3Q7IDE2KSAmYW1wOyAweEZGKSAmbHQ7Jmx0OyA4IHwKKyAqICgoc2hhWzBdICZndDsmZ3Q7Jmd0OyA4KSAmYW1wOyAweEZGKSAmbHQ7Jmx0OyAxNiB8CisgKiAoKHNoYVswXSAmZ3Q7Jmd0OyZndDsgMCkgJmFtcDsgMHhGRikgJmx0OyZsdDsgMjQgfAorICogKChzaGFbMV0gJmd0OyZndDsmZ3Q7IDI0KSAmYW1wOyAweEZGKSAmbHQ7Jmx0OyAzMiB8CisgKiAoKHNoYVsxXSAmZ3Q7Jmd0OyZndDsgMTYpICZhbXA7IDB4RkYpICZsdDsmbHQ7IDQwIHwKKyAqICgoc2hhWzFdICZndDsmZ3Q7Jmd0OyA4KSAmYW1wOyAweEZGKSAmbHQ7Jmx0OyA0OCB8CisgKiAoKHNoYVsxXSAmZ3Q7Jmd0OyZndDsgMCkgJmFtcDsgMHhGRikgJmx0OyZsdDsgNTY7CisgKiA8L3ByZT4KKyAqCisgKiBAYXV0aG9yIFJhamVuZHJhIEluYW1kYXIsIFZpc2hhbCBWaXNobm9pCisgKi8KK3B1YmxpYyBjbGFzcyBTZXJpYWxWZXJzaW9uVUlEQWRkZXIgZXh0ZW5kcyBDbGFzc1Zpc2l0b3IgeworCisgICAgLyoqCisgICAgICogRmxhZyB0aGF0IGluZGljYXRlcyBpZiB3ZSBuZWVkIHRvIGNvbXB1dGUgU1ZVSUQuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGNvbXB1dGVTVlVJRDsKKworICAgIC8qKgorICAgICAqIFNldCB0byB0cnVlIGlmIHRoZSBjbGFzcyBhbHJlYWR5IGhhcyBTVlVJRC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaGFzU1ZVSUQ7CisKKyAgICAvKioKKyAgICAgKiBDbGFzc2VzIGFjY2VzcyBmbGFncy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBhY2Nlc3M7CisKKyAgICAvKioKKyAgICAgKiBJbnRlcm5hbCBuYW1lIG9mIHRoZSBjbGFzcworICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisKKyAgICAvKioKKyAgICAgKiBJbnRlcmZhY2VzIGltcGxlbWVudGVkIGJ5IHRoZSBjbGFzcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZ1tdIGludGVyZmFjZXM7CisKKyAgICAvKioKKyAgICAgKiBDb2xsZWN0aW9uIG9mIGZpZWxkcy4gKGV4Y2VwdCBwcml2YXRlIHN0YXRpYyBhbmQgcHJpdmF0ZSB0cmFuc2llbnQKKyAgICAgKiBmaWVsZHMpCisgICAgICovCisgICAgcHJpdmF0ZSBDb2xsZWN0aW9uPEl0ZW0+IHN2dWlkRmllbGRzOworCisgICAgLyoqCisgICAgICogU2V0IHRvIHRydWUgaWYgdGhlIGNsYXNzIGhhcyBzdGF0aWMgaW5pdGlhbGl6ZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGhhc1N0YXRpY0luaXRpYWxpemVyOworCisgICAgLyoqCisgICAgICogQ29sbGVjdGlvbiBvZiBub24tcHJpdmF0ZSBjb25zdHJ1Y3RvcnMuCisgICAgICovCisgICAgcHJpdmF0ZSBDb2xsZWN0aW9uPEl0ZW0+IHN2dWlkQ29uc3RydWN0b3JzOworCisgICAgLyoqCisgICAgICogQ29sbGVjdGlvbiBvZiBub24tcHJpdmF0ZSBtZXRob2RzLgorICAgICAqLworICAgIHByaXZhdGUgQ29sbGVjdGlvbjxJdGVtPiBzdnVpZE1ldGhvZHM7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBTZXJpYWxWZXJzaW9uVUlEQWRkZXJ9LiA8aT5TdWJjbGFzc2VzIG11c3Qgbm90IHVzZQorICAgICAqIHRoaXMgY29uc3RydWN0b3I8L2k+LiBJbnN0ZWFkLCB0aGV5IG11c3QgdXNlIHRoZQorICAgICAqIHtAbGluayAjU2VyaWFsVmVyc2lvblVJREFkZGVyKGludCwgQ2xhc3NWaXNpdG9yKX0gdmVyc2lvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjdiBhIHtAbGluayBDbGFzc1Zpc2l0b3J9IHRvIHdoaWNoIHRoaXMgdmlzaXRvciB3aWxsIGRlbGVnYXRlCisgICAgICogICAgICAgIGNhbGxzLgorICAgICAqLworICAgIHB1YmxpYyBTZXJpYWxWZXJzaW9uVUlEQWRkZXIoZmluYWwgQ2xhc3NWaXNpdG9yIGN2KSB7CisgICAgICAgIHRoaXMoT3Bjb2Rlcy5BU000LCBjdik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgU2VyaWFsVmVyc2lvblVJREFkZGVyfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcGkgdGhlIEFTTSBBUEkgdmVyc2lvbiBpbXBsZW1lbnRlZCBieSB0aGlzIHZpc2l0b3IuIE11c3QgYmUgb25lCisgICAgICogICAgICAgIG9mIHtAbGluayBPcGNvZGVzI0FTTTR9LgorICAgICAqIEBwYXJhbSBjdiBhIHtAbGluayBDbGFzc1Zpc2l0b3J9IHRvIHdoaWNoIHRoaXMgdmlzaXRvciB3aWxsIGRlbGVnYXRlCisgICAgICogICAgICAgIGNhbGxzLgorICAgICAqLworICAgIHByb3RlY3RlZCBTZXJpYWxWZXJzaW9uVUlEQWRkZXIoZmluYWwgaW50IGFwaSwgZmluYWwgQ2xhc3NWaXNpdG9yIGN2KSB7CisgICAgICAgIHN1cGVyKGFwaSwgY3YpOworICAgICAgICBzdnVpZEZpZWxkcyA9IG5ldyBBcnJheUxpc3Q8SXRlbT4oKTsKKyAgICAgICAgc3Z1aWRDb25zdHJ1Y3RvcnMgPSBuZXcgQXJyYXlMaXN0PEl0ZW0+KCk7CisgICAgICAgIHN2dWlkTWV0aG9kcyA9IG5ldyBBcnJheUxpc3Q8SXRlbT4oKTsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBPdmVycmlkZW4gbWV0aG9kcworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLyoKKyAgICAgKiBWaXNpdCBjbGFzcyBoZWFkZXIgYW5kIGdldCBjbGFzcyBuYW1lLCBhY2Nlc3MgLCBhbmQgaW50ZXJmYWNlcworICAgICAqIGluZm9ybWF0aW9uIChzdGVwIDEsMiwgYW5kIDMpIGZvciBTVlVJRCBjb21wdXRhdGlvbi4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdCgKKyAgICAgICAgZmluYWwgaW50IHZlcnNpb24sCisgICAgICAgIGZpbmFsIGludCBhY2Nlc3MsCisgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lLAorICAgICAgICBmaW5hbCBTdHJpbmcgc2lnbmF0dXJlLAorICAgICAgICBmaW5hbCBTdHJpbmcgc3VwZXJOYW1lLAorICAgICAgICBmaW5hbCBTdHJpbmdbXSBpbnRlcmZhY2VzKQorICAgIHsKKyAgICAgICAgY29tcHV0ZVNWVUlEID0gKGFjY2VzcyAmIE9wY29kZXMuQUNDX0lOVEVSRkFDRSkgPT0gMDsKKworICAgICAgICBpZiAoY29tcHV0ZVNWVUlEKSB7CisgICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICAgICAgdGhpcy5hY2Nlc3MgPSBhY2Nlc3M7CisgICAgICAgICAgICB0aGlzLmludGVyZmFjZXMgPSBpbnRlcmZhY2VzOworICAgICAgICB9CisKKyAgICAgICAgc3VwZXIudmlzaXQodmVyc2lvbiwgYWNjZXNzLCBuYW1lLCBzaWduYXR1cmUsIHN1cGVyTmFtZSwgaW50ZXJmYWNlcyk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBWaXNpdCB0aGUgbWV0aG9kcyBhbmQgZ2V0IGNvbnN0cnVjdG9yIGFuZCBtZXRob2QgaW5mb3JtYXRpb24gKHN0ZXAgNSBhbmQKKyAgICAgKiA3KS4gQWxzbyBkZXRlcm1pbmUgaWYgdGhlcmUgaXMgYSBjbGFzcyBpbml0aWFsaXplciAoc3RlcCA2KS4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWV0aG9kVmlzaXRvciB2aXNpdE1ldGhvZCgKKyAgICAgICAgZmluYWwgaW50IGFjY2VzcywKKyAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUsCisgICAgICAgIGZpbmFsIFN0cmluZyBkZXNjLAorICAgICAgICBmaW5hbCBTdHJpbmcgc2lnbmF0dXJlLAorICAgICAgICBmaW5hbCBTdHJpbmdbXSBleGNlcHRpb25zKQorICAgIHsKKyAgICAgICAgaWYgKGNvbXB1dGVTVlVJRCkgeworICAgICAgICAgICAgaWYgKCI8Y2xpbml0PiIuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgaGFzU3RhdGljSW5pdGlhbGl6ZXIgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFJlbWVtYmVycyBub24gcHJpdmF0ZSBjb25zdHJ1Y3RvcnMgYW5kIG1ldGhvZHMgZm9yIFNWVUlECisgICAgICAgICAgICAgKiBjb21wdXRhdGlvbiBGb3IgY29uc3RydWN0b3IgYW5kIG1ldGhvZCBtb2RpZmllcnMsIG9ubHkgdGhlCisgICAgICAgICAgICAgKiBBQ0NfUFVCTElDLCBBQ0NfUFJJVkFURSwgQUNDX1BST1RFQ1RFRCwgQUNDX1NUQVRJQywgQUNDX0ZJTkFMLAorICAgICAgICAgICAgICogQUNDX1NZTkNIUk9OSVpFRCwgQUNDX05BVElWRSwgQUNDX0FCU1RSQUNUIGFuZCBBQ0NfU1RSSUNUIGZsYWdzCisgICAgICAgICAgICAgKiBhcmUgdXNlZC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaW50IG1vZHMgPSBhY2Nlc3MKKyAgICAgICAgICAgICAgICAgICAgJiAoT3Bjb2Rlcy5BQ0NfUFVCTElDIHwgT3Bjb2Rlcy5BQ0NfUFJJVkFURQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgT3Bjb2Rlcy5BQ0NfUFJPVEVDVEVEIHwgT3Bjb2Rlcy5BQ0NfU1RBVElDCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBPcGNvZGVzLkFDQ19GSU5BTCB8IE9wY29kZXMuQUNDX1NZTkNIUk9OSVpFRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgT3Bjb2Rlcy5BQ0NfTkFUSVZFIHwgT3Bjb2Rlcy5BQ0NfQUJTVFJBQ1QgfCBPcGNvZGVzLkFDQ19TVFJJQ1QpOworCisgICAgICAgICAgICAvLyBhbGwgbm9uIHByaXZhdGUgbWV0aG9kcworICAgICAgICAgICAgaWYgKChhY2Nlc3MgJiBPcGNvZGVzLkFDQ19QUklWQVRFKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKCI8aW5pdD4iLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBzdnVpZENvbnN0cnVjdG9ycy5hZGQobmV3IEl0ZW0obmFtZSwgbW9kcywgZGVzYykpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoISI8Y2xpbml0PiIuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHN2dWlkTWV0aG9kcy5hZGQobmV3IEl0ZW0obmFtZSwgbW9kcywgZGVzYykpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzdXBlci52aXNpdE1ldGhvZChhY2Nlc3MsIG5hbWUsIGRlc2MsIHNpZ25hdHVyZSwgZXhjZXB0aW9ucyk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBHZXRzIGNsYXNzIGZpZWxkIGluZm9ybWF0aW9uIGZvciBzdGVwIDQgb2YgdGhlIGFsZ29yaXRobS4gQWxzbyBkZXRlcm1pbmVzCisgICAgICogaWYgdGhlIGNsYXNzIGFscmVhZHkgaGFzIGEgU1ZVSUQuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEZpZWxkVmlzaXRvciB2aXNpdEZpZWxkKAorICAgICAgICBmaW5hbCBpbnQgYWNjZXNzLAorICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSwKKyAgICAgICAgZmluYWwgU3RyaW5nIGRlc2MsCisgICAgICAgIGZpbmFsIFN0cmluZyBzaWduYXR1cmUsCisgICAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSkKKyAgICB7CisgICAgICAgIGlmIChjb21wdXRlU1ZVSUQpIHsKKyAgICAgICAgICAgIGlmICgic2VyaWFsVmVyc2lvblVJRCIuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgLy8gc2luY2UgdGhlIGNsYXNzIGFscmVhZHkgaGFzIFNWVUlELCB3ZSB3b24ndCBiZSBjb21wdXRpbmcgaXQuCisgICAgICAgICAgICAgICAgY29tcHV0ZVNWVUlEID0gZmFsc2U7CisgICAgICAgICAgICAgICAgaGFzU1ZVSUQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFJlbWVtYmVyIGZpZWxkIGZvciBTVlVJRCBjb21wdXRhdGlvbiBGb3IgZmllbGQgbW9kaWZpZXJzLCBvbmx5CisgICAgICAgICAgICAgKiB0aGUgQUNDX1BVQkxJQywgQUNDX1BSSVZBVEUsIEFDQ19QUk9URUNURUQsIEFDQ19TVEFUSUMsCisgICAgICAgICAgICAgKiBBQ0NfRklOQUwsIEFDQ19WT0xBVElMRSwgYW5kIEFDQ19UUkFOU0lFTlQgZmxhZ3MgYXJlIHVzZWQgd2hlbgorICAgICAgICAgICAgICogY29tcHV0aW5nIHNlcmlhbFZlcnNpb25VSUQgdmFsdWVzLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoKGFjY2VzcyAmIE9wY29kZXMuQUNDX1BSSVZBVEUpID09IDAKKyAgICAgICAgICAgICAgICAgICAgfHwgKGFjY2VzcyAmIChPcGNvZGVzLkFDQ19TVEFUSUMgfCBPcGNvZGVzLkFDQ19UUkFOU0lFTlQpKSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBtb2RzID0gYWNjZXNzCisgICAgICAgICAgICAgICAgJiAoT3Bjb2Rlcy5BQ0NfUFVCTElDIHwgT3Bjb2Rlcy5BQ0NfUFJJVkFURQorICAgICAgICAgICAgICAgICAgICAgICAgfCBPcGNvZGVzLkFDQ19QUk9URUNURUQgfCBPcGNvZGVzLkFDQ19TVEFUSUMKKyAgICAgICAgICAgICAgICAgICAgICAgIHwgT3Bjb2Rlcy5BQ0NfRklOQUwgfCBPcGNvZGVzLkFDQ19WT0xBVElMRSB8IE9wY29kZXMuQUNDX1RSQU5TSUVOVCk7CisgICAgICAgICAgICAgICAgc3Z1aWRGaWVsZHMuYWRkKG5ldyBJdGVtKG5hbWUsIG1vZHMsIGRlc2MpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzdXBlci52aXNpdEZpZWxkKGFjY2VzcywgbmFtZSwgZGVzYywgc2lnbmF0dXJlLCB2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSGFuZGxlIGEgYml6YXJyZSBzcGVjaWFsIGNhc2UuIE5lc3RlZCBjbGFzc2VzIChzdGF0aWMgY2xhc3NlcyBkZWNsYXJlZAorICAgICAqIGluc2lkZSBhbm90aGVyIGNsYXNzKSB0aGF0IGFyZSBwcm90ZWN0ZWQgaGF2ZSB0aGVpciBhY2Nlc3MgYml0IHNldCB0bworICAgICAqIHB1YmxpYyBpbiB0aGVpciBjbGFzcyBmaWxlcyB0byBkZWFsIHdpdGggc29tZSBvZGQgcmVmbGVjdGlvbiBzaXR1YXRpb24uCisgICAgICogT3VyIFNWVUlEIGNvbXB1dGF0aW9uIG11c3QgZG8gYXMgdGhlIEpWTSBkb2VzIGFuZCBpZ25vcmUgYWNjZXNzIGJpdHMgaW4KKyAgICAgKiB0aGUgY2xhc3MgZmlsZSBpbiBmYXZvciBvZiB0aGUgYWNjZXNzIGJpdHMgSW5uZXJDbGFzcyBhdHRyaWJ1dGUuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRJbm5lckNsYXNzKGZpbmFsIFN0cmluZyBhbmFtZSwgZmluYWwgU3RyaW5nIG91dGVyTmFtZSwgZmluYWwgU3RyaW5nIGlubmVyTmFtZSwgZmluYWwgaW50IGF0dHJfYWNjZXNzKSB7CisgICAgICAgIGlmICgobmFtZSAhPSBudWxsKSAmJiBuYW1lLmVxdWFscyhhbmFtZSkpIHsKKyAgICAgICAgICAgIHRoaXMuYWNjZXNzID0gYXR0cl9hY2Nlc3M7CisgICAgICAgIH0KKyAgICAgICAgc3VwZXIudmlzaXRJbm5lckNsYXNzKGFuYW1lLCBvdXRlck5hbWUsIGlubmVyTmFtZSwgYXR0cl9hY2Nlc3MpOworICAgIH0KKworICAgIC8qCisgICAgICogQWRkIHRoZSBTVlVJRCBpZiBjbGFzcyBkb2Vzbid0IGhhdmUgb25lCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRFbmQoKSB7CisgICAgICAgIC8vIGNvbXB1dGUgU1ZVSUQgYW5kIGFkZCBpdCB0byB0aGUgY2xhc3MKKyAgICAgICAgaWYgKGNvbXB1dGVTVlVJRCAmJiAhaGFzU1ZVSUQpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc3VwZXIudmlzaXRGaWVsZChPcGNvZGVzLkFDQ19GSU5BTCArIE9wY29kZXMuQUNDX1NUQVRJQywKKyAgICAgICAgICAgICAgICAgICAgICAgICJzZXJpYWxWZXJzaW9uVUlEIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJKIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTG9uZyhjb21wdXRlU1ZVSUQoKSkpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRXJyb3Igd2hpbGUgY29tcHV0aW5nIFNWVUlEIGZvciAiCisgICAgICAgICAgICAgICAgICAgICAgICArIG5hbWUsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3VwZXIudmlzaXRFbmQoKTsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBVdGlsaXR5IG1ldGhvZHMKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIFNWVUlEIGlmIHRoZSBjbGFzcyBkb2Vzbid0IGhhdmUgb25lIGFscmVhZHkuIFBsZWFzZQorICAgICAqIG5vdGUgdGhhdCAwIGlzIHJldHVybmVkIGlmIHRoZSBjbGFzcyBhbHJlYWR5IGhhcyBTVlVJRCwgdGh1cyB1c2UKKyAgICAgKiA8Y29kZT5pc0hhc1NWVUlEPC9jb2RlPiB0byBkZXRlcm1pbmUgaWYgdGhlIGNsYXNzIGFscmVhZHkgaGFkIGFuIFNWVUlELgorICAgICAqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzZXJpYWwgdmVyc2lvbiBVSUQKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgbG9uZyBjb21wdXRlU1ZVSUQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm9zOworICAgICAgICBEYXRhT3V0cHV0U3RyZWFtIGRvcyA9IG51bGw7CisgICAgICAgIGxvbmcgc3Z1aWQgPSAwOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBib3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgICAgICBkb3MgPSBuZXcgRGF0YU91dHB1dFN0cmVhbShib3MpOworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogMS4gVGhlIGNsYXNzIG5hbWUgd3JpdHRlbiB1c2luZyBVVEYgZW5jb2RpbmcuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGRvcy53cml0ZVVURihuYW1lLnJlcGxhY2UoJy8nLCAnLicpKTsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIDIuIFRoZSBjbGFzcyBtb2RpZmllcnMgd3JpdHRlbiBhcyBhIDMyLWJpdCBpbnRlZ2VyLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBkb3Mud3JpdGVJbnQoYWNjZXNzCisgICAgICAgICAgICAgICAgICAgICYgKE9wY29kZXMuQUNDX1BVQkxJQyB8IE9wY29kZXMuQUNDX0ZJTkFMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBPcGNvZGVzLkFDQ19JTlRFUkZBQ0UgfCBPcGNvZGVzLkFDQ19BQlNUUkFDVCkpOworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogMy4gVGhlIG5hbWUgb2YgZWFjaCBpbnRlcmZhY2Ugc29ydGVkIGJ5IG5hbWUgd3JpdHRlbiB1c2luZyBVVEYKKyAgICAgICAgICAgICAqIGVuY29kaW5nLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBBcnJheXMuc29ydChpbnRlcmZhY2VzKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW50ZXJmYWNlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGRvcy53cml0ZVVURihpbnRlcmZhY2VzW2ldLnJlcGxhY2UoJy8nLCAnLicpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIDQuIEZvciBlYWNoIGZpZWxkIG9mIHRoZSBjbGFzcyBzb3J0ZWQgYnkgZmllbGQgbmFtZSAoZXhjZXB0CisgICAgICAgICAgICAgKiBwcml2YXRlIHN0YXRpYyBhbmQgcHJpdmF0ZSB0cmFuc2llbnQgZmllbGRzKToKKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiAxLiBUaGUgbmFtZSBvZiB0aGUgZmllbGQgaW4gVVRGIGVuY29kaW5nLiAyLiBUaGUgbW9kaWZpZXJzIG9mIHRoZQorICAgICAgICAgICAgICogZmllbGQgd3JpdHRlbiBhcyBhIDMyLWJpdCBpbnRlZ2VyLiAzLiBUaGUgZGVzY3JpcHRvciBvZiB0aGUgZmllbGQKKyAgICAgICAgICAgICAqIGluIFVURiBlbmNvZGluZworICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIE5vdGUgdGhhdCBmaWVsZCBzaWduYXR1cmVzIGFyZSBub3QgZG90IHNlcGFyYXRlZC4gTWV0aG9kIGFuZAorICAgICAgICAgICAgICogY29uc3RydWN0b3Igc2lnbmF0dXJlcyBhcmUgZG90IHNlcGFyYXRlZC4gR28gZmlndXJlLi4uCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHdyaXRlSXRlbXMoc3Z1aWRGaWVsZHMsIGRvcywgZmFsc2UpOworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogNS4gSWYgYSBjbGFzcyBpbml0aWFsaXplciBleGlzdHMsIHdyaXRlIG91dCB0aGUgZm9sbG93aW5nOiAxLiBUaGUKKyAgICAgICAgICAgICAqIG5hbWUgb2YgdGhlIG1ldGhvZCwgPGNsaW5pdD4sIGluIFVURiBlbmNvZGluZy4gMi4gVGhlIG1vZGlmaWVyIG9mCisgICAgICAgICAgICAgKiB0aGUgbWV0aG9kLCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllci5TVEFUSUMsIHdyaXR0ZW4gYXMgYQorICAgICAgICAgICAgICogMzItYml0IGludGVnZXIuIDMuIFRoZSBkZXNjcmlwdG9yIG9mIHRoZSBtZXRob2QsICgpViwgaW4gVVRGCisgICAgICAgICAgICAgKiBlbmNvZGluZy4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKGhhc1N0YXRpY0luaXRpYWxpemVyKSB7CisgICAgICAgICAgICAgICAgZG9zLndyaXRlVVRGKCI8Y2xpbml0PiIpOworICAgICAgICAgICAgICAgIGRvcy53cml0ZUludChPcGNvZGVzLkFDQ19TVEFUSUMpOworICAgICAgICAgICAgICAgIGRvcy53cml0ZVVURigiKClWIik7CisgICAgICAgICAgICB9IC8vIGlmLi4KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIDYuIEZvciBlYWNoIG5vbi1wcml2YXRlIGNvbnN0cnVjdG9yIHNvcnRlZCBieSBtZXRob2QgbmFtZSBhbmQKKyAgICAgICAgICAgICAqIHNpZ25hdHVyZTogMS4gVGhlIG5hbWUgb2YgdGhlIG1ldGhvZCwgPGluaXQ+LCBpbiBVVEYgZW5jb2RpbmcuIDIuCisgICAgICAgICAgICAgKiBUaGUgbW9kaWZpZXJzIG9mIHRoZSBtZXRob2Qgd3JpdHRlbiBhcyBhIDMyLWJpdCBpbnRlZ2VyLiAzLiBUaGUKKyAgICAgICAgICAgICAqIGRlc2NyaXB0b3Igb2YgdGhlIG1ldGhvZCBpbiBVVEYgZW5jb2RpbmcuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHdyaXRlSXRlbXMoc3Z1aWRDb25zdHJ1Y3RvcnMsIGRvcywgdHJ1ZSk7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiA3LiBGb3IgZWFjaCBub24tcHJpdmF0ZSBtZXRob2Qgc29ydGVkIGJ5IG1ldGhvZCBuYW1lIGFuZAorICAgICAgICAgICAgICogc2lnbmF0dXJlOiAxLiBUaGUgbmFtZSBvZiB0aGUgbWV0aG9kIGluIFVURiBlbmNvZGluZy4gMi4gVGhlCisgICAgICAgICAgICAgKiBtb2RpZmllcnMgb2YgdGhlIG1ldGhvZCB3cml0dGVuIGFzIGEgMzItYml0IGludGVnZXIuIDMuIFRoZQorICAgICAgICAgICAgICogZGVzY3JpcHRvciBvZiB0aGUgbWV0aG9kIGluIFVURiBlbmNvZGluZy4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgd3JpdGVJdGVtcyhzdnVpZE1ldGhvZHMsIGRvcywgdHJ1ZSk7CisKKyAgICAgICAgICAgIGRvcy5mbHVzaCgpOworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogOC4gVGhlIFNIQS0xIGFsZ29yaXRobSBpcyBleGVjdXRlZCBvbiB0aGUgc3RyZWFtIG9mIGJ5dGVzCisgICAgICAgICAgICAgKiBwcm9kdWNlZCBieSBEYXRhT3V0cHV0U3RyZWFtIGFuZCBwcm9kdWNlcyBmaXZlIDMyLWJpdCB2YWx1ZXMKKyAgICAgICAgICAgICAqIHNoYVswLi40XS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgYnl0ZVtdIGhhc2hCeXRlcyA9IGNvbXB1dGVTSEFkaWdlc3QoYm9zLnRvQnl0ZUFycmF5KCkpOworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogOS4gVGhlIGhhc2ggdmFsdWUgaXMgYXNzZW1ibGVkIGZyb20gdGhlIGZpcnN0IGFuZCBzZWNvbmQgMzItYml0CisgICAgICAgICAgICAgKiB2YWx1ZXMgb2YgdGhlIFNIQS0xIG1lc3NhZ2UgZGlnZXN0LiBJZiB0aGUgcmVzdWx0IG9mIHRoZSBtZXNzYWdlCisgICAgICAgICAgICAgKiBkaWdlc3QsIHRoZSBmaXZlIDMyLWJpdCB3b3JkcyBIMCBIMSBIMiBIMyBINCwgaXMgaW4gYW4gYXJyYXkgb2YKKyAgICAgICAgICAgICAqIGZpdmUgaW50IHZhbHVlcyBuYW1lZCBzaGEsIHRoZSBoYXNoIHZhbHVlIHdvdWxkIGJlIGNvbXB1dGVkIGFzCisgICAgICAgICAgICAgKiBmb2xsb3dzOgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIGxvbmcgaGFzaCA9ICgoc2hhWzBdID4+PiAyNCkgJiAweEZGKSB8ICgoc2hhWzBdID4+PiAxNikgJiAweEZGKSA8PAorICAgICAgICAgICAgICogOCB8ICgoc2hhWzBdID4+PiA4KSAmIDB4RkYpIDw8IDE2IHwgKChzaGFbMF0gPj4+IDApICYgMHhGRikgPDwKKyAgICAgICAgICAgICAqIDI0IHwgKChzaGFbMV0gPj4+IDI0KSAmIDB4RkYpIDw8IDMyIHwgKChzaGFbMV0gPj4+IDE2KSAmIDB4RkYpIDw8CisgICAgICAgICAgICAgKiA0MCB8ICgoc2hhWzFdID4+PiA4KSAmIDB4RkYpIDw8IDQ4IHwgKChzaGFbMV0gPj4+IDApICYgMHhGRikgPDwKKyAgICAgICAgICAgICAqIDU2OworICAgICAgICAgICAgICovCisgICAgICAgICAgICBmb3IgKGludCBpID0gTWF0aC5taW4oaGFzaEJ5dGVzLmxlbmd0aCwgOCkgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgICAgIHN2dWlkID0gKHN2dWlkIDw8IDgpIHwgKGhhc2hCeXRlc1tpXSAmIDB4RkYpOworICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgLy8gY2xvc2UgdGhlIHN0cmVhbSAoaWYgb3BlbikKKyAgICAgICAgICAgIGlmIChkb3MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGRvcy5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHN2dWlkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIFNIQS0xIG1lc3NhZ2UgZGlnZXN0IG9mIHRoZSBnaXZlbiB2YWx1ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgd2hvc2UgU0hBIG1lc3NhZ2UgZGlnZXN0IG11c3QgYmUgY29tcHV0ZWQuCisgICAgICogQHJldHVybiB0aGUgU0hBLTEgbWVzc2FnZSBkaWdlc3Qgb2YgdGhlIGdpdmVuIHZhbHVlLgorICAgICAqLworICAgIHByb3RlY3RlZCBieXRlW10gY29tcHV0ZVNIQWRpZ2VzdChmaW5hbCBieXRlW10gdmFsdWUpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBNZXNzYWdlRGlnZXN0LmdldEluc3RhbmNlKCJTSEEiKS5kaWdlc3QodmFsdWUpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKGUudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTb3J0cyB0aGUgaXRlbXMgaW4gdGhlIGNvbGxlY3Rpb24gYW5kIHdyaXRlcyBpdCB0byB0aGUgZGF0YSBvdXRwdXQgc3RyZWFtCisgICAgICoKKyAgICAgKiBAcGFyYW0gaXRlbUNvbGxlY3Rpb24gY29sbGVjdGlvbiBvZiBpdGVtcworICAgICAqIEBwYXJhbSBkb3MgYSA8Y29kZT5EYXRhT3V0cHV0U3RyZWFtPC9jb2RlPiB2YWx1ZQorICAgICAqIEBwYXJhbSBkb3R0ZWQgYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZQorICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZUl0ZW1zKAorICAgICAgICBmaW5hbCBDb2xsZWN0aW9uPEl0ZW0+IGl0ZW1Db2xsZWN0aW9uLAorICAgICAgICBmaW5hbCBEYXRhT3V0cHV0IGRvcywKKyAgICAgICAgZmluYWwgYm9vbGVhbiBkb3R0ZWQpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaW50IHNpemUgPSBpdGVtQ29sbGVjdGlvbi5zaXplKCk7CisgICAgICAgIEl0ZW1bXSBpdGVtcyA9IGl0ZW1Db2xsZWN0aW9uLnRvQXJyYXkobmV3IEl0ZW1bc2l6ZV0pOworICAgICAgICBBcnJheXMuc29ydChpdGVtcyk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBkb3Mud3JpdGVVVEYoaXRlbXNbaV0ubmFtZSk7CisgICAgICAgICAgICBkb3Mud3JpdGVJbnQoaXRlbXNbaV0uYWNjZXNzKTsKKyAgICAgICAgICAgIGRvcy53cml0ZVVURihkb3R0ZWQKKyAgICAgICAgICAgICAgICAgICAgPyBpdGVtc1tpXS5kZXNjLnJlcGxhY2UoJy8nLCAnLicpCisgICAgICAgICAgICAgICAgICAgIDogaXRlbXNbaV0uZGVzYyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBJbm5lciBjbGFzc2VzCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBJdGVtIGltcGxlbWVudHMgQ29tcGFyYWJsZTxJdGVtPiB7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIG5hbWU7CisKKyAgICAgICAgZmluYWwgaW50IGFjY2VzczsKKworICAgICAgICBmaW5hbCBTdHJpbmcgZGVzYzsKKworICAgICAgICBJdGVtKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBpbnQgYWNjZXNzLCBmaW5hbCBTdHJpbmcgZGVzYykgeworICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgICAgIHRoaXMuYWNjZXNzID0gYWNjZXNzOworICAgICAgICAgICAgdGhpcy5kZXNjID0gZGVzYzsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKGZpbmFsIEl0ZW0gb3RoZXIpIHsKKyAgICAgICAgICAgIGludCByZXRWYWwgPSBuYW1lLmNvbXBhcmVUbyhvdGhlci5uYW1lKTsKKyAgICAgICAgICAgIGlmIChyZXRWYWwgPT0gMCkgeworICAgICAgICAgICAgICAgIHJldFZhbCA9IGRlc2MuY29tcGFyZVRvKG90aGVyLmRlc2MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJldFZhbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoZmluYWwgT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgSXRlbSkgeworICAgICAgICAgICAgICAgIHJldHVybiBjb21wYXJlVG8oKEl0ZW0pIG8pID09IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgICAgIHJldHVybiAobmFtZSArIGRlc2MpLmhhc2hDb2RlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL2NvbW1vbnMvU2ltcGxlUmVtYXBwZXIuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vY29tbW9ucy9TaW1wbGVSZW1hcHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2YjliYjUKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL2NvbW1vbnMvU2ltcGxlUmVtYXBwZXIuamF2YQpAQCAtMCwwICsxLDk4IEBACisvKgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBPcmFjbGUgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKKyAqIHF1ZXN0aW9ucy4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGlzIGF2YWlsYWJsZSB1bmRlciBhbmQgZ292ZXJuZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiBIb3dldmVyLCB0aGUgZm9sbG93aW5nIG5vdGljZSBhY2NvbXBhbmllZCB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGlzCisgKiBmaWxlOgorICoKKyAqIEFTTTogYSB2ZXJ5IHNtYWxsIGFuZCBmYXN0IEphdmEgYnl0ZWNvZGUgbWFuaXB1bGF0aW9uIGZyYW1ld29yaworICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMTEgSU5SSUEsIEZyYW5jZSBUZWxlY29tCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworcGFja2FnZSBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uY29tbW9uczsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIEEge0BsaW5rIFJlbWFwcGVyfSB1c2luZyBhIHtAbGluayBNYXB9IHRvIGRlZmluZSBpdHMgbWFwcGluZy4KKyAqCisgKiBAYXV0aG9yIEV1Z2VuZSBLdWxlc2hvdgorICovCitwdWJsaWMgY2xhc3MgU2ltcGxlUmVtYXBwZXIgZXh0ZW5kcyBSZW1hcHBlciB7CisKKyAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gbWFwcGluZzsKKworICAgIHB1YmxpYyBTaW1wbGVSZW1hcHBlcihNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcHBpbmcpIHsKKyAgICAgICAgdGhpcy5tYXBwaW5nID0gbWFwcGluZzsKKyAgICB9CisKKyAgICBwdWJsaWMgU2ltcGxlUmVtYXBwZXIoU3RyaW5nIG9sZE5hbWUsIFN0cmluZyBuZXdOYW1lKSB7CisgICAgICAgIHRoaXMubWFwcGluZyA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbk1hcChvbGROYW1lLCBuZXdOYW1lKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIG1hcE1ldGhvZE5hbWUoU3RyaW5nIG93bmVyLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGRlc2MpIHsKKyAgICAgICAgU3RyaW5nIHMgPSBtYXAob3duZXIgKyAnLicgKyBuYW1lICsgZGVzYyk7CisgICAgICAgIHJldHVybiBzID09IG51bGwgPyBuYW1lIDogczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIG1hcEZpZWxkTmFtZShTdHJpbmcgb3duZXIsIFN0cmluZyBuYW1lLCBTdHJpbmcgZGVzYykgeworICAgICAgICBTdHJpbmcgcyA9IG1hcChvd25lciArICcuJyArIG5hbWUpOworICAgICAgICByZXR1cm4gcyA9PSBudWxsID8gbmFtZSA6IHM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBtYXAoU3RyaW5nIGtleSkgeworICAgICAgICByZXR1cm4gbWFwcGluZy5nZXQoa2V5KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL2NvbW1vbnMvU3RhdGljSW5pdE1lcmdlci5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS9jb21tb25zL1N0YXRpY0luaXRNZXJnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDU5NzM0Ci0tLSAvZGV2L251bGwKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS9jb21tb25zL1N0YXRpY0luaXRNZXJnZXIuamF2YQpAQCAtMCwwICsxLDEzOCBAQAorLyoKKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgT3JhY2xlIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCisgKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CisgKiBxdWVzdGlvbnMuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBpcyBhdmFpbGFibGUgdW5kZXIgYW5kIGdvdmVybmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogSG93ZXZlciwgdGhlIGZvbGxvd2luZyBub3RpY2UgYWNjb21wYW5pZWQgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhpcworICogZmlsZToKKyAqCisgKiBBU006IGEgdmVyeSBzbWFsbCBhbmQgZmFzdCBKYXZhIGJ5dGVjb2RlIG1hbmlwdWxhdGlvbiBmcmFtZXdvcmsKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDExIElOUklBLCBGcmFuY2UgVGVsZWNvbQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5jb21tb25zOworCitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLkNsYXNzVmlzaXRvcjsKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uTWV0aG9kVmlzaXRvcjsKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uT3Bjb2RlczsKKworLyoqCisgKiBBIHtAbGluayBDbGFzc1Zpc2l0b3J9IHRoYXQgbWVyZ2VzIGNsaW5pdCBtZXRob2RzIGludG8gYSBzaW5nbGUgb25lLgorICoKKyAqIEBhdXRob3IgRXJpYyBCcnVuZXRvbgorICovCitwdWJsaWMgY2xhc3MgU3RhdGljSW5pdE1lcmdlciBleHRlbmRzIENsYXNzVmlzaXRvciB7CisKKyAgICBwcml2YXRlIFN0cmluZyBuYW1lOworCisgICAgcHJpdmF0ZSBNZXRob2RWaXNpdG9yIGNsaW5pdDsKKworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHByZWZpeDsKKworICAgIHByaXZhdGUgaW50IGNvdW50ZXI7CisKKyAgICBwdWJsaWMgU3RhdGljSW5pdE1lcmdlcihmaW5hbCBTdHJpbmcgcHJlZml4LCBmaW5hbCBDbGFzc1Zpc2l0b3IgY3YpIHsKKyAgICAgICAgdGhpcyhPcGNvZGVzLkFTTTQsIHByZWZpeCwgY3YpOworICAgIH0KKworICAgIHByb3RlY3RlZCBTdGF0aWNJbml0TWVyZ2VyKAorICAgICAgICBmaW5hbCBpbnQgYXBpLAorICAgICAgICBmaW5hbCBTdHJpbmcgcHJlZml4LAorICAgICAgICBmaW5hbCBDbGFzc1Zpc2l0b3IgY3YpCisgICAgeworICAgICAgICBzdXBlcihhcGksIGN2KTsKKyAgICAgICAgdGhpcy5wcmVmaXggPSBwcmVmaXg7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoCisgICAgICAgIGZpbmFsIGludCB2ZXJzaW9uLAorICAgICAgICBmaW5hbCBpbnQgYWNjZXNzLAorICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSwKKyAgICAgICAgZmluYWwgU3RyaW5nIHNpZ25hdHVyZSwKKyAgICAgICAgZmluYWwgU3RyaW5nIHN1cGVyTmFtZSwKKyAgICAgICAgZmluYWwgU3RyaW5nW10gaW50ZXJmYWNlcykKKyAgICB7CisgICAgICAgIGN2LnZpc2l0KHZlcnNpb24sIGFjY2VzcywgbmFtZSwgc2lnbmF0dXJlLCBzdXBlck5hbWUsIGludGVyZmFjZXMpOworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBNZXRob2RWaXNpdG9yIHZpc2l0TWV0aG9kKAorICAgICAgICBmaW5hbCBpbnQgYWNjZXNzLAorICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSwKKyAgICAgICAgZmluYWwgU3RyaW5nIGRlc2MsCisgICAgICAgIGZpbmFsIFN0cmluZyBzaWduYXR1cmUsCisgICAgICAgIGZpbmFsIFN0cmluZ1tdIGV4Y2VwdGlvbnMpCisgICAgeworICAgICAgICBNZXRob2RWaXNpdG9yIG12OworICAgICAgICBpZiAoIjxjbGluaXQ+Ii5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgIGludCBhID0gT3Bjb2Rlcy5BQ0NfUFJJVkFURSArIE9wY29kZXMuQUNDX1NUQVRJQzsKKyAgICAgICAgICAgIFN0cmluZyBuID0gcHJlZml4ICsgY291bnRlcisrOworICAgICAgICAgICAgbXYgPSBjdi52aXNpdE1ldGhvZChhLCBuLCBkZXNjLCBzaWduYXR1cmUsIGV4Y2VwdGlvbnMpOworCisgICAgICAgICAgICBpZiAoY2xpbml0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjbGluaXQgPSBjdi52aXNpdE1ldGhvZChhLCBuYW1lLCBkZXNjLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNsaW5pdC52aXNpdE1ldGhvZEluc24oT3Bjb2Rlcy5JTlZPS0VTVEFUSUMsIHRoaXMubmFtZSwgbiwgZGVzYyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtdiA9IGN2LnZpc2l0TWV0aG9kKGFjY2VzcywgbmFtZSwgZGVzYywgc2lnbmF0dXJlLCBleGNlcHRpb25zKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbXY7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRFbmQoKSB7CisgICAgICAgIGlmIChjbGluaXQgIT0gbnVsbCkgeworICAgICAgICAgICAgY2xpbml0LnZpc2l0SW5zbihPcGNvZGVzLlJFVFVSTik7CisgICAgICAgICAgICBjbGluaXQudmlzaXRNYXhzKDAsIDApOworICAgICAgICB9CisgICAgICAgIGN2LnZpc2l0RW5kKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS9jb21tb25zL1RhYmxlU3dpdGNoR2VuZXJhdG9yLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL2NvbW1vbnMvVGFibGVTd2l0Y2hHZW5lcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTAwOTgzCi0tLSAvZGV2L251bGwKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS9jb21tb25zL1RhYmxlU3dpdGNoR2VuZXJhdG9yLmphdmEKQEAgLTAsMCArMSw4NCBAQAorLyoKKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgT3JhY2xlIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCisgKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CisgKiBxdWVzdGlvbnMuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBpcyBhdmFpbGFibGUgdW5kZXIgYW5kIGdvdmVybmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogSG93ZXZlciwgdGhlIGZvbGxvd2luZyBub3RpY2UgYWNjb21wYW5pZWQgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhpcworICogZmlsZToKKyAqCisgKiBBU006IGEgdmVyeSBzbWFsbCBhbmQgZmFzdCBKYXZhIGJ5dGVjb2RlIG1hbmlwdWxhdGlvbiBmcmFtZXdvcmsKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDExIElOUklBLCBGcmFuY2UgVGVsZWNvbQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5jb21tb25zOworCitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLkxhYmVsOworCisvKioKKyAqIEEgY29kZSBnZW5lcmF0b3IgZm9yIHN3aXRjaCBzdGF0ZW1lbnRzLgorICoKKyAqIEBhdXRob3IgSnVvemFzIEJhbGl1a2EKKyAqIEBhdXRob3IgQ2hyaXMgTm9rbGViZXJnCisgKiBAYXV0aG9yIEVyaWMgQnJ1bmV0b24KKyAqLworcHVibGljIGludGVyZmFjZSBUYWJsZVN3aXRjaEdlbmVyYXRvciB7CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZXMgdGhlIGNvZGUgZm9yIGEgc3dpdGNoIGNhc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5IHRoZSBzd2l0Y2ggY2FzZSBrZXkuCisgICAgICogQHBhcmFtIGVuZCBhIGxhYmVsIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGVuZCBvZiB0aGUgc3dpdGNoIHN0YXRlbWVudC4KKyAgICAgKi8KKyAgICB2b2lkIGdlbmVyYXRlQ2FzZShpbnQga2V5LCBMYWJlbCBlbmQpOworCisgICAgLyoqCisgICAgICogR2VuZXJhdGVzIHRoZSBjb2RlIGZvciB0aGUgZGVmYXVsdCBzd2l0Y2ggY2FzZS4KKyAgICAgKi8KKyAgICB2b2lkIGdlbmVyYXRlRGVmYXVsdCgpOworfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS9jb21tb25zL1RyeUNhdGNoQmxvY2tTb3J0ZXIuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vY29tbW9ucy9UcnlDYXRjaEJsb2NrU29ydGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQwMjRlMwotLS0gL2Rldi9udWxsCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vY29tbW9ucy9UcnlDYXRjaEJsb2NrU29ydGVyLmphdmEKQEAgLTAsMCArMSwxMzIgQEAKKy8qCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IE9yYWNsZSBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQorICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQorICogcXVlc3Rpb25zLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgaXMgYXZhaWxhYmxlIHVuZGVyIGFuZCBnb3Zlcm5lZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIEhvd2V2ZXIsIHRoZSBmb2xsb3dpbmcgbm90aWNlIGFjY29tcGFuaWVkIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoaXMKKyAqIGZpbGU6CisgKgorICogQVNNOiBhIHZlcnkgc21hbGwgYW5kIGZhc3QgSmF2YSBieXRlY29kZSBtYW5pcHVsYXRpb24gZnJhbWV3b3JrCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAxMSBJTlJJQSwgRnJhbmNlIFRlbGVjb20KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCitwYWNrYWdlIGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5jb21tb25zOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworCitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLk1ldGhvZFZpc2l0b3I7CitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLk9wY29kZXM7CitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLnRyZWUuTWV0aG9kTm9kZTsKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20udHJlZS5UcnlDYXRjaEJsb2NrTm9kZTsKKworLyoqCisgKiBBIHtAbGluayBNZXRob2RWaXNpdG9yfSBhZGFwdGVyIHRvIHNvcnQgdGhlIGV4Y2VwdGlvbiBoYW5kbGVycy4gVGhlIGhhbmRsZXJzCisgKiBhcmUgc29ydGVkIGluIGEgbWV0aG9kIGlubmVybW9zdC10by1vdXRlcm1vc3QuIFRoaXMgYWxsb3dzIHRoZSBwcm9ncmFtbWVyIHRvCisgKiBhZGQgaGFuZGxlcnMgd2l0aG91dCB3b3JyeWluZyBhYm91dCBvcmRlcmluZyB0aGVtIGNvcnJlY3RseSB3aXRoIHJlc3BlY3QgdG8KKyAqIGV4aXN0aW5nLCBpbi1jb2RlIGhhbmRsZXJzLgorICoKKyAqIEJlaGF2aW9yIGlzIG9ubHkgZGVmaW5lZCBmb3IgcHJvcGVybHktbmVzdGVkIGhhbmRsZXJzLiBJZiBhbnkgInRyeSIgYmxvY2tzCisgKiBvdmVybGFwIChzb21ldGhpbmcgdGhhdCBpc24ndCBwb3NzaWJsZSBpbiBKYXZhIGNvZGUpIHRoZW4gdGhpcyBtYXkgbm90IGRvCisgKiB3aGF0IHlvdSB3YW50LiBJbiBmYWN0LCB0aGlzIGFkYXB0ZXIganVzdCBzb3J0cyBieSB0aGUgbGVuZ3RoIG9mIHRoZSAidHJ5IgorICogYmxvY2ssIHRha2luZyBhZHZhbnRhZ2Ugb2YgdGhlIGZhY3QgdGhhdCBhIGdpdmVuIHRyeSBibG9jayBtdXN0IGJlIGxhcmdlcgorICogdGhhbiBhbnkgYmxvY2sgaXQgY29udGFpbnMpLgorICoKKyAqIEBhdXRob3IgQWRyaWFuIFNhbXBzb24KKyAqLworcHVibGljIGNsYXNzIFRyeUNhdGNoQmxvY2tTb3J0ZXIgZXh0ZW5kcyBNZXRob2ROb2RlIHsKKworICAgIHB1YmxpYyBUcnlDYXRjaEJsb2NrU29ydGVyKAorICAgICAgICBmaW5hbCBNZXRob2RWaXNpdG9yIG12LAorICAgICAgICBmaW5hbCBpbnQgYWNjZXNzLAorICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSwKKyAgICAgICAgZmluYWwgU3RyaW5nIGRlc2MsCisgICAgICAgIGZpbmFsIFN0cmluZyBzaWduYXR1cmUsCisgICAgICAgIGZpbmFsIFN0cmluZ1tdIGV4Y2VwdGlvbnMpCisgICAgeworICAgICAgICB0aGlzKE9wY29kZXMuQVNNNCwgbXYsIGFjY2VzcywgbmFtZSwgZGVzYywgc2lnbmF0dXJlLCBleGNlcHRpb25zKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgVHJ5Q2F0Y2hCbG9ja1NvcnRlcigKKyAgICAgICAgZmluYWwgaW50IGFwaSwKKyAgICAgICAgZmluYWwgTWV0aG9kVmlzaXRvciBtdiwKKyAgICAgICAgZmluYWwgaW50IGFjY2VzcywKKyAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUsCisgICAgICAgIGZpbmFsIFN0cmluZyBkZXNjLAorICAgICAgICBmaW5hbCBTdHJpbmcgc2lnbmF0dXJlLAorICAgICAgICBmaW5hbCBTdHJpbmdbXSBleGNlcHRpb25zKQorICAgIHsKKyAgICAgICAgc3VwZXIoYXBpLCBhY2Nlc3MsIG5hbWUsIGRlc2MsIHNpZ25hdHVyZSwgZXhjZXB0aW9ucyk7CisgICAgICAgIHRoaXMubXYgPSBtdjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEVuZCgpIHsKKyAgICAgICAgLy8gQ29tcGFyZXMgVHJ5Q2F0Y2hCbG9ja05vZGVzIGJ5IHRoZSBsZW5ndGggb2YgdGhlaXIgInRyeSIgYmxvY2suCisgICAgICAgIENvbXBhcmF0b3I8VHJ5Q2F0Y2hCbG9ja05vZGU+IGNvbXAgPSBuZXcgQ29tcGFyYXRvcjxUcnlDYXRjaEJsb2NrTm9kZT4oKSB7CisKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShUcnlDYXRjaEJsb2NrTm9kZSB0MSwgVHJ5Q2F0Y2hCbG9ja05vZGUgdDIpIHsKKyAgICAgICAgICAgICAgICBpbnQgbGVuMSA9IGJsb2NrTGVuZ3RoKHQxKTsKKyAgICAgICAgICAgICAgICBpbnQgbGVuMiA9IGJsb2NrTGVuZ3RoKHQyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbGVuMSAtIGxlbjI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByaXZhdGUgaW50IGJsb2NrTGVuZ3RoKFRyeUNhdGNoQmxvY2tOb2RlIGJsb2NrKSB7CisgICAgICAgICAgICAgICAgaW50IHN0YXJ0aWR4ID0gaW5zdHJ1Y3Rpb25zLmluZGV4T2YoYmxvY2suc3RhcnQpOworICAgICAgICAgICAgICAgIGludCBlbmRpZHggPSBpbnN0cnVjdGlvbnMuaW5kZXhPZihibG9jay5lbmQpOworICAgICAgICAgICAgICAgIHJldHVybiBlbmRpZHggLSBzdGFydGlkeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgQ29sbGVjdGlvbnMuc29ydCh0cnlDYXRjaEJsb2NrcywgY29tcCk7CisgICAgICAgIGlmIChtdiAhPSBudWxsKSB7CisgICAgICAgICAgICBhY2NlcHQobXYpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS9zaWduYXR1cmUvU2lnbmF0dXJlUmVhZGVyLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL3NpZ25hdHVyZS9TaWduYXR1cmVSZWFkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzM3YzEyCi0tLSAvZGV2L251bGwKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS9zaWduYXR1cmUvU2lnbmF0dXJlUmVhZGVyLmphdmEKQEAgLTAsMCArMSwyNTggQEAKKy8qCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IE9yYWNsZSBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQorICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQorICogcXVlc3Rpb25zLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgaXMgYXZhaWxhYmxlIHVuZGVyIGFuZCBnb3Zlcm5lZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIEhvd2V2ZXIsIHRoZSBmb2xsb3dpbmcgbm90aWNlIGFjY29tcGFuaWVkIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoaXMKKyAqIGZpbGU6CisgKgorICogQVNNOiBhIHZlcnkgc21hbGwgYW5kIGZhc3QgSmF2YSBieXRlY29kZSBtYW5pcHVsYXRpb24gZnJhbWV3b3JrCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAxMSBJTlJJQSwgRnJhbmNlIFRlbGVjb20KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uc2lnbmF0dXJlOworCisvKioKKyAqIEEgdHlwZSBzaWduYXR1cmUgcGFyc2VyIHRvIG1ha2UgYSBzaWduYXR1cmUgdmlzaXRvciB2aXNpdCBhbiBleGlzdGluZworICogc2lnbmF0dXJlLgorICoKKyAqIEBhdXRob3IgVGhvbWFzIEhhbGxncmVuCisgKiBAYXV0aG9yIEVyaWMgQnJ1bmV0b24KKyAqLworcHVibGljIGNsYXNzIFNpZ25hdHVyZVJlYWRlciB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc2lnbmF0dXJlIHRvIGJlIHJlYWQuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgc2lnbmF0dXJlOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIHtAbGluayBTaWduYXR1cmVSZWFkZXJ9IGZvciB0aGUgZ2l2ZW4gc2lnbmF0dXJlLgorICAgICAqCisgICAgICogQHBhcmFtIHNpZ25hdHVyZSBBIDxpPkNsYXNzU2lnbmF0dXJlPC9pPiwgPGk+TWV0aG9kVHlwZVNpZ25hdHVyZTwvaT4sCisgICAgICogICAgICAgIG9yIDxpPkZpZWxkVHlwZVNpZ25hdHVyZTwvaT4uCisgICAgICovCisgICAgcHVibGljIFNpZ25hdHVyZVJlYWRlcihmaW5hbCBTdHJpbmcgc2lnbmF0dXJlKSB7CisgICAgICAgIHRoaXMuc2lnbmF0dXJlID0gc2lnbmF0dXJlOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1ha2VzIHRoZSBnaXZlbiB2aXNpdG9yIHZpc2l0IHRoZSBzaWduYXR1cmUgb2YgdGhpcworICAgICAqIHtAbGluayBTaWduYXR1cmVSZWFkZXJ9LiBUaGlzIHNpZ25hdHVyZSBpcyB0aGUgb25lIHNwZWNpZmllZCBpbiB0aGUKKyAgICAgKiBjb25zdHJ1Y3RvciAoc2VlIHtAbGluayAjU2lnbmF0dXJlUmVhZGVyKFN0cmluZykgU2lnbmF0dXJlUmVhZGVyfSkuIFRoaXMKKyAgICAgKiBtZXRob2QgaXMgaW50ZW5kZWQgdG8gYmUgY2FsbGVkIG9uIGEge0BsaW5rIFNpZ25hdHVyZVJlYWRlcn0gdGhhdCB3YXMKKyAgICAgKiBjcmVhdGVkIHVzaW5nIGEgPGk+Q2xhc3NTaWduYXR1cmU8L2k+IChzdWNoIGFzIHRoZQorICAgICAqIDxjb2RlPnNpZ25hdHVyZTwvY29kZT4gcGFyYW1ldGVyIG9mIHRoZQorICAgICAqIHtAbGluayBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uQ2xhc3NWaXNpdG9yI3Zpc2l0IENsYXNzVmlzaXRvci52aXNpdH0gbWV0aG9kKQorICAgICAqIG9yIGEgPGk+TWV0aG9kVHlwZVNpZ25hdHVyZTwvaT4gKHN1Y2ggYXMgdGhlIDxjb2RlPnNpZ25hdHVyZTwvY29kZT4KKyAgICAgKiBwYXJhbWV0ZXIgb2YgdGhlCisgICAgICoge0BsaW5rIGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5DbGFzc1Zpc2l0b3IjdmlzaXRNZXRob2QgQ2xhc3NWaXNpdG9yLnZpc2l0TWV0aG9kfQorICAgICAqIG1ldGhvZCkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdiB0aGUgdmlzaXRvciB0aGF0IG11c3QgdmlzaXQgdGhpcyBzaWduYXR1cmUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWNjZXB0KGZpbmFsIFNpZ25hdHVyZVZpc2l0b3IgdikgeworICAgICAgICBTdHJpbmcgc2lnbmF0dXJlID0gdGhpcy5zaWduYXR1cmU7CisgICAgICAgIGludCBsZW4gPSBzaWduYXR1cmUubGVuZ3RoKCk7CisgICAgICAgIGludCBwb3M7CisgICAgICAgIGNoYXIgYzsKKworICAgICAgICBpZiAoc2lnbmF0dXJlLmNoYXJBdCgwKSA9PSAnPCcpIHsKKyAgICAgICAgICAgIHBvcyA9IDI7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaW50IGVuZCA9IHNpZ25hdHVyZS5pbmRleE9mKCc6JywgcG9zKTsKKyAgICAgICAgICAgICAgICB2LnZpc2l0Rm9ybWFsVHlwZVBhcmFtZXRlcihzaWduYXR1cmUuc3Vic3RyaW5nKHBvcyAtIDEsIGVuZCkpOworICAgICAgICAgICAgICAgIHBvcyA9IGVuZCArIDE7CisKKyAgICAgICAgICAgICAgICBjID0gc2lnbmF0dXJlLmNoYXJBdChwb3MpOworICAgICAgICAgICAgICAgIGlmIChjID09ICdMJyB8fCBjID09ICdbJyB8fCBjID09ICdUJykgeworICAgICAgICAgICAgICAgICAgICBwb3MgPSBwYXJzZVR5cGUoc2lnbmF0dXJlLCBwb3MsIHYudmlzaXRDbGFzc0JvdW5kKCkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHdoaWxlICgoYyA9IHNpZ25hdHVyZS5jaGFyQXQocG9zKyspKSA9PSAnOicpIHsKKyAgICAgICAgICAgICAgICAgICAgcG9zID0gcGFyc2VUeXBlKHNpZ25hdHVyZSwgcG9zLCB2LnZpc2l0SW50ZXJmYWNlQm91bmQoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB3aGlsZSAoYyAhPSAnPicpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcG9zID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzaWduYXR1cmUuY2hhckF0KHBvcykgPT0gJygnKSB7CisgICAgICAgICAgICBwb3MrKzsKKyAgICAgICAgICAgIHdoaWxlIChzaWduYXR1cmUuY2hhckF0KHBvcykgIT0gJyknKSB7CisgICAgICAgICAgICAgICAgcG9zID0gcGFyc2VUeXBlKHNpZ25hdHVyZSwgcG9zLCB2LnZpc2l0UGFyYW1ldGVyVHlwZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBvcyA9IHBhcnNlVHlwZShzaWduYXR1cmUsIHBvcyArIDEsIHYudmlzaXRSZXR1cm5UeXBlKCkpOworICAgICAgICAgICAgd2hpbGUgKHBvcyA8IGxlbikgeworICAgICAgICAgICAgICAgIHBvcyA9IHBhcnNlVHlwZShzaWduYXR1cmUsIHBvcyArIDEsIHYudmlzaXRFeGNlcHRpb25UeXBlKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcG9zID0gcGFyc2VUeXBlKHNpZ25hdHVyZSwgcG9zLCB2LnZpc2l0U3VwZXJjbGFzcygpKTsKKyAgICAgICAgICAgIHdoaWxlIChwb3MgPCBsZW4pIHsKKyAgICAgICAgICAgICAgICBwb3MgPSBwYXJzZVR5cGUoc2lnbmF0dXJlLCBwb3MsIHYudmlzaXRJbnRlcmZhY2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYWtlcyB0aGUgZ2l2ZW4gdmlzaXRvciB2aXNpdCB0aGUgc2lnbmF0dXJlIG9mIHRoaXMKKyAgICAgKiB7QGxpbmsgU2lnbmF0dXJlUmVhZGVyfS4gVGhpcyBzaWduYXR1cmUgaXMgdGhlIG9uZSBzcGVjaWZpZWQgaW4gdGhlCisgICAgICogY29uc3RydWN0b3IgKHNlZSB7QGxpbmsgI1NpZ25hdHVyZVJlYWRlcihTdHJpbmcpIFNpZ25hdHVyZVJlYWRlcn0pLiBUaGlzCisgICAgICogbWV0aG9kIGlzIGludGVuZGVkIHRvIGJlIGNhbGxlZCBvbiBhIHtAbGluayBTaWduYXR1cmVSZWFkZXJ9IHRoYXQgd2FzCisgICAgICogY3JlYXRlZCB1c2luZyBhIDxpPkZpZWxkVHlwZVNpZ25hdHVyZTwvaT4sIHN1Y2ggYXMgdGhlCisgICAgICogPGNvZGU+c2lnbmF0dXJlPC9jb2RlPiBwYXJhbWV0ZXIgb2YgdGhlCisgICAgICoge0BsaW5rIGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5DbGFzc1Zpc2l0b3IjdmlzaXRGaWVsZAorICAgICAqIENsYXNzVmlzaXRvci52aXNpdEZpZWxkfSBvciB7QGxpbmsKKyAgICAgKiBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uTWV0aG9kVmlzaXRvciN2aXNpdExvY2FsVmFyaWFibGUKKyAgICAgKiBNZXRob2RWaXNpdG9yLnZpc2l0TG9jYWxWYXJpYWJsZX0gbWV0aG9kcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2IHRoZSB2aXNpdG9yIHRoYXQgbXVzdCB2aXNpdCB0aGlzIHNpZ25hdHVyZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhY2NlcHRUeXBlKGZpbmFsIFNpZ25hdHVyZVZpc2l0b3IgdikgeworICAgICAgICBwYXJzZVR5cGUodGhpcy5zaWduYXR1cmUsIDAsIHYpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlcyBhIGZpZWxkIHR5cGUgc2lnbmF0dXJlIGFuZCBtYWtlcyB0aGUgZ2l2ZW4gdmlzaXRvciB2aXNpdCBpdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzaWduYXR1cmUgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgc2lnbmF0dXJlIHRoYXQgbXVzdCBiZSBwYXJzZWQuCisgICAgICogQHBhcmFtIHBvcyBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBzaWduYXR1cmUgdG8gcGFyc2VkLgorICAgICAqIEBwYXJhbSB2IHRoZSB2aXNpdG9yIHRoYXQgbXVzdCB2aXNpdCB0aGlzIHNpZ25hdHVyZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIGFmdGVyIHRoZSBwYXJzZWQgc2lnbmF0dXJlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGludCBwYXJzZVR5cGUoCisgICAgICAgIGZpbmFsIFN0cmluZyBzaWduYXR1cmUsCisgICAgICAgIGludCBwb3MsCisgICAgICAgIGZpbmFsIFNpZ25hdHVyZVZpc2l0b3IgdikKKyAgICB7CisgICAgICAgIGNoYXIgYzsKKyAgICAgICAgaW50IHN0YXJ0LCBlbmQ7CisgICAgICAgIGJvb2xlYW4gdmlzaXRlZCwgaW5uZXI7CisgICAgICAgIFN0cmluZyBuYW1lOworCisgICAgICAgIHN3aXRjaCAoYyA9IHNpZ25hdHVyZS5jaGFyQXQocG9zKyspKSB7CisgICAgICAgICAgICBjYXNlICdaJzoKKyAgICAgICAgICAgIGNhc2UgJ0MnOgorICAgICAgICAgICAgY2FzZSAnQic6CisgICAgICAgICAgICBjYXNlICdTJzoKKyAgICAgICAgICAgIGNhc2UgJ0knOgorICAgICAgICAgICAgY2FzZSAnRic6CisgICAgICAgICAgICBjYXNlICdKJzoKKyAgICAgICAgICAgIGNhc2UgJ0QnOgorICAgICAgICAgICAgY2FzZSAnVic6CisgICAgICAgICAgICAgICAgdi52aXNpdEJhc2VUeXBlKGMpOworICAgICAgICAgICAgICAgIHJldHVybiBwb3M7CisKKyAgICAgICAgICAgIGNhc2UgJ1snOgorICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZVR5cGUoc2lnbmF0dXJlLCBwb3MsIHYudmlzaXRBcnJheVR5cGUoKSk7CisKKyAgICAgICAgICAgIGNhc2UgJ1QnOgorICAgICAgICAgICAgICAgIGVuZCA9IHNpZ25hdHVyZS5pbmRleE9mKCc7JywgcG9zKTsKKyAgICAgICAgICAgICAgICB2LnZpc2l0VHlwZVZhcmlhYmxlKHNpZ25hdHVyZS5zdWJzdHJpbmcocG9zLCBlbmQpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZW5kICsgMTsKKworICAgICAgICAgICAgZGVmYXVsdDogLy8gY2FzZSAnTCc6CisgICAgICAgICAgICAgICAgc3RhcnQgPSBwb3M7CisgICAgICAgICAgICAgICAgdmlzaXRlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGlubmVyID0gZmFsc2U7CisgICAgICAgICAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGMgPSBzaWduYXR1cmUuY2hhckF0KHBvcysrKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnLic6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICc7JzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXZpc2l0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHNpZ25hdHVyZS5zdWJzdHJpbmcoc3RhcnQsIHBvcyAtIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5uZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYudmlzaXRJbm5lckNsYXNzVHlwZShuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYudmlzaXRDbGFzc1R5cGUobmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT0gJzsnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYudmlzaXRFbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBvczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBwb3M7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlzaXRlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubmVyID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnPCc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHNpZ25hdHVyZS5zdWJzdHJpbmcoc3RhcnQsIHBvcyAtIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbm5lcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LnZpc2l0SW5uZXJDbGFzc1R5cGUobmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi52aXNpdENsYXNzVHlwZShuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlzaXRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wOiBmb3IgKDs7KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYyA9IHNpZ25hdHVyZS5jaGFyQXQocG9zKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnPic6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgdG9wOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnKic6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytwb3M7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi52aXNpdFR5cGVBcmd1bWVudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnKyc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICctJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3MgPSBwYXJzZVR5cGUoc2lnbmF0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYudmlzaXRUeXBlQXJndW1lbnQoYykpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3MgPSBwYXJzZVR5cGUoc2lnbmF0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi52aXNpdFR5cGVBcmd1bWVudCgnPScpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vc2lnbmF0dXJlL1NpZ25hdHVyZVZpc2l0b3IuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vc2lnbmF0dXJlL1NpZ25hdHVyZVZpc2l0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzY5OWMxCi0tLSAvZGV2L251bGwKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS9zaWduYXR1cmUvU2lnbmF0dXJlVmlzaXRvci5qYXZhCkBAIC0wLDAgKzEsMjU3IEBACisvKgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBPcmFjbGUgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKKyAqIHF1ZXN0aW9ucy4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGlzIGF2YWlsYWJsZSB1bmRlciBhbmQgZ292ZXJuZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiBIb3dldmVyLCB0aGUgZm9sbG93aW5nIG5vdGljZSBhY2NvbXBhbmllZCB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGlzCisgKiBmaWxlOgorICoKKyAqIEFTTTogYSB2ZXJ5IHNtYWxsIGFuZCBmYXN0IEphdmEgYnl0ZWNvZGUgbWFuaXB1bGF0aW9uIGZyYW1ld29yaworICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMTEgSU5SSUEsIEZyYW5jZSBUZWxlY29tCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2UgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLnNpZ25hdHVyZTsKKworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5PcGNvZGVzOworCisvKioKKyAqIEEgdmlzaXRvciB0byB2aXNpdCBhIGdlbmVyaWMgc2lnbmF0dXJlLiBUaGUgbWV0aG9kcyBvZiB0aGlzIGludGVyZmFjZSBtdXN0IGJlCisgKiBjYWxsZWQgaW4gb25lIG9mIHRoZSB0aHJlZSBmb2xsb3dpbmcgb3JkZXJzICh0aGUgbGFzdCBvbmUgaXMgdGhlIG9ubHkgdmFsaWQKKyAqIG9yZGVyIGZvciBhIHtAbGluayBTaWduYXR1cmVWaXNpdG9yfSB0aGF0IGlzIHJldHVybmVkIGJ5IGEgbWV0aG9kIG9mIHRoaXMKKyAqIGludGVyZmFjZSk6IDx1bD4gPGxpPjxpPkNsYXNzU2lnbmF0dXJlPC9pPiA9ICgKKyAqIDx0dD52aXNpdEZvcm1hbFR5cGVQYXJhbWV0ZXI8L3R0PgorICogICA8dHQ+dmlzaXRDbGFzc0JvdW5kPC90dD4/CisgKiA8dHQ+dmlzaXRJbnRlcmZhY2VCb3VuZDwvdHQ+KiApKiAoIDx0dD52aXNpdFN1cGVyQ2xhc3M8L3R0PgorICogICA8dHQ+dmlzaXRJbnRlcmZhY2U8L3R0PiogKTwvbGk+CisgKiA8bGk+PGk+TWV0aG9kU2lnbmF0dXJlPC9pPiA9ICggPHR0PnZpc2l0Rm9ybWFsVHlwZVBhcmFtZXRlcjwvdHQ+CisgKiAgIDx0dD52aXNpdENsYXNzQm91bmQ8L3R0Pj8KKyAqIDx0dD52aXNpdEludGVyZmFjZUJvdW5kPC90dD4qICkqICggPHR0PnZpc2l0UGFyYW1ldGVyVHlwZTwvdHQ+KgorICogPHR0PnZpc2l0UmV0dXJuVHlwZTwvdHQ+CisgKiAgIDx0dD52aXNpdEV4Y2VwdGlvblR5cGU8L3R0PiogKTwvbGk+IDxsaT48aT5UeXBlU2lnbmF0dXJlPC9pPiA9CisgKiA8dHQ+dmlzaXRCYXNlVHlwZTwvdHQ+IHwgPHR0PnZpc2l0VHlwZVZhcmlhYmxlPC90dD4gfAorICogPHR0PnZpc2l0QXJyYXlUeXBlPC90dD4gfCAoCisgKiA8dHQ+dmlzaXRDbGFzc1R5cGU8L3R0PiA8dHQ+dmlzaXRUeXBlQXJndW1lbnQ8L3R0PiogKAorICogPHR0PnZpc2l0SW5uZXJDbGFzc1R5cGU8L3R0PiA8dHQ+dmlzaXRUeXBlQXJndW1lbnQ8L3R0PiogKSoKKyAqIDx0dD52aXNpdEVuZDwvdHQ+ICkgKTwvbGk+IDwvdWw+CisgKgorICogQGF1dGhvciBUaG9tYXMgSGFsbGdyZW4KKyAqIEBhdXRob3IgRXJpYyBCcnVuZXRvbgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2lnbmF0dXJlVmlzaXRvciB7CisKKyAgICAvKioKKyAgICAgKiBXaWxkY2FyZCBmb3IgYW4gImV4dGVuZHMiIHR5cGUgYXJndW1lbnQuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBjaGFyIEVYVEVORFMgPSAnKyc7CisKKyAgICAvKioKKyAgICAgKiBXaWxkY2FyZCBmb3IgYSAic3VwZXIiIHR5cGUgYXJndW1lbnQuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBjaGFyIFNVUEVSID0gJy0nOworCisgICAgLyoqCisgICAgICogV2lsZGNhcmQgZm9yIGEgbm9ybWFsIHR5cGUgYXJndW1lbnQuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBjaGFyIElOU1RBTkNFT0YgPSAnPSc7CisKKyAgICAvKioKKyAgICAgKiBUaGUgQVNNIEFQSSB2ZXJzaW9uIGltcGxlbWVudGVkIGJ5IHRoaXMgdmlzaXRvci4gVGhlIHZhbHVlIG9mIHRoaXMgZmllbGQKKyAgICAgKiBtdXN0IGJlIG9uZSBvZiB7QGxpbmsgT3Bjb2RlcyNBU000fS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZmluYWwgaW50IGFwaTsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0BsaW5rIFNpZ25hdHVyZVZpc2l0b3J9LgorICAgICAqCisgICAgICogQHBhcmFtIGFwaSB0aGUgQVNNIEFQSSB2ZXJzaW9uIGltcGxlbWVudGVkIGJ5IHRoaXMgdmlzaXRvci4gTXVzdCBiZSBvbmUKKyAgICAgKiAgICAgICAgb2Yge0BsaW5rIE9wY29kZXMjQVNNNH0uCisgICAgICovCisgICAgcHVibGljIFNpZ25hdHVyZVZpc2l0b3IoZmluYWwgaW50IGFwaSkgeworICAgICAgICB0aGlzLmFwaSA9IGFwaTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWaXNpdHMgYSBmb3JtYWwgdHlwZSBwYXJhbWV0ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgZm9ybWFsIHBhcmFtZXRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB2aXNpdEZvcm1hbFR5cGVQYXJhbWV0ZXIoU3RyaW5nIG5hbWUpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWaXNpdHMgdGhlIGNsYXNzIGJvdW5kIG9mIHRoZSBsYXN0IHZpc2l0ZWQgZm9ybWFsIHR5cGUgcGFyYW1ldGVyLgorICAgICAqCisgICAgICogQHJldHVybiBhIG5vbiBudWxsIHZpc2l0b3IgdG8gdmlzaXQgdGhlIHNpZ25hdHVyZSBvZiB0aGUgY2xhc3MgYm91bmQuCisgICAgICovCisgICAgcHVibGljIFNpZ25hdHVyZVZpc2l0b3IgdmlzaXRDbGFzc0JvdW5kKCkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWaXNpdHMgYW4gaW50ZXJmYWNlIGJvdW5kIG9mIHRoZSBsYXN0IHZpc2l0ZWQgZm9ybWFsIHR5cGUgcGFyYW1ldGVyLgorICAgICAqCisgICAgICogQHJldHVybiBhIG5vbiBudWxsIHZpc2l0b3IgdG8gdmlzaXQgdGhlIHNpZ25hdHVyZSBvZiB0aGUgaW50ZXJmYWNlIGJvdW5kLgorICAgICAqLworICAgIHB1YmxpYyBTaWduYXR1cmVWaXNpdG9yIHZpc2l0SW50ZXJmYWNlQm91bmQoKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZpc2l0cyB0aGUgdHlwZSBvZiB0aGUgc3VwZXIgY2xhc3MuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgbm9uIG51bGwgdmlzaXRvciB0byB2aXNpdCB0aGUgc2lnbmF0dXJlIG9mIHRoZSBzdXBlciBjbGFzcworICAgICAqICAgICAgICAgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2lnbmF0dXJlVmlzaXRvciB2aXNpdFN1cGVyY2xhc3MoKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZpc2l0cyB0aGUgdHlwZSBvZiBhbiBpbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgdGhlIGNsYXNzLgorICAgICAqCisgICAgICogQHJldHVybiBhIG5vbiBudWxsIHZpc2l0b3IgdG8gdmlzaXQgdGhlIHNpZ25hdHVyZSBvZiB0aGUgaW50ZXJmYWNlIHR5cGUuCisgICAgICovCisgICAgcHVibGljIFNpZ25hdHVyZVZpc2l0b3IgdmlzaXRJbnRlcmZhY2UoKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZpc2l0cyB0aGUgdHlwZSBvZiBhIG1ldGhvZCBwYXJhbWV0ZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgbm9uIG51bGwgdmlzaXRvciB0byB2aXNpdCB0aGUgc2lnbmF0dXJlIG9mIHRoZSBwYXJhbWV0ZXIgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2lnbmF0dXJlVmlzaXRvciB2aXNpdFBhcmFtZXRlclR5cGUoKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZpc2l0cyB0aGUgcmV0dXJuIHR5cGUgb2YgdGhlIG1ldGhvZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBub24gbnVsbCB2aXNpdG9yIHRvIHZpc2l0IHRoZSBzaWduYXR1cmUgb2YgdGhlIHJldHVybiB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBTaWduYXR1cmVWaXNpdG9yIHZpc2l0UmV0dXJuVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogVmlzaXRzIHRoZSB0eXBlIG9mIGEgbWV0aG9kIGV4Y2VwdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBub24gbnVsbCB2aXNpdG9yIHRvIHZpc2l0IHRoZSBzaWduYXR1cmUgb2YgdGhlIGV4Y2VwdGlvbiB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBTaWduYXR1cmVWaXNpdG9yIHZpc2l0RXhjZXB0aW9uVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogVmlzaXRzIGEgc2lnbmF0dXJlIGNvcnJlc3BvbmRpbmcgdG8gYSBwcmltaXRpdmUgdHlwZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZXNjcmlwdG9yIHRoZSBkZXNjcmlwdG9yIG9mIHRoZSBwcmltaXRpdmUgdHlwZSwgb3IgJ1YnIGZvcgorICAgICAqICAgICAgICA8dHQ+dm9pZDwvdHQ+LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZpc2l0QmFzZVR5cGUoY2hhciBkZXNjcmlwdG9yKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogVmlzaXRzIGEgc2lnbmF0dXJlIGNvcnJlc3BvbmRpbmcgdG8gYSB0eXBlIHZhcmlhYmxlLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHR5cGUgdmFyaWFibGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdmlzaXRUeXBlVmFyaWFibGUoU3RyaW5nIG5hbWUpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWaXNpdHMgYSBzaWduYXR1cmUgY29ycmVzcG9uZGluZyB0byBhbiBhcnJheSB0eXBlLgorICAgICAqCisgICAgICogQHJldHVybiBhIG5vbiBudWxsIHZpc2l0b3IgdG8gdmlzaXQgdGhlIHNpZ25hdHVyZSBvZiB0aGUgYXJyYXkgZWxlbWVudAorICAgICAqICAgICAgICAgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2lnbmF0dXJlVmlzaXRvciB2aXNpdEFycmF5VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnRzIHRoZSB2aXNpdCBvZiBhIHNpZ25hdHVyZSBjb3JyZXNwb25kaW5nIHRvIGEgY2xhc3Mgb3IgaW50ZXJmYWNlCisgICAgICogdHlwZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBpbnRlcm5hbCBuYW1lIG9mIHRoZSBjbGFzcyBvciBpbnRlcmZhY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdmlzaXRDbGFzc1R5cGUoU3RyaW5nIG5hbWUpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWaXNpdHMgYW4gaW5uZXIgY2xhc3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbG9jYWwgbmFtZSBvZiB0aGUgaW5uZXIgY2xhc3MgaW4gaXRzIGVuY2xvc2luZyBjbGFzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB2aXNpdElubmVyQ2xhc3NUeXBlKFN0cmluZyBuYW1lKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogVmlzaXRzIGFuIHVuYm91bmRlZCB0eXBlIGFyZ3VtZW50IG9mIHRoZSBsYXN0IHZpc2l0ZWQgY2xhc3Mgb3IgaW5uZXIKKyAgICAgKiBjbGFzcyB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZpc2l0VHlwZUFyZ3VtZW50KCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFZpc2l0cyBhIHR5cGUgYXJndW1lbnQgb2YgdGhlIGxhc3QgdmlzaXRlZCBjbGFzcyBvciBpbm5lciBjbGFzcyB0eXBlLgorICAgICAqCisgICAgICogQHBhcmFtIHdpbGRjYXJkICcrJywgJy0nIG9yICc9Jy4KKyAgICAgKiBAcmV0dXJuIGEgbm9uIG51bGwgdmlzaXRvciB0byB2aXNpdCB0aGUgc2lnbmF0dXJlIG9mIHRoZSB0eXBlIGFyZ3VtZW50LgorICAgICAqLworICAgIHB1YmxpYyBTaWduYXR1cmVWaXNpdG9yIHZpc2l0VHlwZUFyZ3VtZW50KGNoYXIgd2lsZGNhcmQpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5kcyB0aGUgdmlzaXQgb2YgYSBzaWduYXR1cmUgY29ycmVzcG9uZGluZyB0byBhIGNsYXNzIG9yIGludGVyZmFjZSB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZpc2l0RW5kKCkgeworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vc2lnbmF0dXJlL1NpZ25hdHVyZVdyaXRlci5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS9zaWduYXR1cmUvU2lnbmF0dXJlV3JpdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM0MWUwMAotLS0gL2Rldi9udWxsCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vc2lnbmF0dXJlL1NpZ25hdHVyZVdyaXRlci5qYXZhCkBAIC0wLDAgKzEsMjU2IEBACisvKgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBPcmFjbGUgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKKyAqIHF1ZXN0aW9ucy4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGlzIGF2YWlsYWJsZSB1bmRlciBhbmQgZ292ZXJuZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiBIb3dldmVyLCB0aGUgZm9sbG93aW5nIG5vdGljZSBhY2NvbXBhbmllZCB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGlzCisgKiBmaWxlOgorICoKKyAqIEFTTTogYSB2ZXJ5IHNtYWxsIGFuZCBmYXN0IEphdmEgYnl0ZWNvZGUgbWFuaXB1bGF0aW9uIGZyYW1ld29yaworICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMTEgSU5SSUEsIEZyYW5jZSBUZWxlY29tCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2UgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLnNpZ25hdHVyZTsKKworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5PcGNvZGVzOworCisvKioKKyAqIEEgc2lnbmF0dXJlIHZpc2l0b3IgdGhhdCBnZW5lcmF0ZXMgc2lnbmF0dXJlcyBpbiBzdHJpbmcgZm9ybWF0LgorICoKKyAqIEBhdXRob3IgVGhvbWFzIEhhbGxncmVuCisgKiBAYXV0aG9yIEVyaWMgQnJ1bmV0b24KKyAqLworcHVibGljIGNsYXNzIFNpZ25hdHVyZVdyaXRlciBleHRlbmRzIFNpZ25hdHVyZVZpc2l0b3IgeworCisgICAgLyoqCisgICAgICogQnVmZmVyIHVzZWQgdG8gY29uc3RydWN0IHRoZSBzaWduYXR1cmUuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIGlmIHRoZSBzaWduYXR1cmUgY29udGFpbnMgZm9ybWFsIHR5cGUgcGFyYW1ldGVycy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaGFzRm9ybWFsczsKKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyBpZiB0aGUgc2lnbmF0dXJlIGNvbnRhaW5zIG1ldGhvZCBwYXJhbWV0ZXIgdHlwZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGhhc1BhcmFtZXRlcnM7CisKKyAgICAvKioKKyAgICAgKiBTdGFjayB1c2VkIHRvIGtlZXAgdHJhY2sgb2YgY2xhc3MgdHlwZXMgdGhhdCBoYXZlIGFyZ3VtZW50cy4gRWFjaCBlbGVtZW50CisgICAgICogb2YgdGhpcyBzdGFjayBpcyBhIGJvb2xlYW4gZW5jb2RlZCBpbiBvbmUgYml0LiBUaGUgdG9wIG9mIHRoZSBzdGFjayBpcworICAgICAqIHRoZSBsb3dlc3Qgb3JkZXIgYml0LiBQdXNoaW5nIGZhbHNlID0gKjIsIHB1c2hpbmcgdHJ1ZSA9ICoyKzEsIHBvcHBpbmcgPQorICAgICAqIC8yLgorICAgICAqLworICAgIHByaXZhdGUgaW50IGFyZ3VtZW50U3RhY2s7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAbGluayBTaWduYXR1cmVXcml0ZXJ9IG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2lnbmF0dXJlV3JpdGVyKCkgeworICAgICAgICBzdXBlcihPcGNvZGVzLkFTTTQpOworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIEltcGxlbWVudGF0aW9uIG9mIHRoZSBTaWduYXR1cmVWaXNpdG9yIGludGVyZmFjZQorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRGb3JtYWxUeXBlUGFyYW1ldGVyKGZpbmFsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIGlmICghaGFzRm9ybWFscykgeworICAgICAgICAgICAgaGFzRm9ybWFscyA9IHRydWU7CisgICAgICAgICAgICBidWYuYXBwZW5kKCc8Jyk7CisgICAgICAgIH0KKyAgICAgICAgYnVmLmFwcGVuZChuYW1lKTsKKyAgICAgICAgYnVmLmFwcGVuZCgnOicpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTaWduYXR1cmVWaXNpdG9yIHZpc2l0Q2xhc3NCb3VuZCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNpZ25hdHVyZVZpc2l0b3IgdmlzaXRJbnRlcmZhY2VCb3VuZCgpIHsKKyAgICAgICAgYnVmLmFwcGVuZCgnOicpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2lnbmF0dXJlVmlzaXRvciB2aXNpdFN1cGVyY2xhc3MoKSB7CisgICAgICAgIGVuZEZvcm1hbHMoKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNpZ25hdHVyZVZpc2l0b3IgdmlzaXRJbnRlcmZhY2UoKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTaWduYXR1cmVWaXNpdG9yIHZpc2l0UGFyYW1ldGVyVHlwZSgpIHsKKyAgICAgICAgZW5kRm9ybWFscygpOworICAgICAgICBpZiAoIWhhc1BhcmFtZXRlcnMpIHsKKyAgICAgICAgICAgIGhhc1BhcmFtZXRlcnMgPSB0cnVlOworICAgICAgICAgICAgYnVmLmFwcGVuZCgnKCcpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTaWduYXR1cmVWaXNpdG9yIHZpc2l0UmV0dXJuVHlwZSgpIHsKKyAgICAgICAgZW5kRm9ybWFscygpOworICAgICAgICBpZiAoIWhhc1BhcmFtZXRlcnMpIHsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoJygnKTsKKyAgICAgICAgfQorICAgICAgICBidWYuYXBwZW5kKCcpJyk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTaWduYXR1cmVWaXNpdG9yIHZpc2l0RXhjZXB0aW9uVHlwZSgpIHsKKyAgICAgICAgYnVmLmFwcGVuZCgnXicpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEJhc2VUeXBlKGZpbmFsIGNoYXIgZGVzY3JpcHRvcikgeworICAgICAgICBidWYuYXBwZW5kKGRlc2NyaXB0b3IpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0VHlwZVZhcmlhYmxlKGZpbmFsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIGJ1Zi5hcHBlbmQoJ1QnKTsKKyAgICAgICAgYnVmLmFwcGVuZChuYW1lKTsKKyAgICAgICAgYnVmLmFwcGVuZCgnOycpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTaWduYXR1cmVWaXNpdG9yIHZpc2l0QXJyYXlUeXBlKCkgeworICAgICAgICBidWYuYXBwZW5kKCdbJyk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0Q2xhc3NUeXBlKGZpbmFsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIGJ1Zi5hcHBlbmQoJ0wnKTsKKyAgICAgICAgYnVmLmFwcGVuZChuYW1lKTsKKyAgICAgICAgYXJndW1lbnRTdGFjayAqPSAyOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0SW5uZXJDbGFzc1R5cGUoZmluYWwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgZW5kQXJndW1lbnRzKCk7CisgICAgICAgIGJ1Zi5hcHBlbmQoJy4nKTsKKyAgICAgICAgYnVmLmFwcGVuZChuYW1lKTsKKyAgICAgICAgYXJndW1lbnRTdGFjayAqPSAyOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0VHlwZUFyZ3VtZW50KCkgeworICAgICAgICBpZiAoYXJndW1lbnRTdGFjayAlIDIgPT0gMCkgeworICAgICAgICAgICAgKythcmd1bWVudFN0YWNrOworICAgICAgICAgICAgYnVmLmFwcGVuZCgnPCcpOworICAgICAgICB9CisgICAgICAgIGJ1Zi5hcHBlbmQoJyonKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2lnbmF0dXJlVmlzaXRvciB2aXNpdFR5cGVBcmd1bWVudChmaW5hbCBjaGFyIHdpbGRjYXJkKSB7CisgICAgICAgIGlmIChhcmd1bWVudFN0YWNrICUgMiA9PSAwKSB7CisgICAgICAgICAgICArK2FyZ3VtZW50U3RhY2s7CisgICAgICAgICAgICBidWYuYXBwZW5kKCc8Jyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHdpbGRjYXJkICE9ICc9JykgeworICAgICAgICAgICAgYnVmLmFwcGVuZCh3aWxkY2FyZCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRFbmQoKSB7CisgICAgICAgIGVuZEFyZ3VtZW50cygpOworICAgICAgICBidWYuYXBwZW5kKCc7Jyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc2lnbmF0dXJlIHRoYXQgd2FzIGJ1aWx0IGJ5IHRoaXMgc2lnbmF0dXJlIHdyaXRlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHNpZ25hdHVyZSB0aGF0IHdhcyBidWlsdCBieSB0aGlzIHNpZ25hdHVyZSB3cml0ZXIuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIFV0aWxpdHkgbWV0aG9kcworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLyoqCisgICAgICogRW5kcyB0aGUgZm9ybWFsIHR5cGUgcGFyYW1ldGVycyBzZWN0aW9uIG9mIHRoZSBzaWduYXR1cmUuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGVuZEZvcm1hbHMoKSB7CisgICAgICAgIGlmIChoYXNGb3JtYWxzKSB7CisgICAgICAgICAgICBoYXNGb3JtYWxzID0gZmFsc2U7CisgICAgICAgICAgICBidWYuYXBwZW5kKCc+Jyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmRzIHRoZSB0eXBlIGFyZ3VtZW50cyBvZiBhIGNsYXNzIG9yIGlubmVyIGNsYXNzIHR5cGUuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGVuZEFyZ3VtZW50cygpIHsKKyAgICAgICAgaWYgKGFyZ3VtZW50U3RhY2sgJSAyICE9IDApIHsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoJz4nKTsKKyAgICAgICAgfQorICAgICAgICBhcmd1bWVudFN0YWNrIC89IDI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS90cmVlL0Fic3RyYWN0SW5zbk5vZGUuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vdHJlZS9BYnN0cmFjdEluc25Ob2RlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk2NTQ3NgotLS0gL2Rldi9udWxsCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vdHJlZS9BYnN0cmFjdEluc25Ob2RlLmphdmEKQEAgLTAsMCArMSwyNjcgQEAKKy8qCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IE9yYWNsZSBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQorICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQorICogcXVlc3Rpb25zLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgaXMgYXZhaWxhYmxlIHVuZGVyIGFuZCBnb3Zlcm5lZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIEhvd2V2ZXIsIHRoZSBmb2xsb3dpbmcgbm90aWNlIGFjY29tcGFuaWVkIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoaXMKKyAqIGZpbGU6CisgKgorICogQVNNOiBhIHZlcnkgc21hbGwgYW5kIGZhc3QgSmF2YSBieXRlY29kZSBtYW5pcHVsYXRpb24gZnJhbWV3b3JrCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAxMSBJTlJJQSwgRnJhbmNlIFRlbGVjb20KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20udHJlZTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uTWV0aG9kVmlzaXRvcjsKKworLyoqCisgKiBBIG5vZGUgdGhhdCByZXByZXNlbnRzIGEgYnl0ZWNvZGUgaW5zdHJ1Y3Rpb24uIDxpPkFuIGluc3RydWN0aW9uIGNhbiBhcHBlYXIKKyAqIGF0IG1vc3Qgb25jZSBpbiBhdCBtb3N0IG9uZSB7QGxpbmsgSW5zbkxpc3R9IGF0IGEgdGltZTwvaT4uCisgKgorICogQGF1dGhvciBFcmljIEJydW5ldG9uCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEluc25Ob2RlIHsKKworICAgIC8qKgorICAgICAqIFRoZSB0eXBlIG9mIHtAbGluayBJbnNuTm9kZX0gaW5zdHJ1Y3Rpb25zLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOU04gPSAwOworCisgICAgLyoqCisgICAgICogVGhlIHR5cGUgb2Yge0BsaW5rIEludEluc25Ob2RlfSBpbnN0cnVjdGlvbnMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5UX0lOU04gPSAxOworCisgICAgLyoqCisgICAgICogVGhlIHR5cGUgb2Yge0BsaW5rIFZhckluc25Ob2RlfSBpbnN0cnVjdGlvbnMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkFSX0lOU04gPSAyOworCisgICAgLyoqCisgICAgICogVGhlIHR5cGUgb2Yge0BsaW5rIFR5cGVJbnNuTm9kZX0gaW5zdHJ1Y3Rpb25zLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfSU5TTiA9IDM7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiB7QGxpbmsgRmllbGRJbnNuTm9kZX0gaW5zdHJ1Y3Rpb25zLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJRUxEX0lOU04gPSA0OworCisgICAgLyoqCisgICAgICogVGhlIHR5cGUgb2Yge0BsaW5rIE1ldGhvZEluc25Ob2RlfSBpbnN0cnVjdGlvbnMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVUSE9EX0lOU04gPSA1OworCisgICAgLyoqCisgICAgICogVGhlIHR5cGUgb2Yge0BsaW5rIEludm9rZUR5bmFtaWNJbnNuTm9kZX0gaW5zdHJ1Y3Rpb25zLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVk9LRV9EWU5BTUlDX0lOU04gPSA2OworCisgICAgLyoqCisgICAgICogVGhlIHR5cGUgb2Yge0BsaW5rIEp1bXBJbnNuTm9kZX0gaW5zdHJ1Y3Rpb25zLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpVTVBfSU5TTiA9IDc7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiB7QGxpbmsgTGFiZWxOb2RlfSAiaW5zdHJ1Y3Rpb25zIi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMQUJFTCA9IDg7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiB7QGxpbmsgTGRjSW5zbk5vZGV9IGluc3RydWN0aW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMRENfSU5TTiA9IDk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiB7QGxpbmsgSWluY0luc25Ob2RlfSBpbnN0cnVjdGlvbnMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUlOQ19JTlNOID0gMTA7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiB7QGxpbmsgVGFibGVTd2l0Y2hJbnNuTm9kZX0gaW5zdHJ1Y3Rpb25zLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBQkxFU1dJVENIX0lOU04gPSAxMTsKKworICAgIC8qKgorICAgICAqIFRoZSB0eXBlIG9mIHtAbGluayBMb29rdXBTd2l0Y2hJbnNuTm9kZX0gaW5zdHJ1Y3Rpb25zLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPT0tVUFNXSVRDSF9JTlNOID0gMTI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiB7QGxpbmsgTXVsdGlBTmV3QXJyYXlJbnNuTm9kZX0gaW5zdHJ1Y3Rpb25zLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1VTFRJQU5FV0FSUkFZX0lOU04gPSAxMzsKKworICAgIC8qKgorICAgICAqIFRoZSB0eXBlIG9mIHtAbGluayBGcmFtZU5vZGV9ICJpbnN0cnVjdGlvbnMiLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZSQU1FID0gMTQ7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiB7QGxpbmsgTGluZU51bWJlck5vZGV9ICJpbnN0cnVjdGlvbnMiLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExJTkUgPSAxNTsKKworICAgIC8qKgorICAgICAqIFRoZSBvcGNvZGUgb2YgdGhpcyBpbnN0cnVjdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IG9wY29kZTsKKworICAgIC8qKgorICAgICAqIFByZXZpb3VzIGluc3RydWN0aW9uIGluIHRoZSBsaXN0IHRvIHdoaWNoIHRoaXMgaW5zdHJ1Y3Rpb24gYmVsb25ncy4KKyAgICAgKi8KKyAgICBBYnN0cmFjdEluc25Ob2RlIHByZXY7CisKKyAgICAvKioKKyAgICAgKiBOZXh0IGluc3RydWN0aW9uIGluIHRoZSBsaXN0IHRvIHdoaWNoIHRoaXMgaW5zdHJ1Y3Rpb24gYmVsb25ncy4KKyAgICAgKi8KKyAgICBBYnN0cmFjdEluc25Ob2RlIG5leHQ7CisKKyAgICAvKioKKyAgICAgKiBJbmRleCBvZiB0aGlzIGluc3RydWN0aW9uIGluIHRoZSBsaXN0IHRvIHdoaWNoIGl0IGJlbG9uZ3MuIFRoZSB2YWx1ZSBvZgorICAgICAqIHRoaXMgZmllbGQgaXMgY29ycmVjdCBvbmx5IHdoZW4ge0BsaW5rIEluc25MaXN0I2NhY2hlfSBpcyBub3QgbnVsbC4gQQorICAgICAqIHZhbHVlIG9mIC0xIGluZGljYXRlcyB0aGF0IHRoaXMgaW5zdHJ1Y3Rpb24gZG9lcyBub3QgYmVsb25nIHRvIGFueQorICAgICAqIHtAbGluayBJbnNuTGlzdH0uCisgICAgICovCisgICAgaW50IGluZGV4OworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGxpbmsgQWJzdHJhY3RJbnNuTm9kZX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3Bjb2RlIHRoZSBvcGNvZGUgb2YgdGhlIGluc3RydWN0aW9uIHRvIGJlIGNvbnN0cnVjdGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCBBYnN0cmFjdEluc25Ob2RlKGZpbmFsIGludCBvcGNvZGUpIHsKKyAgICAgICAgdGhpcy5vcGNvZGUgPSBvcGNvZGU7CisgICAgICAgIHRoaXMuaW5kZXggPSAtMTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBvcGNvZGUgb2YgdGhpcyBpbnN0cnVjdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG9wY29kZSBvZiB0aGlzIGluc3RydWN0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0T3Bjb2RlKCkgeworICAgICAgICByZXR1cm4gb3Bjb2RlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhpcyBpbnN0cnVjdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHR5cGUgb2YgdGhpcyBpbnN0cnVjdGlvbiwgaS5lLiBvbmUgdGhlIGNvbnN0YW50cyBkZWZpbmVkIGluCisgICAgICogICAgICAgICB0aGlzIGNsYXNzLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0VHlwZSgpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gaW4gdGhlIGxpc3QgdG8gd2hpY2ggdGhpcyBpbnN0cnVjdGlvbgorICAgICAqIGJlbG9uZ3MsIGlmIGFueS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHByZXZpb3VzIGluc3RydWN0aW9uIGluIHRoZSBsaXN0IHRvIHdoaWNoIHRoaXMgaW5zdHJ1Y3Rpb24KKyAgICAgKiAgICAgICAgIGJlbG9uZ3MsIGlmIGFueS4gTWF5IGJlIDx0dD5udWxsPC90dD4uCisgICAgICovCisgICAgcHVibGljIEFic3RyYWN0SW5zbk5vZGUgZ2V0UHJldmlvdXMoKSB7CisgICAgICAgIHJldHVybiBwcmV2OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5leHQgaW5zdHJ1Y3Rpb24gaW4gdGhlIGxpc3QgdG8gd2hpY2ggdGhpcyBpbnN0cnVjdGlvbgorICAgICAqIGJlbG9uZ3MsIGlmIGFueS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG5leHQgaW5zdHJ1Y3Rpb24gaW4gdGhlIGxpc3QgdG8gd2hpY2ggdGhpcyBpbnN0cnVjdGlvbgorICAgICAqICAgICAgICAgYmVsb25ncywgaWYgYW55LiBNYXkgYmUgPHR0Pm51bGw8L3R0Pi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQWJzdHJhY3RJbnNuTm9kZSBnZXROZXh0KCkgeworICAgICAgICByZXR1cm4gbmV4dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYWtlcyB0aGUgZ2l2ZW4gY29kZSB2aXNpdG9yIHZpc2l0IHRoaXMgaW5zdHJ1Y3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY3YgYSBjb2RlIHZpc2l0b3IuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgYWNjZXB0KGZpbmFsIE1ldGhvZFZpc2l0b3IgY3YpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGNvcHkgb2YgdGhpcyBpbnN0cnVjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsYWJlbHMgYSBtYXAgZnJvbSBMYWJlbE5vZGVzIHRvIGNsb25lZCBMYWJlbE5vZGVzLgorICAgICAqIEByZXR1cm4gYSBjb3B5IG9mIHRoaXMgaW5zdHJ1Y3Rpb24uIFRoZSByZXR1cm5lZCBpbnN0cnVjdGlvbiBkb2VzIG5vdAorICAgICAqICAgICAgICAgYmVsb25nIHRvIGFueSB7QGxpbmsgSW5zbkxpc3R9LgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBBYnN0cmFjdEluc25Ob2RlIGNsb25lKGZpbmFsIE1hcDxMYWJlbE5vZGUsIExhYmVsTm9kZT4gbGFiZWxzKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGNsb25lIG9mIHRoZSBnaXZlbiBsYWJlbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsYWJlbCBhIGxhYmVsLgorICAgICAqIEBwYXJhbSBtYXAgYSBtYXAgZnJvbSBMYWJlbE5vZGVzIHRvIGNsb25lZCBMYWJlbE5vZGVzLgorICAgICAqIEByZXR1cm4gdGhlIGNsb25lIG9mIHRoZSBnaXZlbiBsYWJlbC4KKyAgICAgKi8KKyAgICBzdGF0aWMgTGFiZWxOb2RlIGNsb25lKGZpbmFsIExhYmVsTm9kZSBsYWJlbCwgZmluYWwgTWFwPExhYmVsTm9kZSwgTGFiZWxOb2RlPiBtYXApIHsKKyAgICAgICAgcmV0dXJuIG1hcC5nZXQobGFiZWwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGNsb25lcyBvZiB0aGUgZ2l2ZW4gbGFiZWxzLgorICAgICAqCisgICAgICogQHBhcmFtIGxhYmVscyBhIGxpc3Qgb2YgbGFiZWxzLgorICAgICAqIEBwYXJhbSBtYXAgYSBtYXAgZnJvbSBMYWJlbE5vZGVzIHRvIGNsb25lZCBMYWJlbE5vZGVzLgorICAgICAqIEByZXR1cm4gdGhlIGNsb25lcyBvZiB0aGUgZ2l2ZW4gbGFiZWxzLgorICAgICAqLworICAgIHN0YXRpYyBMYWJlbE5vZGVbXSBjbG9uZShmaW5hbCBMaXN0PExhYmVsTm9kZT4gbGFiZWxzLCBmaW5hbCBNYXA8TGFiZWxOb2RlLCBMYWJlbE5vZGU+IG1hcCkgeworICAgICAgICBMYWJlbE5vZGVbXSBjbG9uZXMgPSBuZXcgTGFiZWxOb2RlW2xhYmVscy5zaXplKCldOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNsb25lcy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgY2xvbmVzW2ldID0gbWFwLmdldChsYWJlbHMuZ2V0KGkpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2xvbmVzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vdHJlZS9Bbm5vdGF0aW9uTm9kZS5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS90cmVlL0Fubm90YXRpb25Ob2RlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY1M2VkNwotLS0gL2Rldi9udWxsCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vdHJlZS9Bbm5vdGF0aW9uTm9kZS5qYXZhCkBAIC0wLDAgKzEsMjUzIEBACisvKgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBPcmFjbGUgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKKyAqIHF1ZXN0aW9ucy4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGlzIGF2YWlsYWJsZSB1bmRlciBhbmQgZ292ZXJuZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiBIb3dldmVyLCB0aGUgZm9sbG93aW5nIG5vdGljZSBhY2NvbXBhbmllZCB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGlzCisgKiBmaWxlOgorICoKKyAqIEFTTTogYSB2ZXJ5IHNtYWxsIGFuZCBmYXN0IEphdmEgYnl0ZWNvZGUgbWFuaXB1bGF0aW9uIGZyYW1ld29yaworICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMTEgSU5SSUEsIEZyYW5jZSBUZWxlY29tCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2UgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLnRyZWU7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLkFubm90YXRpb25WaXNpdG9yOworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5PcGNvZGVzOworCisvKioKKyAqIEEgbm9kZSB0aGF0IHJlcHJlc2VudHMgYW4gYW5ub3RhdGlvbm4uCisgKgorICogQGF1dGhvciBFcmljIEJydW5ldG9uCisgKi8KK3B1YmxpYyBjbGFzcyBBbm5vdGF0aW9uTm9kZSBleHRlbmRzIEFubm90YXRpb25WaXNpdG9yIHsKKworICAgIC8qKgorICAgICAqIFRoZSBjbGFzcyBkZXNjcmlwdG9yIG9mIHRoZSBhbm5vdGF0aW9uIGNsYXNzLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZGVzYzsKKworICAgIC8qKgorICAgICAqIFRoZSBuYW1lIHZhbHVlIHBhaXJzIG9mIHRoaXMgYW5ub3RhdGlvbi4gRWFjaCBuYW1lIHZhbHVlIHBhaXIgaXMgc3RvcmVkCisgICAgICogYXMgdHdvIGNvbnNlY3V0aXZlIGVsZW1lbnRzIGluIHRoZSBsaXN0LiBUaGUgbmFtZSBpcyBhIHtAbGluayBTdHJpbmd9LAorICAgICAqIGFuZCB0aGUgdmFsdWUgbWF5IGJlIGEge0BsaW5rIEJ5dGV9LCB7QGxpbmsgQm9vbGVhbn0sIHtAbGluayBDaGFyYWN0ZXJ9LAorICAgICAqIHtAbGluayBTaG9ydH0sIHtAbGluayBJbnRlZ2VyfSwge0BsaW5rIExvbmd9LCB7QGxpbmsgRmxvYXR9LAorICAgICAqIHtAbGluayBEb3VibGV9LCB7QGxpbmsgU3RyaW5nfSBvciB7QGxpbmsgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLlR5cGV9LCBvciBhbgorICAgICAqIHR3byBlbGVtZW50cyBTdHJpbmcgYXJyYXkgKGZvciBlbnVtZXJhdGlvbiB2YWx1ZXMpLCBhCisgICAgICoge0BsaW5rIEFubm90YXRpb25Ob2RlfSwgb3IgYSB7QGxpbmsgTGlzdH0gb2YgdmFsdWVzIG9mIG9uZSBvZiB0aGUKKyAgICAgKiBwcmVjZWRpbmcgdHlwZXMuIFRoZSBsaXN0IG1heSBiZSA8dHQ+bnVsbDwvdHQ+IGlmIHRoZXJlIGlzIG5vIG5hbWUKKyAgICAgKiB2YWx1ZSBwYWlyLgorICAgICAqLworICAgIHB1YmxpYyBMaXN0PE9iamVjdD4gdmFsdWVzOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGxpbmsgQW5ub3RhdGlvbk5vZGV9LiA8aT5TdWJjbGFzc2VzIG11c3Qgbm90IHVzZSB0aGlzCisgICAgICogY29uc3RydWN0b3I8L2k+LiBJbnN0ZWFkLCB0aGV5IG11c3QgdXNlIHRoZQorICAgICAqIHtAbGluayAjQW5ub3RhdGlvbk5vZGUoaW50LCBTdHJpbmcpfSB2ZXJzaW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGRlc2MgdGhlIGNsYXNzIGRlc2NyaXB0b3Igb2YgdGhlIGFubm90YXRpb24gY2xhc3MuCisgICAgICovCisgICAgcHVibGljIEFubm90YXRpb25Ob2RlKGZpbmFsIFN0cmluZyBkZXNjKSB7CisgICAgICAgIHRoaXMoT3Bjb2Rlcy5BU000LCBkZXNjKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAbGluayBBbm5vdGF0aW9uTm9kZX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXBpIHRoZSBBU00gQVBJIHZlcnNpb24gaW1wbGVtZW50ZWQgYnkgdGhpcyB2aXNpdG9yLiBNdXN0IGJlIG9uZQorICAgICAqICAgICAgICBvZiB7QGxpbmsgT3Bjb2RlcyNBU000fS4KKyAgICAgKiBAcGFyYW0gZGVzYyB0aGUgY2xhc3MgZGVzY3JpcHRvciBvZiB0aGUgYW5ub3RhdGlvbiBjbGFzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQW5ub3RhdGlvbk5vZGUoZmluYWwgaW50IGFwaSwgZmluYWwgU3RyaW5nIGRlc2MpIHsKKyAgICAgICAgc3VwZXIoYXBpKTsKKyAgICAgICAgdGhpcy5kZXNjID0gZGVzYzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAbGluayBBbm5vdGF0aW9uTm9kZX0gdG8gdmlzaXQgYW4gYXJyYXkgdmFsdWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWVzIHdoZXJlIHRoZSB2aXNpdGVkIHZhbHVlcyBtdXN0IGJlIHN0b3JlZC4KKyAgICAgKi8KKyAgICBBbm5vdGF0aW9uTm9kZShmaW5hbCBMaXN0PE9iamVjdD4gdmFsdWVzKSB7CisgICAgICAgIHN1cGVyKE9wY29kZXMuQVNNNCk7CisgICAgICAgIHRoaXMudmFsdWVzID0gdmFsdWVzOworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIEltcGxlbWVudGF0aW9uIG9mIHRoZSBBbm5vdGF0aW9uVmlzaXRvciBhYnN0cmFjdCBjbGFzcworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICBpZiAodmFsdWVzID09IG51bGwpIHsKKyAgICAgICAgICAgIHZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0Pih0aGlzLmRlc2MgIT0gbnVsbCA/IDIgOiAxKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhpcy5kZXNjICE9IG51bGwpIHsKKyAgICAgICAgICAgIHZhbHVlcy5hZGQobmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgdmFsdWVzLmFkZCh2YWx1ZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRFbnVtKAorICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSwKKyAgICAgICAgZmluYWwgU3RyaW5nIGRlc2MsCisgICAgICAgIGZpbmFsIFN0cmluZyB2YWx1ZSkKKyAgICB7CisgICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgdmFsdWVzID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KHRoaXMuZGVzYyAhPSBudWxsID8gMiA6IDEpOworICAgICAgICB9CisgICAgICAgIGlmICh0aGlzLmRlc2MgIT0gbnVsbCkgeworICAgICAgICAgICAgdmFsdWVzLmFkZChuYW1lKTsKKyAgICAgICAgfQorICAgICAgICB2YWx1ZXMuYWRkKG5ldyBTdHJpbmdbXSB7IGRlc2MsIHZhbHVlIH0pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBBbm5vdGF0aW9uVmlzaXRvciB2aXNpdEFubm90YXRpb24oCisgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lLAorICAgICAgICBmaW5hbCBTdHJpbmcgZGVzYykKKyAgICB7CisgICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgdmFsdWVzID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KHRoaXMuZGVzYyAhPSBudWxsID8gMiA6IDEpOworICAgICAgICB9CisgICAgICAgIGlmICh0aGlzLmRlc2MgIT0gbnVsbCkgeworICAgICAgICAgICAgdmFsdWVzLmFkZChuYW1lKTsKKyAgICAgICAgfQorICAgICAgICBBbm5vdGF0aW9uTm9kZSBhbm5vdGF0aW9uID0gbmV3IEFubm90YXRpb25Ob2RlKGRlc2MpOworICAgICAgICB2YWx1ZXMuYWRkKGFubm90YXRpb24pOworICAgICAgICByZXR1cm4gYW5ub3RhdGlvbjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQW5ub3RhdGlvblZpc2l0b3IgdmlzaXRBcnJheShmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgICAgICBpZiAodmFsdWVzID09IG51bGwpIHsKKyAgICAgICAgICAgIHZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0Pih0aGlzLmRlc2MgIT0gbnVsbCA/IDIgOiAxKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhpcy5kZXNjICE9IG51bGwpIHsKKyAgICAgICAgICAgIHZhbHVlcy5hZGQobmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgTGlzdDxPYmplY3Q+IGFycmF5ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7CisgICAgICAgIHZhbHVlcy5hZGQoYXJyYXkpOworICAgICAgICByZXR1cm4gbmV3IEFubm90YXRpb25Ob2RlKGFycmF5KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEVuZCgpIHsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBBY2NlcHQgbWV0aG9kcworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIHRoYXQgdGhpcyBhbm5vdGF0aW9uIG5vZGUgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBnaXZlbiBBU00gQVBJCisgICAgICogdmVyc2lvbi4gVGhpcyBtZXRob2RzIGNoZWNrcyB0aGF0IHRoaXMgbm9kZSwgYW5kIGFsbCBpdHMgbm9kZXMKKyAgICAgKiByZWN1cnNpdmVseSwgZG8gbm90IGNvbnRhaW4gZWxlbWVudHMgdGhhdCB3ZXJlIGludHJvZHVjZWQgaW4gbW9yZSByZWNlbnQKKyAgICAgKiB2ZXJzaW9ucyBvZiB0aGUgQVNNIEFQSSB0aGFuIHRoZSBnaXZlbiB2ZXJzaW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGFwaSBhbiBBU00gQVBJIHZlcnNpb24uIE11c3QgYmUgb25lIG9mIHtAbGluayBPcGNvZGVzI0FTTTR9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNoZWNrKGZpbmFsIGludCBhcGkpIHsKKyAgICAgICAgLy8gbm90aGluZyB0byBkbworICAgIH0KKworICAgIC8qKgorICAgICAqIE1ha2VzIHRoZSBnaXZlbiB2aXNpdG9yIHZpc2l0IHRoaXMgYW5ub3RhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhdiBhbiBhbm5vdGF0aW9uIHZpc2l0b3IuIE1heWJlIDx0dD5udWxsPC90dD4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWNjZXB0KGZpbmFsIEFubm90YXRpb25WaXNpdG9yIGF2KSB7CisgICAgICAgIGlmIChhdiAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAodmFsdWVzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5zaXplKCk7IGkgKz0gMikgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIHZhbHVlcy5nZXQoaSk7CisgICAgICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IHZhbHVlcy5nZXQoaSArIDEpOworICAgICAgICAgICAgICAgICAgICBhY2NlcHQoYXYsIG5hbWUsIHZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdi52aXNpdEVuZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFrZXMgdGhlIGdpdmVuIHZpc2l0b3IgdmlzaXQgYSBnaXZlbiBhbm5vdGF0aW9uIHZhbHVlLgorICAgICAqCisgICAgICogQHBhcmFtIGF2IGFuIGFubm90YXRpb24gdmlzaXRvci4gTWF5YmUgPHR0Pm51bGw8L3R0Pi4KKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgdmFsdWUgbmFtZS4KKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIGFjdHVhbCB2YWx1ZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCBhY2NlcHQoCisgICAgICAgIGZpbmFsIEFubm90YXRpb25WaXNpdG9yIGF2LAorICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSwKKyAgICAgICAgZmluYWwgT2JqZWN0IHZhbHVlKQorICAgIHsKKyAgICAgICAgaWYgKGF2ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZ1tdKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nW10gdHlwZWNvbnN0ID0gKFN0cmluZ1tdKSB2YWx1ZTsKKyAgICAgICAgICAgICAgICBhdi52aXNpdEVudW0obmFtZSwgdHlwZWNvbnN0WzBdLCB0eXBlY29uc3RbMV0pOworICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEFubm90YXRpb25Ob2RlKSB7CisgICAgICAgICAgICAgICAgQW5ub3RhdGlvbk5vZGUgYW4gPSAoQW5ub3RhdGlvbk5vZGUpIHZhbHVlOworICAgICAgICAgICAgICAgIGFuLmFjY2VwdChhdi52aXNpdEFubm90YXRpb24obmFtZSwgYW4uZGVzYykpOworICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIExpc3QpIHsKKyAgICAgICAgICAgICAgICBBbm5vdGF0aW9uVmlzaXRvciB2ID0gYXYudmlzaXRBcnJheShuYW1lKTsKKyAgICAgICAgICAgICAgICBMaXN0PD8+IGFycmF5ID0gKExpc3Q8Pz4pIHZhbHVlOworICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgYXJyYXkuc2l6ZSgpOyArK2opIHsKKyAgICAgICAgICAgICAgICAgICAgYWNjZXB0KHYsIG51bGwsIGFycmF5LmdldChqKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHYudmlzaXRFbmQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXYudmlzaXQobmFtZSwgdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS90cmVlL0NsYXNzTm9kZS5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS90cmVlL0NsYXNzTm9kZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxYjM2YzgKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL3RyZWUvQ2xhc3NOb2RlLmphdmEKQEAgLTAsMCArMSw0MDAgQEAKKy8qCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IE9yYWNsZSBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQorICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQorICogcXVlc3Rpb25zLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgaXMgYXZhaWxhYmxlIHVuZGVyIGFuZCBnb3Zlcm5lZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIEhvd2V2ZXIsIHRoZSBmb2xsb3dpbmcgbm90aWNlIGFjY29tcGFuaWVkIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoaXMKKyAqIGZpbGU6CisgKgorICogQVNNOiBhIHZlcnkgc21hbGwgYW5kIGZhc3QgSmF2YSBieXRlY29kZSBtYW5pcHVsYXRpb24gZnJhbWV3b3JrCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAxMSBJTlJJQSwgRnJhbmNlIFRlbGVjb20KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20udHJlZTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5Bbm5vdGF0aW9uVmlzaXRvcjsKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uQXR0cmlidXRlOworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5DbGFzc1Zpc2l0b3I7CitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLkZpZWxkVmlzaXRvcjsKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uTWV0aG9kVmlzaXRvcjsKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uT3Bjb2RlczsKKworLyoqCisgKiBBIG5vZGUgdGhhdCByZXByZXNlbnRzIGEgY2xhc3MuCisgKgorICogQGF1dGhvciBFcmljIEJydW5ldG9uCisgKi8KK3B1YmxpYyBjbGFzcyBDbGFzc05vZGUgZXh0ZW5kcyBDbGFzc1Zpc2l0b3IgeworCisgICAgLyoqCisgICAgICogVGhlIGNsYXNzIHZlcnNpb24uCisgICAgICovCisgICAgcHVibGljIGludCB2ZXJzaW9uOworCisgICAgLyoqCisgICAgICogVGhlIGNsYXNzJ3MgYWNjZXNzIGZsYWdzIChzZWUge0BsaW5rIGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5PcGNvZGVzfSkuIFRoaXMKKyAgICAgKiBmaWVsZCBhbHNvIGluZGljYXRlcyBpZiB0aGUgY2xhc3MgaXMgZGVwcmVjYXRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGFjY2VzczsKKworICAgIC8qKgorICAgICAqIFRoZSBpbnRlcm5hbCBuYW1lIG9mIHRoZSBjbGFzcyAoc2VlCisgICAgICoge0BsaW5rIGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5UeXBlI2dldEludGVybmFsTmFtZSgpIGdldEludGVybmFsTmFtZX0pLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgbmFtZTsKKworICAgIC8qKgorICAgICAqIFRoZSBzaWduYXR1cmUgb2YgdGhlIGNsYXNzLiBNYXl0IGJlIDx0dD5udWxsPC90dD4uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBzaWduYXR1cmU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgaW50ZXJuYWwgb2YgbmFtZSBvZiB0aGUgc3VwZXIgY2xhc3MgKHNlZQorICAgICAqIHtAbGluayBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uVHlwZSNnZXRJbnRlcm5hbE5hbWUoKSBnZXRJbnRlcm5hbE5hbWV9KS4gRm9yCisgICAgICogaW50ZXJmYWNlcywgdGhlIHN1cGVyIGNsYXNzIGlzIHtAbGluayBPYmplY3R9LiBNYXkgYmUgPHR0Pm51bGw8L3R0PiwKKyAgICAgKiBidXQgb25seSBmb3IgdGhlIHtAbGluayBPYmplY3R9IGNsYXNzLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgc3VwZXJOYW1lOworCisgICAgLyoqCisgICAgICogVGhlIGludGVybmFsIG5hbWVzIG9mIHRoZSBjbGFzcydzIGludGVyZmFjZXMgKHNlZQorICAgICAqIHtAbGluayBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uVHlwZSNnZXRJbnRlcm5hbE5hbWUoKSBnZXRJbnRlcm5hbE5hbWV9KS4gVGhpcworICAgICAqIGxpc3QgaXMgYSBsaXN0IG9mIHtAbGluayBTdHJpbmd9IG9iamVjdHMuCisgICAgICovCisgICAgcHVibGljIExpc3Q8U3RyaW5nPiBpbnRlcmZhY2VzOworCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlIGZyb20gd2hpY2ggdGhpcyBjbGFzcyB3YXMgY29tcGlsZWQuIE1heSBiZQorICAgICAqIDx0dD5udWxsPC90dD4uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBzb3VyY2VGaWxlOworCisgICAgLyoqCisgICAgICogRGVidWcgaW5mb3JtYXRpb24gdG8gY29tcHV0ZSB0aGUgY29ycmVzcG9uZGFuY2UgYmV0d2VlbiBzb3VyY2UgYW5kCisgICAgICogY29tcGlsZWQgZWxlbWVudHMgb2YgdGhlIGNsYXNzLiBNYXkgYmUgPHR0Pm51bGw8L3R0Pi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHNvdXJjZURlYnVnOworCisgICAgLyoqCisgICAgICogVGhlIGludGVybmFsIG5hbWUgb2YgdGhlIGVuY2xvc2luZyBjbGFzcyBvZiB0aGUgY2xhc3MuIE1heSBiZQorICAgICAqIDx0dD5udWxsPC90dD4uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBvdXRlckNsYXNzOworCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhlIG1ldGhvZCB0aGF0IGNvbnRhaW5zIHRoZSBjbGFzcywgb3IgPHR0Pm51bGw8L3R0PiBpZiB0aGUKKyAgICAgKiBjbGFzcyBpcyBub3QgZW5jbG9zZWQgaW4gYSBtZXRob2QuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBvdXRlck1ldGhvZDsKKworICAgIC8qKgorICAgICAqIFRoZSBkZXNjcmlwdG9yIG9mIHRoZSBtZXRob2QgdGhhdCBjb250YWlucyB0aGUgY2xhc3MsIG9yIDx0dD5udWxsPC90dD4KKyAgICAgKiBpZiB0aGUgY2xhc3MgaXMgbm90IGVuY2xvc2VkIGluIGEgbWV0aG9kLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgb3V0ZXJNZXRob2REZXNjOworCisgICAgLyoqCisgICAgICogVGhlIHJ1bnRpbWUgdmlzaWJsZSBhbm5vdGF0aW9ucyBvZiB0aGlzIGNsYXNzLiBUaGlzIGxpc3QgaXMgYSBsaXN0IG9mCisgICAgICoge0BsaW5rIEFubm90YXRpb25Ob2RlfSBvYmplY3RzLiBNYXkgYmUgPHR0Pm51bGw8L3R0Pi4KKyAgICAgKgorICAgICAqIEBhc3NvY2lhdGVzIGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS50cmVlLkFubm90YXRpb25Ob2RlCisgICAgICogQGxhYmVsIHZpc2libGUKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxBbm5vdGF0aW9uTm9kZT4gdmlzaWJsZUFubm90YXRpb25zOworCisgICAgLyoqCisgICAgICogVGhlIHJ1bnRpbWUgaW52aXNpYmxlIGFubm90YXRpb25zIG9mIHRoaXMgY2xhc3MuIFRoaXMgbGlzdCBpcyBhIGxpc3Qgb2YKKyAgICAgKiB7QGxpbmsgQW5ub3RhdGlvbk5vZGV9IG9iamVjdHMuIE1heSBiZSA8dHQ+bnVsbDwvdHQ+LgorICAgICAqCisgICAgICogQGFzc29jaWF0ZXMgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLnRyZWUuQW5ub3RhdGlvbk5vZGUKKyAgICAgKiBAbGFiZWwgaW52aXNpYmxlCisgICAgICovCisgICAgcHVibGljIExpc3Q8QW5ub3RhdGlvbk5vZGU+IGludmlzaWJsZUFubm90YXRpb25zOworCisgICAgLyoqCisgICAgICogVGhlIG5vbiBzdGFuZGFyZCBhdHRyaWJ1dGVzIG9mIHRoaXMgY2xhc3MuIFRoaXMgbGlzdCBpcyBhIGxpc3Qgb2YKKyAgICAgKiB7QGxpbmsgQXR0cmlidXRlfSBvYmplY3RzLiBNYXkgYmUgPHR0Pm51bGw8L3R0Pi4KKyAgICAgKgorICAgICAqIEBhc3NvY2lhdGVzIGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5BdHRyaWJ1dGUKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxBdHRyaWJ1dGU+IGF0dHJzOworCisgICAgLyoqCisgICAgICogSW5mb3JtYXRpb25zIGFib3V0IHRoZSBpbm5lciBjbGFzc2VzIG9mIHRoaXMgY2xhc3MuIFRoaXMgbGlzdCBpcyBhIGxpc3QKKyAgICAgKiBvZiB7QGxpbmsgSW5uZXJDbGFzc05vZGV9IG9iamVjdHMuCisgICAgICoKKyAgICAgKiBAYXNzb2NpYXRlcyBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20udHJlZS5Jbm5lckNsYXNzTm9kZQorICAgICAqLworICAgIHB1YmxpYyBMaXN0PElubmVyQ2xhc3NOb2RlPiBpbm5lckNsYXNzZXM7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZmllbGRzIG9mIHRoaXMgY2xhc3MuIFRoaXMgbGlzdCBpcyBhIGxpc3Qgb2Yge0BsaW5rIEZpZWxkTm9kZX0KKyAgICAgKiBvYmplY3RzLgorICAgICAqCisgICAgICogQGFzc29jaWF0ZXMgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLnRyZWUuRmllbGROb2RlCisgICAgICovCisgICAgcHVibGljIExpc3Q8RmllbGROb2RlPiBmaWVsZHM7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbWV0aG9kcyBvZiB0aGlzIGNsYXNzLiBUaGlzIGxpc3QgaXMgYSBsaXN0IG9mIHtAbGluayBNZXRob2ROb2RlfQorICAgICAqIG9iamVjdHMuCisgICAgICoKKyAgICAgKiBAYXNzb2NpYXRlcyBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20udHJlZS5NZXRob2ROb2RlCisgICAgICovCisgICAgcHVibGljIExpc3Q8TWV0aG9kTm9kZT4gbWV0aG9kczsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0BsaW5rIENsYXNzTm9kZX0uIDxpPlN1YmNsYXNzZXMgbXVzdCBub3QgdXNlIHRoaXMKKyAgICAgKiBjb25zdHJ1Y3RvcjwvaT4uIEluc3RlYWQsIHRoZXkgbXVzdCB1c2UgdGhlIHtAbGluayAjQ2xhc3NOb2RlKGludCl9CisgICAgICogdmVyc2lvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3NOb2RlKCkgeworICAgICAgICB0aGlzKE9wY29kZXMuQVNNNCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGxpbmsgQ2xhc3NOb2RlfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcGkgdGhlIEFTTSBBUEkgdmVyc2lvbiBpbXBsZW1lbnRlZCBieSB0aGlzIHZpc2l0b3IuIE11c3QgYmUgb25lCisgICAgICogICAgICAgIG9mIHtAbGluayBPcGNvZGVzI0FTTTR9LgorICAgICAqLworICAgIHB1YmxpYyBDbGFzc05vZGUoZmluYWwgaW50IGFwaSkgeworICAgICAgICBzdXBlcihhcGkpOworICAgICAgICB0aGlzLmludGVyZmFjZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgdGhpcy5pbm5lckNsYXNzZXMgPSBuZXcgQXJyYXlMaXN0PElubmVyQ2xhc3NOb2RlPigpOworICAgICAgICB0aGlzLmZpZWxkcyA9IG5ldyBBcnJheUxpc3Q8RmllbGROb2RlPigpOworICAgICAgICB0aGlzLm1ldGhvZHMgPSBuZXcgQXJyYXlMaXN0PE1ldGhvZE5vZGU+KCk7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gSW1wbGVtZW50YXRpb24gb2YgdGhlIENsYXNzVmlzaXRvciBhYnN0cmFjdCBjbGFzcworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoCisgICAgICAgIGZpbmFsIGludCB2ZXJzaW9uLAorICAgICAgICBmaW5hbCBpbnQgYWNjZXNzLAorICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSwKKyAgICAgICAgZmluYWwgU3RyaW5nIHNpZ25hdHVyZSwKKyAgICAgICAgZmluYWwgU3RyaW5nIHN1cGVyTmFtZSwKKyAgICAgICAgZmluYWwgU3RyaW5nW10gaW50ZXJmYWNlcykKKyAgICB7CisgICAgICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb247CisgICAgICAgIHRoaXMuYWNjZXNzID0gYWNjZXNzOworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB0aGlzLnNpZ25hdHVyZSA9IHNpZ25hdHVyZTsKKyAgICAgICAgdGhpcy5zdXBlck5hbWUgPSBzdXBlck5hbWU7CisgICAgICAgIGlmIChpbnRlcmZhY2VzICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMuaW50ZXJmYWNlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChpbnRlcmZhY2VzKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFNvdXJjZShmaW5hbCBTdHJpbmcgZmlsZSwgZmluYWwgU3RyaW5nIGRlYnVnKSB7CisgICAgICAgIHNvdXJjZUZpbGUgPSBmaWxlOworICAgICAgICBzb3VyY2VEZWJ1ZyA9IGRlYnVnOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0T3V0ZXJDbGFzcygKKyAgICAgICAgZmluYWwgU3RyaW5nIG93bmVyLAorICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSwKKyAgICAgICAgZmluYWwgU3RyaW5nIGRlc2MpCisgICAgeworICAgICAgICBvdXRlckNsYXNzID0gb3duZXI7CisgICAgICAgIG91dGVyTWV0aG9kID0gbmFtZTsKKyAgICAgICAgb3V0ZXJNZXRob2REZXNjID0gZGVzYzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQW5ub3RhdGlvblZpc2l0b3IgdmlzaXRBbm5vdGF0aW9uKAorICAgICAgICBmaW5hbCBTdHJpbmcgZGVzYywKKyAgICAgICAgZmluYWwgYm9vbGVhbiB2aXNpYmxlKQorICAgIHsKKyAgICAgICAgQW5ub3RhdGlvbk5vZGUgYW4gPSBuZXcgQW5ub3RhdGlvbk5vZGUoZGVzYyk7CisgICAgICAgIGlmICh2aXNpYmxlKSB7CisgICAgICAgICAgICBpZiAodmlzaWJsZUFubm90YXRpb25zID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB2aXNpYmxlQW5ub3RhdGlvbnMgPSBuZXcgQXJyYXlMaXN0PEFubm90YXRpb25Ob2RlPigxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpc2libGVBbm5vdGF0aW9ucy5hZGQoYW4pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGludmlzaWJsZUFubm90YXRpb25zID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbnZpc2libGVBbm5vdGF0aW9ucyA9IG5ldyBBcnJheUxpc3Q8QW5ub3RhdGlvbk5vZGU+KDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW52aXNpYmxlQW5ub3RhdGlvbnMuYWRkKGFuKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYW47CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRBdHRyaWJ1dGUoZmluYWwgQXR0cmlidXRlIGF0dHIpIHsKKyAgICAgICAgaWYgKGF0dHJzID09IG51bGwpIHsKKyAgICAgICAgICAgIGF0dHJzID0gbmV3IEFycmF5TGlzdDxBdHRyaWJ1dGU+KDEpOworICAgICAgICB9CisgICAgICAgIGF0dHJzLmFkZChhdHRyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdElubmVyQ2xhc3MoCisgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lLAorICAgICAgICBmaW5hbCBTdHJpbmcgb3V0ZXJOYW1lLAorICAgICAgICBmaW5hbCBTdHJpbmcgaW5uZXJOYW1lLAorICAgICAgICBmaW5hbCBpbnQgYWNjZXNzKQorICAgIHsKKyAgICAgICAgSW5uZXJDbGFzc05vZGUgaWNuID0gbmV3IElubmVyQ2xhc3NOb2RlKG5hbWUsCisgICAgICAgICAgICAgICAgb3V0ZXJOYW1lLAorICAgICAgICAgICAgICAgIGlubmVyTmFtZSwKKyAgICAgICAgICAgICAgICBhY2Nlc3MpOworICAgICAgICBpbm5lckNsYXNzZXMuYWRkKGljbik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEZpZWxkVmlzaXRvciB2aXNpdEZpZWxkKAorICAgICAgICBmaW5hbCBpbnQgYWNjZXNzLAorICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSwKKyAgICAgICAgZmluYWwgU3RyaW5nIGRlc2MsCisgICAgICAgIGZpbmFsIFN0cmluZyBzaWduYXR1cmUsCisgICAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSkKKyAgICB7CisgICAgICAgIEZpZWxkTm9kZSBmbiA9IG5ldyBGaWVsZE5vZGUoYWNjZXNzLCBuYW1lLCBkZXNjLCBzaWduYXR1cmUsIHZhbHVlKTsKKyAgICAgICAgZmllbGRzLmFkZChmbik7CisgICAgICAgIHJldHVybiBmbjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWV0aG9kVmlzaXRvciB2aXNpdE1ldGhvZCgKKyAgICAgICAgZmluYWwgaW50IGFjY2VzcywKKyAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUsCisgICAgICAgIGZpbmFsIFN0cmluZyBkZXNjLAorICAgICAgICBmaW5hbCBTdHJpbmcgc2lnbmF0dXJlLAorICAgICAgICBmaW5hbCBTdHJpbmdbXSBleGNlcHRpb25zKQorICAgIHsKKyAgICAgICAgTWV0aG9kTm9kZSBtbiA9IG5ldyBNZXRob2ROb2RlKGFjY2VzcywKKyAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgIGRlc2MsCisgICAgICAgICAgICAgICAgc2lnbmF0dXJlLAorICAgICAgICAgICAgICAgIGV4Y2VwdGlvbnMpOworICAgICAgICBtZXRob2RzLmFkZChtbik7CisgICAgICAgIHJldHVybiBtbjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEVuZCgpIHsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBBY2NlcHQgbWV0aG9kCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgdGhhdCB0aGlzIGNsYXNzIG5vZGUgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBnaXZlbiBBU00gQVBJIHZlcnNpb24uCisgICAgICogVGhpcyBtZXRob2RzIGNoZWNrcyB0aGF0IHRoaXMgbm9kZSwgYW5kIGFsbCBpdHMgbm9kZXMgcmVjdXJzaXZlbHksIGRvIG5vdAorICAgICAqIGNvbnRhaW4gZWxlbWVudHMgdGhhdCB3ZXJlIGludHJvZHVjZWQgaW4gbW9yZSByZWNlbnQgdmVyc2lvbnMgb2YgdGhlIEFTTQorICAgICAqIEFQSSB0aGFuIHRoZSBnaXZlbiB2ZXJzaW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGFwaSBhbiBBU00gQVBJIHZlcnNpb24uIE11c3QgYmUgb25lIG9mIHtAbGluayBPcGNvZGVzI0FTTTR9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNoZWNrKGZpbmFsIGludCBhcGkpIHsKKyAgICAgICAgLy8gbm90aGluZyB0byBkbworICAgIH0KKworICAgIC8qKgorICAgICAqIE1ha2VzIHRoZSBnaXZlbiBjbGFzcyB2aXNpdG9yIHZpc2l0IHRoaXMgY2xhc3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY3YgYSBjbGFzcyB2aXNpdG9yLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFjY2VwdChmaW5hbCBDbGFzc1Zpc2l0b3IgY3YpIHsKKyAgICAgICAgLy8gdmlzaXRzIGhlYWRlcgorICAgICAgICBTdHJpbmdbXSBpbnRlcmZhY2VzID0gbmV3IFN0cmluZ1t0aGlzLmludGVyZmFjZXMuc2l6ZSgpXTsKKyAgICAgICAgdGhpcy5pbnRlcmZhY2VzLnRvQXJyYXkoaW50ZXJmYWNlcyk7CisgICAgICAgIGN2LnZpc2l0KHZlcnNpb24sIGFjY2VzcywgbmFtZSwgc2lnbmF0dXJlLCBzdXBlck5hbWUsIGludGVyZmFjZXMpOworICAgICAgICAvLyB2aXNpdHMgc291cmNlCisgICAgICAgIGlmIChzb3VyY2VGaWxlICE9IG51bGwgfHwgc291cmNlRGVidWcgIT0gbnVsbCkgeworICAgICAgICAgICAgY3YudmlzaXRTb3VyY2Uoc291cmNlRmlsZSwgc291cmNlRGVidWcpOworICAgICAgICB9CisgICAgICAgIC8vIHZpc2l0cyBvdXRlciBjbGFzcworICAgICAgICBpZiAob3V0ZXJDbGFzcyAhPSBudWxsKSB7CisgICAgICAgICAgICBjdi52aXNpdE91dGVyQ2xhc3Mob3V0ZXJDbGFzcywgb3V0ZXJNZXRob2QsIG91dGVyTWV0aG9kRGVzYyk7CisgICAgICAgIH0KKyAgICAgICAgLy8gdmlzaXRzIGF0dHJpYnV0ZXMKKyAgICAgICAgaW50IGksIG47CisgICAgICAgIG4gPSB2aXNpYmxlQW5ub3RhdGlvbnMgPT0gbnVsbCA/IDAgOiB2aXNpYmxlQW5ub3RhdGlvbnMuc2l6ZSgpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CisgICAgICAgICAgICBBbm5vdGF0aW9uTm9kZSBhbiA9IHZpc2libGVBbm5vdGF0aW9ucy5nZXQoaSk7CisgICAgICAgICAgICBhbi5hY2NlcHQoY3YudmlzaXRBbm5vdGF0aW9uKGFuLmRlc2MsIHRydWUpKTsKKyAgICAgICAgfQorICAgICAgICBuID0gaW52aXNpYmxlQW5ub3RhdGlvbnMgPT0gbnVsbCA/IDAgOiBpbnZpc2libGVBbm5vdGF0aW9ucy5zaXplKCk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKKyAgICAgICAgICAgIEFubm90YXRpb25Ob2RlIGFuID0gaW52aXNpYmxlQW5ub3RhdGlvbnMuZ2V0KGkpOworICAgICAgICAgICAgYW4uYWNjZXB0KGN2LnZpc2l0QW5ub3RhdGlvbihhbi5kZXNjLCBmYWxzZSkpOworICAgICAgICB9CisgICAgICAgIG4gPSBhdHRycyA9PSBudWxsID8gMCA6IGF0dHJzLnNpemUoKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgeworICAgICAgICAgICAgY3YudmlzaXRBdHRyaWJ1dGUoYXR0cnMuZ2V0KGkpKTsKKyAgICAgICAgfQorICAgICAgICAvLyB2aXNpdHMgaW5uZXIgY2xhc3NlcworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaW5uZXJDbGFzc2VzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBpbm5lckNsYXNzZXMuZ2V0KGkpLmFjY2VwdChjdik7CisgICAgICAgIH0KKyAgICAgICAgLy8gdmlzaXRzIGZpZWxkcworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZmllbGRzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBmaWVsZHMuZ2V0KGkpLmFjY2VwdChjdik7CisgICAgICAgIH0KKyAgICAgICAgLy8gdmlzaXRzIG1ldGhvZHMKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG1ldGhvZHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIG1ldGhvZHMuZ2V0KGkpLmFjY2VwdChjdik7CisgICAgICAgIH0KKyAgICAgICAgLy8gdmlzaXRzIGVuZAorICAgICAgICBjdi52aXNpdEVuZCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vdHJlZS9GaWVsZEluc25Ob2RlLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL3RyZWUvRmllbGRJbnNuTm9kZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2YmNjYTkKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL3RyZWUvRmllbGRJbnNuTm9kZS5qYXZhCkBAIC0wLDAgKzEsMTM1IEBACisvKgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBPcmFjbGUgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKKyAqIHF1ZXN0aW9ucy4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGlzIGF2YWlsYWJsZSB1bmRlciBhbmQgZ292ZXJuZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiBIb3dldmVyLCB0aGUgZm9sbG93aW5nIG5vdGljZSBhY2NvbXBhbmllZCB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGlzCisgKiBmaWxlOgorICoKKyAqIEFTTTogYSB2ZXJ5IHNtYWxsIGFuZCBmYXN0IEphdmEgYnl0ZWNvZGUgbWFuaXB1bGF0aW9uIGZyYW1ld29yaworICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMTEgSU5SSUEsIEZyYW5jZSBUZWxlY29tCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2UgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLnRyZWU7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLk1ldGhvZFZpc2l0b3I7CisKKy8qKgorICogQSBub2RlIHRoYXQgcmVwcmVzZW50cyBhIGZpZWxkIGluc3RydWN0aW9uLiBBIGZpZWxkIGluc3RydWN0aW9uIGlzIGFuCisgKiBpbnN0cnVjdGlvbiB0aGF0IGxvYWRzIG9yIHN0b3JlcyB0aGUgdmFsdWUgb2YgYSBmaWVsZCBvZiBhbiBvYmplY3QuCisgKgorICogQGF1dGhvciBFcmljIEJydW5ldG9uCisgKi8KK3B1YmxpYyBjbGFzcyBGaWVsZEluc25Ob2RlIGV4dGVuZHMgQWJzdHJhY3RJbnNuTm9kZSB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgaW50ZXJuYWwgbmFtZSBvZiB0aGUgZmllbGQncyBvd25lciBjbGFzcyAoc2VlCisgICAgICoge0BsaW5rIGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5UeXBlI2dldEludGVybmFsTmFtZSgpIGdldEludGVybmFsTmFtZX0pLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgb3duZXI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZmllbGQncyBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgbmFtZTsKKworICAgIC8qKgorICAgICAqIFRoZSBmaWVsZCdzIGRlc2NyaXB0b3IgKHNlZSB7QGxpbmsgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLlR5cGV9KS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGRlc2M7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAbGluayBGaWVsZEluc25Ob2RlfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvcGNvZGUgdGhlIG9wY29kZSBvZiB0aGUgdHlwZSBpbnN0cnVjdGlvbiB0byBiZSBjb25zdHJ1Y3RlZC4gVGhpcworICAgICAqICAgICAgICBvcGNvZGUgbXVzdCBiZSBHRVRTVEFUSUMsIFBVVFNUQVRJQywgR0VURklFTEQgb3IgUFVURklFTEQuCisgICAgICogQHBhcmFtIG93bmVyIHRoZSBpbnRlcm5hbCBuYW1lIG9mIHRoZSBmaWVsZCdzIG93bmVyIGNsYXNzIChzZWUKKyAgICAgKiAgICAgICAge0BsaW5rIGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5UeXBlI2dldEludGVybmFsTmFtZSgpIGdldEludGVybmFsTmFtZX0pLgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBmaWVsZCdzIG5hbWUuCisgICAgICogQHBhcmFtIGRlc2MgdGhlIGZpZWxkJ3MgZGVzY3JpcHRvciAoc2VlIHtAbGluayBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uVHlwZX0pLgorICAgICAqLworICAgIHB1YmxpYyBGaWVsZEluc25Ob2RlKAorICAgICAgICBmaW5hbCBpbnQgb3Bjb2RlLAorICAgICAgICBmaW5hbCBTdHJpbmcgb3duZXIsCisgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lLAorICAgICAgICBmaW5hbCBTdHJpbmcgZGVzYykKKyAgICB7CisgICAgICAgIHN1cGVyKG9wY29kZSk7CisgICAgICAgIHRoaXMub3duZXIgPSBvd25lcjsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5kZXNjID0gZGVzYzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBvcGNvZGUgb2YgdGhpcyBpbnN0cnVjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvcGNvZGUgdGhlIG5ldyBpbnN0cnVjdGlvbiBvcGNvZGUuIFRoaXMgb3Bjb2RlIG11c3QgYmUgR0VUU1RBVElDLAorICAgICAqICAgICAgICBQVVRTVEFUSUMsIEdFVEZJRUxEIG9yIFBVVEZJRUxELgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE9wY29kZShmaW5hbCBpbnQgb3Bjb2RlKSB7CisgICAgICAgIHRoaXMub3Bjb2RlID0gb3Bjb2RlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIEZJRUxEX0lOU047CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgYWNjZXB0KGZpbmFsIE1ldGhvZFZpc2l0b3IgY3YpIHsKKyAgICAgICAgY3YudmlzaXRGaWVsZEluc24ob3Bjb2RlLCBvd25lciwgbmFtZSwgZGVzYyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEFic3RyYWN0SW5zbk5vZGUgY2xvbmUoZmluYWwgTWFwPExhYmVsTm9kZSwgTGFiZWxOb2RlPiBsYWJlbHMpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBGaWVsZEluc25Ob2RlKG9wY29kZSwgb3duZXIsIG5hbWUsIGRlc2MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vdHJlZS9GaWVsZE5vZGUuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vdHJlZS9GaWVsZE5vZGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjU4NDJiCi0tLSAvZGV2L251bGwKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS90cmVlL0ZpZWxkTm9kZS5qYXZhCkBAIC0wLDAgKzEsMjcyIEBACisvKgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBPcmFjbGUgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKKyAqIHF1ZXN0aW9ucy4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGlzIGF2YWlsYWJsZSB1bmRlciBhbmQgZ292ZXJuZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiBIb3dldmVyLCB0aGUgZm9sbG93aW5nIG5vdGljZSBhY2NvbXBhbmllZCB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGlzCisgKiBmaWxlOgorICoKKyAqIEFTTTogYSB2ZXJ5IHNtYWxsIGFuZCBmYXN0IEphdmEgYnl0ZWNvZGUgbWFuaXB1bGF0aW9uIGZyYW1ld29yaworICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMTEgSU5SSUEsIEZyYW5jZSBUZWxlY29tCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2UgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLnRyZWU7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLkFubm90YXRpb25WaXNpdG9yOworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5BdHRyaWJ1dGU7CitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLkNsYXNzVmlzaXRvcjsKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uRmllbGRWaXNpdG9yOworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5PcGNvZGVzOworCisvKioKKyAqIEEgbm9kZSB0aGF0IHJlcHJlc2VudHMgYSBmaWVsZC4KKyAqCisgKiBAYXV0aG9yIEVyaWMgQnJ1bmV0b24KKyAqLworcHVibGljIGNsYXNzIEZpZWxkTm9kZSBleHRlbmRzIEZpZWxkVmlzaXRvciB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZmllbGQncyBhY2Nlc3MgZmxhZ3MgKHNlZSB7QGxpbmsgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLk9wY29kZXN9KS4gVGhpcworICAgICAqIGZpZWxkIGFsc28gaW5kaWNhdGVzIGlmIHRoZSBmaWVsZCBpcyBzeW50aGV0aWMgYW5kL29yIGRlcHJlY2F0ZWQuCisgICAgICovCisgICAgcHVibGljIGludCBhY2Nlc3M7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZmllbGQncyBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgbmFtZTsKKworICAgIC8qKgorICAgICAqIFRoZSBmaWVsZCdzIGRlc2NyaXB0b3IgKHNlZSB7QGxpbmsgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLlR5cGV9KS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGRlc2M7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZmllbGQncyBzaWduYXR1cmUuIE1heSBiZSA8dHQ+bnVsbDwvdHQ+LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgc2lnbmF0dXJlOworCisgICAgLyoqCisgICAgICogVGhlIGZpZWxkJ3MgaW5pdGlhbCB2YWx1ZS4gVGhpcyBmaWVsZCwgd2hpY2ggbWF5IGJlIDx0dD5udWxsPC90dD4gaWYKKyAgICAgKiB0aGUgZmllbGQgZG9lcyBub3QgaGF2ZSBhbiBpbml0aWFsIHZhbHVlLCBtdXN0IGJlIGFuIHtAbGluayBJbnRlZ2VyfSwgYQorICAgICAqIHtAbGluayBGbG9hdH0sIGEge0BsaW5rIExvbmd9LCBhIHtAbGluayBEb3VibGV9IG9yIGEge0BsaW5rIFN0cmluZ30uCisgICAgICovCisgICAgcHVibGljIE9iamVjdCB2YWx1ZTsKKworICAgIC8qKgorICAgICAqIFRoZSBydW50aW1lIHZpc2libGUgYW5ub3RhdGlvbnMgb2YgdGhpcyBmaWVsZC4gVGhpcyBsaXN0IGlzIGEgbGlzdCBvZgorICAgICAqIHtAbGluayBBbm5vdGF0aW9uTm9kZX0gb2JqZWN0cy4gTWF5IGJlIDx0dD5udWxsPC90dD4uCisgICAgICoKKyAgICAgKiBAYXNzb2NpYXRlcyBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20udHJlZS5Bbm5vdGF0aW9uTm9kZQorICAgICAqIEBsYWJlbCB2aXNpYmxlCisgICAgICovCisgICAgcHVibGljIExpc3Q8QW5ub3RhdGlvbk5vZGU+IHZpc2libGVBbm5vdGF0aW9uczsKKworICAgIC8qKgorICAgICAqIFRoZSBydW50aW1lIGludmlzaWJsZSBhbm5vdGF0aW9ucyBvZiB0aGlzIGZpZWxkLiBUaGlzIGxpc3QgaXMgYSBsaXN0IG9mCisgICAgICoge0BsaW5rIEFubm90YXRpb25Ob2RlfSBvYmplY3RzLiBNYXkgYmUgPHR0Pm51bGw8L3R0Pi4KKyAgICAgKgorICAgICAqIEBhc3NvY2lhdGVzIGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS50cmVlLkFubm90YXRpb25Ob2RlCisgICAgICogQGxhYmVsIGludmlzaWJsZQorICAgICAqLworICAgIHB1YmxpYyBMaXN0PEFubm90YXRpb25Ob2RlPiBpbnZpc2libGVBbm5vdGF0aW9uczsKKworICAgIC8qKgorICAgICAqIFRoZSBub24gc3RhbmRhcmQgYXR0cmlidXRlcyBvZiB0aGlzIGZpZWxkLiBUaGlzIGxpc3QgaXMgYSBsaXN0IG9mCisgICAgICoge0BsaW5rIEF0dHJpYnV0ZX0gb2JqZWN0cy4gTWF5IGJlIDx0dD5udWxsPC90dD4uCisgICAgICoKKyAgICAgKiBAYXNzb2NpYXRlcyBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uQXR0cmlidXRlCisgICAgICovCisgICAgcHVibGljIExpc3Q8QXR0cmlidXRlPiBhdHRyczsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0BsaW5rIEZpZWxkTm9kZX0uIDxpPlN1YmNsYXNzZXMgbXVzdCBub3QgdXNlIHRoaXMKKyAgICAgKiBjb25zdHJ1Y3RvcjwvaT4uIEluc3RlYWQsIHRoZXkgbXVzdCB1c2UgdGhlCisgICAgICoge0BsaW5rICNGaWVsZE5vZGUoaW50LCBpbnQsIFN0cmluZywgU3RyaW5nLCBTdHJpbmcsIE9iamVjdCl9IHZlcnNpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWNjZXNzIHRoZSBmaWVsZCdzIGFjY2VzcyBmbGFncyAoc2VlCisgICAgICogICAgICAgIHtAbGluayBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uT3Bjb2Rlc30pLiBUaGlzIHBhcmFtZXRlciBhbHNvIGluZGljYXRlcworICAgICAqICAgICAgICBpZiB0aGUgZmllbGQgaXMgc3ludGhldGljIGFuZC9vciBkZXByZWNhdGVkLgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBmaWVsZCdzIG5hbWUuCisgICAgICogQHBhcmFtIGRlc2MgdGhlIGZpZWxkJ3MgZGVzY3JpcHRvciAoc2VlIHtAbGluayBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uVHlwZQorICAgICAqICAgICAgICBUeXBlfSkuCisgICAgICogQHBhcmFtIHNpZ25hdHVyZSB0aGUgZmllbGQncyBzaWduYXR1cmUuCisgICAgICogQHBhcmFtIHZhbHVlIHRoZSBmaWVsZCdzIGluaXRpYWwgdmFsdWUuIFRoaXMgcGFyYW1ldGVyLCB3aGljaCBtYXkgYmUKKyAgICAgKiAgICAgICAgPHR0Pm51bGw8L3R0PiBpZiB0aGUgZmllbGQgZG9lcyBub3QgaGF2ZSBhbiBpbml0aWFsIHZhbHVlLCBtdXN0IGJlCisgICAgICogICAgICAgIGFuIHtAbGluayBJbnRlZ2VyfSwgYSB7QGxpbmsgRmxvYXR9LCBhIHtAbGluayBMb25nfSwgYQorICAgICAqICAgICAgICB7QGxpbmsgRG91YmxlfSBvciBhIHtAbGluayBTdHJpbmd9LgorICAgICAqLworICAgIHB1YmxpYyBGaWVsZE5vZGUoCisgICAgICAgIGZpbmFsIGludCBhY2Nlc3MsCisgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lLAorICAgICAgICBmaW5hbCBTdHJpbmcgZGVzYywKKyAgICAgICAgZmluYWwgU3RyaW5nIHNpZ25hdHVyZSwKKyAgICAgICAgZmluYWwgT2JqZWN0IHZhbHVlKQorICAgIHsKKyAgICAgICAgdGhpcyhPcGNvZGVzLkFTTTQsIGFjY2VzcywgbmFtZSwgZGVzYywgc2lnbmF0dXJlLCB2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGxpbmsgRmllbGROb2RlfS4gPGk+U3ViY2xhc3NlcyBtdXN0IG5vdCB1c2UgdGhpcworICAgICAqIGNvbnN0cnVjdG9yPC9pPi4gSW5zdGVhZCwgdGhleSBtdXN0IHVzZSB0aGUKKyAgICAgKiB7QGxpbmsgI0ZpZWxkTm9kZShpbnQsIGludCwgU3RyaW5nLCBTdHJpbmcsIFN0cmluZywgT2JqZWN0KX0gdmVyc2lvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcGkgdGhlIEFTTSBBUEkgdmVyc2lvbiBpbXBsZW1lbnRlZCBieSB0aGlzIHZpc2l0b3IuIE11c3QgYmUgb25lCisgICAgICogICAgICAgIG9mIHtAbGluayBPcGNvZGVzI0FTTTR9LgorICAgICAqIEBwYXJhbSBhY2Nlc3MgdGhlIGZpZWxkJ3MgYWNjZXNzIGZsYWdzIChzZWUKKyAgICAgKiAgICAgICAge0BsaW5rIGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5PcGNvZGVzfSkuIFRoaXMgcGFyYW1ldGVyIGFsc28gaW5kaWNhdGVzCisgICAgICogICAgICAgIGlmIHRoZSBmaWVsZCBpcyBzeW50aGV0aWMgYW5kL29yIGRlcHJlY2F0ZWQuCisgICAgICogQHBhcmFtIG5hbWUgdGhlIGZpZWxkJ3MgbmFtZS4KKyAgICAgKiBAcGFyYW0gZGVzYyB0aGUgZmllbGQncyBkZXNjcmlwdG9yIChzZWUge0BsaW5rIGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5UeXBlCisgICAgICogICAgICAgIFR5cGV9KS4KKyAgICAgKiBAcGFyYW0gc2lnbmF0dXJlIHRoZSBmaWVsZCdzIHNpZ25hdHVyZS4KKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIGZpZWxkJ3MgaW5pdGlhbCB2YWx1ZS4gVGhpcyBwYXJhbWV0ZXIsIHdoaWNoIG1heSBiZQorICAgICAqICAgICAgICA8dHQ+bnVsbDwvdHQ+IGlmIHRoZSBmaWVsZCBkb2VzIG5vdCBoYXZlIGFuIGluaXRpYWwgdmFsdWUsIG11c3QgYmUKKyAgICAgKiAgICAgICAgYW4ge0BsaW5rIEludGVnZXJ9LCBhIHtAbGluayBGbG9hdH0sIGEge0BsaW5rIExvbmd9LCBhCisgICAgICogICAgICAgIHtAbGluayBEb3VibGV9IG9yIGEge0BsaW5rIFN0cmluZ30uCisgICAgICovCisgICAgcHVibGljIEZpZWxkTm9kZSgKKyAgICAgICAgZmluYWwgaW50IGFwaSwKKyAgICAgICAgZmluYWwgaW50IGFjY2VzcywKKyAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUsCisgICAgICAgIGZpbmFsIFN0cmluZyBkZXNjLAorICAgICAgICBmaW5hbCBTdHJpbmcgc2lnbmF0dXJlLAorICAgICAgICBmaW5hbCBPYmplY3QgdmFsdWUpCisgICAgeworICAgICAgICBzdXBlcihhcGkpOworICAgICAgICB0aGlzLmFjY2VzcyA9IGFjY2VzczsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5kZXNjID0gZGVzYzsKKyAgICAgICAgdGhpcy5zaWduYXR1cmUgPSBzaWduYXR1cmU7CisgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgRmllbGRWaXNpdG9yIGFic3RyYWN0IGNsYXNzCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQW5ub3RhdGlvblZpc2l0b3IgdmlzaXRBbm5vdGF0aW9uKAorICAgICAgICBmaW5hbCBTdHJpbmcgZGVzYywKKyAgICAgICAgZmluYWwgYm9vbGVhbiB2aXNpYmxlKQorICAgIHsKKyAgICAgICAgQW5ub3RhdGlvbk5vZGUgYW4gPSBuZXcgQW5ub3RhdGlvbk5vZGUoZGVzYyk7CisgICAgICAgIGlmICh2aXNpYmxlKSB7CisgICAgICAgICAgICBpZiAodmlzaWJsZUFubm90YXRpb25zID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB2aXNpYmxlQW5ub3RhdGlvbnMgPSBuZXcgQXJyYXlMaXN0PEFubm90YXRpb25Ob2RlPigxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpc2libGVBbm5vdGF0aW9ucy5hZGQoYW4pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGludmlzaWJsZUFubm90YXRpb25zID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbnZpc2libGVBbm5vdGF0aW9ucyA9IG5ldyBBcnJheUxpc3Q8QW5ub3RhdGlvbk5vZGU+KDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW52aXNpYmxlQW5ub3RhdGlvbnMuYWRkKGFuKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYW47CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRBdHRyaWJ1dGUoZmluYWwgQXR0cmlidXRlIGF0dHIpIHsKKyAgICAgICAgaWYgKGF0dHJzID09IG51bGwpIHsKKyAgICAgICAgICAgIGF0dHJzID0gbmV3IEFycmF5TGlzdDxBdHRyaWJ1dGU+KDEpOworICAgICAgICB9CisgICAgICAgIGF0dHJzLmFkZChhdHRyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEVuZCgpIHsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBBY2NlcHQgbWV0aG9kcworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIHRoYXQgdGhpcyBmaWVsZCBub2RlIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgZ2l2ZW4gQVNNIEFQSSB2ZXJzaW9uLgorICAgICAqIFRoaXMgbWV0aG9kcyBjaGVja3MgdGhhdCB0aGlzIG5vZGUsIGFuZCBhbGwgaXRzIG5vZGVzIHJlY3Vyc2l2ZWx5LCBkbyBub3QKKyAgICAgKiBjb250YWluIGVsZW1lbnRzIHRoYXQgd2VyZSBpbnRyb2R1Y2VkIGluIG1vcmUgcmVjZW50IHZlcnNpb25zIG9mIHRoZSBBU00KKyAgICAgKiBBUEkgdGhhbiB0aGUgZ2l2ZW4gdmVyc2lvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcGkgYW4gQVNNIEFQSSB2ZXJzaW9uLiBNdXN0IGJlIG9uZSBvZiB7QGxpbmsgT3Bjb2RlcyNBU000fS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjaGVjayhmaW5hbCBpbnQgYXBpKSB7CisgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYWtlcyB0aGUgZ2l2ZW4gY2xhc3MgdmlzaXRvciB2aXNpdCB0aGlzIGZpZWxkLgorICAgICAqCisgICAgICogQHBhcmFtIGN2IGEgY2xhc3MgdmlzaXRvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhY2NlcHQoZmluYWwgQ2xhc3NWaXNpdG9yIGN2KSB7CisgICAgICAgIEZpZWxkVmlzaXRvciBmdiA9IGN2LnZpc2l0RmllbGQoYWNjZXNzLCBuYW1lLCBkZXNjLCBzaWduYXR1cmUsIHZhbHVlKTsKKyAgICAgICAgaWYgKGZ2ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpbnQgaSwgbjsKKyAgICAgICAgbiA9IHZpc2libGVBbm5vdGF0aW9ucyA9PSBudWxsID8gMCA6IHZpc2libGVBbm5vdGF0aW9ucy5zaXplKCk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKKyAgICAgICAgICAgIEFubm90YXRpb25Ob2RlIGFuID0gdmlzaWJsZUFubm90YXRpb25zLmdldChpKTsKKyAgICAgICAgICAgIGFuLmFjY2VwdChmdi52aXNpdEFubm90YXRpb24oYW4uZGVzYywgdHJ1ZSkpOworICAgICAgICB9CisgICAgICAgIG4gPSBpbnZpc2libGVBbm5vdGF0aW9ucyA9PSBudWxsID8gMCA6IGludmlzaWJsZUFubm90YXRpb25zLnNpemUoKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgeworICAgICAgICAgICAgQW5ub3RhdGlvbk5vZGUgYW4gPSBpbnZpc2libGVBbm5vdGF0aW9ucy5nZXQoaSk7CisgICAgICAgICAgICBhbi5hY2NlcHQoZnYudmlzaXRBbm5vdGF0aW9uKGFuLmRlc2MsIGZhbHNlKSk7CisgICAgICAgIH0KKyAgICAgICAgbiA9IGF0dHJzID09IG51bGwgPyAwIDogYXR0cnMuc2l6ZSgpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CisgICAgICAgICAgICBmdi52aXNpdEF0dHJpYnV0ZShhdHRycy5nZXQoaSkpOworICAgICAgICB9CisgICAgICAgIGZ2LnZpc2l0RW5kKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS90cmVlL0ZyYW1lTm9kZS5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS90cmVlL0ZyYW1lTm9kZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyOTc1YjMKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL3RyZWUvRnJhbWVOb2RlLmphdmEKQEAgLTAsMCArMSwyNDAgQEAKKy8qCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IE9yYWNsZSBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQorICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQorICogcXVlc3Rpb25zLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgaXMgYXZhaWxhYmxlIHVuZGVyIGFuZCBnb3Zlcm5lZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIEhvd2V2ZXIsIHRoZSBmb2xsb3dpbmcgbm90aWNlIGFjY29tcGFuaWVkIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoaXMKKyAqIGZpbGU6CisgKgorICogQVNNOiBhIHZlcnkgc21hbGwgYW5kIGZhc3QgSmF2YSBieXRlY29kZSBtYW5pcHVsYXRpb24gZnJhbWV3b3JrCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAxMSBJTlJJQSwgRnJhbmNlIFRlbGVjb20KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20udHJlZTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLk1ldGhvZFZpc2l0b3I7CitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLk9wY29kZXM7CisKKy8qKgorICogQSBub2RlIHRoYXQgcmVwcmVzZW50cyBhIHN0YWNrIG1hcCBmcmFtZS4gVGhlc2Ugbm9kZXMgYXJlIHBzZXVkbyBpbnN0cnVjdGlvbgorICogbm9kZXMgaW4gb3JkZXIgdG8gYmUgaW5zZXJ0ZWQgaW4gYW4gaW5zdHJ1Y3Rpb24gbGlzdC4gSW4gZmFjdCB0aGVzZSBub2RlcworICogbXVzdCgqKSBiZSBpbnNlcnRlZCA8aT5qdXN0IGJlZm9yZTwvaT4gYW55IGluc3RydWN0aW9uIG5vZGUgPGI+aTwvYj4gdGhhdAorICogZm9sbG93cyBhbiB1bmNvbmRpdGlvbm5hbCBicmFuY2ggaW5zdHJ1Y3Rpb24gc3VjaCBhcyBHT1RPIG9yIFRIUk9XLCB0aGF0IGlzCisgKiB0aGUgdGFyZ2V0IG9mIGEganVtcCBpbnN0cnVjdGlvbiwgb3IgdGhhdCBzdGFydHMgYW4gZXhjZXB0aW9uIGhhbmRsZXIgYmxvY2suCisgKiBUaGUgc3RhY2sgbWFwIGZyYW1lIHR5cGVzIG11c3QgZGVzY3JpYmUgdGhlIHZhbHVlcyBvZiB0aGUgbG9jYWwgdmFyaWFibGVzIGFuZAorICogb2YgdGhlIG9wZXJhbmQgc3RhY2sgZWxlbWVudHMgPGk+anVzdCBiZWZvcmU8L2k+IDxiPmk8L2I+IGlzIGV4ZWN1dGVkLiA8YnI+CisgKiA8YnI+ICgqKSB0aGlzIGlzIG1hbmRhdG9yeSBvbmx5IGZvciBjbGFzc2VzIHdob3NlIHZlcnNpb24gaXMgZ3JlYXRlciB0aGFuIG9yCisgKiBlcXVhbCB0byB7QGxpbmsgT3Bjb2RlcyNWMV82IFYxXzZ9LgorICoKKyAqIEBhdXRob3IgRXJpYyBCcnVuZXRvbgorICovCitwdWJsaWMgY2xhc3MgRnJhbWVOb2RlIGV4dGVuZHMgQWJzdHJhY3RJbnNuTm9kZSB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiB0aGlzIGZyYW1lLiBNdXN0IGJlIHtAbGluayBPcGNvZGVzI0ZfTkVXfSBmb3IgZXhwYW5kZWQKKyAgICAgKiBmcmFtZXMsIG9yIHtAbGluayBPcGNvZGVzI0ZfRlVMTH0sIHtAbGluayBPcGNvZGVzI0ZfQVBQRU5EfSwKKyAgICAgKiB7QGxpbmsgT3Bjb2RlcyNGX0NIT1B9LCB7QGxpbmsgT3Bjb2RlcyNGX1NBTUV9IG9yCisgICAgICoge0BsaW5rIE9wY29kZXMjRl9BUFBFTkR9LCB7QGxpbmsgT3Bjb2RlcyNGX1NBTUUxfSBmb3IgY29tcHJlc3NlZCBmcmFtZXMuCisgICAgICovCisgICAgcHVibGljIGludCB0eXBlOworCisgICAgLyoqCisgICAgICogVGhlIHR5cGVzIG9mIHRoZSBsb2NhbCB2YXJpYWJsZXMgb2YgdGhpcyBzdGFjayBtYXAgZnJhbWUuIEVsZW1lbnRzIG9mCisgICAgICogdGhpcyBsaXN0IGNhbiBiZSBJbnRlZ2VyLCBTdHJpbmcgb3IgTGFiZWxOb2RlIG9iamVjdHMgKGZvciBwcmltaXRpdmUsCisgICAgICogcmVmZXJlbmNlIGFuZCB1bmluaXRpYWxpemVkIHR5cGVzIHJlc3BlY3RpdmVseSAtIHNlZQorICAgICAqIHtAbGluayBNZXRob2RWaXNpdG9yfSkuCisgICAgICovCisgICAgcHVibGljIExpc3Q8T2JqZWN0PiBsb2NhbDsKKworICAgIC8qKgorICAgICAqIFRoZSB0eXBlcyBvZiB0aGUgb3BlcmFuZCBzdGFjayBlbGVtZW50cyBvZiB0aGlzIHN0YWNrIG1hcCBmcmFtZS4gRWxlbWVudHMKKyAgICAgKiBvZiB0aGlzIGxpc3QgY2FuIGJlIEludGVnZXIsIFN0cmluZyBvciBMYWJlbE5vZGUgb2JqZWN0cyAoZm9yIHByaW1pdGl2ZSwKKyAgICAgKiByZWZlcmVuY2UgYW5kIHVuaW5pdGlhbGl6ZWQgdHlwZXMgcmVzcGVjdGl2ZWx5IC0gc2VlCisgICAgICoge0BsaW5rIE1ldGhvZFZpc2l0b3J9KS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxPYmplY3Q+IHN0YWNrOworCisgICAgcHJpdmF0ZSBGcmFtZU5vZGUoKSB7CisgICAgICAgIHN1cGVyKC0xKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAbGluayBGcmFtZU5vZGV9LgorICAgICAqCisgICAgICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgb2YgdGhpcyBmcmFtZS4gTXVzdCBiZSB7QGxpbmsgT3Bjb2RlcyNGX05FV30gZm9yCisgICAgICogICAgICAgIGV4cGFuZGVkIGZyYW1lcywgb3Ige0BsaW5rIE9wY29kZXMjRl9GVUxMfSwKKyAgICAgKiAgICAgICAge0BsaW5rIE9wY29kZXMjRl9BUFBFTkR9LCB7QGxpbmsgT3Bjb2RlcyNGX0NIT1B9LAorICAgICAqICAgICAgICB7QGxpbmsgT3Bjb2RlcyNGX1NBTUV9IG9yIHtAbGluayBPcGNvZGVzI0ZfQVBQRU5EfSwKKyAgICAgKiAgICAgICAge0BsaW5rIE9wY29kZXMjRl9TQU1FMX0gZm9yIGNvbXByZXNzZWQgZnJhbWVzLgorICAgICAqIEBwYXJhbSBuTG9jYWwgbnVtYmVyIG9mIGxvY2FsIHZhcmlhYmxlcyBvZiB0aGlzIHN0YWNrIG1hcCBmcmFtZS4KKyAgICAgKiBAcGFyYW0gbG9jYWwgdGhlIHR5cGVzIG9mIHRoZSBsb2NhbCB2YXJpYWJsZXMgb2YgdGhpcyBzdGFjayBtYXAgZnJhbWUuCisgICAgICogICAgICAgIEVsZW1lbnRzIG9mIHRoaXMgbGlzdCBjYW4gYmUgSW50ZWdlciwgU3RyaW5nIG9yIExhYmVsTm9kZSBvYmplY3RzCisgICAgICogICAgICAgIChmb3IgcHJpbWl0aXZlLCByZWZlcmVuY2UgYW5kIHVuaW5pdGlhbGl6ZWQgdHlwZXMgcmVzcGVjdGl2ZWx5IC0KKyAgICAgKiAgICAgICAgc2VlIHtAbGluayBNZXRob2RWaXNpdG9yfSkuCisgICAgICogQHBhcmFtIG5TdGFjayBudW1iZXIgb2Ygb3BlcmFuZCBzdGFjayBlbGVtZW50cyBvZiB0aGlzIHN0YWNrIG1hcCBmcmFtZS4KKyAgICAgKiBAcGFyYW0gc3RhY2sgdGhlIHR5cGVzIG9mIHRoZSBvcGVyYW5kIHN0YWNrIGVsZW1lbnRzIG9mIHRoaXMgc3RhY2sgbWFwCisgICAgICogICAgICAgIGZyYW1lLiBFbGVtZW50cyBvZiB0aGlzIGxpc3QgY2FuIGJlIEludGVnZXIsIFN0cmluZyBvciBMYWJlbE5vZGUKKyAgICAgKiAgICAgICAgb2JqZWN0cyAoZm9yIHByaW1pdGl2ZSwgcmVmZXJlbmNlIGFuZCB1bmluaXRpYWxpemVkIHR5cGVzCisgICAgICogICAgICAgIHJlc3BlY3RpdmVseSAtIHNlZSB7QGxpbmsgTWV0aG9kVmlzaXRvcn0pLgorICAgICAqLworICAgIHB1YmxpYyBGcmFtZU5vZGUoCisgICAgICAgIGZpbmFsIGludCB0eXBlLAorICAgICAgICBmaW5hbCBpbnQgbkxvY2FsLAorICAgICAgICBmaW5hbCBPYmplY3RbXSBsb2NhbCwKKyAgICAgICAgZmluYWwgaW50IG5TdGFjaywKKyAgICAgICAgZmluYWwgT2JqZWN0W10gc3RhY2spCisgICAgeworICAgICAgICBzdXBlcigtMSk7CisgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkZfTkVXOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkZfRlVMTDoKKyAgICAgICAgICAgICAgICB0aGlzLmxvY2FsID0gYXNMaXN0KG5Mb2NhbCwgbG9jYWwpOworICAgICAgICAgICAgICAgIHRoaXMuc3RhY2sgPSBhc0xpc3QoblN0YWNrLCBzdGFjayk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRl9BUFBFTkQ6CisgICAgICAgICAgICAgICAgdGhpcy5sb2NhbCA9IGFzTGlzdChuTG9jYWwsIGxvY2FsKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5GX0NIT1A6CisgICAgICAgICAgICAgICAgdGhpcy5sb2NhbCA9IEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtuTG9jYWxdKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5GX1NBTUU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRl9TQU1FMToKKyAgICAgICAgICAgICAgICB0aGlzLnN0YWNrID0gYXNMaXN0KDEsIHN0YWNrKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIEZSQU1FOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1ha2VzIHRoZSBnaXZlbiB2aXNpdG9yIHZpc2l0IHRoaXMgc3RhY2sgbWFwIGZyYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIG12IGEgbWV0aG9kIHZpc2l0b3IuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgYWNjZXB0KGZpbmFsIE1ldGhvZFZpc2l0b3IgbXYpIHsKKyAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRl9ORVc6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRl9GVUxMOgorICAgICAgICAgICAgICAgIG12LnZpc2l0RnJhbWUodHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsLnNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzQXJyYXkobG9jYWwpLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2suc2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgYXNBcnJheShzdGFjaykpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkZfQVBQRU5EOgorICAgICAgICAgICAgICAgIG12LnZpc2l0RnJhbWUodHlwZSwgbG9jYWwuc2l6ZSgpLCBhc0FycmF5KGxvY2FsKSwgMCwgbnVsbCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRl9DSE9QOgorICAgICAgICAgICAgICAgIG12LnZpc2l0RnJhbWUodHlwZSwgbG9jYWwuc2l6ZSgpLCBudWxsLCAwLCBudWxsKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5GX1NBTUU6CisgICAgICAgICAgICAgICAgbXYudmlzaXRGcmFtZSh0eXBlLCAwLCBudWxsLCAwLCBudWxsKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5GX1NBTUUxOgorICAgICAgICAgICAgICAgIG12LnZpc2l0RnJhbWUodHlwZSwgMCwgbnVsbCwgMSwgYXNBcnJheShzdGFjaykpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEFic3RyYWN0SW5zbk5vZGUgY2xvbmUoZmluYWwgTWFwPExhYmVsTm9kZSwgTGFiZWxOb2RlPiBsYWJlbHMpIHsKKyAgICAgICAgRnJhbWVOb2RlIGNsb25lID0gbmV3IEZyYW1lTm9kZSgpOworICAgICAgICBjbG9uZS50eXBlID0gdHlwZTsKKyAgICAgICAgaWYgKGxvY2FsICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNsb25lLmxvY2FsID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxvY2FsLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgT2JqZWN0IGwgPSBsb2NhbC5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGwgaW5zdGFuY2VvZiBMYWJlbE5vZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbCA9IGxhYmVscy5nZXQobCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNsb25lLmxvY2FsLmFkZChsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoc3RhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgY2xvbmUuc3RhY2sgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RhY2suc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICBPYmplY3QgcyA9IHN0YWNrLmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAocyBpbnN0YW5jZW9mIExhYmVsTm9kZSkgeworICAgICAgICAgICAgICAgICAgICBzID0gbGFiZWxzLmdldChzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2xvbmUuc3RhY2suYWRkKHMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBjbG9uZTsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIHByaXZhdGUgc3RhdGljIExpc3Q8T2JqZWN0PiBhc0xpc3QoZmluYWwgaW50IG4sIGZpbmFsIE9iamVjdFtdIG8pIHsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3Qobykuc3ViTGlzdCgwLCBuKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBPYmplY3RbXSBhc0FycmF5KGZpbmFsIExpc3Q8T2JqZWN0PiBsKSB7CisgICAgICAgIE9iamVjdFtdIG9ianMgPSBuZXcgT2JqZWN0W2wuc2l6ZSgpXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvYmpzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBPYmplY3QgbyA9IGwuZ2V0KGkpOworICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBMYWJlbE5vZGUpIHsKKyAgICAgICAgICAgICAgICBvID0gKChMYWJlbE5vZGUpIG8pLmdldExhYmVsKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvYmpzW2ldID0gbzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gb2JqczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL3RyZWUvSWluY0luc25Ob2RlLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL3RyZWUvSWluY0luc25Ob2RlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmMzOTBlNQotLS0gL2Rldi9udWxsCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vdHJlZS9JaW5jSW5zbk5vZGUuamF2YQpAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgT3JhY2xlIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCisgKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CisgKiBxdWVzdGlvbnMuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBpcyBhdmFpbGFibGUgdW5kZXIgYW5kIGdvdmVybmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogSG93ZXZlciwgdGhlIGZvbGxvd2luZyBub3RpY2UgYWNjb21wYW5pZWQgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhpcworICogZmlsZToKKyAqCisgKiBBU006IGEgdmVyeSBzbWFsbCBhbmQgZmFzdCBKYXZhIGJ5dGVjb2RlIG1hbmlwdWxhdGlvbiBmcmFtZXdvcmsKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDExIElOUklBLCBGcmFuY2UgVGVsZWNvbQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS50cmVlOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5NZXRob2RWaXNpdG9yOworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5PcGNvZGVzOworCisvKioKKyAqIEEgbm9kZSB0aGF0IHJlcHJlc2VudHMgYW4gSUlOQyBpbnN0cnVjdGlvbi4KKyAqCisgKiBAYXV0aG9yIEVyaWMgQnJ1bmV0b24KKyAqLworcHVibGljIGNsYXNzIElpbmNJbnNuTm9kZSBleHRlbmRzIEFic3RyYWN0SW5zbk5vZGUgeworCisgICAgLyoqCisgICAgICogSW5kZXggb2YgdGhlIGxvY2FsIHZhcmlhYmxlIHRvIGJlIGluY3JlbWVudGVkLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgdmFyOworCisgICAgLyoqCisgICAgICogQW1vdW50IHRvIGluY3JlbWVudCB0aGUgbG9jYWwgdmFyaWFibGUgYnkuCisgICAgICovCisgICAgcHVibGljIGludCBpbmNyOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGxpbmsgSWluY0luc25Ob2RlfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YXIgaW5kZXggb2YgdGhlIGxvY2FsIHZhcmlhYmxlIHRvIGJlIGluY3JlbWVudGVkLgorICAgICAqIEBwYXJhbSBpbmNyIGluY3JlbWVudCBhbW91bnQgdG8gaW5jcmVtZW50IHRoZSBsb2NhbCB2YXJpYWJsZSBieS4KKyAgICAgKi8KKyAgICBwdWJsaWMgSWluY0luc25Ob2RlKGZpbmFsIGludCB2YXIsIGZpbmFsIGludCBpbmNyKSB7CisgICAgICAgIHN1cGVyKE9wY29kZXMuSUlOQyk7CisgICAgICAgIHRoaXMudmFyID0gdmFyOworICAgICAgICB0aGlzLmluY3IgPSBpbmNyOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIElJTkNfSU5TTjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhY2NlcHQoZmluYWwgTWV0aG9kVmlzaXRvciBtdikgeworICAgICAgICBtdi52aXNpdElpbmNJbnNuKHZhciwgaW5jcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEFic3RyYWN0SW5zbk5vZGUgY2xvbmUoZmluYWwgTWFwPExhYmVsTm9kZSwgTGFiZWxOb2RlPiBsYWJlbHMpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBJaW5jSW5zbk5vZGUodmFyLCBpbmNyKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL3RyZWUvSW5uZXJDbGFzc05vZGUuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vdHJlZS9Jbm5lckNsYXNzTm9kZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4ZTE5ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL3RyZWUvSW5uZXJDbGFzc05vZGUuamF2YQpAQCAtMCwwICsxLDEzMCBAQAorLyoKKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgT3JhY2xlIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCisgKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CisgKiBxdWVzdGlvbnMuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBpcyBhdmFpbGFibGUgdW5kZXIgYW5kIGdvdmVybmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogSG93ZXZlciwgdGhlIGZvbGxvd2luZyBub3RpY2UgYWNjb21wYW5pZWQgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhpcworICogZmlsZToKKyAqCisgKiBBU006IGEgdmVyeSBzbWFsbCBhbmQgZmFzdCBKYXZhIGJ5dGVjb2RlIG1hbmlwdWxhdGlvbiBmcmFtZXdvcmsKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDExIElOUklBLCBGcmFuY2UgVGVsZWNvbQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS50cmVlOworCitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLkNsYXNzVmlzaXRvcjsKKworLyoqCisgKiBBIG5vZGUgdGhhdCByZXByZXNlbnRzIGFuIGlubmVyIGNsYXNzLgorICoKKyAqIEBhdXRob3IgRXJpYyBCcnVuZXRvbgorICovCitwdWJsaWMgY2xhc3MgSW5uZXJDbGFzc05vZGUgeworCisgICAgLyoqCisgICAgICogVGhlIGludGVybmFsIG5hbWUgb2YgYW4gaW5uZXIgY2xhc3MgKHNlZQorICAgICAqIHtAbGluayBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uVHlwZSNnZXRJbnRlcm5hbE5hbWUoKSBnZXRJbnRlcm5hbE5hbWV9KS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIG5hbWU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgaW50ZXJuYWwgbmFtZSBvZiB0aGUgY2xhc3MgdG8gd2hpY2ggdGhlIGlubmVyIGNsYXNzIGJlbG9uZ3MgKHNlZQorICAgICAqIHtAbGluayBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uVHlwZSNnZXRJbnRlcm5hbE5hbWUoKSBnZXRJbnRlcm5hbE5hbWV9KS4gTWF5CisgICAgICogYmUgPHR0Pm51bGw8L3R0Pi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIG91dGVyTmFtZTsKKworICAgIC8qKgorICAgICAqIFRoZSAoc2ltcGxlKSBuYW1lIG9mIHRoZSBpbm5lciBjbGFzcyBpbnNpZGUgaXRzIGVuY2xvc2luZyBjbGFzcy4gTWF5IGJlCisgICAgICogPHR0Pm51bGw8L3R0PiBmb3IgYW5vbnltb3VzIGlubmVyIGNsYXNzZXMuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBpbm5lck5hbWU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgYWNjZXNzIGZsYWdzIG9mIHRoZSBpbm5lciBjbGFzcyBhcyBvcmlnaW5hbGx5IGRlY2xhcmVkIGluIHRoZQorICAgICAqIGVuY2xvc2luZyBjbGFzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGFjY2VzczsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0BsaW5rIElubmVyQ2xhc3NOb2RlfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBpbnRlcm5hbCBuYW1lIG9mIGFuIGlubmVyIGNsYXNzIChzZWUKKyAgICAgKiAgICAgICAge0BsaW5rIGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5UeXBlI2dldEludGVybmFsTmFtZSgpIGdldEludGVybmFsTmFtZX0pLgorICAgICAqIEBwYXJhbSBvdXRlck5hbWUgdGhlIGludGVybmFsIG5hbWUgb2YgdGhlIGNsYXNzIHRvIHdoaWNoIHRoZSBpbm5lciBjbGFzcworICAgICAqICAgICAgICBiZWxvbmdzIChzZWUKKyAgICAgKiAgICAgICAge0BsaW5rIGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5UeXBlI2dldEludGVybmFsTmFtZSgpIGdldEludGVybmFsTmFtZX0pLgorICAgICAqICAgICAgICBNYXkgYmUgPHR0Pm51bGw8L3R0Pi4KKyAgICAgKiBAcGFyYW0gaW5uZXJOYW1lIHRoZSAoc2ltcGxlKSBuYW1lIG9mIHRoZSBpbm5lciBjbGFzcyBpbnNpZGUgaXRzCisgICAgICogICAgICAgIGVuY2xvc2luZyBjbGFzcy4gTWF5IGJlIDx0dD5udWxsPC90dD4gZm9yIGFub255bW91cyBpbm5lcgorICAgICAqICAgICAgICBjbGFzc2VzLgorICAgICAqIEBwYXJhbSBhY2Nlc3MgdGhlIGFjY2VzcyBmbGFncyBvZiB0aGUgaW5uZXIgY2xhc3MgYXMgb3JpZ2luYWxseSBkZWNsYXJlZAorICAgICAqICAgICAgICBpbiB0aGUgZW5jbG9zaW5nIGNsYXNzLgorICAgICAqLworICAgIHB1YmxpYyBJbm5lckNsYXNzTm9kZSgKKyAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUsCisgICAgICAgIGZpbmFsIFN0cmluZyBvdXRlck5hbWUsCisgICAgICAgIGZpbmFsIFN0cmluZyBpbm5lck5hbWUsCisgICAgICAgIGZpbmFsIGludCBhY2Nlc3MpCisgICAgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB0aGlzLm91dGVyTmFtZSA9IG91dGVyTmFtZTsKKyAgICAgICAgdGhpcy5pbm5lck5hbWUgPSBpbm5lck5hbWU7CisgICAgICAgIHRoaXMuYWNjZXNzID0gYWNjZXNzOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1ha2VzIHRoZSBnaXZlbiBjbGFzcyB2aXNpdG9yIHZpc2l0IHRoaXMgaW5uZXIgY2xhc3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY3YgYSBjbGFzcyB2aXNpdG9yLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFjY2VwdChmaW5hbCBDbGFzc1Zpc2l0b3IgY3YpIHsKKyAgICAgICAgY3YudmlzaXRJbm5lckNsYXNzKG5hbWUsIG91dGVyTmFtZSwgaW5uZXJOYW1lLCBhY2Nlc3MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vdHJlZS9JbnNuTGlzdC5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS90cmVlL0luc25MaXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFjMmY1YwotLS0gL2Rldi9udWxsCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vdHJlZS9JbnNuTGlzdC5qYXZhCkBAIC0wLDAgKzEsNjA3IEBACisvKgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBPcmFjbGUgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKKyAqIHF1ZXN0aW9ucy4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGlzIGF2YWlsYWJsZSB1bmRlciBhbmQgZ292ZXJuZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiBIb3dldmVyLCB0aGUgZm9sbG93aW5nIG5vdGljZSBhY2NvbXBhbmllZCB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGlzCisgKiBmaWxlOgorICoKKyAqIEFTTTogYSB2ZXJ5IHNtYWxsIGFuZCBmYXN0IEphdmEgYnl0ZWNvZGUgbWFuaXB1bGF0aW9uIGZyYW1ld29yaworICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMTEgSU5SSUEsIEZyYW5jZSBUZWxlY29tCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2UgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLnRyZWU7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOworCitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLk1ldGhvZFZpc2l0b3I7CisKKy8qKgorICogQSBkb3VibHkgbGlua2VkIGxpc3Qgb2Yge0BsaW5rIEFic3RyYWN0SW5zbk5vZGV9IG9iamVjdHMuIDxpPlRoaXMKKyAqIGltcGxlbWVudGF0aW9uIGlzIG5vdCB0aHJlYWQgc2FmZTwvaT4uCisgKi8KK3B1YmxpYyBjbGFzcyBJbnNuTGlzdCB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbnVtYmVyIG9mIGluc3RydWN0aW9ucyBpbiB0aGlzIGxpc3QuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgc2l6ZTsKKworICAgIC8qKgorICAgICAqIFRoZSBmaXJzdCBpbnN0cnVjdGlvbiBpbiB0aGlzIGxpc3QuIE1heSBiZSA8dHQ+bnVsbDwvdHQ+LgorICAgICAqLworICAgIHByaXZhdGUgQWJzdHJhY3RJbnNuTm9kZSBmaXJzdDsKKworICAgIC8qKgorICAgICAqIFRoZSBsYXN0IGluc3RydWN0aW9uIGluIHRoaXMgbGlzdC4gTWF5IGJlIDx0dD5udWxsPC90dD4uCisgICAgICovCisgICAgcHJpdmF0ZSBBYnN0cmFjdEluc25Ob2RlIGxhc3Q7CisKKyAgICAvKioKKyAgICAgKiBBIGNhY2hlIG9mIHRoZSBpbnN0cnVjdGlvbnMgb2YgdGhpcyBsaXN0LiBUaGlzIGNhY2hlIGlzIHVzZWQgdG8gaW1wcm92ZQorICAgICAqIHRoZSBwZXJmb3JtYW5jZSBvZiB0aGUge0BsaW5rICNnZXR9IG1ldGhvZC4KKyAgICAgKi8KKyAgICBBYnN0cmFjdEluc25Ob2RlW10gY2FjaGU7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zIGluIHRoaXMgbGlzdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBpbnN0cnVjdGlvbnMgaW4gdGhpcyBsaXN0LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIHNpemU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24gaW4gdGhpcyBsaXN0LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24gaW4gdGhpcyBsaXN0LCBvciA8dHQ+bnVsbDwvdHQ+IGlmIHRoZQorICAgICAqICAgICAgICAgbGlzdCBpcyBlbXB0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQWJzdHJhY3RJbnNuTm9kZSBnZXRGaXJzdCgpIHsKKyAgICAgICAgcmV0dXJuIGZpcnN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGxhc3QgaW5zdHJ1Y3Rpb24gaW4gdGhpcyBsaXN0LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbGFzdCBpbnN0cnVjdGlvbiBpbiB0aGlzIGxpc3QsIG9yIDx0dD5udWxsPC90dD4gaWYgdGhlIGxpc3QKKyAgICAgKiAgICAgICAgIGlzIGVtcHR5LgorICAgICAqLworICAgIHB1YmxpYyBBYnN0cmFjdEluc25Ob2RlIGdldExhc3QoKSB7CisgICAgICAgIHJldHVybiBsYXN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGluc3RydWN0aW9uIHdob3NlIGluZGV4IGlzIGdpdmVuLiBUaGlzIG1ldGhvZCBidWlsZHMgYSBjYWNoZQorICAgICAqIG9mIHRoZSBpbnN0cnVjdGlvbnMgaW4gdGhpcyBsaXN0IHRvIGF2b2lkIHNjYW5uaW5nIHRoZSB3aG9sZSBsaXN0IGVhY2gKKyAgICAgKiB0aW1lIGl0IGlzIGNhbGxlZC4gT25jZSB0aGUgY2FjaGUgaXMgYnVpbHQsIHRoaXMgbWV0aG9kIHJ1biBpbiBjb25zdGFudAorICAgICAqIHRpbWUuIFRoaXMgY2FjaGUgaXMgaW52YWxpZGF0ZWQgYnkgYWxsIHRoZSBtZXRob2RzIHRoYXQgbW9kaWZ5IHRoZSBsaXN0LgorICAgICAqCisgICAgICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiB0aGUgaW5zdHJ1Y3Rpb24gdGhhdCBtdXN0IGJlIHJldHVybmVkLgorICAgICAqIEByZXR1cm4gdGhlIGluc3RydWN0aW9uIHdob3NlIGluZGV4IGlzIGdpdmVuLgorICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHNpemUoKSkuCisgICAgICovCisgICAgcHVibGljIEFic3RyYWN0SW5zbk5vZGUgZ2V0KGZpbmFsIGludCBpbmRleCkgeworICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHNpemUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNhY2hlID09IG51bGwpIHsKKyAgICAgICAgICAgIGNhY2hlID0gdG9BcnJheSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjYWNoZVtpbmRleF07CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyA8dHQ+dHJ1ZTwvdHQ+IGlmIHRoZSBnaXZlbiBpbnN0cnVjdGlvbiBiZWxvbmdzIHRvIHRoaXMgbGlzdC4KKyAgICAgKiBUaGlzIG1ldGhvZCBhbHdheXMgc2NhbnMgdGhlIGluc3RydWN0aW9ucyBvZiB0aGlzIGxpc3QgdW50aWwgaXQgZmluZHMgdGhlCisgICAgICogZ2l2ZW4gaW5zdHJ1Y3Rpb24gb3IgcmVhY2hlcyB0aGUgZW5kIG9mIHRoZSBsaXN0LgorICAgICAqCisgICAgICogQHBhcmFtIGluc24gYW4gaW5zdHJ1Y3Rpb24uCisgICAgICogQHJldHVybiA8dHQ+dHJ1ZTwvdHQ+IGlmIHRoZSBnaXZlbiBpbnN0cnVjdGlvbiBiZWxvbmdzIHRvIHRoaXMgbGlzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhmaW5hbCBBYnN0cmFjdEluc25Ob2RlIGluc24pIHsKKyAgICAgICAgQWJzdHJhY3RJbnNuTm9kZSBpID0gZmlyc3Q7CisgICAgICAgIHdoaWxlIChpICE9IG51bGwgJiYgaSAhPSBpbnNuKSB7CisgICAgICAgICAgICBpID0gaS5uZXh0OworICAgICAgICB9CisgICAgICAgIHJldHVybiBpICE9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGdpdmVuIGluc3RydWN0aW9uIGluIHRoaXMgbGlzdC4gVGhpcyBtZXRob2QKKyAgICAgKiBidWlsZHMgYSBjYWNoZSBvZiB0aGUgaW5zdHJ1Y3Rpb24gaW5kZXhlcyB0byBhdm9pZCBzY2FubmluZyB0aGUgd2hvbGUKKyAgICAgKiBsaXN0IGVhY2ggdGltZSBpdCBpcyBjYWxsZWQuIE9uY2UgdGhlIGNhY2hlIGlzIGJ1aWx0LCB0aGlzIG1ldGhvZCBydW4gaW4KKyAgICAgKiBjb25zdGFudCB0aW1lLiBUaGUgY2FjaGUgaXMgaW52YWxpZGF0ZWQgYnkgYWxsIHRoZSBtZXRob2RzIHRoYXQgbW9kaWZ5CisgICAgICogdGhlIGxpc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5zbiBhbiBpbnN0cnVjdGlvbiA8aT5vZiB0aGlzIGxpc3Q8L2k+LgorICAgICAqIEByZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBnaXZlbiBpbnN0cnVjdGlvbiBpbiB0aGlzIGxpc3QuIDxpPlRoZSByZXN1bHQgb2YKKyAgICAgKiAgICAgICAgIHRoaXMgbWV0aG9kIGlzIHVuZGVmaW5lZCBpZiB0aGUgZ2l2ZW4gaW5zdHJ1Y3Rpb24gZG9lcyBub3QgYmVsb25nCisgICAgICogICAgICAgICB0byB0aGlzIGxpc3Q8L2k+LiBVc2Uge0BsaW5rICNjb250YWlucyBjb250YWluc30gdG8gdGVzdCBpZiBhbgorICAgICAqICAgICAgICAgaW5zdHJ1Y3Rpb24gYmVsb25ncyB0byBhbiBpbnN0cnVjdGlvbiBsaXN0IG9yIG5vdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGluZGV4T2YoZmluYWwgQWJzdHJhY3RJbnNuTm9kZSBpbnNuKSB7CisgICAgICAgIGlmIChjYWNoZSA9PSBudWxsKSB7CisgICAgICAgICAgICBjYWNoZSA9IHRvQXJyYXkoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaW5zbi5pbmRleDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYWtlcyB0aGUgZ2l2ZW4gdmlzaXRvciB2aXNpdCBhbGwgb2YgdGhlIGluc3RydWN0aW9ucyBpbiB0aGlzIGxpc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbXYgdGhlIG1ldGhvZCB2aXNpdG9yIHRoYXQgbXVzdCB2aXNpdCB0aGUgaW5zdHJ1Y3Rpb25zLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFjY2VwdChmaW5hbCBNZXRob2RWaXNpdG9yIG12KSB7CisgICAgICAgIEFic3RyYWN0SW5zbk5vZGUgaW5zbiA9IGZpcnN0OworICAgICAgICB3aGlsZSAoaW5zbiAhPSBudWxsKSB7CisgICAgICAgICAgICBpbnNuLmFjY2VwdChtdik7CisgICAgICAgICAgICBpbnNuID0gaW5zbi5uZXh0OworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhbiBpdGVyYXRvciBvdmVyIHRoZSBpbnN0cnVjdGlvbnMgaW4gdGhpcyBsaXN0LgorICAgICAqCisgICAgICogQHJldHVybiBhbiBpdGVyYXRvciBvdmVyIHRoZSBpbnN0cnVjdGlvbnMgaW4gdGhpcyBsaXN0LgorICAgICAqLworICAgIHB1YmxpYyBMaXN0SXRlcmF0b3I8QWJzdHJhY3RJbnNuTm9kZT4gaXRlcmF0b3IoKSB7CisgICAgICAgIHJldHVybiBpdGVyYXRvcigwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGluc3RydWN0aW9ucyBpbiB0aGlzIGxpc3QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGluc3RydWN0aW9ucyBpbiB0aGlzIGxpc3QuCisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIExpc3RJdGVyYXRvcjxBYnN0cmFjdEluc25Ob2RlPiBpdGVyYXRvcihpbnQgaW5kZXgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBJbnNuTGlzdEl0ZXJhdG9yKGluZGV4KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgYWxsIG9mIHRoZSBpbnN0cnVjdGlvbnMgaW4gdGhpcyBsaXN0LgorICAgICAqCisgICAgICogQHJldHVybiBhbiBhcnJheSBjb250YWluaW5nIGFsbCBvZiB0aGUgaW5zdHJ1Y3Rpb25zIGluIHRoaXMgbGlzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQWJzdHJhY3RJbnNuTm9kZVtdIHRvQXJyYXkoKSB7CisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgQWJzdHJhY3RJbnNuTm9kZSBlbGVtID0gZmlyc3Q7CisgICAgICAgIEFic3RyYWN0SW5zbk5vZGVbXSBpbnNucyA9IG5ldyBBYnN0cmFjdEluc25Ob2RlW3NpemVdOworICAgICAgICB3aGlsZSAoZWxlbSAhPSBudWxsKSB7CisgICAgICAgICAgICBpbnNuc1tpXSA9IGVsZW07CisgICAgICAgICAgICBlbGVtLmluZGV4ID0gaSsrOworICAgICAgICAgICAgZWxlbSA9IGVsZW0ubmV4dDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaW5zbnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwbGFjZXMgYW4gaW5zdHJ1Y3Rpb24gb2YgdGhpcyBsaXN0IHdpdGggYW5vdGhlciBpbnN0cnVjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsb2NhdGlvbiBhbiBpbnN0cnVjdGlvbiA8aT5vZiB0aGlzIGxpc3Q8L2k+LgorICAgICAqIEBwYXJhbSBpbnNuIGFub3RoZXIgaW5zdHJ1Y3Rpb24sIDxpPndoaWNoIG11c3Qgbm90IGJlbG9uZyB0byBhbnkKKyAgICAgKiAgICAgICAge0BsaW5rIEluc25MaXN0fTwvaT4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0KGZpbmFsIEFic3RyYWN0SW5zbk5vZGUgbG9jYXRpb24sIGZpbmFsIEFic3RyYWN0SW5zbk5vZGUgaW5zbikgeworICAgICAgICBBYnN0cmFjdEluc25Ob2RlIG5leHQgPSBsb2NhdGlvbi5uZXh0OworICAgICAgICBpbnNuLm5leHQgPSBuZXh0OworICAgICAgICBpZiAobmV4dCAhPSBudWxsKSB7CisgICAgICAgICAgICBuZXh0LnByZXYgPSBpbnNuOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbGFzdCA9IGluc247CisgICAgICAgIH0KKyAgICAgICAgQWJzdHJhY3RJbnNuTm9kZSBwcmV2ID0gbG9jYXRpb24ucHJldjsKKyAgICAgICAgaW5zbi5wcmV2ID0gcHJldjsKKyAgICAgICAgaWYgKHByZXYgIT0gbnVsbCkgeworICAgICAgICAgICAgcHJldi5uZXh0ID0gaW5zbjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZpcnN0ID0gaW5zbjsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2FjaGUgIT0gbnVsbCkgeworICAgICAgICAgICAgaW50IGluZGV4ID0gbG9jYXRpb24uaW5kZXg7CisgICAgICAgICAgICBjYWNoZVtpbmRleF0gPSBpbnNuOworICAgICAgICAgICAgaW5zbi5pbmRleCA9IGluZGV4OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW5zbi5pbmRleCA9IDA7IC8vIGluc24gbm93IGJlbG9uZ3MgdG8gYW4gSW5zbkxpc3QKKyAgICAgICAgfQorICAgICAgICBsb2NhdGlvbi5pbmRleCA9IC0xOyAvLyBpIG5vIGxvbmdlciBiZWxvbmdzIHRvIGFuIEluc25MaXN0CisgICAgICAgIGxvY2F0aW9uLnByZXYgPSBudWxsOworICAgICAgICBsb2NhdGlvbi5uZXh0ID0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIHRoZSBnaXZlbiBpbnN0cnVjdGlvbiB0byB0aGUgZW5kIG9mIHRoaXMgbGlzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnNuIGFuIGluc3RydWN0aW9uLCA8aT53aGljaCBtdXN0IG5vdCBiZWxvbmcgdG8gYW55CisgICAgICogICAgICAgIHtAbGluayBJbnNuTGlzdH08L2k+LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZChmaW5hbCBBYnN0cmFjdEluc25Ob2RlIGluc24pIHsKKyAgICAgICAgKytzaXplOworICAgICAgICBpZiAobGFzdCA9PSBudWxsKSB7CisgICAgICAgICAgICBmaXJzdCA9IGluc247CisgICAgICAgICAgICBsYXN0ID0gaW5zbjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxhc3QubmV4dCA9IGluc247CisgICAgICAgICAgICBpbnNuLnByZXYgPSBsYXN0OworICAgICAgICB9CisgICAgICAgIGxhc3QgPSBpbnNuOworICAgICAgICBjYWNoZSA9IG51bGw7CisgICAgICAgIGluc24uaW5kZXggPSAwOyAvLyBpbnNuIG5vdyBiZWxvbmdzIHRvIGFuIEluc25MaXN0CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyB0aGUgZ2l2ZW4gaW5zdHJ1Y3Rpb25zIHRvIHRoZSBlbmQgb2YgdGhpcyBsaXN0LgorICAgICAqCisgICAgICogQHBhcmFtIGluc25zIGFuIGluc3RydWN0aW9uIGxpc3QsIHdoaWNoIGlzIGNsZWFyZWQgZHVyaW5nIHRoZSBwcm9jZXNzLgorICAgICAqICAgICAgICBUaGlzIGxpc3QgbXVzdCBiZSBkaWZmZXJlbnQgZnJvbSAndGhpcycuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkKGZpbmFsIEluc25MaXN0IGluc25zKSB7CisgICAgICAgIGlmIChpbnNucy5zaXplID09IDApIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzaXplICs9IGluc25zLnNpemU7CisgICAgICAgIGlmIChsYXN0ID09IG51bGwpIHsKKyAgICAgICAgICAgIGZpcnN0ID0gaW5zbnMuZmlyc3Q7CisgICAgICAgICAgICBsYXN0ID0gaW5zbnMubGFzdDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFic3RyYWN0SW5zbk5vZGUgZWxlbSA9IGluc25zLmZpcnN0OworICAgICAgICAgICAgbGFzdC5uZXh0ID0gZWxlbTsKKyAgICAgICAgICAgIGVsZW0ucHJldiA9IGxhc3Q7CisgICAgICAgICAgICBsYXN0ID0gaW5zbnMubGFzdDsKKyAgICAgICAgfQorICAgICAgICBjYWNoZSA9IG51bGw7CisgICAgICAgIGluc25zLnJlbW92ZUFsbChmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5zZXJ0cyB0aGUgZ2l2ZW4gaW5zdHJ1Y3Rpb24gYXQgdGhlIGJlZ2luaW5nIG9mIHRoaXMgbGlzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnNuIGFuIGluc3RydWN0aW9uLCA8aT53aGljaCBtdXN0IG5vdCBiZWxvbmcgdG8gYW55CisgICAgICogICAgICAgIHtAbGluayBJbnNuTGlzdH08L2k+LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGluc2VydChmaW5hbCBBYnN0cmFjdEluc25Ob2RlIGluc24pIHsKKyAgICAgICAgKytzaXplOworICAgICAgICBpZiAoZmlyc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgZmlyc3QgPSBpbnNuOworICAgICAgICAgICAgbGFzdCA9IGluc247CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmaXJzdC5wcmV2ID0gaW5zbjsKKyAgICAgICAgICAgIGluc24ubmV4dCA9IGZpcnN0OworICAgICAgICB9CisgICAgICAgIGZpcnN0ID0gaW5zbjsKKyAgICAgICAgY2FjaGUgPSBudWxsOworICAgICAgICBpbnNuLmluZGV4ID0gMDsgLy8gaW5zbiBub3cgYmVsb25ncyB0byBhbiBJbnNuTGlzdAorICAgIH0KKworICAgIC8qKgorICAgICAqIEluc2VydHMgdGhlIGdpdmVuIGluc3RydWN0aW9ucyBhdCB0aGUgYmVnaW5pbmcgb2YgdGhpcyBsaXN0LgorICAgICAqCisgICAgICogQHBhcmFtIGluc25zIGFuIGluc3RydWN0aW9uIGxpc3QsIHdoaWNoIGlzIGNsZWFyZWQgZHVyaW5nIHRoZSBwcm9jZXNzLgorICAgICAqICAgICAgICBUaGlzIGxpc3QgbXVzdCBiZSBkaWZmZXJlbnQgZnJvbSAndGhpcycuCisgICAgICovCisgICAgcHVibGljIHZvaWQgaW5zZXJ0KGZpbmFsIEluc25MaXN0IGluc25zKSB7CisgICAgICAgIGlmIChpbnNucy5zaXplID09IDApIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzaXplICs9IGluc25zLnNpemU7CisgICAgICAgIGlmIChmaXJzdCA9PSBudWxsKSB7CisgICAgICAgICAgICBmaXJzdCA9IGluc25zLmZpcnN0OworICAgICAgICAgICAgbGFzdCA9IGluc25zLmxhc3Q7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBYnN0cmFjdEluc25Ob2RlIGVsZW0gPSBpbnNucy5sYXN0OworICAgICAgICAgICAgZmlyc3QucHJldiA9IGVsZW07CisgICAgICAgICAgICBlbGVtLm5leHQgPSBmaXJzdDsKKyAgICAgICAgICAgIGZpcnN0ID0gaW5zbnMuZmlyc3Q7CisgICAgICAgIH0KKyAgICAgICAgY2FjaGUgPSBudWxsOworICAgICAgICBpbnNucy5yZW1vdmVBbGwoZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluc2VydHMgdGhlIGdpdmVuIGluc3RydWN0aW9uIGFmdGVyIHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbG9jYXRpb24gYW4gaW5zdHJ1Y3Rpb24gPGk+b2YgdGhpcyBsaXN0PC9pPiBhZnRlciB3aGljaCBpbnNuIG11c3QgYmUKKyAgICAgKiAgICAgICAgaW5zZXJ0ZWQuCisgICAgICogQHBhcmFtIGluc24gdGhlIGluc3RydWN0aW9uIHRvIGJlIGluc2VydGVkLCA8aT53aGljaCBtdXN0IG5vdCBiZWxvbmcgdG8KKyAgICAgKiAgICAgICAgYW55IHtAbGluayBJbnNuTGlzdH08L2k+LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGluc2VydChmaW5hbCBBYnN0cmFjdEluc25Ob2RlIGxvY2F0aW9uLCBmaW5hbCBBYnN0cmFjdEluc25Ob2RlIGluc24pIHsKKyAgICAgICAgKytzaXplOworICAgICAgICBBYnN0cmFjdEluc25Ob2RlIG5leHQgPSBsb2NhdGlvbi5uZXh0OworICAgICAgICBpZiAobmV4dCA9PSBudWxsKSB7CisgICAgICAgICAgICBsYXN0ID0gaW5zbjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG5leHQucHJldiA9IGluc247CisgICAgICAgIH0KKyAgICAgICAgbG9jYXRpb24ubmV4dCA9IGluc247CisgICAgICAgIGluc24ubmV4dCA9IG5leHQ7CisgICAgICAgIGluc24ucHJldiA9IGxvY2F0aW9uOworICAgICAgICBjYWNoZSA9IG51bGw7CisgICAgICAgIGluc24uaW5kZXggPSAwOyAvLyBpbnNuIG5vdyBiZWxvbmdzIHRvIGFuIEluc25MaXN0CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5zZXJ0cyB0aGUgZ2l2ZW4gaW5zdHJ1Y3Rpb25zIGFmdGVyIHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbG9jYXRpb24gYW4gaW5zdHJ1Y3Rpb24gPGk+b2YgdGhpcyBsaXN0PC9pPiBhZnRlciB3aGljaCB0aGUKKyAgICAgKiAgICAgICAgaW5zdHJ1Y3Rpb25zIG11c3QgYmUgaW5zZXJ0ZWQuCisgICAgICogQHBhcmFtIGluc25zIHRoZSBpbnN0cnVjdGlvbiBsaXN0IHRvIGJlIGluc2VydGVkLCB3aGljaCBpcyBjbGVhcmVkIGR1cmluZworICAgICAqICAgICAgICB0aGUgcHJvY2Vzcy4gVGhpcyBsaXN0IG11c3QgYmUgZGlmZmVyZW50IGZyb20gJ3RoaXMnLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGluc2VydChmaW5hbCBBYnN0cmFjdEluc25Ob2RlIGxvY2F0aW9uLCBmaW5hbCBJbnNuTGlzdCBpbnNucykgeworICAgICAgICBpZiAoaW5zbnMuc2l6ZSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgc2l6ZSArPSBpbnNucy5zaXplOworICAgICAgICBBYnN0cmFjdEluc25Ob2RlIGlmaXJzdCA9IGluc25zLmZpcnN0OworICAgICAgICBBYnN0cmFjdEluc25Ob2RlIGlsYXN0ID0gaW5zbnMubGFzdDsKKyAgICAgICAgQWJzdHJhY3RJbnNuTm9kZSBuZXh0ID0gbG9jYXRpb24ubmV4dDsKKyAgICAgICAgaWYgKG5leHQgPT0gbnVsbCkgeworICAgICAgICAgICAgbGFzdCA9IGlsYXN0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbmV4dC5wcmV2ID0gaWxhc3Q7CisgICAgICAgIH0KKyAgICAgICAgbG9jYXRpb24ubmV4dCA9IGlmaXJzdDsKKyAgICAgICAgaWxhc3QubmV4dCA9IG5leHQ7CisgICAgICAgIGlmaXJzdC5wcmV2ID0gbG9jYXRpb247CisgICAgICAgIGNhY2hlID0gbnVsbDsKKyAgICAgICAgaW5zbnMucmVtb3ZlQWxsKGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnNlcnRzIHRoZSBnaXZlbiBpbnN0cnVjdGlvbiBiZWZvcmUgdGhlIHNwZWNpZmllZCBpbnN0cnVjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsb2NhdGlvbiBhbiBpbnN0cnVjdGlvbiA8aT5vZiB0aGlzIGxpc3Q8L2k+IGJlZm9yZSB3aGljaCBpbnNuIG11c3QgYmUKKyAgICAgKiAgICAgICAgaW5zZXJ0ZWQuCisgICAgICogQHBhcmFtIGluc24gdGhlIGluc3RydWN0aW9uIHRvIGJlIGluc2VydGVkLCA8aT53aGljaCBtdXN0IG5vdCBiZWxvbmcgdG8KKyAgICAgKiAgICAgICAgYW55IHtAbGluayBJbnNuTGlzdH08L2k+LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGluc2VydEJlZm9yZShmaW5hbCBBYnN0cmFjdEluc25Ob2RlIGxvY2F0aW9uLCBmaW5hbCBBYnN0cmFjdEluc25Ob2RlIGluc24pIHsKKyAgICAgICAgKytzaXplOworICAgICAgICBBYnN0cmFjdEluc25Ob2RlIHByZXYgPSBsb2NhdGlvbi5wcmV2OworICAgICAgICBpZiAocHJldiA9PSBudWxsKSB7CisgICAgICAgICAgICBmaXJzdCA9IGluc247CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmV2Lm5leHQgPSBpbnNuOworICAgICAgICB9CisgICAgICAgIGxvY2F0aW9uLnByZXYgPSBpbnNuOworICAgICAgICBpbnNuLm5leHQgPSBsb2NhdGlvbjsKKyAgICAgICAgaW5zbi5wcmV2ID0gcHJldjsKKyAgICAgICAgY2FjaGUgPSBudWxsOworICAgICAgICBpbnNuLmluZGV4ID0gMDsgLy8gaW5zbiBub3cgYmVsb25ncyB0byBhbiBJbnNuTGlzdAorICAgIH0KKworICAgIC8qKgorICAgICAqIEluc2VydHMgdGhlIGdpdmVuIGluc3RydWN0aW9ucyBiZWZvcmUgdGhlIHNwZWNpZmllZCBpbnN0cnVjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsb2NhdGlvbiAgYW4gaW5zdHJ1Y3Rpb24gPGk+b2YgdGhpcyBsaXN0PC9pPiBiZWZvcmUgd2hpY2ggdGhlIGluc3RydWN0aW9ucworICAgICAqICAgICAgICBtdXN0IGJlIGluc2VydGVkLgorICAgICAqIEBwYXJhbSBpbnNucyB0aGUgaW5zdHJ1Y3Rpb24gbGlzdCB0byBiZSBpbnNlcnRlZCwgd2hpY2ggaXMgY2xlYXJlZCBkdXJpbmcKKyAgICAgKiAgICAgICAgdGhlIHByb2Nlc3MuIFRoaXMgbGlzdCBtdXN0IGJlIGRpZmZlcmVudCBmcm9tICd0aGlzJy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbnNlcnRCZWZvcmUoZmluYWwgQWJzdHJhY3RJbnNuTm9kZSBsb2NhdGlvbiwgZmluYWwgSW5zbkxpc3QgaW5zbnMpIHsKKyAgICAgICAgaWYgKGluc25zLnNpemUgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHNpemUgKz0gaW5zbnMuc2l6ZTsKKyAgICAgICAgQWJzdHJhY3RJbnNuTm9kZSBpZmlyc3QgPSBpbnNucy5maXJzdDsKKyAgICAgICAgQWJzdHJhY3RJbnNuTm9kZSBpbGFzdCA9IGluc25zLmxhc3Q7CisgICAgICAgIEFic3RyYWN0SW5zbk5vZGUgcHJldiA9IGxvY2F0aW9uIC5wcmV2OworICAgICAgICBpZiAocHJldiA9PSBudWxsKSB7CisgICAgICAgICAgICBmaXJzdCA9IGlmaXJzdDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByZXYubmV4dCA9IGlmaXJzdDsKKyAgICAgICAgfQorICAgICAgICBsb2NhdGlvbiAucHJldiA9IGlsYXN0OworICAgICAgICBpbGFzdC5uZXh0ID0gbG9jYXRpb24gOworICAgICAgICBpZmlyc3QucHJldiA9IHByZXY7CisgICAgICAgIGNhY2hlID0gbnVsbDsKKyAgICAgICAgaW5zbnMucmVtb3ZlQWxsKGZhbHNlKTsKKyAgICB9CisKKworCisgICAgLyoqCisgICAgICogUmVtb3ZlcyB0aGUgZ2l2ZW4gaW5zdHJ1Y3Rpb24gZnJvbSB0aGlzIGxpc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5zbiB0aGUgaW5zdHJ1Y3Rpb24gPGk+b2YgdGhpcyBsaXN0PC9pPiB0aGF0IG11c3QgYmUgcmVtb3ZlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmUoZmluYWwgQWJzdHJhY3RJbnNuTm9kZSBpbnNuKSB7CisgICAgICAgIC0tc2l6ZTsKKyAgICAgICAgQWJzdHJhY3RJbnNuTm9kZSBuZXh0ID0gaW5zbi5uZXh0OworICAgICAgICBBYnN0cmFjdEluc25Ob2RlIHByZXYgPSBpbnNuLnByZXY7CisgICAgICAgIGlmIChuZXh0ID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChwcmV2ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmaXJzdCA9IG51bGw7CisgICAgICAgICAgICAgICAgbGFzdCA9IG51bGw7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHByZXYubmV4dCA9IG51bGw7CisgICAgICAgICAgICAgICAgbGFzdCA9IHByZXY7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAocHJldiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgZmlyc3QgPSBuZXh0OworICAgICAgICAgICAgICAgIG5leHQucHJldiA9IG51bGw7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHByZXYubmV4dCA9IG5leHQ7CisgICAgICAgICAgICAgICAgbmV4dC5wcmV2ID0gcHJldjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjYWNoZSA9IG51bGw7CisgICAgICAgIGluc24uaW5kZXggPSAtMTsgLy8gaW5zbiBubyBsb25nZXIgYmVsb25ncyB0byBhbiBJbnNuTGlzdAorICAgICAgICBpbnNuLnByZXYgPSBudWxsOworICAgICAgICBpbnNuLm5leHQgPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgYWxsIG9mIHRoZSBpbnN0cnVjdGlvbnMgb2YgdGhpcyBsaXN0LgorICAgICAqCisgICAgICogQHBhcmFtIG1hcmsgaWYgdGhlIGluc3RydWN0aW9ucyBtdXN0IGJlIG1hcmtlZCBhcyBubyBsb25nZXIgYmVsb25naW5nIHRvCisgICAgICogICAgICAgIGFueSB7QGxpbmsgSW5zbkxpc3R9LgorICAgICAqLworICAgIHZvaWQgcmVtb3ZlQWxsKGZpbmFsIGJvb2xlYW4gbWFyaykgeworICAgICAgICBpZiAobWFyaykgeworICAgICAgICAgICAgQWJzdHJhY3RJbnNuTm9kZSBpbnNuID0gZmlyc3Q7CisgICAgICAgICAgICB3aGlsZSAoaW5zbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQWJzdHJhY3RJbnNuTm9kZSBuZXh0ID0gaW5zbi5uZXh0OworICAgICAgICAgICAgICAgIGluc24uaW5kZXggPSAtMTsgLy8gaW5zbiBubyBsb25nZXIgYmVsb25ncyB0byBhbiBJbnNuTGlzdAorICAgICAgICAgICAgICAgIGluc24ucHJldiA9IG51bGw7CisgICAgICAgICAgICAgICAgaW5zbi5uZXh0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICBpbnNuID0gbmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzaXplID0gMDsKKyAgICAgICAgZmlyc3QgPSBudWxsOworICAgICAgICBsYXN0ID0gbnVsbDsKKyAgICAgICAgY2FjaGUgPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgYWxsIG9mIHRoZSBpbnN0cnVjdGlvbnMgb2YgdGhpcyBsaXN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgICAgICByZW1vdmVBbGwoZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc2V0IGFsbCBsYWJlbHMgaW4gdGhlIGluc3RydWN0aW9uIGxpc3QuIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQKKyAgICAgKiBiZWZvcmUgcmV1c2luZyBzYW1lIGluc3RydWN0aW9ucyBsaXN0IGJldHdlZW4gc2V2ZXJhbAorICAgICAqIDxjb2RlPkNsYXNzV3JpdGVyPC9jb2RlPnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVzZXRMYWJlbHMoKSB7CisgICAgICAgIEFic3RyYWN0SW5zbk5vZGUgaW5zbiA9IGZpcnN0OworICAgICAgICB3aGlsZSAoaW5zbiAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoaW5zbiBpbnN0YW5jZW9mIExhYmVsTm9kZSkgeworICAgICAgICAgICAgICAgICgoTGFiZWxOb2RlKSBpbnNuKS5yZXNldExhYmVsKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnNuID0gaW5zbi5uZXh0OworICAgICAgICB9CisgICAgfQorCisgICAgLy8gdGhpcyBjbGFzcyBpcyBub3QgZ2VuZXJpZmllZCBiZWNhdXNlIGl0IHdpbGwgY3JlYXRlIGJyaWRnZXMKKyAgICBwcml2YXRlIGZpbmFsIGNsYXNzIEluc25MaXN0SXRlcmF0b3IgaW1wbGVtZW50cyBMaXN0SXRlcmF0b3IvKjxBYnN0cmFjdEluc25Ob2RlPiovIHsKKworICAgICAgICBBYnN0cmFjdEluc25Ob2RlIG5leHQ7CisKKyAgICAgICAgQWJzdHJhY3RJbnNuTm9kZSBwcmV2OworCisgICAgICAgIEluc25MaXN0SXRlcmF0b3IoaW50IGluZGV4KSB7CisgICAgICAgICAgICBpZihpbmRleD09c2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgbmV4dCA9IG51bGw7CisgICAgICAgICAgICAgICAgcHJldiA9IGdldExhc3QoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbmV4dCA9IGdldChpbmRleCk7CisgICAgICAgICAgICAgICAgcHJldiA9IG5leHQucHJldjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV4dCAhPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9iamVjdCBuZXh0KCkgeworICAgICAgICAgICAgaWYgKG5leHQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBYnN0cmFjdEluc25Ob2RlIHJlc3VsdCA9IG5leHQ7CisgICAgICAgICAgICBwcmV2ID0gcmVzdWx0OworICAgICAgICAgICAgbmV4dCA9IHJlc3VsdC5uZXh0OworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKKyAgICAgICAgICAgIEluc25MaXN0LnRoaXMucmVtb3ZlKHByZXYpOworICAgICAgICAgICAgcHJldiA9IHByZXYucHJldjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc1ByZXZpb3VzKCkgeworICAgICAgICAgICAgcmV0dXJuIHByZXYgIT0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3QgcHJldmlvdXMoKSB7CisgICAgICAgICAgICBBYnN0cmFjdEluc25Ob2RlIHJlc3VsdCA9IHByZXY7CisgICAgICAgICAgICBuZXh0ID0gcmVzdWx0OworICAgICAgICAgICAgcHJldiA9IHJlc3VsdC5wcmV2OworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgbmV4dEluZGV4KCkgeworICAgICAgICAgICAgaWYgKG5leHQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBzaXplKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2FjaGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNhY2hlID0gdG9BcnJheSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5leHQuaW5kZXg7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IHByZXZpb3VzSW5kZXgoKSB7CisgICAgICAgICAgICBpZiAocHJldiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNhY2hlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjYWNoZSA9IHRvQXJyYXkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBwcmV2LmluZGV4OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgYWRkKE9iamVjdCBvKSB7CisgICAgICAgICAgICBJbnNuTGlzdC50aGlzLmluc2VydEJlZm9yZShuZXh0LCAoQWJzdHJhY3RJbnNuTm9kZSkgbyk7CisgICAgICAgICAgICBwcmV2ID0gKEFic3RyYWN0SW5zbk5vZGUpIG87CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXQoT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIEluc25MaXN0LnRoaXMuc2V0KG5leHQucHJldiwgKEFic3RyYWN0SW5zbk5vZGUpIG8pOworICAgICAgICAgICAgcHJldiA9IChBYnN0cmFjdEluc25Ob2RlKSBvOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS90cmVlL0luc25Ob2RlLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL3RyZWUvSW5zbk5vZGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmFjMzg1Ci0tLSAvZGV2L251bGwKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS90cmVlL0luc25Ob2RlLmphdmEKQEAgLTAsMCArMSwxMTMgQEAKKy8qCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IE9yYWNsZSBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQorICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQorICogcXVlc3Rpb25zLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgaXMgYXZhaWxhYmxlIHVuZGVyIGFuZCBnb3Zlcm5lZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIEhvd2V2ZXIsIHRoZSBmb2xsb3dpbmcgbm90aWNlIGFjY29tcGFuaWVkIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoaXMKKyAqIGZpbGU6CisgKgorICogQVNNOiBhIHZlcnkgc21hbGwgYW5kIGZhc3QgSmF2YSBieXRlY29kZSBtYW5pcHVsYXRpb24gZnJhbWV3b3JrCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAxMSBJTlJJQSwgRnJhbmNlIFRlbGVjb20KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20udHJlZTsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uTWV0aG9kVmlzaXRvcjsKKworLyoqCisgKiBBIG5vZGUgdGhhdCByZXByZXNlbnRzIGEgemVybyBvcGVyYW5kIGluc3RydWN0aW9uLgorICoKKyAqIEBhdXRob3IgRXJpYyBCcnVuZXRvbgorICovCitwdWJsaWMgY2xhc3MgSW5zbk5vZGUgZXh0ZW5kcyBBYnN0cmFjdEluc25Ob2RlIHsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0BsaW5rIEluc25Ob2RlfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvcGNvZGUgdGhlIG9wY29kZSBvZiB0aGUgaW5zdHJ1Y3Rpb24gdG8gYmUgY29uc3RydWN0ZWQuIFRoaXMKKyAgICAgKiAgICAgICAgb3Bjb2RlIG11c3QgYmUgTk9QLCBBQ09OU1RfTlVMTCwgSUNPTlNUX00xLCBJQ09OU1RfMCwgSUNPTlNUXzEsCisgICAgICogICAgICAgIElDT05TVF8yLCBJQ09OU1RfMywgSUNPTlNUXzQsIElDT05TVF81LCBMQ09OU1RfMCwgTENPTlNUXzEsCisgICAgICogICAgICAgIEZDT05TVF8wLCBGQ09OU1RfMSwgRkNPTlNUXzIsIERDT05TVF8wLCBEQ09OU1RfMSwgSUFMT0FELCBMQUxPQUQsCisgICAgICogICAgICAgIEZBTE9BRCwgREFMT0FELCBBQUxPQUQsIEJBTE9BRCwgQ0FMT0FELCBTQUxPQUQsIElBU1RPUkUsIExBU1RPUkUsCisgICAgICogICAgICAgIEZBU1RPUkUsIERBU1RPUkUsIEFBU1RPUkUsIEJBU1RPUkUsIENBU1RPUkUsIFNBU1RPUkUsIFBPUCwgUE9QMiwKKyAgICAgKiAgICAgICAgRFVQLCBEVVBfWDEsIERVUF9YMiwgRFVQMiwgRFVQMl9YMSwgRFVQMl9YMiwgU1dBUCwgSUFERCwgTEFERCwKKyAgICAgKiAgICAgICAgRkFERCwgREFERCwgSVNVQiwgTFNVQiwgRlNVQiwgRFNVQiwgSU1VTCwgTE1VTCwgRk1VTCwgRE1VTCwgSURJViwKKyAgICAgKiAgICAgICAgTERJViwgRkRJViwgRERJViwgSVJFTSwgTFJFTSwgRlJFTSwgRFJFTSwgSU5FRywgTE5FRywgRk5FRywgRE5FRywKKyAgICAgKiAgICAgICAgSVNITCwgTFNITCwgSVNIUiwgTFNIUiwgSVVTSFIsIExVU0hSLCBJQU5ELCBMQU5ELCBJT1IsIExPUiwgSVhPUiwKKyAgICAgKiAgICAgICAgTFhPUiwgSTJMLCBJMkYsIEkyRCwgTDJJLCBMMkYsIEwyRCwgRjJJLCBGMkwsIEYyRCwgRDJJLCBEMkwsIEQyRiwKKyAgICAgKiAgICAgICAgSTJCLCBJMkMsIEkyUywgTENNUCwgRkNNUEwsIEZDTVBHLCBEQ01QTCwgRENNUEcsIElSRVRVUk4sIExSRVRVUk4sCisgICAgICogICAgICAgIEZSRVRVUk4sIERSRVRVUk4sIEFSRVRVUk4sIFJFVFVSTiwgQVJSQVlMRU5HVEgsIEFUSFJPVywKKyAgICAgKiAgICAgICAgTU9OSVRPUkVOVEVSLCBvciBNT05JVE9SRVhJVC4KKyAgICAgKi8KKyAgICBwdWJsaWMgSW5zbk5vZGUoZmluYWwgaW50IG9wY29kZSkgeworICAgICAgICBzdXBlcihvcGNvZGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIElOU047CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFrZXMgdGhlIGdpdmVuIHZpc2l0b3IgdmlzaXQgdGhpcyBpbnN0cnVjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtdiBhIG1ldGhvZCB2aXNpdG9yLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFjY2VwdChmaW5hbCBNZXRob2RWaXNpdG9yIG12KSB7CisgICAgICAgIG12LnZpc2l0SW5zbihvcGNvZGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBBYnN0cmFjdEluc25Ob2RlIGNsb25lKGZpbmFsIE1hcDxMYWJlbE5vZGUsIExhYmVsTm9kZT4gbGFiZWxzKSB7CisgICAgICAgIHJldHVybiBuZXcgSW5zbk5vZGUob3Bjb2RlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL3RyZWUvSW50SW5zbk5vZGUuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vdHJlZS9JbnRJbnNuTm9kZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxYjg4ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL3RyZWUvSW50SW5zbk5vZGUuamF2YQpAQCAtMCwwICsxLDExMyBAQAorLyoKKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgT3JhY2xlIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCisgKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CisgKiBxdWVzdGlvbnMuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBpcyBhdmFpbGFibGUgdW5kZXIgYW5kIGdvdmVybmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogSG93ZXZlciwgdGhlIGZvbGxvd2luZyBub3RpY2UgYWNjb21wYW5pZWQgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhpcworICogZmlsZToKKyAqCisgKiBBU006IGEgdmVyeSBzbWFsbCBhbmQgZmFzdCBKYXZhIGJ5dGVjb2RlIG1hbmlwdWxhdGlvbiBmcmFtZXdvcmsKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDExIElOUklBLCBGcmFuY2UgVGVsZWNvbQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS50cmVlOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5NZXRob2RWaXNpdG9yOworCisvKioKKyAqIEEgbm9kZSB0aGF0IHJlcHJlc2VudHMgYW4gaW5zdHJ1Y3Rpb24gd2l0aCBhIHNpbmdsZSBpbnQgb3BlcmFuZC4KKyAqCisgKiBAYXV0aG9yIEVyaWMgQnJ1bmV0b24KKyAqLworcHVibGljIGNsYXNzIEludEluc25Ob2RlIGV4dGVuZHMgQWJzdHJhY3RJbnNuTm9kZSB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgb3BlcmFuZCBvZiB0aGlzIGluc3RydWN0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgb3BlcmFuZDsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0BsaW5rIEludEluc25Ob2RlfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvcGNvZGUgdGhlIG9wY29kZSBvZiB0aGUgaW5zdHJ1Y3Rpb24gdG8gYmUgY29uc3RydWN0ZWQuIFRoaXMKKyAgICAgKiAgICAgICAgb3Bjb2RlIG11c3QgYmUgQklQVVNILCBTSVBVU0ggb3IgTkVXQVJSQVkuCisgICAgICogQHBhcmFtIG9wZXJhbmQgdGhlIG9wZXJhbmQgb2YgdGhlIGluc3RydWN0aW9uIHRvIGJlIGNvbnN0cnVjdGVkLgorICAgICAqLworICAgIHB1YmxpYyBJbnRJbnNuTm9kZShmaW5hbCBpbnQgb3Bjb2RlLCBmaW5hbCBpbnQgb3BlcmFuZCkgeworICAgICAgICBzdXBlcihvcGNvZGUpOworICAgICAgICB0aGlzLm9wZXJhbmQgPSBvcGVyYW5kOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG9wY29kZSBvZiB0aGlzIGluc3RydWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIG9wY29kZSB0aGUgbmV3IGluc3RydWN0aW9uIG9wY29kZS4gVGhpcyBvcGNvZGUgbXVzdCBiZSBCSVBVU0gsCisgICAgICogICAgICAgIFNJUFVTSCBvciBORVdBUlJBWS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPcGNvZGUoZmluYWwgaW50IG9wY29kZSkgeworICAgICAgICB0aGlzLm9wY29kZSA9IG9wY29kZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiBJTlRfSU5TTjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhY2NlcHQoZmluYWwgTWV0aG9kVmlzaXRvciBtdikgeworICAgICAgICBtdi52aXNpdEludEluc24ob3Bjb2RlLCBvcGVyYW5kKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQWJzdHJhY3RJbnNuTm9kZSBjbG9uZShmaW5hbCBNYXA8TGFiZWxOb2RlLCBMYWJlbE5vZGU+IGxhYmVscykgeworICAgICAgICByZXR1cm4gbmV3IEludEluc25Ob2RlKG9wY29kZSwgb3BlcmFuZCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS90cmVlL0ludm9rZUR5bmFtaWNJbnNuTm9kZS5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS90cmVlL0ludm9rZUR5bmFtaWNJbnNuTm9kZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzNzBiMzAKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL3RyZWUvSW52b2tlRHluYW1pY0luc25Ob2RlLmphdmEKQEAgLTAsMCArMSwxMjkgQEAKKy8qCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IE9yYWNsZSBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQorICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQorICogcXVlc3Rpb25zLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgaXMgYXZhaWxhYmxlIHVuZGVyIGFuZCBnb3Zlcm5lZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIEhvd2V2ZXIsIHRoZSBmb2xsb3dpbmcgbm90aWNlIGFjY29tcGFuaWVkIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoaXMKKyAqIGZpbGU6CisgKgorICogQVNNOiBhIHZlcnkgc21hbGwgYW5kIGZhc3QgSmF2YSBieXRlY29kZSBtYW5pcHVsYXRpb24gZnJhbWV3b3JrCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAxMSBJTlJJQSwgRnJhbmNlIFRlbGVjb20KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20udHJlZTsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uSGFuZGxlOworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5NZXRob2RWaXNpdG9yOworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5PcGNvZGVzOworCisvKioKKyAqIEEgbm9kZSB0aGF0IHJlcHJlc2VudHMgYW4gaW52b2tlZHluYW1pYyBpbnN0cnVjdGlvbi4KKyAqCisgKiBAYXV0aG9yIFJlbWkgRm9yYXgKKyAqLworcHVibGljIGNsYXNzIEludm9rZUR5bmFtaWNJbnNuTm9kZSBleHRlbmRzIEFic3RyYWN0SW5zbk5vZGUgeworCisgICAgLyoqCisgICAgICogSW52b2tlZHluYW1pYyBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgbmFtZTsKKworICAgIC8qKgorICAgICAqIEludm9rZWR5bmFtaWMgZGVzY3JpcHRvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGRlc2M7CisKKyAgICAvKioKKyAgICAgKiBCb290c3RyYXAgbWV0aG9kCisgICAgICovCisgICAgcHVibGljIEhhbmRsZSBic207CisKKyAgICAvKioKKyAgICAgKiBCb290c3RyYXAgY29uc3RhbnQgYXJndW1lbnRzCisgICAgICovCisgICAgcHVibGljIE9iamVjdFtdIGJzbUFyZ3M7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAbGluayBJbnZva2VEeW5hbWljSW5zbk5vZGV9LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgaW52b2tlZHluYW1pYyBuYW1lLgorICAgICAqIEBwYXJhbSBkZXNjIGludm9rZWR5bmFtaWMgZGVzY3JpcHRvciAoc2VlIHtAbGluayBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uVHlwZX0pLgorICAgICAqIEBwYXJhbSBic20gdGhlIGJvb3RzdHJhcCBtZXRob2QuCisgICAgICogQHBhcmFtIGJzbUFyZ3MgdGhlIGJvb3N0cmFwIGNvbnN0YW50IGFyZ3VtZW50cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgSW52b2tlRHluYW1pY0luc25Ob2RlKAorICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSwKKyAgICAgICAgZmluYWwgU3RyaW5nIGRlc2MsCisgICAgICAgIGZpbmFsIEhhbmRsZSBic20sCisgICAgICAgIGZpbmFsIE9iamVjdC4uLiBic21BcmdzKQorICAgIHsKKyAgICAgICAgc3VwZXIoT3Bjb2Rlcy5JTlZPS0VEWU5BTUlDKTsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5kZXNjID0gZGVzYzsKKyAgICAgICAgdGhpcy5ic20gPSBic207CisgICAgICAgIHRoaXMuYnNtQXJncyA9IGJzbUFyZ3M7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gSU5WT0tFX0RZTkFNSUNfSU5TTjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhY2NlcHQoZmluYWwgTWV0aG9kVmlzaXRvciBtdikgeworICAgICAgICBtdi52aXNpdEludm9rZUR5bmFtaWNJbnNuKG5hbWUsIGRlc2MsIGJzbSwgYnNtQXJncyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEFic3RyYWN0SW5zbk5vZGUgY2xvbmUoZmluYWwgTWFwPExhYmVsTm9kZSwgTGFiZWxOb2RlPiBsYWJlbHMpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBJbnZva2VEeW5hbWljSW5zbk5vZGUobmFtZSwgZGVzYywgYnNtLCBic21BcmdzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL3RyZWUvSnVtcEluc25Ob2RlLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL3RyZWUvSnVtcEluc25Ob2RlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY1ZTFjOAotLS0gL2Rldi9udWxsCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vdHJlZS9KdW1wSW5zbk5vZGUuamF2YQpAQCAtMCwwICsxLDEyMSBAQAorLyoKKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgT3JhY2xlIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCisgKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CisgKiBxdWVzdGlvbnMuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBpcyBhdmFpbGFibGUgdW5kZXIgYW5kIGdvdmVybmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogSG93ZXZlciwgdGhlIGZvbGxvd2luZyBub3RpY2UgYWNjb21wYW5pZWQgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhpcworICogZmlsZToKKyAqCisgKiBBU006IGEgdmVyeSBzbWFsbCBhbmQgZmFzdCBKYXZhIGJ5dGVjb2RlIG1hbmlwdWxhdGlvbiBmcmFtZXdvcmsKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDExIElOUklBLCBGcmFuY2UgVGVsZWNvbQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS50cmVlOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5NZXRob2RWaXNpdG9yOworCisvKioKKyAqIEEgbm9kZSB0aGF0IHJlcHJlc2VudHMgYSBqdW1wIGluc3RydWN0aW9uLiBBIGp1bXAgaW5zdHJ1Y3Rpb24gaXMgYW4KKyAqIGluc3RydWN0aW9uIHRoYXQgbWF5IGp1bXAgdG8gYW5vdGhlciBpbnN0cnVjdGlvbi4KKyAqCisgKiBAYXV0aG9yIEVyaWMgQnJ1bmV0b24KKyAqLworcHVibGljIGNsYXNzIEp1bXBJbnNuTm9kZSBleHRlbmRzIEFic3RyYWN0SW5zbk5vZGUgeworCisgICAgLyoqCisgICAgICogVGhlIG9wZXJhbmQgb2YgdGhpcyBpbnN0cnVjdGlvbi4gVGhpcyBvcGVyYW5kIGlzIGEgbGFiZWwgdGhhdCBkZXNpZ25hdGVzCisgICAgICogdGhlIGluc3RydWN0aW9uIHRvIHdoaWNoIHRoaXMgaW5zdHJ1Y3Rpb24gbWF5IGp1bXAuCisgICAgICovCisgICAgcHVibGljIExhYmVsTm9kZSBsYWJlbDsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0BsaW5rIEp1bXBJbnNuTm9kZX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3Bjb2RlIHRoZSBvcGNvZGUgb2YgdGhlIHR5cGUgaW5zdHJ1Y3Rpb24gdG8gYmUgY29uc3RydWN0ZWQuIFRoaXMKKyAgICAgKiAgICAgICAgb3Bjb2RlIG11c3QgYmUgSUZFUSwgSUZORSwgSUZMVCwgSUZHRSwgSUZHVCwgSUZMRSwgSUZfSUNNUEVRLAorICAgICAqICAgICAgICBJRl9JQ01QTkUsIElGX0lDTVBMVCwgSUZfSUNNUEdFLCBJRl9JQ01QR1QsIElGX0lDTVBMRSwgSUZfQUNNUEVRLAorICAgICAqICAgICAgICBJRl9BQ01QTkUsIEdPVE8sIEpTUiwgSUZOVUxMIG9yIElGTk9OTlVMTC4KKyAgICAgKiBAcGFyYW0gbGFiZWwgdGhlIG9wZXJhbmQgb2YgdGhlIGluc3RydWN0aW9uIHRvIGJlIGNvbnN0cnVjdGVkLiBUaGlzCisgICAgICogICAgICAgIG9wZXJhbmQgaXMgYSBsYWJlbCB0aGF0IGRlc2lnbmF0ZXMgdGhlIGluc3RydWN0aW9uIHRvIHdoaWNoIHRoZQorICAgICAqICAgICAgICBqdW1wIGluc3RydWN0aW9uIG1heSBqdW1wLgorICAgICAqLworICAgIHB1YmxpYyBKdW1wSW5zbk5vZGUoZmluYWwgaW50IG9wY29kZSwgZmluYWwgTGFiZWxOb2RlIGxhYmVsKSB7CisgICAgICAgIHN1cGVyKG9wY29kZSk7CisgICAgICAgIHRoaXMubGFiZWwgPSBsYWJlbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBvcGNvZGUgb2YgdGhpcyBpbnN0cnVjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvcGNvZGUgdGhlIG5ldyBpbnN0cnVjdGlvbiBvcGNvZGUuIFRoaXMgb3Bjb2RlIG11c3QgYmUgSUZFUSwgSUZORSwKKyAgICAgKiAgICAgICAgSUZMVCwgSUZHRSwgSUZHVCwgSUZMRSwgSUZfSUNNUEVRLCBJRl9JQ01QTkUsIElGX0lDTVBMVCwKKyAgICAgKiAgICAgICAgSUZfSUNNUEdFLCBJRl9JQ01QR1QsIElGX0lDTVBMRSwgSUZfQUNNUEVRLCBJRl9BQ01QTkUsIEdPVE8sIEpTUiwKKyAgICAgKiAgICAgICAgSUZOVUxMIG9yIElGTk9OTlVMTC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPcGNvZGUoZmluYWwgaW50IG9wY29kZSkgeworICAgICAgICB0aGlzLm9wY29kZSA9IG9wY29kZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiBKVU1QX0lOU047CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgYWNjZXB0KGZpbmFsIE1ldGhvZFZpc2l0b3IgbXYpIHsKKyAgICAgICAgbXYudmlzaXRKdW1wSW5zbihvcGNvZGUsIGxhYmVsLmdldExhYmVsKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBBYnN0cmFjdEluc25Ob2RlIGNsb25lKGZpbmFsIE1hcDxMYWJlbE5vZGUsIExhYmVsTm9kZT4gbGFiZWxzKSB7CisgICAgICAgIHJldHVybiBuZXcgSnVtcEluc25Ob2RlKG9wY29kZSwgY2xvbmUobGFiZWwsIGxhYmVscykpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vdHJlZS9MYWJlbE5vZGUuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vdHJlZS9MYWJlbE5vZGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGQ2MWY0Ci0tLSAvZGV2L251bGwKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS90cmVlL0xhYmVsTm9kZS5qYXZhCkBAIC0wLDAgKzEsMTA3IEBACisvKgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBPcmFjbGUgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKKyAqIHF1ZXN0aW9ucy4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGlzIGF2YWlsYWJsZSB1bmRlciBhbmQgZ292ZXJuZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiBIb3dldmVyLCB0aGUgZm9sbG93aW5nIG5vdGljZSBhY2NvbXBhbmllZCB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGlzCisgKiBmaWxlOgorICoKKyAqIEFTTTogYSB2ZXJ5IHNtYWxsIGFuZCBmYXN0IEphdmEgYnl0ZWNvZGUgbWFuaXB1bGF0aW9uIGZyYW1ld29yaworICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMTEgSU5SSUEsIEZyYW5jZSBUZWxlY29tCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2UgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLnRyZWU7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLkxhYmVsOworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5NZXRob2RWaXNpdG9yOworCisvKioKKyAqIEFuIHtAbGluayBBYnN0cmFjdEluc25Ob2RlfSB0aGF0IGVuY2Fwc3VsYXRlcyBhIHtAbGluayBMYWJlbH0uCisgKi8KK3B1YmxpYyBjbGFzcyBMYWJlbE5vZGUgZXh0ZW5kcyBBYnN0cmFjdEluc25Ob2RlIHsKKworICAgIHByaXZhdGUgTGFiZWwgbGFiZWw7CisKKyAgICBwdWJsaWMgTGFiZWxOb2RlKCkgeworICAgICAgICBzdXBlcigtMSk7CisgICAgfQorCisgICAgcHVibGljIExhYmVsTm9kZShmaW5hbCBMYWJlbCBsYWJlbCkgeworICAgICAgICBzdXBlcigtMSk7CisgICAgICAgIHRoaXMubGFiZWwgPSBsYWJlbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiBMQUJFTDsKKyAgICB9CisKKyAgICBwdWJsaWMgTGFiZWwgZ2V0TGFiZWwoKSB7CisgICAgICAgIGlmIChsYWJlbCA9PSBudWxsKSB7CisgICAgICAgICAgICBsYWJlbCA9IG5ldyBMYWJlbCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBsYWJlbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhY2NlcHQoZmluYWwgTWV0aG9kVmlzaXRvciBjdikgeworICAgICAgICBjdi52aXNpdExhYmVsKGdldExhYmVsKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBBYnN0cmFjdEluc25Ob2RlIGNsb25lKGZpbmFsIE1hcDxMYWJlbE5vZGUsIExhYmVsTm9kZT4gbGFiZWxzKSB7CisgICAgICAgIHJldHVybiBsYWJlbHMuZ2V0KHRoaXMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlc2V0TGFiZWwoKSB7CisgICAgICAgIGxhYmVsID0gbnVsbDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL3RyZWUvTGRjSW5zbk5vZGUuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vdHJlZS9MZGNJbnNuTm9kZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyMjBkOTEKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL3RyZWUvTGRjSW5zbk5vZGUuamF2YQpAQCAtMCwwICsxLDEwNiBAQAorLyoKKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgT3JhY2xlIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCisgKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CisgKiBxdWVzdGlvbnMuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBpcyBhdmFpbGFibGUgdW5kZXIgYW5kIGdvdmVybmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogSG93ZXZlciwgdGhlIGZvbGxvd2luZyBub3RpY2UgYWNjb21wYW5pZWQgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhpcworICogZmlsZToKKyAqCisgKiBBU006IGEgdmVyeSBzbWFsbCBhbmQgZmFzdCBKYXZhIGJ5dGVjb2RlIG1hbmlwdWxhdGlvbiBmcmFtZXdvcmsKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDExIElOUklBLCBGcmFuY2UgVGVsZWNvbQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS50cmVlOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5NZXRob2RWaXNpdG9yOworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5PcGNvZGVzOworCisvKioKKyAqIEEgbm9kZSB0aGF0IHJlcHJlc2VudHMgYW4gTERDIGluc3RydWN0aW9uLgorICoKKyAqIEBhdXRob3IgRXJpYyBCcnVuZXRvbgorICovCitwdWJsaWMgY2xhc3MgTGRjSW5zbk5vZGUgZXh0ZW5kcyBBYnN0cmFjdEluc25Ob2RlIHsKKworICAgIC8qKgorICAgICAqIFRoZSBjb25zdGFudCB0byBiZSBsb2FkZWQgb24gdGhlIHN0YWNrLiBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGEgbm9uIG51bGwKKyAgICAgKiB7QGxpbmsgSW50ZWdlcn0sIGEge0BsaW5rIEZsb2F0fSwgYSB7QGxpbmsgTG9uZ30sIGEge0BsaW5rIERvdWJsZX0sIGEKKyAgICAgKiB7QGxpbmsgU3RyaW5nfSBvciBhIHtAbGluayBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uVHlwZX0uCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBjc3Q7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAbGluayBMZGNJbnNuTm9kZX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY3N0IHRoZSBjb25zdGFudCB0byBiZSBsb2FkZWQgb24gdGhlIHN0YWNrLiBUaGlzIHBhcmFtZXRlciBtdXN0IGJlCisgICAgICogICAgICAgIGEgbm9uIG51bGwge0BsaW5rIEludGVnZXJ9LCBhIHtAbGluayBGbG9hdH0sIGEge0BsaW5rIExvbmd9LCBhCisgICAgICogICAgICAgIHtAbGluayBEb3VibGV9IG9yIGEge0BsaW5rIFN0cmluZ30uCisgICAgICovCisgICAgcHVibGljIExkY0luc25Ob2RlKGZpbmFsIE9iamVjdCBjc3QpIHsKKyAgICAgICAgc3VwZXIoT3Bjb2Rlcy5MREMpOworICAgICAgICB0aGlzLmNzdCA9IGNzdDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiBMRENfSU5TTjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhY2NlcHQoZmluYWwgTWV0aG9kVmlzaXRvciBtdikgeworICAgICAgICBtdi52aXNpdExkY0luc24oY3N0KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQWJzdHJhY3RJbnNuTm9kZSBjbG9uZShmaW5hbCBNYXA8TGFiZWxOb2RlLCBMYWJlbE5vZGU+IGxhYmVscykgeworICAgICAgICByZXR1cm4gbmV3IExkY0luc25Ob2RlKGNzdCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS90cmVlL0xpbmVOdW1iZXJOb2RlLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL3RyZWUvTGluZU51bWJlck5vZGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTYwZDMwCi0tLSAvZGV2L251bGwKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS90cmVlL0xpbmVOdW1iZXJOb2RlLmphdmEKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IE9yYWNsZSBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQorICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQorICogcXVlc3Rpb25zLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgaXMgYXZhaWxhYmxlIHVuZGVyIGFuZCBnb3Zlcm5lZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIEhvd2V2ZXIsIHRoZSBmb2xsb3dpbmcgbm90aWNlIGFjY29tcGFuaWVkIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoaXMKKyAqIGZpbGU6CisgKgorICogQVNNOiBhIHZlcnkgc21hbGwgYW5kIGZhc3QgSmF2YSBieXRlY29kZSBtYW5pcHVsYXRpb24gZnJhbWV3b3JrCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAxMSBJTlJJQSwgRnJhbmNlIFRlbGVjb20KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20udHJlZTsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uTWV0aG9kVmlzaXRvcjsKKworLyoqCisgKiBBIG5vZGUgdGhhdCByZXByZXNlbnRzIGEgbGluZSBudW1iZXIgZGVjbGFyYXRpb24uIFRoZXNlIG5vZGVzIGFyZSBwc2V1ZG8KKyAqIGluc3RydWN0aW9uIG5vZGVzIGluIG9yZGVyIHRvIGJlIGluc2VydGVkIGluIGFuIGluc3RydWN0aW9uIGxpc3QuCisgKgorICogQGF1dGhvciBFcmljIEJydW5ldG9uCisgKi8KK3B1YmxpYyBjbGFzcyBMaW5lTnVtYmVyTm9kZSBleHRlbmRzIEFic3RyYWN0SW5zbk5vZGUgeworCisgICAgLyoqCisgICAgICogQSBsaW5lIG51bWJlci4gVGhpcyBudW1iZXIgcmVmZXJzIHRvIHRoZSBzb3VyY2UgZmlsZSBmcm9tIHdoaWNoIHRoZSBjbGFzcworICAgICAqIHdhcyBjb21waWxlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGxpbmU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZmlyc3QgaW5zdHJ1Y3Rpb24gY29ycmVzcG9uZGluZyB0byB0aGlzIGxpbmUgbnVtYmVyLgorICAgICAqLworICAgIHB1YmxpYyBMYWJlbE5vZGUgc3RhcnQ7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAbGluayBMaW5lTnVtYmVyTm9kZX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGluZSBhIGxpbmUgbnVtYmVyLiBUaGlzIG51bWJlciByZWZlcnMgdG8gdGhlIHNvdXJjZSBmaWxlIGZyb20KKyAgICAgKiAgICAgICAgd2hpY2ggdGhlIGNsYXNzIHdhcyBjb21waWxlZC4KKyAgICAgKiBAcGFyYW0gc3RhcnQgdGhlIGZpcnN0IGluc3RydWN0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBsaW5lIG51bWJlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGluZU51bWJlck5vZGUoZmluYWwgaW50IGxpbmUsIGZpbmFsIExhYmVsTm9kZSBzdGFydCkgeworICAgICAgICBzdXBlcigtMSk7CisgICAgICAgIHRoaXMubGluZSA9IGxpbmU7CisgICAgICAgIHRoaXMuc3RhcnQgPSBzdGFydDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiBMSU5FOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFjY2VwdChmaW5hbCBNZXRob2RWaXNpdG9yIG12KSB7CisgICAgICAgIG12LnZpc2l0TGluZU51bWJlcihsaW5lLCBzdGFydC5nZXRMYWJlbCgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQWJzdHJhY3RJbnNuTm9kZSBjbG9uZShmaW5hbCBNYXA8TGFiZWxOb2RlLCBMYWJlbE5vZGU+IGxhYmVscykgeworICAgICAgICByZXR1cm4gbmV3IExpbmVOdW1iZXJOb2RlKGxpbmUsIGNsb25lKHN0YXJ0LCBsYWJlbHMpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL3RyZWUvTG9jYWxWYXJpYWJsZU5vZGUuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vdHJlZS9Mb2NhbFZhcmlhYmxlTm9kZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkMzI3MmIKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL3RyZWUvTG9jYWxWYXJpYWJsZU5vZGUuamF2YQpAQCAtMCwwICsxLDE0NCBAQAorLyoKKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgT3JhY2xlIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCisgKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CisgKiBxdWVzdGlvbnMuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBpcyBhdmFpbGFibGUgdW5kZXIgYW5kIGdvdmVybmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogSG93ZXZlciwgdGhlIGZvbGxvd2luZyBub3RpY2UgYWNjb21wYW5pZWQgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhpcworICogZmlsZToKKyAqCisgKiBBU006IGEgdmVyeSBzbWFsbCBhbmQgZmFzdCBKYXZhIGJ5dGVjb2RlIG1hbmlwdWxhdGlvbiBmcmFtZXdvcmsKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDExIElOUklBLCBGcmFuY2UgVGVsZWNvbQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS50cmVlOworCitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLk1ldGhvZFZpc2l0b3I7CisKKy8qKgorICogQSBub2RlIHRoYXQgcmVwcmVzZW50cyBhIGxvY2FsIHZhcmlhYmxlIGRlY2xhcmF0aW9uLgorICoKKyAqIEBhdXRob3IgRXJpYyBCcnVuZXRvbgorICovCitwdWJsaWMgY2xhc3MgTG9jYWxWYXJpYWJsZU5vZGUgeworCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgYSBsb2NhbCB2YXJpYWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIG5hbWU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBkZXNjcmlwdG9yIG9mIHRoaXMgbG9jYWwgdmFyaWFibGUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBkZXNjOworCisgICAgLyoqCisgICAgICogVGhlIHNpZ25hdHVyZSBvZiB0aGlzIGxvY2FsIHZhcmlhYmxlLiBNYXkgYmUgPHR0Pm51bGw8L3R0Pi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHNpZ25hdHVyZTsKKworICAgIC8qKgorICAgICAqIFRoZSBmaXJzdCBpbnN0cnVjdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBzY29wZSBvZiB0aGlzIGxvY2FsIHZhcmlhYmxlCisgICAgICogKGluY2x1c2l2ZSkuCisgICAgICovCisgICAgcHVibGljIExhYmVsTm9kZSBzdGFydDsKKworICAgIC8qKgorICAgICAqIFRoZSBsYXN0IGluc3RydWN0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNjb3BlIG9mIHRoaXMgbG9jYWwgdmFyaWFibGUKKyAgICAgKiAoZXhjbHVzaXZlKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGFiZWxOb2RlIGVuZDsKKworICAgIC8qKgorICAgICAqIFRoZSBsb2NhbCB2YXJpYWJsZSdzIGluZGV4LgorICAgICAqLworICAgIHB1YmxpYyBpbnQgaW5kZXg7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAbGluayBMb2NhbFZhcmlhYmxlTm9kZX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiBhIGxvY2FsIHZhcmlhYmxlLgorICAgICAqIEBwYXJhbSBkZXNjIHRoZSB0eXBlIGRlc2NyaXB0b3Igb2YgdGhpcyBsb2NhbCB2YXJpYWJsZS4KKyAgICAgKiBAcGFyYW0gc2lnbmF0dXJlIHRoZSBzaWduYXR1cmUgb2YgdGhpcyBsb2NhbCB2YXJpYWJsZS4gTWF5IGJlCisgICAgICogICAgICAgIDx0dD5udWxsPC90dD4uCisgICAgICogQHBhcmFtIHN0YXJ0IHRoZSBmaXJzdCBpbnN0cnVjdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBzY29wZSBvZiB0aGlzCisgICAgICogICAgICAgIGxvY2FsIHZhcmlhYmxlIChpbmNsdXNpdmUpLgorICAgICAqIEBwYXJhbSBlbmQgdGhlIGxhc3QgaW5zdHJ1Y3Rpb24gY29ycmVzcG9uZGluZyB0byB0aGUgc2NvcGUgb2YgdGhpcyBsb2NhbAorICAgICAqICAgICAgICB2YXJpYWJsZSAoZXhjbHVzaXZlKS4KKyAgICAgKiBAcGFyYW0gaW5kZXggdGhlIGxvY2FsIHZhcmlhYmxlJ3MgaW5kZXguCisgICAgICovCisgICAgcHVibGljIExvY2FsVmFyaWFibGVOb2RlKAorICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSwKKyAgICAgICAgZmluYWwgU3RyaW5nIGRlc2MsCisgICAgICAgIGZpbmFsIFN0cmluZyBzaWduYXR1cmUsCisgICAgICAgIGZpbmFsIExhYmVsTm9kZSBzdGFydCwKKyAgICAgICAgZmluYWwgTGFiZWxOb2RlIGVuZCwKKyAgICAgICAgZmluYWwgaW50IGluZGV4KQorICAgIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5kZXNjID0gZGVzYzsKKyAgICAgICAgdGhpcy5zaWduYXR1cmUgPSBzaWduYXR1cmU7CisgICAgICAgIHRoaXMuc3RhcnQgPSBzdGFydDsKKyAgICAgICAgdGhpcy5lbmQgPSBlbmQ7CisgICAgICAgIHRoaXMuaW5kZXggPSBpbmRleDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYWtlcyB0aGUgZ2l2ZW4gdmlzaXRvciB2aXNpdCB0aGlzIGxvY2FsIHZhcmlhYmxlIGRlY2xhcmF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIG12IGEgbWV0aG9kIHZpc2l0b3IuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWNjZXB0KGZpbmFsIE1ldGhvZFZpc2l0b3IgbXYpIHsKKyAgICAgICAgbXYudmlzaXRMb2NhbFZhcmlhYmxlKG5hbWUsCisgICAgICAgICAgICAgICAgZGVzYywKKyAgICAgICAgICAgICAgICBzaWduYXR1cmUsCisgICAgICAgICAgICAgICAgc3RhcnQuZ2V0TGFiZWwoKSwKKyAgICAgICAgICAgICAgICBlbmQuZ2V0TGFiZWwoKSwKKyAgICAgICAgICAgICAgICBpbmRleCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS90cmVlL0xvb2t1cFN3aXRjaEluc25Ob2RlLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL3RyZWUvTG9va3VwU3dpdGNoSW5zbk5vZGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTgwMWRkCi0tLSAvZGV2L251bGwKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS90cmVlL0xvb2t1cFN3aXRjaEluc25Ob2RlLmphdmEKQEAgLTAsMCArMSwxNDUgQEAKKy8qCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IE9yYWNsZSBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQorICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQorICogcXVlc3Rpb25zLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgaXMgYXZhaWxhYmxlIHVuZGVyIGFuZCBnb3Zlcm5lZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIEhvd2V2ZXIsIHRoZSBmb2xsb3dpbmcgbm90aWNlIGFjY29tcGFuaWVkIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoaXMKKyAqIGZpbGU6CisgKgorICogQVNNOiBhIHZlcnkgc21hbGwgYW5kIGZhc3QgSmF2YSBieXRlY29kZSBtYW5pcHVsYXRpb24gZnJhbWV3b3JrCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAxMSBJTlJJQSwgRnJhbmNlIFRlbGVjb20KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20udHJlZTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLkxhYmVsOworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5NZXRob2RWaXNpdG9yOworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5PcGNvZGVzOworCisvKioKKyAqIEEgbm9kZSB0aGF0IHJlcHJlc2VudHMgYSBMT09LVVBTV0lUQ0ggaW5zdHJ1Y3Rpb24uCisgKgorICogQGF1dGhvciBFcmljIEJydW5ldG9uCisgKi8KK3B1YmxpYyBjbGFzcyBMb29rdXBTd2l0Y2hJbnNuTm9kZSBleHRlbmRzIEFic3RyYWN0SW5zbk5vZGUgeworCisgICAgLyoqCisgICAgICogQmVnaW5uaW5nIG9mIHRoZSBkZWZhdWx0IGhhbmRsZXIgYmxvY2suCisgICAgICovCisgICAgcHVibGljIExhYmVsTm9kZSBkZmx0OworCisgICAgLyoqCisgICAgICogVGhlIHZhbHVlcyBvZiB0aGUga2V5cy4gVGhpcyBsaXN0IGlzIGEgbGlzdCBvZiB7QGxpbmsgSW50ZWdlcn0gb2JqZWN0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxJbnRlZ2VyPiBrZXlzOworCisgICAgLyoqCisgICAgICogQmVnaW5uaW5ncyBvZiB0aGUgaGFuZGxlciBibG9ja3MuIFRoaXMgbGlzdCBpcyBhIGxpc3Qgb2YKKyAgICAgKiB7QGxpbmsgTGFiZWxOb2RlfSBvYmplY3RzLgorICAgICAqLworICAgIHB1YmxpYyBMaXN0PExhYmVsTm9kZT4gbGFiZWxzOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGxpbmsgTG9va3VwU3dpdGNoSW5zbk5vZGV9LgorICAgICAqCisgICAgICogQHBhcmFtIGRmbHQgYmVnaW5uaW5nIG9mIHRoZSBkZWZhdWx0IGhhbmRsZXIgYmxvY2suCisgICAgICogQHBhcmFtIGtleXMgdGhlIHZhbHVlcyBvZiB0aGUga2V5cy4KKyAgICAgKiBAcGFyYW0gbGFiZWxzIGJlZ2lubmluZ3Mgb2YgdGhlIGhhbmRsZXIgYmxvY2tzLiA8dHQ+bGFiZWxzW2ldPC90dD4gaXMKKyAgICAgKiAgICAgICAgdGhlIGJlZ2lubmluZyBvZiB0aGUgaGFuZGxlciBibG9jayBmb3IgdGhlIDx0dD5rZXlzW2ldPC90dD4ga2V5LgorICAgICAqLworICAgIHB1YmxpYyBMb29rdXBTd2l0Y2hJbnNuTm9kZSgKKyAgICAgICAgZmluYWwgTGFiZWxOb2RlIGRmbHQsCisgICAgICAgIGZpbmFsIGludFtdIGtleXMsCisgICAgICAgIGZpbmFsIExhYmVsTm9kZVtdIGxhYmVscykKKyAgICB7CisgICAgICAgIHN1cGVyKE9wY29kZXMuTE9PS1VQU1dJVENIKTsKKyAgICAgICAgdGhpcy5kZmx0ID0gZGZsdDsKKyAgICAgICAgdGhpcy5rZXlzID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPihrZXlzID09IG51bGwgPyAwIDoga2V5cy5sZW5ndGgpOworICAgICAgICB0aGlzLmxhYmVscyA9IG5ldyBBcnJheUxpc3Q8TGFiZWxOb2RlPihsYWJlbHMgPT0gbnVsbCA/IDAgOiBsYWJlbHMubGVuZ3RoKTsKKyAgICAgICAgaWYgKGtleXMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICAgICAgdGhpcy5rZXlzLmFkZChuZXcgSW50ZWdlcihrZXlzW2ldKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxhYmVscyAhPSBudWxsKSB7CisgICAgICAgICAgICB0aGlzLmxhYmVscy5hZGRBbGwoQXJyYXlzLmFzTGlzdChsYWJlbHMpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIExPT0tVUFNXSVRDSF9JTlNOOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFjY2VwdChmaW5hbCBNZXRob2RWaXNpdG9yIG12KSB7CisgICAgICAgIGludFtdIGtleXMgPSBuZXcgaW50W3RoaXMua2V5cy5zaXplKCldOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIGtleXNbaV0gPSB0aGlzLmtleXMuZ2V0KGkpLmludFZhbHVlKCk7CisgICAgICAgIH0KKyAgICAgICAgTGFiZWxbXSBsYWJlbHMgPSBuZXcgTGFiZWxbdGhpcy5sYWJlbHMuc2l6ZSgpXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsYWJlbHMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIGxhYmVsc1tpXSA9IHRoaXMubGFiZWxzLmdldChpKS5nZXRMYWJlbCgpOworICAgICAgICB9CisgICAgICAgIG12LnZpc2l0TG9va3VwU3dpdGNoSW5zbihkZmx0LmdldExhYmVsKCksIGtleXMsIGxhYmVscyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEFic3RyYWN0SW5zbk5vZGUgY2xvbmUoZmluYWwgTWFwPExhYmVsTm9kZSwgTGFiZWxOb2RlPiBsYWJlbHMpIHsKKyAgICAgICAgTG9va3VwU3dpdGNoSW5zbk5vZGUgY2xvbmUgPSBuZXcgTG9va3VwU3dpdGNoSW5zbk5vZGUoY2xvbmUoZGZsdCwKKyAgICAgICAgICAgICAgICBsYWJlbHMpLCBudWxsLCBjbG9uZSh0aGlzLmxhYmVscywgbGFiZWxzKSk7CisgICAgICAgIGNsb25lLmtleXMuYWRkQWxsKGtleXMpOworICAgICAgICByZXR1cm4gY2xvbmU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS90cmVlL01ldGhvZEluc25Ob2RlLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL3RyZWUvTWV0aG9kSW5zbk5vZGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmQ1NTRmCi0tLSAvZGV2L251bGwKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS90cmVlL01ldGhvZEluc25Ob2RlLmphdmEKQEAgLTAsMCArMSwxMzYgQEAKKy8qCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IE9yYWNsZSBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQorICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQorICogcXVlc3Rpb25zLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgaXMgYXZhaWxhYmxlIHVuZGVyIGFuZCBnb3Zlcm5lZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIEhvd2V2ZXIsIHRoZSBmb2xsb3dpbmcgbm90aWNlIGFjY29tcGFuaWVkIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoaXMKKyAqIGZpbGU6CisgKgorICogQVNNOiBhIHZlcnkgc21hbGwgYW5kIGZhc3QgSmF2YSBieXRlY29kZSBtYW5pcHVsYXRpb24gZnJhbWV3b3JrCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAxMSBJTlJJQSwgRnJhbmNlIFRlbGVjb20KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20udHJlZTsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uTWV0aG9kVmlzaXRvcjsKKworLyoqCisgKiBBIG5vZGUgdGhhdCByZXByZXNlbnRzIGEgbWV0aG9kIGluc3RydWN0aW9uLiBBIG1ldGhvZCBpbnN0cnVjdGlvbiBpcyBhbgorICogaW5zdHJ1Y3Rpb24gdGhhdCBpbnZva2VzIGEgbWV0aG9kLgorICoKKyAqIEBhdXRob3IgRXJpYyBCcnVuZXRvbgorICovCitwdWJsaWMgY2xhc3MgTWV0aG9kSW5zbk5vZGUgZXh0ZW5kcyBBYnN0cmFjdEluc25Ob2RlIHsKKworICAgIC8qKgorICAgICAqIFRoZSBpbnRlcm5hbCBuYW1lIG9mIHRoZSBtZXRob2QncyBvd25lciBjbGFzcyAoc2VlCisgICAgICoge0BsaW5rIGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5UeXBlI2dldEludGVybmFsTmFtZSgpIGdldEludGVybmFsTmFtZX0pLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgb3duZXI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbWV0aG9kJ3MgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIG5hbWU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbWV0aG9kJ3MgZGVzY3JpcHRvciAoc2VlIHtAbGluayBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uVHlwZX0pLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZGVzYzsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0BsaW5rIE1ldGhvZEluc25Ob2RlfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvcGNvZGUgdGhlIG9wY29kZSBvZiB0aGUgdHlwZSBpbnN0cnVjdGlvbiB0byBiZSBjb25zdHJ1Y3RlZC4gVGhpcworICAgICAqICAgICAgICBvcGNvZGUgbXVzdCBiZSBJTlZPS0VWSVJUVUFMLCBJTlZPS0VTUEVDSUFMLCBJTlZPS0VTVEFUSUMgb3IKKyAgICAgKiAgICAgICAgSU5WT0tFSU5URVJGQUNFLgorICAgICAqIEBwYXJhbSBvd25lciB0aGUgaW50ZXJuYWwgbmFtZSBvZiB0aGUgbWV0aG9kJ3Mgb3duZXIgY2xhc3MgKHNlZQorICAgICAqICAgICAgICB7QGxpbmsgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLlR5cGUjZ2V0SW50ZXJuYWxOYW1lKCkgZ2V0SW50ZXJuYWxOYW1lfSkuCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG1ldGhvZCdzIG5hbWUuCisgICAgICogQHBhcmFtIGRlc2MgdGhlIG1ldGhvZCdzIGRlc2NyaXB0b3IgKHNlZSB7QGxpbmsgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLlR5cGV9KS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWV0aG9kSW5zbk5vZGUoCisgICAgICAgIGZpbmFsIGludCBvcGNvZGUsCisgICAgICAgIGZpbmFsIFN0cmluZyBvd25lciwKKyAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUsCisgICAgICAgIGZpbmFsIFN0cmluZyBkZXNjKQorICAgIHsKKyAgICAgICAgc3VwZXIob3Bjb2RlKTsKKyAgICAgICAgdGhpcy5vd25lciA9IG93bmVyOworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB0aGlzLmRlc2MgPSBkZXNjOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG9wY29kZSBvZiB0aGlzIGluc3RydWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIG9wY29kZSB0aGUgbmV3IGluc3RydWN0aW9uIG9wY29kZS4gVGhpcyBvcGNvZGUgbXVzdCBiZQorICAgICAqICAgICAgICBJTlZPS0VWSVJUVUFMLCBJTlZPS0VTUEVDSUFMLCBJTlZPS0VTVEFUSUMgb3IgSU5WT0tFSU5URVJGQUNFLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE9wY29kZShmaW5hbCBpbnQgb3Bjb2RlKSB7CisgICAgICAgIHRoaXMub3Bjb2RlID0gb3Bjb2RlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIE1FVEhPRF9JTlNOOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFjY2VwdChmaW5hbCBNZXRob2RWaXNpdG9yIG12KSB7CisgICAgICAgIG12LnZpc2l0TWV0aG9kSW5zbihvcGNvZGUsIG93bmVyLCBuYW1lLCBkZXNjKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQWJzdHJhY3RJbnNuTm9kZSBjbG9uZShmaW5hbCBNYXA8TGFiZWxOb2RlLCBMYWJlbE5vZGU+IGxhYmVscykgeworICAgICAgICByZXR1cm4gbmV3IE1ldGhvZEluc25Ob2RlKG9wY29kZSwgb3duZXIsIG5hbWUsIGRlc2MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vdHJlZS9NZXRob2ROb2RlLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL3RyZWUvTWV0aG9kTm9kZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiNjBjZjIKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL3RyZWUvTWV0aG9kTm9kZS5qYXZhCkBAIC0wLDAgKzEsNjc1IEBACisvKgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBPcmFjbGUgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKKyAqIHF1ZXN0aW9ucy4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGlzIGF2YWlsYWJsZSB1bmRlciBhbmQgZ292ZXJuZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiBIb3dldmVyLCB0aGUgZm9sbG93aW5nIG5vdGljZSBhY2NvbXBhbmllZCB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGlzCisgKiBmaWxlOgorICoKKyAqIEFTTTogYSB2ZXJ5IHNtYWxsIGFuZCBmYXN0IEphdmEgYnl0ZWNvZGUgbWFuaXB1bGF0aW9uIGZyYW1ld29yaworICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMTEgSU5SSUEsIEZyYW5jZSBUZWxlY29tCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgR29vZ2xlCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2UgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLnRyZWU7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uQW5ub3RhdGlvblZpc2l0b3I7CitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLkF0dHJpYnV0ZTsKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uQ2xhc3NWaXNpdG9yOworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5IYW5kbGU7CitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLkxhYmVsOworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5NZXRob2RWaXNpdG9yOworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5PcGNvZGVzOworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5UeXBlOworCisvKioKKyAqIEEgbm9kZSB0aGF0IHJlcHJlc2VudHMgYSBtZXRob2QuCisgKgorICogQGF1dGhvciBFcmljIEJydW5ldG9uCisgKi8KK3B1YmxpYyBjbGFzcyBNZXRob2ROb2RlIGV4dGVuZHMgTWV0aG9kVmlzaXRvciB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbWV0aG9kJ3MgYWNjZXNzIGZsYWdzIChzZWUge0BsaW5rIE9wY29kZXN9KS4gVGhpcyBmaWVsZCBhbHNvCisgICAgICogaW5kaWNhdGVzIGlmIHRoZSBtZXRob2QgaXMgc3ludGhldGljIGFuZC9vciBkZXByZWNhdGVkLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgYWNjZXNzOworCisgICAgLyoqCisgICAgICogVGhlIG1ldGhvZCdzIG5hbWUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBuYW1lOworCisgICAgLyoqCisgICAgICogVGhlIG1ldGhvZCdzIGRlc2NyaXB0b3IgKHNlZSB7QGxpbmsgVHlwZX0pLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZGVzYzsKKworICAgIC8qKgorICAgICAqIFRoZSBtZXRob2QncyBzaWduYXR1cmUuIE1heSBiZSA8dHQ+bnVsbDwvdHQ+LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgc2lnbmF0dXJlOworCisgICAgLyoqCisgICAgICogVGhlIGludGVybmFsIG5hbWVzIG9mIHRoZSBtZXRob2QncyBleGNlcHRpb24gY2xhc3NlcyAoc2VlCisgICAgICoge0BsaW5rIFR5cGUjZ2V0SW50ZXJuYWxOYW1lKCkgZ2V0SW50ZXJuYWxOYW1lfSkuIFRoaXMgbGlzdCBpcyBhIGxpc3Qgb2YKKyAgICAgKiB7QGxpbmsgU3RyaW5nfSBvYmplY3RzLgorICAgICAqLworICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZXhjZXB0aW9uczsKKworICAgIC8qKgorICAgICAqIFRoZSBydW50aW1lIHZpc2libGUgYW5ub3RhdGlvbnMgb2YgdGhpcyBtZXRob2QuIFRoaXMgbGlzdCBpcyBhIGxpc3Qgb2YKKyAgICAgKiB7QGxpbmsgQW5ub3RhdGlvbk5vZGV9IG9iamVjdHMuIE1heSBiZSA8dHQ+bnVsbDwvdHQ+LgorICAgICAqCisgICAgICogQGFzc29jaWF0ZXMgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLnRyZWUuQW5ub3RhdGlvbk5vZGUKKyAgICAgKiBAbGFiZWwgdmlzaWJsZQorICAgICAqLworICAgIHB1YmxpYyBMaXN0PEFubm90YXRpb25Ob2RlPiB2aXNpYmxlQW5ub3RhdGlvbnM7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcnVudGltZSBpbnZpc2libGUgYW5ub3RhdGlvbnMgb2YgdGhpcyBtZXRob2QuIFRoaXMgbGlzdCBpcyBhIGxpc3Qgb2YKKyAgICAgKiB7QGxpbmsgQW5ub3RhdGlvbk5vZGV9IG9iamVjdHMuIE1heSBiZSA8dHQ+bnVsbDwvdHQ+LgorICAgICAqCisgICAgICogQGFzc29jaWF0ZXMgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLnRyZWUuQW5ub3RhdGlvbk5vZGUKKyAgICAgKiBAbGFiZWwgaW52aXNpYmxlCisgICAgICovCisgICAgcHVibGljIExpc3Q8QW5ub3RhdGlvbk5vZGU+IGludmlzaWJsZUFubm90YXRpb25zOworCisgICAgLyoqCisgICAgICogVGhlIG5vbiBzdGFuZGFyZCBhdHRyaWJ1dGVzIG9mIHRoaXMgbWV0aG9kLiBUaGlzIGxpc3QgaXMgYSBsaXN0IG9mCisgICAgICoge0BsaW5rIEF0dHJpYnV0ZX0gb2JqZWN0cy4gTWF5IGJlIDx0dD5udWxsPC90dD4uCisgICAgICoKKyAgICAgKiBAYXNzb2NpYXRlcyBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uQXR0cmlidXRlCisgICAgICovCisgICAgcHVibGljIExpc3Q8QXR0cmlidXRlPiBhdHRyczsKKworICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoaXMgYW5ub3RhdGlvbiBpbnRlcmZhY2UgbWV0aG9kLiBUaGlzIGZpZWxkIG11c3QgYmUKKyAgICAgKiBhIHtAbGluayBCeXRlfSwge0BsaW5rIEJvb2xlYW59LCB7QGxpbmsgQ2hhcmFjdGVyfSwge0BsaW5rIFNob3J0fSwKKyAgICAgKiB7QGxpbmsgSW50ZWdlcn0sIHtAbGluayBMb25nfSwge0BsaW5rIEZsb2F0fSwge0BsaW5rIERvdWJsZX0sCisgICAgICoge0BsaW5rIFN0cmluZ30gb3Ige0BsaW5rIFR5cGV9LCBvciBhbiB0d28gZWxlbWVudHMgU3RyaW5nIGFycmF5IChmb3IKKyAgICAgKiBlbnVtZXJhdGlvbiB2YWx1ZXMpLCBhIHtAbGluayBBbm5vdGF0aW9uTm9kZX0sIG9yIGEge0BsaW5rIExpc3R9IG9mCisgICAgICogdmFsdWVzIG9mIG9uZSBvZiB0aGUgcHJlY2VkaW5nIHR5cGVzLiBNYXkgYmUgPHR0Pm51bGw8L3R0Pi4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGFubm90YXRpb25EZWZhdWx0OworCisgICAgLyoqCisgICAgICogVGhlIHJ1bnRpbWUgdmlzaWJsZSBwYXJhbWV0ZXIgYW5ub3RhdGlvbnMgb2YgdGhpcyBtZXRob2QuIFRoZXNlIGxpc3RzIGFyZQorICAgICAqIGxpc3RzIG9mIHtAbGluayBBbm5vdGF0aW9uTm9kZX0gb2JqZWN0cy4gTWF5IGJlIDx0dD5udWxsPC90dD4uCisgICAgICoKKyAgICAgKiBAYXNzb2NpYXRlcyBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20udHJlZS5Bbm5vdGF0aW9uTm9kZQorICAgICAqIEBsYWJlbCBpbnZpc2libGUgcGFyYW1ldGVycworICAgICAqLworICAgIHB1YmxpYyBMaXN0PEFubm90YXRpb25Ob2RlPltdIHZpc2libGVQYXJhbWV0ZXJBbm5vdGF0aW9uczsKKworICAgIC8qKgorICAgICAqIFRoZSBydW50aW1lIGludmlzaWJsZSBwYXJhbWV0ZXIgYW5ub3RhdGlvbnMgb2YgdGhpcyBtZXRob2QuIFRoZXNlIGxpc3RzCisgICAgICogYXJlIGxpc3RzIG9mIHtAbGluayBBbm5vdGF0aW9uTm9kZX0gb2JqZWN0cy4gTWF5IGJlIDx0dD5udWxsPC90dD4uCisgICAgICoKKyAgICAgKiBAYXNzb2NpYXRlcyBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20udHJlZS5Bbm5vdGF0aW9uTm9kZQorICAgICAqIEBsYWJlbCB2aXNpYmxlIHBhcmFtZXRlcnMKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxBbm5vdGF0aW9uTm9kZT5bXSBpbnZpc2libGVQYXJhbWV0ZXJBbm5vdGF0aW9uczsKKworICAgIC8qKgorICAgICAqIFRoZSBpbnN0cnVjdGlvbnMgb2YgdGhpcyBtZXRob2QuIFRoaXMgbGlzdCBpcyBhIGxpc3Qgb2YKKyAgICAgKiB7QGxpbmsgQWJzdHJhY3RJbnNuTm9kZX0gb2JqZWN0cy4KKyAgICAgKgorICAgICAqIEBhc3NvY2lhdGVzIGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS50cmVlLkFic3RyYWN0SW5zbk5vZGUKKyAgICAgKiBAbGFiZWwgaW5zdHJ1Y3Rpb25zCisgICAgICovCisgICAgcHVibGljIEluc25MaXN0IGluc3RydWN0aW9uczsKKworICAgIC8qKgorICAgICAqIFRoZSB0cnkgY2F0Y2ggYmxvY2tzIG9mIHRoaXMgbWV0aG9kLiBUaGlzIGxpc3QgaXMgYSBsaXN0IG9mCisgICAgICoge0BsaW5rIFRyeUNhdGNoQmxvY2tOb2RlfSBvYmplY3RzLgorICAgICAqCisgICAgICogQGFzc29jaWF0ZXMgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLnRyZWUuVHJ5Q2F0Y2hCbG9ja05vZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxUcnlDYXRjaEJsb2NrTm9kZT4gdHJ5Q2F0Y2hCbG9ja3M7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbWF4aW11bSBzdGFjayBzaXplIG9mIHRoaXMgbWV0aG9kLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgbWF4U3RhY2s7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgbG9jYWwgdmFyaWFibGVzIG9mIHRoaXMgbWV0aG9kLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgbWF4TG9jYWxzOworCisgICAgLyoqCisgICAgICogVGhlIGxvY2FsIHZhcmlhYmxlcyBvZiB0aGlzIG1ldGhvZC4gVGhpcyBsaXN0IGlzIGEgbGlzdCBvZgorICAgICAqIHtAbGluayBMb2NhbFZhcmlhYmxlTm9kZX0gb2JqZWN0cy4gTWF5IGJlIDx0dD5udWxsPC90dD4KKyAgICAgKgorICAgICAqIEBhc3NvY2lhdGVzIGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS50cmVlLkxvY2FsVmFyaWFibGVOb2RlCisgICAgICovCisgICAgcHVibGljIExpc3Q8TG9jYWxWYXJpYWJsZU5vZGU+IGxvY2FsVmFyaWFibGVzOworCisgICAgLyoqCisgICAgICogSWYgdGhlIGFjY2VwdCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkIG9uIHRoaXMgb2JqZWN0LgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiB2aXNpdGVkOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhbiB1bmluaXRpYWxpemVkIHtAbGluayBNZXRob2ROb2RlfS4gPGk+U3ViY2xhc3NlcyBtdXN0IG5vdAorICAgICAqIHVzZSB0aGlzIGNvbnN0cnVjdG9yPC9pPi4gSW5zdGVhZCwgdGhleSBtdXN0IHVzZSB0aGUKKyAgICAgKiB7QGxpbmsgI01ldGhvZE5vZGUoaW50KX0gdmVyc2lvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWV0aG9kTm9kZSgpIHsKKyAgICAgICAgdGhpcyhPcGNvZGVzLkFTTTQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYW4gdW5pbml0aWFsaXplZCB7QGxpbmsgTWV0aG9kTm9kZX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXBpIHRoZSBBU00gQVBJIHZlcnNpb24gaW1wbGVtZW50ZWQgYnkgdGhpcyB2aXNpdG9yLiBNdXN0IGJlIG9uZQorICAgICAqICAgICAgICBvZiB7QGxpbmsgT3Bjb2RlcyNBU000fS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWV0aG9kTm9kZShmaW5hbCBpbnQgYXBpKSB7CisgICAgICAgIHN1cGVyKGFwaSk7CisgICAgICAgIHRoaXMuaW5zdHJ1Y3Rpb25zID0gbmV3IEluc25MaXN0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGxpbmsgTWV0aG9kTm9kZX0uIDxpPlN1YmNsYXNzZXMgbXVzdCBub3QgdXNlIHRoaXMKKyAgICAgKiBjb25zdHJ1Y3RvcjwvaT4uIEluc3RlYWQsIHRoZXkgbXVzdCB1c2UgdGhlCisgICAgICoge0BsaW5rICNNZXRob2ROb2RlKGludCwgaW50LCBTdHJpbmcsIFN0cmluZywgU3RyaW5nLCBTdHJpbmdbXSl9IHZlcnNpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWNjZXNzIHRoZSBtZXRob2QncyBhY2Nlc3MgZmxhZ3MgKHNlZSB7QGxpbmsgT3Bjb2Rlc30pLiBUaGlzCisgICAgICogICAgICAgIHBhcmFtZXRlciBhbHNvIGluZGljYXRlcyBpZiB0aGUgbWV0aG9kIGlzIHN5bnRoZXRpYyBhbmQvb3IKKyAgICAgKiAgICAgICAgZGVwcmVjYXRlZC4KKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbWV0aG9kJ3MgbmFtZS4KKyAgICAgKiBAcGFyYW0gZGVzYyB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRvciAoc2VlIHtAbGluayBUeXBlfSkuCisgICAgICogQHBhcmFtIHNpZ25hdHVyZSB0aGUgbWV0aG9kJ3Mgc2lnbmF0dXJlLiBNYXkgYmUgPHR0Pm51bGw8L3R0Pi4KKyAgICAgKiBAcGFyYW0gZXhjZXB0aW9ucyB0aGUgaW50ZXJuYWwgbmFtZXMgb2YgdGhlIG1ldGhvZCdzIGV4Y2VwdGlvbiBjbGFzc2VzCisgICAgICogICAgICAgIChzZWUge0BsaW5rIFR5cGUjZ2V0SW50ZXJuYWxOYW1lKCkgZ2V0SW50ZXJuYWxOYW1lfSkuIE1heSBiZQorICAgICAqICAgICAgICA8dHQ+bnVsbDwvdHQ+LgorICAgICAqLworICAgIHB1YmxpYyBNZXRob2ROb2RlKAorICAgICAgICBmaW5hbCBpbnQgYWNjZXNzLAorICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSwKKyAgICAgICAgZmluYWwgU3RyaW5nIGRlc2MsCisgICAgICAgIGZpbmFsIFN0cmluZyBzaWduYXR1cmUsCisgICAgICAgIGZpbmFsIFN0cmluZ1tdIGV4Y2VwdGlvbnMpCisgICAgeworICAgICAgICB0aGlzKE9wY29kZXMuQVNNNCwgYWNjZXNzLCBuYW1lLCBkZXNjLCBzaWduYXR1cmUsIGV4Y2VwdGlvbnMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0BsaW5rIE1ldGhvZE5vZGV9LgorICAgICAqCisgICAgICogQHBhcmFtIGFwaSB0aGUgQVNNIEFQSSB2ZXJzaW9uIGltcGxlbWVudGVkIGJ5IHRoaXMgdmlzaXRvci4gTXVzdCBiZSBvbmUKKyAgICAgKiAgICAgICAgb2Yge0BsaW5rIE9wY29kZXMjQVNNNH0uCisgICAgICogQHBhcmFtIGFjY2VzcyB0aGUgbWV0aG9kJ3MgYWNjZXNzIGZsYWdzIChzZWUge0BsaW5rIE9wY29kZXN9KS4gVGhpcworICAgICAqICAgICAgICBwYXJhbWV0ZXIgYWxzbyBpbmRpY2F0ZXMgaWYgdGhlIG1ldGhvZCBpcyBzeW50aGV0aWMgYW5kL29yCisgICAgICogICAgICAgIGRlcHJlY2F0ZWQuCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG1ldGhvZCdzIG5hbWUuCisgICAgICogQHBhcmFtIGRlc2MgdGhlIG1ldGhvZCdzIGRlc2NyaXB0b3IgKHNlZSB7QGxpbmsgVHlwZX0pLgorICAgICAqIEBwYXJhbSBzaWduYXR1cmUgdGhlIG1ldGhvZCdzIHNpZ25hdHVyZS4gTWF5IGJlIDx0dD5udWxsPC90dD4uCisgICAgICogQHBhcmFtIGV4Y2VwdGlvbnMgdGhlIGludGVybmFsIG5hbWVzIG9mIHRoZSBtZXRob2QncyBleGNlcHRpb24gY2xhc3NlcworICAgICAqICAgICAgICAoc2VlIHtAbGluayBUeXBlI2dldEludGVybmFsTmFtZSgpIGdldEludGVybmFsTmFtZX0pLiBNYXkgYmUKKyAgICAgKiAgICAgICAgPHR0Pm51bGw8L3R0Pi4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWV0aG9kTm9kZSgKKyAgICAgICAgZmluYWwgaW50IGFwaSwKKyAgICAgICAgZmluYWwgaW50IGFjY2VzcywKKyAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUsCisgICAgICAgIGZpbmFsIFN0cmluZyBkZXNjLAorICAgICAgICBmaW5hbCBTdHJpbmcgc2lnbmF0dXJlLAorICAgICAgICBmaW5hbCBTdHJpbmdbXSBleGNlcHRpb25zKQorICAgIHsKKyAgICAgICAgc3VwZXIoYXBpKTsKKyAgICAgICAgdGhpcy5hY2Nlc3MgPSBhY2Nlc3M7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMuZGVzYyA9IGRlc2M7CisgICAgICAgIHRoaXMuc2lnbmF0dXJlID0gc2lnbmF0dXJlOworICAgICAgICB0aGlzLmV4Y2VwdGlvbnMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oZXhjZXB0aW9ucyA9PSBudWxsCisgICAgICAgICAgICAgICAgPyAwCisgICAgICAgICAgICAgICAgOiBleGNlcHRpb25zLmxlbmd0aCk7CisgICAgICAgIGJvb2xlYW4gaXNBYnN0cmFjdCA9IChhY2Nlc3MgJiBPcGNvZGVzLkFDQ19BQlNUUkFDVCkgIT0gMDsKKyAgICAgICAgaWYgKCFpc0Fic3RyYWN0KSB7CisgICAgICAgICAgICB0aGlzLmxvY2FsVmFyaWFibGVzID0gbmV3IEFycmF5TGlzdDxMb2NhbFZhcmlhYmxlTm9kZT4oNSk7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy50cnlDYXRjaEJsb2NrcyA9IG5ldyBBcnJheUxpc3Q8VHJ5Q2F0Y2hCbG9ja05vZGU+KCk7CisgICAgICAgIGlmIChleGNlcHRpb25zICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMuZXhjZXB0aW9ucy5hZGRBbGwoQXJyYXlzLmFzTGlzdChleGNlcHRpb25zKSk7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5pbnN0cnVjdGlvbnMgPSBuZXcgSW5zbkxpc3QoKTsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgTWV0aG9kVmlzaXRvciBhYnN0cmFjdCBjbGFzcworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEFubm90YXRpb25WaXNpdG9yIHZpc2l0QW5ub3RhdGlvbkRlZmF1bHQoKSB7CisgICAgICAgIHJldHVybiBuZXcgQW5ub3RhdGlvbk5vZGUobmV3IEFycmF5TGlzdDxPYmplY3Q+KDApIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYWRkKGZpbmFsIE9iamVjdCBvKSB7CisgICAgICAgICAgICAgICAgYW5ub3RhdGlvbkRlZmF1bHQgPSBvOworICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5hZGQobyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBBbm5vdGF0aW9uVmlzaXRvciB2aXNpdEFubm90YXRpb24oCisgICAgICAgIGZpbmFsIFN0cmluZyBkZXNjLAorICAgICAgICBmaW5hbCBib29sZWFuIHZpc2libGUpCisgICAgeworICAgICAgICBBbm5vdGF0aW9uTm9kZSBhbiA9IG5ldyBBbm5vdGF0aW9uTm9kZShkZXNjKTsKKyAgICAgICAgaWYgKHZpc2libGUpIHsKKyAgICAgICAgICAgIGlmICh2aXNpYmxlQW5ub3RhdGlvbnMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHZpc2libGVBbm5vdGF0aW9ucyA9IG5ldyBBcnJheUxpc3Q8QW5ub3RhdGlvbk5vZGU+KDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmlzaWJsZUFubm90YXRpb25zLmFkZChhbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoaW52aXNpYmxlQW5ub3RhdGlvbnMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGludmlzaWJsZUFubm90YXRpb25zID0gbmV3IEFycmF5TGlzdDxBbm5vdGF0aW9uTm9kZT4oMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnZpc2libGVBbm5vdGF0aW9ucy5hZGQoYW4pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhbjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQW5ub3RhdGlvblZpc2l0b3IgdmlzaXRQYXJhbWV0ZXJBbm5vdGF0aW9uKAorICAgICAgICBmaW5hbCBpbnQgcGFyYW1ldGVyLAorICAgICAgICBmaW5hbCBTdHJpbmcgZGVzYywKKyAgICAgICAgZmluYWwgYm9vbGVhbiB2aXNpYmxlKQorICAgIHsKKyAgICAgICAgQW5ub3RhdGlvbk5vZGUgYW4gPSBuZXcgQW5ub3RhdGlvbk5vZGUoZGVzYyk7CisgICAgICAgIGlmICh2aXNpYmxlKSB7CisgICAgICAgICAgICBpZiAodmlzaWJsZVBhcmFtZXRlckFubm90YXRpb25zID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbnQgcGFyYW1zID0gVHlwZS5nZXRBcmd1bWVudFR5cGVzKHRoaXMuZGVzYykubGVuZ3RoOworICAgICAgICAgICAgICAgIHZpc2libGVQYXJhbWV0ZXJBbm5vdGF0aW9ucyA9IChMaXN0PEFubm90YXRpb25Ob2RlPltdKW5ldyBMaXN0PD8+W3BhcmFtc107CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodmlzaWJsZVBhcmFtZXRlckFubm90YXRpb25zW3BhcmFtZXRlcl0gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHZpc2libGVQYXJhbWV0ZXJBbm5vdGF0aW9uc1twYXJhbWV0ZXJdID0gbmV3IEFycmF5TGlzdDxBbm5vdGF0aW9uTm9kZT4oMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aXNpYmxlUGFyYW1ldGVyQW5ub3RhdGlvbnNbcGFyYW1ldGVyXS5hZGQoYW4pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGludmlzaWJsZVBhcmFtZXRlckFubm90YXRpb25zID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbnQgcGFyYW1zID0gVHlwZS5nZXRBcmd1bWVudFR5cGVzKHRoaXMuZGVzYykubGVuZ3RoOworICAgICAgICAgICAgICAgIGludmlzaWJsZVBhcmFtZXRlckFubm90YXRpb25zID0gKExpc3Q8QW5ub3RhdGlvbk5vZGU+W10pbmV3IExpc3Q8Pz5bcGFyYW1zXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpbnZpc2libGVQYXJhbWV0ZXJBbm5vdGF0aW9uc1twYXJhbWV0ZXJdID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbnZpc2libGVQYXJhbWV0ZXJBbm5vdGF0aW9uc1twYXJhbWV0ZXJdID0gbmV3IEFycmF5TGlzdDxBbm5vdGF0aW9uTm9kZT4oMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnZpc2libGVQYXJhbWV0ZXJBbm5vdGF0aW9uc1twYXJhbWV0ZXJdLmFkZChhbik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFuOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0QXR0cmlidXRlKGZpbmFsIEF0dHJpYnV0ZSBhdHRyKSB7CisgICAgICAgIGlmIChhdHRycyA9PSBudWxsKSB7CisgICAgICAgICAgICBhdHRycyA9IG5ldyBBcnJheUxpc3Q8QXR0cmlidXRlPigxKTsKKyAgICAgICAgfQorICAgICAgICBhdHRycy5hZGQoYXR0cik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRDb2RlKCkgeworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0RnJhbWUoCisgICAgICAgIGZpbmFsIGludCB0eXBlLAorICAgICAgICBmaW5hbCBpbnQgbkxvY2FsLAorICAgICAgICBmaW5hbCBPYmplY3RbXSBsb2NhbCwKKyAgICAgICAgZmluYWwgaW50IG5TdGFjaywKKyAgICAgICAgZmluYWwgT2JqZWN0W10gc3RhY2spCisgICAgeworICAgICAgICBpbnN0cnVjdGlvbnMuYWRkKG5ldyBGcmFtZU5vZGUodHlwZSwgbkxvY2FsLCBsb2NhbCA9PSBudWxsCisgICAgICAgICAgICAgICAgPyBudWxsCisgICAgICAgICAgICAgICAgOiBnZXRMYWJlbE5vZGVzKGxvY2FsKSwgblN0YWNrLCBzdGFjayA9PSBudWxsCisgICAgICAgICAgICAgICAgPyBudWxsCisgICAgICAgICAgICAgICAgOiBnZXRMYWJlbE5vZGVzKHN0YWNrKSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0SW5zbihmaW5hbCBpbnQgb3Bjb2RlKSB7CisgICAgICAgIGluc3RydWN0aW9ucy5hZGQobmV3IEluc25Ob2RlKG9wY29kZSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0SW50SW5zbihmaW5hbCBpbnQgb3Bjb2RlLCBmaW5hbCBpbnQgb3BlcmFuZCkgeworICAgICAgICBpbnN0cnVjdGlvbnMuYWRkKG5ldyBJbnRJbnNuTm9kZShvcGNvZGUsIG9wZXJhbmQpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFZhckluc24oZmluYWwgaW50IG9wY29kZSwgZmluYWwgaW50IHZhcikgeworICAgICAgICBpbnN0cnVjdGlvbnMuYWRkKG5ldyBWYXJJbnNuTm9kZShvcGNvZGUsIHZhcikpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0VHlwZUluc24oZmluYWwgaW50IG9wY29kZSwgZmluYWwgU3RyaW5nIHR5cGUpIHsKKyAgICAgICAgaW5zdHJ1Y3Rpb25zLmFkZChuZXcgVHlwZUluc25Ob2RlKG9wY29kZSwgdHlwZSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0RmllbGRJbnNuKAorICAgICAgICBmaW5hbCBpbnQgb3Bjb2RlLAorICAgICAgICBmaW5hbCBTdHJpbmcgb3duZXIsCisgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lLAorICAgICAgICBmaW5hbCBTdHJpbmcgZGVzYykKKyAgICB7CisgICAgICAgIGluc3RydWN0aW9ucy5hZGQobmV3IEZpZWxkSW5zbk5vZGUob3Bjb2RlLCBvd25lciwgbmFtZSwgZGVzYykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TWV0aG9kSW5zbigKKyAgICAgICAgZmluYWwgaW50IG9wY29kZSwKKyAgICAgICAgZmluYWwgU3RyaW5nIG93bmVyLAorICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSwKKyAgICAgICAgZmluYWwgU3RyaW5nIGRlc2MpCisgICAgeworICAgICAgICBpbnN0cnVjdGlvbnMuYWRkKG5ldyBNZXRob2RJbnNuTm9kZShvcGNvZGUsIG93bmVyLCBuYW1lLCBkZXNjKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRJbnZva2VEeW5hbWljSW5zbigKKyAgICAgICAgU3RyaW5nIG5hbWUsCisgICAgICAgIFN0cmluZyBkZXNjLAorICAgICAgICBIYW5kbGUgYnNtLAorICAgICAgICBPYmplY3QuLi4gYnNtQXJncykKKyAgICB7CisgICAgICAgIGluc3RydWN0aW9ucy5hZGQobmV3IEludm9rZUR5bmFtaWNJbnNuTm9kZShuYW1lLCBkZXNjLCBic20sIGJzbUFyZ3MpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEp1bXBJbnNuKGZpbmFsIGludCBvcGNvZGUsIGZpbmFsIExhYmVsIGxhYmVsKSB7CisgICAgICAgIGluc3RydWN0aW9ucy5hZGQobmV3IEp1bXBJbnNuTm9kZShvcGNvZGUsIGdldExhYmVsTm9kZShsYWJlbCkpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdExhYmVsKGZpbmFsIExhYmVsIGxhYmVsKSB7CisgICAgICAgIGluc3RydWN0aW9ucy5hZGQoZ2V0TGFiZWxOb2RlKGxhYmVsKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRMZGNJbnNuKGZpbmFsIE9iamVjdCBjc3QpIHsKKyAgICAgICAgaW5zdHJ1Y3Rpb25zLmFkZChuZXcgTGRjSW5zbk5vZGUoY3N0KSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRJaW5jSW5zbihmaW5hbCBpbnQgdmFyLCBmaW5hbCBpbnQgaW5jcmVtZW50KSB7CisgICAgICAgIGluc3RydWN0aW9ucy5hZGQobmV3IElpbmNJbnNuTm9kZSh2YXIsIGluY3JlbWVudCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0VGFibGVTd2l0Y2hJbnNuKAorICAgICAgICBmaW5hbCBpbnQgbWluLAorICAgICAgICBmaW5hbCBpbnQgbWF4LAorICAgICAgICBmaW5hbCBMYWJlbCBkZmx0LAorICAgICAgICBmaW5hbCBMYWJlbC4uLiBsYWJlbHMpCisgICAgeworICAgICAgICBpbnN0cnVjdGlvbnMuYWRkKG5ldyBUYWJsZVN3aXRjaEluc25Ob2RlKG1pbiwKKyAgICAgICAgICAgICAgICBtYXgsCisgICAgICAgICAgICAgICAgZ2V0TGFiZWxOb2RlKGRmbHQpLAorICAgICAgICAgICAgICAgIGdldExhYmVsTm9kZXMobGFiZWxzKSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TG9va3VwU3dpdGNoSW5zbigKKyAgICAgICAgZmluYWwgTGFiZWwgZGZsdCwKKyAgICAgICAgZmluYWwgaW50W10ga2V5cywKKyAgICAgICAgZmluYWwgTGFiZWxbXSBsYWJlbHMpCisgICAgeworICAgICAgICBpbnN0cnVjdGlvbnMuYWRkKG5ldyBMb29rdXBTd2l0Y2hJbnNuTm9kZShnZXRMYWJlbE5vZGUoZGZsdCksCisgICAgICAgICAgICAgICAga2V5cywKKyAgICAgICAgICAgICAgICBnZXRMYWJlbE5vZGVzKGxhYmVscykpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdE11bHRpQU5ld0FycmF5SW5zbihmaW5hbCBTdHJpbmcgZGVzYywgZmluYWwgaW50IGRpbXMpIHsKKyAgICAgICAgaW5zdHJ1Y3Rpb25zLmFkZChuZXcgTXVsdGlBTmV3QXJyYXlJbnNuTm9kZShkZXNjLCBkaW1zKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRUcnlDYXRjaEJsb2NrKAorICAgICAgICBmaW5hbCBMYWJlbCBzdGFydCwKKyAgICAgICAgZmluYWwgTGFiZWwgZW5kLAorICAgICAgICBmaW5hbCBMYWJlbCBoYW5kbGVyLAorICAgICAgICBmaW5hbCBTdHJpbmcgdHlwZSkKKyAgICB7CisgICAgICAgIHRyeUNhdGNoQmxvY2tzLmFkZChuZXcgVHJ5Q2F0Y2hCbG9ja05vZGUoZ2V0TGFiZWxOb2RlKHN0YXJ0KSwKKyAgICAgICAgICAgICAgICBnZXRMYWJlbE5vZGUoZW5kKSwKKyAgICAgICAgICAgICAgICBnZXRMYWJlbE5vZGUoaGFuZGxlciksCisgICAgICAgICAgICAgICAgdHlwZSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TG9jYWxWYXJpYWJsZSgKKyAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUsCisgICAgICAgIGZpbmFsIFN0cmluZyBkZXNjLAorICAgICAgICBmaW5hbCBTdHJpbmcgc2lnbmF0dXJlLAorICAgICAgICBmaW5hbCBMYWJlbCBzdGFydCwKKyAgICAgICAgZmluYWwgTGFiZWwgZW5kLAorICAgICAgICBmaW5hbCBpbnQgaW5kZXgpCisgICAgeworICAgICAgICBsb2NhbFZhcmlhYmxlcy5hZGQobmV3IExvY2FsVmFyaWFibGVOb2RlKG5hbWUsCisgICAgICAgICAgICAgICAgZGVzYywKKyAgICAgICAgICAgICAgICBzaWduYXR1cmUsCisgICAgICAgICAgICAgICAgZ2V0TGFiZWxOb2RlKHN0YXJ0KSwKKyAgICAgICAgICAgICAgICBnZXRMYWJlbE5vZGUoZW5kKSwKKyAgICAgICAgICAgICAgICBpbmRleCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TGluZU51bWJlcihmaW5hbCBpbnQgbGluZSwgZmluYWwgTGFiZWwgc3RhcnQpIHsKKyAgICAgICAgaW5zdHJ1Y3Rpb25zLmFkZChuZXcgTGluZU51bWJlck5vZGUobGluZSwgZ2V0TGFiZWxOb2RlKHN0YXJ0KSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TWF4cyhmaW5hbCBpbnQgbWF4U3RhY2ssIGZpbmFsIGludCBtYXhMb2NhbHMpIHsKKyAgICAgICAgdGhpcy5tYXhTdGFjayA9IG1heFN0YWNrOworICAgICAgICB0aGlzLm1heExvY2FscyA9IG1heExvY2FsczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEVuZCgpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBMYWJlbE5vZGUgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gTGFiZWwuIENyZWF0ZXMgYSBuZXcKKyAgICAgKiBMYWJlbE5vZGUgaWYgbmVjZXNzYXJ5LiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB1c2VzCisgICAgICogdGhlIHtAbGluayBMYWJlbCNpbmZvfSBmaWVsZCB0byBzdG9yZSBhc3NvY2lhdGlvbnMgYmV0d2VlbiBsYWJlbHMgYW5kCisgICAgICogbGFiZWwgbm9kZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbCBhIExhYmVsLgorICAgICAqIEByZXR1cm4gdGhlIExhYmVsTm9kZSBjb3JyZXNwb25kaW5nIHRvIGwuCisgICAgICovCisgICAgcHJvdGVjdGVkIExhYmVsTm9kZSBnZXRMYWJlbE5vZGUoZmluYWwgTGFiZWwgbCkgeworICAgICAgICBpZiAoIShsLmluZm8gaW5zdGFuY2VvZiBMYWJlbE5vZGUpKSB7CisgICAgICAgICAgICBsLmluZm8gPSBuZXcgTGFiZWxOb2RlKGwpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoTGFiZWxOb2RlKSBsLmluZm87CisgICAgfQorCisgICAgcHJpdmF0ZSBMYWJlbE5vZGVbXSBnZXRMYWJlbE5vZGVzKGZpbmFsIExhYmVsW10gbCkgeworICAgICAgICBMYWJlbE5vZGVbXSBub2RlcyA9IG5ldyBMYWJlbE5vZGVbbC5sZW5ndGhdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGwubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIG5vZGVzW2ldID0gZ2V0TGFiZWxOb2RlKGxbaV0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBub2RlczsKKyAgICB9CisKKyAgICBwcml2YXRlIE9iamVjdFtdIGdldExhYmVsTm9kZXMoZmluYWwgT2JqZWN0W10gb2JqcykgeworICAgICAgICBPYmplY3RbXSBub2RlcyA9IG5ldyBPYmplY3Rbb2Jqcy5sZW5ndGhdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9ianMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIE9iamVjdCBvID0gb2Jqc1tpXTsKKyAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgTGFiZWwpIHsKKyAgICAgICAgICAgICAgICBvID0gZ2V0TGFiZWxOb2RlKChMYWJlbCkgbyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBub2Rlc1tpXSA9IG87CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5vZGVzOworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIEFjY2VwdCBtZXRob2QKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8qKgorICAgICAqIENoZWNrcyB0aGF0IHRoaXMgbWV0aG9kIG5vZGUgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBnaXZlbiBBU00gQVBJCisgICAgICogdmVyc2lvbi4gVGhpcyBtZXRob2RzIGNoZWNrcyB0aGF0IHRoaXMgbm9kZSwgYW5kIGFsbCBpdHMgbm9kZXMKKyAgICAgKiByZWN1cnNpdmVseSwgZG8gbm90IGNvbnRhaW4gZWxlbWVudHMgdGhhdCB3ZXJlIGludHJvZHVjZWQgaW4gbW9yZSByZWNlbnQKKyAgICAgKiB2ZXJzaW9ucyBvZiB0aGUgQVNNIEFQSSB0aGFuIHRoZSBnaXZlbiB2ZXJzaW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGFwaSBhbiBBU00gQVBJIHZlcnNpb24uIE11c3QgYmUgb25lIG9mIHtAbGluayBPcGNvZGVzI0FTTTR9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNoZWNrKGZpbmFsIGludCBhcGkpIHsKKyAgICAgICAgLy8gbm90aGluZyB0byBkbworICAgIH0KKworICAgIC8qKgorICAgICAqIE1ha2VzIHRoZSBnaXZlbiBjbGFzcyB2aXNpdG9yIHZpc2l0IHRoaXMgbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtIGN2IGEgY2xhc3MgdmlzaXRvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhY2NlcHQoZmluYWwgQ2xhc3NWaXNpdG9yIGN2KSB7CisgICAgICAgIFN0cmluZ1tdIGV4Y2VwdGlvbnMgPSBuZXcgU3RyaW5nW3RoaXMuZXhjZXB0aW9ucy5zaXplKCldOworICAgICAgICB0aGlzLmV4Y2VwdGlvbnMudG9BcnJheShleGNlcHRpb25zKTsKKyAgICAgICAgTWV0aG9kVmlzaXRvciBtdiA9IGN2LnZpc2l0TWV0aG9kKGFjY2VzcywKKyAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgIGRlc2MsCisgICAgICAgICAgICAgICAgc2lnbmF0dXJlLAorICAgICAgICAgICAgICAgIGV4Y2VwdGlvbnMpOworICAgICAgICBpZiAobXYgIT0gbnVsbCkgeworICAgICAgICAgICAgYWNjZXB0KG12KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIE1ha2VzIHRoZSBnaXZlbiBtZXRob2QgdmlzaXRvciB2aXNpdCB0aGlzIG1ldGhvZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtdiBhIG1ldGhvZCB2aXNpdG9yLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFjY2VwdChmaW5hbCBNZXRob2RWaXNpdG9yIG12KSB7CisgICAgICAgIC8vIHZpc2l0cyB0aGUgbWV0aG9kIGF0dHJpYnV0ZXMKKyAgICAgICAgaW50IGksIGosIG47CisgICAgICAgIGlmIChhbm5vdGF0aW9uRGVmYXVsdCAhPSBudWxsKSB7CisgICAgICAgICAgICBBbm5vdGF0aW9uVmlzaXRvciBhdiA9IG12LnZpc2l0QW5ub3RhdGlvbkRlZmF1bHQoKTsKKyAgICAgICAgICAgIEFubm90YXRpb25Ob2RlLmFjY2VwdChhdiwgbnVsbCwgYW5ub3RhdGlvbkRlZmF1bHQpOworICAgICAgICAgICAgaWYgKGF2ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBhdi52aXNpdEVuZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG4gPSB2aXNpYmxlQW5ub3RhdGlvbnMgPT0gbnVsbCA/IDAgOiB2aXNpYmxlQW5ub3RhdGlvbnMuc2l6ZSgpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CisgICAgICAgICAgICBBbm5vdGF0aW9uTm9kZSBhbiA9IHZpc2libGVBbm5vdGF0aW9ucy5nZXQoaSk7CisgICAgICAgICAgICBhbi5hY2NlcHQobXYudmlzaXRBbm5vdGF0aW9uKGFuLmRlc2MsIHRydWUpKTsKKyAgICAgICAgfQorICAgICAgICBuID0gaW52aXNpYmxlQW5ub3RhdGlvbnMgPT0gbnVsbCA/IDAgOiBpbnZpc2libGVBbm5vdGF0aW9ucy5zaXplKCk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKKyAgICAgICAgICAgIEFubm90YXRpb25Ob2RlIGFuID0gaW52aXNpYmxlQW5ub3RhdGlvbnMuZ2V0KGkpOworICAgICAgICAgICAgYW4uYWNjZXB0KG12LnZpc2l0QW5ub3RhdGlvbihhbi5kZXNjLCBmYWxzZSkpOworICAgICAgICB9CisgICAgICAgIG4gPSB2aXNpYmxlUGFyYW1ldGVyQW5ub3RhdGlvbnMgPT0gbnVsbAorICAgICAgICAgICAgICAgID8gMAorICAgICAgICAgICAgICAgIDogdmlzaWJsZVBhcmFtZXRlckFubm90YXRpb25zLmxlbmd0aDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgeworICAgICAgICAgICAgTGlzdDw/PiBsID0gdmlzaWJsZVBhcmFtZXRlckFubm90YXRpb25zW2ldOworICAgICAgICAgICAgaWYgKGwgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGwuc2l6ZSgpOyArK2opIHsKKyAgICAgICAgICAgICAgICBBbm5vdGF0aW9uTm9kZSBhbiA9IChBbm5vdGF0aW9uTm9kZSkgbC5nZXQoaik7CisgICAgICAgICAgICAgICAgYW4uYWNjZXB0KG12LnZpc2l0UGFyYW1ldGVyQW5ub3RhdGlvbihpLCBhbi5kZXNjLCB0cnVlKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbiA9IGludmlzaWJsZVBhcmFtZXRlckFubm90YXRpb25zID09IG51bGwKKyAgICAgICAgICAgICAgICA/IDAKKyAgICAgICAgICAgICAgICA6IGludmlzaWJsZVBhcmFtZXRlckFubm90YXRpb25zLmxlbmd0aDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgeworICAgICAgICAgICAgTGlzdDw/PiBsID0gaW52aXNpYmxlUGFyYW1ldGVyQW5ub3RhdGlvbnNbaV07CisgICAgICAgICAgICBpZiAobCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbC5zaXplKCk7ICsraikgeworICAgICAgICAgICAgICAgIEFubm90YXRpb25Ob2RlIGFuID0gKEFubm90YXRpb25Ob2RlKSBsLmdldChqKTsKKyAgICAgICAgICAgICAgICBhbi5hY2NlcHQobXYudmlzaXRQYXJhbWV0ZXJBbm5vdGF0aW9uKGksIGFuLmRlc2MsIGZhbHNlKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZpc2l0ZWQpIHsKKyAgICAgICAgICAgIGluc3RydWN0aW9ucy5yZXNldExhYmVscygpOworICAgICAgICB9CisgICAgICAgIG4gPSBhdHRycyA9PSBudWxsID8gMCA6IGF0dHJzLnNpemUoKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgeworICAgICAgICAgICAgbXYudmlzaXRBdHRyaWJ1dGUoYXR0cnMuZ2V0KGkpKTsKKyAgICAgICAgfQorICAgICAgICAvLyB2aXNpdHMgdGhlIG1ldGhvZCdzIGNvZGUKKyAgICAgICAgaWYgKGluc3RydWN0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBtdi52aXNpdENvZGUoKTsKKyAgICAgICAgICAgIC8vIHZpc2l0cyB0cnkgY2F0Y2ggYmxvY2tzCisgICAgICAgICAgICBuID0gdHJ5Q2F0Y2hCbG9ja3MgPT0gbnVsbCA/IDAgOiB0cnlDYXRjaEJsb2Nrcy5zaXplKCk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CisgICAgICAgICAgICAgICAgdHJ5Q2F0Y2hCbG9ja3MuZ2V0KGkpLmFjY2VwdChtdik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyB2aXNpdHMgaW5zdHJ1Y3Rpb25zCisgICAgICAgICAgICBpbnN0cnVjdGlvbnMuYWNjZXB0KG12KTsKKyAgICAgICAgICAgIC8vIHZpc2l0cyBsb2NhbCB2YXJpYWJsZXMKKyAgICAgICAgICAgIG4gPSBsb2NhbFZhcmlhYmxlcyA9PSBudWxsID8gMCA6IGxvY2FsVmFyaWFibGVzLnNpemUoKTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKKyAgICAgICAgICAgICAgICBsb2NhbFZhcmlhYmxlcy5nZXQoaSkuYWNjZXB0KG12KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIHZpc2l0cyBtYXhzCisgICAgICAgICAgICBtdi52aXNpdE1heHMobWF4U3RhY2ssIG1heExvY2Fscyk7CisgICAgICAgICAgICB2aXNpdGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBtdi52aXNpdEVuZCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vdHJlZS9NdWx0aUFOZXdBcnJheUluc25Ob2RlLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL3RyZWUvTXVsdGlBTmV3QXJyYXlJbnNuTm9kZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwZTU2MjUKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL3RyZWUvTXVsdGlBTmV3QXJyYXlJbnNuTm9kZS5qYXZhCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBPcmFjbGUgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKKyAqIHF1ZXN0aW9ucy4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGlzIGF2YWlsYWJsZSB1bmRlciBhbmQgZ292ZXJuZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiBIb3dldmVyLCB0aGUgZm9sbG93aW5nIG5vdGljZSBhY2NvbXBhbmllZCB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGlzCisgKiBmaWxlOgorICoKKyAqIEFTTTogYSB2ZXJ5IHNtYWxsIGFuZCBmYXN0IEphdmEgYnl0ZWNvZGUgbWFuaXB1bGF0aW9uIGZyYW1ld29yaworICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMTEgSU5SSUEsIEZyYW5jZSBUZWxlY29tCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2UgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLnRyZWU7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLk1ldGhvZFZpc2l0b3I7CitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLk9wY29kZXM7CisKKy8qKgorICogQSBub2RlIHRoYXQgcmVwcmVzZW50cyBhIE1VTFRJQU5FV0FSUkFZIGluc3RydWN0aW9uLgorICoKKyAqIEBhdXRob3IgRXJpYyBCcnVuZXRvbgorICovCitwdWJsaWMgY2xhc3MgTXVsdGlBTmV3QXJyYXlJbnNuTm9kZSBleHRlbmRzIEFic3RyYWN0SW5zbk5vZGUgeworCisgICAgLyoqCisgICAgICogQW4gYXJyYXkgdHlwZSBkZXNjcmlwdG9yIChzZWUge0BsaW5rIGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5UeXBlfSkuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBkZXNjOworCisgICAgLyoqCisgICAgICogTnVtYmVyIG9mIGRpbWVuc2lvbnMgb2YgdGhlIGFycmF5IHRvIGFsbG9jYXRlLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZGltczsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0BsaW5rIE11bHRpQU5ld0FycmF5SW5zbk5vZGV9LgorICAgICAqCisgICAgICogQHBhcmFtIGRlc2MgYW4gYXJyYXkgdHlwZSBkZXNjcmlwdG9yIChzZWUge0BsaW5rIGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5UeXBlfSkuCisgICAgICogQHBhcmFtIGRpbXMgbnVtYmVyIG9mIGRpbWVuc2lvbnMgb2YgdGhlIGFycmF5IHRvIGFsbG9jYXRlLgorICAgICAqLworICAgIHB1YmxpYyBNdWx0aUFOZXdBcnJheUluc25Ob2RlKGZpbmFsIFN0cmluZyBkZXNjLCBmaW5hbCBpbnQgZGltcykgeworICAgICAgICBzdXBlcihPcGNvZGVzLk1VTFRJQU5FV0FSUkFZKTsKKyAgICAgICAgdGhpcy5kZXNjID0gZGVzYzsKKyAgICAgICAgdGhpcy5kaW1zID0gZGltczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiBNVUxUSUFORVdBUlJBWV9JTlNOOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFjY2VwdChmaW5hbCBNZXRob2RWaXNpdG9yIG12KSB7CisgICAgICAgIG12LnZpc2l0TXVsdGlBTmV3QXJyYXlJbnNuKGRlc2MsIGRpbXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBBYnN0cmFjdEluc25Ob2RlIGNsb25lKGZpbmFsIE1hcDxMYWJlbE5vZGUsIExhYmVsTm9kZT4gbGFiZWxzKSB7CisgICAgICAgIHJldHVybiBuZXcgTXVsdGlBTmV3QXJyYXlJbnNuTm9kZShkZXNjLCBkaW1zKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vdHJlZS9UYWJsZVN3aXRjaEluc25Ob2RlLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL3RyZWUvVGFibGVTd2l0Y2hJbnNuTm9kZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxYjgwYTgKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL3RyZWUvVGFibGVTd2l0Y2hJbnNuTm9kZS5qYXZhCkBAIC0wLDAgKzEsMTQ0IEBACisvKgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBPcmFjbGUgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKKyAqIHF1ZXN0aW9ucy4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGlzIGF2YWlsYWJsZSB1bmRlciBhbmQgZ292ZXJuZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiBIb3dldmVyLCB0aGUgZm9sbG93aW5nIG5vdGljZSBhY2NvbXBhbmllZCB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGlzCisgKiBmaWxlOgorICoKKyAqIEFTTTogYSB2ZXJ5IHNtYWxsIGFuZCBmYXN0IEphdmEgYnl0ZWNvZGUgbWFuaXB1bGF0aW9uIGZyYW1ld29yaworICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMTEgSU5SSUEsIEZyYW5jZSBUZWxlY29tCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2UgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLnRyZWU7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5MYWJlbDsKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uTWV0aG9kVmlzaXRvcjsKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uT3Bjb2RlczsKKworLyoqCisgKiBBIG5vZGUgdGhhdCByZXByZXNlbnRzIGEgVEFCTEVTV0lUQ0ggaW5zdHJ1Y3Rpb24uCisgKgorICogQGF1dGhvciBFcmljIEJydW5ldG9uCisgKi8KK3B1YmxpYyBjbGFzcyBUYWJsZVN3aXRjaEluc25Ob2RlIGV4dGVuZHMgQWJzdHJhY3RJbnNuTm9kZSB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbWluaW11bSBrZXkgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIGludCBtaW47CisKKyAgICAvKioKKyAgICAgKiBUaGUgbWF4aW11bSBrZXkgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIGludCBtYXg7CisKKyAgICAvKioKKyAgICAgKiBCZWdpbm5pbmcgb2YgdGhlIGRlZmF1bHQgaGFuZGxlciBibG9jay4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGFiZWxOb2RlIGRmbHQ7CisKKyAgICAvKioKKyAgICAgKiBCZWdpbm5pbmdzIG9mIHRoZSBoYW5kbGVyIGJsb2Nrcy4gVGhpcyBsaXN0IGlzIGEgbGlzdCBvZgorICAgICAqIHtAbGluayBMYWJlbE5vZGV9IG9iamVjdHMuCisgICAgICovCisgICAgcHVibGljIExpc3Q8TGFiZWxOb2RlPiBsYWJlbHM7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAbGluayBUYWJsZVN3aXRjaEluc25Ob2RlfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtaW4gdGhlIG1pbmltdW0ga2V5IHZhbHVlLgorICAgICAqIEBwYXJhbSBtYXggdGhlIG1heGltdW0ga2V5IHZhbHVlLgorICAgICAqIEBwYXJhbSBkZmx0IGJlZ2lubmluZyBvZiB0aGUgZGVmYXVsdCBoYW5kbGVyIGJsb2NrLgorICAgICAqIEBwYXJhbSBsYWJlbHMgYmVnaW5uaW5ncyBvZiB0aGUgaGFuZGxlciBibG9ja3MuIDx0dD5sYWJlbHNbaV08L3R0PiBpcworICAgICAqICAgICAgICB0aGUgYmVnaW5uaW5nIG9mIHRoZSBoYW5kbGVyIGJsb2NrIGZvciB0aGUgPHR0Pm1pbiArIGk8L3R0PiBrZXkuCisgICAgICovCisgICAgcHVibGljIFRhYmxlU3dpdGNoSW5zbk5vZGUoCisgICAgICAgIGZpbmFsIGludCBtaW4sCisgICAgICAgIGZpbmFsIGludCBtYXgsCisgICAgICAgIGZpbmFsIExhYmVsTm9kZSBkZmx0LAorICAgICAgICBmaW5hbCBMYWJlbE5vZGUuLi4gbGFiZWxzKQorICAgIHsKKyAgICAgICAgc3VwZXIoT3Bjb2Rlcy5UQUJMRVNXSVRDSCk7CisgICAgICAgIHRoaXMubWluID0gbWluOworICAgICAgICB0aGlzLm1heCA9IG1heDsKKyAgICAgICAgdGhpcy5kZmx0ID0gZGZsdDsKKyAgICAgICAgdGhpcy5sYWJlbHMgPSBuZXcgQXJyYXlMaXN0PExhYmVsTm9kZT4oKTsKKyAgICAgICAgaWYgKGxhYmVscyAhPSBudWxsKSB7CisgICAgICAgICAgICB0aGlzLmxhYmVscy5hZGRBbGwoQXJyYXlzLmFzTGlzdChsYWJlbHMpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIFRBQkxFU1dJVENIX0lOU047CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgYWNjZXB0KGZpbmFsIE1ldGhvZFZpc2l0b3IgbXYpIHsKKyAgICAgICAgTGFiZWxbXSBsYWJlbHMgPSBuZXcgTGFiZWxbdGhpcy5sYWJlbHMuc2l6ZSgpXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsYWJlbHMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIGxhYmVsc1tpXSA9IHRoaXMubGFiZWxzLmdldChpKS5nZXRMYWJlbCgpOworICAgICAgICB9CisgICAgICAgIG12LnZpc2l0VGFibGVTd2l0Y2hJbnNuKG1pbiwgbWF4LCBkZmx0LmdldExhYmVsKCksIGxhYmVscyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEFic3RyYWN0SW5zbk5vZGUgY2xvbmUoZmluYWwgTWFwPExhYmVsTm9kZSwgTGFiZWxOb2RlPiBsYWJlbHMpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUYWJsZVN3aXRjaEluc25Ob2RlKG1pbiwKKyAgICAgICAgICAgICAgICBtYXgsCisgICAgICAgICAgICAgICAgY2xvbmUoZGZsdCwgbGFiZWxzKSwKKyAgICAgICAgICAgICAgICBjbG9uZSh0aGlzLmxhYmVscywgbGFiZWxzKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS90cmVlL1RyeUNhdGNoQmxvY2tOb2RlLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL3RyZWUvVHJ5Q2F0Y2hCbG9ja05vZGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDk5NjExCi0tLSAvZGV2L251bGwKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS90cmVlL1RyeUNhdGNoQmxvY2tOb2RlLmphdmEKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IE9yYWNsZSBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQorICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQorICogcXVlc3Rpb25zLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgaXMgYXZhaWxhYmxlIHVuZGVyIGFuZCBnb3Zlcm5lZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIEhvd2V2ZXIsIHRoZSBmb2xsb3dpbmcgbm90aWNlIGFjY29tcGFuaWVkIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoaXMKKyAqIGZpbGU6CisgKgorICogQVNNOiBhIHZlcnkgc21hbGwgYW5kIGZhc3QgSmF2YSBieXRlY29kZSBtYW5pcHVsYXRpb24gZnJhbWV3b3JrCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAxMSBJTlJJQSwgRnJhbmNlIFRlbGVjb20KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20udHJlZTsKKworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5NZXRob2RWaXNpdG9yOworCisvKioKKyAqIEEgbm9kZSB0aGF0IHJlcHJlc2VudHMgYSB0cnkgY2F0Y2ggYmxvY2suCisgKgorICogQGF1dGhvciBFcmljIEJydW5ldG9uCisgKi8KK3B1YmxpYyBjbGFzcyBUcnlDYXRjaEJsb2NrTm9kZSB7CisKKyAgICAvKioKKyAgICAgKiBCZWdpbm5pbmcgb2YgdGhlIGV4Y2VwdGlvbiBoYW5kbGVyJ3Mgc2NvcGUgKGluY2x1c2l2ZSkuCisgICAgICovCisgICAgcHVibGljIExhYmVsTm9kZSBzdGFydDsKKworICAgIC8qKgorICAgICAqIEVuZCBvZiB0aGUgZXhjZXB0aW9uIGhhbmRsZXIncyBzY29wZSAoZXhjbHVzaXZlKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGFiZWxOb2RlIGVuZDsKKworICAgIC8qKgorICAgICAqIEJlZ2lubmluZyBvZiB0aGUgZXhjZXB0aW9uIGhhbmRsZXIncyBjb2RlLgorICAgICAqLworICAgIHB1YmxpYyBMYWJlbE5vZGUgaGFuZGxlcjsKKworICAgIC8qKgorICAgICAqIEludGVybmFsIG5hbWUgb2YgdGhlIHR5cGUgb2YgZXhjZXB0aW9ucyBoYW5kbGVkIGJ5IHRoZSBoYW5kbGVyLiBNYXkgYmUKKyAgICAgKiA8dHQ+bnVsbDwvdHQ+IHRvIGNhdGNoIGFueSBleGNlcHRpb25zIChmb3IgImZpbmFsbHkiIGJsb2NrcykuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0eXBlOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGxpbmsgVHJ5Q2F0Y2hCbG9ja05vZGV9LgorICAgICAqCisgICAgICogQHBhcmFtIHN0YXJ0IGJlZ2lubmluZyBvZiB0aGUgZXhjZXB0aW9uIGhhbmRsZXIncyBzY29wZSAoaW5jbHVzaXZlKS4KKyAgICAgKiBAcGFyYW0gZW5kIGVuZCBvZiB0aGUgZXhjZXB0aW9uIGhhbmRsZXIncyBzY29wZSAoZXhjbHVzaXZlKS4KKyAgICAgKiBAcGFyYW0gaGFuZGxlciBiZWdpbm5pbmcgb2YgdGhlIGV4Y2VwdGlvbiBoYW5kbGVyJ3MgY29kZS4KKyAgICAgKiBAcGFyYW0gdHlwZSBpbnRlcm5hbCBuYW1lIG9mIHRoZSB0eXBlIG9mIGV4Y2VwdGlvbnMgaGFuZGxlZCBieSB0aGUKKyAgICAgKiAgICAgICAgaGFuZGxlciwgb3IgPHR0Pm51bGw8L3R0PiB0byBjYXRjaCBhbnkgZXhjZXB0aW9ucyAoZm9yICJmaW5hbGx5IgorICAgICAqICAgICAgICBibG9ja3MpLgorICAgICAqLworICAgIHB1YmxpYyBUcnlDYXRjaEJsb2NrTm9kZSgKKyAgICAgICAgZmluYWwgTGFiZWxOb2RlIHN0YXJ0LAorICAgICAgICBmaW5hbCBMYWJlbE5vZGUgZW5kLAorICAgICAgICBmaW5hbCBMYWJlbE5vZGUgaGFuZGxlciwKKyAgICAgICAgZmluYWwgU3RyaW5nIHR5cGUpCisgICAgeworICAgICAgICB0aGlzLnN0YXJ0ID0gc3RhcnQ7CisgICAgICAgIHRoaXMuZW5kID0gZW5kOworICAgICAgICB0aGlzLmhhbmRsZXIgPSBoYW5kbGVyOworICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1ha2VzIHRoZSBnaXZlbiB2aXNpdG9yIHZpc2l0IHRoaXMgdHJ5IGNhdGNoIGJsb2NrLgorICAgICAqCisgICAgICogQHBhcmFtIG12IGEgbWV0aG9kIHZpc2l0b3IuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWNjZXB0KGZpbmFsIE1ldGhvZFZpc2l0b3IgbXYpIHsKKyAgICAgICAgbXYudmlzaXRUcnlDYXRjaEJsb2NrKHN0YXJ0LmdldExhYmVsKCksIGVuZC5nZXRMYWJlbCgpLCBoYW5kbGVyID09IG51bGwKKyAgICAgICAgICAgICAgICA/IG51bGwKKyAgICAgICAgICAgICAgICA6IGhhbmRsZXIuZ2V0TGFiZWwoKSwgdHlwZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS90cmVlL1R5cGVJbnNuTm9kZS5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS90cmVlL1R5cGVJbnNuTm9kZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlYjEzYjQKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL3RyZWUvVHlwZUluc25Ob2RlLmphdmEKQEAgLTAsMCArMSwxMTYgQEAKKy8qCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IE9yYWNsZSBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQorICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQorICogcXVlc3Rpb25zLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgaXMgYXZhaWxhYmxlIHVuZGVyIGFuZCBnb3Zlcm5lZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIEhvd2V2ZXIsIHRoZSBmb2xsb3dpbmcgbm90aWNlIGFjY29tcGFuaWVkIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoaXMKKyAqIGZpbGU6CisgKgorICogQVNNOiBhIHZlcnkgc21hbGwgYW5kIGZhc3QgSmF2YSBieXRlY29kZSBtYW5pcHVsYXRpb24gZnJhbWV3b3JrCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAxMSBJTlJJQSwgRnJhbmNlIFRlbGVjb20KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20udHJlZTsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uTWV0aG9kVmlzaXRvcjsKKworLyoqCisgKiBBIG5vZGUgdGhhdCByZXByZXNlbnRzIGEgdHlwZSBpbnN0cnVjdGlvbi4gQSB0eXBlIGluc3RydWN0aW9uIGlzIGFuCisgKiBpbnN0cnVjdGlvbiB0aGF0IHRha2VzIGEgdHlwZSBkZXNjcmlwdG9yIGFzIHBhcmFtZXRlci4KKyAqCisgKiBAYXV0aG9yIEVyaWMgQnJ1bmV0b24KKyAqLworcHVibGljIGNsYXNzIFR5cGVJbnNuTm9kZSBleHRlbmRzIEFic3RyYWN0SW5zbk5vZGUgeworCisgICAgLyoqCisgICAgICogVGhlIG9wZXJhbmQgb2YgdGhpcyBpbnN0cnVjdGlvbi4gVGhpcyBvcGVyYW5kIGlzIGFuIGludGVybmFsIG5hbWUgKHNlZQorICAgICAqIHtAbGluayBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uVHlwZX0pLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZGVzYzsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0BsaW5rIFR5cGVJbnNuTm9kZX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3Bjb2RlIHRoZSBvcGNvZGUgb2YgdGhlIHR5cGUgaW5zdHJ1Y3Rpb24gdG8gYmUgY29uc3RydWN0ZWQuIFRoaXMKKyAgICAgKiAgICAgICAgb3Bjb2RlIG11c3QgYmUgTkVXLCBBTkVXQVJSQVksIENIRUNLQ0FTVCBvciBJTlNUQU5DRU9GLgorICAgICAqIEBwYXJhbSBkZXNjIHRoZSBvcGVyYW5kIG9mIHRoZSBpbnN0cnVjdGlvbiB0byBiZSBjb25zdHJ1Y3RlZC4gVGhpcworICAgICAqICAgICAgICBvcGVyYW5kIGlzIGFuIGludGVybmFsIG5hbWUgKHNlZSB7QGxpbmsgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLlR5cGV9KS4KKyAgICAgKi8KKyAgICBwdWJsaWMgVHlwZUluc25Ob2RlKGZpbmFsIGludCBvcGNvZGUsIGZpbmFsIFN0cmluZyBkZXNjKSB7CisgICAgICAgIHN1cGVyKG9wY29kZSk7CisgICAgICAgIHRoaXMuZGVzYyA9IGRlc2M7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgb3Bjb2RlIG9mIHRoaXMgaW5zdHJ1Y3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3Bjb2RlIHRoZSBuZXcgaW5zdHJ1Y3Rpb24gb3Bjb2RlLiBUaGlzIG9wY29kZSBtdXN0IGJlIE5FVywKKyAgICAgKiAgICAgICAgQU5FV0FSUkFZLCBDSEVDS0NBU1Qgb3IgSU5TVEFOQ0VPRi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPcGNvZGUoZmluYWwgaW50IG9wY29kZSkgeworICAgICAgICB0aGlzLm9wY29kZSA9IG9wY29kZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiBUWVBFX0lOU047CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgYWNjZXB0KGZpbmFsIE1ldGhvZFZpc2l0b3IgbXYpIHsKKyAgICAgICAgbXYudmlzaXRUeXBlSW5zbihvcGNvZGUsIGRlc2MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBBYnN0cmFjdEluc25Ob2RlIGNsb25lKGZpbmFsIE1hcDxMYWJlbE5vZGUsIExhYmVsTm9kZT4gbGFiZWxzKSB7CisgICAgICAgIHJldHVybiBuZXcgVHlwZUluc25Ob2RlKG9wY29kZSwgZGVzYyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS90cmVlL1Zhckluc25Ob2RlLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL3RyZWUvVmFySW5zbk5vZGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWEyNDg4Ci0tLSAvZGV2L251bGwKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS90cmVlL1Zhckluc25Ob2RlLmphdmEKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IE9yYWNsZSBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQorICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQorICogcXVlc3Rpb25zLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgaXMgYXZhaWxhYmxlIHVuZGVyIGFuZCBnb3Zlcm5lZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIEhvd2V2ZXIsIHRoZSBmb2xsb3dpbmcgbm90aWNlIGFjY29tcGFuaWVkIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoaXMKKyAqIGZpbGU6CisgKgorICogQVNNOiBhIHZlcnkgc21hbGwgYW5kIGZhc3QgSmF2YSBieXRlY29kZSBtYW5pcHVsYXRpb24gZnJhbWV3b3JrCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAxMSBJTlJJQSwgRnJhbmNlIFRlbGVjb20KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20udHJlZTsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uTWV0aG9kVmlzaXRvcjsKKworLyoqCisgKiBBIG5vZGUgdGhhdCByZXByZXNlbnRzIGEgbG9jYWwgdmFyaWFibGUgaW5zdHJ1Y3Rpb24uIEEgbG9jYWwgdmFyaWFibGUKKyAqIGluc3RydWN0aW9uIGlzIGFuIGluc3RydWN0aW9uIHRoYXQgbG9hZHMgb3Igc3RvcmVzIHRoZSB2YWx1ZSBvZiBhIGxvY2FsCisgKiB2YXJpYWJsZS4KKyAqCisgKiBAYXV0aG9yIEVyaWMgQnJ1bmV0b24KKyAqLworcHVibGljIGNsYXNzIFZhckluc25Ob2RlIGV4dGVuZHMgQWJzdHJhY3RJbnNuTm9kZSB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgb3BlcmFuZCBvZiB0aGlzIGluc3RydWN0aW9uLiBUaGlzIG9wZXJhbmQgaXMgdGhlIGluZGV4IG9mIGEgbG9jYWwKKyAgICAgKiB2YXJpYWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHZhcjsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0BsaW5rIFZhckluc25Ob2RlfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvcGNvZGUgdGhlIG9wY29kZSBvZiB0aGUgbG9jYWwgdmFyaWFibGUgaW5zdHJ1Y3Rpb24gdG8gYmUKKyAgICAgKiAgICAgICAgY29uc3RydWN0ZWQuIFRoaXMgb3Bjb2RlIG11c3QgYmUgSUxPQUQsIExMT0FELCBGTE9BRCwgRExPQUQsCisgICAgICogICAgICAgIEFMT0FELCBJU1RPUkUsIExTVE9SRSwgRlNUT1JFLCBEU1RPUkUsIEFTVE9SRSBvciBSRVQuCisgICAgICogQHBhcmFtIHZhciB0aGUgb3BlcmFuZCBvZiB0aGUgaW5zdHJ1Y3Rpb24gdG8gYmUgY29uc3RydWN0ZWQuIFRoaXMgb3BlcmFuZAorICAgICAqICAgICAgICBpcyB0aGUgaW5kZXggb2YgYSBsb2NhbCB2YXJpYWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgVmFySW5zbk5vZGUoZmluYWwgaW50IG9wY29kZSwgZmluYWwgaW50IHZhcikgeworICAgICAgICBzdXBlcihvcGNvZGUpOworICAgICAgICB0aGlzLnZhciA9IHZhcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBvcGNvZGUgb2YgdGhpcyBpbnN0cnVjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvcGNvZGUgdGhlIG5ldyBpbnN0cnVjdGlvbiBvcGNvZGUuIFRoaXMgb3Bjb2RlIG11c3QgYmUgSUxPQUQsCisgICAgICogICAgICAgIExMT0FELCBGTE9BRCwgRExPQUQsIEFMT0FELCBJU1RPUkUsIExTVE9SRSwgRlNUT1JFLCBEU1RPUkUsIEFTVE9SRQorICAgICAqICAgICAgICBvciBSRVQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0T3Bjb2RlKGZpbmFsIGludCBvcGNvZGUpIHsKKyAgICAgICAgdGhpcy5vcGNvZGUgPSBvcGNvZGU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gVkFSX0lOU047CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgYWNjZXB0KGZpbmFsIE1ldGhvZFZpc2l0b3IgbXYpIHsKKyAgICAgICAgbXYudmlzaXRWYXJJbnNuKG9wY29kZSwgdmFyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQWJzdHJhY3RJbnNuTm9kZSBjbG9uZShmaW5hbCBNYXA8TGFiZWxOb2RlLCBMYWJlbE5vZGU+IGxhYmVscykgeworICAgICAgICByZXR1cm4gbmV3IFZhckluc25Ob2RlKG9wY29kZSwgdmFyKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL3RyZWUvYW5hbHlzaXMvQW5hbHl6ZXIuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vdHJlZS9hbmFseXNpcy9BbmFseXplci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmOTVjNGQKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL3RyZWUvYW5hbHlzaXMvQW5hbHl6ZXIuamF2YQpAQCAtMCwwICsxLDU3OSBAQAorLyoKKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgT3JhY2xlIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCisgKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CisgKiBxdWVzdGlvbnMuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBpcyBhdmFpbGFibGUgdW5kZXIgYW5kIGdvdmVybmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogSG93ZXZlciwgdGhlIGZvbGxvd2luZyBub3RpY2UgYWNjb21wYW5pZWQgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhpcworICogZmlsZToKKyAqCisgKiBBU006IGEgdmVyeSBzbWFsbCBhbmQgZmFzdCBKYXZhIGJ5dGVjb2RlIG1hbmlwdWxhdGlvbiBmcmFtZXdvcmsKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDExIElOUklBLCBGcmFuY2UgVGVsZWNvbQorICogQ29weXJpZ2h0IChjKSAyMDExIEdvb2dsZQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS50cmVlLmFuYWx5c2lzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLk9wY29kZXM7CitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLlR5cGU7CitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLnRyZWUuQWJzdHJhY3RJbnNuTm9kZTsKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20udHJlZS5JaW5jSW5zbk5vZGU7CitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLnRyZWUuSW5zbkxpc3Q7CitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLnRyZWUuSnVtcEluc25Ob2RlOworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS50cmVlLkxhYmVsTm9kZTsKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20udHJlZS5Mb29rdXBTd2l0Y2hJbnNuTm9kZTsKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20udHJlZS5NZXRob2ROb2RlOworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS50cmVlLlRhYmxlU3dpdGNoSW5zbk5vZGU7CitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLnRyZWUuVHJ5Q2F0Y2hCbG9ja05vZGU7CitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLnRyZWUuVmFySW5zbk5vZGU7CisKKy8qKgorICogQSBzZW1hbnRpYyBieXRlY29kZSBhbmFseXplci4gPGk+VGhpcyBjbGFzcyBkb2VzIG5vdCBmdWxseSBjaGVjayB0aGF0IEpTUiBhbmQKKyAqIFJFVCBpbnN0cnVjdGlvbnMgYXJlIHZhbGlkLjwvaT4KKyAqCisgKiBAcGFyYW0gPFY+IHR5cGUgb2YgdGhlIFZhbHVlIHVzZWQgZm9yIHRoZSBhbmFseXNpcy4KKyAqCisgKiAgQGF1dGhvciBFcmljIEJydW5ldG9uCisgKi8KK3B1YmxpYyBjbGFzcyBBbmFseXplcjxWIGV4dGVuZHMgVmFsdWU+IGltcGxlbWVudHMgT3Bjb2RlcyB7CisKKyAgICBwcml2YXRlIGZpbmFsIEludGVycHJldGVyPFY+IGludGVycHJldGVyOworCisgICAgcHJpdmF0ZSBpbnQgbjsKKworICAgIHByaXZhdGUgSW5zbkxpc3QgaW5zbnM7CisKKyAgICBwcml2YXRlIExpc3Q8VHJ5Q2F0Y2hCbG9ja05vZGU+W10gaGFuZGxlcnM7CisKKyAgICBwcml2YXRlIEZyYW1lPFY+W10gZnJhbWVzOworCisgICAgcHJpdmF0ZSBTdWJyb3V0aW5lW10gc3Vicm91dGluZXM7CisKKyAgICBwcml2YXRlIGJvb2xlYW5bXSBxdWV1ZWQ7CisKKyAgICBwcml2YXRlIGludFtdIHF1ZXVlOworCisgICAgcHJpdmF0ZSBpbnQgdG9wOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGxpbmsgQW5hbHl6ZXJ9LgorICAgICAqCisgICAgICogQHBhcmFtIGludGVycHJldGVyIHRoZSBpbnRlcnByZXRlciB0byBiZSB1c2VkIHRvIHN5bWJvbGljYWxseSBpbnRlcnByZXQKKyAgICAgKiAgICAgICAgdGhlIGJ5dGVjb2RlIGluc3RydWN0aW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQW5hbHl6ZXIoZmluYWwgSW50ZXJwcmV0ZXI8Vj4gaW50ZXJwcmV0ZXIpIHsKKyAgICAgICAgdGhpcy5pbnRlcnByZXRlciA9IGludGVycHJldGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFuYWx5emVzIHRoZSBnaXZlbiBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3duZXIgdGhlIGludGVybmFsIG5hbWUgb2YgdGhlIGNsYXNzIHRvIHdoaWNoIHRoZSBtZXRob2QgYmVsb25ncy4KKyAgICAgKiBAcGFyYW0gbSB0aGUgbWV0aG9kIHRvIGJlIGFuYWx5emVkLgorICAgICAqIEByZXR1cm4gdGhlIHN5bWJvbGljIHN0YXRlIG9mIHRoZSBleGVjdXRpb24gc3RhY2sgZnJhbWUgYXQgZWFjaCBieXRlY29kZQorICAgICAqICAgICAgICAgaW5zdHJ1Y3Rpb24gb2YgdGhlIG1ldGhvZC4gVGhlIHNpemUgb2YgdGhlIHJldHVybmVkIGFycmF5IGlzCisgICAgICogICAgICAgICBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIGluc3RydWN0aW9ucyAoYW5kIGxhYmVscykgb2YgdGhlIG1ldGhvZC4gQQorICAgICAqICAgICAgICAgZ2l2ZW4gZnJhbWUgaXMgPHR0Pm51bGw8L3R0PiBpZiBhbmQgb25seSBpZiB0aGUgY29ycmVzcG9uZGluZworICAgICAqICAgICAgICAgaW5zdHJ1Y3Rpb24gY2Fubm90IGJlIHJlYWNoZWQgKGRlYWQgY29kZSkuCisgICAgICogQHRocm93cyBBbmFseXplckV4Y2VwdGlvbiBpZiBhIHByb2JsZW0gb2NjdXJzIGR1cmluZyB0aGUgYW5hbHlzaXMuCisgICAgICovCisgICAgcHVibGljIEZyYW1lPFY+W10gYW5hbHl6ZShmaW5hbCBTdHJpbmcgb3duZXIsIGZpbmFsIE1ldGhvZE5vZGUgbSkKKyAgICAgICAgICAgIHRocm93cyBBbmFseXplckV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaWYgKChtLmFjY2VzcyAmIChBQ0NfQUJTVFJBQ1QgfCBBQ0NfTkFUSVZFKSkgIT0gMCkgeworICAgICAgICAgICAgZnJhbWVzID0gKEZyYW1lPFY+W10pbmV3IEZyYW1lPD8+WzBdOworICAgICAgICAgICAgcmV0dXJuIGZyYW1lczsKKyAgICAgICAgfQorICAgICAgICBuID0gbS5pbnN0cnVjdGlvbnMuc2l6ZSgpOworICAgICAgICBpbnNucyA9IG0uaW5zdHJ1Y3Rpb25zOworICAgICAgICBoYW5kbGVycyA9IChMaXN0PFRyeUNhdGNoQmxvY2tOb2RlPltdKW5ldyBMaXN0PD8+W25dOworICAgICAgICBmcmFtZXMgPSAoRnJhbWU8Vj5bXSluZXcgRnJhbWU8Pz5bbl07CisgICAgICAgIHN1YnJvdXRpbmVzID0gbmV3IFN1YnJvdXRpbmVbbl07CisgICAgICAgIHF1ZXVlZCA9IG5ldyBib29sZWFuW25dOworICAgICAgICBxdWV1ZSA9IG5ldyBpbnRbbl07CisgICAgICAgIHRvcCA9IDA7CisKKyAgICAgICAgLy8gY29tcHV0ZXMgZXhjZXB0aW9uIGhhbmRsZXJzIGZvciBlYWNoIGluc3RydWN0aW9uCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbS50cnlDYXRjaEJsb2Nrcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgVHJ5Q2F0Y2hCbG9ja05vZGUgdGNiID0gbS50cnlDYXRjaEJsb2Nrcy5nZXQoaSk7CisgICAgICAgICAgICBpbnQgYmVnaW4gPSBpbnNucy5pbmRleE9mKHRjYi5zdGFydCk7CisgICAgICAgICAgICBpbnQgZW5kID0gaW5zbnMuaW5kZXhPZih0Y2IuZW5kKTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSBiZWdpbjsgaiA8IGVuZDsgKytqKSB7CisgICAgICAgICAgICAgICAgTGlzdDxUcnlDYXRjaEJsb2NrTm9kZT4gaW5zbkhhbmRsZXJzID0gaGFuZGxlcnNbal07CisgICAgICAgICAgICAgICAgaWYgKGluc25IYW5kbGVycyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGluc25IYW5kbGVycyA9IG5ldyBBcnJheUxpc3Q8VHJ5Q2F0Y2hCbG9ja05vZGU+KCk7CisgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJzW2pdID0gaW5zbkhhbmRsZXJzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnNuSGFuZGxlcnMuYWRkKHRjYik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBjb21wdXRlcyB0aGUgc3Vicm91dGluZSBmb3IgZWFjaCBpbnN0cnVjdGlvbjoKKyAgICAgICAgU3Vicm91dGluZSBtYWluID0gbmV3IFN1YnJvdXRpbmUobnVsbCwgbS5tYXhMb2NhbHMsIG51bGwpOworICAgICAgICBMaXN0PEFic3RyYWN0SW5zbk5vZGU+IHN1YnJvdXRpbmVDYWxscyA9IG5ldyBBcnJheUxpc3Q8QWJzdHJhY3RJbnNuTm9kZT4oKTsKKyAgICAgICAgTWFwPExhYmVsTm9kZSwgU3Vicm91dGluZT4gc3Vicm91dGluZUhlYWRzID0gbmV3IEhhc2hNYXA8TGFiZWxOb2RlLCBTdWJyb3V0aW5lPigpOworICAgICAgICBmaW5kU3Vicm91dGluZSgwLCBtYWluLCBzdWJyb3V0aW5lQ2FsbHMpOworICAgICAgICB3aGlsZSAoIXN1YnJvdXRpbmVDYWxscy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIEp1bXBJbnNuTm9kZSBqc3IgPSAoSnVtcEluc25Ob2RlKSBzdWJyb3V0aW5lQ2FsbHMucmVtb3ZlKDApOworICAgICAgICAgICAgU3Vicm91dGluZSBzdWIgPSBzdWJyb3V0aW5lSGVhZHMuZ2V0KGpzci5sYWJlbCk7CisgICAgICAgICAgICBpZiAoc3ViID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzdWIgPSBuZXcgU3Vicm91dGluZShqc3IubGFiZWwsIG0ubWF4TG9jYWxzLCBqc3IpOworICAgICAgICAgICAgICAgIHN1YnJvdXRpbmVIZWFkcy5wdXQoanNyLmxhYmVsLCBzdWIpOworICAgICAgICAgICAgICAgIGZpbmRTdWJyb3V0aW5lKGluc25zLmluZGV4T2YoanNyLmxhYmVsKSwgc3ViLCBzdWJyb3V0aW5lQ2FsbHMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdWIuY2FsbGVycy5hZGQoanNyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkgeworICAgICAgICAgICAgaWYgKHN1YnJvdXRpbmVzW2ldICE9IG51bGwgJiYgc3Vicm91dGluZXNbaV0uc3RhcnQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHN1YnJvdXRpbmVzW2ldID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGluaXRpYWxpemVzIHRoZSBkYXRhIHN0cnVjdHVyZXMgZm9yIHRoZSBjb250cm9sIGZsb3cgYW5hbHlzaXMKKyAgICAgICAgRnJhbWU8Vj4gY3VycmVudCA9IG5ld0ZyYW1lKG0ubWF4TG9jYWxzLCBtLm1heFN0YWNrKTsKKyAgICAgICAgRnJhbWU8Vj4gaGFuZGxlciA9IG5ld0ZyYW1lKG0ubWF4TG9jYWxzLCBtLm1heFN0YWNrKTsKKyAgICAgICAgY3VycmVudC5zZXRSZXR1cm4oaW50ZXJwcmV0ZXIubmV3VmFsdWUoVHlwZS5nZXRSZXR1cm5UeXBlKG0uZGVzYykpKTsKKyAgICAgICAgVHlwZVtdIGFyZ3MgPSBUeXBlLmdldEFyZ3VtZW50VHlwZXMobS5kZXNjKTsKKyAgICAgICAgaW50IGxvY2FsID0gMDsKKyAgICAgICAgaWYgKChtLmFjY2VzcyAmIEFDQ19TVEFUSUMpID09IDApIHsKKyAgICAgICAgICAgIFR5cGUgY3R5cGUgPSBUeXBlLmdldE9iamVjdFR5cGUob3duZXIpOworICAgICAgICAgICAgY3VycmVudC5zZXRMb2NhbChsb2NhbCsrLCBpbnRlcnByZXRlci5uZXdWYWx1ZShjdHlwZSkpOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgY3VycmVudC5zZXRMb2NhbChsb2NhbCsrLCBpbnRlcnByZXRlci5uZXdWYWx1ZShhcmdzW2ldKSk7CisgICAgICAgICAgICBpZiAoYXJnc1tpXS5nZXRTaXplKCkgPT0gMikgeworICAgICAgICAgICAgICAgIGN1cnJlbnQuc2V0TG9jYWwobG9jYWwrKywgaW50ZXJwcmV0ZXIubmV3VmFsdWUobnVsbCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHdoaWxlIChsb2NhbCA8IG0ubWF4TG9jYWxzKSB7CisgICAgICAgICAgICBjdXJyZW50LnNldExvY2FsKGxvY2FsKyssIGludGVycHJldGVyLm5ld1ZhbHVlKG51bGwpKTsKKyAgICAgICAgfQorICAgICAgICBtZXJnZSgwLCBjdXJyZW50LCBudWxsKTsKKworICAgICAgICBpbml0KG93bmVyLCBtKTsKKworICAgICAgICAvLyBjb250cm9sIGZsb3cgYW5hbHlzaXMKKyAgICAgICAgd2hpbGUgKHRvcCA+IDApIHsKKyAgICAgICAgICAgIGludCBpbnNuID0gcXVldWVbLS10b3BdOworICAgICAgICAgICAgRnJhbWU8Vj4gZiA9IGZyYW1lc1tpbnNuXTsKKyAgICAgICAgICAgIFN1YnJvdXRpbmUgc3Vicm91dGluZSA9IHN1YnJvdXRpbmVzW2luc25dOworICAgICAgICAgICAgcXVldWVkW2luc25dID0gZmFsc2U7CisKKyAgICAgICAgICAgIEFic3RyYWN0SW5zbk5vZGUgaW5zbk5vZGUgPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpbnNuTm9kZSA9IG0uaW5zdHJ1Y3Rpb25zLmdldChpbnNuKTsKKyAgICAgICAgICAgICAgICBpbnQgaW5zbk9wY29kZSA9IGluc25Ob2RlLmdldE9wY29kZSgpOworICAgICAgICAgICAgICAgIGludCBpbnNuVHlwZSA9IGluc25Ob2RlLmdldFR5cGUoKTsKKworICAgICAgICAgICAgICAgIGlmIChpbnNuVHlwZSA9PSBBYnN0cmFjdEluc25Ob2RlLkxBQkVMCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBpbnNuVHlwZSA9PSBBYnN0cmFjdEluc25Ob2RlLkxJTkUKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IGluc25UeXBlID09IEFic3RyYWN0SW5zbk5vZGUuRlJBTUUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtZXJnZShpbnNuICsgMSwgZiwgc3Vicm91dGluZSk7CisgICAgICAgICAgICAgICAgICAgIG5ld0NvbnRyb2xGbG93RWRnZShpbnNuLCBpbnNuICsgMSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudC5pbml0KGYpLmV4ZWN1dGUoaW5zbk5vZGUsIGludGVycHJldGVyKTsKKyAgICAgICAgICAgICAgICAgICAgc3Vicm91dGluZSA9IHN1YnJvdXRpbmUgPT0gbnVsbCA/IG51bGwgOiBzdWJyb3V0aW5lLmNvcHkoKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoaW5zbk5vZGUgaW5zdGFuY2VvZiBKdW1wSW5zbk5vZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEp1bXBJbnNuTm9kZSBqID0gKEp1bXBJbnNuTm9kZSkgaW5zbk5vZGU7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zbk9wY29kZSAhPSBHT1RPICYmIGluc25PcGNvZGUgIT0gSlNSKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVyZ2UoaW5zbiArIDEsIGN1cnJlbnQsIHN1YnJvdXRpbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbnRyb2xGbG93RWRnZShpbnNuLCBpbnNuICsgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQganVtcCA9IGluc25zLmluZGV4T2Yoai5sYWJlbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zbk9wY29kZSA9PSBKU1IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXJnZShqdW1wLCBjdXJyZW50LCBuZXcgU3Vicm91dGluZShqLmxhYmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbS5tYXhMb2NhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lcmdlKGp1bXAsIGN1cnJlbnQsIHN1YnJvdXRpbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29udHJvbEZsb3dFZGdlKGluc24sIGp1bXApOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGluc25Ob2RlIGluc3RhbmNlb2YgTG9va3VwU3dpdGNoSW5zbk5vZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvb2t1cFN3aXRjaEluc25Ob2RlIGxzaSA9IChMb29rdXBTd2l0Y2hJbnNuTm9kZSkgaW5zbk5vZGU7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQganVtcCA9IGluc25zLmluZGV4T2YobHNpLmRmbHQpOworICAgICAgICAgICAgICAgICAgICAgICAgbWVyZ2UoanVtcCwgY3VycmVudCwgc3Vicm91dGluZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdDb250cm9sRmxvd0VkZ2UoaW5zbiwganVtcCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGxzaS5sYWJlbHMuc2l6ZSgpOyArK2opIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYWJlbE5vZGUgbGFiZWwgPSBsc2kubGFiZWxzLmdldChqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqdW1wID0gaW5zbnMuaW5kZXhPZihsYWJlbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVyZ2UoanVtcCwgY3VycmVudCwgc3Vicm91dGluZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29udHJvbEZsb3dFZGdlKGluc24sIGp1bXApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGluc25Ob2RlIGluc3RhbmNlb2YgVGFibGVTd2l0Y2hJbnNuTm9kZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgVGFibGVTd2l0Y2hJbnNuTm9kZSB0c2kgPSAoVGFibGVTd2l0Y2hJbnNuTm9kZSkgaW5zbk5vZGU7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQganVtcCA9IGluc25zLmluZGV4T2YodHNpLmRmbHQpOworICAgICAgICAgICAgICAgICAgICAgICAgbWVyZ2UoanVtcCwgY3VycmVudCwgc3Vicm91dGluZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdDb250cm9sRmxvd0VkZ2UoaW5zbiwganVtcCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHRzaS5sYWJlbHMuc2l6ZSgpOyArK2opIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYWJlbE5vZGUgbGFiZWwgPSB0c2kubGFiZWxzLmdldChqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqdW1wID0gaW5zbnMuaW5kZXhPZihsYWJlbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVyZ2UoanVtcCwgY3VycmVudCwgc3Vicm91dGluZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29udHJvbEZsb3dFZGdlKGluc24sIGp1bXApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGluc25PcGNvZGUgPT0gUkVUKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3Vicm91dGluZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFuYWx5emVyRXhjZXB0aW9uKGluc25Ob2RlLCAiUkVUIGluc3RydWN0aW9uIG91dHNpZGUgb2YgYSBzdWIgcm91dGluZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdWJyb3V0aW5lLmNhbGxlcnMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBKdW1wSW5zbk5vZGUgY2FsbGVyID0gc3Vicm91dGluZS5jYWxsZXJzLmdldChpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2FsbCA9IGluc25zLmluZGV4T2YoY2FsbGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnJhbWVzW2NhbGxdICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVyZ2UoY2FsbCArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzW2NhbGxdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vicm91dGluZXNbY2FsbF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vicm91dGluZS5hY2Nlc3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdDb250cm9sRmxvd0VkZ2UoaW5zbiwgY2FsbCArIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbnNuT3Bjb2RlICE9IEFUSFJPVworICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChpbnNuT3Bjb2RlIDwgSVJFVFVSTiB8fCBpbnNuT3Bjb2RlID4gUkVUVVJOKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1YnJvdXRpbmUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnNuTm9kZSBpbnN0YW5jZW9mIFZhckluc25Ob2RlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB2YXIgPSAoKFZhckluc25Ob2RlKSBpbnNuTm9kZSkudmFyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJyb3V0aW5lLmFjY2Vzc1t2YXJdID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluc25PcGNvZGUgPT0gTExPQUQgfHwgaW5zbk9wY29kZSA9PSBETE9BRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGluc25PcGNvZGUgPT0gTFNUT1JFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgaW5zbk9wY29kZSA9PSBEU1RPUkUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnJvdXRpbmUuYWNjZXNzW3ZhciArIDFdID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5zbk5vZGUgaW5zdGFuY2VvZiBJaW5jSW5zbk5vZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZhciA9ICgoSWluY0luc25Ob2RlKSBpbnNuTm9kZSkudmFyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJyb3V0aW5lLmFjY2Vzc1t2YXJdID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBtZXJnZShpbnNuICsgMSwgY3VycmVudCwgc3Vicm91dGluZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdDb250cm9sRmxvd0VkZ2UoaW5zbiwgaW5zbiArIDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgTGlzdDxUcnlDYXRjaEJsb2NrTm9kZT4gaW5zbkhhbmRsZXJzID0gaGFuZGxlcnNbaW5zbl07CisgICAgICAgICAgICAgICAgaWYgKGluc25IYW5kbGVycyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5zbkhhbmRsZXJzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBUcnlDYXRjaEJsb2NrTm9kZSB0Y2IgPSBpbnNuSGFuZGxlcnMuZ2V0KGkpOworICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSB0eXBlOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRjYi50eXBlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gVHlwZS5nZXRPYmplY3RUeXBlKCJqYXZhL2xhbmcvVGhyb3dhYmxlIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBUeXBlLmdldE9iamVjdFR5cGUodGNiLnR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGp1bXAgPSBpbnNucy5pbmRleE9mKHRjYi5oYW5kbGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdDb250cm9sRmxvd0V4Y2VwdGlvbkVkZ2UoaW5zbiwgdGNiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIuaW5pdChmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLmNsZWFyU3RhY2soKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLnB1c2goaW50ZXJwcmV0ZXIubmV3VmFsdWUodHlwZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lcmdlKGp1bXAsIGhhbmRsZXIsIHN1YnJvdXRpbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoQW5hbHl6ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBbmFseXplckV4Y2VwdGlvbihlLm5vZGUsICJFcnJvciBhdCBpbnN0cnVjdGlvbiAiICsgaW5zbgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQW5hbHl6ZXJFeGNlcHRpb24oaW5zbk5vZGUsICJFcnJvciBhdCBpbnN0cnVjdGlvbiAiICsgaW5zbgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZyYW1lczsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZmluZFN1YnJvdXRpbmUoaW50IGluc24sIGZpbmFsIFN1YnJvdXRpbmUgc3ViLCBmaW5hbCBMaXN0PEFic3RyYWN0SW5zbk5vZGU+IGNhbGxzKQorICAgICAgICAgICAgdGhyb3dzIEFuYWx5emVyRXhjZXB0aW9uCisgICAgeworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgaWYgKGluc24gPCAwIHx8IGluc24gPj0gbikgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBbmFseXplckV4Y2VwdGlvbihudWxsLCAiRXhlY3V0aW9uIGNhbiBmYWxsIG9mZiBlbmQgb2YgdGhlIGNvZGUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdWJyb3V0aW5lc1tpbnNuXSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3Vicm91dGluZXNbaW5zbl0gPSBzdWIuY29weSgpOworICAgICAgICAgICAgQWJzdHJhY3RJbnNuTm9kZSBub2RlID0gaW5zbnMuZ2V0KGluc24pOworCisgICAgICAgICAgICAvLyBjYWxscyBmaW5kU3Vicm91dGluZSByZWN1cnNpdmVseSBvbiBub3JtYWwgc3VjY2Vzc29ycworICAgICAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBKdW1wSW5zbk5vZGUpIHsKKyAgICAgICAgICAgICAgICBpZiAobm9kZS5nZXRPcGNvZGUoKSA9PSBKU1IpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZG8gbm90IGZvbGxvdyBhIEpTUiwgaXQgbGVhZHMgdG8gYW5vdGhlciBzdWJyb3V0aW5lIQorICAgICAgICAgICAgICAgICAgICBjYWxscy5hZGQobm9kZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgSnVtcEluc25Ob2RlIGpub2RlID0gKEp1bXBJbnNuTm9kZSkgbm9kZTsKKyAgICAgICAgICAgICAgICAgICAgZmluZFN1YnJvdXRpbmUoaW5zbnMuaW5kZXhPZihqbm9kZS5sYWJlbCksIHN1YiwgY2FsbHMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIFRhYmxlU3dpdGNoSW5zbk5vZGUpIHsKKyAgICAgICAgICAgICAgICBUYWJsZVN3aXRjaEluc25Ob2RlIHRzbm9kZSA9IChUYWJsZVN3aXRjaEluc25Ob2RlKSBub2RlOworICAgICAgICAgICAgICAgIGZpbmRTdWJyb3V0aW5lKGluc25zLmluZGV4T2YodHNub2RlLmRmbHQpLCBzdWIsIGNhbGxzKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gdHNub2RlLmxhYmVscy5zaXplKCkgLSAxOyBpID49IDA7IC0taSkgeworICAgICAgICAgICAgICAgICAgICBMYWJlbE5vZGUgbCA9IHRzbm9kZS5sYWJlbHMuZ2V0KGkpOworICAgICAgICAgICAgICAgICAgICBmaW5kU3Vicm91dGluZShpbnNucy5pbmRleE9mKGwpLCBzdWIsIGNhbGxzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBMb29rdXBTd2l0Y2hJbnNuTm9kZSkgeworICAgICAgICAgICAgICAgIExvb2t1cFN3aXRjaEluc25Ob2RlIGxzbm9kZSA9IChMb29rdXBTd2l0Y2hJbnNuTm9kZSkgbm9kZTsKKyAgICAgICAgICAgICAgICBmaW5kU3Vicm91dGluZShpbnNucy5pbmRleE9mKGxzbm9kZS5kZmx0KSwgc3ViLCBjYWxscyk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IGxzbm9kZS5sYWJlbHMuc2l6ZSgpIC0gMTsgaSA+PSAwOyAtLWkpIHsKKyAgICAgICAgICAgICAgICAgICAgTGFiZWxOb2RlIGwgPSBsc25vZGUubGFiZWxzLmdldChpKTsKKyAgICAgICAgICAgICAgICAgICAgZmluZFN1YnJvdXRpbmUoaW5zbnMuaW5kZXhPZihsKSwgc3ViLCBjYWxscyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBjYWxscyBmaW5kU3Vicm91dGluZSByZWN1cnNpdmVseSBvbiBleGNlcHRpb24gaGFuZGxlciBzdWNjZXNzb3JzCisgICAgICAgICAgICBMaXN0PFRyeUNhdGNoQmxvY2tOb2RlPiBpbnNuSGFuZGxlcnMgPSBoYW5kbGVyc1tpbnNuXTsKKyAgICAgICAgICAgIGlmIChpbnNuSGFuZGxlcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5zbkhhbmRsZXJzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIFRyeUNhdGNoQmxvY2tOb2RlIHRjYiA9IGluc25IYW5kbGVycy5nZXQoaSk7CisgICAgICAgICAgICAgICAgICAgIGZpbmRTdWJyb3V0aW5lKGluc25zLmluZGV4T2YodGNiLmhhbmRsZXIpLCBzdWIsIGNhbGxzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGlmIGluc24gZG9lcyBub3QgZmFsbHMgdGhyb3VnaCB0byB0aGUgbmV4dCBpbnN0cnVjdGlvbiwgcmV0dXJuLgorICAgICAgICAgICAgc3dpdGNoIChub2RlLmdldE9wY29kZSgpKSB7CisgICAgICAgICAgICAgICAgY2FzZSBHT1RPOgorICAgICAgICAgICAgICAgIGNhc2UgUkVUOgorICAgICAgICAgICAgICAgIGNhc2UgVEFCTEVTV0lUQ0g6CisgICAgICAgICAgICAgICAgY2FzZSBMT09LVVBTV0lUQ0g6CisgICAgICAgICAgICAgICAgY2FzZSBJUkVUVVJOOgorICAgICAgICAgICAgICAgIGNhc2UgTFJFVFVSTjoKKyAgICAgICAgICAgICAgICBjYXNlIEZSRVRVUk46CisgICAgICAgICAgICAgICAgY2FzZSBEUkVUVVJOOgorICAgICAgICAgICAgICAgIGNhc2UgQVJFVFVSTjoKKyAgICAgICAgICAgICAgICBjYXNlIFJFVFVSTjoKKyAgICAgICAgICAgICAgICBjYXNlIEFUSFJPVzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5zbisrOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc3ltYm9saWMgc3RhY2sgZnJhbWUgZm9yIGVhY2ggaW5zdHJ1Y3Rpb24gb2YgdGhlIGxhc3QKKyAgICAgKiByZWNlbnRseSBhbmFseXplZCBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBzeW1ib2xpYyBzdGF0ZSBvZiB0aGUgZXhlY3V0aW9uIHN0YWNrIGZyYW1lIGF0IGVhY2ggYnl0ZWNvZGUKKyAgICAgKiAgICAgICAgIGluc3RydWN0aW9uIG9mIHRoZSBtZXRob2QuIFRoZSBzaXplIG9mIHRoZSByZXR1cm5lZCBhcnJheSBpcworICAgICAqICAgICAgICAgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBpbnN0cnVjdGlvbnMgKGFuZCBsYWJlbHMpIG9mIHRoZSBtZXRob2QuIEEKKyAgICAgKiAgICAgICAgIGdpdmVuIGZyYW1lIGlzIDx0dD5udWxsPC90dD4gaWYgdGhlIGNvcnJlc3BvbmRpbmcgaW5zdHJ1Y3Rpb24KKyAgICAgKiAgICAgICAgIGNhbm5vdCBiZSByZWFjaGVkLCBvciBpZiBhbiBlcnJvciBvY2N1cmVkIGR1cmluZyB0aGUgYW5hbHlzaXMgb2YKKyAgICAgKiAgICAgICAgIHRoZSBtZXRob2QuCisgICAgICovCisgICAgcHVibGljIEZyYW1lPFY+W10gZ2V0RnJhbWVzKCkgeworICAgICAgICByZXR1cm4gZnJhbWVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGV4Y2VwdGlvbiBoYW5kbGVycyBmb3IgdGhlIGdpdmVuIGluc3RydWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGluc24gdGhlIGluZGV4IG9mIGFuIGluc3RydWN0aW9uIG9mIHRoZSBsYXN0IHJlY2VudGx5IGFuYWx5emVkCisgICAgICogICAgICAgIG1ldGhvZC4KKyAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiB7QGxpbmsgVHJ5Q2F0Y2hCbG9ja05vZGV9IG9iamVjdHMuCisgICAgICovCisgICAgcHVibGljIExpc3Q8VHJ5Q2F0Y2hCbG9ja05vZGU+IGdldEhhbmRsZXJzKGZpbmFsIGludCBpbnNuKSB7CisgICAgICAgIHJldHVybiBoYW5kbGVyc1tpbnNuXTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplcyB0aGlzIGFuYWx5emVyLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQganVzdCBiZWZvcmUgdGhlCisgICAgICogZXhlY3V0aW9uIG9mIGNvbnRyb2wgZmxvdyBhbmFseXNpcyBsb29wIGluICNhbmFseXplLiBUaGUgZGVmYXVsdAorICAgICAqIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90aGluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvd25lciB0aGUgaW50ZXJuYWwgbmFtZSBvZiB0aGUgY2xhc3MgdG8gd2hpY2ggdGhlIG1ldGhvZCBiZWxvbmdzLgorICAgICAqIEBwYXJhbSBtIHRoZSBtZXRob2QgdG8gYmUgYW5hbHl6ZWQuCisgICAgICogQHRocm93cyBBbmFseXplckV4Y2VwdGlvbiBpZiBhIHByb2JsZW0gb2NjdXJzLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGluaXQoU3RyaW5nIG93bmVyLCBNZXRob2ROb2RlIG0pIHRocm93cyBBbmFseXplckV4Y2VwdGlvbiB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBmcmFtZSB3aXRoIHRoZSBnaXZlbiBzaXplLgorICAgICAqCisgICAgICogQHBhcmFtIG5Mb2NhbHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGxvY2FsIHZhcmlhYmxlcyBvZiB0aGUgZnJhbWUuCisgICAgICogQHBhcmFtIG5TdGFjayB0aGUgbWF4aW11bSBzdGFjayBzaXplIG9mIHRoZSBmcmFtZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIGZyYW1lLgorICAgICAqLworICAgIHByb3RlY3RlZCBGcmFtZTxWPiBuZXdGcmFtZShmaW5hbCBpbnQgbkxvY2FscywgZmluYWwgaW50IG5TdGFjaykgeworICAgICAgICByZXR1cm4gbmV3IEZyYW1lPFY+KG5Mb2NhbHMsIG5TdGFjayk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBmcmFtZSB0aGF0IGlzIGlkZW50aWNhbCB0byB0aGUgZ2l2ZW4gZnJhbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3JjIGEgZnJhbWUuCisgICAgICogQHJldHVybiB0aGUgY3JlYXRlZCBmcmFtZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRnJhbWU8Vj4gbmV3RnJhbWUoZmluYWwgRnJhbWU8PyBleHRlbmRzIFY+IHNyYykgeworICAgICAgICByZXR1cm4gbmV3IEZyYW1lPFY+KHNyYyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGNvbnRyb2wgZmxvdyBncmFwaCBlZGdlLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzCisgICAgICogbWV0aG9kIGRvZXMgbm90aGluZy4gSXQgY2FuIGJlIG92ZXJyaWRlbiBpbiBvcmRlciB0byBjb25zdHJ1Y3QgdGhlCisgICAgICogY29udHJvbCBmbG93IGdyYXBoIG9mIGEgbWV0aG9kICh0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlCisgICAgICoge0BsaW5rICNhbmFseXplIGFuYWx5emV9IG1ldGhvZCBkdXJpbmcgaXRzIHZpc2l0IG9mIHRoZSBtZXRob2QncyBjb2RlKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnNuIGFuIGluc3RydWN0aW9uIGluZGV4LgorICAgICAqIEBwYXJhbSBzdWNjZXNzb3IgaW5kZXggb2YgYSBzdWNjZXNzb3IgaW5zdHJ1Y3Rpb24uCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgbmV3Q29udHJvbEZsb3dFZGdlKGZpbmFsIGludCBpbnNuLCBmaW5hbCBpbnQgc3VjY2Vzc29yKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGNvbnRyb2wgZmxvdyBncmFwaCBlZGdlIGNvcnJlc3BvbmRpbmcgdG8gYW4gZXhjZXB0aW9uIGhhbmRsZXIuCisgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgZG9lcyBub3RoaW5nLiBJdCBjYW4gYmUKKyAgICAgKiBvdmVycmlkZGVuIGluIG9yZGVyIHRvIGNvbnN0cnVjdCB0aGUgY29udHJvbCBmbG93IGdyYXBoIG9mIGEgbWV0aG9kICh0aGlzCisgICAgICogbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUge0BsaW5rICNhbmFseXplIGFuYWx5emV9IG1ldGhvZCBkdXJpbmcgaXRzIHZpc2l0CisgICAgICogb2YgdGhlIG1ldGhvZCdzIGNvZGUpLgorICAgICAqCisgICAgICogQHBhcmFtIGluc24gYW4gaW5zdHJ1Y3Rpb24gaW5kZXguCisgICAgICogQHBhcmFtIHN1Y2Nlc3NvciBpbmRleCBvZiBhIHN1Y2Nlc3NvciBpbnN0cnVjdGlvbi4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBlZGdlIG11c3QgYmUgY29uc2lkZXJlZCBpbiB0aGUgZGF0YSBmbG93IGFuYWx5c2lzCisgICAgICogICAgICAgICBwZXJmb3JtZWQgYnkgdGhpcyBhbmFseXplciwgb3IgZmFsc2Ugb3RoZXJ3aXNlLiBUaGUgZGVmYXVsdAorICAgICAqICAgICAgICAgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgYWx3YXlzIHJldHVybnMgdHJ1ZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBuZXdDb250cm9sRmxvd0V4Y2VwdGlvbkVkZ2UoCisgICAgICAgIGZpbmFsIGludCBpbnNuLAorICAgICAgICBmaW5hbCBpbnQgc3VjY2Vzc29yKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGNvbnRyb2wgZmxvdyBncmFwaCBlZGdlIGNvcnJlc3BvbmRpbmcgdG8gYW4gZXhjZXB0aW9uIGhhbmRsZXIuCisgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgZGVsZWdhdGVzIHRvCisgICAgICoge0BsaW5rICNuZXdDb250cm9sRmxvd0V4Y2VwdGlvbkVkZ2UoaW50LCBpbnQpCisgICAgICogbmV3Q29udHJvbEZsb3dFeGNlcHRpb25FZGdlKGludCwgaW50KX0uIEl0IGNhbiBiZSBvdmVycmlkZGVuIGluIG9yZGVyIHRvCisgICAgICogY29uc3RydWN0IHRoZSBjb250cm9sIGZsb3cgZ3JhcGggb2YgYSBtZXRob2QgKHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieQorICAgICAqIHRoZSB7QGxpbmsgI2FuYWx5emUgYW5hbHl6ZX0gbWV0aG9kIGR1cmluZyBpdHMgdmlzaXQgb2YgdGhlIG1ldGhvZCdzCisgICAgICogY29kZSkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5zbiBhbiBpbnN0cnVjdGlvbiBpbmRleC4KKyAgICAgKiBAcGFyYW0gdGNiIFRyeUNhdGNoQmxvY2tOb2RlIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBlZGdlLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGVkZ2UgbXVzdCBiZSBjb25zaWRlcmVkIGluIHRoZSBkYXRhIGZsb3cgYW5hbHlzaXMKKyAgICAgKiAgICAgICAgIHBlcmZvcm1lZCBieSB0aGlzIGFuYWx5emVyLCBvciBmYWxzZSBvdGhlcndpc2UuIFRoZSBkZWZhdWx0CisgICAgICogICAgICAgICBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBkZWxlZ2F0ZXMgdG8KKyAgICAgKiAgICAgICAgIHtAbGluayAjbmV3Q29udHJvbEZsb3dFeGNlcHRpb25FZGdlKGludCwgaW50KQorICAgICAqICAgICAgICAgbmV3Q29udHJvbEZsb3dFeGNlcHRpb25FZGdlKGludCwgaW50KX0uCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gbmV3Q29udHJvbEZsb3dFeGNlcHRpb25FZGdlKAorICAgICAgICBmaW5hbCBpbnQgaW5zbiwKKyAgICAgICAgZmluYWwgVHJ5Q2F0Y2hCbG9ja05vZGUgdGNiKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ld0NvbnRyb2xGbG93RXhjZXB0aW9uRWRnZShpbnNuLCBpbnNucy5pbmRleE9mKHRjYi5oYW5kbGVyKSk7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgcHJpdmF0ZSB2b2lkIG1lcmdlKAorICAgICAgICBmaW5hbCBpbnQgaW5zbiwKKyAgICAgICAgZmluYWwgRnJhbWU8Vj4gZnJhbWUsCisgICAgICAgIGZpbmFsIFN1YnJvdXRpbmUgc3Vicm91dGluZSkgdGhyb3dzIEFuYWx5emVyRXhjZXB0aW9uCisgICAgeworICAgICAgICBGcmFtZTxWPiBvbGRGcmFtZSA9IGZyYW1lc1tpbnNuXTsKKyAgICAgICAgU3Vicm91dGluZSBvbGRTdWJyb3V0aW5lID0gc3Vicm91dGluZXNbaW5zbl07CisgICAgICAgIGJvb2xlYW4gY2hhbmdlczsKKworICAgICAgICBpZiAob2xkRnJhbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgZnJhbWVzW2luc25dID0gbmV3RnJhbWUoZnJhbWUpOworICAgICAgICAgICAgY2hhbmdlcyA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjaGFuZ2VzID0gb2xkRnJhbWUubWVyZ2UoZnJhbWUsIGludGVycHJldGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChvbGRTdWJyb3V0aW5lID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChzdWJyb3V0aW5lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzdWJyb3V0aW5lc1tpbnNuXSA9IHN1YnJvdXRpbmUuY29weSgpOworICAgICAgICAgICAgICAgIGNoYW5nZXMgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHN1YnJvdXRpbmUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gb2xkU3Vicm91dGluZS5tZXJnZShzdWJyb3V0aW5lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoY2hhbmdlcyAmJiAhcXVldWVkW2luc25dKSB7CisgICAgICAgICAgICBxdWV1ZWRbaW5zbl0gPSB0cnVlOworICAgICAgICAgICAgcXVldWVbdG9wKytdID0gaW5zbjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBtZXJnZSgKKyAgICAgICAgZmluYWwgaW50IGluc24sCisgICAgICAgIGZpbmFsIEZyYW1lPFY+IGJlZm9yZUpTUiwKKyAgICAgICAgZmluYWwgRnJhbWU8Vj4gYWZ0ZXJSRVQsCisgICAgICAgIGZpbmFsIFN1YnJvdXRpbmUgc3Vicm91dGluZUJlZm9yZUpTUiwKKyAgICAgICAgZmluYWwgYm9vbGVhbltdIGFjY2VzcykgdGhyb3dzIEFuYWx5emVyRXhjZXB0aW9uCisgICAgeworICAgICAgICBGcmFtZTxWPiBvbGRGcmFtZSA9IGZyYW1lc1tpbnNuXTsKKyAgICAgICAgU3Vicm91dGluZSBvbGRTdWJyb3V0aW5lID0gc3Vicm91dGluZXNbaW5zbl07CisgICAgICAgIGJvb2xlYW4gY2hhbmdlczsKKworICAgICAgICBhZnRlclJFVC5tZXJnZShiZWZvcmVKU1IsIGFjY2Vzcyk7CisKKyAgICAgICAgaWYgKG9sZEZyYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgIGZyYW1lc1tpbnNuXSA9IG5ld0ZyYW1lKGFmdGVyUkVUKTsKKyAgICAgICAgICAgIGNoYW5nZXMgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2hhbmdlcyA9IG9sZEZyYW1lLm1lcmdlKGFmdGVyUkVULCBpbnRlcnByZXRlcik7CisgICAgICAgIH0KKworICAgICAgICBpZiAob2xkU3Vicm91dGluZSAhPSBudWxsICYmIHN1YnJvdXRpbmVCZWZvcmVKU1IgIT0gbnVsbCkgeworICAgICAgICAgICAgY2hhbmdlcyB8PSBvbGRTdWJyb3V0aW5lLm1lcmdlKHN1YnJvdXRpbmVCZWZvcmVKU1IpOworICAgICAgICB9CisgICAgICAgIGlmIChjaGFuZ2VzICYmICFxdWV1ZWRbaW5zbl0pIHsKKyAgICAgICAgICAgIHF1ZXVlZFtpbnNuXSA9IHRydWU7CisgICAgICAgICAgICBxdWV1ZVt0b3ArK10gPSBpbnNuOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS90cmVlL2FuYWx5c2lzL0FuYWx5emVyRXhjZXB0aW9uLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL3RyZWUvYW5hbHlzaXMvQW5hbHl6ZXJFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMThmNWQzCi0tLSAvZGV2L251bGwKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS90cmVlL2FuYWx5c2lzL0FuYWx5emVyRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgT3JhY2xlIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCisgKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CisgKiBxdWVzdGlvbnMuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBpcyBhdmFpbGFibGUgdW5kZXIgYW5kIGdvdmVybmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogSG93ZXZlciwgdGhlIGZvbGxvd2luZyBub3RpY2UgYWNjb21wYW5pZWQgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhpcworICogZmlsZToKKyAqCisgKiBBU006IGEgdmVyeSBzbWFsbCBhbmQgZmFzdCBKYXZhIGJ5dGVjb2RlIG1hbmlwdWxhdGlvbiBmcmFtZXdvcmsKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDExIElOUklBLCBGcmFuY2UgVGVsZWNvbQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS50cmVlLmFuYWx5c2lzOworCitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLnRyZWUuQWJzdHJhY3RJbnNuTm9kZTsKKworLyoqCisgKiBUaHJvd24gaWYgYSBwcm9ibGVtIG9jY3VycyBkdXJpbmcgdGhlIGFuYWx5c2lzIG9mIGEgbWV0aG9kLgorICoKKyAqIEBhdXRob3IgQmluZyBSYW4KKyAqIEBhdXRob3IgRXJpYyBCcnVuZXRvbgorICovCitwdWJsaWMgY2xhc3MgQW5hbHl6ZXJFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24geworCisgICAgcHVibGljIGZpbmFsIEFic3RyYWN0SW5zbk5vZGUgbm9kZTsKKworICAgIHB1YmxpYyBBbmFseXplckV4Y2VwdGlvbihmaW5hbCBBYnN0cmFjdEluc25Ob2RlIG5vZGUsIGZpbmFsIFN0cmluZyBtc2cpIHsKKyAgICAgICAgc3VwZXIobXNnKTsKKyAgICAgICAgdGhpcy5ub2RlID0gbm9kZTsKKyAgICB9CisKKyAgICBwdWJsaWMgQW5hbHl6ZXJFeGNlcHRpb24oZmluYWwgQWJzdHJhY3RJbnNuTm9kZSBub2RlLCBmaW5hbCBTdHJpbmcgbXNnLCBmaW5hbCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7CisgICAgICAgIHN1cGVyKG1zZywgZXhjZXB0aW9uKTsKKyAgICAgICAgdGhpcy5ub2RlID0gbm9kZTsKKyAgICB9CisKKyAgICBwdWJsaWMgQW5hbHl6ZXJFeGNlcHRpb24oCisgICAgICAgIGZpbmFsIEFic3RyYWN0SW5zbk5vZGUgbm9kZSwKKyAgICAgICAgZmluYWwgU3RyaW5nIG1zZywKKyAgICAgICAgZmluYWwgT2JqZWN0IGV4cGVjdGVkLAorICAgICAgICBmaW5hbCBWYWx1ZSBlbmNvdW50ZXJlZCkKKyAgICB7CisgICAgICAgIHN1cGVyKChtc2cgPT0gbnVsbCA/ICJFeHBlY3RlZCAiIDogbXNnICsgIjogZXhwZWN0ZWQgIikgKyBleHBlY3RlZAorICAgICAgICAgICAgICAgICsgIiwgYnV0IGZvdW5kICIgKyBlbmNvdW50ZXJlZCk7CisgICAgICAgIHRoaXMubm9kZSA9IG5vZGU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS90cmVlL2FuYWx5c2lzL0Jhc2ljSW50ZXJwcmV0ZXIuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vdHJlZS9hbmFseXNpcy9CYXNpY0ludGVycHJldGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RmODJmNgotLS0gL2Rldi9udWxsCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vdHJlZS9hbmFseXNpcy9CYXNpY0ludGVycHJldGVyLmphdmEKQEAgLTAsMCArMSwzOTQgQEAKKy8qCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IE9yYWNsZSBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQorICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQorICogcXVlc3Rpb25zLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgaXMgYXZhaWxhYmxlIHVuZGVyIGFuZCBnb3Zlcm5lZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIEhvd2V2ZXIsIHRoZSBmb2xsb3dpbmcgbm90aWNlIGFjY29tcGFuaWVkIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoaXMKKyAqIGZpbGU6CisgKgorICogQVNNOiBhIHZlcnkgc21hbGwgYW5kIGZhc3QgSmF2YSBieXRlY29kZSBtYW5pcHVsYXRpb24gZnJhbWV3b3JrCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAxMSBJTlJJQSwgRnJhbmNlIFRlbGVjb20KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20udHJlZS5hbmFseXNpczsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLkhhbmRsZTsKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uT3Bjb2RlczsKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uVHlwZTsKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20udHJlZS5BYnN0cmFjdEluc25Ob2RlOworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS50cmVlLkZpZWxkSW5zbk5vZGU7CitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLnRyZWUuSW50SW5zbk5vZGU7CitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLnRyZWUuSW52b2tlRHluYW1pY0luc25Ob2RlOworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS50cmVlLkxkY0luc25Ob2RlOworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS50cmVlLk1ldGhvZEluc25Ob2RlOworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS50cmVlLk11bHRpQU5ld0FycmF5SW5zbk5vZGU7CitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLnRyZWUuVHlwZUluc25Ob2RlOworCisvKioKKyAqIEFuIHtAbGluayBJbnRlcnByZXRlcn0gZm9yIHtAbGluayBCYXNpY1ZhbHVlfSB2YWx1ZXMuCisgKgorICogQGF1dGhvciBFcmljIEJydW5ldG9uCisgKiBAYXV0aG9yIEJpbmcgUmFuCisgKi8KK3B1YmxpYyBjbGFzcyBCYXNpY0ludGVycHJldGVyIGV4dGVuZHMgSW50ZXJwcmV0ZXI8QmFzaWNWYWx1ZT4gaW1wbGVtZW50cworICAgICAgICBPcGNvZGVzCit7CisKKyAgICBwdWJsaWMgQmFzaWNJbnRlcnByZXRlcigpIHsKKyAgICAgICAgc3VwZXIoQVNNNCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIEJhc2ljSW50ZXJwcmV0ZXIoZmluYWwgaW50IGFwaSkgeworICAgICAgICBzdXBlcihhcGkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCYXNpY1ZhbHVlIG5ld1ZhbHVlKGZpbmFsIFR5cGUgdHlwZSkgeworICAgICAgICBpZiAodHlwZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gQmFzaWNWYWx1ZS5VTklOSVRJQUxJWkVEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAodHlwZS5nZXRTb3J0KCkpIHsKKyAgICAgICAgICAgIGNhc2UgVHlwZS5WT0lEOgorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgY2FzZSBUeXBlLkJPT0xFQU46CisgICAgICAgICAgICBjYXNlIFR5cGUuQ0hBUjoKKyAgICAgICAgICAgIGNhc2UgVHlwZS5CWVRFOgorICAgICAgICAgICAgY2FzZSBUeXBlLlNIT1JUOgorICAgICAgICAgICAgY2FzZSBUeXBlLklOVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gQmFzaWNWYWx1ZS5JTlRfVkFMVUU7CisgICAgICAgICAgICBjYXNlIFR5cGUuRkxPQVQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIEJhc2ljVmFsdWUuRkxPQVRfVkFMVUU7CisgICAgICAgICAgICBjYXNlIFR5cGUuTE9ORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gQmFzaWNWYWx1ZS5MT05HX1ZBTFVFOworICAgICAgICAgICAgY2FzZSBUeXBlLkRPVUJMRToKKyAgICAgICAgICAgICAgICByZXR1cm4gQmFzaWNWYWx1ZS5ET1VCTEVfVkFMVUU7CisgICAgICAgICAgICBjYXNlIFR5cGUuQVJSQVk6CisgICAgICAgICAgICBjYXNlIFR5cGUuT0JKRUNUOgorICAgICAgICAgICAgICAgIHJldHVybiBCYXNpY1ZhbHVlLlJFRkVSRU5DRV9WQUxVRTsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJJbnRlcm5hbCBlcnJvciIpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJhc2ljVmFsdWUgbmV3T3BlcmF0aW9uKGZpbmFsIEFic3RyYWN0SW5zbk5vZGUgaW5zbikKKyAgICAgICAgICAgIHRocm93cyBBbmFseXplckV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgc3dpdGNoIChpbnNuLmdldE9wY29kZSgpKSB7CisgICAgICAgICAgICBjYXNlIEFDT05TVF9OVUxMOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXdWYWx1ZShUeXBlLmdldE9iamVjdFR5cGUoIm51bGwiKSk7CisgICAgICAgICAgICBjYXNlIElDT05TVF9NMToKKyAgICAgICAgICAgIGNhc2UgSUNPTlNUXzA6CisgICAgICAgICAgICBjYXNlIElDT05TVF8xOgorICAgICAgICAgICAgY2FzZSBJQ09OU1RfMjoKKyAgICAgICAgICAgIGNhc2UgSUNPTlNUXzM6CisgICAgICAgICAgICBjYXNlIElDT05TVF80OgorICAgICAgICAgICAgY2FzZSBJQ09OU1RfNToKKyAgICAgICAgICAgICAgICByZXR1cm4gQmFzaWNWYWx1ZS5JTlRfVkFMVUU7CisgICAgICAgICAgICBjYXNlIExDT05TVF8wOgorICAgICAgICAgICAgY2FzZSBMQ09OU1RfMToKKyAgICAgICAgICAgICAgICByZXR1cm4gQmFzaWNWYWx1ZS5MT05HX1ZBTFVFOworICAgICAgICAgICAgY2FzZSBGQ09OU1RfMDoKKyAgICAgICAgICAgIGNhc2UgRkNPTlNUXzE6CisgICAgICAgICAgICBjYXNlIEZDT05TVF8yOgorICAgICAgICAgICAgICAgIHJldHVybiBCYXNpY1ZhbHVlLkZMT0FUX1ZBTFVFOworICAgICAgICAgICAgY2FzZSBEQ09OU1RfMDoKKyAgICAgICAgICAgIGNhc2UgRENPTlNUXzE6CisgICAgICAgICAgICAgICAgcmV0dXJuIEJhc2ljVmFsdWUuRE9VQkxFX1ZBTFVFOworICAgICAgICAgICAgY2FzZSBCSVBVU0g6CisgICAgICAgICAgICBjYXNlIFNJUFVTSDoKKyAgICAgICAgICAgICAgICByZXR1cm4gQmFzaWNWYWx1ZS5JTlRfVkFMVUU7CisgICAgICAgICAgICBjYXNlIExEQzoKKyAgICAgICAgICAgICAgICBPYmplY3QgY3N0ID0gKChMZGNJbnNuTm9kZSkgaW5zbikuY3N0OworICAgICAgICAgICAgICAgIGlmIChjc3QgaW5zdGFuY2VvZiBJbnRlZ2VyKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCYXNpY1ZhbHVlLklOVF9WQUxVRTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNzdCBpbnN0YW5jZW9mIEZsb2F0KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCYXNpY1ZhbHVlLkZMT0FUX1ZBTFVFOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3N0IGluc3RhbmNlb2YgTG9uZykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQmFzaWNWYWx1ZS5MT05HX1ZBTFVFOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3N0IGluc3RhbmNlb2YgRG91YmxlKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCYXNpY1ZhbHVlLkRPVUJMRV9WQUxVRTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNzdCBpbnN0YW5jZW9mIFN0cmluZykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3VmFsdWUoVHlwZS5nZXRPYmplY3RUeXBlKCJqYXZhL2xhbmcvU3RyaW5nIikpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3N0IGluc3RhbmNlb2YgVHlwZSkgeworICAgICAgICAgICAgICAgICAgICBpbnQgc29ydCA9ICgoVHlwZSkgY3N0KS5nZXRTb3J0KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzb3J0ID09IFR5cGUuT0JKRUNUIHx8IHNvcnQgPT0gVHlwZS5BUlJBWSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld1ZhbHVlKFR5cGUuZ2V0T2JqZWN0VHlwZSgiamF2YS9sYW5nL0NsYXNzIikpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNvcnQgPT0gVHlwZS5NRVRIT0QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdWYWx1ZShUeXBlLmdldE9iamVjdFR5cGUoImphdmEvbGFuZy9pbnZva2UvTWV0aG9kVHlwZSIpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIklsbGVnYWwgTERDIGNvbnN0YW50ICIgKyBjc3QpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjc3QgaW5zdGFuY2VvZiBIYW5kbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld1ZhbHVlKFR5cGUuZ2V0T2JqZWN0VHlwZSgiamF2YS9sYW5nL2ludm9rZS9NZXRob2RIYW5kbGUiKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSWxsZWdhbCBMREMgY29uc3RhbnQgIiArIGNzdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBKU1I6CisgICAgICAgICAgICAgICAgcmV0dXJuIEJhc2ljVmFsdWUuUkVUVVJOQUREUkVTU19WQUxVRTsKKyAgICAgICAgICAgIGNhc2UgR0VUU1RBVElDOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXdWYWx1ZShUeXBlLmdldFR5cGUoKChGaWVsZEluc25Ob2RlKSBpbnNuKS5kZXNjKSk7CisgICAgICAgICAgICBjYXNlIE5FVzoKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3VmFsdWUoVHlwZS5nZXRPYmplY3RUeXBlKCgoVHlwZUluc25Ob2RlKSBpbnNuKS5kZXNjKSk7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiSW50ZXJuYWwgZXJyb3IuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQmFzaWNWYWx1ZSBjb3B5T3BlcmF0aW9uKGZpbmFsIEFic3RyYWN0SW5zbk5vZGUgaW5zbiwgZmluYWwgQmFzaWNWYWx1ZSB2YWx1ZSkKKyAgICAgICAgICAgIHRocm93cyBBbmFseXplckV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCYXNpY1ZhbHVlIHVuYXJ5T3BlcmF0aW9uKGZpbmFsIEFic3RyYWN0SW5zbk5vZGUgaW5zbiwgZmluYWwgQmFzaWNWYWx1ZSB2YWx1ZSkKKyAgICAgICAgICAgIHRocm93cyBBbmFseXplckV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgc3dpdGNoIChpbnNuLmdldE9wY29kZSgpKSB7CisgICAgICAgICAgICBjYXNlIElORUc6CisgICAgICAgICAgICBjYXNlIElJTkM6CisgICAgICAgICAgICBjYXNlIEwySToKKyAgICAgICAgICAgIGNhc2UgRjJJOgorICAgICAgICAgICAgY2FzZSBEMkk6CisgICAgICAgICAgICBjYXNlIEkyQjoKKyAgICAgICAgICAgIGNhc2UgSTJDOgorICAgICAgICAgICAgY2FzZSBJMlM6CisgICAgICAgICAgICAgICAgcmV0dXJuIEJhc2ljVmFsdWUuSU5UX1ZBTFVFOworICAgICAgICAgICAgY2FzZSBGTkVHOgorICAgICAgICAgICAgY2FzZSBJMkY6CisgICAgICAgICAgICBjYXNlIEwyRjoKKyAgICAgICAgICAgIGNhc2UgRDJGOgorICAgICAgICAgICAgICAgIHJldHVybiBCYXNpY1ZhbHVlLkZMT0FUX1ZBTFVFOworICAgICAgICAgICAgY2FzZSBMTkVHOgorICAgICAgICAgICAgY2FzZSBJMkw6CisgICAgICAgICAgICBjYXNlIEYyTDoKKyAgICAgICAgICAgIGNhc2UgRDJMOgorICAgICAgICAgICAgICAgIHJldHVybiBCYXNpY1ZhbHVlLkxPTkdfVkFMVUU7CisgICAgICAgICAgICBjYXNlIERORUc6CisgICAgICAgICAgICBjYXNlIEkyRDoKKyAgICAgICAgICAgIGNhc2UgTDJEOgorICAgICAgICAgICAgY2FzZSBGMkQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIEJhc2ljVmFsdWUuRE9VQkxFX1ZBTFVFOworICAgICAgICAgICAgY2FzZSBJRkVROgorICAgICAgICAgICAgY2FzZSBJRk5FOgorICAgICAgICAgICAgY2FzZSBJRkxUOgorICAgICAgICAgICAgY2FzZSBJRkdFOgorICAgICAgICAgICAgY2FzZSBJRkdUOgorICAgICAgICAgICAgY2FzZSBJRkxFOgorICAgICAgICAgICAgY2FzZSBUQUJMRVNXSVRDSDoKKyAgICAgICAgICAgIGNhc2UgTE9PS1VQU1dJVENIOgorICAgICAgICAgICAgY2FzZSBJUkVUVVJOOgorICAgICAgICAgICAgY2FzZSBMUkVUVVJOOgorICAgICAgICAgICAgY2FzZSBGUkVUVVJOOgorICAgICAgICAgICAgY2FzZSBEUkVUVVJOOgorICAgICAgICAgICAgY2FzZSBBUkVUVVJOOgorICAgICAgICAgICAgY2FzZSBQVVRTVEFUSUM6CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICBjYXNlIEdFVEZJRUxEOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXdWYWx1ZShUeXBlLmdldFR5cGUoKChGaWVsZEluc25Ob2RlKSBpbnNuKS5kZXNjKSk7CisgICAgICAgICAgICBjYXNlIE5FV0FSUkFZOgorICAgICAgICAgICAgICAgIHN3aXRjaCAoKChJbnRJbnNuTm9kZSkgaW5zbikub3BlcmFuZCkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFRfQk9PTEVBTjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdWYWx1ZShUeXBlLmdldFR5cGUoIltaIikpOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRfQ0hBUjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdWYWx1ZShUeXBlLmdldFR5cGUoIltDIikpOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRfQllURToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdWYWx1ZShUeXBlLmdldFR5cGUoIltCIikpOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRfU0hPUlQ6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3VmFsdWUoVHlwZS5nZXRUeXBlKCJbUyIpKTsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUX0lOVDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdWYWx1ZShUeXBlLmdldFR5cGUoIltJIikpOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRfRkxPQVQ6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3VmFsdWUoVHlwZS5nZXRUeXBlKCJbRiIpKTsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUX0RPVUJMRToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdWYWx1ZShUeXBlLmdldFR5cGUoIltEIikpOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRfTE9ORzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdWYWx1ZShUeXBlLmdldFR5cGUoIltKIikpOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFuYWx5emVyRXhjZXB0aW9uKGluc24sICJJbnZhbGlkIGFycmF5IHR5cGUiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEFORVdBUlJBWToKKyAgICAgICAgICAgICAgICBTdHJpbmcgZGVzYyA9ICgoVHlwZUluc25Ob2RlKSBpbnNuKS5kZXNjOworICAgICAgICAgICAgICAgIHJldHVybiBuZXdWYWx1ZShUeXBlLmdldFR5cGUoIlsiICsgVHlwZS5nZXRPYmplY3RUeXBlKGRlc2MpKSk7CisgICAgICAgICAgICBjYXNlIEFSUkFZTEVOR1RIOgorICAgICAgICAgICAgICAgIHJldHVybiBCYXNpY1ZhbHVlLklOVF9WQUxVRTsKKyAgICAgICAgICAgIGNhc2UgQVRIUk9XOgorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgY2FzZSBDSEVDS0NBU1Q6CisgICAgICAgICAgICAgICAgZGVzYyA9ICgoVHlwZUluc25Ob2RlKSBpbnNuKS5kZXNjOworICAgICAgICAgICAgICAgIHJldHVybiBuZXdWYWx1ZShUeXBlLmdldE9iamVjdFR5cGUoZGVzYykpOworICAgICAgICAgICAgY2FzZSBJTlNUQU5DRU9GOgorICAgICAgICAgICAgICAgIHJldHVybiBCYXNpY1ZhbHVlLklOVF9WQUxVRTsKKyAgICAgICAgICAgIGNhc2UgTU9OSVRPUkVOVEVSOgorICAgICAgICAgICAgY2FzZSBNT05JVE9SRVhJVDoKKyAgICAgICAgICAgIGNhc2UgSUZOVUxMOgorICAgICAgICAgICAgY2FzZSBJRk5PTk5VTEw6CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiSW50ZXJuYWwgZXJyb3IuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQmFzaWNWYWx1ZSBiaW5hcnlPcGVyYXRpb24oCisgICAgICAgIGZpbmFsIEFic3RyYWN0SW5zbk5vZGUgaW5zbiwKKyAgICAgICAgZmluYWwgQmFzaWNWYWx1ZSB2YWx1ZTEsCisgICAgICAgIGZpbmFsIEJhc2ljVmFsdWUgdmFsdWUyKSB0aHJvd3MgQW5hbHl6ZXJFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHN3aXRjaCAoaW5zbi5nZXRPcGNvZGUoKSkgeworICAgICAgICAgICAgY2FzZSBJQUxPQUQ6CisgICAgICAgICAgICBjYXNlIEJBTE9BRDoKKyAgICAgICAgICAgIGNhc2UgQ0FMT0FEOgorICAgICAgICAgICAgY2FzZSBTQUxPQUQ6CisgICAgICAgICAgICBjYXNlIElBREQ6CisgICAgICAgICAgICBjYXNlIElTVUI6CisgICAgICAgICAgICBjYXNlIElNVUw6CisgICAgICAgICAgICBjYXNlIElESVY6CisgICAgICAgICAgICBjYXNlIElSRU06CisgICAgICAgICAgICBjYXNlIElTSEw6CisgICAgICAgICAgICBjYXNlIElTSFI6CisgICAgICAgICAgICBjYXNlIElVU0hSOgorICAgICAgICAgICAgY2FzZSBJQU5EOgorICAgICAgICAgICAgY2FzZSBJT1I6CisgICAgICAgICAgICBjYXNlIElYT1I6CisgICAgICAgICAgICAgICAgcmV0dXJuIEJhc2ljVmFsdWUuSU5UX1ZBTFVFOworICAgICAgICAgICAgY2FzZSBGQUxPQUQ6CisgICAgICAgICAgICBjYXNlIEZBREQ6CisgICAgICAgICAgICBjYXNlIEZTVUI6CisgICAgICAgICAgICBjYXNlIEZNVUw6CisgICAgICAgICAgICBjYXNlIEZESVY6CisgICAgICAgICAgICBjYXNlIEZSRU06CisgICAgICAgICAgICAgICAgcmV0dXJuIEJhc2ljVmFsdWUuRkxPQVRfVkFMVUU7CisgICAgICAgICAgICBjYXNlIExBTE9BRDoKKyAgICAgICAgICAgIGNhc2UgTEFERDoKKyAgICAgICAgICAgIGNhc2UgTFNVQjoKKyAgICAgICAgICAgIGNhc2UgTE1VTDoKKyAgICAgICAgICAgIGNhc2UgTERJVjoKKyAgICAgICAgICAgIGNhc2UgTFJFTToKKyAgICAgICAgICAgIGNhc2UgTFNITDoKKyAgICAgICAgICAgIGNhc2UgTFNIUjoKKyAgICAgICAgICAgIGNhc2UgTFVTSFI6CisgICAgICAgICAgICBjYXNlIExBTkQ6CisgICAgICAgICAgICBjYXNlIExPUjoKKyAgICAgICAgICAgIGNhc2UgTFhPUjoKKyAgICAgICAgICAgICAgICByZXR1cm4gQmFzaWNWYWx1ZS5MT05HX1ZBTFVFOworICAgICAgICAgICAgY2FzZSBEQUxPQUQ6CisgICAgICAgICAgICBjYXNlIERBREQ6CisgICAgICAgICAgICBjYXNlIERTVUI6CisgICAgICAgICAgICBjYXNlIERNVUw6CisgICAgICAgICAgICBjYXNlIERESVY6CisgICAgICAgICAgICBjYXNlIERSRU06CisgICAgICAgICAgICAgICAgcmV0dXJuIEJhc2ljVmFsdWUuRE9VQkxFX1ZBTFVFOworICAgICAgICAgICAgY2FzZSBBQUxPQUQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIEJhc2ljVmFsdWUuUkVGRVJFTkNFX1ZBTFVFOworICAgICAgICAgICAgY2FzZSBMQ01QOgorICAgICAgICAgICAgY2FzZSBGQ01QTDoKKyAgICAgICAgICAgIGNhc2UgRkNNUEc6CisgICAgICAgICAgICBjYXNlIERDTVBMOgorICAgICAgICAgICAgY2FzZSBEQ01QRzoKKyAgICAgICAgICAgICAgICByZXR1cm4gQmFzaWNWYWx1ZS5JTlRfVkFMVUU7CisgICAgICAgICAgICBjYXNlIElGX0lDTVBFUToKKyAgICAgICAgICAgIGNhc2UgSUZfSUNNUE5FOgorICAgICAgICAgICAgY2FzZSBJRl9JQ01QTFQ6CisgICAgICAgICAgICBjYXNlIElGX0lDTVBHRToKKyAgICAgICAgICAgIGNhc2UgSUZfSUNNUEdUOgorICAgICAgICAgICAgY2FzZSBJRl9JQ01QTEU6CisgICAgICAgICAgICBjYXNlIElGX0FDTVBFUToKKyAgICAgICAgICAgIGNhc2UgSUZfQUNNUE5FOgorICAgICAgICAgICAgY2FzZSBQVVRGSUVMRDoKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJJbnRlcm5hbCBlcnJvci4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCYXNpY1ZhbHVlIHRlcm5hcnlPcGVyYXRpb24oCisgICAgICAgIGZpbmFsIEFic3RyYWN0SW5zbk5vZGUgaW5zbiwKKyAgICAgICAgZmluYWwgQmFzaWNWYWx1ZSB2YWx1ZTEsCisgICAgICAgIGZpbmFsIEJhc2ljVmFsdWUgdmFsdWUyLAorICAgICAgICBmaW5hbCBCYXNpY1ZhbHVlIHZhbHVlMykgdGhyb3dzIEFuYWx5emVyRXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQmFzaWNWYWx1ZSBuYXJ5T3BlcmF0aW9uKGZpbmFsIEFic3RyYWN0SW5zbk5vZGUgaW5zbiwgZmluYWwgTGlzdDw/IGV4dGVuZHMgQmFzaWNWYWx1ZT4gdmFsdWVzKQorICAgICAgICAgICAgdGhyb3dzIEFuYWx5emVyRXhjZXB0aW9uCisgICAgeworICAgICAgICBpbnQgb3Bjb2RlID0gaW5zbi5nZXRPcGNvZGUoKTsKKyAgICAgICAgaWYgKG9wY29kZSA9PSBNVUxUSUFORVdBUlJBWSkgeworICAgICAgICAgICAgcmV0dXJuIG5ld1ZhbHVlKFR5cGUuZ2V0VHlwZSgoKE11bHRpQU5ld0FycmF5SW5zbk5vZGUpIGluc24pLmRlc2MpKTsKKyAgICAgICAgfSBlbHNlIGlmIChvcGNvZGUgPT0gSU5WT0tFRFlOQU1JQyl7CisgICAgICAgICAgICByZXR1cm4gbmV3VmFsdWUoVHlwZS5nZXRSZXR1cm5UeXBlKCgoSW52b2tlRHluYW1pY0luc25Ob2RlKSBpbnNuKS5kZXNjKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbmV3VmFsdWUoVHlwZS5nZXRSZXR1cm5UeXBlKCgoTWV0aG9kSW5zbk5vZGUpIGluc24pLmRlc2MpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJldHVybk9wZXJhdGlvbigKKyAgICAgICAgZmluYWwgQWJzdHJhY3RJbnNuTm9kZSBpbnNuLAorICAgICAgICBmaW5hbCBCYXNpY1ZhbHVlIHZhbHVlLAorICAgICAgICBmaW5hbCBCYXNpY1ZhbHVlIGV4cGVjdGVkKSB0aHJvd3MgQW5hbHl6ZXJFeGNlcHRpb24KKyAgICB7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJhc2ljVmFsdWUgbWVyZ2UoZmluYWwgQmFzaWNWYWx1ZSB2LCBmaW5hbCBCYXNpY1ZhbHVlIHcpIHsKKyAgICAgICAgaWYgKCF2LmVxdWFscyh3KSkgeworICAgICAgICAgICAgcmV0dXJuIEJhc2ljVmFsdWUuVU5JTklUSUFMSVpFRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL3RyZWUvYW5hbHlzaXMvQmFzaWNWYWx1ZS5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS90cmVlL2FuYWx5c2lzL0Jhc2ljVmFsdWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTJmZDNkCi0tLSAvZGV2L251bGwKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS90cmVlL2FuYWx5c2lzL0Jhc2ljVmFsdWUuamF2YQpAQCAtMCwwICsxLDEzNyBAQAorLyoKKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgT3JhY2xlIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCisgKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CisgKiBxdWVzdGlvbnMuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBpcyBhdmFpbGFibGUgdW5kZXIgYW5kIGdvdmVybmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogSG93ZXZlciwgdGhlIGZvbGxvd2luZyBub3RpY2UgYWNjb21wYW5pZWQgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhpcworICogZmlsZToKKyAqCisgKiBBU006IGEgdmVyeSBzbWFsbCBhbmQgZmFzdCBKYXZhIGJ5dGVjb2RlIG1hbmlwdWxhdGlvbiBmcmFtZXdvcmsKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDExIElOUklBLCBGcmFuY2UgVGVsZWNvbQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS50cmVlLmFuYWx5c2lzOworCitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLlR5cGU7CisKKy8qKgorICogQSB7QGxpbmsgVmFsdWV9IHRoYXQgaXMgcmVwcmVzZW50ZWQgYnkgaXRzIHR5cGUgaW4gYSBzZXZlbiB0eXBlcyB0eXBlIHN5c3RlbS4KKyAqIFRoaXMgdHlwZSBzeXN0ZW0gZGlzdGluZ3Vpc2hlcyB0aGUgVU5JTklUSUFMWkVELCBJTlQsIEZMT0FULCBMT05HLCBET1VCTEUsCisgKiBSRUZFUkVOQ0UgYW5kIFJFVFVSTkFERFJFU1MgdHlwZXMuCisgKgorICogQGF1dGhvciBFcmljIEJydW5ldG9uCisgKi8KK3B1YmxpYyBjbGFzcyBCYXNpY1ZhbHVlIGltcGxlbWVudHMgVmFsdWUgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCYXNpY1ZhbHVlIFVOSU5JVElBTElaRURfVkFMVUUgPSBuZXcgQmFzaWNWYWx1ZShudWxsKTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQmFzaWNWYWx1ZSBJTlRfVkFMVUUgPSBuZXcgQmFzaWNWYWx1ZShUeXBlLklOVF9UWVBFKTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQmFzaWNWYWx1ZSBGTE9BVF9WQUxVRSA9IG5ldyBCYXNpY1ZhbHVlKFR5cGUuRkxPQVRfVFlQRSk7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJhc2ljVmFsdWUgTE9OR19WQUxVRSA9IG5ldyBCYXNpY1ZhbHVlKFR5cGUuTE9OR19UWVBFKTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQmFzaWNWYWx1ZSBET1VCTEVfVkFMVUUgPSBuZXcgQmFzaWNWYWx1ZShUeXBlLkRPVUJMRV9UWVBFKTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQmFzaWNWYWx1ZSBSRUZFUkVOQ0VfVkFMVUUgPSBuZXcgQmFzaWNWYWx1ZShUeXBlLmdldE9iamVjdFR5cGUoImphdmEvbGFuZy9PYmplY3QiKSk7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJhc2ljVmFsdWUgUkVUVVJOQUREUkVTU19WQUxVRSA9IG5ldyBCYXNpY1ZhbHVlKFR5cGUuVk9JRF9UWVBFKTsKKworICAgIHByaXZhdGUgZmluYWwgVHlwZSB0eXBlOworCisgICAgcHVibGljIEJhc2ljVmFsdWUoZmluYWwgVHlwZSB0eXBlKSB7CisgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgfQorCisgICAgcHVibGljIFR5cGUgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRTaXplKCkgeworICAgICAgICByZXR1cm4gdHlwZSA9PSBUeXBlLkxPTkdfVFlQRSB8fCB0eXBlID09IFR5cGUuRE9VQkxFX1RZUEUgPyAyIDogMTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JlZmVyZW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIHR5cGUgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmICh0eXBlLmdldFNvcnQoKSA9PSBUeXBlLk9CSkVDVCB8fCB0eXBlLmdldFNvcnQoKSA9PSBUeXBlLkFSUkFZKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoZmluYWwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIGlmICh2YWx1ZSA9PSB0aGlzKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEJhc2ljVmFsdWUpIHsKKyAgICAgICAgICAgIGlmICh0eXBlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKChCYXNpY1ZhbHVlKSB2YWx1ZSkudHlwZSA9PSBudWxsOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHlwZS5lcXVhbHMoKChCYXNpY1ZhbHVlKSB2YWx1ZSkudHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICByZXR1cm4gdHlwZSA9PSBudWxsID8gMCA6IHR5cGUuaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBpZiAodGhpcyA9PSBVTklOSVRJQUxJWkVEX1ZBTFVFKSB7CisgICAgICAgICAgICByZXR1cm4gIi4iOworICAgICAgICB9IGVsc2UgaWYgKHRoaXMgPT0gUkVUVVJOQUREUkVTU19WQUxVRSkgeworICAgICAgICAgICAgcmV0dXJuICJBIjsKKyAgICAgICAgfSBlbHNlIGlmICh0aGlzID09IFJFRkVSRU5DRV9WQUxVRSkgeworICAgICAgICAgICAgcmV0dXJuICJSIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiB0eXBlLmdldERlc2NyaXB0b3IoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vdHJlZS9hbmFseXNpcy9CYXNpY1ZlcmlmaWVyLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL3RyZWUvYW5hbHlzaXMvQmFzaWNWZXJpZmllci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiNTFiNGEKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL3RyZWUvYW5hbHlzaXMvQmFzaWNWZXJpZmllci5qYXZhCkBAIC0wLDAgKzEsNDg4IEBACisvKgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBPcmFjbGUgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKKyAqIHF1ZXN0aW9ucy4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGlzIGF2YWlsYWJsZSB1bmRlciBhbmQgZ292ZXJuZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiBIb3dldmVyLCB0aGUgZm9sbG93aW5nIG5vdGljZSBhY2NvbXBhbmllZCB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGlzCisgKiBmaWxlOgorICoKKyAqIEFTTTogYSB2ZXJ5IHNtYWxsIGFuZCBmYXN0IEphdmEgYnl0ZWNvZGUgbWFuaXB1bGF0aW9uIGZyYW1ld29yaworICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMTEgSU5SSUEsIEZyYW5jZSBUZWxlY29tCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2UgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLnRyZWUuYW5hbHlzaXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5UeXBlOworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS50cmVlLkFic3RyYWN0SW5zbk5vZGU7CitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLnRyZWUuRmllbGRJbnNuTm9kZTsKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20udHJlZS5JbnZva2VEeW5hbWljSW5zbk5vZGU7CitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLnRyZWUuTWV0aG9kSW5zbk5vZGU7CisKKy8qKgorICogQW4gZXh0ZW5kZWQge0BsaW5rIEJhc2ljSW50ZXJwcmV0ZXJ9IHRoYXQgY2hlY2tzIHRoYXQgYnl0ZWNvZGUgaW5zdHJ1Y3Rpb25zCisgKiBhcmUgY29ycmVjdGx5IHVzZWQuCisgKgorICogQGF1dGhvciBFcmljIEJydW5ldG9uCisgKiBAYXV0aG9yIEJpbmcgUmFuCisgKi8KK3B1YmxpYyBjbGFzcyBCYXNpY1ZlcmlmaWVyIGV4dGVuZHMgQmFzaWNJbnRlcnByZXRlciB7CisKKyAgICBwdWJsaWMgQmFzaWNWZXJpZmllcigpIHsKKyAgICAgICAgc3VwZXIoQVNNNCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIEJhc2ljVmVyaWZpZXIoZmluYWwgaW50IGFwaSkgeworICAgICAgICBzdXBlcihhcGkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCYXNpY1ZhbHVlIGNvcHlPcGVyYXRpb24oZmluYWwgQWJzdHJhY3RJbnNuTm9kZSBpbnNuLCBmaW5hbCBCYXNpY1ZhbHVlIHZhbHVlKQorICAgICAgICAgICAgdGhyb3dzIEFuYWx5emVyRXhjZXB0aW9uCisgICAgeworICAgICAgICBWYWx1ZSBleHBlY3RlZDsKKyAgICAgICAgc3dpdGNoIChpbnNuLmdldE9wY29kZSgpKSB7CisgICAgICAgICAgICBjYXNlIElMT0FEOgorICAgICAgICAgICAgY2FzZSBJU1RPUkU6CisgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBCYXNpY1ZhbHVlLklOVF9WQUxVRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRkxPQUQ6CisgICAgICAgICAgICBjYXNlIEZTVE9SRToKKyAgICAgICAgICAgICAgICBleHBlY3RlZCA9IEJhc2ljVmFsdWUuRkxPQVRfVkFMVUU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIExMT0FEOgorICAgICAgICAgICAgY2FzZSBMU1RPUkU6CisgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBCYXNpY1ZhbHVlLkxPTkdfVkFMVUU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERMT0FEOgorICAgICAgICAgICAgY2FzZSBEU1RPUkU6CisgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBCYXNpY1ZhbHVlLkRPVUJMRV9WQUxVRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQUxPQUQ6CisgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZS5pc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBbmFseXplckV4Y2VwdGlvbihpbnNuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFuIG9iamVjdCByZWZlcmVuY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICAgICAgY2FzZSBBU1RPUkU6CisgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZS5pc1JlZmVyZW5jZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAhQmFzaWNWYWx1ZS5SRVRVUk5BRERSRVNTX1ZBTFVFLmVxdWFscyh2YWx1ZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQW5hbHl6ZXJFeGNlcHRpb24oaW5zbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbiBvYmplY3QgcmVmZXJlbmNlIG9yIGEgcmV0dXJuIGFkZHJlc3MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFleHBlY3RlZC5lcXVhbHModmFsdWUpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQW5hbHl6ZXJFeGNlcHRpb24oaW5zbiwgbnVsbCwgZXhwZWN0ZWQsIHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJhc2ljVmFsdWUgdW5hcnlPcGVyYXRpb24oZmluYWwgQWJzdHJhY3RJbnNuTm9kZSBpbnNuLCBmaW5hbCBCYXNpY1ZhbHVlIHZhbHVlKQorICAgICAgICAgICAgdGhyb3dzIEFuYWx5emVyRXhjZXB0aW9uCisgICAgeworICAgICAgICBCYXNpY1ZhbHVlIGV4cGVjdGVkOworICAgICAgICBzd2l0Y2ggKGluc24uZ2V0T3Bjb2RlKCkpIHsKKyAgICAgICAgICAgIGNhc2UgSU5FRzoKKyAgICAgICAgICAgIGNhc2UgSUlOQzoKKyAgICAgICAgICAgIGNhc2UgSTJGOgorICAgICAgICAgICAgY2FzZSBJMkw6CisgICAgICAgICAgICBjYXNlIEkyRDoKKyAgICAgICAgICAgIGNhc2UgSTJCOgorICAgICAgICAgICAgY2FzZSBJMkM6CisgICAgICAgICAgICBjYXNlIEkyUzoKKyAgICAgICAgICAgIGNhc2UgSUZFUToKKyAgICAgICAgICAgIGNhc2UgSUZORToKKyAgICAgICAgICAgIGNhc2UgSUZMVDoKKyAgICAgICAgICAgIGNhc2UgSUZHRToKKyAgICAgICAgICAgIGNhc2UgSUZHVDoKKyAgICAgICAgICAgIGNhc2UgSUZMRToKKyAgICAgICAgICAgIGNhc2UgVEFCTEVTV0lUQ0g6CisgICAgICAgICAgICBjYXNlIExPT0tVUFNXSVRDSDoKKyAgICAgICAgICAgIGNhc2UgSVJFVFVSTjoKKyAgICAgICAgICAgIGNhc2UgTkVXQVJSQVk6CisgICAgICAgICAgICBjYXNlIEFORVdBUlJBWToKKyAgICAgICAgICAgICAgICBleHBlY3RlZCA9IEJhc2ljVmFsdWUuSU5UX1ZBTFVFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBGTkVHOgorICAgICAgICAgICAgY2FzZSBGMkk6CisgICAgICAgICAgICBjYXNlIEYyTDoKKyAgICAgICAgICAgIGNhc2UgRjJEOgorICAgICAgICAgICAgY2FzZSBGUkVUVVJOOgorICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gQmFzaWNWYWx1ZS5GTE9BVF9WQUxVRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTE5FRzoKKyAgICAgICAgICAgIGNhc2UgTDJJOgorICAgICAgICAgICAgY2FzZSBMMkY6CisgICAgICAgICAgICBjYXNlIEwyRDoKKyAgICAgICAgICAgIGNhc2UgTFJFVFVSTjoKKyAgICAgICAgICAgICAgICBleHBlY3RlZCA9IEJhc2ljVmFsdWUuTE9OR19WQUxVRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRE5FRzoKKyAgICAgICAgICAgIGNhc2UgRDJJOgorICAgICAgICAgICAgY2FzZSBEMkY6CisgICAgICAgICAgICBjYXNlIEQyTDoKKyAgICAgICAgICAgIGNhc2UgRFJFVFVSTjoKKyAgICAgICAgICAgICAgICBleHBlY3RlZCA9IEJhc2ljVmFsdWUuRE9VQkxFX1ZBTFVFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBHRVRGSUVMRDoKKyAgICAgICAgICAgICAgICBleHBlY3RlZCA9IG5ld1ZhbHVlKFR5cGUuZ2V0T2JqZWN0VHlwZSgoKEZpZWxkSW5zbk5vZGUpIGluc24pLm93bmVyKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENIRUNLQ0FTVDoKKyAgICAgICAgICAgICAgICBpZiAoIXZhbHVlLmlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFuYWx5emVyRXhjZXB0aW9uKGluc24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYW4gb2JqZWN0IHJlZmVyZW5jZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIudW5hcnlPcGVyYXRpb24oaW5zbiwgdmFsdWUpOworICAgICAgICAgICAgY2FzZSBBUlJBWUxFTkdUSDoKKyAgICAgICAgICAgICAgICBpZiAoIWlzQXJyYXlWYWx1ZSh2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFuYWx5emVyRXhjZXB0aW9uKGluc24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYW4gYXJyYXkgcmVmZXJlbmNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci51bmFyeU9wZXJhdGlvbihpbnNuLCB2YWx1ZSk7CisgICAgICAgICAgICBjYXNlIEFSRVRVUk46CisgICAgICAgICAgICBjYXNlIEFUSFJPVzoKKyAgICAgICAgICAgIGNhc2UgSU5TVEFOQ0VPRjoKKyAgICAgICAgICAgIGNhc2UgTU9OSVRPUkVOVEVSOgorICAgICAgICAgICAgY2FzZSBNT05JVE9SRVhJVDoKKyAgICAgICAgICAgIGNhc2UgSUZOVUxMOgorICAgICAgICAgICAgY2FzZSBJRk5PTk5VTEw6CisgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZS5pc1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBbmFseXplckV4Y2VwdGlvbihpbnNuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFuIG9iamVjdCByZWZlcmVuY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnVuYXJ5T3BlcmF0aW9uKGluc24sIHZhbHVlKTsKKyAgICAgICAgICAgIGNhc2UgUFVUU1RBVElDOgorICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gbmV3VmFsdWUoVHlwZS5nZXRUeXBlKCgoRmllbGRJbnNuTm9kZSkgaW5zbikuZGVzYykpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkludGVybmFsIGVycm9yLiIpOworICAgICAgICB9CisgICAgICAgIGlmICghaXNTdWJUeXBlT2YodmFsdWUsIGV4cGVjdGVkKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEFuYWx5emVyRXhjZXB0aW9uKGluc24sIG51bGwsIGV4cGVjdGVkLCB2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLnVuYXJ5T3BlcmF0aW9uKGluc24sIHZhbHVlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQmFzaWNWYWx1ZSBiaW5hcnlPcGVyYXRpb24oCisgICAgICAgIGZpbmFsIEFic3RyYWN0SW5zbk5vZGUgaW5zbiwKKyAgICAgICAgZmluYWwgQmFzaWNWYWx1ZSB2YWx1ZTEsCisgICAgICAgIGZpbmFsIEJhc2ljVmFsdWUgdmFsdWUyKSB0aHJvd3MgQW5hbHl6ZXJFeGNlcHRpb24KKyAgICB7CisgICAgICAgIEJhc2ljVmFsdWUgZXhwZWN0ZWQxOworICAgICAgICBCYXNpY1ZhbHVlIGV4cGVjdGVkMjsKKyAgICAgICAgc3dpdGNoIChpbnNuLmdldE9wY29kZSgpKSB7CisgICAgICAgICAgICBjYXNlIElBTE9BRDoKKyAgICAgICAgICAgICAgICBleHBlY3RlZDEgPSBuZXdWYWx1ZShUeXBlLmdldFR5cGUoIltJIikpOworICAgICAgICAgICAgICAgIGV4cGVjdGVkMiA9IEJhc2ljVmFsdWUuSU5UX1ZBTFVFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQUxPQUQ6CisgICAgICAgICAgICAgICAgaWYgKGlzU3ViVHlwZU9mKHZhbHVlMSwgbmV3VmFsdWUoVHlwZS5nZXRUeXBlKCJbWiIpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQxID0gbmV3VmFsdWUoVHlwZS5nZXRUeXBlKCJbWiIpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBleHBlY3RlZDEgPSBuZXdWYWx1ZShUeXBlLmdldFR5cGUoIltCIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBleHBlY3RlZDIgPSBCYXNpY1ZhbHVlLklOVF9WQUxVRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ0FMT0FEOgorICAgICAgICAgICAgICAgIGV4cGVjdGVkMSA9IG5ld1ZhbHVlKFR5cGUuZ2V0VHlwZSgiW0MiKSk7CisgICAgICAgICAgICAgICAgZXhwZWN0ZWQyID0gQmFzaWNWYWx1ZS5JTlRfVkFMVUU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNBTE9BRDoKKyAgICAgICAgICAgICAgICBleHBlY3RlZDEgPSBuZXdWYWx1ZShUeXBlLmdldFR5cGUoIltTIikpOworICAgICAgICAgICAgICAgIGV4cGVjdGVkMiA9IEJhc2ljVmFsdWUuSU5UX1ZBTFVFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBMQUxPQUQ6CisgICAgICAgICAgICAgICAgZXhwZWN0ZWQxID0gbmV3VmFsdWUoVHlwZS5nZXRUeXBlKCJbSiIpKTsKKyAgICAgICAgICAgICAgICBleHBlY3RlZDIgPSBCYXNpY1ZhbHVlLklOVF9WQUxVRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRkFMT0FEOgorICAgICAgICAgICAgICAgIGV4cGVjdGVkMSA9IG5ld1ZhbHVlKFR5cGUuZ2V0VHlwZSgiW0YiKSk7CisgICAgICAgICAgICAgICAgZXhwZWN0ZWQyID0gQmFzaWNWYWx1ZS5JTlRfVkFMVUU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERBTE9BRDoKKyAgICAgICAgICAgICAgICBleHBlY3RlZDEgPSBuZXdWYWx1ZShUeXBlLmdldFR5cGUoIltEIikpOworICAgICAgICAgICAgICAgIGV4cGVjdGVkMiA9IEJhc2ljVmFsdWUuSU5UX1ZBTFVFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBQUxPQUQ6CisgICAgICAgICAgICAgICAgZXhwZWN0ZWQxID0gbmV3VmFsdWUoVHlwZS5nZXRUeXBlKCJbTGphdmEvbGFuZy9PYmplY3Q7IikpOworICAgICAgICAgICAgICAgIGV4cGVjdGVkMiA9IEJhc2ljVmFsdWUuSU5UX1ZBTFVFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBJQUREOgorICAgICAgICAgICAgY2FzZSBJU1VCOgorICAgICAgICAgICAgY2FzZSBJTVVMOgorICAgICAgICAgICAgY2FzZSBJRElWOgorICAgICAgICAgICAgY2FzZSBJUkVNOgorICAgICAgICAgICAgY2FzZSBJU0hMOgorICAgICAgICAgICAgY2FzZSBJU0hSOgorICAgICAgICAgICAgY2FzZSBJVVNIUjoKKyAgICAgICAgICAgIGNhc2UgSUFORDoKKyAgICAgICAgICAgIGNhc2UgSU9SOgorICAgICAgICAgICAgY2FzZSBJWE9SOgorICAgICAgICAgICAgY2FzZSBJRl9JQ01QRVE6CisgICAgICAgICAgICBjYXNlIElGX0lDTVBORToKKyAgICAgICAgICAgIGNhc2UgSUZfSUNNUExUOgorICAgICAgICAgICAgY2FzZSBJRl9JQ01QR0U6CisgICAgICAgICAgICBjYXNlIElGX0lDTVBHVDoKKyAgICAgICAgICAgIGNhc2UgSUZfSUNNUExFOgorICAgICAgICAgICAgICAgIGV4cGVjdGVkMSA9IEJhc2ljVmFsdWUuSU5UX1ZBTFVFOworICAgICAgICAgICAgICAgIGV4cGVjdGVkMiA9IEJhc2ljVmFsdWUuSU5UX1ZBTFVFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBGQUREOgorICAgICAgICAgICAgY2FzZSBGU1VCOgorICAgICAgICAgICAgY2FzZSBGTVVMOgorICAgICAgICAgICAgY2FzZSBGRElWOgorICAgICAgICAgICAgY2FzZSBGUkVNOgorICAgICAgICAgICAgY2FzZSBGQ01QTDoKKyAgICAgICAgICAgIGNhc2UgRkNNUEc6CisgICAgICAgICAgICAgICAgZXhwZWN0ZWQxID0gQmFzaWNWYWx1ZS5GTE9BVF9WQUxVRTsKKyAgICAgICAgICAgICAgICBleHBlY3RlZDIgPSBCYXNpY1ZhbHVlLkZMT0FUX1ZBTFVFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBMQUREOgorICAgICAgICAgICAgY2FzZSBMU1VCOgorICAgICAgICAgICAgY2FzZSBMTVVMOgorICAgICAgICAgICAgY2FzZSBMRElWOgorICAgICAgICAgICAgY2FzZSBMUkVNOgorICAgICAgICAgICAgY2FzZSBMQU5EOgorICAgICAgICAgICAgY2FzZSBMT1I6CisgICAgICAgICAgICBjYXNlIExYT1I6CisgICAgICAgICAgICBjYXNlIExDTVA6CisgICAgICAgICAgICAgICAgZXhwZWN0ZWQxID0gQmFzaWNWYWx1ZS5MT05HX1ZBTFVFOworICAgICAgICAgICAgICAgIGV4cGVjdGVkMiA9IEJhc2ljVmFsdWUuTE9OR19WQUxVRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTFNITDoKKyAgICAgICAgICAgIGNhc2UgTFNIUjoKKyAgICAgICAgICAgIGNhc2UgTFVTSFI6CisgICAgICAgICAgICAgICAgZXhwZWN0ZWQxID0gQmFzaWNWYWx1ZS5MT05HX1ZBTFVFOworICAgICAgICAgICAgICAgIGV4cGVjdGVkMiA9IEJhc2ljVmFsdWUuSU5UX1ZBTFVFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEQUREOgorICAgICAgICAgICAgY2FzZSBEU1VCOgorICAgICAgICAgICAgY2FzZSBETVVMOgorICAgICAgICAgICAgY2FzZSBERElWOgorICAgICAgICAgICAgY2FzZSBEUkVNOgorICAgICAgICAgICAgY2FzZSBEQ01QTDoKKyAgICAgICAgICAgIGNhc2UgRENNUEc6CisgICAgICAgICAgICAgICAgZXhwZWN0ZWQxID0gQmFzaWNWYWx1ZS5ET1VCTEVfVkFMVUU7CisgICAgICAgICAgICAgICAgZXhwZWN0ZWQyID0gQmFzaWNWYWx1ZS5ET1VCTEVfVkFMVUU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIElGX0FDTVBFUToKKyAgICAgICAgICAgIGNhc2UgSUZfQUNNUE5FOgorICAgICAgICAgICAgICAgIGV4cGVjdGVkMSA9IEJhc2ljVmFsdWUuUkVGRVJFTkNFX1ZBTFVFOworICAgICAgICAgICAgICAgIGV4cGVjdGVkMiA9IEJhc2ljVmFsdWUuUkVGRVJFTkNFX1ZBTFVFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBQVVRGSUVMRDoKKyAgICAgICAgICAgICAgICBGaWVsZEluc25Ob2RlIGZpbiA9IChGaWVsZEluc25Ob2RlKSBpbnNuOworICAgICAgICAgICAgICAgIGV4cGVjdGVkMSA9IG5ld1ZhbHVlKFR5cGUuZ2V0T2JqZWN0VHlwZShmaW4ub3duZXIpKTsKKyAgICAgICAgICAgICAgICBleHBlY3RlZDIgPSBuZXdWYWx1ZShUeXBlLmdldFR5cGUoZmluLmRlc2MpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJJbnRlcm5hbCBlcnJvci4iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWlzU3ViVHlwZU9mKHZhbHVlMSwgZXhwZWN0ZWQxKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEFuYWx5emVyRXhjZXB0aW9uKGluc24sICJGaXJzdCBhcmd1bWVudCIsIGV4cGVjdGVkMSwgdmFsdWUxKTsKKyAgICAgICAgfSBlbHNlIGlmICghaXNTdWJUeXBlT2YodmFsdWUyLCBleHBlY3RlZDIpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQW5hbHl6ZXJFeGNlcHRpb24oaW5zbiwgIlNlY29uZCBhcmd1bWVudCIsIGV4cGVjdGVkMiwgdmFsdWUyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5zbi5nZXRPcGNvZGUoKSA9PSBBQUxPQUQpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRFbGVtZW50VmFsdWUodmFsdWUxKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBzdXBlci5iaW5hcnlPcGVyYXRpb24oaW5zbiwgdmFsdWUxLCB2YWx1ZTIpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJhc2ljVmFsdWUgdGVybmFyeU9wZXJhdGlvbigKKyAgICAgICAgZmluYWwgQWJzdHJhY3RJbnNuTm9kZSBpbnNuLAorICAgICAgICBmaW5hbCBCYXNpY1ZhbHVlIHZhbHVlMSwKKyAgICAgICAgZmluYWwgQmFzaWNWYWx1ZSB2YWx1ZTIsCisgICAgICAgIGZpbmFsIEJhc2ljVmFsdWUgdmFsdWUzKSB0aHJvd3MgQW5hbHl6ZXJFeGNlcHRpb24KKyAgICB7CisgICAgICAgIEJhc2ljVmFsdWUgZXhwZWN0ZWQxOworICAgICAgICBCYXNpY1ZhbHVlIGV4cGVjdGVkMzsKKyAgICAgICAgc3dpdGNoIChpbnNuLmdldE9wY29kZSgpKSB7CisgICAgICAgICAgICBjYXNlIElBU1RPUkU6CisgICAgICAgICAgICAgICAgZXhwZWN0ZWQxID0gbmV3VmFsdWUoVHlwZS5nZXRUeXBlKCJbSSIpKTsKKyAgICAgICAgICAgICAgICBleHBlY3RlZDMgPSBCYXNpY1ZhbHVlLklOVF9WQUxVRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkFTVE9SRToKKyAgICAgICAgICAgICAgICBpZiAoaXNTdWJUeXBlT2YodmFsdWUxLCBuZXdWYWx1ZShUeXBlLmdldFR5cGUoIltaIikpKSkgeworICAgICAgICAgICAgICAgICAgICBleHBlY3RlZDEgPSBuZXdWYWx1ZShUeXBlLmdldFR5cGUoIltaIikpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkMSA9IG5ld1ZhbHVlKFR5cGUuZ2V0VHlwZSgiW0IiKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGV4cGVjdGVkMyA9IEJhc2ljVmFsdWUuSU5UX1ZBTFVFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDQVNUT1JFOgorICAgICAgICAgICAgICAgIGV4cGVjdGVkMSA9IG5ld1ZhbHVlKFR5cGUuZ2V0VHlwZSgiW0MiKSk7CisgICAgICAgICAgICAgICAgZXhwZWN0ZWQzID0gQmFzaWNWYWx1ZS5JTlRfVkFMVUU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNBU1RPUkU6CisgICAgICAgICAgICAgICAgZXhwZWN0ZWQxID0gbmV3VmFsdWUoVHlwZS5nZXRUeXBlKCJbUyIpKTsKKyAgICAgICAgICAgICAgICBleHBlY3RlZDMgPSBCYXNpY1ZhbHVlLklOVF9WQUxVRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTEFTVE9SRToKKyAgICAgICAgICAgICAgICBleHBlY3RlZDEgPSBuZXdWYWx1ZShUeXBlLmdldFR5cGUoIltKIikpOworICAgICAgICAgICAgICAgIGV4cGVjdGVkMyA9IEJhc2ljVmFsdWUuTE9OR19WQUxVRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRkFTVE9SRToKKyAgICAgICAgICAgICAgICBleHBlY3RlZDEgPSBuZXdWYWx1ZShUeXBlLmdldFR5cGUoIltGIikpOworICAgICAgICAgICAgICAgIGV4cGVjdGVkMyA9IEJhc2ljVmFsdWUuRkxPQVRfVkFMVUU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERBU1RPUkU6CisgICAgICAgICAgICAgICAgZXhwZWN0ZWQxID0gbmV3VmFsdWUoVHlwZS5nZXRUeXBlKCJbRCIpKTsKKyAgICAgICAgICAgICAgICBleHBlY3RlZDMgPSBCYXNpY1ZhbHVlLkRPVUJMRV9WQUxVRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQUFTVE9SRToKKyAgICAgICAgICAgICAgICBleHBlY3RlZDEgPSB2YWx1ZTE7CisgICAgICAgICAgICAgICAgZXhwZWN0ZWQzID0gQmFzaWNWYWx1ZS5SRUZFUkVOQ0VfVkFMVUU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiSW50ZXJuYWwgZXJyb3IuIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFpc1N1YlR5cGVPZih2YWx1ZTEsIGV4cGVjdGVkMSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBBbmFseXplckV4Y2VwdGlvbihpbnNuLCAiRmlyc3QgYXJndW1lbnQiLCAiYSAiICsgZXhwZWN0ZWQxCisgICAgICAgICAgICAgICAgICAgICsgIiBhcnJheSByZWZlcmVuY2UiLCB2YWx1ZTEpOworICAgICAgICB9IGVsc2UgaWYgKCFCYXNpY1ZhbHVlLklOVF9WQUxVRS5lcXVhbHModmFsdWUyKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEFuYWx5emVyRXhjZXB0aW9uKGluc24sICJTZWNvbmQgYXJndW1lbnQiLAorICAgICAgICAgICAgICAgICAgICBCYXNpY1ZhbHVlLklOVF9WQUxVRSwKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUyKTsKKyAgICAgICAgfSBlbHNlIGlmICghaXNTdWJUeXBlT2YodmFsdWUzLCBleHBlY3RlZDMpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQW5hbHl6ZXJFeGNlcHRpb24oaW5zbiwgIlRoaXJkIGFyZ3VtZW50IiwgZXhwZWN0ZWQzLCB2YWx1ZTMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCYXNpY1ZhbHVlIG5hcnlPcGVyYXRpb24oZmluYWwgQWJzdHJhY3RJbnNuTm9kZSBpbnNuLCBmaW5hbCBMaXN0PD8gZXh0ZW5kcyBCYXNpY1ZhbHVlPiB2YWx1ZXMpCisgICAgICAgICAgICB0aHJvd3MgQW5hbHl6ZXJFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGludCBvcGNvZGUgPSBpbnNuLmdldE9wY29kZSgpOworICAgICAgICBpZiAob3Bjb2RlID09IE1VTFRJQU5FV0FSUkFZKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgICAgIGlmICghQmFzaWNWYWx1ZS5JTlRfVkFMVUUuZXF1YWxzKHZhbHVlcy5nZXQoaSkpKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBbmFseXplckV4Y2VwdGlvbihpbnNuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNWYWx1ZS5JTlRfVkFMVUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLmdldChpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IGkgPSAwOworICAgICAgICAgICAgaW50IGogPSAwOworICAgICAgICAgICAgaWYgKG9wY29kZSAhPSBJTlZPS0VTVEFUSUMgJiYgb3Bjb2RlICE9IElOVk9LRURZTkFNSUMpIHsKKyAgICAgICAgICAgICAgICBUeXBlIG93bmVyID0gVHlwZS5nZXRPYmplY3RUeXBlKCgoTWV0aG9kSW5zbk5vZGUpIGluc24pLm93bmVyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWlzU3ViVHlwZU9mKHZhbHVlcy5nZXQoaSsrKSwgbmV3VmFsdWUob3duZXIpKSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQW5hbHl6ZXJFeGNlcHRpb24oaW5zbiwgIk1ldGhvZCBvd25lciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3VmFsdWUob3duZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5nZXQoMCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmluZyBkZXNjID0gKG9wY29kZSA9PSBJTlZPS0VEWU5BTUlDKT8KKyAgICAgICAgICAgICAgICAgICAgKChJbnZva2VEeW5hbWljSW5zbk5vZGUpIGluc24pLmRlc2M6CisgICAgICAgICAgICAgICAgICAgICAgICAoKE1ldGhvZEluc25Ob2RlKSBpbnNuKS5kZXNjOworICAgICAgICAgICAgVHlwZVtdIGFyZ3MgPSBUeXBlLmdldEFyZ3VtZW50VHlwZXMoZGVzYyk7CisgICAgICAgICAgICB3aGlsZSAoaSA8IHZhbHVlcy5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICBCYXNpY1ZhbHVlIGV4cGVjdGVkID0gbmV3VmFsdWUoYXJnc1tqKytdKTsKKyAgICAgICAgICAgICAgICBCYXNpY1ZhbHVlIGVuY291bnRlcmVkID0gdmFsdWVzLmdldChpKyspOworICAgICAgICAgICAgICAgIGlmICghaXNTdWJUeXBlT2YoZW5jb3VudGVyZWQsIGV4cGVjdGVkKSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQW5hbHl6ZXJFeGNlcHRpb24oaW5zbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXJndW1lbnQgIiArIGosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb3VudGVyZWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIubmFyeU9wZXJhdGlvbihpbnNuLCB2YWx1ZXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJldHVybk9wZXJhdGlvbigKKyAgICAgICAgZmluYWwgQWJzdHJhY3RJbnNuTm9kZSBpbnNuLAorICAgICAgICBmaW5hbCBCYXNpY1ZhbHVlIHZhbHVlLAorICAgICAgICBmaW5hbCBCYXNpY1ZhbHVlIGV4cGVjdGVkKSB0aHJvd3MgQW5hbHl6ZXJFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGlmICghaXNTdWJUeXBlT2YodmFsdWUsIGV4cGVjdGVkKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEFuYWx5emVyRXhjZXB0aW9uKGluc24sCisgICAgICAgICAgICAgICAgICAgICJJbmNvbXBhdGlibGUgcmV0dXJuIHR5cGUiLAorICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNBcnJheVZhbHVlKGZpbmFsIEJhc2ljVmFsdWUgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlLmlzUmVmZXJlbmNlKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIEJhc2ljVmFsdWUgZ2V0RWxlbWVudFZhbHVlKGZpbmFsIEJhc2ljVmFsdWUgb2JqZWN0QXJyYXlWYWx1ZSkKKyAgICAgICAgICAgIHRocm93cyBBbmFseXplckV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIEJhc2ljVmFsdWUuUkVGRVJFTkNFX1ZBTFVFOworICAgIH0KKworICAgIHByb3RlY3RlZCBib29sZWFuIGlzU3ViVHlwZU9mKGZpbmFsIEJhc2ljVmFsdWUgdmFsdWUsIGZpbmFsIEJhc2ljVmFsdWUgZXhwZWN0ZWQpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlLmVxdWFscyhleHBlY3RlZCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS90cmVlL2FuYWx5c2lzL0ZyYW1lLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL3RyZWUvYW5hbHlzaXMvRnJhbWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjVkNGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS90cmVlL2FuYWx5c2lzL0ZyYW1lLmphdmEKQEAgLTAsMCArMSw3MzggQEAKKy8qCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IE9yYWNsZSBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQorICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQorICogcXVlc3Rpb25zLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgaXMgYXZhaWxhYmxlIHVuZGVyIGFuZCBnb3Zlcm5lZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIEhvd2V2ZXIsIHRoZSBmb2xsb3dpbmcgbm90aWNlIGFjY29tcGFuaWVkIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoaXMKKyAqIGZpbGU6CisgKgorICogQVNNOiBhIHZlcnkgc21hbGwgYW5kIGZhc3QgSmF2YSBieXRlY29kZSBtYW5pcHVsYXRpb24gZnJhbWV3b3JrCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAxMSBJTlJJQSwgRnJhbmNlIFRlbGVjb20KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20udHJlZS5hbmFseXNpczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uT3Bjb2RlczsKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uVHlwZTsKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20udHJlZS5BYnN0cmFjdEluc25Ob2RlOworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS50cmVlLklpbmNJbnNuTm9kZTsKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20udHJlZS5JbnZva2VEeW5hbWljSW5zbk5vZGU7CitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLnRyZWUuTWV0aG9kSW5zbk5vZGU7CitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLnRyZWUuTXVsdGlBTmV3QXJyYXlJbnNuTm9kZTsKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20udHJlZS5WYXJJbnNuTm9kZTsKKworLyoqCisgKiBBIHN5bWJvbGljIGV4ZWN1dGlvbiBzdGFjayBmcmFtZS4gQSBzdGFjayBmcmFtZSBjb250YWlucyBhIHNldCBvZiBsb2NhbAorICogdmFyaWFibGUgc2xvdHMsIGFuZCBhbiBvcGVyYW5kIHN0YWNrLiBXYXJuaW5nOiBsb25nIGFuZCBkb3VibGUgdmFsdWVzIGFyZQorICogcmVwcmVzZW50ZWQgYnkgPGk+dHdvPC9pPiBzbG90cyBpbiBsb2NhbCB2YXJpYWJsZXMsIGFuZCBieSA8aT5vbmU8L2k+IHNsb3QKKyAqIGluIHRoZSBvcGVyYW5kIHN0YWNrLgorICoKKyAqIEBwYXJhbSA8Vj4gdHlwZSBvZiB0aGUgVmFsdWUgdXNlZCBmb3IgdGhlIGFuYWx5c2lzLgorICoKKyAqIEBhdXRob3IgRXJpYyBCcnVuZXRvbgorICovCitwdWJsaWMgY2xhc3MgRnJhbWU8ViBleHRlbmRzIFZhbHVlPiB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZXhwZWN0ZWQgcmV0dXJuIHR5cGUgb2YgdGhlIGFuYWx5emVkIG1ldGhvZCwgb3IgPHR0Pm51bGw8L3R0PiBpZiB0aGUKKyAgICAgKiBtZXRob2QgcmV0dXJucyB2b2lkLgorICAgICAqLworICAgIHByaXZhdGUgViByZXR1cm5WYWx1ZTsKKworICAgIC8qKgorICAgICAqIFRoZSBsb2NhbCB2YXJpYWJsZXMgYW5kIG9wZXJhbmQgc3RhY2sgb2YgdGhpcyBmcmFtZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFZbXSB2YWx1ZXM7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbnVtYmVyIG9mIGxvY2FsIHZhcmlhYmxlcyBvZiB0aGlzIGZyYW1lLgorICAgICAqLworICAgIHByaXZhdGUgaW50IGxvY2FsczsKKworICAgIC8qKgorICAgICAqIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIG9wZXJhbmQgc3RhY2suCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgdG9wOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBmcmFtZSB3aXRoIHRoZSBnaXZlbiBzaXplLgorICAgICAqCisgICAgICogQHBhcmFtIG5Mb2NhbHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGxvY2FsIHZhcmlhYmxlcyBvZiB0aGUgZnJhbWUuCisgICAgICogQHBhcmFtIG5TdGFjayB0aGUgbWF4aW11bSBzdGFjayBzaXplIG9mIHRoZSBmcmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRnJhbWUoZmluYWwgaW50IG5Mb2NhbHMsIGZpbmFsIGludCBuU3RhY2spIHsKKyAgICAgICAgdGhpcy52YWx1ZXMgPSAoVltdKSBuZXcgVmFsdWVbbkxvY2FscyArIG5TdGFja107CisgICAgICAgIHRoaXMubG9jYWxzID0gbkxvY2FsczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGZyYW1lIHRoYXQgaXMgaWRlbnRpY2FsIHRvIHRoZSBnaXZlbiBmcmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzcmMgYSBmcmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRnJhbWUoZmluYWwgRnJhbWU8PyBleHRlbmRzIFY+IHNyYykgeworICAgICAgICB0aGlzKHNyYy5sb2NhbHMsIHNyYy52YWx1ZXMubGVuZ3RoIC0gc3JjLmxvY2Fscyk7CisgICAgICAgIGluaXQoc3JjKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb3BpZXMgdGhlIHN0YXRlIG9mIHRoZSBnaXZlbiBmcmFtZSBpbnRvIHRoaXMgZnJhbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3JjIGEgZnJhbWUuCisgICAgICogQHJldHVybiB0aGlzIGZyYW1lLgorICAgICAqLworICAgIHB1YmxpYyBGcmFtZTxWPiBpbml0KGZpbmFsIEZyYW1lPD8gZXh0ZW5kcyBWPiBzcmMpIHsKKyAgICAgICAgcmV0dXJuVmFsdWUgPSBzcmMucmV0dXJuVmFsdWU7CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoc3JjLnZhbHVlcywgMCwgdmFsdWVzLCAwLCB2YWx1ZXMubGVuZ3RoKTsKKyAgICAgICAgdG9wID0gc3JjLnRvcDsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgZXhwZWN0ZWQgcmV0dXJuIHR5cGUgb2YgdGhlIGFuYWx5emVkIG1ldGhvZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2IHRoZSBleHBlY3RlZCByZXR1cm4gdHlwZSBvZiB0aGUgYW5hbHl6ZWQgbWV0aG9kLCBvcgorICAgICAqICAgICAgICA8dHQ+bnVsbDwvdHQ+IGlmIHRoZSBtZXRob2QgcmV0dXJucyB2b2lkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJldHVybihmaW5hbCBWIHYpIHsKKyAgICAgICAgcmV0dXJuVmFsdWUgPSB2OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGxvY2FsIHZhcmlhYmxlcyBvZiB0aGlzIGZyYW1lLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbWF4aW11bSBudW1iZXIgb2YgbG9jYWwgdmFyaWFibGVzIG9mIHRoaXMgZnJhbWUuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRMb2NhbHMoKSB7CisgICAgICAgIHJldHVybiBsb2NhbHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGxvY2FsIHZhcmlhYmxlLgorICAgICAqCisgICAgICogQHBhcmFtIGkgYSBsb2NhbCB2YXJpYWJsZSBpbmRleC4KKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gbG9jYWwgdmFyaWFibGUuCisgICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIHRoZSB2YXJpYWJsZSBkb2VzIG5vdCBleGlzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgViBnZXRMb2NhbChmaW5hbCBpbnQgaSkgdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24geworICAgICAgICBpZiAoaSA+PSBsb2NhbHMpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCJUcnlpbmcgdG8gYWNjZXNzIGFuIGluZXhpc3RhbnQgbG9jYWwgdmFyaWFibGUiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdmFsdWVzW2ldOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBsb2NhbCB2YXJpYWJsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpIGEgbG9jYWwgdmFyaWFibGUgaW5kZXguCisgICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhpcyBsb2NhbCB2YXJpYWJsZS4KKyAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgdGhlIHZhcmlhYmxlIGRvZXMgbm90IGV4aXN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExvY2FsKGZpbmFsIGludCBpLCBmaW5hbCBWIHZhbHVlKQorICAgICAgICAgICAgdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGlmIChpID49IGxvY2FscykgeworICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oIlRyeWluZyB0byBhY2Nlc3MgYW4gaW5leGlzdGFudCBsb2NhbCB2YXJpYWJsZSAiK2kpOworICAgICAgICB9CisgICAgICAgIHZhbHVlc1tpXSA9IHZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiB2YWx1ZXMgaW4gdGhlIG9wZXJhbmQgc3RhY2sgb2YgdGhpcyBmcmFtZS4gTG9uZyBhbmQKKyAgICAgKiBkb3VibGUgdmFsdWVzIGFyZSB0cmVhdGVkIGFzIHNpbmdsZSB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgdmFsdWVzIGluIHRoZSBvcGVyYW5kIHN0YWNrIG9mIHRoaXMgZnJhbWUuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRTdGFja1NpemUoKSB7CisgICAgICAgIHJldHVybiB0b3A7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIG9wZXJhbmQgc3RhY2sgc2xvdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpIHRoZSBpbmRleCBvZiBhbiBvcGVyYW5kIHN0YWNrIHNsb3QuCisgICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIG9wZXJhbmQgc3RhY2sgc2xvdC4KKyAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgdGhlIG9wZXJhbmQgc3RhY2sgc2xvdCBkb2VzIG5vdAorICAgICAqICAgICAgICAgZXhpc3QuCisgICAgICovCisgICAgcHVibGljIFYgZ2V0U3RhY2soZmluYWwgaW50IGkpIHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlc1tpICsgbG9jYWxzXTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbGVhcnMgdGhlIG9wZXJhbmQgc3RhY2sgb2YgdGhpcyBmcmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbGVhclN0YWNrKCkgeworICAgICAgICB0b3AgPSAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBvcHMgYSB2YWx1ZSBmcm9tIHRoZSBvcGVyYW5kIHN0YWNrIG9mIHRoaXMgZnJhbWUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSB0aGF0IGhhcyBiZWVuIHBvcHBlZCBmcm9tIHRoZSBzdGFjay4KKyAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgdGhlIG9wZXJhbmQgc3RhY2sgaXMgZW1wdHkuCisgICAgICovCisgICAgcHVibGljIFYgcG9wKCkgdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24geworICAgICAgICBpZiAodG9wID09IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCJDYW5ub3QgcG9wIG9wZXJhbmQgb2ZmIGFuIGVtcHR5IHN0YWNrLiIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB2YWx1ZXNbLS10b3AgKyBsb2NhbHNdOworICAgIH0KKworICAgIC8qKgorICAgICAqIFB1c2hlcyBhIHZhbHVlIGludG8gdGhlIG9wZXJhbmQgc3RhY2sgb2YgdGhpcyBmcmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdGhhdCBtdXN0IGJlIHB1c2hlZCBpbnRvIHRoZSBzdGFjay4KKyAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgdGhlIG9wZXJhbmQgc3RhY2sgaXMgZnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwdXNoKGZpbmFsIFYgdmFsdWUpIHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHRvcCArIGxvY2FscyA+PSB2YWx1ZXMubGVuZ3RoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigiSW5zdWZmaWNpZW50IG1heGltdW0gc3RhY2sgc2l6ZS4iKTsKKyAgICAgICAgfQorICAgICAgICB2YWx1ZXNbdG9wKysgKyBsb2NhbHNdID0gdmFsdWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgKKyAgICAgICAgZmluYWwgQWJzdHJhY3RJbnNuTm9kZSBpbnNuLAorICAgICAgICBmaW5hbCBJbnRlcnByZXRlcjxWPiBpbnRlcnByZXRlcikgdGhyb3dzIEFuYWx5emVyRXhjZXB0aW9uCisgICAgeworICAgICAgICBWIHZhbHVlMSwgdmFsdWUyLCB2YWx1ZTMsIHZhbHVlNDsKKyAgICAgICAgTGlzdDxWPiB2YWx1ZXM7CisgICAgICAgIGludCB2YXI7CisKKyAgICAgICAgc3dpdGNoIChpbnNuLmdldE9wY29kZSgpKSB7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuTk9QOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkFDT05TVF9OVUxMOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLklDT05TVF9NMToKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JQ09OU1RfMDoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JQ09OU1RfMToKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JQ09OU1RfMjoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JQ09OU1RfMzoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JQ09OU1RfNDoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JQ09OU1RfNToKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5MQ09OU1RfMDoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5MQ09OU1RfMToKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5GQ09OU1RfMDoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5GQ09OU1RfMToKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5GQ09OU1RfMjoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5EQ09OU1RfMDoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5EQ09OU1RfMToKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5CSVBVU0g6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuU0lQVVNIOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkxEQzoKKyAgICAgICAgICAgICAgICBwdXNoKGludGVycHJldGVyLm5ld09wZXJhdGlvbihpbnNuKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSUxPQUQ6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuTExPQUQ6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRkxPQUQ6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRExPQUQ6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuQUxPQUQ6CisgICAgICAgICAgICAgICAgcHVzaChpbnRlcnByZXRlci5jb3B5T3BlcmF0aW9uKGluc24sCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2NhbCgoKFZhckluc25Ob2RlKSBpbnNuKS52YXIpKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSUFMT0FEOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkxBTE9BRDoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5GQUxPQUQ6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuREFMT0FEOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkFBTE9BRDoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5CQUxPQUQ6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuQ0FMT0FEOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLlNBTE9BRDoKKyAgICAgICAgICAgICAgICB2YWx1ZTIgPSBwb3AoKTsKKyAgICAgICAgICAgICAgICB2YWx1ZTEgPSBwb3AoKTsKKyAgICAgICAgICAgICAgICBwdXNoKGludGVycHJldGVyLmJpbmFyeU9wZXJhdGlvbihpbnNuLCB2YWx1ZTEsIHZhbHVlMikpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLklTVE9SRToKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5MU1RPUkU6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRlNUT1JFOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkRTVE9SRToKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5BU1RPUkU6CisgICAgICAgICAgICAgICAgdmFsdWUxID0gaW50ZXJwcmV0ZXIuY29weU9wZXJhdGlvbihpbnNuLCBwb3AoKSk7CisgICAgICAgICAgICAgICAgdmFyID0gKChWYXJJbnNuTm9kZSkgaW5zbikudmFyOworICAgICAgICAgICAgICAgIHNldExvY2FsKHZhciwgdmFsdWUxKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUxLmdldFNpemUoKSA9PSAyKSB7CisgICAgICAgICAgICAgICAgICAgIHNldExvY2FsKHZhciArIDEsIGludGVycHJldGVyLm5ld1ZhbHVlKG51bGwpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHZhciA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgVmFsdWUgbG9jYWwgPSBnZXRMb2NhbCh2YXIgLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsICE9IG51bGwgJiYgbG9jYWwuZ2V0U2l6ZSgpID09IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldExvY2FsKHZhciAtIDEsIGludGVycHJldGVyLm5ld1ZhbHVlKG51bGwpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JQVNUT1JFOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkxBU1RPUkU6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRkFTVE9SRToKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5EQVNUT1JFOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkFBU1RPUkU6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuQkFTVE9SRToKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5DQVNUT1JFOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLlNBU1RPUkU6CisgICAgICAgICAgICAgICAgdmFsdWUzID0gcG9wKCk7CisgICAgICAgICAgICAgICAgdmFsdWUyID0gcG9wKCk7CisgICAgICAgICAgICAgICAgdmFsdWUxID0gcG9wKCk7CisgICAgICAgICAgICAgICAgaW50ZXJwcmV0ZXIudGVybmFyeU9wZXJhdGlvbihpbnNuLCB2YWx1ZTEsIHZhbHVlMiwgdmFsdWUzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5QT1A6CisgICAgICAgICAgICAgICAgaWYgKHBvcCgpLmdldFNpemUoKSA9PSAyKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBbmFseXplckV4Y2VwdGlvbihpbnNuLCAiSWxsZWdhbCB1c2Ugb2YgUE9QIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLlBPUDI6CisgICAgICAgICAgICAgICAgaWYgKHBvcCgpLmdldFNpemUoKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwb3AoKS5nZXRTaXplKCkgIT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFuYWx5emVyRXhjZXB0aW9uKGluc24sICJJbGxlZ2FsIHVzZSBvZiBQT1AyIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRFVQOgorICAgICAgICAgICAgICAgIHZhbHVlMSA9IHBvcCgpOworICAgICAgICAgICAgICAgIGlmICh2YWx1ZTEuZ2V0U2l6ZSgpICE9IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFuYWx5emVyRXhjZXB0aW9uKGluc24sICJJbGxlZ2FsIHVzZSBvZiBEVVAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHVzaCh2YWx1ZTEpOworICAgICAgICAgICAgICAgIHB1c2goaW50ZXJwcmV0ZXIuY29weU9wZXJhdGlvbihpbnNuLCB2YWx1ZTEpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5EVVBfWDE6CisgICAgICAgICAgICAgICAgdmFsdWUxID0gcG9wKCk7CisgICAgICAgICAgICAgICAgdmFsdWUyID0gcG9wKCk7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlMS5nZXRTaXplKCkgIT0gMSB8fCB2YWx1ZTIuZ2V0U2l6ZSgpICE9IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFuYWx5emVyRXhjZXB0aW9uKGluc24sICJJbGxlZ2FsIHVzZSBvZiBEVVBfWDEiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHVzaChpbnRlcnByZXRlci5jb3B5T3BlcmF0aW9uKGluc24sIHZhbHVlMSkpOworICAgICAgICAgICAgICAgIHB1c2godmFsdWUyKTsKKyAgICAgICAgICAgICAgICBwdXNoKHZhbHVlMSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRFVQX1gyOgorICAgICAgICAgICAgICAgIHZhbHVlMSA9IHBvcCgpOworICAgICAgICAgICAgICAgIGlmICh2YWx1ZTEuZ2V0U2l6ZSgpID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUyID0gcG9wKCk7CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZTIuZ2V0U2l6ZSgpID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlMyA9IHBvcCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlMy5nZXRTaXplKCkgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2goaW50ZXJwcmV0ZXIuY29weU9wZXJhdGlvbihpbnNuLCB2YWx1ZTEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoKHZhbHVlMyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCh2YWx1ZTIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2godmFsdWUxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1c2goaW50ZXJwcmV0ZXIuY29weU9wZXJhdGlvbihpbnNuLCB2YWx1ZTEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1c2godmFsdWUyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1c2godmFsdWUxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBbmFseXplckV4Y2VwdGlvbihpbnNuLCAiSWxsZWdhbCB1c2Ugb2YgRFVQX1gyIik7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRFVQMjoKKyAgICAgICAgICAgICAgICB2YWx1ZTEgPSBwb3AoKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUxLmdldFNpemUoKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlMiA9IHBvcCgpOworICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUyLmdldFNpemUoKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwdXNoKHZhbHVlMik7CisgICAgICAgICAgICAgICAgICAgICAgICBwdXNoKHZhbHVlMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwdXNoKGludGVycHJldGVyLmNvcHlPcGVyYXRpb24oaW5zbiwgdmFsdWUyKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwdXNoKGludGVycHJldGVyLmNvcHlPcGVyYXRpb24oaW5zbiwgdmFsdWUxKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHB1c2godmFsdWUxKTsKKyAgICAgICAgICAgICAgICAgICAgcHVzaChpbnRlcnByZXRlci5jb3B5T3BlcmF0aW9uKGluc24sIHZhbHVlMSkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFuYWx5emVyRXhjZXB0aW9uKGluc24sICJJbGxlZ2FsIHVzZSBvZiBEVVAyIik7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRFVQMl9YMToKKyAgICAgICAgICAgICAgICB2YWx1ZTEgPSBwb3AoKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUxLmdldFNpemUoKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlMiA9IHBvcCgpOworICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUyLmdldFNpemUoKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTMgPSBwb3AoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZTMuZ2V0U2l6ZSgpID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoKGludGVycHJldGVyLmNvcHlPcGVyYXRpb24oaW5zbiwgdmFsdWUyKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaChpbnRlcnByZXRlci5jb3B5T3BlcmF0aW9uKGluc24sIHZhbHVlMSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2godmFsdWUzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoKHZhbHVlMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCh2YWx1ZTEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUyID0gcG9wKCk7CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZTIuZ2V0U2l6ZSgpID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1c2goaW50ZXJwcmV0ZXIuY29weU9wZXJhdGlvbihpbnNuLCB2YWx1ZTEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1c2godmFsdWUyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1c2godmFsdWUxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBbmFseXplckV4Y2VwdGlvbihpbnNuLCAiSWxsZWdhbCB1c2Ugb2YgRFVQMl9YMSIpOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkRVUDJfWDI6CisgICAgICAgICAgICAgICAgdmFsdWUxID0gcG9wKCk7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlMS5nZXRTaXplKCkgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICB2YWx1ZTIgPSBwb3AoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlMi5nZXRTaXplKCkgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUzID0gcG9wKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUzLmdldFNpemUoKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU0ID0gcG9wKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlNC5nZXRTaXplKCkgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoKGludGVycHJldGVyLmNvcHlPcGVyYXRpb24oaW5zbiwgdmFsdWUyKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2goaW50ZXJwcmV0ZXIuY29weU9wZXJhdGlvbihpbnNuLCB2YWx1ZTEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCh2YWx1ZTQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoKHZhbHVlMyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2godmFsdWUyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCh2YWx1ZTEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2goaW50ZXJwcmV0ZXIuY29weU9wZXJhdGlvbihpbnNuLCB2YWx1ZTIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoKGludGVycHJldGVyLmNvcHlPcGVyYXRpb24oaW5zbiwgdmFsdWUxKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCh2YWx1ZTMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2godmFsdWUyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoKHZhbHVlMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB2YWx1ZTIgPSBwb3AoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlMi5nZXRTaXplKCkgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUzID0gcG9wKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUzLmdldFNpemUoKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaChpbnRlcnByZXRlci5jb3B5T3BlcmF0aW9uKGluc24sIHZhbHVlMSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2godmFsdWUzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoKHZhbHVlMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCh2YWx1ZTEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcHVzaChpbnRlcnByZXRlci5jb3B5T3BlcmF0aW9uKGluc24sIHZhbHVlMSkpOworICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCh2YWx1ZTIpOworICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCh2YWx1ZTEpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFuYWx5emVyRXhjZXB0aW9uKGluc24sICJJbGxlZ2FsIHVzZSBvZiBEVVAyX1gyIik7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuU1dBUDoKKyAgICAgICAgICAgICAgICB2YWx1ZTIgPSBwb3AoKTsKKyAgICAgICAgICAgICAgICB2YWx1ZTEgPSBwb3AoKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUxLmdldFNpemUoKSAhPSAxIHx8IHZhbHVlMi5nZXRTaXplKCkgIT0gMSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQW5hbHl6ZXJFeGNlcHRpb24oaW5zbiwgIklsbGVnYWwgdXNlIG9mIFNXQVAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHVzaChpbnRlcnByZXRlci5jb3B5T3BlcmF0aW9uKGluc24sIHZhbHVlMikpOworICAgICAgICAgICAgICAgIHB1c2goaW50ZXJwcmV0ZXIuY29weU9wZXJhdGlvbihpbnNuLCB2YWx1ZTEpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JQUREOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkxBREQ6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRkFERDoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5EQUREOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLklTVUI6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuTFNVQjoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5GU1VCOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkRTVUI6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSU1VTDoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5MTVVMOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkZNVUw6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRE1VTDoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JRElWOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkxESVY6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRkRJVjoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5ERElWOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLklSRU06CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuTFJFTToKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5GUkVNOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkRSRU06CisgICAgICAgICAgICAgICAgdmFsdWUyID0gcG9wKCk7CisgICAgICAgICAgICAgICAgdmFsdWUxID0gcG9wKCk7CisgICAgICAgICAgICAgICAgcHVzaChpbnRlcnByZXRlci5iaW5hcnlPcGVyYXRpb24oaW5zbiwgdmFsdWUxLCB2YWx1ZTIpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JTkVHOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkxORUc6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRk5FRzoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5ETkVHOgorICAgICAgICAgICAgICAgIHB1c2goaW50ZXJwcmV0ZXIudW5hcnlPcGVyYXRpb24oaW5zbiwgcG9wKCkpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JU0hMOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkxTSEw6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSVNIUjoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5MU0hSOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLklVU0hSOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkxVU0hSOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLklBTkQ6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuTEFORDoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JT1I6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuTE9SOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLklYT1I6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuTFhPUjoKKyAgICAgICAgICAgICAgICB2YWx1ZTIgPSBwb3AoKTsKKyAgICAgICAgICAgICAgICB2YWx1ZTEgPSBwb3AoKTsKKyAgICAgICAgICAgICAgICBwdXNoKGludGVycHJldGVyLmJpbmFyeU9wZXJhdGlvbihpbnNuLCB2YWx1ZTEsIHZhbHVlMikpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLklJTkM6CisgICAgICAgICAgICAgICAgdmFyID0gKChJaW5jSW5zbk5vZGUpIGluc24pLnZhcjsKKyAgICAgICAgICAgICAgICBzZXRMb2NhbCh2YXIsIGludGVycHJldGVyLnVuYXJ5T3BlcmF0aW9uKGluc24sIGdldExvY2FsKHZhcikpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JMkw6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSTJGOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkkyRDoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5MMkk6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuTDJGOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkwyRDoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5GMkk6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRjJMOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkYyRDoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5EMkk6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRDJMOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkQyRjoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JMkI6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSTJDOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkkyUzoKKyAgICAgICAgICAgICAgICBwdXNoKGludGVycHJldGVyLnVuYXJ5T3BlcmF0aW9uKGluc24sIHBvcCgpKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuTENNUDoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5GQ01QTDoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5GQ01QRzoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5EQ01QTDoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5EQ01QRzoKKyAgICAgICAgICAgICAgICB2YWx1ZTIgPSBwb3AoKTsKKyAgICAgICAgICAgICAgICB2YWx1ZTEgPSBwb3AoKTsKKyAgICAgICAgICAgICAgICBwdXNoKGludGVycHJldGVyLmJpbmFyeU9wZXJhdGlvbihpbnNuLCB2YWx1ZTEsIHZhbHVlMikpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLklGRVE6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSUZORToKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JRkxUOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLklGR0U6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSUZHVDoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JRkxFOgorICAgICAgICAgICAgICAgIGludGVycHJldGVyLnVuYXJ5T3BlcmF0aW9uKGluc24sIHBvcCgpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JRl9JQ01QRVE6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSUZfSUNNUE5FOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLklGX0lDTVBMVDoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JRl9JQ01QR0U6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSUZfSUNNUEdUOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLklGX0lDTVBMRToKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JRl9BQ01QRVE6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSUZfQUNNUE5FOgorICAgICAgICAgICAgICAgIHZhbHVlMiA9IHBvcCgpOworICAgICAgICAgICAgICAgIHZhbHVlMSA9IHBvcCgpOworICAgICAgICAgICAgICAgIGludGVycHJldGVyLmJpbmFyeU9wZXJhdGlvbihpbnNuLCB2YWx1ZTEsIHZhbHVlMik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuR09UTzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5KU1I6CisgICAgICAgICAgICAgICAgcHVzaChpbnRlcnByZXRlci5uZXdPcGVyYXRpb24oaW5zbikpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLlJFVDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5UQUJMRVNXSVRDSDoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5MT09LVVBTV0lUQ0g6CisgICAgICAgICAgICAgICAgaW50ZXJwcmV0ZXIudW5hcnlPcGVyYXRpb24oaW5zbiwgcG9wKCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLklSRVRVUk46CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuTFJFVFVSTjoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5GUkVUVVJOOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkRSRVRVUk46CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuQVJFVFVSTjoKKyAgICAgICAgICAgICAgICB2YWx1ZTEgPSBwb3AoKTsKKyAgICAgICAgICAgICAgICBpbnRlcnByZXRlci51bmFyeU9wZXJhdGlvbihpbnNuLCB2YWx1ZTEpOworICAgICAgICAgICAgICAgIGludGVycHJldGVyLnJldHVybk9wZXJhdGlvbihpbnNuLCB2YWx1ZTEsIHJldHVyblZhbHVlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5SRVRVUk46CisgICAgICAgICAgICAgICAgaWYgKHJldHVyblZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFuYWx5emVyRXhjZXB0aW9uKGluc24sICJJbmNvbXBhdGlibGUgcmV0dXJuIHR5cGUiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuR0VUU1RBVElDOgorICAgICAgICAgICAgICAgIHB1c2goaW50ZXJwcmV0ZXIubmV3T3BlcmF0aW9uKGluc24pKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5QVVRTVEFUSUM6CisgICAgICAgICAgICAgICAgaW50ZXJwcmV0ZXIudW5hcnlPcGVyYXRpb24oaW5zbiwgcG9wKCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkdFVEZJRUxEOgorICAgICAgICAgICAgICAgIHB1c2goaW50ZXJwcmV0ZXIudW5hcnlPcGVyYXRpb24oaW5zbiwgcG9wKCkpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5QVVRGSUVMRDoKKyAgICAgICAgICAgICAgICB2YWx1ZTIgPSBwb3AoKTsKKyAgICAgICAgICAgICAgICB2YWx1ZTEgPSBwb3AoKTsKKyAgICAgICAgICAgICAgICBpbnRlcnByZXRlci5iaW5hcnlPcGVyYXRpb24oaW5zbiwgdmFsdWUxLCB2YWx1ZTIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLklOVk9LRVZJUlRVQUw6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSU5WT0tFU1BFQ0lBTDoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JTlZPS0VTVEFUSUM6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSU5WT0tFSU5URVJGQUNFOiB7CisgICAgICAgICAgICAgICAgdmFsdWVzID0gbmV3IEFycmF5TGlzdDxWPigpOworICAgICAgICAgICAgICAgIFN0cmluZyBkZXNjID0gKChNZXRob2RJbnNuTm9kZSkgaW5zbikuZGVzYzsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gVHlwZS5nZXRBcmd1bWVudFR5cGVzKGRlc2MpLmxlbmd0aDsgaSA+IDA7IC0taSkgeworICAgICAgICAgICAgICAgICAgICB2YWx1ZXMuYWRkKDAsIHBvcCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGluc24uZ2V0T3Bjb2RlKCkgIT0gT3Bjb2Rlcy5JTlZPS0VTVEFUSUMpIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVzLmFkZCgwLCBwb3AoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChUeXBlLmdldFJldHVyblR5cGUoZGVzYykgPT0gVHlwZS5WT0lEX1RZUEUpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50ZXJwcmV0ZXIubmFyeU9wZXJhdGlvbihpbnNuLCB2YWx1ZXMpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHB1c2goaW50ZXJwcmV0ZXIubmFyeU9wZXJhdGlvbihpbnNuLCB2YWx1ZXMpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSU5WT0tFRFlOQU1JQzogeworICAgICAgICAgICAgICAgIHZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8Vj4oKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZGVzYyA9ICgoSW52b2tlRHluYW1pY0luc25Ob2RlKSBpbnNuKS5kZXNjOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBUeXBlLmdldEFyZ3VtZW50VHlwZXMoZGVzYykubGVuZ3RoOyBpID4gMDsgLS1pKSB7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5hZGQoMCwgcG9wKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoVHlwZS5nZXRSZXR1cm5UeXBlKGRlc2MpID09IFR5cGUuVk9JRF9UWVBFKSB7CisgICAgICAgICAgICAgICAgICAgIGludGVycHJldGVyLm5hcnlPcGVyYXRpb24oaW5zbiwgdmFsdWVzKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBwdXNoKGludGVycHJldGVyLm5hcnlPcGVyYXRpb24oaW5zbiwgdmFsdWVzKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLk5FVzoKKyAgICAgICAgICAgICAgICBwdXNoKGludGVycHJldGVyLm5ld09wZXJhdGlvbihpbnNuKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuTkVXQVJSQVk6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuQU5FV0FSUkFZOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkFSUkFZTEVOR1RIOgorICAgICAgICAgICAgICAgIHB1c2goaW50ZXJwcmV0ZXIudW5hcnlPcGVyYXRpb24oaW5zbiwgcG9wKCkpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5BVEhST1c6CisgICAgICAgICAgICAgICAgaW50ZXJwcmV0ZXIudW5hcnlPcGVyYXRpb24oaW5zbiwgcG9wKCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkNIRUNLQ0FTVDoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JTlNUQU5DRU9GOgorICAgICAgICAgICAgICAgIHB1c2goaW50ZXJwcmV0ZXIudW5hcnlPcGVyYXRpb24oaW5zbiwgcG9wKCkpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5NT05JVE9SRU5URVI6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuTU9OSVRPUkVYSVQ6CisgICAgICAgICAgICAgICAgaW50ZXJwcmV0ZXIudW5hcnlPcGVyYXRpb24oaW5zbiwgcG9wKCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLk1VTFRJQU5FV0FSUkFZOgorICAgICAgICAgICAgICAgIHZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8Vj4oKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gKChNdWx0aUFOZXdBcnJheUluc25Ob2RlKSBpbnNuKS5kaW1zOyBpID4gMDsgLS1pKSB7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5hZGQoMCwgcG9wKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwdXNoKGludGVycHJldGVyLm5hcnlPcGVyYXRpb24oaW5zbiwgdmFsdWVzKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSUZOVUxMOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLklGTk9OTlVMTDoKKyAgICAgICAgICAgICAgICBpbnRlcnByZXRlci51bmFyeU9wZXJhdGlvbihpbnNuLCBwb3AoKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbGxlZ2FsIG9wY29kZSAiK2luc24uZ2V0T3Bjb2RlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTWVyZ2VzIHRoaXMgZnJhbWUgd2l0aCB0aGUgZ2l2ZW4gZnJhbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJhbWUgYSBmcmFtZS4KKyAgICAgKiBAcGFyYW0gaW50ZXJwcmV0ZXIgdGhlIGludGVycHJldGVyIHVzZWQgdG8gbWVyZ2UgdmFsdWVzLgorICAgICAqIEByZXR1cm4gPHR0PnRydWU8L3R0PiBpZiB0aGlzIGZyYW1lIGhhcyBiZWVuIGNoYW5nZWQgYXMgYSByZXN1bHQgb2YgdGhlCisgICAgICogICAgICAgICBtZXJnZSBvcGVyYXRpb24sIG9yIDx0dD5mYWxzZTwvdHQ+IG90aGVyd2lzZS4KKyAgICAgKiBAdGhyb3dzIEFuYWx5emVyRXhjZXB0aW9uIGlmIHRoZSBmcmFtZXMgaGF2ZSBpbmNvbXBhdGlibGUgc2l6ZXMuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gbWVyZ2UoZmluYWwgRnJhbWU8PyBleHRlbmRzIFY+IGZyYW1lLCBmaW5hbCBJbnRlcnByZXRlcjxWPiBpbnRlcnByZXRlcikKKyAgICAgICAgICAgIHRocm93cyBBbmFseXplckV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaWYgKHRvcCAhPSBmcmFtZS50b3ApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBBbmFseXplckV4Y2VwdGlvbihudWxsLCAiSW5jb21wYXRpYmxlIHN0YWNrIGhlaWdodHMiKTsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuIGNoYW5nZXMgPSBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhbHMgKyB0b3A7ICsraSkgeworICAgICAgICAgICAgViB2ID0gaW50ZXJwcmV0ZXIubWVyZ2UodmFsdWVzW2ldLCBmcmFtZS52YWx1ZXNbaV0pOworICAgICAgICAgICAgaWYgKHYgIT0gdmFsdWVzW2ldKSB7CisgICAgICAgICAgICAgICAgdmFsdWVzW2ldID0gdjsKKyAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNoYW5nZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWVyZ2VzIHRoaXMgZnJhbWUgd2l0aCB0aGUgZ2l2ZW4gZnJhbWUgKGNhc2Ugb2YgYSBSRVQgaW5zdHJ1Y3Rpb24pLgorICAgICAqCisgICAgICogQHBhcmFtIGZyYW1lIGEgZnJhbWUKKyAgICAgKiBAcGFyYW0gYWNjZXNzIHRoZSBsb2NhbCB2YXJpYWJsZXMgdGhhdCBoYXZlIGJlZW4gYWNjZXNzZWQgYnkgdGhlCisgICAgICogICAgICAgIHN1YnJvdXRpbmUgdG8gd2hpY2ggdGhlIFJFVCBpbnN0cnVjdGlvbiBjb3JyZXNwb25kcy4KKyAgICAgKiBAcmV0dXJuIDx0dD50cnVlPC90dD4gaWYgdGhpcyBmcmFtZSBoYXMgYmVlbiBjaGFuZ2VkIGFzIGEgcmVzdWx0IG9mIHRoZQorICAgICAqICAgICAgICAgbWVyZ2Ugb3BlcmF0aW9uLCBvciA8dHQ+ZmFsc2U8L3R0PiBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gbWVyZ2UoZmluYWwgRnJhbWU8PyBleHRlbmRzIFY+IGZyYW1lLCBmaW5hbCBib29sZWFuW10gYWNjZXNzKSB7CisgICAgICAgIGJvb2xlYW4gY2hhbmdlcyA9IGZhbHNlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxvY2FsczsgKytpKSB7CisgICAgICAgICAgICBpZiAoIWFjY2Vzc1tpXSAmJiAhdmFsdWVzW2ldLmVxdWFscyhmcmFtZS52YWx1ZXNbaV0pKSB7CisgICAgICAgICAgICAgICAgdmFsdWVzW2ldID0gZnJhbWUudmFsdWVzW2ldOworICAgICAgICAgICAgICAgIGNoYW5nZXMgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBjaGFuZ2VzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBmcmFtZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBmcmFtZS4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmdCdWZmZXIgYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBnZXRMb2NhbHMoKTsgKytpKSB7CisgICAgICAgICAgICBiLmFwcGVuZChnZXRMb2NhbChpKSk7CisgICAgICAgIH0KKyAgICAgICAgYi5hcHBlbmQoJyAnKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBnZXRTdGFja1NpemUoKTsgKytpKSB7CisgICAgICAgICAgICBiLmFwcGVuZChnZXRTdGFjayhpKS50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYi50b1N0cmluZygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vdHJlZS9hbmFseXNpcy9JbnRlcnByZXRlci5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS90cmVlL2FuYWx5c2lzL0ludGVycHJldGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ4NzM1ZgotLS0gL2Rldi9udWxsCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vdHJlZS9hbmFseXNpcy9JbnRlcnByZXRlci5qYXZhCkBAIC0wLDAgKzEsMjMzIEBACisvKgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBPcmFjbGUgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKKyAqIHF1ZXN0aW9ucy4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGlzIGF2YWlsYWJsZSB1bmRlciBhbmQgZ292ZXJuZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiBIb3dldmVyLCB0aGUgZm9sbG93aW5nIG5vdGljZSBhY2NvbXBhbmllZCB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGlzCisgKiBmaWxlOgorICoKKyAqIEFTTTogYSB2ZXJ5IHNtYWxsIGFuZCBmYXN0IEphdmEgYnl0ZWNvZGUgbWFuaXB1bGF0aW9uIGZyYW1ld29yaworICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMTEgSU5SSUEsIEZyYW5jZSBUZWxlY29tCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2UgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLnRyZWUuYW5hbHlzaXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5UeXBlOworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS50cmVlLkFic3RyYWN0SW5zbk5vZGU7CisKKy8qKgorICogQSBzZW1hbnRpYyBieXRlY29kZSBpbnRlcnByZXRlci4gTW9yZSBwcmVjaXNlbHksIHRoaXMgaW50ZXJwcmV0ZXIgb25seQorICogbWFuYWdlcyB0aGUgY29tcHV0YXRpb24gb2YgdmFsdWVzIGZyb20gb3RoZXIgdmFsdWVzOiBpdCBkb2VzIG5vdCBtYW5hZ2UgdGhlCisgKiB0cmFuc2ZlciBvZiB2YWx1ZXMgdG8gb3IgZnJvbSB0aGUgc3RhY2ssIGFuZCB0byBvciBmcm9tIHRoZSBsb2NhbCB2YXJpYWJsZXMuCisgKiBUaGlzIHNlcGFyYXRpb24gYWxsb3dzIGEgZ2VuZXJpYyBieXRlY29kZSB7QGxpbmsgQW5hbHl6ZXJ9IHRvIHdvcmsgd2l0aAorICogdmFyaW91cyBzZW1hbnRpYyBpbnRlcnByZXRlcnMsIHdpdGhvdXQgbmVlZGluZyB0byBkdXBsaWNhdGUgdGhlIGNvZGUgdG8KKyAqIHNpbXVsYXRlIHRoZSB0cmFuc2ZlciBvZiB2YWx1ZXMuCisgKgorICogQHBhcmFtIDxWPiB0eXBlIG9mIHRoZSBWYWx1ZSB1c2VkIGZvciB0aGUgYW5hbHlzaXMuCisgKgorICogQGF1dGhvciBFcmljIEJydW5ldG9uCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBJbnRlcnByZXRlcjxWIGV4dGVuZHMgVmFsdWU+IHsKKworICAgIHByb3RlY3RlZCBmaW5hbCBpbnQgYXBpOworCisgICAgcHJvdGVjdGVkIEludGVycHJldGVyKGZpbmFsIGludCBhcGkpIHsKKyAgICAgICAgdGhpcy5hcGkgPSBhcGk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyB2YWx1ZSB0aGF0IHJlcHJlc2VudHMgdGhlIGdpdmVuIHR5cGUuCisgICAgICoKKyAgICAgKiBDYWxsZWQgZm9yIG1ldGhvZCBwYXJhbWV0ZXJzIChpbmNsdWRpbmcgPGNvZGU+dGhpczwvY29kZT4pLAorICAgICAqIGV4Y2VwdGlvbiBoYW5kbGVyIHZhcmlhYmxlIGFuZCB3aXRoIDxjb2RlPm51bGw8L2NvZGU+IHR5cGUKKyAgICAgKiBmb3IgdmFyaWFibGVzIHJlc2VydmVkIGJ5IGxvbmcgYW5kIGRvdWJsZSB0eXBlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlIGEgcHJpbWl0aXZlIG9yIHJlZmVyZW5jZSB0eXBlLCBvciA8dHQ+bnVsbDwvdHQ+IHRvCisgICAgICogICAgICAgIHJlcHJlc2VudCBhbiB1bmluaXRpYWxpemVkIHZhbHVlLgorICAgICAqIEByZXR1cm4gYSB2YWx1ZSB0aGF0IHJlcHJlc2VudHMgdGhlIGdpdmVuIHR5cGUuIFRoZSBzaXplIG9mIHRoZSByZXR1cm5lZAorICAgICAqICAgICAgICAgdmFsdWUgbXVzdCBiZSBlcXVhbCB0byB0aGUgc2l6ZSBvZiB0aGUgZ2l2ZW4gdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgViBuZXdWYWx1ZShUeXBlIHR5cGUpOworCisgICAgLyoqCisgICAgICogSW50ZXJwcmV0cyBhIGJ5dGVjb2RlIGluc3RydWN0aW9uIHdpdGhvdXQgYXJndW1lbnRzLiBUaGlzIG1ldGhvZCBpcworICAgICAqIGNhbGxlZCBmb3IgdGhlIGZvbGxvd2luZyBvcGNvZGVzOgorICAgICAqCisgICAgICogQUNPTlNUX05VTEwsIElDT05TVF9NMSwgSUNPTlNUXzAsIElDT05TVF8xLCBJQ09OU1RfMiwgSUNPTlNUXzMsIElDT05TVF80LAorICAgICAqIElDT05TVF81LCBMQ09OU1RfMCwgTENPTlNUXzEsIEZDT05TVF8wLCBGQ09OU1RfMSwgRkNPTlNUXzIsIERDT05TVF8wLAorICAgICAqIERDT05TVF8xLCBCSVBVU0gsIFNJUFVTSCwgTERDLCBKU1IsIEdFVFNUQVRJQywgTkVXCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5zbiB0aGUgYnl0ZWNvZGUgaW5zdHJ1Y3Rpb24gdG8gYmUgaW50ZXJwcmV0ZWQuCisgICAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIHRoZSBpbnRlcnByZXRhdGlvbiBvZiB0aGUgZ2l2ZW4gaW5zdHJ1Y3Rpb24uCisgICAgICogQHRocm93cyBBbmFseXplckV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cmVkIGR1cmluZyB0aGUgaW50ZXJwcmV0YXRpb24uCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFYgbmV3T3BlcmF0aW9uKEFic3RyYWN0SW5zbk5vZGUgaW5zbikKKyAgICAgICAgICAgIHRocm93cyBBbmFseXplckV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIEludGVycHJldHMgYSBieXRlY29kZSBpbnN0cnVjdGlvbiB0aGF0IG1vdmVzIGEgdmFsdWUgb24gdGhlIHN0YWNrIG9yIHRvCisgICAgICogb3IgZnJvbSBsb2NhbCB2YXJpYWJsZXMuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBmb3IgdGhlIGZvbGxvd2luZyBvcGNvZGVzOgorICAgICAqCisgICAgICogSUxPQUQsIExMT0FELCBGTE9BRCwgRExPQUQsIEFMT0FELCBJU1RPUkUsIExTVE9SRSwgRlNUT1JFLCBEU1RPUkUsCisgICAgICogQVNUT1JFLCBEVVAsIERVUF9YMSwgRFVQX1gyLCBEVVAyLCBEVVAyX1gxLCBEVVAyX1gyLCBTV0FQCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5zbiB0aGUgYnl0ZWNvZGUgaW5zdHJ1Y3Rpb24gdG8gYmUgaW50ZXJwcmV0ZWQuCisgICAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0aGF0IG11c3QgYmUgbW92ZWQgYnkgdGhlIGluc3RydWN0aW9uLgorICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgaW50ZXJwcmV0YXRpb24gb2YgdGhlIGdpdmVuIGluc3RydWN0aW9uLiBUaGUKKyAgICAgKiAgICAgICAgIHJldHVybmVkIHZhbHVlIG11c3QgYmUgPHR0PmVxdWFsPC90dD4gdG8gdGhlIGdpdmVuIHZhbHVlLgorICAgICAqIEB0aHJvd3MgQW5hbHl6ZXJFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJlZCBkdXJpbmcgdGhlIGludGVycHJldGF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBWIGNvcHlPcGVyYXRpb24oQWJzdHJhY3RJbnNuTm9kZSBpbnNuLCBWIHZhbHVlKQorICAgICAgICAgICAgdGhyb3dzIEFuYWx5emVyRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogSW50ZXJwcmV0cyBhIGJ5dGVjb2RlIGluc3RydWN0aW9uIHdpdGggYSBzaW5nbGUgYXJndW1lbnQuIFRoaXMgbWV0aG9kIGlzCisgICAgICogY2FsbGVkIGZvciB0aGUgZm9sbG93aW5nIG9wY29kZXM6CisgICAgICoKKyAgICAgKiBJTkVHLCBMTkVHLCBGTkVHLCBETkVHLCBJSU5DLCBJMkwsIEkyRiwgSTJELCBMMkksIEwyRiwgTDJELCBGMkksIEYyTCwKKyAgICAgKiBGMkQsIEQySSwgRDJMLCBEMkYsIEkyQiwgSTJDLCBJMlMsIElGRVEsIElGTkUsIElGTFQsIElGR0UsIElGR1QsIElGTEUsCisgICAgICogVEFCTEVTV0lUQ0gsIExPT0tVUFNXSVRDSCwgSVJFVFVSTiwgTFJFVFVSTiwgRlJFVFVSTiwgRFJFVFVSTiwgQVJFVFVSTiwKKyAgICAgKiBQVVRTVEFUSUMsIEdFVEZJRUxELCBORVdBUlJBWSwgQU5FV0FSUkFZLCBBUlJBWUxFTkdUSCwgQVRIUk9XLCBDSEVDS0NBU1QsCisgICAgICogSU5TVEFOQ0VPRiwgTU9OSVRPUkVOVEVSLCBNT05JVE9SRVhJVCwgSUZOVUxMLCBJRk5PTk5VTEwKKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnNuIHRoZSBieXRlY29kZSBpbnN0cnVjdGlvbiB0byBiZSBpbnRlcnByZXRlZC4KKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIGFyZ3VtZW50IG9mIHRoZSBpbnN0cnVjdGlvbiB0byBiZSBpbnRlcnByZXRlZC4KKyAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhlIGludGVycHJldGF0aW9uIG9mIHRoZSBnaXZlbiBpbnN0cnVjdGlvbi4KKyAgICAgKiBAdGhyb3dzIEFuYWx5emVyRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VyZWQgZHVyaW5nIHRoZSBpbnRlcnByZXRhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgViB1bmFyeU9wZXJhdGlvbihBYnN0cmFjdEluc25Ob2RlIGluc24sIFYgdmFsdWUpCisgICAgICAgICAgICB0aHJvd3MgQW5hbHl6ZXJFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBJbnRlcnByZXRzIGEgYnl0ZWNvZGUgaW5zdHJ1Y3Rpb24gd2l0aCB0d28gYXJndW1lbnRzLiBUaGlzIG1ldGhvZCBpcworICAgICAqIGNhbGxlZCBmb3IgdGhlIGZvbGxvd2luZyBvcGNvZGVzOgorICAgICAqCisgICAgICogSUFMT0FELCBMQUxPQUQsIEZBTE9BRCwgREFMT0FELCBBQUxPQUQsIEJBTE9BRCwgQ0FMT0FELCBTQUxPQUQsIElBREQsCisgICAgICogTEFERCwgRkFERCwgREFERCwgSVNVQiwgTFNVQiwgRlNVQiwgRFNVQiwgSU1VTCwgTE1VTCwgRk1VTCwgRE1VTCwgSURJViwKKyAgICAgKiBMRElWLCBGRElWLCBERElWLCBJUkVNLCBMUkVNLCBGUkVNLCBEUkVNLCBJU0hMLCBMU0hMLCBJU0hSLCBMU0hSLCBJVVNIUiwKKyAgICAgKiBMVVNIUiwgSUFORCwgTEFORCwgSU9SLCBMT1IsIElYT1IsIExYT1IsIExDTVAsIEZDTVBMLCBGQ01QRywgRENNUEwsCisgICAgICogRENNUEcsIElGX0lDTVBFUSwgSUZfSUNNUE5FLCBJRl9JQ01QTFQsIElGX0lDTVBHRSwgSUZfSUNNUEdULCBJRl9JQ01QTEUsCisgICAgICogSUZfQUNNUEVRLCBJRl9BQ01QTkUsIFBVVEZJRUxECisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5zbiB0aGUgYnl0ZWNvZGUgaW5zdHJ1Y3Rpb24gdG8gYmUgaW50ZXJwcmV0ZWQuCisgICAgICogQHBhcmFtIHZhbHVlMSB0aGUgZmlyc3QgYXJndW1lbnQgb2YgdGhlIGluc3RydWN0aW9uIHRvIGJlIGludGVycHJldGVkLgorICAgICAqIEBwYXJhbSB2YWx1ZTIgdGhlIHNlY29uZCBhcmd1bWVudCBvZiB0aGUgaW5zdHJ1Y3Rpb24gdG8gYmUgaW50ZXJwcmV0ZWQuCisgICAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIHRoZSBpbnRlcnByZXRhdGlvbiBvZiB0aGUgZ2l2ZW4gaW5zdHJ1Y3Rpb24uCisgICAgICogQHRocm93cyBBbmFseXplckV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cmVkIGR1cmluZyB0aGUgaW50ZXJwcmV0YXRpb24uCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFYgYmluYXJ5T3BlcmF0aW9uKEFic3RyYWN0SW5zbk5vZGUgaW5zbiwgViB2YWx1ZTEsIFYgdmFsdWUyKQorICAgICAgICAgICAgdGhyb3dzIEFuYWx5emVyRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogSW50ZXJwcmV0cyBhIGJ5dGVjb2RlIGluc3RydWN0aW9uIHdpdGggdGhyZWUgYXJndW1lbnRzLiBUaGlzIG1ldGhvZCBpcworICAgICAqIGNhbGxlZCBmb3IgdGhlIGZvbGxvd2luZyBvcGNvZGVzOgorICAgICAqCisgICAgICogSUFTVE9SRSwgTEFTVE9SRSwgRkFTVE9SRSwgREFTVE9SRSwgQUFTVE9SRSwgQkFTVE9SRSwgQ0FTVE9SRSwgU0FTVE9SRQorICAgICAqCisgICAgICogQHBhcmFtIGluc24gdGhlIGJ5dGVjb2RlIGluc3RydWN0aW9uIHRvIGJlIGludGVycHJldGVkLgorICAgICAqIEBwYXJhbSB2YWx1ZTEgdGhlIGZpcnN0IGFyZ3VtZW50IG9mIHRoZSBpbnN0cnVjdGlvbiB0byBiZSBpbnRlcnByZXRlZC4KKyAgICAgKiBAcGFyYW0gdmFsdWUyIHRoZSBzZWNvbmQgYXJndW1lbnQgb2YgdGhlIGluc3RydWN0aW9uIHRvIGJlIGludGVycHJldGVkLgorICAgICAqIEBwYXJhbSB2YWx1ZTMgdGhlIHRoaXJkIGFyZ3VtZW50IG9mIHRoZSBpbnN0cnVjdGlvbiB0byBiZSBpbnRlcnByZXRlZC4KKyAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhlIGludGVycHJldGF0aW9uIG9mIHRoZSBnaXZlbiBpbnN0cnVjdGlvbi4KKyAgICAgKiBAdGhyb3dzIEFuYWx5emVyRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VyZWQgZHVyaW5nIHRoZSBpbnRlcnByZXRhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgViB0ZXJuYXJ5T3BlcmF0aW9uKAorICAgICAgICBBYnN0cmFjdEluc25Ob2RlIGluc24sCisgICAgICAgIFYgdmFsdWUxLAorICAgICAgICBWIHZhbHVlMiwKKyAgICAgICAgViB2YWx1ZTMpIHRocm93cyBBbmFseXplckV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIEludGVycHJldHMgYSBieXRlY29kZSBpbnN0cnVjdGlvbiB3aXRoIGEgdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cy4KKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgZm9yIHRoZSBmb2xsb3dpbmcgb3Bjb2RlczoKKyAgICAgKgorICAgICAqIElOVk9LRVZJUlRVQUwsIElOVk9LRVNQRUNJQUwsIElOVk9LRVNUQVRJQywgSU5WT0tFSU5URVJGQUNFLAorICAgICAqIE1VTFRJQU5FV0FSUkFZIGFuZCBJTlZPS0VEWU5BTUlDCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5zbiB0aGUgYnl0ZWNvZGUgaW5zdHJ1Y3Rpb24gdG8gYmUgaW50ZXJwcmV0ZWQuCisgICAgICogQHBhcmFtIHZhbHVlcyB0aGUgYXJndW1lbnRzIG9mIHRoZSBpbnN0cnVjdGlvbiB0byBiZSBpbnRlcnByZXRlZC4KKyAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhlIGludGVycHJldGF0aW9uIG9mIHRoZSBnaXZlbiBpbnN0cnVjdGlvbi4KKyAgICAgKiBAdGhyb3dzIEFuYWx5emVyRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VyZWQgZHVyaW5nIHRoZSBpbnRlcnByZXRhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgViBuYXJ5T3BlcmF0aW9uKAorICAgICAgICBBYnN0cmFjdEluc25Ob2RlIGluc24sCisgICAgICAgIExpc3Q8ID8gZXh0ZW5kcyBWPiB2YWx1ZXMpIHRocm93cyBBbmFseXplckV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIEludGVycHJldHMgYSBieXRlY29kZSByZXR1cm4gaW5zdHJ1Y3Rpb24uIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBmb3IgdGhlCisgICAgICogZm9sbG93aW5nIG9wY29kZXM6CisgICAgICoKKyAgICAgKiBJUkVUVVJOLCBMUkVUVVJOLCBGUkVUVVJOLCBEUkVUVVJOLCBBUkVUVVJOCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5zbiB0aGUgYnl0ZWNvZGUgaW5zdHJ1Y3Rpb24gdG8gYmUgaW50ZXJwcmV0ZWQuCisgICAgICogQHBhcmFtIHZhbHVlIHRoZSBhcmd1bWVudCBvZiB0aGUgaW5zdHJ1Y3Rpb24gdG8gYmUgaW50ZXJwcmV0ZWQuCisgICAgICogQHBhcmFtIGV4cGVjdGVkIHRoZSBleHBlY3RlZCByZXR1cm4gdHlwZSBvZiB0aGUgYW5hbHl6ZWQgbWV0aG9kLgorICAgICAqIEB0aHJvd3MgQW5hbHl6ZXJFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJlZCBkdXJpbmcgdGhlIGludGVycHJldGF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHJldHVybk9wZXJhdGlvbigKKyAgICAgICAgQWJzdHJhY3RJbnNuTm9kZSBpbnNuLAorICAgICAgICBWIHZhbHVlLAorICAgICAgICBWIGV4cGVjdGVkKSB0aHJvd3MgQW5hbHl6ZXJFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBNZXJnZXMgdHdvIHZhbHVlcy4gVGhlIG1lcmdlIG9wZXJhdGlvbiBtdXN0IHJldHVybiBhIHZhbHVlIHRoYXQKKyAgICAgKiByZXByZXNlbnRzIGJvdGggdmFsdWVzIChmb3IgaW5zdGFuY2UsIGlmIHRoZSB0d28gdmFsdWVzIGFyZSB0d28gdHlwZXMsCisgICAgICogdGhlIG1lcmdlZCB2YWx1ZSBtdXN0IGJlIGEgY29tbW9uIHN1cGVyIHR5cGUgb2YgdGhlIHR3byB0eXBlcy4gSWYgdGhlIHR3bworICAgICAqIHZhbHVlcyBhcmUgaW50ZWdlciBpbnRlcnZhbHMsIHRoZSBtZXJnZWQgdmFsdWUgbXVzdCBiZSBhbiBpbnRlcnZhbCB0aGF0CisgICAgICogY29udGFpbnMgdGhlIHByZXZpb3VzIG9uZXMuIExpa2V3aXNlIGZvciBvdGhlciB0eXBlcyBvZiB2YWx1ZXMpLgorICAgICAqCisgICAgICogQHBhcmFtIHYgYSB2YWx1ZS4KKyAgICAgKiBAcGFyYW0gdyBhbm90aGVyIHZhbHVlLgorICAgICAqIEByZXR1cm4gdGhlIG1lcmdlZCB2YWx1ZS4gSWYgdGhlIG1lcmdlZCB2YWx1ZSBpcyBlcXVhbCB0byA8dHQ+djwvdHQ+LAorICAgICAqICAgICAgICAgdGhpcyBtZXRob2QgPGk+bXVzdDwvaT4gcmV0dXJuIDx0dD52PC90dD4uCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFYgbWVyZ2UoViB2LCBWIHcpOworfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS90cmVlL2FuYWx5c2lzL1NpbXBsZVZlcmlmaWVyLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL3RyZWUvYW5hbHlzaXMvU2ltcGxlVmVyaWZpZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTI3NWM3Ci0tLSAvZGV2L251bGwKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS90cmVlL2FuYWx5c2lzL1NpbXBsZVZlcmlmaWVyLmphdmEKQEAgLTAsMCArMSwzNTggQEAKKy8qCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IE9yYWNsZSBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQorICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQorICogcXVlc3Rpb25zLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgaXMgYXZhaWxhYmxlIHVuZGVyIGFuZCBnb3Zlcm5lZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIEhvd2V2ZXIsIHRoZSBmb2xsb3dpbmcgbm90aWNlIGFjY29tcGFuaWVkIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoaXMKKyAqIGZpbGU6CisgKgorICogQVNNOiBhIHZlcnkgc21hbGwgYW5kIGZhc3QgSmF2YSBieXRlY29kZSBtYW5pcHVsYXRpb24gZnJhbWV3b3JrCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAxMSBJTlJJQSwgRnJhbmNlIFRlbGVjb20KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20udHJlZS5hbmFseXNpczsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLlR5cGU7CisKKy8qKgorICogQW4gZXh0ZW5kZWQge0BsaW5rIEJhc2ljVmVyaWZpZXJ9IHRoYXQgcGVyZm9ybXMgbW9yZSBwcmVjaXNlIHZlcmlmaWNhdGlvbnMuCisgKiBUaGlzIHZlcmlmaWVyIGNvbXB1dGVzIGV4YWN0IGNsYXNzIHR5cGVzLCBpbnN0ZWFkIG9mIHVzaW5nIGEgc2luZ2xlICJvYmplY3QKKyAqIHJlZmVyZW5jZSIgdHlwZSAoYXMgZG9uZSBpbiB0aGUge0BsaW5rIEJhc2ljVmVyaWZpZXJ9KS4KKyAqCisgKiBAYXV0aG9yIEVyaWMgQnJ1bmV0b24KKyAqIEBhdXRob3IgQmluZyBSYW4KKyAqLworcHVibGljIGNsYXNzIFNpbXBsZVZlcmlmaWVyIGV4dGVuZHMgQmFzaWNWZXJpZmllciB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY2xhc3MgdGhhdCBpcyB2ZXJpZmllZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIFR5cGUgY3VycmVudENsYXNzOworCisgICAgLyoqCisgICAgICogVGhlIHN1cGVyIGNsYXNzIG9mIHRoZSBjbGFzcyB0aGF0IGlzIHZlcmlmaWVkLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgVHlwZSBjdXJyZW50U3VwZXJDbGFzczsKKworICAgIC8qKgorICAgICAqIFRoZSBpbnRlcmZhY2VzIGltcGxlbWVudGVkIGJ5IHRoZSBjbGFzcyB0aGF0IGlzIHZlcmlmaWVkLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgTGlzdDxUeXBlPiBjdXJyZW50Q2xhc3NJbnRlcmZhY2VzOworCisgICAgLyoqCisgICAgICogSWYgdGhlIGNsYXNzIHRoYXQgaXMgdmVyaWZpZWQgaXMgYW4gaW50ZXJmYWNlLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBpc0ludGVyZmFjZTsKKworICAgIC8qKgorICAgICAqIFRoZSBsb2FkZXIgdG8gdXNlIGZvciByZWZlcmVuY2VkIGNsYXNzZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBDbGFzc0xvYWRlciBsb2FkZXIgPSBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCk7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAbGluayBTaW1wbGVWZXJpZmllcn0uCisgICAgICovCisgICAgcHVibGljIFNpbXBsZVZlcmlmaWVyKCkgeworICAgICAgICB0aGlzKG51bGwsIG51bGwsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAbGluayBTaW1wbGVWZXJpZmllcn0gdG8gdmVyaWZ5IGEgc3BlY2lmaWMgY2xhc3MuIFRoaXMKKyAgICAgKiBjbGFzcyB3aWxsIG5vdCBiZSBsb2FkZWQgaW50byB0aGUgSlZNIHNpbmNlIGl0IG1heSBiZSBpbmNvcnJlY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY3VycmVudENsYXNzIHRoZSBjbGFzcyB0aGF0IGlzIHZlcmlmaWVkLgorICAgICAqIEBwYXJhbSBjdXJyZW50U3VwZXJDbGFzcyB0aGUgc3VwZXIgY2xhc3Mgb2YgdGhlIGNsYXNzIHRoYXQgaXMgdmVyaWZpZWQuCisgICAgICogQHBhcmFtIGlzSW50ZXJmYWNlIGlmIHRoZSBjbGFzcyB0aGF0IGlzIHZlcmlmaWVkIGlzIGFuIGludGVyZmFjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2ltcGxlVmVyaWZpZXIoCisgICAgICAgIGZpbmFsIFR5cGUgY3VycmVudENsYXNzLAorICAgICAgICBmaW5hbCBUeXBlIGN1cnJlbnRTdXBlckNsYXNzLAorICAgICAgICBmaW5hbCBib29sZWFuIGlzSW50ZXJmYWNlKQorICAgIHsKKyAgICAgICAgdGhpcyhjdXJyZW50Q2xhc3MsIGN1cnJlbnRTdXBlckNsYXNzLCBudWxsLCBpc0ludGVyZmFjZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGxpbmsgU2ltcGxlVmVyaWZpZXJ9IHRvIHZlcmlmeSBhIHNwZWNpZmljIGNsYXNzLiBUaGlzCisgICAgICogY2xhc3Mgd2lsbCBub3QgYmUgbG9hZGVkIGludG8gdGhlIEpWTSBzaW5jZSBpdCBtYXkgYmUgaW5jb3JyZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIGN1cnJlbnRDbGFzcyB0aGUgY2xhc3MgdGhhdCBpcyB2ZXJpZmllZC4KKyAgICAgKiBAcGFyYW0gY3VycmVudFN1cGVyQ2xhc3MgdGhlIHN1cGVyIGNsYXNzIG9mIHRoZSBjbGFzcyB0aGF0IGlzIHZlcmlmaWVkLgorICAgICAqIEBwYXJhbSBjdXJyZW50Q2xhc3NJbnRlcmZhY2VzIHRoZSBpbnRlcmZhY2VzIGltcGxlbWVudGVkIGJ5IHRoZSBjbGFzcworICAgICAqICAgICAgICB0aGF0IGlzIHZlcmlmaWVkLgorICAgICAqIEBwYXJhbSBpc0ludGVyZmFjZSBpZiB0aGUgY2xhc3MgdGhhdCBpcyB2ZXJpZmllZCBpcyBhbiBpbnRlcmZhY2UuCisgICAgICovCisgICAgcHVibGljIFNpbXBsZVZlcmlmaWVyKAorICAgICAgICBmaW5hbCBUeXBlIGN1cnJlbnRDbGFzcywKKyAgICAgICAgZmluYWwgVHlwZSBjdXJyZW50U3VwZXJDbGFzcywKKyAgICAgICAgZmluYWwgTGlzdDxUeXBlPiBjdXJyZW50Q2xhc3NJbnRlcmZhY2VzLAorICAgICAgICBmaW5hbCBib29sZWFuIGlzSW50ZXJmYWNlKQorICAgIHsKKyAgICAgICAgdGhpcyhBU000LAorICAgICAgICAgICAgICAgIGN1cnJlbnRDbGFzcywKKyAgICAgICAgICAgICAgICBjdXJyZW50U3VwZXJDbGFzcywKKyAgICAgICAgICAgICAgICBjdXJyZW50Q2xhc3NJbnRlcmZhY2VzLAorICAgICAgICAgICAgICAgIGlzSW50ZXJmYWNlKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU2ltcGxlVmVyaWZpZXIoCisgICAgICAgIGZpbmFsIGludCBhcGksCisgICAgICAgIGZpbmFsIFR5cGUgY3VycmVudENsYXNzLAorICAgICAgICBmaW5hbCBUeXBlIGN1cnJlbnRTdXBlckNsYXNzLAorICAgICAgICBmaW5hbCBMaXN0PFR5cGU+IGN1cnJlbnRDbGFzc0ludGVyZmFjZXMsCisgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNJbnRlcmZhY2UpCisgICAgeworICAgICAgICBzdXBlcihhcGkpOworICAgICAgICB0aGlzLmN1cnJlbnRDbGFzcyA9IGN1cnJlbnRDbGFzczsKKyAgICAgICAgdGhpcy5jdXJyZW50U3VwZXJDbGFzcyA9IGN1cnJlbnRTdXBlckNsYXNzOworICAgICAgICB0aGlzLmN1cnJlbnRDbGFzc0ludGVyZmFjZXMgPSBjdXJyZW50Q2xhc3NJbnRlcmZhY2VzOworICAgICAgICB0aGlzLmlzSW50ZXJmYWNlID0gaXNJbnRlcmZhY2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSA8Y29kZT5DbGFzc0xvYWRlcjwvY29kZT4gd2hpY2ggd2lsbCBiZSB1c2VkIHRvIGxvYWQgcmVmZXJlbmNlZAorICAgICAqIGNsYXNzZXMuIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSBhcmUgdmVyaWZ5aW5nIG11bHRpcGxlIGludGVyZGVwZW5kZW50CisgICAgICogY2xhc3Nlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsb2FkZXIgYSA8Y29kZT5DbGFzc0xvYWRlcjwvY29kZT4gdG8gdXNlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2xhc3NMb2FkZXIoZmluYWwgQ2xhc3NMb2FkZXIgbG9hZGVyKSB7CisgICAgICAgIHRoaXMubG9hZGVyID0gbG9hZGVyOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCYXNpY1ZhbHVlIG5ld1ZhbHVlKGZpbmFsIFR5cGUgdHlwZSkgeworICAgICAgICBpZiAodHlwZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gQmFzaWNWYWx1ZS5VTklOSVRJQUxJWkVEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiBpc0FycmF5ID0gdHlwZS5nZXRTb3J0KCkgPT0gVHlwZS5BUlJBWTsKKyAgICAgICAgaWYgKGlzQXJyYXkpIHsKKyAgICAgICAgICAgIHN3aXRjaCAodHlwZS5nZXRFbGVtZW50VHlwZSgpLmdldFNvcnQoKSkgeworICAgICAgICAgICAgICAgIGNhc2UgVHlwZS5CT09MRUFOOgorICAgICAgICAgICAgICAgIGNhc2UgVHlwZS5DSEFSOgorICAgICAgICAgICAgICAgIGNhc2UgVHlwZS5CWVRFOgorICAgICAgICAgICAgICAgIGNhc2UgVHlwZS5TSE9SVDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCYXNpY1ZhbHVlKHR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQmFzaWNWYWx1ZSB2ID0gc3VwZXIubmV3VmFsdWUodHlwZSk7CisgICAgICAgIGlmIChCYXNpY1ZhbHVlLlJFRkVSRU5DRV9WQUxVRS5lcXVhbHModikpIHsKKyAgICAgICAgICAgIGlmIChpc0FycmF5KSB7CisgICAgICAgICAgICAgICAgdiA9IG5ld1ZhbHVlKHR5cGUuZ2V0RWxlbWVudFR5cGUoKSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIGRlc2MgPSB2LmdldFR5cGUoKS5nZXREZXNjcmlwdG9yKCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlLmdldERpbWVuc2lvbnMoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIGRlc2MgPSAnWycgKyBkZXNjOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2ID0gbmV3IEJhc2ljVmFsdWUoVHlwZS5nZXRUeXBlKGRlc2MpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdiA9IG5ldyBCYXNpY1ZhbHVlKHR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB2OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBib29sZWFuIGlzQXJyYXlWYWx1ZShmaW5hbCBCYXNpY1ZhbHVlIHZhbHVlKSB7CisgICAgICAgIFR5cGUgdCA9IHZhbHVlLmdldFR5cGUoKTsKKyAgICAgICAgcmV0dXJuIHQgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmICgiTG51bGw7Ii5lcXVhbHModC5nZXREZXNjcmlwdG9yKCkpIHx8IHQuZ2V0U29ydCgpID09IFR5cGUuQVJSQVkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBCYXNpY1ZhbHVlIGdldEVsZW1lbnRWYWx1ZShmaW5hbCBCYXNpY1ZhbHVlIG9iamVjdEFycmF5VmFsdWUpCisgICAgICAgICAgICB0aHJvd3MgQW5hbHl6ZXJFeGNlcHRpb24KKyAgICB7CisgICAgICAgIFR5cGUgYXJyYXlUeXBlID0gb2JqZWN0QXJyYXlWYWx1ZS5nZXRUeXBlKCk7CisgICAgICAgIGlmIChhcnJheVR5cGUgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGFycmF5VHlwZS5nZXRTb3J0KCkgPT0gVHlwZS5BUlJBWSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXdWYWx1ZShUeXBlLmdldFR5cGUoYXJyYXlUeXBlLmdldERlc2NyaXB0b3IoKQorICAgICAgICAgICAgICAgICAgICAgICAgLnN1YnN0cmluZygxKSkpOworICAgICAgICAgICAgfSBlbHNlIGlmICgiTG51bGw7Ii5lcXVhbHMoYXJyYXlUeXBlLmdldERlc2NyaXB0b3IoKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0QXJyYXlWYWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkludGVybmFsIGVycm9yIik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNTdWJUeXBlT2YoZmluYWwgQmFzaWNWYWx1ZSB2YWx1ZSwgZmluYWwgQmFzaWNWYWx1ZSBleHBlY3RlZCkgeworICAgICAgICBUeXBlIGV4cGVjdGVkVHlwZSA9IGV4cGVjdGVkLmdldFR5cGUoKTsKKyAgICAgICAgVHlwZSB0eXBlID0gdmFsdWUuZ2V0VHlwZSgpOworICAgICAgICBzd2l0Y2ggKGV4cGVjdGVkVHlwZS5nZXRTb3J0KCkpIHsKKyAgICAgICAgICAgIGNhc2UgVHlwZS5JTlQ6CisgICAgICAgICAgICBjYXNlIFR5cGUuRkxPQVQ6CisgICAgICAgICAgICBjYXNlIFR5cGUuTE9ORzoKKyAgICAgICAgICAgIGNhc2UgVHlwZS5ET1VCTEU6CisgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGUuZXF1YWxzKGV4cGVjdGVkVHlwZSk7CisgICAgICAgICAgICBjYXNlIFR5cGUuQVJSQVk6CisgICAgICAgICAgICBjYXNlIFR5cGUuT0JKRUNUOgorICAgICAgICAgICAgICAgIGlmICgiTG51bGw7Ii5lcXVhbHModHlwZS5nZXREZXNjcmlwdG9yKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZS5nZXRTb3J0KCkgPT0gVHlwZS5PQkpFQ1QKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IHR5cGUuZ2V0U29ydCgpID09IFR5cGUuQVJSQVkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXNBc3NpZ25hYmxlRnJvbShleHBlY3RlZFR5cGUsIHR5cGUpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiSW50ZXJuYWwgZXJyb3IiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCYXNpY1ZhbHVlIG1lcmdlKGZpbmFsIEJhc2ljVmFsdWUgdiwgZmluYWwgQmFzaWNWYWx1ZSB3KSB7CisgICAgICAgIGlmICghdi5lcXVhbHModykpIHsKKyAgICAgICAgICAgIFR5cGUgdCA9IHYuZ2V0VHlwZSgpOworICAgICAgICAgICAgVHlwZSB1ID0gdy5nZXRUeXBlKCk7CisgICAgICAgICAgICBpZiAodCAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICYmICh0LmdldFNvcnQoKSA9PSBUeXBlLk9CSkVDVCB8fCB0LmdldFNvcnQoKSA9PSBUeXBlLkFSUkFZKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodSAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAodS5nZXRTb3J0KCkgPT0gVHlwZS5PQkpFQ1QgfHwgdS5nZXRTb3J0KCkgPT0gVHlwZS5BUlJBWSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIkxudWxsOyIuZXF1YWxzKHQuZ2V0RGVzY3JpcHRvcigpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHc7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCJMbnVsbDsiLmVxdWFscyh1LmdldERlc2NyaXB0b3IoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChpc0Fzc2lnbmFibGVGcm9tKHQsIHUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoaXNBc3NpZ25hYmxlRnJvbSh1LCB0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHc7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyBjYXNlIG9mIGFycmF5IGNsYXNzZXMgb2YgdGhlIHNhbWUgZGltZW5zaW9uCisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gc2hvdWxkIHdlIGxvb2sgYWxzbyBmb3IgYSBjb21tb24gc3VwZXIgaW50ZXJmYWNlPworICAgICAgICAgICAgICAgICAgICAvLyBwcm9ibGVtOiB0aGVyZSBtYXkgYmUgc2V2ZXJhbCBwb3NzaWJsZSBjb21tb24gc3VwZXIKKyAgICAgICAgICAgICAgICAgICAgLy8gaW50ZXJmYWNlcworICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCA9PSBudWxsIHx8IGlzSW50ZXJmYWNlKHQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJhc2ljVmFsdWUuUkVGRVJFTkNFX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgdCA9IGdldFN1cGVyQ2xhc3ModCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNBc3NpZ25hYmxlRnJvbSh0LCB1KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdWYWx1ZSh0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEJhc2ljVmFsdWUuVU5JTklUSUFMSVpFRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdjsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0ludGVyZmFjZShmaW5hbCBUeXBlIHQpIHsKKyAgICAgICAgaWYgKGN1cnJlbnRDbGFzcyAhPSBudWxsICYmIHQuZXF1YWxzKGN1cnJlbnRDbGFzcykpIHsKKyAgICAgICAgICAgIHJldHVybiBpc0ludGVyZmFjZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZ2V0Q2xhc3ModCkuaXNJbnRlcmZhY2UoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgVHlwZSBnZXRTdXBlckNsYXNzKGZpbmFsIFR5cGUgdCkgeworICAgICAgICBpZiAoY3VycmVudENsYXNzICE9IG51bGwgJiYgdC5lcXVhbHMoY3VycmVudENsYXNzKSkgeworICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRTdXBlckNsYXNzOworICAgICAgICB9CisgICAgICAgIENsYXNzPD8+IGMgPSBnZXRDbGFzcyh0KS5nZXRTdXBlcmNsYXNzKCk7CisgICAgICAgIHJldHVybiBjID09IG51bGwgPyBudWxsIDogVHlwZS5nZXRUeXBlKGMpOworICAgIH0KKworICAgIHByb3RlY3RlZCBib29sZWFuIGlzQXNzaWduYWJsZUZyb20oZmluYWwgVHlwZSB0LCBmaW5hbCBUeXBlIHUpIHsKKyAgICAgICAgaWYgKHQuZXF1YWxzKHUpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY3VycmVudENsYXNzICE9IG51bGwgJiYgdC5lcXVhbHMoY3VycmVudENsYXNzKSkgeworICAgICAgICAgICAgaWYgKGdldFN1cGVyQ2xhc3ModSkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGlzSW50ZXJmYWNlKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB1LmdldFNvcnQoKSA9PSBUeXBlLk9CSkVDVCB8fCB1LmdldFNvcnQoKSA9PSBUeXBlLkFSUkFZOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gaXNBc3NpZ25hYmxlRnJvbSh0LCBnZXRTdXBlckNsYXNzKHUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoY3VycmVudENsYXNzICE9IG51bGwgJiYgdS5lcXVhbHMoY3VycmVudENsYXNzKSkgeworICAgICAgICAgICAgaWYgKGlzQXNzaWduYWJsZUZyb20odCwgY3VycmVudFN1cGVyQ2xhc3MpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY3VycmVudENsYXNzSW50ZXJmYWNlcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjdXJyZW50Q2xhc3NJbnRlcmZhY2VzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIFR5cGUgdiA9IGN1cnJlbnRDbGFzc0ludGVyZmFjZXMuZ2V0KGkpOworICAgICAgICAgICAgICAgICAgICBpZiAoaXNBc3NpZ25hYmxlRnJvbSh0LCB2KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgQ2xhc3M8Pz4gdGMgPSBnZXRDbGFzcyh0KTsKKyAgICAgICAgaWYgKHRjLmlzSW50ZXJmYWNlKCkpIHsKKyAgICAgICAgICAgIHRjID0gT2JqZWN0LmNsYXNzOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0Yy5pc0Fzc2lnbmFibGVGcm9tKGdldENsYXNzKHUpKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgQ2xhc3M8Pz4gZ2V0Q2xhc3MoZmluYWwgVHlwZSB0KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAodC5nZXRTb3J0KCkgPT0gVHlwZS5BUlJBWSkgeworICAgICAgICAgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKHQuZ2V0RGVzY3JpcHRvcigpLnJlcGxhY2UoJy8nLCAnLicpLAorICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIENsYXNzLmZvck5hbWUodC5nZXRDbGFzc05hbWUoKSwgZmFsc2UsIGxvYWRlcik7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZS50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vdHJlZS9hbmFseXNpcy9TbWFsbFNldC5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS90cmVlL2FuYWx5c2lzL1NtYWxsU2V0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDExYmUzYQotLS0gL2Rldi9udWxsCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vdHJlZS9hbmFseXNpcy9TbWFsbFNldC5qYXZhCkBAIC0wLDAgKzEsMTYzIEBACisvKgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBPcmFjbGUgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKKyAqIHF1ZXN0aW9ucy4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGlzIGF2YWlsYWJsZSB1bmRlciBhbmQgZ292ZXJuZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiBIb3dldmVyLCB0aGUgZm9sbG93aW5nIG5vdGljZSBhY2NvbXBhbmllZCB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGlzCisgKiBmaWxlOgorICoKKyAqIEFTTTogYSB2ZXJ5IHNtYWxsIGFuZCBmYXN0IEphdmEgYnl0ZWNvZGUgbWFuaXB1bGF0aW9uIGZyYW1ld29yaworICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMTEgSU5SSUEsIEZyYW5jZSBUZWxlY29tCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2UgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLnRyZWUuYW5hbHlzaXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RTZXQ7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8qKgorICogQSBzZXQgb2YgYXQgbW9zdCB0d28gZWxlbWVudHMuCisgKgorICogQGF1dGhvciBFcmljIEJydW5ldG9uCisgKi8KK2NsYXNzIFNtYWxsU2V0PEU+IGV4dGVuZHMgQWJzdHJhY3RTZXQ8RT4gaW1wbGVtZW50cyBJdGVyYXRvcjxFPiB7CisKKyAgICAvLyBpZiBlMSBpcyBudWxsLCBlMiBtdXN0IGJlIG51bGw7IG90aGVyd2lzZSBlMiBtdXN0IGJlIGRpZmZlcmVudCBmcm9tIGUxCisKKyAgICBFIGUxLCBlMjsKKworICAgIHN0YXRpYyBmaW5hbCA8VD4gU2V0PFQ+IGVtcHR5U2V0KCkgeworICAgICAgICByZXR1cm4gbmV3IFNtYWxsU2V0PFQ+KG51bGwsIG51bGwpOworICAgIH0KKworICAgIFNtYWxsU2V0KGZpbmFsIEUgZTEsIGZpbmFsIEUgZTIpIHsKKyAgICAgICAgdGhpcy5lMSA9IGUxOworICAgICAgICB0aGlzLmUyID0gZTI7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIEltcGxlbWVudGF0aW9uIG9mIGluaGVyaXRlZCBhYnN0cmFjdCBtZXRob2RzCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgeworICAgICAgICByZXR1cm4gbmV3IFNtYWxsU2V0PEU+KGUxLCBlMik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBzaXplKCkgeworICAgICAgICByZXR1cm4gZTEgPT0gbnVsbCA/IDAgOiAoZTIgPT0gbnVsbCA/IDEgOiAyKTsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gSW1wbGVtZW50YXRpb24gb2YgdGhlIEl0ZXJhdG9yIGludGVyZmFjZQorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7CisgICAgICAgIHJldHVybiBlMSAhPSBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBFIG5leHQoKSB7CisgICAgICAgIGlmIChlMSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIEUgZSA9IGUxOworICAgICAgICBlMSA9IGUyOworICAgICAgICBlMiA9IG51bGw7CisgICAgICAgIHJldHVybiBlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gVXRpbGl0eSBtZXRob2RzCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgU2V0PEU+IHVuaW9uKGZpbmFsIFNtYWxsU2V0PEU+IHMpIHsKKyAgICAgICAgaWYgKChzLmUxID09IGUxICYmIHMuZTIgPT0gZTIpIHx8IChzLmUxID09IGUyICYmIHMuZTIgPT0gZTEpKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpczsgLy8gaWYgdGhlIHR3byBzZXRzIGFyZSBlcXVhbCwgcmV0dXJuIHRoaXMKKyAgICAgICAgfQorICAgICAgICBpZiAocy5lMSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpczsgLy8gaWYgcyBpcyBlbXB0eSwgcmV0dXJuIHRoaXMKKyAgICAgICAgfQorICAgICAgICBpZiAoZTEgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHM7IC8vIGlmIHRoaXMgaXMgZW1wdHksIHJldHVybiBzCisgICAgICAgIH0KKyAgICAgICAgaWYgKHMuZTIgPT0gbnVsbCkgeyAvLyBzIGNvbnRhaW5zIGV4YWN0bHkgb25lIGVsZW1lbnQKKyAgICAgICAgICAgIGlmIChlMiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTbWFsbFNldDxFPihlMSwgcy5lMSk7IC8vIG5lY2Vzc2FyaWx5IGUxICE9IHMuZTEKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocy5lMSA9PSBlMSB8fCBzLmUxID09IGUyKSB7IC8vIHMgaXMgaW5jbHVkZWQgaW4gdGhpcworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChlMiA9PSBudWxsKSB7IC8vIHRoaXMgY29udGFpbnMgZXhhY3RseSBvbmUgZWxlbWVudAorICAgICAgICAgICAgLy8gaWYgKHMuZTIgPT0gbnVsbCkgeyAvLyBjYW5ub3QgaGFwcGVuCisgICAgICAgICAgICAvLyByZXR1cm4gbmV3IFNtYWxsU2V0KGUxLCBzLmUxKTsgLy8gbmVjZXNzYXJpbHkgZTEgIT0gcy5lMQorICAgICAgICAgICAgLy8gfSBlbHNlCisgICAgICAgICAgICBpZiAoZTEgPT0gcy5lMSB8fCBlMSA9PSBzLmUyKSB7IC8vIHRoaXMgaW4gaW5jbHVkZWQgaW4gcworICAgICAgICAgICAgICAgIHJldHVybiBzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIGhlcmUgd2Uga25vdyB0aGF0IHRoZXJlIGFyZSBhdCBsZWFzdCAzIGRpc3RpbmN0IGVsZW1lbnRzCisgICAgICAgIEhhc2hTZXQ8RT4gciA9IG5ldyBIYXNoU2V0PEU+KDQpOworICAgICAgICByLmFkZChlMSk7CisgICAgICAgIGlmIChlMiAhPSBudWxsKSB7CisgICAgICAgICAgICByLmFkZChlMik7CisgICAgICAgIH0KKyAgICAgICAgci5hZGQocy5lMSk7CisgICAgICAgIGlmIChzLmUyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHIuYWRkKHMuZTIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vdHJlZS9hbmFseXNpcy9Tb3VyY2VJbnRlcnByZXRlci5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS90cmVlL2FuYWx5c2lzL1NvdXJjZUludGVycHJldGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTMxZjY1NgotLS0gL2Rldi9udWxsCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vdHJlZS9hbmFseXNpcy9Tb3VyY2VJbnRlcnByZXRlci5qYXZhCkBAIC0wLDAgKzEsMjM1IEBACisvKgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBPcmFjbGUgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKKyAqIHF1ZXN0aW9ucy4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGlzIGF2YWlsYWJsZSB1bmRlciBhbmQgZ292ZXJuZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiBIb3dldmVyLCB0aGUgZm9sbG93aW5nIG5vdGljZSBhY2NvbXBhbmllZCB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGlzCisgKiBmaWxlOgorICoKKyAqIEFTTTogYSB2ZXJ5IHNtYWxsIGFuZCBmYXN0IEphdmEgYnl0ZWNvZGUgbWFuaXB1bGF0aW9uIGZyYW1ld29yaworICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMTEgSU5SSUEsIEZyYW5jZSBUZWxlY29tCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2UgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLnRyZWUuYW5hbHlzaXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLk9wY29kZXM7CitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLlR5cGU7CitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLnRyZWUuQWJzdHJhY3RJbnNuTm9kZTsKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20udHJlZS5GaWVsZEluc25Ob2RlOworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS50cmVlLkludm9rZUR5bmFtaWNJbnNuTm9kZTsKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20udHJlZS5MZGNJbnNuTm9kZTsKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20udHJlZS5NZXRob2RJbnNuTm9kZTsKKworLyoqCisgKiBBbiB7QGxpbmsgSW50ZXJwcmV0ZXJ9IGZvciB7QGxpbmsgU291cmNlVmFsdWV9IHZhbHVlcy4KKyAqCisgKiBAYXV0aG9yIEVyaWMgQnJ1bmV0b24KKyAqLworcHVibGljIGNsYXNzIFNvdXJjZUludGVycHJldGVyIGV4dGVuZHMgSW50ZXJwcmV0ZXI8U291cmNlVmFsdWU+IGltcGxlbWVudHMKKyAgICAgICAgT3Bjb2RlcworeworCisgICAgcHVibGljIFNvdXJjZUludGVycHJldGVyKCkgeworICAgICAgICBzdXBlcihBU000KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU291cmNlSW50ZXJwcmV0ZXIoZmluYWwgaW50IGFwaSkgeworICAgICAgICBzdXBlcihhcGkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTb3VyY2VWYWx1ZSBuZXdWYWx1ZShmaW5hbCBUeXBlIHR5cGUpIHsKKyAgICAgICAgaWYgKHR5cGUgPT0gVHlwZS5WT0lEX1RZUEUpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgU291cmNlVmFsdWUodHlwZSA9PSBudWxsID8gMSA6IHR5cGUuZ2V0U2l6ZSgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU291cmNlVmFsdWUgbmV3T3BlcmF0aW9uKGZpbmFsIEFic3RyYWN0SW5zbk5vZGUgaW5zbikgeworICAgICAgICBpbnQgc2l6ZTsKKyAgICAgICAgc3dpdGNoIChpbnNuLmdldE9wY29kZSgpKSB7CisgICAgICAgICAgICBjYXNlIExDT05TVF8wOgorICAgICAgICAgICAgY2FzZSBMQ09OU1RfMToKKyAgICAgICAgICAgIGNhc2UgRENPTlNUXzA6CisgICAgICAgICAgICBjYXNlIERDT05TVF8xOgorICAgICAgICAgICAgICAgIHNpemUgPSAyOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBMREM6CisgICAgICAgICAgICAgICAgT2JqZWN0IGNzdCA9ICgoTGRjSW5zbk5vZGUpIGluc24pLmNzdDsKKyAgICAgICAgICAgICAgICBzaXplID0gY3N0IGluc3RhbmNlb2YgTG9uZyB8fCBjc3QgaW5zdGFuY2VvZiBEb3VibGUgPyAyIDogMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgR0VUU1RBVElDOgorICAgICAgICAgICAgICAgIHNpemUgPSBUeXBlLmdldFR5cGUoKChGaWVsZEluc25Ob2RlKSBpbnNuKS5kZXNjKS5nZXRTaXplKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHNpemUgPSAxOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgU291cmNlVmFsdWUoc2l6ZSwgaW5zbik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNvdXJjZVZhbHVlIGNvcHlPcGVyYXRpb24oZmluYWwgQWJzdHJhY3RJbnNuTm9kZSBpbnNuLCBmaW5hbCBTb3VyY2VWYWx1ZSB2YWx1ZSkgeworICAgICAgICByZXR1cm4gbmV3IFNvdXJjZVZhbHVlKHZhbHVlLmdldFNpemUoKSwgaW5zbik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNvdXJjZVZhbHVlIHVuYXJ5T3BlcmF0aW9uKGZpbmFsIEFic3RyYWN0SW5zbk5vZGUgaW5zbiwgZmluYWwgU291cmNlVmFsdWUgdmFsdWUpCisgICAgeworICAgICAgICBpbnQgc2l6ZTsKKyAgICAgICAgc3dpdGNoIChpbnNuLmdldE9wY29kZSgpKSB7CisgICAgICAgICAgICBjYXNlIExORUc6CisgICAgICAgICAgICBjYXNlIERORUc6CisgICAgICAgICAgICBjYXNlIEkyTDoKKyAgICAgICAgICAgIGNhc2UgSTJEOgorICAgICAgICAgICAgY2FzZSBMMkQ6CisgICAgICAgICAgICBjYXNlIEYyTDoKKyAgICAgICAgICAgIGNhc2UgRjJEOgorICAgICAgICAgICAgY2FzZSBEMkw6CisgICAgICAgICAgICAgICAgc2l6ZSA9IDI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEdFVEZJRUxEOgorICAgICAgICAgICAgICAgIHNpemUgPSBUeXBlLmdldFR5cGUoKChGaWVsZEluc25Ob2RlKSBpbnNuKS5kZXNjKS5nZXRTaXplKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHNpemUgPSAxOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgU291cmNlVmFsdWUoc2l6ZSwgaW5zbik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNvdXJjZVZhbHVlIGJpbmFyeU9wZXJhdGlvbigKKyAgICAgICAgZmluYWwgQWJzdHJhY3RJbnNuTm9kZSBpbnNuLAorICAgICAgICBmaW5hbCBTb3VyY2VWYWx1ZSB2YWx1ZTEsCisgICAgICAgIGZpbmFsIFNvdXJjZVZhbHVlIHZhbHVlMikKKyAgICB7CisgICAgICAgIGludCBzaXplOworICAgICAgICBzd2l0Y2ggKGluc24uZ2V0T3Bjb2RlKCkpIHsKKyAgICAgICAgICAgIGNhc2UgTEFMT0FEOgorICAgICAgICAgICAgY2FzZSBEQUxPQUQ6CisgICAgICAgICAgICBjYXNlIExBREQ6CisgICAgICAgICAgICBjYXNlIERBREQ6CisgICAgICAgICAgICBjYXNlIExTVUI6CisgICAgICAgICAgICBjYXNlIERTVUI6CisgICAgICAgICAgICBjYXNlIExNVUw6CisgICAgICAgICAgICBjYXNlIERNVUw6CisgICAgICAgICAgICBjYXNlIExESVY6CisgICAgICAgICAgICBjYXNlIERESVY6CisgICAgICAgICAgICBjYXNlIExSRU06CisgICAgICAgICAgICBjYXNlIERSRU06CisgICAgICAgICAgICBjYXNlIExTSEw6CisgICAgICAgICAgICBjYXNlIExTSFI6CisgICAgICAgICAgICBjYXNlIExVU0hSOgorICAgICAgICAgICAgY2FzZSBMQU5EOgorICAgICAgICAgICAgY2FzZSBMT1I6CisgICAgICAgICAgICBjYXNlIExYT1I6CisgICAgICAgICAgICAgICAgc2l6ZSA9IDI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHNpemUgPSAxOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgU291cmNlVmFsdWUoc2l6ZSwgaW5zbik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNvdXJjZVZhbHVlIHRlcm5hcnlPcGVyYXRpb24oCisgICAgICAgIGZpbmFsIEFic3RyYWN0SW5zbk5vZGUgaW5zbiwKKyAgICAgICAgZmluYWwgU291cmNlVmFsdWUgdmFsdWUxLAorICAgICAgICBmaW5hbCBTb3VyY2VWYWx1ZSB2YWx1ZTIsCisgICAgICAgIGZpbmFsIFNvdXJjZVZhbHVlIHZhbHVlMykKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgU291cmNlVmFsdWUoMSwgaW5zbik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNvdXJjZVZhbHVlIG5hcnlPcGVyYXRpb24oZmluYWwgQWJzdHJhY3RJbnNuTm9kZSBpbnNuLCBmaW5hbCBMaXN0PD8gZXh0ZW5kcyBTb3VyY2VWYWx1ZT4gdmFsdWVzKSB7CisgICAgICAgIGludCBzaXplOworICAgICAgICBpbnQgb3Bjb2RlID0gaW5zbi5nZXRPcGNvZGUoKTsKKyAgICAgICAgaWYgKG9wY29kZSA9PSBNVUxUSUFORVdBUlJBWSkgeworICAgICAgICAgICAgc2l6ZSA9IDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTdHJpbmcgZGVzYyA9IChvcGNvZGUgPT0gSU5WT0tFRFlOQU1JQyk/CisgICAgICAgICAgICAgICAgICAgICgoSW52b2tlRHluYW1pY0luc25Ob2RlKSBpbnNuKS5kZXNjOgorICAgICAgICAgICAgICAgICAgICAoKE1ldGhvZEluc25Ob2RlKSBpbnNuKS5kZXNjOworICAgICAgICAgICAgc2l6ZSA9IFR5cGUuZ2V0UmV0dXJuVHlwZShkZXNjKS5nZXRTaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBTb3VyY2VWYWx1ZShzaXplLCBpbnNuKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZXR1cm5PcGVyYXRpb24oCisgICAgICAgIGZpbmFsIEFic3RyYWN0SW5zbk5vZGUgaW5zbiwKKyAgICAgICAgZmluYWwgU291cmNlVmFsdWUgdmFsdWUsCisgICAgICAgIGZpbmFsIFNvdXJjZVZhbHVlIGV4cGVjdGVkKQorICAgIHsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU291cmNlVmFsdWUgbWVyZ2UoZmluYWwgU291cmNlVmFsdWUgZCwgZmluYWwgU291cmNlVmFsdWUgdykgeworICAgICAgICBpZiAoZC5pbnNucyBpbnN0YW5jZW9mIFNtYWxsU2V0ICYmIHcuaW5zbnMgaW5zdGFuY2VvZiBTbWFsbFNldCkgeworICAgICAgICAgICAgU2V0PEFic3RyYWN0SW5zbk5vZGU+IHMgPSAoKFNtYWxsU2V0PEFic3RyYWN0SW5zbk5vZGU+KSBkLmluc25zKS51bmlvbigoU21hbGxTZXQ8QWJzdHJhY3RJbnNuTm9kZT4pIHcuaW5zbnMpOworICAgICAgICAgICAgaWYgKHMgPT0gZC5pbnNucyAmJiBkLnNpemUgPT0gdy5zaXplKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU291cmNlVmFsdWUoTWF0aC5taW4oZC5zaXplLCB3LnNpemUpLCBzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZC5zaXplICE9IHcuc2l6ZSB8fCAhZC5pbnNucy5jb250YWluc0FsbCh3Lmluc25zKSkgeworICAgICAgICAgICAgSGFzaFNldDxBYnN0cmFjdEluc25Ob2RlPiBzID0gbmV3IEhhc2hTZXQ8QWJzdHJhY3RJbnNuTm9kZT4oKTsKKyAgICAgICAgICAgIHMuYWRkQWxsKGQuaW5zbnMpOworICAgICAgICAgICAgcy5hZGRBbGwody5pbnNucyk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFNvdXJjZVZhbHVlKE1hdGgubWluKGQuc2l6ZSwgdy5zaXplKSwgcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS90cmVlL2FuYWx5c2lzL1NvdXJjZVZhbHVlLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL3RyZWUvYW5hbHlzaXMvU291cmNlVmFsdWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDRhMzI5Ci0tLSAvZGV2L251bGwKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS90cmVlL2FuYWx5c2lzL1NvdXJjZVZhbHVlLmphdmEKQEAgLTAsMCArMSwxMjYgQEAKKy8qCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IE9yYWNsZSBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQorICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQorICogcXVlc3Rpb25zLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgaXMgYXZhaWxhYmxlIHVuZGVyIGFuZCBnb3Zlcm5lZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIEhvd2V2ZXIsIHRoZSBmb2xsb3dpbmcgbm90aWNlIGFjY29tcGFuaWVkIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoaXMKKyAqIGZpbGU6CisgKgorICogQVNNOiBhIHZlcnkgc21hbGwgYW5kIGZhc3QgSmF2YSBieXRlY29kZSBtYW5pcHVsYXRpb24gZnJhbWV3b3JrCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAxMSBJTlJJQSwgRnJhbmNlIFRlbGVjb20KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20udHJlZS5hbmFseXNpczsKKworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20udHJlZS5BYnN0cmFjdEluc25Ob2RlOworCisvKioKKyAqIEEge0BsaW5rIFZhbHVlfSB0aGF0IGlzIHJlcHJlc2VudGVkIGJ5IGl0cyB0eXBlIGluIGEgdHdvIHR5cGVzIHR5cGUgc3lzdGVtLgorICogVGhpcyB0eXBlIHN5c3RlbSBkaXN0aW5ndWlzaGVzIHRoZSBPTkVXT1JEIGFuZCBUV09XT1JEUyB0eXBlcy4KKyAqCisgKiBAYXV0aG9yIEVyaWMgQnJ1bmV0b24KKyAqLworcHVibGljIGNsYXNzIFNvdXJjZVZhbHVlIGltcGxlbWVudHMgVmFsdWUgeworCisgICAgLyoqCisgICAgICogVGhlIHNpemUgb2YgdGhpcyB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IHNpemU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgaW5zdHJ1Y3Rpb25zIHRoYXQgY2FuIHByb2R1Y2UgdGhpcyB2YWx1ZS4gRm9yIGV4YW1wbGUsIGZvciB0aGUgSmF2YQorICAgICAqIGNvZGUgYmVsb3csIHRoZSBpbnN0cnVjdGlvbnMgdGhhdCBjYW4gcHJvZHVjZSB0aGUgdmFsdWUgb2YgPHR0Pmk8L3R0PgorICAgICAqIGF0IGxpbmUgNSBhcmUgdGhlIHR4byBJU1RPUkUgaW5zdHJ1Y3Rpb25zIGF0IGxpbmUgMSBhbmQgMzoKKyAgICAgKgorICAgICAqIDxwcmU+CisgICAgICogMTogaSA9IDA7CisgICAgICogMjogaWYgKC4uLikgeworICAgICAqIDM6ICAgaSA9IDE7CisgICAgICogNDogfQorICAgICAqIDU6IHJldHVybiBpOworICAgICAqIDwvcHJlPgorICAgICAqCisgICAgICogVGhpcyBmaWVsZCBpcyBhIHNldCBvZiB7QGxpbmsgQWJzdHJhY3RJbnNuTm9kZX0gb2JqZWN0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgU2V0PEFic3RyYWN0SW5zbk5vZGU+IGluc25zOworCisgICAgcHVibGljIFNvdXJjZVZhbHVlKGZpbmFsIGludCBzaXplKSB7CisgICAgICAgIHRoaXMoc2l6ZSwgU21hbGxTZXQuPEFic3RyYWN0SW5zbk5vZGU+ZW1wdHlTZXQoKSk7CisgICAgfQorCisgICAgcHVibGljIFNvdXJjZVZhbHVlKGZpbmFsIGludCBzaXplLCBmaW5hbCBBYnN0cmFjdEluc25Ob2RlIGluc24pIHsKKyAgICAgICAgdGhpcy5zaXplID0gc2l6ZTsKKyAgICAgICAgdGhpcy5pbnNucyA9IG5ldyBTbWFsbFNldDxBYnN0cmFjdEluc25Ob2RlPihpbnNuLCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU291cmNlVmFsdWUoZmluYWwgaW50IHNpemUsIGZpbmFsIFNldDxBYnN0cmFjdEluc25Ob2RlPiBpbnNucykgeworICAgICAgICB0aGlzLnNpemUgPSBzaXplOworICAgICAgICB0aGlzLmluc25zID0gaW5zbnM7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRTaXplKCkgeworICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoZmluYWwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgU291cmNlVmFsdWUpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgU291cmNlVmFsdWUgdiA9IChTb3VyY2VWYWx1ZSkgdmFsdWU7CisgICAgICAgIHJldHVybiBzaXplID09IHYuc2l6ZSAmJiBpbnNucy5lcXVhbHModi5pbnNucyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgcmV0dXJuIGluc25zLmhhc2hDb2RlKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS90cmVlL2FuYWx5c2lzL1N1YnJvdXRpbmUuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vdHJlZS9hbmFseXNpcy9TdWJyb3V0aW5lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjcwZTIzMgotLS0gL2Rldi9udWxsCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vdHJlZS9hbmFseXNpcy9TdWJyb3V0aW5lLmphdmEKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IE9yYWNsZSBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQorICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQorICogcXVlc3Rpb25zLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgaXMgYXZhaWxhYmxlIHVuZGVyIGFuZCBnb3Zlcm5lZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIEhvd2V2ZXIsIHRoZSBmb2xsb3dpbmcgbm90aWNlIGFjY29tcGFuaWVkIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoaXMKKyAqIGZpbGU6CisgKgorICogQVNNOiBhIHZlcnkgc21hbGwgYW5kIGZhc3QgSmF2YSBieXRlY29kZSBtYW5pcHVsYXRpb24gZnJhbWV3b3JrCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAxMSBJTlJJQSwgRnJhbmNlIFRlbGVjb20KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20udHJlZS5hbmFseXNpczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20udHJlZS5KdW1wSW5zbk5vZGU7CitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLnRyZWUuTGFiZWxOb2RlOworCisvKioKKyAqIEEgbWV0aG9kIHN1YnJvdXRpbmUgKGNvcnJlc3BvbmRzIHRvIGEgSlNSIGluc3RydWN0aW9uKS4KKyAqCisgKiBAYXV0aG9yIEVyaWMgQnJ1bmV0b24KKyAqLworY2xhc3MgU3Vicm91dGluZSB7CisKKyAgICBMYWJlbE5vZGUgc3RhcnQ7CisKKyAgICBib29sZWFuW10gYWNjZXNzOworCisgICAgTGlzdDxKdW1wSW5zbk5vZGU+IGNhbGxlcnM7CisKKyAgICBwcml2YXRlIFN1YnJvdXRpbmUoKSB7CisgICAgfQorCisgICAgU3Vicm91dGluZSgKKyAgICAgICAgZmluYWwgTGFiZWxOb2RlIHN0YXJ0LAorICAgICAgICBmaW5hbCBpbnQgbWF4TG9jYWxzLAorICAgICAgICBmaW5hbCBKdW1wSW5zbk5vZGUgY2FsbGVyKQorICAgIHsKKyAgICAgICAgdGhpcy5zdGFydCA9IHN0YXJ0OworICAgICAgICB0aGlzLmFjY2VzcyA9IG5ldyBib29sZWFuW21heExvY2Fsc107CisgICAgICAgIHRoaXMuY2FsbGVycyA9IG5ldyBBcnJheUxpc3Q8SnVtcEluc25Ob2RlPigpOworICAgICAgICBjYWxsZXJzLmFkZChjYWxsZXIpOworICAgIH0KKworICAgIHB1YmxpYyBTdWJyb3V0aW5lIGNvcHkoKSB7CisgICAgICAgIFN1YnJvdXRpbmUgcmVzdWx0ID0gbmV3IFN1YnJvdXRpbmUoKTsKKyAgICAgICAgcmVzdWx0LnN0YXJ0ID0gc3RhcnQ7CisgICAgICAgIHJlc3VsdC5hY2Nlc3MgPSBuZXcgYm9vbGVhblthY2Nlc3MubGVuZ3RoXTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShhY2Nlc3MsIDAsIHJlc3VsdC5hY2Nlc3MsIDAsIGFjY2Vzcy5sZW5ndGgpOworICAgICAgICByZXN1bHQuY2FsbGVycyA9IG5ldyBBcnJheUxpc3Q8SnVtcEluc25Ob2RlPihjYWxsZXJzKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBtZXJnZShmaW5hbCBTdWJyb3V0aW5lIHN1YnJvdXRpbmUpIHRocm93cyBBbmFseXplckV4Y2VwdGlvbiB7CisgICAgICAgIGJvb2xlYW4gY2hhbmdlcyA9IGZhbHNlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFjY2Vzcy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgaWYgKHN1YnJvdXRpbmUuYWNjZXNzW2ldICYmICFhY2Nlc3NbaV0pIHsKKyAgICAgICAgICAgICAgICBhY2Nlc3NbaV0gPSB0cnVlOworICAgICAgICAgICAgICAgIGNoYW5nZXMgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChzdWJyb3V0aW5lLnN0YXJ0ID09IHN0YXJ0KSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN1YnJvdXRpbmUuY2FsbGVycy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgICAgIEp1bXBJbnNuTm9kZSBjYWxsZXIgPSBzdWJyb3V0aW5lLmNhbGxlcnMuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmICghY2FsbGVycy5jb250YWlucyhjYWxsZXIpKSB7CisgICAgICAgICAgICAgICAgICAgIGNhbGxlcnMuYWRkKGNhbGxlcik7CisgICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2hhbmdlczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL3RyZWUvYW5hbHlzaXMvVmFsdWUuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vdHJlZS9hbmFseXNpcy9WYWx1ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3YWRmNDgKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL3RyZWUvYW5hbHlzaXMvVmFsdWUuamF2YQpAQCAtMCwwICsxLDc0IEBACisvKgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBPcmFjbGUgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKKyAqIHF1ZXN0aW9ucy4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGlzIGF2YWlsYWJsZSB1bmRlciBhbmQgZ292ZXJuZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiBIb3dldmVyLCB0aGUgZm9sbG93aW5nIG5vdGljZSBhY2NvbXBhbmllZCB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGlzCisgKiBmaWxlOgorICoKKyAqIEFTTTogYSB2ZXJ5IHNtYWxsIGFuZCBmYXN0IEphdmEgYnl0ZWNvZGUgbWFuaXB1bGF0aW9uIGZyYW1ld29yaworICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMTEgSU5SSUEsIEZyYW5jZSBUZWxlY29tCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2UgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLnRyZWUuYW5hbHlzaXM7CisKKy8qKgorICogQW4gaW1tdXRhYmxlIHN5bWJvbGljIHZhbHVlIGZvciBzZW1hbnRpYyBpbnRlcnByZXRhdGlvbiBvZiBieXRlY29kZS4KKyAqCisgKiBAYXV0aG9yIEVyaWMgQnJ1bmV0b24KKyAqLworcHVibGljIGludGVyZmFjZSBWYWx1ZSB7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzaXplIG9mIHRoaXMgdmFsdWUgaW4gd29yZHMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGVpdGhlciAxIG9yIDIuCisgICAgICovCisgICAgaW50IGdldFNpemUoKTsKK30KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vdXRpbC9BU01pZmlhYmxlLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL3V0aWwvQVNNaWZpYWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2ZjdhNjEKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL3V0aWwvQVNNaWZpYWJsZS5qYXZhCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IE9yYWNsZSBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQorICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQorICogcXVlc3Rpb25zLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgaXMgYXZhaWxhYmxlIHVuZGVyIGFuZCBnb3Zlcm5lZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIEhvd2V2ZXIsIHRoZSBmb2xsb3dpbmcgbm90aWNlIGFjY29tcGFuaWVkIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoaXMKKyAqIGZpbGU6CisgKgorICogQVNNOiBhIHZlcnkgc21hbGwgYW5kIGZhc3QgSmF2YSBieXRlY29kZSBtYW5pcHVsYXRpb24gZnJhbWV3b3JrCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAxMSBJTlJJQSwgRnJhbmNlIFRlbGVjb20KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20udXRpbDsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uTGFiZWw7CisKKy8qKgorICogQW4ge0BsaW5rIGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5BdHRyaWJ1dGUgQXR0cmlidXRlfSB0aGF0IGNhbiBwcmludCB0aGUgQVNNIGNvZGUKKyAqIHRvIGNyZWF0ZSBhbiBlcXVpdmFsZW50IGF0dHJpYnV0ZS4KKyAqCisgKiBAYXV0aG9yIEV1Z2VuZSBLdWxlc2hvdgorICovCitwdWJsaWMgaW50ZXJmYWNlIEFTTWlmaWFibGUgeworCisgICAgLyoqCisgICAgICogUHJpbnRzIHRoZSBBU00gY29kZSB0byBjcmVhdGUgYW4gYXR0cmlidXRlIGVxdWFsIHRvIHRoaXMgYXR0cmlidXRlLgorICAgICAqCisgICAgICogQHBhcmFtIGJ1ZiBhIGJ1ZmZlciB1c2VkIGZvciBwcmludGluZyBKYXZhIGNvZGUuCisgICAgICogQHBhcmFtIHZhck5hbWUgbmFtZSBvZiB0aGUgdmFyaWFibGUgaW4gYSBwcmludGVkIGNvZGUgdXNlZCB0byBzdG9yZQorICAgICAqICAgICAgICBhdHRyaWJ1dGUgaW5zdGFuY2UuCisgICAgICogQHBhcmFtIGxhYmVsTmFtZXMgbWFwIG9mIGxhYmVsIGluc3RhbmNlcyB0byB0aGVpciBuYW1lcy4KKyAgICAgKi8KKyAgICB2b2lkIGFzbWlmeShTdHJpbmdCdWZmZXIgYnVmLCBTdHJpbmcgdmFyTmFtZSwgTWFwPExhYmVsLCBTdHJpbmc+IGxhYmVsTmFtZXMpOworfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS91dGlsL0FTTWlmaWVyLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL3V0aWwvQVNNaWZpZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmNiZWRkCi0tLSAvZGV2L251bGwKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS91dGlsL0FTTWlmaWVyLmphdmEKQEAgLTAsMCArMSwxMjY4IEBACisvKgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBPcmFjbGUgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKKyAqIHF1ZXN0aW9ucy4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGlzIGF2YWlsYWJsZSB1bmRlciBhbmQgZ292ZXJuZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiBIb3dldmVyLCB0aGUgZm9sbG93aW5nIG5vdGljZSBhY2NvbXBhbmllZCB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGlzCisgKiBmaWxlOgorICoKKyAqIEFTTTogYSB2ZXJ5IHNtYWxsIGFuZCBmYXN0IEphdmEgYnl0ZWNvZGUgbWFuaXB1bGF0aW9uIGZyYW1ld29yaworICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMTEgSU5SSUEsIEZyYW5jZSBUZWxlY29tCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgR29vZ2xlCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2UgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLnV0aWw7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uQXR0cmlidXRlOworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5DbGFzc1JlYWRlcjsKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uSGFuZGxlOworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5MYWJlbDsKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uT3Bjb2RlczsKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uVHlwZTsKKworLyoqCisgKiBBIHtAbGluayBQcmludGVyfSB0aGF0IHByaW50cyB0aGUgQVNNIGNvZGUgdG8gZ2VuZXJhdGUgdGhlIGNsYXNzZXMgaWYgdmlzaXRzLgorICoKKyAqIEBhdXRob3IgRXJpYyBCcnVuZXRvbgorICovCitwdWJsaWMgY2xhc3MgQVNNaWZpZXIgZXh0ZW5kcyBQcmludGVyIHsKKworICAgIC8qKgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSB2aXNpdG9yIHZhcmlhYmxlIGluIHRoZSBwcm9kdWNlZCBjb2RlLgorICAgICAqLworICAgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgbmFtZTsKKworICAgIC8qKgorICAgICAqIElkZW50aWZpZXIgb2YgdGhlIGFubm90YXRpb24gdmlzaXRvciB2YXJpYWJsZSBpbiB0aGUgcHJvZHVjZWQgY29kZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZmluYWwgaW50IGlkOworCisgICAgLyoqCisgICAgICogVGhlIGxhYmVsIG5hbWVzLiBUaGlzIG1hcCBhc3NvY2lhdGVzIFN0cmluZyB2YWx1ZXMgdG8gTGFiZWwga2V5cy4gSXQgaXMKKyAgICAgKiB1c2VkIG9ubHkgaW4gQVNNaWZpZXJNZXRob2RWaXNpdG9yLgorICAgICAqLworICAgIHByb3RlY3RlZCBNYXA8TGFiZWwsIFN0cmluZz4gbGFiZWxOYW1lczsKKworICAgIC8qKgorICAgICAqIFBzZXVkbyBhY2Nlc3MgZmxhZyB1c2VkIHRvIGRpc3Rpbmd1aXNoIGNsYXNzIGFjY2VzcyBmbGFncy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUNDRVNTX0NMQVNTID0gMjYyMTQ0OworCisgICAgLyoqCisgICAgICogUHNldWRvIGFjY2VzcyBmbGFnIHVzZWQgdG8gZGlzdGluZ3Vpc2ggZmllbGQgYWNjZXNzIGZsYWdzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBQ0NFU1NfRklFTEQgPSA1MjQyODg7CisKKyAgICAvKioKKyAgICAgKiBQc2V1ZG8gYWNjZXNzIGZsYWcgdXNlZCB0byBkaXN0aW5ndWlzaCBpbm5lciBjbGFzcyBmbGFncy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUNDRVNTX0lOTkVSID0gMTA0ODU3NjsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0BsaW5rIEFTTWlmaWVyfS4gPGk+U3ViY2xhc3NlcyBtdXN0IG5vdCB1c2UgdGhpcworICAgICAqIGNvbnN0cnVjdG9yPC9pPi4gSW5zdGVhZCwgdGhleSBtdXN0IHVzZSB0aGUKKyAgICAgKiB7QGxpbmsgI0FTTWlmaWVyKGludCwgU3RyaW5nLCBpbnQpfSB2ZXJzaW9uLgorICAgICAqLworICAgIHB1YmxpYyBBU01pZmllcigpIHsKKyAgICAgICAgdGhpcyhPcGNvZGVzLkFTTTQsICJjdyIsIDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0BsaW5rIEFTTWlmaWVyfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcGkgdGhlIEFTTSBBUEkgdmVyc2lvbiBpbXBsZW1lbnRlZCBieSB0aGlzIGNsYXNzLiBNdXN0IGJlIG9uZSBvZgorICAgICAqICAgICAgICB7QGxpbmsgT3Bjb2RlcyNBU000fS4KKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgdmlzaXRvciB2YXJpYWJsZSBpbiB0aGUgcHJvZHVjZWQgY29kZS4KKyAgICAgKiBAcGFyYW0gaWQgaWRlbnRpZmllciBvZiB0aGUgYW5ub3RhdGlvbiB2aXNpdG9yIHZhcmlhYmxlIGluIHRoZSBwcm9kdWNlZAorICAgICAqICAgICAgICBjb2RlLgorICAgICAqLworICAgIHByb3RlY3RlZCBBU01pZmllcihmaW5hbCBpbnQgYXBpLCBmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgaW50IGlkKSB7CisgICAgICAgIHN1cGVyKGFwaSk7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMuaWQgPSBpZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmludHMgdGhlIEFTTSBzb3VyY2UgY29kZSB0byBnZW5lcmF0ZSB0aGUgZ2l2ZW4gY2xhc3MgdG8gdGhlIHN0YW5kYXJkCisgICAgICogb3V0cHV0LiA8cD4gVXNhZ2U6IEFTTWlmaWVyIFstZGVidWddICZsdDtiaW5hcnkKKyAgICAgKiBjbGFzcyBuYW1lIG9yIGNsYXNzIGZpbGUgbmFtZSZndDsKKyAgICAgKgorICAgICAqIEBwYXJhbSBhcmdzIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzLgorICAgICAqCisgICAgICogQHRocm93cyBFeGNlcHRpb24gaWYgdGhlIGNsYXNzIGNhbm5vdCBiZSBmb3VuZCwgb3IgaWYgYW4gSU8gZXhjZXB0aW9uCisgICAgICogICAgICAgICBvY2N1cnMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oZmluYWwgU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgaW50IGZsYWdzID0gQ2xhc3NSZWFkZXIuU0tJUF9ERUJVRzsKKworICAgICAgICBib29sZWFuIG9rID0gdHJ1ZTsKKyAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgMSB8fCBhcmdzLmxlbmd0aCA+IDIpIHsKKyAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9rICYmICItZGVidWciLmVxdWFscyhhcmdzWzBdKSkgeworICAgICAgICAgICAgaSA9IDE7CisgICAgICAgICAgICBmbGFncyA9IDA7CisgICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggIT0gMikgeworICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFvaykgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJQcmludHMgdGhlIEFTTSBjb2RlIHRvIGdlbmVyYXRlIHRoZSBnaXZlbiBjbGFzcy4iKTsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiVXNhZ2U6IEFTTWlmaWVyIFstZGVidWddICIKKyAgICAgICAgICAgICAgICAgICAgKyAiPGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIGNsYXNzIGZpbGUgbmFtZT4iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBDbGFzc1JlYWRlciBjcjsKKyAgICAgICAgaWYgKGFyZ3NbaV0uZW5kc1dpdGgoIi5jbGFzcyIpIHx8IGFyZ3NbaV0uaW5kZXhPZignXFwnKSA+IC0xCisgICAgICAgICAgICAgICAgfHwgYXJnc1tpXS5pbmRleE9mKCcvJykgPiAtMSkKKyAgICAgICAgeworICAgICAgICAgICAgY3IgPSBuZXcgQ2xhc3NSZWFkZXIobmV3IEZpbGVJbnB1dFN0cmVhbShhcmdzW2ldKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjciA9IG5ldyBDbGFzc1JlYWRlcihhcmdzW2ldKTsKKyAgICAgICAgfQorICAgICAgICBjci5hY2NlcHQobmV3IFRyYWNlQ2xhc3NWaXNpdG9yKG51bGwsCisgICAgICAgICAgICAgICAgbmV3IEFTTWlmaWVyKCksCisgICAgICAgICAgICAgICAgbmV3IFByaW50V3JpdGVyKFN5c3RlbS5vdXQpKSwgZmxhZ3MpOworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIENsYXNzZXMKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KAorICAgICAgICBmaW5hbCBpbnQgdmVyc2lvbiwKKyAgICAgICAgZmluYWwgaW50IGFjY2VzcywKKyAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUsCisgICAgICAgIGZpbmFsIFN0cmluZyBzaWduYXR1cmUsCisgICAgICAgIGZpbmFsIFN0cmluZyBzdXBlck5hbWUsCisgICAgICAgIGZpbmFsIFN0cmluZ1tdIGludGVyZmFjZXMpCisgICAgeworICAgICAgICBTdHJpbmcgc2ltcGxlTmFtZTsKKyAgICAgICAgaW50IG4gPSBuYW1lLmxhc3RJbmRleE9mKCcvJyk7CisgICAgICAgIGlmIChuID09IC0xKSB7CisgICAgICAgICAgICBzaW1wbGVOYW1lID0gbmFtZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRleHQuYWRkKCJwYWNrYWdlIGFzbS4iICsgbmFtZS5zdWJzdHJpbmcoMCwgbikucmVwbGFjZSgnLycsICcuJykKKyAgICAgICAgICAgICAgICAgICAgKyAiO1xuIik7CisgICAgICAgICAgICBzaW1wbGVOYW1lID0gbmFtZS5zdWJzdHJpbmcobiArIDEpOworICAgICAgICB9CisgICAgICAgIHRleHQuYWRkKCJpbXBvcnQgamF2YS51dGlsLio7XG4iKTsKKyAgICAgICAgdGV4dC5hZGQoImltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uKjtcbiIpOworICAgICAgICB0ZXh0LmFkZCgiaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5hdHRycy4qO1xuIik7CisgICAgICAgIHRleHQuYWRkKCJwdWJsaWMgY2xhc3MgIiArIHNpbXBsZU5hbWUgKyAiRHVtcCBpbXBsZW1lbnRzIE9wY29kZXMge1xuXG4iKTsKKyAgICAgICAgdGV4dC5hZGQoInB1YmxpYyBzdGF0aWMgYnl0ZVtdIGR1bXAgKCkgdGhyb3dzIEV4Y2VwdGlvbiB7XG5cbiIpOworICAgICAgICB0ZXh0LmFkZCgiQ2xhc3NXcml0ZXIgY3cgPSBuZXcgQ2xhc3NXcml0ZXIoMCk7XG4iKTsKKyAgICAgICAgdGV4dC5hZGQoIkZpZWxkVmlzaXRvciBmdjtcbiIpOworICAgICAgICB0ZXh0LmFkZCgiTWV0aG9kVmlzaXRvciBtdjtcbiIpOworICAgICAgICB0ZXh0LmFkZCgiQW5ub3RhdGlvblZpc2l0b3IgYXYwO1xuXG4iKTsKKworICAgICAgICBidWYuc2V0TGVuZ3RoKDApOworICAgICAgICBidWYuYXBwZW5kKCJjdy52aXNpdCgiKTsKKyAgICAgICAgc3dpdGNoICh2ZXJzaW9uKSB7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuVjFfMToKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCJWMV8xIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuVjFfMjoKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCJWMV8yIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuVjFfMzoKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCJWMV8zIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuVjFfNDoKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCJWMV80Iik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuVjFfNToKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCJWMV81Iik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuVjFfNjoKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCJWMV82Iik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuVjFfNzoKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCJWMV83Iik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQodmVyc2lvbik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnVmLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgYXBwZW5kQWNjZXNzKGFjY2VzcyB8IEFDQ0VTU19DTEFTUyk7CisgICAgICAgIGJ1Zi5hcHBlbmQoIiwgIik7CisgICAgICAgIGFwcGVuZENvbnN0YW50KG5hbWUpOworICAgICAgICBidWYuYXBwZW5kKCIsICIpOworICAgICAgICBhcHBlbmRDb25zdGFudChzaWduYXR1cmUpOworICAgICAgICBidWYuYXBwZW5kKCIsICIpOworICAgICAgICBhcHBlbmRDb25zdGFudChzdXBlck5hbWUpOworICAgICAgICBidWYuYXBwZW5kKCIsICIpOworICAgICAgICBpZiAoaW50ZXJmYWNlcyAhPSBudWxsICYmIGludGVyZmFjZXMubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgYnVmLmFwcGVuZCgibmV3IFN0cmluZ1tdIHsiKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW50ZXJmYWNlcy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoaSA9PSAwID8gIiAiIDogIiwgIik7CisgICAgICAgICAgICAgICAgYXBwZW5kQ29uc3RhbnQoaW50ZXJmYWNlc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWYuYXBwZW5kKCIgfSIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYnVmLmFwcGVuZCgibnVsbCIpOworICAgICAgICB9CisgICAgICAgIGJ1Zi5hcHBlbmQoIik7XG5cbiIpOworICAgICAgICB0ZXh0LmFkZChidWYudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRTb3VyY2UoZmluYWwgU3RyaW5nIGZpbGUsIGZpbmFsIFN0cmluZyBkZWJ1ZykgeworICAgICAgICBidWYuc2V0TGVuZ3RoKDApOworICAgICAgICBidWYuYXBwZW5kKCJjdy52aXNpdFNvdXJjZSgiKTsKKyAgICAgICAgYXBwZW5kQ29uc3RhbnQoZmlsZSk7CisgICAgICAgIGJ1Zi5hcHBlbmQoIiwgIik7CisgICAgICAgIGFwcGVuZENvbnN0YW50KGRlYnVnKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiKTtcblxuIik7CisgICAgICAgIHRleHQuYWRkKGJ1Zi50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdE91dGVyQ2xhc3MoCisgICAgICAgIGZpbmFsIFN0cmluZyBvd25lciwKKyAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUsCisgICAgICAgIGZpbmFsIFN0cmluZyBkZXNjKQorICAgIHsKKyAgICAgICAgYnVmLnNldExlbmd0aCgwKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiY3cudmlzaXRPdXRlckNsYXNzKCIpOworICAgICAgICBhcHBlbmRDb25zdGFudChvd25lcik7CisgICAgICAgIGJ1Zi5hcHBlbmQoIiwgIik7CisgICAgICAgIGFwcGVuZENvbnN0YW50KG5hbWUpOworICAgICAgICBidWYuYXBwZW5kKCIsICIpOworICAgICAgICBhcHBlbmRDb25zdGFudChkZXNjKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiKTtcblxuIik7CisgICAgICAgIHRleHQuYWRkKGJ1Zi50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQVNNaWZpZXIgdmlzaXRDbGFzc0Fubm90YXRpb24oCisgICAgICAgIGZpbmFsIFN0cmluZyBkZXNjLAorICAgICAgICBmaW5hbCBib29sZWFuIHZpc2libGUpCisgICAgeworICAgICAgICByZXR1cm4gdmlzaXRBbm5vdGF0aW9uKGRlc2MsIHZpc2libGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0Q2xhc3NBdHRyaWJ1dGUoZmluYWwgQXR0cmlidXRlIGF0dHIpIHsKKyAgICAgICAgdmlzaXRBdHRyaWJ1dGUoYXR0cik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRJbm5lckNsYXNzKAorICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSwKKyAgICAgICAgZmluYWwgU3RyaW5nIG91dGVyTmFtZSwKKyAgICAgICAgZmluYWwgU3RyaW5nIGlubmVyTmFtZSwKKyAgICAgICAgZmluYWwgaW50IGFjY2VzcykKKyAgICB7CisgICAgICAgIGJ1Zi5zZXRMZW5ndGgoMCk7CisgICAgICAgIGJ1Zi5hcHBlbmQoImN3LnZpc2l0SW5uZXJDbGFzcygiKTsKKyAgICAgICAgYXBwZW5kQ29uc3RhbnQobmFtZSk7CisgICAgICAgIGJ1Zi5hcHBlbmQoIiwgIik7CisgICAgICAgIGFwcGVuZENvbnN0YW50KG91dGVyTmFtZSk7CisgICAgICAgIGJ1Zi5hcHBlbmQoIiwgIik7CisgICAgICAgIGFwcGVuZENvbnN0YW50KGlubmVyTmFtZSk7CisgICAgICAgIGJ1Zi5hcHBlbmQoIiwgIik7CisgICAgICAgIGFwcGVuZEFjY2VzcyhhY2Nlc3MgfCBBQ0NFU1NfSU5ORVIpOworICAgICAgICBidWYuYXBwZW5kKCIpO1xuXG4iKTsKKyAgICAgICAgdGV4dC5hZGQoYnVmLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBBU01pZmllciB2aXNpdEZpZWxkKAorICAgICAgICBmaW5hbCBpbnQgYWNjZXNzLAorICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSwKKyAgICAgICAgZmluYWwgU3RyaW5nIGRlc2MsCisgICAgICAgIGZpbmFsIFN0cmluZyBzaWduYXR1cmUsCisgICAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSkKKyAgICB7CisgICAgICAgIGJ1Zi5zZXRMZW5ndGgoMCk7CisgICAgICAgIGJ1Zi5hcHBlbmQoIntcbiIpOworICAgICAgICBidWYuYXBwZW5kKCJmdiA9IGN3LnZpc2l0RmllbGQoIik7CisgICAgICAgIGFwcGVuZEFjY2VzcyhhY2Nlc3MgfCBBQ0NFU1NfRklFTEQpOworICAgICAgICBidWYuYXBwZW5kKCIsICIpOworICAgICAgICBhcHBlbmRDb25zdGFudChuYW1lKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgYXBwZW5kQ29uc3RhbnQoZGVzYyk7CisgICAgICAgIGJ1Zi5hcHBlbmQoIiwgIik7CisgICAgICAgIGFwcGVuZENvbnN0YW50KHNpZ25hdHVyZSk7CisgICAgICAgIGJ1Zi5hcHBlbmQoIiwgIik7CisgICAgICAgIGFwcGVuZENvbnN0YW50KHZhbHVlKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiKTtcbiIpOworICAgICAgICB0ZXh0LmFkZChidWYudG9TdHJpbmcoKSk7CisgICAgICAgIEFTTWlmaWVyIGEgPSBjcmVhdGVBU01pZmllcigiZnYiLCAwKTsKKyAgICAgICAgdGV4dC5hZGQoYS5nZXRUZXh0KCkpOworICAgICAgICB0ZXh0LmFkZCgifVxuIik7CisgICAgICAgIHJldHVybiBhOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBBU01pZmllciB2aXNpdE1ldGhvZCgKKyAgICAgICAgZmluYWwgaW50IGFjY2VzcywKKyAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUsCisgICAgICAgIGZpbmFsIFN0cmluZyBkZXNjLAorICAgICAgICBmaW5hbCBTdHJpbmcgc2lnbmF0dXJlLAorICAgICAgICBmaW5hbCBTdHJpbmdbXSBleGNlcHRpb25zKQorICAgIHsKKyAgICAgICAgYnVmLnNldExlbmd0aCgwKTsKKyAgICAgICAgYnVmLmFwcGVuZCgie1xuIik7CisgICAgICAgIGJ1Zi5hcHBlbmQoIm12ID0gY3cudmlzaXRNZXRob2QoIik7CisgICAgICAgIGFwcGVuZEFjY2VzcyhhY2Nlc3MpOworICAgICAgICBidWYuYXBwZW5kKCIsICIpOworICAgICAgICBhcHBlbmRDb25zdGFudChuYW1lKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgYXBwZW5kQ29uc3RhbnQoZGVzYyk7CisgICAgICAgIGJ1Zi5hcHBlbmQoIiwgIik7CisgICAgICAgIGFwcGVuZENvbnN0YW50KHNpZ25hdHVyZSk7CisgICAgICAgIGJ1Zi5hcHBlbmQoIiwgIik7CisgICAgICAgIGlmIChleGNlcHRpb25zICE9IG51bGwgJiYgZXhjZXB0aW9ucy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKCJuZXcgU3RyaW5nW10geyIpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleGNlcHRpb25zLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChpID09IDAgPyAiICIgOiAiLCAiKTsKKyAgICAgICAgICAgICAgICBhcHBlbmRDb25zdGFudChleGNlcHRpb25zW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiB9Iik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKCJudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgYnVmLmFwcGVuZCgiKTtcbiIpOworICAgICAgICB0ZXh0LmFkZChidWYudG9TdHJpbmcoKSk7CisgICAgICAgIEFTTWlmaWVyIGEgPSBjcmVhdGVBU01pZmllcigibXYiLCAwKTsKKyAgICAgICAgdGV4dC5hZGQoYS5nZXRUZXh0KCkpOworICAgICAgICB0ZXh0LmFkZCgifVxuIik7CisgICAgICAgIHJldHVybiBhOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0Q2xhc3NFbmQoKSB7CisgICAgICAgIHRleHQuYWRkKCJjdy52aXNpdEVuZCgpO1xuXG4iKTsKKyAgICAgICAgdGV4dC5hZGQoInJldHVybiBjdy50b0J5dGVBcnJheSgpO1xuIik7CisgICAgICAgIHRleHQuYWRkKCJ9XG4iKTsKKyAgICAgICAgdGV4dC5hZGQoIn1cbiIpOworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIEFubm90YXRpb25zCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIGJ1Zi5zZXRMZW5ndGgoMCk7CisgICAgICAgIGJ1Zi5hcHBlbmQoImF2IikuYXBwZW5kKGlkKS5hcHBlbmQoIi52aXNpdCgiKTsKKyAgICAgICAgYXBwZW5kQ29uc3RhbnQoYnVmLCBuYW1lKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgYXBwZW5kQ29uc3RhbnQoYnVmLCB2YWx1ZSk7CisgICAgICAgIGJ1Zi5hcHBlbmQoIik7XG4iKTsKKyAgICAgICAgdGV4dC5hZGQoYnVmLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0RW51bSgKKyAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUsCisgICAgICAgIGZpbmFsIFN0cmluZyBkZXNjLAorICAgICAgICBmaW5hbCBTdHJpbmcgdmFsdWUpCisgICAgeworICAgICAgICBidWYuc2V0TGVuZ3RoKDApOworICAgICAgICBidWYuYXBwZW5kKCJhdiIpLmFwcGVuZChpZCkuYXBwZW5kKCIudmlzaXRFbnVtKCIpOworICAgICAgICBhcHBlbmRDb25zdGFudChidWYsIG5hbWUpOworICAgICAgICBidWYuYXBwZW5kKCIsICIpOworICAgICAgICBhcHBlbmRDb25zdGFudChidWYsIGRlc2MpOworICAgICAgICBidWYuYXBwZW5kKCIsICIpOworICAgICAgICBhcHBlbmRDb25zdGFudChidWYsIHZhbHVlKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiKTtcbiIpOworICAgICAgICB0ZXh0LmFkZChidWYudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEFTTWlmaWVyIHZpc2l0QW5ub3RhdGlvbigKKyAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUsCisgICAgICAgIGZpbmFsIFN0cmluZyBkZXNjKQorICAgIHsKKyAgICAgICAgYnVmLnNldExlbmd0aCgwKTsKKyAgICAgICAgYnVmLmFwcGVuZCgie1xuIik7CisgICAgICAgIGJ1Zi5hcHBlbmQoIkFubm90YXRpb25WaXNpdG9yIGF2IikuYXBwZW5kKGlkICsgMSkuYXBwZW5kKCIgPSBhdiIpOworICAgICAgICBidWYuYXBwZW5kKGlkKS5hcHBlbmQoIi52aXNpdEFubm90YXRpb24oIik7CisgICAgICAgIGFwcGVuZENvbnN0YW50KGJ1ZiwgbmFtZSk7CisgICAgICAgIGJ1Zi5hcHBlbmQoIiwgIik7CisgICAgICAgIGFwcGVuZENvbnN0YW50KGJ1ZiwgZGVzYyk7CisgICAgICAgIGJ1Zi5hcHBlbmQoIik7XG4iKTsKKyAgICAgICAgdGV4dC5hZGQoYnVmLnRvU3RyaW5nKCkpOworICAgICAgICBBU01pZmllciBhID0gY3JlYXRlQVNNaWZpZXIoImF2IiwgaWQgKyAxKTsKKyAgICAgICAgdGV4dC5hZGQoYS5nZXRUZXh0KCkpOworICAgICAgICB0ZXh0LmFkZCgifVxuIik7CisgICAgICAgIHJldHVybiBhOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBBU01pZmllciB2aXNpdEFycmF5KGZpbmFsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIGJ1Zi5zZXRMZW5ndGgoMCk7CisgICAgICAgIGJ1Zi5hcHBlbmQoIntcbiIpOworICAgICAgICBidWYuYXBwZW5kKCJBbm5vdGF0aW9uVmlzaXRvciBhdiIpLmFwcGVuZChpZCArIDEpLmFwcGVuZCgiID0gYXYiKTsKKyAgICAgICAgYnVmLmFwcGVuZChpZCkuYXBwZW5kKCIudmlzaXRBcnJheSgiKTsKKyAgICAgICAgYXBwZW5kQ29uc3RhbnQoYnVmLCBuYW1lKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiKTtcbiIpOworICAgICAgICB0ZXh0LmFkZChidWYudG9TdHJpbmcoKSk7CisgICAgICAgIEFTTWlmaWVyIGEgPSBjcmVhdGVBU01pZmllcigiYXYiLCBpZCArIDEpOworICAgICAgICB0ZXh0LmFkZChhLmdldFRleHQoKSk7CisgICAgICAgIHRleHQuYWRkKCJ9XG4iKTsKKyAgICAgICAgcmV0dXJuIGE7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRBbm5vdGF0aW9uRW5kKCkgeworICAgICAgICBidWYuc2V0TGVuZ3RoKDApOworICAgICAgICBidWYuYXBwZW5kKCJhdiIpLmFwcGVuZChpZCkuYXBwZW5kKCIudmlzaXRFbmQoKTtcbiIpOworICAgICAgICB0ZXh0LmFkZChidWYudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gRmllbGRzCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQVNNaWZpZXIgdmlzaXRGaWVsZEFubm90YXRpb24oCisgICAgICAgIGZpbmFsIFN0cmluZyBkZXNjLAorICAgICAgICBmaW5hbCBib29sZWFuIHZpc2libGUpCisgICAgeworICAgICAgICByZXR1cm4gdmlzaXRBbm5vdGF0aW9uKGRlc2MsIHZpc2libGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0RmllbGRBdHRyaWJ1dGUoZmluYWwgQXR0cmlidXRlIGF0dHIpIHsKKyAgICAgICAgdmlzaXRBdHRyaWJ1dGUoYXR0cik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRGaWVsZEVuZCgpIHsKKyAgICAgICAgYnVmLnNldExlbmd0aCgwKTsKKyAgICAgICAgYnVmLmFwcGVuZChuYW1lKS5hcHBlbmQoIi52aXNpdEVuZCgpO1xuIik7CisgICAgICAgIHRleHQuYWRkKGJ1Zi50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBNZXRob2RzCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQVNNaWZpZXIgdmlzaXRBbm5vdGF0aW9uRGVmYXVsdCgpIHsKKyAgICAgICAgYnVmLnNldExlbmd0aCgwKTsKKyAgICAgICAgYnVmLmFwcGVuZCgie1xuIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCJhdjAgPSAiKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobmFtZSkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCIudmlzaXRBbm5vdGF0aW9uRGVmYXVsdCgpO1xuIik7CisgICAgICAgIHRleHQuYWRkKGJ1Zi50b1N0cmluZygpKTsKKyAgICAgICAgQVNNaWZpZXIgYSA9IGNyZWF0ZUFTTWlmaWVyKCJhdiIsIDApOworICAgICAgICB0ZXh0LmFkZChhLmdldFRleHQoKSk7CisgICAgICAgIHRleHQuYWRkKCJ9XG4iKTsKKyAgICAgICAgcmV0dXJuIGE7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEFTTWlmaWVyIHZpc2l0TWV0aG9kQW5ub3RhdGlvbigKKyAgICAgICAgZmluYWwgU3RyaW5nIGRlc2MsCisgICAgICAgIGZpbmFsIGJvb2xlYW4gdmlzaWJsZSkKKyAgICB7CisgICAgICAgIHJldHVybiB2aXNpdEFubm90YXRpb24oZGVzYywgdmlzaWJsZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEFTTWlmaWVyIHZpc2l0UGFyYW1ldGVyQW5ub3RhdGlvbigKKyAgICAgICAgZmluYWwgaW50IHBhcmFtZXRlciwKKyAgICAgICAgZmluYWwgU3RyaW5nIGRlc2MsCisgICAgICAgIGZpbmFsIGJvb2xlYW4gdmlzaWJsZSkKKyAgICB7CisgICAgICAgIGJ1Zi5zZXRMZW5ndGgoMCk7CisgICAgICAgIGJ1Zi5hcHBlbmQoIntcbiIpCisgICAgICAgICAgICAgICAgLmFwcGVuZCgiYXYwID0gIikuYXBwZW5kKG5hbWUpLmFwcGVuZCgiLnZpc2l0UGFyYW1ldGVyQW5ub3RhdGlvbigiKQorICAgICAgICAgICAgICAgIC5hcHBlbmQocGFyYW1ldGVyKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoIiwgIik7CisgICAgICAgIGFwcGVuZENvbnN0YW50KGRlc2MpOworICAgICAgICBidWYuYXBwZW5kKCIsICIpLmFwcGVuZCh2aXNpYmxlKS5hcHBlbmQoIik7XG4iKTsKKyAgICAgICAgdGV4dC5hZGQoYnVmLnRvU3RyaW5nKCkpOworICAgICAgICBBU01pZmllciBhID0gY3JlYXRlQVNNaWZpZXIoImF2IiwgMCk7CisgICAgICAgIHRleHQuYWRkKGEuZ2V0VGV4dCgpKTsKKyAgICAgICAgdGV4dC5hZGQoIn1cbiIpOworICAgICAgICByZXR1cm4gYTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdE1ldGhvZEF0dHJpYnV0ZShmaW5hbCBBdHRyaWJ1dGUgYXR0cikgeworICAgICAgICB2aXNpdEF0dHJpYnV0ZShhdHRyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdENvZGUoKSB7CisgICAgICAgIHRleHQuYWRkKG5hbWUgKyAiLnZpc2l0Q29kZSgpO1xuIik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRGcmFtZSgKKyAgICAgICAgZmluYWwgaW50IHR5cGUsCisgICAgICAgIGZpbmFsIGludCBuTG9jYWwsCisgICAgICAgIGZpbmFsIE9iamVjdFtdIGxvY2FsLAorICAgICAgICBmaW5hbCBpbnQgblN0YWNrLAorICAgICAgICBmaW5hbCBPYmplY3RbXSBzdGFjaykKKyAgICB7CisgICAgICAgIGJ1Zi5zZXRMZW5ndGgoMCk7CisgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkZfTkVXOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkZfRlVMTDoKKyAgICAgICAgICAgICAgICBkZWNsYXJlRnJhbWVUeXBlcyhuTG9jYWwsIGxvY2FsKTsKKyAgICAgICAgICAgICAgICBkZWNsYXJlRnJhbWVUeXBlcyhuU3RhY2ssIHN0YWNrKTsKKyAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBPcGNvZGVzLkZfTkVXKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQobmFtZSkuYXBwZW5kKCIudmlzaXRGcmFtZShPcGNvZGVzLkZfTkVXLCAiKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKG5hbWUpLmFwcGVuZCgiLnZpc2l0RnJhbWUoT3Bjb2Rlcy5GX0ZVTEwsICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKG5Mb2NhbCkuYXBwZW5kKCIsIG5ldyBPYmplY3RbXSB7Iik7CisgICAgICAgICAgICAgICAgYXBwZW5kRnJhbWVUeXBlcyhuTG9jYWwsIGxvY2FsKTsKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCJ9LCAiKS5hcHBlbmQoblN0YWNrKS5hcHBlbmQoIiwgbmV3IE9iamVjdFtdIHsiKTsKKyAgICAgICAgICAgICAgICBhcHBlbmRGcmFtZVR5cGVzKG5TdGFjaywgc3RhY2spOworICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoJ30nKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5GX0FQUEVORDoKKyAgICAgICAgICAgICAgICBkZWNsYXJlRnJhbWVUeXBlcyhuTG9jYWwsIGxvY2FsKTsKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKG5hbWUpLmFwcGVuZCgiLnZpc2l0RnJhbWUoT3Bjb2Rlcy5GX0FQUEVORCwiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChuTG9jYWwpCisgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCIsIG5ldyBPYmplY3RbXSB7Iik7CisgICAgICAgICAgICAgICAgYXBwZW5kRnJhbWVUeXBlcyhuTG9jYWwsIGxvY2FsKTsKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCJ9LCAwLCBudWxsIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRl9DSE9QOgorICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQobmFtZSkuYXBwZW5kKCIudmlzaXRGcmFtZShPcGNvZGVzLkZfQ0hPUCwiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChuTG9jYWwpCisgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCIsIG51bGwsIDAsIG51bGwiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5GX1NBTUU6CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChuYW1lKS5hcHBlbmQoIi52aXNpdEZyYW1lKE9wY29kZXMuRl9TQU1FLCAwLCBudWxsLCAwLCBudWxsIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRl9TQU1FMToKKyAgICAgICAgICAgICAgICBkZWNsYXJlRnJhbWVUeXBlcygxLCBzdGFjayk7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChuYW1lKS5hcHBlbmQoIi52aXNpdEZyYW1lKE9wY29kZXMuRl9TQU1FMSwgMCwgbnVsbCwgMSwgbmV3IE9iamVjdFtdIHsiKTsKKyAgICAgICAgICAgICAgICBhcHBlbmRGcmFtZVR5cGVzKDEsIHN0YWNrKTsKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCd9Jyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnVmLmFwcGVuZCgiKTtcbiIpOworICAgICAgICB0ZXh0LmFkZChidWYudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRJbnNuKGZpbmFsIGludCBvcGNvZGUpIHsKKyAgICAgICAgYnVmLnNldExlbmd0aCgwKTsKKyAgICAgICAgYnVmLmFwcGVuZChuYW1lKS5hcHBlbmQoIi52aXNpdEluc24oIikuYXBwZW5kKE9QQ09ERVNbb3Bjb2RlXSkuYXBwZW5kKCIpO1xuIik7CisgICAgICAgIHRleHQuYWRkKGJ1Zi50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEludEluc24oZmluYWwgaW50IG9wY29kZSwgZmluYWwgaW50IG9wZXJhbmQpIHsKKyAgICAgICAgYnVmLnNldExlbmd0aCgwKTsKKyAgICAgICAgYnVmLmFwcGVuZChuYW1lKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoIi52aXNpdEludEluc24oIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKE9QQ09ERVNbb3Bjb2RlXSkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCIsICIpCisgICAgICAgICAgICAgICAgLmFwcGVuZChvcGNvZGUgPT0gT3Bjb2Rlcy5ORVdBUlJBWQorICAgICAgICAgICAgICAgICAgICAgICAgPyBUWVBFU1tvcGVyYW5kXQorICAgICAgICAgICAgICAgICAgICAgICAgOiBJbnRlZ2VyLnRvU3RyaW5nKG9wZXJhbmQpKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoIik7XG4iKTsKKyAgICAgICAgdGV4dC5hZGQoYnVmLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0VmFySW5zbihmaW5hbCBpbnQgb3Bjb2RlLCBmaW5hbCBpbnQgdmFyKSB7CisgICAgICAgIGJ1Zi5zZXRMZW5ndGgoMCk7CisgICAgICAgIGJ1Zi5hcHBlbmQobmFtZSkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCIudmlzaXRWYXJJbnNuKCIpCisgICAgICAgICAgICAgICAgLmFwcGVuZChPUENPREVTW29wY29kZV0pCisgICAgICAgICAgICAgICAgLmFwcGVuZCgiLCAiKQorICAgICAgICAgICAgICAgIC5hcHBlbmQodmFyKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoIik7XG4iKTsKKyAgICAgICAgdGV4dC5hZGQoYnVmLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0VHlwZUluc24oZmluYWwgaW50IG9wY29kZSwgZmluYWwgU3RyaW5nIHR5cGUpIHsKKyAgICAgICAgYnVmLnNldExlbmd0aCgwKTsKKyAgICAgICAgYnVmLmFwcGVuZChuYW1lKS5hcHBlbmQoIi52aXNpdFR5cGVJbnNuKCIpLmFwcGVuZChPUENPREVTW29wY29kZV0pLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgYXBwZW5kQ29uc3RhbnQodHlwZSk7CisgICAgICAgIGJ1Zi5hcHBlbmQoIik7XG4iKTsKKyAgICAgICAgdGV4dC5hZGQoYnVmLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0RmllbGRJbnNuKAorICAgICAgICBmaW5hbCBpbnQgb3Bjb2RlLAorICAgICAgICBmaW5hbCBTdHJpbmcgb3duZXIsCisgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lLAorICAgICAgICBmaW5hbCBTdHJpbmcgZGVzYykKKyAgICB7CisgICAgICAgIGJ1Zi5zZXRMZW5ndGgoMCk7CisgICAgICAgIGJ1Zi5hcHBlbmQodGhpcy5uYW1lKS5hcHBlbmQoIi52aXNpdEZpZWxkSW5zbigiKS5hcHBlbmQoT1BDT0RFU1tvcGNvZGVdKS5hcHBlbmQoIiwgIik7CisgICAgICAgIGFwcGVuZENvbnN0YW50KG93bmVyKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgYXBwZW5kQ29uc3RhbnQobmFtZSk7CisgICAgICAgIGJ1Zi5hcHBlbmQoIiwgIik7CisgICAgICAgIGFwcGVuZENvbnN0YW50KGRlc2MpOworICAgICAgICBidWYuYXBwZW5kKCIpO1xuIik7CisgICAgICAgIHRleHQuYWRkKGJ1Zi50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdE1ldGhvZEluc24oCisgICAgICAgIGZpbmFsIGludCBvcGNvZGUsCisgICAgICAgIGZpbmFsIFN0cmluZyBvd25lciwKKyAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUsCisgICAgICAgIGZpbmFsIFN0cmluZyBkZXNjKQorICAgIHsKKyAgICAgICAgYnVmLnNldExlbmd0aCgwKTsKKyAgICAgICAgYnVmLmFwcGVuZCh0aGlzLm5hbWUpLmFwcGVuZCgiLnZpc2l0TWV0aG9kSW5zbigiKS5hcHBlbmQoT1BDT0RFU1tvcGNvZGVdKS5hcHBlbmQoIiwgIik7CisgICAgICAgIGFwcGVuZENvbnN0YW50KG93bmVyKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgYXBwZW5kQ29uc3RhbnQobmFtZSk7CisgICAgICAgIGJ1Zi5hcHBlbmQoIiwgIik7CisgICAgICAgIGFwcGVuZENvbnN0YW50KGRlc2MpOworICAgICAgICBidWYuYXBwZW5kKCIpO1xuIik7CisgICAgICAgIHRleHQuYWRkKGJ1Zi50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEludm9rZUR5bmFtaWNJbnNuKAorICAgICAgICBTdHJpbmcgbmFtZSwKKyAgICAgICAgU3RyaW5nIGRlc2MsCisgICAgICAgIEhhbmRsZSBic20sCisgICAgICAgIE9iamVjdC4uLiBic21BcmdzKQorICAgIHsKKyAgICAgICAgYnVmLnNldExlbmd0aCgwKTsKKyAgICAgICAgYnVmLmFwcGVuZCh0aGlzLm5hbWUpLmFwcGVuZCgiLnZpc2l0SW52b2tlRHluYW1pY0luc24oIik7CisgICAgICAgIGFwcGVuZENvbnN0YW50KG5hbWUpOworICAgICAgICBidWYuYXBwZW5kKCIsICIpOworICAgICAgICBhcHBlbmRDb25zdGFudChkZXNjKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgYXBwZW5kQ29uc3RhbnQoYnNtKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiLCBuZXcgT2JqZWN0W117Iik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnNtQXJncy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgYXBwZW5kQ29uc3RhbnQoYnNtQXJnc1tpXSk7CisgICAgICAgICAgICBpZiAoaSAhPSBic21BcmdzLmxlbmd0aCAtIDEpIHsKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCIsICIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJ1Zi5hcHBlbmQoIn0pO1xuIik7CisgICAgICAgIHRleHQuYWRkKGJ1Zi50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEp1bXBJbnNuKGZpbmFsIGludCBvcGNvZGUsIGZpbmFsIExhYmVsIGxhYmVsKSB7CisgICAgICAgIGJ1Zi5zZXRMZW5ndGgoMCk7CisgICAgICAgIGRlY2xhcmVMYWJlbChsYWJlbCk7CisgICAgICAgIGJ1Zi5hcHBlbmQobmFtZSkuYXBwZW5kKCIudmlzaXRKdW1wSW5zbigiKS5hcHBlbmQoT1BDT0RFU1tvcGNvZGVdKS5hcHBlbmQoIiwgIik7CisgICAgICAgIGFwcGVuZExhYmVsKGxhYmVsKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiKTtcbiIpOworICAgICAgICB0ZXh0LmFkZChidWYudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRMYWJlbChmaW5hbCBMYWJlbCBsYWJlbCkgeworICAgICAgICBidWYuc2V0TGVuZ3RoKDApOworICAgICAgICBkZWNsYXJlTGFiZWwobGFiZWwpOworICAgICAgICBidWYuYXBwZW5kKG5hbWUpLmFwcGVuZCgiLnZpc2l0TGFiZWwoIik7CisgICAgICAgIGFwcGVuZExhYmVsKGxhYmVsKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiKTtcbiIpOworICAgICAgICB0ZXh0LmFkZChidWYudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRMZGNJbnNuKGZpbmFsIE9iamVjdCBjc3QpIHsKKyAgICAgICAgYnVmLnNldExlbmd0aCgwKTsKKyAgICAgICAgYnVmLmFwcGVuZChuYW1lKS5hcHBlbmQoIi52aXNpdExkY0luc24oIik7CisgICAgICAgIGFwcGVuZENvbnN0YW50KGNzdCk7CisgICAgICAgIGJ1Zi5hcHBlbmQoIik7XG4iKTsKKyAgICAgICAgdGV4dC5hZGQoYnVmLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0SWluY0luc24oZmluYWwgaW50IHZhciwgZmluYWwgaW50IGluY3JlbWVudCkgeworICAgICAgICBidWYuc2V0TGVuZ3RoKDApOworICAgICAgICBidWYuYXBwZW5kKG5hbWUpCisgICAgICAgICAgICAgICAgLmFwcGVuZCgiLnZpc2l0SWluY0luc24oIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKHZhcikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCIsICIpCisgICAgICAgICAgICAgICAgLmFwcGVuZChpbmNyZW1lbnQpCisgICAgICAgICAgICAgICAgLmFwcGVuZCgiKTtcbiIpOworICAgICAgICB0ZXh0LmFkZChidWYudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRUYWJsZVN3aXRjaEluc24oCisgICAgICAgIGZpbmFsIGludCBtaW4sCisgICAgICAgIGZpbmFsIGludCBtYXgsCisgICAgICAgIGZpbmFsIExhYmVsIGRmbHQsCisgICAgICAgIGZpbmFsIExhYmVsLi4uIGxhYmVscykKKyAgICB7CisgICAgICAgIGJ1Zi5zZXRMZW5ndGgoMCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGFiZWxzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBkZWNsYXJlTGFiZWwobGFiZWxzW2ldKTsKKyAgICAgICAgfQorICAgICAgICBkZWNsYXJlTGFiZWwoZGZsdCk7CisKKyAgICAgICAgYnVmLmFwcGVuZChuYW1lKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoIi52aXNpdFRhYmxlU3dpdGNoSW5zbigiKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobWluKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoIiwgIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKG1heCkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCIsICIpOworICAgICAgICBhcHBlbmRMYWJlbChkZmx0KTsKKyAgICAgICAgYnVmLmFwcGVuZCgiLCBuZXcgTGFiZWxbXSB7Iik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGFiZWxzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKGkgPT0gMCA/ICIgIiA6ICIsICIpOworICAgICAgICAgICAgYXBwZW5kTGFiZWwobGFiZWxzW2ldKTsKKyAgICAgICAgfQorICAgICAgICBidWYuYXBwZW5kKCIgfSk7XG4iKTsKKyAgICAgICAgdGV4dC5hZGQoYnVmLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TG9va3VwU3dpdGNoSW5zbigKKyAgICAgICAgZmluYWwgTGFiZWwgZGZsdCwKKyAgICAgICAgZmluYWwgaW50W10ga2V5cywKKyAgICAgICAgZmluYWwgTGFiZWxbXSBsYWJlbHMpCisgICAgeworICAgICAgICBidWYuc2V0TGVuZ3RoKDApOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxhYmVscy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgZGVjbGFyZUxhYmVsKGxhYmVsc1tpXSk7CisgICAgICAgIH0KKyAgICAgICAgZGVjbGFyZUxhYmVsKGRmbHQpOworCisgICAgICAgIGJ1Zi5hcHBlbmQobmFtZSkuYXBwZW5kKCIudmlzaXRMb29rdXBTd2l0Y2hJbnNuKCIpOworICAgICAgICBhcHBlbmRMYWJlbChkZmx0KTsKKyAgICAgICAgYnVmLmFwcGVuZCgiLCBuZXcgaW50W10geyIpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoaSA9PSAwID8gIiAiIDogIiwgIikuYXBwZW5kKGtleXNbaV0pOworICAgICAgICB9CisgICAgICAgIGJ1Zi5hcHBlbmQoIiB9LCBuZXcgTGFiZWxbXSB7Iik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGFiZWxzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKGkgPT0gMCA/ICIgIiA6ICIsICIpOworICAgICAgICAgICAgYXBwZW5kTGFiZWwobGFiZWxzW2ldKTsKKyAgICAgICAgfQorICAgICAgICBidWYuYXBwZW5kKCIgfSk7XG4iKTsKKyAgICAgICAgdGV4dC5hZGQoYnVmLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TXVsdGlBTmV3QXJyYXlJbnNuKGZpbmFsIFN0cmluZyBkZXNjLCBmaW5hbCBpbnQgZGltcykgeworICAgICAgICBidWYuc2V0TGVuZ3RoKDApOworICAgICAgICBidWYuYXBwZW5kKG5hbWUpLmFwcGVuZCgiLnZpc2l0TXVsdGlBTmV3QXJyYXlJbnNuKCIpOworICAgICAgICBhcHBlbmRDb25zdGFudChkZXNjKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiLCAiKS5hcHBlbmQoZGltcykuYXBwZW5kKCIpO1xuIik7CisgICAgICAgIHRleHQuYWRkKGJ1Zi50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFRyeUNhdGNoQmxvY2soCisgICAgICAgIGZpbmFsIExhYmVsIHN0YXJ0LAorICAgICAgICBmaW5hbCBMYWJlbCBlbmQsCisgICAgICAgIGZpbmFsIExhYmVsIGhhbmRsZXIsCisgICAgICAgIGZpbmFsIFN0cmluZyB0eXBlKQorICAgIHsKKyAgICAgICAgYnVmLnNldExlbmd0aCgwKTsKKyAgICAgICAgZGVjbGFyZUxhYmVsKHN0YXJ0KTsKKyAgICAgICAgZGVjbGFyZUxhYmVsKGVuZCk7CisgICAgICAgIGRlY2xhcmVMYWJlbChoYW5kbGVyKTsKKyAgICAgICAgYnVmLmFwcGVuZChuYW1lKS5hcHBlbmQoIi52aXNpdFRyeUNhdGNoQmxvY2soIik7CisgICAgICAgIGFwcGVuZExhYmVsKHN0YXJ0KTsKKyAgICAgICAgYnVmLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgYXBwZW5kTGFiZWwoZW5kKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgYXBwZW5kTGFiZWwoaGFuZGxlcik7CisgICAgICAgIGJ1Zi5hcHBlbmQoIiwgIik7CisgICAgICAgIGFwcGVuZENvbnN0YW50KHR5cGUpOworICAgICAgICBidWYuYXBwZW5kKCIpO1xuIik7CisgICAgICAgIHRleHQuYWRkKGJ1Zi50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdExvY2FsVmFyaWFibGUoCisgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lLAorICAgICAgICBmaW5hbCBTdHJpbmcgZGVzYywKKyAgICAgICAgZmluYWwgU3RyaW5nIHNpZ25hdHVyZSwKKyAgICAgICAgZmluYWwgTGFiZWwgc3RhcnQsCisgICAgICAgIGZpbmFsIExhYmVsIGVuZCwKKyAgICAgICAgZmluYWwgaW50IGluZGV4KQorICAgIHsKKyAgICAgICAgYnVmLnNldExlbmd0aCgwKTsKKyAgICAgICAgYnVmLmFwcGVuZCh0aGlzLm5hbWUpLmFwcGVuZCgiLnZpc2l0TG9jYWxWYXJpYWJsZSgiKTsKKyAgICAgICAgYXBwZW5kQ29uc3RhbnQobmFtZSk7CisgICAgICAgIGJ1Zi5hcHBlbmQoIiwgIik7CisgICAgICAgIGFwcGVuZENvbnN0YW50KGRlc2MpOworICAgICAgICBidWYuYXBwZW5kKCIsICIpOworICAgICAgICBhcHBlbmRDb25zdGFudChzaWduYXR1cmUpOworICAgICAgICBidWYuYXBwZW5kKCIsICIpOworICAgICAgICBhcHBlbmRMYWJlbChzdGFydCk7CisgICAgICAgIGJ1Zi5hcHBlbmQoIiwgIik7CisgICAgICAgIGFwcGVuZExhYmVsKGVuZCk7CisgICAgICAgIGJ1Zi5hcHBlbmQoIiwgIikuYXBwZW5kKGluZGV4KS5hcHBlbmQoIik7XG4iKTsKKyAgICAgICAgdGV4dC5hZGQoYnVmLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TGluZU51bWJlcihmaW5hbCBpbnQgbGluZSwgZmluYWwgTGFiZWwgc3RhcnQpIHsKKyAgICAgICAgYnVmLnNldExlbmd0aCgwKTsKKyAgICAgICAgYnVmLmFwcGVuZChuYW1lKS5hcHBlbmQoIi52aXNpdExpbmVOdW1iZXIoIikuYXBwZW5kKGxpbmUpLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgYXBwZW5kTGFiZWwoc3RhcnQpOworICAgICAgICBidWYuYXBwZW5kKCIpO1xuIik7CisgICAgICAgIHRleHQuYWRkKGJ1Zi50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdE1heHMoZmluYWwgaW50IG1heFN0YWNrLCBmaW5hbCBpbnQgbWF4TG9jYWxzKSB7CisgICAgICAgIGJ1Zi5zZXRMZW5ndGgoMCk7CisgICAgICAgIGJ1Zi5hcHBlbmQobmFtZSkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCIudmlzaXRNYXhzKCIpCisgICAgICAgICAgICAgICAgLmFwcGVuZChtYXhTdGFjaykKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCIsICIpCisgICAgICAgICAgICAgICAgLmFwcGVuZChtYXhMb2NhbHMpCisgICAgICAgICAgICAgICAgLmFwcGVuZCgiKTtcbiIpOworICAgICAgICB0ZXh0LmFkZChidWYudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRNZXRob2RFbmQoKSB7CisgICAgICAgIGJ1Zi5zZXRMZW5ndGgoMCk7CisgICAgICAgIGJ1Zi5hcHBlbmQobmFtZSkuYXBwZW5kKCIudmlzaXRFbmQoKTtcbiIpOworICAgICAgICB0ZXh0LmFkZChidWYudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gQ29tbW9uIG1ldGhvZHMKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIHB1YmxpYyBBU01pZmllciB2aXNpdEFubm90YXRpb24oCisgICAgICAgIGZpbmFsIFN0cmluZyBkZXNjLAorICAgICAgICBmaW5hbCBib29sZWFuIHZpc2libGUpCisgICAgeworICAgICAgICBidWYuc2V0TGVuZ3RoKDApOworICAgICAgICBidWYuYXBwZW5kKCJ7XG4iKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoImF2MCA9ICIpCisgICAgICAgICAgICAgICAgLmFwcGVuZChuYW1lKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoIi52aXNpdEFubm90YXRpb24oIik7CisgICAgICAgIGFwcGVuZENvbnN0YW50KGRlc2MpOworICAgICAgICBidWYuYXBwZW5kKCIsICIpLmFwcGVuZCh2aXNpYmxlKS5hcHBlbmQoIik7XG4iKTsKKyAgICAgICAgdGV4dC5hZGQoYnVmLnRvU3RyaW5nKCkpOworICAgICAgICBBU01pZmllciBhID0gY3JlYXRlQVNNaWZpZXIoImF2IiwgMCk7CisgICAgICAgIHRleHQuYWRkKGEuZ2V0VGV4dCgpKTsKKyAgICAgICAgdGV4dC5hZGQoIn1cbiIpOworICAgICAgICByZXR1cm4gYTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEF0dHJpYnV0ZShmaW5hbCBBdHRyaWJ1dGUgYXR0cikgeworICAgICAgICBidWYuc2V0TGVuZ3RoKDApOworICAgICAgICBidWYuYXBwZW5kKCIvLyBBVFRSSUJVVEUgIikuYXBwZW5kKGF0dHIudHlwZSkuYXBwZW5kKCdcbicpOworICAgICAgICBpZiAoYXR0ciBpbnN0YW5jZW9mIEFTTWlmaWFibGUpIHsKKyAgICAgICAgICAgIGlmIChsYWJlbE5hbWVzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBsYWJlbE5hbWVzID0gbmV3IEhhc2hNYXA8TGFiZWwsIFN0cmluZz4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIntcbiIpOworICAgICAgICAgICAgKChBU01pZmlhYmxlKSBhdHRyKS5hc21pZnkoYnVmLCAiYXR0ciIsIGxhYmVsTmFtZXMpOworICAgICAgICAgICAgYnVmLmFwcGVuZChuYW1lKS5hcHBlbmQoIi52aXNpdEF0dHJpYnV0ZShhdHRyKTtcbiIpOworICAgICAgICAgICAgYnVmLmFwcGVuZCgifVxuIik7CisgICAgICAgIH0KKyAgICAgICAgdGV4dC5hZGQoYnVmLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIFV0aWxpdHkgbWV0aG9kcworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgcHJvdGVjdGVkIEFTTWlmaWVyIGNyZWF0ZUFTTWlmaWVyKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBpbnQgaWQpICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBU01pZmllcihPcGNvZGVzLkFTTTQsIG5hbWUsIGlkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBcHBlbmRzIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBhY2Nlc3MgbW9kaWZpZXJzIHRvIHtAbGluaworICAgICAqICNidWYgYnVmfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhY2Nlc3Mgc29tZSBhY2Nlc3MgbW9kaWZpZXJzLgorICAgICAqLworICAgIHZvaWQgYXBwZW5kQWNjZXNzKGZpbmFsIGludCBhY2Nlc3MpIHsKKyAgICAgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7CisgICAgICAgIGlmICgoYWNjZXNzICYgT3Bjb2Rlcy5BQ0NfUFVCTElDKSAhPSAwKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKCJBQ0NfUFVCTElDIik7CisgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICgoYWNjZXNzICYgT3Bjb2Rlcy5BQ0NfUFJJVkFURSkgIT0gMCkgeworICAgICAgICAgICAgYnVmLmFwcGVuZCgiQUNDX1BSSVZBVEUiKTsKKyAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChhY2Nlc3MgJiBPcGNvZGVzLkFDQ19QUk9URUNURUQpICE9IDApIHsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIkFDQ19QUk9URUNURUQiKTsKKyAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChhY2Nlc3MgJiBPcGNvZGVzLkFDQ19GSU5BTCkgIT0gMCkgeworICAgICAgICAgICAgaWYgKCFmaXJzdCkgeworICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiArICIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVmLmFwcGVuZCgiQUNDX0ZJTkFMIik7CisgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICgoYWNjZXNzICYgT3Bjb2Rlcy5BQ0NfU1RBVElDKSAhPSAwKSB7CisgICAgICAgICAgICBpZiAoIWZpcnN0KSB7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiICsgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWYuYXBwZW5kKCJBQ0NfU1RBVElDIik7CisgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICgoYWNjZXNzICYgT3Bjb2Rlcy5BQ0NfU1lOQ0hST05JWkVEKSAhPSAwKSB7CisgICAgICAgICAgICBpZiAoIWZpcnN0KSB7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiICsgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKGFjY2VzcyAmIEFDQ0VTU19DTEFTUykgPT0gMCkgeworICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIkFDQ19TWU5DSFJPTklaRUQiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiQUNDX1NVUEVSIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICgoYWNjZXNzICYgT3Bjb2Rlcy5BQ0NfVk9MQVRJTEUpICE9IDAKKyAgICAgICAgICAgICAgICAmJiAoYWNjZXNzICYgQUNDRVNTX0ZJRUxEKSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIWZpcnN0KSB7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiICsgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWYuYXBwZW5kKCJBQ0NfVk9MQVRJTEUiKTsKKyAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChhY2Nlc3MgJiBPcGNvZGVzLkFDQ19CUklER0UpICE9IDAgJiYgKGFjY2VzcyAmIEFDQ0VTU19DTEFTUykgPT0gMAorICAgICAgICAgICAgICAgICYmIChhY2Nlc3MgJiBBQ0NFU1NfRklFTEQpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghZmlyc3QpIHsKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCIgKyAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIkFDQ19CUklER0UiKTsKKyAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChhY2Nlc3MgJiBPcGNvZGVzLkFDQ19WQVJBUkdTKSAhPSAwICYmIChhY2Nlc3MgJiBBQ0NFU1NfQ0xBU1MpID09IDAKKyAgICAgICAgICAgICAgICAmJiAoYWNjZXNzICYgQUNDRVNTX0ZJRUxEKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIWZpcnN0KSB7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiICsgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWYuYXBwZW5kKCJBQ0NfVkFSQVJHUyIpOworICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGFjY2VzcyAmIE9wY29kZXMuQUNDX1RSQU5TSUVOVCkgIT0gMAorICAgICAgICAgICAgICAgICYmIChhY2Nlc3MgJiBBQ0NFU1NfRklFTEQpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghZmlyc3QpIHsKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCIgKyAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIkFDQ19UUkFOU0lFTlQiKTsKKyAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChhY2Nlc3MgJiBPcGNvZGVzLkFDQ19OQVRJVkUpICE9IDAgJiYgKGFjY2VzcyAmIEFDQ0VTU19DTEFTUykgPT0gMAorICAgICAgICAgICAgICAgICYmIChhY2Nlc3MgJiBBQ0NFU1NfRklFTEQpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghZmlyc3QpIHsKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCIgKyAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIkFDQ19OQVRJVkUiKTsKKyAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChhY2Nlc3MgJiBPcGNvZGVzLkFDQ19FTlVNKSAhPSAwCisgICAgICAgICAgICAgICAgJiYgKChhY2Nlc3MgJiBBQ0NFU1NfQ0xBU1MpICE9IDAKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IChhY2Nlc3MgJiBBQ0NFU1NfRklFTEQpICE9IDAgfHwgKGFjY2VzcyAmIEFDQ0VTU19JTk5FUikgIT0gMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghZmlyc3QpIHsKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCIgKyAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIkFDQ19FTlVNIik7CisgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICgoYWNjZXNzICYgT3Bjb2Rlcy5BQ0NfQU5OT1RBVElPTikgIT0gMAorICAgICAgICAgICAgICAgICYmICgoYWNjZXNzICYgQUNDRVNTX0NMQVNTKSAhPSAwIHx8IChhY2Nlc3MgJiBBQ0NFU1NfSU5ORVIpICE9IDApKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIWZpcnN0KSB7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiICsgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWYuYXBwZW5kKCJBQ0NfQU5OT1RBVElPTiIpOworICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGFjY2VzcyAmIE9wY29kZXMuQUNDX0FCU1RSQUNUKSAhPSAwKSB7CisgICAgICAgICAgICBpZiAoIWZpcnN0KSB7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiICsgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWYuYXBwZW5kKCJBQ0NfQUJTVFJBQ1QiKTsKKyAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChhY2Nlc3MgJiBPcGNvZGVzLkFDQ19JTlRFUkZBQ0UpICE9IDApIHsKKyAgICAgICAgICAgIGlmICghZmlyc3QpIHsKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCIgKyAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIkFDQ19JTlRFUkZBQ0UiKTsKKyAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChhY2Nlc3MgJiBPcGNvZGVzLkFDQ19TVFJJQ1QpICE9IDApIHsKKyAgICAgICAgICAgIGlmICghZmlyc3QpIHsKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCIgKyAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIkFDQ19TVFJJQ1QiKTsKKyAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChhY2Nlc3MgJiBPcGNvZGVzLkFDQ19TWU5USEVUSUMpICE9IDApIHsKKyAgICAgICAgICAgIGlmICghZmlyc3QpIHsKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCIgKyAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIkFDQ19TWU5USEVUSUMiKTsKKyAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChhY2Nlc3MgJiBPcGNvZGVzLkFDQ19ERVBSRUNBVEVEKSAhPSAwKSB7CisgICAgICAgICAgICBpZiAoIWZpcnN0KSB7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiICsgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWYuYXBwZW5kKCJBQ0NfREVQUkVDQVRFRCIpOworICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoJzAnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFwcGVuZHMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIGNvbnN0YW50IHRvIHRoZSBnaXZlbgorICAgICAqIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjc3QgYW4ge0BsaW5rIEludGVnZXJ9LCB7QGxpbmsgRmxvYXR9LCB7QGxpbmsgTG9uZ30sCisgICAgICogICAgICAgIHtAbGluayBEb3VibGV9IG9yIHtAbGluayBTdHJpbmd9IG9iamVjdC4gTWF5IGJlIDx0dD5udWxsPC90dD4uCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgYXBwZW5kQ29uc3RhbnQoZmluYWwgT2JqZWN0IGNzdCkgeworICAgICAgICBhcHBlbmRDb25zdGFudChidWYsIGNzdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXBwZW5kcyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gY29uc3RhbnQgdG8gdGhlIGdpdmVuCisgICAgICogYnVmZmVyLgorICAgICAqCisgICAgICogQHBhcmFtIGJ1ZiBhIHN0cmluZyBidWZmZXIuCisgICAgICogQHBhcmFtIGNzdCBhbiB7QGxpbmsgSW50ZWdlcn0sIHtAbGluayBGbG9hdH0sIHtAbGluayBMb25nfSwKKyAgICAgKiAgICAgICAge0BsaW5rIERvdWJsZX0gb3Ige0BsaW5rIFN0cmluZ30gb2JqZWN0LiBNYXkgYmUgPHR0Pm51bGw8L3R0Pi4KKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCBhcHBlbmRDb25zdGFudChmaW5hbCBTdHJpbmdCdWZmZXIgYnVmLCBmaW5hbCBPYmplY3QgY3N0KSB7CisgICAgICAgIGlmIChjc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgYnVmLmFwcGVuZCgibnVsbCIpOworICAgICAgICB9IGVsc2UgaWYgKGNzdCBpbnN0YW5jZW9mIFN0cmluZykgeworICAgICAgICAgICAgYXBwZW5kU3RyaW5nKGJ1ZiwgKFN0cmluZykgY3N0KTsKKyAgICAgICAgfSBlbHNlIGlmIChjc3QgaW5zdGFuY2VvZiBUeXBlKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKCJUeXBlLmdldFR5cGUoXCIiKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoKChUeXBlKSBjc3QpLmdldERlc2NyaXB0b3IoKSk7CisgICAgICAgICAgICBidWYuYXBwZW5kKCJcIikiKTsKKyAgICAgICAgfSBlbHNlIGlmIChjc3QgaW5zdGFuY2VvZiBIYW5kbGUpIHsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIm5ldyBIYW5kbGUoIik7CisgICAgICAgICAgICBIYW5kbGUgaCA9IChIYW5kbGUpIGNzdDsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIk9wY29kZXMuIikuYXBwZW5kKEhBTkRMRV9UQUdbaC5nZXRUYWcoKV0pLmFwcGVuZCgiLCBcIiIpOworICAgICAgICAgICAgYnVmLmFwcGVuZChoLmdldE93bmVyKCkpLmFwcGVuZCgiXCIsIFwiIik7CisgICAgICAgICAgICBidWYuYXBwZW5kKGguZ2V0TmFtZSgpKS5hcHBlbmQoIlwiLCBcIiIpOworICAgICAgICAgICAgYnVmLmFwcGVuZChoLmdldERlc2MoKSkuYXBwZW5kKCJcIikiKTsKKyAgICAgICAgfSBlbHNlIGlmIChjc3QgaW5zdGFuY2VvZiBCeXRlKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKCJuZXcgQnl0ZSgoYnl0ZSkiKS5hcHBlbmQoY3N0KS5hcHBlbmQoJyknKTsKKyAgICAgICAgfSBlbHNlIGlmIChjc3QgaW5zdGFuY2VvZiBCb29sZWFuKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKCgoQm9vbGVhbikgY3N0KS5ib29sZWFuVmFsdWUoKSA/ICJCb29sZWFuLlRSVUUiIDogIkJvb2xlYW4uRkFMU0UiKTsKKyAgICAgICAgfSBlbHNlIGlmIChjc3QgaW5zdGFuY2VvZiBTaG9ydCkgeworICAgICAgICAgICAgYnVmLmFwcGVuZCgibmV3IFNob3J0KChzaG9ydCkiKS5hcHBlbmQoY3N0KS5hcHBlbmQoJyknKTsKKyAgICAgICAgfSBlbHNlIGlmIChjc3QgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsKKyAgICAgICAgICAgIGludCBjID0gKChDaGFyYWN0ZXIpIGNzdCkuY2hhclZhbHVlKCk7CisgICAgICAgICAgICBidWYuYXBwZW5kKCJuZXcgQ2hhcmFjdGVyKChjaGFyKSIpLmFwcGVuZChjKS5hcHBlbmQoJyknKTsKKyAgICAgICAgfSBlbHNlIGlmIChjc3QgaW5zdGFuY2VvZiBJbnRlZ2VyKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKCJuZXcgSW50ZWdlcigiKS5hcHBlbmQoY3N0KS5hcHBlbmQoJyknKTsKKyAgICAgICAgfSBlbHNlIGlmIChjc3QgaW5zdGFuY2VvZiBGbG9hdCkgeworICAgICAgICAgICAgYnVmLmFwcGVuZCgibmV3IEZsb2F0KFwiIikuYXBwZW5kKGNzdCkuYXBwZW5kKCJcIikiKTsKKyAgICAgICAgfSBlbHNlIGlmIChjc3QgaW5zdGFuY2VvZiBMb25nKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKCJuZXcgTG9uZygiKS5hcHBlbmQoY3N0KS5hcHBlbmQoIkwpIik7CisgICAgICAgIH0gZWxzZSBpZiAoY3N0IGluc3RhbmNlb2YgRG91YmxlKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKCJuZXcgRG91YmxlKFwiIikuYXBwZW5kKGNzdCkuYXBwZW5kKCJcIikiKTsKKyAgICAgICAgfSBlbHNlIGlmIChjc3QgaW5zdGFuY2VvZiBieXRlW10pIHsKKyAgICAgICAgICAgIGJ5dGVbXSB2ID0gKGJ5dGVbXSkgY3N0OworICAgICAgICAgICAgYnVmLmFwcGVuZCgibmV3IGJ5dGVbXSB7Iik7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHYubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKGkgPT0gMCA/ICIiIDogIiwiKS5hcHBlbmQodltpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWYuYXBwZW5kKCd9Jyk7CisgICAgICAgIH0gZWxzZSBpZiAoY3N0IGluc3RhbmNlb2YgYm9vbGVhbltdKSB7CisgICAgICAgICAgICBib29sZWFuW10gdiA9IChib29sZWFuW10pIGNzdDsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIm5ldyBib29sZWFuW10geyIpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2Lmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChpID09IDAgPyAiIiA6ICIsIikuYXBwZW5kKHZbaV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVmLmFwcGVuZCgnfScpOworICAgICAgICB9IGVsc2UgaWYgKGNzdCBpbnN0YW5jZW9mIHNob3J0W10pIHsKKyAgICAgICAgICAgIHNob3J0W10gdiA9IChzaG9ydFtdKSBjc3Q7CisgICAgICAgICAgICBidWYuYXBwZW5kKCJuZXcgc2hvcnRbXSB7Iik7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHYubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKGkgPT0gMCA/ICIiIDogIiwiKS5hcHBlbmQoIihzaG9ydCkiKS5hcHBlbmQodltpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWYuYXBwZW5kKCd9Jyk7CisgICAgICAgIH0gZWxzZSBpZiAoY3N0IGluc3RhbmNlb2YgY2hhcltdKSB7CisgICAgICAgICAgICBjaGFyW10gdiA9IChjaGFyW10pIGNzdDsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIm5ldyBjaGFyW10geyIpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2Lmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChpID09IDAgPyAiIiA6ICIsIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIihjaGFyKSIpCisgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKChpbnQpIHZbaV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVmLmFwcGVuZCgnfScpOworICAgICAgICB9IGVsc2UgaWYgKGNzdCBpbnN0YW5jZW9mIGludFtdKSB7CisgICAgICAgICAgICBpbnRbXSB2ID0gKGludFtdKSBjc3Q7CisgICAgICAgICAgICBidWYuYXBwZW5kKCJuZXcgaW50W10geyIpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2Lmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChpID09IDAgPyAiIiA6ICIsIikuYXBwZW5kKHZbaV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVmLmFwcGVuZCgnfScpOworICAgICAgICB9IGVsc2UgaWYgKGNzdCBpbnN0YW5jZW9mIGxvbmdbXSkgeworICAgICAgICAgICAgbG9uZ1tdIHYgPSAobG9uZ1tdKSBjc3Q7CisgICAgICAgICAgICBidWYuYXBwZW5kKCJuZXcgbG9uZ1tdIHsiKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdi5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoaSA9PSAwID8gIiIgOiAiLCIpLmFwcGVuZCh2W2ldKS5hcHBlbmQoJ0wnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoJ30nKTsKKyAgICAgICAgfSBlbHNlIGlmIChjc3QgaW5zdGFuY2VvZiBmbG9hdFtdKSB7CisgICAgICAgICAgICBmbG9hdFtdIHYgPSAoZmxvYXRbXSkgY3N0OworICAgICAgICAgICAgYnVmLmFwcGVuZCgibmV3IGZsb2F0W10geyIpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2Lmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChpID09IDAgPyAiIiA6ICIsIikuYXBwZW5kKHZbaV0pLmFwcGVuZCgnZicpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVmLmFwcGVuZCgnfScpOworICAgICAgICB9IGVsc2UgaWYgKGNzdCBpbnN0YW5jZW9mIGRvdWJsZVtdKSB7CisgICAgICAgICAgICBkb3VibGVbXSB2ID0gKGRvdWJsZVtdKSBjc3Q7CisgICAgICAgICAgICBidWYuYXBwZW5kKCJuZXcgZG91YmxlW10geyIpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2Lmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChpID09IDAgPyAiIiA6ICIsIikuYXBwZW5kKHZbaV0pLmFwcGVuZCgnZCcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVmLmFwcGVuZCgnfScpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRlY2xhcmVGcmFtZVR5cGVzKGZpbmFsIGludCBuLCBmaW5hbCBPYmplY3RbXSBvKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKSB7CisgICAgICAgICAgICBpZiAob1tpXSBpbnN0YW5jZW9mIExhYmVsKSB7CisgICAgICAgICAgICAgICAgZGVjbGFyZUxhYmVsKChMYWJlbCkgb1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXBwZW5kRnJhbWVUeXBlcyhmaW5hbCBpbnQgbiwgZmluYWwgT2JqZWN0W10gbykgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkgeworICAgICAgICAgICAgaWYgKGkgPiAwKSB7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvW2ldIGluc3RhbmNlb2YgU3RyaW5nKSB7CisgICAgICAgICAgICAgICAgYXBwZW5kQ29uc3RhbnQob1tpXSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG9baV0gaW5zdGFuY2VvZiBJbnRlZ2VyKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoICgoKEludGVnZXIpIG9baV0pLmludFZhbHVlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiT3Bjb2Rlcy5UT1AiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCJPcGNvZGVzLklOVEVHRVIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCJPcGNvZGVzLkZMT0FUIik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiT3Bjb2Rlcy5ET1VCTEUiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCJPcGNvZGVzLkxPTkciKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCJPcGNvZGVzLk5VTEwiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCJPcGNvZGVzLlVOSU5JVElBTElaRURfVEhJUyIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhcHBlbmRMYWJlbCgoTGFiZWwpIG9baV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQXBwZW5kcyBhIGRlY2xhcmF0aW9uIG9mIHRoZSBnaXZlbiBsYWJlbCB0byB7QGxpbmsgI2J1ZiBidWZ9LiBUaGlzCisgICAgICogZGVjbGFyYXRpb24gaXMgb2YgdGhlIGZvcm0gIkxhYmVsIGxYWFggPSBuZXcgTGFiZWwoKTsiLiBEb2VzIG5vdGhpbmcgaWYKKyAgICAgKiB0aGUgZ2l2ZW4gbGFiZWwgaGFzIGFscmVhZHkgYmVlbiBkZWNsYXJlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsIGEgbGFiZWwuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgZGVjbGFyZUxhYmVsKGZpbmFsIExhYmVsIGwpIHsKKyAgICAgICAgaWYgKGxhYmVsTmFtZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgbGFiZWxOYW1lcyA9IG5ldyBIYXNoTWFwPExhYmVsLCBTdHJpbmc+KCk7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIG5hbWUgPSBsYWJlbE5hbWVzLmdldChsKTsKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgbmFtZSA9ICJsIiArIGxhYmVsTmFtZXMuc2l6ZSgpOworICAgICAgICAgICAgbGFiZWxOYW1lcy5wdXQobCwgbmFtZSk7CisgICAgICAgICAgICBidWYuYXBwZW5kKCJMYWJlbCAiKS5hcHBlbmQobmFtZSkuYXBwZW5kKCIgPSBuZXcgTGFiZWwoKTtcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQXBwZW5kcyB0aGUgbmFtZSBvZiB0aGUgZ2l2ZW4gbGFiZWwgdG8ge0BsaW5rICNidWYgYnVmfS4gVGhlIGdpdmVuIGxhYmVsCisgICAgICogPGk+bXVzdDwvaT4gYWxyZWFkeSBoYXZlIGEgbmFtZS4gT25lIHdheSB0byBlbnN1cmUgdGhpcyBpcyB0byBhbHdheXMKKyAgICAgKiBjYWxsIHtAbGluayAjZGVjbGFyZUxhYmVsIGRlY2xhcmVkfSBiZWZvcmUgY2FsbGluZyB0aGlzIG1ldGhvZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsIGEgbGFiZWwuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgYXBwZW5kTGFiZWwoZmluYWwgTGFiZWwgbCkgeworICAgICAgICBidWYuYXBwZW5kKGxhYmVsTmFtZXMuZ2V0KGwpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL3V0aWwvQ2hlY2tBbm5vdGF0aW9uQWRhcHRlci5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS91dGlsL0NoZWNrQW5ub3RhdGlvbkFkYXB0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWNiMzVkCi0tLSAvZGV2L251bGwKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS91dGlsL0NoZWNrQW5ub3RhdGlvbkFkYXB0ZXIuamF2YQpAQCAtMCwwICsxLDE3MSBAQAorLyoKKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgT3JhY2xlIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCisgKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CisgKiBxdWVzdGlvbnMuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBpcyBhdmFpbGFibGUgdW5kZXIgYW5kIGdvdmVybmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogSG93ZXZlciwgdGhlIGZvbGxvd2luZyBub3RpY2UgYWNjb21wYW5pZWQgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhpcworICogZmlsZToKKyAqCisgKiBBU006IGEgdmVyeSBzbWFsbCBhbmQgZmFzdCBKYXZhIGJ5dGVjb2RlIG1hbmlwdWxhdGlvbiBmcmFtZXdvcmsKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDExIElOUklBLCBGcmFuY2UgVGVsZWNvbQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS51dGlsOworCitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLkFubm90YXRpb25WaXNpdG9yOworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5PcGNvZGVzOworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5UeXBlOworCisvKioKKyAqIEFuIHtAbGluayBBbm5vdGF0aW9uVmlzaXRvcn0gdGhhdCBjaGVja3MgdGhhdCBpdHMgbWV0aG9kcyBhcmUgcHJvcGVybHkgdXNlZC4KKyAqCisgKiBAYXV0aG9yIEVyaWMgQnJ1bmV0b24KKyAqLworcHVibGljIGNsYXNzIENoZWNrQW5ub3RhdGlvbkFkYXB0ZXIgZXh0ZW5kcyBBbm5vdGF0aW9uVmlzaXRvciB7CisKKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbmFtZWQ7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gZW5kOworCisgICAgcHVibGljIENoZWNrQW5ub3RhdGlvbkFkYXB0ZXIoZmluYWwgQW5ub3RhdGlvblZpc2l0b3IgYXYpIHsKKyAgICAgICAgdGhpcyhhdiwgdHJ1ZSk7CisgICAgfQorCisgICAgQ2hlY2tBbm5vdGF0aW9uQWRhcHRlcihmaW5hbCBBbm5vdGF0aW9uVmlzaXRvciBhdiwgZmluYWwgYm9vbGVhbiBuYW1lZCkgeworICAgICAgICBzdXBlcihPcGNvZGVzLkFTTTQsIGF2KTsKKyAgICAgICAgdGhpcy5uYW1lZCA9IG5hbWVkOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgY2hlY2tFbmQoKTsKKyAgICAgICAgY2hlY2tOYW1lKG5hbWUpOworICAgICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIEJ5dGUgfHwgdmFsdWUgaW5zdGFuY2VvZiBCb29sZWFuCisgICAgICAgICAgICAgICAgfHwgdmFsdWUgaW5zdGFuY2VvZiBDaGFyYWN0ZXIgfHwgdmFsdWUgaW5zdGFuY2VvZiBTaG9ydAorICAgICAgICAgICAgICAgIHx8IHZhbHVlIGluc3RhbmNlb2YgSW50ZWdlciB8fCB2YWx1ZSBpbnN0YW5jZW9mIExvbmcKKyAgICAgICAgICAgICAgICB8fCB2YWx1ZSBpbnN0YW5jZW9mIEZsb2F0IHx8IHZhbHVlIGluc3RhbmNlb2YgRG91YmxlCisgICAgICAgICAgICAgICAgfHwgdmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcgfHwgdmFsdWUgaW5zdGFuY2VvZiBUeXBlCisgICAgICAgICAgICAgICAgfHwgdmFsdWUgaW5zdGFuY2VvZiBieXRlW10gfHwgdmFsdWUgaW5zdGFuY2VvZiBib29sZWFuW10KKyAgICAgICAgICAgICAgICB8fCB2YWx1ZSBpbnN0YW5jZW9mIGNoYXJbXSB8fCB2YWx1ZSBpbnN0YW5jZW9mIHNob3J0W10KKyAgICAgICAgICAgICAgICB8fCB2YWx1ZSBpbnN0YW5jZW9mIGludFtdIHx8IHZhbHVlIGluc3RhbmNlb2YgbG9uZ1tdCisgICAgICAgICAgICAgICAgfHwgdmFsdWUgaW5zdGFuY2VvZiBmbG9hdFtdIHx8IHZhbHVlIGluc3RhbmNlb2YgZG91YmxlW10pKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIGFubm90YXRpb24gdmFsdWUiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBUeXBlKSB7CisgICAgICAgICAgICBpbnQgc29ydCA9ICgoVHlwZSkgdmFsdWUpLmdldFNvcnQoKTsKKyAgICAgICAgICAgIGlmIChzb3J0ICE9IFR5cGUuT0JKRUNUICYmIHNvcnQgIT0gVHlwZS5BUlJBWSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgYW5ub3RhdGlvbiB2YWx1ZSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChhdiAhPSBudWxsKSB7CisgICAgICAgICAgICBhdi52aXNpdChuYW1lLCB2YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEVudW0oCisgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lLAorICAgICAgICBmaW5hbCBTdHJpbmcgZGVzYywKKyAgICAgICAgZmluYWwgU3RyaW5nIHZhbHVlKQorICAgIHsKKyAgICAgICAgY2hlY2tFbmQoKTsKKyAgICAgICAgY2hlY2tOYW1lKG5hbWUpOworICAgICAgICBDaGVja01ldGhvZEFkYXB0ZXIuY2hlY2tEZXNjKGRlc2MsIGZhbHNlKTsKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgZW51bSB2YWx1ZSIpOworICAgICAgICB9CisgICAgICAgIGlmIChhdiAhPSBudWxsKSB7CisgICAgICAgICAgICBhdi52aXNpdEVudW0obmFtZSwgZGVzYywgdmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEFubm90YXRpb25WaXNpdG9yIHZpc2l0QW5ub3RhdGlvbigKKyAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUsCisgICAgICAgIGZpbmFsIFN0cmluZyBkZXNjKQorICAgIHsKKyAgICAgICAgY2hlY2tFbmQoKTsKKyAgICAgICAgY2hlY2tOYW1lKG5hbWUpOworICAgICAgICBDaGVja01ldGhvZEFkYXB0ZXIuY2hlY2tEZXNjKGRlc2MsIGZhbHNlKTsKKyAgICAgICAgcmV0dXJuIG5ldyBDaGVja0Fubm90YXRpb25BZGFwdGVyKGF2ID09IG51bGwKKyAgICAgICAgICAgICAgICA/IG51bGwKKyAgICAgICAgICAgICAgICA6IGF2LnZpc2l0QW5ub3RhdGlvbihuYW1lLCBkZXNjKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEFubm90YXRpb25WaXNpdG9yIHZpc2l0QXJyYXkoZmluYWwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgY2hlY2tFbmQoKTsKKyAgICAgICAgY2hlY2tOYW1lKG5hbWUpOworICAgICAgICByZXR1cm4gbmV3IENoZWNrQW5ub3RhdGlvbkFkYXB0ZXIoYXYgPT0gbnVsbAorICAgICAgICAgICAgICAgID8gbnVsbAorICAgICAgICAgICAgICAgIDogYXYudmlzaXRBcnJheShuYW1lKSwgZmFsc2UpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0RW5kKCkgeworICAgICAgICBjaGVja0VuZCgpOworICAgICAgICBlbmQgPSB0cnVlOworICAgICAgICBpZiAoYXYgIT0gbnVsbCkgeworICAgICAgICAgICAgYXYudmlzaXRFbmQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjaGVja0VuZCgpIHsKKyAgICAgICAgaWYgKGVuZCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ2Fubm90IGNhbGwgYSB2aXNpdCBtZXRob2QgYWZ0ZXIgdmlzaXRFbmQgaGFzIGJlZW4gY2FsbGVkIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tOYW1lKGZpbmFsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIGlmIChuYW1lZCAmJiBuYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkFubm90YXRpb24gdmFsdWUgbmFtZSBtdXN0IG5vdCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL3V0aWwvQ2hlY2tDbGFzc0FkYXB0ZXIuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vdXRpbC9DaGVja0NsYXNzQWRhcHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZmI1MTQKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL3V0aWwvQ2hlY2tDbGFzc0FkYXB0ZXIuamF2YQpAQCAtMCwwICsxLDYzMiBAQAorLyoKKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgT3JhY2xlIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCisgKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CisgKiBxdWVzdGlvbnMuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBpcyBhdmFpbGFibGUgdW5kZXIgYW5kIGdvdmVybmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogSG93ZXZlciwgdGhlIGZvbGxvd2luZyBub3RpY2UgYWNjb21wYW5pZWQgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhpcworICogZmlsZToKKyAqCisgKiBBU006IGEgdmVyeSBzbWFsbCBhbmQgZmFzdCBKYXZhIGJ5dGVjb2RlIG1hbmlwdWxhdGlvbiBmcmFtZXdvcmsKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDExIElOUklBLCBGcmFuY2UgVGVsZWNvbQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS51dGlsOworCitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLkFubm90YXRpb25WaXNpdG9yOworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5BdHRyaWJ1dGU7CitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLkNsYXNzUmVhZGVyOworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5DbGFzc1Zpc2l0b3I7CitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLkZpZWxkVmlzaXRvcjsKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uTGFiZWw7CitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLk1ldGhvZFZpc2l0b3I7CitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLk9wY29kZXM7CitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLlR5cGU7CitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLnRyZWUuQ2xhc3NOb2RlOworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS50cmVlLk1ldGhvZE5vZGU7CitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLnRyZWUuYW5hbHlzaXMuQW5hbHl6ZXI7CitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLnRyZWUuYW5hbHlzaXMuQmFzaWNWYWx1ZTsKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20udHJlZS5hbmFseXNpcy5GcmFtZTsKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20udHJlZS5hbmFseXNpcy5TaW1wbGVWZXJpZmllcjsKKworLyoqCisgKiBBIHtAbGluayBDbGFzc1Zpc2l0b3J9IHRoYXQgY2hlY2tzIHRoYXQgaXRzIG1ldGhvZHMgYXJlIHByb3Blcmx5IHVzZWQuIE1vcmUKKyAqIHByZWNpc2VseSB0aGlzIGNsYXNzIGFkYXB0ZXIgY2hlY2tzIGVhY2ggbWV0aG9kIGNhbGwgaW5kaXZpZHVhbGx5LCBiYXNlZAorICogPGk+b25seTwvaT4gb24gaXRzIGFyZ3VtZW50cywgYnV0IGRvZXMgPGk+bm90PC9pPiBjaGVjayB0aGUgPGk+c2VxdWVuY2U8L2k+CisgKiBvZiBtZXRob2QgY2FsbHMuIEZvciBleGFtcGxlLCB0aGUgaW52YWxpZCBzZXF1ZW5jZQorICogPHR0PnZpc2l0RmllbGQoQUNDX1BVQkxJQywgImkiLCAiSSIsIG51bGwpPC90dD4gPHR0PnZpc2l0RmllbGQoQUNDX1BVQkxJQywKKyAqICJpIiwgIkQiLCBudWxsKTwvdHQ+CisgKiB3aWxsIDxpPm5vdDwvaT4gYmUgZGV0ZWN0ZWQgYnkgdGhpcyBjbGFzcyBhZGFwdGVyLgorICoKKyAqIDxwPjxjb2RlPkNoZWNrQ2xhc3NBZGFwdGVyPC9jb2RlPiBjYW4gYmUgYWxzbyB1c2VkIHRvIHZlcmlmeSBieXRlY29kZQorICogdHJhbnNmb3JtYXRpb25zIGluIG9yZGVyIHRvIG1ha2Ugc3VyZSB0cmFuc2Zvcm1lZCBieXRlY29kZSBpcyBzYW5lLiBGb3IKKyAqIGV4YW1wbGU6CisgKgorICogPHByZT4KKyAqICAgSW5wdXRTdHJlYW0gaXMgPSAuLi47IC8vIGdldCBieXRlcyBmb3IgdGhlIHNvdXJjZSBjbGFzcworICogICBDbGFzc1JlYWRlciBjciA9IG5ldyBDbGFzc1JlYWRlcihpcyk7CisgKiAgIENsYXNzV3JpdGVyIGN3ID0gbmV3IENsYXNzV3JpdGVyKGNyLCBDbGFzc1dyaXRlci5DT01QVVRFX01BWFMpOworICogICBDbGFzc1Zpc2l0b3IgY3YgPSBuZXcgPGI+TXlDbGFzc0FkYXB0ZXI8L2I+KG5ldyBDaGVja0NsYXNzQWRhcHRlcihjdykpOworICogICBjci5hY2NlcHQoY3YsIDApOworICoKKyAqICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOworICogICBQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihzdyk7CisgKiAgIENoZWNrQ2xhc3NBZGFwdGVyLnZlcmlmeShuZXcgQ2xhc3NSZWFkZXIoY3cudG9CeXRlQXJyYXkoKSksIGZhbHNlLCBwdyk7CisgKiAgIGFzc2VydFRydWUoc3cudG9TdHJpbmcoKSwgc3cudG9TdHJpbmcoKS5sZW5ndGgoKT09MCk7CisgKiA8L3ByZT4KKyAqCisgKiBBYm92ZSBjb2RlIHJ1bnMgdHJhbnNmb3JtZWQgYnl0ZWNvZGUgdHJvdWdoIHRoZQorICogPGNvZGU+Q2hlY2tDbGFzc0FkYXB0ZXI8L2NvZGU+LiBJdCB3b24ndCBiZSBleGFjdGx5IHRoZSBzYW1lIHZlcmlmaWNhdGlvbgorICogYXMgSlZNIGRvZXMsIGJ1dCBpdCBydW4gZGF0YSBmbG93IGFuYWx5c2lzIGZvciB0aGUgY29kZSBvZiBlYWNoIG1ldGhvZCBhbmQKKyAqIGNoZWNrcyB0aGF0IGV4cGVjdGF0aW9ucyBhcmUgbWV0IGZvciBlYWNoIG1ldGhvZCBpbnN0cnVjdGlvbi4KKyAqCisgKiA8cD5JZiBtZXRob2QgYnl0ZWNvZGUgaGFzIGVycm9ycywgYXNzZXJ0aW9uIHRleHQgd2lsbCBzaG93IHRoZSBlcnJvbmVvdXMKKyAqIGluc3RydWN0aW9uIG51bWJlciBhbmQgZHVtcCBvZiB0aGUgZmFpbGVkIG1ldGhvZCB3aXRoIGluZm9ybWF0aW9uIGFib3V0CisgKiBsb2NhbHMgYW5kIHN0YWNrIHNsb3QgZm9yIGVhY2ggaW5zdHJ1Y3Rpb24uIEZvciBleGFtcGxlIChmb3JtYXQgaXMgLQorICogaW5zbk51bWJlciBsb2NhbHMgOiBzdGFjayk6CisgKgorICogPHByZT4KKyAqIGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS50cmVlLmFuYWx5c2lzLkFuYWx5emVyRXhjZXB0aW9uOiBFcnJvciBhdCBpbnN0cnVjdGlvbiA3MTogRXhwZWN0ZWQgSSwgYnV0IGZvdW5kIC4KKyAqICAgYXQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLnRyZWUuYW5hbHlzaXMuQW5hbHl6ZXIuYW5hbHl6ZShBbmFseXplci5qYXZhOjI4OSkKKyAqICAgYXQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLnV0aWwuQ2hlY2tDbGFzc0FkYXB0ZXIudmVyaWZ5KENoZWNrQ2xhc3NBZGFwdGVyLmphdmE6MTM1KQorICogLi4uCisgKiByZW1vdmUoKVYKKyAqIDAwMDAwIExpbmtlZEJsb2NraW5nUXVldWUkSXRyIC4gLiAuIC4gLiAuIC4gLiAgOgorICogICBJQ09OU1RfMAorICogMDAwMDEgTGlua2VkQmxvY2tpbmdRdWV1ZSRJdHIgLiAuIC4gLiAuIC4gLiAuICA6IEkKKyAqICAgSVNUT1JFIDIKKyAqIDAwMDAxIExpbmtlZEJsb2NraW5nUXVldWUkSXRyIDxiPi48L2I+IEkgLiAuIC4gLiAuIC4gIDoKKyAqIC4uLgorICoKKyAqIDAwMDcxIExpbmtlZEJsb2NraW5nUXVldWUkSXRyIDxiPi48L2I+IEkgLiAuIC4gLiAuIC4gIDoKKyAqICAgSUxPQUQgMQorICogMDAwNzIgPGI+PzwvYj4KKyAqICAgSU5WT0tFU1BFQ0lBTCBqYXZhL2xhbmcvSW50ZWdlci48aW5pdD4gKEkpVgorICogLi4uCisgKiA8L3ByZT4KKyAqCisgKiBJbiB0aGUgYWJvdmUgb3V0cHV0IHlvdSBjYW4gc2VlIHRoYXQgdmFyaWFibGUgMSBsb2FkZWQgYnkKKyAqIDxjb2RlPklMT0FEIDE8L2NvZGU+IGluc3RydWN0aW9uIGF0IHBvc2l0aW9uIDxjb2RlPjAwMDcxPC9jb2RlPiBpcyBub3QKKyAqIGluaXRpYWxpemVkLiBZb3UgY2FuIGFsc28gc2VlIHRoYXQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbWV0aG9kIChjb2RlCisgKiBpbnNlcnRlZCBieSB0aGUgdHJhbnNmb3JtYXRpb24pIHZhcmlhYmxlIDIgaXMgaW5pdGlhbGl6ZWQuCisgKgorICogPHA+Tm90ZSB0aGF0IHdoZW4gdXNlZCBsaWtlIHRoYXQsIDxjb2RlPkNoZWNrQ2xhc3NBZGFwdGVyLnZlcmlmeSgpPC9jb2RlPgorICogY2FuIHRyaWdnZXIgYWRkaXRpb25hbCBjbGFzcyBsb2FkaW5nLCBiZWNhdXNlIGl0IGlzIHVzaW5nCisgKiA8Y29kZT5TaW1wbGVWZXJpZmllcjwvY29kZT4uCisgKgorICogQGF1dGhvciBFcmljIEJydW5ldG9uCisgKi8KK3B1YmxpYyBjbGFzcyBDaGVja0NsYXNzQWRhcHRlciBleHRlbmRzIENsYXNzVmlzaXRvciB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY2xhc3MgdmVyc2lvbiBudW1iZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgdmVyc2lvbjsKKworICAgIC8qKgorICAgICAqIDx0dD50cnVlPC90dD4gaWYgdGhlIHZpc2l0IG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHN0YXJ0OworCisgICAgLyoqCisgICAgICogPHR0PnRydWU8L3R0PiBpZiB0aGUgdmlzaXRTb3VyY2UgbWV0aG9kIGhhcyBiZWVuIGNhbGxlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gc291cmNlOworCisgICAgLyoqCisgICAgICogPHR0PnRydWU8L3R0PiBpZiB0aGUgdmlzaXRPdXRlckNsYXNzIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIG91dGVyOworCisgICAgLyoqCisgICAgICogPHR0PnRydWU8L3R0PiBpZiB0aGUgdmlzaXRFbmQgbWV0aG9kIGhhcyBiZWVuIGNhbGxlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gZW5kOworCisgICAgLyoqCisgICAgICogVGhlIGFscmVhZHkgdmlzaXRlZCBsYWJlbHMuIFRoaXMgbWFwIGFzc29jaWF0ZSBJbnRlZ2VyIHZhbHVlcyB0byBMYWJlbAorICAgICAqIGtleXMuCisgICAgICovCisgICAgcHJpdmF0ZSBNYXA8TGFiZWwsIEludGVnZXI+IGxhYmVsczsKKworICAgIC8qKgorICAgICAqIDx0dD50cnVlPC90dD4gaWYgdGhlIG1ldGhvZCBjb2RlIG11c3QgYmUgY2hlY2tlZCB3aXRoIGEgQmFzaWNWZXJpZmllci4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gY2hlY2tEYXRhRmxvdzsKKworICAgIC8qKgorICAgICAqIENoZWNrcyBhIGdpdmVuIGNsYXNzLiA8cD4gVXNhZ2U6IENoZWNrQ2xhc3NBZGFwdGVyICZsdDtiaW5hcnkKKyAgICAgKiBjbGFzcyBuYW1lIG9yIGNsYXNzIGZpbGUgbmFtZSZndDsKKyAgICAgKgorICAgICAqIEBwYXJhbSBhcmdzIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzLgorICAgICAqCisgICAgICogQHRocm93cyBFeGNlcHRpb24gaWYgdGhlIGNsYXNzIGNhbm5vdCBiZSBmb3VuZCwgb3IgaWYgYW4gSU8gZXhjZXB0aW9uCisgICAgICogICAgICAgICBvY2N1cnMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oZmluYWwgU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChhcmdzLmxlbmd0aCAhPSAxKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlZlcmlmaWVzIHRoZSBnaXZlbiBjbGFzcy4iKTsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiVXNhZ2U6IENoZWNrQ2xhc3NBZGFwdGVyICIKKyAgICAgICAgICAgICAgICAgICAgKyAiPGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIGNsYXNzIGZpbGUgbmFtZT4iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBDbGFzc1JlYWRlciBjcjsKKyAgICAgICAgaWYgKGFyZ3NbMF0uZW5kc1dpdGgoIi5jbGFzcyIpKSB7CisgICAgICAgICAgICBjciA9IG5ldyBDbGFzc1JlYWRlcihuZXcgRmlsZUlucHV0U3RyZWFtKGFyZ3NbMF0pKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNyID0gbmV3IENsYXNzUmVhZGVyKGFyZ3NbMF0pOworICAgICAgICB9CisKKyAgICAgICAgdmVyaWZ5KGNyLCBmYWxzZSwgbmV3IFByaW50V3JpdGVyKFN5c3RlbS5lcnIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgYSBnaXZlbiBjbGFzcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjciBhIDxjb2RlPkNsYXNzUmVhZGVyPC9jb2RlPiB0aGF0IGNvbnRhaW5zIGJ5dGVjb2RlIGZvciB0aGUKKyAgICAgKiAgICAgICAgYW5hbHlzaXMuCisgICAgICogQHBhcmFtIGxvYWRlciBhIDxjb2RlPkNsYXNzTG9hZGVyPC9jb2RlPiB3aGljaCB3aWxsIGJlIHVzZWQgdG8gbG9hZAorICAgICAqICAgICAgICByZWZlcmVuY2VkIGNsYXNzZXMuIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSBhcmUgdmVyaWZpeWluZyBtdWx0aXBsZQorICAgICAqICAgICAgICBpbnRlcmRlcGVuZGVudCBjbGFzc2VzLgorICAgICAqIEBwYXJhbSBkdW1wIHRydWUgaWYgYnl0ZWNvZGUgc2hvdWxkIGJlIHByaW50ZWQgb3V0IG5vdCBvbmx5IHdoZW4gZXJyb3JzCisgICAgICogICAgICAgIGFyZSBmb3VuZC4KKyAgICAgKiBAcGFyYW0gcHcgd3JpdGUgd2hlcmUgcmVzdWx0cyBnb2luZyB0byBiZSBwcmludGVkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHZlcmlmeSgKKyAgICAgICAgZmluYWwgQ2xhc3NSZWFkZXIgY3IsCisgICAgICAgIGZpbmFsIENsYXNzTG9hZGVyIGxvYWRlciwKKyAgICAgICAgZmluYWwgYm9vbGVhbiBkdW1wLAorICAgICAgICBmaW5hbCBQcmludFdyaXRlciBwdykKKyAgICB7CisgICAgICAgIENsYXNzTm9kZSBjbiA9IG5ldyBDbGFzc05vZGUoKTsKKyAgICAgICAgY3IuYWNjZXB0KG5ldyBDaGVja0NsYXNzQWRhcHRlcihjbiwgZmFsc2UpLCBDbGFzc1JlYWRlci5TS0lQX0RFQlVHKTsKKworICAgICAgICBUeXBlIHN5cGVyVHlwZSA9IGNuLnN1cGVyTmFtZSA9PSBudWxsCisgICAgICAgICAgICAgICAgPyBudWxsCisgICAgICAgICAgICAgICAgOiBUeXBlLmdldE9iamVjdFR5cGUoY24uc3VwZXJOYW1lKTsKKyAgICAgICAgTGlzdDxNZXRob2ROb2RlPiBtZXRob2RzID0gY24ubWV0aG9kczsKKworICAgICAgICBMaXN0PFR5cGU+IGludGVyZmFjZXMgPSBuZXcgQXJyYXlMaXN0PFR5cGU+KCk7CisgICAgICAgIGZvciAoSXRlcmF0b3I8U3RyaW5nPiBpID0gY24uaW50ZXJmYWNlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIGludGVyZmFjZXMuYWRkKFR5cGUuZ2V0T2JqZWN0VHlwZShpLm5leHQoKS50b1N0cmluZygpKSk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIE1ldGhvZE5vZGUgbWV0aG9kID0gbWV0aG9kcy5nZXQoaSk7CisgICAgICAgICAgICBTaW1wbGVWZXJpZmllciB2ZXJpZmllciA9IG5ldyBTaW1wbGVWZXJpZmllcihUeXBlLmdldE9iamVjdFR5cGUoY24ubmFtZSksCisgICAgICAgICAgICAgICAgICAgIHN5cGVyVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlcywKKyAgICAgICAgICAgICAgICAgICAgKGNuLmFjY2VzcyAmIE9wY29kZXMuQUNDX0lOVEVSRkFDRSkgIT0gMCk7CisgICAgICAgICAgICBBbmFseXplcjxCYXNpY1ZhbHVlPiBhID0gbmV3IEFuYWx5emVyPEJhc2ljVmFsdWU+KHZlcmlmaWVyKTsKKyAgICAgICAgICAgIGlmIChsb2FkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHZlcmlmaWVyLnNldENsYXNzTG9hZGVyKGxvYWRlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGEuYW5hbHl6ZShjbi5uYW1lLCBtZXRob2QpOworICAgICAgICAgICAgICAgIGlmICghZHVtcCkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKHB3KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByaW50QW5hbHl6ZXJSZXN1bHQobWV0aG9kLCBhLCBwdyk7CisgICAgICAgIH0KKyAgICAgICAgcHcuZmx1c2goKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgYSBnaXZlbiBjbGFzcworICAgICAqCisgICAgICogQHBhcmFtIGNyIGEgPGNvZGU+Q2xhc3NSZWFkZXI8L2NvZGU+IHRoYXQgY29udGFpbnMgYnl0ZWNvZGUgZm9yIHRoZQorICAgICAqICAgICAgICBhbmFseXNpcy4KKyAgICAgKiBAcGFyYW0gZHVtcCB0cnVlIGlmIGJ5dGVjb2RlIHNob3VsZCBiZSBwcmludGVkIG91dCBub3Qgb25seSB3aGVuIGVycm9ycworICAgICAqICAgICAgICBhcmUgZm91bmQuCisgICAgICogQHBhcmFtIHB3IHdyaXRlIHdoZXJlIHJlc3VsdHMgZ29pbmcgdG8gYmUgcHJpbnRlZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2ZXJpZnkoCisgICAgICAgIGZpbmFsIENsYXNzUmVhZGVyIGNyLAorICAgICAgICBmaW5hbCBib29sZWFuIGR1bXAsCisgICAgICAgIGZpbmFsIFByaW50V3JpdGVyIHB3KQorICAgIHsKKyAgICAgICAgdmVyaWZ5KGNyLCBudWxsLCBkdW1wLCBwdyk7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgcHJpbnRBbmFseXplclJlc3VsdCgKKyAgICAgICAgTWV0aG9kTm9kZSBtZXRob2QsCisgICAgICAgIEFuYWx5emVyPEJhc2ljVmFsdWU+IGEsCisgICAgICAgIGZpbmFsIFByaW50V3JpdGVyIHB3KQorICAgIHsKKyAgICAgICAgRnJhbWU8QmFzaWNWYWx1ZT5bXSBmcmFtZXMgPSBhLmdldEZyYW1lcygpOworICAgICAgICBUZXh0aWZpZXIgdCA9IG5ldyBUZXh0aWZpZXIoKTsKKyAgICAgICAgVHJhY2VNZXRob2RWaXNpdG9yIG12ID0gbmV3IFRyYWNlTWV0aG9kVmlzaXRvcih0KTsKKworICAgICAgICBwdy5wcmludGxuKG1ldGhvZC5uYW1lICsgbWV0aG9kLmRlc2MpOworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG1ldGhvZC5pbnN0cnVjdGlvbnMuc2l6ZSgpOyArK2opIHsKKyAgICAgICAgICAgIG1ldGhvZC5pbnN0cnVjdGlvbnMuZ2V0KGopLmFjY2VwdChtdik7CisKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICAgICAgRnJhbWU8QmFzaWNWYWx1ZT4gZiA9IGZyYW1lc1tqXTsKKyAgICAgICAgICAgIGlmIChmID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzLmFwcGVuZCgnPycpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IGYuZ2V0TG9jYWxzKCk7ICsraykgeworICAgICAgICAgICAgICAgICAgICBzLmFwcGVuZChnZXRTaG9ydE5hbWUoZi5nZXRMb2NhbChrKS50b1N0cmluZygpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCcgJyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHMuYXBwZW5kKCIgOiAiKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IGYuZ2V0U3RhY2tTaXplKCk7ICsraykgeworICAgICAgICAgICAgICAgICAgICBzLmFwcGVuZChnZXRTaG9ydE5hbWUoZi5nZXRTdGFjayhrKS50b1N0cmluZygpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCcgJyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgd2hpbGUgKHMubGVuZ3RoKCkgPCBtZXRob2QubWF4U3RhY2sgKyBtZXRob2QubWF4TG9jYWxzICsgMSkgeworICAgICAgICAgICAgICAgIHMuYXBwZW5kKCcgJyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdy5wcmludChJbnRlZ2VyLnRvU3RyaW5nKGogKyAxMDAwMDApLnN1YnN0cmluZygxKSk7CisgICAgICAgICAgICBwdy5wcmludCgiICIgKyBzICsgIiA6ICIgKyB0LnRleHQuZ2V0KHQudGV4dC5zaXplKCkgLSAxKSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBtZXRob2QudHJ5Q2F0Y2hCbG9ja3Muc2l6ZSgpOyArK2opIHsKKyAgICAgICAgICAgIG1ldGhvZC50cnlDYXRjaEJsb2Nrcy5nZXQoaikuYWNjZXB0KG12KTsKKyAgICAgICAgICAgIHB3LnByaW50KCIgIiArIHQudGV4dC5nZXQodC50ZXh0LnNpemUoKSAtIDEpKTsKKyAgICAgICAgfQorICAgICAgICBwdy5wcmludGxuKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFNob3J0TmFtZShmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgICAgICBpbnQgbiA9IG5hbWUubGFzdEluZGV4T2YoJy8nKTsKKyAgICAgICAgaW50IGsgPSBuYW1lLmxlbmd0aCgpOworICAgICAgICBpZiAobmFtZS5jaGFyQXQoayAtIDEpID09ICc7JykgeworICAgICAgICAgICAgay0tOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuID09IC0xID8gbmFtZSA6IG5hbWUuc3Vic3RyaW5nKG4gKyAxLCBrKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAbGluayBDaGVja0NsYXNzQWRhcHRlcn0uIDxpPlN1YmNsYXNzZXMgbXVzdCBub3QgdXNlCisgICAgICogdGhpcyBjb25zdHJ1Y3RvcjwvaT4uIEluc3RlYWQsIHRoZXkgbXVzdCB1c2UgdGhlCisgICAgICoge0BsaW5rICNDaGVja0NsYXNzQWRhcHRlcihpbnQsIENsYXNzVmlzaXRvciwgYm9vbGVhbil9IHZlcnNpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY3YgdGhlIGNsYXNzIHZpc2l0b3IgdG8gd2hpY2ggdGhpcyBhZGFwdGVyIG11c3QgZGVsZWdhdGUgY2FsbHMuCisgICAgICovCisgICAgcHVibGljIENoZWNrQ2xhc3NBZGFwdGVyKGZpbmFsIENsYXNzVmlzaXRvciBjdikgeworICAgICAgICB0aGlzKGN2LCB0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAbGluayBDaGVja0NsYXNzQWRhcHRlcn0uIDxpPlN1YmNsYXNzZXMgbXVzdCBub3QgdXNlCisgICAgICogdGhpcyBjb25zdHJ1Y3RvcjwvaT4uIEluc3RlYWQsIHRoZXkgbXVzdCB1c2UgdGhlCisgICAgICoge0BsaW5rICNDaGVja0NsYXNzQWRhcHRlcihpbnQsIENsYXNzVmlzaXRvciwgYm9vbGVhbil9IHZlcnNpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY3YgdGhlIGNsYXNzIHZpc2l0b3IgdG8gd2hpY2ggdGhpcyBhZGFwdGVyIG11c3QgZGVsZWdhdGUgY2FsbHMuCisgICAgICogQHBhcmFtIGNoZWNrRGF0YUZsb3cgPHR0PnRydWU8L3R0PiB0byBwZXJmb3JtIGJhc2ljIGRhdGEgZmxvdyBjaGVja3MsIG9yCisgICAgICogICAgICAgIDx0dD5mYWxzZTwvdHQ+IHRvIG5vdCBwZXJmb3JtIGFueSBkYXRhIGZsb3cgY2hlY2sgKHNlZQorICAgICAqICAgICAgICB7QGxpbmsgQ2hlY2tNZXRob2RBZGFwdGVyfSkuIFRoaXMgb3B0aW9uIHJlcXVpcmVzIHZhbGlkIG1heExvY2FscworICAgICAqICAgICAgICBhbmQgbWF4U3RhY2sgdmFsdWVzLgorICAgICAqLworICAgIHB1YmxpYyBDaGVja0NsYXNzQWRhcHRlcihmaW5hbCBDbGFzc1Zpc2l0b3IgY3YsIGZpbmFsIGJvb2xlYW4gY2hlY2tEYXRhRmxvdykKKyAgICB7CisgICAgICAgIHRoaXMoT3Bjb2Rlcy5BU000LCBjdiwgY2hlY2tEYXRhRmxvdyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGxpbmsgQ2hlY2tDbGFzc0FkYXB0ZXJ9LgorICAgICAqCisgICAgICogQHBhcmFtIGFwaSB0aGUgQVNNIEFQSSB2ZXJzaW9uIGltcGxlbWVudGVkIGJ5IHRoaXMgdmlzaXRvci4gTXVzdCBiZSBvbmUKKyAgICAgKiAgICAgICAgb2Yge0BsaW5rIE9wY29kZXMjQVNNNH0uCisgICAgICogQHBhcmFtIGN2IHRoZSBjbGFzcyB2aXNpdG9yIHRvIHdoaWNoIHRoaXMgYWRhcHRlciBtdXN0IGRlbGVnYXRlIGNhbGxzLgorICAgICAqIEBwYXJhbSBjaGVja0RhdGFGbG93IDx0dD50cnVlPC90dD4gdG8gcGVyZm9ybSBiYXNpYyBkYXRhIGZsb3cgY2hlY2tzLCBvcgorICAgICAqICAgICAgICA8dHQ+ZmFsc2U8L3R0PiB0byBub3QgcGVyZm9ybSBhbnkgZGF0YSBmbG93IGNoZWNrIChzZWUKKyAgICAgKiAgICAgICAge0BsaW5rIENoZWNrTWV0aG9kQWRhcHRlcn0pLiBUaGlzIG9wdGlvbiByZXF1aXJlcyB2YWxpZCBtYXhMb2NhbHMKKyAgICAgKiAgICAgICAgYW5kIG1heFN0YWNrIHZhbHVlcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ2hlY2tDbGFzc0FkYXB0ZXIoCisgICAgICAgIGZpbmFsIGludCBhcGksCisgICAgICAgIGZpbmFsIENsYXNzVmlzaXRvciBjdiwKKyAgICAgICAgZmluYWwgYm9vbGVhbiBjaGVja0RhdGFGbG93KQorICAgIHsKKyAgICAgICAgc3VwZXIoYXBpLCBjdik7CisgICAgICAgIHRoaXMubGFiZWxzID0gbmV3IEhhc2hNYXA8TGFiZWwsIEludGVnZXI+KCk7CisgICAgICAgIHRoaXMuY2hlY2tEYXRhRmxvdyA9IGNoZWNrRGF0YUZsb3c7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gSW1wbGVtZW50YXRpb24gb2YgdGhlIENsYXNzVmlzaXRvciBpbnRlcmZhY2UKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KAorICAgICAgICBmaW5hbCBpbnQgdmVyc2lvbiwKKyAgICAgICAgZmluYWwgaW50IGFjY2VzcywKKyAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUsCisgICAgICAgIGZpbmFsIFN0cmluZyBzaWduYXR1cmUsCisgICAgICAgIGZpbmFsIFN0cmluZyBzdXBlck5hbWUsCisgICAgICAgIGZpbmFsIFN0cmluZ1tdIGludGVyZmFjZXMpCisgICAgeworICAgICAgICBpZiAoc3RhcnQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInZpc2l0IG11c3QgYmUgY2FsbGVkIG9ubHkgb25jZSIpOworICAgICAgICB9CisgICAgICAgIHN0YXJ0ID0gdHJ1ZTsKKyAgICAgICAgY2hlY2tTdGF0ZSgpOworICAgICAgICBjaGVja0FjY2VzcyhhY2Nlc3MsIE9wY29kZXMuQUNDX1BVQkxJQyArIE9wY29kZXMuQUNDX0ZJTkFMCisgICAgICAgICAgICAgICAgKyBPcGNvZGVzLkFDQ19TVVBFUiArIE9wY29kZXMuQUNDX0lOVEVSRkFDRQorICAgICAgICAgICAgICAgICsgT3Bjb2Rlcy5BQ0NfQUJTVFJBQ1QgKyBPcGNvZGVzLkFDQ19TWU5USEVUSUMKKyAgICAgICAgICAgICAgICArIE9wY29kZXMuQUNDX0FOTk9UQVRJT04gKyBPcGNvZGVzLkFDQ19FTlVNCisgICAgICAgICAgICAgICAgKyBPcGNvZGVzLkFDQ19ERVBSRUNBVEVECisgICAgICAgICAgICAgICAgKyAweDQwMDAwKTsgLy8gQ2xhc3NXcml0ZXIuQUNDX1NZTlRIRVRJQ19BVFRSSUJVVEUKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCB8fCAhbmFtZS5lbmRzV2l0aCgicGFja2FnZS1pbmZvIikpIHsKKyAgICAgICAgICAgIENoZWNrTWV0aG9kQWRhcHRlci5jaGVja0ludGVybmFsTmFtZShuYW1lLCAiY2xhc3MgbmFtZSIpOworICAgICAgICB9CisgICAgICAgIGlmICgiamF2YS9sYW5nL09iamVjdCIuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICBpZiAoc3VwZXJOYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgc3VwZXIgY2xhc3MgbmFtZSBvZiB0aGUgT2JqZWN0IGNsYXNzIG11c3QgYmUgJ251bGwnIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBDaGVja01ldGhvZEFkYXB0ZXIuY2hlY2tJbnRlcm5hbE5hbWUoc3VwZXJOYW1lLCAic3VwZXIgY2xhc3MgbmFtZSIpOworICAgICAgICB9CisgICAgICAgIGlmIChzaWduYXR1cmUgIT0gbnVsbCkgeworICAgICAgICAgICAgQ2hlY2tNZXRob2RBZGFwdGVyLmNoZWNrQ2xhc3NTaWduYXR1cmUoc2lnbmF0dXJlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGFjY2VzcyAmIE9wY29kZXMuQUNDX0lOVEVSRkFDRSkgIT0gMCkgeworICAgICAgICAgICAgaWYgKCEiamF2YS9sYW5nL09iamVjdCIuZXF1YWxzKHN1cGVyTmFtZSkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgc3VwZXIgY2xhc3MgbmFtZSBvZiBpbnRlcmZhY2VzIG11c3QgYmUgJ2phdmEvbGFuZy9PYmplY3QnIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGludGVyZmFjZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnRlcmZhY2VzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICAgICAgQ2hlY2tNZXRob2RBZGFwdGVyLmNoZWNrSW50ZXJuYWxOYW1lKGludGVyZmFjZXNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAiaW50ZXJmYWNlIG5hbWUgYXQgaW5kZXggIiArIGkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb247CisgICAgICAgIHN1cGVyLnZpc2l0KHZlcnNpb24sIGFjY2VzcywgbmFtZSwgc2lnbmF0dXJlLCBzdXBlck5hbWUsIGludGVyZmFjZXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0U291cmNlKGZpbmFsIFN0cmluZyBmaWxlLCBmaW5hbCBTdHJpbmcgZGVidWcpIHsKKyAgICAgICAgY2hlY2tTdGF0ZSgpOworICAgICAgICBpZiAoc291cmNlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ2aXNpdFNvdXJjZSBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZS4iKTsKKyAgICAgICAgfQorICAgICAgICBzb3VyY2UgPSB0cnVlOworICAgICAgICBzdXBlci52aXNpdFNvdXJjZShmaWxlLCBkZWJ1Zyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRPdXRlckNsYXNzKAorICAgICAgICBmaW5hbCBTdHJpbmcgb3duZXIsCisgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lLAorICAgICAgICBmaW5hbCBTdHJpbmcgZGVzYykKKyAgICB7CisgICAgICAgIGNoZWNrU3RhdGUoKTsKKyAgICAgICAgaWYgKG91dGVyKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ2aXNpdE91dGVyQ2xhc3MgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UuIik7CisgICAgICAgIH0KKyAgICAgICAgb3V0ZXIgPSB0cnVlOworICAgICAgICBpZiAob3duZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSWxsZWdhbCBvdXRlciBjbGFzcyBvd25lciIpOworICAgICAgICB9CisgICAgICAgIGlmIChkZXNjICE9IG51bGwpIHsKKyAgICAgICAgICAgIENoZWNrTWV0aG9kQWRhcHRlci5jaGVja01ldGhvZERlc2MoZGVzYyk7CisgICAgICAgIH0KKyAgICAgICAgc3VwZXIudmlzaXRPdXRlckNsYXNzKG93bmVyLCBuYW1lLCBkZXNjKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdElubmVyQ2xhc3MoCisgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lLAorICAgICAgICBmaW5hbCBTdHJpbmcgb3V0ZXJOYW1lLAorICAgICAgICBmaW5hbCBTdHJpbmcgaW5uZXJOYW1lLAorICAgICAgICBmaW5hbCBpbnQgYWNjZXNzKQorICAgIHsKKyAgICAgICAgY2hlY2tTdGF0ZSgpOworICAgICAgICBDaGVja01ldGhvZEFkYXB0ZXIuY2hlY2tJbnRlcm5hbE5hbWUobmFtZSwgImNsYXNzIG5hbWUiKTsKKyAgICAgICAgaWYgKG91dGVyTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICBDaGVja01ldGhvZEFkYXB0ZXIuY2hlY2tJbnRlcm5hbE5hbWUob3V0ZXJOYW1lLCAib3V0ZXIgY2xhc3MgbmFtZSIpOworICAgICAgICB9CisgICAgICAgIGlmIChpbm5lck5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgQ2hlY2tNZXRob2RBZGFwdGVyLmNoZWNrSWRlbnRpZmllcihpbm5lck5hbWUsICJpbm5lciBjbGFzcyBuYW1lIik7CisgICAgICAgIH0KKyAgICAgICAgY2hlY2tBY2Nlc3MoYWNjZXNzLCBPcGNvZGVzLkFDQ19QVUJMSUMgKyBPcGNvZGVzLkFDQ19QUklWQVRFCisgICAgICAgICAgICAgICAgKyBPcGNvZGVzLkFDQ19QUk9URUNURUQgKyBPcGNvZGVzLkFDQ19TVEFUSUMKKyAgICAgICAgICAgICAgICArIE9wY29kZXMuQUNDX0ZJTkFMICsgT3Bjb2Rlcy5BQ0NfSU5URVJGQUNFCisgICAgICAgICAgICAgICAgKyBPcGNvZGVzLkFDQ19BQlNUUkFDVCArIE9wY29kZXMuQUNDX1NZTlRIRVRJQworICAgICAgICAgICAgICAgICsgT3Bjb2Rlcy5BQ0NfQU5OT1RBVElPTiArIE9wY29kZXMuQUNDX0VOVU0pOworICAgICAgICBzdXBlci52aXNpdElubmVyQ2xhc3MobmFtZSwgb3V0ZXJOYW1lLCBpbm5lck5hbWUsIGFjY2Vzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEZpZWxkVmlzaXRvciB2aXNpdEZpZWxkKAorICAgICAgICBmaW5hbCBpbnQgYWNjZXNzLAorICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSwKKyAgICAgICAgZmluYWwgU3RyaW5nIGRlc2MsCisgICAgICAgIGZpbmFsIFN0cmluZyBzaWduYXR1cmUsCisgICAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSkKKyAgICB7CisgICAgICAgIGNoZWNrU3RhdGUoKTsKKyAgICAgICAgY2hlY2tBY2Nlc3MoYWNjZXNzLCBPcGNvZGVzLkFDQ19QVUJMSUMgKyBPcGNvZGVzLkFDQ19QUklWQVRFCisgICAgICAgICAgICAgICAgKyBPcGNvZGVzLkFDQ19QUk9URUNURUQgKyBPcGNvZGVzLkFDQ19TVEFUSUMKKyAgICAgICAgICAgICAgICArIE9wY29kZXMuQUNDX0ZJTkFMICsgT3Bjb2Rlcy5BQ0NfVk9MQVRJTEUKKyAgICAgICAgICAgICAgICArIE9wY29kZXMuQUNDX1RSQU5TSUVOVCArIE9wY29kZXMuQUNDX1NZTlRIRVRJQworICAgICAgICAgICAgICAgICsgT3Bjb2Rlcy5BQ0NfRU5VTSArIE9wY29kZXMuQUNDX0RFUFJFQ0FURUQKKyAgICAgICAgICAgICAgICArIDB4NDAwMDApOyAvLyBDbGFzc1dyaXRlci5BQ0NfU1lOVEhFVElDX0FUVFJJQlVURQorICAgICAgICBDaGVja01ldGhvZEFkYXB0ZXIuY2hlY2tVbnF1YWxpZmllZE5hbWUodmVyc2lvbiwgbmFtZSwgImZpZWxkIG5hbWUiKTsKKyAgICAgICAgQ2hlY2tNZXRob2RBZGFwdGVyLmNoZWNrRGVzYyhkZXNjLCBmYWxzZSk7CisgICAgICAgIGlmIChzaWduYXR1cmUgIT0gbnVsbCkgeworICAgICAgICAgICAgQ2hlY2tNZXRob2RBZGFwdGVyLmNoZWNrRmllbGRTaWduYXR1cmUoc2lnbmF0dXJlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgQ2hlY2tNZXRob2RBZGFwdGVyLmNoZWNrQ29uc3RhbnQodmFsdWUpOworICAgICAgICB9CisgICAgICAgIEZpZWxkVmlzaXRvciBhdiA9IHN1cGVyLnZpc2l0RmllbGQoYWNjZXNzLCBuYW1lLCBkZXNjLCBzaWduYXR1cmUsIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIG5ldyBDaGVja0ZpZWxkQWRhcHRlcihhdik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE1ldGhvZFZpc2l0b3IgdmlzaXRNZXRob2QoCisgICAgICAgIGZpbmFsIGludCBhY2Nlc3MsCisgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lLAorICAgICAgICBmaW5hbCBTdHJpbmcgZGVzYywKKyAgICAgICAgZmluYWwgU3RyaW5nIHNpZ25hdHVyZSwKKyAgICAgICAgZmluYWwgU3RyaW5nW10gZXhjZXB0aW9ucykKKyAgICB7CisgICAgICAgIGNoZWNrU3RhdGUoKTsKKyAgICAgICAgY2hlY2tBY2Nlc3MoYWNjZXNzLCBPcGNvZGVzLkFDQ19QVUJMSUMgKyBPcGNvZGVzLkFDQ19QUklWQVRFCisgICAgICAgICAgICAgICAgKyBPcGNvZGVzLkFDQ19QUk9URUNURUQgKyBPcGNvZGVzLkFDQ19TVEFUSUMKKyAgICAgICAgICAgICAgICArIE9wY29kZXMuQUNDX0ZJTkFMICsgT3Bjb2Rlcy5BQ0NfU1lOQ0hST05JWkVECisgICAgICAgICAgICAgICAgKyBPcGNvZGVzLkFDQ19CUklER0UgKyBPcGNvZGVzLkFDQ19WQVJBUkdTICsgT3Bjb2Rlcy5BQ0NfTkFUSVZFCisgICAgICAgICAgICAgICAgKyBPcGNvZGVzLkFDQ19BQlNUUkFDVCArIE9wY29kZXMuQUNDX1NUUklDVAorICAgICAgICAgICAgICAgICsgT3Bjb2Rlcy5BQ0NfU1lOVEhFVElDICsgT3Bjb2Rlcy5BQ0NfREVQUkVDQVRFRAorICAgICAgICAgICAgICAgICsgMHg0MDAwMCk7IC8vIENsYXNzV3JpdGVyLkFDQ19TWU5USEVUSUNfQVRUUklCVVRFCisgICAgICAgIENoZWNrTWV0aG9kQWRhcHRlci5jaGVja01ldGhvZElkZW50aWZpZXIodmVyc2lvbiwgbmFtZSwgIm1ldGhvZCBuYW1lIik7CisgICAgICAgIENoZWNrTWV0aG9kQWRhcHRlci5jaGVja01ldGhvZERlc2MoZGVzYyk7CisgICAgICAgIGlmIChzaWduYXR1cmUgIT0gbnVsbCkgeworICAgICAgICAgICAgQ2hlY2tNZXRob2RBZGFwdGVyLmNoZWNrTWV0aG9kU2lnbmF0dXJlKHNpZ25hdHVyZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGV4Y2VwdGlvbnMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleGNlcHRpb25zLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICAgICAgQ2hlY2tNZXRob2RBZGFwdGVyLmNoZWNrSW50ZXJuYWxOYW1lKGV4Y2VwdGlvbnNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAiZXhjZXB0aW9uIG5hbWUgYXQgaW5kZXggIiArIGkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIENoZWNrTWV0aG9kQWRhcHRlciBjbWE7CisgICAgICAgIGlmIChjaGVja0RhdGFGbG93KSB7CisgICAgICAgICAgICBjbWEgPSBuZXcgQ2hlY2tNZXRob2RBZGFwdGVyKGFjY2VzcywKKyAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgZGVzYywKKyAgICAgICAgICAgICAgICAgICAgc3VwZXIudmlzaXRNZXRob2QoYWNjZXNzLCBuYW1lLCBkZXNjLCBzaWduYXR1cmUsIGV4Y2VwdGlvbnMpLAorICAgICAgICAgICAgICAgICAgICBsYWJlbHMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY21hID0gbmV3IENoZWNrTWV0aG9kQWRhcHRlcihzdXBlci52aXNpdE1ldGhvZChhY2Nlc3MsCisgICAgICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgICAgIGRlc2MsCisgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9ucyksIGxhYmVscyk7CisgICAgICAgIH0KKyAgICAgICAgY21hLnZlcnNpb24gPSB2ZXJzaW9uOworICAgICAgICByZXR1cm4gY21hOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBBbm5vdGF0aW9uVmlzaXRvciB2aXNpdEFubm90YXRpb24oCisgICAgICAgIGZpbmFsIFN0cmluZyBkZXNjLAorICAgICAgICBmaW5hbCBib29sZWFuIHZpc2libGUpCisgICAgeworICAgICAgICBjaGVja1N0YXRlKCk7CisgICAgICAgIENoZWNrTWV0aG9kQWRhcHRlci5jaGVja0Rlc2MoZGVzYywgZmFsc2UpOworICAgICAgICByZXR1cm4gbmV3IENoZWNrQW5ub3RhdGlvbkFkYXB0ZXIoc3VwZXIudmlzaXRBbm5vdGF0aW9uKGRlc2MsIHZpc2libGUpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEF0dHJpYnV0ZShmaW5hbCBBdHRyaWJ1dGUgYXR0cikgeworICAgICAgICBjaGVja1N0YXRlKCk7CisgICAgICAgIGlmIChhdHRyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgYXR0cmlidXRlIChtdXN0IG5vdCBiZSBudWxsKSIpOworICAgICAgICB9CisgICAgICAgIHN1cGVyLnZpc2l0QXR0cmlidXRlKGF0dHIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0RW5kKCkgeworICAgICAgICBjaGVja1N0YXRlKCk7CisgICAgICAgIGVuZCA9IHRydWU7CisgICAgICAgIHN1cGVyLnZpc2l0RW5kKCk7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gVXRpbGl0eSBtZXRob2RzCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgdGhhdCB0aGUgdmlzaXQgbWV0aG9kIGhhcyBiZWVuIGNhbGxlZCBhbmQgdGhhdCB2aXNpdEVuZCBoYXMgbm90CisgICAgICogYmVlbiBjYWxsZWQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrU3RhdGUoKSB7CisgICAgICAgIGlmICghc3RhcnQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNhbm5vdCB2aXNpdCBtZW1iZXIgYmVmb3JlIHZpc2l0IGhhcyBiZWVuIGNhbGxlZC4iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZW5kKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDYW5ub3QgdmlzaXQgbWVtYmVyIGFmdGVyIHZpc2l0RW5kIGhhcyBiZWVuIGNhbGxlZC4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrcyB0aGF0IHRoZSBnaXZlbiBhY2Nlc3MgZmxhZ3MgZG8gbm90IGNvbnRhaW4gaW52YWxpZCBmbGFncy4gVGhpcworICAgICAqIG1ldGhvZCBhbHNvIGNoZWNrcyB0aGF0IG11dHVhbGx5IGluY29tcGF0aWJsZSBmbGFncyBhcmUgbm90IHNldAorICAgICAqIHNpbXVsdGFuZW91c2x5LgorICAgICAqCisgICAgICogQHBhcmFtIGFjY2VzcyB0aGUgYWNjZXNzIGZsYWdzIHRvIGJlIGNoZWNrZWQKKyAgICAgKiBAcGFyYW0gcG9zc2libGVBY2Nlc3MgdGhlIHZhbGlkIGFjY2VzcyBmbGFncy4KKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCBjaGVja0FjY2VzcyhmaW5hbCBpbnQgYWNjZXNzLCBmaW5hbCBpbnQgcG9zc2libGVBY2Nlc3MpIHsKKyAgICAgICAgaWYgKChhY2Nlc3MgJiB+cG9zc2libGVBY2Nlc3MpICE9IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgYWNjZXNzIGZsYWdzOiAiCisgICAgICAgICAgICAgICAgICAgICsgYWNjZXNzKTsKKyAgICAgICAgfQorICAgICAgICBpbnQgcHViID0gKGFjY2VzcyAmIE9wY29kZXMuQUNDX1BVQkxJQykgPT0gMCA/IDAgOiAxOworICAgICAgICBpbnQgcHJpID0gKGFjY2VzcyAmIE9wY29kZXMuQUNDX1BSSVZBVEUpID09IDAgPyAwIDogMTsKKyAgICAgICAgaW50IHBybyA9IChhY2Nlc3MgJiBPcGNvZGVzLkFDQ19QUk9URUNURUQpID09IDAgPyAwIDogMTsKKyAgICAgICAgaWYgKHB1YiArIHByaSArIHBybyA+IDEpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInB1YmxpYyBwcml2YXRlIGFuZCBwcm90ZWN0ZWQgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZTogIgorICAgICAgICAgICAgICAgICAgICArIGFjY2Vzcyk7CisgICAgICAgIH0KKyAgICAgICAgaW50IGZpbiA9IChhY2Nlc3MgJiBPcGNvZGVzLkFDQ19GSU5BTCkgPT0gMCA/IDAgOiAxOworICAgICAgICBpbnQgYWJzID0gKGFjY2VzcyAmIE9wY29kZXMuQUNDX0FCU1RSQUNUKSA9PSAwID8gMCA6IDE7CisgICAgICAgIGlmIChmaW4gKyBhYnMgPiAxKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJmaW5hbCBhbmQgYWJzdHJhY3QgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZTogIgorICAgICAgICAgICAgICAgICAgICArIGFjY2Vzcyk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL3V0aWwvQ2hlY2tGaWVsZEFkYXB0ZXIuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vdXRpbC9DaGVja0ZpZWxkQWRhcHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2ODk5MWUKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL3V0aWwvQ2hlY2tGaWVsZEFkYXB0ZXIuamF2YQpAQCAtMCwwICsxLDEyNiBAQAorLyoKKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgT3JhY2xlIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCisgKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CisgKiBxdWVzdGlvbnMuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBpcyBhdmFpbGFibGUgdW5kZXIgYW5kIGdvdmVybmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogSG93ZXZlciwgdGhlIGZvbGxvd2luZyBub3RpY2UgYWNjb21wYW5pZWQgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhpcworICogZmlsZToKKyAqCisgKiBBU006IGEgdmVyeSBzbWFsbCBhbmQgZmFzdCBKYXZhIGJ5dGVjb2RlIG1hbmlwdWxhdGlvbiBmcmFtZXdvcmsKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDExIElOUklBLCBGcmFuY2UgVGVsZWNvbQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS51dGlsOworCitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLkFubm90YXRpb25WaXNpdG9yOworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5BdHRyaWJ1dGU7CitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLkZpZWxkVmlzaXRvcjsKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uT3Bjb2RlczsKKworLyoqCisgKiBBIHtAbGluayBGaWVsZFZpc2l0b3J9IHRoYXQgY2hlY2tzIHRoYXQgaXRzIG1ldGhvZHMgYXJlIHByb3Blcmx5IHVzZWQuCisgKi8KK3B1YmxpYyBjbGFzcyBDaGVja0ZpZWxkQWRhcHRlciBleHRlbmRzIEZpZWxkVmlzaXRvciB7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gZW5kOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGxpbmsgQ2hlY2tGaWVsZEFkYXB0ZXJ9LiA8aT5TdWJjbGFzc2VzIG11c3Qgbm90IHVzZQorICAgICAqIHRoaXMgY29uc3RydWN0b3I8L2k+LiBJbnN0ZWFkLCB0aGV5IG11c3QgdXNlIHRoZQorICAgICAqIHtAbGluayAjQ2hlY2tGaWVsZEFkYXB0ZXIoaW50LCBGaWVsZFZpc2l0b3IpfSB2ZXJzaW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGZ2IHRoZSBmaWVsZCB2aXNpdG9yIHRvIHdoaWNoIHRoaXMgYWRhcHRlciBtdXN0IGRlbGVnYXRlIGNhbGxzLgorICAgICAqLworICAgIHB1YmxpYyBDaGVja0ZpZWxkQWRhcHRlcihmaW5hbCBGaWVsZFZpc2l0b3IgZnYpIHsKKyAgICAgICAgdGhpcyhPcGNvZGVzLkFTTTQsIGZ2KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAbGluayBDaGVja0ZpZWxkQWRhcHRlcn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXBpIHRoZSBBU00gQVBJIHZlcnNpb24gaW1wbGVtZW50ZWQgYnkgdGhpcyB2aXNpdG9yLiBNdXN0IGJlIG9uZQorICAgICAqICAgICAgICBvZiB7QGxpbmsgT3Bjb2RlcyNBU000fS4KKyAgICAgKiBAcGFyYW0gZnYgdGhlIGZpZWxkIHZpc2l0b3IgdG8gd2hpY2ggdGhpcyBhZGFwdGVyIG11c3QgZGVsZWdhdGUgY2FsbHMuCisgICAgICovCisgICAgcHJvdGVjdGVkIENoZWNrRmllbGRBZGFwdGVyKGZpbmFsIGludCBhcGksIGZpbmFsIEZpZWxkVmlzaXRvciBmdikgeworICAgICAgICBzdXBlcihhcGksIGZ2KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQW5ub3RhdGlvblZpc2l0b3IgdmlzaXRBbm5vdGF0aW9uKAorICAgICAgICBmaW5hbCBTdHJpbmcgZGVzYywKKyAgICAgICAgZmluYWwgYm9vbGVhbiB2aXNpYmxlKQorICAgIHsKKyAgICAgICAgY2hlY2tFbmQoKTsKKyAgICAgICAgQ2hlY2tNZXRob2RBZGFwdGVyLmNoZWNrRGVzYyhkZXNjLCBmYWxzZSk7CisgICAgICAgIHJldHVybiBuZXcgQ2hlY2tBbm5vdGF0aW9uQWRhcHRlcihzdXBlci52aXNpdEFubm90YXRpb24oZGVzYywgdmlzaWJsZSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0QXR0cmlidXRlKGZpbmFsIEF0dHJpYnV0ZSBhdHRyKSB7CisgICAgICAgIGNoZWNrRW5kKCk7CisgICAgICAgIGlmIChhdHRyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgYXR0cmlidXRlIChtdXN0IG5vdCBiZSBudWxsKSIpOworICAgICAgICB9CisgICAgICAgIHN1cGVyLnZpc2l0QXR0cmlidXRlKGF0dHIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0RW5kKCkgeworICAgICAgICBjaGVja0VuZCgpOworICAgICAgICBlbmQgPSB0cnVlOworICAgICAgICBzdXBlci52aXNpdEVuZCgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjaGVja0VuZCgpIHsKKyAgICAgICAgaWYgKGVuZCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ2Fubm90IGNhbGwgYSB2aXNpdCBtZXRob2QgYWZ0ZXIgdmlzaXRFbmQgaGFzIGJlZW4gY2FsbGVkIik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL3V0aWwvQ2hlY2tNZXRob2RBZGFwdGVyLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL3V0aWwvQ2hlY2tNZXRob2RBZGFwdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFlOTI2MgotLS0gL2Rldi9udWxsCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vdXRpbC9DaGVja01ldGhvZEFkYXB0ZXIuamF2YQpAQCAtMCwwICsxLDE2OTcgQEAKKy8qCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IE9yYWNsZSBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQorICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQorICogcXVlc3Rpb25zLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgaXMgYXZhaWxhYmxlIHVuZGVyIGFuZCBnb3Zlcm5lZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIEhvd2V2ZXIsIHRoZSBmb2xsb3dpbmcgbm90aWNlIGFjY29tcGFuaWVkIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoaXMKKyAqIGZpbGU6CisgKgorICogQVNNOiBhIHZlcnkgc21hbGwgYW5kIGZhc3QgSmF2YSBieXRlY29kZSBtYW5pcHVsYXRpb24gZnJhbWV3b3JrCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAxMSBJTlJJQSwgRnJhbmNlIFRlbGVjb20KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20udXRpbDsKKworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uQW5ub3RhdGlvblZpc2l0b3I7CitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLkF0dHJpYnV0ZTsKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uSGFuZGxlOworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5MYWJlbDsKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uTWV0aG9kVmlzaXRvcjsKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uT3Bjb2RlczsKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uVHlwZTsKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20udHJlZS5NZXRob2ROb2RlOworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS50cmVlLmFuYWx5c2lzLkFuYWx5emVyOworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS50cmVlLmFuYWx5c2lzLkJhc2ljVmFsdWU7CitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLnRyZWUuYW5hbHlzaXMuQmFzaWNWZXJpZmllcjsKKworLyoqCisgKiBBIHtAbGluayBNZXRob2RWaXNpdG9yfSB0aGF0IGNoZWNrcyB0aGF0IGl0cyBtZXRob2RzIGFyZSBwcm9wZXJseSB1c2VkLiBNb3JlCisgKiBwcmVjaXNlbHkgdGhpcyBtZXRob2QgYWRhcHRlciBjaGVja3MgZWFjaCBpbnN0cnVjdGlvbiBpbmRpdmlkdWFsbHksIGkuZS4sCisgKiBlYWNoIHZpc2l0IG1ldGhvZCBjaGVja3Mgc29tZSBwcmVjb25kaXRpb25zIGJhc2VkIDxpPm9ubHk8L2k+IG9uIGl0cworICogYXJndW1lbnRzIC0gc3VjaCBhcyB0aGUgZmFjdCB0aGF0IHRoZSBnaXZlbiBvcGNvZGUgaXMgY29ycmVjdCBmb3IgYSBnaXZlbgorICogdmlzaXQgbWV0aG9kLiBUaGlzIGFkYXB0ZXIgY2FuIGFsc28gcGVyZm9ybSBzb21lIGJhc2ljIGRhdGEgZmxvdyBjaGVja3MgKG1vcmUKKyAqIHByZWNpc2VseSB0aG9zZSB0aGF0IGNhbiBiZSBwZXJmb3JtZWQgd2l0aG91dCB0aGUgZnVsbCBjbGFzcyBoaWVyYXJjaHkgLSBzZWUKKyAqIHtAbGluayBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20udHJlZS5hbmFseXNpcy5CYXNpY1ZlcmlmaWVyfSkuIEZvciBpbnN0YW5jZSBpbiBhCisgKiBtZXRob2Qgd2hvc2Ugc2lnbmF0dXJlIGlzIDx0dD52b2lkIG0gKCk8L3R0PiwgdGhlIGludmFsaWQgaW5zdHJ1Y3Rpb24KKyAqIElSRVRVUk4sIG9yIHRoZSBpbnZhbGlkIHNlcXVlbmNlIElBREQgTDJJIHdpbGwgYmUgZGV0ZWN0ZWQgaWYgdGhlIGRhdGEgZmxvdworICogY2hlY2tzIGFyZSBlbmFibGVkLiBUaGVzZSBjaGVja3MgYXJlIGVuYWJsZWQgYnkgdXNpbmcgdGhlCisgKiB7QGxpbmsgI0NoZWNrTWV0aG9kQWRhcHRlcihpbnQsU3RyaW5nLFN0cmluZyxNZXRob2RWaXNpdG9yLE1hcCl9IGNvbnN0cnVjdG9yLgorICogVGhleSBhcmUgbm90IHBlcmZvcm1lZCBpZiBhbnkgb3RoZXIgY29uc3RydWN0b3IgaXMgdXNlZC4KKyAqCisgKiBAYXV0aG9yIEVyaWMgQnJ1bmV0b24KKyAqLworcHVibGljIGNsYXNzIENoZWNrTWV0aG9kQWRhcHRlciBleHRlbmRzIE1ldGhvZFZpc2l0b3IgeworCisgICAgLyoqCisgICAgICogVGhlIGNsYXNzIHZlcnNpb24gbnVtYmVyLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgdmVyc2lvbjsKKworICAgIC8qKgorICAgICAqIDx0dD50cnVlPC90dD4gaWYgdGhlIHZpc2l0Q29kZSBtZXRob2QgaGFzIGJlZW4gY2FsbGVkLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBzdGFydENvZGU7CisKKyAgICAvKioKKyAgICAgKiA8dHQ+dHJ1ZTwvdHQ+IGlmIHRoZSB2aXNpdE1heHMgbWV0aG9kIGhhcyBiZWVuIGNhbGxlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gZW5kQ29kZTsKKworICAgIC8qKgorICAgICAqIDx0dD50cnVlPC90dD4gaWYgdGhlIHZpc2l0RW5kIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGVuZE1ldGhvZDsKKworICAgIC8qKgorICAgICAqIE51bWJlciBvZiB2aXNpdGVkIGluc3RydWN0aW9ucy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBpbnNuQ291bnQ7CisKKyAgICAvKioKKyAgICAgKiBUaGUgYWxyZWFkeSB2aXNpdGVkIGxhYmVscy4gVGhpcyBtYXAgYXNzb2NpYXRlIEludGVnZXIgdmFsdWVzIHRvIHBzZXVkbworICAgICAqIGNvZGUgb2Zmc2V0cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIE1hcDxMYWJlbCwgSW50ZWdlcj4gbGFiZWxzOworCisgICAgLyoqCisgICAgICogVGhlIGxhYmVscyB1c2VkIGluIHRoaXMgbWV0aG9kLiBFdmVyeSB1c2VkIGxhYmVsIG11c3QgYmUgdmlzaXRlZCB3aXRoCisgICAgICogdmlzaXRMYWJlbCBiZWZvcmUgdGhlIGVuZCBvZiB0aGUgbWV0aG9kIChpLmUuIHNob3VsZCBiZSBpbiAjbGFiZWxzKS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFNldDxMYWJlbD4gdXNlZExhYmVsczsKKworICAgIC8qKgorICAgICAqIFRoZSBleGNlcHRpb24gaGFuZGxlciByYW5nZXMuIEVhY2ggcGFpciBvZiBsaXN0IGVsZW1lbnQgY29udGFpbnMgdGhlCisgICAgICogc3RhcnQgYW5kIGVuZCBsYWJlbHMgb2YgYW4gZXhjZXB0aW9uIGhhbmRsZXIgYmxvY2suCisgICAgICovCisgICAgcHJpdmF0ZSBMaXN0PExhYmVsPiBoYW5kbGVyczsKKworICAgIC8qKgorICAgICAqIENvZGUgb2YgdGhlIHZpc2l0IG1ldGhvZCB0byBiZSB1c2VkIGZvciBlYWNoIG9wY29kZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBUWVBFOworCisgICAgLyoqCisgICAgICogVGhlIExhYmVsLnN0YXR1cyBmaWVsZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBGaWVsZCBsYWJlbFN0YXR1c0ZpZWxkOworCisgICAgc3RhdGljIHsKKyAgICAgICAgU3RyaW5nIHMgPSAiQkJCQkJCQkJCQkJCQkJCQkNDSUFBRERERERBQUFBQUFBQUFBQUFBQUFBQUFBQUJCQkJCQkJCREQiCisgICAgICAgICAgICAgICAgKyAiREREQUFBQUFBQUFBQUFBQUFBQUFBQUFCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCIgorICAgICAgICAgICAgICAgICsgIkJCQkJCQkJCQkJCQkJCQkJCQkJKQkJCQkJCQkJCQkJCQkJCQkJCQkJISEhISEhISEhISEhISEhIRCIKKyAgICAgICAgICAgICAgICArICJLTEJCQkJCQkZGRkZHR0dHQUVDRUJCRUVCQkFNSEhBQSI7CisgICAgICAgIFRZUEUgPSBuZXcgaW50W3MubGVuZ3RoKCldOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFRZUEUubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIFRZUEVbaV0gPSBzLmNoYXJBdChpKSAtICdBJyAtIDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBjb2RlIHRvIGdlbmVyYXRlIHRoZSBhYm92ZSBzdHJpbmcKKyAgICAvLyBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nW10gYXJncykgeworICAgIC8vIGludFtdIFRZUEUgPSBuZXcgaW50W10geworICAgIC8vIDAsIC8vTk9QCisgICAgLy8gMCwgLy9BQ09OU1RfTlVMTAorICAgIC8vIDAsIC8vSUNPTlNUX00xCisgICAgLy8gMCwgLy9JQ09OU1RfMAorICAgIC8vIDAsIC8vSUNPTlNUXzEKKyAgICAvLyAwLCAvL0lDT05TVF8yCisgICAgLy8gMCwgLy9JQ09OU1RfMworICAgIC8vIDAsIC8vSUNPTlNUXzQKKyAgICAvLyAwLCAvL0lDT05TVF81CisgICAgLy8gMCwgLy9MQ09OU1RfMAorICAgIC8vIDAsIC8vTENPTlNUXzEKKyAgICAvLyAwLCAvL0ZDT05TVF8wCisgICAgLy8gMCwgLy9GQ09OU1RfMQorICAgIC8vIDAsIC8vRkNPTlNUXzIKKyAgICAvLyAwLCAvL0RDT05TVF8wCisgICAgLy8gMCwgLy9EQ09OU1RfMQorICAgIC8vIDEsIC8vQklQVVNICisgICAgLy8gMSwgLy9TSVBVU0gKKyAgICAvLyA3LCAvL0xEQworICAgIC8vIC0xLCAvL0xEQ19XCisgICAgLy8gLTEsIC8vTERDMl9XCisgICAgLy8gMiwgLy9JTE9BRAorICAgIC8vIDIsIC8vTExPQUQKKyAgICAvLyAyLCAvL0ZMT0FECisgICAgLy8gMiwgLy9ETE9BRAorICAgIC8vIDIsIC8vQUxPQUQKKyAgICAvLyAtMSwgLy9JTE9BRF8wCisgICAgLy8gLTEsIC8vSUxPQURfMQorICAgIC8vIC0xLCAvL0lMT0FEXzIKKyAgICAvLyAtMSwgLy9JTE9BRF8zCisgICAgLy8gLTEsIC8vTExPQURfMAorICAgIC8vIC0xLCAvL0xMT0FEXzEKKyAgICAvLyAtMSwgLy9MTE9BRF8yCisgICAgLy8gLTEsIC8vTExPQURfMworICAgIC8vIC0xLCAvL0ZMT0FEXzAKKyAgICAvLyAtMSwgLy9GTE9BRF8xCisgICAgLy8gLTEsIC8vRkxPQURfMgorICAgIC8vIC0xLCAvL0ZMT0FEXzMKKyAgICAvLyAtMSwgLy9ETE9BRF8wCisgICAgLy8gLTEsIC8vRExPQURfMQorICAgIC8vIC0xLCAvL0RMT0FEXzIKKyAgICAvLyAtMSwgLy9ETE9BRF8zCisgICAgLy8gLTEsIC8vQUxPQURfMAorICAgIC8vIC0xLCAvL0FMT0FEXzEKKyAgICAvLyAtMSwgLy9BTE9BRF8yCisgICAgLy8gLTEsIC8vQUxPQURfMworICAgIC8vIDAsIC8vSUFMT0FECisgICAgLy8gMCwgLy9MQUxPQUQKKyAgICAvLyAwLCAvL0ZBTE9BRAorICAgIC8vIDAsIC8vREFMT0FECisgICAgLy8gMCwgLy9BQUxPQUQKKyAgICAvLyAwLCAvL0JBTE9BRAorICAgIC8vIDAsIC8vQ0FMT0FECisgICAgLy8gMCwgLy9TQUxPQUQKKyAgICAvLyAyLCAvL0lTVE9SRQorICAgIC8vIDIsIC8vTFNUT1JFCisgICAgLy8gMiwgLy9GU1RPUkUKKyAgICAvLyAyLCAvL0RTVE9SRQorICAgIC8vIDIsIC8vQVNUT1JFCisgICAgLy8gLTEsIC8vSVNUT1JFXzAKKyAgICAvLyAtMSwgLy9JU1RPUkVfMQorICAgIC8vIC0xLCAvL0lTVE9SRV8yCisgICAgLy8gLTEsIC8vSVNUT1JFXzMKKyAgICAvLyAtMSwgLy9MU1RPUkVfMAorICAgIC8vIC0xLCAvL0xTVE9SRV8xCisgICAgLy8gLTEsIC8vTFNUT1JFXzIKKyAgICAvLyAtMSwgLy9MU1RPUkVfMworICAgIC8vIC0xLCAvL0ZTVE9SRV8wCisgICAgLy8gLTEsIC8vRlNUT1JFXzEKKyAgICAvLyAtMSwgLy9GU1RPUkVfMgorICAgIC8vIC0xLCAvL0ZTVE9SRV8zCisgICAgLy8gLTEsIC8vRFNUT1JFXzAKKyAgICAvLyAtMSwgLy9EU1RPUkVfMQorICAgIC8vIC0xLCAvL0RTVE9SRV8yCisgICAgLy8gLTEsIC8vRFNUT1JFXzMKKyAgICAvLyAtMSwgLy9BU1RPUkVfMAorICAgIC8vIC0xLCAvL0FTVE9SRV8xCisgICAgLy8gLTEsIC8vQVNUT1JFXzIKKyAgICAvLyAtMSwgLy9BU1RPUkVfMworICAgIC8vIDAsIC8vSUFTVE9SRQorICAgIC8vIDAsIC8vTEFTVE9SRQorICAgIC8vIDAsIC8vRkFTVE9SRQorICAgIC8vIDAsIC8vREFTVE9SRQorICAgIC8vIDAsIC8vQUFTVE9SRQorICAgIC8vIDAsIC8vQkFTVE9SRQorICAgIC8vIDAsIC8vQ0FTVE9SRQorICAgIC8vIDAsIC8vU0FTVE9SRQorICAgIC8vIDAsIC8vUE9QCisgICAgLy8gMCwgLy9QT1AyCisgICAgLy8gMCwgLy9EVVAKKyAgICAvLyAwLCAvL0RVUF9YMQorICAgIC8vIDAsIC8vRFVQX1gyCisgICAgLy8gMCwgLy9EVVAyCisgICAgLy8gMCwgLy9EVVAyX1gxCisgICAgLy8gMCwgLy9EVVAyX1gyCisgICAgLy8gMCwgLy9TV0FQCisgICAgLy8gMCwgLy9JQURECisgICAgLy8gMCwgLy9MQURECisgICAgLy8gMCwgLy9GQURECisgICAgLy8gMCwgLy9EQURECisgICAgLy8gMCwgLy9JU1VCCisgICAgLy8gMCwgLy9MU1VCCisgICAgLy8gMCwgLy9GU1VCCisgICAgLy8gMCwgLy9EU1VCCisgICAgLy8gMCwgLy9JTVVMCisgICAgLy8gMCwgLy9MTVVMCisgICAgLy8gMCwgLy9GTVVMCisgICAgLy8gMCwgLy9ETVVMCisgICAgLy8gMCwgLy9JRElWCisgICAgLy8gMCwgLy9MRElWCisgICAgLy8gMCwgLy9GRElWCisgICAgLy8gMCwgLy9ERElWCisgICAgLy8gMCwgLy9JUkVNCisgICAgLy8gMCwgLy9MUkVNCisgICAgLy8gMCwgLy9GUkVNCisgICAgLy8gMCwgLy9EUkVNCisgICAgLy8gMCwgLy9JTkVHCisgICAgLy8gMCwgLy9MTkVHCisgICAgLy8gMCwgLy9GTkVHCisgICAgLy8gMCwgLy9ETkVHCisgICAgLy8gMCwgLy9JU0hMCisgICAgLy8gMCwgLy9MU0hMCisgICAgLy8gMCwgLy9JU0hSCisgICAgLy8gMCwgLy9MU0hSCisgICAgLy8gMCwgLy9JVVNIUgorICAgIC8vIDAsIC8vTFVTSFIKKyAgICAvLyAwLCAvL0lBTkQKKyAgICAvLyAwLCAvL0xBTkQKKyAgICAvLyAwLCAvL0lPUgorICAgIC8vIDAsIC8vTE9SCisgICAgLy8gMCwgLy9JWE9SCisgICAgLy8gMCwgLy9MWE9SCisgICAgLy8gOCwgLy9JSU5DCisgICAgLy8gMCwgLy9JMkwKKyAgICAvLyAwLCAvL0kyRgorICAgIC8vIDAsIC8vSTJECisgICAgLy8gMCwgLy9MMkkKKyAgICAvLyAwLCAvL0wyRgorICAgIC8vIDAsIC8vTDJECisgICAgLy8gMCwgLy9GMkkKKyAgICAvLyAwLCAvL0YyTAorICAgIC8vIDAsIC8vRjJECisgICAgLy8gMCwgLy9EMkkKKyAgICAvLyAwLCAvL0QyTAorICAgIC8vIDAsIC8vRDJGCisgICAgLy8gMCwgLy9JMkIKKyAgICAvLyAwLCAvL0kyQworICAgIC8vIDAsIC8vSTJTCisgICAgLy8gMCwgLy9MQ01QCisgICAgLy8gMCwgLy9GQ01QTAorICAgIC8vIDAsIC8vRkNNUEcKKyAgICAvLyAwLCAvL0RDTVBMCisgICAgLy8gMCwgLy9EQ01QRworICAgIC8vIDYsIC8vSUZFUQorICAgIC8vIDYsIC8vSUZORQorICAgIC8vIDYsIC8vSUZMVAorICAgIC8vIDYsIC8vSUZHRQorICAgIC8vIDYsIC8vSUZHVAorICAgIC8vIDYsIC8vSUZMRQorICAgIC8vIDYsIC8vSUZfSUNNUEVRCisgICAgLy8gNiwgLy9JRl9JQ01QTkUKKyAgICAvLyA2LCAvL0lGX0lDTVBMVAorICAgIC8vIDYsIC8vSUZfSUNNUEdFCisgICAgLy8gNiwgLy9JRl9JQ01QR1QKKyAgICAvLyA2LCAvL0lGX0lDTVBMRQorICAgIC8vIDYsIC8vSUZfQUNNUEVRCisgICAgLy8gNiwgLy9JRl9BQ01QTkUKKyAgICAvLyA2LCAvL0dPVE8KKyAgICAvLyA2LCAvL0pTUgorICAgIC8vIDIsIC8vUkVUCisgICAgLy8gOSwgLy9UQUJMRVNXSVRDSAorICAgIC8vIDEwLCAvL0xPT0tVUFNXSVRDSAorICAgIC8vIDAsIC8vSVJFVFVSTgorICAgIC8vIDAsIC8vTFJFVFVSTgorICAgIC8vIDAsIC8vRlJFVFVSTgorICAgIC8vIDAsIC8vRFJFVFVSTgorICAgIC8vIDAsIC8vQVJFVFVSTgorICAgIC8vIDAsIC8vUkVUVVJOCisgICAgLy8gNCwgLy9HRVRTVEFUSUMKKyAgICAvLyA0LCAvL1BVVFNUQVRJQworICAgIC8vIDQsIC8vR0VURklFTEQKKyAgICAvLyA0LCAvL1BVVEZJRUxECisgICAgLy8gNSwgLy9JTlZPS0VWSVJUVUFMCisgICAgLy8gNSwgLy9JTlZPS0VTUEVDSUFMCisgICAgLy8gNSwgLy9JTlZPS0VTVEFUSUMKKyAgICAvLyA1LCAvL0lOVk9LRUlOVEVSRkFDRQorICAgIC8vIC0xLCAvL0lOVk9LRURZTkFNSUMKKyAgICAvLyAzLCAvL05FVworICAgIC8vIDEsIC8vTkVXQVJSQVkKKyAgICAvLyAzLCAvL0FORVdBUlJBWQorICAgIC8vIDAsIC8vQVJSQVlMRU5HVEgKKyAgICAvLyAwLCAvL0FUSFJPVworICAgIC8vIDMsIC8vQ0hFQ0tDQVNUCisgICAgLy8gMywgLy9JTlNUQU5DRU9GCisgICAgLy8gMCwgLy9NT05JVE9SRU5URVIKKyAgICAvLyAwLCAvL01PTklUT1JFWElUCisgICAgLy8gLTEsIC8vV0lERQorICAgIC8vIDExLCAvL01VTFRJQU5FV0FSUkFZCisgICAgLy8gNiwgLy9JRk5VTEwKKyAgICAvLyA2LCAvL0lGTk9OTlVMTAorICAgIC8vIC0xLCAvL0dPVE9fVworICAgIC8vIC0xIC8vSlNSX1cKKyAgICAvLyB9OworICAgIC8vIGZvciAoaW50IGkgPSAwOyBpIDwgVFlQRS5sZW5ndGg7ICsraSkgeworICAgIC8vIFN5c3RlbS5vdXQucHJpbnQoKGNoYXIpKFRZUEVbaV0gKyAxICsgJ0EnKSk7CisgICAgLy8gfQorICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigpOworICAgIC8vIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0BsaW5rIENoZWNrTWV0aG9kQWRhcHRlcn0gb2JqZWN0LiBUaGlzIG1ldGhvZCBhZGFwdGVyCisgICAgICogd2lsbCBub3QgcGVyZm9ybSBhbnkgZGF0YSBmbG93IGNoZWNrIChzZWUKKyAgICAgKiB7QGxpbmsgI0NoZWNrTWV0aG9kQWRhcHRlcihpbnQsU3RyaW5nLFN0cmluZyxNZXRob2RWaXNpdG9yLE1hcCl9KS4KKyAgICAgKiA8aT5TdWJjbGFzc2VzIG11c3Qgbm90IHVzZSB0aGlzIGNvbnN0cnVjdG9yPC9pPi4gSW5zdGVhZCwgdGhleSBtdXN0IHVzZQorICAgICAqIHRoZSB7QGxpbmsgI0NoZWNrTWV0aG9kQWRhcHRlcihpbnQsIE1ldGhvZFZpc2l0b3IsIE1hcCl9IHZlcnNpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbXYgdGhlIG1ldGhvZCB2aXNpdG9yIHRvIHdoaWNoIHRoaXMgYWRhcHRlciBtdXN0IGRlbGVnYXRlIGNhbGxzLgorICAgICAqLworICAgIHB1YmxpYyBDaGVja01ldGhvZEFkYXB0ZXIoZmluYWwgTWV0aG9kVmlzaXRvciBtdikgeworICAgICAgICB0aGlzKG12LCBuZXcgSGFzaE1hcDxMYWJlbCwgSW50ZWdlcj4oKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGxpbmsgQ2hlY2tNZXRob2RBZGFwdGVyfSBvYmplY3QuIFRoaXMgbWV0aG9kIGFkYXB0ZXIKKyAgICAgKiB3aWxsIG5vdCBwZXJmb3JtIGFueSBkYXRhIGZsb3cgY2hlY2sgKHNlZQorICAgICAqIHtAbGluayAjQ2hlY2tNZXRob2RBZGFwdGVyKGludCxTdHJpbmcsU3RyaW5nLE1ldGhvZFZpc2l0b3IsTWFwKX0pLgorICAgICAqIDxpPlN1YmNsYXNzZXMgbXVzdCBub3QgdXNlIHRoaXMgY29uc3RydWN0b3I8L2k+LiBJbnN0ZWFkLCB0aGV5IG11c3QgdXNlCisgICAgICogdGhlIHtAbGluayAjQ2hlY2tNZXRob2RBZGFwdGVyKGludCwgTWV0aG9kVmlzaXRvciwgTWFwKX0gdmVyc2lvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtdiB0aGUgbWV0aG9kIHZpc2l0b3IgdG8gd2hpY2ggdGhpcyBhZGFwdGVyIG11c3QgZGVsZWdhdGUgY2FsbHMuCisgICAgICogQHBhcmFtIGxhYmVscyBhIG1hcCBvZiBhbHJlYWR5IHZpc2l0ZWQgbGFiZWxzIChpbiBvdGhlciBtZXRob2RzKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2hlY2tNZXRob2RBZGFwdGVyKAorICAgICAgICBmaW5hbCBNZXRob2RWaXNpdG9yIG12LAorICAgICAgICBmaW5hbCBNYXA8TGFiZWwsIEludGVnZXI+IGxhYmVscykKKyAgICB7CisgICAgICAgIHRoaXMoT3Bjb2Rlcy5BU000LCBtdiwgbGFiZWxzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAbGluayBDaGVja01ldGhvZEFkYXB0ZXJ9IG9iamVjdC4gVGhpcyBtZXRob2QgYWRhcHRlcgorICAgICAqIHdpbGwgbm90IHBlcmZvcm0gYW55IGRhdGEgZmxvdyBjaGVjayAoc2VlCisgICAgICoge0BsaW5rICNDaGVja01ldGhvZEFkYXB0ZXIoaW50LFN0cmluZyxTdHJpbmcsTWV0aG9kVmlzaXRvcixNYXApfSkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbXYgdGhlIG1ldGhvZCB2aXNpdG9yIHRvIHdoaWNoIHRoaXMgYWRhcHRlciBtdXN0IGRlbGVnYXRlIGNhbGxzLgorICAgICAqIEBwYXJhbSBsYWJlbHMgYSBtYXAgb2YgYWxyZWFkeSB2aXNpdGVkIGxhYmVscyAoaW4gb3RoZXIgbWV0aG9kcykuCisgICAgICovCisgICAgcHJvdGVjdGVkIENoZWNrTWV0aG9kQWRhcHRlcigKKyAgICAgICAgZmluYWwgaW50IGFwaSwKKyAgICAgICAgZmluYWwgTWV0aG9kVmlzaXRvciBtdiwKKyAgICAgICAgZmluYWwgTWFwPExhYmVsLCBJbnRlZ2VyPiBsYWJlbHMpCisgICAgeworICAgICAgICBzdXBlcihhcGksIG12KTsKKyAgICAgICAgdGhpcy5sYWJlbHMgPSBsYWJlbHM7CisgICAgICAgIHRoaXMudXNlZExhYmVscyA9IG5ldyBIYXNoU2V0PExhYmVsPigpOworICAgICAgICB0aGlzLmhhbmRsZXJzID0gbmV3IEFycmF5TGlzdDxMYWJlbD4oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAbGluayBDaGVja01ldGhvZEFkYXB0ZXJ9IG9iamVjdC4gVGhpcyBtZXRob2QgYWRhcHRlcgorICAgICAqIHdpbGwgcGVyZm9ybSBiYXNpYyBkYXRhIGZsb3cgY2hlY2tzLiBGb3IgaW5zdGFuY2UgaW4gYSBtZXRob2Qgd2hvc2UKKyAgICAgKiBzaWduYXR1cmUgaXMgPHR0PnZvaWQgbSAoKTwvdHQ+LCB0aGUgaW52YWxpZCBpbnN0cnVjdGlvbiBJUkVUVVJOLCBvciB0aGUKKyAgICAgKiBpbnZhbGlkIHNlcXVlbmNlIElBREQgTDJJIHdpbGwgYmUgZGV0ZWN0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWNjZXNzIHRoZSBtZXRob2QncyBhY2Nlc3MgZmxhZ3MuCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG1ldGhvZCdzIG5hbWUuCisgICAgICogQHBhcmFtIGRlc2MgdGhlIG1ldGhvZCdzIGRlc2NyaXB0b3IgKHNlZSB7QGxpbmsgVHlwZSBUeXBlfSkuCisgICAgICogQHBhcmFtIGNtdiB0aGUgbWV0aG9kIHZpc2l0b3IgdG8gd2hpY2ggdGhpcyBhZGFwdGVyIG11c3QgZGVsZWdhdGUgY2FsbHMuCisgICAgICogQHBhcmFtIGxhYmVscyBhIG1hcCBvZiBhbHJlYWR5IHZpc2l0ZWQgbGFiZWxzIChpbiBvdGhlciBtZXRob2RzKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2hlY2tNZXRob2RBZGFwdGVyKAorICAgICAgICBmaW5hbCBpbnQgYWNjZXNzLAorICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSwKKyAgICAgICAgZmluYWwgU3RyaW5nIGRlc2MsCisgICAgICAgIGZpbmFsIE1ldGhvZFZpc2l0b3IgY212LAorICAgICAgICBmaW5hbCBNYXA8TGFiZWwsIEludGVnZXI+IGxhYmVscykKKyAgICB7CisgICAgICAgIHRoaXMobmV3IE1ldGhvZE5vZGUoYWNjZXNzLCBuYW1lLCBkZXNjLCBudWxsLCBudWxsKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0RW5kKCkgeworICAgICAgICAgICAgICAgIEFuYWx5emVyPEJhc2ljVmFsdWU+IGEgPSBuZXcgQW5hbHl6ZXI8QmFzaWNWYWx1ZT4obmV3IEJhc2ljVmVyaWZpZXIoKSk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgYS5hbmFseXplKCJkdW1teSIsIHRoaXMpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG1heExvY2FscyA9PSAwICYmIG1heFN0YWNrID09IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJEYXRhIGZsb3cgY2hlY2tpbmcgb3B0aW9uIHJlcXVpcmVzIHZhbGlkLCBub24gemVybyBtYXhMb2NhbHMgYW5kIG1heFN0YWNrIHZhbHVlcy4iKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgICAgICAgICAgICAgIFByaW50V3JpdGVyIHB3ID0gbmV3IFByaW50V3JpdGVyKHN3LCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgQ2hlY2tDbGFzc0FkYXB0ZXIucHJpbnRBbmFseXplclJlc3VsdCh0aGlzLCBhLCBwdyk7CisgICAgICAgICAgICAgICAgICAgIHB3LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpICsgJyAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzdy50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYWNjZXB0KGNtdik7CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICAgICAgICAgbGFiZWxzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQW5ub3RhdGlvblZpc2l0b3IgdmlzaXRBbm5vdGF0aW9uKAorICAgICAgICBmaW5hbCBTdHJpbmcgZGVzYywKKyAgICAgICAgZmluYWwgYm9vbGVhbiB2aXNpYmxlKQorICAgIHsKKyAgICAgICAgY2hlY2tFbmRNZXRob2QoKTsKKyAgICAgICAgY2hlY2tEZXNjKGRlc2MsIGZhbHNlKTsKKyAgICAgICAgcmV0dXJuIG5ldyBDaGVja0Fubm90YXRpb25BZGFwdGVyKHN1cGVyLnZpc2l0QW5ub3RhdGlvbihkZXNjLCB2aXNpYmxlKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEFubm90YXRpb25WaXNpdG9yIHZpc2l0QW5ub3RhdGlvbkRlZmF1bHQoKSB7CisgICAgICAgIGNoZWNrRW5kTWV0aG9kKCk7CisgICAgICAgIHJldHVybiBuZXcgQ2hlY2tBbm5vdGF0aW9uQWRhcHRlcihzdXBlci52aXNpdEFubm90YXRpb25EZWZhdWx0KCksIGZhbHNlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQW5ub3RhdGlvblZpc2l0b3IgdmlzaXRQYXJhbWV0ZXJBbm5vdGF0aW9uKAorICAgICAgICBmaW5hbCBpbnQgcGFyYW1ldGVyLAorICAgICAgICBmaW5hbCBTdHJpbmcgZGVzYywKKyAgICAgICAgZmluYWwgYm9vbGVhbiB2aXNpYmxlKQorICAgIHsKKyAgICAgICAgY2hlY2tFbmRNZXRob2QoKTsKKyAgICAgICAgY2hlY2tEZXNjKGRlc2MsIGZhbHNlKTsKKyAgICAgICAgcmV0dXJuIG5ldyBDaGVja0Fubm90YXRpb25BZGFwdGVyKHN1cGVyLnZpc2l0UGFyYW1ldGVyQW5ub3RhdGlvbihwYXJhbWV0ZXIsCisgICAgICAgICAgICAgICAgZGVzYywKKyAgICAgICAgICAgICAgICB2aXNpYmxlKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRBdHRyaWJ1dGUoZmluYWwgQXR0cmlidXRlIGF0dHIpIHsKKyAgICAgICAgY2hlY2tFbmRNZXRob2QoKTsKKyAgICAgICAgaWYgKGF0dHIgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBhdHRyaWJ1dGUgKG11c3Qgbm90IGJlIG51bGwpIik7CisgICAgICAgIH0KKyAgICAgICAgc3VwZXIudmlzaXRBdHRyaWJ1dGUoYXR0cik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRDb2RlKCkgeworICAgICAgICBzdGFydENvZGUgPSB0cnVlOworICAgICAgICBzdXBlci52aXNpdENvZGUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEZyYW1lKAorICAgICAgICBmaW5hbCBpbnQgdHlwZSwKKyAgICAgICAgZmluYWwgaW50IG5Mb2NhbCwKKyAgICAgICAgZmluYWwgT2JqZWN0W10gbG9jYWwsCisgICAgICAgIGZpbmFsIGludCBuU3RhY2ssCisgICAgICAgIGZpbmFsIE9iamVjdFtdIHN0YWNrKQorICAgIHsKKyAgICAgICAgaW50IG1Mb2NhbDsKKyAgICAgICAgaW50IG1TdGFjazsKKyAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRl9ORVc6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRl9GVUxMOgorICAgICAgICAgICAgICAgIG1Mb2NhbCA9IEludGVnZXIuTUFYX1ZBTFVFOworICAgICAgICAgICAgICAgIG1TdGFjayA9IEludGVnZXIuTUFYX1ZBTFVFOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRl9TQU1FOgorICAgICAgICAgICAgICAgIG1Mb2NhbCA9IDA7CisgICAgICAgICAgICAgICAgbVN0YWNrID0gMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkZfU0FNRTE6CisgICAgICAgICAgICAgICAgbUxvY2FsID0gMDsKKyAgICAgICAgICAgICAgICBtU3RhY2sgPSAxOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRl9BUFBFTkQ6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRl9DSE9QOgorICAgICAgICAgICAgICAgIG1Mb2NhbCA9IDM7CisgICAgICAgICAgICAgICAgbVN0YWNrID0gMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIGZyYW1lIHR5cGUgIiArIHR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG5Mb2NhbCA+IG1Mb2NhbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBuTG9jYWw9IiArIG5Mb2NhbAorICAgICAgICAgICAgICAgICAgICArICIgZm9yIGZyYW1lIHR5cGUgIiArIHR5cGUpOworICAgICAgICB9CisgICAgICAgIGlmIChuU3RhY2sgPiBtU3RhY2spIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgblN0YWNrPSIgKyBuU3RhY2sKKyAgICAgICAgICAgICAgICAgICAgKyAiIGZvciBmcmFtZSB0eXBlICIgKyB0eXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0eXBlICE9IE9wY29kZXMuRl9DSE9QKSB7CisgICAgICAgICAgICBpZiAobkxvY2FsID4gMCAmJiAobG9jYWwgPT0gbnVsbCB8fCBsb2NhbC5sZW5ndGggPCBuTG9jYWwpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQXJyYXkgbG9jYWxbXSBpcyBzaG9ydGVyIHRoYW4gbkxvY2FsIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5Mb2NhbDsgKytpKSB7CisgICAgICAgICAgICAgICAgY2hlY2tGcmFtZVZhbHVlKGxvY2FsW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoblN0YWNrID4gMCAmJiAoc3RhY2sgPT0gbnVsbCB8fCBzdGFjay5sZW5ndGggPCBuU3RhY2spKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBcnJheSBzdGFja1tdIGlzIHNob3J0ZXIgdGhhbiBuU3RhY2siKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5TdGFjazsgKytpKSB7CisgICAgICAgICAgICBjaGVja0ZyYW1lVmFsdWUoc3RhY2tbaV0pOworICAgICAgICB9CisKKyAgICAgICAgc3VwZXIudmlzaXRGcmFtZSh0eXBlLCBuTG9jYWwsIGxvY2FsLCBuU3RhY2ssIHN0YWNrKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEluc24oZmluYWwgaW50IG9wY29kZSkgeworICAgICAgICBjaGVja1N0YXJ0Q29kZSgpOworICAgICAgICBjaGVja0VuZENvZGUoKTsKKyAgICAgICAgY2hlY2tPcGNvZGUob3Bjb2RlLCAwKTsKKyAgICAgICAgc3VwZXIudmlzaXRJbnNuKG9wY29kZSk7CisgICAgICAgICsraW5zbkNvdW50OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0SW50SW5zbihmaW5hbCBpbnQgb3Bjb2RlLCBmaW5hbCBpbnQgb3BlcmFuZCkgeworICAgICAgICBjaGVja1N0YXJ0Q29kZSgpOworICAgICAgICBjaGVja0VuZENvZGUoKTsKKyAgICAgICAgY2hlY2tPcGNvZGUob3Bjb2RlLCAxKTsKKyAgICAgICAgc3dpdGNoIChvcGNvZGUpIHsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5CSVBVU0g6CisgICAgICAgICAgICAgICAgY2hlY2tTaWduZWRCeXRlKG9wZXJhbmQsICJJbnZhbGlkIG9wZXJhbmQiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5TSVBVU0g6CisgICAgICAgICAgICAgICAgY2hlY2tTaWduZWRTaG9ydChvcGVyYW5kLCAiSW52YWxpZCBvcGVyYW5kIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAvLyBjYXNlIENvbnN0YW50cy5ORVdBUlJBWToKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaWYgKG9wZXJhbmQgPCBPcGNvZGVzLlRfQk9PTEVBTiB8fCBvcGVyYW5kID4gT3Bjb2Rlcy5UX0xPTkcpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBvcGVyYW5kIChtdXN0IGJlIGFuIGFycmF5IHR5cGUgY29kZSBUXy4uLik6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG9wZXJhbmQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzdXBlci52aXNpdEludEluc24ob3Bjb2RlLCBvcGVyYW5kKTsKKyAgICAgICAgKytpbnNuQ291bnQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRWYXJJbnNuKGZpbmFsIGludCBvcGNvZGUsIGZpbmFsIGludCB2YXIpIHsKKyAgICAgICAgY2hlY2tTdGFydENvZGUoKTsKKyAgICAgICAgY2hlY2tFbmRDb2RlKCk7CisgICAgICAgIGNoZWNrT3Bjb2RlKG9wY29kZSwgMik7CisgICAgICAgIGNoZWNrVW5zaWduZWRTaG9ydCh2YXIsICJJbnZhbGlkIHZhcmlhYmxlIGluZGV4Iik7CisgICAgICAgIHN1cGVyLnZpc2l0VmFySW5zbihvcGNvZGUsIHZhcik7CisgICAgICAgICsraW5zbkNvdW50OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0VHlwZUluc24oZmluYWwgaW50IG9wY29kZSwgZmluYWwgU3RyaW5nIHR5cGUpIHsKKyAgICAgICAgY2hlY2tTdGFydENvZGUoKTsKKyAgICAgICAgY2hlY2tFbmRDb2RlKCk7CisgICAgICAgIGNoZWNrT3Bjb2RlKG9wY29kZSwgMyk7CisgICAgICAgIGNoZWNrSW50ZXJuYWxOYW1lKHR5cGUsICJ0eXBlIik7CisgICAgICAgIGlmIChvcGNvZGUgPT0gT3Bjb2Rlcy5ORVcgJiYgdHlwZS5jaGFyQXQoMCkgPT0gJ1snKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJORVcgY2Fubm90IGJlIHVzZWQgdG8gY3JlYXRlIGFycmF5czogIgorICAgICAgICAgICAgICAgICAgICArIHR5cGUpOworICAgICAgICB9CisgICAgICAgIHN1cGVyLnZpc2l0VHlwZUluc24ob3Bjb2RlLCB0eXBlKTsKKyAgICAgICAgKytpbnNuQ291bnQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRGaWVsZEluc24oCisgICAgICAgIGZpbmFsIGludCBvcGNvZGUsCisgICAgICAgIGZpbmFsIFN0cmluZyBvd25lciwKKyAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUsCisgICAgICAgIGZpbmFsIFN0cmluZyBkZXNjKQorICAgIHsKKyAgICAgICAgY2hlY2tTdGFydENvZGUoKTsKKyAgICAgICAgY2hlY2tFbmRDb2RlKCk7CisgICAgICAgIGNoZWNrT3Bjb2RlKG9wY29kZSwgNCk7CisgICAgICAgIGNoZWNrSW50ZXJuYWxOYW1lKG93bmVyLCAib3duZXIiKTsKKyAgICAgICAgY2hlY2tVbnF1YWxpZmllZE5hbWUodmVyc2lvbiwgbmFtZSwgIm5hbWUiKTsKKyAgICAgICAgY2hlY2tEZXNjKGRlc2MsIGZhbHNlKTsKKyAgICAgICAgc3VwZXIudmlzaXRGaWVsZEluc24ob3Bjb2RlLCBvd25lciwgbmFtZSwgZGVzYyk7CisgICAgICAgICsraW5zbkNvdW50OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TWV0aG9kSW5zbigKKyAgICAgICAgZmluYWwgaW50IG9wY29kZSwKKyAgICAgICAgZmluYWwgU3RyaW5nIG93bmVyLAorICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSwKKyAgICAgICAgZmluYWwgU3RyaW5nIGRlc2MpCisgICAgeworICAgICAgICBjaGVja1N0YXJ0Q29kZSgpOworICAgICAgICBjaGVja0VuZENvZGUoKTsKKyAgICAgICAgY2hlY2tPcGNvZGUob3Bjb2RlLCA1KTsKKyAgICAgICAgY2hlY2tNZXRob2RJZGVudGlmaWVyKHZlcnNpb24sIG5hbWUsICJuYW1lIik7CisgICAgICAgIGNoZWNrSW50ZXJuYWxOYW1lKG93bmVyLCAib3duZXIiKTsKKyAgICAgICAgY2hlY2tNZXRob2REZXNjKGRlc2MpOworICAgICAgICBzdXBlci52aXNpdE1ldGhvZEluc24ob3Bjb2RlLCBvd25lciwgbmFtZSwgZGVzYyk7CisgICAgICAgICsraW5zbkNvdW50OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0SW52b2tlRHluYW1pY0luc24oCisgICAgICAgIFN0cmluZyBuYW1lLAorICAgICAgICBTdHJpbmcgZGVzYywKKyAgICAgICAgSGFuZGxlIGJzbSwKKyAgICAgICAgT2JqZWN0Li4uIGJzbUFyZ3MpCisgICAgeworICAgICAgICBjaGVja1N0YXJ0Q29kZSgpOworICAgICAgICBjaGVja0VuZENvZGUoKTsKKyAgICAgICAgY2hlY2tNZXRob2RJZGVudGlmaWVyKHZlcnNpb24sIG5hbWUsICJuYW1lIik7CisgICAgICAgIGNoZWNrTWV0aG9kRGVzYyhkZXNjKTsKKyAgICAgICAgaWYgKGJzbS5nZXRUYWcoKSAhPSBPcGNvZGVzLkhfSU5WT0tFU1RBVElDCisgICAgICAgICAgICAgICAgJiYgYnNtLmdldFRhZygpICE9IE9wY29kZXMuSF9ORVdJTlZPS0VTUEVDSUFMKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIGhhbmRsZSB0YWcgIgorICAgICAgICAgICAgICAgICAgICArIGJzbS5nZXRUYWcoKSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBic21BcmdzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBjaGVja0xEQ0NvbnN0YW50KGJzbUFyZ3NbaV0pOworICAgICAgICB9CisgICAgICAgIHN1cGVyLnZpc2l0SW52b2tlRHluYW1pY0luc24obmFtZSwgZGVzYywgYnNtLCBic21BcmdzKTsKKyAgICAgICAgKytpbnNuQ291bnQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRKdW1wSW5zbihmaW5hbCBpbnQgb3Bjb2RlLCBmaW5hbCBMYWJlbCBsYWJlbCkgeworICAgICAgICBjaGVja1N0YXJ0Q29kZSgpOworICAgICAgICBjaGVja0VuZENvZGUoKTsKKyAgICAgICAgY2hlY2tPcGNvZGUob3Bjb2RlLCA2KTsKKyAgICAgICAgY2hlY2tMYWJlbChsYWJlbCwgZmFsc2UsICJsYWJlbCIpOworICAgICAgICBjaGVja05vbkRlYnVnTGFiZWwobGFiZWwpOworICAgICAgICBzdXBlci52aXNpdEp1bXBJbnNuKG9wY29kZSwgbGFiZWwpOworICAgICAgICB1c2VkTGFiZWxzLmFkZChsYWJlbCk7CisgICAgICAgICsraW5zbkNvdW50OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TGFiZWwoZmluYWwgTGFiZWwgbGFiZWwpIHsKKyAgICAgICAgY2hlY2tTdGFydENvZGUoKTsKKyAgICAgICAgY2hlY2tFbmRDb2RlKCk7CisgICAgICAgIGNoZWNrTGFiZWwobGFiZWwsIGZhbHNlLCAibGFiZWwiKTsKKyAgICAgICAgaWYgKGxhYmVscy5nZXQobGFiZWwpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkFscmVhZHkgdmlzaXRlZCBsYWJlbCIpOworICAgICAgICB9CisgICAgICAgIGxhYmVscy5wdXQobGFiZWwsIG5ldyBJbnRlZ2VyKGluc25Db3VudCkpOworICAgICAgICBzdXBlci52aXNpdExhYmVsKGxhYmVsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdExkY0luc24oZmluYWwgT2JqZWN0IGNzdCkgeworICAgICAgICBjaGVja1N0YXJ0Q29kZSgpOworICAgICAgICBjaGVja0VuZENvZGUoKTsKKyAgICAgICAgY2hlY2tMRENDb25zdGFudChjc3QpOworICAgICAgICBzdXBlci52aXNpdExkY0luc24oY3N0KTsKKyAgICAgICAgKytpbnNuQ291bnQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRJaW5jSW5zbihmaW5hbCBpbnQgdmFyLCBmaW5hbCBpbnQgaW5jcmVtZW50KSB7CisgICAgICAgIGNoZWNrU3RhcnRDb2RlKCk7CisgICAgICAgIGNoZWNrRW5kQ29kZSgpOworICAgICAgICBjaGVja1Vuc2lnbmVkU2hvcnQodmFyLCAiSW52YWxpZCB2YXJpYWJsZSBpbmRleCIpOworICAgICAgICBjaGVja1NpZ25lZFNob3J0KGluY3JlbWVudCwgIkludmFsaWQgaW5jcmVtZW50Iik7CisgICAgICAgIHN1cGVyLnZpc2l0SWluY0luc24odmFyLCBpbmNyZW1lbnQpOworICAgICAgICArK2luc25Db3VudDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFRhYmxlU3dpdGNoSW5zbigKKyAgICAgICAgZmluYWwgaW50IG1pbiwKKyAgICAgICAgZmluYWwgaW50IG1heCwKKyAgICAgICAgZmluYWwgTGFiZWwgZGZsdCwKKyAgICAgICAgZmluYWwgTGFiZWwuLi4gbGFiZWxzKQorICAgIHsKKyAgICAgICAgY2hlY2tTdGFydENvZGUoKTsKKyAgICAgICAgY2hlY2tFbmRDb2RlKCk7CisgICAgICAgIGlmIChtYXggPCBtaW4pIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk1heCA9ICIgKyBtYXgKKyAgICAgICAgICAgICAgICAgICAgKyAiIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIG1pbiA9ICIgKyBtaW4pOworICAgICAgICB9CisgICAgICAgIGNoZWNrTGFiZWwoZGZsdCwgZmFsc2UsICJkZWZhdWx0IGxhYmVsIik7CisgICAgICAgIGNoZWNrTm9uRGVidWdMYWJlbChkZmx0KTsKKyAgICAgICAgaWYgKGxhYmVscyA9PSBudWxsIHx8IGxhYmVscy5sZW5ndGggIT0gbWF4IC0gbWluICsgMSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlcmUgbXVzdCBiZSBtYXggLSBtaW4gKyAxIGxhYmVscyIpOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGFiZWxzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBjaGVja0xhYmVsKGxhYmVsc1tpXSwgZmFsc2UsICJsYWJlbCBhdCBpbmRleCAiICsgaSk7CisgICAgICAgICAgICBjaGVja05vbkRlYnVnTGFiZWwobGFiZWxzW2ldKTsKKyAgICAgICAgfQorICAgICAgICBzdXBlci52aXNpdFRhYmxlU3dpdGNoSW5zbihtaW4sIG1heCwgZGZsdCwgbGFiZWxzKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsYWJlbHMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIHVzZWRMYWJlbHMuYWRkKGxhYmVsc1tpXSk7CisgICAgICAgIH0KKyAgICAgICAgKytpbnNuQ291bnQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRMb29rdXBTd2l0Y2hJbnNuKAorICAgICAgICBmaW5hbCBMYWJlbCBkZmx0LAorICAgICAgICBmaW5hbCBpbnRbXSBrZXlzLAorICAgICAgICBmaW5hbCBMYWJlbFtdIGxhYmVscykKKyAgICB7CisgICAgICAgIGNoZWNrRW5kQ29kZSgpOworICAgICAgICBjaGVja1N0YXJ0Q29kZSgpOworICAgICAgICBjaGVja0xhYmVsKGRmbHQsIGZhbHNlLCAiZGVmYXVsdCBsYWJlbCIpOworICAgICAgICBjaGVja05vbkRlYnVnTGFiZWwoZGZsdCk7CisgICAgICAgIGlmIChrZXlzID09IG51bGwgfHwgbGFiZWxzID09IG51bGwgfHwga2V5cy5sZW5ndGggIT0gbGFiZWxzLmxlbmd0aCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlcmUgbXVzdCBiZSB0aGUgc2FtZSBudW1iZXIgb2Yga2V5cyBhbmQgbGFiZWxzIik7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsYWJlbHMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIGNoZWNrTGFiZWwobGFiZWxzW2ldLCBmYWxzZSwgImxhYmVsIGF0IGluZGV4ICIgKyBpKTsKKyAgICAgICAgICAgIGNoZWNrTm9uRGVidWdMYWJlbChsYWJlbHNbaV0pOworICAgICAgICB9CisgICAgICAgIHN1cGVyLnZpc2l0TG9va3VwU3dpdGNoSW5zbihkZmx0LCBrZXlzLCBsYWJlbHMpOworICAgICAgICB1c2VkTGFiZWxzLmFkZChkZmx0KTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsYWJlbHMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIHVzZWRMYWJlbHMuYWRkKGxhYmVsc1tpXSk7CisgICAgICAgIH0KKyAgICAgICAgKytpbnNuQ291bnQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRNdWx0aUFOZXdBcnJheUluc24oZmluYWwgU3RyaW5nIGRlc2MsIGZpbmFsIGludCBkaW1zKSB7CisgICAgICAgIGNoZWNrU3RhcnRDb2RlKCk7CisgICAgICAgIGNoZWNrRW5kQ29kZSgpOworICAgICAgICBjaGVja0Rlc2MoZGVzYywgZmFsc2UpOworICAgICAgICBpZiAoZGVzYy5jaGFyQXQoMCkgIT0gJ1snKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIGRlc2NyaXB0b3IgKG11c3QgYmUgYW4gYXJyYXkgdHlwZSBkZXNjcmlwdG9yKTogIgorICAgICAgICAgICAgICAgICAgICArIGRlc2MpOworICAgICAgICB9CisgICAgICAgIGlmIChkaW1zIDwgMSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBkaW1lbnNpb25zIChtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwKTogIgorICAgICAgICAgICAgICAgICAgICArIGRpbXMpOworICAgICAgICB9CisgICAgICAgIGlmIChkaW1zID4gZGVzYy5sYXN0SW5kZXhPZignWycpICsgMSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBkaW1lbnNpb25zIChtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4gZGltcyhkZXNjKSk6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBkaW1zKTsKKyAgICAgICAgfQorICAgICAgICBzdXBlci52aXNpdE11bHRpQU5ld0FycmF5SW5zbihkZXNjLCBkaW1zKTsKKyAgICAgICAgKytpbnNuQ291bnQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRUcnlDYXRjaEJsb2NrKAorICAgICAgICBmaW5hbCBMYWJlbCBzdGFydCwKKyAgICAgICAgZmluYWwgTGFiZWwgZW5kLAorICAgICAgICBmaW5hbCBMYWJlbCBoYW5kbGVyLAorICAgICAgICBmaW5hbCBTdHJpbmcgdHlwZSkKKyAgICB7CisgICAgICAgIGNoZWNrU3RhcnRDb2RlKCk7CisgICAgICAgIGNoZWNrRW5kQ29kZSgpOworICAgICAgICBjaGVja0xhYmVsKHN0YXJ0LCBmYWxzZSwgInN0YXJ0IGxhYmVsIik7CisgICAgICAgIGNoZWNrTGFiZWwoZW5kLCBmYWxzZSwgImVuZCBsYWJlbCIpOworICAgICAgICBjaGVja0xhYmVsKGhhbmRsZXIsIGZhbHNlLCAiaGFuZGxlciBsYWJlbCIpOworICAgICAgICBjaGVja05vbkRlYnVnTGFiZWwoc3RhcnQpOworICAgICAgICBjaGVja05vbkRlYnVnTGFiZWwoZW5kKTsKKyAgICAgICAgY2hlY2tOb25EZWJ1Z0xhYmVsKGhhbmRsZXIpOworICAgICAgICBpZiAobGFiZWxzLmdldChzdGFydCkgIT0gbnVsbCB8fCBsYWJlbHMuZ2V0KGVuZCkgIT0gbnVsbAorICAgICAgICAgICAgICAgIHx8IGxhYmVscy5nZXQoaGFuZGxlcikgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVHJ5IGNhdGNoIGJsb2NrcyBtdXN0IGJlIHZpc2l0ZWQgYmVmb3JlIHRoZWlyIGxhYmVscyIpOworICAgICAgICB9CisgICAgICAgIGlmICh0eXBlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNoZWNrSW50ZXJuYWxOYW1lKHR5cGUsICJ0eXBlIik7CisgICAgICAgIH0KKyAgICAgICAgc3VwZXIudmlzaXRUcnlDYXRjaEJsb2NrKHN0YXJ0LCBlbmQsIGhhbmRsZXIsIHR5cGUpOworICAgICAgICBoYW5kbGVycy5hZGQoc3RhcnQpOworICAgICAgICBoYW5kbGVycy5hZGQoZW5kKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdExvY2FsVmFyaWFibGUoCisgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lLAorICAgICAgICBmaW5hbCBTdHJpbmcgZGVzYywKKyAgICAgICAgZmluYWwgU3RyaW5nIHNpZ25hdHVyZSwKKyAgICAgICAgZmluYWwgTGFiZWwgc3RhcnQsCisgICAgICAgIGZpbmFsIExhYmVsIGVuZCwKKyAgICAgICAgZmluYWwgaW50IGluZGV4KQorICAgIHsKKyAgICAgICAgY2hlY2tTdGFydENvZGUoKTsKKyAgICAgICAgY2hlY2tFbmRDb2RlKCk7CisgICAgICAgIGNoZWNrVW5xdWFsaWZpZWROYW1lKHZlcnNpb24sIG5hbWUsICJuYW1lIik7CisgICAgICAgIGNoZWNrRGVzYyhkZXNjLCBmYWxzZSk7CisgICAgICAgIGNoZWNrTGFiZWwoc3RhcnQsIHRydWUsICJzdGFydCBsYWJlbCIpOworICAgICAgICBjaGVja0xhYmVsKGVuZCwgdHJ1ZSwgImVuZCBsYWJlbCIpOworICAgICAgICBjaGVja1Vuc2lnbmVkU2hvcnQoaW5kZXgsICJJbnZhbGlkIHZhcmlhYmxlIGluZGV4Iik7CisgICAgICAgIGludCBzID0gbGFiZWxzLmdldChzdGFydCkuaW50VmFsdWUoKTsKKyAgICAgICAgaW50IGUgPSBsYWJlbHMuZ2V0KGVuZCkuaW50VmFsdWUoKTsKKyAgICAgICAgaWYgKGUgPCBzKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIHN0YXJ0IGFuZCBlbmQgbGFiZWxzIChlbmQgbXVzdCBiZSBncmVhdGVyIHRoYW4gc3RhcnQpIik7CisgICAgICAgIH0KKyAgICAgICAgc3VwZXIudmlzaXRMb2NhbFZhcmlhYmxlKG5hbWUsIGRlc2MsIHNpZ25hdHVyZSwgc3RhcnQsIGVuZCwgaW5kZXgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TGluZU51bWJlcihmaW5hbCBpbnQgbGluZSwgZmluYWwgTGFiZWwgc3RhcnQpIHsKKyAgICAgICAgY2hlY2tTdGFydENvZGUoKTsKKyAgICAgICAgY2hlY2tFbmRDb2RlKCk7CisgICAgICAgIGNoZWNrVW5zaWduZWRTaG9ydChsaW5lLCAiSW52YWxpZCBsaW5lIG51bWJlciIpOworICAgICAgICBjaGVja0xhYmVsKHN0YXJ0LCB0cnVlLCAic3RhcnQgbGFiZWwiKTsKKyAgICAgICAgc3VwZXIudmlzaXRMaW5lTnVtYmVyKGxpbmUsIHN0YXJ0KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdE1heHMoZmluYWwgaW50IG1heFN0YWNrLCBmaW5hbCBpbnQgbWF4TG9jYWxzKSB7CisgICAgICAgIGNoZWNrU3RhcnRDb2RlKCk7CisgICAgICAgIGNoZWNrRW5kQ29kZSgpOworICAgICAgICBlbmRDb2RlID0gdHJ1ZTsKKyAgICAgICAgZm9yIChMYWJlbCBsIDogdXNlZExhYmVscykgeworICAgICAgICAgICAgaWYgKGxhYmVscy5nZXQobCkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlVuZGVmaW5lZCBsYWJlbCB1c2VkIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoYW5kbGVycy5zaXplKCk7ICkgeworICAgICAgICAgICAgSW50ZWdlciBzdGFydCA9IGxhYmVscy5nZXQoaGFuZGxlcnMuZ2V0KGkrKykpOworICAgICAgICAgICAgSW50ZWdlciBlbmQgPSBsYWJlbHMuZ2V0KGhhbmRsZXJzLmdldChpKyspKTsKKyAgICAgICAgICAgIGlmIChzdGFydCA9PSBudWxsIHx8IGVuZCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVW5kZWZpbmVkIHRyeSBjYXRjaCBibG9jayBsYWJlbHMiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChlbmQuaW50VmFsdWUoKSA8PSBzdGFydC5pbnRWYWx1ZSgpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRW10eSB0cnkgY2F0Y2ggYmxvY2sgaGFuZGxlciByYW5nZSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNoZWNrVW5zaWduZWRTaG9ydChtYXhTdGFjaywgIkludmFsaWQgbWF4IHN0YWNrIik7CisgICAgICAgIGNoZWNrVW5zaWduZWRTaG9ydChtYXhMb2NhbHMsICJJbnZhbGlkIG1heCBsb2NhbHMiKTsKKyAgICAgICAgc3VwZXIudmlzaXRNYXhzKG1heFN0YWNrLCBtYXhMb2NhbHMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0RW5kKCkgeworICAgICAgICBjaGVja0VuZE1ldGhvZCgpOworICAgICAgICBlbmRNZXRob2QgPSB0cnVlOworICAgICAgICBzdXBlci52aXNpdEVuZCgpOworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8qKgorICAgICAqIENoZWNrcyB0aGF0IHRoZSB2aXNpdENvZGUgbWV0aG9kIGhhcyBiZWVuIGNhbGxlZC4KKyAgICAgKi8KKyAgICB2b2lkIGNoZWNrU3RhcnRDb2RlKCkgeworICAgICAgICBpZiAoIXN0YXJ0Q29kZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ2Fubm90IHZpc2l0IGluc3RydWN0aW9ucyBiZWZvcmUgdmlzaXRDb2RlIGhhcyBiZWVuIGNhbGxlZC4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrcyB0aGF0IHRoZSB2aXNpdE1heHMgbWV0aG9kIGhhcyBub3QgYmVlbiBjYWxsZWQuCisgICAgICovCisgICAgdm9pZCBjaGVja0VuZENvZGUoKSB7CisgICAgICAgIGlmIChlbmRDb2RlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDYW5ub3QgdmlzaXQgaW5zdHJ1Y3Rpb25zIGFmdGVyIHZpc2l0TWF4cyBoYXMgYmVlbiBjYWxsZWQuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgdGhhdCB0aGUgdmlzaXRFbmQgbWV0aG9kIGhhcyBub3QgYmVlbiBjYWxsZWQuCisgICAgICovCisgICAgdm9pZCBjaGVja0VuZE1ldGhvZCgpIHsKKyAgICAgICAgaWYgKGVuZE1ldGhvZCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ2Fubm90IHZpc2l0IGVsZW1lbnRzIGFmdGVyIHZpc2l0RW5kIGhhcyBiZWVuIGNhbGxlZC4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrcyBhIHN0YWNrIGZyYW1lIHZhbHVlLgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBiZSBjaGVja2VkLgorICAgICAqLworICAgIHZvaWQgY2hlY2tGcmFtZVZhbHVlKGZpbmFsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICBpZiAodmFsdWUgPT0gT3Bjb2Rlcy5UT1AgfHwgdmFsdWUgPT0gT3Bjb2Rlcy5JTlRFR0VSCisgICAgICAgICAgICAgICAgfHwgdmFsdWUgPT0gT3Bjb2Rlcy5GTE9BVCB8fCB2YWx1ZSA9PSBPcGNvZGVzLkxPTkcKKyAgICAgICAgICAgICAgICB8fCB2YWx1ZSA9PSBPcGNvZGVzLkRPVUJMRSB8fCB2YWx1ZSA9PSBPcGNvZGVzLk5VTEwKKyAgICAgICAgICAgICAgICB8fCB2YWx1ZSA9PSBPcGNvZGVzLlVOSU5JVElBTElaRURfVEhJUykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgeworICAgICAgICAgICAgY2hlY2tJbnRlcm5hbE5hbWUoKFN0cmluZykgdmFsdWUsICJJbnZhbGlkIHN0YWNrIGZyYW1lIHZhbHVlIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBMYWJlbCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgc3RhY2sgZnJhbWUgdmFsdWU6ICIKKyAgICAgICAgICAgICAgICAgICAgKyB2YWx1ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1c2VkTGFiZWxzLmFkZCgoTGFiZWwpIHZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrcyB0aGF0IHRoZSB0eXBlIG9mIHRoZSBnaXZlbiBvcGNvZGUgaXMgZXF1YWwgdG8gdGhlIGdpdmVuIHR5cGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3Bjb2RlIHRoZSBvcGNvZGUgdG8gYmUgY2hlY2tlZC4KKyAgICAgKiBAcGFyYW0gdHlwZSB0aGUgZXhwZWN0ZWQgb3Bjb2RlIHR5cGUuCisgICAgICovCisgICAgc3RhdGljIHZvaWQgY2hlY2tPcGNvZGUoZmluYWwgaW50IG9wY29kZSwgZmluYWwgaW50IHR5cGUpIHsKKyAgICAgICAgaWYgKG9wY29kZSA8IDAgfHwgb3Bjb2RlID4gMTk5IHx8IFRZUEVbb3Bjb2RlXSAhPSB0eXBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIG9wY29kZTogIiArIG9wY29kZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgdGhhdCB0aGUgZ2l2ZW4gdmFsdWUgaXMgYSBzaWduZWQgYnl0ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gYmUgY2hlY2tlZC4KKyAgICAgKiBAcGFyYW0gbXNnIGFuIG1lc3NhZ2UgdG8gYmUgdXNlZCBpbiBjYXNlIG9mIGVycm9yLgorICAgICAqLworICAgIHN0YXRpYyB2b2lkIGNoZWNrU2lnbmVkQnl0ZShmaW5hbCBpbnQgdmFsdWUsIGZpbmFsIFN0cmluZyBtc2cpIHsKKyAgICAgICAgaWYgKHZhbHVlIDwgQnl0ZS5NSU5fVkFMVUUgfHwgdmFsdWUgPiBCeXRlLk1BWF9WQUxVRSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihtc2cKKyAgICAgICAgICAgICAgICAgICAgKyAiIChtdXN0IGJlIGEgc2lnbmVkIGJ5dGUpOiAiICsgdmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIHRoYXQgdGhlIGdpdmVuIHZhbHVlIGlzIGEgc2lnbmVkIHNob3J0LgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBiZSBjaGVja2VkLgorICAgICAqIEBwYXJhbSBtc2cgYW4gbWVzc2FnZSB0byBiZSB1c2VkIGluIGNhc2Ugb2YgZXJyb3IuCisgICAgICovCisgICAgc3RhdGljIHZvaWQgY2hlY2tTaWduZWRTaG9ydChmaW5hbCBpbnQgdmFsdWUsIGZpbmFsIFN0cmluZyBtc2cpIHsKKyAgICAgICAgaWYgKHZhbHVlIDwgU2hvcnQuTUlOX1ZBTFVFIHx8IHZhbHVlID4gU2hvcnQuTUFYX1ZBTFVFKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKG1zZworICAgICAgICAgICAgICAgICAgICArICIgKG11c3QgYmUgYSBzaWduZWQgc2hvcnQpOiAiICsgdmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIHRoYXQgdGhlIGdpdmVuIHZhbHVlIGlzIGFuIHVuc2lnbmVkIHNob3J0LgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBiZSBjaGVja2VkLgorICAgICAqIEBwYXJhbSBtc2cgYW4gbWVzc2FnZSB0byBiZSB1c2VkIGluIGNhc2Ugb2YgZXJyb3IuCisgICAgICovCisgICAgc3RhdGljIHZvaWQgY2hlY2tVbnNpZ25lZFNob3J0KGZpbmFsIGludCB2YWx1ZSwgZmluYWwgU3RyaW5nIG1zZykgeworICAgICAgICBpZiAodmFsdWUgPCAwIHx8IHZhbHVlID4gNjU1MzUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24obXNnCisgICAgICAgICAgICAgICAgICAgICsgIiAobXVzdCBiZSBhbiB1bnNpZ25lZCBzaG9ydCk6ICIgKyB2YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgdGhhdCB0aGUgZ2l2ZW4gdmFsdWUgaXMgYW4ge0BsaW5rIEludGVnZXJ9LCBhe0BsaW5rIEZsb2F0fSwgYQorICAgICAqIHtAbGluayBMb25nfSwgYSB7QGxpbmsgRG91YmxlfSBvciBhIHtAbGluayBTdHJpbmd9LgorICAgICAqCisgICAgICogQHBhcmFtIGNzdCB0aGUgdmFsdWUgdG8gYmUgY2hlY2tlZC4KKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCBjaGVja0NvbnN0YW50KGZpbmFsIE9iamVjdCBjc3QpIHsKKyAgICAgICAgaWYgKCEoY3N0IGluc3RhbmNlb2YgSW50ZWdlcikgJiYgIShjc3QgaW5zdGFuY2VvZiBGbG9hdCkKKyAgICAgICAgICAgICAgICAmJiAhKGNzdCBpbnN0YW5jZW9mIExvbmcpICYmICEoY3N0IGluc3RhbmNlb2YgRG91YmxlKQorICAgICAgICAgICAgICAgICYmICEoY3N0IGluc3RhbmNlb2YgU3RyaW5nKSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBjb25zdGFudDogIiArIGNzdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIGNoZWNrTERDQ29uc3RhbnQoZmluYWwgT2JqZWN0IGNzdCkgeworICAgICAgICBpZiAoY3N0IGluc3RhbmNlb2YgVHlwZSkgeworICAgICAgICAgICAgaW50IHMgPSAoKFR5cGUpIGNzdCkuZ2V0U29ydCgpOworICAgICAgICAgICAgaWYgKHMgIT0gVHlwZS5PQkpFQ1QgJiYgcyAhPSBUeXBlLkFSUkFZICYmIHMgIT0gVHlwZS5NRVRIT0QpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbGxlZ2FsIExEQyBjb25zdGFudCB2YWx1ZSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHMgIT0gVHlwZS5NRVRIT0QgJiYgKHZlcnNpb24gJiAweEZGRkYpIDwgT3Bjb2Rlcy5WMV81KSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibGRjIG9mIGEgY29uc3RhbnQgY2xhc3MgcmVxdWlyZXMgYXQgbGVhc3QgdmVyc2lvbiAxLjUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzID09IFR5cGUuTUVUSE9EICYmICh2ZXJzaW9uICYgMHhGRkZGKSA8IE9wY29kZXMuVjFfNykgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImxkYyBvZiBhIG1ldGhvZCB0eXBlIHJlcXVpcmVzIGF0IGxlYXN0IHZlcnNpb24gMS43Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoY3N0IGluc3RhbmNlb2YgSGFuZGxlKSB7CisgICAgICAgICAgICBpZiAoKHZlcnNpb24gJiAweEZGRkYpIDwgT3Bjb2Rlcy5WMV83KSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibGRjIG9mIGEgaGFuZGxlIHJlcXVpcmVzIGF0IGxlYXN0IHZlcnNpb24gMS43Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgdGFnID0gKChIYW5kbGUpIGNzdCkuZ2V0VGFnKCk7CisgICAgICAgICAgICBpZiAodGFnIDwgT3Bjb2Rlcy5IX0dFVEZJRUxEIHx8IHRhZyA+IE9wY29kZXMuSF9JTlZPS0VJTlRFUkZBQ0UpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIGhhbmRsZSB0YWcgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyB0YWcpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2hlY2tDb25zdGFudChjc3QpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIHRoYXQgdGhlIGdpdmVuIHN0cmluZyBpcyBhIHZhbGlkIHVucXVhbGlmaWVkIG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmVyc2lvbiB0aGUgY2xhc3MgdmVyc2lvbi4KKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgc3RyaW5nIHRvIGJlIGNoZWNrZWQuCisgICAgICogQHBhcmFtIG1zZyBhIG1lc3NhZ2UgdG8gYmUgdXNlZCBpbiBjYXNlIG9mIGVycm9yLgorICAgICAqLworICAgIHN0YXRpYyB2b2lkIGNoZWNrVW5xdWFsaWZpZWROYW1lKAorICAgICAgICBpbnQgdmVyc2lvbiwKKyAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUsCisgICAgICAgIGZpbmFsIFN0cmluZyBtc2cpCisgICAgeworICAgICAgICBpZiAoKHZlcnNpb24gJiAweEZGRkYpIDwgT3Bjb2Rlcy5WMV81KSB7CisgICAgICAgICAgICBjaGVja0lkZW50aWZpZXIobmFtZSwgbXNnKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZS5sZW5ndGgoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgaWYgKCIuO1svIi5pbmRleE9mKG5hbWUuY2hhckF0KGkpKSAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkICIgKyBtc2cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgKG11c3QgYmUgYSB2YWxpZCB1bnF1YWxpZmllZCBuYW1lKTogIiArIG5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrcyB0aGF0IHRoZSBnaXZlbiBzdHJpbmcgaXMgYSB2YWxpZCBKYXZhIGlkZW50aWZpZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgc3RyaW5nIHRvIGJlIGNoZWNrZWQuCisgICAgICogQHBhcmFtIG1zZyBhIG1lc3NhZ2UgdG8gYmUgdXNlZCBpbiBjYXNlIG9mIGVycm9yLgorICAgICAqLworICAgIHN0YXRpYyB2b2lkIGNoZWNrSWRlbnRpZmllcihmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgU3RyaW5nIG1zZykgeworICAgICAgICBjaGVja0lkZW50aWZpZXIobmFtZSwgMCwgLTEsIG1zZyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIHRoYXQgdGhlIGdpdmVuIHN1YnN0cmluZyBpcyBhIHZhbGlkIEphdmEgaWRlbnRpZmllci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBzdHJpbmcgdG8gYmUgY2hlY2tlZC4KKyAgICAgKiBAcGFyYW0gc3RhcnQgaW5kZXggb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgaWRlbnRpZmllciAoaW5jbHVzaXZlKS4KKyAgICAgKiBAcGFyYW0gZW5kIGluZGV4IG9mIHRoZSBsYXN0IGNoYXJhY3RlciBvZiB0aGUgaWRlbnRpZmllciAoZXhjbHVzaXZlKS4gLTEKKyAgICAgKiAgICAgICAgaXMgZXF1aXZhbGVudCB0byA8dHQ+bmFtZS5sZW5ndGgoKTwvdHQ+IGlmIG5hbWUgaXMgbm90CisgICAgICogICAgICAgIDx0dD5udWxsPC90dD4uCisgICAgICogQHBhcmFtIG1zZyBhIG1lc3NhZ2UgdG8gYmUgdXNlZCBpbiBjYXNlIG9mIGVycm9yLgorICAgICAqLworICAgIHN0YXRpYyB2b2lkIGNoZWNrSWRlbnRpZmllcigKKyAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUsCisgICAgICAgIGZpbmFsIGludCBzdGFydCwKKyAgICAgICAgZmluYWwgaW50IGVuZCwKKyAgICAgICAgZmluYWwgU3RyaW5nIG1zZykKKyAgICB7CisgICAgICAgIGlmIChuYW1lID09IG51bGwgfHwgKGVuZCA9PSAtMSA/IG5hbWUubGVuZ3RoKCkgPD0gc3RhcnQgOiBlbmQgPD0gc3RhcnQpKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkICIgKyBtc2cKKyAgICAgICAgICAgICAgICAgICAgKyAiIChtdXN0IG5vdCBiZSBudWxsIG9yIGVtcHR5KSIpOworICAgICAgICB9CisgICAgICAgIGlmICghQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJTdGFydChuYW1lLmNoYXJBdChzdGFydCkpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkICIgKyBtc2cKKyAgICAgICAgICAgICAgICAgICAgKyAiIChtdXN0IGJlIGEgdmFsaWQgSmF2YSBpZGVudGlmaWVyKTogIiArIG5hbWUpOworICAgICAgICB9CisgICAgICAgIGludCBtYXggPSBlbmQgPT0gLTEgPyBuYW1lLmxlbmd0aCgpIDogZW5kOworICAgICAgICBmb3IgKGludCBpID0gc3RhcnQgKyAxOyBpIDwgbWF4OyArK2kpIHsKKyAgICAgICAgICAgIGlmICghQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KG5hbWUuY2hhckF0KGkpKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgIiArIG1zZworICAgICAgICAgICAgICAgICAgICAgICAgKyAiIChtdXN0IGJlIGEgdmFsaWQgSmF2YSBpZGVudGlmaWVyKTogIiArIG5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIHRoYXQgdGhlIGdpdmVuIHN0cmluZyBpcyBhIHZhbGlkIEphdmEgaWRlbnRpZmllciBvciBpcyBlcXVhbCB0bworICAgICAqICcmbHQ7aW5pdCZndDsnIG9yICcmbHQ7Y2xpbml0Jmd0OycuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmVyc2lvbiB0aGUgY2xhc3MgdmVyc2lvbi4KKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgc3RyaW5nIHRvIGJlIGNoZWNrZWQuCisgICAgICogQHBhcmFtIG1zZyBhIG1lc3NhZ2UgdG8gYmUgdXNlZCBpbiBjYXNlIG9mIGVycm9yLgorICAgICAqLworICAgIHN0YXRpYyB2b2lkIGNoZWNrTWV0aG9kSWRlbnRpZmllcigKKyAgICAgICAgaW50IHZlcnNpb24sCisgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lLAorICAgICAgICBmaW5hbCBTdHJpbmcgbXNnKQorICAgIHsKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCB8fCBuYW1lLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgIiArIG1zZworICAgICAgICAgICAgICAgICAgICArICIgKG11c3Qgbm90IGJlIG51bGwgb3IgZW1wdHkpIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCI8aW5pdD4iLmVxdWFscyhuYW1lKSB8fCAiPGNsaW5pdD4iLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICgodmVyc2lvbiAmIDB4RkZGRikgPj0gT3Bjb2Rlcy5WMV81KSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5hbWUubGVuZ3RoKCk7ICsraSkgeworICAgICAgICAgICAgICAgIGlmICgiLjtbLzw+Ii5pbmRleE9mKG5hbWUuY2hhckF0KGkpKSAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkICIgKyBtc2cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgKG11c3QgYmUgYSB2YWxpZCB1bnF1YWxpZmllZCBuYW1lKTogIiArIG5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIUNoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyU3RhcnQobmFtZS5jaGFyQXQoMCkpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkICIKKyAgICAgICAgICAgICAgICAgICAgKyBtc2cKKyAgICAgICAgICAgICAgICAgICAgKyAiIChtdXN0IGJlIGEgJzxpbml0PicsICc8Y2xpbml0Picgb3IgYSB2YWxpZCBKYXZhIGlkZW50aWZpZXIpOiAiCisgICAgICAgICAgICAgICAgICAgICsgbmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBuYW1lLmxlbmd0aCgpOyArK2kpIHsKKyAgICAgICAgICAgIGlmICghQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KG5hbWUuY2hhckF0KGkpKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBtc2cKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiAobXVzdCBiZSAnPGluaXQ+JyBvciAnPGNsaW5pdD4nIG9yIGEgdmFsaWQgSmF2YSBpZGVudGlmaWVyKTogIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrcyB0aGF0IHRoZSBnaXZlbiBzdHJpbmcgaXMgYSB2YWxpZCBpbnRlcm5hbCBjbGFzcyBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgdGhlIHN0cmluZyB0byBiZSBjaGVja2VkLgorICAgICAqIEBwYXJhbSBtc2cgYSBtZXNzYWdlIHRvIGJlIHVzZWQgaW4gY2FzZSBvZiBlcnJvci4KKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCBjaGVja0ludGVybmFsTmFtZShmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgU3RyaW5nIG1zZykgeworICAgICAgICBpZiAobmFtZSA9PSBudWxsIHx8IG5hbWUubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCAiICsgbXNnCisgICAgICAgICAgICAgICAgICAgICsgIiAobXVzdCBub3QgYmUgbnVsbCBvciBlbXB0eSkiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobmFtZS5jaGFyQXQoMCkgPT0gJ1snKSB7CisgICAgICAgICAgICBjaGVja0Rlc2MobmFtZSwgZmFsc2UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2hlY2tJbnRlcm5hbE5hbWUobmFtZSwgMCwgLTEsIG1zZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgdGhhdCB0aGUgZ2l2ZW4gc3Vic3RyaW5nIGlzIGEgdmFsaWQgaW50ZXJuYWwgY2xhc3MgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBzdHJpbmcgdG8gYmUgY2hlY2tlZC4KKyAgICAgKiBAcGFyYW0gc3RhcnQgaW5kZXggb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgaWRlbnRpZmllciAoaW5jbHVzaXZlKS4KKyAgICAgKiBAcGFyYW0gZW5kIGluZGV4IG9mIHRoZSBsYXN0IGNoYXJhY3RlciBvZiB0aGUgaWRlbnRpZmllciAoZXhjbHVzaXZlKS4gLTEKKyAgICAgKiAgICAgICAgaXMgZXF1aXZhbGVudCB0byA8dHQ+bmFtZS5sZW5ndGgoKTwvdHQ+IGlmIG5hbWUgaXMgbm90CisgICAgICogICAgICAgIDx0dD5udWxsPC90dD4uCisgICAgICogQHBhcmFtIG1zZyBhIG1lc3NhZ2UgdG8gYmUgdXNlZCBpbiBjYXNlIG9mIGVycm9yLgorICAgICAqLworICAgIHN0YXRpYyB2b2lkIGNoZWNrSW50ZXJuYWxOYW1lKAorICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSwKKyAgICAgICAgZmluYWwgaW50IHN0YXJ0LAorICAgICAgICBmaW5hbCBpbnQgZW5kLAorICAgICAgICBmaW5hbCBTdHJpbmcgbXNnKQorICAgIHsKKyAgICAgICAgaW50IG1heCA9IGVuZCA9PSAtMSA/IG5hbWUubGVuZ3RoKCkgOiBlbmQ7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgYmVnaW4gPSBzdGFydDsKKyAgICAgICAgICAgIGludCBzbGFzaDsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBzbGFzaCA9IG5hbWUuaW5kZXhPZignLycsIGJlZ2luICsgMSk7CisgICAgICAgICAgICAgICAgaWYgKHNsYXNoID09IC0xIHx8IHNsYXNoID4gbWF4KSB7CisgICAgICAgICAgICAgICAgICAgIHNsYXNoID0gbWF4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjaGVja0lkZW50aWZpZXIobmFtZSwgYmVnaW4sIHNsYXNoLCBudWxsKTsKKyAgICAgICAgICAgICAgICBiZWdpbiA9IHNsYXNoICsgMTsKKyAgICAgICAgICAgIH0gd2hpbGUgKHNsYXNoICE9IG1heCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBfKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkICIKKyAgICAgICAgICAgICAgICAgICAgKyBtc2cKKyAgICAgICAgICAgICAgICAgICAgKyAiIChtdXN0IGJlIGEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgaW4gaW50ZXJuYWwgZm9ybSk6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBuYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrcyB0aGF0IHRoZSBnaXZlbiBzdHJpbmcgaXMgYSB2YWxpZCB0eXBlIGRlc2NyaXB0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGVzYyB0aGUgc3RyaW5nIHRvIGJlIGNoZWNrZWQuCisgICAgICogQHBhcmFtIGNhbkJlVm9pZCA8dHQ+dHJ1ZTwvdHQ+IGlmIDx0dD5WPC90dD4gY2FuIGJlIGNvbnNpZGVyZWQgdmFsaWQuCisgICAgICovCisgICAgc3RhdGljIHZvaWQgY2hlY2tEZXNjKGZpbmFsIFN0cmluZyBkZXNjLCBmaW5hbCBib29sZWFuIGNhbkJlVm9pZCkgeworICAgICAgICBpbnQgZW5kID0gY2hlY2tEZXNjKGRlc2MsIDAsIGNhbkJlVm9pZCk7CisgICAgICAgIGlmIChlbmQgIT0gZGVzYy5sZW5ndGgoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBkZXNjcmlwdG9yOiAiICsgZGVzYyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgdGhhdCBhIHRoZSBnaXZlbiBzdWJzdHJpbmcgaXMgYSB2YWxpZCB0eXBlIGRlc2NyaXB0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGVzYyB0aGUgc3RyaW5nIHRvIGJlIGNoZWNrZWQuCisgICAgICogQHBhcmFtIHN0YXJ0IGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIGlkZW50aWZpZXIgKGluY2x1c2l2ZSkuCisgICAgICogQHBhcmFtIGNhbkJlVm9pZCA8dHQ+dHJ1ZTwvdHQ+IGlmIDx0dD5WPC90dD4gY2FuIGJlIGNvbnNpZGVyZWQgdmFsaWQuCisgICAgICogQHJldHVybiB0aGUgaW5kZXggb2YgdGhlIGxhc3QgY2hhcmFjdGVyIG9mIHRoZSB0eXBlIGRlY3JpcHRvciwgcGx1cyBvbmUuCisgICAgICovCisgICAgc3RhdGljIGludCBjaGVja0Rlc2MoCisgICAgICAgIGZpbmFsIFN0cmluZyBkZXNjLAorICAgICAgICBmaW5hbCBpbnQgc3RhcnQsCisgICAgICAgIGZpbmFsIGJvb2xlYW4gY2FuQmVWb2lkKQorICAgIHsKKyAgICAgICAgaWYgKGRlc2MgPT0gbnVsbCB8fCBzdGFydCA+PSBkZXNjLmxlbmd0aCgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIHR5cGUgZGVzY3JpcHRvciAobXVzdCBub3QgYmUgbnVsbCBvciBlbXB0eSkiKTsKKyAgICAgICAgfQorICAgICAgICBpbnQgaW5kZXg7CisgICAgICAgIHN3aXRjaCAoZGVzYy5jaGFyQXQoc3RhcnQpKSB7CisgICAgICAgICAgICBjYXNlICdWJzoKKyAgICAgICAgICAgICAgICBpZiAoY2FuQmVWb2lkKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGFydCArIDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBkZXNjcmlwdG9yOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBkZXNjKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlICdaJzoKKyAgICAgICAgICAgIGNhc2UgJ0MnOgorICAgICAgICAgICAgY2FzZSAnQic6CisgICAgICAgICAgICBjYXNlICdTJzoKKyAgICAgICAgICAgIGNhc2UgJ0knOgorICAgICAgICAgICAgY2FzZSAnRic6CisgICAgICAgICAgICBjYXNlICdKJzoKKyAgICAgICAgICAgIGNhc2UgJ0QnOgorICAgICAgICAgICAgICAgIHJldHVybiBzdGFydCArIDE7CisgICAgICAgICAgICBjYXNlICdbJzoKKyAgICAgICAgICAgICAgICBpbmRleCA9IHN0YXJ0ICsgMTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoaW5kZXggPCBkZXNjLmxlbmd0aCgpICYmIGRlc2MuY2hhckF0KGluZGV4KSA9PSAnWycpIHsKKyAgICAgICAgICAgICAgICAgICAgKytpbmRleDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgZGVzYy5sZW5ndGgoKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2hlY2tEZXNjKGRlc2MsIGluZGV4LCBmYWxzZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBkZXNjcmlwdG9yOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBkZXNjKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlICdMJzoKKyAgICAgICAgICAgICAgICBpbmRleCA9IGRlc2MuaW5kZXhPZignOycsIHN0YXJ0KTsKKyAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT0gLTEgfHwgaW5kZXggLSBzdGFydCA8IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBkZXNjcmlwdG9yOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBkZXNjKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgY2hlY2tJbnRlcm5hbE5hbWUoZGVzYywgc3RhcnQgKyAxLCBpbmRleCwgbnVsbCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIF8pIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBkZXNjcmlwdG9yOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBkZXNjKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4ICsgMTsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBkZXNjcmlwdG9yOiAiCisgICAgICAgICAgICAgICAgICAgICAgICArIGRlc2MpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIHRoYXQgdGhlIGdpdmVuIHN0cmluZyBpcyBhIHZhbGlkIG1ldGhvZCBkZXNjcmlwdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIGRlc2MgdGhlIHN0cmluZyB0byBiZSBjaGVja2VkLgorICAgICAqLworICAgIHN0YXRpYyB2b2lkIGNoZWNrTWV0aG9kRGVzYyhmaW5hbCBTdHJpbmcgZGVzYykgeworICAgICAgICBpZiAoZGVzYyA9PSBudWxsIHx8IGRlc2MubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBtZXRob2QgZGVzY3JpcHRvciAobXVzdCBub3QgYmUgbnVsbCBvciBlbXB0eSkiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGVzYy5jaGFyQXQoMCkgIT0gJygnIHx8IGRlc2MubGVuZ3RoKCkgPCAzKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIGRlc2NyaXB0b3I6ICIgKyBkZXNjKTsKKyAgICAgICAgfQorICAgICAgICBpbnQgc3RhcnQgPSAxOworICAgICAgICBpZiAoZGVzYy5jaGFyQXQoc3RhcnQpICE9ICcpJykgeworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGlmIChkZXNjLmNoYXJBdChzdGFydCkgPT0gJ1YnKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgZGVzY3JpcHRvcjogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZGVzYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0YXJ0ID0gY2hlY2tEZXNjKGRlc2MsIHN0YXJ0LCBmYWxzZSk7CisgICAgICAgICAgICB9IHdoaWxlIChzdGFydCA8IGRlc2MubGVuZ3RoKCkgJiYgZGVzYy5jaGFyQXQoc3RhcnQpICE9ICcpJyk7CisgICAgICAgIH0KKyAgICAgICAgc3RhcnQgPSBjaGVja0Rlc2MoZGVzYywgc3RhcnQgKyAxLCB0cnVlKTsKKyAgICAgICAgaWYgKHN0YXJ0ICE9IGRlc2MubGVuZ3RoKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgZGVzY3JpcHRvcjogIiArIGRlc2MpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIGEgY2xhc3Mgc2lnbmF0dXJlLgorICAgICAqCisgICAgICogQHBhcmFtIHNpZ25hdHVyZSBhIHN0cmluZyBjb250YWluaW5nIHRoZSBzaWduYXR1cmUgdGhhdCBtdXN0IGJlIGNoZWNrZWQuCisgICAgICovCisgICAgc3RhdGljIHZvaWQgY2hlY2tDbGFzc1NpZ25hdHVyZShmaW5hbCBTdHJpbmcgc2lnbmF0dXJlKSB7CisgICAgICAgIC8vIENsYXNzU2lnbmF0dXJlOgorICAgICAgICAvLyBGb3JtYWxUeXBlUGFyYW1ldGVycz8gQ2xhc3NUeXBlU2lnbmF0dXJlIENsYXNzVHlwZVNpZ25hdHVyZSoKKworICAgICAgICBpbnQgcG9zID0gMDsKKyAgICAgICAgaWYgKGdldENoYXIoc2lnbmF0dXJlLCAwKSA9PSAnPCcpIHsKKyAgICAgICAgICAgIHBvcyA9IGNoZWNrRm9ybWFsVHlwZVBhcmFtZXRlcnMoc2lnbmF0dXJlLCBwb3MpOworICAgICAgICB9CisgICAgICAgIHBvcyA9IGNoZWNrQ2xhc3NUeXBlU2lnbmF0dXJlKHNpZ25hdHVyZSwgcG9zKTsKKyAgICAgICAgd2hpbGUgKGdldENoYXIoc2lnbmF0dXJlLCBwb3MpID09ICdMJykgeworICAgICAgICAgICAgcG9zID0gY2hlY2tDbGFzc1R5cGVTaWduYXR1cmUoc2lnbmF0dXJlLCBwb3MpOworICAgICAgICB9CisgICAgICAgIGlmIChwb3MgIT0gc2lnbmF0dXJlLmxlbmd0aCgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHNpZ25hdHVyZSArICI6IGVycm9yIGF0IGluZGV4ICIKKyAgICAgICAgICAgICAgICAgICAgKyBwb3MpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIGEgbWV0aG9kIHNpZ25hdHVyZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzaWduYXR1cmUgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgc2lnbmF0dXJlIHRoYXQgbXVzdCBiZSBjaGVja2VkLgorICAgICAqLworICAgIHN0YXRpYyB2b2lkIGNoZWNrTWV0aG9kU2lnbmF0dXJlKGZpbmFsIFN0cmluZyBzaWduYXR1cmUpIHsKKyAgICAgICAgLy8gTWV0aG9kVHlwZVNpZ25hdHVyZToKKyAgICAgICAgLy8gRm9ybWFsVHlwZVBhcmFtZXRlcnM/ICggVHlwZVNpZ25hdHVyZSogKSAoIFR5cGVTaWduYXR1cmUgfCBWICkgKAorICAgICAgICAvLyBeQ2xhc3NUeXBlU2lnbmF0dXJlIHwgXlR5cGVWYXJpYWJsZVNpZ25hdHVyZSApKgorCisgICAgICAgIGludCBwb3MgPSAwOworICAgICAgICBpZiAoZ2V0Q2hhcihzaWduYXR1cmUsIDApID09ICc8JykgeworICAgICAgICAgICAgcG9zID0gY2hlY2tGb3JtYWxUeXBlUGFyYW1ldGVycyhzaWduYXR1cmUsIHBvcyk7CisgICAgICAgIH0KKyAgICAgICAgcG9zID0gY2hlY2tDaGFyKCcoJywgc2lnbmF0dXJlLCBwb3MpOworICAgICAgICB3aGlsZSAoIlpDQlNJRkpETFtUIi5pbmRleE9mKGdldENoYXIoc2lnbmF0dXJlLCBwb3MpKSAhPSAtMSkgeworICAgICAgICAgICAgcG9zID0gY2hlY2tUeXBlU2lnbmF0dXJlKHNpZ25hdHVyZSwgcG9zKTsKKyAgICAgICAgfQorICAgICAgICBwb3MgPSBjaGVja0NoYXIoJyknLCBzaWduYXR1cmUsIHBvcyk7CisgICAgICAgIGlmIChnZXRDaGFyKHNpZ25hdHVyZSwgcG9zKSA9PSAnVicpIHsKKyAgICAgICAgICAgICsrcG9zOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcG9zID0gY2hlY2tUeXBlU2lnbmF0dXJlKHNpZ25hdHVyZSwgcG9zKTsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoZ2V0Q2hhcihzaWduYXR1cmUsIHBvcykgPT0gJ14nKSB7CisgICAgICAgICAgICArK3BvczsKKyAgICAgICAgICAgIGlmIChnZXRDaGFyKHNpZ25hdHVyZSwgcG9zKSA9PSAnTCcpIHsKKyAgICAgICAgICAgICAgICBwb3MgPSBjaGVja0NsYXNzVHlwZVNpZ25hdHVyZShzaWduYXR1cmUsIHBvcyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHBvcyA9IGNoZWNrVHlwZVZhcmlhYmxlU2lnbmF0dXJlKHNpZ25hdHVyZSwgcG9zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocG9zICE9IHNpZ25hdHVyZS5sZW5ndGgoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihzaWduYXR1cmUgKyAiOiBlcnJvciBhdCBpbmRleCAiCisgICAgICAgICAgICAgICAgICAgICsgcG9zKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrcyBhIGZpZWxkIHNpZ25hdHVyZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzaWduYXR1cmUgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgc2lnbmF0dXJlIHRoYXQgbXVzdCBiZSBjaGVja2VkLgorICAgICAqLworICAgIHN0YXRpYyB2b2lkIGNoZWNrRmllbGRTaWduYXR1cmUoZmluYWwgU3RyaW5nIHNpZ25hdHVyZSkgeworICAgICAgICBpbnQgcG9zID0gY2hlY2tGaWVsZFR5cGVTaWduYXR1cmUoc2lnbmF0dXJlLCAwKTsKKyAgICAgICAgaWYgKHBvcyAhPSBzaWduYXR1cmUubGVuZ3RoKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oc2lnbmF0dXJlICsgIjogZXJyb3IgYXQgaW5kZXggIgorICAgICAgICAgICAgICAgICAgICArIHBvcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgdGhlIGZvcm1hbCB0eXBlIHBhcmFtZXRlcnMgb2YgYSBjbGFzcyBvciBtZXRob2Qgc2lnbmF0dXJlLgorICAgICAqCisgICAgICogQHBhcmFtIHNpZ25hdHVyZSBhIHN0cmluZyBjb250YWluaW5nIHRoZSBzaWduYXR1cmUgdGhhdCBtdXN0IGJlIGNoZWNrZWQuCisgICAgICogQHBhcmFtIHBvcyBpbmRleCBvZiBmaXJzdCBjaGFyYWN0ZXIgdG8gYmUgY2hlY2tlZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIGFmdGVyIHRoZSBjaGVja2VkIHBhcnQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGNoZWNrRm9ybWFsVHlwZVBhcmFtZXRlcnMoZmluYWwgU3RyaW5nIHNpZ25hdHVyZSwgaW50IHBvcykKKyAgICB7CisgICAgICAgIC8vIEZvcm1hbFR5cGVQYXJhbWV0ZXJzOgorICAgICAgICAvLyA8IEZvcm1hbFR5cGVQYXJhbWV0ZXIrID4KKworICAgICAgICBwb3MgPSBjaGVja0NoYXIoJzwnLCBzaWduYXR1cmUsIHBvcyk7CisgICAgICAgIHBvcyA9IGNoZWNrRm9ybWFsVHlwZVBhcmFtZXRlcihzaWduYXR1cmUsIHBvcyk7CisgICAgICAgIHdoaWxlIChnZXRDaGFyKHNpZ25hdHVyZSwgcG9zKSAhPSAnPicpIHsKKyAgICAgICAgICAgIHBvcyA9IGNoZWNrRm9ybWFsVHlwZVBhcmFtZXRlcihzaWduYXR1cmUsIHBvcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBvcyArIDE7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIGEgZm9ybWFsIHR5cGUgcGFyYW1ldGVyIG9mIGEgY2xhc3Mgb3IgbWV0aG9kIHNpZ25hdHVyZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzaWduYXR1cmUgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgc2lnbmF0dXJlIHRoYXQgbXVzdCBiZSBjaGVja2VkLgorICAgICAqIEBwYXJhbSBwb3MgaW5kZXggb2YgZmlyc3QgY2hhcmFjdGVyIHRvIGJlIGNoZWNrZWQuCisgICAgICogQHJldHVybiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBhZnRlciB0aGUgY2hlY2tlZCBwYXJ0LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGludCBjaGVja0Zvcm1hbFR5cGVQYXJhbWV0ZXIoZmluYWwgU3RyaW5nIHNpZ25hdHVyZSwgaW50IHBvcykKKyAgICB7CisgICAgICAgIC8vIEZvcm1hbFR5cGVQYXJhbWV0ZXI6CisgICAgICAgIC8vIElkZW50aWZpZXIgOiBGaWVsZFR5cGVTaWduYXR1cmU/ICg6IEZpZWxkVHlwZVNpZ25hdHVyZSkqCisKKyAgICAgICAgcG9zID0gY2hlY2tJZGVudGlmaWVyKHNpZ25hdHVyZSwgcG9zKTsKKyAgICAgICAgcG9zID0gY2hlY2tDaGFyKCc6Jywgc2lnbmF0dXJlLCBwb3MpOworICAgICAgICBpZiAoIkxbVCIuaW5kZXhPZihnZXRDaGFyKHNpZ25hdHVyZSwgcG9zKSkgIT0gLTEpIHsKKyAgICAgICAgICAgIHBvcyA9IGNoZWNrRmllbGRUeXBlU2lnbmF0dXJlKHNpZ25hdHVyZSwgcG9zKTsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoZ2V0Q2hhcihzaWduYXR1cmUsIHBvcykgPT0gJzonKSB7CisgICAgICAgICAgICBwb3MgPSBjaGVja0ZpZWxkVHlwZVNpZ25hdHVyZShzaWduYXR1cmUsIHBvcyArIDEpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwb3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIGEgZmllbGQgdHlwZSBzaWduYXR1cmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2lnbmF0dXJlIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHNpZ25hdHVyZSB0aGF0IG11c3QgYmUgY2hlY2tlZC4KKyAgICAgKiBAcGFyYW0gcG9zIGluZGV4IG9mIGZpcnN0IGNoYXJhY3RlciB0byBiZSBjaGVja2VkLgorICAgICAqIEByZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIGNoZWNrZWQgcGFydC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgY2hlY2tGaWVsZFR5cGVTaWduYXR1cmUoZmluYWwgU3RyaW5nIHNpZ25hdHVyZSwgaW50IHBvcykKKyAgICB7CisgICAgICAgIC8vIEZpZWxkVHlwZVNpZ25hdHVyZToKKyAgICAgICAgLy8gQ2xhc3NUeXBlU2lnbmF0dXJlIHwgQXJyYXlUeXBlU2lnbmF0dXJlIHwgVHlwZVZhcmlhYmxlU2lnbmF0dXJlCisgICAgICAgIC8vCisgICAgICAgIC8vIEFycmF5VHlwZVNpZ25hdHVyZToKKyAgICAgICAgLy8gWyBUeXBlU2lnbmF0dXJlCisKKyAgICAgICAgc3dpdGNoIChnZXRDaGFyKHNpZ25hdHVyZSwgcG9zKSkgeworICAgICAgICAgICAgY2FzZSAnTCc6CisgICAgICAgICAgICAgICAgcmV0dXJuIGNoZWNrQ2xhc3NUeXBlU2lnbmF0dXJlKHNpZ25hdHVyZSwgcG9zKTsKKyAgICAgICAgICAgIGNhc2UgJ1snOgorICAgICAgICAgICAgICAgIHJldHVybiBjaGVja1R5cGVTaWduYXR1cmUoc2lnbmF0dXJlLCBwb3MgKyAxKTsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGNoZWNrVHlwZVZhcmlhYmxlU2lnbmF0dXJlKHNpZ25hdHVyZSwgcG9zKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrcyBhIGNsYXNzIHR5cGUgc2lnbmF0dXJlLgorICAgICAqCisgICAgICogQHBhcmFtIHNpZ25hdHVyZSBhIHN0cmluZyBjb250YWluaW5nIHRoZSBzaWduYXR1cmUgdGhhdCBtdXN0IGJlIGNoZWNrZWQuCisgICAgICogQHBhcmFtIHBvcyBpbmRleCBvZiBmaXJzdCBjaGFyYWN0ZXIgdG8gYmUgY2hlY2tlZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIGFmdGVyIHRoZSBjaGVja2VkIHBhcnQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGNoZWNrQ2xhc3NUeXBlU2lnbmF0dXJlKGZpbmFsIFN0cmluZyBzaWduYXR1cmUsIGludCBwb3MpCisgICAgeworICAgICAgICAvLyBDbGFzc1R5cGVTaWduYXR1cmU6CisgICAgICAgIC8vIEwgSWRlbnRpZmllciAoIC8gSWRlbnRpZmllciApKiBUeXBlQXJndW1lbnRzPyAoIC4gSWRlbnRpZmllcgorICAgICAgICAvLyBUeXBlQXJndW1lbnRzPyApKiA7CisKKyAgICAgICAgcG9zID0gY2hlY2tDaGFyKCdMJywgc2lnbmF0dXJlLCBwb3MpOworICAgICAgICBwb3MgPSBjaGVja0lkZW50aWZpZXIoc2lnbmF0dXJlLCBwb3MpOworICAgICAgICB3aGlsZSAoZ2V0Q2hhcihzaWduYXR1cmUsIHBvcykgPT0gJy8nKSB7CisgICAgICAgICAgICBwb3MgPSBjaGVja0lkZW50aWZpZXIoc2lnbmF0dXJlLCBwb3MgKyAxKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ2V0Q2hhcihzaWduYXR1cmUsIHBvcykgPT0gJzwnKSB7CisgICAgICAgICAgICBwb3MgPSBjaGVja1R5cGVBcmd1bWVudHMoc2lnbmF0dXJlLCBwb3MpOworICAgICAgICB9CisgICAgICAgIHdoaWxlIChnZXRDaGFyKHNpZ25hdHVyZSwgcG9zKSA9PSAnLicpIHsKKyAgICAgICAgICAgIHBvcyA9IGNoZWNrSWRlbnRpZmllcihzaWduYXR1cmUsIHBvcyArIDEpOworICAgICAgICAgICAgaWYgKGdldENoYXIoc2lnbmF0dXJlLCBwb3MpID09ICc8JykgeworICAgICAgICAgICAgICAgIHBvcyA9IGNoZWNrVHlwZUFyZ3VtZW50cyhzaWduYXR1cmUsIHBvcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNoZWNrQ2hhcignOycsIHNpZ25hdHVyZSwgcG9zKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgdGhlIHR5cGUgYXJndW1lbnRzIGluIGEgY2xhc3MgdHlwZSBzaWduYXR1cmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2lnbmF0dXJlIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHNpZ25hdHVyZSB0aGF0IG11c3QgYmUgY2hlY2tlZC4KKyAgICAgKiBAcGFyYW0gcG9zIGluZGV4IG9mIGZpcnN0IGNoYXJhY3RlciB0byBiZSBjaGVja2VkLgorICAgICAqIEByZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIGNoZWNrZWQgcGFydC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgY2hlY2tUeXBlQXJndW1lbnRzKGZpbmFsIFN0cmluZyBzaWduYXR1cmUsIGludCBwb3MpIHsKKyAgICAgICAgLy8gVHlwZUFyZ3VtZW50czoKKyAgICAgICAgLy8gPCBUeXBlQXJndW1lbnQrID4KKworICAgICAgICBwb3MgPSBjaGVja0NoYXIoJzwnLCBzaWduYXR1cmUsIHBvcyk7CisgICAgICAgIHBvcyA9IGNoZWNrVHlwZUFyZ3VtZW50KHNpZ25hdHVyZSwgcG9zKTsKKyAgICAgICAgd2hpbGUgKGdldENoYXIoc2lnbmF0dXJlLCBwb3MpICE9ICc+JykgeworICAgICAgICAgICAgcG9zID0gY2hlY2tUeXBlQXJndW1lbnQoc2lnbmF0dXJlLCBwb3MpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwb3MgKyAxOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrcyBhIHR5cGUgYXJndW1lbnQgaW4gYSBjbGFzcyB0eXBlIHNpZ25hdHVyZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzaWduYXR1cmUgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgc2lnbmF0dXJlIHRoYXQgbXVzdCBiZSBjaGVja2VkLgorICAgICAqIEBwYXJhbSBwb3MgaW5kZXggb2YgZmlyc3QgY2hhcmFjdGVyIHRvIGJlIGNoZWNrZWQuCisgICAgICogQHJldHVybiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBhZnRlciB0aGUgY2hlY2tlZCBwYXJ0LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGludCBjaGVja1R5cGVBcmd1bWVudChmaW5hbCBTdHJpbmcgc2lnbmF0dXJlLCBpbnQgcG9zKSB7CisgICAgICAgIC8vIFR5cGVBcmd1bWVudDoKKyAgICAgICAgLy8gKiB8ICggKCArIHwgLSApPyBGaWVsZFR5cGVTaWduYXR1cmUgKQorCisgICAgICAgIGNoYXIgYyA9IGdldENoYXIoc2lnbmF0dXJlLCBwb3MpOworICAgICAgICBpZiAoYyA9PSAnKicpIHsKKyAgICAgICAgICAgIHJldHVybiBwb3MgKyAxOworICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJysnIHx8IGMgPT0gJy0nKSB7CisgICAgICAgICAgICBwb3MrKzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2hlY2tGaWVsZFR5cGVTaWduYXR1cmUoc2lnbmF0dXJlLCBwb3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrcyBhIHR5cGUgdmFyaWFibGUgc2lnbmF0dXJlLgorICAgICAqCisgICAgICogQHBhcmFtIHNpZ25hdHVyZSBhIHN0cmluZyBjb250YWluaW5nIHRoZSBzaWduYXR1cmUgdGhhdCBtdXN0IGJlIGNoZWNrZWQuCisgICAgICogQHBhcmFtIHBvcyBpbmRleCBvZiBmaXJzdCBjaGFyYWN0ZXIgdG8gYmUgY2hlY2tlZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIGFmdGVyIHRoZSBjaGVja2VkIHBhcnQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGNoZWNrVHlwZVZhcmlhYmxlU2lnbmF0dXJlKAorICAgICAgICBmaW5hbCBTdHJpbmcgc2lnbmF0dXJlLAorICAgICAgICBpbnQgcG9zKQorICAgIHsKKyAgICAgICAgLy8gVHlwZVZhcmlhYmxlU2lnbmF0dXJlOgorICAgICAgICAvLyBUIElkZW50aWZpZXIgOworCisgICAgICAgIHBvcyA9IGNoZWNrQ2hhcignVCcsIHNpZ25hdHVyZSwgcG9zKTsKKyAgICAgICAgcG9zID0gY2hlY2tJZGVudGlmaWVyKHNpZ25hdHVyZSwgcG9zKTsKKyAgICAgICAgcmV0dXJuIGNoZWNrQ2hhcignOycsIHNpZ25hdHVyZSwgcG9zKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgYSB0eXBlIHNpZ25hdHVyZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzaWduYXR1cmUgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgc2lnbmF0dXJlIHRoYXQgbXVzdCBiZSBjaGVja2VkLgorICAgICAqIEBwYXJhbSBwb3MgaW5kZXggb2YgZmlyc3QgY2hhcmFjdGVyIHRvIGJlIGNoZWNrZWQuCisgICAgICogQHJldHVybiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBhZnRlciB0aGUgY2hlY2tlZCBwYXJ0LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGludCBjaGVja1R5cGVTaWduYXR1cmUoZmluYWwgU3RyaW5nIHNpZ25hdHVyZSwgaW50IHBvcykgeworICAgICAgICAvLyBUeXBlU2lnbmF0dXJlOgorICAgICAgICAvLyBaIHwgQyB8IEIgfCBTIHwgSSB8IEYgfCBKIHwgRCB8IEZpZWxkVHlwZVNpZ25hdHVyZQorCisgICAgICAgIHN3aXRjaCAoZ2V0Q2hhcihzaWduYXR1cmUsIHBvcykpIHsKKyAgICAgICAgICAgIGNhc2UgJ1onOgorICAgICAgICAgICAgY2FzZSAnQyc6CisgICAgICAgICAgICBjYXNlICdCJzoKKyAgICAgICAgICAgIGNhc2UgJ1MnOgorICAgICAgICAgICAgY2FzZSAnSSc6CisgICAgICAgICAgICBjYXNlICdGJzoKKyAgICAgICAgICAgIGNhc2UgJ0onOgorICAgICAgICAgICAgY2FzZSAnRCc6CisgICAgICAgICAgICAgICAgcmV0dXJuIHBvcyArIDE7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBjaGVja0ZpZWxkVHlwZVNpZ25hdHVyZShzaWduYXR1cmUsIHBvcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgYW4gaWRlbnRpZmllci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzaWduYXR1cmUgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgc2lnbmF0dXJlIHRoYXQgbXVzdCBiZSBjaGVja2VkLgorICAgICAqIEBwYXJhbSBwb3MgaW5kZXggb2YgZmlyc3QgY2hhcmFjdGVyIHRvIGJlIGNoZWNrZWQuCisgICAgICogQHJldHVybiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBhZnRlciB0aGUgY2hlY2tlZCBwYXJ0LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGludCBjaGVja0lkZW50aWZpZXIoZmluYWwgU3RyaW5nIHNpZ25hdHVyZSwgaW50IHBvcykgeworICAgICAgICBpZiAoIUNoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyU3RhcnQoZ2V0Q2hhcihzaWduYXR1cmUsIHBvcykpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHNpZ25hdHVyZQorICAgICAgICAgICAgICAgICAgICArICI6IGlkZW50aWZpZXIgZXhwZWN0ZWQgYXQgaW5kZXggIiArIHBvcyk7CisgICAgICAgIH0KKyAgICAgICAgKytwb3M7CisgICAgICAgIHdoaWxlIChDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQoZ2V0Q2hhcihzaWduYXR1cmUsIHBvcykpKSB7CisgICAgICAgICAgICArK3BvczsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcG9zOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrcyBhIHNpbmdsZSBjaGFyYWN0ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2lnbmF0dXJlIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHNpZ25hdHVyZSB0aGF0IG11c3QgYmUgY2hlY2tlZC4KKyAgICAgKiBAcGFyYW0gcG9zIGluZGV4IG9mIGZpcnN0IGNoYXJhY3RlciB0byBiZSBjaGVja2VkLgorICAgICAqIEByZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIGNoZWNrZWQgcGFydC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgY2hlY2tDaGFyKGZpbmFsIGNoYXIgYywgZmluYWwgU3RyaW5nIHNpZ25hdHVyZSwgaW50IHBvcykKKyAgICB7CisgICAgICAgIGlmIChnZXRDaGFyKHNpZ25hdHVyZSwgcG9zKSA9PSBjKSB7CisgICAgICAgICAgICByZXR1cm4gcG9zICsgMTsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHNpZ25hdHVyZSArICI6ICciICsgYworICAgICAgICAgICAgICAgICsgIicgZXhwZWN0ZWQgYXQgaW5kZXggIiArIHBvcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc2lnbmF0dXJlIGNhciBhdCB0aGUgZ2l2ZW4gaW5kZXguCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2lnbmF0dXJlIGEgc2lnbmF0dXJlLgorICAgICAqIEBwYXJhbSBwb3MgYW4gaW5kZXggaW4gc2lnbmF0dXJlLgorICAgICAqIEByZXR1cm4gdGhlIGNoYXJhY3RlciBhdCB0aGUgZ2l2ZW4gaW5kZXgsIG9yIDAgaWYgdGhlcmUgaXMgbm8gc3VjaAorICAgICAqICAgICAgICAgY2hhcmFjdGVyLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNoYXIgZ2V0Q2hhcihmaW5hbCBTdHJpbmcgc2lnbmF0dXJlLCBpbnQgcG9zKSB7CisgICAgICAgIHJldHVybiBwb3MgPCBzaWduYXR1cmUubGVuZ3RoKCkgPyBzaWduYXR1cmUuY2hhckF0KHBvcykgOiAoY2hhcikgMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgdGhhdCB0aGUgZ2l2ZW4gbGFiZWwgaXMgbm90IG51bGwuIFRoaXMgbWV0aG9kIGNhbiBhbHNvIGNoZWNrIHRoYXQKKyAgICAgKiB0aGUgbGFiZWwgaGFzIGJlZW4gdmlzaXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsYWJlbCB0aGUgbGFiZWwgdG8gYmUgY2hlY2tlZC4KKyAgICAgKiBAcGFyYW0gY2hlY2tWaXNpdGVkIDx0dD50cnVlPC90dD4gdG8gY2hlY2sgdGhhdCB0aGUgbGFiZWwgaGFzIGJlZW4KKyAgICAgKiAgICAgICAgdmlzaXRlZC4KKyAgICAgKiBAcGFyYW0gbXNnIGEgbWVzc2FnZSB0byBiZSB1c2VkIGluIGNhc2Ugb2YgZXJyb3IuCisgICAgICovCisgICAgdm9pZCBjaGVja0xhYmVsKAorICAgICAgICBmaW5hbCBMYWJlbCBsYWJlbCwKKyAgICAgICAgZmluYWwgYm9vbGVhbiBjaGVja1Zpc2l0ZWQsCisgICAgICAgIGZpbmFsIFN0cmluZyBtc2cpCisgICAgeworICAgICAgICBpZiAobGFiZWwgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCAiICsgbXNnCisgICAgICAgICAgICAgICAgICAgICsgIiAobXVzdCBub3QgYmUgbnVsbCkiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2hlY2tWaXNpdGVkICYmIGxhYmVscy5nZXQobGFiZWwpID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgIiArIG1zZworICAgICAgICAgICAgICAgICAgICArICIgKG11c3QgYmUgdmlzaXRlZCBmaXJzdCkiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrcyB0aGF0IHRoZSBnaXZlbiBsYWJlbCBpcyBub3QgYSBsYWJlbCB1c2VkIG9ubHkgZm9yIGRlYnVnIHB1cnBvc2VzLgorICAgICAqCisgICAgICogQHBhcmFtIGxhYmVsIHRoZSBsYWJlbCB0byBiZSBjaGVja2VkLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tOb25EZWJ1Z0xhYmVsKGZpbmFsIExhYmVsIGxhYmVsKSB7CisgICAgICAgIEZpZWxkIGYgPSBnZXRMYWJlbFN0YXR1c0ZpZWxkKCk7CisgICAgICAgIGludCBzdGF0dXMgPSAwOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3RhdHVzID0gZiA9PSBudWxsID8gMCA6ICgoSW50ZWdlcikgZi5nZXQobGFiZWwpKS5pbnRWYWx1ZSgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiSW50ZXJuYWwgZXJyb3IiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHN0YXR1cyAmIDB4MDEpICE9IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkxhYmVscyB1c2VkIGZvciBkZWJ1ZyBpbmZvIGNhbm5vdCBiZSByZXVzZWQgZm9yIGNvbnRyb2wgZmxvdyIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgRmllbGQgb2JqZWN0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIExhYmVsLnN0YXR1cyBmaWVsZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIEZpZWxkIG9iamVjdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBMYWJlbC5zdGF0dXMgZmllbGQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgRmllbGQgZ2V0TGFiZWxTdGF0dXNGaWVsZCgpIHsKKyAgICAgICAgaWYgKGxhYmVsU3RhdHVzRmllbGQgPT0gbnVsbCkgeworICAgICAgICAgICAgbGFiZWxTdGF0dXNGaWVsZCA9IGdldExhYmVsRmllbGQoImEiKTsKKyAgICAgICAgICAgIGlmIChsYWJlbFN0YXR1c0ZpZWxkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBsYWJlbFN0YXR1c0ZpZWxkID0gZ2V0TGFiZWxGaWVsZCgic3RhdHVzIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxhYmVsU3RhdHVzRmllbGQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZmllbGQgb2YgdGhlIExhYmVsIGNsYXNzIHdob3NlIG5hbWUgaXMgZ2l2ZW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBhIGZpZWxkIG5hbWUuCisgICAgICogQHJldHVybiB0aGUgZmllbGQgb2YgdGhlIExhYmVsIGNsYXNzIHdob3NlIG5hbWUgaXMgZ2l2ZW4sIG9yIG51bGwuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgRmllbGQgZ2V0TGFiZWxGaWVsZChmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgRmllbGQgZiA9IExhYmVsLmNsYXNzLmdldERlY2xhcmVkRmllbGQobmFtZSk7CisgICAgICAgICAgICBmLnNldEFjY2Vzc2libGUodHJ1ZSk7CisgICAgICAgICAgICByZXR1cm4gZjsKKyAgICAgICAgfSBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL3V0aWwvQ2hlY2tTaWduYXR1cmVBZGFwdGVyLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL3V0aWwvQ2hlY2tTaWduYXR1cmVBZGFwdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFhMDA5ZQotLS0gL2Rldi9udWxsCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vdXRpbC9DaGVja1NpZ25hdHVyZUFkYXB0ZXIuamF2YQpAQCAtMCwwICsxLDM1OCBAQAorLyoKKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgT3JhY2xlIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCisgKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CisgKiBxdWVzdGlvbnMuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBpcyBhdmFpbGFibGUgdW5kZXIgYW5kIGdvdmVybmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogSG93ZXZlciwgdGhlIGZvbGxvd2luZyBub3RpY2UgYWNjb21wYW5pZWQgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhpcworICogZmlsZToKKyAqCisgKiBBU006IGEgdmVyeSBzbWFsbCBhbmQgZmFzdCBKYXZhIGJ5dGVjb2RlIG1hbmlwdWxhdGlvbiBmcmFtZXdvcmsKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDExIElOUklBLCBGcmFuY2UgVGVsZWNvbQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS51dGlsOworCitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLk9wY29kZXM7CitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLnNpZ25hdHVyZS5TaWduYXR1cmVWaXNpdG9yOworCisvKioKKyAqIEEge0BsaW5rIFNpZ25hdHVyZVZpc2l0b3J9IHRoYXQgY2hlY2tzIHRoYXQgaXRzIG1ldGhvZHMgYXJlIHByb3Blcmx5IHVzZWQuCisgKgorICogQGF1dGhvciBFcmljIEJydW5ldG9uCisgKi8KK3B1YmxpYyBjbGFzcyBDaGVja1NpZ25hdHVyZUFkYXB0ZXIgZXh0ZW5kcyBTaWduYXR1cmVWaXNpdG9yIHsKKworICAgIC8qKgorICAgICAqIFR5cGUgdG8gYmUgdXNlZCB0byBjaGVjayBjbGFzcyBzaWduYXR1cmVzLiBTZWUKKyAgICAgKiB7QGxpbmsgI0NoZWNrU2lnbmF0dXJlQWRhcHRlcihpbnQsIFNpZ25hdHVyZVZpc2l0b3IpIENoZWNrU2lnbmF0dXJlQWRhcHRlcn0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xBU1NfU0lHTkFUVVJFID0gMDsKKworICAgIC8qKgorICAgICAqIFR5cGUgdG8gYmUgdXNlZCB0byBjaGVjayBtZXRob2Qgc2lnbmF0dXJlcy4gU2VlCisgICAgICoge0BsaW5rICNDaGVja1NpZ25hdHVyZUFkYXB0ZXIoaW50LCBTaWduYXR1cmVWaXNpdG9yKSBDaGVja1NpZ25hdHVyZUFkYXB0ZXJ9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FVEhPRF9TSUdOQVRVUkUgPSAxOworCisgICAgLyoqCisgICAgICogVHlwZSB0byBiZSB1c2VkIHRvIGNoZWNrIHR5cGUgc2lnbmF0dXJlcy5TZWUKKyAgICAgKiB7QGxpbmsgI0NoZWNrU2lnbmF0dXJlQWRhcHRlcihpbnQsIFNpZ25hdHVyZVZpc2l0b3IpIENoZWNrU2lnbmF0dXJlQWRhcHRlcn0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9TSUdOQVRVUkUgPSAyOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVNUFRZID0gMTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGT1JNQUwgPSAyOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJPVU5EID0gNDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVVBFUiA9IDg7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUEFSQU0gPSAxNjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVRVUk4gPSAzMjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSU1QTEVfVFlQRSA9IDY0OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENMQVNTX1RZUEUgPSAxMjg7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRU5EID0gMjU2OworCisgICAgLyoqCisgICAgICogVHlwZSBvZiB0aGUgc2lnbmF0dXJlIHRvIGJlIGNoZWNrZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgdHlwZTsKKworICAgIC8qKgorICAgICAqIFN0YXRlIG9mIHRoZSBhdXRvbWF0b24gdXNlZCB0byBjaGVjayB0aGUgb3JkZXIgb2YgbWV0aG9kIGNhbGxzLgorICAgICAqLworICAgIHByaXZhdGUgaW50IHN0YXRlOworCisgICAgLyoqCisgICAgICogPHR0PnRydWU8L3R0PiBpZiB0aGUgY2hlY2tlZCB0eXBlIHNpZ25hdHVyZSBjYW4gYmUgJ1YnLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBjYW5CZVZvaWQ7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdmlzaXRvciB0byB3aGljaCB0aGlzIGFkYXB0ZXIgbXVzdCBkZWxlZ2F0ZSBjYWxscy4gTWF5IGJlCisgICAgICogPHR0Pm51bGw8L3R0Pi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIFNpZ25hdHVyZVZpc2l0b3Igc3Y7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBDaGVja1NpZ25hdHVyZUFkYXB0ZXJ9IG9iamVjdC4gPGk+U3ViY2xhc3NlcyBtdXN0CisgICAgICogbm90IHVzZSB0aGlzIGNvbnN0cnVjdG9yPC9pPi4gSW5zdGVhZCwgdGhleSBtdXN0IHVzZSB0aGUKKyAgICAgKiB7QGxpbmsgI0NoZWNrU2lnbmF0dXJlQWRhcHRlcihpbnQsIGludCwgU2lnbmF0dXJlVmlzaXRvcil9IHZlcnNpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBvZiBzaWduYXR1cmUgdG8gYmUgY2hlY2tlZC4gU2VlCisgICAgICogICAgICAgIHtAbGluayAjQ0xBU1NfU0lHTkFUVVJFfSwge0BsaW5rICNNRVRIT0RfU0lHTkFUVVJFfSBhbmQKKyAgICAgKiAgICAgICAge0BsaW5rICNUWVBFX1NJR05BVFVSRX0uCisgICAgICogQHBhcmFtIHN2IHRoZSB2aXNpdG9yIHRvIHdoaWNoIHRoaXMgYWRhcHRlciBtdXN0IGRlbGVnYXRlIGNhbGxzLiBNYXkgYmUKKyAgICAgKiAgICAgICAgPHR0Pm51bGw8L3R0Pi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2hlY2tTaWduYXR1cmVBZGFwdGVyKGZpbmFsIGludCB0eXBlLCBmaW5hbCBTaWduYXR1cmVWaXNpdG9yIHN2KSB7CisgICAgICAgIHRoaXMoT3Bjb2Rlcy5BU000LCB0eXBlLCBzdik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgQ2hlY2tTaWduYXR1cmVBZGFwdGVyfSBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXBpIHRoZSBBU00gQVBJIHZlcnNpb24gaW1wbGVtZW50ZWQgYnkgdGhpcyB2aXNpdG9yLiBNdXN0IGJlIG9uZQorICAgICAqICAgICAgICBvZiB7QGxpbmsgT3Bjb2RlcyNBU000fS4KKyAgICAgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBvZiBzaWduYXR1cmUgdG8gYmUgY2hlY2tlZC4gU2VlCisgICAgICogICAgICAgIHtAbGluayAjQ0xBU1NfU0lHTkFUVVJFfSwge0BsaW5rICNNRVRIT0RfU0lHTkFUVVJFfSBhbmQKKyAgICAgKiAgICAgICAge0BsaW5rICNUWVBFX1NJR05BVFVSRX0uCisgICAgICogQHBhcmFtIHN2IHRoZSB2aXNpdG9yIHRvIHdoaWNoIHRoaXMgYWRhcHRlciBtdXN0IGRlbGVnYXRlIGNhbGxzLiBNYXkgYmUKKyAgICAgKiAgICAgICAgPHR0Pm51bGw8L3R0Pi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ2hlY2tTaWduYXR1cmVBZGFwdGVyKAorICAgICAgICBmaW5hbCBpbnQgYXBpLAorICAgICAgICBmaW5hbCBpbnQgdHlwZSwKKyAgICAgICAgZmluYWwgU2lnbmF0dXJlVmlzaXRvciBzdikKKyAgICB7CisgICAgICAgIHN1cGVyKGFwaSk7CisgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgICAgIHRoaXMuc3RhdGUgPSBFTVBUWTsKKyAgICAgICAgdGhpcy5zdiA9IHN2OworICAgIH0KKworICAgIC8vIGNsYXNzIGFuZCBtZXRob2Qgc2lnbmF0dXJlcworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRGb3JtYWxUeXBlUGFyYW1ldGVyKGZpbmFsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIGlmICh0eXBlID09IFRZUEVfU0lHTkFUVVJFCisgICAgICAgICAgICAgICAgfHwgKHN0YXRlICE9IEVNUFRZICYmIHN0YXRlICE9IEZPUk1BTCAmJiBzdGF0ZSAhPSBCT1VORCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBDaGVja01ldGhvZEFkYXB0ZXIuY2hlY2tJZGVudGlmaWVyKG5hbWUsICJmb3JtYWwgdHlwZSBwYXJhbWV0ZXIiKTsKKyAgICAgICAgc3RhdGUgPSBGT1JNQUw7CisgICAgICAgIGlmIChzdiAhPSBudWxsKSB7CisgICAgICAgICAgICBzdi52aXNpdEZvcm1hbFR5cGVQYXJhbWV0ZXIobmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2lnbmF0dXJlVmlzaXRvciB2aXNpdENsYXNzQm91bmQoKSB7CisgICAgICAgIGlmIChzdGF0ZSAhPSBGT1JNQUwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBzdGF0ZSA9IEJPVU5EOworICAgICAgICBTaWduYXR1cmVWaXNpdG9yIHYgPSBzdiA9PSBudWxsID8gbnVsbCA6IHN2LnZpc2l0Q2xhc3NCb3VuZCgpOworICAgICAgICByZXR1cm4gbmV3IENoZWNrU2lnbmF0dXJlQWRhcHRlcihUWVBFX1NJR05BVFVSRSwgdik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNpZ25hdHVyZVZpc2l0b3IgdmlzaXRJbnRlcmZhY2VCb3VuZCgpIHsKKyAgICAgICAgaWYgKHN0YXRlICE9IEZPUk1BTCAmJiBzdGF0ZSAhPSBCT1VORCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIFNpZ25hdHVyZVZpc2l0b3IgdiA9IHN2ID09IG51bGwgPyBudWxsIDogc3YudmlzaXRJbnRlcmZhY2VCb3VuZCgpOworICAgICAgICByZXR1cm4gbmV3IENoZWNrU2lnbmF0dXJlQWRhcHRlcihUWVBFX1NJR05BVFVSRSwgdik7CisgICAgfQorCisgICAgLy8gY2xhc3Mgc2lnbmF0dXJlcworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNpZ25hdHVyZVZpc2l0b3IgdmlzaXRTdXBlcmNsYXNzKCkgeworICAgICAgICBpZiAodHlwZSAhPSBDTEFTU19TSUdOQVRVUkUgfHwgKHN0YXRlICYgKEVNUFRZIHwgRk9STUFMIHwgQk9VTkQpKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgc3RhdGUgPSBTVVBFUjsKKyAgICAgICAgU2lnbmF0dXJlVmlzaXRvciB2ID0gc3YgPT0gbnVsbCA/IG51bGwgOiBzdi52aXNpdFN1cGVyY2xhc3MoKTsKKyAgICAgICAgcmV0dXJuIG5ldyBDaGVja1NpZ25hdHVyZUFkYXB0ZXIoVFlQRV9TSUdOQVRVUkUsIHYpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTaWduYXR1cmVWaXNpdG9yIHZpc2l0SW50ZXJmYWNlKCkgeworICAgICAgICBpZiAoc3RhdGUgIT0gU1VQRVIpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBTaWduYXR1cmVWaXNpdG9yIHYgPSBzdiA9PSBudWxsID8gbnVsbCA6IHN2LnZpc2l0SW50ZXJmYWNlKCk7CisgICAgICAgIHJldHVybiBuZXcgQ2hlY2tTaWduYXR1cmVBZGFwdGVyKFRZUEVfU0lHTkFUVVJFLCB2KTsKKyAgICB9CisKKyAgICAvLyBtZXRob2Qgc2lnbmF0dXJlcworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNpZ25hdHVyZVZpc2l0b3IgdmlzaXRQYXJhbWV0ZXJUeXBlKCkgeworICAgICAgICBpZiAodHlwZSAhPSBNRVRIT0RfU0lHTkFUVVJFCisgICAgICAgICAgICAgICAgfHwgKHN0YXRlICYgKEVNUFRZIHwgRk9STUFMIHwgQk9VTkQgfCBQQVJBTSkpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBzdGF0ZSA9IFBBUkFNOworICAgICAgICBTaWduYXR1cmVWaXNpdG9yIHYgPSBzdiA9PSBudWxsID8gbnVsbCA6IHN2LnZpc2l0UGFyYW1ldGVyVHlwZSgpOworICAgICAgICByZXR1cm4gbmV3IENoZWNrU2lnbmF0dXJlQWRhcHRlcihUWVBFX1NJR05BVFVSRSwgdik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNpZ25hdHVyZVZpc2l0b3IgdmlzaXRSZXR1cm5UeXBlKCkgeworICAgICAgICBpZiAodHlwZSAhPSBNRVRIT0RfU0lHTkFUVVJFCisgICAgICAgICAgICAgICAgfHwgKHN0YXRlICYgKEVNUFRZIHwgRk9STUFMIHwgQk9VTkQgfCBQQVJBTSkpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBzdGF0ZSA9IFJFVFVSTjsKKyAgICAgICAgU2lnbmF0dXJlVmlzaXRvciB2ID0gc3YgPT0gbnVsbCA/IG51bGwgOiBzdi52aXNpdFJldHVyblR5cGUoKTsKKyAgICAgICAgQ2hlY2tTaWduYXR1cmVBZGFwdGVyIGN2ID0gbmV3IENoZWNrU2lnbmF0dXJlQWRhcHRlcihUWVBFX1NJR05BVFVSRSwgdik7CisgICAgICAgIGN2LmNhbkJlVm9pZCA9IHRydWU7CisgICAgICAgIHJldHVybiBjdjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2lnbmF0dXJlVmlzaXRvciB2aXNpdEV4Y2VwdGlvblR5cGUoKSB7CisgICAgICAgIGlmIChzdGF0ZSAhPSBSRVRVUk4pIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBTaWduYXR1cmVWaXNpdG9yIHYgPSBzdiA9PSBudWxsID8gbnVsbCA6IHN2LnZpc2l0RXhjZXB0aW9uVHlwZSgpOworICAgICAgICByZXR1cm4gbmV3IENoZWNrU2lnbmF0dXJlQWRhcHRlcihUWVBFX1NJR05BVFVSRSwgdik7CisgICAgfQorCisgICAgLy8gdHlwZSBzaWduYXR1cmVzCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEJhc2VUeXBlKGZpbmFsIGNoYXIgZGVzY3JpcHRvcikgeworICAgICAgICBpZiAodHlwZSAhPSBUWVBFX1NJR05BVFVSRSB8fCBzdGF0ZSAhPSBFTVBUWSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGlmIChkZXNjcmlwdG9yID09ICdWJykgeworICAgICAgICAgICAgaWYgKCFjYW5CZVZvaWQpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIlpDQlNJRkpEIi5pbmRleE9mKGRlc2NyaXB0b3IpID09IC0xKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN0YXRlID0gU0lNUExFX1RZUEU7CisgICAgICAgIGlmIChzdiAhPSBudWxsKSB7CisgICAgICAgICAgICBzdi52aXNpdEJhc2VUeXBlKGRlc2NyaXB0b3IpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRUeXBlVmFyaWFibGUoZmluYWwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgaWYgKHR5cGUgIT0gVFlQRV9TSUdOQVRVUkUgfHwgc3RhdGUgIT0gRU1QVFkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBDaGVja01ldGhvZEFkYXB0ZXIuY2hlY2tJZGVudGlmaWVyKG5hbWUsICJ0eXBlIHZhcmlhYmxlIik7CisgICAgICAgIHN0YXRlID0gU0lNUExFX1RZUEU7CisgICAgICAgIGlmIChzdiAhPSBudWxsKSB7CisgICAgICAgICAgICBzdi52aXNpdFR5cGVWYXJpYWJsZShuYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTaWduYXR1cmVWaXNpdG9yIHZpc2l0QXJyYXlUeXBlKCkgeworICAgICAgICBpZiAodHlwZSAhPSBUWVBFX1NJR05BVFVSRSB8fCBzdGF0ZSAhPSBFTVBUWSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIHN0YXRlID0gU0lNUExFX1RZUEU7CisgICAgICAgIFNpZ25hdHVyZVZpc2l0b3IgdiA9IHN2ID09IG51bGwgPyBudWxsIDogc3YudmlzaXRBcnJheVR5cGUoKTsKKyAgICAgICAgcmV0dXJuIG5ldyBDaGVja1NpZ25hdHVyZUFkYXB0ZXIoVFlQRV9TSUdOQVRVUkUsIHYpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0Q2xhc3NUeXBlKGZpbmFsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIGlmICh0eXBlICE9IFRZUEVfU0lHTkFUVVJFIHx8IHN0YXRlICE9IEVNUFRZKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgQ2hlY2tNZXRob2RBZGFwdGVyLmNoZWNrSW50ZXJuYWxOYW1lKG5hbWUsICJjbGFzcyBuYW1lIik7CisgICAgICAgIHN0YXRlID0gQ0xBU1NfVFlQRTsKKyAgICAgICAgaWYgKHN2ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHN2LnZpc2l0Q2xhc3NUeXBlKG5hbWUpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRJbm5lckNsYXNzVHlwZShmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgICAgICBpZiAoc3RhdGUgIT0gQ0xBU1NfVFlQRSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIENoZWNrTWV0aG9kQWRhcHRlci5jaGVja0lkZW50aWZpZXIobmFtZSwgImlubmVyIGNsYXNzIG5hbWUiKTsKKyAgICAgICAgaWYgKHN2ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHN2LnZpc2l0SW5uZXJDbGFzc1R5cGUobmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFR5cGVBcmd1bWVudCgpIHsKKyAgICAgICAgaWYgKHN0YXRlICE9IENMQVNTX1RZUEUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3YgIT0gbnVsbCkgeworICAgICAgICAgICAgc3YudmlzaXRUeXBlQXJndW1lbnQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTaWduYXR1cmVWaXNpdG9yIHZpc2l0VHlwZUFyZ3VtZW50KGZpbmFsIGNoYXIgd2lsZGNhcmQpIHsKKyAgICAgICAgaWYgKHN0YXRlICE9IENMQVNTX1RZUEUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIistPSIuaW5kZXhPZih3aWxkY2FyZCkgPT0gLTEpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBTaWduYXR1cmVWaXNpdG9yIHYgPSBzdiA9PSBudWxsID8gbnVsbCA6IHN2LnZpc2l0VHlwZUFyZ3VtZW50KHdpbGRjYXJkKTsKKyAgICAgICAgcmV0dXJuIG5ldyBDaGVja1NpZ25hdHVyZUFkYXB0ZXIoVFlQRV9TSUdOQVRVUkUsIHYpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0RW5kKCkgeworICAgICAgICBpZiAoc3RhdGUgIT0gQ0xBU1NfVFlQRSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIHN0YXRlID0gRU5EOworICAgICAgICBpZiAoc3YgIT0gbnVsbCkgeworICAgICAgICAgICAgc3YudmlzaXRFbmQoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vdXRpbC9QcmludGVyLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL3V0aWwvUHJpbnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MjNlZWUKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL3V0aWwvUHJpbnRlci5qYXZhCkBAIC0wLDAgKzEsNTg3IEBACisvKgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBPcmFjbGUgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKKyAqIHF1ZXN0aW9ucy4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGlzIGF2YWlsYWJsZSB1bmRlciBhbmQgZ292ZXJuZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiBIb3dldmVyLCB0aGUgZm9sbG93aW5nIG5vdGljZSBhY2NvbXBhbmllZCB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGlzCisgKiBmaWxlOgorICoKKyAqIEFTTTogYSB2ZXJ5IHNtYWxsIGFuZCBmYXN0IEphdmEgYnl0ZWNvZGUgbWFuaXB1bGF0aW9uIGZyYW1ld29yaworICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMTEgSU5SSUEsIEZyYW5jZSBUZWxlY29tCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2UgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLnV0aWw7CisKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uQXR0cmlidXRlOworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5IYW5kbGU7CitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLkxhYmVsOworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5PcGNvZGVzOworCisvKioKKyAqIEFuIGFic3RyYWN0IGNvbnZlcnRlciBmcm9tIHZpc2l0IGV2ZW50cyB0byB0ZXh0LgorICoKKyAqIEBhdXRob3IgRXJpYyBCcnVuZXRvbgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJpbnRlciB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZXMgb2YgdGhlIEphdmEgVmlydHVhbCBNYWNoaW5lIG9wY29kZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBPUENPREVTOworCisgICAgLyoqCisgICAgICogVGhlIG5hbWVzIG9mIHRoZSBmb3IgPGNvZGU+b3BlcmFuZDwvY29kZT4gcGFyYW1ldGVyIHZhbHVlcyBvZiB0aGUKKyAgICAgKiB7QGxpbmsgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLk1ldGhvZFZpc2l0b3IjdmlzaXRJbnRJbnNufSBtZXRob2Qgd2hlbgorICAgICAqIDxjb2RlPm9wY29kZTwvY29kZT4gaXMgPGNvZGU+TkVXQVJSQVk8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gVFlQRVM7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZXMgb2YgdGhlIDxjb2RlPnRhZzwvY29kZT4gZmllbGQgdmFsdWVzIGZvcgorICAgICAqIHtAbGluayBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uSGFuZGxlfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEhBTkRMRV9UQUc7CisKKyAgICBzdGF0aWMgeworICAgICAgICBTdHJpbmcgcyA9ICJOT1AsQUNPTlNUX05VTEwsSUNPTlNUX00xLElDT05TVF8wLElDT05TVF8xLElDT05TVF8yLCIKKyAgICAgICAgICAgICAgICArICJJQ09OU1RfMyxJQ09OU1RfNCxJQ09OU1RfNSxMQ09OU1RfMCxMQ09OU1RfMSxGQ09OU1RfMCwiCisgICAgICAgICAgICAgICAgKyAiRkNPTlNUXzEsRkNPTlNUXzIsRENPTlNUXzAsRENPTlNUXzEsQklQVVNILFNJUFVTSCxMREMsLCwiCisgICAgICAgICAgICAgICAgKyAiSUxPQUQsTExPQUQsRkxPQUQsRExPQUQsQUxPQUQsLCwsLCwsLCwsLCwsLCwsLCwsLCxJQUxPQUQsIgorICAgICAgICAgICAgICAgICsgIkxBTE9BRCxGQUxPQUQsREFMT0FELEFBTE9BRCxCQUxPQUQsQ0FMT0FELFNBTE9BRCxJU1RPUkUsIgorICAgICAgICAgICAgICAgICsgIkxTVE9SRSxGU1RPUkUsRFNUT1JFLEFTVE9SRSwsLCwsLCwsLCwsLCwsLCwsLCwsLElBU1RPUkUsIgorICAgICAgICAgICAgICAgICsgIkxBU1RPUkUsRkFTVE9SRSxEQVNUT1JFLEFBU1RPUkUsQkFTVE9SRSxDQVNUT1JFLFNBU1RPUkUsUE9QLCIKKyAgICAgICAgICAgICAgICArICJQT1AyLERVUCxEVVBfWDEsRFVQX1gyLERVUDIsRFVQMl9YMSxEVVAyX1gyLFNXQVAsSUFERCxMQURELCIKKyAgICAgICAgICAgICAgICArICJGQURELERBREQsSVNVQixMU1VCLEZTVUIsRFNVQixJTVVMLExNVUwsRk1VTCxETVVMLElESVYsTERJViwiCisgICAgICAgICAgICAgICAgKyAiRkRJVixERElWLElSRU0sTFJFTSxGUkVNLERSRU0sSU5FRyxMTkVHLEZORUcsRE5FRyxJU0hMLExTSEwsIgorICAgICAgICAgICAgICAgICsgIklTSFIsTFNIUixJVVNIUixMVVNIUixJQU5ELExBTkQsSU9SLExPUixJWE9SLExYT1IsSUlOQyxJMkwsIgorICAgICAgICAgICAgICAgICsgIkkyRixJMkQsTDJJLEwyRixMMkQsRjJJLEYyTCxGMkQsRDJJLEQyTCxEMkYsSTJCLEkyQyxJMlMsTENNUCwiCisgICAgICAgICAgICAgICAgKyAiRkNNUEwsRkNNUEcsRENNUEwsRENNUEcsSUZFUSxJRk5FLElGTFQsSUZHRSxJRkdULElGTEUsIgorICAgICAgICAgICAgICAgICsgIklGX0lDTVBFUSxJRl9JQ01QTkUsSUZfSUNNUExULElGX0lDTVBHRSxJRl9JQ01QR1QsSUZfSUNNUExFLCIKKyAgICAgICAgICAgICAgICArICJJRl9BQ01QRVEsSUZfQUNNUE5FLEdPVE8sSlNSLFJFVCxUQUJMRVNXSVRDSCxMT09LVVBTV0lUQ0gsIgorICAgICAgICAgICAgICAgICsgIklSRVRVUk4sTFJFVFVSTixGUkVUVVJOLERSRVRVUk4sQVJFVFVSTixSRVRVUk4sR0VUU1RBVElDLCIKKyAgICAgICAgICAgICAgICArICJQVVRTVEFUSUMsR0VURklFTEQsUFVURklFTEQsSU5WT0tFVklSVFVBTCxJTlZPS0VTUEVDSUFMLCIKKyAgICAgICAgICAgICAgICArICJJTlZPS0VTVEFUSUMsSU5WT0tFSU5URVJGQUNFLElOVk9LRURZTkFNSUMsTkVXLE5FV0FSUkFZLCIKKyAgICAgICAgICAgICAgICArICJBTkVXQVJSQVksQVJSQVlMRU5HVEgsQVRIUk9XLENIRUNLQ0FTVCxJTlNUQU5DRU9GLCIKKyAgICAgICAgICAgICAgICArICJNT05JVE9SRU5URVIsTU9OSVRPUkVYSVQsLE1VTFRJQU5FV0FSUkFZLElGTlVMTCxJRk5PTk5VTEwsIjsKKyAgICAgICAgT1BDT0RFUyA9IG5ldyBTdHJpbmdbMjAwXTsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICBpbnQgaiA9IDA7CisgICAgICAgIGludCBsOworICAgICAgICB3aGlsZSAoKGwgPSBzLmluZGV4T2YoJywnLCBqKSkgPiAwKSB7CisgICAgICAgICAgICBPUENPREVTW2krK10gPSBqICsgMSA9PSBsID8gbnVsbCA6IHMuc3Vic3RyaW5nKGosIGwpOworICAgICAgICAgICAgaiA9IGwgKyAxOworICAgICAgICB9CisKKyAgICAgICAgcyA9ICJUX0JPT0xFQU4sVF9DSEFSLFRfRkxPQVQsVF9ET1VCTEUsVF9CWVRFLFRfU0hPUlQsVF9JTlQsVF9MT05HLCI7CisgICAgICAgIFRZUEVTID0gbmV3IFN0cmluZ1sxMl07CisgICAgICAgIGogPSAwOworICAgICAgICBpID0gNDsKKyAgICAgICAgd2hpbGUgKChsID0gcy5pbmRleE9mKCcsJywgaikpID4gMCkgeworICAgICAgICAgICAgVFlQRVNbaSsrXSA9IHMuc3Vic3RyaW5nKGosIGwpOworICAgICAgICAgICAgaiA9IGwgKyAxOworICAgICAgICB9CisKKyAgICAgICAgcyA9ICJIX0dFVEZJRUxELEhfR0VUU1RBVElDLEhfUFVURklFTEQsSF9QVVRTVEFUSUMsIgorICAgICAgICAgICsgIkhfSU5WT0tFVklSVFVBTCxIX0lOVk9LRVNUQVRJQyxIX0lOVk9LRVNQRUNJQUwsIgorICAgICAgICAgICsgIkhfTkVXSU5WT0tFU1BFQ0lBTCxIX0lOVk9LRUlOVEVSRkFDRSwiOworICAgICAgICBIQU5ETEVfVEFHID0gbmV3IFN0cmluZ1sxMF07CisgICAgICAgIGogPSAwOworICAgICAgICBpID0gMTsKKyAgICAgICAgd2hpbGUgKChsID0gcy5pbmRleE9mKCcsJywgaikpID4gMCkgeworICAgICAgICAgICAgSEFORExFX1RBR1tpKytdID0gcy5zdWJzdHJpbmcoaiwgbCk7CisgICAgICAgICAgICBqID0gbCArIDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgQVNNIEFQSSB2ZXJzaW9uIGltcGxlbWVudGVkIGJ5IHRoaXMgY2xhc3MuIFRoZSB2YWx1ZSBvZiB0aGlzIGZpZWxkCisgICAgICogbXVzdCBiZSBvbmUgb2Yge0BsaW5rIE9wY29kZXMjQVNNNH0uCisgICAgICovCisgICAgcHJvdGVjdGVkIGZpbmFsIGludCBhcGk7CisKKyAgICAvKioKKyAgICAgKiBBIGJ1ZmZlciB0aGF0IGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBzdHJpbmdzLgorICAgICAqLworICAgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmdCdWZmZXIgYnVmOworCisgICAgLyoqCisgICAgICogVGhlIHRleHQgdG8gYmUgcHJpbnRlZC4gU2luY2UgdGhlIGNvZGUgb2YgbWV0aG9kcyBpcyBub3QgbmVjZXNzYXJpbHkKKyAgICAgKiB2aXNpdGVkIGluIHNlcXVlbnRpYWwgb3JkZXIsIG9uZSBtZXRob2QgYWZ0ZXIgdGhlIG90aGVyLCBidXQgY2FuIGJlCisgICAgICogaW50ZXJsYWNlZCAoc29tZSBpbnN0cnVjdGlvbnMgZnJvbSBtZXRob2Qgb25lLCB0aGVuIHNvbWUgaW5zdHJ1Y3Rpb25zCisgICAgICogZnJvbSBtZXRob2QgdHdvLCB0aGVuIHNvbWUgaW5zdHJ1Y3Rpb25zIGZyb20gbWV0aG9kIG9uZSBhZ2Fpbi4uLiksIGl0IGlzCisgICAgICogbm90IHBvc3NpYmxlIHRvIHByaW50IHRoZSB2aXNpdGVkIGluc3RydWN0aW9ucyBkaXJlY3RseSB0byBhIHNlcXVlbnRpYWwKKyAgICAgKiBzdHJlYW0uIEEgY2xhc3MgaXMgdGhlcmVmb3JlIHByaW50ZWQgaW4gYSB0d28gc3RlcHMgcHJvY2VzczogYSBzdHJpbmcKKyAgICAgKiB0cmVlIGlzIGNvbnN0cnVjdGVkIGR1cmluZyB0aGUgdmlzaXQsIGFuZCBwcmludGVkIHRvIGEgc2VxdWVudGlhbCBzdHJlYW0KKyAgICAgKiBhdCB0aGUgZW5kIG9mIHRoZSB2aXNpdC4gVGhpcyBzdHJpbmcgdHJlZSBpcyBzdG9yZWQgaW4gdGhpcyBmaWVsZCwgYXMgYQorICAgICAqIHN0cmluZyBsaXN0IHRoYXQgY2FuIGNvbnRhaW4gb3RoZXIgc3RyaW5nIGxpc3RzLCB3aGljaCBjYW4gdGhlbXNlbHZlcworICAgICAqIGNvbnRhaW4gb3RoZXIgc3RyaW5nIGxpc3RzLCBhbmQgc28gb24uCisgICAgICovCisgICAgcHVibGljIGZpbmFsIExpc3Q8T2JqZWN0PiB0ZXh0OworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGxpbmsgUHJpbnRlcn0uCisgICAgICovCisgICAgcHJvdGVjdGVkIFByaW50ZXIoZmluYWwgaW50IGFwaSkgeworICAgICAgICB0aGlzLmFwaSA9IGFwaTsKKyAgICAgICAgdGhpcy5idWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIHRoaXMudGV4dCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsYXNzIGhlYWRlci4KKyAgICAgKiBTZWUge0BsaW5rIGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5DbGFzc1Zpc2l0b3IjdmlzaXR9LgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHZpc2l0KAorICAgICAgICBmaW5hbCBpbnQgdmVyc2lvbiwKKyAgICAgICAgZmluYWwgaW50IGFjY2VzcywKKyAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUsCisgICAgICAgIGZpbmFsIFN0cmluZyBzaWduYXR1cmUsCisgICAgICAgIGZpbmFsIFN0cmluZyBzdXBlck5hbWUsCisgICAgICAgIGZpbmFsIFN0cmluZ1tdIGludGVyZmFjZXMpOworCisgICAgLyoqCisgICAgICogQ2xhc3Mgc291cmNlLgorICAgICAqIFNlZSB7QGxpbmsgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLkNsYXNzVmlzaXRvciN2aXNpdFNvdXJjZX0uCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgdmlzaXRTb3VyY2UoZmluYWwgU3RyaW5nIGZpbGUsIGZpbmFsIFN0cmluZyBkZWJ1Zyk7CisKKyAgICAvKioKKyAgICAgKiBDbGFzcyBvdXRlciBjbGFzcy4KKyAgICAgKiBTZWUge0BsaW5rIGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5DbGFzc1Zpc2l0b3IjdmlzaXRPdXRlckNsYXNzfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB2aXNpdE91dGVyQ2xhc3MoCisgICAgICAgIGZpbmFsIFN0cmluZyBvd25lciwKKyAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUsCisgICAgICAgIGZpbmFsIFN0cmluZyBkZXNjKTsKKworICAgIC8qKgorICAgICAqIENsYXNzIGFubm90YXRpb24uCisgICAgICogU2VlIHtAbGluayBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uQ2xhc3NWaXNpdG9yI3Zpc2l0QW5ub3RhdGlvbn0uCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFByaW50ZXIgdmlzaXRDbGFzc0Fubm90YXRpb24oCisgICAgICAgIGZpbmFsIFN0cmluZyBkZXNjLAorICAgICAgICBmaW5hbCBib29sZWFuIHZpc2libGUpOworCisgICAgLyoqCisgICAgICogQ2xhc3MgYXR0cmlidXRlLgorICAgICAqIFNlZSB7QGxpbmsgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLkNsYXNzVmlzaXRvciN2aXNpdEF0dHJpYnV0ZX0uCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgdmlzaXRDbGFzc0F0dHJpYnV0ZShmaW5hbCBBdHRyaWJ1dGUgYXR0cik7CisKKyAgICAvKioKKyAgICAgKiBDbGFzcyBpbm5lciBuYW1lLgorICAgICAqIFNlZSB7QGxpbmsgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLkNsYXNzVmlzaXRvciN2aXNpdElubmVyQ2xhc3N9LgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHZpc2l0SW5uZXJDbGFzcygKKyAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUsCisgICAgICAgIGZpbmFsIFN0cmluZyBvdXRlck5hbWUsCisgICAgICAgIGZpbmFsIFN0cmluZyBpbm5lck5hbWUsCisgICAgICAgIGZpbmFsIGludCBhY2Nlc3MpOworCisgICAgLyoqCisgICAgICogQ2xhc3MgZmllbGQuCisgICAgICogU2VlIHtAbGluayBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uQ2xhc3NWaXNpdG9yI3Zpc2l0RmllbGR9LgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBQcmludGVyIHZpc2l0RmllbGQoCisgICAgICAgIGZpbmFsIGludCBhY2Nlc3MsCisgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lLAorICAgICAgICBmaW5hbCBTdHJpbmcgZGVzYywKKyAgICAgICAgZmluYWwgU3RyaW5nIHNpZ25hdHVyZSwKKyAgICAgICAgZmluYWwgT2JqZWN0IHZhbHVlKTsKKworICAgIC8qKgorICAgICAqIENsYXNzIG1ldGhvZC4KKyAgICAgKiBTZWUge0BsaW5rIGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5DbGFzc1Zpc2l0b3IjdmlzaXRNZXRob2R9LgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBQcmludGVyIHZpc2l0TWV0aG9kKAorICAgICAgICBmaW5hbCBpbnQgYWNjZXNzLAorICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSwKKyAgICAgICAgZmluYWwgU3RyaW5nIGRlc2MsCisgICAgICAgIGZpbmFsIFN0cmluZyBzaWduYXR1cmUsCisgICAgICAgIGZpbmFsIFN0cmluZ1tdIGV4Y2VwdGlvbnMpOworCisgICAgLyoqCisgICAgICogQ2xhc3MgZW5kLgorICAgICAqIFNlZSB7QGxpbmsgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLkNsYXNzVmlzaXRvciN2aXNpdEVuZH0uCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgdmlzaXRDbGFzc0VuZCgpOworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gQW5ub3RhdGlvbnMKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8qKgorICAgICAqIEFubm90YXRpb24gdmFsdWUuCisgICAgICogU2VlIHtAbGluayBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uQW5ub3RhdGlvblZpc2l0b3IjdmlzaXR9LgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHZpc2l0KGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBPYmplY3QgdmFsdWUpOworCisgICAgLyoqCisgICAgICogQW5ub3RhdGlvbiBlbnVtIHZhbHVlLgorICAgICAqIFNlZSB7QGxpbmsgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLkFubm90YXRpb25WaXNpdG9yI3Zpc2l0RW51bX0uCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgdmlzaXRFbnVtKAorICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSwKKyAgICAgICAgZmluYWwgU3RyaW5nIGRlc2MsCisgICAgICAgIGZpbmFsIFN0cmluZyB2YWx1ZSk7CisKKyAgICAvKioKKyAgICAgKiBOZXN0ZWQgYW5ub3RhdGlvbiB2YWx1ZS4KKyAgICAgKiBTZWUge0BsaW5rIGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5Bbm5vdGF0aW9uVmlzaXRvciN2aXNpdEFubm90YXRpb259LgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBQcmludGVyIHZpc2l0QW5ub3RhdGlvbigKKyAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUsCisgICAgICAgIGZpbmFsIFN0cmluZyBkZXNjKTsKKworICAgIC8qKgorICAgICAqIEFubm90YXRpb24gYXJyYXkgdmFsdWUuCisgICAgICogU2VlIHtAbGluayBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uQW5ub3RhdGlvblZpc2l0b3IjdmlzaXRBcnJheX0uCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFByaW50ZXIgdmlzaXRBcnJheShmaW5hbCBTdHJpbmcgbmFtZSk7CisKKyAgICAvKioKKyAgICAgKiBBbm5vdGF0aW9uIGVuZC4KKyAgICAgKiBTZWUge0BsaW5rIGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5Bbm5vdGF0aW9uVmlzaXRvciN2aXNpdEVuZH0uCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgdmlzaXRBbm5vdGF0aW9uRW5kKCk7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBGaWVsZHMKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8qKgorICAgICAqIEZpZWxkIGFubm90YXRpb24uCisgICAgICogU2VlIHtAbGluayBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uRmllbGRWaXNpdG9yI3Zpc2l0QW5ub3RhdGlvbn0uCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFByaW50ZXIgdmlzaXRGaWVsZEFubm90YXRpb24oCisgICAgICAgIGZpbmFsIFN0cmluZyBkZXNjLAorICAgICAgICBmaW5hbCBib29sZWFuIHZpc2libGUpOworCisgICAgLyoqCisgICAgICogRmllbGQgYXR0cmlidXRlLgorICAgICAqIFNlZSB7QGxpbmsgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLkZpZWxkVmlzaXRvciN2aXNpdEF0dHJpYnV0ZX0uCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgdmlzaXRGaWVsZEF0dHJpYnV0ZShmaW5hbCBBdHRyaWJ1dGUgYXR0cik7CisKKyAgICAvKioKKyAgICAgKiBGaWVsZCBlbmQuCisgICAgICogU2VlIHtAbGluayBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uRmllbGRWaXNpdG9yI3Zpc2l0RW5kfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB2aXNpdEZpZWxkRW5kKCk7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBNZXRob2RzCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvKioKKyAgICAgKiBNZXRob2QgZGVmYXVsdCBhbm5vdGF0aW9uLgorICAgICAqIFNlZSB7QGxpbmsgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLk1ldGhvZFZpc2l0b3IjdmlzaXRBbm5vdGF0aW9uRGVmYXVsdH0uCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFByaW50ZXIgdmlzaXRBbm5vdGF0aW9uRGVmYXVsdCgpOworCisgICAgLyoqCisgICAgICogTWV0aG9kIGFubm90YXRpb24uCisgICAgICogU2VlIHtAbGluayBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uTWV0aG9kVmlzaXRvciN2aXNpdEFubm90YXRpb259LgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBQcmludGVyIHZpc2l0TWV0aG9kQW5ub3RhdGlvbigKKyAgICAgICAgZmluYWwgU3RyaW5nIGRlc2MsCisgICAgICAgIGZpbmFsIGJvb2xlYW4gdmlzaWJsZSk7CisKKyAgICAvKioKKyAgICAgKiBNZXRob2QgcGFyYW1ldGVyIGFubm90YXRpb24uCisgICAgICogU2VlIHtAbGluayBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uTWV0aG9kVmlzaXRvciN2aXNpdFBhcmFtZXRlckFubm90YXRpb259LgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBQcmludGVyIHZpc2l0UGFyYW1ldGVyQW5ub3RhdGlvbigKKyAgICAgICAgZmluYWwgaW50IHBhcmFtZXRlciwKKyAgICAgICAgZmluYWwgU3RyaW5nIGRlc2MsCisgICAgICAgIGZpbmFsIGJvb2xlYW4gdmlzaWJsZSk7CisKKyAgICAvKioKKyAgICAgKiBNZXRob2QgYXR0cmlidXRlLgorICAgICAqIFNlZSB7QGxpbmsgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLk1ldGhvZFZpc2l0b3IjdmlzaXRBdHRyaWJ1dGV9LgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHZpc2l0TWV0aG9kQXR0cmlidXRlKGZpbmFsIEF0dHJpYnV0ZSBhdHRyKTsKKworICAgIC8qKgorICAgICAqIE1ldGhvZCBzdGFydC4KKyAgICAgKiBTZWUge0BsaW5rIGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5NZXRob2RWaXNpdG9yI3Zpc2l0Q29kZX0uCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgdmlzaXRDb2RlKCk7CisKKyAgICAvKioKKyAgICAgKiBNZXRob2Qgc3RhY2sgZnJhbWUuCisgICAgICogU2VlIHtAbGluayBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uTWV0aG9kVmlzaXRvciN2aXNpdEZyYW1lfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB2aXNpdEZyYW1lKAorICAgICAgICBmaW5hbCBpbnQgdHlwZSwKKyAgICAgICAgZmluYWwgaW50IG5Mb2NhbCwKKyAgICAgICAgZmluYWwgT2JqZWN0W10gbG9jYWwsCisgICAgICAgIGZpbmFsIGludCBuU3RhY2ssCisgICAgICAgIGZpbmFsIE9iamVjdFtdIHN0YWNrKTsKKworICAgIC8qKgorICAgICAqIE1ldGhvZCBpbnN0cnVjdGlvbi4KKyAgICAgKiBTZWUge0BsaW5rIGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5NZXRob2RWaXNpdG9yI3Zpc2l0SW5zbn0uCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgdmlzaXRJbnNuKGZpbmFsIGludCBvcGNvZGUpOworCisgICAgLyoqCisgICAgICogTWV0aG9kIGluc3RydWN0aW9uLgorICAgICAqIFNlZSB7QGxpbmsgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLk1ldGhvZFZpc2l0b3IjdmlzaXRJbnRJbnNufS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB2aXNpdEludEluc24oZmluYWwgaW50IG9wY29kZSwgZmluYWwgaW50IG9wZXJhbmQpOworCisgICAgLyoqCisgICAgICogTWV0aG9kIGluc3RydWN0aW9uLgorICAgICAqIFNlZSB7QGxpbmsgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLk1ldGhvZFZpc2l0b3IjdmlzaXRWYXJJbnNufS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB2aXNpdFZhckluc24oZmluYWwgaW50IG9wY29kZSwgZmluYWwgaW50IHZhcik7CisKKyAgICAvKioKKyAgICAgKiBNZXRob2QgaW5zdHJ1Y3Rpb24uCisgICAgICogU2VlIHtAbGluayBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uTWV0aG9kVmlzaXRvciN2aXNpdFR5cGVJbnNufS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB2aXNpdFR5cGVJbnNuKGZpbmFsIGludCBvcGNvZGUsIGZpbmFsIFN0cmluZyB0eXBlKTsKKworICAgIC8qKgorICAgICAqIE1ldGhvZCBpbnN0cnVjdGlvbi4KKyAgICAgKiBTZWUge0BsaW5rIGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5NZXRob2RWaXNpdG9yI3Zpc2l0RmllbGRJbnNufS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB2aXNpdEZpZWxkSW5zbigKKyAgICAgICAgZmluYWwgaW50IG9wY29kZSwKKyAgICAgICAgZmluYWwgU3RyaW5nIG93bmVyLAorICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSwKKyAgICAgICAgZmluYWwgU3RyaW5nIGRlc2MpOworCisgICAgLyoqCisgICAgICogTWV0aG9kIGluc3RydWN0aW9uLgorICAgICAqIFNlZSB7QGxpbmsgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLk1ldGhvZFZpc2l0b3IjdmlzaXRNZXRob2RJbnNufS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB2aXNpdE1ldGhvZEluc24oCisgICAgICAgIGZpbmFsIGludCBvcGNvZGUsCisgICAgICAgIGZpbmFsIFN0cmluZyBvd25lciwKKyAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUsCisgICAgICAgIGZpbmFsIFN0cmluZyBkZXNjKTsKKworICAgIC8qKgorICAgICAqIE1ldGhvZCBpbnN0cnVjdGlvbi4KKyAgICAgKiBTZWUge0BsaW5rIGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5NZXRob2RWaXNpdG9yI3Zpc2l0SW52b2tlRHluYW1pY0luc259LgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHZpc2l0SW52b2tlRHluYW1pY0luc24oCisgICAgICAgIFN0cmluZyBuYW1lLAorICAgICAgICBTdHJpbmcgZGVzYywKKyAgICAgICAgSGFuZGxlIGJzbSwKKyAgICAgICAgT2JqZWN0Li4uIGJzbUFyZ3MpOworCisgICAgLyoqCisgICAgICogTWV0aG9kIGluc3RydWN0aW9uLgorICAgICAqIFNlZSB7QGxpbmsgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLk1ldGhvZFZpc2l0b3IjdmlzaXRKdW1wSW5zbn0uCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgdmlzaXRKdW1wSW5zbihmaW5hbCBpbnQgb3Bjb2RlLCBmaW5hbCBMYWJlbCBsYWJlbCk7CisKKyAgICAvKioKKyAgICAgKiBNZXRob2QgbGFiZWwuCisgICAgICogU2VlIHtAbGluayBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uTWV0aG9kVmlzaXRvciN2aXNpdExhYmVsfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB2aXNpdExhYmVsKGZpbmFsIExhYmVsIGxhYmVsKTsKKworICAgIC8qKgorICAgICAqIE1ldGhvZCBpbnN0cnVjdGlvbi4KKyAgICAgKiBTZWUge0BsaW5rIGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5NZXRob2RWaXNpdG9yI3Zpc2l0TGRjSW5zbn0uCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgdmlzaXRMZGNJbnNuKGZpbmFsIE9iamVjdCBjc3QpOworCisgICAgLyoqCisgICAgICogTWV0aG9kIGluc3RydWN0aW9uLgorICAgICAqIFNlZSB7QGxpbmsgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLk1ldGhvZFZpc2l0b3IjdmlzaXRJaW5jSW5zbn0uCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgdmlzaXRJaW5jSW5zbihmaW5hbCBpbnQgdmFyLCBmaW5hbCBpbnQgaW5jcmVtZW50KTsKKworICAgIC8qKgorICAgICAqIE1ldGhvZCBpbnN0cnVjdGlvbi4KKyAgICAgKiBTZWUge0BsaW5rIGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5NZXRob2RWaXNpdG9yI3Zpc2l0VGFibGVTd2l0Y2hJbnNufS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB2aXNpdFRhYmxlU3dpdGNoSW5zbigKKyAgICAgICAgZmluYWwgaW50IG1pbiwKKyAgICAgICAgZmluYWwgaW50IG1heCwKKyAgICAgICAgZmluYWwgTGFiZWwgZGZsdCwKKyAgICAgICAgZmluYWwgTGFiZWwuLi4gbGFiZWxzKTsKKworICAgIC8qKgorICAgICAqIE1ldGhvZCBpbnN0cnVjdGlvbi4KKyAgICAgKiBTZWUge0BsaW5rIGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5NZXRob2RWaXNpdG9yI3Zpc2l0TG9va3VwU3dpdGNoSW5zbn0uCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgdmlzaXRMb29rdXBTd2l0Y2hJbnNuKAorICAgICAgICBmaW5hbCBMYWJlbCBkZmx0LAorICAgICAgICBmaW5hbCBpbnRbXSBrZXlzLAorICAgICAgICBmaW5hbCBMYWJlbFtdIGxhYmVscyk7CisKKyAgICAvKioKKyAgICAgKiBNZXRob2QgaW5zdHJ1Y3Rpb24uCisgICAgICogU2VlIHtAbGluayBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uTWV0aG9kVmlzaXRvciN2aXNpdE11bHRpQU5ld0FycmF5SW5zbn0uCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgdmlzaXRNdWx0aUFOZXdBcnJheUluc24oCisgICAgICAgIGZpbmFsIFN0cmluZyBkZXNjLAorICAgICAgICBmaW5hbCBpbnQgZGltcyk7CisKKyAgICAvKioKKyAgICAgKiBNZXRob2QgZXhjZXB0aW9uIGhhbmRsZXIuCisgICAgICogU2VlIHtAbGluayBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uTWV0aG9kVmlzaXRvciN2aXNpdFRyeUNhdGNoQmxvY2t9LgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHZpc2l0VHJ5Q2F0Y2hCbG9jaygKKyAgICAgICAgZmluYWwgTGFiZWwgc3RhcnQsCisgICAgICAgIGZpbmFsIExhYmVsIGVuZCwKKyAgICAgICAgZmluYWwgTGFiZWwgaGFuZGxlciwKKyAgICAgICAgZmluYWwgU3RyaW5nIHR5cGUpOworCisgICAgLyoqCisgICAgICogTWV0aG9kIGRlYnVnIGluZm8uCisgICAgICogU2VlIHtAbGluayBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uTWV0aG9kVmlzaXRvciN2aXNpdExvY2FsVmFyaWFibGV9LgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHZpc2l0TG9jYWxWYXJpYWJsZSgKKyAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUsCisgICAgICAgIGZpbmFsIFN0cmluZyBkZXNjLAorICAgICAgICBmaW5hbCBTdHJpbmcgc2lnbmF0dXJlLAorICAgICAgICBmaW5hbCBMYWJlbCBzdGFydCwKKyAgICAgICAgZmluYWwgTGFiZWwgZW5kLAorICAgICAgICBmaW5hbCBpbnQgaW5kZXgpOworCisgICAgLyoqCisgICAgICogTWV0aG9kIGRlYnVnIGluZm8uCisgICAgICogU2VlIHtAbGluayBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uTWV0aG9kVmlzaXRvciN2aXNpdExpbmVOdW1iZXJ9LgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHZpc2l0TGluZU51bWJlcihmaW5hbCBpbnQgbGluZSwgZmluYWwgTGFiZWwgc3RhcnQpOworCisgICAgLyoqCisgICAgICogTWV0aG9kIG1heCBzdGFjayBhbmQgbWF4IGxvY2Fscy4KKyAgICAgKiBTZWUge0BsaW5rIGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5NZXRob2RWaXNpdG9yI3Zpc2l0TWF4c30uCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgdmlzaXRNYXhzKGZpbmFsIGludCBtYXhTdGFjaywgZmluYWwgaW50IG1heExvY2Fscyk7CisKKyAgICAvKioKKyAgICAgKiBNZXRob2QgZW5kLgorICAgICAqIFNlZSB7QGxpbmsgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLk1ldGhvZFZpc2l0b3IjdmlzaXRFbmR9LgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHZpc2l0TWV0aG9kRW5kKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB0ZXh0IGNvbnN0cnVjdGVkIGJ5IHRoaXMgdmlzaXRvci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHRleHQgY29uc3RydWN0ZWQgYnkgdGhpcyB2aXNpdG9yLgorICAgICAqLworICAgIHB1YmxpYyBMaXN0PE9iamVjdD4gZ2V0VGV4dCgpIHsKKyAgICAgICAgcmV0dXJuIHRleHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJpbnRzIHRoZSB0ZXh0IGNvbnN0cnVjdGVkIGJ5IHRoaXMgdmlzaXRvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwdyB0aGUgcHJpbnQgd3JpdGVyIHRvIGJlIHVzZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJpbnQoZmluYWwgUHJpbnRXcml0ZXIgcHcpIHsKKyAgICAgICAgcHJpbnRMaXN0KHB3LCB0ZXh0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBcHBlbmRzIGEgcXVvdGVkIHN0cmluZyB0byBhIGdpdmVuIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBidWYgdGhlIGJ1ZmZlciB3aGVyZSB0aGUgc3RyaW5nIG11c3QgYmUgYWRkZWQuCisgICAgICogQHBhcmFtIHMgdGhlIHN0cmluZyB0byBiZSBhZGRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYXBwZW5kU3RyaW5nKGZpbmFsIFN0cmluZ0J1ZmZlciBidWYsIGZpbmFsIFN0cmluZyBzKSB7CisgICAgICAgIGJ1Zi5hcHBlbmQoJ1wiJyk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcy5sZW5ndGgoKTsgKytpKSB7CisgICAgICAgICAgICBjaGFyIGMgPSBzLmNoYXJBdChpKTsKKyAgICAgICAgICAgIGlmIChjID09ICdcbicpIHsKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCJcXG4iKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnXHInKSB7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiXFxyIik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJ1xcJykgeworICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIlxcXFwiKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnIicpIHsKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCJcXFwiIik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPCAweDIwIHx8IGMgPiAweDdmKSB7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiXFx1Iik7CisgICAgICAgICAgICAgICAgaWYgKGMgPCAweDEwKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIjAwMCIpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA8IDB4MTAwKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIjAwIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjIDwgMHgxMDAwKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoJzAnKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChJbnRlZ2VyLnRvU3RyaW5nKGMsIDE2KSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoYyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnVmLmFwcGVuZCgnXCInKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmludHMgdGhlIGdpdmVuIHN0cmluZyB0cmVlLgorICAgICAqCisgICAgICogQHBhcmFtIHB3IHRoZSB3cml0ZXIgdG8gYmUgdXNlZCB0byBwcmludCB0aGUgdHJlZS4KKyAgICAgKiBAcGFyYW0gbCBhIHN0cmluZyB0cmVlLCBpLmUuLCBhIHN0cmluZyBsaXN0IHRoYXQgY2FuIGNvbnRhaW4gb3RoZXIgc3RyaW5nCisgICAgICogICAgICAgIGxpc3RzLCBhbmQgc28gb24gcmVjdXJzaXZlbHkuCisgICAgICovCisgICAgc3RhdGljIHZvaWQgcHJpbnRMaXN0KGZpbmFsIFByaW50V3JpdGVyIHB3LCBmaW5hbCBMaXN0PD8+IGwpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBPYmplY3QgbyA9IGwuZ2V0KGkpOworICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBMaXN0KSB7CisgICAgICAgICAgICAgICAgcHJpbnRMaXN0KHB3LCAoTGlzdDw/Pikgbyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHB3LnByaW50KG8udG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL3V0aWwvVGV4dGlmaWFibGUuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vdXRpbC9UZXh0aWZpYWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhNzg5OTgKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL3V0aWwvVGV4dGlmaWFibGUuamF2YQpAQCAtMCwwICsxLDgzIEBACisvKgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBPcmFjbGUgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKKyAqIHF1ZXN0aW9ucy4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGlzIGF2YWlsYWJsZSB1bmRlciBhbmQgZ292ZXJuZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiBIb3dldmVyLCB0aGUgZm9sbG93aW5nIG5vdGljZSBhY2NvbXBhbmllZCB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGlzCisgKiBmaWxlOgorICoKKyAqIEFTTTogYSB2ZXJ5IHNtYWxsIGFuZCBmYXN0IEphdmEgYnl0ZWNvZGUgbWFuaXB1bGF0aW9uIGZyYW1ld29yaworICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMTEgSU5SSUEsIEZyYW5jZSBUZWxlY29tCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2UgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLnV0aWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLkxhYmVsOworCisvKioKKyAqIEFuIHtAbGluayBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uQXR0cmlidXRlIEF0dHJpYnV0ZX0gdGhhdCBjYW4gcHJpbnQgYSByZWFkYWJsZQorICogcmVwcmVzZW50YXRpb24gb2YgaXRzZWxmLgorICoKKyAqIEltcGxlbWVudGF0aW9ucyBzaG91bGQgY29uc3RydWN0IHJlYWRhYmxlIG91dHB1dCBmcm9tIGFuIGF0dHJpYnV0ZSBkYXRhCisgKiBzdHJ1Y3R1cmUuIFN1Y2ggcmVwcmVzZW50YXRpb24gY291bGQgYmUgdXNlZCBpbiB1bml0IHRlc3QgYXNzZXJ0aW9ucy4KKyAqCisgKiBAYXV0aG9yIEV1Z2VuZSBLdWxlc2hvdgorICovCitwdWJsaWMgaW50ZXJmYWNlIFRleHRpZmlhYmxlIHsKKworICAgIC8qKgorICAgICAqIEJ1aWxkIGEgaHVtYW4gcmVhZGFibGUgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBhdHRyaWJ1dGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYnVmIGEgYnVmZmVyIHVzZWQgZm9yIHByaW50aW5nIEphdmEgY29kZS4KKyAgICAgKiBAcGFyYW0gbGFiZWxOYW1lcyBtYXAgb2YgbGFiZWwgaW5zdGFuY2VzIHRvIHRoZWlyIG5hbWVzLgorICAgICAqLworICAgIHZvaWQgdGV4dGlmeShTdHJpbmdCdWZmZXIgYnVmLCBNYXA8TGFiZWwsIFN0cmluZz4gbGFiZWxOYW1lcyk7Cit9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL3V0aWwvVGV4dGlmaWVyLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL3V0aWwvVGV4dGlmaWVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk2ZDI0MQotLS0gL2Rldi9udWxsCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vdXRpbC9UZXh0aWZpZXIuamF2YQpAQCAtMCwwICsxLDEzMTUgQEAKKy8qCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IE9yYWNsZSBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQorICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQorICogcXVlc3Rpb25zLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgaXMgYXZhaWxhYmxlIHVuZGVyIGFuZCBnb3Zlcm5lZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIEhvd2V2ZXIsIHRoZSBmb2xsb3dpbmcgbm90aWNlIGFjY29tcGFuaWVkIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoaXMKKyAqIGZpbGU6CisgKgorICogQVNNOiBhIHZlcnkgc21hbGwgYW5kIGZhc3QgSmF2YSBieXRlY29kZSBtYW5pcHVsYXRpb24gZnJhbWV3b3JrCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAxMSBJTlJJQSwgRnJhbmNlIFRlbGVjb20KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20udXRpbDsKKworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5BdHRyaWJ1dGU7CitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLkNsYXNzUmVhZGVyOworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5IYW5kbGU7CitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLkxhYmVsOworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5PcGNvZGVzOworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5UeXBlOworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5zaWduYXR1cmUuU2lnbmF0dXJlUmVhZGVyOworCisvKioKKyAqIEEge0BsaW5rIFByaW50ZXJ9IHRoYXQgcHJpbnRzIGEgZGlzYXNzZW1ibGVkIHZpZXcgb2YgdGhlIGNsYXNzZXMgaXQgdmlzaXRzLgorICoKKyAqIEBhdXRob3IgRXJpYyBCcnVuZXRvbgorICovCitwdWJsaWMgY2xhc3MgVGV4dGlmaWVyIGV4dGVuZHMgUHJpbnRlciB7CisKKyAgICAvKioKKyAgICAgKiBDb25zdGFudCB1c2VkIGluIHtAbGluayAjYXBwZW5kRGVzY3JpcHRvciBhcHBlbmREZXNjcmlwdG9yfSBmb3IgaW50ZXJuYWwKKyAgICAgKiB0eXBlIG5hbWVzIGluIGJ5dGVjb2RlIG5vdGF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVSTkFMX05BTUUgPSAwOworCisgICAgLyoqCisgICAgICogQ29uc3RhbnQgdXNlZCBpbiB7QGxpbmsgI2FwcGVuZERlc2NyaXB0b3IgYXBwZW5kRGVzY3JpcHRvcn0gZm9yIGZpZWxkCisgICAgICogZGVzY3JpcHRvcnMsIGZvcm1hdHRlZCBpbiBieXRlY29kZSBub3RhdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJRUxEX0RFU0NSSVBUT1IgPSAxOworCisgICAgLyoqCisgICAgICogQ29uc3RhbnQgdXNlZCBpbiB7QGxpbmsgI2FwcGVuZERlc2NyaXB0b3IgYXBwZW5kRGVzY3JpcHRvcn0gZm9yIGZpZWxkCisgICAgICogc2lnbmF0dXJlcywgZm9ybWF0dGVkIGluIGJ5dGVjb2RlIG5vdGF0aW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklFTERfU0lHTkFUVVJFID0gMjsKKworICAgIC8qKgorICAgICAqIENvbnN0YW50IHVzZWQgaW4ge0BsaW5rICNhcHBlbmREZXNjcmlwdG9yIGFwcGVuZERlc2NyaXB0b3J9IGZvciBtZXRob2QKKyAgICAgKiBkZXNjcmlwdG9ycywgZm9ybWF0dGVkIGluIGJ5dGVjb2RlIG5vdGF0aW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVUSE9EX0RFU0NSSVBUT1IgPSAzOworCisgICAgLyoqCisgICAgICogQ29uc3RhbnQgdXNlZCBpbiB7QGxpbmsgI2FwcGVuZERlc2NyaXB0b3IgYXBwZW5kRGVzY3JpcHRvcn0gZm9yIG1ldGhvZAorICAgICAqIHNpZ25hdHVyZXMsIGZvcm1hdHRlZCBpbiBieXRlY29kZSBub3RhdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FVEhPRF9TSUdOQVRVUkUgPSA0OworCisgICAgLyoqCisgICAgICogQ29uc3RhbnQgdXNlZCBpbiB7QGxpbmsgI2FwcGVuZERlc2NyaXB0b3IgYXBwZW5kRGVzY3JpcHRvcn0gZm9yIGNsYXNzCisgICAgICogc2lnbmF0dXJlcywgZm9ybWF0dGVkIGluIGJ5dGVjb2RlIG5vdGF0aW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xBU1NfU0lHTkFUVVJFID0gNTsKKworICAgIC8qKgorICAgICAqIENvbnN0YW50IHVzZWQgaW4ge0BsaW5rICNhcHBlbmREZXNjcmlwdG9yIGFwcGVuZERlc2NyaXB0b3J9IGZvciBmaWVsZCBvcgorICAgICAqIG1ldGhvZCByZXR1cm4gdmFsdWUgc2lnbmF0dXJlcywgZm9ybWF0dGVkIGluIGRlZmF1bHQgSmF2YSBub3RhdGlvbgorICAgICAqIChub24tYnl0ZWNvZGUpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9ERUNMQVJBVElPTiA9IDY7CisKKyAgICAvKioKKyAgICAgKiBDb25zdGFudCB1c2VkIGluIHtAbGluayAjYXBwZW5kRGVzY3JpcHRvciBhcHBlbmREZXNjcmlwdG9yfSBmb3IgY2xhc3MKKyAgICAgKiBzaWduYXR1cmVzLCBmb3JtYXR0ZWQgaW4gZGVmYXVsdCBKYXZhIG5vdGF0aW9uIChub24tYnl0ZWNvZGUpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xBU1NfREVDTEFSQVRJT04gPSA3OworCisgICAgLyoqCisgICAgICogQ29uc3RhbnQgdXNlZCBpbiB7QGxpbmsgI2FwcGVuZERlc2NyaXB0b3IgYXBwZW5kRGVzY3JpcHRvcn0gZm9yIG1ldGhvZAorICAgICAqIHBhcmFtZXRlciBzaWduYXR1cmVzLCBmb3JtYXR0ZWQgaW4gZGVmYXVsdCBKYXZhIG5vdGF0aW9uIChub24tYnl0ZWNvZGUpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFSQU1FVEVSU19ERUNMQVJBVElPTiA9IDg7CisKKyAgICAvKioKKyAgICAgKiBDb25zdGFudCB1c2VkIGluIHtAbGluayAjYXBwZW5kRGVzY3JpcHRvciBhcHBlbmREZXNjcmlwdG9yfSBmb3IgaGFuZGxlCisgICAgICogZGVzY3JpcHRvcnMsIGZvcm1hdHRlZCBpbiBieXRlY29kZSBub3RhdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhBTkRMRV9ERVNDUklQVE9SID0gOTsKKworICAgIC8qKgorICAgICAqIFRhYiBmb3IgY2xhc3MgbWVtYmVycy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHRhYiA9ICIgICI7CisKKyAgICAvKioKKyAgICAgKiBUYWIgZm9yIGJ5dGVjb2RlIGluc3RydWN0aW9ucy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHRhYjIgPSAiICAgICI7CisKKyAgICAvKioKKyAgICAgKiBUYWIgZm9yIHRhYmxlIGFuZCBsb29rdXAgc3dpdGNoIGluc3RydWN0aW9ucy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHRhYjMgPSAiICAgICAgIjsKKworICAgIC8qKgorICAgICAqIFRhYiBmb3IgbGFiZWxzLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgbHRhYiA9ICIgICAiOworCisgICAgLyoqCisgICAgICogVGhlIGxhYmVsIG5hbWVzLiBUaGlzIG1hcCBhc3NvY2lhdGUgU3RyaW5nIHZhbHVlcyB0byBMYWJlbCBrZXlzLgorICAgICAqLworICAgIHByb3RlY3RlZCBNYXA8TGFiZWwsIFN0cmluZz4gbGFiZWxOYW1lczsKKworICAgIHByaXZhdGUgaW50IHZhbHVlTnVtYmVyID0gMDsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0BsaW5rIFRleHRpZmllcn0uIDxpPlN1YmNsYXNzZXMgbXVzdCBub3QgdXNlIHRoaXMKKyAgICAgKiBjb25zdHJ1Y3RvcjwvaT4uIEluc3RlYWQsIHRoZXkgbXVzdCB1c2UgdGhlIHtAbGluayAjVGV4dGlmaWVyKGludCl9CisgICAgICogdmVyc2lvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgVGV4dGlmaWVyKCkgeworICAgICAgICB0aGlzKE9wY29kZXMuQVNNNCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGxpbmsgVGV4dGlmaWVyfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcGkgdGhlIEFTTSBBUEkgdmVyc2lvbiBpbXBsZW1lbnRlZCBieSB0aGlzIHZpc2l0b3IuIE11c3QgYmUgb25lCisgICAgICogICAgICAgIG9mIHtAbGluayBPcGNvZGVzI0FTTTR9LgorICAgICAqLworICAgIHByb3RlY3RlZCBUZXh0aWZpZXIoZmluYWwgaW50IGFwaSkgeworICAgICAgICBzdXBlcihhcGkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByaW50cyBhIGRpc2Fzc2VtYmxlZCB2aWV3IG9mIHRoZSBnaXZlbiBjbGFzcyB0byB0aGUgc3RhbmRhcmQgb3V0cHV0LiA8cD4KKyAgICAgKiBVc2FnZTogVGV4dGlmaWVyIFstZGVidWddICZsdDtiaW5hcnkgY2xhc3MgbmFtZSBvciBjbGFzcworICAgICAqIGZpbGUgbmFtZSAmZ3Q7CisgICAgICoKKyAgICAgKiBAcGFyYW0gYXJncyB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGlmIHRoZSBjbGFzcyBjYW5ub3QgYmUgZm91bmQsIG9yIGlmIGFuIElPIGV4Y2VwdGlvbgorICAgICAqICAgICAgICAgb2NjdXJzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKGZpbmFsIFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgIGludCBmbGFncyA9IENsYXNzUmVhZGVyLlNLSVBfREVCVUc7CisKKyAgICAgICAgYm9vbGVhbiBvayA9IHRydWU7CisgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8IDEgfHwgYXJncy5sZW5ndGggPiAyKSB7CisgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChvayAmJiAiLWRlYnVnIi5lcXVhbHMoYXJnc1swXSkpIHsKKyAgICAgICAgICAgIGkgPSAxOworICAgICAgICAgICAgZmxhZ3MgPSAwOworICAgICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoICE9IDIpIHsKKyAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghb2spIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiUHJpbnRzIGEgZGlzYXNzZW1ibGVkIHZpZXcgb2YgdGhlIGdpdmVuIGNsYXNzLiIpOworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJVc2FnZTogVGV4dGlmaWVyIFstZGVidWddICIKKyAgICAgICAgICAgICAgICAgICAgKyAiPGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIGNsYXNzIGZpbGUgbmFtZT4iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBDbGFzc1JlYWRlciBjcjsKKyAgICAgICAgaWYgKGFyZ3NbaV0uZW5kc1dpdGgoIi5jbGFzcyIpIHx8IGFyZ3NbaV0uaW5kZXhPZignXFwnKSA+IC0xCisgICAgICAgICAgICAgICAgfHwgYXJnc1tpXS5pbmRleE9mKCcvJykgPiAtMSkKKyAgICAgICAgeworICAgICAgICAgICAgY3IgPSBuZXcgQ2xhc3NSZWFkZXIobmV3IEZpbGVJbnB1dFN0cmVhbShhcmdzW2ldKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjciA9IG5ldyBDbGFzc1JlYWRlcihhcmdzW2ldKTsKKyAgICAgICAgfQorICAgICAgICBjci5hY2NlcHQobmV3IFRyYWNlQ2xhc3NWaXNpdG9yKG5ldyBQcmludFdyaXRlcihTeXN0ZW0ub3V0KSksCisgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIENsYXNzZXMKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KAorICAgICAgICBmaW5hbCBpbnQgdmVyc2lvbiwKKyAgICAgICAgZmluYWwgaW50IGFjY2VzcywKKyAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUsCisgICAgICAgIGZpbmFsIFN0cmluZyBzaWduYXR1cmUsCisgICAgICAgIGZpbmFsIFN0cmluZyBzdXBlck5hbWUsCisgICAgICAgIGZpbmFsIFN0cmluZ1tdIGludGVyZmFjZXMpCisgICAgeworICAgICAgICBpbnQgbWFqb3IgPSB2ZXJzaW9uICYgMHhGRkZGOworICAgICAgICBpbnQgbWlub3IgPSB2ZXJzaW9uID4+PiAxNjsKKyAgICAgICAgYnVmLnNldExlbmd0aCgwKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiLy8gY2xhc3MgdmVyc2lvbiAiKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobWFqb3IpCisgICAgICAgICAgICAgICAgLmFwcGVuZCgnLicpCisgICAgICAgICAgICAgICAgLmFwcGVuZChtaW5vcikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCIgKCIpCisgICAgICAgICAgICAgICAgLmFwcGVuZCh2ZXJzaW9uKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoIilcbiIpOworICAgICAgICBpZiAoKGFjY2VzcyAmIE9wY29kZXMuQUNDX0RFUFJFQ0FURUQpICE9IDApIHsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIi8vIERFUFJFQ0FURURcbiIpOworICAgICAgICB9CisgICAgICAgIGJ1Zi5hcHBlbmQoIi8vIGFjY2VzcyBmbGFncyAweCIpLmFwcGVuZChJbnRlZ2VyLnRvSGV4U3RyaW5nKGFjY2VzcykudG9VcHBlckNhc2UoKSkuYXBwZW5kKCdcbicpOworCisgICAgICAgIGFwcGVuZERlc2NyaXB0b3IoQ0xBU1NfU0lHTkFUVVJFLCBzaWduYXR1cmUpOworICAgICAgICBpZiAoc2lnbmF0dXJlICE9IG51bGwpIHsKKyAgICAgICAgICAgIFRyYWNlU2lnbmF0dXJlVmlzaXRvciBzdiA9IG5ldyBUcmFjZVNpZ25hdHVyZVZpc2l0b3IoYWNjZXNzKTsKKyAgICAgICAgICAgIFNpZ25hdHVyZVJlYWRlciByID0gbmV3IFNpZ25hdHVyZVJlYWRlcihzaWduYXR1cmUpOworICAgICAgICAgICAgci5hY2NlcHQoc3YpOworICAgICAgICAgICAgYnVmLmFwcGVuZCgiLy8gZGVjbGFyYXRpb246ICIpCisgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQobmFtZSkKKyAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChzdi5nZXREZWNsYXJhdGlvbigpKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCdcbicpOworICAgICAgICB9CisKKyAgICAgICAgYXBwZW5kQWNjZXNzKGFjY2VzcyAmIH5PcGNvZGVzLkFDQ19TVVBFUik7CisgICAgICAgIGlmICgoYWNjZXNzICYgT3Bjb2Rlcy5BQ0NfQU5OT1RBVElPTikgIT0gMCkgeworICAgICAgICAgICAgYnVmLmFwcGVuZCgiQGludGVyZmFjZSAiKTsKKyAgICAgICAgfSBlbHNlIGlmICgoYWNjZXNzICYgT3Bjb2Rlcy5BQ0NfSU5URVJGQUNFKSAhPSAwKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKCJpbnRlcmZhY2UgIik7CisgICAgICAgIH0gZWxzZSBpZiAoKGFjY2VzcyAmIE9wY29kZXMuQUNDX0VOVU0pID09IDApIHsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoImNsYXNzICIpOworICAgICAgICB9CisgICAgICAgIGFwcGVuZERlc2NyaXB0b3IoSU5URVJOQUxfTkFNRSwgbmFtZSk7CisKKyAgICAgICAgaWYgKHN1cGVyTmFtZSAhPSBudWxsICYmICEiamF2YS9sYW5nL09iamVjdCIuZXF1YWxzKHN1cGVyTmFtZSkpIHsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiBleHRlbmRzICIpOworICAgICAgICAgICAgYXBwZW5kRGVzY3JpcHRvcihJTlRFUk5BTF9OQU1FLCBzdXBlck5hbWUpOworICAgICAgICAgICAgYnVmLmFwcGVuZCgnICcpOworICAgICAgICB9CisgICAgICAgIGlmIChpbnRlcmZhY2VzICE9IG51bGwgJiYgaW50ZXJmYWNlcy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKCIgaW1wbGVtZW50cyAiKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW50ZXJmYWNlcy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgICAgIGFwcGVuZERlc2NyaXB0b3IoSU5URVJOQUxfTkFNRSwgaW50ZXJmYWNlc1tpXSk7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgnICcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJ1Zi5hcHBlbmQoIiB7XG5cbiIpOworCisgICAgICAgIHRleHQuYWRkKGJ1Zi50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFNvdXJjZShmaW5hbCBTdHJpbmcgZmlsZSwgZmluYWwgU3RyaW5nIGRlYnVnKSB7CisgICAgICAgIGJ1Zi5zZXRMZW5ndGgoMCk7CisgICAgICAgIGlmIChmaWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQodGFiKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCIvLyBjb21waWxlZCBmcm9tOiAiKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKGZpbGUpCisgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoJ1xuJyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRlYnVnICE9IG51bGwpIHsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQodGFiKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCIvLyBkZWJ1ZyBpbmZvOiAiKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKGRlYnVnKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCdcbicpOworICAgICAgICB9CisgICAgICAgIGlmIChidWYubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICB0ZXh0LmFkZChidWYudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdE91dGVyQ2xhc3MoCisgICAgICAgIGZpbmFsIFN0cmluZyBvd25lciwKKyAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUsCisgICAgICAgIGZpbmFsIFN0cmluZyBkZXNjKQorICAgIHsKKyAgICAgICAgYnVmLnNldExlbmd0aCgwKTsKKyAgICAgICAgYnVmLmFwcGVuZCh0YWIpLmFwcGVuZCgiT1VURVJDTEFTUyAiKTsKKyAgICAgICAgYXBwZW5kRGVzY3JpcHRvcihJTlRFUk5BTF9OQU1FLCBvd25lcik7CisgICAgICAgIGJ1Zi5hcHBlbmQoJyAnKTsKKyAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgYnVmLmFwcGVuZChuYW1lKS5hcHBlbmQoJyAnKTsKKyAgICAgICAgfQorICAgICAgICBhcHBlbmREZXNjcmlwdG9yKE1FVEhPRF9ERVNDUklQVE9SLCBkZXNjKTsKKyAgICAgICAgYnVmLmFwcGVuZCgnXG4nKTsKKyAgICAgICAgdGV4dC5hZGQoYnVmLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBUZXh0aWZpZXIgdmlzaXRDbGFzc0Fubm90YXRpb24oCisgICAgICAgIGZpbmFsIFN0cmluZyBkZXNjLAorICAgICAgICBmaW5hbCBib29sZWFuIHZpc2libGUpCisgICAgeworICAgICAgICB0ZXh0LmFkZCgiXG4iKTsKKyAgICAgICAgcmV0dXJuIHZpc2l0QW5ub3RhdGlvbihkZXNjLCB2aXNpYmxlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdENsYXNzQXR0cmlidXRlKGZpbmFsIEF0dHJpYnV0ZSBhdHRyKSB7CisgICAgICAgIHRleHQuYWRkKCJcbiIpOworICAgICAgICB2aXNpdEF0dHJpYnV0ZShhdHRyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdElubmVyQ2xhc3MoCisgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lLAorICAgICAgICBmaW5hbCBTdHJpbmcgb3V0ZXJOYW1lLAorICAgICAgICBmaW5hbCBTdHJpbmcgaW5uZXJOYW1lLAorICAgICAgICBmaW5hbCBpbnQgYWNjZXNzKQorICAgIHsKKyAgICAgICAgYnVmLnNldExlbmd0aCgwKTsKKyAgICAgICAgYnVmLmFwcGVuZCh0YWIpLmFwcGVuZCgiLy8gYWNjZXNzIGZsYWdzIDB4Iik7CisgICAgICAgIGJ1Zi5hcHBlbmQoSW50ZWdlci50b0hleFN0cmluZyhhY2Nlc3MgJiB+T3Bjb2Rlcy5BQ0NfU1VQRVIpLnRvVXBwZXJDYXNlKCkpLmFwcGVuZCgnXG4nKTsKKyAgICAgICAgYnVmLmFwcGVuZCh0YWIpOworICAgICAgICBhcHBlbmRBY2Nlc3MoYWNjZXNzKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiSU5ORVJDTEFTUyAiKTsKKyAgICAgICAgYXBwZW5kRGVzY3JpcHRvcihJTlRFUk5BTF9OQU1FLCBuYW1lKTsKKyAgICAgICAgYnVmLmFwcGVuZCgnICcpOworICAgICAgICBhcHBlbmREZXNjcmlwdG9yKElOVEVSTkFMX05BTUUsIG91dGVyTmFtZSk7CisgICAgICAgIGJ1Zi5hcHBlbmQoJyAnKTsKKyAgICAgICAgYXBwZW5kRGVzY3JpcHRvcihJTlRFUk5BTF9OQU1FLCBpbm5lck5hbWUpOworICAgICAgICBidWYuYXBwZW5kKCdcbicpOworICAgICAgICB0ZXh0LmFkZChidWYudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFRleHRpZmllciB2aXNpdEZpZWxkKAorICAgICAgICBmaW5hbCBpbnQgYWNjZXNzLAorICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSwKKyAgICAgICAgZmluYWwgU3RyaW5nIGRlc2MsCisgICAgICAgIGZpbmFsIFN0cmluZyBzaWduYXR1cmUsCisgICAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSkKKyAgICB7CisgICAgICAgIGJ1Zi5zZXRMZW5ndGgoMCk7CisgICAgICAgIGJ1Zi5hcHBlbmQoJ1xuJyk7CisgICAgICAgIGlmICgoYWNjZXNzICYgT3Bjb2Rlcy5BQ0NfREVQUkVDQVRFRCkgIT0gMCkgeworICAgICAgICAgICAgYnVmLmFwcGVuZCh0YWIpLmFwcGVuZCgiLy8gREVQUkVDQVRFRFxuIik7CisgICAgICAgIH0KKyAgICAgICAgYnVmLmFwcGVuZCh0YWIpLmFwcGVuZCgiLy8gYWNjZXNzIGZsYWdzIDB4IikuYXBwZW5kKEludGVnZXIudG9IZXhTdHJpbmcoYWNjZXNzKS50b1VwcGVyQ2FzZSgpKS5hcHBlbmQoJ1xuJyk7CisgICAgICAgIGlmIChzaWduYXR1cmUgIT0gbnVsbCkgeworICAgICAgICAgICAgYnVmLmFwcGVuZCh0YWIpOworICAgICAgICAgICAgYXBwZW5kRGVzY3JpcHRvcihGSUVMRF9TSUdOQVRVUkUsIHNpZ25hdHVyZSk7CisKKyAgICAgICAgICAgIFRyYWNlU2lnbmF0dXJlVmlzaXRvciBzdiA9IG5ldyBUcmFjZVNpZ25hdHVyZVZpc2l0b3IoMCk7CisgICAgICAgICAgICBTaWduYXR1cmVSZWFkZXIgciA9IG5ldyBTaWduYXR1cmVSZWFkZXIoc2lnbmF0dXJlKTsKKyAgICAgICAgICAgIHIuYWNjZXB0VHlwZShzdik7CisgICAgICAgICAgICBidWYuYXBwZW5kKHRhYikKKyAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiLy8gZGVjbGFyYXRpb246ICIpCisgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoc3YuZ2V0RGVjbGFyYXRpb24oKSkKKyAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgnXG4nKTsKKyAgICAgICAgfQorCisgICAgICAgIGJ1Zi5hcHBlbmQodGFiKTsKKyAgICAgICAgYXBwZW5kQWNjZXNzKGFjY2Vzcyk7CisKKyAgICAgICAgYXBwZW5kRGVzY3JpcHRvcihGSUVMRF9ERVNDUklQVE9SLCBkZXNjKTsKKyAgICAgICAgYnVmLmFwcGVuZCgnICcpLmFwcGVuZChuYW1lKTsKKyAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiA9ICIpOworICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgnXCInKS5hcHBlbmQodmFsdWUpLmFwcGVuZCgnXCInKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCh2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBidWYuYXBwZW5kKCdcbicpOworICAgICAgICB0ZXh0LmFkZChidWYudG9TdHJpbmcoKSk7CisKKyAgICAgICAgVGV4dGlmaWVyIHQgPSBjcmVhdGVUZXh0aWZpZXIoKTsKKyAgICAgICAgdGV4dC5hZGQodC5nZXRUZXh0KCkpOworICAgICAgICByZXR1cm4gdDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVGV4dGlmaWVyIHZpc2l0TWV0aG9kKAorICAgICAgICBmaW5hbCBpbnQgYWNjZXNzLAorICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSwKKyAgICAgICAgZmluYWwgU3RyaW5nIGRlc2MsCisgICAgICAgIGZpbmFsIFN0cmluZyBzaWduYXR1cmUsCisgICAgICAgIGZpbmFsIFN0cmluZ1tdIGV4Y2VwdGlvbnMpCisgICAgeworICAgICAgICBidWYuc2V0TGVuZ3RoKDApOworICAgICAgICBidWYuYXBwZW5kKCdcbicpOworICAgICAgICBpZiAoKGFjY2VzcyAmIE9wY29kZXMuQUNDX0RFUFJFQ0FURUQpICE9IDApIHsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQodGFiKS5hcHBlbmQoIi8vIERFUFJFQ0FURURcbiIpOworICAgICAgICB9CisgICAgICAgIGJ1Zi5hcHBlbmQodGFiKS5hcHBlbmQoIi8vIGFjY2VzcyBmbGFncyAweCIpLmFwcGVuZChJbnRlZ2VyLnRvSGV4U3RyaW5nKGFjY2VzcykudG9VcHBlckNhc2UoKSkuYXBwZW5kKCdcbicpOworCisgICAgICAgIGlmIChzaWduYXR1cmUgIT0gbnVsbCkgeworICAgICAgICAgICAgYnVmLmFwcGVuZCh0YWIpOworICAgICAgICAgICAgYXBwZW5kRGVzY3JpcHRvcihNRVRIT0RfU0lHTkFUVVJFLCBzaWduYXR1cmUpOworCisgICAgICAgICAgICBUcmFjZVNpZ25hdHVyZVZpc2l0b3IgdiA9IG5ldyBUcmFjZVNpZ25hdHVyZVZpc2l0b3IoMCk7CisgICAgICAgICAgICBTaWduYXR1cmVSZWFkZXIgciA9IG5ldyBTaWduYXR1cmVSZWFkZXIoc2lnbmF0dXJlKTsKKyAgICAgICAgICAgIHIuYWNjZXB0KHYpOworICAgICAgICAgICAgU3RyaW5nIGdlbmVyaWNEZWNsID0gdi5nZXREZWNsYXJhdGlvbigpOworICAgICAgICAgICAgU3RyaW5nIGdlbmVyaWNSZXR1cm4gPSB2LmdldFJldHVyblR5cGUoKTsKKyAgICAgICAgICAgIFN0cmluZyBnZW5lcmljRXhjZXB0aW9ucyA9IHYuZ2V0RXhjZXB0aW9ucygpOworCisgICAgICAgICAgICBidWYuYXBwZW5kKHRhYikKKyAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiLy8gZGVjbGFyYXRpb246ICIpCisgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoZ2VuZXJpY1JldHVybikKKyAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgnICcpCisgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQobmFtZSkKKyAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChnZW5lcmljRGVjbCk7CisgICAgICAgICAgICBpZiAoZ2VuZXJpY0V4Y2VwdGlvbnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiB0aHJvd3MgIikuYXBwZW5kKGdlbmVyaWNFeGNlcHRpb25zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoJ1xuJyk7CisgICAgICAgIH0KKworICAgICAgICBidWYuYXBwZW5kKHRhYik7CisgICAgICAgIGFwcGVuZEFjY2VzcyhhY2Nlc3MpOworICAgICAgICBpZiAoKGFjY2VzcyAmIE9wY29kZXMuQUNDX05BVElWRSkgIT0gMCkgeworICAgICAgICAgICAgYnVmLmFwcGVuZCgibmF0aXZlICIpOworICAgICAgICB9CisgICAgICAgIGlmICgoYWNjZXNzICYgT3Bjb2Rlcy5BQ0NfVkFSQVJHUykgIT0gMCkgeworICAgICAgICAgICAgYnVmLmFwcGVuZCgidmFyYXJncyAiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGFjY2VzcyAmIE9wY29kZXMuQUNDX0JSSURHRSkgIT0gMCkgeworICAgICAgICAgICAgYnVmLmFwcGVuZCgiYnJpZGdlICIpOworICAgICAgICB9CisKKyAgICAgICAgYnVmLmFwcGVuZChuYW1lKTsKKyAgICAgICAgYXBwZW5kRGVzY3JpcHRvcihNRVRIT0RfREVTQ1JJUFRPUiwgZGVzYyk7CisgICAgICAgIGlmIChleGNlcHRpb25zICE9IG51bGwgJiYgZXhjZXB0aW9ucy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKCIgdGhyb3dzICIpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleGNlcHRpb25zLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICAgICAgYXBwZW5kRGVzY3JpcHRvcihJTlRFUk5BTF9OQU1FLCBleGNlcHRpb25zW2ldKTsKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCcgJyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBidWYuYXBwZW5kKCdcbicpOworICAgICAgICB0ZXh0LmFkZChidWYudG9TdHJpbmcoKSk7CisKKyAgICAgICAgVGV4dGlmaWVyIHQgPSBjcmVhdGVUZXh0aWZpZXIoKTsKKyAgICAgICAgdGV4dC5hZGQodC5nZXRUZXh0KCkpOworICAgICAgICByZXR1cm4gdDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdENsYXNzRW5kKCkgeworICAgICAgICB0ZXh0LmFkZCgifVxuIik7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gQW5ub3RhdGlvbnMKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgYnVmLnNldExlbmd0aCgwKTsKKyAgICAgICAgYXBwZW5kQ29tYSh2YWx1ZU51bWJlcisrKTsKKworICAgICAgICBpZiAobmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKG5hbWUpLmFwcGVuZCgnPScpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7CisgICAgICAgICAgICB2aXNpdFN0cmluZygoU3RyaW5nKSB2YWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBUeXBlKSB7CisgICAgICAgICAgICB2aXNpdFR5cGUoKFR5cGUpIHZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEJ5dGUpIHsKKyAgICAgICAgICAgIHZpc2l0Qnl0ZSgoKEJ5dGUpIHZhbHVlKS5ieXRlVmFsdWUoKSk7CisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBCb29sZWFuKSB7CisgICAgICAgICAgICB2aXNpdEJvb2xlYW4oKChCb29sZWFuKSB2YWx1ZSkuYm9vbGVhblZhbHVlKCkpOworICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgU2hvcnQpIHsKKyAgICAgICAgICAgIHZpc2l0U2hvcnQoKChTaG9ydCkgdmFsdWUpLnNob3J0VmFsdWUoKSk7CisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsKKyAgICAgICAgICAgIHZpc2l0Q2hhcigoKENoYXJhY3RlcikgdmFsdWUpLmNoYXJWYWx1ZSgpKTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEludGVnZXIpIHsKKyAgICAgICAgICAgIHZpc2l0SW50KCgoSW50ZWdlcikgdmFsdWUpLmludFZhbHVlKCkpOworICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgRmxvYXQpIHsKKyAgICAgICAgICAgIHZpc2l0RmxvYXQoKChGbG9hdCkgdmFsdWUpLmZsb2F0VmFsdWUoKSk7CisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBMb25nKSB7CisgICAgICAgICAgICB2aXNpdExvbmcoKChMb25nKSB2YWx1ZSkubG9uZ1ZhbHVlKCkpOworICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgRG91YmxlKSB7CisgICAgICAgICAgICB2aXNpdERvdWJsZSgoKERvdWJsZSkgdmFsdWUpLmRvdWJsZVZhbHVlKCkpOworICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmdldENsYXNzKCkuaXNBcnJheSgpKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKCd7Jyk7CisgICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBieXRlW10pIHsKKyAgICAgICAgICAgICAgICBieXRlW10gdiA9IChieXRlW10pIHZhbHVlOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdi5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBhcHBlbmRDb21hKGkpOworICAgICAgICAgICAgICAgICAgICB2aXNpdEJ5dGUodltpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIGJvb2xlYW5bXSkgeworICAgICAgICAgICAgICAgIGJvb2xlYW5bXSB2ID0gKGJvb2xlYW5bXSkgdmFsdWU7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2Lmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGFwcGVuZENvbWEoaSk7CisgICAgICAgICAgICAgICAgICAgIHZpc2l0Qm9vbGVhbih2W2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2Ygc2hvcnRbXSkgeworICAgICAgICAgICAgICAgIHNob3J0W10gdiA9IChzaG9ydFtdKSB2YWx1ZTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHYubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgYXBwZW5kQ29tYShpKTsKKyAgICAgICAgICAgICAgICAgICAgdmlzaXRTaG9ydCh2W2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgY2hhcltdKSB7CisgICAgICAgICAgICAgICAgY2hhcltdIHYgPSAoY2hhcltdKSB2YWx1ZTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHYubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgYXBwZW5kQ29tYShpKTsKKyAgICAgICAgICAgICAgICAgICAgdmlzaXRDaGFyKHZbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBpbnRbXSkgeworICAgICAgICAgICAgICAgIGludFtdIHYgPSAoaW50W10pIHZhbHVlOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdi5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBhcHBlbmRDb21hKGkpOworICAgICAgICAgICAgICAgICAgICB2aXNpdEludCh2W2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgbG9uZ1tdKSB7CisgICAgICAgICAgICAgICAgbG9uZ1tdIHYgPSAobG9uZ1tdKSB2YWx1ZTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHYubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgYXBwZW5kQ29tYShpKTsKKyAgICAgICAgICAgICAgICAgICAgdmlzaXRMb25nKHZbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBmbG9hdFtdKSB7CisgICAgICAgICAgICAgICAgZmxvYXRbXSB2ID0gKGZsb2F0W10pIHZhbHVlOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdi5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBhcHBlbmRDb21hKGkpOworICAgICAgICAgICAgICAgICAgICB2aXNpdEZsb2F0KHZbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBkb3VibGVbXSkgeworICAgICAgICAgICAgICAgIGRvdWJsZVtdIHYgPSAoZG91YmxlW10pIHZhbHVlOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdi5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBhcHBlbmRDb21hKGkpOworICAgICAgICAgICAgICAgICAgICB2aXNpdERvdWJsZSh2W2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWYuYXBwZW5kKCd9Jyk7CisgICAgICAgIH0KKworICAgICAgICB0ZXh0LmFkZChidWYudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHZpc2l0SW50KGZpbmFsIGludCB2YWx1ZSkgeworICAgICAgICBidWYuYXBwZW5kKHZhbHVlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdmlzaXRMb25nKGZpbmFsIGxvbmcgdmFsdWUpIHsKKyAgICAgICAgYnVmLmFwcGVuZCh2YWx1ZSkuYXBwZW5kKCdMJyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHZpc2l0RmxvYXQoZmluYWwgZmxvYXQgdmFsdWUpIHsKKyAgICAgICAgYnVmLmFwcGVuZCh2YWx1ZSkuYXBwZW5kKCdGJyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHZpc2l0RG91YmxlKGZpbmFsIGRvdWJsZSB2YWx1ZSkgeworICAgICAgICBidWYuYXBwZW5kKHZhbHVlKS5hcHBlbmQoJ0QnKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdmlzaXRDaGFyKGZpbmFsIGNoYXIgdmFsdWUpIHsKKyAgICAgICAgYnVmLmFwcGVuZCgiKGNoYXIpIikuYXBwZW5kKChpbnQpIHZhbHVlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdmlzaXRTaG9ydChmaW5hbCBzaG9ydCB2YWx1ZSkgeworICAgICAgICBidWYuYXBwZW5kKCIoc2hvcnQpIikuYXBwZW5kKHZhbHVlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdmlzaXRCeXRlKGZpbmFsIGJ5dGUgdmFsdWUpIHsKKyAgICAgICAgYnVmLmFwcGVuZCgiKGJ5dGUpIikuYXBwZW5kKHZhbHVlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdmlzaXRCb29sZWFuKGZpbmFsIGJvb2xlYW4gdmFsdWUpIHsKKyAgICAgICAgYnVmLmFwcGVuZCh2YWx1ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHZpc2l0U3RyaW5nKGZpbmFsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICBhcHBlbmRTdHJpbmcoYnVmLCB2YWx1ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHZpc2l0VHlwZShmaW5hbCBUeXBlIHZhbHVlKSB7CisgICAgICAgIGJ1Zi5hcHBlbmQodmFsdWUuZ2V0Q2xhc3NOYW1lKCkpLmFwcGVuZCgiLmNsYXNzIik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRFbnVtKAorICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSwKKyAgICAgICAgZmluYWwgU3RyaW5nIGRlc2MsCisgICAgICAgIGZpbmFsIFN0cmluZyB2YWx1ZSkKKyAgICB7CisgICAgICAgIGJ1Zi5zZXRMZW5ndGgoMCk7CisgICAgICAgIGFwcGVuZENvbWEodmFsdWVOdW1iZXIrKyk7CisgICAgICAgIGlmIChuYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQobmFtZSkuYXBwZW5kKCc9Jyk7CisgICAgICAgIH0KKyAgICAgICAgYXBwZW5kRGVzY3JpcHRvcihGSUVMRF9ERVNDUklQVE9SLCBkZXNjKTsKKyAgICAgICAgYnVmLmFwcGVuZCgnLicpLmFwcGVuZCh2YWx1ZSk7CisgICAgICAgIHRleHQuYWRkKGJ1Zi50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVGV4dGlmaWVyIHZpc2l0QW5ub3RhdGlvbigKKyAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUsCisgICAgICAgIGZpbmFsIFN0cmluZyBkZXNjKQorICAgIHsKKyAgICAgICAgYnVmLnNldExlbmd0aCgwKTsKKyAgICAgICAgYXBwZW5kQ29tYSh2YWx1ZU51bWJlcisrKTsKKyAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgYnVmLmFwcGVuZChuYW1lKS5hcHBlbmQoJz0nKTsKKyAgICAgICAgfQorICAgICAgICBidWYuYXBwZW5kKCdAJyk7CisgICAgICAgIGFwcGVuZERlc2NyaXB0b3IoRklFTERfREVTQ1JJUFRPUiwgZGVzYyk7CisgICAgICAgIGJ1Zi5hcHBlbmQoJygnKTsKKyAgICAgICAgdGV4dC5hZGQoYnVmLnRvU3RyaW5nKCkpOworICAgICAgICBUZXh0aWZpZXIgdCA9IGNyZWF0ZVRleHRpZmllcigpOworICAgICAgICB0ZXh0LmFkZCh0LmdldFRleHQoKSk7CisgICAgICAgIHRleHQuYWRkKCIpIik7CisgICAgICAgIHJldHVybiB0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBUZXh0aWZpZXIgdmlzaXRBcnJheSgKKyAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUpCisgICAgeworICAgICAgICBidWYuc2V0TGVuZ3RoKDApOworICAgICAgICBhcHBlbmRDb21hKHZhbHVlTnVtYmVyKyspOworICAgICAgICBpZiAobmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKG5hbWUpLmFwcGVuZCgnPScpOworICAgICAgICB9CisgICAgICAgIGJ1Zi5hcHBlbmQoJ3snKTsKKyAgICAgICAgdGV4dC5hZGQoYnVmLnRvU3RyaW5nKCkpOworICAgICAgICBUZXh0aWZpZXIgdCA9IGNyZWF0ZVRleHRpZmllcigpOworICAgICAgICB0ZXh0LmFkZCh0LmdldFRleHQoKSk7CisgICAgICAgIHRleHQuYWRkKCJ9Iik7CisgICAgICAgIHJldHVybiB0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0QW5ub3RhdGlvbkVuZCgpIHsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBGaWVsZHMKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBUZXh0aWZpZXIgdmlzaXRGaWVsZEFubm90YXRpb24oCisgICAgICAgIGZpbmFsIFN0cmluZyBkZXNjLAorICAgICAgICBmaW5hbCBib29sZWFuIHZpc2libGUpCisgICAgeworICAgICAgICByZXR1cm4gdmlzaXRBbm5vdGF0aW9uKGRlc2MsIHZpc2libGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0RmllbGRBdHRyaWJ1dGUoZmluYWwgQXR0cmlidXRlIGF0dHIpIHsKKyAgICAgICAgdmlzaXRBdHRyaWJ1dGUoYXR0cik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRGaWVsZEVuZCgpIHsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBNZXRob2RzCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVGV4dGlmaWVyIHZpc2l0QW5ub3RhdGlvbkRlZmF1bHQoKSB7CisgICAgICAgIHRleHQuYWRkKHRhYjIgKyAiZGVmYXVsdD0iKTsKKyAgICAgICAgVGV4dGlmaWVyIHQgPSBjcmVhdGVUZXh0aWZpZXIoKTsKKyAgICAgICAgdGV4dC5hZGQodC5nZXRUZXh0KCkpOworICAgICAgICB0ZXh0LmFkZCgiXG4iKTsKKyAgICAgICAgcmV0dXJuIHQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFRleHRpZmllciB2aXNpdE1ldGhvZEFubm90YXRpb24oCisgICAgICAgIGZpbmFsIFN0cmluZyBkZXNjLAorICAgICAgICBmaW5hbCBib29sZWFuIHZpc2libGUpCisgICAgeworICAgICAgICByZXR1cm4gdmlzaXRBbm5vdGF0aW9uKGRlc2MsIHZpc2libGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBUZXh0aWZpZXIgdmlzaXRQYXJhbWV0ZXJBbm5vdGF0aW9uKAorICAgICAgICBmaW5hbCBpbnQgcGFyYW1ldGVyLAorICAgICAgICBmaW5hbCBTdHJpbmcgZGVzYywKKyAgICAgICAgZmluYWwgYm9vbGVhbiB2aXNpYmxlKQorICAgIHsKKyAgICAgICAgYnVmLnNldExlbmd0aCgwKTsKKyAgICAgICAgYnVmLmFwcGVuZCh0YWIyKS5hcHBlbmQoJ0AnKTsKKyAgICAgICAgYXBwZW5kRGVzY3JpcHRvcihGSUVMRF9ERVNDUklQVE9SLCBkZXNjKTsKKyAgICAgICAgYnVmLmFwcGVuZCgnKCcpOworICAgICAgICB0ZXh0LmFkZChidWYudG9TdHJpbmcoKSk7CisgICAgICAgIFRleHRpZmllciB0ID0gY3JlYXRlVGV4dGlmaWVyKCk7CisgICAgICAgIHRleHQuYWRkKHQuZ2V0VGV4dCgpKTsKKyAgICAgICAgdGV4dC5hZGQodmlzaWJsZSA/ICIpIC8vIHBhcmFtZXRlciAiIDogIikgLy8gaW52aXNpYmxlLCBwYXJhbWV0ZXIgIik7CisgICAgICAgIHRleHQuYWRkKG5ldyBJbnRlZ2VyKHBhcmFtZXRlcikpOworICAgICAgICB0ZXh0LmFkZCgiXG4iKTsKKyAgICAgICAgcmV0dXJuIHQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRNZXRob2RBdHRyaWJ1dGUoZmluYWwgQXR0cmlidXRlIGF0dHIpIHsKKyAgICAgICAgYnVmLnNldExlbmd0aCgwKTsKKyAgICAgICAgYnVmLmFwcGVuZCh0YWIpLmFwcGVuZCgiQVRUUklCVVRFICIpOworICAgICAgICBhcHBlbmREZXNjcmlwdG9yKC0xLCBhdHRyLnR5cGUpOworCisgICAgICAgIGlmIChhdHRyIGluc3RhbmNlb2YgVGV4dGlmaWFibGUpIHsKKyAgICAgICAgICAgICgoVGV4dGlmaWFibGUpIGF0dHIpLnRleHRpZnkoYnVmLCBsYWJlbE5hbWVzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiA6IHVua25vd25cbiIpOworICAgICAgICB9CisKKyAgICAgICAgdGV4dC5hZGQoYnVmLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0Q29kZSgpIHsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEZyYW1lKAorICAgICAgICBmaW5hbCBpbnQgdHlwZSwKKyAgICAgICAgZmluYWwgaW50IG5Mb2NhbCwKKyAgICAgICAgZmluYWwgT2JqZWN0W10gbG9jYWwsCisgICAgICAgIGZpbmFsIGludCBuU3RhY2ssCisgICAgICAgIGZpbmFsIE9iamVjdFtdIHN0YWNrKQorICAgIHsKKyAgICAgICAgYnVmLnNldExlbmd0aCgwKTsKKyAgICAgICAgYnVmLmFwcGVuZChsdGFiKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiRlJBTUUgIik7CisgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkZfTkVXOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkZfRlVMTDoKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCJGVUxMIFsiKTsKKyAgICAgICAgICAgICAgICBhcHBlbmRGcmFtZVR5cGVzKG5Mb2NhbCwgbG9jYWwpOworICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIl0gWyIpOworICAgICAgICAgICAgICAgIGFwcGVuZEZyYW1lVHlwZXMoblN0YWNrLCBzdGFjayk7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgnXScpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkZfQVBQRU5EOgorICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIkFQUEVORCBbIik7CisgICAgICAgICAgICAgICAgYXBwZW5kRnJhbWVUeXBlcyhuTG9jYWwsIGxvY2FsKTsKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCddJyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRl9DSE9QOgorICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIkNIT1AgIikuYXBwZW5kKG5Mb2NhbCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRl9TQU1FOgorICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIlNBTUUiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5GX1NBTUUxOgorICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIlNBTUUxICIpOworICAgICAgICAgICAgICAgIGFwcGVuZEZyYW1lVHlwZXMoMSwgc3RhY2spOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJ1Zi5hcHBlbmQoJ1xuJyk7CisgICAgICAgIHRleHQuYWRkKGJ1Zi50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEluc24oZmluYWwgaW50IG9wY29kZSkgeworICAgICAgICBidWYuc2V0TGVuZ3RoKDApOworICAgICAgICBidWYuYXBwZW5kKHRhYjIpLmFwcGVuZChPUENPREVTW29wY29kZV0pLmFwcGVuZCgnXG4nKTsKKyAgICAgICAgdGV4dC5hZGQoYnVmLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0SW50SW5zbihmaW5hbCBpbnQgb3Bjb2RlLCBmaW5hbCBpbnQgb3BlcmFuZCkgeworICAgICAgICBidWYuc2V0TGVuZ3RoKDApOworICAgICAgICBidWYuYXBwZW5kKHRhYjIpCisgICAgICAgICAgICAgICAgLmFwcGVuZChPUENPREVTW29wY29kZV0pCisgICAgICAgICAgICAgICAgLmFwcGVuZCgnICcpCisgICAgICAgICAgICAgICAgLmFwcGVuZChvcGNvZGUgPT0gT3Bjb2Rlcy5ORVdBUlJBWQorICAgICAgICAgICAgICAgICAgICAgICAgPyBUWVBFU1tvcGVyYW5kXQorICAgICAgICAgICAgICAgICAgICAgICAgOiBJbnRlZ2VyLnRvU3RyaW5nKG9wZXJhbmQpKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoJ1xuJyk7CisgICAgICAgIHRleHQuYWRkKGJ1Zi50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFZhckluc24oZmluYWwgaW50IG9wY29kZSwgZmluYWwgaW50IHZhcikgeworICAgICAgICBidWYuc2V0TGVuZ3RoKDApOworICAgICAgICBidWYuYXBwZW5kKHRhYjIpCisgICAgICAgICAgICAgICAgLmFwcGVuZChPUENPREVTW29wY29kZV0pCisgICAgICAgICAgICAgICAgLmFwcGVuZCgnICcpCisgICAgICAgICAgICAgICAgLmFwcGVuZCh2YXIpCisgICAgICAgICAgICAgICAgLmFwcGVuZCgnXG4nKTsKKyAgICAgICAgdGV4dC5hZGQoYnVmLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0VHlwZUluc24oZmluYWwgaW50IG9wY29kZSwgZmluYWwgU3RyaW5nIHR5cGUpIHsKKyAgICAgICAgYnVmLnNldExlbmd0aCgwKTsKKyAgICAgICAgYnVmLmFwcGVuZCh0YWIyKS5hcHBlbmQoT1BDT0RFU1tvcGNvZGVdKS5hcHBlbmQoJyAnKTsKKyAgICAgICAgYXBwZW5kRGVzY3JpcHRvcihJTlRFUk5BTF9OQU1FLCB0eXBlKTsKKyAgICAgICAgYnVmLmFwcGVuZCgnXG4nKTsKKyAgICAgICAgdGV4dC5hZGQoYnVmLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0RmllbGRJbnNuKAorICAgICAgICBmaW5hbCBpbnQgb3Bjb2RlLAorICAgICAgICBmaW5hbCBTdHJpbmcgb3duZXIsCisgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lLAorICAgICAgICBmaW5hbCBTdHJpbmcgZGVzYykKKyAgICB7CisgICAgICAgIGJ1Zi5zZXRMZW5ndGgoMCk7CisgICAgICAgIGJ1Zi5hcHBlbmQodGFiMikuYXBwZW5kKE9QQ09ERVNbb3Bjb2RlXSkuYXBwZW5kKCcgJyk7CisgICAgICAgIGFwcGVuZERlc2NyaXB0b3IoSU5URVJOQUxfTkFNRSwgb3duZXIpOworICAgICAgICBidWYuYXBwZW5kKCcuJykuYXBwZW5kKG5hbWUpLmFwcGVuZCgiIDogIik7CisgICAgICAgIGFwcGVuZERlc2NyaXB0b3IoRklFTERfREVTQ1JJUFRPUiwgZGVzYyk7CisgICAgICAgIGJ1Zi5hcHBlbmQoJ1xuJyk7CisgICAgICAgIHRleHQuYWRkKGJ1Zi50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdE1ldGhvZEluc24oCisgICAgICAgIGZpbmFsIGludCBvcGNvZGUsCisgICAgICAgIGZpbmFsIFN0cmluZyBvd25lciwKKyAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUsCisgICAgICAgIGZpbmFsIFN0cmluZyBkZXNjKQorICAgIHsKKyAgICAgICAgYnVmLnNldExlbmd0aCgwKTsKKyAgICAgICAgYnVmLmFwcGVuZCh0YWIyKS5hcHBlbmQoT1BDT0RFU1tvcGNvZGVdKS5hcHBlbmQoJyAnKTsKKyAgICAgICAgYXBwZW5kRGVzY3JpcHRvcihJTlRFUk5BTF9OQU1FLCBvd25lcik7CisgICAgICAgIGJ1Zi5hcHBlbmQoJy4nKS5hcHBlbmQobmFtZSkuYXBwZW5kKCcgJyk7CisgICAgICAgIGFwcGVuZERlc2NyaXB0b3IoTUVUSE9EX0RFU0NSSVBUT1IsIGRlc2MpOworICAgICAgICBidWYuYXBwZW5kKCdcbicpOworICAgICAgICB0ZXh0LmFkZChidWYudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRJbnZva2VEeW5hbWljSW5zbigKKyAgICAgICAgU3RyaW5nIG5hbWUsCisgICAgICAgIFN0cmluZyBkZXNjLAorICAgICAgICBIYW5kbGUgYnNtLAorICAgICAgICBPYmplY3QuLi4gYnNtQXJncykKKyAgICB7CisgICAgICAgIGJ1Zi5zZXRMZW5ndGgoMCk7CisgICAgICAgIGJ1Zi5hcHBlbmQodGFiMikuYXBwZW5kKCJJTlZPS0VEWU5BTUlDIikuYXBwZW5kKCcgJyk7CisgICAgICAgIGJ1Zi5hcHBlbmQobmFtZSk7CisgICAgICAgIGFwcGVuZERlc2NyaXB0b3IoTUVUSE9EX0RFU0NSSVBUT1IsIGRlc2MpOworICAgICAgICBidWYuYXBwZW5kKCIgWyIpOworICAgICAgICBhcHBlbmRIYW5kbGUoYnNtKTsKKyAgICAgICAgYnVmLmFwcGVuZCh0YWIzKS5hcHBlbmQoIi8vIGFyZ3VtZW50czoiKTsKKyAgICAgICAgaWYoYnNtQXJncy5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgYnVmLmFwcGVuZCgiIG5vbmUiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoJ1xuJykuYXBwZW5kKHRhYjMpOworICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IGJzbUFyZ3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBPYmplY3QgY3N0ID0gYnNtQXJnc1tpXTsKKyAgICAgICAgICAgICAgICBpZiAoY3N0IGluc3RhbmNlb2YgU3RyaW5nKSB7CisgICAgICAgICAgICAgICAgICAgIFByaW50ZXIuYXBwZW5kU3RyaW5nKGJ1ZiwgKFN0cmluZykgY3N0KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNzdCBpbnN0YW5jZW9mIFR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgoKFR5cGUpIGNzdCkuZ2V0RGVzY3JpcHRvcigpKS5hcHBlbmQoIi5jbGFzcyIpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3N0IGluc3RhbmNlb2YgSGFuZGxlKSB7CisgICAgICAgICAgICAgICAgICAgIGFwcGVuZEhhbmRsZSgoSGFuZGxlKSBjc3QpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoY3N0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1Zi5zZXRMZW5ndGgoYnVmLmxlbmd0aCgpIC0gMik7CisgICAgICAgIH0KKyAgICAgICAgYnVmLmFwcGVuZCgnXG4nKTsKKyAgICAgICAgYnVmLmFwcGVuZCh0YWIyKS5hcHBlbmQoIl1cbiIpOworICAgICAgICB0ZXh0LmFkZChidWYudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRKdW1wSW5zbihmaW5hbCBpbnQgb3Bjb2RlLCBmaW5hbCBMYWJlbCBsYWJlbCkgeworICAgICAgICBidWYuc2V0TGVuZ3RoKDApOworICAgICAgICBidWYuYXBwZW5kKHRhYjIpLmFwcGVuZChPUENPREVTW29wY29kZV0pLmFwcGVuZCgnICcpOworICAgICAgICBhcHBlbmRMYWJlbChsYWJlbCk7CisgICAgICAgIGJ1Zi5hcHBlbmQoJ1xuJyk7CisgICAgICAgIHRleHQuYWRkKGJ1Zi50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdExhYmVsKGZpbmFsIExhYmVsIGxhYmVsKSB7CisgICAgICAgIGJ1Zi5zZXRMZW5ndGgoMCk7CisgICAgICAgIGJ1Zi5hcHBlbmQobHRhYik7CisgICAgICAgIGFwcGVuZExhYmVsKGxhYmVsKTsKKyAgICAgICAgYnVmLmFwcGVuZCgnXG4nKTsKKyAgICAgICAgdGV4dC5hZGQoYnVmLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TGRjSW5zbihmaW5hbCBPYmplY3QgY3N0KSB7CisgICAgICAgIGJ1Zi5zZXRMZW5ndGgoMCk7CisgICAgICAgIGJ1Zi5hcHBlbmQodGFiMikuYXBwZW5kKCJMREMgIik7CisgICAgICAgIGlmIChjc3QgaW5zdGFuY2VvZiBTdHJpbmcpIHsKKyAgICAgICAgICAgIFByaW50ZXIuYXBwZW5kU3RyaW5nKGJ1ZiwgKFN0cmluZykgY3N0KTsKKyAgICAgICAgfSBlbHNlIGlmIChjc3QgaW5zdGFuY2VvZiBUeXBlKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKCgoVHlwZSkgY3N0KS5nZXREZXNjcmlwdG9yKCkpLmFwcGVuZCgiLmNsYXNzIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKGNzdCk7CisgICAgICAgIH0KKyAgICAgICAgYnVmLmFwcGVuZCgnXG4nKTsKKyAgICAgICAgdGV4dC5hZGQoYnVmLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0SWluY0luc24oZmluYWwgaW50IHZhciwgZmluYWwgaW50IGluY3JlbWVudCkgeworICAgICAgICBidWYuc2V0TGVuZ3RoKDApOworICAgICAgICBidWYuYXBwZW5kKHRhYjIpCisgICAgICAgICAgICAgICAgLmFwcGVuZCgiSUlOQyAiKQorICAgICAgICAgICAgICAgIC5hcHBlbmQodmFyKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoJyAnKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoaW5jcmVtZW50KQorICAgICAgICAgICAgICAgIC5hcHBlbmQoJ1xuJyk7CisgICAgICAgIHRleHQuYWRkKGJ1Zi50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFRhYmxlU3dpdGNoSW5zbigKKyAgICAgICAgZmluYWwgaW50IG1pbiwKKyAgICAgICAgZmluYWwgaW50IG1heCwKKyAgICAgICAgZmluYWwgTGFiZWwgZGZsdCwKKyAgICAgICAgZmluYWwgTGFiZWwuLi4gbGFiZWxzKQorICAgIHsKKyAgICAgICAgYnVmLnNldExlbmd0aCgwKTsKKyAgICAgICAgYnVmLmFwcGVuZCh0YWIyKS5hcHBlbmQoIlRBQkxFU1dJVENIXG4iKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsYWJlbHMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQodGFiMykuYXBwZW5kKG1pbiArIGkpLmFwcGVuZCgiOiAiKTsKKyAgICAgICAgICAgIGFwcGVuZExhYmVsKGxhYmVsc1tpXSk7CisgICAgICAgICAgICBidWYuYXBwZW5kKCdcbicpOworICAgICAgICB9CisgICAgICAgIGJ1Zi5hcHBlbmQodGFiMykuYXBwZW5kKCJkZWZhdWx0OiAiKTsKKyAgICAgICAgYXBwZW5kTGFiZWwoZGZsdCk7CisgICAgICAgIGJ1Zi5hcHBlbmQoJ1xuJyk7CisgICAgICAgIHRleHQuYWRkKGJ1Zi50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdExvb2t1cFN3aXRjaEluc24oCisgICAgICAgIGZpbmFsIExhYmVsIGRmbHQsCisgICAgICAgIGZpbmFsIGludFtdIGtleXMsCisgICAgICAgIGZpbmFsIExhYmVsW10gbGFiZWxzKQorICAgIHsKKyAgICAgICAgYnVmLnNldExlbmd0aCgwKTsKKyAgICAgICAgYnVmLmFwcGVuZCh0YWIyKS5hcHBlbmQoIkxPT0tVUFNXSVRDSFxuIik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGFiZWxzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKHRhYjMpLmFwcGVuZChrZXlzW2ldKS5hcHBlbmQoIjogIik7CisgICAgICAgICAgICBhcHBlbmRMYWJlbChsYWJlbHNbaV0pOworICAgICAgICAgICAgYnVmLmFwcGVuZCgnXG4nKTsKKyAgICAgICAgfQorICAgICAgICBidWYuYXBwZW5kKHRhYjMpLmFwcGVuZCgiZGVmYXVsdDogIik7CisgICAgICAgIGFwcGVuZExhYmVsKGRmbHQpOworICAgICAgICBidWYuYXBwZW5kKCdcbicpOworICAgICAgICB0ZXh0LmFkZChidWYudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRNdWx0aUFOZXdBcnJheUluc24oZmluYWwgU3RyaW5nIGRlc2MsIGZpbmFsIGludCBkaW1zKSB7CisgICAgICAgIGJ1Zi5zZXRMZW5ndGgoMCk7CisgICAgICAgIGJ1Zi5hcHBlbmQodGFiMikuYXBwZW5kKCJNVUxUSUFORVdBUlJBWSAiKTsKKyAgICAgICAgYXBwZW5kRGVzY3JpcHRvcihGSUVMRF9ERVNDUklQVE9SLCBkZXNjKTsKKyAgICAgICAgYnVmLmFwcGVuZCgnICcpLmFwcGVuZChkaW1zKS5hcHBlbmQoJ1xuJyk7CisgICAgICAgIHRleHQuYWRkKGJ1Zi50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFRyeUNhdGNoQmxvY2soCisgICAgICAgIGZpbmFsIExhYmVsIHN0YXJ0LAorICAgICAgICBmaW5hbCBMYWJlbCBlbmQsCisgICAgICAgIGZpbmFsIExhYmVsIGhhbmRsZXIsCisgICAgICAgIGZpbmFsIFN0cmluZyB0eXBlKQorICAgIHsKKyAgICAgICAgYnVmLnNldExlbmd0aCgwKTsKKyAgICAgICAgYnVmLmFwcGVuZCh0YWIyKS5hcHBlbmQoIlRSWUNBVENIQkxPQ0sgIik7CisgICAgICAgIGFwcGVuZExhYmVsKHN0YXJ0KTsKKyAgICAgICAgYnVmLmFwcGVuZCgnICcpOworICAgICAgICBhcHBlbmRMYWJlbChlbmQpOworICAgICAgICBidWYuYXBwZW5kKCcgJyk7CisgICAgICAgIGFwcGVuZExhYmVsKGhhbmRsZXIpOworICAgICAgICBidWYuYXBwZW5kKCcgJyk7CisgICAgICAgIGFwcGVuZERlc2NyaXB0b3IoSU5URVJOQUxfTkFNRSwgdHlwZSk7CisgICAgICAgIGJ1Zi5hcHBlbmQoJ1xuJyk7CisgICAgICAgIHRleHQuYWRkKGJ1Zi50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdExvY2FsVmFyaWFibGUoCisgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lLAorICAgICAgICBmaW5hbCBTdHJpbmcgZGVzYywKKyAgICAgICAgZmluYWwgU3RyaW5nIHNpZ25hdHVyZSwKKyAgICAgICAgZmluYWwgTGFiZWwgc3RhcnQsCisgICAgICAgIGZpbmFsIExhYmVsIGVuZCwKKyAgICAgICAgZmluYWwgaW50IGluZGV4KQorICAgIHsKKyAgICAgICAgYnVmLnNldExlbmd0aCgwKTsKKyAgICAgICAgYnVmLmFwcGVuZCh0YWIyKS5hcHBlbmQoIkxPQ0FMVkFSSUFCTEUgIikuYXBwZW5kKG5hbWUpLmFwcGVuZCgnICcpOworICAgICAgICBhcHBlbmREZXNjcmlwdG9yKEZJRUxEX0RFU0NSSVBUT1IsIGRlc2MpOworICAgICAgICBidWYuYXBwZW5kKCcgJyk7CisgICAgICAgIGFwcGVuZExhYmVsKHN0YXJ0KTsKKyAgICAgICAgYnVmLmFwcGVuZCgnICcpOworICAgICAgICBhcHBlbmRMYWJlbChlbmQpOworICAgICAgICBidWYuYXBwZW5kKCcgJykuYXBwZW5kKGluZGV4KS5hcHBlbmQoJ1xuJyk7CisKKyAgICAgICAgaWYgKHNpZ25hdHVyZSAhPSBudWxsKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKHRhYjIpOworICAgICAgICAgICAgYXBwZW5kRGVzY3JpcHRvcihGSUVMRF9TSUdOQVRVUkUsIHNpZ25hdHVyZSk7CisKKyAgICAgICAgICAgIFRyYWNlU2lnbmF0dXJlVmlzaXRvciBzdiA9IG5ldyBUcmFjZVNpZ25hdHVyZVZpc2l0b3IoMCk7CisgICAgICAgICAgICBTaWduYXR1cmVSZWFkZXIgciA9IG5ldyBTaWduYXR1cmVSZWFkZXIoc2lnbmF0dXJlKTsKKyAgICAgICAgICAgIHIuYWNjZXB0VHlwZShzdik7CisgICAgICAgICAgICBidWYuYXBwZW5kKHRhYjIpCisgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIi8vIGRlY2xhcmF0aW9uOiAiKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKHN2LmdldERlY2xhcmF0aW9uKCkpCisgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoJ1xuJyk7CisgICAgICAgIH0KKyAgICAgICAgdGV4dC5hZGQoYnVmLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TGluZU51bWJlcihmaW5hbCBpbnQgbGluZSwgZmluYWwgTGFiZWwgc3RhcnQpIHsKKyAgICAgICAgYnVmLnNldExlbmd0aCgwKTsKKyAgICAgICAgYnVmLmFwcGVuZCh0YWIyKS5hcHBlbmQoIkxJTkVOVU1CRVIgIikuYXBwZW5kKGxpbmUpLmFwcGVuZCgnICcpOworICAgICAgICBhcHBlbmRMYWJlbChzdGFydCk7CisgICAgICAgIGJ1Zi5hcHBlbmQoJ1xuJyk7CisgICAgICAgIHRleHQuYWRkKGJ1Zi50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdE1heHMoZmluYWwgaW50IG1heFN0YWNrLCBmaW5hbCBpbnQgbWF4TG9jYWxzKSB7CisgICAgICAgIGJ1Zi5zZXRMZW5ndGgoMCk7CisgICAgICAgIGJ1Zi5hcHBlbmQodGFiMikuYXBwZW5kKCJNQVhTVEFDSyA9ICIpLmFwcGVuZChtYXhTdGFjaykuYXBwZW5kKCdcbicpOworICAgICAgICB0ZXh0LmFkZChidWYudG9TdHJpbmcoKSk7CisKKyAgICAgICAgYnVmLnNldExlbmd0aCgwKTsKKyAgICAgICAgYnVmLmFwcGVuZCh0YWIyKS5hcHBlbmQoIk1BWExPQ0FMUyA9ICIpLmFwcGVuZChtYXhMb2NhbHMpLmFwcGVuZCgnXG4nKTsKKyAgICAgICAgdGV4dC5hZGQoYnVmLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TWV0aG9kRW5kKCkgeworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIENvbW1vbiBtZXRob2RzCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvKioKKyAgICAgKiBQcmludHMgYSBkaXNhc3NlbWJsZWQgdmlldyBvZiB0aGUgZ2l2ZW4gYW5ub3RhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZXNjIHRoZSBjbGFzcyBkZXNjcmlwdG9yIG9mIHRoZSBhbm5vdGF0aW9uIGNsYXNzLgorICAgICAqIEBwYXJhbSB2aXNpYmxlIDx0dD50cnVlPC90dD4gaWYgdGhlIGFubm90YXRpb24gaXMgdmlzaWJsZSBhdCBydW50aW1lLgorICAgICAqIEByZXR1cm4gYSB2aXNpdG9yIHRvIHZpc2l0IHRoZSBhbm5vdGF0aW9uIHZhbHVlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgVGV4dGlmaWVyIHZpc2l0QW5ub3RhdGlvbigKKyAgICAgICAgZmluYWwgU3RyaW5nIGRlc2MsCisgICAgICAgIGZpbmFsIGJvb2xlYW4gdmlzaWJsZSkKKyAgICB7CisgICAgICAgIGJ1Zi5zZXRMZW5ndGgoMCk7CisgICAgICAgIGJ1Zi5hcHBlbmQodGFiKS5hcHBlbmQoJ0AnKTsKKyAgICAgICAgYXBwZW5kRGVzY3JpcHRvcihGSUVMRF9ERVNDUklQVE9SLCBkZXNjKTsKKyAgICAgICAgYnVmLmFwcGVuZCgnKCcpOworICAgICAgICB0ZXh0LmFkZChidWYudG9TdHJpbmcoKSk7CisgICAgICAgIFRleHRpZmllciB0ID0gY3JlYXRlVGV4dGlmaWVyKCk7CisgICAgICAgIHRleHQuYWRkKHQuZ2V0VGV4dCgpKTsKKyAgICAgICAgdGV4dC5hZGQodmlzaWJsZSA/ICIpXG4iIDogIikgLy8gaW52aXNpYmxlXG4iKTsKKyAgICAgICAgcmV0dXJuIHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJpbnRzIGEgZGlzYXNzZW1ibGVkIHZpZXcgb2YgdGhlIGdpdmVuIGF0dHJpYnV0ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhdHRyIGFuIGF0dHJpYnV0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB2aXNpdEF0dHJpYnV0ZShmaW5hbCBBdHRyaWJ1dGUgYXR0cikgeworICAgICAgICBidWYuc2V0TGVuZ3RoKDApOworICAgICAgICBidWYuYXBwZW5kKHRhYikuYXBwZW5kKCJBVFRSSUJVVEUgIik7CisgICAgICAgIGFwcGVuZERlc2NyaXB0b3IoLTEsIGF0dHIudHlwZSk7CisKKyAgICAgICAgaWYgKGF0dHIgaW5zdGFuY2VvZiBUZXh0aWZpYWJsZSkgeworICAgICAgICAgICAgKChUZXh0aWZpYWJsZSkgYXR0cikudGV4dGlmeShidWYsIG51bGwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYnVmLmFwcGVuZCgiIDogdW5rbm93blxuIik7CisgICAgICAgIH0KKworICAgICAgICB0ZXh0LmFkZChidWYudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gVXRpbGl0eSBtZXRob2RzCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IFRyYWNlVmlzaXRvciBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBuZXcgVHJhY2VWaXNpdG9yLgorICAgICAqLworICAgIHByb3RlY3RlZCBUZXh0aWZpZXIgY3JlYXRlVGV4dGlmaWVyKCkgeworICAgICAgICByZXR1cm4gbmV3IFRleHRpZmllcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFwcGVuZHMgYW4gaW50ZXJuYWwgbmFtZSwgYSB0eXBlIGRlc2NyaXB0b3Igb3IgYSB0eXBlIHNpZ25hdHVyZSB0bworICAgICAqIHtAbGluayAjYnVmIGJ1Zn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZSBpbmRpY2F0ZXMgaWYgZGVzYyBpcyBhbiBpbnRlcm5hbCBuYW1lLCBhIGZpZWxkIGRlc2NyaXB0b3IsIGEKKyAgICAgKiAgICAgICAgbWV0aG9kIGRlc2NyaXB0b3IsIGEgY2xhc3Mgc2lnbmF0dXJlLCAuLi4KKyAgICAgKiBAcGFyYW0gZGVzYyBhbiBpbnRlcm5hbCBuYW1lLCB0eXBlIGRlc2NyaXB0b3IsIG9yIHR5cGUgc2lnbmF0dXJlLiBNYXkgYmUKKyAgICAgKiAgICAgICAgPHR0Pm51bGw8L3R0Pi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBhcHBlbmREZXNjcmlwdG9yKGZpbmFsIGludCB0eXBlLCBmaW5hbCBTdHJpbmcgZGVzYykgeworICAgICAgICBpZiAodHlwZSA9PSBDTEFTU19TSUdOQVRVUkUgfHwgdHlwZSA9PSBGSUVMRF9TSUdOQVRVUkUKKyAgICAgICAgICAgICAgICB8fCB0eXBlID09IE1FVEhPRF9TSUdOQVRVUkUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChkZXNjICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCIvLyBzaWduYXR1cmUgIikuYXBwZW5kKGRlc2MpLmFwcGVuZCgnXG4nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoZGVzYyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBcHBlbmRzIHRoZSBuYW1lIG9mIHRoZSBnaXZlbiBsYWJlbCB0byB7QGxpbmsgI2J1ZiBidWZ9LiBDcmVhdGVzIGEgbmV3CisgICAgICogbGFiZWwgbmFtZSBpZiB0aGUgZ2l2ZW4gbGFiZWwgZG9lcyBub3QgeWV0IGhhdmUgb25lLgorICAgICAqCisgICAgICogQHBhcmFtIGwgYSBsYWJlbC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBhcHBlbmRMYWJlbChmaW5hbCBMYWJlbCBsKSB7CisgICAgICAgIGlmIChsYWJlbE5hbWVzID09IG51bGwpIHsKKyAgICAgICAgICAgIGxhYmVsTmFtZXMgPSBuZXcgSGFzaE1hcDxMYWJlbCwgU3RyaW5nPigpOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBuYW1lID0gbGFiZWxOYW1lcy5nZXQobCk7CisgICAgICAgIGlmIChuYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgIG5hbWUgPSAiTCIgKyBsYWJlbE5hbWVzLnNpemUoKTsKKyAgICAgICAgICAgIGxhYmVsTmFtZXMucHV0KGwsIG5hbWUpOworICAgICAgICB9CisgICAgICAgIGJ1Zi5hcHBlbmQobmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXBwZW5kcyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGdpdmVuIGhhbmRsZSB0byB7QGxpbmsgI2J1ZiBidWZ9LgorICAgICAqCisgICAgICogQHBhcmFtIGggYSBoYW5kbGUsIG5vbiBudWxsLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGFwcGVuZEhhbmRsZShmaW5hbCBIYW5kbGUgaCkgeworICAgICAgICBidWYuYXBwZW5kKCdcbicpLmFwcGVuZCh0YWIzKTsKKyAgICAgICAgaW50IHRhZyA9IGguZ2V0VGFnKCk7CisgICAgICAgIGJ1Zi5hcHBlbmQoIi8vIGhhbmRsZSBraW5kIDB4IikuYXBwZW5kKEludGVnZXIudG9IZXhTdHJpbmcodGFnKSkuYXBwZW5kKCIgOiAiKTsKKyAgICAgICAgc3dpdGNoICh0YWcpIHsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5IX0dFVEZJRUxEOgorICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIkdFVEZJRUxEIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSF9HRVRTVEFUSUM6CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiR0VUU1RBVElDIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSF9QVVRGSUVMRDoKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCJQVVRGSUVMRCIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkhfUFVUU1RBVElDOgorICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIlBVVFNUQVRJQyIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkhfSU5WT0tFSU5URVJGQUNFOgorICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIklOVk9LRUlOVEVSRkFDRSIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkhfSU5WT0tFU1BFQ0lBTDoKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCJJTlZPS0VTUEVDSUFMIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSF9JTlZPS0VTVEFUSUM6CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiSU5WT0tFU1RBVElDIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSF9JTlZPS0VWSVJUVUFMOgorICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIklOVk9LRVZJUlRVQUwiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5IX05FV0lOVk9LRVNQRUNJQUw6CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiTkVXSU5WT0tFU1BFQ0lBTCIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJ1Zi5hcHBlbmQoJ1xuJyk7CisgICAgICAgIGJ1Zi5hcHBlbmQodGFiMyk7CisgICAgICAgIGFwcGVuZERlc2NyaXB0b3IoSU5URVJOQUxfTkFNRSwgaC5nZXRPd25lcigpKTsKKyAgICAgICAgYnVmLmFwcGVuZCgnLicpOworICAgICAgICBidWYuYXBwZW5kKGguZ2V0TmFtZSgpKTsKKyAgICAgICAgYnVmLmFwcGVuZCgnKCcpOworICAgICAgICBhcHBlbmREZXNjcmlwdG9yKEhBTkRMRV9ERVNDUklQVE9SLCBoLmdldERlc2MoKSk7CisgICAgICAgIGJ1Zi5hcHBlbmQoJyknKS5hcHBlbmQoJ1xuJyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXBwZW5kcyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gYWNjZXNzIG1vZGlmaWVycyB0byB7QGxpbmsKKyAgICAgKiAjYnVmIGJ1Zn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWNjZXNzIHNvbWUgYWNjZXNzIG1vZGlmaWVycy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYXBwZW5kQWNjZXNzKGZpbmFsIGludCBhY2Nlc3MpIHsKKyAgICAgICAgaWYgKChhY2Nlc3MgJiBPcGNvZGVzLkFDQ19QVUJMSUMpICE9IDApIHsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoInB1YmxpYyAiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGFjY2VzcyAmIE9wY29kZXMuQUNDX1BSSVZBVEUpICE9IDApIHsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoInByaXZhdGUgIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChhY2Nlc3MgJiBPcGNvZGVzLkFDQ19QUk9URUNURUQpICE9IDApIHsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoInByb3RlY3RlZCAiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGFjY2VzcyAmIE9wY29kZXMuQUNDX0ZJTkFMKSAhPSAwKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKCJmaW5hbCAiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGFjY2VzcyAmIE9wY29kZXMuQUNDX1NUQVRJQykgIT0gMCkgeworICAgICAgICAgICAgYnVmLmFwcGVuZCgic3RhdGljICIpOworICAgICAgICB9CisgICAgICAgIGlmICgoYWNjZXNzICYgT3Bjb2Rlcy5BQ0NfU1lOQ0hST05JWkVEKSAhPSAwKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKCJzeW5jaHJvbml6ZWQgIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChhY2Nlc3MgJiBPcGNvZGVzLkFDQ19WT0xBVElMRSkgIT0gMCkgeworICAgICAgICAgICAgYnVmLmFwcGVuZCgidm9sYXRpbGUgIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChhY2Nlc3MgJiBPcGNvZGVzLkFDQ19UUkFOU0lFTlQpICE9IDApIHsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoInRyYW5zaWVudCAiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGFjY2VzcyAmIE9wY29kZXMuQUNDX0FCU1RSQUNUKSAhPSAwKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKCJhYnN0cmFjdCAiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGFjY2VzcyAmIE9wY29kZXMuQUNDX1NUUklDVCkgIT0gMCkgeworICAgICAgICAgICAgYnVmLmFwcGVuZCgic3RyaWN0ZnAgIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChhY2Nlc3MgJiBPcGNvZGVzLkFDQ19FTlVNKSAhPSAwKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKCJlbnVtICIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFwcGVuZENvbWEoZmluYWwgaW50IGkpIHsKKyAgICAgICAgaWYgKGkgIT0gMCkgeworICAgICAgICAgICAgYnVmLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhcHBlbmRGcmFtZVR5cGVzKGZpbmFsIGludCBuLCBmaW5hbCBPYmplY3RbXSBvKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKSB7CisgICAgICAgICAgICBpZiAoaSA+IDApIHsKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCcgJyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob1tpXSBpbnN0YW5jZW9mIFN0cmluZykgeworICAgICAgICAgICAgICAgIFN0cmluZyBkZXNjID0gKFN0cmluZykgb1tpXTsKKyAgICAgICAgICAgICAgICBpZiAoZGVzYy5zdGFydHNXaXRoKCJbIikpIHsKKyAgICAgICAgICAgICAgICAgICAgYXBwZW5kRGVzY3JpcHRvcihGSUVMRF9ERVNDUklQVE9SLCBkZXNjKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhcHBlbmREZXNjcmlwdG9yKElOVEVSTkFMX05BTUUsIGRlc2MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAob1tpXSBpbnN0YW5jZW9mIEludGVnZXIpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCgoSW50ZWdlcikgb1tpXSkuaW50VmFsdWUoKSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmREZXNjcmlwdG9yKEZJRUxEX0RFU0NSSVBUT1IsICJUIik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kRGVzY3JpcHRvcihGSUVMRF9ERVNDUklQVE9SLCAiSSIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZERlc2NyaXB0b3IoRklFTERfREVTQ1JJUFRPUiwgIkYiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmREZXNjcmlwdG9yKEZJRUxEX0RFU0NSSVBUT1IsICJEIik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kRGVzY3JpcHRvcihGSUVMRF9ERVNDUklQVE9SLCAiSiIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZERlc2NyaXB0b3IoRklFTERfREVTQ1JJUFRPUiwgIk4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmREZXNjcmlwdG9yKEZJRUxEX0RFU0NSSVBUT1IsICJVIik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGFwcGVuZExhYmVsKChMYWJlbCkgb1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL3V0aWwvVHJhY2VBbm5vdGF0aW9uVmlzaXRvci5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS91dGlsL1RyYWNlQW5ub3RhdGlvblZpc2l0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDhhMWE3Ci0tLSAvZGV2L251bGwKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS91dGlsL1RyYWNlQW5ub3RhdGlvblZpc2l0b3IuamF2YQpAQCAtMCwwICsxLDEyNSBAQAorLyoKKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgT3JhY2xlIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCisgKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CisgKiBxdWVzdGlvbnMuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBpcyBhdmFpbGFibGUgdW5kZXIgYW5kIGdvdmVybmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogSG93ZXZlciwgdGhlIGZvbGxvd2luZyBub3RpY2UgYWNjb21wYW5pZWQgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhpcworICogZmlsZToKKyAqCisgKiBBU006IGEgdmVyeSBzbWFsbCBhbmQgZmFzdCBKYXZhIGJ5dGVjb2RlIG1hbmlwdWxhdGlvbiBmcmFtZXdvcmsKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDExIElOUklBLCBGcmFuY2UgVGVsZWNvbQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS51dGlsOworCitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLkFubm90YXRpb25WaXNpdG9yOworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5PcGNvZGVzOworCisvKioKKyAqIEFuIHtAbGluayBBbm5vdGF0aW9uVmlzaXRvcn0gdGhhdCBwcmludHMgdGhlIGFubm90YXRpb25zIGl0IHZpc2l0cyB3aXRoIGEKKyAqIHtAbGluayBQcmludGVyfS4KKyAqCisgKiBAYXV0aG9yIEVyaWMgQnJ1bmV0b24KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFRyYWNlQW5ub3RhdGlvblZpc2l0b3IgZXh0ZW5kcyBBbm5vdGF0aW9uVmlzaXRvciB7CisKKyAgICBwcml2YXRlIGZpbmFsIFByaW50ZXIgcDsKKworICAgIHB1YmxpYyBUcmFjZUFubm90YXRpb25WaXNpdG9yKGZpbmFsIFByaW50ZXIgcCkgeworICAgICAgICB0aGlzKG51bGwsIHApOworICAgIH0KKworICAgIHB1YmxpYyBUcmFjZUFubm90YXRpb25WaXNpdG9yKGZpbmFsIEFubm90YXRpb25WaXNpdG9yIGF2LCBmaW5hbCBQcmludGVyIHApIHsKKyAgICAgICAgc3VwZXIoT3Bjb2Rlcy5BU000LCBhdik7CisgICAgICAgIHRoaXMucCA9IHA7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICBwLnZpc2l0KG5hbWUsIHZhbHVlKTsKKyAgICAgICAgc3VwZXIudmlzaXQobmFtZSwgdmFsdWUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0RW51bSgKKyAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUsCisgICAgICAgIGZpbmFsIFN0cmluZyBkZXNjLAorICAgICAgICBmaW5hbCBTdHJpbmcgdmFsdWUpCisgICAgeworICAgICAgICBwLnZpc2l0RW51bShuYW1lLCBkZXNjLCB2YWx1ZSk7CisgICAgICAgIHN1cGVyLnZpc2l0RW51bShuYW1lLCBkZXNjLCB2YWx1ZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEFubm90YXRpb25WaXNpdG9yIHZpc2l0QW5ub3RhdGlvbigKKyAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUsCisgICAgICAgIGZpbmFsIFN0cmluZyBkZXNjKQorICAgIHsKKyAgICAgICAgUHJpbnRlciBwID0gdGhpcy5wLnZpc2l0QW5ub3RhdGlvbihuYW1lLCBkZXNjKTsKKyAgICAgICAgQW5ub3RhdGlvblZpc2l0b3IgYXYgPSB0aGlzLmF2ID09IG51bGwKKyAgICAgICAgICAgICAgICA/IG51bGwKKyAgICAgICAgICAgICAgICA6IHRoaXMuYXYudmlzaXRBbm5vdGF0aW9uKG5hbWUsIGRlc2MpOworICAgICAgICByZXR1cm4gbmV3IFRyYWNlQW5ub3RhdGlvblZpc2l0b3IoYXYsIHApOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBBbm5vdGF0aW9uVmlzaXRvciB2aXNpdEFycmF5KGZpbmFsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIFByaW50ZXIgcCA9IHRoaXMucC52aXNpdEFycmF5KG5hbWUpOworICAgICAgICBBbm5vdGF0aW9uVmlzaXRvciBhdiA9IHRoaXMuYXYgPT0gbnVsbAorICAgICAgICAgICAgICAgID8gbnVsbAorICAgICAgICAgICAgICAgIDogdGhpcy5hdi52aXNpdEFycmF5KG5hbWUpOworICAgICAgICByZXR1cm4gbmV3IFRyYWNlQW5ub3RhdGlvblZpc2l0b3IoYXYsIHApOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0RW5kKCkgeworICAgICAgICBwLnZpc2l0QW5ub3RhdGlvbkVuZCgpOworICAgICAgICBzdXBlci52aXNpdEVuZCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vdXRpbC9UcmFjZUNsYXNzVmlzaXRvci5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS91dGlsL1RyYWNlQ2xhc3NWaXNpdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQyZDY2YQotLS0gL2Rldi9udWxsCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vdXRpbC9UcmFjZUNsYXNzVmlzaXRvci5qYXZhCkBAIC0wLDAgKzEsMjYyIEBACisvKgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBPcmFjbGUgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKKyAqIHF1ZXN0aW9ucy4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGlzIGF2YWlsYWJsZSB1bmRlciBhbmQgZ292ZXJuZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiBIb3dldmVyLCB0aGUgZm9sbG93aW5nIG5vdGljZSBhY2NvbXBhbmllZCB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGlzCisgKiBmaWxlOgorICoKKyAqIEFTTTogYSB2ZXJ5IHNtYWxsIGFuZCBmYXN0IEphdmEgYnl0ZWNvZGUgbWFuaXB1bGF0aW9uIGZyYW1ld29yaworICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMTEgSU5SSUEsIEZyYW5jZSBUZWxlY29tCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgR29vZ2xlCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2UgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLnV0aWw7CisKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworCitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLkFubm90YXRpb25WaXNpdG9yOworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5BdHRyaWJ1dGU7CitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLkNsYXNzVmlzaXRvcjsKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uRmllbGRWaXNpdG9yOworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5NZXRob2RWaXNpdG9yOworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5PcGNvZGVzOworCisvKioKKyAqIEEge0BsaW5rIENsYXNzVmlzaXRvcn0gdGhhdCBwcmludHMgdGhlIGNsYXNzZXMgaXQgdmlzaXRzIHdpdGggYQorICoge0BsaW5rIFByaW50ZXJ9LiBUaGlzIGNsYXNzIHZpc2l0b3IgY2FuIGJlIHVzZWQgaW4gdGhlIG1pZGRsZSBvZiBhIGNsYXNzCisgKiB2aXNpdG9yIGNoYWluIHRvIHRyYWNlIHRoZSBjbGFzcyB0aGF0IGlzIHZpc2l0ZWQgYXQgYSBnaXZlbiBwb2ludCBpbiB0aGlzCisgKiBjaGFpbi4gVGhpcyBtYXkgYmUgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuIDxwPiBUaGUgdHJhY2UgcHJpbnRlZCB3aGVuCisgKiB2aXNpdGluZyB0aGUgPHR0PkhlbGxvPC90dD4gY2xhc3MgaXMgdGhlIGZvbGxvd2luZzogPHA+IDxibG9ja3F1b3RlPgorICoKKyAqIDxwcmU+IC8vIGNsYXNzIHZlcnNpb24gNDkuMCAoNDkpIC8vIGFjY2VzcyBmbGFncyAweDIxIHB1YmxpYyBjbGFzcyBIZWxsbyB7CisgKgorICogLy8gY29tcGlsZWQgZnJvbTogSGVsbG8uamF2YQorICoKKyAqIC8vIGFjY2VzcyBmbGFncyAweDEgcHVibGljICZsdDtpbml0Jmd0OyAoKVYgQUxPQUQgMCBJTlZPS0VTUEVDSUFMCisgKiBqYXZhL2xhbmcvT2JqZWN0ICZsdDtpbml0Jmd0OyAoKVYgUkVUVVJOIE1BWFNUQUNLID0gMSBNQVhMT0NBTFMgPSAxCisgKgorICogLy8gYWNjZXNzIGZsYWdzIDB4OSBwdWJsaWMgc3RhdGljIG1haW4gKFtMamF2YS9sYW5nL1N0cmluZzspViBHRVRTVEFUSUMKKyAqIGphdmEvbGFuZy9TeXN0ZW0gb3V0IExqYXZhL2lvL1ByaW50U3RyZWFtOyBMREMgJnF1b3Q7aGVsbG8mcXVvdDsKKyAqIElOVk9LRVZJUlRVQUwgamF2YS9pby9QcmludFN0cmVhbSBwcmludGxuIChMamF2YS9sYW5nL1N0cmluZzspViBSRVRVUk4KKyAqIE1BWFNUQUNLID0gMiBNQVhMT0NBTFMgPSAxIH0gPC9wcmU+CisgKgorICogPC9ibG9ja3F1b3RlPiB3aGVyZSA8dHQ+SGVsbG88L3R0PiBpcyBkZWZpbmVkIGJ5OiA8cD4gPGJsb2NrcXVvdGU+CisgKgorICogPHByZT4gcHVibGljIGNsYXNzIEhlbGxvIHsKKyAqCisgKiBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgKiBTeXN0ZW0ub3V0LnByaW50bG4oJnF1b3Q7aGVsbG8mcXVvdDspOyB9IH0gPC9wcmU+CisgKgorICogPC9ibG9ja3F1b3RlPgorICoKKyAqIEBhdXRob3IgRXJpYyBCcnVuZXRvbgorICogQGF1dGhvciBFdWdlbmUgS3VsZXNob3YKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFRyYWNlQ2xhc3NWaXNpdG9yIGV4dGVuZHMgQ2xhc3NWaXNpdG9yIHsKKworICAgIC8qKgorICAgICAqIFRoZSBwcmludCB3cml0ZXIgdG8gYmUgdXNlZCB0byBwcmludCB0aGUgY2xhc3MuIE1heSBiZSBudWxsLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgUHJpbnRXcml0ZXIgcHc7CisKKyAgICAvKioKKyAgICAgKiBUaGUgb2JqZWN0IHRoYXQgYWN0dWFsbHkgY29udmVydHMgdmlzaXQgZXZlbnRzIGludG8gdGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgUHJpbnRlciBwOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGxpbmsgVHJhY2VDbGFzc1Zpc2l0b3J9LgorICAgICAqCisgICAgICogQHBhcmFtIHB3IHRoZSBwcmludCB3cml0ZXIgdG8gYmUgdXNlZCB0byBwcmludCB0aGUgY2xhc3MuCisgICAgICovCisgICAgcHVibGljIFRyYWNlQ2xhc3NWaXNpdG9yKGZpbmFsIFByaW50V3JpdGVyIHB3KSB7CisgICAgICAgIHRoaXMobnVsbCwgcHcpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0BsaW5rIFRyYWNlQ2xhc3NWaXNpdG9yfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjdiB0aGUge0BsaW5rIENsYXNzVmlzaXRvcn0gdG8gd2hpY2ggdGhpcyB2aXNpdG9yIGRlbGVnYXRlcyBjYWxscy4KKyAgICAgKiAgICAgICAgTWF5IGJlIDx0dD5udWxsPC90dD4uCisgICAgICogQHBhcmFtIHB3IHRoZSBwcmludCB3cml0ZXIgdG8gYmUgdXNlZCB0byBwcmludCB0aGUgY2xhc3MuCisgICAgICovCisgICAgcHVibGljIFRyYWNlQ2xhc3NWaXNpdG9yKGZpbmFsIENsYXNzVmlzaXRvciBjdiwgZmluYWwgUHJpbnRXcml0ZXIgcHcpIHsKKyAgICAgICAgdGhpcyhjdiwgbmV3IFRleHRpZmllcigpLCBwdyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGxpbmsgVHJhY2VDbGFzc1Zpc2l0b3J9LgorICAgICAqCisgICAgICogQHBhcmFtIGN2IHRoZSB7QGxpbmsgQ2xhc3NWaXNpdG9yfSB0byB3aGljaCB0aGlzIHZpc2l0b3IgZGVsZWdhdGVzIGNhbGxzLgorICAgICAqICAgICAgICBNYXkgYmUgPHR0Pm51bGw8L3R0Pi4KKyAgICAgKiBAcGFyYW0gcCB0aGUgb2JqZWN0IHRoYXQgYWN0dWFsbHkgY29udmVydHMgdmlzaXQgZXZlbnRzIGludG8gdGV4dC4KKyAgICAgKiBAcGFyYW0gcHcgdGhlIHByaW50IHdyaXRlciB0byBiZSB1c2VkIHRvIHByaW50IHRoZSBjbGFzcy4gTWF5IGJlIG51bGwgaWYKKyAgICAgKiAgICAgICAgeW91IHNpbXBseSB3YW50IHRvIHVzZSB0aGUgcmVzdWx0IHZpYQorICAgICAqICAgICAgICB7QGxpbmsgUHJpbnRlciNnZXRUZXh0KCl9LCBpbnN0ZWFkIG9mIHByaW50aW5nIGl0LgorICAgICAqLworICAgIHB1YmxpYyBUcmFjZUNsYXNzVmlzaXRvcigKKyAgICAgICAgZmluYWwgQ2xhc3NWaXNpdG9yIGN2LAorICAgICAgICBmaW5hbCBQcmludGVyIHAsCisgICAgICAgIGZpbmFsIFByaW50V3JpdGVyIHB3KQorICAgIHsKKyAgICAgICAgc3VwZXIoT3Bjb2Rlcy5BU000LCBjdik7CisgICAgICAgIHRoaXMucHcgPSBwdzsKKyAgICAgICAgdGhpcy5wID0gcDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdCgKKyAgICAgICAgZmluYWwgaW50IHZlcnNpb24sCisgICAgICAgIGZpbmFsIGludCBhY2Nlc3MsCisgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lLAorICAgICAgICBmaW5hbCBTdHJpbmcgc2lnbmF0dXJlLAorICAgICAgICBmaW5hbCBTdHJpbmcgc3VwZXJOYW1lLAorICAgICAgICBmaW5hbCBTdHJpbmdbXSBpbnRlcmZhY2VzKQorICAgIHsKKyAgICAgICAgcC52aXNpdCh2ZXJzaW9uLCBhY2Nlc3MsIG5hbWUsIHNpZ25hdHVyZSwgc3VwZXJOYW1lLCBpbnRlcmZhY2VzKTsKKyAgICAgICAgc3VwZXIudmlzaXQodmVyc2lvbiwgYWNjZXNzLCBuYW1lLCBzaWduYXR1cmUsIHN1cGVyTmFtZSwgaW50ZXJmYWNlcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRTb3VyY2UoZmluYWwgU3RyaW5nIGZpbGUsIGZpbmFsIFN0cmluZyBkZWJ1ZykgeworICAgICAgICBwLnZpc2l0U291cmNlKGZpbGUsIGRlYnVnKTsKKyAgICAgICAgc3VwZXIudmlzaXRTb3VyY2UoZmlsZSwgZGVidWcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0T3V0ZXJDbGFzcygKKyAgICAgICAgZmluYWwgU3RyaW5nIG93bmVyLAorICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSwKKyAgICAgICAgZmluYWwgU3RyaW5nIGRlc2MpCisgICAgeworICAgICAgICBwLnZpc2l0T3V0ZXJDbGFzcyhvd25lciwgbmFtZSwgZGVzYyk7CisgICAgICAgIHN1cGVyLnZpc2l0T3V0ZXJDbGFzcyhvd25lciwgbmFtZSwgZGVzYyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEFubm90YXRpb25WaXNpdG9yIHZpc2l0QW5ub3RhdGlvbigKKyAgICAgICAgZmluYWwgU3RyaW5nIGRlc2MsCisgICAgICAgIGZpbmFsIGJvb2xlYW4gdmlzaWJsZSkKKyAgICB7CisgICAgICAgIFByaW50ZXIgcCA9IHRoaXMucC52aXNpdENsYXNzQW5ub3RhdGlvbihkZXNjLCB2aXNpYmxlKTsKKyAgICAgICAgQW5ub3RhdGlvblZpc2l0b3IgYXYgPSBjdiA9PSBudWxsID8gbnVsbCA6IGN2LnZpc2l0QW5ub3RhdGlvbihkZXNjLAorICAgICAgICAgICAgICAgIHZpc2libGUpOworICAgICAgICByZXR1cm4gbmV3IFRyYWNlQW5ub3RhdGlvblZpc2l0b3IoYXYsIHApOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0QXR0cmlidXRlKGZpbmFsIEF0dHJpYnV0ZSBhdHRyKSB7CisgICAgICAgIHAudmlzaXRDbGFzc0F0dHJpYnV0ZShhdHRyKTsKKyAgICAgICAgc3VwZXIudmlzaXRBdHRyaWJ1dGUoYXR0cik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRJbm5lckNsYXNzKAorICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSwKKyAgICAgICAgZmluYWwgU3RyaW5nIG91dGVyTmFtZSwKKyAgICAgICAgZmluYWwgU3RyaW5nIGlubmVyTmFtZSwKKyAgICAgICAgZmluYWwgaW50IGFjY2VzcykKKyAgICB7CisgICAgICAgIHAudmlzaXRJbm5lckNsYXNzKG5hbWUsIG91dGVyTmFtZSwgaW5uZXJOYW1lLCBhY2Nlc3MpOworICAgICAgICBzdXBlci52aXNpdElubmVyQ2xhc3MobmFtZSwgb3V0ZXJOYW1lLCBpbm5lck5hbWUsIGFjY2Vzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEZpZWxkVmlzaXRvciB2aXNpdEZpZWxkKAorICAgICAgICBmaW5hbCBpbnQgYWNjZXNzLAorICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSwKKyAgICAgICAgZmluYWwgU3RyaW5nIGRlc2MsCisgICAgICAgIGZpbmFsIFN0cmluZyBzaWduYXR1cmUsCisgICAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSkKKyAgICB7CisgICAgICAgIFByaW50ZXIgcCA9IHRoaXMucC52aXNpdEZpZWxkKGFjY2VzcywKKyAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgIGRlc2MsCisgICAgICAgICAgICAgICAgc2lnbmF0dXJlLAorICAgICAgICAgICAgICAgIHZhbHVlKTsKKyAgICAgICAgRmllbGRWaXNpdG9yIGZ2ID0gY3YgPT0gbnVsbCA/IG51bGwgOiBjdi52aXNpdEZpZWxkKGFjY2VzcywKKyAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgIGRlc2MsCisgICAgICAgICAgICAgICAgc2lnbmF0dXJlLAorICAgICAgICAgICAgICAgIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIG5ldyBUcmFjZUZpZWxkVmlzaXRvcihmdiwgcCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE1ldGhvZFZpc2l0b3IgdmlzaXRNZXRob2QoCisgICAgICAgIGZpbmFsIGludCBhY2Nlc3MsCisgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lLAorICAgICAgICBmaW5hbCBTdHJpbmcgZGVzYywKKyAgICAgICAgZmluYWwgU3RyaW5nIHNpZ25hdHVyZSwKKyAgICAgICAgZmluYWwgU3RyaW5nW10gZXhjZXB0aW9ucykKKyAgICB7CisgICAgICAgIFByaW50ZXIgcCA9IHRoaXMucC52aXNpdE1ldGhvZChhY2Nlc3MsCisgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICBkZXNjLAorICAgICAgICAgICAgICAgIHNpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICBleGNlcHRpb25zKTsKKyAgICAgICAgTWV0aG9kVmlzaXRvciBtdiA9IGN2ID09IG51bGwgPyBudWxsIDogY3YudmlzaXRNZXRob2QoYWNjZXNzLAorICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgZGVzYywKKyAgICAgICAgICAgICAgICBzaWduYXR1cmUsCisgICAgICAgICAgICAgICAgZXhjZXB0aW9ucyk7CisgICAgICAgIHJldHVybiBuZXcgVHJhY2VNZXRob2RWaXNpdG9yKG12LCBwKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEVuZCgpIHsKKyAgICAgICAgcC52aXNpdENsYXNzRW5kKCk7CisgICAgICAgIGlmIChwdyAhPSBudWxsKSB7CisgICAgICAgICAgICBwLnByaW50KHB3KTsKKyAgICAgICAgICAgIHB3LmZsdXNoKCk7CisgICAgICAgIH0KKyAgICAgICAgc3VwZXIudmlzaXRFbmQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL3V0aWwvVHJhY2VGaWVsZFZpc2l0b3IuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vdXRpbC9UcmFjZUZpZWxkVmlzaXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiNGQ4Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvamRrL2ludGVybmFsL29yZy9vYmplY3R3ZWIvYXNtL3V0aWwvVHJhY2VGaWVsZFZpc2l0b3IuamF2YQpAQCAtMCwwICsxLDEwOCBAQAorLyoKKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgT3JhY2xlIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCisgKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CisgKiBxdWVzdGlvbnMuCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBpcyBhdmFpbGFibGUgdW5kZXIgYW5kIGdvdmVybmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogSG93ZXZlciwgdGhlIGZvbGxvd2luZyBub3RpY2UgYWNjb21wYW5pZWQgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhpcworICogZmlsZToKKyAqCisgKiBBU006IGEgdmVyeSBzbWFsbCBhbmQgZmFzdCBKYXZhIGJ5dGVjb2RlIG1hbmlwdWxhdGlvbiBmcmFtZXdvcmsKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDExIElOUklBLCBGcmFuY2UgVGVsZWNvbQorICogQ29weXJpZ2h0IChjKSAyMDExIEdvb2dsZQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS51dGlsOworCitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLkFubm90YXRpb25WaXNpdG9yOworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5BdHRyaWJ1dGU7CitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLkZpZWxkVmlzaXRvcjsKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uT3Bjb2RlczsKKworLyoqCisgKiBBIHtAbGluayBGaWVsZFZpc2l0b3J9IHRoYXQgcHJpbnRzIHRoZSBmaWVsZHMgaXQgdmlzaXRzIHdpdGggYQorICoge0BsaW5rIFByaW50ZXJ9LgorICoKKyAqIEBhdXRob3IgRXJpYyBCcnVuZXRvbgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgVHJhY2VGaWVsZFZpc2l0b3IgZXh0ZW5kcyBGaWVsZFZpc2l0b3IgeworCisgICAgcHVibGljIGZpbmFsIFByaW50ZXIgcDsKKworICAgIHB1YmxpYyBUcmFjZUZpZWxkVmlzaXRvcihmaW5hbCBQcmludGVyIHApIHsKKyAgICAgICAgdGhpcyhudWxsLCBwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVHJhY2VGaWVsZFZpc2l0b3IoZmluYWwgRmllbGRWaXNpdG9yIGZ2LCBmaW5hbCBQcmludGVyIHApIHsKKyAgICAgICAgc3VwZXIoT3Bjb2Rlcy5BU000LCBmdik7CisgICAgICAgIHRoaXMucCA9IHA7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEFubm90YXRpb25WaXNpdG9yIHZpc2l0QW5ub3RhdGlvbigKKyAgICAgICAgZmluYWwgU3RyaW5nIGRlc2MsCisgICAgICAgIGZpbmFsIGJvb2xlYW4gdmlzaWJsZSkKKyAgICB7CisgICAgICAgIFByaW50ZXIgcCA9IHRoaXMucC52aXNpdEZpZWxkQW5ub3RhdGlvbihkZXNjLCB2aXNpYmxlKTsKKyAgICAgICAgQW5ub3RhdGlvblZpc2l0b3IgYXYgPSBmdiA9PSBudWxsID8gbnVsbCA6IGZ2LnZpc2l0QW5ub3RhdGlvbihkZXNjLAorICAgICAgICAgICAgICAgIHZpc2libGUpOworICAgICAgICByZXR1cm4gbmV3IFRyYWNlQW5ub3RhdGlvblZpc2l0b3IoYXYsIHApOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0QXR0cmlidXRlKGZpbmFsIEF0dHJpYnV0ZSBhdHRyKSB7CisgICAgICAgIHAudmlzaXRGaWVsZEF0dHJpYnV0ZShhdHRyKTsKKyAgICAgICAgc3VwZXIudmlzaXRBdHRyaWJ1dGUoYXR0cik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRFbmQoKSB7CisgICAgICAgIHAudmlzaXRGaWVsZEVuZCgpOworICAgICAgICBzdXBlci52aXNpdEVuZCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vdXRpbC9UcmFjZU1ldGhvZFZpc2l0b3IuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vdXRpbC9UcmFjZU1ldGhvZFZpc2l0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDA5NjRjCi0tLSAvZGV2L251bGwKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS91dGlsL1RyYWNlTWV0aG9kVmlzaXRvci5qYXZhCkBAIC0wLDAgKzEsMjk0IEBACisvKgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBPcmFjbGUgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKKyAqIHF1ZXN0aW9ucy4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGlzIGF2YWlsYWJsZSB1bmRlciBhbmQgZ292ZXJuZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiBIb3dldmVyLCB0aGUgZm9sbG93aW5nIG5vdGljZSBhY2NvbXBhbmllZCB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGlzCisgKiBmaWxlOgorICoKKyAqIEFTTTogYSB2ZXJ5IHNtYWxsIGFuZCBmYXN0IEphdmEgYnl0ZWNvZGUgbWFuaXB1bGF0aW9uIGZyYW1ld29yaworICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMTEgSU5SSUEsIEZyYW5jZSBUZWxlY29tCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgR29vZ2xlCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2UgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLnV0aWw7CisKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uQW5ub3RhdGlvblZpc2l0b3I7CitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLkF0dHJpYnV0ZTsKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uSGFuZGxlOworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS5MYWJlbDsKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uTWV0aG9kVmlzaXRvcjsKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uT3Bjb2RlczsKKworLyoqCisgKiBBIHtAbGluayBNZXRob2RWaXNpdG9yfSB0aGF0IHByaW50cyB0aGUgbWV0aG9kcyBpdCB2aXNpdHMgd2l0aCBhCisgKiB7QGxpbmsgUHJpbnRlcn0uCisgKgorICogQGF1dGhvciBFcmljIEJydW5ldG9uCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBUcmFjZU1ldGhvZFZpc2l0b3IgZXh0ZW5kcyBNZXRob2RWaXNpdG9yIHsKKworICAgIHB1YmxpYyBmaW5hbCBQcmludGVyIHA7CisKKyAgICBwdWJsaWMgVHJhY2VNZXRob2RWaXNpdG9yKGZpbmFsIFByaW50ZXIgcCkgeworICAgICAgICB0aGlzKG51bGwsIHApOworICAgIH0KKworICAgIHB1YmxpYyBUcmFjZU1ldGhvZFZpc2l0b3IoZmluYWwgTWV0aG9kVmlzaXRvciBtdiwgZmluYWwgUHJpbnRlciBwKSB7CisgICAgICAgIHN1cGVyKE9wY29kZXMuQVNNNCwgbXYpOworICAgICAgICB0aGlzLnAgPSBwOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBBbm5vdGF0aW9uVmlzaXRvciB2aXNpdEFubm90YXRpb24oCisgICAgICAgIGZpbmFsIFN0cmluZyBkZXNjLAorICAgICAgICBmaW5hbCBib29sZWFuIHZpc2libGUpCisgICAgeworICAgICAgICBQcmludGVyIHAgPSB0aGlzLnAudmlzaXRNZXRob2RBbm5vdGF0aW9uKGRlc2MsIHZpc2libGUpOworICAgICAgICBBbm5vdGF0aW9uVmlzaXRvciBhdiA9IG12ID09IG51bGwgPyBudWxsIDogbXYudmlzaXRBbm5vdGF0aW9uKGRlc2MsCisgICAgICAgICAgICAgICAgdmlzaWJsZSk7CisgICAgICAgIHJldHVybiBuZXcgVHJhY2VBbm5vdGF0aW9uVmlzaXRvcihhdiwgcCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRBdHRyaWJ1dGUoZmluYWwgQXR0cmlidXRlIGF0dHIpIHsKKyAgICAgICAgcC52aXNpdE1ldGhvZEF0dHJpYnV0ZShhdHRyKTsKKyAgICAgICAgc3VwZXIudmlzaXRBdHRyaWJ1dGUoYXR0cik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEFubm90YXRpb25WaXNpdG9yIHZpc2l0QW5ub3RhdGlvbkRlZmF1bHQoKSB7CisgICAgICAgIFByaW50ZXIgcCA9IHRoaXMucC52aXNpdEFubm90YXRpb25EZWZhdWx0KCk7CisgICAgICAgIEFubm90YXRpb25WaXNpdG9yIGF2ID0gbXYgPT0gbnVsbCA/IG51bGwgOiBtdi52aXNpdEFubm90YXRpb25EZWZhdWx0KCk7CisgICAgICAgIHJldHVybiBuZXcgVHJhY2VBbm5vdGF0aW9uVmlzaXRvcihhdiwgcCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEFubm90YXRpb25WaXNpdG9yIHZpc2l0UGFyYW1ldGVyQW5ub3RhdGlvbigKKyAgICAgICAgZmluYWwgaW50IHBhcmFtZXRlciwKKyAgICAgICAgZmluYWwgU3RyaW5nIGRlc2MsCisgICAgICAgIGZpbmFsIGJvb2xlYW4gdmlzaWJsZSkKKyAgICB7CisgICAgICAgIFByaW50ZXIgcCA9IHRoaXMucC52aXNpdFBhcmFtZXRlckFubm90YXRpb24ocGFyYW1ldGVyLAorICAgICAgICAgICAgICAgIGRlc2MsCisgICAgICAgICAgICAgICAgdmlzaWJsZSk7CisgICAgICAgIEFubm90YXRpb25WaXNpdG9yIGF2ID0gbXYgPT0gbnVsbAorICAgICAgICAgICAgICAgID8gbnVsbAorICAgICAgICAgICAgICAgIDogbXYudmlzaXRQYXJhbWV0ZXJBbm5vdGF0aW9uKHBhcmFtZXRlciwgZGVzYywgdmlzaWJsZSk7CisgICAgICAgIHJldHVybiBuZXcgVHJhY2VBbm5vdGF0aW9uVmlzaXRvcihhdiwgcCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRDb2RlKCkgeworICAgICAgICBwLnZpc2l0Q29kZSgpOworICAgICAgICBzdXBlci52aXNpdENvZGUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEZyYW1lKAorICAgICAgICBmaW5hbCBpbnQgdHlwZSwKKyAgICAgICAgZmluYWwgaW50IG5Mb2NhbCwKKyAgICAgICAgZmluYWwgT2JqZWN0W10gbG9jYWwsCisgICAgICAgIGZpbmFsIGludCBuU3RhY2ssCisgICAgICAgIGZpbmFsIE9iamVjdFtdIHN0YWNrKQorICAgIHsKKyAgICAgICAgcC52aXNpdEZyYW1lKHR5cGUsIG5Mb2NhbCwgbG9jYWwsIG5TdGFjaywgc3RhY2spOworICAgICAgICBzdXBlci52aXNpdEZyYW1lKHR5cGUsIG5Mb2NhbCwgbG9jYWwsIG5TdGFjaywgc3RhY2spOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0SW5zbihmaW5hbCBpbnQgb3Bjb2RlKSB7CisgICAgICAgIHAudmlzaXRJbnNuKG9wY29kZSk7CisgICAgICAgIHN1cGVyLnZpc2l0SW5zbihvcGNvZGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0SW50SW5zbihmaW5hbCBpbnQgb3Bjb2RlLCBmaW5hbCBpbnQgb3BlcmFuZCkgeworICAgICAgICBwLnZpc2l0SW50SW5zbihvcGNvZGUsIG9wZXJhbmQpOworICAgICAgICBzdXBlci52aXNpdEludEluc24ob3Bjb2RlLCBvcGVyYW5kKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFZhckluc24oZmluYWwgaW50IG9wY29kZSwgZmluYWwgaW50IHZhcikgeworICAgICAgICBwLnZpc2l0VmFySW5zbihvcGNvZGUsIHZhcik7CisgICAgICAgIHN1cGVyLnZpc2l0VmFySW5zbihvcGNvZGUsIHZhcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRUeXBlSW5zbihmaW5hbCBpbnQgb3Bjb2RlLCBmaW5hbCBTdHJpbmcgdHlwZSkgeworICAgICAgICBwLnZpc2l0VHlwZUluc24ob3Bjb2RlLCB0eXBlKTsKKyAgICAgICAgc3VwZXIudmlzaXRUeXBlSW5zbihvcGNvZGUsIHR5cGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0RmllbGRJbnNuKAorICAgICAgICBmaW5hbCBpbnQgb3Bjb2RlLAorICAgICAgICBmaW5hbCBTdHJpbmcgb3duZXIsCisgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lLAorICAgICAgICBmaW5hbCBTdHJpbmcgZGVzYykKKyAgICB7CisgICAgICAgIHAudmlzaXRGaWVsZEluc24ob3Bjb2RlLCBvd25lciwgbmFtZSwgZGVzYyk7CisgICAgICAgIHN1cGVyLnZpc2l0RmllbGRJbnNuKG9wY29kZSwgb3duZXIsIG5hbWUsIGRlc2MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TWV0aG9kSW5zbigKKyAgICAgICAgZmluYWwgaW50IG9wY29kZSwKKyAgICAgICAgZmluYWwgU3RyaW5nIG93bmVyLAorICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSwKKyAgICAgICAgZmluYWwgU3RyaW5nIGRlc2MpCisgICAgeworICAgICAgICBwLnZpc2l0TWV0aG9kSW5zbihvcGNvZGUsIG93bmVyLCBuYW1lLCBkZXNjKTsKKyAgICAgICAgc3VwZXIudmlzaXRNZXRob2RJbnNuKG9wY29kZSwgb3duZXIsIG5hbWUsIGRlc2MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0SW52b2tlRHluYW1pY0luc24oCisgICAgICAgIFN0cmluZyBuYW1lLAorICAgICAgICBTdHJpbmcgZGVzYywKKyAgICAgICAgSGFuZGxlIGJzbSwKKyAgICAgICAgT2JqZWN0Li4uIGJzbUFyZ3MpCisgICAgeworICAgICAgICBwLnZpc2l0SW52b2tlRHluYW1pY0luc24obmFtZSwgZGVzYywgYnNtLCBic21BcmdzKTsKKyAgICAgICAgc3VwZXIudmlzaXRJbnZva2VEeW5hbWljSW5zbihuYW1lLCBkZXNjLCBic20sIGJzbUFyZ3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0SnVtcEluc24oZmluYWwgaW50IG9wY29kZSwgZmluYWwgTGFiZWwgbGFiZWwpIHsKKyAgICAgICAgcC52aXNpdEp1bXBJbnNuKG9wY29kZSwgbGFiZWwpOworICAgICAgICBzdXBlci52aXNpdEp1bXBJbnNuKG9wY29kZSwgbGFiZWwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TGFiZWwoZmluYWwgTGFiZWwgbGFiZWwpIHsKKyAgICAgICAgcC52aXNpdExhYmVsKGxhYmVsKTsKKyAgICAgICAgc3VwZXIudmlzaXRMYWJlbChsYWJlbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRMZGNJbnNuKGZpbmFsIE9iamVjdCBjc3QpIHsKKyAgICAgICAgcC52aXNpdExkY0luc24oY3N0KTsKKyAgICAgICAgc3VwZXIudmlzaXRMZGNJbnNuKGNzdCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRJaW5jSW5zbihmaW5hbCBpbnQgdmFyLCBmaW5hbCBpbnQgaW5jcmVtZW50KSB7CisgICAgICAgIHAudmlzaXRJaW5jSW5zbih2YXIsIGluY3JlbWVudCk7CisgICAgICAgIHN1cGVyLnZpc2l0SWluY0luc24odmFyLCBpbmNyZW1lbnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0VGFibGVTd2l0Y2hJbnNuKAorICAgICAgICBmaW5hbCBpbnQgbWluLAorICAgICAgICBmaW5hbCBpbnQgbWF4LAorICAgICAgICBmaW5hbCBMYWJlbCBkZmx0LAorICAgICAgICBmaW5hbCBMYWJlbC4uLiBsYWJlbHMpCisgICAgeworICAgICAgICBwLnZpc2l0VGFibGVTd2l0Y2hJbnNuKG1pbiwgbWF4LCBkZmx0LCBsYWJlbHMpOworICAgICAgICBzdXBlci52aXNpdFRhYmxlU3dpdGNoSW5zbihtaW4sIG1heCwgZGZsdCwgbGFiZWxzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdExvb2t1cFN3aXRjaEluc24oCisgICAgICAgIGZpbmFsIExhYmVsIGRmbHQsCisgICAgICAgIGZpbmFsIGludFtdIGtleXMsCisgICAgICAgIGZpbmFsIExhYmVsW10gbGFiZWxzKQorICAgIHsKKyAgICAgICAgcC52aXNpdExvb2t1cFN3aXRjaEluc24oZGZsdCwga2V5cywgbGFiZWxzKTsKKyAgICAgICAgc3VwZXIudmlzaXRMb29rdXBTd2l0Y2hJbnNuKGRmbHQsIGtleXMsIGxhYmVscyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRNdWx0aUFOZXdBcnJheUluc24oZmluYWwgU3RyaW5nIGRlc2MsIGZpbmFsIGludCBkaW1zKSB7CisgICAgICAgIHAudmlzaXRNdWx0aUFOZXdBcnJheUluc24oZGVzYywgZGltcyk7CisgICAgICAgIHN1cGVyLnZpc2l0TXVsdGlBTmV3QXJyYXlJbnNuKGRlc2MsIGRpbXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0VHJ5Q2F0Y2hCbG9jaygKKyAgICAgICAgZmluYWwgTGFiZWwgc3RhcnQsCisgICAgICAgIGZpbmFsIExhYmVsIGVuZCwKKyAgICAgICAgZmluYWwgTGFiZWwgaGFuZGxlciwKKyAgICAgICAgZmluYWwgU3RyaW5nIHR5cGUpCisgICAgeworICAgICAgICBwLnZpc2l0VHJ5Q2F0Y2hCbG9jayhzdGFydCwgZW5kLCBoYW5kbGVyLCB0eXBlKTsKKyAgICAgICAgc3VwZXIudmlzaXRUcnlDYXRjaEJsb2NrKHN0YXJ0LCBlbmQsIGhhbmRsZXIsIHR5cGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TG9jYWxWYXJpYWJsZSgKKyAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUsCisgICAgICAgIGZpbmFsIFN0cmluZyBkZXNjLAorICAgICAgICBmaW5hbCBTdHJpbmcgc2lnbmF0dXJlLAorICAgICAgICBmaW5hbCBMYWJlbCBzdGFydCwKKyAgICAgICAgZmluYWwgTGFiZWwgZW5kLAorICAgICAgICBmaW5hbCBpbnQgaW5kZXgpCisgICAgeworICAgICAgICBwLnZpc2l0TG9jYWxWYXJpYWJsZShuYW1lLCBkZXNjLCBzaWduYXR1cmUsIHN0YXJ0LCBlbmQsIGluZGV4KTsKKyAgICAgICAgc3VwZXIudmlzaXRMb2NhbFZhcmlhYmxlKG5hbWUsIGRlc2MsIHNpZ25hdHVyZSwgc3RhcnQsIGVuZCwgaW5kZXgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TGluZU51bWJlcihmaW5hbCBpbnQgbGluZSwgZmluYWwgTGFiZWwgc3RhcnQpIHsKKyAgICAgICAgcC52aXNpdExpbmVOdW1iZXIobGluZSwgc3RhcnQpOworICAgICAgICBzdXBlci52aXNpdExpbmVOdW1iZXIobGluZSwgc3RhcnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TWF4cyhmaW5hbCBpbnQgbWF4U3RhY2ssIGZpbmFsIGludCBtYXhMb2NhbHMpIHsKKyAgICAgICAgcC52aXNpdE1heHMobWF4U3RhY2ssIG1heExvY2Fscyk7CisgICAgICAgIHN1cGVyLnZpc2l0TWF4cyhtYXhTdGFjaywgbWF4TG9jYWxzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEVuZCgpIHsKKyAgICAgICAgcC52aXNpdE1ldGhvZEVuZCgpOworICAgICAgICBzdXBlci52aXNpdEVuZCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vdXRpbC9UcmFjZVNpZ25hdHVyZVZpc2l0b3IuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9qZGsvaW50ZXJuYWwvb3JnL29iamVjdHdlYi9hc20vdXRpbC9UcmFjZVNpZ25hdHVyZVZpc2l0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjQ0YmNmCi0tLSAvZGV2L251bGwKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL2pkay9pbnRlcm5hbC9vcmcvb2JqZWN0d2ViL2FzbS91dGlsL1RyYWNlU2lnbmF0dXJlVmlzaXRvci5qYXZhCkBAIC0wLDAgKzEsMzQ3IEBACisvKgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBPcmFjbGUgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKKyAqIHF1ZXN0aW9ucy4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGlzIGF2YWlsYWJsZSB1bmRlciBhbmQgZ292ZXJuZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiBIb3dldmVyLCB0aGUgZm9sbG93aW5nIG5vdGljZSBhY2NvbXBhbmllZCB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGlzCisgKiBmaWxlOgorICoKKyAqIEFTTTogYSB2ZXJ5IHNtYWxsIGFuZCBmYXN0IEphdmEgYnl0ZWNvZGUgbWFuaXB1bGF0aW9uIGZyYW1ld29yaworICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMTEgSU5SSUEsIEZyYW5jZSBUZWxlY29tCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2UgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLnV0aWw7CisKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uT3Bjb2RlczsKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uc2lnbmF0dXJlLlNpZ25hdHVyZVZpc2l0b3I7CisKKy8qKgorICogQSB7QGxpbmsgU2lnbmF0dXJlVmlzaXRvcn0gdGhhdCBwcmludHMgYSBkaXNhc3NlbWJsZWQgdmlldyBvZiB0aGUgc2lnbmF0dXJlCisgKiBpdCB2aXNpdHMuCisgKgorICogQGF1dGhvciBFdWdlbmUgS3VsZXNob3YKKyAqIEBhdXRob3IgRXJpYyBCcnVuZXRvbgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgVHJhY2VTaWduYXR1cmVWaXNpdG9yIGV4dGVuZHMgU2lnbmF0dXJlVmlzaXRvciB7CisKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZ0J1ZmZlciBkZWNsYXJhdGlvbjsKKworICAgIHByaXZhdGUgYm9vbGVhbiBpc0ludGVyZmFjZTsKKworICAgIHByaXZhdGUgYm9vbGVhbiBzZWVuRm9ybWFsUGFyYW1ldGVyOworCisgICAgcHJpdmF0ZSBib29sZWFuIHNlZW5JbnRlcmZhY2VCb3VuZDsKKworICAgIHByaXZhdGUgYm9vbGVhbiBzZWVuUGFyYW1ldGVyOworCisgICAgcHJpdmF0ZSBib29sZWFuIHNlZW5JbnRlcmZhY2U7CisKKyAgICBwcml2YXRlIFN0cmluZ0J1ZmZlciByZXR1cm5UeXBlOworCisgICAgcHJpdmF0ZSBTdHJpbmdCdWZmZXIgZXhjZXB0aW9uczsKKworICAgIC8qKgorICAgICAqIFN0YWNrIHVzZWQgdG8ga2VlcCB0cmFjayBvZiBjbGFzcyB0eXBlcyB0aGF0IGhhdmUgYXJndW1lbnRzLiBFYWNoIGVsZW1lbnQKKyAgICAgKiBvZiB0aGlzIHN0YWNrIGlzIGEgYm9vbGVhbiBlbmNvZGVkIGluIG9uZSBiaXQuIFRoZSB0b3Agb2YgdGhlIHN0YWNrIGlzCisgICAgICogdGhlIGxvd2VzdCBvcmRlciBiaXQuIFB1c2hpbmcgZmFsc2UgPSAqMiwgcHVzaGluZyB0cnVlID0gKjIrMSwgcG9wcGluZyA9CisgICAgICogLzIuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgYXJndW1lbnRTdGFjazsKKworICAgIC8qKgorICAgICAqIFN0YWNrIHVzZWQgdG8ga2VlcCB0cmFjayBvZiBhcnJheSBjbGFzcyB0eXBlcy4gRWFjaCBlbGVtZW50IG9mIHRoaXMgc3RhY2sKKyAgICAgKiBpcyBhIGJvb2xlYW4gZW5jb2RlZCBpbiBvbmUgYml0LiBUaGUgdG9wIG9mIHRoZSBzdGFjayBpcyB0aGUgbG93ZXN0IG9yZGVyCisgICAgICogYml0LiBQdXNoaW5nIGZhbHNlID0gKjIsIHB1c2hpbmcgdHJ1ZSA9ICoyKzEsIHBvcHBpbmcgPSAvMi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBhcnJheVN0YWNrOworCisgICAgcHJpdmF0ZSBTdHJpbmcgc2VwYXJhdG9yID0gIiI7CisKKyAgICBwdWJsaWMgVHJhY2VTaWduYXR1cmVWaXNpdG9yKGZpbmFsIGludCBhY2Nlc3MpIHsKKyAgICAgICAgc3VwZXIoT3Bjb2Rlcy5BU000KTsKKyAgICAgICAgaXNJbnRlcmZhY2UgPSAoYWNjZXNzICYgT3Bjb2Rlcy5BQ0NfSU5URVJGQUNFKSAhPSAwOworICAgICAgICB0aGlzLmRlY2xhcmF0aW9uID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgIH0KKworICAgIHByaXZhdGUgVHJhY2VTaWduYXR1cmVWaXNpdG9yKGZpbmFsIFN0cmluZ0J1ZmZlciBidWYpIHsKKyAgICAgICAgc3VwZXIoT3Bjb2Rlcy5BU000KTsKKyAgICAgICAgdGhpcy5kZWNsYXJhdGlvbiA9IGJ1ZjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEZvcm1hbFR5cGVQYXJhbWV0ZXIoZmluYWwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgZGVjbGFyYXRpb24uYXBwZW5kKHNlZW5Gb3JtYWxQYXJhbWV0ZXIgPyAiLCAiIDogIjwiKS5hcHBlbmQobmFtZSk7CisgICAgICAgIHNlZW5Gb3JtYWxQYXJhbWV0ZXIgPSB0cnVlOworICAgICAgICBzZWVuSW50ZXJmYWNlQm91bmQgPSBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2lnbmF0dXJlVmlzaXRvciB2aXNpdENsYXNzQm91bmQoKSB7CisgICAgICAgIHNlcGFyYXRvciA9ICIgZXh0ZW5kcyAiOworICAgICAgICBzdGFydFR5cGUoKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNpZ25hdHVyZVZpc2l0b3IgdmlzaXRJbnRlcmZhY2VCb3VuZCgpIHsKKyAgICAgICAgc2VwYXJhdG9yID0gc2VlbkludGVyZmFjZUJvdW5kID8gIiwgIiA6ICIgZXh0ZW5kcyAiOworICAgICAgICBzZWVuSW50ZXJmYWNlQm91bmQgPSB0cnVlOworICAgICAgICBzdGFydFR5cGUoKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNpZ25hdHVyZVZpc2l0b3IgdmlzaXRTdXBlcmNsYXNzKCkgeworICAgICAgICBlbmRGb3JtYWxzKCk7CisgICAgICAgIHNlcGFyYXRvciA9ICIgZXh0ZW5kcyAiOworICAgICAgICBzdGFydFR5cGUoKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNpZ25hdHVyZVZpc2l0b3IgdmlzaXRJbnRlcmZhY2UoKSB7CisgICAgICAgIHNlcGFyYXRvciA9IHNlZW5JbnRlcmZhY2UgPyAiLCAiIDogaXNJbnRlcmZhY2UKKyAgICAgICAgICAgICAgICA/ICIgZXh0ZW5kcyAiCisgICAgICAgICAgICAgICAgOiAiIGltcGxlbWVudHMgIjsKKyAgICAgICAgc2VlbkludGVyZmFjZSA9IHRydWU7CisgICAgICAgIHN0YXJ0VHlwZSgpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2lnbmF0dXJlVmlzaXRvciB2aXNpdFBhcmFtZXRlclR5cGUoKSB7CisgICAgICAgIGVuZEZvcm1hbHMoKTsKKyAgICAgICAgaWYgKHNlZW5QYXJhbWV0ZXIpIHsKKyAgICAgICAgICAgIGRlY2xhcmF0aW9uLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNlZW5QYXJhbWV0ZXIgPSB0cnVlOworICAgICAgICAgICAgZGVjbGFyYXRpb24uYXBwZW5kKCcoJyk7CisgICAgICAgIH0KKyAgICAgICAgc3RhcnRUeXBlKCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTaWduYXR1cmVWaXNpdG9yIHZpc2l0UmV0dXJuVHlwZSgpIHsKKyAgICAgICAgZW5kRm9ybWFscygpOworICAgICAgICBpZiAoc2VlblBhcmFtZXRlcikgeworICAgICAgICAgICAgc2VlblBhcmFtZXRlciA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGVjbGFyYXRpb24uYXBwZW5kKCcoJyk7CisgICAgICAgIH0KKyAgICAgICAgZGVjbGFyYXRpb24uYXBwZW5kKCcpJyk7CisgICAgICAgIHJldHVyblR5cGUgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIHJldHVybiBuZXcgVHJhY2VTaWduYXR1cmVWaXNpdG9yKHJldHVyblR5cGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTaWduYXR1cmVWaXNpdG9yIHZpc2l0RXhjZXB0aW9uVHlwZSgpIHsKKyAgICAgICAgaWYgKGV4Y2VwdGlvbnMgPT0gbnVsbCkgeworICAgICAgICAgICAgZXhjZXB0aW9ucyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGV4Y2VwdGlvbnMuYXBwZW5kKCIsICIpOworICAgICAgICB9CisgICAgICAgIC8vIHN0YXJ0VHlwZSgpOworICAgICAgICByZXR1cm4gbmV3IFRyYWNlU2lnbmF0dXJlVmlzaXRvcihleGNlcHRpb25zKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEJhc2VUeXBlKGZpbmFsIGNoYXIgZGVzY3JpcHRvcikgeworICAgICAgICBzd2l0Y2ggKGRlc2NyaXB0b3IpIHsKKyAgICAgICAgICAgIGNhc2UgJ1YnOgorICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uLmFwcGVuZCgidm9pZCIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnQic6CisgICAgICAgICAgICAgICAgZGVjbGFyYXRpb24uYXBwZW5kKCJieXRlIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdKJzoKKyAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbi5hcHBlbmQoImxvbmciKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ1onOgorICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uLmFwcGVuZCgiYm9vbGVhbiIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnSSc6CisgICAgICAgICAgICAgICAgZGVjbGFyYXRpb24uYXBwZW5kKCJpbnQiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ1MnOgorICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uLmFwcGVuZCgic2hvcnQiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ0MnOgorICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uLmFwcGVuZCgiY2hhciIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnRic6CisgICAgICAgICAgICAgICAgZGVjbGFyYXRpb24uYXBwZW5kKCJmbG9hdCIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgLy8gY2FzZSAnRCc6CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uLmFwcGVuZCgiZG91YmxlIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZW5kVHlwZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0VHlwZVZhcmlhYmxlKGZpbmFsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIGRlY2xhcmF0aW9uLmFwcGVuZChuYW1lKTsKKyAgICAgICAgZW5kVHlwZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTaWduYXR1cmVWaXNpdG9yIHZpc2l0QXJyYXlUeXBlKCkgeworICAgICAgICBzdGFydFR5cGUoKTsKKyAgICAgICAgYXJyYXlTdGFjayB8PSAxOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdENsYXNzVHlwZShmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgICAgICBpZiAoImphdmEvbGFuZy9PYmplY3QiLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgLy8gTWFwPGphdmEubGFuZy5PYmplY3QsamF2YS51dGlsLkxpc3Q+CisgICAgICAgICAgICAvLyBvcgorICAgICAgICAgICAgLy8gYWJzdHJhY3QgcHVibGljIFYgZ2V0KE9iamVjdCBrZXkpOyAoc2VlbiBpbiBEaWN0aW9uYXJ5LmNsYXNzKQorICAgICAgICAgICAgLy8gc2hvdWxkIGhhdmUgT2JqZWN0CisgICAgICAgICAgICAvLyBidXQgamF2YS5sYW5nLlN0cmluZyBleHRlbmRzIGphdmEubGFuZy5PYmplY3QgaXMgdW5uZWNlc3NhcnkKKyAgICAgICAgICAgIGJvb2xlYW4gbmVlZE9iamVjdENsYXNzID0gYXJndW1lbnRTdGFjayAlIDIgIT0gMCB8fCBzZWVuUGFyYW1ldGVyOworICAgICAgICAgICAgaWYgKG5lZWRPYmplY3RDbGFzcykgeworICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uLmFwcGVuZChzZXBhcmF0b3IpLmFwcGVuZChuYW1lLnJlcGxhY2UoJy8nLCAnLicpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRlY2xhcmF0aW9uLmFwcGVuZChzZXBhcmF0b3IpLmFwcGVuZChuYW1lLnJlcGxhY2UoJy8nLCAnLicpKTsKKyAgICAgICAgfQorICAgICAgICBzZXBhcmF0b3IgPSAiIjsKKyAgICAgICAgYXJndW1lbnRTdGFjayAqPSAyOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0SW5uZXJDbGFzc1R5cGUoZmluYWwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgaWYgKGFyZ3VtZW50U3RhY2sgJSAyICE9IDApIHsKKyAgICAgICAgICAgIGRlY2xhcmF0aW9uLmFwcGVuZCgnPicpOworICAgICAgICB9CisgICAgICAgIGFyZ3VtZW50U3RhY2sgLz0gMjsKKyAgICAgICAgZGVjbGFyYXRpb24uYXBwZW5kKCcuJyk7CisgICAgICAgIGRlY2xhcmF0aW9uLmFwcGVuZChzZXBhcmF0b3IpLmFwcGVuZChuYW1lLnJlcGxhY2UoJy8nLCAnLicpKTsKKyAgICAgICAgc2VwYXJhdG9yID0gIiI7CisgICAgICAgIGFyZ3VtZW50U3RhY2sgKj0gMjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFR5cGVBcmd1bWVudCgpIHsKKyAgICAgICAgaWYgKGFyZ3VtZW50U3RhY2sgJSAyID09IDApIHsKKyAgICAgICAgICAgICsrYXJndW1lbnRTdGFjazsKKyAgICAgICAgICAgIGRlY2xhcmF0aW9uLmFwcGVuZCgnPCcpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGVjbGFyYXRpb24uYXBwZW5kKCIsICIpOworICAgICAgICB9CisgICAgICAgIGRlY2xhcmF0aW9uLmFwcGVuZCgnPycpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTaWduYXR1cmVWaXNpdG9yIHZpc2l0VHlwZUFyZ3VtZW50KGZpbmFsIGNoYXIgdGFnKSB7CisgICAgICAgIGlmIChhcmd1bWVudFN0YWNrICUgMiA9PSAwKSB7CisgICAgICAgICAgICArK2FyZ3VtZW50U3RhY2s7CisgICAgICAgICAgICBkZWNsYXJhdGlvbi5hcHBlbmQoJzwnKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRlY2xhcmF0aW9uLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0YWcgPT0gRVhURU5EUykgeworICAgICAgICAgICAgZGVjbGFyYXRpb24uYXBwZW5kKCI/IGV4dGVuZHMgIik7CisgICAgICAgIH0gZWxzZSBpZiAodGFnID09IFNVUEVSKSB7CisgICAgICAgICAgICBkZWNsYXJhdGlvbi5hcHBlbmQoIj8gc3VwZXIgIik7CisgICAgICAgIH0KKworICAgICAgICBzdGFydFR5cGUoKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRFbmQoKSB7CisgICAgICAgIGlmIChhcmd1bWVudFN0YWNrICUgMiAhPSAwKSB7CisgICAgICAgICAgICBkZWNsYXJhdGlvbi5hcHBlbmQoJz4nKTsKKyAgICAgICAgfQorICAgICAgICBhcmd1bWVudFN0YWNrIC89IDI7CisgICAgICAgIGVuZFR5cGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldERlY2xhcmF0aW9uKCkgeworICAgICAgICByZXR1cm4gZGVjbGFyYXRpb24udG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJldHVyblR5cGUoKSB7CisgICAgICAgIHJldHVybiByZXR1cm5UeXBlID09IG51bGwgPyBudWxsIDogcmV0dXJuVHlwZS50b1N0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXhjZXB0aW9ucygpIHsKKyAgICAgICAgcmV0dXJuIGV4Y2VwdGlvbnMgPT0gbnVsbCA/IG51bGwgOiBleGNlcHRpb25zLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIHByaXZhdGUgdm9pZCBlbmRGb3JtYWxzKCkgeworICAgICAgICBpZiAoc2VlbkZvcm1hbFBhcmFtZXRlcikgeworICAgICAgICAgICAgZGVjbGFyYXRpb24uYXBwZW5kKCc+Jyk7CisgICAgICAgICAgICBzZWVuRm9ybWFsUGFyYW1ldGVyID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc3RhcnRUeXBlKCkgeworICAgICAgICBhcnJheVN0YWNrICo9IDI7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGVuZFR5cGUoKSB7CisgICAgICAgIGlmIChhcnJheVN0YWNrICUgMiA9PSAwKSB7CisgICAgICAgICAgICBhcnJheVN0YWNrIC89IDI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3aGlsZSAoYXJyYXlTdGFjayAlIDIgIT0gMCkgeworICAgICAgICAgICAgICAgIGFycmF5U3RhY2sgLz0gMjsKKyAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbi5hcHBlbmQoIltdIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL2ludm9rZS9hbm9uL0Fub255bW91c0NsYXNzTG9hZGVyLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL2ludm9rZS9hbm9uL0Fub255bW91c0NsYXNzTG9hZGVyLmphdmEKaW5kZXggMzAwNWE0NS4uMzI2MjRiNCAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9pbnZva2UvYW5vbi9Bbm9ueW1vdXNDbGFzc0xvYWRlci5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vaW52b2tlL2Fub24vQW5vbnltb3VzQ2xhc3NMb2FkZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTczLDc0ICs3MywxNCBAQAogcHVibGljIGNsYXNzIEFub255bW91c0NsYXNzTG9hZGVyIHsKICAgICBmaW5hbCBDbGFzczw/PiBob3N0Q2xhc3M7CiAKLSAgICAvLyBOb3RlOiBEbyBub3QgcmVmYWN0b3IgdGhlIGNhbGxzIHRvIGNoZWNrSG9zdENsYXNzIHVubGVzcyB5b3UKLSAgICAvLyAgICAgICBhbHNvIGFkanVzdCB0aGlzIGNvbnN0YW50OgotICAgIHByaXZhdGUgc3RhdGljIGludCBDSENfQ0FMTEVSUyA9IDM7Ci0KLSAgICBwdWJsaWMgQW5vbnltb3VzQ2xhc3NMb2FkZXIoKSB7Ci0gICAgICAgIHRoaXMuaG9zdENsYXNzID0gY2hlY2tIb3N0Q2xhc3MobnVsbCk7Ci0gICAgfQotICAgIHB1YmxpYyBBbm9ueW1vdXNDbGFzc0xvYWRlcihDbGFzczw/PiBob3N0Q2xhc3MpIHsKLSAgICAgICAgdGhpcy5ob3N0Q2xhc3MgPSBjaGVja0hvc3RDbGFzcyhob3N0Q2xhc3MpOworICAgIC8vIFByaXZpbGVnZWQgY29uc3RydWN0b3IuCisgICAgcHJpdmF0ZSBBbm9ueW1vdXNDbGFzc0xvYWRlcihDbGFzczw/PiBob3N0Q2xhc3MpIHsKKyAgICAgICAgdGhpcy5ob3N0Q2xhc3MgPSBob3N0Q2xhc3M7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3M8Pz4gZ2V0VG9wTGV2ZWxDbGFzcyhDbGFzczw/PiBjbGF6eikgewotICAgICAgZm9yKENsYXNzPD8+IG91dGVyID0gY2xhenouZ2V0RGVjbGFyaW5nQ2xhc3MoKTsgb3V0ZXIgIT0gbnVsbDsKLSAgICAgICAgICBvdXRlciA9IG91dGVyLmdldERlY2xhcmluZ0NsYXNzKCkpIHsKLSAgICAgICAgY2xhenogPSBvdXRlcjsKLSAgICAgIH0KLSAgICAgIHJldHVybiBjbGF6ejsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBDbGFzczw/PiBjaGVja0hvc3RDbGFzcyhDbGFzczw/PiBob3N0Q2xhc3MpIHsKLSAgICAgICAgLy8gY2FsbGVkIG9ubHkgZnJvbSB0aGUgY29uc3RydWN0b3IKLSAgICAgICAgLy8gZG9lcyBhIGNvbnRleHQtc2Vuc2l0aXZlIGNoZWNrIG9uIGNhbGxlciBjbGFzcwotICAgICAgICAvLyBDQ1swLi4zXSA9IHtSZWZsZWN0aW9uLCB0aGlzLmNoZWNrSG9zdENsYXNzLCB0aGlzLjxpbml0PiwgY2FsbGVyfQotICAgICAgICBDbGFzczw/PiBjYWxsZXIgPSBzdW4ucmVmbGVjdC5SZWZsZWN0aW9uLmdldENhbGxlckNsYXNzKENIQ19DQUxMRVJTKTsKLQotICAgICAgICBpZiAoY2FsbGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIGNhbGxlZCBmcm9tIHRoZSBKVk0gZGlyZWN0bHkKLSAgICAgICAgICAgIGlmIChob3N0Q2xhc3MgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gQW5vbnltb3VzQ2xhc3NMb2FkZXIuY2xhc3M7IC8vIGFueXRoaW5nIGNlbnRyYWwgd2lsbCBkbwotICAgICAgICAgICAgcmV0dXJuIGhvc3RDbGFzczsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChob3N0Q2xhc3MgPT0gbnVsbCkKLSAgICAgICAgICAgIGhvc3RDbGFzcyA9IGNhbGxlcjsgLy8gZGVmYXVsdCB2YWx1ZSBpcyBjYWxsZXIgaXRzZWxmCi0KLSAgICAgICAgLy8gYW5vbnltb3VzIGNsYXNzIHdpbGwgYWNjZXNzIGhvc3RDbGFzcyBvbiBiZWhhbGYgb2YgY2FsbGVyCi0gICAgICAgIENsYXNzPD8+IGNhbGxlZSA9IGhvc3RDbGFzczsKLQotICAgICAgICBpZiAoY2FsbGVyID09IGNhbGxlZSkKLSAgICAgICAgICAgIC8vIGNhbGxlciBjYW4gYWx3YXlzIG5vbWluYXRlIGl0c2VsZiB0byBncmFudCBjYWxsZXIncyBvd24gYWNjZXNzIHJpZ2h0cwotICAgICAgICAgICAgcmV0dXJuIGhvc3RDbGFzczsKLQotICAgICAgICAvLyBub3JtYWxpemUgY2FsbGVyIGFuZCBjYWxsZWUgdG8gdGhlaXIgdG9wLWxldmVsIGNsYXNzZXM6Ci0gICAgICAgIGNhbGxlciA9IGdldFRvcExldmVsQ2xhc3MoY2FsbGVyKTsKLSAgICAgICAgY2FsbGVlID0gZ2V0VG9wTGV2ZWxDbGFzcyhjYWxsZWUpOwotICAgICAgICBpZiAoY2FsbGVyID09IGNhbGxlZSkKLSAgICAgICAgICAgIHJldHVybiBjYWxsZXI7Ci0KLSAgICAgICAgQ2xhc3NMb2FkZXIgY2FsbGVyQ0wgPSBjYWxsZXIuZ2V0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgaWYgKGNhbGxlckNMID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIGNhbGxlciBpcyB0cnVzdGVkIGNvZGUsIHNvIGFjY2VwdCB0aGUgcHJvcG9zZWQgaG9zdENsYXNzCi0gICAgICAgICAgICByZXR1cm4gaG9zdENsYXNzOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gJSUlIHNob3VsZCBkbyBzb21ldGhpbmcgd2l0aCBkb1ByaXZpbGVnZWQsIGJlY2F1c2UgdHJ1c3RlZAotICAgICAgICAvLyBjb2RlIHNob3VsZCBoYXZlIGEgd2F5IHRvIGV4ZWN1dGUgb24gYmVoYWxmIG9mCi0gICAgICAgIC8vIHBhcnRpYWxseS10cnVzdGVkIGNsaWVudHMKLQotICAgICAgICAvLyBEb2VzIHRoZSBjYWxsZXIgaGF2ZSB0aGUgcmlnaHQgdG8gYWNjZXNzIHRoZSBwcml2YXRlCi0gICAgICAgIC8vIG1lbWJlcnMgb2YgdGhlIGNhbGxlZT8gIElmIG5vdCwgcmFpc2UgYW4gZXJyb3IuCi0gICAgICAgIGZpbmFsIGludCBBQ0NfUFJJVkFURSA9IDI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzdW4ucmVmbGVjdC5SZWZsZWN0aW9uLmVuc3VyZU1lbWJlckFjY2VzcyhjYWxsZXIsIGNhbGxlZSwgbnVsbCwgQUNDX1BSSVZBVEUpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGVlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBob3N0Q2xhc3M7CisgICAgcHVibGljIHN0YXRpYyBBbm9ueW1vdXNDbGFzc0xvYWRlciBtYWtlKHN1bi5taXNjLlVuc2FmZSB1bnNhZmUsIENsYXNzPD8+IGhvc3RDbGFzcykgeworICAgICAgICBpZiAodW5zYWZlID09IG51bGwpICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKyAgICAgICAgcmV0dXJuIG5ldyBBbm9ueW1vdXNDbGFzc0xvYWRlcihob3N0Q2xhc3MpOwogICAgIH0KIAogICAgIHB1YmxpYyBDbGFzczw/PiBsb2FkQ2xhc3MoYnl0ZVtdIGNsYXNzRmlsZSkgewpAQCAtMjQ5LDcgKzE4OSw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGZha2VOYW1lQ291bnRlciA9IDk5OTk5OwogCiAgICAgLy8gaWdub3JlIHR3byB3YXJuaW5ncyBvbiB0aGlzIGxpbmU6Ci0gICAgc3RhdGljIHN1bi5taXNjLlVuc2FmZSB1bnNhZmUgPSBzdW4ubWlzYy5VbnNhZmUuZ2V0VW5zYWZlKCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgc3VuLm1pc2MuVW5zYWZlIHVuc2FmZSA9IHN1bi5taXNjLlVuc2FmZS5nZXRVbnNhZmUoKTsKICAgICAvLyBwcmVjZWRpbmcgbGluZSByZXF1aXJlcyB0aGF0IHRoaXMgY2xhc3MgYmUgb24gdGhlIGJvb3QgY2xhc3MgcGF0aAogCiAgICAgc3RhdGljIHByaXZhdGUgZmluYWwgTWV0aG9kIGRlZmluZUFub255bW91c0NsYXNzOwpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9pbnZva2UvdXRpbC9WYWx1ZUNvbnZlcnNpb25zLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL2ludm9rZS91dGlsL1ZhbHVlQ29udmVyc2lvbnMuamF2YQppbmRleCBiZjhkMDMzLi4wMzQyMDgwIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL2ludm9rZS91dGlsL1ZhbHVlQ29udmVyc2lvbnMuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL2ludm9rZS91dGlsL1ZhbHVlQ29udmVyc2lvbnMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTUyMiwxMiArNTIyLDE4IEBACiAgICAgc3RhdGljIHsKICAgICAgICAgTWV0aG9kSGFuZGxlIG1oID0gbnVsbDsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCBtID0gTWV0aG9kSGFuZGxlcy5jbGFzcworICAgICAgICAgICAgZmluYWwgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIG0gPSBNZXRob2RIYW5kbGVzLmNsYXNzCiAgICAgICAgICAgICAgICAgLmdldERlY2xhcmVkTWV0aG9kKCJjb2xsZWN0QXJndW1lbnRzIiwKICAgICAgICAgICAgICAgICAgICAgTWV0aG9kSGFuZGxlLmNsYXNzLCBpbnQuY2xhc3MsIE1ldGhvZEhhbmRsZS5jbGFzcyk7Ci0gICAgICAgICAgICBtLnNldEFjY2Vzc2libGUodHJ1ZSk7CisgICAgICAgICAgICBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbjxWb2lkPigpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBWb2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG0uc2V0QWNjZXNzaWJsZSh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICBtaCA9IElNUExfTE9PS1VQLnVucmVmbGVjdChtKTsKLSAgICAgICAgfSBjYXRjaCAoUmVmbGVjdGl2ZU9wZXJhdGlvbkV4Y2VwdGlvbiB8IFNlY3VyaXR5RXhjZXB0aW9uIGV4KSB7CisgICAgICAgIH0gY2F0Y2ggKFJlZmxlY3RpdmVPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKICAgICAgICAgICAgIHRocm93IG5ld0ludGVybmFsRXJyb3IoZXgpOwogICAgICAgICB9CiAgICAgICAgIENPTExFQ1RfQVJHVU1FTlRTID0gbWg7CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL21pc2MvU2VydmljZS5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9taXNjL1NlcnZpY2UuamF2YQppbmRleCAzN2QzOWI0Li5kNzRhYmJkIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL21pc2MvU2VydmljZS5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vbWlzYy9TZXJ2aWNlLmphdmEKQEAgLTI4NCwxMiArMjg0LDIwIEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBTdHJpbmcgY24gPSBuZXh0TmFtZTsKICAgICAgICAgICAgIG5leHROYW1lID0gbnVsbDsKKyAgICAgICAgICAgIENsYXNzPD8+IGMgPSBudWxsOwogICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZS5jYXN0KENsYXNzLmZvck5hbWUoY24sIHRydWUsIGxvYWRlcikubmV3SW5zdGFuY2UoKSk7CisgICAgICAgICAgICAgICAgYyA9IENsYXNzLmZvck5hbWUoY24sIGZhbHNlLCBsb2FkZXIpOwogICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB4KSB7CiAgICAgICAgICAgICAgICAgZmFpbChzZXJ2aWNlLAogICAgICAgICAgICAgICAgICAgICAgIlByb3ZpZGVyICIgKyBjbiArICIgbm90IGZvdW5kIik7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24geCkgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFzZXJ2aWNlLmlzQXNzaWduYWJsZUZyb20oYykpIHsKKyAgICAgICAgICAgICAgICBmYWlsKHNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAiUHJvdmlkZXIgIiArIGNuICArICIgbm90IGEgc3VidHlwZSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZS5jYXN0KGMubmV3SW5zdGFuY2UoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgeCkgewogICAgICAgICAgICAgICAgIGZhaWwoc2VydmljZSwKICAgICAgICAgICAgICAgICAgICAgICJQcm92aWRlciAiICsgY24gKyAiIGNvdWxkIG5vdCBiZSBpbnN0YW50aWF0ZWQ6ICIgKyB4LAogICAgICAgICAgICAgICAgICAgICAgeCk7CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL25ldC93d3cvcHJvdG9jb2wvZ29waGVyL0dvcGhlckNsaWVudC5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9uZXQvd3d3L3Byb3RvY29sL2dvcGhlci9Hb3BoZXJDbGllbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM0NzA2My4uMDAwMDAwMAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL25ldC93d3cvcHJvdG9jb2wvZ29waGVyL0dvcGhlckNsaWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTYsIDIwMDQsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCi0gKgotICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMKLSAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKLSAqIGJ5IE9yYWNsZSBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQotICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQotICogcXVlc3Rpb25zLgotICovCi1wYWNrYWdlIHN1bi5uZXQud3d3LnByb3RvY29sLmdvcGhlcjsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IHN1bi5uZXQud3d3Lio7Ci1pbXBvcnQgc3VuLm5ldC5OZXR3b3JrQ2xpZW50OwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxTdHJlYW1IYW5kbGVyOwotCi1pbXBvcnQgc3VuLnNlY3VyaXR5LmFjdGlvbi5HZXRCb29sZWFuQWN0aW9uOwotCi0vKiogQ2xhc3MgdG8gbWFpbnRhaW4gdGhlIHN0YXRlIG9mIGEgZ29waGVyIGZldGNoIGFuZCBoYW5kbGUgdGhlIHByb3RvY29sICovCi1wdWJsaWMgY2xhc3MgR29waGVyQ2xpZW50IGV4dGVuZHMgTmV0d29ya0NsaWVudCBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQotICAgIC8qIFRoZSBmb2xsb3dpbmcgdGhyZWUgZGF0YSBtZW1iZXJzIGFyZSBsZWZ0IGluIGZvciBiaW5hcnkKLSAgICAgKiBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eS4gIFVuZm9ydHVuYXRlbHksIEhvdEphdmEgc2V0cyB0aGVtIGRpcmVjdGx5Ci0gICAgICogd2hlbiBpdCB3YW50cyB0byBjaGFuZ2UgdGhlIHNldHRpbmdzLiAgVGhlIG5ldyBkZXNpZ24gaGFzIHVzIG5vdAotICAgICAqIGNhY2hlIHRoZXNlLCBzbyB0aGlzIGlzIHVubmVjZXNzYXJ5LCBidXQgZWxpbWluYXRpbmcgdGhlIGRhdGEgbWVtYmVycwotICAgICAqIHdvdWxkIGJyZWFrIEhKQiAxLjEgdW5kZXIgSkRLIDEuMi4KLSAgICAgKgotICAgICAqIFRoZXNlIGRhdGEgbWVtYmVycyBhcmUgbm90IHVzZWQsIGFuZCB0aGVpciB2YWx1ZXMgYXJlIG1lYW5pbmdsZXNzLgotICAgICAqIFJFTUlORDogIFRha2UgdGhlbSBvdXQgZm9yIEpESyAyLjAhCi0gICAgICovCi0KLSAgICAvKioKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIEBEZXByZWNhdGVkCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuICAgICAgIHVzZUdvcGhlclByb3h5OwotCi0gICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQKLSAgICAgKi8KLSAgICBARGVwcmVjYXRlZAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nICAgICAgICBnb3BoZXJQcm94eUhvc3Q7Ci0KLSAgICAvKioKLSAgICAgKiBAZGVwcmVjYXRlZAotICAgICAqLwotICAgIEBEZXByZWNhdGVkCi0gICAgcHVibGljIHN0YXRpYyBpbnQgICAgICAgICAgIGdvcGhlclByb3h5UG9ydDsKLQotCi0gICAgc3RhdGljIHsKLSAgICAgICAgdXNlR29waGVyUHJveHkgPSBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgbmV3IHN1bi5zZWN1cml0eS5hY3Rpb24uR2V0Qm9vbGVhbkFjdGlvbigiZ29waGVyUHJveHlTZXQiKSkKLSAgICAgICAgICAgIC5ib29sZWFuVmFsdWUoKTsKLQotICAgICAgICBnb3BoZXJQcm94eUhvc3QgPSBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgbmV3IHN1bi5zZWN1cml0eS5hY3Rpb24uR2V0UHJvcGVydHlBY3Rpb24oImdvcGhlclByb3h5SG9zdCIpKTsKLQotICAgICAgICBnb3BoZXJQcm94eVBvcnQgPSBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgbmV3IHN1bi5zZWN1cml0eS5hY3Rpb24uR2V0SW50ZWdlckFjdGlvbigiZ29waGVyUHJveHlQb3J0IiwgODApKQotICAgICAgICAgICAgLmludFZhbHVlKCk7Ci0gICAgfQotCi0gICAgUGlwZWRPdXRwdXRTdHJlYW0gb3M7Ci0gICAgVVJMIHU7Ci0gICAgaW50IGd0eXBlOwotICAgIFN0cmluZyBna2V5OwotICAgIHN1bi5uZXQud3d3LlVSTENvbm5lY3Rpb24gY29ubmVjdGlvbjsKLQotICAgIEdvcGhlckNsaWVudChzdW4ubmV0Lnd3dy5VUkxDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKLSAgICAgICAgdGhpcy5jb25uZWN0aW9uID0gY29ubmVjdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgZ29waGVyIGNvbm5lY3Rpb25zIHNob3VsZCBnbyB0aHJvdWdoIGEgcHJveHksIGFjY29yZGluZwotICAgICAqICAgICAgICAgIHRvIHN5c3RlbSBwcm9wZXJ0aWVzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRVc2VHb3BoZXJQcm94eSgpIHsKLSAgICAgICAgcmV0dXJuIGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCi0gICAgICAgICAgICBuZXcgR2V0Qm9vbGVhbkFjdGlvbigiZ29waGVyUHJveHlTZXQiKSkuYm9vbGVhblZhbHVlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgcHJveHkgaG9zdCB0byB1c2UsIG9yIG51bGwgaWYgbm90aGluZyBpcyBzZXQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0R29waGVyUHJveHlIb3N0KCkgewotICAgICAgICBTdHJpbmcgaG9zdCA9IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCi0gICAgICAgICAgICAgICAgbmV3IHN1bi5zZWN1cml0eS5hY3Rpb24uR2V0UHJvcGVydHlBY3Rpb24oImdvcGhlclByb3h5SG9zdCIpKTsKLSAgICAgICAgaWYgKCIiLmVxdWFscyhob3N0KSkgewotICAgICAgICAgICAgaG9zdCA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGhvc3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgcHJveHkgcG9ydCB0byB1c2UuICBXaWxsIGRlZmF1bHQgcmVhc29uYWJseS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGludCBnZXRHb3BoZXJQcm94eVBvcnQoKSB7Ci0gICAgICAgIHJldHVybiBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAotICAgICAgICAgICAgbmV3IHN1bi5zZWN1cml0eS5hY3Rpb24uR2V0SW50ZWdlckFjdGlvbigiZ29waGVyUHJveHlQb3J0IiwgODApKQotICAgICAgICAgICAgLmludFZhbHVlKCk7Ci0gICAgfQotCi0gICAgLyoqIEdpdmVuIGEgdXJsLCBzZXR1cCB0byBmZXRjaCB0aGUgZ29waGVyIGRvY3VtZW50IGl0IHJlZmVycyB0byAqLwotICAgIElucHV0U3RyZWFtIG9wZW5TdHJlYW0oVVJMIHUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRoaXMudSA9IHU7Ci0gICAgICAgIHRoaXMub3MgPSBvczsKLSAgICAgICAgaW50IGkgPSAwOwotICAgICAgICBTdHJpbmcgcyA9IHUuZ2V0RmlsZSgpOwotICAgICAgICBpbnQgbGltaXQgPSBzLmxlbmd0aCgpOwotICAgICAgICBpbnQgYyA9ICcxJzsKLSAgICAgICAgd2hpbGUgKGkgPCBsaW1pdCAmJiAoYyA9IHMuY2hhckF0KGkpKSA9PSAnLycpCi0gICAgICAgICAgICBpKys7Ci0gICAgICAgIGd0eXBlID0gYyA9PSAnLycgPyAnMScgOiBjOwotICAgICAgICBpZiAoaSA8IGxpbWl0KQotICAgICAgICAgICAgaSsrOwotICAgICAgICBna2V5ID0gcy5zdWJzdHJpbmcoaSk7Ci0KLSAgICAgICAgb3BlblNlcnZlcih1LmdldEhvc3QoKSwgdS5nZXRQb3J0KCkgPD0gMCA/IDcwIDogdS5nZXRQb3J0KCkpOwotCi0gICAgICAgIE1lc3NhZ2VIZWFkZXIgbXNnaCA9IG5ldyBNZXNzYWdlSGVhZGVyKCk7Ci0KLSAgICAgICAgc3dpdGNoIChndHlwZSkgewotICAgICAgICAgIGNhc2UgJzAnOgotICAgICAgICAgIGNhc2UgJzcnOgotICAgICAgICAgICAgbXNnaC5hZGQoImNvbnRlbnQtdHlwZSIsICJ0ZXh0L3BsYWluIik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlICcxJzoKLSAgICAgICAgICAgIG1zZ2guYWRkKCJjb250ZW50LXR5cGUiLCAidGV4dC9odG1sIik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlICdnJzoKLSAgICAgICAgICBjYXNlICdJJzoKLSAgICAgICAgICAgIG1zZ2guYWRkKCJjb250ZW50LXR5cGUiLCAiaW1hZ2UvZ2lmIik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgbXNnaC5hZGQoImNvbnRlbnQtdHlwZSIsICJjb250ZW50L3Vua25vd24iKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChndHlwZSAhPSAnNycpIHsKLSAgICAgICAgICAgIHNlcnZlck91dHB1dC5wcmludChkZWNvZGVQZXJjZW50KGdrZXkpICsgIlxyXG4iKTsKLSAgICAgICAgICAgIHNlcnZlck91dHB1dC5mbHVzaCgpOwotICAgICAgICB9IGVsc2UgaWYgKChpID0gZ2tleS5pbmRleE9mKCc/JykpID49IDApIHsKLSAgICAgICAgICAgIHNlcnZlck91dHB1dC5wcmludChkZWNvZGVQZXJjZW50KGdrZXkuc3Vic3RyaW5nKDAsIGkpICsgIlx0IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2tleS5zdWJzdHJpbmcoaSArIDEpICsgIlxyXG4iKSk7Ci0gICAgICAgICAgICBzZXJ2ZXJPdXRwdXQuZmx1c2goKTsKLSAgICAgICAgICAgIG1zZ2guYWRkKCJjb250ZW50LXR5cGUiLCAidGV4dC9odG1sIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtc2doLmFkZCgiY29udGVudC10eXBlIiwgInRleHQvaHRtbCIpOwotICAgICAgICB9Ci0gICAgICAgIGNvbm5lY3Rpb24uc2V0UHJvcGVydGllcyhtc2doKTsKLSAgICAgICAgaWYgKG1zZ2guZmluZFZhbHVlKCJjb250ZW50LXR5cGUiKSA9PSAidGV4dC9odG1sIikgewotICAgICAgICAgICAgb3MgPSBuZXcgUGlwZWRPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgICAgIFBpcGVkSW5wdXRTdHJlYW0gcmV0ID0gbmV3IFBpcGVkSW5wdXRTdHJlYW0oKTsKLSAgICAgICAgICAgIHJldC5jb25uZWN0KG9zKTsKLSAgICAgICAgICAgIG5ldyBUaHJlYWQodGhpcykuc3RhcnQoKTsKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBHb3BoZXJJbnB1dFN0cmVhbSh0aGlzLCBzZXJ2ZXJJbnB1dCk7Ci0gICAgfQotCi0gICAgLyoqIFRyYW5zbGF0ZSBhbGwgdGhlIGluc3RhbmNlcyBvZiAlTk4gaW50byB0aGUgY2hhcmFjdGVyIHRoZXkgcmVwcmVzZW50ICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZGVjb2RlUGVyY2VudChTdHJpbmcgcykgewotICAgICAgICBpZiAocyA9PSBudWxsIHx8IHMuaW5kZXhPZignJScpIDwgMCkKLSAgICAgICAgICAgIHJldHVybiBzOwotICAgICAgICBpbnQgbGltaXQgPSBzLmxlbmd0aCgpOwotICAgICAgICBjaGFyIGRbXSA9IG5ldyBjaGFyW2xpbWl0XTsKLSAgICAgICAgaW50IGRwID0gMDsKLSAgICAgICAgZm9yIChpbnQgc3AgPSAwOyBzcCA8IGxpbWl0OyBzcCsrKSB7Ci0gICAgICAgICAgICBpbnQgYyA9IHMuY2hhckF0KHNwKTsKLSAgICAgICAgICAgIGlmIChjID09ICclJyAmJiBzcCArIDIgPCBsaW1pdCkgewotICAgICAgICAgICAgICAgIGludCBzMSA9IHMuY2hhckF0KHNwICsgMSk7Ci0gICAgICAgICAgICAgICAgaW50IHMyID0gcy5jaGFyQXQoc3AgKyAyKTsKLSAgICAgICAgICAgICAgICBpZiAoJzAnIDw9IHMxICYmIHMxIDw9ICc5JykKLSAgICAgICAgICAgICAgICAgICAgczEgPSBzMSAtICcwJzsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICgnYScgPD0gczEgJiYgczEgPD0gJ2YnKQotICAgICAgICAgICAgICAgICAgICBzMSA9IHMxIC0gJ2EnICsgMTA7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoJ0EnIDw9IHMxICYmIHMxIDw9ICdGJykKLSAgICAgICAgICAgICAgICAgICAgczEgPSBzMSAtICdBJyArIDEwOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgczEgPSAtMTsKLSAgICAgICAgICAgICAgICBpZiAoJzAnIDw9IHMyICYmIHMyIDw9ICc5JykKLSAgICAgICAgICAgICAgICAgICAgczIgPSBzMiAtICcwJzsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICgnYScgPD0gczIgJiYgczIgPD0gJ2YnKQotICAgICAgICAgICAgICAgICAgICBzMiA9IHMyIC0gJ2EnICsgMTA7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoJ0EnIDw9IHMyICYmIHMyIDw9ICdGJykKLSAgICAgICAgICAgICAgICAgICAgczIgPSBzMiAtICdBJyArIDEwOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgczIgPSAtMTsKLSAgICAgICAgICAgICAgICBpZiAoczEgPj0gMCAmJiBzMiA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGMgPSAoczEgPDwgNCkgfCBzMjsKLSAgICAgICAgICAgICAgICAgICAgc3AgKz0gMjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkW2RwKytdID0gKGNoYXIpIGM7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoZCwgMCwgZHApOwotICAgIH0KLQotICAgIC8qKiBUdXJuIHNwZWNpYWwgY2hhcmFjdGVycyBpbnRvIHRoZSAlTk4gZm9ybSAqLwotICAgIHByaXZhdGUgU3RyaW5nIGVuY29kZVBlcmNlbnQoU3RyaW5nIHMpIHsKLSAgICAgICAgaWYgKHMgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBzOwotICAgICAgICBpbnQgbGltaXQgPSBzLmxlbmd0aCgpOwotICAgICAgICBjaGFyIGRbXSA9IG51bGw7Ci0gICAgICAgIGludCBkcCA9IDA7Ci0gICAgICAgIGZvciAoaW50IHNwID0gMDsgc3AgPCBsaW1pdDsgc3ArKykgewotICAgICAgICAgICAgaW50IGMgPSBzLmNoYXJBdChzcCk7Ci0gICAgICAgICAgICBpZiAoYyA8PSAnICcgfHwgYyA9PSAnIicgfHwgYyA9PSAnJScpIHsKLSAgICAgICAgICAgICAgICBpZiAoZCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICBkID0gcy50b0NoYXJBcnJheSgpOwotICAgICAgICAgICAgICAgIGlmIChkcCArIDMgPj0gZC5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhciBuZFtdID0gbmV3IGNoYXJbZHAgKyAxMF07Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoZCwgMCwgbmQsIDAsIGRwKTsKLSAgICAgICAgICAgICAgICAgICAgZCA9IG5kOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkW2RwXSA9ICclJzsKLSAgICAgICAgICAgICAgICBpbnQgZGlnID0gKGMgPj4gNCkgJiAweEY7Ci0gICAgICAgICAgICAgICAgZFtkcCArIDFdID0gKGNoYXIpIChkaWcgPCAxMCA/ICcwJyArIGRpZyA6ICdBJyAtIDEwICsgZGlnKTsKLSAgICAgICAgICAgICAgICBkaWcgPSBjICYgMHhGOwotICAgICAgICAgICAgICAgIGRbZHAgKyAyXSA9IChjaGFyKSAoZGlnIDwgMTAgPyAnMCcgKyBkaWcgOiAnQScgLSAxMCArIGRpZyk7Ci0gICAgICAgICAgICAgICAgZHAgKz0gMzsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZHAgPj0gZC5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgbmRbXSA9IG5ldyBjaGFyW2RwICsgMTBdOwotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShkLCAwLCBuZCwgMCwgZHApOwotICAgICAgICAgICAgICAgICAgICAgICAgZCA9IG5kOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGRbZHBdID0gKGNoYXIpIGM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRwKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGQgPT0gbnVsbCA/IHMgOiBuZXcgU3RyaW5nKGQsIDAsIGRwKTsKLSAgICB9Ci0KLSAgICAvKiogVGhpcyBtZXRob2QgaXMgcnVuIGFzIGEgc2VwZXJhdGUgdGhyZWFkIHdoZW4gYW4gaW5jb21pbmcgZ29waGVyCi0gICAgICAgIGRvY3VtZW50IHJlcXVpcmVzIHRyYW5zbGF0aW9uIHRvIGh0bWwgKi8KLSAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgIGludCBxcG9zID0gLTE7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoZ3R5cGUgPT0gJzcnICYmIChxcG9zID0gZ2tleS5pbmRleE9mKCc/JykpIDwgMCkgewotICAgICAgICAgICAgICAgIFByaW50U3RyZWFtIHBzID0gbmV3IFByaW50U3RyZWFtKG9zLCBmYWxzZSwgZW5jb2RpbmcpOwotICAgICAgICAgICAgICAgIHBzLnByaW50KCI8aHRtbD48aGVhZD48dGl0bGU+U2VhcmNoYWJsZSBHb3BoZXIgSW5kZXg8L3RpdGxlPjwvaGVhZD5cbjxib2R5PjxoMT5TZWFyY2hhYmxlIEdvcGhlciBJbmRleDwvaDE+PGlzaW5kZXg+XG48L2JvZHk+PC9odG1sPlxuIik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGd0eXBlICE9ICcxJyAmJiBndHlwZSAhPSAnNycpIHsKLSAgICAgICAgICAgICAgICBieXRlIGJ1ZltdID0gbmV3IGJ5dGVbMjA0OF07Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaW50IG47Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlICgobiA9IHNlcnZlcklucHV0LnJlYWQoYnVmKSkgPj0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy53cml0ZShidWYsIDAsIG4pOwotICAgICAgICAgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFByaW50U3RyZWFtIHBzID0gbmV3IFByaW50U3RyZWFtKG9zLCBmYWxzZSwgZW5jb2RpbmcpOwotICAgICAgICAgICAgICAgIFN0cmluZyB0aXRsZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgaWYgKGd0eXBlID09ICc3JykKLSAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiUmVzdWx0cyBvZiBzZWFyY2hpbmcgZm9yIFwiIiArIGdrZXkuc3Vic3RyaW5nKHFwb3MgKyAxKQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiXCIgb24gIiArIHUuZ2V0SG9zdCgpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiR29waGVyIGRpcmVjdG9yeSAiICsgZ2tleSArICIgZnJvbSAiICsgdS5nZXRIb3N0KCk7Ci0gICAgICAgICAgICAgICAgcHMucHJpbnQoIjxodG1sPjxoZWFkPjx0aXRsZT4iKTsKLSAgICAgICAgICAgICAgICBwcy5wcmludCh0aXRsZSk7Ci0gICAgICAgICAgICAgICAgcHMucHJpbnQoIjwvdGl0bGU+PC9oZWFkPlxuPGJvZHk+XG48SDE+Iik7Ci0gICAgICAgICAgICAgICAgcHMucHJpbnQodGl0bGUpOwotICAgICAgICAgICAgICAgIHBzLnByaW50KCI8L2gxPjxkbCBjb21wYWN0PlxuIik7Ci0gICAgICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgZHMgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKHNlcnZlcklucHV0KSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHM7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKChzID0gZHMucmVhZExpbmUoKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpbnQgbGVuID0gcy5sZW5ndGgoKTsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGxlbiA+IDAgJiYgcy5jaGFyQXQobGVuIC0gMSkgPD0gJyAnKQotICAgICAgICAgICAgICAgICAgICAgICAgbGVuLS07Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsZW4gPD0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICBpbnQga2V5ID0gcy5jaGFyQXQoMCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCB0MSA9IHMuaW5kZXhPZignXHQnKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IHQyID0gdDEgPiAwID8gcy5pbmRleE9mKCdcdCcsIHQxICsgMSkgOiAtMTsKLSAgICAgICAgICAgICAgICAgICAgaW50IHQzID0gdDIgPiAwID8gcy5pbmRleE9mKCdcdCcsIHQyICsgMSkgOiAtMTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHQzIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHMucHJpbnQoIjxicj48aT4iK3MrIjwvaT5cbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBvcnQgPSB0MyArIDEgPCBsZW4gPyAiOiIgKyBzLnN1YnN0cmluZyh0MyArIDEsIGxlbikgOiAiIjsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhvc3QgPSB0MiArIDEgPCB0MyA/IHMuc3Vic3RyaW5nKHQyICsgMSwgdDMpIDogdS5nZXRIb3N0KCk7Ci0gICAgICAgICAgICAgICAgICAgIHBzLnByaW50KCI8ZHQ+PGEgaHJlZj1cImdvcGhlcjovLyIgKyBob3N0ICsgcG9ydCArICIvIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHMuc3Vic3RyaW5nKDAsIDEpICsgZW5jb2RlUGVyY2VudChzLnN1YnN0cmluZyh0MSArIDEsIHQyKSkgKyAiXCI+XG4iKTsKLSAgICAgICAgICAgICAgICAgICAgcHMucHJpbnQoIjxpbWcgYWxpZ249bWlkZGxlIGJvcmRlcj0wIHdpZHRoPTI1IGhlaWdodD0zMiBzcmM9Iik7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoa2V5KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHBzLnByaW50KFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5uZXQuZnRwLmltYWdlcGF0aC5maWxlIikpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgY2FzZSAnMCc6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcy5wcmludChTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEubmV0LmZ0cC5pbWFnZXBhdGgudGV4dCIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzEnOgotICAgICAgICAgICAgICAgICAgICAgICAgcHMucHJpbnQoU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLm5ldC5mdHAuaW1hZ2VwYXRoLmRpcmVjdG9yeSIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2cnOgotICAgICAgICAgICAgICAgICAgICAgICAgcHMucHJpbnQoU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLm5ldC5mdHAuaW1hZ2VwYXRoLmdpZiIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBzLnByaW50KCIuZ2lmIGFsaWduPW1pZGRsZT48ZGQ+XG4iKTsKLSAgICAgICAgICAgICAgICAgICAgcHMucHJpbnQocy5zdWJzdHJpbmcoMSwgdDEpICsgIjwvYT5cbiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwcy5wcmludCgiPC9kbD48L2JvZHk+XG4iKTsKLSAgICAgICAgICAgICAgICBwcy5jbG9zZSgpOwotICAgICAgICAgICB9Ci0KLSAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGVuY29kaW5nKyAiIGVuY29kaW5nIG5vdCBmb3VuZCIsIGUpOwotICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgY2xvc2VTZXJ2ZXIoKTsKLSAgICAgICAgICAgICAgIG9zLmNsb3NlKCk7Ci0gICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUyKSB7Ci0gICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotLyoqIEFuIGlucHV0IHN0cmVhbSB0aGF0IGRvZXMgbm90aGluZyBtb3JlIHRoYW4gaG9sZCBvbiB0byB0aGUgTmV0d29ya0NsaWVudAotICAgIHRoYXQgY3JlYXRlZCBpdC4gIFRoaXMgaXMgdXNlZCB3aGVuIG9ubHkgdGhlIGlucHV0IHN0cmVhbSBpcyBuZWVkZWQsIGFuZAotICAgIHRoZSBuZXR3b3JrIGNsaWVudCBuZWVkcyB0byBiZSBjbG9zZWQgd2hlbiB0aGUgaW5wdXQgc3RyZWFtIGlzIGNsb3NlZC4gKi8KLWNsYXNzIEdvcGhlcklucHV0U3RyZWFtIGV4dGVuZHMgRmlsdGVySW5wdXRTdHJlYW0gewotICAgIE5ldHdvcmtDbGllbnQgcGFyZW50OwotCi0gICAgR29waGVySW5wdXRTdHJlYW0oTmV0d29ya0NsaWVudCBvLCBJbnB1dFN0cmVhbSBmZCkgewotICAgICAgICBzdXBlcihmZCk7Ci0gICAgICAgIHBhcmVudCA9IG87Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xvc2UoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwYXJlbnQuY2xvc2VTZXJ2ZXIoKTsKLSAgICAgICAgICAgIHN1cGVyLmNsb3NlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vbmV0L3d3dy9wcm90b2NvbC9nb3BoZXIvSGFuZGxlci5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9uZXQvd3d3L3Byb3RvY29sL2dvcGhlci9IYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwMDk4NTkuLjAwMDAwMDAKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9uZXQvd3d3L3Byb3RvY29sL2dvcGhlci9IYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5NSwgMjAwMywgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcwotICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAotICogYnkgT3JhY2xlIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCi0gKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55Ci0gKiBxdWVzdGlvbnMuCi0gKi8KLQotcGFja2FnZSBzdW4ubmV0Lnd3dy5wcm90b2NvbC5nb3BoZXI7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgc3VuLm5ldC5OZXR3b3JrQ2xpZW50OwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxTdHJlYW1IYW5kbGVyOwotaW1wb3J0IGphdmEubmV0LlByb3h5OwotaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOwotaW1wb3J0IGphdmEubmV0LlNvY2tldFBlcm1pc3Npb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uOwotaW1wb3J0IHN1bi5uZXQud3d3LnByb3RvY29sLmh0dHAuSHR0cFVSTENvbm5lY3Rpb247Ci0KLS8qKgotICogQSBjbGFzcyB0byBoYW5kbGUgdGhlIGdvcGhlciBwcm90b2NvbC4KLSAqLwotCi1wdWJsaWMgY2xhc3MgSGFuZGxlciBleHRlbmRzIGphdmEubmV0LlVSTFN0cmVhbUhhbmRsZXIgewotCi0gICAgcHJvdGVjdGVkIGludCBnZXREZWZhdWx0UG9ydCgpIHsKLSAgICAgICAgcmV0dXJuIDcwOwotICAgIH0KLQotICAgIHB1YmxpYyBqYXZhLm5ldC5VUkxDb25uZWN0aW9uIG9wZW5Db25uZWN0aW9uKFVSTCB1KQotICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBvcGVuQ29ubmVjdGlvbih1LCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgamF2YS5uZXQuVVJMQ29ubmVjdGlvbiBvcGVuQ29ubmVjdGlvbihVUkwgdSwgUHJveHkgcCkKLSAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0KLSAgICAgICAgLyogaWYgc2V0IGZvciBwcm94eSB1c2FnZSB0aGVuIGdvIHRocm91Z2ggdGhlIGh0dHAgY29kZSB0byBnZXQgKi8KLSAgICAgICAgLyogdGhlIHVybCBjb25uZWN0aW9uLiAqLwotICAgICAgICBpZiAocCA9PSBudWxsICYmIEdvcGhlckNsaWVudC5nZXRVc2VHb3BoZXJQcm94eSgpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgaG9zdCA9IEdvcGhlckNsaWVudC5nZXRHb3BoZXJQcm94eUhvc3QoKTsKLSAgICAgICAgICAgIGlmIChob3N0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBJbmV0U29ja2V0QWRkcmVzcyBzYWRkciA9IEluZXRTb2NrZXRBZGRyZXNzLmNyZWF0ZVVucmVzb2x2ZWQoaG9zdCwgR29waGVyQ2xpZW50LmdldEdvcGhlclByb3h5UG9ydCgpKTsKLQotICAgICAgICAgICAgICAgIHAgPSBuZXcgUHJveHkoUHJveHkuVHlwZS5IVFRQLCBzYWRkcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHAgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBIdHRwVVJMQ29ubmVjdGlvbih1LCBwKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBuZXcgR29waGVyVVJMQ29ubmVjdGlvbih1KTsKLSAgICB9Ci19Ci0KLWNsYXNzIEdvcGhlclVSTENvbm5lY3Rpb24gZXh0ZW5kcyBzdW4ubmV0Lnd3dy5VUkxDb25uZWN0aW9uIHsKLQotICAgIFBlcm1pc3Npb24gcGVybWlzc2lvbjsKLQotICAgIEdvcGhlclVSTENvbm5lY3Rpb24oVVJMIHUpIHsKLSAgICAgICAgc3VwZXIodSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY29ubmVjdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgfQotCi0gICAgcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG5ldyBHb3BoZXJDbGllbnQodGhpcykub3BlblN0cmVhbSh1cmwpOwotICAgIH0KLQotICAgIHB1YmxpYyBQZXJtaXNzaW9uIGdldFBlcm1pc3Npb24oKSB7Ci0gICAgICAgIGlmIChwZXJtaXNzaW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIGludCBwb3J0ID0gdXJsLmdldFBvcnQoKTsKLSAgICAgICAgICAgIHBvcnQgPSBwb3J0IDwgMCA/IDcwIDogcG9ydDsKLSAgICAgICAgICAgIFN0cmluZyBob3N0ID0gdXJsLmdldEhvc3QoKSArICI6IiArIHVybC5nZXRQb3J0KCk7Ci0gICAgICAgICAgICBwZXJtaXNzaW9uID0gbmV3IFNvY2tldFBlcm1pc3Npb24oaG9zdCwgImNvbm5lY3QiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcGVybWlzc2lvbjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3JtaS9yZWdpc3RyeS9SZWdpc3RyeUltcGwuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vcm1pL3JlZ2lzdHJ5L1JlZ2lzdHJ5SW1wbC5qYXZhCmluZGV4IDM0NTc5YzIuLmUwODZmNzljIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3JtaS9yZWdpc3RyeS9SZWdpc3RyeUltcGwuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3JtaS9yZWdpc3RyeS9SZWdpc3RyeUltcGwuamF2YQpAQCAtNDA1LDcgKzQwNSw4IEBACiAgICAgICAgICAqLwogICAgICAgICBwZXJtcy5hZGQobmV3IFNvY2tldFBlcm1pc3Npb24oIioiLCAiY29ubmVjdCxhY2NlcHQiKSk7CiAKLSAgICAgICAgcGVybXMuYWRkKG5ldyBSdW50aW1lUGVybWlzc2lvbigiYWNjZXNzQ2xhc3NJblBhY2thZ2Uuc3VuLioiKSk7CisgICAgICAgIHBlcm1zLmFkZChuZXcgUnVudGltZVBlcm1pc3Npb24oImFjY2Vzc0NsYXNzSW5QYWNrYWdlLnN1bi5qdm1zdGF0LioiKSk7CisgICAgICAgIHBlcm1zLmFkZChuZXcgUnVudGltZVBlcm1pc3Npb24oImFjY2Vzc0NsYXNzSW5QYWNrYWdlLnN1bi5qdm0uaG90c3BvdC4qIikpOwogCiAgICAgICAgIHBlcm1zLmFkZChuZXcgRmlsZVBlcm1pc3Npb24oIjw8QUxMIEZJTEVTPj4iLCAicmVhZCIpKTsKIApkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS9rcmI1L2ludGVybmFsL2NjYWNoZS9GaWxlQ3JlZGVudGlhbHNDYWNoZS5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS9rcmI1L2ludGVybmFsL2NjYWNoZS9GaWxlQ3JlZGVudGlhbHNDYWNoZS5qYXZhCmluZGV4IGM5ODU4ODcuLjc4MGI5MzAgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkva3JiNS9pbnRlcm5hbC9jY2FjaGUvRmlsZUNyZWRlbnRpYWxzQ2FjaGUuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L2tyYjUvaW50ZXJuYWwvY2NhY2hlL0ZpbGVDcmVkZW50aWFsc0NhY2hlLmphdmEKQEAgLTM0OCw3ICszNDgsNyBAQAogICAgICAqIFJldHVybnMgcGF0aCBuYW1lIG9mIHRoZSBjcmVkZW50aWFscyBjYWNoZSBmaWxlLgogICAgICAqIFRoZSBwYXRoIG5hbWUgaXMgc2VhcmNoZWQgaW4gdGhlIGZvbGxvd2luZyBvcmRlcjoKICAgICAgKgotICAgICAqIDEuIEtSQjVDQ05BTUUKKyAgICAgKiAxLiBLUkI1Q0NOQU1FIChiYXJlIGZpbGUgbmFtZSB3aXRob3V0IEZJTEU6KQogICAgICAqIDIuIC90bXAva3JiNWNjXzx1aWQ+IG9uIHVuaXggc3lzdGVtcwogICAgICAqIDMuIDx1c2VyLmhvbWU+L2tyYjVjY188dXNlci5uYW1lPgogICAgICAqIDQuIDx1c2VyLmhvbWU+L2tyYjVjYyAoaWYgY2FuJ3QgZ2V0IDx1c2VyLm5hbWU+KQpAQCAtMzU5LDExICszNTksMTkgQEAKICAgICAgICAgU3RyaW5nIHN0ZENhY2hlTmFtZUNvbXBvbmVudCA9ICJrcmI1Y2MiOwogICAgICAgICBTdHJpbmcgbmFtZTsKIAorICAgICAgICAvLyBUaGUgZW52IHZhciBjYW4gc3RhcnQgd2l0aCBUWVBFOiwgd2Ugb25seSBzdXBwb3J0IEZJTEU6IGhlcmUuCisgICAgICAgIC8vIGh0dHA6Ly9kb2NzLm9yYWNsZS5jb20vY2QvRTE5MDgyLTAxLzgxOS0yMjUyLzZuNGk4cnRyMy9pbmRleC5odG1sCiAgICAgICAgIG5hbWUgPSBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAogICAgICAgICAgICAgICAgIG5ldyBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb248U3RyaW5nPigpIHsKICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIFN0cmluZyBydW4oKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFN5c3RlbS5nZXRlbnYoIktSQjVDQ05BTUUiKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgY2FjaGUgPSBTeXN0ZW0uZ2V0ZW52KCJLUkI1Q0NOQU1FIik7CisgICAgICAgICAgICAgICAgaWYgKGNhY2hlICE9IG51bGwgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChjYWNoZS5sZW5ndGgoKSA+PSA1KSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGUucmVnaW9uTWF0Y2hlcyh0cnVlLCAwLCAiRklMRToiLCAwLCA1KSkgeworICAgICAgICAgICAgICAgICAgICBjYWNoZSA9IGNhY2hlLnN1YnN0cmluZyg1KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlOwogICAgICAgICAgICAgfQogICAgICAgICB9KTsKICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkgewpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS9wcm92aWRlci9TZWN1cmVSYW5kb20uamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvcHJvdmlkZXIvU2VjdXJlUmFuZG9tLmphdmEKaW5kZXggZTc5ZTlkNy4uZmE4ODMzNCAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS9wcm92aWRlci9TZWN1cmVSYW5kb20uamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3Byb3ZpZGVyL1NlY3VyZVJhbmRvbS5qYXZhCkBAIC01NiwxMiArNTYsNiBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzU4MTgyOTk5MTE1NTQxNzg4OUw7CiAKLSAgICAvKioKLSAgICAgKiBUaGlzIHN0YXRpYyBvYmplY3Qgd2lsbCBiZSBzZWVkZWQgYnkgU2VlZEdlbmVyYXRvciwgYW5kIHVzZWQKLSAgICAgKiB0byBzZWVkIGZ1dHVyZSBpbnN0YW5jZXMgb2YgU2VjdXJlUmFuZG9tCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgU2VjdXJlUmFuZG9tIHNlZWRlcjsKLQogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBESUdFU1RfU0laRSA9IDIwOwogICAgIHByaXZhdGUgdHJhbnNpZW50IE1lc3NhZ2VEaWdlc3QgZGlnZXN0OwogICAgIHByaXZhdGUgYnl0ZVtdIHN0YXRlOwpAQCAtMTczLDYgKzE2NywyOCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFRoaXMgc3RhdGljIG9iamVjdCB3aWxsIGJlIHNlZWRlZCBieSBTZWVkR2VuZXJhdG9yLCBhbmQgdXNlZAorICAgICAqIHRvIHNlZWQgZnV0dXJlIGluc3RhbmNlcyBvZiBTSEExUFJORyBTZWN1cmVSYW5kb21zLgorICAgICAqCisgICAgICogQmxvY2gsIEVmZmVjdGl2ZSBKYXZhIFNlY29uZCBFZGl0aW9uOiBJdGVtIDcxCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU2VlZGVySG9sZGVyIHsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZWN1cmVSYW5kb20gc2VlZGVyOworCisgICAgICAgIHN0YXRpYyB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQ2FsbCB0byBTZWVkR2VuZXJhdG9yLmdlbmVyYXRlU2VlZCgpIHRvIGFkZCBhZGRpdGlvbmFsCisgICAgICAgICAgICAgKiBzZWVkIG1hdGVyaWFsIChsaWtlbHkgZnJvbSB0aGUgTmF0aXZlIGltcGxlbWVudGF0aW9uKS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgc2VlZGVyID0gbmV3IFNlY3VyZVJhbmRvbShTZWVkR2VuZXJhdG9yLmdldFN5c3RlbUVudHJvcHkoKSk7CisgICAgICAgICAgICBieXRlIFtdIGIgPSBuZXcgYnl0ZVtESUdFU1RfU0laRV07CisgICAgICAgICAgICBTZWVkR2VuZXJhdG9yLmdlbmVyYXRlU2VlZChiKTsKKyAgICAgICAgICAgIHNlZWRlci5lbmdpbmVTZXRTZWVkKGIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCiAgICAgICogR2VuZXJhdGVzIGEgdXNlci1zcGVjaWZpZWQgbnVtYmVyIG9mIHJhbmRvbSBieXRlcy4KICAgICAgKgogICAgICAqIEBwYXJhbSBieXRlcyB0aGUgYXJyYXkgdG8gYmUgZmlsbGVkIGluIHdpdGggcmFuZG9tIGJ5dGVzLgpAQCAtMTgzLDEzICsxOTksOCBAQAogICAgICAgICBieXRlW10gb3V0cHV0ID0gcmVtYWluZGVyOwogCiAgICAgICAgIGlmIChzdGF0ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoc2VlZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzZWVkZXIgPSBuZXcgU2VjdXJlUmFuZG9tKFNlZWRHZW5lcmF0b3IuZ2V0U3lzdGVtRW50cm9weSgpKTsKLSAgICAgICAgICAgICAgICBzZWVkZXIuZW5naW5lU2V0U2VlZChlbmdpbmVHZW5lcmF0ZVNlZWQoRElHRVNUX1NJWkUpKTsKLSAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgYnl0ZVtdIHNlZWQgPSBuZXcgYnl0ZVtESUdFU1RfU0laRV07Ci0gICAgICAgICAgICBzZWVkZXIuZW5naW5lTmV4dEJ5dGVzKHNlZWQpOworICAgICAgICAgICAgU2VlZGVySG9sZGVyLnNlZWRlci5lbmdpbmVOZXh0Qnl0ZXMoc2VlZCk7CiAgICAgICAgICAgICBzdGF0ZSA9IGRpZ2VzdC5kaWdlc3Qoc2VlZCk7CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS9zc2wvQmFzZVNTTFNvY2tldEltcGwuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvc3NsL0Jhc2VTU0xTb2NrZXRJbXBsLmphdmEKaW5kZXggZWY3NTAzYi4uMTU0MjU4NSAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS9zc2wvQmFzZVNTTFNvY2tldEltcGwuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3NzbC9CYXNlU1NMU29ja2V0SW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwOCwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjMsNyArMjMsNiBAQAogICogcXVlc3Rpb25zLgogICovCiAKLQogcGFja2FnZSBzdW4uc2VjdXJpdHkuc3NsOwogCiBpbXBvcnQgamF2YS5pby4qOwpAQCAtNTUsMTYgKzU0LDI1IEBACiAgICAgICogcmVjdXJzZSBpbmZpbml0ZWx5IC4uLiBlLmcuIGNsb3NlKCkgY2FsbGluZyBpdHNlbGYsIG9yIGRvaW5nCiAgICAgICogSS9PIGluIHRlcm1zIG9mIG91ciBvd24gc3RyZWFtcy4KICAgICAgKi8KLSAgICBmaW5hbCBTb2NrZXQgc2VsZjsKKyAgICBmaW5hbCBwcml2YXRlIFNvY2tldCBzZWxmOworICAgIGZpbmFsIHByaXZhdGUgSW5wdXRTdHJlYW0gY29uc3VtZWRJbnB1dDsKIAogICAgIEJhc2VTU0xTb2NrZXRJbXBsKCkgewogICAgICAgICBzdXBlcigpOwogICAgICAgICB0aGlzLnNlbGYgPSB0aGlzOworICAgICAgICB0aGlzLmNvbnN1bWVkSW5wdXQgPSBudWxsOwogICAgIH0KIAogICAgIEJhc2VTU0xTb2NrZXRJbXBsKFNvY2tldCBzb2NrZXQpIHsKICAgICAgICAgc3VwZXIoKTsKICAgICAgICAgdGhpcy5zZWxmID0gc29ja2V0OworICAgICAgICB0aGlzLmNvbnN1bWVkSW5wdXQgPSBudWxsOworICAgIH0KKworICAgIEJhc2VTU0xTb2NrZXRJbXBsKFNvY2tldCBzb2NrZXQsIElucHV0U3RyZWFtIGNvbnN1bWVkKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIHRoaXMuc2VsZiA9IHNvY2tldDsKKyAgICAgICAgdGhpcy5jb25zdW1lZElucHV0ID0gY29uc3VtZWQ7CiAgICAgfQogCiAgICAgLy8KQEAgLTU0MSw0ICs1NDksNTcgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIGlmIChzZWxmID09IHRoaXMpIHsKKyAgICAgICAgICAgIHJldHVybiBzdXBlci50b1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHNlbGYudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoc2VsZiA9PSB0aGlzKSB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb25zdW1lZElucHV0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU2VxdWVuY2VJbnB1dFN0cmVhbShjb25zdW1lZElucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZXRJbnB1dFN0cmVhbSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzZWxmLmdldElucHV0U3RyZWFtKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoc2VsZiA9PSB0aGlzKSB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc2VsZi5nZXRPdXRwdXRTdHJlYW0oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoc2VsZiA9PSB0aGlzKSB7CisgICAgICAgICAgICBzdXBlci5jbG9zZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2VsZi5jbG9zZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFNvVGltZW91dChpbnQgdGltZW91dCkgdGhyb3dzIFNvY2tldEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChzZWxmID09IHRoaXMpIHsKKyAgICAgICAgICAgIHN1cGVyLnNldFNvVGltZW91dCh0aW1lb3V0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNlbGYuc2V0U29UaW1lb3V0KHRpbWVvdXQpOworICAgICAgICB9CisgICAgfQorCisgICAgYm9vbGVhbiBpc0xheWVyZWQoKSB7CisgICAgICAgIHJldHVybiAoc2VsZiAhPSB0aGlzKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3NzbC9DbGllbnRIYW5kc2hha2VyLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3NzbC9DbGllbnRIYW5kc2hha2VyLmphdmEKaW5kZXggOWViZWI3NS4uZDE4YWY1NSAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS9zc2wvQ2xpZW50SGFuZHNoYWtlci5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvc3NsL0NsaWVudEhhbmRzaGFrZXIuamF2YQpAQCAtNDgsOCArNDgsNiBAQAogaW1wb3J0IHN1bi5zZWN1cml0eS5zc2wuQ2lwaGVyU3VpdGUuKjsKIGltcG9ydCBzdGF0aWMgc3VuLnNlY3VyaXR5LnNzbC5DaXBoZXJTdWl0ZS5LZXlFeGNoYW5nZS4qOwogCi1pbXBvcnQgc3VuLm5ldC51dGlsLklQQWRkcmVzc1V0aWw7Ci0KIC8qKgogICogQ2xpZW50SGFuZHNoYWtlciBkb2VzIHRoZSBwcm90b2NvbCBoYW5kc2hha2luZyBmcm9tIHRoZSBwb2ludAogICogb2YgdmlldyBvZiBhIGNsaWVudC4gIEl0IGlzIGRyaXZlbiBhc3ljaHJvbm91c2x5IGJ5IGhhbmRzaGFrZSBtZXNzYWdlcwpAQCAtOTIsNiArOTAsOSBAQAogICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGJvb2xlYW4gZW5hYmxlU05JRXh0ZW5zaW9uID0KICAgICAgICAgICAgIERlYnVnLmdldEJvb2xlYW5Qcm9wZXJ0eSgianNzZS5lbmFibGVTTklFeHRlbnNpb24iLCB0cnVlKTsKIAorICAgIHByaXZhdGUgTGlzdDxTTklTZXJ2ZXJOYW1lPiByZXF1ZXN0ZWRTZXJ2ZXJOYW1lcyA9CisgICAgICAgICAgICBDb2xsZWN0aW9ucy48U05JU2VydmVyTmFtZT5lbXB0eUxpc3QoKTsKKwogICAgIC8qCiAgICAgICogQ29uc3RydWN0b3JzCiAgICAgICovCkBAIC01NzksNiArNTgwLDcgQEAKICAgICAgICAgc2Vzc2lvbiA9IG5ldyBTU0xTZXNzaW9uSW1wbChwcm90b2NvbFZlcnNpb24sIGNpcGhlclN1aXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExvY2FsU3VwcG9ydGVkU2lnbkFsZ3MoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNnLnNlc3Npb25JZCwgZ2V0SG9zdFNFKCksIGdldFBvcnRTRSgpKTsKKyAgICAgICAgc2Vzc2lvbi5zZXRSZXF1ZXN0ZWRTZXJ2ZXJOYW1lcyhyZXF1ZXN0ZWRTZXJ2ZXJOYW1lcyk7CiAgICAgICAgIHNldEhhbmRzaGFrZVNlc3Npb25TRShzZXNzaW9uKTsKICAgICAgICAgaWYgKGRlYnVnICE9IG51bGwgJiYgRGVidWcuaXNPbigiaGFuZHNoYWtlIikpIHsKICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKiogIiArIGNpcGhlclN1aXRlKTsKQEAgLTEyNDYsMTcgKzEyNDgsMTQgQEAKIAogICAgICAgICAvLyBhZGQgc2VydmVyX25hbWUgZXh0ZW5zaW9uCiAgICAgICAgIGlmIChlbmFibGVTTklFeHRlbnNpb24pIHsKLSAgICAgICAgICAgIC8vIFdlIGNhbm5vdCB1c2UgdGhlIGhvc3RuYW1lIHJlc29sdmVkIGZyb20gbmFtZSBzZXJ2aWNlcy4gIEZvcgotICAgICAgICAgICAgLy8gdmlydHVhbCBob3N0aW5nLCBtdWx0aXBsZSBob3N0bmFtZXMgbWF5IGJlIGJvdW5kIHRvIHRoZSBzYW1lIElQCi0gICAgICAgICAgICAvLyBhZGRyZXNzLCBzbyB0aGUgaG9zdG5hbWUgcmVzb2x2ZWQgZnJvbSBuYW1lIHNlcnZpY2VzIGlzIG5vdAotICAgICAgICAgICAgLy8gcmVsaWFibGUuCi0gICAgICAgICAgICBTdHJpbmcgaG9zdG5hbWUgPSBnZXRSYXdIb3N0bmFtZVNFKCk7CisgICAgICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmVxdWVzdGVkU2VydmVyTmFtZXMgPSBzZXNzaW9uLmdldFJlcXVlc3RlZFNlcnZlck5hbWVzKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlcXVlc3RlZFNlcnZlck5hbWVzID0gc2VydmVyTmFtZXM7CisgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC8vIHdlIG9ubHkgYWxsb3cgRlFETgotICAgICAgICAgICAgaWYgKGhvc3RuYW1lICE9IG51bGwgJiYgaG9zdG5hbWUuaW5kZXhPZignLicpID4gMCAmJgotICAgICAgICAgICAgICAgICAgICAhSVBBZGRyZXNzVXRpbC5pc0lQdjRMaXRlcmFsQWRkcmVzcyhob3N0bmFtZSkgJiYKLSAgICAgICAgICAgICAgICAgICAgIUlQQWRkcmVzc1V0aWwuaXNJUHY2TGl0ZXJhbEFkZHJlc3MoaG9zdG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgY2xpZW50SGVsbG9NZXNzYWdlLmFkZFNlcnZlck5hbWVJbmRpY2F0aW9uRXh0ZW5zaW9uKGhvc3RuYW1lKTsKKyAgICAgICAgICAgIGlmICghcmVxdWVzdGVkU2VydmVyTmFtZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgY2xpZW50SGVsbG9NZXNzYWdlLmFkZFNOSUV4dGVuc2lvbihyZXF1ZXN0ZWRTZXJ2ZXJOYW1lcyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS9zc2wvSGFuZHNoYWtlSW5TdHJlYW0uamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvc3NsL0hhbmRzaGFrZUluU3RyZWFtLmphdmEKaW5kZXggZjZjYTQ3Ny4uYTZjMDYxMSAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS9zc2wvSGFuZHNoYWtlSW5TdHJlYW0uamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3NzbC9IYW5kc2hha2VJblN0cmVhbS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMTk5NiwgMjAwOSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5NiwgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMTIxLDcgKzEyMSw4IEBACiAgICAgICAgIHIubWFyayhyZWFkbGltaXQpOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgeworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgci5yZXNldCgpOwogICAgIH0KIApAQCAtMTkwLDYgKzE5MSw3IEBACiAKICAgICBieXRlW10gZ2V0Qnl0ZXM4KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgaW50IGxlbiA9IGdldEludDgoKTsKKyAgICAgICAgdmVyaWZ5TGVuZ3RoKGxlbik7CiAgICAgICAgIGJ5dGUgYltdID0gbmV3IGJ5dGVbbGVuXTsKIAogICAgICAgICByZWFkKGIsIDAsIGxlbik7CkBAIC0xOTgsNiArMjAwLDcgQEAKIAogICAgIHB1YmxpYyBieXRlW10gZ2V0Qnl0ZXMxNigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGludCBsZW4gPSBnZXRJbnQxNigpOworICAgICAgICB2ZXJpZnlMZW5ndGgobGVuKTsKICAgICAgICAgYnl0ZSBiW10gPSBuZXcgYnl0ZVtsZW5dOwogCiAgICAgICAgIHJlYWQoYiwgMCwgbGVuKTsKQEAgLTIwNiwxMCArMjA5LDE5IEBACiAKICAgICBieXRlW10gZ2V0Qnl0ZXMyNCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGludCBsZW4gPSBnZXRJbnQyNCgpOworICAgICAgICB2ZXJpZnlMZW5ndGgobGVuKTsKICAgICAgICAgYnl0ZSBiW10gPSBuZXcgYnl0ZVtsZW5dOwogCiAgICAgICAgIHJlYWQoYiwgMCwgbGVuKTsKICAgICAgICAgcmV0dXJuIGI7CiAgICAgfQogCisgICAgLy8gSXMgYSBsZW5ndGggZ3JlYXRlciB0aGFuIGF2YWlsYWJsZSBieXRlcyBpbiB0aGUgcmVjb3JkPworICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlMZW5ndGgoaW50IGxlbikgdGhyb3dzIFNTTEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChsZW4gPiBhdmFpbGFibGUoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNTTEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJOb3QgZW5vdWdoIGRhdGEgdG8gZmlsbCBkZWNsYXJlZCB2ZWN0b3Igc2l6ZSIpOworICAgICAgICB9CisgICAgfQorCiB9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3NzbC9IYW5kc2hha2VNZXNzYWdlLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3NzbC9IYW5kc2hha2VNZXNzYWdlLmphdmEKaW5kZXggYzRjY2E5ZS4uNzQ2NzczNSAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS9zc2wvSGFuZHNoYWtlTWVzc2FnZS5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvc3NsL0hhbmRzaGFrZU1lc3NhZ2UuamF2YQpAQCAtMjU2LDEzICsyNTYsOSBAQAogICAgIH0KIAogICAgIC8vIGFkZCBzZXJ2ZXJfbmFtZSBleHRlbnNpb24KLSAgICB2b2lkIGFkZFNlcnZlck5hbWVJbmRpY2F0aW9uRXh0ZW5zaW9uKFN0cmluZyBob3N0bmFtZSkgewotICAgICAgICAvLyBXZSB3b3VsZCBoYXZlIGNoZWNrZWQgdGhhdCB0aGUgaG9zdG5hbWUgaWEgYSBGUUROLgotICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBob3N0bmFtZXMgPSBuZXcgQXJyYXlMaXN0PD4oMSk7Ci0gICAgICAgIGhvc3RuYW1lcy5hZGQoaG9zdG5hbWUpOwotCisgICAgdm9pZCBhZGRTTklFeHRlbnNpb24oTGlzdDxTTklTZXJ2ZXJOYW1lPiBzZXJ2ZXJOYW1lcykgewogICAgICAgICB0cnkgewotICAgICAgICAgICAgZXh0ZW5zaW9ucy5hZGQobmV3IFNlcnZlck5hbWVFeHRlbnNpb24oaG9zdG5hbWVzKSk7CisgICAgICAgICAgICBleHRlbnNpb25zLmFkZChuZXcgU2VydmVyTmFtZUV4dGVuc2lvbihzZXJ2ZXJOYW1lcykpOwogICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKICAgICAgICAgICAgIC8vIGlnbm9yZSB0aGUgZXhjZXB0aW9uIGFuZCByZXR1cm4KICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS9zc2wvSGFuZHNoYWtlci5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS9zc2wvSGFuZHNoYWtlci5qYXZhCmluZGV4IDRmYjdmZWMuLjgzNGY0YzAgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvc3NsL0hhbmRzaGFrZXIuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3NzbC9IYW5kc2hha2VyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAxOTk2LCAyMDExLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk2LCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0xMTIsNiArMTEyLDEyIEBACiAgICAgICovCiAgICAgcHJpdmF0ZSBDaXBoZXJTdWl0ZUxpc3QgICAgYWN0aXZlQ2lwaGVyU3VpdGVzOwogCisgICAgLy8gVGhlIHNlcnZlciBuYW1lIGluZGljYXRpb24gYW5kIG1hdGNoZXJzCisgICAgTGlzdDxTTklTZXJ2ZXJOYW1lPiAgICAgICAgIHNlcnZlck5hbWVzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLjxTTklTZXJ2ZXJOYW1lPmVtcHR5TGlzdCgpOworICAgIENvbGxlY3Rpb248U05JTWF0Y2hlcj4gICAgICBzbmlNYXRjaGVycyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy48U05JTWF0Y2hlcj5lbXB0eUxpc3QoKTsKKwogICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgICAgICBpc0NsaWVudDsKICAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICAgICAgbmVlZENlcnRWZXJpZnk7CiAKQEAgLTI4NywxNCArMjkzLDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIFN0cmluZyBnZXRSYXdIb3N0bmFtZVNFKCkgewotICAgICAgICBpZiAoY29ubiAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gY29ubi5nZXRSYXdIb3N0bmFtZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGVuZ2luZS5nZXRQZWVySG9zdCgpOwotICAgICAgICB9Ci0gICAgfQotCisgICAgLy8gT05MWSB1c2VkIGJ5IENsaWVudEhhbmRzaGFrZXIgdG8gc2V0dXAgdGhlIHBlZXIgaG9zdCBpbiBTU0xTZXNzaW9uLgogICAgIFN0cmluZyBnZXRIb3N0U0UoKSB7CiAgICAgICAgIGlmIChjb25uICE9IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiBjb25uLmdldEhvc3QoKTsKQEAgLTMwMyw2ICszMDIsNyBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLy8gT05MWSB1c2VkIGJ5IFNlcnZlckhhbmRzaGFrZXIgdG8gc2V0dXAgdGhlIHBlZXIgaG9zdCBpbiBTU0xTZXNzaW9uLgogICAgIFN0cmluZyBnZXRIb3N0QWRkcmVzc1NFKCkgewogICAgICAgICBpZiAoY29ubiAhPSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gY29ubi5nZXRJbmV0QWRkcmVzcygpLmdldEhvc3RBZGRyZXNzKCk7CkBAIC00MzYsNiArNDM2LDIyIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogU2V0cyB0aGUgc2VydmVyIG5hbWUgaW5kaWNhdGlvbiBvZiB0aGUgaGFuZHNoYWtlLgorICAgICAqLworICAgIHZvaWQgc2V0U05JU2VydmVyTmFtZXMoTGlzdDxTTklTZXJ2ZXJOYW1lPiBzZXJ2ZXJOYW1lcykgeworICAgICAgICAvLyBUaGUgc2VydmVyTmFtZXMgcGFyYW1ldGVyIGlzIHVubW9kaWZpYWJsZS4KKyAgICAgICAgdGhpcy5zZXJ2ZXJOYW1lcyA9IHNlcnZlck5hbWVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHNlcnZlciBuYW1lIG1hdGNoZXJzIG9mIHRoZSBoYW5kc2hha2luZy4KKyAgICAgKi8KKyAgICB2b2lkIHNldFNOSU1hdGNoZXJzKENvbGxlY3Rpb248U05JTWF0Y2hlcj4gc25pTWF0Y2hlcnMpIHsKKyAgICAgICAgLy8gVGhlIHNuaU1hdGNoZXJzIHBhcmFtZXRlciBpcyB1bm1vZGlmaWFibGUuCisgICAgICAgIHRoaXMuc25pTWF0Y2hlcnMgPSBzbmlNYXRjaGVyczsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBQcmlvciB0byBoYW5kc2hha2luZywgYWN0aXZhdGUgdGhlIGhhbmRzaGFrZSBhbmQgaW5pdGlhbGl6ZSB0aGUgdmVyc2lvbiwKICAgICAgKiBpbnB1dCBzdHJlYW0gYW5kIG91dHB1dCBzdHJlYW0uCiAgICAgICovCkBAIC0xMDYzLDcgKzEwNzksNiBAQAogICAgICAgICAgICAgaWYgKGRlYnVnICE9IG51bGwgJiYgRGVidWcuaXNPbigiaGFuZHNoYWtlIikpIHsKICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJTQSBtYXN0ZXIgc2VjcmV0IGdlbmVyYXRpb24gZXJyb3I6Iik7CiAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJHZW5lcmF0aW5nIG5ldyByYW5kb20gcHJlbWFzdGVyIHNlY3JldCIpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAocmVxdWVzdGVkVmVyc2lvbiAhPSBudWxsKSB7CkBAIC0xMTMwLDcgKzExNDUsNiBAQAogICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSU0EgUHJlTWFzdGVyU2VjcmV0IHZlcnNpb24gZXJyb3I6IGV4cGVjdGVkIgogICAgICAgICAgICAgICAgICsgcHJvdG9jb2xWZXJzaW9uICsgIiBvciAiICsgcmVxdWVzdGVkVmVyc2lvbiArICIsIGRlY3J5cHRlZDogIgogICAgICAgICAgICAgICAgICsgcHJlbWFzdGVyVmVyc2lvbik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkdlbmVyYXRpbmcgbmV3IHJhbmRvbSBwcmVtYXN0ZXIgc2VjcmV0Iik7CiAgICAgICAgIH0KICAgICAgICAgcHJlTWFzdGVyU2VjcmV0ID0KICAgICAgICAgICAgIFJTQUNsaWVudEtleUV4Y2hhbmdlLmdlbmVyYXRlRHVtbXlTZWNyZXQocmVxdWVzdGVkVmVyc2lvbik7CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3NzbC9IZWxsb0V4dGVuc2lvbnMuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvc3NsL0hlbGxvRXh0ZW5zaW9ucy5qYXZhCmluZGV4IDlkYjY5MjcuLmVhNzY5ZmQgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvc3NsL0hlbGxvRXh0ZW5zaW9ucy5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvc3NsL0hlbGxvRXh0ZW5zaW9ucy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjgsMTEgKzI4LDEwIEBACiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwogaW1wb3J0IGphdmEudXRpbC4qOwotCitpbXBvcnQgamF2YXgubmV0LnNzbC4qOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LnNwZWMuRUNQYXJhbWV0ZXJTcGVjOwogCi1pbXBvcnQgamF2YXgubmV0LnNzbC5TU0xQcm90b2NvbEV4Y2VwdGlvbjsKLQogLyoqCiAgKiBUaGlzIGZpbGUgY29udGFpbnMgYWxsIHRoZSBjbGFzc2VzIHJlbGV2YW50IHRvIFRMUyBFeHRlbnNpb25zIGZvciB0aGUKICAqIENsaWVudEhlbGxvIGFuZCBTZXJ2ZXJIZWxsbyBtZXNzYWdlcy4gVGhlIGV4dGVuc2lvbiBtZWNoYW5pc20gYW5kCkBAIC0yNzQsMTEgKzI3MywxMSBAQAogfQogCiAvKgotICogW1JGQzQzNjZdIFRvIGZhY2lsaXRhdGUgc2VjdXJlIGNvbm5lY3Rpb25zIHRvIHNlcnZlcnMgdGhhdCBob3N0IG11bHRpcGxlCi0gKiAndmlydHVhbCcgc2VydmVycyBhdCBhIHNpbmdsZSB1bmRlcmx5aW5nIG5ldHdvcmsgYWRkcmVzcywgY2xpZW50cyBNQVkKLSAqIGluY2x1ZGUgYW4gZXh0ZW5zaW9uIG9mIHR5cGUgInNlcnZlcl9uYW1lIiBpbiB0aGUgKGV4dGVuZGVkKSBjbGllbnQgaGVsbG8uCi0gKiBUaGUgImV4dGVuc2lvbl9kYXRhIiBmaWVsZCBvZiB0aGlzIGV4dGVuc2lvbiBTSEFMTCBjb250YWluICJTZXJ2ZXJOYW1lTGlzdCIKLSAqIHdoZXJlOgorICogW1JGQyA0MzY2LzYwNjZdIFRvIGZhY2lsaXRhdGUgc2VjdXJlIGNvbm5lY3Rpb25zIHRvIHNlcnZlcnMgdGhhdCBob3N0CisgKiBtdWx0aXBsZSAndmlydHVhbCcgc2VydmVycyBhdCBhIHNpbmdsZSB1bmRlcmx5aW5nIG5ldHdvcmsgYWRkcmVzcywgY2xpZW50cworICogTUFZIGluY2x1ZGUgYW4gZXh0ZW5zaW9uIG9mIHR5cGUgInNlcnZlcl9uYW1lIiBpbiB0aGUgKGV4dGVuZGVkKSBjbGllbnQKKyAqIGhlbGxvLiAgVGhlICJleHRlbnNpb25fZGF0YSIgZmllbGQgb2YgdGhpcyBleHRlbnNpb24gU0hBTEwgY29udGFpbgorICogIlNlcnZlck5hbWVMaXN0IiB3aGVyZToKICAqCiAgKiAgICAgc3RydWN0IHsKICAqICAgICAgICAgTmFtZVR5cGUgbmFtZV90eXBlOwpAQCAtMjk5LDQ0ICsyOTgsNDcgQEAKICAqLwogZmluYWwgY2xhc3MgU2VydmVyTmFtZUV4dGVuc2lvbiBleHRlbmRzIEhlbGxvRXh0ZW5zaW9uIHsKIAotICAgIGZpbmFsIHN0YXRpYyBpbnQgTkFNRV9IT1NUX05BTUUgPSAwOwotCi0gICAgcHJpdmF0ZSBMaXN0PFNlcnZlck5hbWU+IG5hbWVzOworICAgIC8vIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCBhbGwgZnV0dXJlIGRhdGEgc3RydWN0dXJlcyBhc3NvY2lhdGVkIHdpdGgKKyAgICAvLyBuZXcgTmFtZVR5cGVzIE1VU1QgYmVnaW4gd2l0aCBhIDE2LWJpdCBsZW5ndGggZmllbGQuCisgICAgZmluYWwgc3RhdGljIGludCBOQU1FX0hFQURFUl9MRU5HVEggPSAzOyAgICAvLyBOYW1lVHlwZTogMSBieXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOYW1lIGxlbmd0aDogMiBieXRlcworICAgIHByaXZhdGUgTWFwPEludGVnZXIsIFNOSVNlcnZlck5hbWU+IHNuaU1hcDsKICAgICBwcml2YXRlIGludCBsaXN0TGVuZ3RoOyAgICAgLy8gU2VydmVyTmFtZUxpc3QgbGVuZ3RoCiAKLSAgICBTZXJ2ZXJOYW1lRXh0ZW5zaW9uKExpc3Q8U3RyaW5nPiBob3N0bmFtZXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgLy8gY29uc3RydWN0b3IgZm9yIFNlcnZlckhlbGxvCisgICAgU2VydmVyTmFtZUV4dGVuc2lvbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHN1cGVyKEV4dGVuc2lvblR5cGUuRVhUX1NFUlZFUl9OQU1FKTsKIAogICAgICAgICBsaXN0TGVuZ3RoID0gMDsKLSAgICAgICAgbmFtZXMgPSBuZXcgQXJyYXlMaXN0PFNlcnZlck5hbWU+KGhvc3RuYW1lcy5zaXplKCkpOwotICAgICAgICBmb3IgKFN0cmluZyBob3N0bmFtZSA6IGhvc3RuYW1lcykgewotICAgICAgICAgICAgaWYgKGhvc3RuYW1lICE9IG51bGwgJiYgaG9zdG5hbWUubGVuZ3RoKCkgIT0gMCkgewotICAgICAgICAgICAgICAgIC8vIHdlIG9ubHkgc3VwcG9ydCBETlMgaG9zdG5hbWUgbm93LgotICAgICAgICAgICAgICAgIFNlcnZlck5hbWUgc2VydmVyTmFtZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgU2VydmVyTmFtZShOQU1FX0hPU1RfTkFNRSwgaG9zdG5hbWUpOwotICAgICAgICAgICAgICAgIG5hbWVzLmFkZChzZXJ2ZXJOYW1lKTsKLSAgICAgICAgICAgICAgICBsaXN0TGVuZ3RoICs9IHNlcnZlck5hbWUubGVuZ3RoOworICAgICAgICBzbmlNYXAgPSBDb2xsZWN0aW9ucy48SW50ZWdlciwgU05JU2VydmVyTmFtZT5lbXB0eU1hcCgpOworICAgIH0KKworICAgIC8vIGNvbnN0cnVjdG9yIGZvciBDbGllbnRIZWxsbworICAgIFNlcnZlck5hbWVFeHRlbnNpb24oTGlzdDxTTklTZXJ2ZXJOYW1lPiBzZXJ2ZXJOYW1lcykKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyKEV4dGVuc2lvblR5cGUuRVhUX1NFUlZFUl9OQU1FKTsKKworICAgICAgICBsaXN0TGVuZ3RoID0gMDsKKyAgICAgICAgc25pTWFwID0gbmV3IExpbmtlZEhhc2hNYXA8PigpOworICAgICAgICBmb3IgKFNOSVNlcnZlck5hbWUgc2VydmVyTmFtZSA6IHNlcnZlck5hbWVzKSB7CisgICAgICAgICAgICAvLyBjaGVjayBmb3IgZHVwbGljYXRlZCBzZXJ2ZXIgbmFtZSB0eXBlCisgICAgICAgICAgICBpZiAoc25pTWFwLnB1dChzZXJ2ZXJOYW1lLmdldFR5cGUoKSwgc2VydmVyTmFtZSkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIHVubGlrZWx5IHRvIGhhcHBlbiwgYnV0IGluIGNhc2UgLi4uCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJEdXBsaWNhdGVkIHNlcnZlciBuYW1lIG9mIHR5cGUgIiArIHNlcnZlck5hbWUuZ2V0VHlwZSgpKTsKICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbGlzdExlbmd0aCArPSBzZXJ2ZXJOYW1lLmdldEVuY29kZWQoKS5sZW5ndGggKyBOQU1FX0hFQURFUl9MRU5HVEg7CiAgICAgICAgIH0KIAotICAgICAgICAvLyBBcyB3ZSBvbmx5IHN1cHBvcnQgRE5TIGhvc3RuYW1lIG5vdywgdGhlIGhvc3RuYW1lIGxpc3QgbXVzdAotICAgICAgICAvLyBub3QgY29udGFpbiBtb3JlIHRoYW4gb25lIGhvc3RuYW1lCi0gICAgICAgIGlmIChuYW1lcy5zaXplKCkgPiAxKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU1NMUHJvdG9jb2xFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJUaGUgU2VydmVyTmFtZUxpc3QgTVVTVCBOT1QgY29udGFpbiBtb3JlIHRoYW4gIiArCi0gICAgICAgICAgICAgICAgICAgICJvbmUgbmFtZSBvZiB0aGUgc2FtZSBuYW1lX3R5cGUiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFdlIG9ubHkgbmVlZCB0byBhZGQgInNlcnZlcl9uYW1lIiBleHRlbnNpb24gaW4gQ2xpZW50SGVsbG8gdW5sZXNzCi0gICAgICAgIC8vIHdlIHN1cHBvcnQgU05JIGluIHNlcnZlciBzaWRlIGluIHRoZSBmdXR1cmUuIEl0IGlzIHBvc3NpYmxlIHRoYXQKLSAgICAgICAgLy8gdGhlIFNOSSBpcyBlbXB0eSBpbiBTZXJ2ZXJIZWxsby4gQXMgd2UgZG9uJ3Qgc3VwcG9ydCBTTkkgaW4KLSAgICAgICAgLy8gU2VydmVySGVsbG8gbm93LCB3ZSB3aWxsIHRocm93IGV4Y2VwdGlvbiBmb3IgZW1wdHkgbGlzdCBmb3Igbm93LgorICAgICAgICAvLyBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgZm9yIENsaWVudEhlbGxvIG9ubHkuICBFbXB0eSBsaXN0IGlzCisgICAgICAgIC8vIG5vdCBhbGxvd2VkIGluIGNsaWVudCBtb2RlLgogICAgICAgICBpZiAobGlzdExlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgU1NMUHJvdG9jb2xFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJUaGUgU2VydmVyTmFtZUxpc3QgY2Fubm90IGJlIGVtcHR5Iik7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGhlIFNlcnZlck5hbWVMaXN0IGNhbm5vdCBiZSBlbXB0eSIpOwogICAgICAgICB9CiAgICAgfQogCisgICAgLy8gY29uc3RydWN0b3IgZm9yIFNlcnZlckhlbGxvIGZvciBwYXJzaW5nIFNOSSBleHRlbnNpb24KICAgICBTZXJ2ZXJOYW1lRXh0ZW5zaW9uKEhhbmRzaGFrZUluU3RyZWFtIHMsIGludCBsZW4pCiAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBzdXBlcihFeHRlbnNpb25UeXBlLkVYVF9TRVJWRVJfTkFNRSk7CkBAIC0zNTAsMTcgKzM1Miw1NCBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICByZW1haW5zIC09IDI7Ci0gICAgICAgICAgICBuYW1lcyA9IG5ldyBBcnJheUxpc3Q8U2VydmVyTmFtZT4oKTsKKyAgICAgICAgICAgIHNuaU1hcCA9IG5ldyBMaW5rZWRIYXNoTWFwPD4oKTsKICAgICAgICAgICAgIHdoaWxlIChyZW1haW5zID4gMCkgewotICAgICAgICAgICAgICAgIFNlcnZlck5hbWUgbmFtZSA9IG5ldyBTZXJ2ZXJOYW1lKHMpOwotICAgICAgICAgICAgICAgIG5hbWVzLmFkZChuYW1lKTsKLSAgICAgICAgICAgICAgICByZW1haW5zIC09IG5hbWUubGVuZ3RoOworICAgICAgICAgICAgICAgIGludCBjb2RlID0gcy5nZXRJbnQ4KCk7ICAgICAgIC8vIE5hbWVUeXBlCiAKLSAgICAgICAgICAgICAgICAvLyB3ZSBtYXkgbmVlZCB0byBjaGVjayB0aGUgZHVwbGljYXRlZCBTZXJ2ZXJOYW1lIHR5cGUKKyAgICAgICAgICAgICAgICAvLyBIb3N0TmFtZSAobGVuZ3RoIHJlYWQgaW4gZ2V0Qnl0ZXMxNik7CisgICAgICAgICAgICAgICAgYnl0ZVtdIGVuY29kZWQgPSBzLmdldEJ5dGVzMTYoKTsKKyAgICAgICAgICAgICAgICBTTklTZXJ2ZXJOYW1lIHNlcnZlck5hbWU7CisgICAgICAgICAgICAgICAgc3dpdGNoIChjb2RlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU3RhbmRhcmRDb25zdGFudHMuU05JX0hPU1RfTkFNRToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbmNvZGVkLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNTTFByb3RvY29sRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRW1wdHkgSG9zdE5hbWUgaW4gc2VydmVyIG5hbWUgaW5kaWNhdGlvbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJOYW1lID0gbmV3IFNOSUhvc3ROYW1lKGVuY29kZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlhZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTTFByb3RvY29sRXhjZXB0aW9uIHNwZSA9IG5ldyBTU0xQcm90b2NvbEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklsbGVnYWwgc2VydmVyIG5hbWUsIHR5cGU9aG9zdF9uYW1lKCIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlICsgIiksIG5hbWU9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZXcgU3RyaW5nKGVuY29kZWQsIFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsIHZhbHVlPSIgKyBEZWJ1Zy50b1N0cmluZyhlbmNvZGVkKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlLmluaXRDYXVzZShpYWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHNwZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJOYW1lID0gbmV3IFVua25vd25TZXJ2ZXJOYW1lKGNvZGUsIGVuY29kZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlhZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTTFByb3RvY29sRXhjZXB0aW9uIHNwZSA9IG5ldyBTU0xQcm90b2NvbEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklsbGVnYWwgc2VydmVyIG5hbWUsIHR5cGU9KCIgKyBjb2RlICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiksIHZhbHVlPSIgKyBEZWJ1Zy50b1N0cmluZyhlbmNvZGVkKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlLmluaXRDYXVzZShpYWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHNwZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gY2hlY2sgZm9yIGR1cGxpY2F0ZWQgc2VydmVyIG5hbWUgdHlwZQorICAgICAgICAgICAgICAgIGlmIChzbmlNYXAucHV0KHNlcnZlck5hbWUuZ2V0VHlwZSgpLCBzZXJ2ZXJOYW1lKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTU0xQcm90b2NvbEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRHVwbGljYXRlZCBzZXJ2ZXIgbmFtZSBvZiB0eXBlICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlck5hbWUuZ2V0VHlwZSgpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZW1haW5zIC09IGVuY29kZWQubGVuZ3RoICsgTkFNRV9IRUFERVJfTEVOR1RIOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKGxlbiA9PSAwKSB7ICAgICAvLyAic2VydmVyX25hbWUiIGV4dGVuc2lvbiBpbiBTZXJ2ZXJIZWxsbwogICAgICAgICAgICAgbGlzdExlbmd0aCA9IDA7Ci0gICAgICAgICAgICBuYW1lcyA9IENvbGxlY3Rpb25zLjxTZXJ2ZXJOYW1lPmVtcHR5TGlzdCgpOworICAgICAgICAgICAgc25pTWFwID0gQ29sbGVjdGlvbnMuPEludGVnZXIsIFNOSVNlcnZlck5hbWU+ZW1wdHlNYXAoKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChyZW1haW5zICE9IDApIHsKQEAgLTM2OCwzOSArNDA3LDcyIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBzdGF0aWMgY2xhc3MgU2VydmVyTmFtZSB7Ci0gICAgICAgIGZpbmFsIGludCBsZW5ndGg7Ci0gICAgICAgIGZpbmFsIGludCB0eXBlOwotICAgICAgICBmaW5hbCBieXRlW10gZGF0YTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGhvc3RuYW1lOwotCi0gICAgICAgIFNlcnZlck5hbWUoaW50IHR5cGUsIFN0cmluZyBob3N0bmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7ICAgICAgICAgICAgICAgICAgICAgICAvLyBOYW1lVHlwZQotICAgICAgICAgICAgdGhpcy5ob3N0bmFtZSA9IGhvc3RuYW1lOwotICAgICAgICAgICAgdGhpcy5kYXRhID0gaG9zdG5hbWUuZ2V0Qnl0ZXMoIlVURjgiKTsgIC8vIEhvc3ROYW1lCi0gICAgICAgICAgICB0aGlzLmxlbmd0aCA9IGRhdGEubGVuZ3RoICsgMzsgICAgICAgICAgLy8gTmFtZVR5cGU6IDEgYnl0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhvc3ROYW1lIGxlbmd0aDogMiBieXRlcworICAgIExpc3Q8U05JU2VydmVyTmFtZT4gZ2V0U2VydmVyTmFtZXMoKSB7CisgICAgICAgIGlmIChzbmlNYXAgIT0gbnVsbCAmJiAhc25pTWFwLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLjxTTklTZXJ2ZXJOYW1lPnVubW9kaWZpYWJsZUxpc3QoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFycmF5TGlzdDw+KHNuaU1hcC52YWx1ZXMoKSkpOwogICAgICAgICB9CiAKLSAgICAgICAgU2VydmVyTmFtZShIYW5kc2hha2VJblN0cmVhbSBzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgdHlwZSA9IHMuZ2V0SW50OCgpOyAgICAgICAgIC8vIE5hbWVUeXBlCi0gICAgICAgICAgICBkYXRhID0gcy5nZXRCeXRlczE2KCk7ICAgICAgLy8gSG9zdE5hbWUgKGxlbmd0aCByZWFkIGluIGdldEJ5dGVzMTYpCi0gICAgICAgICAgICBsZW5ndGggPSBkYXRhLmxlbmd0aCArIDM7ICAgLy8gTmFtZVR5cGU6IDEgYnl0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhvc3ROYW1lIGxlbmd0aDogMiBieXRlcwotICAgICAgICAgICAgaWYgKHR5cGUgPT0gTkFNRV9IT1NUX05BTUUpIHsKLSAgICAgICAgICAgICAgICBob3N0bmFtZSA9IG5ldyBTdHJpbmcoZGF0YSwgIlVURjgiKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaG9zdG5hbWUgPSBudWxsOworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuPFNOSVNlcnZlck5hbWU+ZW1wdHlMaXN0KCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBJcyB0aGUgZXh0ZW5zaW9uIHJlY29nbml6ZWQgYnkgdGhlIGNvcnJlc3BvbmRpbmcgbWF0Y2hlcj8KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gY2hlY2sgd2hldGhlciB0aGUgc2VydmVyIG5hbWUgaW5kaWNhdGlvbiBjYW4KKyAgICAgKiBiZSByZWNvZ25pemVkIGJ5IHRoZSBzZXJ2ZXIgbmFtZSBtYXRjaGVycy4KKyAgICAgKgorICAgICAqIFBlciBSRkMgNjA2NiwgaWYgdGhlIHNlcnZlciB1bmRlcnN0b29kIHRoZSBDbGllbnRIZWxsbyBleHRlbnNpb24gYnV0CisgICAgICogZG9lcyBub3QgcmVjb2duaXplIHRoZSBzZXJ2ZXIgbmFtZSwgdGhlIHNlcnZlciBTSE9VTEQgdGFrZSBvbmUgb2YgdHdvCisgICAgICogYWN0aW9uczogZWl0aGVyIGFib3J0IHRoZSBoYW5kc2hha2UgYnkgc2VuZGluZyBhIGZhdGFsLWxldmVsCisgICAgICogdW5yZWNvZ25pemVkX25hbWUoMTEyKSBhbGVydCBvciBjb250aW51ZSB0aGUgaGFuZHNoYWtlLgorICAgICAqCisgICAgICogSWYgdGhlcmUgaXMgYW4gaW5zdGFuY2Ugb2YgU05JTWF0Y2hlciBkZWZpbmVkIGZvciBhIHBhcnRpY3VsYXIgbmFtZQorICAgICAqIHR5cGUsIGl0IG11c3QgYmUgdXNlZCB0byBwZXJmb3JtIG1hdGNoIG9wZXJhdGlvbnMgb24gdGhlIHNlcnZlciBuYW1lLgorICAgICAqLworICAgIGJvb2xlYW4gaXNNYXRjaGVkKENvbGxlY3Rpb248U05JTWF0Y2hlcj4gbWF0Y2hlcnMpIHsKKyAgICAgICAgaWYgKHNuaU1hcCAhPSBudWxsICYmICFzbmlNYXAuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBmb3IgKFNOSU1hdGNoZXIgbWF0Y2hlciA6IG1hdGNoZXJzKSB7CisgICAgICAgICAgICAgICAgU05JU2VydmVyTmFtZSBzbmlOYW1lID0gc25pTWFwLmdldChtYXRjaGVyLmdldFR5cGUoKSk7CisgICAgICAgICAgICAgICAgaWYgKHNuaU5hbWUgIT0gbnVsbCAmJiAoIW1hdGNoZXIubWF0Y2hlcyhzbmlOYW1lKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICBpZiAodHlwZSA9PSBOQU1FX0hPU1RfTkFNRSkgewotICAgICAgICAgICAgICAgIHJldHVybiAiaG9zdF9uYW1lOiAiICsgaG9zdG5hbWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiAidW5rbm93bi0iICsgdHlwZSArICI6ICIgKyBEZWJ1Zy50b1N0cmluZyhkYXRhKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBJcyB0aGUgZXh0ZW5zaW9uIGlzIGlkZW50aWNhbCB0byBhIHNlcnZlciBuYW1lIGxpc3Q/CisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGNoZWNrIHRoZSBzZXJ2ZXIgbmFtZSBpbmRpY2F0aW9uIGR1cmluZyBzZXNzaW9uCisgICAgICogcmVzdW1wdGlvbi4KKyAgICAgKgorICAgICAqIFBlciBSRkMgNjA2Niwgd2hlbiB0aGUgc2VydmVyIGlzIGRlY2lkaW5nIHdoZXRoZXIgb3Igbm90IHRvIGFjY2VwdCBhCisgICAgICogcmVxdWVzdCB0byByZXN1bWUgYSBzZXNzaW9uLCB0aGUgY29udGVudHMgb2YgYSBzZXJ2ZXJfbmFtZSBleHRlbnNpb24KKyAgICAgKiBNQVkgYmUgdXNlZCBpbiB0aGUgbG9va3VwIG9mIHRoZSBzZXNzaW9uIGluIHRoZSBzZXNzaW9uIGNhY2hlLiAgVGhlCisgICAgICogY2xpZW50IFNIT1VMRCBpbmNsdWRlIHRoZSBzYW1lIHNlcnZlcl9uYW1lIGV4dGVuc2lvbiBpbiB0aGUgc2Vzc2lvbgorICAgICAqIHJlc3VtcHRpb24gcmVxdWVzdCBhcyBpdCBkaWQgaW4gdGhlIGZ1bGwgaGFuZHNoYWtlIHRoYXQgZXN0YWJsaXNoZWQKKyAgICAgKiB0aGUgc2Vzc2lvbi4gIEEgc2VydmVyIHRoYXQgaW1wbGVtZW50cyB0aGlzIGV4dGVuc2lvbiBNVVNUIE5PVCBhY2NlcHQKKyAgICAgKiB0aGUgcmVxdWVzdCB0byByZXN1bWUgdGhlIHNlc3Npb24gaWYgdGhlIHNlcnZlcl9uYW1lIGV4dGVuc2lvbiBjb250YWlucworICAgICAqIGEgZGlmZmVyZW50IG5hbWUuICBJbnN0ZWFkLCBpdCBwcm9jZWVkcyB3aXRoIGEgZnVsbCBoYW5kc2hha2UgdG8KKyAgICAgKiBlc3RhYmxpc2ggYSBuZXcgc2Vzc2lvbi4gIFdoZW4gcmVzdW1pbmcgYSBzZXNzaW9uLCB0aGUgc2VydmVyIE1VU1QgTk9UCisgICAgICogaW5jbHVkZSBhIHNlcnZlcl9uYW1lIGV4dGVuc2lvbiBpbiB0aGUgc2VydmVyIGhlbGxvLgorICAgICAqLworICAgIGJvb2xlYW4gaXNJZGVudGljYWwoTGlzdDxTTklTZXJ2ZXJOYW1lPiBvdGhlcikgeworICAgICAgICBpZiAob3RoZXIuc2l6ZSgpID09IHNuaU1hcC5zaXplKCkpIHsKKyAgICAgICAgICAgIGZvcihTTklTZXJ2ZXJOYW1lIHNuaUluT3RoZXIgOiBvdGhlcikgeworICAgICAgICAgICAgICAgIFNOSVNlcnZlck5hbWUgc25pTmFtZSA9IHNuaU1hcC5nZXQoc25pSW5PdGhlci5nZXRUeXBlKCkpOworICAgICAgICAgICAgICAgIGlmIChzbmlOYW1lID09IG51bGwgfHwgIXNuaUluT3RoZXIuZXF1YWxzKHNuaU5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIGludCBsZW5ndGgoKSB7CkBAIC00MDksMjUgKzQ4MSwzNCBAQAogCiAgICAgdm9pZCBzZW5kKEhhbmRzaGFrZU91dFN0cmVhbSBzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBzLnB1dEludDE2KHR5cGUuaWQpOwotICAgICAgICBzLnB1dEludDE2KGxpc3RMZW5ndGggKyAyKTsKLSAgICAgICAgaWYgKGxpc3RMZW5ndGggIT0gMCkgewotICAgICAgICAgICAgcy5wdXRJbnQxNihsaXN0TGVuZ3RoKTsKKyAgICAgICAgaWYgKGxpc3RMZW5ndGggPT0gMCkgeworICAgICAgICAgICAgcy5wdXRJbnQxNihsaXN0TGVuZ3RoKTsgICAgIC8vIGluIFNlcnZlckhlbGxvLCBlbXB0eSBleHRlbnNpb25fZGF0YQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcy5wdXRJbnQxNihsaXN0TGVuZ3RoICsgMik7IC8vIGxlbmd0aCBvZiBleHRlbnNpb25fZGF0YQorICAgICAgICAgICAgcy5wdXRJbnQxNihsaXN0TGVuZ3RoKTsgICAgIC8vIGxlbmd0aCBvZiBTZXJ2ZXJOYW1lTGlzdAogCi0gICAgICAgICAgICBmb3IgKFNlcnZlck5hbWUgbmFtZSA6IG5hbWVzKSB7Ci0gICAgICAgICAgICAgICAgcy5wdXRJbnQ4KG5hbWUudHlwZSk7ICAgICAgICAgICAvLyBOYW1lVHlwZQotICAgICAgICAgICAgICAgIHMucHV0Qnl0ZXMxNihuYW1lLmRhdGEpOyAgICAgICAgLy8gSG9zdE5hbWUKKyAgICAgICAgICAgIGZvciAoU05JU2VydmVyTmFtZSBzbmlOYW1lIDogc25pTWFwLnZhbHVlcygpKSB7CisgICAgICAgICAgICAgICAgcy5wdXRJbnQ4KHNuaU5hbWUuZ2V0VHlwZSgpKTsgICAgICAgICAvLyBzZXJ2ZXIgbmFtZSB0eXBlCisgICAgICAgICAgICAgICAgcy5wdXRCeXRlczE2KHNuaU5hbWUuZ2V0RW5jb2RlZCgpKTsgICAvLyBzZXJ2ZXIgbmFtZSB2YWx1ZQogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgZm9yIChTZXJ2ZXJOYW1lIG5hbWUgOiBuYW1lcykgewotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiWyIgKyBuYW1lICsgIl0iKTsKKyAgICAgICAgZm9yIChTTklTZXJ2ZXJOYW1lIHNuaU5hbWUgOiBzbmlNYXAudmFsdWVzKCkpIHsKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIlsiICsgc25pTmFtZSArICJdIik7CiAgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gIkV4dGVuc2lvbiAiICsgdHlwZSArICIsIHNlcnZlcl9uYW1lOiAiICsgYnVmZmVyOwogICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFVua25vd25TZXJ2ZXJOYW1lIGV4dGVuZHMgU05JU2VydmVyTmFtZSB7CisgICAgICAgIFVua25vd25TZXJ2ZXJOYW1lKGludCBjb2RlLCBieXRlW10gZW5jb2RlZCkgeworICAgICAgICAgICAgc3VwZXIoY29kZSwgZW5jb2RlZCk7CisgICAgICAgIH0KKyAgICB9CisKIH0KIAogZmluYWwgY2xhc3MgU3VwcG9ydGVkRWxsaXB0aWNDdXJ2ZXNFeHRlbnNpb24gZXh0ZW5kcyBIZWxsb0V4dGVuc2lvbiB7CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3NzbC9Qcm90b2NvbExpc3QuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvc3NsL1Byb3RvY29sTGlzdC5qYXZhCmluZGV4IGE1N2E5YmQuLjJhNGJiZWUgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvc3NsL1Byb3RvY29sTGlzdC5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvc3NsL1Byb3RvY29sTGlzdC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAxMSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtNzksNyArNzksNyBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUHJvdG9jb2xzIG1heSBub3QgYmUgbnVsbCIpOwogICAgICAgICB9CiAKLSAgICAgICAgQXJyYXlMaXN0PFByb3RvY29sVmVyc2lvbj4gdmVyc2lvbnMgPSBuZXcgQXJyYXlMaXN0PD4oMyk7CisgICAgICAgIEFycmF5TGlzdDxQcm90b2NvbFZlcnNpb24+IHZlcnNpb25zID0gbmV3IEFycmF5TGlzdDw+KG5hbWVzLmxlbmd0aCk7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKysgKSB7CiAgICAgICAgICAgICBQcm90b2NvbFZlcnNpb24gdmVyc2lvbiA9IFByb3RvY29sVmVyc2lvbi52YWx1ZU9mKG5hbWVzW2ldKTsKICAgICAgICAgICAgIGlmICh2ZXJzaW9ucy5jb250YWlucyh2ZXJzaW9uKSA9PSBmYWxzZSkgewpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS9zc2wvUlNBQ2xpZW50S2V5RXhjaGFuZ2UuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvc3NsL1JTQUNsaWVudEtleUV4Y2hhbmdlLmphdmEKaW5kZXggMWMwZDY5Mi4uMzZmZGE4YyAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS9zc2wvUlNBQ2xpZW50S2V5RXhjaGFuZ2UuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3NzbC9SU0FDbGllbnRLZXlFeGNoYW5nZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMTk5NiwgMjAxMCwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5NiwgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMzYsNiArMzYsNyBAQAogaW1wb3J0IGphdmF4Lm5ldC5zc2wuKjsKIAogaW1wb3J0IHN1bi5zZWN1cml0eS5pbnRlcm5hbC5zcGVjLlRsc1JzYVByZW1hc3RlclNlY3JldFBhcmFtZXRlclNwZWM7CitpbXBvcnQgc3VuLnNlY3VyaXR5LnV0aWwuS2V5TGVuZ3RoOwogCiAvKioKICAqIFRoaXMgaXMgdGhlIGNsaWVudCBrZXkgZXhjaGFuZ2UgbWVzc2FnZSAoQ0xJRU5UIC0tPiBTRVJWRVIpIHVzZWQgd2l0aApAQCAtMTkyLDI2ICsxOTMsMzggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmFibGUgdG8gZ2V0IHRoZSBwbGFpbnRleHQgb2YgdGhlIHByZW1hc3RlciBzZWNyZXQiKTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAvLyBXZSBhcmUgbm90IGFsd2F5cyBhYmxlIHRvIGdldCB0aGUgZW5jb2RlZCBrZXkgb2YgdGhlCi0gICAgICAgICAgICAgICAgLy8gcHJlbWFzdGVyIHNlY3JldC4gUGFzcyB0aGUgY2hla2luZyB0byBtYXN0ZXIgc2VjcmV0CisgICAgICAgICAgICAgICAgaW50IGtleVNpemUgPSBLZXlMZW5ndGguZ2V0S2V5U2l6ZShzZWNyZXRLZXkpOworICAgICAgICAgICAgICAgIGlmIChrZXlTaXplID4gMCAmJiBrZXlTaXplICE9IDM4NCkgeyAgICAgICAvLyAzODQgPSA0OCAqIDgKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRlYnVnICE9IG51bGwgJiYgRGVidWcuaXNPbigiaGFuZHNoYWtlIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5jb3JyZWN0IGxlbmd0aCBvZiBwcmVtYXN0ZXIgc2VjcmV0OiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5U2l6ZS84KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVEdW1teVNlY3JldChjbGllbnRIZWxsb1ZlcnNpb24pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIFRoZSBrZXkgc2l6ZSBpcyBleGFjdGx5IDQ4IGJ5dGVzIG9yIG5vdCBhY2Nlc3NpYmxlLgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gQ29uc2VydmF0aXZlbHksIHBhc3MgdGhlIGNoZWNraW5nIHRvIG1hc3RlciBzZWNyZXQKICAgICAgICAgICAgICAgICAvLyBjYWxjdWxhdGlvbi4KICAgICAgICAgICAgICAgICByZXR1cm4gc2VjcmV0S2V5OwogICAgICAgICAgICAgfSBlbHNlIGlmIChlbmNvZGVkLmxlbmd0aCA9PSA0OCkgewogICAgICAgICAgICAgICAgIC8vIGNoZWNrIHRoZSB2ZXJzaW9uCiAgICAgICAgICAgICAgICAgaWYgKGNsaWVudEhlbGxvVmVyc2lvbi5tYWpvciA9PSBlbmNvZGVkWzBdICYmCiAgICAgICAgICAgICAgICAgICAgIGNsaWVudEhlbGxvVmVyc2lvbi5taW5vciA9PSBlbmNvZGVkWzFdKSB7CisKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlY3JldEtleTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNsaWVudEhlbGxvVmVyc2lvbi52IDw9IFByb3RvY29sVmVyc2lvbi5UTFMxMC52KSB7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjbGllbnRIZWxsb1ZlcnNpb24udiA8PSBQcm90b2NvbFZlcnNpb24uVExTMTAudiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFZlcnNpb24ubWFqb3IgPT0gZW5jb2RlZFswXSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFZlcnNpb24ubWlub3IgPT0gZW5jb2RlZFsxXSkgewogICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgKiB3ZSBuZXZlciBjaGVja2VkIHRoZSBjbGllbnRfdmVyc2lvbiBpbiBzZXJ2ZXIgc2lkZQotICAgICAgICAgICAgICAgICAgICAgKiBmb3IgVExTIHYxLjAgYW5kIFNTTCB2My4wLiBGb3IgY29tcGF0aWJpbGl0eSwgd2UKLSAgICAgICAgICAgICAgICAgICAgICogbWFpbnRhaW4gdGhpcyBiZWhhdmlvci4KKyAgICAgICAgICAgICAgICAgICAgICogRm9yIGNvbXBhdGliaWxpdHksIHdlIG1haW50YWluIHRoZSBiZWhhdmlvciB0aGF0IHRoZQorICAgICAgICAgICAgICAgICAgICAgKiB2ZXJzaW9uIGluIHByZV9tYXN0ZXJfc2VjcmV0IGNhbiBiZSB0aGUgbmVnb3RpYXRlZAorICAgICAgICAgICAgICAgICAgICAgKiB2ZXJzaW9uIGZvciBUTFMgdjEuMCBhbmQgU1NMIHYzLjAuCiAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudFZlcnNpb24ubWFqb3IgPT0gZW5jb2RlZFswXSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFZlcnNpb24ubWlub3IgPT0gZW5jb2RlZFsxXSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm90b2NvbFZlcnNpb24gPSBjdXJyZW50VmVyc2lvbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWNyZXRLZXk7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm90b2NvbFZlcnNpb24gPSBjdXJyZW50VmVyc2lvbjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlY3JldEtleTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBpZiAoZGVidWcgIT0gbnVsbCAmJiBEZWJ1Zy5pc09uKCJoYW5kc2hha2UiKSkgewpAQCAtMjIwLDIyICsyMzMsMjMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICIsIHdoaWxlIFByZU1hc3RlclNlY3JldC5jbGllbnRfdmVyc2lvbiBpcyAiICsKICAgICAgICAgICAgICAgICAgICAgICAgIFByb3RvY29sVmVyc2lvbi52YWx1ZU9mKGVuY29kZWRbMF0sIGVuY29kZWRbMV0pKTsKICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVEdW1teVNlY3JldChjbGllbnRIZWxsb1ZlcnNpb24pOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiAoZGVidWcgIT0gbnVsbCAmJiBEZWJ1Zy5pc09uKCJoYW5kc2hha2UiKSkgewogICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oCiAgICAgICAgICAgICAgICAgICAgICAgICAiaW5jb3JyZWN0IGxlbmd0aCBvZiBwcmVtYXN0ZXIgc2VjcmV0OiAiICsKICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZWQubGVuZ3RoKTsKICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2VuZXJhdGVEdW1teVNlY3JldChjbGllbnRIZWxsb1ZlcnNpb24pOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgaWYgKGRlYnVnICE9IG51bGwgJiYgRGVidWcuaXNPbigiaGFuZHNoYWtlIikpIHsKLSAgICAgICAgICAgIGlmIChmYWlsb3ZlckV4Y2VwdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciBkZWNyeXB0aW5nIHByZW1hc3RlciBzZWNyZXQ6Iik7Ci0gICAgICAgICAgICAgICAgZmFpbG92ZXJFeGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkdlbmVyYXRpbmcgcmFuZG9tIHNlY3JldCIpOworICAgICAgICBpZiAoZGVidWcgIT0gbnVsbCAmJiBEZWJ1Zy5pc09uKCJoYW5kc2hha2UiKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgZmFpbG92ZXJFeGNlcHRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciBkZWNyeXB0aW5nIHByZW1hc3RlciBzZWNyZXQ6Iik7CisgICAgICAgICAgICBmYWlsb3ZlckV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7CiAgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gZ2VuZXJhdGVEdW1teVNlY3JldChjbGllbnRIZWxsb1ZlcnNpb24pOwpAQCAtMjQzLDYgKzI1NywxMCBAQAogCiAgICAgLy8gZ2VuZXJhdGUgYSBwcmVtYXN0ZXIgc2VjcmV0IHdpdGggdGhlIHNwZWNpZmllZCB2ZXJzaW9uIG51bWJlcgogICAgIHN0YXRpYyBTZWNyZXRLZXkgZ2VuZXJhdGVEdW1teVNlY3JldChQcm90b2NvbFZlcnNpb24gdmVyc2lvbikgeworICAgICAgICBpZiAoZGVidWcgIT0gbnVsbCAmJiBEZWJ1Zy5pc09uKCJoYW5kc2hha2UiKSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJHZW5lcmF0aW5nIGEgcmFuZG9tIGZha2UgcHJlbWFzdGVyIHNlY3JldCIpOworICAgICAgICB9CisKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIFN0cmluZyBzID0gKCh2ZXJzaW9uLnYgPj0gUHJvdG9jb2xWZXJzaW9uLlRMUzEyLnYpID8KICAgICAgICAgICAgICAgICAiU3VuVGxzMTJSc2FQcmVtYXN0ZXJTZWNyZXQiIDogIlN1blRsc1JzYVByZW1hc3RlclNlY3JldCIpOwpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS9zc2wvU1NMRW5naW5lSW1wbC5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS9zc2wvU1NMRW5naW5lSW1wbC5qYXZhCmluZGV4IGEzOTZiZjcuLjI2N2JkNTUgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvc3NsL1NTTEVuZ2luZUltcGwuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3NzbC9TU0xFbmdpbmVJbXBsLmphdmEKQEAgLTI3LDYgKzI3LDcgQEAKIAogaW1wb3J0IGphdmEuaW8uKjsKIGltcG9ydCBqYXZhLm5pby4qOworaW1wb3J0IGphdmEudXRpbC4qOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuKjsKIAogaW1wb3J0IGphdmF4LmNyeXB0by5CYWRQYWRkaW5nRXhjZXB0aW9uOwpAQCAtMzQsNyArMzUsNiBAQAogaW1wb3J0IGphdmF4Lm5ldC5zc2wuKjsKIGltcG9ydCBqYXZheC5uZXQuc3NsLlNTTEVuZ2luZVJlc3VsdC4qOwogCi0KIC8qKgogICogSW1wbGVtZW50YXRpb24gb2YgYW4gbm9uLWJsb2NraW5nIFNTTEVuZ2luZS4KICAqCkBAIC0yNTMsNiArMjUzLDEyIEBACiAgICAgLy8gVGhlIGNyeXB0b2dyYXBoaWMgYWxnb3JpdGhtIGNvbnN0cmFpbnRzCiAgICAgcHJpdmF0ZSBBbGdvcml0aG1Db25zdHJhaW50cyAgICAgICAgYWxnb3JpdGhtQ29uc3RyYWludHMgPSBudWxsOwogCisgICAgLy8gVGhlIHNlcnZlciBuYW1lIGluZGljYXRpb24gYW5kIG1hdGNoZXJzCisgICAgTGlzdDxTTklTZXJ2ZXJOYW1lPiAgICAgICAgIHNlcnZlck5hbWVzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLjxTTklTZXJ2ZXJOYW1lPmVtcHR5TGlzdCgpOworICAgIENvbGxlY3Rpb248U05JTWF0Y2hlcj4gICAgICBzbmlNYXRjaGVycyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy48U05JTWF0Y2hlcj5lbXB0eUxpc3QoKTsKKwogICAgIC8vIEhhdmUgd2UgYmVlbiB0b2xkIHdoZXRoZXIgd2UncmUgY2xpZW50IG9yIHNlcnZlcj8KICAgICBwcml2YXRlIGJvb2xlYW4gICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJNb2RlU2V0ID0gZmFsc2U7CiAgICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgICAgICAgICAgICAgcm9sZUlzU2VydmVyOwpAQCAtMzYxLDYgKzM2NywxMCBAQAogICAgICAgICByb2xlSXNTZXJ2ZXIgPSB0cnVlOwogICAgICAgICBjb25uZWN0aW9uU3RhdGUgPSBjc19TVEFSVDsKIAorICAgICAgICAvLyBkZWZhdWx0IHNlcnZlciBuYW1lIGluZGljYXRpb24KKyAgICAgICAgc2VydmVyTmFtZXMgPQorICAgICAgICAgICAgVXRpbGl0aWVzLmFkZFRvU05JU2VydmVyTmFtZUxpc3Qoc2VydmVyTmFtZXMsIGdldFBlZXJIb3N0KCkpOworCiAgICAgICAgIC8qCiAgICAgICAgICAqIGRlZmF1bHQgcmVhZCBhbmQgd3JpdGUgc2lkZSBjaXBoZXIgYW5kIE1BQyBzdXBwb3J0CiAgICAgICAgICAqCkBAIC00NTksMTEgKzQ2OSwxMyBAQAogICAgICAgICAgICAgICAgICAgICBlbmFibGVkUHJvdG9jb2xzLCBkb0NsaWVudEF1dGgsCiAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sVmVyc2lvbiwgY29ubmVjdGlvblN0YXRlID09IGNzX0hBTkRTSEFLRSwKICAgICAgICAgICAgICAgICAgICAgc2VjdXJlUmVuZWdvdGlhdGlvbiwgY2xpZW50VmVyaWZ5RGF0YSwgc2VydmVyVmVyaWZ5RGF0YSk7CisgICAgICAgICAgICBoYW5kc2hha2VyLnNldFNOSU1hdGNoZXJzKHNuaU1hdGNoZXJzKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGhhbmRzaGFrZXIgPSBuZXcgQ2xpZW50SGFuZHNoYWtlcih0aGlzLCBzc2xDb250ZXh0LAogICAgICAgICAgICAgICAgICAgICBlbmFibGVkUHJvdG9jb2xzLAogICAgICAgICAgICAgICAgICAgICBwcm90b2NvbFZlcnNpb24sIGNvbm5lY3Rpb25TdGF0ZSA9PSBjc19IQU5EU0hBS0UsCiAgICAgICAgICAgICAgICAgICAgIHNlY3VyZVJlbmVnb3RpYXRpb24sIGNsaWVudFZlcmlmeURhdGEsIHNlcnZlclZlcmlmeURhdGEpOworICAgICAgICAgICAgaGFuZHNoYWtlci5zZXRTTklTZXJ2ZXJOYW1lcyhzZXJ2ZXJOYW1lcyk7CiAgICAgICAgIH0KICAgICAgICAgaGFuZHNoYWtlci5zZXRFbmFibGVkQ2lwaGVyU3VpdGVzKGVuYWJsZWRDaXBoZXJTdWl0ZXMpOwogICAgICAgICBoYW5kc2hha2VyLnNldEVuYWJsZVNlc3Npb25DcmVhdGlvbihlbmFibGVTZXNzaW9uQ3JlYXRpb24pOwpAQCAtMTEwMCw3ICsxMTEyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgLy8gVExTIHJlcXVpcmVzIHRoYXQgdW5yZWNvZ25pemVkIHJlY29yZHMgYmUgaWdub3JlZC4KICAgICAgICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgICAgICAgaWYgKGRlYnVnICE9IG51bGwgJiYgRGVidWcuaXNPbigic3NsIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih0aHJlYWROYW1lKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCBSZWNlaXZlZCByZWNvcmQgdHlwZTogIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaW5wdXRSZWNvcmQuY29udGVudFR5cGUoKSk7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTEzODQsNyArMTM5Niw3IEBACiAgICAgICAgICAgICAgKiBmb3IgaGFuZHNoYWtpbmcgYW5kIGJhZF9yZWNvcmRfbWFjIGZvciBvdGhlciByZWNvcmRzLgogICAgICAgICAgICAgICovCiAgICAgICAgICAgICBpZiAoZGVidWcgIT0gbnVsbCAmJiBEZWJ1Zy5pc09uKCJzc2wiKSkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih0aHJlYWROYW1lKCkgKworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSArCiAgICAgICAgICAgICAgICAgICAgICIsIHNlcXVlbmNlIG51bWJlciBleHRyZW1lbHkgY2xvc2UgdG8gb3ZlcmZsb3cgIiArCiAgICAgICAgICAgICAgICAgICAgICIoMl42NC0xIHBhY2tldHMpLiBDbG9zaW5nIGNvbm5lY3Rpb24uIik7CiAgICAgICAgICAgICB9CkBAIC0xNDAyLDcgKzE0MTQsOCBAQAogICAgICAgICAgKi8KICAgICAgICAgaWYgKCh0eXBlICE9IFJlY29yZC5jdF9oYW5kc2hha2UpICYmIG1hYy5zZXFOdW1Jc0h1Z2UoKSkgewogICAgICAgICAgICAgaWYgKGRlYnVnICE9IG51bGwgJiYgRGVidWcuaXNPbigic3NsIikpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4odGhyZWFkTmFtZSgpICsgIiwgcmVxdWVzdCByZW5lZ290aWF0aW9uICIgKworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAiLCByZXF1ZXN0IHJlbmVnb3RpYXRpb24gIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAidG8gYXZvaWQgc2VxdWVuY2UgbnVtYmVyIG92ZXJmbG93Iik7CiAgICAgICAgICAgICB9CiAKQEAgLTE0MjAsNyArMTQzMyw4IEBACiAgICAgcHJpdmF0ZSB2b2lkIGNsb3NlT3V0Ym91bmRJbnRlcm5hbCgpIHsKIAogICAgICAgICBpZiAoKGRlYnVnICE9IG51bGwpICYmIERlYnVnLmlzT24oInNzbCIpKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4odGhyZWFkTmFtZSgpICsgIiwgY2xvc2VPdXRib3VuZEludGVybmFsKCkiKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCBjbG9zZU91dGJvdW5kSW50ZXJuYWwoKSIpOwogICAgICAgICB9CiAKICAgICAgICAgLyoKQEAgLTE0NjcsNyArMTQ4MSw4IEBACiAgICAgICAgICAqIER1bXAgb3V0IGEgY2xvc2Vfbm90aWZ5IHRvIHRoZSByZW1vdGUgc2lkZQogICAgICAgICAgKi8KICAgICAgICAgaWYgKChkZWJ1ZyAhPSBudWxsKSAmJiBEZWJ1Zy5pc09uKCJzc2wiKSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHRocmVhZE5hbWUoKSArICIsIGNhbGxlZCBjbG9zZU91dGJvdW5kKCkiKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCBjYWxsZWQgY2xvc2VPdXRib3VuZCgpIik7CiAgICAgICAgIH0KIAogICAgICAgICBjbG9zZU91dGJvdW5kSW50ZXJuYWwoKTsKQEAgLTE0ODcsNyArMTUwMiw4IEBACiAgICAgcHJpdmF0ZSB2b2lkIGNsb3NlSW5ib3VuZEludGVybmFsKCkgewogCiAgICAgICAgIGlmICgoZGVidWcgIT0gbnVsbCkgJiYgRGVidWcuaXNPbigic3NsIikpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih0aHJlYWROYW1lKCkgKyAiLCBjbG9zZUluYm91bmRJbnRlcm5hbCgpIik7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgY2xvc2VJbmJvdW5kSW50ZXJuYWwoKSIpOwogICAgICAgICB9CiAKICAgICAgICAgLyoKQEAgLTE1MTksNyArMTUzNSw4IEBACiAgICAgICAgICAqIHNvbWVkYXkgaW4gdGhlIGZ1dHVyZS4KICAgICAgICAgICovCiAgICAgICAgIGlmICgoZGVidWcgIT0gbnVsbCkgJiYgRGVidWcuaXNPbigic3NsIikpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih0aHJlYWROYW1lKCkgKyAiLCBjYWxsZWQgY2xvc2VJbmJvdW5kKCkiKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCBjYWxsZWQgY2xvc2VJbmJvdW5kKCkiKTsKICAgICAgICAgfQogCiAgICAgICAgIC8qCkBAIC0xNjQyLDcgKzE2NTksNyBAQAogICAgICAgICAgKi8KICAgICAgICAgaWYgKGNsb3NlUmVhc29uICE9IG51bGwpIHsKICAgICAgICAgICAgIGlmICgoZGVidWcgIT0gbnVsbCkgJiYgRGVidWcuaXNPbigic3NsIikpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4odGhyZWFkTmFtZSgpICsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkgKwogICAgICAgICAgICAgICAgICAgICAiLCBmYXRhbDogZW5naW5lIGFscmVhZHkgY2xvc2VkLiAgUmV0aHJvd2luZyAiICsKICAgICAgICAgICAgICAgICAgICAgY2F1c2UudG9TdHJpbmcoKSk7CiAgICAgICAgICAgICB9CkBAIC0xNjU2LDcgKzE2NzMsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKChkZWJ1ZyAhPSBudWxsKSAmJiBEZWJ1Zy5pc09uKCJzc2wiKSkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHRocmVhZE5hbWUoKQorICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGZhdGFsIGVycm9yOiAiICsgZGVzY3JpcHRpb24gKwogICAgICAgICAgICAgICAgICAgICAgICAgIjogIiArIGRpYWdub3N0aWMgKyAiXG4iICsgY2F1c2UudG9TdHJpbmcoKSk7CiAgICAgICAgIH0KQEAgLTE3MjMsNyArMTc0MCw3IEBACiAgICAgICAgIGlmIChkZWJ1ZyAhPSBudWxsICYmIChEZWJ1Zy5pc09uKCJyZWNvcmQiKSB8fAogICAgICAgICAgICAgICAgIERlYnVnLmlzT24oImhhbmRzaGFrZSIpKSkgewogICAgICAgICAgICAgc3luY2hyb25pemVkIChTeXN0ZW0ub3V0KSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCh0aHJlYWROYW1lKCkpOworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkpOwogICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiwgUkVDViAiICsgcHJvdG9jb2xWZXJzaW9uICsgIiBBTEVSVDogICIpOwogICAgICAgICAgICAgICAgIGlmIChsZXZlbCA9PSBBbGVydHMuYWxlcnRfZmF0YWwpIHsKICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiZmF0YWwsICIpOwpAQCAtMTc5MCw3ICsxODA3LDcgQEAKICAgICAgICAgYm9vbGVhbiB1c2VEZWJ1ZyA9IGRlYnVnICE9IG51bGwgJiYgRGVidWcuaXNPbigic3NsIik7CiAgICAgICAgIGlmICh1c2VEZWJ1ZykgewogICAgICAgICAgICAgc3luY2hyb25pemVkIChTeXN0ZW0ub3V0KSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCh0aHJlYWROYW1lKCkpOworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkpOwogICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiwgU0VORCAiICsgcHJvdG9jb2xWZXJzaW9uICsgIiBBTEVSVDogICIpOwogICAgICAgICAgICAgICAgIGlmIChsZXZlbCA9PSBBbGVydHMuYWxlcnRfZmF0YWwpIHsKICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiZmF0YWwsICIpOwpAQCAtMTgxMCw3ICsxODI3LDcgQEAKICAgICAgICAgICAgIHdyaXRlUmVjb3JkKHIpOwogICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICBpZiAodXNlRGVidWcpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4odGhyZWFkTmFtZSgpICsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkgKwogICAgICAgICAgICAgICAgICAgICAiLCBFeGNlcHRpb24gc2VuZGluZyBhbGVydDogIiArIGUpOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xOTQ4LDcgKzE5NjUsNyBAQAogCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBpZiAoZGVidWcgIT0gbnVsbCAmJiBEZWJ1Zy5pc09uKCJzc2wiKSkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih0aHJlYWROYW1lKCkgKworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSArCiAgICAgICAgICAgICAgICAgICAgICIsIHNldFVzZUNsaWVudE1vZGUoKSBpbnZva2VkIGluIHN0YXRlID0gIiArCiAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25TdGF0ZSk7CiAgICAgICAgICAgICB9CkBAIC0yMDUwLDYgKzIwNjcsOCBAQAogICAgICAgICAvLyB0aGUgc3VwZXIgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgaGFuZGxlIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycwogICAgICAgICBwYXJhbXMuc2V0RW5kcG9pbnRJZGVudGlmaWNhdGlvbkFsZ29yaXRobShpZGVudGlmaWNhdGlvblByb3RvY29sKTsKICAgICAgICAgcGFyYW1zLnNldEFsZ29yaXRobUNvbnN0cmFpbnRzKGFsZ29yaXRobUNvbnN0cmFpbnRzKTsKKyAgICAgICAgcGFyYW1zLnNldFNOSU1hdGNoZXJzKHNuaU1hdGNoZXJzKTsKKyAgICAgICAgcGFyYW1zLnNldFNlcnZlck5hbWVzKHNlcnZlck5hbWVzKTsKIAogICAgICAgICByZXR1cm4gcGFyYW1zOwogICAgIH0KQEAgLTIwNjMsMjAgKzIwODIsMjkgQEAKICAgICAgICAgLy8gdGhlIHN1cGVyIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IGhhbmRsZSB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnMKICAgICAgICAgaWRlbnRpZmljYXRpb25Qcm90b2NvbCA9IHBhcmFtcy5nZXRFbmRwb2ludElkZW50aWZpY2F0aW9uQWxnb3JpdGhtKCk7CiAgICAgICAgIGFsZ29yaXRobUNvbnN0cmFpbnRzID0gcGFyYW1zLmdldEFsZ29yaXRobUNvbnN0cmFpbnRzKCk7CisKKyAgICAgICAgTGlzdDxTTklTZXJ2ZXJOYW1lPiBzbmlOYW1lcyA9IHBhcmFtcy5nZXRTZXJ2ZXJOYW1lcygpOworICAgICAgICBpZiAoc25pTmFtZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgc2VydmVyTmFtZXMgPSBzbmlOYW1lczsKKyAgICAgICAgfQorCisgICAgICAgIENvbGxlY3Rpb248U05JTWF0Y2hlcj4gbWF0Y2hlcnMgPSBwYXJhbXMuZ2V0U05JTWF0Y2hlcnMoKTsKKyAgICAgICAgaWYgKG1hdGNoZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNuaU1hdGNoZXJzID0gbWF0Y2hlcnM7CisgICAgICAgIH0KKwogICAgICAgICBpZiAoKGhhbmRzaGFrZXIgIT0gbnVsbCkgJiYgIWhhbmRzaGFrZXIuc3RhcnRlZCgpKSB7CiAgICAgICAgICAgICBoYW5kc2hha2VyLnNldElkZW50aWZpY2F0aW9uUHJvdG9jb2woaWRlbnRpZmljYXRpb25Qcm90b2NvbCk7CiAgICAgICAgICAgICBoYW5kc2hha2VyLnNldEFsZ29yaXRobUNvbnN0cmFpbnRzKGFsZ29yaXRobUNvbnN0cmFpbnRzKTsKKyAgICAgICAgICAgIGlmIChyb2xlSXNTZXJ2ZXIpIHsKKyAgICAgICAgICAgICAgICBoYW5kc2hha2VyLnNldFNOSU1hdGNoZXJzKHNuaU1hdGNoZXJzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaGFuZHNoYWtlci5zZXRTTklTZXJ2ZXJOYW1lcyhzZXJ2ZXJOYW1lcyk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgdGhyZWFkLiBVdGlsaXR5IG1ldGhvZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgdGhyZWFkTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpOwotICAgIH0KLQotICAgIC8qKgogICAgICAqIFJldHVybnMgYSBwcmludGFibGUgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBlbmQgb2YgdGhlIGNvbm5lY3Rpb24uCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvc3NsL1NTTFNlcnZlclNvY2tldEltcGwuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvc3NsL1NTTFNlcnZlclNvY2tldEltcGwuamF2YQppbmRleCBjMjA5OGMxLi4wZGNmMmNkIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3NzbC9TU0xTZXJ2ZXJTb2NrZXRJbXBsLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS9zc2wvU1NMU2VydmVyU29ja2V0SW1wbC5qYXZhCkBAIC0zOSw2ICszOSw3IEBACiBpbXBvcnQgamF2YXgubmV0LnNzbC5TU0xFeGNlcHRpb247CiBpbXBvcnQgamF2YXgubmV0LnNzbC5TU0xTZXJ2ZXJTb2NrZXQ7CiBpbXBvcnQgamF2YXgubmV0LnNzbC5TU0xQYXJhbWV0ZXJzOworaW1wb3J0IGphdmF4Lm5ldC5zc2wuU05JTWF0Y2hlcjsKIAogCiAvKioKQEAgLTkyLDYgKzkzLDEwIEBACiAgICAgLy8gVGhlIGNyeXB0b2dyYXBoaWMgYWxnb3JpdGhtIGNvbnN0cmFpbnRzCiAgICAgcHJpdmF0ZSBBbGdvcml0aG1Db25zdHJhaW50cyAgICBhbGdvcml0aG1Db25zdHJhaW50cyA9IG51bGw7CiAKKyAgICAvLyBUaGUgc2VydmVyIG5hbWUgaW5kaWNhdGlvbgorICAgIENvbGxlY3Rpb248U05JTWF0Y2hlcj4gICAgICBzbmlNYXRjaGVycyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy48U05JTWF0Y2hlcj5lbXB0eUxpc3QoKTsKKwogICAgIC8qKgogICAgICAqIENyZWF0ZSBhbiBTU0wgc2VydmVyIHNvY2tldCBvbiBhIHBvcnQsIHVzaW5nIGEgbm9uLWRlZmF1bHQKICAgICAgKiBhdXRoZW50aWNhdGlvbiBjb250ZXh0IGFuZCBhIHNwZWNpZmllZCBjb25uZWN0aW9uIGJhY2tsb2cuCkBAIC0yODksNiArMjk0LDcgQEAKICAgICAgICAgLy8gdGhlIHN1cGVyIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IGhhbmRsZSB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnMKICAgICAgICAgcGFyYW1zLnNldEVuZHBvaW50SWRlbnRpZmljYXRpb25BbGdvcml0aG0oaWRlbnRpZmljYXRpb25Qcm90b2NvbCk7CiAgICAgICAgIHBhcmFtcy5zZXRBbGdvcml0aG1Db25zdHJhaW50cyhhbGdvcml0aG1Db25zdHJhaW50cyk7CisgICAgICAgIHBhcmFtcy5zZXRTTklNYXRjaGVycyhzbmlNYXRjaGVycyk7CiAKICAgICAgICAgcmV0dXJuIHBhcmFtczsKICAgICB9CkBAIC0zMDIsNiArMzA4LDEwIEBACiAgICAgICAgIC8vIHRoZSBzdXBlciBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBoYW5kbGUgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzCiAgICAgICAgIGlkZW50aWZpY2F0aW9uUHJvdG9jb2wgPSBwYXJhbXMuZ2V0RW5kcG9pbnRJZGVudGlmaWNhdGlvbkFsZ29yaXRobSgpOwogICAgICAgICBhbGdvcml0aG1Db25zdHJhaW50cyA9IHBhcmFtcy5nZXRBbGdvcml0aG1Db25zdHJhaW50cygpOworICAgICAgICBDb2xsZWN0aW9uPFNOSU1hdGNoZXI+IG1hdGNoZXJzID0gcGFyYW1zLmdldFNOSU1hdGNoZXJzKCk7CisgICAgICAgIGlmIChtYXRjaGVycyAhPSBudWxsKSB7CisgICAgICAgICAgICBzbmlNYXRjaGVycyA9IHBhcmFtcy5nZXRTTklNYXRjaGVycygpOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0zMTIsNyArMzIyLDggQEAKICAgICBwdWJsaWMgU29ja2V0IGFjY2VwdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIFNTTFNvY2tldEltcGwgcyA9IG5ldyBTU0xTb2NrZXRJbXBsKHNzbENvbnRleHQsIHVzZVNlcnZlck1vZGUsCiAgICAgICAgICAgICBlbmFibGVkQ2lwaGVyU3VpdGVzLCBkb0NsaWVudEF1dGgsIGVuYWJsZVNlc3Npb25DcmVhdGlvbiwKLSAgICAgICAgICAgIGVuYWJsZWRQcm90b2NvbHMsIGlkZW50aWZpY2F0aW9uUHJvdG9jb2wsIGFsZ29yaXRobUNvbnN0cmFpbnRzKTsKKyAgICAgICAgICAgIGVuYWJsZWRQcm90b2NvbHMsIGlkZW50aWZpY2F0aW9uUHJvdG9jb2wsIGFsZ29yaXRobUNvbnN0cmFpbnRzLAorICAgICAgICAgICAgc25pTWF0Y2hlcnMpOwogCiAgICAgICAgIGltcGxBY2NlcHQocyk7CiAgICAgICAgIHMuZG9uZUNvbm5lY3QoKTsKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvc3NsL1NTTFNlc3Npb25JbXBsLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3NzbC9TU0xTZXNzaW9uSW1wbC5qYXZhCmluZGV4IDExMGZjOWMuLjFjNDU3NWYgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvc3NsL1NTTFNlc3Npb25JbXBsLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS9zc2wvU1NMU2Vzc2lvbkltcGwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTYsIDIwMTEsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTMzLDYgKzMzLDkgQEAKIGltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiAKIGltcG9ydCBqYXZhLnNlY3VyaXR5LlByaW5jaXBhbDsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZhdGVLZXk7CkBAIC01MSw2ICs1NCw3IEBACiBpbXBvcnQgamF2YXgubmV0LnNzbC5TU0xQZXJtaXNzaW9uOwogaW1wb3J0IGphdmF4Lm5ldC5zc2wuU1NMRXhjZXB0aW9uOwogaW1wb3J0IGphdmF4Lm5ldC5zc2wuRXh0ZW5kZWRTU0xTZXNzaW9uOworaW1wb3J0IGphdmF4Lm5ldC5zc2wuU05JU2VydmVyTmFtZTsKIAogaW1wb3J0IGphdmF4LnNlY3VyaXR5LmF1dGgueDUwMC5YNTAwUHJpbmNpcGFsOwogCkBAIC0xMTEsNiArMTE1LDggQEAKICAgICBwcml2YXRlIFByaXZhdGVLZXkgICAgICAgICAgbG9jYWxQcml2YXRlS2V5OwogICAgIHByaXZhdGUgU3RyaW5nW10gICAgICAgICAgICBsb2NhbFN1cHBvcnRlZFNpZ25BbGdzOwogICAgIHByaXZhdGUgU3RyaW5nW10gICAgICAgICAgICBwZWVyU3VwcG9ydGVkU2lnbkFsZ3M7CisgICAgcHJpdmF0ZSBMaXN0PFNOSVNlcnZlck5hbWU+ICAgIHJlcXVlc3RlZFNlcnZlck5hbWVzOworCiAKICAgICAvLyBQcmluY2lwYWxzIGZvciBub24tY2VydGlmaWNhdGUgYmFzZWQgY2lwaGVyIHN1aXRlcwogICAgIHByaXZhdGUgUHJpbmNpcGFsIHBlZXJQcmluY2lwYWw7CkBAIC0yMTIsNiArMjE4LDEwIEBACiAgICAgICAgICAgICBTaWduYXR1cmVBbmRIYXNoQWxnb3JpdGhtLmdldEFsZ29yaXRobU5hbWVzKGFsZ29yaXRobXMpOwogICAgIH0KIAorICAgIHZvaWQgc2V0UmVxdWVzdGVkU2VydmVyTmFtZXMoTGlzdDxTTklTZXJ2ZXJOYW1lPiByZXF1ZXN0ZWRTZXJ2ZXJOYW1lcykgeworICAgICAgICB0aGlzLnJlcXVlc3RlZFNlcnZlck5hbWVzID0gbmV3IEFycmF5TGlzdDw+KHJlcXVlc3RlZFNlcnZlck5hbWVzKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBTZXQgdGhlIHBlZXIgcHJpbmNpcGFsLgogICAgICAqLwpAQCAtNzQ4LDYgKzc1OCw3IEBACiAgICAgICogR2V0cyBhbiBhcnJheSBvZiBzdXBwb3J0ZWQgc2lnbmF0dXJlIGFsZ29yaXRobXMgdGhhdCB0aGUgbG9jYWwgc2lkZSBpcwogICAgICAqIHdpbGxpbmcgdG8gdmVyaWZ5LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRMb2NhbFN1cHBvcnRlZFNpZ25hdHVyZUFsZ29yaXRobXMoKSB7CiAgICAgICAgIGlmIChsb2NhbFN1cHBvcnRlZFNpZ25BbGdzICE9IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiBsb2NhbFN1cHBvcnRlZFNpZ25BbGdzLmNsb25lKCk7CkBAIC03NjAsNiArNzcxLDcgQEAKICAgICAgKiBHZXRzIGFuIGFycmF5IG9mIHN1cHBvcnRlZCBzaWduYXR1cmUgYWxnb3JpdGhtcyB0aGF0IHRoZSBwZWVyIGlzCiAgICAgICogYWJsZSB0byB2ZXJpZnkuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZ1tdIGdldFBlZXJTdXBwb3J0ZWRTaWduYXR1cmVBbGdvcml0aG1zKCkgewogICAgICAgICBpZiAocGVlclN1cHBvcnRlZFNpZ25BbGdzICE9IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiBwZWVyU3VwcG9ydGVkU2lnbkFsZ3MuY2xvbmUoKTsKQEAgLTc2OCw2ICs3ODAsMjAgQEAKICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbMF07CiAgICAgfQogCisgICAgLyoqCisgICAgICogT2J0YWlucyBhIDxjb2RlPkxpc3Q8L2NvZGU+IGNvbnRhaW5pbmcgYWxsIHtAbGluayBTTklTZXJ2ZXJOYW1lfXMKKyAgICAgKiBvZiB0aGUgcmVxdWVzdGVkIFNlcnZlciBOYW1lIEluZGljYXRpb24gKFNOSSkgZXh0ZW5zaW9uLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PFNOSVNlcnZlck5hbWU+IGdldFJlcXVlc3RlZFNlcnZlck5hbWVzKCkgeworICAgICAgICBpZiAocmVxdWVzdGVkU2VydmVyTmFtZXMgIT0gbnVsbCAmJiAhcmVxdWVzdGVkU2VydmVyTmFtZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuPFNOSVNlcnZlck5hbWU+dW5tb2RpZmlhYmxlTGlzdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZFNlcnZlck5hbWVzKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy48U05JU2VydmVyTmFtZT5lbXB0eUxpc3QoKTsKKyAgICB9CisKICAgICAvKiogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIFNTTCBzZXNzaW9uICovCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICAgcmV0dXJuICJbU2Vzc2lvbi0iICsgc2Vzc2lvbkNvdW50CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3NzbC9TU0xTb2NrZXRGYWN0b3J5SW1wbC5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS9zc2wvU1NMU29ja2V0RmFjdG9yeUltcGwuamF2YQppbmRleCAxMzViNDYyLi5kYzYxYjdiIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3NzbC9TU0xTb2NrZXRGYWN0b3J5SW1wbC5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvc3NsL1NTTFNvY2tldEZhY3RvcnlJbXBsLmphdmEKQEAgLTEwOSw2ICsxMDksMTYgQEAKICAgICAgICAgcmV0dXJuIG5ldyBTU0xTb2NrZXRJbXBsKGNvbnRleHQsIHMsIGhvc3QsIHBvcnQsIGF1dG9DbG9zZSk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNvY2tldCBjcmVhdGVTb2NrZXQoU29ja2V0IHMsIElucHV0U3RyZWFtIGNvbnN1bWVkLAorICAgICAgICAgICAgYm9vbGVhbiBhdXRvQ2xvc2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChzID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgInRoZSBleGlzdGluZyBzb2NrZXQgY2Fubm90IGJlIG51bGwiKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBuZXcgU1NMU29ja2V0SW1wbChjb250ZXh0LCBzLCBjb25zdW1lZCwgYXV0b0Nsb3NlKTsKKyAgICB9CiAKICAgICAvKioKICAgICAgKiBDb25zdHJ1Y3RzIGFuIFNTTCBjb25uZWN0aW9uIHRvIGEgc2VydmVyIGF0IGEgc3BlY2lmaWVkIGFkZHJlc3MKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvc3NsL1NTTFNvY2tldEltcGwuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvc3NsL1NTTFNvY2tldEltcGwuamF2YQppbmRleCA0OWFiMzA5Li4yZTI3ZDYyIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3NzbC9TU0xTb2NrZXRJbXBsLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS9zc2wvU1NMU29ja2V0SW1wbC5qYXZhCkBAIC0zNiw5ICszNiw5IEBACiBpbXBvcnQgamF2YS51dGlsLio7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVlbnRyYW50TG9jazsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CiAKIGltcG9ydCBqYXZheC5jcnlwdG8uQmFkUGFkZGluZ0V4Y2VwdGlvbjsKLQogaW1wb3J0IGphdmF4Lm5ldC5zc2wuKjsKIAogLyoqCkBAIC0xOTgsMTQgKzE5OCw2IEBACiAgICAgcHJpdmF0ZSBib29sZWFuICAgICAgICAgICAgIGF1dG9DbG9zZSA9IHRydWU7CiAgICAgcHJpdmF0ZSBBY2Nlc3NDb250cm9sQ29udGV4dCBhY2M7CiAKLSAgICAvKgotICAgICAqIFdlIGNhbm5vdCB1c2UgdGhlIGhvc3RuYW1lIHJlc29sdmVkIGZyb20gbmFtZSBzZXJ2aWNlcy4gIEZvcgotICAgICAqIHZpcnR1YWwgaG9zdGluZywgbXVsdGlwbGUgaG9zdG5hbWVzIG1heSBiZSBib3VuZCB0byB0aGUgc2FtZSBJUAotICAgICAqIGFkZHJlc3MsIHNvIHRoZSBob3N0bmFtZSByZXNvbHZlZCBmcm9tIG5hbWUgc2VydmljZXMgaXMgbm90Ci0gICAgICogcmVsaWFibGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgICAgICAgICAgICAgIHJhd0hvc3RuYW1lOwotCiAgICAgLy8gVGhlIGNpcGhlciBzdWl0ZXMgZW5hYmxlZCBmb3IgdXNlIG9uIHRoaXMgY29ubmVjdGlvbi4KICAgICBwcml2YXRlIENpcGhlclN1aXRlTGlzdCAgICAgZW5hYmxlZENpcGhlclN1aXRlczsKIApAQCAtMjE1LDYgKzIwNywxMiBAQAogICAgIC8vIFRoZSBjcnlwdG9ncmFwaGljIGFsZ29yaXRobSBjb25zdHJhaW50cwogICAgIHByaXZhdGUgQWxnb3JpdGhtQ29uc3RyYWludHMgICAgYWxnb3JpdGhtQ29uc3RyYWludHMgPSBudWxsOwogCisgICAgLy8gVGhlIHNlcnZlciBuYW1lIGluZGljYXRpb24gYW5kIG1hdGNoZXJzCisgICAgTGlzdDxTTklTZXJ2ZXJOYW1lPiAgICAgICAgIHNlcnZlck5hbWVzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLjxTTklTZXJ2ZXJOYW1lPmVtcHR5TGlzdCgpOworICAgIENvbGxlY3Rpb248U05JTWF0Y2hlcj4gICAgICBzbmlNYXRjaGVycyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy48U05JTWF0Y2hlcj5lbXB0eUxpc3QoKTsKKwogICAgIC8qCiAgICAgICogUkVBRCBNRSAqIFJFQUQgTUUgKiBSRUFEIE1FICogUkVBRCBNRSAqIFJFQUQgTUUgKiBSRUFEIE1FICoKICAgICAgKiBJTVBPUlRBTlQgU1RVRkYgVE8gVU5ERVJTVEFORElORyBUSEUgU1lOQ0hST05JWkFUSU9OIElTU1VFUy4KQEAgLTM5Nyw3ICszOTUsOCBAQAogICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBVbmtub3duSG9zdEV4Y2VwdGlvbiB7CiAgICAgICAgIHN1cGVyKCk7CiAgICAgICAgIHRoaXMuaG9zdCA9IGhvc3Q7Ci0gICAgICAgIHRoaXMucmF3SG9zdG5hbWUgPSBob3N0OworICAgICAgICB0aGlzLnNlcnZlck5hbWVzID0KKyAgICAgICAgICAgIFV0aWxpdGllcy5hZGRUb1NOSVNlcnZlck5hbWVMaXN0KHRoaXMuc2VydmVyTmFtZXMsIHRoaXMuaG9zdCk7CiAgICAgICAgIGluaXQoY29udGV4dCwgZmFsc2UpOwogICAgICAgICBTb2NrZXRBZGRyZXNzIHNvY2tldEFkZHJlc3MgPQogICAgICAgICAgICAgICAgaG9zdCAhPSBudWxsID8gbmV3IEluZXRTb2NrZXRBZGRyZXNzKGhvc3QsIHBvcnQpIDoKQEAgLTQ0MCw3ICs0MzksOCBAQAogICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBVbmtub3duSG9zdEV4Y2VwdGlvbiB7CiAgICAgICAgIHN1cGVyKCk7CiAgICAgICAgIHRoaXMuaG9zdCA9IGhvc3Q7Ci0gICAgICAgIHRoaXMucmF3SG9zdG5hbWUgPSBob3N0OworICAgICAgICB0aGlzLnNlcnZlck5hbWVzID0KKyAgICAgICAgICAgIFV0aWxpdGllcy5hZGRUb1NOSVNlcnZlck5hbWVMaXN0KHRoaXMuc2VydmVyTmFtZXMsIHRoaXMuaG9zdCk7CiAgICAgICAgIGluaXQoY29udGV4dCwgZmFsc2UpOwogICAgICAgICBiaW5kKG5ldyBJbmV0U29ja2V0QWRkcmVzcyhsb2NhbEFkZHIsIGxvY2FsUG9ydCkpOwogICAgICAgICBTb2NrZXRBZGRyZXNzIHNvY2tldEFkZHJlc3MgPQpAQCAtNDgyLDEzICs0ODIsMTUgQEAKICAgICAgICAgICAgIENpcGhlclN1aXRlTGlzdCBzdWl0ZXMsIGJ5dGUgY2xpZW50QXV0aCwKICAgICAgICAgICAgIGJvb2xlYW4gc2Vzc2lvbkNyZWF0aW9uLCBQcm90b2NvbExpc3QgcHJvdG9jb2xzLAogICAgICAgICAgICAgU3RyaW5nIGlkZW50aWZpY2F0aW9uUHJvdG9jb2wsCi0gICAgICAgICAgICBBbGdvcml0aG1Db25zdHJhaW50cyBhbGdvcml0aG1Db25zdHJhaW50cykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIEFsZ29yaXRobUNvbnN0cmFpbnRzIGFsZ29yaXRobUNvbnN0cmFpbnRzLAorICAgICAgICAgICAgQ29sbGVjdGlvbjxTTklNYXRjaGVyPiBzbmlNYXRjaGVycykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAogICAgICAgICBzdXBlcigpOwogICAgICAgICBkb0NsaWVudEF1dGggPSBjbGllbnRBdXRoOwogICAgICAgICBlbmFibGVTZXNzaW9uQ3JlYXRpb24gPSBzZXNzaW9uQ3JlYXRpb247CiAgICAgICAgIHRoaXMuaWRlbnRpZmljYXRpb25Qcm90b2NvbCA9IGlkZW50aWZpY2F0aW9uUHJvdG9jb2w7CiAgICAgICAgIHRoaXMuYWxnb3JpdGhtQ29uc3RyYWludHMgPSBhbGdvcml0aG1Db25zdHJhaW50czsKKyAgICAgICAgdGhpcy5zbmlNYXRjaGVycyA9IHNuaU1hdGNoZXJzOwogICAgICAgICBpbml0KGNvbnRleHQsIHNlcnZlck1vZGUpOwogCiAgICAgICAgIC8qCkBAIC01MzUsMTMgKzUzNywzNiBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IFNvY2tldEV4Y2VwdGlvbigiVW5kZXJseWluZyBzb2NrZXQgaXMgbm90IGNvbm5lY3RlZCIpOwogICAgICAgICB9CiAgICAgICAgIHRoaXMuaG9zdCA9IGhvc3Q7Ci0gICAgICAgIHRoaXMucmF3SG9zdG5hbWUgPSBob3N0OworICAgICAgICB0aGlzLnNlcnZlck5hbWVzID0KKyAgICAgICAgICAgIFV0aWxpdGllcy5hZGRUb1NOSVNlcnZlck5hbWVMaXN0KHRoaXMuc2VydmVyTmFtZXMsIHRoaXMuaG9zdCk7CiAgICAgICAgIGluaXQoY29udGV4dCwgZmFsc2UpOwogICAgICAgICB0aGlzLmF1dG9DbG9zZSA9IGF1dG9DbG9zZTsKICAgICAgICAgZG9uZUNvbm5lY3QoKTsKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgc2VydmVyIG1vZGUge0BsaW5rIFNvY2tldH0gbGF5ZXJlZCBvdmVyIGFuCisgICAgICogZXhpc3RpbmcgY29ubmVjdGVkIHNvY2tldCwgYW5kIGlzIGFibGUgdG8gcmVhZCBkYXRhIHdoaWNoIGhhcworICAgICAqIGFscmVhZHkgYmVlbiBjb25zdW1lZC9yZW1vdmVkIGZyb20gdGhlIHtAbGluayBTb2NrZXR9J3MKKyAgICAgKiB1bmRlcmx5aW5nIHtAbGluayBJbnB1dFN0cmVhbX0uCisgICAgICovCisgICAgU1NMU29ja2V0SW1wbChTU0xDb250ZXh0SW1wbCBjb250ZXh0LCBTb2NrZXQgc29jaywKKyAgICAgICAgICAgIElucHV0U3RyZWFtIGNvbnN1bWVkLCBib29sZWFuIGF1dG9DbG9zZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIoc29jaywgY29uc3VtZWQpOworICAgICAgICAvLyBXZSBhbHdheXMgbGF5ZXIgb3ZlciBhIGNvbm5lY3RlZCBzb2NrZXQKKyAgICAgICAgaWYgKCFzb2NrLmlzQ29ubmVjdGVkKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTb2NrZXRFeGNlcHRpb24oIlVuZGVybHlpbmcgc29ja2V0IGlzIG5vdCBjb25uZWN0ZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEluIHNlcnZlciBtb2RlLCBpdCBpcyBub3QgbmVjZXNzYXJ5IHRvIHNldCBob3N0IGFuZCBzZXJ2ZXJOYW1lcy4KKyAgICAgICAgLy8gT3RoZXJ3aXNlLCB3b3VsZCByZXF1aXJlIGEgcmV2ZXJzZSBETlMgbG9va3VwIHRvIGdldCB0aGUgaG9zdG5hbWUuCisKKyAgICAgICAgaW5pdChjb250ZXh0LCB0cnVlKTsKKyAgICAgICAgdGhpcy5hdXRvQ2xvc2UgPSBhdXRvQ2xvc2U7CisgICAgICAgIGRvbmVDb25uZWN0KCk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogSW5pdGlhbGl6ZXMgdGhlIGNsaWVudCBzb2NrZXQuCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIGluaXQoU1NMQ29udGV4dEltcGwgY29udGV4dCwgYm9vbGVhbiBpc1NlcnZlcikgewpAQCAtNjA0LDcgKzYyOSw3IEBACiAgICAgcHVibGljIHZvaWQgY29ubmVjdChTb2NrZXRBZGRyZXNzIGVuZHBvaW50LCBpbnQgdGltZW91dCkKICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAKLSAgICAgICAgaWYgKHNlbGYgIT0gdGhpcykgeworICAgICAgICBpZiAoaXNMYXllcmVkKCkpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBTb2NrZXRFeGNlcHRpb24oIkFscmVhZHkgY29ubmVjdGVkIik7CiAgICAgICAgIH0KIApAQCAtNjI4LDEzICs2NTMsOCBAQAogICAgICAgICAgKiBqYXZhLm5ldCBhY3R1YWxseSBjb25uZWN0cyB1c2luZyB0aGUgc29ja2V0ICJzZWxmIiwgZWxzZQogICAgICAgICAgKiB3ZSBnZXQgc29tZSBwcmV0dHkgYml6YXJyZSBmYWlsdXJlIG1vZGVzLgogICAgICAgICAgKi8KLSAgICAgICAgaWYgKHNlbGYgPT0gdGhpcykgewotICAgICAgICAgICAgc29ja0lucHV0ID0gc3VwZXIuZ2V0SW5wdXRTdHJlYW0oKTsKLSAgICAgICAgICAgIHNvY2tPdXRwdXQgPSBzdXBlci5nZXRPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNvY2tJbnB1dCA9IHNlbGYuZ2V0SW5wdXRTdHJlYW0oKTsKLSAgICAgICAgICAgIHNvY2tPdXRwdXQgPSBzZWxmLmdldE91dHB1dFN0cmVhbSgpOwotICAgICAgICB9CisgICAgICAgIHNvY2tJbnB1dCA9IHN1cGVyLmdldElucHV0U3RyZWFtKCk7CisgICAgICAgIHNvY2tPdXRwdXQgPSBzdXBlci5nZXRPdXRwdXRTdHJlYW0oKTsKIAogICAgICAgICAvKgogICAgICAgICAgKiBNb3ZlIHRvIGhhbmRzaGFraW5nIHN0YXRlLCB3aXRoIHBlbmRpbmcgc2Vzc2lvbiBpbml0aWFsaXplZApAQCAtNzYxLDEzICs3ODEsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvciBsYXllcmVkLCBub24tYXV0b2Nsb3NlIHNvY2tldHMsIHdlIGFyZSBub3QKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFibGUgdG8gYnJpbmcgdGhlbSBpbnRvIGEgdXNhYmxlIHN0YXRlLCBzbyB3ZQogICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJlYXQgaXQgYXMgZmF0YWwgZXJyb3IuCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZiAhPSB0aGlzICYmICFhdXRvQ2xvc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0xheWVyZWQoKSAmJiAhYXV0b0Nsb3NlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRoZSBhbGVydCBkZXNjcmlwdGlvbiBpcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpZmllZCBhcyAtMSwgc28gbm8gbWVzc2FnZSB3aWxsIGJlIHNlbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBwZWVyIGFueW1vcmUuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmF0YWwoKGJ5dGUpKC0xKSwgc3NsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChkZWJ1ZyAhPSBudWxsKSAmJiBEZWJ1Zy5pc09uKCJzc2wiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih0aHJlYWROYW1lKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCByZWNlaXZlZCBFeGNlcHRpb246ICIgKyBzc2xlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KIApAQCAtOTM1LDcgKzk1Niw3IEBACiAgICAgICAgICAgICAgICAgYm9vbGVhbiBoYW5kc2hha2luZyA9IChnZXRDb25uZWN0aW9uU3RhdGUoKSA8PSBjc19IQU5EU0hBS0UpOwogICAgICAgICAgICAgICAgIGJvb2xlYW4gcmV0aHJvdyA9IHJlcXVpcmVDbG9zZU5vdGlmeSB8fCBoYW5kc2hha2luZzsKICAgICAgICAgICAgICAgICBpZiAoKGRlYnVnICE9IG51bGwpICYmIERlYnVnLmlzT24oInNzbCIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih0aHJlYWROYW1lKCkgKworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgIiwgcmVjZWl2ZWQgRU9GRXhjZXB0aW9uOiAiCiAgICAgICAgICAgICAgICAgICAgICAgICArIChyZXRocm93ID8gImVycm9yIiA6ICJpZ25vcmVkIikpOwogICAgICAgICAgICAgICAgIH0KQEAgLTExMTksNyArMTE0MCw3IEBACiAgICAgICAgICAgICAgICAgICAgIC8vIFRMUyByZXF1aXJlcyB0aGF0IHVucmVjb2duaXplZCByZWNvcmRzIGJlIGlnbm9yZWQuCiAgICAgICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1ZyAhPSBudWxsICYmIERlYnVnLmlzT24oInNzbCIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4odGhyZWFkTmFtZSgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgUmVjZWl2ZWQgcmVjb3JkIHR5cGU6ICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHIuY29udGVudFR5cGUoKSk7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTExODMsNyArMTIwNCw3IEBACiAgICAgICAgICAgICAgKiBmb3IgaGFuZHNoYWtpbmcgYW5kIGJhZF9yZWNvcmRfbWFjIGZvciBvdGhlciByZWNvcmRzLgogICAgICAgICAgICAgICovCiAgICAgICAgICAgICBpZiAoZGVidWcgIT0gbnVsbCAmJiBEZWJ1Zy5pc09uKCJzc2wiKSkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih0aHJlYWROYW1lKCkgKworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSArCiAgICAgICAgICAgICAgICAgICAgICIsIHNlcXVlbmNlIG51bWJlciBleHRyZW1lbHkgY2xvc2UgdG8gb3ZlcmZsb3cgIiArCiAgICAgICAgICAgICAgICAgICAgICIoMl42NC0xIHBhY2tldHMpLiBDbG9zaW5nIGNvbm5lY3Rpb24uIik7CiAKQEAgLTEyMDAsNyArMTIyMSw4IEBACiAgICAgICAgICAqLwogICAgICAgICBpZiAoKHR5cGUgIT0gUmVjb3JkLmN0X2hhbmRzaGFrZSkgJiYgbWFjLnNlcU51bUlzSHVnZSgpKSB7CiAgICAgICAgICAgICBpZiAoZGVidWcgIT0gbnVsbCAmJiBEZWJ1Zy5pc09uKCJzc2wiKSkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih0aHJlYWROYW1lKCkgKyAiLCByZXF1ZXN0IHJlbmVnb3RpYXRpb24gIiArCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIsIHJlcXVlc3QgcmVuZWdvdGlhdGlvbiAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICJ0byBhdm9pZCBzZXF1ZW5jZSBudW1iZXIgb3ZlcmZsb3ciKTsKICAgICAgICAgICAgIH0KIApAQCAtMTI3OCwxMSArMTMwMCwxMyBAQAogICAgICAgICAgICAgICAgICAgICBlbmFibGVkUHJvdG9jb2xzLCBkb0NsaWVudEF1dGgsCiAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sVmVyc2lvbiwgY29ubmVjdGlvblN0YXRlID09IGNzX0hBTkRTSEFLRSwKICAgICAgICAgICAgICAgICAgICAgc2VjdXJlUmVuZWdvdGlhdGlvbiwgY2xpZW50VmVyaWZ5RGF0YSwgc2VydmVyVmVyaWZ5RGF0YSk7CisgICAgICAgICAgICBoYW5kc2hha2VyLnNldFNOSU1hdGNoZXJzKHNuaU1hdGNoZXJzKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGhhbmRzaGFrZXIgPSBuZXcgQ2xpZW50SGFuZHNoYWtlcih0aGlzLCBzc2xDb250ZXh0LAogICAgICAgICAgICAgICAgICAgICBlbmFibGVkUHJvdG9jb2xzLAogICAgICAgICAgICAgICAgICAgICBwcm90b2NvbFZlcnNpb24sIGNvbm5lY3Rpb25TdGF0ZSA9PSBjc19IQU5EU0hBS0UsCiAgICAgICAgICAgICAgICAgICAgIHNlY3VyZVJlbmVnb3RpYXRpb24sIGNsaWVudFZlcmlmeURhdGEsIHNlcnZlclZlcmlmeURhdGEpOworICAgICAgICAgICAgaGFuZHNoYWtlci5zZXRTTklTZXJ2ZXJOYW1lcyhzZXJ2ZXJOYW1lcyk7CiAgICAgICAgIH0KICAgICAgICAgaGFuZHNoYWtlci5zZXRFbmFibGVkQ2lwaGVyU3VpdGVzKGVuYWJsZWRDaXBoZXJTdWl0ZXMpOwogICAgICAgICBoYW5kc2hha2VyLnNldEVuYWJsZVNlc3Npb25DcmVhdGlvbihlbmFibGVTZXNzaW9uQ3JlYXRpb24pOwpAQCAtMTUwOSwyNCArMTUzMywyMCBAQAogICAgIHByb3RlY3RlZCB2b2lkIGNsb3NlU29ja2V0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAogICAgICAgICBpZiAoKGRlYnVnICE9IG51bGwpICYmIERlYnVnLmlzT24oInNzbCIpKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4odGhyZWFkTmFtZSgpICsgIiwgY2FsbGVkIGNsb3NlU29ja2V0KCkiKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCBjYWxsZWQgY2xvc2VTb2NrZXQoKSIpOwogICAgICAgICB9Ci0gICAgICAgIGlmIChzZWxmID09IHRoaXMpIHsKLSAgICAgICAgICAgIHN1cGVyLmNsb3NlKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzZWxmLmNsb3NlKCk7Ci0gICAgICAgIH0KKworICAgICAgICBzdXBlci5jbG9zZSgpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBjbG9zZVNvY2tldChib29sZWFuIHNlbGZJbml0aWF0ZWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGlmICgoZGVidWcgIT0gbnVsbCkgJiYgRGVidWcuaXNPbigic3NsIikpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih0aHJlYWROYW1lKCkgKworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpICsKICAgICAgICAgICAgICAgICAiLCBjYWxsZWQgY2xvc2VTb2NrZXQoIiArIHNlbGZJbml0aWF0ZWQgKyAiKSIpOwogICAgICAgICB9Ci0gICAgICAgIGlmIChzZWxmID09IHRoaXMpIHsKKyAgICAgICAgaWYgKCFpc0xheWVyZWQoKSB8fCBhdXRvQ2xvc2UpIHsKICAgICAgICAgICAgIHN1cGVyLmNsb3NlKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoYXV0b0Nsb3NlKSB7Ci0gICAgICAgICAgICBzZWxmLmNsb3NlKCk7CiAgICAgICAgIH0gZWxzZSBpZiAoc2VsZkluaXRpYXRlZCkgewogICAgICAgICAgICAgLy8gbGF5ZXJlZCAmJiBub24tYXV0b2Nsb3NlCiAgICAgICAgICAgICAvLyByZWFkIGNsb3NlX25vdGlmeSBhbGVydCB0byBjbGVhciBpbnB1dCBzdHJlYW0KQEAgLTE1NDksNyArMTU2OSw4IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBpZiAoKGRlYnVnICE9IG51bGwpICYmIERlYnVnLmlzT24oInNzbCIpKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4odGhyZWFkTmFtZSgpICsgIiwgY2FsbGVkIGNsb3NlKCkiKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgY2FsbGVkIGNsb3NlKCkiKTsKICAgICAgICAgfQogICAgICAgICBjbG9zZUludGVybmFsKHRydWUpOyAgLy8gY2FsbGVyIGlzIGluaXRpYXRpbmcgY2xvc2UKICAgICAgICAgc2V0Q29ubmVjdGlvblN0YXRlKGNzX0FQUF9DTE9TRUQpOwpAQCAtMTU2Nyw4ICsxNTg4LDggQEAKICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgY2xvc2VJbnRlcm5hbChib29sZWFuIHNlbGZJbml0aWF0ZWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGlmICgoZGVidWcgIT0gbnVsbCkgJiYgRGVidWcuaXNPbigic3NsIikpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih0aHJlYWROYW1lKCkgKyAiLCBjYWxsZWQgY2xvc2VJbnRlcm5hbCgiCi0gICAgICAgICAgICAgICAgKyBzZWxmSW5pdGlhdGVkICsgIikiKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAiLCBjYWxsZWQgY2xvc2VJbnRlcm5hbCgiICsgc2VsZkluaXRpYXRlZCArICIpIik7CiAgICAgICAgIH0KIAogICAgICAgICBpbnQgc3RhdGUgPSBnZXRDb25uZWN0aW9uU3RhdGUoKTsKQEAgLTE2MzAsNyArMTY1MSw3IEBACiAgICAgICAgICAgICAgICAgLy8gY2xvc2luZyBzaW5jZSBpdCBpcyBhbHJlYWR5IGluIHByb2dyZXNzLgogICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBjc19TRU5UX0NMT1NFKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1ZyAhPSBudWxsICYmIERlYnVnLmlzT24oInNzbCIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4odGhyZWFkTmFtZSgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgY2xvc2UgaW52b2tlZCBhZ2Fpbjsgc3RhdGUgPSAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDb25uZWN0aW9uU3RhdGUoKSk7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTE2NTMsNyArMTY3NCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgaWYgKChkZWJ1ZyAhPSBudWxsKSAmJiBEZWJ1Zy5pc09uKCJzc2wiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHRocmVhZE5hbWUoKSArCisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsIGFmdGVyIHByaW1hcnkgY2xvc2U7IHN0YXRlID0gIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29ubmVjdGlvblN0YXRlKCkpOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC0xNzAxLDcgKzE3MjIsNyBAQAogICAgICAqLwogICAgIHZvaWQgd2FpdEZvckNsb3NlKGJvb2xlYW4gcmV0aHJvdykgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKGRlYnVnICE9IG51bGwgJiYgRGVidWcuaXNPbigic3NsIikpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih0aHJlYWROYW1lKCkgKworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpICsKICAgICAgICAgICAgICAgICAiLCB3YWl0aW5nIGZvciBjbG9zZV9ub3RpZnkgb3IgYWxlcnQ6IHN0YXRlICIKICAgICAgICAgICAgICAgICArIGdldENvbm5lY3Rpb25TdGF0ZSgpKTsKICAgICAgICAgfQpAQCAtMTcyNiw3ICsxNzQ3LDcgQEAKICAgICAgICAgICAgIGlucmVjID0gbnVsbDsKICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICAgaWYgKGRlYnVnICE9IG51bGwgJiYgRGVidWcuaXNPbigic3NsIikpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4odGhyZWFkTmFtZSgpICsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkgKwogICAgICAgICAgICAgICAgICAgICAiLCBFeGNlcHRpb24gd2hpbGUgd2FpdGluZyBmb3IgY2xvc2UgIiArZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAocmV0aHJvdykgewpAQCAtMTc4OCw4ICsxODA5LDggQEAKICAgICBzeW5jaHJvbml6ZWQgcHJpdmF0ZSB2b2lkIGhhbmRsZUV4Y2VwdGlvbihFeGNlcHRpb24gZSwgYm9vbGVhbiByZXN1bWFibGUpCiAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGlmICgoZGVidWcgIT0gbnVsbCkgJiYgRGVidWcuaXNPbigic3NsIikpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih0aHJlYWROYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgaGFuZGxpbmcgZXhjZXB0aW9uOiAiICsgZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAiLCBoYW5kbGluZyBleGNlcHRpb246ICIgKyBlLnRvU3RyaW5nKCkpOwogICAgICAgICB9CiAKICAgICAgICAgLy8gZG9uJ3QgY2xvc2UgdGhlIFNvY2tldCBpbiBjYXNlIG9mIHRpbWVvdXRzIG9yIGludGVycnVwdHMgaWYKQEAgLTE5MzUsNyArMTk1Niw3IEBACiAgICAgICAgIGlmIChkZWJ1ZyAhPSBudWxsICYmIChEZWJ1Zy5pc09uKCJyZWNvcmQiKSB8fAogICAgICAgICAgICAgICAgIERlYnVnLmlzT24oImhhbmRzaGFrZSIpKSkgewogICAgICAgICAgICAgc3luY2hyb25pemVkIChTeXN0ZW0ub3V0KSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCh0aHJlYWROYW1lKCkpOworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkpOwogICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiwgUkVDViAiICsgcHJvdG9jb2xWZXJzaW9uICsgIiBBTEVSVDogICIpOwogICAgICAgICAgICAgICAgIGlmIChsZXZlbCA9PSBBbGVydHMuYWxlcnRfZmF0YWwpIHsKICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiZmF0YWwsICIpOwpAQCAtMjAwMSw3ICsyMDIyLDcgQEAKICAgICAgICAgYm9vbGVhbiB1c2VEZWJ1ZyA9IGRlYnVnICE9IG51bGwgJiYgRGVidWcuaXNPbigic3NsIik7CiAgICAgICAgIGlmICh1c2VEZWJ1ZykgewogICAgICAgICAgICAgc3luY2hyb25pemVkIChTeXN0ZW0ub3V0KSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCh0aHJlYWROYW1lKCkpOworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkpOwogICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiwgU0VORCAiICsgcHJvdG9jb2xWZXJzaW9uICsgIiBBTEVSVDogICIpOwogICAgICAgICAgICAgICAgIGlmIChsZXZlbCA9PSBBbGVydHMuYWxlcnRfZmF0YWwpIHsKICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiZmF0YWwsICIpOwpAQCAtMjAyMSw3ICsyMDQyLDcgQEAKICAgICAgICAgICAgIHdyaXRlUmVjb3JkKHIpOwogICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICBpZiAodXNlRGVidWcpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4odGhyZWFkTmFtZSgpICsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkgKwogICAgICAgICAgICAgICAgICAgICAiLCBFeGNlcHRpb24gc2VuZGluZyBhbGVydDogIiArIGUpOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0yMTE4LDE0ICsyMTM5LDE1IEBACiAgICAgICAgIHJldHVybiBob3N0OwogICAgIH0KIAotICAgIHN5bmNocm9uaXplZCBTdHJpbmcgZ2V0UmF3SG9zdG5hbWUoKSB7Ci0gICAgICAgIHJldHVybiByYXdIb3N0bmFtZTsKLSAgICB9Ci0KICAgICAvLyBPTkxZIHVzZWQgYnkgSHR0cHNDbGllbnQgdG8gc2V0dXAgdGhlIFVSSSBzcGVjaWZpZWQgaG9zdG5hbWUKKyAgICAvLworICAgIC8vIFBsZWFzZSBOT1RFIHRoYXQgdGhpcyBtZXRob2QgTVVTVCBiZSBjYWxsZWQgYmVmb3JlIGNhbGxpbmcgdG8KKyAgICAvLyBTU0xTb2NrZXQuc2V0U1NMUGFyYW1ldGVycygpLiBPdGhlcndpc2UsIHRoZSB7QGNvZGUgaG9zdH0gcGFyYW1ldGVyCisgICAgLy8gbWF5IG92ZXJyaWRlIFNOSUhvc3ROYW1lIGluIHRoZSBjdXN0b21pemVkIHNlcnZlciBuYW1lIGluZGljYXRpb24uCiAgICAgc3luY2hyb25pemVkIHB1YmxpYyB2b2lkIHNldEhvc3QoU3RyaW5nIGhvc3QpIHsKICAgICAgICAgdGhpcy5ob3N0ID0gaG9zdDsKLSAgICAgICAgdGhpcy5yYXdIb3N0bmFtZSA9IGhvc3Q7CisgICAgICAgIHRoaXMuc2VydmVyTmFtZXMgPQorICAgICAgICAgICAgVXRpbGl0aWVzLmFkZFRvU05JU2VydmVyTmFtZUxpc3QodGhpcy5zZXJ2ZXJOYW1lcywgdGhpcy5ob3N0KTsKICAgICB9CiAKICAgICAvKioKQEAgLTIxODYsNyArMjIwOCw3IEBACiAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgLy8gaGFuZHNoYWtlIGZhaWxlZC4gbG9nIGFuZCByZXR1cm4gYSBudWxsU2Vzc2lvbgogICAgICAgICAgICAgICAgIGlmIChkZWJ1ZyAhPSBudWxsICYmIERlYnVnLmlzT24oImhhbmRzaGFrZSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHRocmVhZE5hbWUoKSArCisgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgSU9FeGNlcHRpb24gaW4gZ2V0U2Vzc2lvbigpOiAgIiArIGUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTIzMjgsNyArMjM1MCw3IEBACiAKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIGlmIChkZWJ1ZyAhPSBudWxsICYmIERlYnVnLmlzT24oInNzbCIpKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHRocmVhZE5hbWUoKSArCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpICsKICAgICAgICAgICAgICAgICAgICAgIiwgc2V0VXNlQ2xpZW50TW9kZSgpIGludm9rZWQgaW4gc3RhdGUgPSAiICsKICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvblN0YXRlKTsKICAgICAgICAgICAgIH0KQEAgLTI0MjIsMTQgKzI0NDQsMTEgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRTb1RpbWVvdXQoaW50IHRpbWVvdXQpIHRocm93cyBTb2NrZXRFeGNlcHRpb24gewogICAgICAgICBpZiAoKGRlYnVnICE9IG51bGwpICYmIERlYnVnLmlzT24oInNzbCIpKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4odGhyZWFkTmFtZSgpICsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSArCiAgICAgICAgICAgICAgICAgIiwgc2V0U29UaW1lb3V0KCIgKyB0aW1lb3V0ICsgIikgY2FsbGVkIik7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHNlbGYgPT0gdGhpcykgewotICAgICAgICAgICAgc3VwZXIuc2V0U29UaW1lb3V0KHRpbWVvdXQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2VsZi5zZXRTb1RpbWVvdXQodGltZW91dCk7Ci0gICAgICAgIH0KKworICAgICAgICBzdXBlci5zZXRTb1RpbWVvdXQodGltZW91dCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yNDc0LDYgKzI0OTMsOCBAQAogICAgICAgICAvLyB0aGUgc3VwZXIgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgaGFuZGxlIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycwogICAgICAgICBwYXJhbXMuc2V0RW5kcG9pbnRJZGVudGlmaWNhdGlvbkFsZ29yaXRobShpZGVudGlmaWNhdGlvblByb3RvY29sKTsKICAgICAgICAgcGFyYW1zLnNldEFsZ29yaXRobUNvbnN0cmFpbnRzKGFsZ29yaXRobUNvbnN0cmFpbnRzKTsKKyAgICAgICAgcGFyYW1zLnNldFNOSU1hdGNoZXJzKHNuaU1hdGNoZXJzKTsKKyAgICAgICAgcGFyYW1zLnNldFNlcnZlck5hbWVzKHNlcnZlck5hbWVzKTsKIAogICAgICAgICByZXR1cm4gcGFyYW1zOwogICAgIH0KQEAgLTI0ODcsOSArMjUwOCwyNSBAQAogICAgICAgICAvLyB0aGUgc3VwZXIgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgaGFuZGxlIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycwogICAgICAgICBpZGVudGlmaWNhdGlvblByb3RvY29sID0gcGFyYW1zLmdldEVuZHBvaW50SWRlbnRpZmljYXRpb25BbGdvcml0aG0oKTsKICAgICAgICAgYWxnb3JpdGhtQ29uc3RyYWludHMgPSBwYXJhbXMuZ2V0QWxnb3JpdGhtQ29uc3RyYWludHMoKTsKKworICAgICAgICBMaXN0PFNOSVNlcnZlck5hbWU+IHNuaU5hbWVzID0gcGFyYW1zLmdldFNlcnZlck5hbWVzKCk7CisgICAgICAgIGlmIChzbmlOYW1lcyAhPSBudWxsKSB7CisgICAgICAgICAgICBzZXJ2ZXJOYW1lcyA9IHNuaU5hbWVzOworICAgICAgICB9CisKKyAgICAgICAgQ29sbGVjdGlvbjxTTklNYXRjaGVyPiBtYXRjaGVycyA9IHBhcmFtcy5nZXRTTklNYXRjaGVycygpOworICAgICAgICBpZiAobWF0Y2hlcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgc25pTWF0Y2hlcnMgPSBtYXRjaGVyczsKKyAgICAgICAgfQorCiAgICAgICAgIGlmICgoaGFuZHNoYWtlciAhPSBudWxsKSAmJiAhaGFuZHNoYWtlci5zdGFydGVkKCkpIHsKICAgICAgICAgICAgIGhhbmRzaGFrZXIuc2V0SWRlbnRpZmljYXRpb25Qcm90b2NvbChpZGVudGlmaWNhdGlvblByb3RvY29sKTsKICAgICAgICAgICAgIGhhbmRzaGFrZXIuc2V0QWxnb3JpdGhtQ29uc3RyYWludHMoYWxnb3JpdGhtQ29uc3RyYWludHMpOworICAgICAgICAgICAgaWYgKHJvbGVJc1NlcnZlcikgeworICAgICAgICAgICAgICAgIGhhbmRzaGFrZXIuc2V0U05JTWF0Y2hlcnMoc25pTWF0Y2hlcnMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBoYW5kc2hha2VyLnNldFNOSVNlcnZlck5hbWVzKHNlcnZlck5hbWVzKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtMjUzMSwxMyArMjU2OCw2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IHRocmVhZC4gVXRpbGl0eSBtZXRob2QuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRocmVhZE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICAvKioKICAgICAgKiBSZXR1cm5zIGEgcHJpbnRhYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgZW5kIG9mIHRoZSBjb25uZWN0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CkBAIC0yNTQ4LDExICsyNTc4LDcgQEAKICAgICAgICAgcmV0dmFsLmFwcGVuZChzZXNzLmdldENpcGhlclN1aXRlKCkpOwogICAgICAgICByZXR2YWwuYXBwZW5kKCI6ICIpOwogCi0gICAgICAgIGlmIChzZWxmID09IHRoaXMpIHsKLSAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoc3VwZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR2YWwuYXBwZW5kKHNlbGYudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KKyAgICAgICAgcmV0dmFsLmFwcGVuZChzdXBlci50b1N0cmluZygpKTsKICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXSIpOwogCiAgICAgICAgIHJldHVybiByZXR2YWwudG9TdHJpbmcoKTsKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvc3NsL1NlcnZlckhhbmRzaGFrZXIuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvc3NsL1NlcnZlckhhbmRzaGFrZXIuamF2YQppbmRleCA4YjEwZjhhLi40NzU3NDZlIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3NzbC9TZXJ2ZXJIYW5kc2hha2VyLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS9zc2wvU2VydmVySGFuZHNoYWtlci5qYXZhCkBAIC0yNzYsNiArMjc2LDE4IEBACiAgICAgICAgICAgICBtZXNnLnByaW50KFN5c3RlbS5vdXQpOwogICAgICAgICB9CiAKKyAgICAgICAgLy8gY2hlY2sgdGhlIHNlcnZlciBuYW1lIGluZGljYXRpb24gaWYgcmVxdWlyZWQKKyAgICAgICAgU2VydmVyTmFtZUV4dGVuc2lvbiBjbGllbnRIZWxsb1NOSUV4dCA9IChTZXJ2ZXJOYW1lRXh0ZW5zaW9uKQorICAgICAgICAgICAgICAgICAgICBtZXNnLmV4dGVuc2lvbnMuZ2V0KEV4dGVuc2lvblR5cGUuRVhUX1NFUlZFUl9OQU1FKTsKKyAgICAgICAgaWYgKCFzbmlNYXRjaGVycy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIC8vIHdlIGRvIG5vdCByZWplY3QgY2xpZW50IHdpdGhvdXQgU05JIGV4dGVuc2lvbgorICAgICAgICAgICAgaWYgKGNsaWVudEhlbGxvU05JRXh0ICE9IG51bGwgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICFjbGllbnRIZWxsb1NOSUV4dC5pc01hdGNoZWQoc25pTWF0Y2hlcnMpKSB7CisgICAgICAgICAgICAgICAgZmF0YWxTRShBbGVydHMuYWxlcnRfdW5yZWNvZ25pemVkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICJVbnJlY29nbml6ZWQgc2VydmVyIG5hbWUgaW5kaWNhdGlvbiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICAgICAgLy8gRG9lcyB0aGUgbWVzc2FnZSBpbmNsdWRlIHNlY3VyaXR5IHJlbmVnb3RpYXRpb24gaW5kaWNhdGlvbj8KICAgICAgICAgYm9vbGVhbiByZW5lZ290aWF0aW9uSW5kaWNhdGVkID0gZmFsc2U7CiAKQEAgLTQ3NCw2ICs0ODYsMjYgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgICAgIC8vIGNhbm5vdCByZXN1bWUgc2Vzc2lvbiB3aXRoIGRpZmZlcmVudCBzZXJ2ZXIgbmFtZSBpbmRpY2F0aW9uCisgICAgICAgICAgICAgICAgaWYgKHJlc3VtaW5nU2Vzc2lvbikgeworICAgICAgICAgICAgICAgICAgICBMaXN0PFNOSVNlcnZlck5hbWU+IG9sZFNlcnZlck5hbWVzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91cy5nZXRSZXF1ZXN0ZWRTZXJ2ZXJOYW1lcygpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpZW50SGVsbG9TTklFeHQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjbGllbnRIZWxsb1NOSUV4dC5pc0lkZW50aWNhbChvbGRTZXJ2ZXJOYW1lcykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bWluZ1Nlc3Npb24gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghb2xkU2VydmVyTmFtZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bWluZ1Nlc3Npb24gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICghcmVzdW1pbmdTZXNzaW9uICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWcgIT0gbnVsbCAmJiBEZWJ1Zy5pc09uKCJoYW5kc2hha2UiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgcmVxdWVzdGVkIHNlcnZlciBuYW1lIGluZGljYXRpb24gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlzIG5vdCBpZGVudGljYWwgdG8gdGhlIHByZXZpb3VzIG9uZSIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgaWYgKHJlc3VtaW5nU2Vzc2lvbiAmJgogICAgICAgICAgICAgICAgICAgICAgICAgKGRvQ2xpZW50QXV0aCA9PSBTU0xFbmdpbmVJbXBsLmNsYXV0aF9yZXF1aXJlZCkpIHsKICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKQEAgLTYxMyw2ICs2NDUsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgLy8gYWxnb3JpdGhtcyBpbiBjaG9vc2VDaXBoZXJTdWl0ZSgpCiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIC8vIHNldCB0aGUgc2VydmVyIG5hbWUgaW5kaWNhdGlvbiBpbiB0aGUgc2Vzc2lvbgorICAgICAgICAgICAgTGlzdDxTTklTZXJ2ZXJOYW1lPiBjbGllbnRIZWxsb1NOSSA9CisgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLjxTTklTZXJ2ZXJOYW1lPmVtcHR5TGlzdCgpOworICAgICAgICAgICAgaWYgKGNsaWVudEhlbGxvU05JRXh0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjbGllbnRIZWxsb1NOSSA9IGNsaWVudEhlbGxvU05JRXh0LmdldFNlcnZlck5hbWVzKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXNzaW9uLnNldFJlcXVlc3RlZFNlcnZlck5hbWVzKGNsaWVudEhlbGxvU05JKTsKKwogICAgICAgICAgICAgLy8gc2V0IHRoZSBoYW5kc2hha2Ugc2Vzc2lvbgogICAgICAgICAgICAgc2V0SGFuZHNoYWtlU2Vzc2lvblNFKHNlc3Npb24pOwogCkBAIC02NTQsNiArNjk0LDE1IEBACiAgICAgICAgICAgICBtMS5leHRlbnNpb25zLmFkZChzZXJ2ZXJIZWxsb1JJKTsKICAgICAgICAgfQogCisgICAgICAgIGlmICghc25pTWF0Y2hlcnMuaXNFbXB0eSgpICYmIGNsaWVudEhlbGxvU05JRXh0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIFdoZW4gcmVzdW1pbmcgYSBzZXNzaW9uLCB0aGUgc2VydmVyIE1VU1QgTk9UIGluY2x1ZGUgYQorICAgICAgICAgICAgLy8gc2VydmVyX25hbWUgZXh0ZW5zaW9uIGluIHRoZSBzZXJ2ZXIgaGVsbG8uCisgICAgICAgICAgICBpZiAoIXJlc3VtaW5nU2Vzc2lvbikgeworICAgICAgICAgICAgICAgIFNlcnZlck5hbWVFeHRlbnNpb24gc2VydmVySGVsbG9TTkkgPSBuZXcgU2VydmVyTmFtZUV4dGVuc2lvbigpOworICAgICAgICAgICAgICAgIG0xLmV4dGVuc2lvbnMuYWRkKHNlcnZlckhlbGxvU05JKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgICAgIGlmIChkZWJ1ZyAhPSBudWxsICYmIERlYnVnLmlzT24oImhhbmRzaGFrZSIpKSB7CiAgICAgICAgICAgICBtMS5wcmludChTeXN0ZW0ub3V0KTsKICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ2lwaGVyIHN1aXRlOiAgIiArIHNlc3Npb24uZ2V0U3VpdGUoKSk7CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3NzbC9TdW5KU1NFLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3NzbC9TdW5KU1NFLmphdmEKaW5kZXggMTZjYjM1Yy4uNjk0NjA2MyAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS9zc2wvU3VuSlNTRS5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvc3NsL1N1bkpTU0UuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTksIDIwMTEsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTksIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTEwMyw3ICsxMDMsNyBAQAogCiAgICAgLy8gc3RhbmRhcmQgY29uc3RydWN0b3IKICAgICBwcm90ZWN0ZWQgU3VuSlNTRSgpIHsKLSAgICAgICAgc3VwZXIoIlN1bkpTU0UiLCAxLjdkLCBpbmZvKTsKKyAgICAgICAgc3VwZXIoIlN1bkpTU0UiLCAxLjhkLCBpbmZvKTsKICAgICAgICAgc3ViY2xhc3NDaGVjaygpOwogICAgICAgICBpZiAoQm9vbGVhbi5UUlVFLmVxdWFscyhmaXBzKSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IFByb3ZpZGVyRXhjZXB0aW9uCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3NzbC9VdGlsaXRpZXMuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvc3NsL1V0aWxpdGllcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlZmIwMmMKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3NzbC9VdGlsaXRpZXMuamF2YQpAQCAtMCwwICsxLDExNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgT3JhY2xlIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCisgKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CisgKiBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBzdW4uc2VjdXJpdHkuc3NsOworCitpbXBvcnQgamF2YXgubmV0LnNzbC4qOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IHN1bi5uZXQudXRpbC5JUEFkZHJlc3NVdGlsOworCisvKioKKyAqIEEgdXRpbGl0eSBjbGFzcyB0byBzaGFyZSB0aGUgc3RhdGljIG1ldGhvZHMuCisgKi8KK2ZpbmFsIGNsYXNzIFV0aWxpdGllcyB7CisgICAgLyoqCisgICAgICogUHV0cyB7QGNvZGUgaG9zdG5hbWV9IGludG8gdGhlIHtAY29kZSBzZXJ2ZXJOYW1lc30gbGlzdC4KKyAgICAgKiA8UD4KKyAgICAgKiBJZiB0aGUge0Bjb2RlIHNlcnZlck5hbWVzfSBkb2VzIG5vdCBsb29rIGxpa2UgYSBsZWdhbCBGUUROLCBpdCB3aWxsCisgICAgICogbm90IGJlIHB1dCBpbnRvIHRoZSByZXR1cm5lZCBsaXN0LgorICAgICAqIDxQPgorICAgICAqIE5vdGUgdGhhdCB0aGUgcmV0dXJuZWQgbGlzdCBkb2VzIG5vdCBhbGxvdyBkdXBsaWNhdGVkIG5hbWUgdHlwZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIHtAbGluayBTTklTZXJ2ZXJOYW1lfQorICAgICAqLworICAgIHN0YXRpYyBMaXN0PFNOSVNlcnZlck5hbWU+IGFkZFRvU05JU2VydmVyTmFtZUxpc3QoCisgICAgICAgICAgICBMaXN0PFNOSVNlcnZlck5hbWU+IHNlcnZlck5hbWVzLCBTdHJpbmcgaG9zdG5hbWUpIHsKKworICAgICAgICBTTklIb3N0TmFtZSBzbmlIb3N0TmFtZSA9IHJhd1RvU05JSG9zdE5hbWUoaG9zdG5hbWUpOworICAgICAgICBpZiAoc25pSG9zdE5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHNlcnZlck5hbWVzOworICAgICAgICB9CisKKyAgICAgICAgaW50IHNpemUgPSBzZXJ2ZXJOYW1lcy5zaXplKCk7CisgICAgICAgIExpc3Q8U05JU2VydmVyTmFtZT4gc25pTGlzdCA9IChzaXplICE9IDApID8KKyAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PFNOSVNlcnZlck5hbWU+KHNlcnZlck5hbWVzKSA6CisgICAgICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxTTklTZXJ2ZXJOYW1lPigxKTsKKworICAgICAgICBib29sZWFuIHJlc2V0ID0gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBTTklTZXJ2ZXJOYW1lIHNlcnZlck5hbWUgPSBzbmlMaXN0LmdldChpKTsKKyAgICAgICAgICAgIGlmIChzZXJ2ZXJOYW1lLmdldFR5cGUoKSA9PSBTdGFuZGFyZENvbnN0YW50cy5TTklfSE9TVF9OQU1FKSB7CisgICAgICAgICAgICAgICAgc25pTGlzdC5zZXQoaSwgc25pSG9zdE5hbWUpOworICAgICAgICAgICAgICAgIGlmIChEZWJ1Zy5pc09uKCJzc2wiKSkgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgIiwgdGhlIHByZXZpb3VzIHNlcnZlciBuYW1lIGluIFNOSSAoIiArIHNlcnZlck5hbWUgKworICAgICAgICAgICAgICAgICAgICAgICAgIikgd2FzIHJlcGxhY2VkIHdpdGggKCIgKyBzbmlIb3N0TmFtZSArICIpIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlc2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghcmVzZXQpIHsKKyAgICAgICAgICAgIHNuaUxpc3QuYWRkKHNuaUhvc3ROYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy48U05JU2VydmVyTmFtZT51bm1vZGlmaWFibGVMaXN0KHNuaUxpc3QpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnRzIHN0cmluZyBob3N0bmFtZSB0byB7QGNvZGUgU05JSG9zdE5hbWV9LgorICAgICAqIDxQPgorICAgICAqIE5vdGUgdGhhdCB0byBjaGVjayB3aGV0aGVyIGEgaG9zdG5hbWUgaXMgYSB2YWxpZCBkb21haW4gbmFtZSwgd2UgY2Fubm90CisgICAgICogdXNlIHRoZSBob3N0bmFtZSByZXNvbHZlZCBmcm9tIG5hbWUgc2VydmljZXMuICBGb3IgdmlydHVhbCBob3N0aW5nLAorICAgICAqIG11bHRpcGxlIGhvc3RuYW1lcyBtYXkgYmUgYm91bmQgdG8gdGhlIHNhbWUgSVAgYWRkcmVzcywgc28gdGhlIGhvc3RuYW1lCisgICAgICogcmVzb2x2ZWQgZnJvbSBuYW1lIHNlcnZpY2VzIGlzIG5vdCBhbHdheXMgcmVsaWFibGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gIGhvc3RuYW1lCisgICAgICogICAgICAgICB0aGUgcmF3IGhvc3RuYW1lCisgICAgICogQHJldHVybiBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgU05JSG9zdE5hbWV9LCBvciBudWxsIGlmIHRoZSBob3N0bmFtZSBkb2VzCisgICAgICogICAgICAgICBub3QgbG9vayBsaWtlIGEgRlFETgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFNOSUhvc3ROYW1lIHJhd1RvU05JSG9zdE5hbWUoU3RyaW5nIGhvc3RuYW1lKSB7CisgICAgICAgIFNOSUhvc3ROYW1lIHNuaUhvc3ROYW1lID0gbnVsbDsKKyAgICAgICAgaWYgKGhvc3RuYW1lICE9IG51bGwgJiYgaG9zdG5hbWUuaW5kZXhPZignLicpID4gMCAmJgorICAgICAgICAgICAgICAgICFob3N0bmFtZS5lbmRzV2l0aCgiLiIpICYmCisgICAgICAgICAgICAgICAgIUlQQWRkcmVzc1V0aWwuaXNJUHY0TGl0ZXJhbEFkZHJlc3MoaG9zdG5hbWUpICYmCisgICAgICAgICAgICAgICAgIUlQQWRkcmVzc1V0aWwuaXNJUHY2TGl0ZXJhbEFkZHJlc3MoaG9zdG5hbWUpKSB7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc25pSG9zdE5hbWUgPSBuZXcgU05JSG9zdE5hbWUoaG9zdG5hbWUpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlhZSkgeworICAgICAgICAgICAgICAgIC8vIGRvbid0IGJvdGhlciB0byBoYW5kbGUgaWxsZWdhbCBob3N0X25hbWUKKyAgICAgICAgICAgICAgICBpZiAoRGVidWcuaXNPbigic3NsIikpIHsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIsIFwiIiArIGhvc3RuYW1lICsgIlwiICIgKworICAgICAgICAgICAgICAgICAgICAgICAgImlzIG5vdCBhIGxlZ2FsIEhvc3ROYW1lIGZvciAgc2VydmVyIG5hbWUgaW5kaWNhdGlvbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzbmlIb3N0TmFtZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3NzbC9YNTA5S2V5TWFuYWdlckltcGwuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvc3NsL1g1MDlLZXlNYW5hZ2VySW1wbC5qYXZhCmluZGV4IDQ1ZTZjOTkuLjRiOGExMDEgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvc3NsL1g1MDlLZXlNYW5hZ2VySW1wbC5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvc3NsL1g1MDlLZXlNYW5hZ2VySW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAxMSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMTI4LDEzICsxMjgsMzUgQEAKICAgICBwdWJsaWMgU3RyaW5nIGNob29zZVNlcnZlckFsaWFzKFN0cmluZyBrZXlUeXBlLAogICAgICAgICAgICAgUHJpbmNpcGFsW10gaXNzdWVycywgU29ja2V0IHNvY2tldCkgewogICAgICAgICByZXR1cm4gY2hvb3NlQWxpYXMoZ2V0S2V5VHlwZXMoa2V5VHlwZSksIGlzc3VlcnMsIENoZWNrVHlwZS5TRVJWRVIsCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRBbGdvcml0aG1Db25zdHJhaW50cyhzb2NrZXQpKTsKKyAgICAgICAgICAgIGdldEFsZ29yaXRobUNvbnN0cmFpbnRzKHNvY2tldCksCisgICAgICAgICAgICBYNTA5VHJ1c3RNYW5hZ2VySW1wbC5nZXRSZXF1ZXN0ZWRTZXJ2ZXJOYW1lcyhzb2NrZXQpLAorICAgICAgICAgICAgIkhUVFBTIik7ICAgIC8vIFRoZSBTTkkgSG9zdE5hbWUgaXMgYSBmdWxseSBxdWFsaWZpZWQgZG9tYWluIG5hbWUuCisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGNlcnRpZmljYXRlIHNlbGVjdGlvbiBzY2hlbWUgZm9yIFNOSSBIb3N0TmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHNpbWlsYXIgdG8gSFRUUFMgZW5kcG9pbnQgaWRlbnRpZmljYXRpb24gc2NoZW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW1wbGVtZW50ZWQgaW4gdGhpcyBwcm92aWRlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVzaW5nIEhUVFBTIGVuZHBvaW50IGlkZW50aWZpY2F0aW9uIHNjaGVtZSB0byBndWlkZQorICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzZWxlY3Rpb24gb2YgYW4gYXBwcm9wcmlhdGUgYXV0aGVudGljYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjZXJ0aWZpY2F0ZSBhY2NvcmRpbmcgdG8gcmVxdWVzdGVkIFNOSSBleHRlbnNpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJdCBpcyBub3QgYSByZWFsbHkgSFRUUFMgZW5kcG9pbnQgaWRlbnRpZmljYXRpb24uCiAgICAgfQogCiAgICAgcHVibGljIFN0cmluZyBjaG9vc2VFbmdpbmVTZXJ2ZXJBbGlhcyhTdHJpbmcga2V5VHlwZSwKICAgICAgICAgICAgIFByaW5jaXBhbFtdIGlzc3VlcnMsIFNTTEVuZ2luZSBlbmdpbmUpIHsKICAgICAgICAgcmV0dXJuIGNob29zZUFsaWFzKGdldEtleVR5cGVzKGtleVR5cGUpLCBpc3N1ZXJzLCBDaGVja1R5cGUuU0VSVkVSLAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QWxnb3JpdGhtQ29uc3RyYWludHMoZW5naW5lKSk7CisgICAgICAgICAgICBnZXRBbGdvcml0aG1Db25zdHJhaW50cyhlbmdpbmUpLAorICAgICAgICAgICAgWDUwOVRydXN0TWFuYWdlckltcGwuZ2V0UmVxdWVzdGVkU2VydmVyTmFtZXMoZW5naW5lKSwKKyAgICAgICAgICAgICJIVFRQUyIpOyAgICAvLyBUaGUgU05JIEhvc3ROYW1lIGlzIGEgZnVsbHkgcXVhbGlmaWVkIGRvbWFpbiBuYW1lLgorICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjZXJ0aWZpY2F0ZSBzZWxlY3Rpb24gc2NoZW1lIGZvciBTTkkgSG9zdE5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBzaW1pbGFyIHRvIEhUVFBTIGVuZHBvaW50IGlkZW50aWZpY2F0aW9uIHNjaGVtZQorICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGltcGxlbWVudGVkIGluIHRoaXMgcHJvdmlkZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2luZyBIVFRQUyBlbmRwb2ludCBpZGVudGlmaWNhdGlvbiBzY2hlbWUgdG8gZ3VpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc2VsZWN0aW9uIG9mIGFuIGFwcHJvcHJpYXRlIGF1dGhlbnRpY2F0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2VydGlmaWNhdGUgYWNjb3JkaW5nIHRvIHJlcXVlc3RlZCBTTkkgZXh0ZW5zaW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSXQgaXMgbm90IGEgcmVhbGx5IEhUVFBTIGVuZHBvaW50IGlkZW50aWZpY2F0aW9uLgogICAgIH0KIAogICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRDbGllbnRBbGlhc2VzKFN0cmluZyBrZXlUeXBlLCBQcmluY2lwYWxbXSBpc3N1ZXJzKSB7CkBAIC0zMjEsOCArMzQzLDggQEAKICAgICAgKiBUaGUgYWxnb3JpdGhtIHdlIHVzZSBpczoKICAgICAgKiAgIC4gc2NhbiB0aHJvdWdoIGFsbCB0aGUgYWxpYXNlcyBpbiBhbGwgYnVpbGRlcnMgaW4gb3JkZXIKICAgICAgKiAgIC4gYXMgc29vbiBhcyB3ZSBmaW5kIGEgcGVyZmVjdCBtYXRjaCwgcmV0dXJuCi0gICAgICogICAgIChpLmUuIGEgbWF0Y2ggd2l0aCBhIGNlcnQgdGhhdCBoYXMgYXBwcm9wcmlhdGUga2V5IHVzYWdlCi0gICAgICogICAgICBhbmQgaXMgbm90IGV4cGlyZWQpLgorICAgICAqICAgICAoaS5lLiBhIG1hdGNoIHdpdGggYSBjZXJ0IHRoYXQgaGFzIGFwcHJvcHJpYXRlIGtleSB1c2FnZSwKKyAgICAgKiAgICAgIHF1YWxpZmllZCBlbmRwb2ludCBpZGVudGl0eSwgYW5kIGlzIG5vdCBleHBpcmVkKS4KICAgICAgKiAgIC4gaWYgd2UgZG8gbm90IGZpbmQgYSBwZXJmZWN0IG1hdGNoLCBrZWVwIGxvb3BpbmcgYW5kIHJlbWVtYmVyCiAgICAgICogICAgIHRoZSBpbXBlcmZlY3QgbWF0Y2hlcwogICAgICAqICAgLiBhdCB0aGUgZW5kLCBzb3J0IHRoZSBpbXBlcmZlY3QgbWF0Y2hlcy4gd2UgcHJlZmVyIGV4cGlyZWQgY2VydHMKQEAgLTMzMSw2ICszNTMsMTUgQEAKICAgICAgKi8KICAgICBwcml2YXRlIFN0cmluZyBjaG9vc2VBbGlhcyhMaXN0PEtleVR5cGU+IGtleVR5cGVMaXN0LCBQcmluY2lwYWxbXSBpc3N1ZXJzLAogICAgICAgICAgICAgQ2hlY2tUeXBlIGNoZWNrVHlwZSwgQWxnb3JpdGhtQ29uc3RyYWludHMgY29uc3RyYWludHMpIHsKKworICAgICAgICByZXR1cm4gY2hvb3NlQWxpYXMoa2V5VHlwZUxpc3QsIGlzc3VlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja1R5cGUsIGNvbnN0cmFpbnRzLCBudWxsLCBudWxsKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBjaG9vc2VBbGlhcyhMaXN0PEtleVR5cGU+IGtleVR5cGVMaXN0LCBQcmluY2lwYWxbXSBpc3N1ZXJzLAorICAgICAgICAgICAgQ2hlY2tUeXBlIGNoZWNrVHlwZSwgQWxnb3JpdGhtQ29uc3RyYWludHMgY29uc3RyYWludHMsCisgICAgICAgICAgICBMaXN0PFNOSVNlcnZlck5hbWU+IHJlcXVlc3RlZFNlcnZlck5hbWVzLCBTdHJpbmcgaWRBbGdvcml0aG0pIHsKKwogICAgICAgICBpZiAoa2V5VHlwZUxpc3QgPT0gbnVsbCB8fCBrZXlUeXBlTGlzdC5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9CkBAIC0zNDAsNyArMzcxLDggQEAKICAgICAgICAgZm9yIChpbnQgaSA9IDAsIG4gPSBidWlsZGVycy5zaXplKCk7IGkgPCBuOyBpKyspIHsKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgTGlzdDxFbnRyeVN0YXR1cz4gcmVzdWx0cyA9IGdldEFsaWFzZXMoaSwga2V5VHlwZUxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc3N1ZXJTZXQsIGZhbHNlLCBjaGVja1R5cGUsIGNvbnN0cmFpbnRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc3N1ZXJTZXQsIGZhbHNlLCBjaGVja1R5cGUsIGNvbnN0cmFpbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZFNlcnZlck5hbWVzLCBpZEFsZ29yaXRobSk7CiAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdHMgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcmVzdWx0cyB3aWxsIGVpdGhlciBiZSBhIHNpbmdsZSBwZXJmZWN0IG1hdGNoCiAgICAgICAgICAgICAgICAgICAgIC8vIG9yIDEgb3IgbW9yZSBpbXBlcmZlY3QgbWF0Y2hlcwpAQCAtMzk0LDcgKzQyNiw4IEBACiAgICAgICAgIGZvciAoaW50IGkgPSAwLCBuID0gYnVpbGRlcnMuc2l6ZSgpOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIExpc3Q8RW50cnlTdGF0dXM+IHJlc3VsdHMgPSBnZXRBbGlhc2VzKGksIGtleVR5cGVMaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNzdWVyU2V0LCB0cnVlLCBjaGVja1R5cGUsIGNvbnN0cmFpbnRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzc3VlclNldCwgdHJ1ZSwgY2hlY2tUeXBlLCBjb25zdHJhaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwpOwogICAgICAgICAgICAgICAgIGlmIChyZXN1bHRzICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGFsbFJlc3VsdHMgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgYWxsUmVzdWx0cyA9IG5ldyBBcnJheUxpc3Q8RW50cnlTdGF0dXM+KCk7CkBAIC01MDQsNyArNTM3LDkgQEAKICAgICAgICAgLy8gZmlyc3QgY2hlY2sgZXh0ZW5zaW9ucywgaWYgdGhleSBtYXRjaCwgY2hlY2sgZXhwaXJhdGlvbgogICAgICAgICAvLyBub3RlOiB3ZSBtYXkgd2FudCB0byBtb3ZlIHRoaXMgY29kZSBpbnRvIHRoZSBzdW4uc2VjdXJpdHkudmFsaWRhdG9yCiAgICAgICAgIC8vIHBhY2thZ2UKLSAgICAgICAgQ2hlY2tSZXN1bHQgY2hlY2soWDUwOUNlcnRpZmljYXRlIGNlcnQsIERhdGUgZGF0ZSkgeworICAgICAgICBDaGVja1Jlc3VsdCBjaGVjayhYNTA5Q2VydGlmaWNhdGUgY2VydCwgRGF0ZSBkYXRlLAorICAgICAgICAgICAgICAgIExpc3Q8U05JU2VydmVyTmFtZT4gc2VydmVyTmFtZXMsIFN0cmluZyBpZEFsZ29yaXRobSkgeworCiAgICAgICAgICAgICBpZiAodGhpcyA9PSBOT05FKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIENoZWNrUmVzdWx0Lk9LOwogICAgICAgICAgICAgfQpAQCAtNTUzLDExICs1ODgsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENoZWNrUmVzdWx0LkVYVEVOU0lPTl9NSVNNQVRDSDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9yIHNlcnZlcnMsIGFsc28gcmVxdWlyZSBrZXkgYWdyZWVtZW50LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgbm90IHRvdGFsbHkgYWNjdXJhdGUgYXMgdGhlIGtleUFncmVlbWVudCBiaXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBvbmx5IG5lY2Vzc2FyeSBmb3Igc3RhdGljIEVDREgga2V5IGV4Y2hhbmdlIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdCBlcGhlbWVyYWwgRUNESC4gV2UgbGVhdmUgaXQgaW4gZm9yIG5vdyB1bnRpbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZXJlIGFyZSBzaWducyB0aGF0IHRoaXMgY2hlY2sgY2F1c2VzIHByb2JsZW1zCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHJlYWwgd29ybGQgRUMgY2VydGlmaWNhdGVzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgbm90IHRvdGFsbHkgYWNjdXJhdGUgYXMgdGhlIGtleUFncmVlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpdCBpcyBvbmx5IG5lY2Vzc2FyeSBmb3Igc3RhdGljIEVDREgga2V5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhjaGFuZ2UgYW5kIG5vdCBlcGhlbWVyYWwgRUNESC4gV2UgbGVhdmUgaXQgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3Igbm93IHVudGlsIHRoZXJlIGFyZSBzaWducyB0aGF0IHRoaXMgY2hlY2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYXVzZXMgcHJvYmxlbXMgZm9yIHJlYWwgd29ybGQgRUMgY2VydGlmaWNhdGVzLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodGhpcyA9PSBTRVJWRVIpICYmIChnZXRCaXQoa3UsIDQpID09IGZhbHNlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ2hlY2tSZXN1bHQuRVhURU5TSU9OX01JU01BVENIOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTU3MSwxMCArNjA2LDUwIEBACiAKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgY2VydC5jaGVja1ZhbGlkaXR5KGRhdGUpOwotICAgICAgICAgICAgICAgIHJldHVybiBDaGVja1Jlc3VsdC5PSzsKICAgICAgICAgICAgIH0gY2F0Y2ggKENlcnRpZmljYXRlRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gQ2hlY2tSZXN1bHQuRVhQSVJFRDsKICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHNlcnZlck5hbWVzICE9IG51bGwgJiYgIXNlcnZlck5hbWVzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGZvciAoU05JU2VydmVyTmFtZSBzZXJ2ZXJOYW1lIDogc2VydmVyTmFtZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZlck5hbWUuZ2V0VHlwZSgpID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YW5kYXJkQ29uc3RhbnRzLlNOSV9IT1NUX05BTUUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHNlcnZlck5hbWUgaW5zdGFuY2VvZiBTTklIb3N0TmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJOYW1lID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTTklIb3N0TmFtZShzZXJ2ZXJOYW1lLmdldEVuY29kZWQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlhZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bmxpa2VseSB0byBoYXBwZW4sIGp1c3QgaW4gY2FzZSAuLi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVzZURlYnVnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Zy5wcmludGxuKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklsbGVnYWwgc2VydmVyIG5hbWU6ICIgKyBzZXJ2ZXJOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDaGVja1Jlc3VsdC5JTlNFTlNJVElWRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaG9zdG5hbWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFNOSUhvc3ROYW1lKXNlcnZlck5hbWUpLmdldEFzY2lpTmFtZSgpOworCisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg1MDlUcnVzdE1hbmFnZXJJbXBsLmNoZWNrSWRlbnRpdHkoaG9zdG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnQsIGlkQWxnb3JpdGhtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENlcnRpZmljYXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXNlRGVidWcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWcucHJpbnRsbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNlcnRpZmljYXRlIGlkZW50aXR5IGRvZXMgbm90IG1hdGNoICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2VydmVyIE5hbWUgSW5pZGljYXRpb24gKFNOSSk6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0bmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDaGVja1Jlc3VsdC5JTlNFTlNJVElWRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBDaGVja1Jlc3VsdC5PSzsKICAgICAgICAgfQogICAgIH0KIApAQCAtNTgzLDYgKzY1OCw3IEBACiAgICAgLy8gZm9yIHNvcnRpbmcsIGkuZS4gT0sgaXMgYmVzdCwgZm9sbG93ZWQgYnkgRVhQSVJFRCBhbmQgRVhURU5TSU9OX01JU01BVENICiAgICAgcHJpdmF0ZSBzdGF0aWMgZW51bSBDaGVja1Jlc3VsdCB7CiAgICAgICAgIE9LLCAgICAgICAgICAgICAgICAgICAgIC8vIG9rIG9yIG5vdCBjaGVja2VkCisgICAgICAgIElOU0VOU0lUSVZFLCAgICAgICAgICAgIC8vIHNlcnZlciBuYW1lIGluZGljYXRpb24gaW5zZW5zaXRpdmUKICAgICAgICAgRVhQSVJFRCwgICAgICAgICAgICAgICAgLy8gZXh0ZW5zaW9ucyB2YWxpZCBidXQgY2VydCBleHBpcmVkCiAgICAgICAgIEVYVEVOU0lPTl9NSVNNQVRDSCwgICAgIC8vIGV4dGVuc2lvbnMgaW52YWxpZCAoZXhwaXJhdGlvbiBub3QgY2hlY2tlZCkKICAgICB9CkBAIC02MTYsNyArNjkyLDEwIEBACiAgICAgcHJpdmF0ZSBMaXN0PEVudHJ5U3RhdHVzPiBnZXRBbGlhc2VzKGludCBidWlsZGVySW5kZXgsCiAgICAgICAgICAgICBMaXN0PEtleVR5cGU+IGtleVR5cGVzLCBTZXQ8UHJpbmNpcGFsPiBpc3N1ZXJTZXQsCiAgICAgICAgICAgICBib29sZWFuIGZpbmRBbGwsIENoZWNrVHlwZSBjaGVja1R5cGUsCi0gICAgICAgICAgICBBbGdvcml0aG1Db25zdHJhaW50cyBjb25zdHJhaW50cykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBBbGdvcml0aG1Db25zdHJhaW50cyBjb25zdHJhaW50cywKKyAgICAgICAgICAgIExpc3Q8U05JU2VydmVyTmFtZT4gcmVxdWVzdGVkU2VydmVyTmFtZXMsCisgICAgICAgICAgICBTdHJpbmcgaWRBbGdvcml0aG0pIHRocm93cyBFeGNlcHRpb24geworCiAgICAgICAgIEJ1aWxkZXIgYnVpbGRlciA9IGJ1aWxkZXJzLmdldChidWlsZGVySW5kZXgpOwogICAgICAgICBLZXlTdG9yZSBrcyA9IGJ1aWxkZXIuZ2V0S2V5U3RvcmUoKTsKICAgICAgICAgTGlzdDxFbnRyeVN0YXR1cz4gcmVzdWx0cyA9IG51bGw7CkBAIC02OTksNyArNzc4LDggQEAKICAgICAgICAgICAgICAgICBkYXRlID0gbmV3IERhdGUoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIENoZWNrUmVzdWx0IGNoZWNrUmVzdWx0ID0KLSAgICAgICAgICAgICAgICAgICAgY2hlY2tUeXBlLmNoZWNrKChYNTA5Q2VydGlmaWNhdGUpY2hhaW5bMF0sIGRhdGUpOworICAgICAgICAgICAgICAgICAgICBjaGVja1R5cGUuY2hlY2soKFg1MDlDZXJ0aWZpY2F0ZSljaGFpblswXSwgZGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZFNlcnZlck5hbWVzLCBpZEFsZ29yaXRobSk7CiAgICAgICAgICAgICBFbnRyeVN0YXR1cyBzdGF0dXMgPQogICAgICAgICAgICAgICAgICAgICBuZXcgRW50cnlTdGF0dXMoYnVpbGRlckluZGV4LCBrZXlJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlhcywgY2hhaW4sIGNoZWNrUmVzdWx0KTsKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvc3NsL1g1MDlUcnVzdE1hbmFnZXJJbXBsLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3NzbC9YNTA5VHJ1c3RNYW5hZ2VySW1wbC5qYXZhCmluZGV4IGQzOGU3MjcuLjEzYmJiMTggMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvc3NsL1g1MDlUcnVzdE1hbmFnZXJJbXBsLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS9zc2wvWDUwOVRydXN0TWFuYWdlckltcGwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTcsIDIwMTAsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI4LDE1ICsyOCwxNCBAQAogCiBpbXBvcnQgamF2YS5uZXQuU29ja2V0OwogaW1wb3J0IGphdmF4Lm5ldC5zc2wuU1NMU2Vzc2lvbjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CiAKIGltcG9ydCBqYXZhLnV0aWwuKjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5Lio7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0Lio7Ci0KIGltcG9ydCBqYXZheC5uZXQuc3NsLio7CiAKIGltcG9ydCBzdW4uc2VjdXJpdHkudmFsaWRhdG9yLio7Ci0KIGltcG9ydCBzdW4uc2VjdXJpdHkudXRpbC5Ib3N0bmFtZUNoZWNrZXI7CiAKIC8qKgpAQCAtMTk5LDggKzE5OCw4IEBACiAgICAgICAgICAgICBTdHJpbmcgaWRlbnRpdHlBbGcgPSBzc2xTb2NrZXQuZ2V0U1NMUGFyYW1ldGVycygpLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEVuZHBvaW50SWRlbnRpZmljYXRpb25BbGdvcml0aG0oKTsKICAgICAgICAgICAgIGlmIChpZGVudGl0eUFsZyAhPSBudWxsICYmIGlkZW50aXR5QWxnLmxlbmd0aCgpICE9IDApIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgaG9zdG5hbWUgPSBzZXNzaW9uLmdldFBlZXJIb3N0KCk7Ci0gICAgICAgICAgICAgICAgY2hlY2tJZGVudGl0eShob3N0bmFtZSwgY2hhaW5bMF0sIGlkZW50aXR5QWxnKTsKKyAgICAgICAgICAgICAgICBjaGVja0lkZW50aXR5KHNlc3Npb24sIGNoYWluWzBdLCBpZGVudGl0eUFsZywgaXNDbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRSZXF1ZXN0ZWRTZXJ2ZXJOYW1lcyhzb2NrZXQpKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gY3JlYXRlIHRoZSBhbGdvcml0aG0gY29uc3RyYWludHMKQEAgLTI1MSw4ICsyNTAsOCBAQAogICAgICAgICAgICAgU3RyaW5nIGlkZW50aXR5QWxnID0gZW5naW5lLmdldFNTTFBhcmFtZXRlcnMoKS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRFbmRwb2ludElkZW50aWZpY2F0aW9uQWxnb3JpdGhtKCk7CiAgICAgICAgICAgICBpZiAoaWRlbnRpdHlBbGcgIT0gbnVsbCAmJiBpZGVudGl0eUFsZy5sZW5ndGgoKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGhvc3RuYW1lID0gc2Vzc2lvbi5nZXRQZWVySG9zdCgpOwotICAgICAgICAgICAgICAgIGNoZWNrSWRlbnRpdHkoaG9zdG5hbWUsIGNoYWluWzBdLCBpZGVudGl0eUFsZyk7CisgICAgICAgICAgICAgICAgY2hlY2tJZGVudGl0eShzZXNzaW9uLCBjaGFpblswXSwgaWRlbnRpdHlBbGcsIGlzQ2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UmVxdWVzdGVkU2VydmVyTmFtZXMoZW5naW5lKSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgYWxnb3JpdGhtIGNvbnN0cmFpbnRzCkBAIC0zMjksNiArMzI4LDExNyBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLy8gR2V0IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBIb3N0TmFtZSBmcm9tIGEgbGlzdCBvZiBzZXJ2ZXIgbmFtZXMuCisgICAgLy8KKyAgICAvLyBXZSBhcmUgb25seSBhY2NlcHRpbmcgaG9zdF9uYW1lIG5hbWUgdHlwZSBpbiB0aGUgbGlzdC4KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0SG9zdE5hbWVJblNOSShMaXN0PFNOSVNlcnZlck5hbWU+IHNuaU5hbWVzKSB7CisKKyAgICAgICAgU05JSG9zdE5hbWUgaG9zdG5hbWUgPSBudWxsOworICAgICAgICBmb3IgKFNOSVNlcnZlck5hbWUgc25pTmFtZSA6IHNuaU5hbWVzKSB7CisgICAgICAgICAgICBpZiAoc25pTmFtZS5nZXRUeXBlKCkgIT0gU3RhbmRhcmRDb25zdGFudHMuU05JX0hPU1RfTkFNRSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc25pTmFtZSBpbnN0YW5jZW9mIFNOSUhvc3ROYW1lKSB7CisgICAgICAgICAgICAgICAgaG9zdG5hbWUgPSAoU05JSG9zdE5hbWUpc25pTmFtZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaG9zdG5hbWUgPSBuZXcgU05JSG9zdE5hbWUoc25pTmFtZS5nZXRFbmNvZGVkKCkpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gdW5saWtlbHkgdG8gaGFwcGVuLCBqdXN0IGluIGNhc2UgLi4uCisgICAgICAgICAgICAgICAgICAgIGlmICgoZGVidWcgIT0gbnVsbCkgJiYgRGVidWcuaXNPbigidHJ1c3RtYW5hZ2VyIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBlbmNvZGVkID0gaG9zdG5hbWUuZ2V0RW5jb2RlZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJJbGxlZ2FsIHNlcnZlciBuYW1lOiAiICsgc25pTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIG5vIG1vcmUgdGhhbiBzZXJ2ZXIgbmFtZSBvZiB0aGUgc2FtZSBuYW1lIHR5cGUKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGhvc3RuYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBob3N0bmFtZS5nZXRBc2NpaU5hbWUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8vIEFsc28gdXNlZCBieSBYNTA5S2V5TWFuYWdlckltcGwKKyAgICBzdGF0aWMgTGlzdDxTTklTZXJ2ZXJOYW1lPiBnZXRSZXF1ZXN0ZWRTZXJ2ZXJOYW1lcyhTb2NrZXQgc29ja2V0KSB7CisgICAgICAgIGlmIChzb2NrZXQgIT0gbnVsbCAmJiBzb2NrZXQuaXNDb25uZWN0ZWQoKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldCBpbnN0YW5jZW9mIFNTTFNvY2tldCkgeworCisgICAgICAgICAgICBTU0xTb2NrZXQgc3NsU29ja2V0ID0gKFNTTFNvY2tldClzb2NrZXQ7CisgICAgICAgICAgICBTU0xTZXNzaW9uIHNlc3Npb24gPSBzc2xTb2NrZXQuZ2V0SGFuZHNoYWtlU2Vzc2lvbigpOworCisgICAgICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxsICYmIChzZXNzaW9uIGluc3RhbmNlb2YgRXh0ZW5kZWRTU0xTZXNzaW9uKSkgeworICAgICAgICAgICAgICAgIEV4dGVuZGVkU1NMU2Vzc2lvbiBleHRTZXNzaW9uID0gKEV4dGVuZGVkU1NMU2Vzc2lvbilzZXNzaW9uOworICAgICAgICAgICAgICAgIHJldHVybiBleHRTZXNzaW9uLmdldFJlcXVlc3RlZFNlcnZlck5hbWVzKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuPFNOSVNlcnZlck5hbWU+ZW1wdHlMaXN0KCk7CisgICAgfQorCisgICAgLy8gQWxzbyB1c2VkIGJ5IFg1MDlLZXlNYW5hZ2VySW1wbAorICAgIHN0YXRpYyBMaXN0PFNOSVNlcnZlck5hbWU+IGdldFJlcXVlc3RlZFNlcnZlck5hbWVzKFNTTEVuZ2luZSBlbmdpbmUpIHsKKyAgICAgICAgaWYgKGVuZ2luZSAhPSBudWxsKSB7CisgICAgICAgICAgICBTU0xTZXNzaW9uIHNlc3Npb24gPSBlbmdpbmUuZ2V0SGFuZHNoYWtlU2Vzc2lvbigpOworCisgICAgICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxsICYmIChzZXNzaW9uIGluc3RhbmNlb2YgRXh0ZW5kZWRTU0xTZXNzaW9uKSkgeworICAgICAgICAgICAgICAgIEV4dGVuZGVkU1NMU2Vzc2lvbiBleHRTZXNzaW9uID0gKEV4dGVuZGVkU1NMU2Vzc2lvbilzZXNzaW9uOworICAgICAgICAgICAgICAgIHJldHVybiBleHRTZXNzaW9uLmdldFJlcXVlc3RlZFNlcnZlck5hbWVzKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuPFNOSVNlcnZlck5hbWU+ZW1wdHlMaXN0KCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBQZXIgUkZDIDYwNjYsIGlmIGFuIGFwcGxpY2F0aW9uIG5lZ290aWF0ZXMgYSBzZXJ2ZXIgbmFtZSB1c2luZyBhbgorICAgICAqIGFwcGxpY2F0aW9uIHByb3RvY29sIGFuZCB0aGVuIHVwZ3JhZGVzIHRvIFRMUywgYW5kIGlmIGEgc2VydmVyX25hbWUKKyAgICAgKiBleHRlbnNpb24gaXMgc2VudCwgdGhlbiB0aGUgZXh0ZW5zaW9uIFNIT1VMRCBjb250YWluIHRoZSBzYW1lIG5hbWUKKyAgICAgKiB0aGF0IHdhcyBuZWdvdGlhdGVkIGluIHRoZSBhcHBsaWNhdGlvbiBwcm90b2NvbC4gIElmIHRoZSBzZXJ2ZXJfbmFtZQorICAgICAqIGlzIGVzdGFibGlzaGVkIGluIHRoZSBUTFMgc2Vzc2lvbiBoYW5kc2hha2UsIHRoZSBjbGllbnQgU0hPVUxEIE5PVAorICAgICAqIGF0dGVtcHQgdG8gcmVxdWVzdCBhIGRpZmZlcmVudCBzZXJ2ZXIgbmFtZSBhdCB0aGUgYXBwbGljYXRpb24gbGF5ZXIuCisgICAgICoKKyAgICAgKiBBY2NvcmRpbmcgdG8gdGhlIGFib3ZlIHNwZWMsIHdlIG9ubHkgbmVlZCB0byBjaGVjayBlaXRoZXIgdGhlIGlkZW50aXR5CisgICAgICogaW4gc2VydmVyX25hbWUgZXh0ZW5zaW9uIG9yIHRoZSBwZWVyIGhvc3Qgb2YgdGhlIGNvbm5lY3Rpb24uICBQZWVyIGhvc3QKKyAgICAgKiBpcyBub3QgYWx3YXlzIGEgcmVsaWFibGUgZnVsbHkgcXVhbGlmaWVkIGRvbWFpbiBuYW1lLiBUaGUgSG9zdE5hbWUgaW4KKyAgICAgKiBzZXJ2ZXJfbmFtZSBleHRlbnNpb24gaXMgbW9yZSByZWxpYWJsZSB0aGFuIHBlZXIgaG9zdC4gU28gd2UgcHJlZmVyCisgICAgICogdGhlIGlkZW50aXR5IGNoZWNraW5nIGFnaW5zdCB0aGUgc2VydmVyX25hbWUgZXh0ZW5zaW9uIGlmIHByZXNlbnQsIGFuZAorICAgICAqIG1heSBmYWlsb3ZlIHRvIHBlZXIgaG9zdCBjaGVja2luZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrSWRlbnRpdHkoU1NMU2Vzc2lvbiBzZXNzaW9uLAorICAgICAgICAgICAgWDUwOUNlcnRpZmljYXRlIGNlcnQsCisgICAgICAgICAgICBTdHJpbmcgYWxnb3JpdGhtLAorICAgICAgICAgICAgYm9vbGVhbiBpc0NsaWVudCwKKyAgICAgICAgICAgIExpc3Q8U05JU2VydmVyTmFtZT4gc25pTmFtZXMpIHRocm93cyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiB7CisKKyAgICAgICAgYm9vbGVhbiBpZGVudGlmaWFibGUgPSBmYWxzZTsKKyAgICAgICAgU3RyaW5nIHBlZXJIb3N0ID0gc2Vzc2lvbi5nZXRQZWVySG9zdCgpOworICAgICAgICBpZiAoaXNDbGllbnQpIHsKKyAgICAgICAgICAgIFN0cmluZyBob3N0bmFtZSA9IGdldEhvc3ROYW1lSW5TTkkoc25pTmFtZXMpOworICAgICAgICAgICAgaWYgKGhvc3RuYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBjaGVja0lkZW50aXR5KGhvc3RuYW1lLCBjZXJ0LCBhbGdvcml0aG0pOworICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWFibGUgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENlcnRpZmljYXRlRXhjZXB0aW9uIGNlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChob3N0bmFtZS5lcXVhbHNJZ25vcmVDYXNlKHBlZXJIb3N0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgY2U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBvdGhlcndpc3csIGZhaWxvdmVyIHRvIGNoZWNrIHBlZXIgaG9zdAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghaWRlbnRpZmlhYmxlKSB7CisgICAgICAgICAgICBjaGVja0lkZW50aXR5KHBlZXJIb3N0LCBjZXJ0LCBhbGdvcml0aG0pOworICAgICAgICB9CisgICAgfQorCiAgICAgLyoKICAgICAgKiBJZGVudGlmeSB0aGUgcGVlciBieSBpdHMgY2VydGlmaWNhdGUgYW5kIGhvc3RuYW1lLgogICAgICAqCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3Rvb2xzL0tleVN0b3JlVXRpbC5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS90b29scy9LZXlTdG9yZVV0aWwuamF2YQppbmRleCA2NzlhMjQ3Li5lY2ZiYTVmIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3Rvb2xzL0tleVN0b3JlVXRpbC5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdG9vbHMvS2V5U3RvcmVVdGlsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSw2ICsyNSwxOCBAQAogCiBwYWNrYWdlIHN1bi5zZWN1cml0eS50b29sczsKIAoraW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKKworaW1wb3J0IGphdmEubmV0LlVSTDsKKworaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5U3RvcmU7CisKK2ltcG9ydCBqYXZhLnRleHQuQ29sbGF0b3I7CisKIGltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwogCiAvKioKQEAgLTM0LDE4ICs0NiwxNyBAQAogICovCiBwdWJsaWMgY2xhc3MgS2V5U3RvcmVVdGlsIHsKIAotICAgIC8vIENsYXNzIGFuZCBtZXRob2RzIG1hcmtlZCBhcyBwdWJsaWMgc28gdGhhdCB0aGV5IGNhbiBiZQotICAgIC8vIGFjY2Vzc2VkIGJ5IEphclNpZ25lciwgd2hpY2ggYWx0aG91Z2ggbGllcyBpbiBhIHBhY2thZ2UKLSAgICAvLyB3aXRoIHRoZSBzYW1lIG5hbWUsIGJ1dCBidW5kbGVkIGluIHRvb2xzLmphciBhbmQgbG9hZGVkCi0gICAgLy8gYnkgYW5vdGhlciBjbGFzcyBsb2FkZXIsIGhlbmNlIGluIGEgZGlmZmVyZW50ICpydW50aW1lKgotICAgIC8vIHBhY2thZ2UuCi0gICAgLy8KLSAgICAvLyBTZWUgSlZNIFNwZWMsIDUuMyBhbmQgNS40LjQKLQogICAgIHByaXZhdGUgS2V5U3RvcmVVdGlsKCkgewogICAgICAgICAvLyB0aGlzIGNsYXNzIGlzIG5vdCBtZWFudCB0byBiZSBpbnN0YW50aWF0ZWQKICAgICB9CiAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSktTID0gImprcyI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDb2xsYXRvciBjb2xsYXRvciA9IENvbGxhdG9yLmdldEluc3RhbmNlKCk7CisgICAgc3RhdGljIHsKKyAgICAgICAgLy8gdGhpcyBpcyBmb3IgY2FzZSBpbnNlbnNpdGl2ZSBzdHJpbmcgY29tcGFyaXNvbnMKKyAgICAgICAgY29sbGF0b3Iuc2V0U3RyZW5ndGgoQ29sbGF0b3IuUFJJTUFSWSk7CisgICAgfTsKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdHJ1ZSBpZiBLZXlTdG9yZSBoYXMgYSBwYXNzd29yZC4gVGhpcyBpcyB0cnVlIGV4Y2VwdCBmb3IKQEAgLTY4LDQgKzc5LDc2IEBACiAgICAgICAgICAgICByZXR1cm4gc3RvcmV0eXBlLnRvVXBwZXJDYXNlKExvY2FsZS5FTkdMSVNIKTsKICAgICAgICAgfQogICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGtleXN0b3JlIHdpdGggdGhlIGNvbmZpZ3VyZWQgQ0EgY2VydGlmaWNhdGVzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgS2V5U3RvcmUgZ2V0Q2FjZXJ0c0tleVN0b3JlKCkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgU3RyaW5nIHNlcCA9IEZpbGUuc2VwYXJhdG9yOworICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaG9tZSIpICsgc2VwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImxpYiIgKyBzZXAgKyAic2VjdXJpdHkiICsgc2VwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImNhY2VydHMiKTsKKyAgICAgICAgaWYgKCFmaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBLZXlTdG9yZSBjYWtzID0gbnVsbDsKKyAgICAgICAgdHJ5IChGaWxlSW5wdXRTdHJlYW0gZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKSkgeworICAgICAgICAgICAgY2FrcyA9IEtleVN0b3JlLmdldEluc3RhbmNlKEpLUyk7CisgICAgICAgICAgICBjYWtzLmxvYWQoZmlzLCBudWxsKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2FrczsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNoYXJbXSBnZXRQYXNzV2l0aE1vZGlmaWVyKFN0cmluZyBtb2RpZmllciwgU3RyaW5nIGFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZSByYikgeworICAgICAgICBpZiAobW9kaWZpZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGFyZy50b0NoYXJBcnJheSgpOworICAgICAgICB9IGVsc2UgaWYgKGNvbGxhdG9yLmNvbXBhcmUobW9kaWZpZXIsICJlbnYiKSA9PSAwKSB7CisgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBTeXN0ZW0uZ2V0ZW52KGFyZyk7CisgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihyYi5nZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90LmZpbmQuZW52aXJvbm1lbnQudmFyaWFibGUuIikgKyBhcmcpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUudG9DaGFyQXJyYXkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChjb2xsYXRvci5jb21wYXJlKG1vZGlmaWVyLCAiZmlsZSIpID09IDApIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgVVJMIHVybCA9IG51bGw7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgdXJsID0gbmV3IFVSTChhcmcpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoYXJnKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGYuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVybCA9IGYudG9VUkkoKS50b1VSTCgpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKHJiLmdldFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdC5maW5kLmZpbGUuIikgKyBhcmcpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0cnkgKEJ1ZmZlcmVkUmVhZGVyIGJyID0KKyAgICAgICAgICAgICAgICAgICAgIG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgdXJsLm9wZW5TdHJlYW0oKSkpKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGJyLnJlYWRMaW5lKCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgY2hhclswXTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS50b0NoYXJBcnJheSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihpb2UpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKHJiLmdldFN0cmluZygiVW5rbm93bi5wYXNzd29yZC50eXBlLiIpICsKKyAgICAgICAgICAgICAgICAgICAgbW9kaWZpZXIpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3Rvb2xzL0phclNpZ25lci5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS90b29scy9qYXJzaWduZXIvTWFpbi5qYXZhCnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIGpkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdG9vbHMvSmFyU2lnbmVyLmphdmEKcmVuYW1lIHRvIGpkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdG9vbHMvamFyc2lnbmVyL01haW4uamF2YQppbmRleCAzMWRmYmNlLi45OGYzZWMyIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3Rvb2xzL0phclNpZ25lci5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdG9vbHMvamFyc2lnbmVyL01haW4uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTcsIDIwMTEsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIzLDcgKzIzLDcgQEAKICAqIHF1ZXN0aW9ucy4KICAqLwogCi1wYWNrYWdlIHN1bi5zZWN1cml0eS50b29sczsKK3BhY2thZ2Ugc3VuLnNlY3VyaXR5LnRvb2xzLmphcnNpZ25lcjsKIAogaW1wb3J0IGphdmEuaW8uKjsKIGltcG9ydCBqYXZhLnV0aWwuKjsKQEAgLTUzLDYgKzUzLDggQEAKIGltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuUEtJWFBhcmFtZXRlcnM7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LlRydXN0QW5jaG9yOwogaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7CitpbXBvcnQgc3VuLnNlY3VyaXR5LnRvb2xzLktleVN0b3JlVXRpbDsKK2ltcG9ydCBzdW4uc2VjdXJpdHkudG9vbHMuUGF0aExpc3Q7CiBpbXBvcnQgc3VuLnNlY3VyaXR5Lng1MDkuKjsKIGltcG9ydCBzdW4uc2VjdXJpdHkudXRpbC4qOwogaW1wb3J0IHN1bi5taXNjLkJBU0U2NEVuY29kZXI7CkBAIC03NCwxMiArNzYsMTIgQEAKICAqIEBhdXRob3IgSmFuIEx1ZWhlCiAgKi8KIAotcHVibGljIGNsYXNzIEphclNpZ25lciB7CitwdWJsaWMgY2xhc3MgTWFpbiB7CiAKICAgICAvLyBmb3IgaTE4bgogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZSByYiA9CiAgICAgICAgIGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUKLSAgICAgICAgKCJzdW4uc2VjdXJpdHkudG9vbHMuSmFyU2lnbmVyUmVzb3VyY2VzIik7CisgICAgICAgICgic3VuLnNlY3VyaXR5LnRvb2xzLmphcnNpZ25lci5SZXNvdXJjZXMiKTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDb2xsYXRvciBjb2xsYXRvciA9IENvbGxhdG9yLmdldEluc3RhbmNlKCk7CiAgICAgc3RhdGljIHsKICAgICAgICAgLy8gdGhpcyBpcyBmb3IgY2FzZSBpbnNlbnNpdGl2ZSBzdHJpbmcgY29tcGFyaXNpb25zCkBAIC0xMDEsNyArMTAzLDcgQEAKICAgICAvLyBBdHRlbnRpb246CiAgICAgLy8gVGhpcyBpcyB0aGUgZW50cnkgdGhhdCBnZXQgbGF1bmNoZWQgYnkgdGhlIHNlY3VyaXR5IHRvb2wgamFyc2lnbmVyLgogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBKYXJTaWduZXIganMgPSBuZXcgSmFyU2lnbmVyKCk7CisgICAgICAgIE1haW4ganMgPSBuZXcgTWFpbigpOwogICAgICAgICBqcy5ydW4oYXJncyk7CiAgICAgfQogCkBAIC00NjEsNyArNDYzLDcgQEAKICAgICB9CiAKICAgICBzdGF0aWMgY2hhcltdIGdldFBhc3MoU3RyaW5nIG1vZGlmaWVyLCBTdHJpbmcgYXJnKSB7Ci0gICAgICAgIGNoYXJbXSBvdXRwdXQgPSBLZXlUb29sLmdldFBhc3NXaXRoTW9kaWZpZXIobW9kaWZpZXIsIGFyZyk7CisgICAgICAgIGNoYXJbXSBvdXRwdXQgPSBLZXlTdG9yZVV0aWwuZ2V0UGFzc1dpdGhNb2RpZmllcihtb2RpZmllciwgYXJnLCByYik7CiAgICAgICAgIGlmIChvdXRwdXQgIT0gbnVsbCkgcmV0dXJuIG91dHB1dDsKICAgICAgICAgdXNhZ2UoKTsKICAgICAgICAgcmV0dXJuIG51bGw7ICAgIC8vIFVzZWxlc3MsIHVzYWdlKCkgYWxyZWFkeSBleGl0CkBAIC0xNTc5LDcgKzE1ODEsNyBAQAogICAgICAgICAgICAgdmFsaWRhdG9yID0gQ2VydFBhdGhWYWxpZGF0b3IuZ2V0SW5zdGFuY2UoIlBLSVgiKTsKICAgICAgICAgICAgIFNldDxUcnVzdEFuY2hvcj4gdGFzID0gbmV3IEhhc2hTZXQ8PigpOwogICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBLZXlTdG9yZSBjYWtzID0gS2V5VG9vbC5nZXRDYWNlcnRzS2V5U3RvcmUoKTsKKyAgICAgICAgICAgICAgICBLZXlTdG9yZSBjYWtzID0gS2V5U3RvcmVVdGlsLmdldENhY2VydHNLZXlTdG9yZSgpOwogICAgICAgICAgICAgICAgIGlmIChjYWtzICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgRW51bWVyYXRpb248U3RyaW5nPiBhbGlhc2VzID0gY2Frcy5hbGlhc2VzKCk7CiAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChhbGlhc2VzLmhhc01vcmVFbGVtZW50cygpKSB7CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3Rvb2xzL0phclNpZ25lclJlc291cmNlcy5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS90b29scy9qYXJzaWduZXIvUmVzb3VyY2VzLmphdmEKc2ltaWxhcml0eSBpbmRleCA5NiUKcmVuYW1lIGZyb20gamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS90b29scy9KYXJTaWduZXJSZXNvdXJjZXMuamF2YQpyZW5hbWUgdG8gamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS90b29scy9qYXJzaWduZXIvUmVzb3VyY2VzLmphdmEKaW5kZXggY2VhOGIyNS4uOWM1OWI1MCAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS90b29scy9KYXJTaWduZXJSZXNvdXJjZXMuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3Rvb2xzL2phcnNpZ25lci9SZXNvdXJjZXMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIzLDE0ICsyMywxNCBAQAogICogcXVlc3Rpb25zLgogICovCiAKLXBhY2thZ2Ugc3VuLnNlY3VyaXR5LnRvb2xzOworcGFja2FnZSBzdW4uc2VjdXJpdHkudG9vbHMuamFyc2lnbmVyOwogCiAvKioKICAqIDxwPiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIDxjb2RlPlJlc291cmNlQnVuZGxlPC9jb2RlPgogICogZm9yIEphclNpZ25lci4KICAqCiAgKi8KLXB1YmxpYyBjbGFzcyBKYXJTaWduZXJSZXNvdXJjZXMgZXh0ZW5kcyBqYXZhLnV0aWwuTGlzdFJlc291cmNlQnVuZGxlIHsKK3B1YmxpYyBjbGFzcyBSZXNvdXJjZXMgZXh0ZW5kcyBqYXZhLnV0aWwuTGlzdFJlc291cmNlQnVuZGxlIHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdW10gY29udGVudHMgPSB7CiAKQEAgLTIyNyw2ICsyMjcsMTAgQEAKICAgICAgICAgICAgICAgICAiVGhlIHNpZ25lcidzIGNlcnRpZmljYXRlIGNoYWluIGlzIG5vdCB2YWxpZGF0ZWQuIn0sCiAgICAgICAgIHsiVGhpcy5qYXIuY29udGFpbnMuZW50cmllcy53aG9zZS5jZXJ0aWZpY2F0ZS5jaGFpbi5pcy5ub3QudmFsaWRhdGVkLiIsCiAgICAgICAgICAgICAgICAgICJUaGlzIGphciBjb250YWlucyBlbnRyaWVzIHdob3NlIGNlcnRpZmljYXRlIGNoYWluIGlzIG5vdCB2YWxpZGF0ZWQuIn0sCisgICAgICAgIHsiVW5rbm93bi5wYXNzd29yZC50eXBlLiIsICJVbmtub3duIHBhc3N3b3JkIHR5cGU6ICJ9LAorICAgICAgICB7IkNhbm5vdC5maW5kLmVudmlyb25tZW50LnZhcmlhYmxlLiIsCisgICAgICAgICAgICAgICAgIkNhbm5vdCBmaW5kIGVudmlyb25tZW50IHZhcmlhYmxlOiAifSwKKyAgICAgICAgeyJDYW5ub3QuZmluZC5maWxlLiIsICJDYW5ub3QgZmluZCBmaWxlOiAifSwKICAgICB9OwogCiAgICAgLyoqCkBAIC0yMzYsNiArMjQwLDcgQEAKICAgICAgKgogICAgICAqIEByZXR1cm4gdGhlIGNvbnRlbnRzIG9mIHRoaXMgPGNvZGU+UmVzb3VyY2VCdW5kbGU8L2NvZGU+LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBPYmplY3RbXVtdIGdldENvbnRlbnRzKCkgewogICAgICAgICByZXR1cm4gY29udGVudHM7CiAgICAgfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS90b29scy9KYXJTaWduZXJSZXNvdXJjZXNfamEuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdG9vbHMvamFyc2lnbmVyL1Jlc291cmNlc19qYS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggOTclCnJlbmFtZSBmcm9tIGpkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdG9vbHMvSmFyU2lnbmVyUmVzb3VyY2VzX2phLmphdmEKcmVuYW1lIHRvIGpkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdG9vbHMvamFyc2lnbmVyL1Jlc291cmNlc19qYS5qYXZhCmluZGV4IDA1YmY4M2MuLmVmNjhhNzIgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdG9vbHMvSmFyU2lnbmVyUmVzb3VyY2VzX2phLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS90b29scy9qYXJzaWduZXIvUmVzb3VyY2VzX2phLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMywxNCArMjMsMTQgQEAKICAqIHF1ZXN0aW9ucy4KICAqLwogCi1wYWNrYWdlIHN1bi5zZWN1cml0eS50b29sczsKK3BhY2thZ2Ugc3VuLnNlY3VyaXR5LnRvb2xzLmphcnNpZ25lcjsKIAogLyoqCiAgKiA8cD4gVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSA8Y29kZT5SZXNvdXJjZUJ1bmRsZTwvY29kZT4KICAqIGZvciBKYXJTaWduZXIuCiAgKgogICovCi1wdWJsaWMgY2xhc3MgSmFyU2lnbmVyUmVzb3VyY2VzX2phIGV4dGVuZHMgamF2YS51dGlsLkxpc3RSZXNvdXJjZUJ1bmRsZSB7CitwdWJsaWMgY2xhc3MgUmVzb3VyY2VzX2phIGV4dGVuZHMgamF2YS51dGlsLkxpc3RSZXNvdXJjZUJ1bmRsZSB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXVtdIGNvbnRlbnRzID0gewogCkBAIC0yMjUsNiArMjI1LDEwIEBACiAgICAgICAgICAgICAgICAgIlx1N0Y3Mlx1NTQwRFx1ODAwNVx1MzA2RVx1OEEzQ1x1NjYwRVx1NjZGOFx1MzBDMVx1MzBBN1x1MzBGQ1x1MzBGM1x1MzA0Q1x1MzA3RVx1MzA2MFx1NjkxQ1x1OEEzQ1x1MzA1NVx1MzA4Q1x1MzA2Nlx1MzA0NFx1MzA3RVx1MzA1Qlx1MzA5M1x1MzAwMiJ9LAogICAgICAgICB7IlRoaXMuamFyLmNvbnRhaW5zLmVudHJpZXMud2hvc2UuY2VydGlmaWNhdGUuY2hhaW4uaXMubm90LnZhbGlkYXRlZC4iLAogICAgICAgICAgICAgICAgICAiXHUzMDUzXHUzMDZFamFyXHUzMDZCXHUzMDZGXHUzMDAxXHU4QTNDXHU2NjBFXHU2NkY4XHUzMEMxXHUzMEE3XHUzMEZDXHUzMEYzXHUzMDRDXHUzMDdFXHUzMDYwXHU2OTFDXHU4QTNDXHUzMDU1XHUzMDhDXHUzMDY2XHUzMDQ0XHUzMDZBXHUzMDQ0XHUzMEE4XHUzMEYzXHUzMEM4XHUzMEVBXHUzMDRDXHU1NDJCXHUzMDdFXHUzMDhDXHUzMDY2XHUzMDQ0XHUzMDdFXHUzMDU5XHUzMDAyIn0sCisgICAgICAgIHsiVW5rbm93bi5wYXNzd29yZC50eXBlLiIsICJcdTRFMERcdTY2MEVcdTMwNkFcdTMwRDFcdTMwQjlcdTMwRUZcdTMwRkNcdTMwQzlcdTMwRkJcdTMwQkZcdTMwQTRcdTMwRDc6ICJ9LAorICAgICAgICB7IkNhbm5vdC5maW5kLmVudmlyb25tZW50LnZhcmlhYmxlLiIsCisgICAgICAgICAgICAgICAgIlx1NzRCMFx1NTg4M1x1NTkwOVx1NjU3MFx1MzA0Q1x1ODk4Qlx1MzA2NFx1MzA0Qlx1MzA4QVx1MzA3RVx1MzA1Qlx1MzA5MzogIn0sCisgICAgICAgIHsiQ2Fubm90LmZpbmQuZmlsZS4iLCAiXHUzMEQ1XHUzMEExXHUzMEE0XHUzMEVCXHUzMDRDXHU4OThCXHUzMDY0XHUzMDRCXHUzMDhBXHUzMDdFXHUzMDVCXHUzMDkzOiAifSwKICAgICB9OwogCiAgICAgLyoqCkBAIC0yMzQsNiArMjM4LDcgQEAKICAgICAgKgogICAgICAqIEByZXR1cm4gdGhlIGNvbnRlbnRzIG9mIHRoaXMgPGNvZGU+UmVzb3VyY2VCdW5kbGU8L2NvZGU+LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBPYmplY3RbXVtdIGdldENvbnRlbnRzKCkgewogICAgICAgICByZXR1cm4gY29udGVudHM7CiAgICAgfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS90b29scy9KYXJTaWduZXJSZXNvdXJjZXNfemhfQ04uamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdG9vbHMvamFyc2lnbmVyL1Jlc291cmNlc196aF9DTi5qYXZhCnNpbWlsYXJpdHkgaW5kZXggOTYlCnJlbmFtZSBmcm9tIGpkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdG9vbHMvSmFyU2lnbmVyUmVzb3VyY2VzX3poX0NOLmphdmEKcmVuYW1lIHRvIGpkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdG9vbHMvamFyc2lnbmVyL1Jlc291cmNlc196aF9DTi5qYXZhCmluZGV4IDQ4YjZjNzMuLjUwZTIyYTUgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdG9vbHMvSmFyU2lnbmVyUmVzb3VyY2VzX3poX0NOLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS90b29scy9qYXJzaWduZXIvUmVzb3VyY2VzX3poX0NOLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMywxNCArMjMsMTQgQEAKICAqIHF1ZXN0aW9ucy4KICAqLwogCi1wYWNrYWdlIHN1bi5zZWN1cml0eS50b29sczsKK3BhY2thZ2Ugc3VuLnNlY3VyaXR5LnRvb2xzLmphcnNpZ25lcjsKIAogLyoqCiAgKiA8cD4gVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSA8Y29kZT5SZXNvdXJjZUJ1bmRsZTwvY29kZT4KICAqIGZvciBKYXJTaWduZXIuCiAgKgogICovCi1wdWJsaWMgY2xhc3MgSmFyU2lnbmVyUmVzb3VyY2VzX3poX0NOIGV4dGVuZHMgamF2YS51dGlsLkxpc3RSZXNvdXJjZUJ1bmRsZSB7CitwdWJsaWMgY2xhc3MgUmVzb3VyY2VzX3poX0NOIGV4dGVuZHMgamF2YS51dGlsLkxpc3RSZXNvdXJjZUJ1bmRsZSB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXVtdIGNvbnRlbnRzID0gewogCkBAIC0yMjUsNiArMjI1LDExIEBACiAgICAgICAgICAgICAgICAgIlx1N0I3RVx1NTQwRFx1ODAwNVx1NzY4NFx1OEJDMVx1NEU2Nlx1OTRGRVx1NjcyQVx1OUE4Q1x1OEJDMVx1MzAwMiJ9LAogICAgICAgICB7IlRoaXMuamFyLmNvbnRhaW5zLmVudHJpZXMud2hvc2UuY2VydGlmaWNhdGUuY2hhaW4uaXMubm90LnZhbGlkYXRlZC4iLAogICAgICAgICAgICAgICAgICAiXHU2QjY0IGphciBcdTUzMDVcdTU0MkJcdThCQzFcdTRFNjZcdTk0RkVcdTY3MkFcdTlBOENcdThCQzFcdTc2ODRcdTY3NjFcdTc2RUVcdTMwMDIifSwKKyAgICAgICAgeyJVbmtub3duLnBhc3N3b3JkLnR5cGUuIiwgIlx1NjcyQVx1NzdFNVx1NTNFM1x1NEVFNFx1N0M3Qlx1NTc4QjogIn0sCisgICAgICAgIHsiQ2Fubm90LmZpbmQuZW52aXJvbm1lbnQudmFyaWFibGUuIiwKKyAgICAgICAgICAgICAgICAiXHU2MjdFXHU0RTBEXHU1MjMwXHU3M0FGXHU1ODgzXHU1M0Q4XHU5MUNGOiAifSwKKyAgICAgICAgeyJDYW5ub3QuZmluZC5maWxlLiIsICJcdTYyN0VcdTRFMERcdTUyMzBcdTY1ODdcdTRFRjY6ICJ9LAorICAgICAgICB7IkNvbW1hbmQub3B0aW9uLmZsYWcubmVlZHMuYW4uYXJndW1lbnQuIiwgIlx1NTQ3RFx1NEVFNFx1OTAwOVx1OTg3OXswfVx1OTcwMFx1ODk4MVx1NEUwMFx1NEUyQVx1NTNDMlx1NjU3MFx1MzAwMiJ9LAogICAgIH07CiAKICAgICAvKioKQEAgLTIzNCw2ICsyMzksNyBAQAogICAgICAqCiAgICAgICogQHJldHVybiB0aGUgY29udGVudHMgb2YgdGhpcyA8Y29kZT5SZXNvdXJjZUJ1bmRsZTwvY29kZT4uCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIE9iamVjdFtdW10gZ2V0Q29udGVudHMoKSB7CiAgICAgICAgIHJldHVybiBjb250ZW50czsKICAgICB9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3Rvb2xzL1RpbWVzdGFtcGVkU2lnbmVyLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3Rvb2xzL2phcnNpZ25lci9UaW1lc3RhbXBlZFNpZ25lci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIGpkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdG9vbHMvVGltZXN0YW1wZWRTaWduZXIuamF2YQpyZW5hbWUgdG8gamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS90b29scy9qYXJzaWduZXIvVGltZXN0YW1wZWRTaWduZXIuamF2YQppbmRleCA0ODQ4YTQwLi40Yjk1MmRlIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3Rvb2xzL1RpbWVzdGFtcGVkU2lnbmVyLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS90b29scy9qYXJzaWduZXIvVGltZXN0YW1wZWRTaWduZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIzLDcgKzIzLDcgQEAKICAqIHF1ZXN0aW9ucy4KICAqLwogCi1wYWNrYWdlIHN1bi5zZWN1cml0eS50b29sczsKK3BhY2thZ2Ugc3VuLnNlY3VyaXR5LnRvb2xzLmphcnNpZ25lcjsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5uZXQuVVJJOwpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS90b29scy9DZXJ0QW5kS2V5R2VuLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3Rvb2xzL2tleXRvb2wvQ2VydEFuZEtleUdlbi5qYXZhCnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIGpkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdG9vbHMvQ2VydEFuZEtleUdlbi5qYXZhCnJlbmFtZSB0byBqZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3Rvb2xzL2tleXRvb2wvQ2VydEFuZEtleUdlbi5qYXZhCmluZGV4IGZhZDQxMmUuLjZmNTU3YjYgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdG9vbHMvQ2VydEFuZEtleUdlbi5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdG9vbHMva2V5dG9vbC9DZXJ0QW5kS2V5R2VuLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAxOTk2LCAyMDExLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk2LCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMyw3ICsyMyw3IEBACiAgKiBxdWVzdGlvbnMuCiAgKi8KIAotcGFja2FnZSBzdW4uc2VjdXJpdHkudG9vbHM7CitwYWNrYWdlIHN1bi5zZWN1cml0eS50b29scy5rZXl0b29sOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlOwpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS90b29scy9LZXlUb29sLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3Rvb2xzL2tleXRvb2wvTWFpbi5qYXZhCnNpbWlsYXJpdHkgaW5kZXggOTclCnJlbmFtZSBmcm9tIGpkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdG9vbHMvS2V5VG9vbC5qYXZhCnJlbmFtZSB0byBqZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3Rvb2xzL2tleXRvb2wvTWFpbi5qYXZhCmluZGV4IDQ0ZmI0MGQuLmZkMzk5ZmMgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdG9vbHMvS2V5VG9vbC5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdG9vbHMva2V5dG9vbC9NYWluLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAxOTk3LCAyMDExLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMyw3ICsyMyw3IEBACiAgKiBxdWVzdGlvbnMuCiAgKi8KIAotcGFja2FnZSBzdW4uc2VjdXJpdHkudG9vbHM7CitwYWNrYWdlIHN1bi5zZWN1cml0eS50b29scy5rZXl0b29sOwogCiBpbXBvcnQgamF2YS5pby4qOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuQ29kZVNpZ25lcjsKQEAgLTc1LDEyICs3NSwxNCBAQAogCiBpbXBvcnQgc3VuLm1pc2MuQkFTRTY0RGVjb2RlcjsKIGltcG9ydCBzdW4uc2VjdXJpdHkucGtjcy5QS0NTOUF0dHJpYnV0ZTsKK2ltcG9ydCBzdW4uc2VjdXJpdHkudG9vbHMuS2V5U3RvcmVVdGlsOworaW1wb3J0IHN1bi5zZWN1cml0eS50b29scy5QYXRoTGlzdDsKIGltcG9ydCBzdW4uc2VjdXJpdHkudXRpbC5EZXJWYWx1ZTsKIGltcG9ydCBzdW4uc2VjdXJpdHkueDUwOS4qOwogCiBpbXBvcnQgc3RhdGljIGphdmEuc2VjdXJpdHkuS2V5U3RvcmUuKjsKLWltcG9ydCBzdGF0aWMgc3VuLnNlY3VyaXR5LnRvb2xzLktleVRvb2wuQ29tbWFuZC4qOwotaW1wb3J0IHN0YXRpYyBzdW4uc2VjdXJpdHkudG9vbHMuS2V5VG9vbC5PcHRpb24uKjsKK2ltcG9ydCBzdGF0aWMgc3VuLnNlY3VyaXR5LnRvb2xzLmtleXRvb2wuTWFpbi5Db21tYW5kLio7CitpbXBvcnQgc3RhdGljIHN1bi5zZWN1cml0eS50b29scy5rZXl0b29sLk1haW4uT3B0aW9uLio7CiAKIC8qKgogICogVGhpcyB0b29sIG1hbmFnZXMga2V5c3RvcmVzLgpAQCAtOTQsNyArOTYsNyBAQAogICoKICAqIEBzaW5jZSAxLjIKICAqLwotcHVibGljIGZpbmFsIGNsYXNzIEtleVRvb2wgeworcHVibGljIGZpbmFsIGNsYXNzIE1haW4gewogCiAgICAgcHJpdmF0ZSBib29sZWFuIGRlYnVnID0gZmFsc2U7CiAgICAgcHJpdmF0ZSBDb21tYW5kIGNvbW1hbmQgPSBudWxsOwpAQCAtMzA0LDcgKzMwNiw2IEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzc1tdIFBBUkFNX1NUUklORyA9IHsgU3RyaW5nLmNsYXNzIH07CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSktTID0gImprcyI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PTkUgPSAiTk9ORSI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFAxMUtFWVNUT1JFID0gIlBLQ1MxMSI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFAxMktFWVNUT1JFID0gIlBLQ1MxMiI7CkBAIC0zMTIsMTcgKzMxMywxOCBAQAogCiAgICAgLy8gZm9yIGkxOG4KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGUgcmIgPQotICAgICAgICBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJzdW4uc2VjdXJpdHkudXRpbC5SZXNvdXJjZXMiKTsKKyAgICAgICAgamF2YS51dGlsLlJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgKKyAgICAgICAgICAgICJzdW4uc2VjdXJpdHkudG9vbHMua2V5dG9vbC5SZXNvdXJjZXMiKTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDb2xsYXRvciBjb2xsYXRvciA9IENvbGxhdG9yLmdldEluc3RhbmNlKCk7CiAgICAgc3RhdGljIHsKICAgICAgICAgLy8gdGhpcyBpcyBmb3IgY2FzZSBpbnNlbnNpdGl2ZSBzdHJpbmcgY29tcGFyaXNvbnMKICAgICAgICAgY29sbGF0b3Iuc2V0U3RyZW5ndGgoQ29sbGF0b3IuUFJJTUFSWSk7CiAgICAgfTsKIAotICAgIHByaXZhdGUgS2V5VG9vbCgpIHsgfQorICAgIHByaXZhdGUgTWFpbigpIHsgfQogCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEtleVRvb2wga3QgPSBuZXcgS2V5VG9vbCgpOworICAgICAgICBNYWluIGt0ID0gbmV3IE1haW4oKTsKICAgICAgICAga3QucnVuKGFyZ3MsIFN5c3RlbS5vdXQpOwogICAgIH0KIApAQCAtOTA3LDcgKzkwOSw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAodHJ1c3RjYWNlcnRzKSB7Ci0gICAgICAgICAgICBjYWtzID0gZ2V0Q2FjZXJ0c0tleVN0b3JlKCk7CisgICAgICAgICAgICBjYWtzID0gS2V5U3RvcmVVdGlsLmdldENhY2VydHNLZXlTdG9yZSgpOwogICAgICAgICB9CiAKICAgICAgICAgLy8gUGVyZm9ybSB0aGUgc3BlY2lmaWVkIGNvbW1hbmQKQEAgLTIwNzYsNyArMjA3OCw3IEBACiAgICAgICAgICAgICAgICAgZm9yIChHZW5lcmFsTmFtZSBuYW1lOiBuYW1lcy5uYW1lcygpKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lLmdldFR5cGUoKSA9PSBHZW5lcmFsTmFtZUludGVyZmFjZS5OQU1FX1VSSSkgewogICAgICAgICAgICAgICAgICAgICAgICAgVVJJTmFtZSB1cmlOYW1lID0gKFVSSU5hbWUpbmFtZS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKENSTCBjcmw6IEtleVRvb2wubG9hZENSTHModXJpTmFtZS5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKENSTCBjcmw6IGxvYWRDUkxzKHVyaU5hbWUuZ2V0TmFtZSgpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjcmwgaW5zdGFuY2VvZiBYNTA5Q1JMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNybHMuYWRkKChYNTA5Q1JMKWNybCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMzM3MSwyNyArMzM3Myw2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUga2V5c3RvcmUgd2l0aCB0aGUgY29uZmlndXJlZCBDQSBjZXJ0aWZpY2F0ZXMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBLZXlTdG9yZSBnZXRDYWNlcnRzS2V5U3RvcmUoKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmcgc2VwID0gRmlsZS5zZXBhcmF0b3I7Ci0gICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5ob21lIikgKyBzZXAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAibGliIiArIHNlcCArICJzZWN1cml0eSIgKyBzZXAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiY2FjZXJ0cyIpOwotICAgICAgICBpZiAoIWZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIEtleVN0b3JlIGNha3MgPSBudWxsOwotICAgICAgICB0cnkgKEZpbGVJbnB1dFN0cmVhbSBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpKSB7Ci0gICAgICAgICAgICBjYWtzID0gS2V5U3RvcmUuZ2V0SW5zdGFuY2UoSktTKTsKLSAgICAgICAgICAgIGNha3MubG9hZChmaXMsIG51bGwpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjYWtzOwotICAgIH0KLQotICAgIC8qKgogICAgICAqIFN0b3JlcyB0aGUgKGxlYWYpIGNlcnRpZmljYXRlcyBvZiBhIGtleXN0b3JlIGluIGEgaGFzaHRhYmxlLgogICAgICAqIEFsbCBjZXJ0cyBiZWxvbmdpbmcgdG8gdGhlIHNhbWUgQ0EgYXJlIHN0b3JlZCBpbiBhIHZlY3RvciB0aGF0CiAgICAgICogaW4gdHVybiBpcyBzdG9yZWQgaW4gdGhlIGhhc2h0YWJsZSwga2V5ZWQgYnkgdGhlIENBJ3Mgc3ViamVjdCBETgpAQCAtNDA1Niw1OSArNDAzNywxMSBAQAogICAgIH0KIAogICAgIHByaXZhdGUgY2hhcltdIGdldFBhc3MoU3RyaW5nIG1vZGlmaWVyLCBTdHJpbmcgYXJnKSB7Ci0gICAgICAgIGNoYXJbXSBvdXRwdXQgPSBnZXRQYXNzV2l0aE1vZGlmaWVyKG1vZGlmaWVyLCBhcmcpOworICAgICAgICBjaGFyW10gb3V0cHV0ID0gS2V5U3RvcmVVdGlsLmdldFBhc3NXaXRoTW9kaWZpZXIobW9kaWZpZXIsIGFyZywgcmIpOwogICAgICAgICBpZiAob3V0cHV0ICE9IG51bGwpIHJldHVybiBvdXRwdXQ7CiAgICAgICAgIHRpbnlIZWxwKCk7CiAgICAgICAgIHJldHVybiBudWxsOyAgICAvLyBVc2VsZXNzLCB0aW55SGVscCgpIGFscmVhZHkgZXhpdHMuCiAgICAgfQotCi0gICAgLy8gVGhpcyBtZXRob2QgYWxzbyB1c2VkIGJ5IEphclNpZ25lcgotICAgIHB1YmxpYyBzdGF0aWMgY2hhcltdIGdldFBhc3NXaXRoTW9kaWZpZXIoU3RyaW5nIG1vZGlmaWVyLCBTdHJpbmcgYXJnKSB7Ci0gICAgICAgIGlmIChtb2RpZmllciA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gYXJnLnRvQ2hhckFycmF5KCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoY29sbGF0b3IuY29tcGFyZShtb2RpZmllciwgImVudiIpID09IDApIHsKLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IFN5c3RlbS5nZXRlbnYoYXJnKTsKLSAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKHJiLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QuZmluZC5lbnZpcm9ubWVudC52YXJpYWJsZS4iKSArIGFyZyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS50b0NoYXJBcnJheSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGNvbGxhdG9yLmNvbXBhcmUobW9kaWZpZXIsICJmaWxlIikgPT0gMCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBVUkwgdXJsID0gbnVsbDsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICB1cmwgPSBuZXcgVVJMKGFyZyk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG11ZSkgewotICAgICAgICAgICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShhcmcpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZi5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdXJsID0gZi50b1VSSSgpLnRvVVJMKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4ocmIuZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90LmZpbmQuZmlsZS4iKSArIGFyZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBCdWZmZXJlZFJlYWRlciBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsLm9wZW5TdHJlYW0oKSkpOwotICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGJyLnJlYWRMaW5lKCk7Ci0gICAgICAgICAgICAgICAgYnIuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IGNoYXJbMF07Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnRvQ2hhckFycmF5KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKGlvZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4ocmIuZ2V0U3RyaW5nKCJVbmtub3duLnBhc3N3b3JkLnR5cGUuIikgKwotICAgICAgICAgICAgICAgICAgICBtb2RpZmllcik7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KIH0KIAogLy8gVGhpcyBjbGFzcyBpcyBleGFjdGx5IHRoZSBzYW1lIGFzIGNvbS5zdW4udG9vbHMuamF2YWMudXRpbC5QYWlyLApkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS90b29scy9rZXl0b29sL1Jlc291cmNlcy5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS90b29scy9rZXl0b29sL1Jlc291cmNlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2MmZlMjAKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3Rvb2xzL2tleXRvb2wvUmVzb3VyY2VzLmphdmEKQEAgLTAsMCArMSw0MzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IE9yYWNsZSBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQorICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQorICogcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2Ugc3VuLnNlY3VyaXR5LnRvb2xzLmtleXRvb2w7CisKKy8qKgorICogPHA+IFRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgPGNvZGU+UmVzb3VyY2VCdW5kbGU8L2NvZGU+CisgKiBmb3IgdGhlIGtleXRvb2wuCisgKgorICovCitwdWJsaWMgY2xhc3MgUmVzb3VyY2VzIGV4dGVuZHMgamF2YS51dGlsLkxpc3RSZXNvdXJjZUJ1bmRsZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXVtdIGNvbnRlbnRzID0geworICAgICAgICB7Ik5FV0xJTkUiLCAiXG4ifSwKKyAgICAgICAgeyJTVEFSIiwKKyAgICAgICAgICAgICAgICAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiJ9LAorICAgICAgICB7IlNUQVJOTiIsCisgICAgICAgICAgICAgICAgIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuIn0sCisKKyAgICAgICAgLy8ga2V5dG9vbDogSGVscCBwYXJ0CisgICAgICAgIHsiLk9QVElPTi4iLCAiIFtPUFRJT05dLi4uIn0sCisgICAgICAgIHsiT3B0aW9ucy4iLCAiT3B0aW9uczoifSwKKyAgICAgICAgeyJVc2Uua2V5dG9vbC5oZWxwLmZvci5hbGwuYXZhaWxhYmxlLmNvbW1hbmRzIiwKKyAgICAgICAgICAgICAgICAgIlVzZSBcImtleXRvb2wgLWhlbHBcIiBmb3IgYWxsIGF2YWlsYWJsZSBjb21tYW5kcyJ9LAorICAgICAgICB7IktleS5hbmQuQ2VydGlmaWNhdGUuTWFuYWdlbWVudC5Ub29sIiwKKyAgICAgICAgICAgICAgICAgIktleSBhbmQgQ2VydGlmaWNhdGUgTWFuYWdlbWVudCBUb29sIn0sCisgICAgICAgIHsiQ29tbWFuZHMuIiwgIkNvbW1hbmRzOiJ9LAorICAgICAgICB7IlVzZS5rZXl0b29sLmNvbW1hbmQubmFtZS5oZWxwLmZvci51c2FnZS5vZi5jb21tYW5kLm5hbWUiLAorICAgICAgICAgICAgICAgICJVc2UgXCJrZXl0b29sIC1jb21tYW5kX25hbWUgLWhlbHBcIiBmb3IgdXNhZ2Ugb2YgY29tbWFuZF9uYW1lIn0sCisgICAgICAgIC8vIGtleXRvb2w6IGhlbHA6IGNvbW1hbmRzCisgICAgICAgIHsiR2VuZXJhdGVzLmEuY2VydGlmaWNhdGUucmVxdWVzdCIsCisgICAgICAgICAgICAgICAgIkdlbmVyYXRlcyBhIGNlcnRpZmljYXRlIHJlcXVlc3QifSwgLy8tY2VydHJlcQorICAgICAgICB7IkNoYW5nZXMuYW4uZW50cnkucy5hbGlhcyIsCisgICAgICAgICAgICAgICAgIkNoYW5nZXMgYW4gZW50cnkncyBhbGlhcyJ9LCAvLy1jaGFuZ2VhbGlhcworICAgICAgICB7IkRlbGV0ZXMuYW4uZW50cnkiLAorICAgICAgICAgICAgICAgICJEZWxldGVzIGFuIGVudHJ5In0sIC8vLWRlbGV0ZQorICAgICAgICB7IkV4cG9ydHMuY2VydGlmaWNhdGUiLAorICAgICAgICAgICAgICAgICJFeHBvcnRzIGNlcnRpZmljYXRlIn0sIC8vLWV4cG9ydGNlcnQKKyAgICAgICAgeyJHZW5lcmF0ZXMuYS5rZXkucGFpciIsCisgICAgICAgICAgICAgICAgIkdlbmVyYXRlcyBhIGtleSBwYWlyIn0sIC8vLWdlbmtleXBhaXIKKyAgICAgICAgeyJHZW5lcmF0ZXMuYS5zZWNyZXQua2V5IiwKKyAgICAgICAgICAgICAgICAiR2VuZXJhdGVzIGEgc2VjcmV0IGtleSJ9LCAvLy1nZW5zZWNrZXkKKyAgICAgICAgeyJHZW5lcmF0ZXMuY2VydGlmaWNhdGUuZnJvbS5hLmNlcnRpZmljYXRlLnJlcXVlc3QiLAorICAgICAgICAgICAgICAgICJHZW5lcmF0ZXMgY2VydGlmaWNhdGUgZnJvbSBhIGNlcnRpZmljYXRlIHJlcXVlc3QifSwgLy8tZ2VuY2VydAorICAgICAgICB7IkdlbmVyYXRlcy5DUkwiLCAiR2VuZXJhdGVzIENSTCJ9LCAvLy1nZW5jcmwKKyAgICAgICAgeyJJbXBvcnRzLmVudHJpZXMuZnJvbS5hLkpESy4xLjEueC5zdHlsZS5pZGVudGl0eS5kYXRhYmFzZSIsCisgICAgICAgICAgICAgICAgIkltcG9ydHMgZW50cmllcyBmcm9tIGEgSkRLIDEuMS54LXN0eWxlIGlkZW50aXR5IGRhdGFiYXNlIn0sIC8vLWlkZW50aXR5ZGIKKyAgICAgICAgeyJJbXBvcnRzLmEuY2VydGlmaWNhdGUub3IuYS5jZXJ0aWZpY2F0ZS5jaGFpbiIsCisgICAgICAgICAgICAgICAgIkltcG9ydHMgYSBjZXJ0aWZpY2F0ZSBvciBhIGNlcnRpZmljYXRlIGNoYWluIn0sIC8vLWltcG9ydGNlcnQKKyAgICAgICAgeyJJbXBvcnRzLm9uZS5vci5hbGwuZW50cmllcy5mcm9tLmFub3RoZXIua2V5c3RvcmUiLAorICAgICAgICAgICAgICAgICJJbXBvcnRzIG9uZSBvciBhbGwgZW50cmllcyBmcm9tIGFub3RoZXIga2V5c3RvcmUifSwgLy8taW1wb3J0a2V5c3RvcmUKKyAgICAgICAgeyJDbG9uZXMuYS5rZXkuZW50cnkiLAorICAgICAgICAgICAgICAgICJDbG9uZXMgYSBrZXkgZW50cnkifSwgLy8ta2V5Y2xvbmUKKyAgICAgICAgeyJDaGFuZ2VzLnRoZS5rZXkucGFzc3dvcmQub2YuYW4uZW50cnkiLAorICAgICAgICAgICAgICAgICJDaGFuZ2VzIHRoZSBrZXkgcGFzc3dvcmQgb2YgYW4gZW50cnkifSwgLy8ta2V5cGFzc3dkCisgICAgICAgIHsiTGlzdHMuZW50cmllcy5pbi5hLmtleXN0b3JlIiwKKyAgICAgICAgICAgICAgICAiTGlzdHMgZW50cmllcyBpbiBhIGtleXN0b3JlIn0sIC8vLWxpc3QKKyAgICAgICAgeyJQcmludHMudGhlLmNvbnRlbnQub2YuYS5jZXJ0aWZpY2F0ZSIsCisgICAgICAgICAgICAgICAgIlByaW50cyB0aGUgY29udGVudCBvZiBhIGNlcnRpZmljYXRlIn0sIC8vLXByaW50Y2VydAorICAgICAgICB7IlByaW50cy50aGUuY29udGVudC5vZi5hLmNlcnRpZmljYXRlLnJlcXVlc3QiLAorICAgICAgICAgICAgICAgICJQcmludHMgdGhlIGNvbnRlbnQgb2YgYSBjZXJ0aWZpY2F0ZSByZXF1ZXN0In0sIC8vLXByaW50Y2VydHJlcQorICAgICAgICB7IlByaW50cy50aGUuY29udGVudC5vZi5hLkNSTC5maWxlIiwKKyAgICAgICAgICAgICAgICAiUHJpbnRzIHRoZSBjb250ZW50IG9mIGEgQ1JMIGZpbGUifSwgLy8tcHJpbnRjcmwKKyAgICAgICAgeyJHZW5lcmF0ZXMuYS5zZWxmLnNpZ25lZC5jZXJ0aWZpY2F0ZSIsCisgICAgICAgICAgICAgICAgIkdlbmVyYXRlcyBhIHNlbGYtc2lnbmVkIGNlcnRpZmljYXRlIn0sIC8vLXNlbGZjZXJ0CisgICAgICAgIHsiQ2hhbmdlcy50aGUuc3RvcmUucGFzc3dvcmQub2YuYS5rZXlzdG9yZSIsCisgICAgICAgICAgICAgICAgIkNoYW5nZXMgdGhlIHN0b3JlIHBhc3N3b3JkIG9mIGEga2V5c3RvcmUifSwgLy8tc3RvcmVwYXNzd2QKKyAgICAgICAgLy8ga2V5dG9vbDogaGVscDogb3B0aW9ucworICAgICAgICB7ImFsaWFzLm5hbWUub2YudGhlLmVudHJ5LnRvLnByb2Nlc3MiLAorICAgICAgICAgICAgICAgICJhbGlhcyBuYW1lIG9mIHRoZSBlbnRyeSB0byBwcm9jZXNzIn0sIC8vLWFsaWFzCisgICAgICAgIHsiZGVzdGluYXRpb24uYWxpYXMiLAorICAgICAgICAgICAgICAgICJkZXN0aW5hdGlvbiBhbGlhcyJ9LCAvLy1kZXN0YWxpYXMKKyAgICAgICAgeyJkZXN0aW5hdGlvbi5rZXkucGFzc3dvcmQiLAorICAgICAgICAgICAgICAgICJkZXN0aW5hdGlvbiBrZXkgcGFzc3dvcmQifSwgLy8tZGVzdGtleXBhc3MKKyAgICAgICAgeyJkZXN0aW5hdGlvbi5rZXlzdG9yZS5uYW1lIiwKKyAgICAgICAgICAgICAgICAiZGVzdGluYXRpb24ga2V5c3RvcmUgbmFtZSJ9LCAvLy1kZXN0a2V5c3RvcmUKKyAgICAgICAgeyJkZXN0aW5hdGlvbi5rZXlzdG9yZS5wYXNzd29yZC5wcm90ZWN0ZWQiLAorICAgICAgICAgICAgICAgICJkZXN0aW5hdGlvbiBrZXlzdG9yZSBwYXNzd29yZCBwcm90ZWN0ZWQifSwgLy8tZGVzdHByb3RlY3RlZAorICAgICAgICB7ImRlc3RpbmF0aW9uLmtleXN0b3JlLnByb3ZpZGVyLm5hbWUiLAorICAgICAgICAgICAgICAgICJkZXN0aW5hdGlvbiBrZXlzdG9yZSBwcm92aWRlciBuYW1lIn0sIC8vLWRlc3Rwcm92aWRlcm5hbWUKKyAgICAgICAgeyJkZXN0aW5hdGlvbi5rZXlzdG9yZS5wYXNzd29yZCIsCisgICAgICAgICAgICAgICAgImRlc3RpbmF0aW9uIGtleXN0b3JlIHBhc3N3b3JkIn0sIC8vLWRlc3RzdG9yZXBhc3MKKyAgICAgICAgeyJkZXN0aW5hdGlvbi5rZXlzdG9yZS50eXBlIiwKKyAgICAgICAgICAgICAgICAiZGVzdGluYXRpb24ga2V5c3RvcmUgdHlwZSJ9LCAvLy1kZXN0c3RvcmV0eXBlCisgICAgICAgIHsiZGlzdGluZ3Vpc2hlZC5uYW1lIiwKKyAgICAgICAgICAgICAgICAiZGlzdGluZ3Vpc2hlZCBuYW1lIn0sIC8vLWRuYW1lCisgICAgICAgIHsiWC41MDkuZXh0ZW5zaW9uIiwKKyAgICAgICAgICAgICAgICAiWC41MDkgZXh0ZW5zaW9uIn0sIC8vLWV4dAorICAgICAgICB7Im91dHB1dC5maWxlLm5hbWUiLAorICAgICAgICAgICAgICAgICJvdXRwdXQgZmlsZSBuYW1lIn0sIC8vLWZpbGUgYW5kIC1vdXRmaWxlCisgICAgICAgIHsiaW5wdXQuZmlsZS5uYW1lIiwKKyAgICAgICAgICAgICAgICAiaW5wdXQgZmlsZSBuYW1lIn0sIC8vLWZpbGUgYW5kIC1pbmZpbGUKKyAgICAgICAgeyJrZXkuYWxnb3JpdGhtLm5hbWUiLAorICAgICAgICAgICAgICAgICJrZXkgYWxnb3JpdGhtIG5hbWUifSwgLy8ta2V5YWxnCisgICAgICAgIHsia2V5LnBhc3N3b3JkIiwKKyAgICAgICAgICAgICAgICAia2V5IHBhc3N3b3JkIn0sIC8vLWtleXBhc3MKKyAgICAgICAgeyJrZXkuYml0LnNpemUiLAorICAgICAgICAgICAgICAgICJrZXkgYml0IHNpemUifSwgLy8ta2V5c2l6ZQorICAgICAgICB7ImtleXN0b3JlLm5hbWUiLAorICAgICAgICAgICAgICAgICJrZXlzdG9yZSBuYW1lIn0sIC8vLWtleXN0b3JlCisgICAgICAgIHsibmV3LnBhc3N3b3JkIiwKKyAgICAgICAgICAgICAgICAibmV3IHBhc3N3b3JkIn0sIC8vLW5ldworICAgICAgICB7ImRvLm5vdC5wcm9tcHQiLAorICAgICAgICAgICAgICAgICJkbyBub3QgcHJvbXB0In0sIC8vLW5vcHJvbXB0CisgICAgICAgIHsicGFzc3dvcmQudGhyb3VnaC5wcm90ZWN0ZWQubWVjaGFuaXNtIiwKKyAgICAgICAgICAgICAgICAicGFzc3dvcmQgdGhyb3VnaCBwcm90ZWN0ZWQgbWVjaGFuaXNtIn0sIC8vLXByb3RlY3RlZAorICAgICAgICB7InByb3ZpZGVyLmFyZ3VtZW50IiwKKyAgICAgICAgICAgICAgICAicHJvdmlkZXIgYXJndW1lbnQifSwgLy8tcHJvdmlkZXJhcmcKKyAgICAgICAgeyJwcm92aWRlci5jbGFzcy5uYW1lIiwKKyAgICAgICAgICAgICAgICAicHJvdmlkZXIgY2xhc3MgbmFtZSJ9LCAvLy1wcm92aWRlcmNsYXNzCisgICAgICAgIHsicHJvdmlkZXIubmFtZSIsCisgICAgICAgICAgICAgICAgInByb3ZpZGVyIG5hbWUifSwgLy8tcHJvdmlkZXJuYW1lCisgICAgICAgIHsicHJvdmlkZXIuY2xhc3NwYXRoIiwKKyAgICAgICAgICAgICAgICAicHJvdmlkZXIgY2xhc3NwYXRoIn0sIC8vLXByb3ZpZGVycGF0aAorICAgICAgICB7Im91dHB1dC5pbi5SRkMuc3R5bGUiLAorICAgICAgICAgICAgICAgICJvdXRwdXQgaW4gUkZDIHN0eWxlIn0sIC8vLXJmYworICAgICAgICB7InNpZ25hdHVyZS5hbGdvcml0aG0ubmFtZSIsCisgICAgICAgICAgICAgICAgInNpZ25hdHVyZSBhbGdvcml0aG0gbmFtZSJ9LCAvLy1zaWdhbGcKKyAgICAgICAgeyJzb3VyY2UuYWxpYXMiLAorICAgICAgICAgICAgICAgICJzb3VyY2UgYWxpYXMifSwgLy8tc3JjYWxpYXMKKyAgICAgICAgeyJzb3VyY2Uua2V5LnBhc3N3b3JkIiwKKyAgICAgICAgICAgICAgICAic291cmNlIGtleSBwYXNzd29yZCJ9LCAvLy1zcmNrZXlwYXNzCisgICAgICAgIHsic291cmNlLmtleXN0b3JlLm5hbWUiLAorICAgICAgICAgICAgICAgICJzb3VyY2Uga2V5c3RvcmUgbmFtZSJ9LCAvLy1zcmNrZXlzdG9yZQorICAgICAgICB7InNvdXJjZS5rZXlzdG9yZS5wYXNzd29yZC5wcm90ZWN0ZWQiLAorICAgICAgICAgICAgICAgICJzb3VyY2Uga2V5c3RvcmUgcGFzc3dvcmQgcHJvdGVjdGVkIn0sIC8vLXNyY3Byb3RlY3RlZAorICAgICAgICB7InNvdXJjZS5rZXlzdG9yZS5wcm92aWRlci5uYW1lIiwKKyAgICAgICAgICAgICAgICAic291cmNlIGtleXN0b3JlIHByb3ZpZGVyIG5hbWUifSwgLy8tc3JjcHJvdmlkZXJuYW1lCisgICAgICAgIHsic291cmNlLmtleXN0b3JlLnBhc3N3b3JkIiwKKyAgICAgICAgICAgICAgICAic291cmNlIGtleXN0b3JlIHBhc3N3b3JkIn0sIC8vLXNyY3N0b3JlcGFzcworICAgICAgICB7InNvdXJjZS5rZXlzdG9yZS50eXBlIiwKKyAgICAgICAgICAgICAgICAic291cmNlIGtleXN0b3JlIHR5cGUifSwgLy8tc3Jjc3RvcmV0eXBlCisgICAgICAgIHsiU1NMLnNlcnZlci5ob3N0LmFuZC5wb3J0IiwKKyAgICAgICAgICAgICAgICAiU1NMIHNlcnZlciBob3N0IGFuZCBwb3J0In0sIC8vLXNzbHNlcnZlcgorICAgICAgICB7InNpZ25lZC5qYXIuZmlsZSIsCisgICAgICAgICAgICAgICAgInNpZ25lZCBqYXIgZmlsZSJ9LCAvLz1qYXJmaWxlCisgICAgICAgIHsiY2VydGlmaWNhdGUudmFsaWRpdHkuc3RhcnQuZGF0ZS50aW1lIiwKKyAgICAgICAgICAgICAgICAiY2VydGlmaWNhdGUgdmFsaWRpdHkgc3RhcnQgZGF0ZS90aW1lIn0sIC8vLXN0YXJ0ZGF0ZQorICAgICAgICB7ImtleXN0b3JlLnBhc3N3b3JkIiwKKyAgICAgICAgICAgICAgICAia2V5c3RvcmUgcGFzc3dvcmQifSwgLy8tc3RvcmVwYXNzCisgICAgICAgIHsia2V5c3RvcmUudHlwZSIsCisgICAgICAgICAgICAgICAgImtleXN0b3JlIHR5cGUifSwgLy8tc3RvcmV0eXBlCisgICAgICAgIHsidHJ1c3QuY2VydGlmaWNhdGVzLmZyb20uY2FjZXJ0cyIsCisgICAgICAgICAgICAgICAgInRydXN0IGNlcnRpZmljYXRlcyBmcm9tIGNhY2VydHMifSwgLy8tdHJ1c3RjYWNlcnRzCisgICAgICAgIHsidmVyYm9zZS5vdXRwdXQiLAorICAgICAgICAgICAgICAgICJ2ZXJib3NlIG91dHB1dCJ9LCAvLy12CisgICAgICAgIHsidmFsaWRpdHkubnVtYmVyLm9mLmRheXMiLAorICAgICAgICAgICAgICAgICJ2YWxpZGl0eSBudW1iZXIgb2YgZGF5cyJ9LCAvLy12YWxpZGl0eQorICAgICAgICB7IlNlcmlhbC5JRC5vZi5jZXJ0LnRvLnJldm9rZSIsCisgICAgICAgICAgICAgICAgICJTZXJpYWwgSUQgb2YgY2VydCB0byByZXZva2UifSwgLy8taWQKKyAgICAgICAgLy8ga2V5dG9vbDogUnVubmluZyBwYXJ0CisgICAgICAgIHsia2V5dG9vbC5lcnJvci4iLCAia2V5dG9vbCBlcnJvcjogIn0sCisgICAgICAgIHsiSWxsZWdhbC5vcHRpb24uIiwgIklsbGVnYWwgb3B0aW9uOiAgIn0sCisgICAgICAgIHsiSWxsZWdhbC52YWx1ZS4iLCAiSWxsZWdhbCB2YWx1ZTogIn0sCisgICAgICAgIHsiVW5rbm93bi5wYXNzd29yZC50eXBlLiIsICJVbmtub3duIHBhc3N3b3JkIHR5cGU6ICJ9LAorICAgICAgICB7IkNhbm5vdC5maW5kLmVudmlyb25tZW50LnZhcmlhYmxlLiIsCisgICAgICAgICAgICAgICAgIkNhbm5vdCBmaW5kIGVudmlyb25tZW50IHZhcmlhYmxlOiAifSwKKyAgICAgICAgeyJDYW5ub3QuZmluZC5maWxlLiIsICJDYW5ub3QgZmluZCBmaWxlOiAifSwKKyAgICAgICAgeyJDb21tYW5kLm9wdGlvbi5mbGFnLm5lZWRzLmFuLmFyZ3VtZW50LiIsICJDb21tYW5kIG9wdGlvbiB7MH0gbmVlZHMgYW4gYXJndW1lbnQuIn0sCisgICAgICAgIHsiV2FybmluZy5EaWZmZXJlbnQuc3RvcmUuYW5kLmtleS5wYXNzd29yZHMubm90LnN1cHBvcnRlZC5mb3IuUEtDUzEyLktleVN0b3Jlcy5JZ25vcmluZy51c2VyLnNwZWNpZmllZC5jb21tYW5kLnZhbHVlLiIsCisgICAgICAgICAgICAgICAgIldhcm5pbmc6ICBEaWZmZXJlbnQgc3RvcmUgYW5kIGtleSBwYXNzd29yZHMgbm90IHN1cHBvcnRlZCBmb3IgUEtDUzEyIEtleVN0b3Jlcy4gSWdub3JpbmcgdXNlci1zcGVjaWZpZWQgezB9IHZhbHVlLiJ9LAorICAgICAgICB7Ii5rZXlzdG9yZS5tdXN0LmJlLk5PTkUuaWYuc3RvcmV0eXBlLmlzLnswfSIsCisgICAgICAgICAgICAgICAgIi1rZXlzdG9yZSBtdXN0IGJlIE5PTkUgaWYgLXN0b3JldHlwZSBpcyB7MH0ifSwKKyAgICAgICAgeyJUb28ubWFueS5yZXRyaWVzLnByb2dyYW0udGVybWluYXRlZCIsCisgICAgICAgICAgICAgICAgICJUb28gbWFueSByZXRyaWVzLCBwcm9ncmFtIHRlcm1pbmF0ZWQifSwKKyAgICAgICAgeyIuc3RvcmVwYXNzd2QuYW5kLmtleXBhc3N3ZC5jb21tYW5kcy5ub3Quc3VwcG9ydGVkLmlmLnN0b3JldHlwZS5pcy57MH0iLAorICAgICAgICAgICAgICAgICItc3RvcmVwYXNzd2QgYW5kIC1rZXlwYXNzd2QgY29tbWFuZHMgbm90IHN1cHBvcnRlZCBpZiAtc3RvcmV0eXBlIGlzIHswfSJ9LAorICAgICAgICB7Ii5rZXlwYXNzd2QuY29tbWFuZHMubm90LnN1cHBvcnRlZC5pZi5zdG9yZXR5cGUuaXMuUEtDUzEyIiwKKyAgICAgICAgICAgICAgICAiLWtleXBhc3N3ZCBjb21tYW5kcyBub3Qgc3VwcG9ydGVkIGlmIC1zdG9yZXR5cGUgaXMgUEtDUzEyIn0sCisgICAgICAgIHsiLmtleXBhc3MuYW5kLm5ldy5jYW4ubm90LmJlLnNwZWNpZmllZC5pZi5zdG9yZXR5cGUuaXMuezB9IiwKKyAgICAgICAgICAgICAgICAiLWtleXBhc3MgYW5kIC1uZXcgY2FuIG5vdCBiZSBzcGVjaWZpZWQgaWYgLXN0b3JldHlwZSBpcyB7MH0ifSwKKyAgICAgICAgeyJpZi5wcm90ZWN0ZWQuaXMuc3BlY2lmaWVkLnRoZW4uc3RvcmVwYXNzLmtleXBhc3MuYW5kLm5ldy5tdXN0Lm5vdC5iZS5zcGVjaWZpZWQiLAorICAgICAgICAgICAgICAgICJpZiAtcHJvdGVjdGVkIGlzIHNwZWNpZmllZCwgdGhlbiAtc3RvcmVwYXNzLCAta2V5cGFzcywgYW5kIC1uZXcgbXVzdCBub3QgYmUgc3BlY2lmaWVkIn0sCisgICAgICAgIHsiaWYuc3JjcHJvdGVjdGVkLmlzLnNwZWNpZmllZC50aGVuLnNyY3N0b3JlcGFzcy5hbmQuc3Jja2V5cGFzcy5tdXN0Lm5vdC5iZS5zcGVjaWZpZWQiLAorICAgICAgICAgICAgICAgICJpZiAtc3JjcHJvdGVjdGVkIGlzIHNwZWNpZmllZCwgdGhlbiAtc3Jjc3RvcmVwYXNzIGFuZCAtc3Jja2V5cGFzcyBtdXN0IG5vdCBiZSBzcGVjaWZpZWQifSwKKyAgICAgICAgeyJpZi5rZXlzdG9yZS5pcy5ub3QucGFzc3dvcmQucHJvdGVjdGVkLnRoZW4uc3RvcmVwYXNzLmtleXBhc3MuYW5kLm5ldy5tdXN0Lm5vdC5iZS5zcGVjaWZpZWQiLAorICAgICAgICAgICAgICAgICJpZiBrZXlzdG9yZSBpcyBub3QgcGFzc3dvcmQgcHJvdGVjdGVkLCB0aGVuIC1zdG9yZXBhc3MsIC1rZXlwYXNzLCBhbmQgLW5ldyBtdXN0IG5vdCBiZSBzcGVjaWZpZWQifSwKKyAgICAgICAgeyJpZi5zb3VyY2Uua2V5c3RvcmUuaXMubm90LnBhc3N3b3JkLnByb3RlY3RlZC50aGVuLnNyY3N0b3JlcGFzcy5hbmQuc3Jja2V5cGFzcy5tdXN0Lm5vdC5iZS5zcGVjaWZpZWQiLAorICAgICAgICAgICAgICAgICJpZiBzb3VyY2Uga2V5c3RvcmUgaXMgbm90IHBhc3N3b3JkIHByb3RlY3RlZCwgdGhlbiAtc3Jjc3RvcmVwYXNzIGFuZCAtc3Jja2V5cGFzcyBtdXN0IG5vdCBiZSBzcGVjaWZpZWQifSwKKyAgICAgICAgeyJJbGxlZ2FsLnN0YXJ0ZGF0ZS52YWx1ZSIsICJJbGxlZ2FsIHN0YXJ0ZGF0ZSB2YWx1ZSJ9LAorICAgICAgICB7IlZhbGlkaXR5Lm11c3QuYmUuZ3JlYXRlci50aGFuLnplcm8iLAorICAgICAgICAgICAgICAgICJWYWxpZGl0eSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvIn0sCisgICAgICAgIHsicHJvdk5hbWUubm90LmEucHJvdmlkZXIiLCAiezB9IG5vdCBhIHByb3ZpZGVyIn0sCisgICAgICAgIHsiVXNhZ2UuZXJyb3Iubm8uY29tbWFuZC5wcm92aWRlZCIsICJVc2FnZSBlcnJvcjogbm8gY29tbWFuZCBwcm92aWRlZCJ9LAorICAgICAgICB7IlNvdXJjZS5rZXlzdG9yZS5maWxlLmV4aXN0cy5idXQuaXMuZW1wdHkuIiwgIlNvdXJjZSBrZXlzdG9yZSBmaWxlIGV4aXN0cywgYnV0IGlzIGVtcHR5OiAifSwKKyAgICAgICAgeyJQbGVhc2Uuc3BlY2lmeS5zcmNrZXlzdG9yZSIsICJQbGVhc2Ugc3BlY2lmeSAtc3Jja2V5c3RvcmUifSwKKyAgICAgICAgeyJNdXN0Lm5vdC5zcGVjaWZ5LmJvdGgudi5hbmQucmZjLndpdGgubGlzdC5jb21tYW5kIiwKKyAgICAgICAgICAgICAgICAiTXVzdCBub3Qgc3BlY2lmeSBib3RoIC12IGFuZCAtcmZjIHdpdGggJ2xpc3QnIGNvbW1hbmQifSwKKyAgICAgICAgeyJLZXkucGFzc3dvcmQubXVzdC5iZS5hdC5sZWFzdC42LmNoYXJhY3RlcnMiLAorICAgICAgICAgICAgICAgICJLZXkgcGFzc3dvcmQgbXVzdCBiZSBhdCBsZWFzdCA2IGNoYXJhY3RlcnMifSwKKyAgICAgICAgeyJOZXcucGFzc3dvcmQubXVzdC5iZS5hdC5sZWFzdC42LmNoYXJhY3RlcnMiLAorICAgICAgICAgICAgICAgICJOZXcgcGFzc3dvcmQgbXVzdCBiZSBhdCBsZWFzdCA2IGNoYXJhY3RlcnMifSwKKyAgICAgICAgeyJLZXlzdG9yZS5maWxlLmV4aXN0cy5idXQuaXMuZW1wdHkuIiwKKyAgICAgICAgICAgICAgICAiS2V5c3RvcmUgZmlsZSBleGlzdHMsIGJ1dCBpcyBlbXB0eTogIn0sCisgICAgICAgIHsiS2V5c3RvcmUuZmlsZS5kb2VzLm5vdC5leGlzdC4iLAorICAgICAgICAgICAgICAgICJLZXlzdG9yZSBmaWxlIGRvZXMgbm90IGV4aXN0OiAifSwKKyAgICAgICAgeyJNdXN0LnNwZWNpZnkuZGVzdGluYXRpb24uYWxpYXMiLCAiTXVzdCBzcGVjaWZ5IGRlc3RpbmF0aW9uIGFsaWFzIn0sCisgICAgICAgIHsiTXVzdC5zcGVjaWZ5LmFsaWFzIiwgIk11c3Qgc3BlY2lmeSBhbGlhcyJ9LAorICAgICAgICB7IktleXN0b3JlLnBhc3N3b3JkLm11c3QuYmUuYXQubGVhc3QuNi5jaGFyYWN0ZXJzIiwKKyAgICAgICAgICAgICAgICAiS2V5c3RvcmUgcGFzc3dvcmQgbXVzdCBiZSBhdCBsZWFzdCA2IGNoYXJhY3RlcnMifSwKKyAgICAgICAgeyJFbnRlci5rZXlzdG9yZS5wYXNzd29yZC4iLCAiRW50ZXIga2V5c3RvcmUgcGFzc3dvcmQ6ICAifSwKKyAgICAgICAgeyJFbnRlci5zb3VyY2Uua2V5c3RvcmUucGFzc3dvcmQuIiwgIkVudGVyIHNvdXJjZSBrZXlzdG9yZSBwYXNzd29yZDogICJ9LAorICAgICAgICB7IkVudGVyLmRlc3RpbmF0aW9uLmtleXN0b3JlLnBhc3N3b3JkLiIsICJFbnRlciBkZXN0aW5hdGlvbiBrZXlzdG9yZSBwYXNzd29yZDogICJ9LAorICAgICAgICB7IktleXN0b3JlLnBhc3N3b3JkLmlzLnRvby5zaG9ydC5tdXN0LmJlLmF0LmxlYXN0LjYuY2hhcmFjdGVycyIsCisgICAgICAgICAiS2V5c3RvcmUgcGFzc3dvcmQgaXMgdG9vIHNob3J0IC0gbXVzdCBiZSBhdCBsZWFzdCA2IGNoYXJhY3RlcnMifSwKKyAgICAgICAgeyJVbmtub3duLkVudHJ5LlR5cGUiLCAiVW5rbm93biBFbnRyeSBUeXBlIn0sCisgICAgICAgIHsiVG9vLm1hbnkuZmFpbHVyZXMuQWxpYXMubm90LmNoYW5nZWQiLCAiVG9vIG1hbnkgZmFpbHVyZXMuIEFsaWFzIG5vdCBjaGFuZ2VkIn0sCisgICAgICAgIHsiRW50cnkuZm9yLmFsaWFzLmFsaWFzLnN1Y2Nlc3NmdWxseS5pbXBvcnRlZC4iLAorICAgICAgICAgICAgICAgICAiRW50cnkgZm9yIGFsaWFzIHswfSBzdWNjZXNzZnVsbHkgaW1wb3J0ZWQuIn0sCisgICAgICAgIHsiRW50cnkuZm9yLmFsaWFzLmFsaWFzLm5vdC5pbXBvcnRlZC4iLCAiRW50cnkgZm9yIGFsaWFzIHswfSBub3QgaW1wb3J0ZWQuIn0sCisgICAgICAgIHsiUHJvYmxlbS5pbXBvcnRpbmcuZW50cnkuZm9yLmFsaWFzLmFsaWFzLmV4Y2VwdGlvbi5FbnRyeS5mb3IuYWxpYXMuYWxpYXMubm90LmltcG9ydGVkLiIsCisgICAgICAgICAgICAgICAgICJQcm9ibGVtIGltcG9ydGluZyBlbnRyeSBmb3IgYWxpYXMgezB9OiB7MX0uXG5FbnRyeSBmb3IgYWxpYXMgezB9IG5vdCBpbXBvcnRlZC4ifSwKKyAgICAgICAgeyJJbXBvcnQuY29tbWFuZC5jb21wbGV0ZWQub2suZW50cmllcy5zdWNjZXNzZnVsbHkuaW1wb3J0ZWQuZmFpbC5lbnRyaWVzLmZhaWxlZC5vci5jYW5jZWxsZWQiLAorICAgICAgICAgICAgICAgICAiSW1wb3J0IGNvbW1hbmQgY29tcGxldGVkOiAgezB9IGVudHJpZXMgc3VjY2Vzc2Z1bGx5IGltcG9ydGVkLCB7MX0gZW50cmllcyBmYWlsZWQgb3IgY2FuY2VsbGVkIn0sCisgICAgICAgIHsiV2FybmluZy5PdmVyd3JpdGluZy5leGlzdGluZy5hbGlhcy5hbGlhcy5pbi5kZXN0aW5hdGlvbi5rZXlzdG9yZSIsCisgICAgICAgICAgICAgICAgICJXYXJuaW5nOiBPdmVyd3JpdGluZyBleGlzdGluZyBhbGlhcyB7MH0gaW4gZGVzdGluYXRpb24ga2V5c3RvcmUifSwKKyAgICAgICAgeyJFeGlzdGluZy5lbnRyeS5hbGlhcy5hbGlhcy5leGlzdHMub3ZlcndyaXRlLm5vLiIsCisgICAgICAgICAgICAgICAgICJFeGlzdGluZyBlbnRyeSBhbGlhcyB7MH0gZXhpc3RzLCBvdmVyd3JpdGU/IFtub106ICAifSwKKyAgICAgICAgeyJUb28ubWFueS5mYWlsdXJlcy50cnkubGF0ZXIiLCAiVG9vIG1hbnkgZmFpbHVyZXMgLSB0cnkgbGF0ZXIifSwKKyAgICAgICAgeyJDZXJ0aWZpY2F0aW9uLnJlcXVlc3Quc3RvcmVkLmluLmZpbGUuZmlsZW5hbWUuIiwKKyAgICAgICAgICAgICAgICAiQ2VydGlmaWNhdGlvbiByZXF1ZXN0IHN0b3JlZCBpbiBmaWxlIDx7MH0+In0sCisgICAgICAgIHsiU3VibWl0LnRoaXMudG8ueW91ci5DQSIsICJTdWJtaXQgdGhpcyB0byB5b3VyIENBIn0sCisgICAgICAgIHsiaWYuYWxpYXMubm90LnNwZWNpZmllZC5kZXN0YWxpYXMuc3Jja2V5cGFzcy5hbmQuZGVzdGtleXBhc3MubXVzdC5ub3QuYmUuc3BlY2lmaWVkIiwKKyAgICAgICAgICAgICJpZiBhbGlhcyBub3Qgc3BlY2lmaWVkLCBkZXN0YWxpYXMsIHNyY2tleXBhc3MsIGFuZCBkZXN0a2V5cGFzcyBtdXN0IG5vdCBiZSBzcGVjaWZpZWQifSwKKyAgICAgICAgeyJDZXJ0aWZpY2F0ZS5zdG9yZWQuaW4uZmlsZS5maWxlbmFtZS4iLAorICAgICAgICAgICAgICAgICJDZXJ0aWZpY2F0ZSBzdG9yZWQgaW4gZmlsZSA8ezB9PiJ9LAorICAgICAgICB7IkNlcnRpZmljYXRlLnJlcGx5Lndhcy5pbnN0YWxsZWQuaW4ua2V5c3RvcmUiLAorICAgICAgICAgICAgICAgICJDZXJ0aWZpY2F0ZSByZXBseSB3YXMgaW5zdGFsbGVkIGluIGtleXN0b3JlIn0sCisgICAgICAgIHsiQ2VydGlmaWNhdGUucmVwbHkud2FzLm5vdC5pbnN0YWxsZWQuaW4ua2V5c3RvcmUiLAorICAgICAgICAgICAgICAgICJDZXJ0aWZpY2F0ZSByZXBseSB3YXMgbm90IGluc3RhbGxlZCBpbiBrZXlzdG9yZSJ9LAorICAgICAgICB7IkNlcnRpZmljYXRlLndhcy5hZGRlZC50by5rZXlzdG9yZSIsCisgICAgICAgICAgICAgICAgIkNlcnRpZmljYXRlIHdhcyBhZGRlZCB0byBrZXlzdG9yZSJ9LAorICAgICAgICB7IkNlcnRpZmljYXRlLndhcy5ub3QuYWRkZWQudG8ua2V5c3RvcmUiLAorICAgICAgICAgICAgICAgICJDZXJ0aWZpY2F0ZSB3YXMgbm90IGFkZGVkIHRvIGtleXN0b3JlIn0sCisgICAgICAgIHsiLlN0b3Jpbmcua3NmbmFtZS4iLCAiW1N0b3JpbmcgezB9XSJ9LAorICAgICAgICB7ImFsaWFzLmhhcy5uby5wdWJsaWMua2V5LmNlcnRpZmljYXRlLiIsCisgICAgICAgICAgICAgICAgInswfSBoYXMgbm8gcHVibGljIGtleSAoY2VydGlmaWNhdGUpIn0sCisgICAgICAgIHsiQ2Fubm90LmRlcml2ZS5zaWduYXR1cmUuYWxnb3JpdGhtIiwKKyAgICAgICAgICAgICAgICAiQ2Fubm90IGRlcml2ZSBzaWduYXR1cmUgYWxnb3JpdGhtIn0sCisgICAgICAgIHsiQWxpYXMuYWxpYXMuZG9lcy5ub3QuZXhpc3QiLAorICAgICAgICAgICAgICAgICJBbGlhcyA8ezB9PiBkb2VzIG5vdCBleGlzdCJ9LAorICAgICAgICB7IkFsaWFzLmFsaWFzLmhhcy5uby5jZXJ0aWZpY2F0ZSIsCisgICAgICAgICAgICAgICAgIkFsaWFzIDx7MH0+IGhhcyBubyBjZXJ0aWZpY2F0ZSJ9LAorICAgICAgICB7IktleS5wYWlyLm5vdC5nZW5lcmF0ZWQuYWxpYXMuYWxpYXMuYWxyZWFkeS5leGlzdHMiLAorICAgICAgICAgICAgICAgICJLZXkgcGFpciBub3QgZ2VuZXJhdGVkLCBhbGlhcyA8ezB9PiBhbHJlYWR5IGV4aXN0cyJ9LAorICAgICAgICB7IkdlbmVyYXRpbmcua2V5c2l6ZS5iaXQua2V5QWxnTmFtZS5rZXkucGFpci5hbmQuc2VsZi5zaWduZWQuY2VydGlmaWNhdGUuc2lnQWxnTmFtZS53aXRoLmEudmFsaWRpdHkub2YudmFsaWRhbGl0eS5kYXlzLmZvciIsCisgICAgICAgICAgICAgICAgIkdlbmVyYXRpbmcgezB9IGJpdCB7MX0ga2V5IHBhaXIgYW5kIHNlbGYtc2lnbmVkIGNlcnRpZmljYXRlICh7Mn0pIHdpdGggYSB2YWxpZGl0eSBvZiB7M30gZGF5c1xuXHRmb3I6IHs0fSJ9LAorICAgICAgICB7IkVudGVyLmtleS5wYXNzd29yZC5mb3IuYWxpYXMuIiwgIkVudGVyIGtleSBwYXNzd29yZCBmb3IgPHswfT4ifSwKKyAgICAgICAgeyIuUkVUVVJOLmlmLnNhbWUuYXMua2V5c3RvcmUucGFzc3dvcmQuIiwKKyAgICAgICAgICAgICAgICAiXHQoUkVUVVJOIGlmIHNhbWUgYXMga2V5c3RvcmUgcGFzc3dvcmQpOiAgIn0sCisgICAgICAgIHsiS2V5LnBhc3N3b3JkLmlzLnRvby5zaG9ydC5tdXN0LmJlLmF0LmxlYXN0LjYuY2hhcmFjdGVycyIsCisgICAgICAgICAgICAgICAgIktleSBwYXNzd29yZCBpcyB0b28gc2hvcnQgLSBtdXN0IGJlIGF0IGxlYXN0IDYgY2hhcmFjdGVycyJ9LAorICAgICAgICB7IlRvby5tYW55LmZhaWx1cmVzLmtleS5ub3QuYWRkZWQudG8ua2V5c3RvcmUiLAorICAgICAgICAgICAgICAgICJUb28gbWFueSBmYWlsdXJlcyAtIGtleSBub3QgYWRkZWQgdG8ga2V5c3RvcmUifSwKKyAgICAgICAgeyJEZXN0aW5hdGlvbi5hbGlhcy5kZXN0LmFscmVhZHkuZXhpc3RzIiwKKyAgICAgICAgICAgICAgICAiRGVzdGluYXRpb24gYWxpYXMgPHswfT4gYWxyZWFkeSBleGlzdHMifSwKKyAgICAgICAgeyJQYXNzd29yZC5pcy50b28uc2hvcnQubXVzdC5iZS5hdC5sZWFzdC42LmNoYXJhY3RlcnMiLAorICAgICAgICAgICAgICAgICJQYXNzd29yZCBpcyB0b28gc2hvcnQgLSBtdXN0IGJlIGF0IGxlYXN0IDYgY2hhcmFjdGVycyJ9LAorICAgICAgICB7IlRvby5tYW55LmZhaWx1cmVzLktleS5lbnRyeS5ub3QuY2xvbmVkIiwKKyAgICAgICAgICAgICAgICAiVG9vIG1hbnkgZmFpbHVyZXMuIEtleSBlbnRyeSBub3QgY2xvbmVkIn0sCisgICAgICAgIHsia2V5LnBhc3N3b3JkLmZvci5hbGlhcy4iLCAia2V5IHBhc3N3b3JkIGZvciA8ezB9PiJ9LAorICAgICAgICB7IktleXN0b3JlLmVudHJ5LmZvci5pZC5nZXROYW1lLmFscmVhZHkuZXhpc3RzIiwKKyAgICAgICAgICAgICAgICAiS2V5c3RvcmUgZW50cnkgZm9yIDx7MH0+IGFscmVhZHkgZXhpc3RzIn0sCisgICAgICAgIHsiQ3JlYXRpbmcua2V5c3RvcmUuZW50cnkuZm9yLmlkLmdldE5hbWUuIiwKKyAgICAgICAgICAgICAgICAiQ3JlYXRpbmcga2V5c3RvcmUgZW50cnkgZm9yIDx7MH0+IC4uLiJ9LAorICAgICAgICB7Ik5vLmVudHJpZXMuZnJvbS5pZGVudGl0eS5kYXRhYmFzZS5hZGRlZCIsCisgICAgICAgICAgICAgICAgIk5vIGVudHJpZXMgZnJvbSBpZGVudGl0eSBkYXRhYmFzZSBhZGRlZCJ9LAorICAgICAgICB7IkFsaWFzLm5hbWUuYWxpYXMiLCAiQWxpYXMgbmFtZTogezB9In0sCisgICAgICAgIHsiQ3JlYXRpb24uZGF0ZS5rZXlTdG9yZS5nZXRDcmVhdGlvbkRhdGUuYWxpYXMuIiwKKyAgICAgICAgICAgICAgICAiQ3JlYXRpb24gZGF0ZTogezAsZGF0ZX0ifSwKKyAgICAgICAgeyJhbGlhcy5rZXlTdG9yZS5nZXRDcmVhdGlvbkRhdGUuYWxpYXMuIiwKKyAgICAgICAgICAgICAgICAiezB9LCB7MSxkYXRlfSwgIn0sCisgICAgICAgIHsiYWxpYXMuIiwgInswfSwgIn0sCisgICAgICAgIHsiRW50cnkudHlwZS50eXBlLiIsICJFbnRyeSB0eXBlOiB7MH0ifSwKKyAgICAgICAgeyJDZXJ0aWZpY2F0ZS5jaGFpbi5sZW5ndGguIiwgIkNlcnRpZmljYXRlIGNoYWluIGxlbmd0aDogIn0sCisgICAgICAgIHsiQ2VydGlmaWNhdGUuaS4xLiIsICJDZXJ0aWZpY2F0ZVt7MCxudW1iZXIsaW50ZWdlcn1dOiJ9LAorICAgICAgICB7IkNlcnRpZmljYXRlLmZpbmdlcnByaW50LlNIQTEuIiwgIkNlcnRpZmljYXRlIGZpbmdlcnByaW50IChTSEExKTogIn0sCisgICAgICAgIHsiS2V5c3RvcmUudHlwZS4iLCAiS2V5c3RvcmUgdHlwZTogIn0sCisgICAgICAgIHsiS2V5c3RvcmUucHJvdmlkZXIuIiwgIktleXN0b3JlIHByb3ZpZGVyOiAifSwKKyAgICAgICAgeyJZb3VyLmtleXN0b3JlLmNvbnRhaW5zLmtleVN0b3JlLnNpemUuZW50cnkiLAorICAgICAgICAgICAgICAgICJZb3VyIGtleXN0b3JlIGNvbnRhaW5zIHswLG51bWJlcixpbnRlZ2VyfSBlbnRyeSJ9LAorICAgICAgICB7IllvdXIua2V5c3RvcmUuY29udGFpbnMua2V5U3RvcmUuc2l6ZS5lbnRyaWVzIiwKKyAgICAgICAgICAgICAgICAiWW91ciBrZXlzdG9yZSBjb250YWlucyB7MCxudW1iZXIsaW50ZWdlcn0gZW50cmllcyJ9LAorICAgICAgICB7IkZhaWxlZC50by5wYXJzZS5pbnB1dCIsICJGYWlsZWQgdG8gcGFyc2UgaW5wdXQifSwKKyAgICAgICAgeyJFbXB0eS5pbnB1dCIsICJFbXB0eSBpbnB1dCJ9LAorICAgICAgICB7Ik5vdC5YLjUwOS5jZXJ0aWZpY2F0ZSIsICJOb3QgWC41MDkgY2VydGlmaWNhdGUifSwKKyAgICAgICAgeyJhbGlhcy5oYXMubm8ucHVibGljLmtleSIsICJ7MH0gaGFzIG5vIHB1YmxpYyBrZXkifSwKKyAgICAgICAgeyJhbGlhcy5oYXMubm8uWC41MDkuY2VydGlmaWNhdGUiLCAiezB9IGhhcyBubyBYLjUwOSBjZXJ0aWZpY2F0ZSJ9LAorICAgICAgICB7Ik5ldy5jZXJ0aWZpY2F0ZS5zZWxmLnNpZ25lZC4iLCAiTmV3IGNlcnRpZmljYXRlIChzZWxmLXNpZ25lZCk6In0sCisgICAgICAgIHsiUmVwbHkuaGFzLm5vLmNlcnRpZmljYXRlcyIsICJSZXBseSBoYXMgbm8gY2VydGlmaWNhdGVzIn0sCisgICAgICAgIHsiQ2VydGlmaWNhdGUubm90LmltcG9ydGVkLmFsaWFzLmFsaWFzLmFscmVhZHkuZXhpc3RzIiwKKyAgICAgICAgICAgICAgICAiQ2VydGlmaWNhdGUgbm90IGltcG9ydGVkLCBhbGlhcyA8ezB9PiBhbHJlYWR5IGV4aXN0cyJ9LAorICAgICAgICB7IklucHV0Lm5vdC5hbi5YLjUwOS5jZXJ0aWZpY2F0ZSIsICJJbnB1dCBub3QgYW4gWC41MDkgY2VydGlmaWNhdGUifSwKKyAgICAgICAgeyJDZXJ0aWZpY2F0ZS5hbHJlYWR5LmV4aXN0cy5pbi5rZXlzdG9yZS51bmRlci5hbGlhcy50cnVzdGFsaWFzLiIsCisgICAgICAgICAgICAgICAgIkNlcnRpZmljYXRlIGFscmVhZHkgZXhpc3RzIGluIGtleXN0b3JlIHVuZGVyIGFsaWFzIDx7MH0+In0sCisgICAgICAgIHsiRG8ueW91LnN0aWxsLndhbnQudG8uYWRkLml0Lm5vLiIsCisgICAgICAgICAgICAgICAgIkRvIHlvdSBzdGlsbCB3YW50IHRvIGFkZCBpdD8gW25vXTogICJ9LAorICAgICAgICB7IkNlcnRpZmljYXRlLmFscmVhZHkuZXhpc3RzLmluLnN5c3RlbS53aWRlLkNBLmtleXN0b3JlLnVuZGVyLmFsaWFzLnRydXN0YWxpYXMuIiwKKyAgICAgICAgICAgICAgICAiQ2VydGlmaWNhdGUgYWxyZWFkeSBleGlzdHMgaW4gc3lzdGVtLXdpZGUgQ0Ega2V5c3RvcmUgdW5kZXIgYWxpYXMgPHswfT4ifSwKKyAgICAgICAgeyJEby55b3Uuc3RpbGwud2FudC50by5hZGQuaXQudG8ueW91ci5vd24ua2V5c3RvcmUubm8uIiwKKyAgICAgICAgICAgICAgICAiRG8geW91IHN0aWxsIHdhbnQgdG8gYWRkIGl0IHRvIHlvdXIgb3duIGtleXN0b3JlPyBbbm9dOiAgIn0sCisgICAgICAgIHsiVHJ1c3QudGhpcy5jZXJ0aWZpY2F0ZS5uby4iLCAiVHJ1c3QgdGhpcyBjZXJ0aWZpY2F0ZT8gW25vXTogICJ9LAorICAgICAgICB7IllFUyIsICJZRVMifSwKKyAgICAgICAgeyJOZXcucHJvbXB0LiIsICJOZXcgezB9OiAifSwKKyAgICAgICAgeyJQYXNzd29yZHMubXVzdC5kaWZmZXIiLCAiUGFzc3dvcmRzIG11c3QgZGlmZmVyIn0sCisgICAgICAgIHsiUmUuZW50ZXIubmV3LnByb21wdC4iLCAiUmUtZW50ZXIgbmV3IHswfTogIn0sCisgICAgICAgIHsiUmUuZW50ZXIubmV3LnBhc3N3b3JkLiIsICJSZS1lbnRlciBuZXcgcGFzc3dvcmQ6ICJ9LAorICAgICAgICB7IlRoZXkuZG9uLnQubWF0Y2guVHJ5LmFnYWluIiwgIlRoZXkgZG9uJ3QgbWF0Y2guIFRyeSBhZ2FpbiJ9LAorICAgICAgICB7IkVudGVyLnByb21wdC5hbGlhcy5uYW1lLiIsICJFbnRlciB7MH0gYWxpYXMgbmFtZTogICJ9LAorICAgICAgICB7IkVudGVyLm5ldy5hbGlhcy5uYW1lLlJFVFVSTi50by5jYW5jZWwuaW1wb3J0LmZvci50aGlzLmVudHJ5LiIsCisgICAgICAgICAgICAgICAgICJFbnRlciBuZXcgYWxpYXMgbmFtZVx0KFJFVFVSTiB0byBjYW5jZWwgaW1wb3J0IGZvciB0aGlzIGVudHJ5KTogICJ9LAorICAgICAgICB7IkVudGVyLmFsaWFzLm5hbWUuIiwgIkVudGVyIGFsaWFzIG5hbWU6ICAifSwKKyAgICAgICAgeyIuUkVUVVJOLmlmLnNhbWUuYXMuZm9yLm90aGVyQWxpYXMuIiwKKyAgICAgICAgICAgICAgICAiXHQoUkVUVVJOIGlmIHNhbWUgYXMgZm9yIDx7MH0+KSJ9LAorICAgICAgICB7Ii5QQVRURVJOLnByaW50WDUwOUNlcnQiLAorICAgICAgICAgICAgICAgICJPd25lcjogezB9XG5Jc3N1ZXI6IHsxfVxuU2VyaWFsIG51bWJlcjogezJ9XG5WYWxpZCBmcm9tOiB7M30gdW50aWw6IHs0fVxuQ2VydGlmaWNhdGUgZmluZ2VycHJpbnRzOlxuXHQgTUQ1OiAgezV9XG5cdCBTSEExOiB7Nn1cblx0IFNIQTI1Njogezd9XG5cdCBTaWduYXR1cmUgYWxnb3JpdGhtIG5hbWU6IHs4fVxuXHQgVmVyc2lvbjogezl9In0sCisgICAgICAgIHsiV2hhdC5pcy55b3VyLmZpcnN0LmFuZC5sYXN0Lm5hbWUuIiwKKyAgICAgICAgICAgICAgICAiV2hhdCBpcyB5b3VyIGZpcnN0IGFuZCBsYXN0IG5hbWU/In0sCisgICAgICAgIHsiV2hhdC5pcy50aGUubmFtZS5vZi55b3VyLm9yZ2FuaXphdGlvbmFsLnVuaXQuIiwKKyAgICAgICAgICAgICAgICAiV2hhdCBpcyB0aGUgbmFtZSBvZiB5b3VyIG9yZ2FuaXphdGlvbmFsIHVuaXQ/In0sCisgICAgICAgIHsiV2hhdC5pcy50aGUubmFtZS5vZi55b3VyLm9yZ2FuaXphdGlvbi4iLAorICAgICAgICAgICAgICAgICJXaGF0IGlzIHRoZSBuYW1lIG9mIHlvdXIgb3JnYW5pemF0aW9uPyJ9LAorICAgICAgICB7IldoYXQuaXMudGhlLm5hbWUub2YueW91ci5DaXR5Lm9yLkxvY2FsaXR5LiIsCisgICAgICAgICAgICAgICAgIldoYXQgaXMgdGhlIG5hbWUgb2YgeW91ciBDaXR5IG9yIExvY2FsaXR5PyJ9LAorICAgICAgICB7IldoYXQuaXMudGhlLm5hbWUub2YueW91ci5TdGF0ZS5vci5Qcm92aW5jZS4iLAorICAgICAgICAgICAgICAgICJXaGF0IGlzIHRoZSBuYW1lIG9mIHlvdXIgU3RhdGUgb3IgUHJvdmluY2U/In0sCisgICAgICAgIHsiV2hhdC5pcy50aGUudHdvLmxldHRlci5jb3VudHJ5LmNvZGUuZm9yLnRoaXMudW5pdC4iLAorICAgICAgICAgICAgICAgICJXaGF0IGlzIHRoZSB0d28tbGV0dGVyIGNvdW50cnkgY29kZSBmb3IgdGhpcyB1bml0PyJ9LAorICAgICAgICB7IklzLm5hbWUuY29ycmVjdC4iLCAiSXMgezB9IGNvcnJlY3Q/In0sCisgICAgICAgIHsibm8iLCAibm8ifSwKKyAgICAgICAgeyJ5ZXMiLCAieWVzIn0sCisgICAgICAgIHsieSIsICJ5In0sCisgICAgICAgIHsiLmRlZmF1bHRWYWx1ZS4iLCAiICBbezB9XTogICJ9LAorICAgICAgICB7IkFsaWFzLmFsaWFzLmhhcy5uby5rZXkiLAorICAgICAgICAgICAgICAgICJBbGlhcyA8ezB9PiBoYXMgbm8ga2V5In0sCisgICAgICAgIHsiQWxpYXMuYWxpYXMucmVmZXJlbmNlcy5hbi5lbnRyeS50eXBlLnRoYXQuaXMubm90LmEucHJpdmF0ZS5rZXkuZW50cnkuVGhlLmtleWNsb25lLmNvbW1hbmQub25seS5zdXBwb3J0cy5jbG9uaW5nLm9mLnByaXZhdGUua2V5IiwKKyAgICAgICAgICAgICAgICAgIkFsaWFzIDx7MH0+IHJlZmVyZW5jZXMgYW4gZW50cnkgdHlwZSB0aGF0IGlzIG5vdCBhIHByaXZhdGUga2V5IGVudHJ5LiAgVGhlIC1rZXljbG9uZSBjb21tYW5kIG9ubHkgc3VwcG9ydHMgY2xvbmluZyBvZiBwcml2YXRlIGtleSBlbnRyaWVzIn0sCisKKyAgICAgICAgeyIuV0FSTklORy5XQVJOSU5HLldBUk5JTkcuIiwKKyAgICAgICAgICAgICIqKioqKioqKioqKioqKioqKiAgV0FSTklORyBXQVJOSU5HIFdBUk5JTkcgICoqKioqKioqKioqKioqKioqIn0sCisgICAgICAgIHsiU2lnbmVyLmQuIiwgIlNpZ25lciAjJWQ6In0sCisgICAgICAgIHsiVGltZXN0YW1wLiIsICJUaW1lc3RhbXA6In0sCisgICAgICAgIHsiU2lnbmF0dXJlLiIsICJTaWduYXR1cmU6In0sCisgICAgICAgIHsiQ1JMcy4iLCAiQ1JMczoifSwKKyAgICAgICAgeyJDZXJ0aWZpY2F0ZS5vd25lci4iLCAiQ2VydGlmaWNhdGUgb3duZXI6ICJ9LAorICAgICAgICB7Ik5vdC5hLnNpZ25lZC5qYXIuZmlsZSIsICJOb3QgYSBzaWduZWQgamFyIGZpbGUifSwKKyAgICAgICAgeyJOby5jZXJ0aWZpY2F0ZS5mcm9tLnRoZS5TU0wuc2VydmVyIiwKKyAgICAgICAgICAgICAgICAiTm8gY2VydGlmaWNhdGUgZnJvbSB0aGUgU1NMIHNlcnZlciJ9LAorCisgICAgICAgIHsiLlRoZS5pbnRlZ3JpdHkub2YudGhlLmluZm9ybWF0aW9uLnN0b3JlZC5pbi55b3VyLmtleXN0b3JlLiIsCisgICAgICAgICAgICAiKiBUaGUgaW50ZWdyaXR5IG9mIHRoZSBpbmZvcm1hdGlvbiBzdG9yZWQgaW4geW91ciBrZXlzdG9yZSAgKlxuIiArCisgICAgICAgICAgICAiKiBoYXMgTk9UIGJlZW4gdmVyaWZpZWQhICBJbiBvcmRlciB0byB2ZXJpZnkgaXRzIGludGVncml0eSwgKlxuIiArCisgICAgICAgICAgICAiKiB5b3UgbXVzdCBwcm92aWRlIHlvdXIga2V5c3RvcmUgcGFzc3dvcmQuICAgICAgICAgICAgICAgICAgKiJ9LAorICAgICAgICB7Ii5UaGUuaW50ZWdyaXR5Lm9mLnRoZS5pbmZvcm1hdGlvbi5zdG9yZWQuaW4udGhlLnNyY2tleXN0b3JlLiIsCisgICAgICAgICAgICAiKiBUaGUgaW50ZWdyaXR5IG9mIHRoZSBpbmZvcm1hdGlvbiBzdG9yZWQgaW4gdGhlIHNyY2tleXN0b3JlKlxuIiArCisgICAgICAgICAgICAiKiBoYXMgTk9UIGJlZW4gdmVyaWZpZWQhICBJbiBvcmRlciB0byB2ZXJpZnkgaXRzIGludGVncml0eSwgKlxuIiArCisgICAgICAgICAgICAiKiB5b3UgbXVzdCBwcm92aWRlIHRoZSBzcmNrZXlzdG9yZSBwYXNzd29yZC4gICAgICAgICAgICAgICAgKiJ9LAorCisgICAgICAgIHsiQ2VydGlmaWNhdGUucmVwbHkuZG9lcy5ub3QuY29udGFpbi5wdWJsaWMua2V5LmZvci5hbGlhcy4iLAorICAgICAgICAgICAgICAgICJDZXJ0aWZpY2F0ZSByZXBseSBkb2VzIG5vdCBjb250YWluIHB1YmxpYyBrZXkgZm9yIDx7MH0+In0sCisgICAgICAgIHsiSW5jb21wbGV0ZS5jZXJ0aWZpY2F0ZS5jaGFpbi5pbi5yZXBseSIsCisgICAgICAgICAgICAgICAgIkluY29tcGxldGUgY2VydGlmaWNhdGUgY2hhaW4gaW4gcmVwbHkifSwKKyAgICAgICAgeyJDZXJ0aWZpY2F0ZS5jaGFpbi5pbi5yZXBseS5kb2VzLm5vdC52ZXJpZnkuIiwKKyAgICAgICAgICAgICAgICAiQ2VydGlmaWNhdGUgY2hhaW4gaW4gcmVwbHkgZG9lcyBub3QgdmVyaWZ5OiAifSwKKyAgICAgICAgeyJUb3AubGV2ZWwuY2VydGlmaWNhdGUuaW4ucmVwbHkuIiwKKyAgICAgICAgICAgICAgICAiVG9wLWxldmVsIGNlcnRpZmljYXRlIGluIHJlcGx5OlxuIn0sCisgICAgICAgIHsiLmlzLm5vdC50cnVzdGVkLiIsICIuLi4gaXMgbm90IHRydXN0ZWQuICJ9LAorICAgICAgICB7Ikluc3RhbGwucmVwbHkuYW55d2F5Lm5vLiIsICJJbnN0YWxsIHJlcGx5IGFueXdheT8gW25vXTogICJ9LAorICAgICAgICB7Ik5PIiwgIk5PIn0sCisgICAgICAgIHsiUHVibGljLmtleXMuaW4ucmVwbHkuYW5kLmtleXN0b3JlLmRvbi50Lm1hdGNoIiwKKyAgICAgICAgICAgICAgICAiUHVibGljIGtleXMgaW4gcmVwbHkgYW5kIGtleXN0b3JlIGRvbid0IG1hdGNoIn0sCisgICAgICAgIHsiQ2VydGlmaWNhdGUucmVwbHkuYW5kLmNlcnRpZmljYXRlLmluLmtleXN0b3JlLmFyZS5pZGVudGljYWwiLAorICAgICAgICAgICAgICAgICJDZXJ0aWZpY2F0ZSByZXBseSBhbmQgY2VydGlmaWNhdGUgaW4ga2V5c3RvcmUgYXJlIGlkZW50aWNhbCJ9LAorICAgICAgICB7IkZhaWxlZC50by5lc3RhYmxpc2guY2hhaW4uZnJvbS5yZXBseSIsCisgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBlc3RhYmxpc2ggY2hhaW4gZnJvbSByZXBseSJ9LAorICAgICAgICB7Im4iLCAibiJ9LAorICAgICAgICB7Ildyb25nLmFuc3dlci50cnkuYWdhaW4iLCAiV3JvbmcgYW5zd2VyLCB0cnkgYWdhaW4ifSwKKyAgICAgICAgeyJTZWNyZXQua2V5Lm5vdC5nZW5lcmF0ZWQuYWxpYXMuYWxpYXMuYWxyZWFkeS5leGlzdHMiLAorICAgICAgICAgICAgICAgICJTZWNyZXQgS2V5IG5vdCBnZW5lcmF0ZWQsIGFsaWFzIDx7MH0+IGFscmVhZHkgZXhpc3RzIn0sCisgICAgICAgIHsiUGxlYXNlLnByb3ZpZGUua2V5c2l6ZS5mb3Iuc2VjcmV0LmtleS5nZW5lcmF0aW9uIiwKKyAgICAgICAgICAgICAgICAiUGxlYXNlIHByb3ZpZGUgLWtleXNpemUgZm9yIHNlY3JldCBrZXkgZ2VuZXJhdGlvbiJ9LAorCisgICAgICAgIHsidmVyaWZpZWQuYnkucy5pbi5zIiwgIlZlcmlmaWVkIGJ5ICVzIGluICVzIn0sCisgICAgICAgIHsid2FybmluZy5ub3QudmVyaWZpZWQubWFrZS5zdXJlLmtleXN0b3JlLmlzLmNvcnJlY3QiLAorICAgICAgICAgICAgIldBUk5JTkc6IG5vdCB2ZXJpZmllZC4gTWFrZSBzdXJlIC1rZXlzdG9yZSBpcyBjb3JyZWN0LiJ9LAorCisgICAgICAgIHsiRXh0ZW5zaW9ucy4iLCAiRXh0ZW5zaW9uczogIn0sCisgICAgICAgIHsiLkVtcHR5LnZhbHVlLiIsICIoRW1wdHkgdmFsdWUpIn0sCisgICAgICAgIHsiRXh0ZW5zaW9uLlJlcXVlc3QuIiwgIkV4dGVuc2lvbiBSZXF1ZXN0OiJ9LAorICAgICAgICB7IlBLQ1MuMTAuQ2VydGlmaWNhdGUuUmVxdWVzdC5WZXJzaW9uLjEuMC5TdWJqZWN0LnMuUHVibGljLktleS5zLmZvcm1hdC5zLmtleS4iLAorICAgICAgICAgICAgICAgICJQS0NTICMxMCBDZXJ0aWZpY2F0ZSBSZXF1ZXN0IChWZXJzaW9uIDEuMClcbiIgKworICAgICAgICAgICAgICAgICJTdWJqZWN0OiAlc1xuUHVibGljIEtleTogJXMgZm9ybWF0ICVzIGtleVxuIn0sCisgICAgICAgIHsiVW5rbm93bi5rZXlVc2FnZS50eXBlLiIsICJVbmtub3duIGtleVVzYWdlIHR5cGU6ICJ9LAorICAgICAgICB7IlVua25vd24uZXh0ZW5kZWRrZXlVc2FnZS50eXBlLiIsICJVbmtub3duIGV4dGVuZGVka2V5VXNhZ2UgdHlwZTogIn0sCisgICAgICAgIHsiVW5rbm93bi5BY2Nlc3NEZXNjcmlwdGlvbi50eXBlLiIsICJVbmtub3duIEFjY2Vzc0Rlc2NyaXB0aW9uIHR5cGU6ICJ9LAorICAgICAgICB7IlVucmVjb2duaXplZC5HZW5lcmFsTmFtZS50eXBlLiIsICJVbnJlY29nbml6ZWQgR2VuZXJhbE5hbWUgdHlwZTogIn0sCisgICAgICAgIHsiVGhpcy5leHRlbnNpb24uY2Fubm90LmJlLm1hcmtlZC5hcy5jcml0aWNhbC4iLAorICAgICAgICAgICAgICAgICAiVGhpcyBleHRlbnNpb24gY2Fubm90IGJlIG1hcmtlZCBhcyBjcml0aWNhbC4gIn0sCisgICAgICAgIHsiT2RkLm51bWJlci5vZi5oZXguZGlnaXRzLmZvdW5kLiIsICJPZGQgbnVtYmVyIG9mIGhleCBkaWdpdHMgZm91bmQ6ICJ9LAorICAgICAgICB7IlVua25vd24uZXh0ZW5zaW9uLnR5cGUuIiwgIlVua25vd24gZXh0ZW5zaW9uIHR5cGU6ICJ9LAorICAgICAgICB7ImNvbW1hbmQuezB9LmlzLmFtYmlndW91cy4iLCAiY29tbWFuZCB7MH0gaXMgYW1iaWd1b3VzOiJ9CisgICAgfTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY29udGVudHMgb2YgdGhpcyA8Y29kZT5SZXNvdXJjZUJ1bmRsZTwvY29kZT4uCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGNvbnRlbnRzIG9mIHRoaXMgPGNvZGU+UmVzb3VyY2VCdW5kbGU8L2NvZGU+LgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPYmplY3RbXVtdIGdldENvbnRlbnRzKCkgeworICAgICAgICByZXR1cm4gY29udGVudHM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS90b29scy9rZXl0b29sL1Jlc291cmNlc19kZS5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS90b29scy9rZXl0b29sL1Jlc291cmNlc19kZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4NzM2MmMKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3Rvb2xzL2tleXRvb2wvUmVzb3VyY2VzX2RlLmphdmEKQEAgLTAsMCArMSw0MzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IE9yYWNsZSBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQorICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQorICogcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2Ugc3VuLnNlY3VyaXR5LnRvb2xzLmtleXRvb2w7CisKKy8qKgorICogPHA+IFRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgPGNvZGU+UmVzb3VyY2VCdW5kbGU8L2NvZGU+CisgKiBmb3IgdGhlIGtleXRvb2wuCisgKgorICovCitwdWJsaWMgY2xhc3MgUmVzb3VyY2VzX2RlIGV4dGVuZHMgamF2YS51dGlsLkxpc3RSZXNvdXJjZUJ1bmRsZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXVtdIGNvbnRlbnRzID0geworICAgICAgICB7Ik5FV0xJTkUiLCAiXG4ifSwKKyAgICAgICAgeyJTVEFSIiwKKyAgICAgICAgICAgICAgICAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiJ9LAorICAgICAgICB7IlNUQVJOTiIsCisgICAgICAgICAgICAgICAgIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuIn0sCisKKyAgICAgICAgLy8ga2V5dG9vbDogSGVscCBwYXJ0CisvLyAiT3B0aW9uIiBzaG91bGQgYmUgdHJhbnNsYXRlZC4KKyAgICAgICAgeyIuT1BUSU9OLiIsICIgW09wdGlvbl0uLi4ifSwKKyAgICAgICAgeyJPcHRpb25zLiIsICJPcHRpb25lbjoifSwKKyAgICAgICAgeyJVc2Uua2V5dG9vbC5oZWxwLmZvci5hbGwuYXZhaWxhYmxlLmNvbW1hbmRzIiwKKyAgICAgICAgICAgICAgICAgIlwia2V5dG9vbCAtaGVscFwiIGZcdTAwRkNyIGFsbGUgdmVyZlx1MDBGQ2diYXJlbiBCZWZlaGxlIHZlcndlbmRlbiJ9LAorICAgICAgICB7IktleS5hbmQuQ2VydGlmaWNhdGUuTWFuYWdlbWVudC5Ub29sIiwKKyAgICAgICAgICAgICAgICAgIlNjaGxcdTAwRkNzc2VsLSB1bmQgWmVydGlmaWthdHN2ZXJ3YWx0dW5nc3Rvb2wifSwKKyAgICAgICAgeyJDb21tYW5kcy4iLCAiQmVmZWhsZToifSwKKyAgICAgICAgeyJVc2Uua2V5dG9vbC5jb21tYW5kLm5hbWUuaGVscC5mb3IudXNhZ2Uub2YuY29tbWFuZC5uYW1lIiwKKyAgICAgICAgICAgICAgICAiXCJrZXl0b29sIC1jb21tYW5kX25hbWUgLWhlbHBcIiBmXHUwMEZDciBWZXJ3ZW5kdW5nIHZvbiBjb21tYW5kX25hbWUgdmVyd2VuZGVuIn0sCisgICAgICAgIC8vIGtleXRvb2w6IGhlbHA6IGNvbW1hbmRzCisgICAgICAgIHsiR2VuZXJhdGVzLmEuY2VydGlmaWNhdGUucmVxdWVzdCIsCisgICAgICAgICAgICAgICAgIkdlbmVyaWVydCBlaW5lIFplcnRpZmlrYXRhbmZvcmRlcnVuZyJ9LCAvLy1jZXJ0cmVxCisgICAgICAgIHsiQ2hhbmdlcy5hbi5lbnRyeS5zLmFsaWFzIiwKKyAgICAgICAgICAgICAgICAiXHUwMEM0bmRlcnQgZGVuIEFsaWFzIGVpbmVzIEVpbnRyYWdzIn0sIC8vLWNoYW5nZWFsaWFzCisgICAgICAgIHsiRGVsZXRlcy5hbi5lbnRyeSIsCisgICAgICAgICAgICAgICAgIkxcdTAwRjZzY2h0IGVpbmVuIEVpbnRyYWcifSwgLy8tZGVsZXRlCisgICAgICAgIHsiRXhwb3J0cy5jZXJ0aWZpY2F0ZSIsCisgICAgICAgICAgICAgICAgIkV4cG9ydGllcnQgZWluIFplcnRpZmlrYXQifSwgLy8tZXhwb3J0Y2VydAorICAgICAgICB7IkdlbmVyYXRlcy5hLmtleS5wYWlyIiwKKyAgICAgICAgICAgICAgICAiR2VuZXJpZXJ0IGVpbiBTY2hsXHUwMEZDc3NlbHBhYXIifSwgLy8tZ2Vua2V5cGFpcgorLy8gdHJhbnNsYXRpb24gb2YgInNlY3JldCIga2V5IHNob3VsZCBiZSBkaWZmZXJlbnQgdG8gInByaXZhdGUiIGtleS4KKyAgICAgICAgeyJHZW5lcmF0ZXMuYS5zZWNyZXQua2V5IiwKKyAgICAgICAgICAgICAgICAiR2VuZXJpZXJ0IGVpbmVuIFNlY3JldCBLZXkifSwgLy8tZ2Vuc2Vja2V5CisgICAgICAgIHsiR2VuZXJhdGVzLmNlcnRpZmljYXRlLmZyb20uYS5jZXJ0aWZpY2F0ZS5yZXF1ZXN0IiwKKyAgICAgICAgICAgICAgICAiR2VuZXJpZXJ0IGVpbiBaZXJ0aWZpa2F0IGF1cyBlaW5lciBaZXJ0aWZpa2F0YW5mb3JkZXJ1bmcifSwgLy8tZ2VuY2VydAorICAgICAgICB7IkdlbmVyYXRlcy5DUkwiLCAiR2VuZXJpZXJ0IGVpbmUgQ1JMIn0sIC8vLWdlbmNybAorICAgICAgICB7IkltcG9ydHMuZW50cmllcy5mcm9tLmEuSkRLLjEuMS54LnN0eWxlLmlkZW50aXR5LmRhdGFiYXNlIiwKKyAgICAgICAgICAgICAgICAiSW1wb3J0aWVydCBFaW50clx1MDBFNGdlIGF1cyBlaW5lciBJZGVudGl0eS1EYXRlbmJhbmsgaW0gSkRLIDEuMS54LVN0aWwifSwgLy8taWRlbnRpdHlkYgorICAgICAgICB7IkltcG9ydHMuYS5jZXJ0aWZpY2F0ZS5vci5hLmNlcnRpZmljYXRlLmNoYWluIiwKKyAgICAgICAgICAgICAgICAiSW1wb3J0aWVydCBlaW4gWmVydGlmaWthdCBvZGVyIGVpbmUgWmVydGlmaWthdGtldHRlIn0sIC8vLWltcG9ydGNlcnQKKyAgICAgICAgeyJJbXBvcnRzLm9uZS5vci5hbGwuZW50cmllcy5mcm9tLmFub3RoZXIua2V5c3RvcmUiLAorICAgICAgICAgICAgICAgICJJbXBvcnRpZXJ0IGVpbmVuIG9kZXIgYWxsZSBFaW50clx1MDBFNGdlIGF1cyBlaW5lbSBhbmRlcmVuIEtleXN0b3JlIn0sIC8vLWltcG9ydGtleXN0b3JlCisgICAgICAgIHsiQ2xvbmVzLmEua2V5LmVudHJ5IiwKKyAgICAgICAgICAgICAgICAiQ2xvbnQgZWluZW4gU2NobFx1MDBGQ3NzZWxlaW50cmFnIn0sIC8vLWtleWNsb25lCisgICAgICAgIHsiQ2hhbmdlcy50aGUua2V5LnBhc3N3b3JkLm9mLmFuLmVudHJ5IiwKKyAgICAgICAgICAgICAgICAiXHUwMEM0bmRlcnQgZGFzIFNjaGxcdTAwRkNzc2Vsa2VubndvcnQgZWluZXMgRWludHJhZ3MifSwgLy8ta2V5cGFzc3dkCisgICAgICAgIHsiTGlzdHMuZW50cmllcy5pbi5hLmtleXN0b3JlIiwKKyAgICAgICAgICAgICAgICAiTGlzdGV0IGRpZSBFaW50clx1MDBFNGdlIGluIGVpbmVtIEtleXN0b3JlIGF1ZiJ9LCAvLy1saXN0CisgICAgICAgIHsiUHJpbnRzLnRoZS5jb250ZW50Lm9mLmEuY2VydGlmaWNhdGUiLAorICAgICAgICAgICAgICAgICJEcnVja3QgZGVuIENvbnRlbnQgZWluZXMgWmVydGlmaWthdHMifSwgLy8tcHJpbnRjZXJ0CisgICAgICAgIHsiUHJpbnRzLnRoZS5jb250ZW50Lm9mLmEuY2VydGlmaWNhdGUucmVxdWVzdCIsCisgICAgICAgICAgICAgICAgIkRydWNrdCBkZW4gQ29udGVudCBlaW5lciBaZXJ0aWZpa2F0YW5mb3JkZXJ1bmcifSwgLy8tcHJpbnRjZXJ0cmVxCisgICAgICAgIHsiUHJpbnRzLnRoZS5jb250ZW50Lm9mLmEuQ1JMLmZpbGUiLAorICAgICAgICAgICAgICAgICJEcnVja3QgZGVuIENvbnRlbnQgZWluZXIgQ1JMLURhdGVpIn0sIC8vLXByaW50Y3JsCisgICAgICAgIHsiR2VuZXJhdGVzLmEuc2VsZi5zaWduZWQuY2VydGlmaWNhdGUiLAorICAgICAgICAgICAgICAgICJHZW5lcmllcnQgZWluIHNlbGJzdCBzaWduaWVydGVzIFplcnRpZmlrYXQifSwgLy8tc2VsZmNlcnQKKyAgICAgICAgeyJDaGFuZ2VzLnRoZS5zdG9yZS5wYXNzd29yZC5vZi5hLmtleXN0b3JlIiwKKyAgICAgICAgICAgICAgICAiXHUwMEM0bmRlcnQgZGFzIFNwZWljaGVya2VubndvcnQgZWluZXMgS2V5c3RvcmVzIn0sIC8vLXN0b3JlcGFzc3dkCisgICAgICAgIC8vIGtleXRvb2w6IGhlbHA6IG9wdGlvbnMKKyAgICAgICAgeyJhbGlhcy5uYW1lLm9mLnRoZS5lbnRyeS50by5wcm9jZXNzIiwKKyAgICAgICAgICAgICAgICAiQWxpYXNuYW1lIGRlcyB6dSB2ZXJhcmJlaXRlbmRlbiBFaW50cmFncyJ9LCAvLy1hbGlhcworICAgICAgICB7ImRlc3RpbmF0aW9uLmFsaWFzIiwKKyAgICAgICAgICAgICAgICAiWmllbGFsaWFzIn0sIC8vLWRlc3RhbGlhcworICAgICAgICB7ImRlc3RpbmF0aW9uLmtleS5wYXNzd29yZCIsCisgICAgICAgICAgICAgICAgIlppZWxzY2hsXHUwMEZDc3NlbC1LZW5ud29ydCJ9LCAvLy1kZXN0a2V5cGFzcworICAgICAgICB7ImRlc3RpbmF0aW9uLmtleXN0b3JlLm5hbWUiLAorICAgICAgICAgICAgICAgICJaaWVsLUtleXN0b3JlLU5hbWUifSwgLy8tZGVzdGtleXN0b3JlCisgICAgICAgIHsiZGVzdGluYXRpb24ua2V5c3RvcmUucGFzc3dvcmQucHJvdGVjdGVkIiwKKyAgICAgICAgICAgICAgICAiWmllbC1LZXlzdG9yZSBrZW5ud29ydGdlc2NoXHUwMEZDdHp0In0sIC8vLWRlc3Rwcm90ZWN0ZWQKKyAgICAgICAgeyJkZXN0aW5hdGlvbi5rZXlzdG9yZS5wcm92aWRlci5uYW1lIiwKKyAgICAgICAgICAgICAgICAiWmllbC1LZXlzdG9yZS1Qcm92aWRlcm5hbWUifSwgLy8tZGVzdHByb3ZpZGVybmFtZQorICAgICAgICB7ImRlc3RpbmF0aW9uLmtleXN0b3JlLnBhc3N3b3JkIiwKKyAgICAgICAgICAgICAgICAiWmllbC1LZXlzdG9yZS1LZW5ud29ydCJ9LCAvLy1kZXN0c3RvcmVwYXNzCisgICAgICAgIHsiZGVzdGluYXRpb24ua2V5c3RvcmUudHlwZSIsCisgICAgICAgICAgICAgICAgIlppZWwtS2V5c3RvcmUtVHlwIn0sIC8vLWRlc3RzdG9yZXR5cGUKKyAgICAgICAgeyJkaXN0aW5ndWlzaGVkLm5hbWUiLAorICAgICAgICAgICAgICAgICJEaXN0aW5ndWlzaGVkIE5hbWUifSwgLy8tZG5hbWUKKyAgICAgICAgeyJYLjUwOS5leHRlbnNpb24iLAorICAgICAgICAgICAgICAgICJYLjUwOS1FcndlaXRlcnVuZyJ9LCAvLy1leHQKKyAgICAgICAgeyJvdXRwdXQuZmlsZS5uYW1lIiwKKyAgICAgICAgICAgICAgICAiQXVzZ2FiZWRhdGVpbmFtZSJ9LCAvLy1maWxlIGFuZCAtb3V0ZmlsZQorICAgICAgICB7ImlucHV0LmZpbGUubmFtZSIsCisgICAgICAgICAgICAgICAgIkVpbmdhYmVkYXRlaW5hbWUifSwgLy8tZmlsZSBhbmQgLWluZmlsZQorICAgICAgICB7ImtleS5hbGdvcml0aG0ubmFtZSIsCisgICAgICAgICAgICAgICAgIlNjaGxcdTAwRkNzc2VsYWxnb3JpdGhtdXNuYW1lIn0sIC8vLWtleWFsZworICAgICAgICB7ImtleS5wYXNzd29yZCIsCisgICAgICAgICAgICAgICAgIlNjaGxcdTAwRkNzc2Vsa2VubndvcnQifSwgLy8ta2V5cGFzcworICAgICAgICB7ImtleS5iaXQuc2l6ZSIsCisgICAgICAgICAgICAgICAgIlNjaGxcdTAwRkNzc2VsYml0Z3JcdTAwRjZcdTAwREZlIn0sIC8vLWtleXNpemUKKyAgICAgICAgeyJrZXlzdG9yZS5uYW1lIiwKKyAgICAgICAgICAgICAgICAiS2V5c3RvcmUtTmFtZSJ9LCAvLy1rZXlzdG9yZQorICAgICAgICB7Im5ldy5wYXNzd29yZCIsCisgICAgICAgICAgICAgICAgIk5ldWVzIEtlbm53b3J0In0sIC8vLW5ldworICAgICAgICB7ImRvLm5vdC5wcm9tcHQiLAorICAgICAgICAgICAgICAgICJLZWluIFByb21wdCJ9LCAvLy1ub3Byb21wdAorICAgICAgICB7InBhc3N3b3JkLnRocm91Z2gucHJvdGVjdGVkLm1lY2hhbmlzbSIsCisgICAgICAgICAgICAgICAgIktlbm53b3J0IFx1MDBGQ2JlciBnZXNjaFx1MDBGQ3R6dGVuIE1lY2hhbmlzbXVzIn0sIC8vLXByb3RlY3RlZAorICAgICAgICB7InByb3ZpZGVyLmFyZ3VtZW50IiwKKyAgICAgICAgICAgICAgICAiUHJvdmlkZXJhcmd1bWVudCJ9LCAvLy1wcm92aWRlcmFyZworICAgICAgICB7InByb3ZpZGVyLmNsYXNzLm5hbWUiLAorICAgICAgICAgICAgICAgICJQcm92aWRlcmtsYXNzZW5uYW1lIn0sIC8vLXByb3ZpZGVyY2xhc3MKKyAgICAgICAgeyJwcm92aWRlci5uYW1lIiwKKyAgICAgICAgICAgICAgICAiUHJvdmlkZXJuYW1lIn0sIC8vLXByb3ZpZGVybmFtZQorICAgICAgICB7InByb3ZpZGVyLmNsYXNzcGF0aCIsCisgICAgICAgICAgICAgICAgIlByb3ZpZGVyLUNsYXNzcGF0aCJ9LCAvLy1wcm92aWRlcnBhdGgKKyAgICAgICAgeyJvdXRwdXQuaW4uUkZDLnN0eWxlIiwKKyAgICAgICAgICAgICAgICAiQXVzZ2FiZSBpbiBSRkMtU3RpbCJ9LCAvLy1yZmMKKyAgICAgICAgeyJzaWduYXR1cmUuYWxnb3JpdGhtLm5hbWUiLAorICAgICAgICAgICAgICAgICJTaWduYXR1cmFsZ29yaXRobXVzbmFtZSJ9LCAvLy1zaWdhbGcKKyAgICAgICAgeyJzb3VyY2UuYWxpYXMiLAorICAgICAgICAgICAgICAgICJRdWVsbGFsaWFzIn0sIC8vLXNyY2FsaWFzCisgICAgICAgIHsic291cmNlLmtleS5wYXNzd29yZCIsCisgICAgICAgICAgICAgICAgIlF1ZWxsc2NobFx1MDBGQ3NzZWwtS2VubndvcnQifSwgLy8tc3Jja2V5cGFzcworICAgICAgICB7InNvdXJjZS5rZXlzdG9yZS5uYW1lIiwKKyAgICAgICAgICAgICAgICAiUXVlbGwtS2V5c3RvcmUtTmFtZSJ9LCAvLy1zcmNrZXlzdG9yZQorICAgICAgICB7InNvdXJjZS5rZXlzdG9yZS5wYXNzd29yZC5wcm90ZWN0ZWQiLAorICAgICAgICAgICAgICAgICJRdWVsbC1LZXlzdG9yZSBrZW5ud29ydGdlc2NoXHUwMEZDdHp0In0sIC8vLXNyY3Byb3RlY3RlZAorICAgICAgICB7InNvdXJjZS5rZXlzdG9yZS5wcm92aWRlci5uYW1lIiwKKyAgICAgICAgICAgICAgICAiUXVlbGwtS2V5c3RvcmUtUHJvdmlkZXJuYW1lIn0sIC8vLXNyY3Byb3ZpZGVybmFtZQorICAgICAgICB7InNvdXJjZS5rZXlzdG9yZS5wYXNzd29yZCIsCisgICAgICAgICAgICAgICAgIlF1ZWxsLUtleXN0b3JlLUtlbm53b3J0In0sIC8vLXNyY3N0b3JlcGFzcworICAgICAgICB7InNvdXJjZS5rZXlzdG9yZS50eXBlIiwKKyAgICAgICAgICAgICAgICAiUXVlbGwtS2V5c3RvcmUtVHlwIn0sIC8vLXNyY3N0b3JldHlwZQorICAgICAgICB7IlNTTC5zZXJ2ZXIuaG9zdC5hbmQucG9ydCIsCisgICAgICAgICAgICAgICAgIlNTTC1TZXJ2ZXJob3N0IHVuZCAtcG9ydCJ9LCAvLy1zc2xzZXJ2ZXIKKyAgICAgICAgeyJzaWduZWQuamFyLmZpbGUiLAorICAgICAgICAgICAgICAgICJTaWduaWVydGUgSkFSLURhdGVpIn0sIC8vPWphcmZpbGUKKyAgICAgICAgeyJjZXJ0aWZpY2F0ZS52YWxpZGl0eS5zdGFydC5kYXRlLnRpbWUiLAorICAgICAgICAgICAgICAgICJBbmZhbmdzZGF0dW0vLXplaXQgZlx1MDBGQ3IgWmVydGlmaWthdHNnXHUwMEZDbHRpZ2tlaXQifSwgLy8tc3RhcnRkYXRlCisgICAgICAgIHsia2V5c3RvcmUucGFzc3dvcmQiLAorICAgICAgICAgICAgICAgICJLZXlzdG9yZS1LZW5ud29ydCJ9LCAvLy1zdG9yZXBhc3MKKyAgICAgICAgeyJrZXlzdG9yZS50eXBlIiwKKyAgICAgICAgICAgICAgICAiS2V5c3RvcmUtVHlwIn0sIC8vLXN0b3JldHlwZQorICAgICAgICB7InRydXN0LmNlcnRpZmljYXRlcy5mcm9tLmNhY2VydHMiLAorICAgICAgICAgICAgICAgICJaZXJ0aWZpa2F0ZW4gYXVzIGNhY2VydHMgdmVydHJhdWVuIn0sIC8vLXRydXN0Y2FjZXJ0cworICAgICAgICB7InZlcmJvc2Uub3V0cHV0IiwKKyAgICAgICAgICAgICAgICAiVmVyYm9zZS1BdXNnYWJlIn0sIC8vLXYKKyAgICAgICAgeyJ2YWxpZGl0eS5udW1iZXIub2YuZGF5cyIsCisgICAgICAgICAgICAgICAgIkdcdTAwRkNsdGlna2VpdHNkYXVlciAoVGFnZSkifSwgLy8tdmFsaWRpdHkKKyAgICAgICAgeyJTZXJpYWwuSUQub2YuY2VydC50by5yZXZva2UiLAorICAgICAgICAgICAgICAgICAiU2VyaWVsbGUgSUQgZGVzIHp1IGVudHppZWhlbmRlbiBDZXJ0cyJ9LCAvLy1pZAorICAgICAgICAvLyBrZXl0b29sOiBSdW5uaW5nIHBhcnQKKyAgICAgICAgeyJrZXl0b29sLmVycm9yLiIsICJLZXl0b29sLUZlaGxlcjogIn0sCisgICAgICAgIHsiSWxsZWdhbC5vcHRpb24uIiwgIlVuZ1x1MDBGQ2x0aWdlIE9wdGlvbjogICJ9LAorICAgICAgICB7IklsbGVnYWwudmFsdWUuIiwgIlVuZ1x1MDBGQ2x0aWdlciBXZXJ0OiAifSwKKyAgICAgICAgeyJVbmtub3duLnBhc3N3b3JkLnR5cGUuIiwgIlVuYmVrYW5udGVyIEtlbm53b3J0dHlwOiAifSwKKyAgICAgICAgeyJDYW5ub3QuZmluZC5lbnZpcm9ubWVudC52YXJpYWJsZS4iLAorICAgICAgICAgICAgICAgICJVbWdlYnVuZ3N2YXJpYWJsZSBrYW5uIG5pY2h0IGdlZnVuZGVuIHdlcmRlbjogIn0sCisgICAgICAgIHsiQ2Fubm90LmZpbmQuZmlsZS4iLCAiRGF0ZWkga2FubiBuaWNodCBnZWZ1bmRlbiB3ZXJkZW46ICJ9LAorICAgICAgICB7IkNvbW1hbmQub3B0aW9uLmZsYWcubmVlZHMuYW4uYXJndW1lbnQuIiwgIkJlZmVobHNvcHRpb24gezB9IGJlblx1MDBGNnRpZ3QgZWluIEFyZ3VtZW50LiJ9LAorICAgICAgICB7Ildhcm5pbmcuRGlmZmVyZW50LnN0b3JlLmFuZC5rZXkucGFzc3dvcmRzLm5vdC5zdXBwb3J0ZWQuZm9yLlBLQ1MxMi5LZXlTdG9yZXMuSWdub3JpbmcudXNlci5zcGVjaWZpZWQuY29tbWFuZC52YWx1ZS4iLAorICAgICAgICAgICAgICAgICJXYXJudW5nOiBLZWluZSBVbnRlcnN0XHUwMEZDdHp1bmcgZlx1MDBGQ3IgdW50ZXJzY2hpZWRsaWNoZSBTcGVpY2hlci0gdW5kIFNjaGxcdTAwRkNzc2Vsa2VubndcdTAwRjZydGVyIGJlaSBQS0NTMTIgS2V5U3RvcmVzLiBEZXIgYmVudXR6ZXJkZWZpbmllcnRlIFdlcnQgezB9IHdpcmQgaWdub3JpZXJ0LiJ9LAorICAgICAgICB7Ii5rZXlzdG9yZS5tdXN0LmJlLk5PTkUuaWYuc3RvcmV0eXBlLmlzLnswfSIsCisgICAgICAgICAgICAgICAgIi1rZXlzdG9yZSBtdXNzIE5PTkUgc2Vpbiwgd2VubiAtc3RvcmV0eXBlIHswfSBpc3QifSwKKyAgICAgICAgeyJUb28ubWFueS5yZXRyaWVzLnByb2dyYW0udGVybWluYXRlZCIsCisgICAgICAgICAgICAgICAgICJadSB2aWVsZSBlcm5ldXRlIFZlcnN1Y2hlLiBQcm9ncmFtbSB3aXJkIGJlZW5kZXQifSwKKyAgICAgICAgeyIuc3RvcmVwYXNzd2QuYW5kLmtleXBhc3N3ZC5jb21tYW5kcy5ub3Quc3VwcG9ydGVkLmlmLnN0b3JldHlwZS5pcy57MH0iLAorICAgICAgICAgICAgICAgICJCZWZlaGxlIC1zdG9yZXBhc3N3ZCB1bmQgLWtleXBhc3N3ZCB3ZXJkZW4gbmljaHQgdW50ZXJzdFx1MDBGQ3R6dCwgd2VubiAtc3RvcmV0eXBlIHswfSBpc3QifSwKKyAgICAgICAgeyIua2V5cGFzc3dkLmNvbW1hbmRzLm5vdC5zdXBwb3J0ZWQuaWYuc3RvcmV0eXBlLmlzLlBLQ1MxMiIsCisgICAgICAgICAgICAgICAgIkJlZmVobGUgZGVzIFR5cHMgLWtleXBhc3N3ZCB3ZXJkZW4gbmljaHQgdW50ZXJzdFx1MDBGQ3R6dCwgd2VubiAtc3RvcmV0eXBlIFBLQ1MxMiBpc3QifSwKKyAgICAgICAgeyIua2V5cGFzcy5hbmQubmV3LmNhbi5ub3QuYmUuc3BlY2lmaWVkLmlmLnN0b3JldHlwZS5pcy57MH0iLAorICAgICAgICAgICAgICAgICIta2V5cGFzcyB1bmQgLW5ldyBrXHUwMEY2bm5lbiBuaWNodCBhbmdlZ2ViZW4gd2VyZGVuLCB3ZW5uIC1zdG9yZXR5cGUgezB9IGlzdCJ9LAorICAgICAgICB7ImlmLnByb3RlY3RlZC5pcy5zcGVjaWZpZWQudGhlbi5zdG9yZXBhc3Mua2V5cGFzcy5hbmQubmV3Lm11c3Qubm90LmJlLnNwZWNpZmllZCIsCisgICAgICAgICAgICAgICAgIldlbm4gLXByb3RlY3RlZCBhbmdlZ2ViZW4gaXN0LCBkXHUwMEZDcmZlbiAtc3RvcmVwYXNzLCAta2V5cGFzcyB1bmQgLW5ldyBuaWNodCBhbmdlZ2ViZW4gd2VyZGVuIn0sCisgICAgICAgIHsiaWYuc3JjcHJvdGVjdGVkLmlzLnNwZWNpZmllZC50aGVuLnNyY3N0b3JlcGFzcy5hbmQuc3Jja2V5cGFzcy5tdXN0Lm5vdC5iZS5zcGVjaWZpZWQiLAorICAgICAgICAgICAgICAgICJXZW5uIC1zcmNwcm90ZWN0ZWQgYW5nZWdlYmVuIGlzdCwgZFx1MDBGQ3JmZW4gLXNyY3N0b3JlcGFzcyB1bmQgLXNyY2tleXBhc3MgbmljaHQgYW5nZWdlYmVuIHdlcmRlbiJ9LAorICAgICAgICB7ImlmLmtleXN0b3JlLmlzLm5vdC5wYXNzd29yZC5wcm90ZWN0ZWQudGhlbi5zdG9yZXBhc3Mua2V5cGFzcy5hbmQubmV3Lm11c3Qubm90LmJlLnNwZWNpZmllZCIsCisgICAgICAgICAgICAgICAgIldlbm4gZGVyIEtleXN0b3JlIG5pY2h0IGtlbm53b3J0Z2VzY2hcdTAwRkN0enQgaXN0LCBkXHUwMEZDcmZlbiAtc3RvcmVwYXNzLCAta2V5cGFzcyB1bmQgLW5ldyBuaWNodCBhbmdlZ2ViZW4gd2VyZGVuIn0sCisgICAgICAgIHsiaWYuc291cmNlLmtleXN0b3JlLmlzLm5vdC5wYXNzd29yZC5wcm90ZWN0ZWQudGhlbi5zcmNzdG9yZXBhc3MuYW5kLnNyY2tleXBhc3MubXVzdC5ub3QuYmUuc3BlY2lmaWVkIiwKKyAgICAgICAgICAgICAgICAiV2VubiBkZXIgUXVlbGwtS2V5c3RvcmUgbmljaHQga2VubndvcnRnZXNjaFx1MDBGQ3R6dCBpc3QsIGRcdTAwRkNyZmVuIC1zcmNzdG9yZXBhc3MgdW5kIC1zcmNrZXlwYXNzIG5pY2h0IGFuZ2VnZWJlbiB3ZXJkZW4ifSwKKyAgICAgICAgeyJJbGxlZ2FsLnN0YXJ0ZGF0ZS52YWx1ZSIsICJVbmdcdTAwRkNsdGlnZXIgV2VydCBmXHUwMEZDciBBbmZhbmdzZGF0dW0ifSwKKyAgICAgICAgeyJWYWxpZGl0eS5tdXN0LmJlLmdyZWF0ZXIudGhhbi56ZXJvIiwKKyAgICAgICAgICAgICAgICAiR1x1MDBGQ2x0aWdrZWl0IG11c3MgZ3JcdTAwRjZcdTAwREZlciBhbHMgbnVsbCBzZWluIn0sCisgICAgICAgIHsicHJvdk5hbWUubm90LmEucHJvdmlkZXIiLCAiezB9IGtlaW4gUHJvdmlkZXIifSwKKyAgICAgICAgeyJVc2FnZS5lcnJvci5uby5jb21tYW5kLnByb3ZpZGVkIiwgIlZlcndlbmR1bmdzZmVobGVyOiBLZWluIEJlZmVobCBhbmdlZ2ViZW4ifSwKKyAgICAgICAgeyJTb3VyY2Uua2V5c3RvcmUuZmlsZS5leGlzdHMuYnV0LmlzLmVtcHR5LiIsICJRdWVsbC1LZXlzdG9yZS1EYXRlaSBpc3QgendhciB2b3JoYW5kZW4sIGlzdCBhYmVyIGxlZXI6ICJ9LAorICAgICAgICB7IlBsZWFzZS5zcGVjaWZ5LnNyY2tleXN0b3JlIiwgIkdlYmVuIFNpZSAtc3Jja2V5c3RvcmUgYW4ifSwKKyAgICAgICAgeyJNdXN0Lm5vdC5zcGVjaWZ5LmJvdGgudi5hbmQucmZjLndpdGgubGlzdC5jb21tYW5kIiwKKyAgICAgICAgICAgICAgICAiLXYgdW5kIC1yZmMgZFx1MDBGQ3JmZW4gYmVpIEJlZmVobCBcImxpc3RcIiBuaWNodCBiZWlkZSBhbmdlZ2ViZW4gd2VyZGVuIn0sCisgICAgICAgIHsiS2V5LnBhc3N3b3JkLm11c3QuYmUuYXQubGVhc3QuNi5jaGFyYWN0ZXJzIiwKKyAgICAgICAgICAgICAgICAiU2NobFx1MDBGQ3NzZWxrZW5ud29ydCBtdXNzIG1pbmRlc3RlbnMgc2VjaHMgWmVpY2hlbiBsYW5nIHNlaW4ifSwKKyAgICAgICAgeyJOZXcucGFzc3dvcmQubXVzdC5iZS5hdC5sZWFzdC42LmNoYXJhY3RlcnMiLAorICAgICAgICAgICAgICAgICJOZXVlcyBLZW5ud29ydCBtdXNzIG1pbmRlc3RlbnMgc2VjaHMgWmVpY2hlbiBsYW5nIHNlaW4ifSwKKyAgICAgICAgeyJLZXlzdG9yZS5maWxlLmV4aXN0cy5idXQuaXMuZW1wdHkuIiwKKyAgICAgICAgICAgICAgICAiS2V5c3RvcmUtRGF0ZWkgaXN0IHZvcmhhbmRlbiwgaXN0IGFiZXIgbGVlcjogIn0sCisgICAgICAgIHsiS2V5c3RvcmUuZmlsZS5kb2VzLm5vdC5leGlzdC4iLAorICAgICAgICAgICAgICAgICJLZXlzdG9yZS1EYXRlaSBpc3QgbmljaHQgdm9yaGFuZGVuOiAifSwKKyAgICAgICAgeyJNdXN0LnNwZWNpZnkuZGVzdGluYXRpb24uYWxpYXMiLCAiU2llIG1cdTAwRkNzc2VuIGVpbmVuIFppZWxhbGlhcyBhbmdlYmVuIn0sCisgICAgICAgIHsiTXVzdC5zcGVjaWZ5LmFsaWFzIiwgIlNpZSBtXHUwMEZDc3NlbiBlaW5lbiBBbGlhcyBhbmdlYmVuIn0sCisgICAgICAgIHsiS2V5c3RvcmUucGFzc3dvcmQubXVzdC5iZS5hdC5sZWFzdC42LmNoYXJhY3RlcnMiLAorICAgICAgICAgICAgICAgICJLZXlzdG9yZS1LZW5ud29ydCBtdXNzIG1pbmRlc3RlbnMgc2VjaHMgWmVpY2hlbiBsYW5nIHNlaW4ifSwKKyAgICAgICAgeyJFbnRlci5rZXlzdG9yZS5wYXNzd29yZC4iLCAiS2V5c3RvcmUtS2VubndvcnQgZWluZ2ViZW46ICAifSwKKyAgICAgICAgeyJFbnRlci5zb3VyY2Uua2V5c3RvcmUucGFzc3dvcmQuIiwgIlF1ZWxsLUtleXN0b3JlLUtlbm53b3J0IGVpbmdlYmVuOiAgIn0sCisgICAgICAgIHsiRW50ZXIuZGVzdGluYXRpb24ua2V5c3RvcmUucGFzc3dvcmQuIiwgIlppZWwtS2V5c3RvcmUtS2VubndvcnQgZWluZ2ViZW46ICAifSwKKyAgICAgICAgeyJLZXlzdG9yZS5wYXNzd29yZC5pcy50b28uc2hvcnQubXVzdC5iZS5hdC5sZWFzdC42LmNoYXJhY3RlcnMiLAorICAgICAgICAgIktleXN0b3JlLUtlbm53b3J0IGlzdCB6dSBrdXJ6LiBFcyBtdXNzIG1pbmRlc3RlbnMgc2VjaHMgWmVpY2hlbiBsYW5nIHNlaW4ifSwKKyAgICAgICAgeyJVbmtub3duLkVudHJ5LlR5cGUiLCAiVW5iZWthbm50ZXIgRWludHJhZ3N0eXAifSwKKyAgICAgICAgeyJUb28ubWFueS5mYWlsdXJlcy5BbGlhcy5ub3QuY2hhbmdlZCIsICJadSB2aWVsZSBGZWhsZXIuIEFsaWFzIG5pY2h0IGdlXHUwMEU0bmRlcnQifSwKKyAgICAgICAgeyJFbnRyeS5mb3IuYWxpYXMuYWxpYXMuc3VjY2Vzc2Z1bGx5LmltcG9ydGVkLiIsCisgICAgICAgICAgICAgICAgICJFaW50cmFnIGZcdTAwRkNyIEFsaWFzIHswfSBlcmZvbGdyZWljaCBpbXBvcnRpZXJ0LiJ9LAorICAgICAgICB7IkVudHJ5LmZvci5hbGlhcy5hbGlhcy5ub3QuaW1wb3J0ZWQuIiwgIkVpbnRyYWcgZlx1MDBGQ3IgQWxpYXMgezB9IG5pY2h0IGltcG9ydGllcnQuIn0sCisgICAgICAgIHsiUHJvYmxlbS5pbXBvcnRpbmcuZW50cnkuZm9yLmFsaWFzLmFsaWFzLmV4Y2VwdGlvbi5FbnRyeS5mb3IuYWxpYXMuYWxpYXMubm90LmltcG9ydGVkLiIsCisgICAgICAgICAgICAgICAgICJQcm9ibGVtIGJlaW0gSW1wb3J0aWVyZW4gZGVzIEVpbnRyYWdzIGZcdTAwRkNyIEFsaWFzIHswfTogezF9LlxuRWludHJhZyBmXHUwMEZDciBBbGlhcyB7MH0gbmljaHQgaW1wb3J0aWVydC4ifSwKKyAgICAgICAgeyJJbXBvcnQuY29tbWFuZC5jb21wbGV0ZWQub2suZW50cmllcy5zdWNjZXNzZnVsbHkuaW1wb3J0ZWQuZmFpbC5lbnRyaWVzLmZhaWxlZC5vci5jYW5jZWxsZWQiLAorICAgICAgICAgICAgICAgICAiSW1wb3J0YmVmZWhsIGFiZ2VzY2hsb3NzZW46IHswfSBFaW50clx1MDBFNGdlIGVyZm9sZ3JlaWNoIGltcG9ydGllcnQsIHsxfSBFaW50clx1MDBFNGdlIG5pY2h0IGVyZm9sZ3JlaWNoIG9kZXIgYWJnZWJyb2NoZW4ifSwKKyAgICAgICAgeyJXYXJuaW5nLk92ZXJ3cml0aW5nLmV4aXN0aW5nLmFsaWFzLmFsaWFzLmluLmRlc3RpbmF0aW9uLmtleXN0b3JlIiwKKyAgICAgICAgICAgICAgICAgIldhcm51bmc6IFZvcmhhbmRlbmVyIEFsaWFzIHswfSBpbiBaaWVsLUtleXN0b3JlIHdpcmQgXHUwMEZDYmVyc2NocmllYmVuIn0sCisgICAgICAgIHsiRXhpc3RpbmcuZW50cnkuYWxpYXMuYWxpYXMuZXhpc3RzLm92ZXJ3cml0ZS5uby4iLAorICAgICAgICAgICAgICAgICAiRWludHJhZ3NhbGlhcyB7MH0gaXN0IGJlcmVpdHMgdm9yaGFuZGVuLiBcdTAwRENiZXJzY2hyZWliZW4/IFtOZWluXTogICJ9LAorICAgICAgICB7IlRvby5tYW55LmZhaWx1cmVzLnRyeS5sYXRlciIsICJadSB2aWVsZSBGZWhsZXIuIFZlcnN1Y2hlbiBTaWUgZXMgc3BcdTAwRTR0ZXIgZXJuZXV0In0sCisgICAgICAgIHsiQ2VydGlmaWNhdGlvbi5yZXF1ZXN0LnN0b3JlZC5pbi5maWxlLmZpbGVuYW1lLiIsCisgICAgICAgICAgICAgICAgIlplcnRpZml6aWVydW5nc2FuZm9yZGVydW5nIGluIERhdGVpIDx7MH0+IGdlc3BlaWNoZXJ0In0sCisgICAgICAgIHsiU3VibWl0LnRoaXMudG8ueW91ci5DQSIsICJMZWl0ZW4gU2llIGRpZXMgYW4gZGllIENBIHdlaXRlciJ9LAorICAgICAgICB7ImlmLmFsaWFzLm5vdC5zcGVjaWZpZWQuZGVzdGFsaWFzLnNyY2tleXBhc3MuYW5kLmRlc3RrZXlwYXNzLm11c3Qubm90LmJlLnNwZWNpZmllZCIsCisgICAgICAgICAgICAiV2VubiBrZWluIEFsaWFzIGFuZ2VnZWJlbiBpc3QsIGRcdTAwRkNyZmVuIGRlc3RhbGlhcywgc3Jja2V5cGFzcyB1bmQgZGVzdGtleXBhc3MgbmljaHQgYW5nZWdlYmVuIHdlcmRlbiJ9LAorICAgICAgICB7IkNlcnRpZmljYXRlLnN0b3JlZC5pbi5maWxlLmZpbGVuYW1lLiIsCisgICAgICAgICAgICAgICAgIlplcnRpZmlrYXQgaW4gRGF0ZWkgPHswfT4gZ2VzcGVpY2hlcnQifSwKKyAgICAgICAgeyJDZXJ0aWZpY2F0ZS5yZXBseS53YXMuaW5zdGFsbGVkLmluLmtleXN0b3JlIiwKKyAgICAgICAgICAgICAgICAiWmVydGlmaWthdGFudHdvcnQgd3VyZGUgaW4gS2V5c3RvcmUgaW5zdGFsbGllcnQifSwKKyAgICAgICAgeyJDZXJ0aWZpY2F0ZS5yZXBseS53YXMubm90Lmluc3RhbGxlZC5pbi5rZXlzdG9yZSIsCisgICAgICAgICAgICAgICAgIlplcnRpZmlrYXRhbnR3b3J0IHd1cmRlIG5pY2h0IGluIEtleXN0b3JlIGluc3RhbGxpZXJ0In0sCisgICAgICAgIHsiQ2VydGlmaWNhdGUud2FzLmFkZGVkLnRvLmtleXN0b3JlIiwKKyAgICAgICAgICAgICAgICAiWmVydGlmaWthdCB3dXJkZSBLZXlzdG9yZSBoaW56dWdlZlx1MDBGQ2d0In0sCisgICAgICAgIHsiQ2VydGlmaWNhdGUud2FzLm5vdC5hZGRlZC50by5rZXlzdG9yZSIsCisgICAgICAgICAgICAgICAgIlplcnRpZmlrYXQgd3VyZGUgbmljaHQgenUgS2V5c3RvcmUgaGluenVnZWZcdTAwRkNndCJ9LAorICAgICAgICB7Ii5TdG9yaW5nLmtzZm5hbWUuIiwgIlt7MH0gd2lyZCBnZXNpY2hlcnRdIn0sCisgICAgICAgIHsiYWxpYXMuaGFzLm5vLnB1YmxpYy5rZXkuY2VydGlmaWNhdGUuIiwKKyAgICAgICAgICAgICAgICAiezB9IGhhdCBrZWluZW4gUHVibGljIEtleSAoWmVydGlmaWthdCkifSwKKyAgICAgICAgeyJDYW5ub3QuZGVyaXZlLnNpZ25hdHVyZS5hbGdvcml0aG0iLAorICAgICAgICAgICAgICAgICJTaWduYXR1cmFsZ29yaXRobXVzIGthbm4gbmljaHQgYWJnZWxlaXRldCB3ZXJkZW4ifSwKKyAgICAgICAgeyJBbGlhcy5hbGlhcy5kb2VzLm5vdC5leGlzdCIsCisgICAgICAgICAgICAgICAgIkFsaWFzIDx7MH0+IGlzdCBuaWNodCB2b3JoYW5kZW4ifSwKKyAgICAgICAgeyJBbGlhcy5hbGlhcy5oYXMubm8uY2VydGlmaWNhdGUiLAorICAgICAgICAgICAgICAgICJBbGlhcyA8ezB9PiBoYXQga2VpbiBaZXJ0aWZpa2F0In0sCisgICAgICAgIHsiS2V5LnBhaXIubm90LmdlbmVyYXRlZC5hbGlhcy5hbGlhcy5hbHJlYWR5LmV4aXN0cyIsCisgICAgICAgICAgICAgICAgIlNjaGxcdTAwRkNzc2VscGFhciB3dXJkZSBuaWNodCBnZW5lcmllcnQuIEFsaWFzIDx7MH0+IGlzdCBiZXJlaXRzIHZvcmhhbmRlbiJ9LAorICAgICAgICB7IkdlbmVyYXRpbmcua2V5c2l6ZS5iaXQua2V5QWxnTmFtZS5rZXkucGFpci5hbmQuc2VsZi5zaWduZWQuY2VydGlmaWNhdGUuc2lnQWxnTmFtZS53aXRoLmEudmFsaWRpdHkub2YudmFsaWRhbGl0eS5kYXlzLmZvciIsCisgICAgICAgICAgICAgICAgIkdlbmVyaWVyZW4gdm9uIFNjaGxcdTAwRkNzc2VscGFhciAoVHlwIHsxfSwgezB9IEJpdCkgdW5kIHNlbGJzdCBzaWduaWVydGVtIFplcnRpZmlrYXQgKHsyfSkgbWl0IGVpbmVyIEdcdTAwRkNsdGlna2VpdCB2b24gezN9IFRhZ2VuXG5cdGZcdTAwRkNyOiB7NH0ifSwKKyAgICAgICAgeyJFbnRlci5rZXkucGFzc3dvcmQuZm9yLmFsaWFzLiIsICJTY2hsXHUwMEZDc3NlbGtlbm53b3J0IGZcdTAwRkNyIDx7MH0+IGVpbmdlYmVuIn0sCisgICAgICAgIHsiLlJFVFVSTi5pZi5zYW1lLmFzLmtleXN0b3JlLnBhc3N3b3JkLiIsCisgICAgICAgICAgICAgICAgIlx0KFJFVFVSTiwgd2VubiBpZGVudGlzY2ggbWl0IEtleXN0b3JlLUtlbm53b3J0KTogICJ9LAorICAgICAgICB7IktleS5wYXNzd29yZC5pcy50b28uc2hvcnQubXVzdC5iZS5hdC5sZWFzdC42LmNoYXJhY3RlcnMiLAorICAgICAgICAgICAgICAgICJTY2hsXHUwMEZDc3NlbGtlbm53b3J0IGlzdCB6dSBrdXJ6LiBFcyBtdXNzIG1pbmRlc3RlbnMgc2VjaHMgWmVpY2hlbiBsYW5nIHNlaW4ifSwKKyAgICAgICAgeyJUb28ubWFueS5mYWlsdXJlcy5rZXkubm90LmFkZGVkLnRvLmtleXN0b3JlIiwKKyAgICAgICAgICAgICAgICAiWnUgdmllbGUgRmVobGVyLiBTY2hsXHUwMEZDc3NlbCB3dXJkZSBuaWNodCB6dSBLZXlzdG9yZSBoaW56dWdlZlx1MDBGQ2d0In0sCisgICAgICAgIHsiRGVzdGluYXRpb24uYWxpYXMuZGVzdC5hbHJlYWR5LmV4aXN0cyIsCisgICAgICAgICAgICAgICAgIlppZWxhbGlhcyA8ezB9PiBiZXJlaXRzIHZvcmhhbmRlbiJ9LAorICAgICAgICB7IlBhc3N3b3JkLmlzLnRvby5zaG9ydC5tdXN0LmJlLmF0LmxlYXN0LjYuY2hhcmFjdGVycyIsCisgICAgICAgICAgICAgICAgIktlbm53b3J0IGlzdCB6dSBrdXJ6LiBFcyBtdXNzIG1pbmRlc3RlbnMgc2VjaHMgWmVpY2hlbiBsYW5nIHNlaW4ifSwKKyAgICAgICAgeyJUb28ubWFueS5mYWlsdXJlcy5LZXkuZW50cnkubm90LmNsb25lZCIsCisgICAgICAgICAgICAgICAgIlp1IHZpZWxlIEZlaGxlci4gU2NobFx1MDBGQ3NzZWxlaW50cmFnIHd1cmRlIG5pY2h0IGdlY2xvbnQifSwKKyAgICAgICAgeyJrZXkucGFzc3dvcmQuZm9yLmFsaWFzLiIsICJTY2hsXHUwMEZDc3NlbGtlbm53b3J0IGZcdTAwRkNyIDx7MH0+In0sCisgICAgICAgIHsiS2V5c3RvcmUuZW50cnkuZm9yLmlkLmdldE5hbWUuYWxyZWFkeS5leGlzdHMiLAorICAgICAgICAgICAgICAgICJLZXlzdG9yZS1FaW50cmFnIGZcdTAwRkNyIDx7MH0+IGJlcmVpdHMgdm9yaGFuZGVuIn0sCisgICAgICAgIHsiQ3JlYXRpbmcua2V5c3RvcmUuZW50cnkuZm9yLmlkLmdldE5hbWUuIiwKKyAgICAgICAgICAgICAgICAiS2V5c3RvcmUtRWludHJhZyBmXHUwMEZDciA8ezB9PiB3aXJkIGVyc3RlbGx0Li4uIn0sCisgICAgICAgIHsiTm8uZW50cmllcy5mcm9tLmlkZW50aXR5LmRhdGFiYXNlLmFkZGVkIiwKKyAgICAgICAgICAgICAgICAiS2VpbmUgRWludHJcdTAwRTRnZSBhdXMgSWRlbnRpdHktRGF0ZW5iYW5rIGhpbnp1Z2VmXHUwMEZDZ3QifSwKKyAgICAgICAgeyJBbGlhcy5uYW1lLmFsaWFzIiwgIkFsaWFzbmFtZTogezB9In0sCisgICAgICAgIHsiQ3JlYXRpb24uZGF0ZS5rZXlTdG9yZS5nZXRDcmVhdGlvbkRhdGUuYWxpYXMuIiwKKyAgICAgICAgICAgICAgICAiRXJzdGVsbHVuZ3NkYXR1bTogezAsZGF0ZX0ifSwKKyAgICAgICAgeyJhbGlhcy5rZXlTdG9yZS5nZXRDcmVhdGlvbkRhdGUuYWxpYXMuIiwKKyAgICAgICAgICAgICAgICAiezB9LCB7MSxkYXRlfSwgIn0sCisgICAgICAgIHsiYWxpYXMuIiwgInswfSwgIn0sCisgICAgICAgIHsiRW50cnkudHlwZS50eXBlLiIsICJFaW50cmFnc3R5cDogezB9In0sCisgICAgICAgIHsiQ2VydGlmaWNhdGUuY2hhaW4ubGVuZ3RoLiIsICJaZXJ0aWZpa2F0a2V0dGVubFx1MDBFNG5nZTogIn0sCisgICAgICAgIHsiQ2VydGlmaWNhdGUuaS4xLiIsICJaZXJ0aWZpa2F0W3swLG51bWJlcixpbnRlZ2VyfV06In0sCisgICAgICAgIHsiQ2VydGlmaWNhdGUuZmluZ2VycHJpbnQuU0hBMS4iLCAiWmVydGlmaWthdC1GaW5nZXJwcmludCAoU0hBMSk6ICJ9LAorICAgICAgICB7IktleXN0b3JlLnR5cGUuIiwgIktleXN0b3JlLVR5cDogIn0sCisgICAgICAgIHsiS2V5c3RvcmUucHJvdmlkZXIuIiwgIktleXN0b3JlLVByb3ZpZGVyOiAifSwKKyAgICAgICAgeyJZb3VyLmtleXN0b3JlLmNvbnRhaW5zLmtleVN0b3JlLnNpemUuZW50cnkiLAorICAgICAgICAgICAgICAgICJLZXlzdG9yZSBlbnRoXHUwMEU0bHQgezAsbnVtYmVyLGludGVnZXJ9IEVpbnRyYWcifSwKKyAgICAgICAgeyJZb3VyLmtleXN0b3JlLmNvbnRhaW5zLmtleVN0b3JlLnNpemUuZW50cmllcyIsCisgICAgICAgICAgICAgICAgIktleXN0b3JlIGVudGhcdTAwRTRsdCB7MCxudW1iZXIsaW50ZWdlcn0gRWludHJcdTAwRTRnZSJ9LAorICAgICAgICB7IkZhaWxlZC50by5wYXJzZS5pbnB1dCIsICJFaW5nYWJlIGtvbm50ZSBuaWNodCBnZXBhcnN0IHdlcmRlbiJ9LAorICAgICAgICB7IkVtcHR5LmlucHV0IiwgIkxlZXJlIEVpbmdhYmUifSwKKyAgICAgICAgeyJOb3QuWC41MDkuY2VydGlmaWNhdGUiLCAiS2VpbiBYLjUwOS1aZXJ0aWZpa2F0In0sCisgICAgICAgIHsiYWxpYXMuaGFzLm5vLnB1YmxpYy5rZXkiLCAiezB9IGhhdCBrZWluZW4gUHVibGljIEtleSJ9LAorICAgICAgICB7ImFsaWFzLmhhcy5uby5YLjUwOS5jZXJ0aWZpY2F0ZSIsICJ7MH0gaGF0IGtlaW4gWC41MDktWmVydGlmaWthdCJ9LAorICAgICAgICB7Ik5ldy5jZXJ0aWZpY2F0ZS5zZWxmLnNpZ25lZC4iLCAiTmV1ZXMgWmVydGlmaWthdCAoc2VsYnN0IHNpZ25pZXJ0KToifSwKKyAgICAgICAgeyJSZXBseS5oYXMubm8uY2VydGlmaWNhdGVzIiwgIkFudHdvcnQgaGF0IGtlaW5lIFplcnRpZmlrYXRlIn0sCisgICAgICAgIHsiQ2VydGlmaWNhdGUubm90LmltcG9ydGVkLmFsaWFzLmFsaWFzLmFscmVhZHkuZXhpc3RzIiwKKyAgICAgICAgICAgICAgICAiWmVydGlmaWthdCBuaWNodCBpbXBvcnRpZXJ0LiBBbGlhcyA8ezB9PiBpc3QgYmVyZWl0cyB2b3JoYW5kZW4ifSwKKyAgICAgICAgeyJJbnB1dC5ub3QuYW4uWC41MDkuY2VydGlmaWNhdGUiLCAiRWluZ2FiZSBrZWluIFguNTA5LVplcnRpZmlrYXQifSwKKyAgICAgICAgeyJDZXJ0aWZpY2F0ZS5hbHJlYWR5LmV4aXN0cy5pbi5rZXlzdG9yZS51bmRlci5hbGlhcy50cnVzdGFsaWFzLiIsCisgICAgICAgICAgICAgICAgIlplcnRpZmlrYXQgaXN0IGJlcmVpdHMgdW50ZXIgQWxpYXMgPHswfT4gaW0gS2V5c3RvcmUgdm9yaGFuZGVuIn0sCisgICAgICAgIHsiRG8ueW91LnN0aWxsLndhbnQudG8uYWRkLml0Lm5vLiIsCisgICAgICAgICAgICAgICAgIk1cdTAwRjZjaHRlbiBTaWUgZXMgdHJvdHpkZW0gaGluenVmXHUwMEZDZ2VuPyBbTmVpbl06ICAifSwKKyAgICAgICAgeyJDZXJ0aWZpY2F0ZS5hbHJlYWR5LmV4aXN0cy5pbi5zeXN0ZW0ud2lkZS5DQS5rZXlzdG9yZS51bmRlci5hbGlhcy50cnVzdGFsaWFzLiIsCisgICAgICAgICAgICAgICAgIlplcnRpZmlrYXQgaXN0IGJlcmVpdHMgdW50ZXIgQWxpYXMgPHswfT4gaW0gc3lzdGVtd2VpdGVuIENBLUtleXN0b3JlIHZvcmhhbmRlbiJ9LAorICAgICAgICB7IkRvLnlvdS5zdGlsbC53YW50LnRvLmFkZC5pdC50by55b3VyLm93bi5rZXlzdG9yZS5uby4iLAorICAgICAgICAgICAgICAgICJNXHUwMEY2Y2h0ZW4gU2llIGVzIHRyb3R6ZGVtIHp1IElocmVtIGVpZ2VuZW4gS2V5c3RvcmUgaGluenVmXHUwMEZDZ2VuPyBbTmVpbl06ICAifSwKKyAgICAgICAgeyJUcnVzdC50aGlzLmNlcnRpZmljYXRlLm5vLiIsICJEaWVzZW0gWmVydGlmaWthdCB2ZXJ0cmF1ZW4/IFtOZWluXTogICJ9LAorICAgICAgICB7IllFUyIsICJKYSJ9LAorICAgICAgICB7Ik5ldy5wcm9tcHQuIiwgIk5ldWVzIHswfTogIn0sCisgICAgICAgIHsiUGFzc3dvcmRzLm11c3QuZGlmZmVyIiwgIktlbm53XHUwMEY2cnRlciBtXHUwMEZDc3NlbiBzaWNoIHVudGVyc2NoZWlkZW4ifSwKKyAgICAgICAgeyJSZS5lbnRlci5uZXcucHJvbXB0LiIsICJOZXVlcyB7MH0gZXJuZXV0IGVpbmdlYmVuOiAifSwKKyAgICAgICAgeyJSZS5lbnRlci5uZXcucGFzc3dvcmQuIiwgIk5ldWVzIEtlbm53b3J0IGVybmV1dCBlaW5nZWJlbjogIn0sCisgICAgICAgIHsiVGhleS5kb24udC5tYXRjaC5UcnkuYWdhaW4iLCAiS2VpbmUgXHUwMERDYmVyZWluc3RpbW11bmcuIFdpZWRlcmhvbGVuIFNpZSBkZW4gVm9yZ2FuZyJ9LAorICAgICAgICB7IkVudGVyLnByb21wdC5hbGlhcy5uYW1lLiIsICJ7MH0tQWxpYXNuYW1lbiBlaW5nZWJlbjogICJ9LAorICAgICAgICB7IkVudGVyLm5ldy5hbGlhcy5uYW1lLlJFVFVSTi50by5jYW5jZWwuaW1wb3J0LmZvci50aGlzLmVudHJ5LiIsCisgICAgICAgICAgICAgICAgICJHZWJlbiBTaWUgZWluZW4gbmV1ZW4gQWxpYXNuYW1lbiBlaW5cdChSRVRVUk4sIHVtIGRlbiBJbXBvcnQgZGllc2VzIEVpbnRyYWdzIGFienVicmVjaGVuKTogICJ9LAorICAgICAgICB7IkVudGVyLmFsaWFzLm5hbWUuIiwgIkFsaWFzbmFtZW4gZWluZ2ViZW46ICAifSwKKyAgICAgICAgeyIuUkVUVVJOLmlmLnNhbWUuYXMuZm9yLm90aGVyQWxpYXMuIiwKKyAgICAgICAgICAgICAgICAiXHQoUkVUVVJOLCB3ZW5uIGlkZW50aXNjaCBtaXQgPHswfT4pIn0sCisgICAgICAgIHsiLlBBVFRFUk4ucHJpbnRYNTA5Q2VydCIsCisgICAgICAgICAgICAgICAgIkVpZ2VudFx1MDBGQ21lcjogezB9XG5BdXNzdGVsbGVyOiB7MX1cblNlcmllbm51bW1lcjogezJ9XG5HXHUwMEZDbHRpZyB2b246IHszfSBiaXM6IHs0fVxuWmVydGlmaWthdC1GaW5nZXJwcmludHM6XG5cdCBNRDU6ICB7NX1cblx0IFNIQTE6IHs2fVxuXHQgU0hBMjU2OiB7N31cblx0IFNpZ25hdHVyYWxnb3JpdGhtdXNuYW1lOiB7OH1cblx0IFZlcnNpb246IHs5fSJ9LAorICAgICAgICB7IldoYXQuaXMueW91ci5maXJzdC5hbmQubGFzdC5uYW1lLiIsCisgICAgICAgICAgICAgICAgIldpZSBsYXV0ZXQgSWhyIFZvci0gdW5kIE5hY2huYW1lPyJ9LAorICAgICAgICB7IldoYXQuaXMudGhlLm5hbWUub2YueW91ci5vcmdhbml6YXRpb25hbC51bml0LiIsCisgICAgICAgICAgICAgICAgIldpZSBsYXV0ZXQgZGVyIE5hbWUgSWhyZXIgb3JnYW5pc2F0b3Jpc2NoZW4gRWluaGVpdD8ifSwKKyAgICAgICAgeyJXaGF0LmlzLnRoZS5uYW1lLm9mLnlvdXIub3JnYW5pemF0aW9uLiIsCisgICAgICAgICAgICAgICAgIldpZSBsYXV0ZXQgZGVyIE5hbWUgSWhyZXIgT3JnYW5pc2F0aW9uPyJ9LAorICAgICAgICB7IldoYXQuaXMudGhlLm5hbWUub2YueW91ci5DaXR5Lm9yLkxvY2FsaXR5LiIsCisgICAgICAgICAgICAgICAgIldpZSBsYXV0ZXQgZGVyIE5hbWUgSWhyZXIgU3RhZHQgb2RlciBHZW1laW5kZT8ifSwKKyAgICAgICAgeyJXaGF0LmlzLnRoZS5uYW1lLm9mLnlvdXIuU3RhdGUub3IuUHJvdmluY2UuIiwKKyAgICAgICAgICAgICAgICAiV2llIGxhdXRldCBkZXIgTmFtZSBJaHJlcyBCdW5kZXNsYW5kcz8ifSwKKyAgICAgICAgeyJXaGF0LmlzLnRoZS50d28ubGV0dGVyLmNvdW50cnkuY29kZS5mb3IudGhpcy51bml0LiIsCisgICAgICAgICAgICAgICAgIldpZSBsYXV0ZXQgZGVyIExcdTAwRTRuZGVyY29kZSAoendlaSBCdWNoc3RhYmVuKSBmXHUwMEZDciBkaWVzZSBFaW5oZWl0PyJ9LAorICAgICAgICB7IklzLm5hbWUuY29ycmVjdC4iLCAiSXN0IHswfSByaWNodGlnPyJ9LAorICAgICAgICB7Im5vIiwgIk5laW4ifSwKKyAgICAgICAgeyJ5ZXMiLCAiSmEifSwKKyAgICAgICAgeyJ5IiwgIkoifSwKKyAgICAgICAgeyIuZGVmYXVsdFZhbHVlLiIsICIgIFt7MH1dOiAgIn0sCisgICAgICAgIHsiQWxpYXMuYWxpYXMuaGFzLm5vLmtleSIsCisgICAgICAgICAgICAgICAgIkFsaWFzIDx7MH0+IHZlcmZcdTAwRkNndCBcdTAwRkNiZXIga2VpbmVuIFNjaGxcdTAwRkNzc2VsIn0sCisgICAgICAgIHsiQWxpYXMuYWxpYXMucmVmZXJlbmNlcy5hbi5lbnRyeS50eXBlLnRoYXQuaXMubm90LmEucHJpdmF0ZS5rZXkuZW50cnkuVGhlLmtleWNsb25lLmNvbW1hbmQub25seS5zdXBwb3J0cy5jbG9uaW5nLm9mLnByaXZhdGUua2V5IiwKKyAgICAgICAgICAgICAgICAgIkFsaWFzIDx7MH0+IHZlcndlaXN0IGF1ZiBlaW5lbiBFaW50cmFnc3R5cCwgZGVyIGtlaW4gUHJpdmF0ZSBLZXktRWludHJhZyBpc3QuIERlciBCZWZlaGwgLWtleWNsb25lIHVudGVyc3RcdTAwRkN0enQgbnVyIGRhcyBDbG9uZW4gdm9uIFByaXZhdGUgS2V5LUVpbnRyXHUwMEU0Z2VuIn0sCisKKyAgICAgICAgeyIuV0FSTklORy5XQVJOSU5HLldBUk5JTkcuIiwKKyAgICAgICAgICAgICIqKioqKioqKioqKioqKioqKiAgV2FybnVuZyBXYXJudW5nIFdhcm51bmcgICoqKioqKioqKioqKioqKioqIn0sCisgICAgICAgIHsiU2lnbmVyLmQuIiwgIlNpZ25hdHVyZ2ViZXIgIyVkOiJ9LAorICAgICAgICB7IlRpbWVzdGFtcC4iLCAiWmVpdHN0ZW1wZWw6In0sCisgICAgICAgIHsiU2lnbmF0dXJlLiIsICJTaWduYXR1cjoifSwKKyAgICAgICAgeyJDUkxzLiIsICJDUkxzOiJ9LAorICAgICAgICB7IkNlcnRpZmljYXRlLm93bmVyLiIsICJaZXJ0aWZpa2F0ZWlnZW50XHUwMEZDbWVyOiAifSwKKyAgICAgICAgeyJOb3QuYS5zaWduZWQuamFyLmZpbGUiLCAiS2VpbmUgc2lnbmllcnRlIEpBUi1EYXRlaSJ9LAorICAgICAgICB7Ik5vLmNlcnRpZmljYXRlLmZyb20udGhlLlNTTC5zZXJ2ZXIiLAorICAgICAgICAgICAgICAgICJLZWluIFplcnRpZmlrYXQgdm9tIFNTTC1TZXJ2ZXIifSwKKworICAgICAgICB7Ii5UaGUuaW50ZWdyaXR5Lm9mLnRoZS5pbmZvcm1hdGlvbi5zdG9yZWQuaW4ueW91ci5rZXlzdG9yZS4iLAorICAgICAgICAgICAgIiogRGllIEludGVncml0XHUwMEU0dCBkZXIgSW5mb3JtYXRpb25lbiwgZGllIGluIElocmVtIEtleXN0b3JlIGdlc3BlaWNoZXJ0IHNpbmQsICpcbiogd3VyZGUgTklDSFQgZ2Vwclx1MDBGQ2Z0LiBVbSBkaWUgSW50ZWdyaXRcdTAwRTR0IHp1IHByXHUwMEZDZmVuLCAqXG4qIG1cdTAwRkNzc2VuIFNpZSBJaHIgS2V5c3RvcmUtS2VubndvcnQgYW5nZWJlbi4gICAgICAgICAgICAgICAgICAqIn0sCisgICAgICAgIHsiLlRoZS5pbnRlZ3JpdHkub2YudGhlLmluZm9ybWF0aW9uLnN0b3JlZC5pbi50aGUuc3Jja2V5c3RvcmUuIiwKKyAgICAgICAgICAgICIqIERpZSBJbnRlZ3JpdFx1MDBFNHQgZGVyIEluZm9ybWF0aW9uZW4sIGRpZSBpbiBJaHJlbSBTcmNrZXlzdG9yZSBnZXNwZWljaGVydCBzaW5kLCAqXG4qIHd1cmRlIE5JQ0hUIGdlcHJcdTAwRkNmdC4gVW0gZGllIEludGVncml0XHUwMEU0dCB6dSBwclx1MDBGQ2ZlbiwgKlxuKiBtXHUwMEZDc3NlbiBTaWUgSWhyIFNyY2tleXN0b3JlLUtlbm53b3J0IGFuZ2ViZW4uICAgICAgICAgICAgICAgICAgKiJ9LAorCisgICAgICAgIHsiQ2VydGlmaWNhdGUucmVwbHkuZG9lcy5ub3QuY29udGFpbi5wdWJsaWMua2V5LmZvci5hbGlhcy4iLAorICAgICAgICAgICAgICAgICJaZXJ0aWZpa2F0YW50d29ydCBlbnRoXHUwMEU0bHQga2VpbmVuIFB1YmxpYyBLZXkgZlx1MDBGQ3IgPHswfT4ifSwKKyAgICAgICAgeyJJbmNvbXBsZXRlLmNlcnRpZmljYXRlLmNoYWluLmluLnJlcGx5IiwKKyAgICAgICAgICAgICAgICAiVW52b2xsc3RcdTAwRTRuZGlnZSBaZXJ0aWZpa2F0a2V0dGUgaW4gQW50d29ydCJ9LAorICAgICAgICB7IkNlcnRpZmljYXRlLmNoYWluLmluLnJlcGx5LmRvZXMubm90LnZlcmlmeS4iLAorICAgICAgICAgICAgICAgICJaZXJ0aWZpa2F0a2V0dGUgaW4gQW50d29ydCB2ZXJpZml6aWVydCBuaWNodDogIn0sCisgICAgICAgIHsiVG9wLmxldmVsLmNlcnRpZmljYXRlLmluLnJlcGx5LiIsCisgICAgICAgICAgICAgICAgIlplcnRpZmlrYXQgZGVyIG9iZXJzdGVuIEViZW5lIGluIEFudHdvcnQ6XG4ifSwKKyAgICAgICAgeyIuaXMubm90LnRydXN0ZWQuIiwgIi4uLiBpc3QgbmljaHQgdmVydHJhdWVuc3dcdTAwRkNyZGlnLiAifSwKKyAgICAgICAgeyJJbnN0YWxsLnJlcGx5LmFueXdheS5uby4iLCAiQW50d29ydCB0cm90emRlbSBpbnN0YWxsaWVyZW4/IFtOZWluXTogICJ9LAorICAgICAgICB7Ik5PIiwgIk5laW4ifSwKKyAgICAgICAgeyJQdWJsaWMua2V5cy5pbi5yZXBseS5hbmQua2V5c3RvcmUuZG9uLnQubWF0Y2giLAorICAgICAgICAgICAgICAgICJQdWJsaWMgS2V5cyBpbiBBbnR3b3J0IHVuZCBLZXlzdG9yZSBzdGltbWVuIG5pY2h0IFx1MDBGQ2JlcmVpbiJ9LAorICAgICAgICB7IkNlcnRpZmljYXRlLnJlcGx5LmFuZC5jZXJ0aWZpY2F0ZS5pbi5rZXlzdG9yZS5hcmUuaWRlbnRpY2FsIiwKKyAgICAgICAgICAgICAgICAiWmVydGlmaWthdGFudHdvcnQgdW5kIFplcnRpZmlrYXQgaW4gS2V5c3RvcmUgc2luZCBpZGVudGlzY2gifSwKKyAgICAgICAgeyJGYWlsZWQudG8uZXN0YWJsaXNoLmNoYWluLmZyb20ucmVwbHkiLAorICAgICAgICAgICAgICAgICJLZXR0ZSBrb25udGUgZGVyIEFudHdvcnQgbmljaHQgZW50bm9tbWVuIHdlcmRlbiJ9LAorICAgICAgICB7Im4iLCAiTiJ9LAorICAgICAgICB7Ildyb25nLmFuc3dlci50cnkuYWdhaW4iLCAiRmFsc2NoZSBBbnR3b3J0LiBXaWVkZXJob2xlbiBTaWUgZGVuIFZvcmdhbmcifSwKKyAgICAgICAgeyJTZWNyZXQua2V5Lm5vdC5nZW5lcmF0ZWQuYWxpYXMuYWxpYXMuYWxyZWFkeS5leGlzdHMiLAorICAgICAgICAgICAgICAgICJTZWNyZXQgS2V5IHd1cmRlIG5pY2h0IGdlbmVyaWVydC4gQWxpYXMgPHswfT4gaXN0IGJlcmVpdHMgdm9yaGFuZGVuIn0sCisgICAgICAgIHsiUGxlYXNlLnByb3ZpZGUua2V5c2l6ZS5mb3Iuc2VjcmV0LmtleS5nZW5lcmF0aW9uIiwKKyAgICAgICAgICAgICAgICAiR2ViZW4gU2llIC1rZXlzaXplIHp1bSBFcnN0ZWxsZW4gZWluZXMgU2VjcmV0IEtleXMgYW4ifSwKKworICAgICAgICB7IkV4dGVuc2lvbnMuIiwgIkVyd2VpdGVydW5nZW46ICJ9LAorICAgICAgICB7Ii5FbXB0eS52YWx1ZS4iLCAiKExlZXJlciBXZXJ0KSJ9LAorICAgICAgICB7IkV4dGVuc2lvbi5SZXF1ZXN0LiIsICJFcndlaXRlcnVuZ3NhbmZvcmRlcnVuZzoifSwKKyAgICAgICAgeyJQS0NTLjEwLkNlcnRpZmljYXRlLlJlcXVlc3QuVmVyc2lvbi4xLjAuU3ViamVjdC5zLlB1YmxpYy5LZXkucy5mb3JtYXQucy5rZXkuIiwKKyAgICAgICAgICAgICAgICAiUEtDUyAjMTAtWmVydGlmaWthdGFuZm9yZGVydW5nIChWZXJzaW9uIDEuMClcblN1Ympla3Q6ICVzXG5QdWJsaWMgS2V5OiAlcyBGb3JtYXQgJXMgU2NobFx1MDBGQ3NzZWxcbiJ9LAorICAgICAgICB7IlVua25vd24ua2V5VXNhZ2UudHlwZS4iLCAiVW5iZWthbm50ZXIga2V5VXNhZ2UtVHlwOiAifSwKKyAgICAgICAgeyJVbmtub3duLmV4dGVuZGVka2V5VXNhZ2UudHlwZS4iLCAiVW5iZWthbm50ZXIgZXh0ZW5kZWRrZXlVc2FnZS1UeXA6ICJ9LAorICAgICAgICB7IlVua25vd24uQWNjZXNzRGVzY3JpcHRpb24udHlwZS4iLCAiVW5iZWthbm50ZXIgQWNjZXNzRGVzY3JpcHRpb24tVHlwOiAifSwKKyAgICAgICAgeyJVbnJlY29nbml6ZWQuR2VuZXJhbE5hbWUudHlwZS4iLCAiVW5iZWthbm50ZXIgR2VuZXJhbE5hbWUtVHlwOiAifSwKKyAgICAgICAgeyJUaGlzLmV4dGVuc2lvbi5jYW5ub3QuYmUubWFya2VkLmFzLmNyaXRpY2FsLiIsCisgICAgICAgICAgICAgICAgICJFcndlaXRlcnVuZyBrYW5uIG5pY2h0IGFscyBcIktyaXRpc2NoXCIgbWFya2llcnQgd2VyZGVuLiAifSwKKyAgICAgICAgeyJPZGQubnVtYmVyLm9mLmhleC5kaWdpdHMuZm91bmQuIiwgIlVuZ2VyYWRlIEFuemFobCBoZXhhZGV6aW1hbGVyIFppZmZlcm4gZ2VmdW5kZW46ICJ9LAorICAgICAgICB7IlVua25vd24uZXh0ZW5zaW9uLnR5cGUuIiwgIlVuYmVrYW5udGVyIEVyd2VpdGVydW5nc3R5cDogIn0sCisgICAgICAgIHsiY29tbWFuZC57MH0uaXMuYW1iaWd1b3VzLiIsICJCZWZlaGwgezB9IGlzdCBtZWhyZGV1dGlnOiJ9CisgICAgfTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY29udGVudHMgb2YgdGhpcyA8Y29kZT5SZXNvdXJjZUJ1bmRsZTwvY29kZT4uCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGNvbnRlbnRzIG9mIHRoaXMgPGNvZGU+UmVzb3VyY2VCdW5kbGU8L2NvZGU+LgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPYmplY3RbXVtdIGdldENvbnRlbnRzKCkgeworICAgICAgICByZXR1cm4gY29udGVudHM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS90b29scy9rZXl0b29sL1Jlc291cmNlc19lcy5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS90b29scy9rZXl0b29sL1Jlc291cmNlc19lcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0MmMwZWMKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3Rvb2xzL2tleXRvb2wvUmVzb3VyY2VzX2VzLmphdmEKQEAgLTAsMCArMSw0MzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IE9yYWNsZSBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQorICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQorICogcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2Ugc3VuLnNlY3VyaXR5LnRvb2xzLmtleXRvb2w7CisKKy8qKgorICogPHA+IFRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgPGNvZGU+UmVzb3VyY2VCdW5kbGU8L2NvZGU+CisgKiBmb3IgdGhlIGtleXRvb2wuCisgKgorICovCitwdWJsaWMgY2xhc3MgUmVzb3VyY2VzX2VzIGV4dGVuZHMgamF2YS51dGlsLkxpc3RSZXNvdXJjZUJ1bmRsZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXVtdIGNvbnRlbnRzID0geworICAgICAgICB7Ik5FV0xJTkUiLCAiXG4ifSwKKyAgICAgICAgeyJTVEFSIiwKKyAgICAgICAgICAgICAgICAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiJ9LAorICAgICAgICB7IlNUQVJOTiIsCisgICAgICAgICAgICAgICAgIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuIn0sCisKKyAgICAgICAgLy8ga2V5dG9vbDogSGVscCBwYXJ0CisvLyAiT3B0aW9uIiBzaG91bGQgYmUgdHJhbnNsYXRlZC4KKyAgICAgICAgeyIuT1BUSU9OLiIsICIgW09wY2lcdTAwRjNuXS4uLiJ9LAorICAgICAgICB7Ik9wdGlvbnMuIiwgIk9wY2lvbmVzOiJ9LAorICAgICAgICB7IlVzZS5rZXl0b29sLmhlbHAuZm9yLmFsbC5hdmFpbGFibGUuY29tbWFuZHMiLAorICAgICAgICAgICAgICAgICAiVXRpbGljZVwia2V5dG9vbCAtaGVscFwiIHBhcmEgdG9kb3MgbG9zIGNvbWFuZG9zIGRpc3BvbmlibGVzIn0sCisgICAgICAgIHsiS2V5LmFuZC5DZXJ0aWZpY2F0ZS5NYW5hZ2VtZW50LlRvb2wiLAorICAgICAgICAgICAgICAgICAiSGVycmFtaWVudGEgZGUgR2VzdGlcdTAwRjNuIGRlIENlcnRpZmljYWRvcyB5IENsYXZlcyJ9LAorICAgICAgICB7IkNvbW1hbmRzLiIsICJDb21hbmRvczoifSwKKyAgICAgICAgeyJVc2Uua2V5dG9vbC5jb21tYW5kLm5hbWUuaGVscC5mb3IudXNhZ2Uub2YuY29tbWFuZC5uYW1lIiwKKyAgICAgICAgICAgICAgICAiVXRpbGljZSBcImtleXRvb2wgLWNvbW1hbmRfbmFtZSAtaGVscFwiIHBhcmEgbGEgc2ludGF4aXMgZGUgbm9tYnJlX2NvbWFuZG8ifSwKKyAgICAgICAgLy8ga2V5dG9vbDogaGVscDogY29tbWFuZHMKKyAgICAgICAgeyJHZW5lcmF0ZXMuYS5jZXJ0aWZpY2F0ZS5yZXF1ZXN0IiwKKyAgICAgICAgICAgICAgICAiR2VuZXJhIHVuYSBzb2xpY2l0dWQgZGUgY2VydGlmaWNhZG8ifSwgLy8tY2VydHJlcQorICAgICAgICB7IkNoYW5nZXMuYW4uZW50cnkucy5hbGlhcyIsCisgICAgICAgICAgICAgICAgIkNhbWJpYSB1biBhbGlhcyBkZSBlbnRyYWRhIn0sIC8vLWNoYW5nZWFsaWFzCisgICAgICAgIHsiRGVsZXRlcy5hbi5lbnRyeSIsCisgICAgICAgICAgICAgICAgIlN1cHJpbWUgdW5hIGVudHJhZGEifSwgLy8tZGVsZXRlCisgICAgICAgIHsiRXhwb3J0cy5jZXJ0aWZpY2F0ZSIsCisgICAgICAgICAgICAgICAgIkV4cG9ydGEgZWwgY2VydGlmaWNhZG8ifSwgLy8tZXhwb3J0Y2VydAorICAgICAgICB7IkdlbmVyYXRlcy5hLmtleS5wYWlyIiwKKyAgICAgICAgICAgICAgICAiR2VuZXJhIHVuIHBhciBkZSBjbGF2ZXMifSwgLy8tZ2Vua2V5cGFpcgorLy8gdHJhbnNsYXRpb24gb2YgInNlY3JldCIga2V5IHNob3VsZCBiZSBkaWZmZXJlbnQgdG8gInByaXZhdGUiIGtleS4KKyAgICAgICAgeyJHZW5lcmF0ZXMuYS5zZWNyZXQua2V5IiwKKyAgICAgICAgICAgICAgICAiR2VuZXJhIHVuIGNsYXZlIHNlY3JldGEifSwgLy8tZ2Vuc2Vja2V5CisgICAgICAgIHsiR2VuZXJhdGVzLmNlcnRpZmljYXRlLmZyb20uYS5jZXJ0aWZpY2F0ZS5yZXF1ZXN0IiwKKyAgICAgICAgICAgICAgICAiR2VuZXJhIHVuIGNlcnRpZmljYWRvIGEgcGFydGlyIGRlIHVuYSBzb2xpY2l0dWQgZGUgY2VydGlmaWNhZG8ifSwgLy8tZ2VuY2VydAorICAgICAgICB7IkdlbmVyYXRlcy5DUkwiLCAiR2VuZXJhIENSTCJ9LCAvLy1nZW5jcmwKKyAgICAgICAgeyJJbXBvcnRzLmVudHJpZXMuZnJvbS5hLkpESy4xLjEueC5zdHlsZS5pZGVudGl0eS5kYXRhYmFzZSIsCisgICAgICAgICAgICAgICAgIkltcG9ydGEgZW50cmFkYXMgZGVzZGUgdW5hIGJhc2UgZGUgZGF0b3MgZGUgaWRlbnRpZGFkZXMgSkRLIDEuMS54LXN0eWxlIn0sIC8vLWlkZW50aXR5ZGIKKyAgICAgICAgeyJJbXBvcnRzLmEuY2VydGlmaWNhdGUub3IuYS5jZXJ0aWZpY2F0ZS5jaGFpbiIsCisgICAgICAgICAgICAgICAgIkltcG9ydGEgdW4gY2VydGlmaWNhZG8gbyB1bmEgY2FkZW5hIGRlIGNlcnRpZmljYWRvcyJ9LCAvLy1pbXBvcnRjZXJ0CisgICAgICAgIHsiSW1wb3J0cy5vbmUub3IuYWxsLmVudHJpZXMuZnJvbS5hbm90aGVyLmtleXN0b3JlIiwKKyAgICAgICAgICAgICAgICAiSW1wb3J0YSB1bmEgbyB0b2RhcyBsYXMgZW50cmFkYXMgZGVzZGUgb3RybyBhbG1hY1x1MDBFOW4gZGUgY2xhdmVzIn0sIC8vLWltcG9ydGtleXN0b3JlCisgICAgICAgIHsiQ2xvbmVzLmEua2V5LmVudHJ5IiwKKyAgICAgICAgICAgICAgICAiQ2xvbmEgdW5hIGVudHJhZGEgZGUgY2xhdmUifSwgLy8ta2V5Y2xvbmUKKyAgICAgICAgeyJDaGFuZ2VzLnRoZS5rZXkucGFzc3dvcmQub2YuYW4uZW50cnkiLAorICAgICAgICAgICAgICAgICJDYW1iaWEgbGEgY29udHJhc2VcdTAwRjFhIGRlIGNsYXZlIGRlIHVuYSBlbnRyYWRhIn0sIC8vLWtleXBhc3N3ZAorICAgICAgICB7Ikxpc3RzLmVudHJpZXMuaW4uYS5rZXlzdG9yZSIsCisgICAgICAgICAgICAgICAgIkVudW1lcmEgbGFzIGVudHJhZGFzIGRlIHVuIGFsbWFjXHUwMEU5biBkZSBjbGF2ZXMifSwgLy8tbGlzdAorICAgICAgICB7IlByaW50cy50aGUuY29udGVudC5vZi5hLmNlcnRpZmljYXRlIiwKKyAgICAgICAgICAgICAgICAiSW1wcmltZSBlbCBjb250ZW5pZG8gZGUgdW4gY2VydGlmaWNhZG8ifSwgLy8tcHJpbnRjZXJ0CisgICAgICAgIHsiUHJpbnRzLnRoZS5jb250ZW50Lm9mLmEuY2VydGlmaWNhdGUucmVxdWVzdCIsCisgICAgICAgICAgICAgICAgIkltcHJpbWUgZWwgY29udGVuaWRvIGRlIHVuYSBzb2xpY2l0dWQgZGUgY2VydGlmaWNhZG8ifSwgLy8tcHJpbnRjZXJ0cmVxCisgICAgICAgIHsiUHJpbnRzLnRoZS5jb250ZW50Lm9mLmEuQ1JMLmZpbGUiLAorICAgICAgICAgICAgICAgICJJbXByaW1lIGVsIGNvbnRlbmlkbyBkZSB1biBhcmNoaXZvIENSTCJ9LCAvLy1wcmludGNybAorICAgICAgICB7IkdlbmVyYXRlcy5hLnNlbGYuc2lnbmVkLmNlcnRpZmljYXRlIiwKKyAgICAgICAgICAgICAgICAiR2VuZXJhIHVuIGNlcnRpZmljYWRvIGF1dG9maXJtYWRvIn0sIC8vLXNlbGZjZXJ0CisgICAgICAgIHsiQ2hhbmdlcy50aGUuc3RvcmUucGFzc3dvcmQub2YuYS5rZXlzdG9yZSIsCisgICAgICAgICAgICAgICAgIkNhbWJpYSBsYSBjb250cmFzZVx1MDBGMWEgZGUgYWxtYWNcdTAwRTluIGRlIHVuIGFsbWFjXHUwMEU5biBkZSBjbGF2ZXMifSwgLy8tc3RvcmVwYXNzd2QKKyAgICAgICAgLy8ga2V5dG9vbDogaGVscDogb3B0aW9ucworICAgICAgICB7ImFsaWFzLm5hbWUub2YudGhlLmVudHJ5LnRvLnByb2Nlc3MiLAorICAgICAgICAgICAgICAgICJub21icmUgZGUgYWxpYXMgZGUgbGEgZW50cmFkYSBxdWUgc2UgdmEgYSBwcm9jZXNhciJ9LCAvLy1hbGlhcworICAgICAgICB7ImRlc3RpbmF0aW9uLmFsaWFzIiwKKyAgICAgICAgICAgICAgICAiYWxpYXMgZGUgZGVzdGlubyJ9LCAvLy1kZXN0YWxpYXMKKyAgICAgICAgeyJkZXN0aW5hdGlvbi5rZXkucGFzc3dvcmQiLAorICAgICAgICAgICAgICAgICJjb250cmFzZVx1MDBGMWEgZGUgY2xhdmUgZGUgZGVzdGlubyJ9LCAvLy1kZXN0a2V5cGFzcworICAgICAgICB7ImRlc3RpbmF0aW9uLmtleXN0b3JlLm5hbWUiLAorICAgICAgICAgICAgICAgICJub21icmUgZGUgYWxtYWNcdTAwRTluIGRlIGNsYXZlcyBkZSBkZXN0aW5vIn0sIC8vLWRlc3RrZXlzdG9yZQorICAgICAgICB7ImRlc3RpbmF0aW9uLmtleXN0b3JlLnBhc3N3b3JkLnByb3RlY3RlZCIsCisgICAgICAgICAgICAgICAgImFsbWFjXHUwMEU5biBkZSBjbGF2ZXMgZGUgZGVzdGlubyBwcm90ZWdpZG8gcG9yIGNvbnRyYXNlXHUwMEYxYSJ9LCAvLy1kZXN0cHJvdGVjdGVkCisgICAgICAgIHsiZGVzdGluYXRpb24ua2V5c3RvcmUucHJvdmlkZXIubmFtZSIsCisgICAgICAgICAgICAgICAgIm5vbWJyZSBkZSBwcm92ZWVkb3IgZGUgYWxtYWNcdTAwRTluIGRlIGNsYXZlcyBkZSBkZXN0aW5vIn0sIC8vLWRlc3Rwcm92aWRlcm5hbWUKKyAgICAgICAgeyJkZXN0aW5hdGlvbi5rZXlzdG9yZS5wYXNzd29yZCIsCisgICAgICAgICAgICAgICAgImNvbnRyYXNlXHUwMEYxYSBkZSBhbG1hY1x1MDBFOW4gZGUgY2xhdmVzIGRlIGRlc3Rpbm8ifSwgLy8tZGVzdHN0b3JlcGFzcworICAgICAgICB7ImRlc3RpbmF0aW9uLmtleXN0b3JlLnR5cGUiLAorICAgICAgICAgICAgICAgICJ0aXBvIGRlIGFsbWFjXHUwMEU5biBkZSBjbGF2ZXMgZGUgZGVzdGlubyJ9LCAvLy1kZXN0c3RvcmV0eXBlCisgICAgICAgIHsiZGlzdGluZ3Vpc2hlZC5uYW1lIiwKKyAgICAgICAgICAgICAgICAibm9tYnJlIGRpc3RpbnRpdm8ifSwgLy8tZG5hbWUKKyAgICAgICAgeyJYLjUwOS5leHRlbnNpb24iLAorICAgICAgICAgICAgICAgICJleHRlbnNpXHUwMEYzbiBYLjUwOSJ9LCAvLy1leHQKKyAgICAgICAgeyJvdXRwdXQuZmlsZS5uYW1lIiwKKyAgICAgICAgICAgICAgICAibm9tYnJlIGRlIGFyY2hpdm8gZGUgc2FsaWRhIn0sIC8vLWZpbGUgYW5kIC1vdXRmaWxlCisgICAgICAgIHsiaW5wdXQuZmlsZS5uYW1lIiwKKyAgICAgICAgICAgICAgICAibm9tYnJlIGRlIGFyY2hpdm8gZGUgZW50cmFkYSJ9LCAvLy1maWxlIGFuZCAtaW5maWxlCisgICAgICAgIHsia2V5LmFsZ29yaXRobS5uYW1lIiwKKyAgICAgICAgICAgICAgICAibm9tYnJlIGRlIGFsZ29yaXRtbyBkZSBjbGF2ZSJ9LCAvLy1rZXlhbGcKKyAgICAgICAgeyJrZXkucGFzc3dvcmQiLAorICAgICAgICAgICAgICAgICJjb250cmFzZVx1MDBGMWEgZGUgY2xhdmUifSwgLy8ta2V5cGFzcworICAgICAgICB7ImtleS5iaXQuc2l6ZSIsCisgICAgICAgICAgICAgICAgInRhbWFcdTAwRjFvIGRlIGJpdCBkZSBjbGF2ZSJ9LCAvLy1rZXlzaXplCisgICAgICAgIHsia2V5c3RvcmUubmFtZSIsCisgICAgICAgICAgICAgICAgIm5vbWJyZSBkZSBhbG1hY1x1MDBFOW4gZGUgY2xhdmVzIn0sIC8vLWtleXN0b3JlCisgICAgICAgIHsibmV3LnBhc3N3b3JkIiwKKyAgICAgICAgICAgICAgICAibnVldmEgY29udHJhc2VcdTAwRjFhIn0sIC8vLW5ldworICAgICAgICB7ImRvLm5vdC5wcm9tcHQiLAorICAgICAgICAgICAgICAgICJubyBzb2xpY2l0YXIifSwgLy8tbm9wcm9tcHQKKyAgICAgICAgeyJwYXNzd29yZC50aHJvdWdoLnByb3RlY3RlZC5tZWNoYW5pc20iLAorICAgICAgICAgICAgICAgICJjb250cmFzZVx1MDBGMWEgYSB0cmF2XHUwMEU5cyBkZSBtZWNhbmlzbW8gcHJvdGVnaWRvIn0sIC8vLXByb3RlY3RlZAorICAgICAgICB7InByb3ZpZGVyLmFyZ3VtZW50IiwKKyAgICAgICAgICAgICAgICAiYXJndW1lbnRvIGRlbCBwcm92ZWVkb3IifSwgLy8tcHJvdmlkZXJhcmcKKyAgICAgICAgeyJwcm92aWRlci5jbGFzcy5uYW1lIiwKKyAgICAgICAgICAgICAgICAibm9tYnJlIGRlIGNsYXNlIGRlbCBwcm92ZWVkb3IifSwgLy8tcHJvdmlkZXJjbGFzcworICAgICAgICB7InByb3ZpZGVyLm5hbWUiLAorICAgICAgICAgICAgICAgICJub21icmUgZGVsIHByb3ZlZWRvciJ9LCAvLy1wcm92aWRlcm5hbWUKKyAgICAgICAgeyJwcm92aWRlci5jbGFzc3BhdGgiLAorICAgICAgICAgICAgICAgICJjbGFzc3BhdGggZGUgcHJvdmVlZG9yIn0sIC8vLXByb3ZpZGVycGF0aAorICAgICAgICB7Im91dHB1dC5pbi5SRkMuc3R5bGUiLAorICAgICAgICAgICAgICAgICJzYWxpZGEgZW4gZXN0aWxvIFJGQyJ9LCAvLy1yZmMKKyAgICAgICAgeyJzaWduYXR1cmUuYWxnb3JpdGhtLm5hbWUiLAorICAgICAgICAgICAgICAgICJub21icmUgZGUgYWxnb3JpdG1vIGRlIGZpcm1hIn0sIC8vLXNpZ2FsZworICAgICAgICB7InNvdXJjZS5hbGlhcyIsCisgICAgICAgICAgICAgICAgImFsaWFzIGRlIG9yaWdlbiJ9LCAvLy1zcmNhbGlhcworICAgICAgICB7InNvdXJjZS5rZXkucGFzc3dvcmQiLAorICAgICAgICAgICAgICAgICJjb250cmFzZVx1MDBGMWEgZGUgY2xhdmUgZGUgb3JpZ2VuIn0sIC8vLXNyY2tleXBhc3MKKyAgICAgICAgeyJzb3VyY2Uua2V5c3RvcmUubmFtZSIsCisgICAgICAgICAgICAgICAgIm5vbWJyZSBkZSBhbG1hY1x1MDBFOW4gZGUgY2xhdmVzIGRlIG9yaWdlbiJ9LCAvLy1zcmNrZXlzdG9yZQorICAgICAgICB7InNvdXJjZS5rZXlzdG9yZS5wYXNzd29yZC5wcm90ZWN0ZWQiLAorICAgICAgICAgICAgICAgICJhbG1hY1x1MDBFOW4gZGUgY2xhdmVzIGRlIG9yaWdlbiBwcm90ZWdpZG8gcG9yIGNvbnRyYXNlXHUwMEYxYSJ9LCAvLy1zcmNwcm90ZWN0ZWQKKyAgICAgICAgeyJzb3VyY2Uua2V5c3RvcmUucHJvdmlkZXIubmFtZSIsCisgICAgICAgICAgICAgICAgIm5vbWJyZSBkZSBwcm92ZWVkb3IgZGUgYWxtYWNcdTAwRTluIGRlIGNsYXZlcyBkZSBvcmlnZW4ifSwgLy8tc3JjcHJvdmlkZXJuYW1lCisgICAgICAgIHsic291cmNlLmtleXN0b3JlLnBhc3N3b3JkIiwKKyAgICAgICAgICAgICAgICAiY29udHJhc2VcdTAwRjFhIGRlIGFsbWFjXHUwMEU5biBkZSBjbGF2ZXMgZGUgb3JpZ2VuIn0sIC8vLXNyY3N0b3JlcGFzcworICAgICAgICB7InNvdXJjZS5rZXlzdG9yZS50eXBlIiwKKyAgICAgICAgICAgICAgICAidGlwbyBkZSBhbG1hY1x1MDBFOW4gZGUgY2xhdmVzIGRlIG9yaWdlbiJ9LCAvLy1zcmNzdG9yZXR5cGUKKyAgICAgICAgeyJTU0wuc2VydmVyLmhvc3QuYW5kLnBvcnQiLAorICAgICAgICAgICAgICAgICJwdWVydG8geSBob3N0IGRlbCBzZXJ2aWRvciBTU0wifSwgLy8tc3Nsc2VydmVyCisgICAgICAgIHsic2lnbmVkLmphci5maWxlIiwKKyAgICAgICAgICAgICAgICAiYXJjaGl2byBqYXIgZmlybWFkbyJ9LCAvLz1qYXJmaWxlCisgICAgICAgIHsiY2VydGlmaWNhdGUudmFsaWRpdHkuc3RhcnQuZGF0ZS50aW1lIiwKKyAgICAgICAgICAgICAgICAiZmVjaGEvaG9yYSBkZSBpbmljaW8gZGUgdmFsaWRleiBkZWwgY2VydGlmaWNhZG8ifSwgLy8tc3RhcnRkYXRlCisgICAgICAgIHsia2V5c3RvcmUucGFzc3dvcmQiLAorICAgICAgICAgICAgICAgICJjb250cmFzZVx1MDBGMWEgZGUgYWxtYWNcdTAwRTluIGRlIGNsYXZlcyJ9LCAvLy1zdG9yZXBhc3MKKyAgICAgICAgeyJrZXlzdG9yZS50eXBlIiwKKyAgICAgICAgICAgICAgICAidGlwbyBkZSBhbG1hY1x1MDBFOW4gZGUgY2xhdmVzIn0sIC8vLXN0b3JldHlwZQorICAgICAgICB7InRydXN0LmNlcnRpZmljYXRlcy5mcm9tLmNhY2VydHMiLAorICAgICAgICAgICAgICAgICJjZXJ0aWZpY2Fkb3MgZGUgcHJvdGVjY2lcdTAwRjNuIGRlIGNhY2VydHMifSwgLy8tdHJ1c3RjYWNlcnRzCisgICAgICAgIHsidmVyYm9zZS5vdXRwdXQiLAorICAgICAgICAgICAgICAgICJzYWxpZGEgZGV0YWxsYWRhIn0sIC8vLXYKKyAgICAgICAgeyJ2YWxpZGl0eS5udW1iZXIub2YuZGF5cyIsCisgICAgICAgICAgICAgICAgIm5cdTAwRkFtZXJvIGRlIHZhbGlkZXogZGUgZFx1MDBFRGFzIn0sIC8vLXZhbGlkaXR5CisgICAgICAgIHsiU2VyaWFsLklELm9mLmNlcnQudG8ucmV2b2tlIiwKKyAgICAgICAgICAgICAgICAgImlkZW50aWZpY2Fkb3IgZGUgc2VyaWUgZGVsIGNlcnRpZmljYWRvIHF1ZSBzZSB2YSBhIHJldm9jYXIifSwgLy8taWQKKyAgICAgICAgLy8ga2V5dG9vbDogUnVubmluZyBwYXJ0CisgICAgICAgIHsia2V5dG9vbC5lcnJvci4iLCAiZXJyb3IgZGUgaGVycmFtaWVudGEgZGUgY2xhdmVzOiAifSwKKyAgICAgICAgeyJJbGxlZ2FsLm9wdGlvbi4iLCAiT3BjaVx1MDBGM24gbm8gcGVybWl0aWRhOiAgIn0sCisgICAgICAgIHsiSWxsZWdhbC52YWx1ZS4iLCAiVmFsb3Igbm8gcGVybWl0aWRvOiAifSwKKyAgICAgICAgeyJVbmtub3duLnBhc3N3b3JkLnR5cGUuIiwgIlRpcG8gZGUgY29udHJhc2VcdTAwRjFhIGRlc2Nvbm9jaWRvOiAifSwKKyAgICAgICAgeyJDYW5ub3QuZmluZC5lbnZpcm9ubWVudC52YXJpYWJsZS4iLAorICAgICAgICAgICAgICAgICJObyBzZSBoYSBlbmNvbnRyYWRvIGxhIHZhcmlhYmxlIGRlbCBlbnRvcm5vOiAifSwKKyAgICAgICAgeyJDYW5ub3QuZmluZC5maWxlLiIsICJObyBzZSBoYSBlbmNvbnRyYWRvIGVsIGFyY2hpdm86ICJ9LAorICAgICAgICB7IkNvbW1hbmQub3B0aW9uLmZsYWcubmVlZHMuYW4uYXJndW1lbnQuIiwgIkxhIG9wY2lcdTAwRjNuIGRlIGNvbWFuZG8gezB9IG5lY2VzaXRhIHVuIGFyZ3VtZW50by4ifSwKKyAgICAgICAgeyJXYXJuaW5nLkRpZmZlcmVudC5zdG9yZS5hbmQua2V5LnBhc3N3b3Jkcy5ub3Quc3VwcG9ydGVkLmZvci5QS0NTMTIuS2V5U3RvcmVzLklnbm9yaW5nLnVzZXIuc3BlY2lmaWVkLmNvbW1hbmQudmFsdWUuIiwKKyAgICAgICAgICAgICAgICAiQWR2ZXJ0ZW5jaWE6IGxvcyBhbG1hY2VuZXMgZGUgY2xhdmVzIGVuIGZvcm1hdG8gUEtDUzEyIG5vIGFkbWl0ZW4gY29udHJhc2VcdTAwRjFhcyBkZSBjbGF2ZSB5IGFsbWFjZW5hbWllbnRvIGRpc3RpbnRhcy4gU2UgaWdub3Jhclx1MDBFMSBlbCB2YWxvciBlc3BlY2lmaWNhZG8gcG9yIGVsIHVzdWFyaW8sIHswfS4ifSwKKyAgICAgICAgeyIua2V5c3RvcmUubXVzdC5iZS5OT05FLmlmLnN0b3JldHlwZS5pcy57MH0iLAorICAgICAgICAgICAgICAgICIta2V5c3RvcmUgZGViZSBzZXIgTk9ORSBzaSAtc3RvcmV0eXBlIGVzIHswfSJ9LAorICAgICAgICB7IlRvby5tYW55LnJldHJpZXMucHJvZ3JhbS50ZXJtaW5hdGVkIiwKKyAgICAgICAgICAgICAgICAgIkhhIGhhYmlkbyBkZW1hc2lhZG9zIGludGVudG9zLCBzZSBoYSBjZXJyYWRvIGVsIHByb2dyYW1hIn0sCisgICAgICAgIHsiLnN0b3JlcGFzc3dkLmFuZC5rZXlwYXNzd2QuY29tbWFuZHMubm90LnN1cHBvcnRlZC5pZi5zdG9yZXR5cGUuaXMuezB9IiwKKyAgICAgICAgICAgICAgICAiTG9zIGNvbWFuZG9zIC1zdG9yZXBhc3N3ZCB5IC1rZXlwYXNzd2Qgbm8gZXN0XHUwMEUxbiBzb3BvcnRhZG9zIHNpIC1zdG9yZXR5cGUgZXMgezB9In0sCisgICAgICAgIHsiLmtleXBhc3N3ZC5jb21tYW5kcy5ub3Quc3VwcG9ydGVkLmlmLnN0b3JldHlwZS5pcy5QS0NTMTIiLAorICAgICAgICAgICAgICAgICJMb3MgY29tYW5kb3MgLWtleXBhc3N3ZCBubyBlc3RcdTAwRTFuIHNvcG9ydGFkb3Mgc2kgLXN0b3JldHlwZSBlcyBQS0NTMTIifSwKKyAgICAgICAgeyIua2V5cGFzcy5hbmQubmV3LmNhbi5ub3QuYmUuc3BlY2lmaWVkLmlmLnN0b3JldHlwZS5pcy57MH0iLAorICAgICAgICAgICAgICAgICIta2V5cGFzcyB5IC1uZXcgbm8gc2UgcHVlZGVuIGVzcGVjaWZpY2FyIHNpIC1zdG9yZXR5cGUgZXMgezB9In0sCisgICAgICAgIHsiaWYucHJvdGVjdGVkLmlzLnNwZWNpZmllZC50aGVuLnN0b3JlcGFzcy5rZXlwYXNzLmFuZC5uZXcubXVzdC5ub3QuYmUuc3BlY2lmaWVkIiwKKyAgICAgICAgICAgICAgICAic2kgc2UgZXNwZWNpZmljYSAtcHJvdGVjdGVkLCBubyBkZWJlbiBlc3BlY2lmaWNhcnNlIC1zdG9yZXBhc3MsIC1rZXlwYXNzIG5pIC1uZXcifSwKKyAgICAgICAgeyJpZi5zcmNwcm90ZWN0ZWQuaXMuc3BlY2lmaWVkLnRoZW4uc3Jjc3RvcmVwYXNzLmFuZC5zcmNrZXlwYXNzLm11c3Qubm90LmJlLnNwZWNpZmllZCIsCisgICAgICAgICAgICAgICAgIlNpIHNlIGVzcGVjaWZpY2EgLXNyY3Byb3RlY3RlZCwgbm8gc2UgcHVlZGUgZXNwZWNpZmljYXIgLXNyY3N0b3JlcGFzcyBuaSAtc3Jja2V5cGFzcyJ9LAorICAgICAgICB7ImlmLmtleXN0b3JlLmlzLm5vdC5wYXNzd29yZC5wcm90ZWN0ZWQudGhlbi5zdG9yZXBhc3Mua2V5cGFzcy5hbmQubmV3Lm11c3Qubm90LmJlLnNwZWNpZmllZCIsCisgICAgICAgICAgICAgICAgIlNpIGtleXN0b3JlIG5vIGVzdFx1MDBFMSBwcm90ZWdpZG8gcG9yIGNvbnRyYXNlXHUwMEYxYSwgbm8gc2UgZGViZW4gZXNwZWNpZmljYXIgLXN0b3JlcGFzcywgLWtleXBhc3MgbmkgLW5ldyJ9LAorICAgICAgICB7ImlmLnNvdXJjZS5rZXlzdG9yZS5pcy5ub3QucGFzc3dvcmQucHJvdGVjdGVkLnRoZW4uc3Jjc3RvcmVwYXNzLmFuZC5zcmNrZXlwYXNzLm11c3Qubm90LmJlLnNwZWNpZmllZCIsCisgICAgICAgICAgICAgICAgIlNpIGVsIGFsbWFjXHUwMEU5biBkZSBjbGF2ZXMgZGUgb3JpZ2VuIG5vIGVzdFx1MDBFMSBwcm90ZWdpZG8gcG9yIGNvbnRyYXNlXHUwMEYxYSwgbm8gc2UgZGViZW4gZXNwZWNpZmljYXIgLXNyY3N0b3JlcGFzcyBuaSAtc3Jja2V5cGFzcyJ9LAorICAgICAgICB7IklsbGVnYWwuc3RhcnRkYXRlLnZhbHVlIiwgIlZhbG9yIGRlIGZlY2hhIGRlIGluaWNpbyBubyBwZXJtaXRpZG8ifSwKKyAgICAgICAgeyJWYWxpZGl0eS5tdXN0LmJlLmdyZWF0ZXIudGhhbi56ZXJvIiwKKyAgICAgICAgICAgICAgICAiTGEgdmFsaWRleiBkZWJlIHNlciBtYXlvciBxdWUgY2VybyJ9LAorICAgICAgICB7InByb3ZOYW1lLm5vdC5hLnByb3ZpZGVyIiwgInswfSBubyBlcyB1biBwcm92ZWVkb3IifSwKKyAgICAgICAgeyJVc2FnZS5lcnJvci5uby5jb21tYW5kLnByb3ZpZGVkIiwgIkVycm9yIGRlIHNpbnRheGlzOiBubyBzZSBoYSBwcm9wb3JjaW9uYWRvIG5pbmdcdTAwRkFuIGNvbWFuZG8ifSwKKyAgICAgICAgeyJTb3VyY2Uua2V5c3RvcmUuZmlsZS5leGlzdHMuYnV0LmlzLmVtcHR5LiIsICJFbCBhcmNoaXZvIGRlIGFsbWFjXHUwMEU5biBkZSBjbGF2ZXMgZGUgb3JpZ2VuIGV4aXN0ZSwgcGVybyBlc3RcdTAwRTEgdmFjXHUwMEVEbzogIn0sCisgICAgICAgIHsiUGxlYXNlLnNwZWNpZnkuc3Jja2V5c3RvcmUiLCAiRXNwZWNpZmlxdWUgLXNyY2tleXN0b3JlIn0sCisgICAgICAgIHsiTXVzdC5ub3Quc3BlY2lmeS5ib3RoLnYuYW5kLnJmYy53aXRoLmxpc3QuY29tbWFuZCIsCisgICAgICAgICAgICAgICAgIk5vIHNlIGRlYmVuIGVzcGVjaWZpY2FyIC12IHkgLXJmYyBzaW11bHRcdTAwRTFuZWFtZW50ZSBjb24gZWwgY29tYW5kbyAnbGlzdCcifSwKKyAgICAgICAgeyJLZXkucGFzc3dvcmQubXVzdC5iZS5hdC5sZWFzdC42LmNoYXJhY3RlcnMiLAorICAgICAgICAgICAgICAgICJMYSBjb250cmFzZVx1MDBGMWEgZGUgY2xhdmUgZGViZSB0ZW5lciBhbCBtZW5vcyA2IGNhcmFjdGVyZXMifSwKKyAgICAgICAgeyJOZXcucGFzc3dvcmQubXVzdC5iZS5hdC5sZWFzdC42LmNoYXJhY3RlcnMiLAorICAgICAgICAgICAgICAgICJMYSBudWV2YSBjb250cmFzZVx1MDBGMWEgZGViZSB0ZW5lciBhbCBtZW5vcyA2IGNhcmFjdGVyZXMifSwKKyAgICAgICAgeyJLZXlzdG9yZS5maWxlLmV4aXN0cy5idXQuaXMuZW1wdHkuIiwKKyAgICAgICAgICAgICAgICAiRWwgYXJjaGl2byBkZSBhbG1hY1x1MDBFOW4gZGUgY2xhdmVzIGV4aXN0ZSwgcGVybyBlc3RcdTAwRTEgdmFjXHUwMEVEbzogIn0sCisgICAgICAgIHsiS2V5c3RvcmUuZmlsZS5kb2VzLm5vdC5leGlzdC4iLAorICAgICAgICAgICAgICAgICJFbCBhcmNoaXZvIGRlIGFsbWFjXHUwMEU5biBkZSBjbGF2ZXMgbm8gZXhpc3RlOiAifSwKKyAgICAgICAgeyJNdXN0LnNwZWNpZnkuZGVzdGluYXRpb24uYWxpYXMiLCAiU2UgZGViZSBlc3BlY2lmaWNhciB1biBhbGlhcyBkZSBkZXN0aW5vIn0sCisgICAgICAgIHsiTXVzdC5zcGVjaWZ5LmFsaWFzIiwgIlNlIGRlYmUgZXNwZWNpZmljYXIgdW4gYWxpYXMifSwKKyAgICAgICAgeyJLZXlzdG9yZS5wYXNzd29yZC5tdXN0LmJlLmF0LmxlYXN0LjYuY2hhcmFjdGVycyIsCisgICAgICAgICAgICAgICAgIkxhIGNvbnRyYXNlXHUwMEYxYSBkZWwgYWxtYWNcdTAwRTluIGRlIGNsYXZlcyBkZWJlIHRlbmVyIGFsIG1lbm9zIDYgY2FyYWN0ZXJlcyJ9LAorICAgICAgICB7IkVudGVyLmtleXN0b3JlLnBhc3N3b3JkLiIsICJJbnRyb2R1emNhIGxhIGNvbnRyYXNlXHUwMEYxYSBkZWwgYWxtYWNcdTAwRTluIGRlIGNsYXZlczogICJ9LAorICAgICAgICB7IkVudGVyLnNvdXJjZS5rZXlzdG9yZS5wYXNzd29yZC4iLCAiSW50cm9kdXpjYSBsYSBjb250cmFzZVx1MDBGMWEgZGUgYWxtYWNcdTAwRTluIGRlIGNsYXZlcyBkZSBvcmlnZW46ICAifSwKKyAgICAgICAgeyJFbnRlci5kZXN0aW5hdGlvbi5rZXlzdG9yZS5wYXNzd29yZC4iLCAiSW50cm9kdXpjYSBsYSBjb250cmFzZVx1MDBGMWEgZGUgYWxtYWNcdTAwRTluIGRlIGNsYXZlcyBkZSBkZXN0aW5vOiAgIn0sCisgICAgICAgIHsiS2V5c3RvcmUucGFzc3dvcmQuaXMudG9vLnNob3J0Lm11c3QuYmUuYXQubGVhc3QuNi5jaGFyYWN0ZXJzIiwKKyAgICAgICAgICJMYSBjb250cmFzZVx1MDBGMWEgZGVsIGFsbWFjXHUwMEU5biBkZSBjbGF2ZXMgZXMgZGVtYXNpYWRvIGNvcnRhLCBkZWJlIHRlbmVyIGFsIG1lbm9zIDYgY2FyYWN0ZXJlcyJ9LAorICAgICAgICB7IlVua25vd24uRW50cnkuVHlwZSIsICJUaXBvIGRlIEVudHJhZGEgRGVzY29ub2NpZG8ifSwKKyAgICAgICAgeyJUb28ubWFueS5mYWlsdXJlcy5BbGlhcy5ub3QuY2hhbmdlZCIsICJEZW1hc2lhZG9zIGZhbGxvcy4gTm8gc2UgaGEgY2FtYmlhZG8gZWwgYWxpYXMifSwKKyAgICAgICAgeyJFbnRyeS5mb3IuYWxpYXMuYWxpYXMuc3VjY2Vzc2Z1bGx5LmltcG9ydGVkLiIsCisgICAgICAgICAgICAgICAgICJMYSBlbnRyYWRhIGRlbCBhbGlhcyB7MH0gc2UgaGEgaW1wb3J0YWRvIGNvcnJlY3RhbWVudGUuIn0sCisgICAgICAgIHsiRW50cnkuZm9yLmFsaWFzLmFsaWFzLm5vdC5pbXBvcnRlZC4iLCAiTGEgZW50cmFkYSBkZWwgYWxpYXMgezB9IG5vIHNlIGhhIGltcG9ydGFkby4ifSwKKyAgICAgICAgeyJQcm9ibGVtLmltcG9ydGluZy5lbnRyeS5mb3IuYWxpYXMuYWxpYXMuZXhjZXB0aW9uLkVudHJ5LmZvci5hbGlhcy5hbGlhcy5ub3QuaW1wb3J0ZWQuIiwKKyAgICAgICAgICAgICAgICAgIlByb2JsZW1hIGFsIGltcG9ydGFyIGxhIGVudHJhZGEgZGVsIGFsaWFzIHswfTogezF9LlxuTm8gc2UgaGEgaW1wb3J0YWRvIGxhIGVudHJhZGEgZGVsIGFsaWFzIHswfS4ifSwKKyAgICAgICAgeyJJbXBvcnQuY29tbWFuZC5jb21wbGV0ZWQub2suZW50cmllcy5zdWNjZXNzZnVsbHkuaW1wb3J0ZWQuZmFpbC5lbnRyaWVzLmZhaWxlZC5vci5jYW5jZWxsZWQiLAorICAgICAgICAgICAgICAgICAiQ29tYW5kbyBkZSBpbXBvcnRhY2lcdTAwRjNuIGNvbXBsZXRhZG86IHswfSBlbnRyYWRhcyBpbXBvcnRhZGFzIGNvcnJlY3RhbWVudGUsIHsxfSBlbnRyYWRhcyBpbmNvcnJlY3RhcyBvIGNhbmNlbGFkYXMifSwKKyAgICAgICAgeyJXYXJuaW5nLk92ZXJ3cml0aW5nLmV4aXN0aW5nLmFsaWFzLmFsaWFzLmluLmRlc3RpbmF0aW9uLmtleXN0b3JlIiwKKyAgICAgICAgICAgICAgICAgIkFkdmVydGVuY2lhOiBzZSBzb2JyZXNjcmliaXJcdTAwRTEgZWwgYWxpYXMgezB9IGVuIGVsIGFsbWFjXHUwMEU5biBkZSBjbGF2ZXMgZGUgZGVzdGlubyJ9LAorICAgICAgICB7IkV4aXN0aW5nLmVudHJ5LmFsaWFzLmFsaWFzLmV4aXN0cy5vdmVyd3JpdGUubm8uIiwKKyAgICAgICAgICAgICAgICAgIkVsIGFsaWFzIGRlIGVudHJhZGEgZXhpc3RlbnRlIHswfSB5YSBleGlzdGUsIFx1MDBCRmRlc2VhIHNvYnJlc2NyaWJpcmxvPyBbbm9dOiAgIn0sCisgICAgICAgIHsiVG9vLm1hbnkuZmFpbHVyZXMudHJ5LmxhdGVyIiwgIkRlbWFzaWFkb3MgZmFsbG9zOyBpbnRcdTAwRTludGVsbyBtXHUwMEUxcyBhZGVsYW50ZSJ9LAorICAgICAgICB7IkNlcnRpZmljYXRpb24ucmVxdWVzdC5zdG9yZWQuaW4uZmlsZS5maWxlbmFtZS4iLAorICAgICAgICAgICAgICAgICJTb2xpY2l0dWQgZGUgY2VydGlmaWNhY2lcdTAwRjNuIGFsbWFjZW5hZGEgZW4gZWwgYXJjaGl2byA8ezB9PiJ9LAorICAgICAgICB7IlN1Ym1pdC50aGlzLnRvLnlvdXIuQ0EiLCAiRW52aWFyIGEgbGEgQ0EifSwKKyAgICAgICAgeyJpZi5hbGlhcy5ub3Quc3BlY2lmaWVkLmRlc3RhbGlhcy5zcmNrZXlwYXNzLmFuZC5kZXN0a2V5cGFzcy5tdXN0Lm5vdC5iZS5zcGVjaWZpZWQiLAorICAgICAgICAgICAgInNpIG5vIHNlIGVzcGVjaWZpY2EgZWwgYWxpYXMsIG5vIHNlIHB1ZWRlIGVzcGVjaWZpY2FyIGRlc3RhbGlhcywgc3Jja2V5cGFzcyBuaSBkZXN0a2V5cGFzcyJ9LAorICAgICAgICB7IkNlcnRpZmljYXRlLnN0b3JlZC5pbi5maWxlLmZpbGVuYW1lLiIsCisgICAgICAgICAgICAgICAgIkNlcnRpZmljYWRvIGFsbWFjZW5hZG8gZW4gZWwgYXJjaGl2byA8ezB9PiJ9LAorICAgICAgICB7IkNlcnRpZmljYXRlLnJlcGx5Lndhcy5pbnN0YWxsZWQuaW4ua2V5c3RvcmUiLAorICAgICAgICAgICAgICAgICJTZSBoYSBpbnN0YWxhZG8gbGEgcmVzcHVlc3RhIGRlbCBjZXJ0aWZpY2FkbyBlbiBlbCBhbG1hY1x1MDBFOW4gZGUgY2xhdmVzIn0sCisgICAgICAgIHsiQ2VydGlmaWNhdGUucmVwbHkud2FzLm5vdC5pbnN0YWxsZWQuaW4ua2V5c3RvcmUiLAorICAgICAgICAgICAgICAgICJObyBzZSBoYSBpbnN0YWxhZG8gbGEgcmVzcHVlc3RhIGRlbCBjZXJ0aWZpY2FkbyBlbiBlbCBhbG1hY1x1MDBFOW4gZGUgY2xhdmVzIn0sCisgICAgICAgIHsiQ2VydGlmaWNhdGUud2FzLmFkZGVkLnRvLmtleXN0b3JlIiwKKyAgICAgICAgICAgICAgICAiU2UgaGEgYWdyZWdhZG8gZWwgY2VydGlmaWNhZG8gYWwgYWxtYWNcdTAwRTluIGRlIGNsYXZlcyJ9LAorICAgICAgICB7IkNlcnRpZmljYXRlLndhcy5ub3QuYWRkZWQudG8ua2V5c3RvcmUiLAorICAgICAgICAgICAgICAgICJObyBzZSBoYSBhZ3JlZ2FkbyBlbCBjZXJ0aWZpY2FkbyBhbCBhbG1hY1x1MDBFOW4gZGUgY2xhdmVzIn0sCisgICAgICAgIHsiLlN0b3Jpbmcua3NmbmFtZS4iLCAiW0FsbWFjZW5hbmRvIHswfV0ifSwKKyAgICAgICAgeyJhbGlhcy5oYXMubm8ucHVibGljLmtleS5jZXJ0aWZpY2F0ZS4iLAorICAgICAgICAgICAgICAgICJ7MH0gbm8gdGllbmUgY2xhdmUgcFx1MDBGQWJsaWNhIChjZXJ0aWZpY2FkbykifSwKKyAgICAgICAgeyJDYW5ub3QuZGVyaXZlLnNpZ25hdHVyZS5hbGdvcml0aG0iLAorICAgICAgICAgICAgICAgICJObyBzZSBwdWVkZSBkZXJpdmFyIGVsIGFsZ29yaXRtbyBkZSBmaXJtYSJ9LAorICAgICAgICB7IkFsaWFzLmFsaWFzLmRvZXMubm90LmV4aXN0IiwKKyAgICAgICAgICAgICAgICAiRWwgYWxpYXMgPHswfT4gbm8gZXhpc3RlIn0sCisgICAgICAgIHsiQWxpYXMuYWxpYXMuaGFzLm5vLmNlcnRpZmljYXRlIiwKKyAgICAgICAgICAgICAgICAiRWwgYWxpYXMgPHswfT4gbm8gdGllbmUgY2VydGlmaWNhZG8ifSwKKyAgICAgICAgeyJLZXkucGFpci5ub3QuZ2VuZXJhdGVkLmFsaWFzLmFsaWFzLmFscmVhZHkuZXhpc3RzIiwKKyAgICAgICAgICAgICAgICAiTm8gc2UgaGEgZ2VuZXJhZG8gZWwgcGFyIGRlIGNsYXZlcywgZWwgYWxpYXMgPHswfT4geWEgZXhpc3RlIn0sCisgICAgICAgIHsiR2VuZXJhdGluZy5rZXlzaXplLmJpdC5rZXlBbGdOYW1lLmtleS5wYWlyLmFuZC5zZWxmLnNpZ25lZC5jZXJ0aWZpY2F0ZS5zaWdBbGdOYW1lLndpdGguYS52YWxpZGl0eS5vZi52YWxpZGFsaXR5LmRheXMuZm9yIiwKKyAgICAgICAgICAgICAgICAiR2VuZXJhbmRvIHBhciBkZSBjbGF2ZXMgezF9IGRlIHswfSBiaXRzIHBhcmEgY2VydGlmaWNhZG8gYXV0b2Zpcm1hZG8gKHsyfSkgY29uIHVuYSB2YWxpZGV6IGRlIHszfSBkXHUwMEVEYXNcblx0cGFyYTogezR9In0sCisgICAgICAgIHsiRW50ZXIua2V5LnBhc3N3b3JkLmZvci5hbGlhcy4iLCAiSW50cm9kdXpjYSBsYSBjb250cmFzZVx1MDBGMWEgZGUgY2xhdmUgcGFyYSA8ezB9PiJ9LAorICAgICAgICB7Ii5SRVRVUk4uaWYuc2FtZS5hcy5rZXlzdG9yZS5wYXNzd29yZC4iLAorICAgICAgICAgICAgICAgICJcdChJTlRSTyBzaSBlcyBsYSBtaXNtYSBjb250cmFzZVx1MDBGMWEgcXVlIGxhIGRlbCBhbG1hY1x1MDBFOW4gZGUgY2xhdmVzKTogICJ9LAorICAgICAgICB7IktleS5wYXNzd29yZC5pcy50b28uc2hvcnQubXVzdC5iZS5hdC5sZWFzdC42LmNoYXJhY3RlcnMiLAorICAgICAgICAgICAgICAgICJMYSBjb250cmFzZVx1MDBGMWEgZGUgY2xhdmUgZXMgZGVtYXNpYWRvIGNvcnRhOyBkZWJlIHRlbmVyIGFsIG1lbm9zIDYgY2FyYWN0ZXJlcyJ9LAorICAgICAgICB7IlRvby5tYW55LmZhaWx1cmVzLmtleS5ub3QuYWRkZWQudG8ua2V5c3RvcmUiLAorICAgICAgICAgICAgICAgICJEZW1hc2lhZG9zIGZhbGxvczsgbm8gc2UgaGEgYWdyZWdhZG8gbGEgY2xhdmUgYWwgYWxtYWNcdTAwRTluIGRlIGNsYXZlcyJ9LAorICAgICAgICB7IkRlc3RpbmF0aW9uLmFsaWFzLmRlc3QuYWxyZWFkeS5leGlzdHMiLAorICAgICAgICAgICAgICAgICJFbCBhbGlhcyBkZSBkZXN0aW5vIDx7MH0+IHlhIGV4aXN0ZSJ9LAorICAgICAgICB7IlBhc3N3b3JkLmlzLnRvby5zaG9ydC5tdXN0LmJlLmF0LmxlYXN0LjYuY2hhcmFjdGVycyIsCisgICAgICAgICAgICAgICAgIkxhIGNvbnRyYXNlXHUwMEYxYSBlcyBkZW1hc2lhZG8gY29ydGE7IGRlYmUgdGVuZXIgYWwgbWVub3MgNiBjYXJhY3RlcmVzIn0sCisgICAgICAgIHsiVG9vLm1hbnkuZmFpbHVyZXMuS2V5LmVudHJ5Lm5vdC5jbG9uZWQiLAorICAgICAgICAgICAgICAgICJEZW1hc2lhZG9zIGZhbGxvcy4gTm8gc2UgaGEgY2xvbmFkbyBsYSBlbnRyYWRhIGRlIGNsYXZlIn0sCisgICAgICAgIHsia2V5LnBhc3N3b3JkLmZvci5hbGlhcy4iLCAiY29udHJhc2VcdTAwRjFhIGRlIGNsYXZlIHBhcmEgPHswfT4ifSwKKyAgICAgICAgeyJLZXlzdG9yZS5lbnRyeS5mb3IuaWQuZ2V0TmFtZS5hbHJlYWR5LmV4aXN0cyIsCisgICAgICAgICAgICAgICAgIkxhIGVudHJhZGEgZGUgYWxtYWNcdTAwRTluIGRlIGNsYXZlcyBwYXJhIDx7MH0+IHlhIGV4aXN0ZSJ9LAorICAgICAgICB7IkNyZWF0aW5nLmtleXN0b3JlLmVudHJ5LmZvci5pZC5nZXROYW1lLiIsCisgICAgICAgICAgICAgICAgIkNyZWFuZG8gZW50cmFkYSBkZSBhbG1hY1x1MDBFOW4gZGUgY2xhdmVzIHBhcmEgPHswfT4gLi4uIn0sCisgICAgICAgIHsiTm8uZW50cmllcy5mcm9tLmlkZW50aXR5LmRhdGFiYXNlLmFkZGVkIiwKKyAgICAgICAgICAgICAgICAiTm8gc2UgaGFuIGFncmVnYWRvIGVudHJhZGFzIGRlIGxhIGJhc2UgZGUgZGF0b3MgZGUgaWRlbnRpZGFkZXMifSwKKyAgICAgICAgeyJBbGlhcy5uYW1lLmFsaWFzIiwgIk5vbWJyZSBkZSBBbGlhczogezB9In0sCisgICAgICAgIHsiQ3JlYXRpb24uZGF0ZS5rZXlTdG9yZS5nZXRDcmVhdGlvbkRhdGUuYWxpYXMuIiwKKyAgICAgICAgICAgICAgICAiRmVjaGEgZGUgQ3JlYWNpXHUwMEYzbjogezAsZGF0ZX0ifSwKKyAgICAgICAgeyJhbGlhcy5rZXlTdG9yZS5nZXRDcmVhdGlvbkRhdGUuYWxpYXMuIiwKKyAgICAgICAgICAgICAgICAiezB9LCB7MSxkYXRlfSwgIn0sCisgICAgICAgIHsiYWxpYXMuIiwgInswfSwgIn0sCisgICAgICAgIHsiRW50cnkudHlwZS50eXBlLiIsICJUaXBvIGRlIEVudHJhZGE6IHswfSJ9LAorICAgICAgICB7IkNlcnRpZmljYXRlLmNoYWluLmxlbmd0aC4iLCAiTG9uZ2l0dWQgZGUgbGEgQ2FkZW5hIGRlIENlcnRpZmljYWRvOiAifSwKKyAgICAgICAgeyJDZXJ0aWZpY2F0ZS5pLjEuIiwgIkNlcnRpZmljYWRvW3swLG51bWJlcixpbnRlZ2VyfV06In0sCisgICAgICAgIHsiQ2VydGlmaWNhdGUuZmluZ2VycHJpbnQuU0hBMS4iLCAiSHVlbGxhIERpZ2l0YWwgZGUgQ2VydGlmaWNhZG8gKFNIQTEpOiAifSwKKyAgICAgICAgeyJLZXlzdG9yZS50eXBlLiIsICJUaXBvIGRlIEFsbWFjXHUwMEU5biBkZSBDbGF2ZXM6ICJ9LAorICAgICAgICB7IktleXN0b3JlLnByb3ZpZGVyLiIsICJQcm92ZWVkb3IgZGUgQWxtYWNcdTAwRTluIGRlIENsYXZlczogIn0sCisgICAgICAgIHsiWW91ci5rZXlzdG9yZS5jb250YWlucy5rZXlTdG9yZS5zaXplLmVudHJ5IiwKKyAgICAgICAgICAgICAgICAiU3UgYWxtYWNcdTAwRTluIGRlIGNsYXZlcyBjb250aWVuZSB7MCxudW1iZXIsaW50ZWdlcn0gZW50cmFkYSJ9LAorICAgICAgICB7IllvdXIua2V5c3RvcmUuY29udGFpbnMua2V5U3RvcmUuc2l6ZS5lbnRyaWVzIiwKKyAgICAgICAgICAgICAgICAiU3UgYWxtYWNcdTAwRTluIGRlIGNsYXZlcyBjb250aWVuZSB7MCxudW1iZXIsaW50ZWdlcn0gZW50cmFkYXMifSwKKyAgICAgICAgeyJGYWlsZWQudG8ucGFyc2UuaW5wdXQiLCAiRmFsbG8gYWwgYW5hbGl6YXIgbGEgZW50cmFkYSJ9LAorICAgICAgICB7IkVtcHR5LmlucHV0IiwgIkVudHJhZGEgdmFjXHUwMEVEYSJ9LAorICAgICAgICB7Ik5vdC5YLjUwOS5jZXJ0aWZpY2F0ZSIsICJObyBlcyB1biBjZXJ0aWZpY2FkbyBYLjUwOSJ9LAorICAgICAgICB7ImFsaWFzLmhhcy5uby5wdWJsaWMua2V5IiwgInswfSBubyB0aWVuZSBjbGF2ZSBwXHUwMEZBYmxpY2EifSwKKyAgICAgICAgeyJhbGlhcy5oYXMubm8uWC41MDkuY2VydGlmaWNhdGUiLCAiezB9IG5vIHRpZW5lIGNlcnRpZmljYWRvIFguNTA5In0sCisgICAgICAgIHsiTmV3LmNlcnRpZmljYXRlLnNlbGYuc2lnbmVkLiIsICJOdWV2byBDZXJ0aWZpY2FkbyAoQXV0b2Zpcm1hZG8pOiJ9LAorICAgICAgICB7IlJlcGx5Lmhhcy5uby5jZXJ0aWZpY2F0ZXMiLCAiTGEgcmVzcHVlc3RhIG5vIHRpZW5lIGNlcnRpZmljYWRvcyJ9LAorICAgICAgICB7IkNlcnRpZmljYXRlLm5vdC5pbXBvcnRlZC5hbGlhcy5hbGlhcy5hbHJlYWR5LmV4aXN0cyIsCisgICAgICAgICAgICAgICAgIkNlcnRpZmljYWRvIG5vIGltcG9ydGFkbywgZWwgYWxpYXMgPHswfT4geWEgZXhpc3RlIn0sCisgICAgICAgIHsiSW5wdXQubm90LmFuLlguNTA5LmNlcnRpZmljYXRlIiwgIkxhIGVudHJhZGEgbm8gZXMgdW4gY2VydGlmaWNhZG8gWC41MDkifSwKKyAgICAgICAgeyJDZXJ0aWZpY2F0ZS5hbHJlYWR5LmV4aXN0cy5pbi5rZXlzdG9yZS51bmRlci5hbGlhcy50cnVzdGFsaWFzLiIsCisgICAgICAgICAgICAgICAgIkVsIGNlcnRpZmljYWRvIHlhIGV4aXN0ZSBlbiBlbCBhbG1hY1x1MDBFOW4gZGUgY2xhdmVzIGNvbiBlbCBhbGlhcyA8ezB9PiJ9LAorICAgICAgICB7IkRvLnlvdS5zdGlsbC53YW50LnRvLmFkZC5pdC5uby4iLAorICAgICAgICAgICAgICAgICJcdTAwQkZBXHUwMEZBbiBkZXNlYSBhZ3JlZ2FybG8/IFtub106ICAifSwKKyAgICAgICAgeyJDZXJ0aWZpY2F0ZS5hbHJlYWR5LmV4aXN0cy5pbi5zeXN0ZW0ud2lkZS5DQS5rZXlzdG9yZS51bmRlci5hbGlhcy50cnVzdGFsaWFzLiIsCisgICAgICAgICAgICAgICAgIkVsIGNlcnRpZmljYWRvIHlhIGV4aXN0ZSBlbiBlbCBhbG1hY1x1MDBFOW4gZGUgY2xhdmVzIGRlIGxhIENBIGRlbCBzaXN0ZW1hLCBjb24gZWwgYWxpYXMgPHswfT4ifSwKKyAgICAgICAgeyJEby55b3Uuc3RpbGwud2FudC50by5hZGQuaXQudG8ueW91ci5vd24ua2V5c3RvcmUubm8uIiwKKyAgICAgICAgICAgICAgICAiXHUwMEJGQVx1MDBGQW4gZGVzZWEgYWdyZWdhcmxvIGEgc3UgcHJvcGlvIGFsbWFjXHUwMEU5biBkZSBjbGF2ZXM/IFtub106ICAifSwKKyAgICAgICAgeyJUcnVzdC50aGlzLmNlcnRpZmljYXRlLm5vLiIsICJcdTAwQkZDb25maWFyIGVuIGVzdGUgY2VydGlmaWNhZG8/IFtub106ICAifSwKKyAgICAgICAgeyJZRVMiLCAiU1x1MDBFRCJ9LAorICAgICAgICB7Ik5ldy5wcm9tcHQuIiwgIk51ZXZvIHswfTogIn0sCisgICAgICAgIHsiUGFzc3dvcmRzLm11c3QuZGlmZmVyIiwgIkxhcyBjb250cmFzZVx1MDBGMWFzIGRlYmVuIHNlciBkaXN0aW50YXMifSwKKyAgICAgICAgeyJSZS5lbnRlci5uZXcucHJvbXB0LiIsICJWdWVsdmEgYSBlc2NyaWJpciBlbCBudWV2byB7MH06ICJ9LAorICAgICAgICB7IlJlLmVudGVyLm5ldy5wYXNzd29yZC4iLCAiVm9sdmVyIGEgZXNjcmliaXIgbGEgY29udHJhc2VcdTAwRjFhIG51ZXZhOiAifSwKKyAgICAgICAgeyJUaGV5LmRvbi50Lm1hdGNoLlRyeS5hZ2FpbiIsICJObyBjb2luY2lkZW4uIEludFx1MDBFOW50ZWxvIGRlIG51ZXZvIn0sCisgICAgICAgIHsiRW50ZXIucHJvbXB0LmFsaWFzLm5hbWUuIiwgIkVzY3JpYmEgZWwgbm9tYnJlIGRlIGFsaWFzIGRlIHswfTogICJ9LAorICAgICAgICB7IkVudGVyLm5ldy5hbGlhcy5uYW1lLlJFVFVSTi50by5jYW5jZWwuaW1wb3J0LmZvci50aGlzLmVudHJ5LiIsCisgICAgICAgICAgICAgICAgICJJbmRpcXVlIGVsIG51ZXZvIG5vbWJyZSBkZSBhbGlhc1x0KElOVFJPIHBhcmEgY2FuY2VsYXIgbGEgaW1wb3J0YWNpXHUwMEYzbiBkZSBlc3RhIGVudHJhZGEpOiAgIn0sCisgICAgICAgIHsiRW50ZXIuYWxpYXMubmFtZS4iLCAiSW50cm9kdXpjYSBlbCBub21icmUgZGUgYWxpYXM6ICAifSwKKyAgICAgICAgeyIuUkVUVVJOLmlmLnNhbWUuYXMuZm9yLm90aGVyQWxpYXMuIiwKKyAgICAgICAgICAgICAgICAiXHQoSU5UUk8gc2kgZXMgZWwgbWlzbW8gcXVlIHBhcmEgPHswfT4pIn0sCisgICAgICAgIHsiLlBBVFRFUk4ucHJpbnRYNTA5Q2VydCIsCisgICAgICAgICAgICAgICAgIlByb3BpZXRhcmlvOiB7MH1cbkVtaXNvcjogezF9XG5OXHUwMEZBbWVybyBkZSBzZXJpZTogezJ9XG5WXHUwMEUxbGlkbyBkZXNkZTogezN9IGhhc3RhOiB7NH1cbkh1ZWxsYXMgZGlnaXRhbGVzIGRlbCBDZXJ0aWZpY2Fkbzpcblx0IE1ENTogezV9XG5cdCBTSEExOiB7Nn1cblx0IFNIQTI1Njogezd9XG5cdCBOb21icmUgZGVsIEFsZ29yaXRtbyBkZSBGaXJtYTogezh9XG5cdCBWZXJzaVx1MDBGM246IHs5fSJ9LAorICAgICAgICB7IldoYXQuaXMueW91ci5maXJzdC5hbmQubGFzdC5uYW1lLiIsCisgICAgICAgICAgICAgICAgIlx1MDBCRkN1XHUwMEUxbGVzIHNvbiBzdSBub21icmUgeSBzdSBhcGVsbGlkbz8ifSwKKyAgICAgICAgeyJXaGF0LmlzLnRoZS5uYW1lLm9mLnlvdXIub3JnYW5pemF0aW9uYWwudW5pdC4iLAorICAgICAgICAgICAgICAgICJcdTAwQkZDdVx1MDBFMWwgZXMgZWwgbm9tYnJlIGRlIHN1IHVuaWRhZCBkZSBvcmdhbml6YWNpXHUwMEYzbj8ifSwKKyAgICAgICAgeyJXaGF0LmlzLnRoZS5uYW1lLm9mLnlvdXIub3JnYW5pemF0aW9uLiIsCisgICAgICAgICAgICAgICAgIlx1MDBCRkN1XHUwMEUxbCBlcyBlbCBub21icmUgZGUgc3Ugb3JnYW5pemFjaVx1MDBGM24/In0sCisgICAgICAgIHsiV2hhdC5pcy50aGUubmFtZS5vZi55b3VyLkNpdHkub3IuTG9jYWxpdHkuIiwKKyAgICAgICAgICAgICAgICAiXHUwMEJGQ3VcdTAwRTFsIGVzIGVsIG5vbWJyZSBkZSBzdSBjaXVkYWQgbyBsb2NhbGlkYWQ/In0sCisgICAgICAgIHsiV2hhdC5pcy50aGUubmFtZS5vZi55b3VyLlN0YXRlLm9yLlByb3ZpbmNlLiIsCisgICAgICAgICAgICAgICAgIlx1MDBCRkN1XHUwMEUxbCBlcyBlbCBub21icmUgZGUgc3UgZXN0YWRvIG8gcHJvdmluY2lhPyJ9LAorICAgICAgICB7IldoYXQuaXMudGhlLnR3by5sZXR0ZXIuY291bnRyeS5jb2RlLmZvci50aGlzLnVuaXQuIiwKKyAgICAgICAgICAgICAgICAiXHUwMEJGQ3VcdTAwRTFsIGVzIGVsIGNcdTAwRjNkaWdvIGRlIHBhXHUwMEVEcyBkZSBkb3MgbGV0cmFzIGRlIGxhIHVuaWRhZD8ifSwKKyAgICAgICAgeyJJcy5uYW1lLmNvcnJlY3QuIiwgIlx1MDBCRkVzIGNvcnJlY3RvIHswfT8ifSwKKyAgICAgICAgeyJubyIsICJubyJ9LAorICAgICAgICB7InllcyIsICJzXHUwMEVEIn0sCisgICAgICAgIHsieSIsICJzIn0sCisgICAgICAgIHsiLmRlZmF1bHRWYWx1ZS4iLCAiICBbezB9XTogICJ9LAorICAgICAgICB7IkFsaWFzLmFsaWFzLmhhcy5uby5rZXkiLAorICAgICAgICAgICAgICAgICJFbCBhbGlhcyA8ezB9PiBubyB0aWVuZSBjbGF2ZSJ9LAorICAgICAgICB7IkFsaWFzLmFsaWFzLnJlZmVyZW5jZXMuYW4uZW50cnkudHlwZS50aGF0LmlzLm5vdC5hLnByaXZhdGUua2V5LmVudHJ5LlRoZS5rZXljbG9uZS5jb21tYW5kLm9ubHkuc3VwcG9ydHMuY2xvbmluZy5vZi5wcml2YXRlLmtleSIsCisgICAgICAgICAgICAgICAgICJFbCBhbGlhcyA8ezB9PiBoYWNlIHJlZmVyZW5jaWEgYSB1biB0aXBvIGRlIGVudHJhZGEgcXVlIG5vIGVzIHVuYSBjbGF2ZSBwcml2YWRhLiBFbCBjb21hbmRvIC1rZXljbG9uZSBzXHUwMEYzbG8gcGVybWl0ZSBsYSBjbG9uYWNpXHUwMEYzbiBkZSBlbnRyYWRhcyBkZSBjbGF2ZXMgcHJpdmFkYXMifSwKKworICAgICAgICB7Ii5XQVJOSU5HLldBUk5JTkcuV0FSTklORy4iLAorICAgICAgICAgICAgIioqKioqKioqKioqKioqKioqICBBZHZlcnRlbmNpYSBBZHZlcnRlbmNpYSBBZHZlcnRlbmNpYSAgKioqKioqKioqKioqKioqKioifSwKKyAgICAgICAgeyJTaWduZXIuZC4iLCAiIyVkIGRlIEZpcm1hbnRlOiJ9LAorICAgICAgICB7IlRpbWVzdGFtcC4iLCAiUmVnaXN0cm8gZGUgSG9yYToifSwKKyAgICAgICAgeyJTaWduYXR1cmUuIiwgIkZpcm1hOiJ9LAorICAgICAgICB7IkNSTHMuIiwgIkNSTDoifSwKKyAgICAgICAgeyJDZXJ0aWZpY2F0ZS5vd25lci4iLCAiUHJvcGlldGFyaW8gZGVsIENlcnRpZmljYWRvOiAifSwKKyAgICAgICAgeyJOb3QuYS5zaWduZWQuamFyLmZpbGUiLCAiTm8gZXMgdW4gYXJjaGl2byBqYXIgZmlybWFkbyJ9LAorICAgICAgICB7Ik5vLmNlcnRpZmljYXRlLmZyb20udGhlLlNTTC5zZXJ2ZXIiLAorICAgICAgICAgICAgICAgICJOaW5nXHUwMEZBbiBjZXJ0aWZpY2FkbyBkZWwgc2Vydmlkb3IgU1NMIn0sCisKKyAgICAgICAgeyIuVGhlLmludGVncml0eS5vZi50aGUuaW5mb3JtYXRpb24uc3RvcmVkLmluLnlvdXIua2V5c3RvcmUuIiwKKyAgICAgICAgICAgICIqIExhIGludGVncmlkYWQgZGUgbGEgaW5mb3JtYWNpXHUwMEYzbiBhbG1hY2VuYWRhIGVuIGVsIGFsbWFjXHUwMEU5biBkZSBjbGF2ZXMgICpcbiogTk8gc2UgaGEgY29tcHJvYmFkby4gIFBhcmEgY29tcHJvYmFyIGRpY2hhIGludGVncmlkYWQsICpcbiogZGViZSBwcm9wb3JjaW9uYXIgbGEgY29udHJhc2VcdTAwRjFhIGRlbCBhbG1hY1x1MDBFOW4gZGUgY2xhdmVzLiAgICAgICAgICAgICAgICAgICoifSwKKyAgICAgICAgeyIuVGhlLmludGVncml0eS5vZi50aGUuaW5mb3JtYXRpb24uc3RvcmVkLmluLnRoZS5zcmNrZXlzdG9yZS4iLAorICAgICAgICAgICAgIiogTGEgaW50ZWdyaWRhZCBkZSBsYSBpbmZvcm1hY2lcdTAwRjNuIGFsbWFjZW5hZGEgZW4gc3Jja2V5c3RvcmUqXG4qIE5PIHNlIGhhIGNvbXByb2JhZG8uICBQYXJhIGNvbXByb2JhciBkaWNoYSBpbnRlZ3JpZGFkLCAqXG4qIGRlYmUgcHJvcG9yY2lvbmFyIGxhIGNvbnRyYXNlXHUwMEYxYSBkZSBzcmNrZXlzdG9yZS4gICAgICAgICAgICAgICAgKiJ9LAorCisgICAgICAgIHsiQ2VydGlmaWNhdGUucmVwbHkuZG9lcy5ub3QuY29udGFpbi5wdWJsaWMua2V5LmZvci5hbGlhcy4iLAorICAgICAgICAgICAgICAgICJMYSByZXNwdWVzdGEgZGUgY2VydGlmaWNhZG8gbm8gY29udGllbmUgdW5hIGNsYXZlIHBcdTAwRkFibGljYSBwYXJhIDx7MH0+In0sCisgICAgICAgIHsiSW5jb21wbGV0ZS5jZXJ0aWZpY2F0ZS5jaGFpbi5pbi5yZXBseSIsCisgICAgICAgICAgICAgICAgIkNhZGVuYSBkZSBjZXJ0aWZpY2FkbyBpbmNvbXBsZXRhIGVuIGxhIHJlc3B1ZXN0YSJ9LAorICAgICAgICB7IkNlcnRpZmljYXRlLmNoYWluLmluLnJlcGx5LmRvZXMubm90LnZlcmlmeS4iLAorICAgICAgICAgICAgICAgICJMYSBjYWRlbmEgZGUgY2VydGlmaWNhZG8gZGUgbGEgcmVzcHVlc3RhIG5vIHZlcmlmaWNhOiAifSwKKyAgICAgICAgeyJUb3AubGV2ZWwuY2VydGlmaWNhdGUuaW4ucmVwbHkuIiwKKyAgICAgICAgICAgICAgICAiQ2VydGlmaWNhZG8gZGUgbml2ZWwgc3VwZXJpb3IgZW4gbGEgcmVzcHVlc3RhOlxuIn0sCisgICAgICAgIHsiLmlzLm5vdC50cnVzdGVkLiIsICIuLi4gbm8gZXMgZGUgY29uZmlhbnphLiAifSwKKyAgICAgICAgeyJJbnN0YWxsLnJlcGx5LmFueXdheS5uby4iLCAiXHUwMEJGSW5zdGFsYXIgcmVzcHVlc3RhIGRlIHRvZG9zIG1vZG9zPyBbbm9dOiAgIn0sCisgICAgICAgIHsiTk8iLCAiTm8ifSwKKyAgICAgICAgeyJQdWJsaWMua2V5cy5pbi5yZXBseS5hbmQua2V5c3RvcmUuZG9uLnQubWF0Y2giLAorICAgICAgICAgICAgICAgICJMYXMgY2xhdmVzIHBcdTAwRkFibGljYXMgZW4gbGEgcmVzcHVlc3RhIHkgZW4gZWwgYWxtYWNcdTAwRTluIGRlIGNsYXZlcyBubyBjb2luY2lkZW4ifSwKKyAgICAgICAgeyJDZXJ0aWZpY2F0ZS5yZXBseS5hbmQuY2VydGlmaWNhdGUuaW4ua2V5c3RvcmUuYXJlLmlkZW50aWNhbCIsCisgICAgICAgICAgICAgICAgIkxhIHJlc3B1ZXN0YSBkZWwgY2VydGlmaWNhZG8geSBlbCBjZXJ0aWZpY2FkbyBlbiBlbCBhbG1hY1x1MDBFOW4gZGUgY2xhdmVzIHNvbiBpZFx1MDBFOW50aWNvcyJ9LAorICAgICAgICB7IkZhaWxlZC50by5lc3RhYmxpc2guY2hhaW4uZnJvbS5yZXBseSIsCisgICAgICAgICAgICAgICAgIk5vIHNlIGhhIHBvZGlkbyBkZWZpbmlyIHVuYSBjYWRlbmEgYSBwYXJ0aXIgZGUgbGEgcmVzcHVlc3RhIn0sCisgICAgICAgIHsibiIsICJuIn0sCisgICAgICAgIHsiV3JvbmcuYW5zd2VyLnRyeS5hZ2FpbiIsICJSZXNwdWVzdGEgaW5jb3JyZWN0YSwgdnVlbHZhIGEgaW50ZW50YXJsbyJ9LAorICAgICAgICB7IlNlY3JldC5rZXkubm90LmdlbmVyYXRlZC5hbGlhcy5hbGlhcy5hbHJlYWR5LmV4aXN0cyIsCisgICAgICAgICAgICAgICAgIk5vIHNlIGhhIGdlbmVyYWRvIGxhIGNsYXZlIHNlY3JldGEsIGVsIGFsaWFzIDx7MH0+IHlhIGV4aXN0ZSJ9LAorICAgICAgICB7IlBsZWFzZS5wcm92aWRlLmtleXNpemUuZm9yLnNlY3JldC5rZXkuZ2VuZXJhdGlvbiIsCisgICAgICAgICAgICAgICAgIlByb3BvcmNpb25lIGVsIHZhbG9yIGRlIC1rZXlzaXplIHBhcmEgbGEgZ2VuZXJhY2lcdTAwRjNuIGRlIGNsYXZlcyBzZWNyZXRhcyJ9LAorCisgICAgICAgIHsiRXh0ZW5zaW9ucy4iLCAiRXh0ZW5zaW9uZXM6ICJ9LAorICAgICAgICB7Ii5FbXB0eS52YWx1ZS4iLCAiKFZhbG9yIHZhY1x1MDBFRG8pIn0sCisgICAgICAgIHsiRXh0ZW5zaW9uLlJlcXVlc3QuIiwgIlNvbGljaXR1ZCBkZSBFeHRlbnNpXHUwMEYzbjoifSwKKyAgICAgICAgeyJQS0NTLjEwLkNlcnRpZmljYXRlLlJlcXVlc3QuVmVyc2lvbi4xLjAuU3ViamVjdC5zLlB1YmxpYy5LZXkucy5mb3JtYXQucy5rZXkuIiwKKyAgICAgICAgICAgICAgICAiU29saWNpdHVkIGRlIENlcnRpZmljYWRvIFBLQ1MgIzEwIChWZXJzaVx1MDBGM24gMS4wKVxuQXN1bnRvOiAlc1xuQ2xhdmUgUFx1MDBGQWJsaWNhOiAlcyBmb3JtYXRvICVzIGNsYXZlXG4ifSwKKyAgICAgICAgeyJVbmtub3duLmtleVVzYWdlLnR5cGUuIiwgIlRpcG8gZGUgdXNvIGRlIGNsYXZlIGRlc2Nvbm9jaWRvOiAifSwKKyAgICAgICAgeyJVbmtub3duLmV4dGVuZGVka2V5VXNhZ2UudHlwZS4iLCAiVGlwbyBkZSB1c28gZGUgY2xhdmUgZXh0ZW5kaWRhIGRlc2Nvbm9jaWRvOiAifSwKKyAgICAgICAgeyJVbmtub3duLkFjY2Vzc0Rlc2NyaXB0aW9uLnR5cGUuIiwgIlRpcG8gZGUgZGVzY3JpcGNpXHUwMEYzbiBkZSBhY2Nlc28gZGVzY29ub2NpZG86ICJ9LAorICAgICAgICB7IlVucmVjb2duaXplZC5HZW5lcmFsTmFtZS50eXBlLiIsICJUaXBvIGRlIG5vbWJyZSBnZW5lcmFsIG5vIHJlY29ub2NpZG86ICJ9LAorICAgICAgICB7IlRoaXMuZXh0ZW5zaW9uLmNhbm5vdC5iZS5tYXJrZWQuYXMuY3JpdGljYWwuIiwKKyAgICAgICAgICAgICAgICAgIkVzdGEgZXh0ZW5zaVx1MDBGM24gbm8gc2UgcHVlZGUgbWFyY2FyIGNvbW8gY3JcdTAwRUR0aWNhLiAifSwKKyAgICAgICAgeyJPZGQubnVtYmVyLm9mLmhleC5kaWdpdHMuZm91bmQuIiwgIlNlIGhhIGVuY29udHJhZG8gdW4gblx1MDBGQW1lcm8gaW1wYXIgZGUgZFx1MDBFRGdpdG9zIGhleGFkZWNpbWFsZXM6ICJ9LAorICAgICAgICB7IlVua25vd24uZXh0ZW5zaW9uLnR5cGUuIiwgIlRpcG8gZGUgZXh0ZW5zaVx1MDBGM24gZGVzY29ub2NpZGE6ICJ9LAorICAgICAgICB7ImNvbW1hbmQuezB9LmlzLmFtYmlndW91cy4iLCAiRWwgY29tYW5kbyB7MH0gZXMgYW1iaWd1bzoifQorICAgIH07CisKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGNvbnRlbnRzIG9mIHRoaXMgPGNvZGU+UmVzb3VyY2VCdW5kbGU8L2NvZGU+LgorICAgICAqCisgICAgICogPHA+CisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBjb250ZW50cyBvZiB0aGlzIDxjb2RlPlJlc291cmNlQnVuZGxlPC9jb2RlPi4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0W11bXSBnZXRDb250ZW50cygpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRlbnRzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdG9vbHMva2V5dG9vbC9SZXNvdXJjZXNfZnIuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdG9vbHMva2V5dG9vbC9SZXNvdXJjZXNfZnIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWUxNDc2Ci0tLSAvZGV2L251bGwKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS90b29scy9rZXl0b29sL1Jlc291cmNlc19mci5qYXZhCkBAIC0wLDAgKzEsNDMxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBPcmFjbGUgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKKyAqIHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIHN1bi5zZWN1cml0eS50b29scy5rZXl0b29sOworCisvKioKKyAqIDxwPiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIDxjb2RlPlJlc291cmNlQnVuZGxlPC9jb2RlPgorICogZm9yIHRoZSBrZXl0b29sLgorICoKKyAqLworcHVibGljIGNsYXNzIFJlc291cmNlc19mciBleHRlbmRzIGphdmEudXRpbC5MaXN0UmVzb3VyY2VCdW5kbGUgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W11bXSBjb250ZW50cyA9IHsKKyAgICAgICAgeyJORVdMSU5FIiwgIlxuIn0sCisgICAgICAgIHsiU1RBUiIsCisgICAgICAgICAgICAgICAgIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioifSwKKyAgICAgICAgeyJTVEFSTk4iLAorICAgICAgICAgICAgICAgICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cbiJ9LAorCisgICAgICAgIC8vIGtleXRvb2w6IEhlbHAgcGFydAorLy8gIk9wdGlvbiIgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCisgICAgICAgIHsiLk9QVElPTi4iLCAiIFtPcHRpb25dLi4uIn0sCisgICAgICAgIHsiT3B0aW9ucy4iLCAiT3B0aW9ucyA6In0sCisgICAgICAgIHsiVXNlLmtleXRvb2wuaGVscC5mb3IuYWxsLmF2YWlsYWJsZS5jb21tYW5kcyIsCisgICAgICAgICAgICAgICAgICJVdGlsaXNlciBcImtleXRvb2wgLWhlbHBcIiBwb3VyIHRvdXRlcyBsZXMgY29tbWFuZGVzIGRpc3BvbmlibGVzIn0sCisgICAgICAgIHsiS2V5LmFuZC5DZXJ0aWZpY2F0ZS5NYW5hZ2VtZW50LlRvb2wiLAorICAgICAgICAgICAgICAgICAiT3V0aWwgZGUgZ2VzdGlvbiBkZSBjZXJ0aWZpY2F0cyBldCBkZSBjbFx1MDBFOXMifSwKKyAgICAgICAgeyJDb21tYW5kcy4iLCAiQ29tbWFuZGVzIDoifSwKKyAgICAgICAgeyJVc2Uua2V5dG9vbC5jb21tYW5kLm5hbWUuaGVscC5mb3IudXNhZ2Uub2YuY29tbWFuZC5uYW1lIiwKKyAgICAgICAgICAgICAgICAiVXRpbGlzZXIgXCJrZXl0b29sIC1jb21tYW5kX25hbWUgLWhlbHBcIiBwb3VyIGxhIHN5bnRheGUgZGUgY29tbWFuZF9uYW1lIn0sCisgICAgICAgIC8vIGtleXRvb2w6IGhlbHA6IGNvbW1hbmRzCisgICAgICAgIHsiR2VuZXJhdGVzLmEuY2VydGlmaWNhdGUucmVxdWVzdCIsCisgICAgICAgICAgICAgICAgIkdcdTAwRTluXHUwMEU4cmUgdW5lIGRlbWFuZGUgZGUgY2VydGlmaWNhdCJ9LCAvLy1jZXJ0cmVxCisgICAgICAgIHsiQ2hhbmdlcy5hbi5lbnRyeS5zLmFsaWFzIiwKKyAgICAgICAgICAgICAgICAiTW9kaWZpZSBsJ2FsaWFzIGQndW5lIGVudHJcdTAwRTllIn0sIC8vLWNoYW5nZWFsaWFzCisgICAgICAgIHsiRGVsZXRlcy5hbi5lbnRyeSIsCisgICAgICAgICAgICAgICAgIlN1cHByaW1lIHVuZSBlbnRyXHUwMEU5ZSJ9LCAvLy1kZWxldGUKKyAgICAgICAgeyJFeHBvcnRzLmNlcnRpZmljYXRlIiwKKyAgICAgICAgICAgICAgICAiRXhwb3J0ZSBsZSBjZXJ0aWZpY2F0In0sIC8vLWV4cG9ydGNlcnQKKyAgICAgICAgeyJHZW5lcmF0ZXMuYS5rZXkucGFpciIsCisgICAgICAgICAgICAgICAgIkdcdTAwRTluXHUwMEU4cmUgdW5lIHBhaXJlIGRlIGNsXHUwMEU5cyJ9LCAvLy1nZW5rZXlwYWlyCisvLyB0cmFuc2xhdGlvbiBvZiAic2VjcmV0IiBrZXkgc2hvdWxkIGJlIGRpZmZlcmVudCB0byAicHJpdmF0ZSIga2V5LgorICAgICAgICB7IkdlbmVyYXRlcy5hLnNlY3JldC5rZXkiLAorICAgICAgICAgICAgICAgICJHXHUwMEU5blx1MDBFOHJlIHVuZSBjbFx1MDBFOSBzZWNyXHUwMEU4dGUifSwgLy8tZ2Vuc2Vja2V5CisgICAgICAgIHsiR2VuZXJhdGVzLmNlcnRpZmljYXRlLmZyb20uYS5jZXJ0aWZpY2F0ZS5yZXF1ZXN0IiwKKyAgICAgICAgICAgICAgICAiR1x1MDBFOW5cdTAwRThyZSBsZSBjZXJ0aWZpY2F0IFx1MDBFMCBwYXJ0aXIgZCd1bmUgZGVtYW5kZSBkZSBjZXJ0aWZpY2F0In0sIC8vLWdlbmNlcnQKKyAgICAgICAgeyJHZW5lcmF0ZXMuQ1JMIiwgIkdcdTAwRTluXHUwMEU4cmUgbGEgbGlzdGUgZGVzIGNlcnRpZmljYXRzIHJcdTAwRTl2b3F1XHUwMEU5cyAoQ1JMKSJ9LCAvLy1nZW5jcmwKKyAgICAgICAgeyJJbXBvcnRzLmVudHJpZXMuZnJvbS5hLkpESy4xLjEueC5zdHlsZS5pZGVudGl0eS5kYXRhYmFzZSIsCisgICAgICAgICAgICAgICAgIkltcG9ydGUgbGVzIGVudHJcdTAwRTllcyBcdTAwRTAgcGFydGlyIGQndW5lIGJhc2UgZGUgZG9ublx1MDBFOWVzIGQnaWRlbnRpdFx1MDBFOXMgZGUgdHlwZSBKREsgMS4xLngifSwgLy8taWRlbnRpdHlkYgorICAgICAgICB7IkltcG9ydHMuYS5jZXJ0aWZpY2F0ZS5vci5hLmNlcnRpZmljYXRlLmNoYWluIiwKKyAgICAgICAgICAgICAgICAiSW1wb3J0ZSB1biBjZXJ0aWZpY2F0IG91IHVuZSBjaGFcdTAwRUVuZSBkZSBjZXJ0aWZpY2F0In0sIC8vLWltcG9ydGNlcnQKKyAgICAgICAgeyJJbXBvcnRzLm9uZS5vci5hbGwuZW50cmllcy5mcm9tLmFub3RoZXIua2V5c3RvcmUiLAorICAgICAgICAgICAgICAgICJJbXBvcnRlIHVuZSBlbnRyXHUwMEU5ZSBvdSBsYSB0b3RhbGl0XHUwMEU5IGRlcyBlbnRyXHUwMEU5ZXMgZGVwdWlzIHVuIGF1dHJlIGZpY2hpZXIgZGUgY2xcdTAwRTlzIn0sIC8vLWltcG9ydGtleXN0b3JlCisgICAgICAgIHsiQ2xvbmVzLmEua2V5LmVudHJ5IiwKKyAgICAgICAgICAgICAgICAiQ2xvbmUgdW5lIGVudHJcdTAwRTllIGRlIGNsXHUwMEU5In0sIC8vLWtleWNsb25lCisgICAgICAgIHsiQ2hhbmdlcy50aGUua2V5LnBhc3N3b3JkLm9mLmFuLmVudHJ5IiwKKyAgICAgICAgICAgICAgICAiTW9kaWZpZSBsZSBtb3QgZGUgcGFzc2UgZGUgY2xcdTAwRTkgZCd1bmUgZW50clx1MDBFOWUifSwgLy8ta2V5cGFzc3dkCisgICAgICAgIHsiTGlzdHMuZW50cmllcy5pbi5hLmtleXN0b3JlIiwKKyAgICAgICAgICAgICAgICAiUlx1MDBFOXBlcnRvcmllIGxlcyBlbnRyXHUwMEU5ZXMgZCd1biBmaWNoaWVyIGRlIGNsXHUwMEU5cyJ9LCAvLy1saXN0CisgICAgICAgIHsiUHJpbnRzLnRoZS5jb250ZW50Lm9mLmEuY2VydGlmaWNhdGUiLAorICAgICAgICAgICAgICAgICJJbXByaW1lIGxlIGNvbnRlbnUgZCd1biBjZXJ0aWZpY2F0In0sIC8vLXByaW50Y2VydAorICAgICAgICB7IlByaW50cy50aGUuY29udGVudC5vZi5hLmNlcnRpZmljYXRlLnJlcXVlc3QiLAorICAgICAgICAgICAgICAgICJJbXByaW1lIGxlIGNvbnRlbnUgZCd1bmUgZGVtYW5kZSBkZSBjZXJ0aWZpY2F0In0sIC8vLXByaW50Y2VydHJlcQorICAgICAgICB7IlByaW50cy50aGUuY29udGVudC5vZi5hLkNSTC5maWxlIiwKKyAgICAgICAgICAgICAgICAiSW1wcmltZSBsZSBjb250ZW51IGQndW4gZmljaGllciBkZSBsaXN0ZSBkZXMgY2VydGlmaWNhdHMgclx1MDBFOXZvcXVcdTAwRTlzIChDUkwpIn0sIC8vLXByaW50Y3JsCisgICAgICAgIHsiR2VuZXJhdGVzLmEuc2VsZi5zaWduZWQuY2VydGlmaWNhdGUiLAorICAgICAgICAgICAgICAgICJHXHUwMEU5blx1MDBFOHJlIHVuIGNlcnRpZmljYXQgYXV0by1zaWduXHUwMEU5In0sIC8vLXNlbGZjZXJ0CisgICAgICAgIHsiQ2hhbmdlcy50aGUuc3RvcmUucGFzc3dvcmQub2YuYS5rZXlzdG9yZSIsCisgICAgICAgICAgICAgICAgIk1vZGlmaWUgbGUgbW90IGRlIHBhc3NlIGRlIGJhbnF1ZSBkJ3VuIGZpY2hpZXIgZGUgY2xcdTAwRTlzIn0sIC8vLXN0b3JlcGFzc3dkCisgICAgICAgIC8vIGtleXRvb2w6IGhlbHA6IG9wdGlvbnMKKyAgICAgICAgeyJhbGlhcy5uYW1lLm9mLnRoZS5lbnRyeS50by5wcm9jZXNzIiwKKyAgICAgICAgICAgICAgICAibm9tIGQnYWxpYXMgZGUgbCdlbnRyXHUwMEU5ZSBcdTAwRTAgdHJhaXRlciJ9LCAvLy1hbGlhcworICAgICAgICB7ImRlc3RpbmF0aW9uLmFsaWFzIiwKKyAgICAgICAgICAgICAgICAiYWxpYXMgZGUgZGVzdGluYXRpb24ifSwgLy8tZGVzdGFsaWFzCisgICAgICAgIHsiZGVzdGluYXRpb24ua2V5LnBhc3N3b3JkIiwKKyAgICAgICAgICAgICAgICAibW90IGRlIHBhc3NlIGRlIGxhIGNsXHUwMEU5IGRlIGRlc3RpbmF0aW9uIn0sIC8vLWRlc3RrZXlwYXNzCisgICAgICAgIHsiZGVzdGluYXRpb24ua2V5c3RvcmUubmFtZSIsCisgICAgICAgICAgICAgICAgIm5vbSBkdSBmaWNoaWVyIGRlIGNsXHUwMEU5cyBkZSBkZXN0aW5hdGlvbiJ9LCAvLy1kZXN0a2V5c3RvcmUKKyAgICAgICAgeyJkZXN0aW5hdGlvbi5rZXlzdG9yZS5wYXNzd29yZC5wcm90ZWN0ZWQiLAorICAgICAgICAgICAgICAgICJtb3QgZGUgcGFzc2UgZHUgZmljaGllciBkZSBjbFx1MDBFOXMgZGUgZGVzdGluYXRpb24gcHJvdFx1MDBFOWdcdTAwRTkifSwgLy8tZGVzdHByb3RlY3RlZAorICAgICAgICB7ImRlc3RpbmF0aW9uLmtleXN0b3JlLnByb3ZpZGVyLm5hbWUiLAorICAgICAgICAgICAgICAgICJub20gZHUgZm91cm5pc3NldXIgZHUgZmljaGllciBkZSBjbFx1MDBFOXMgZGUgZGVzdGluYXRpb24ifSwgLy8tZGVzdHByb3ZpZGVybmFtZQorICAgICAgICB7ImRlc3RpbmF0aW9uLmtleXN0b3JlLnBhc3N3b3JkIiwKKyAgICAgICAgICAgICAgICAibW90IGRlIHBhc3NlIGR1IGZpY2hpZXIgZGUgY2xcdTAwRTlzIGRlIGRlc3RpbmF0aW9uIn0sIC8vLWRlc3RzdG9yZXBhc3MKKyAgICAgICAgeyJkZXN0aW5hdGlvbi5rZXlzdG9yZS50eXBlIiwKKyAgICAgICAgICAgICAgICAidHlwZSBkdSBmaWNoaWVyIGRlIGNsXHUwMEU5cyBkZSBkZXN0aW5hdGlvbiJ9LCAvLy1kZXN0c3RvcmV0eXBlCisgICAgICAgIHsiZGlzdGluZ3Vpc2hlZC5uYW1lIiwKKyAgICAgICAgICAgICAgICAibm9tIGRpc3RpbmN0aWYifSwgLy8tZG5hbWUKKyAgICAgICAgeyJYLjUwOS5leHRlbnNpb24iLAorICAgICAgICAgICAgICAgICJleHRlbnNpb24gWC41MDkifSwgLy8tZXh0CisgICAgICAgIHsib3V0cHV0LmZpbGUubmFtZSIsCisgICAgICAgICAgICAgICAgIm5vbSBkdSBmaWNoaWVyIGRlIHNvcnRpZSJ9LCAvLy1maWxlIGFuZCAtb3V0ZmlsZQorICAgICAgICB7ImlucHV0LmZpbGUubmFtZSIsCisgICAgICAgICAgICAgICAgIm5vbSBkdSBmaWNoaWVyIGQnZW50clx1MDBFOWUifSwgLy8tZmlsZSBhbmQgLWluZmlsZQorICAgICAgICB7ImtleS5hbGdvcml0aG0ubmFtZSIsCisgICAgICAgICAgICAgICAgIm5vbSBkZSBsJ2FsZ29yaXRobWUgZGUgY2xcdTAwRTkifSwgLy8ta2V5YWxnCisgICAgICAgIHsia2V5LnBhc3N3b3JkIiwKKyAgICAgICAgICAgICAgICAibW90IGRlIHBhc3NlIGRlIGxhIGNsXHUwMEU5In0sIC8vLWtleXBhc3MKKyAgICAgICAgeyJrZXkuYml0LnNpemUiLAorICAgICAgICAgICAgICAgICJ0YWlsbGUgZW4gYml0cyBkZSBsYSBjbFx1MDBFOSJ9LCAvLy1rZXlzaXplCisgICAgICAgIHsia2V5c3RvcmUubmFtZSIsCisgICAgICAgICAgICAgICAgIm5vbSBkdSBmaWNoaWVyIGRlIGNsXHUwMEU5cyJ9LCAvLy1rZXlzdG9yZQorICAgICAgICB7Im5ldy5wYXNzd29yZCIsCisgICAgICAgICAgICAgICAgIm5vdXZlYXUgbW90IGRlIHBhc3NlIn0sIC8vLW5ldworICAgICAgICB7ImRvLm5vdC5wcm9tcHQiLAorICAgICAgICAgICAgICAgICJuZSBwYXMgaW52aXRlciJ9LCAvLy1ub3Byb21wdAorICAgICAgICB7InBhc3N3b3JkLnRocm91Z2gucHJvdGVjdGVkLm1lY2hhbmlzbSIsCisgICAgICAgICAgICAgICAgIm1vdCBkZSBwYXNzZSB2aWEgbVx1MDBFOWNhbmlzbWUgcHJvdFx1MDBFOWdcdTAwRTkifSwgLy8tcHJvdGVjdGVkCisgICAgICAgIHsicHJvdmlkZXIuYXJndW1lbnQiLAorICAgICAgICAgICAgICAgICJhcmd1bWVudCBkdSBmb3Vybmlzc2V1ciJ9LCAvLy1wcm92aWRlcmFyZworICAgICAgICB7InByb3ZpZGVyLmNsYXNzLm5hbWUiLAorICAgICAgICAgICAgICAgICJub20gZGUgbGEgY2xhc3NlIGRlIGZvdXJuaXNzZXVyIn0sIC8vLXByb3ZpZGVyY2xhc3MKKyAgICAgICAgeyJwcm92aWRlci5uYW1lIiwKKyAgICAgICAgICAgICAgICAibm9tIGR1IGZvdXJuaXNzZXVyIn0sIC8vLXByb3ZpZGVybmFtZQorICAgICAgICB7InByb3ZpZGVyLmNsYXNzcGF0aCIsCisgICAgICAgICAgICAgICAgInZhcmlhYmxlIGQnZW52aXJvbm5lbWVudCBDTEFTU1BBVEggZHUgZm91cm5pc3NldXIifSwgLy8tcHJvdmlkZXJwYXRoCisgICAgICAgIHsib3V0cHV0LmluLlJGQy5zdHlsZSIsCisgICAgICAgICAgICAgICAgInNvcnRpZSBhdSBzdHlsZSBSRkMifSwgLy8tcmZjCisgICAgICAgIHsic2lnbmF0dXJlLmFsZ29yaXRobS5uYW1lIiwKKyAgICAgICAgICAgICAgICAibm9tIGRlIGwnYWxnb3JpdGhtZSBkZSBzaWduYXR1cmUifSwgLy8tc2lnYWxnCisgICAgICAgIHsic291cmNlLmFsaWFzIiwKKyAgICAgICAgICAgICAgICAiYWxpYXMgc291cmNlIn0sIC8vLXNyY2FsaWFzCisgICAgICAgIHsic291cmNlLmtleS5wYXNzd29yZCIsCisgICAgICAgICAgICAgICAgIm1vdCBkZSBwYXNzZSBkZSBsYSBjbFx1MDBFOSBzb3VyY2UifSwgLy8tc3Jja2V5cGFzcworICAgICAgICB7InNvdXJjZS5rZXlzdG9yZS5uYW1lIiwKKyAgICAgICAgICAgICAgICAibm9tIGR1IGZpY2hpZXIgZGUgY2xcdTAwRTlzIHNvdXJjZSJ9LCAvLy1zcmNrZXlzdG9yZQorICAgICAgICB7InNvdXJjZS5rZXlzdG9yZS5wYXNzd29yZC5wcm90ZWN0ZWQiLAorICAgICAgICAgICAgICAgICJtb3QgZGUgcGFzc2UgZHUgZmljaGllciBkZSBjbFx1MDBFOXMgc291cmNlIHByb3RcdTAwRTlnXHUwMEU5In0sIC8vLXNyY3Byb3RlY3RlZAorICAgICAgICB7InNvdXJjZS5rZXlzdG9yZS5wcm92aWRlci5uYW1lIiwKKyAgICAgICAgICAgICAgICAibm9tIGR1IGZvdXJuaXNzZXVyIGR1IGZpY2hpZXIgZGUgY2xcdTAwRTlzIHNvdXJjZSJ9LCAvLy1zcmNwcm92aWRlcm5hbWUKKyAgICAgICAgeyJzb3VyY2Uua2V5c3RvcmUucGFzc3dvcmQiLAorICAgICAgICAgICAgICAgICJtb3QgZGUgcGFzc2UgZHUgZmljaGllciBkZSBjbFx1MDBFOXMgc291cmNlIn0sIC8vLXNyY3N0b3JlcGFzcworICAgICAgICB7InNvdXJjZS5rZXlzdG9yZS50eXBlIiwKKyAgICAgICAgICAgICAgICAidHlwZSBkdSBmaWNoaWVyIGRlIGNsXHUwMEU5cyBzb3VyY2UifSwgLy8tc3Jjc3RvcmV0eXBlCisgICAgICAgIHsiU1NMLnNlcnZlci5ob3N0LmFuZC5wb3J0IiwKKyAgICAgICAgICAgICAgICAiUG9ydCBldCBoXHUwMEY0dGUgZHUgc2VydmV1ciBTU0wifSwgLy8tc3Nsc2VydmVyCisgICAgICAgIHsic2lnbmVkLmphci5maWxlIiwKKyAgICAgICAgICAgICAgICAiZmljaGllciBKQVIgc2lnblx1MDBFOSJ9LCAvLz1qYXJmaWxlCisgICAgICAgIHsiY2VydGlmaWNhdGUudmFsaWRpdHkuc3RhcnQuZGF0ZS50aW1lIiwKKyAgICAgICAgICAgICAgICAiZGF0ZS9oZXVyZSBkZSBkXHUwMEU5YnV0IGRlIHZhbGlkaXRcdTAwRTkgZHUgY2VydGlmaWNhdCJ9LCAvLy1zdGFydGRhdGUKKyAgICAgICAgeyJrZXlzdG9yZS5wYXNzd29yZCIsCisgICAgICAgICAgICAgICAgIm1vdCBkZSBwYXNzZSBkdSBmaWNoaWVyIGRlIGNsXHUwMEU5cyJ9LCAvLy1zdG9yZXBhc3MKKyAgICAgICAgeyJrZXlzdG9yZS50eXBlIiwKKyAgICAgICAgICAgICAgICAidHlwZSBkdSBmaWNoaWVyIGRlIGNsXHUwMEU5cyJ9LCAvLy1zdG9yZXR5cGUKKyAgICAgICAgeyJ0cnVzdC5jZXJ0aWZpY2F0ZXMuZnJvbS5jYWNlcnRzIiwKKyAgICAgICAgICAgICAgICAiY2VydGlmaWNhdHMgc1x1MDBFOWN1cmlzXHUwMEU5cyBpc3N1cyBkZSBjZXJ0aWZpY2F0cyBDQSJ9LCAvLy10cnVzdGNhY2VydHMKKyAgICAgICAgeyJ2ZXJib3NlLm91dHB1dCIsCisgICAgICAgICAgICAgICAgInNvcnRpZSBlbiBtb2RlIHZlcmJvc2UifSwgLy8tdgorICAgICAgICB7InZhbGlkaXR5Lm51bWJlci5vZi5kYXlzIiwKKyAgICAgICAgICAgICAgICAibm9tYnJlIGRlIGpvdXJzIGRlIHZhbGlkaXRcdTAwRTkifSwgLy8tdmFsaWRpdHkKKyAgICAgICAgeyJTZXJpYWwuSUQub2YuY2VydC50by5yZXZva2UiLAorICAgICAgICAgICAgICAgICAiSUQgZGUgc1x1MDBFOXJpZSBkdSBjZXJ0aWZpY2F0IFx1MDBFMCByXHUwMEU5dm9xdWVyIn0sIC8vLWlkCisgICAgICAgIC8vIGtleXRvb2w6IFJ1bm5pbmcgcGFydAorICAgICAgICB7ImtleXRvb2wuZXJyb3IuIiwgImVycmV1ciBrZXl0b29sIDogIn0sCisgICAgICAgIHsiSWxsZWdhbC5vcHRpb24uIiwgIk9wdGlvbiBub24gYWRtaXNlIDogICJ9LAorICAgICAgICB7IklsbGVnYWwudmFsdWUuIiwgIlZhbGV1ciBub24gYWRtaXNlIDogIn0sCisgICAgICAgIHsiVW5rbm93bi5wYXNzd29yZC50eXBlLiIsICJUeXBlIGRlIG1vdCBkZSBwYXNzZSBpbmNvbm51IDogIn0sCisgICAgICAgIHsiQ2Fubm90LmZpbmQuZW52aXJvbm1lbnQudmFyaWFibGUuIiwKKyAgICAgICAgICAgICAgICAiVmFyaWFibGUgZCdlbnZpcm9ubmVtZW50IGludHJvdXZhYmxlIDogIn0sCisgICAgICAgIHsiQ2Fubm90LmZpbmQuZmlsZS4iLCAiRmljaGllciBpbnRyb3V2YWJsZSA6ICJ9LAorICAgICAgICB7IkNvbW1hbmQub3B0aW9uLmZsYWcubmVlZHMuYW4uYXJndW1lbnQuIiwgIkwnJ29wdGlvbiBkZSBjb21tYW5kZSB7MH0gcmVxdWllcnQgdW4gYXJndW1lbnQuIn0sCisgICAgICAgIHsiV2FybmluZy5EaWZmZXJlbnQuc3RvcmUuYW5kLmtleS5wYXNzd29yZHMubm90LnN1cHBvcnRlZC5mb3IuUEtDUzEyLktleVN0b3Jlcy5JZ25vcmluZy51c2VyLnNwZWNpZmllZC5jb21tYW5kLnZhbHVlLiIsCisgICAgICAgICAgICAgICAgIkF2ZXJ0aXNzZW1lbnRcdTAwQTA6IGxlcyBtb3RzIGRlIHBhc3NlIGRlIGNsXHUwMEU5IGV0IGRlIGJhbnF1ZSBkaXN0aW5jdHMgbmUgc29udCBwYXMgcHJpcyBlbiBjaGFyZ2UgcG91ciBsZXMgZmljaGllcnMgZGUgY2xcdTAwRTlzIGQnJ2FjY1x1MDBFOHMgUEtDUzEyLiBMYSB2YWxldXIgezB9IHNwXHUwMEU5Y2lmaVx1MDBFOWUgcGFyIGwnJ3V0aWxpc2F0ZXVyIGVzdCBpZ25vclx1MDBFOWUuIn0sCisgICAgICAgIHsiLmtleXN0b3JlLm11c3QuYmUuTk9ORS5pZi5zdG9yZXR5cGUuaXMuezB9IiwKKyAgICAgICAgICAgICAgICAiLWtleXN0b3JlIGRvaXQgXHUwMEVBdHJlIGRcdTAwRTlmaW5pIHN1ciBOT05FIHNpIC1zdG9yZXR5cGUgZXN0IHswfSJ9LAorICAgICAgICB7IlRvby5tYW55LnJldHJpZXMucHJvZ3JhbS50ZXJtaW5hdGVkIiwKKyAgICAgICAgICAgICAgICAgIlRyb3AgZGUgdGVudGF0aXZlcywgZmluIGR1IHByb2dyYW1tZSJ9LAorICAgICAgICB7Ii5zdG9yZXBhc3N3ZC5hbmQua2V5cGFzc3dkLmNvbW1hbmRzLm5vdC5zdXBwb3J0ZWQuaWYuc3RvcmV0eXBlLmlzLnswfSIsCisgICAgICAgICAgICAgICAgIkxlcyBjb21tYW5kZXMgLXN0b3JlcGFzc3dkIGV0IC1rZXlwYXNzd2QgbmUgc29udCBwYXMgcHJpc2VzIGVuIGNoYXJnZSBzaSAtc3RvcmV0eXBlIGVzdCBkXHUwMEU5ZmluaSBzdXIgezB9In0sCisgICAgICAgIHsiLmtleXBhc3N3ZC5jb21tYW5kcy5ub3Quc3VwcG9ydGVkLmlmLnN0b3JldHlwZS5pcy5QS0NTMTIiLAorICAgICAgICAgICAgICAgICJMZXMgY29tbWFuZGVzIC1rZXlwYXNzd2QgbmUgc29udCBwYXMgcHJpc2VzIGVuIGNoYXJnZSBzaSAtc3RvcmV0eXBlIGVzdCBkXHUwMEU5ZmluaSBzdXIgUEtDUzEyIn0sCisgICAgICAgIHsiLmtleXBhc3MuYW5kLm5ldy5jYW4ubm90LmJlLnNwZWNpZmllZC5pZi5zdG9yZXR5cGUuaXMuezB9IiwKKyAgICAgICAgICAgICAgICAiTGVzIGNvbW1hbmRlcyAta2V5cGFzcyBldCAtbmV3IG5lIHBldXZlbnQgcGFzIFx1MDBFQXRyZSBzcFx1MDBFOWNpZmlcdTAwRTllcyBzaSAtc3RvcmV0eXBlIGVzdCBkXHUwMEU5ZmluaSBzdXIgezB9In0sCisgICAgICAgIHsiaWYucHJvdGVjdGVkLmlzLnNwZWNpZmllZC50aGVuLnN0b3JlcGFzcy5rZXlwYXNzLmFuZC5uZXcubXVzdC5ub3QuYmUuc3BlY2lmaWVkIiwKKyAgICAgICAgICAgICAgICAic2kgLXByb3RlY3RlZCBlc3Qgc3BcdTAwRTljaWZpXHUwMEU5LCAtc3RvcmVwYXNzLCAta2V5cGFzcyBldCAtbmV3IG5lIGRvaXZlbnQgcGFzIFx1MDBFQXRyZSBpbmRpcXVcdTAwRTlzIn0sCisgICAgICAgIHsiaWYuc3JjcHJvdGVjdGVkLmlzLnNwZWNpZmllZC50aGVuLnNyY3N0b3JlcGFzcy5hbmQuc3Jja2V5cGFzcy5tdXN0Lm5vdC5iZS5zcGVjaWZpZWQiLAorICAgICAgICAgICAgICAgICJTaSAtc3JjcHJvdGVjdGVkIGVzdCBpbmRpcXVcdTAwRTksIGxlcyBjb21tYW5kZXMgLXNyY3N0b3JlcGFzcyBldCAtc3Jja2V5cGFzcyBuZSBkb2l2ZW50IHBhcyBcdTAwRUF0cmUgc3BcdTAwRTljaWZpXHUwMEU5ZXMifSwKKyAgICAgICAgeyJpZi5rZXlzdG9yZS5pcy5ub3QucGFzc3dvcmQucHJvdGVjdGVkLnRoZW4uc3RvcmVwYXNzLmtleXBhc3MuYW5kLm5ldy5tdXN0Lm5vdC5iZS5zcGVjaWZpZWQiLAorICAgICAgICAgICAgICAgICJTaSBsZSBmaWNoaWVyIGRlIGNsXHUwMEU5cyBuJ2VzdCBwYXMgcHJvdFx1MDBFOWdcdTAwRTkgcGFyIHVuIG1vdCBkZSBwYXNzZSwgbGVzIGNvbW1hbmRlcyAtc3RvcmVwYXNzLCAta2V5cGFzcyBldCAtbmV3IG5lIGRvaXZlbnQgcGFzIFx1MDBFQXRyZSBzcFx1MDBFOWNpZmlcdTAwRTllcyJ9LAorICAgICAgICB7ImlmLnNvdXJjZS5rZXlzdG9yZS5pcy5ub3QucGFzc3dvcmQucHJvdGVjdGVkLnRoZW4uc3Jjc3RvcmVwYXNzLmFuZC5zcmNrZXlwYXNzLm11c3Qubm90LmJlLnNwZWNpZmllZCIsCisgICAgICAgICAgICAgICAgIlNpIGxlIGZpY2hpZXIgZGUgY2xcdTAwRTlzIHNvdXJjZSBuJ2VzdCBwYXMgcHJvdFx1MDBFOWdcdTAwRTkgcGFyIHVuIG1vdCBkZSBwYXNzZSwgbGVzIGNvbW1hbmRlcyAtc3Jjc3RvcmVwYXNzIGV0IC1zcmNrZXlwYXNzIG5lIGRvaXZlbnQgcGFzIFx1MDBFQXRyZSBzcFx1MDBFOWNpZmlcdTAwRTllcyJ9LAorICAgICAgICB7IklsbGVnYWwuc3RhcnRkYXRlLnZhbHVlIiwgIlZhbGV1ciBkZSBkYXRlIGRlIGRcdTAwRTlidXQgbm9uIGFkbWlzZSJ9LAorICAgICAgICB7IlZhbGlkaXR5Lm11c3QuYmUuZ3JlYXRlci50aGFuLnplcm8iLAorICAgICAgICAgICAgICAgICJMYSB2YWxpZGl0XHUwMEU5IGRvaXQgXHUwMEVBdHJlIHN1cFx1MDBFOXJpZXVyZSBcdTAwRTAgelx1MDBFOXJvIn0sCisgICAgICAgIHsicHJvdk5hbWUubm90LmEucHJvdmlkZXIiLCAiezB9IG4nJ2VzdCBwYXMgdW4gZm91cm5pc3NldXIifSwKKyAgICAgICAgeyJVc2FnZS5lcnJvci5uby5jb21tYW5kLnByb3ZpZGVkIiwgIkVycmV1ciBkZSBzeW50YXhlXHUwMEEwOiBhdWN1bmUgY29tbWFuZGUgZm91cm5pZSJ9LAorICAgICAgICB7IlNvdXJjZS5rZXlzdG9yZS5maWxlLmV4aXN0cy5idXQuaXMuZW1wdHkuIiwgIkxlIGZpY2hpZXIgZGUgY2xcdTAwRTlzIHNvdXJjZSBleGlzdGUgbWFpcyBpbCBlc3QgdmlkZSA6ICJ9LAorICAgICAgICB7IlBsZWFzZS5zcGVjaWZ5LnNyY2tleXN0b3JlIiwgIkluZGlxdWV6IC1zcmNrZXlzdG9yZSJ9LAorICAgICAgICB7Ik11c3Qubm90LnNwZWNpZnkuYm90aC52LmFuZC5yZmMud2l0aC5saXN0LmNvbW1hbmQiLAorICAgICAgICAgICAgICAgICItdiBldCAtcmZjIG5lIGRvaXZlbnQgcGFzIFx1MDBFQXRyZSBzcFx1MDBFOWNpZmlcdTAwRTlzIGF2ZWMgbGEgY29tbWFuZGUgJ2xpc3QnIn0sCisgICAgICAgIHsiS2V5LnBhc3N3b3JkLm11c3QuYmUuYXQubGVhc3QuNi5jaGFyYWN0ZXJzIiwKKyAgICAgICAgICAgICAgICAiVW4gbW90IGRlIHBhc3NlIGRlIGNsXHUwMEU5IGRvaXQgY29tcG9ydGVyIGF1IG1vaW5zIDYgY2FyYWN0XHUwMEU4cmVzIn0sCisgICAgICAgIHsiTmV3LnBhc3N3b3JkLm11c3QuYmUuYXQubGVhc3QuNi5jaGFyYWN0ZXJzIiwKKyAgICAgICAgICAgICAgICAiTGUgbm91dmVhdSBtb3QgZGUgcGFzc2UgZG9pdCBjb21wb3J0ZXIgYXUgbW9pbnMgNiBjYXJhY3RcdTAwRThyZXMifSwKKyAgICAgICAgeyJLZXlzdG9yZS5maWxlLmV4aXN0cy5idXQuaXMuZW1wdHkuIiwKKyAgICAgICAgICAgICAgICAiRmljaGllciBkZSBjbFx1MDBFOXMgZXhpc3RhbnQgbWFpcyB2aWRlIDogIn0sCisgICAgICAgIHsiS2V5c3RvcmUuZmlsZS5kb2VzLm5vdC5leGlzdC4iLAorICAgICAgICAgICAgICAgICJMZSBmaWNoaWVyIGRlIGNsXHUwMEU5cyBuJ2V4aXN0ZSBwYXMgOiAifSwKKyAgICAgICAgeyJNdXN0LnNwZWNpZnkuZGVzdGluYXRpb24uYWxpYXMiLCAiTCdhbGlhcyBkZSBkZXN0aW5hdGlvbiBkb2l0IFx1MDBFQXRyZSBzcFx1MDBFOWNpZmlcdTAwRTkifSwKKyAgICAgICAgeyJNdXN0LnNwZWNpZnkuYWxpYXMiLCAiTCdhbGlhcyBkb2l0IFx1MDBFQXRyZSBzcFx1MDBFOWNpZmlcdTAwRTkifSwKKyAgICAgICAgeyJLZXlzdG9yZS5wYXNzd29yZC5tdXN0LmJlLmF0LmxlYXN0LjYuY2hhcmFjdGVycyIsCisgICAgICAgICAgICAgICAgIlVuIG1vdCBkZSBwYXNzZSBkZSBmaWNoaWVyIGRlIGNsXHUwMEU5cyBkb2l0IGNvbXBvcnRlciBhdSBtb2lucyA2IGNhcmFjdFx1MDBFOHJlcyJ9LAorICAgICAgICB7IkVudGVyLmtleXN0b3JlLnBhc3N3b3JkLiIsICJFbnRyZXogbGUgbW90IGRlIHBhc3NlIGR1IGZpY2hpZXIgZGUgY2xcdTAwRTlzIDogICJ9LAorICAgICAgICB7IkVudGVyLnNvdXJjZS5rZXlzdG9yZS5wYXNzd29yZC4iLCAiRW50cmV6IGxlIG1vdCBkZSBwYXNzZSBkdSBmaWNoaWVyIGRlIGNsXHUwMEU5cyBzb3VyY2VcdTAwQTA6ICAifSwKKyAgICAgICAgeyJFbnRlci5kZXN0aW5hdGlvbi5rZXlzdG9yZS5wYXNzd29yZC4iLCAiRW50cmV6IGxlIG1vdCBkZSBwYXNzZSBkdSBmaWNoaWVyIGRlIGNsXHUwMEU5cyBkZSBkZXN0aW5hdGlvblx1MDBBMDogICJ9LAorICAgICAgICB7IktleXN0b3JlLnBhc3N3b3JkLmlzLnRvby5zaG9ydC5tdXN0LmJlLmF0LmxlYXN0LjYuY2hhcmFjdGVycyIsCisgICAgICAgICAiTGUgbW90IGRlIHBhc3NlIGR1IGZpY2hpZXIgZGUgY2xcdTAwRTlzIGVzdCB0cm9wIGNvdXJ0IDogaWwgZG9pdCBjb21wb3J0ZXIgYXUgbW9pbnMgNiBjYXJhY3RcdTAwRThyZXMifSwKKyAgICAgICAgeyJVbmtub3duLkVudHJ5LlR5cGUiLCAiVHlwZSBkJ2VudHJcdTAwRTllIGluY29ubnUifSwKKyAgICAgICAgeyJUb28ubWFueS5mYWlsdXJlcy5BbGlhcy5ub3QuY2hhbmdlZCIsICJUcm9wIGQnZXJyZXVycy4gQWxpYXMgbm9uIG1vZGlmaVx1MDBFOSJ9LAorICAgICAgICB7IkVudHJ5LmZvci5hbGlhcy5hbGlhcy5zdWNjZXNzZnVsbHkuaW1wb3J0ZWQuIiwKKyAgICAgICAgICAgICAgICAgIkwnJ2VudHJcdTAwRTllIGRlIGwnJ2FsaWFzIHswfSBhIFx1MDBFOXRcdTAwRTkgaW1wb3J0XHUwMEU5ZS4ifSwKKyAgICAgICAgeyJFbnRyeS5mb3IuYWxpYXMuYWxpYXMubm90LmltcG9ydGVkLiIsICJMJydlbnRyXHUwMEU5ZSBkZSBsJydhbGlhcyB7MH0gbicnYSBwYXMgXHUwMEU5dFx1MDBFOSBpbXBvcnRcdTAwRTllLiJ9LAorICAgICAgICB7IlByb2JsZW0uaW1wb3J0aW5nLmVudHJ5LmZvci5hbGlhcy5hbGlhcy5leGNlcHRpb24uRW50cnkuZm9yLmFsaWFzLmFsaWFzLm5vdC5pbXBvcnRlZC4iLAorICAgICAgICAgICAgICAgICAiUHJvYmxcdTAwRThtZSBsb3JzIGRlIGwnJ2ltcG9ydCBkZSBsJydlbnRyXHUwMEU5ZSBkZSBsJydhbGlhcyB7MH1cdTAwQTA6IHsxfS5cbkwnJ2VudHJcdTAwRTllIGRlIGwnJ2FsaWFzIHswfSBuJydhIHBhcyBcdTAwRTl0XHUwMEU5IGltcG9ydFx1MDBFOWUuIn0sCisgICAgICAgIHsiSW1wb3J0LmNvbW1hbmQuY29tcGxldGVkLm9rLmVudHJpZXMuc3VjY2Vzc2Z1bGx5LmltcG9ydGVkLmZhaWwuZW50cmllcy5mYWlsZWQub3IuY2FuY2VsbGVkIiwKKyAgICAgICAgICAgICAgICAgIkNvbW1hbmRlIGQnJ2ltcG9ydCBleFx1MDBFOWN1dFx1MDBFOWVcdTAwQTA6IHswfSBlbnRyXHUwMEU5ZXMgaW1wb3J0XHUwMEU5ZXMsIFx1MDBFOWNoZWMgb3UgYW5udWxhdGlvbiBkZSB7MX0gZW50clx1MDBFOWVzIn0sCisgICAgICAgIHsiV2FybmluZy5PdmVyd3JpdGluZy5leGlzdGluZy5hbGlhcy5hbGlhcy5pbi5kZXN0aW5hdGlvbi5rZXlzdG9yZSIsCisgICAgICAgICAgICAgICAgICJBdmVydGlzc2VtZW50XHUwMEEwOiBsJydhbGlhcyB7MH0gZXhpc3RhbnQgc2VyYSByZW1wbGFjXHUwMEU5IGRhbnMgbGUgZmljaGllciBkZSBjbFx1MDBFOXMgZCcnYWNjXHUwMEU4cyBkZSBkZXN0aW5hdGlvbiJ9LAorICAgICAgICB7IkV4aXN0aW5nLmVudHJ5LmFsaWFzLmFsaWFzLmV4aXN0cy5vdmVyd3JpdGUubm8uIiwKKyAgICAgICAgICAgICAgICAgIkwnJ2FsaWFzIGQnJ2VudHJcdTAwRTllIHswfSBleGlzdGUgZFx1MDBFOWpcdTAwRTAuIFZvdWxlei12b3VzIGxlIHJlbXBsYWNlciA/IFtub25dXHUwMEEwOiAgIn0sCisgICAgICAgIHsiVG9vLm1hbnkuZmFpbHVyZXMudHJ5LmxhdGVyIiwgIlRyb3AgZCdlcnJldXJzLiBSXHUwMEU5ZXNzYXlleiBwbHVzIHRhcmQifSwKKyAgICAgICAgeyJDZXJ0aWZpY2F0aW9uLnJlcXVlc3Quc3RvcmVkLmluLmZpbGUuZmlsZW5hbWUuIiwKKyAgICAgICAgICAgICAgICAiRGVtYW5kZSBkZSBjZXJ0aWZpY2F0aW9uIHN0b2NrXHUwMEU5ZSBkYW5zIGxlIGZpY2hpZXIgPHswfT4ifSwKKyAgICAgICAgeyJTdWJtaXQudGhpcy50by55b3VyLkNBIiwgIlNvdW1ldHRyZSBcdTAwRTAgdm90cmUgQ0EifSwKKyAgICAgICAgeyJpZi5hbGlhcy5ub3Quc3BlY2lmaWVkLmRlc3RhbGlhcy5zcmNrZXlwYXNzLmFuZC5kZXN0a2V5cGFzcy5tdXN0Lm5vdC5iZS5zcGVjaWZpZWQiLAorICAgICAgICAgICAgInNpIGwnYWxpYXMgbidlc3QgcGFzIHNwXHUwMEU5Y2lmaVx1MDBFOSwgZGVzdGFsaWFzLCBzcmNrZXlwYXNzIGV0IGRlc3RrZXlwYXNzIG5lIGRvaXZlbnQgcGFzIFx1MDBFQXRyZSBzcFx1MDBFOWNpZmlcdTAwRTlzIn0sCisgICAgICAgIHsiQ2VydGlmaWNhdGUuc3RvcmVkLmluLmZpbGUuZmlsZW5hbWUuIiwKKyAgICAgICAgICAgICAgICAiQ2VydGlmaWNhdCBzdG9ja1x1MDBFOSBkYW5zIGxlIGZpY2hpZXIgPHswfT4ifSwKKyAgICAgICAgeyJDZXJ0aWZpY2F0ZS5yZXBseS53YXMuaW5zdGFsbGVkLmluLmtleXN0b3JlIiwKKyAgICAgICAgICAgICAgICAiUlx1MDBFOXBvbnNlIGRlIGNlcnRpZmljYXQgaW5zdGFsbFx1MDBFOWUgZGFucyBsZSBmaWNoaWVyIGRlIGNsXHUwMEU5cyJ9LAorICAgICAgICB7IkNlcnRpZmljYXRlLnJlcGx5Lndhcy5ub3QuaW5zdGFsbGVkLmluLmtleXN0b3JlIiwKKyAgICAgICAgICAgICAgICAiUlx1MDBFOXBvbnNlIGRlIGNlcnRpZmljYXQgbm9uIGluc3RhbGxcdTAwRTllIGRhbnMgbGUgZmljaGllciBkZSBjbFx1MDBFOXMifSwKKyAgICAgICAgeyJDZXJ0aWZpY2F0ZS53YXMuYWRkZWQudG8ua2V5c3RvcmUiLAorICAgICAgICAgICAgICAgICJDZXJ0aWZpY2F0IGFqb3V0XHUwMEU5IGF1IGZpY2hpZXIgZGUgY2xcdTAwRTlzIn0sCisgICAgICAgIHsiQ2VydGlmaWNhdGUud2FzLm5vdC5hZGRlZC50by5rZXlzdG9yZSIsCisgICAgICAgICAgICAgICAgIkNlcnRpZmljYXQgbm9uIGFqb3V0XHUwMEU5IGF1IGZpY2hpZXIgZGUgY2xcdTAwRTlzIn0sCisgICAgICAgIHsiLlN0b3Jpbmcua3NmbmFtZS4iLCAiW1N0b2NrYWdlIGRlIHswfV0ifSwKKyAgICAgICAgeyJhbGlhcy5oYXMubm8ucHVibGljLmtleS5jZXJ0aWZpY2F0ZS4iLAorICAgICAgICAgICAgICAgICJ7MH0gbmUgcG9zc1x1MDBFOGRlIHBhcyBkZSBjbFx1MDBFOSBwdWJsaXF1ZSAoY2VydGlmaWNhdCkifSwKKyAgICAgICAgeyJDYW5ub3QuZGVyaXZlLnNpZ25hdHVyZS5hbGdvcml0aG0iLAorICAgICAgICAgICAgICAgICJJbXBvc3NpYmxlIGRlIGRcdTAwRTlkdWlyZSBsJ2FsZ29yaXRobWUgZGUgc2lnbmF0dXJlIn0sCisgICAgICAgIHsiQWxpYXMuYWxpYXMuZG9lcy5ub3QuZXhpc3QiLAorICAgICAgICAgICAgICAgICJMJydhbGlhcyA8ezB9PiBuJydleGlzdGUgcGFzIn0sCisgICAgICAgIHsiQWxpYXMuYWxpYXMuaGFzLm5vLmNlcnRpZmljYXRlIiwKKyAgICAgICAgICAgICAgICAiTCcnYWxpYXMgPHswfT4gbmUgcG9zc1x1MDBFOGRlIHBhcyBkZSBjZXJ0aWZpY2F0In0sCisgICAgICAgIHsiS2V5LnBhaXIubm90LmdlbmVyYXRlZC5hbGlhcy5hbGlhcy5hbHJlYWR5LmV4aXN0cyIsCisgICAgICAgICAgICAgICAgIlBhaXJlIGRlIGNsXHUwMEU5cyBub24gZ1x1MDBFOW5cdTAwRTlyXHUwMEU5ZSwgbCcnYWxpYXMgPHswfT4gZXhpc3RlIGRcdTAwRTlqXHUwMEUwIn0sCisgICAgICAgIHsiR2VuZXJhdGluZy5rZXlzaXplLmJpdC5rZXlBbGdOYW1lLmtleS5wYWlyLmFuZC5zZWxmLnNpZ25lZC5jZXJ0aWZpY2F0ZS5zaWdBbGdOYW1lLndpdGguYS52YWxpZGl0eS5vZi52YWxpZGFsaXR5LmRheXMuZm9yIiwKKyAgICAgICAgICAgICAgICAiR1x1MDBFOW5cdTAwRTlyYXRpb24gZCcndW5lIHBhaXJlIGRlIGNsXHUwMEU5cyB7MX0gZGUgezB9IGJpdHMgZXQgZCcndW4gY2VydGlmaWNhdCBhdXRvLXNpZ25cdTAwRTkgKHsyfSkgZCcndW5lIHZhbGlkaXRcdTAwRTkgZGUgezN9IGpvdXJzXG5cdHBvdXIgOiB7NH0ifSwKKyAgICAgICAgeyJFbnRlci5rZXkucGFzc3dvcmQuZm9yLmFsaWFzLiIsICJFbnRyZXogbGUgbW90IGRlIHBhc3NlIGRlIGxhIGNsXHUwMEU5IHBvdXIgPHswfT4ifSwKKyAgICAgICAgeyIuUkVUVVJOLmlmLnNhbWUuYXMua2V5c3RvcmUucGFzc3dvcmQuIiwKKyAgICAgICAgICAgICAgICAiXHQoYXBwdXlleiBzdXIgRW50clx1MDBFOWUgcydpbCBzJ2FnaXQgZHUgbW90IGRlIHBhc3NlIGR1IGZpY2hpZXIgZGUgY2xcdTAwRTlzKSA6ICAifSwKKyAgICAgICAgeyJLZXkucGFzc3dvcmQuaXMudG9vLnNob3J0Lm11c3QuYmUuYXQubGVhc3QuNi5jaGFyYWN0ZXJzIiwKKyAgICAgICAgICAgICAgICAiTGUgbW90IGRlIHBhc3NlIGRlIGxhIGNsXHUwMEU5IGVzdCB0cm9wIGNvdXJ0IDogaWwgZG9pdCBjb21wb3J0ZXIgYXUgbW9pbnMgNiBjYXJhY3RcdTAwRThyZXMifSwKKyAgICAgICAgeyJUb28ubWFueS5mYWlsdXJlcy5rZXkubm90LmFkZGVkLnRvLmtleXN0b3JlIiwKKyAgICAgICAgICAgICAgICAiVHJvcCBkJ2VycmV1cnMuIENsXHUwMEU5IG5vbiBham91dFx1MDBFOWUgYXUgZmljaGllciBkZSBjbFx1MDBFOXMifSwKKyAgICAgICAgeyJEZXN0aW5hdGlvbi5hbGlhcy5kZXN0LmFscmVhZHkuZXhpc3RzIiwKKyAgICAgICAgICAgICAgICAiTCcnYWxpYXMgZGUgbGEgZGVzdGluYXRpb24gPHswfT4gZXhpc3RlIGRcdTAwRTlqXHUwMEUwIn0sCisgICAgICAgIHsiUGFzc3dvcmQuaXMudG9vLnNob3J0Lm11c3QuYmUuYXQubGVhc3QuNi5jaGFyYWN0ZXJzIiwKKyAgICAgICAgICAgICAgICAiTGUgbW90IGRlIHBhc3NlIGVzdCB0cm9wIGNvdXJ0IDogaWwgZG9pdCBjb21wb3J0ZXIgYXUgbW9pbnMgNiBjYXJhY3RcdTAwRThyZXMifSwKKyAgICAgICAgeyJUb28ubWFueS5mYWlsdXJlcy5LZXkuZW50cnkubm90LmNsb25lZCIsCisgICAgICAgICAgICAgICAgIlRyb3AgZCdlcnJldXJzLiBFbnRyXHUwMEU5ZSBkZSBjbFx1MDBFOSBub24gY2xvblx1MDBFOWUifSwKKyAgICAgICAgeyJrZXkucGFzc3dvcmQuZm9yLmFsaWFzLiIsICJtb3QgZGUgcGFzc2UgZGUgY2xcdTAwRTkgcG91ciA8ezB9PiJ9LAorICAgICAgICB7IktleXN0b3JlLmVudHJ5LmZvci5pZC5nZXROYW1lLmFscmVhZHkuZXhpc3RzIiwKKyAgICAgICAgICAgICAgICAiTCcnZW50clx1MDBFOWUgZGUgZmljaGllciBkZSBjbFx1MDBFOXMgZCcnYWNjXHUwMEU4cyBwb3VyIDx7MH0+IGV4aXN0ZSBkXHUwMEU5alx1MDBFMCJ9LAorICAgICAgICB7IkNyZWF0aW5nLmtleXN0b3JlLmVudHJ5LmZvci5pZC5nZXROYW1lLiIsCisgICAgICAgICAgICAgICAgIkNyXHUwMEU5YXRpb24gZCcndW5lIGVudHJcdTAwRTllIGRlIGZpY2hpZXIgZGUgY2xcdTAwRTlzIGQnJ2FjY1x1MDBFOHMgcG91ciA8ezB9Pi4uLiJ9LAorICAgICAgICB7Ik5vLmVudHJpZXMuZnJvbS5pZGVudGl0eS5kYXRhYmFzZS5hZGRlZCIsCisgICAgICAgICAgICAgICAgIkF1Y3VuZSBlbnRyXHUwMEU5ZSBham91dFx1MDBFOWUgXHUwMEUwIHBhcnRpciBkZSBsYSBiYXNlIGRlIGRvbm5cdTAwRTllcyBkJ2lkZW50aXRcdTAwRTlzIn0sCisgICAgICAgIHsiQWxpYXMubmFtZS5hbGlhcyIsICJOb20gZCcnYWxpYXMgOiB7MH0ifSwKKyAgICAgICAgeyJDcmVhdGlvbi5kYXRlLmtleVN0b3JlLmdldENyZWF0aW9uRGF0ZS5hbGlhcy4iLAorICAgICAgICAgICAgICAgICJEYXRlIGRlIGNyXHUwMEU5YXRpb24gOiB7MCxkYXRlfSJ9LAorICAgICAgICB7ImFsaWFzLmtleVN0b3JlLmdldENyZWF0aW9uRGF0ZS5hbGlhcy4iLAorICAgICAgICAgICAgICAgICJ7MH0sIHsxLGRhdGV9LCAifSwKKyAgICAgICAgeyJhbGlhcy4iLCAiezB9LCAifSwKKyAgICAgICAgeyJFbnRyeS50eXBlLnR5cGUuIiwgIlR5cGUgZCcnZW50clx1MDBFOWVcdTAwQTA6IHswfSJ9LAorICAgICAgICB7IkNlcnRpZmljYXRlLmNoYWluLmxlbmd0aC4iLCAiTG9uZ3VldXIgZGUgY2hhXHUwMEVFbmUgZHUgY2VydGlmaWNhdCA6ICJ9LAorICAgICAgICB7IkNlcnRpZmljYXRlLmkuMS4iLCAiQ2VydGlmaWNhdFt7MCxudW1iZXIsaW50ZWdlcn1dOiJ9LAorICAgICAgICB7IkNlcnRpZmljYXRlLmZpbmdlcnByaW50LlNIQTEuIiwgIkVtcHJlaW50ZSBkdSBjZXJ0aWZpY2F0IChTSEExKSA6ICJ9LAorICAgICAgICB7IktleXN0b3JlLnR5cGUuIiwgIlR5cGUgZGUgZmljaGllciBkZSBjbFx1MDBFOXMgOiAifSwKKyAgICAgICAgeyJLZXlzdG9yZS5wcm92aWRlci4iLCAiRm91cm5pc3NldXIgZGUgZmljaGllciBkZSBjbFx1MDBFOXMgOiAifSwKKyAgICAgICAgeyJZb3VyLmtleXN0b3JlLmNvbnRhaW5zLmtleVN0b3JlLnNpemUuZW50cnkiLAorICAgICAgICAgICAgICAgICJWb3RyZSBmaWNoaWVyIGRlIGNsXHUwMEU5cyBkJydhY2NcdTAwRThzIGNvbnRpZW50IHswLG51bWJlcixpbnRlZ2VyfSBlbnRyXHUwMEU5ZSJ9LAorICAgICAgICB7IllvdXIua2V5c3RvcmUuY29udGFpbnMua2V5U3RvcmUuc2l6ZS5lbnRyaWVzIiwKKyAgICAgICAgICAgICAgICAiVm90cmUgZmljaGllciBkZSBjbFx1MDBFOXMgZCcnYWNjXHUwMEU4cyBjb250aWVudCB7MCxudW1iZXIsaW50ZWdlcn0gZW50clx1MDBFOWVzIn0sCisgICAgICAgIHsiRmFpbGVkLnRvLnBhcnNlLmlucHV0IiwgIkwnYW5hbHlzZSBkZSBsJ2VudHJcdTAwRTllIGEgXHUwMEU5Y2hvdVx1MDBFOSJ9LAorICAgICAgICB7IkVtcHR5LmlucHV0IiwgIkVudHJcdTAwRTllIHZpZGUifSwKKyAgICAgICAgeyJOb3QuWC41MDkuY2VydGlmaWNhdGUiLCAiUGFzIHVuIGNlcnRpZmljYXQgWC41MDkifSwKKyAgICAgICAgeyJhbGlhcy5oYXMubm8ucHVibGljLmtleSIsICJ7MH0gbmUgcG9zc1x1MDBFOGRlIHBhcyBkZSBjbFx1MDBFOSBwdWJsaXF1ZSJ9LAorICAgICAgICB7ImFsaWFzLmhhcy5uby5YLjUwOS5jZXJ0aWZpY2F0ZSIsICJ7MH0gbmUgcG9zc1x1MDBFOGRlIHBhcyBkZSBjZXJ0aWZpY2F0IFguNTA5In0sCisgICAgICAgIHsiTmV3LmNlcnRpZmljYXRlLnNlbGYuc2lnbmVkLiIsICJOb3V2ZWF1IGNlcnRpZmljYXQgKGF1dG8tc2lnblx1MDBFOSkgOiJ9LAorICAgICAgICB7IlJlcGx5Lmhhcy5uby5jZXJ0aWZpY2F0ZXMiLCAiTGEgclx1MDBFOXBvbnNlIG4nYSBwYXMgZGUgY2VydGlmaWNhdCJ9LAorICAgICAgICB7IkNlcnRpZmljYXRlLm5vdC5pbXBvcnRlZC5hbGlhcy5hbGlhcy5hbHJlYWR5LmV4aXN0cyIsCisgICAgICAgICAgICAgICAgIkNlcnRpZmljYXQgbm9uIGltcG9ydFx1MDBFOSwgbCcnYWxpYXMgPHswfT4gZXhpc3RlIGRcdTAwRTlqXHUwMEUwIn0sCisgICAgICAgIHsiSW5wdXQubm90LmFuLlguNTA5LmNlcnRpZmljYXRlIiwgIkwnZW50clx1MDBFOWUgbidlc3QgcGFzIHVuIGNlcnRpZmljYXQgWC41MDkifSwKKyAgICAgICAgeyJDZXJ0aWZpY2F0ZS5hbHJlYWR5LmV4aXN0cy5pbi5rZXlzdG9yZS51bmRlci5hbGlhcy50cnVzdGFsaWFzLiIsCisgICAgICAgICAgICAgICAgIkxlIGNlcnRpZmljYXQgZXhpc3RlIGRcdTAwRTlqXHUwMEUwIGRhbnMgbGUgZmljaGllciBkZSBjbFx1MDBFOXMgZCcnYWNjXHUwMEU4cyBzb3VzIGwnJ2FsaWFzIDx7MH0+In0sCisgICAgICAgIHsiRG8ueW91LnN0aWxsLndhbnQudG8uYWRkLml0Lm5vLiIsCisgICAgICAgICAgICAgICAgIlZvdWxlei12b3VzIHRvdWpvdXJzIGwnYWpvdXRlciA/IFtub25dIDogICJ9LAorICAgICAgICB7IkNlcnRpZmljYXRlLmFscmVhZHkuZXhpc3RzLmluLnN5c3RlbS53aWRlLkNBLmtleXN0b3JlLnVuZGVyLmFsaWFzLnRydXN0YWxpYXMuIiwKKyAgICAgICAgICAgICAgICAiTGUgY2VydGlmaWNhdCBleGlzdGUgZFx1MDBFOWpcdTAwRTAgZGFucyBsZSBmaWNoaWVyIGRlIGNsXHUwMEU5cyBkJydhY2NcdTAwRThzIENBIHN5c3RcdTAwRThtZSBzb3VzIGwnJ2FsaWFzIDx7MH0+In0sCisgICAgICAgIHsiRG8ueW91LnN0aWxsLndhbnQudG8uYWRkLml0LnRvLnlvdXIub3duLmtleXN0b3JlLm5vLiIsCisgICAgICAgICAgICAgICAgIlZvdWxlei12b3VzIHRvdWpvdXJzIGwnYWpvdXRlciBcdTAwRTAgdm90cmUgZmljaGllciBkZSBjbFx1MDBFOXMgPyBbbm9uXSA6ICAifSwKKyAgICAgICAgeyJUcnVzdC50aGlzLmNlcnRpZmljYXRlLm5vLiIsICJGYWlyZSBjb25maWFuY2UgXHUwMEUwIGNlIGNlcnRpZmljYXQgPyBbbm9uXSA6ICAifSwKKyAgICAgICAgeyJZRVMiLCAiT3VpIn0sCisgICAgICAgIHsiTmV3LnByb21wdC4iLCAiTm91dmVhdSB7MH0gOiAifSwKKyAgICAgICAgeyJQYXNzd29yZHMubXVzdC5kaWZmZXIiLCAiTGVzIG1vdHMgZGUgcGFzc2UgZG9pdmVudCBkaWZmXHUwMEU5cmVyIn0sCisgICAgICAgIHsiUmUuZW50ZXIubmV3LnByb21wdC4iLCAiSW5kaXF1ZXogZW5jb3JlIGxlIG5vdXZlYXUgezB9IDogIn0sCisgICAgICAgIHsiUmUuZW50ZXIubmV3LnBhc3N3b3JkLiIsICJSZXNzYWlzaXNzZXogbGUgbm91dmVhdSBtb3QgZGUgcGFzc2UgOiAifSwKKyAgICAgICAgeyJUaGV5LmRvbi50Lm1hdGNoLlRyeS5hZ2FpbiIsICJJbHMgc29udCBkaWZmXHUwMEU5cmVudHMuIFJcdTAwRTllc3NheWV6LiJ9LAorICAgICAgICB7IkVudGVyLnByb21wdC5hbGlhcy5uYW1lLiIsICJJbmRpcXVleiBsZSBub20gZCcnYWxpYXMgezB9IDogICJ9LAorICAgICAgICB7IkVudGVyLm5ldy5hbGlhcy5uYW1lLlJFVFVSTi50by5jYW5jZWwuaW1wb3J0LmZvci50aGlzLmVudHJ5LiIsCisgICAgICAgICAgICAgICAgICJTYWlzaXNzZXogbGUgbm9tIGR1IG5vdXZlbCBhbGlhc1x0KG91IGFwcHV5ZXogc3VyIEVudHJcdTAwRTllIHBvdXIgYW5udWxlciBsJ2ltcG9ydCBkZSBjZXR0ZSBlbnRyXHUwMEU5ZSlcdTAwQTA6ICAifSwKKyAgICAgICAgeyJFbnRlci5hbGlhcy5uYW1lLiIsICJJbmRpcXVleiBsZSBub20gZCdhbGlhcyA6ICAifSwKKyAgICAgICAgeyIuUkVUVVJOLmlmLnNhbWUuYXMuZm9yLm90aGVyQWxpYXMuIiwKKyAgICAgICAgICAgICAgICAiXHQoYXBwdXlleiBzdXIgRW50clx1MDBFOWUgc2kgbGUgclx1MDBFOXN1bHRhdCBlc3QgaWRlbnRpcXVlIFx1MDBFMCA8ezB9PikifSwKKyAgICAgICAgeyIuUEFUVEVSTi5wcmludFg1MDlDZXJ0IiwKKyAgICAgICAgICAgICAgICAiUHJvcHJpXHUwMEU5dGFpcmUgOiB7MH1cbkVtZXR0ZXVyIDogezF9XG5OdW1cdTAwRTlybyBkZSBzXHUwMEU5cmllIDogezJ9XG5WYWxpZGUgZHUgOiB7M30gYXUgOiB7NH1cbkVtcHJlaW50ZXMgZHUgY2VydGlmaWNhdCA6XG5cdCBNRDU6ICB7NX1cblx0IFNIQTEgOiB7Nn1cblx0IFNIQTI1NiA6IHs3fVxuXHQgTm9tIGRlIGwnJ2FsZ29yaXRobWUgZGUgc2lnbmF0dXJlIDogezh9XG5cdCBWZXJzaW9uIDogezl9In0sCisgICAgICAgIHsiV2hhdC5pcy55b3VyLmZpcnN0LmFuZC5sYXN0Lm5hbWUuIiwKKyAgICAgICAgICAgICAgICAiUXVlbHMgc29udCB2b3Mgbm9tIGV0IHByXHUwMEU5bm9tID8ifSwKKyAgICAgICAgeyJXaGF0LmlzLnRoZS5uYW1lLm9mLnlvdXIub3JnYW5pemF0aW9uYWwudW5pdC4iLAorICAgICAgICAgICAgICAgICJRdWVsIGVzdCBsZSBub20gZGUgdm90cmUgdW5pdFx1MDBFOSBvcmdhbmlzYXRpb25uZWxsZSA/In0sCisgICAgICAgIHsiV2hhdC5pcy50aGUubmFtZS5vZi55b3VyLm9yZ2FuaXphdGlvbi4iLAorICAgICAgICAgICAgICAgICJRdWVsIGVzdCBsZSBub20gZGUgdm90cmUgZW50cmVwcmlzZSA/In0sCisgICAgICAgIHsiV2hhdC5pcy50aGUubmFtZS5vZi55b3VyLkNpdHkub3IuTG9jYWxpdHkuIiwKKyAgICAgICAgICAgICAgICAiUXVlbCBlc3QgbGUgbm9tIGRlIHZvdHJlIHZpbGxlIGRlIHJcdTAwRTlzaWRlbmNlID8ifSwKKyAgICAgICAgeyJXaGF0LmlzLnRoZS5uYW1lLm9mLnlvdXIuU3RhdGUub3IuUHJvdmluY2UuIiwKKyAgICAgICAgICAgICAgICAiUXVlbCBlc3QgbGUgbm9tIGRlIHZvdHJlIFx1MDBFOXRhdCBvdSBwcm92aW5jZSA/In0sCisgICAgICAgIHsiV2hhdC5pcy50aGUudHdvLmxldHRlci5jb3VudHJ5LmNvZGUuZm9yLnRoaXMudW5pdC4iLAorICAgICAgICAgICAgICAgICJRdWVsIGVzdCBsZSBjb2RlIHBheXMgXHUwMEUwIGRldXggbGV0dHJlcyBwb3VyIGNldHRlIHVuaXRcdTAwRTkgPyJ9LAorICAgICAgICB7IklzLm5hbWUuY29ycmVjdC4iLCAiRXN0LWNlIHswfSA/In0sCisgICAgICAgIHsibm8iLCAibm9uIn0sCisgICAgICAgIHsieWVzIiwgIm91aSJ9LAorICAgICAgICB7InkiLCAibyJ9LAorICAgICAgICB7Ii5kZWZhdWx0VmFsdWUuIiwgIiAgW3swfV06ICAifSwKKyAgICAgICAgeyJBbGlhcy5hbGlhcy5oYXMubm8ua2V5IiwKKyAgICAgICAgICAgICAgICAiTCcnYWxpYXMgPHswfT4gbicnZXN0IGFzc29jaVx1MDBFOSBcdTAwRTAgYXVjdW5lIGNsXHUwMEU5In0sCisgICAgICAgIHsiQWxpYXMuYWxpYXMucmVmZXJlbmNlcy5hbi5lbnRyeS50eXBlLnRoYXQuaXMubm90LmEucHJpdmF0ZS5rZXkuZW50cnkuVGhlLmtleWNsb25lLmNvbW1hbmQub25seS5zdXBwb3J0cy5jbG9uaW5nLm9mLnByaXZhdGUua2V5IiwKKyAgICAgICAgICAgICAgICAgIkwnJ2VudHJcdTAwRTllIFx1MDBFMCBsYXF1ZWxsZSBsJydhbGlhcyA8ezB9PiBmYWl0IHJcdTAwRTlmXHUwMEU5cmVuY2UgbicnZXN0IHBhcyB1bmUgZW50clx1MDBFOWUgZGUgdHlwZSBjbFx1MDBFOSBwcml2XHUwMEU5ZS4gTGEgY29tbWFuZGUgLWtleWNsb25lIHByZW5kIHVuaXF1ZW1lbnQgZW4gY2hhcmdlIGxlIGNsb25hZ2UgZGVzIGNsXHUwMEU5cyBwcml2XHUwMEU5ZXMifSwKKworICAgICAgICB7Ii5XQVJOSU5HLldBUk5JTkcuV0FSTklORy4iLAorICAgICAgICAgICAgIioqKioqKioqKioqKioqKioqICBBdmVydGlzc2VtZW50IEF2ZXJ0aXNzZW1lbnQgQXZlcnRpc3NlbWVudCAgKioqKioqKioqKioqKioqKioifSwKKyAgICAgICAgeyJTaWduZXIuZC4iLCAiU2lnbmF0YWlyZSBuXHUwMEIwJWQgOiJ9LAorICAgICAgICB7IlRpbWVzdGFtcC4iLCAiSG9yb2RhdGFnZSA6In0sCisgICAgICAgIHsiU2lnbmF0dXJlLiIsICJTaWduYXR1cmUgOiJ9LAorICAgICAgICB7IkNSTHMuIiwgIkxpc3RlcyBkZXMgY2VydGlmaWNhdHMgclx1MDBFOXZvcXVcdTAwRTlzIChDUkwpIDoifSwKKyAgICAgICAgeyJDZXJ0aWZpY2F0ZS5vd25lci4iLCAiUHJvcHJpXHUwMEU5dGFpcmUgZHUgY2VydGlmaWNhdCA6ICJ9LAorICAgICAgICB7Ik5vdC5hLnNpZ25lZC5qYXIuZmlsZSIsICJGaWNoaWVyIEpBUiBub24gc2lnblx1MDBFOSJ9LAorICAgICAgICB7Ik5vLmNlcnRpZmljYXRlLmZyb20udGhlLlNTTC5zZXJ2ZXIiLAorICAgICAgICAgICAgICAgICJBdWN1biBjZXJ0aWZpY2F0IGR1IHNlcnZldXIgU1NMIn0sCisKKyAgICAgICAgeyIuVGhlLmludGVncml0eS5vZi50aGUuaW5mb3JtYXRpb24uc3RvcmVkLmluLnlvdXIua2V5c3RvcmUuIiwKKyAgICAgICAgICAgICIqIEwnaW50XHUwMEU5Z3JpdFx1MDBFOSBkZXMgaW5mb3JtYXRpb25zIHN0b2NrXHUwMEU5ZXMgZGFucyB2b3RyZSBmaWNoaWVyIGRlIGNsXHUwMEU5cyAgKlxuKiBuJ2EgUEFTIFx1MDBFOXRcdTAwRTkgdlx1MDBFOXJpZmlcdTAwRTllLiBQb3VyIGNlbGEsICpcbiogdm91cyBkZXZleiBmb3VybmlyIGxlIG1vdCBkZSBwYXNzZSBkZSB2b3RyZSBmaWNoaWVyIGRlIGNsXHUwMEU5cy4gICAgICAgICAgICAgICAgICAqIn0sCisgICAgICAgIHsiLlRoZS5pbnRlZ3JpdHkub2YudGhlLmluZm9ybWF0aW9uLnN0b3JlZC5pbi50aGUuc3Jja2V5c3RvcmUuIiwKKyAgICAgICAgICAgICIqIEwnaW50XHUwMEU5Z3JpdFx1MDBFOSBkZXMgaW5mb3JtYXRpb25zIHN0b2NrXHUwMEU5ZXMgZGFucyBsZSBmaWNoaWVyIGRlIGNsXHUwMEU5cyBzb3VyY2UgICpcbiogbidhIFBBUyBcdTAwRTl0XHUwMEU5IHZcdTAwRTlyaWZpXHUwMEU5ZS4gUG91ciBjZWxhLCAqXG4qIHZvdXMgZGV2ZXogZm91cm5pciBsZSBtb3QgZGUgcGFzc2UgZGUgdm90cmUgZmljaGllciBkZSBjbFx1MDBFOXMgc291cmNlLiAgICAgICAgICAgICAgICAgICoifSwKKworICAgICAgICB7IkNlcnRpZmljYXRlLnJlcGx5LmRvZXMubm90LmNvbnRhaW4ucHVibGljLmtleS5mb3IuYWxpYXMuIiwKKyAgICAgICAgICAgICAgICAiTGEgclx1MDBFOXBvbnNlIGF1IGNlcnRpZmljYXQgbmUgY29udGllbnQgcGFzIGRlIGNsXHUwMEU5IHB1YmxpcXVlIHBvdXIgPHswfT4ifSwKKyAgICAgICAgeyJJbmNvbXBsZXRlLmNlcnRpZmljYXRlLmNoYWluLmluLnJlcGx5IiwKKyAgICAgICAgICAgICAgICAiQ2hhXHUwMEVFbmUgZGUgY2VydGlmaWNhdCBpbmNvbXBsXHUwMEU4dGUgZGFucyBsYSByXHUwMEU5cG9uc2UifSwKKyAgICAgICAgeyJDZXJ0aWZpY2F0ZS5jaGFpbi5pbi5yZXBseS5kb2VzLm5vdC52ZXJpZnkuIiwKKyAgICAgICAgICAgICAgICAiTGEgY2hhXHUwMEVFbmUgZGUgY2VydGlmaWNhdCBkZSBsYSByXHUwMEU5cG9uc2UgbmUgY29uY29yZGUgcGFzIDogIn0sCisgICAgICAgIHsiVG9wLmxldmVsLmNlcnRpZmljYXRlLmluLnJlcGx5LiIsCisgICAgICAgICAgICAgICAgIkNlcnRpZmljYXQgZGUgbml2ZWF1IHN1cFx1MDBFOXJpZXVyIGRhbnMgbGEgclx1MDBFOXBvbnNlIDpcbiJ9LAorICAgICAgICB7Ii5pcy5ub3QudHJ1c3RlZC4iLCAiLi4uIG5vbiBzXHUwMEU5Y3VyaXNcdTAwRTkuICJ9LAorICAgICAgICB7Ikluc3RhbGwucmVwbHkuYW55d2F5Lm5vLiIsICJJbnN0YWxsZXIgbGEgclx1MDBFOXBvbnNlIHF1YW5kIG1cdTAwRUFtZSA/IFtub25dIDogICJ9LAorICAgICAgICB7Ik5PIiwgIk5vbiJ9LAorICAgICAgICB7IlB1YmxpYy5rZXlzLmluLnJlcGx5LmFuZC5rZXlzdG9yZS5kb24udC5tYXRjaCIsCisgICAgICAgICAgICAgICAgIkxlcyBjbFx1MDBFOXMgcHVibGlxdWVzIGRlIGxhIHJcdTAwRTlwb25zZSBldCBkdSBmaWNoaWVyIGRlIGNsXHUwMEU5cyBuZSBjb25jb3JkZW50IHBhcyJ9LAorICAgICAgICB7IkNlcnRpZmljYXRlLnJlcGx5LmFuZC5jZXJ0aWZpY2F0ZS5pbi5rZXlzdG9yZS5hcmUuaWRlbnRpY2FsIiwKKyAgICAgICAgICAgICAgICAiTGEgclx1MDBFOXBvbnNlIGF1IGNlcnRpZmljYXQgZXQgbGUgY2VydGlmaWNhdCBkdSBmaWNoaWVyIGRlIGNsXHUwMEU5cyBzb250IGlkZW50aXF1ZXMifSwKKyAgICAgICAgeyJGYWlsZWQudG8uZXN0YWJsaXNoLmNoYWluLmZyb20ucmVwbHkiLAorICAgICAgICAgICAgICAgICJJbXBvc3NpYmxlIGRlIGNyXHUwMEU5ZXIgdW5lIGNoYVx1MDBFRW5lIFx1MDBFMCBwYXJ0aXIgZGUgbGEgclx1MDBFOXBvbnNlIn0sCisgICAgICAgIHsibiIsICJuIn0sCisgICAgICAgIHsiV3JvbmcuYW5zd2VyLnRyeS5hZ2FpbiIsICJSXHUwMEU5cG9uc2UgaW5jb3JyZWN0ZSwgcmVjb21tZW5jZXoifSwKKyAgICAgICAgeyJTZWNyZXQua2V5Lm5vdC5nZW5lcmF0ZWQuYWxpYXMuYWxpYXMuYWxyZWFkeS5leGlzdHMiLAorICAgICAgICAgICAgICAgICJDbFx1MDBFOSBzZWNyXHUwMEU4dGUgbm9uIGdcdTAwRTluXHUwMEU5clx1MDBFOWUsIGwnJ2FsaWFzIDx7MH0+IGV4aXN0ZSBkXHUwMEU5alx1MDBFMCJ9LAorICAgICAgICB7IlBsZWFzZS5wcm92aWRlLmtleXNpemUuZm9yLnNlY3JldC5rZXkuZ2VuZXJhdGlvbiIsCisgICAgICAgICAgICAgICAgIkluZGlxdWV6IC1rZXlzaXplIHBvdXIgbGEgZ1x1MDBFOW5cdTAwRTlyYXRpb24gZGUgbGEgY2xcdTAwRTkgc2Vjclx1MDBFOHRlIn0sCisKKyAgICAgICAgeyJFeHRlbnNpb25zLiIsICJFeHRlbnNpb25zXHUwMEEwOiAifSwKKyAgICAgICAgeyIuRW1wdHkudmFsdWUuIiwgIihWYWxldXIgdmlkZSkifSwKKyAgICAgICAgeyJFeHRlbnNpb24uUmVxdWVzdC4iLCAiRGVtYW5kZSBkJ2V4dGVuc2lvbiA6In0sCisgICAgICAgIHsiUEtDUy4xMC5DZXJ0aWZpY2F0ZS5SZXF1ZXN0LlZlcnNpb24uMS4wLlN1YmplY3Qucy5QdWJsaWMuS2V5LnMuZm9ybWF0LnMua2V5LiIsCisgICAgICAgICAgICAgICAgIkRlbWFuZGUgZGUgY2VydGlmaWNhdCBQS0NTICMxMCAodmVyc2lvbiAxLjApXG5TdWpldCA6ICVzXG5DbFx1MDBFOSBwdWJsaXF1ZSA6IGZvcm1hdCAlcyBwb3VyIGxhIGNsXHUwMEU5ICVzXG4ifSwKKyAgICAgICAgeyJVbmtub3duLmtleVVzYWdlLnR5cGUuIiwgIlR5cGUga2V5VXNhZ2UgaW5jb25udSA6ICJ9LAorICAgICAgICB7IlVua25vd24uZXh0ZW5kZWRrZXlVc2FnZS50eXBlLiIsICJUeXBlIGV4dGVuZGVka2V5VXNhZ2UgaW5jb25udSA6ICJ9LAorICAgICAgICB7IlVua25vd24uQWNjZXNzRGVzY3JpcHRpb24udHlwZS4iLCAiVHlwZSBBY2Nlc3NEZXNjcmlwdGlvbiBpbmNvbm51IDogIn0sCisgICAgICAgIHsiVW5yZWNvZ25pemVkLkdlbmVyYWxOYW1lLnR5cGUuIiwgIlR5cGUgR2VuZXJhbE5hbWUgbm9uIHJlY29ubnUgOiAifSwKKyAgICAgICAgeyJUaGlzLmV4dGVuc2lvbi5jYW5ub3QuYmUubWFya2VkLmFzLmNyaXRpY2FsLiIsCisgICAgICAgICAgICAgICAgICJDZXR0ZSBleHRlbnNpb24gbmUgcGV1dCBwYXMgXHUwMEVBdHJlIG1hcnF1XHUwMEU5ZSBjb21tZSBjcml0aXF1ZS4gIn0sCisgICAgICAgIHsiT2RkLm51bWJlci5vZi5oZXguZGlnaXRzLmZvdW5kLiIsICJOb21icmUgaW1wYWlyIGRlIGNoaWZmcmVzIGhleGFkXHUwMEU5Y2ltYXV4IHRyb3V2XHUwMEU5IDogIn0sCisgICAgICAgIHsiVW5rbm93bi5leHRlbnNpb24udHlwZS4iLCAiVHlwZSBkJ2V4dGVuc2lvbiBpbmNvbm51IDogIn0sCisgICAgICAgIHsiY29tbWFuZC57MH0uaXMuYW1iaWd1b3VzLiIsICJjb21tYW5kZSB7MH0gYW1iaWd1XHUwMEVCIDoifQorICAgIH07CisKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGNvbnRlbnRzIG9mIHRoaXMgPGNvZGU+UmVzb3VyY2VCdW5kbGU8L2NvZGU+LgorICAgICAqCisgICAgICogPHA+CisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBjb250ZW50cyBvZiB0aGlzIDxjb2RlPlJlc291cmNlQnVuZGxlPC9jb2RlPi4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0W11bXSBnZXRDb250ZW50cygpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRlbnRzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdG9vbHMva2V5dG9vbC9SZXNvdXJjZXNfaXQuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdG9vbHMva2V5dG9vbC9SZXNvdXJjZXNfaXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTU3ZmRjCi0tLSAvZGV2L251bGwKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS90b29scy9rZXl0b29sL1Jlc291cmNlc19pdC5qYXZhCkBAIC0wLDAgKzEsNDMxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBPcmFjbGUgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKKyAqIHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIHN1bi5zZWN1cml0eS50b29scy5rZXl0b29sOworCisvKioKKyAqIDxwPiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIDxjb2RlPlJlc291cmNlQnVuZGxlPC9jb2RlPgorICogZm9yIHRoZSBrZXl0b29sLgorICoKKyAqLworcHVibGljIGNsYXNzIFJlc291cmNlc19pdCBleHRlbmRzIGphdmEudXRpbC5MaXN0UmVzb3VyY2VCdW5kbGUgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W11bXSBjb250ZW50cyA9IHsKKyAgICAgICAgeyJORVdMSU5FIiwgIlxuIn0sCisgICAgICAgIHsiU1RBUiIsCisgICAgICAgICAgICAgICAgIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioifSwKKyAgICAgICAgeyJTVEFSTk4iLAorICAgICAgICAgICAgICAgICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cbiJ9LAorCisgICAgICAgIC8vIGtleXRvb2w6IEhlbHAgcGFydAorLy8gIk9wdGlvbiIgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCisgICAgICAgIHsiLk9QVElPTi4iLCAiIFtPcHppb25lXS4uLiJ9LAorICAgICAgICB7Ik9wdGlvbnMuIiwgIk9wemlvbmk6In0sCisgICAgICAgIHsiVXNlLmtleXRvb2wuaGVscC5mb3IuYWxsLmF2YWlsYWJsZS5jb21tYW5kcyIsCisgICAgICAgICAgICAgICAgICJVdGlsaXp6YXJlIFwia2V5dG9vbCAtaGVscFwiIHBlciB2aXN1YWxpenphcmUgdHV0dGkgaSBjb21hbmRpIGRpc3BvbmliaWxpIn0sCisgICAgICAgIHsiS2V5LmFuZC5DZXJ0aWZpY2F0ZS5NYW5hZ2VtZW50LlRvb2wiLAorICAgICAgICAgICAgICAgICAiU3RydW1lbnRvIGRpIGdlc3Rpb25lIGRpIGNoaWF2aSBlIGNlcnRpZmljYXRpIn0sCisgICAgICAgIHsiQ29tbWFuZHMuIiwgIkNvbWFuZGk6In0sCisgICAgICAgIHsiVXNlLmtleXRvb2wuY29tbWFuZC5uYW1lLmhlbHAuZm9yLnVzYWdlLm9mLmNvbW1hbmQubmFtZSIsCisgICAgICAgICAgICAgICAgIlV0aWxpenphcmUgXCJrZXl0b29sIC1jb21tYW5kX25hbWUgLWhlbHBcIiBwZXIgaW5mb3JtYXppb25pIHN1bGwndXNvIGRpIGNvbW1hbmRfbmFtZSJ9LAorICAgICAgICAvLyBrZXl0b29sOiBoZWxwOiBjb21tYW5kcworICAgICAgICB7IkdlbmVyYXRlcy5hLmNlcnRpZmljYXRlLnJlcXVlc3QiLAorICAgICAgICAgICAgICAgICJHZW5lcmEgdW5hIHJpY2hpZXN0YSBkaSBjZXJ0aWZpY2F0byJ9LCAvLy1jZXJ0cmVxCisgICAgICAgIHsiQ2hhbmdlcy5hbi5lbnRyeS5zLmFsaWFzIiwKKyAgICAgICAgICAgICAgICAiTW9kaWZpY2EgbCdhbGlhcyBkaSB1bmEgdm9jZSJ9LCAvLy1jaGFuZ2VhbGlhcworICAgICAgICB7IkRlbGV0ZXMuYW4uZW50cnkiLAorICAgICAgICAgICAgICAgICJFbGltaW5hIHVuYSB2b2NlIn0sIC8vLWRlbGV0ZQorICAgICAgICB7IkV4cG9ydHMuY2VydGlmaWNhdGUiLAorICAgICAgICAgICAgICAgICJFc3BvcnRhIGlsIGNlcnRpZmljYXRvIn0sIC8vLWV4cG9ydGNlcnQKKyAgICAgICAgeyJHZW5lcmF0ZXMuYS5rZXkucGFpciIsCisgICAgICAgICAgICAgICAgIkdlbmVyYSB1bmEgY29wcGlhIGRpIGNoaWF2aSJ9LCAvLy1nZW5rZXlwYWlyCisvLyB0cmFuc2xhdGlvbiBvZiAic2VjcmV0IiBrZXkgc2hvdWxkIGJlIGRpZmZlcmVudCB0byAicHJpdmF0ZSIga2V5LgorICAgICAgICB7IkdlbmVyYXRlcy5hLnNlY3JldC5rZXkiLAorICAgICAgICAgICAgICAgICJHZW5lcmEgdW5hIGNoaWF2ZSBzZWdyZXRhIn0sIC8vLWdlbnNlY2tleQorICAgICAgICB7IkdlbmVyYXRlcy5jZXJ0aWZpY2F0ZS5mcm9tLmEuY2VydGlmaWNhdGUucmVxdWVzdCIsCisgICAgICAgICAgICAgICAgIkdlbmVyYSB1biBjZXJ0aWZpY2F0byBkYSB1bmEgcmljaGllc3RhIGRpIGNlcnRpZmljYXRvIn0sIC8vLWdlbmNlcnQKKyAgICAgICAgeyJHZW5lcmF0ZXMuQ1JMIiwgIkdlbmVyYSBDUkwifSwgLy8tZ2VuY3JsCisgICAgICAgIHsiSW1wb3J0cy5lbnRyaWVzLmZyb20uYS5KREsuMS4xLnguc3R5bGUuaWRlbnRpdHkuZGF0YWJhc2UiLAorICAgICAgICAgICAgICAgICJJbXBvcnRhIGxlIHZvY2kgZGEgdW4gZGF0YWJhc2UgZGVsbGUgaWRlbnRpdFx1MDBFMCBkaSB0aXBvIEpESyAxLjEueCJ9LCAvLy1pZGVudGl0eWRiCisgICAgICAgIHsiSW1wb3J0cy5hLmNlcnRpZmljYXRlLm9yLmEuY2VydGlmaWNhdGUuY2hhaW4iLAorICAgICAgICAgICAgICAgICJJbXBvcnRhIHVuIGNlcnRpZmljYXRvIG8gdW5hIGNhdGVuYSBkaSBjZXJ0aWZpY2F0aSJ9LCAvLy1pbXBvcnRjZXJ0CisgICAgICAgIHsiSW1wb3J0cy5vbmUub3IuYWxsLmVudHJpZXMuZnJvbS5hbm90aGVyLmtleXN0b3JlIiwKKyAgICAgICAgICAgICAgICAiSW1wb3J0YSB1bmEgbyB0dXR0ZSBsZSB2b2NpIGRhIHVuIGFsdHJvIGtleXN0b3JlIn0sIC8vLWltcG9ydGtleXN0b3JlCisgICAgICAgIHsiQ2xvbmVzLmEua2V5LmVudHJ5IiwKKyAgICAgICAgICAgICAgICAiRHVwbGljYSB1bmEgdm9jZSBkaSBjaGlhdmUifSwgLy8ta2V5Y2xvbmUKKyAgICAgICAgeyJDaGFuZ2VzLnRoZS5rZXkucGFzc3dvcmQub2YuYW4uZW50cnkiLAorICAgICAgICAgICAgICAgICJNb2RpZmljYSBsYSBwYXNzd29yZCBkZWxsYSBjaGlhdmUgcGVyIHVuYSB2b2NlIn0sIC8vLWtleXBhc3N3ZAorICAgICAgICB7Ikxpc3RzLmVudHJpZXMuaW4uYS5rZXlzdG9yZSIsCisgICAgICAgICAgICAgICAgIkVsZW5jYSBsZSB2b2NpIGluIHVuIGtleXN0b3JlIn0sIC8vLWxpc3QKKyAgICAgICAgeyJQcmludHMudGhlLmNvbnRlbnQub2YuYS5jZXJ0aWZpY2F0ZSIsCisgICAgICAgICAgICAgICAgIlZpc3VhbGl6emEgaSBjb250ZW51dGkgZGkgdW4gY2VydGlmaWNhdG8ifSwgLy8tcHJpbnRjZXJ0CisgICAgICAgIHsiUHJpbnRzLnRoZS5jb250ZW50Lm9mLmEuY2VydGlmaWNhdGUucmVxdWVzdCIsCisgICAgICAgICAgICAgICAgIlZpc3VhbGl6emEgaSBjb250ZW51dGkgZGkgdW5hIHJpY2hpZXN0YSBkaSBjZXJ0aWZpY2F0byJ9LCAvLy1wcmludGNlcnRyZXEKKyAgICAgICAgeyJQcmludHMudGhlLmNvbnRlbnQub2YuYS5DUkwuZmlsZSIsCisgICAgICAgICAgICAgICAgIlZpc3VhbGl6emEgaSBjb250ZW51dGkgZGkgdW4gZmlsZSBDUkwifSwgLy8tcHJpbnRjcmwKKyAgICAgICAgeyJHZW5lcmF0ZXMuYS5zZWxmLnNpZ25lZC5jZXJ0aWZpY2F0ZSIsCisgICAgICAgICAgICAgICAgIkdlbmVyYSBjZXJ0aWZpY2F0byBjb24gZmlybWEgYXV0b21hdGljYSJ9LCAvLy1zZWxmY2VydAorICAgICAgICB7IkNoYW5nZXMudGhlLnN0b3JlLnBhc3N3b3JkLm9mLmEua2V5c3RvcmUiLAorICAgICAgICAgICAgICAgICJNb2RpZmljYSBsYSBwYXNzd29yZCBkaSBhcmVhIGRpIG1lbW9yaXp6YXppb25lIGRpIHVuIGtleXN0b3JlIn0sIC8vLXN0b3JlcGFzc3dkCisgICAgICAgIC8vIGtleXRvb2w6IGhlbHA6IG9wdGlvbnMKKyAgICAgICAgeyJhbGlhcy5uYW1lLm9mLnRoZS5lbnRyeS50by5wcm9jZXNzIiwKKyAgICAgICAgICAgICAgICAibm9tZSBhbGlhcyBkZWxsYSB2b2NlIGRhIGVsYWJvcmFyZSJ9LCAvLy1hbGlhcworICAgICAgICB7ImRlc3RpbmF0aW9uLmFsaWFzIiwKKyAgICAgICAgICAgICAgICAiYWxpYXMgZGkgZGVzdGluYXppb25lIn0sIC8vLWRlc3RhbGlhcworICAgICAgICB7ImRlc3RpbmF0aW9uLmtleS5wYXNzd29yZCIsCisgICAgICAgICAgICAgICAgInBhc3N3b3JkIGNoaWF2ZSBkaSBkZXN0aW5hemlvbmUifSwgLy8tZGVzdGtleXBhc3MKKyAgICAgICAgeyJkZXN0aW5hdGlvbi5rZXlzdG9yZS5uYW1lIiwKKyAgICAgICAgICAgICAgICAibm9tZSBrZXlzdG9yZSBkaSBkZXN0aW5hemlvbmUifSwgLy8tZGVzdGtleXN0b3JlCisgICAgICAgIHsiZGVzdGluYXRpb24ua2V5c3RvcmUucGFzc3dvcmQucHJvdGVjdGVkIiwKKyAgICAgICAgICAgICAgICAicGFzc3dvcmQga2V5c3RvcmUgZGkgZGVzdGluYXppb25lIHByb3RldHRhIn0sIC8vLWRlc3Rwcm90ZWN0ZWQKKyAgICAgICAgeyJkZXN0aW5hdGlvbi5rZXlzdG9yZS5wcm92aWRlci5uYW1lIiwKKyAgICAgICAgICAgICAgICAibm9tZSBwcm92aWRlciBrZXlzdG9yZSBkaSBkZXN0aW5hemlvbmUifSwgLy8tZGVzdHByb3ZpZGVybmFtZQorICAgICAgICB7ImRlc3RpbmF0aW9uLmtleXN0b3JlLnBhc3N3b3JkIiwKKyAgICAgICAgICAgICAgICAicGFzc3dvcmQga2V5c3RvcmUgZGkgZGVzdGluYXppb25lIn0sIC8vLWRlc3RzdG9yZXBhc3MKKyAgICAgICAgeyJkZXN0aW5hdGlvbi5rZXlzdG9yZS50eXBlIiwKKyAgICAgICAgICAgICAgICAidGlwbyBrZXlzdG9yZSBkaSBkZXN0aW5hemlvbmUifSwgLy8tZGVzdHN0b3JldHlwZQorICAgICAgICB7ImRpc3Rpbmd1aXNoZWQubmFtZSIsCisgICAgICAgICAgICAgICAgIm5vbWUgZGlzdGludG8ifSwgLy8tZG5hbWUKKyAgICAgICAgeyJYLjUwOS5leHRlbnNpb24iLAorICAgICAgICAgICAgICAgICJlc3RlbnNpb25lIFguNTA5In0sIC8vLWV4dAorICAgICAgICB7Im91dHB1dC5maWxlLm5hbWUiLAorICAgICAgICAgICAgICAgICJub21lIGZpbGUgZGkgb3V0cHV0In0sIC8vLWZpbGUgYW5kIC1vdXRmaWxlCisgICAgICAgIHsiaW5wdXQuZmlsZS5uYW1lIiwKKyAgICAgICAgICAgICAgICAibm9tZSBmaWxlIGRpIGlucHV0In0sIC8vLWZpbGUgYW5kIC1pbmZpbGUKKyAgICAgICAgeyJrZXkuYWxnb3JpdGhtLm5hbWUiLAorICAgICAgICAgICAgICAgICJub21lIGFsZ29yaXRtbyBjaGlhdmUifSwgLy8ta2V5YWxnCisgICAgICAgIHsia2V5LnBhc3N3b3JkIiwKKyAgICAgICAgICAgICAgICAicGFzc3dvcmQgY2hpYXZlIn0sIC8vLWtleXBhc3MKKyAgICAgICAgeyJrZXkuYml0LnNpemUiLAorICAgICAgICAgICAgICAgICJkaW1lbnNpb25lIGJpdCBjaGlhdmUifSwgLy8ta2V5c2l6ZQorICAgICAgICB7ImtleXN0b3JlLm5hbWUiLAorICAgICAgICAgICAgICAgICJub21lIGtleXN0b3JlIn0sIC8vLWtleXN0b3JlCisgICAgICAgIHsibmV3LnBhc3N3b3JkIiwKKyAgICAgICAgICAgICAgICAibnVvdmEgcGFzc3dvcmQifSwgLy8tbmV3CisgICAgICAgIHsiZG8ubm90LnByb21wdCIsCisgICAgICAgICAgICAgICAgIm5vbiByaWNoaWVkZXJlIn0sIC8vLW5vcHJvbXB0CisgICAgICAgIHsicGFzc3dvcmQudGhyb3VnaC5wcm90ZWN0ZWQubWVjaGFuaXNtIiwKKyAgICAgICAgICAgICAgICAicGFzc3dvcmQgbWVkaWFudGUgbWVjY2FuaXNtbyBwcm90ZXR0byJ9LCAvLy1wcm90ZWN0ZWQKKyAgICAgICAgeyJwcm92aWRlci5hcmd1bWVudCIsCisgICAgICAgICAgICAgICAgImFyZ29tZW50byBwcm92aWRlciJ9LCAvLy1wcm92aWRlcmFyZworICAgICAgICB7InByb3ZpZGVyLmNsYXNzLm5hbWUiLAorICAgICAgICAgICAgICAgICJub21lIGNsYXNzZSBwcm92aWRlciJ9LCAvLy1wcm92aWRlcmNsYXNzCisgICAgICAgIHsicHJvdmlkZXIubmFtZSIsCisgICAgICAgICAgICAgICAgIm5vbWUgcHJvdmlkZXIifSwgLy8tcHJvdmlkZXJuYW1lCisgICAgICAgIHsicHJvdmlkZXIuY2xhc3NwYXRoIiwKKyAgICAgICAgICAgICAgICAiY2xhc3NwYXRoIHByb3ZpZGVyIn0sIC8vLXByb3ZpZGVycGF0aAorICAgICAgICB7Im91dHB1dC5pbi5SRkMuc3R5bGUiLAorICAgICAgICAgICAgICAgICJvdXRwdXQgaW4gc3RpbGUgUkZDIn0sIC8vLXJmYworICAgICAgICB7InNpZ25hdHVyZS5hbGdvcml0aG0ubmFtZSIsCisgICAgICAgICAgICAgICAgIm5vbWUgYWxnb3JpdG1vIGZpcm1hIn0sIC8vLXNpZ2FsZworICAgICAgICB7InNvdXJjZS5hbGlhcyIsCisgICAgICAgICAgICAgICAgImFsaWFzIG9yaWdpbmUifSwgLy8tc3JjYWxpYXMKKyAgICAgICAgeyJzb3VyY2Uua2V5LnBhc3N3b3JkIiwKKyAgICAgICAgICAgICAgICAicGFzc3dvcmQgY2hpYXZlIGRpIG9yaWdpbmUifSwgLy8tc3Jja2V5cGFzcworICAgICAgICB7InNvdXJjZS5rZXlzdG9yZS5uYW1lIiwKKyAgICAgICAgICAgICAgICAibm9tZSBrZXlzdG9yZSBkaSBvcmlnaW5lIn0sIC8vLXNyY2tleXN0b3JlCisgICAgICAgIHsic291cmNlLmtleXN0b3JlLnBhc3N3b3JkLnByb3RlY3RlZCIsCisgICAgICAgICAgICAgICAgInBhc3N3b3JkIGtleXN0b3JlIGRpIG9yaWdpbmUgcHJvdGV0dGEifSwgLy8tc3JjcHJvdGVjdGVkCisgICAgICAgIHsic291cmNlLmtleXN0b3JlLnByb3ZpZGVyLm5hbWUiLAorICAgICAgICAgICAgICAgICJub21lIHByb3ZpZGVyIGtleXN0b3JlIGRpIG9yaWdpbmUifSwgLy8tc3JjcHJvdmlkZXJuYW1lCisgICAgICAgIHsic291cmNlLmtleXN0b3JlLnBhc3N3b3JkIiwKKyAgICAgICAgICAgICAgICAicGFzc3dvcmQga2V5c3RvcmUgZGkgb3JpZ2luZSJ9LCAvLy1zcmNzdG9yZXBhc3MKKyAgICAgICAgeyJzb3VyY2Uua2V5c3RvcmUudHlwZSIsCisgICAgICAgICAgICAgICAgInRpcG8ga2V5c3RvcmUgZGkgb3JpZ2luZSJ9LCAvLy1zcmNzdG9yZXR5cGUKKyAgICAgICAgeyJTU0wuc2VydmVyLmhvc3QuYW5kLnBvcnQiLAorICAgICAgICAgICAgICAgICJob3N0IGUgcG9ydGEgc2VydmVyIFNTTCJ9LCAvLy1zc2xzZXJ2ZXIKKyAgICAgICAgeyJzaWduZWQuamFyLmZpbGUiLAorICAgICAgICAgICAgICAgICJmaWxlIGphciBmaXJtYXRvIn0sIC8vPWphcmZpbGUKKyAgICAgICAgeyJjZXJ0aWZpY2F0ZS52YWxpZGl0eS5zdGFydC5kYXRlLnRpbWUiLAorICAgICAgICAgICAgICAgICJkYXRhL29yYSBkaSBpbml6aW8gdmFsaWRpdFx1MDBFMCBjZXJ0aWZpY2F0byJ9LCAvLy1zdGFydGRhdGUKKyAgICAgICAgeyJrZXlzdG9yZS5wYXNzd29yZCIsCisgICAgICAgICAgICAgICAgInBhc3N3b3JkIGtleXN0b3JlIn0sIC8vLXN0b3JlcGFzcworICAgICAgICB7ImtleXN0b3JlLnR5cGUiLAorICAgICAgICAgICAgICAgICJ0aXBvIGtleXN0b3JlIn0sIC8vLXN0b3JldHlwZQorICAgICAgICB7InRydXN0LmNlcnRpZmljYXRlcy5mcm9tLmNhY2VydHMiLAorICAgICAgICAgICAgICAgICJjb25zaWRlcmEgc2ljdXJpIGkgY2VydGlmaWNhdGkgZGEgY2FjZXJ0cyJ9LCAvLy10cnVzdGNhY2VydHMKKyAgICAgICAgeyJ2ZXJib3NlLm91dHB1dCIsCisgICAgICAgICAgICAgICAgIm91dHB1dCBkZXNjcml0dGl2byJ9LCAvLy12CisgICAgICAgIHsidmFsaWRpdHkubnVtYmVyLm9mLmRheXMiLAorICAgICAgICAgICAgICAgICJudW1lcm8gZGkgZ2lvcm5pIGRpIHZhbGlkaXRcdTAwRTAifSwgLy8tdmFsaWRpdHkKKyAgICAgICAgeyJTZXJpYWwuSUQub2YuY2VydC50by5yZXZva2UiLAorICAgICAgICAgICAgICAgICAiSUQgc2VyaWFsZSBkZWwgY2VydGlmaWNhdG8gZGEgcmV2b2NhcmUifSwgLy8taWQKKyAgICAgICAgLy8ga2V5dG9vbDogUnVubmluZyBwYXJ0CisgICAgICAgIHsia2V5dG9vbC5lcnJvci4iLCAiRXJyb3JlIGtleXRvb2w6ICJ9LAorICAgICAgICB7IklsbGVnYWwub3B0aW9uLiIsICJPcHppb25lIG5vbiB2YWxpZGE6ICAifSwKKyAgICAgICAgeyJJbGxlZ2FsLnZhbHVlLiIsICJWYWxvcmUgbm9uIHZhbGlkbzogIn0sCisgICAgICAgIHsiVW5rbm93bi5wYXNzd29yZC50eXBlLiIsICJUaXBvIGRpIHBhc3N3b3JkIHNjb25vc2NpdXRvOiAifSwKKyAgICAgICAgeyJDYW5ub3QuZmluZC5lbnZpcm9ubWVudC52YXJpYWJsZS4iLAorICAgICAgICAgICAgICAgICJJbXBvc3NpYmlsZSB0cm92YXJlIGxhIHZhcmlhYmlsZSBkaSBhbWJpZW50ZTogIn0sCisgICAgICAgIHsiQ2Fubm90LmZpbmQuZmlsZS4iLCAiSW1wb3NzaWJpbGUgdHJvdmFyZSBpbCBmaWxlOiAifSwKKyAgICAgICAgeyJDb21tYW5kLm9wdGlvbi5mbGFnLm5lZWRzLmFuLmFyZ3VtZW50LiIsICJcdTAwQzggbmVjZXNzYXJpbyBzcGVjaWZpY2FyZSB1biBhcmdvbWVudG8gcGVyIGwnJ29wemlvbmUgZGkgY29tYW5kbyB7MH0uIn0sCisgICAgICAgIHsiV2FybmluZy5EaWZmZXJlbnQuc3RvcmUuYW5kLmtleS5wYXNzd29yZHMubm90LnN1cHBvcnRlZC5mb3IuUEtDUzEyLktleVN0b3Jlcy5JZ25vcmluZy51c2VyLnNwZWNpZmllZC5jb21tYW5kLnZhbHVlLiIsCisgICAgICAgICAgICAgICAgIkF2dmVydGVuemE6IG5vbiBzb25vIHN1cHBvcnRhdGUgcGFzc3dvcmQgZGl2ZXJzZSBkaSBjaGlhdmUgZSBkaSBhcmNoaXZpbyBwZXIgaSBrZXlzdG9yZSBQS0NTMTIuIElsIHZhbG9yZSB7MH0gc3BlY2lmaWNhdG8gZGFsbCcndXRlbnRlIHZlcnJcdTAwRTAgaWdub3JhdG8uIn0sCisgICAgICAgIHsiLmtleXN0b3JlLm11c3QuYmUuTk9ORS5pZi5zdG9yZXR5cGUuaXMuezB9IiwKKyAgICAgICAgICAgICAgICAiU2UgLXN0b3JldHlwZSBcdTAwRTggaW1wb3N0YXRvIHN1IHswfSwgLWtleXN0b3JlIGRldmUgZXNzZXJlIGltcG9zdGF0byBzdSBOT05FIn0sCisgICAgICAgIHsiVG9vLm1hbnkucmV0cmllcy5wcm9ncmFtLnRlcm1pbmF0ZWQiLAorICAgICAgICAgICAgICAgICAiSWwgbnVtZXJvIGRlaSB0ZW50YXRpdmkgY29uc2VudGl0aSBcdTAwRTggc3RhdG8gc3VwZXJhdG8uIElsIHByb2dyYW1tYSB2ZXJyXHUwMEUwIHRlcm1pbmF0by4ifSwKKyAgICAgICAgeyIuc3RvcmVwYXNzd2QuYW5kLmtleXBhc3N3ZC5jb21tYW5kcy5ub3Quc3VwcG9ydGVkLmlmLnN0b3JldHlwZS5pcy57MH0iLAorICAgICAgICAgICAgICAgICJTZSAtc3RvcmV0eXBlIFx1MDBFOCBpbXBvc3RhdG8gc3UgezB9LCBpIGNvbWFuZGkgLXN0b3JlcGFzc3dkIGUgLWtleXBhc3N3ZCBub24gc29ubyBzdXBwb3J0YXRpIn0sCisgICAgICAgIHsiLmtleXBhc3N3ZC5jb21tYW5kcy5ub3Quc3VwcG9ydGVkLmlmLnN0b3JldHlwZS5pcy5QS0NTMTIiLAorICAgICAgICAgICAgICAgICJTZSAtc3RvcmV0eXBlIFx1MDBFOCBpbXBvc3RhdG8gc3UgUEtDUzEyIGkgY29tYW5kaSAta2V5cGFzc3dkIG5vbiB2ZW5nb25vIHN1cHBvcnRhdGkifSwKKyAgICAgICAgeyIua2V5cGFzcy5hbmQubmV3LmNhbi5ub3QuYmUuc3BlY2lmaWVkLmlmLnN0b3JldHlwZS5pcy57MH0iLAorICAgICAgICAgICAgICAgICJTZSAtc3RvcmV0eXBlIFx1MDBFOCBpbXBvc3RhdG8gc3UgezB9LCBub24gXHUwMEU4IHBvc3NpYmlsZSBzcGVjaWZpY2FyZSB1biB2YWxvcmUgcGVyIC1rZXlwYXNzIGUgLW5ldyJ9LAorICAgICAgICB7ImlmLnByb3RlY3RlZC5pcy5zcGVjaWZpZWQudGhlbi5zdG9yZXBhc3Mua2V5cGFzcy5hbmQubmV3Lm11c3Qubm90LmJlLnNwZWNpZmllZCIsCisgICAgICAgICAgICAgICAgIlNlIFx1MDBFOCBzcGVjaWZpY2F0YSBsJ29wemlvbmUgLXByb3RlY3RlZCwgbGUgb3B6aW9uaSAtc3RvcmVwYXNzLCAta2V5cGFzcyBlIC1uZXcgbm9uIHBvc3Nvbm8gZXNzZXJlIHNwZWNpZmljYXRlIn0sCisgICAgICAgIHsiaWYuc3JjcHJvdGVjdGVkLmlzLnNwZWNpZmllZC50aGVuLnNyY3N0b3JlcGFzcy5hbmQuc3Jja2V5cGFzcy5tdXN0Lm5vdC5iZS5zcGVjaWZpZWQiLAorICAgICAgICAgICAgICAgICJTZSB2aWVuZSBzcGVjaWZpY2F0byAtc3JjcHJvdGVjdGVkLCAtc3Jjc3RvcmVwYXNzIGUgLXNyY2tleXBhc3Mgbm9uIGRvdnJhbm5vIGVzc2VyZSBzcGVjaWZpY2F0aSJ9LAorICAgICAgICB7ImlmLmtleXN0b3JlLmlzLm5vdC5wYXNzd29yZC5wcm90ZWN0ZWQudGhlbi5zdG9yZXBhc3Mua2V5cGFzcy5hbmQubmV3Lm11c3Qubm90LmJlLnNwZWNpZmllZCIsCisgICAgICAgICAgICAgICAgIlNlIGlsIGZpbGUga2V5c3RvcmUgbm9uIFx1MDBFOCBwcm90ZXR0byBkYSBwYXNzd29yZCwgbm9uIGRldmUgZXNzZXJlIHNwZWNpZmljYXRvIGFsY3VuIHZhbG9yZSBwZXIgLXN0b3JlcGFzcywgLWtleXBhc3MgZSAtbmV3In0sCisgICAgICAgIHsiaWYuc291cmNlLmtleXN0b3JlLmlzLm5vdC5wYXNzd29yZC5wcm90ZWN0ZWQudGhlbi5zcmNzdG9yZXBhc3MuYW5kLnNyY2tleXBhc3MubXVzdC5ub3QuYmUuc3BlY2lmaWVkIiwKKyAgICAgICAgICAgICAgICAiU2UgaWwgZmlsZSBrZXlzdG9yZSBub24gXHUwMEU4IHByb3RldHRvIGRhIHBhc3N3b3JkLCBub24gZGV2ZSBlc3NlcmUgc3BlY2lmaWNhdG8gYWxjdW4gdmFsb3JlIHBlciAtc3Jjc3RvcmVwYXNzIGUgLXNyY2tleXBhc3MifSwKKyAgICAgICAgeyJJbGxlZ2FsLnN0YXJ0ZGF0ZS52YWx1ZSIsICJWYWxvcmUgZGkgZGF0YSBkaSBpbml6aW8gbm9uIHZhbGlkbyJ9LAorICAgICAgICB7IlZhbGlkaXR5Lm11c3QuYmUuZ3JlYXRlci50aGFuLnplcm8iLAorICAgICAgICAgICAgICAgICJMYSB2YWxpZGl0XHUwMEUwIGRldmUgZXNzZXJlIG1hZ2dpb3JlIGRpIHplcm8ifSwKKyAgICAgICAgeyJwcm92TmFtZS5ub3QuYS5wcm92aWRlciIsICJ7MH0gbm9uIFx1MDBFOCB1biBwcm92aWRlciJ9LAorICAgICAgICB7IlVzYWdlLmVycm9yLm5vLmNvbW1hbmQucHJvdmlkZWQiLCAiRXJyb3JlIGRpIHV0aWxpenpvOiBuZXNzdW4gY29tYW5kbyBzcGVjaWZpY2F0byJ9LAorICAgICAgICB7IlNvdXJjZS5rZXlzdG9yZS5maWxlLmV4aXN0cy5idXQuaXMuZW1wdHkuIiwgIklsIGZpbGUga2V5c3RvcmUgZGkgb3JpZ2luZSBlc2lzdGUsIG1hIFx1MDBFOCB2dW90bzogIn0sCisgICAgICAgIHsiUGxlYXNlLnNwZWNpZnkuc3Jja2V5c3RvcmUiLCAiU3BlY2lmaWNhcmUgLXNyY2tleXN0b3JlIn0sCisgICAgICAgIHsiTXVzdC5ub3Quc3BlY2lmeS5ib3RoLnYuYW5kLnJmYy53aXRoLmxpc3QuY29tbWFuZCIsCisgICAgICAgICAgICAgICAgIkltcG9zc2liaWxlIHNwZWNpZmljYXJlIHNpYSAtdiBzaWEgLXJmYyBjb24gaWwgY29tYW5kbyAnbGlzdCcifSwKKyAgICAgICAgeyJLZXkucGFzc3dvcmQubXVzdC5iZS5hdC5sZWFzdC42LmNoYXJhY3RlcnMiLAorICAgICAgICAgICAgICAgICJMYSBwYXNzd29yZCBkZWxsYSBjaGlhdmUgZGV2ZSBjb250ZW5lcmUgYWxtZW5vIDYgY2FyYXR0ZXJpIn0sCisgICAgICAgIHsiTmV3LnBhc3N3b3JkLm11c3QuYmUuYXQubGVhc3QuNi5jaGFyYWN0ZXJzIiwKKyAgICAgICAgICAgICAgICAiTGEgbnVvdmEgcGFzc3dvcmQgZGV2ZSBjb250ZW5lcmUgYWxtZW5vIDYgY2FyYXR0ZXJpIn0sCisgICAgICAgIHsiS2V5c3RvcmUuZmlsZS5leGlzdHMuYnV0LmlzLmVtcHR5LiIsCisgICAgICAgICAgICAgICAgIklsIGZpbGUga2V5c3RvcmUgZXNpc3RlIG1hIFx1MDBFOCB2dW90bzogIn0sCisgICAgICAgIHsiS2V5c3RvcmUuZmlsZS5kb2VzLm5vdC5leGlzdC4iLAorICAgICAgICAgICAgICAgICJJbCBmaWxlIGtleXN0b3JlIG5vbiBlc2lzdGU6ICJ9LAorICAgICAgICB7Ik11c3Quc3BlY2lmeS5kZXN0aW5hdGlvbi5hbGlhcyIsICJcdTAwQzggbmVjZXNzYXJpbyBzcGVjaWZpY2FyZSBsJ2FsaWFzIGRpIGRlc3RpbmF6aW9uZSJ9LAorICAgICAgICB7Ik11c3Quc3BlY2lmeS5hbGlhcyIsICJcdTAwQzggbmVjZXNzYXJpbyBzcGVjaWZpY2FyZSBsJ2FsaWFzIn0sCisgICAgICAgIHsiS2V5c3RvcmUucGFzc3dvcmQubXVzdC5iZS5hdC5sZWFzdC42LmNoYXJhY3RlcnMiLAorICAgICAgICAgICAgICAgICJMYSBwYXNzd29yZCBkZWwga2V5c3RvcmUgZGV2ZSBjb250ZW5lcmUgYWxtZW5vIDYgY2FyYXR0ZXJpIn0sCisgICAgICAgIHsiRW50ZXIua2V5c3RvcmUucGFzc3dvcmQuIiwgIkltbWV0dGVyZSBsYSBwYXNzd29yZCBkZWwga2V5c3RvcmU6ICAifSwKKyAgICAgICAgeyJFbnRlci5zb3VyY2Uua2V5c3RvcmUucGFzc3dvcmQuIiwgIkltbWV0dGVyZSBsYSBwYXNzd29yZCBkZWwga2V5c3RvcmUgZGkgb3JpZ2luZTogICJ9LAorICAgICAgICB7IkVudGVyLmRlc3RpbmF0aW9uLmtleXN0b3JlLnBhc3N3b3JkLiIsICJJbW1ldHRlcmUgbGEgcGFzc3dvcmQgZGVsIGtleXN0b3JlIGRpIGRlc3RpbmF6aW9uZTogICJ9LAorICAgICAgICB7IktleXN0b3JlLnBhc3N3b3JkLmlzLnRvby5zaG9ydC5tdXN0LmJlLmF0LmxlYXN0LjYuY2hhcmFjdGVycyIsCisgICAgICAgICAiTGEgcGFzc3dvcmQgZGVsIGtleXN0b3JlIFx1MDBFOCB0cm9wcG8gY29ydGEgLSBkZXZlIGNvbnRlbmVyZSBhbG1lbm8gNiBjYXJhdHRlcmkifSwKKyAgICAgICAgeyJVbmtub3duLkVudHJ5LlR5cGUiLCAiVGlwbyBkaSB2b2NlIHNjb25vc2NpdXRvIn0sCisgICAgICAgIHsiVG9vLm1hbnkuZmFpbHVyZXMuQWxpYXMubm90LmNoYW5nZWQiLCAiTnVtZXJvIGVjY2Vzc2l2byBkaSBlcnJvcmkuIEwnYWxpYXMgbm9uIFx1MDBFOCBzdGF0byBtb2RpZmljYXRvLiJ9LAorICAgICAgICB7IkVudHJ5LmZvci5hbGlhcy5hbGlhcy5zdWNjZXNzZnVsbHkuaW1wb3J0ZWQuIiwKKyAgICAgICAgICAgICAgICAgIkxhIHZvY2UgZGVsbCcnYWxpYXMgezB9IFx1MDBFOCBzdGF0YSBpbXBvcnRhdGEuIn0sCisgICAgICAgIHsiRW50cnkuZm9yLmFsaWFzLmFsaWFzLm5vdC5pbXBvcnRlZC4iLCAiTGEgdm9jZSBkZWxsJydhbGlhcyB7MH0gbm9uIFx1MDBFOCBzdGF0YSBpbXBvcnRhdGEuIn0sCisgICAgICAgIHsiUHJvYmxlbS5pbXBvcnRpbmcuZW50cnkuZm9yLmFsaWFzLmFsaWFzLmV4Y2VwdGlvbi5FbnRyeS5mb3IuYWxpYXMuYWxpYXMubm90LmltcG9ydGVkLiIsCisgICAgICAgICAgICAgICAgICJTaSBcdTAwRTggdmVyaWZpY2F0byB1biBwcm9ibGVtYSBkdXJhbnRlIGwnJ2ltcG9ydGF6aW9uZSBkZWxsYSB2b2NlIGRlbGwnJ2FsaWFzIHswfTogezF9LlxuTGEgdm9jZSBkZWxsJydhbGlhcyB7MH0gbm9uIFx1MDBFOCBzdGF0YSBpbXBvcnRhdGEuIn0sCisgICAgICAgIHsiSW1wb3J0LmNvbW1hbmQuY29tcGxldGVkLm9rLmVudHJpZXMuc3VjY2Vzc2Z1bGx5LmltcG9ydGVkLmZhaWwuZW50cmllcy5mYWlsZWQub3IuY2FuY2VsbGVkIiwKKyAgICAgICAgICAgICAgICAgIkNvbWFuZG8gZGkgaW1wb3J0YXppb25lIGNvbXBsZXRhdG86IHswfSB2b2NlL2kgaW1wb3J0YXRhL2UsIHsxfSB2b2NlL2kgbm9uIGltcG9ydGF0YS9lIG8gYW5udWxsYXRhL2UifSwKKyAgICAgICAgeyJXYXJuaW5nLk92ZXJ3cml0aW5nLmV4aXN0aW5nLmFsaWFzLmFsaWFzLmluLmRlc3RpbmF0aW9uLmtleXN0b3JlIiwKKyAgICAgICAgICAgICAgICAgIkF2dmVydGVuemE6IHNvdnJhc2NyaXR0dXJhIGluIGNvcnNvIGRlbGwnJ2FsaWFzIHswfSBuZWwgZmlsZSBrZXlzdG9yZSBkaSBkZXN0aW5hemlvbmUifSwKKyAgICAgICAgeyJFeGlzdGluZy5lbnRyeS5hbGlhcy5hbGlhcy5leGlzdHMub3ZlcndyaXRlLm5vLiIsCisgICAgICAgICAgICAgICAgICJMYSB2b2NlIGRlbGwnJ2FsaWFzIHswfSBlc2lzdGUgZ2lcdTAwRTAuIFNvdnJhc2NyaXZlcmU/IFtub106ICAifSwKKyAgICAgICAgeyJUb28ubWFueS5mYWlsdXJlcy50cnkubGF0ZXIiLCAiVHJvcHBpIGVycm9yaSAtIHJpcHJvdmFyZSJ9LAorICAgICAgICB7IkNlcnRpZmljYXRpb24ucmVxdWVzdC5zdG9yZWQuaW4uZmlsZS5maWxlbmFtZS4iLAorICAgICAgICAgICAgICAgICJMYSByaWNoaWVzdGEgZGkgY2VydGlmaWNhemlvbmUgXHUwMEU4IG1lbW9yaXp6YXRhIG5lbCBmaWxlIDx7MH0+In0sCisgICAgICAgIHsiU3VibWl0LnRoaXMudG8ueW91ci5DQSIsICJTb3R0b21ldHRlcmUgYWxsYSBwcm9wcmlhIENBIn0sCisgICAgICAgIHsiaWYuYWxpYXMubm90LnNwZWNpZmllZC5kZXN0YWxpYXMuc3Jja2V5cGFzcy5hbmQuZGVzdGtleXBhc3MubXVzdC5ub3QuYmUuc3BlY2lmaWVkIiwKKyAgICAgICAgICAgICJTZSBsJ2FsaWFzIG5vbiBcdTAwRTggc3BlY2lmaWNhdG8sIGRlc3RhbGlhcywgc3Jja2V5cGFzcyBlIGRlc3RrZXlwYXNzIG5vbiBkb3ZyYW5ubyBlc3NlcmUgc3BlY2lmaWNhdGkifSwKKyAgICAgICAgeyJDZXJ0aWZpY2F0ZS5zdG9yZWQuaW4uZmlsZS5maWxlbmFtZS4iLAorICAgICAgICAgICAgICAgICJJbCBjZXJ0aWZpY2F0byBcdTAwRTggbWVtb3JpenphdG8gbmVsIGZpbGUgPHswfT4ifSwKKyAgICAgICAgeyJDZXJ0aWZpY2F0ZS5yZXBseS53YXMuaW5zdGFsbGVkLmluLmtleXN0b3JlIiwKKyAgICAgICAgICAgICAgICAiTGEgcmlzcG9zdGEgZGVsIGNlcnRpZmljYXRvIFx1MDBFOCBzdGF0YSBpbnN0YWxsYXRhIG5lbCBrZXlzdG9yZSJ9LAorICAgICAgICB7IkNlcnRpZmljYXRlLnJlcGx5Lndhcy5ub3QuaW5zdGFsbGVkLmluLmtleXN0b3JlIiwKKyAgICAgICAgICAgICAgICAiTGEgcmlzcG9zdGEgZGVsIGNlcnRpZmljYXRvIG5vbiBcdTAwRTggc3RhdGEgaW5zdGFsbGF0YSBuZWwga2V5c3RvcmUifSwKKyAgICAgICAgeyJDZXJ0aWZpY2F0ZS53YXMuYWRkZWQudG8ua2V5c3RvcmUiLAorICAgICAgICAgICAgICAgICJJbCBjZXJ0aWZpY2F0byBcdTAwRTggc3RhdG8gYWdnaXVudG8gYWwga2V5c3RvcmUifSwKKyAgICAgICAgeyJDZXJ0aWZpY2F0ZS53YXMubm90LmFkZGVkLnRvLmtleXN0b3JlIiwKKyAgICAgICAgICAgICAgICAiSWwgY2VydGlmaWNhdG8gbm9uIFx1MDBFOCBzdGF0byBhZ2dpdW50byBhbCBrZXlzdG9yZSJ9LAorICAgICAgICB7Ii5TdG9yaW5nLmtzZm5hbWUuIiwgIltNZW1vcml6emF6aW9uZSBkaSB7MH1dIGluIGNvcnNvIn0sCisgICAgICAgIHsiYWxpYXMuaGFzLm5vLnB1YmxpYy5rZXkuY2VydGlmaWNhdGUuIiwKKyAgICAgICAgICAgICAgICAiezB9IG5vbiBkaXNwb25lIGRpIGNoaWF2ZSBwdWJibGljYSAoY2VydGlmaWNhdG8pIn0sCisgICAgICAgIHsiQ2Fubm90LmRlcml2ZS5zaWduYXR1cmUuYWxnb3JpdGhtIiwKKyAgICAgICAgICAgICAgICAiSW1wb3NzaWJpbGUgZGVyaXZhcmUgbCdhbGdvcml0bW8gZGkgZmlybWEifSwKKyAgICAgICAgeyJBbGlhcy5hbGlhcy5kb2VzLm5vdC5leGlzdCIsCisgICAgICAgICAgICAgICAgIkwnJ2FsaWFzIDx7MH0+IG5vbiBlc2lzdGUifSwKKyAgICAgICAgeyJBbGlhcy5hbGlhcy5oYXMubm8uY2VydGlmaWNhdGUiLAorICAgICAgICAgICAgICAgICJMJydhbGlhcyA8ezB9PiBub24gZGlzcG9uZSBkaSBjZXJ0aWZpY2F0byJ9LAorICAgICAgICB7IktleS5wYWlyLm5vdC5nZW5lcmF0ZWQuYWxpYXMuYWxpYXMuYWxyZWFkeS5leGlzdHMiLAorICAgICAgICAgICAgICAgICJOb24gXHUwMEU4IHN0YXRhIGdlbmVyYXRhIGxhIGNvcHBpYSBkaSBjaGlhdmksIGwnJ2FsaWFzIDx7MH0+IFx1MDBFOCBnaVx1MDBFMCBlc2lzdGVudGUifSwKKyAgICAgICAgeyJHZW5lcmF0aW5nLmtleXNpemUuYml0LmtleUFsZ05hbWUua2V5LnBhaXIuYW5kLnNlbGYuc2lnbmVkLmNlcnRpZmljYXRlLnNpZ0FsZ05hbWUud2l0aC5hLnZhbGlkaXR5Lm9mLnZhbGlkYWxpdHkuZGF5cy5mb3IiLAorICAgICAgICAgICAgICAgICJHZW5lcmF6aW9uZSBpbiBjb3JzbyBkaSB1bmEgY29wcGlhIGRpIGNoaWF2aSB7MX0gZGEgezB9IGJpdCBlIGRpIHVuIGNlcnRpZmljYXRvIGF1dG9maXJtYXRvICh7Mn0pIGNvbiB1bmEgdmFsaWRpdFx1MDBFMCBkaSB7M30gZ2lvcm5pXG5cdHBlcjogezR9In0sCisgICAgICAgIHsiRW50ZXIua2V5LnBhc3N3b3JkLmZvci5hbGlhcy4iLCAiSW1tZXR0ZXJlIGxhIHBhc3N3b3JkIGRlbGxhIGNoaWF2ZSBwZXIgPHswfT4ifSwKKyAgICAgICAgeyIuUkVUVVJOLmlmLnNhbWUuYXMua2V5c3RvcmUucGFzc3dvcmQuIiwKKyAgICAgICAgICAgICAgICAiXHQoSU5WSU8gc2UgY29ycmlzcG9uZGUgYWxsYSBwYXNzd29yZCBkZWwga2V5c3RvcmUpOiAgIn0sCisgICAgICAgIHsiS2V5LnBhc3N3b3JkLmlzLnRvby5zaG9ydC5tdXN0LmJlLmF0LmxlYXN0LjYuY2hhcmFjdGVycyIsCisgICAgICAgICAgICAgICAgIkxhIHBhc3N3b3JkIGRlbGxhIGNoaWF2ZSBcdTAwRTggdHJvcHBvIGNvcnRhIC0gZGV2ZSBjb250ZW5lcmUgYWxtZW5vIDYgY2FyYXR0ZXJpIn0sCisgICAgICAgIHsiVG9vLm1hbnkuZmFpbHVyZXMua2V5Lm5vdC5hZGRlZC50by5rZXlzdG9yZSIsCisgICAgICAgICAgICAgICAgIlRyb3BwaSBlcnJvcmkgLSBsYSBjaGlhdmUgbm9uIFx1MDBFOCBzdGF0YSBhZ2dpdW50YSBhbCBrZXlzdG9yZSJ9LAorICAgICAgICB7IkRlc3RpbmF0aW9uLmFsaWFzLmRlc3QuYWxyZWFkeS5leGlzdHMiLAorICAgICAgICAgICAgICAgICJMJydhbGlhcyBkaSBkZXN0aW5hemlvbmUgPHswfT4gXHUwMEU4IGdpXHUwMEUwIGVzaXN0ZW50ZSJ9LAorICAgICAgICB7IlBhc3N3b3JkLmlzLnRvby5zaG9ydC5tdXN0LmJlLmF0LmxlYXN0LjYuY2hhcmFjdGVycyIsCisgICAgICAgICAgICAgICAgIkxhIHBhc3N3b3JkIFx1MDBFOCB0cm9wcG8gY29ydGEgLSBkZXZlIGNvbnRlbmVyZSBhbG1lbm8gNiBjYXJhdHRlcmkifSwKKyAgICAgICAgeyJUb28ubWFueS5mYWlsdXJlcy5LZXkuZW50cnkubm90LmNsb25lZCIsCisgICAgICAgICAgICAgICAgIk51bWVybyBlY2Nlc3Npdm8gZGkgZXJyb3JpLiBJbCB2YWxvcmUgZGVsbGEgY2hpYXZlIG5vbiBcdTAwRTggc3RhdG8gY29waWF0by4ifSwKKyAgICAgICAgeyJrZXkucGFzc3dvcmQuZm9yLmFsaWFzLiIsICJwYXNzd29yZCBkZWxsYSBjaGlhdmUgcGVyIDx7MH0+In0sCisgICAgICAgIHsiS2V5c3RvcmUuZW50cnkuZm9yLmlkLmdldE5hbWUuYWxyZWFkeS5leGlzdHMiLAorICAgICAgICAgICAgICAgICJMYSB2b2NlIGRlbCBrZXlzdG9yZSBwZXIgPHswfT4gZXNpc3RlIGdpXHUwMEUwIn0sCisgICAgICAgIHsiQ3JlYXRpbmcua2V5c3RvcmUuZW50cnkuZm9yLmlkLmdldE5hbWUuIiwKKyAgICAgICAgICAgICAgICAiQ3JlYXppb25lIGRlbGxhIHZvY2UgZGVsIGtleXN0b3JlIHBlciA8ezB9PiBpbiBjb3Jzby4uLiJ9LAorICAgICAgICB7Ik5vLmVudHJpZXMuZnJvbS5pZGVudGl0eS5kYXRhYmFzZS5hZGRlZCIsCisgICAgICAgICAgICAgICAgIk5lc3N1bmEgdm9jZSBhZ2dpdW50YSBkYWwgZGF0YWJhc2UgZGVsbGUgaWRlbnRpdFx1MDBFMCJ9LAorICAgICAgICB7IkFsaWFzLm5hbWUuYWxpYXMiLCAiTm9tZSBhbGlhczogezB9In0sCisgICAgICAgIHsiQ3JlYXRpb24uZGF0ZS5rZXlTdG9yZS5nZXRDcmVhdGlvbkRhdGUuYWxpYXMuIiwKKyAgICAgICAgICAgICAgICAiRGF0YSBkaSBjcmVhemlvbmU6IHswLGRhdGV9In0sCisgICAgICAgIHsiYWxpYXMua2V5U3RvcmUuZ2V0Q3JlYXRpb25EYXRlLmFsaWFzLiIsCisgICAgICAgICAgICAgICAgInswfSwgezEsZGF0ZX0sICJ9LAorICAgICAgICB7ImFsaWFzLiIsICJ7MH0sICJ9LAorICAgICAgICB7IkVudHJ5LnR5cGUudHlwZS4iLCAiVGlwbyBkaSB2b2NlOiB7MH0ifSwKKyAgICAgICAgeyJDZXJ0aWZpY2F0ZS5jaGFpbi5sZW5ndGguIiwgIkx1bmdoZXp6YSBjYXRlbmEgY2VydGlmaWNhdGk6ICJ9LAorICAgICAgICB7IkNlcnRpZmljYXRlLmkuMS4iLCAiQ2VydGlmaWNhdG9bezAsbnVtYmVyLGludGVnZXJ9XToifSwKKyAgICAgICAgeyJDZXJ0aWZpY2F0ZS5maW5nZXJwcmludC5TSEExLiIsICJJbXByb250YSBkaWdpdGFsZSBjZXJ0aWZpY2F0byAoU0hBMSk6ICJ9LAorICAgICAgICB7IktleXN0b3JlLnR5cGUuIiwgIlRpcG8ga2V5c3RvcmU6ICJ9LAorICAgICAgICB7IktleXN0b3JlLnByb3ZpZGVyLiIsICJQcm92aWRlciBrZXlzdG9yZTogIn0sCisgICAgICAgIHsiWW91ci5rZXlzdG9yZS5jb250YWlucy5rZXlTdG9yZS5zaXplLmVudHJ5IiwKKyAgICAgICAgICAgICAgICAiSWwga2V5c3RvcmUgY29udGllbmUgezAsbnVtYmVyLGludGVnZXJ9IHZvY2UifSwKKyAgICAgICAgeyJZb3VyLmtleXN0b3JlLmNvbnRhaW5zLmtleVN0b3JlLnNpemUuZW50cmllcyIsCisgICAgICAgICAgICAgICAgIklsIGtleXN0b3JlIGNvbnRpZW5lIHswLG51bWJlcixpbnRlZ2VyfSB2b2NpIn0sCisgICAgICAgIHsiRmFpbGVkLnRvLnBhcnNlLmlucHV0IiwgIkltcG9zc2liaWxlIGFuYWxpenphcmUgbCdpbnB1dCJ9LAorICAgICAgICB7IkVtcHR5LmlucHV0IiwgIklucHV0IHZ1b3RvIn0sCisgICAgICAgIHsiTm90LlguNTA5LmNlcnRpZmljYXRlIiwgIklsIGNlcnRpZmljYXRvIG5vbiBcdTAwRTggWC41MDkifSwKKyAgICAgICAgeyJhbGlhcy5oYXMubm8ucHVibGljLmtleSIsICJ7MH0gbm9uIGRpc3BvbmUgZGkgY2hpYXZlIHB1YmJsaWNhIn0sCisgICAgICAgIHsiYWxpYXMuaGFzLm5vLlguNTA5LmNlcnRpZmljYXRlIiwgInswfSBub24gZGlzcG9uZSBkaSBjZXJ0aWZpY2F0byBYLjUwOSJ9LAorICAgICAgICB7Ik5ldy5jZXJ0aWZpY2F0ZS5zZWxmLnNpZ25lZC4iLCAiTnVvdm8gY2VydGlmaWNhdG8gKGF1dG9maXJtYXRvKToifSwKKyAgICAgICAgeyJSZXBseS5oYXMubm8uY2VydGlmaWNhdGVzIiwgIkxhIHJpc3Bvc3RhIG5vbiBkaXNwb25lIGRpIGNlcnRpZmljYXRpIn0sCisgICAgICAgIHsiQ2VydGlmaWNhdGUubm90LmltcG9ydGVkLmFsaWFzLmFsaWFzLmFscmVhZHkuZXhpc3RzIiwKKyAgICAgICAgICAgICAgICAiSW1wb3NzaWJpbGUgaW1wb3J0YXJlIGlsIGNlcnRpZmljYXRvLCBsJydhbGlhcyA8ezB9PiBcdTAwRTggZ2lcdTAwRTAgZXNpc3RlbnRlIn0sCisgICAgICAgIHsiSW5wdXQubm90LmFuLlguNTA5LmNlcnRpZmljYXRlIiwgIkwnaW5wdXQgbm9uIFx1MDBFOCB1biBjZXJ0aWZpY2F0byBYLjUwOSJ9LAorICAgICAgICB7IkNlcnRpZmljYXRlLmFscmVhZHkuZXhpc3RzLmluLmtleXN0b3JlLnVuZGVyLmFsaWFzLnRydXN0YWxpYXMuIiwKKyAgICAgICAgICAgICAgICAiSWwgY2VydGlmaWNhdG8gZXNpc3RlIGdpXHUwMEUwIG5lbCBrZXlzdG9yZSBjb24gYWxpYXMgPHswfT4ifSwKKyAgICAgICAgeyJEby55b3Uuc3RpbGwud2FudC50by5hZGQuaXQubm8uIiwKKyAgICAgICAgICAgICAgICAiQWdnaXVuZ2VybG8gdWd1YWxtZW50ZT8gW25vXTogICJ9LAorICAgICAgICB7IkNlcnRpZmljYXRlLmFscmVhZHkuZXhpc3RzLmluLnN5c3RlbS53aWRlLkNBLmtleXN0b3JlLnVuZGVyLmFsaWFzLnRydXN0YWxpYXMuIiwKKyAgICAgICAgICAgICAgICAiSWwgY2VydGlmaWNhdG8gZXNpc3RlIGdpXHUwMEUwIG5lbCBrZXlzdG9yZSBDQSBjb24gYWxpYXMgPHswfT4ifSwKKyAgICAgICAgeyJEby55b3Uuc3RpbGwud2FudC50by5hZGQuaXQudG8ueW91ci5vd24ua2V5c3RvcmUubm8uIiwKKyAgICAgICAgICAgICAgICAiQWdnaXVuZ2VybG8gYWwgcHJvcHJpbyBrZXlzdG9yZT8gW25vXTogICJ9LAorICAgICAgICB7IlRydXN0LnRoaXMuY2VydGlmaWNhdGUubm8uIiwgIkNvbnNpZGVyYXJlIHNpY3VybyBxdWVzdG8gY2VydGlmaWNhdG8/IFtub106ICAifSwKKyAgICAgICAgeyJZRVMiLCAiU1x1MDBFQyJ9LAorICAgICAgICB7Ik5ldy5wcm9tcHQuIiwgIk51b3ZhIHswfTogIn0sCisgICAgICAgIHsiUGFzc3dvcmRzLm11c3QuZGlmZmVyIiwgIkxlIHBhc3N3b3JkIG5vbiBkZXZvbm8gY29pbmNpZGVyZSJ9LAorICAgICAgICB7IlJlLmVudGVyLm5ldy5wcm9tcHQuIiwgIlJlaW1tZXR0ZXJlIHVuIG51b3ZvIHZhbG9yZSBwZXIgezB9OiAifSwKKyAgICAgICAgeyJSZS5lbnRlci5uZXcucGFzc3dvcmQuIiwgIkltbWV0dGVyZSBudW92YW1lbnRlIGxhIG51b3ZhIHBhc3N3b3JkOiAifSwKKyAgICAgICAgeyJUaGV5LmRvbi50Lm1hdGNoLlRyeS5hZ2FpbiIsICJOb24gY29ycmlzcG9uZG9uby4gUmlwcm92YXJlLiJ9LAorICAgICAgICB7IkVudGVyLnByb21wdC5hbGlhcy5uYW1lLiIsICJJbW1ldHRlcmUgbm9tZSBhbGlhcyB7MH06ICAifSwKKyAgICAgICAgeyJFbnRlci5uZXcuYWxpYXMubmFtZS5SRVRVUk4udG8uY2FuY2VsLmltcG9ydC5mb3IudGhpcy5lbnRyeS4iLAorICAgICAgICAgICAgICAgICAiSW1tZXR0ZXJlIHVuIG51b3ZvIG5vbWUgYWxpYXNcdChwcmVtZXJlIElOVklPIHBlciBhbm51bGxhcmUgbCdpbXBvcnRhemlvbmUgZGVsbGEgdm9jZSk6ICAifSwKKyAgICAgICAgeyJFbnRlci5hbGlhcy5uYW1lLiIsICJJbW1ldHRlcmUgbm9tZSBhbGlhczogICJ9LAorICAgICAgICB7Ii5SRVRVUk4uaWYuc2FtZS5hcy5mb3Iub3RoZXJBbGlhcy4iLAorICAgICAgICAgICAgICAgICJcdChJTlZJTyBzZSBjb3JyaXNwb25kZSBhbCBub21lIGRpIDx7MH0+In0sCisgICAgICAgIHsiLlBBVFRFUk4ucHJpbnRYNTA5Q2VydCIsCisgICAgICAgICAgICAgICAgIlByb3ByaWV0YXJpbzogezB9XG5BdXRvcml0XHUwMEUwIGVtaXR0ZW50ZTogezF9XG5OdW1lcm8gZGkgc2VyaWU6IHsyfVxuVmFsaWRvIGRhOiB7M30gYTogezR9XG5JbXByb250ZSBkaWdpdGFsaSBjZXJ0aWZpY2F0bzpcblx0IE1ENTogIHs1fVxuXHQgU0hBMTogezZ9XG5cdCBTSEEyNTY6IHs3fVxuXHQgTm9tZSBhbGdvcml0bW8gZmlybWE6IHs4fVxuXHQgVmVyc2lvbmU6IHs5fSJ9LAorICAgICAgICB7IldoYXQuaXMueW91ci5maXJzdC5hbmQubGFzdC5uYW1lLiIsCisgICAgICAgICAgICAgICAgIlNwZWNpZmljYXJlIG5vbWUgZSBjb2dub21lIn0sCisgICAgICAgIHsiV2hhdC5pcy50aGUubmFtZS5vZi55b3VyLm9yZ2FuaXphdGlvbmFsLnVuaXQuIiwKKyAgICAgICAgICAgICAgICAiU3BlY2lmaWNhcmUgaWwgbm9tZSBkZWxsJ3VuaXRcdTAwRTAgb3JnYW5penphdGl2YSJ9LAorICAgICAgICB7IldoYXQuaXMudGhlLm5hbWUub2YueW91ci5vcmdhbml6YXRpb24uIiwKKyAgICAgICAgICAgICAgICAiU3BlY2lmaWNhcmUgaWwgbm9tZSBkZWxsJ29yZ2FuaXp6YXppb25lIn0sCisgICAgICAgIHsiV2hhdC5pcy50aGUubmFtZS5vZi55b3VyLkNpdHkub3IuTG9jYWxpdHkuIiwKKyAgICAgICAgICAgICAgICAiU3BlY2lmaWNhcmUgbGEgbG9jYWxpdFx1MDBFMCJ9LAorICAgICAgICB7IldoYXQuaXMudGhlLm5hbWUub2YueW91ci5TdGF0ZS5vci5Qcm92aW5jZS4iLAorICAgICAgICAgICAgICAgICJTcGVjaWZpY2FyZSBsYSBwcm92aW5jaWEifSwKKyAgICAgICAgeyJXaGF0LmlzLnRoZS50d28ubGV0dGVyLmNvdW50cnkuY29kZS5mb3IudGhpcy51bml0LiIsCisgICAgICAgICAgICAgICAgIlNwZWNpZmljYXJlIGlsIGNvZGljZSBhIGR1ZSBsZXR0ZXJlIGRlbCBwYWVzZSBpbiBjdWkgc2kgdHJvdmEgbCd1bml0XHUwMEUwIn0sCisgICAgICAgIHsiSXMubmFtZS5jb3JyZWN0LiIsICJJbCBkYXRvIHswfSBcdTAwRTggY29ycmV0dG8/In0sCisgICAgICAgIHsibm8iLCAibm8ifSwKKyAgICAgICAgeyJ5ZXMiLCAic1x1MDBFQyJ9LAorICAgICAgICB7InkiLCAicyJ9LAorICAgICAgICB7Ii5kZWZhdWx0VmFsdWUuIiwgIiAgW3swfV06ICAifSwKKyAgICAgICAgeyJBbGlhcy5hbGlhcy5oYXMubm8ua2V5IiwKKyAgICAgICAgICAgICAgICAiQWxsJydhbGlhcyA8ezB9PiBub24gXHUwMEU4IGFzc29jaWF0YSBhbGN1bmEgY2hpYXZlIn0sCisgICAgICAgIHsiQWxpYXMuYWxpYXMucmVmZXJlbmNlcy5hbi5lbnRyeS50eXBlLnRoYXQuaXMubm90LmEucHJpdmF0ZS5rZXkuZW50cnkuVGhlLmtleWNsb25lLmNvbW1hbmQub25seS5zdXBwb3J0cy5jbG9uaW5nLm9mLnByaXZhdGUua2V5IiwKKyAgICAgICAgICAgICAgICAgIkwnJ2FsaWFzIDx7MH0+IGZhIHJpZmVyaW1lbnRvIGEgdW4gdGlwbyBkaSB2b2NlIGNoZSBub24gXHUwMEU4IHVuYSB2b2NlIGRpIGNoaWF2ZSBwcml2YXRhLiBJbCBjb21hbmRvIC1rZXljbG9uZSBzdXBwb3J0YSBzb2xvIGxhIGNvcGlhIGRlbGxlIHZvY2kgZGkgY2hpYXZlIHByaXZhdGUuIn0sCisKKyAgICAgICAgeyIuV0FSTklORy5XQVJOSU5HLldBUk5JTkcuIiwKKyAgICAgICAgICAgICIqKioqKioqKioqKioqKioqKiAgQXZ2ZXJ0ZW56YSBBdnZlcnRlbnphIEF2dmVydGVuemEgICoqKioqKioqKioqKioqKioqIn0sCisgICAgICAgIHsiU2lnbmVyLmQuIiwgIkZpcm1hdGFyaW8gIyVkOiJ9LAorICAgICAgICB7IlRpbWVzdGFtcC4iLCAiSW5kaWNhdG9yZSBvcmFyaW86In0sCisgICAgICAgIHsiU2lnbmF0dXJlLiIsICJGaXJtYToifSwKKyAgICAgICAgeyJDUkxzLiIsICJDUkw6In0sCisgICAgICAgIHsiQ2VydGlmaWNhdGUub3duZXIuIiwgIlByb3ByaWV0YXJpbyBjZXJ0aWZpY2F0bzogIn0sCisgICAgICAgIHsiTm90LmEuc2lnbmVkLmphci5maWxlIiwgIk5vbiBcdTAwRTggdW4gZmlsZSBqYXIgZmlybWF0byJ9LAorICAgICAgICB7Ik5vLmNlcnRpZmljYXRlLmZyb20udGhlLlNTTC5zZXJ2ZXIiLAorICAgICAgICAgICAgICAgICJOZXNzdW4gY2VydGlmaWNhdG8gZGFsIHNlcnZlciBTU0wifSwKKworICAgICAgICB7Ii5UaGUuaW50ZWdyaXR5Lm9mLnRoZS5pbmZvcm1hdGlvbi5zdG9yZWQuaW4ueW91ci5rZXlzdG9yZS4iLAorICAgICAgICAgICAgIiogTCdpbnRlZ3JpdFx1MDBFMCBkZWxsZSBpbmZvcm1hemlvbmkgbWVtb3JpenphdGUgbmVsIGtleXN0b3JlICpcbiogTk9OIFx1MDBFOCBzdGF0YSB2ZXJpZmljYXRhLiBQZXIgdmVyaWZpY2FybmUgbCdpbnRlZ3JpdFx1MDBFMCAqXG4qIFx1MDBFOCBuZWNlc3NhcmlvIGZvcm5pcmUgbGEgcGFzc3dvcmQgZGVsIGtleXN0b3JlLiAgICAgICAgICAgICAgICAgICoifSwKKyAgICAgICAgeyIuVGhlLmludGVncml0eS5vZi50aGUuaW5mb3JtYXRpb24uc3RvcmVkLmluLnRoZS5zcmNrZXlzdG9yZS4iLAorICAgICAgICAgICAgIiogTCdpbnRlZ3JpdFx1MDBFMCBkZWxsZSBpbmZvcm1hemlvbmkgbWVtb3JpenphdGUgbmVsIHNyY2tleXN0b3JlICpcbiogTk9OIFx1MDBFOCBzdGF0YSB2ZXJpZmljYXRhLiBQZXIgdmVyaWZpY2FybmUgbCdpbnRlZ3JpdFx1MDBFMCAqXG4qIFx1MDBFOCBuZWNlc3NhcmlvIGZvcm5pcmUgbGEgcGFzc3dvcmQgZGVsIHNyY2tleXN0b3JlLiAgICAgICAgICAgICAgICAgICoifSwKKworICAgICAgICB7IkNlcnRpZmljYXRlLnJlcGx5LmRvZXMubm90LmNvbnRhaW4ucHVibGljLmtleS5mb3IuYWxpYXMuIiwKKyAgICAgICAgICAgICAgICAiTGEgcmlzcG9zdGEgZGVsIGNlcnRpZmljYXRvIG5vbiBjb250aWVuZSBsYSBjaGlhdmUgcHViYmxpY2EgcGVyIDx7MH0+In0sCisgICAgICAgIHsiSW5jb21wbGV0ZS5jZXJ0aWZpY2F0ZS5jaGFpbi5pbi5yZXBseSIsCisgICAgICAgICAgICAgICAgIkNhdGVuYSBkZWkgY2VydGlmaWNhdGkgaW5jb21wbGV0YSBuZWxsYSByaXNwb3N0YSJ9LAorICAgICAgICB7IkNlcnRpZmljYXRlLmNoYWluLmluLnJlcGx5LmRvZXMubm90LnZlcmlmeS4iLAorICAgICAgICAgICAgICAgICJMYSBjYXRlbmEgZGVpIGNlcnRpZmljYXRpIG5lbGxhIHJpc3Bvc3RhIG5vbiB2ZXJpZmljYTogIn0sCisgICAgICAgIHsiVG9wLmxldmVsLmNlcnRpZmljYXRlLmluLnJlcGx5LiIsCisgICAgICAgICAgICAgICAgIkNlcnRpZmljYXRvIGRpIHByaW1vIGxpdmVsbG8gbmVsbGEgcmlzcG9zdGE6XG4ifSwKKyAgICAgICAgeyIuaXMubm90LnRydXN0ZWQuIiwgIi4uLm5vbiBcdTAwRTggY29uc2lkZXJhdG8gc2ljdXJvLiAifSwKKyAgICAgICAgeyJJbnN0YWxsLnJlcGx5LmFueXdheS5uby4iLCAiSW5zdGFsbGFyZSBsYSByaXNwb3N0YT8gW25vXTogICJ9LAorICAgICAgICB7Ik5PIiwgIk5vIn0sCisgICAgICAgIHsiUHVibGljLmtleXMuaW4ucmVwbHkuYW5kLmtleXN0b3JlLmRvbi50Lm1hdGNoIiwKKyAgICAgICAgICAgICAgICAiTGUgY2hpYXZpIHB1YmJsaWNoZSBuZWxsYSByaXNwb3N0YSBlIG5lbCBrZXlzdG9yZSBub24gY29ycmlzcG9uZG9ubyJ9LAorICAgICAgICB7IkNlcnRpZmljYXRlLnJlcGx5LmFuZC5jZXJ0aWZpY2F0ZS5pbi5rZXlzdG9yZS5hcmUuaWRlbnRpY2FsIiwKKyAgICAgICAgICAgICAgICAiTGEgcmlzcG9zdGEgZGVsIGNlcnRpZmljYXRvIGUgaWwgY2VydGlmaWNhdG8gbmVsIGtleXN0b3JlIHNvbm8gaWRlbnRpY2kifSwKKyAgICAgICAgeyJGYWlsZWQudG8uZXN0YWJsaXNoLmNoYWluLmZyb20ucmVwbHkiLAorICAgICAgICAgICAgICAgICJJbXBvc3NpYmlsZSBzdGFiaWxpcmUgbGEgY2F0ZW5hIGRhbGxhIHJpc3Bvc3RhIn0sCisgICAgICAgIHsibiIsICJuIn0sCisgICAgICAgIHsiV3JvbmcuYW5zd2VyLnRyeS5hZ2FpbiIsICJSaXNwb3N0YSBlcnJhdGEsIHJpcHJvdmFyZSJ9LAorICAgICAgICB7IlNlY3JldC5rZXkubm90LmdlbmVyYXRlZC5hbGlhcy5hbGlhcy5hbHJlYWR5LmV4aXN0cyIsCisgICAgICAgICAgICAgICAgIkxhIGNoaWF2ZSBzZWdyZXRhIG5vbiBcdTAwRTggc3RhdGEgZ2VuZXJhdGE7IGwnJ2FsaWFzIDx7MH0+IGVzaXN0ZSBnaVx1MDBFMCJ9LAorICAgICAgICB7IlBsZWFzZS5wcm92aWRlLmtleXNpemUuZm9yLnNlY3JldC5rZXkuZ2VuZXJhdGlvbiIsCisgICAgICAgICAgICAgICAgIlNwZWNpZmljYXJlIGlsIHZhbG9yZSAta2V5c2l6ZSBwZXIgbGEgZ2VuZXJhemlvbmUgZGVsbGEgY2hpYXZlIHNlZ3JldGEifSwKKworICAgICAgICB7IkV4dGVuc2lvbnMuIiwgIkVzdGVuc2lvbmk6ICJ9LAorICAgICAgICB7Ii5FbXB0eS52YWx1ZS4iLCAiKHZhbG9yZSB2dW90bykifSwKKyAgICAgICAgeyJFeHRlbnNpb24uUmVxdWVzdC4iLCAiUmljaGllc3RhIGRpIGVzdGVuc2lvbmU6In0sCisgICAgICAgIHsiUEtDUy4xMC5DZXJ0aWZpY2F0ZS5SZXF1ZXN0LlZlcnNpb24uMS4wLlN1YmplY3Qucy5QdWJsaWMuS2V5LnMuZm9ybWF0LnMua2V5LiIsCisgICAgICAgICAgICAgICAgIlJpY2hpZXN0YSBkaSBjZXJ0aWZpY2F0byBQS0NTICMxMCAodmVyc2lvbmUgMS4wKVxuT2dnZXR0bzogJXNcbkNoaWF2ZSBwdWJibGljYTogJXMgZm9ybWF0byAlcyBjaGlhdmVcbiJ9LAorICAgICAgICB7IlVua25vd24ua2V5VXNhZ2UudHlwZS4iLCAiVGlwbyBrZXlVc2FnZSBzY29ub3NjaXV0bzogIn0sCisgICAgICAgIHsiVW5rbm93bi5leHRlbmRlZGtleVVzYWdlLnR5cGUuIiwgIlRpcG8gZXh0ZW5kZWRrZXlVc2FnZSBzY29ub3NjaXV0bzogIn0sCisgICAgICAgIHsiVW5rbm93bi5BY2Nlc3NEZXNjcmlwdGlvbi50eXBlLiIsICJUaXBvIEFjY2Vzc0Rlc2NyaXB0aW9uIHNjb25vc2NpdXRvOiAifSwKKyAgICAgICAgeyJVbnJlY29nbml6ZWQuR2VuZXJhbE5hbWUudHlwZS4iLCAiVGlwbyBHZW5lcmFsTmFtZSBub24gcmljb25vc2NpdXRvOiAifSwKKyAgICAgICAgeyJUaGlzLmV4dGVuc2lvbi5jYW5ub3QuYmUubWFya2VkLmFzLmNyaXRpY2FsLiIsCisgICAgICAgICAgICAgICAgICJJbXBvc3NpYmlsZSBjb250cmFzc2VnbmFyZSBxdWVzdGEgZXN0ZW5zaW9uZSBjb21lIGNyaXRpY2EuICJ9LAorICAgICAgICB7Ik9kZC5udW1iZXIub2YuaGV4LmRpZ2l0cy5mb3VuZC4iLCAiXHUwMEM4IHN0YXRvIHRyb3ZhdG8gdW4gbnVtZXJvIGRpc3BhcmkgZGkgY2lmcmUgZXNhZGVjaW1hbGk6ICJ9LAorICAgICAgICB7IlVua25vd24uZXh0ZW5zaW9uLnR5cGUuIiwgIlRpcG8gZGkgZXN0ZW5zaW9uZSBzY29ub3NjaXV0bzogIn0sCisgICAgICAgIHsiY29tbWFuZC57MH0uaXMuYW1iaWd1b3VzLiIsICJpbCBjb21hbmRvIHswfSBcdTAwRTggYW1iaWd1bzoifQorICAgIH07CisKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGNvbnRlbnRzIG9mIHRoaXMgPGNvZGU+UmVzb3VyY2VCdW5kbGU8L2NvZGU+LgorICAgICAqCisgICAgICogPHA+CisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBjb250ZW50cyBvZiB0aGlzIDxjb2RlPlJlc291cmNlQnVuZGxlPC9jb2RlPi4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0W11bXSBnZXRDb250ZW50cygpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRlbnRzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdG9vbHMva2V5dG9vbC9SZXNvdXJjZXNfamEuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdG9vbHMva2V5dG9vbC9SZXNvdXJjZXNfamEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjZlNmJlCi0tLSAvZGV2L251bGwKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS90b29scy9rZXl0b29sL1Jlc291cmNlc19qYS5qYXZhCkBAIC0wLDAgKzEsNDMxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBPcmFjbGUgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKKyAqIHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIHN1bi5zZWN1cml0eS50b29scy5rZXl0b29sOworCisvKioKKyAqIDxwPiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIDxjb2RlPlJlc291cmNlQnVuZGxlPC9jb2RlPgorICogZm9yIHRoZSBrZXl0b29sLgorICoKKyAqLworcHVibGljIGNsYXNzIFJlc291cmNlc19qYSBleHRlbmRzIGphdmEudXRpbC5MaXN0UmVzb3VyY2VCdW5kbGUgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W11bXSBjb250ZW50cyA9IHsKKyAgICAgICAgeyJORVdMSU5FIiwgIlxuIn0sCisgICAgICAgIHsiU1RBUiIsCisgICAgICAgICAgICAgICAgIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioifSwKKyAgICAgICAgeyJTVEFSTk4iLAorICAgICAgICAgICAgICAgICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cbiJ9LAorCisgICAgICAgIC8vIGtleXRvb2w6IEhlbHAgcGFydAorLy8gIk9wdGlvbiIgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCisgICAgICAgIHsiLk9QVElPTi4iLCAiIFtcdTMwQUFcdTMwRDdcdTMwQjdcdTMwRTdcdTMwRjNdLi4uIn0sCisgICAgICAgIHsiT3B0aW9ucy4iLCAiXHUzMEFBXHUzMEQ3XHUzMEI3XHUzMEU3XHUzMEYzOiJ9LAorICAgICAgICB7IlVzZS5rZXl0b29sLmhlbHAuZm9yLmFsbC5hdmFpbGFibGUuY29tbWFuZHMiLAorICAgICAgICAgICAgICAgICAiXHU0RjdGXHU3NTI4XHU1M0VGXHU4MEZEXHUzMDZBXHUzMDU5XHUzMDc5XHUzMDY2XHUzMDZFXHUzMEIzXHUzMERFXHUzMEYzXHUzMEM5XHUzMDZCXHUzMDY0XHUzMDQ0XHUzMDY2XHUzMDZGXCJrZXl0b29sIC1oZWxwXCJcdTMwOTJcdTRGN0ZcdTc1MjhcdTMwNTdcdTMwNjZcdTMwNEZcdTMwNjBcdTMwNTVcdTMwNDQifSwKKyAgICAgICAgeyJLZXkuYW5kLkNlcnRpZmljYXRlLk1hbmFnZW1lbnQuVG9vbCIsCisgICAgICAgICAgICAgICAgICJcdTMwQURcdTMwRkNcdTMwNEFcdTMwODhcdTMwNzNcdThBM0NcdTY2MEVcdTY2RjhcdTdCQTFcdTc0MDZcdTMwQzRcdTMwRkNcdTMwRUIifSwKKyAgICAgICAgeyJDb21tYW5kcy4iLCAiXHUzMEIzXHUzMERFXHUzMEYzXHUzMEM5OiJ9LAorICAgICAgICB7IlVzZS5rZXl0b29sLmNvbW1hbmQubmFtZS5oZWxwLmZvci51c2FnZS5vZi5jb21tYW5kLm5hbWUiLAorICAgICAgICAgICAgICAgICJjb21tYW5kX25hbWVcdTMwNkVcdTRGN0ZcdTc1MjhcdTY1QjlcdTZDRDVcdTMwNkJcdTMwNjRcdTMwNDRcdTMwNjZcdTMwNkZcImtleXRvb2wgLWNvbW1hbmRfbmFtZSAtaGVscFwiXHUzMDkyXHU0RjdGXHU3NTI4XHUzMDU3XHUzMDY2XHUzMDRGXHUzMDYwXHUzMDU1XHUzMDQ0In0sCisgICAgICAgIC8vIGtleXRvb2w6IGhlbHA6IGNvbW1hbmRzCisgICAgICAgIHsiR2VuZXJhdGVzLmEuY2VydGlmaWNhdGUucmVxdWVzdCIsCisgICAgICAgICAgICAgICAgIlx1OEEzQ1x1NjYwRVx1NjZGOFx1MzBFQVx1MzBBRlx1MzBBOFx1MzBCOVx1MzBDOFx1MzA5Mlx1NzUxRlx1NjIxMFx1MzA1N1x1MzA3RVx1MzA1OSJ9LCAvLy1jZXJ0cmVxCisgICAgICAgIHsiQ2hhbmdlcy5hbi5lbnRyeS5zLmFsaWFzIiwKKyAgICAgICAgICAgICAgICAiXHUzMEE4XHUzMEYzXHUzMEM4XHUzMEVBXHUzMDZFXHU1MjI1XHU1NDBEXHUzMDkyXHU1OTA5XHU2NkY0XHUzMDU3XHUzMDdFXHUzMDU5In0sIC8vLWNoYW5nZWFsaWFzCisgICAgICAgIHsiRGVsZXRlcy5hbi5lbnRyeSIsCisgICAgICAgICAgICAgICAgIlx1MzBBOFx1MzBGM1x1MzBDOFx1MzBFQVx1MzA5Mlx1NTI0QVx1OTY2NFx1MzA1N1x1MzA3RVx1MzA1OSJ9LCAvLy1kZWxldGUKKyAgICAgICAgeyJFeHBvcnRzLmNlcnRpZmljYXRlIiwKKyAgICAgICAgICAgICAgICAiXHU4QTNDXHU2NjBFXHU2NkY4XHUzMDkyXHUzMEE4XHUzMEFGXHUzMEI5XHUzMEREXHUzMEZDXHUzMEM4XHUzMDU3XHUzMDdFXHUzMDU5In0sIC8vLWV4cG9ydGNlcnQKKyAgICAgICAgeyJHZW5lcmF0ZXMuYS5rZXkucGFpciIsCisgICAgICAgICAgICAgICAgIlx1OTM3NVx1MzBEQVx1MzBBMlx1MzA5Mlx1NzUxRlx1NjIxMFx1MzA1N1x1MzA3RVx1MzA1OSJ9LCAvLy1nZW5rZXlwYWlyCisvLyB0cmFuc2xhdGlvbiBvZiAic2VjcmV0IiBrZXkgc2hvdWxkIGJlIGRpZmZlcmVudCB0byAicHJpdmF0ZSIga2V5LgorICAgICAgICB7IkdlbmVyYXRlcy5hLnNlY3JldC5rZXkiLAorICAgICAgICAgICAgICAgICJcdTc5RDhcdTVCQzZcdTkzNzVcdTMwOTJcdTc1MUZcdTYyMTBcdTMwNTdcdTMwN0VcdTMwNTkifSwgLy8tZ2Vuc2Vja2V5CisgICAgICAgIHsiR2VuZXJhdGVzLmNlcnRpZmljYXRlLmZyb20uYS5jZXJ0aWZpY2F0ZS5yZXF1ZXN0IiwKKyAgICAgICAgICAgICAgICAiXHU4QTNDXHU2NjBFXHU2NkY4XHUzMEVBXHUzMEFGXHUzMEE4XHUzMEI5XHUzMEM4XHUzMDRCXHUzMDg5XHU4QTNDXHU2NjBFXHU2NkY4XHUzMDkyXHU3NTFGXHU2MjEwXHUzMDU3XHUzMDdFXHUzMDU5In0sIC8vLWdlbmNlcnQKKyAgICAgICAgeyJHZW5lcmF0ZXMuQ1JMIiwgIkNSTFx1MzA5Mlx1NzUxRlx1NjIxMFx1MzA1N1x1MzA3RVx1MzA1OSJ9LCAvLy1nZW5jcmwKKyAgICAgICAgeyJJbXBvcnRzLmVudHJpZXMuZnJvbS5hLkpESy4xLjEueC5zdHlsZS5pZGVudGl0eS5kYXRhYmFzZSIsCisgICAgICAgICAgICAgICAgIkpESyAxLjEueC1zdHlsZVx1MzBBMlx1MzBBNFx1MzBDN1x1MzBGM1x1MzBDNlx1MzBBM1x1MzBDNlx1MzBBM1x1MzBGQlx1MzBDN1x1MzBGQ1x1MzBCRlx1MzBEOVx1MzBGQ1x1MzBCOVx1MzA0Qlx1MzA4OVx1MzBBOFx1MzBGM1x1MzBDOFx1MzBFQVx1MzA5Mlx1MzBBNFx1MzBGM1x1MzBERFx1MzBGQ1x1MzBDOFx1MzA1N1x1MzA3RVx1MzA1OSJ9LCAvLy1pZGVudGl0eWRiCisgICAgICAgIHsiSW1wb3J0cy5hLmNlcnRpZmljYXRlLm9yLmEuY2VydGlmaWNhdGUuY2hhaW4iLAorICAgICAgICAgICAgICAgICJcdThBM0NcdTY2MEVcdTY2RjhcdTMwN0VcdTMwNUZcdTMwNkZcdThBM0NcdTY2MEVcdTY2RjhcdTMwQzFcdTMwQTdcdTMwRkNcdTMwRjNcdTMwOTJcdTMwQTRcdTMwRjNcdTMwRERcdTMwRkNcdTMwQzhcdTMwNTdcdTMwN0VcdTMwNTkifSwgLy8taW1wb3J0Y2VydAorICAgICAgICB7IkltcG9ydHMub25lLm9yLmFsbC5lbnRyaWVzLmZyb20uYW5vdGhlci5rZXlzdG9yZSIsCisgICAgICAgICAgICAgICAgIlx1NTIyNVx1MzA2RVx1MzBBRFx1MzBGQ1x1MzBCOVx1MzBDOFx1MzBBMlx1MzA0Qlx1MzA4OTFcdTMwNjRcdTMwN0VcdTMwNUZcdTMwNkZcdTMwNTlcdTMwNzlcdTMwNjZcdTMwNkVcdTMwQThcdTMwRjNcdTMwQzhcdTMwRUFcdTMwOTJcdTMwQTRcdTMwRjNcdTMwRERcdTMwRkNcdTMwQzhcdTMwNTdcdTMwN0VcdTMwNTkifSwgLy8taW1wb3J0a2V5c3RvcmUKKyAgICAgICAgeyJDbG9uZXMuYS5rZXkuZW50cnkiLAorICAgICAgICAgICAgICAgICJcdTkzNzVcdTMwQThcdTMwRjNcdTMwQzhcdTMwRUFcdTMwNkVcdTMwQUZcdTMwRURcdTMwRkNcdTMwRjNcdTMwOTJcdTRGNUNcdTYyMTBcdTMwNTdcdTMwN0VcdTMwNTkifSwgLy8ta2V5Y2xvbmUKKyAgICAgICAgeyJDaGFuZ2VzLnRoZS5rZXkucGFzc3dvcmQub2YuYW4uZW50cnkiLAorICAgICAgICAgICAgICAgICJcdTMwQThcdTMwRjNcdTMwQzhcdTMwRUFcdTMwNkVcdTkzNzVcdTMwRDFcdTMwQjlcdTMwRUZcdTMwRkNcdTMwQzlcdTMwOTJcdTU5MDlcdTY2RjRcdTMwNTdcdTMwN0VcdTMwNTkifSwgLy8ta2V5cGFzc3dkCisgICAgICAgIHsiTGlzdHMuZW50cmllcy5pbi5hLmtleXN0b3JlIiwKKyAgICAgICAgICAgICAgICAiXHUzMEFEXHUzMEZDXHUzMEI5XHUzMEM4XHUzMEEyXHU1MTg1XHUzMDZFXHUzMEE4XHUzMEYzXHUzMEM4XHUzMEVBXHUzMDkyXHUzMEVBXHUzMEI5XHUzMEM4XHUzMDU3XHUzMDdFXHUzMDU5In0sIC8vLWxpc3QKKyAgICAgICAgeyJQcmludHMudGhlLmNvbnRlbnQub2YuYS5jZXJ0aWZpY2F0ZSIsCisgICAgICAgICAgICAgICAgIlx1OEEzQ1x1NjYwRVx1NjZGOFx1MzA2RVx1NTE4NVx1NUJCOVx1MzA5Mlx1NTFGQVx1NTI5Qlx1MzA1N1x1MzA3RVx1MzA1OSJ9LCAvLy1wcmludGNlcnQKKyAgICAgICAgeyJQcmludHMudGhlLmNvbnRlbnQub2YuYS5jZXJ0aWZpY2F0ZS5yZXF1ZXN0IiwKKyAgICAgICAgICAgICAgICAiXHU4QTNDXHU2NjBFXHU2NkY4XHUzMEVBXHUzMEFGXHUzMEE4XHUzMEI5XHUzMEM4XHUzMDZFXHU1MTg1XHU1QkI5XHUzMDkyXHU1MUZBXHU1MjlCXHUzMDU3XHUzMDdFXHUzMDU5In0sIC8vLXByaW50Y2VydHJlcQorICAgICAgICB7IlByaW50cy50aGUuY29udGVudC5vZi5hLkNSTC5maWxlIiwKKyAgICAgICAgICAgICAgICAiQ1JMXHUzMEQ1XHUzMEExXHUzMEE0XHUzMEVCXHUzMDZFXHU1MTg1XHU1QkI5XHUzMDkyXHU1MUZBXHU1MjlCXHUzMDU3XHUzMDdFXHUzMDU5In0sIC8vLXByaW50Y3JsCisgICAgICAgIHsiR2VuZXJhdGVzLmEuc2VsZi5zaWduZWQuY2VydGlmaWNhdGUiLAorICAgICAgICAgICAgICAgICJcdTgxRUFcdTVERjFcdTdGNzJcdTU0MERcdTU3OEJcdThBM0NcdTY2MEVcdTY2RjhcdTMwOTJcdTc1MUZcdTYyMTBcdTMwNTdcdTMwN0VcdTMwNTkifSwgLy8tc2VsZmNlcnQKKyAgICAgICAgeyJDaGFuZ2VzLnRoZS5zdG9yZS5wYXNzd29yZC5vZi5hLmtleXN0b3JlIiwKKyAgICAgICAgICAgICAgICAiXHUzMEFEXHUzMEZDXHUzMEI5XHUzMEM4XHUzMEEyXHUzMDZFXHUzMEI5XHUzMEM4XHUzMEEyXHUzMEZCXHUzMEQxXHUzMEI5XHUzMEVGXHUzMEZDXHUzMEM5XHUzMDkyXHU1OTA5XHU2NkY0XHUzMDU3XHUzMDdFXHUzMDU5In0sIC8vLXN0b3JlcGFzc3dkCisgICAgICAgIC8vIGtleXRvb2w6IGhlbHA6IG9wdGlvbnMKKyAgICAgICAgeyJhbGlhcy5uYW1lLm9mLnRoZS5lbnRyeS50by5wcm9jZXNzIiwKKyAgICAgICAgICAgICAgICAiXHU1MUU2XHU3NDA2XHUzMDU5XHUzMDhCXHUzMEE4XHUzMEYzXHUzMEM4XHUzMEVBXHUzMDZFXHU1MjI1XHU1NDBEIn0sIC8vLWFsaWFzCisgICAgICAgIHsiZGVzdGluYXRpb24uYWxpYXMiLAorICAgICAgICAgICAgICAgICJcdTUxRkFcdTUyOUJcdTUxNDhcdTMwNkVcdTUyMjVcdTU0MEQifSwgLy8tZGVzdGFsaWFzCisgICAgICAgIHsiZGVzdGluYXRpb24ua2V5LnBhc3N3b3JkIiwKKyAgICAgICAgICAgICAgICAiXHU1MUZBXHU1MjlCXHU1MTQ4XHUzMEFEXHUzMEZDXHUzMDZFXHUzMEQxXHUzMEI5XHUzMEVGXHUzMEZDXHUzMEM5In0sIC8vLWRlc3RrZXlwYXNzCisgICAgICAgIHsiZGVzdGluYXRpb24ua2V5c3RvcmUubmFtZSIsCisgICAgICAgICAgICAgICAgIlx1NTFGQVx1NTI5Qlx1NTE0OFx1MzBBRFx1MzBGQ1x1MzBCOVx1MzBDOFx1MzBBMlx1NTQwRCJ9LCAvLy1kZXN0a2V5c3RvcmUKKyAgICAgICAgeyJkZXN0aW5hdGlvbi5rZXlzdG9yZS5wYXNzd29yZC5wcm90ZWN0ZWQiLAorICAgICAgICAgICAgICAgICJcdTUxRkFcdTUyOUJcdTUxNDhcdTMwQURcdTMwRkNcdTMwQjlcdTMwQzhcdTMwQTJcdTMwNkVcdTRGRERcdThCNzdcdTVCRkVcdThDNjFcdTMwRDFcdTMwQjlcdTMwRUZcdTMwRkNcdTMwQzkifSwgLy8tZGVzdHByb3RlY3RlZAorICAgICAgICB7ImRlc3RpbmF0aW9uLmtleXN0b3JlLnByb3ZpZGVyLm5hbWUiLAorICAgICAgICAgICAgICAgICJcdTUxRkFcdTUyOUJcdTUxNDhcdTMwQURcdTMwRkNcdTMwQjlcdTMwQzhcdTMwQTJcdTMwRkJcdTMwRDdcdTMwRURcdTMwRDBcdTMwQTRcdTMwQzBcdTU0MEQifSwgLy8tZGVzdHByb3ZpZGVybmFtZQorICAgICAgICB7ImRlc3RpbmF0aW9uLmtleXN0b3JlLnBhc3N3b3JkIiwKKyAgICAgICAgICAgICAgICAiXHU1MUZBXHU1MjlCXHU1MTQ4XHUzMEFEXHUzMEZDXHUzMEI5XHUzMEM4XHUzMEEyXHUzMDZFXHUzMEQxXHUzMEI5XHUzMEVGXHUzMEZDXHUzMEM5In0sIC8vLWRlc3RzdG9yZXBhc3MKKyAgICAgICAgeyJkZXN0aW5hdGlvbi5rZXlzdG9yZS50eXBlIiwKKyAgICAgICAgICAgICAgICAiXHU1MUZBXHU1MjlCXHU1MTQ4XHUzMEFEXHUzMEZDXHUzMEI5XHUzMEM4XHUzMEEyXHUzMDZFXHUzMEJGXHUzMEE0XHUzMEQ3In0sIC8vLWRlc3RzdG9yZXR5cGUKKyAgICAgICAgeyJkaXN0aW5ndWlzaGVkLm5hbWUiLAorICAgICAgICAgICAgICAgICJcdThCNThcdTUyMjVcdTU0MEQifSwgLy8tZG5hbWUKKyAgICAgICAgeyJYLjUwOS5leHRlbnNpb24iLAorICAgICAgICAgICAgICAgICJYLjUwOVx1NjJFMVx1NUYzNSJ9LCAvLy1leHQKKyAgICAgICAgeyJvdXRwdXQuZmlsZS5uYW1lIiwKKyAgICAgICAgICAgICAgICAiXHU1MUZBXHU1MjlCXHUzMEQ1XHUzMEExXHUzMEE0XHUzMEVCXHU1NDBEIn0sIC8vLWZpbGUgYW5kIC1vdXRmaWxlCisgICAgICAgIHsiaW5wdXQuZmlsZS5uYW1lIiwKKyAgICAgICAgICAgICAgICAiXHU1MTY1XHU1MjlCXHUzMEQ1XHUzMEExXHUzMEE0XHUzMEVCXHU1NDBEIn0sIC8vLWZpbGUgYW5kIC1pbmZpbGUKKyAgICAgICAgeyJrZXkuYWxnb3JpdGhtLm5hbWUiLAorICAgICAgICAgICAgICAgICJcdTkzNzVcdTMwQTJcdTMwRUJcdTMwQjRcdTMwRUFcdTMwQkFcdTMwRTBcdTU0MEQifSwgLy8ta2V5YWxnCisgICAgICAgIHsia2V5LnBhc3N3b3JkIiwKKyAgICAgICAgICAgICAgICAiXHU5Mzc1XHUzMDZFXHUzMEQxXHUzMEI5XHUzMEVGXHUzMEZDXHUzMEM5In0sIC8vLWtleXBhc3MKKyAgICAgICAgeyJrZXkuYml0LnNpemUiLAorICAgICAgICAgICAgICAgICJcdTkzNzVcdTMwNkVcdTMwRDNcdTMwQzNcdTMwQzhcdTMwRkJcdTMwQjVcdTMwQTRcdTMwQkEifSwgLy8ta2V5c2l6ZQorICAgICAgICB7ImtleXN0b3JlLm5hbWUiLAorICAgICAgICAgICAgICAgICJcdTMwQURcdTMwRkNcdTMwQjlcdTMwQzhcdTMwQTJcdTU0MEQifSwgLy8ta2V5c3RvcmUKKyAgICAgICAgeyJuZXcucGFzc3dvcmQiLAorICAgICAgICAgICAgICAgICJcdTY1QjBcdTg5OEZcdTMwRDFcdTMwQjlcdTMwRUZcdTMwRkNcdTMwQzkifSwgLy8tbmV3CisgICAgICAgIHsiZG8ubm90LnByb21wdCIsCisgICAgICAgICAgICAgICAgIlx1MzBEN1x1MzBFRFx1MzBGM1x1MzBEN1x1MzBDOFx1MzA5Mlx1ODg2OFx1NzkzQVx1MzA1N1x1MzA2QVx1MzA0NCJ9LCAvLy1ub3Byb21wdAorICAgICAgICB7InBhc3N3b3JkLnRocm91Z2gucHJvdGVjdGVkLm1lY2hhbmlzbSIsCisgICAgICAgICAgICAgICAgIlx1NEZERFx1OEI3N1x1MzBFMVx1MzBBQlx1MzBDQlx1MzBCQVx1MzBFMFx1MzA2Qlx1MzA4OFx1MzA4Qlx1MzBEMVx1MzBCOVx1MzBFRlx1MzBGQ1x1MzBDOSJ9LCAvLy1wcm90ZWN0ZWQKKyAgICAgICAgeyJwcm92aWRlci5hcmd1bWVudCIsCisgICAgICAgICAgICAgICAgIlx1MzBEN1x1MzBFRFx1MzBEMFx1MzBBNFx1MzBDMFx1NUYxNVx1NjU3MCJ9LCAvLy1wcm92aWRlcmFyZworICAgICAgICB7InByb3ZpZGVyLmNsYXNzLm5hbWUiLAorICAgICAgICAgICAgICAgICJcdTMwRDdcdTMwRURcdTMwRDBcdTMwQTRcdTMwQzBcdTMwRkJcdTMwQUZcdTMwRTlcdTMwQjlcdTU0MEQifSwgLy8tcHJvdmlkZXJjbGFzcworICAgICAgICB7InByb3ZpZGVyLm5hbWUiLAorICAgICAgICAgICAgICAgICJcdTMwRDdcdTMwRURcdTMwRDBcdTMwQTRcdTMwQzBcdTU0MEQifSwgLy8tcHJvdmlkZXJuYW1lCisgICAgICAgIHsicHJvdmlkZXIuY2xhc3NwYXRoIiwKKyAgICAgICAgICAgICAgICAiXHUzMEQ3XHUzMEVEXHUzMEQwXHUzMEE0XHUzMEMwXHUzMEZCXHUzMEFGXHUzMEU5XHUzMEI5XHUzMEQxXHUzMEI5In0sIC8vLXByb3ZpZGVycGF0aAorICAgICAgICB7Im91dHB1dC5pbi5SRkMuc3R5bGUiLAorICAgICAgICAgICAgICAgICJSRkNcdTMwQjlcdTMwQkZcdTMwQTRcdTMwRUJcdTMwNkVcdTUxRkFcdTUyOUIifSwgLy8tcmZjCisgICAgICAgIHsic2lnbmF0dXJlLmFsZ29yaXRobS5uYW1lIiwKKyAgICAgICAgICAgICAgICAiXHU3RjcyXHU1NDBEXHUzMEEyXHUzMEVCXHUzMEI0XHUzMEVBXHUzMEJBXHUzMEUwXHU1NDBEIn0sIC8vLXNpZ2FsZworICAgICAgICB7InNvdXJjZS5hbGlhcyIsCisgICAgICAgICAgICAgICAgIlx1MzBCRFx1MzBGQ1x1MzBCOVx1NTIyNVx1NTQwRCJ9LCAvLy1zcmNhbGlhcworICAgICAgICB7InNvdXJjZS5rZXkucGFzc3dvcmQiLAorICAgICAgICAgICAgICAgICJcdTMwQkRcdTMwRkNcdTMwQjlcdTMwRkJcdTMwQURcdTMwRkNcdTMwNkVcdTMwRDFcdTMwQjlcdTMwRUZcdTMwRkNcdTMwQzkifSwgLy8tc3Jja2V5cGFzcworICAgICAgICB7InNvdXJjZS5rZXlzdG9yZS5uYW1lIiwKKyAgICAgICAgICAgICAgICAiXHUzMEJEXHUzMEZDXHUzMEI5XHUzMEZCXHUzMEFEXHUzMEZDXHUzMEI5XHUzMEM4XHUzMEEyXHU1NDBEIn0sIC8vLXNyY2tleXN0b3JlCisgICAgICAgIHsic291cmNlLmtleXN0b3JlLnBhc3N3b3JkLnByb3RlY3RlZCIsCisgICAgICAgICAgICAgICAgIlx1MzBCRFx1MzBGQ1x1MzBCOVx1MzBGQlx1MzBBRFx1MzBGQ1x1MzBCOVx1MzBDOFx1MzBBMlx1MzA2RVx1NEZERFx1OEI3N1x1NUJGRVx1OEM2MVx1MzBEMVx1MzBCOVx1MzBFRlx1MzBGQ1x1MzBDOSJ9LCAvLy1zcmNwcm90ZWN0ZWQKKyAgICAgICAgeyJzb3VyY2Uua2V5c3RvcmUucHJvdmlkZXIubmFtZSIsCisgICAgICAgICAgICAgICAgIlx1MzBCRFx1MzBGQ1x1MzBCOVx1MzBGQlx1MzBBRFx1MzBGQ1x1MzBCOVx1MzBDOFx1MzBBMlx1MzBGQlx1MzBEN1x1MzBFRFx1MzBEMFx1MzBBNFx1MzBDMFx1NTQwRCJ9LCAvLy1zcmNwcm92aWRlcm5hbWUKKyAgICAgICAgeyJzb3VyY2Uua2V5c3RvcmUucGFzc3dvcmQiLAorICAgICAgICAgICAgICAgICJcdTMwQkRcdTMwRkNcdTMwQjlcdTMwRkJcdTMwQURcdTMwRkNcdTMwQjlcdTMwQzhcdTMwQTJcdTMwNkVcdTMwRDFcdTMwQjlcdTMwRUZcdTMwRkNcdTMwQzkifSwgLy8tc3Jjc3RvcmVwYXNzCisgICAgICAgIHsic291cmNlLmtleXN0b3JlLnR5cGUiLAorICAgICAgICAgICAgICAgICJcdTMwQkRcdTMwRkNcdTMwQjlcdTMwRkJcdTMwQURcdTMwRkNcdTMwQjlcdTMwQzhcdTMwQTJcdTMwNkVcdTMwQkZcdTMwQTRcdTMwRDcifSwgLy8tc3Jjc3RvcmV0eXBlCisgICAgICAgIHsiU1NMLnNlcnZlci5ob3N0LmFuZC5wb3J0IiwKKyAgICAgICAgICAgICAgICAiU1NMXHUzMEI1XHUzMEZDXHUzMEQwXHUzMEZDXHUzMDZFXHUzMERCXHUzMEI5XHUzMEM4XHUzMDY4XHUzMEREXHUzMEZDXHUzMEM4In0sIC8vLXNzbHNlcnZlcgorICAgICAgICB7InNpZ25lZC5qYXIuZmlsZSIsCisgICAgICAgICAgICAgICAgIlx1N0Y3Mlx1NTQwRFx1NEVEOFx1MzA0REpBUlx1MzBENVx1MzBBMVx1MzBBNFx1MzBFQiJ9LCAvLz1qYXJmaWxlCisgICAgICAgIHsiY2VydGlmaWNhdGUudmFsaWRpdHkuc3RhcnQuZGF0ZS50aW1lIiwKKyAgICAgICAgICAgICAgICAiXHU4QTNDXHU2NjBFXHU2NkY4XHUzMDZFXHU2NzA5XHU1MkI5XHU5NThCXHU1OUNCXHU2NUU1XHU2NjQyIn0sIC8vLXN0YXJ0ZGF0ZQorICAgICAgICB7ImtleXN0b3JlLnBhc3N3b3JkIiwKKyAgICAgICAgICAgICAgICAiXHUzMEFEXHUzMEZDXHUzMEI5XHUzMEM4XHUzMEEyXHUzMDZFXHUzMEQxXHUzMEI5XHUzMEVGXHUzMEZDXHUzMEM5In0sIC8vLXN0b3JlcGFzcworICAgICAgICB7ImtleXN0b3JlLnR5cGUiLAorICAgICAgICAgICAgICAgICJcdTMwQURcdTMwRkNcdTMwQjlcdTMwQzhcdTMwQTJcdTMwNkVcdTMwQkZcdTMwQTRcdTMwRDcifSwgLy8tc3RvcmV0eXBlCisgICAgICAgIHsidHJ1c3QuY2VydGlmaWNhdGVzLmZyb20uY2FjZXJ0cyIsCisgICAgICAgICAgICAgICAgImNhY2VydHNcdTMwNEJcdTMwODlcdTMwNkVcdThBM0NcdTY2MEVcdTY2RjhcdTMwOTJcdTRGRTFcdTk4M0NcdTMwNTlcdTMwOEIifSwgLy8tdHJ1c3RjYWNlcnRzCisgICAgICAgIHsidmVyYm9zZS5vdXRwdXQiLAorICAgICAgICAgICAgICAgICJcdThBNzNcdTdEMzBcdTUxRkFcdTUyOUIifSwgLy8tdgorICAgICAgICB7InZhbGlkaXR5Lm51bWJlci5vZi5kYXlzIiwKKyAgICAgICAgICAgICAgICAiXHU1OUE1XHU1RjUzXHU2MDI3XHU2NUU1XHU2NTcwIn0sIC8vLXZhbGlkaXR5CisgICAgICAgIHsiU2VyaWFsLklELm9mLmNlcnQudG8ucmV2b2tlIiwKKyAgICAgICAgICAgICAgICAgIlx1NTkzMVx1NTJCOVx1MzA1OVx1MzA4Qlx1OEEzQ1x1NjYwRVx1NjZGOFx1MzA2RVx1MzBCN1x1MzBFQVx1MzBBMlx1MzBFQklEIn0sIC8vLWlkCisgICAgICAgIC8vIGtleXRvb2w6IFJ1bm5pbmcgcGFydAorICAgICAgICB7ImtleXRvb2wuZXJyb3IuIiwgImtleXRvb2xcdTMwQThcdTMwRTlcdTMwRkM6ICJ9LAorICAgICAgICB7IklsbGVnYWwub3B0aW9uLiIsICJcdTRFMERcdTZCNjNcdTMwNkFcdTMwQUFcdTMwRDdcdTMwQjdcdTMwRTdcdTMwRjM6ICAifSwKKyAgICAgICAgeyJJbGxlZ2FsLnZhbHVlLiIsICJcdTRFMERcdTZCNjNcdTMwNkFcdTUwMjQ6ICJ9LAorICAgICAgICB7IlVua25vd24ucGFzc3dvcmQudHlwZS4iLCAiXHU0RTBEXHU2NjBFXHUzMDZBXHUzMEQxXHUzMEI5XHUzMEVGXHUzMEZDXHUzMEM5XHUzMEZCXHUzMEJGXHUzMEE0XHUzMEQ3OiAifSwKKyAgICAgICAgeyJDYW5ub3QuZmluZC5lbnZpcm9ubWVudC52YXJpYWJsZS4iLAorICAgICAgICAgICAgICAgICJcdTc0QjBcdTU4ODNcdTU5MDlcdTY1NzBcdTMwNENcdTg5OEJcdTMwNjRcdTMwNEJcdTMwOEFcdTMwN0VcdTMwNUJcdTMwOTM6ICJ9LAorICAgICAgICB7IkNhbm5vdC5maW5kLmZpbGUuIiwgIlx1MzBENVx1MzBBMVx1MzBBNFx1MzBFQlx1MzA0Q1x1ODk4Qlx1MzA2NFx1MzA0Qlx1MzA4QVx1MzA3RVx1MzA1Qlx1MzA5MzogIn0sCisgICAgICAgIHsiQ29tbWFuZC5vcHRpb24uZmxhZy5uZWVkcy5hbi5hcmd1bWVudC4iLCAiXHUzMEIzXHUzMERFXHUzMEYzXHUzMEM5XHUzMEZCXHUzMEFBXHUzMEQ3XHUzMEI3XHUzMEU3XHUzMEYzezB9XHUzMDZCXHUzMDZGXHU1RjE1XHU2NTcwXHUzMDRDXHU1RkM1XHU4OTgxXHUzMDY3XHUzMDU5XHUzMDAyIn0sCisgICAgICAgIHsiV2FybmluZy5EaWZmZXJlbnQuc3RvcmUuYW5kLmtleS5wYXNzd29yZHMubm90LnN1cHBvcnRlZC5mb3IuUEtDUzEyLktleVN0b3Jlcy5JZ25vcmluZy51c2VyLnNwZWNpZmllZC5jb21tYW5kLnZhbHVlLiIsCisgICAgICAgICAgICAgICAgIlx1OEI2Nlx1NTQ0QTogUEtDUzEyXHUzMEFEXHUzMEZDXHUzMEI5XHUzMEM4XHUzMEEyXHUzMDY3XHUzMDZGXHUzMDAxXHUzMEI5XHUzMEM4XHUzMEEyXHUzMDZFXHUzMEQxXHUzMEI5XHUzMEVGXHUzMEZDXHUzMEM5XHUzMDY4XHU5Mzc1XHUzMDZFXHUzMEQxXHUzMEI5XHUzMEVGXHUzMEZDXHUzMEM5XHUzMDRDXHU3NTcwXHUzMDZBXHUzMDhCXHU3MkI2XHU2Q0MxXHUzMDZGXHUzMEI1XHUzMEREXHUzMEZDXHUzMEM4XHUzMDU1XHUzMDhDXHUzMDdFXHUzMDVCXHUzMDkzXHUzMDAyXHUzMEU2XHUzMEZDXHUzMEI2XHUzMEZDXHUzMDRDXHU2MzA3XHU1QjlBXHUzMDU3XHUzMDVGezB9XHUzMDZFXHU1MDI0XHUzMDZGXHU3MTIxXHU4OTk2XHUzMDU3XHUzMDdFXHUzMDU5XHUzMDAyIn0sCisgICAgICAgIHsiLmtleXN0b3JlLm11c3QuYmUuTk9ORS5pZi5zdG9yZXR5cGUuaXMuezB9IiwKKyAgICAgICAgICAgICAgICAiLXN0b3JldHlwZVx1MzA0Q3swfVx1MzA2RVx1NTgzNFx1NTQwOFx1MzAwMS1rZXlzdG9yZVx1MzA2Rk5PTkVcdTMwNjdcdTMwNDJcdTMwOEJcdTVGQzVcdTg5ODFcdTMwNENcdTMwNDJcdTMwOEFcdTMwN0VcdTMwNTkifSwKKyAgICAgICAgeyJUb28ubWFueS5yZXRyaWVzLnByb2dyYW0udGVybWluYXRlZCIsCisgICAgICAgICAgICAgICAgICJcdTUxOERcdThBNjZcdTg4NENcdTMwNENcdTU5MUFcdTMwNTlcdTMwNEVcdTMwN0VcdTMwNTlcdTMwMDJcdTMwRDdcdTMwRURcdTMwQjBcdTMwRTlcdTMwRTBcdTMwNENcdTdENDJcdTRFODZcdTMwNTdcdTMwN0VcdTMwNTdcdTMwNUYifSwKKyAgICAgICAgeyIuc3RvcmVwYXNzd2QuYW5kLmtleXBhc3N3ZC5jb21tYW5kcy5ub3Quc3VwcG9ydGVkLmlmLnN0b3JldHlwZS5pcy57MH0iLAorICAgICAgICAgICAgICAgICItc3RvcmV0eXBlXHUzMDRDezB9XHUzMDZFXHU1ODM0XHU1NDA4XHUzMDAxLXN0b3JlcGFzc3dkXHUzMEIzXHUzMERFXHUzMEYzXHUzMEM5XHUzMDRBXHUzMDg4XHUzMDczLWtleXBhc3N3ZFx1MzBCM1x1MzBERVx1MzBGM1x1MzBDOVx1MzA2Rlx1MzBCNVx1MzBERFx1MzBGQ1x1MzBDOFx1MzA1NVx1MzA4Q1x1MzA3RVx1MzA1Qlx1MzA5MyJ9LAorICAgICAgICB7Ii5rZXlwYXNzd2QuY29tbWFuZHMubm90LnN1cHBvcnRlZC5pZi5zdG9yZXR5cGUuaXMuUEtDUzEyIiwKKyAgICAgICAgICAgICAgICAiLXN0b3JldHlwZVx1MzA0Q1BLQ1MxMlx1MzA2RVx1NTgzNFx1NTQwOFx1MzAwMS1rZXlwYXNzd2RcdTMwQjNcdTMwREVcdTMwRjNcdTMwQzlcdTMwNkZcdTMwQjVcdTMwRERcdTMwRkNcdTMwQzhcdTMwNTVcdTMwOENcdTMwN0VcdTMwNUJcdTMwOTMifSwKKyAgICAgICAgeyIua2V5cGFzcy5hbmQubmV3LmNhbi5ub3QuYmUuc3BlY2lmaWVkLmlmLnN0b3JldHlwZS5pcy57MH0iLAorICAgICAgICAgICAgICAgICItc3RvcmV0eXBlXHUzMDRDezB9XHUzMDZFXHU1ODM0XHU1NDA4XHUzMDAxLWtleXBhc3NcdTMwNjgtbmV3XHUzMDZGXHU2MzA3XHU1QjlBXHUzMDY3XHUzMDREXHUzMDdFXHUzMDVCXHUzMDkzIn0sCisgICAgICAgIHsiaWYucHJvdGVjdGVkLmlzLnNwZWNpZmllZC50aGVuLnN0b3JlcGFzcy5rZXlwYXNzLmFuZC5uZXcubXVzdC5ub3QuYmUuc3BlY2lmaWVkIiwKKyAgICAgICAgICAgICAgICAiLXByb3RlY3RlZFx1MzA0Q1x1NjMwN1x1NUI5QVx1MzA1NVx1MzA4Q1x1MzA2Nlx1MzA0NFx1MzA4Qlx1NTgzNFx1NTQwOFx1MzAwMS1zdG9yZXBhc3NcdTMwMDEta2V5cGFzc1x1MzA0QVx1MzA4OFx1MzA3My1uZXdcdTMwNkZcdTYzMDdcdTVCOUFcdTMwNjdcdTMwNERcdTMwN0VcdTMwNUJcdTMwOTMifSwKKyAgICAgICAgeyJpZi5zcmNwcm90ZWN0ZWQuaXMuc3BlY2lmaWVkLnRoZW4uc3Jjc3RvcmVwYXNzLmFuZC5zcmNrZXlwYXNzLm11c3Qubm90LmJlLnNwZWNpZmllZCIsCisgICAgICAgICAgICAgICAgIi1zcmNwcm90ZWN0ZWRcdTMwNENcdTYzMDdcdTVCOUFcdTMwNTVcdTMwOENcdTMwNjZcdTMwNDRcdTMwOEJcdTU4MzRcdTU0MDhcdTMwMDEtc3Jjc3RvcmVwYXNzXHUzMDRBXHUzMDg4XHUzMDczLXNyY2tleXBhc3NcdTMwNkZcdTYzMDdcdTVCOUFcdTMwNjdcdTMwNERcdTMwN0VcdTMwNUJcdTMwOTMifSwKKyAgICAgICAgeyJpZi5rZXlzdG9yZS5pcy5ub3QucGFzc3dvcmQucHJvdGVjdGVkLnRoZW4uc3RvcmVwYXNzLmtleXBhc3MuYW5kLm5ldy5tdXN0Lm5vdC5iZS5zcGVjaWZpZWQiLAorICAgICAgICAgICAgICAgICJcdTMwQURcdTMwRkNcdTMwQjlcdTMwQzhcdTMwQTJcdTMwNENcdTMwRDFcdTMwQjlcdTMwRUZcdTMwRkNcdTMwQzlcdTMwNjdcdTRGRERcdThCNzdcdTMwNTVcdTMwOENcdTMwNjZcdTMwNDRcdTMwNkFcdTMwNDRcdTU4MzRcdTU0MDhcdTMwMDEtc3RvcmVwYXNzXHUzMDAxLWtleXBhc3NcdTMwNEFcdTMwODhcdTMwNzMtbmV3XHUzMDZGXHU2MzA3XHU1QjlBXHUzMDY3XHUzMDREXHUzMDdFXHUzMDVCXHUzMDkzIn0sCisgICAgICAgIHsiaWYuc291cmNlLmtleXN0b3JlLmlzLm5vdC5wYXNzd29yZC5wcm90ZWN0ZWQudGhlbi5zcmNzdG9yZXBhc3MuYW5kLnNyY2tleXBhc3MubXVzdC5ub3QuYmUuc3BlY2lmaWVkIiwKKyAgICAgICAgICAgICAgICAiXHUzMEJEXHUzMEZDXHUzMEI5XHUzMEZCXHUzMEFEXHUzMEZDXHUzMEI5XHUzMEM4XHUzMEEyXHUzMDRDXHUzMEQxXHUzMEI5XHUzMEVGXHUzMEZDXHUzMEM5XHUzMDY3XHU0RkREXHU4Qjc3XHUzMDU1XHUzMDhDXHUzMDY2XHUzMDQ0XHUzMDZBXHUzMDQ0XHU1ODM0XHU1NDA4XHUzMDAxLXNyY3N0b3JlcGFzc1x1MzA0QVx1MzA4OFx1MzA3My1zcmNrZXlwYXNzXHUzMDZGXHU2MzA3XHU1QjlBXHUzMDY3XHUzMDREXHUzMDdFXHUzMDVCXHUzMDkzIn0sCisgICAgICAgIHsiSWxsZWdhbC5zdGFydGRhdGUudmFsdWUiLCAic3RhcnRkYXRlXHU1MDI0XHUzMDRDXHU3MTIxXHU1MkI5XHUzMDY3XHUzMDU5In0sCisgICAgICAgIHsiVmFsaWRpdHkubXVzdC5iZS5ncmVhdGVyLnRoYW4uemVybyIsCisgICAgICAgICAgICAgICAgIlx1NTlBNVx1NUY1M1x1NjAyN1x1MzA2Rlx1MzBCQ1x1MzBFRFx1MzA4OFx1MzA4QVx1NTkyN1x1MzA0RFx1MzA0NFx1NUZDNVx1ODk4MVx1MzA0Q1x1MzA0Mlx1MzA4QVx1MzA3RVx1MzA1OSJ9LAorICAgICAgICB7InByb3ZOYW1lLm5vdC5hLnByb3ZpZGVyIiwgInswfVx1MzA2Rlx1MzBEN1x1MzBFRFx1MzBEMFx1MzBBNFx1MzBDMFx1MzA2N1x1MzA2Rlx1MzA0Mlx1MzA4QVx1MzA3RVx1MzA1Qlx1MzA5MyJ9LAorICAgICAgICB7IlVzYWdlLmVycm9yLm5vLmNvbW1hbmQucHJvdmlkZWQiLCAiXHU0RjdGXHU3NTI4XHUzMEE4XHUzMEU5XHUzMEZDOiBcdTMwQjNcdTMwREVcdTMwRjNcdTMwQzlcdTMwNENcdTYzMDdcdTVCOUFcdTMwNTVcdTMwOENcdTMwNjZcdTMwNDRcdTMwN0VcdTMwNUJcdTMwOTMifSwKKyAgICAgICAgeyJTb3VyY2Uua2V5c3RvcmUuZmlsZS5leGlzdHMuYnV0LmlzLmVtcHR5LiIsICJcdTMwQkRcdTMwRkNcdTMwQjlcdTMwRkJcdTMwQURcdTMwRkNcdTMwQjlcdTMwQzhcdTMwQTJcdTMwRkJcdTMwRDVcdTMwQTFcdTMwQTRcdTMwRUJcdTMwNkZcdTMwMDFcdTVCNThcdTU3MjhcdTMwNTdcdTMwN0VcdTMwNTlcdTMwNENcdTdBN0FcdTMwNjdcdTMwNTk6ICJ9LAorICAgICAgICB7IlBsZWFzZS5zcGVjaWZ5LnNyY2tleXN0b3JlIiwgIi1zcmNrZXlzdG9yZVx1MzA5Mlx1NjMwN1x1NUI5QVx1MzA1N1x1MzA2Nlx1MzA0Rlx1MzA2MFx1MzA1NVx1MzA0NCJ9LAorICAgICAgICB7Ik11c3Qubm90LnNwZWNpZnkuYm90aC52LmFuZC5yZmMud2l0aC5saXN0LmNvbW1hbmQiLAorICAgICAgICAgICAgICAgICInbGlzdCdcdTMwQjNcdTMwREVcdTMwRjNcdTMwQzlcdTMwNkItdlx1MzA2OC1yZmNcdTMwNkVcdTRFMjFcdTY1QjlcdTMwOTJcdTYzMDdcdTVCOUFcdTMwNTlcdTMwOEJcdTMwNTNcdTMwNjhcdTMwNkZcdTMwNjdcdTMwNERcdTMwN0VcdTMwNUJcdTMwOTMifSwKKyAgICAgICAgeyJLZXkucGFzc3dvcmQubXVzdC5iZS5hdC5sZWFzdC42LmNoYXJhY3RlcnMiLAorICAgICAgICAgICAgICAgICJcdTkzNzVcdTMwNkVcdTMwRDFcdTMwQjlcdTMwRUZcdTMwRkNcdTMwQzlcdTMwNkY2XHU2NTg3XHU1QjU3XHU0RUU1XHU0RTBBXHUzMDY3XHUzMDQyXHUzMDhCXHU1RkM1XHU4OTgxXHUzMDRDXHUzMDQyXHUzMDhBXHUzMDdFXHUzMDU5In0sCisgICAgICAgIHsiTmV3LnBhc3N3b3JkLm11c3QuYmUuYXQubGVhc3QuNi5jaGFyYWN0ZXJzIiwKKyAgICAgICAgICAgICAgICAiXHU2NUIwXHU4OThGXHUzMEQxXHUzMEI5XHUzMEVGXHUzMEZDXHUzMEM5XHUzMDZGNlx1NjU4N1x1NUI1N1x1NEVFNVx1NEUwQVx1MzA2N1x1MzA0Mlx1MzA4Qlx1NUZDNVx1ODk4MVx1MzA0Q1x1MzA0Mlx1MzA4QVx1MzA3RVx1MzA1OSJ9LAorICAgICAgICB7IktleXN0b3JlLmZpbGUuZXhpc3RzLmJ1dC5pcy5lbXB0eS4iLAorICAgICAgICAgICAgICAgICJcdTMwQURcdTMwRkNcdTMwQjlcdTMwQzhcdTMwQTJcdTMwRkJcdTMwRDVcdTMwQTFcdTMwQTRcdTMwRUJcdTMwNkZcdTVCNThcdTU3MjhcdTMwNTdcdTMwN0VcdTMwNTlcdTMwNENcdTMwMDFcdTdBN0FcdTMwNjdcdTMwNTk6ICJ9LAorICAgICAgICB7IktleXN0b3JlLmZpbGUuZG9lcy5ub3QuZXhpc3QuIiwKKyAgICAgICAgICAgICAgICAiXHUzMEFEXHUzMEZDXHUzMEI5XHUzMEM4XHUzMEEyXHUzMEZCXHUzMEQ1XHUzMEExXHUzMEE0XHUzMEVCXHUzMDZGXHU1QjU4XHU1NzI4XHUzMDU3XHUzMDdFXHUzMDVCXHUzMDkzOiAifSwKKyAgICAgICAgeyJNdXN0LnNwZWNpZnkuZGVzdGluYXRpb24uYWxpYXMiLCAiXHU1MUZBXHU1MjlCXHU1MTQ4XHUzMDZFXHU1MjI1XHU1NDBEXHUzMDkyXHU2MzA3XHU1QjlBXHUzMDU5XHUzMDhCXHU1RkM1XHU4OTgxXHUzMDRDXHUzMDQyXHUzMDhBXHUzMDdFXHUzMDU5In0sCisgICAgICAgIHsiTXVzdC5zcGVjaWZ5LmFsaWFzIiwgIlx1NTIyNVx1NTQwRFx1MzA5Mlx1NjMwN1x1NUI5QVx1MzA1OVx1MzA4Qlx1NUZDNVx1ODk4MVx1MzA0Q1x1MzA0Mlx1MzA4QVx1MzA3RVx1MzA1OSJ9LAorICAgICAgICB7IktleXN0b3JlLnBhc3N3b3JkLm11c3QuYmUuYXQubGVhc3QuNi5jaGFyYWN0ZXJzIiwKKyAgICAgICAgICAgICAgICAiXHUzMEFEXHUzMEZDXHUzMEI5XHUzMEM4XHUzMEEyXHUzMDZFXHUzMEQxXHUzMEI5XHUzMEVGXHUzMEZDXHUzMEM5XHUzMDZGNlx1NjU4N1x1NUI1N1x1NEVFNVx1NEUwQVx1MzA2N1x1MzA0Mlx1MzA4Qlx1NUZDNVx1ODk4MVx1MzA0Q1x1MzA0Mlx1MzA4QVx1MzA3RVx1MzA1OSJ9LAorICAgICAgICB7IkVudGVyLmtleXN0b3JlLnBhc3N3b3JkLiIsICJcdTMwQURcdTMwRkNcdTMwQjlcdTMwQzhcdTMwQTJcdTMwNkVcdTMwRDFcdTMwQjlcdTMwRUZcdTMwRkNcdTMwQzlcdTMwOTJcdTUxNjVcdTUyOUJcdTMwNTdcdTMwNjZcdTMwNEZcdTMwNjBcdTMwNTVcdTMwNDQ6ICAifSwKKyAgICAgICAgeyJFbnRlci5zb3VyY2Uua2V5c3RvcmUucGFzc3dvcmQuIiwgIlx1MzBCRFx1MzBGQ1x1MzBCOVx1MzBGQlx1MzBBRFx1MzBGQ1x1MzBCOVx1MzBDOFx1MzBBMlx1MzA2RVx1MzBEMVx1MzBCOVx1MzBFRlx1MzBGQ1x1MzBDOVx1MzA5Mlx1NTE2NVx1NTI5Qlx1MzA1N1x1MzA2Nlx1MzA0Rlx1MzA2MFx1MzA1NVx1MzA0NDogICJ9LAorICAgICAgICB7IkVudGVyLmRlc3RpbmF0aW9uLmtleXN0b3JlLnBhc3N3b3JkLiIsICJcdTUxRkFcdTUyOUJcdTUxNDhcdTMwQURcdTMwRkNcdTMwQjlcdTMwQzhcdTMwQTJcdTMwNkVcdTMwRDFcdTMwQjlcdTMwRUZcdTMwRkNcdTMwQzlcdTMwOTJcdTUxNjVcdTUyOUJcdTMwNTdcdTMwNjZcdTMwNEZcdTMwNjBcdTMwNTVcdTMwNDQ6ICAifSwKKyAgICAgICAgeyJLZXlzdG9yZS5wYXNzd29yZC5pcy50b28uc2hvcnQubXVzdC5iZS5hdC5sZWFzdC42LmNoYXJhY3RlcnMiLAorICAgICAgICAgIlx1MzBBRFx1MzBGQ1x1MzBCOVx1MzBDOFx1MzBBMlx1MzA2RVx1MzBEMVx1MzBCOVx1MzBFRlx1MzBGQ1x1MzBDOVx1MzA0Q1x1NzdFRFx1MzA1OVx1MzA0RVx1MzA3RVx1MzA1OSAtIDZcdTY1ODdcdTVCNTdcdTRFRTVcdTRFMEFcdTMwNkJcdTMwNTdcdTMwNjZcdTMwNEZcdTMwNjBcdTMwNTVcdTMwNDQifSwKKyAgICAgICAgeyJVbmtub3duLkVudHJ5LlR5cGUiLCAiXHU0RTBEXHU2NjBFXHUzMDZBXHUzMEE4XHUzMEYzXHUzMEM4XHUzMEVBXHUzMEZCXHUzMEJGXHUzMEE0XHUzMEQ3In0sCisgICAgICAgIHsiVG9vLm1hbnkuZmFpbHVyZXMuQWxpYXMubm90LmNoYW5nZWQiLCAiXHU5NjlDXHU1QkIzXHUzMDRDXHU1OTFBXHUzMDU5XHUzMDRFXHUzMDdFXHUzMDU5XHUzMDAyXHU1MjI1XHU1NDBEXHUzMDZGXHU1OTA5XHU2NkY0XHUzMDU1XHUzMDhDXHUzMDdFXHUzMDVCXHUzMDkzIn0sCisgICAgICAgIHsiRW50cnkuZm9yLmFsaWFzLmFsaWFzLnN1Y2Nlc3NmdWxseS5pbXBvcnRlZC4iLAorICAgICAgICAgICAgICAgICAiXHU1MjI1XHU1NDBEezB9XHUzMDZFXHUzMEE4XHUzMEYzXHUzMEM4XHUzMEVBXHUzMDZFXHUzMEE0XHUzMEYzXHUzMEREXHUzMEZDXHUzMEM4XHUzMDZCXHU2MjEwXHU1MjlGXHUzMDU3XHUzMDdFXHUzMDU3XHUzMDVGXHUzMDAyIn0sCisgICAgICAgIHsiRW50cnkuZm9yLmFsaWFzLmFsaWFzLm5vdC5pbXBvcnRlZC4iLCAiXHU1MjI1XHU1NDBEezB9XHUzMDZFXHUzMEE4XHUzMEYzXHUzMEM4XHUzMEVBXHUzMDZGXHUzMEE0XHUzMEYzXHUzMEREXHUzMEZDXHUzMEM4XHUzMDU1XHUzMDhDXHUzMDdFXHUzMDVCXHUzMDkzXHUzMDY3XHUzMDU3XHUzMDVGXHUzMDAyIn0sCisgICAgICAgIHsiUHJvYmxlbS5pbXBvcnRpbmcuZW50cnkuZm9yLmFsaWFzLmFsaWFzLmV4Y2VwdGlvbi5FbnRyeS5mb3IuYWxpYXMuYWxpYXMubm90LmltcG9ydGVkLiIsCisgICAgICAgICAgICAgICAgICJcdTUyMjVcdTU0MER7MH1cdTMwNkVcdTMwQThcdTMwRjNcdTMwQzhcdTMwRUFcdTMwNkVcdTMwQTRcdTMwRjNcdTMwRERcdTMwRkNcdTMwQzhcdTRFMkRcdTMwNkJcdTU1NEZcdTk4NENcdTMwNENcdTc2N0FcdTc1MUZcdTMwNTdcdTMwN0VcdTMwNTdcdTMwNUY6IHsxfVx1MzAwMlxuXHU1MjI1XHU1NDBEezB9XHUzMDZFXHUzMEE4XHUzMEYzXHUzMEM4XHUzMEVBXHUzMDZGXHUzMEE0XHUzMEYzXHUzMEREXHUzMEZDXHUzMEM4XHUzMDU1XHUzMDhDXHUzMDdFXHUzMDVCXHUzMDkzXHUzMDY3XHUzMDU3XHUzMDVGXHUzMDAyIn0sCisgICAgICAgIHsiSW1wb3J0LmNvbW1hbmQuY29tcGxldGVkLm9rLmVudHJpZXMuc3VjY2Vzc2Z1bGx5LmltcG9ydGVkLmZhaWwuZW50cmllcy5mYWlsZWQub3IuY2FuY2VsbGVkIiwKKyAgICAgICAgICAgICAgICAgIlx1MzBBNFx1MzBGM1x1MzBERFx1MzBGQ1x1MzBDOFx1MzBGQlx1MzBCM1x1MzBERVx1MzBGM1x1MzBDOVx1MzA0Q1x1NUI4Q1x1NEU4Nlx1MzA1N1x1MzA3RVx1MzA1N1x1MzA1RjogezB9XHU0RUY2XHUzMDZFXHUzMEE4XHUzMEYzXHUzMEM4XHUzMEVBXHUzMDZFXHUzMEE0XHUzMEYzXHUzMEREXHUzMEZDXHUzMEM4XHUzMDRDXHU2MjEwXHU1MjlGXHUzMDU3XHUzMDdFXHUzMDU3XHUzMDVGXHUzMDAyezF9XHU0RUY2XHUzMDZFXHUzMEE4XHUzMEYzXHUzMEM4XHUzMEVBXHUzMDZFXHUzMEE0XHUzMEYzXHUzMEREXHUzMEZDXHUzMEM4XHUzMDRDXHU1OTMxXHU2NTU3XHUzMDU3XHUzMDVGXHUzMDRCXHU1M0Q2XHUzMDhBXHU2RDg4XHUzMDU1XHUzMDhDXHUzMDdFXHUzMDU3XHUzMDVGIn0sCisgICAgICAgIHsiV2FybmluZy5PdmVyd3JpdGluZy5leGlzdGluZy5hbGlhcy5hbGlhcy5pbi5kZXN0aW5hdGlvbi5rZXlzdG9yZSIsCisgICAgICAgICAgICAgICAgICJcdThCNjZcdTU0NEE6IFx1NTFGQVx1NTI5Qlx1NTE0OFx1MzBBRFx1MzBGQ1x1MzBCOVx1MzBDOFx1MzBBMlx1NTE4NVx1MzA2RVx1NjVFMlx1NUI1OFx1MzA2RVx1NTIyNVx1NTQwRHswfVx1MzA5Mlx1NEUwQVx1NjZGOFx1MzA0RFx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3RVx1MzA1OSJ9LAorICAgICAgICB7IkV4aXN0aW5nLmVudHJ5LmFsaWFzLmFsaWFzLmV4aXN0cy5vdmVyd3JpdGUubm8uIiwKKyAgICAgICAgICAgICAgICAgIlx1NjVFMlx1NUI1OFx1MzA2RVx1MzBBOFx1MzBGM1x1MzBDOFx1MzBFQVx1MzA2RVx1NTIyNVx1NTQwRHswfVx1MzA0Q1x1NUI1OFx1NTcyOFx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3RVx1MzA1OVx1MzAwMlx1NEUwQVx1NjZGOFx1MzA0RFx1MzA1N1x1MzA3RVx1MzA1OVx1MzA0Qlx1MzAwMltcdTMwNDRcdTMwNDRcdTMwNDhdOiAgIn0sCisgICAgICAgIHsiVG9vLm1hbnkuZmFpbHVyZXMudHJ5LmxhdGVyIiwgIlx1OTY5Q1x1NUJCM1x1MzA0Q1x1NTkxQVx1MzA1OVx1MzA0RVx1MzA3RVx1MzA1OSAtIFx1NUY4Q1x1MzA2N1x1NUI5Rlx1ODg0Q1x1MzA1N1x1MzA2Nlx1MzA0Rlx1MzA2MFx1MzA1NVx1MzA0NCJ9LAorICAgICAgICB7IkNlcnRpZmljYXRpb24ucmVxdWVzdC5zdG9yZWQuaW4uZmlsZS5maWxlbmFtZS4iLAorICAgICAgICAgICAgICAgICJcdThBM0NcdTY2MEVcdTY2RjhcdTMwRUFcdTMwQUZcdTMwQThcdTMwQjlcdTMwQzhcdTMwNENcdTMwRDVcdTMwQTFcdTMwQTRcdTMwRUI8ezB9Plx1MzA2Qlx1NEZERFx1NUI1OFx1MzA1NVx1MzA4Q1x1MzA3RVx1MzA1N1x1MzA1RiJ9LAorICAgICAgICB7IlN1Ym1pdC50aGlzLnRvLnlvdXIuQ0EiLCAiXHUzMDUzXHUzMDhDXHUzMDkyQ0FcdTMwNkJcdTYzRDBcdTUxRkFcdTMwNTdcdTMwNjZcdTMwNEZcdTMwNjBcdTMwNTVcdTMwNDQifSwKKyAgICAgICAgeyJpZi5hbGlhcy5ub3Quc3BlY2lmaWVkLmRlc3RhbGlhcy5zcmNrZXlwYXNzLmFuZC5kZXN0a2V5cGFzcy5tdXN0Lm5vdC5iZS5zcGVjaWZpZWQiLAorICAgICAgICAgICAgIlx1NTIyNVx1NTQwRFx1MzA5Mlx1NjMwN1x1NUI5QVx1MzA1N1x1MzA2QVx1MzA0NFx1NTgzNFx1NTQwOFx1MzAwMVx1NTFGQVx1NTI5Qlx1NTE0OFx1MzBBRFx1MzBGQ1x1MzBCOVx1MzBDOFx1MzBBMlx1MzA2RVx1NTIyNVx1NTQwRFx1MzAwMVx1MzBCRFx1MzBGQ1x1MzBCOVx1MzBGQlx1MzBBRFx1MzBGQ1x1MzBCOVx1MzBDOFx1MzBBMlx1MzA2RVx1MzBEMVx1MzBCOVx1MzBFRlx1MzBGQ1x1MzBDOVx1MzA0QVx1MzA4OFx1MzA3M1x1NTFGQVx1NTI5Qlx1NTE0OFx1MzBBRFx1MzBGQ1x1MzBCOVx1MzBDOFx1MzBBMlx1MzA2RVx1MzBEMVx1MzBCOVx1MzBFRlx1MzBGQ1x1MzBDOVx1MzA2Rlx1NjMwN1x1NUI5QVx1MzA2N1x1MzA0RFx1MzA3RVx1MzA1Qlx1MzA5MyJ9LAorICAgICAgICB7IkNlcnRpZmljYXRlLnN0b3JlZC5pbi5maWxlLmZpbGVuYW1lLiIsCisgICAgICAgICAgICAgICAgIlx1OEEzQ1x1NjYwRVx1NjZGOFx1MzA0Q1x1MzBENVx1MzBBMVx1MzBBNFx1MzBFQjx7MH0+XHUzMDZCXHU0RkREXHU1QjU4XHUzMDU1XHUzMDhDXHUzMDdFXHUzMDU3XHUzMDVGIn0sCisgICAgICAgIHsiQ2VydGlmaWNhdGUucmVwbHkud2FzLmluc3RhbGxlZC5pbi5rZXlzdG9yZSIsCisgICAgICAgICAgICAgICAgIlx1OEEzQ1x1NjYwRVx1NjZGOFx1NUZEQ1x1N0I1NFx1MzA0Q1x1MzBBRFx1MzBGQ1x1MzBCOVx1MzBDOFx1MzBBMlx1MzA2Qlx1MzBBNFx1MzBGM1x1MzBCOVx1MzBDOFx1MzBGQ1x1MzBFQlx1MzA1NVx1MzA4Q1x1MzA3RVx1MzA1N1x1MzA1RiJ9LAorICAgICAgICB7IkNlcnRpZmljYXRlLnJlcGx5Lndhcy5ub3QuaW5zdGFsbGVkLmluLmtleXN0b3JlIiwKKyAgICAgICAgICAgICAgICAiXHU4QTNDXHU2NjBFXHU2NkY4XHU1RkRDXHU3QjU0XHUzMDRDXHUzMEFEXHUzMEZDXHUzMEI5XHUzMEM4XHUzMEEyXHUzMDZCXHUzMEE0XHUzMEYzXHUzMEI5XHUzMEM4XHUzMEZDXHUzMEVCXHUzMDU1XHUzMDhDXHUzMDdFXHUzMDVCXHUzMDkzXHUzMDY3XHUzMDU3XHUzMDVGIn0sCisgICAgICAgIHsiQ2VydGlmaWNhdGUud2FzLmFkZGVkLnRvLmtleXN0b3JlIiwKKyAgICAgICAgICAgICAgICAiXHU4QTNDXHU2NjBFXHU2NkY4XHUzMDRDXHUzMEFEXHUzMEZDXHUzMEI5XHUzMEM4XHUzMEEyXHUzMDZCXHU4RkZEXHU1MkEwXHUzMDU1XHUzMDhDXHUzMDdFXHUzMDU3XHUzMDVGIn0sCisgICAgICAgIHsiQ2VydGlmaWNhdGUud2FzLm5vdC5hZGRlZC50by5rZXlzdG9yZSIsCisgICAgICAgICAgICAgICAgIlx1OEEzQ1x1NjYwRVx1NjZGOFx1MzA0Q1x1MzBBRFx1MzBGQ1x1MzBCOVx1MzBDOFx1MzBBMlx1MzA2Qlx1OEZGRFx1NTJBMFx1MzA1NVx1MzA4Q1x1MzA3RVx1MzA1Qlx1MzA5M1x1MzA2N1x1MzA1N1x1MzA1RiJ9LAorICAgICAgICB7Ii5TdG9yaW5nLmtzZm5hbWUuIiwgIlt7MH1cdTMwOTJcdTY4M0NcdTdEMERcdTRFMkRdIn0sCisgICAgICAgIHsiYWxpYXMuaGFzLm5vLnB1YmxpYy5rZXkuY2VydGlmaWNhdGUuIiwKKyAgICAgICAgICAgICAgICAiezB9XHUzMDZCXHUzMDZGXHU1MTZDXHU5NThCXHU5Mzc1KFx1OEEzQ1x1NjYwRVx1NjZGOClcdTMwNENcdTMwNDJcdTMwOEFcdTMwN0VcdTMwNUJcdTMwOTMifSwKKyAgICAgICAgeyJDYW5ub3QuZGVyaXZlLnNpZ25hdHVyZS5hbGdvcml0aG0iLAorICAgICAgICAgICAgICAgICJcdTdGNzJcdTU0MERcdTMwQTJcdTMwRUJcdTMwQjRcdTMwRUFcdTMwQkFcdTMwRTBcdTMwOTJcdTUzRDZcdTVGOTdcdTMwNjdcdTMwNERcdTMwN0VcdTMwNUJcdTMwOTMifSwKKyAgICAgICAgeyJBbGlhcy5hbGlhcy5kb2VzLm5vdC5leGlzdCIsCisgICAgICAgICAgICAgICAgIlx1NTIyNVx1NTQwRDx7MH0+XHUzMDZGXHU1QjU4XHU1NzI4XHUzMDU3XHUzMDdFXHUzMDVCXHUzMDkzIn0sCisgICAgICAgIHsiQWxpYXMuYWxpYXMuaGFzLm5vLmNlcnRpZmljYXRlIiwKKyAgICAgICAgICAgICAgICAiXHU1MjI1XHU1NDBEPHswfT5cdTMwNkJcdTMwNkZcdThBM0NcdTY2MEVcdTY2RjhcdTMwNENcdTMwNDJcdTMwOEFcdTMwN0VcdTMwNUJcdTMwOTMifSwKKyAgICAgICAgeyJLZXkucGFpci5ub3QuZ2VuZXJhdGVkLmFsaWFzLmFsaWFzLmFscmVhZHkuZXhpc3RzIiwKKyAgICAgICAgICAgICAgICAiXHU5Mzc1XHUzMERBXHUzMEEyXHUzMDZGXHU3NTFGXHU2MjEwXHUzMDU1XHUzMDhDXHUzMDdFXHUzMDVCXHUzMDkzXHUzMDY3XHUzMDU3XHUzMDVGXHUzMDAyXHU1MjI1XHU1NDBEPHswfT5cdTMwNkZcdTMwNTlcdTMwNjdcdTMwNkJcdTVCNThcdTU3MjhcdTMwNTdcdTMwN0VcdTMwNTkifSwKKyAgICAgICAgeyJHZW5lcmF0aW5nLmtleXNpemUuYml0LmtleUFsZ05hbWUua2V5LnBhaXIuYW5kLnNlbGYuc2lnbmVkLmNlcnRpZmljYXRlLnNpZ0FsZ05hbWUud2l0aC5hLnZhbGlkaXR5Lm9mLnZhbGlkYWxpdHkuZGF5cy5mb3IiLAorICAgICAgICAgICAgICAgICJ7M31cdTY1RTVcdTk1OTNcdTY3MDlcdTUyQjlcdTMwNkF7MH1cdTMwRDNcdTMwQzNcdTMwQzhcdTMwNkV7MX1cdTMwNkVcdTkzNzVcdTMwREFcdTMwQTJcdTMwNjhcdTgxRUFcdTVERjFcdTdGNzJcdTU0MERcdTU3OEJcdThBM0NcdTY2MEVcdTY2RjgoezJ9KVx1MzA5Mlx1NzUxRlx1NjIxMFx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA3RVx1MzA1OVxuXHRcdTMwQzdcdTMwQTNcdTMwRUNcdTMwQUZcdTMwQzhcdTMwRUFcdTU0MEQ6IHs0fSJ9LAorICAgICAgICB7IkVudGVyLmtleS5wYXNzd29yZC5mb3IuYWxpYXMuIiwgIjx7MH0+XHUzMDZFXHU5Mzc1XHUzMEQxXHUzMEI5XHUzMEVGXHUzMEZDXHUzMEM5XHUzMDkyXHU1MTY1XHU1MjlCXHUzMDU3XHUzMDY2XHUzMDRGXHUzMDYwXHUzMDU1XHUzMDQ0In0sCisgICAgICAgIHsiLlJFVFVSTi5pZi5zYW1lLmFzLmtleXN0b3JlLnBhc3N3b3JkLiIsCisgICAgICAgICAgICAgICAgIlx0KFx1MzBBRFx1MzBGQ1x1MzBCOVx1MzBDOFx1MzBBMlx1MzA2RVx1MzBEMVx1MzBCOVx1MzBFRlx1MzBGQ1x1MzBDOVx1MzA2OFx1NTQwQ1x1MzA1OFx1NTgzNFx1NTQwOFx1MzA2RlJFVFVSTlx1MzA5Mlx1NjJCQ1x1MzA1N1x1MzA2Nlx1MzA0Rlx1MzA2MFx1MzA1NVx1MzA0NCk6ICAifSwKKyAgICAgICAgeyJLZXkucGFzc3dvcmQuaXMudG9vLnNob3J0Lm11c3QuYmUuYXQubGVhc3QuNi5jaGFyYWN0ZXJzIiwKKyAgICAgICAgICAgICAgICAiXHU5Mzc1XHUzMDZFXHUzMEQxXHUzMEI5XHUzMEVGXHUzMEZDXHUzMEM5XHUzMDRDXHU3N0VEXHUzMDU5XHUzMDRFXHUzMDdFXHUzMDU5IC0gNlx1NjU4N1x1NUI1N1x1NEVFNVx1NEUwQVx1MzA5Mlx1NjMwN1x1NUI5QVx1MzA1N1x1MzA2Nlx1MzA0Rlx1MzA2MFx1MzA1NVx1MzA0NCJ9LAorICAgICAgICB7IlRvby5tYW55LmZhaWx1cmVzLmtleS5ub3QuYWRkZWQudG8ua2V5c3RvcmUiLAorICAgICAgICAgICAgICAgICJcdTk2OUNcdTVCQjNcdTMwNENcdTU5MUFcdTMwNTlcdTMwNEVcdTMwN0VcdTMwNTkgLSBcdTkzNzVcdTMwNkZcdTMwQURcdTMwRkNcdTMwQjlcdTMwQzhcdTMwQTJcdTMwNkJcdThGRkRcdTUyQTBcdTMwNTVcdTMwOENcdTMwN0VcdTMwNUJcdTMwOTNcdTMwNjdcdTMwNTdcdTMwNUYifSwKKyAgICAgICAgeyJEZXN0aW5hdGlvbi5hbGlhcy5kZXN0LmFscmVhZHkuZXhpc3RzIiwKKyAgICAgICAgICAgICAgICAiXHU1MUZBXHU1MjlCXHU1MTQ4XHUzMDZFXHU1MjI1XHU1NDBEPHswfT5cdTMwNkZcdTMwNTlcdTMwNjdcdTMwNkJcdTVCNThcdTU3MjhcdTMwNTdcdTMwN0VcdTMwNTkifSwKKyAgICAgICAgeyJQYXNzd29yZC5pcy50b28uc2hvcnQubXVzdC5iZS5hdC5sZWFzdC42LmNoYXJhY3RlcnMiLAorICAgICAgICAgICAgICAgICJcdTMwRDFcdTMwQjlcdTMwRUZcdTMwRkNcdTMwQzlcdTMwNENcdTc3RURcdTMwNTlcdTMwNEVcdTMwN0VcdTMwNTkgLSA2XHU2NTg3XHU1QjU3XHU0RUU1XHU0RTBBXHUzMDkyXHU2MzA3XHU1QjlBXHUzMDU3XHUzMDY2XHUzMDRGXHUzMDYwXHUzMDU1XHUzMDQ0In0sCisgICAgICAgIHsiVG9vLm1hbnkuZmFpbHVyZXMuS2V5LmVudHJ5Lm5vdC5jbG9uZWQiLAorICAgICAgICAgICAgICAgICJcdTk2OUNcdTVCQjNcdTMwNENcdTU5MUFcdTMwNTlcdTMwNEVcdTMwN0VcdTMwNTlcdTMwMDJcdTkzNzVcdTMwQThcdTMwRjNcdTMwQzhcdTMwRUFcdTMwNkVcdTMwQUZcdTMwRURcdTMwRkNcdTMwRjNcdTMwNkZcdTRGNUNcdTYyMTBcdTMwNTVcdTMwOENcdTMwN0VcdTMwNUJcdTMwOTNcdTMwNjdcdTMwNTdcdTMwNUYifSwKKyAgICAgICAgeyJrZXkucGFzc3dvcmQuZm9yLmFsaWFzLiIsICI8ezB9Plx1MzA2RVx1OTM3NVx1MzA2RVx1MzBEMVx1MzBCOVx1MzBFRlx1MzBGQ1x1MzBDOSJ9LAorICAgICAgICB7IktleXN0b3JlLmVudHJ5LmZvci5pZC5nZXROYW1lLmFscmVhZHkuZXhpc3RzIiwKKyAgICAgICAgICAgICAgICAiPHswfT5cdTMwNkVcdTMwQURcdTMwRkNcdTMwQjlcdTMwQzhcdTMwQTJcdTMwRkJcdTMwQThcdTMwRjNcdTMwQzhcdTMwRUFcdTMwNkZcdTMwNTlcdTMwNjdcdTMwNkJcdTVCNThcdTU3MjhcdTMwNTdcdTMwN0VcdTMwNTkifSwKKyAgICAgICAgeyJDcmVhdGluZy5rZXlzdG9yZS5lbnRyeS5mb3IuaWQuZ2V0TmFtZS4iLAorICAgICAgICAgICAgICAgICI8ezB9Plx1MzA2RVx1MzBBRFx1MzBGQ1x1MzBCOVx1MzBDOFx1MzBBMlx1MzBGQlx1MzBBOFx1MzBGM1x1MzBDOFx1MzBFQVx1MzA5Mlx1NEY1Q1x1NjIxMFx1NEUyRC4uLiJ9LAorICAgICAgICB7Ik5vLmVudHJpZXMuZnJvbS5pZGVudGl0eS5kYXRhYmFzZS5hZGRlZCIsCisgICAgICAgICAgICAgICAgIlx1MzBBMlx1MzBBNFx1MzBDN1x1MzBGM1x1MzBDNlx1MzBBM1x1MzBDNlx1MzBBM1x1MzBGQlx1MzBDN1x1MzBGQ1x1MzBCRlx1MzBEOVx1MzBGQ1x1MzBCOVx1MzA0Qlx1MzA4OVx1OEZGRFx1NTJBMFx1MzA1NVx1MzA4Q1x1MzA1Rlx1MzBBOFx1MzBGM1x1MzBDOFx1MzBFQVx1MzA2Rlx1MzA0Mlx1MzA4QVx1MzA3RVx1MzA1Qlx1MzA5MyJ9LAorICAgICAgICB7IkFsaWFzLm5hbWUuYWxpYXMiLCAiXHU1MjI1XHU1NDBEOiB7MH0ifSwKKyAgICAgICAgeyJDcmVhdGlvbi5kYXRlLmtleVN0b3JlLmdldENyZWF0aW9uRGF0ZS5hbGlhcy4iLAorICAgICAgICAgICAgICAgICJcdTRGNUNcdTYyMTBcdTY1RTU6IHswLGRhdGV9In0sCisgICAgICAgIHsiYWxpYXMua2V5U3RvcmUuZ2V0Q3JlYXRpb25EYXRlLmFsaWFzLiIsCisgICAgICAgICAgICAgICAgInswfSx7MSxkYXRlfSwgIn0sCisgICAgICAgIHsiYWxpYXMuIiwgInswfSwgIn0sCisgICAgICAgIHsiRW50cnkudHlwZS50eXBlLiIsICJcdTMwQThcdTMwRjNcdTMwQzhcdTMwRUFcdTMwRkJcdTMwQkZcdTMwQTRcdTMwRDc6IHswfSJ9LAorICAgICAgICB7IkNlcnRpZmljYXRlLmNoYWluLmxlbmd0aC4iLCAiXHU4QTNDXHU2NjBFXHU2NkY4XHUzMEMxXHUzMEE3XHUzMEZDXHUzMEYzXHUzMDZFXHU5NTc3XHUzMDU1OiAifSwKKyAgICAgICAgeyJDZXJ0aWZpY2F0ZS5pLjEuIiwgIlx1OEEzQ1x1NjYwRVx1NjZGOFt7MCxudW1iZXIsaW50ZWdlcn1dOiJ9LAorICAgICAgICB7IkNlcnRpZmljYXRlLmZpbmdlcnByaW50LlNIQTEuIiwgIlx1OEEzQ1x1NjYwRVx1NjZGOFx1MzA2RVx1MzBENVx1MzBBM1x1MzBGM1x1MzBBQ1x1MzBEN1x1MzBFQVx1MzBGM1x1MzBDOChTSEExKTogIn0sCisgICAgICAgIHsiS2V5c3RvcmUudHlwZS4iLCAiXHUzMEFEXHUzMEZDXHUzMEI5XHUzMEM4XHUzMEEyXHUzMDZFXHUzMEJGXHUzMEE0XHUzMEQ3OiAifSwKKyAgICAgICAgeyJLZXlzdG9yZS5wcm92aWRlci4iLCAiXHUzMEFEXHUzMEZDXHUzMEI5XHUzMEM4XHUzMEEyXHUzMEZCXHUzMEQ3XHUzMEVEXHUzMEQwXHUzMEE0XHUzMEMwOiAifSwKKyAgICAgICAgeyJZb3VyLmtleXN0b3JlLmNvbnRhaW5zLmtleVN0b3JlLnNpemUuZW50cnkiLAorICAgICAgICAgICAgICAgICJcdTMwQURcdTMwRkNcdTMwQjlcdTMwQzhcdTMwQTJcdTMwNkJcdTMwNkZ7MCxudW1iZXIsaW50ZWdlcn1cdTMwQThcdTMwRjNcdTMwQzhcdTMwRUFcdTMwNENcdTU0MkJcdTMwN0VcdTMwOENcdTMwN0VcdTMwNTkifSwKKyAgICAgICAgeyJZb3VyLmtleXN0b3JlLmNvbnRhaW5zLmtleVN0b3JlLnNpemUuZW50cmllcyIsCisgICAgICAgICAgICAgICAgIlx1MzBBRFx1MzBGQ1x1MzBCOVx1MzBDOFx1MzBBMlx1MzA2Qlx1MzA2RnswLG51bWJlcixpbnRlZ2VyfVx1MzBBOFx1MzBGM1x1MzBDOFx1MzBFQVx1MzA0Q1x1NTQyQlx1MzA3RVx1MzA4Q1x1MzA3RVx1MzA1OSJ9LAorICAgICAgICB7IkZhaWxlZC50by5wYXJzZS5pbnB1dCIsICJcdTUxNjVcdTUyOUJcdTMwNkVcdTY5Q0JcdTY1ODdcdTg5RTNcdTY3OTBcdTMwNkJcdTU5MzFcdTY1NTdcdTMwNTdcdTMwN0VcdTMwNTdcdTMwNUYifSwKKyAgICAgICAgeyJFbXB0eS5pbnB1dCIsICJcdTUxNjVcdTUyOUJcdTMwNENcdTMwNDJcdTMwOEFcdTMwN0VcdTMwNUJcdTMwOTMifSwKKyAgICAgICAgeyJOb3QuWC41MDkuY2VydGlmaWNhdGUiLCAiWC41MDlcdThBM0NcdTY2MEVcdTY2RjhcdTMwNjdcdTMwNkZcdTMwNDJcdTMwOEFcdTMwN0VcdTMwNUJcdTMwOTMifSwKKyAgICAgICAgeyJhbGlhcy5oYXMubm8ucHVibGljLmtleSIsICJ7MH1cdTMwNkJcdTMwNkZcdTUxNkNcdTk1OEJcdTkzNzVcdTMwNENcdTMwNDJcdTMwOEFcdTMwN0VcdTMwNUJcdTMwOTMifSwKKyAgICAgICAgeyJhbGlhcy5oYXMubm8uWC41MDkuY2VydGlmaWNhdGUiLCAiezB9XHUzMDZCXHUzMDZGWC41MDlcdThBM0NcdTY2MEVcdTY2RjhcdTMwNENcdTMwNDJcdTMwOEFcdTMwN0VcdTMwNUJcdTMwOTMifSwKKyAgICAgICAgeyJOZXcuY2VydGlmaWNhdGUuc2VsZi5zaWduZWQuIiwgIlx1NjVCMFx1MzA1N1x1MzA0NFx1OEEzQ1x1NjYwRVx1NjZGOChcdTgxRUFcdTVERjFcdTdGNzJcdTU0MERcdTU3OEIpOiJ9LAorICAgICAgICB7IlJlcGx5Lmhhcy5uby5jZXJ0aWZpY2F0ZXMiLCAiXHU1RkRDXHU3QjU0XHUzMDZCXHUzMDZGXHU4QTNDXHU2NjBFXHU2NkY4XHUzMDRDXHUzMDQyXHUzMDhBXHUzMDdFXHUzMDVCXHUzMDkzIn0sCisgICAgICAgIHsiQ2VydGlmaWNhdGUubm90LmltcG9ydGVkLmFsaWFzLmFsaWFzLmFscmVhZHkuZXhpc3RzIiwKKyAgICAgICAgICAgICAgICAiXHU4QTNDXHU2NjBFXHU2NkY4XHUzMDZGXHUzMEE0XHUzMEYzXHUzMEREXHUzMEZDXHUzMEM4XHUzMDU1XHUzMDhDXHUzMDdFXHUzMDVCXHUzMDkzXHUzMDY3XHUzMDU3XHUzMDVGXHUzMDAyXHU1MjI1XHU1NDBEPHswfT5cdTMwNkZcdTMwNTlcdTMwNjdcdTMwNkJcdTVCNThcdTU3MjhcdTMwNTdcdTMwN0VcdTMwNTkifSwKKyAgICAgICAgeyJJbnB1dC5ub3QuYW4uWC41MDkuY2VydGlmaWNhdGUiLCAiXHU1MTY1XHU1MjlCXHUzMDZGWC41MDlcdThBM0NcdTY2MEVcdTY2RjhcdTMwNjdcdTMwNkZcdTMwNDJcdTMwOEFcdTMwN0VcdTMwNUJcdTMwOTMifSwKKyAgICAgICAgeyJDZXJ0aWZpY2F0ZS5hbHJlYWR5LmV4aXN0cy5pbi5rZXlzdG9yZS51bmRlci5hbGlhcy50cnVzdGFsaWFzLiIsCisgICAgICAgICAgICAgICAgIlx1OEEzQ1x1NjYwRVx1NjZGOFx1MzA2Rlx1MzAwMVx1NTIyNVx1NTQwRDx7MH0+XHUzMDZFXHUzMEFEXHUzMEZDXHUzMEI5XHUzMEM4XHUzMEEyXHUzMDZCXHUzMDU5XHUzMDY3XHUzMDZCXHU1QjU4XHU1NzI4XHUzMDU3XHUzMDdFXHUzMDU5In0sCisgICAgICAgIHsiRG8ueW91LnN0aWxsLndhbnQudG8uYWRkLml0Lm5vLiIsCisgICAgICAgICAgICAgICAgIlx1OEZGRFx1NTJBMFx1MzA1N1x1MzA3RVx1MzA1OVx1MzA0Qlx1MzAwMltcdTMwNDRcdTMwNDRcdTMwNDhdOiAgIn0sCisgICAgICAgIHsiQ2VydGlmaWNhdGUuYWxyZWFkeS5leGlzdHMuaW4uc3lzdGVtLndpZGUuQ0Eua2V5c3RvcmUudW5kZXIuYWxpYXMudHJ1c3RhbGlhcy4iLAorICAgICAgICAgICAgICAgICJcdThBM0NcdTY2MEVcdTY2RjhcdTMwNkZcdTMwMDFcdTUyMjVcdTU0MEQ8ezB9Plx1MzA2RVx1MzBCN1x1MzBCOVx1MzBDNlx1MzBFMFx1ODk4Rlx1NkEyMVx1MzA2RUNBXHUzMEFEXHUzMEZDXHUzMEI5XHUzMEM4XHUzMEEyXHU1MTg1XHUzMDZCXHUzMDU5XHUzMDY3XHUzMDZCXHU1QjU4XHU1NzI4XHUzMDU3XHUzMDdFXHUzMDU5In0sCisgICAgICAgIHsiRG8ueW91LnN0aWxsLndhbnQudG8uYWRkLml0LnRvLnlvdXIub3duLmtleXN0b3JlLm5vLiIsCisgICAgICAgICAgICAgICAgIlx1MzBBRFx1MzBGQ1x1MzBCOVx1MzBDOFx1MzBBMlx1MzA2Qlx1OEZGRFx1NTJBMFx1MzA1N1x1MzA3RVx1MzA1OVx1MzA0Qlx1MzAwMiBbXHUzMDQ0XHUzMDQ0XHUzMDQ4XTogICJ9LAorICAgICAgICB7IlRydXN0LnRoaXMuY2VydGlmaWNhdGUubm8uIiwgIlx1MzA1M1x1MzA2RVx1OEEzQ1x1NjYwRVx1NjZGOFx1MzA5Mlx1NEZFMVx1OTgzQ1x1MzA1N1x1MzA3RVx1MzA1OVx1MzA0Qlx1MzAwMiBbXHUzMDQ0XHUzMDQ0XHUzMDQ4XTogICJ9LAorICAgICAgICB7IllFUyIsICJcdTMwNkZcdTMwNDQifSwKKyAgICAgICAgeyJOZXcucHJvbXB0LiIsICJcdTY1QjBcdTg5OEZ7MH06ICJ9LAorICAgICAgICB7IlBhc3N3b3Jkcy5tdXN0LmRpZmZlciIsICJcdTMwRDFcdTMwQjlcdTMwRUZcdTMwRkNcdTMwQzlcdTMwNkZcdTc1NzBcdTMwNkFcdTMwNjNcdTMwNjZcdTMwNDRcdTMwOEJcdTVGQzVcdTg5ODFcdTMwNENcdTMwNDJcdTMwOEFcdTMwN0VcdTMwNTkifSwKKyAgICAgICAgeyJSZS5lbnRlci5uZXcucHJvbXB0LiIsICJcdTY1QjBcdTg5OEZ7MH1cdTMwOTJcdTUxOERcdTUxNjVcdTUyOUJcdTMwNTdcdTMwNjZcdTMwNEZcdTMwNjBcdTMwNTVcdTMwNDQ6ICJ9LAorICAgICAgICB7IlJlLmVudGVyLm5ldy5wYXNzd29yZC4iLCAiXHU2NUIwXHU4OThGXHUzMEQxXHUzMEI5XHUzMEVGXHUzMEZDXHUzMEM5XHUzMDkyXHU1MThEXHU1MTY1XHU1MjlCXHUzMDU3XHUzMDY2XHUzMDRGXHUzMDYwXHUzMDU1XHUzMDQ0OiAifSwKKyAgICAgICAgeyJUaGV5LmRvbi50Lm1hdGNoLlRyeS5hZ2FpbiIsICJcdTRFMDBcdTgxRjRcdTMwNTdcdTMwN0VcdTMwNUJcdTMwOTNcdTMwMDJcdTMwODJcdTMwNDZcdTRFMDBcdTVFQTZcdTVCOUZcdTg4NENcdTMwNTdcdTMwNjZcdTMwNEZcdTMwNjBcdTMwNTVcdTMwNDQifSwKKyAgICAgICAgeyJFbnRlci5wcm9tcHQuYWxpYXMubmFtZS4iLCAiezB9XHUzMDZFXHU1MjI1XHU1NDBEXHUzMDkyXHU1MTY1XHU1MjlCXHUzMDU3XHUzMDY2XHUzMDRGXHUzMDYwXHUzMDU1XHUzMDQ0OiAgIn0sCisgICAgICAgIHsiRW50ZXIubmV3LmFsaWFzLm5hbWUuUkVUVVJOLnRvLmNhbmNlbC5pbXBvcnQuZm9yLnRoaXMuZW50cnkuIiwKKyAgICAgICAgICAgICAgICAgIlx1NjVCMFx1MzA1N1x1MzA0NFx1NTIyNVx1NTQwRFx1MzA5Mlx1NTE2NVx1NTI5Qlx1MzA1N1x1MzA2Nlx1MzA0Rlx1MzA2MFx1MzA1NVx1MzA0NFx0KFx1MzA1M1x1MzA2RVx1MzBBOFx1MzBGM1x1MzBDOFx1MzBFQVx1MzA2RVx1MzBBNFx1MzBGM1x1MzBERFx1MzBGQ1x1MzBDOFx1MzA5Mlx1NTNENlx1MzA4QVx1NkQ4OFx1MzA1OVx1NTgzNFx1NTQwOFx1MzA2RlJFVFVSTlx1MzA5Mlx1NjJCQ1x1MzA1N1x1MzA2Nlx1MzA0Rlx1MzA2MFx1MzA1NVx1MzA0NCk6ICAifSwKKyAgICAgICAgeyJFbnRlci5hbGlhcy5uYW1lLiIsICJcdTUyMjVcdTU0MERcdTMwOTJcdTUxNjVcdTUyOUJcdTMwNTdcdTMwNjZcdTMwNEZcdTMwNjBcdTMwNTVcdTMwNDQ6ICAifSwKKyAgICAgICAgeyIuUkVUVVJOLmlmLnNhbWUuYXMuZm9yLm90aGVyQWxpYXMuIiwKKyAgICAgICAgICAgICAgICAiXHQoPHswfT5cdTMwNjhcdTU0MENcdTMwNThcdTU4MzRcdTU0MDhcdTMwNkZSRVRVUk5cdTMwOTJcdTYyQkNcdTMwNTdcdTMwNjZcdTMwNEZcdTMwNjBcdTMwNTVcdTMwNDQpIn0sCisgICAgICAgIHsiLlBBVFRFUk4ucHJpbnRYNTA5Q2VydCIsCisgICAgICAgICAgICAgICAgIlx1NjI0MFx1NjcwOVx1ODAwNTogezB9XG5cdTc2N0FcdTg4NENcdTgwMDU6IHsxfVxuXHUzMEI3XHUzMEVBXHUzMEEyXHUzMEVCXHU3NTZBXHU1M0Y3OiB7Mn1cblx1NjcwOVx1NTJCOVx1NjcxRlx1OTU5M1x1MzA2RVx1OTU4Qlx1NTlDQlx1NjVFNTogezN9XHU3RDQyXHU0RTg2XHU2NUU1OiB7NH1cblx1OEEzQ1x1NjYwRVx1NjZGOFx1MzA2RVx1MzBENVx1MzBBM1x1MzBGM1x1MzBBQ1x1MzBEN1x1MzBFQVx1MzBGM1x1MzBDODpcblx0IE1ENTogIHs1fVxuXHQgU0hBMTogezZ9XG5cdCBTSEEyNTY6IHs3fVxuXHQgXHU3RjcyXHU1NDBEXHUzMEEyXHUzMEVCXHUzMEI0XHUzMEVBXHUzMEJBXHUzMEUwXHU1NDBEOiB7OH1cblx0IFx1MzBEMFx1MzBGQ1x1MzBCOFx1MzBFN1x1MzBGMzogezl9In0sCisgICAgICAgIHsiV2hhdC5pcy55b3VyLmZpcnN0LmFuZC5sYXN0Lm5hbWUuIiwKKyAgICAgICAgICAgICAgICAiXHU1OUQzXHU1NDBEXHUzMDkyXHU1MTY1XHU1MjlCXHUzMDU3XHUzMDY2XHUzMDRGXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyIn0sCisgICAgICAgIHsiV2hhdC5pcy50aGUubmFtZS5vZi55b3VyLm9yZ2FuaXphdGlvbmFsLnVuaXQuIiwKKyAgICAgICAgICAgICAgICAiXHU3RDQ0XHU3RTU0XHU1MzU4XHU0RjREXHU1NDBEXHUzMDkyXHU1MTY1XHU1MjlCXHUzMDU3XHUzMDY2XHUzMDRGXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyIn0sCisgICAgICAgIHsiV2hhdC5pcy50aGUubmFtZS5vZi55b3VyLm9yZ2FuaXphdGlvbi4iLAorICAgICAgICAgICAgICAgICJcdTdENDRcdTdFNTRcdTU0MERcdTMwOTJcdTUxNjVcdTUyOUJcdTMwNTdcdTMwNjZcdTMwNEZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDIifSwKKyAgICAgICAgeyJXaGF0LmlzLnRoZS5uYW1lLm9mLnlvdXIuQ2l0eS5vci5Mb2NhbGl0eS4iLAorICAgICAgICAgICAgICAgICJcdTkwRkRcdTVFMDJcdTU0MERcdTMwN0VcdTMwNUZcdTMwNkZcdTU3MzBcdTU3REZcdTU0MERcdTMwOTJcdTUxNjVcdTUyOUJcdTMwNTdcdTMwNjZcdTMwNEZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDIifSwKKyAgICAgICAgeyJXaGF0LmlzLnRoZS5uYW1lLm9mLnlvdXIuU3RhdGUub3IuUHJvdmluY2UuIiwKKyAgICAgICAgICAgICAgICAiXHU5MEZEXHU5MDUzXHU1RTlDXHU3NzBDXHU1NDBEXHUzMDkyXHU1MTY1XHU1MjlCXHUzMDU3XHUzMDY2XHUzMDRGXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyIn0sCisgICAgICAgIHsiV2hhdC5pcy50aGUudHdvLmxldHRlci5jb3VudHJ5LmNvZGUuZm9yLnRoaXMudW5pdC4iLAorICAgICAgICAgICAgICAgICJcdTMwNTNcdTMwNkVcdTUzNThcdTRGNERcdTMwNkJcdThBNzJcdTVGNTNcdTMwNTlcdTMwOEIyXHU2NTg3XHU1QjU3XHUzMDZFXHU1NkZEXHUzMEIzXHUzMEZDXHUzMEM5XHUzMDkyXHU1MTY1XHU1MjlCXHUzMDU3XHUzMDY2XHUzMDRGXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyIn0sCisgICAgICAgIHsiSXMubmFtZS5jb3JyZWN0LiIsICJ7MH1cdTMwNjdcdTMwODhcdTMwOERcdTMwNTdcdTMwNDRcdTMwNjdcdTMwNTlcdTMwNEJcdTMwMDIifSwKKyAgICAgICAgeyJubyIsICJcdTMwNDRcdTMwNDRcdTMwNDgifSwKKyAgICAgICAgeyJ5ZXMiLCAiXHUzMDZGXHUzMDQ0In0sCisgICAgICAgIHsieSIsICJ5In0sCisgICAgICAgIHsiLmRlZmF1bHRWYWx1ZS4iLCAiICBbezB9XTogICJ9LAorICAgICAgICB7IkFsaWFzLmFsaWFzLmhhcy5uby5rZXkiLAorICAgICAgICAgICAgICAgICJcdTUyMjVcdTU0MEQ8ezB9Plx1MzA2Qlx1MzA2Rlx1OTM3NVx1MzA0Q1x1MzA0Mlx1MzA4QVx1MzA3RVx1MzA1Qlx1MzA5MyJ9LAorICAgICAgICB7IkFsaWFzLmFsaWFzLnJlZmVyZW5jZXMuYW4uZW50cnkudHlwZS50aGF0LmlzLm5vdC5hLnByaXZhdGUua2V5LmVudHJ5LlRoZS5rZXljbG9uZS5jb21tYW5kLm9ubHkuc3VwcG9ydHMuY2xvbmluZy5vZi5wcml2YXRlLmtleSIsCisgICAgICAgICAgICAgICAgICJcdTUyMjVcdTU0MEQ8ezB9Plx1MzA0Q1x1NTNDMlx1NzE2N1x1MzA1N1x1MzA2Nlx1MzA0NFx1MzA4Qlx1MzBBOFx1MzBGM1x1MzBDOFx1MzBFQVx1MzBGQlx1MzBCRlx1MzBBNFx1MzBEN1x1MzA2Rlx1NzlEOFx1NUJDNlx1OTM3NVx1MzBBOFx1MzBGM1x1MzBDOFx1MzBFQVx1MzA2N1x1MzA2Rlx1MzA0Mlx1MzA4QVx1MzA3RVx1MzA1Qlx1MzA5M1x1MzAwMi1rZXljbG9uZVx1MzBCM1x1MzBERVx1MzBGM1x1MzBDOVx1MzA2Rlx1NzlEOFx1NUJDNlx1OTM3NVx1MzBBOFx1MzBGM1x1MzBDOFx1MzBFQVx1MzA2RVx1MzBBRlx1MzBFRFx1MzBGQ1x1MzBGM1x1NEY1Q1x1NjIxMFx1MzA2RVx1MzA3Rlx1MzA5Mlx1MzBCNVx1MzBERFx1MzBGQ1x1MzBDOFx1MzA1N1x1MzA3RVx1MzA1OSJ9LAorCisgICAgICAgIHsiLldBUk5JTkcuV0FSTklORy5XQVJOSU5HLiIsCisgICAgICAgICAgICAiKioqKioqKioqKioqKioqKipcdThCNjZcdTU0NEEgXHU4QjY2XHU1NDRBIFx1OEI2Nlx1NTQ0QSoqKioqKioqKioqKioqKioqIn0sCisgICAgICAgIHsiU2lnbmVyLmQuIiwgIlx1N0Y3Mlx1NTQwRFx1ODAwNVx1NzU2QVx1NTNGNyVkOiJ9LAorICAgICAgICB7IlRpbWVzdGFtcC4iLCAiXHUzMEJGXHUzMEE0XHUzMEUwXHUzMEI5XHUzMEJGXHUzMEYzXHUzMEQ3OiJ9LAorICAgICAgICB7IlNpZ25hdHVyZS4iLCAiXHU3RjcyXHU1NDBEOiJ9LAorICAgICAgICB7IkNSTHMuIiwgIkNSTDoifSwKKyAgICAgICAgeyJDZXJ0aWZpY2F0ZS5vd25lci4iLCAiXHU4QTNDXHU2NjBFXHU2NkY4XHUzMDZFXHU2MjQwXHU2NzA5XHU4MDA1OiAifSwKKyAgICAgICAgeyJOb3QuYS5zaWduZWQuamFyLmZpbGUiLCAiXHU3RjcyXHU1NDBEXHU0RUQ4XHUzMDRESkFSXHUzMEQ1XHUzMEExXHUzMEE0XHUzMEVCXHUzMDY3XHUzMDZGXHUzMDQyXHUzMDhBXHUzMDdFXHUzMDVCXHUzMDkzIn0sCisgICAgICAgIHsiTm8uY2VydGlmaWNhdGUuZnJvbS50aGUuU1NMLnNlcnZlciIsCisgICAgICAgICAgICAgICAgIlNTTFx1MzBCNVx1MzBGQ1x1MzBEMFx1MzBGQ1x1MzA0Qlx1MzA4OVx1MzA2RVx1OEEzQ1x1NjYwRVx1NjZGOFx1MzA0Q1x1MzA0Mlx1MzA4QVx1MzA3RVx1MzA1Qlx1MzA5MyJ9LAorCisgICAgICAgIHsiLlRoZS5pbnRlZ3JpdHkub2YudGhlLmluZm9ybWF0aW9uLnN0b3JlZC5pbi55b3VyLmtleXN0b3JlLiIsCisgICAgICAgICAgICAiKlx1MzBBRFx1MzBGQ1x1MzBCOVx1MzBDOFx1MzBBMlx1MzA2Qlx1NEZERFx1NUI1OFx1MzA1NVx1MzA4Q1x1MzA1Rlx1NjBDNVx1NTgzMVx1MzA2RVx1NjU3NFx1NTQwOFx1NjAyN1x1MzA2RipcbipcdTY5MUNcdThBM0NcdTMwNTVcdTMwOENcdTMwNjZcdTMwNDRcdTMwN0VcdTMwNUJcdTMwOTNcdTMwMDJcdTY1NzRcdTU0MDhcdTYwMjdcdTMwOTJcdTY5MUNcdThBM0NcdTMwNTlcdTMwOEJcdTMwNkJcdTMwNkYqXG4qXHUzMEFEXHUzMEZDXHUzMEI5XHUzMEM4XHUzMEEyXHUzMDZFXHUzMEQxXHUzMEI5XHUzMEVGXHUzMEZDXHUzMEM5XHUzMDkyXHU1MTY1XHU1MjlCXHUzMDU5XHUzMDhCXHU1RkM1XHU4OTgxXHUzMDRDXHUzMDQyXHUzMDhBXHUzMDdFXHUzMDU5XHUzMDAyKiJ9LAorICAgICAgICB7Ii5UaGUuaW50ZWdyaXR5Lm9mLnRoZS5pbmZvcm1hdGlvbi5zdG9yZWQuaW4udGhlLnNyY2tleXN0b3JlLiIsCisgICAgICAgICAgICAiKlx1MzBCRFx1MzBGQ1x1MzBCOVx1MzBGQlx1MzBBRFx1MzBGQ1x1MzBCOVx1MzBDOFx1MzBBMlx1MzA2Qlx1NEZERFx1NUI1OFx1MzA1NVx1MzA4Q1x1MzA1Rlx1NjBDNVx1NTgzMVx1MzA2RVx1NjU3NFx1NTQwOFx1NjAyN1x1MzA2RipcbipcdTY5MUNcdThBM0NcdTMwNTVcdTMwOENcdTMwNjZcdTMwNDRcdTMwN0VcdTMwNUJcdTMwOTNcdTMwMDJcdTY1NzRcdTU0MDhcdTYwMjdcdTMwOTJcdTY5MUNcdThBM0NcdTMwNTlcdTMwOEJcdTMwNkJcdTMwNkYqXG4qXHUzMEJEXHUzMEZDXHUzMEI5XHUzMEZCXHUzMEFEXHUzMEZDXHUzMEI5XHUzMEM4XHUzMEEyXHUzMDZFXHUzMEQxXHUzMEI5XHUzMEVGXHUzMEZDXHUzMEM5XHUzMDkyXHU1MTY1XHU1MjlCXHUzMDU5XHUzMDhCXHU1RkM1XHU4OTgxXHUzMDRDXHUzMDQyXHUzMDhBXHUzMDdFXHUzMDU5XHUzMDAyKiJ9LAorCisgICAgICAgIHsiQ2VydGlmaWNhdGUucmVwbHkuZG9lcy5ub3QuY29udGFpbi5wdWJsaWMua2V5LmZvci5hbGlhcy4iLAorICAgICAgICAgICAgICAgICJcdThBM0NcdTY2MEVcdTY2RjhcdTVGRENcdTdCNTRcdTMwNkJcdTMwNkZcdTMwMDE8ezB9Plx1MzA2RVx1NTE2Q1x1OTU4Qlx1OTM3NVx1MzA2Rlx1NTQyQlx1MzA3RVx1MzA4Q1x1MzA3RVx1MzA1Qlx1MzA5MyJ9LAorICAgICAgICB7IkluY29tcGxldGUuY2VydGlmaWNhdGUuY2hhaW4uaW4ucmVwbHkiLAorICAgICAgICAgICAgICAgICJcdTVGRENcdTdCNTRcdTMwNTdcdTMwNUZcdThBM0NcdTY2MEVcdTY2RjhcdTMwQzFcdTMwQTdcdTMwRkNcdTMwRjNcdTMwNkZcdTRFMERcdTVCOENcdTUxNjhcdTMwNjdcdTMwNTkifSwKKyAgICAgICAgeyJDZXJ0aWZpY2F0ZS5jaGFpbi5pbi5yZXBseS5kb2VzLm5vdC52ZXJpZnkuIiwKKyAgICAgICAgICAgICAgICAiXHU1RkRDXHU3QjU0XHUzMDU3XHUzMDVGXHU4QTNDXHU2NjBFXHU2NkY4XHUzMEMxXHUzMEE3XHUzMEZDXHUzMEYzXHUzMDZGXHU2OTFDXHU4QTNDXHUzMDU1XHUzMDhDXHUzMDY2XHUzMDQ0XHUzMDdFXHUzMDVCXHUzMDkzOiAifSwKKyAgICAgICAgeyJUb3AubGV2ZWwuY2VydGlmaWNhdGUuaW4ucmVwbHkuIiwKKyAgICAgICAgICAgICAgICAiXHU1RkRDXHU3QjU0XHUzMDU3XHUzMDVGXHUzMEM4XHUzMEMzXHUzMEQ3XHUzMEVDXHUzMEQ5XHUzMEVCXHUzMDZFXHU4QTNDXHU2NjBFXHU2NkY4OlxuIn0sCisgICAgICAgIHsiLmlzLm5vdC50cnVzdGVkLiIsICIuLi4gXHUzMDZGXHU0RkUxXHU5ODNDXHUzMDU1XHUzMDhDXHUzMDY2XHUzMDQ0XHUzMDdFXHUzMDVCXHUzMDkzXHUzMDAyICJ9LAorICAgICAgICB7Ikluc3RhbGwucmVwbHkuYW55d2F5Lm5vLiIsICJcdTVGRENcdTdCNTRcdTMwOTJcdTMwQTRcdTMwRjNcdTMwQjlcdTMwQzhcdTMwRkNcdTMwRUJcdTMwNTdcdTMwN0VcdTMwNTlcdTMwNEJcdTMwMDJbXHUzMDQ0XHUzMDQ0XHUzMDQ4XTogICJ9LAorICAgICAgICB7Ik5PIiwgIlx1MzA0NFx1MzA0NFx1MzA0OCJ9LAorICAgICAgICB7IlB1YmxpYy5rZXlzLmluLnJlcGx5LmFuZC5rZXlzdG9yZS5kb24udC5tYXRjaCIsCisgICAgICAgICAgICAgICAgIlx1NUZEQ1x1N0I1NFx1MzA1N1x1MzA1Rlx1NTE2Q1x1OTU4Qlx1OTM3NVx1MzA2OFx1MzBBRFx1MzBGQ1x1MzBCOVx1MzBDOFx1MzBBMlx1MzA0Q1x1NEUwMFx1ODFGNFx1MzA1N1x1MzA3RVx1MzA1Qlx1MzA5MyJ9LAorICAgICAgICB7IkNlcnRpZmljYXRlLnJlcGx5LmFuZC5jZXJ0aWZpY2F0ZS5pbi5rZXlzdG9yZS5hcmUuaWRlbnRpY2FsIiwKKyAgICAgICAgICAgICAgICAiXHU4QTNDXHU2NjBFXHU2NkY4XHU1RkRDXHU3QjU0XHUzMDY4XHUzMEFEXHUzMEZDXHUzMEI5XHUzMEM4XHUzMEEyXHU1MTg1XHUzMDZFXHU4QTNDXHU2NjBFXHU2NkY4XHUzMDRDXHU1NDBDXHUzMDU4XHUzMDY3XHUzMDU5In0sCisgICAgICAgIHsiRmFpbGVkLnRvLmVzdGFibGlzaC5jaGFpbi5mcm9tLnJlcGx5IiwKKyAgICAgICAgICAgICAgICAiXHU1RkRDXHU3QjU0XHUzMDRCXHUzMDg5XHU5MDIzXHU5Mzk2XHUzMDkyXHU3OEJBXHU3QUNCXHUzMDY3XHUzMDREXHUzMDdFXHUzMDVCXHUzMDkzXHUzMDY3XHUzMDU3XHUzMDVGIn0sCisgICAgICAgIHsibiIsICJuIn0sCisgICAgICAgIHsiV3JvbmcuYW5zd2VyLnRyeS5hZ2FpbiIsICJcdTVGRENcdTdCNTRcdTMwNENcdTk1OTNcdTkwNTVcdTMwNjNcdTMwNjZcdTMwNDRcdTMwN0VcdTMwNTlcdTMwMDJcdTMwODJcdTMwNDZcdTRFMDBcdTVFQTZcdTVCOUZcdTg4NENcdTMwNTdcdTMwNjZcdTMwNEZcdTMwNjBcdTMwNTVcdTMwNDQifSwKKyAgICAgICAgeyJTZWNyZXQua2V5Lm5vdC5nZW5lcmF0ZWQuYWxpYXMuYWxpYXMuYWxyZWFkeS5leGlzdHMiLAorICAgICAgICAgICAgICAgICJcdTc5RDhcdTVCQzZcdTkzNzVcdTMwNkZcdTc1MUZcdTYyMTBcdTMwNTVcdTMwOENcdTMwN0VcdTMwNUJcdTMwOTNcdTMwNjdcdTMwNTdcdTMwNUZcdTMwMDJcdTUyMjVcdTU0MEQ8ezB9Plx1MzA2Rlx1MzA1OVx1MzA2N1x1MzA2Qlx1NUI1OFx1NTcyOFx1MzA1N1x1MzA3RVx1MzA1OSJ9LAorICAgICAgICB7IlBsZWFzZS5wcm92aWRlLmtleXNpemUuZm9yLnNlY3JldC5rZXkuZ2VuZXJhdGlvbiIsCisgICAgICAgICAgICAgICAgIlx1NzlEOFx1NUJDNlx1OTM3NVx1MzA2RVx1NzUxRlx1NjIxMFx1NjY0Mlx1MzA2Qlx1MzA2RiAta2V5c2l6ZVx1MzA5Mlx1NjMwN1x1NUI5QVx1MzA1N1x1MzA2Nlx1MzA0Rlx1MzA2MFx1MzA1NVx1MzA0NCJ9LAorCisgICAgICAgIHsiRXh0ZW5zaW9ucy4iLCAiXHU2MkUxXHU1RjM1OiAifSwKKyAgICAgICAgeyIuRW1wdHkudmFsdWUuIiwgIihcdTdBN0FcdTMwNkVcdTUwMjQpIn0sCisgICAgICAgIHsiRXh0ZW5zaW9uLlJlcXVlc3QuIiwgIlx1NjJFMVx1NUYzNVx1MzBFQVx1MzBBRlx1MzBBOFx1MzBCOVx1MzBDODoifSwKKyAgICAgICAgeyJQS0NTLjEwLkNlcnRpZmljYXRlLlJlcXVlc3QuVmVyc2lvbi4xLjAuU3ViamVjdC5zLlB1YmxpYy5LZXkucy5mb3JtYXQucy5rZXkuIiwKKyAgICAgICAgICAgICAgICAiUEtDUyAjMTBcdThBM0NcdTY2MEVcdTY2RjhcdTMwRUFcdTMwQUZcdTMwQThcdTMwQjlcdTMwQzgoXHUzMEQwXHUzMEZDXHUzMEI4XHUzMEU3XHUzMEYzMS4wKVxuXHUzMEI1XHUzMEQ2XHUzMEI4XHUzMEE3XHUzMEFGXHUzMEM4OiAlc1xuXHU1MTZDXHU5NThCXHU5Mzc1OiAlcyBcdTMwRDVcdTMwQTlcdTMwRkNcdTMwREVcdTMwQzNcdTMwQzggJXMgXHUzMEFEXHUzMEZDXG4ifSwKKyAgICAgICAgeyJVbmtub3duLmtleVVzYWdlLnR5cGUuIiwgIlx1NEUwRFx1NjYwRVx1MzA2QWtleVVzYWdlXHUzMEJGXHUzMEE0XHUzMEQ3OiAifSwKKyAgICAgICAgeyJVbmtub3duLmV4dGVuZGVka2V5VXNhZ2UudHlwZS4iLCAiXHU0RTBEXHU2NjBFXHUzMDZBZXh0ZW5kZWRrZXlVc2FnZVx1MzBCRlx1MzBBNFx1MzBENzogIn0sCisgICAgICAgIHsiVW5rbm93bi5BY2Nlc3NEZXNjcmlwdGlvbi50eXBlLiIsICJcdTRFMERcdTY2MEVcdTMwNkFBY2Nlc3NEZXNjcmlwdGlvblx1MzBCRlx1MzBBNFx1MzBENzogIn0sCisgICAgICAgIHsiVW5yZWNvZ25pemVkLkdlbmVyYWxOYW1lLnR5cGUuIiwgIlx1OEE4RFx1OEI1OFx1MzA1NVx1MzA4Q1x1MzA2QVx1MzA0NEdlbmVyYWxOYW1lXHUzMEJGXHUzMEE0XHUzMEQ3OiAifSwKKyAgICAgICAgeyJUaGlzLmV4dGVuc2lvbi5jYW5ub3QuYmUubWFya2VkLmFzLmNyaXRpY2FsLiIsCisgICAgICAgICAgICAgICAgICJcdTMwNTNcdTMwNkVcdTYyRTFcdTVGMzVcdTMwNkZcdTMwQUZcdTMwRUFcdTMwQzZcdTMwQTNcdTMwQUJcdTMwRUJcdTMwNjhcdTMwNTdcdTMwNjZcdTMwREVcdTMwRkNcdTMwQUZcdTRFRDhcdTMwNTFcdTMwNjdcdTMwNERcdTMwN0VcdTMwNUJcdTMwOTNcdTMwMDIgIn0sCisgICAgICAgIHsiT2RkLm51bWJlci5vZi5oZXguZGlnaXRzLmZvdW5kLiIsICJcdTU5NDdcdTY1NzBcdTMwNkUxNlx1OTAzMlx1NjU3MFx1MzA0Q1x1ODk4Qlx1MzA2NFx1MzA0Qlx1MzA4QVx1MzA3RVx1MzA1N1x1MzA1RjogIn0sCisgICAgICAgIHsiVW5rbm93bi5leHRlbnNpb24udHlwZS4iLCAiXHU0RTBEXHU2NjBFXHUzMDZBXHU2MkUxXHU1RjM1XHUzMEJGXHUzMEE0XHUzMEQ3OiAifSwKKyAgICAgICAgeyJjb21tYW5kLnswfS5pcy5hbWJpZ3VvdXMuIiwgIlx1MzBCM1x1MzBERVx1MzBGM1x1MzBDOXswfVx1MzA2Rlx1MzA0Mlx1MzA0NFx1MzA3RVx1MzA0NFx1MzA2N1x1MzA1OToifQorICAgIH07CisKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGNvbnRlbnRzIG9mIHRoaXMgPGNvZGU+UmVzb3VyY2VCdW5kbGU8L2NvZGU+LgorICAgICAqCisgICAgICogPHA+CisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBjb250ZW50cyBvZiB0aGlzIDxjb2RlPlJlc291cmNlQnVuZGxlPC9jb2RlPi4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0W11bXSBnZXRDb250ZW50cygpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRlbnRzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdG9vbHMva2V5dG9vbC9SZXNvdXJjZXNfa28uamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdG9vbHMva2V5dG9vbC9SZXNvdXJjZXNfa28uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjNmNzBmCi0tLSAvZGV2L251bGwKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS90b29scy9rZXl0b29sL1Jlc291cmNlc19rby5qYXZhCkBAIC0wLDAgKzEsNDMxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBPcmFjbGUgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKKyAqIHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIHN1bi5zZWN1cml0eS50b29scy5rZXl0b29sOworCisvKioKKyAqIDxwPiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIDxjb2RlPlJlc291cmNlQnVuZGxlPC9jb2RlPgorICogZm9yIHRoZSBrZXl0b29sLgorICoKKyAqLworcHVibGljIGNsYXNzIFJlc291cmNlc19rbyBleHRlbmRzIGphdmEudXRpbC5MaXN0UmVzb3VyY2VCdW5kbGUgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W11bXSBjb250ZW50cyA9IHsKKyAgICAgICAgeyJORVdMSU5FIiwgIlxuIn0sCisgICAgICAgIHsiU1RBUiIsCisgICAgICAgICAgICAgICAgIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioifSwKKyAgICAgICAgeyJTVEFSTk4iLAorICAgICAgICAgICAgICAgICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cbiJ9LAorCisgICAgICAgIC8vIGtleXRvb2w6IEhlbHAgcGFydAorLy8gIk9wdGlvbiIgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCisgICAgICAgIHsiLk9QVElPTi4iLCAiIFtcdUM2MzVcdUMxNThdLi4uIn0sCisgICAgICAgIHsiT3B0aW9ucy4iLCAiXHVDNjM1XHVDMTU4OiJ9LAorICAgICAgICB7IlVzZS5rZXl0b29sLmhlbHAuZm9yLmFsbC5hdmFpbGFibGUuY29tbWFuZHMiLAorICAgICAgICAgICAgICAgICAiXHVDMEFDXHVDNkE5IFx1QUMwMFx1QjJBNVx1RDU1QyBcdUJBQThcdUI0RTAgXHVCQTg1XHVCODM5XHVDNUQwIFwia2V5dG9vbCAtaGVscFwiIFx1QzBBQ1x1QzZBOSJ9LAorICAgICAgICB7IktleS5hbmQuQ2VydGlmaWNhdGUuTWFuYWdlbWVudC5Ub29sIiwKKyAgICAgICAgICAgICAgICAgIlx1RDBBNCBcdUJDMEYgXHVDNzc4XHVDOTlEXHVDMTFDIFx1QUQwMFx1QjlBQyBcdUQyMzQifSwKKyAgICAgICAgeyJDb21tYW5kcy4iLCAiXHVCQTg1XHVCODM5OiJ9LAorICAgICAgICB7IlVzZS5rZXl0b29sLmNvbW1hbmQubmFtZS5oZWxwLmZvci51c2FnZS5vZi5jb21tYW5kLm5hbWUiLAorICAgICAgICAgICAgICAgICJjb21tYW5kX25hbWUgXHVDMEFDXHVDNkE5XHVCQzk1XHVDNUQwIFwia2V5dG9vbCAtY29tbWFuZF9uYW1lIC1oZWxwXCIgXHVDMEFDXHVDNkE5In0sCisgICAgICAgIC8vIGtleXRvb2w6IGhlbHA6IGNvbW1hbmRzCisgICAgICAgIHsiR2VuZXJhdGVzLmEuY2VydGlmaWNhdGUucmVxdWVzdCIsCisgICAgICAgICAgICAgICAgIlx1Qzc3OFx1Qzk5RFx1QzExQyBcdUM2OTRcdUNDQURcdUM3NDQgXHVDMEREXHVDMTMxXHVENTY5XHVCMkM4XHVCMkU0LiJ9LCAvLy1jZXJ0cmVxCisgICAgICAgIHsiQ2hhbmdlcy5hbi5lbnRyeS5zLmFsaWFzIiwKKyAgICAgICAgICAgICAgICAiXHVENTZEXHVCQUE5XHVDNzU4IFx1QkNDNFx1Q0U2RFx1Qzc0NCBcdUJDQzBcdUFDQkRcdUQ1NjlcdUIyQzhcdUIyRTQuIn0sIC8vLWNoYW5nZWFsaWFzCisgICAgICAgIHsiRGVsZXRlcy5hbi5lbnRyeSIsCisgICAgICAgICAgICAgICAgIlx1RDU2RFx1QkFBOVx1Qzc0NCBcdUMwQURcdUM4MUNcdUQ1NjlcdUIyQzhcdUIyRTQuIn0sIC8vLWRlbGV0ZQorICAgICAgICB7IkV4cG9ydHMuY2VydGlmaWNhdGUiLAorICAgICAgICAgICAgICAgICJcdUM3NzhcdUM5OURcdUMxMUNcdUI5N0MgXHVDNzc1XHVDMkE0XHVEM0VDXHVEMkI4XHVENTY5XHVCMkM4XHVCMkU0LiJ9LCAvLy1leHBvcnRjZXJ0CisgICAgICAgIHsiR2VuZXJhdGVzLmEua2V5LnBhaXIiLAorICAgICAgICAgICAgICAgICJcdUQwQTQgXHVDMzBEXHVDNzQ0IFx1QzBERFx1QzEzMVx1RDU2OVx1QjJDOFx1QjJFNC4ifSwgLy8tZ2Vua2V5cGFpcgorLy8gdHJhbnNsYXRpb24gb2YgInNlY3JldCIga2V5IHNob3VsZCBiZSBkaWZmZXJlbnQgdG8gInByaXZhdGUiIGtleS4KKyAgICAgICAgeyJHZW5lcmF0ZXMuYS5zZWNyZXQua2V5IiwKKyAgICAgICAgICAgICAgICAiXHVCQ0Y0XHVDNTQ4IFx1RDBBNFx1Qjk3QyBcdUMwRERcdUMxMzFcdUQ1NjlcdUIyQzhcdUIyRTQuIn0sIC8vLWdlbnNlY2tleQorICAgICAgICB7IkdlbmVyYXRlcy5jZXJ0aWZpY2F0ZS5mcm9tLmEuY2VydGlmaWNhdGUucmVxdWVzdCIsCisgICAgICAgICAgICAgICAgIlx1Qzc3OFx1Qzk5RFx1QzExQyBcdUM2OTRcdUNDQURcdUM1RDBcdUMxMUMgXHVDNzc4XHVDOTlEXHVDMTFDXHVCOTdDIFx1QzBERFx1QzEzMVx1RDU2OVx1QjJDOFx1QjJFNC4ifSwgLy8tZ2VuY2VydAorICAgICAgICB7IkdlbmVyYXRlcy5DUkwiLCAiQ1JMXHVDNzQ0IFx1QzBERFx1QzEzMVx1RDU2OVx1QjJDOFx1QjJFNC4ifSwgLy8tZ2VuY3JsCisgICAgICAgIHsiSW1wb3J0cy5lbnRyaWVzLmZyb20uYS5KREsuMS4xLnguc3R5bGUuaWRlbnRpdHkuZGF0YWJhc2UiLAorICAgICAgICAgICAgICAgICJKREsgMS4xLnggXHVDMkE0XHVEMEMwXHVDNzdDIElEIFx1QjM3MFx1Qzc3NFx1RDEzMFx1QkNBMFx1Qzc3NFx1QzJBNFx1QzVEMFx1QzExQyBcdUQ1NkRcdUJBQTlcdUM3NDQgXHVDNzg0XHVEM0VDXHVEMkI4XHVENTY5XHVCMkM4XHVCMkU0LiJ9LCAvLy1pZGVudGl0eWRiCisgICAgICAgIHsiSW1wb3J0cy5hLmNlcnRpZmljYXRlLm9yLmEuY2VydGlmaWNhdGUuY2hhaW4iLAorICAgICAgICAgICAgICAgICJcdUM3NzhcdUM5OURcdUMxMUMgXHVCNjEwXHVCMjk0IFx1Qzc3OFx1Qzk5RFx1QzExQyBcdUNDQjRcdUM3NzhcdUM3NDQgXHVDNzg0XHVEM0VDXHVEMkI4XHVENTY5XHVCMkM4XHVCMkU0LiJ9LCAvLy1pbXBvcnRjZXJ0CisgICAgICAgIHsiSW1wb3J0cy5vbmUub3IuYWxsLmVudHJpZXMuZnJvbS5hbm90aGVyLmtleXN0b3JlIiwKKyAgICAgICAgICAgICAgICAiXHVCMkU0XHVCOTc4IFx1RDBBNCBcdUM4MDBcdUM3QTVcdUMxOENcdUM1RDBcdUMxMUMgXHVENTU4XHVCMDk4IFx1QjYxMFx1QjI5NCBcdUJBQThcdUI0RTAgXHVENTZEXHVCQUE5XHVDNzQ0IFx1Qzc4NFx1RDNFQ1x1RDJCOFx1RDU2OVx1QjJDOFx1QjJFNC4ifSwgLy8taW1wb3J0a2V5c3RvcmUKKyAgICAgICAgeyJDbG9uZXMuYS5rZXkuZW50cnkiLAorICAgICAgICAgICAgICAgICJcdUQwQTQgXHVENTZEXHVCQUE5XHVDNzQ0IFx1QkNGNVx1QzgxQ1x1RDU2OVx1QjJDOFx1QjJFNC4ifSwgLy8ta2V5Y2xvbmUKKyAgICAgICAgeyJDaGFuZ2VzLnRoZS5rZXkucGFzc3dvcmQub2YuYW4uZW50cnkiLAorICAgICAgICAgICAgICAgICJcdUQ1NkRcdUJBQTlcdUM3NTggXHVEMEE0IFx1QkU0NFx1QkMwMFx1QkM4OFx1RDYzOFx1Qjk3QyBcdUJDQzBcdUFDQkRcdUQ1NjlcdUIyQzhcdUIyRTQuIn0sIC8vLWtleXBhc3N3ZAorICAgICAgICB7Ikxpc3RzLmVudHJpZXMuaW4uYS5rZXlzdG9yZSIsCisgICAgICAgICAgICAgICAgIlx1RDBBNCBcdUM4MDBcdUM3QTVcdUMxOENcdUM3NTggXHVENTZEXHVCQUE5XHVDNzQ0IFx1QjA5OFx1QzVGNFx1RDU2OVx1QjJDOFx1QjJFNC4ifSwgLy8tbGlzdAorICAgICAgICB7IlByaW50cy50aGUuY29udGVudC5vZi5hLmNlcnRpZmljYXRlIiwKKyAgICAgICAgICAgICAgICAiXHVDNzc4XHVDOTlEXHVDMTFDXHVDNzU4IFx1Q0Y1OFx1RDE1MFx1Q0UyMFx1Qjk3QyBcdUM3NzhcdUMxQzRcdUQ1NjlcdUIyQzhcdUIyRTQuIn0sIC8vLXByaW50Y2VydAorICAgICAgICB7IlByaW50cy50aGUuY29udGVudC5vZi5hLmNlcnRpZmljYXRlLnJlcXVlc3QiLAorICAgICAgICAgICAgICAgICJcdUM3NzhcdUM5OURcdUMxMUMgXHVDNjk0XHVDQ0FEXHVDNzU4IFx1Q0Y1OFx1RDE1MFx1Q0UyMFx1Qjk3QyBcdUM3NzhcdUMxQzRcdUQ1NjlcdUIyQzhcdUIyRTQuIn0sIC8vLXByaW50Y2VydHJlcQorICAgICAgICB7IlByaW50cy50aGUuY29udGVudC5vZi5hLkNSTC5maWxlIiwKKyAgICAgICAgICAgICAgICAiQ1JMIFx1RDMwQ1x1Qzc3Q1x1Qzc1OCBcdUNGNThcdUQxNTBcdUNFMjBcdUI5N0MgXHVDNzc4XHVDMUM0XHVENTY5XHVCMkM4XHVCMkU0LiJ9LCAvLy1wcmludGNybAorICAgICAgICB7IkdlbmVyYXRlcy5hLnNlbGYuc2lnbmVkLmNlcnRpZmljYXRlIiwKKyAgICAgICAgICAgICAgICAiXHVDNzkwXHVDQ0I0IFx1QzExQ1x1QkE4NVx1QjQxQyBcdUM3NzhcdUM5OURcdUMxMUNcdUI5N0MgXHVDMEREXHVDMTMxXHVENTY5XHVCMkM4XHVCMkU0LiJ9LCAvLy1zZWxmY2VydAorICAgICAgICB7IkNoYW5nZXMudGhlLnN0b3JlLnBhc3N3b3JkLm9mLmEua2V5c3RvcmUiLAorICAgICAgICAgICAgICAgICJcdUQwQTQgXHVDODAwXHVDN0E1XHVDMThDXHVDNzU4IFx1QzgwMFx1QzdBNVx1QzE4QyBcdUJFNDRcdUJDMDBcdUJDODhcdUQ2MzhcdUI5N0MgXHVCQ0MwXHVBQ0JEXHVENTY5XHVCMkM4XHVCMkU0LiJ9LCAvLy1zdG9yZXBhc3N3ZAorICAgICAgICAvLyBrZXl0b29sOiBoZWxwOiBvcHRpb25zCisgICAgICAgIHsiYWxpYXMubmFtZS5vZi50aGUuZW50cnkudG8ucHJvY2VzcyIsCisgICAgICAgICAgICAgICAgIlx1Q0M5OFx1QjlBQ1x1RDU2MCBcdUQ1NkRcdUJBQTlcdUM3NTggXHVCQ0M0XHVDRTZEIFx1Qzc3NFx1Qjk4NCJ9LCAvLy1hbGlhcworICAgICAgICB7ImRlc3RpbmF0aW9uLmFsaWFzIiwKKyAgICAgICAgICAgICAgICAiXHVCMzAwXHVDMEMxIFx1QkNDNFx1Q0U2RCJ9LCAvLy1kZXN0YWxpYXMKKyAgICAgICAgeyJkZXN0aW5hdGlvbi5rZXkucGFzc3dvcmQiLAorICAgICAgICAgICAgICAgICJcdUIzMDBcdUMwQzEgXHVEMEE0IFx1QkU0NFx1QkMwMFx1QkM4OFx1RDYzOCJ9LCAvLy1kZXN0a2V5cGFzcworICAgICAgICB7ImRlc3RpbmF0aW9uLmtleXN0b3JlLm5hbWUiLAorICAgICAgICAgICAgICAgICJcdUIzMDBcdUMwQzEgXHVEMEE0IFx1QzgwMFx1QzdBNVx1QzE4QyBcdUM3NzRcdUI5ODQifSwgLy8tZGVzdGtleXN0b3JlCisgICAgICAgIHsiZGVzdGluYXRpb24ua2V5c3RvcmUucGFzc3dvcmQucHJvdGVjdGVkIiwKKyAgICAgICAgICAgICAgICAiXHVCMzAwXHVDMEMxIFx1RDBBNCBcdUM4MDBcdUM3QTVcdUMxOEMgXHVCRTQ0XHVCQzAwXHVCQzg4XHVENjM4XHVCODVDIFx1QkNGNFx1RDYzOFx1QjQyOCJ9LCAvLy1kZXN0cHJvdGVjdGVkCisgICAgICAgIHsiZGVzdGluYXRpb24ua2V5c3RvcmUucHJvdmlkZXIubmFtZSIsCisgICAgICAgICAgICAgICAgIlx1QjMwMFx1QzBDMSBcdUQwQTQgXHVDODAwXHVDN0E1XHVDMThDIFx1QzgxQ1x1QUNGNVx1Qzc5MCBcdUM3NzRcdUI5ODQifSwgLy8tZGVzdHByb3ZpZGVybmFtZQorICAgICAgICB7ImRlc3RpbmF0aW9uLmtleXN0b3JlLnBhc3N3b3JkIiwKKyAgICAgICAgICAgICAgICAiXHVCMzAwXHVDMEMxIFx1RDBBNCBcdUM4MDBcdUM3QTVcdUMxOEMgXHVCRTQ0XHVCQzAwXHVCQzg4XHVENjM4In0sIC8vLWRlc3RzdG9yZXBhc3MKKyAgICAgICAgeyJkZXN0aW5hdGlvbi5rZXlzdG9yZS50eXBlIiwKKyAgICAgICAgICAgICAgICAiXHVCMzAwXHVDMEMxIFx1RDBBNCBcdUM4MDBcdUM3QTVcdUMxOEMgXHVDNzIwXHVENjE1In0sIC8vLWRlc3RzdG9yZXR5cGUKKyAgICAgICAgeyJkaXN0aW5ndWlzaGVkLm5hbWUiLAorICAgICAgICAgICAgICAgICJcdUMyRERcdUJDQzQgXHVDNzc0XHVCOTg0In0sIC8vLWRuYW1lCisgICAgICAgIHsiWC41MDkuZXh0ZW5zaW9uIiwKKyAgICAgICAgICAgICAgICAiWC41MDkgXHVENjU1XHVDN0E1In0sIC8vLWV4dAorICAgICAgICB7Im91dHB1dC5maWxlLm5hbWUiLAorICAgICAgICAgICAgICAgICJcdUNEOUNcdUI4MjUgXHVEMzBDXHVDNzdDIFx1Qzc3NFx1Qjk4NCJ9LCAvLy1maWxlIGFuZCAtb3V0ZmlsZQorICAgICAgICB7ImlucHV0LmZpbGUubmFtZSIsCisgICAgICAgICAgICAgICAgIlx1Qzc4NVx1QjgyNSBcdUQzMENcdUM3N0MgXHVDNzc0XHVCOTg0In0sIC8vLWZpbGUgYW5kIC1pbmZpbGUKKyAgICAgICAgeyJrZXkuYWxnb3JpdGhtLm5hbWUiLAorICAgICAgICAgICAgICAgICJcdUQwQTQgXHVDNTRDXHVBQ0UwXHVCOUFDXHVDOTk4IFx1Qzc3NFx1Qjk4NCJ9LCAvLy1rZXlhbGcKKyAgICAgICAgeyJrZXkucGFzc3dvcmQiLAorICAgICAgICAgICAgICAgICJcdUQwQTQgXHVCRTQ0XHVCQzAwXHVCQzg4XHVENjM4In0sIC8vLWtleXBhc3MKKyAgICAgICAgeyJrZXkuYml0LnNpemUiLAorICAgICAgICAgICAgICAgICJcdUQwQTQgXHVCRTQ0XHVEMkI4IFx1RDA2Q1x1QUUzMCJ9LCAvLy1rZXlzaXplCisgICAgICAgIHsia2V5c3RvcmUubmFtZSIsCisgICAgICAgICAgICAgICAgIlx1RDBBNCBcdUM4MDBcdUM3QTVcdUMxOEMgXHVDNzc0XHVCOTg0In0sIC8vLWtleXN0b3JlCisgICAgICAgIHsibmV3LnBhc3N3b3JkIiwKKyAgICAgICAgICAgICAgICAiXHVDMEM4IFx1QkU0NFx1QkMwMFx1QkM4OFx1RDYzOCJ9LCAvLy1uZXcKKyAgICAgICAgeyJkby5ub3QucHJvbXB0IiwKKyAgICAgICAgICAgICAgICAiXHVENjU1XHVDNzc4XHVENTU4XHVDOUMwIFx1QzU0QVx1Qzc0QyJ9LCAvLy1ub3Byb21wdAorICAgICAgICB7InBhc3N3b3JkLnRocm91Z2gucHJvdGVjdGVkLm1lY2hhbmlzbSIsCisgICAgICAgICAgICAgICAgIlx1QkNGNFx1RDYzOFx1QjQxOFx1QjI5NCBcdUJBNTRcdUNFRTRcdUIyQzhcdUM5OThcdUM3NDQgXHVEMUI1XHVENTVDIFx1QkU0NFx1QkMwMFx1QkM4OFx1RDYzOCJ9LCAvLy1wcm90ZWN0ZWQKKyAgICAgICAgeyJwcm92aWRlci5hcmd1bWVudCIsCisgICAgICAgICAgICAgICAgIlx1QzgxQ1x1QUNGNVx1Qzc5MCBcdUM3NzhcdUMyMTgifSwgLy8tcHJvdmlkZXJhcmcKKyAgICAgICAgeyJwcm92aWRlci5jbGFzcy5uYW1lIiwKKyAgICAgICAgICAgICAgICAiXHVDODFDXHVBQ0Y1XHVDNzkwIFx1RDA3NFx1Qjc5OFx1QzJBNCBcdUM3NzRcdUI5ODQifSwgLy8tcHJvdmlkZXJjbGFzcworICAgICAgICB7InByb3ZpZGVyLm5hbWUiLAorICAgICAgICAgICAgICAgICJcdUM4MUNcdUFDRjVcdUM3OTAgXHVDNzc0XHVCOTg0In0sIC8vLXByb3ZpZGVybmFtZQorICAgICAgICB7InByb3ZpZGVyLmNsYXNzcGF0aCIsCisgICAgICAgICAgICAgICAgIlx1QzgxQ1x1QUNGNVx1Qzc5MCBcdUQwNzRcdUI3OThcdUMyQTQgXHVBQ0JEXHVCODVDIn0sIC8vLXByb3ZpZGVycGF0aAorICAgICAgICB7Im91dHB1dC5pbi5SRkMuc3R5bGUiLAorICAgICAgICAgICAgICAgICJSRkMgXHVDMkE0XHVEMEMwXHVDNzdDXHVDNzU4IFx1Q0Q5Q1x1QjgyNSJ9LCAvLy1yZmMKKyAgICAgICAgeyJzaWduYXR1cmUuYWxnb3JpdGhtLm5hbWUiLAorICAgICAgICAgICAgICAgICJcdUMxMUNcdUJBODUgXHVDNTRDXHVBQ0UwXHVCOUFDXHVDOTk4IFx1Qzc3NFx1Qjk4NCJ9LCAvLy1zaWdhbGcKKyAgICAgICAgeyJzb3VyY2UuYWxpYXMiLAorICAgICAgICAgICAgICAgICJcdUMxOENcdUMyQTQgXHVCQ0M0XHVDRTZEIn0sIC8vLXNyY2FsaWFzCisgICAgICAgIHsic291cmNlLmtleS5wYXNzd29yZCIsCisgICAgICAgICAgICAgICAgIlx1QzE4Q1x1QzJBNCBcdUQwQTQgXHVCRTQ0XHVCQzAwXHVCQzg4XHVENjM4In0sIC8vLXNyY2tleXBhc3MKKyAgICAgICAgeyJzb3VyY2Uua2V5c3RvcmUubmFtZSIsCisgICAgICAgICAgICAgICAgIlx1QzE4Q1x1QzJBNCBcdUQwQTQgXHVDODAwXHVDN0E1XHVDMThDIFx1Qzc3NFx1Qjk4NCJ9LCAvLy1zcmNrZXlzdG9yZQorICAgICAgICB7InNvdXJjZS5rZXlzdG9yZS5wYXNzd29yZC5wcm90ZWN0ZWQiLAorICAgICAgICAgICAgICAgICJcdUMxOENcdUMyQTQgXHVEMEE0IFx1QzgwMFx1QzdBNVx1QzE4QyBcdUJFNDRcdUJDMDBcdUJDODhcdUQ2MzhcdUI4NUMgXHVCQ0Y0XHVENjM4XHVCNDI4In0sIC8vLXNyY3Byb3RlY3RlZAorICAgICAgICB7InNvdXJjZS5rZXlzdG9yZS5wcm92aWRlci5uYW1lIiwKKyAgICAgICAgICAgICAgICAiXHVDMThDXHVDMkE0IFx1RDBBNCBcdUM4MDBcdUM3QTVcdUMxOEMgXHVDODFDXHVBQ0Y1XHVDNzkwIFx1Qzc3NFx1Qjk4NCJ9LCAvLy1zcmNwcm92aWRlcm5hbWUKKyAgICAgICAgeyJzb3VyY2Uua2V5c3RvcmUucGFzc3dvcmQiLAorICAgICAgICAgICAgICAgICJcdUMxOENcdUMyQTQgXHVEMEE0IFx1QzgwMFx1QzdBNVx1QzE4QyBcdUJFNDRcdUJDMDBcdUJDODhcdUQ2MzgifSwgLy8tc3Jjc3RvcmVwYXNzCisgICAgICAgIHsic291cmNlLmtleXN0b3JlLnR5cGUiLAorICAgICAgICAgICAgICAgICJcdUMxOENcdUMyQTQgXHVEMEE0IFx1QzgwMFx1QzdBNVx1QzE4QyBcdUM3MjBcdUQ2MTUifSwgLy8tc3Jjc3RvcmV0eXBlCisgICAgICAgIHsiU1NMLnNlcnZlci5ob3N0LmFuZC5wb3J0IiwKKyAgICAgICAgICAgICAgICAiU1NMIFx1QzExQ1x1QkM4NCBcdUQ2MzhcdUMyQTRcdUQyQjggXHVCQzBGIFx1RDNFQ1x1RDJCOCJ9LCAvLy1zc2xzZXJ2ZXIKKyAgICAgICAgeyJzaWduZWQuamFyLmZpbGUiLAorICAgICAgICAgICAgICAgICJcdUMxMUNcdUJBODVcdUI0MUMgamFyIFx1RDMwQ1x1Qzc3QyJ9LCAvLz1qYXJmaWxlCisgICAgICAgIHsiY2VydGlmaWNhdGUudmFsaWRpdHkuc3RhcnQuZGF0ZS50aW1lIiwKKyAgICAgICAgICAgICAgICAiXHVDNzc4XHVDOTlEXHVDMTFDIFx1QzcyMFx1RDZBOCBcdUFFMzBcdUFDMDQgXHVDMkRDXHVDNzkxIFx1QjBBMFx1QzlEQy9cdUMyRENcdUFDMDQifSwgLy8tc3RhcnRkYXRlCisgICAgICAgIHsia2V5c3RvcmUucGFzc3dvcmQiLAorICAgICAgICAgICAgICAgICJcdUQwQTQgXHVDODAwXHVDN0E1XHVDMThDIFx1QkU0NFx1QkMwMFx1QkM4OFx1RDYzOCJ9LCAvLy1zdG9yZXBhc3MKKyAgICAgICAgeyJrZXlzdG9yZS50eXBlIiwKKyAgICAgICAgICAgICAgICAiXHVEMEE0IFx1QzgwMFx1QzdBNVx1QzE4QyBcdUM3MjBcdUQ2MTUifSwgLy8tc3RvcmV0eXBlCisgICAgICAgIHsidHJ1c3QuY2VydGlmaWNhdGVzLmZyb20uY2FjZXJ0cyIsCisgICAgICAgICAgICAgICAgImNhY2VydHNcdUM3NTggXHVCQ0Y0XHVDNTQ4IFx1Qzc3OFx1Qzk5RFx1QzExQyJ9LCAvLy10cnVzdGNhY2VydHMKKyAgICAgICAgeyJ2ZXJib3NlLm91dHB1dCIsCisgICAgICAgICAgICAgICAgIlx1QzBDMVx1QzEzOCBcdUM4MTVcdUJDRjQgXHVDRDlDXHVCODI1In0sIC8vLXYKKyAgICAgICAgeyJ2YWxpZGl0eS5udW1iZXIub2YuZGF5cyIsCisgICAgICAgICAgICAgICAgIlx1QzcyMFx1RDZBOCBcdUFFMzBcdUFDMDQgXHVDNzdDIFx1QzIxOCJ9LCAvLy12YWxpZGl0eQorICAgICAgICB7IlNlcmlhbC5JRC5vZi5jZXJ0LnRvLnJldm9rZSIsCisgICAgICAgICAgICAgICAgICJcdUNDQTBcdUQ2OENcdUQ1NjAgXHVDNzc4XHVDOTlEXHVDMTFDXHVDNzU4IFx1Qzc3Q1x1QjgyOCBJRCJ9LCAvLy1pZAorICAgICAgICAvLyBrZXl0b29sOiBSdW5uaW5nIHBhcnQKKyAgICAgICAgeyJrZXl0b29sLmVycm9yLiIsICJrZXl0b29sIFx1QzYyNFx1Qjk1ODogIn0sCisgICAgICAgIHsiSWxsZWdhbC5vcHRpb24uIiwgIlx1Qzc5OFx1QkFCQlx1QjQxQyBcdUM2MzVcdUMxNTg6ICAgIn0sCisgICAgICAgIHsiSWxsZWdhbC52YWx1ZS4iLCAiXHVDNzk4XHVCQUJCXHVCNDFDIFx1QUMxMjogIn0sCisgICAgICAgIHsiVW5rbm93bi5wYXNzd29yZC50eXBlLiIsICJcdUM1NEMgXHVDMjE4IFx1QzVDNlx1QjI5NCBcdUJFNDRcdUJDMDBcdUJDODhcdUQ2MzggXHVDNzIwXHVENjE1OiAifSwKKyAgICAgICAgeyJDYW5ub3QuZmluZC5lbnZpcm9ubWVudC52YXJpYWJsZS4iLAorICAgICAgICAgICAgICAgICJcdUQ2NThcdUFDQkQgXHVCQ0MwXHVDMjE4XHVCOTdDIFx1Q0MzRVx1Qzc0NCBcdUMyMTggXHVDNUM2XHVDNzRDOiAifSwKKyAgICAgICAgeyJDYW5ub3QuZmluZC5maWxlLiIsICJcdUQzMENcdUM3N0NcdUM3NDQgXHVDQzNFXHVDNzQ0IFx1QzIxOCBcdUM1QzZcdUM3NEM6ICJ9LAorICAgICAgICB7IkNvbW1hbmQub3B0aW9uLmZsYWcubmVlZHMuYW4uYXJndW1lbnQuIiwgIlx1QkE4NVx1QjgzOSBcdUM2MzVcdUMxNTggezB9XHVDNUQwIFx1Qzc3OFx1QzIxOFx1QUMwMCBcdUQ1NDRcdUM2OTRcdUQ1NjlcdUIyQzhcdUIyRTQuIn0sCisgICAgICAgIHsiV2FybmluZy5EaWZmZXJlbnQuc3RvcmUuYW5kLmtleS5wYXNzd29yZHMubm90LnN1cHBvcnRlZC5mb3IuUEtDUzEyLktleVN0b3Jlcy5JZ25vcmluZy51c2VyLnNwZWNpZmllZC5jb21tYW5kLnZhbHVlLiIsCisgICAgICAgICAgICAgICAgIlx1QUNCRFx1QUNFMDogXHVCMkU0XHVCOTc4IFx1QzgwMFx1QzdBNVx1QzE4QyBcdUJDMEYgXHVEMEE0IFx1QkU0NFx1QkMwMFx1QkM4OFx1RDYzOFx1QjI5NCBQS0NTMTIgS2V5U3RvcmVzXHVDNUQwIFx1QjMwMFx1RDU3NCBcdUM5QzBcdUM2RDBcdUI0MThcdUM5QzAgXHVDNTRBXHVDMkI1XHVCMkM4XHVCMkU0LiBcdUMwQUNcdUM2QTlcdUM3OTBcdUFDMDAgXHVDOUMwXHVDODE1XHVENTVDIHswfSBcdUFDMTJcdUM3NDQgXHVCQjM0XHVDMkRDXHVENTU4XHVCMjk0IFx1QzkxMVx1Qzc4NVx1QjJDOFx1QjJFNC4ifSwKKyAgICAgICAgeyIua2V5c3RvcmUubXVzdC5iZS5OT05FLmlmLnN0b3JldHlwZS5pcy57MH0iLAorICAgICAgICAgICAgICAgICItc3RvcmV0eXBlXHVDNzc0IHswfVx1Qzc3OCBcdUFDQkRcdUM2QjAgLWtleXN0b3JlXHVCMjk0IE5PTkVcdUM3NzRcdUM1QjRcdUM1N0MgXHVENTY5XHVCMkM4XHVCMkU0LiJ9LAorICAgICAgICB7IlRvby5tYW55LnJldHJpZXMucHJvZ3JhbS50ZXJtaW5hdGVkIiwKKyAgICAgICAgICAgICAgICAgIlx1QzdBQ1x1QzJEQ1x1QjNDNCBcdUQ2OUZcdUMyMThcdUFDMDAgXHVCMTA4XHVCQjM0IFx1QjlDRVx1QzU0NCBcdUQ1MDRcdUI4NUNcdUFERjhcdUI3QThcdUM3NzQgXHVDODg1XHVCOENDXHVCNDE4XHVDNUM4XHVDMkI1XHVCMkM4XHVCMkU0LiJ9LAorICAgICAgICB7Ii5zdG9yZXBhc3N3ZC5hbmQua2V5cGFzc3dkLmNvbW1hbmRzLm5vdC5zdXBwb3J0ZWQuaWYuc3RvcmV0eXBlLmlzLnswfSIsCisgICAgICAgICAgICAgICAgIi1zdG9yZXR5cGVcdUM3NzQgezB9XHVDNzc4IFx1QUNCRFx1QzZCMCAtc3RvcmVwYXNzd2QgXHVCQzBGIC1rZXlwYXNzd2QgXHVCQTg1XHVCODM5XHVDNzc0IFx1QzlDMFx1QzZEMFx1QjQxOFx1QzlDMCBcdUM1NEFcdUMyQjVcdUIyQzhcdUIyRTQuIn0sCisgICAgICAgIHsiLmtleXBhc3N3ZC5jb21tYW5kcy5ub3Quc3VwcG9ydGVkLmlmLnN0b3JldHlwZS5pcy5QS0NTMTIiLAorICAgICAgICAgICAgICAgICItc3RvcmV0eXBlXHVDNzc0IFBLQ1MxMlx1Qzc3OCBcdUFDQkRcdUM2QjAgLWtleXBhc3N3ZCBcdUJBODVcdUI4MzlcdUM3NzQgXHVDOUMwXHVDNkQwXHVCNDE4XHVDOUMwIFx1QzU0QVx1QzJCNVx1QjJDOFx1QjJFNC4ifSwKKyAgICAgICAgeyIua2V5cGFzcy5hbmQubmV3LmNhbi5ub3QuYmUuc3BlY2lmaWVkLmlmLnN0b3JldHlwZS5pcy57MH0iLAorICAgICAgICAgICAgICAgICItc3RvcmV0eXBlXHVDNzc0IHswfVx1Qzc3OCBcdUFDQkRcdUM2QjAgLWtleXBhc3MgXHVCQzBGIC1uZXdcdUI5N0MgXHVDOUMwXHVDODE1XHVENTYwIFx1QzIxOCBcdUM1QzZcdUMyQjVcdUIyQzhcdUIyRTQuIn0sCisgICAgICAgIHsiaWYucHJvdGVjdGVkLmlzLnNwZWNpZmllZC50aGVuLnN0b3JlcGFzcy5rZXlwYXNzLmFuZC5uZXcubXVzdC5ub3QuYmUuc3BlY2lmaWVkIiwKKyAgICAgICAgICAgICAgICAiLXByb3RlY3RlZFx1Qjk3QyBcdUM5QzBcdUM4MTVcdUQ1NUMgXHVBQ0JEXHVDNkIwIC1zdG9yZXBhc3MsIC1rZXlwYXNzIFx1QkMwRiAtbmV3XHVCOTdDIFx1QzlDMFx1QzgxNVx1RDU1OFx1QzlDMCBcdUM1NEFcdUM1NDRcdUM1N0MgXHVENTY5XHVCMkM4XHVCMkU0LiJ9LAorICAgICAgICB7ImlmLnNyY3Byb3RlY3RlZC5pcy5zcGVjaWZpZWQudGhlbi5zcmNzdG9yZXBhc3MuYW5kLnNyY2tleXBhc3MubXVzdC5ub3QuYmUuc3BlY2lmaWVkIiwKKyAgICAgICAgICAgICAgICAiLXNyY3Byb3RlY3RlZFx1Qjk3QyBcdUM5QzBcdUM4MTVcdUQ1NUMgXHVBQ0JEXHVDNkIwIC1zcmNzdG9yZXBhc3MgXHVCQzBGIC1zcmNrZXlwYXNzXHVCOTdDIFx1QzlDMFx1QzgxNVx1RDU1OFx1QzlDMCBcdUM1NEFcdUM1NDRcdUM1N0MgXHVENTY5XHVCMkM4XHVCMkU0LiJ9LAorICAgICAgICB7ImlmLmtleXN0b3JlLmlzLm5vdC5wYXNzd29yZC5wcm90ZWN0ZWQudGhlbi5zdG9yZXBhc3Mua2V5cGFzcy5hbmQubmV3Lm11c3Qubm90LmJlLnNwZWNpZmllZCIsCisgICAgICAgICAgICAgICAgIlx1RDBBNCBcdUM4MDBcdUM3QTVcdUMxOENcdUFDMDAgXHVCRTQ0XHVCQzAwXHVCQzg4XHVENjM4XHVCODVDIFx1QkNGNFx1RDYzOFx1QjQxOFx1QzlDMCBcdUM1NEFcdUIyOTQgXHVBQ0JEXHVDNkIwIC1zdG9yZXBhc3MsIC1rZXlwYXNzIFx1QkMwRiAtbmV3XHVCOTdDIFx1QzlDMFx1QzgxNVx1RDU1OFx1QzlDMCBcdUM1NEFcdUM1NDRcdUM1N0MgXHVENTY5XHVCMkM4XHVCMkU0LiJ9LAorICAgICAgICB7ImlmLnNvdXJjZS5rZXlzdG9yZS5pcy5ub3QucGFzc3dvcmQucHJvdGVjdGVkLnRoZW4uc3Jjc3RvcmVwYXNzLmFuZC5zcmNrZXlwYXNzLm11c3Qubm90LmJlLnNwZWNpZmllZCIsCisgICAgICAgICAgICAgICAgIlx1QzE4Q1x1QzJBNCBcdUQwQTQgXHVDODAwXHVDN0E1XHVDMThDXHVBQzAwIFx1QkU0NFx1QkMwMFx1QkM4OFx1RDYzOFx1Qjg1QyBcdUJDRjRcdUQ2MzhcdUI0MThcdUM5QzAgXHVDNTRBXHVCMjk0IFx1QUNCRFx1QzZCMCAtc3Jjc3RvcmVwYXNzIFx1QkMwRiAtc3Jja2V5cGFzc1x1Qjk3QyBcdUM5QzBcdUM4MTVcdUQ1NThcdUM5QzAgXHVDNTRBXHVDNTQ0XHVDNTdDIFx1RDU2OVx1QjJDOFx1QjJFNC4ifSwKKyAgICAgICAgeyJJbGxlZ2FsLnN0YXJ0ZGF0ZS52YWx1ZSIsICJzdGFydGRhdGUgXHVBQzEyXHVDNzc0IFx1Qzc5OFx1QkFCQlx1QjQxOFx1QzVDOFx1QzJCNVx1QjJDOFx1QjJFNC4ifSwKKyAgICAgICAgeyJWYWxpZGl0eS5tdXN0LmJlLmdyZWF0ZXIudGhhbi56ZXJvIiwKKyAgICAgICAgICAgICAgICAiXHVDNzIwXHVENkE4IFx1QUUzMFx1QUMwNFx1Qzc0MCAwXHVCQ0Y0XHVCMkU0IFx1Q0VFNFx1QzU3QyBcdUQ1NjlcdUIyQzhcdUIyRTQuIn0sCisgICAgICAgIHsicHJvdk5hbWUubm90LmEucHJvdmlkZXIiLCAiezB9XHVDNzQwKFx1QjI5NCkgXHVDODFDXHVBQ0Y1XHVDNzkwXHVBQzAwIFx1QzU0NFx1QjJEOVx1QjJDOFx1QjJFNC4ifSwKKyAgICAgICAgeyJVc2FnZS5lcnJvci5uby5jb21tYW5kLnByb3ZpZGVkIiwgIlx1QzBBQ1x1QzZBOVx1QkM5NSBcdUM2MjRcdUI5NTg6IFx1QkE4NVx1QjgzOVx1Qzc0NCBcdUM3ODVcdUI4MjVcdUQ1NThcdUM5QzAgXHVDNTRBXHVDNTU4XHVDMkI1XHVCMkM4XHVCMkU0LiJ9LAorICAgICAgICB7IlNvdXJjZS5rZXlzdG9yZS5maWxlLmV4aXN0cy5idXQuaXMuZW1wdHkuIiwgIlx1QzE4Q1x1QzJBNCBcdUQwQTQgXHVDODAwXHVDN0E1XHVDMThDIFx1RDMwQ1x1Qzc3Q1x1Qzc3NCBcdUM4NzRcdUM3QUNcdUQ1NThcdUM5QzBcdUI5Q0MgXHVCRTQ0XHVDNUI0IFx1Qzc4OFx1Qzc0QzogIn0sCisgICAgICAgIHsiUGxlYXNlLnNwZWNpZnkuc3Jja2V5c3RvcmUiLCAiLXNyY2tleXN0b3JlXHVCOTdDIFx1QzlDMFx1QzgxNVx1RDU1OFx1QzJFRFx1QzJEQ1x1QzYyNC4ifSwKKyAgICAgICAgeyJNdXN0Lm5vdC5zcGVjaWZ5LmJvdGgudi5hbmQucmZjLndpdGgubGlzdC5jb21tYW5kIiwKKyAgICAgICAgICAgICAgICAiJ2xpc3QnIFx1QkE4NVx1QjgzOVx1QzVEMCAtdlx1QzY0MCAtcmZjXHVCOTdDIFx1RDU2OFx1QUVEOCBcdUM5QzBcdUM4MTVcdUQ1NThcdUM5QzAgXHVDNTRBXHVDNTQ0XHVDNTdDIFx1RDU2OVx1QjJDOFx1QjJFNC4ifSwKKyAgICAgICAgeyJLZXkucGFzc3dvcmQubXVzdC5iZS5hdC5sZWFzdC42LmNoYXJhY3RlcnMiLAorICAgICAgICAgICAgICAgICJcdUQwQTQgXHVCRTQ0XHVCQzAwXHVCQzg4XHVENjM4XHVCMjk0IDZcdUM3OTAgXHVDNzc0XHVDMEMxXHVDNzc0XHVDNUI0XHVDNTdDIFx1RDU2OVx1QjJDOFx1QjJFNC4ifSwKKyAgICAgICAgeyJOZXcucGFzc3dvcmQubXVzdC5iZS5hdC5sZWFzdC42LmNoYXJhY3RlcnMiLAorICAgICAgICAgICAgICAgICJcdUMwQzggXHVCRTQ0XHVCQzAwXHVCQzg4XHVENjM4XHVCMjk0IDZcdUM3OTAgXHVDNzc0XHVDMEMxXHVDNzc0XHVDNUI0XHVDNTdDIFx1RDU2OVx1QjJDOFx1QjJFNC4ifSwKKyAgICAgICAgeyJLZXlzdG9yZS5maWxlLmV4aXN0cy5idXQuaXMuZW1wdHkuIiwKKyAgICAgICAgICAgICAgICAiXHVEMEE0IFx1QzgwMFx1QzdBNVx1QzE4QyBcdUQzMENcdUM3N0NcdUM3NzQgXHVDODc0XHVDN0FDXHVENTU4XHVDOUMwXHVCOUNDIFx1QkU0NFx1QzVCNCBcdUM3ODhcdUM3NEM6ICJ9LAorICAgICAgICB7IktleXN0b3JlLmZpbGUuZG9lcy5ub3QuZXhpc3QuIiwKKyAgICAgICAgICAgICAgICAiXHVEMEE0IFx1QzgwMFx1QzdBNVx1QzE4QyBcdUQzMENcdUM3N0NcdUM3NzQgXHVDODc0XHVDN0FDXHVENTU4XHVDOUMwIFx1QzU0QVx1Qzc0QzogIn0sCisgICAgICAgIHsiTXVzdC5zcGVjaWZ5LmRlc3RpbmF0aW9uLmFsaWFzIiwgIlx1QjMwMFx1QzBDMSBcdUJDQzRcdUNFNkRcdUM3NDQgXHVDOUMwXHVDODE1XHVENTc0XHVDNTdDIFx1RDU2OVx1QjJDOFx1QjJFNC4ifSwKKyAgICAgICAgeyJNdXN0LnNwZWNpZnkuYWxpYXMiLCAiXHVCQ0M0XHVDRTZEXHVDNzQ0IFx1QzlDMFx1QzgxNVx1RDU3NFx1QzU3QyBcdUQ1NjlcdUIyQzhcdUIyRTQuIn0sCisgICAgICAgIHsiS2V5c3RvcmUucGFzc3dvcmQubXVzdC5iZS5hdC5sZWFzdC42LmNoYXJhY3RlcnMiLAorICAgICAgICAgICAgICAgICJcdUQwQTQgXHVDODAwXHVDN0E1XHVDMThDIFx1QkU0NFx1QkMwMFx1QkM4OFx1RDYzOFx1QjI5NCA2XHVDNzkwIFx1Qzc3NFx1QzBDMVx1Qzc3NFx1QzVCNFx1QzU3QyBcdUQ1NjlcdUIyQzhcdUIyRTQuIn0sCisgICAgICAgIHsiRW50ZXIua2V5c3RvcmUucGFzc3dvcmQuIiwgIlx1RDBBNCBcdUM4MDBcdUM3QTVcdUMxOEMgXHVCRTQ0XHVCQzAwXHVCQzg4XHVENjM4IFx1Qzc4NVx1QjgyNTogICJ9LAorICAgICAgICB7IkVudGVyLnNvdXJjZS5rZXlzdG9yZS5wYXNzd29yZC4iLCAiXHVDMThDXHVDMkE0IFx1RDBBNCBcdUM4MDBcdUM3QTVcdUMxOEMgXHVCRTQ0XHVCQzAwXHVCQzg4XHVENjM4IFx1Qzc4NVx1QjgyNTogICJ9LAorICAgICAgICB7IkVudGVyLmRlc3RpbmF0aW9uLmtleXN0b3JlLnBhc3N3b3JkLiIsICJcdUIzMDBcdUMwQzEgXHVEMEE0IFx1QzgwMFx1QzdBNVx1QzE4QyBcdUJFNDRcdUJDMDBcdUJDODhcdUQ2MzggXHVDNzg1XHVCODI1OiAgIn0sCisgICAgICAgIHsiS2V5c3RvcmUucGFzc3dvcmQuaXMudG9vLnNob3J0Lm11c3QuYmUuYXQubGVhc3QuNi5jaGFyYWN0ZXJzIiwKKyAgICAgICAgICJcdUQwQTQgXHVDODAwXHVDN0E1XHVDMThDIFx1QkU0NFx1QkMwMFx1QkM4OFx1RDYzOFx1QUMwMCBcdUIxMDhcdUJCMzQgXHVDOUU3XHVDNzRDIC0gNlx1Qzc5MCBcdUM3NzRcdUMwQzFcdUM3NzRcdUM1QjRcdUM1N0MgXHVENTY5XHVCMkM4XHVCMkU0LiJ9LAorICAgICAgICB7IlVua25vd24uRW50cnkuVHlwZSIsICJcdUM1NEMgXHVDMjE4IFx1QzVDNlx1QjI5NCBcdUQ1NkRcdUJBQTkgXHVDNzIwXHVENjE1In0sCisgICAgICAgIHsiVG9vLm1hbnkuZmFpbHVyZXMuQWxpYXMubm90LmNoYW5nZWQiLCAiXHVDNjI0XHVCOTU4XHVBQzAwIFx1QjEwOFx1QkIzNCBcdUI5Q0VcdUMyQjVcdUIyQzhcdUIyRTQuIFx1QkNDNFx1Q0U2RFx1Qzc3NCBcdUJDQzBcdUFDQkRcdUI0MThcdUM5QzAgXHVDNTRBXHVDNTU4XHVDMkI1XHVCMkM4XHVCMkU0LiJ9LAorICAgICAgICB7IkVudHJ5LmZvci5hbGlhcy5hbGlhcy5zdWNjZXNzZnVsbHkuaW1wb3J0ZWQuIiwKKyAgICAgICAgICAgICAgICAgInswfSBcdUJDQzRcdUNFNkRcdUM1RDAgXHVCMzAwXHVENTVDIFx1RDU2RFx1QkFBOVx1Qzc3NCBcdUMxMzFcdUFDRjVcdUM4MDFcdUM3M0NcdUI4NUMgXHVDNzg0XHVEM0VDXHVEMkI4XHVCNDE4XHVDNUM4XHVDMkI1XHVCMkM4XHVCMkU0LiJ9LAorICAgICAgICB7IkVudHJ5LmZvci5hbGlhcy5hbGlhcy5ub3QuaW1wb3J0ZWQuIiwgInswfSBcdUJDQzRcdUNFNkRcdUM1RDAgXHVCMzAwXHVENTVDIFx1RDU2RFx1QkFBOVx1Qzc3NCBcdUM3ODRcdUQzRUNcdUQyQjhcdUI0MThcdUM5QzAgXHVDNTRBXHVDNTU4XHVDMkI1XHVCMkM4XHVCMkU0LiJ9LAorICAgICAgICB7IlByb2JsZW0uaW1wb3J0aW5nLmVudHJ5LmZvci5hbGlhcy5hbGlhcy5leGNlcHRpb24uRW50cnkuZm9yLmFsaWFzLmFsaWFzLm5vdC5pbXBvcnRlZC4iLAorICAgICAgICAgICAgICAgICAiezB9IFx1QkNDNFx1Q0U2RFx1QzVEMCBcdUIzMDBcdUQ1NUMgXHVENTZEXHVCQUE5XHVDNzQ0IFx1Qzc4NFx1RDNFQ1x1RDJCOFx1RDU1OFx1QjI5NCBcdUM5MTEgXHVCQjM4XHVDODFDIFx1QkMxQ1x1QzBERDogezF9LlxuezB9IFx1QkNDNFx1Q0U2RFx1QzVEMCBcdUIzMDBcdUQ1NUMgXHVENTZEXHVCQUE5XHVDNzc0IFx1Qzc4NFx1RDNFQ1x1RDJCOFx1QjQxOFx1QzlDMCBcdUM1NEFcdUM1NThcdUMyQjVcdUIyQzhcdUIyRTQuIn0sCisgICAgICAgIHsiSW1wb3J0LmNvbW1hbmQuY29tcGxldGVkLm9rLmVudHJpZXMuc3VjY2Vzc2Z1bGx5LmltcG9ydGVkLmZhaWwuZW50cmllcy5mYWlsZWQub3IuY2FuY2VsbGVkIiwKKyAgICAgICAgICAgICAgICAgIlx1Qzc4NFx1RDNFQ1x1RDJCOCBcdUJBODVcdUI4MzkgXHVDNjQ0XHVCOENDOiBcdUMxMzFcdUFDRjVcdUM4MDFcdUM3M0NcdUI4NUMgXHVDNzg0XHVEM0VDXHVEMkI4XHVCNDFDIFx1RDU2RFx1QkFBOVx1Qzc0MCB7MH1cdUFDMUMsIFx1QzJFNFx1RDMyOFx1RDU1OFx1QUM3MFx1QjA5OCBcdUNERThcdUMxOENcdUI0MUMgXHVENTZEXHVCQUE5XHVDNzQwIHsxfVx1QUMxQ1x1Qzc4NVx1QjJDOFx1QjJFNC4ifSwKKyAgICAgICAgeyJXYXJuaW5nLk92ZXJ3cml0aW5nLmV4aXN0aW5nLmFsaWFzLmFsaWFzLmluLmRlc3RpbmF0aW9uLmtleXN0b3JlIiwKKyAgICAgICAgICAgICAgICAgIlx1QUNCRFx1QUNFMDogXHVCMzAwXHVDMEMxIFx1RDBBNCBcdUM4MDBcdUM3QTVcdUMxOENcdUM1RDBcdUMxMUMgXHVBRTMwXHVDODc0IFx1QkNDNFx1Q0U2RCB7MH1cdUM3NDQoXHVCOTdDKSBcdUFDQjlcdUNDRDAgXHVDNEYwXHVCMjk0IFx1QzkxMSJ9LAorICAgICAgICB7IkV4aXN0aW5nLmVudHJ5LmFsaWFzLmFsaWFzLmV4aXN0cy5vdmVyd3JpdGUubm8uIiwKKyAgICAgICAgICAgICAgICAgIlx1QUUzMFx1Qzg3NCBcdUQ1NkRcdUJBQTkgXHVCQ0M0XHVDRTZEIHswfVx1Qzc3NChcdUFDMDApIFx1Qzg3NFx1QzdBQ1x1RDU2OVx1QjJDOFx1QjJFNC4gXHVBQ0I5XHVDQ0QwIFx1QzRGMFx1QUNBMFx1QzJCNVx1QjJDOFx1QUU0Qz8gW1x1QzU0NFx1QjJDOFx1QzYyNF06ICAifSwKKyAgICAgICAgeyJUb28ubWFueS5mYWlsdXJlcy50cnkubGF0ZXIiLCAiXHVDNjI0XHVCOTU4XHVBQzAwIFx1QjEwOFx1QkIzNCBcdUI5Q0VcdUM3NEMgLSBcdUIwOThcdUM5MTFcdUM1RDAgXHVDMkRDXHVCM0M0XHVENTU4XHVDMkVEXHVDMkRDXHVDNjI0LiJ9LAorICAgICAgICB7IkNlcnRpZmljYXRpb24ucmVxdWVzdC5zdG9yZWQuaW4uZmlsZS5maWxlbmFtZS4iLAorICAgICAgICAgICAgICAgICJcdUM3NzhcdUM5OUQgXHVDNjk0XHVDQ0FEXHVDNzc0IDx7MH0+IFx1RDMwQ1x1Qzc3Q1x1QzVEMCBcdUM4MDBcdUM3QTVcdUI0MThcdUM1QzhcdUMyQjVcdUIyQzhcdUIyRTQuIn0sCisgICAgICAgIHsiU3VibWl0LnRoaXMudG8ueW91ci5DQSIsICJDQVx1QzVEMFx1QUM4QyBcdUM4MUNcdUNEOUNcdUQ1NThcdUMyRURcdUMyRENcdUM2MjQuIn0sCisgICAgICAgIHsiaWYuYWxpYXMubm90LnNwZWNpZmllZC5kZXN0YWxpYXMuc3Jja2V5cGFzcy5hbmQuZGVzdGtleXBhc3MubXVzdC5ub3QuYmUuc3BlY2lmaWVkIiwKKyAgICAgICAgICAgICJcdUJDQzRcdUNFNkRcdUM3NDQgXHVDOUMwXHVDODE1XHVENTU4XHVDOUMwIFx1QzU0QVx1Qzc0MCBcdUFDQkRcdUM2QjAgZGVzdGFsaWFzLCBzcmNrZXlwYXNzIFx1QkMwRiBkZXN0a2V5cGFzc1x1Qjk3QyBcdUM5QzBcdUM4MTVcdUQ1NThcdUM5QzAgXHVDNTRBXHVDNTQ0XHVDNTdDIFx1RDU2OVx1QjJDOFx1QjJFNC4ifSwKKyAgICAgICAgeyJDZXJ0aWZpY2F0ZS5zdG9yZWQuaW4uZmlsZS5maWxlbmFtZS4iLAorICAgICAgICAgICAgICAgICJcdUM3NzhcdUM5OURcdUMxMUNcdUFDMDAgPHswfT4gXHVEMzBDXHVDNzdDXHVDNUQwIFx1QzgwMFx1QzdBNVx1QjQxOFx1QzVDOFx1QzJCNVx1QjJDOFx1QjJFNC4ifSwKKyAgICAgICAgeyJDZXJ0aWZpY2F0ZS5yZXBseS53YXMuaW5zdGFsbGVkLmluLmtleXN0b3JlIiwKKyAgICAgICAgICAgICAgICAiXHVDNzc4XHVDOTlEXHVDMTFDIFx1RDY4Q1x1QzJFMFx1Qzc3NCBcdUQwQTQgXHVDODAwXHVDN0E1XHVDMThDXHVDNUQwIFx1QzEyNFx1Q0U1OFx1QjQxOFx1QzVDOFx1QzJCNVx1QjJDOFx1QjJFNC4ifSwKKyAgICAgICAgeyJDZXJ0aWZpY2F0ZS5yZXBseS53YXMubm90Lmluc3RhbGxlZC5pbi5rZXlzdG9yZSIsCisgICAgICAgICAgICAgICAgIlx1Qzc3OFx1Qzk5RFx1QzExQyBcdUQ2OENcdUMyRTBcdUM3NzQgXHVEMEE0IFx1QzgwMFx1QzdBNVx1QzE4Q1x1QzVEMCBcdUMxMjRcdUNFNThcdUI0MThcdUM5QzAgXHVDNTRBXHVDNTU4XHVDMkI1XHVCMkM4XHVCMkU0LiJ9LAorICAgICAgICB7IkNlcnRpZmljYXRlLndhcy5hZGRlZC50by5rZXlzdG9yZSIsCisgICAgICAgICAgICAgICAgIlx1Qzc3OFx1Qzk5RFx1QzExQ1x1QUMwMCBcdUQwQTQgXHVDODAwXHVDN0E1XHVDMThDXHVDNUQwIFx1Q0Q5NFx1QUMwMFx1QjQxOFx1QzVDOFx1QzJCNVx1QjJDOFx1QjJFNC4ifSwKKyAgICAgICAgeyJDZXJ0aWZpY2F0ZS53YXMubm90LmFkZGVkLnRvLmtleXN0b3JlIiwKKyAgICAgICAgICAgICAgICAiXHVDNzc4XHVDOTlEXHVDMTFDXHVBQzAwIFx1RDBBNCBcdUM4MDBcdUM3QTVcdUMxOENcdUM1RDAgXHVDRDk0XHVBQzAwXHVCNDE4XHVDOUMwIFx1QzU0QVx1QzU1OFx1QzJCNVx1QjJDOFx1QjJFNC4ifSwKKyAgICAgICAgeyIuU3RvcmluZy5rc2ZuYW1lLiIsICJbezB9XHVDNzQ0KFx1Qjk3QykgXHVDODAwXHVDN0E1XHVENTU4XHVCMjk0IFx1QzkxMV0ifSwKKyAgICAgICAgeyJhbGlhcy5oYXMubm8ucHVibGljLmtleS5jZXJ0aWZpY2F0ZS4iLAorICAgICAgICAgICAgICAgICJ7MH1cdUM1RDAgXHVBQ0Y1XHVDNkE5IFx1RDBBNChcdUM3NzhcdUM5OURcdUMxMUMpXHVBQzAwIFx1QzVDNlx1QzJCNVx1QjJDOFx1QjJFNC4ifSwKKyAgICAgICAgeyJDYW5ub3QuZGVyaXZlLnNpZ25hdHVyZS5hbGdvcml0aG0iLAorICAgICAgICAgICAgICAgICJcdUMxMUNcdUJBODUgXHVDNTRDXHVBQ0UwXHVCOUFDXHVDOTk4XHVDNzQ0IFx1RDMwQ1x1QzBERFx1RDU2MCBcdUMyMTggXHVDNUM2XHVDMkI1XHVCMkM4XHVCMkU0LiJ9LAorICAgICAgICB7IkFsaWFzLmFsaWFzLmRvZXMubm90LmV4aXN0IiwKKyAgICAgICAgICAgICAgICAiPHswfT4gXHVCQ0M0XHVDRTZEXHVDNzc0IFx1Qzg3NFx1QzdBQ1x1RDU1OFx1QzlDMCBcdUM1NEFcdUMyQjVcdUIyQzhcdUIyRTQuIn0sCisgICAgICAgIHsiQWxpYXMuYWxpYXMuaGFzLm5vLmNlcnRpZmljYXRlIiwKKyAgICAgICAgICAgICAgICAiPHswfT4gXHVCQ0M0XHVDRTZEXHVDNUQwIFx1Qzc3OFx1Qzk5RFx1QzExQ1x1QUMwMCBcdUM1QzZcdUMyQjVcdUIyQzhcdUIyRTQuIn0sCisgICAgICAgIHsiS2V5LnBhaXIubm90LmdlbmVyYXRlZC5hbGlhcy5hbGlhcy5hbHJlYWR5LmV4aXN0cyIsCisgICAgICAgICAgICAgICAgIlx1RDBBNCBcdUMzMERcdUM3NzQgXHVDMEREXHVDMTMxXHVCNDE4XHVDOUMwIFx1QzU0QVx1QzU1OFx1QzczQ1x1QkE3MCA8ezB9PiBcdUJDQzRcdUNFNkRcdUM3NzQgXHVDODc0XHVDN0FDXHVENTY5XHVCMkM4XHVCMkU0LiJ9LAorICAgICAgICB7IkdlbmVyYXRpbmcua2V5c2l6ZS5iaXQua2V5QWxnTmFtZS5rZXkucGFpci5hbmQuc2VsZi5zaWduZWQuY2VydGlmaWNhdGUuc2lnQWxnTmFtZS53aXRoLmEudmFsaWRpdHkub2YudmFsaWRhbGl0eS5kYXlzLmZvciIsCisgICAgICAgICAgICAgICAgIlx1QjJFNFx1Qzc0Q1x1QzVEMCBcdUIzMDBcdUQ1NzQgXHVDNzIwXHVENkE4IFx1QUUzMFx1QUMwNFx1Qzc3NCB7M31cdUM3N0NcdUM3NzggezB9XHVCRTQ0XHVEMkI4IHsxfSBcdUQwQTQgXHVDMzBEIFx1QkMwRiBcdUM3OTBcdUNDQjQgXHVDMTFDXHVCQTg1XHVCNDFDIFx1Qzc3OFx1Qzk5RFx1QzExQyh7Mn0pXHVCOTdDIFx1QzBERFx1QzEzMVx1RDU1OFx1QjI5NCBcdUM5MTFcblx0OiB7NH0ifSwKKyAgICAgICAgeyJFbnRlci5rZXkucGFzc3dvcmQuZm9yLmFsaWFzLiIsICI8ezB9Plx1QzVEMCBcdUIzMDBcdUQ1NUMgXHVEMEE0IFx1QkU0NFx1QkMwMFx1QkM4OFx1RDYzOFx1Qjk3QyBcdUM3ODVcdUI4MjVcdUQ1NThcdUMyRURcdUMyRENcdUM2MjQuIn0sCisgICAgICAgIHsiLlJFVFVSTi5pZi5zYW1lLmFzLmtleXN0b3JlLnBhc3N3b3JkLiIsCisgICAgICAgICAgICAgICAgIlx0KFx1RDBBNCBcdUM4MDBcdUM3QTVcdUMxOEMgXHVCRTQ0XHVCQzAwXHVCQzg4XHVENjM4XHVDNjQwIFx1QjNEOVx1Qzc3Q1x1RDU1QyBcdUFDQkRcdUM2QjAgRW50ZXIgXHVEMEE0XHVCOTdDIFx1QjIwNFx1Qjk4NCk6ICAifSwKKyAgICAgICAgeyJLZXkucGFzc3dvcmQuaXMudG9vLnNob3J0Lm11c3QuYmUuYXQubGVhc3QuNi5jaGFyYWN0ZXJzIiwKKyAgICAgICAgICAgICAgICAiXHVEMEE0IFx1QkU0NFx1QkMwMFx1QkM4OFx1RDYzOFx1QUMwMCBcdUIxMDhcdUJCMzQgXHVDOUU3XHVDNzRDIC0gNlx1Qzc5MCBcdUM3NzRcdUMwQzFcdUM3NzRcdUM1QjRcdUM1N0MgXHVENTY5XHVCMkM4XHVCMkU0LiJ9LAorICAgICAgICB7IlRvby5tYW55LmZhaWx1cmVzLmtleS5ub3QuYWRkZWQudG8ua2V5c3RvcmUiLAorICAgICAgICAgICAgICAgICJcdUM2MjRcdUI5NThcdUFDMDAgXHVCMTA4XHVCQjM0IFx1QjlDRVx1Qzc0QyAtIFx1RDBBNCBcdUM4MDBcdUM3QTVcdUMxOENcdUM1RDAgXHVEMEE0XHVBQzAwIFx1Q0Q5NFx1QUMwMFx1QjQxOFx1QzlDMCBcdUM1NEFcdUM1NThcdUMyQjVcdUIyQzhcdUIyRTQuIn0sCisgICAgICAgIHsiRGVzdGluYXRpb24uYWxpYXMuZGVzdC5hbHJlYWR5LmV4aXN0cyIsCisgICAgICAgICAgICAgICAgIlx1QjMwMFx1QzBDMSBcdUJDQzRcdUNFNkQgPHswfT5cdUM3NzQoXHVBQzAwKSBcdUM4NzRcdUM3QUNcdUQ1NjlcdUIyQzhcdUIyRTQuIn0sCisgICAgICAgIHsiUGFzc3dvcmQuaXMudG9vLnNob3J0Lm11c3QuYmUuYXQubGVhc3QuNi5jaGFyYWN0ZXJzIiwKKyAgICAgICAgICAgICAgICAiXHVCRTQ0XHVCQzAwXHVCQzg4XHVENjM4XHVBQzAwIFx1QjEwOFx1QkIzNCBcdUM5RTdcdUM3NEMgLSA2XHVDNzkwIFx1Qzc3NFx1QzBDMVx1Qzc3NFx1QzVCNFx1QzU3QyBcdUQ1NjlcdUIyQzhcdUIyRTQuIn0sCisgICAgICAgIHsiVG9vLm1hbnkuZmFpbHVyZXMuS2V5LmVudHJ5Lm5vdC5jbG9uZWQiLAorICAgICAgICAgICAgICAgICJcdUM2MjRcdUI5NThcdUFDMDAgXHVCMTA4XHVCQjM0IFx1QjlDRVx1QzJCNVx1QjJDOFx1QjJFNC4gXHVEMEE0IFx1RDU2RFx1QkFBOVx1Qzc3NCBcdUJDRjVcdUM4MUNcdUI0MThcdUM5QzAgXHVDNTRBXHVDNTU4XHVDMkI1XHVCMkM4XHVCMkU0LiJ9LAorICAgICAgICB7ImtleS5wYXNzd29yZC5mb3IuYWxpYXMuIiwgIjx7MH0+XHVDNUQwIFx1QjMwMFx1RDU1QyBcdUQwQTQgXHVCRTQ0XHVCQzAwXHVCQzg4XHVENjM4In0sCisgICAgICAgIHsiS2V5c3RvcmUuZW50cnkuZm9yLmlkLmdldE5hbWUuYWxyZWFkeS5leGlzdHMiLAorICAgICAgICAgICAgICAgICI8ezB9Plx1QzVEMCBcdUIzMDBcdUQ1NUMgXHVEMEE0IFx1QzgwMFx1QzdBNVx1QzE4QyBcdUQ1NkRcdUJBQTlcdUM3NzQgXHVDODc0XHVDN0FDXHVENTY5XHVCMkM4XHVCMkU0LiJ9LAorICAgICAgICB7IkNyZWF0aW5nLmtleXN0b3JlLmVudHJ5LmZvci5pZC5nZXROYW1lLiIsCisgICAgICAgICAgICAgICAgIjx7MH0+XHVDNUQwIFx1QjMwMFx1RDU1QyBcdUQwQTQgXHVDODAwXHVDN0E1XHVDMThDIFx1RDU2RFx1QkFBOVx1Qzc0NCBcdUMwRERcdUMxMzFcdUQ1NThcdUIyOTQgXHVDOTExLi4uIn0sCisgICAgICAgIHsiTm8uZW50cmllcy5mcm9tLmlkZW50aXR5LmRhdGFiYXNlLmFkZGVkIiwKKyAgICAgICAgICAgICAgICAiSUQgXHVCMzcwXHVDNzc0XHVEMTMwXHVCQ0EwXHVDNzc0XHVDMkE0XHVDNUQwXHVDMTFDIFx1Q0Q5NFx1QUMwMFx1QjQxQyBcdUQ1NkRcdUJBQTlcdUM3NzQgXHVDNUM2XHVDMkI1XHVCMkM4XHVCMkU0LiJ9LAorICAgICAgICB7IkFsaWFzLm5hbWUuYWxpYXMiLCAiXHVCQ0M0XHVDRTZEIFx1Qzc3NFx1Qjk4NDogezB9In0sCisgICAgICAgIHsiQ3JlYXRpb24uZGF0ZS5rZXlTdG9yZS5nZXRDcmVhdGlvbkRhdGUuYWxpYXMuIiwKKyAgICAgICAgICAgICAgICAiXHVDMEREXHVDMTMxIFx1QjBBMFx1QzlEQzogezAsZGF0ZX0ifSwKKyAgICAgICAgeyJhbGlhcy5rZXlTdG9yZS5nZXRDcmVhdGlvbkRhdGUuYWxpYXMuIiwKKyAgICAgICAgICAgICAgICAiezB9LCB7MSxkYXRlfSwgIn0sCisgICAgICAgIHsiYWxpYXMuIiwgInswfSwgIn0sCisgICAgICAgIHsiRW50cnkudHlwZS50eXBlLiIsICJcdUQ1NkRcdUJBQTkgXHVDNzIwXHVENjE1OiB7MH0ifSwKKyAgICAgICAgeyJDZXJ0aWZpY2F0ZS5jaGFpbi5sZW5ndGguIiwgIlx1Qzc3OFx1Qzk5RFx1QzExQyBcdUNDQjRcdUM3NzggXHVBRTM4XHVDNzc0OiAifSwKKyAgICAgICAgeyJDZXJ0aWZpY2F0ZS5pLjEuIiwgIlx1Qzc3OFx1Qzk5RFx1QzExQ1t7MCxudW1iZXIsaW50ZWdlcn1dOiJ9LAorICAgICAgICB7IkNlcnRpZmljYXRlLmZpbmdlcnByaW50LlNIQTEuIiwgIlx1Qzc3OFx1Qzk5RFx1QzExQyBcdUM5QzBcdUJCMzgoU0hBMSk6ICJ9LAorICAgICAgICB7IktleXN0b3JlLnR5cGUuIiwgIlx1RDBBNCBcdUM4MDBcdUM3QTVcdUMxOEMgXHVDNzIwXHVENjE1OiAifSwKKyAgICAgICAgeyJLZXlzdG9yZS5wcm92aWRlci4iLCAiXHVEMEE0IFx1QzgwMFx1QzdBNVx1QzE4QyBcdUM4MUNcdUFDRjVcdUM3OTA6ICJ9LAorICAgICAgICB7IllvdXIua2V5c3RvcmUuY29udGFpbnMua2V5U3RvcmUuc2l6ZS5lbnRyeSIsCisgICAgICAgICAgICAgICAgIlx1RDBBNCBcdUM4MDBcdUM3QTVcdUMxOENcdUM1RDAgezAsbnVtYmVyLGludGVnZXJ9XHVBQzFDXHVDNzU4IFx1RDU2RFx1QkFBOVx1Qzc3NCBcdUQzRUNcdUQ1NjhcdUI0MThcdUM1QjQgXHVDNzg4XHVDMkI1XHVCMkM4XHVCMkU0LiJ9LAorICAgICAgICB7IllvdXIua2V5c3RvcmUuY29udGFpbnMua2V5U3RvcmUuc2l6ZS5lbnRyaWVzIiwKKyAgICAgICAgICAgICAgICAiXHVEMEE0IFx1QzgwMFx1QzdBNVx1QzE4Q1x1QzVEMCB7MCxudW1iZXIsaW50ZWdlcn1cdUFDMUNcdUM3NTggXHVENTZEXHVCQUE5XHVDNzc0IFx1RDNFQ1x1RDU2OFx1QjQxOFx1QzVCNCBcdUM3ODhcdUMyQjVcdUIyQzhcdUIyRTQuIn0sCisgICAgICAgIHsiRmFpbGVkLnRvLnBhcnNlLmlucHV0IiwgIlx1Qzc4NVx1QjgyNVx1QUMxMlx1Qzc1OCBcdUFENkNcdUJCMzggXHVCRDg0XHVDMTFEXHVDNzQ0IFx1QzJFNFx1RDMyOFx1RDU4OFx1QzJCNVx1QjJDOFx1QjJFNC4ifSwKKyAgICAgICAgeyJFbXB0eS5pbnB1dCIsICJcdUM3ODVcdUI4MjVcdUFDMTJcdUM3NzQgXHVCRTQ0XHVDNUI0IFx1Qzc4OFx1QzJCNVx1QjJDOFx1QjJFNC4ifSwKKyAgICAgICAgeyJOb3QuWC41MDkuY2VydGlmaWNhdGUiLCAiWC41MDkgXHVDNzc4XHVDOTlEXHVDMTFDXHVBQzAwIFx1QzU0NFx1QjJEOVx1QjJDOFx1QjJFNC4ifSwKKyAgICAgICAgeyJhbGlhcy5oYXMubm8ucHVibGljLmtleSIsICJ7MH1cdUM1RDAgXHVBQ0Y1XHVDNkE5IFx1RDBBNFx1QUMwMCBcdUM1QzZcdUMyQjVcdUIyQzhcdUIyRTQuIn0sCisgICAgICAgIHsiYWxpYXMuaGFzLm5vLlguNTA5LmNlcnRpZmljYXRlIiwgInswfVx1QzVEMCBYLjUwOSBcdUM3NzhcdUM5OURcdUMxMUNcdUFDMDAgXHVDNUM2XHVDMkI1XHVCMkM4XHVCMkU0LiJ9LAorICAgICAgICB7Ik5ldy5jZXJ0aWZpY2F0ZS5zZWxmLnNpZ25lZC4iLCAiXHVDMEM4IFx1Qzc3OFx1Qzk5RFx1QzExQyhcdUM3OTBcdUNDQjQgXHVDMTFDXHVCQTg1KToifSwKKyAgICAgICAgeyJSZXBseS5oYXMubm8uY2VydGlmaWNhdGVzIiwgIlx1RDY4Q1x1QzJFMFx1QzVEMCBcdUM3NzhcdUM5OURcdUMxMUNcdUFDMDAgXHVDNUM2XHVDMkI1XHVCMkM4XHVCMkU0LiJ9LAorICAgICAgICB7IkNlcnRpZmljYXRlLm5vdC5pbXBvcnRlZC5hbGlhcy5hbGlhcy5hbHJlYWR5LmV4aXN0cyIsCisgICAgICAgICAgICAgICAgIlx1Qzc3OFx1Qzk5RFx1QzExQ1x1QUMwMCBcdUM3ODRcdUQzRUNcdUQyQjhcdUI0MThcdUM5QzAgXHVDNTRBXHVDNTU4XHVDNzNDXHVCQTcwIDx7MH0+IFx1QkNDNFx1Q0U2RFx1Qzc3NCBcdUM4NzRcdUM3QUNcdUQ1NjlcdUIyQzhcdUIyRTQuIn0sCisgICAgICAgIHsiSW5wdXQubm90LmFuLlguNTA5LmNlcnRpZmljYXRlIiwgIlx1Qzc4NVx1QjgyNVx1Qzc3NCBYLjUwOSBcdUM3NzhcdUM5OURcdUMxMUNcdUFDMDAgXHVDNTQ0XHVCMkQ5XHVCMkM4XHVCMkU0LiJ9LAorICAgICAgICB7IkNlcnRpZmljYXRlLmFscmVhZHkuZXhpc3RzLmluLmtleXN0b3JlLnVuZGVyLmFsaWFzLnRydXN0YWxpYXMuIiwKKyAgICAgICAgICAgICAgICAiXHVDNzc4XHVDOTlEXHVDMTFDXHVBQzAwIDx7MH0+IFx1QkNDNFx1Q0U2RCBcdUM1NDRcdUI3OThcdUM3NTggXHVEMEE0IFx1QzgwMFx1QzdBNVx1QzE4Q1x1QzVEMCBcdUM4NzRcdUM3QUNcdUQ1NjlcdUIyQzhcdUIyRTQuIn0sCisgICAgICAgIHsiRG8ueW91LnN0aWxsLndhbnQudG8uYWRkLml0Lm5vLiIsCisgICAgICAgICAgICAgICAgIlx1Q0Q5NFx1QUMwMFx1RDU1OFx1QUNBMFx1QzJCNVx1QjJDOFx1QUU0Qz8gW1x1QzU0NFx1QjJDOFx1QzYyNF06ICAifSwKKyAgICAgICAgeyJDZXJ0aWZpY2F0ZS5hbHJlYWR5LmV4aXN0cy5pbi5zeXN0ZW0ud2lkZS5DQS5rZXlzdG9yZS51bmRlci5hbGlhcy50cnVzdGFsaWFzLiIsCisgICAgICAgICAgICAgICAgIlx1Qzc3OFx1Qzk5RFx1QzExQ1x1QUMwMCA8ezB9PiBcdUJDQzRcdUNFNkQgXHVDNTQ0XHVCNzk4XHVDNUQwIFx1Qzc4OFx1QjI5NCBcdUMyRENcdUMyQTRcdUQxNUMgXHVDQzI4XHVDNkQwXHVDNzU4IENBIFx1RDBBNCBcdUM4MDBcdUM3QTVcdUMxOENcdUM1RDAgXHVDODc0XHVDN0FDXHVENTY5XHVCMkM4XHVCMkU0LiJ9LAorICAgICAgICB7IkRvLnlvdS5zdGlsbC53YW50LnRvLmFkZC5pdC50by55b3VyLm93bi5rZXlzdG9yZS5uby4iLAorICAgICAgICAgICAgICAgICJcdUFDRTBcdUM3MjBcdUQ1NUMgXHVEMEE0IFx1QzgwMFx1QzdBNVx1QzE4Q1x1QzVEMCBcdUNEOTRcdUFDMDBcdUQ1NThcdUFDQTBcdUMyQjVcdUIyQzhcdUFFNEM/IFtcdUM1NDRcdUIyQzhcdUM2MjRdOiAgIn0sCisgICAgICAgIHsiVHJ1c3QudGhpcy5jZXJ0aWZpY2F0ZS5uby4iLCAiXHVDNzc0IFx1Qzc3OFx1Qzk5RFx1QzExQ1x1Qjk3QyBcdUMyRTBcdUI4QjBcdUQ1NjlcdUIyQzhcdUFFNEM/IFtcdUM1NDRcdUIyQzhcdUM2MjRdOiAgIn0sCisgICAgICAgIHsiWUVTIiwgIlx1QzYwOCJ9LAorICAgICAgICB7Ik5ldy5wcm9tcHQuIiwgIlx1QzBDOCB7MH06ICJ9LAorICAgICAgICB7IlBhc3N3b3Jkcy5tdXN0LmRpZmZlciIsICJcdUJFNDRcdUJDMDBcdUJDODhcdUQ2MzhcdUIyOTQgXHVCMkVDXHVCNzdDXHVDNTdDIFx1RDU2OVx1QjJDOFx1QjJFNC4ifSwKKyAgICAgICAgeyJSZS5lbnRlci5uZXcucHJvbXB0LiIsICJcdUMwQzggezB9IFx1QjJFNFx1QzJEQyBcdUM3ODVcdUI4MjU6ICJ9LAorICAgICAgICB7IlJlLmVudGVyLm5ldy5wYXNzd29yZC4iLCAiXHVDMEM4IFx1QkU0NFx1QkMwMFx1QkM4OFx1RDYzOCBcdUIyRTRcdUMyREMgXHVDNzg1XHVCODI1OiAifSwKKyAgICAgICAgeyJUaGV5LmRvbi50Lm1hdGNoLlRyeS5hZ2FpbiIsICJcdUM3N0NcdUNFNThcdUQ1NThcdUM5QzAgXHVDNTRBXHVDMkI1XHVCMkM4XHVCMkU0LiBcdUIyRTRcdUMyREMgXHVDMkRDXHVCM0M0XHVENTU4XHVDMkVEXHVDMkRDXHVDNjI0LiJ9LAorICAgICAgICB7IkVudGVyLnByb21wdC5hbGlhcy5uYW1lLiIsICJ7MH0gXHVCQ0M0XHVDRTZEIFx1Qzc3NFx1Qjk4NCBcdUM3ODVcdUI4MjU6ICAifSwKKyAgICAgICAgeyJFbnRlci5uZXcuYWxpYXMubmFtZS5SRVRVUk4udG8uY2FuY2VsLmltcG9ydC5mb3IudGhpcy5lbnRyeS4iLAorICAgICAgICAgICAgICAgICAiXHVDMEM4IFx1QkNDNFx1Q0U2RCBcdUM3NzRcdUI5ODQgXHVDNzg1XHVCODI1XHQoXHVDNzc0IFx1RDU2RFx1QkFBOVx1QzVEMCBcdUIzMDBcdUQ1NUMgXHVDNzg0XHVEM0VDXHVEMkI4XHVCOTdDIFx1Q0RFOFx1QzE4Q1x1RDU1OFx1QjgyNFx1QkE3NCBFbnRlciBcdUQwQTRcdUI5N0MgXHVCMjA0XHVCOTg0KTogICJ9LAorICAgICAgICB7IkVudGVyLmFsaWFzLm5hbWUuIiwgIlx1QkNDNFx1Q0U2RCBcdUM3NzRcdUI5ODQgXHVDNzg1XHVCODI1OiAgIn0sCisgICAgICAgIHsiLlJFVFVSTi5pZi5zYW1lLmFzLmZvci5vdGhlckFsaWFzLiIsCisgICAgICAgICAgICAgICAgIlx0KDx7MH0+XHVBQ0ZDKFx1QzY0MCkgXHVCM0Q5XHVDNzdDXHVENTVDIFx1QUNCRFx1QzZCMCBFbnRlciBcdUQwQTRcdUI5N0MgXHVCMjA0XHVCOTg0KSJ9LAorICAgICAgICB7Ii5QQVRURVJOLnByaW50WDUwOUNlcnQiLAorICAgICAgICAgICAgICAgICJcdUMxOENcdUM3MjBcdUM3OTA6IHswfVxuXHVCQzFDXHVENTg5XHVDNzkwOiB7MX1cblx1Qzc3Q1x1QjgyOCBcdUJDODhcdUQ2Mzg6IHsyfVxuXHVDODAxXHVENTY5XHVENTVDIFx1QzJEQ1x1Qzc5MSBcdUIwQTBcdUM5REM6IHszfSwgXHVDODg1XHVCOENDIFx1QjBBMFx1QzlEQzogezR9XG5cdUM3NzhcdUM5OURcdUMxMUMgXHVDOUMwXHVCQjM4OlxuXHQgTUQ1OiB7NX1cblx0IFNIQTE6IHs2fVxuXHQgU0hBMjU2OiB7N31cblx0IFx1QzExQ1x1QkE4NSBcdUM1NENcdUFDRTBcdUI5QUNcdUM5OTggXHVDNzc0XHVCOTg0OiB7OH1cblx0IFx1QkM4NFx1QzgwNDogezl9In0sCisgICAgICAgIHsiV2hhdC5pcy55b3VyLmZpcnN0LmFuZC5sYXN0Lm5hbWUuIiwKKyAgICAgICAgICAgICAgICAiXHVDNzc0XHVCOTg0XHVBQ0ZDIFx1QzEzMVx1Qzc0NCBcdUM3ODVcdUI4MjVcdUQ1NThcdUMyRURcdUMyRENcdUM2MjQuIn0sCisgICAgICAgIHsiV2hhdC5pcy50aGUubmFtZS5vZi55b3VyLm9yZ2FuaXphdGlvbmFsLnVuaXQuIiwKKyAgICAgICAgICAgICAgICAiXHVDODcwXHVDOUMxIFx1QjJFOFx1QzcwNCBcdUM3NzRcdUI5ODRcdUM3NDQgXHVDNzg1XHVCODI1XHVENTU4XHVDMkVEXHVDMkRDXHVDNjI0LiJ9LAorICAgICAgICB7IldoYXQuaXMudGhlLm5hbWUub2YueW91ci5vcmdhbml6YXRpb24uIiwKKyAgICAgICAgICAgICAgICAiXHVDODcwXHVDOUMxIFx1Qzc3NFx1Qjk4NFx1Qzc0NCBcdUM3ODVcdUI4MjVcdUQ1NThcdUMyRURcdUMyRENcdUM2MjQuIn0sCisgICAgICAgIHsiV2hhdC5pcy50aGUubmFtZS5vZi55b3VyLkNpdHkub3IuTG9jYWxpdHkuIiwKKyAgICAgICAgICAgICAgICAiXHVBRDZDL1x1QUQ3MC9cdUMyREMgXHVDNzc0XHVCOTg0XHVDNzQ0IFx1Qzc4NVx1QjgyNVx1RDU1OFx1QzJFRFx1QzJEQ1x1QzYyND8ifSwKKyAgICAgICAgeyJXaGF0LmlzLnRoZS5uYW1lLm9mLnlvdXIuU3RhdGUub3IuUHJvdmluY2UuIiwKKyAgICAgICAgICAgICAgICAiXHVDMkRDL1x1QjNDNCBcdUM3NzRcdUI5ODRcdUM3NDQgXHVDNzg1XHVCODI1XHVENTU4XHVDMkVEXHVDMkRDXHVDNjI0LiJ9LAorICAgICAgICB7IldoYXQuaXMudGhlLnR3by5sZXR0ZXIuY291bnRyeS5jb2RlLmZvci50aGlzLnVuaXQuIiwKKyAgICAgICAgICAgICAgICAiXHVDNzc0IFx1Qzg3MFx1QzlDMVx1Qzc1OCBcdUI0NTAgXHVDNzkwXHVCOUFDIFx1QUQ2RFx1QUMwMCBcdUNGNTRcdUI0RENcdUI5N0MgXHVDNzg1XHVCODI1XHVENTU4XHVDMkVEXHVDMkRDXHVDNjI0LiJ9LAorICAgICAgICB7IklzLm5hbWUuY29ycmVjdC4iLCAiezB9XHVDNzc0KFx1QUMwMCkgXHVCOURFXHVDMkI1XHVCMkM4XHVBRTRDPyJ9LAorICAgICAgICB7Im5vIiwgIlx1QzU0NFx1QjJDOFx1QzYyNCJ9LAorICAgICAgICB7InllcyIsICJcdUM2MDgifSwKKyAgICAgICAgeyJ5IiwgInkifSwKKyAgICAgICAgeyIuZGVmYXVsdFZhbHVlLiIsICIgIFt7MH1dOiAgIn0sCisgICAgICAgIHsiQWxpYXMuYWxpYXMuaGFzLm5vLmtleSIsCisgICAgICAgICAgICAgICAgIjx7MH0+IFx1QkNDNFx1Q0U2RFx1QzVEMCBcdUQwQTRcdUFDMDAgXHVDNUM2XHVDMkI1XHVCMkM4XHVCMkU0LiJ9LAorICAgICAgICB7IkFsaWFzLmFsaWFzLnJlZmVyZW5jZXMuYW4uZW50cnkudHlwZS50aGF0LmlzLm5vdC5hLnByaXZhdGUua2V5LmVudHJ5LlRoZS5rZXljbG9uZS5jb21tYW5kLm9ubHkuc3VwcG9ydHMuY2xvbmluZy5vZi5wcml2YXRlLmtleSIsCisgICAgICAgICAgICAgICAgICI8ezB9PiBcdUJDQzRcdUNFNkRcdUM3NDAgXHVDODA0XHVDNkE5IFx1RDBBNCBcdUQ1NkRcdUJBQTlcdUM3NzQgXHVDNTQ0XHVCMkNDIFx1RDU2RFx1QkFBOSBcdUM3MjBcdUQ2MTVcdUM3NDQgXHVDQzM4XHVDODcwXHVENTY5XHVCMkM4XHVCMkU0LiAta2V5Y2xvbmUgXHVCQTg1XHVCODM5XHVDNzQwIFx1QzgwNFx1QzZBOSBcdUQwQTQgXHVENTZEXHVCQUE5XHVDNzU4IFx1QkNGNVx1QzgxQ1x1QjlDQyBcdUM5QzBcdUM2RDBcdUQ1NjlcdUIyQzhcdUIyRTQuIn0sCisKKyAgICAgICAgeyIuV0FSTklORy5XQVJOSU5HLldBUk5JTkcuIiwKKyAgICAgICAgICAgICIqKioqKioqKioqKioqKioqKiAgXHVBQ0JEXHVBQ0UwIFx1QUNCRFx1QUNFMCBcdUFDQkRcdUFDRTAgICoqKioqKioqKioqKioqKioqIn0sCisgICAgICAgIHsiU2lnbmVyLmQuIiwgIlx1QzExQ1x1QkE4NVx1Qzc5MCAjJWQ6In0sCisgICAgICAgIHsiVGltZXN0YW1wLiIsICJcdUMyRENcdUFDMDQgXHVBRTMwXHVCODVEOiJ9LAorICAgICAgICB7IlNpZ25hdHVyZS4iLCAiXHVDMTFDXHVCQTg1OiJ9LAorICAgICAgICB7IkNSTHMuIiwgIkNSTDoifSwKKyAgICAgICAgeyJDZXJ0aWZpY2F0ZS5vd25lci4iLCAiXHVDNzc4XHVDOTlEXHVDMTFDIFx1QzE4Q1x1QzcyMFx1Qzc5MDogIn0sCisgICAgICAgIHsiTm90LmEuc2lnbmVkLmphci5maWxlIiwgIlx1QzExQ1x1QkE4NVx1QjQxQyBqYXIgXHVEMzBDXHVDNzdDXHVDNzc0IFx1QzU0NFx1QjJEOVx1QjJDOFx1QjJFNC4ifSwKKyAgICAgICAgeyJOby5jZXJ0aWZpY2F0ZS5mcm9tLnRoZS5TU0wuc2VydmVyIiwKKyAgICAgICAgICAgICAgICAiU1NMIFx1QzExQ1x1QkM4NFx1QzVEMFx1QzExQyBcdUFDMDBcdUM4MzhcdUM2MjggXHVDNzc4XHVDOTlEXHVDMTFDXHVBQzAwIFx1QzVDNlx1QzJCNVx1QjJDOFx1QjJFNC4ifSwKKworICAgICAgICB7Ii5UaGUuaW50ZWdyaXR5Lm9mLnRoZS5pbmZvcm1hdGlvbi5zdG9yZWQuaW4ueW91ci5rZXlzdG9yZS4iLAorICAgICAgICAgICAgIiogXHVEMEE0IFx1QzgwMFx1QzdBNVx1QzE4Q1x1QzVEMCBcdUM4MDBcdUM3QTVcdUI0MUMgXHVDODE1XHVCQ0Y0XHVDNzU4IFx1QkIzNFx1QUNCMFx1QzEzMVx1Qzc3NCAgKlxuKiBcdUQ2NTVcdUM3NzhcdUI0MThcdUM5QzAgXHVDNTRBXHVDNTU4XHVDMkI1XHVCMkM4XHVCMkU0ISBcdUJCMzRcdUFDQjBcdUMxMzFcdUM3NDQgXHVENjU1XHVDNzc4XHVENTU4XHVCODI0XHVCQTc0LCAqXG4qIFx1RDBBNCBcdUM4MDBcdUM3QTVcdUMxOEMgXHVCRTQ0XHVCQzAwXHVCQzg4XHVENjM4XHVCOTdDIFx1QzgxQ1x1QUNGNVx1RDU3NFx1QzU3QyBcdUQ1NjlcdUIyQzhcdUIyRTQuICAgICAgICAgICAgICAgICAgKiJ9LAorICAgICAgICB7Ii5UaGUuaW50ZWdyaXR5Lm9mLnRoZS5pbmZvcm1hdGlvbi5zdG9yZWQuaW4udGhlLnNyY2tleXN0b3JlLiIsCisgICAgICAgICAgICAiKiBzcmNrZXlzdG9yZVx1QzVEMCBcdUM4MDBcdUM3QTVcdUI0MUMgXHVDODE1XHVCQ0Y0XHVDNzU4IFx1QkIzNFx1QUNCMFx1QzEzMVx1Qzc3NCAgKlxuKiBcdUQ2NTVcdUM3NzhcdUI0MThcdUM5QzAgXHVDNTRBXHVDNTU4XHVDMkI1XHVCMkM4XHVCMkU0ISBcdUJCMzRcdUFDQjBcdUMxMzFcdUM3NDQgXHVENjU1XHVDNzc4XHVENTU4XHVCODI0XHVCQTc0LCAqXG4qIHNyY2tleXN0b3JlIFx1QkU0NFx1QkMwMFx1QkM4OFx1RDYzOFx1Qjk3QyBcdUM4MUNcdUFDRjVcdUQ1NzRcdUM1N0MgXHVENTY5XHVCMkM4XHVCMkU0LiAgICAgICAgICAgICAgICAgICoifSwKKworICAgICAgICB7IkNlcnRpZmljYXRlLnJlcGx5LmRvZXMubm90LmNvbnRhaW4ucHVibGljLmtleS5mb3IuYWxpYXMuIiwKKyAgICAgICAgICAgICAgICAiXHVDNzc4XHVDOTlEXHVDMTFDIFx1RDY4Q1x1QzJFMFx1QzVEMCA8ezB9Plx1QzVEMCBcdUIzMDBcdUQ1NUMgXHVBQ0Y1XHVDNkE5IFx1RDBBNFx1QUMwMCBcdUQzRUNcdUQ1NjhcdUI0MThcdUM1QjQgXHVDNzg4XHVDOUMwIFx1QzU0QVx1QzJCNVx1QjJDOFx1QjJFNC4ifSwKKyAgICAgICAgeyJJbmNvbXBsZXRlLmNlcnRpZmljYXRlLmNoYWluLmluLnJlcGx5IiwKKyAgICAgICAgICAgICAgICAiXHVENjhDXHVDMkUwXHVDNUQwIFx1QkQ4OFx1QzY0NFx1QzgwNFx1RDU1QyBcdUM3NzhcdUM5OURcdUMxMUMgXHVDQ0I0XHVDNzc4XHVDNzc0IFx1Qzc4OFx1QzJCNVx1QjJDOFx1QjJFNC4ifSwKKyAgICAgICAgeyJDZXJ0aWZpY2F0ZS5jaGFpbi5pbi5yZXBseS5kb2VzLm5vdC52ZXJpZnkuIiwKKyAgICAgICAgICAgICAgICAiXHVENjhDXHVDMkUwXHVDNzU4IFx1Qzc3OFx1Qzk5RFx1QzExQyBcdUNDQjRcdUM3NzhcdUM3NzQgXHVENjU1XHVDNzc4XHVCNDE4XHVDOUMwIFx1QzU0QVx1Qzc0QzogIn0sCisgICAgICAgIHsiVG9wLmxldmVsLmNlcnRpZmljYXRlLmluLnJlcGx5LiIsCisgICAgICAgICAgICAgICAgIlx1RDY4Q1x1QzJFMFx1QzVEMCBcdUNENUNcdUMwQzFcdUM3MDQgXHVCODA4XHVCQ0E4IFx1Qzc3OFx1Qzk5RFx1QzExQ1x1QUMwMCBcdUM3ODhcdUM3NEM6XG4ifSwKKyAgICAgICAgeyIuaXMubm90LnRydXN0ZWQuIiwgIi4uLlx1Qzc0NChcdUI5N0MpIFx1QzJFMFx1QjhCMFx1RDU2MCBcdUMyMTggXHVDNUM2XHVDMkI1XHVCMkM4XHVCMkU0LiAifSwKKyAgICAgICAgeyJJbnN0YWxsLnJlcGx5LmFueXdheS5uby4iLCAiXHVENjhDXHVDMkUwXHVDNzQ0IFx1QzEyNFx1Q0U1OFx1RDU1OFx1QUNBMFx1QzJCNVx1QjJDOFx1QUU0Qz8gW1x1QzU0NFx1QjJDOFx1QzYyNF06ICAifSwKKyAgICAgICAgeyJOTyIsICJcdUM1NDRcdUIyQzhcdUM2MjQifSwKKyAgICAgICAgeyJQdWJsaWMua2V5cy5pbi5yZXBseS5hbmQua2V5c3RvcmUuZG9uLnQubWF0Y2giLAorICAgICAgICAgICAgICAgICJcdUQ2OENcdUMyRTBcdUFDRkMgXHVEMEE0IFx1QzgwMFx1QzdBNVx1QzE4Q1x1Qzc1OCBcdUFDRjVcdUM2QTkgXHVEMEE0XHVBQzAwIFx1Qzc3Q1x1Q0U1OFx1RDU1OFx1QzlDMCBcdUM1NEFcdUMyQjVcdUIyQzhcdUIyRTQuIn0sCisgICAgICAgIHsiQ2VydGlmaWNhdGUucmVwbHkuYW5kLmNlcnRpZmljYXRlLmluLmtleXN0b3JlLmFyZS5pZGVudGljYWwiLAorICAgICAgICAgICAgICAgICJcdUQ2OENcdUMyRTBcdUFDRkMgXHVEMEE0IFx1QzgwMFx1QzdBNVx1QzE4Q1x1Qzc1OCBcdUM3NzhcdUM5OURcdUMxMUNcdUFDMDAgXHVCM0Q5XHVDNzdDXHVENTY5XHVCMkM4XHVCMkU0LiJ9LAorICAgICAgICB7IkZhaWxlZC50by5lc3RhYmxpc2guY2hhaW4uZnJvbS5yZXBseSIsCisgICAgICAgICAgICAgICAgIlx1RDY4Q1x1QzJFMFx1Qzc1OCBcdUNDQjRcdUM3NzggXHVDMTI0XHVDODE1XHVDNzQ0IFx1QzJFNFx1RDMyOFx1RDU4OFx1QzJCNVx1QjJDOFx1QjJFNC4ifSwKKyAgICAgICAgeyJuIiwgIm4ifSwKKyAgICAgICAgeyJXcm9uZy5hbnN3ZXIudHJ5LmFnYWluIiwgIlx1Qzc5OFx1QkFCQlx1QjQxQyBcdUM3NTFcdUIyRjVcdUM3ODVcdUIyQzhcdUIyRTQuIFx1QjJFNFx1QzJEQyBcdUMyRENcdUIzQzRcdUQ1NThcdUMyRURcdUMyRENcdUM2MjQuIn0sCisgICAgICAgIHsiU2VjcmV0LmtleS5ub3QuZ2VuZXJhdGVkLmFsaWFzLmFsaWFzLmFscmVhZHkuZXhpc3RzIiwKKyAgICAgICAgICAgICAgICAiXHVCQ0Y0XHVDNTQ4IFx1RDBBNFx1QUMwMCBcdUMwRERcdUMxMzFcdUI0MThcdUM5QzAgXHVDNTRBXHVDNTU4XHVDNzNDXHVCQTcwIDx7MH0+IFx1QkNDNFx1Q0U2RFx1Qzc3NCBcdUM4NzRcdUM3QUNcdUQ1NjlcdUIyQzhcdUIyRTQuIn0sCisgICAgICAgIHsiUGxlYXNlLnByb3ZpZGUua2V5c2l6ZS5mb3Iuc2VjcmV0LmtleS5nZW5lcmF0aW9uIiwKKyAgICAgICAgICAgICAgICAiXHVCQ0Y0XHVDNTQ4IFx1RDBBNFx1Qjk3QyBcdUMwRERcdUMxMzFcdUQ1NThcdUI4MjRcdUJBNzQgLWtleXNpemVcdUI5N0MgXHVDODFDXHVBQ0Y1XHVENTU4XHVDMkVEXHVDMkRDXHVDNjI0LiJ9LAorCisgICAgICAgIHsiRXh0ZW5zaW9ucy4iLCAiXHVENjU1XHVDN0E1OiAifSwKKyAgICAgICAgeyIuRW1wdHkudmFsdWUuIiwgIihcdUJFNDRcdUM1QjQgXHVDNzg4XHVCMjk0IFx1QUMxMikifSwKKyAgICAgICAgeyJFeHRlbnNpb24uUmVxdWVzdC4iLCAiXHVENjU1XHVDN0E1IFx1QzY5NFx1Q0NBRDoifSwKKyAgICAgICAgeyJQS0NTLjEwLkNlcnRpZmljYXRlLlJlcXVlc3QuVmVyc2lvbi4xLjAuU3ViamVjdC5zLlB1YmxpYy5LZXkucy5mb3JtYXQucy5rZXkuIiwKKyAgICAgICAgICAgICAgICAiUEtDUyAjMTAgXHVDNzc4XHVDOTlEXHVDMTFDIFx1QzY5NFx1Q0NBRCgxLjAgXHVCQzg0XHVDODA0KVxuXHVDODFDXHVCQUE5OiAlc1xuXHVBQ0Y1XHVDNkE5IFx1RDBBNDogJXMgXHVENjE1XHVDMkREICVzIFx1RDBBNFxuIn0sCisgICAgICAgIHsiVW5rbm93bi5rZXlVc2FnZS50eXBlLiIsICJcdUM1NEMgXHVDMjE4IFx1QzVDNlx1QjI5NCBrZXlVc2FnZSBcdUM3MjBcdUQ2MTU6ICJ9LAorICAgICAgICB7IlVua25vd24uZXh0ZW5kZWRrZXlVc2FnZS50eXBlLiIsICJcdUM1NEMgXHVDMjE4IFx1QzVDNlx1QjI5NCBleHRlbmRlZGtleVVzYWdlIFx1QzcyMFx1RDYxNTogIn0sCisgICAgICAgIHsiVW5rbm93bi5BY2Nlc3NEZXNjcmlwdGlvbi50eXBlLiIsICJcdUM1NEMgXHVDMjE4IFx1QzVDNlx1QjI5NCBBY2Nlc3NEZXNjcmlwdGlvbiBcdUM3MjBcdUQ2MTU6ICJ9LAorICAgICAgICB7IlVucmVjb2duaXplZC5HZW5lcmFsTmFtZS50eXBlLiIsICJcdUM1NEMgXHVDMjE4IFx1QzVDNlx1QjI5NCBHZW5lcmFsTmFtZSBcdUM3MjBcdUQ2MTU6ICJ9LAorICAgICAgICB7IlRoaXMuZXh0ZW5zaW9uLmNhbm5vdC5iZS5tYXJrZWQuYXMuY3JpdGljYWwuIiwKKyAgICAgICAgICAgICAgICAgIlx1Qzc3NCBcdUQ2NTVcdUM3QTVcdUM3NDAgXHVDOTExXHVDNjk0XHVENTVDIFx1QUM4M1x1QzczQ1x1Qjg1QyBcdUQ0NUNcdUMyRENcdUQ1NjAgXHVDMjE4IFx1QzVDNlx1QzJCNVx1QjJDOFx1QjJFNC4gIn0sCisgICAgICAgIHsiT2RkLm51bWJlci5vZi5oZXguZGlnaXRzLmZvdW5kLiIsICJcdUQ2NDBcdUMyMTggXHVBQzFDXHVDNzU4IDE2XHVDOUM0XHVDMjE4XHVBQzAwIFx1QkMxQ1x1QUNBQ1x1QjQyODogIn0sCisgICAgICAgIHsiVW5rbm93bi5leHRlbnNpb24udHlwZS4iLCAiXHVDNTRDIFx1QzIxOCBcdUM1QzZcdUIyOTQgXHVENjU1XHVDN0E1IFx1QzcyMFx1RDYxNTogIn0sCisgICAgICAgIHsiY29tbWFuZC57MH0uaXMuYW1iaWd1b3VzLiIsICJ7MH0gXHVCQTg1XHVCODM5XHVDNzc0IFx1QkFBOFx1RDYzOFx1RDU2ODoifQorICAgIH07CisKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGNvbnRlbnRzIG9mIHRoaXMgPGNvZGU+UmVzb3VyY2VCdW5kbGU8L2NvZGU+LgorICAgICAqCisgICAgICogPHA+CisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBjb250ZW50cyBvZiB0aGlzIDxjb2RlPlJlc291cmNlQnVuZGxlPC9jb2RlPi4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0W11bXSBnZXRDb250ZW50cygpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRlbnRzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdG9vbHMva2V5dG9vbC9SZXNvdXJjZXNfcHRfQlIuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdG9vbHMva2V5dG9vbC9SZXNvdXJjZXNfcHRfQlIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGI0ZDI2Ci0tLSAvZGV2L251bGwKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS90b29scy9rZXl0b29sL1Jlc291cmNlc19wdF9CUi5qYXZhCkBAIC0wLDAgKzEsNDMxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBPcmFjbGUgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKKyAqIHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIHN1bi5zZWN1cml0eS50b29scy5rZXl0b29sOworCisvKioKKyAqIDxwPiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIDxjb2RlPlJlc291cmNlQnVuZGxlPC9jb2RlPgorICogZm9yIHRoZSBrZXl0b29sLgorICoKKyAqLworcHVibGljIGNsYXNzIFJlc291cmNlc19wdF9CUiBleHRlbmRzIGphdmEudXRpbC5MaXN0UmVzb3VyY2VCdW5kbGUgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W11bXSBjb250ZW50cyA9IHsKKyAgICAgICAgeyJORVdMSU5FIiwgIlxuIn0sCisgICAgICAgIHsiU1RBUiIsCisgICAgICAgICAgICAgICAgIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioifSwKKyAgICAgICAgeyJTVEFSTk4iLAorICAgICAgICAgICAgICAgICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cbiJ9LAorCisgICAgICAgIC8vIGtleXRvb2w6IEhlbHAgcGFydAorLy8gIk9wdGlvbiIgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCisgICAgICAgIHsiLk9QVElPTi4iLCAiIFtPcFx1MDBFN1x1MDBFM29dLi4uIn0sCisgICAgICAgIHsiT3B0aW9ucy4iLCAiT3BcdTAwRTdcdTAwRjVlczoifSwKKyAgICAgICAgeyJVc2Uua2V5dG9vbC5oZWxwLmZvci5hbGwuYXZhaWxhYmxlLmNvbW1hbmRzIiwKKyAgICAgICAgICAgICAgICAgIlVzZSBcImtleXRvb2wgLWhlbHBcIiBwYXJhIHRvZG9zIG9zIGNvbWFuZG9zIGRpc3Bvblx1MDBFRHZlaXMifSwKKyAgICAgICAgeyJLZXkuYW5kLkNlcnRpZmljYXRlLk1hbmFnZW1lbnQuVG9vbCIsCisgICAgICAgICAgICAgICAgICJGZXJyYW1lbnRhIGRlIEdlcmVuY2lhbWVudG8gZGUgQ2hhdmUgZSBDZXJ0aWZpY2FkbyJ9LAorICAgICAgICB7IkNvbW1hbmRzLiIsICJDb21hbmRvczoifSwKKyAgICAgICAgeyJVc2Uua2V5dG9vbC5jb21tYW5kLm5hbWUuaGVscC5mb3IudXNhZ2Uub2YuY29tbWFuZC5uYW1lIiwKKyAgICAgICAgICAgICAgICAiVXNlIFwia2V5dG9vbCAtY29tbWFuZF9uYW1lIC1oZWxwXCIgcGFyYSB1c28gZGUgY29tbWFuZF9uYW1lIn0sCisgICAgICAgIC8vIGtleXRvb2w6IGhlbHA6IGNvbW1hbmRzCisgICAgICAgIHsiR2VuZXJhdGVzLmEuY2VydGlmaWNhdGUucmVxdWVzdCIsCisgICAgICAgICAgICAgICAgIkdlcmEgdW1hIHNvbGljaXRhXHUwMEU3XHUwMEUzbyBkZSBjZXJ0aWZpY2FkbyJ9LCAvLy1jZXJ0cmVxCisgICAgICAgIHsiQ2hhbmdlcy5hbi5lbnRyeS5zLmFsaWFzIiwKKyAgICAgICAgICAgICAgICAiQWx0ZXJhIHVtIGFsaWFzIGRlIGVudHJhZGEifSwgLy8tY2hhbmdlYWxpYXMKKyAgICAgICAgeyJEZWxldGVzLmFuLmVudHJ5IiwKKyAgICAgICAgICAgICAgICAiRGVsZXRhIHVtYSBlbnRyYWRhIn0sIC8vLWRlbGV0ZQorICAgICAgICB7IkV4cG9ydHMuY2VydGlmaWNhdGUiLAorICAgICAgICAgICAgICAgICJFeHBvcnRhIG8gY2VydGlmaWNhZG8ifSwgLy8tZXhwb3J0Y2VydAorICAgICAgICB7IkdlbmVyYXRlcy5hLmtleS5wYWlyIiwKKyAgICAgICAgICAgICAgICAiR2VyYSB1bSBwYXIgZGUgY2hhdmVzIn0sIC8vLWdlbmtleXBhaXIKKy8vIHRyYW5zbGF0aW9uIG9mICJzZWNyZXQiIGtleSBzaG91bGQgYmUgZGlmZmVyZW50IHRvICJwcml2YXRlIiBrZXkuCisgICAgICAgIHsiR2VuZXJhdGVzLmEuc2VjcmV0LmtleSIsCisgICAgICAgICAgICAgICAgIkdlcmEgdW1hIGNoYXZlIFNlY3JldGEifSwgLy8tZ2Vuc2Vja2V5CisgICAgICAgIHsiR2VuZXJhdGVzLmNlcnRpZmljYXRlLmZyb20uYS5jZXJ0aWZpY2F0ZS5yZXF1ZXN0IiwKKyAgICAgICAgICAgICAgICAiR2VyYSB1bSBjZXJ0aWZpY2FkbyBkZSB1bWEgc29saWNpdGFcdTAwRTdcdTAwRTNvIGRlIGNlcnRpZmljYWRvIn0sIC8vLWdlbmNlcnQKKyAgICAgICAgeyJHZW5lcmF0ZXMuQ1JMIiwgIkdlcmEgQ1JMIn0sIC8vLWdlbmNybAorICAgICAgICB7IkltcG9ydHMuZW50cmllcy5mcm9tLmEuSkRLLjEuMS54LnN0eWxlLmlkZW50aXR5LmRhdGFiYXNlIiwKKyAgICAgICAgICAgICAgICAiSW1wb3J0YSBlbnRyYWRhcyBkZSB1bSBiYW5jbyBkZSBkYWRvcyBkZSBpZGVudGlkYWRlIEpESyAxLjEueC1zdHlsZSJ9LCAvLy1pZGVudGl0eWRiCisgICAgICAgIHsiSW1wb3J0cy5hLmNlcnRpZmljYXRlLm9yLmEuY2VydGlmaWNhdGUuY2hhaW4iLAorICAgICAgICAgICAgICAgICJJbXBvcnRhIHVtIGNlcnRpZmljYWRvIG91IHVtYSBjYWRlaWEgZGUgY2VydGlmaWNhZG9zIn0sIC8vLWltcG9ydGNlcnQKKyAgICAgICAgeyJJbXBvcnRzLm9uZS5vci5hbGwuZW50cmllcy5mcm9tLmFub3RoZXIua2V5c3RvcmUiLAorICAgICAgICAgICAgICAgICJJbXBvcnRhIHVtYSBvdSB0b2RhcyBhcyBlbnRyYWRhcyBkZSBvdXRyYSBcdTAwRTFyZWEgZGUgYXJtYXplbmFtZW50byBkZSBjaGF2ZXMifSwgLy8taW1wb3J0a2V5c3RvcmUKKyAgICAgICAgeyJDbG9uZXMuYS5rZXkuZW50cnkiLAorICAgICAgICAgICAgICAgICJDbG9uYSB1bWEgZW50cmFkYSBkZSBjaGF2ZSJ9LCAvLy1rZXljbG9uZQorICAgICAgICB7IkNoYW5nZXMudGhlLmtleS5wYXNzd29yZC5vZi5hbi5lbnRyeSIsCisgICAgICAgICAgICAgICAgIkFsdGVyYSBhIHNlbmhhIGRhIGNoYXZlIGRlIHVtYSBlbnRyYWRhIn0sIC8vLWtleXBhc3N3ZAorICAgICAgICB7Ikxpc3RzLmVudHJpZXMuaW4uYS5rZXlzdG9yZSIsCisgICAgICAgICAgICAgICAgIkxpc3RhIGVudHJhZGFzIGVtIHVtYSBcdTAwRTFyZWEgZGUgYXJtYXplbmFtZW50byBkZSBjaGF2ZXMifSwgLy8tbGlzdAorICAgICAgICB7IlByaW50cy50aGUuY29udGVudC5vZi5hLmNlcnRpZmljYXRlIiwKKyAgICAgICAgICAgICAgICAiSW1wcmltZSBvIGNvbnRlXHUwMEZBZG8gZGUgdW0gY2VydGlmaWNhZG8ifSwgLy8tcHJpbnRjZXJ0CisgICAgICAgIHsiUHJpbnRzLnRoZS5jb250ZW50Lm9mLmEuY2VydGlmaWNhdGUucmVxdWVzdCIsCisgICAgICAgICAgICAgICAgIkltcHJpbWUgbyBjb250ZVx1MDBGQWRvIGRlIHVtYSBzb2xpY2l0YVx1MDBFN1x1MDBFM28gZGUgY2VydGlmaWNhZG8ifSwgLy8tcHJpbnRjZXJ0cmVxCisgICAgICAgIHsiUHJpbnRzLnRoZS5jb250ZW50Lm9mLmEuQ1JMLmZpbGUiLAorICAgICAgICAgICAgICAgICJJbXByaW1lIG8gY29udGVcdTAwRkFkbyBkZSB1bSBhcnF1aXZvIENSTCJ9LCAvLy1wcmludGNybAorICAgICAgICB7IkdlbmVyYXRlcy5hLnNlbGYuc2lnbmVkLmNlcnRpZmljYXRlIiwKKyAgICAgICAgICAgICAgICAiR2VyYSB1bSBjZXJ0aWZpY2FkbyBhdXRvYXNzaW5hZG8ifSwgLy8tc2VsZmNlcnQKKyAgICAgICAgeyJDaGFuZ2VzLnRoZS5zdG9yZS5wYXNzd29yZC5vZi5hLmtleXN0b3JlIiwKKyAgICAgICAgICAgICAgICAiQWx0ZXJhIGEgc2VuaGEgZGUgYXJtYXplbmFtZW50byBkZSB1bWEgXHUwMEUxcmVhIGRlIGFybWF6ZW5hbWVudG8gZGUgY2hhdmVzIn0sIC8vLXN0b3JlcGFzc3dkCisgICAgICAgIC8vIGtleXRvb2w6IGhlbHA6IG9wdGlvbnMKKyAgICAgICAgeyJhbGlhcy5uYW1lLm9mLnRoZS5lbnRyeS50by5wcm9jZXNzIiwKKyAgICAgICAgICAgICAgICAibm9tZSBkbyBhbGlhcyBkYSBlbnRyYWRhIGEgc2VyIHByb2Nlc3NhZGEifSwgLy8tYWxpYXMKKyAgICAgICAgeyJkZXN0aW5hdGlvbi5hbGlhcyIsCisgICAgICAgICAgICAgICAgImFsaWFzIGRlIGRlc3Rpbm8ifSwgLy8tZGVzdGFsaWFzCisgICAgICAgIHsiZGVzdGluYXRpb24ua2V5LnBhc3N3b3JkIiwKKyAgICAgICAgICAgICAgICAic2VuaGEgZGEgY2hhdmUgZGUgZGVzdGlubyJ9LCAvLy1kZXN0a2V5cGFzcworICAgICAgICB7ImRlc3RpbmF0aW9uLmtleXN0b3JlLm5hbWUiLAorICAgICAgICAgICAgICAgICJub21lIGRhIFx1MDBFMXJlYSBkZSBhcm1hemVuYW1lbnRvIGRlIGNoYXZlcyBkZSBkZXN0aW5vIn0sIC8vLWRlc3RrZXlzdG9yZQorICAgICAgICB7ImRlc3RpbmF0aW9uLmtleXN0b3JlLnBhc3N3b3JkLnByb3RlY3RlZCIsCisgICAgICAgICAgICAgICAgInNlbmhhIHByb3RlZ2lkYSBkYSBcdTAwRTFyZWEgZGUgYXJtYXplbmFtZW50byBkZSBjaGF2ZXMgZGUgZGVzdGlubyJ9LCAvLy1kZXN0cHJvdGVjdGVkCisgICAgICAgIHsiZGVzdGluYXRpb24ua2V5c3RvcmUucHJvdmlkZXIubmFtZSIsCisgICAgICAgICAgICAgICAgIm5vbWUgZG8gZm9ybmVjZWRvciBkYSBcdTAwRTFyZWEgZGUgYXJtYXplbmFtZW50byBkZSBjaGF2ZXMgZGUgZGVzdGlubyJ9LCAvLy1kZXN0cHJvdmlkZXJuYW1lCisgICAgICAgIHsiZGVzdGluYXRpb24ua2V5c3RvcmUucGFzc3dvcmQiLAorICAgICAgICAgICAgICAgICJzZW5oYSBkYSBcdTAwRTFyZWEgZGUgYXJtYXplbmFtZW50byBkZSBjaGF2ZXMgZGUgZGVzdGlubyJ9LCAvLy1kZXN0c3RvcmVwYXNzCisgICAgICAgIHsiZGVzdGluYXRpb24ua2V5c3RvcmUudHlwZSIsCisgICAgICAgICAgICAgICAgInRpcG8gZGUgXHUwMEUxcmVhIGRlIGFybWF6ZW5hbWVudG8gZGUgY2hhdmVzIGRlIGRlc3Rpbm8ifSwgLy8tZGVzdHN0b3JldHlwZQorICAgICAgICB7ImRpc3Rpbmd1aXNoZWQubmFtZSIsCisgICAgICAgICAgICAgICAgIm5vbWUgZGlzdGludG8ifSwgLy8tZG5hbWUKKyAgICAgICAgeyJYLjUwOS5leHRlbnNpb24iLAorICAgICAgICAgICAgICAgICJleHRlbnNcdTAwRTNvIFguNTA5In0sIC8vLWV4dAorICAgICAgICB7Im91dHB1dC5maWxlLm5hbWUiLAorICAgICAgICAgICAgICAgICJub21lIGRvIGFycXVpdm8gZGUgc2FcdTAwRURkYSJ9LCAvLy1maWxlIGFuZCAtb3V0ZmlsZQorICAgICAgICB7ImlucHV0LmZpbGUubmFtZSIsCisgICAgICAgICAgICAgICAgIm5vbWUgZG8gYXJxdWl2byBkZSBlbnRyYWRhIn0sIC8vLWZpbGUgYW5kIC1pbmZpbGUKKyAgICAgICAgeyJrZXkuYWxnb3JpdGhtLm5hbWUiLAorICAgICAgICAgICAgICAgICJub21lIGRvIGFsZ29yaXRtbyBkYSBjaGF2ZSJ9LCAvLy1rZXlhbGcKKyAgICAgICAgeyJrZXkucGFzc3dvcmQiLAorICAgICAgICAgICAgICAgICJzZW5oYSBkYSBjaGF2ZSJ9LCAvLy1rZXlwYXNzCisgICAgICAgIHsia2V5LmJpdC5zaXplIiwKKyAgICAgICAgICAgICAgICAidGFtYW5obyBkbyBiaXQgZGEgY2hhdmUifSwgLy8ta2V5c2l6ZQorICAgICAgICB7ImtleXN0b3JlLm5hbWUiLAorICAgICAgICAgICAgICAgICJub21lIGRhIFx1MDBFMXJlYSBkZSBhcm1hemVuYW1lbnRvIGRlIGNoYXZlcyJ9LCAvLy1rZXlzdG9yZQorICAgICAgICB7Im5ldy5wYXNzd29yZCIsCisgICAgICAgICAgICAgICAgIm5vdmEgc2VuaGEifSwgLy8tbmV3CisgICAgICAgIHsiZG8ubm90LnByb21wdCIsCisgICAgICAgICAgICAgICAgIm5cdTAwRTNvIHBlcmd1bnRhciJ9LCAvLy1ub3Byb21wdAorICAgICAgICB7InBhc3N3b3JkLnRocm91Z2gucHJvdGVjdGVkLm1lY2hhbmlzbSIsCisgICAgICAgICAgICAgICAgInNlbmhhIHBvciBtZWlvIGRlIG1lY2FuaXNtbyBwcm90ZWdpZG8ifSwgLy8tcHJvdGVjdGVkCisgICAgICAgIHsicHJvdmlkZXIuYXJndW1lbnQiLAorICAgICAgICAgICAgICAgICJhcmd1bWVudG8gZG8gZm9ybmVjZWRvciJ9LCAvLy1wcm92aWRlcmFyZworICAgICAgICB7InByb3ZpZGVyLmNsYXNzLm5hbWUiLAorICAgICAgICAgICAgICAgICJub21lIGRhIGNsYXNzZSBkbyBmb3JuZWNlZG9yIn0sIC8vLXByb3ZpZGVyY2xhc3MKKyAgICAgICAgeyJwcm92aWRlci5uYW1lIiwKKyAgICAgICAgICAgICAgICAibm9tZSBkbyBmb3JuZWNlZG9yIn0sIC8vLXByb3ZpZGVybmFtZQorICAgICAgICB7InByb3ZpZGVyLmNsYXNzcGF0aCIsCisgICAgICAgICAgICAgICAgImNsYXNzcGF0aCBkbyBmb3JuZWNlZG9yIn0sIC8vLXByb3ZpZGVycGF0aAorICAgICAgICB7Im91dHB1dC5pbi5SRkMuc3R5bGUiLAorICAgICAgICAgICAgICAgICJzYVx1MDBFRGRhIG5vIGVzdGlsbyBSRkMifSwgLy8tcmZjCisgICAgICAgIHsic2lnbmF0dXJlLmFsZ29yaXRobS5uYW1lIiwKKyAgICAgICAgICAgICAgICAibm9tZSBkbyBhbGdvcml0bW8gZGUgYXNzaW5hdHVyYSJ9LCAvLy1zaWdhbGcKKyAgICAgICAgeyJzb3VyY2UuYWxpYXMiLAorICAgICAgICAgICAgICAgICJhbGlhcyBkZSBvcmlnZW0ifSwgLy8tc3JjYWxpYXMKKyAgICAgICAgeyJzb3VyY2Uua2V5LnBhc3N3b3JkIiwKKyAgICAgICAgICAgICAgICAic2VuaGEgZGEgY2hhdmUgZGUgb3JpZ2VtIn0sIC8vLXNyY2tleXBhc3MKKyAgICAgICAgeyJzb3VyY2Uua2V5c3RvcmUubmFtZSIsCisgICAgICAgICAgICAgICAgIm5vbWUgZGEgXHUwMEUxcmVhIGRlIGFybWF6ZW5hbWVudG8gZGUgY2hhdmVzIGRlIG9yaWdlbSJ9LCAvLy1zcmNrZXlzdG9yZQorICAgICAgICB7InNvdXJjZS5rZXlzdG9yZS5wYXNzd29yZC5wcm90ZWN0ZWQiLAorICAgICAgICAgICAgICAgICJzZW5oYSBwcm90ZWdpZGEgZGEgXHUwMEUxcmVhIGRlIGFybWF6ZW5hbWVudG8gZGUgY2hhdmVzIGRlIG9yaWdlbSJ9LCAvLy1zcmNwcm90ZWN0ZWQKKyAgICAgICAgeyJzb3VyY2Uua2V5c3RvcmUucHJvdmlkZXIubmFtZSIsCisgICAgICAgICAgICAgICAgIm5vbWUgZG8gZm9ybmVjZWRvciBkYSBcdTAwRTFyZWEgZGUgYXJtYXplbmFtZW50byBkZSBjaGF2ZXMgZGUgb3JpZ2VtIn0sIC8vLXNyY3Byb3ZpZGVybmFtZQorICAgICAgICB7InNvdXJjZS5rZXlzdG9yZS5wYXNzd29yZCIsCisgICAgICAgICAgICAgICAgInNlbmhhIGRhIFx1MDBFMXJlYSBkZSBhcm1hemVuYW1lbnRvIGRlIGNoYXZlcyBkZSBvcmlnZW0ifSwgLy8tc3Jjc3RvcmVwYXNzCisgICAgICAgIHsic291cmNlLmtleXN0b3JlLnR5cGUiLAorICAgICAgICAgICAgICAgICJ0aXBvIGRlIFx1MDBFMXJlYSBkZSBhcm1hemVuYW1lbnRvIGRlIGNoYXZlcyBkZSBvcmlnZW0ifSwgLy8tc3Jjc3RvcmV0eXBlCisgICAgICAgIHsiU1NMLnNlcnZlci5ob3N0LmFuZC5wb3J0IiwKKyAgICAgICAgICAgICAgICAicG9ydGEgZSBob3N0IGRvIHNlcnZpZG9yIFNTTCJ9LCAvLy1zc2xzZXJ2ZXIKKyAgICAgICAgeyJzaWduZWQuamFyLmZpbGUiLAorICAgICAgICAgICAgICAgICJhcnF1aXZvIGphciBhc3NpbmFkbyJ9LCAvLz1qYXJmaWxlCisgICAgICAgIHsiY2VydGlmaWNhdGUudmFsaWRpdHkuc3RhcnQuZGF0ZS50aW1lIiwKKyAgICAgICAgICAgICAgICAiZGF0YS9ob3JhIGluaWNpYWwgZGUgdmFsaWRhZGUgZG8gY2VydGlmaWNhZG8ifSwgLy8tc3RhcnRkYXRlCisgICAgICAgIHsia2V5c3RvcmUucGFzc3dvcmQiLAorICAgICAgICAgICAgICAgICJzZW5oYSBkYSBcdTAwRTFyZWEgZGUgYXJtYXplbmFtZW50byBkZSBjaGF2ZXMifSwgLy8tc3RvcmVwYXNzCisgICAgICAgIHsia2V5c3RvcmUudHlwZSIsCisgICAgICAgICAgICAgICAgInRpcG8gZGUgXHUwMEUxcmVhIGRlIGFybWF6ZW5hbWVudG8gZGUgY2hhdmVzIn0sIC8vLXN0b3JldHlwZQorICAgICAgICB7InRydXN0LmNlcnRpZmljYXRlcy5mcm9tLmNhY2VydHMiLAorICAgICAgICAgICAgICAgICJjZXJ0aWZpY2Fkb3MgY29uZmlcdTAwRTF2ZWlzIGRvIGNhY2VydHMifSwgLy8tdHJ1c3RjYWNlcnRzCisgICAgICAgIHsidmVyYm9zZS5vdXRwdXQiLAorICAgICAgICAgICAgICAgICJzYVx1MDBFRGRhIGRldGFsaGFkYSJ9LCAvLy12CisgICAgICAgIHsidmFsaWRpdHkubnVtYmVyLm9mLmRheXMiLAorICAgICAgICAgICAgICAgICJuXHUwMEZBbWVybyBkZSBkaWFzIGRhIHZhbGlkYWRlIn0sIC8vLXZhbGlkaXR5CisgICAgICAgIHsiU2VyaWFsLklELm9mLmNlcnQudG8ucmV2b2tlIiwKKyAgICAgICAgICAgICAgICAgIklEIGRlIHNcdTAwRTlyaWUgZG8gY2VydGlmaWNhZG8gYSBzZXIgcmV2b2dhZG8ifSwgLy8taWQKKyAgICAgICAgLy8ga2V5dG9vbDogUnVubmluZyBwYXJ0CisgICAgICAgIHsia2V5dG9vbC5lcnJvci4iLCAiZXJybyBkZSBrZXl0b29sOiAifSwKKyAgICAgICAgeyJJbGxlZ2FsLm9wdGlvbi4iLCAiT3BcdTAwRTdcdTAwRTNvIGludlx1MDBFMWxpZGE6ICAifSwKKyAgICAgICAgeyJJbGxlZ2FsLnZhbHVlLiIsICJWYWxvciBpbnZcdTAwRTFsaWRvOiAifSwKKyAgICAgICAgeyJVbmtub3duLnBhc3N3b3JkLnR5cGUuIiwgIlRpcG8gZGUgc2VuaGEgZGVzY29uaGVjaWRvOiAifSwKKyAgICAgICAgeyJDYW5ub3QuZmluZC5lbnZpcm9ubWVudC52YXJpYWJsZS4iLAorICAgICAgICAgICAgICAgICJOXHUwMEUzbyBcdTAwRTkgcG9zc1x1MDBFRHZlbCBsb2NhbGl6YXIgYSB2YXJpXHUwMEUxdmVsIGRvIGFtYmllbnRlOiAifSwKKyAgICAgICAgeyJDYW5ub3QuZmluZC5maWxlLiIsICJOXHUwMEUzbyBcdTAwRTkgcG9zc1x1MDBFRHZlbCBsb2NhbGl6YXIgbyBhcnF1aXZvOiAifSwKKyAgICAgICAgeyJDb21tYW5kLm9wdGlvbi5mbGFnLm5lZWRzLmFuLmFyZ3VtZW50LiIsICJBIG9wXHUwMEU3XHUwMEUzbyBkZSBjb21hbmRvIHswfSBwcmVjaXNhIGRlIHVtIGFyZ3VtZW50by4ifSwKKyAgICAgICAgeyJXYXJuaW5nLkRpZmZlcmVudC5zdG9yZS5hbmQua2V5LnBhc3N3b3Jkcy5ub3Quc3VwcG9ydGVkLmZvci5QS0NTMTIuS2V5U3RvcmVzLklnbm9yaW5nLnVzZXIuc3BlY2lmaWVkLmNvbW1hbmQudmFsdWUuIiwKKyAgICAgICAgICAgICAgICAiQWR2ZXJ0XHUwMEVBbmNpYTogU2VuaGFzIGRlIGNoYXZlIGUgZGUgYXJtYXplbmFtZW50byBkaWZlcmVudGVzIG5cdTAwRTNvIHN1cG9ydGFkYXMgcGFyYSBLZXlTdG9yZXMgUEtDUzEyLiBJZ25vcmFuZG8gdmFsb3IgezB9IGVzcGVjaWZpY2FkbyBwZWxvIHVzdVx1MDBFMXJpby4ifSwKKyAgICAgICAgeyIua2V5c3RvcmUubXVzdC5iZS5OT05FLmlmLnN0b3JldHlwZS5pcy57MH0iLAorICAgICAgICAgICAgICAgICIta2V5c3RvcmUgZGV2ZSBzZXIgTk9ORSBzZSAtc3RvcmV0eXBlIGZvciB7MH0ifSwKKyAgICAgICAgeyJUb28ubWFueS5yZXRyaWVzLnByb2dyYW0udGVybWluYXRlZCIsCisgICAgICAgICAgICAgICAgICJFeGNlc3NvIGRlIHRlbnRhdGl2YXMgZGUgcmVwZXRpXHUwMEU3XHUwMEUzbzsgcHJvZ3JhbWEgZmluYWxpemFkbyJ9LAorICAgICAgICB7Ii5zdG9yZXBhc3N3ZC5hbmQua2V5cGFzc3dkLmNvbW1hbmRzLm5vdC5zdXBwb3J0ZWQuaWYuc3RvcmV0eXBlLmlzLnswfSIsCisgICAgICAgICAgICAgICAgImNvbWFuZG9zIC1zdG9yZXBhc3N3ZCBlIC1rZXlwYXNzd2Qgblx1MDBFM28gc3Vwb3J0YWRvcyBzZSAtc3RvcmV0eXBlIGZvciB7MH0ifSwKKyAgICAgICAgeyIua2V5cGFzc3dkLmNvbW1hbmRzLm5vdC5zdXBwb3J0ZWQuaWYuc3RvcmV0eXBlLmlzLlBLQ1MxMiIsCisgICAgICAgICAgICAgICAgImNvbWFuZG9zIC1rZXlwYXNzd2Qgblx1MDBFM28gc3Vwb3J0YWRvcyBzZSAtc3RvcmV0eXBlIGZvciBQS0NTMTIifSwKKyAgICAgICAgeyIua2V5cGFzcy5hbmQubmV3LmNhbi5ub3QuYmUuc3BlY2lmaWVkLmlmLnN0b3JldHlwZS5pcy57MH0iLAorICAgICAgICAgICAgICAgICIta2V5cGFzcyBlIC1uZXcgblx1MDBFM28gcG9kZW0gc2VyIGVzcGVjaWZpY2Fkb3Mgc2UgLXN0b3JldHlwZSBmb3IgezB9In0sCisgICAgICAgIHsiaWYucHJvdGVjdGVkLmlzLnNwZWNpZmllZC50aGVuLnN0b3JlcGFzcy5rZXlwYXNzLmFuZC5uZXcubXVzdC5ub3QuYmUuc3BlY2lmaWVkIiwKKyAgICAgICAgICAgICAgICAic2UgLXByb3RlY3RlZCBmb3IgZXNwZWNpZmljYWRvLCBlbnRcdTAwRTNvIC1zdG9yZXBhc3MsIC1rZXlwYXNzIGUgLW5ldyBuXHUwMEUzbyBkZXZlclx1MDBFM28gc2VyIGVzcGVjaWZpY2Fkb3MifSwKKyAgICAgICAgeyJpZi5zcmNwcm90ZWN0ZWQuaXMuc3BlY2lmaWVkLnRoZW4uc3Jjc3RvcmVwYXNzLmFuZC5zcmNrZXlwYXNzLm11c3Qubm90LmJlLnNwZWNpZmllZCIsCisgICAgICAgICAgICAgICAgInNlIC1zcmNwcm90ZWN0ZWQgZm9yIGVzcGVjaWZpY2FkbywgZW50XHUwMEUzbyAtc3Jjc3RvcmVwYXNzIGUgLXNyY2tleXBhc3Mgblx1MDBFM28gZGV2ZXJcdTAwRTNvIHNlciBlc3BlY2lmaWNhZG9zIn0sCisgICAgICAgIHsiaWYua2V5c3RvcmUuaXMubm90LnBhc3N3b3JkLnByb3RlY3RlZC50aGVuLnN0b3JlcGFzcy5rZXlwYXNzLmFuZC5uZXcubXVzdC5ub3QuYmUuc3BlY2lmaWVkIiwKKyAgICAgICAgICAgICAgICAic2UgYSBcdTAwRTFyZWEgZGUgYXJtYXplbmFtZW50byBkZSBjaGF2ZXMgblx1MDBFM28gZXN0aXZlciBwcm90ZWdpZGEgcG9yIHNlbmhhLCBlbnRcdTAwRTNvIC1zdG9yZXBhc3MsIC1rZXlwYXNzIGUgLW5ldyBuXHUwMEUzbyBkZXZlclx1MDBFM28gc2VyIGVzcGVjaWZpY2Fkb3MifSwKKyAgICAgICAgeyJpZi5zb3VyY2Uua2V5c3RvcmUuaXMubm90LnBhc3N3b3JkLnByb3RlY3RlZC50aGVuLnNyY3N0b3JlcGFzcy5hbmQuc3Jja2V5cGFzcy5tdXN0Lm5vdC5iZS5zcGVjaWZpZWQiLAorICAgICAgICAgICAgICAgICJzZSBhIFx1MDBFMXJlYSBkZSBhcm1hemVuYW1lbnRvIGRlIGNoYXZlcyBkZSBvcmlnZW0gblx1MDBFM28gZXN0aXZlciBwcm90ZWdpZGEgcG9yIHNlbmhhLCBlbnRcdTAwRTNvIC1zcmNzdG9yZXBhc3MgZSAtc3Jja2V5cGFzcyBuXHUwMEUzbyBkZXZlclx1MDBFM28gc2VyIGVzcGVjaWZpY2Fkb3MifSwKKyAgICAgICAgeyJJbGxlZ2FsLnN0YXJ0ZGF0ZS52YWx1ZSIsICJ2YWxvciBkYSBkYXRhIGluaWNpYWwgaW52XHUwMEUxbGlkbyJ9LAorICAgICAgICB7IlZhbGlkaXR5Lm11c3QuYmUuZ3JlYXRlci50aGFuLnplcm8iLAorICAgICAgICAgICAgICAgICJBIHZhbGlkYWRlIGRldmUgc2VyIG1haW9yIGRvIHF1ZSB6ZXJvIn0sCisgICAgICAgIHsicHJvdk5hbWUubm90LmEucHJvdmlkZXIiLCAiezB9IG5cdTAwRTNvIFx1MDBFOSB1bSBmb3JuZWNlZG9yIn0sCisgICAgICAgIHsiVXNhZ2UuZXJyb3Iubm8uY29tbWFuZC5wcm92aWRlZCIsICJFcnJvIGRlIHVzbzogbmVuaHVtIGNvbWFuZG8gZm9ybmVjaWRvIn0sCisgICAgICAgIHsiU291cmNlLmtleXN0b3JlLmZpbGUuZXhpc3RzLmJ1dC5pcy5lbXB0eS4iLCAiTyBhcnF1aXZvIGRhIFx1MDBFMXJlYSBkZSBhcm1hemVuYW1lbnRvIGRlIGNoYXZlcyBkZSBvcmlnZW0gZXhpc3RlLCBtYXMgZXN0XHUwMEUxIHZhemlvOiAifSwKKyAgICAgICAgeyJQbGVhc2Uuc3BlY2lmeS5zcmNrZXlzdG9yZSIsICJFc3BlY2lmaXF1ZSAtc3Jja2V5c3RvcmUifSwKKyAgICAgICAgeyJNdXN0Lm5vdC5zcGVjaWZ5LmJvdGgudi5hbmQucmZjLndpdGgubGlzdC5jb21tYW5kIiwKKyAgICAgICAgICAgICAgICAiTlx1MDBFM28gZGV2ZW0gc2VyIGVzcGVjaWZpY2Fkb3MgLXYgZSAtcmZjIGNvbSBvIGNvbWFuZG8gJ2xpc3QnIn0sCisgICAgICAgIHsiS2V5LnBhc3N3b3JkLm11c3QuYmUuYXQubGVhc3QuNi5jaGFyYWN0ZXJzIiwKKyAgICAgICAgICAgICAgICAiQSBzZW5oYSBkYSBjaGF2ZSBkZXZlIHRlciwgbm8gbVx1MDBFRG5pbW8sIDYgY2FyYWN0ZXJlcyJ9LAorICAgICAgICB7Ik5ldy5wYXNzd29yZC5tdXN0LmJlLmF0LmxlYXN0LjYuY2hhcmFjdGVycyIsCisgICAgICAgICAgICAgICAgIkEgbm92YSBzZW5oYSBkZXZlIHRlciwgbm8gbVx1MDBFRG5pbW8sIDYgY2FyYWN0ZXJlcyJ9LAorICAgICAgICB7IktleXN0b3JlLmZpbGUuZXhpc3RzLmJ1dC5pcy5lbXB0eS4iLAorICAgICAgICAgICAgICAgICJPIGFycXVpdm8gZGEgXHUwMEUxcmVhIGRlIGFybWF6ZW5hbWVudG8gZGUgY2hhdmVzIGV4aXN0ZSwgbWFzIGVzdFx1MDBFMSB2YXppbzogIn0sCisgICAgICAgIHsiS2V5c3RvcmUuZmlsZS5kb2VzLm5vdC5leGlzdC4iLAorICAgICAgICAgICAgICAgICJPIGFycXVpdm8gZGEgXHUwMEUxcmVhIGRlIGFybWF6ZW5hbWVudG8gZGUgY2hhdmVzIG5cdTAwRTNvIGV4aXN0ZS4gIn0sCisgICAgICAgIHsiTXVzdC5zcGVjaWZ5LmRlc3RpbmF0aW9uLmFsaWFzIiwgIkRldmUgc2VyIGVzcGVjaWZpY2FkbyB1bSBhbGlhcyBkZSBkZXN0aW5vIn0sCisgICAgICAgIHsiTXVzdC5zcGVjaWZ5LmFsaWFzIiwgIkRldmUgc2VyIGVzcGVjaWZpY2FkbyB1bSBhbGlhcyJ9LAorICAgICAgICB7IktleXN0b3JlLnBhc3N3b3JkLm11c3QuYmUuYXQubGVhc3QuNi5jaGFyYWN0ZXJzIiwKKyAgICAgICAgICAgICAgICAiQSBzZW5oYSBkYSBcdTAwRTFyZWEgZGUgYXJtYXplbmFtZW50byBkZSBjaGF2ZXMgZGV2ZSB0ZXIsIG5vIG1cdTAwRURuaW1vLCA2IGNhcmFjdGVyZXMifSwKKyAgICAgICAgeyJFbnRlci5rZXlzdG9yZS5wYXNzd29yZC4iLCAiSW5mb3JtZSBhIHNlbmhhIGRhIFx1MDBFMXJlYSBkZSBhcm1hemVuYW1lbnRvIGRlIGNoYXZlczogICJ9LAorICAgICAgICB7IkVudGVyLnNvdXJjZS5rZXlzdG9yZS5wYXNzd29yZC4iLCAiSW5mb3JtZSBhIHNlbmhhIGRhIFx1MDBFMXJlYSBkZSBhcm1hemVuYW1lbnRvIGRlIGNoYXZlcyBkZSBvcmlnZW06ICAifSwKKyAgICAgICAgeyJFbnRlci5kZXN0aW5hdGlvbi5rZXlzdG9yZS5wYXNzd29yZC4iLCAiSW5mb3JtZSBhIHNlbmhhIGRhIFx1MDBFMXJlYSBkZSBhcm1hemVuYW1lbnRvIGRlIGNoYXZlcyBkZSBkZXN0aW5vOiAgIn0sCisgICAgICAgIHsiS2V5c3RvcmUucGFzc3dvcmQuaXMudG9vLnNob3J0Lm11c3QuYmUuYXQubGVhc3QuNi5jaGFyYWN0ZXJzIiwKKyAgICAgICAgICJBIHNlbmhhIGRhIFx1MDBFMXJlYSBkZSBhcm1hemVuYW1lbnRvIGRlIGNoYXZlcyBcdTAwRTkgbXVpdG8gY3VydGEgLSBlbGEgZGV2ZSB0ZXIsIG5vIG1cdTAwRURuaW1vLCA2IGNhcmFjdGVyZXMifSwKKyAgICAgICAgeyJVbmtub3duLkVudHJ5LlR5cGUiLCAiVGlwbyBkZSBFbnRyYWRhIERlc2NvbmhlY2lkbyJ9LAorICAgICAgICB7IlRvby5tYW55LmZhaWx1cmVzLkFsaWFzLm5vdC5jaGFuZ2VkIiwgIkV4Y2Vzc28gZGUgZmFsaGFzLiBBbGlhcyBuXHUwMEUzbyBhbHRlcmFkbyJ9LAorICAgICAgICB7IkVudHJ5LmZvci5hbGlhcy5hbGlhcy5zdWNjZXNzZnVsbHkuaW1wb3J0ZWQuIiwKKyAgICAgICAgICAgICAgICAgIkVudHJhZGEgZG8gYWxpYXMgezB9IGltcG9ydGFkYSBjb20gXHUwMEVBeGl0by4ifSwKKyAgICAgICAgeyJFbnRyeS5mb3IuYWxpYXMuYWxpYXMubm90LmltcG9ydGVkLiIsICJFbnRyYWRhIGRvIGFsaWFzIHswfSBuXHUwMEUzbyBpbXBvcnRhZGEuIn0sCisgICAgICAgIHsiUHJvYmxlbS5pbXBvcnRpbmcuZW50cnkuZm9yLmFsaWFzLmFsaWFzLmV4Y2VwdGlvbi5FbnRyeS5mb3IuYWxpYXMuYWxpYXMubm90LmltcG9ydGVkLiIsCisgICAgICAgICAgICAgICAgICJQcm9ibGVtYSBhbyBpbXBvcnRhciBhIGVudHJhZGEgZG8gYWxpYXMgezB9OiB7MX0uXG5FbnRyYWRhIGRvIGFsaWFzIHswfSBuXHUwMEUzbyBpbXBvcnRhZGEuIn0sCisgICAgICAgIHsiSW1wb3J0LmNvbW1hbmQuY29tcGxldGVkLm9rLmVudHJpZXMuc3VjY2Vzc2Z1bGx5LmltcG9ydGVkLmZhaWwuZW50cmllcy5mYWlsZWQub3IuY2FuY2VsbGVkIiwKKyAgICAgICAgICAgICAgICAgIkNvbWFuZG8gZGUgaW1wb3J0YVx1MDBFN1x1MDBFM28gY29uY2x1XHUwMEVEZG86ICB7MH0gZW50cmFkYXMgaW1wb3J0YWRhcyBjb20gXHUwMEVBeGl0bywgezF9IGVudHJhZGFzIGZhbGhhcmFtIG91IGZvcmFtIGNhbmNlbGFkYXMifSwKKyAgICAgICAgeyJXYXJuaW5nLk92ZXJ3cml0aW5nLmV4aXN0aW5nLmFsaWFzLmFsaWFzLmluLmRlc3RpbmF0aW9uLmtleXN0b3JlIiwKKyAgICAgICAgICAgICAgICAgIkFkdmVydFx1MDBFQW5jaWE6IFN1YnN0aXR1aVx1MDBFN1x1MDBFM28gZG8gYWxpYXMgezB9IGV4aXN0ZW50ZSBuYSBcdTAwRTFyZWEgZGUgYXJtYXplbmFtZW50byBkZSBjaGF2ZXMgZGUgZGVzdGlubyJ9LAorICAgICAgICB7IkV4aXN0aW5nLmVudHJ5LmFsaWFzLmFsaWFzLmV4aXN0cy5vdmVyd3JpdGUubm8uIiwKKyAgICAgICAgICAgICAgICAgIkVudHJhZGEgalx1MDBFMSBleGlzdGVudGUgbm8gYWxpYXMgezB9LCBzdWJzdGl0dWlyPyBbblx1MDBFM29dOiAgIn0sCisgICAgICAgIHsiVG9vLm1hbnkuZmFpbHVyZXMudHJ5LmxhdGVyIiwgIkV4Y2Vzc28gZGUgZmFsaGFzIC0gdGVudGUgbWFpcyB0YXJkZSJ9LAorICAgICAgICB7IkNlcnRpZmljYXRpb24ucmVxdWVzdC5zdG9yZWQuaW4uZmlsZS5maWxlbmFtZS4iLAorICAgICAgICAgICAgICAgICJTb2xpY2l0YVx1MDBFN1x1MDBFM28gZGUgY2VydGlmaWNhZG8gYXJtYXplbmFkYSBubyBhcnF1aXZvIDx7MH0+In0sCisgICAgICAgIHsiU3VibWl0LnRoaXMudG8ueW91ci5DQSIsICJTdWJtZXRlciBcdTAwRTAgQ0EifSwKKyAgICAgICAgeyJpZi5hbGlhcy5ub3Quc3BlY2lmaWVkLmRlc3RhbGlhcy5zcmNrZXlwYXNzLmFuZC5kZXN0a2V5cGFzcy5tdXN0Lm5vdC5iZS5zcGVjaWZpZWQiLAorICAgICAgICAgICAgInNlIG8gYWxpYXMgblx1MDBFM28gZXN0aXZlciBlc3BlY2lmaWNhZG8sIGRlc3RhbGlhcywgc3Jja2V5cGFzcyBlIGRlc3RrZXlwYXNzIG5cdTAwRTNvIGRldmVyXHUwMEUzbyBzZXIgZXNwZWNpZmljYWRvcyJ9LAorICAgICAgICB7IkNlcnRpZmljYXRlLnN0b3JlZC5pbi5maWxlLmZpbGVuYW1lLiIsCisgICAgICAgICAgICAgICAgIkNlcnRpZmljYWRvIGFybWF6ZW5hZG8gbm8gYXJxdWl2byA8ezB9PiJ9LAorICAgICAgICB7IkNlcnRpZmljYXRlLnJlcGx5Lndhcy5pbnN0YWxsZWQuaW4ua2V5c3RvcmUiLAorICAgICAgICAgICAgICAgICJBIHJlc3Bvc3RhIGRvIGNlcnRpZmljYWRvIGZvaSBpbnN0YWxhZGEgbmEgXHUwMEUxcmVhIGRlIGFybWF6ZW5hbWVudG8gZGUgY2hhdmVzIn0sCisgICAgICAgIHsiQ2VydGlmaWNhdGUucmVwbHkud2FzLm5vdC5pbnN0YWxsZWQuaW4ua2V5c3RvcmUiLAorICAgICAgICAgICAgICAgICJBIHJlc3Bvc3RhIGRvIGNlcnRpZmljYWRvIG5cdTAwRTNvIGZvaSBpbnN0YWxhZGEgbmEgXHUwMEUxcmVhIGRlIGFybWF6ZW5hbWVudG8gZGUgY2hhdmVzIn0sCisgICAgICAgIHsiQ2VydGlmaWNhdGUud2FzLmFkZGVkLnRvLmtleXN0b3JlIiwKKyAgICAgICAgICAgICAgICAiTyBjZXJ0aWZpY2FkbyBmb2kgYWRpY2lvbmFkbyBcdTAwRTAgXHUwMEUxcmVhIGRlIGFybWF6ZW5hbWVudG8gZGUgY2hhdmVzIn0sCisgICAgICAgIHsiQ2VydGlmaWNhdGUud2FzLm5vdC5hZGRlZC50by5rZXlzdG9yZSIsCisgICAgICAgICAgICAgICAgIk8gY2VydGlmaWNhZG8gblx1MDBFM28gZm9pIGFkaWNpb25hZG8gXHUwMEUwIFx1MDBFMXJlYSBkZSBhcm1hemVuYW1lbnRvIGRlIGNoYXZlcyJ9LAorICAgICAgICB7Ii5TdG9yaW5nLmtzZm5hbWUuIiwgIltBcm1hemVuYW5kbyB7MH1dIn0sCisgICAgICAgIHsiYWxpYXMuaGFzLm5vLnB1YmxpYy5rZXkuY2VydGlmaWNhdGUuIiwKKyAgICAgICAgICAgICAgICAiezB9IG5cdTAwRTNvIHRlbSBjaGF2ZSBwXHUwMEZBYmxpY2EgKGNlcnRpZmljYWRvKSJ9LAorICAgICAgICB7IkNhbm5vdC5kZXJpdmUuc2lnbmF0dXJlLmFsZ29yaXRobSIsCisgICAgICAgICAgICAgICAgIk5cdTAwRTNvIFx1MDBFOSBwb3NzXHUwMEVEdmVsIG9idGVyIHVtIGFsZ29yaXRtbyBkZSBhc3NpbmF0dXJhIn0sCisgICAgICAgIHsiQWxpYXMuYWxpYXMuZG9lcy5ub3QuZXhpc3QiLAorICAgICAgICAgICAgICAgICJPIGFsaWFzIDx7MH0+IG5cdTAwRTNvIGV4aXN0ZSJ9LAorICAgICAgICB7IkFsaWFzLmFsaWFzLmhhcy5uby5jZXJ0aWZpY2F0ZSIsCisgICAgICAgICAgICAgICAgIk8gYWxpYXMgPHswfT4gblx1MDBFM28gdGVtIGNlcnRpZmljYWRvIn0sCisgICAgICAgIHsiS2V5LnBhaXIubm90LmdlbmVyYXRlZC5hbGlhcy5hbGlhcy5hbHJlYWR5LmV4aXN0cyIsCisgICAgICAgICAgICAgICAgIlBhciBkZSBjaGF2ZXMgblx1MDBFM28gZ2VyYWRvOyBvIGFsaWFzIDx7MH0+IGpcdTAwRTEgZXhpc3RlIn0sCisgICAgICAgIHsiR2VuZXJhdGluZy5rZXlzaXplLmJpdC5rZXlBbGdOYW1lLmtleS5wYWlyLmFuZC5zZWxmLnNpZ25lZC5jZXJ0aWZpY2F0ZS5zaWdBbGdOYW1lLndpdGguYS52YWxpZGl0eS5vZi52YWxpZGFsaXR5LmRheXMuZm9yIiwKKyAgICAgICAgICAgICAgICAiR2VyYW5kbyBvIHBhciBkZSBjaGF2ZXMgezF9IGRlIHswfSBiaXQgZSBvIGNlcnRpZmljYWRvIGF1dG9hc3NpbmFkbyAoezJ9KSBjb20gdW1hIHZhbGlkYWRlIGRlIHszfSBkaWFzXG5cdHBhcmE6IHs0fSJ9LAorICAgICAgICB7IkVudGVyLmtleS5wYXNzd29yZC5mb3IuYWxpYXMuIiwgIkluZm9ybWFyIGEgc2VuaGEgZGEgY2hhdmUgZGUgPHswfT4ifSwKKyAgICAgICAgeyIuUkVUVVJOLmlmLnNhbWUuYXMua2V5c3RvcmUucGFzc3dvcmQuIiwKKyAgICAgICAgICAgICAgICAiXHQoUkVUVVJOIHNlIGZvciBpZ3VhbCBcdTAwRTAgc2VuaGEgZGEgXHUwMEUxcmVhIGRvIGFybWF6ZW5hbWVudG8gZGUgY2hhdmVzKTogICJ9LAorICAgICAgICB7IktleS5wYXNzd29yZC5pcy50b28uc2hvcnQubXVzdC5iZS5hdC5sZWFzdC42LmNoYXJhY3RlcnMiLAorICAgICAgICAgICAgICAgICJBIHNlbmhhIGRhIGNoYXZlIFx1MDBFOSBtdWl0byBjdXJ0YSAtIGRldmUgdGVyLCBubyBtXHUwMEVEbmltbywgNiBjYXJhY3RlcmVzIn0sCisgICAgICAgIHsiVG9vLm1hbnkuZmFpbHVyZXMua2V5Lm5vdC5hZGRlZC50by5rZXlzdG9yZSIsCisgICAgICAgICAgICAgICAgIkV4Y2Vzc28gZGUgZmFsaGFzIC0gY2hhdmUgblx1MDBFM28gYWRpY2lvbmFkYSBhIFx1MDBFMXJlYSBkZSBhcm1hemVuYW1lbnRvIGRlIGNoYXZlcyJ9LAorICAgICAgICB7IkRlc3RpbmF0aW9uLmFsaWFzLmRlc3QuYWxyZWFkeS5leGlzdHMiLAorICAgICAgICAgICAgICAgICJPIGFsaWFzIGRlIGRlc3Rpbm8gPHswfT4galx1MDBFMSBleGlzdGUifSwKKyAgICAgICAgeyJQYXNzd29yZC5pcy50b28uc2hvcnQubXVzdC5iZS5hdC5sZWFzdC42LmNoYXJhY3RlcnMiLAorICAgICAgICAgICAgICAgICJBIHNlbmhhIFx1MDBFOSBtdWl0byBjdXJ0YSAtIGRldmUgdGVyLCBubyBtXHUwMEVEbmltbywgNiBjYXJhY3RlcmVzIn0sCisgICAgICAgIHsiVG9vLm1hbnkuZmFpbHVyZXMuS2V5LmVudHJ5Lm5vdC5jbG9uZWQiLAorICAgICAgICAgICAgICAgICJFeGNlc3NvIGRlIGZhbGhhcy4gRW50cmFkYSBkYSBjaGF2ZSBuXHUwMEUzbyBjbG9uYWRhIn0sCisgICAgICAgIHsia2V5LnBhc3N3b3JkLmZvci5hbGlhcy4iLCAic2VuaGEgZGEgY2hhdmUgZGUgPHswfT4ifSwKKyAgICAgICAgeyJLZXlzdG9yZS5lbnRyeS5mb3IuaWQuZ2V0TmFtZS5hbHJlYWR5LmV4aXN0cyIsCisgICAgICAgICAgICAgICAgIkEgZW50cmFkYSBkYSBcdTAwRTFyZWEgZG8gYXJtYXplbmFtZW50byBkZSBjaGF2ZXMgZGUgPHswfT4galx1MDBFMSBleGlzdGUifSwKKyAgICAgICAgeyJDcmVhdGluZy5rZXlzdG9yZS5lbnRyeS5mb3IuaWQuZ2V0TmFtZS4iLAorICAgICAgICAgICAgICAgICJDcmlhbmRvIGVudHJhZGEgZGEgXHUwMEUxcmVhIGRvIGFybWF6ZW5hbWVudG8gZGUgY2hhdmVzIHBhcmEgPHswfT4gLi4uIn0sCisgICAgICAgIHsiTm8uZW50cmllcy5mcm9tLmlkZW50aXR5LmRhdGFiYXNlLmFkZGVkIiwKKyAgICAgICAgICAgICAgICAiTmVuaHVtYSBlbnRyYWRhIGFkaWNpb25hZGEgZG8gYmFuY28gZGUgZGFkb3MgZGUgaWRlbnRpZGFkZXMifSwKKyAgICAgICAgeyJBbGlhcy5uYW1lLmFsaWFzIiwgIk5vbWUgZG8gYWxpYXM6IHswfSJ9LAorICAgICAgICB7IkNyZWF0aW9uLmRhdGUua2V5U3RvcmUuZ2V0Q3JlYXRpb25EYXRlLmFsaWFzLiIsCisgICAgICAgICAgICAgICAgIkRhdGEgZGUgY3JpYVx1MDBFN1x1MDBFM286IHswLGRhdGV9In0sCisgICAgICAgIHsiYWxpYXMua2V5U3RvcmUuZ2V0Q3JlYXRpb25EYXRlLmFsaWFzLiIsCisgICAgICAgICAgICAgICAgInswfSwgezEsZGF0ZX0sICJ9LAorICAgICAgICB7ImFsaWFzLiIsICJ7MH0sICJ9LAorICAgICAgICB7IkVudHJ5LnR5cGUudHlwZS4iLCAiVGlwbyBkZSBlbnRyYWRhOiB7MH0ifSwKKyAgICAgICAgeyJDZXJ0aWZpY2F0ZS5jaGFpbi5sZW5ndGguIiwgIkNvbXByaW1lbnRvIGRhIGNhZGVpYSBkZSBjZXJ0aWZpY2Fkb3M6ICJ9LAorICAgICAgICB7IkNlcnRpZmljYXRlLmkuMS4iLCAiQ2VydGlmaWNhZG9bezAsbnVtYmVyLGludGVnZXJ9XToifSwKKyAgICAgICAgeyJDZXJ0aWZpY2F0ZS5maW5nZXJwcmludC5TSEExLiIsICJGaW5nZXJwcmludCAoTUQ1KSBkbyBjZXJ0aWZpY2FkbzogIn0sCisgICAgICAgIHsiS2V5c3RvcmUudHlwZS4iLCAiVGlwbyBkZSBcdTAwRTFyZWEgZGUgYXJtYXplbmFtZW50byBkZSBjaGF2ZXM6ICJ9LAorICAgICAgICB7IktleXN0b3JlLnByb3ZpZGVyLiIsICJGb3JuZWNlZG9yIGRhIFx1MDBFMXJlYSBkZSBhcm1hemVuYW1lbnRvIGRlIGNoYXZlczogIn0sCisgICAgICAgIHsiWW91ci5rZXlzdG9yZS5jb250YWlucy5rZXlTdG9yZS5zaXplLmVudHJ5IiwKKyAgICAgICAgICAgICAgICAiU3VhIFx1MDBFMXJlYSBkZSBhcm1hemVuYW1lbnRvIGRlIGNoYXZlcyBjb250XHUwMEU5bSB7MCxudW1iZXIsaW50ZWdlcn0gZW50cmFkYSJ9LAorICAgICAgICB7IllvdXIua2V5c3RvcmUuY29udGFpbnMua2V5U3RvcmUuc2l6ZS5lbnRyaWVzIiwKKyAgICAgICAgICAgICAgICAiU3VhIFx1MDBFMXJlYSBkZSBhcm1hemVuYW1lbnRvIGRlIGNoYXZlcyBjb250XHUwMEU5bSB7MCxudW1iZXIsaW50ZWdlcn0gZW50cmFkYXMifSwKKyAgICAgICAgeyJGYWlsZWQudG8ucGFyc2UuaW5wdXQiLCAiRmFsaGEgZHVyYW50ZSBvIHBhcnNlIGRhIGVudHJhZGEifSwKKyAgICAgICAgeyJFbXB0eS5pbnB1dCIsICJFbnRyYWRhIHZhemlhIn0sCisgICAgICAgIHsiTm90LlguNTA5LmNlcnRpZmljYXRlIiwgIk5cdTAwRTNvIFx1MDBFOSB1bSBjZXJ0aWZpY2FkbyBYLjUwOSJ9LAorICAgICAgICB7ImFsaWFzLmhhcy5uby5wdWJsaWMua2V5IiwgInswfSBuXHUwMEUzbyB0ZW0gY2hhdmUgcFx1MDBGQWJsaWNhIn0sCisgICAgICAgIHsiYWxpYXMuaGFzLm5vLlguNTA5LmNlcnRpZmljYXRlIiwgInswfSBuXHUwMEUzbyB0ZW0gY2VydGlmaWNhZG8gWC41MDkifSwKKyAgICAgICAgeyJOZXcuY2VydGlmaWNhdGUuc2VsZi5zaWduZWQuIiwgIk5vdm8gY2VydGlmaWNhZG8gKGF1dG9hc3NpbmFkbyk6In0sCisgICAgICAgIHsiUmVwbHkuaGFzLm5vLmNlcnRpZmljYXRlcyIsICJBIHJlc3Bvc3RhIG5cdTAwRTNvIHRlbSBjZXJ0aWZpY2FkbyJ9LAorICAgICAgICB7IkNlcnRpZmljYXRlLm5vdC5pbXBvcnRlZC5hbGlhcy5hbGlhcy5hbHJlYWR5LmV4aXN0cyIsCisgICAgICAgICAgICAgICAgIkNlcnRpZmljYWRvIG5cdTAwRTNvIGltcG9ydGFkbywgbyBhbGlhcyA8ezB9PiBqXHUwMEUxIGV4aXN0ZSJ9LAorICAgICAgICB7IklucHV0Lm5vdC5hbi5YLjUwOS5jZXJ0aWZpY2F0ZSIsICJBIGVudHJhZGEgblx1MDBFM28gXHUwMEU5IHVtIGNlcnRpZmljYWRvIFguNTA5In0sCisgICAgICAgIHsiQ2VydGlmaWNhdGUuYWxyZWFkeS5leGlzdHMuaW4ua2V5c3RvcmUudW5kZXIuYWxpYXMudHJ1c3RhbGlhcy4iLAorICAgICAgICAgICAgICAgICJPIGNlcnRpZmljYWRvIGpcdTAwRTEgZXhpc3RlIG5vIGFybWF6ZW5hbWVudG8gZGUgY2hhdmVzIG5vIGFsaWFzIDx7MH0+In0sCisgICAgICAgIHsiRG8ueW91LnN0aWxsLndhbnQudG8uYWRkLml0Lm5vLiIsCisgICAgICAgICAgICAgICAgIkFpbmRhIGRlc2VqYSBhZGljaW9uXHUwMEUxLWxvPyBbblx1MDBFM29dOiAgIn0sCisgICAgICAgIHsiQ2VydGlmaWNhdGUuYWxyZWFkeS5leGlzdHMuaW4uc3lzdGVtLndpZGUuQ0Eua2V5c3RvcmUudW5kZXIuYWxpYXMudHJ1c3RhbGlhcy4iLAorICAgICAgICAgICAgICAgICJPIGNlcnRpZmljYWRvIGpcdTAwRTEgZXhpc3RlIG5hIFx1MDBFMXJlYSBkZSBhcm1hemVuYW1lbnRvIGRlIGNoYXZlcyBkYSBDQSBlbSB0b2RvIG8gc2lzdGVtYSBubyBhbGlhcyA8ezB9PiJ9LAorICAgICAgICB7IkRvLnlvdS5zdGlsbC53YW50LnRvLmFkZC5pdC50by55b3VyLm93bi5rZXlzdG9yZS5uby4iLAorICAgICAgICAgICAgICAgICJBaW5kYSBkZXNlamEgYWRpY2lvblx1MDBFMS1sbyBcdTAwRTAgc3VhIFx1MDBFMXJlYSBkZSBhcm1hemVuYW1lbnRvIGRlIGNoYXZlcz8gW25cdTAwRTNvXTogICJ9LAorICAgICAgICB7IlRydXN0LnRoaXMuY2VydGlmaWNhdGUubm8uIiwgIkNvbmZpYXIgbmVzdGUgY2VydGlmaWNhZG8/IFtuXHUwMEUzb106ICAifSwKKyAgICAgICAgeyJZRVMiLCAiU2ltIn0sCisgICAgICAgIHsiTmV3LnByb21wdC4iLCAiTm92YSB7MH06ICJ9LAorICAgICAgICB7IlBhc3N3b3Jkcy5tdXN0LmRpZmZlciIsICJBcyBzZW5oYXMgZGV2ZW0gc2VyIGRpZmVyZW50ZXMifSwKKyAgICAgICAgeyJSZS5lbnRlci5uZXcucHJvbXB0LiIsICJJbmZvcm1lIG5vdmFtZW50ZSBhIG5vdmEgezB9OiAifSwKKyAgICAgICAgeyJSZS5lbnRlci5uZXcucGFzc3dvcmQuIiwgIkluZm9ybWUgbm92YW1lbnRlIGEgbm92YSBzZW5oYTogIn0sCisgICAgICAgIHsiVGhleS5kb24udC5tYXRjaC5UcnkuYWdhaW4iLCAiRWxhcyBuXHUwMEUzbyBjb3JyZXNwb25kZW0uIFRlbnRlIG5vdmFtZW50ZSJ9LAorICAgICAgICB7IkVudGVyLnByb21wdC5hbGlhcy5uYW1lLiIsICJJbmZvcm1lIG8gbm9tZSBkbyBhbGlhcyB7MH06ICAifSwKKyAgICAgICAgeyJFbnRlci5uZXcuYWxpYXMubmFtZS5SRVRVUk4udG8uY2FuY2VsLmltcG9ydC5mb3IudGhpcy5lbnRyeS4iLAorICAgICAgICAgICAgICAgICAiSW5mb3JtZSBvIG5vdm8gbm9tZSBkbyBhbGlhc1x0KFJFVFVSTiBwYXJhIGNhbmNlbGFyIGEgaW1wb3J0YVx1MDBFN1x1MDBFM28gZGVzdGEgZW50cmFkYSk6ICAifSwKKyAgICAgICAgeyJFbnRlci5hbGlhcy5uYW1lLiIsICJJbmZvcm1lIG8gbm9tZSBkbyBhbGlhczogICJ9LAorICAgICAgICB7Ii5SRVRVUk4uaWYuc2FtZS5hcy5mb3Iub3RoZXJBbGlhcy4iLAorICAgICAgICAgICAgICAgICJcdChSRVRVUk4gc2UgZm9yIGlndWFsIGFvIGRlIDx7MH0+KSJ9LAorICAgICAgICB7Ii5QQVRURVJOLnByaW50WDUwOUNlcnQiLAorICAgICAgICAgICAgICAgICJQcm9wcmlldFx1MDBFMXJpbzogezB9XG5FbWlzc29yOiB7MX1cbk5cdTAwRkFtZXJvIGRlIHNcdTAwRTlyaWU6IHsyfVxuVlx1MDBFMWxpZG8gZGU6IHszfSBhOiB7NH1cbkZpbmdlcnByaW50cyBkbyBjZXJ0aWZpY2Fkbzpcblx0IE1ENTogIHs1fVxuXHQgU0hBMTogezZ9XG5cdCBTSEEyNTY6IHs3fVxuXHQgTm9tZSBkbyBhbGdvcml0bW8gZGUgYXNzaW5hdHVyYTogezh9XG5cdCBWZXJzXHUwMEUzbzogezl9In0sCisgICAgICAgIHsiV2hhdC5pcy55b3VyLmZpcnN0LmFuZC5sYXN0Lm5hbWUuIiwKKyAgICAgICAgICAgICAgICAiUXVhbCBcdTAwRTkgbyBzZXUgbm9tZSBlIG8gc2V1IHNvYnJlbm9tZT8ifSwKKyAgICAgICAgeyJXaGF0LmlzLnRoZS5uYW1lLm9mLnlvdXIub3JnYW5pemF0aW9uYWwudW5pdC4iLAorICAgICAgICAgICAgICAgICJRdWFsIFx1MDBFOSBvIG5vbWUgZGEgc3VhIHVuaWRhZGUgb3JnYW5pemFjaW9uYWw/In0sCisgICAgICAgIHsiV2hhdC5pcy50aGUubmFtZS5vZi55b3VyLm9yZ2FuaXphdGlvbi4iLAorICAgICAgICAgICAgICAgICJRdWFsIFx1MDBFOSBvIG5vbWUgZGEgc3VhIGVtcHJlc2E/In0sCisgICAgICAgIHsiV2hhdC5pcy50aGUubmFtZS5vZi55b3VyLkNpdHkub3IuTG9jYWxpdHkuIiwKKyAgICAgICAgICAgICAgICAiUXVhbCBcdTAwRTkgbyBub21lIGRhIHN1YSBDaWRhZGUgb3UgTG9jYWxpZGFkZT8ifSwKKyAgICAgICAgeyJXaGF0LmlzLnRoZS5uYW1lLm9mLnlvdXIuU3RhdGUub3IuUHJvdmluY2UuIiwKKyAgICAgICAgICAgICAgICAiUXVhbCBcdTAwRTkgbyBub21lIGRvIHNldSBFc3RhZG8gb3UgTXVuaWNcdTAwRURwaW8/In0sCisgICAgICAgIHsiV2hhdC5pcy50aGUudHdvLmxldHRlci5jb3VudHJ5LmNvZGUuZm9yLnRoaXMudW5pdC4iLAorICAgICAgICAgICAgICAgICJRdWFpcyBzXHUwMEUzbyBhcyBkdWFzIGxldHJhcyBkbyBjXHUwMEYzZGlnbyBkbyBwYVx1MDBFRHMgZGVzdGEgdW5pZGFkZT8ifSwKKyAgICAgICAgeyJJcy5uYW1lLmNvcnJlY3QuIiwgInswfSBFc3RcdTAwRTEgY29ycmV0bz8ifSwKKyAgICAgICAgeyJubyIsICJuXHUwMEUzbyJ9LAorICAgICAgICB7InllcyIsICJzaW0ifSwKKyAgICAgICAgeyJ5IiwgInMifSwKKyAgICAgICAgeyIuZGVmYXVsdFZhbHVlLiIsICIgIFt7MH1dOiAgIn0sCisgICAgICAgIHsiQWxpYXMuYWxpYXMuaGFzLm5vLmtleSIsCisgICAgICAgICAgICAgICAgIk8gYWxpYXMgPHswfT4gblx1MDBFM28gdGVtIGNoYXZlIn0sCisgICAgICAgIHsiQWxpYXMuYWxpYXMucmVmZXJlbmNlcy5hbi5lbnRyeS50eXBlLnRoYXQuaXMubm90LmEucHJpdmF0ZS5rZXkuZW50cnkuVGhlLmtleWNsb25lLmNvbW1hbmQub25seS5zdXBwb3J0cy5jbG9uaW5nLm9mLnByaXZhdGUua2V5IiwKKyAgICAgICAgICAgICAgICAgIk8gYWxpYXMgPHswfT4gZmF6IHJlZmVyXHUwMEVBbmNpYSBhIHVtIHRpcG8gZGUgZW50cmFkYSBxdWUgblx1MDBFM28gXHUwMEU5IHVtYSBlbnRyYWRhIGRlIGNoYXZlIHByaXZhZGEuIE8gY29tYW5kbyAta2V5Y2xvbmUgb2ZlcmVjZSBzdXBvcnRlIHNvbWVudGUgXHUwMEUwIGNsb25hZ2VtIGRlIGVudHJhZGFzIGRlIGNoYXZlIHByaXZhZGEifSwKKworICAgICAgICB7Ii5XQVJOSU5HLldBUk5JTkcuV0FSTklORy4iLAorICAgICAgICAgICAgIioqKioqKioqKioqKioqKioqICBBZHZlcnRcdTAwRUFuY2lhIEFkdmVydFx1MDBFQW5jaWEgQWR2ZXJ0XHUwMEVBbmNpYSAgKioqKioqKioqKioqKioqKioifSwKKyAgICAgICAgeyJTaWduZXIuZC4iLCAiU2lnbmF0XHUwMEUxcmlvICMlZDoifSwKKyAgICAgICAgeyJUaW1lc3RhbXAuIiwgIlRpbWVzdGFtcDoifSwKKyAgICAgICAgeyJTaWduYXR1cmUuIiwgIkFzc2luYXR1cmE6In0sCisgICAgICAgIHsiQ1JMcy4iLCAiQ1JMczoifSwKKyAgICAgICAgeyJDZXJ0aWZpY2F0ZS5vd25lci4iLCAiUHJvcHJpZXRcdTAwRTFyaW8gZG8gY2VydGlmaWNhZG86ICJ9LAorICAgICAgICB7Ik5vdC5hLnNpZ25lZC5qYXIuZmlsZSIsICJOXHUwMEUzbyBcdTAwRTkgdW0gYXJxdWl2byBqYXIgYXNzaW5hZG8ifSwKKyAgICAgICAgeyJOby5jZXJ0aWZpY2F0ZS5mcm9tLnRoZS5TU0wuc2VydmVyIiwKKyAgICAgICAgICAgICAgICAiTlx1MDBFM28gXHUwMEU5IHVtIGNlcnRpZmljYWRvIGRvIHNlcnZpZG9yIFNTTCJ9LAorCisgICAgICAgIHsiLlRoZS5pbnRlZ3JpdHkub2YudGhlLmluZm9ybWF0aW9uLnN0b3JlZC5pbi55b3VyLmtleXN0b3JlLiIsCisgICAgICAgICAgICAiKiBBIGludGVncmlkYWRlIGRhcyBpbmZvcm1hXHUwMEU3XHUwMEY1ZXMgYXJtYXplbmFkYXMgbmEgc3VhIFx1MDBFMXJlYSBkZSBhcm1hemVuYW1lbnRvIGRlIGNoYXZlcyAgKlxuKiBOXHUwMEMzTyBmb2kgdmVyaWZpY2FkYSEgIFBhcmEgcXVlIHNlamEgcG9zc1x1MDBFRHZlbCB2ZXJpZmljYXIgc3VhIGludGVncmlkYWRlLCAqXG4qIHZvY1x1MDBFQSBkZXZlIGZvcm5lY2VyIGEgc2VuaGEgZGEgXHUwMEUxcmVhIGRlIGFybWF6ZW5hbWVudG8gZGUgY2hhdmVzLiAgICAgICAgICAgICAgICAgICoifSwKKyAgICAgICAgeyIuVGhlLmludGVncml0eS5vZi50aGUuaW5mb3JtYXRpb24uc3RvcmVkLmluLnRoZS5zcmNrZXlzdG9yZS4iLAorICAgICAgICAgICAgIiogQSBpbnRlZ3JpZGFkZSBkYXMgaW5mb3JtYVx1MDBFN1x1MDBGNWVzIGFybWF6ZW5hZGFzIG5vIHNyY2tleXN0b3JlICAqXG4qIE5cdTAwQzNPIGZvaSB2ZXJpZmljYWRhISAgUGFyYSBxdWUgc2VqYSBwb3NzXHUwMEVEdmVsIHZlcmlmaWNhciBzdWEgaW50ZWdyaWRhZGUsICpcbiogdm9jXHUwMEVBIGRldmUgZm9ybmVjZXIgYSBzZW5oYSBkbyBzcmNrZXlzdG9yZS4gICAgICAgICAgICAgICAgICAqIn0sCisKKyAgICAgICAgeyJDZXJ0aWZpY2F0ZS5yZXBseS5kb2VzLm5vdC5jb250YWluLnB1YmxpYy5rZXkuZm9yLmFsaWFzLiIsCisgICAgICAgICAgICAgICAgIkEgcmVzcG9zdGEgZG8gY2VydGlmaWNhZG8gblx1MDBFM28gY29udFx1MDBFOW0gYSBjaGF2ZSBwXHUwMEZBYmxpY2EgZGUgPHswfT4ifSwKKyAgICAgICAgeyJJbmNvbXBsZXRlLmNlcnRpZmljYXRlLmNoYWluLmluLnJlcGx5IiwKKyAgICAgICAgICAgICAgICAiQ2FkZWlhIGRlIGNlcnRpZmljYWRvcyBpbmNvbXBsZXRhIG5hIHJlc3Bvc3RhIn0sCisgICAgICAgIHsiQ2VydGlmaWNhdGUuY2hhaW4uaW4ucmVwbHkuZG9lcy5ub3QudmVyaWZ5LiIsCisgICAgICAgICAgICAgICAgIkEgY2FkZWlhIGRlIGNlcnRpZmljYWRvcyBkYSByZXNwb3N0YSBuXHUwMEUzbyB2ZXJpZmljYTogIn0sCisgICAgICAgIHsiVG9wLmxldmVsLmNlcnRpZmljYXRlLmluLnJlcGx5LiIsCisgICAgICAgICAgICAgICAgIkNlcnRpZmljYWRvIGRlIG5cdTAwRUR2ZWwgc3VwZXJpb3IgbmEgcmVzcG9zdGE6XG4ifSwKKyAgICAgICAgeyIuaXMubm90LnRydXN0ZWQuIiwgIi4uLiBuXHUwMEUzbyBcdTAwRTkgY29uZmlcdTAwRTF2ZWwuICJ9LAorICAgICAgICB7Ikluc3RhbGwucmVwbHkuYW55d2F5Lm5vLiIsICJJbnN0YWxhciByZXNwb3N0YSBhc3NpbSBtZXNtbz8gW25cdTAwRTNvXTogICJ9LAorICAgICAgICB7Ik5PIiwgIk5cdTAwRTNvIn0sCisgICAgICAgIHsiUHVibGljLmtleXMuaW4ucmVwbHkuYW5kLmtleXN0b3JlLmRvbi50Lm1hdGNoIiwKKyAgICAgICAgICAgICAgICAiQXMgY2hhdmVzIHBcdTAwRkFibGljYXMgZGEgcmVzcG9zdGEgZSBkYSBcdTAwRTFyZWEgZGUgYXJtYXplbmFtZW50byBkZSBjaGF2ZXMgblx1MDBFM28gY29ycmVzcG9uZGVtIn0sCisgICAgICAgIHsiQ2VydGlmaWNhdGUucmVwbHkuYW5kLmNlcnRpZmljYXRlLmluLmtleXN0b3JlLmFyZS5pZGVudGljYWwiLAorICAgICAgICAgICAgICAgICJPIGNlcnRpZmljYWRvIGRhIHJlc3Bvc3RhIGUgbyBjZXJ0aWZpY2FkbyBkYSBcdTAwRTFyZWEgZGUgYXJtYXplbmFtZW50byBkZSBjaGF2ZXMgc1x1MDBFM28gaWRcdTAwRUFudGljb3MifSwKKyAgICAgICAgeyJGYWlsZWQudG8uZXN0YWJsaXNoLmNoYWluLmZyb20ucmVwbHkiLAorICAgICAgICAgICAgICAgICJGYWxoYSBhbyBlc3RhYmVsZWNlciBhIGNhZGVpYSBhIHBhcnRpciBkYSByZXNwb3N0YSJ9LAorICAgICAgICB7Im4iLCAibiJ9LAorICAgICAgICB7Ildyb25nLmFuc3dlci50cnkuYWdhaW4iLCAiUmVzcG9zdGEgZXJyYWRhOyB0ZW50ZSBub3ZhbWVudGUifSwKKyAgICAgICAgeyJTZWNyZXQua2V5Lm5vdC5nZW5lcmF0ZWQuYWxpYXMuYWxpYXMuYWxyZWFkeS5leGlzdHMiLAorICAgICAgICAgICAgICAgICJDaGF2ZSBzZWNyZXRhIG5cdTAwRTNvIGdlcmFkYTsgbyBhbGlhcyA8ezB9PiBqXHUwMEUxIGV4aXN0ZSJ9LAorICAgICAgICB7IlBsZWFzZS5wcm92aWRlLmtleXNpemUuZm9yLnNlY3JldC5rZXkuZ2VuZXJhdGlvbiIsCisgICAgICAgICAgICAgICAgIkZvcm5lXHUwMEU3YSBvIC1rZXlzaXplIHBhcmEgYSBnZXJhXHUwMEU3XHUwMEUzbyBkYSBjaGF2ZSBzZWNyZXRhIn0sCisKKyAgICAgICAgeyJFeHRlbnNpb25zLiIsICJFeHRlbnNcdTAwRjVlczogIn0sCisgICAgICAgIHsiLkVtcHR5LnZhbHVlLiIsICIoVmFsb3IgdmF6aW8pIn0sCisgICAgICAgIHsiRXh0ZW5zaW9uLlJlcXVlc3QuIiwgIlNvbGljaXRhXHUwMEU3XHUwMEUzbyBkZSBFeHRlbnNcdTAwRTNvOiJ9LAorICAgICAgICB7IlBLQ1MuMTAuQ2VydGlmaWNhdGUuUmVxdWVzdC5WZXJzaW9uLjEuMC5TdWJqZWN0LnMuUHVibGljLktleS5zLmZvcm1hdC5zLmtleS4iLAorICAgICAgICAgICAgICAgICJTb2xpY2l0YVx1MDBFN1x1MDBFM28gZG8gQ2VydGlmaWNhZG8gUEtDUyAjMTAgKFZlcnNcdTAwRTNvIDEuMClcbkFzc3VudG86ICVzXG5DaGF2ZSBQXHUwMEZBYmxpY2E6ICVzIGZvcm1hdG8gJXMgY2hhdmVcbiJ9LAorICAgICAgICB7IlVua25vd24ua2V5VXNhZ2UudHlwZS4iLCAiVGlwbyBkZSBrZXlVc2FnZSBkZXNjb25oZWNpZG86ICJ9LAorICAgICAgICB7IlVua25vd24uZXh0ZW5kZWRrZXlVc2FnZS50eXBlLiIsICJUaXBvIGRlIGV4dGVuZGVka2V5VXNhZ2UgZGVzY29uaGVjaWRvOiAifSwKKyAgICAgICAgeyJVbmtub3duLkFjY2Vzc0Rlc2NyaXB0aW9uLnR5cGUuIiwgIlRpcG8gZGUgQWNjZXNzRGVzY3JpcHRpb24gZGVzY29uaGVjaWRvOiAifSwKKyAgICAgICAgeyJVbnJlY29nbml6ZWQuR2VuZXJhbE5hbWUudHlwZS4iLCAiVGlwbyBkZSBHZW5lcmFsTmFtZSBuXHUwMEUzbyByZWNvbmhlY2lkbzogIn0sCisgICAgICAgIHsiVGhpcy5leHRlbnNpb24uY2Fubm90LmJlLm1hcmtlZC5hcy5jcml0aWNhbC4iLAorICAgICAgICAgICAgICAgICAiRXN0YSBleHRlbnNcdTAwRTNvIG5cdTAwRTNvIHBvZGUgc2VyIG1hcmNhZGEgY29tbyBjclx1MDBFRHRpY2EuICJ9LAorICAgICAgICB7Ik9kZC5udW1iZXIub2YuaGV4LmRpZ2l0cy5mb3VuZC4iLCAiRW5jb250cmFkbyBuXHUwMEZBbWVybyBcdTAwRURtcGFyIGRlIHNlaXMgZFx1MDBFRGdpdG9zOiAifSwKKyAgICAgICAgeyJVbmtub3duLmV4dGVuc2lvbi50eXBlLiIsICJUaXBvIGRlIGV4dGVuc1x1MDBFM28gZGVzY29uaGVjaWRvOiAifSwKKyAgICAgICAgeyJjb21tYW5kLnswfS5pcy5hbWJpZ3VvdXMuIiwgIm8gY29tYW5kbyB7MH0gXHUwMEU5IGFtYlx1MDBFRGd1bzoifQorICAgIH07CisKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGNvbnRlbnRzIG9mIHRoaXMgPGNvZGU+UmVzb3VyY2VCdW5kbGU8L2NvZGU+LgorICAgICAqCisgICAgICogPHA+CisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBjb250ZW50cyBvZiB0aGlzIDxjb2RlPlJlc291cmNlQnVuZGxlPC9jb2RlPi4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0W11bXSBnZXRDb250ZW50cygpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRlbnRzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdG9vbHMva2V5dG9vbC9SZXNvdXJjZXNfc3YuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdG9vbHMva2V5dG9vbC9SZXNvdXJjZXNfc3YuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDcyN2U2Ci0tLSAvZGV2L251bGwKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS90b29scy9rZXl0b29sL1Jlc291cmNlc19zdi5qYXZhCkBAIC0wLDAgKzEsNDMxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBPcmFjbGUgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKKyAqIHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIHN1bi5zZWN1cml0eS50b29scy5rZXl0b29sOworCisvKioKKyAqIDxwPiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIDxjb2RlPlJlc291cmNlQnVuZGxlPC9jb2RlPgorICogZm9yIHRoZSBrZXl0b29sLgorICoKKyAqLworcHVibGljIGNsYXNzIFJlc291cmNlc19zdiBleHRlbmRzIGphdmEudXRpbC5MaXN0UmVzb3VyY2VCdW5kbGUgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W11bXSBjb250ZW50cyA9IHsKKyAgICAgICAgeyJORVdMSU5FIiwgIlxuIn0sCisgICAgICAgIHsiU1RBUiIsCisgICAgICAgICAgICAgICAgIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioifSwKKyAgICAgICAgeyJTVEFSTk4iLAorICAgICAgICAgICAgICAgICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cbiJ9LAorCisgICAgICAgIC8vIGtleXRvb2w6IEhlbHAgcGFydAorLy8gIk9wdGlvbiIgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCisgICAgICAgIHsiLk9QVElPTi4iLCAiIFtBbHRlcm5hdGl2XS4uLiJ9LAorICAgICAgICB7Ik9wdGlvbnMuIiwgIkFsdGVybmF0aXY6In0sCisgICAgICAgIHsiVXNlLmtleXRvb2wuaGVscC5mb3IuYWxsLmF2YWlsYWJsZS5jb21tYW5kcyIsCisgICAgICAgICAgICAgICAgICJMXHUwMEU0cyBcIkhqXHUwMEU0bHAgLSBOeWNrZWx2ZXJrdHlnXCIgZlx1MDBGNnIgYWxsYSB0aWxsZ1x1MDBFNG5nbGlnYSBrb21tYW5kb24ifSwKKyAgICAgICAgeyJLZXkuYW5kLkNlcnRpZmljYXRlLk1hbmFnZW1lbnQuVG9vbCIsCisgICAgICAgICAgICAgICAgICJIYW50ZXJpbmdzdmVya3R5ZyBmXHUwMEY2ciBueWNrbGFyIG9jaCBjZXJ0aWZpa2F0In0sCisgICAgICAgIHsiQ29tbWFuZHMuIiwgIktvbW1hbmRvbjoifSwKKyAgICAgICAgeyJVc2Uua2V5dG9vbC5jb21tYW5kLm5hbWUuaGVscC5mb3IudXNhZ2Uub2YuY29tbWFuZC5uYW1lIiwKKyAgICAgICAgICAgICAgICAiTFx1MDBFNHMgXCJIalx1MDBFNGxwIC0gTnlja2VsdmVya3R5ZyAtIGNvbW1hbmRfbmFtZVwiIG9tIGFudlx1MDBFNG5kbmluZyBhdiBjb21tYW5kX25hbWUifSwKKyAgICAgICAgLy8ga2V5dG9vbDogaGVscDogY29tbWFuZHMKKyAgICAgICAgeyJHZW5lcmF0ZXMuYS5jZXJ0aWZpY2F0ZS5yZXF1ZXN0IiwKKyAgICAgICAgICAgICAgICAiR2VuZXJlcmFyIGNlcnRpZmlrYXRiZWdcdTAwRTRyYW4ifSwgLy8tY2VydHJlcQorICAgICAgICB7IkNoYW5nZXMuYW4uZW50cnkucy5hbGlhcyIsCisgICAgICAgICAgICAgICAgIlx1MDBDNG5kcmFyIHBvc3RhbGlhcyJ9LCAvLy1jaGFuZ2VhbGlhcworICAgICAgICB7IkRlbGV0ZXMuYW4uZW50cnkiLAorICAgICAgICAgICAgICAgICJUYXIgYm9ydCBwb3N0In0sIC8vLWRlbGV0ZQorICAgICAgICB7IkV4cG9ydHMuY2VydGlmaWNhdGUiLAorICAgICAgICAgICAgICAgICJFeHBvcnRlcmFyIGNlcnRpZmlrYXQifSwgLy8tZXhwb3J0Y2VydAorICAgICAgICB7IkdlbmVyYXRlcy5hLmtleS5wYWlyIiwKKyAgICAgICAgICAgICAgICAiR2VuZXJlcmFyIG55Y2tlbHBhciJ9LCAvLy1nZW5rZXlwYWlyCisvLyB0cmFuc2xhdGlvbiBvZiAic2VjcmV0IiBrZXkgc2hvdWxkIGJlIGRpZmZlcmVudCB0byAicHJpdmF0ZSIga2V5LgorICAgICAgICB7IkdlbmVyYXRlcy5hLnNlY3JldC5rZXkiLAorICAgICAgICAgICAgICAgICJHZW5lcmVyYXIgaGVtbGlnIG55Y2tlbCJ9LCAvLy1nZW5zZWNrZXkKKyAgICAgICAgeyJHZW5lcmF0ZXMuY2VydGlmaWNhdGUuZnJvbS5hLmNlcnRpZmljYXRlLnJlcXVlc3QiLAorICAgICAgICAgICAgICAgICJHZW5lcmVyYXIgY2VydGlmaWthdCBmclx1MDBFNW4gY2VydGlmaWthdGJlZ1x1MDBFNHJhbiJ9LCAvLy1nZW5jZXJ0CisgICAgICAgIHsiR2VuZXJhdGVzLkNSTCIsICJHZW5lcmVyYXIgQ1JMIn0sIC8vLWdlbmNybAorICAgICAgICB7IkltcG9ydHMuZW50cmllcy5mcm9tLmEuSkRLLjEuMS54LnN0eWxlLmlkZW50aXR5LmRhdGFiYXNlIiwKKyAgICAgICAgICAgICAgICAiSW1wb3J0ZXJhciBwb3N0ZXIgZnJcdTAwRTVuIGlkZW50aXRldHNkYXRhYmFzIGkgSkRLIDEuMS54LWZvcm1hdCJ9LCAvLy1pZGVudGl0eWRiCisgICAgICAgIHsiSW1wb3J0cy5hLmNlcnRpZmljYXRlLm9yLmEuY2VydGlmaWNhdGUuY2hhaW4iLAorICAgICAgICAgICAgICAgICJJbXBvcnRlcmFyIGV0dCBjZXJ0aWZpa2F0IGVsbGVyIGVuIGNlcnRpZmlrYXRrZWRqYSJ9LCAvLy1pbXBvcnRjZXJ0CisgICAgICAgIHsiSW1wb3J0cy5vbmUub3IuYWxsLmVudHJpZXMuZnJvbS5hbm90aGVyLmtleXN0b3JlIiwKKyAgICAgICAgICAgICAgICAiSW1wb3J0ZXJhciBlbiBlbGxlciBhbGxhIHBvc3RlciBmclx1MDBFNW4gYW5uYXQgbnlja2VsbGFnZXIifSwgLy8taW1wb3J0a2V5c3RvcmUKKyAgICAgICAgeyJDbG9uZXMuYS5rZXkuZW50cnkiLAorICAgICAgICAgICAgICAgICJLbG9uYXIgZW4gbnlja2VscG9zdCJ9LCAvLy1rZXljbG9uZQorICAgICAgICB7IkNoYW5nZXMudGhlLmtleS5wYXNzd29yZC5vZi5hbi5lbnRyeSIsCisgICAgICAgICAgICAgICAgIlx1MDBDNG5kcmFyIG55Y2tlbGxcdTAwRjZzZW5vcmRldCBmXHUwMEY2ciBlbiBwb3N0In0sIC8vLWtleXBhc3N3ZAorICAgICAgICB7Ikxpc3RzLmVudHJpZXMuaW4uYS5rZXlzdG9yZSIsCisgICAgICAgICAgICAgICAgIlZpc2FyIGxpc3RhIFx1MDBGNnZlciBwb3N0ZXIgaSBueWNrZWxsYWdlciJ9LCAvLy1saXN0CisgICAgICAgIHsiUHJpbnRzLnRoZS5jb250ZW50Lm9mLmEuY2VydGlmaWNhdGUiLAorICAgICAgICAgICAgICAgICJTa3JpdmVyIHV0IGlubmVoXHUwMEU1bGxldCBpIGV0dCBjZXJ0aWZpa2F0In0sIC8vLXByaW50Y2VydAorICAgICAgICB7IlByaW50cy50aGUuY29udGVudC5vZi5hLmNlcnRpZmljYXRlLnJlcXVlc3QiLAorICAgICAgICAgICAgICAgICJTa3JpdmVyIHV0IGlubmVoXHUwMEU1bGxldCBpIGVuIGNlcnRpZmlrYXRiZWdcdTAwRTRyYW4ifSwgLy8tcHJpbnRjZXJ0cmVxCisgICAgICAgIHsiUHJpbnRzLnRoZS5jb250ZW50Lm9mLmEuQ1JMLmZpbGUiLAorICAgICAgICAgICAgICAgICJTa3JpdmVyIHV0IGlubmVoXHUwMEU1bGxldCBpIGVuIENSTC1maWwifSwgLy8tcHJpbnRjcmwKKyAgICAgICAgeyJHZW5lcmF0ZXMuYS5zZWxmLnNpZ25lZC5jZXJ0aWZpY2F0ZSIsCisgICAgICAgICAgICAgICAgIkdlbmVyZXJhciBldHQgc2pcdTAwRTRsdnNpZ25lcmF0IGNlcnRpZmlrYXQifSwgLy8tc2VsZmNlcnQKKyAgICAgICAgeyJDaGFuZ2VzLnRoZS5zdG9yZS5wYXNzd29yZC5vZi5hLmtleXN0b3JlIiwKKyAgICAgICAgICAgICAgICAiXHUwMEM0bmRyYXIgbGFnZXJsXHUwMEY2c2Vub3JkZXQgZlx1MDBGNnIgZXR0IG55Y2tlbGxhZ2VyIn0sIC8vLXN0b3JlcGFzc3dkCisgICAgICAgIC8vIGtleXRvb2w6IGhlbHA6IG9wdGlvbnMKKyAgICAgICAgeyJhbGlhcy5uYW1lLm9mLnRoZS5lbnRyeS50by5wcm9jZXNzIiwKKyAgICAgICAgICAgICAgICAiYWxpYXNuYW1uIGZcdTAwRjZyIHBvc3Qgc29tIHNrYSBiZWFyYmV0YXMifSwgLy8tYWxpYXMKKyAgICAgICAgeyJkZXN0aW5hdGlvbi5hbGlhcyIsCisgICAgICAgICAgICAgICAgImRlc3RpbmF0aW9uc2FsaWFzIn0sIC8vLWRlc3RhbGlhcworICAgICAgICB7ImRlc3RpbmF0aW9uLmtleS5wYXNzd29yZCIsCisgICAgICAgICAgICAgICAgImxcdTAwRjZzZW5vcmQgZlx1MDBGNnIgZGVzdGluYXRpb25zbnlja2VsIn0sIC8vLWRlc3RrZXlwYXNzCisgICAgICAgIHsiZGVzdGluYXRpb24ua2V5c3RvcmUubmFtZSIsCisgICAgICAgICAgICAgICAgIm5hbW4gcFx1MDBFNSBkZXN0aW5hdGlvbnNueWNrZWxsYWdlciJ9LCAvLy1kZXN0a2V5c3RvcmUKKyAgICAgICAgeyJkZXN0aW5hdGlvbi5rZXlzdG9yZS5wYXNzd29yZC5wcm90ZWN0ZWQiLAorICAgICAgICAgICAgICAgICJza3lkZGF0IGxcdTAwRjZzZW5vcmQgZlx1MDBGNnIgZGVzdGluYXRpb25zbnlja2VsbGFnZXIifSwgLy8tZGVzdHByb3RlY3RlZAorICAgICAgICB7ImRlc3RpbmF0aW9uLmtleXN0b3JlLnByb3ZpZGVyLm5hbWUiLAorICAgICAgICAgICAgICAgICJsZXZlcmFudFx1MDBGNnJzbmFtbiBmXHUwMEY2ciBkZXN0aW5hdGlvbnNueWNrZWxsYWdlciJ9LCAvLy1kZXN0cHJvdmlkZXJuYW1lCisgICAgICAgIHsiZGVzdGluYXRpb24ua2V5c3RvcmUucGFzc3dvcmQiLAorICAgICAgICAgICAgICAgICJsXHUwMEY2c2Vub3JkIGZcdTAwRjZyIGRlc3RpbmF0aW9uc255Y2tlbGxhZ2VyIn0sIC8vLWRlc3RzdG9yZXBhc3MKKyAgICAgICAgeyJkZXN0aW5hdGlvbi5rZXlzdG9yZS50eXBlIiwKKyAgICAgICAgICAgICAgICAidHlwIGF2IGRlc3RpbmF0aW9uc255Y2tlbGxhZ2VyIn0sIC8vLWRlc3RzdG9yZXR5cGUKKyAgICAgICAgeyJkaXN0aW5ndWlzaGVkLm5hbWUiLAorICAgICAgICAgICAgICAgICJ1bmlrdCBuYW1uIn0sIC8vLWRuYW1lCisgICAgICAgIHsiWC41MDkuZXh0ZW5zaW9uIiwKKyAgICAgICAgICAgICAgICAiWC41MDktdGlsbFx1MDBFNGdnIn0sIC8vLWV4dAorICAgICAgICB7Im91dHB1dC5maWxlLm5hbWUiLAorICAgICAgICAgICAgICAgICJuYW1uIHBcdTAwRTUgdXRkYXRhZmlsIn0sIC8vLWZpbGUgYW5kIC1vdXRmaWxlCisgICAgICAgIHsiaW5wdXQuZmlsZS5uYW1lIiwKKyAgICAgICAgICAgICAgICAibmFtbiBwXHUwMEU1IGluZGF0YWZpbCJ9LCAvLy1maWxlIGFuZCAtaW5maWxlCisgICAgICAgIHsia2V5LmFsZ29yaXRobS5uYW1lIiwKKyAgICAgICAgICAgICAgICAibmFtbiBwXHUwMEU1IG55Y2tlbGFsZ29yaXRtIn0sIC8vLWtleWFsZworICAgICAgICB7ImtleS5wYXNzd29yZCIsCisgICAgICAgICAgICAgICAgIm55Y2tlbGxcdTAwRjZzZW5vcmQifSwgLy8ta2V5cGFzcworICAgICAgICB7ImtleS5iaXQuc2l6ZSIsCisgICAgICAgICAgICAgICAgIm55Y2tlbGJpdHN0b3JsZWsifSwgLy8ta2V5c2l6ZQorICAgICAgICB7ImtleXN0b3JlLm5hbWUiLAorICAgICAgICAgICAgICAgICJuYW1uIHBcdTAwRTUgbnlja2VsbGFnZXIifSwgLy8ta2V5c3RvcmUKKyAgICAgICAgeyJuZXcucGFzc3dvcmQiLAorICAgICAgICAgICAgICAgICJueXR0IGxcdTAwRjZzZW5vcmQifSwgLy8tbmV3CisgICAgICAgIHsiZG8ubm90LnByb21wdCIsCisgICAgICAgICAgICAgICAgImZyXHUwMEU1Z2EgaW50ZSJ9LCAvLy1ub3Byb21wdAorICAgICAgICB7InBhc3N3b3JkLnRocm91Z2gucHJvdGVjdGVkLm1lY2hhbmlzbSIsCisgICAgICAgICAgICAgICAgImxcdTAwRjZzZW5vcmQgbWVkIHNreWRkYWQgbWVrYW5pc20ifSwgLy8tcHJvdGVjdGVkCisgICAgICAgIHsicHJvdmlkZXIuYXJndW1lbnQiLAorICAgICAgICAgICAgICAgICJsZXZlcmFudFx1MDBGNnJzYXJndW1lbnQifSwgLy8tcHJvdmlkZXJhcmcKKyAgICAgICAgeyJwcm92aWRlci5jbGFzcy5uYW1lIiwKKyAgICAgICAgICAgICAgICAibmFtbiBwXHUwMEU1IGxldmVyYW50XHUwMEY2cnNrbGFzcyJ9LCAvLy1wcm92aWRlcmNsYXNzCisgICAgICAgIHsicHJvdmlkZXIubmFtZSIsCisgICAgICAgICAgICAgICAgImxldmVyYW50XHUwMEY2cnNuYW1uIn0sIC8vLXByb3ZpZGVybmFtZQorICAgICAgICB7InByb3ZpZGVyLmNsYXNzcGF0aCIsCisgICAgICAgICAgICAgICAgImxldmVyYW50XHUwMEY2cnNrbGFzc1x1MDBGNmt2XHUwMEU0ZyJ9LCAvLy1wcm92aWRlcnBhdGgKKyAgICAgICAgeyJvdXRwdXQuaW4uUkZDLnN0eWxlIiwKKyAgICAgICAgICAgICAgICAidXRkYXRhIGkgUkZDLWZvcm1hdCJ9LCAvLy1yZmMKKyAgICAgICAgeyJzaWduYXR1cmUuYWxnb3JpdGhtLm5hbWUiLAorICAgICAgICAgICAgICAgICJuYW1uIHBcdTAwRTUgc2lnbmF0dXJhbGdvcml0bSJ9LCAvLy1zaWdhbGcKKyAgICAgICAgeyJzb3VyY2UuYWxpYXMiLAorICAgICAgICAgICAgICAgICJrXHUwMEU0bGxhbGlhcyJ9LCAvLy1zcmNhbGlhcworICAgICAgICB7InNvdXJjZS5rZXkucGFzc3dvcmQiLAorICAgICAgICAgICAgICAgICJsXHUwMEY2c2Vub3JkIGZcdTAwRjZyIGtcdTAwRTRsbG55Y2tlbCJ9LCAvLy1zcmNrZXlwYXNzCisgICAgICAgIHsic291cmNlLmtleXN0b3JlLm5hbWUiLAorICAgICAgICAgICAgICAgICJuYW1uIHBcdTAwRTUga1x1MDBFNGxsbnlja2VsbGFnZXIifSwgLy8tc3Jja2V5c3RvcmUKKyAgICAgICAgeyJzb3VyY2Uua2V5c3RvcmUucGFzc3dvcmQucHJvdGVjdGVkIiwKKyAgICAgICAgICAgICAgICAic2t5ZGRhdCBsXHUwMEY2c2Vub3JkIGZcdTAwRjZyIGtcdTAwRTRsbG55Y2tlbGxhZ2VyIn0sIC8vLXNyY3Byb3RlY3RlZAorICAgICAgICB7InNvdXJjZS5rZXlzdG9yZS5wcm92aWRlci5uYW1lIiwKKyAgICAgICAgICAgICAgICAibGV2ZXJhbnRcdTAwRjZyc25hbW4gZlx1MDBGNnIga1x1MDBFNGxsbnlja2VsbGFnZXIifSwgLy8tc3JjcHJvdmlkZXJuYW1lCisgICAgICAgIHsic291cmNlLmtleXN0b3JlLnBhc3N3b3JkIiwKKyAgICAgICAgICAgICAgICAibFx1MDBGNnNlbm9yZCBmXHUwMEY2ciBrXHUwMEU0bGxueWNrZWxsYWdlciJ9LCAvLy1zcmNzdG9yZXBhc3MKKyAgICAgICAgeyJzb3VyY2Uua2V5c3RvcmUudHlwZSIsCisgICAgICAgICAgICAgICAgInR5cCBhdiBrXHUwMEU0bGxueWNrZWxsYWdlciJ9LCAvLy1zcmNzdG9yZXR5cGUKKyAgICAgICAgeyJTU0wuc2VydmVyLmhvc3QuYW5kLnBvcnQiLAorICAgICAgICAgICAgICAgICJTU0wtc2VydmVydlx1MDBFNHJkIG9jaCAtcG9ydCJ9LCAvLy1zc2xzZXJ2ZXIKKyAgICAgICAgeyJzaWduZWQuamFyLmZpbGUiLAorICAgICAgICAgICAgICAgICJzaWduZXJhZCBqYXItZmlsIn0sIC8vPWphcmZpbGUKKyAgICAgICAgeyJjZXJ0aWZpY2F0ZS52YWxpZGl0eS5zdGFydC5kYXRlLnRpbWUiLAorICAgICAgICAgICAgICAgICJzdGFydGRhdHVtLy10aWQgZlx1MDBGNnIgY2VydGlmaWthdGV0cyBnaWx0aWdoZXQifSwgLy8tc3RhcnRkYXRlCisgICAgICAgIHsia2V5c3RvcmUucGFzc3dvcmQiLAorICAgICAgICAgICAgICAgICJsXHUwMEY2c2Vub3JkIGZcdTAwRjZyIG55Y2tlbGxhZ2VyIn0sIC8vLXN0b3JlcGFzcworICAgICAgICB7ImtleXN0b3JlLnR5cGUiLAorICAgICAgICAgICAgICAgICJueWNrZWxsYWdlcnR5cCJ9LCAvLy1zdG9yZXR5cGUKKyAgICAgICAgeyJ0cnVzdC5jZXJ0aWZpY2F0ZXMuZnJvbS5jYWNlcnRzIiwKKyAgICAgICAgICAgICAgICAidGlsbGZcdTAwRjZybGl0bGlnYSBjZXJ0aWZpa2F0IGZyXHUwMEU1biBjYWNlcnRzIn0sIC8vLXRydXN0Y2FjZXJ0cworICAgICAgICB7InZlcmJvc2Uub3V0cHV0IiwKKyAgICAgICAgICAgICAgICAidXRmXHUwMEY2cmxpZ2EgdXRkYXRhIn0sIC8vLXYKKyAgICAgICAgeyJ2YWxpZGl0eS5udW1iZXIub2YuZGF5cyIsCisgICAgICAgICAgICAgICAgImFudGFsIGRhZ2FyIGZcdTAwRjZyIGdpbHRpZ2hldCJ9LCAvLy12YWxpZGl0eQorICAgICAgICB7IlNlcmlhbC5JRC5vZi5jZXJ0LnRvLnJldm9rZSIsCisgICAgICAgICAgICAgICAgICJTZXJpZWxsdCBJRCBmXHUwMEY2ciBjZXJ0aWZpa2F0IHNvbSBza2EgXHUwMEU1dGVya2FsbGFzIn0sIC8vLWlkCisgICAgICAgIC8vIGtleXRvb2w6IFJ1bm5pbmcgcGFydAorICAgICAgICB7ImtleXRvb2wuZXJyb3IuIiwgIm55Y2tlbHZlcmt0eWdzZmVsOiAifSwKKyAgICAgICAgeyJJbGxlZ2FsLm9wdGlvbi4iLCAiT3RpbGxcdTAwRTV0ZXQgYWx0ZXJuYXRpdjogICJ9LAorICAgICAgICB7IklsbGVnYWwudmFsdWUuIiwgIk90aWxsXHUwMEU1dGV0IHZcdTAwRTRyZGU6ICJ9LAorICAgICAgICB7IlVua25vd24ucGFzc3dvcmQudHlwZS4iLCAiT2tcdTAwRTRuZCBsXHUwMEY2c2Vub3Jkc3R5cDogIn0sCisgICAgICAgIHsiQ2Fubm90LmZpbmQuZW52aXJvbm1lbnQudmFyaWFibGUuIiwKKyAgICAgICAgICAgICAgICAiS2FuIGludGUgaGl0dGEgbWlsalx1MDBGNnZhcmlhYmVsOiAifSwKKyAgICAgICAgeyJDYW5ub3QuZmluZC5maWxlLiIsICJIaXR0YXIgaW50ZSBmaWw6ICJ9LAorICAgICAgICB7IkNvbW1hbmQub3B0aW9uLmZsYWcubmVlZHMuYW4uYXJndW1lbnQuIiwgIktvbW1hbmRvYWx0ZXJuYXRpdmV0IHswfSBiZWhcdTAwRjZ2ZXIgZXR0IGFyZ3VtZW50LiJ9LAorICAgICAgICB7Ildhcm5pbmcuRGlmZmVyZW50LnN0b3JlLmFuZC5rZXkucGFzc3dvcmRzLm5vdC5zdXBwb3J0ZWQuZm9yLlBLQ1MxMi5LZXlTdG9yZXMuSWdub3JpbmcudXNlci5zcGVjaWZpZWQuY29tbWFuZC52YWx1ZS4iLAorICAgICAgICAgICAgICAgICJWYXJuaW5nISAgUEtDUzEyLW55Y2tlbGxhZ2VyIGhhciBpbnRlIHN0XHUwMEY2ZCBmXHUwMEY2ciBvbGlrYSBsXHUwMEY2c2Vub3JkIGZcdTAwRjZyIGxhZ3JldCBvY2ggbnlja2Vsbi4gRGV0IGFudlx1MDBFNG5kYXJzcGVjaWZpY2VyYWRlIHswfS12XHUwMEU0cmRldCBpZ25vcmVyYXMuIn0sCisgICAgICAgIHsiLmtleXN0b3JlLm11c3QuYmUuTk9ORS5pZi5zdG9yZXR5cGUuaXMuezB9IiwKKyAgICAgICAgICAgICAgICAiLWtleXN0b3JlIG1cdTAwRTVzdGUgdmFyYSBOT05FIG9tIC1zdG9yZXR5cGUgXHUwMEU0ciB7MH0ifSwKKyAgICAgICAgeyJUb28ubWFueS5yZXRyaWVzLnByb2dyYW0udGVybWluYXRlZCIsCisgICAgICAgICAgICAgICAgICJGXHUwMEY2ciBtXHUwMEU1bmdhIGZcdTAwRjZyc1x1MDBGNmsuIFByb2dyYW1tZXQgYXZzbHV0YXMifSwKKyAgICAgICAgeyIuc3RvcmVwYXNzd2QuYW5kLmtleXBhc3N3ZC5jb21tYW5kcy5ub3Quc3VwcG9ydGVkLmlmLnN0b3JldHlwZS5pcy57MH0iLAorICAgICAgICAgICAgICAgICItc3RvcmVwYXNzd2QtIG9jaCAta2V5cGFzc3dkLWtvbW1hbmRvbiBzdFx1MDBGNmRzIGludGUgb20gLXN0b3JldHlwZSBcdTAwRTRyIHswfSJ9LAorICAgICAgICB7Ii5rZXlwYXNzd2QuY29tbWFuZHMubm90LnN1cHBvcnRlZC5pZi5zdG9yZXR5cGUuaXMuUEtDUzEyIiwKKyAgICAgICAgICAgICAgICAiLWtleXBhc3N3ZC1rb21tYW5kb24gc3RcdTAwRjZkcyBpbnRlIG9tIC1zdG9yZXR5cGUgXHUwMEU0ciBQS0NTMTIifSwKKyAgICAgICAgeyIua2V5cGFzcy5hbmQubmV3LmNhbi5ub3QuYmUuc3BlY2lmaWVkLmlmLnN0b3JldHlwZS5pcy57MH0iLAorICAgICAgICAgICAgICAgICIta2V5cGFzcyBvY2ggLW5ldyBrYW4gaW50ZSBhbmdlcyBvbSAtc3RvcmV0eXBlIFx1MDBFNHIgezB9In0sCisgICAgICAgIHsiaWYucHJvdGVjdGVkLmlzLnNwZWNpZmllZC50aGVuLnN0b3JlcGFzcy5rZXlwYXNzLmFuZC5uZXcubXVzdC5ub3QuYmUuc3BlY2lmaWVkIiwKKyAgICAgICAgICAgICAgICAib20gLXByb3RlY3RlZCBoYXIgYW5nZXR0cyBmXHUwMEU1ciBpbnRlIC1zdG9yZXBhc3MsIC1rZXlwYXNzIG9jaCAtbmV3IGFuZ2VzIn0sCisgICAgICAgIHsiaWYuc3JjcHJvdGVjdGVkLmlzLnNwZWNpZmllZC50aGVuLnNyY3N0b3JlcGFzcy5hbmQuc3Jja2V5cGFzcy5tdXN0Lm5vdC5iZS5zcGVjaWZpZWQiLAorICAgICAgICAgICAgICAgICJvbSAtc3JjcHJvdGVjdGVkIGFuZ2VzIGZcdTAwRTVyIC1zcmNzdG9yZXBhc3Mgb2NoIC1zcmNrZXlwYXNzIGludGUgYW5nZXMifSwKKyAgICAgICAgeyJpZi5rZXlzdG9yZS5pcy5ub3QucGFzc3dvcmQucHJvdGVjdGVkLnRoZW4uc3RvcmVwYXNzLmtleXBhc3MuYW5kLm5ldy5tdXN0Lm5vdC5iZS5zcGVjaWZpZWQiLAorICAgICAgICAgICAgICAgICJvbSBueWNrZWxsYWdyZXQgaW50ZSBcdTAwRTRyIGxcdTAwRjZzZW5vcmRzc2t5ZGRhdCBmXHUwMEU1ciAtc3RvcmVwYXNzLCAta2V5cGFzcyBvY2ggLW5ldyBpbnRlIGFuZ2VzIn0sCisgICAgICAgIHsiaWYuc291cmNlLmtleXN0b3JlLmlzLm5vdC5wYXNzd29yZC5wcm90ZWN0ZWQudGhlbi5zcmNzdG9yZXBhc3MuYW5kLnNyY2tleXBhc3MubXVzdC5ub3QuYmUuc3BlY2lmaWVkIiwKKyAgICAgICAgICAgICAgICAib20ga1x1MDBFNGxsbnlja2VsbGFncmV0IGludGUgXHUwMEU0ciBsXHUwMEY2c2Vub3Jkc3NreWRkYXQgZlx1MDBFNXIgLXNyY3N0b3JlcGFzcyBvY2ggLXNyY2tleXBhc3MgaW50ZSBhbmdlcyJ9LAorICAgICAgICB7IklsbGVnYWwuc3RhcnRkYXRlLnZhbHVlIiwgIk90aWxsXHUwMEU1dGV0IHZcdTAwRTRyZGUgZlx1MDBGNnIgc3RhcnRkYXR1bSJ9LAorICAgICAgICB7IlZhbGlkaXR5Lm11c3QuYmUuZ3JlYXRlci50aGFuLnplcm8iLAorICAgICAgICAgICAgICAgICJHaWx0aWdoZXRlbiBtXHUwMEU1c3RlIHZhcmEgc3RcdTAwRjZycmUgXHUwMEU0biBub2xsIn0sCisgICAgICAgIHsicHJvdk5hbWUubm90LmEucHJvdmlkZXIiLCAiezB9IFx1MDBFNHIgaW50ZSBlbiBsZXZlcmFudFx1MDBGNnIifSwKKyAgICAgICAgeyJVc2FnZS5lcnJvci5uby5jb21tYW5kLnByb3ZpZGVkIiwgIlN5bnRheGZlbDogaW5nZXQga29tbWFuZG8gYW5naXZldCJ9LAorICAgICAgICB7IlNvdXJjZS5rZXlzdG9yZS5maWxlLmV4aXN0cy5idXQuaXMuZW1wdHkuIiwgIk55Y2tlbGxhZ3JldHMga1x1MDBFNGxsZmlsIGZpbm5zLCBtZW4gXHUwMEU0ciB0b206ICJ9LAorICAgICAgICB7IlBsZWFzZS5zcGVjaWZ5LnNyY2tleXN0b3JlIiwgIkFuZ2UgLXNyY2tleXN0b3JlIn0sCisgICAgICAgIHsiTXVzdC5ub3Quc3BlY2lmeS5ib3RoLnYuYW5kLnJmYy53aXRoLmxpc3QuY29tbWFuZCIsCisgICAgICAgICAgICAgICAgIkthbiBpbnRlIHNwZWNpZmljZXJhIGJcdTAwRTVkZSAtdiBvY2ggLXJmYyBtZWQgJ2xpc3QnLWtvbW1hbmRvdCJ9LAorICAgICAgICB7IktleS5wYXNzd29yZC5tdXN0LmJlLmF0LmxlYXN0LjYuY2hhcmFjdGVycyIsCisgICAgICAgICAgICAgICAgIk55Y2tlbGxcdTAwRjZzZW5vcmRldCBtXHUwMEU1c3RlIGlubmVoXHUwMEU1bGxhIG1pbnN0IDYgdGVja2VuIn0sCisgICAgICAgIHsiTmV3LnBhc3N3b3JkLm11c3QuYmUuYXQubGVhc3QuNi5jaGFyYWN0ZXJzIiwKKyAgICAgICAgICAgICAgICAiRGV0IG55YSBsXHUwMEY2c2Vub3JkZXQgbVx1MDBFNXN0ZSBpbm5laFx1MDBFNWxsYSBtaW5zdCA2IHRlY2tlbiJ9LAorICAgICAgICB7IktleXN0b3JlLmZpbGUuZXhpc3RzLmJ1dC5pcy5lbXB0eS4iLAorICAgICAgICAgICAgICAgICJOeWNrZWxsYWdlcmZpbGVuIGZpbm5zLCBtZW4gXHUwMEU0ciB0b206ICJ9LAorICAgICAgICB7IktleXN0b3JlLmZpbGUuZG9lcy5ub3QuZXhpc3QuIiwKKyAgICAgICAgICAgICAgICAiTnlja2VsbGFnZXJmaWxlbiBmaW5ucyBpbnRlOiAifSwKKyAgICAgICAgeyJNdXN0LnNwZWNpZnkuZGVzdGluYXRpb24uYWxpYXMiLCAiRHUgbVx1MDBFNXN0ZSBhbmdlIGRlc3RpbmF0aW9uc2FsaWFzIn0sCisgICAgICAgIHsiTXVzdC5zcGVjaWZ5LmFsaWFzIiwgIkR1IG1cdTAwRTVzdGUgYW5nZSBhbGlhcyJ9LAorICAgICAgICB7IktleXN0b3JlLnBhc3N3b3JkLm11c3QuYmUuYXQubGVhc3QuNi5jaGFyYWN0ZXJzIiwKKyAgICAgICAgICAgICAgICAiTnlja2VsbGFnZXJsXHUwMEY2c2Vub3JkZXQgbVx1MDBFNXN0ZSBpbm5laFx1MDBFNWxsYSBtaW5zdCA2IHRlY2tlbiJ9LAorICAgICAgICB7IkVudGVyLmtleXN0b3JlLnBhc3N3b3JkLiIsICJBbmdlIG55Y2tlbGxhZ2VybFx1MDBGNnNlbm9yZDogICJ9LAorICAgICAgICB7IkVudGVyLnNvdXJjZS5rZXlzdG9yZS5wYXNzd29yZC4iLCAiQW5nZSBsXHUwMEY2c2Vub3JkIGZcdTAwRjZyIGtcdTAwRTRsbG55Y2tlbGxhZ3JldDogICJ9LAorICAgICAgICB7IkVudGVyLmRlc3RpbmF0aW9uLmtleXN0b3JlLnBhc3N3b3JkLiIsICJBbmdlIG55Y2tlbGxhZ2VybFx1MDBGNnNlbm9yZCBmXHUwMEY2ciBkZXN0aW5hdGlvbjogICJ9LAorICAgICAgICB7IktleXN0b3JlLnBhc3N3b3JkLmlzLnRvby5zaG9ydC5tdXN0LmJlLmF0LmxlYXN0LjYuY2hhcmFjdGVycyIsCisgICAgICAgICAiTnlja2VsbGFnZXJsXHUwMEY2c2Vub3JkZXQgXHUwMEU0ciBmXHUwMEY2ciBrb3J0IC0gZGV0IG1cdTAwRTVzdGUgaW5uZWhcdTAwRTVsbGEgbWluc3QgNiB0ZWNrZW4ifSwKKyAgICAgICAgeyJVbmtub3duLkVudHJ5LlR5cGUiLCAiT2tcdTAwRTRuZCBwb3N0dHlwIn0sCisgICAgICAgIHsiVG9vLm1hbnkuZmFpbHVyZXMuQWxpYXMubm90LmNoYW5nZWQiLCAiRlx1MDBGNnIgbVx1MDBFNW5nYSBmZWwuIEFsaWFzIGhhciBpbnRlIFx1MDBFNG5kcmF0cyJ9LAorICAgICAgICB7IkVudHJ5LmZvci5hbGlhcy5hbGlhcy5zdWNjZXNzZnVsbHkuaW1wb3J0ZWQuIiwKKyAgICAgICAgICAgICAgICAgIlBvc3RlbiBmXHUwMEY2ciBhbGlhcyB7MH0gaGFyIGltcG9ydGVyYXRzLiJ9LAorICAgICAgICB7IkVudHJ5LmZvci5hbGlhcy5hbGlhcy5ub3QuaW1wb3J0ZWQuIiwgIlBvc3RlbiBmXHUwMEY2ciBhbGlhcyB7MH0gaGFyIGludGUgaW1wb3J0ZXJhdHMuIn0sCisgICAgICAgIHsiUHJvYmxlbS5pbXBvcnRpbmcuZW50cnkuZm9yLmFsaWFzLmFsaWFzLmV4Y2VwdGlvbi5FbnRyeS5mb3IuYWxpYXMuYWxpYXMubm90LmltcG9ydGVkLiIsCisgICAgICAgICAgICAgICAgICJFdHQgcHJvYmxlbSB1cHBzdG9kIHZpZCBpbXBvcnRlbiBhdiBwb3N0ZW4gZlx1MDBGNnIgYWxpYXMgezB9OiB7MX0uXG5Qb3N0ZW4gezB9IGhhciBpbnRlIGltcG9ydGVyYXRzLiJ9LAorICAgICAgICB7IkltcG9ydC5jb21tYW5kLmNvbXBsZXRlZC5vay5lbnRyaWVzLnN1Y2Nlc3NmdWxseS5pbXBvcnRlZC5mYWlsLmVudHJpZXMuZmFpbGVkLm9yLmNhbmNlbGxlZCIsCisgICAgICAgICAgICAgICAgICJLb21tYW5kb2ltcG9ydGVuIHNsdXRmXHUwMEY2cmQ6IHswfSBwb3N0ZXIgaGFyIGltcG9ydGVyYXRzLCB7MX0gcG9zdGVyIHZhciBmZWxha3RpZ2EgZWxsZXIgYW5udWxsZXJhZGVzIn0sCisgICAgICAgIHsiV2FybmluZy5PdmVyd3JpdGluZy5leGlzdGluZy5hbGlhcy5hbGlhcy5pbi5kZXN0aW5hdGlvbi5rZXlzdG9yZSIsCisgICAgICAgICAgICAgICAgICJWYXJuaW5nISBEZXQgYmVmaW50bGlnYSBhbGlhc2V0IHswfSBpIGRlc3RpbmF0aW9uc255Y2tlbGxhZ3JldCBza3JpdnMgXHUwMEY2dmVyIn0sCisgICAgICAgIHsiRXhpc3RpbmcuZW50cnkuYWxpYXMuYWxpYXMuZXhpc3RzLm92ZXJ3cml0ZS5uby4iLAorICAgICAgICAgICAgICAgICAiQWxpYXNldCB7MH0gZmlubnMgcmVkYW4uIFZpbGwgZHUgc2tyaXZhIFx1MDBGNnZlciBkZXQ/IFtuZWpdOiAgIn0sCisgICAgICAgIHsiVG9vLm1hbnkuZmFpbHVyZXMudHJ5LmxhdGVyIiwgIkZcdTAwRjZyIG1cdTAwRTVuZ2EgZmVsIC0gZlx1MDBGNnJzXHUwMEY2ayBpZ2VuIHNlbmFyZSJ9LAorICAgICAgICB7IkNlcnRpZmljYXRpb24ucmVxdWVzdC5zdG9yZWQuaW4uZmlsZS5maWxlbmFtZS4iLAorICAgICAgICAgICAgICAgICJDZXJ0aWZpa2F0YmVnXHUwMEU0cmFuIGhhciBsYWdyYXRzIGkgZmlsZW4gPHswfT4ifSwKKyAgICAgICAgeyJTdWJtaXQudGhpcy50by55b3VyLkNBIiwgIlNraWNrYSBkZXR0YSB0aWxsIGNlcnRpZmlrYXR1dGZcdTAwRTRyZGFyZW4ifSwKKyAgICAgICAgeyJpZi5hbGlhcy5ub3Quc3BlY2lmaWVkLmRlc3RhbGlhcy5zcmNrZXlwYXNzLmFuZC5kZXN0a2V5cGFzcy5tdXN0Lm5vdC5iZS5zcGVjaWZpZWQiLAorICAgICAgICAgICAgIm9tIG5cdTAwRTVnb3QgYWxpYXMgaW50ZSBhbmdlcyBmXHUwMEU1ciBkZXN0YWxpYXMsIHNyY2tleXBhc3Mgb2NoIGRlc3RrZXlwYXNzIGludGUgYW5nZXMifSwKKyAgICAgICAgeyJDZXJ0aWZpY2F0ZS5zdG9yZWQuaW4uZmlsZS5maWxlbmFtZS4iLAorICAgICAgICAgICAgICAgICJDZXJ0aWZpa2F0ZXQgaGFyIGxhZ3JhdHMgaSBmaWxlbiA8ezB9PiJ9LAorICAgICAgICB7IkNlcnRpZmljYXRlLnJlcGx5Lndhcy5pbnN0YWxsZWQuaW4ua2V5c3RvcmUiLAorICAgICAgICAgICAgICAgICJDZXJ0aWZpa2F0c3ZhcmV0IGhhciBpbnN0YWxsZXJhdHMgaSBueWNrZWxsYWdyZXQifSwKKyAgICAgICAgeyJDZXJ0aWZpY2F0ZS5yZXBseS53YXMubm90Lmluc3RhbGxlZC5pbi5rZXlzdG9yZSIsCisgICAgICAgICAgICAgICAgIkNlcnRpZmlrYXRzdmFyZXQgaGFyIGludGUgaW5zdGFsbGVyYXRzIGkgbnlja2VsbGFncmV0In0sCisgICAgICAgIHsiQ2VydGlmaWNhdGUud2FzLmFkZGVkLnRvLmtleXN0b3JlIiwKKyAgICAgICAgICAgICAgICAiQ2VydGlmaWthdGV0IGhhciBsYWd0cyB0aWxsIGkgbnlja2VsbGFncmV0In0sCisgICAgICAgIHsiQ2VydGlmaWNhdGUud2FzLm5vdC5hZGRlZC50by5rZXlzdG9yZSIsCisgICAgICAgICAgICAgICAgIkNlcnRpZmlrYXRldCBoYXIgaW50ZSBsYWd0cyB0aWxsIGkgbnlja2VsbGFncmV0In0sCisgICAgICAgIHsiLlN0b3Jpbmcua3NmbmFtZS4iLCAiW0xhZ3JhciB7MH1dIn0sCisgICAgICAgIHsiYWxpYXMuaGFzLm5vLnB1YmxpYy5rZXkuY2VydGlmaWNhdGUuIiwKKyAgICAgICAgICAgICAgICAiezB9IHNha25hciBvZmZlbnRsaWcgbnlja2VsIChjZXJ0aWZpa2F0KSJ9LAorICAgICAgICB7IkNhbm5vdC5kZXJpdmUuc2lnbmF0dXJlLmFsZ29yaXRobSIsCisgICAgICAgICAgICAgICAgIkthbiBpbnRlIGhcdTAwRTRybGVkYSBzaWduYXR1cmFsZ29yaXRtIn0sCisgICAgICAgIHsiQWxpYXMuYWxpYXMuZG9lcy5ub3QuZXhpc3QiLAorICAgICAgICAgICAgICAgICJBbGlhc2V0IDx7MH0+IGZpbm5zIGludGUifSwKKyAgICAgICAgeyJBbGlhcy5hbGlhcy5oYXMubm8uY2VydGlmaWNhdGUiLAorICAgICAgICAgICAgICAgICJBbGlhc2V0IDx7MH0+IHNha25hciBjZXJ0aWZpa2F0In0sCisgICAgICAgIHsiS2V5LnBhaXIubm90LmdlbmVyYXRlZC5hbGlhcy5hbGlhcy5hbHJlYWR5LmV4aXN0cyIsCisgICAgICAgICAgICAgICAgIk55Y2tlbHBhcmV0IGdlbmVyZXJhZGVzIGludGUuIEFsaWFzZXQgPHswfT4gZmlubnMgcmVkYW4ifSwKKyAgICAgICAgeyJHZW5lcmF0aW5nLmtleXNpemUuYml0LmtleUFsZ05hbWUua2V5LnBhaXIuYW5kLnNlbGYuc2lnbmVkLmNlcnRpZmljYXRlLnNpZ0FsZ05hbWUud2l0aC5hLnZhbGlkaXR5Lm9mLnZhbGlkYWxpdHkuZGF5cy5mb3IiLAorICAgICAgICAgICAgICAgICJHZW5lcmVyYXIgezB9IGJpdGFycyB7MX0tbnlja2VscGFyIG9jaCBzalx1MDBFNGx2c2lnbmVyYXQgY2VydGlmaWthdCAoezJ9KSBtZWQgZW4gZ2lsdGlnaGV0IHBcdTAwRTUgezN9IGRhZ2FyXG5cdGZcdTAwRjZyOiB7NH0ifSwKKyAgICAgICAgeyJFbnRlci5rZXkucGFzc3dvcmQuZm9yLmFsaWFzLiIsICJBbmdlIG55Y2tlbGxcdTAwRjZzZW5vcmQgZlx1MDBGNnIgPHswfT4ifSwKKyAgICAgICAgeyIuUkVUVVJOLmlmLnNhbWUuYXMua2V5c3RvcmUucGFzc3dvcmQuIiwKKyAgICAgICAgICAgICAgICAiXHQoUkVUVVJOIG9tIGRldCBcdTAwRTRyIGlkZW50aXNrdCBtZWQgbnlja2VsbGFnZXJsXHUwMEY2c2Vub3JkZXQpOiAgIn0sCisgICAgICAgIHsiS2V5LnBhc3N3b3JkLmlzLnRvby5zaG9ydC5tdXN0LmJlLmF0LmxlYXN0LjYuY2hhcmFjdGVycyIsCisgICAgICAgICAgICAgICAgIk55Y2tlbGxcdTAwRjZzZW5vcmRldCBcdTAwRTRyIGZcdTAwRjZyIGtvcnQgLSBkZXQgbVx1MDBFNXN0ZSBpbm5laFx1MDBFNWxsYSBtaW5zdCA2IHRlY2tlbiJ9LAorICAgICAgICB7IlRvby5tYW55LmZhaWx1cmVzLmtleS5ub3QuYWRkZWQudG8ua2V5c3RvcmUiLAorICAgICAgICAgICAgICAgICJGXHUwMEY2ciBtXHUwMEU1bmdhIGZlbCAtIG55Y2tlbG4gbGFkZXMgaW50ZSB0aWxsIGkgbnlja2VsbGFncmV0In0sCisgICAgICAgIHsiRGVzdGluYXRpb24uYWxpYXMuZGVzdC5hbHJlYWR5LmV4aXN0cyIsCisgICAgICAgICAgICAgICAgIkRlc3RpbmF0aW9uc2FsaWFzZXQgPHswfT4gZmlubnMgcmVkYW4ifSwKKyAgICAgICAgeyJQYXNzd29yZC5pcy50b28uc2hvcnQubXVzdC5iZS5hdC5sZWFzdC42LmNoYXJhY3RlcnMiLAorICAgICAgICAgICAgICAgICJMXHUwMEY2c2Vub3JkZXQgXHUwMEU0ciBmXHUwMEY2ciBrb3J0IC0gZGV0IG1cdTAwRTVzdGUgaW5uZWhcdTAwRTVsbGEgbWluc3QgNiB0ZWNrZW4ifSwKKyAgICAgICAgeyJUb28ubWFueS5mYWlsdXJlcy5LZXkuZW50cnkubm90LmNsb25lZCIsCisgICAgICAgICAgICAgICAgIkZcdTAwRjZyIG1cdTAwRTVuZ2EgZmVsLiBOeWNrZWxwb3N0ZW4gaGFyIGludGUga2xvbmF0cyJ9LAorICAgICAgICB7ImtleS5wYXNzd29yZC5mb3IuYWxpYXMuIiwgIm55Y2tlbGxcdTAwRjZzZW5vcmQgZlx1MDBGNnIgPHswfT4ifSwKKyAgICAgICAgeyJLZXlzdG9yZS5lbnRyeS5mb3IuaWQuZ2V0TmFtZS5hbHJlYWR5LmV4aXN0cyIsCisgICAgICAgICAgICAgICAgIk55Y2tlbGxhZ2VycG9zdCBmXHUwMEY2ciA8ezB9PiBmaW5ucyByZWRhbiJ9LAorICAgICAgICB7IkNyZWF0aW5nLmtleXN0b3JlLmVudHJ5LmZvci5pZC5nZXROYW1lLiIsCisgICAgICAgICAgICAgICAgIlNrYXBhciBueWNrZWxsYWdlcnBvc3QgZlx1MDBGNnIgPHswfT4gLi4uIn0sCisgICAgICAgIHsiTm8uZW50cmllcy5mcm9tLmlkZW50aXR5LmRhdGFiYXNlLmFkZGVkIiwKKyAgICAgICAgICAgICAgICAiSW5nYSBwb3N0ZXIgZnJcdTAwRTVuIGlkZW50aXRldHNkYXRhYmFzZW4gaGFyIGxhZ3RzIHRpbGwifSwKKyAgICAgICAgeyJBbGlhcy5uYW1lLmFsaWFzIiwgIkFsaWFzbmFtbjogezB9In0sCisgICAgICAgIHsiQ3JlYXRpb24uZGF0ZS5rZXlTdG9yZS5nZXRDcmVhdGlvbkRhdGUuYWxpYXMuIiwKKyAgICAgICAgICAgICAgICAiU2thcGF0IGRlbjogezAsZGF0ZX0ifSwKKyAgICAgICAgeyJhbGlhcy5rZXlTdG9yZS5nZXRDcmVhdGlvbkRhdGUuYWxpYXMuIiwKKyAgICAgICAgICAgICAgICAiezB9LCB7MSxkYXRlfSwgIn0sCisgICAgICAgIHsiYWxpYXMuIiwgInswfSwgIn0sCisgICAgICAgIHsiRW50cnkudHlwZS50eXBlLiIsICJQb3N0dHlwOiB7MH0ifSwKKyAgICAgICAgeyJDZXJ0aWZpY2F0ZS5jaGFpbi5sZW5ndGguIiwgIkxcdTAwRTRuZ2QgcFx1MDBFNSBjZXJ0aWZpa2F0c2tlZGphOiAifSwKKyAgICAgICAgeyJDZXJ0aWZpY2F0ZS5pLjEuIiwgIkNlcnRpZmlrYXRbezAsbnVtYmVyLGludGVnZXJ9XToifSwKKyAgICAgICAgeyJDZXJ0aWZpY2F0ZS5maW5nZXJwcmludC5TSEExLiIsICJDZXJ0aWZpa2F0ZXRzIGZpbmdlcmF2dHJ5Y2sgKFNIQTEpOiAifSwKKyAgICAgICAgeyJLZXlzdG9yZS50eXBlLiIsICJOeWNrZWxsYWdlcnR5cDogIn0sCisgICAgICAgIHsiS2V5c3RvcmUucHJvdmlkZXIuIiwgIk55Y2tlbGxhZ2VybGV2ZXJhbnRcdTAwRjZyOiAifSwKKyAgICAgICAgeyJZb3VyLmtleXN0b3JlLmNvbnRhaW5zLmtleVN0b3JlLnNpemUuZW50cnkiLAorICAgICAgICAgICAgICAgICJOeWNrZWxsYWdyZXQgaW5uZWhcdTAwRTVsbGVyIHswLG51bWJlcixpbnRlZ2VyfSBwb3N0In0sCisgICAgICAgIHsiWW91ci5rZXlzdG9yZS5jb250YWlucy5rZXlTdG9yZS5zaXplLmVudHJpZXMiLAorICAgICAgICAgICAgICAgICJOeWNrZWxsYWdyZXQgaW5uZWhcdTAwRTVsbGVyIHswLG51bWJlcixpbnRlZ2VyfSBwb3N0ZXIifSwKKyAgICAgICAgeyJGYWlsZWQudG8ucGFyc2UuaW5wdXQiLCAiS3VuZGUgaW50ZSB0b2xrYSBpbmRhdGEifSwKKyAgICAgICAgeyJFbXB0eS5pbnB1dCIsICJJbmdhIGluZGF0YSJ9LAorICAgICAgICB7Ik5vdC5YLjUwOS5jZXJ0aWZpY2F0ZSIsICJJbnRlIGV0dCBYLjUwOS1jZXJ0aWZpa2F0In0sCisgICAgICAgIHsiYWxpYXMuaGFzLm5vLnB1YmxpYy5rZXkiLCAiezB9IHNha25hciBvZmZlbnRsaWcgbnlja2VsIn0sCisgICAgICAgIHsiYWxpYXMuaGFzLm5vLlguNTA5LmNlcnRpZmljYXRlIiwgInswfSBzYWtuYXIgWC41MDktY2VydGlmaWthdCJ9LAorICAgICAgICB7Ik5ldy5jZXJ0aWZpY2F0ZS5zZWxmLnNpZ25lZC4iLCAiTnl0dCBjZXJ0aWZpa2F0IChzalx1MDBFNGx2c2lnbmVyYXQpOiJ9LAorICAgICAgICB7IlJlcGx5Lmhhcy5uby5jZXJ0aWZpY2F0ZXMiLCAiU3ZhcmV0IHNha25hciBjZXJ0aWZpa2F0In0sCisgICAgICAgIHsiQ2VydGlmaWNhdGUubm90LmltcG9ydGVkLmFsaWFzLmFsaWFzLmFscmVhZHkuZXhpc3RzIiwKKyAgICAgICAgICAgICAgICAiQ2VydGlmaWthdGV0IGltcG9ydGVyYWRlcyBpbnRlLiBBbGlhc2V0IDx7MH0+IGZpbm5zIHJlZGFuIn0sCisgICAgICAgIHsiSW5wdXQubm90LmFuLlguNTA5LmNlcnRpZmljYXRlIiwgIkluZGF0YSBcdTAwRTRyIGludGUgZXR0IFguNTA5LWNlcnRpZmlrYXQifSwKKyAgICAgICAgeyJDZXJ0aWZpY2F0ZS5hbHJlYWR5LmV4aXN0cy5pbi5rZXlzdG9yZS51bmRlci5hbGlhcy50cnVzdGFsaWFzLiIsCisgICAgICAgICAgICAgICAgIkNlcnRpZmlrYXRldCBmaW5ucyByZWRhbiBpIG55Y2tlbGxhZ2VyZmlsZW4gdW5kZXIgYWxpYXNldCA8ezB9PiJ9LAorICAgICAgICB7IkRvLnlvdS5zdGlsbC53YW50LnRvLmFkZC5pdC5uby4iLAorICAgICAgICAgICAgICAgICJWaWxsIGR1IGZvcnRmYXJhbmRlIGxcdTAwRTRnZ2EgdGlsbCBkZXQ/IFtuZWpdOiAgIn0sCisgICAgICAgIHsiQ2VydGlmaWNhdGUuYWxyZWFkeS5leGlzdHMuaW4uc3lzdGVtLndpZGUuQ0Eua2V5c3RvcmUudW5kZXIuYWxpYXMudHJ1c3RhbGlhcy4iLAorICAgICAgICAgICAgICAgICJDZXJ0aWZpa2F0ZXQgZmlubnMgcmVkYW4gaSBkZW4gc3lzdGVtb21zcFx1MDBFNG5uYW5kZSBDQS1ueWNrZWxsYWdlcmZpbGVuIHVuZGVyIGFsaWFzZXQgPHswfT4ifSwKKyAgICAgICAgeyJEby55b3Uuc3RpbGwud2FudC50by5hZGQuaXQudG8ueW91ci5vd24ua2V5c3RvcmUubm8uIiwKKyAgICAgICAgICAgICAgICAiVmlsbCBkdSBmb3J0ZmFyYW5kZSBsXHUwMEU0Z2dhIHRpbGwgZGV0IGkgZGl0dCBlZ2V0IG55Y2tlbGxhZ3JldD8gW25lal06ICAifSwKKyAgICAgICAgeyJUcnVzdC50aGlzLmNlcnRpZmljYXRlLm5vLiIsICJMaXRhciBkdSBwXHUwMEU1IGRldCBoXHUwMEU0ciBjZXJ0aWZpa2F0ZXQ/IFtuZWpdOiAgIn0sCisgICAgICAgIHsiWUVTIiwgIkphIn0sCisgICAgICAgIHsiTmV3LnByb21wdC4iLCAiTnl0dCB7MH06ICJ9LAorICAgICAgICB7IlBhc3N3b3Jkcy5tdXN0LmRpZmZlciIsICJMXHUwMEY2c2Vub3JkZW4gbVx1MDBFNXN0ZSB2YXJhIG9saWthIn0sCisgICAgICAgIHsiUmUuZW50ZXIubmV3LnByb21wdC4iLCAiQW5nZSBueXR0IHswfSBpZ2VuOiAifSwKKyAgICAgICAgeyJSZS5lbnRlci5uZXcucGFzc3dvcmQuIiwgIkFuZ2UgZGV0IG55YSBsXHUwMEY2c2Vub3JkZXQgaWdlbjogIn0sCisgICAgICAgIHsiVGhleS5kb24udC5tYXRjaC5UcnkuYWdhaW4iLCAiRGUgbWF0Y2hhciBpbnRlLiBGXHUwMEY2cnNcdTAwRjZrIGlnZW4ifSwKKyAgICAgICAgeyJFbnRlci5wcm9tcHQuYWxpYXMubmFtZS4iLCAiQW5nZSBhbGlhc25hbW4gZlx1MDBGNnIgezB9OiAgIn0sCisgICAgICAgIHsiRW50ZXIubmV3LmFsaWFzLm5hbWUuUkVUVVJOLnRvLmNhbmNlbC5pbXBvcnQuZm9yLnRoaXMuZW50cnkuIiwKKyAgICAgICAgICAgICAgICAgIkFuZ2UgZXR0IG55dHQgYWxpYXNuYW1uXHQoc2tyaXYgUkVUVVJOIGZcdTAwRjZyIGF0dCBhdmJyeXRhIGltcG9ydGVuIGF2IGRlbm5hIHBvc3QpOiAgIn0sCisgICAgICAgIHsiRW50ZXIuYWxpYXMubmFtZS4iLCAiQW5nZSBhbGlhc25hbW46ICAifSwKKyAgICAgICAgeyIuUkVUVVJOLmlmLnNhbWUuYXMuZm9yLm90aGVyQWxpYXMuIiwKKyAgICAgICAgICAgICAgICAiXHQoUkVUVVJOIG9tIGRldCBcdTAwRTRyIGRldCBzYW1tYSBzb20gZlx1MDBGNnIgPHswfT4pIn0sCisgICAgICAgIHsiLlBBVFRFUk4ucHJpbnRYNTA5Q2VydCIsCisgICAgICAgICAgICAgICAgIlx1MDBDNGdhcmU6IHswfVxuVXRmXHUwMEU0cmRhcmU6IHsxfVxuU2VyaWVudW1tZXI6IHsyfVxuR2lsdGlndCBmclx1MDBFNW4gZGVuOiB7M30gdGlsbDogezR9XG5DZXJ0aWZpa2F0ZXRzIGZpbmdlcmF2dHJ5Y2s6XG5cdCBNRDU6IHs1fVxuXHQgU0hBMTogezZ9XG5cdCBTSEEyNTY6IHs3fVxuXHQgTmFtbiBwXHUwMEU1IHNpZ25hdHVyYWxnb3JpdG06IHs4fVxuXHQgVmVyc2lvbjogezl9In0sCisgICAgICAgIHsiV2hhdC5pcy55b3VyLmZpcnN0LmFuZC5sYXN0Lm5hbWUuIiwKKyAgICAgICAgICAgICAgICAiVmFkIGhldGVyIGR1IGkgZlx1MDBGNnItIG9jaCBlZnRlcm5hbW4/In0sCisgICAgICAgIHsiV2hhdC5pcy50aGUubmFtZS5vZi55b3VyLm9yZ2FuaXphdGlvbmFsLnVuaXQuIiwKKyAgICAgICAgICAgICAgICAiVmFkIGhldGVyIGRpbiBhdmRlbG5pbmcgaW5vbSBvcmdhbmlzYXRpb25lbj8ifSwKKyAgICAgICAgeyJXaGF0LmlzLnRoZS5uYW1lLm9mLnlvdXIub3JnYW5pemF0aW9uLiIsCisgICAgICAgICAgICAgICAgIlZhZCBoZXRlciBkaW4gb3JnYW5pc2F0aW9uPyJ9LAorICAgICAgICB7IldoYXQuaXMudGhlLm5hbWUub2YueW91ci5DaXR5Lm9yLkxvY2FsaXR5LiIsCisgICAgICAgICAgICAgICAgIlZhZCBoZXRlciBkaW4gb3J0IGVsbGVyIHBsYXRzPyJ9LAorICAgICAgICB7IldoYXQuaXMudGhlLm5hbWUub2YueW91ci5TdGF0ZS5vci5Qcm92aW5jZS4iLAorICAgICAgICAgICAgICAgICJWYWQgaGV0ZXIgZGl0dCBsYW5kIGVsbGVyIGRpbiBwcm92aW5zPyJ9LAorICAgICAgICB7IldoYXQuaXMudGhlLnR3by5sZXR0ZXIuY291bnRyeS5jb2RlLmZvci50aGlzLnVuaXQuIiwKKyAgICAgICAgICAgICAgICAiVmlsa2VuIFx1MDBFNHIgZGVuIHR2XHUwMEU1c3RcdTAwRTRsbGlnYSBsYW5kc2tvZGVuPyJ9LAorICAgICAgICB7IklzLm5hbWUuY29ycmVjdC4iLCAiXHUwMEM0ciB7MH0ga29ycmVrdD8ifSwKKyAgICAgICAgeyJubyIsICJuZWoifSwKKyAgICAgICAgeyJ5ZXMiLCAiamEifSwKKyAgICAgICAgeyJ5IiwgImoifSwKKyAgICAgICAgeyIuZGVmYXVsdFZhbHVlLiIsICIgIFt7MH1dOiAgIn0sCisgICAgICAgIHsiQWxpYXMuYWxpYXMuaGFzLm5vLmtleSIsCisgICAgICAgICAgICAgICAgIkFsaWFzZXQgPHswfT4gc2FrbmFyIG55Y2tlbCJ9LAorICAgICAgICB7IkFsaWFzLmFsaWFzLnJlZmVyZW5jZXMuYW4uZW50cnkudHlwZS50aGF0LmlzLm5vdC5hLnByaXZhdGUua2V5LmVudHJ5LlRoZS5rZXljbG9uZS5jb21tYW5kLm9ubHkuc3VwcG9ydHMuY2xvbmluZy5vZi5wcml2YXRlLmtleSIsCisgICAgICAgICAgICAgICAgICJBbGlhc2V0IDx7MH0+IHJlZmVyZXJhciB0aWxsIGVuIHBvc3R0eXAgc29tIGludGUgXHUwMEU0ciBuXHUwMEU1Z29uIHByaXZhdCBueWNrZWxwb3N0LiBLb21tYW5kb3QgLWtleWNsb25lIGhhciBlbmRhc3Qgc3RcdTAwRjZkIGZcdTAwRjZyIGtsb25pbmcgYXYgcHJpdmF0YSBueWNrZWxwb3N0ZXIifSwKKworICAgICAgICB7Ii5XQVJOSU5HLldBUk5JTkcuV0FSTklORy4iLAorICAgICAgICAgICAgIioqKioqKioqKioqKioqKioqICBWYXJuaW5nIFZhcm5pbmcgVmFybmluZyAgKioqKioqKioqKioqKioqKioifSwKKyAgICAgICAgeyJTaWduZXIuZC4iLCAiU2lnbmVyYXJlICMlZDoifSwKKyAgICAgICAgeyJUaW1lc3RhbXAuIiwgIlRpZHNzdFx1MDBFNG1wZWw6In0sCisgICAgICAgIHsiU2lnbmF0dXJlLiIsICJVbmRlcnNrcmlmdDoifSwKKyAgICAgICAgeyJDUkxzLiIsICJDUkw6ZXI6In0sCisgICAgICAgIHsiQ2VydGlmaWNhdGUub3duZXIuIiwgIkNlcnRpZmlrYXRcdTAwRTRnYXJlOiAifSwKKyAgICAgICAgeyJOb3QuYS5zaWduZWQuamFyLmZpbGUiLCAiSW5nZW4gc2lnbmVyYWQgamFyLWZpbCJ9LAorICAgICAgICB7Ik5vLmNlcnRpZmljYXRlLmZyb20udGhlLlNTTC5zZXJ2ZXIiLAorICAgICAgICAgICAgICAgICJJbmdldCBjZXJ0aWZpa2F0IGZyXHUwMEU1biBTU0wtc2VydmVybiJ9LAorCisgICAgICAgIHsiLlRoZS5pbnRlZ3JpdHkub2YudGhlLmluZm9ybWF0aW9uLnN0b3JlZC5pbi55b3VyLmtleXN0b3JlLiIsCisgICAgICAgICAgICAiKiBJbnRlZ3JpdGV0ZW4gZlx1MDBGNnIgZGVuIGluZm9ybWF0aW9uIHNvbSBsYWdyYXMgaSBueWNrZWxsYWdlcmZpbGVuICAqXG4qIGhhciBJTlRFIHZlcmlmaWVyYXRzISAgT20gZHUgdmlsbCB2ZXJpZmllcmEgZGVzcyBpbnRlZ3JpdGV0ICpcbiogbVx1MDBFNXN0ZSBkdSBhbmdlIGxcdTAwRjZzZW5vcmRldCBmXHUwMEY2ciBueWNrZWxsYWdyZXQuICAgICAgICAgICAgICAgICAgKiJ9LAorICAgICAgICB7Ii5UaGUuaW50ZWdyaXR5Lm9mLnRoZS5pbmZvcm1hdGlvbi5zdG9yZWQuaW4udGhlLnNyY2tleXN0b3JlLiIsCisgICAgICAgICAgICAiKiBJbnRlZ3JpdGV0ZW4gZlx1MDBGNnIgZGVuIGluZm9ybWF0aW9uIHNvbSBsYWdyYXMgaSBzcmNrZXlzdG9yZSpcbiogaGFyIElOVEUgdmVyaWZpZXJhdHMhICBPbSBkdSB2aWxsIHZlcmlmaWVyYSBkZXNzIGludGVncml0ZXQgKlxuKiBtXHUwMEU1c3RlIGR1IGFuZ2UgbFx1MDBGNnNlbm9yZGV0IGZcdTAwRjZyIHNyY2tleXN0b3JlLiAgICAgICAgICAgICAgICAqIn0sCisKKyAgICAgICAgeyJDZXJ0aWZpY2F0ZS5yZXBseS5kb2VzLm5vdC5jb250YWluLnB1YmxpYy5rZXkuZm9yLmFsaWFzLiIsCisgICAgICAgICAgICAgICAgIkNlcnRpZmlrYXRzdmFyZXQgaW5uZWhcdTAwRTVsbGVyIGludGUgblx1MDBFNWdvbiBvZmZlbnRsaWcgbnlja2VsIGZcdTAwRjZyIDx7MH0+In0sCisgICAgICAgIHsiSW5jb21wbGV0ZS5jZXJ0aWZpY2F0ZS5jaGFpbi5pbi5yZXBseSIsCisgICAgICAgICAgICAgICAgIk9mdWxsc3RcdTAwRTRuZGlnIGNlcnRpZmlrYXRza2VkamEgaSBzdmFyZXQifSwKKyAgICAgICAgeyJDZXJ0aWZpY2F0ZS5jaGFpbi5pbi5yZXBseS5kb2VzLm5vdC52ZXJpZnkuIiwKKyAgICAgICAgICAgICAgICAiQ2VydGlmaWthdHNrZWRqYW4gaSBzdmFyZXQgZ1x1MDBFNXIgaW50ZSBhdHQgdmVyaWZpZXJhOiAifSwKKyAgICAgICAgeyJUb3AubGV2ZWwuY2VydGlmaWNhdGUuaW4ucmVwbHkuIiwKKyAgICAgICAgICAgICAgICAiVG9wcG5pdlx1MDBFNWNlcnRpZmlrYXRldCBpIHN2YXJldDpcbiJ9LAorICAgICAgICB7Ii5pcy5ub3QudHJ1c3RlZC4iLCAiLi4uIFx1MDBFNHIgaW50ZSBiZXRyb3R0LiAifSwKKyAgICAgICAgeyJJbnN0YWxsLnJlcGx5LmFueXdheS5uby4iLCAiVmlsbCBkdSBpbnN0YWxsZXJhIHN2YXJldCBcdTAwRTRuZFx1MDBFNT8gW25lal06ICAifSwKKyAgICAgICAgeyJOTyIsICJOZWoifSwKKyAgICAgICAgeyJQdWJsaWMua2V5cy5pbi5yZXBseS5hbmQua2V5c3RvcmUuZG9uLnQubWF0Y2giLAorICAgICAgICAgICAgICAgICJEZSBvZmZlbnRsaWdhIG55Y2tsYXJuYSBpIHN2YXJldCBvY2ggbnlja2VsbGFncmV0IG1hdGNoYXIgaW50ZSB2YXJhbmRyYSJ9LAorICAgICAgICB7IkNlcnRpZmljYXRlLnJlcGx5LmFuZC5jZXJ0aWZpY2F0ZS5pbi5rZXlzdG9yZS5hcmUuaWRlbnRpY2FsIiwKKyAgICAgICAgICAgICAgICAiQ2VydGlmaWthdHN2YXJldCBvY2ggY2VydGlmaWthdGV0IGkgbnlja2VsbGFncmV0IFx1MDBFNHIgaWRlbnRpc2thIn0sCisgICAgICAgIHsiRmFpbGVkLnRvLmVzdGFibGlzaC5jaGFpbi5mcm9tLnJlcGx5IiwKKyAgICAgICAgICAgICAgICAiS3VuZGUgaW50ZSB1cHByXHUwMEU0dHRhIGtlZGphIGZyXHUwMEU1biBzdmFyZXQifSwKKyAgICAgICAgeyJuIiwgIm4ifSwKKyAgICAgICAgeyJXcm9uZy5hbnN3ZXIudHJ5LmFnYWluIiwgIkZlbCBzdmFyLiBGXHUwMEY2cnNcdTAwRjZrIHBcdTAwRTUgbnl0dC4ifSwKKyAgICAgICAgeyJTZWNyZXQua2V5Lm5vdC5nZW5lcmF0ZWQuYWxpYXMuYWxpYXMuYWxyZWFkeS5leGlzdHMiLAorICAgICAgICAgICAgICAgICJEZW4gaGVtbGlnYSBueWNrZWxuIGhhciBpbnRlIGdlbmVyZXJhdHMgZWZ0ZXJzb20gYWxpYXNldCA8ezB9PiByZWRhbiBmaW5ucyJ9LAorICAgICAgICB7IlBsZWFzZS5wcm92aWRlLmtleXNpemUuZm9yLnNlY3JldC5rZXkuZ2VuZXJhdGlvbiIsCisgICAgICAgICAgICAgICAgIkFuZ2UgLWtleXNpemUgZlx1MDBGNnIgYXR0IHNrYXBhIGhlbWxpZyBueWNrZWwifSwKKworICAgICAgICB7IkV4dGVuc2lvbnMuIiwgIlRpbGxcdTAwRTRnZzogIn0sCisgICAgICAgIHsiLkVtcHR5LnZhbHVlLiIsICIoVG9tdCB2XHUwMEU0cmRlKSJ9LAorICAgICAgICB7IkV4dGVuc2lvbi5SZXF1ZXN0LiIsICJUaWxsXHUwMEU0Z2dzYmVnXHUwMEU0cmFuOiJ9LAorICAgICAgICB7IlBLQ1MuMTAuQ2VydGlmaWNhdGUuUmVxdWVzdC5WZXJzaW9uLjEuMC5TdWJqZWN0LnMuUHVibGljLktleS5zLmZvcm1hdC5zLmtleS4iLAorICAgICAgICAgICAgICAgICJQS0NTICMxMCBjZXJ0aWZpa2F0YmVnXHUwMEU0cmFuICh2ZXJzaW9uIDEuMClcblx1MDBDNG1uZTogJXNcbkFsbG1cdTAwRTRuIG55Y2tlbDogJXMtZm9ybWF0ICVzLW55Y2tlbFxuIn0sCisgICAgICAgIHsiVW5rbm93bi5rZXlVc2FnZS50eXBlLiIsICJPa1x1MDBFNG5kIGtleVVzYWdlLXR5cDogIn0sCisgICAgICAgIHsiVW5rbm93bi5leHRlbmRlZGtleVVzYWdlLnR5cGUuIiwgIk9rXHUwMEU0bmQgZXh0ZW5kZWRrZXlVc2FnZS10eXA6ICJ9LAorICAgICAgICB7IlVua25vd24uQWNjZXNzRGVzY3JpcHRpb24udHlwZS4iLCAiT2tcdTAwRTRuZCBBY2Nlc3NEZXNjcmlwdGlvbi10eXA6ICJ9LAorICAgICAgICB7IlVucmVjb2duaXplZC5HZW5lcmFsTmFtZS50eXBlLiIsICJPa1x1MDBFNG5kIEdlbmVyYWxOYW1lLXR5cDogIn0sCisgICAgICAgIHsiVGhpcy5leHRlbnNpb24uY2Fubm90LmJlLm1hcmtlZC5hcy5jcml0aWNhbC4iLAorICAgICAgICAgICAgICAgICAiRGV0dGEgdGlsbFx1MDBFNGdnIGthbiBpbnRlIG1hcmtlcmFzIHNvbSBrcml0aXNrdC4gIn0sCisgICAgICAgIHsiT2RkLm51bWJlci5vZi5oZXguZGlnaXRzLmZvdW5kLiIsICJVZGRhIGFudGFsIGhleC1zaWZmcm9yIHBcdTAwRTV0clx1MDBFNGZmYWRlczogIn0sCisgICAgICAgIHsiVW5rbm93bi5leHRlbnNpb24udHlwZS4iLCAiT2tcdTAwRTRuZCB0aWxsXHUwMEU0Z2dzdHlwOiAifSwKKyAgICAgICAgeyJjb21tYW5kLnswfS5pcy5hbWJpZ3VvdXMuIiwgImtvbW1hbmRvdCB7MH0gXHUwMEU0ciB0dmV0eWRpZ3Q6In0KKyAgICB9OworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjb250ZW50cyBvZiB0aGlzIDxjb2RlPlJlc291cmNlQnVuZGxlPC9jb2RlPi4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgY29udGVudHMgb2YgdGhpcyA8Y29kZT5SZXNvdXJjZUJ1bmRsZTwvY29kZT4uCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9iamVjdFtdW10gZ2V0Q29udGVudHMoKSB7CisgICAgICAgIHJldHVybiBjb250ZW50czsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3Rvb2xzL2tleXRvb2wvUmVzb3VyY2VzX3poX0NOLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3Rvb2xzL2tleXRvb2wvUmVzb3VyY2VzX3poX0NOLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgzNmJkNwotLS0gL2Rldi9udWxsCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdG9vbHMva2V5dG9vbC9SZXNvdXJjZXNfemhfQ04uamF2YQpAQCAtMCwwICsxLDQzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgT3JhY2xlIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCisgKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CisgKiBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBzdW4uc2VjdXJpdHkudG9vbHMua2V5dG9vbDsKKworLyoqCisgKiA8cD4gVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSA8Y29kZT5SZXNvdXJjZUJ1bmRsZTwvY29kZT4KKyAqIGZvciB0aGUga2V5dG9vbC4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBSZXNvdXJjZXNfemhfQ04gZXh0ZW5kcyBqYXZhLnV0aWwuTGlzdFJlc291cmNlQnVuZGxlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdW10gY29udGVudHMgPSB7CisgICAgICAgIHsiTkVXTElORSIsICJcbiJ9LAorICAgICAgICB7IlNUQVIiLAorICAgICAgICAgICAgICAgICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIn0sCisgICAgICAgIHsiU1RBUk5OIiwKKyAgICAgICAgICAgICAgICAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG4ifSwKKworICAgICAgICAvLyBrZXl0b29sOiBIZWxwIHBhcnQKKy8vICJPcHRpb24iIHNob3VsZCBiZSB0cmFuc2xhdGVkLgorICAgICAgICB7Ii5PUFRJT04uIiwgIiBbXHU5MDA5XHU5ODc5XS4uLiJ9LAorICAgICAgICB7Ik9wdGlvbnMuIiwgIlx1OTAwOVx1OTg3OToifSwKKyAgICAgICAgeyJVc2Uua2V5dG9vbC5oZWxwLmZvci5hbGwuYXZhaWxhYmxlLmNvbW1hbmRzIiwKKyAgICAgICAgICAgICAgICAgIlx1NEY3Rlx1NzUyOCBcImtleXRvb2wgLWhlbHBcIiBcdTgzQjdcdTUzRDZcdTYyNDBcdTY3MDlcdTUzRUZcdTc1MjhcdTU0N0RcdTRFRTQifSwKKyAgICAgICAgeyJLZXkuYW5kLkNlcnRpZmljYXRlLk1hbmFnZW1lbnQuVG9vbCIsCisgICAgICAgICAgICAgICAgICJcdTVCQzZcdTk0QTVcdTU0OENcdThCQzFcdTRFNjZcdTdCQTFcdTc0MDZcdTVERTVcdTUxNzcifSwKKyAgICAgICAgeyJDb21tYW5kcy4iLCAiXHU1NDdEXHU0RUU0OiJ9LAorICAgICAgICB7IlVzZS5rZXl0b29sLmNvbW1hbmQubmFtZS5oZWxwLmZvci51c2FnZS5vZi5jb21tYW5kLm5hbWUiLAorICAgICAgICAgICAgICAgICJcdTRGN0ZcdTc1MjggXCJrZXl0b29sIC1jb21tYW5kX25hbWUgLWhlbHBcIiBcdTgzQjdcdTUzRDYgY29tbWFuZF9uYW1lIFx1NzY4NFx1NzUyOFx1NkNENSJ9LAorICAgICAgICAvLyBrZXl0b29sOiBoZWxwOiBjb21tYW5kcworICAgICAgICB7IkdlbmVyYXRlcy5hLmNlcnRpZmljYXRlLnJlcXVlc3QiLAorICAgICAgICAgICAgICAgICJcdTc1MUZcdTYyMTBcdThCQzFcdTRFNjZcdThCRjdcdTZDNDIifSwgLy8tY2VydHJlcQorICAgICAgICB7IkNoYW5nZXMuYW4uZW50cnkucy5hbGlhcyIsCisgICAgICAgICAgICAgICAgIlx1NjZGNFx1NjUzOVx1Njc2MVx1NzZFRVx1NzY4NFx1NTIyQlx1NTQwRCJ9LCAvLy1jaGFuZ2VhbGlhcworICAgICAgICB7IkRlbGV0ZXMuYW4uZW50cnkiLAorICAgICAgICAgICAgICAgICJcdTUyMjBcdTk2NjRcdTY3NjFcdTc2RUUifSwgLy8tZGVsZXRlCisgICAgICAgIHsiRXhwb3J0cy5jZXJ0aWZpY2F0ZSIsCisgICAgICAgICAgICAgICAgIlx1NUJGQ1x1NTFGQVx1OEJDMVx1NEU2NiJ9LCAvLy1leHBvcnRjZXJ0CisgICAgICAgIHsiR2VuZXJhdGVzLmEua2V5LnBhaXIiLAorICAgICAgICAgICAgICAgICJcdTc1MUZcdTYyMTBcdTVCQzZcdTk0QTVcdTVCRjkifSwgLy8tZ2Vua2V5cGFpcgorLy8gdHJhbnNsYXRpb24gb2YgInNlY3JldCIga2V5IHNob3VsZCBiZSBkaWZmZXJlbnQgdG8gInByaXZhdGUiIGtleS4KKyAgICAgICAgeyJHZW5lcmF0ZXMuYS5zZWNyZXQua2V5IiwKKyAgICAgICAgICAgICAgICAiXHU3NTFGXHU2MjEwXHU1QkY5XHU3OUYwXHU1QkM2XHU5NEE1In0sIC8vLWdlbnNlY2tleQorICAgICAgICB7IkdlbmVyYXRlcy5jZXJ0aWZpY2F0ZS5mcm9tLmEuY2VydGlmaWNhdGUucmVxdWVzdCIsCisgICAgICAgICAgICAgICAgIlx1NjgzOVx1NjM2RVx1OEJDMVx1NEU2Nlx1OEJGN1x1NkM0Mlx1NzUxRlx1NjIxMFx1OEJDMVx1NEU2NiJ9LCAvLy1nZW5jZXJ0CisgICAgICAgIHsiR2VuZXJhdGVzLkNSTCIsICJcdTc1MUZcdTYyMTAgQ1JMIn0sIC8vLWdlbmNybAorICAgICAgICB7IkltcG9ydHMuZW50cmllcy5mcm9tLmEuSkRLLjEuMS54LnN0eWxlLmlkZW50aXR5LmRhdGFiYXNlIiwKKyAgICAgICAgICAgICAgICAiXHU0RUNFIEpESyAxLjEueCBcdTY4MzdcdTVGMEZcdTc2ODRcdThFQUJcdTRFRkRcdTY1NzBcdTYzNkVcdTVFOTNcdTVCRkNcdTUxNjVcdTY3NjFcdTc2RUUifSwgLy8taWRlbnRpdHlkYgorICAgICAgICB7IkltcG9ydHMuYS5jZXJ0aWZpY2F0ZS5vci5hLmNlcnRpZmljYXRlLmNoYWluIiwKKyAgICAgICAgICAgICAgICAiXHU1QkZDXHU1MTY1XHU4QkMxXHU0RTY2XHU2MjE2XHU4QkMxXHU0RTY2XHU5NEZFIn0sIC8vLWltcG9ydGNlcnQKKyAgICAgICAgeyJJbXBvcnRzLm9uZS5vci5hbGwuZW50cmllcy5mcm9tLmFub3RoZXIua2V5c3RvcmUiLAorICAgICAgICAgICAgICAgICJcdTRFQ0VcdTUxNzZcdTRFRDZcdTVCQzZcdTk0QTVcdTVFOTNcdTVCRkNcdTUxNjVcdTRFMDBcdTRFMkFcdTYyMTZcdTYyNDBcdTY3MDlcdTY3NjFcdTc2RUUifSwgLy8taW1wb3J0a2V5c3RvcmUKKyAgICAgICAgeyJDbG9uZXMuYS5rZXkuZW50cnkiLAorICAgICAgICAgICAgICAgICJcdTUxNEJcdTk2ODZcdTVCQzZcdTk0QTVcdTY3NjFcdTc2RUUifSwgLy8ta2V5Y2xvbmUKKyAgICAgICAgeyJDaGFuZ2VzLnRoZS5rZXkucGFzc3dvcmQub2YuYW4uZW50cnkiLAorICAgICAgICAgICAgICAgICJcdTY2RjRcdTY1MzlcdTY3NjFcdTc2RUVcdTc2ODRcdTVCQzZcdTk0QTVcdTUzRTNcdTRFRTQifSwgLy8ta2V5cGFzc3dkCisgICAgICAgIHsiTGlzdHMuZW50cmllcy5pbi5hLmtleXN0b3JlIiwKKyAgICAgICAgICAgICAgICAiXHU1MjE3XHU1MUZBXHU1QkM2XHU5NEE1XHU1RTkzXHU0RTJEXHU3Njg0XHU2NzYxXHU3NkVFIn0sIC8vLWxpc3QKKyAgICAgICAgeyJQcmludHMudGhlLmNvbnRlbnQub2YuYS5jZXJ0aWZpY2F0ZSIsCisgICAgICAgICAgICAgICAgIlx1NjI1M1x1NTM3MFx1OEJDMVx1NEU2Nlx1NTE4NVx1NUJCOSJ9LCAvLy1wcmludGNlcnQKKyAgICAgICAgeyJQcmludHMudGhlLmNvbnRlbnQub2YuYS5jZXJ0aWZpY2F0ZS5yZXF1ZXN0IiwKKyAgICAgICAgICAgICAgICAiXHU2MjUzXHU1MzcwXHU4QkMxXHU0RTY2XHU4QkY3XHU2QzQyXHU3Njg0XHU1MTg1XHU1QkI5In0sIC8vLXByaW50Y2VydHJlcQorICAgICAgICB7IlByaW50cy50aGUuY29udGVudC5vZi5hLkNSTC5maWxlIiwKKyAgICAgICAgICAgICAgICAiXHU2MjUzXHU1MzcwIENSTCBcdTY1ODdcdTRFRjZcdTc2ODRcdTUxODVcdTVCQjkifSwgLy8tcHJpbnRjcmwKKyAgICAgICAgeyJHZW5lcmF0ZXMuYS5zZWxmLnNpZ25lZC5jZXJ0aWZpY2F0ZSIsCisgICAgICAgICAgICAgICAgIlx1NzUxRlx1NjIxMFx1ODFFQVx1N0I3RVx1NTQwRFx1OEJDMVx1NEU2NiJ9LCAvLy1zZWxmY2VydAorICAgICAgICB7IkNoYW5nZXMudGhlLnN0b3JlLnBhc3N3b3JkLm9mLmEua2V5c3RvcmUiLAorICAgICAgICAgICAgICAgICJcdTY2RjRcdTY1MzlcdTVCQzZcdTk0QTVcdTVFOTNcdTc2ODRcdTVCNThcdTUwQThcdTUzRTNcdTRFRTQifSwgLy8tc3RvcmVwYXNzd2QKKyAgICAgICAgLy8ga2V5dG9vbDogaGVscDogb3B0aW9ucworICAgICAgICB7ImFsaWFzLm5hbWUub2YudGhlLmVudHJ5LnRvLnByb2Nlc3MiLAorICAgICAgICAgICAgICAgICJcdTg5ODFcdTU5MDRcdTc0MDZcdTc2ODRcdTY3NjFcdTc2RUVcdTc2ODRcdTUyMkJcdTU0MEQifSwgLy8tYWxpYXMKKyAgICAgICAgeyJkZXN0aW5hdGlvbi5hbGlhcyIsCisgICAgICAgICAgICAgICAgIlx1NzZFRVx1NjgwN1x1NTIyQlx1NTQwRCJ9LCAvLy1kZXN0YWxpYXMKKyAgICAgICAgeyJkZXN0aW5hdGlvbi5rZXkucGFzc3dvcmQiLAorICAgICAgICAgICAgICAgICJcdTc2RUVcdTY4MDdcdTVCQzZcdTk0QTVcdTUzRTNcdTRFRTQifSwgLy8tZGVzdGtleXBhc3MKKyAgICAgICAgeyJkZXN0aW5hdGlvbi5rZXlzdG9yZS5uYW1lIiwKKyAgICAgICAgICAgICAgICAiXHU3NkVFXHU2ODA3XHU1QkM2XHU5NEE1XHU1RTkzXHU1NDBEXHU3OUYwIn0sIC8vLWRlc3RrZXlzdG9yZQorICAgICAgICB7ImRlc3RpbmF0aW9uLmtleXN0b3JlLnBhc3N3b3JkLnByb3RlY3RlZCIsCisgICAgICAgICAgICAgICAgIlx1NTNEN1x1NEZERFx1NjJBNFx1NzY4NFx1NzZFRVx1NjgwN1x1NUJDNlx1OTRBNVx1NUU5M1x1NTNFM1x1NEVFNCJ9LCAvLy1kZXN0cHJvdGVjdGVkCisgICAgICAgIHsiZGVzdGluYXRpb24ua2V5c3RvcmUucHJvdmlkZXIubmFtZSIsCisgICAgICAgICAgICAgICAgIlx1NzZFRVx1NjgwN1x1NUJDNlx1OTRBNVx1NUU5M1x1NjNEMFx1NEY5Qlx1NjVCOVx1NTQwRFx1NzlGMCJ9LCAvLy1kZXN0cHJvdmlkZXJuYW1lCisgICAgICAgIHsiZGVzdGluYXRpb24ua2V5c3RvcmUucGFzc3dvcmQiLAorICAgICAgICAgICAgICAgICJcdTc2RUVcdTY4MDdcdTVCQzZcdTk0QTVcdTVFOTNcdTUzRTNcdTRFRTQifSwgLy8tZGVzdHN0b3JlcGFzcworICAgICAgICB7ImRlc3RpbmF0aW9uLmtleXN0b3JlLnR5cGUiLAorICAgICAgICAgICAgICAgICJcdTc2RUVcdTY4MDdcdTVCQzZcdTk0QTVcdTVFOTNcdTdDN0JcdTU3OEIifSwgLy8tZGVzdHN0b3JldHlwZQorICAgICAgICB7ImRpc3Rpbmd1aXNoZWQubmFtZSIsCisgICAgICAgICAgICAgICAgIlx1NTUyRlx1NEUwMFx1NTIyNFx1NTIyQlx1NTQwRCJ9LCAvLy1kbmFtZQorICAgICAgICB7IlguNTA5LmV4dGVuc2lvbiIsCisgICAgICAgICAgICAgICAgIlguNTA5IFx1NjI2OVx1NUM1NSJ9LCAvLy1leHQKKyAgICAgICAgeyJvdXRwdXQuZmlsZS5uYW1lIiwKKyAgICAgICAgICAgICAgICAiXHU4RjkzXHU1MUZBXHU2NTg3XHU0RUY2XHU1NDBEIn0sIC8vLWZpbGUgYW5kIC1vdXRmaWxlCisgICAgICAgIHsiaW5wdXQuZmlsZS5uYW1lIiwKKyAgICAgICAgICAgICAgICAiXHU4RjkzXHU1MTY1XHU2NTg3XHU0RUY2XHU1NDBEIn0sIC8vLWZpbGUgYW5kIC1pbmZpbGUKKyAgICAgICAgeyJrZXkuYWxnb3JpdGhtLm5hbWUiLAorICAgICAgICAgICAgICAgICJcdTVCQzZcdTk0QTVcdTdCOTdcdTZDRDVcdTU0MERcdTc5RjAifSwgLy8ta2V5YWxnCisgICAgICAgIHsia2V5LnBhc3N3b3JkIiwKKyAgICAgICAgICAgICAgICAiXHU1QkM2XHU5NEE1XHU1M0UzXHU0RUU0In0sIC8vLWtleXBhc3MKKyAgICAgICAgeyJrZXkuYml0LnNpemUiLAorICAgICAgICAgICAgICAgICJcdTVCQzZcdTk0QTVcdTRGNERcdTU5MjdcdTVDMEYifSwgLy8ta2V5c2l6ZQorICAgICAgICB7ImtleXN0b3JlLm5hbWUiLAorICAgICAgICAgICAgICAgICJcdTVCQzZcdTk0QTVcdTVFOTNcdTU0MERcdTc5RjAifSwgLy8ta2V5c3RvcmUKKyAgICAgICAgeyJuZXcucGFzc3dvcmQiLAorICAgICAgICAgICAgICAgICJcdTY1QjBcdTUzRTNcdTRFRTQifSwgLy8tbmV3CisgICAgICAgIHsiZG8ubm90LnByb21wdCIsCisgICAgICAgICAgICAgICAgIlx1NEUwRFx1NjNEMFx1NzkzQSJ9LCAvLy1ub3Byb21wdAorICAgICAgICB7InBhc3N3b3JkLnRocm91Z2gucHJvdGVjdGVkLm1lY2hhbmlzbSIsCisgICAgICAgICAgICAgICAgIlx1OTAxQVx1OEZDN1x1NTNEN1x1NEZERFx1NjJBNFx1NzY4NFx1NjczQVx1NTIzNlx1NzY4NFx1NTNFM1x1NEVFNCJ9LCAvLy1wcm90ZWN0ZWQKKyAgICAgICAgeyJwcm92aWRlci5hcmd1bWVudCIsCisgICAgICAgICAgICAgICAgIlx1NjNEMFx1NEY5Qlx1NjVCOVx1NTNDMlx1NjU3MCJ9LCAvLy1wcm92aWRlcmFyZworICAgICAgICB7InByb3ZpZGVyLmNsYXNzLm5hbWUiLAorICAgICAgICAgICAgICAgICJcdTYzRDBcdTRGOUJcdTY1QjlcdTdDN0JcdTU0MEQifSwgLy8tcHJvdmlkZXJjbGFzcworICAgICAgICB7InByb3ZpZGVyLm5hbWUiLAorICAgICAgICAgICAgICAgICJcdTYzRDBcdTRGOUJcdTY1QjlcdTU0MERcdTc5RjAifSwgLy8tcHJvdmlkZXJuYW1lCisgICAgICAgIHsicHJvdmlkZXIuY2xhc3NwYXRoIiwKKyAgICAgICAgICAgICAgICAiXHU2M0QwXHU0RjlCXHU2NUI5XHU3QzdCXHU4REVGXHU1Rjg0In0sIC8vLXByb3ZpZGVycGF0aAorICAgICAgICB7Im91dHB1dC5pbi5SRkMuc3R5bGUiLAorICAgICAgICAgICAgICAgICJcdTRFRTUgUkZDIFx1NjgzN1x1NUYwRlx1OEY5M1x1NTFGQSJ9LCAvLy1yZmMKKyAgICAgICAgeyJzaWduYXR1cmUuYWxnb3JpdGhtLm5hbWUiLAorICAgICAgICAgICAgICAgICJcdTdCN0VcdTU0MERcdTdCOTdcdTZDRDVcdTU0MERcdTc5RjAifSwgLy8tc2lnYWxnCisgICAgICAgIHsic291cmNlLmFsaWFzIiwKKyAgICAgICAgICAgICAgICAiXHU2RTkwXHU1MjJCXHU1NDBEIn0sIC8vLXNyY2FsaWFzCisgICAgICAgIHsic291cmNlLmtleS5wYXNzd29yZCIsCisgICAgICAgICAgICAgICAgIlx1NkU5MFx1NUJDNlx1OTRBNVx1NTNFM1x1NEVFNCJ9LCAvLy1zcmNrZXlwYXNzCisgICAgICAgIHsic291cmNlLmtleXN0b3JlLm5hbWUiLAorICAgICAgICAgICAgICAgICJcdTZFOTBcdTVCQzZcdTk0QTVcdTVFOTNcdTU0MERcdTc5RjAifSwgLy8tc3Jja2V5c3RvcmUKKyAgICAgICAgeyJzb3VyY2Uua2V5c3RvcmUucGFzc3dvcmQucHJvdGVjdGVkIiwKKyAgICAgICAgICAgICAgICAiXHU1M0Q3XHU0RkREXHU2MkE0XHU3Njg0XHU2RTkwXHU1QkM2XHU5NEE1XHU1RTkzXHU1M0UzXHU0RUU0In0sIC8vLXNyY3Byb3RlY3RlZAorICAgICAgICB7InNvdXJjZS5rZXlzdG9yZS5wcm92aWRlci5uYW1lIiwKKyAgICAgICAgICAgICAgICAiXHU2RTkwXHU1QkM2XHU5NEE1XHU1RTkzXHU2M0QwXHU0RjlCXHU2NUI5XHU1NDBEXHU3OUYwIn0sIC8vLXNyY3Byb3ZpZGVybmFtZQorICAgICAgICB7InNvdXJjZS5rZXlzdG9yZS5wYXNzd29yZCIsCisgICAgICAgICAgICAgICAgIlx1NkU5MFx1NUJDNlx1OTRBNVx1NUU5M1x1NTNFM1x1NEVFNCJ9LCAvLy1zcmNzdG9yZXBhc3MKKyAgICAgICAgeyJzb3VyY2Uua2V5c3RvcmUudHlwZSIsCisgICAgICAgICAgICAgICAgIlx1NkU5MFx1NUJDNlx1OTRBNVx1NUU5M1x1N0M3Qlx1NTc4QiJ9LCAvLy1zcmNzdG9yZXR5cGUKKyAgICAgICAgeyJTU0wuc2VydmVyLmhvc3QuYW5kLnBvcnQiLAorICAgICAgICAgICAgICAgICJTU0wgXHU2NzBEXHU1MkExXHU1NjY4XHU0RTNCXHU2NzNBXHU1NDhDXHU3QUVGXHU1M0UzIn0sIC8vLXNzbHNlcnZlcgorICAgICAgICB7InNpZ25lZC5qYXIuZmlsZSIsCisgICAgICAgICAgICAgICAgIlx1NURGMlx1N0I3RVx1NTQwRFx1NzY4NCBqYXIgXHU2NTg3XHU0RUY2In0sIC8vPWphcmZpbGUKKyAgICAgICAgeyJjZXJ0aWZpY2F0ZS52YWxpZGl0eS5zdGFydC5kYXRlLnRpbWUiLAorICAgICAgICAgICAgICAgICJcdThCQzFcdTRFNjZcdTY3MDlcdTY1NDhcdTY3MUZcdTVGMDBcdTU5Q0JcdTY1RTVcdTY3MUYvXHU2NUY2XHU5NUY0In0sIC8vLXN0YXJ0ZGF0ZQorICAgICAgICB7ImtleXN0b3JlLnBhc3N3b3JkIiwKKyAgICAgICAgICAgICAgICAiXHU1QkM2XHU5NEE1XHU1RTkzXHU1M0UzXHU0RUU0In0sIC8vLXN0b3JlcGFzcworICAgICAgICB7ImtleXN0b3JlLnR5cGUiLAorICAgICAgICAgICAgICAgICJcdTVCQzZcdTk0QTVcdTVFOTNcdTdDN0JcdTU3OEIifSwgLy8tc3RvcmV0eXBlCisgICAgICAgIHsidHJ1c3QuY2VydGlmaWNhdGVzLmZyb20uY2FjZXJ0cyIsCisgICAgICAgICAgICAgICAgIlx1NEZFMVx1NEVGQlx1Njc2NVx1ODFFQSBjYWNlcnRzIFx1NzY4NFx1OEJDMVx1NEU2NiJ9LCAvLy10cnVzdGNhY2VydHMKKyAgICAgICAgeyJ2ZXJib3NlLm91dHB1dCIsCisgICAgICAgICAgICAgICAgIlx1OEJFNlx1N0VDNlx1OEY5M1x1NTFGQSJ9LCAvLy12CisgICAgICAgIHsidmFsaWRpdHkubnVtYmVyLm9mLmRheXMiLAorICAgICAgICAgICAgICAgICJcdTY3MDlcdTY1NDhcdTU5MjlcdTY1NzAifSwgLy8tdmFsaWRpdHkKKyAgICAgICAgeyJTZXJpYWwuSUQub2YuY2VydC50by5yZXZva2UiLAorICAgICAgICAgICAgICAgICAiXHU4OTgxXHU2NEE0XHU5NTAwXHU3Njg0XHU4QkMxXHU0RTY2XHU3Njg0XHU1RThGXHU1MjE3IElEIn0sIC8vLWlkCisgICAgICAgIC8vIGtleXRvb2w6IFJ1bm5pbmcgcGFydAorICAgICAgICB7ImtleXRvb2wuZXJyb3IuIiwgImtleXRvb2wgXHU5NTE5XHU4QkVGOiAifSwKKyAgICAgICAgeyJJbGxlZ2FsLm9wdGlvbi4iLCAiXHU5NzVFXHU2Q0Q1XHU5MDA5XHU5ODc5OiAgIn0sCisgICAgICAgIHsiSWxsZWdhbC52YWx1ZS4iLCAiXHU5NzVFXHU2Q0Q1XHU1MDNDOiAifSwKKyAgICAgICAgeyJVbmtub3duLnBhc3N3b3JkLnR5cGUuIiwgIlx1NjcyQVx1NzdFNVx1NTNFM1x1NEVFNFx1N0M3Qlx1NTc4QjogIn0sCisgICAgICAgIHsiQ2Fubm90LmZpbmQuZW52aXJvbm1lbnQudmFyaWFibGUuIiwKKyAgICAgICAgICAgICAgICAiXHU2MjdFXHU0RTBEXHU1MjMwXHU3M0FGXHU1ODgzXHU1M0Q4XHU5MUNGOiAifSwKKyAgICAgICAgeyJDYW5ub3QuZmluZC5maWxlLiIsICJcdTYyN0VcdTRFMERcdTUyMzBcdTY1ODdcdTRFRjY6ICJ9LAorICAgICAgICB7IkNvbW1hbmQub3B0aW9uLmZsYWcubmVlZHMuYW4uYXJndW1lbnQuIiwgIlx1NTQ3RFx1NEVFNFx1OTAwOVx1OTg3OXswfVx1OTcwMFx1ODk4MVx1NEUwMFx1NEUyQVx1NTNDMlx1NjU3MFx1MzAwMiJ9LAorICAgICAgICB7Ildhcm5pbmcuRGlmZmVyZW50LnN0b3JlLmFuZC5rZXkucGFzc3dvcmRzLm5vdC5zdXBwb3J0ZWQuZm9yLlBLQ1MxMi5LZXlTdG9yZXMuSWdub3JpbmcudXNlci5zcGVjaWZpZWQuY29tbWFuZC52YWx1ZS4iLAorICAgICAgICAgICAgICAgICJcdThCNjZcdTU0NEE6IFBLQ1MxMiBLZXlTdG9yZSBcdTRFMERcdTY1MkZcdTYzMDFcdTUxNzZcdTRFRDZcdTVCNThcdTUwQThcdTU0OENcdTVCQzZcdTk0QTVcdTUzRTNcdTRFRTRcdTMwMDJcdTZCNjNcdTU3MjhcdTVGRkRcdTc1NjVcdTc1MjhcdTYyMzdcdTYzMDdcdTVCOUFcdTc2ODR7MH1cdTUwM0NcdTMwMDIifSwKKyAgICAgICAgeyIua2V5c3RvcmUubXVzdC5iZS5OT05FLmlmLnN0b3JldHlwZS5pcy57MH0iLAorICAgICAgICAgICAgICAgICJcdTU5ODJcdTY3OUMgLXN0b3JldHlwZSBcdTRFM0EgezB9LCBcdTUyMTkgLWtleXN0b3JlIFx1NUZDNVx1OTg3Qlx1NEUzQSBOT05FIn0sCisgICAgICAgIHsiVG9vLm1hbnkucmV0cmllcy5wcm9ncmFtLnRlcm1pbmF0ZWQiLAorICAgICAgICAgICAgICAgICAiXHU5MUNEXHU4QkQ1XHU2QjIxXHU2NTcwXHU4RkM3XHU1OTFBLCBcdTdBMEJcdTVFOEZcdTVERjJcdTdFQzhcdTZCNjIifSwKKyAgICAgICAgeyIuc3RvcmVwYXNzd2QuYW5kLmtleXBhc3N3ZC5jb21tYW5kcy5ub3Quc3VwcG9ydGVkLmlmLnN0b3JldHlwZS5pcy57MH0iLAorICAgICAgICAgICAgICAgICJcdTU5ODJcdTY3OUMgLXN0b3JldHlwZSBcdTRFM0EgezB9LCBcdTUyMTlcdTRFMERcdTY1MkZcdTYzMDEgLXN0b3JlcGFzc3dkIFx1NTQ4QyAta2V5cGFzc3dkIFx1NTQ3RFx1NEVFNCJ9LAorICAgICAgICB7Ii5rZXlwYXNzd2QuY29tbWFuZHMubm90LnN1cHBvcnRlZC5pZi5zdG9yZXR5cGUuaXMuUEtDUzEyIiwKKyAgICAgICAgICAgICAgICAiXHU1OTgyXHU2NzlDIC1zdG9yZXR5cGUgXHU0RTNBIFBLQ1MxMiwgXHU1MjE5XHU0RTBEXHU2NTJGXHU2MzAxIC1rZXlwYXNzd2QgXHU1NDdEXHU0RUU0In0sCisgICAgICAgIHsiLmtleXBhc3MuYW5kLm5ldy5jYW4ubm90LmJlLnNwZWNpZmllZC5pZi5zdG9yZXR5cGUuaXMuezB9IiwKKyAgICAgICAgICAgICAgICAiXHU1OTgyXHU2NzlDIC1zdG9yZXR5cGUgXHU0RTNBIHswfSwgXHU1MjE5XHU0RTBEXHU4MEZEXHU2MzA3XHU1QjlBIC1rZXlwYXNzIFx1NTQ4QyAtbmV3In0sCisgICAgICAgIHsiaWYucHJvdGVjdGVkLmlzLnNwZWNpZmllZC50aGVuLnN0b3JlcGFzcy5rZXlwYXNzLmFuZC5uZXcubXVzdC5ub3QuYmUuc3BlY2lmaWVkIiwKKyAgICAgICAgICAgICAgICAiXHU1OTgyXHU2NzlDXHU2MzA3XHU1QjlBXHU0RTg2IC1wcm90ZWN0ZWQsIFx1NTIxOVx1NEUwRFx1ODBGRFx1NjMwN1x1NUI5QSAtc3RvcmVwYXNzLCAta2V5cGFzcyBcdTU0OEMgLW5ldyJ9LAorICAgICAgICB7ImlmLnNyY3Byb3RlY3RlZC5pcy5zcGVjaWZpZWQudGhlbi5zcmNzdG9yZXBhc3MuYW5kLnNyY2tleXBhc3MubXVzdC5ub3QuYmUuc3BlY2lmaWVkIiwKKyAgICAgICAgICAgICAgICAiXHU1OTgyXHU2NzlDXHU2MzA3XHU1QjlBXHU0RTg2IC1zcmNwcm90ZWN0ZWQsIFx1NTIxOVx1NEUwRFx1ODBGRFx1NjMwN1x1NUI5QSAtc3Jjc3RvcmVwYXNzIFx1NTQ4QyAtc3Jja2V5cGFzcyJ9LAorICAgICAgICB7ImlmLmtleXN0b3JlLmlzLm5vdC5wYXNzd29yZC5wcm90ZWN0ZWQudGhlbi5zdG9yZXBhc3Mua2V5cGFzcy5hbmQubmV3Lm11c3Qubm90LmJlLnNwZWNpZmllZCIsCisgICAgICAgICAgICAgICAgIlx1NTk4Mlx1Njc5Q1x1NUJDNlx1OTRBNVx1NUU5M1x1NjcyQVx1NTNEN1x1NTNFM1x1NEVFNFx1NEZERFx1NjJBNCwgXHU1MjE5XHU0RTBEXHU4MEZEXHU2MzA3XHU1QjlBIC1zdG9yZXBhc3MsIC1rZXlwYXNzIFx1NTQ4QyAtbmV3In0sCisgICAgICAgIHsiaWYuc291cmNlLmtleXN0b3JlLmlzLm5vdC5wYXNzd29yZC5wcm90ZWN0ZWQudGhlbi5zcmNzdG9yZXBhc3MuYW5kLnNyY2tleXBhc3MubXVzdC5ub3QuYmUuc3BlY2lmaWVkIiwKKyAgICAgICAgICAgICAgICAiXHU1OTgyXHU2NzlDXHU2RTkwXHU1QkM2XHU5NEE1XHU1RTkzXHU2NzJBXHU1M0Q3XHU1M0UzXHU0RUU0XHU0RkREXHU2MkE0LCBcdTUyMTlcdTRFMERcdTgwRkRcdTYzMDdcdTVCOUEgLXNyY3N0b3JlcGFzcyBcdTU0OEMgLXNyY2tleXBhc3MifSwKKyAgICAgICAgeyJJbGxlZ2FsLnN0YXJ0ZGF0ZS52YWx1ZSIsICJcdTk3NUVcdTZDRDVcdTVGMDBcdTU5Q0JcdTY1RTVcdTY3MUZcdTUwM0MifSwKKyAgICAgICAgeyJWYWxpZGl0eS5tdXN0LmJlLmdyZWF0ZXIudGhhbi56ZXJvIiwKKyAgICAgICAgICAgICAgICAiXHU2NzA5XHU2NTQ4XHU2NzFGXHU1RkM1XHU5ODdCXHU1OTI3XHU0RThFXHU5NkY2In0sCisgICAgICAgIHsicHJvdk5hbWUubm90LmEucHJvdmlkZXIiLCAiezB9XHU0RTBEXHU2NjJGXHU2M0QwXHU0RjlCXHU2NUI5In0sCisgICAgICAgIHsiVXNhZ2UuZXJyb3Iubm8uY29tbWFuZC5wcm92aWRlZCIsICJcdTc1MjhcdTZDRDVcdTk1MTlcdThCRUY6IFx1NkNBMVx1NjcwOVx1NjNEMFx1NEY5Qlx1NTQ3RFx1NEVFNCJ9LAorICAgICAgICB7IlNvdXJjZS5rZXlzdG9yZS5maWxlLmV4aXN0cy5idXQuaXMuZW1wdHkuIiwgIlx1NkU5MFx1NUJDNlx1OTRBNVx1NUU5M1x1NjU4N1x1NEVGNlx1NUI1OFx1NTcyOCwgXHU0RjQ2XHU0RTNBXHU3QTdBOiAifSwKKyAgICAgICAgeyJQbGVhc2Uuc3BlY2lmeS5zcmNrZXlzdG9yZSIsICJcdThCRjdcdTYzMDdcdTVCOUEgLXNyY2tleXN0b3JlIn0sCisgICAgICAgIHsiTXVzdC5ub3Quc3BlY2lmeS5ib3RoLnYuYW5kLnJmYy53aXRoLmxpc3QuY29tbWFuZCIsCisgICAgICAgICAgICAgICAgIidsaXN0JyBcdTU0N0RcdTRFRTRcdTRFMERcdTgwRkRcdTU0MENcdTY1RjZcdTYzMDdcdTVCOUEgLXYgXHU1M0NBIC1yZmMifSwKKyAgICAgICAgeyJLZXkucGFzc3dvcmQubXVzdC5iZS5hdC5sZWFzdC42LmNoYXJhY3RlcnMiLAorICAgICAgICAgICAgICAgICJcdTVCQzZcdTk0QTVcdTUzRTNcdTRFRTRcdTgxRjNcdTVDMTFcdTVGQzVcdTk4N0JcdTRFM0EgNiBcdTRFMkFcdTVCNTdcdTdCMjYifSwKKyAgICAgICAgeyJOZXcucGFzc3dvcmQubXVzdC5iZS5hdC5sZWFzdC42LmNoYXJhY3RlcnMiLAorICAgICAgICAgICAgICAgICJcdTY1QjBcdTUzRTNcdTRFRTRcdTgxRjNcdTVDMTFcdTVGQzVcdTk4N0JcdTRFM0EgNiBcdTRFMkFcdTVCNTdcdTdCMjYifSwKKyAgICAgICAgeyJLZXlzdG9yZS5maWxlLmV4aXN0cy5idXQuaXMuZW1wdHkuIiwKKyAgICAgICAgICAgICAgICAiXHU1QkM2XHU5NEE1XHU1RTkzXHU2NTg3XHU0RUY2XHU1QjU4XHU1NzI4LCBcdTRGNDZcdTRFM0FcdTdBN0E6ICJ9LAorICAgICAgICB7IktleXN0b3JlLmZpbGUuZG9lcy5ub3QuZXhpc3QuIiwKKyAgICAgICAgICAgICAgICAiXHU1QkM2XHU5NEE1XHU1RTkzXHU2NTg3XHU0RUY2XHU0RTBEXHU1QjU4XHU1NzI4OiAifSwKKyAgICAgICAgeyJNdXN0LnNwZWNpZnkuZGVzdGluYXRpb24uYWxpYXMiLCAiXHU1RkM1XHU5ODdCXHU2MzA3XHU1QjlBXHU3NkVFXHU2ODA3XHU1MjJCXHU1NDBEIn0sCisgICAgICAgIHsiTXVzdC5zcGVjaWZ5LmFsaWFzIiwgIlx1NUZDNVx1OTg3Qlx1NjMwN1x1NUI5QVx1NTIyQlx1NTQwRCJ9LAorICAgICAgICB7IktleXN0b3JlLnBhc3N3b3JkLm11c3QuYmUuYXQubGVhc3QuNi5jaGFyYWN0ZXJzIiwKKyAgICAgICAgICAgICAgICAiXHU1QkM2XHU5NEE1XHU1RTkzXHU1M0UzXHU0RUU0XHU4MUYzXHU1QzExXHU1RkM1XHU5ODdCXHU0RTNBIDYgXHU0RTJBXHU1QjU3XHU3QjI2In0sCisgICAgICAgIHsiRW50ZXIua2V5c3RvcmUucGFzc3dvcmQuIiwgIlx1OEY5M1x1NTE2NVx1NUJDNlx1OTRBNVx1NUU5M1x1NTNFM1x1NEVFNDogICJ9LAorICAgICAgICB7IkVudGVyLnNvdXJjZS5rZXlzdG9yZS5wYXNzd29yZC4iLCAiXHU4RjkzXHU1MTY1XHU2RTkwXHU1QkM2XHU5NEE1XHU1RTkzXHU1M0UzXHU0RUU0OiAgIn0sCisgICAgICAgIHsiRW50ZXIuZGVzdGluYXRpb24ua2V5c3RvcmUucGFzc3dvcmQuIiwgIlx1OEY5M1x1NTE2NVx1NzZFRVx1NjgwN1x1NUJDNlx1OTRBNVx1NUU5M1x1NTNFM1x1NEVFNDogICJ9LAorICAgICAgICB7IktleXN0b3JlLnBhc3N3b3JkLmlzLnRvby5zaG9ydC5tdXN0LmJlLmF0LmxlYXN0LjYuY2hhcmFjdGVycyIsCisgICAgICAgICAiXHU1QkM2XHU5NEE1XHU1RTkzXHU1M0UzXHU0RUU0XHU1OTJBXHU3N0VEIC0gXHU4MUYzXHU1QzExXHU1RkM1XHU5ODdCXHU0RTNBIDYgXHU0RTJBXHU1QjU3XHU3QjI2In0sCisgICAgICAgIHsiVW5rbm93bi5FbnRyeS5UeXBlIiwgIlx1NjcyQVx1NzdFNVx1Njc2MVx1NzZFRVx1N0M3Qlx1NTc4QiJ9LAorICAgICAgICB7IlRvby5tYW55LmZhaWx1cmVzLkFsaWFzLm5vdC5jaGFuZ2VkIiwgIlx1NjU0NVx1OTY5Q1x1NTkyQVx1NTkxQVx1MzAwMlx1NjcyQVx1NjZGNFx1NjUzOVx1NTIyQlx1NTQwRCJ9LAorICAgICAgICB7IkVudHJ5LmZvci5hbGlhcy5hbGlhcy5zdWNjZXNzZnVsbHkuaW1wb3J0ZWQuIiwKKyAgICAgICAgICAgICAgICAgIlx1NURGMlx1NjIxMFx1NTI5Rlx1NUJGQ1x1NTE2NVx1NTIyQlx1NTQwRCB7MH0gXHU3Njg0XHU2NzYxXHU3NkVFXHUzMDAyIn0sCisgICAgICAgIHsiRW50cnkuZm9yLmFsaWFzLmFsaWFzLm5vdC5pbXBvcnRlZC4iLCAiXHU2NzJBXHU1QkZDXHU1MTY1XHU1MjJCXHU1NDBEIHswfSBcdTc2ODRcdTY3NjFcdTc2RUVcdTMwMDIifSwKKyAgICAgICAgeyJQcm9ibGVtLmltcG9ydGluZy5lbnRyeS5mb3IuYWxpYXMuYWxpYXMuZXhjZXB0aW9uLkVudHJ5LmZvci5hbGlhcy5hbGlhcy5ub3QuaW1wb3J0ZWQuIiwKKyAgICAgICAgICAgICAgICAgIlx1NUJGQ1x1NTE2NVx1NTIyQlx1NTQwRCB7MH0gXHU3Njg0XHU2NzYxXHU3NkVFXHU2NUY2XHU1MUZBXHU3M0IwXHU5NUVFXHU5ODk4OiB7MX1cdTMwMDJcblx1NjcyQVx1NUJGQ1x1NTE2NVx1NTIyQlx1NTQwRCB7MH0gXHU3Njg0XHU2NzYxXHU3NkVFXHUzMDAyIn0sCisgICAgICAgIHsiSW1wb3J0LmNvbW1hbmQuY29tcGxldGVkLm9rLmVudHJpZXMuc3VjY2Vzc2Z1bGx5LmltcG9ydGVkLmZhaWwuZW50cmllcy5mYWlsZWQub3IuY2FuY2VsbGVkIiwKKyAgICAgICAgICAgICAgICAgIlx1NURGMlx1NUI4Q1x1NjIxMFx1NUJGQ1x1NTE2NVx1NTQ3RFx1NEVFNDogezB9IFx1NEUyQVx1Njc2MVx1NzZFRVx1NjIxMFx1NTI5Rlx1NUJGQ1x1NTE2NSwgezF9IFx1NEUyQVx1Njc2MVx1NzZFRVx1NTkzMVx1OEQyNVx1NjIxNlx1NTNENlx1NkQ4OCJ9LAorICAgICAgICB7Ildhcm5pbmcuT3ZlcndyaXRpbmcuZXhpc3RpbmcuYWxpYXMuYWxpYXMuaW4uZGVzdGluYXRpb24ua2V5c3RvcmUiLAorICAgICAgICAgICAgICAgICAiXHU4QjY2XHU1NDRBOiBcdTZCNjNcdTU3MjhcdTg5ODZcdTc2RDZcdTc2RUVcdTY4MDdcdTVCQzZcdTk0QTVcdTVFOTNcdTRFMkRcdTc2ODRcdTczQjBcdTY3MDlcdTUyMkJcdTU0MEQgezB9In0sCisgICAgICAgIHsiRXhpc3RpbmcuZW50cnkuYWxpYXMuYWxpYXMuZXhpc3RzLm92ZXJ3cml0ZS5uby4iLAorICAgICAgICAgICAgICAgICAiXHU1QjU4XHU1NzI4XHU3M0IwXHU2NzA5XHU2NzYxXHU3NkVFXHU1MjJCXHU1NDBEIHswfSwgXHU2NjJGXHU1NDI2XHU4OTg2XHU3NkQ2PyBbbm9dOiAgIn0sCisgICAgICAgIHsiVG9vLm1hbnkuZmFpbHVyZXMudHJ5LmxhdGVyIiwgIlx1NjU0NVx1OTY5Q1x1NTkyQVx1NTkxQSAtIFx1OEJGN1x1N0EwRFx1NTQwRVx1NTE4RFx1OEJENSJ9LAorICAgICAgICB7IkNlcnRpZmljYXRpb24ucmVxdWVzdC5zdG9yZWQuaW4uZmlsZS5maWxlbmFtZS4iLAorICAgICAgICAgICAgICAgICJcdTVCNThcdTUwQThcdTU3MjhcdTY1ODdcdTRFRjYgPHswfT4gXHU0RTJEXHU3Njg0XHU4QkE0XHU4QkMxXHU4QkY3XHU2QzQyIn0sCisgICAgICAgIHsiU3VibWl0LnRoaXMudG8ueW91ci5DQSIsICJcdTVDMDZcdTZCNjRcdTYzRDBcdTRFQTRcdTdFRDlcdTYwQThcdTc2ODQgQ0EifSwKKyAgICAgICAgeyJpZi5hbGlhcy5ub3Quc3BlY2lmaWVkLmRlc3RhbGlhcy5zcmNrZXlwYXNzLmFuZC5kZXN0a2V5cGFzcy5tdXN0Lm5vdC5iZS5zcGVjaWZpZWQiLAorICAgICAgICAgICAgIlx1NTk4Mlx1Njc5Q1x1NkNBMVx1NjcwOVx1NjMwN1x1NUI5QVx1NTIyQlx1NTQwRCwgXHU1MjE5XHU0RTBEXHU4MEZEXHU2MzA3XHU1QjlBXHU3NkVFXHU2ODA3XHU1MjJCXHU1NDBELCBcdTZFOTBcdTVCQzZcdTk0QTVcdTVFOTNcdTUzRTNcdTRFRTRcdTU0OENcdTc2RUVcdTY4MDdcdTVCQzZcdTk0QTVcdTVFOTNcdTUzRTNcdTRFRTQifSwKKyAgICAgICAgeyJDZXJ0aWZpY2F0ZS5zdG9yZWQuaW4uZmlsZS5maWxlbmFtZS4iLAorICAgICAgICAgICAgICAgICJcdTVCNThcdTUwQThcdTU3MjhcdTY1ODdcdTRFRjYgPHswfT4gXHU0RTJEXHU3Njg0XHU4QkMxXHU0RTY2In0sCisgICAgICAgIHsiQ2VydGlmaWNhdGUucmVwbHkud2FzLmluc3RhbGxlZC5pbi5rZXlzdG9yZSIsCisgICAgICAgICAgICAgICAgIlx1OEJDMVx1NEU2Nlx1NTZERVx1NTkwRFx1NURGMlx1NUI4OVx1ODhDNVx1NTcyOFx1NUJDNlx1OTRBNVx1NUU5M1x1NEUyRCJ9LAorICAgICAgICB7IkNlcnRpZmljYXRlLnJlcGx5Lndhcy5ub3QuaW5zdGFsbGVkLmluLmtleXN0b3JlIiwKKyAgICAgICAgICAgICAgICAiXHU4QkMxXHU0RTY2XHU1NkRFXHU1OTBEXHU2NzJBXHU1Qjg5XHU4OEM1XHU1NzI4XHU1QkM2XHU5NEE1XHU1RTkzXHU0RTJEIn0sCisgICAgICAgIHsiQ2VydGlmaWNhdGUud2FzLmFkZGVkLnRvLmtleXN0b3JlIiwKKyAgICAgICAgICAgICAgICAiXHU4QkMxXHU0RTY2XHU1REYyXHU2REZCXHU1MkEwXHU1MjMwXHU1QkM2XHU5NEE1XHU1RTkzXHU0RTJEIn0sCisgICAgICAgIHsiQ2VydGlmaWNhdGUud2FzLm5vdC5hZGRlZC50by5rZXlzdG9yZSIsCisgICAgICAgICAgICAgICAgIlx1OEJDMVx1NEU2Nlx1NjcyQVx1NkRGQlx1NTJBMFx1NTIzMFx1NUJDNlx1OTRBNVx1NUU5M1x1NEUyRCJ9LAorICAgICAgICB7Ii5TdG9yaW5nLmtzZm5hbWUuIiwgIltcdTZCNjNcdTU3MjhcdTVCNThcdTUwQTh7MH1dIn0sCisgICAgICAgIHsiYWxpYXMuaGFzLm5vLnB1YmxpYy5rZXkuY2VydGlmaWNhdGUuIiwKKyAgICAgICAgICAgICAgICAiezB9XHU2Q0ExXHU2NzA5XHU1MTZDXHU1MTcxXHU1QkM2XHU5NEE1IChcdThCQzFcdTRFNjYpIn0sCisgICAgICAgIHsiQ2Fubm90LmRlcml2ZS5zaWduYXR1cmUuYWxnb3JpdGhtIiwKKyAgICAgICAgICAgICAgICAiXHU2NUUwXHU2Q0Q1XHU2RDNFXHU3NTFGXHU3QjdFXHU1NDBEXHU3Qjk3XHU2Q0Q1In0sCisgICAgICAgIHsiQWxpYXMuYWxpYXMuZG9lcy5ub3QuZXhpc3QiLAorICAgICAgICAgICAgICAgICJcdTUyMkJcdTU0MEQgPHswfT4gXHU0RTBEXHU1QjU4XHU1NzI4In0sCisgICAgICAgIHsiQWxpYXMuYWxpYXMuaGFzLm5vLmNlcnRpZmljYXRlIiwKKyAgICAgICAgICAgICAgICAiXHU1MjJCXHU1NDBEIDx7MH0+IFx1NkNBMVx1NjcwOVx1OEJDMVx1NEU2NiJ9LAorICAgICAgICB7IktleS5wYWlyLm5vdC5nZW5lcmF0ZWQuYWxpYXMuYWxpYXMuYWxyZWFkeS5leGlzdHMiLAorICAgICAgICAgICAgICAgICJcdTY3MkFcdTc1MUZcdTYyMTBcdTVCQzZcdTk0QTVcdTVCRjksIFx1NTIyQlx1NTQwRCA8ezB9PiBcdTVERjJcdTdFQ0ZcdTVCNThcdTU3MjgifSwKKyAgICAgICAgeyJHZW5lcmF0aW5nLmtleXNpemUuYml0LmtleUFsZ05hbWUua2V5LnBhaXIuYW5kLnNlbGYuc2lnbmVkLmNlcnRpZmljYXRlLnNpZ0FsZ05hbWUud2l0aC5hLnZhbGlkaXR5Lm9mLnZhbGlkYWxpdHkuZGF5cy5mb3IiLAorICAgICAgICAgICAgICAgICJcdTZCNjNcdTU3MjhcdTRFM0FcdTRFRTVcdTRFMEJcdTVCRjlcdThDNjFcdTc1MUZcdTYyMTAgezB9IFx1NEY0RHsxfVx1NUJDNlx1OTRBNVx1NUJGOVx1NTQ4Q1x1ODFFQVx1N0I3RVx1NTQwRFx1OEJDMVx1NEU2NiAoezJ9KSAoXHU2NzA5XHU2NTQ4XHU2NzFGXHU0RTNBIHszfSBcdTU5MjkpOlxuXHQgezR9In0sCisgICAgICAgIHsiRW50ZXIua2V5LnBhc3N3b3JkLmZvci5hbGlhcy4iLCAiXHU4RjkzXHU1MTY1IDx7MH0+IFx1NzY4NFx1NUJDNlx1OTRBNVx1NTNFM1x1NEVFNCJ9LAorICAgICAgICB7Ii5SRVRVUk4uaWYuc2FtZS5hcy5rZXlzdG9yZS5wYXNzd29yZC4iLAorICAgICAgICAgICAgICAgICJcdChcdTU5ODJcdTY3OUNcdTU0OENcdTVCQzZcdTk0QTVcdTVFOTNcdTUzRTNcdTRFRTRcdTc2RjhcdTU0MEMsIFx1NjMwOVx1NTZERVx1OEY2Nik6ICAifSwKKyAgICAgICAgeyJLZXkucGFzc3dvcmQuaXMudG9vLnNob3J0Lm11c3QuYmUuYXQubGVhc3QuNi5jaGFyYWN0ZXJzIiwKKyAgICAgICAgICAgICAgICAiXHU1QkM2XHU5NEE1XHU1M0UzXHU0RUU0XHU1OTJBXHU3N0VEIC0gXHU4MUYzXHU1QzExXHU1RkM1XHU5ODdCXHU0RTNBIDYgXHU0RTJBXHU1QjU3XHU3QjI2In0sCisgICAgICAgIHsiVG9vLm1hbnkuZmFpbHVyZXMua2V5Lm5vdC5hZGRlZC50by5rZXlzdG9yZSIsCisgICAgICAgICAgICAgICAgIlx1NjU0NVx1OTY5Q1x1NTkyQVx1NTkxQSAtIFx1NUJDNlx1OTRBNVx1NjcyQVx1NkRGQlx1NTJBMFx1NTIzMFx1NUJDNlx1OTRBNVx1NUU5M1x1NEUyRCJ9LAorICAgICAgICB7IkRlc3RpbmF0aW9uLmFsaWFzLmRlc3QuYWxyZWFkeS5leGlzdHMiLAorICAgICAgICAgICAgICAgICJcdTc2RUVcdTY4MDdcdTUyMkJcdTU0MEQgPHswfT4gXHU1REYyXHU3RUNGXHU1QjU4XHU1NzI4In0sCisgICAgICAgIHsiUGFzc3dvcmQuaXMudG9vLnNob3J0Lm11c3QuYmUuYXQubGVhc3QuNi5jaGFyYWN0ZXJzIiwKKyAgICAgICAgICAgICAgICAiXHU1M0UzXHU0RUU0XHU1OTJBXHU3N0VEIC0gXHU4MUYzXHU1QzExXHU1RkM1XHU5ODdCXHU0RTNBIDYgXHU0RTJBXHU1QjU3XHU3QjI2In0sCisgICAgICAgIHsiVG9vLm1hbnkuZmFpbHVyZXMuS2V5LmVudHJ5Lm5vdC5jbG9uZWQiLAorICAgICAgICAgICAgICAgICJcdTY1NDVcdTk2OUNcdTU5MkFcdTU5MUFcdTMwMDJcdTY3MkFcdTUxNEJcdTk2ODZcdTVCQzZcdTk0QTVcdTY3NjFcdTc2RUUifSwKKyAgICAgICAgeyJrZXkucGFzc3dvcmQuZm9yLmFsaWFzLiIsICI8ezB9PiBcdTc2ODRcdTVCQzZcdTk0QTVcdTUzRTNcdTRFRTQifSwKKyAgICAgICAgeyJLZXlzdG9yZS5lbnRyeS5mb3IuaWQuZ2V0TmFtZS5hbHJlYWR5LmV4aXN0cyIsCisgICAgICAgICAgICAgICAgIjx7MH0+IFx1NzY4NFx1NUJDNlx1OTRBNVx1NUU5M1x1Njc2MVx1NzZFRVx1NURGMlx1N0VDRlx1NUI1OFx1NTcyOCJ9LAorICAgICAgICB7IkNyZWF0aW5nLmtleXN0b3JlLmVudHJ5LmZvci5pZC5nZXROYW1lLiIsCisgICAgICAgICAgICAgICAgIlx1NkI2M1x1NTcyOFx1NTIxQlx1NUVGQSA8ezB9PiBcdTc2ODRcdTVCQzZcdTk0QTVcdTVFOTNcdTY3NjFcdTc2RUUuLi4ifSwKKyAgICAgICAgeyJOby5lbnRyaWVzLmZyb20uaWRlbnRpdHkuZGF0YWJhc2UuYWRkZWQiLAorICAgICAgICAgICAgICAgICJcdTY3MkFcdTRFQ0VcdThFQUJcdTRFRkRcdTY1NzBcdTYzNkVcdTVFOTNcdTRFMkRcdTZERkJcdTUyQTBcdTRFRkJcdTRGNTVcdTY3NjFcdTc2RUUifSwKKyAgICAgICAgeyJBbGlhcy5uYW1lLmFsaWFzIiwgIlx1NTIyQlx1NTQwRDogezB9In0sCisgICAgICAgIHsiQ3JlYXRpb24uZGF0ZS5rZXlTdG9yZS5nZXRDcmVhdGlvbkRhdGUuYWxpYXMuIiwKKyAgICAgICAgICAgICAgICAiXHU1MjFCXHU1RUZBXHU2NUU1XHU2NzFGOiB7MCxkYXRlfSJ9LAorICAgICAgICB7ImFsaWFzLmtleVN0b3JlLmdldENyZWF0aW9uRGF0ZS5hbGlhcy4iLAorICAgICAgICAgICAgICAgICJ7MH0sIHsxLGRhdGV9LCAifSwKKyAgICAgICAgeyJhbGlhcy4iLCAiezB9LCAifSwKKyAgICAgICAgeyJFbnRyeS50eXBlLnR5cGUuIiwgIlx1Njc2MVx1NzZFRVx1N0M3Qlx1NTc4QjogezB9In0sCisgICAgICAgIHsiQ2VydGlmaWNhdGUuY2hhaW4ubGVuZ3RoLiIsICJcdThCQzFcdTRFNjZcdTk0RkVcdTk1N0ZcdTVFQTY6ICJ9LAorICAgICAgICB7IkNlcnRpZmljYXRlLmkuMS4iLCAiXHU4QkMxXHU0RTY2W3swLG51bWJlcixpbnRlZ2VyfV06In0sCisgICAgICAgIHsiQ2VydGlmaWNhdGUuZmluZ2VycHJpbnQuU0hBMS4iLCAiXHU4QkMxXHU0RTY2XHU2MzA3XHU3RUI5IChTSEExKTogIn0sCisgICAgICAgIHsiS2V5c3RvcmUudHlwZS4iLCAiXHU1QkM2XHU5NEE1XHU1RTkzXHU3QzdCXHU1NzhCOiAifSwKKyAgICAgICAgeyJLZXlzdG9yZS5wcm92aWRlci4iLCAiXHU1QkM2XHU5NEE1XHU1RTkzXHU2M0QwXHU0RjlCXHU2NUI5OiAifSwKKyAgICAgICAgeyJZb3VyLmtleXN0b3JlLmNvbnRhaW5zLmtleVN0b3JlLnNpemUuZW50cnkiLAorICAgICAgICAgICAgICAgICJcdTYwQThcdTc2ODRcdTVCQzZcdTk0QTVcdTVFOTNcdTUzMDVcdTU0MkIgezAsbnVtYmVyLGludGVnZXJ9IFx1NEUyQVx1Njc2MVx1NzZFRSJ9LAorICAgICAgICB7IllvdXIua2V5c3RvcmUuY29udGFpbnMua2V5U3RvcmUuc2l6ZS5lbnRyaWVzIiwKKyAgICAgICAgICAgICAgICAiXHU2MEE4XHU3Njg0XHU1QkM2XHU5NEE1XHU1RTkzXHU1MzA1XHU1NDJCIHswLG51bWJlcixpbnRlZ2VyfSBcdTRFMkFcdTY3NjFcdTc2RUUifSwKKyAgICAgICAgeyJGYWlsZWQudG8ucGFyc2UuaW5wdXQiLCAiXHU2NUUwXHU2Q0Q1XHU1QkY5XHU4RjkzXHU1MTY1XHU4RkRCXHU4ODRDXHU4QkVEXHU2Q0Q1XHU1MjA2XHU2NzkwIn0sCisgICAgICAgIHsiRW1wdHkuaW5wdXQiLCAiXHU3QTdBXHU4RjkzXHU1MTY1In0sCisgICAgICAgIHsiTm90LlguNTA5LmNlcnRpZmljYXRlIiwgIlx1OTc1RSBYLjUwOSBcdThCQzFcdTRFNjYifSwKKyAgICAgICAgeyJhbGlhcy5oYXMubm8ucHVibGljLmtleSIsICJ7MH1cdTZDQTFcdTY3MDlcdTUxNkNcdTUxNzFcdTVCQzZcdTk0QTUifSwKKyAgICAgICAgeyJhbGlhcy5oYXMubm8uWC41MDkuY2VydGlmaWNhdGUiLCAiezB9XHU2Q0ExXHU2NzA5IFguNTA5IFx1OEJDMVx1NEU2NiJ9LAorICAgICAgICB7Ik5ldy5jZXJ0aWZpY2F0ZS5zZWxmLnNpZ25lZC4iLCAiXHU2NUIwXHU4QkMxXHU0RTY2IChcdTgxRUFcdTdCN0VcdTU0MEQpOiJ9LAorICAgICAgICB7IlJlcGx5Lmhhcy5uby5jZXJ0aWZpY2F0ZXMiLCAiXHU1NkRFXHU1OTBEXHU0RTJEXHU2Q0ExXHU2NzA5XHU4QkMxXHU0RTY2In0sCisgICAgICAgIHsiQ2VydGlmaWNhdGUubm90LmltcG9ydGVkLmFsaWFzLmFsaWFzLmFscmVhZHkuZXhpc3RzIiwKKyAgICAgICAgICAgICAgICAiXHU4QkMxXHU0RTY2XHU2NzJBXHU1QkZDXHU1MTY1LCBcdTUyMkJcdTU0MEQgPHswfT4gXHU1REYyXHU3RUNGXHU1QjU4XHU1NzI4In0sCisgICAgICAgIHsiSW5wdXQubm90LmFuLlguNTA5LmNlcnRpZmljYXRlIiwgIlx1NjI0MFx1OEY5M1x1NTE2NVx1NzY4NFx1NEUwRFx1NjYyRiBYLjUwOSBcdThCQzFcdTRFNjYifSwKKyAgICAgICAgeyJDZXJ0aWZpY2F0ZS5hbHJlYWR5LmV4aXN0cy5pbi5rZXlzdG9yZS51bmRlci5hbGlhcy50cnVzdGFsaWFzLiIsCisgICAgICAgICAgICAgICAgIlx1NTcyOFx1NTIyQlx1NTQwRCA8ezB9PiBcdTRFNEJcdTRFMEIsIFx1OEJDMVx1NEU2Nlx1NURGMlx1N0VDRlx1NUI1OFx1NTcyOFx1NEU4RVx1NUJDNlx1OTRBNVx1NUU5M1x1NEUyRCJ9LAorICAgICAgICB7IkRvLnlvdS5zdGlsbC53YW50LnRvLmFkZC5pdC5uby4iLAorICAgICAgICAgICAgICAgICJcdTY2MkZcdTU0MjZcdTRFQ0RcdTg5ODFcdTZERkJcdTUyQTA/IFtub106ICAifSwKKyAgICAgICAgeyJDZXJ0aWZpY2F0ZS5hbHJlYWR5LmV4aXN0cy5pbi5zeXN0ZW0ud2lkZS5DQS5rZXlzdG9yZS51bmRlci5hbGlhcy50cnVzdGFsaWFzLiIsCisgICAgICAgICAgICAgICAgIlx1NTcyOFx1NTIyQlx1NTQwRCA8ezB9PiBcdTRFNEJcdTRFMEIsIFx1OEJDMVx1NEU2Nlx1NURGMlx1N0VDRlx1NUI1OFx1NTcyOFx1NEU4RVx1N0NGQlx1N0VERlx1ODMwM1x1NTZGNFx1NzY4NCBDQSBcdTVCQzZcdTk0QTVcdTVFOTNcdTRFMkQifSwKKyAgICAgICAgeyJEby55b3Uuc3RpbGwud2FudC50by5hZGQuaXQudG8ueW91ci5vd24ua2V5c3RvcmUubm8uIiwKKyAgICAgICAgICAgICAgICAiXHU2NjJGXHU1NDI2XHU0RUNEXHU4OTgxXHU1QzA2XHU1QjgzXHU2REZCXHU1MkEwXHU1MjMwXHU4MUVBXHU1REYxXHU3Njg0XHU1QkM2XHU5NEE1XHU1RTkzPyBbbm9dOiAgIn0sCisgICAgICAgIHsiVHJ1c3QudGhpcy5jZXJ0aWZpY2F0ZS5uby4iLCAiXHU2NjJGXHU1NDI2XHU0RkUxXHU0RUZCXHU2QjY0XHU4QkMxXHU0RTY2PyBbbm9dOiAgIn0sCisgICAgICAgIHsiWUVTIiwgIlx1NjYyRiJ9LAorICAgICAgICB7Ik5ldy5wcm9tcHQuIiwgIlx1NjVCMHswfTogIn0sCisgICAgICAgIHsiUGFzc3dvcmRzLm11c3QuZGlmZmVyIiwgIlx1NTNFM1x1NEVFNFx1NEUwRFx1ODBGRFx1NzZGOFx1NTQwQyJ9LAorICAgICAgICB7IlJlLmVudGVyLm5ldy5wcm9tcHQuIiwgIlx1OTFDRFx1NjVCMFx1OEY5M1x1NTE2NVx1NjVCMHswfTogIn0sCisgICAgICAgIHsiUmUuZW50ZXIubmV3LnBhc3N3b3JkLiIsICJcdTUxOERcdTZCMjFcdThGOTNcdTUxNjVcdTY1QjBcdTUzRTNcdTRFRTQ6ICJ9LAorICAgICAgICB7IlRoZXkuZG9uLnQubWF0Y2guVHJ5LmFnYWluIiwgIlx1NUI4M1x1NEVFQ1x1NEUwRFx1NTMzOVx1OTE0RFx1MzAwMlx1OEJGN1x1OTFDRFx1OEJENSJ9LAorICAgICAgICB7IkVudGVyLnByb21wdC5hbGlhcy5uYW1lLiIsICJcdThGOTNcdTUxNjV7MH1cdTUyMkJcdTU0MEQ6ICAifSwKKyAgICAgICAgeyJFbnRlci5uZXcuYWxpYXMubmFtZS5SRVRVUk4udG8uY2FuY2VsLmltcG9ydC5mb3IudGhpcy5lbnRyeS4iLAorICAgICAgICAgICAgICAgICAiXHU4RjkzXHU1MTY1XHU2NUIwXHU3Njg0XHU1MjJCXHU1NDBEXHQoXHU2MzA5XHU1NkRFXHU4RjY2XHU0RUU1XHU1M0Q2XHU2RDg4XHU1QkY5XHU2QjY0XHU2NzYxXHU3NkVFXHU3Njg0XHU1QkZDXHU1MTY1KTogICJ9LAorICAgICAgICB7IkVudGVyLmFsaWFzLm5hbWUuIiwgIlx1OEY5M1x1NTE2NVx1NTIyQlx1NTQwRDogICJ9LAorICAgICAgICB7Ii5SRVRVUk4uaWYuc2FtZS5hcy5mb3Iub3RoZXJBbGlhcy4iLAorICAgICAgICAgICAgICAgICJcdChcdTU5ODJcdTY3OUNcdTU0OEMgPHswfT4gXHU3NkY4XHU1NDBDLCBcdTUyMTlcdTYzMDlcdTU2REVcdThGNjYpIn0sCisgICAgICAgIHsiLlBBVFRFUk4ucHJpbnRYNTA5Q2VydCIsCisgICAgICAgICAgICAgICAgIlx1NjI0MFx1NjcwOVx1ODAwNTogezB9XG5cdTUzRDFcdTVFMDNcdTgwMDU6IHsxfVxuXHU1RThGXHU1MjE3XHU1M0Y3OiB7Mn1cblx1NjcwOVx1NjU0OFx1NjcxRlx1NUYwMFx1NTlDQlx1NjVFNVx1NjcxRjogezN9LCBcdTYyMkFcdTZCNjJcdTY1RTVcdTY3MUY6IHs0fVxuXHU4QkMxXHU0RTY2XHU2MzA3XHU3RUI5OlxuXHQgTUQ1OiB7NX1cblx0IFNIQTE6IHs2fVxuXHQgU0hBMjU2OiB7N31cblx0IFx1N0I3RVx1NTQwRFx1N0I5N1x1NkNENVx1NTQwRFx1NzlGMDogezh9XG5cdCBcdTcyNDhcdTY3MkM6IHs5fSJ9LAorICAgICAgICB7IldoYXQuaXMueW91ci5maXJzdC5hbmQubGFzdC5uYW1lLiIsCisgICAgICAgICAgICAgICAgIlx1NjBBOFx1NzY4NFx1NTQwRFx1NUI1N1x1NEUwRVx1NTlEM1x1NkMwRlx1NjYyRlx1NEVDMFx1NEU0OD8ifSwKKyAgICAgICAgeyJXaGF0LmlzLnRoZS5uYW1lLm9mLnlvdXIub3JnYW5pemF0aW9uYWwudW5pdC4iLAorICAgICAgICAgICAgICAgICJcdTYwQThcdTc2ODRcdTdFQzRcdTdFQzdcdTUzNTVcdTRGNERcdTU0MERcdTc5RjBcdTY2MkZcdTRFQzBcdTRFNDg/In0sCisgICAgICAgIHsiV2hhdC5pcy50aGUubmFtZS5vZi55b3VyLm9yZ2FuaXphdGlvbi4iLAorICAgICAgICAgICAgICAgICJcdTYwQThcdTc2ODRcdTdFQzRcdTdFQzdcdTU0MERcdTc5RjBcdTY2MkZcdTRFQzBcdTRFNDg/In0sCisgICAgICAgIHsiV2hhdC5pcy50aGUubmFtZS5vZi55b3VyLkNpdHkub3IuTG9jYWxpdHkuIiwKKyAgICAgICAgICAgICAgICAiXHU2MEE4XHU2MjQwXHU1NzI4XHU3Njg0XHU1N0NFXHU1RTAyXHU2MjE2XHU1MzNBXHU1N0RGXHU1NDBEXHU3OUYwXHU2NjJGXHU0RUMwXHU0RTQ4PyJ9LAorICAgICAgICB7IldoYXQuaXMudGhlLm5hbWUub2YueW91ci5TdGF0ZS5vci5Qcm92aW5jZS4iLAorICAgICAgICAgICAgICAgICJcdTYwQThcdTYyNDBcdTU3MjhcdTc2ODRcdTc3MDEvXHU1RTAyL1x1ODFFQVx1NkNCQlx1NTMzQVx1NTQwRFx1NzlGMFx1NjYyRlx1NEVDMFx1NEU0OD8ifSwKKyAgICAgICAgeyJXaGF0LmlzLnRoZS50d28ubGV0dGVyLmNvdW50cnkuY29kZS5mb3IudGhpcy51bml0LiIsCisgICAgICAgICAgICAgICAgIlx1OEJFNVx1NTM1NVx1NEY0RFx1NzY4NFx1NTNDQ1x1NUI1N1x1NkJDRFx1NTZGRFx1NUJCNi9cdTU3MzBcdTUzM0FcdTRFRTNcdTc4MDFcdTY2MkZcdTRFQzBcdTRFNDg/In0sCisgICAgICAgIHsiSXMubmFtZS5jb3JyZWN0LiIsICJ7MH1cdTY2MkZcdTU0MjZcdTZCNjNcdTc4NkU/In0sCisgICAgICAgIHsibm8iLCAiXHU1NDI2In0sCisgICAgICAgIHsieWVzIiwgIlx1NjYyRiJ9LAorICAgICAgICB7InkiLCAieSJ9LAorICAgICAgICB7Ii5kZWZhdWx0VmFsdWUuIiwgIiAgW3swfV06ICAifSwKKyAgICAgICAgeyJBbGlhcy5hbGlhcy5oYXMubm8ua2V5IiwKKyAgICAgICAgICAgICAgICAiXHU1MjJCXHU1NDBEIDx7MH0+IFx1NkNBMVx1NjcwOVx1NUJDNlx1OTRBNSJ9LAorICAgICAgICB7IkFsaWFzLmFsaWFzLnJlZmVyZW5jZXMuYW4uZW50cnkudHlwZS50aGF0LmlzLm5vdC5hLnByaXZhdGUua2V5LmVudHJ5LlRoZS5rZXljbG9uZS5jb21tYW5kLm9ubHkuc3VwcG9ydHMuY2xvbmluZy5vZi5wcml2YXRlLmtleSIsCisgICAgICAgICAgICAgICAgICJcdTUyMkJcdTU0MEQgPHswfT4gXHU1RjE1XHU3NTI4XHU0RTg2XHU0RTBEXHU1QzVFXHU0RThFXHU3OUMxXHU2NzA5XHU1QkM2XHU5NEE1XHU2NzYxXHU3NkVFXHU3Njg0XHU2NzYxXHU3NkVFXHU3QzdCXHU1NzhCXHUzMDAyLWtleWNsb25lIFx1NTQ3RFx1NEVFNFx1NEVDNVx1NjUyRlx1NjMwMVx1NUJGOVx1NzlDMVx1NjcwOVx1NUJDNlx1OTRBNVx1Njc2MVx1NzZFRVx1NzY4NFx1NTE0Qlx1OTY4NiJ9LAorCisgICAgICAgIHsiLldBUk5JTkcuV0FSTklORy5XQVJOSU5HLiIsCisgICAgICAgICAgICAiKioqKioqKioqKioqKioqKiogIFx1OEI2Nlx1NTQ0QSBcdThCNjZcdTU0NEEgXHU4QjY2XHU1NDRBICAqKioqKioqKioqKioqKioqKiJ9LAorICAgICAgICB7IlNpZ25lci5kLiIsICJcdTdCN0VcdTU0MERcdTgwMDUgIyVkOiJ9LAorICAgICAgICB7IlRpbWVzdGFtcC4iLCAiXHU2NUY2XHU5NUY0XHU2MjMzOiJ9LAorICAgICAgICB7IlNpZ25hdHVyZS4iLCAiXHU3QjdFXHU1NDBEOiJ9LAorICAgICAgICB7IkNSTHMuIiwgIkNSTDoifSwKKyAgICAgICAgeyJDZXJ0aWZpY2F0ZS5vd25lci4iLCAiXHU4QkMxXHU0RTY2XHU2MjQwXHU2NzA5XHU4MDA1OiAifSwKKyAgICAgICAgeyJOb3QuYS5zaWduZWQuamFyLmZpbGUiLCAiXHU0RTBEXHU2NjJGXHU1REYyXHU3QjdFXHU1NDBEXHU3Njg0IGphciBcdTY1ODdcdTRFRjYifSwKKyAgICAgICAgeyJOby5jZXJ0aWZpY2F0ZS5mcm9tLnRoZS5TU0wuc2VydmVyIiwKKyAgICAgICAgICAgICAgICAiXHU2Q0ExXHU2NzA5XHU2NzY1XHU4MUVBIFNTTCBcdTY3MERcdTUyQTFcdTU2NjhcdTc2ODRcdThCQzFcdTRFNjYifSwKKworICAgICAgICB7Ii5UaGUuaW50ZWdyaXR5Lm9mLnRoZS5pbmZvcm1hdGlvbi5zdG9yZWQuaW4ueW91ci5rZXlzdG9yZS4iLAorICAgICAgICAgICAgIiogXHU1QjU4XHU1MEE4XHU1NzI4XHU2MEE4XHU3Njg0XHU1QkM2XHU5NEE1XHU1RTkzXHU0RTJEXHU3Njg0XHU0RkUxXHU2MDZGXHU3Njg0XHU1QjhDXHU2NTc0XHU2MDI3ICAqXG4qIFx1NUMxQVx1NjcyQVx1N0VDRlx1OEZDN1x1OUE4Q1x1OEJDMSEgIFx1NEUzQVx1NEU4Nlx1OUE4Q1x1OEJDMVx1NTE3Nlx1NUI4Q1x1NjU3NFx1NjAyNywgKlxuKiBcdTVGQzVcdTk4N0JcdTYzRDBcdTRGOUJcdTVCQzZcdTk0QTVcdTVFOTNcdTUzRTNcdTRFRTRcdTMwMDIgICAgICAgICAgICAgICAgICAqIn0sCisgICAgICAgIHsiLlRoZS5pbnRlZ3JpdHkub2YudGhlLmluZm9ybWF0aW9uLnN0b3JlZC5pbi50aGUuc3Jja2V5c3RvcmUuIiwKKyAgICAgICAgICAgICIqIFx1NUI1OFx1NTBBOFx1NTcyOCBzcmNrZXlzdG9yZSBcdTRFMkRcdTc2ODRcdTRGRTFcdTYwNkZcdTc2ODRcdTVCOENcdTY1NzRcdTYwMjcqXG4qIFx1NUMxQVx1NjcyQVx1N0VDRlx1OEZDN1x1OUE4Q1x1OEJDMSEgIFx1NEUzQVx1NEU4Nlx1OUE4Q1x1OEJDMVx1NTE3Nlx1NUI4Q1x1NjU3NFx1NjAyNywgKlxuKiBcdTVGQzVcdTk4N0JcdTYzRDBcdTRGOUJcdTZFOTBcdTVCQzZcdTk0QTVcdTVFOTNcdTUzRTNcdTRFRTRcdTMwMDIgICAgICAgICAgICAgICAgICAqIn0sCisKKyAgICAgICAgeyJDZXJ0aWZpY2F0ZS5yZXBseS5kb2VzLm5vdC5jb250YWluLnB1YmxpYy5rZXkuZm9yLmFsaWFzLiIsCisgICAgICAgICAgICAgICAgIlx1OEJDMVx1NEU2Nlx1NTZERVx1NTkwRFx1NEUyRFx1NEUwRFx1NTMwNVx1NTQyQiA8ezB9PiBcdTc2ODRcdTUxNkNcdTUxNzFcdTVCQzZcdTk0QTUifSwKKyAgICAgICAgeyJJbmNvbXBsZXRlLmNlcnRpZmljYXRlLmNoYWluLmluLnJlcGx5IiwKKyAgICAgICAgICAgICAgICAiXHU1NkRFXHU1OTBEXHU0RTJEXHU3Njg0XHU4QkMxXHU0RTY2XHU5NEZFXHU0RTBEXHU1QjhDXHU2NTc0In0sCisgICAgICAgIHsiQ2VydGlmaWNhdGUuY2hhaW4uaW4ucmVwbHkuZG9lcy5ub3QudmVyaWZ5LiIsCisgICAgICAgICAgICAgICAgIlx1NTZERVx1NTkwRFx1NEUyRFx1NzY4NFx1OEJDMVx1NEU2Nlx1OTRGRVx1NjcyQVx1OUE4Q1x1OEJDMTogIn0sCisgICAgICAgIHsiVG9wLmxldmVsLmNlcnRpZmljYXRlLmluLnJlcGx5LiIsCisgICAgICAgICAgICAgICAgIlx1NTZERVx1NTkwRFx1NEUyRFx1NzY4NFx1OTg3Nlx1N0VBN1x1OEJDMVx1NEU2NjpcbiJ9LAorICAgICAgICB7Ii5pcy5ub3QudHJ1c3RlZC4iLCAiLi4uIFx1NjYyRlx1NEUwRFx1NTNFRlx1NEZFMVx1NzY4NFx1MzAwMiJ9LAorICAgICAgICB7Ikluc3RhbGwucmVwbHkuYW55d2F5Lm5vLiIsICJcdTY2MkZcdTU0MjZcdTRFQ0RcdTg5ODFcdTVCODlcdTg4QzVcdTU2REVcdTU5MEQ/IFtub106ICAifSwKKyAgICAgICAgeyJOTyIsICJcdTU0MjYifSwKKyAgICAgICAgeyJQdWJsaWMua2V5cy5pbi5yZXBseS5hbmQua2V5c3RvcmUuZG9uLnQubWF0Y2giLAorICAgICAgICAgICAgICAgICJcdTU2REVcdTU5MERcdTRFMkRcdTc2ODRcdTUxNkNcdTUxNzFcdTVCQzZcdTk0QTVcdTRFMEVcdTVCQzZcdTk0QTVcdTVFOTNcdTRFMERcdTUzMzlcdTkxNEQifSwKKyAgICAgICAgeyJDZXJ0aWZpY2F0ZS5yZXBseS5hbmQuY2VydGlmaWNhdGUuaW4ua2V5c3RvcmUuYXJlLmlkZW50aWNhbCIsCisgICAgICAgICAgICAgICAgIlx1OEJDMVx1NEU2Nlx1NTZERVx1NTkwRFx1NEUwRVx1NUJDNlx1OTRBNVx1NUU5M1x1NEUyRFx1NzY4NFx1OEJDMVx1NEU2Nlx1NjYyRlx1NzZGOFx1NTQwQ1x1NzY4NCJ9LAorICAgICAgICB7IkZhaWxlZC50by5lc3RhYmxpc2guY2hhaW4uZnJvbS5yZXBseSIsCisgICAgICAgICAgICAgICAgIlx1NjVFMFx1NkNENVx1NEVDRVx1NTZERVx1NTkwRFx1NEUyRFx1NUVGQVx1N0FDQlx1OTRGRSJ9LAorICAgICAgICB7Im4iLCAibiJ9LAorICAgICAgICB7Ildyb25nLmFuc3dlci50cnkuYWdhaW4iLCAiXHU5NTE5XHU4QkVGXHU3Njg0XHU3QjU0XHU2ODQ4LCBcdThCRjdcdTUxOERcdThCRDVcdTRFMDBcdTZCMjEifSwKKyAgICAgICAgeyJTZWNyZXQua2V5Lm5vdC5nZW5lcmF0ZWQuYWxpYXMuYWxpYXMuYWxyZWFkeS5leGlzdHMiLAorICAgICAgICAgICAgICAgICJcdTZDQTFcdTY3MDlcdTc1MUZcdTYyMTBcdTVCQzZcdTk0QTUsIFx1NTIyQlx1NTQwRCA8ezB9PiBcdTVERjJcdTdFQ0ZcdTVCNThcdTU3MjgifSwKKyAgICAgICAgeyJQbGVhc2UucHJvdmlkZS5rZXlzaXplLmZvci5zZWNyZXQua2V5LmdlbmVyYXRpb24iLAorICAgICAgICAgICAgICAgICJcdThCRjdcdTYzRDBcdTRGOUIgLWtleXNpemUgXHU0RUU1XHU3NTFGXHU2MjEwXHU1QkY5XHU3OUYwXHU1QkM2XHU5NEE1In0sCisKKyAgICAgICAgeyJFeHRlbnNpb25zLiIsICJcdTYyNjlcdTVDNTU6ICJ9LAorICAgICAgICB7Ii5FbXB0eS52YWx1ZS4iLCAiKFx1N0E3QVx1NTAzQykifSwKKyAgICAgICAgeyJFeHRlbnNpb24uUmVxdWVzdC4iLCAiXHU2MjY5XHU1QzU1XHU4QkY3XHU2QzQyOiJ9LAorICAgICAgICB7IlBLQ1MuMTAuQ2VydGlmaWNhdGUuUmVxdWVzdC5WZXJzaW9uLjEuMC5TdWJqZWN0LnMuUHVibGljLktleS5zLmZvcm1hdC5zLmtleS4iLAorICAgICAgICAgICAgICAgICJQS0NTICMxMCBcdThCQzFcdTRFNjZcdThCRjdcdTZDNDIgKFx1NzI0OFx1NjcyQyAxLjApXG5cdTRFM0JcdTk4OTg6ICVzXG5cdTUxNkNcdTUxNzFcdTVCQzZcdTk0QTU6ICVzIFx1NjgzQ1x1NUYwRiAlcyBcdTVCQzZcdTk0QTVcbiJ9LAorICAgICAgICB7IlVua25vd24ua2V5VXNhZ2UudHlwZS4iLCAiXHU2NzJBXHU3N0U1IGtleVVzYWdlIFx1N0M3Qlx1NTc4QjogIn0sCisgICAgICAgIHsiVW5rbm93bi5leHRlbmRlZGtleVVzYWdlLnR5cGUuIiwgIlx1NjcyQVx1NzdFNSBleHRlbmRlZGtleVVzYWdlIFx1N0M3Qlx1NTc4QjogIn0sCisgICAgICAgIHsiVW5rbm93bi5BY2Nlc3NEZXNjcmlwdGlvbi50eXBlLiIsICJcdTY3MkFcdTc3RTUgQWNjZXNzRGVzY3JpcHRpb24gXHU3QzdCXHU1NzhCOiAifSwKKyAgICAgICAgeyJVbnJlY29nbml6ZWQuR2VuZXJhbE5hbWUudHlwZS4iLCAiXHU2NUUwXHU2Q0Q1XHU4QkM2XHU1MjJCXHU3Njg0IEdlbmVyYWxOYW1lIFx1N0M3Qlx1NTc4QjogIn0sCisgICAgICAgIHsiVGhpcy5leHRlbnNpb24uY2Fubm90LmJlLm1hcmtlZC5hcy5jcml0aWNhbC4iLAorICAgICAgICAgICAgICAgICAiXHU2NUUwXHU2Q0Q1XHU1QzA2XHU2QjY0XHU2MjY5XHU1QzU1XHU2ODA3XHU4QkIwXHU0RTNBXHUyMDFDXHU0RTI1XHU5MUNEXHUyMDFEXHUzMDAyIn0sCisgICAgICAgIHsiT2RkLm51bWJlci5vZi5oZXguZGlnaXRzLmZvdW5kLiIsICJcdTYyN0VcdTUyMzBcdTU5NDdcdTY1NzBcdTRFMkFcdTUzNDFcdTUxNkRcdThGREJcdTUyMzZcdTY1NzBcdTVCNTc6ICJ9LAorICAgICAgICB7IlVua25vd24uZXh0ZW5zaW9uLnR5cGUuIiwgIlx1NjcyQVx1NzdFNVx1NjI2OVx1NUM1NVx1N0M3Qlx1NTc4QjogIn0sCisgICAgICAgIHsiY29tbWFuZC57MH0uaXMuYW1iaWd1b3VzLiIsICJcdTU0N0RcdTRFRTR7MH1cdTRFMERcdTY2MEVcdTc4NkU6In0KKyAgICB9OworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjb250ZW50cyBvZiB0aGlzIDxjb2RlPlJlc291cmNlQnVuZGxlPC9jb2RlPi4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgY29udGVudHMgb2YgdGhpcyA8Y29kZT5SZXNvdXJjZUJ1bmRsZTwvY29kZT4uCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9iamVjdFtdW10gZ2V0Q29udGVudHMoKSB7CisgICAgICAgIHJldHVybiBjb250ZW50czsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3Rvb2xzL2tleXRvb2wvUmVzb3VyY2VzX3poX0hLLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3Rvb2xzL2tleXRvb2wvUmVzb3VyY2VzX3poX0hLLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBjYjEzZgotLS0gL2Rldi9udWxsCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdG9vbHMva2V5dG9vbC9SZXNvdXJjZXNfemhfSEsuamF2YQpAQCAtMCwwICsxLDQzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgT3JhY2xlIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCisgKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CisgKiBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBzdW4uc2VjdXJpdHkudG9vbHMua2V5dG9vbDsKKworLyoqCisgKiA8cD4gVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSA8Y29kZT5SZXNvdXJjZUJ1bmRsZTwvY29kZT4KKyAqIGZvciB0aGUga2V5dG9vbC4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBSZXNvdXJjZXNfemhfSEsgZXh0ZW5kcyBqYXZhLnV0aWwuTGlzdFJlc291cmNlQnVuZGxlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdW10gY29udGVudHMgPSB7CisgICAgICAgIHsiTkVXTElORSIsICJcbiJ9LAorICAgICAgICB7IlNUQVIiLAorICAgICAgICAgICAgICAgICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIn0sCisgICAgICAgIHsiU1RBUk5OIiwKKyAgICAgICAgICAgICAgICAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG4ifSwKKworICAgICAgICAvLyBrZXl0b29sOiBIZWxwIHBhcnQKKy8vICJPcHRpb24iIHNob3VsZCBiZSB0cmFuc2xhdGVkLgorICAgICAgICB7Ii5PUFRJT04uIiwgIiBbXHU5MDc4XHU5ODA1XS4uLiJ9LAorICAgICAgICB7Ik9wdGlvbnMuIiwgIlx1OTA3OFx1OTgwNToifSwKKyAgICAgICAgeyJVc2Uua2V5dG9vbC5oZWxwLmZvci5hbGwuYXZhaWxhYmxlLmNvbW1hbmRzIiwKKyAgICAgICAgICAgICAgICAgIlx1NEY3Rlx1NzUyOCBcImtleXRvb2wgLWhlbHBcIiBcdTUzRDZcdTVGOTdcdTYyNDBcdTY3MDlcdTUzRUZcdTc1MjhcdTc2ODRcdTU0N0RcdTRFRTQifSwKKyAgICAgICAgeyJLZXkuYW5kLkNlcnRpZmljYXRlLk1hbmFnZW1lbnQuVG9vbCIsCisgICAgICAgICAgICAgICAgICJcdTkxRDFcdTk0NzBcdTgyMDdcdTYxOTFcdThCNDlcdTdCQTFcdTc0MDZcdTVERTVcdTUxNzcifSwKKyAgICAgICAgeyJDb21tYW5kcy4iLCAiXHU1NDdEXHU0RUU0OiJ9LAorICAgICAgICB7IlVzZS5rZXl0b29sLmNvbW1hbmQubmFtZS5oZWxwLmZvci51c2FnZS5vZi5jb21tYW5kLm5hbWUiLAorICAgICAgICAgICAgICAgICJcdTRGN0ZcdTc1MjggXCJrZXl0b29sIC1jb21tYW5kX25hbWUgLWhlbHBcIiBcdTUzRDZcdTVGOTcgY29tbWFuZF9uYW1lIFx1NzY4NFx1NzUyOFx1NkNENSJ9LAorICAgICAgICAvLyBrZXl0b29sOiBoZWxwOiBjb21tYW5kcworICAgICAgICB7IkdlbmVyYXRlcy5hLmNlcnRpZmljYXRlLnJlcXVlc3QiLAorICAgICAgICAgICAgICAgICJcdTc1MjJcdTc1MUZcdTYxOTFcdThCNDlcdTg5ODFcdTZDNDIifSwgLy8tY2VydHJlcQorICAgICAgICB7IkNoYW5nZXMuYW4uZW50cnkucy5hbGlhcyIsCisgICAgICAgICAgICAgICAgIlx1OEI4QVx1NjZGNFx1OTgwNVx1NzZFRVx1NzY4NFx1NTIyNVx1NTQwRCJ9LCAvLy1jaGFuZ2VhbGlhcworICAgICAgICB7IkRlbGV0ZXMuYW4uZW50cnkiLAorICAgICAgICAgICAgICAgICJcdTUyMkFcdTk2NjRcdTk4MDVcdTc2RUUifSwgLy8tZGVsZXRlCisgICAgICAgIHsiRXhwb3J0cy5jZXJ0aWZpY2F0ZSIsCisgICAgICAgICAgICAgICAgIlx1NTMyRlx1NTFGQVx1NjE5MVx1OEI0OSJ9LCAvLy1leHBvcnRjZXJ0CisgICAgICAgIHsiR2VuZXJhdGVzLmEua2V5LnBhaXIiLAorICAgICAgICAgICAgICAgICJcdTc1MjJcdTc1MUZcdTkxRDFcdTk0NzBcdTdENDQifSwgLy8tZ2Vua2V5cGFpcgorLy8gdHJhbnNsYXRpb24gb2YgInNlY3JldCIga2V5IHNob3VsZCBiZSBkaWZmZXJlbnQgdG8gInByaXZhdGUiIGtleS4KKyAgICAgICAgeyJHZW5lcmF0ZXMuYS5zZWNyZXQua2V5IiwKKyAgICAgICAgICAgICAgICAiXHU3NTIyXHU3NTFGXHU3OUQ4XHU1QkM2XHU5MUQxXHU5NDcwIn0sIC8vLWdlbnNlY2tleQorICAgICAgICB7IkdlbmVyYXRlcy5jZXJ0aWZpY2F0ZS5mcm9tLmEuY2VydGlmaWNhdGUucmVxdWVzdCIsCisgICAgICAgICAgICAgICAgIlx1NUY5RVx1NjE5MVx1OEI0OVx1ODk4MVx1NkM0Mlx1NzUyMlx1NzUxRlx1NjE5MVx1OEI0OSJ9LCAvLy1nZW5jZXJ0CisgICAgICAgIHsiR2VuZXJhdGVzLkNSTCIsICJcdTc1MjJcdTc1MUYgQ1JMIn0sIC8vLWdlbmNybAorICAgICAgICB7IkltcG9ydHMuZW50cmllcy5mcm9tLmEuSkRLLjEuMS54LnN0eWxlLmlkZW50aXR5LmRhdGFiYXNlIiwKKyAgICAgICAgICAgICAgICAiXHU1RjlFIEpESyAxLjEueC1zdHlsZSBcdThCNThcdTUyMjVcdThDQzdcdTY1OTlcdTVFQUJcdTUzMkZcdTUxNjVcdTk4MDVcdTc2RUUifSwgLy8taWRlbnRpdHlkYgorICAgICAgICB7IkltcG9ydHMuYS5jZXJ0aWZpY2F0ZS5vci5hLmNlcnRpZmljYXRlLmNoYWluIiwKKyAgICAgICAgICAgICAgICAiXHU1MzJGXHU1MTY1XHU2MTkxXHU4QjQ5XHU2MjE2XHU2MTkxXHU4QjQ5XHU5M0M4In0sIC8vLWltcG9ydGNlcnQKKyAgICAgICAgeyJJbXBvcnRzLm9uZS5vci5hbGwuZW50cmllcy5mcm9tLmFub3RoZXIua2V5c3RvcmUiLAorICAgICAgICAgICAgICAgICJcdTVGOUVcdTUxNzZcdTRFRDZcdTkxRDFcdTk0NzBcdTUxMzJcdTVCNThcdTVFQUJcdTUzMkZcdTUxNjVcdTRFMDBcdTUwMEJcdTYyMTZcdTUxNjhcdTkwRThcdTk4MDVcdTc2RUUifSwgLy8taW1wb3J0a2V5c3RvcmUKKyAgICAgICAgeyJDbG9uZXMuYS5rZXkuZW50cnkiLAorICAgICAgICAgICAgICAgICJcdTg5MDdcdTg4RkRcdTkxRDFcdTk0NzBcdTk4MDVcdTc2RUUifSwgLy8ta2V5Y2xvbmUKKyAgICAgICAgeyJDaGFuZ2VzLnRoZS5rZXkucGFzc3dvcmQub2YuYW4uZW50cnkiLAorICAgICAgICAgICAgICAgICJcdThCOEFcdTY2RjRcdTk4MDVcdTc2RUVcdTc2ODRcdTkxRDFcdTk0NzBcdTVCQzZcdTc4QkMifSwgLy8ta2V5cGFzc3dkCisgICAgICAgIHsiTGlzdHMuZW50cmllcy5pbi5hLmtleXN0b3JlIiwKKyAgICAgICAgICAgICAgICAiXHU1MjE3XHU3OTNBXHU5MUQxXHU5NDcwXHU1MTMyXHU1QjU4XHU1RUFCXHU0RTJEXHU3Njg0XHU5ODA1XHU3NkVFIn0sIC8vLWxpc3QKKyAgICAgICAgeyJQcmludHMudGhlLmNvbnRlbnQub2YuYS5jZXJ0aWZpY2F0ZSIsCisgICAgICAgICAgICAgICAgIlx1NTIxN1x1NTM3MFx1NjE5MVx1OEI0OVx1NzY4NFx1NTE2N1x1NUJCOSJ9LCAvLy1wcmludGNlcnQKKyAgICAgICAgeyJQcmludHMudGhlLmNvbnRlbnQub2YuYS5jZXJ0aWZpY2F0ZS5yZXF1ZXN0IiwKKyAgICAgICAgICAgICAgICAiXHU1MjE3XHU1MzcwXHU2MTkxXHU4QjQ5XHU4OTgxXHU2QzQyXHU3Njg0XHU1MTY3XHU1QkI5In0sIC8vLXByaW50Y2VydHJlcQorICAgICAgICB7IlByaW50cy50aGUuY29udGVudC5vZi5hLkNSTC5maWxlIiwKKyAgICAgICAgICAgICAgICAiXHU1MjE3XHU1MzcwIENSTCBcdTZBOTRcdTY4NDhcdTc2ODRcdTUxNjdcdTVCQjkifSwgLy8tcHJpbnRjcmwKKyAgICAgICAgeyJHZW5lcmF0ZXMuYS5zZWxmLnNpZ25lZC5jZXJ0aWZpY2F0ZSIsCisgICAgICAgICAgICAgICAgIlx1NzUyMlx1NzUxRlx1ODFFQVx1ODg0Q1x1N0MzRFx1N0Y3Mlx1NzY4NFx1NjE5MVx1OEI0OSJ9LCAvLy1zZWxmY2VydAorICAgICAgICB7IkNoYW5nZXMudGhlLnN0b3JlLnBhc3N3b3JkLm9mLmEua2V5c3RvcmUiLAorICAgICAgICAgICAgICAgICJcdThCOEFcdTY2RjRcdTkxRDFcdTk0NzBcdTUxMzJcdTVCNThcdTVFQUJcdTc2ODRcdTUxMzJcdTVCNThcdTVCQzZcdTc4QkMifSwgLy8tc3RvcmVwYXNzd2QKKyAgICAgICAgLy8ga2V5dG9vbDogaGVscDogb3B0aW9ucworICAgICAgICB7ImFsaWFzLm5hbWUub2YudGhlLmVudHJ5LnRvLnByb2Nlc3MiLAorICAgICAgICAgICAgICAgICJcdTg5ODFcdTg2NTVcdTc0MDZcdTk4MDVcdTc2RUVcdTc2ODRcdTUyMjVcdTU0MERcdTU0MERcdTdBMzEifSwgLy8tYWxpYXMKKyAgICAgICAgeyJkZXN0aW5hdGlvbi5hbGlhcyIsCisgICAgICAgICAgICAgICAgIlx1NzZFRVx1NzY4NFx1NTczMFx1NTIyNVx1NTQwRCJ9LCAvLy1kZXN0YWxpYXMKKyAgICAgICAgeyJkZXN0aW5hdGlvbi5rZXkucGFzc3dvcmQiLAorICAgICAgICAgICAgICAgICJcdTc2RUVcdTc2ODRcdTU3MzBcdTkxRDFcdTk0NzBcdTVCQzZcdTc4QkMifSwgLy8tZGVzdGtleXBhc3MKKyAgICAgICAgeyJkZXN0aW5hdGlvbi5rZXlzdG9yZS5uYW1lIiwKKyAgICAgICAgICAgICAgICAiXHU3NkVFXHU3Njg0XHU1NzMwXHU5MUQxXHU5NDcwXHU1MTMyXHU1QjU4XHU1RUFCXHU1NDBEXHU3QTMxIn0sIC8vLWRlc3RrZXlzdG9yZQorICAgICAgICB7ImRlc3RpbmF0aW9uLmtleXN0b3JlLnBhc3N3b3JkLnByb3RlY3RlZCIsCisgICAgICAgICAgICAgICAgIlx1NzZFRVx1NzY4NFx1NTczMFx1OTFEMVx1OTQ3MFx1NTEzMlx1NUI1OFx1NUVBQlx1NUJDNlx1NzhCQ1x1NEZERFx1OEI3NyJ9LCAvLy1kZXN0cHJvdGVjdGVkCisgICAgICAgIHsiZGVzdGluYXRpb24ua2V5c3RvcmUucHJvdmlkZXIubmFtZSIsCisgICAgICAgICAgICAgICAgIlx1NzZFRVx1NzY4NFx1NTczMFx1OTFEMVx1OTQ3MFx1NTEzMlx1NUI1OFx1NUVBQlx1NjNEMFx1NEY5Qlx1ODAwNVx1NTQwRFx1N0EzMSJ9LCAvLy1kZXN0cHJvdmlkZXJuYW1lCisgICAgICAgIHsiZGVzdGluYXRpb24ua2V5c3RvcmUucGFzc3dvcmQiLAorICAgICAgICAgICAgICAgICJcdTc2RUVcdTc2ODRcdTU3MzBcdTkxRDFcdTk0NzBcdTUxMzJcdTVCNThcdTVFQUJcdTVCQzZcdTc4QkMifSwgLy8tZGVzdHN0b3JlcGFzcworICAgICAgICB7ImRlc3RpbmF0aW9uLmtleXN0b3JlLnR5cGUiLAorICAgICAgICAgICAgICAgICJcdTc2RUVcdTc2ODRcdTU3MzBcdTkxRDFcdTk0NzBcdTUxMzJcdTVCNThcdTVFQUJcdTk4NUVcdTU3OEIifSwgLy8tZGVzdHN0b3JldHlwZQorICAgICAgICB7ImRpc3Rpbmd1aXNoZWQubmFtZSIsCisgICAgICAgICAgICAgICAgIlx1OEZBOFx1NTIyNVx1NTQwRFx1N0EzMSJ9LCAvLy1kbmFtZQorICAgICAgICB7IlguNTA5LmV4dGVuc2lvbiIsCisgICAgICAgICAgICAgICAgIlguNTA5IFx1NjRGNFx1NTE0NVx1NTk1N1x1NEVGNiJ9LCAvLy1leHQKKyAgICAgICAgeyJvdXRwdXQuZmlsZS5uYW1lIiwKKyAgICAgICAgICAgICAgICAiXHU4RjM4XHU1MUZBXHU2QTk0XHU2ODQ4XHU1NDBEXHU3QTMxIn0sIC8vLWZpbGUgYW5kIC1vdXRmaWxlCisgICAgICAgIHsiaW5wdXQuZmlsZS5uYW1lIiwKKyAgICAgICAgICAgICAgICAiXHU4RjM4XHU1MTY1XHU2QTk0XHU2ODQ4XHU1NDBEXHU3QTMxIn0sIC8vLWZpbGUgYW5kIC1pbmZpbGUKKyAgICAgICAgeyJrZXkuYWxnb3JpdGhtLm5hbWUiLAorICAgICAgICAgICAgICAgICJcdTkxRDFcdTk0NzBcdTZGMTRcdTdCOTdcdTZDRDVcdTU0MERcdTdBMzEifSwgLy8ta2V5YWxnCisgICAgICAgIHsia2V5LnBhc3N3b3JkIiwKKyAgICAgICAgICAgICAgICAiXHU5MUQxXHU5NDcwXHU1QkM2XHU3OEJDIn0sIC8vLWtleXBhc3MKKyAgICAgICAgeyJrZXkuYml0LnNpemUiLAorICAgICAgICAgICAgICAgICJcdTkxRDFcdTk0NzBcdTRGNERcdTUxNDNcdTU5MjdcdTVDMEYifSwgLy8ta2V5c2l6ZQorICAgICAgICB7ImtleXN0b3JlLm5hbWUiLAorICAgICAgICAgICAgICAgICJcdTkxRDFcdTk0NzBcdTUxMzJcdTVCNThcdTVFQUJcdTU0MERcdTdBMzEifSwgLy8ta2V5c3RvcmUKKyAgICAgICAgeyJuZXcucGFzc3dvcmQiLAorICAgICAgICAgICAgICAgICJcdTY1QjBcdTVCQzZcdTc4QkMifSwgLy8tbmV3CisgICAgICAgIHsiZG8ubm90LnByb21wdCIsCisgICAgICAgICAgICAgICAgIlx1NEUwRFx1ODk4MVx1NjNEMFx1NzkzQSJ9LCAvLy1ub3Byb21wdAorICAgICAgICB7InBhc3N3b3JkLnRocm91Z2gucHJvdGVjdGVkLm1lY2hhbmlzbSIsCisgICAgICAgICAgICAgICAgIlx1N0Q5M1x1NzUzMVx1NEZERFx1OEI3N1x1NkE1Rlx1NTIzNlx1NzY4NFx1NUJDNlx1NzhCQyJ9LCAvLy1wcm90ZWN0ZWQKKyAgICAgICAgeyJwcm92aWRlci5hcmd1bWVudCIsCisgICAgICAgICAgICAgICAgIlx1NjNEMFx1NEY5Qlx1ODAwNVx1NUYxNVx1NjU3OCJ9LCAvLy1wcm92aWRlcmFyZworICAgICAgICB7InByb3ZpZGVyLmNsYXNzLm5hbWUiLAorICAgICAgICAgICAgICAgICJcdTYzRDBcdTRGOUJcdTgwMDVcdTk4NUVcdTUyMjVcdTU0MERcdTdBMzEifSwgLy8tcHJvdmlkZXJjbGFzcworICAgICAgICB7InByb3ZpZGVyLm5hbWUiLAorICAgICAgICAgICAgICAgICJcdTYzRDBcdTRGOUJcdTgwMDVcdTU0MERcdTdBMzEifSwgLy8tcHJvdmlkZXJuYW1lCisgICAgICAgIHsicHJvdmlkZXIuY2xhc3NwYXRoIiwKKyAgICAgICAgICAgICAgICAiXHU2M0QwXHU0RjlCXHU4MDA1XHU5ODVFXHU1MjI1XHU4REVGXHU1RjkxIn0sIC8vLXByb3ZpZGVycGF0aAorICAgICAgICB7Im91dHB1dC5pbi5SRkMuc3R5bGUiLAorICAgICAgICAgICAgICAgICJcdTRFRTUgUkZDIFx1NkEyM1x1NUYwRlx1OEYzOFx1NTFGQSJ9LCAvLy1yZmMKKyAgICAgICAgeyJzaWduYXR1cmUuYWxnb3JpdGhtLm5hbWUiLAorICAgICAgICAgICAgICAgICJcdTdDM0RcdTdBRTBcdTZGMTRcdTdCOTdcdTZDRDVcdTU0MERcdTdBMzEifSwgLy8tc2lnYWxnCisgICAgICAgIHsic291cmNlLmFsaWFzIiwKKyAgICAgICAgICAgICAgICAiXHU0Rjg2XHU2RTkwXHU1MjI1XHU1NDBEIn0sIC8vLXNyY2FsaWFzCisgICAgICAgIHsic291cmNlLmtleS5wYXNzd29yZCIsCisgICAgICAgICAgICAgICAgIlx1NEY4Nlx1NkU5MFx1OTFEMVx1OTQ3MFx1NUJDNlx1NzhCQyJ9LCAvLy1zcmNrZXlwYXNzCisgICAgICAgIHsic291cmNlLmtleXN0b3JlLm5hbWUiLAorICAgICAgICAgICAgICAgICJcdTRGODZcdTZFOTBcdTkxRDFcdTk0NzBcdTUxMzJcdTVCNThcdTVFQUJcdTU0MERcdTdBMzEifSwgLy8tc3Jja2V5c3RvcmUKKyAgICAgICAgeyJzb3VyY2Uua2V5c3RvcmUucGFzc3dvcmQucHJvdGVjdGVkIiwKKyAgICAgICAgICAgICAgICAiXHU0Rjg2XHU2RTkwXHU5MUQxXHU5NDcwXHU1MTMyXHU1QjU4XHU1RUFCXHU1QkM2XHU3OEJDXHU0RkREXHU4Qjc3In0sIC8vLXNyY3Byb3RlY3RlZAorICAgICAgICB7InNvdXJjZS5rZXlzdG9yZS5wcm92aWRlci5uYW1lIiwKKyAgICAgICAgICAgICAgICAiXHU0Rjg2XHU2RTkwXHU5MUQxXHU5NDcwXHU1MTMyXHU1QjU4XHU1RUFCXHU2M0QwXHU0RjlCXHU4MDA1XHU1NDBEXHU3QTMxIn0sIC8vLXNyY3Byb3ZpZGVybmFtZQorICAgICAgICB7InNvdXJjZS5rZXlzdG9yZS5wYXNzd29yZCIsCisgICAgICAgICAgICAgICAgIlx1NEY4Nlx1NkU5MFx1OTFEMVx1OTQ3MFx1NTEzMlx1NUI1OFx1NUVBQlx1NUJDNlx1NzhCQyJ9LCAvLy1zcmNzdG9yZXBhc3MKKyAgICAgICAgeyJzb3VyY2Uua2V5c3RvcmUudHlwZSIsCisgICAgICAgICAgICAgICAgIlx1NEY4Nlx1NkU5MFx1OTFEMVx1OTQ3MFx1NTEzMlx1NUI1OFx1NUVBQlx1OTg1RVx1NTc4QiJ9LCAvLy1zcmNzdG9yZXR5cGUKKyAgICAgICAgeyJTU0wuc2VydmVyLmhvc3QuYW5kLnBvcnQiLAorICAgICAgICAgICAgICAgICJTU0wgXHU0RjNBXHU2NzBEXHU1NjY4XHU0RTNCXHU2QTVGXHU4MjA3XHU5MDIzXHU2M0E1XHU1N0UwIn0sIC8vLXNzbHNlcnZlcgorICAgICAgICB7InNpZ25lZC5qYXIuZmlsZSIsCisgICAgICAgICAgICAgICAgIlx1N0MzRFx1N0Y3Mlx1NzY4NCBqYXIgXHU2QTk0XHU2ODQ4In0sIC8vPWphcmZpbGUKKyAgICAgICAgeyJjZXJ0aWZpY2F0ZS52YWxpZGl0eS5zdGFydC5kYXRlLnRpbWUiLAorICAgICAgICAgICAgICAgICJcdTYxOTFcdThCNDlcdTY3MDlcdTY1NDhcdTYwMjdcdTk1OEJcdTU5Q0JcdTY1RTVcdTY3MUYvXHU2NjQyXHU5NTkzIn0sIC8vLXN0YXJ0ZGF0ZQorICAgICAgICB7ImtleXN0b3JlLnBhc3N3b3JkIiwKKyAgICAgICAgICAgICAgICAiXHU5MUQxXHU5NDcwXHU1MTMyXHU1QjU4XHU1RUFCXHU1QkM2XHU3OEJDIn0sIC8vLXN0b3JlcGFzcworICAgICAgICB7ImtleXN0b3JlLnR5cGUiLAorICAgICAgICAgICAgICAgICJcdTkxRDFcdTk0NzBcdTUxMzJcdTVCNThcdTVFQUJcdTk4NUVcdTU3OEIifSwgLy8tc3RvcmV0eXBlCisgICAgICAgIHsidHJ1c3QuY2VydGlmaWNhdGVzLmZyb20uY2FjZXJ0cyIsCisgICAgICAgICAgICAgICAgIlx1NEY4Nlx1ODFFQSBjYWNlcnRzIFx1NzY4NFx1NEZFMVx1NEVGQlx1NjE5MVx1OEI0OSJ9LCAvLy10cnVzdGNhY2VydHMKKyAgICAgICAgeyJ2ZXJib3NlLm91dHB1dCIsCisgICAgICAgICAgICAgICAgIlx1OEE3M1x1N0QzMFx1OENDN1x1OEEwQVx1OEYzOFx1NTFGQSJ9LCAvLy12CisgICAgICAgIHsidmFsaWRpdHkubnVtYmVyLm9mLmRheXMiLAorICAgICAgICAgICAgICAgICJcdTY3MDlcdTY1NDhcdTYwMjdcdTY1RTVcdTY1NzgifSwgLy8tdmFsaWRpdHkKKyAgICAgICAgeyJTZXJpYWwuSUQub2YuY2VydC50by5yZXZva2UiLAorICAgICAgICAgICAgICAgICAiXHU4OTgxXHU2NEE0XHU5MkI3XHU2MTkxXHU4QjQ5XHU3Njg0XHU1RThGXHU1MjE3IElEIn0sIC8vLWlkCisgICAgICAgIC8vIGtleXRvb2w6IFJ1bm5pbmcgcGFydAorICAgICAgICB7ImtleXRvb2wuZXJyb3IuIiwgIlx1OTFEMVx1OTQ3MFx1NURFNVx1NTE3N1x1OTMyRlx1OEFBNDogIn0sCisgICAgICAgIHsiSWxsZWdhbC5vcHRpb24uIiwgIlx1NzEyMVx1NjU0OFx1NzY4NFx1OTA3OFx1OTgwNToifSwKKyAgICAgICAgeyJJbGxlZ2FsLnZhbHVlLiIsICJcdTcxMjFcdTY1NDhcdTUwM0M6ICJ9LAorICAgICAgICB7IlVua25vd24ucGFzc3dvcmQudHlwZS4iLCAiXHU0RTBEXHU2NjBFXHU3Njg0XHU1QkM2XHU3OEJDXHU5ODVFXHU1NzhCOiAifSwKKyAgICAgICAgeyJDYW5ub3QuZmluZC5lbnZpcm9ubWVudC52YXJpYWJsZS4iLAorICAgICAgICAgICAgICAgICJcdTYyN0VcdTRFMERcdTUyMzBcdTc0QjBcdTU4ODNcdThCOEFcdTY1Nzg6ICJ9LAorICAgICAgICB7IkNhbm5vdC5maW5kLmZpbGUuIiwgIlx1NjI3RVx1NEUwRFx1NTIzMFx1NkE5NFx1Njg0ODogIn0sCisgICAgICAgIHsiQ29tbWFuZC5vcHRpb24uZmxhZy5uZWVkcy5hbi5hcmd1bWVudC4iLCAiXHU1NDdEXHU0RUU0XHU5MDc4XHU5ODA1IHswfSBcdTk3MDBcdTg5ODFcdTVGMTVcdTY1NzhcdTMwMDIifSwKKyAgICAgICAgeyJXYXJuaW5nLkRpZmZlcmVudC5zdG9yZS5hbmQua2V5LnBhc3N3b3Jkcy5ub3Quc3VwcG9ydGVkLmZvci5QS0NTMTIuS2V5U3RvcmVzLklnbm9yaW5nLnVzZXIuc3BlY2lmaWVkLmNvbW1hbmQudmFsdWUuIiwKKyAgICAgICAgICAgICAgICAiXHU4QjY2XHU1NDRBOiBQS0NTMTIgXHU5MUQxXHU5NDcwXHU1MTMyXHU1QjU4XHU1RUFCXHU0RTBEXHU2NTJGXHU2M0Y0XHU0RTBEXHU1NDBDXHU3Njg0XHU1MTMyXHU1QjU4XHU1RUFCXHU1NDhDXHU5MUQxXHU5NDcwXHU1QkM2XHU3OEJDXHUzMDAyXHU1RkZEXHU3NTY1XHU0RjdGXHU3NTI4XHU4MDA1XHU2MzA3XHU1QjlBXHU3Njg0IHswfSBcdTUwM0NcdTMwMDIifSwKKyAgICAgICAgeyIua2V5c3RvcmUubXVzdC5iZS5OT05FLmlmLnN0b3JldHlwZS5pcy57MH0iLAorICAgICAgICAgICAgICAgICJcdTU5ODJcdTY3OUMgLXN0b3JldHlwZSBcdTcwQkEgezB9XHVGRjBDXHU1MjQ3IC1rZXlzdG9yZSBcdTVGQzVcdTk4MDhcdTcwQkEgTk9ORSJ9LAorICAgICAgICB7IlRvby5tYW55LnJldHJpZXMucHJvZ3JhbS50ZXJtaW5hdGVkIiwKKyAgICAgICAgICAgICAgICAgIlx1OTFDRFx1OEE2Nlx1NkIyMVx1NjU3OFx1NTkyQVx1NTkxQVx1RkYwQ1x1N0EwQlx1NUYwRlx1NURGMlx1N0Q0Mlx1NkI2MiJ9LAorICAgICAgICB7Ii5zdG9yZXBhc3N3ZC5hbmQua2V5cGFzc3dkLmNvbW1hbmRzLm5vdC5zdXBwb3J0ZWQuaWYuc3RvcmV0eXBlLmlzLnswfSIsCisgICAgICAgICAgICAgICAgIlx1NTk4Mlx1Njc5QyAtc3RvcmV0eXBlIFx1NzBCQSB7MH1cdUZGMENcdTUyNDdcdTRFMERcdTY1MkZcdTYzRjQgLXN0b3JlcGFzc3dkIFx1NTQ4QyAta2V5cGFzc3dkIFx1NTQ3RFx1NEVFNCJ9LAorICAgICAgICB7Ii5rZXlwYXNzd2QuY29tbWFuZHMubm90LnN1cHBvcnRlZC5pZi5zdG9yZXR5cGUuaXMuUEtDUzEyIiwKKyAgICAgICAgICAgICAgICAiXHU1OTgyXHU2NzlDIC1zdG9yZXR5cGUgXHU3MEJBIFBLQ1MxMlx1RkYwQ1x1NTI0N1x1NEUwRFx1NjUyRlx1NjNGNCAta2V5cGFzc3dkIFx1NTQ3RFx1NEVFNCJ9LAorICAgICAgICB7Ii5rZXlwYXNzLmFuZC5uZXcuY2FuLm5vdC5iZS5zcGVjaWZpZWQuaWYuc3RvcmV0eXBlLmlzLnswfSIsCisgICAgICAgICAgICAgICAgIlx1NTk4Mlx1Njc5QyAtc3RvcmV0eXBlIFx1NzBCQSB7MH1cdUZGMENcdTUyNDdcdTRFMERcdTgwRkRcdTYzMDdcdTVCOUEgLWtleXBhc3MgXHU1NDhDIC1uZXcifSwKKyAgICAgICAgeyJpZi5wcm90ZWN0ZWQuaXMuc3BlY2lmaWVkLnRoZW4uc3RvcmVwYXNzLmtleXBhc3MuYW5kLm5ldy5tdXN0Lm5vdC5iZS5zcGVjaWZpZWQiLAorICAgICAgICAgICAgICAgICJcdTU5ODJcdTY3OUNcdTYzMDdcdTVCOUEgLXByb3RlY3RlZFx1RkYwQ1x1NTI0N1x1NEUwRFx1ODBGRFx1NjMwN1x1NUI5QSAtc3RvcmVwYXNzXHUzMDAxLWtleXBhc3MgXHU1NDhDIC1uZXcifSwKKyAgICAgICAgeyJpZi5zcmNwcm90ZWN0ZWQuaXMuc3BlY2lmaWVkLnRoZW4uc3Jjc3RvcmVwYXNzLmFuZC5zcmNrZXlwYXNzLm11c3Qubm90LmJlLnNwZWNpZmllZCIsCisgICAgICAgICAgICAgICAgIlx1NTk4Mlx1Njc5Q1x1NjMwN1x1NUI5QSAtc3JjcHJvdGVjdGVkXHVGRjBDXHU1MjQ3XHU0RTBEXHU4MEZEXHU2MzA3XHU1QjlBIC1zcmNzdG9yZXBhc3MgXHU1NDhDIC1zcmNrZXlwYXNzIn0sCisgICAgICAgIHsiaWYua2V5c3RvcmUuaXMubm90LnBhc3N3b3JkLnByb3RlY3RlZC50aGVuLnN0b3JlcGFzcy5rZXlwYXNzLmFuZC5uZXcubXVzdC5ub3QuYmUuc3BlY2lmaWVkIiwKKyAgICAgICAgICAgICAgICAiXHU1OTgyXHU2NzlDXHU5MUQxXHU5NDcwXHU1MTMyXHU1QjU4XHU1RUFCXHU0RTBEXHU1M0Q3XHU1QkM2XHU3OEJDXHU0RkREXHU4Qjc3XHVGRjBDXHU1MjQ3XHU0RTBEXHU4MEZEXHU2MzA3XHU1QjlBIC1zdG9yZXBhc3NcdTMwMDEta2V5cGFzcyBcdTU0OEMgLW5ldyJ9LAorICAgICAgICB7ImlmLnNvdXJjZS5rZXlzdG9yZS5pcy5ub3QucGFzc3dvcmQucHJvdGVjdGVkLnRoZW4uc3Jjc3RvcmVwYXNzLmFuZC5zcmNrZXlwYXNzLm11c3Qubm90LmJlLnNwZWNpZmllZCIsCisgICAgICAgICAgICAgICAgIlx1NTk4Mlx1Njc5Q1x1NEY4Nlx1NkU5MFx1OTFEMVx1OTQ3MFx1NTEzMlx1NUI1OFx1NUVBQlx1NEUwRFx1NTNEN1x1NUJDNlx1NzhCQ1x1NEZERFx1OEI3N1x1RkYwQ1x1NTI0N1x1NEUwRFx1ODBGRFx1NjMwN1x1NUI5QSAtc3Jjc3RvcmVwYXNzIFx1NTQ4QyAtc3Jja2V5cGFzcyJ9LAorICAgICAgICB7IklsbGVnYWwuc3RhcnRkYXRlLnZhbHVlIiwgIlx1NzEyMVx1NjU0OFx1NzY4NCBzdGFydGRhdGUgXHU1MDNDIn0sCisgICAgICAgIHsiVmFsaWRpdHkubXVzdC5iZS5ncmVhdGVyLnRoYW4uemVybyIsCisgICAgICAgICAgICAgICAgIlx1NjcwOVx1NjU0OFx1NjAyN1x1NUZDNVx1OTgwOFx1NTkyN1x1NjVCQ1x1OTZGNiJ9LAorICAgICAgICB7InByb3ZOYW1lLm5vdC5hLnByb3ZpZGVyIiwgInswfSBcdTRFMERcdTY2MkZcdTRFMDBcdTUwMEJcdTYzRDBcdTRGOUJcdTgwMDUifSwKKyAgICAgICAgeyJVc2FnZS5lcnJvci5uby5jb21tYW5kLnByb3ZpZGVkIiwgIlx1NzUyOFx1NkNENVx1OTMyRlx1OEFBNDogXHU2NzJBXHU2M0QwXHU0RjlCXHU1NDdEXHU0RUU0In0sCisgICAgICAgIHsiU291cmNlLmtleXN0b3JlLmZpbGUuZXhpc3RzLmJ1dC5pcy5lbXB0eS4iLCAiXHU0Rjg2XHU2RTkwXHU5MUQxXHU5NDcwXHU1MTMyXHU1QjU4XHU1RUFCXHU2QTk0XHU2ODQ4XHU1QjU4XHU1NzI4XHVGRjBDXHU0RjQ2XHU3MEJBXHU3QTdBOiAifSwKKyAgICAgICAgeyJQbGVhc2Uuc3BlY2lmeS5zcmNrZXlzdG9yZSIsICJcdThBQ0JcdTYzMDdcdTVCOUEgLXNyY2tleXN0b3JlIn0sCisgICAgICAgIHsiTXVzdC5ub3Quc3BlY2lmeS5ib3RoLnYuYW5kLnJmYy53aXRoLmxpc3QuY29tbWFuZCIsCisgICAgICAgICAgICAgICAgIiAnbGlzdCcgXHU1NDdEXHU0RUU0XHU0RTBEXHU4MEZEXHU1NDBDXHU2NjQyXHU2MzA3XHU1QjlBIC12IFx1NTNDQSAtcmZjIn0sCisgICAgICAgIHsiS2V5LnBhc3N3b3JkLm11c3QuYmUuYXQubGVhc3QuNi5jaGFyYWN0ZXJzIiwKKyAgICAgICAgICAgICAgICAiXHU5MUQxXHU5NDcwXHU1QkM2XHU3OEJDXHU1RkM1XHU5ODA4XHU4MUYzXHU1QzExXHU3MEJBIDYgXHU1MDBCXHU1QjU3XHU1MTQzIn0sCisgICAgICAgIHsiTmV3LnBhc3N3b3JkLm11c3QuYmUuYXQubGVhc3QuNi5jaGFyYWN0ZXJzIiwKKyAgICAgICAgICAgICAgICAiXHU2NUIwXHU3Njg0XHU1QkM2XHU3OEJDXHU1RkM1XHU5ODA4XHU4MUYzXHU1QzExXHU3MEJBIDYgXHU1MDBCXHU1QjU3XHU1MTQzIn0sCisgICAgICAgIHsiS2V5c3RvcmUuZmlsZS5leGlzdHMuYnV0LmlzLmVtcHR5LiIsCisgICAgICAgICAgICAgICAgIlx1OTFEMVx1OTQ3MFx1NTEzMlx1NUI1OFx1NUVBQlx1NkE5NFx1Njg0OFx1NUI1OFx1NTcyOFx1RkYwQ1x1NEY0Nlx1NzBCQVx1N0E3QVx1NzY3RDogIn0sCisgICAgICAgIHsiS2V5c3RvcmUuZmlsZS5kb2VzLm5vdC5leGlzdC4iLAorICAgICAgICAgICAgICAgICJcdTkxRDFcdTk0NzBcdTUxMzJcdTVCNThcdTVFQUJcdTZBOTRcdTY4NDhcdTRFMERcdTVCNThcdTU3Mjg6ICJ9LAorICAgICAgICB7Ik11c3Quc3BlY2lmeS5kZXN0aW5hdGlvbi5hbGlhcyIsICJcdTVGQzVcdTk4MDhcdTYzMDdcdTVCOUFcdTc2RUVcdTc2ODRcdTU3MzBcdTUyMjVcdTU0MEQifSwKKyAgICAgICAgeyJNdXN0LnNwZWNpZnkuYWxpYXMiLCAiXHU1RkM1XHU5ODA4XHU2MzA3XHU1QjlBXHU1MjI1XHU1NDBEIn0sCisgICAgICAgIHsiS2V5c3RvcmUucGFzc3dvcmQubXVzdC5iZS5hdC5sZWFzdC42LmNoYXJhY3RlcnMiLAorICAgICAgICAgICAgICAgICJcdTkxRDFcdTk0NzBcdTUxMzJcdTVCNThcdTVFQUJcdTVCQzZcdTc4QkNcdTVGQzVcdTk4MDhcdTgxRjNcdTVDMTFcdTcwQkEgNiBcdTUwMEJcdTVCNTdcdTUxNDMifSwKKyAgICAgICAgeyJFbnRlci5rZXlzdG9yZS5wYXNzd29yZC4iLCAiXHU4RjM4XHU1MTY1XHU5MUQxXHU5NDcwXHU1MTMyXHU1QjU4XHU1RUFCXHU1QkM2XHU3OEJDOiAgIn0sCisgICAgICAgIHsiRW50ZXIuc291cmNlLmtleXN0b3JlLnBhc3N3b3JkLiIsICJcdThBQ0JcdThGMzhcdTUxNjVcdTRGODZcdTZFOTBcdTkxRDFcdTk0NzBcdTUxMzJcdTVCNThcdTVFQUJcdTVCQzZcdTc4QkM6ICJ9LAorICAgICAgICB7IkVudGVyLmRlc3RpbmF0aW9uLmtleXN0b3JlLnBhc3N3b3JkLiIsICJcdThBQ0JcdThGMzhcdTUxNjVcdTc2RUVcdTc2ODRcdTU3MzBcdTkxRDFcdTk0NzBcdTUxMzJcdTVCNThcdTVFQUJcdTVCQzZcdTc4QkM6ICJ9LAorICAgICAgICB7IktleXN0b3JlLnBhc3N3b3JkLmlzLnRvby5zaG9ydC5tdXN0LmJlLmF0LmxlYXN0LjYuY2hhcmFjdGVycyIsCisgICAgICAgICAiXHU5MUQxXHU5NDcwXHU1MTMyXHU1QjU4XHU1RUFCXHU1QkM2XHU3OEJDXHU1OTJBXHU3N0VEIC0gXHU1RkM1XHU5ODA4XHU4MUYzXHU1QzExXHU3MEJBIDYgXHU1MDBCXHU1QjU3XHU1MTQzIn0sCisgICAgICAgIHsiVW5rbm93bi5FbnRyeS5UeXBlIiwgIlx1NEUwRFx1NjYwRVx1NzY4NFx1OTgwNVx1NzZFRVx1OTg1RVx1NTc4QiJ9LAorICAgICAgICB7IlRvby5tYW55LmZhaWx1cmVzLkFsaWFzLm5vdC5jaGFuZ2VkIiwgIlx1NTkyQVx1NTkxQVx1OTMyRlx1OEFBNFx1MzAwMlx1NjcyQVx1OEI4QVx1NjZGNFx1NTIyNVx1NTQwRCJ9LAorICAgICAgICB7IkVudHJ5LmZvci5hbGlhcy5hbGlhcy5zdWNjZXNzZnVsbHkuaW1wb3J0ZWQuIiwKKyAgICAgICAgICAgICAgICAgIlx1NURGMlx1NjIxMFx1NTI5Rlx1NTMyRlx1NTE2NVx1NTIyNVx1NTQwRCB7MH0gXHU3Njg0XHU5ODA1XHU3NkVFXHUzMDAyIn0sCisgICAgICAgIHsiRW50cnkuZm9yLmFsaWFzLmFsaWFzLm5vdC5pbXBvcnRlZC4iLCAiXHU2NzJBXHU1MzJGXHU1MTY1XHU1MjI1XHU1NDBEIHswfSBcdTc2ODRcdTk4MDVcdTc2RUVcdTMwMDIifSwKKyAgICAgICAgeyJQcm9ibGVtLmltcG9ydGluZy5lbnRyeS5mb3IuYWxpYXMuYWxpYXMuZXhjZXB0aW9uLkVudHJ5LmZvci5hbGlhcy5hbGlhcy5ub3QuaW1wb3J0ZWQuIiwKKyAgICAgICAgICAgICAgICAgIlx1NTMyRlx1NTE2NVx1NTIyNVx1NTQwRCB7MH0gXHU3Njg0XHU5ODA1XHU3NkVFXHU2NjQyXHU1MUZBXHU3M0ZFXHU1NTRGXHU5ODRDOiB7MX1cdTMwMDJcblx1NjcyQVx1NTMyRlx1NTE2NVx1NTIyNVx1NTQwRCB7MH0gXHU3Njg0XHU5ODA1XHU3NkVFXHUzMDAyIn0sCisgICAgICAgIHsiSW1wb3J0LmNvbW1hbmQuY29tcGxldGVkLm9rLmVudHJpZXMuc3VjY2Vzc2Z1bGx5LmltcG9ydGVkLmZhaWwuZW50cmllcy5mYWlsZWQub3IuY2FuY2VsbGVkIiwKKyAgICAgICAgICAgICAgICAgIlx1NURGMlx1NUI4Q1x1NjIxMFx1NTMyRlx1NTE2NVx1NTQ3RFx1NEVFNDogXHU2MjEwXHU1MjlGXHU1MzJGXHU1MTY1IHswfSBcdTUwMEJcdTk4MDVcdTc2RUVcdUZGMEN7MX0gXHU1MDBCXHU5ODA1XHU3NkVFXHU1OTMxXHU2NTU3XHU2MjE2XHU1REYyXHU1M0Q2XHU2RDg4In0sCisgICAgICAgIHsiV2FybmluZy5PdmVyd3JpdGluZy5leGlzdGluZy5hbGlhcy5hbGlhcy5pbi5kZXN0aW5hdGlvbi5rZXlzdG9yZSIsCisgICAgICAgICAgICAgICAgICJcdThCNjZcdTU0NEE6IFx1NkI2M1x1NTcyOFx1ODk4Nlx1NUJFQlx1NzZFRVx1NzY4NFx1NTczMFx1OTFEMVx1OTQ3MFx1NTEzMlx1NUI1OFx1NUVBQlx1NEUyRFx1NzY4NFx1NzNGRVx1NjcwOVx1NTIyNVx1NTQwRCB7MH0ifSwKKyAgICAgICAgeyJFeGlzdGluZy5lbnRyeS5hbGlhcy5hbGlhcy5leGlzdHMub3ZlcndyaXRlLm5vLiIsCisgICAgICAgICAgICAgICAgICJcdTczRkVcdTY3MDlcdTk4MDVcdTc2RUVcdTUyMjVcdTU0MEQgezB9IFx1NUI1OFx1NTcyOFx1RkYwQ1x1NjYyRlx1NTQyNlx1ODk4Nlx1NUJFQlx1RkYxRltcdTU0MjZdOiAgIn0sCisgICAgICAgIHsiVG9vLm1hbnkuZmFpbHVyZXMudHJ5LmxhdGVyIiwgIlx1NTkyQVx1NTkxQVx1OTMyRlx1OEFBNCAtIFx1OEFDQlx1N0EwRFx1NUY4Q1x1NTE4RFx1OEE2NiJ9LAorICAgICAgICB7IkNlcnRpZmljYXRpb24ucmVxdWVzdC5zdG9yZWQuaW4uZmlsZS5maWxlbmFtZS4iLAorICAgICAgICAgICAgICAgICJcdThBOERcdThCNDlcdTg5ODFcdTZDNDJcdTUxMzJcdTVCNThcdTU3MjhcdTZBOTRcdTY4NDggPHswfT4ifSwKKyAgICAgICAgeyJTdWJtaXQudGhpcy50by55b3VyLkNBIiwgIlx1NUMwN1x1NkI2NFx1OTAwMVx1NTFGQVx1ODFGM1x1NjBBOFx1NzY4NCBDQSJ9LAorICAgICAgICB7ImlmLmFsaWFzLm5vdC5zcGVjaWZpZWQuZGVzdGFsaWFzLnNyY2tleXBhc3MuYW5kLmRlc3RrZXlwYXNzLm11c3Qubm90LmJlLnNwZWNpZmllZCIsCisgICAgICAgICAgICAiXHU1OTgyXHU2NzlDXHU2NzJBXHU2MzA3XHU1QjlBXHU1MjI1XHU1NDBEXHVGRjBDXHU1MjQ3XHU0RTBEXHU4MEZEXHU2MzA3XHU1QjlBIGRlc3RhbGlhc1x1MzAwMXNyY2tleXBhc3MgXHU1M0NBIGRlc3RrZXlwYXNzIn0sCisgICAgICAgIHsiQ2VydGlmaWNhdGUuc3RvcmVkLmluLmZpbGUuZmlsZW5hbWUuIiwKKyAgICAgICAgICAgICAgICAiXHU2MTkxXHU4QjQ5XHU1MTMyXHU1QjU4XHU1NzI4XHU2QTk0XHU2ODQ4IDx7MH0+In0sCisgICAgICAgIHsiQ2VydGlmaWNhdGUucmVwbHkud2FzLmluc3RhbGxlZC5pbi5rZXlzdG9yZSIsCisgICAgICAgICAgICAgICAgIlx1NjE5MVx1OEI0OVx1NTZERVx1ODk4Nlx1NURGMlx1NUI4OVx1ODhERFx1NTcyOFx1OTFEMVx1OTQ3MFx1NTEzMlx1NUI1OFx1NUVBQlx1NEUyRCJ9LAorICAgICAgICB7IkNlcnRpZmljYXRlLnJlcGx5Lndhcy5ub3QuaW5zdGFsbGVkLmluLmtleXN0b3JlIiwKKyAgICAgICAgICAgICAgICAiXHU2MTkxXHU4QjQ5XHU1NkRFXHU4OTg2XHU2NzJBXHU1Qjg5XHU4OEREXHU1NzI4XHU5MUQxXHU5NDcwXHU1MTMyXHU1QjU4XHU1RUFCXHU0RTJEIn0sCisgICAgICAgIHsiQ2VydGlmaWNhdGUud2FzLmFkZGVkLnRvLmtleXN0b3JlIiwKKyAgICAgICAgICAgICAgICAiXHU2MTkxXHU4QjQ5XHU1REYyXHU2NUIwXHU1ODlFXHU4MUYzXHU5MUQxXHU5NDcwXHU1MTMyXHU1QjU4XHU1RUFCXHU0RTJEIn0sCisgICAgICAgIHsiQ2VydGlmaWNhdGUud2FzLm5vdC5hZGRlZC50by5rZXlzdG9yZSIsCisgICAgICAgICAgICAgICAgIlx1NjE5MVx1OEI0OVx1NjcyQVx1NjVCMFx1NTg5RVx1ODFGM1x1OTFEMVx1OTQ3MFx1NTEzMlx1NUI1OFx1NUVBQlx1NEUyRCJ9LAorICAgICAgICB7Ii5TdG9yaW5nLmtzZm5hbWUuIiwgIltcdTUxMzJcdTVCNTggezB9XSJ9LAorICAgICAgICB7ImFsaWFzLmhhcy5uby5wdWJsaWMua2V5LmNlcnRpZmljYXRlLiIsCisgICAgICAgICAgICAgICAgInswfSBcdTZDOTJcdTY3MDlcdTUxNkNcdTk1OEJcdTkxRDFcdTk0NzAgKFx1NjE5MVx1OEI0OSkifSwKKyAgICAgICAgeyJDYW5ub3QuZGVyaXZlLnNpZ25hdHVyZS5hbGdvcml0aG0iLAorICAgICAgICAgICAgICAgICJcdTcxMjFcdTZDRDVcdTUzRDZcdTVGOTdcdTdDM0RcdTdBRTBcdTZGMTRcdTdCOTdcdTZDRDUifSwKKyAgICAgICAgeyJBbGlhcy5hbGlhcy5kb2VzLm5vdC5leGlzdCIsCisgICAgICAgICAgICAgICAgIlx1NTIyNVx1NTQwRCA8ezB9PiBcdTRFMERcdTVCNThcdTU3MjgifSwKKyAgICAgICAgeyJBbGlhcy5hbGlhcy5oYXMubm8uY2VydGlmaWNhdGUiLAorICAgICAgICAgICAgICAgICJcdTUyMjVcdTU0MEQgPHswfT4gXHU2QzkyXHU2NzA5XHU2MTkxXHU4QjQ5In0sCisgICAgICAgIHsiS2V5LnBhaXIubm90LmdlbmVyYXRlZC5hbGlhcy5hbGlhcy5hbHJlYWR5LmV4aXN0cyIsCisgICAgICAgICAgICAgICAgIlx1NkM5Mlx1NjcwOVx1NUVGQVx1N0FDQlx1OTFEMVx1OTQ3MFx1N0Q0NFx1RkYwQ1x1NTIyNVx1NTQwRCA8ezB9PiBcdTVERjJcdTdEOTNcdTVCNThcdTU3MjgifSwKKyAgICAgICAgeyJHZW5lcmF0aW5nLmtleXNpemUuYml0LmtleUFsZ05hbWUua2V5LnBhaXIuYW5kLnNlbGYuc2lnbmVkLmNlcnRpZmljYXRlLnNpZ0FsZ05hbWUud2l0aC5hLnZhbGlkaXR5Lm9mLnZhbGlkYWxpdHkuZGF5cy5mb3IiLAorICAgICAgICAgICAgICAgICJcdTkxRERcdTVDMEQgezR9IFx1NzUyMlx1NzUxRlx1NjcwOVx1NjU0OFx1NjcxRiB7M30gXHU1OTI5XHU3Njg0IHswfSBcdTRGNERcdTUxNDMgezF9IFx1OTFEMVx1OTQ3MFx1N0Q0NFx1NEVFNVx1NTNDQVx1ODFFQVx1NjIxMVx1N0MzRFx1N0Y3Mlx1NjE5MVx1OEI0OSAoezJ9KVxuXHQifSwKKyAgICAgICAgeyJFbnRlci5rZXkucGFzc3dvcmQuZm9yLmFsaWFzLiIsICJcdThGMzhcdTUxNjUgPHswfT4gXHU3Njg0XHU5MUQxXHU5NDcwXHU1QkM2XHU3OEJDIn0sCisgICAgICAgIHsiLlJFVFVSTi5pZi5zYW1lLmFzLmtleXN0b3JlLnBhc3N3b3JkLiIsCisgICAgICAgICAgICAgICAgIlx0KFJFVFVSTiBcdTU5ODJcdTY3OUNcdTU0OENcdTkxRDFcdTk0NzBcdTUxMzJcdTVCNThcdTVFQUJcdTVCQzZcdTc4QkNcdTc2RjhcdTU0MEMpOiAgIn0sCisgICAgICAgIHsiS2V5LnBhc3N3b3JkLmlzLnRvby5zaG9ydC5tdXN0LmJlLmF0LmxlYXN0LjYuY2hhcmFjdGVycyIsCisgICAgICAgICAgICAgICAgIlx1OTFEMVx1OTQ3MFx1NUJDNlx1NzhCQ1x1NTkyQVx1NzdFRCAtIFx1NUZDNVx1OTgwOFx1ODFGM1x1NUMxMVx1NzBCQSA2IFx1NTAwQlx1NUI1N1x1NTE0MyJ9LAorICAgICAgICB7IlRvby5tYW55LmZhaWx1cmVzLmtleS5ub3QuYWRkZWQudG8ua2V5c3RvcmUiLAorICAgICAgICAgICAgICAgICJcdTU5MkFcdTU5MUFcdTkzMkZcdThBQTQgLSBcdTkxRDFcdTk0NzBcdTY3MkFcdTY1QjBcdTU4OUVcdTgxRjNcdTkxRDFcdTk0NzBcdTUxMzJcdTVCNThcdTVFQUIifSwKKyAgICAgICAgeyJEZXN0aW5hdGlvbi5hbGlhcy5kZXN0LmFscmVhZHkuZXhpc3RzIiwKKyAgICAgICAgICAgICAgICAiXHU3NkVFXHU3Njg0XHU1NzMwXHU1MjI1XHU1NDBEIDx7MH0+IFx1NURGMlx1N0Q5M1x1NUI1OFx1NTcyOCJ9LAorICAgICAgICB7IlBhc3N3b3JkLmlzLnRvby5zaG9ydC5tdXN0LmJlLmF0LmxlYXN0LjYuY2hhcmFjdGVycyIsCisgICAgICAgICAgICAgICAgIlx1NUJDNlx1NzhCQ1x1NTkyQVx1NzdFRCAtIFx1NUZDNVx1OTgwOFx1ODFGM1x1NUMxMVx1NzBCQSA2IFx1NTAwQlx1NUI1N1x1NTE0MyJ9LAorICAgICAgICB7IlRvby5tYW55LmZhaWx1cmVzLktleS5lbnRyeS5ub3QuY2xvbmVkIiwKKyAgICAgICAgICAgICAgICAiXHU1OTJBXHU1OTFBXHU5MzJGXHU4QUE0XHUzMDAyXHU2NzJBXHU4OTA3XHU4OEZEXHU5MUQxXHU5NDcwXHU5ODA1XHU3NkVFIn0sCisgICAgICAgIHsia2V5LnBhc3N3b3JkLmZvci5hbGlhcy4iLCAiPHswfT4gXHU3Njg0XHU5MUQxXHU5NDcwXHU1QkM2XHU3OEJDIn0sCisgICAgICAgIHsiS2V5c3RvcmUuZW50cnkuZm9yLmlkLmdldE5hbWUuYWxyZWFkeS5leGlzdHMiLAorICAgICAgICAgICAgICAgICI8ezB9PiBcdTc2ODRcdTkxRDFcdTk0NzBcdTUxMzJcdTVCNThcdTVFQUJcdTk4MDVcdTc2RUVcdTVERjJcdTdEOTNcdTVCNThcdTU3MjgifSwKKyAgICAgICAgeyJDcmVhdGluZy5rZXlzdG9yZS5lbnRyeS5mb3IuaWQuZ2V0TmFtZS4iLAorICAgICAgICAgICAgICAgICJcdTVFRkFcdTdBQ0IgPHswfT4gXHU3Njg0XHU5MUQxXHU5NDcwXHU1MTMyXHU1QjU4XHU1RUFCXHU5ODA1XHU3NkVFLi4uIn0sCisgICAgICAgIHsiTm8uZW50cmllcy5mcm9tLmlkZW50aXR5LmRhdGFiYXNlLmFkZGVkIiwKKyAgICAgICAgICAgICAgICAiXHU2QzkyXHU2NzA5XHU2NUIwXHU1ODlFXHU0Rjg2XHU4MUVBXHU4QjU4XHU1MjI1XHU4Q0M3XHU2NTk5XHU1RUFCXHU3Njg0XHU5ODA1XHU3NkVFIn0sCisgICAgICAgIHsiQWxpYXMubmFtZS5hbGlhcyIsICJcdTUyMjVcdTU0MERcdTU0MERcdTdBMzE6IHswfSJ9LAorICAgICAgICB7IkNyZWF0aW9uLmRhdGUua2V5U3RvcmUuZ2V0Q3JlYXRpb25EYXRlLmFsaWFzLiIsCisgICAgICAgICAgICAgICAgIlx1NUVGQVx1N0FDQlx1NjVFNVx1NjcxRjogezAsZGF0ZX0ifSwKKyAgICAgICAgeyJhbGlhcy5rZXlTdG9yZS5nZXRDcmVhdGlvbkRhdGUuYWxpYXMuIiwKKyAgICAgICAgICAgICAgICAiezB9LCB7MSxkYXRlfSwgIn0sCisgICAgICAgIHsiYWxpYXMuIiwgInswfSwgIn0sCisgICAgICAgIHsiRW50cnkudHlwZS50eXBlLiIsICJcdTk4MDVcdTc2RUVcdTk4NUVcdTU3OEI6IHswfSJ9LAorICAgICAgICB7IkNlcnRpZmljYXRlLmNoYWluLmxlbmd0aC4iLCAiXHU2MTkxXHU4QjQ5XHU5M0M4XHU5NTc3XHU1RUE2OiAifSwKKyAgICAgICAgeyJDZXJ0aWZpY2F0ZS5pLjEuIiwgIlx1NjE5MVx1OEI0OSBbezAsbnVtYmVyLGludGVnZXJ9XToifSwKKyAgICAgICAgeyJDZXJ0aWZpY2F0ZS5maW5nZXJwcmludC5TSEExLiIsICJcdTYxOTFcdThCNDlcdTYzMDdcdTdEMEIgKFNIQTEpOiAifSwKKyAgICAgICAgeyJLZXlzdG9yZS50eXBlLiIsICJcdTkxRDFcdTk0NzBcdTUxMzJcdTVCNThcdTVFQUJcdTk4NUVcdTU3OEI6ICJ9LAorICAgICAgICB7IktleXN0b3JlLnByb3ZpZGVyLiIsICJcdTkxRDFcdTk0NzBcdTUxMzJcdTVCNThcdTVFQUJcdTYzRDBcdTRGOUJcdTgwMDU6ICJ9LAorICAgICAgICB7IllvdXIua2V5c3RvcmUuY29udGFpbnMua2V5U3RvcmUuc2l6ZS5lbnRyeSIsCisgICAgICAgICAgICAgICAgIlx1NjBBOFx1NzY4NFx1OTFEMVx1OTQ3MFx1NTEzMlx1NUI1OFx1NUVBQlx1NTMwNVx1NTQyQiB7MCxudW1iZXIsaW50ZWdlcn0gXHU5ODA1XHU3NkVFIn0sCisgICAgICAgIHsiWW91ci5rZXlzdG9yZS5jb250YWlucy5rZXlTdG9yZS5zaXplLmVudHJpZXMiLAorICAgICAgICAgICAgICAgICJcdTYwQThcdTc2ODRcdTkxRDFcdTk0NzBcdTUxMzJcdTVCNThcdTVFQUJcdTUzMDVcdTU0MkIgezAsbnVtYmVyLGludGVnZXJ9IFx1OTgwNVx1NzZFRSJ9LAorICAgICAgICB7IkZhaWxlZC50by5wYXJzZS5pbnB1dCIsICJcdTcxMjFcdTZDRDVcdTUyNTZcdTY3OTBcdThGMzhcdTUxNjUifSwKKyAgICAgICAgeyJFbXB0eS5pbnB1dCIsICJcdTdBN0FcdThGMzhcdTUxNjUifSwKKyAgICAgICAgeyJOb3QuWC41MDkuY2VydGlmaWNhdGUiLCAiXHU5NzVFIFguNTA5IFx1NjE5MVx1OEI0OSJ9LAorICAgICAgICB7ImFsaWFzLmhhcy5uby5wdWJsaWMua2V5IiwgInswfSBcdTcxMjFcdTUxNkNcdTk1OEJcdTkxRDFcdTk0NzAifSwKKyAgICAgICAgeyJhbGlhcy5oYXMubm8uWC41MDkuY2VydGlmaWNhdGUiLCAiezB9IFx1NzEyMSBYLjUwOSBcdTYxOTFcdThCNDkifSwKKyAgICAgICAgeyJOZXcuY2VydGlmaWNhdGUuc2VsZi5zaWduZWQuIiwgIlx1NjVCMFx1NjE5MVx1OEI0OSAoXHU4MUVBXHU2MjExXHU3QzNEXHU3RjcyKTogIn0sCisgICAgICAgIHsiUmVwbHkuaGFzLm5vLmNlcnRpZmljYXRlcyIsICJcdTU2REVcdTg5ODZcdTRFMERcdTU0MkJcdTYxOTFcdThCNDkifSwKKyAgICAgICAgeyJDZXJ0aWZpY2F0ZS5ub3QuaW1wb3J0ZWQuYWxpYXMuYWxpYXMuYWxyZWFkeS5leGlzdHMiLAorICAgICAgICAgICAgICAgICJcdTYxOTFcdThCNDlcdTY3MkFcdThGMzhcdTUxNjVcdUZGMENcdTUyMjVcdTU0MEQgPHswfT4gXHU1REYyXHU3RDkzXHU1QjU4XHU1NzI4In0sCisgICAgICAgIHsiSW5wdXQubm90LmFuLlguNTA5LmNlcnRpZmljYXRlIiwgIlx1OEYzOFx1NTE2NVx1NzY4NFx1NEUwRFx1NjYyRiBYLjUwOSBcdTYxOTFcdThCNDkifSwKKyAgICAgICAgeyJDZXJ0aWZpY2F0ZS5hbHJlYWR5LmV4aXN0cy5pbi5rZXlzdG9yZS51bmRlci5hbGlhcy50cnVzdGFsaWFzLiIsCisgICAgICAgICAgICAgICAgIlx1OTFEMVx1OTQ3MFx1NTEzMlx1NUI1OFx1NUVBQlx1NEUyRFx1NzY4NCA8ezB9PiBcdTUyMjVcdTU0MERcdTRFNEJcdTRFMEJcdUZGMENcdTYxOTFcdThCNDlcdTVERjJcdTdEOTNcdTVCNThcdTU3MjgifSwKKyAgICAgICAgeyJEby55b3Uuc3RpbGwud2FudC50by5hZGQuaXQubm8uIiwKKyAgICAgICAgICAgICAgICAiXHU2MEE4XHU0RUNEXHU3MTM2XHU2MEYzXHU4OTgxXHU1QzA3XHU0RTRCXHU2NUIwXHU1ODlFXHU1NUNFXHVGRjFGIFtcdTU0MjZdOiAgIn0sCisgICAgICAgIHsiQ2VydGlmaWNhdGUuYWxyZWFkeS5leGlzdHMuaW4uc3lzdGVtLndpZGUuQ0Eua2V5c3RvcmUudW5kZXIuYWxpYXMudHJ1c3RhbGlhcy4iLAorICAgICAgICAgICAgICAgICJcdTY1NzRcdTUwMEJcdTdDRkJcdTdENzEgQ0EgXHU5MUQxXHU5NDcwXHU1MTMyXHU1QjU4XHU1RUFCXHU0RTJEXHU3Njg0IDx7MH0+IFx1NTIyNVx1NTQwRFx1NEU0Qlx1NEUwQlx1RkYwQ1x1NjE5MVx1OEI0OVx1NURGMlx1N0Q5M1x1NUI1OFx1NTcyOCJ9LAorICAgICAgICB7IkRvLnlvdS5zdGlsbC53YW50LnRvLmFkZC5pdC50by55b3VyLm93bi5rZXlzdG9yZS5uby4iLAorICAgICAgICAgICAgICAgICJcdTYwQThcdTRFQ0RcdTcxMzZcdTYwRjNcdTg5ODFcdTVDMDdcdTRFNEJcdTY1QjBcdTU4OUVcdTgxRjNcdTgxRUFcdTVERjFcdTc2ODRcdTkxRDFcdTk0NzBcdTUxMzJcdTVCNThcdTVFQUJcdTU1Q0VcdUZGMUYgW1x1NTQyNl06ICAifSwKKyAgICAgICAgeyJUcnVzdC50aGlzLmNlcnRpZmljYXRlLm5vLiIsICJcdTRGRTFcdTRFRkJcdTkwMTlcdTUwMEJcdTYxOTFcdThCNDlcdUZGMUYgW1x1NTQyNl06ICAifSwKKyAgICAgICAgeyJZRVMiLCAiXHU2NjJGIn0sCisgICAgICAgIHsiTmV3LnByb21wdC4iLCAiXHU2NUIwIHswfTogIn0sCisgICAgICAgIHsiUGFzc3dvcmRzLm11c3QuZGlmZmVyIiwgIlx1NUZDNVx1OTgwOFx1NjYyRlx1NEUwRFx1NTQwQ1x1NzY4NFx1NUJDNlx1NzhCQyJ9LAorICAgICAgICB7IlJlLmVudGVyLm5ldy5wcm9tcHQuIiwgIlx1OTFDRFx1NjVCMFx1OEYzOFx1NTE2NVx1NjVCMCB7MH06ICJ9LAorICAgICAgICB7IlJlLmVudGVyLm5ldy5wYXNzd29yZC4iLCAiXHU5MUNEXHU2NUIwXHU4RjM4XHU1MTY1XHU2NUIwXHU1QkM2XHU3OEJDOiAifSwKKyAgICAgICAgeyJUaGV5LmRvbi50Lm1hdGNoLlRyeS5hZ2FpbiIsICJcdTVCODNcdTUwMTFcdTRFMERcdTc2RjhcdTdCMjZcdTMwMDJcdThBQ0JcdTkxQ0RcdThBNjYifSwKKyAgICAgICAgeyJFbnRlci5wcm9tcHQuYWxpYXMubmFtZS4iLCAiXHU4RjM4XHU1MTY1IHswfSBcdTUyMjVcdTU0MERcdTU0MERcdTdBMzE6ICAifSwKKyAgICAgICAgeyJFbnRlci5uZXcuYWxpYXMubmFtZS5SRVRVUk4udG8uY2FuY2VsLmltcG9ydC5mb3IudGhpcy5lbnRyeS4iLAorICAgICAgICAgICAgICAgICAiXHU4QUNCXHU4RjM4XHU1MTY1XHU2NUIwXHU3Njg0XHU1MjI1XHU1NDBEXHU1NDBEXHU3QTMxXHQoUkVUVVJOIFx1NEVFNVx1NTNENlx1NkQ4OFx1NTMyRlx1NTE2NVx1NkI2NFx1OTgwNVx1NzZFRSk6In0sCisgICAgICAgIHsiRW50ZXIuYWxpYXMubmFtZS4iLCAiXHU4RjM4XHU1MTY1XHU1MjI1XHU1NDBEXHU1NDBEXHU3QTMxOiAgIn0sCisgICAgICAgIHsiLlJFVFVSTi5pZi5zYW1lLmFzLmZvci5vdGhlckFsaWFzLiIsCisgICAgICAgICAgICAgICAgIlx0KFJFVFVSTiBcdTU5ODJcdTY3OUNcdTU0OEMgPHswfT4gXHU3Njg0XHU3NkY4XHU1NDBDKSJ9LAorICAgICAgICB7Ii5QQVRURVJOLnByaW50WDUwOUNlcnQiLAorICAgICAgICAgICAgICAgICJcdTY0QzFcdTY3MDlcdTgwMDU6IHswfVxuXHU3NjdDXHU1MUZBXHU4MDA1OiB7MX1cblx1NUU4Rlx1ODY1RjogezJ9XG5cdTY3MDlcdTY1NDhcdTY3MUZcdTgxRUE6IHszfSBcdTUyMzA6IHs0fVxuXHU2MTkxXHU4QjQ5XHU2MzA3XHU3RDBCOlxuXHQgTUQ1OiAgezV9XG5cdCBTSEExOiB7Nn1cblx0IFNIQTI1Njogezd9XG5cdCBcdTdDM0RcdTdBRTBcdTZGMTRcdTdCOTdcdTZDRDVcdTU0MERcdTdBMzE6IHs4fVxuXHQgXHU3MjQ4XHU2NzJDOiB7OX0ifSwKKyAgICAgICAgeyJXaGF0LmlzLnlvdXIuZmlyc3QuYW5kLmxhc3QubmFtZS4iLAorICAgICAgICAgICAgICAgICJcdTYwQThcdTc2ODRcdTU0MERcdTVCNTdcdTgyMDdcdTU5RDNcdTZDMEZcdTcwQkFcdTRGNTVcdUZGMUYifSwKKyAgICAgICAgeyJXaGF0LmlzLnRoZS5uYW1lLm9mLnlvdXIub3JnYW5pemF0aW9uYWwudW5pdC4iLAorICAgICAgICAgICAgICAgICJcdTYwQThcdTc2ODRcdTdENDRcdTdFNTRcdTU1QUVcdTRGNERcdTU0MERcdTdBMzFcdTcwQkFcdTRGNTVcdUZGMUYifSwKKyAgICAgICAgeyJXaGF0LmlzLnRoZS5uYW1lLm9mLnlvdXIub3JnYW5pemF0aW9uLiIsCisgICAgICAgICAgICAgICAgIlx1NjBBOFx1NzY4NFx1N0Q0NFx1N0U1NFx1NTQwRFx1N0EzMVx1NzBCQVx1NEY1NVx1RkYxRiJ9LAorICAgICAgICB7IldoYXQuaXMudGhlLm5hbWUub2YueW91ci5DaXR5Lm9yLkxvY2FsaXR5LiIsCisgICAgICAgICAgICAgICAgIlx1NjBBOFx1NjI0MFx1NTcyOFx1NzY4NFx1NTdDRVx1NUUwMlx1NjIxNlx1NTczMFx1NTM0MFx1NTQwRFx1N0EzMVx1NzBCQVx1NEY1NVx1RkYxRiJ9LAorICAgICAgICB7IldoYXQuaXMudGhlLm5hbWUub2YueW91ci5TdGF0ZS5vci5Qcm92aW5jZS4iLAorICAgICAgICAgICAgICAgICJcdTYwQThcdTYyNDBcdTU3MjhcdTc2ODRcdTVEREVcdTUzQ0FcdTc3MDFcdTRFRkRcdTU0MERcdTdBMzFcdTcwQkFcdTRGNTVcdUZGMUYifSwKKyAgICAgICAgeyJXaGF0LmlzLnRoZS50d28ubGV0dGVyLmNvdW50cnkuY29kZS5mb3IudGhpcy51bml0LiIsCisgICAgICAgICAgICAgICAgIlx1NkI2NFx1NTVBRVx1NEY0RFx1NzY4NFx1NTE2OVx1NTAwQlx1NUI1N1x1NkJDRFx1NTcwQlx1NTIyNVx1NEVFM1x1NzhCQ1x1NzBCQVx1NEY1NVx1RkYxRiJ9LAorICAgICAgICB7IklzLm5hbWUuY29ycmVjdC4iLCAiezB9IFx1NkI2M1x1NzhCQVx1NTVDRVx1RkYxRiJ9LAorICAgICAgICB7Im5vIiwgIlx1NTQyNiJ9LAorICAgICAgICB7InllcyIsICJcdTY2MkYifSwKKyAgICAgICAgeyJ5IiwgInkifSwKKyAgICAgICAgeyIuZGVmYXVsdFZhbHVlLiIsICIgIFt7MH1dOiAgIn0sCisgICAgICAgIHsiQWxpYXMuYWxpYXMuaGFzLm5vLmtleSIsCisgICAgICAgICAgICAgICAgIlx1NTIyNVx1NTQwRCA8ezB9PiBcdTZDOTJcdTY3MDlcdTkxRDFcdTk0NzAifSwKKyAgICAgICAgeyJBbGlhcy5hbGlhcy5yZWZlcmVuY2VzLmFuLmVudHJ5LnR5cGUudGhhdC5pcy5ub3QuYS5wcml2YXRlLmtleS5lbnRyeS5UaGUua2V5Y2xvbmUuY29tbWFuZC5vbmx5LnN1cHBvcnRzLmNsb25pbmcub2YucHJpdmF0ZS5rZXkiLAorICAgICAgICAgICAgICAgICAiXHU1MjI1XHU1NDBEIDx7MH0+IFx1NjI0MFx1NTNDM1x1NzE2N1x1NzY4NFx1OTgwNVx1NzZFRVx1NEUwRFx1NjYyRlx1NzlDMVx1NUJDNlx1OTFEMVx1OTQ3MFx1OTg1RVx1NTc4Qlx1MzAwMi1rZXljbG9uZSBcdTU0N0RcdTRFRTRcdTUwQzVcdTY1MkZcdTYzRjRcdTc5QzFcdTVCQzZcdTkxRDFcdTk0NzBcdTk4MDVcdTc2RUVcdTc2ODRcdTg5MDdcdTg4RkQifSwKKworICAgICAgICB7Ii5XQVJOSU5HLldBUk5JTkcuV0FSTklORy4iLAorICAgICAgICAgICAgIioqKioqKioqKioqKioqKioqICBcdThCNjZcdTU0NEEgXHU4QjY2XHU1NDRBIFx1OEI2Nlx1NTQ0QSAgKioqKioqKioqKioqKioqKioifSwKKyAgICAgICAgeyJTaWduZXIuZC4iLCAiXHU3QzNEXHU3RjcyXHU4MDA1ICMlZDoifSwKKyAgICAgICAgeyJUaW1lc3RhbXAuIiwgIlx1NjY0Mlx1NjIzMzoifSwKKyAgICAgICAgeyJTaWduYXR1cmUuIiwgIlx1N0MzRFx1N0FFMDoifSwKKyAgICAgICAgeyJDUkxzLiIsICJDUkw6In0sCisgICAgICAgIHsiQ2VydGlmaWNhdGUub3duZXIuIiwgIlx1NjE5MVx1OEI0OVx1NjRDMVx1NjcwOVx1ODAwNTogIn0sCisgICAgICAgIHsiTm90LmEuc2lnbmVkLmphci5maWxlIiwgIlx1NEUwRFx1NjYyRlx1N0MzRFx1N0Y3Mlx1NzY4NCBqYXIgXHU2QTk0XHU2ODQ4In0sCisgICAgICAgIHsiTm8uY2VydGlmaWNhdGUuZnJvbS50aGUuU1NMLnNlcnZlciIsCisgICAgICAgICAgICAgICAgIlx1NkM5Mlx1NjcwOVx1NEY4Nlx1ODFFQSBTU0wgXHU0RjNBXHU2NzBEXHU1NjY4XHU3Njg0XHU2MTkxXHU4QjQ5In0sCisKKyAgICAgICAgeyIuVGhlLmludGVncml0eS5vZi50aGUuaW5mb3JtYXRpb24uc3RvcmVkLmluLnlvdXIua2V5c3RvcmUuIiwKKyAgICAgICAgICAgICIqIFx1NUMxQVx1NjcyQVx1OUE1N1x1OEI0OVx1NTEzMlx1NUI1OFx1NjVCQ1x1OTFEMVx1OTQ3MFx1NTEzMlx1NUI1OFx1NUVBQlx1NEUyRFx1OENDN1x1OEEwQSAgKlxuKiBcdTc2ODRcdTVCOENcdTY1NzRcdTYwMjdcdUZGMDFcdTgyRTVcdTg5ODFcdTlBNTdcdThCNDlcdTUxNzZcdTVCOENcdTY1NzRcdTYwMjdcdUZGMEMqXG4qIFx1NjBBOFx1NUZDNVx1OTgwOFx1NjNEMFx1NEY5Qlx1NjBBOFx1NzY4NFx1OTFEMVx1OTQ3MFx1NTEzMlx1NUI1OFx1NUVBQlx1NUJDNlx1NzhCQ1x1MzAwMiAgICAgICAgICAgICAgICAgICoifSwKKyAgICAgICAgeyIuVGhlLmludGVncml0eS5vZi50aGUuaW5mb3JtYXRpb24uc3RvcmVkLmluLnRoZS5zcmNrZXlzdG9yZS4iLAorICAgICAgICAgICAgIiogXHU1QzFBXHU2NzJBXHU5QTU3XHU4QjQ5XHU1MTMyXHU1QjU4XHU2NUJDIHNyY2tleXN0b3JlIFx1NEUyRFx1OENDN1x1OEEwQSpcbiogXHU3Njg0XHU1QjhDXHU2NTc0XHU2MDI3XHVGRjAxXHU4MkU1XHU4OTgxXHU5QTU3XHU4QjQ5XHU1MTc2XHU1QjhDXHU2NTc0XHU2MDI3XHVGRjBDXHU2MEE4XHU1RkM1XHU5ODA4ICpcbiogXHU2M0QwXHU0RjlCIHNyY2tleXN0b3JlIFx1NUJDNlx1NzhCQ1x1MzAwMiAgICAgICAgICAqIn0sCisKKyAgICAgICAgeyJDZXJ0aWZpY2F0ZS5yZXBseS5kb2VzLm5vdC5jb250YWluLnB1YmxpYy5rZXkuZm9yLmFsaWFzLiIsCisgICAgICAgICAgICAgICAgIlx1NjE5MVx1OEI0OVx1NTZERVx1ODk4Nlx1NEUyNlx1NjcyQVx1NTMwNVx1NTQyQiA8ezB9PiBcdTc2ODRcdTUxNkNcdTk1OEJcdTkxRDFcdTk0NzAifSwKKyAgICAgICAgeyJJbmNvbXBsZXRlLmNlcnRpZmljYXRlLmNoYWluLmluLnJlcGx5IiwKKyAgICAgICAgICAgICAgICAiXHU1NkRFXHU4OTg2XHU2NjQyXHU3Njg0XHU2MTkxXHU4QjQ5XHU5M0M4XHU0RTBEXHU1QjhDXHU2NTc0In0sCisgICAgICAgIHsiQ2VydGlmaWNhdGUuY2hhaW4uaW4ucmVwbHkuZG9lcy5ub3QudmVyaWZ5LiIsCisgICAgICAgICAgICAgICAgIlx1NTZERVx1ODk4Nlx1NjY0Mlx1NzY4NFx1NjE5MVx1OEI0OVx1OTNDOFx1NjcyQVx1OUE1N1x1OEI0OTogIn0sCisgICAgICAgIHsiVG9wLmxldmVsLmNlcnRpZmljYXRlLmluLnJlcGx5LiIsCisgICAgICAgICAgICAgICAgIlx1NTZERVx1ODk4Nlx1NjY0Mlx1NzY4NFx1NjcwMFx1OUFEOFx1N0QxQVx1NjE5MVx1OEI0OTpcXG4ifSwKKyAgICAgICAgeyIuaXMubm90LnRydXN0ZWQuIiwgIi4uLiBcdTY2MkZcdTRFMERcdTg4QUJcdTRGRTFcdTRFRkJcdTc2ODRcdTMwMDIifSwKKyAgICAgICAgeyJJbnN0YWxsLnJlcGx5LmFueXdheS5uby4iLCAiXHU5MDg0XHU2NjJGXHU4OTgxXHU1Qjg5XHU4OEREXHU1NkRFXHU4OTg2XHVGRjFGIFtcdTU0MjZdOiAgIn0sCisgICAgICAgIHsiTk8iLCAiXHU1NDI2In0sCisgICAgICAgIHsiUHVibGljLmtleXMuaW4ucmVwbHkuYW5kLmtleXN0b3JlLmRvbi50Lm1hdGNoIiwKKyAgICAgICAgICAgICAgICAiXHU1NkRFXHU4OTg2XHU2NjQyXHU3Njg0XHU1MTZDXHU5NThCXHU5MUQxXHU5NDcwXHU4MjA3XHU5MUQxXHU5NDcwXHU1MTMyXHU1QjU4XHU1RUFCXHU0RTBEXHU3QjI2In0sCisgICAgICAgIHsiQ2VydGlmaWNhdGUucmVwbHkuYW5kLmNlcnRpZmljYXRlLmluLmtleXN0b3JlLmFyZS5pZGVudGljYWwiLAorICAgICAgICAgICAgICAgICJcdTYxOTFcdThCNDlcdTU2REVcdTg5ODZcdTgyMDdcdTkxRDFcdTk0NzBcdTUxMzJcdTVCNThcdTVFQUJcdTRFMkRcdTc2ODRcdTYxOTFcdThCNDlcdTY2MkZcdTc2RjhcdTU0MENcdTc2ODQifSwKKyAgICAgICAgeyJGYWlsZWQudG8uZXN0YWJsaXNoLmNoYWluLmZyb20ucmVwbHkiLAorICAgICAgICAgICAgICAgICJcdTcxMjFcdTZDRDVcdTVGOUVcdTU2REVcdTg5ODZcdTRFMkRcdTVDMDdcdTkzQzhcdTVFRkFcdTdBQ0JcdThENzdcdTRGODYifSwKKyAgICAgICAgeyJuIiwgIm4ifSwKKyAgICAgICAgeyJXcm9uZy5hbnN3ZXIudHJ5LmFnYWluIiwgIlx1OTMyRlx1OEFBNFx1NzY4NFx1N0I1NFx1Njg0OFx1RkYwQ1x1OEFDQlx1NTE4RFx1OEE2Nlx1NEUwMFx1NkIyMSJ9LAorICAgICAgICB7IlNlY3JldC5rZXkubm90LmdlbmVyYXRlZC5hbGlhcy5hbGlhcy5hbHJlYWR5LmV4aXN0cyIsCisgICAgICAgICAgICAgICAgIlx1NjcyQVx1NzUyMlx1NzUxRlx1NzlEOFx1NUJDNlx1OTFEMVx1OTQ3MFx1RkYwQ1x1NTIyNVx1NTQwRCA8ezB9PiBcdTVERjJcdTVCNThcdTU3MjgifSwKKyAgICAgICAgeyJQbGVhc2UucHJvdmlkZS5rZXlzaXplLmZvci5zZWNyZXQua2V5LmdlbmVyYXRpb24iLAorICAgICAgICAgICAgICAgICJcdThBQ0JcdTYzRDBcdTRGOUIgLWtleXNpemUgXHU0RUU1XHU3NTIyXHU3NTFGXHU3OUQ4XHU1QkM2XHU5MUQxXHU5NDcwIn0sCisKKyAgICAgICAgeyJFeHRlbnNpb25zLiIsICJcdTY0RjRcdTUxNDVcdTU5NTdcdTRFRjY6ICJ9LAorICAgICAgICB7Ii5FbXB0eS52YWx1ZS4iLCAiKFx1N0E3QVx1NzY3RFx1NTAzQykifSwKKyAgICAgICAgeyJFeHRlbnNpb24uUmVxdWVzdC4iLCAiXHU2NEY0XHU1MTQ1XHU1OTU3XHU0RUY2XHU4OTgxXHU2QzQyOiJ9LAorICAgICAgICB7IlBLQ1MuMTAuQ2VydGlmaWNhdGUuUmVxdWVzdC5WZXJzaW9uLjEuMC5TdWJqZWN0LnMuUHVibGljLktleS5zLmZvcm1hdC5zLmtleS4iLAorICAgICAgICAgICAgICAgICJQS0NTICMxMCBcdTYxOTFcdThCNDlcdTg5ODFcdTZDNDIgKFx1NzI0OFx1NjcyQyAxLjApXG5cdTRFM0JcdTlBRDQ6ICVzXG5cdTUxNkNcdTc1MjhcdTkxRDFcdTk0NzA6ICVzIFx1NjgzQ1x1NUYwRiAlcyBcdTkxRDFcdTk0NzBcbiJ9LAorICAgICAgICB7IlVua25vd24ua2V5VXNhZ2UudHlwZS4iLCAiXHU0RTBEXHU2NjBFXHU3Njg0IGtleVVzYWdlIFx1OTg1RVx1NTc4QjogIn0sCisgICAgICAgIHsiVW5rbm93bi5leHRlbmRlZGtleVVzYWdlLnR5cGUuIiwgIlx1NEUwRFx1NjYwRVx1NzY4NCBleHRlbmRlZGtleVVzYWdlIFx1OTg1RVx1NTc4QjogIn0sCisgICAgICAgIHsiVW5rbm93bi5BY2Nlc3NEZXNjcmlwdGlvbi50eXBlLiIsICJcdTRFMERcdTY2MEVcdTc2ODQgQWNjZXNzRGVzY3JpcHRpb24gXHU5ODVFXHU1NzhCOiAifSwKKyAgICAgICAgeyJVbnJlY29nbml6ZWQuR2VuZXJhbE5hbWUudHlwZS4iLCAiXHU3MTIxXHU2Q0Q1XHU4RkE4XHU4QjU4XHU3Njg0IEdlbmVyYWxOYW1lIFx1OTg1RVx1NTc4QjogIn0sCisgICAgICAgIHsiVGhpcy5leHRlbnNpb24uY2Fubm90LmJlLm1hcmtlZC5hcy5jcml0aWNhbC4iLAorICAgICAgICAgICAgICAgICAiXHU2QjY0XHU2NEY0XHU1MTQ1XHU1OTU3XHU0RUY2XHU3MTIxXHU2Q0Q1XHU2QTE5XHU3OTNBXHU3MEJBXHU5NURDXHU5Mzc1XHUzMDAyIn0sCisgICAgICAgIHsiT2RkLm51bWJlci5vZi5oZXguZGlnaXRzLmZvdW5kLiIsICJcdTYyN0VcdTUyMzBcdTUzNDFcdTUxNkRcdTkwMzJcdTRGNERcdTY1NzhcdTVCNTdcdTc2ODRcdTU5NDdcdTY1Nzg6ICJ9LAorICAgICAgICB7IlVua25vd24uZXh0ZW5zaW9uLnR5cGUuIiwgIlx1NEUwRFx1NjYwRVx1NzY4NFx1NjRGNFx1NTE0NVx1NTk1N1x1NEVGNlx1OTg1RVx1NTc4QjogIn0sCisgICAgICAgIHsiY29tbWFuZC57MH0uaXMuYW1iaWd1b3VzLiIsICJcdTU0N0RcdTRFRTQgezB9IFx1NEUwRFx1NjYwRVx1NzhCQToifQorICAgIH07CisKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGNvbnRlbnRzIG9mIHRoaXMgPGNvZGU+UmVzb3VyY2VCdW5kbGU8L2NvZGU+LgorICAgICAqCisgICAgICogPHA+CisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBjb250ZW50cyBvZiB0aGlzIDxjb2RlPlJlc291cmNlQnVuZGxlPC9jb2RlPi4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0W11bXSBnZXRDb250ZW50cygpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRlbnRzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdG9vbHMva2V5dG9vbC9SZXNvdXJjZXNfemhfVFcuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdG9vbHMva2V5dG9vbC9SZXNvdXJjZXNfemhfVFcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzdiZGY1Ci0tLSAvZGV2L251bGwKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS90b29scy9rZXl0b29sL1Jlc291cmNlc196aF9UVy5qYXZhCkBAIC0wLDAgKzEsNDMxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBPcmFjbGUgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKKyAqIHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIHN1bi5zZWN1cml0eS50b29scy5rZXl0b29sOworCisvKioKKyAqIDxwPiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIDxjb2RlPlJlc291cmNlQnVuZGxlPC9jb2RlPgorICogZm9yIHRoZSBrZXl0b29sLgorICoKKyAqLworcHVibGljIGNsYXNzIFJlc291cmNlc196aF9UVyBleHRlbmRzIGphdmEudXRpbC5MaXN0UmVzb3VyY2VCdW5kbGUgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W11bXSBjb250ZW50cyA9IHsKKyAgICAgICAgeyJORVdMSU5FIiwgIlxuIn0sCisgICAgICAgIHsiU1RBUiIsCisgICAgICAgICAgICAgICAgIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioifSwKKyAgICAgICAgeyJTVEFSTk4iLAorICAgICAgICAgICAgICAgICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cbiJ9LAorCisgICAgICAgIC8vIGtleXRvb2w6IEhlbHAgcGFydAorLy8gIk9wdGlvbiIgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCisgICAgICAgIHsiLk9QVElPTi4iLCAiIFtcdTkwNzhcdTk4MDVdLi4uIn0sCisgICAgICAgIHsiT3B0aW9ucy4iLCAiXHU5MDc4XHU5ODA1OiJ9LAorICAgICAgICB7IlVzZS5rZXl0b29sLmhlbHAuZm9yLmFsbC5hdmFpbGFibGUuY29tbWFuZHMiLAorICAgICAgICAgICAgICAgICAiXHU0RjdGXHU3NTI4IFwia2V5dG9vbCAtaGVscFwiIFx1NTNENlx1NUY5N1x1NjI0MFx1NjcwOVx1NTNFRlx1NzUyOFx1NzY4NFx1NTQ3RFx1NEVFNCJ9LAorICAgICAgICB7IktleS5hbmQuQ2VydGlmaWNhdGUuTWFuYWdlbWVudC5Ub29sIiwKKyAgICAgICAgICAgICAgICAgIlx1OTFEMVx1OTQ3MFx1ODIwN1x1NjE5MVx1OEI0OVx1N0JBMVx1NzQwNlx1NURFNVx1NTE3NyJ9LAorICAgICAgICB7IkNvbW1hbmRzLiIsICJcdTU0N0RcdTRFRTQ6In0sCisgICAgICAgIHsiVXNlLmtleXRvb2wuY29tbWFuZC5uYW1lLmhlbHAuZm9yLnVzYWdlLm9mLmNvbW1hbmQubmFtZSIsCisgICAgICAgICAgICAgICAgIlx1NEY3Rlx1NzUyOCBcImtleXRvb2wgLWNvbW1hbmRfbmFtZSAtaGVscFwiIFx1NTNENlx1NUY5NyBjb21tYW5kX25hbWUgXHU3Njg0XHU3NTI4XHU2Q0Q1In0sCisgICAgICAgIC8vIGtleXRvb2w6IGhlbHA6IGNvbW1hbmRzCisgICAgICAgIHsiR2VuZXJhdGVzLmEuY2VydGlmaWNhdGUucmVxdWVzdCIsCisgICAgICAgICAgICAgICAgIlx1NzUyMlx1NzUxRlx1NjE5MVx1OEI0OVx1ODk4MVx1NkM0MiJ9LCAvLy1jZXJ0cmVxCisgICAgICAgIHsiQ2hhbmdlcy5hbi5lbnRyeS5zLmFsaWFzIiwKKyAgICAgICAgICAgICAgICAiXHU4QjhBXHU2NkY0XHU5ODA1XHU3NkVFXHU3Njg0XHU1MjI1XHU1NDBEIn0sIC8vLWNoYW5nZWFsaWFzCisgICAgICAgIHsiRGVsZXRlcy5hbi5lbnRyeSIsCisgICAgICAgICAgICAgICAgIlx1NTIyQVx1OTY2NFx1OTgwNVx1NzZFRSJ9LCAvLy1kZWxldGUKKyAgICAgICAgeyJFeHBvcnRzLmNlcnRpZmljYXRlIiwKKyAgICAgICAgICAgICAgICAiXHU1MzJGXHU1MUZBXHU2MTkxXHU4QjQ5In0sIC8vLWV4cG9ydGNlcnQKKyAgICAgICAgeyJHZW5lcmF0ZXMuYS5rZXkucGFpciIsCisgICAgICAgICAgICAgICAgIlx1NzUyMlx1NzUxRlx1OTFEMVx1OTQ3MFx1N0Q0NCJ9LCAvLy1nZW5rZXlwYWlyCisvLyB0cmFuc2xhdGlvbiBvZiAic2VjcmV0IiBrZXkgc2hvdWxkIGJlIGRpZmZlcmVudCB0byAicHJpdmF0ZSIga2V5LgorICAgICAgICB7IkdlbmVyYXRlcy5hLnNlY3JldC5rZXkiLAorICAgICAgICAgICAgICAgICJcdTc1MjJcdTc1MUZcdTc5RDhcdTVCQzZcdTkxRDFcdTk0NzAifSwgLy8tZ2Vuc2Vja2V5CisgICAgICAgIHsiR2VuZXJhdGVzLmNlcnRpZmljYXRlLmZyb20uYS5jZXJ0aWZpY2F0ZS5yZXF1ZXN0IiwKKyAgICAgICAgICAgICAgICAiXHU1RjlFXHU2MTkxXHU4QjQ5XHU4OTgxXHU2QzQyXHU3NTIyXHU3NTFGXHU2MTkxXHU4QjQ5In0sIC8vLWdlbmNlcnQKKyAgICAgICAgeyJHZW5lcmF0ZXMuQ1JMIiwgIlx1NzUyMlx1NzUxRiBDUkwifSwgLy8tZ2VuY3JsCisgICAgICAgIHsiSW1wb3J0cy5lbnRyaWVzLmZyb20uYS5KREsuMS4xLnguc3R5bGUuaWRlbnRpdHkuZGF0YWJhc2UiLAorICAgICAgICAgICAgICAgICJcdTVGOUUgSkRLIDEuMS54LXN0eWxlIFx1OEI1OFx1NTIyNVx1OENDN1x1NjU5OVx1NUVBQlx1NTMyRlx1NTE2NVx1OTgwNVx1NzZFRSJ9LCAvLy1pZGVudGl0eWRiCisgICAgICAgIHsiSW1wb3J0cy5hLmNlcnRpZmljYXRlLm9yLmEuY2VydGlmaWNhdGUuY2hhaW4iLAorICAgICAgICAgICAgICAgICJcdTUzMkZcdTUxNjVcdTYxOTFcdThCNDlcdTYyMTZcdTYxOTFcdThCNDlcdTkzQzgifSwgLy8taW1wb3J0Y2VydAorICAgICAgICB7IkltcG9ydHMub25lLm9yLmFsbC5lbnRyaWVzLmZyb20uYW5vdGhlci5rZXlzdG9yZSIsCisgICAgICAgICAgICAgICAgIlx1NUY5RVx1NTE3Nlx1NEVENlx1OTFEMVx1OTQ3MFx1NTEzMlx1NUI1OFx1NUVBQlx1NTMyRlx1NTE2NVx1NEUwMFx1NTAwQlx1NjIxNlx1NTE2OFx1OTBFOFx1OTgwNVx1NzZFRSJ9LCAvLy1pbXBvcnRrZXlzdG9yZQorICAgICAgICB7IkNsb25lcy5hLmtleS5lbnRyeSIsCisgICAgICAgICAgICAgICAgIlx1ODkwN1x1ODhGRFx1OTFEMVx1OTQ3MFx1OTgwNVx1NzZFRSJ9LCAvLy1rZXljbG9uZQorICAgICAgICB7IkNoYW5nZXMudGhlLmtleS5wYXNzd29yZC5vZi5hbi5lbnRyeSIsCisgICAgICAgICAgICAgICAgIlx1OEI4QVx1NjZGNFx1OTgwNVx1NzZFRVx1NzY4NFx1OTFEMVx1OTQ3MFx1NUJDNlx1NzhCQyJ9LCAvLy1rZXlwYXNzd2QKKyAgICAgICAgeyJMaXN0cy5lbnRyaWVzLmluLmEua2V5c3RvcmUiLAorICAgICAgICAgICAgICAgICJcdTUyMTdcdTc5M0FcdTkxRDFcdTk0NzBcdTUxMzJcdTVCNThcdTVFQUJcdTRFMkRcdTc2ODRcdTk4MDVcdTc2RUUifSwgLy8tbGlzdAorICAgICAgICB7IlByaW50cy50aGUuY29udGVudC5vZi5hLmNlcnRpZmljYXRlIiwKKyAgICAgICAgICAgICAgICAiXHU1MjE3XHU1MzcwXHU2MTkxXHU4QjQ5XHU3Njg0XHU1MTY3XHU1QkI5In0sIC8vLXByaW50Y2VydAorICAgICAgICB7IlByaW50cy50aGUuY29udGVudC5vZi5hLmNlcnRpZmljYXRlLnJlcXVlc3QiLAorICAgICAgICAgICAgICAgICJcdTUyMTdcdTUzNzBcdTYxOTFcdThCNDlcdTg5ODFcdTZDNDJcdTc2ODRcdTUxNjdcdTVCQjkifSwgLy8tcHJpbnRjZXJ0cmVxCisgICAgICAgIHsiUHJpbnRzLnRoZS5jb250ZW50Lm9mLmEuQ1JMLmZpbGUiLAorICAgICAgICAgICAgICAgICJcdTUyMTdcdTUzNzAgQ1JMIFx1NkE5NFx1Njg0OFx1NzY4NFx1NTE2N1x1NUJCOSJ9LCAvLy1wcmludGNybAorICAgICAgICB7IkdlbmVyYXRlcy5hLnNlbGYuc2lnbmVkLmNlcnRpZmljYXRlIiwKKyAgICAgICAgICAgICAgICAiXHU3NTIyXHU3NTFGXHU4MUVBXHU4ODRDXHU3QzNEXHU3RjcyXHU3Njg0XHU2MTkxXHU4QjQ5In0sIC8vLXNlbGZjZXJ0CisgICAgICAgIHsiQ2hhbmdlcy50aGUuc3RvcmUucGFzc3dvcmQub2YuYS5rZXlzdG9yZSIsCisgICAgICAgICAgICAgICAgIlx1OEI4QVx1NjZGNFx1OTFEMVx1OTQ3MFx1NTEzMlx1NUI1OFx1NUVBQlx1NzY4NFx1NTEzMlx1NUI1OFx1NUJDNlx1NzhCQyJ9LCAvLy1zdG9yZXBhc3N3ZAorICAgICAgICAvLyBrZXl0b29sOiBoZWxwOiBvcHRpb25zCisgICAgICAgIHsiYWxpYXMubmFtZS5vZi50aGUuZW50cnkudG8ucHJvY2VzcyIsCisgICAgICAgICAgICAgICAgIlx1ODk4MVx1ODY1NVx1NzQwNlx1OTgwNVx1NzZFRVx1NzY4NFx1NTIyNVx1NTQwRFx1NTQwRFx1N0EzMSJ9LCAvLy1hbGlhcworICAgICAgICB7ImRlc3RpbmF0aW9uLmFsaWFzIiwKKyAgICAgICAgICAgICAgICAiXHU3NkVFXHU3Njg0XHU1NzMwXHU1MjI1XHU1NDBEIn0sIC8vLWRlc3RhbGlhcworICAgICAgICB7ImRlc3RpbmF0aW9uLmtleS5wYXNzd29yZCIsCisgICAgICAgICAgICAgICAgIlx1NzZFRVx1NzY4NFx1NTczMFx1OTFEMVx1OTQ3MFx1NUJDNlx1NzhCQyJ9LCAvLy1kZXN0a2V5cGFzcworICAgICAgICB7ImRlc3RpbmF0aW9uLmtleXN0b3JlLm5hbWUiLAorICAgICAgICAgICAgICAgICJcdTc2RUVcdTc2ODRcdTU3MzBcdTkxRDFcdTk0NzBcdTUxMzJcdTVCNThcdTVFQUJcdTU0MERcdTdBMzEifSwgLy8tZGVzdGtleXN0b3JlCisgICAgICAgIHsiZGVzdGluYXRpb24ua2V5c3RvcmUucGFzc3dvcmQucHJvdGVjdGVkIiwKKyAgICAgICAgICAgICAgICAiXHU3NkVFXHU3Njg0XHU1NzMwXHU5MUQxXHU5NDcwXHU1MTMyXHU1QjU4XHU1RUFCXHU1QkM2XHU3OEJDXHU0RkREXHU4Qjc3In0sIC8vLWRlc3Rwcm90ZWN0ZWQKKyAgICAgICAgeyJkZXN0aW5hdGlvbi5rZXlzdG9yZS5wcm92aWRlci5uYW1lIiwKKyAgICAgICAgICAgICAgICAiXHU3NkVFXHU3Njg0XHU1NzMwXHU5MUQxXHU5NDcwXHU1MTMyXHU1QjU4XHU1RUFCXHU2M0QwXHU0RjlCXHU4MDA1XHU1NDBEXHU3QTMxIn0sIC8vLWRlc3Rwcm92aWRlcm5hbWUKKyAgICAgICAgeyJkZXN0aW5hdGlvbi5rZXlzdG9yZS5wYXNzd29yZCIsCisgICAgICAgICAgICAgICAgIlx1NzZFRVx1NzY4NFx1NTczMFx1OTFEMVx1OTQ3MFx1NTEzMlx1NUI1OFx1NUVBQlx1NUJDNlx1NzhCQyJ9LCAvLy1kZXN0c3RvcmVwYXNzCisgICAgICAgIHsiZGVzdGluYXRpb24ua2V5c3RvcmUudHlwZSIsCisgICAgICAgICAgICAgICAgIlx1NzZFRVx1NzY4NFx1NTczMFx1OTFEMVx1OTQ3MFx1NTEzMlx1NUI1OFx1NUVBQlx1OTg1RVx1NTc4QiJ9LCAvLy1kZXN0c3RvcmV0eXBlCisgICAgICAgIHsiZGlzdGluZ3Vpc2hlZC5uYW1lIiwKKyAgICAgICAgICAgICAgICAiXHU4RkE4XHU1MjI1XHU1NDBEXHU3QTMxIn0sIC8vLWRuYW1lCisgICAgICAgIHsiWC41MDkuZXh0ZW5zaW9uIiwKKyAgICAgICAgICAgICAgICAiWC41MDkgXHU2NEY0XHU1MTQ1XHU1OTU3XHU0RUY2In0sIC8vLWV4dAorICAgICAgICB7Im91dHB1dC5maWxlLm5hbWUiLAorICAgICAgICAgICAgICAgICJcdThGMzhcdTUxRkFcdTZBOTRcdTY4NDhcdTU0MERcdTdBMzEifSwgLy8tZmlsZSBhbmQgLW91dGZpbGUKKyAgICAgICAgeyJpbnB1dC5maWxlLm5hbWUiLAorICAgICAgICAgICAgICAgICJcdThGMzhcdTUxNjVcdTZBOTRcdTY4NDhcdTU0MERcdTdBMzEifSwgLy8tZmlsZSBhbmQgLWluZmlsZQorICAgICAgICB7ImtleS5hbGdvcml0aG0ubmFtZSIsCisgICAgICAgICAgICAgICAgIlx1OTFEMVx1OTQ3MFx1NkYxNFx1N0I5N1x1NkNENVx1NTQwRFx1N0EzMSJ9LCAvLy1rZXlhbGcKKyAgICAgICAgeyJrZXkucGFzc3dvcmQiLAorICAgICAgICAgICAgICAgICJcdTkxRDFcdTk0NzBcdTVCQzZcdTc4QkMifSwgLy8ta2V5cGFzcworICAgICAgICB7ImtleS5iaXQuc2l6ZSIsCisgICAgICAgICAgICAgICAgIlx1OTFEMVx1OTQ3MFx1NEY0RFx1NTE0M1x1NTkyN1x1NUMwRiJ9LCAvLy1rZXlzaXplCisgICAgICAgIHsia2V5c3RvcmUubmFtZSIsCisgICAgICAgICAgICAgICAgIlx1OTFEMVx1OTQ3MFx1NTEzMlx1NUI1OFx1NUVBQlx1NTQwRFx1N0EzMSJ9LCAvLy1rZXlzdG9yZQorICAgICAgICB7Im5ldy5wYXNzd29yZCIsCisgICAgICAgICAgICAgICAgIlx1NjVCMFx1NUJDNlx1NzhCQyJ9LCAvLy1uZXcKKyAgICAgICAgeyJkby5ub3QucHJvbXB0IiwKKyAgICAgICAgICAgICAgICAiXHU0RTBEXHU4OTgxXHU2M0QwXHU3OTNBIn0sIC8vLW5vcHJvbXB0CisgICAgICAgIHsicGFzc3dvcmQudGhyb3VnaC5wcm90ZWN0ZWQubWVjaGFuaXNtIiwKKyAgICAgICAgICAgICAgICAiXHU3RDkzXHU3NTMxXHU0RkREXHU4Qjc3XHU2QTVGXHU1MjM2XHU3Njg0XHU1QkM2XHU3OEJDIn0sIC8vLXByb3RlY3RlZAorICAgICAgICB7InByb3ZpZGVyLmFyZ3VtZW50IiwKKyAgICAgICAgICAgICAgICAiXHU2M0QwXHU0RjlCXHU4MDA1XHU1RjE1XHU2NTc4In0sIC8vLXByb3ZpZGVyYXJnCisgICAgICAgIHsicHJvdmlkZXIuY2xhc3MubmFtZSIsCisgICAgICAgICAgICAgICAgIlx1NjNEMFx1NEY5Qlx1ODAwNVx1OTg1RVx1NTIyNVx1NTQwRFx1N0EzMSJ9LCAvLy1wcm92aWRlcmNsYXNzCisgICAgICAgIHsicHJvdmlkZXIubmFtZSIsCisgICAgICAgICAgICAgICAgIlx1NjNEMFx1NEY5Qlx1ODAwNVx1NTQwRFx1N0EzMSJ9LCAvLy1wcm92aWRlcm5hbWUKKyAgICAgICAgeyJwcm92aWRlci5jbGFzc3BhdGgiLAorICAgICAgICAgICAgICAgICJcdTYzRDBcdTRGOUJcdTgwMDVcdTk4NUVcdTUyMjVcdThERUZcdTVGOTEifSwgLy8tcHJvdmlkZXJwYXRoCisgICAgICAgIHsib3V0cHV0LmluLlJGQy5zdHlsZSIsCisgICAgICAgICAgICAgICAgIlx1NEVFNSBSRkMgXHU2QTIzXHU1RjBGXHU4RjM4XHU1MUZBIn0sIC8vLXJmYworICAgICAgICB7InNpZ25hdHVyZS5hbGdvcml0aG0ubmFtZSIsCisgICAgICAgICAgICAgICAgIlx1N0MzRFx1N0FFMFx1NkYxNFx1N0I5N1x1NkNENVx1NTQwRFx1N0EzMSJ9LCAvLy1zaWdhbGcKKyAgICAgICAgeyJzb3VyY2UuYWxpYXMiLAorICAgICAgICAgICAgICAgICJcdTRGODZcdTZFOTBcdTUyMjVcdTU0MEQifSwgLy8tc3JjYWxpYXMKKyAgICAgICAgeyJzb3VyY2Uua2V5LnBhc3N3b3JkIiwKKyAgICAgICAgICAgICAgICAiXHU0Rjg2XHU2RTkwXHU5MUQxXHU5NDcwXHU1QkM2XHU3OEJDIn0sIC8vLXNyY2tleXBhc3MKKyAgICAgICAgeyJzb3VyY2Uua2V5c3RvcmUubmFtZSIsCisgICAgICAgICAgICAgICAgIlx1NEY4Nlx1NkU5MFx1OTFEMVx1OTQ3MFx1NTEzMlx1NUI1OFx1NUVBQlx1NTQwRFx1N0EzMSJ9LCAvLy1zcmNrZXlzdG9yZQorICAgICAgICB7InNvdXJjZS5rZXlzdG9yZS5wYXNzd29yZC5wcm90ZWN0ZWQiLAorICAgICAgICAgICAgICAgICJcdTRGODZcdTZFOTBcdTkxRDFcdTk0NzBcdTUxMzJcdTVCNThcdTVFQUJcdTVCQzZcdTc4QkNcdTRGRERcdThCNzcifSwgLy8tc3JjcHJvdGVjdGVkCisgICAgICAgIHsic291cmNlLmtleXN0b3JlLnByb3ZpZGVyLm5hbWUiLAorICAgICAgICAgICAgICAgICJcdTRGODZcdTZFOTBcdTkxRDFcdTk0NzBcdTUxMzJcdTVCNThcdTVFQUJcdTYzRDBcdTRGOUJcdTgwMDVcdTU0MERcdTdBMzEifSwgLy8tc3JjcHJvdmlkZXJuYW1lCisgICAgICAgIHsic291cmNlLmtleXN0b3JlLnBhc3N3b3JkIiwKKyAgICAgICAgICAgICAgICAiXHU0Rjg2XHU2RTkwXHU5MUQxXHU5NDcwXHU1MTMyXHU1QjU4XHU1RUFCXHU1QkM2XHU3OEJDIn0sIC8vLXNyY3N0b3JlcGFzcworICAgICAgICB7InNvdXJjZS5rZXlzdG9yZS50eXBlIiwKKyAgICAgICAgICAgICAgICAiXHU0Rjg2XHU2RTkwXHU5MUQxXHU5NDcwXHU1MTMyXHU1QjU4XHU1RUFCXHU5ODVFXHU1NzhCIn0sIC8vLXNyY3N0b3JldHlwZQorICAgICAgICB7IlNTTC5zZXJ2ZXIuaG9zdC5hbmQucG9ydCIsCisgICAgICAgICAgICAgICAgIlNTTCBcdTRGM0FcdTY3MERcdTU2NjhcdTRFM0JcdTZBNUZcdTgyMDdcdTkwMjNcdTYzQTVcdTU3RTAifSwgLy8tc3Nsc2VydmVyCisgICAgICAgIHsic2lnbmVkLmphci5maWxlIiwKKyAgICAgICAgICAgICAgICAiXHU3QzNEXHU3RjcyXHU3Njg0IGphciBcdTZBOTRcdTY4NDgifSwgLy89amFyZmlsZQorICAgICAgICB7ImNlcnRpZmljYXRlLnZhbGlkaXR5LnN0YXJ0LmRhdGUudGltZSIsCisgICAgICAgICAgICAgICAgIlx1NjE5MVx1OEI0OVx1NjcwOVx1NjU0OFx1NjAyN1x1OTU4Qlx1NTlDQlx1NjVFNVx1NjcxRi9cdTY2NDJcdTk1OTMifSwgLy8tc3RhcnRkYXRlCisgICAgICAgIHsia2V5c3RvcmUucGFzc3dvcmQiLAorICAgICAgICAgICAgICAgICJcdTkxRDFcdTk0NzBcdTUxMzJcdTVCNThcdTVFQUJcdTVCQzZcdTc4QkMifSwgLy8tc3RvcmVwYXNzCisgICAgICAgIHsia2V5c3RvcmUudHlwZSIsCisgICAgICAgICAgICAgICAgIlx1OTFEMVx1OTQ3MFx1NTEzMlx1NUI1OFx1NUVBQlx1OTg1RVx1NTc4QiJ9LCAvLy1zdG9yZXR5cGUKKyAgICAgICAgeyJ0cnVzdC5jZXJ0aWZpY2F0ZXMuZnJvbS5jYWNlcnRzIiwKKyAgICAgICAgICAgICAgICAiXHU0Rjg2XHU4MUVBIGNhY2VydHMgXHU3Njg0XHU0RkUxXHU0RUZCXHU2MTkxXHU4QjQ5In0sIC8vLXRydXN0Y2FjZXJ0cworICAgICAgICB7InZlcmJvc2Uub3V0cHV0IiwKKyAgICAgICAgICAgICAgICAiXHU4QTczXHU3RDMwXHU4Q0M3XHU4QTBBXHU4RjM4XHU1MUZBIn0sIC8vLXYKKyAgICAgICAgeyJ2YWxpZGl0eS5udW1iZXIub2YuZGF5cyIsCisgICAgICAgICAgICAgICAgIlx1NjcwOVx1NjU0OFx1NjAyN1x1NjVFNVx1NjU3OCJ9LCAvLy12YWxpZGl0eQorICAgICAgICB7IlNlcmlhbC5JRC5vZi5jZXJ0LnRvLnJldm9rZSIsCisgICAgICAgICAgICAgICAgICJcdTg5ODFcdTY0QTRcdTkyQjdcdTYxOTFcdThCNDlcdTc2ODRcdTVFOEZcdTUyMTcgSUQifSwgLy8taWQKKyAgICAgICAgLy8ga2V5dG9vbDogUnVubmluZyBwYXJ0CisgICAgICAgIHsia2V5dG9vbC5lcnJvci4iLCAiXHU5MUQxXHU5NDcwXHU1REU1XHU1MTc3XHU5MzJGXHU4QUE0OiAifSwKKyAgICAgICAgeyJJbGxlZ2FsLm9wdGlvbi4iLCAiXHU3MTIxXHU2NTQ4XHU3Njg0XHU5MDc4XHU5ODA1OiJ9LAorICAgICAgICB7IklsbGVnYWwudmFsdWUuIiwgIlx1NzEyMVx1NjU0OFx1NTAzQzogIn0sCisgICAgICAgIHsiVW5rbm93bi5wYXNzd29yZC50eXBlLiIsICJcdTRFMERcdTY2MEVcdTc2ODRcdTVCQzZcdTc4QkNcdTk4NUVcdTU3OEI6ICJ9LAorICAgICAgICB7IkNhbm5vdC5maW5kLmVudmlyb25tZW50LnZhcmlhYmxlLiIsCisgICAgICAgICAgICAgICAgIlx1NjI3RVx1NEUwRFx1NTIzMFx1NzRCMFx1NTg4M1x1OEI4QVx1NjU3ODogIn0sCisgICAgICAgIHsiQ2Fubm90LmZpbmQuZmlsZS4iLCAiXHU2MjdFXHU0RTBEXHU1MjMwXHU2QTk0XHU2ODQ4OiAifSwKKyAgICAgICAgeyJDb21tYW5kLm9wdGlvbi5mbGFnLm5lZWRzLmFuLmFyZ3VtZW50LiIsICJcdTU0N0RcdTRFRTRcdTkwNzhcdTk4MDUgezB9IFx1OTcwMFx1ODk4MVx1NUYxNVx1NjU3OFx1MzAwMiJ9LAorICAgICAgICB7Ildhcm5pbmcuRGlmZmVyZW50LnN0b3JlLmFuZC5rZXkucGFzc3dvcmRzLm5vdC5zdXBwb3J0ZWQuZm9yLlBLQ1MxMi5LZXlTdG9yZXMuSWdub3JpbmcudXNlci5zcGVjaWZpZWQuY29tbWFuZC52YWx1ZS4iLAorICAgICAgICAgICAgICAgICJcdThCNjZcdTU0NEE6IFBLQ1MxMiBcdTkxRDFcdTk0NzBcdTUxMzJcdTVCNThcdTVFQUJcdTRFMERcdTY1MkZcdTYzRjRcdTRFMERcdTU0MENcdTc2ODRcdTUxMzJcdTVCNThcdTVFQUJcdTU0OENcdTkxRDFcdTk0NzBcdTVCQzZcdTc4QkNcdTMwMDJcdTVGRkRcdTc1NjVcdTRGN0ZcdTc1MjhcdTgwMDVcdTYzMDdcdTVCOUFcdTc2ODQgezB9IFx1NTAzQ1x1MzAwMiJ9LAorICAgICAgICB7Ii5rZXlzdG9yZS5tdXN0LmJlLk5PTkUuaWYuc3RvcmV0eXBlLmlzLnswfSIsCisgICAgICAgICAgICAgICAgIlx1NTk4Mlx1Njc5QyAtc3RvcmV0eXBlIFx1NzBCQSB7MH1cdUZGMENcdTUyNDcgLWtleXN0b3JlIFx1NUZDNVx1OTgwOFx1NzBCQSBOT05FIn0sCisgICAgICAgIHsiVG9vLm1hbnkucmV0cmllcy5wcm9ncmFtLnRlcm1pbmF0ZWQiLAorICAgICAgICAgICAgICAgICAiXHU5MUNEXHU4QTY2XHU2QjIxXHU2NTc4XHU1OTJBXHU1OTFBXHVGRjBDXHU3QTBCXHU1RjBGXHU1REYyXHU3RDQyXHU2QjYyIn0sCisgICAgICAgIHsiLnN0b3JlcGFzc3dkLmFuZC5rZXlwYXNzd2QuY29tbWFuZHMubm90LnN1cHBvcnRlZC5pZi5zdG9yZXR5cGUuaXMuezB9IiwKKyAgICAgICAgICAgICAgICAiXHU1OTgyXHU2NzlDIC1zdG9yZXR5cGUgXHU3MEJBIHswfVx1RkYwQ1x1NTI0N1x1NEUwRFx1NjUyRlx1NjNGNCAtc3RvcmVwYXNzd2QgXHU1NDhDIC1rZXlwYXNzd2QgXHU1NDdEXHU0RUU0In0sCisgICAgICAgIHsiLmtleXBhc3N3ZC5jb21tYW5kcy5ub3Quc3VwcG9ydGVkLmlmLnN0b3JldHlwZS5pcy5QS0NTMTIiLAorICAgICAgICAgICAgICAgICJcdTU5ODJcdTY3OUMgLXN0b3JldHlwZSBcdTcwQkEgUEtDUzEyXHVGRjBDXHU1MjQ3XHU0RTBEXHU2NTJGXHU2M0Y0IC1rZXlwYXNzd2QgXHU1NDdEXHU0RUU0In0sCisgICAgICAgIHsiLmtleXBhc3MuYW5kLm5ldy5jYW4ubm90LmJlLnNwZWNpZmllZC5pZi5zdG9yZXR5cGUuaXMuezB9IiwKKyAgICAgICAgICAgICAgICAiXHU1OTgyXHU2NzlDIC1zdG9yZXR5cGUgXHU3MEJBIHswfVx1RkYwQ1x1NTI0N1x1NEUwRFx1ODBGRFx1NjMwN1x1NUI5QSAta2V5cGFzcyBcdTU0OEMgLW5ldyJ9LAorICAgICAgICB7ImlmLnByb3RlY3RlZC5pcy5zcGVjaWZpZWQudGhlbi5zdG9yZXBhc3Mua2V5cGFzcy5hbmQubmV3Lm11c3Qubm90LmJlLnNwZWNpZmllZCIsCisgICAgICAgICAgICAgICAgIlx1NTk4Mlx1Njc5Q1x1NjMwN1x1NUI5QSAtcHJvdGVjdGVkXHVGRjBDXHU1MjQ3XHU0RTBEXHU4MEZEXHU2MzA3XHU1QjlBIC1zdG9yZXBhc3NcdTMwMDEta2V5cGFzcyBcdTU0OEMgLW5ldyJ9LAorICAgICAgICB7ImlmLnNyY3Byb3RlY3RlZC5pcy5zcGVjaWZpZWQudGhlbi5zcmNzdG9yZXBhc3MuYW5kLnNyY2tleXBhc3MubXVzdC5ub3QuYmUuc3BlY2lmaWVkIiwKKyAgICAgICAgICAgICAgICAiXHU1OTgyXHU2NzlDXHU2MzA3XHU1QjlBIC1zcmNwcm90ZWN0ZWRcdUZGMENcdTUyNDdcdTRFMERcdTgwRkRcdTYzMDdcdTVCOUEgLXNyY3N0b3JlcGFzcyBcdTU0OEMgLXNyY2tleXBhc3MifSwKKyAgICAgICAgeyJpZi5rZXlzdG9yZS5pcy5ub3QucGFzc3dvcmQucHJvdGVjdGVkLnRoZW4uc3RvcmVwYXNzLmtleXBhc3MuYW5kLm5ldy5tdXN0Lm5vdC5iZS5zcGVjaWZpZWQiLAorICAgICAgICAgICAgICAgICJcdTU5ODJcdTY3OUNcdTkxRDFcdTk0NzBcdTUxMzJcdTVCNThcdTVFQUJcdTRFMERcdTUzRDdcdTVCQzZcdTc4QkNcdTRGRERcdThCNzdcdUZGMENcdTUyNDdcdTRFMERcdTgwRkRcdTYzMDdcdTVCOUEgLXN0b3JlcGFzc1x1MzAwMS1rZXlwYXNzIFx1NTQ4QyAtbmV3In0sCisgICAgICAgIHsiaWYuc291cmNlLmtleXN0b3JlLmlzLm5vdC5wYXNzd29yZC5wcm90ZWN0ZWQudGhlbi5zcmNzdG9yZXBhc3MuYW5kLnNyY2tleXBhc3MubXVzdC5ub3QuYmUuc3BlY2lmaWVkIiwKKyAgICAgICAgICAgICAgICAiXHU1OTgyXHU2NzlDXHU0Rjg2XHU2RTkwXHU5MUQxXHU5NDcwXHU1MTMyXHU1QjU4XHU1RUFCXHU0RTBEXHU1M0Q3XHU1QkM2XHU3OEJDXHU0RkREXHU4Qjc3XHVGRjBDXHU1MjQ3XHU0RTBEXHU4MEZEXHU2MzA3XHU1QjlBIC1zcmNzdG9yZXBhc3MgXHU1NDhDIC1zcmNrZXlwYXNzIn0sCisgICAgICAgIHsiSWxsZWdhbC5zdGFydGRhdGUudmFsdWUiLCAiXHU3MTIxXHU2NTQ4XHU3Njg0IHN0YXJ0ZGF0ZSBcdTUwM0MifSwKKyAgICAgICAgeyJWYWxpZGl0eS5tdXN0LmJlLmdyZWF0ZXIudGhhbi56ZXJvIiwKKyAgICAgICAgICAgICAgICAiXHU2NzA5XHU2NTQ4XHU2MDI3XHU1RkM1XHU5ODA4XHU1OTI3XHU2NUJDXHU5NkY2In0sCisgICAgICAgIHsicHJvdk5hbWUubm90LmEucHJvdmlkZXIiLCAiezB9IFx1NEUwRFx1NjYyRlx1NEUwMFx1NTAwQlx1NjNEMFx1NEY5Qlx1ODAwNSJ9LAorICAgICAgICB7IlVzYWdlLmVycm9yLm5vLmNvbW1hbmQucHJvdmlkZWQiLCAiXHU3NTI4XHU2Q0Q1XHU5MzJGXHU4QUE0OiBcdTY3MkFcdTYzRDBcdTRGOUJcdTU0N0RcdTRFRTQifSwKKyAgICAgICAgeyJTb3VyY2Uua2V5c3RvcmUuZmlsZS5leGlzdHMuYnV0LmlzLmVtcHR5LiIsICJcdTRGODZcdTZFOTBcdTkxRDFcdTk0NzBcdTUxMzJcdTVCNThcdTVFQUJcdTZBOTRcdTY4NDhcdTVCNThcdTU3MjhcdUZGMENcdTRGNDZcdTcwQkFcdTdBN0E6ICJ9LAorICAgICAgICB7IlBsZWFzZS5zcGVjaWZ5LnNyY2tleXN0b3JlIiwgIlx1OEFDQlx1NjMwN1x1NUI5QSAtc3Jja2V5c3RvcmUifSwKKyAgICAgICAgeyJNdXN0Lm5vdC5zcGVjaWZ5LmJvdGgudi5hbmQucmZjLndpdGgubGlzdC5jb21tYW5kIiwKKyAgICAgICAgICAgICAgICAiICdsaXN0JyBcdTU0N0RcdTRFRTRcdTRFMERcdTgwRkRcdTU0MENcdTY2NDJcdTYzMDdcdTVCOUEgLXYgXHU1M0NBIC1yZmMifSwKKyAgICAgICAgeyJLZXkucGFzc3dvcmQubXVzdC5iZS5hdC5sZWFzdC42LmNoYXJhY3RlcnMiLAorICAgICAgICAgICAgICAgICJcdTkxRDFcdTk0NzBcdTVCQzZcdTc4QkNcdTVGQzVcdTk4MDhcdTgxRjNcdTVDMTFcdTcwQkEgNiBcdTUwMEJcdTVCNTdcdTUxNDMifSwKKyAgICAgICAgeyJOZXcucGFzc3dvcmQubXVzdC5iZS5hdC5sZWFzdC42LmNoYXJhY3RlcnMiLAorICAgICAgICAgICAgICAgICJcdTY1QjBcdTc2ODRcdTVCQzZcdTc4QkNcdTVGQzVcdTk4MDhcdTgxRjNcdTVDMTFcdTcwQkEgNiBcdTUwMEJcdTVCNTdcdTUxNDMifSwKKyAgICAgICAgeyJLZXlzdG9yZS5maWxlLmV4aXN0cy5idXQuaXMuZW1wdHkuIiwKKyAgICAgICAgICAgICAgICAiXHU5MUQxXHU5NDcwXHU1MTMyXHU1QjU4XHU1RUFCXHU2QTk0XHU2ODQ4XHU1QjU4XHU1NzI4XHVGRjBDXHU0RjQ2XHU3MEJBXHU3QTdBXHU3NjdEOiAifSwKKyAgICAgICAgeyJLZXlzdG9yZS5maWxlLmRvZXMubm90LmV4aXN0LiIsCisgICAgICAgICAgICAgICAgIlx1OTFEMVx1OTQ3MFx1NTEzMlx1NUI1OFx1NUVBQlx1NkE5NFx1Njg0OFx1NEUwRFx1NUI1OFx1NTcyODogIn0sCisgICAgICAgIHsiTXVzdC5zcGVjaWZ5LmRlc3RpbmF0aW9uLmFsaWFzIiwgIlx1NUZDNVx1OTgwOFx1NjMwN1x1NUI5QVx1NzZFRVx1NzY4NFx1NTczMFx1NTIyNVx1NTQwRCJ9LAorICAgICAgICB7Ik11c3Quc3BlY2lmeS5hbGlhcyIsICJcdTVGQzVcdTk4MDhcdTYzMDdcdTVCOUFcdTUyMjVcdTU0MEQifSwKKyAgICAgICAgeyJLZXlzdG9yZS5wYXNzd29yZC5tdXN0LmJlLmF0LmxlYXN0LjYuY2hhcmFjdGVycyIsCisgICAgICAgICAgICAgICAgIlx1OTFEMVx1OTQ3MFx1NTEzMlx1NUI1OFx1NUVBQlx1NUJDNlx1NzhCQ1x1NUZDNVx1OTgwOFx1ODFGM1x1NUMxMVx1NzBCQSA2IFx1NTAwQlx1NUI1N1x1NTE0MyJ9LAorICAgICAgICB7IkVudGVyLmtleXN0b3JlLnBhc3N3b3JkLiIsICJcdThGMzhcdTUxNjVcdTkxRDFcdTk0NzBcdTUxMzJcdTVCNThcdTVFQUJcdTVCQzZcdTc4QkM6ICAifSwKKyAgICAgICAgeyJFbnRlci5zb3VyY2Uua2V5c3RvcmUucGFzc3dvcmQuIiwgIlx1OEFDQlx1OEYzOFx1NTE2NVx1NEY4Nlx1NkU5MFx1OTFEMVx1OTQ3MFx1NTEzMlx1NUI1OFx1NUVBQlx1NUJDNlx1NzhCQzogIn0sCisgICAgICAgIHsiRW50ZXIuZGVzdGluYXRpb24ua2V5c3RvcmUucGFzc3dvcmQuIiwgIlx1OEFDQlx1OEYzOFx1NTE2NVx1NzZFRVx1NzY4NFx1NTczMFx1OTFEMVx1OTQ3MFx1NTEzMlx1NUI1OFx1NUVBQlx1NUJDNlx1NzhCQzogIn0sCisgICAgICAgIHsiS2V5c3RvcmUucGFzc3dvcmQuaXMudG9vLnNob3J0Lm11c3QuYmUuYXQubGVhc3QuNi5jaGFyYWN0ZXJzIiwKKyAgICAgICAgICJcdTkxRDFcdTk0NzBcdTUxMzJcdTVCNThcdTVFQUJcdTVCQzZcdTc4QkNcdTU5MkFcdTc3RUQgLSBcdTVGQzVcdTk4MDhcdTgxRjNcdTVDMTFcdTcwQkEgNiBcdTUwMEJcdTVCNTdcdTUxNDMifSwKKyAgICAgICAgeyJVbmtub3duLkVudHJ5LlR5cGUiLCAiXHU0RTBEXHU2NjBFXHU3Njg0XHU5ODA1XHU3NkVFXHU5ODVFXHU1NzhCIn0sCisgICAgICAgIHsiVG9vLm1hbnkuZmFpbHVyZXMuQWxpYXMubm90LmNoYW5nZWQiLCAiXHU1OTJBXHU1OTFBXHU5MzJGXHU4QUE0XHUzMDAyXHU2NzJBXHU4QjhBXHU2NkY0XHU1MjI1XHU1NDBEIn0sCisgICAgICAgIHsiRW50cnkuZm9yLmFsaWFzLmFsaWFzLnN1Y2Nlc3NmdWxseS5pbXBvcnRlZC4iLAorICAgICAgICAgICAgICAgICAiXHU1REYyXHU2MjEwXHU1MjlGXHU1MzJGXHU1MTY1XHU1MjI1XHU1NDBEIHswfSBcdTc2ODRcdTk4MDVcdTc2RUVcdTMwMDIifSwKKyAgICAgICAgeyJFbnRyeS5mb3IuYWxpYXMuYWxpYXMubm90LmltcG9ydGVkLiIsICJcdTY3MkFcdTUzMkZcdTUxNjVcdTUyMjVcdTU0MEQgezB9IFx1NzY4NFx1OTgwNVx1NzZFRVx1MzAwMiJ9LAorICAgICAgICB7IlByb2JsZW0uaW1wb3J0aW5nLmVudHJ5LmZvci5hbGlhcy5hbGlhcy5leGNlcHRpb24uRW50cnkuZm9yLmFsaWFzLmFsaWFzLm5vdC5pbXBvcnRlZC4iLAorICAgICAgICAgICAgICAgICAiXHU1MzJGXHU1MTY1XHU1MjI1XHU1NDBEIHswfSBcdTc2ODRcdTk4MDVcdTc2RUVcdTY2NDJcdTUxRkFcdTczRkVcdTU1NEZcdTk4NEM6IHsxfVx1MzAwMlxuXHU2NzJBXHU1MzJGXHU1MTY1XHU1MjI1XHU1NDBEIHswfSBcdTc2ODRcdTk4MDVcdTc2RUVcdTMwMDIifSwKKyAgICAgICAgeyJJbXBvcnQuY29tbWFuZC5jb21wbGV0ZWQub2suZW50cmllcy5zdWNjZXNzZnVsbHkuaW1wb3J0ZWQuZmFpbC5lbnRyaWVzLmZhaWxlZC5vci5jYW5jZWxsZWQiLAorICAgICAgICAgICAgICAgICAiXHU1REYyXHU1QjhDXHU2MjEwXHU1MzJGXHU1MTY1XHU1NDdEXHU0RUU0OiBcdTYyMTBcdTUyOUZcdTUzMkZcdTUxNjUgezB9IFx1NTAwQlx1OTgwNVx1NzZFRVx1RkYwQ3sxfSBcdTUwMEJcdTk4MDVcdTc2RUVcdTU5MzFcdTY1NTdcdTYyMTZcdTVERjJcdTUzRDZcdTZEODgifSwKKyAgICAgICAgeyJXYXJuaW5nLk92ZXJ3cml0aW5nLmV4aXN0aW5nLmFsaWFzLmFsaWFzLmluLmRlc3RpbmF0aW9uLmtleXN0b3JlIiwKKyAgICAgICAgICAgICAgICAgIlx1OEI2Nlx1NTQ0QTogXHU2QjYzXHU1NzI4XHU4OTg2XHU1QkVCXHU3NkVFXHU3Njg0XHU1NzMwXHU5MUQxXHU5NDcwXHU1MTMyXHU1QjU4XHU1RUFCXHU0RTJEXHU3Njg0XHU3M0ZFXHU2NzA5XHU1MjI1XHU1NDBEIHswfSJ9LAorICAgICAgICB7IkV4aXN0aW5nLmVudHJ5LmFsaWFzLmFsaWFzLmV4aXN0cy5vdmVyd3JpdGUubm8uIiwKKyAgICAgICAgICAgICAgICAgIlx1NzNGRVx1NjcwOVx1OTgwNVx1NzZFRVx1NTIyNVx1NTQwRCB7MH0gXHU1QjU4XHU1NzI4XHVGRjBDXHU2NjJGXHU1NDI2XHU4OTg2XHU1QkVCXHVGRjFGW1x1NTQyNl06ICAifSwKKyAgICAgICAgeyJUb28ubWFueS5mYWlsdXJlcy50cnkubGF0ZXIiLCAiXHU1OTJBXHU1OTFBXHU5MzJGXHU4QUE0IC0gXHU4QUNCXHU3QTBEXHU1RjhDXHU1MThEXHU4QTY2In0sCisgICAgICAgIHsiQ2VydGlmaWNhdGlvbi5yZXF1ZXN0LnN0b3JlZC5pbi5maWxlLmZpbGVuYW1lLiIsCisgICAgICAgICAgICAgICAgIlx1OEE4RFx1OEI0OVx1ODk4MVx1NkM0Mlx1NTEzMlx1NUI1OFx1NTcyOFx1NkE5NFx1Njg0OCA8ezB9PiJ9LAorICAgICAgICB7IlN1Ym1pdC50aGlzLnRvLnlvdXIuQ0EiLCAiXHU1QzA3XHU2QjY0XHU5MDAxXHU1MUZBXHU4MUYzXHU2MEE4XHU3Njg0IENBIn0sCisgICAgICAgIHsiaWYuYWxpYXMubm90LnNwZWNpZmllZC5kZXN0YWxpYXMuc3Jja2V5cGFzcy5hbmQuZGVzdGtleXBhc3MubXVzdC5ub3QuYmUuc3BlY2lmaWVkIiwKKyAgICAgICAgICAgICJcdTU5ODJcdTY3OUNcdTY3MkFcdTYzMDdcdTVCOUFcdTUyMjVcdTU0MERcdUZGMENcdTUyNDdcdTRFMERcdTgwRkRcdTYzMDdcdTVCOUEgZGVzdGFsaWFzXHUzMDAxc3Jja2V5cGFzcyBcdTUzQ0EgZGVzdGtleXBhc3MifSwKKyAgICAgICAgeyJDZXJ0aWZpY2F0ZS5zdG9yZWQuaW4uZmlsZS5maWxlbmFtZS4iLAorICAgICAgICAgICAgICAgICJcdTYxOTFcdThCNDlcdTUxMzJcdTVCNThcdTU3MjhcdTZBOTRcdTY4NDggPHswfT4ifSwKKyAgICAgICAgeyJDZXJ0aWZpY2F0ZS5yZXBseS53YXMuaW5zdGFsbGVkLmluLmtleXN0b3JlIiwKKyAgICAgICAgICAgICAgICAiXHU2MTkxXHU4QjQ5XHU1NkRFXHU4OTg2XHU1REYyXHU1Qjg5XHU4OEREXHU1NzI4XHU5MUQxXHU5NDcwXHU1MTMyXHU1QjU4XHU1RUFCXHU0RTJEIn0sCisgICAgICAgIHsiQ2VydGlmaWNhdGUucmVwbHkud2FzLm5vdC5pbnN0YWxsZWQuaW4ua2V5c3RvcmUiLAorICAgICAgICAgICAgICAgICJcdTYxOTFcdThCNDlcdTU2REVcdTg5ODZcdTY3MkFcdTVCODlcdTg4RERcdTU3MjhcdTkxRDFcdTk0NzBcdTUxMzJcdTVCNThcdTVFQUJcdTRFMkQifSwKKyAgICAgICAgeyJDZXJ0aWZpY2F0ZS53YXMuYWRkZWQudG8ua2V5c3RvcmUiLAorICAgICAgICAgICAgICAgICJcdTYxOTFcdThCNDlcdTVERjJcdTY1QjBcdTU4OUVcdTgxRjNcdTkxRDFcdTk0NzBcdTUxMzJcdTVCNThcdTVFQUJcdTRFMkQifSwKKyAgICAgICAgeyJDZXJ0aWZpY2F0ZS53YXMubm90LmFkZGVkLnRvLmtleXN0b3JlIiwKKyAgICAgICAgICAgICAgICAiXHU2MTkxXHU4QjQ5XHU2NzJBXHU2NUIwXHU1ODlFXHU4MUYzXHU5MUQxXHU5NDcwXHU1MTMyXHU1QjU4XHU1RUFCXHU0RTJEIn0sCisgICAgICAgIHsiLlN0b3Jpbmcua3NmbmFtZS4iLCAiW1x1NTEzMlx1NUI1OCB7MH1dIn0sCisgICAgICAgIHsiYWxpYXMuaGFzLm5vLnB1YmxpYy5rZXkuY2VydGlmaWNhdGUuIiwKKyAgICAgICAgICAgICAgICAiezB9IFx1NkM5Mlx1NjcwOVx1NTE2Q1x1OTU4Qlx1OTFEMVx1OTQ3MCAoXHU2MTkxXHU4QjQ5KSJ9LAorICAgICAgICB7IkNhbm5vdC5kZXJpdmUuc2lnbmF0dXJlLmFsZ29yaXRobSIsCisgICAgICAgICAgICAgICAgIlx1NzEyMVx1NkNENVx1NTNENlx1NUY5N1x1N0MzRFx1N0FFMFx1NkYxNFx1N0I5N1x1NkNENSJ9LAorICAgICAgICB7IkFsaWFzLmFsaWFzLmRvZXMubm90LmV4aXN0IiwKKyAgICAgICAgICAgICAgICAiXHU1MjI1XHU1NDBEIDx7MH0+IFx1NEUwRFx1NUI1OFx1NTcyOCJ9LAorICAgICAgICB7IkFsaWFzLmFsaWFzLmhhcy5uby5jZXJ0aWZpY2F0ZSIsCisgICAgICAgICAgICAgICAgIlx1NTIyNVx1NTQwRCA8ezB9PiBcdTZDOTJcdTY3MDlcdTYxOTFcdThCNDkifSwKKyAgICAgICAgeyJLZXkucGFpci5ub3QuZ2VuZXJhdGVkLmFsaWFzLmFsaWFzLmFscmVhZHkuZXhpc3RzIiwKKyAgICAgICAgICAgICAgICAiXHU2QzkyXHU2NzA5XHU1RUZBXHU3QUNCXHU5MUQxXHU5NDcwXHU3RDQ0XHVGRjBDXHU1MjI1XHU1NDBEIDx7MH0+IFx1NURGMlx1N0Q5M1x1NUI1OFx1NTcyOCJ9LAorICAgICAgICB7IkdlbmVyYXRpbmcua2V5c2l6ZS5iaXQua2V5QWxnTmFtZS5rZXkucGFpci5hbmQuc2VsZi5zaWduZWQuY2VydGlmaWNhdGUuc2lnQWxnTmFtZS53aXRoLmEudmFsaWRpdHkub2YudmFsaWRhbGl0eS5kYXlzLmZvciIsCisgICAgICAgICAgICAgICAgIlx1OTFERFx1NUMwRCB7NH0gXHU3NTIyXHU3NTFGXHU2NzA5XHU2NTQ4XHU2NzFGIHszfSBcdTU5MjlcdTc2ODQgezB9IFx1NEY0RFx1NTE0MyB7MX0gXHU5MUQxXHU5NDcwXHU3RDQ0XHU0RUU1XHU1M0NBXHU4MUVBXHU2MjExXHU3QzNEXHU3RjcyXHU2MTkxXHU4QjQ5ICh7Mn0pXG5cdCJ9LAorICAgICAgICB7IkVudGVyLmtleS5wYXNzd29yZC5mb3IuYWxpYXMuIiwgIlx1OEYzOFx1NTE2NSA8ezB9PiBcdTc2ODRcdTkxRDFcdTk0NzBcdTVCQzZcdTc4QkMifSwKKyAgICAgICAgeyIuUkVUVVJOLmlmLnNhbWUuYXMua2V5c3RvcmUucGFzc3dvcmQuIiwKKyAgICAgICAgICAgICAgICAiXHQoUkVUVVJOIFx1NTk4Mlx1Njc5Q1x1NTQ4Q1x1OTFEMVx1OTQ3MFx1NTEzMlx1NUI1OFx1NUVBQlx1NUJDNlx1NzhCQ1x1NzZGOFx1NTQwQyk6ICAifSwKKyAgICAgICAgeyJLZXkucGFzc3dvcmQuaXMudG9vLnNob3J0Lm11c3QuYmUuYXQubGVhc3QuNi5jaGFyYWN0ZXJzIiwKKyAgICAgICAgICAgICAgICAiXHU5MUQxXHU5NDcwXHU1QkM2XHU3OEJDXHU1OTJBXHU3N0VEIC0gXHU1RkM1XHU5ODA4XHU4MUYzXHU1QzExXHU3MEJBIDYgXHU1MDBCXHU1QjU3XHU1MTQzIn0sCisgICAgICAgIHsiVG9vLm1hbnkuZmFpbHVyZXMua2V5Lm5vdC5hZGRlZC50by5rZXlzdG9yZSIsCisgICAgICAgICAgICAgICAgIlx1NTkyQVx1NTkxQVx1OTMyRlx1OEFBNCAtIFx1OTFEMVx1OTQ3MFx1NjcyQVx1NjVCMFx1NTg5RVx1ODFGM1x1OTFEMVx1OTQ3MFx1NTEzMlx1NUI1OFx1NUVBQiJ9LAorICAgICAgICB7IkRlc3RpbmF0aW9uLmFsaWFzLmRlc3QuYWxyZWFkeS5leGlzdHMiLAorICAgICAgICAgICAgICAgICJcdTc2RUVcdTc2ODRcdTU3MzBcdTUyMjVcdTU0MEQgPHswfT4gXHU1REYyXHU3RDkzXHU1QjU4XHU1NzI4In0sCisgICAgICAgIHsiUGFzc3dvcmQuaXMudG9vLnNob3J0Lm11c3QuYmUuYXQubGVhc3QuNi5jaGFyYWN0ZXJzIiwKKyAgICAgICAgICAgICAgICAiXHU1QkM2XHU3OEJDXHU1OTJBXHU3N0VEIC0gXHU1RkM1XHU5ODA4XHU4MUYzXHU1QzExXHU3MEJBIDYgXHU1MDBCXHU1QjU3XHU1MTQzIn0sCisgICAgICAgIHsiVG9vLm1hbnkuZmFpbHVyZXMuS2V5LmVudHJ5Lm5vdC5jbG9uZWQiLAorICAgICAgICAgICAgICAgICJcdTU5MkFcdTU5MUFcdTkzMkZcdThBQTRcdTMwMDJcdTY3MkFcdTg5MDdcdTg4RkRcdTkxRDFcdTk0NzBcdTk4MDVcdTc2RUUifSwKKyAgICAgICAgeyJrZXkucGFzc3dvcmQuZm9yLmFsaWFzLiIsICI8ezB9PiBcdTc2ODRcdTkxRDFcdTk0NzBcdTVCQzZcdTc4QkMifSwKKyAgICAgICAgeyJLZXlzdG9yZS5lbnRyeS5mb3IuaWQuZ2V0TmFtZS5hbHJlYWR5LmV4aXN0cyIsCisgICAgICAgICAgICAgICAgIjx7MH0+IFx1NzY4NFx1OTFEMVx1OTQ3MFx1NTEzMlx1NUI1OFx1NUVBQlx1OTgwNVx1NzZFRVx1NURGMlx1N0Q5M1x1NUI1OFx1NTcyOCJ9LAorICAgICAgICB7IkNyZWF0aW5nLmtleXN0b3JlLmVudHJ5LmZvci5pZC5nZXROYW1lLiIsCisgICAgICAgICAgICAgICAgIlx1NUVGQVx1N0FDQiA8ezB9PiBcdTc2ODRcdTkxRDFcdTk0NzBcdTUxMzJcdTVCNThcdTVFQUJcdTk4MDVcdTc2RUUuLi4ifSwKKyAgICAgICAgeyJOby5lbnRyaWVzLmZyb20uaWRlbnRpdHkuZGF0YWJhc2UuYWRkZWQiLAorICAgICAgICAgICAgICAgICJcdTZDOTJcdTY3MDlcdTY1QjBcdTU4OUVcdTRGODZcdTgxRUFcdThCNThcdTUyMjVcdThDQzdcdTY1OTlcdTVFQUJcdTc2ODRcdTk4MDVcdTc2RUUifSwKKyAgICAgICAgeyJBbGlhcy5uYW1lLmFsaWFzIiwgIlx1NTIyNVx1NTQwRFx1NTQwRFx1N0EzMTogezB9In0sCisgICAgICAgIHsiQ3JlYXRpb24uZGF0ZS5rZXlTdG9yZS5nZXRDcmVhdGlvbkRhdGUuYWxpYXMuIiwKKyAgICAgICAgICAgICAgICAiXHU1RUZBXHU3QUNCXHU2NUU1XHU2NzFGOiB7MCxkYXRlfSJ9LAorICAgICAgICB7ImFsaWFzLmtleVN0b3JlLmdldENyZWF0aW9uRGF0ZS5hbGlhcy4iLAorICAgICAgICAgICAgICAgICJ7MH0sIHsxLGRhdGV9LCAifSwKKyAgICAgICAgeyJhbGlhcy4iLCAiezB9LCAifSwKKyAgICAgICAgeyJFbnRyeS50eXBlLnR5cGUuIiwgIlx1OTgwNVx1NzZFRVx1OTg1RVx1NTc4QjogezB9In0sCisgICAgICAgIHsiQ2VydGlmaWNhdGUuY2hhaW4ubGVuZ3RoLiIsICJcdTYxOTFcdThCNDlcdTkzQzhcdTk1NzdcdTVFQTY6ICJ9LAorICAgICAgICB7IkNlcnRpZmljYXRlLmkuMS4iLCAiXHU2MTkxXHU4QjQ5IFt7MCxudW1iZXIsaW50ZWdlcn1dOiJ9LAorICAgICAgICB7IkNlcnRpZmljYXRlLmZpbmdlcnByaW50LlNIQTEuIiwgIlx1NjE5MVx1OEI0OVx1NjMwN1x1N0QwQiAoU0hBMSk6ICJ9LAorICAgICAgICB7IktleXN0b3JlLnR5cGUuIiwgIlx1OTFEMVx1OTQ3MFx1NTEzMlx1NUI1OFx1NUVBQlx1OTg1RVx1NTc4QjogIn0sCisgICAgICAgIHsiS2V5c3RvcmUucHJvdmlkZXIuIiwgIlx1OTFEMVx1OTQ3MFx1NTEzMlx1NUI1OFx1NUVBQlx1NjNEMFx1NEY5Qlx1ODAwNTogIn0sCisgICAgICAgIHsiWW91ci5rZXlzdG9yZS5jb250YWlucy5rZXlTdG9yZS5zaXplLmVudHJ5IiwKKyAgICAgICAgICAgICAgICAiXHU2MEE4XHU3Njg0XHU5MUQxXHU5NDcwXHU1MTMyXHU1QjU4XHU1RUFCXHU1MzA1XHU1NDJCIHswLG51bWJlcixpbnRlZ2VyfSBcdTk4MDVcdTc2RUUifSwKKyAgICAgICAgeyJZb3VyLmtleXN0b3JlLmNvbnRhaW5zLmtleVN0b3JlLnNpemUuZW50cmllcyIsCisgICAgICAgICAgICAgICAgIlx1NjBBOFx1NzY4NFx1OTFEMVx1OTQ3MFx1NTEzMlx1NUI1OFx1NUVBQlx1NTMwNVx1NTQyQiB7MCxudW1iZXIsaW50ZWdlcn0gXHU5ODA1XHU3NkVFIn0sCisgICAgICAgIHsiRmFpbGVkLnRvLnBhcnNlLmlucHV0IiwgIlx1NzEyMVx1NkNENVx1NTI1Nlx1Njc5MFx1OEYzOFx1NTE2NSJ9LAorICAgICAgICB7IkVtcHR5LmlucHV0IiwgIlx1N0E3QVx1OEYzOFx1NTE2NSJ9LAorICAgICAgICB7Ik5vdC5YLjUwOS5jZXJ0aWZpY2F0ZSIsICJcdTk3NUUgWC41MDkgXHU2MTkxXHU4QjQ5In0sCisgICAgICAgIHsiYWxpYXMuaGFzLm5vLnB1YmxpYy5rZXkiLCAiezB9IFx1NzEyMVx1NTE2Q1x1OTU4Qlx1OTFEMVx1OTQ3MCJ9LAorICAgICAgICB7ImFsaWFzLmhhcy5uby5YLjUwOS5jZXJ0aWZpY2F0ZSIsICJ7MH0gXHU3MTIxIFguNTA5IFx1NjE5MVx1OEI0OSJ9LAorICAgICAgICB7Ik5ldy5jZXJ0aWZpY2F0ZS5zZWxmLnNpZ25lZC4iLCAiXHU2NUIwXHU2MTkxXHU4QjQ5IChcdTgxRUFcdTYyMTFcdTdDM0RcdTdGNzIpOiAifSwKKyAgICAgICAgeyJSZXBseS5oYXMubm8uY2VydGlmaWNhdGVzIiwgIlx1NTZERVx1ODk4Nlx1NEUwRFx1NTQyQlx1NjE5MVx1OEI0OSJ9LAorICAgICAgICB7IkNlcnRpZmljYXRlLm5vdC5pbXBvcnRlZC5hbGlhcy5hbGlhcy5hbHJlYWR5LmV4aXN0cyIsCisgICAgICAgICAgICAgICAgIlx1NjE5MVx1OEI0OVx1NjcyQVx1OEYzOFx1NTE2NVx1RkYwQ1x1NTIyNVx1NTQwRCA8ezB9PiBcdTVERjJcdTdEOTNcdTVCNThcdTU3MjgifSwKKyAgICAgICAgeyJJbnB1dC5ub3QuYW4uWC41MDkuY2VydGlmaWNhdGUiLCAiXHU4RjM4XHU1MTY1XHU3Njg0XHU0RTBEXHU2NjJGIFguNTA5IFx1NjE5MVx1OEI0OSJ9LAorICAgICAgICB7IkNlcnRpZmljYXRlLmFscmVhZHkuZXhpc3RzLmluLmtleXN0b3JlLnVuZGVyLmFsaWFzLnRydXN0YWxpYXMuIiwKKyAgICAgICAgICAgICAgICAiXHU5MUQxXHU5NDcwXHU1MTMyXHU1QjU4XHU1RUFCXHU0RTJEXHU3Njg0IDx7MH0+IFx1NTIyNVx1NTQwRFx1NEU0Qlx1NEUwQlx1RkYwQ1x1NjE5MVx1OEI0OVx1NURGMlx1N0Q5M1x1NUI1OFx1NTcyOCJ9LAorICAgICAgICB7IkRvLnlvdS5zdGlsbC53YW50LnRvLmFkZC5pdC5uby4iLAorICAgICAgICAgICAgICAgICJcdTYwQThcdTRFQ0RcdTcxMzZcdTYwRjNcdTg5ODFcdTVDMDdcdTRFNEJcdTY1QjBcdTU4OUVcdTU1Q0VcdUZGMUYgW1x1NTQyNl06ICAifSwKKyAgICAgICAgeyJDZXJ0aWZpY2F0ZS5hbHJlYWR5LmV4aXN0cy5pbi5zeXN0ZW0ud2lkZS5DQS5rZXlzdG9yZS51bmRlci5hbGlhcy50cnVzdGFsaWFzLiIsCisgICAgICAgICAgICAgICAgIlx1NjU3NFx1NTAwQlx1N0NGQlx1N0Q3MSBDQSBcdTkxRDFcdTk0NzBcdTUxMzJcdTVCNThcdTVFQUJcdTRFMkRcdTc2ODQgPHswfT4gXHU1MjI1XHU1NDBEXHU0RTRCXHU0RTBCXHVGRjBDXHU2MTkxXHU4QjQ5XHU1REYyXHU3RDkzXHU1QjU4XHU1NzI4In0sCisgICAgICAgIHsiRG8ueW91LnN0aWxsLndhbnQudG8uYWRkLml0LnRvLnlvdXIub3duLmtleXN0b3JlLm5vLiIsCisgICAgICAgICAgICAgICAgIlx1NjBBOFx1NEVDRFx1NzEzNlx1NjBGM1x1ODk4MVx1NUMwN1x1NEU0Qlx1NjVCMFx1NTg5RVx1ODFGM1x1ODFFQVx1NURGMVx1NzY4NFx1OTFEMVx1OTQ3MFx1NTEzMlx1NUI1OFx1NUVBQlx1NTVDRVx1RkYxRiBbXHU1NDI2XTogICJ9LAorICAgICAgICB7IlRydXN0LnRoaXMuY2VydGlmaWNhdGUubm8uIiwgIlx1NEZFMVx1NEVGQlx1OTAxOVx1NTAwQlx1NjE5MVx1OEI0OVx1RkYxRiBbXHU1NDI2XTogICJ9LAorICAgICAgICB7IllFUyIsICJcdTY2MkYifSwKKyAgICAgICAgeyJOZXcucHJvbXB0LiIsICJcdTY1QjAgezB9OiAifSwKKyAgICAgICAgeyJQYXNzd29yZHMubXVzdC5kaWZmZXIiLCAiXHU1RkM1XHU5ODA4XHU2NjJGXHU0RTBEXHU1NDBDXHU3Njg0XHU1QkM2XHU3OEJDIn0sCisgICAgICAgIHsiUmUuZW50ZXIubmV3LnByb21wdC4iLCAiXHU5MUNEXHU2NUIwXHU4RjM4XHU1MTY1XHU2NUIwIHswfTogIn0sCisgICAgICAgIHsiUmUuZW50ZXIubmV3LnBhc3N3b3JkLiIsICJcdTkxQ0RcdTY1QjBcdThGMzhcdTUxNjVcdTY1QjBcdTVCQzZcdTc4QkM6ICJ9LAorICAgICAgICB7IlRoZXkuZG9uLnQubWF0Y2guVHJ5LmFnYWluIiwgIlx1NUI4M1x1NTAxMVx1NEUwRFx1NzZGOFx1N0IyNlx1MzAwMlx1OEFDQlx1OTFDRFx1OEE2NiJ9LAorICAgICAgICB7IkVudGVyLnByb21wdC5hbGlhcy5uYW1lLiIsICJcdThGMzhcdTUxNjUgezB9IFx1NTIyNVx1NTQwRFx1NTQwRFx1N0EzMTogICJ9LAorICAgICAgICB7IkVudGVyLm5ldy5hbGlhcy5uYW1lLlJFVFVSTi50by5jYW5jZWwuaW1wb3J0LmZvci50aGlzLmVudHJ5LiIsCisgICAgICAgICAgICAgICAgICJcdThBQ0JcdThGMzhcdTUxNjVcdTY1QjBcdTc2ODRcdTUyMjVcdTU0MERcdTU0MERcdTdBMzFcdChSRVRVUk4gXHU0RUU1XHU1M0Q2XHU2RDg4XHU1MzJGXHU1MTY1XHU2QjY0XHU5ODA1XHU3NkVFKToifSwKKyAgICAgICAgeyJFbnRlci5hbGlhcy5uYW1lLiIsICJcdThGMzhcdTUxNjVcdTUyMjVcdTU0MERcdTU0MERcdTdBMzE6ICAifSwKKyAgICAgICAgeyIuUkVUVVJOLmlmLnNhbWUuYXMuZm9yLm90aGVyQWxpYXMuIiwKKyAgICAgICAgICAgICAgICAiXHQoUkVUVVJOIFx1NTk4Mlx1Njc5Q1x1NTQ4QyA8ezB9PiBcdTc2ODRcdTc2RjhcdTU0MEMpIn0sCisgICAgICAgIHsiLlBBVFRFUk4ucHJpbnRYNTA5Q2VydCIsCisgICAgICAgICAgICAgICAgIlx1NjRDMVx1NjcwOVx1ODAwNTogezB9XG5cdTc2N0NcdTUxRkFcdTgwMDU6IHsxfVxuXHU1RThGXHU4NjVGOiB7Mn1cblx1NjcwOVx1NjU0OFx1NjcxRlx1ODFFQTogezN9IFx1NTIzMDogezR9XG5cdTYxOTFcdThCNDlcdTYzMDdcdTdEMEI6XG5cdCBNRDU6ICB7NX1cblx0IFNIQTE6IHs2fVxuXHQgU0hBMjU2OiB7N31cblx0IFx1N0MzRFx1N0FFMFx1NkYxNFx1N0I5N1x1NkNENVx1NTQwRFx1N0EzMTogezh9XG5cdCBcdTcyNDhcdTY3MkM6IHs5fSJ9LAorICAgICAgICB7IldoYXQuaXMueW91ci5maXJzdC5hbmQubGFzdC5uYW1lLiIsCisgICAgICAgICAgICAgICAgIlx1NjBBOFx1NzY4NFx1NTQwRFx1NUI1N1x1ODIwN1x1NTlEM1x1NkMwRlx1NzBCQVx1NEY1NVx1RkYxRiJ9LAorICAgICAgICB7IldoYXQuaXMudGhlLm5hbWUub2YueW91ci5vcmdhbml6YXRpb25hbC51bml0LiIsCisgICAgICAgICAgICAgICAgIlx1NjBBOFx1NzY4NFx1N0Q0NFx1N0U1NFx1NTVBRVx1NEY0RFx1NTQwRFx1N0EzMVx1NzBCQVx1NEY1NVx1RkYxRiJ9LAorICAgICAgICB7IldoYXQuaXMudGhlLm5hbWUub2YueW91ci5vcmdhbml6YXRpb24uIiwKKyAgICAgICAgICAgICAgICAiXHU2MEE4XHU3Njg0XHU3RDQ0XHU3RTU0XHU1NDBEXHU3QTMxXHU3MEJBXHU0RjU1XHVGRjFGIn0sCisgICAgICAgIHsiV2hhdC5pcy50aGUubmFtZS5vZi55b3VyLkNpdHkub3IuTG9jYWxpdHkuIiwKKyAgICAgICAgICAgICAgICAiXHU2MEE4XHU2MjQwXHU1NzI4XHU3Njg0XHU1N0NFXHU1RTAyXHU2MjE2XHU1NzMwXHU1MzQwXHU1NDBEXHU3QTMxXHU3MEJBXHU0RjU1XHVGRjFGIn0sCisgICAgICAgIHsiV2hhdC5pcy50aGUubmFtZS5vZi55b3VyLlN0YXRlLm9yLlByb3ZpbmNlLiIsCisgICAgICAgICAgICAgICAgIlx1NjBBOFx1NjI0MFx1NTcyOFx1NzY4NFx1NURERVx1NTNDQVx1NzcwMVx1NEVGRFx1NTQwRFx1N0EzMVx1NzBCQVx1NEY1NVx1RkYxRiJ9LAorICAgICAgICB7IldoYXQuaXMudGhlLnR3by5sZXR0ZXIuY291bnRyeS5jb2RlLmZvci50aGlzLnVuaXQuIiwKKyAgICAgICAgICAgICAgICAiXHU2QjY0XHU1NUFFXHU0RjREXHU3Njg0XHU1MTY5XHU1MDBCXHU1QjU3XHU2QkNEXHU1NzBCXHU1MjI1XHU0RUUzXHU3OEJDXHU3MEJBXHU0RjU1XHVGRjFGIn0sCisgICAgICAgIHsiSXMubmFtZS5jb3JyZWN0LiIsICJ7MH0gXHU2QjYzXHU3OEJBXHU1NUNFXHVGRjFGIn0sCisgICAgICAgIHsibm8iLCAiXHU1NDI2In0sCisgICAgICAgIHsieWVzIiwgIlx1NjYyRiJ9LAorICAgICAgICB7InkiLCAieSJ9LAorICAgICAgICB7Ii5kZWZhdWx0VmFsdWUuIiwgIiAgW3swfV06ICAifSwKKyAgICAgICAgeyJBbGlhcy5hbGlhcy5oYXMubm8ua2V5IiwKKyAgICAgICAgICAgICAgICAiXHU1MjI1XHU1NDBEIDx7MH0+IFx1NkM5Mlx1NjcwOVx1OTFEMVx1OTQ3MCJ9LAorICAgICAgICB7IkFsaWFzLmFsaWFzLnJlZmVyZW5jZXMuYW4uZW50cnkudHlwZS50aGF0LmlzLm5vdC5hLnByaXZhdGUua2V5LmVudHJ5LlRoZS5rZXljbG9uZS5jb21tYW5kLm9ubHkuc3VwcG9ydHMuY2xvbmluZy5vZi5wcml2YXRlLmtleSIsCisgICAgICAgICAgICAgICAgICJcdTUyMjVcdTU0MEQgPHswfT4gXHU2MjQwXHU1M0MzXHU3MTY3XHU3Njg0XHU5ODA1XHU3NkVFXHU0RTBEXHU2NjJGXHU3OUMxXHU1QkM2XHU5MUQxXHU5NDcwXHU5ODVFXHU1NzhCXHUzMDAyLWtleWNsb25lIFx1NTQ3RFx1NEVFNFx1NTBDNVx1NjUyRlx1NjNGNFx1NzlDMVx1NUJDNlx1OTFEMVx1OTQ3MFx1OTgwNVx1NzZFRVx1NzY4NFx1ODkwN1x1ODhGRCJ9LAorCisgICAgICAgIHsiLldBUk5JTkcuV0FSTklORy5XQVJOSU5HLiIsCisgICAgICAgICAgICAiKioqKioqKioqKioqKioqKiogIFx1OEI2Nlx1NTQ0QSBcdThCNjZcdTU0NEEgXHU4QjY2XHU1NDRBICAqKioqKioqKioqKioqKioqKiJ9LAorICAgICAgICB7IlNpZ25lci5kLiIsICJcdTdDM0RcdTdGNzJcdTgwMDUgIyVkOiJ9LAorICAgICAgICB7IlRpbWVzdGFtcC4iLCAiXHU2NjQyXHU2MjMzOiJ9LAorICAgICAgICB7IlNpZ25hdHVyZS4iLCAiXHU3QzNEXHU3QUUwOiJ9LAorICAgICAgICB7IkNSTHMuIiwgIkNSTDoifSwKKyAgICAgICAgeyJDZXJ0aWZpY2F0ZS5vd25lci4iLCAiXHU2MTkxXHU4QjQ5XHU2NEMxXHU2NzA5XHU4MDA1OiAifSwKKyAgICAgICAgeyJOb3QuYS5zaWduZWQuamFyLmZpbGUiLCAiXHU0RTBEXHU2NjJGXHU3QzNEXHU3RjcyXHU3Njg0IGphciBcdTZBOTRcdTY4NDgifSwKKyAgICAgICAgeyJOby5jZXJ0aWZpY2F0ZS5mcm9tLnRoZS5TU0wuc2VydmVyIiwKKyAgICAgICAgICAgICAgICAiXHU2QzkyXHU2NzA5XHU0Rjg2XHU4MUVBIFNTTCBcdTRGM0FcdTY3MERcdTU2NjhcdTc2ODRcdTYxOTFcdThCNDkifSwKKworICAgICAgICB7Ii5UaGUuaW50ZWdyaXR5Lm9mLnRoZS5pbmZvcm1hdGlvbi5zdG9yZWQuaW4ueW91ci5rZXlzdG9yZS4iLAorICAgICAgICAgICAgIiogXHU1QzFBXHU2NzJBXHU5QTU3XHU4QjQ5XHU1MTMyXHU1QjU4XHU2NUJDXHU5MUQxXHU5NDcwXHU1MTMyXHU1QjU4XHU1RUFCXHU0RTJEXHU4Q0M3XHU4QTBBICAqXG4qIFx1NzY4NFx1NUI4Q1x1NjU3NFx1NjAyN1x1RkYwMVx1ODJFNVx1ODk4MVx1OUE1N1x1OEI0OVx1NTE3Nlx1NUI4Q1x1NjU3NFx1NjAyN1x1RkYwQypcbiogXHU2MEE4XHU1RkM1XHU5ODA4XHU2M0QwXHU0RjlCXHU2MEE4XHU3Njg0XHU5MUQxXHU5NDcwXHU1MTMyXHU1QjU4XHU1RUFCXHU1QkM2XHU3OEJDXHUzMDAyICAgICAgICAgICAgICAgICAgKiJ9LAorICAgICAgICB7Ii5UaGUuaW50ZWdyaXR5Lm9mLnRoZS5pbmZvcm1hdGlvbi5zdG9yZWQuaW4udGhlLnNyY2tleXN0b3JlLiIsCisgICAgICAgICAgICAiKiBcdTVDMUFcdTY3MkFcdTlBNTdcdThCNDlcdTUxMzJcdTVCNThcdTY1QkMgc3Jja2V5c3RvcmUgXHU0RTJEXHU4Q0M3XHU4QTBBKlxuKiBcdTc2ODRcdTVCOENcdTY1NzRcdTYwMjdcdUZGMDFcdTgyRTVcdTg5ODFcdTlBNTdcdThCNDlcdTUxNzZcdTVCOENcdTY1NzRcdTYwMjdcdUZGMENcdTYwQThcdTVGQzVcdTk4MDggKlxuKiBcdTYzRDBcdTRGOUIgc3Jja2V5c3RvcmUgXHU1QkM2XHU3OEJDXHUzMDAyICAgICAgICAgICoifSwKKworICAgICAgICB7IkNlcnRpZmljYXRlLnJlcGx5LmRvZXMubm90LmNvbnRhaW4ucHVibGljLmtleS5mb3IuYWxpYXMuIiwKKyAgICAgICAgICAgICAgICAiXHU2MTkxXHU4QjQ5XHU1NkRFXHU4OTg2XHU0RTI2XHU2NzJBXHU1MzA1XHU1NDJCIDx7MH0+IFx1NzY4NFx1NTE2Q1x1OTU4Qlx1OTFEMVx1OTQ3MCJ9LAorICAgICAgICB7IkluY29tcGxldGUuY2VydGlmaWNhdGUuY2hhaW4uaW4ucmVwbHkiLAorICAgICAgICAgICAgICAgICJcdTU2REVcdTg5ODZcdTY2NDJcdTc2ODRcdTYxOTFcdThCNDlcdTkzQzhcdTRFMERcdTVCOENcdTY1NzQifSwKKyAgICAgICAgeyJDZXJ0aWZpY2F0ZS5jaGFpbi5pbi5yZXBseS5kb2VzLm5vdC52ZXJpZnkuIiwKKyAgICAgICAgICAgICAgICAiXHU1NkRFXHU4OTg2XHU2NjQyXHU3Njg0XHU2MTkxXHU4QjQ5XHU5M0M4XHU2NzJBXHU5QTU3XHU4QjQ5OiAifSwKKyAgICAgICAgeyJUb3AubGV2ZWwuY2VydGlmaWNhdGUuaW4ucmVwbHkuIiwKKyAgICAgICAgICAgICAgICAiXHU1NkRFXHU4OTg2XHU2NjQyXHU3Njg0XHU2NzAwXHU5QUQ4XHU3RDFBXHU2MTkxXHU4QjQ5OlxcbiJ9LAorICAgICAgICB7Ii5pcy5ub3QudHJ1c3RlZC4iLCAiLi4uIFx1NjYyRlx1NEUwRFx1ODhBQlx1NEZFMVx1NEVGQlx1NzY4NFx1MzAwMiJ9LAorICAgICAgICB7Ikluc3RhbGwucmVwbHkuYW55d2F5Lm5vLiIsICJcdTkwODRcdTY2MkZcdTg5ODFcdTVCODlcdTg4RERcdTU2REVcdTg5ODZcdUZGMUYgW1x1NTQyNl06ICAifSwKKyAgICAgICAgeyJOTyIsICJcdTU0MjYifSwKKyAgICAgICAgeyJQdWJsaWMua2V5cy5pbi5yZXBseS5hbmQua2V5c3RvcmUuZG9uLnQubWF0Y2giLAorICAgICAgICAgICAgICAgICJcdTU2REVcdTg5ODZcdTY2NDJcdTc2ODRcdTUxNkNcdTk1OEJcdTkxRDFcdTk0NzBcdTgyMDdcdTkxRDFcdTk0NzBcdTUxMzJcdTVCNThcdTVFQUJcdTRFMERcdTdCMjYifSwKKyAgICAgICAgeyJDZXJ0aWZpY2F0ZS5yZXBseS5hbmQuY2VydGlmaWNhdGUuaW4ua2V5c3RvcmUuYXJlLmlkZW50aWNhbCIsCisgICAgICAgICAgICAgICAgIlx1NjE5MVx1OEI0OVx1NTZERVx1ODk4Nlx1ODIwN1x1OTFEMVx1OTQ3MFx1NTEzMlx1NUI1OFx1NUVBQlx1NEUyRFx1NzY4NFx1NjE5MVx1OEI0OVx1NjYyRlx1NzZGOFx1NTQwQ1x1NzY4NCJ9LAorICAgICAgICB7IkZhaWxlZC50by5lc3RhYmxpc2guY2hhaW4uZnJvbS5yZXBseSIsCisgICAgICAgICAgICAgICAgIlx1NzEyMVx1NkNENVx1NUY5RVx1NTZERVx1ODk4Nlx1NEUyRFx1NUMwN1x1OTNDOFx1NUVGQVx1N0FDQlx1OEQ3N1x1NEY4NiJ9LAorICAgICAgICB7Im4iLCAibiJ9LAorICAgICAgICB7Ildyb25nLmFuc3dlci50cnkuYWdhaW4iLCAiXHU5MzJGXHU4QUE0XHU3Njg0XHU3QjU0XHU2ODQ4XHVGRjBDXHU4QUNCXHU1MThEXHU4QTY2XHU0RTAwXHU2QjIxIn0sCisgICAgICAgIHsiU2VjcmV0LmtleS5ub3QuZ2VuZXJhdGVkLmFsaWFzLmFsaWFzLmFscmVhZHkuZXhpc3RzIiwKKyAgICAgICAgICAgICAgICAiXHU2NzJBXHU3NTIyXHU3NTFGXHU3OUQ4XHU1QkM2XHU5MUQxXHU5NDcwXHVGRjBDXHU1MjI1XHU1NDBEIDx7MH0+IFx1NURGMlx1NUI1OFx1NTcyOCJ9LAorICAgICAgICB7IlBsZWFzZS5wcm92aWRlLmtleXNpemUuZm9yLnNlY3JldC5rZXkuZ2VuZXJhdGlvbiIsCisgICAgICAgICAgICAgICAgIlx1OEFDQlx1NjNEMFx1NEY5QiAta2V5c2l6ZSBcdTRFRTVcdTc1MjJcdTc1MUZcdTc5RDhcdTVCQzZcdTkxRDFcdTk0NzAifSwKKworICAgICAgICB7IkV4dGVuc2lvbnMuIiwgIlx1NjRGNFx1NTE0NVx1NTk1N1x1NEVGNjogIn0sCisgICAgICAgIHsiLkVtcHR5LnZhbHVlLiIsICIoXHU3QTdBXHU3NjdEXHU1MDNDKSJ9LAorICAgICAgICB7IkV4dGVuc2lvbi5SZXF1ZXN0LiIsICJcdTY0RjRcdTUxNDVcdTU5NTdcdTRFRjZcdTg5ODFcdTZDNDI6In0sCisgICAgICAgIHsiUEtDUy4xMC5DZXJ0aWZpY2F0ZS5SZXF1ZXN0LlZlcnNpb24uMS4wLlN1YmplY3Qucy5QdWJsaWMuS2V5LnMuZm9ybWF0LnMua2V5LiIsCisgICAgICAgICAgICAgICAgIlBLQ1MgIzEwIFx1NjE5MVx1OEI0OVx1ODk4MVx1NkM0MiAoXHU3MjQ4XHU2NzJDIDEuMClcblx1NEUzQlx1OUFENDogJXNcblx1NTE2Q1x1NzUyOFx1OTFEMVx1OTQ3MDogJXMgXHU2ODNDXHU1RjBGICVzIFx1OTFEMVx1OTQ3MFxuIn0sCisgICAgICAgIHsiVW5rbm93bi5rZXlVc2FnZS50eXBlLiIsICJcdTRFMERcdTY2MEVcdTc2ODQga2V5VXNhZ2UgXHU5ODVFXHU1NzhCOiAifSwKKyAgICAgICAgeyJVbmtub3duLmV4dGVuZGVka2V5VXNhZ2UudHlwZS4iLCAiXHU0RTBEXHU2NjBFXHU3Njg0IGV4dGVuZGVka2V5VXNhZ2UgXHU5ODVFXHU1NzhCOiAifSwKKyAgICAgICAgeyJVbmtub3duLkFjY2Vzc0Rlc2NyaXB0aW9uLnR5cGUuIiwgIlx1NEUwRFx1NjYwRVx1NzY4NCBBY2Nlc3NEZXNjcmlwdGlvbiBcdTk4NUVcdTU3OEI6ICJ9LAorICAgICAgICB7IlVucmVjb2duaXplZC5HZW5lcmFsTmFtZS50eXBlLiIsICJcdTcxMjFcdTZDRDVcdThGQThcdThCNThcdTc2ODQgR2VuZXJhbE5hbWUgXHU5ODVFXHU1NzhCOiAifSwKKyAgICAgICAgeyJUaGlzLmV4dGVuc2lvbi5jYW5ub3QuYmUubWFya2VkLmFzLmNyaXRpY2FsLiIsCisgICAgICAgICAgICAgICAgICJcdTZCNjRcdTY0RjRcdTUxNDVcdTU5NTdcdTRFRjZcdTcxMjFcdTZDRDVcdTZBMTlcdTc5M0FcdTcwQkFcdTk1RENcdTkzNzVcdTMwMDIifSwKKyAgICAgICAgeyJPZGQubnVtYmVyLm9mLmhleC5kaWdpdHMuZm91bmQuIiwgIlx1NjI3RVx1NTIzMFx1NTM0MVx1NTE2RFx1OTAzMlx1NEY0RFx1NjU3OFx1NUI1N1x1NzY4NFx1NTk0N1x1NjU3ODogIn0sCisgICAgICAgIHsiVW5rbm93bi5leHRlbnNpb24udHlwZS4iLCAiXHU0RTBEXHU2NjBFXHU3Njg0XHU2NEY0XHU1MTQ1XHU1OTU3XHU0RUY2XHU5ODVFXHU1NzhCOiAifSwKKyAgICAgICAgeyJjb21tYW5kLnswfS5pcy5hbWJpZ3VvdXMuIiwgIlx1NTQ3RFx1NEVFNCB7MH0gXHU0RTBEXHU2NjBFXHU3OEJBOiJ9CisgICAgfTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY29udGVudHMgb2YgdGhpcyA8Y29kZT5SZXNvdXJjZUJ1bmRsZTwvY29kZT4uCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGNvbnRlbnRzIG9mIHRoaXMgPGNvZGU+UmVzb3VyY2VCdW5kbGU8L2NvZGU+LgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPYmplY3RbXVtdIGdldENvbnRlbnRzKCkgeworICAgICAgICByZXR1cm4gY29udGVudHM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS90b29scy9wb2xpY3l0b29sL1BvbGljeVRvb2wuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdG9vbHMvcG9saWN5dG9vbC9Qb2xpY3lUb29sLmphdmEKaW5kZXggMjY3Y2MwMS4uNTgzNWNlOSAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS90b29scy9wb2xpY3l0b29sL1BvbGljeVRvb2wuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3Rvb2xzL3BvbGljeXRvb2wvUG9saWN5VG9vbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMTk5NywgMjAxMSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5NywgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtNjAsNyArNjAsOCBAQAogCiAgICAgLy8gZm9yIGkxOG4KICAgICBzdGF0aWMgZmluYWwgamF2YS51dGlsLlJlc291cmNlQnVuZGxlIHJiID0KLSAgICAgICAgamF2YS51dGlsLlJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgic3VuLnNlY3VyaXR5LnV0aWwuUmVzb3VyY2VzIik7CisgICAgICAgIGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoCisgICAgICAgICAgICAic3VuLnNlY3VyaXR5LnRvb2xzLnBvbGljeXRvb2wuUmVzb3VyY2VzIik7CiAgICAgc3RhdGljIGZpbmFsIENvbGxhdG9yIGNvbGxhdG9yID0gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKTsKICAgICBzdGF0aWMgewogICAgICAgICAvLyB0aGlzIGlzIGZvciBjYXNlIGluc2Vuc2l0aXZlIHN0cmluZyBjb21wYXJpc29ucwpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS90b29scy9wb2xpY3l0b29sL1Jlc291cmNlcy5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS90b29scy9wb2xpY3l0b29sL1Jlc291cmNlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxNTVkY2UKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3Rvb2xzL3BvbGljeXRvb2wvUmVzb3VyY2VzLmphdmEKQEAgLTAsMCArMSwxNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IE9yYWNsZSBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQorICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQorICogcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2Ugc3VuLnNlY3VyaXR5LnRvb2xzLnBvbGljeXRvb2w7CisKKy8qKgorICogPHA+IFRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgPGNvZGU+UmVzb3VyY2VCdW5kbGU8L2NvZGU+CisgKiBmb3IgdGhlIHBvbGljeXRvb2wuCisgKgorICovCitwdWJsaWMgY2xhc3MgUmVzb3VyY2VzIGV4dGVuZHMgamF2YS51dGlsLkxpc3RSZXNvdXJjZUJ1bmRsZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXVtdIGNvbnRlbnRzID0geworICAgICAgICB7Ik5FV0xJTkUiLCAiXG4ifSwKKyAgICAgICAgeyJXYXJuaW5nLkEucHVibGljLmtleS5mb3IuYWxpYXMuc2lnbmVycy5pLmRvZXMubm90LmV4aXN0Lk1ha2Uuc3VyZS5hLktleVN0b3JlLmlzLnByb3Blcmx5LmNvbmZpZ3VyZWQuIiwKKyAgICAgICAgICAgICAgICAiV2FybmluZzogQSBwdWJsaWMga2V5IGZvciBhbGlhcyB7MH0gZG9lcyBub3QgZXhpc3QuICBNYWtlIHN1cmUgYSBLZXlTdG9yZSBpcyBwcm9wZXJseSBjb25maWd1cmVkLiJ9LAorICAgICAgICB7Ildhcm5pbmcuQ2xhc3Mubm90LmZvdW5kLmNsYXNzIiwgIldhcm5pbmc6IENsYXNzIG5vdCBmb3VuZDogezB9In0sCisgICAgICAgIHsiV2FybmluZy5JbnZhbGlkLmFyZ3VtZW50LnMuZm9yLmNvbnN0cnVjdG9yLmFyZyIsCisgICAgICAgICAgICAgICAgIldhcm5pbmc6IEludmFsaWQgYXJndW1lbnQocykgZm9yIGNvbnN0cnVjdG9yOiB7MH0ifSwKKyAgICAgICAgeyJJbGxlZ2FsLlByaW5jaXBhbC5UeXBlLnR5cGUiLCAiSWxsZWdhbCBQcmluY2lwYWwgVHlwZTogezB9In0sCisgICAgICAgIHsiSWxsZWdhbC5vcHRpb24ub3B0aW9uIiwgIklsbGVnYWwgb3B0aW9uOiB7MH0ifSwKKyAgICAgICAgeyJVc2FnZS5wb2xpY3l0b29sLm9wdGlvbnMuIiwgIlVzYWdlOiBwb2xpY3l0b29sIFtvcHRpb25zXSJ9LAorICAgICAgICB7Ii5maWxlLmZpbGUucG9saWN5LmZpbGUubG9jYXRpb24iLAorICAgICAgICAgICAgICAgICIgIFstZmlsZSA8ZmlsZT5dICAgIHBvbGljeSBmaWxlIGxvY2F0aW9uIn0sCisgICAgICAgIHsiTmV3IiwgIk5ldyJ9LAorICAgICAgICB7Ik9wZW4iLCAiT3BlbiJ9LAorICAgICAgICB7IlNhdmUiLCAiU2F2ZSJ9LAorICAgICAgICB7IlNhdmUuQXMiLCAiU2F2ZSBBcyJ9LAorICAgICAgICB7IlZpZXcuV2FybmluZy5Mb2ciLCAiVmlldyBXYXJuaW5nIExvZyJ9LAorICAgICAgICB7IkV4aXQiLCAiRXhpdCJ9LAorICAgICAgICB7IkFkZC5Qb2xpY3kuRW50cnkiLCAiQWRkIFBvbGljeSBFbnRyeSJ9LAorICAgICAgICB7IkVkaXQuUG9saWN5LkVudHJ5IiwgIkVkaXQgUG9saWN5IEVudHJ5In0sCisgICAgICAgIHsiUmVtb3ZlLlBvbGljeS5FbnRyeSIsICJSZW1vdmUgUG9saWN5IEVudHJ5In0sCisgICAgICAgIHsiRWRpdCIsICJFZGl0In0sCisgICAgICAgIHsiUmV0YWluIiwgIlJldGFpbiJ9LAorCisgICAgICAgIHsiV2FybmluZy5GaWxlLm5hbWUubWF5LmluY2x1ZGUuZXNjYXBlZC5iYWNrc2xhc2guY2hhcmFjdGVycy5JdC5pcy5ub3QubmVjZXNzYXJ5LnRvLmVzY2FwZS5iYWNrc2xhc2guY2hhcmFjdGVycy50aGUudG9vbC5lc2NhcGVzIiwKKyAgICAgICAgICAgICJXYXJuaW5nOiBGaWxlIG5hbWUgbWF5IGluY2x1ZGUgZXNjYXBlZCBiYWNrc2xhc2ggY2hhcmFjdGVycy4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAiSXQgaXMgbm90IG5lY2Vzc2FyeSB0byBlc2NhcGUgYmFja3NsYXNoIGNoYXJhY3RlcnMgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAiKHRoZSB0b29sIGVzY2FwZXMgY2hhcmFjdGVycyBhcyBuZWNlc3Nhcnkgd2hlbiB3cml0aW5nICIgKworICAgICAgICAgICAgICAgICAgICAgICAgInRoZSBwb2xpY3kgY29udGVudHMgdG8gdGhlIHBlcnNpc3RlbnQgc3RvcmUpLlxuXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICJDbGljayBvbiBSZXRhaW4gdG8gcmV0YWluIHRoZSBlbnRlcmVkIG5hbWUsIG9yIGNsaWNrIG9uICIgKworICAgICAgICAgICAgICAgICAgICAgICAgIkVkaXQgdG8gZWRpdCB0aGUgbmFtZS4ifSwKKworICAgICAgICB7IkFkZC5QdWJsaWMuS2V5LkFsaWFzIiwgIkFkZCBQdWJsaWMgS2V5IEFsaWFzIn0sCisgICAgICAgIHsiUmVtb3ZlLlB1YmxpYy5LZXkuQWxpYXMiLCAiUmVtb3ZlIFB1YmxpYyBLZXkgQWxpYXMifSwKKyAgICAgICAgeyJGaWxlIiwgIkZpbGUifSwKKyAgICAgICAgeyJLZXlTdG9yZSIsICJLZXlTdG9yZSJ9LAorICAgICAgICB7IlBvbGljeS5GaWxlLiIsICJQb2xpY3kgRmlsZToifSwKKyAgICAgICAgeyJDb3VsZC5ub3Qub3Blbi5wb2xpY3kuZmlsZS5wb2xpY3lGaWxlLmUudG9TdHJpbmcuIiwKKyAgICAgICAgICAgICAgICAiQ291bGQgbm90IG9wZW4gcG9saWN5IGZpbGU6IHswfTogezF9In0sCisgICAgICAgIHsiUG9saWN5LlRvb2wiLCAiUG9saWN5IFRvb2wifSwKKyAgICAgICAgeyJFcnJvcnMuaGF2ZS5vY2N1cnJlZC53aGlsZS5vcGVuaW5nLnRoZS5wb2xpY3kuY29uZmlndXJhdGlvbi5WaWV3LnRoZS5XYXJuaW5nLkxvZy5mb3IubW9yZS5pbmZvcm1hdGlvbi4iLAorICAgICAgICAgICAgICAgICJFcnJvcnMgaGF2ZSBvY2N1cnJlZCB3aGlsZSBvcGVuaW5nIHRoZSBwb2xpY3kgY29uZmlndXJhdGlvbi4gIFZpZXcgdGhlIFdhcm5pbmcgTG9nIGZvciBtb3JlIGluZm9ybWF0aW9uLiJ9LAorICAgICAgICB7IkVycm9yIiwgIkVycm9yIn0sCisgICAgICAgIHsiT0siLCAiT0sifSwKKyAgICAgICAgeyJTdGF0dXMiLCAiU3RhdHVzIn0sCisgICAgICAgIHsiV2FybmluZyIsICJXYXJuaW5nIn0sCisgICAgICAgIHsiUGVybWlzc2lvbi4iLAorICAgICAgICAgICAgICAgICJQZXJtaXNzaW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifSwKKyAgICAgICAgeyJQcmluY2lwYWwuVHlwZS4iLCAiUHJpbmNpcGFsIFR5cGU6In0sCisgICAgICAgIHsiUHJpbmNpcGFsLk5hbWUuIiwgIlByaW5jaXBhbCBOYW1lOiJ9LAorICAgICAgICB7IlRhcmdldC5OYW1lLiIsCisgICAgICAgICAgICAgICAgIlRhcmdldCBOYW1lOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifSwKKyAgICAgICAgeyJBY3Rpb25zLiIsCisgICAgICAgICAgICAgICAgIkFjdGlvbnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9LAorICAgICAgICB7Ik9LLnRvLm92ZXJ3cml0ZS5leGlzdGluZy5maWxlLmZpbGVuYW1lLiIsCisgICAgICAgICAgICAgICAgIk9LIHRvIG92ZXJ3cml0ZSBleGlzdGluZyBmaWxlIHswfT8ifSwKKyAgICAgICAgeyJDYW5jZWwiLCAiQ2FuY2VsIn0sCisgICAgICAgIHsiQ29kZUJhc2UuIiwgIkNvZGVCYXNlOiJ9LAorICAgICAgICB7IlNpZ25lZEJ5LiIsICJTaWduZWRCeToifSwKKyAgICAgICAgeyJBZGQuUHJpbmNpcGFsIiwgIkFkZCBQcmluY2lwYWwifSwKKyAgICAgICAgeyJFZGl0LlByaW5jaXBhbCIsICJFZGl0IFByaW5jaXBhbCJ9LAorICAgICAgICB7IlJlbW92ZS5QcmluY2lwYWwiLCAiUmVtb3ZlIFByaW5jaXBhbCJ9LAorICAgICAgICB7IlByaW5jaXBhbHMuIiwgIlByaW5jaXBhbHM6In0sCisgICAgICAgIHsiLkFkZC5QZXJtaXNzaW9uIiwgIiAgQWRkIFBlcm1pc3Npb24ifSwKKyAgICAgICAgeyIuRWRpdC5QZXJtaXNzaW9uIiwgIiAgRWRpdCBQZXJtaXNzaW9uIn0sCisgICAgICAgIHsiUmVtb3ZlLlBlcm1pc3Npb24iLCAiUmVtb3ZlIFBlcm1pc3Npb24ifSwKKyAgICAgICAgeyJEb25lIiwgIkRvbmUifSwKKyAgICAgICAgeyJLZXlTdG9yZS5VUkwuIiwgIktleVN0b3JlIFVSTDoifSwKKyAgICAgICAgeyJLZXlTdG9yZS5UeXBlLiIsICJLZXlTdG9yZSBUeXBlOiJ9LAorICAgICAgICB7IktleVN0b3JlLlByb3ZpZGVyLiIsICJLZXlTdG9yZSBQcm92aWRlcjoifSwKKyAgICAgICAgeyJLZXlTdG9yZS5QYXNzd29yZC5VUkwuIiwgIktleVN0b3JlIFBhc3N3b3JkIFVSTDoifSwKKyAgICAgICAgeyJQcmluY2lwYWxzIiwgIlByaW5jaXBhbHMifSwKKyAgICAgICAgeyIuRWRpdC5QcmluY2lwYWwuIiwgIiAgRWRpdCBQcmluY2lwYWw6In0sCisgICAgICAgIHsiLkFkZC5OZXcuUHJpbmNpcGFsLiIsICIgIEFkZCBOZXcgUHJpbmNpcGFsOiJ9LAorICAgICAgICB7IlBlcm1pc3Npb25zIiwgIlBlcm1pc3Npb25zIn0sCisgICAgICAgIHsiLkVkaXQuUGVybWlzc2lvbi4iLCAiICBFZGl0IFBlcm1pc3Npb246In0sCisgICAgICAgIHsiLkFkZC5OZXcuUGVybWlzc2lvbi4iLCAiICBBZGQgTmV3IFBlcm1pc3Npb246In0sCisgICAgICAgIHsiU2lnbmVkLkJ5LiIsICJTaWduZWQgQnk6In0sCisgICAgICAgIHsiQ2Fubm90LlNwZWNpZnkuUHJpbmNpcGFsLndpdGguYS5XaWxkY2FyZC5DbGFzcy53aXRob3V0LmEuV2lsZGNhcmQuTmFtZSIsCisgICAgICAgICAgICAiQ2Fubm90IFNwZWNpZnkgUHJpbmNpcGFsIHdpdGggYSBXaWxkY2FyZCBDbGFzcyB3aXRob3V0IGEgV2lsZGNhcmQgTmFtZSJ9LAorICAgICAgICB7IkNhbm5vdC5TcGVjaWZ5LlByaW5jaXBhbC53aXRob3V0LmEuTmFtZSIsCisgICAgICAgICAgICAiQ2Fubm90IFNwZWNpZnkgUHJpbmNpcGFsIHdpdGhvdXQgYSBOYW1lIn0sCisgICAgICAgIHsiUGVybWlzc2lvbi5hbmQuVGFyZ2V0Lk5hbWUubXVzdC5oYXZlLmEudmFsdWUiLAorICAgICAgICAgICAgICAgICJQZXJtaXNzaW9uIGFuZCBUYXJnZXQgTmFtZSBtdXN0IGhhdmUgYSB2YWx1ZSJ9LAorICAgICAgICB7IlJlbW92ZS50aGlzLlBvbGljeS5FbnRyeS4iLCAiUmVtb3ZlIHRoaXMgUG9saWN5IEVudHJ5PyJ9LAorICAgICAgICB7Ik92ZXJ3cml0ZS5GaWxlIiwgIk92ZXJ3cml0ZSBGaWxlIn0sCisgICAgICAgIHsiUG9saWN5LnN1Y2Nlc3NmdWxseS53cml0dGVuLnRvLmZpbGVuYW1lIiwKKyAgICAgICAgICAgICAgICAiUG9saWN5IHN1Y2Nlc3NmdWxseSB3cml0dGVuIHRvIHswfSJ9LAorICAgICAgICB7Im51bGwuZmlsZW5hbWUiLCAibnVsbCBmaWxlbmFtZSJ9LAorICAgICAgICB7IlNhdmUuY2hhbmdlcy4iLCAiU2F2ZSBjaGFuZ2VzPyJ9LAorICAgICAgICB7IlllcyIsICJZZXMifSwKKyAgICAgICAgeyJObyIsICJObyJ9LAorICAgICAgICB7IlBvbGljeS5FbnRyeSIsICJQb2xpY3kgRW50cnkifSwKKyAgICAgICAgeyJTYXZlLkNoYW5nZXMiLCAiU2F2ZSBDaGFuZ2VzIn0sCisgICAgICAgIHsiTm8uUG9saWN5LkVudHJ5LnNlbGVjdGVkIiwgIk5vIFBvbGljeSBFbnRyeSBzZWxlY3RlZCJ9LAorICAgICAgICB7IlVuYWJsZS50by5vcGVuLktleVN0b3JlLmV4LnRvU3RyaW5nLiIsCisgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBvcGVuIEtleVN0b3JlOiB7MH0ifSwKKyAgICAgICAgeyJOby5wcmluY2lwYWwuc2VsZWN0ZWQiLCAiTm8gcHJpbmNpcGFsIHNlbGVjdGVkIn0sCisgICAgICAgIHsiTm8ucGVybWlzc2lvbi5zZWxlY3RlZCIsICJObyBwZXJtaXNzaW9uIHNlbGVjdGVkIn0sCisgICAgICAgIHsibmFtZSIsICJuYW1lIn0sCisgICAgICAgIHsiY29uZmlndXJhdGlvbi50eXBlIiwgImNvbmZpZ3VyYXRpb24gdHlwZSJ9LAorICAgICAgICB7ImVudmlyb25tZW50LnZhcmlhYmxlLm5hbWUiLCAiZW52aXJvbm1lbnQgdmFyaWFibGUgbmFtZSJ9LAorICAgICAgICB7ImxpYnJhcnkubmFtZSIsICJsaWJyYXJ5IG5hbWUifSwKKyAgICAgICAgeyJwYWNrYWdlLm5hbWUiLCAicGFja2FnZSBuYW1lIn0sCisgICAgICAgIHsicG9saWN5LnR5cGUiLCAicG9saWN5IHR5cGUifSwKKyAgICAgICAgeyJwcm9wZXJ0eS5uYW1lIiwgInByb3BlcnR5IG5hbWUifSwKKyAgICAgICAgeyJwcm92aWRlci5uYW1lIiwgInByb3ZpZGVyIG5hbWUifSwKKyAgICAgICAgeyJQcmluY2lwYWwuTGlzdCIsICJQcmluY2lwYWwgTGlzdCJ9LAorICAgICAgICB7IlBlcm1pc3Npb24uTGlzdCIsICJQZXJtaXNzaW9uIExpc3QifSwKKyAgICAgICAgeyJDb2RlLkJhc2UiLCAiQ29kZSBCYXNlIn0sCisgICAgICAgIHsiS2V5U3RvcmUuVS5SLkwuIiwgIktleVN0b3JlIFUgUiBMOiJ9LAorICAgICAgICB7IktleVN0b3JlLlBhc3N3b3JkLlUuUi5MLiIsICJLZXlTdG9yZSBQYXNzd29yZCBVIFIgTDoifQorICAgIH07CisKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGNvbnRlbnRzIG9mIHRoaXMgPGNvZGU+UmVzb3VyY2VCdW5kbGU8L2NvZGU+LgorICAgICAqCisgICAgICogPHA+CisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBjb250ZW50cyBvZiB0aGlzIDxjb2RlPlJlc291cmNlQnVuZGxlPC9jb2RlPi4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0W11bXSBnZXRDb250ZW50cygpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRlbnRzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdG9vbHMvcG9saWN5dG9vbC9SZXNvdXJjZXNfZGUuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdG9vbHMvcG9saWN5dG9vbC9SZXNvdXJjZXNfZGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2E0YzdlCi0tLSAvZGV2L251bGwKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS90b29scy9wb2xpY3l0b29sL1Jlc291cmNlc19kZS5qYXZhCkBAIC0wLDAgKzEsMTU2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBPcmFjbGUgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKKyAqIHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIHN1bi5zZWN1cml0eS50b29scy5wb2xpY3l0b29sOworCisvKioKKyAqIDxwPiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIDxjb2RlPlJlc291cmNlQnVuZGxlPC9jb2RlPgorICogZm9yIHRoZSBwb2xpY3l0b29sLgorICoKKyAqLworcHVibGljIGNsYXNzIFJlc291cmNlc19kZSBleHRlbmRzIGphdmEudXRpbC5MaXN0UmVzb3VyY2VCdW5kbGUgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W11bXSBjb250ZW50cyA9IHsKKyAgICAgICAgeyJORVdMSU5FIiwgIlxuIn0sCisgICAgICAgIHsiV2FybmluZy5BLnB1YmxpYy5rZXkuZm9yLmFsaWFzLnNpZ25lcnMuaS5kb2VzLm5vdC5leGlzdC5NYWtlLnN1cmUuYS5LZXlTdG9yZS5pcy5wcm9wZXJseS5jb25maWd1cmVkLiIsCisgICAgICAgICAgICAgICAgIldhcm51bmc6IEtlaW4gUHVibGljIEtleSBmXHUwMEZDciBBbGlhcyB7MH0gdm9yaGFuZGVuLiBWZXJnZXdpc3Nlcm4gU2llIHNpY2gsIGRhc3MgZGVyIEtleVN0b3JlIG9yZG51bmdzZ2VtXHUwMEU0XHUwMERGIGtvbmZpZ3VyaWVydCBpc3QuIn0sCisgICAgICAgIHsiV2FybmluZy5DbGFzcy5ub3QuZm91bmQuY2xhc3MiLCAiV2FybnVuZzogS2xhc3NlIG5pY2h0IGdlZnVuZGVuOiB7MH0ifSwKKyAgICAgICAgeyJXYXJuaW5nLkludmFsaWQuYXJndW1lbnQucy5mb3IuY29uc3RydWN0b3IuYXJnIiwKKyAgICAgICAgICAgICAgICAiV2FybnVuZzogVW5nXHUwMEZDbHRpZ2UocykgQXJndW1lbnQoZSkgZlx1MDBGQ3IgQ29uc3RydWN0b3I6IHswfSJ9LAorICAgICAgICB7IklsbGVnYWwuUHJpbmNpcGFsLlR5cGUudHlwZSIsICJVbmdcdTAwRkNsdGlnZXIgUHJpbmNpcGFsLVR5cDogezB9In0sCisgICAgICAgIHsiSWxsZWdhbC5vcHRpb24ub3B0aW9uIiwgIlVuZ1x1MDBGQ2x0aWdlIE9wdGlvbjogezB9In0sCisgICAgICAgIHsiVXNhZ2UucG9saWN5dG9vbC5vcHRpb25zLiIsICJWZXJ3ZW5kdW5nOiBwb2xpY3l0b29sIFtPcHRpb25lbl0ifSwKKyAgICAgICAgeyIuZmlsZS5maWxlLnBvbGljeS5maWxlLmxvY2F0aW9uIiwKKyAgICAgICAgICAgICAgICAiIFstZmlsZSA8RGF0ZWk+XSAgICBQb2xpY3ktRGF0ZWl2ZXJ6ZWljaG5pcyJ9LAorICAgICAgICB7Ik5ldyIsICJOZXUifSwKKyAgICAgICAgeyJPcGVuIiwgIlx1MDBENmZmbmVuIn0sCisgICAgICAgIHsiU2F2ZSIsICJTcGVpY2hlcm4ifSwKKyAgICAgICAgeyJTYXZlLkFzIiwgIlNwZWljaGVybiB1bnRlciJ9LAorICAgICAgICB7IlZpZXcuV2FybmluZy5Mb2ciLCAiV2FybnVuZ3Nsb2cgYW56ZWlnZW4ifSwKKyAgICAgICAgeyJFeGl0IiwgIkJlZW5kZW4ifSwKKyAgICAgICAgeyJBZGQuUG9saWN5LkVudHJ5IiwgIlBvbGljeS1FaW50cmFnIGhpbnp1Zlx1MDBGQ2dlbiJ9LAorICAgICAgICB7IkVkaXQuUG9saWN5LkVudHJ5IiwgIlBvbGljeS1FaW50cmFnIGJlYXJiZWl0ZW4ifSwKKyAgICAgICAgeyJSZW1vdmUuUG9saWN5LkVudHJ5IiwgIlBvbGljeS1FaW50cmFnIGVudGZlcm5lbiJ9LAorICAgICAgICB7IkVkaXQiLCAiQmVhcmJlaXRlbiJ9LAorICAgICAgICB7IlJldGFpbiIsICJCZWliZWhhbHRlbiJ9LAorCisgICAgICAgIHsiV2FybmluZy5GaWxlLm5hbWUubWF5LmluY2x1ZGUuZXNjYXBlZC5iYWNrc2xhc2guY2hhcmFjdGVycy5JdC5pcy5ub3QubmVjZXNzYXJ5LnRvLmVzY2FwZS5iYWNrc2xhc2guY2hhcmFjdGVycy50aGUudG9vbC5lc2NhcGVzIiwKKyAgICAgICAgICAgICJXYXJudW5nOiBNXHUwMEY2Z2xpY2hlcndlaXNlIGVudGhcdTAwRTRsdCBkZXIgRGF0ZWluYW1lIEVzY2FwZS1aZWljaGVuIG1pdCBCYWNrc2xhc2guIEVzIGlzdCBuaWNodCBub3R3ZW5kaWcsIEJhY2tzbGFzaC1aZWljaGVuIHp1IGVzY2FwZW4gKGRhcyBUb29sIGZcdTAwRkNocnQgZGllcyBhdXRvbWF0aXNjaCBiZWltIFNjaHJlaWJlbiBkZXMgUG9saWN5LUNvbnRlbnRzIGluIGRlbiBwZXJzaXN0ZW50ZW4gU3BlaWNoZXIgYXVzKS5cblxuS2xpY2tlbiBTaWUgYXVmIFwiQmVpYmVoYWx0ZW5cIiwgdW0gZGVuIGVpbmdlZ2ViZW5lbiBOYW1lbiBiZWl6dWJlaGFsdGVuIG9kZXIgYXVmIFwiQmVhcmJlaXRlblwiLCB1bSBkZW4gTmFtZW4genUgYmVhcmJlaXRlbi4ifSwKKworICAgICAgICB7IkFkZC5QdWJsaWMuS2V5LkFsaWFzIiwgIlB1YmxpYyBLZXktQWxpYXMgaGluenVmXHUwMEZDZ2VuIn0sCisgICAgICAgIHsiUmVtb3ZlLlB1YmxpYy5LZXkuQWxpYXMiLCAiUHVibGljIEtleS1BbGlhcyBlbnRmZXJuZW4ifSwKKyAgICAgICAgeyJGaWxlIiwgIkRhdGVpIn0sCisgICAgICAgIHsiS2V5U3RvcmUiLCAiS2V5U3RvcmUifSwKKyAgICAgICAgeyJQb2xpY3kuRmlsZS4iLCAiUG9saWN5LURhdGVpOiJ9LAorICAgICAgICB7IkNvdWxkLm5vdC5vcGVuLnBvbGljeS5maWxlLnBvbGljeUZpbGUuZS50b1N0cmluZy4iLAorICAgICAgICAgICAgICAgICJQb2xpY3ktRGF0ZWkga29ubnRlIG5pY2h0IGdlXHUwMEY2ZmZuZXQgd2VyZGVuOiB7MH06IHsxfSJ9LAorICAgICAgICB7IlBvbGljeS5Ub29sIiwgIlBvbGljeS1Ub29sIn0sCisgICAgICAgIHsiRXJyb3JzLmhhdmUub2NjdXJyZWQud2hpbGUub3BlbmluZy50aGUucG9saWN5LmNvbmZpZ3VyYXRpb24uVmlldy50aGUuV2FybmluZy5Mb2cuZm9yLm1vcmUuaW5mb3JtYXRpb24uIiwKKyAgICAgICAgICAgICAgICAiQmVpbSBcdTAwRDZmZm5lbiBkZXIgUG9saWN5LUtvbmZpZ3VyYXRpb24gc2luZCBGZWhsZXIgYXVmZ2V0cmV0ZW4uIFdlaXRlcmUgSW5mb3JtYXRpb25lbiBmaW5kZW4gU2llIGltIFdhcm51bmdzbG9nLiJ9LAorICAgICAgICB7IkVycm9yIiwgIkZlaGxlciJ9LAorICAgICAgICB7Ik9LIiwgIk9LIn0sCisgICAgICAgIHsiU3RhdHVzIiwgIlN0YXR1cyJ9LAorICAgICAgICB7Ildhcm5pbmciLCAiV2FybnVuZyJ9LAorICAgICAgICB7IlBlcm1pc3Npb24uIiwKKyAgICAgICAgICAgICAgICAiQmVyZWNodGlndW5nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifSwKKyAgICAgICAgeyJQcmluY2lwYWwuVHlwZS4iLCAiUHJpbmNpcGFsLVR5cDoifSwKKyAgICAgICAgeyJQcmluY2lwYWwuTmFtZS4iLCAiUHJpbmNpcGFsLU5hbWU6In0sCisgICAgICAgIHsiVGFyZ2V0Lk5hbWUuIiwKKyAgICAgICAgICAgICAgICAiWmllbG5hbWU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9LAorICAgICAgICB7IkFjdGlvbnMuIiwKKyAgICAgICAgICAgICAgICAiQWt0aW9uZW46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9LAorICAgICAgICB7Ik9LLnRvLm92ZXJ3cml0ZS5leGlzdGluZy5maWxlLmZpbGVuYW1lLiIsCisgICAgICAgICAgICAgICAgIlZvcmhhbmRlbmUgRGF0ZWkgezB9IFx1MDBGQ2JlcnNjaHJlaWJlbj8ifSwKKyAgICAgICAgeyJDYW5jZWwiLCAiQWJicmVjaGVuIn0sCisgICAgICAgIHsiQ29kZUJhc2UuIiwgIkNvZGVCYXNlOiJ9LAorICAgICAgICB7IlNpZ25lZEJ5LiIsICJTaWduZWRCeToifSwKKyAgICAgICAgeyJBZGQuUHJpbmNpcGFsIiwgIlByaW5jaXBhbCBoaW56dWZcdTAwRkNnZW4ifSwKKyAgICAgICAgeyJFZGl0LlByaW5jaXBhbCIsICJQcmluY2lwYWwgYmVhcmJlaXRlbiJ9LAorICAgICAgICB7IlJlbW92ZS5QcmluY2lwYWwiLCAiUHJpbmNpcGFsIGVudGZlcm5lbiJ9LAorICAgICAgICB7IlByaW5jaXBhbHMuIiwgIlByaW5jaXBhbHM6In0sCisgICAgICAgIHsiLkFkZC5QZXJtaXNzaW9uIiwgIiAgQmVyZWNodGlndW5nIGhpbnp1Zlx1MDBGQ2dlbiJ9LAorICAgICAgICB7Ii5FZGl0LlBlcm1pc3Npb24iLCAiICBCZXJlY2h0aWd1bmcgYmVhcmJlaXRlbiJ9LAorICAgICAgICB7IlJlbW92ZS5QZXJtaXNzaW9uIiwgIkJlcmVjaHRpZ3VuZyBlbnRmZXJuZW4ifSwKKyAgICAgICAgeyJEb25lIiwgIkZlcnRpZyJ9LAorICAgICAgICB7IktleVN0b3JlLlVSTC4iLCAiS2V5U3RvcmUtVVJMOiJ9LAorICAgICAgICB7IktleVN0b3JlLlR5cGUuIiwgIktleVN0b3JlLVR5cDoifSwKKyAgICAgICAgeyJLZXlTdG9yZS5Qcm92aWRlci4iLCAiS2V5U3RvcmUtUHJvdmlkZXI6In0sCisgICAgICAgIHsiS2V5U3RvcmUuUGFzc3dvcmQuVVJMLiIsICJLZXlTdG9yZS1LZW5ud29ydC1VUkw6In0sCisgICAgICAgIHsiUHJpbmNpcGFscyIsICJQcmluY2lwYWxzIn0sCisgICAgICAgIHsiLkVkaXQuUHJpbmNpcGFsLiIsICIgIFByaW5jaXBhbCBiZWFyYmVpdGVuOiJ9LAorICAgICAgICB7Ii5BZGQuTmV3LlByaW5jaXBhbC4iLCAiICBOZXVlbiBQcmluY2lwYWwgaGluenVmXHUwMEZDZ2VuOiJ9LAorICAgICAgICB7IlBlcm1pc3Npb25zIiwgIkJlcmVjaHRpZ3VuZ2VuIn0sCisgICAgICAgIHsiLkVkaXQuUGVybWlzc2lvbi4iLCAiICBCZXJlY2h0aWd1bmcgYmVhcmJlaXRlbjoifSwKKyAgICAgICAgeyIuQWRkLk5ldy5QZXJtaXNzaW9uLiIsICIgIE5ldWUgQmVyZWNodGlndW5nIGhpbnp1Zlx1MDBGQ2dlbjoifSwKKyAgICAgICAgeyJTaWduZWQuQnkuIiwgIlNpZ25pZXJ0IHZvbjoifSwKKyAgICAgICAgeyJDYW5ub3QuU3BlY2lmeS5QcmluY2lwYWwud2l0aC5hLldpbGRjYXJkLkNsYXNzLndpdGhvdXQuYS5XaWxkY2FyZC5OYW1lIiwKKyAgICAgICAgICAgICJQcmluY2lwYWwga2FubiBuaWNodCBtaXQgZWluZXIgUGxhdHpoYWx0ZXJrbGFzc2Ugb2huZSBQbGF0emhhbHRlcm5hbWVuIGFuZ2VnZWJlbiB3ZXJkZW4ifSwKKyAgICAgICAgeyJDYW5ub3QuU3BlY2lmeS5QcmluY2lwYWwud2l0aG91dC5hLk5hbWUiLAorICAgICAgICAgICAgIlByaW5jaXBhbCBrYW5uIG5pY2h0IG9obmUgZWluZW4gTmFtZW4gYW5nZWdlYmVuIHdlcmRlbiJ9LAorICAgICAgICB7IlBlcm1pc3Npb24uYW5kLlRhcmdldC5OYW1lLm11c3QuaGF2ZS5hLnZhbHVlIiwKKyAgICAgICAgICAgICAgICAiQmVyZWNodGlndW5nIHVuZCBaaWVsbmFtZSBtXHUwMEZDc3NlbiBlaW5lbiBXZXJ0IGhhYmVuIn0sCisgICAgICAgIHsiUmVtb3ZlLnRoaXMuUG9saWN5LkVudHJ5LiIsICJEaWVzZW4gUG9saWN5LUVpbnRyYWcgZW50ZmVybmVuPyJ9LAorICAgICAgICB7Ik92ZXJ3cml0ZS5GaWxlIiwgIkRhdGVpIFx1MDBGQ2JlcnNjaHJlaWJlbiJ9LAorICAgICAgICB7IlBvbGljeS5zdWNjZXNzZnVsbHkud3JpdHRlbi50by5maWxlbmFtZSIsCisgICAgICAgICAgICAgICAgIlBvbGljeSBlcmZvbGdyZWljaCBpbiB7MH0gZ2VzY2hyaWViZW4ifSwKKyAgICAgICAgeyJudWxsLmZpbGVuYW1lIiwgIk51bGwtRGF0ZWluYW1lIn0sCisgICAgICAgIHsiU2F2ZS5jaGFuZ2VzLiIsICJcdTAwQzRuZGVydW5nZW4gc3BlaWNoZXJuPyJ9LAorICAgICAgICB7IlllcyIsICJKYSJ9LAorICAgICAgICB7Ik5vIiwgIk5laW4ifSwKKyAgICAgICAgeyJQb2xpY3kuRW50cnkiLCAiUG9saWN5LUVpbnRyYWcifSwKKyAgICAgICAgeyJTYXZlLkNoYW5nZXMiLCAiXHUwMEM0bmRlcnVuZ2VuIHNwZWljaGVybiJ9LAorICAgICAgICB7Ik5vLlBvbGljeS5FbnRyeS5zZWxlY3RlZCIsICJLZWluIFBvbGljeS1FaW50cmFnIGF1c2dld1x1MDBFNGhsdCJ9LAorICAgICAgICB7IlVuYWJsZS50by5vcGVuLktleVN0b3JlLmV4LnRvU3RyaW5nLiIsCisgICAgICAgICAgICAgICAgIktleVN0b3JlIGthbm4gbmljaHQgZ2VcdTAwRjZmZm5ldCB3ZXJkZW46IHswfSJ9LAorICAgICAgICB7Ik5vLnByaW5jaXBhbC5zZWxlY3RlZCIsICJLZWluIFByaW5jaXBhbCBhdXNnZXdcdTAwRTRobHQifSwKKyAgICAgICAgeyJOby5wZXJtaXNzaW9uLnNlbGVjdGVkIiwgIktlaW5lIEJlcmVjaHRpZ3VuZyBhdXNnZXdcdTAwRTRobHQifSwKKyAgICAgICAgeyJuYW1lIiwgIk5hbWUifSwKKyAgICAgICAgeyJjb25maWd1cmF0aW9uLnR5cGUiLCAiS29uZmlndXJhdGlvbnN0eXAifSwKKyAgICAgICAgeyJlbnZpcm9ubWVudC52YXJpYWJsZS5uYW1lIiwgIlVtZ2VidW5nc3ZhcmlhYmxlbm5hbWUifSwKKyAgICAgICAgeyJsaWJyYXJ5Lm5hbWUiLCAiTGlicmFyeS1OYW1lIn0sCisgICAgICAgIHsicGFja2FnZS5uYW1lIiwgIlBhY2thZ2VuYW1lIn0sCisgICAgICAgIHsicG9saWN5LnR5cGUiLCAiUG9saWN5LVR5cCJ9LAorICAgICAgICB7InByb3BlcnR5Lm5hbWUiLCAiRWlnZW5zY2hhZnRzbmFtZSJ9LAorICAgICAgICB7InByb3ZpZGVyLm5hbWUiLCAiUHJvdmlkZXJuYW1lIn0sCisgICAgICAgIHsiUHJpbmNpcGFsLkxpc3QiLCAiUHJpbmNpcGFsLUxpc3RlIn0sCisgICAgICAgIHsiUGVybWlzc2lvbi5MaXN0IiwgIkJlcmVjaHRpZ3VuZ3NsaXN0ZSJ9LAorICAgICAgICB7IkNvZGUuQmFzZSIsICJDb2RlYmFzZSJ9LAorICAgICAgICB7IktleVN0b3JlLlUuUi5MLiIsICJLZXlTdG9yZS1VUkw6In0sCisgICAgICAgIHsiS2V5U3RvcmUuUGFzc3dvcmQuVS5SLkwuIiwgIktleVN0b3JlLUtlbm53b3J0LVVSTDoifQorICAgIH07CisKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGNvbnRlbnRzIG9mIHRoaXMgPGNvZGU+UmVzb3VyY2VCdW5kbGU8L2NvZGU+LgorICAgICAqCisgICAgICogPHA+CisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBjb250ZW50cyBvZiB0aGlzIDxjb2RlPlJlc291cmNlQnVuZGxlPC9jb2RlPi4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0W11bXSBnZXRDb250ZW50cygpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRlbnRzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdG9vbHMvcG9saWN5dG9vbC9SZXNvdXJjZXNfZXMuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdG9vbHMvcG9saWN5dG9vbC9SZXNvdXJjZXNfZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDI1NTAwCi0tLSAvZGV2L251bGwKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS90b29scy9wb2xpY3l0b29sL1Jlc291cmNlc19lcy5qYXZhCkBAIC0wLDAgKzEsMTU2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBPcmFjbGUgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKKyAqIHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIHN1bi5zZWN1cml0eS50b29scy5wb2xpY3l0b29sOworCisvKioKKyAqIDxwPiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIDxjb2RlPlJlc291cmNlQnVuZGxlPC9jb2RlPgorICogZm9yIHRoZSBwb2xpY3l0b29sLgorICoKKyAqLworcHVibGljIGNsYXNzIFJlc291cmNlc19lcyBleHRlbmRzIGphdmEudXRpbC5MaXN0UmVzb3VyY2VCdW5kbGUgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W11bXSBjb250ZW50cyA9IHsKKyAgICAgICAgeyJORVdMSU5FIiwgIlxuIn0sCisgICAgICAgIHsiV2FybmluZy5BLnB1YmxpYy5rZXkuZm9yLmFsaWFzLnNpZ25lcnMuaS5kb2VzLm5vdC5leGlzdC5NYWtlLnN1cmUuYS5LZXlTdG9yZS5pcy5wcm9wZXJseS5jb25maWd1cmVkLiIsCisgICAgICAgICAgICAgICAgIkFkdmVydGVuY2lhOiBubyBoYXkgY2xhdmUgcFx1MDBGQWJsaWNhIHBhcmEgZWwgYWxpYXMgezB9LiBBc2VnXHUwMEZBcmVzZSBkZSBxdWUgc2UgaGEgY29uZmlndXJhZG8gY29ycmVjdGFtZW50ZSB1biBhbG1hY1x1MDBFOW4gZGUgY2xhdmVzLiJ9LAorICAgICAgICB7Ildhcm5pbmcuQ2xhc3Mubm90LmZvdW5kLmNsYXNzIiwgIkFkdmVydGVuY2lhOiBubyBzZSBoYSBlbmNvbnRyYWRvIGxhIGNsYXNlOiB7MH0ifSwKKyAgICAgICAgeyJXYXJuaW5nLkludmFsaWQuYXJndW1lbnQucy5mb3IuY29uc3RydWN0b3IuYXJnIiwKKyAgICAgICAgICAgICAgICAiQWR2ZXJ0ZW5jaWE6IGFyZ3VtZW50byhzKSBubyB2XHUwMEUxbGlkbyhzKSBwYXJhIGVsIGNvbnN0cnVjdG9yOiB7MH0ifSwKKyAgICAgICAgeyJJbGxlZ2FsLlByaW5jaXBhbC5UeXBlLnR5cGUiLCAiVGlwbyBkZSBwcmluY2lwYWwgbm8gcGVybWl0aWRvOiB7MH0ifSwKKyAgICAgICAgeyJJbGxlZ2FsLm9wdGlvbi5vcHRpb24iLCAiT3BjaVx1MDBGM24gbm8gcGVybWl0aWRhOiB7MH0ifSwKKyAgICAgICAgeyJVc2FnZS5wb2xpY3l0b29sLm9wdGlvbnMuIiwgIlNpbnRheGlzOiBwb2xpY3l0b29sIFtvcGNpb25lc10ifSwKKyAgICAgICAgeyIuZmlsZS5maWxlLnBvbGljeS5maWxlLmxvY2F0aW9uIiwKKyAgICAgICAgICAgICAgICAiICBbLWZpbGUgPGFyY2hpdm8+XSAgICB1YmljYWNpXHUwMEYzbiBkZWwgYXJjaGl2byBkZSBub3JtYXMifSwKKyAgICAgICAgeyJOZXciLCAiTnVldm8ifSwKKyAgICAgICAgeyJPcGVuIiwgIkFicmlyIn0sCisgICAgICAgIHsiU2F2ZSIsICJHdWFyZGFyIn0sCisgICAgICAgIHsiU2F2ZS5BcyIsICJHdWFyZGFyIGNvbW8ifSwKKyAgICAgICAgeyJWaWV3Lldhcm5pbmcuTG9nIiwgIlZlciBMb2cgZGUgQWR2ZXJ0ZW5jaWFzIn0sCisgICAgICAgIHsiRXhpdCIsICJTYWxpciJ9LAorICAgICAgICB7IkFkZC5Qb2xpY3kuRW50cnkiLCAiQWdyZWdhciBFbnRyYWRhIGRlIFBvbFx1MDBFRHRpY2EifSwKKyAgICAgICAgeyJFZGl0LlBvbGljeS5FbnRyeSIsICJFZGl0YXIgRW50cmFkYSBkZSBQb2xcdTAwRUR0aWNhIn0sCisgICAgICAgIHsiUmVtb3ZlLlBvbGljeS5FbnRyeSIsICJFbGltaW5hciBFbnRyYWRhIGRlIFBvbFx1MDBFRHRpY2EifSwKKyAgICAgICAgeyJFZGl0IiwgIkVkaXRhciJ9LAorICAgICAgICB7IlJldGFpbiIsICJNYW50ZW5lciJ9LAorCisgICAgICAgIHsiV2FybmluZy5GaWxlLm5hbWUubWF5LmluY2x1ZGUuZXNjYXBlZC5iYWNrc2xhc2guY2hhcmFjdGVycy5JdC5pcy5ub3QubmVjZXNzYXJ5LnRvLmVzY2FwZS5iYWNrc2xhc2guY2hhcmFjdGVycy50aGUudG9vbC5lc2NhcGVzIiwKKyAgICAgICAgICAgICJBZHZlcnRlbmNpYTogZWwgbm9tYnJlIGRlbCBhcmNoaXZvIHB1ZWRlIGNvbnRlbmVyIGNhcmFjdGVyZXMgZGUgYmFycmEgaW52ZXJ0aWRhIGRlIGVzY2FwZS4gTm8gZXMgbmVjZXNhcmlvIHV0aWxpemFyIGJhcnJhcyBpbnZlcnRpZGFzIGRlIGVzY2FwZSAobGEgaGVycmFtaWVudGEgYXBsaWNhIGNhcmFjdGVyZXMgZGUgZXNjYXBlIHNlZ1x1MDBGQW4gc2VhIG5lY2VzYXJpbyBhbCBlc2NyaWJpciBlbCBjb250ZW5pZG8gZGUgbGFzIHBvbFx1MDBFRHRpY2FzIGVuIGVsIGFsbWFjXHUwMEU5biBwZXJzaXN0ZW50ZSkuXG5cbkhhZ2EgY2xpYyBlbiBNYW50ZW5lciBwYXJhIGNvbnNlcnZhciBlbCBub21icmUgaW50cm9kdWNpZG8gbyBlbiBFZGl0YXIgcGFyYSBtb2RpZmljYXJsby4ifSwKKworICAgICAgICB7IkFkZC5QdWJsaWMuS2V5LkFsaWFzIiwgIkFncmVnYXIgQWxpYXMgZGUgQ2xhdmUgUFx1MDBGQWJsaWNvIn0sCisgICAgICAgIHsiUmVtb3ZlLlB1YmxpYy5LZXkuQWxpYXMiLCAiRWxpbWluYXIgQWxpYXMgZGUgQ2xhdmUgUFx1MDBGQWJsaWNvIn0sCisgICAgICAgIHsiRmlsZSIsICJBcmNoaXZvIn0sCisgICAgICAgIHsiS2V5U3RvcmUiLCAiQWxtYWNcdTAwRTluIGRlIENsYXZlcyJ9LAorICAgICAgICB7IlBvbGljeS5GaWxlLiIsICJBcmNoaXZvIGRlIFBvbFx1MDBFRHRpY2E6In0sCisgICAgICAgIHsiQ291bGQubm90Lm9wZW4ucG9saWN5LmZpbGUucG9saWN5RmlsZS5lLnRvU3RyaW5nLiIsCisgICAgICAgICAgICAgICAgIk5vIHNlIGhhIHBvZGlkbyBhYnJpciBlbCBhcmNoaXZvIGRlIHBvbFx1MDBFRHRpY2E6IHswfTogezF9In0sCisgICAgICAgIHsiUG9saWN5LlRvb2wiLCAiSGVycmFtaWVudGEgZGUgUG9sXHUwMEVEdGljYXMifSwKKyAgICAgICAgeyJFcnJvcnMuaGF2ZS5vY2N1cnJlZC53aGlsZS5vcGVuaW5nLnRoZS5wb2xpY3kuY29uZmlndXJhdGlvbi5WaWV3LnRoZS5XYXJuaW5nLkxvZy5mb3IubW9yZS5pbmZvcm1hdGlvbi4iLAorICAgICAgICAgICAgICAgICJIYSBoYWJpZG8gZXJyb3JlcyBhbCBhYnJpciBsYSBjb25maWd1cmFjaVx1MDBGM24gZGUgcG9sXHUwMEVEdGljYXMuIFZcdTAwRTlhc2UgZWwgbG9nIGRlIGFkdmVydGVuY2lhcyBwYXJhIG9idGVuZXIgbVx1MDBFMXMgaW5mb3JtYWNpXHUwMEYzbi4ifSwKKyAgICAgICAgeyJFcnJvciIsICJFcnJvciJ9LAorICAgICAgICB7Ik9LIiwgIkFjZXB0YXIifSwKKyAgICAgICAgeyJTdGF0dXMiLCAiRXN0YWRvIn0sCisgICAgICAgIHsiV2FybmluZyIsICJBZHZlcnRlbmNpYSJ9LAorICAgICAgICB7IlBlcm1pc3Npb24uIiwKKyAgICAgICAgICAgICAgICAiUGVybWlzbzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIn0sCisgICAgICAgIHsiUHJpbmNpcGFsLlR5cGUuIiwgIlRpcG8gZGUgUHJpbmNpcGFsOiJ9LAorICAgICAgICB7IlByaW5jaXBhbC5OYW1lLiIsICJOb21icmUgZGUgUHJpbmNpcGFsOiJ9LAorICAgICAgICB7IlRhcmdldC5OYW1lLiIsCisgICAgICAgICAgICAgICAgIk5vbWJyZSBkZSBEZXN0aW5vOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifSwKKyAgICAgICAgeyJBY3Rpb25zLiIsCisgICAgICAgICAgICAgICAgIkFjY2lvbmVzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifSwKKyAgICAgICAgeyJPSy50by5vdmVyd3JpdGUuZXhpc3RpbmcuZmlsZS5maWxlbmFtZS4iLAorICAgICAgICAgICAgICAgICJcdTAwQkZTb2JyZXNjcmliaXIgZWwgYXJjaGl2byBleGlzdGVudGUgezB9PyJ9LAorICAgICAgICB7IkNhbmNlbCIsICJDYW5jZWxhciJ9LAorICAgICAgICB7IkNvZGVCYXNlLiIsICJDb2RlQmFzZToifSwKKyAgICAgICAgeyJTaWduZWRCeS4iLCAiU2lnbmVkQnk6In0sCisgICAgICAgIHsiQWRkLlByaW5jaXBhbCIsICJBZ3JlZ2FyIFByaW5jaXBhbCJ9LAorICAgICAgICB7IkVkaXQuUHJpbmNpcGFsIiwgIkVkaXRhciBQcmluY2lwYWwifSwKKyAgICAgICAgeyJSZW1vdmUuUHJpbmNpcGFsIiwgIkVsaW1pbmFyIFByaW5jaXBhbCJ9LAorICAgICAgICB7IlByaW5jaXBhbHMuIiwgIlByaW5jaXBhbGVzOiJ9LAorICAgICAgICB7Ii5BZGQuUGVybWlzc2lvbiIsICIgIEFncmVnYXIgUGVybWlzbyJ9LAorICAgICAgICB7Ii5FZGl0LlBlcm1pc3Npb24iLCAiICBFZGl0YXIgUGVybWlzbyJ9LAorICAgICAgICB7IlJlbW92ZS5QZXJtaXNzaW9uIiwgIkVsaW1pbmFyIFBlcm1pc28ifSwKKyAgICAgICAgeyJEb25lIiwgIkxpc3RvIn0sCisgICAgICAgIHsiS2V5U3RvcmUuVVJMLiIsICJVUkwgZGUgQWxtYWNcdTAwRTluIGRlIENsYXZlczoifSwKKyAgICAgICAgeyJLZXlTdG9yZS5UeXBlLiIsICJUaXBvIGRlIEFsbWFjXHUwMEU5biBkZSBDbGF2ZXM6In0sCisgICAgICAgIHsiS2V5U3RvcmUuUHJvdmlkZXIuIiwgIlByb3ZlZWRvciBkZSBBbG1hY1x1MDBFOW4gZGUgQ2xhdmVzOiJ9LAorICAgICAgICB7IktleVN0b3JlLlBhc3N3b3JkLlVSTC4iLCAiVVJMIGRlIENvbnRyYXNlXHUwMEYxYSBkZSBBbG1hY1x1MDBFOW4gZGUgQ2xhdmVzOiJ9LAorICAgICAgICB7IlByaW5jaXBhbHMiLCAiUHJpbmNpcGFsZXMifSwKKyAgICAgICAgeyIuRWRpdC5QcmluY2lwYWwuIiwgIiAgRWRpdGFyIFByaW5jaXBhbDoifSwKKyAgICAgICAgeyIuQWRkLk5ldy5QcmluY2lwYWwuIiwgIiAgQWdyZWdhciBOdWV2byBQcmluY2lwYWw6In0sCisgICAgICAgIHsiUGVybWlzc2lvbnMiLCAiUGVybWlzb3MifSwKKyAgICAgICAgeyIuRWRpdC5QZXJtaXNzaW9uLiIsICIgIEVkaXRhciBQZXJtaXNvOiJ9LAorICAgICAgICB7Ii5BZGQuTmV3LlBlcm1pc3Npb24uIiwgIiAgQWdyZWdhciBQZXJtaXNvIE51ZXZvOiJ9LAorICAgICAgICB7IlNpZ25lZC5CeS4iLCAiRmlybWFkbyBQb3I6In0sCisgICAgICAgIHsiQ2Fubm90LlNwZWNpZnkuUHJpbmNpcGFsLndpdGguYS5XaWxkY2FyZC5DbGFzcy53aXRob3V0LmEuV2lsZGNhcmQuTmFtZSIsCisgICAgICAgICAgICAiTm8gc2UgcHVlZGUgZXNwZWNpZmljYXIgdW4gcHJpbmNpcGFsIGNvbiB1bmEgY2xhc2UgZGUgY29tb2RcdTAwRURuIHNpbiB1biBub21icmUgZGUgY29tb2RcdTAwRURuIn0sCisgICAgICAgIHsiQ2Fubm90LlNwZWNpZnkuUHJpbmNpcGFsLndpdGhvdXQuYS5OYW1lIiwKKyAgICAgICAgICAgICJObyBzZSBwdWVkZSBlc3BlY2lmaWNhciBlbCBwcmluY2lwYWwgc2luIHVuIG5vbWJyZSJ9LAorICAgICAgICB7IlBlcm1pc3Npb24uYW5kLlRhcmdldC5OYW1lLm11c3QuaGF2ZS5hLnZhbHVlIiwKKyAgICAgICAgICAgICAgICAiUGVybWlzbyB5IE5vbWJyZSBkZSBEZXN0aW5vIGRlYmVuIHRlbmVyIHVuIHZhbG9yIn0sCisgICAgICAgIHsiUmVtb3ZlLnRoaXMuUG9saWN5LkVudHJ5LiIsICJcdTAwQkZFbGltaW5hciBlc3RhIGVudHJhZGEgZGUgcG9sXHUwMEVEdGljYT8ifSwKKyAgICAgICAgeyJPdmVyd3JpdGUuRmlsZSIsICJTb2JyZXNjcmliaXIgQXJjaGl2byJ9LAorICAgICAgICB7IlBvbGljeS5zdWNjZXNzZnVsbHkud3JpdHRlbi50by5maWxlbmFtZSIsCisgICAgICAgICAgICAgICAgIlBvbFx1MDBFRHRpY2EgZXNjcml0YSBjb3JyZWN0YW1lbnRlIGVuIHswfSJ9LAorICAgICAgICB7Im51bGwuZmlsZW5hbWUiLCAibm9tYnJlIGRlIGFyY2hpdm8gbnVsbyJ9LAorICAgICAgICB7IlNhdmUuY2hhbmdlcy4iLCAiXHUwMEJGR3VhcmRhciBsb3MgY2FtYmlvcz8ifSwKKyAgICAgICAgeyJZZXMiLCAiU1x1MDBFRCJ9LAorICAgICAgICB7Ik5vIiwgIk5vIn0sCisgICAgICAgIHsiUG9saWN5LkVudHJ5IiwgIkVudHJhZGEgZGUgUG9sXHUwMEVEdGljYSJ9LAorICAgICAgICB7IlNhdmUuQ2hhbmdlcyIsICJHdWFyZGFyIENhbWJpb3MifSwKKyAgICAgICAgeyJOby5Qb2xpY3kuRW50cnkuc2VsZWN0ZWQiLCAiTm8gc2UgaGEgc2VsZWNjaW9uYWRvIGxhIGVudHJhZGEgZGUgcG9sXHUwMEVEdGljYSJ9LAorICAgICAgICB7IlVuYWJsZS50by5vcGVuLktleVN0b3JlLmV4LnRvU3RyaW5nLiIsCisgICAgICAgICAgICAgICAgIk5vIHNlIGhhIHBvZGlkbyBhYnJpciBlbCBhbG1hY1x1MDBFOW4gZGUgY2xhdmVzOiB7MH0ifSwKKyAgICAgICAgeyJOby5wcmluY2lwYWwuc2VsZWN0ZWQiLCAiTm8gc2UgaGEgc2VsZWNjaW9uYWRvIHVuIHByaW5jaXBhbCJ9LAorICAgICAgICB7Ik5vLnBlcm1pc3Npb24uc2VsZWN0ZWQiLCAiTm8gc2UgaGEgc2VsZWNjaW9uYWRvIHVuIHBlcm1pc28ifSwKKyAgICAgICAgeyJuYW1lIiwgIm5vbWJyZSJ9LAorICAgICAgICB7ImNvbmZpZ3VyYXRpb24udHlwZSIsICJ0aXBvIGRlIGNvbmZpZ3VyYWNpXHUwMEYzbiJ9LAorICAgICAgICB7ImVudmlyb25tZW50LnZhcmlhYmxlLm5hbWUiLCAibm9tYnJlIGRlIHZhcmlhYmxlIGRlIGVudG9ybm8ifSwKKyAgICAgICAgeyJsaWJyYXJ5Lm5hbWUiLCAibm9tYnJlIGRlIGxhIGJpYmxpb3RlY2EifSwKKyAgICAgICAgeyJwYWNrYWdlLm5hbWUiLCAibm9tYnJlIGRlbCBwYXF1ZXRlIn0sCisgICAgICAgIHsicG9saWN5LnR5cGUiLCAidGlwbyBkZSBwb2xcdTAwRUR0aWNhIn0sCisgICAgICAgIHsicHJvcGVydHkubmFtZSIsICJub21icmUgZGUgbGEgcHJvcGllZGFkIn0sCisgICAgICAgIHsicHJvdmlkZXIubmFtZSIsICJub21icmUgZGVsIHByb3ZlZWRvciJ9LAorICAgICAgICB7IlByaW5jaXBhbC5MaXN0IiwgIkxpc3RhIGRlIFByaW5jaXBhbGVzIn0sCisgICAgICAgIHsiUGVybWlzc2lvbi5MaXN0IiwgIkxpc3RhIGRlIFBlcm1pc29zIn0sCisgICAgICAgIHsiQ29kZS5CYXNlIiwgIkJhc2UgZGUgQ1x1MDBGM2RpZ28ifSwKKyAgICAgICAgeyJLZXlTdG9yZS5VLlIuTC4iLCAiVVJMIGRlIEFsbWFjXHUwMEU5biBkZSBDbGF2ZXM6In0sCisgICAgICAgIHsiS2V5U3RvcmUuUGFzc3dvcmQuVS5SLkwuIiwgIlVSTCBkZSBDb250cmFzZVx1MDBGMWEgZGUgQWxtYWNcdTAwRTluIGRlIENsYXZlczoifQorICAgIH07CisKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGNvbnRlbnRzIG9mIHRoaXMgPGNvZGU+UmVzb3VyY2VCdW5kbGU8L2NvZGU+LgorICAgICAqCisgICAgICogPHA+CisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBjb250ZW50cyBvZiB0aGlzIDxjb2RlPlJlc291cmNlQnVuZGxlPC9jb2RlPi4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0W11bXSBnZXRDb250ZW50cygpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRlbnRzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdG9vbHMvcG9saWN5dG9vbC9SZXNvdXJjZXNfZnIuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdG9vbHMvcG9saWN5dG9vbC9SZXNvdXJjZXNfZnIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OThlOWNjCi0tLSAvZGV2L251bGwKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS90b29scy9wb2xpY3l0b29sL1Jlc291cmNlc19mci5qYXZhCkBAIC0wLDAgKzEsMTU2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBPcmFjbGUgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKKyAqIHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIHN1bi5zZWN1cml0eS50b29scy5wb2xpY3l0b29sOworCisvKioKKyAqIDxwPiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIDxjb2RlPlJlc291cmNlQnVuZGxlPC9jb2RlPgorICogZm9yIHRoZSBwb2xpY3l0b29sLgorICoKKyAqLworcHVibGljIGNsYXNzIFJlc291cmNlc19mciBleHRlbmRzIGphdmEudXRpbC5MaXN0UmVzb3VyY2VCdW5kbGUgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W11bXSBjb250ZW50cyA9IHsKKyAgICAgICAgeyJORVdMSU5FIiwgIlxuIn0sCisgICAgICAgIHsiV2FybmluZy5BLnB1YmxpYy5rZXkuZm9yLmFsaWFzLnNpZ25lcnMuaS5kb2VzLm5vdC5leGlzdC5NYWtlLnN1cmUuYS5LZXlTdG9yZS5pcy5wcm9wZXJseS5jb25maWd1cmVkLiIsCisgICAgICAgICAgICAgICAgIkF2ZXJ0aXNzZW1lbnRcdTAwQTA6IGlsIG4nJ2V4aXN0ZSBwYXMgZGUgY2xcdTAwRTkgcHVibGlxdWUgcG91ciBsJydhbGlhcyB7MH0uIFZcdTAwRTlyaWZpZXogcXVlIGxlIGZpY2hpZXIgZGUgY2xcdTAwRTlzIGQnJ2FjY1x1MDBFOHMgZXN0IGNvcnJlY3RlbWVudCBjb25maWd1clx1MDBFOS4ifSwKKyAgICAgICAgeyJXYXJuaW5nLkNsYXNzLm5vdC5mb3VuZC5jbGFzcyIsICJBdmVydGlzc2VtZW50IDogY2xhc3NlIGludHJvdXZhYmxlIC0gezB9In0sCisgICAgICAgIHsiV2FybmluZy5JbnZhbGlkLmFyZ3VtZW50LnMuZm9yLmNvbnN0cnVjdG9yLmFyZyIsCisgICAgICAgICAgICAgICAgIkF2ZXJ0aXNzZW1lbnRcdTAwQTA6IGFyZ3VtZW50cyBub24gdmFsaWRlcyBwb3VyIGxlIGNvbnN0cnVjdGV1clx1MDBBMC0gezB9In0sCisgICAgICAgIHsiSWxsZWdhbC5QcmluY2lwYWwuVHlwZS50eXBlIiwgIlR5cGUgZGUgcHJpbmNpcGFsIG5vbiBhZG1pcyA6IHswfSJ9LAorICAgICAgICB7IklsbGVnYWwub3B0aW9uLm9wdGlvbiIsICJPcHRpb24gbm9uIGFkbWlzZSA6IHswfSJ9LAorICAgICAgICB7IlVzYWdlLnBvbGljeXRvb2wub3B0aW9ucy4iLCAiU3ludGF4ZSA6IHBvbGljeXRvb2wgW29wdGlvbnNdIn0sCisgICAgICAgIHsiLmZpbGUuZmlsZS5wb2xpY3kuZmlsZS5sb2NhdGlvbiIsCisgICAgICAgICAgICAgICAgIiAgWy1maWxlIDxmaWxlPl0gICAgZW1wbGFjZW1lbnQgZHUgZmljaGllciBkZSByXHUwMEU4Z2xlcyJ9LAorICAgICAgICB7Ik5ldyIsICJOb3V2ZWF1In0sCisgICAgICAgIHsiT3BlbiIsICJPdXZyaXIifSwKKyAgICAgICAgeyJTYXZlIiwgIkVucmVnaXN0cmVyIn0sCisgICAgICAgIHsiU2F2ZS5BcyIsICJFbnJlZ2lzdHJlciBzb3VzIn0sCisgICAgICAgIHsiVmlldy5XYXJuaW5nLkxvZyIsICJBZmZpY2hlciBsZSBqb3VybmFsIGRlcyBhdmVydGlzc2VtZW50cyJ9LAorICAgICAgICB7IkV4aXQiLCAiUXVpdHRlciJ9LAorICAgICAgICB7IkFkZC5Qb2xpY3kuRW50cnkiLCAiQWpvdXRlciB1bmUgclx1MDBFOGdsZSJ9LAorICAgICAgICB7IkVkaXQuUG9saWN5LkVudHJ5IiwgIk1vZGlmaWVyIHVuZSByXHUwMEU4Z2xlIn0sCisgICAgICAgIHsiUmVtb3ZlLlBvbGljeS5FbnRyeSIsICJFbmxldmVyIHVuZSByXHUwMEU4Z2xlIn0sCisgICAgICAgIHsiRWRpdCIsICJNb2RpZmllciJ9LAorICAgICAgICB7IlJldGFpbiIsICJDb25zZXJ2ZXIifSwKKworICAgICAgICB7Ildhcm5pbmcuRmlsZS5uYW1lLm1heS5pbmNsdWRlLmVzY2FwZWQuYmFja3NsYXNoLmNoYXJhY3RlcnMuSXQuaXMubm90Lm5lY2Vzc2FyeS50by5lc2NhcGUuYmFja3NsYXNoLmNoYXJhY3RlcnMudGhlLnRvb2wuZXNjYXBlcyIsCisgICAgICAgICAgICAiQXZlcnRpc3NlbWVudCA6IGlsIHNlIHBldXQgcXVlIGxlIG5vbSBkZSBmaWNoaWVyIGNvbnRpZW5uZSBkZXMgYmFycmVzIG9ibGlxdWVzIGludmVyc2VzIGF2ZWMgY2FyYWN0XHUwMEU4cmUgZCdcdTAwRTljaGFwcGVtZW50LiBJbCBuJ2VzdCBwYXMgblx1MDBFOWNlc3NhaXJlIGQnYWpvdXRlciB1biBjYXJhY3RcdTAwRThyZSBkJ1x1MDBFOWNoYXBwZW1lbnQgYXV4IGJhcnJlcyBvYmxpcXVlcyBpbnZlcnNlcy4gTCdvdXRpbCBwcm9jXHUwMEU4ZGUgXHUwMEUwIGwnXHUwMEU5Y2hhcHBlbWVudCBzaSBuXHUwMEU5Y2Vzc2FpcmUgbG9yc3F1J2lsIFx1MDBFOWNyaXQgbGUgY29udGVudSBkZXMgclx1MDBFOGdsZXMgZGFucyBsYSB6b25lIGRlIHN0b2NrYWdlIHBlcnNpc3RhbnQpLlxuXG5DbGlxdWV6IHN1ciBDb25zZXJ2ZXIgcG91ciBnYXJkZXIgbGUgbm9tIHNhaXNpIG91IHN1ciBNb2RpZmllciBwb3VyIGxlIHJlbXBsYWNlci4ifSwKKworICAgICAgICB7IkFkZC5QdWJsaWMuS2V5LkFsaWFzIiwgIkFqb3V0ZXIgdW4gYWxpYXMgZGUgY2xcdTAwRTkgcHVibGlxdWUifSwKKyAgICAgICAgeyJSZW1vdmUuUHVibGljLktleS5BbGlhcyIsICJFbmxldmVyIHVuIGFsaWFzIGRlIGNsXHUwMEU5IHB1YmxpcXVlIn0sCisgICAgICAgIHsiRmlsZSIsICJGaWNoaWVyIn0sCisgICAgICAgIHsiS2V5U3RvcmUiLCAiRmljaGllciBkZSBjbFx1MDBFOXMifSwKKyAgICAgICAgeyJQb2xpY3kuRmlsZS4iLCAiRmljaGllciBkZSByXHUwMEU4Z2xlcyA6In0sCisgICAgICAgIHsiQ291bGQubm90Lm9wZW4ucG9saWN5LmZpbGUucG9saWN5RmlsZS5lLnRvU3RyaW5nLiIsCisgICAgICAgICAgICAgICAgIkltcG9zc2libGUgZCcnb3V2cmlyIGxlIGZpY2hpZXIgZGUgclx1MDBFOGdsZXNcdTAwQTA6IHswfTogezF9In0sCisgICAgICAgIHsiUG9saWN5LlRvb2wiLCAiUG9saWN5IFRvb2wifSwKKyAgICAgICAgeyJFcnJvcnMuaGF2ZS5vY2N1cnJlZC53aGlsZS5vcGVuaW5nLnRoZS5wb2xpY3kuY29uZmlndXJhdGlvbi5WaWV3LnRoZS5XYXJuaW5nLkxvZy5mb3IubW9yZS5pbmZvcm1hdGlvbi4iLAorICAgICAgICAgICAgICAgICJEZXMgZXJyZXVycyBzZSBzb250IHByb2R1aXRlcyBcdTAwRTAgbCdvdXZlcnR1cmUgZGUgbGEgY29uZmlndXJhdGlvbiBkZSByXHUwMEU4Z2xlcy4gUG91ciBwbHVzIGQnaW5mb3JtYXRpb25zLCBjb25zdWx0ZXogbGUgam91cm5hbCBkZXMgYXZlcnRpc3NlbWVudHMuIn0sCisgICAgICAgIHsiRXJyb3IiLCAiRXJyZXVyIn0sCisgICAgICAgIHsiT0siLCAiT0sifSwKKyAgICAgICAgeyJTdGF0dXMiLCAiU3RhdHV0In0sCisgICAgICAgIHsiV2FybmluZyIsICJBdmVydGlzc2VtZW50In0sCisgICAgICAgIHsiUGVybWlzc2lvbi4iLAorICAgICAgICAgICAgICAgICJEcm9pdCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9LAorICAgICAgICB7IlByaW5jaXBhbC5UeXBlLiIsICJUeXBlIGRlIHByaW5jaXBhbCA6In0sCisgICAgICAgIHsiUHJpbmNpcGFsLk5hbWUuIiwgIk5vbSBkZSBwcmluY2lwYWwgOiJ9LAorICAgICAgICB7IlRhcmdldC5OYW1lLiIsCisgICAgICAgICAgICAgICAgIk5vbSBkZSBjaWJsZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9LAorICAgICAgICB7IkFjdGlvbnMuIiwKKyAgICAgICAgICAgICAgICAiQWN0aW9ucyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9LAorICAgICAgICB7Ik9LLnRvLm92ZXJ3cml0ZS5leGlzdGluZy5maWxlLmZpbGVuYW1lLiIsCisgICAgICAgICAgICAgICAgIlJlbXBsYWNlciBsZSBmaWNoaWVyIGV4aXN0YW50IHswfSA/In0sCisgICAgICAgIHsiQ2FuY2VsIiwgIkFubnVsZXIifSwKKyAgICAgICAgeyJDb2RlQmFzZS4iLCAiQmFzZSBkZSBjb2RlIDoifSwKKyAgICAgICAgeyJTaWduZWRCeS4iLCAiU2lnblx1MDBFOSBwYXIgOiJ9LAorICAgICAgICB7IkFkZC5QcmluY2lwYWwiLCAiQWpvdXRlciB1biBwcmluY2lwYWwifSwKKyAgICAgICAgeyJFZGl0LlByaW5jaXBhbCIsICJNb2RpZmllciB1biBwcmluY2lwYWwifSwKKyAgICAgICAgeyJSZW1vdmUuUHJpbmNpcGFsIiwgIkVubGV2ZXIgdW4gcHJpbmNpcGFsIn0sCisgICAgICAgIHsiUHJpbmNpcGFscy4iLCAiUHJpbmNpcGF1eCA6In0sCisgICAgICAgIHsiLkFkZC5QZXJtaXNzaW9uIiwgIiAgQWpvdXRlciB1biBkcm9pdCJ9LAorICAgICAgICB7Ii5FZGl0LlBlcm1pc3Npb24iLCAiICBNb2RpZmllciB1biBkcm9pdCJ9LAorICAgICAgICB7IlJlbW92ZS5QZXJtaXNzaW9uIiwgIkVubGV2ZXIgdW4gZHJvaXQifSwKKyAgICAgICAgeyJEb25lIiwgIlRlcm1pblx1MDBFOSJ9LAorICAgICAgICB7IktleVN0b3JlLlVSTC4iLCAiVVJMIGR1IGZpY2hpZXIgZGUgY2xcdTAwRTlzIDoifSwKKyAgICAgICAgeyJLZXlTdG9yZS5UeXBlLiIsICJUeXBlIGR1IGZpY2hpZXIgZGUgY2xcdTAwRTlzIDoifSwKKyAgICAgICAgeyJLZXlTdG9yZS5Qcm92aWRlci4iLCAiRm91cm5pc3NldXIgZHUgZmljaGllciBkZSBjbFx1MDBFOXMgOiJ9LAorICAgICAgICB7IktleVN0b3JlLlBhc3N3b3JkLlVSTC4iLCAiVVJMIGR1IG1vdCBkZSBwYXNzZSBkdSBmaWNoaWVyIGRlIGNsXHUwMEU5cyA6In0sCisgICAgICAgIHsiUHJpbmNpcGFscyIsICJQcmluY2lwYXV4In0sCisgICAgICAgIHsiLkVkaXQuUHJpbmNpcGFsLiIsICIgIE1vZGlmaWVyIHVuIHByaW5jaXBhbCA6In0sCisgICAgICAgIHsiLkFkZC5OZXcuUHJpbmNpcGFsLiIsICIgIEFqb3V0ZXIgdW4gcHJpbmNpcGFsIDoifSwKKyAgICAgICAgeyJQZXJtaXNzaW9ucyIsICJEcm9pdHMifSwKKyAgICAgICAgeyIuRWRpdC5QZXJtaXNzaW9uLiIsICIgIE1vZGlmaWVyIHVuIGRyb2l0IDoifSwKKyAgICAgICAgeyIuQWRkLk5ldy5QZXJtaXNzaW9uLiIsICIgIEFqb3V0ZXIgdW4gZHJvaXQgOiJ9LAorICAgICAgICB7IlNpZ25lZC5CeS4iLCAiU2lnblx1MDBFOSBwYXIgOiJ9LAorICAgICAgICB7IkNhbm5vdC5TcGVjaWZ5LlByaW5jaXBhbC53aXRoLmEuV2lsZGNhcmQuQ2xhc3Mud2l0aG91dC5hLldpbGRjYXJkLk5hbWUiLAorICAgICAgICAgICAgIkltcG9zc2libGUgZGUgc3BcdTAwRTljaWZpZXIgdW4gcHJpbmNpcGFsIGF2ZWMgdW5lIGNsYXNzZSBnXHUwMEU5blx1MDBFOXJpcXVlIHNhbnMgbm9tIGdcdTAwRTluXHUwMEU5cmlxdWUifSwKKyAgICAgICAgeyJDYW5ub3QuU3BlY2lmeS5QcmluY2lwYWwud2l0aG91dC5hLk5hbWUiLAorICAgICAgICAgICAgIkltcG9zc2libGUgZGUgc3BcdTAwRTljaWZpZXIgdW4gcHJpbmNpcGFsIHNhbnMgbm9tIn0sCisgICAgICAgIHsiUGVybWlzc2lvbi5hbmQuVGFyZ2V0Lk5hbWUubXVzdC5oYXZlLmEudmFsdWUiLAorICAgICAgICAgICAgICAgICJMZSBkcm9pdCBldCBsZSBub20gZGUgY2libGUgZG9pdmVudCBhdm9pciB1bmUgdmFsZXVyIn0sCisgICAgICAgIHsiUmVtb3ZlLnRoaXMuUG9saWN5LkVudHJ5LiIsICJFbmxldmVyIGNldHRlIHJcdTAwRThnbGUgPyJ9LAorICAgICAgICB7Ik92ZXJ3cml0ZS5GaWxlIiwgIlJlbXBsYWNlciBsZSBmaWNoaWVyIn0sCisgICAgICAgIHsiUG9saWN5LnN1Y2Nlc3NmdWxseS53cml0dGVuLnRvLmZpbGVuYW1lIiwKKyAgICAgICAgICAgICAgICAiUlx1MDBFOGdsZSBcdTAwRTljcml0ZSBkYW5zIHswfSJ9LAorICAgICAgICB7Im51bGwuZmlsZW5hbWUiLCAibm9tIGRlIGZpY2hpZXIgTlVMTCJ9LAorICAgICAgICB7IlNhdmUuY2hhbmdlcy4iLCAiRW5yZWdpc3RyZXIgbGVzIG1vZGlmaWNhdGlvbnMgPyJ9LAorICAgICAgICB7IlllcyIsICJPdWkifSwKKyAgICAgICAgeyJObyIsICJOb24ifSwKKyAgICAgICAgeyJQb2xpY3kuRW50cnkiLCAiUlx1MDBFOGdsZSJ9LAorICAgICAgICB7IlNhdmUuQ2hhbmdlcyIsICJFbnJlZ2lzdHJlciBsZXMgbW9kaWZpY2F0aW9ucyJ9LAorICAgICAgICB7Ik5vLlBvbGljeS5FbnRyeS5zZWxlY3RlZCIsICJBdWN1bmUgclx1MDBFOGdsZSBzXHUwMEU5bGVjdGlvbm5cdTAwRTllIn0sCisgICAgICAgIHsiVW5hYmxlLnRvLm9wZW4uS2V5U3RvcmUuZXgudG9TdHJpbmcuIiwKKyAgICAgICAgICAgICAgICAiSW1wb3NzaWJsZSBkJydvdXZyaXIgbGUgZmljaGllciBkZSBjbFx1MDBFOXMgZCcnYWNjXHUwMEU4cyA6IHswfSJ9LAorICAgICAgICB7Ik5vLnByaW5jaXBhbC5zZWxlY3RlZCIsICJBdWN1biBwcmluY2lwYWwgc1x1MDBFOWxlY3Rpb25uXHUwMEU5In0sCisgICAgICAgIHsiTm8ucGVybWlzc2lvbi5zZWxlY3RlZCIsICJBdWN1biBkcm9pdCBzXHUwMEU5bGVjdGlvbm5cdTAwRTkifSwKKyAgICAgICAgeyJuYW1lIiwgIm5vbSJ9LAorICAgICAgICB7ImNvbmZpZ3VyYXRpb24udHlwZSIsICJ0eXBlIGRlIGNvbmZpZ3VyYXRpb24ifSwKKyAgICAgICAgeyJlbnZpcm9ubWVudC52YXJpYWJsZS5uYW1lIiwgIk5vbSBkZSB2YXJpYWJsZSBkJ2Vudmlyb25uZW1lbnQifSwKKyAgICAgICAgeyJsaWJyYXJ5Lm5hbWUiLCAibm9tIGRlIGJpYmxpb3RoXHUwMEU4cXVlIn0sCisgICAgICAgIHsicGFja2FnZS5uYW1lIiwgIm5vbSBkZSBwYWNrYWdlIn0sCisgICAgICAgIHsicG9saWN5LnR5cGUiLCAidHlwZSBkZSByXHUwMEU4Z2xlIn0sCisgICAgICAgIHsicHJvcGVydHkubmFtZSIsICJub20gZGUgcHJvcHJpXHUwMEU5dFx1MDBFOSJ9LAorICAgICAgICB7InByb3ZpZGVyLm5hbWUiLCAibm9tIGR1IGZvdXJuaXNzZXVyIn0sCisgICAgICAgIHsiUHJpbmNpcGFsLkxpc3QiLCAiTGlzdGUgZGUgcHJpbmNpcGF1eCJ9LAorICAgICAgICB7IlBlcm1pc3Npb24uTGlzdCIsICJMaXN0ZSBkZSBkcm9pdHMifSwKKyAgICAgICAgeyJDb2RlLkJhc2UiLCAiQmFzZSBkZSBjb2RlIn0sCisgICAgICAgIHsiS2V5U3RvcmUuVS5SLkwuIiwgIlVSTCBkdSBmaWNoaWVyIGRlIGNsXHUwMEU5cyA6In0sCisgICAgICAgIHsiS2V5U3RvcmUuUGFzc3dvcmQuVS5SLkwuIiwgIlVSTCBkdSBtb3QgZGUgcGFzc2UgZHUgZmljaGllciBkZSBjbFx1MDBFOXMgOiJ9CisgICAgfTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY29udGVudHMgb2YgdGhpcyA8Y29kZT5SZXNvdXJjZUJ1bmRsZTwvY29kZT4uCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGNvbnRlbnRzIG9mIHRoaXMgPGNvZGU+UmVzb3VyY2VCdW5kbGU8L2NvZGU+LgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPYmplY3RbXVtdIGdldENvbnRlbnRzKCkgeworICAgICAgICByZXR1cm4gY29udGVudHM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS90b29scy9wb2xpY3l0b29sL1Jlc291cmNlc19pdC5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS90b29scy9wb2xpY3l0b29sL1Jlc291cmNlc19pdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkYWY4NjEKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3Rvb2xzL3BvbGljeXRvb2wvUmVzb3VyY2VzX2l0LmphdmEKQEAgLTAsMCArMSwxNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IE9yYWNsZSBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQorICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQorICogcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2Ugc3VuLnNlY3VyaXR5LnRvb2xzLnBvbGljeXRvb2w7CisKKy8qKgorICogPHA+IFRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgPGNvZGU+UmVzb3VyY2VCdW5kbGU8L2NvZGU+CisgKiBmb3IgdGhlIHBvbGljeXRvb2wuCisgKgorICovCitwdWJsaWMgY2xhc3MgUmVzb3VyY2VzX2l0IGV4dGVuZHMgamF2YS51dGlsLkxpc3RSZXNvdXJjZUJ1bmRsZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXVtdIGNvbnRlbnRzID0geworICAgICAgICB7Ik5FV0xJTkUiLCAiXG4ifSwKKyAgICAgICAgeyJXYXJuaW5nLkEucHVibGljLmtleS5mb3IuYWxpYXMuc2lnbmVycy5pLmRvZXMubm90LmV4aXN0Lk1ha2Uuc3VyZS5hLktleVN0b3JlLmlzLnByb3Blcmx5LmNvbmZpZ3VyZWQuIiwKKyAgICAgICAgICAgICAgICAiQXZ2ZXJ0ZW56YTogbm9uIGVzaXN0ZSB1bmEgY2hpYXZlIHB1YmJsaWNhIHBlciBsJydhbGlhcyB7MH0uIFZlcmlmaWNhcmUgY2hlIGlsIGtleXN0b3JlIHNpYSBjb25maWd1cmF0byBjb3JyZXR0YW1lbnRlLiJ9LAorICAgICAgICB7Ildhcm5pbmcuQ2xhc3Mubm90LmZvdW5kLmNsYXNzIiwgIkF2dmVydGVuemE6IGNsYXNzZSBub24gdHJvdmF0YTogezB9In0sCisgICAgICAgIHsiV2FybmluZy5JbnZhbGlkLmFyZ3VtZW50LnMuZm9yLmNvbnN0cnVjdG9yLmFyZyIsCisgICAgICAgICAgICAgICAgIkF2dmVydGVuemE6IGFyZ29tZW50byBvIGFyZ29tZW50aSBub24gdmFsaWRpIHBlciBpbCBjb3N0cnV0dG9yZSB7MH0ifSwKKyAgICAgICAgeyJJbGxlZ2FsLlByaW5jaXBhbC5UeXBlLnR5cGUiLCAiVGlwbyBwcmluY2lwYWwgbm9uIHZhbGlkbzogezB9In0sCisgICAgICAgIHsiSWxsZWdhbC5vcHRpb24ub3B0aW9uIiwgIk9wemlvbmUgbm9uIHZhbGlkYTogezB9In0sCisgICAgICAgIHsiVXNhZ2UucG9saWN5dG9vbC5vcHRpb25zLiIsICJVdGlsaXp6bzogcG9saWN5dG9vbCBbb3B6aW9uaV0ifSwKKyAgICAgICAgeyIuZmlsZS5maWxlLnBvbGljeS5maWxlLmxvY2F0aW9uIiwKKyAgICAgICAgICAgICAgICAiICBbLWZpbGUgPGZpbGU+XSAgICBwb3NpemlvbmUgZGVsIGZpbGUgZGVpIGNyaXRlcmkifSwKKyAgICAgICAgeyJOZXciLCAiTnVvdm8ifSwKKyAgICAgICAgeyJPcGVuIiwgIkFwcmkifSwKKyAgICAgICAgeyJTYXZlIiwgIlNhbHZhIn0sCisgICAgICAgIHsiU2F2ZS5BcyIsICJTYWx2YSBjb24gbm9tZSJ9LAorICAgICAgICB7IlZpZXcuV2FybmluZy5Mb2ciLCAiVmlzdWFsaXp6YSByZWdpc3RybyBhdnZlcnRlbnplIn0sCisgICAgICAgIHsiRXhpdCIsICJFc2NpIn0sCisgICAgICAgIHsiQWRkLlBvbGljeS5FbnRyeSIsICJBZ2dpdW5naSB2b2NlIGRlaSBjcml0ZXJpIn0sCisgICAgICAgIHsiRWRpdC5Qb2xpY3kuRW50cnkiLCAiTW9kaWZpY2Egdm9jZSBkZWkgY3JpdGVyaSJ9LAorICAgICAgICB7IlJlbW92ZS5Qb2xpY3kuRW50cnkiLCAiUmltdW92aSB2b2NlIGRlaSBjcml0ZXJpIn0sCisgICAgICAgIHsiRWRpdCIsICJNb2RpZmljYSJ9LAorICAgICAgICB7IlJldGFpbiIsICJNYW50aWVuaSJ9LAorCisgICAgICAgIHsiV2FybmluZy5GaWxlLm5hbWUubWF5LmluY2x1ZGUuZXNjYXBlZC5iYWNrc2xhc2guY2hhcmFjdGVycy5JdC5pcy5ub3QubmVjZXNzYXJ5LnRvLmVzY2FwZS5iYWNrc2xhc2guY2hhcmFjdGVycy50aGUudG9vbC5lc2NhcGVzIiwKKyAgICAgICAgICAgICJBdnZlcnRlbnphOiBpbCBub21lIGZpbGUgcHVcdTAwRjIgaW5jbHVkZXJlIGJhcnJlIHJvdmVzY2lhdGUgY29uIGVzY2FwZS4gTm9uIFx1MDBFOCBuZWNlc3NhcmlvIGVzZWd1aXJlIGwnZXNjYXBlIGRlbGxlIGJhcnJlIHJvdmVzY2lhdGUgKHNlIG5lY2Vzc2FyaW8gbG8gc3RydW1lbnRvIGVzZWd1ZSBsJ2VzY2FwZSBkZWkgY2FyYXR0ZXJpIGFsIG1vbWVudG8gZGVsbGEgc2NyaXR0dXJhIGRlbCBjb250ZW51dG8gZGVpIGNyaXRlcmkgbmVsbCdhcmVhIGRpIG1lbW9yaXp6YXppb25lIHBlcnNpc3RlbnRlKS5cblxuRmFyZSBjbGljayBzdSBNYW50aWVuaSBwZXIgY29uc2VydmFyZSBpbCBub21lIGltbWVzc28sIG9wcHVyZSBzdSBNb2RpZmljYSBwZXIgbW9kaWZpY2FyZSBpbCBub21lLiJ9LAorCisgICAgICAgIHsiQWRkLlB1YmxpYy5LZXkuQWxpYXMiLCAiQWdnaXVuZ2kgYWxpYXMgY2hpYXZlIHB1YmJsaWNhIn0sCisgICAgICAgIHsiUmVtb3ZlLlB1YmxpYy5LZXkuQWxpYXMiLCAiUmltdW92aSBhbGlhcyBjaGlhdmUgcHViYmxpY2EifSwKKyAgICAgICAgeyJGaWxlIiwgIkZpbGUifSwKKyAgICAgICAgeyJLZXlTdG9yZSIsICJLZXlzdG9yZSJ9LAorICAgICAgICB7IlBvbGljeS5GaWxlLiIsICJGaWxlIGRlaSBjcml0ZXJpOiJ9LAorICAgICAgICB7IkNvdWxkLm5vdC5vcGVuLnBvbGljeS5maWxlLnBvbGljeUZpbGUuZS50b1N0cmluZy4iLAorICAgICAgICAgICAgICAgICJJbXBvc3NpYmlsZSBhcHJpcmUgaWwgZmlsZSBkaSBjcml0ZXJpIHswfTogezF9In0sCisgICAgICAgIHsiUG9saWN5LlRvb2wiLCAiU3RydW1lbnRvIGNyaXRlcmkifSwKKyAgICAgICAgeyJFcnJvcnMuaGF2ZS5vY2N1cnJlZC53aGlsZS5vcGVuaW5nLnRoZS5wb2xpY3kuY29uZmlndXJhdGlvbi5WaWV3LnRoZS5XYXJuaW5nLkxvZy5mb3IubW9yZS5pbmZvcm1hdGlvbi4iLAorICAgICAgICAgICAgICAgICJTaSBzb25vIHZlcmlmaWNhdGkgZXJyb3JpIGR1cmFudGUgbCdhcGVydHVyYSBkZWxsYSBjb25maWd1cmF6aW9uZSBkZWkgY3JpdGVyaS4gQ29uc3VsdGFyZSBpbCByZWdpc3RybyBkZWxsZSBhdnZlcnRlbnplIHBlciB1bHRlcmlvcmkgaW5mb3JtYXppb25pLiJ9LAorICAgICAgICB7IkVycm9yIiwgIkVycm9yZSJ9LAorICAgICAgICB7Ik9LIiwgIk9LIn0sCisgICAgICAgIHsiU3RhdHVzIiwgIlN0YXRvIn0sCisgICAgICAgIHsiV2FybmluZyIsICJBdnZlcnRlbnphIn0sCisgICAgICAgIHsiUGVybWlzc2lvbi4iLAorICAgICAgICAgICAgICAgICJBdXRvcml6emF6aW9uZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIn0sCisgICAgICAgIHsiUHJpbmNpcGFsLlR5cGUuIiwgIlRpcG8gcHJpbmNpcGFsOiJ9LAorICAgICAgICB7IlByaW5jaXBhbC5OYW1lLiIsICJOb21lIHByaW5jaXBhbDoifSwKKyAgICAgICAgeyJUYXJnZXQuTmFtZS4iLAorICAgICAgICAgICAgICAgICJOb21lIGRlc3RpbmF6aW9uZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIn0sCisgICAgICAgIHsiQWN0aW9ucy4iLAorICAgICAgICAgICAgICAgICJBemlvbmk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9LAorICAgICAgICB7Ik9LLnRvLm92ZXJ3cml0ZS5leGlzdGluZy5maWxlLmZpbGVuYW1lLiIsCisgICAgICAgICAgICAgICAgIk9LIHBlciBzb3ZyYXNjcml2ZXJlIGlsIGZpbGUgezB9PyJ9LAorICAgICAgICB7IkNhbmNlbCIsICJBbm51bGxhIn0sCisgICAgICAgIHsiQ29kZUJhc2UuIiwgIkNvZGVCYXNlOiJ9LAorICAgICAgICB7IlNpZ25lZEJ5LiIsICJTaWduZWRCeToifSwKKyAgICAgICAgeyJBZGQuUHJpbmNpcGFsIiwgIkFnZ2l1bmdpIHByaW5jaXBhbCJ9LAorICAgICAgICB7IkVkaXQuUHJpbmNpcGFsIiwgIk1vZGlmaWNhIHByaW5jaXBhbCJ9LAorICAgICAgICB7IlJlbW92ZS5QcmluY2lwYWwiLCAiUmltdW92aSBwcmluY2lwYWwifSwKKyAgICAgICAgeyJQcmluY2lwYWxzLiIsICJQcmluY2lwYWw6In0sCisgICAgICAgIHsiLkFkZC5QZXJtaXNzaW9uIiwgIiAgQWdnaXVuZ2kgYXV0b3JpenphemlvbmUifSwKKyAgICAgICAgeyIuRWRpdC5QZXJtaXNzaW9uIiwgIiAgTW9kaWZpY2EgYXV0b3JpenphemlvbmUifSwKKyAgICAgICAgeyJSZW1vdmUuUGVybWlzc2lvbiIsICJSaW11b3ZpIGF1dG9yaXp6YXppb25lIn0sCisgICAgICAgIHsiRG9uZSIsICJGaW5lIn0sCisgICAgICAgIHsiS2V5U3RvcmUuVVJMLiIsICJVUkwga2V5c3RvcmU6In0sCisgICAgICAgIHsiS2V5U3RvcmUuVHlwZS4iLCAiVGlwbyBrZXlzdG9yZToifSwKKyAgICAgICAgeyJLZXlTdG9yZS5Qcm92aWRlci4iLCAiUHJvdmlkZXIga2V5c3RvcmU6In0sCisgICAgICAgIHsiS2V5U3RvcmUuUGFzc3dvcmQuVVJMLiIsICJVUkwgcGFzc3dvcmQga2V5c3RvcmU6In0sCisgICAgICAgIHsiUHJpbmNpcGFscyIsICJQcmluY2lwYWw6In0sCisgICAgICAgIHsiLkVkaXQuUHJpbmNpcGFsLiIsICIgIE1vZGlmaWNhIHByaW5jaXBhbDoifSwKKyAgICAgICAgeyIuQWRkLk5ldy5QcmluY2lwYWwuIiwgIiAgQWdnaXVuZ2kgbnVvdm8gcHJpbmNpcGFsOiJ9LAorICAgICAgICB7IlBlcm1pc3Npb25zIiwgIkF1dG9yaXp6YXppb25pIn0sCisgICAgICAgIHsiLkVkaXQuUGVybWlzc2lvbi4iLCAiICBNb2RpZmljYSBhdXRvcml6emF6aW9uZToifSwKKyAgICAgICAgeyIuQWRkLk5ldy5QZXJtaXNzaW9uLiIsICIgIEFnZ2l1bmdpIG51b3ZhIGF1dG9yaXp6YXppb25lOiJ9LAorICAgICAgICB7IlNpZ25lZC5CeS4iLCAiRmlybWF0byBkYToifSwKKyAgICAgICAgeyJDYW5ub3QuU3BlY2lmeS5QcmluY2lwYWwud2l0aC5hLldpbGRjYXJkLkNsYXNzLndpdGhvdXQuYS5XaWxkY2FyZC5OYW1lIiwKKyAgICAgICAgICAgICJJbXBvc3NpYmlsZSBzcGVjaWZpY2FyZSBwcmluY2lwYWwgY29uIHVuYSBjbGFzc2UgY2FyYXR0ZXJlIGpvbGx5IHNlbnphIHVuIG5vbWUgY2FyYXR0ZXJlIGpvbGx5In0sCisgICAgICAgIHsiQ2Fubm90LlNwZWNpZnkuUHJpbmNpcGFsLndpdGhvdXQuYS5OYW1lIiwKKyAgICAgICAgICAgICJJbXBvc3NpYmlsZSBzcGVjaWZpY2FyZSBwcmluY2lwYWwgc2VuemEgdW4gbm9tZSJ9LAorICAgICAgICB7IlBlcm1pc3Npb24uYW5kLlRhcmdldC5OYW1lLm11c3QuaGF2ZS5hLnZhbHVlIiwKKyAgICAgICAgICAgICAgICAiTCdhdXRvcml6emF6aW9uZSBlIGlsIG5vbWUgZGVzdGluYXppb25lIG5vbiBwb3Nzb25vIGVzc2VyZSBudWxsaSJ9LAorICAgICAgICB7IlJlbW92ZS50aGlzLlBvbGljeS5FbnRyeS4iLCAiUmltdW92ZXJlIHF1ZXN0YSB2b2NlIGRlaSBjcml0ZXJpPyJ9LAorICAgICAgICB7Ik92ZXJ3cml0ZS5GaWxlIiwgIlNvdnJhc2NyaXZpIGZpbGUifSwKKyAgICAgICAgeyJQb2xpY3kuc3VjY2Vzc2Z1bGx5LndyaXR0ZW4udG8uZmlsZW5hbWUiLAorICAgICAgICAgICAgICAgICJJIGNyaXRlcmkgc29ubyBzdGF0aSBzY3JpdHRpIGluIHswfSJ9LAorICAgICAgICB7Im51bGwuZmlsZW5hbWUiLCAibm9tZSBmaWxlIG51bGxvIn0sCisgICAgICAgIHsiU2F2ZS5jaGFuZ2VzLiIsICJTYWx2YXJlIGxlIG1vZGlmaWNoZT8ifSwKKyAgICAgICAgeyJZZXMiLCAiU1x1MDBFQyJ9LAorICAgICAgICB7Ik5vIiwgIk5vIn0sCisgICAgICAgIHsiUG9saWN5LkVudHJ5IiwgIlZvY2UgZGVpIGNyaXRlcmkifSwKKyAgICAgICAgeyJTYXZlLkNoYW5nZXMiLCAiU2FsdmEgbGUgbW9kaWZpY2hlIn0sCisgICAgICAgIHsiTm8uUG9saWN5LkVudHJ5LnNlbGVjdGVkIiwgIk5lc3N1bmEgdm9jZSBkZWkgY3JpdGVyaSBzZWxlemlvbmF0YSJ9LAorICAgICAgICB7IlVuYWJsZS50by5vcGVuLktleVN0b3JlLmV4LnRvU3RyaW5nLiIsCisgICAgICAgICAgICAgICAgIkltcG9zc2liaWxlIGFwcmlyZSBpbCBrZXlzdG9yZTogezB9In0sCisgICAgICAgIHsiTm8ucHJpbmNpcGFsLnNlbGVjdGVkIiwgIk5lc3N1biBwcmluY2lwYWwgc2VsZXppb25hdG8ifSwKKyAgICAgICAgeyJOby5wZXJtaXNzaW9uLnNlbGVjdGVkIiwgIk5lc3N1bmEgYXV0b3JpenphemlvbmUgc2VsZXppb25hdGEifSwKKyAgICAgICAgeyJuYW1lIiwgIm5vbWUifSwKKyAgICAgICAgeyJjb25maWd1cmF0aW9uLnR5cGUiLCAidGlwbyBkaSBjb25maWd1cmF6aW9uZSJ9LAorICAgICAgICB7ImVudmlyb25tZW50LnZhcmlhYmxlLm5hbWUiLCAibm9tZSB2YXJpYWJpbGUgYW1iaWVudGUifSwKKyAgICAgICAgeyJsaWJyYXJ5Lm5hbWUiLCAibm9tZSBsaWJyZXJpYSJ9LAorICAgICAgICB7InBhY2thZ2UubmFtZSIsICJub21lIHBhY2thZ2UifSwKKyAgICAgICAgeyJwb2xpY3kudHlwZSIsICJ0aXBvIGRpIGNyaXRlcmkifSwKKyAgICAgICAgeyJwcm9wZXJ0eS5uYW1lIiwgIm5vbWUgcHJvcHJpZXRcdTAwRTAifSwKKyAgICAgICAgeyJwcm92aWRlci5uYW1lIiwgIm5vbWUgcHJvdmlkZXIifSwKKyAgICAgICAgeyJQcmluY2lwYWwuTGlzdCIsICJMaXN0YSBwcmluY2lwYWwifSwKKyAgICAgICAgeyJQZXJtaXNzaW9uLkxpc3QiLCAiTGlzdGEgYXV0b3JpenphemlvbmkifSwKKyAgICAgICAgeyJDb2RlLkJhc2UiLCAiQ29kZWJhc2UifSwKKyAgICAgICAgeyJLZXlTdG9yZS5VLlIuTC4iLCAiVVJMIGtleXN0b3JlOiJ9LAorICAgICAgICB7IktleVN0b3JlLlBhc3N3b3JkLlUuUi5MLiIsICJVUkwgcGFzc3dvcmQga2V5c3RvcmU6In0KKyAgICB9OworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjb250ZW50cyBvZiB0aGlzIDxjb2RlPlJlc291cmNlQnVuZGxlPC9jb2RlPi4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgY29udGVudHMgb2YgdGhpcyA8Y29kZT5SZXNvdXJjZUJ1bmRsZTwvY29kZT4uCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9iamVjdFtdW10gZ2V0Q29udGVudHMoKSB7CisgICAgICAgIHJldHVybiBjb250ZW50czsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3Rvb2xzL3BvbGljeXRvb2wvUmVzb3VyY2VzX2phLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3Rvb2xzL3BvbGljeXRvb2wvUmVzb3VyY2VzX2phLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNmOTAxYQotLS0gL2Rldi9udWxsCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdG9vbHMvcG9saWN5dG9vbC9SZXNvdXJjZXNfamEuamF2YQpAQCAtMCwwICsxLDE1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgT3JhY2xlIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCisgKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CisgKiBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBzdW4uc2VjdXJpdHkudG9vbHMucG9saWN5dG9vbDsKKworLyoqCisgKiA8cD4gVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSA8Y29kZT5SZXNvdXJjZUJ1bmRsZTwvY29kZT4KKyAqIGZvciB0aGUgcG9saWN5dG9vbC4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBSZXNvdXJjZXNfamEgZXh0ZW5kcyBqYXZhLnV0aWwuTGlzdFJlc291cmNlQnVuZGxlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdW10gY29udGVudHMgPSB7CisgICAgICAgIHsiTkVXTElORSIsICJcbiJ9LAorICAgICAgICB7Ildhcm5pbmcuQS5wdWJsaWMua2V5LmZvci5hbGlhcy5zaWduZXJzLmkuZG9lcy5ub3QuZXhpc3QuTWFrZS5zdXJlLmEuS2V5U3RvcmUuaXMucHJvcGVybHkuY29uZmlndXJlZC4iLAorICAgICAgICAgICAgICAgICJcdThCNjZcdTU0NEE6IFx1NTIyNVx1NTQwRHswfVx1MzA2RVx1NTE2Q1x1OTU4Qlx1OTM3NVx1MzA0Q1x1NUI1OFx1NTcyOFx1MzA1N1x1MzA3RVx1MzA1Qlx1MzA5M1x1MzAwMlx1MzBBRFx1MzBGQ1x1MzBCOVx1MzBDOFx1MzBBMlx1MzA0Q1x1NkI2M1x1MzA1N1x1MzA0Rlx1NjlDQlx1NjIxMFx1MzA1NVx1MzA4Q1x1MzA2Nlx1MzA0NFx1MzA4Qlx1MzA1M1x1MzA2OFx1MzA5Mlx1NzhCQVx1OEE4RFx1MzA1N1x1MzA2Nlx1MzA0Rlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMiJ9LAorICAgICAgICB7Ildhcm5pbmcuQ2xhc3Mubm90LmZvdW5kLmNsYXNzIiwgIlx1OEI2Nlx1NTQ0QTogXHUzMEFGXHUzMEU5XHUzMEI5XHUzMDRDXHU4OThCXHUzMDY0XHUzMDRCXHUzMDhBXHUzMDdFXHUzMDVCXHUzMDkzOiB7MH0ifSwKKyAgICAgICAgeyJXYXJuaW5nLkludmFsaWQuYXJndW1lbnQucy5mb3IuY29uc3RydWN0b3IuYXJnIiwKKyAgICAgICAgICAgICAgICAiXHU4QjY2XHU1NDRBOiBcdTMwQjNcdTMwRjNcdTMwQjlcdTMwQzhcdTMwRTlcdTMwQUZcdTMwQkZcdTMwNkVcdTVGMTVcdTY1NzBcdTMwNENcdTcxMjFcdTUyQjlcdTMwNjdcdTMwNTk6IHswfSJ9LAorICAgICAgICB7IklsbGVnYWwuUHJpbmNpcGFsLlR5cGUudHlwZSIsICJcdTRFMERcdTZCNjNcdTMwNkFcdTMwRDdcdTMwRUFcdTMwRjNcdTMwQjdcdTMwRDFcdTMwRUJcdTMwNkVcdTMwQkZcdTMwQTRcdTMwRDc6IHswfSJ9LAorICAgICAgICB7IklsbGVnYWwub3B0aW9uLm9wdGlvbiIsICJcdTRFMERcdTZCNjNcdTMwNkFcdTMwQUFcdTMwRDdcdTMwQjdcdTMwRTdcdTMwRjM6IHswfSJ9LAorICAgICAgICB7IlVzYWdlLnBvbGljeXRvb2wub3B0aW9ucy4iLCAiXHU0RjdGXHU3NTI4XHU2NUI5XHU2Q0Q1OiBwb2xpY3l0b29sIFtvcHRpb25zXSJ9LAorICAgICAgICB7Ii5maWxlLmZpbGUucG9saWN5LmZpbGUubG9jYXRpb24iLAorICAgICAgICAgICAgICAgICIgIFstZmlsZSA8ZmlsZT5dICBcdTMwRERcdTMwRUFcdTMwQjdcdTMwRkNcdTMwRkJcdTMwRDVcdTMwQTFcdTMwQTRcdTMwRUJcdTMwNkVcdTU4MzRcdTYyNDAifSwKKyAgICAgICAgeyJOZXciLCAiXHU2NUIwXHU4OThGIn0sCisgICAgICAgIHsiT3BlbiIsICJcdTk1OEJcdTMwNEYifSwKKyAgICAgICAgeyJTYXZlIiwgIlx1NEZERFx1NUI1OCJ9LAorICAgICAgICB7IlNhdmUuQXMiLCAiXHU1MjI1XHU1NDBEXHU0RkREXHU1QjU4In0sCisgICAgICAgIHsiVmlldy5XYXJuaW5nLkxvZyIsICJcdThCNjZcdTU0NEFcdTMwRURcdTMwQjBcdTMwNkVcdTg4NjhcdTc5M0EifSwKKyAgICAgICAgeyJFeGl0IiwgIlx1N0Q0Mlx1NEU4NiJ9LAorICAgICAgICB7IkFkZC5Qb2xpY3kuRW50cnkiLCAiXHUzMEREXHUzMEVBXHUzMEI3XHUzMEZDXHUzMEZCXHUzMEE4XHUzMEYzXHUzMEM4XHUzMEVBXHUzMDZFXHU4RkZEXHU1MkEwIn0sCisgICAgICAgIHsiRWRpdC5Qb2xpY3kuRW50cnkiLCAiXHUzMEREXHUzMEVBXHUzMEI3XHUzMEZDXHUzMEZCXHUzMEE4XHUzMEYzXHUzMEM4XHUzMEVBXHUzMDZFXHU3REU4XHU5NkM2In0sCisgICAgICAgIHsiUmVtb3ZlLlBvbGljeS5FbnRyeSIsICJcdTMwRERcdTMwRUFcdTMwQjdcdTMwRkNcdTMwRkJcdTMwQThcdTMwRjNcdTMwQzhcdTMwRUFcdTMwNkVcdTUyNEFcdTk2NjQifSwKKyAgICAgICAgeyJFZGl0IiwgIlx1N0RFOFx1OTZDNiJ9LAorICAgICAgICB7IlJldGFpbiIsICJcdTRGRERcdTYzMDEifSwKKworICAgICAgICB7Ildhcm5pbmcuRmlsZS5uYW1lLm1heS5pbmNsdWRlLmVzY2FwZWQuYmFja3NsYXNoLmNoYXJhY3RlcnMuSXQuaXMubm90Lm5lY2Vzc2FyeS50by5lc2NhcGUuYmFja3NsYXNoLmNoYXJhY3RlcnMudGhlLnRvb2wuZXNjYXBlcyIsCisgICAgICAgICAgICAiXHU4QjY2XHU1NDRBOiBcdTMwRDVcdTMwQTFcdTMwQTRcdTMwRUJcdTU0MERcdTMwNkJcdTMwQThcdTMwQjlcdTMwQjFcdTMwRkNcdTMwRDdcdTMwNTVcdTMwOENcdTMwNUZcdTMwRDBcdTMwQzNcdTMwQUZcdTMwQjlcdTMwRTlcdTMwQzNcdTMwQjdcdTMwRTVcdTY1ODdcdTVCNTdcdTMwNENcdTU0MkJcdTMwN0VcdTMwOENcdTMwNjZcdTMwNDRcdTMwOEJcdTUzRUZcdTgwRkRcdTYwMjdcdTMwNENcdTMwNDJcdTMwOEFcdTMwN0VcdTMwNTlcdTMwMDJcdTMwRDBcdTMwQzNcdTMwQUZcdTMwQjlcdTMwRTlcdTMwQzNcdTMwQjdcdTMwRTVcdTY1ODdcdTVCNTdcdTMwOTJcdTMwQThcdTMwQjlcdTMwQjFcdTMwRkNcdTMwRDdcdTMwNTlcdTMwOEJcdTVGQzVcdTg5ODFcdTMwNkZcdTMwNDJcdTMwOEFcdTMwN0VcdTMwNUJcdTMwOTMoXHUzMEM0XHUzMEZDXHUzMEVCXHUzMDZGXHUzMEREXHUzMEVBXHUzMEI3XHUzMEZDXHU1MTg1XHU1QkI5XHUzMDkyXHU2QzM4XHU3RDlBXHUzMEI5XHUzMEM4XHUzMEEyXHUzMDZCXHU2NkY4XHUzMDREXHU4RkJDXHUzMDgwXHUzMDY4XHUzMDREXHUzMDZCXHUzMDAxXHU1RkM1XHU4OTgxXHUzMDZCXHU1RkRDXHUzMDU4XHUzMDY2XHU2NTg3XHU1QjU3XHUzMDkyXHUzMEE4XHUzMEI5XHUzMEIxXHUzMEZDXHUzMEQ3XHUzMDU3XHUzMDdFXHUzMDU5KVx1MzAwMlxuXG5cdTUxNjVcdTUyOUJcdTZFMDhcdTMwNkVcdTU0MERcdTUyNERcdTMwOTJcdTRGRERcdTYzMDFcdTMwNTlcdTMwOEJcdTMwNkJcdTMwNkZcdTMwMENcdTRGRERcdTYzMDFcdTMwMERcdTMwOTJcdTMwQUZcdTMwRUFcdTMwQzNcdTMwQUZcdTMwNTdcdTMwMDFcdTU0MERcdTUyNERcdTMwOTJcdTdERThcdTk2QzZcdTMwNTlcdTMwOEJcdTMwNkJcdTMwNkZcdTMwMENcdTdERThcdTk2QzZcdTMwMERcdTMwOTJcdTMwQUZcdTMwRUFcdTMwQzNcdTMwQUZcdTMwNTdcdTMwNjZcdTMwNEZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDIifSwKKworICAgICAgICB7IkFkZC5QdWJsaWMuS2V5LkFsaWFzIiwgIlx1NTE2Q1x1OTU4Qlx1OTM3NVx1MzA2RVx1NTIyNVx1NTQwRFx1MzA2RVx1OEZGRFx1NTJBMCJ9LAorICAgICAgICB7IlJlbW92ZS5QdWJsaWMuS2V5LkFsaWFzIiwgIlx1NTE2Q1x1OTU4Qlx1OTM3NVx1MzA2RVx1NTIyNVx1NTQwRFx1MzA5Mlx1NTI0QVx1OTY2NCJ9LAorICAgICAgICB7IkZpbGUiLCAiXHUzMEQ1XHUzMEExXHUzMEE0XHUzMEVCIn0sCisgICAgICAgIHsiS2V5U3RvcmUiLCAiXHUzMEFEXHUzMEZDXHUzMEI5XHUzMEM4XHUzMEEyIn0sCisgICAgICAgIHsiUG9saWN5LkZpbGUuIiwgIlx1MzBERFx1MzBFQVx1MzBCN1x1MzBGQ1x1MzBGQlx1MzBENVx1MzBBMVx1MzBBNFx1MzBFQjoifSwKKyAgICAgICAgeyJDb3VsZC5ub3Qub3Blbi5wb2xpY3kuZmlsZS5wb2xpY3lGaWxlLmUudG9TdHJpbmcuIiwKKyAgICAgICAgICAgICAgICAiXHUzMEREXHUzMEVBXHUzMEI3XHUzMEZDXHUzMEZCXHUzMEQ1XHUzMEExXHUzMEE0XHUzMEVCXHUzMDkyXHU5NThCXHUzMDUxXHUzMDdFXHUzMDVCXHUzMDkzXHUzMDY3XHUzMDU3XHUzMDVGOiB7MH06IHsxfSJ9LAorICAgICAgICB7IlBvbGljeS5Ub29sIiwgIlx1MzBERFx1MzBFQVx1MzBCN1x1MzBGQ1x1MzBGQlx1MzBDNFx1MzBGQ1x1MzBFQiJ9LAorICAgICAgICB7IkVycm9ycy5oYXZlLm9jY3VycmVkLndoaWxlLm9wZW5pbmcudGhlLnBvbGljeS5jb25maWd1cmF0aW9uLlZpZXcudGhlLldhcm5pbmcuTG9nLmZvci5tb3JlLmluZm9ybWF0aW9uLiIsCisgICAgICAgICAgICAgICAgIlx1MzBERFx1MzBFQVx1MzBCN1x1MzBGQ1x1NjlDQlx1NjIxMFx1MzA5Mlx1OTU4Qlx1MzA0Rlx1MzA2OFx1MzA0RFx1MzA2Qlx1MzBBOFx1MzBFOVx1MzBGQ1x1MzA0Q1x1NzY3QVx1NzUxRlx1MzA1N1x1MzA3RVx1MzA1N1x1MzA1Rlx1MzAwMlx1OEE3M1x1N0QzMFx1MzA2Rlx1OEI2Nlx1NTQ0QVx1MzBFRFx1MzBCMFx1MzA5Mlx1NTNDMlx1NzE2N1x1MzA1N1x1MzA2Nlx1MzA0Rlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMiJ9LAorICAgICAgICB7IkVycm9yIiwgIlx1MzBBOFx1MzBFOVx1MzBGQyJ9LAorICAgICAgICB7Ik9LIiwgIk9LIn0sCisgICAgICAgIHsiU3RhdHVzIiwgIlx1NzJCNlx1NjE0QiJ9LAorICAgICAgICB7Ildhcm5pbmciLCAiXHU4QjY2XHU1NDRBIn0sCisgICAgICAgIHsiUGVybWlzc2lvbi4iLAorICAgICAgICAgICAgICAgICJcdTMwQTJcdTMwQUZcdTMwQkJcdTMwQjlcdTZBMjk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9LAorICAgICAgICB7IlByaW5jaXBhbC5UeXBlLiIsICJcdTMwRDdcdTMwRUFcdTMwRjNcdTMwQjdcdTMwRDFcdTMwRUJcdTMwNkVcdTMwQkZcdTMwQTRcdTMwRDc6In0sCisgICAgICAgIHsiUHJpbmNpcGFsLk5hbWUuIiwgIlx1MzBEN1x1MzBFQVx1MzBGM1x1MzBCN1x1MzBEMVx1MzBFQlx1MzA2RVx1NTQwRFx1NTI0RDoifSwKKyAgICAgICAgeyJUYXJnZXQuTmFtZS4iLAorICAgICAgICAgICAgICAgICJcdTMwQkZcdTMwRkNcdTMwQjJcdTMwQzNcdTMwQzhcdTU0MEQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9LAorICAgICAgICB7IkFjdGlvbnMuIiwKKyAgICAgICAgICAgICAgICAiXHUzMEEyXHUzMEFGXHUzMEI3XHUzMEU3XHUzMEYzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifSwKKyAgICAgICAgeyJPSy50by5vdmVyd3JpdGUuZXhpc3RpbmcuZmlsZS5maWxlbmFtZS4iLAorICAgICAgICAgICAgICAgICJcdTY1RTJcdTVCNThcdTMwNkVcdTMwRDVcdTMwQTFcdTMwQTRcdTMwRUJ7MH1cdTMwNkJcdTRFMEFcdTY2RjhcdTMwNERcdTMwNTdcdTMwN0VcdTMwNTlcdTMwNEJcdTMwMDIifSwKKyAgICAgICAgeyJDYW5jZWwiLCAiXHU1M0Q2XHU2RDg4In0sCisgICAgICAgIHsiQ29kZUJhc2UuIiwgIkNvZGVCYXNlOiJ9LAorICAgICAgICB7IlNpZ25lZEJ5LiIsICJTaWduZWRCeToifSwKKyAgICAgICAgeyJBZGQuUHJpbmNpcGFsIiwgIlx1MzBEN1x1MzBFQVx1MzBGM1x1MzBCN1x1MzBEMVx1MzBFQlx1MzA2RVx1OEZGRFx1NTJBMCJ9LAorICAgICAgICB7IkVkaXQuUHJpbmNpcGFsIiwgIlx1MzBEN1x1MzBFQVx1MzBGM1x1MzBCN1x1MzBEMVx1MzBFQlx1MzA2RVx1N0RFOFx1OTZDNiJ9LAorICAgICAgICB7IlJlbW92ZS5QcmluY2lwYWwiLCAiXHUzMEQ3XHUzMEVBXHUzMEYzXHUzMEI3XHUzMEQxXHUzMEVCXHUzMDZFXHU1MjRBXHU5NjY0In0sCisgICAgICAgIHsiUHJpbmNpcGFscy4iLCAiXHUzMEQ3XHUzMEVBXHUzMEYzXHUzMEI3XHUzMEQxXHUzMEVCOiJ9LAorICAgICAgICB7Ii5BZGQuUGVybWlzc2lvbiIsICIgIFx1MzBBMlx1MzBBRlx1MzBCQlx1MzBCOVx1NkEyOVx1MzA2RVx1OEZGRFx1NTJBMCJ9LAorICAgICAgICB7Ii5FZGl0LlBlcm1pc3Npb24iLCAiICBcdTMwQTJcdTMwQUZcdTMwQkJcdTMwQjlcdTZBMjlcdTMwNkVcdTdERThcdTk2QzYifSwKKyAgICAgICAgeyJSZW1vdmUuUGVybWlzc2lvbiIsICJcdTMwQTJcdTMwQUZcdTMwQkJcdTMwQjlcdTZBMjlcdTMwNkVcdTUyNEFcdTk2NjQifSwKKyAgICAgICAgeyJEb25lIiwgIlx1NUI4Q1x1NEU4NiJ9LAorICAgICAgICB7IktleVN0b3JlLlVSTC4iLCAiXHUzMEFEXHUzMEZDXHUzMEI5XHUzMEM4XHUzMEEyVVJMOiJ9LAorICAgICAgICB7IktleVN0b3JlLlR5cGUuIiwgIlx1MzBBRFx1MzBGQ1x1MzBCOVx1MzBDOFx1MzBBMlx1MzA2RVx1MzBCRlx1MzBBNFx1MzBENzoifSwKKyAgICAgICAgeyJLZXlTdG9yZS5Qcm92aWRlci4iLCAiXHUzMEFEXHUzMEZDXHUzMEI5XHUzMEM4XHUzMEEyXHUzMEZCXHUzMEQ3XHUzMEVEXHUzMEQwXHUzMEE0XHUzMEMwOiJ9LAorICAgICAgICB7IktleVN0b3JlLlBhc3N3b3JkLlVSTC4iLCAiXHUzMEFEXHUzMEZDXHUzMEI5XHUzMEM4XHUzMEEyXHUzMEZCXHUzMEQxXHUzMEI5XHUzMEVGXHUzMEZDXHUzMEM5VVJMOiJ9LAorICAgICAgICB7IlByaW5jaXBhbHMiLCAiXHUzMEQ3XHUzMEVBXHUzMEYzXHUzMEI3XHUzMEQxXHUzMEVCIn0sCisgICAgICAgIHsiLkVkaXQuUHJpbmNpcGFsLiIsICIgIFx1MzBEN1x1MzBFQVx1MzBGM1x1MzBCN1x1MzBEMVx1MzBFQlx1MzA2RVx1N0RFOFx1OTZDNjoifSwKKyAgICAgICAgeyIuQWRkLk5ldy5QcmluY2lwYWwuIiwgIiAgXHUzMEQ3XHUzMEVBXHUzMEYzXHUzMEI3XHUzMEQxXHUzMEVCXHUzMDZFXHU2NUIwXHU4OThGXHU4RkZEXHU1MkEwOiJ9LAorICAgICAgICB7IlBlcm1pc3Npb25zIiwgIlx1MzBBMlx1MzBBRlx1MzBCQlx1MzBCOVx1NkEyOSJ9LAorICAgICAgICB7Ii5FZGl0LlBlcm1pc3Npb24uIiwgIiAgXHUzMEEyXHUzMEFGXHUzMEJCXHUzMEI5XHU2QTI5XHUzMDZFXHU3REU4XHU5NkM2OiJ9LAorICAgICAgICB7Ii5BZGQuTmV3LlBlcm1pc3Npb24uIiwgIiAgXHU2NUIwXHU4OThGXHUzMEEyXHUzMEFGXHUzMEJCXHUzMEI5XHU2QTI5XHUzMDZFXHU4RkZEXHU1MkEwOiJ9LAorICAgICAgICB7IlNpZ25lZC5CeS4iLCAiXHU3RjcyXHU1NDBEXHU4MDA1OiJ9LAorICAgICAgICB7IkNhbm5vdC5TcGVjaWZ5LlByaW5jaXBhbC53aXRoLmEuV2lsZGNhcmQuQ2xhc3Mud2l0aG91dC5hLldpbGRjYXJkLk5hbWUiLAorICAgICAgICAgICAgIlx1MzBFRlx1MzBBNFx1MzBFQlx1MzBDOVx1MzBBQlx1MzBGQ1x1MzBDOVx1NTQwRFx1MzA2RVx1MzA2QVx1MzA0NFx1MzBFRlx1MzBBNFx1MzBFQlx1MzBDOVx1MzBBQlx1MzBGQ1x1MzBDOVx1MzBGQlx1MzBBRlx1MzBFOVx1MzBCOVx1MzA5Mlx1NEY3Rlx1NzUyOFx1MzA1N1x1MzA2Nlx1MzBEN1x1MzBFQVx1MzBGM1x1MzBCN1x1MzBEMVx1MzBFQlx1MzA5Mlx1NjMwN1x1NUI5QVx1MzA1OVx1MzA4Qlx1MzA1M1x1MzA2OFx1MzA2Rlx1MzA2N1x1MzA0RFx1MzA3RVx1MzA1Qlx1MzA5MyJ9LAorICAgICAgICB7IkNhbm5vdC5TcGVjaWZ5LlByaW5jaXBhbC53aXRob3V0LmEuTmFtZSIsCisgICAgICAgICAgICAiXHU1NDBEXHU1MjREXHUzMDkyXHU0RjdGXHU3NTI4XHUzMDVCXHUzMDVBXHUzMDZCXHUzMEQ3XHUzMEVBXHUzMEYzXHUzMEI3XHUzMEQxXHUzMEVCXHUzMDkyXHU2MzA3XHU1QjlBXHUzMDU5XHUzMDhCXHUzMDUzXHUzMDY4XHUzMDZGXHUzMDY3XHUzMDREXHUzMDdFXHUzMDVCXHUzMDkzIn0sCisgICAgICAgIHsiUGVybWlzc2lvbi5hbmQuVGFyZ2V0Lk5hbWUubXVzdC5oYXZlLmEudmFsdWUiLAorICAgICAgICAgICAgICAgICJcdTMwQTJcdTMwQUZcdTMwQkJcdTMwQjlcdTZBMjlcdTMwNjhcdTMwQkZcdTMwRkNcdTMwQjJcdTMwQzNcdTMwQzhcdTU0MERcdTMwNkZcdTMwMDFcdTUwMjRcdTMwOTJcdTRGRERcdTYzMDFcdTMwNTlcdTMwOEJcdTVGQzVcdTg5ODFcdTMwNENcdTMwNDJcdTMwOEFcdTMwN0VcdTMwNTkifSwKKyAgICAgICAgeyJSZW1vdmUudGhpcy5Qb2xpY3kuRW50cnkuIiwgIlx1MzA1M1x1MzA2RVx1MzBERFx1MzBFQVx1MzBCN1x1MzBGQ1x1MzBGQlx1MzBBOFx1MzBGM1x1MzBDOFx1MzBFQVx1MzA5Mlx1NTI0QVx1OTY2NFx1MzA1N1x1MzA3RVx1MzA1OVx1MzA0Qlx1MzAwMiJ9LAorICAgICAgICB7Ik92ZXJ3cml0ZS5GaWxlIiwgIlx1MzBENVx1MzBBMVx1MzBBNFx1MzBFQlx1MzA5Mlx1NEUwQVx1NjZGOFx1MzA0RFx1MzA1N1x1MzA3RVx1MzA1OSJ9LAorICAgICAgICB7IlBvbGljeS5zdWNjZXNzZnVsbHkud3JpdHRlbi50by5maWxlbmFtZSIsCisgICAgICAgICAgICAgICAgIlx1MzBERFx1MzBFQVx1MzBCN1x1MzBGQ1x1MzA2RXswfVx1MzA3OFx1MzA2RVx1NjZGOFx1OEZCQ1x1MzA3Rlx1MzA2Qlx1NjIxMFx1NTI5Rlx1MzA1N1x1MzA3RVx1MzA1N1x1MzA1RiJ9LAorICAgICAgICB7Im51bGwuZmlsZW5hbWUiLCAiXHUzMEQ1XHUzMEExXHUzMEE0XHUzMEVCXHU1NDBEXHUzMDRDbnVsbFx1MzA2N1x1MzA1OSJ9LAorICAgICAgICB7IlNhdmUuY2hhbmdlcy4iLCAiXHU1OTA5XHU2NkY0XHUzMDkyXHU0RkREXHU1QjU4XHUzMDU3XHUzMDdFXHUzMDU5XHUzMDRCXHUzMDAyIn0sCisgICAgICAgIHsiWWVzIiwgIlx1MzA2Rlx1MzA0NCJ9LAorICAgICAgICB7Ik5vIiwgIlx1MzA0NFx1MzA0NFx1MzA0OCJ9LAorICAgICAgICB7IlBvbGljeS5FbnRyeSIsICJcdTMwRERcdTMwRUFcdTMwQjdcdTMwRkNcdTMwRkJcdTMwQThcdTMwRjNcdTMwQzhcdTMwRUEifSwKKyAgICAgICAgeyJTYXZlLkNoYW5nZXMiLCAiXHU1OTA5XHU2NkY0XHUzMDkyXHU0RkREXHU1QjU4XHUzMDU3XHUzMDdFXHUzMDU5In0sCisgICAgICAgIHsiTm8uUG9saWN5LkVudHJ5LnNlbGVjdGVkIiwgIlx1MzBERFx1MzBFQVx1MzBCN1x1MzBGQ1x1MzBGQlx1MzBBOFx1MzBGM1x1MzBDOFx1MzBFQVx1MzA0Q1x1OTA3OFx1NjI5RVx1MzA1NVx1MzA4Q1x1MzA2Nlx1MzA0NFx1MzA3RVx1MzA1Qlx1MzA5MyJ9LAorICAgICAgICB7IlVuYWJsZS50by5vcGVuLktleVN0b3JlLmV4LnRvU3RyaW5nLiIsCisgICAgICAgICAgICAgICAgIlx1MzBBRFx1MzBGQ1x1MzBCOVx1MzBDOFx1MzBBMnswfVx1MzA5Mlx1OTU4Qlx1MzA1MVx1MzA3RVx1MzA1Qlx1MzA5MyJ9LAorICAgICAgICB7Ik5vLnByaW5jaXBhbC5zZWxlY3RlZCIsICJcdTMwRDdcdTMwRUFcdTMwRjNcdTMwQjdcdTMwRDFcdTMwRUJcdTMwNENcdTkwNzhcdTYyOUVcdTMwNTVcdTMwOENcdTMwNjZcdTMwNDRcdTMwN0VcdTMwNUJcdTMwOTMifSwKKyAgICAgICAgeyJOby5wZXJtaXNzaW9uLnNlbGVjdGVkIiwgIlx1MzBBMlx1MzBBRlx1MzBCQlx1MzBCOVx1NkEyOVx1MzA0Q1x1OTA3OFx1NjI5RVx1MzA1NVx1MzA4Q1x1MzA2Nlx1MzA0NFx1MzA3RVx1MzA1Qlx1MzA5MyJ9LAorICAgICAgICB7Im5hbWUiLCAiXHU1NDBEXHU1MjREIn0sCisgICAgICAgIHsiY29uZmlndXJhdGlvbi50eXBlIiwgIlx1NjlDQlx1NjIxMFx1MzBCRlx1MzBBNFx1MzBENyJ9LAorICAgICAgICB7ImVudmlyb25tZW50LnZhcmlhYmxlLm5hbWUiLCAiXHU3NEIwXHU1ODgzXHU1OTA5XHU2NTcwXHU1NDBEIn0sCisgICAgICAgIHsibGlicmFyeS5uYW1lIiwgIlx1MzBFOVx1MzBBNFx1MzBENlx1MzBFOVx1MzBFQVx1NTQwRCJ9LAorICAgICAgICB7InBhY2thZ2UubmFtZSIsICJcdTMwRDFcdTMwQzNcdTMwQjFcdTMwRkNcdTMwQjhcdTU0MEQifSwKKyAgICAgICAgeyJwb2xpY3kudHlwZSIsICJcdTMwRERcdTMwRUFcdTMwQjdcdTMwRkNcdTMwRkJcdTMwQkZcdTMwQTRcdTMwRDcifSwKKyAgICAgICAgeyJwcm9wZXJ0eS5uYW1lIiwgIlx1MzBEN1x1MzBFRFx1MzBEMVx1MzBDNlx1MzBBM1x1NTQwRCJ9LAorICAgICAgICB7InByb3ZpZGVyLm5hbWUiLCAiXHUzMEQ3XHUzMEVEXHUzMEQwXHUzMEE0XHUzMEMwXHU1NDBEIn0sCisgICAgICAgIHsiUHJpbmNpcGFsLkxpc3QiLCAiXHUzMEQ3XHUzMEVBXHUzMEYzXHUzMEI3XHUzMEQxXHUzMEVCXHUzMDZFXHUzMEVBXHUzMEI5XHUzMEM4In0sCisgICAgICAgIHsiUGVybWlzc2lvbi5MaXN0IiwgIlx1MzBBMlx1MzBBRlx1MzBCQlx1MzBCOVx1NkEyOVx1MzA2RVx1MzBFQVx1MzBCOVx1MzBDOCJ9LAorICAgICAgICB7IkNvZGUuQmFzZSIsICJcdTMwQjNcdTMwRkNcdTMwQzlcdTMwRkJcdTMwRDlcdTMwRkNcdTMwQjkifSwKKyAgICAgICAgeyJLZXlTdG9yZS5VLlIuTC4iLCAiXHUzMEFEXHUzMEZDXHUzMEI5XHUzMEM4XHUzMEEyVSBSIEw6In0sCisgICAgICAgIHsiS2V5U3RvcmUuUGFzc3dvcmQuVS5SLkwuIiwgIlx1MzBBRFx1MzBGQ1x1MzBCOVx1MzBDOFx1MzBBMlx1MzBGQlx1MzBEMVx1MzBCOVx1MzBFRlx1MzBGQ1x1MzBDOVUgUiBMOiJ9CisgICAgfTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY29udGVudHMgb2YgdGhpcyA8Y29kZT5SZXNvdXJjZUJ1bmRsZTwvY29kZT4uCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGNvbnRlbnRzIG9mIHRoaXMgPGNvZGU+UmVzb3VyY2VCdW5kbGU8L2NvZGU+LgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPYmplY3RbXVtdIGdldENvbnRlbnRzKCkgeworICAgICAgICByZXR1cm4gY29udGVudHM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS90b29scy9wb2xpY3l0b29sL1Jlc291cmNlc19rby5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS90b29scy9wb2xpY3l0b29sL1Jlc291cmNlc19rby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3OTdlYzgKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3Rvb2xzL3BvbGljeXRvb2wvUmVzb3VyY2VzX2tvLmphdmEKQEAgLTAsMCArMSwxNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IE9yYWNsZSBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQorICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQorICogcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2Ugc3VuLnNlY3VyaXR5LnRvb2xzLnBvbGljeXRvb2w7CisKKy8qKgorICogPHA+IFRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgPGNvZGU+UmVzb3VyY2VCdW5kbGU8L2NvZGU+CisgKiBmb3IgdGhlIHBvbGljeXRvb2wuCisgKgorICovCitwdWJsaWMgY2xhc3MgUmVzb3VyY2VzX2tvIGV4dGVuZHMgamF2YS51dGlsLkxpc3RSZXNvdXJjZUJ1bmRsZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXVtdIGNvbnRlbnRzID0geworICAgICAgICB7Ik5FV0xJTkUiLCAiXG4ifSwKKyAgICAgICAgeyJXYXJuaW5nLkEucHVibGljLmtleS5mb3IuYWxpYXMuc2lnbmVycy5pLmRvZXMubm90LmV4aXN0Lk1ha2Uuc3VyZS5hLktleVN0b3JlLmlzLnByb3Blcmx5LmNvbmZpZ3VyZWQuIiwKKyAgICAgICAgICAgICAgICAiXHVBQ0JEXHVBQ0UwOiB7MH0gXHVCQ0M0XHVDRTZEXHVDNUQwIFx1QjMwMFx1RDU1QyBcdUFDRjVcdUM2QTkgXHVEMEE0XHVBQzAwIFx1Qzg3NFx1QzdBQ1x1RDU1OFx1QzlDMCBcdUM1NEFcdUMyQjVcdUIyQzhcdUIyRTQuIFx1RDBBNCBcdUM4MDBcdUM3QTVcdUMxOENcdUFDMDAgXHVDODFDXHVCMzAwXHVCODVDIFx1QUQ2Q1x1QzEzMVx1QjQxOFx1QzVCNCBcdUM3ODhcdUIyOTRcdUM5QzAgXHVENjU1XHVDNzc4XHVENTU4XHVDMkVEXHVDMkRDXHVDNjI0LiJ9LAorICAgICAgICB7Ildhcm5pbmcuQ2xhc3Mubm90LmZvdW5kLmNsYXNzIiwgIlx1QUNCRFx1QUNFMDogXHVEMDc0XHVCNzk4XHVDMkE0XHVCOTdDIFx1Q0MzRVx1Qzc0NCBcdUMyMTggXHVDNUM2XHVDNzRDOiB7MH0ifSwKKyAgICAgICAgeyJXYXJuaW5nLkludmFsaWQuYXJndW1lbnQucy5mb3IuY29uc3RydWN0b3IuYXJnIiwKKyAgICAgICAgICAgICAgICAiXHVBQ0JEXHVBQ0UwOiBcdUMwRERcdUMxMzFcdUM3OTBcdUM1RDAgXHVCMzAwXHVENTc0IFx1QkQ4MFx1QzgwMVx1RDU2OVx1RDU1QyBcdUM3NzhcdUMyMTg6IHswfSJ9LAorICAgICAgICB7IklsbGVnYWwuUHJpbmNpcGFsLlR5cGUudHlwZSIsICJcdUM3OThcdUJBQkJcdUI0MUMgXHVDOEZDXHVDQ0I0IFx1QzcyMFx1RDYxNTogezB9In0sCisgICAgICAgIHsiSWxsZWdhbC5vcHRpb24ub3B0aW9uIiwgIlx1Qzc5OFx1QkFCQlx1QjQxQyBcdUM2MzVcdUMxNTg6IHswfSJ9LAorICAgICAgICB7IlVzYWdlLnBvbGljeXRvb2wub3B0aW9ucy4iLCAiXHVDMEFDXHVDNkE5XHVCQzk1OiBwb2xpY3l0b29sIFtvcHRpb25zXSJ9LAorICAgICAgICB7Ii5maWxlLmZpbGUucG9saWN5LmZpbGUubG9jYXRpb24iLAorICAgICAgICAgICAgICAgICIgIFstZmlsZSA8ZmlsZT5dICAgIFx1QzgxNVx1Q0M0NSBcdUQzMENcdUM3N0MgXHVDNzA0XHVDRTU4In0sCisgICAgICAgIHsiTmV3IiwgIlx1QzBDOFx1Qjg1QyBcdUI5Q0NcdUI0RTRcdUFFMzAifSwKKyAgICAgICAgeyJPcGVuIiwgIlx1QzVGNFx1QUUzMCJ9LAorICAgICAgICB7IlNhdmUiLCAiXHVDODAwXHVDN0E1In0sCisgICAgICAgIHsiU2F2ZS5BcyIsICJcdUIyRTRcdUI5NzggXHVDNzc0XHVCOTg0XHVDNzNDXHVCODVDIFx1QzgwMFx1QzdBNSJ9LAorICAgICAgICB7IlZpZXcuV2FybmluZy5Mb2ciLCAiXHVBQ0JEXHVBQ0UwIFx1Qjg1Q1x1QURGOCBcdUJDRjRcdUFFMzAifSwKKyAgICAgICAgeyJFeGl0IiwgIlx1Qzg4NVx1QjhDQyJ9LAorICAgICAgICB7IkFkZC5Qb2xpY3kuRW50cnkiLCAiXHVDODE1XHVDQzQ1IFx1RDU2RFx1QkFBOSBcdUNEOTRcdUFDMDAifSwKKyAgICAgICAgeyJFZGl0LlBvbGljeS5FbnRyeSIsICJcdUM4MTVcdUNDNDUgXHVENTZEXHVCQUE5IFx1RDNCOFx1QzlEMSJ9LAorICAgICAgICB7IlJlbW92ZS5Qb2xpY3kuRW50cnkiLCAiXHVDODE1XHVDQzQ1IFx1RDU2RFx1QkFBOSBcdUM4MUNcdUFDNzAifSwKKyAgICAgICAgeyJFZGl0IiwgIlx1RDNCOFx1QzlEMSJ9LAorICAgICAgICB7IlJldGFpbiIsICJcdUM3MjBcdUM5QzAifSwKKworICAgICAgICB7Ildhcm5pbmcuRmlsZS5uYW1lLm1heS5pbmNsdWRlLmVzY2FwZWQuYmFja3NsYXNoLmNoYXJhY3RlcnMuSXQuaXMubm90Lm5lY2Vzc2FyeS50by5lc2NhcGUuYmFja3NsYXNoLmNoYXJhY3RlcnMudGhlLnRvb2wuZXNjYXBlcyIsCisgICAgICAgICAgICAiXHVBQ0JEXHVBQ0UwOiBcdUQzMENcdUM3N0MgXHVDNzc0XHVCOTg0XHVDNUQwIFx1Qzc3NFx1QzJBNFx1Q0YwMFx1Qzc3NFx1RDUwNFx1QjQxQyBcdUJDMzFcdUMyQUNcdUI3OThcdUMyREMgXHVCQjM4XHVDNzkwXHVBQzAwIFx1RDNFQ1x1RDU2OFx1QjQxOFx1QzVDOFx1Qzc0NCBcdUMyMTggXHVDNzg4XHVDMkI1XHVCMkM4XHVCMkU0LiBcdUJDMzFcdUMyQUNcdUI3OThcdUMyREMgXHVCQjM4XHVDNzkwXHVCMjk0IFx1Qzc3NFx1QzJBNFx1Q0YwMFx1Qzc3NFx1RDUwNFx1RDU2MCBcdUQ1NDRcdUM2OTRcdUFDMDAgXHVDNUM2XHVDMkI1XHVCMkM4XHVCMkU0LiBcdUM2MDFcdUFENkMgXHVDODAwXHVDN0E1XHVDMThDXHVDNUQwIFx1QzgxNVx1Q0M0NSBcdUNGNThcdUQxNTBcdUNFMjBcdUI5N0MgXHVDNEY4IFx1QjU0QyBcdUQ1NDRcdUM2OTRcdUM1RDAgXHVCNTMwXHVCNzdDIFx1Qzc5MFx1QjNEOVx1QzczQ1x1Qjg1QyBcdUJCMzhcdUM3OTBcdUFDMDAgXHVDNzc0XHVDMkE0XHVDRjAwXHVDNzc0XHVENTA0XHVCNDI5XHVCMkM4XHVCMkU0LlxuXG5cdUM3ODVcdUI4MjVcdUI0MUMgXHVDNzc0XHVCOTg0XHVDNzQ0IFx1QURGOFx1QjMwMFx1Qjg1QyBcdUM3MjBcdUM5QzBcdUQ1NThcdUI4MjRcdUJBNzQgW1x1QzcyMFx1QzlDMF1cdUI5N0MgXHVCMjA0XHVCOTc0XHVBQ0UwLCBcdUM3NzRcdUI5ODRcdUM3NDQgXHVEM0I4XHVDOUQxXHVENTU4XHVCODI0XHVCQTc0IFtcdUQzQjhcdUM5RDFdXHVDNzQ0IFx1QjIwNFx1Qjk3NFx1QzJFRFx1QzJEQ1x1QzYyNC4ifSwKKworICAgICAgICB7IkFkZC5QdWJsaWMuS2V5LkFsaWFzIiwgIlx1QUNGNVx1QzZBOSBcdUQwQTQgXHVCQ0M0XHVDRTZEIFx1Q0Q5NFx1QUMwMCJ9LAorICAgICAgICB7IlJlbW92ZS5QdWJsaWMuS2V5LkFsaWFzIiwgIlx1QUNGNVx1QzZBOSBcdUQwQTQgXHVCQ0M0XHVDRTZEIFx1QzgxQ1x1QUM3MCJ9LAorICAgICAgICB7IkZpbGUiLCAiXHVEMzBDXHVDNzdDIn0sCisgICAgICAgIHsiS2V5U3RvcmUiLCAiXHVEMEE0IFx1QzgwMFx1QzdBNVx1QzE4QyJ9LAorICAgICAgICB7IlBvbGljeS5GaWxlLiIsICJcdUM4MTVcdUNDNDUgXHVEMzBDXHVDNzdDOiJ9LAorICAgICAgICB7IkNvdWxkLm5vdC5vcGVuLnBvbGljeS5maWxlLnBvbGljeUZpbGUuZS50b1N0cmluZy4iLAorICAgICAgICAgICAgICAgICJcdUM4MTVcdUNDNDUgXHVEMzBDXHVDNzdDXHVDNzQ0IFx1QzVGNCBcdUMyMTggXHVDNUM2XHVDNzRDOiB7MH06IHsxfSJ9LAorICAgICAgICB7IlBvbGljeS5Ub29sIiwgIlx1QzgxNVx1Q0M0NSBcdUQyMzQifSwKKyAgICAgICAgeyJFcnJvcnMuaGF2ZS5vY2N1cnJlZC53aGlsZS5vcGVuaW5nLnRoZS5wb2xpY3kuY29uZmlndXJhdGlvbi5WaWV3LnRoZS5XYXJuaW5nLkxvZy5mb3IubW9yZS5pbmZvcm1hdGlvbi4iLAorICAgICAgICAgICAgICAgICJcdUM4MTVcdUNDNDUgXHVBRDZDXHVDMTMxXHVDNzQ0IFx1QzVFQ1x1QjI5NCBcdUM5MTEgXHVDNjI0XHVCOTU4XHVBQzAwIFx1QkMxQ1x1QzBERFx1RDU4OFx1QzJCNVx1QjJDOFx1QjJFNC4gXHVDNzkwXHVDMTM4XHVENTVDIFx1QjBCNFx1QzZBOVx1Qzc0MCBcdUFDQkRcdUFDRTAgXHVCODVDXHVBREY4XHVCOTdDIFx1RDY1NVx1Qzc3OFx1RDU1OFx1QzJFRFx1QzJEQ1x1QzYyNC4ifSwKKyAgICAgICAgeyJFcnJvciIsICJcdUM2MjRcdUI5NTgifSwKKyAgICAgICAgeyJPSyIsICJcdUQ2NTVcdUM3NzgifSwKKyAgICAgICAgeyJTdGF0dXMiLCAiXHVDMEMxXHVEMERDIn0sCisgICAgICAgIHsiV2FybmluZyIsICJcdUFDQkRcdUFDRTAifSwKKyAgICAgICAgeyJQZXJtaXNzaW9uLiIsCisgICAgICAgICAgICAgICAgIlx1QUQ4Q1x1RDU1QzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIn0sCisgICAgICAgIHsiUHJpbmNpcGFsLlR5cGUuIiwgIlx1QzhGQ1x1Q0NCNCBcdUM3MjBcdUQ2MTU6In0sCisgICAgICAgIHsiUHJpbmNpcGFsLk5hbWUuIiwgIlx1QzhGQ1x1Q0NCNCBcdUM3NzRcdUI5ODQ6In0sCisgICAgICAgIHsiVGFyZ2V0Lk5hbWUuIiwKKyAgICAgICAgICAgICAgICAiXHVCMzAwXHVDMEMxIFx1Qzc3NFx1Qjk4NDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIn0sCisgICAgICAgIHsiQWN0aW9ucy4iLAorICAgICAgICAgICAgICAgICJcdUM3OTFcdUM1QzU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9LAorICAgICAgICB7Ik9LLnRvLm92ZXJ3cml0ZS5leGlzdGluZy5maWxlLmZpbGVuYW1lLiIsCisgICAgICAgICAgICAgICAgIlx1QUUzMFx1Qzg3NCBcdUQzMENcdUM3N0MgezB9XHVDNzQ0KFx1Qjk3QykgXHVBQ0I5XHVDQ0QwIFx1QzRGMFx1QUNBMFx1QzJCNVx1QjJDOFx1QUU0Qz8ifSwKKyAgICAgICAgeyJDYW5jZWwiLCAiXHVDREU4XHVDMThDIn0sCisgICAgICAgIHsiQ29kZUJhc2UuIiwgIkNvZGVCYXNlOiJ9LAorICAgICAgICB7IlNpZ25lZEJ5LiIsICJTaWduZWRCeToifSwKKyAgICAgICAgeyJBZGQuUHJpbmNpcGFsIiwgIlx1QzhGQ1x1Q0NCNCBcdUNEOTRcdUFDMDAifSwKKyAgICAgICAgeyJFZGl0LlByaW5jaXBhbCIsICJcdUM4RkNcdUNDQjQgXHVEM0I4XHVDOUQxIn0sCisgICAgICAgIHsiUmVtb3ZlLlByaW5jaXBhbCIsICJcdUM4RkNcdUNDQjQgXHVDODFDXHVBQzcwIn0sCisgICAgICAgIHsiUHJpbmNpcGFscy4iLCAiXHVDOEZDXHVDQ0I0OiJ9LAorICAgICAgICB7Ii5BZGQuUGVybWlzc2lvbiIsICIgIFx1QUQ4Q1x1RDU1QyBcdUNEOTRcdUFDMDAifSwKKyAgICAgICAgeyIuRWRpdC5QZXJtaXNzaW9uIiwgIiAgXHVBRDhDXHVENTVDIFx1RDNCOFx1QzlEMSJ9LAorICAgICAgICB7IlJlbW92ZS5QZXJtaXNzaW9uIiwgIlx1QUQ4Q1x1RDU1QyBcdUM4MUNcdUFDNzAifSwKKyAgICAgICAgeyJEb25lIiwgIlx1QzY0NFx1QjhDQyJ9LAorICAgICAgICB7IktleVN0b3JlLlVSTC4iLCAiXHVEMEE0IFx1QzgwMFx1QzdBNVx1QzE4QyBVUkw6In0sCisgICAgICAgIHsiS2V5U3RvcmUuVHlwZS4iLCAiXHVEMEE0IFx1QzgwMFx1QzdBNVx1QzE4QyBcdUM3MjBcdUQ2MTU6In0sCisgICAgICAgIHsiS2V5U3RvcmUuUHJvdmlkZXIuIiwgIlx1RDBBNCBcdUM4MDBcdUM3QTVcdUMxOEMgXHVDODFDXHVBQ0Y1XHVDNzkwOiJ9LAorICAgICAgICB7IktleVN0b3JlLlBhc3N3b3JkLlVSTC4iLCAiXHVEMEE0IFx1QzgwMFx1QzdBNVx1QzE4QyBcdUJFNDRcdUJDMDBcdUJDODhcdUQ2MzggVVJMOiJ9LAorICAgICAgICB7IlByaW5jaXBhbHMiLCAiXHVDOEZDXHVDQ0I0In0sCisgICAgICAgIHsiLkVkaXQuUHJpbmNpcGFsLiIsICIgIFx1QzhGQ1x1Q0NCNCBcdUQzQjhcdUM5RDE6In0sCisgICAgICAgIHsiLkFkZC5OZXcuUHJpbmNpcGFsLiIsICIgIFx1QzBDOCBcdUM4RkNcdUNDQjQgXHVDRDk0XHVBQzAwOiJ9LAorICAgICAgICB7IlBlcm1pc3Npb25zIiwgIlx1QUQ4Q1x1RDU1QyJ9LAorICAgICAgICB7Ii5FZGl0LlBlcm1pc3Npb24uIiwgIiAgXHVBRDhDXHVENTVDIFx1RDNCOFx1QzlEMToifSwKKyAgICAgICAgeyIuQWRkLk5ldy5QZXJtaXNzaW9uLiIsICIgIFx1QzBDOCBcdUFEOENcdUQ1NUMgXHVDRDk0XHVBQzAwOiJ9LAorICAgICAgICB7IlNpZ25lZC5CeS4iLCAiXHVDMTFDXHVCQTg1XHVDNzkwOiJ9LAorICAgICAgICB7IkNhbm5vdC5TcGVjaWZ5LlByaW5jaXBhbC53aXRoLmEuV2lsZGNhcmQuQ2xhc3Mud2l0aG91dC5hLldpbGRjYXJkLk5hbWUiLAorICAgICAgICAgICAgIlx1QzY0MFx1Qzc3Q1x1QjREQyBcdUNFNzRcdUI0REMgXHVCQjM4XHVDNzkwIFx1Qzc3NFx1Qjk4NCBcdUM1QzZcdUM3NzQgXHVDNjQwXHVDNzdDXHVCNERDIFx1Q0U3NFx1QjREQyBcdUJCMzhcdUM3OTAgXHVEMDc0XHVCNzk4XHVDMkE0XHVCOTdDIFx1QzBBQ1x1QzZBOVx1RDU1OFx1QjI5NCBcdUM4RkNcdUNDQjRcdUI5N0MgXHVDOUMwXHVDODE1XHVENTYwIFx1QzIxOCBcdUM1QzZcdUMyQjVcdUIyQzhcdUIyRTQuIn0sCisgICAgICAgIHsiQ2Fubm90LlNwZWNpZnkuUHJpbmNpcGFsLndpdGhvdXQuYS5OYW1lIiwKKyAgICAgICAgICAgICJcdUM3NzRcdUI5ODQgXHVDNUM2XHVDNzc0IFx1QzhGQ1x1Q0NCNFx1Qjk3QyBcdUM5QzBcdUM4MTVcdUQ1NjAgXHVDMjE4IFx1QzVDNlx1QzJCNVx1QjJDOFx1QjJFNC4ifSwKKyAgICAgICAgeyJQZXJtaXNzaW9uLmFuZC5UYXJnZXQuTmFtZS5tdXN0LmhhdmUuYS52YWx1ZSIsCisgICAgICAgICAgICAgICAgIlx1QUQ4Q1x1RDU1Q1x1QUNGQyBcdUIzMDBcdUMwQzEgXHVDNzc0XHVCOTg0XHVDNzU4IFx1QUMxMlx1Qzc3NCBcdUM3ODhcdUM1QjRcdUM1N0MgXHVENTY5XHVCMkM4XHVCMkU0LiJ9LAorICAgICAgICB7IlJlbW92ZS50aGlzLlBvbGljeS5FbnRyeS4iLCAiXHVDNzc0IFx1QzgxNVx1Q0M0NSBcdUQ1NkRcdUJBQTlcdUM3NDQgXHVDODFDXHVBQzcwXHVENTU4XHVBQ0EwXHVDMkI1XHVCMkM4XHVBRTRDPyJ9LAorICAgICAgICB7Ik92ZXJ3cml0ZS5GaWxlIiwgIlx1RDMwQ1x1Qzc3QyBcdUFDQjlcdUNDRDBcdUM0RjBcdUFFMzAifSwKKyAgICAgICAgeyJQb2xpY3kuc3VjY2Vzc2Z1bGx5LndyaXR0ZW4udG8uZmlsZW5hbWUiLAorICAgICAgICAgICAgICAgICJ7MH1cdUM1RDAgXHVDMTMxXHVBQ0Y1XHVDODAxXHVDNzNDXHVCODVDIFx1QzgxNVx1Q0M0NVx1Qzc0NCBcdUMzN0NcdUMyQjVcdUIyQzhcdUIyRTQuIn0sCisgICAgICAgIHsibnVsbC5maWxlbmFtZSIsICJcdUIxMTAgXHVEMzBDXHVDNzdDIFx1Qzc3NFx1Qjk4NCJ9LAorICAgICAgICB7IlNhdmUuY2hhbmdlcy4iLCAiXHVCQ0MwXHVBQ0JEIFx1QzBBQ1x1RDU2RFx1Qzc0NCBcdUM4MDBcdUM3QTVcdUQ1NThcdUFDQTBcdUMyQjVcdUIyQzhcdUFFNEM/In0sCisgICAgICAgIHsiWWVzIiwgIlx1QzYwOCJ9LAorICAgICAgICB7Ik5vIiwgIlx1QzU0NFx1QjJDOFx1QzYyNCJ9LAorICAgICAgICB7IlBvbGljeS5FbnRyeSIsICJcdUM4MTVcdUNDNDUgXHVENTZEXHVCQUE5In0sCisgICAgICAgIHsiU2F2ZS5DaGFuZ2VzIiwgIlx1QkNDMFx1QUNCRCBcdUMwQUNcdUQ1NkQgXHVDODAwXHVDN0E1In0sCisgICAgICAgIHsiTm8uUG9saWN5LkVudHJ5LnNlbGVjdGVkIiwgIlx1QzEyMFx1RDBERFx1QjQxQyBcdUM4MTVcdUNDNDUgXHVENTZEXHVCQUE5XHVDNzc0IFx1QzVDNlx1QzJCNVx1QjJDOFx1QjJFNC4ifSwKKyAgICAgICAgeyJVbmFibGUudG8ub3Blbi5LZXlTdG9yZS5leC50b1N0cmluZy4iLAorICAgICAgICAgICAgICAgICJcdUQwQTQgXHVDODAwXHVDN0E1XHVDMThDXHVCOTdDIFx1QzVGNCBcdUMyMTggXHVDNUM2XHVDNzRDOiB7MH0ifSwKKyAgICAgICAgeyJOby5wcmluY2lwYWwuc2VsZWN0ZWQiLCAiXHVDMTIwXHVEMEREXHVCNDFDIFx1QzhGQ1x1Q0NCNFx1QUMwMCBcdUM1QzZcdUMyQjVcdUIyQzhcdUIyRTQuIn0sCisgICAgICAgIHsiTm8ucGVybWlzc2lvbi5zZWxlY3RlZCIsICJcdUMxMjBcdUQwRERcdUI0MUMgXHVBRDhDXHVENTVDXHVDNzc0IFx1QzVDNlx1QzJCNVx1QjJDOFx1QjJFNC4ifSwKKyAgICAgICAgeyJuYW1lIiwgIlx1Qzc3NFx1Qjk4NCJ9LAorICAgICAgICB7ImNvbmZpZ3VyYXRpb24udHlwZSIsICJcdUFENkNcdUMxMzEgXHVDNzIwXHVENjE1In0sCisgICAgICAgIHsiZW52aXJvbm1lbnQudmFyaWFibGUubmFtZSIsICJcdUQ2NThcdUFDQkQgXHVCQ0MwXHVDMjE4IFx1Qzc3NFx1Qjk4NCJ9LAorICAgICAgICB7ImxpYnJhcnkubmFtZSIsICJcdUI3N0NcdUM3NzRcdUJFMENcdUI3RUNcdUI5QUMgXHVDNzc0XHVCOTg0In0sCisgICAgICAgIHsicGFja2FnZS5uYW1lIiwgIlx1RDMyOFx1RDBBNFx1QzlDMCBcdUM3NzRcdUI5ODQifSwKKyAgICAgICAgeyJwb2xpY3kudHlwZSIsICJcdUM4MTVcdUNDNDUgXHVDNzIwXHVENjE1In0sCisgICAgICAgIHsicHJvcGVydHkubmFtZSIsICJcdUMxOERcdUMxMzEgXHVDNzc0XHVCOTg0In0sCisgICAgICAgIHsicHJvdmlkZXIubmFtZSIsICJcdUM4MUNcdUFDRjVcdUM3OTAgXHVDNzc0XHVCOTg0In0sCisgICAgICAgIHsiUHJpbmNpcGFsLkxpc3QiLCAiXHVDOEZDXHVDQ0I0IFx1QkFBOVx1Qjg1RCJ9LAorICAgICAgICB7IlBlcm1pc3Npb24uTGlzdCIsICJcdUFEOENcdUQ1NUMgXHVCQUE5XHVCODVEIn0sCisgICAgICAgIHsiQ29kZS5CYXNlIiwgIlx1Q0Y1NFx1QjREQyBcdUJDQTBcdUM3NzRcdUMyQTQifSwKKyAgICAgICAgeyJLZXlTdG9yZS5VLlIuTC4iLCAiXHVEMEE0IFx1QzgwMFx1QzdBNVx1QzE4QyBVUkw6In0sCisgICAgICAgIHsiS2V5U3RvcmUuUGFzc3dvcmQuVS5SLkwuIiwgIlx1RDBBNCBcdUM4MDBcdUM3QTVcdUMxOEMgXHVCRTQ0XHVCQzAwXHVCQzg4XHVENjM4IFVSTDoifQorICAgIH07CisKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGNvbnRlbnRzIG9mIHRoaXMgPGNvZGU+UmVzb3VyY2VCdW5kbGU8L2NvZGU+LgorICAgICAqCisgICAgICogPHA+CisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBjb250ZW50cyBvZiB0aGlzIDxjb2RlPlJlc291cmNlQnVuZGxlPC9jb2RlPi4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0W11bXSBnZXRDb250ZW50cygpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRlbnRzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdG9vbHMvcG9saWN5dG9vbC9SZXNvdXJjZXNfcHRfQlIuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdG9vbHMvcG9saWN5dG9vbC9SZXNvdXJjZXNfcHRfQlIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmQ5ODA4Ci0tLSAvZGV2L251bGwKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS90b29scy9wb2xpY3l0b29sL1Jlc291cmNlc19wdF9CUi5qYXZhCkBAIC0wLDAgKzEsMTU2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBPcmFjbGUgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKKyAqIHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIHN1bi5zZWN1cml0eS50b29scy5wb2xpY3l0b29sOworCisvKioKKyAqIDxwPiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIDxjb2RlPlJlc291cmNlQnVuZGxlPC9jb2RlPgorICogZm9yIHRoZSBwb2xpY3l0b29sLgorICoKKyAqLworcHVibGljIGNsYXNzIFJlc291cmNlc19wdF9CUiBleHRlbmRzIGphdmEudXRpbC5MaXN0UmVzb3VyY2VCdW5kbGUgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W11bXSBjb250ZW50cyA9IHsKKyAgICAgICAgeyJORVdMSU5FIiwgIlxuIn0sCisgICAgICAgIHsiV2FybmluZy5BLnB1YmxpYy5rZXkuZm9yLmFsaWFzLnNpZ25lcnMuaS5kb2VzLm5vdC5leGlzdC5NYWtlLnN1cmUuYS5LZXlTdG9yZS5pcy5wcm9wZXJseS5jb25maWd1cmVkLiIsCisgICAgICAgICAgICAgICAgIkFkdmVydFx1MDBFQW5jaWE6IE5cdTAwRTNvIGV4aXN0ZSB1bWEgY2hhdmUgcFx1MDBGQWJsaWNhIHBhcmEgbyBhbGlhcyB7MH0uIENlcnRpZmlxdWUtc2UgZGUgcXVlIHVtIEtleVN0b3JlIGVzdGVqYSBjb25maWd1cmFkbyBhZGVxdWFkYW1lbnRlLiJ9LAorICAgICAgICB7Ildhcm5pbmcuQ2xhc3Mubm90LmZvdW5kLmNsYXNzIiwgIkFkdmVydFx1MDBFQW5jaWE6IENsYXNzZSBuXHUwMEUzbyBlbmNvbnRyYWRhOiB7MH0ifSwKKyAgICAgICAgeyJXYXJuaW5nLkludmFsaWQuYXJndW1lbnQucy5mb3IuY29uc3RydWN0b3IuYXJnIiwKKyAgICAgICAgICAgICAgICAiQWR2ZXJ0XHUwMEVBbmNpYTogQXJndW1lbnRvKHMpIGludlx1MDBFMWxpZG8ocykgcGFyYSBvIGNvbnN0cnV0b3I6IHswfSJ9LAorICAgICAgICB7IklsbGVnYWwuUHJpbmNpcGFsLlR5cGUudHlwZSIsICJUaXBvIFByaW5jaXBhbCBJbnZcdTAwRTFsaWRvOiB7MH0ifSwKKyAgICAgICAgeyJJbGxlZ2FsLm9wdGlvbi5vcHRpb24iLCAiT3BcdTAwRTdcdTAwRTNvIGludlx1MDBFMWxpZGE6IHswfSJ9LAorICAgICAgICB7IlVzYWdlLnBvbGljeXRvb2wub3B0aW9ucy4iLCAiVXNvOiBwb2xpY3l0b29sIFtvcFx1MDBFN1x1MDBGNWVzXSJ9LAorICAgICAgICB7Ii5maWxlLmZpbGUucG9saWN5LmZpbGUubG9jYXRpb24iLAorICAgICAgICAgICAgICAgICIgIFstZmlsZSA8YXJxdWl2bz5dICAgIGxvY2FsaXphXHUwMEU3XHUwMEUzbyBkbyBhcnF1aXZvIGRlIHBvbFx1MDBFRHRpY2EifSwKKyAgICAgICAgeyJOZXciLCAiTm92byJ9LAorICAgICAgICB7Ik9wZW4iLCAiQWJyaXIifSwKKyAgICAgICAgeyJTYXZlIiwgIlNhbHZhciJ9LAorICAgICAgICB7IlNhdmUuQXMiLCAiU2FsdmFyIENvbW8ifSwKKyAgICAgICAgeyJWaWV3Lldhcm5pbmcuTG9nIiwgIkV4aWJpciBMb2cgZGUgQWR2ZXJ0XHUwMEVBbmNpYXMifSwKKyAgICAgICAgeyJFeGl0IiwgIlNhaXIifSwKKyAgICAgICAgeyJBZGQuUG9saWN5LkVudHJ5IiwgIkFkaWNpb25hciBFbnRyYWRhIGRlIFBvbFx1MDBFRHRpY2EifSwKKyAgICAgICAgeyJFZGl0LlBvbGljeS5FbnRyeSIsICJFZGl0YXIgRW50cmFkYSBkZSBQb2xcdTAwRUR0aWNhIn0sCisgICAgICAgIHsiUmVtb3ZlLlBvbGljeS5FbnRyeSIsICJSZW1vdmVyIEVudHJhZGEgZGUgUG9sXHUwMEVEdGljYSJ9LAorICAgICAgICB7IkVkaXQiLCAiRWRpdGFyIn0sCisgICAgICAgIHsiUmV0YWluIiwgIlJldGVyIn0sCisKKyAgICAgICAgeyJXYXJuaW5nLkZpbGUubmFtZS5tYXkuaW5jbHVkZS5lc2NhcGVkLmJhY2tzbGFzaC5jaGFyYWN0ZXJzLkl0LmlzLm5vdC5uZWNlc3NhcnkudG8uZXNjYXBlLmJhY2tzbGFzaC5jaGFyYWN0ZXJzLnRoZS50b29sLmVzY2FwZXMiLAorICAgICAgICAgICAgIkFkdmVydFx1MDBFQW5jaWE6IE8gbm9tZSBkbyBhcnF1aXZvIHBvZGUgY29udGVyIGNhcmFjdGVyZXMgZGUgZXNjYXBlIGJhcnJhIGludmVydGlkYS4gTlx1MDBFM28gXHUwMEU5IG5lY2Vzc1x1MDBFMXJpbyBmYXplciBvIGVzY2FwZSBkb3MgY2FyYWN0ZXJlcyBkZSBiYXJyYSBpbnZlcnRpZGEgKGEgZmVycmFtZW50YSBmYXogbyBlc2NhcGUgZG9zIGNhcmFjdGVyZXMgY29uZm9ybWUgbmVjZXNzXHUwMEUxcmlvIGFvIGdyYXZhciBvIGNvbnRlXHUwMEZBZG8gZGEgcG9sXHUwMEVEdGljYSBubyBhcm1hemVuYW1lbnRvIHBlcnNpc3RlbnRlKS5cblxuQ2xpcXVlIGVtIFJldGVyIHBhcmEgcmV0ZXIgbyBub21lIGRhIGVudHJhZGEgb3UgY2xpcXVlIGVtIEVkaXRhciBwYXJhIGVkaXRcdTAwRTEtbG8uIn0sCisKKyAgICAgICAgeyJBZGQuUHVibGljLktleS5BbGlhcyIsICJBZGljaW9uYXIgQWxpYXMgZGUgQ2hhdmUgUFx1MDBGQWJsaWNhIn0sCisgICAgICAgIHsiUmVtb3ZlLlB1YmxpYy5LZXkuQWxpYXMiLCAiUmVtb3ZlciBBbGlhcyBkZSBDaGF2ZSBQXHUwMEZBYmxpY2EifSwKKyAgICAgICAgeyJGaWxlIiwgIkFycXVpdm8ifSwKKyAgICAgICAgeyJLZXlTdG9yZSIsICJLZXlTdG9yZSJ9LAorICAgICAgICB7IlBvbGljeS5GaWxlLiIsICJBcnF1aXZvIGRlIFBvbFx1MDBFRHRpY2E6In0sCisgICAgICAgIHsiQ291bGQubm90Lm9wZW4ucG9saWN5LmZpbGUucG9saWN5RmlsZS5lLnRvU3RyaW5nLiIsCisgICAgICAgICAgICAgICAgIk5cdTAwRTNvIGZvaSBwb3NzXHUwMEVEdmVsIGFicmlyIG8gYXJxdWl2byBkZSBwb2xcdTAwRUR0aWNhOiB7MH06IHsxfSJ9LAorICAgICAgICB7IlBvbGljeS5Ub29sIiwgIkZlcnJhbWVudGEgZGUgUG9sXHUwMEVEdGljYSJ9LAorICAgICAgICB7IkVycm9ycy5oYXZlLm9jY3VycmVkLndoaWxlLm9wZW5pbmcudGhlLnBvbGljeS5jb25maWd1cmF0aW9uLlZpZXcudGhlLldhcm5pbmcuTG9nLmZvci5tb3JlLmluZm9ybWF0aW9uLiIsCisgICAgICAgICAgICAgICAgIkVycm9zIGR1cmFudGUgYSBhYmVydHVyYSBkYSBjb25maWd1cmFcdTAwRTdcdTAwRTNvIGRhIHBvbFx1MDBFRHRpY2EuIENvbnN1bHRlIG8gTG9nIGRlIEFkdmVydFx1MDBFQW5jaWFzIHBhcmEgb2J0ZXIgbWFpcyBpbmZvcm1hXHUwMEU3XHUwMEY1ZXMuIn0sCisgICAgICAgIHsiRXJyb3IiLCAiRXJybyJ9LAorICAgICAgICB7Ik9LIiwgIk9LIn0sCisgICAgICAgIHsiU3RhdHVzIiwgIlN0YXR1cyJ9LAorICAgICAgICB7Ildhcm5pbmciLCAiQWR2ZXJ0XHUwMEVBbmNpYSJ9LAorICAgICAgICB7IlBlcm1pc3Npb24uIiwKKyAgICAgICAgICAgICAgICAiUGVybWlzc1x1MDBFM286ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9LAorICAgICAgICB7IlByaW5jaXBhbC5UeXBlLiIsICJUaXBvIGRvIFByaW5jaXBhbDoifSwKKyAgICAgICAgeyJQcmluY2lwYWwuTmFtZS4iLCAiTm9tZSBkbyBQcmluY2lwYWw6In0sCisgICAgICAgIHsiVGFyZ2V0Lk5hbWUuIiwKKyAgICAgICAgICAgICAgICAiTm9tZSBkbyBBbHZvOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifSwKKyAgICAgICAgeyJBY3Rpb25zLiIsCisgICAgICAgICAgICAgICAgIkFcdTAwRTdcdTAwRjVlczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIn0sCisgICAgICAgIHsiT0sudG8ub3ZlcndyaXRlLmV4aXN0aW5nLmZpbGUuZmlsZW5hbWUuIiwKKyAgICAgICAgICAgICAgICAiRXN0XHUwMEUxIGNvcnJldG8gc3Vic3RpdHVpciBvIGFycXVpdm8gZXhpc3RlbnRlIHswfT8ifSwKKyAgICAgICAgeyJDYW5jZWwiLCAiQ2FuY2VsYXIifSwKKyAgICAgICAgeyJDb2RlQmFzZS4iLCAiQ29kZUJhc2U6In0sCisgICAgICAgIHsiU2lnbmVkQnkuIiwgIlNpZ25lZEJ5OiJ9LAorICAgICAgICB7IkFkZC5QcmluY2lwYWwiLCAiQWRpY2lvbmFyIFByaW5jaXBhbCJ9LAorICAgICAgICB7IkVkaXQuUHJpbmNpcGFsIiwgIkVkaXRhciBQcmluY2lwYWwifSwKKyAgICAgICAgeyJSZW1vdmUuUHJpbmNpcGFsIiwgIlJlbW92ZXIgUHJpbmNpcGFsIn0sCisgICAgICAgIHsiUHJpbmNpcGFscy4iLCAiUHJpbmNpcGFpczoifSwKKyAgICAgICAgeyIuQWRkLlBlcm1pc3Npb24iLCAiICBBZGljaW9uYXIgUGVybWlzc1x1MDBFM28ifSwKKyAgICAgICAgeyIuRWRpdC5QZXJtaXNzaW9uIiwgIiAgRWRpdGFyIFBlcm1pc3NcdTAwRTNvIn0sCisgICAgICAgIHsiUmVtb3ZlLlBlcm1pc3Npb24iLCAiUmVtb3ZlciBQZXJtaXNzXHUwMEUzbyJ9LAorICAgICAgICB7IkRvbmUiLCAiQ29uY2x1XHUwMEVEZG8ifSwKKyAgICAgICAgeyJLZXlTdG9yZS5VUkwuIiwgIlVSTCBkbyBLZXlTdG9yZToifSwKKyAgICAgICAgeyJLZXlTdG9yZS5UeXBlLiIsICJUaXBvIGRlIEtleVN0b3JlOiJ9LAorICAgICAgICB7IktleVN0b3JlLlByb3ZpZGVyLiIsICJGb3JuZWNlZG9yIGRlIEtleVN0b3JlOiJ9LAorICAgICAgICB7IktleVN0b3JlLlBhc3N3b3JkLlVSTC4iLCAiVVJMIGRhIFNlbmhhIGRvIEtleVN0b3JlOiJ9LAorICAgICAgICB7IlByaW5jaXBhbHMiLCAiUHJpbmNpcGFpcyJ9LAorICAgICAgICB7Ii5FZGl0LlByaW5jaXBhbC4iLCAiICBFZGl0YXIgUHJpbmNpcGFsOiJ9LAorICAgICAgICB7Ii5BZGQuTmV3LlByaW5jaXBhbC4iLCAiICBBZGljaW9uYXIgTm92byBQcmluY2lwYWw6In0sCisgICAgICAgIHsiUGVybWlzc2lvbnMiLCAiUGVybWlzc1x1MDBGNWVzIn0sCisgICAgICAgIHsiLkVkaXQuUGVybWlzc2lvbi4iLCAiICBFZGl0YXIgUGVybWlzc1x1MDBFM286In0sCisgICAgICAgIHsiLkFkZC5OZXcuUGVybWlzc2lvbi4iLCAiICBBZGljaW9uYXIgTm92YSBQZXJtaXNzXHUwMEUzbzoifSwKKyAgICAgICAgeyJTaWduZWQuQnkuIiwgIkFzc2luYWRvIHBvcjoifSwKKyAgICAgICAgeyJDYW5ub3QuU3BlY2lmeS5QcmluY2lwYWwud2l0aC5hLldpbGRjYXJkLkNsYXNzLndpdGhvdXQuYS5XaWxkY2FyZC5OYW1lIiwKKyAgICAgICAgICAgICJOXHUwMEUzbyBcdTAwRTkgUG9zc1x1MDBFRHZlbCBFc3BlY2lmaWNhciB1bSBQcmluY2lwYWwgY29tIHVtYSBDbGFzc2UgZGUgQ3VyaW5nYSBzZW0gdW0gTm9tZSBkZSBDdXJpbmdhIn0sCisgICAgICAgIHsiQ2Fubm90LlNwZWNpZnkuUHJpbmNpcGFsLndpdGhvdXQuYS5OYW1lIiwKKyAgICAgICAgICAgICJOXHUwMEUzbyBcdTAwRTkgUG9zc1x1MDBFRHZlbCBFc3BlY2lmaWNhciB1bSBQcmluY2lwYWwgc2VtIHVtIE5vbWUifSwKKyAgICAgICAgeyJQZXJtaXNzaW9uLmFuZC5UYXJnZXQuTmFtZS5tdXN0LmhhdmUuYS52YWx1ZSIsCisgICAgICAgICAgICAgICAgIk8gTm9tZSBkZSBEZXN0aW5vIGUgYSBQZXJtaXNzXHUwMEUzbyBkZXZlbSB0ZXIgdW0gVmFsb3IifSwKKyAgICAgICAgeyJSZW1vdmUudGhpcy5Qb2xpY3kuRW50cnkuIiwgIlJlbW92ZXIgZXN0YSBFbnRyYWRhIGRlIFBvbFx1MDBFRHRpY2E/In0sCisgICAgICAgIHsiT3ZlcndyaXRlLkZpbGUiLCAiU3Vic3RpdHVpciBBcnF1aXZvIn0sCisgICAgICAgIHsiUG9saWN5LnN1Y2Nlc3NmdWxseS53cml0dGVuLnRvLmZpbGVuYW1lIiwKKyAgICAgICAgICAgICAgICAiUG9sXHUwMEVEdGljYSBncmF2YWRhIGNvbSBcdTAwRUF4aXRvIGVtIHswfSJ9LAorICAgICAgICB7Im51bGwuZmlsZW5hbWUiLCAibm9tZSBkZSBhcnF1aXZvIG51bG8ifSwKKyAgICAgICAgeyJTYXZlLmNoYW5nZXMuIiwgIlNhbHZhciBhbHRlcmFcdTAwRTdcdTAwRjVlcz8ifSwKKyAgICAgICAgeyJZZXMiLCAiU2ltIn0sCisgICAgICAgIHsiTm8iLCAiTlx1MDBFM28ifSwKKyAgICAgICAgeyJQb2xpY3kuRW50cnkiLCAiRW50cmFkYSBkZSBQb2xcdTAwRUR0aWNhIn0sCisgICAgICAgIHsiU2F2ZS5DaGFuZ2VzIiwgIlNhbHZhciBBbHRlcmFcdTAwRTdcdTAwRjVlcyJ9LAorICAgICAgICB7Ik5vLlBvbGljeS5FbnRyeS5zZWxlY3RlZCIsICJOZW5odW1hIEVudHJhZGEgZGUgUG9sXHUwMEVEdGljYSBTZWxlY2lvbmFkYSJ9LAorICAgICAgICB7IlVuYWJsZS50by5vcGVuLktleVN0b3JlLmV4LnRvU3RyaW5nLiIsCisgICAgICAgICAgICAgICAgIk5cdTAwRTNvIFx1MDBFOSBwb3NzXHUwMEVEdmVsIGFicmlyIGEgS2V5U3RvcmU6IHswfSJ9LAorICAgICAgICB7Ik5vLnByaW5jaXBhbC5zZWxlY3RlZCIsICJOZW5odW0gcHJpbmNpcGFsIHNlbGVjaW9uYWRvIn0sCisgICAgICAgIHsiTm8ucGVybWlzc2lvbi5zZWxlY3RlZCIsICJOZW5odW1hIHBlcm1pc3NcdTAwRTNvIHNlbGVjaW9uYWRhIn0sCisgICAgICAgIHsibmFtZSIsICJub21lIn0sCisgICAgICAgIHsiY29uZmlndXJhdGlvbi50eXBlIiwgInRpcG8gZGUgY29uZmlndXJhXHUwMEU3XHUwMEUzbyJ9LAorICAgICAgICB7ImVudmlyb25tZW50LnZhcmlhYmxlLm5hbWUiLCAibm9tZSBkYSB2YXJpXHUwMEUxdmVsIGRlIGFtYmllbnRlIn0sCisgICAgICAgIHsibGlicmFyeS5uYW1lIiwgIm5vbWUgZGEgYmlibGlvdGVjYSJ9LAorICAgICAgICB7InBhY2thZ2UubmFtZSIsICJub21lIGRvIHBhY290ZSJ9LAorICAgICAgICB7InBvbGljeS50eXBlIiwgInRpcG8gZGUgcG9sXHUwMEVEdGljYSJ9LAorICAgICAgICB7InByb3BlcnR5Lm5hbWUiLCAibm9tZSBkYSBwcm9wcmllZGFkZSJ9LAorICAgICAgICB7InByb3ZpZGVyLm5hbWUiLCAibm9tZSBkbyBmb3JuZWNlZG9yIn0sCisgICAgICAgIHsiUHJpbmNpcGFsLkxpc3QiLCAiTGlzdGEgZGUgUHJpbmNpcGFpcyJ9LAorICAgICAgICB7IlBlcm1pc3Npb24uTGlzdCIsICJMaXN0YSBkZSBQZXJtaXNzXHUwMEY1ZXMifSwKKyAgICAgICAgeyJDb2RlLkJhc2UiLCAiQmFzZSBkZSBDXHUwMEYzZGlnbyJ9LAorICAgICAgICB7IktleVN0b3JlLlUuUi5MLiIsICJVIFIgTCBkYSBLZXlTdG9yZToifSwKKyAgICAgICAgeyJLZXlTdG9yZS5QYXNzd29yZC5VLlIuTC4iLCAiVSBSIEwgZGEgU2VuaGEgZG8gS2V5U3RvcmU6In0KKyAgICB9OworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjb250ZW50cyBvZiB0aGlzIDxjb2RlPlJlc291cmNlQnVuZGxlPC9jb2RlPi4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgY29udGVudHMgb2YgdGhpcyA8Y29kZT5SZXNvdXJjZUJ1bmRsZTwvY29kZT4uCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9iamVjdFtdW10gZ2V0Q29udGVudHMoKSB7CisgICAgICAgIHJldHVybiBjb250ZW50czsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3Rvb2xzL3BvbGljeXRvb2wvUmVzb3VyY2VzX3N2LmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3Rvb2xzL3BvbGljeXRvb2wvUmVzb3VyY2VzX3N2LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBiZjczNAotLS0gL2Rldi9udWxsCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdG9vbHMvcG9saWN5dG9vbC9SZXNvdXJjZXNfc3YuamF2YQpAQCAtMCwwICsxLDE1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgT3JhY2xlIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCisgKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CisgKiBxdWVzdGlvbnMuCisgKi8KKworcGFja2FnZSBzdW4uc2VjdXJpdHkudG9vbHMucG9saWN5dG9vbDsKKworLyoqCisgKiA8cD4gVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSA8Y29kZT5SZXNvdXJjZUJ1bmRsZTwvY29kZT4KKyAqIGZvciB0aGUgcG9saWN5dG9vbC4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBSZXNvdXJjZXNfc3YgZXh0ZW5kcyBqYXZhLnV0aWwuTGlzdFJlc291cmNlQnVuZGxlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdW10gY29udGVudHMgPSB7CisgICAgICAgIHsiTkVXTElORSIsICJcbiJ9LAorICAgICAgICB7Ildhcm5pbmcuQS5wdWJsaWMua2V5LmZvci5hbGlhcy5zaWduZXJzLmkuZG9lcy5ub3QuZXhpc3QuTWFrZS5zdXJlLmEuS2V5U3RvcmUuaXMucHJvcGVybHkuY29uZmlndXJlZC4iLAorICAgICAgICAgICAgICAgICJWYXJuaW5nISBEZXQgZmlubnMgaW5nZW4gb2ZmZW50bGlnIG55Y2tlbCBmXHUwMEY2ciBhbGlhc2V0IHswfS4gS29udHJvbGxlcmEgYXR0IGRldCBha3R1ZWxsYSBueWNrZWxsYWdyZXQgXHUwMEU0ciBrb3JyZWt0IGtvbmZpZ3VyZXJhdC4ifSwKKyAgICAgICAgeyJXYXJuaW5nLkNsYXNzLm5vdC5mb3VuZC5jbGFzcyIsICJWYXJuaW5nISBLbGFzc2VuIGhpdHRhZGVzIGludGU6IHswfSJ9LAorICAgICAgICB7Ildhcm5pbmcuSW52YWxpZC5hcmd1bWVudC5zLmZvci5jb25zdHJ1Y3Rvci5hcmciLAorICAgICAgICAgICAgICAgICJWYXJuaW5nISBPZ2lsdGlnYSBhcmd1bWVudCBmXHUwMEY2ciBrb25zdHJ1a3RvcjogezB9In0sCisgICAgICAgIHsiSWxsZWdhbC5QcmluY2lwYWwuVHlwZS50eXBlIiwgIk90aWxsXHUwMEU1dGVuIGlkZW50aXRldHNoYXZhcmV0eXA6IHswfSJ9LAorICAgICAgICB7IklsbGVnYWwub3B0aW9uLm9wdGlvbiIsICJPdGlsbFx1MDBFNXRldCBhbHRlcm5hdGl2OiB7MH0ifSwKKyAgICAgICAgeyJVc2FnZS5wb2xpY3l0b29sLm9wdGlvbnMuIiwgIlN5bnRheDogcG9saWN5dG9vbCBbYWx0ZXJuYXRpdl0ifSwKKyAgICAgICAgeyIuZmlsZS5maWxlLnBvbGljeS5maWxlLmxvY2F0aW9uIiwKKyAgICAgICAgICAgICAgICAiICBbLWZpbGUgPGZpbD5dICAgIHBvbGljeWZpbGVucyBwbGF0cyJ9LAorICAgICAgICB7Ik5ldyIsICJOeXR0In0sCisgICAgICAgIHsiT3BlbiIsICJcdTAwRDZwcG5hIn0sCisgICAgICAgIHsiU2F2ZSIsICJTcGFyYSJ9LAorICAgICAgICB7IlNhdmUuQXMiLCAiU3BhcmEgc29tIn0sCisgICAgICAgIHsiVmlldy5XYXJuaW5nLkxvZyIsICJWaXNhIHZhcm5pbmdzbG9nZyJ9LAorICAgICAgICB7IkV4aXQiLCAiQXZzbHV0YSJ9LAorICAgICAgICB7IkFkZC5Qb2xpY3kuRW50cnkiLCAiTFx1MDBFNGdnIHRpbGwgcG9saWN5cG9zdCJ9LAorICAgICAgICB7IkVkaXQuUG9saWN5LkVudHJ5IiwgIlJlZGlnZXJhIHBvbGljeXBvc3QifSwKKyAgICAgICAgeyJSZW1vdmUuUG9saWN5LkVudHJ5IiwgIlRhIGJvcnQgcG9saWN5cG9zdCJ9LAorICAgICAgICB7IkVkaXQiLCAiUmVkaWdlcmEifSwKKyAgICAgICAgeyJSZXRhaW4iLCAiQmVoXHUwMEU1bGwifSwKKworICAgICAgICB7Ildhcm5pbmcuRmlsZS5uYW1lLm1heS5pbmNsdWRlLmVzY2FwZWQuYmFja3NsYXNoLmNoYXJhY3RlcnMuSXQuaXMubm90Lm5lY2Vzc2FyeS50by5lc2NhcGUuYmFja3NsYXNoLmNoYXJhY3RlcnMudGhlLnRvb2wuZXNjYXBlcyIsCisgICAgICAgICAgICAiVmFybmluZyEgRmlsbmFtbmV0IGthbiBpbm5laFx1MDBFNWxsYSBvbXZcdTAwRTRuZGEgc25lZHN0cmVjayBpbm9tIGNpdGF0dGVja2VuLiBDaXRhdHRlY2tlbiBrclx1MDBFNHZzIGludGUgZlx1MDBGNnIgb212XHUwMEU0bmRhIHNuZWRzdHJlY2sgKHZlcmt0eWdldCBoYW50ZXJhciBkZXR0YSBuXHUwMEU0ciBwb2xpY3lpbm5laFx1MDBFNWxsZXQgc2tyaXZzIHRpbGwgZGV0IGJlc3RcdTAwRTRuZGlnYSBsYWdyZXQpLlxuXG5LbGlja2EgcFx1MDBFNSBCZWhcdTAwRTVsbCBmXHUwMEY2ciBhdHQgYmVoXHUwMEU1bGxhIGRldCBhbmdpdm5hIG5hbW5ldCwgZWxsZXIga2xpY2thIHBcdTAwRTUgUmVkaWdlcmEgZlx1MDBGNnIgYXR0IFx1MDBFNG5kcmEgZGV0LiJ9LAorCisgICAgICAgIHsiQWRkLlB1YmxpYy5LZXkuQWxpYXMiLCAiTFx1MDBFNGdnIHRpbGwgb2ZmZW50bGlndCBueWNrZWxhbGlhcyJ9LAorICAgICAgICB7IlJlbW92ZS5QdWJsaWMuS2V5LkFsaWFzIiwgIlRhIGJvcnQgb2ZmZW50bGlndCBueWNrZWxhbGlhcyJ9LAorICAgICAgICB7IkZpbGUiLCAiRmlsIn0sCisgICAgICAgIHsiS2V5U3RvcmUiLCAiTnlja2VsbGFnZXIifSwKKyAgICAgICAgeyJQb2xpY3kuRmlsZS4iLCAiUG9saWN5ZmlsOiJ9LAorICAgICAgICB7IkNvdWxkLm5vdC5vcGVuLnBvbGljeS5maWxlLnBvbGljeUZpbGUuZS50b1N0cmluZy4iLAorICAgICAgICAgICAgICAgICJLYW4gaW50ZSBcdTAwRjZwcG5hIHBvbGljeWZpbGVuOiB7MH06IHsxfSJ9LAorICAgICAgICB7IlBvbGljeS5Ub29sIiwgIlBvbGljeXZlcmt0eWcifSwKKyAgICAgICAgeyJFcnJvcnMuaGF2ZS5vY2N1cnJlZC53aGlsZS5vcGVuaW5nLnRoZS5wb2xpY3kuY29uZmlndXJhdGlvbi5WaWV3LnRoZS5XYXJuaW5nLkxvZy5mb3IubW9yZS5pbmZvcm1hdGlvbi4iLAorICAgICAgICAgICAgICAgICJEZXQgdXBwc3RvZCBldHQgZmVsIG5cdTAwRTRyIHBvbGljeWtvbmZpZ3VyYXRpb25lbiBza3VsbGUgXHUwMEY2cHBuYXMuIFNlIHZhcm5pbmdzbG9nZ2VuIGZcdTAwRjZyIG1lciBpbmZvcm1hdGlvbi4ifSwKKyAgICAgICAgeyJFcnJvciIsICJGZWwifSwKKyAgICAgICAgeyJPSyIsICJPSyJ9LAorICAgICAgICB7IlN0YXR1cyIsICJTdGF0dXMifSwKKyAgICAgICAgeyJXYXJuaW5nIiwgIlZhcm5pbmcifSwKKyAgICAgICAgeyJQZXJtaXNzaW9uLiIsCisgICAgICAgICAgICAgICAgIkJlaFx1MDBGNnJpZ2hldDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIn0sCisgICAgICAgIHsiUHJpbmNpcGFsLlR5cGUuIiwgIklkZW50aXRldHNoYXZhcmV0eXA6In0sCisgICAgICAgIHsiUHJpbmNpcGFsLk5hbWUuIiwgIklkZW50aXRldHNoYXZhcmU6In0sCisgICAgICAgIHsiVGFyZ2V0Lk5hbWUuIiwKKyAgICAgICAgICAgICAgICAiTVx1MDBFNWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9LAorICAgICAgICB7IkFjdGlvbnMuIiwKKyAgICAgICAgICAgICAgICAiRnVua3Rpb25lcjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIn0sCisgICAgICAgIHsiT0sudG8ub3ZlcndyaXRlLmV4aXN0aW5nLmZpbGUuZmlsZW5hbWUuIiwKKyAgICAgICAgICAgICAgICAiU2thIGRlbiBiZWZpbnRsaWdhIGZpbGVuIHswfSBza3JpdmFzIFx1MDBGNnZlcj8ifSwKKyAgICAgICAgeyJDYW5jZWwiLCAiQXZicnl0In0sCisgICAgICAgIHsiQ29kZUJhc2UuIiwgIktvZGJhczoifSwKKyAgICAgICAgeyJTaWduZWRCeS4iLCAiU2lnbmVyYWQgYXY6In0sCisgICAgICAgIHsiQWRkLlByaW5jaXBhbCIsICJMXHUwMEU0Z2cgdGlsbCBpZGVudGl0ZXRzaGF2YXJlIn0sCisgICAgICAgIHsiRWRpdC5QcmluY2lwYWwiLCAiUmVkaWdlcmEgaWRlbnRpdGV0c2hhdmFyZSJ9LAorICAgICAgICB7IlJlbW92ZS5QcmluY2lwYWwiLCAiVGEgYm9ydCBpZGVudGl0ZXRzaGF2YXJlIn0sCisgICAgICAgIHsiUHJpbmNpcGFscy4iLCAiSWRlbnRpdGV0c2hhdmFyZToifSwKKyAgICAgICAgeyIuQWRkLlBlcm1pc3Npb24iLCAiICBMXHUwMEU0Z2cgdGlsbCBiZWhcdTAwRjZyaWdoZXQifSwKKyAgICAgICAgeyIuRWRpdC5QZXJtaXNzaW9uIiwgIiAgUmVkaWdlcmEgYmVoXHUwMEY2cmlnaGV0In0sCisgICAgICAgIHsiUmVtb3ZlLlBlcm1pc3Npb24iLCAiVGEgYm9ydCBiZWhcdTAwRjZyaWdoZXQifSwKKyAgICAgICAgeyJEb25lIiwgIlV0Zlx1MDBGNnJkIn0sCisgICAgICAgIHsiS2V5U3RvcmUuVVJMLiIsICJVUkwgZlx1MDBGNnIgbnlja2VsbGFnZXI6In0sCisgICAgICAgIHsiS2V5U3RvcmUuVHlwZS4iLCAiTnlja2VsbGFnZXJ0eXA6In0sCisgICAgICAgIHsiS2V5U3RvcmUuUHJvdmlkZXIuIiwgIk55Y2tlbGxhZ2VybGV2ZXJhbnRcdTAwRjZyOiJ9LAorICAgICAgICB7IktleVN0b3JlLlBhc3N3b3JkLlVSTC4iLCAiVVJMIGZcdTAwRjZyIGxcdTAwRjZzZW5vcmQgdGlsbCBueWNrZWxsYWdlcjoifSwKKyAgICAgICAgeyJQcmluY2lwYWxzIiwgIklkZW50aXRldHNoYXZhcmUifSwKKyAgICAgICAgeyIuRWRpdC5QcmluY2lwYWwuIiwgIiAgUmVkaWdlcmEgaWRlbnRpdGV0c2hhdmFyZToifSwKKyAgICAgICAgeyIuQWRkLk5ldy5QcmluY2lwYWwuIiwgIiAgTFx1MDBFNGdnIHRpbGwgbnkgaWRlbnRpdGV0c2hhdmFyZToifSwKKyAgICAgICAgeyJQZXJtaXNzaW9ucyIsICJCZWhcdTAwRjZyaWdoZXQifSwKKyAgICAgICAgeyIuRWRpdC5QZXJtaXNzaW9uLiIsICIgIFJlZGlnZXJhIGJlaFx1MDBGNnJpZ2hldDoifSwKKyAgICAgICAgeyIuQWRkLk5ldy5QZXJtaXNzaW9uLiIsICIgIExcdTAwRTRnZyB0aWxsIG55IGJlaFx1MDBGNnJpZ2hldDoifSwKKyAgICAgICAgeyJTaWduZWQuQnkuIiwgIlNpZ25lcmFkIGF2OiJ9LAorICAgICAgICB7IkNhbm5vdC5TcGVjaWZ5LlByaW5jaXBhbC53aXRoLmEuV2lsZGNhcmQuQ2xhc3Mud2l0aG91dC5hLldpbGRjYXJkLk5hbWUiLAorICAgICAgICAgICAgIkthbiBpbnRlIHNwZWNpZmljZXJhIGlkZW50aXRldHNoYXZhcmUgbWVkIGpva2VydGVja2Vua2xhc3MgdXRhbiBqb2tlcnRlY2tlbm5hbW4ifSwKKyAgICAgICAgeyJDYW5ub3QuU3BlY2lmeS5QcmluY2lwYWwud2l0aG91dC5hLk5hbWUiLAorICAgICAgICAgICAgIkthbiBpbnRlIHNwZWNpZmljZXJhIGlkZW50aXRldHNoYXZhcmUgdXRhbiBuYW1uIn0sCisgICAgICAgIHsiUGVybWlzc2lvbi5hbmQuVGFyZ2V0Lk5hbWUubXVzdC5oYXZlLmEudmFsdWUiLAorICAgICAgICAgICAgICAgICJCZWhcdTAwRjZyaWdoZXQgb2NoIG1cdTAwRTVsbmFtbiBtXHUwMEU1c3RlIGhhIGV0dCB2XHUwMEU0cmRlIn0sCisgICAgICAgIHsiUmVtb3ZlLnRoaXMuUG9saWN5LkVudHJ5LiIsICJWaWxsIGR1IHRhIGJvcnQgZGVuIGhcdTAwRTRyIHBvbGljeXBvc3Rlbj8ifSwKKyAgICAgICAgeyJPdmVyd3JpdGUuRmlsZSIsICJTa3JpdiBcdTAwRjZ2ZXIgZmlsIn0sCisgICAgICAgIHsiUG9saWN5LnN1Y2Nlc3NmdWxseS53cml0dGVuLnRvLmZpbGVuYW1lIiwKKyAgICAgICAgICAgICAgICAiUG9saWN5IGhhciBza3Jpdml0cyB0aWxsIHswfSJ9LAorICAgICAgICB7Im51bGwuZmlsZW5hbWUiLCAibnVsbGZpbG5hbW4ifSwKKyAgICAgICAgeyJTYXZlLmNoYW5nZXMuIiwgIlZpbGwgZHUgc3BhcmEgXHUwMEU0bmRyaW5nYXJuYT8ifSwKKyAgICAgICAgeyJZZXMiLCAiSmEifSwKKyAgICAgICAgeyJObyIsICJOZWoifSwKKyAgICAgICAgeyJQb2xpY3kuRW50cnkiLCAiUG9saWN5ZmVsIn0sCisgICAgICAgIHsiU2F2ZS5DaGFuZ2VzIiwgIlNwYXJhIFx1MDBFNG5kcmluZ2FyIn0sCisgICAgICAgIHsiTm8uUG9saWN5LkVudHJ5LnNlbGVjdGVkIiwgIkluZ2VuIHBvbGljeXBvc3QgaGFyIHZhbHRzIn0sCisgICAgICAgIHsiVW5hYmxlLnRvLm9wZW4uS2V5U3RvcmUuZXgudG9TdHJpbmcuIiwKKyAgICAgICAgICAgICAgICAiS2FuIGludGUgXHUwMEY2cHBuYSBueWNrZWxsYWdyZXQ6IHswfSJ9LAorICAgICAgICB7Ik5vLnByaW5jaXBhbC5zZWxlY3RlZCIsICJJbmdlbiBpZGVudGl0ZXRzaGF2YXJlIGhhciB2YWx0cyJ9LAorICAgICAgICB7Ik5vLnBlcm1pc3Npb24uc2VsZWN0ZWQiLCAiSW5nZW4gYmVoXHUwMEY2cmlnaGV0IGhhciB2YWx0cyJ9LAorICAgICAgICB7Im5hbWUiLCAibmFtbiJ9LAorICAgICAgICB7ImNvbmZpZ3VyYXRpb24udHlwZSIsICJrb25maWd1cmF0aW9uc3R5cCJ9LAorICAgICAgICB7ImVudmlyb25tZW50LnZhcmlhYmxlLm5hbWUiLCAidmFyaWFiZWxuYW1uIGZcdTAwRjZyIG1pbGpcdTAwRjYifSwKKyAgICAgICAgeyJsaWJyYXJ5Lm5hbWUiLCAiYmlibGlvdGVrc25hbW4ifSwKKyAgICAgICAgeyJwYWNrYWdlLm5hbWUiLCAicGFrZXRuYW1uIn0sCisgICAgICAgIHsicG9saWN5LnR5cGUiLCAicG9saWN5dHlwIn0sCisgICAgICAgIHsicHJvcGVydHkubmFtZSIsICJlZ2Vuc2thcHNuYW1uIn0sCisgICAgICAgIHsicHJvdmlkZXIubmFtZSIsICJsZXZlcmFudFx1MDBGNnJzbmFtbiJ9LAorICAgICAgICB7IlByaW5jaXBhbC5MaXN0IiwgIkxpc3RhIFx1MDBGNnZlciBpZGVudGl0ZXRzaGF2YXJlIn0sCisgICAgICAgIHsiUGVybWlzc2lvbi5MaXN0IiwgIkJlaFx1MDBGNnJpZ2hldHNsaXN0YSJ9LAorICAgICAgICB7IkNvZGUuQmFzZSIsICJLb2RiYXMifSwKKyAgICAgICAgeyJLZXlTdG9yZS5VLlIuTC4iLCAiVVJMIGZcdTAwRjZyIG55Y2tlbGxhZ2VyOiJ9LAorICAgICAgICB7IktleVN0b3JlLlBhc3N3b3JkLlUuUi5MLiIsICJVUkwgZlx1MDBGNnIgbFx1MDBGNnNlbm9yZCB0aWxsIG55Y2tlbGxhZ2VyOiJ9CisgICAgfTsKKworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY29udGVudHMgb2YgdGhpcyA8Y29kZT5SZXNvdXJjZUJ1bmRsZTwvY29kZT4uCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGNvbnRlbnRzIG9mIHRoaXMgPGNvZGU+UmVzb3VyY2VCdW5kbGU8L2NvZGU+LgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPYmplY3RbXVtdIGdldENvbnRlbnRzKCkgeworICAgICAgICByZXR1cm4gY29udGVudHM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS90b29scy9wb2xpY3l0b29sL1Jlc291cmNlc196aF9DTi5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS90b29scy9wb2xpY3l0b29sL1Jlc291cmNlc196aF9DTi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjZjhlMTIKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3Rvb2xzL3BvbGljeXRvb2wvUmVzb3VyY2VzX3poX0NOLmphdmEKQEAgLTAsMCArMSwxNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIE9yYWNsZSBkZXNpZ25hdGVzIHRoaXMKKyAqIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyAqIGJ5IE9yYWNsZSBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQorICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQorICogcXVlc3Rpb25zLgorICovCisKK3BhY2thZ2Ugc3VuLnNlY3VyaXR5LnRvb2xzLnBvbGljeXRvb2w7CisKKy8qKgorICogPHA+IFRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgPGNvZGU+UmVzb3VyY2VCdW5kbGU8L2NvZGU+CisgKiBmb3IgdGhlIHBvbGljeXRvb2wuCisgKgorICovCitwdWJsaWMgY2xhc3MgUmVzb3VyY2VzX3poX0NOIGV4dGVuZHMgamF2YS51dGlsLkxpc3RSZXNvdXJjZUJ1bmRsZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXVtdIGNvbnRlbnRzID0geworICAgICAgICB7Ik5FV0xJTkUiLCAiXG4ifSwKKyAgICAgICAgeyJXYXJuaW5nLkEucHVibGljLmtleS5mb3IuYWxpYXMuc2lnbmVycy5pLmRvZXMubm90LmV4aXN0Lk1ha2Uuc3VyZS5hLktleVN0b3JlLmlzLnByb3Blcmx5LmNvbmZpZ3VyZWQuIiwKKyAgICAgICAgICAgICAgICAiXHU4QjY2XHU1NDRBOiBcdTUyMkJcdTU0MEQgezB9IFx1NzY4NFx1NTE2Q1x1NTE3MVx1NUJDNlx1OTRBNVx1NEUwRFx1NUI1OFx1NTcyOFx1MzAwMlx1OEJGN1x1Nzg2RVx1NEZERFx1NURGMlx1NkI2M1x1Nzg2RVx1OTE0RFx1N0Y2RSBLZXlTdG9yZVx1MzAwMiJ9LAorICAgICAgICB7Ildhcm5pbmcuQ2xhc3Mubm90LmZvdW5kLmNsYXNzIiwgIlx1OEI2Nlx1NTQ0QTogXHU2MjdFXHU0RTBEXHU1MjMwXHU3QzdCOiB7MH0ifSwKKyAgICAgICAgeyJXYXJuaW5nLkludmFsaWQuYXJndW1lbnQucy5mb3IuY29uc3RydWN0b3IuYXJnIiwKKyAgICAgICAgICAgICAgICAiXHU4QjY2XHU1NDRBOiBcdTY3ODRcdTkwMjBcdTU2NjhcdTc2ODRcdTUzQzJcdTY1NzBcdTY1RTBcdTY1NDg6IHswfSJ9LAorICAgICAgICB7IklsbGVnYWwuUHJpbmNpcGFsLlR5cGUudHlwZSIsICJcdTk3NUVcdTZDRDVcdTc2ODRcdTRFM0JcdTc1MjhcdTYyMzdcdTdDN0JcdTU3OEI6IHswfSJ9LAorICAgICAgICB7IklsbGVnYWwub3B0aW9uLm9wdGlvbiIsICJcdTk3NUVcdTZDRDVcdTkwMDlcdTk4Nzk6IHswfSJ9LAorICAgICAgICB7IlVzYWdlLnBvbGljeXRvb2wub3B0aW9ucy4iLCAiXHU3NTI4XHU2Q0Q1OiBwb2xpY3l0b29sIFtcdTkwMDlcdTk4NzldIn0sCisgICAgICAgIHsiLmZpbGUuZmlsZS5wb2xpY3kuZmlsZS5sb2NhdGlvbiIsCisgICAgICAgICAgICAgICAgIiAgWy1maWxlIDxmaWxlPl0gICAgXHU3QjU2XHU3NTY1XHU2NTg3XHU0RUY2XHU0RjREXHU3RjZFIn0sCisgICAgICAgIHsiTmV3IiwgIlx1NjVCMFx1NUVGQSJ9LAorICAgICAgICB7Ik9wZW4iLCAiXHU2MjUzXHU1RjAwIn0sCisgICAgICAgIHsiU2F2ZSIsICJcdTRGRERcdTVCNTgifSwKKyAgICAgICAgeyJTYXZlLkFzIiwgIlx1NTNFNlx1NUI1OFx1NEUzQSJ9LAorICAgICAgICB7IlZpZXcuV2FybmluZy5Mb2ciLCAiXHU2N0U1XHU3NzBCXHU4QjY2XHU1NDRBXHU2NUU1XHU1RkQ3In0sCisgICAgICAgIHsiRXhpdCIsICJcdTkwMDBcdTUxRkEifSwKKyAgICAgICAgeyJBZGQuUG9saWN5LkVudHJ5IiwgIlx1NkRGQlx1NTJBMFx1N0I1Nlx1NzU2NVx1Njc2MVx1NzZFRSJ9LAorICAgICAgICB7IkVkaXQuUG9saWN5LkVudHJ5IiwgIlx1N0YxNlx1OEY5MVx1N0I1Nlx1NzU2NVx1Njc2MVx1NzZFRSJ9LAorICAgICAgICB7IlJlbW92ZS5Qb2xpY3kuRW50cnkiLCAiXHU1MjIwXHU5NjY0XHU3QjU2XHU3NTY1XHU2NzYxXHU3NkVFIn0sCisgICAgICAgIHsiRWRpdCIsICJcdTdGMTZcdThGOTEifSwKKyAgICAgICAgeyJSZXRhaW4iLCAiXHU0RkREXHU3NTU5In0sCisKKyAgICAgICAgeyJXYXJuaW5nLkZpbGUubmFtZS5tYXkuaW5jbHVkZS5lc2NhcGVkLmJhY2tzbGFzaC5jaGFyYWN0ZXJzLkl0LmlzLm5vdC5uZWNlc3NhcnkudG8uZXNjYXBlLmJhY2tzbGFzaC5jaGFyYWN0ZXJzLnRoZS50b29sLmVzY2FwZXMiLAorICAgICAgICAgICAgIlx1OEI2Nlx1NTQ0QTogXHU2NTg3XHU0RUY2XHU1NDBEXHU1MzA1XHU1NDJCXHU4RjZDXHU0RTQ5XHU3Njg0XHU1M0NEXHU2NTlDXHU2NzYwXHU1QjU3XHU3QjI2XHUzMDAyXHU0RTBEXHU5NzAwXHU4OTgxXHU1QkY5XHU1M0NEXHU2NTlDXHU2NzYwXHU1QjU3XHU3QjI2XHU4RkRCXHU4ODRDXHU4RjZDXHU0RTQ5IChcdThCRTVcdTVERTVcdTUxNzdcdTU3MjhcdTVDMDZcdTdCNTZcdTc1NjVcdTUxODVcdTVCQjlcdTUxOTlcdTUxNjVcdTZDMzhcdTRFNDVcdTVCNThcdTUwQThcdTY1RjZcdTRGMUFcdTY4MzlcdTYzNkVcdTk3MDBcdTg5ODFcdTVCRjlcdTVCNTdcdTdCMjZcdThGREJcdTg4NENcdThGNkNcdTRFNDkpXHUzMDAyXG5cblx1NTM1NVx1NTFGQlx1MjAxQ1x1NEZERFx1NzU1OVx1MjAxRFx1NTNFRlx1NEZERFx1NzU1OVx1OEY5M1x1NTE2NVx1NzY4NFx1NTQwRFx1NzlGMCwgXHU2MjE2XHU4MDA1XHU1MzU1XHU1MUZCXHUyMDFDXHU3RjE2XHU4RjkxXHUyMDFEXHU1M0VGXHU3RjE2XHU4RjkxXHU4QkU1XHU1NDBEXHU3OUYwXHUzMDAyIn0sCisKKyAgICAgICAgeyJBZGQuUHVibGljLktleS5BbGlhcyIsICJcdTZERkJcdTUyQTBcdTUxNkNcdTUxNzFcdTVCQzZcdTk0QTVcdTUyMkJcdTU0MEQifSwKKyAgICAgICAgeyJSZW1vdmUuUHVibGljLktleS5BbGlhcyIsICJcdTUyMjBcdTk2NjRcdTUxNkNcdTUxNzFcdTVCQzZcdTk0QTVcdTUyMkJcdTU0MEQifSwKKyAgICAgICAgeyJGaWxlIiwgIlx1NjU4N1x1NEVGNiJ9LAorICAgICAgICB7IktleVN0b3JlIiwgIktleVN0b3JlIn0sCisgICAgICAgIHsiUG9saWN5LkZpbGUuIiwgIlx1N0I1Nlx1NzU2NVx1NjU4N1x1NEVGNjoifSwKKyAgICAgICAgeyJDb3VsZC5ub3Qub3Blbi5wb2xpY3kuZmlsZS5wb2xpY3lGaWxlLmUudG9TdHJpbmcuIiwKKyAgICAgICAgICAgICAgICAiXHU2NUUwXHU2Q0Q1XHU2MjUzXHU1RjAwXHU3QjU2XHU3NTY1XHU2NTg3XHU0RUY2OiB7MH06IHsxfSJ9LAorICAgICAgICB7IlBvbGljeS5Ub29sIiwgIlx1N0I1Nlx1NzU2NVx1NURFNVx1NTE3NyJ9LAorICAgICAgICB7IkVycm9ycy5oYXZlLm9jY3VycmVkLndoaWxlLm9wZW5pbmcudGhlLnBvbGljeS5jb25maWd1cmF0aW9uLlZpZXcudGhlLldhcm5pbmcuTG9nLmZvci5tb3JlLmluZm9ybWF0aW9uLiIsCisgICAgICAgICAgICAgICAgIlx1NjI1M1x1NUYwMFx1N0I1Nlx1NzU2NVx1OTE0RFx1N0Y2RVx1NjVGNlx1NTFGQVx1OTUxOVx1MzAwMlx1NjcwOVx1NTE3M1x1OEJFNlx1N0VDNlx1NEZFMVx1NjA2RiwgXHU4QkY3XHU2N0U1XHU3NzBCXHU4QjY2XHU1NDRBXHU2NUU1XHU1RkQ3XHUzMDAyIn0sCisgICAgICAgIHsiRXJyb3IiLCAiXHU5NTE5XHU4QkVGIn0sCisgICAgICAgIHsiT0siLCAiXHU3ODZFXHU1QjlBIn0sCisgICAgICAgIHsiU3RhdHVzIiwgIlx1NzJCNlx1NjAwMSJ9LAorICAgICAgICB7Ildhcm5pbmciLCAiXHU4QjY2XHU1NDRBIn0sCisgICAgICAgIHsiUGVybWlzc2lvbi4iLAorICAgICAgICAgICAgICAgICJcdTY3NDNcdTk2NTA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9LAorICAgICAgICB7IlByaW5jaXBhbC5UeXBlLiIsICJcdTRFM0JcdTc1MjhcdTYyMzdcdTdDN0JcdTU3OEI6In0sCisgICAgICAgIHsiUHJpbmNpcGFsLk5hbWUuIiwgIlx1NEUzQlx1NzUyOFx1NjIzN1x1NTQwRFx1NzlGMDoifSwKKyAgICAgICAgeyJUYXJnZXQuTmFtZS4iLAorICAgICAgICAgICAgICAgICJcdTc2RUVcdTY4MDdcdTU0MERcdTc5RjA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9LAorICAgICAgICB7IkFjdGlvbnMuIiwKKyAgICAgICAgICAgICAgICAiXHU2NENEXHU0RjVDOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifSwKKyAgICAgICAgeyJPSy50by5vdmVyd3JpdGUuZXhpc3RpbmcuZmlsZS5maWxlbmFtZS4iLAorICAgICAgICAgICAgICAgICJcdTc4NkVcdThCQTRcdTg5ODZcdTc2RDZcdTczQjBcdTY3MDlcdTc2ODRcdTY1ODdcdTRFRjZ7MH0/In0sCisgICAgICAgIHsiQ2FuY2VsIiwgIlx1NTNENlx1NkQ4OCJ9LAorICAgICAgICB7IkNvZGVCYXNlLiIsICJDb2RlQmFzZToifSwKKyAgICAgICAgeyJTaWduZWRCeS4iLCAiU2lnbmVkQnk6In0sCisgICAgICAgIHsiQWRkLlByaW5jaXBhbCIsICJcdTZERkJcdTUyQTBcdTRFM0JcdTc1MjhcdTYyMzcifSwKKyAgICAgICAgeyJFZGl0LlByaW5jaXBhbCIsICJcdTdGMTZcdThGOTFcdTRFM0JcdTc1MjhcdTYyMzcifSwKKyAgICAgICAgeyJSZW1vdmUuUHJpbmNpcGFsIiwgIlx1NTIyMFx1OTY2NFx1NEUzQlx1NzUyOFx1NjIzNyJ9LAorICAgICAgICB7IlByaW5jaXBhbHMuIiwgIlx1NEUzQlx1NzUyOFx1NjIzNzoifSwKKyAgICAgICAgeyIuQWRkLlBlcm1pc3Npb24iLCAiICBcdTZERkJcdTUyQTBcdTY3NDNcdTk2NTAifSwKKyAgICAgICAgeyIuRWRpdC5QZXJtaXNzaW9uIiwgIiAgXHU3RjE2XHU4RjkxXHU2NzQzXHU5NjUwIn0sCisgICAgICAgIHsiUmVtb3ZlLlBlcm1pc3Npb24iLCAiXHU1MjIwXHU5NjY0XHU2NzQzXHU5NjUwIn0sCisgICAgICAgIHsiRG9uZSIsICJcdTVCOENcdTYyMTAifSwKKyAgICAgICAgeyJLZXlTdG9yZS5VUkwuIiwgIktleVN0b3JlIFVSTDoifSwKKyAgICAgICAgeyJLZXlTdG9yZS5UeXBlLiIsICJLZXlTdG9yZSBcdTdDN0JcdTU3OEI6In0sCisgICAgICAgIHsiS2V5U3RvcmUuUHJvdmlkZXIuIiwgIktleVN0b3JlIFx1NjNEMFx1NEY5Qlx1NjVCOToifSwKKyAgICAgICAgeyJLZXlTdG9yZS5QYXNzd29yZC5VUkwuIiwgIktleVN0b3JlIFx1NTNFM1x1NEVFNCBVUkw6In0sCisgICAgICAgIHsiUHJpbmNpcGFscyIsICJcdTRFM0JcdTc1MjhcdTYyMzcifSwKKyAgICAgICAgeyIuRWRpdC5QcmluY2lwYWwuIiwgIiAgXHU3RjE2XHU4RjkxXHU0RTNCXHU3NTI4XHU2MjM3OiJ9LAorICAgICAgICB7Ii5BZGQuTmV3LlByaW5jaXBhbC4iLCAiICBcdTZERkJcdTUyQTBcdTY1QjBcdTRFM0JcdTc1MjhcdTYyMzc6In0sCisgICAgICAgIHsiUGVybWlzc2lvbnMiLCAiXHU2NzQzXHU5NjUwIn0sCisgICAgICAgIHsiLkVkaXQuUGVybWlzc2lvbi4iLCAiICBcdTdGMTZcdThGOTFcdTY3NDNcdTk2NTA6In0sCisgICAgICAgIHsiLkFkZC5OZXcuUGVybWlzc2lvbi4iLCAiICBcdTUyQTBcdTUxNjVcdTY1QjBcdTc2ODRcdTY3NDNcdTk2NTA6In0sCisgICAgICAgIHsiU2lnbmVkLkJ5LiIsICJcdTdCN0VcdTdGNzJcdTRFQkE6ICJ9LAorICAgICAgICB7IkNhbm5vdC5TcGVjaWZ5LlByaW5jaXBhbC53aXRoLmEuV2lsZGNhcmQuQ2xhc3Mud2l0aG91dC5hLldpbGRjYXJkLk5hbWUiLAorICAgICAgICAgICAgIlx1NkNBMVx1NjcwOVx1OTAxQVx1OTE0RFx1N0IyNlx1NTQwRFx1NzlGMCwgXHU2NUUwXHU2Q0Q1XHU0RjdGXHU3NTI4XHU5MDFBXHU5MTREXHU3QjI2XHU3QzdCXHU2MzA3XHU1QjlBXHU0RTNCXHU3NTI4XHU2MjM3In0sCisgICAgICAgIHsiQ2Fubm90LlNwZWNpZnkuUHJpbmNpcGFsLndpdGhvdXQuYS5OYW1lIiwKKyAgICAgICAgICAgICJcdTZDQTFcdTY3MDlcdTU0MERcdTc5RjAsIFx1NjVFMFx1NkNENVx1NjMwN1x1NUI5QVx1NEUzQlx1NzUyOFx1NjIzNyJ9LAorICAgICAgICB7IlBlcm1pc3Npb24uYW5kLlRhcmdldC5OYW1lLm11c3QuaGF2ZS5hLnZhbHVlIiwKKyAgICAgICAgICAgICAgICAiXHU2NzQzXHU5NjUwXHU1M0NBXHU3NkVFXHU2ODA3XHU1NDBEXHU1RkM1XHU5ODdCXHU2NzA5XHU0RTAwXHU0RTJBXHU1MDNDIn0sCisgICAgICAgIHsiUmVtb3ZlLnRoaXMuUG9saWN5LkVudHJ5LiIsICJcdTY2MkZcdTU0MjZcdTUyMjBcdTk2NjRcdTZCNjRcdTdCNTZcdTc1NjVcdTY3NjFcdTc2RUU/In0sCisgICAgICAgIHsiT3ZlcndyaXRlLkZpbGUiLCAiXHU4OTg2XHU3NkQ2XHU2NTg3XHU0RUY2In0sCisgICAgICAgIHsiUG9saWN5LnN1Y2Nlc3NmdWxseS53cml0dGVuLnRvLmZpbGVuYW1lIiwKKyAgICAgICAgICAgICAgICAiXHU3QjU2XHU3NTY1XHU1REYyXHU2MjEwXHU1MjlGXHU1MTk5XHU1MTY1XHU1MjMwezB9In0sCisgICAgICAgIHsibnVsbC5maWxlbmFtZSIsICJcdTdBN0FcdTY1ODdcdTRFRjZcdTU0MEQifSwKKyAgICAgICAgeyJTYXZlLmNoYW5nZXMuIiwgIlx1NjYyRlx1NTQyNlx1NEZERFx1NUI1OFx1NjI0MFx1NTA1QVx1NzY4NFx1NjZGNFx1NjUzOT8ifSwKKyAgICAgICAgeyJZZXMiLCAiXHU2NjJGIn0sCisgICAgICAgIHsiTm8iLCAiXHU1NDI2In0sCisgICAgICAgIHsiUG9saWN5LkVudHJ5IiwgIlx1N0I1Nlx1NzU2NVx1Njc2MVx1NzZFRSJ9LAorICAgICAgICB7IlNhdmUuQ2hhbmdlcyIsICJcdTRGRERcdTVCNThcdTY2RjRcdTY1MzkifSwKKyAgICAgICAgeyJOby5Qb2xpY3kuRW50cnkuc2VsZWN0ZWQiLCAiXHU2Q0ExXHU2NzA5XHU5MDA5XHU2MkU5XHU3QjU2XHU3NTY1XHU2NzYxXHU3NkVFIn0sCisgICAgICAgIHsiVW5hYmxlLnRvLm9wZW4uS2V5U3RvcmUuZXgudG9TdHJpbmcuIiwKKyAgICAgICAgICAgICAgICAiXHU2NUUwXHU2Q0Q1XHU2MjUzXHU1RjAwIEtleVN0b3JlOiB7MH0ifSwKKyAgICAgICAgeyJOby5wcmluY2lwYWwuc2VsZWN0ZWQiLCAiXHU2NzJBXHU5MDA5XHU2MkU5XHU0RTNCXHU3NTI4XHU2MjM3In0sCisgICAgICAgIHsiTm8ucGVybWlzc2lvbi5zZWxlY3RlZCIsICJcdTZDQTFcdTY3MDlcdTkwMDlcdTYyRTlcdTY3NDNcdTk2NTAifSwKKyAgICAgICAgeyJuYW1lIiwgIlx1NTQwRFx1NzlGMCJ9LAorICAgICAgICB7ImNvbmZpZ3VyYXRpb24udHlwZSIsICJcdTkxNERcdTdGNkVcdTdDN0JcdTU3OEIifSwKKyAgICAgICAgeyJlbnZpcm9ubWVudC52YXJpYWJsZS5uYW1lIiwgIlx1NzNBRlx1NTg4M1x1NTNEOFx1OTFDRlx1NTQwRCJ9LAorICAgICAgICB7ImxpYnJhcnkubmFtZSIsICJcdTVFOTNcdTU0MERcdTc5RjAifSwKKyAgICAgICAgeyJwYWNrYWdlLm5hbWUiLCAiXHU3QTBCXHU1RThGXHU1MzA1XHU1NDBEXHU3OUYwIn0sCisgICAgICAgIHsicG9saWN5LnR5cGUiLCAiXHU3QjU2XHU3NTY1XHU3QzdCXHU1NzhCIn0sCisgICAgICAgIHsicHJvcGVydHkubmFtZSIsICJcdTVDNUVcdTYwMjdcdTU0MERcdTc5RjAifSwKKyAgICAgICAgeyJwcm92aWRlci5uYW1lIiwgIlx1NjNEMFx1NEY5Qlx1NjVCOVx1NTQwRFx1NzlGMCJ9LAorICAgICAgICB7IlByaW5jaXBhbC5MaXN0IiwgIlx1NEUzQlx1NzUyOFx1NjIzN1x1NTIxN1x1ODg2OCJ9LAorICAgICAgICB7IlBlcm1pc3Npb24uTGlzdCIsICJcdTY3NDNcdTk2NTBcdTUyMTdcdTg4NjgifSwKKyAgICAgICAgeyJDb2RlLkJhc2UiLCAiXHU0RUUzXHU3ODAxXHU1RTkzIn0sCisgICAgICAgIHsiS2V5U3RvcmUuVS5SLkwuIiwgIktleVN0b3JlIFVSTDoifSwKKyAgICAgICAgeyJLZXlTdG9yZS5QYXNzd29yZC5VLlIuTC4iLCAiS2V5U3RvcmUgXHU1M0UzXHU0RUU0IFVSTDoifQorICAgIH07CisKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGNvbnRlbnRzIG9mIHRoaXMgPGNvZGU+UmVzb3VyY2VCdW5kbGU8L2NvZGU+LgorICAgICAqCisgICAgICogPHA+CisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBjb250ZW50cyBvZiB0aGlzIDxjb2RlPlJlc291cmNlQnVuZGxlPC9jb2RlPi4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0W11bXSBnZXRDb250ZW50cygpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRlbnRzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdG9vbHMvcG9saWN5dG9vbC9SZXNvdXJjZXNfemhfSEsuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdG9vbHMvcG9saWN5dG9vbC9SZXNvdXJjZXNfemhfSEsuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjc0NDFhCi0tLSAvZGV2L251bGwKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS90b29scy9wb2xpY3l0b29sL1Jlc291cmNlc196aF9ISy5qYXZhCkBAIC0wLDAgKzEsMTU2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBPcmFjbGUgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKKyAqIHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIHN1bi5zZWN1cml0eS50b29scy5wb2xpY3l0b29sOworCisvKioKKyAqIDxwPiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIDxjb2RlPlJlc291cmNlQnVuZGxlPC9jb2RlPgorICogZm9yIHRoZSBwb2xpY3l0b29sLgorICoKKyAqLworcHVibGljIGNsYXNzIFJlc291cmNlc196aF9ISyBleHRlbmRzIGphdmEudXRpbC5MaXN0UmVzb3VyY2VCdW5kbGUgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W11bXSBjb250ZW50cyA9IHsKKyAgICAgICAgeyJORVdMSU5FIiwgIlxuIn0sCisgICAgICAgIHsiV2FybmluZy5BLnB1YmxpYy5rZXkuZm9yLmFsaWFzLnNpZ25lcnMuaS5kb2VzLm5vdC5leGlzdC5NYWtlLnN1cmUuYS5LZXlTdG9yZS5pcy5wcm9wZXJseS5jb25maWd1cmVkLiIsCisgICAgICAgICAgICAgICAgIlx1OEI2Nlx1NTQ0QTogXHU1MjI1XHU1NDBEIHswfSBcdTc2ODRcdTUxNkNcdTk1OEJcdTkxRDFcdTk0NzBcdTRFMERcdTVCNThcdTU3MjhcdTMwMDJcdThBQ0JcdTc4QkFcdTVCOUFcdTkxRDFcdTk0NzBcdTUxMzJcdTVCNThcdTVFQUJcdTkxNERcdTdGNkVcdTZCNjNcdTc4QkFcdTMwMDIifSwKKyAgICAgICAgeyJXYXJuaW5nLkNsYXNzLm5vdC5mb3VuZC5jbGFzcyIsICJcdThCNjZcdTU0NEE6IFx1NjI3RVx1NEUwRFx1NTIzMFx1OTg1RVx1NTIyNSB7MH0ifSwKKyAgICAgICAgeyJXYXJuaW5nLkludmFsaWQuYXJndW1lbnQucy5mb3IuY29uc3RydWN0b3IuYXJnIiwKKyAgICAgICAgICAgICAgICAiXHU4QjY2XHU1NDRBOiBcdTcxMjFcdTY1NDhcdTc2ODRcdTVFRkFcdTY5Q0JcdTVCNTBcdTVGMTVcdTY1Nzg6IHswfSJ9LAorICAgICAgICB7IklsbGVnYWwuUHJpbmNpcGFsLlR5cGUudHlwZSIsICJcdTcxMjFcdTY1NDhcdTc2ODQgUHJpbmNpcGFsIFx1OTg1RVx1NTc4QjogezB9In0sCisgICAgICAgIHsiSWxsZWdhbC5vcHRpb24ub3B0aW9uIiwgIlx1NzEyMVx1NjU0OFx1NzY4NFx1OTA3OFx1OTgwNTogezB9In0sCisgICAgICAgIHsiVXNhZ2UucG9saWN5dG9vbC5vcHRpb25zLiIsICJcdTc1MjhcdTZDRDU6IHBvbGljeXRvb2wgW29wdGlvbnNdIn0sCisgICAgICAgIHsiLmZpbGUuZmlsZS5wb2xpY3kuZmlsZS5sb2NhdGlvbiIsCisgICAgICAgICAgICAgICAgIiAgWy1maWxlIDxmaWxlPl0gICAgXHU1MzlGXHU1MjQ3XHU2QTk0XHU2ODQ4XHU0RjREXHU3RjZFIn0sCisgICAgICAgIHsiTmV3IiwgIlx1NjVCMFx1NTg5RSJ9LAorICAgICAgICB7Ik9wZW4iLCAiXHU5NThCXHU1NTVGIn0sCisgICAgICAgIHsiU2F2ZSIsICJcdTUxMzJcdTVCNTgifSwKKyAgICAgICAgeyJTYXZlLkFzIiwgIlx1NTNFNlx1NUI1OFx1NjVCMFx1NkE5NCJ9LAorICAgICAgICB7IlZpZXcuV2FybmluZy5Mb2ciLCAiXHU2QUEyXHU4OTk2XHU4QjY2XHU1NDRBXHU4QTE4XHU5MzA0In0sCisgICAgICAgIHsiRXhpdCIsICJcdTdENTBcdTY3NUYifSwKKyAgICAgICAgeyJBZGQuUG9saWN5LkVudHJ5IiwgIlx1NjVCMFx1NTg5RVx1NTM5Rlx1NTI0N1x1OTgwNVx1NzZFRSJ9LAorICAgICAgICB7IkVkaXQuUG9saWN5LkVudHJ5IiwgIlx1N0RFOFx1OEYyRlx1NTM5Rlx1NTI0N1x1OTgwNVx1NzZFRSJ9LAorICAgICAgICB7IlJlbW92ZS5Qb2xpY3kuRW50cnkiLCAiXHU3OUZCXHU5NjY0XHU1MzlGXHU1MjQ3XHU5ODA1XHU3NkVFIn0sCisgICAgICAgIHsiRWRpdCIsICJcdTdERThcdThGMkYifSwKKyAgICAgICAgeyJSZXRhaW4iLCAiXHU0RkREXHU3NTU5In0sCisKKyAgICAgICAgeyJXYXJuaW5nLkZpbGUubmFtZS5tYXkuaW5jbHVkZS5lc2NhcGVkLmJhY2tzbGFzaC5jaGFyYWN0ZXJzLkl0LmlzLm5vdC5uZWNlc3NhcnkudG8uZXNjYXBlLmJhY2tzbGFzaC5jaGFyYWN0ZXJzLnRoZS50b29sLmVzY2FwZXMiLAorICAgICAgICAgICAgIlx1OEI2Nlx1NTQ0QTogXHU2QTk0XHU2ODQ4XHU1NDBEXHU3QTMxXHU1MzA1XHU1NDJCXHU5MDQxXHU5NkUyXHU1M0NEXHU2NTlDXHU3RERBXHU1QjU3XHU1MTQzXHUzMDAyXHU0RTBEXHU5NzAwXHU4OTgxXHU5MDQxXHU5NkUyXHU1M0NEXHU2NTlDXHU3RERBXHU1QjU3XHU1MTQzIChcdTY0QjBcdTVCRUJcdTUzOUZcdTUyNDdcdTUxNjdcdTVCQjlcdTgxRjNcdTZDMzhcdTRFNDVcdTVCNThcdTY1M0VcdTUzNDBcdTY2NDJcdTk3MDBcdTg5ODFcdTVERTVcdTUxNzdcdTkwNDFcdTk2RTJcdTVCNTdcdTUxNDMpXHUzMDAyXG5cblx1NjMwOVx1NEUwMFx1NEUwQlx1MzAwQ1x1NEZERFx1NzU1OVx1MzAwRFx1NEVFNVx1NEZERFx1NzU1OVx1OEYzOFx1NTE2NVx1NzY4NFx1NTQwRFx1N0EzMVx1RkYwQ1x1NjIxNlx1NjMwOVx1NEUwMFx1NEUwQlx1MzAwQ1x1N0RFOFx1OEYyRlx1MzAwRFx1NEVFNVx1N0RFOFx1OEYyRlx1NTQwRFx1N0EzMVx1MzAwMiJ9LAorCisgICAgICAgIHsiQWRkLlB1YmxpYy5LZXkuQWxpYXMiLCAiXHU2NUIwXHU1ODlFXHU1MTZDXHU5NThCXHU5MUQxXHU5NDcwXHU1MjI1XHU1NDBEIn0sCisgICAgICAgIHsiUmVtb3ZlLlB1YmxpYy5LZXkuQWxpYXMiLCAiXHU3OUZCXHU5NjY0XHU1MTZDXHU5NThCXHU5MUQxXHU5NDcwXHU1MjI1XHU1NDBEIn0sCisgICAgICAgIHsiRmlsZSIsICJcdTZBOTRcdTY4NDgifSwKKyAgICAgICAgeyJLZXlTdG9yZSIsICJcdTkxRDFcdTk0NzBcdTUxMzJcdTVCNThcdTVFQUIifSwKKyAgICAgICAgeyJQb2xpY3kuRmlsZS4iLCAiXHU1MzlGXHU1MjQ3XHU2QTk0XHU2ODQ4OiAifSwKKyAgICAgICAgeyJDb3VsZC5ub3Qub3Blbi5wb2xpY3kuZmlsZS5wb2xpY3lGaWxlLmUudG9TdHJpbmcuIiwKKyAgICAgICAgICAgICAgICAiXHU3MTIxXHU2Q0Q1XHU5NThCXHU1NTVGXHU1MzlGXHU1MjQ3XHU2QTk0XHU2ODQ4OiB7MH06IHsxfSJ9LAorICAgICAgICB7IlBvbGljeS5Ub29sIiwgIlx1NTM5Rlx1NTI0N1x1NURFNVx1NTE3NyJ9LAorICAgICAgICB7IkVycm9ycy5oYXZlLm9jY3VycmVkLndoaWxlLm9wZW5pbmcudGhlLnBvbGljeS5jb25maWd1cmF0aW9uLlZpZXcudGhlLldhcm5pbmcuTG9nLmZvci5tb3JlLmluZm9ybWF0aW9uLiIsCisgICAgICAgICAgICAgICAgIlx1OTU4Qlx1NTU1Rlx1NTM5Rlx1NTI0N1x1OEExOFx1N0Y2RVx1NjY0Mlx1NzY3Q1x1NzUxRlx1OTMyRlx1OEFBNFx1MzAwMlx1OEFDQlx1NkFBMlx1ODk5Nlx1OEI2Nlx1NTQ0QVx1OEExOFx1OTMwNFx1NEVFNVx1NTNENlx1NUY5N1x1NjZGNFx1NTkxQVx1NzY4NFx1OENDN1x1OEEwQSJ9LAorICAgICAgICB7IkVycm9yIiwgIlx1OTMyRlx1OEFBNCJ9LAorICAgICAgICB7Ik9LIiwgIlx1NzhCQVx1NUI5QSJ9LAorICAgICAgICB7IlN0YXR1cyIsICJcdTcyQzBcdTYxNEIifSwKKyAgICAgICAgeyJXYXJuaW5nIiwgIlx1OEI2Nlx1NTQ0QSJ9LAorICAgICAgICB7IlBlcm1pc3Npb24uIiwKKyAgICAgICAgICAgICAgICAiXHU2QjBBXHU5NjUwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifSwKKyAgICAgICAgeyJQcmluY2lwYWwuVHlwZS4iLCAiUHJpbmNpcGFsIFx1OTg1RVx1NTc4QjogIn0sCisgICAgICAgIHsiUHJpbmNpcGFsLk5hbWUuIiwgIlByaW5jaXBhbCBcdTU0MERcdTdBMzE6ICJ9LAorICAgICAgICB7IlRhcmdldC5OYW1lLiIsCisgICAgICAgICAgICAgICAgIlx1NzZFRVx1NkExOVx1NTQwRFx1N0EzMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIn0sCisgICAgICAgIHsiQWN0aW9ucy4iLAorICAgICAgICAgICAgICAgICJcdTUyRDVcdTRGNUM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9LAorICAgICAgICB7Ik9LLnRvLm92ZXJ3cml0ZS5leGlzdGluZy5maWxlLmZpbGVuYW1lLiIsCisgICAgICAgICAgICAgICAgIlx1NzhCQVx1OEE4RFx1ODk4Nlx1NUJFQlx1NzNGRVx1NUI1OFx1NzY4NFx1NkE5NFx1Njg0OCB7MH1cdUZGMUYifSwKKyAgICAgICAgeyJDYW5jZWwiLCAiXHU1M0Q2XHU2RDg4In0sCisgICAgICAgIHsiQ29kZUJhc2UuIiwgIkNvZGVCYXNlOiJ9LAorICAgICAgICB7IlNpZ25lZEJ5LiIsICJTaWduZWRCeToifSwKKyAgICAgICAgeyJBZGQuUHJpbmNpcGFsIiwgIlx1NjVCMFx1NTg5RSBQcmluY2lwYWwifSwKKyAgICAgICAgeyJFZGl0LlByaW5jaXBhbCIsICJcdTdERThcdThGMkYgUHJpbmNpcGFsIn0sCisgICAgICAgIHsiUmVtb3ZlLlByaW5jaXBhbCIsICJcdTc5RkJcdTk2NjQgUHJpbmNpcGFsIn0sCisgICAgICAgIHsiUHJpbmNpcGFscy4iLCAiUHJpbmNpcGFsOiJ9LAorICAgICAgICB7Ii5BZGQuUGVybWlzc2lvbiIsICIgIFx1NjVCMFx1NTg5RVx1NkIwQVx1OTY1MCJ9LAorICAgICAgICB7Ii5FZGl0LlBlcm1pc3Npb24iLCAiICBcdTdERThcdThGMkZcdTZCMEFcdTk2NTAifSwKKyAgICAgICAgeyJSZW1vdmUuUGVybWlzc2lvbiIsICJcdTc5RkJcdTk2NjRcdTZCMEFcdTk2NTAifSwKKyAgICAgICAgeyJEb25lIiwgIlx1NUI4Q1x1NjIxMCJ9LAorICAgICAgICB7IktleVN0b3JlLlVSTC4iLCAiXHU5MUQxXHU5NDcwXHU1MTMyXHU1QjU4XHU1RUFCIFVSTDogIn0sCisgICAgICAgIHsiS2V5U3RvcmUuVHlwZS4iLCAiXHU5MUQxXHU5NDcwXHU1MTMyXHU1QjU4XHU1RUFCXHU5ODVFXHU1NzhCOiJ9LAorICAgICAgICB7IktleVN0b3JlLlByb3ZpZGVyLiIsICJcdTkxRDFcdTk0NzBcdTUxMzJcdTVCNThcdTVFQUJcdTYzRDBcdTRGOUJcdTgwMDU6In0sCisgICAgICAgIHsiS2V5U3RvcmUuUGFzc3dvcmQuVVJMLiIsICJcdTkxRDFcdTk0NzBcdTUxMzJcdTVCNThcdTVFQUJcdTVCQzZcdTc4QkMgVVJMOiAifSwKKyAgICAgICAgeyJQcmluY2lwYWxzIiwgIlByaW5jaXBhbCJ9LAorICAgICAgICB7Ii5FZGl0LlByaW5jaXBhbC4iLCAiICBcdTdERThcdThGMkYgUHJpbmNpcGFsOiAifSwKKyAgICAgICAgeyIuQWRkLk5ldy5QcmluY2lwYWwuIiwgIiAgXHU2NUIwXHU1ODlFIFByaW5jaXBhbDogIn0sCisgICAgICAgIHsiUGVybWlzc2lvbnMiLCAiXHU2QjBBXHU5NjUwIn0sCisgICAgICAgIHsiLkVkaXQuUGVybWlzc2lvbi4iLCAiICBcdTdERThcdThGMkZcdTZCMEFcdTk2NTA6In0sCisgICAgICAgIHsiLkFkZC5OZXcuUGVybWlzc2lvbi4iLCAiICBcdTY1QjBcdTU4OUVcdTZCMEFcdTk2NTA6In0sCisgICAgICAgIHsiU2lnbmVkLkJ5LiIsICJcdTdDM0RcdTdGNzJcdTRFQkE6ICJ9LAorICAgICAgICB7IkNhbm5vdC5TcGVjaWZ5LlByaW5jaXBhbC53aXRoLmEuV2lsZGNhcmQuQ2xhc3Mud2l0aG91dC5hLldpbGRjYXJkLk5hbWUiLAorICAgICAgICAgICAgIlx1NkM5Mlx1NjcwOVx1ODQyQ1x1NzUyOFx1NUI1N1x1NTE0M1x1NTQwRFx1N0EzMVx1RkYwQ1x1NzEyMVx1NkNENVx1NjMwN1x1NUI5QVx1NTQyQlx1NjcwOVx1ODQyQ1x1NzUyOFx1NUI1N1x1NTE0M1x1OTg1RVx1NTIyNVx1NzY4NCBQcmluY2lwYWwifSwKKyAgICAgICAgeyJDYW5ub3QuU3BlY2lmeS5QcmluY2lwYWwud2l0aG91dC5hLk5hbWUiLAorICAgICAgICAgICAgIlx1NkM5Mlx1NjcwOVx1NTQwRFx1N0EzMVx1RkYwQ1x1NzEyMVx1NkNENVx1NjMwN1x1NUI5QSBQcmluY2lwYWwifSwKKyAgICAgICAgeyJQZXJtaXNzaW9uLmFuZC5UYXJnZXQuTmFtZS5tdXN0LmhhdmUuYS52YWx1ZSIsCisgICAgICAgICAgICAgICAgIlx1NkIwQVx1OTY1MFx1NTNDQVx1NzZFRVx1NkExOVx1NTQwRFx1N0EzMVx1NUZDNVx1OTgwOFx1NjcwOVx1NEUwMFx1NTAwQlx1NTAzQ1x1MzAwMiJ9LAorICAgICAgICB7IlJlbW92ZS50aGlzLlBvbGljeS5FbnRyeS4iLCAiXHU3OUZCXHU5NjY0XHU5MDE5XHU1MDBCXHU1MzlGXHU1MjQ3XHU5ODA1XHU3NkVFXHVGRjFGIn0sCisgICAgICAgIHsiT3ZlcndyaXRlLkZpbGUiLCAiXHU4OTg2XHU1QkVCXHU2QTk0XHU2ODQ4In0sCisgICAgICAgIHsiUG9saWN5LnN1Y2Nlc3NmdWxseS53cml0dGVuLnRvLmZpbGVuYW1lIiwKKyAgICAgICAgICAgICAgICAiXHU1MzlGXHU1MjQ3XHU2MjEwXHU1MjlGXHU1QkVCXHU1MTY1XHU4MUYzIHswfSJ9LAorICAgICAgICB7Im51bGwuZmlsZW5hbWUiLCAiXHU3QTdBXHU1MDNDXHU2QTk0XHU1NDBEIn0sCisgICAgICAgIHsiU2F2ZS5jaGFuZ2VzLiIsICJcdTUxMzJcdTVCNThcdThCOEFcdTY2RjRcdUZGMUYifSwKKyAgICAgICAgeyJZZXMiLCAiXHU2NjJGIn0sCisgICAgICAgIHsiTm8iLCAiXHU1NDI2In0sCisgICAgICAgIHsiUG9saWN5LkVudHJ5IiwgIlx1NTM5Rlx1NTI0N1x1OTgwNVx1NzZFRSJ9LAorICAgICAgICB7IlNhdmUuQ2hhbmdlcyIsICJcdTUxMzJcdTVCNThcdThCOEFcdTY2RjQifSwKKyAgICAgICAgeyJOby5Qb2xpY3kuRW50cnkuc2VsZWN0ZWQiLCAiXHU2QzkyXHU2NzA5XHU5MDc4XHU1M0Q2XHU1MzlGXHU1MjQ3XHU5ODA1XHU3NkVFIn0sCisgICAgICAgIHsiVW5hYmxlLnRvLm9wZW4uS2V5U3RvcmUuZXgudG9TdHJpbmcuIiwKKyAgICAgICAgICAgICAgICAiXHU3MTIxXHU2Q0Q1XHU5NThCXHU1NTVGXHU5MUQxXHU5NDcwXHU1MTMyXHU1QjU4XHU1RUFCOiB7MH0ifSwKKyAgICAgICAgeyJOby5wcmluY2lwYWwuc2VsZWN0ZWQiLCAiXHU2NzJBXHU5MDc4XHU1M0Q2IFByaW5jaXBhbCJ9LAorICAgICAgICB7Ik5vLnBlcm1pc3Npb24uc2VsZWN0ZWQiLCAiXHU2QzkyXHU2NzA5XHU5MDc4XHU1M0Q2XHU2QjBBXHU5NjUwIn0sCisgICAgICAgIHsibmFtZSIsICJcdTU0MERcdTdBMzEifSwKKyAgICAgICAgeyJjb25maWd1cmF0aW9uLnR5cGUiLCAiXHU3RDQ0XHU2MTRCXHU5ODVFXHU1NzhCIn0sCisgICAgICAgIHsiZW52aXJvbm1lbnQudmFyaWFibGUubmFtZSIsICJcdTc0QjBcdTU4ODNcdThCOEFcdTY1NzhcdTU0MERcdTdBMzEifSwKKyAgICAgICAgeyJsaWJyYXJ5Lm5hbWUiLCAiXHU3QTBCXHU1RjBGXHU1RUFCXHU1NDBEXHU3QTMxIn0sCisgICAgICAgIHsicGFja2FnZS5uYW1lIiwgIlx1NTk1N1x1ODhERFx1N0EwQlx1NUYwRlx1NTQwRFx1N0EzMSJ9LAorICAgICAgICB7InBvbGljeS50eXBlIiwgIlx1NTM5Rlx1NTI0N1x1OTg1RVx1NTc4QiJ9LAorICAgICAgICB7InByb3BlcnR5Lm5hbWUiLCAiXHU1QzZDXHU2MDI3XHU1NDBEXHU3QTMxIn0sCisgICAgICAgIHsicHJvdmlkZXIubmFtZSIsICJcdTYzRDBcdTRGOUJcdTgwMDVcdTU0MERcdTdBMzEifSwKKyAgICAgICAgeyJQcmluY2lwYWwuTGlzdCIsICJQcmluY2lwYWwgXHU2RTA1XHU1NUFFIn0sCisgICAgICAgIHsiUGVybWlzc2lvbi5MaXN0IiwgIlx1NkIwQVx1OTY1MFx1NkUwNVx1NTVBRSJ9LAorICAgICAgICB7IkNvZGUuQmFzZSIsICJcdTRFRTNcdTc4QkNcdTU3RkFcdTZFOTYifSwKKyAgICAgICAgeyJLZXlTdG9yZS5VLlIuTC4iLCAiXHU5MUQxXHU5NDcwXHU1MTMyXHU1QjU4XHU1RUFCIFVSTDoifSwKKyAgICAgICAgeyJLZXlTdG9yZS5QYXNzd29yZC5VLlIuTC4iLCAiXHU5MUQxXHU5NDcwXHU1MTMyXHU1QjU4XHU1RUFCXHU1QkM2XHU3OEJDIFVSTDoifQorICAgIH07CisKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGNvbnRlbnRzIG9mIHRoaXMgPGNvZGU+UmVzb3VyY2VCdW5kbGU8L2NvZGU+LgorICAgICAqCisgICAgICogPHA+CisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBjb250ZW50cyBvZiB0aGlzIDxjb2RlPlJlc291cmNlQnVuZGxlPC9jb2RlPi4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0W11bXSBnZXRDb250ZW50cygpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRlbnRzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdG9vbHMvcG9saWN5dG9vbC9SZXNvdXJjZXNfemhfVFcuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdG9vbHMvcG9saWN5dG9vbC9SZXNvdXJjZXNfemhfVFcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzI0MWE2Ci0tLSAvZGV2L251bGwKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS90b29scy9wb2xpY3l0b29sL1Jlc291cmNlc196aF9UVy5qYXZhCkBAIC0wLDAgKzEsMTU2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBPcmFjbGUgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKKyAqIHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIHN1bi5zZWN1cml0eS50b29scy5wb2xpY3l0b29sOworCisvKioKKyAqIDxwPiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIDxjb2RlPlJlc291cmNlQnVuZGxlPC9jb2RlPgorICogZm9yIHRoZSBwb2xpY3l0b29sLgorICoKKyAqLworcHVibGljIGNsYXNzIFJlc291cmNlc196aF9UVyBleHRlbmRzIGphdmEudXRpbC5MaXN0UmVzb3VyY2VCdW5kbGUgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W11bXSBjb250ZW50cyA9IHsKKyAgICAgICAgeyJORVdMSU5FIiwgIlxuIn0sCisgICAgICAgIHsiV2FybmluZy5BLnB1YmxpYy5rZXkuZm9yLmFsaWFzLnNpZ25lcnMuaS5kb2VzLm5vdC5leGlzdC5NYWtlLnN1cmUuYS5LZXlTdG9yZS5pcy5wcm9wZXJseS5jb25maWd1cmVkLiIsCisgICAgICAgICAgICAgICAgIlx1OEI2Nlx1NTQ0QTogXHU1MjI1XHU1NDBEIHswfSBcdTc2ODRcdTUxNkNcdTk1OEJcdTkxRDFcdTk0NzBcdTRFMERcdTVCNThcdTU3MjhcdTMwMDJcdThBQ0JcdTc4QkFcdTVCOUFcdTkxRDFcdTk0NzBcdTUxMzJcdTVCNThcdTVFQUJcdTkxNERcdTdGNkVcdTZCNjNcdTc4QkFcdTMwMDIifSwKKyAgICAgICAgeyJXYXJuaW5nLkNsYXNzLm5vdC5mb3VuZC5jbGFzcyIsICJcdThCNjZcdTU0NEE6IFx1NjI3RVx1NEUwRFx1NTIzMFx1OTg1RVx1NTIyNSB7MH0ifSwKKyAgICAgICAgeyJXYXJuaW5nLkludmFsaWQuYXJndW1lbnQucy5mb3IuY29uc3RydWN0b3IuYXJnIiwKKyAgICAgICAgICAgICAgICAiXHU4QjY2XHU1NDRBOiBcdTcxMjFcdTY1NDhcdTc2ODRcdTVFRkFcdTY5Q0JcdTVCNTBcdTVGMTVcdTY1Nzg6IHswfSJ9LAorICAgICAgICB7IklsbGVnYWwuUHJpbmNpcGFsLlR5cGUudHlwZSIsICJcdTcxMjFcdTY1NDhcdTc2ODQgUHJpbmNpcGFsIFx1OTg1RVx1NTc4QjogezB9In0sCisgICAgICAgIHsiSWxsZWdhbC5vcHRpb24ub3B0aW9uIiwgIlx1NzEyMVx1NjU0OFx1NzY4NFx1OTA3OFx1OTgwNTogezB9In0sCisgICAgICAgIHsiVXNhZ2UucG9saWN5dG9vbC5vcHRpb25zLiIsICJcdTc1MjhcdTZDRDU6IHBvbGljeXRvb2wgW29wdGlvbnNdIn0sCisgICAgICAgIHsiLmZpbGUuZmlsZS5wb2xpY3kuZmlsZS5sb2NhdGlvbiIsCisgICAgICAgICAgICAgICAgIiAgWy1maWxlIDxmaWxlPl0gICAgXHU1MzlGXHU1MjQ3XHU2QTk0XHU2ODQ4XHU0RjREXHU3RjZFIn0sCisgICAgICAgIHsiTmV3IiwgIlx1NjVCMFx1NTg5RSJ9LAorICAgICAgICB7Ik9wZW4iLCAiXHU5NThCXHU1NTVGIn0sCisgICAgICAgIHsiU2F2ZSIsICJcdTUxMzJcdTVCNTgifSwKKyAgICAgICAgeyJTYXZlLkFzIiwgIlx1NTNFNlx1NUI1OFx1NjVCMFx1NkE5NCJ9LAorICAgICAgICB7IlZpZXcuV2FybmluZy5Mb2ciLCAiXHU2QUEyXHU4OTk2XHU4QjY2XHU1NDRBXHU4QTE4XHU5MzA0In0sCisgICAgICAgIHsiRXhpdCIsICJcdTdENTBcdTY3NUYifSwKKyAgICAgICAgeyJBZGQuUG9saWN5LkVudHJ5IiwgIlx1NjVCMFx1NTg5RVx1NTM5Rlx1NTI0N1x1OTgwNVx1NzZFRSJ9LAorICAgICAgICB7IkVkaXQuUG9saWN5LkVudHJ5IiwgIlx1N0RFOFx1OEYyRlx1NTM5Rlx1NTI0N1x1OTgwNVx1NzZFRSJ9LAorICAgICAgICB7IlJlbW92ZS5Qb2xpY3kuRW50cnkiLCAiXHU3OUZCXHU5NjY0XHU1MzlGXHU1MjQ3XHU5ODA1XHU3NkVFIn0sCisgICAgICAgIHsiRWRpdCIsICJcdTdERThcdThGMkYifSwKKyAgICAgICAgeyJSZXRhaW4iLCAiXHU0RkREXHU3NTU5In0sCisKKyAgICAgICAgeyJXYXJuaW5nLkZpbGUubmFtZS5tYXkuaW5jbHVkZS5lc2NhcGVkLmJhY2tzbGFzaC5jaGFyYWN0ZXJzLkl0LmlzLm5vdC5uZWNlc3NhcnkudG8uZXNjYXBlLmJhY2tzbGFzaC5jaGFyYWN0ZXJzLnRoZS50b29sLmVzY2FwZXMiLAorICAgICAgICAgICAgIlx1OEI2Nlx1NTQ0QTogXHU2QTk0XHU2ODQ4XHU1NDBEXHU3QTMxXHU1MzA1XHU1NDJCXHU5MDQxXHU5NkUyXHU1M0NEXHU2NTlDXHU3RERBXHU1QjU3XHU1MTQzXHUzMDAyXHU0RTBEXHU5NzAwXHU4OTgxXHU5MDQxXHU5NkUyXHU1M0NEXHU2NTlDXHU3RERBXHU1QjU3XHU1MTQzIChcdTY0QjBcdTVCRUJcdTUzOUZcdTUyNDdcdTUxNjdcdTVCQjlcdTgxRjNcdTZDMzhcdTRFNDVcdTVCNThcdTY1M0VcdTUzNDBcdTY2NDJcdTk3MDBcdTg5ODFcdTVERTVcdTUxNzdcdTkwNDFcdTk2RTJcdTVCNTdcdTUxNDMpXHUzMDAyXG5cblx1NjMwOVx1NEUwMFx1NEUwQlx1MzAwQ1x1NEZERFx1NzU1OVx1MzAwRFx1NEVFNVx1NEZERFx1NzU1OVx1OEYzOFx1NTE2NVx1NzY4NFx1NTQwRFx1N0EzMVx1RkYwQ1x1NjIxNlx1NjMwOVx1NEUwMFx1NEUwQlx1MzAwQ1x1N0RFOFx1OEYyRlx1MzAwRFx1NEVFNVx1N0RFOFx1OEYyRlx1NTQwRFx1N0EzMVx1MzAwMiJ9LAorCisgICAgICAgIHsiQWRkLlB1YmxpYy5LZXkuQWxpYXMiLCAiXHU2NUIwXHU1ODlFXHU1MTZDXHU5NThCXHU5MUQxXHU5NDcwXHU1MjI1XHU1NDBEIn0sCisgICAgICAgIHsiUmVtb3ZlLlB1YmxpYy5LZXkuQWxpYXMiLCAiXHU3OUZCXHU5NjY0XHU1MTZDXHU5NThCXHU5MUQxXHU5NDcwXHU1MjI1XHU1NDBEIn0sCisgICAgICAgIHsiRmlsZSIsICJcdTZBOTRcdTY4NDgifSwKKyAgICAgICAgeyJLZXlTdG9yZSIsICJcdTkxRDFcdTk0NzBcdTUxMzJcdTVCNThcdTVFQUIifSwKKyAgICAgICAgeyJQb2xpY3kuRmlsZS4iLCAiXHU1MzlGXHU1MjQ3XHU2QTk0XHU2ODQ4OiAifSwKKyAgICAgICAgeyJDb3VsZC5ub3Qub3Blbi5wb2xpY3kuZmlsZS5wb2xpY3lGaWxlLmUudG9TdHJpbmcuIiwKKyAgICAgICAgICAgICAgICAiXHU3MTIxXHU2Q0Q1XHU5NThCXHU1NTVGXHU1MzlGXHU1MjQ3XHU2QTk0XHU2ODQ4OiB7MH06IHsxfSJ9LAorICAgICAgICB7IlBvbGljeS5Ub29sIiwgIlx1NTM5Rlx1NTI0N1x1NURFNVx1NTE3NyJ9LAorICAgICAgICB7IkVycm9ycy5oYXZlLm9jY3VycmVkLndoaWxlLm9wZW5pbmcudGhlLnBvbGljeS5jb25maWd1cmF0aW9uLlZpZXcudGhlLldhcm5pbmcuTG9nLmZvci5tb3JlLmluZm9ybWF0aW9uLiIsCisgICAgICAgICAgICAgICAgIlx1OTU4Qlx1NTU1Rlx1NTM5Rlx1NTI0N1x1OEExOFx1N0Y2RVx1NjY0Mlx1NzY3Q1x1NzUxRlx1OTMyRlx1OEFBNFx1MzAwMlx1OEFDQlx1NkFBMlx1ODk5Nlx1OEI2Nlx1NTQ0QVx1OEExOFx1OTMwNFx1NEVFNVx1NTNENlx1NUY5N1x1NjZGNFx1NTkxQVx1NzY4NFx1OENDN1x1OEEwQSJ9LAorICAgICAgICB7IkVycm9yIiwgIlx1OTMyRlx1OEFBNCJ9LAorICAgICAgICB7Ik9LIiwgIlx1NzhCQVx1NUI5QSJ9LAorICAgICAgICB7IlN0YXR1cyIsICJcdTcyQzBcdTYxNEIifSwKKyAgICAgICAgeyJXYXJuaW5nIiwgIlx1OEI2Nlx1NTQ0QSJ9LAorICAgICAgICB7IlBlcm1pc3Npb24uIiwKKyAgICAgICAgICAgICAgICAiXHU2QjBBXHU5NjUwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifSwKKyAgICAgICAgeyJQcmluY2lwYWwuVHlwZS4iLCAiUHJpbmNpcGFsIFx1OTg1RVx1NTc4QjogIn0sCisgICAgICAgIHsiUHJpbmNpcGFsLk5hbWUuIiwgIlByaW5jaXBhbCBcdTU0MERcdTdBMzE6ICJ9LAorICAgICAgICB7IlRhcmdldC5OYW1lLiIsCisgICAgICAgICAgICAgICAgIlx1NzZFRVx1NkExOVx1NTQwRFx1N0EzMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIn0sCisgICAgICAgIHsiQWN0aW9ucy4iLAorICAgICAgICAgICAgICAgICJcdTUyRDVcdTRGNUM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9LAorICAgICAgICB7Ik9LLnRvLm92ZXJ3cml0ZS5leGlzdGluZy5maWxlLmZpbGVuYW1lLiIsCisgICAgICAgICAgICAgICAgIlx1NzhCQVx1OEE4RFx1ODk4Nlx1NUJFQlx1NzNGRVx1NUI1OFx1NzY4NFx1NkE5NFx1Njg0OCB7MH1cdUZGMUYifSwKKyAgICAgICAgeyJDYW5jZWwiLCAiXHU1M0Q2XHU2RDg4In0sCisgICAgICAgIHsiQ29kZUJhc2UuIiwgIkNvZGVCYXNlOiJ9LAorICAgICAgICB7IlNpZ25lZEJ5LiIsICJTaWduZWRCeToifSwKKyAgICAgICAgeyJBZGQuUHJpbmNpcGFsIiwgIlx1NjVCMFx1NTg5RSBQcmluY2lwYWwifSwKKyAgICAgICAgeyJFZGl0LlByaW5jaXBhbCIsICJcdTdERThcdThGMkYgUHJpbmNpcGFsIn0sCisgICAgICAgIHsiUmVtb3ZlLlByaW5jaXBhbCIsICJcdTc5RkJcdTk2NjQgUHJpbmNpcGFsIn0sCisgICAgICAgIHsiUHJpbmNpcGFscy4iLCAiUHJpbmNpcGFsOiJ9LAorICAgICAgICB7Ii5BZGQuUGVybWlzc2lvbiIsICIgIFx1NjVCMFx1NTg5RVx1NkIwQVx1OTY1MCJ9LAorICAgICAgICB7Ii5FZGl0LlBlcm1pc3Npb24iLCAiICBcdTdERThcdThGMkZcdTZCMEFcdTk2NTAifSwKKyAgICAgICAgeyJSZW1vdmUuUGVybWlzc2lvbiIsICJcdTc5RkJcdTk2NjRcdTZCMEFcdTk2NTAifSwKKyAgICAgICAgeyJEb25lIiwgIlx1NUI4Q1x1NjIxMCJ9LAorICAgICAgICB7IktleVN0b3JlLlVSTC4iLCAiXHU5MUQxXHU5NDcwXHU1MTMyXHU1QjU4XHU1RUFCIFVSTDogIn0sCisgICAgICAgIHsiS2V5U3RvcmUuVHlwZS4iLCAiXHU5MUQxXHU5NDcwXHU1MTMyXHU1QjU4XHU1RUFCXHU5ODVFXHU1NzhCOiJ9LAorICAgICAgICB7IktleVN0b3JlLlByb3ZpZGVyLiIsICJcdTkxRDFcdTk0NzBcdTUxMzJcdTVCNThcdTVFQUJcdTYzRDBcdTRGOUJcdTgwMDU6In0sCisgICAgICAgIHsiS2V5U3RvcmUuUGFzc3dvcmQuVVJMLiIsICJcdTkxRDFcdTk0NzBcdTUxMzJcdTVCNThcdTVFQUJcdTVCQzZcdTc4QkMgVVJMOiAifSwKKyAgICAgICAgeyJQcmluY2lwYWxzIiwgIlByaW5jaXBhbCJ9LAorICAgICAgICB7Ii5FZGl0LlByaW5jaXBhbC4iLCAiICBcdTdERThcdThGMkYgUHJpbmNpcGFsOiAifSwKKyAgICAgICAgeyIuQWRkLk5ldy5QcmluY2lwYWwuIiwgIiAgXHU2NUIwXHU1ODlFIFByaW5jaXBhbDogIn0sCisgICAgICAgIHsiUGVybWlzc2lvbnMiLCAiXHU2QjBBXHU5NjUwIn0sCisgICAgICAgIHsiLkVkaXQuUGVybWlzc2lvbi4iLCAiICBcdTdERThcdThGMkZcdTZCMEFcdTk2NTA6In0sCisgICAgICAgIHsiLkFkZC5OZXcuUGVybWlzc2lvbi4iLCAiICBcdTY1QjBcdTU4OUVcdTZCMEFcdTk2NTA6In0sCisgICAgICAgIHsiU2lnbmVkLkJ5LiIsICJcdTdDM0RcdTdGNzJcdTRFQkE6ICJ9LAorICAgICAgICB7IkNhbm5vdC5TcGVjaWZ5LlByaW5jaXBhbC53aXRoLmEuV2lsZGNhcmQuQ2xhc3Mud2l0aG91dC5hLldpbGRjYXJkLk5hbWUiLAorICAgICAgICAgICAgIlx1NkM5Mlx1NjcwOVx1ODQyQ1x1NzUyOFx1NUI1N1x1NTE0M1x1NTQwRFx1N0EzMVx1RkYwQ1x1NzEyMVx1NkNENVx1NjMwN1x1NUI5QVx1NTQyQlx1NjcwOVx1ODQyQ1x1NzUyOFx1NUI1N1x1NTE0M1x1OTg1RVx1NTIyNVx1NzY4NCBQcmluY2lwYWwifSwKKyAgICAgICAgeyJDYW5ub3QuU3BlY2lmeS5QcmluY2lwYWwud2l0aG91dC5hLk5hbWUiLAorICAgICAgICAgICAgIlx1NkM5Mlx1NjcwOVx1NTQwRFx1N0EzMVx1RkYwQ1x1NzEyMVx1NkNENVx1NjMwN1x1NUI5QSBQcmluY2lwYWwifSwKKyAgICAgICAgeyJQZXJtaXNzaW9uLmFuZC5UYXJnZXQuTmFtZS5tdXN0LmhhdmUuYS52YWx1ZSIsCisgICAgICAgICAgICAgICAgIlx1NkIwQVx1OTY1MFx1NTNDQVx1NzZFRVx1NkExOVx1NTQwRFx1N0EzMVx1NUZDNVx1OTgwOFx1NjcwOVx1NEUwMFx1NTAwQlx1NTAzQ1x1MzAwMiJ9LAorICAgICAgICB7IlJlbW92ZS50aGlzLlBvbGljeS5FbnRyeS4iLCAiXHU3OUZCXHU5NjY0XHU5MDE5XHU1MDBCXHU1MzlGXHU1MjQ3XHU5ODA1XHU3NkVFXHVGRjFGIn0sCisgICAgICAgIHsiT3ZlcndyaXRlLkZpbGUiLCAiXHU4OTg2XHU1QkVCXHU2QTk0XHU2ODQ4In0sCisgICAgICAgIHsiUG9saWN5LnN1Y2Nlc3NmdWxseS53cml0dGVuLnRvLmZpbGVuYW1lIiwKKyAgICAgICAgICAgICAgICAiXHU1MzlGXHU1MjQ3XHU2MjEwXHU1MjlGXHU1QkVCXHU1MTY1XHU4MUYzIHswfSJ9LAorICAgICAgICB7Im51bGwuZmlsZW5hbWUiLCAiXHU3QTdBXHU1MDNDXHU2QTk0XHU1NDBEIn0sCisgICAgICAgIHsiU2F2ZS5jaGFuZ2VzLiIsICJcdTUxMzJcdTVCNThcdThCOEFcdTY2RjRcdUZGMUYifSwKKyAgICAgICAgeyJZZXMiLCAiXHU2NjJGIn0sCisgICAgICAgIHsiTm8iLCAiXHU1NDI2In0sCisgICAgICAgIHsiUG9saWN5LkVudHJ5IiwgIlx1NTM5Rlx1NTI0N1x1OTgwNVx1NzZFRSJ9LAorICAgICAgICB7IlNhdmUuQ2hhbmdlcyIsICJcdTUxMzJcdTVCNThcdThCOEFcdTY2RjQifSwKKyAgICAgICAgeyJOby5Qb2xpY3kuRW50cnkuc2VsZWN0ZWQiLCAiXHU2QzkyXHU2NzA5XHU5MDc4XHU1M0Q2XHU1MzlGXHU1MjQ3XHU5ODA1XHU3NkVFIn0sCisgICAgICAgIHsiVW5hYmxlLnRvLm9wZW4uS2V5U3RvcmUuZXgudG9TdHJpbmcuIiwKKyAgICAgICAgICAgICAgICAiXHU3MTIxXHU2Q0Q1XHU5NThCXHU1NTVGXHU5MUQxXHU5NDcwXHU1MTMyXHU1QjU4XHU1RUFCOiB7MH0ifSwKKyAgICAgICAgeyJOby5wcmluY2lwYWwuc2VsZWN0ZWQiLCAiXHU2NzJBXHU5MDc4XHU1M0Q2IFByaW5jaXBhbCJ9LAorICAgICAgICB7Ik5vLnBlcm1pc3Npb24uc2VsZWN0ZWQiLCAiXHU2QzkyXHU2NzA5XHU5MDc4XHU1M0Q2XHU2QjBBXHU5NjUwIn0sCisgICAgICAgIHsibmFtZSIsICJcdTU0MERcdTdBMzEifSwKKyAgICAgICAgeyJjb25maWd1cmF0aW9uLnR5cGUiLCAiXHU3RDQ0XHU2MTRCXHU5ODVFXHU1NzhCIn0sCisgICAgICAgIHsiZW52aXJvbm1lbnQudmFyaWFibGUubmFtZSIsICJcdTc0QjBcdTU4ODNcdThCOEFcdTY1NzhcdTU0MERcdTdBMzEifSwKKyAgICAgICAgeyJsaWJyYXJ5Lm5hbWUiLCAiXHU3QTBCXHU1RjBGXHU1RUFCXHU1NDBEXHU3QTMxIn0sCisgICAgICAgIHsicGFja2FnZS5uYW1lIiwgIlx1NTk1N1x1ODhERFx1N0EwQlx1NUYwRlx1NTQwRFx1N0EzMSJ9LAorICAgICAgICB7InBvbGljeS50eXBlIiwgIlx1NTM5Rlx1NTI0N1x1OTg1RVx1NTc4QiJ9LAorICAgICAgICB7InByb3BlcnR5Lm5hbWUiLCAiXHU1QzZDXHU2MDI3XHU1NDBEXHU3QTMxIn0sCisgICAgICAgIHsicHJvdmlkZXIubmFtZSIsICJcdTYzRDBcdTRGOUJcdTgwMDVcdTU0MERcdTdBMzEifSwKKyAgICAgICAgeyJQcmluY2lwYWwuTGlzdCIsICJQcmluY2lwYWwgXHU2RTA1XHU1NUFFIn0sCisgICAgICAgIHsiUGVybWlzc2lvbi5MaXN0IiwgIlx1NkIwQVx1OTY1MFx1NkUwNVx1NTVBRSJ9LAorICAgICAgICB7IkNvZGUuQmFzZSIsICJcdTRFRTNcdTc4QkNcdTU3RkFcdTZFOTYifSwKKyAgICAgICAgeyJLZXlTdG9yZS5VLlIuTC4iLCAiXHU5MUQxXHU5NDcwXHU1MTMyXHU1QjU4XHU1RUFCIFVSTDoifSwKKyAgICAgICAgeyJLZXlTdG9yZS5QYXNzd29yZC5VLlIuTC4iLCAiXHU5MUQxXHU5NDcwXHU1MTMyXHU1QjU4XHU1RUFCXHU1QkM2XHU3OEJDIFVSTDoifQorICAgIH07CisKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGNvbnRlbnRzIG9mIHRoaXMgPGNvZGU+UmVzb3VyY2VCdW5kbGU8L2NvZGU+LgorICAgICAqCisgICAgICogPHA+CisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBjb250ZW50cyBvZiB0aGlzIDxjb2RlPlJlc291cmNlQnVuZGxlPC9jb2RlPi4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0W11bXSBnZXRDb250ZW50cygpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRlbnRzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdXRpbC9SZXNvdXJjZXMuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdXRpbC9SZXNvdXJjZXMuamF2YQppbmRleCBhN2JhOWUyZS4uZWYwNzNiMCAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS91dGlsL1Jlc291cmNlcy5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdXRpbC9SZXNvdXJjZXMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTM0LDUxMyArMzQsNiBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W11bXSBjb250ZW50cyA9IHsKIAotICAgICAgICAvLyBzaGFyZWQgKGZyb20gamFyc2lnbmVyKQotICAgICAgICB7IlNQQUNFIiwgIiAifSwKLSAgICAgICAgeyIyU1BBQ0UiLCAiICAifSwKLSAgICAgICAgeyI2U1BBQ0UiLCAiICAgICAgIn0sCi0gICAgICAgIHsiQ09NTUEiLCAiLCAifSwKLSAgICAgICAgLy8gc2hhcmVkIChmcm9tIGtleXRvb2wpCi0gICAgICAgIHsiTkVXTElORSIsICJcbiJ9LAotICAgICAgICB7IlNUQVIiLAotICAgICAgICAgICAgICAgICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIn0sCi0gICAgICAgIHsiU1RBUk5OIiwKLSAgICAgICAgICAgICAgICAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG4ifSwKLQotICAgICAgICAvLyBrZXl0b29sOiBIZWxwIHBhcnQKLSAgICAgICAgeyIuT1BUSU9OLiIsICIgW09QVElPTl0uLi4ifSwKLSAgICAgICAgeyJPcHRpb25zLiIsICJPcHRpb25zOiJ9LAotICAgICAgICB7IlVzZS5rZXl0b29sLmhlbHAuZm9yLmFsbC5hdmFpbGFibGUuY29tbWFuZHMiLAotICAgICAgICAgICAgICAgICAiVXNlIFwia2V5dG9vbCAtaGVscFwiIGZvciBhbGwgYXZhaWxhYmxlIGNvbW1hbmRzIn0sCi0gICAgICAgIHsiS2V5LmFuZC5DZXJ0aWZpY2F0ZS5NYW5hZ2VtZW50LlRvb2wiLAotICAgICAgICAgICAgICAgICAiS2V5IGFuZCBDZXJ0aWZpY2F0ZSBNYW5hZ2VtZW50IFRvb2wifSwKLSAgICAgICAgeyJDb21tYW5kcy4iLCAiQ29tbWFuZHM6In0sCi0gICAgICAgIHsiVXNlLmtleXRvb2wuY29tbWFuZC5uYW1lLmhlbHAuZm9yLnVzYWdlLm9mLmNvbW1hbmQubmFtZSIsCi0gICAgICAgICAgICAgICAgIlVzZSBcImtleXRvb2wgLWNvbW1hbmRfbmFtZSAtaGVscFwiIGZvciB1c2FnZSBvZiBjb21tYW5kX25hbWUifSwKLSAgICAgICAgLy8ga2V5dG9vbDogaGVscDogY29tbWFuZHMKLSAgICAgICAgeyJHZW5lcmF0ZXMuYS5jZXJ0aWZpY2F0ZS5yZXF1ZXN0IiwKLSAgICAgICAgICAgICAgICAiR2VuZXJhdGVzIGEgY2VydGlmaWNhdGUgcmVxdWVzdCJ9LCAvLy1jZXJ0cmVxCi0gICAgICAgIHsiQ2hhbmdlcy5hbi5lbnRyeS5zLmFsaWFzIiwKLSAgICAgICAgICAgICAgICAiQ2hhbmdlcyBhbiBlbnRyeSdzIGFsaWFzIn0sIC8vLWNoYW5nZWFsaWFzCi0gICAgICAgIHsiRGVsZXRlcy5hbi5lbnRyeSIsCi0gICAgICAgICAgICAgICAgIkRlbGV0ZXMgYW4gZW50cnkifSwgLy8tZGVsZXRlCi0gICAgICAgIHsiRXhwb3J0cy5jZXJ0aWZpY2F0ZSIsCi0gICAgICAgICAgICAgICAgIkV4cG9ydHMgY2VydGlmaWNhdGUifSwgLy8tZXhwb3J0Y2VydAotICAgICAgICB7IkdlbmVyYXRlcy5hLmtleS5wYWlyIiwKLSAgICAgICAgICAgICAgICAiR2VuZXJhdGVzIGEga2V5IHBhaXIifSwgLy8tZ2Vua2V5cGFpcgotICAgICAgICB7IkdlbmVyYXRlcy5hLnNlY3JldC5rZXkiLAotICAgICAgICAgICAgICAgICJHZW5lcmF0ZXMgYSBzZWNyZXQga2V5In0sIC8vLWdlbnNlY2tleQotICAgICAgICB7IkdlbmVyYXRlcy5jZXJ0aWZpY2F0ZS5mcm9tLmEuY2VydGlmaWNhdGUucmVxdWVzdCIsCi0gICAgICAgICAgICAgICAgIkdlbmVyYXRlcyBjZXJ0aWZpY2F0ZSBmcm9tIGEgY2VydGlmaWNhdGUgcmVxdWVzdCJ9LCAvLy1nZW5jZXJ0Ci0gICAgICAgIHsiR2VuZXJhdGVzLkNSTCIsICJHZW5lcmF0ZXMgQ1JMIn0sIC8vLWdlbmNybAotICAgICAgICB7IkltcG9ydHMuZW50cmllcy5mcm9tLmEuSkRLLjEuMS54LnN0eWxlLmlkZW50aXR5LmRhdGFiYXNlIiwKLSAgICAgICAgICAgICAgICAiSW1wb3J0cyBlbnRyaWVzIGZyb20gYSBKREsgMS4xLngtc3R5bGUgaWRlbnRpdHkgZGF0YWJhc2UifSwgLy8taWRlbnRpdHlkYgotICAgICAgICB7IkltcG9ydHMuYS5jZXJ0aWZpY2F0ZS5vci5hLmNlcnRpZmljYXRlLmNoYWluIiwKLSAgICAgICAgICAgICAgICAiSW1wb3J0cyBhIGNlcnRpZmljYXRlIG9yIGEgY2VydGlmaWNhdGUgY2hhaW4ifSwgLy8taW1wb3J0Y2VydAotICAgICAgICB7IkltcG9ydHMub25lLm9yLmFsbC5lbnRyaWVzLmZyb20uYW5vdGhlci5rZXlzdG9yZSIsCi0gICAgICAgICAgICAgICAgIkltcG9ydHMgb25lIG9yIGFsbCBlbnRyaWVzIGZyb20gYW5vdGhlciBrZXlzdG9yZSJ9LCAvLy1pbXBvcnRrZXlzdG9yZQotICAgICAgICB7IkNsb25lcy5hLmtleS5lbnRyeSIsCi0gICAgICAgICAgICAgICAgIkNsb25lcyBhIGtleSBlbnRyeSJ9LCAvLy1rZXljbG9uZQotICAgICAgICB7IkNoYW5nZXMudGhlLmtleS5wYXNzd29yZC5vZi5hbi5lbnRyeSIsCi0gICAgICAgICAgICAgICAgIkNoYW5nZXMgdGhlIGtleSBwYXNzd29yZCBvZiBhbiBlbnRyeSJ9LCAvLy1rZXlwYXNzd2QKLSAgICAgICAgeyJMaXN0cy5lbnRyaWVzLmluLmEua2V5c3RvcmUiLAotICAgICAgICAgICAgICAgICJMaXN0cyBlbnRyaWVzIGluIGEga2V5c3RvcmUifSwgLy8tbGlzdAotICAgICAgICB7IlByaW50cy50aGUuY29udGVudC5vZi5hLmNlcnRpZmljYXRlIiwKLSAgICAgICAgICAgICAgICAiUHJpbnRzIHRoZSBjb250ZW50IG9mIGEgY2VydGlmaWNhdGUifSwgLy8tcHJpbnRjZXJ0Ci0gICAgICAgIHsiUHJpbnRzLnRoZS5jb250ZW50Lm9mLmEuY2VydGlmaWNhdGUucmVxdWVzdCIsCi0gICAgICAgICAgICAgICAgIlByaW50cyB0aGUgY29udGVudCBvZiBhIGNlcnRpZmljYXRlIHJlcXVlc3QifSwgLy8tcHJpbnRjZXJ0cmVxCi0gICAgICAgIHsiUHJpbnRzLnRoZS5jb250ZW50Lm9mLmEuQ1JMLmZpbGUiLAotICAgICAgICAgICAgICAgICJQcmludHMgdGhlIGNvbnRlbnQgb2YgYSBDUkwgZmlsZSJ9LCAvLy1wcmludGNybAotICAgICAgICB7IkdlbmVyYXRlcy5hLnNlbGYuc2lnbmVkLmNlcnRpZmljYXRlIiwKLSAgICAgICAgICAgICAgICAiR2VuZXJhdGVzIGEgc2VsZi1zaWduZWQgY2VydGlmaWNhdGUifSwgLy8tc2VsZmNlcnQKLSAgICAgICAgeyJDaGFuZ2VzLnRoZS5zdG9yZS5wYXNzd29yZC5vZi5hLmtleXN0b3JlIiwKLSAgICAgICAgICAgICAgICAiQ2hhbmdlcyB0aGUgc3RvcmUgcGFzc3dvcmQgb2YgYSBrZXlzdG9yZSJ9LCAvLy1zdG9yZXBhc3N3ZAotICAgICAgICAvLyBrZXl0b29sOiBoZWxwOiBvcHRpb25zCi0gICAgICAgIHsiYWxpYXMubmFtZS5vZi50aGUuZW50cnkudG8ucHJvY2VzcyIsCi0gICAgICAgICAgICAgICAgImFsaWFzIG5hbWUgb2YgdGhlIGVudHJ5IHRvIHByb2Nlc3MifSwgLy8tYWxpYXMKLSAgICAgICAgeyJkZXN0aW5hdGlvbi5hbGlhcyIsCi0gICAgICAgICAgICAgICAgImRlc3RpbmF0aW9uIGFsaWFzIn0sIC8vLWRlc3RhbGlhcwotICAgICAgICB7ImRlc3RpbmF0aW9uLmtleS5wYXNzd29yZCIsCi0gICAgICAgICAgICAgICAgImRlc3RpbmF0aW9uIGtleSBwYXNzd29yZCJ9LCAvLy1kZXN0a2V5cGFzcwotICAgICAgICB7ImRlc3RpbmF0aW9uLmtleXN0b3JlLm5hbWUiLAotICAgICAgICAgICAgICAgICJkZXN0aW5hdGlvbiBrZXlzdG9yZSBuYW1lIn0sIC8vLWRlc3RrZXlzdG9yZQotICAgICAgICB7ImRlc3RpbmF0aW9uLmtleXN0b3JlLnBhc3N3b3JkLnByb3RlY3RlZCIsCi0gICAgICAgICAgICAgICAgImRlc3RpbmF0aW9uIGtleXN0b3JlIHBhc3N3b3JkIHByb3RlY3RlZCJ9LCAvLy1kZXN0cHJvdGVjdGVkCi0gICAgICAgIHsiZGVzdGluYXRpb24ua2V5c3RvcmUucHJvdmlkZXIubmFtZSIsCi0gICAgICAgICAgICAgICAgImRlc3RpbmF0aW9uIGtleXN0b3JlIHByb3ZpZGVyIG5hbWUifSwgLy8tZGVzdHByb3ZpZGVybmFtZQotICAgICAgICB7ImRlc3RpbmF0aW9uLmtleXN0b3JlLnBhc3N3b3JkIiwKLSAgICAgICAgICAgICAgICAiZGVzdGluYXRpb24ga2V5c3RvcmUgcGFzc3dvcmQifSwgLy8tZGVzdHN0b3JlcGFzcwotICAgICAgICB7ImRlc3RpbmF0aW9uLmtleXN0b3JlLnR5cGUiLAotICAgICAgICAgICAgICAgICJkZXN0aW5hdGlvbiBrZXlzdG9yZSB0eXBlIn0sIC8vLWRlc3RzdG9yZXR5cGUKLSAgICAgICAgeyJkaXN0aW5ndWlzaGVkLm5hbWUiLAotICAgICAgICAgICAgICAgICJkaXN0aW5ndWlzaGVkIG5hbWUifSwgLy8tZG5hbWUKLSAgICAgICAgeyJYLjUwOS5leHRlbnNpb24iLAotICAgICAgICAgICAgICAgICJYLjUwOSBleHRlbnNpb24ifSwgLy8tZXh0Ci0gICAgICAgIHsib3V0cHV0LmZpbGUubmFtZSIsCi0gICAgICAgICAgICAgICAgIm91dHB1dCBmaWxlIG5hbWUifSwgLy8tZmlsZSBhbmQgLW91dGZpbGUKLSAgICAgICAgeyJpbnB1dC5maWxlLm5hbWUiLAotICAgICAgICAgICAgICAgICJpbnB1dCBmaWxlIG5hbWUifSwgLy8tZmlsZSBhbmQgLWluZmlsZQotICAgICAgICB7ImtleS5hbGdvcml0aG0ubmFtZSIsCi0gICAgICAgICAgICAgICAgImtleSBhbGdvcml0aG0gbmFtZSJ9LCAvLy1rZXlhbGcKLSAgICAgICAgeyJrZXkucGFzc3dvcmQiLAotICAgICAgICAgICAgICAgICJrZXkgcGFzc3dvcmQifSwgLy8ta2V5cGFzcwotICAgICAgICB7ImtleS5iaXQuc2l6ZSIsCi0gICAgICAgICAgICAgICAgImtleSBiaXQgc2l6ZSJ9LCAvLy1rZXlzaXplCi0gICAgICAgIHsia2V5c3RvcmUubmFtZSIsCi0gICAgICAgICAgICAgICAgImtleXN0b3JlIG5hbWUifSwgLy8ta2V5c3RvcmUKLSAgICAgICAgeyJuZXcucGFzc3dvcmQiLAotICAgICAgICAgICAgICAgICJuZXcgcGFzc3dvcmQifSwgLy8tbmV3Ci0gICAgICAgIHsiZG8ubm90LnByb21wdCIsCi0gICAgICAgICAgICAgICAgImRvIG5vdCBwcm9tcHQifSwgLy8tbm9wcm9tcHQKLSAgICAgICAgeyJwYXNzd29yZC50aHJvdWdoLnByb3RlY3RlZC5tZWNoYW5pc20iLAotICAgICAgICAgICAgICAgICJwYXNzd29yZCB0aHJvdWdoIHByb3RlY3RlZCBtZWNoYW5pc20ifSwgLy8tcHJvdGVjdGVkCi0gICAgICAgIHsicHJvdmlkZXIuYXJndW1lbnQiLAotICAgICAgICAgICAgICAgICJwcm92aWRlciBhcmd1bWVudCJ9LCAvLy1wcm92aWRlcmFyZwotICAgICAgICB7InByb3ZpZGVyLmNsYXNzLm5hbWUiLAotICAgICAgICAgICAgICAgICJwcm92aWRlciBjbGFzcyBuYW1lIn0sIC8vLXByb3ZpZGVyY2xhc3MKLSAgICAgICAgeyJwcm92aWRlci5uYW1lIiwKLSAgICAgICAgICAgICAgICAicHJvdmlkZXIgbmFtZSJ9LCAvLy1wcm92aWRlcm5hbWUKLSAgICAgICAgeyJwcm92aWRlci5jbGFzc3BhdGgiLAotICAgICAgICAgICAgICAgICJwcm92aWRlciBjbGFzc3BhdGgifSwgLy8tcHJvdmlkZXJwYXRoCi0gICAgICAgIHsib3V0cHV0LmluLlJGQy5zdHlsZSIsCi0gICAgICAgICAgICAgICAgIm91dHB1dCBpbiBSRkMgc3R5bGUifSwgLy8tcmZjCi0gICAgICAgIHsic2lnbmF0dXJlLmFsZ29yaXRobS5uYW1lIiwKLSAgICAgICAgICAgICAgICAic2lnbmF0dXJlIGFsZ29yaXRobSBuYW1lIn0sIC8vLXNpZ2FsZwotICAgICAgICB7InNvdXJjZS5hbGlhcyIsCi0gICAgICAgICAgICAgICAgInNvdXJjZSBhbGlhcyJ9LCAvLy1zcmNhbGlhcwotICAgICAgICB7InNvdXJjZS5rZXkucGFzc3dvcmQiLAotICAgICAgICAgICAgICAgICJzb3VyY2Uga2V5IHBhc3N3b3JkIn0sIC8vLXNyY2tleXBhc3MKLSAgICAgICAgeyJzb3VyY2Uua2V5c3RvcmUubmFtZSIsCi0gICAgICAgICAgICAgICAgInNvdXJjZSBrZXlzdG9yZSBuYW1lIn0sIC8vLXNyY2tleXN0b3JlCi0gICAgICAgIHsic291cmNlLmtleXN0b3JlLnBhc3N3b3JkLnByb3RlY3RlZCIsCi0gICAgICAgICAgICAgICAgInNvdXJjZSBrZXlzdG9yZSBwYXNzd29yZCBwcm90ZWN0ZWQifSwgLy8tc3JjcHJvdGVjdGVkCi0gICAgICAgIHsic291cmNlLmtleXN0b3JlLnByb3ZpZGVyLm5hbWUiLAotICAgICAgICAgICAgICAgICJzb3VyY2Uga2V5c3RvcmUgcHJvdmlkZXIgbmFtZSJ9LCAvLy1zcmNwcm92aWRlcm5hbWUKLSAgICAgICAgeyJzb3VyY2Uua2V5c3RvcmUucGFzc3dvcmQiLAotICAgICAgICAgICAgICAgICJzb3VyY2Uga2V5c3RvcmUgcGFzc3dvcmQifSwgLy8tc3Jjc3RvcmVwYXNzCi0gICAgICAgIHsic291cmNlLmtleXN0b3JlLnR5cGUiLAotICAgICAgICAgICAgICAgICJzb3VyY2Uga2V5c3RvcmUgdHlwZSJ9LCAvLy1zcmNzdG9yZXR5cGUKLSAgICAgICAgeyJTU0wuc2VydmVyLmhvc3QuYW5kLnBvcnQiLAotICAgICAgICAgICAgICAgICJTU0wgc2VydmVyIGhvc3QgYW5kIHBvcnQifSwgLy8tc3Nsc2VydmVyCi0gICAgICAgIHsic2lnbmVkLmphci5maWxlIiwKLSAgICAgICAgICAgICAgICAic2lnbmVkIGphciBmaWxlIn0sIC8vPWphcmZpbGUKLSAgICAgICAgeyJjZXJ0aWZpY2F0ZS52YWxpZGl0eS5zdGFydC5kYXRlLnRpbWUiLAotICAgICAgICAgICAgICAgICJjZXJ0aWZpY2F0ZSB2YWxpZGl0eSBzdGFydCBkYXRlL3RpbWUifSwgLy8tc3RhcnRkYXRlCi0gICAgICAgIHsia2V5c3RvcmUucGFzc3dvcmQiLAotICAgICAgICAgICAgICAgICJrZXlzdG9yZSBwYXNzd29yZCJ9LCAvLy1zdG9yZXBhc3MKLSAgICAgICAgeyJrZXlzdG9yZS50eXBlIiwKLSAgICAgICAgICAgICAgICAia2V5c3RvcmUgdHlwZSJ9LCAvLy1zdG9yZXR5cGUKLSAgICAgICAgeyJ0cnVzdC5jZXJ0aWZpY2F0ZXMuZnJvbS5jYWNlcnRzIiwKLSAgICAgICAgICAgICAgICAidHJ1c3QgY2VydGlmaWNhdGVzIGZyb20gY2FjZXJ0cyJ9LCAvLy10cnVzdGNhY2VydHMKLSAgICAgICAgeyJ2ZXJib3NlLm91dHB1dCIsCi0gICAgICAgICAgICAgICAgInZlcmJvc2Ugb3V0cHV0In0sIC8vLXYKLSAgICAgICAgeyJ2YWxpZGl0eS5udW1iZXIub2YuZGF5cyIsCi0gICAgICAgICAgICAgICAgInZhbGlkaXR5IG51bWJlciBvZiBkYXlzIn0sIC8vLXZhbGlkaXR5Ci0gICAgICAgIHsiU2VyaWFsLklELm9mLmNlcnQudG8ucmV2b2tlIiwKLSAgICAgICAgICAgICAgICAgIlNlcmlhbCBJRCBvZiBjZXJ0IHRvIHJldm9rZSJ9LCAvLy1pZAotICAgICAgICAvLyBrZXl0b29sOiBSdW5uaW5nIHBhcnQKLSAgICAgICAgeyJrZXl0b29sLmVycm9yLiIsICJrZXl0b29sIGVycm9yOiAifSwKLSAgICAgICAgeyJJbGxlZ2FsLm9wdGlvbi4iLCAiSWxsZWdhbCBvcHRpb246ICAifSwKLSAgICAgICAgeyJJbGxlZ2FsLnZhbHVlLiIsICJJbGxlZ2FsIHZhbHVlOiAifSwKLSAgICAgICAgeyJVbmtub3duLnBhc3N3b3JkLnR5cGUuIiwgIlVua25vd24gcGFzc3dvcmQgdHlwZTogIn0sCi0gICAgICAgIHsiQ2Fubm90LmZpbmQuZW52aXJvbm1lbnQudmFyaWFibGUuIiwKLSAgICAgICAgICAgICAgICAiQ2Fubm90IGZpbmQgZW52aXJvbm1lbnQgdmFyaWFibGU6ICJ9LAotICAgICAgICB7IkNhbm5vdC5maW5kLmZpbGUuIiwgIkNhbm5vdCBmaW5kIGZpbGU6ICJ9LAotICAgICAgICB7IkNvbW1hbmQub3B0aW9uLmZsYWcubmVlZHMuYW4uYXJndW1lbnQuIiwgIkNvbW1hbmQgb3B0aW9uIHswfSBuZWVkcyBhbiBhcmd1bWVudC4ifSwKLSAgICAgICAgeyJXYXJuaW5nLkRpZmZlcmVudC5zdG9yZS5hbmQua2V5LnBhc3N3b3Jkcy5ub3Quc3VwcG9ydGVkLmZvci5QS0NTMTIuS2V5U3RvcmVzLklnbm9yaW5nLnVzZXIuc3BlY2lmaWVkLmNvbW1hbmQudmFsdWUuIiwKLSAgICAgICAgICAgICAgICAiV2FybmluZzogIERpZmZlcmVudCBzdG9yZSBhbmQga2V5IHBhc3N3b3JkcyBub3Qgc3VwcG9ydGVkIGZvciBQS0NTMTIgS2V5U3RvcmVzLiBJZ25vcmluZyB1c2VyLXNwZWNpZmllZCB7MH0gdmFsdWUuIn0sCi0gICAgICAgIHsiLmtleXN0b3JlLm11c3QuYmUuTk9ORS5pZi5zdG9yZXR5cGUuaXMuezB9IiwKLSAgICAgICAgICAgICAgICAiLWtleXN0b3JlIG11c3QgYmUgTk9ORSBpZiAtc3RvcmV0eXBlIGlzIHswfSJ9LAotICAgICAgICB7IlRvby5tYW55LnJldHJpZXMucHJvZ3JhbS50ZXJtaW5hdGVkIiwKLSAgICAgICAgICAgICAgICAgIlRvbyBtYW55IHJldHJpZXMsIHByb2dyYW0gdGVybWluYXRlZCJ9LAotICAgICAgICB7Ii5zdG9yZXBhc3N3ZC5hbmQua2V5cGFzc3dkLmNvbW1hbmRzLm5vdC5zdXBwb3J0ZWQuaWYuc3RvcmV0eXBlLmlzLnswfSIsCi0gICAgICAgICAgICAgICAgIi1zdG9yZXBhc3N3ZCBhbmQgLWtleXBhc3N3ZCBjb21tYW5kcyBub3Qgc3VwcG9ydGVkIGlmIC1zdG9yZXR5cGUgaXMgezB9In0sCi0gICAgICAgIHsiLmtleXBhc3N3ZC5jb21tYW5kcy5ub3Quc3VwcG9ydGVkLmlmLnN0b3JldHlwZS5pcy5QS0NTMTIiLAotICAgICAgICAgICAgICAgICIta2V5cGFzc3dkIGNvbW1hbmRzIG5vdCBzdXBwb3J0ZWQgaWYgLXN0b3JldHlwZSBpcyBQS0NTMTIifSwKLSAgICAgICAgeyIua2V5cGFzcy5hbmQubmV3LmNhbi5ub3QuYmUuc3BlY2lmaWVkLmlmLnN0b3JldHlwZS5pcy57MH0iLAotICAgICAgICAgICAgICAgICIta2V5cGFzcyBhbmQgLW5ldyBjYW4gbm90IGJlIHNwZWNpZmllZCBpZiAtc3RvcmV0eXBlIGlzIHswfSJ9LAotICAgICAgICB7ImlmLnByb3RlY3RlZC5pcy5zcGVjaWZpZWQudGhlbi5zdG9yZXBhc3Mua2V5cGFzcy5hbmQubmV3Lm11c3Qubm90LmJlLnNwZWNpZmllZCIsCi0gICAgICAgICAgICAgICAgImlmIC1wcm90ZWN0ZWQgaXMgc3BlY2lmaWVkLCB0aGVuIC1zdG9yZXBhc3MsIC1rZXlwYXNzLCBhbmQgLW5ldyBtdXN0IG5vdCBiZSBzcGVjaWZpZWQifSwKLSAgICAgICAgeyJpZi5zcmNwcm90ZWN0ZWQuaXMuc3BlY2lmaWVkLnRoZW4uc3Jjc3RvcmVwYXNzLmFuZC5zcmNrZXlwYXNzLm11c3Qubm90LmJlLnNwZWNpZmllZCIsCi0gICAgICAgICAgICAgICAgImlmIC1zcmNwcm90ZWN0ZWQgaXMgc3BlY2lmaWVkLCB0aGVuIC1zcmNzdG9yZXBhc3MgYW5kIC1zcmNrZXlwYXNzIG11c3Qgbm90IGJlIHNwZWNpZmllZCJ9LAotICAgICAgICB7ImlmLmtleXN0b3JlLmlzLm5vdC5wYXNzd29yZC5wcm90ZWN0ZWQudGhlbi5zdG9yZXBhc3Mua2V5cGFzcy5hbmQubmV3Lm11c3Qubm90LmJlLnNwZWNpZmllZCIsCi0gICAgICAgICAgICAgICAgImlmIGtleXN0b3JlIGlzIG5vdCBwYXNzd29yZCBwcm90ZWN0ZWQsIHRoZW4gLXN0b3JlcGFzcywgLWtleXBhc3MsIGFuZCAtbmV3IG11c3Qgbm90IGJlIHNwZWNpZmllZCJ9LAotICAgICAgICB7ImlmLnNvdXJjZS5rZXlzdG9yZS5pcy5ub3QucGFzc3dvcmQucHJvdGVjdGVkLnRoZW4uc3Jjc3RvcmVwYXNzLmFuZC5zcmNrZXlwYXNzLm11c3Qubm90LmJlLnNwZWNpZmllZCIsCi0gICAgICAgICAgICAgICAgImlmIHNvdXJjZSBrZXlzdG9yZSBpcyBub3QgcGFzc3dvcmQgcHJvdGVjdGVkLCB0aGVuIC1zcmNzdG9yZXBhc3MgYW5kIC1zcmNrZXlwYXNzIG11c3Qgbm90IGJlIHNwZWNpZmllZCJ9LAotICAgICAgICB7IklsbGVnYWwuc3RhcnRkYXRlLnZhbHVlIiwgIklsbGVnYWwgc3RhcnRkYXRlIHZhbHVlIn0sCi0gICAgICAgIHsiVmFsaWRpdHkubXVzdC5iZS5ncmVhdGVyLnRoYW4uemVybyIsCi0gICAgICAgICAgICAgICAgIlZhbGlkaXR5IG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8ifSwKLSAgICAgICAgeyJwcm92TmFtZS5ub3QuYS5wcm92aWRlciIsICJ7MH0gbm90IGEgcHJvdmlkZXIifSwKLSAgICAgICAgeyJVc2FnZS5lcnJvci5uby5jb21tYW5kLnByb3ZpZGVkIiwgIlVzYWdlIGVycm9yOiBubyBjb21tYW5kIHByb3ZpZGVkIn0sCi0gICAgICAgIHsiU291cmNlLmtleXN0b3JlLmZpbGUuZXhpc3RzLmJ1dC5pcy5lbXB0eS4iLCAiU291cmNlIGtleXN0b3JlIGZpbGUgZXhpc3RzLCBidXQgaXMgZW1wdHk6ICJ9LAotICAgICAgICB7IlBsZWFzZS5zcGVjaWZ5LnNyY2tleXN0b3JlIiwgIlBsZWFzZSBzcGVjaWZ5IC1zcmNrZXlzdG9yZSJ9LAotICAgICAgICB7Ik11c3Qubm90LnNwZWNpZnkuYm90aC52LmFuZC5yZmMud2l0aC5saXN0LmNvbW1hbmQiLAotICAgICAgICAgICAgICAgICJNdXN0IG5vdCBzcGVjaWZ5IGJvdGggLXYgYW5kIC1yZmMgd2l0aCAnbGlzdCcgY29tbWFuZCJ9LAotICAgICAgICB7IktleS5wYXNzd29yZC5tdXN0LmJlLmF0LmxlYXN0LjYuY2hhcmFjdGVycyIsCi0gICAgICAgICAgICAgICAgIktleSBwYXNzd29yZCBtdXN0IGJlIGF0IGxlYXN0IDYgY2hhcmFjdGVycyJ9LAotICAgICAgICB7Ik5ldy5wYXNzd29yZC5tdXN0LmJlLmF0LmxlYXN0LjYuY2hhcmFjdGVycyIsCi0gICAgICAgICAgICAgICAgIk5ldyBwYXNzd29yZCBtdXN0IGJlIGF0IGxlYXN0IDYgY2hhcmFjdGVycyJ9LAotICAgICAgICB7IktleXN0b3JlLmZpbGUuZXhpc3RzLmJ1dC5pcy5lbXB0eS4iLAotICAgICAgICAgICAgICAgICJLZXlzdG9yZSBmaWxlIGV4aXN0cywgYnV0IGlzIGVtcHR5OiAifSwKLSAgICAgICAgeyJLZXlzdG9yZS5maWxlLmRvZXMubm90LmV4aXN0LiIsCi0gICAgICAgICAgICAgICAgIktleXN0b3JlIGZpbGUgZG9lcyBub3QgZXhpc3Q6ICJ9LAotICAgICAgICB7Ik11c3Quc3BlY2lmeS5kZXN0aW5hdGlvbi5hbGlhcyIsICJNdXN0IHNwZWNpZnkgZGVzdGluYXRpb24gYWxpYXMifSwKLSAgICAgICAgeyJNdXN0LnNwZWNpZnkuYWxpYXMiLCAiTXVzdCBzcGVjaWZ5IGFsaWFzIn0sCi0gICAgICAgIHsiS2V5c3RvcmUucGFzc3dvcmQubXVzdC5iZS5hdC5sZWFzdC42LmNoYXJhY3RlcnMiLAotICAgICAgICAgICAgICAgICJLZXlzdG9yZSBwYXNzd29yZCBtdXN0IGJlIGF0IGxlYXN0IDYgY2hhcmFjdGVycyJ9LAotICAgICAgICB7IkVudGVyLmtleXN0b3JlLnBhc3N3b3JkLiIsICJFbnRlciBrZXlzdG9yZSBwYXNzd29yZDogICJ9LAotICAgICAgICB7IkVudGVyLnNvdXJjZS5rZXlzdG9yZS5wYXNzd29yZC4iLCAiRW50ZXIgc291cmNlIGtleXN0b3JlIHBhc3N3b3JkOiAgIn0sCi0gICAgICAgIHsiRW50ZXIuZGVzdGluYXRpb24ua2V5c3RvcmUucGFzc3dvcmQuIiwgIkVudGVyIGRlc3RpbmF0aW9uIGtleXN0b3JlIHBhc3N3b3JkOiAgIn0sCi0gICAgICAgIHsiS2V5c3RvcmUucGFzc3dvcmQuaXMudG9vLnNob3J0Lm11c3QuYmUuYXQubGVhc3QuNi5jaGFyYWN0ZXJzIiwKLSAgICAgICAgICJLZXlzdG9yZSBwYXNzd29yZCBpcyB0b28gc2hvcnQgLSBtdXN0IGJlIGF0IGxlYXN0IDYgY2hhcmFjdGVycyJ9LAotICAgICAgICB7IlVua25vd24uRW50cnkuVHlwZSIsICJVbmtub3duIEVudHJ5IFR5cGUifSwKLSAgICAgICAgeyJUb28ubWFueS5mYWlsdXJlcy5BbGlhcy5ub3QuY2hhbmdlZCIsICJUb28gbWFueSBmYWlsdXJlcy4gQWxpYXMgbm90IGNoYW5nZWQifSwKLSAgICAgICAgeyJFbnRyeS5mb3IuYWxpYXMuYWxpYXMuc3VjY2Vzc2Z1bGx5LmltcG9ydGVkLiIsCi0gICAgICAgICAgICAgICAgICJFbnRyeSBmb3IgYWxpYXMgezB9IHN1Y2Nlc3NmdWxseSBpbXBvcnRlZC4ifSwKLSAgICAgICAgeyJFbnRyeS5mb3IuYWxpYXMuYWxpYXMubm90LmltcG9ydGVkLiIsICJFbnRyeSBmb3IgYWxpYXMgezB9IG5vdCBpbXBvcnRlZC4ifSwKLSAgICAgICAgeyJQcm9ibGVtLmltcG9ydGluZy5lbnRyeS5mb3IuYWxpYXMuYWxpYXMuZXhjZXB0aW9uLkVudHJ5LmZvci5hbGlhcy5hbGlhcy5ub3QuaW1wb3J0ZWQuIiwKLSAgICAgICAgICAgICAgICAgIlByb2JsZW0gaW1wb3J0aW5nIGVudHJ5IGZvciBhbGlhcyB7MH06IHsxfS5cbkVudHJ5IGZvciBhbGlhcyB7MH0gbm90IGltcG9ydGVkLiJ9LAotICAgICAgICB7IkltcG9ydC5jb21tYW5kLmNvbXBsZXRlZC5vay5lbnRyaWVzLnN1Y2Nlc3NmdWxseS5pbXBvcnRlZC5mYWlsLmVudHJpZXMuZmFpbGVkLm9yLmNhbmNlbGxlZCIsCi0gICAgICAgICAgICAgICAgICJJbXBvcnQgY29tbWFuZCBjb21wbGV0ZWQ6ICB7MH0gZW50cmllcyBzdWNjZXNzZnVsbHkgaW1wb3J0ZWQsIHsxfSBlbnRyaWVzIGZhaWxlZCBvciBjYW5jZWxsZWQifSwKLSAgICAgICAgeyJXYXJuaW5nLk92ZXJ3cml0aW5nLmV4aXN0aW5nLmFsaWFzLmFsaWFzLmluLmRlc3RpbmF0aW9uLmtleXN0b3JlIiwKLSAgICAgICAgICAgICAgICAgIldhcm5pbmc6IE92ZXJ3cml0aW5nIGV4aXN0aW5nIGFsaWFzIHswfSBpbiBkZXN0aW5hdGlvbiBrZXlzdG9yZSJ9LAotICAgICAgICB7IkV4aXN0aW5nLmVudHJ5LmFsaWFzLmFsaWFzLmV4aXN0cy5vdmVyd3JpdGUubm8uIiwKLSAgICAgICAgICAgICAgICAgIkV4aXN0aW5nIGVudHJ5IGFsaWFzIHswfSBleGlzdHMsIG92ZXJ3cml0ZT8gW25vXTogICJ9LAotICAgICAgICB7IlRvby5tYW55LmZhaWx1cmVzLnRyeS5sYXRlciIsICJUb28gbWFueSBmYWlsdXJlcyAtIHRyeSBsYXRlciJ9LAotICAgICAgICB7IkNlcnRpZmljYXRpb24ucmVxdWVzdC5zdG9yZWQuaW4uZmlsZS5maWxlbmFtZS4iLAotICAgICAgICAgICAgICAgICJDZXJ0aWZpY2F0aW9uIHJlcXVlc3Qgc3RvcmVkIGluIGZpbGUgPHswfT4ifSwKLSAgICAgICAgeyJTdWJtaXQudGhpcy50by55b3VyLkNBIiwgIlN1Ym1pdCB0aGlzIHRvIHlvdXIgQ0EifSwKLSAgICAgICAgeyJpZi5hbGlhcy5ub3Quc3BlY2lmaWVkLmRlc3RhbGlhcy5zcmNrZXlwYXNzLmFuZC5kZXN0a2V5cGFzcy5tdXN0Lm5vdC5iZS5zcGVjaWZpZWQiLAotICAgICAgICAgICAgImlmIGFsaWFzIG5vdCBzcGVjaWZpZWQsIGRlc3RhbGlhcywgc3Jja2V5cGFzcywgYW5kIGRlc3RrZXlwYXNzIG11c3Qgbm90IGJlIHNwZWNpZmllZCJ9LAotICAgICAgICB7IkNlcnRpZmljYXRlLnN0b3JlZC5pbi5maWxlLmZpbGVuYW1lLiIsCi0gICAgICAgICAgICAgICAgIkNlcnRpZmljYXRlIHN0b3JlZCBpbiBmaWxlIDx7MH0+In0sCi0gICAgICAgIHsiQ2VydGlmaWNhdGUucmVwbHkud2FzLmluc3RhbGxlZC5pbi5rZXlzdG9yZSIsCi0gICAgICAgICAgICAgICAgIkNlcnRpZmljYXRlIHJlcGx5IHdhcyBpbnN0YWxsZWQgaW4ga2V5c3RvcmUifSwKLSAgICAgICAgeyJDZXJ0aWZpY2F0ZS5yZXBseS53YXMubm90Lmluc3RhbGxlZC5pbi5rZXlzdG9yZSIsCi0gICAgICAgICAgICAgICAgIkNlcnRpZmljYXRlIHJlcGx5IHdhcyBub3QgaW5zdGFsbGVkIGluIGtleXN0b3JlIn0sCi0gICAgICAgIHsiQ2VydGlmaWNhdGUud2FzLmFkZGVkLnRvLmtleXN0b3JlIiwKLSAgICAgICAgICAgICAgICAiQ2VydGlmaWNhdGUgd2FzIGFkZGVkIHRvIGtleXN0b3JlIn0sCi0gICAgICAgIHsiQ2VydGlmaWNhdGUud2FzLm5vdC5hZGRlZC50by5rZXlzdG9yZSIsCi0gICAgICAgICAgICAgICAgIkNlcnRpZmljYXRlIHdhcyBub3QgYWRkZWQgdG8ga2V5c3RvcmUifSwKLSAgICAgICAgeyIuU3RvcmluZy5rc2ZuYW1lLiIsICJbU3RvcmluZyB7MH1dIn0sCi0gICAgICAgIHsiYWxpYXMuaGFzLm5vLnB1YmxpYy5rZXkuY2VydGlmaWNhdGUuIiwKLSAgICAgICAgICAgICAgICAiezB9IGhhcyBubyBwdWJsaWMga2V5IChjZXJ0aWZpY2F0ZSkifSwKLSAgICAgICAgeyJDYW5ub3QuZGVyaXZlLnNpZ25hdHVyZS5hbGdvcml0aG0iLAotICAgICAgICAgICAgICAgICJDYW5ub3QgZGVyaXZlIHNpZ25hdHVyZSBhbGdvcml0aG0ifSwKLSAgICAgICAgeyJBbGlhcy5hbGlhcy5kb2VzLm5vdC5leGlzdCIsCi0gICAgICAgICAgICAgICAgIkFsaWFzIDx7MH0+IGRvZXMgbm90IGV4aXN0In0sCi0gICAgICAgIHsiQWxpYXMuYWxpYXMuaGFzLm5vLmNlcnRpZmljYXRlIiwKLSAgICAgICAgICAgICAgICAiQWxpYXMgPHswfT4gaGFzIG5vIGNlcnRpZmljYXRlIn0sCi0gICAgICAgIHsiS2V5LnBhaXIubm90LmdlbmVyYXRlZC5hbGlhcy5hbGlhcy5hbHJlYWR5LmV4aXN0cyIsCi0gICAgICAgICAgICAgICAgIktleSBwYWlyIG5vdCBnZW5lcmF0ZWQsIGFsaWFzIDx7MH0+IGFscmVhZHkgZXhpc3RzIn0sCi0gICAgICAgIHsiR2VuZXJhdGluZy5rZXlzaXplLmJpdC5rZXlBbGdOYW1lLmtleS5wYWlyLmFuZC5zZWxmLnNpZ25lZC5jZXJ0aWZpY2F0ZS5zaWdBbGdOYW1lLndpdGguYS52YWxpZGl0eS5vZi52YWxpZGFsaXR5LmRheXMuZm9yIiwKLSAgICAgICAgICAgICAgICAiR2VuZXJhdGluZyB7MH0gYml0IHsxfSBrZXkgcGFpciBhbmQgc2VsZi1zaWduZWQgY2VydGlmaWNhdGUgKHsyfSkgd2l0aCBhIHZhbGlkaXR5IG9mIHszfSBkYXlzXG5cdGZvcjogezR9In0sCi0gICAgICAgIHsiRW50ZXIua2V5LnBhc3N3b3JkLmZvci5hbGlhcy4iLCAiRW50ZXIga2V5IHBhc3N3b3JkIGZvciA8ezB9PiJ9LAotICAgICAgICB7Ii5SRVRVUk4uaWYuc2FtZS5hcy5rZXlzdG9yZS5wYXNzd29yZC4iLAotICAgICAgICAgICAgICAgICJcdChSRVRVUk4gaWYgc2FtZSBhcyBrZXlzdG9yZSBwYXNzd29yZCk6ICAifSwKLSAgICAgICAgeyJLZXkucGFzc3dvcmQuaXMudG9vLnNob3J0Lm11c3QuYmUuYXQubGVhc3QuNi5jaGFyYWN0ZXJzIiwKLSAgICAgICAgICAgICAgICAiS2V5IHBhc3N3b3JkIGlzIHRvbyBzaG9ydCAtIG11c3QgYmUgYXQgbGVhc3QgNiBjaGFyYWN0ZXJzIn0sCi0gICAgICAgIHsiVG9vLm1hbnkuZmFpbHVyZXMua2V5Lm5vdC5hZGRlZC50by5rZXlzdG9yZSIsCi0gICAgICAgICAgICAgICAgIlRvbyBtYW55IGZhaWx1cmVzIC0ga2V5IG5vdCBhZGRlZCB0byBrZXlzdG9yZSJ9LAotICAgICAgICB7IkRlc3RpbmF0aW9uLmFsaWFzLmRlc3QuYWxyZWFkeS5leGlzdHMiLAotICAgICAgICAgICAgICAgICJEZXN0aW5hdGlvbiBhbGlhcyA8ezB9PiBhbHJlYWR5IGV4aXN0cyJ9LAotICAgICAgICB7IlBhc3N3b3JkLmlzLnRvby5zaG9ydC5tdXN0LmJlLmF0LmxlYXN0LjYuY2hhcmFjdGVycyIsCi0gICAgICAgICAgICAgICAgIlBhc3N3b3JkIGlzIHRvbyBzaG9ydCAtIG11c3QgYmUgYXQgbGVhc3QgNiBjaGFyYWN0ZXJzIn0sCi0gICAgICAgIHsiVG9vLm1hbnkuZmFpbHVyZXMuS2V5LmVudHJ5Lm5vdC5jbG9uZWQiLAotICAgICAgICAgICAgICAgICJUb28gbWFueSBmYWlsdXJlcy4gS2V5IGVudHJ5IG5vdCBjbG9uZWQifSwKLSAgICAgICAgeyJrZXkucGFzc3dvcmQuZm9yLmFsaWFzLiIsICJrZXkgcGFzc3dvcmQgZm9yIDx7MH0+In0sCi0gICAgICAgIHsiS2V5c3RvcmUuZW50cnkuZm9yLmlkLmdldE5hbWUuYWxyZWFkeS5leGlzdHMiLAotICAgICAgICAgICAgICAgICJLZXlzdG9yZSBlbnRyeSBmb3IgPHswfT4gYWxyZWFkeSBleGlzdHMifSwKLSAgICAgICAgeyJDcmVhdGluZy5rZXlzdG9yZS5lbnRyeS5mb3IuaWQuZ2V0TmFtZS4iLAotICAgICAgICAgICAgICAgICJDcmVhdGluZyBrZXlzdG9yZSBlbnRyeSBmb3IgPHswfT4gLi4uIn0sCi0gICAgICAgIHsiTm8uZW50cmllcy5mcm9tLmlkZW50aXR5LmRhdGFiYXNlLmFkZGVkIiwKLSAgICAgICAgICAgICAgICAiTm8gZW50cmllcyBmcm9tIGlkZW50aXR5IGRhdGFiYXNlIGFkZGVkIn0sCi0gICAgICAgIHsiQWxpYXMubmFtZS5hbGlhcyIsICJBbGlhcyBuYW1lOiB7MH0ifSwKLSAgICAgICAgeyJDcmVhdGlvbi5kYXRlLmtleVN0b3JlLmdldENyZWF0aW9uRGF0ZS5hbGlhcy4iLAotICAgICAgICAgICAgICAgICJDcmVhdGlvbiBkYXRlOiB7MCxkYXRlfSJ9LAotICAgICAgICB7ImFsaWFzLmtleVN0b3JlLmdldENyZWF0aW9uRGF0ZS5hbGlhcy4iLAotICAgICAgICAgICAgICAgICJ7MH0sIHsxLGRhdGV9LCAifSwKLSAgICAgICAgeyJhbGlhcy4iLCAiezB9LCAifSwKLSAgICAgICAgeyJFbnRyeS50eXBlLnR5cGUuIiwgIkVudHJ5IHR5cGU6IHswfSJ9LAotICAgICAgICB7IkNlcnRpZmljYXRlLmNoYWluLmxlbmd0aC4iLCAiQ2VydGlmaWNhdGUgY2hhaW4gbGVuZ3RoOiAifSwKLSAgICAgICAgeyJDZXJ0aWZpY2F0ZS5pLjEuIiwgIkNlcnRpZmljYXRlW3swLG51bWJlcixpbnRlZ2VyfV06In0sCi0gICAgICAgIHsiQ2VydGlmaWNhdGUuZmluZ2VycHJpbnQuU0hBMS4iLCAiQ2VydGlmaWNhdGUgZmluZ2VycHJpbnQgKFNIQTEpOiAifSwKLSAgICAgICAgeyJLZXlzdG9yZS50eXBlLiIsICJLZXlzdG9yZSB0eXBlOiAifSwKLSAgICAgICAgeyJLZXlzdG9yZS5wcm92aWRlci4iLCAiS2V5c3RvcmUgcHJvdmlkZXI6ICJ9LAotICAgICAgICB7IllvdXIua2V5c3RvcmUuY29udGFpbnMua2V5U3RvcmUuc2l6ZS5lbnRyeSIsCi0gICAgICAgICAgICAgICAgIllvdXIga2V5c3RvcmUgY29udGFpbnMgezAsbnVtYmVyLGludGVnZXJ9IGVudHJ5In0sCi0gICAgICAgIHsiWW91ci5rZXlzdG9yZS5jb250YWlucy5rZXlTdG9yZS5zaXplLmVudHJpZXMiLAotICAgICAgICAgICAgICAgICJZb3VyIGtleXN0b3JlIGNvbnRhaW5zIHswLG51bWJlcixpbnRlZ2VyfSBlbnRyaWVzIn0sCi0gICAgICAgIHsiRmFpbGVkLnRvLnBhcnNlLmlucHV0IiwgIkZhaWxlZCB0byBwYXJzZSBpbnB1dCJ9LAotICAgICAgICB7IkVtcHR5LmlucHV0IiwgIkVtcHR5IGlucHV0In0sCi0gICAgICAgIHsiTm90LlguNTA5LmNlcnRpZmljYXRlIiwgIk5vdCBYLjUwOSBjZXJ0aWZpY2F0ZSJ9LAotICAgICAgICB7ImFsaWFzLmhhcy5uby5wdWJsaWMua2V5IiwgInswfSBoYXMgbm8gcHVibGljIGtleSJ9LAotICAgICAgICB7ImFsaWFzLmhhcy5uby5YLjUwOS5jZXJ0aWZpY2F0ZSIsICJ7MH0gaGFzIG5vIFguNTA5IGNlcnRpZmljYXRlIn0sCi0gICAgICAgIHsiTmV3LmNlcnRpZmljYXRlLnNlbGYuc2lnbmVkLiIsICJOZXcgY2VydGlmaWNhdGUgKHNlbGYtc2lnbmVkKToifSwKLSAgICAgICAgeyJSZXBseS5oYXMubm8uY2VydGlmaWNhdGVzIiwgIlJlcGx5IGhhcyBubyBjZXJ0aWZpY2F0ZXMifSwKLSAgICAgICAgeyJDZXJ0aWZpY2F0ZS5ub3QuaW1wb3J0ZWQuYWxpYXMuYWxpYXMuYWxyZWFkeS5leGlzdHMiLAotICAgICAgICAgICAgICAgICJDZXJ0aWZpY2F0ZSBub3QgaW1wb3J0ZWQsIGFsaWFzIDx7MH0+IGFscmVhZHkgZXhpc3RzIn0sCi0gICAgICAgIHsiSW5wdXQubm90LmFuLlguNTA5LmNlcnRpZmljYXRlIiwgIklucHV0IG5vdCBhbiBYLjUwOSBjZXJ0aWZpY2F0ZSJ9LAotICAgICAgICB7IkNlcnRpZmljYXRlLmFscmVhZHkuZXhpc3RzLmluLmtleXN0b3JlLnVuZGVyLmFsaWFzLnRydXN0YWxpYXMuIiwKLSAgICAgICAgICAgICAgICAiQ2VydGlmaWNhdGUgYWxyZWFkeSBleGlzdHMgaW4ga2V5c3RvcmUgdW5kZXIgYWxpYXMgPHswfT4ifSwKLSAgICAgICAgeyJEby55b3Uuc3RpbGwud2FudC50by5hZGQuaXQubm8uIiwKLSAgICAgICAgICAgICAgICAiRG8geW91IHN0aWxsIHdhbnQgdG8gYWRkIGl0PyBbbm9dOiAgIn0sCi0gICAgICAgIHsiQ2VydGlmaWNhdGUuYWxyZWFkeS5leGlzdHMuaW4uc3lzdGVtLndpZGUuQ0Eua2V5c3RvcmUudW5kZXIuYWxpYXMudHJ1c3RhbGlhcy4iLAotICAgICAgICAgICAgICAgICJDZXJ0aWZpY2F0ZSBhbHJlYWR5IGV4aXN0cyBpbiBzeXN0ZW0td2lkZSBDQSBrZXlzdG9yZSB1bmRlciBhbGlhcyA8ezB9PiJ9LAotICAgICAgICB7IkRvLnlvdS5zdGlsbC53YW50LnRvLmFkZC5pdC50by55b3VyLm93bi5rZXlzdG9yZS5uby4iLAotICAgICAgICAgICAgICAgICJEbyB5b3Ugc3RpbGwgd2FudCB0byBhZGQgaXQgdG8geW91ciBvd24ga2V5c3RvcmU/IFtub106ICAifSwKLSAgICAgICAgeyJUcnVzdC50aGlzLmNlcnRpZmljYXRlLm5vLiIsICJUcnVzdCB0aGlzIGNlcnRpZmljYXRlPyBbbm9dOiAgIn0sCi0gICAgICAgIHsiWUVTIiwgIllFUyJ9LAotICAgICAgICB7Ik5ldy5wcm9tcHQuIiwgIk5ldyB7MH06ICJ9LAotICAgICAgICB7IlBhc3N3b3Jkcy5tdXN0LmRpZmZlciIsICJQYXNzd29yZHMgbXVzdCBkaWZmZXIifSwKLSAgICAgICAgeyJSZS5lbnRlci5uZXcucHJvbXB0LiIsICJSZS1lbnRlciBuZXcgezB9OiAifSwKLSAgICAgICAgeyJSZS5lbnRlci5uZXcucGFzc3dvcmQuIiwgIlJlLWVudGVyIG5ldyBwYXNzd29yZDogIn0sCi0gICAgICAgIHsiVGhleS5kb24udC5tYXRjaC5UcnkuYWdhaW4iLCAiVGhleSBkb24ndCBtYXRjaC4gVHJ5IGFnYWluIn0sCi0gICAgICAgIHsiRW50ZXIucHJvbXB0LmFsaWFzLm5hbWUuIiwgIkVudGVyIHswfSBhbGlhcyBuYW1lOiAgIn0sCi0gICAgICAgIHsiRW50ZXIubmV3LmFsaWFzLm5hbWUuUkVUVVJOLnRvLmNhbmNlbC5pbXBvcnQuZm9yLnRoaXMuZW50cnkuIiwKLSAgICAgICAgICAgICAgICAgIkVudGVyIG5ldyBhbGlhcyBuYW1lXHQoUkVUVVJOIHRvIGNhbmNlbCBpbXBvcnQgZm9yIHRoaXMgZW50cnkpOiAgIn0sCi0gICAgICAgIHsiRW50ZXIuYWxpYXMubmFtZS4iLCAiRW50ZXIgYWxpYXMgbmFtZTogICJ9LAotICAgICAgICB7Ii5SRVRVUk4uaWYuc2FtZS5hcy5mb3Iub3RoZXJBbGlhcy4iLAotICAgICAgICAgICAgICAgICJcdChSRVRVUk4gaWYgc2FtZSBhcyBmb3IgPHswfT4pIn0sCi0gICAgICAgIHsiLlBBVFRFUk4ucHJpbnRYNTA5Q2VydCIsCi0gICAgICAgICAgICAgICAgIk93bmVyOiB7MH1cbklzc3VlcjogezF9XG5TZXJpYWwgbnVtYmVyOiB7Mn1cblZhbGlkIGZyb206IHszfSB1bnRpbDogezR9XG5DZXJ0aWZpY2F0ZSBmaW5nZXJwcmludHM6XG5cdCBNRDU6ICB7NX1cblx0IFNIQTE6IHs2fVxuXHQgU0hBMjU2OiB7N31cblx0IFNpZ25hdHVyZSBhbGdvcml0aG0gbmFtZTogezh9XG5cdCBWZXJzaW9uOiB7OX0ifSwKLSAgICAgICAgeyJXaGF0LmlzLnlvdXIuZmlyc3QuYW5kLmxhc3QubmFtZS4iLAotICAgICAgICAgICAgICAgICJXaGF0IGlzIHlvdXIgZmlyc3QgYW5kIGxhc3QgbmFtZT8ifSwKLSAgICAgICAgeyJXaGF0LmlzLnRoZS5uYW1lLm9mLnlvdXIub3JnYW5pemF0aW9uYWwudW5pdC4iLAotICAgICAgICAgICAgICAgICJXaGF0IGlzIHRoZSBuYW1lIG9mIHlvdXIgb3JnYW5pemF0aW9uYWwgdW5pdD8ifSwKLSAgICAgICAgeyJXaGF0LmlzLnRoZS5uYW1lLm9mLnlvdXIub3JnYW5pemF0aW9uLiIsCi0gICAgICAgICAgICAgICAgIldoYXQgaXMgdGhlIG5hbWUgb2YgeW91ciBvcmdhbml6YXRpb24/In0sCi0gICAgICAgIHsiV2hhdC5pcy50aGUubmFtZS5vZi55b3VyLkNpdHkub3IuTG9jYWxpdHkuIiwKLSAgICAgICAgICAgICAgICAiV2hhdCBpcyB0aGUgbmFtZSBvZiB5b3VyIENpdHkgb3IgTG9jYWxpdHk/In0sCi0gICAgICAgIHsiV2hhdC5pcy50aGUubmFtZS5vZi55b3VyLlN0YXRlLm9yLlByb3ZpbmNlLiIsCi0gICAgICAgICAgICAgICAgIldoYXQgaXMgdGhlIG5hbWUgb2YgeW91ciBTdGF0ZSBvciBQcm92aW5jZT8ifSwKLSAgICAgICAgeyJXaGF0LmlzLnRoZS50d28ubGV0dGVyLmNvdW50cnkuY29kZS5mb3IudGhpcy51bml0LiIsCi0gICAgICAgICAgICAgICAgIldoYXQgaXMgdGhlIHR3by1sZXR0ZXIgY291bnRyeSBjb2RlIGZvciB0aGlzIHVuaXQ/In0sCi0gICAgICAgIHsiSXMubmFtZS5jb3JyZWN0LiIsICJJcyB7MH0gY29ycmVjdD8ifSwKLSAgICAgICAgeyJubyIsICJubyJ9LAotICAgICAgICB7InllcyIsICJ5ZXMifSwKLSAgICAgICAgeyJ5IiwgInkifSwKLSAgICAgICAgeyIuZGVmYXVsdFZhbHVlLiIsICIgIFt7MH1dOiAgIn0sCi0gICAgICAgIHsiQWxpYXMuYWxpYXMuaGFzLm5vLmtleSIsCi0gICAgICAgICAgICAgICAgIkFsaWFzIDx7MH0+IGhhcyBubyBrZXkifSwKLSAgICAgICAgeyJBbGlhcy5hbGlhcy5yZWZlcmVuY2VzLmFuLmVudHJ5LnR5cGUudGhhdC5pcy5ub3QuYS5wcml2YXRlLmtleS5lbnRyeS5UaGUua2V5Y2xvbmUuY29tbWFuZC5vbmx5LnN1cHBvcnRzLmNsb25pbmcub2YucHJpdmF0ZS5rZXkiLAotICAgICAgICAgICAgICAgICAiQWxpYXMgPHswfT4gcmVmZXJlbmNlcyBhbiBlbnRyeSB0eXBlIHRoYXQgaXMgbm90IGEgcHJpdmF0ZSBrZXkgZW50cnkuICBUaGUgLWtleWNsb25lIGNvbW1hbmQgb25seSBzdXBwb3J0cyBjbG9uaW5nIG9mIHByaXZhdGUga2V5IGVudHJpZXMifSwKLQotICAgICAgICB7Ii5XQVJOSU5HLldBUk5JTkcuV0FSTklORy4iLAotICAgICAgICAgICAgIioqKioqKioqKioqKioqKioqICBXQVJOSU5HIFdBUk5JTkcgV0FSTklORyAgKioqKioqKioqKioqKioqKioifSwKLSAgICAgICAgeyJTaWduZXIuZC4iLCAiU2lnbmVyICMlZDoifSwKLSAgICAgICAgeyJUaW1lc3RhbXAuIiwgIlRpbWVzdGFtcDoifSwKLSAgICAgICAgeyJTaWduYXR1cmUuIiwgIlNpZ25hdHVyZToifSwKLSAgICAgICAgeyJDUkxzLiIsICJDUkxzOiJ9LAotICAgICAgICB7IkNlcnRpZmljYXRlLm93bmVyLiIsICJDZXJ0aWZpY2F0ZSBvd25lcjogIn0sCi0gICAgICAgIHsiTm90LmEuc2lnbmVkLmphci5maWxlIiwgIk5vdCBhIHNpZ25lZCBqYXIgZmlsZSJ9LAotICAgICAgICB7Ik5vLmNlcnRpZmljYXRlLmZyb20udGhlLlNTTC5zZXJ2ZXIiLAotICAgICAgICAgICAgICAgICJObyBjZXJ0aWZpY2F0ZSBmcm9tIHRoZSBTU0wgc2VydmVyIn0sCi0KLSAgICAgICAgeyIuVGhlLmludGVncml0eS5vZi50aGUuaW5mb3JtYXRpb24uc3RvcmVkLmluLnlvdXIua2V5c3RvcmUuIiwKLSAgICAgICAgICAgICIqIFRoZSBpbnRlZ3JpdHkgb2YgdGhlIGluZm9ybWF0aW9uIHN0b3JlZCBpbiB5b3VyIGtleXN0b3JlICAqXG4iICsKLSAgICAgICAgICAgICIqIGhhcyBOT1QgYmVlbiB2ZXJpZmllZCEgIEluIG9yZGVyIHRvIHZlcmlmeSBpdHMgaW50ZWdyaXR5LCAqXG4iICsKLSAgICAgICAgICAgICIqIHlvdSBtdXN0IHByb3ZpZGUgeW91ciBrZXlzdG9yZSBwYXNzd29yZC4gICAgICAgICAgICAgICAgICAqIn0sCi0gICAgICAgIHsiLlRoZS5pbnRlZ3JpdHkub2YudGhlLmluZm9ybWF0aW9uLnN0b3JlZC5pbi50aGUuc3Jja2V5c3RvcmUuIiwKLSAgICAgICAgICAgICIqIFRoZSBpbnRlZ3JpdHkgb2YgdGhlIGluZm9ybWF0aW9uIHN0b3JlZCBpbiB0aGUgc3Jja2V5c3RvcmUqXG4iICsKLSAgICAgICAgICAgICIqIGhhcyBOT1QgYmVlbiB2ZXJpZmllZCEgIEluIG9yZGVyIHRvIHZlcmlmeSBpdHMgaW50ZWdyaXR5LCAqXG4iICsKLSAgICAgICAgICAgICIqIHlvdSBtdXN0IHByb3ZpZGUgdGhlIHNyY2tleXN0b3JlIHBhc3N3b3JkLiAgICAgICAgICAgICAgICAqIn0sCi0KLSAgICAgICAgeyJDZXJ0aWZpY2F0ZS5yZXBseS5kb2VzLm5vdC5jb250YWluLnB1YmxpYy5rZXkuZm9yLmFsaWFzLiIsCi0gICAgICAgICAgICAgICAgIkNlcnRpZmljYXRlIHJlcGx5IGRvZXMgbm90IGNvbnRhaW4gcHVibGljIGtleSBmb3IgPHswfT4ifSwKLSAgICAgICAgeyJJbmNvbXBsZXRlLmNlcnRpZmljYXRlLmNoYWluLmluLnJlcGx5IiwKLSAgICAgICAgICAgICAgICAiSW5jb21wbGV0ZSBjZXJ0aWZpY2F0ZSBjaGFpbiBpbiByZXBseSJ9LAotICAgICAgICB7IkNlcnRpZmljYXRlLmNoYWluLmluLnJlcGx5LmRvZXMubm90LnZlcmlmeS4iLAotICAgICAgICAgICAgICAgICJDZXJ0aWZpY2F0ZSBjaGFpbiBpbiByZXBseSBkb2VzIG5vdCB2ZXJpZnk6ICJ9LAotICAgICAgICB7IlRvcC5sZXZlbC5jZXJ0aWZpY2F0ZS5pbi5yZXBseS4iLAotICAgICAgICAgICAgICAgICJUb3AtbGV2ZWwgY2VydGlmaWNhdGUgaW4gcmVwbHk6XG4ifSwKLSAgICAgICAgeyIuaXMubm90LnRydXN0ZWQuIiwgIi4uLiBpcyBub3QgdHJ1c3RlZC4gIn0sCi0gICAgICAgIHsiSW5zdGFsbC5yZXBseS5hbnl3YXkubm8uIiwgIkluc3RhbGwgcmVwbHkgYW55d2F5PyBbbm9dOiAgIn0sCi0gICAgICAgIHsiTk8iLCAiTk8ifSwKLSAgICAgICAgeyJQdWJsaWMua2V5cy5pbi5yZXBseS5hbmQua2V5c3RvcmUuZG9uLnQubWF0Y2giLAotICAgICAgICAgICAgICAgICJQdWJsaWMga2V5cyBpbiByZXBseSBhbmQga2V5c3RvcmUgZG9uJ3QgbWF0Y2gifSwKLSAgICAgICAgeyJDZXJ0aWZpY2F0ZS5yZXBseS5hbmQuY2VydGlmaWNhdGUuaW4ua2V5c3RvcmUuYXJlLmlkZW50aWNhbCIsCi0gICAgICAgICAgICAgICAgIkNlcnRpZmljYXRlIHJlcGx5IGFuZCBjZXJ0aWZpY2F0ZSBpbiBrZXlzdG9yZSBhcmUgaWRlbnRpY2FsIn0sCi0gICAgICAgIHsiRmFpbGVkLnRvLmVzdGFibGlzaC5jaGFpbi5mcm9tLnJlcGx5IiwKLSAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGVzdGFibGlzaCBjaGFpbiBmcm9tIHJlcGx5In0sCi0gICAgICAgIHsibiIsICJuIn0sCi0gICAgICAgIHsiV3JvbmcuYW5zd2VyLnRyeS5hZ2FpbiIsICJXcm9uZyBhbnN3ZXIsIHRyeSBhZ2FpbiJ9LAotICAgICAgICB7IlNlY3JldC5rZXkubm90LmdlbmVyYXRlZC5hbGlhcy5hbGlhcy5hbHJlYWR5LmV4aXN0cyIsCi0gICAgICAgICAgICAgICAgIlNlY3JldCBLZXkgbm90IGdlbmVyYXRlZCwgYWxpYXMgPHswfT4gYWxyZWFkeSBleGlzdHMifSwKLSAgICAgICAgeyJQbGVhc2UucHJvdmlkZS5rZXlzaXplLmZvci5zZWNyZXQua2V5LmdlbmVyYXRpb24iLAotICAgICAgICAgICAgICAgICJQbGVhc2UgcHJvdmlkZSAta2V5c2l6ZSBmb3Igc2VjcmV0IGtleSBnZW5lcmF0aW9uIn0sCi0KLSAgICAgICAgeyJ2ZXJpZmllZC5ieS5zLmluLnMiLCAiVmVyaWZpZWQgYnkgJXMgaW4gJXMifSwKLSAgICAgICAgeyJ3YXJuaW5nLm5vdC52ZXJpZmllZC5tYWtlLnN1cmUua2V5c3RvcmUuaXMuY29ycmVjdCIsCi0gICAgICAgICAgICAiV0FSTklORzogbm90IHZlcmlmaWVkLiBNYWtlIHN1cmUgLWtleXN0b3JlIGlzIGNvcnJlY3QuIn0sCi0KLSAgICAgICAgeyJFeHRlbnNpb25zLiIsICJFeHRlbnNpb25zOiAifSwKLSAgICAgICAgeyIuRW1wdHkudmFsdWUuIiwgIihFbXB0eSB2YWx1ZSkifSwKLSAgICAgICAgeyJFeHRlbnNpb24uUmVxdWVzdC4iLCAiRXh0ZW5zaW9uIFJlcXVlc3Q6In0sCi0gICAgICAgIHsiUEtDUy4xMC5DZXJ0aWZpY2F0ZS5SZXF1ZXN0LlZlcnNpb24uMS4wLlN1YmplY3Qucy5QdWJsaWMuS2V5LnMuZm9ybWF0LnMua2V5LiIsCi0gICAgICAgICAgICAgICAgIlBLQ1MgIzEwIENlcnRpZmljYXRlIFJlcXVlc3QgKFZlcnNpb24gMS4wKVxuIiArCi0gICAgICAgICAgICAgICAgIlN1YmplY3Q6ICVzXG5QdWJsaWMgS2V5OiAlcyBmb3JtYXQgJXMga2V5XG4ifSwKLSAgICAgICAgeyJVbmtub3duLmtleVVzYWdlLnR5cGUuIiwgIlVua25vd24ga2V5VXNhZ2UgdHlwZTogIn0sCi0gICAgICAgIHsiVW5rbm93bi5leHRlbmRlZGtleVVzYWdlLnR5cGUuIiwgIlVua25vd24gZXh0ZW5kZWRrZXlVc2FnZSB0eXBlOiAifSwKLSAgICAgICAgeyJVbmtub3duLkFjY2Vzc0Rlc2NyaXB0aW9uLnR5cGUuIiwgIlVua25vd24gQWNjZXNzRGVzY3JpcHRpb24gdHlwZTogIn0sCi0gICAgICAgIHsiVW5yZWNvZ25pemVkLkdlbmVyYWxOYW1lLnR5cGUuIiwgIlVucmVjb2duaXplZCBHZW5lcmFsTmFtZSB0eXBlOiAifSwKLSAgICAgICAgeyJUaGlzLmV4dGVuc2lvbi5jYW5ub3QuYmUubWFya2VkLmFzLmNyaXRpY2FsLiIsCi0gICAgICAgICAgICAgICAgICJUaGlzIGV4dGVuc2lvbiBjYW5ub3QgYmUgbWFya2VkIGFzIGNyaXRpY2FsLiAifSwKLSAgICAgICAgeyJPZGQubnVtYmVyLm9mLmhleC5kaWdpdHMuZm91bmQuIiwgIk9kZCBudW1iZXIgb2YgaGV4IGRpZ2l0cyBmb3VuZDogIn0sCi0gICAgICAgIHsiVW5rbm93bi5leHRlbnNpb24udHlwZS4iLCAiVW5rbm93biBleHRlbnNpb24gdHlwZTogIn0sCi0gICAgICAgIHsiY29tbWFuZC57MH0uaXMuYW1iaWd1b3VzLiIsICJjb21tYW5kIHswfSBpcyBhbWJpZ3VvdXM6In0sCi0KLSAgICAgICAgLy8gcG9saWN5dG9vbAotICAgICAgICB7Ildhcm5pbmcuQS5wdWJsaWMua2V5LmZvci5hbGlhcy5zaWduZXJzLmkuZG9lcy5ub3QuZXhpc3QuTWFrZS5zdXJlLmEuS2V5U3RvcmUuaXMucHJvcGVybHkuY29uZmlndXJlZC4iLAotICAgICAgICAgICAgICAgICJXYXJuaW5nOiBBIHB1YmxpYyBrZXkgZm9yIGFsaWFzIHswfSBkb2VzIG5vdCBleGlzdC4gIE1ha2Ugc3VyZSBhIEtleVN0b3JlIGlzIHByb3Blcmx5IGNvbmZpZ3VyZWQuIn0sCi0gICAgICAgIHsiV2FybmluZy5DbGFzcy5ub3QuZm91bmQuY2xhc3MiLCAiV2FybmluZzogQ2xhc3Mgbm90IGZvdW5kOiB7MH0ifSwKLSAgICAgICAgeyJXYXJuaW5nLkludmFsaWQuYXJndW1lbnQucy5mb3IuY29uc3RydWN0b3IuYXJnIiwKLSAgICAgICAgICAgICAgICAiV2FybmluZzogSW52YWxpZCBhcmd1bWVudChzKSBmb3IgY29uc3RydWN0b3I6IHswfSJ9LAotICAgICAgICB7IklsbGVnYWwuUHJpbmNpcGFsLlR5cGUudHlwZSIsICJJbGxlZ2FsIFByaW5jaXBhbCBUeXBlOiB7MH0ifSwKLSAgICAgICAgeyJJbGxlZ2FsLm9wdGlvbi5vcHRpb24iLCAiSWxsZWdhbCBvcHRpb246IHswfSJ9LAotICAgICAgICB7IlVzYWdlLnBvbGljeXRvb2wub3B0aW9ucy4iLCAiVXNhZ2U6IHBvbGljeXRvb2wgW29wdGlvbnNdIn0sCi0gICAgICAgIHsiLmZpbGUuZmlsZS5wb2xpY3kuZmlsZS5sb2NhdGlvbiIsCi0gICAgICAgICAgICAgICAgIiAgWy1maWxlIDxmaWxlPl0gICAgcG9saWN5IGZpbGUgbG9jYXRpb24ifSwKLSAgICAgICAgeyJOZXciLCAiTmV3In0sCi0gICAgICAgIHsiT3BlbiIsICJPcGVuIn0sCi0gICAgICAgIHsiU2F2ZSIsICJTYXZlIn0sCi0gICAgICAgIHsiU2F2ZS5BcyIsICJTYXZlIEFzIn0sCi0gICAgICAgIHsiVmlldy5XYXJuaW5nLkxvZyIsICJWaWV3IFdhcm5pbmcgTG9nIn0sCi0gICAgICAgIHsiRXhpdCIsICJFeGl0In0sCi0gICAgICAgIHsiQWRkLlBvbGljeS5FbnRyeSIsICJBZGQgUG9saWN5IEVudHJ5In0sCi0gICAgICAgIHsiRWRpdC5Qb2xpY3kuRW50cnkiLCAiRWRpdCBQb2xpY3kgRW50cnkifSwKLSAgICAgICAgeyJSZW1vdmUuUG9saWN5LkVudHJ5IiwgIlJlbW92ZSBQb2xpY3kgRW50cnkifSwKLSAgICAgICAgeyJFZGl0IiwgIkVkaXQifSwKLSAgICAgICAgeyJSZXRhaW4iLCAiUmV0YWluIn0sCi0KLSAgICAgICAgeyJXYXJuaW5nLkZpbGUubmFtZS5tYXkuaW5jbHVkZS5lc2NhcGVkLmJhY2tzbGFzaC5jaGFyYWN0ZXJzLkl0LmlzLm5vdC5uZWNlc3NhcnkudG8uZXNjYXBlLmJhY2tzbGFzaC5jaGFyYWN0ZXJzLnRoZS50b29sLmVzY2FwZXMiLAotICAgICAgICAgICAgIldhcm5pbmc6IEZpbGUgbmFtZSBtYXkgaW5jbHVkZSBlc2NhcGVkIGJhY2tzbGFzaCBjaGFyYWN0ZXJzLiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGVzY2FwZSBiYWNrc2xhc2ggY2hhcmFjdGVycyAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIodGhlIHRvb2wgZXNjYXBlcyBjaGFyYWN0ZXJzIGFzIG5lY2Vzc2FyeSB3aGVuIHdyaXRpbmcgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAidGhlIHBvbGljeSBjb250ZW50cyB0byB0aGUgcGVyc2lzdGVudCBzdG9yZSkuXG5cbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIkNsaWNrIG9uIFJldGFpbiB0byByZXRhaW4gdGhlIGVudGVyZWQgbmFtZSwgb3IgY2xpY2sgb24gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiRWRpdCB0byBlZGl0IHRoZSBuYW1lLiJ9LAotCi0gICAgICAgIHsiQWRkLlB1YmxpYy5LZXkuQWxpYXMiLCAiQWRkIFB1YmxpYyBLZXkgQWxpYXMifSwKLSAgICAgICAgeyJSZW1vdmUuUHVibGljLktleS5BbGlhcyIsICJSZW1vdmUgUHVibGljIEtleSBBbGlhcyJ9LAotICAgICAgICB7IkZpbGUiLCAiRmlsZSJ9LAotICAgICAgICB7IktleVN0b3JlIiwgIktleVN0b3JlIn0sCi0gICAgICAgIHsiUG9saWN5LkZpbGUuIiwgIlBvbGljeSBGaWxlOiJ9LAotICAgICAgICB7IkNvdWxkLm5vdC5vcGVuLnBvbGljeS5maWxlLnBvbGljeUZpbGUuZS50b1N0cmluZy4iLAotICAgICAgICAgICAgICAgICJDb3VsZCBub3Qgb3BlbiBwb2xpY3kgZmlsZTogezB9OiB7MX0ifSwKLSAgICAgICAgeyJQb2xpY3kuVG9vbCIsICJQb2xpY3kgVG9vbCJ9LAotICAgICAgICB7IkVycm9ycy5oYXZlLm9jY3VycmVkLndoaWxlLm9wZW5pbmcudGhlLnBvbGljeS5jb25maWd1cmF0aW9uLlZpZXcudGhlLldhcm5pbmcuTG9nLmZvci5tb3JlLmluZm9ybWF0aW9uLiIsCi0gICAgICAgICAgICAgICAgIkVycm9ycyBoYXZlIG9jY3VycmVkIHdoaWxlIG9wZW5pbmcgdGhlIHBvbGljeSBjb25maWd1cmF0aW9uLiAgVmlldyB0aGUgV2FybmluZyBMb2cgZm9yIG1vcmUgaW5mb3JtYXRpb24uIn0sCi0gICAgICAgIHsiRXJyb3IiLCAiRXJyb3IifSwKLSAgICAgICAgeyJPSyIsICJPSyJ9LAotICAgICAgICB7IlN0YXR1cyIsICJTdGF0dXMifSwKLSAgICAgICAgeyJXYXJuaW5nIiwgIldhcm5pbmcifSwKLSAgICAgICAgeyJQZXJtaXNzaW9uLiIsCi0gICAgICAgICAgICAgICAgIlBlcm1pc3Npb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9LAotICAgICAgICB7IlByaW5jaXBhbC5UeXBlLiIsICJQcmluY2lwYWwgVHlwZToifSwKLSAgICAgICAgeyJQcmluY2lwYWwuTmFtZS4iLCAiUHJpbmNpcGFsIE5hbWU6In0sCi0gICAgICAgIHsiVGFyZ2V0Lk5hbWUuIiwKLSAgICAgICAgICAgICAgICAiVGFyZ2V0IE5hbWU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9LAotICAgICAgICB7IkFjdGlvbnMuIiwKLSAgICAgICAgICAgICAgICAiQWN0aW9uczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIn0sCi0gICAgICAgIHsiT0sudG8ub3ZlcndyaXRlLmV4aXN0aW5nLmZpbGUuZmlsZW5hbWUuIiwKLSAgICAgICAgICAgICAgICAiT0sgdG8gb3ZlcndyaXRlIGV4aXN0aW5nIGZpbGUgezB9PyJ9LAotICAgICAgICB7IkNhbmNlbCIsICJDYW5jZWwifSwKLSAgICAgICAgeyJDb2RlQmFzZS4iLCAiQ29kZUJhc2U6In0sCi0gICAgICAgIHsiU2lnbmVkQnkuIiwgIlNpZ25lZEJ5OiJ9LAotICAgICAgICB7IkFkZC5QcmluY2lwYWwiLCAiQWRkIFByaW5jaXBhbCJ9LAotICAgICAgICB7IkVkaXQuUHJpbmNpcGFsIiwgIkVkaXQgUHJpbmNpcGFsIn0sCi0gICAgICAgIHsiUmVtb3ZlLlByaW5jaXBhbCIsICJSZW1vdmUgUHJpbmNpcGFsIn0sCi0gICAgICAgIHsiUHJpbmNpcGFscy4iLCAiUHJpbmNpcGFsczoifSwKLSAgICAgICAgeyIuQWRkLlBlcm1pc3Npb24iLCAiICBBZGQgUGVybWlzc2lvbiJ9LAotICAgICAgICB7Ii5FZGl0LlBlcm1pc3Npb24iLCAiICBFZGl0IFBlcm1pc3Npb24ifSwKLSAgICAgICAgeyJSZW1vdmUuUGVybWlzc2lvbiIsICJSZW1vdmUgUGVybWlzc2lvbiJ9LAotICAgICAgICB7IkRvbmUiLCAiRG9uZSJ9LAotICAgICAgICB7IktleVN0b3JlLlVSTC4iLCAiS2V5U3RvcmUgVVJMOiJ9LAotICAgICAgICB7IktleVN0b3JlLlR5cGUuIiwgIktleVN0b3JlIFR5cGU6In0sCi0gICAgICAgIHsiS2V5U3RvcmUuUHJvdmlkZXIuIiwgIktleVN0b3JlIFByb3ZpZGVyOiJ9LAotICAgICAgICB7IktleVN0b3JlLlBhc3N3b3JkLlVSTC4iLCAiS2V5U3RvcmUgUGFzc3dvcmQgVVJMOiJ9LAotICAgICAgICB7IlByaW5jaXBhbHMiLCAiUHJpbmNpcGFscyJ9LAotICAgICAgICB7Ii5FZGl0LlByaW5jaXBhbC4iLCAiICBFZGl0IFByaW5jaXBhbDoifSwKLSAgICAgICAgeyIuQWRkLk5ldy5QcmluY2lwYWwuIiwgIiAgQWRkIE5ldyBQcmluY2lwYWw6In0sCi0gICAgICAgIHsiUGVybWlzc2lvbnMiLCAiUGVybWlzc2lvbnMifSwKLSAgICAgICAgeyIuRWRpdC5QZXJtaXNzaW9uLiIsICIgIEVkaXQgUGVybWlzc2lvbjoifSwKLSAgICAgICAgeyIuQWRkLk5ldy5QZXJtaXNzaW9uLiIsICIgIEFkZCBOZXcgUGVybWlzc2lvbjoifSwKLSAgICAgICAgeyJTaWduZWQuQnkuIiwgIlNpZ25lZCBCeToifSwKLSAgICAgICAgeyJDYW5ub3QuU3BlY2lmeS5QcmluY2lwYWwud2l0aC5hLldpbGRjYXJkLkNsYXNzLndpdGhvdXQuYS5XaWxkY2FyZC5OYW1lIiwKLSAgICAgICAgICAgICJDYW5ub3QgU3BlY2lmeSBQcmluY2lwYWwgd2l0aCBhIFdpbGRjYXJkIENsYXNzIHdpdGhvdXQgYSBXaWxkY2FyZCBOYW1lIn0sCi0gICAgICAgIHsiQ2Fubm90LlNwZWNpZnkuUHJpbmNpcGFsLndpdGhvdXQuYS5OYW1lIiwKLSAgICAgICAgICAgICJDYW5ub3QgU3BlY2lmeSBQcmluY2lwYWwgd2l0aG91dCBhIE5hbWUifSwKLSAgICAgICAgeyJQZXJtaXNzaW9uLmFuZC5UYXJnZXQuTmFtZS5tdXN0LmhhdmUuYS52YWx1ZSIsCi0gICAgICAgICAgICAgICAgIlBlcm1pc3Npb24gYW5kIFRhcmdldCBOYW1lIG11c3QgaGF2ZSBhIHZhbHVlIn0sCi0gICAgICAgIHsiUmVtb3ZlLnRoaXMuUG9saWN5LkVudHJ5LiIsICJSZW1vdmUgdGhpcyBQb2xpY3kgRW50cnk/In0sCi0gICAgICAgIHsiT3ZlcndyaXRlLkZpbGUiLCAiT3ZlcndyaXRlIEZpbGUifSwKLSAgICAgICAgeyJQb2xpY3kuc3VjY2Vzc2Z1bGx5LndyaXR0ZW4udG8uZmlsZW5hbWUiLAotICAgICAgICAgICAgICAgICJQb2xpY3kgc3VjY2Vzc2Z1bGx5IHdyaXR0ZW4gdG8gezB9In0sCi0gICAgICAgIHsibnVsbC5maWxlbmFtZSIsICJudWxsIGZpbGVuYW1lIn0sCi0gICAgICAgIHsiU2F2ZS5jaGFuZ2VzLiIsICJTYXZlIGNoYW5nZXM/In0sCi0gICAgICAgIHsiWWVzIiwgIlllcyJ9LAotICAgICAgICB7Ik5vIiwgIk5vIn0sCi0gICAgICAgIHsiUG9saWN5LkVudHJ5IiwgIlBvbGljeSBFbnRyeSJ9LAotICAgICAgICB7IlNhdmUuQ2hhbmdlcyIsICJTYXZlIENoYW5nZXMifSwKLSAgICAgICAgeyJOby5Qb2xpY3kuRW50cnkuc2VsZWN0ZWQiLCAiTm8gUG9saWN5IEVudHJ5IHNlbGVjdGVkIn0sCi0gICAgICAgIHsiVW5hYmxlLnRvLm9wZW4uS2V5U3RvcmUuZXgudG9TdHJpbmcuIiwKLSAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIG9wZW4gS2V5U3RvcmU6IHswfSJ9LAotICAgICAgICB7Ik5vLnByaW5jaXBhbC5zZWxlY3RlZCIsICJObyBwcmluY2lwYWwgc2VsZWN0ZWQifSwKLSAgICAgICAgeyJOby5wZXJtaXNzaW9uLnNlbGVjdGVkIiwgIk5vIHBlcm1pc3Npb24gc2VsZWN0ZWQifSwKLSAgICAgICAgeyJuYW1lIiwgIm5hbWUifSwKLSAgICAgICAgeyJjb25maWd1cmF0aW9uLnR5cGUiLCAiY29uZmlndXJhdGlvbiB0eXBlIn0sCi0gICAgICAgIHsiZW52aXJvbm1lbnQudmFyaWFibGUubmFtZSIsICJlbnZpcm9ubWVudCB2YXJpYWJsZSBuYW1lIn0sCi0gICAgICAgIHsibGlicmFyeS5uYW1lIiwgImxpYnJhcnkgbmFtZSJ9LAotICAgICAgICB7InBhY2thZ2UubmFtZSIsICJwYWNrYWdlIG5hbWUifSwKLSAgICAgICAgeyJwb2xpY3kudHlwZSIsICJwb2xpY3kgdHlwZSJ9LAotICAgICAgICB7InByb3BlcnR5Lm5hbWUiLCAicHJvcGVydHkgbmFtZSJ9LAotICAgICAgICB7IlByaW5jaXBhbC5MaXN0IiwgIlByaW5jaXBhbCBMaXN0In0sCi0gICAgICAgIHsiUGVybWlzc2lvbi5MaXN0IiwgIlBlcm1pc3Npb24gTGlzdCJ9LAotICAgICAgICB7IkNvZGUuQmFzZSIsICJDb2RlIEJhc2UifSwKLSAgICAgICAgeyJLZXlTdG9yZS5VLlIuTC4iLCAiS2V5U3RvcmUgVSBSIEw6In0sCi0gICAgICAgIHsiS2V5U3RvcmUuUGFzc3dvcmQuVS5SLkwuIiwgIktleVN0b3JlIFBhc3N3b3JkIFUgUiBMOiJ9LAotCi0KICAgICAgICAgLy8gamF2YXguc2VjdXJpdHkuYXV0aC5Qcml2YXRlQ3JlZGVudGlhbFBlcm1pc3Npb24KICAgICAgICAgeyJpbnZhbGlkLm51bGwuaW5wdXQucy4iLCAiaW52YWxpZCBudWxsIGlucHV0KHMpIn0sCiAgICAgICAgIHsiYWN0aW9ucy5jYW4ub25seS5iZS5yZWFkLiIsICJhY3Rpb25zIGNhbiBvbmx5IGJlICdyZWFkJyJ9LApAQCAtNTY1LDYgKzU4LDcgQEAKICAgICAgICAgeyJwcm92aWRlZC5udWxsLk9JRC5tYXAiLCAicHJvdmlkZWQgbnVsbCBPSUQgbWFwIn0sCiAKICAgICAgICAgLy8gamF2YXguc2VjdXJpdHkuYXV0aC5TdWJqZWN0CisgICAgICAgIHsiTkVXTElORSIsICJcbiJ9LAogICAgICAgICB7ImludmFsaWQubnVsbC5BY2Nlc3NDb250cm9sQ29udGV4dC5wcm92aWRlZCIsCiAgICAgICAgICAgICAgICAgImludmFsaWQgbnVsbCBBY2Nlc3NDb250cm9sQ29udGV4dCBwcm92aWRlZCJ9LAogICAgICAgICB7ImludmFsaWQubnVsbC5hY3Rpb24ucHJvdmlkZWQiLCAiaW52YWxpZCBudWxsIGFjdGlvbiBwcm92aWRlZCJ9LApAQCAtNjY4LDYgKzE2Miw3IEBACiAgICAgICoKICAgICAgKiBAcmV0dXJuIHRoZSBjb250ZW50cyBvZiB0aGlzIDxjb2RlPlJlc291cmNlQnVuZGxlPC9jb2RlPi4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgT2JqZWN0W11bXSBnZXRDb250ZW50cygpIHsKICAgICAgICAgcmV0dXJuIGNvbnRlbnRzOwogICAgIH0KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdXRpbC9SZXNvdXJjZXNfZGUuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdXRpbC9SZXNvdXJjZXNfZGUuamF2YQppbmRleCAyNmJkMzMxLi4zNGE3ZDZkYiAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS91dGlsL1Jlc291cmNlc19kZS5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdXRpbC9SZXNvdXJjZXNfZGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTM0LDUwMSArMzQsNiBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W11bXSBjb250ZW50cyA9IHsKIAotICAgICAgICAvLyBzaGFyZWQgKGZyb20gamFyc2lnbmVyKQotICAgICAgICB7IlNQQUNFIiwgIiAifSwKLSAgICAgICAgeyIyU1BBQ0UiLCAiICAifSwKLSAgICAgICAgeyI2U1BBQ0UiLCAiICAgICAgIn0sCi0gICAgICAgIHsiQ09NTUEiLCAiLCAifSwKLSAgICAgICAgLy8gc2hhcmVkIChmcm9tIGtleXRvb2wpCi0gICAgICAgIHsiTkVXTElORSIsICJcbiJ9LAotICAgICAgICB7IlNUQVIiLAotICAgICAgICAgICAgICAgICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIn0sCi0gICAgICAgIHsiU1RBUk5OIiwKLSAgICAgICAgICAgICAgICAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG4ifSwKLQotICAgICAgICAvLyBrZXl0b29sOiBIZWxwIHBhcnQKLS8vICJPcHRpb24iIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotICAgICAgICB7Ii5PUFRJT04uIiwgIiBbT3B0aW9uXS4uLiJ9LAotICAgICAgICB7Ik9wdGlvbnMuIiwgIk9wdGlvbmVuOiJ9LAotICAgICAgICB7IlVzZS5rZXl0b29sLmhlbHAuZm9yLmFsbC5hdmFpbGFibGUuY29tbWFuZHMiLAotICAgICAgICAgICAgICAgICAiXCJrZXl0b29sIC1oZWxwXCIgZlx1MDBGQ3IgYWxsZSB2ZXJmXHUwMEZDZ2JhcmVuIEJlZmVobGUgdmVyd2VuZGVuIn0sCi0gICAgICAgIHsiS2V5LmFuZC5DZXJ0aWZpY2F0ZS5NYW5hZ2VtZW50LlRvb2wiLAotICAgICAgICAgICAgICAgICAiU2NobFx1MDBGQ3NzZWwtIHVuZCBaZXJ0aWZpa2F0c3ZlcndhbHR1bmdzdG9vbCJ9LAotICAgICAgICB7IkNvbW1hbmRzLiIsICJCZWZlaGxlOiJ9LAotICAgICAgICB7IlVzZS5rZXl0b29sLmNvbW1hbmQubmFtZS5oZWxwLmZvci51c2FnZS5vZi5jb21tYW5kLm5hbWUiLAotICAgICAgICAgICAgICAgICJcImtleXRvb2wgLWNvbW1hbmRfbmFtZSAtaGVscFwiIGZcdTAwRkNyIFZlcndlbmR1bmcgdm9uIGNvbW1hbmRfbmFtZSB2ZXJ3ZW5kZW4ifSwKLSAgICAgICAgLy8ga2V5dG9vbDogaGVscDogY29tbWFuZHMKLSAgICAgICAgeyJHZW5lcmF0ZXMuYS5jZXJ0aWZpY2F0ZS5yZXF1ZXN0IiwKLSAgICAgICAgICAgICAgICAiR2VuZXJpZXJ0IGVpbmUgWmVydGlmaWthdGFuZm9yZGVydW5nIn0sIC8vLWNlcnRyZXEKLSAgICAgICAgeyJDaGFuZ2VzLmFuLmVudHJ5LnMuYWxpYXMiLAotICAgICAgICAgICAgICAgICJcdTAwQzRuZGVydCBkZW4gQWxpYXMgZWluZXMgRWludHJhZ3MifSwgLy8tY2hhbmdlYWxpYXMKLSAgICAgICAgeyJEZWxldGVzLmFuLmVudHJ5IiwKLSAgICAgICAgICAgICAgICAiTFx1MDBGNnNjaHQgZWluZW4gRWludHJhZyJ9LCAvLy1kZWxldGUKLSAgICAgICAgeyJFeHBvcnRzLmNlcnRpZmljYXRlIiwKLSAgICAgICAgICAgICAgICAiRXhwb3J0aWVydCBlaW4gWmVydGlmaWthdCJ9LCAvLy1leHBvcnRjZXJ0Ci0gICAgICAgIHsiR2VuZXJhdGVzLmEua2V5LnBhaXIiLAotICAgICAgICAgICAgICAgICJHZW5lcmllcnQgZWluIFNjaGxcdTAwRkNzc2VscGFhciJ9LCAvLy1nZW5rZXlwYWlyCi0vLyB0cmFuc2xhdGlvbiBvZiAic2VjcmV0IiBrZXkgc2hvdWxkIGJlIGRpZmZlcmVudCB0byAicHJpdmF0ZSIga2V5LgotICAgICAgICB7IkdlbmVyYXRlcy5hLnNlY3JldC5rZXkiLAotICAgICAgICAgICAgICAgICJHZW5lcmllcnQgZWluZW4gU2VjcmV0IEtleSJ9LCAvLy1nZW5zZWNrZXkKLSAgICAgICAgeyJHZW5lcmF0ZXMuY2VydGlmaWNhdGUuZnJvbS5hLmNlcnRpZmljYXRlLnJlcXVlc3QiLAotICAgICAgICAgICAgICAgICJHZW5lcmllcnQgZWluIFplcnRpZmlrYXQgYXVzIGVpbmVyIFplcnRpZmlrYXRhbmZvcmRlcnVuZyJ9LCAvLy1nZW5jZXJ0Ci0gICAgICAgIHsiR2VuZXJhdGVzLkNSTCIsICJHZW5lcmllcnQgZWluZSBDUkwifSwgLy8tZ2VuY3JsCi0gICAgICAgIHsiSW1wb3J0cy5lbnRyaWVzLmZyb20uYS5KREsuMS4xLnguc3R5bGUuaWRlbnRpdHkuZGF0YWJhc2UiLAotICAgICAgICAgICAgICAgICJJbXBvcnRpZXJ0IEVpbnRyXHUwMEU0Z2UgYXVzIGVpbmVyIElkZW50aXR5LURhdGVuYmFuayBpbSBKREsgMS4xLngtU3RpbCJ9LCAvLy1pZGVudGl0eWRiCi0gICAgICAgIHsiSW1wb3J0cy5hLmNlcnRpZmljYXRlLm9yLmEuY2VydGlmaWNhdGUuY2hhaW4iLAotICAgICAgICAgICAgICAgICJJbXBvcnRpZXJ0IGVpbiBaZXJ0aWZpa2F0IG9kZXIgZWluZSBaZXJ0aWZpa2F0a2V0dGUifSwgLy8taW1wb3J0Y2VydAotICAgICAgICB7IkltcG9ydHMub25lLm9yLmFsbC5lbnRyaWVzLmZyb20uYW5vdGhlci5rZXlzdG9yZSIsCi0gICAgICAgICAgICAgICAgIkltcG9ydGllcnQgZWluZW4gb2RlciBhbGxlIEVpbnRyXHUwMEU0Z2UgYXVzIGVpbmVtIGFuZGVyZW4gS2V5c3RvcmUifSwgLy8taW1wb3J0a2V5c3RvcmUKLSAgICAgICAgeyJDbG9uZXMuYS5rZXkuZW50cnkiLAotICAgICAgICAgICAgICAgICJDbG9udCBlaW5lbiBTY2hsXHUwMEZDc3NlbGVpbnRyYWcifSwgLy8ta2V5Y2xvbmUKLSAgICAgICAgeyJDaGFuZ2VzLnRoZS5rZXkucGFzc3dvcmQub2YuYW4uZW50cnkiLAotICAgICAgICAgICAgICAgICJcdTAwQzRuZGVydCBkYXMgU2NobFx1MDBGQ3NzZWxrZW5ud29ydCBlaW5lcyBFaW50cmFncyJ9LCAvLy1rZXlwYXNzd2QKLSAgICAgICAgeyJMaXN0cy5lbnRyaWVzLmluLmEua2V5c3RvcmUiLAotICAgICAgICAgICAgICAgICJMaXN0ZXQgZGllIEVpbnRyXHUwMEU0Z2UgaW4gZWluZW0gS2V5c3RvcmUgYXVmIn0sIC8vLWxpc3QKLSAgICAgICAgeyJQcmludHMudGhlLmNvbnRlbnQub2YuYS5jZXJ0aWZpY2F0ZSIsCi0gICAgICAgICAgICAgICAgIkRydWNrdCBkZW4gQ29udGVudCBlaW5lcyBaZXJ0aWZpa2F0cyJ9LCAvLy1wcmludGNlcnQKLSAgICAgICAgeyJQcmludHMudGhlLmNvbnRlbnQub2YuYS5jZXJ0aWZpY2F0ZS5yZXF1ZXN0IiwKLSAgICAgICAgICAgICAgICAiRHJ1Y2t0IGRlbiBDb250ZW50IGVpbmVyIFplcnRpZmlrYXRhbmZvcmRlcnVuZyJ9LCAvLy1wcmludGNlcnRyZXEKLSAgICAgICAgeyJQcmludHMudGhlLmNvbnRlbnQub2YuYS5DUkwuZmlsZSIsCi0gICAgICAgICAgICAgICAgIkRydWNrdCBkZW4gQ29udGVudCBlaW5lciBDUkwtRGF0ZWkifSwgLy8tcHJpbnRjcmwKLSAgICAgICAgeyJHZW5lcmF0ZXMuYS5zZWxmLnNpZ25lZC5jZXJ0aWZpY2F0ZSIsCi0gICAgICAgICAgICAgICAgIkdlbmVyaWVydCBlaW4gc2VsYnN0IHNpZ25pZXJ0ZXMgWmVydGlmaWthdCJ9LCAvLy1zZWxmY2VydAotICAgICAgICB7IkNoYW5nZXMudGhlLnN0b3JlLnBhc3N3b3JkLm9mLmEua2V5c3RvcmUiLAotICAgICAgICAgICAgICAgICJcdTAwQzRuZGVydCBkYXMgU3BlaWNoZXJrZW5ud29ydCBlaW5lcyBLZXlzdG9yZXMifSwgLy8tc3RvcmVwYXNzd2QKLSAgICAgICAgLy8ga2V5dG9vbDogaGVscDogb3B0aW9ucwotICAgICAgICB7ImFsaWFzLm5hbWUub2YudGhlLmVudHJ5LnRvLnByb2Nlc3MiLAotICAgICAgICAgICAgICAgICJBbGlhc25hbWUgZGVzIHp1IHZlcmFyYmVpdGVuZGVuIEVpbnRyYWdzIn0sIC8vLWFsaWFzCi0gICAgICAgIHsiZGVzdGluYXRpb24uYWxpYXMiLAotICAgICAgICAgICAgICAgICJaaWVsYWxpYXMifSwgLy8tZGVzdGFsaWFzCi0gICAgICAgIHsiZGVzdGluYXRpb24ua2V5LnBhc3N3b3JkIiwKLSAgICAgICAgICAgICAgICAiWmllbHNjaGxcdTAwRkNzc2VsLUtlbm53b3J0In0sIC8vLWRlc3RrZXlwYXNzCi0gICAgICAgIHsiZGVzdGluYXRpb24ua2V5c3RvcmUubmFtZSIsCi0gICAgICAgICAgICAgICAgIlppZWwtS2V5c3RvcmUtTmFtZSJ9LCAvLy1kZXN0a2V5c3RvcmUKLSAgICAgICAgeyJkZXN0aW5hdGlvbi5rZXlzdG9yZS5wYXNzd29yZC5wcm90ZWN0ZWQiLAotICAgICAgICAgICAgICAgICJaaWVsLUtleXN0b3JlIGtlbm53b3J0Z2VzY2hcdTAwRkN0enQifSwgLy8tZGVzdHByb3RlY3RlZAotICAgICAgICB7ImRlc3RpbmF0aW9uLmtleXN0b3JlLnByb3ZpZGVyLm5hbWUiLAotICAgICAgICAgICAgICAgICJaaWVsLUtleXN0b3JlLVByb3ZpZGVybmFtZSJ9LCAvLy1kZXN0cHJvdmlkZXJuYW1lCi0gICAgICAgIHsiZGVzdGluYXRpb24ua2V5c3RvcmUucGFzc3dvcmQiLAotICAgICAgICAgICAgICAgICJaaWVsLUtleXN0b3JlLUtlbm53b3J0In0sIC8vLWRlc3RzdG9yZXBhc3MKLSAgICAgICAgeyJkZXN0aW5hdGlvbi5rZXlzdG9yZS50eXBlIiwKLSAgICAgICAgICAgICAgICAiWmllbC1LZXlzdG9yZS1UeXAifSwgLy8tZGVzdHN0b3JldHlwZQotICAgICAgICB7ImRpc3Rpbmd1aXNoZWQubmFtZSIsCi0gICAgICAgICAgICAgICAgIkRpc3Rpbmd1aXNoZWQgTmFtZSJ9LCAvLy1kbmFtZQotICAgICAgICB7IlguNTA5LmV4dGVuc2lvbiIsCi0gICAgICAgICAgICAgICAgIlguNTA5LUVyd2VpdGVydW5nIn0sIC8vLWV4dAotICAgICAgICB7Im91dHB1dC5maWxlLm5hbWUiLAotICAgICAgICAgICAgICAgICJBdXNnYWJlZGF0ZWluYW1lIn0sIC8vLWZpbGUgYW5kIC1vdXRmaWxlCi0gICAgICAgIHsiaW5wdXQuZmlsZS5uYW1lIiwKLSAgICAgICAgICAgICAgICAiRWluZ2FiZWRhdGVpbmFtZSJ9LCAvLy1maWxlIGFuZCAtaW5maWxlCi0gICAgICAgIHsia2V5LmFsZ29yaXRobS5uYW1lIiwKLSAgICAgICAgICAgICAgICAiU2NobFx1MDBGQ3NzZWxhbGdvcml0aG11c25hbWUifSwgLy8ta2V5YWxnCi0gICAgICAgIHsia2V5LnBhc3N3b3JkIiwKLSAgICAgICAgICAgICAgICAiU2NobFx1MDBGQ3NzZWxrZW5ud29ydCJ9LCAvLy1rZXlwYXNzCi0gICAgICAgIHsia2V5LmJpdC5zaXplIiwKLSAgICAgICAgICAgICAgICAiU2NobFx1MDBGQ3NzZWxiaXRnclx1MDBGNlx1MDBERmUifSwgLy8ta2V5c2l6ZQotICAgICAgICB7ImtleXN0b3JlLm5hbWUiLAotICAgICAgICAgICAgICAgICJLZXlzdG9yZS1OYW1lIn0sIC8vLWtleXN0b3JlCi0gICAgICAgIHsibmV3LnBhc3N3b3JkIiwKLSAgICAgICAgICAgICAgICAiTmV1ZXMgS2VubndvcnQifSwgLy8tbmV3Ci0gICAgICAgIHsiZG8ubm90LnByb21wdCIsCi0gICAgICAgICAgICAgICAgIktlaW4gUHJvbXB0In0sIC8vLW5vcHJvbXB0Ci0gICAgICAgIHsicGFzc3dvcmQudGhyb3VnaC5wcm90ZWN0ZWQubWVjaGFuaXNtIiwKLSAgICAgICAgICAgICAgICAiS2VubndvcnQgXHUwMEZDYmVyIGdlc2NoXHUwMEZDdHp0ZW4gTWVjaGFuaXNtdXMifSwgLy8tcHJvdGVjdGVkCi0gICAgICAgIHsicHJvdmlkZXIuYXJndW1lbnQiLAotICAgICAgICAgICAgICAgICJQcm92aWRlcmFyZ3VtZW50In0sIC8vLXByb3ZpZGVyYXJnCi0gICAgICAgIHsicHJvdmlkZXIuY2xhc3MubmFtZSIsCi0gICAgICAgICAgICAgICAgIlByb3ZpZGVya2xhc3Nlbm5hbWUifSwgLy8tcHJvdmlkZXJjbGFzcwotICAgICAgICB7InByb3ZpZGVyLm5hbWUiLAotICAgICAgICAgICAgICAgICJQcm92aWRlcm5hbWUifSwgLy8tcHJvdmlkZXJuYW1lCi0gICAgICAgIHsicHJvdmlkZXIuY2xhc3NwYXRoIiwKLSAgICAgICAgICAgICAgICAiUHJvdmlkZXItQ2xhc3NwYXRoIn0sIC8vLXByb3ZpZGVycGF0aAotICAgICAgICB7Im91dHB1dC5pbi5SRkMuc3R5bGUiLAotICAgICAgICAgICAgICAgICJBdXNnYWJlIGluIFJGQy1TdGlsIn0sIC8vLXJmYwotICAgICAgICB7InNpZ25hdHVyZS5hbGdvcml0aG0ubmFtZSIsCi0gICAgICAgICAgICAgICAgIlNpZ25hdHVyYWxnb3JpdGhtdXNuYW1lIn0sIC8vLXNpZ2FsZwotICAgICAgICB7InNvdXJjZS5hbGlhcyIsCi0gICAgICAgICAgICAgICAgIlF1ZWxsYWxpYXMifSwgLy8tc3JjYWxpYXMKLSAgICAgICAgeyJzb3VyY2Uua2V5LnBhc3N3b3JkIiwKLSAgICAgICAgICAgICAgICAiUXVlbGxzY2hsXHUwMEZDc3NlbC1LZW5ud29ydCJ9LCAvLy1zcmNrZXlwYXNzCi0gICAgICAgIHsic291cmNlLmtleXN0b3JlLm5hbWUiLAotICAgICAgICAgICAgICAgICJRdWVsbC1LZXlzdG9yZS1OYW1lIn0sIC8vLXNyY2tleXN0b3JlCi0gICAgICAgIHsic291cmNlLmtleXN0b3JlLnBhc3N3b3JkLnByb3RlY3RlZCIsCi0gICAgICAgICAgICAgICAgIlF1ZWxsLUtleXN0b3JlIGtlbm53b3J0Z2VzY2hcdTAwRkN0enQifSwgLy8tc3JjcHJvdGVjdGVkCi0gICAgICAgIHsic291cmNlLmtleXN0b3JlLnByb3ZpZGVyLm5hbWUiLAotICAgICAgICAgICAgICAgICJRdWVsbC1LZXlzdG9yZS1Qcm92aWRlcm5hbWUifSwgLy8tc3JjcHJvdmlkZXJuYW1lCi0gICAgICAgIHsic291cmNlLmtleXN0b3JlLnBhc3N3b3JkIiwKLSAgICAgICAgICAgICAgICAiUXVlbGwtS2V5c3RvcmUtS2VubndvcnQifSwgLy8tc3Jjc3RvcmVwYXNzCi0gICAgICAgIHsic291cmNlLmtleXN0b3JlLnR5cGUiLAotICAgICAgICAgICAgICAgICJRdWVsbC1LZXlzdG9yZS1UeXAifSwgLy8tc3Jjc3RvcmV0eXBlCi0gICAgICAgIHsiU1NMLnNlcnZlci5ob3N0LmFuZC5wb3J0IiwKLSAgICAgICAgICAgICAgICAiU1NMLVNlcnZlcmhvc3QgdW5kIC1wb3J0In0sIC8vLXNzbHNlcnZlcgotICAgICAgICB7InNpZ25lZC5qYXIuZmlsZSIsCi0gICAgICAgICAgICAgICAgIlNpZ25pZXJ0ZSBKQVItRGF0ZWkifSwgLy89amFyZmlsZQotICAgICAgICB7ImNlcnRpZmljYXRlLnZhbGlkaXR5LnN0YXJ0LmRhdGUudGltZSIsCi0gICAgICAgICAgICAgICAgIkFuZmFuZ3NkYXR1bS8temVpdCBmXHUwMEZDciBaZXJ0aWZpa2F0c2dcdTAwRkNsdGlna2VpdCJ9LCAvLy1zdGFydGRhdGUKLSAgICAgICAgeyJrZXlzdG9yZS5wYXNzd29yZCIsCi0gICAgICAgICAgICAgICAgIktleXN0b3JlLUtlbm53b3J0In0sIC8vLXN0b3JlcGFzcwotICAgICAgICB7ImtleXN0b3JlLnR5cGUiLAotICAgICAgICAgICAgICAgICJLZXlzdG9yZS1UeXAifSwgLy8tc3RvcmV0eXBlCi0gICAgICAgIHsidHJ1c3QuY2VydGlmaWNhdGVzLmZyb20uY2FjZXJ0cyIsCi0gICAgICAgICAgICAgICAgIlplcnRpZmlrYXRlbiBhdXMgY2FjZXJ0cyB2ZXJ0cmF1ZW4ifSwgLy8tdHJ1c3RjYWNlcnRzCi0gICAgICAgIHsidmVyYm9zZS5vdXRwdXQiLAotICAgICAgICAgICAgICAgICJWZXJib3NlLUF1c2dhYmUifSwgLy8tdgotICAgICAgICB7InZhbGlkaXR5Lm51bWJlci5vZi5kYXlzIiwKLSAgICAgICAgICAgICAgICAiR1x1MDBGQ2x0aWdrZWl0c2RhdWVyIChUYWdlKSJ9LCAvLy12YWxpZGl0eQotICAgICAgICB7IlNlcmlhbC5JRC5vZi5jZXJ0LnRvLnJldm9rZSIsCi0gICAgICAgICAgICAgICAgICJTZXJpZWxsZSBJRCBkZXMgenUgZW50emllaGVuZGVuIENlcnRzIn0sIC8vLWlkCi0gICAgICAgIC8vIGtleXRvb2w6IFJ1bm5pbmcgcGFydAotICAgICAgICB7ImtleXRvb2wuZXJyb3IuIiwgIktleXRvb2wtRmVobGVyOiAifSwKLSAgICAgICAgeyJJbGxlZ2FsLm9wdGlvbi4iLCAiVW5nXHUwMEZDbHRpZ2UgT3B0aW9uOiAgIn0sCi0gICAgICAgIHsiSWxsZWdhbC52YWx1ZS4iLCAiVW5nXHUwMEZDbHRpZ2VyIFdlcnQ6ICJ9LAotICAgICAgICB7IlVua25vd24ucGFzc3dvcmQudHlwZS4iLCAiVW5iZWthbm50ZXIgS2VubndvcnR0eXA6ICJ9LAotICAgICAgICB7IkNhbm5vdC5maW5kLmVudmlyb25tZW50LnZhcmlhYmxlLiIsCi0gICAgICAgICAgICAgICAgIlVtZ2VidW5nc3ZhcmlhYmxlIGthbm4gbmljaHQgZ2VmdW5kZW4gd2VyZGVuOiAifSwKLSAgICAgICAgeyJDYW5ub3QuZmluZC5maWxlLiIsICJEYXRlaSBrYW5uIG5pY2h0IGdlZnVuZGVuIHdlcmRlbjogIn0sCi0gICAgICAgIHsiQ29tbWFuZC5vcHRpb24uZmxhZy5uZWVkcy5hbi5hcmd1bWVudC4iLCAiQmVmZWhsc29wdGlvbiB7MH0gYmVuXHUwMEY2dGlndCBlaW4gQXJndW1lbnQuIn0sCi0gICAgICAgIHsiV2FybmluZy5EaWZmZXJlbnQuc3RvcmUuYW5kLmtleS5wYXNzd29yZHMubm90LnN1cHBvcnRlZC5mb3IuUEtDUzEyLktleVN0b3Jlcy5JZ25vcmluZy51c2VyLnNwZWNpZmllZC5jb21tYW5kLnZhbHVlLiIsCi0gICAgICAgICAgICAgICAgIldhcm51bmc6IEtlaW5lIFVudGVyc3RcdTAwRkN0enVuZyBmXHUwMEZDciB1bnRlcnNjaGllZGxpY2hlIFNwZWljaGVyLSB1bmQgU2NobFx1MDBGQ3NzZWxrZW5ud1x1MDBGNnJ0ZXIgYmVpIFBLQ1MxMiBLZXlTdG9yZXMuIERlciBiZW51dHplcmRlZmluaWVydGUgV2VydCB7MH0gd2lyZCBpZ25vcmllcnQuIn0sCi0gICAgICAgIHsiLmtleXN0b3JlLm11c3QuYmUuTk9ORS5pZi5zdG9yZXR5cGUuaXMuezB9IiwKLSAgICAgICAgICAgICAgICAiLWtleXN0b3JlIG11c3MgTk9ORSBzZWluLCB3ZW5uIC1zdG9yZXR5cGUgezB9IGlzdCJ9LAotICAgICAgICB7IlRvby5tYW55LnJldHJpZXMucHJvZ3JhbS50ZXJtaW5hdGVkIiwKLSAgICAgICAgICAgICAgICAgIlp1IHZpZWxlIGVybmV1dGUgVmVyc3VjaGUuIFByb2dyYW1tIHdpcmQgYmVlbmRldCJ9LAotICAgICAgICB7Ii5zdG9yZXBhc3N3ZC5hbmQua2V5cGFzc3dkLmNvbW1hbmRzLm5vdC5zdXBwb3J0ZWQuaWYuc3RvcmV0eXBlLmlzLnswfSIsCi0gICAgICAgICAgICAgICAgIkJlZmVobGUgLXN0b3JlcGFzc3dkIHVuZCAta2V5cGFzc3dkIHdlcmRlbiBuaWNodCB1bnRlcnN0XHUwMEZDdHp0LCB3ZW5uIC1zdG9yZXR5cGUgezB9IGlzdCJ9LAotICAgICAgICB7Ii5rZXlwYXNzd2QuY29tbWFuZHMubm90LnN1cHBvcnRlZC5pZi5zdG9yZXR5cGUuaXMuUEtDUzEyIiwKLSAgICAgICAgICAgICAgICAiQmVmZWhsZSBkZXMgVHlwcyAta2V5cGFzc3dkIHdlcmRlbiBuaWNodCB1bnRlcnN0XHUwMEZDdHp0LCB3ZW5uIC1zdG9yZXR5cGUgUEtDUzEyIGlzdCJ9LAotICAgICAgICB7Ii5rZXlwYXNzLmFuZC5uZXcuY2FuLm5vdC5iZS5zcGVjaWZpZWQuaWYuc3RvcmV0eXBlLmlzLnswfSIsCi0gICAgICAgICAgICAgICAgIi1rZXlwYXNzIHVuZCAtbmV3IGtcdTAwRjZubmVuIG5pY2h0IGFuZ2VnZWJlbiB3ZXJkZW4sIHdlbm4gLXN0b3JldHlwZSB7MH0gaXN0In0sCi0gICAgICAgIHsiaWYucHJvdGVjdGVkLmlzLnNwZWNpZmllZC50aGVuLnN0b3JlcGFzcy5rZXlwYXNzLmFuZC5uZXcubXVzdC5ub3QuYmUuc3BlY2lmaWVkIiwKLSAgICAgICAgICAgICAgICAiV2VubiAtcHJvdGVjdGVkIGFuZ2VnZWJlbiBpc3QsIGRcdTAwRkNyZmVuIC1zdG9yZXBhc3MsIC1rZXlwYXNzIHVuZCAtbmV3IG5pY2h0IGFuZ2VnZWJlbiB3ZXJkZW4ifSwKLSAgICAgICAgeyJpZi5zcmNwcm90ZWN0ZWQuaXMuc3BlY2lmaWVkLnRoZW4uc3Jjc3RvcmVwYXNzLmFuZC5zcmNrZXlwYXNzLm11c3Qubm90LmJlLnNwZWNpZmllZCIsCi0gICAgICAgICAgICAgICAgIldlbm4gLXNyY3Byb3RlY3RlZCBhbmdlZ2ViZW4gaXN0LCBkXHUwMEZDcmZlbiAtc3Jjc3RvcmVwYXNzIHVuZCAtc3Jja2V5cGFzcyBuaWNodCBhbmdlZ2ViZW4gd2VyZGVuIn0sCi0gICAgICAgIHsiaWYua2V5c3RvcmUuaXMubm90LnBhc3N3b3JkLnByb3RlY3RlZC50aGVuLnN0b3JlcGFzcy5rZXlwYXNzLmFuZC5uZXcubXVzdC5ub3QuYmUuc3BlY2lmaWVkIiwKLSAgICAgICAgICAgICAgICAiV2VubiBkZXIgS2V5c3RvcmUgbmljaHQga2VubndvcnRnZXNjaFx1MDBGQ3R6dCBpc3QsIGRcdTAwRkNyZmVuIC1zdG9yZXBhc3MsIC1rZXlwYXNzIHVuZCAtbmV3IG5pY2h0IGFuZ2VnZWJlbiB3ZXJkZW4ifSwKLSAgICAgICAgeyJpZi5zb3VyY2Uua2V5c3RvcmUuaXMubm90LnBhc3N3b3JkLnByb3RlY3RlZC50aGVuLnNyY3N0b3JlcGFzcy5hbmQuc3Jja2V5cGFzcy5tdXN0Lm5vdC5iZS5zcGVjaWZpZWQiLAotICAgICAgICAgICAgICAgICJXZW5uIGRlciBRdWVsbC1LZXlzdG9yZSBuaWNodCBrZW5ud29ydGdlc2NoXHUwMEZDdHp0IGlzdCwgZFx1MDBGQ3JmZW4gLXNyY3N0b3JlcGFzcyB1bmQgLXNyY2tleXBhc3MgbmljaHQgYW5nZWdlYmVuIHdlcmRlbiJ9LAotICAgICAgICB7IklsbGVnYWwuc3RhcnRkYXRlLnZhbHVlIiwgIlVuZ1x1MDBGQ2x0aWdlciBXZXJ0IGZcdTAwRkNyIEFuZmFuZ3NkYXR1bSJ9LAotICAgICAgICB7IlZhbGlkaXR5Lm11c3QuYmUuZ3JlYXRlci50aGFuLnplcm8iLAotICAgICAgICAgICAgICAgICJHXHUwMEZDbHRpZ2tlaXQgbXVzcyBnclx1MDBGNlx1MDBERmVyIGFscyBudWxsIHNlaW4ifSwKLSAgICAgICAgeyJwcm92TmFtZS5ub3QuYS5wcm92aWRlciIsICJ7MH0ga2VpbiBQcm92aWRlciJ9LAotICAgICAgICB7IlVzYWdlLmVycm9yLm5vLmNvbW1hbmQucHJvdmlkZWQiLCAiVmVyd2VuZHVuZ3NmZWhsZXI6IEtlaW4gQmVmZWhsIGFuZ2VnZWJlbiJ9LAotICAgICAgICB7IlNvdXJjZS5rZXlzdG9yZS5maWxlLmV4aXN0cy5idXQuaXMuZW1wdHkuIiwgIlF1ZWxsLUtleXN0b3JlLURhdGVpIGlzdCB6d2FyIHZvcmhhbmRlbiwgaXN0IGFiZXIgbGVlcjogIn0sCi0gICAgICAgIHsiUGxlYXNlLnNwZWNpZnkuc3Jja2V5c3RvcmUiLCAiR2ViZW4gU2llIC1zcmNrZXlzdG9yZSBhbiJ9LAotICAgICAgICB7Ik11c3Qubm90LnNwZWNpZnkuYm90aC52LmFuZC5yZmMud2l0aC5saXN0LmNvbW1hbmQiLAotICAgICAgICAgICAgICAgICItdiB1bmQgLXJmYyBkXHUwMEZDcmZlbiBiZWkgQmVmZWhsIFwibGlzdFwiIG5pY2h0IGJlaWRlIGFuZ2VnZWJlbiB3ZXJkZW4ifSwKLSAgICAgICAgeyJLZXkucGFzc3dvcmQubXVzdC5iZS5hdC5sZWFzdC42LmNoYXJhY3RlcnMiLAotICAgICAgICAgICAgICAgICJTY2hsXHUwMEZDc3NlbGtlbm53b3J0IG11c3MgbWluZGVzdGVucyBzZWNocyBaZWljaGVuIGxhbmcgc2VpbiJ9LAotICAgICAgICB7Ik5ldy5wYXNzd29yZC5tdXN0LmJlLmF0LmxlYXN0LjYuY2hhcmFjdGVycyIsCi0gICAgICAgICAgICAgICAgIk5ldWVzIEtlbm53b3J0IG11c3MgbWluZGVzdGVucyBzZWNocyBaZWljaGVuIGxhbmcgc2VpbiJ9LAotICAgICAgICB7IktleXN0b3JlLmZpbGUuZXhpc3RzLmJ1dC5pcy5lbXB0eS4iLAotICAgICAgICAgICAgICAgICJLZXlzdG9yZS1EYXRlaSBpc3Qgdm9yaGFuZGVuLCBpc3QgYWJlciBsZWVyOiAifSwKLSAgICAgICAgeyJLZXlzdG9yZS5maWxlLmRvZXMubm90LmV4aXN0LiIsCi0gICAgICAgICAgICAgICAgIktleXN0b3JlLURhdGVpIGlzdCBuaWNodCB2b3JoYW5kZW46ICJ9LAotICAgICAgICB7Ik11c3Quc3BlY2lmeS5kZXN0aW5hdGlvbi5hbGlhcyIsICJTaWUgbVx1MDBGQ3NzZW4gZWluZW4gWmllbGFsaWFzIGFuZ2ViZW4ifSwKLSAgICAgICAgeyJNdXN0LnNwZWNpZnkuYWxpYXMiLCAiU2llIG1cdTAwRkNzc2VuIGVpbmVuIEFsaWFzIGFuZ2ViZW4ifSwKLSAgICAgICAgeyJLZXlzdG9yZS5wYXNzd29yZC5tdXN0LmJlLmF0LmxlYXN0LjYuY2hhcmFjdGVycyIsCi0gICAgICAgICAgICAgICAgIktleXN0b3JlLUtlbm53b3J0IG11c3MgbWluZGVzdGVucyBzZWNocyBaZWljaGVuIGxhbmcgc2VpbiJ9LAotICAgICAgICB7IkVudGVyLmtleXN0b3JlLnBhc3N3b3JkLiIsICJLZXlzdG9yZS1LZW5ud29ydCBlaW5nZWJlbjogICJ9LAotICAgICAgICB7IkVudGVyLnNvdXJjZS5rZXlzdG9yZS5wYXNzd29yZC4iLCAiUXVlbGwtS2V5c3RvcmUtS2VubndvcnQgZWluZ2ViZW46ICAifSwKLSAgICAgICAgeyJFbnRlci5kZXN0aW5hdGlvbi5rZXlzdG9yZS5wYXNzd29yZC4iLCAiWmllbC1LZXlzdG9yZS1LZW5ud29ydCBlaW5nZWJlbjogICJ9LAotICAgICAgICB7IktleXN0b3JlLnBhc3N3b3JkLmlzLnRvby5zaG9ydC5tdXN0LmJlLmF0LmxlYXN0LjYuY2hhcmFjdGVycyIsCi0gICAgICAgICAiS2V5c3RvcmUtS2VubndvcnQgaXN0IHp1IGt1cnouIEVzIG11c3MgbWluZGVzdGVucyBzZWNocyBaZWljaGVuIGxhbmcgc2VpbiJ9LAotICAgICAgICB7IlVua25vd24uRW50cnkuVHlwZSIsICJVbmJla2FubnRlciBFaW50cmFnc3R5cCJ9LAotICAgICAgICB7IlRvby5tYW55LmZhaWx1cmVzLkFsaWFzLm5vdC5jaGFuZ2VkIiwgIlp1IHZpZWxlIEZlaGxlci4gQWxpYXMgbmljaHQgZ2VcdTAwRTRuZGVydCJ9LAotICAgICAgICB7IkVudHJ5LmZvci5hbGlhcy5hbGlhcy5zdWNjZXNzZnVsbHkuaW1wb3J0ZWQuIiwKLSAgICAgICAgICAgICAgICAgIkVpbnRyYWcgZlx1MDBGQ3IgQWxpYXMgezB9IGVyZm9sZ3JlaWNoIGltcG9ydGllcnQuIn0sCi0gICAgICAgIHsiRW50cnkuZm9yLmFsaWFzLmFsaWFzLm5vdC5pbXBvcnRlZC4iLCAiRWludHJhZyBmXHUwMEZDciBBbGlhcyB7MH0gbmljaHQgaW1wb3J0aWVydC4ifSwKLSAgICAgICAgeyJQcm9ibGVtLmltcG9ydGluZy5lbnRyeS5mb3IuYWxpYXMuYWxpYXMuZXhjZXB0aW9uLkVudHJ5LmZvci5hbGlhcy5hbGlhcy5ub3QuaW1wb3J0ZWQuIiwKLSAgICAgICAgICAgICAgICAgIlByb2JsZW0gYmVpbSBJbXBvcnRpZXJlbiBkZXMgRWludHJhZ3MgZlx1MDBGQ3IgQWxpYXMgezB9OiB7MX0uXG5FaW50cmFnIGZcdTAwRkNyIEFsaWFzIHswfSBuaWNodCBpbXBvcnRpZXJ0LiJ9LAotICAgICAgICB7IkltcG9ydC5jb21tYW5kLmNvbXBsZXRlZC5vay5lbnRyaWVzLnN1Y2Nlc3NmdWxseS5pbXBvcnRlZC5mYWlsLmVudHJpZXMuZmFpbGVkLm9yLmNhbmNlbGxlZCIsCi0gICAgICAgICAgICAgICAgICJJbXBvcnRiZWZlaGwgYWJnZXNjaGxvc3NlbjogezB9IEVpbnRyXHUwMEU0Z2UgZXJmb2xncmVpY2ggaW1wb3J0aWVydCwgezF9IEVpbnRyXHUwMEU0Z2UgbmljaHQgZXJmb2xncmVpY2ggb2RlciBhYmdlYnJvY2hlbiJ9LAotICAgICAgICB7Ildhcm5pbmcuT3ZlcndyaXRpbmcuZXhpc3RpbmcuYWxpYXMuYWxpYXMuaW4uZGVzdGluYXRpb24ua2V5c3RvcmUiLAotICAgICAgICAgICAgICAgICAiV2FybnVuZzogVm9yaGFuZGVuZXIgQWxpYXMgezB9IGluIFppZWwtS2V5c3RvcmUgd2lyZCBcdTAwRkNiZXJzY2hyaWViZW4ifSwKLSAgICAgICAgeyJFeGlzdGluZy5lbnRyeS5hbGlhcy5hbGlhcy5leGlzdHMub3ZlcndyaXRlLm5vLiIsCi0gICAgICAgICAgICAgICAgICJFaW50cmFnc2FsaWFzIHswfSBpc3QgYmVyZWl0cyB2b3JoYW5kZW4uIFx1MDBEQ2JlcnNjaHJlaWJlbj8gW05laW5dOiAgIn0sCi0gICAgICAgIHsiVG9vLm1hbnkuZmFpbHVyZXMudHJ5LmxhdGVyIiwgIlp1IHZpZWxlIEZlaGxlci4gVmVyc3VjaGVuIFNpZSBlcyBzcFx1MDBFNHRlciBlcm5ldXQifSwKLSAgICAgICAgeyJDZXJ0aWZpY2F0aW9uLnJlcXVlc3Quc3RvcmVkLmluLmZpbGUuZmlsZW5hbWUuIiwKLSAgICAgICAgICAgICAgICAiWmVydGlmaXppZXJ1bmdzYW5mb3JkZXJ1bmcgaW4gRGF0ZWkgPHswfT4gZ2VzcGVpY2hlcnQifSwKLSAgICAgICAgeyJTdWJtaXQudGhpcy50by55b3VyLkNBIiwgIkxlaXRlbiBTaWUgZGllcyBhbiBkaWUgQ0Egd2VpdGVyIn0sCi0gICAgICAgIHsiaWYuYWxpYXMubm90LnNwZWNpZmllZC5kZXN0YWxpYXMuc3Jja2V5cGFzcy5hbmQuZGVzdGtleXBhc3MubXVzdC5ub3QuYmUuc3BlY2lmaWVkIiwKLSAgICAgICAgICAgICJXZW5uIGtlaW4gQWxpYXMgYW5nZWdlYmVuIGlzdCwgZFx1MDBGQ3JmZW4gZGVzdGFsaWFzLCBzcmNrZXlwYXNzIHVuZCBkZXN0a2V5cGFzcyBuaWNodCBhbmdlZ2ViZW4gd2VyZGVuIn0sCi0gICAgICAgIHsiQ2VydGlmaWNhdGUuc3RvcmVkLmluLmZpbGUuZmlsZW5hbWUuIiwKLSAgICAgICAgICAgICAgICAiWmVydGlmaWthdCBpbiBEYXRlaSA8ezB9PiBnZXNwZWljaGVydCJ9LAotICAgICAgICB7IkNlcnRpZmljYXRlLnJlcGx5Lndhcy5pbnN0YWxsZWQuaW4ua2V5c3RvcmUiLAotICAgICAgICAgICAgICAgICJaZXJ0aWZpa2F0YW50d29ydCB3dXJkZSBpbiBLZXlzdG9yZSBpbnN0YWxsaWVydCJ9LAotICAgICAgICB7IkNlcnRpZmljYXRlLnJlcGx5Lndhcy5ub3QuaW5zdGFsbGVkLmluLmtleXN0b3JlIiwKLSAgICAgICAgICAgICAgICAiWmVydGlmaWthdGFudHdvcnQgd3VyZGUgbmljaHQgaW4gS2V5c3RvcmUgaW5zdGFsbGllcnQifSwKLSAgICAgICAgeyJDZXJ0aWZpY2F0ZS53YXMuYWRkZWQudG8ua2V5c3RvcmUiLAotICAgICAgICAgICAgICAgICJaZXJ0aWZpa2F0IHd1cmRlIEtleXN0b3JlIGhpbnp1Z2VmXHUwMEZDZ3QifSwKLSAgICAgICAgeyJDZXJ0aWZpY2F0ZS53YXMubm90LmFkZGVkLnRvLmtleXN0b3JlIiwKLSAgICAgICAgICAgICAgICAiWmVydGlmaWthdCB3dXJkZSBuaWNodCB6dSBLZXlzdG9yZSBoaW56dWdlZlx1MDBGQ2d0In0sCi0gICAgICAgIHsiLlN0b3Jpbmcua3NmbmFtZS4iLCAiW3swfSB3aXJkIGdlc2ljaGVydF0ifSwKLSAgICAgICAgeyJhbGlhcy5oYXMubm8ucHVibGljLmtleS5jZXJ0aWZpY2F0ZS4iLAotICAgICAgICAgICAgICAgICJ7MH0gaGF0IGtlaW5lbiBQdWJsaWMgS2V5IChaZXJ0aWZpa2F0KSJ9LAotICAgICAgICB7IkNhbm5vdC5kZXJpdmUuc2lnbmF0dXJlLmFsZ29yaXRobSIsCi0gICAgICAgICAgICAgICAgIlNpZ25hdHVyYWxnb3JpdGhtdXMga2FubiBuaWNodCBhYmdlbGVpdGV0IHdlcmRlbiJ9LAotICAgICAgICB7IkFsaWFzLmFsaWFzLmRvZXMubm90LmV4aXN0IiwKLSAgICAgICAgICAgICAgICAiQWxpYXMgPHswfT4gaXN0IG5pY2h0IHZvcmhhbmRlbiJ9LAotICAgICAgICB7IkFsaWFzLmFsaWFzLmhhcy5uby5jZXJ0aWZpY2F0ZSIsCi0gICAgICAgICAgICAgICAgIkFsaWFzIDx7MH0+IGhhdCBrZWluIFplcnRpZmlrYXQifSwKLSAgICAgICAgeyJLZXkucGFpci5ub3QuZ2VuZXJhdGVkLmFsaWFzLmFsaWFzLmFscmVhZHkuZXhpc3RzIiwKLSAgICAgICAgICAgICAgICAiU2NobFx1MDBGQ3NzZWxwYWFyIHd1cmRlIG5pY2h0IGdlbmVyaWVydC4gQWxpYXMgPHswfT4gaXN0IGJlcmVpdHMgdm9yaGFuZGVuIn0sCi0gICAgICAgIHsiR2VuZXJhdGluZy5rZXlzaXplLmJpdC5rZXlBbGdOYW1lLmtleS5wYWlyLmFuZC5zZWxmLnNpZ25lZC5jZXJ0aWZpY2F0ZS5zaWdBbGdOYW1lLndpdGguYS52YWxpZGl0eS5vZi52YWxpZGFsaXR5LmRheXMuZm9yIiwKLSAgICAgICAgICAgICAgICAiR2VuZXJpZXJlbiB2b24gU2NobFx1MDBGQ3NzZWxwYWFyIChUeXAgezF9LCB7MH0gQml0KSB1bmQgc2VsYnN0IHNpZ25pZXJ0ZW0gWmVydGlmaWthdCAoezJ9KSBtaXQgZWluZXIgR1x1MDBGQ2x0aWdrZWl0IHZvbiB7M30gVGFnZW5cblx0Zlx1MDBGQ3I6IHs0fSJ9LAotICAgICAgICB7IkVudGVyLmtleS5wYXNzd29yZC5mb3IuYWxpYXMuIiwgIlNjaGxcdTAwRkNzc2Vsa2VubndvcnQgZlx1MDBGQ3IgPHswfT4gZWluZ2ViZW4ifSwKLSAgICAgICAgeyIuUkVUVVJOLmlmLnNhbWUuYXMua2V5c3RvcmUucGFzc3dvcmQuIiwKLSAgICAgICAgICAgICAgICAiXHQoUkVUVVJOLCB3ZW5uIGlkZW50aXNjaCBtaXQgS2V5c3RvcmUtS2VubndvcnQpOiAgIn0sCi0gICAgICAgIHsiS2V5LnBhc3N3b3JkLmlzLnRvby5zaG9ydC5tdXN0LmJlLmF0LmxlYXN0LjYuY2hhcmFjdGVycyIsCi0gICAgICAgICAgICAgICAgIlNjaGxcdTAwRkNzc2Vsa2VubndvcnQgaXN0IHp1IGt1cnouIEVzIG11c3MgbWluZGVzdGVucyBzZWNocyBaZWljaGVuIGxhbmcgc2VpbiJ9LAotICAgICAgICB7IlRvby5tYW55LmZhaWx1cmVzLmtleS5ub3QuYWRkZWQudG8ua2V5c3RvcmUiLAotICAgICAgICAgICAgICAgICJadSB2aWVsZSBGZWhsZXIuIFNjaGxcdTAwRkNzc2VsIHd1cmRlIG5pY2h0IHp1IEtleXN0b3JlIGhpbnp1Z2VmXHUwMEZDZ3QifSwKLSAgICAgICAgeyJEZXN0aW5hdGlvbi5hbGlhcy5kZXN0LmFscmVhZHkuZXhpc3RzIiwKLSAgICAgICAgICAgICAgICAiWmllbGFsaWFzIDx7MH0+IGJlcmVpdHMgdm9yaGFuZGVuIn0sCi0gICAgICAgIHsiUGFzc3dvcmQuaXMudG9vLnNob3J0Lm11c3QuYmUuYXQubGVhc3QuNi5jaGFyYWN0ZXJzIiwKLSAgICAgICAgICAgICAgICAiS2VubndvcnQgaXN0IHp1IGt1cnouIEVzIG11c3MgbWluZGVzdGVucyBzZWNocyBaZWljaGVuIGxhbmcgc2VpbiJ9LAotICAgICAgICB7IlRvby5tYW55LmZhaWx1cmVzLktleS5lbnRyeS5ub3QuY2xvbmVkIiwKLSAgICAgICAgICAgICAgICAiWnUgdmllbGUgRmVobGVyLiBTY2hsXHUwMEZDc3NlbGVpbnRyYWcgd3VyZGUgbmljaHQgZ2VjbG9udCJ9LAotICAgICAgICB7ImtleS5wYXNzd29yZC5mb3IuYWxpYXMuIiwgIlNjaGxcdTAwRkNzc2Vsa2VubndvcnQgZlx1MDBGQ3IgPHswfT4ifSwKLSAgICAgICAgeyJLZXlzdG9yZS5lbnRyeS5mb3IuaWQuZ2V0TmFtZS5hbHJlYWR5LmV4aXN0cyIsCi0gICAgICAgICAgICAgICAgIktleXN0b3JlLUVpbnRyYWcgZlx1MDBGQ3IgPHswfT4gYmVyZWl0cyB2b3JoYW5kZW4ifSwKLSAgICAgICAgeyJDcmVhdGluZy5rZXlzdG9yZS5lbnRyeS5mb3IuaWQuZ2V0TmFtZS4iLAotICAgICAgICAgICAgICAgICJLZXlzdG9yZS1FaW50cmFnIGZcdTAwRkNyIDx7MH0+IHdpcmQgZXJzdGVsbHQuLi4ifSwKLSAgICAgICAgeyJOby5lbnRyaWVzLmZyb20uaWRlbnRpdHkuZGF0YWJhc2UuYWRkZWQiLAotICAgICAgICAgICAgICAgICJLZWluZSBFaW50clx1MDBFNGdlIGF1cyBJZGVudGl0eS1EYXRlbmJhbmsgaGluenVnZWZcdTAwRkNndCJ9LAotICAgICAgICB7IkFsaWFzLm5hbWUuYWxpYXMiLCAiQWxpYXNuYW1lOiB7MH0ifSwKLSAgICAgICAgeyJDcmVhdGlvbi5kYXRlLmtleVN0b3JlLmdldENyZWF0aW9uRGF0ZS5hbGlhcy4iLAotICAgICAgICAgICAgICAgICJFcnN0ZWxsdW5nc2RhdHVtOiB7MCxkYXRlfSJ9LAotICAgICAgICB7ImFsaWFzLmtleVN0b3JlLmdldENyZWF0aW9uRGF0ZS5hbGlhcy4iLAotICAgICAgICAgICAgICAgICJ7MH0sIHsxLGRhdGV9LCAifSwKLSAgICAgICAgeyJhbGlhcy4iLCAiezB9LCAifSwKLSAgICAgICAgeyJFbnRyeS50eXBlLnR5cGUuIiwgIkVpbnRyYWdzdHlwOiB7MH0ifSwKLSAgICAgICAgeyJDZXJ0aWZpY2F0ZS5jaGFpbi5sZW5ndGguIiwgIlplcnRpZmlrYXRrZXR0ZW5sXHUwMEU0bmdlOiAifSwKLSAgICAgICAgeyJDZXJ0aWZpY2F0ZS5pLjEuIiwgIlplcnRpZmlrYXRbezAsbnVtYmVyLGludGVnZXJ9XToifSwKLSAgICAgICAgeyJDZXJ0aWZpY2F0ZS5maW5nZXJwcmludC5TSEExLiIsICJaZXJ0aWZpa2F0LUZpbmdlcnByaW50IChTSEExKTogIn0sCi0gICAgICAgIHsiS2V5c3RvcmUudHlwZS4iLCAiS2V5c3RvcmUtVHlwOiAifSwKLSAgICAgICAgeyJLZXlzdG9yZS5wcm92aWRlci4iLCAiS2V5c3RvcmUtUHJvdmlkZXI6ICJ9LAotICAgICAgICB7IllvdXIua2V5c3RvcmUuY29udGFpbnMua2V5U3RvcmUuc2l6ZS5lbnRyeSIsCi0gICAgICAgICAgICAgICAgIktleXN0b3JlIGVudGhcdTAwRTRsdCB7MCxudW1iZXIsaW50ZWdlcn0gRWludHJhZyJ9LAotICAgICAgICB7IllvdXIua2V5c3RvcmUuY29udGFpbnMua2V5U3RvcmUuc2l6ZS5lbnRyaWVzIiwKLSAgICAgICAgICAgICAgICAiS2V5c3RvcmUgZW50aFx1MDBFNGx0IHswLG51bWJlcixpbnRlZ2VyfSBFaW50clx1MDBFNGdlIn0sCi0gICAgICAgIHsiRmFpbGVkLnRvLnBhcnNlLmlucHV0IiwgIkVpbmdhYmUga29ubnRlIG5pY2h0IGdlcGFyc3Qgd2VyZGVuIn0sCi0gICAgICAgIHsiRW1wdHkuaW5wdXQiLCAiTGVlcmUgRWluZ2FiZSJ9LAotICAgICAgICB7Ik5vdC5YLjUwOS5jZXJ0aWZpY2F0ZSIsICJLZWluIFguNTA5LVplcnRpZmlrYXQifSwKLSAgICAgICAgeyJhbGlhcy5oYXMubm8ucHVibGljLmtleSIsICJ7MH0gaGF0IGtlaW5lbiBQdWJsaWMgS2V5In0sCi0gICAgICAgIHsiYWxpYXMuaGFzLm5vLlguNTA5LmNlcnRpZmljYXRlIiwgInswfSBoYXQga2VpbiBYLjUwOS1aZXJ0aWZpa2F0In0sCi0gICAgICAgIHsiTmV3LmNlcnRpZmljYXRlLnNlbGYuc2lnbmVkLiIsICJOZXVlcyBaZXJ0aWZpa2F0IChzZWxic3Qgc2lnbmllcnQpOiJ9LAotICAgICAgICB7IlJlcGx5Lmhhcy5uby5jZXJ0aWZpY2F0ZXMiLCAiQW50d29ydCBoYXQga2VpbmUgWmVydGlmaWthdGUifSwKLSAgICAgICAgeyJDZXJ0aWZpY2F0ZS5ub3QuaW1wb3J0ZWQuYWxpYXMuYWxpYXMuYWxyZWFkeS5leGlzdHMiLAotICAgICAgICAgICAgICAgICJaZXJ0aWZpa2F0IG5pY2h0IGltcG9ydGllcnQuIEFsaWFzIDx7MH0+IGlzdCBiZXJlaXRzIHZvcmhhbmRlbiJ9LAotICAgICAgICB7IklucHV0Lm5vdC5hbi5YLjUwOS5jZXJ0aWZpY2F0ZSIsICJFaW5nYWJlIGtlaW4gWC41MDktWmVydGlmaWthdCJ9LAotICAgICAgICB7IkNlcnRpZmljYXRlLmFscmVhZHkuZXhpc3RzLmluLmtleXN0b3JlLnVuZGVyLmFsaWFzLnRydXN0YWxpYXMuIiwKLSAgICAgICAgICAgICAgICAiWmVydGlmaWthdCBpc3QgYmVyZWl0cyB1bnRlciBBbGlhcyA8ezB9PiBpbSBLZXlzdG9yZSB2b3JoYW5kZW4ifSwKLSAgICAgICAgeyJEby55b3Uuc3RpbGwud2FudC50by5hZGQuaXQubm8uIiwKLSAgICAgICAgICAgICAgICAiTVx1MDBGNmNodGVuIFNpZSBlcyB0cm90emRlbSBoaW56dWZcdTAwRkNnZW4/IFtOZWluXTogICJ9LAotICAgICAgICB7IkNlcnRpZmljYXRlLmFscmVhZHkuZXhpc3RzLmluLnN5c3RlbS53aWRlLkNBLmtleXN0b3JlLnVuZGVyLmFsaWFzLnRydXN0YWxpYXMuIiwKLSAgICAgICAgICAgICAgICAiWmVydGlmaWthdCBpc3QgYmVyZWl0cyB1bnRlciBBbGlhcyA8ezB9PiBpbSBzeXN0ZW13ZWl0ZW4gQ0EtS2V5c3RvcmUgdm9yaGFuZGVuIn0sCi0gICAgICAgIHsiRG8ueW91LnN0aWxsLndhbnQudG8uYWRkLml0LnRvLnlvdXIub3duLmtleXN0b3JlLm5vLiIsCi0gICAgICAgICAgICAgICAgIk1cdTAwRjZjaHRlbiBTaWUgZXMgdHJvdHpkZW0genUgSWhyZW0gZWlnZW5lbiBLZXlzdG9yZSBoaW56dWZcdTAwRkNnZW4/IFtOZWluXTogICJ9LAotICAgICAgICB7IlRydXN0LnRoaXMuY2VydGlmaWNhdGUubm8uIiwgIkRpZXNlbSBaZXJ0aWZpa2F0IHZlcnRyYXVlbj8gW05laW5dOiAgIn0sCi0gICAgICAgIHsiWUVTIiwgIkphIn0sCi0gICAgICAgIHsiTmV3LnByb21wdC4iLCAiTmV1ZXMgezB9OiAifSwKLSAgICAgICAgeyJQYXNzd29yZHMubXVzdC5kaWZmZXIiLCAiS2VubndcdTAwRjZydGVyIG1cdTAwRkNzc2VuIHNpY2ggdW50ZXJzY2hlaWRlbiJ9LAotICAgICAgICB7IlJlLmVudGVyLm5ldy5wcm9tcHQuIiwgIk5ldWVzIHswfSBlcm5ldXQgZWluZ2ViZW46ICJ9LAotICAgICAgICB7IlJlLmVudGVyLm5ldy5wYXNzd29yZC4iLCAiTmV1ZXMgS2VubndvcnQgZXJuZXV0IGVpbmdlYmVuOiAifSwKLSAgICAgICAgeyJUaGV5LmRvbi50Lm1hdGNoLlRyeS5hZ2FpbiIsICJLZWluZSBcdTAwRENiZXJlaW5zdGltbXVuZy4gV2llZGVyaG9sZW4gU2llIGRlbiBWb3JnYW5nIn0sCi0gICAgICAgIHsiRW50ZXIucHJvbXB0LmFsaWFzLm5hbWUuIiwgInswfS1BbGlhc25hbWVuIGVpbmdlYmVuOiAgIn0sCi0gICAgICAgIHsiRW50ZXIubmV3LmFsaWFzLm5hbWUuUkVUVVJOLnRvLmNhbmNlbC5pbXBvcnQuZm9yLnRoaXMuZW50cnkuIiwKLSAgICAgICAgICAgICAgICAgIkdlYmVuIFNpZSBlaW5lbiBuZXVlbiBBbGlhc25hbWVuIGVpblx0KFJFVFVSTiwgdW0gZGVuIEltcG9ydCBkaWVzZXMgRWludHJhZ3MgYWJ6dWJyZWNoZW4pOiAgIn0sCi0gICAgICAgIHsiRW50ZXIuYWxpYXMubmFtZS4iLCAiQWxpYXNuYW1lbiBlaW5nZWJlbjogICJ9LAotICAgICAgICB7Ii5SRVRVUk4uaWYuc2FtZS5hcy5mb3Iub3RoZXJBbGlhcy4iLAotICAgICAgICAgICAgICAgICJcdChSRVRVUk4sIHdlbm4gaWRlbnRpc2NoIG1pdCA8ezB9PikifSwKLSAgICAgICAgeyIuUEFUVEVSTi5wcmludFg1MDlDZXJ0IiwKLSAgICAgICAgICAgICAgICAiRWlnZW50XHUwMEZDbWVyOiB7MH1cbkF1c3N0ZWxsZXI6IHsxfVxuU2VyaWVubnVtbWVyOiB7Mn1cbkdcdTAwRkNsdGlnIHZvbjogezN9IGJpczogezR9XG5aZXJ0aWZpa2F0LUZpbmdlcnByaW50czpcblx0IE1ENTogIHs1fVxuXHQgU0hBMTogezZ9XG5cdCBTSEEyNTY6IHs3fVxuXHQgU2lnbmF0dXJhbGdvcml0aG11c25hbWU6IHs4fVxuXHQgVmVyc2lvbjogezl9In0sCi0gICAgICAgIHsiV2hhdC5pcy55b3VyLmZpcnN0LmFuZC5sYXN0Lm5hbWUuIiwKLSAgICAgICAgICAgICAgICAiV2llIGxhdXRldCBJaHIgVm9yLSB1bmQgTmFjaG5hbWU/In0sCi0gICAgICAgIHsiV2hhdC5pcy50aGUubmFtZS5vZi55b3VyLm9yZ2FuaXphdGlvbmFsLnVuaXQuIiwKLSAgICAgICAgICAgICAgICAiV2llIGxhdXRldCBkZXIgTmFtZSBJaHJlciBvcmdhbmlzYXRvcmlzY2hlbiBFaW5oZWl0PyJ9LAotICAgICAgICB7IldoYXQuaXMudGhlLm5hbWUub2YueW91ci5vcmdhbml6YXRpb24uIiwKLSAgICAgICAgICAgICAgICAiV2llIGxhdXRldCBkZXIgTmFtZSBJaHJlciBPcmdhbmlzYXRpb24/In0sCi0gICAgICAgIHsiV2hhdC5pcy50aGUubmFtZS5vZi55b3VyLkNpdHkub3IuTG9jYWxpdHkuIiwKLSAgICAgICAgICAgICAgICAiV2llIGxhdXRldCBkZXIgTmFtZSBJaHJlciBTdGFkdCBvZGVyIEdlbWVpbmRlPyJ9LAotICAgICAgICB7IldoYXQuaXMudGhlLm5hbWUub2YueW91ci5TdGF0ZS5vci5Qcm92aW5jZS4iLAotICAgICAgICAgICAgICAgICJXaWUgbGF1dGV0IGRlciBOYW1lIElocmVzIEJ1bmRlc2xhbmRzPyJ9LAotICAgICAgICB7IldoYXQuaXMudGhlLnR3by5sZXR0ZXIuY291bnRyeS5jb2RlLmZvci50aGlzLnVuaXQuIiwKLSAgICAgICAgICAgICAgICAiV2llIGxhdXRldCBkZXIgTFx1MDBFNG5kZXJjb2RlICh6d2VpIEJ1Y2hzdGFiZW4pIGZcdTAwRkNyIGRpZXNlIEVpbmhlaXQ/In0sCi0gICAgICAgIHsiSXMubmFtZS5jb3JyZWN0LiIsICJJc3QgezB9IHJpY2h0aWc/In0sCi0gICAgICAgIHsibm8iLCAiTmVpbiJ9LAotICAgICAgICB7InllcyIsICJKYSJ9LAotICAgICAgICB7InkiLCAiSiJ9LAotICAgICAgICB7Ii5kZWZhdWx0VmFsdWUuIiwgIiAgW3swfV06ICAifSwKLSAgICAgICAgeyJBbGlhcy5hbGlhcy5oYXMubm8ua2V5IiwKLSAgICAgICAgICAgICAgICAiQWxpYXMgPHswfT4gdmVyZlx1MDBGQ2d0IFx1MDBGQ2JlciBrZWluZW4gU2NobFx1MDBGQ3NzZWwifSwKLSAgICAgICAgeyJBbGlhcy5hbGlhcy5yZWZlcmVuY2VzLmFuLmVudHJ5LnR5cGUudGhhdC5pcy5ub3QuYS5wcml2YXRlLmtleS5lbnRyeS5UaGUua2V5Y2xvbmUuY29tbWFuZC5vbmx5LnN1cHBvcnRzLmNsb25pbmcub2YucHJpdmF0ZS5rZXkiLAotICAgICAgICAgICAgICAgICAiQWxpYXMgPHswfT4gdmVyd2Vpc3QgYXVmIGVpbmVuIEVpbnRyYWdzdHlwLCBkZXIga2VpbiBQcml2YXRlIEtleS1FaW50cmFnIGlzdC4gRGVyIEJlZmVobCAta2V5Y2xvbmUgdW50ZXJzdFx1MDBGQ3R6dCBudXIgZGFzIENsb25lbiB2b24gUHJpdmF0ZSBLZXktRWludHJcdTAwRTRnZW4ifSwKLQotICAgICAgICB7Ii5XQVJOSU5HLldBUk5JTkcuV0FSTklORy4iLAotICAgICAgICAgICAgIioqKioqKioqKioqKioqKioqICBXYXJudW5nIFdhcm51bmcgV2FybnVuZyAgKioqKioqKioqKioqKioqKioifSwKLSAgICAgICAgeyJTaWduZXIuZC4iLCAiU2lnbmF0dXJnZWJlciAjJWQ6In0sCi0gICAgICAgIHsiVGltZXN0YW1wLiIsICJaZWl0c3RlbXBlbDoifSwKLSAgICAgICAgeyJTaWduYXR1cmUuIiwgIlNpZ25hdHVyOiJ9LAotICAgICAgICB7IkNSTHMuIiwgIkNSTHM6In0sCi0gICAgICAgIHsiQ2VydGlmaWNhdGUub3duZXIuIiwgIlplcnRpZmlrYXRlaWdlbnRcdTAwRkNtZXI6ICJ9LAotICAgICAgICB7Ik5vdC5hLnNpZ25lZC5qYXIuZmlsZSIsICJLZWluZSBzaWduaWVydGUgSkFSLURhdGVpIn0sCi0gICAgICAgIHsiTm8uY2VydGlmaWNhdGUuZnJvbS50aGUuU1NMLnNlcnZlciIsCi0gICAgICAgICAgICAgICAgIktlaW4gWmVydGlmaWthdCB2b20gU1NMLVNlcnZlciJ9LAotCi0gICAgICAgIHsiLlRoZS5pbnRlZ3JpdHkub2YudGhlLmluZm9ybWF0aW9uLnN0b3JlZC5pbi55b3VyLmtleXN0b3JlLiIsCi0gICAgICAgICAgICAiKiBEaWUgSW50ZWdyaXRcdTAwRTR0IGRlciBJbmZvcm1hdGlvbmVuLCBkaWUgaW4gSWhyZW0gS2V5c3RvcmUgZ2VzcGVpY2hlcnQgc2luZCwgKlxuKiB3dXJkZSBOSUNIVCBnZXByXHUwMEZDZnQuIFVtIGRpZSBJbnRlZ3JpdFx1MDBFNHQgenUgcHJcdTAwRkNmZW4sICpcbiogbVx1MDBGQ3NzZW4gU2llIElociBLZXlzdG9yZS1LZW5ud29ydCBhbmdlYmVuLiAgICAgICAgICAgICAgICAgICoifSwKLSAgICAgICAgeyIuVGhlLmludGVncml0eS5vZi50aGUuaW5mb3JtYXRpb24uc3RvcmVkLmluLnRoZS5zcmNrZXlzdG9yZS4iLAotICAgICAgICAgICAgIiogRGllIEludGVncml0XHUwMEU0dCBkZXIgSW5mb3JtYXRpb25lbiwgZGllIGluIElocmVtIFNyY2tleXN0b3JlIGdlc3BlaWNoZXJ0IHNpbmQsICpcbiogd3VyZGUgTklDSFQgZ2Vwclx1MDBGQ2Z0LiBVbSBkaWUgSW50ZWdyaXRcdTAwRTR0IHp1IHByXHUwMEZDZmVuLCAqXG4qIG1cdTAwRkNzc2VuIFNpZSBJaHIgU3Jja2V5c3RvcmUtS2VubndvcnQgYW5nZWJlbi4gICAgICAgICAgICAgICAgICAqIn0sCi0KLSAgICAgICAgeyJDZXJ0aWZpY2F0ZS5yZXBseS5kb2VzLm5vdC5jb250YWluLnB1YmxpYy5rZXkuZm9yLmFsaWFzLiIsCi0gICAgICAgICAgICAgICAgIlplcnRpZmlrYXRhbnR3b3J0IGVudGhcdTAwRTRsdCBrZWluZW4gUHVibGljIEtleSBmXHUwMEZDciA8ezB9PiJ9LAotICAgICAgICB7IkluY29tcGxldGUuY2VydGlmaWNhdGUuY2hhaW4uaW4ucmVwbHkiLAotICAgICAgICAgICAgICAgICJVbnZvbGxzdFx1MDBFNG5kaWdlIFplcnRpZmlrYXRrZXR0ZSBpbiBBbnR3b3J0In0sCi0gICAgICAgIHsiQ2VydGlmaWNhdGUuY2hhaW4uaW4ucmVwbHkuZG9lcy5ub3QudmVyaWZ5LiIsCi0gICAgICAgICAgICAgICAgIlplcnRpZmlrYXRrZXR0ZSBpbiBBbnR3b3J0IHZlcmlmaXppZXJ0IG5pY2h0OiAifSwKLSAgICAgICAgeyJUb3AubGV2ZWwuY2VydGlmaWNhdGUuaW4ucmVwbHkuIiwKLSAgICAgICAgICAgICAgICAiWmVydGlmaWthdCBkZXIgb2JlcnN0ZW4gRWJlbmUgaW4gQW50d29ydDpcbiJ9LAotICAgICAgICB7Ii5pcy5ub3QudHJ1c3RlZC4iLCAiLi4uIGlzdCBuaWNodCB2ZXJ0cmF1ZW5zd1x1MDBGQ3JkaWcuICJ9LAotICAgICAgICB7Ikluc3RhbGwucmVwbHkuYW55d2F5Lm5vLiIsICJBbnR3b3J0IHRyb3R6ZGVtIGluc3RhbGxpZXJlbj8gW05laW5dOiAgIn0sCi0gICAgICAgIHsiTk8iLCAiTmVpbiJ9LAotICAgICAgICB7IlB1YmxpYy5rZXlzLmluLnJlcGx5LmFuZC5rZXlzdG9yZS5kb24udC5tYXRjaCIsCi0gICAgICAgICAgICAgICAgIlB1YmxpYyBLZXlzIGluIEFudHdvcnQgdW5kIEtleXN0b3JlIHN0aW1tZW4gbmljaHQgXHUwMEZDYmVyZWluIn0sCi0gICAgICAgIHsiQ2VydGlmaWNhdGUucmVwbHkuYW5kLmNlcnRpZmljYXRlLmluLmtleXN0b3JlLmFyZS5pZGVudGljYWwiLAotICAgICAgICAgICAgICAgICJaZXJ0aWZpa2F0YW50d29ydCB1bmQgWmVydGlmaWthdCBpbiBLZXlzdG9yZSBzaW5kIGlkZW50aXNjaCJ9LAotICAgICAgICB7IkZhaWxlZC50by5lc3RhYmxpc2guY2hhaW4uZnJvbS5yZXBseSIsCi0gICAgICAgICAgICAgICAgIktldHRlIGtvbm50ZSBkZXIgQW50d29ydCBuaWNodCBlbnRub21tZW4gd2VyZGVuIn0sCi0gICAgICAgIHsibiIsICJOIn0sCi0gICAgICAgIHsiV3JvbmcuYW5zd2VyLnRyeS5hZ2FpbiIsICJGYWxzY2hlIEFudHdvcnQuIFdpZWRlcmhvbGVuIFNpZSBkZW4gVm9yZ2FuZyJ9LAotICAgICAgICB7IlNlY3JldC5rZXkubm90LmdlbmVyYXRlZC5hbGlhcy5hbGlhcy5hbHJlYWR5LmV4aXN0cyIsCi0gICAgICAgICAgICAgICAgIlNlY3JldCBLZXkgd3VyZGUgbmljaHQgZ2VuZXJpZXJ0LiBBbGlhcyA8ezB9PiBpc3QgYmVyZWl0cyB2b3JoYW5kZW4ifSwKLSAgICAgICAgeyJQbGVhc2UucHJvdmlkZS5rZXlzaXplLmZvci5zZWNyZXQua2V5LmdlbmVyYXRpb24iLAotICAgICAgICAgICAgICAgICJHZWJlbiBTaWUgLWtleXNpemUgenVtIEVyc3RlbGxlbiBlaW5lcyBTZWNyZXQgS2V5cyBhbiJ9LAotCi0gICAgICAgIHsiRXh0ZW5zaW9ucy4iLCAiRXJ3ZWl0ZXJ1bmdlbjogIn0sCi0gICAgICAgIHsiLkVtcHR5LnZhbHVlLiIsICIoTGVlcmVyIFdlcnQpIn0sCi0gICAgICAgIHsiRXh0ZW5zaW9uLlJlcXVlc3QuIiwgIkVyd2VpdGVydW5nc2FuZm9yZGVydW5nOiJ9LAotICAgICAgICB7IlBLQ1MuMTAuQ2VydGlmaWNhdGUuUmVxdWVzdC5WZXJzaW9uLjEuMC5TdWJqZWN0LnMuUHVibGljLktleS5zLmZvcm1hdC5zLmtleS4iLAotICAgICAgICAgICAgICAgICJQS0NTICMxMC1aZXJ0aWZpa2F0YW5mb3JkZXJ1bmcgKFZlcnNpb24gMS4wKVxuU3ViamVrdDogJXNcblB1YmxpYyBLZXk6ICVzIEZvcm1hdCAlcyBTY2hsXHUwMEZDc3NlbFxuIn0sCi0gICAgICAgIHsiVW5rbm93bi5rZXlVc2FnZS50eXBlLiIsICJVbmJla2FubnRlciBrZXlVc2FnZS1UeXA6ICJ9LAotICAgICAgICB7IlVua25vd24uZXh0ZW5kZWRrZXlVc2FnZS50eXBlLiIsICJVbmJla2FubnRlciBleHRlbmRlZGtleVVzYWdlLVR5cDogIn0sCi0gICAgICAgIHsiVW5rbm93bi5BY2Nlc3NEZXNjcmlwdGlvbi50eXBlLiIsICJVbmJla2FubnRlciBBY2Nlc3NEZXNjcmlwdGlvbi1UeXA6ICJ9LAotICAgICAgICB7IlVucmVjb2duaXplZC5HZW5lcmFsTmFtZS50eXBlLiIsICJVbmJla2FubnRlciBHZW5lcmFsTmFtZS1UeXA6ICJ9LAotICAgICAgICB7IlRoaXMuZXh0ZW5zaW9uLmNhbm5vdC5iZS5tYXJrZWQuYXMuY3JpdGljYWwuIiwKLSAgICAgICAgICAgICAgICAgIkVyd2VpdGVydW5nIGthbm4gbmljaHQgYWxzIFwiS3JpdGlzY2hcIiBtYXJraWVydCB3ZXJkZW4uICJ9LAotICAgICAgICB7Ik9kZC5udW1iZXIub2YuaGV4LmRpZ2l0cy5mb3VuZC4iLCAiVW5nZXJhZGUgQW56YWhsIGhleGFkZXppbWFsZXIgWmlmZmVybiBnZWZ1bmRlbjogIn0sCi0gICAgICAgIHsiVW5rbm93bi5leHRlbnNpb24udHlwZS4iLCAiVW5iZWthbm50ZXIgRXJ3ZWl0ZXJ1bmdzdHlwOiAifSwKLSAgICAgICAgeyJjb21tYW5kLnswfS5pcy5hbWJpZ3VvdXMuIiwgIkJlZmVobCB7MH0gaXN0IG1laHJkZXV0aWc6In0sCi0KLSAgICAgICAgLy8gcG9saWN5dG9vbAotICAgICAgICB7Ildhcm5pbmcuQS5wdWJsaWMua2V5LmZvci5hbGlhcy5zaWduZXJzLmkuZG9lcy5ub3QuZXhpc3QuTWFrZS5zdXJlLmEuS2V5U3RvcmUuaXMucHJvcGVybHkuY29uZmlndXJlZC4iLAotICAgICAgICAgICAgICAgICJXYXJudW5nOiBLZWluIFB1YmxpYyBLZXkgZlx1MDBGQ3IgQWxpYXMgezB9IHZvcmhhbmRlbi4gVmVyZ2V3aXNzZXJuIFNpZSBzaWNoLCBkYXNzIGRlciBLZXlTdG9yZSBvcmRudW5nc2dlbVx1MDBFNFx1MDBERiBrb25maWd1cmllcnQgaXN0LiJ9LAotICAgICAgICB7Ildhcm5pbmcuQ2xhc3Mubm90LmZvdW5kLmNsYXNzIiwgIldhcm51bmc6IEtsYXNzZSBuaWNodCBnZWZ1bmRlbjogezB9In0sCi0gICAgICAgIHsiV2FybmluZy5JbnZhbGlkLmFyZ3VtZW50LnMuZm9yLmNvbnN0cnVjdG9yLmFyZyIsCi0gICAgICAgICAgICAgICAgIldhcm51bmc6IFVuZ1x1MDBGQ2x0aWdlKHMpIEFyZ3VtZW50KGUpIGZcdTAwRkNyIENvbnN0cnVjdG9yOiB7MH0ifSwKLSAgICAgICAgeyJJbGxlZ2FsLlByaW5jaXBhbC5UeXBlLnR5cGUiLCAiVW5nXHUwMEZDbHRpZ2VyIFByaW5jaXBhbC1UeXA6IHswfSJ9LAotICAgICAgICB7IklsbGVnYWwub3B0aW9uLm9wdGlvbiIsICJVbmdcdTAwRkNsdGlnZSBPcHRpb246IHswfSJ9LAotICAgICAgICB7IlVzYWdlLnBvbGljeXRvb2wub3B0aW9ucy4iLCAiVmVyd2VuZHVuZzogcG9saWN5dG9vbCBbT3B0aW9uZW5dIn0sCi0gICAgICAgIHsiLmZpbGUuZmlsZS5wb2xpY3kuZmlsZS5sb2NhdGlvbiIsCi0gICAgICAgICAgICAgICAgIiBbLWZpbGUgPERhdGVpPl0gICAgUG9saWN5LURhdGVpdmVyemVpY2huaXMifSwKLSAgICAgICAgeyJOZXciLCAiTmV1In0sCi0gICAgICAgIHsiT3BlbiIsICJcdTAwRDZmZm5lbiJ9LAotICAgICAgICB7IlNhdmUiLCAiU3BlaWNoZXJuIn0sCi0gICAgICAgIHsiU2F2ZS5BcyIsICJTcGVpY2hlcm4gdW50ZXIifSwKLSAgICAgICAgeyJWaWV3Lldhcm5pbmcuTG9nIiwgIldhcm51bmdzbG9nIGFuemVpZ2VuIn0sCi0gICAgICAgIHsiRXhpdCIsICJCZWVuZGVuIn0sCi0gICAgICAgIHsiQWRkLlBvbGljeS5FbnRyeSIsICJQb2xpY3ktRWludHJhZyBoaW56dWZcdTAwRkNnZW4ifSwKLSAgICAgICAgeyJFZGl0LlBvbGljeS5FbnRyeSIsICJQb2xpY3ktRWludHJhZyBiZWFyYmVpdGVuIn0sCi0gICAgICAgIHsiUmVtb3ZlLlBvbGljeS5FbnRyeSIsICJQb2xpY3ktRWludHJhZyBlbnRmZXJuZW4ifSwKLSAgICAgICAgeyJFZGl0IiwgIkJlYXJiZWl0ZW4ifSwKLSAgICAgICAgeyJSZXRhaW4iLCAiQmVpYmVoYWx0ZW4ifSwKLQotICAgICAgICB7Ildhcm5pbmcuRmlsZS5uYW1lLm1heS5pbmNsdWRlLmVzY2FwZWQuYmFja3NsYXNoLmNoYXJhY3RlcnMuSXQuaXMubm90Lm5lY2Vzc2FyeS50by5lc2NhcGUuYmFja3NsYXNoLmNoYXJhY3RlcnMudGhlLnRvb2wuZXNjYXBlcyIsCi0gICAgICAgICAgICAiV2FybnVuZzogTVx1MDBGNmdsaWNoZXJ3ZWlzZSBlbnRoXHUwMEU0bHQgZGVyIERhdGVpbmFtZSBFc2NhcGUtWmVpY2hlbiBtaXQgQmFja3NsYXNoLiBFcyBpc3QgbmljaHQgbm90d2VuZGlnLCBCYWNrc2xhc2gtWmVpY2hlbiB6dSBlc2NhcGVuIChkYXMgVG9vbCBmXHUwMEZDaHJ0IGRpZXMgYXV0b21hdGlzY2ggYmVpbSBTY2hyZWliZW4gZGVzIFBvbGljeS1Db250ZW50cyBpbiBkZW4gcGVyc2lzdGVudGVuIFNwZWljaGVyIGF1cykuXG5cbktsaWNrZW4gU2llIGF1ZiBcIkJlaWJlaGFsdGVuXCIsIHVtIGRlbiBlaW5nZWdlYmVuZW4gTmFtZW4gYmVpenViZWhhbHRlbiBvZGVyIGF1ZiBcIkJlYXJiZWl0ZW5cIiwgdW0gZGVuIE5hbWVuIHp1IGJlYXJiZWl0ZW4uIn0sCi0KLSAgICAgICAgeyJBZGQuUHVibGljLktleS5BbGlhcyIsICJQdWJsaWMgS2V5LUFsaWFzIGhpbnp1Zlx1MDBGQ2dlbiJ9LAotICAgICAgICB7IlJlbW92ZS5QdWJsaWMuS2V5LkFsaWFzIiwgIlB1YmxpYyBLZXktQWxpYXMgZW50ZmVybmVuIn0sCi0gICAgICAgIHsiRmlsZSIsICJEYXRlaSJ9LAotICAgICAgICB7IktleVN0b3JlIiwgIktleVN0b3JlIn0sCi0gICAgICAgIHsiUG9saWN5LkZpbGUuIiwgIlBvbGljeS1EYXRlaToifSwKLSAgICAgICAgeyJDb3VsZC5ub3Qub3Blbi5wb2xpY3kuZmlsZS5wb2xpY3lGaWxlLmUudG9TdHJpbmcuIiwKLSAgICAgICAgICAgICAgICAiUG9saWN5LURhdGVpIGtvbm50ZSBuaWNodCBnZVx1MDBGNmZmbmV0IHdlcmRlbjogezB9OiB7MX0ifSwKLSAgICAgICAgeyJQb2xpY3kuVG9vbCIsICJQb2xpY3ktVG9vbCJ9LAotICAgICAgICB7IkVycm9ycy5oYXZlLm9jY3VycmVkLndoaWxlLm9wZW5pbmcudGhlLnBvbGljeS5jb25maWd1cmF0aW9uLlZpZXcudGhlLldhcm5pbmcuTG9nLmZvci5tb3JlLmluZm9ybWF0aW9uLiIsCi0gICAgICAgICAgICAgICAgIkJlaW0gXHUwMEQ2ZmZuZW4gZGVyIFBvbGljeS1Lb25maWd1cmF0aW9uIHNpbmQgRmVobGVyIGF1ZmdldHJldGVuLiBXZWl0ZXJlIEluZm9ybWF0aW9uZW4gZmluZGVuIFNpZSBpbSBXYXJudW5nc2xvZy4ifSwKLSAgICAgICAgeyJFcnJvciIsICJGZWhsZXIifSwKLSAgICAgICAgeyJPSyIsICJPSyJ9LAotICAgICAgICB7IlN0YXR1cyIsICJTdGF0dXMifSwKLSAgICAgICAgeyJXYXJuaW5nIiwgIldhcm51bmcifSwKLSAgICAgICAgeyJQZXJtaXNzaW9uLiIsCi0gICAgICAgICAgICAgICAgIkJlcmVjaHRpZ3VuZzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIn0sCi0gICAgICAgIHsiUHJpbmNpcGFsLlR5cGUuIiwgIlByaW5jaXBhbC1UeXA6In0sCi0gICAgICAgIHsiUHJpbmNpcGFsLk5hbWUuIiwgIlByaW5jaXBhbC1OYW1lOiJ9LAotICAgICAgICB7IlRhcmdldC5OYW1lLiIsCi0gICAgICAgICAgICAgICAgIlppZWxuYW1lOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifSwKLSAgICAgICAgeyJBY3Rpb25zLiIsCi0gICAgICAgICAgICAgICAgIkFrdGlvbmVuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifSwKLSAgICAgICAgeyJPSy50by5vdmVyd3JpdGUuZXhpc3RpbmcuZmlsZS5maWxlbmFtZS4iLAotICAgICAgICAgICAgICAgICJWb3JoYW5kZW5lIERhdGVpIHswfSBcdTAwRkNiZXJzY2hyZWliZW4/In0sCi0gICAgICAgIHsiQ2FuY2VsIiwgIkFiYnJlY2hlbiJ9LAotICAgICAgICB7IkNvZGVCYXNlLiIsICJDb2RlQmFzZToifSwKLSAgICAgICAgeyJTaWduZWRCeS4iLCAiU2lnbmVkQnk6In0sCi0gICAgICAgIHsiQWRkLlByaW5jaXBhbCIsICJQcmluY2lwYWwgaGluenVmXHUwMEZDZ2VuIn0sCi0gICAgICAgIHsiRWRpdC5QcmluY2lwYWwiLCAiUHJpbmNpcGFsIGJlYXJiZWl0ZW4ifSwKLSAgICAgICAgeyJSZW1vdmUuUHJpbmNpcGFsIiwgIlByaW5jaXBhbCBlbnRmZXJuZW4ifSwKLSAgICAgICAgeyJQcmluY2lwYWxzLiIsICJQcmluY2lwYWxzOiJ9LAotICAgICAgICB7Ii5BZGQuUGVybWlzc2lvbiIsICIgIEJlcmVjaHRpZ3VuZyBoaW56dWZcdTAwRkNnZW4ifSwKLSAgICAgICAgeyIuRWRpdC5QZXJtaXNzaW9uIiwgIiAgQmVyZWNodGlndW5nIGJlYXJiZWl0ZW4ifSwKLSAgICAgICAgeyJSZW1vdmUuUGVybWlzc2lvbiIsICJCZXJlY2h0aWd1bmcgZW50ZmVybmVuIn0sCi0gICAgICAgIHsiRG9uZSIsICJGZXJ0aWcifSwKLSAgICAgICAgeyJLZXlTdG9yZS5VUkwuIiwgIktleVN0b3JlLVVSTDoifSwKLSAgICAgICAgeyJLZXlTdG9yZS5UeXBlLiIsICJLZXlTdG9yZS1UeXA6In0sCi0gICAgICAgIHsiS2V5U3RvcmUuUHJvdmlkZXIuIiwgIktleVN0b3JlLVByb3ZpZGVyOiJ9LAotICAgICAgICB7IktleVN0b3JlLlBhc3N3b3JkLlVSTC4iLCAiS2V5U3RvcmUtS2VubndvcnQtVVJMOiJ9LAotICAgICAgICB7IlByaW5jaXBhbHMiLCAiUHJpbmNpcGFscyJ9LAotICAgICAgICB7Ii5FZGl0LlByaW5jaXBhbC4iLCAiICBQcmluY2lwYWwgYmVhcmJlaXRlbjoifSwKLSAgICAgICAgeyIuQWRkLk5ldy5QcmluY2lwYWwuIiwgIiAgTmV1ZW4gUHJpbmNpcGFsIGhpbnp1Zlx1MDBGQ2dlbjoifSwKLSAgICAgICAgeyJQZXJtaXNzaW9ucyIsICJCZXJlY2h0aWd1bmdlbiJ9LAotICAgICAgICB7Ii5FZGl0LlBlcm1pc3Npb24uIiwgIiAgQmVyZWNodGlndW5nIGJlYXJiZWl0ZW46In0sCi0gICAgICAgIHsiLkFkZC5OZXcuUGVybWlzc2lvbi4iLCAiICBOZXVlIEJlcmVjaHRpZ3VuZyBoaW56dWZcdTAwRkNnZW46In0sCi0gICAgICAgIHsiU2lnbmVkLkJ5LiIsICJTaWduaWVydCB2b246In0sCi0gICAgICAgIHsiQ2Fubm90LlNwZWNpZnkuUHJpbmNpcGFsLndpdGguYS5XaWxkY2FyZC5DbGFzcy53aXRob3V0LmEuV2lsZGNhcmQuTmFtZSIsCi0gICAgICAgICAgICAiUHJpbmNpcGFsIGthbm4gbmljaHQgbWl0IGVpbmVyIFBsYXR6aGFsdGVya2xhc3NlIG9obmUgUGxhdHpoYWx0ZXJuYW1lbiBhbmdlZ2ViZW4gd2VyZGVuIn0sCi0gICAgICAgIHsiQ2Fubm90LlNwZWNpZnkuUHJpbmNpcGFsLndpdGhvdXQuYS5OYW1lIiwKLSAgICAgICAgICAgICJQcmluY2lwYWwga2FubiBuaWNodCBvaG5lIGVpbmVuIE5hbWVuIGFuZ2VnZWJlbiB3ZXJkZW4ifSwKLSAgICAgICAgeyJQZXJtaXNzaW9uLmFuZC5UYXJnZXQuTmFtZS5tdXN0LmhhdmUuYS52YWx1ZSIsCi0gICAgICAgICAgICAgICAgIkJlcmVjaHRpZ3VuZyB1bmQgWmllbG5hbWUgbVx1MDBGQ3NzZW4gZWluZW4gV2VydCBoYWJlbiJ9LAotICAgICAgICB7IlJlbW92ZS50aGlzLlBvbGljeS5FbnRyeS4iLCAiRGllc2VuIFBvbGljeS1FaW50cmFnIGVudGZlcm5lbj8ifSwKLSAgICAgICAgeyJPdmVyd3JpdGUuRmlsZSIsICJEYXRlaSBcdTAwRkNiZXJzY2hyZWliZW4ifSwKLSAgICAgICAgeyJQb2xpY3kuc3VjY2Vzc2Z1bGx5LndyaXR0ZW4udG8uZmlsZW5hbWUiLAotICAgICAgICAgICAgICAgICJQb2xpY3kgZXJmb2xncmVpY2ggaW4gezB9IGdlc2NocmllYmVuIn0sCi0gICAgICAgIHsibnVsbC5maWxlbmFtZSIsICJOdWxsLURhdGVpbmFtZSJ9LAotICAgICAgICB7IlNhdmUuY2hhbmdlcy4iLCAiXHUwMEM0bmRlcnVuZ2VuIHNwZWljaGVybj8ifSwKLSAgICAgICAgeyJZZXMiLCAiSmEifSwKLSAgICAgICAgeyJObyIsICJOZWluIn0sCi0gICAgICAgIHsiUG9saWN5LkVudHJ5IiwgIlBvbGljeS1FaW50cmFnIn0sCi0gICAgICAgIHsiU2F2ZS5DaGFuZ2VzIiwgIlx1MDBDNG5kZXJ1bmdlbiBzcGVpY2hlcm4ifSwKLSAgICAgICAgeyJOby5Qb2xpY3kuRW50cnkuc2VsZWN0ZWQiLCAiS2VpbiBQb2xpY3ktRWludHJhZyBhdXNnZXdcdTAwRTRobHQifSwKLSAgICAgICAgeyJVbmFibGUudG8ub3Blbi5LZXlTdG9yZS5leC50b1N0cmluZy4iLAotICAgICAgICAgICAgICAgICJLZXlTdG9yZSBrYW5uIG5pY2h0IGdlXHUwMEY2ZmZuZXQgd2VyZGVuOiB7MH0ifSwKLSAgICAgICAgeyJOby5wcmluY2lwYWwuc2VsZWN0ZWQiLCAiS2VpbiBQcmluY2lwYWwgYXVzZ2V3XHUwMEU0aGx0In0sCi0gICAgICAgIHsiTm8ucGVybWlzc2lvbi5zZWxlY3RlZCIsICJLZWluZSBCZXJlY2h0aWd1bmcgYXVzZ2V3XHUwMEU0aGx0In0sCi0gICAgICAgIHsibmFtZSIsICJOYW1lIn0sCi0gICAgICAgIHsiY29uZmlndXJhdGlvbi50eXBlIiwgIktvbmZpZ3VyYXRpb25zdHlwIn0sCi0gICAgICAgIHsiZW52aXJvbm1lbnQudmFyaWFibGUubmFtZSIsICJVbWdlYnVuZ3N2YXJpYWJsZW5uYW1lIn0sCi0gICAgICAgIHsibGlicmFyeS5uYW1lIiwgIkxpYnJhcnktTmFtZSJ9LAotICAgICAgICB7InBhY2thZ2UubmFtZSIsICJQYWNrYWdlbmFtZSJ9LAotICAgICAgICB7InBvbGljeS50eXBlIiwgIlBvbGljeS1UeXAifSwKLSAgICAgICAgeyJwcm9wZXJ0eS5uYW1lIiwgIkVpZ2Vuc2NoYWZ0c25hbWUifSwKLSAgICAgICAgeyJQcmluY2lwYWwuTGlzdCIsICJQcmluY2lwYWwtTGlzdGUifSwKLSAgICAgICAgeyJQZXJtaXNzaW9uLkxpc3QiLCAiQmVyZWNodGlndW5nc2xpc3RlIn0sCi0gICAgICAgIHsiQ29kZS5CYXNlIiwgIkNvZGViYXNlIn0sCi0gICAgICAgIHsiS2V5U3RvcmUuVS5SLkwuIiwgIktleVN0b3JlLVVSTDoifSwKLSAgICAgICAgeyJLZXlTdG9yZS5QYXNzd29yZC5VLlIuTC4iLCAiS2V5U3RvcmUtS2VubndvcnQtVVJMOiJ9LAotCi0KICAgICAgICAgLy8gamF2YXguc2VjdXJpdHkuYXV0aC5Qcml2YXRlQ3JlZGVudGlhbFBlcm1pc3Npb24KICAgICAgICAgeyJpbnZhbGlkLm51bGwuaW5wdXQucy4iLCAiVW5nXHUwMEZDbHRpZ2UgTnVsbGVpbmdhYmUobikifSwKICAgICAgICAgeyJhY3Rpb25zLmNhbi5vbmx5LmJlLnJlYWQuIiwgIkFrdGlvbmVuIGtcdTAwRjZubmVuIG51ciBcImxlc2VuXCIgc2VpbiJ9LApAQCAtNTUzLDYgKzU4LDcgQEAKICAgICAgICAgeyJwcm92aWRlZC5udWxsLk9JRC5tYXAiLCAiTnVsbC1PSUQtWnVvcmRudW5nIGFuZ2VnZWJlbiJ9LAogCiAgICAgICAgIC8vIGphdmF4LnNlY3VyaXR5LmF1dGguU3ViamVjdAorICAgICAgICB7Ik5FV0xJTkUiLCAiXG4ifSwKICAgICAgICAgeyJpbnZhbGlkLm51bGwuQWNjZXNzQ29udHJvbENvbnRleHQucHJvdmlkZWQiLAogICAgICAgICAgICAgICAgICJVbmdcdTAwRkNsdGlnZXIgTnVsbHdlcnQgZlx1MDBGQ3IgQWNjZXNzQ29udHJvbENvbnRleHQgYW5nZWdlYmVuIn0sCiAgICAgICAgIHsiaW52YWxpZC5udWxsLmFjdGlvbi5wcm92aWRlZCIsICJVbmdcdTAwRkNsdGlnZSBOdWxsYWt0aW9uIGFuZ2VnZWJlbiJ9LApAQCAtNjU2LDYgKzE2Miw3IEBACiAgICAgICoKICAgICAgKiBAcmV0dXJuIHRoZSBjb250ZW50cyBvZiB0aGlzIDxjb2RlPlJlc291cmNlQnVuZGxlPC9jb2RlPi4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgT2JqZWN0W11bXSBnZXRDb250ZW50cygpIHsKICAgICAgICAgcmV0dXJuIGNvbnRlbnRzOwogICAgIH0KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdXRpbC9SZXNvdXJjZXNfZXMuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdXRpbC9SZXNvdXJjZXNfZXMuamF2YQppbmRleCA1OWRjODhiLi44ZjJiMjk2IDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3V0aWwvUmVzb3VyY2VzX2VzLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS91dGlsL1Jlc291cmNlc19lcy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMzQsNTAxICszNCw2IEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXVtdIGNvbnRlbnRzID0gewogCi0gICAgICAgIC8vIHNoYXJlZCAoZnJvbSBqYXJzaWduZXIpCi0gICAgICAgIHsiU1BBQ0UiLCAiICJ9LAotICAgICAgICB7IjJTUEFDRSIsICIgICJ9LAotICAgICAgICB7IjZTUEFDRSIsICIgICAgICAifSwKLSAgICAgICAgeyJDT01NQSIsICIsICJ9LAotICAgICAgICAvLyBzaGFyZWQgKGZyb20ga2V5dG9vbCkKLSAgICAgICAgeyJORVdMSU5FIiwgIlxuIn0sCi0gICAgICAgIHsiU1RBUiIsCi0gICAgICAgICAgICAgICAgIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioifSwKLSAgICAgICAgeyJTVEFSTk4iLAotICAgICAgICAgICAgICAgICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cbiJ9LAotCi0gICAgICAgIC8vIGtleXRvb2w6IEhlbHAgcGFydAotLy8gIk9wdGlvbiIgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0gICAgICAgIHsiLk9QVElPTi4iLCAiIFtPcGNpXHUwMEYzbl0uLi4ifSwKLSAgICAgICAgeyJPcHRpb25zLiIsICJPcGNpb25lczoifSwKLSAgICAgICAgeyJVc2Uua2V5dG9vbC5oZWxwLmZvci5hbGwuYXZhaWxhYmxlLmNvbW1hbmRzIiwKLSAgICAgICAgICAgICAgICAgIlV0aWxpY2VcImtleXRvb2wgLWhlbHBcIiBwYXJhIHRvZG9zIGxvcyBjb21hbmRvcyBkaXNwb25pYmxlcyJ9LAotICAgICAgICB7IktleS5hbmQuQ2VydGlmaWNhdGUuTWFuYWdlbWVudC5Ub29sIiwKLSAgICAgICAgICAgICAgICAgIkhlcnJhbWllbnRhIGRlIEdlc3RpXHUwMEYzbiBkZSBDZXJ0aWZpY2Fkb3MgeSBDbGF2ZXMifSwKLSAgICAgICAgeyJDb21tYW5kcy4iLCAiQ29tYW5kb3M6In0sCi0gICAgICAgIHsiVXNlLmtleXRvb2wuY29tbWFuZC5uYW1lLmhlbHAuZm9yLnVzYWdlLm9mLmNvbW1hbmQubmFtZSIsCi0gICAgICAgICAgICAgICAgIlV0aWxpY2UgXCJrZXl0b29sIC1jb21tYW5kX25hbWUgLWhlbHBcIiBwYXJhIGxhIHNpbnRheGlzIGRlIG5vbWJyZV9jb21hbmRvIn0sCi0gICAgICAgIC8vIGtleXRvb2w6IGhlbHA6IGNvbW1hbmRzCi0gICAgICAgIHsiR2VuZXJhdGVzLmEuY2VydGlmaWNhdGUucmVxdWVzdCIsCi0gICAgICAgICAgICAgICAgIkdlbmVyYSB1bmEgc29saWNpdHVkIGRlIGNlcnRpZmljYWRvIn0sIC8vLWNlcnRyZXEKLSAgICAgICAgeyJDaGFuZ2VzLmFuLmVudHJ5LnMuYWxpYXMiLAotICAgICAgICAgICAgICAgICJDYW1iaWEgdW4gYWxpYXMgZGUgZW50cmFkYSJ9LCAvLy1jaGFuZ2VhbGlhcwotICAgICAgICB7IkRlbGV0ZXMuYW4uZW50cnkiLAotICAgICAgICAgICAgICAgICJTdXByaW1lIHVuYSBlbnRyYWRhIn0sIC8vLWRlbGV0ZQotICAgICAgICB7IkV4cG9ydHMuY2VydGlmaWNhdGUiLAotICAgICAgICAgICAgICAgICJFeHBvcnRhIGVsIGNlcnRpZmljYWRvIn0sIC8vLWV4cG9ydGNlcnQKLSAgICAgICAgeyJHZW5lcmF0ZXMuYS5rZXkucGFpciIsCi0gICAgICAgICAgICAgICAgIkdlbmVyYSB1biBwYXIgZGUgY2xhdmVzIn0sIC8vLWdlbmtleXBhaXIKLS8vIHRyYW5zbGF0aW9uIG9mICJzZWNyZXQiIGtleSBzaG91bGQgYmUgZGlmZmVyZW50IHRvICJwcml2YXRlIiBrZXkuCi0gICAgICAgIHsiR2VuZXJhdGVzLmEuc2VjcmV0LmtleSIsCi0gICAgICAgICAgICAgICAgIkdlbmVyYSB1biBjbGF2ZSBzZWNyZXRhIn0sIC8vLWdlbnNlY2tleQotICAgICAgICB7IkdlbmVyYXRlcy5jZXJ0aWZpY2F0ZS5mcm9tLmEuY2VydGlmaWNhdGUucmVxdWVzdCIsCi0gICAgICAgICAgICAgICAgIkdlbmVyYSB1biBjZXJ0aWZpY2FkbyBhIHBhcnRpciBkZSB1bmEgc29saWNpdHVkIGRlIGNlcnRpZmljYWRvIn0sIC8vLWdlbmNlcnQKLSAgICAgICAgeyJHZW5lcmF0ZXMuQ1JMIiwgIkdlbmVyYSBDUkwifSwgLy8tZ2VuY3JsCi0gICAgICAgIHsiSW1wb3J0cy5lbnRyaWVzLmZyb20uYS5KREsuMS4xLnguc3R5bGUuaWRlbnRpdHkuZGF0YWJhc2UiLAotICAgICAgICAgICAgICAgICJJbXBvcnRhIGVudHJhZGFzIGRlc2RlIHVuYSBiYXNlIGRlIGRhdG9zIGRlIGlkZW50aWRhZGVzIEpESyAxLjEueC1zdHlsZSJ9LCAvLy1pZGVudGl0eWRiCi0gICAgICAgIHsiSW1wb3J0cy5hLmNlcnRpZmljYXRlLm9yLmEuY2VydGlmaWNhdGUuY2hhaW4iLAotICAgICAgICAgICAgICAgICJJbXBvcnRhIHVuIGNlcnRpZmljYWRvIG8gdW5hIGNhZGVuYSBkZSBjZXJ0aWZpY2Fkb3MifSwgLy8taW1wb3J0Y2VydAotICAgICAgICB7IkltcG9ydHMub25lLm9yLmFsbC5lbnRyaWVzLmZyb20uYW5vdGhlci5rZXlzdG9yZSIsCi0gICAgICAgICAgICAgICAgIkltcG9ydGEgdW5hIG8gdG9kYXMgbGFzIGVudHJhZGFzIGRlc2RlIG90cm8gYWxtYWNcdTAwRTluIGRlIGNsYXZlcyJ9LCAvLy1pbXBvcnRrZXlzdG9yZQotICAgICAgICB7IkNsb25lcy5hLmtleS5lbnRyeSIsCi0gICAgICAgICAgICAgICAgIkNsb25hIHVuYSBlbnRyYWRhIGRlIGNsYXZlIn0sIC8vLWtleWNsb25lCi0gICAgICAgIHsiQ2hhbmdlcy50aGUua2V5LnBhc3N3b3JkLm9mLmFuLmVudHJ5IiwKLSAgICAgICAgICAgICAgICAiQ2FtYmlhIGxhIGNvbnRyYXNlXHUwMEYxYSBkZSBjbGF2ZSBkZSB1bmEgZW50cmFkYSJ9LCAvLy1rZXlwYXNzd2QKLSAgICAgICAgeyJMaXN0cy5lbnRyaWVzLmluLmEua2V5c3RvcmUiLAotICAgICAgICAgICAgICAgICJFbnVtZXJhIGxhcyBlbnRyYWRhcyBkZSB1biBhbG1hY1x1MDBFOW4gZGUgY2xhdmVzIn0sIC8vLWxpc3QKLSAgICAgICAgeyJQcmludHMudGhlLmNvbnRlbnQub2YuYS5jZXJ0aWZpY2F0ZSIsCi0gICAgICAgICAgICAgICAgIkltcHJpbWUgZWwgY29udGVuaWRvIGRlIHVuIGNlcnRpZmljYWRvIn0sIC8vLXByaW50Y2VydAotICAgICAgICB7IlByaW50cy50aGUuY29udGVudC5vZi5hLmNlcnRpZmljYXRlLnJlcXVlc3QiLAotICAgICAgICAgICAgICAgICJJbXByaW1lIGVsIGNvbnRlbmlkbyBkZSB1bmEgc29saWNpdHVkIGRlIGNlcnRpZmljYWRvIn0sIC8vLXByaW50Y2VydHJlcQotICAgICAgICB7IlByaW50cy50aGUuY29udGVudC5vZi5hLkNSTC5maWxlIiwKLSAgICAgICAgICAgICAgICAiSW1wcmltZSBlbCBjb250ZW5pZG8gZGUgdW4gYXJjaGl2byBDUkwifSwgLy8tcHJpbnRjcmwKLSAgICAgICAgeyJHZW5lcmF0ZXMuYS5zZWxmLnNpZ25lZC5jZXJ0aWZpY2F0ZSIsCi0gICAgICAgICAgICAgICAgIkdlbmVyYSB1biBjZXJ0aWZpY2FkbyBhdXRvZmlybWFkbyJ9LCAvLy1zZWxmY2VydAotICAgICAgICB7IkNoYW5nZXMudGhlLnN0b3JlLnBhc3N3b3JkLm9mLmEua2V5c3RvcmUiLAotICAgICAgICAgICAgICAgICJDYW1iaWEgbGEgY29udHJhc2VcdTAwRjFhIGRlIGFsbWFjXHUwMEU5biBkZSB1biBhbG1hY1x1MDBFOW4gZGUgY2xhdmVzIn0sIC8vLXN0b3JlcGFzc3dkCi0gICAgICAgIC8vIGtleXRvb2w6IGhlbHA6IG9wdGlvbnMKLSAgICAgICAgeyJhbGlhcy5uYW1lLm9mLnRoZS5lbnRyeS50by5wcm9jZXNzIiwKLSAgICAgICAgICAgICAgICAibm9tYnJlIGRlIGFsaWFzIGRlIGxhIGVudHJhZGEgcXVlIHNlIHZhIGEgcHJvY2VzYXIifSwgLy8tYWxpYXMKLSAgICAgICAgeyJkZXN0aW5hdGlvbi5hbGlhcyIsCi0gICAgICAgICAgICAgICAgImFsaWFzIGRlIGRlc3Rpbm8ifSwgLy8tZGVzdGFsaWFzCi0gICAgICAgIHsiZGVzdGluYXRpb24ua2V5LnBhc3N3b3JkIiwKLSAgICAgICAgICAgICAgICAiY29udHJhc2VcdTAwRjFhIGRlIGNsYXZlIGRlIGRlc3Rpbm8ifSwgLy8tZGVzdGtleXBhc3MKLSAgICAgICAgeyJkZXN0aW5hdGlvbi5rZXlzdG9yZS5uYW1lIiwKLSAgICAgICAgICAgICAgICAibm9tYnJlIGRlIGFsbWFjXHUwMEU5biBkZSBjbGF2ZXMgZGUgZGVzdGlubyJ9LCAvLy1kZXN0a2V5c3RvcmUKLSAgICAgICAgeyJkZXN0aW5hdGlvbi5rZXlzdG9yZS5wYXNzd29yZC5wcm90ZWN0ZWQiLAotICAgICAgICAgICAgICAgICJhbG1hY1x1MDBFOW4gZGUgY2xhdmVzIGRlIGRlc3Rpbm8gcHJvdGVnaWRvIHBvciBjb250cmFzZVx1MDBGMWEifSwgLy8tZGVzdHByb3RlY3RlZAotICAgICAgICB7ImRlc3RpbmF0aW9uLmtleXN0b3JlLnByb3ZpZGVyLm5hbWUiLAotICAgICAgICAgICAgICAgICJub21icmUgZGUgcHJvdmVlZG9yIGRlIGFsbWFjXHUwMEU5biBkZSBjbGF2ZXMgZGUgZGVzdGlubyJ9LCAvLy1kZXN0cHJvdmlkZXJuYW1lCi0gICAgICAgIHsiZGVzdGluYXRpb24ua2V5c3RvcmUucGFzc3dvcmQiLAotICAgICAgICAgICAgICAgICJjb250cmFzZVx1MDBGMWEgZGUgYWxtYWNcdTAwRTluIGRlIGNsYXZlcyBkZSBkZXN0aW5vIn0sIC8vLWRlc3RzdG9yZXBhc3MKLSAgICAgICAgeyJkZXN0aW5hdGlvbi5rZXlzdG9yZS50eXBlIiwKLSAgICAgICAgICAgICAgICAidGlwbyBkZSBhbG1hY1x1MDBFOW4gZGUgY2xhdmVzIGRlIGRlc3Rpbm8ifSwgLy8tZGVzdHN0b3JldHlwZQotICAgICAgICB7ImRpc3Rpbmd1aXNoZWQubmFtZSIsCi0gICAgICAgICAgICAgICAgIm5vbWJyZSBkaXN0aW50aXZvIn0sIC8vLWRuYW1lCi0gICAgICAgIHsiWC41MDkuZXh0ZW5zaW9uIiwKLSAgICAgICAgICAgICAgICAiZXh0ZW5zaVx1MDBGM24gWC41MDkifSwgLy8tZXh0Ci0gICAgICAgIHsib3V0cHV0LmZpbGUubmFtZSIsCi0gICAgICAgICAgICAgICAgIm5vbWJyZSBkZSBhcmNoaXZvIGRlIHNhbGlkYSJ9LCAvLy1maWxlIGFuZCAtb3V0ZmlsZQotICAgICAgICB7ImlucHV0LmZpbGUubmFtZSIsCi0gICAgICAgICAgICAgICAgIm5vbWJyZSBkZSBhcmNoaXZvIGRlIGVudHJhZGEifSwgLy8tZmlsZSBhbmQgLWluZmlsZQotICAgICAgICB7ImtleS5hbGdvcml0aG0ubmFtZSIsCi0gICAgICAgICAgICAgICAgIm5vbWJyZSBkZSBhbGdvcml0bW8gZGUgY2xhdmUifSwgLy8ta2V5YWxnCi0gICAgICAgIHsia2V5LnBhc3N3b3JkIiwKLSAgICAgICAgICAgICAgICAiY29udHJhc2VcdTAwRjFhIGRlIGNsYXZlIn0sIC8vLWtleXBhc3MKLSAgICAgICAgeyJrZXkuYml0LnNpemUiLAotICAgICAgICAgICAgICAgICJ0YW1hXHUwMEYxbyBkZSBiaXQgZGUgY2xhdmUifSwgLy8ta2V5c2l6ZQotICAgICAgICB7ImtleXN0b3JlLm5hbWUiLAotICAgICAgICAgICAgICAgICJub21icmUgZGUgYWxtYWNcdTAwRTluIGRlIGNsYXZlcyJ9LCAvLy1rZXlzdG9yZQotICAgICAgICB7Im5ldy5wYXNzd29yZCIsCi0gICAgICAgICAgICAgICAgIm51ZXZhIGNvbnRyYXNlXHUwMEYxYSJ9LCAvLy1uZXcKLSAgICAgICAgeyJkby5ub3QucHJvbXB0IiwKLSAgICAgICAgICAgICAgICAibm8gc29saWNpdGFyIn0sIC8vLW5vcHJvbXB0Ci0gICAgICAgIHsicGFzc3dvcmQudGhyb3VnaC5wcm90ZWN0ZWQubWVjaGFuaXNtIiwKLSAgICAgICAgICAgICAgICAiY29udHJhc2VcdTAwRjFhIGEgdHJhdlx1MDBFOXMgZGUgbWVjYW5pc21vIHByb3RlZ2lkbyJ9LCAvLy1wcm90ZWN0ZWQKLSAgICAgICAgeyJwcm92aWRlci5hcmd1bWVudCIsCi0gICAgICAgICAgICAgICAgImFyZ3VtZW50byBkZWwgcHJvdmVlZG9yIn0sIC8vLXByb3ZpZGVyYXJnCi0gICAgICAgIHsicHJvdmlkZXIuY2xhc3MubmFtZSIsCi0gICAgICAgICAgICAgICAgIm5vbWJyZSBkZSBjbGFzZSBkZWwgcHJvdmVlZG9yIn0sIC8vLXByb3ZpZGVyY2xhc3MKLSAgICAgICAgeyJwcm92aWRlci5uYW1lIiwKLSAgICAgICAgICAgICAgICAibm9tYnJlIGRlbCBwcm92ZWVkb3IifSwgLy8tcHJvdmlkZXJuYW1lCi0gICAgICAgIHsicHJvdmlkZXIuY2xhc3NwYXRoIiwKLSAgICAgICAgICAgICAgICAiY2xhc3NwYXRoIGRlIHByb3ZlZWRvciJ9LCAvLy1wcm92aWRlcnBhdGgKLSAgICAgICAgeyJvdXRwdXQuaW4uUkZDLnN0eWxlIiwKLSAgICAgICAgICAgICAgICAic2FsaWRhIGVuIGVzdGlsbyBSRkMifSwgLy8tcmZjCi0gICAgICAgIHsic2lnbmF0dXJlLmFsZ29yaXRobS5uYW1lIiwKLSAgICAgICAgICAgICAgICAibm9tYnJlIGRlIGFsZ29yaXRtbyBkZSBmaXJtYSJ9LCAvLy1zaWdhbGcKLSAgICAgICAgeyJzb3VyY2UuYWxpYXMiLAotICAgICAgICAgICAgICAgICJhbGlhcyBkZSBvcmlnZW4ifSwgLy8tc3JjYWxpYXMKLSAgICAgICAgeyJzb3VyY2Uua2V5LnBhc3N3b3JkIiwKLSAgICAgICAgICAgICAgICAiY29udHJhc2VcdTAwRjFhIGRlIGNsYXZlIGRlIG9yaWdlbiJ9LCAvLy1zcmNrZXlwYXNzCi0gICAgICAgIHsic291cmNlLmtleXN0b3JlLm5hbWUiLAotICAgICAgICAgICAgICAgICJub21icmUgZGUgYWxtYWNcdTAwRTluIGRlIGNsYXZlcyBkZSBvcmlnZW4ifSwgLy8tc3Jja2V5c3RvcmUKLSAgICAgICAgeyJzb3VyY2Uua2V5c3RvcmUucGFzc3dvcmQucHJvdGVjdGVkIiwKLSAgICAgICAgICAgICAgICAiYWxtYWNcdTAwRTluIGRlIGNsYXZlcyBkZSBvcmlnZW4gcHJvdGVnaWRvIHBvciBjb250cmFzZVx1MDBGMWEifSwgLy8tc3JjcHJvdGVjdGVkCi0gICAgICAgIHsic291cmNlLmtleXN0b3JlLnByb3ZpZGVyLm5hbWUiLAotICAgICAgICAgICAgICAgICJub21icmUgZGUgcHJvdmVlZG9yIGRlIGFsbWFjXHUwMEU5biBkZSBjbGF2ZXMgZGUgb3JpZ2VuIn0sIC8vLXNyY3Byb3ZpZGVybmFtZQotICAgICAgICB7InNvdXJjZS5rZXlzdG9yZS5wYXNzd29yZCIsCi0gICAgICAgICAgICAgICAgImNvbnRyYXNlXHUwMEYxYSBkZSBhbG1hY1x1MDBFOW4gZGUgY2xhdmVzIGRlIG9yaWdlbiJ9LCAvLy1zcmNzdG9yZXBhc3MKLSAgICAgICAgeyJzb3VyY2Uua2V5c3RvcmUudHlwZSIsCi0gICAgICAgICAgICAgICAgInRpcG8gZGUgYWxtYWNcdTAwRTluIGRlIGNsYXZlcyBkZSBvcmlnZW4ifSwgLy8tc3Jjc3RvcmV0eXBlCi0gICAgICAgIHsiU1NMLnNlcnZlci5ob3N0LmFuZC5wb3J0IiwKLSAgICAgICAgICAgICAgICAicHVlcnRvIHkgaG9zdCBkZWwgc2Vydmlkb3IgU1NMIn0sIC8vLXNzbHNlcnZlcgotICAgICAgICB7InNpZ25lZC5qYXIuZmlsZSIsCi0gICAgICAgICAgICAgICAgImFyY2hpdm8gamFyIGZpcm1hZG8ifSwgLy89amFyZmlsZQotICAgICAgICB7ImNlcnRpZmljYXRlLnZhbGlkaXR5LnN0YXJ0LmRhdGUudGltZSIsCi0gICAgICAgICAgICAgICAgImZlY2hhL2hvcmEgZGUgaW5pY2lvIGRlIHZhbGlkZXogZGVsIGNlcnRpZmljYWRvIn0sIC8vLXN0YXJ0ZGF0ZQotICAgICAgICB7ImtleXN0b3JlLnBhc3N3b3JkIiwKLSAgICAgICAgICAgICAgICAiY29udHJhc2VcdTAwRjFhIGRlIGFsbWFjXHUwMEU5biBkZSBjbGF2ZXMifSwgLy8tc3RvcmVwYXNzCi0gICAgICAgIHsia2V5c3RvcmUudHlwZSIsCi0gICAgICAgICAgICAgICAgInRpcG8gZGUgYWxtYWNcdTAwRTluIGRlIGNsYXZlcyJ9LCAvLy1zdG9yZXR5cGUKLSAgICAgICAgeyJ0cnVzdC5jZXJ0aWZpY2F0ZXMuZnJvbS5jYWNlcnRzIiwKLSAgICAgICAgICAgICAgICAiY2VydGlmaWNhZG9zIGRlIHByb3RlY2NpXHUwMEYzbiBkZSBjYWNlcnRzIn0sIC8vLXRydXN0Y2FjZXJ0cwotICAgICAgICB7InZlcmJvc2Uub3V0cHV0IiwKLSAgICAgICAgICAgICAgICAic2FsaWRhIGRldGFsbGFkYSJ9LCAvLy12Ci0gICAgICAgIHsidmFsaWRpdHkubnVtYmVyLm9mLmRheXMiLAotICAgICAgICAgICAgICAgICJuXHUwMEZBbWVybyBkZSB2YWxpZGV6IGRlIGRcdTAwRURhcyJ9LCAvLy12YWxpZGl0eQotICAgICAgICB7IlNlcmlhbC5JRC5vZi5jZXJ0LnRvLnJldm9rZSIsCi0gICAgICAgICAgICAgICAgICJpZGVudGlmaWNhZG9yIGRlIHNlcmllIGRlbCBjZXJ0aWZpY2FkbyBxdWUgc2UgdmEgYSByZXZvY2FyIn0sIC8vLWlkCi0gICAgICAgIC8vIGtleXRvb2w6IFJ1bm5pbmcgcGFydAotICAgICAgICB7ImtleXRvb2wuZXJyb3IuIiwgImVycm9yIGRlIGhlcnJhbWllbnRhIGRlIGNsYXZlczogIn0sCi0gICAgICAgIHsiSWxsZWdhbC5vcHRpb24uIiwgIk9wY2lcdTAwRjNuIG5vIHBlcm1pdGlkYTogICJ9LAotICAgICAgICB7IklsbGVnYWwudmFsdWUuIiwgIlZhbG9yIG5vIHBlcm1pdGlkbzogIn0sCi0gICAgICAgIHsiVW5rbm93bi5wYXNzd29yZC50eXBlLiIsICJUaXBvIGRlIGNvbnRyYXNlXHUwMEYxYSBkZXNjb25vY2lkbzogIn0sCi0gICAgICAgIHsiQ2Fubm90LmZpbmQuZW52aXJvbm1lbnQudmFyaWFibGUuIiwKLSAgICAgICAgICAgICAgICAiTm8gc2UgaGEgZW5jb250cmFkbyBsYSB2YXJpYWJsZSBkZWwgZW50b3JubzogIn0sCi0gICAgICAgIHsiQ2Fubm90LmZpbmQuZmlsZS4iLCAiTm8gc2UgaGEgZW5jb250cmFkbyBlbCBhcmNoaXZvOiAifSwKLSAgICAgICAgeyJDb21tYW5kLm9wdGlvbi5mbGFnLm5lZWRzLmFuLmFyZ3VtZW50LiIsICJMYSBvcGNpXHUwMEYzbiBkZSBjb21hbmRvIHswfSBuZWNlc2l0YSB1biBhcmd1bWVudG8uIn0sCi0gICAgICAgIHsiV2FybmluZy5EaWZmZXJlbnQuc3RvcmUuYW5kLmtleS5wYXNzd29yZHMubm90LnN1cHBvcnRlZC5mb3IuUEtDUzEyLktleVN0b3Jlcy5JZ25vcmluZy51c2VyLnNwZWNpZmllZC5jb21tYW5kLnZhbHVlLiIsCi0gICAgICAgICAgICAgICAgIkFkdmVydGVuY2lhOiBsb3MgYWxtYWNlbmVzIGRlIGNsYXZlcyBlbiBmb3JtYXRvIFBLQ1MxMiBubyBhZG1pdGVuIGNvbnRyYXNlXHUwMEYxYXMgZGUgY2xhdmUgeSBhbG1hY2VuYW1pZW50byBkaXN0aW50YXMuIFNlIGlnbm9yYXJcdTAwRTEgZWwgdmFsb3IgZXNwZWNpZmljYWRvIHBvciBlbCB1c3VhcmlvLCB7MH0uIn0sCi0gICAgICAgIHsiLmtleXN0b3JlLm11c3QuYmUuTk9ORS5pZi5zdG9yZXR5cGUuaXMuezB9IiwKLSAgICAgICAgICAgICAgICAiLWtleXN0b3JlIGRlYmUgc2VyIE5PTkUgc2kgLXN0b3JldHlwZSBlcyB7MH0ifSwKLSAgICAgICAgeyJUb28ubWFueS5yZXRyaWVzLnByb2dyYW0udGVybWluYXRlZCIsCi0gICAgICAgICAgICAgICAgICJIYSBoYWJpZG8gZGVtYXNpYWRvcyBpbnRlbnRvcywgc2UgaGEgY2VycmFkbyBlbCBwcm9ncmFtYSJ9LAotICAgICAgICB7Ii5zdG9yZXBhc3N3ZC5hbmQua2V5cGFzc3dkLmNvbW1hbmRzLm5vdC5zdXBwb3J0ZWQuaWYuc3RvcmV0eXBlLmlzLnswfSIsCi0gICAgICAgICAgICAgICAgIkxvcyBjb21hbmRvcyAtc3RvcmVwYXNzd2QgeSAta2V5cGFzc3dkIG5vIGVzdFx1MDBFMW4gc29wb3J0YWRvcyBzaSAtc3RvcmV0eXBlIGVzIHswfSJ9LAotICAgICAgICB7Ii5rZXlwYXNzd2QuY29tbWFuZHMubm90LnN1cHBvcnRlZC5pZi5zdG9yZXR5cGUuaXMuUEtDUzEyIiwKLSAgICAgICAgICAgICAgICAiTG9zIGNvbWFuZG9zIC1rZXlwYXNzd2Qgbm8gZXN0XHUwMEUxbiBzb3BvcnRhZG9zIHNpIC1zdG9yZXR5cGUgZXMgUEtDUzEyIn0sCi0gICAgICAgIHsiLmtleXBhc3MuYW5kLm5ldy5jYW4ubm90LmJlLnNwZWNpZmllZC5pZi5zdG9yZXR5cGUuaXMuezB9IiwKLSAgICAgICAgICAgICAgICAiLWtleXBhc3MgeSAtbmV3IG5vIHNlIHB1ZWRlbiBlc3BlY2lmaWNhciBzaSAtc3RvcmV0eXBlIGVzIHswfSJ9LAotICAgICAgICB7ImlmLnByb3RlY3RlZC5pcy5zcGVjaWZpZWQudGhlbi5zdG9yZXBhc3Mua2V5cGFzcy5hbmQubmV3Lm11c3Qubm90LmJlLnNwZWNpZmllZCIsCi0gICAgICAgICAgICAgICAgInNpIHNlIGVzcGVjaWZpY2EgLXByb3RlY3RlZCwgbm8gZGViZW4gZXNwZWNpZmljYXJzZSAtc3RvcmVwYXNzLCAta2V5cGFzcyBuaSAtbmV3In0sCi0gICAgICAgIHsiaWYuc3JjcHJvdGVjdGVkLmlzLnNwZWNpZmllZC50aGVuLnNyY3N0b3JlcGFzcy5hbmQuc3Jja2V5cGFzcy5tdXN0Lm5vdC5iZS5zcGVjaWZpZWQiLAotICAgICAgICAgICAgICAgICJTaSBzZSBlc3BlY2lmaWNhIC1zcmNwcm90ZWN0ZWQsIG5vIHNlIHB1ZWRlIGVzcGVjaWZpY2FyIC1zcmNzdG9yZXBhc3MgbmkgLXNyY2tleXBhc3MifSwKLSAgICAgICAgeyJpZi5rZXlzdG9yZS5pcy5ub3QucGFzc3dvcmQucHJvdGVjdGVkLnRoZW4uc3RvcmVwYXNzLmtleXBhc3MuYW5kLm5ldy5tdXN0Lm5vdC5iZS5zcGVjaWZpZWQiLAotICAgICAgICAgICAgICAgICJTaSBrZXlzdG9yZSBubyBlc3RcdTAwRTEgcHJvdGVnaWRvIHBvciBjb250cmFzZVx1MDBGMWEsIG5vIHNlIGRlYmVuIGVzcGVjaWZpY2FyIC1zdG9yZXBhc3MsIC1rZXlwYXNzIG5pIC1uZXcifSwKLSAgICAgICAgeyJpZi5zb3VyY2Uua2V5c3RvcmUuaXMubm90LnBhc3N3b3JkLnByb3RlY3RlZC50aGVuLnNyY3N0b3JlcGFzcy5hbmQuc3Jja2V5cGFzcy5tdXN0Lm5vdC5iZS5zcGVjaWZpZWQiLAotICAgICAgICAgICAgICAgICJTaSBlbCBhbG1hY1x1MDBFOW4gZGUgY2xhdmVzIGRlIG9yaWdlbiBubyBlc3RcdTAwRTEgcHJvdGVnaWRvIHBvciBjb250cmFzZVx1MDBGMWEsIG5vIHNlIGRlYmVuIGVzcGVjaWZpY2FyIC1zcmNzdG9yZXBhc3MgbmkgLXNyY2tleXBhc3MifSwKLSAgICAgICAgeyJJbGxlZ2FsLnN0YXJ0ZGF0ZS52YWx1ZSIsICJWYWxvciBkZSBmZWNoYSBkZSBpbmljaW8gbm8gcGVybWl0aWRvIn0sCi0gICAgICAgIHsiVmFsaWRpdHkubXVzdC5iZS5ncmVhdGVyLnRoYW4uemVybyIsCi0gICAgICAgICAgICAgICAgIkxhIHZhbGlkZXogZGViZSBzZXIgbWF5b3IgcXVlIGNlcm8ifSwKLSAgICAgICAgeyJwcm92TmFtZS5ub3QuYS5wcm92aWRlciIsICJ7MH0gbm8gZXMgdW4gcHJvdmVlZG9yIn0sCi0gICAgICAgIHsiVXNhZ2UuZXJyb3Iubm8uY29tbWFuZC5wcm92aWRlZCIsICJFcnJvciBkZSBzaW50YXhpczogbm8gc2UgaGEgcHJvcG9yY2lvbmFkbyBuaW5nXHUwMEZBbiBjb21hbmRvIn0sCi0gICAgICAgIHsiU291cmNlLmtleXN0b3JlLmZpbGUuZXhpc3RzLmJ1dC5pcy5lbXB0eS4iLCAiRWwgYXJjaGl2byBkZSBhbG1hY1x1MDBFOW4gZGUgY2xhdmVzIGRlIG9yaWdlbiBleGlzdGUsIHBlcm8gZXN0XHUwMEUxIHZhY1x1MDBFRG86ICJ9LAotICAgICAgICB7IlBsZWFzZS5zcGVjaWZ5LnNyY2tleXN0b3JlIiwgIkVzcGVjaWZpcXVlIC1zcmNrZXlzdG9yZSJ9LAotICAgICAgICB7Ik11c3Qubm90LnNwZWNpZnkuYm90aC52LmFuZC5yZmMud2l0aC5saXN0LmNvbW1hbmQiLAotICAgICAgICAgICAgICAgICJObyBzZSBkZWJlbiBlc3BlY2lmaWNhciAtdiB5IC1yZmMgc2ltdWx0XHUwMEUxbmVhbWVudGUgY29uIGVsIGNvbWFuZG8gJ2xpc3QnIn0sCi0gICAgICAgIHsiS2V5LnBhc3N3b3JkLm11c3QuYmUuYXQubGVhc3QuNi5jaGFyYWN0ZXJzIiwKLSAgICAgICAgICAgICAgICAiTGEgY29udHJhc2VcdTAwRjFhIGRlIGNsYXZlIGRlYmUgdGVuZXIgYWwgbWVub3MgNiBjYXJhY3RlcmVzIn0sCi0gICAgICAgIHsiTmV3LnBhc3N3b3JkLm11c3QuYmUuYXQubGVhc3QuNi5jaGFyYWN0ZXJzIiwKLSAgICAgICAgICAgICAgICAiTGEgbnVldmEgY29udHJhc2VcdTAwRjFhIGRlYmUgdGVuZXIgYWwgbWVub3MgNiBjYXJhY3RlcmVzIn0sCi0gICAgICAgIHsiS2V5c3RvcmUuZmlsZS5leGlzdHMuYnV0LmlzLmVtcHR5LiIsCi0gICAgICAgICAgICAgICAgIkVsIGFyY2hpdm8gZGUgYWxtYWNcdTAwRTluIGRlIGNsYXZlcyBleGlzdGUsIHBlcm8gZXN0XHUwMEUxIHZhY1x1MDBFRG86ICJ9LAotICAgICAgICB7IktleXN0b3JlLmZpbGUuZG9lcy5ub3QuZXhpc3QuIiwKLSAgICAgICAgICAgICAgICAiRWwgYXJjaGl2byBkZSBhbG1hY1x1MDBFOW4gZGUgY2xhdmVzIG5vIGV4aXN0ZTogIn0sCi0gICAgICAgIHsiTXVzdC5zcGVjaWZ5LmRlc3RpbmF0aW9uLmFsaWFzIiwgIlNlIGRlYmUgZXNwZWNpZmljYXIgdW4gYWxpYXMgZGUgZGVzdGlubyJ9LAotICAgICAgICB7Ik11c3Quc3BlY2lmeS5hbGlhcyIsICJTZSBkZWJlIGVzcGVjaWZpY2FyIHVuIGFsaWFzIn0sCi0gICAgICAgIHsiS2V5c3RvcmUucGFzc3dvcmQubXVzdC5iZS5hdC5sZWFzdC42LmNoYXJhY3RlcnMiLAotICAgICAgICAgICAgICAgICJMYSBjb250cmFzZVx1MDBGMWEgZGVsIGFsbWFjXHUwMEU5biBkZSBjbGF2ZXMgZGViZSB0ZW5lciBhbCBtZW5vcyA2IGNhcmFjdGVyZXMifSwKLSAgICAgICAgeyJFbnRlci5rZXlzdG9yZS5wYXNzd29yZC4iLCAiSW50cm9kdXpjYSBsYSBjb250cmFzZVx1MDBGMWEgZGVsIGFsbWFjXHUwMEU5biBkZSBjbGF2ZXM6ICAifSwKLSAgICAgICAgeyJFbnRlci5zb3VyY2Uua2V5c3RvcmUucGFzc3dvcmQuIiwgIkludHJvZHV6Y2EgbGEgY29udHJhc2VcdTAwRjFhIGRlIGFsbWFjXHUwMEU5biBkZSBjbGF2ZXMgZGUgb3JpZ2VuOiAgIn0sCi0gICAgICAgIHsiRW50ZXIuZGVzdGluYXRpb24ua2V5c3RvcmUucGFzc3dvcmQuIiwgIkludHJvZHV6Y2EgbGEgY29udHJhc2VcdTAwRjFhIGRlIGFsbWFjXHUwMEU5biBkZSBjbGF2ZXMgZGUgZGVzdGlubzogICJ9LAotICAgICAgICB7IktleXN0b3JlLnBhc3N3b3JkLmlzLnRvby5zaG9ydC5tdXN0LmJlLmF0LmxlYXN0LjYuY2hhcmFjdGVycyIsCi0gICAgICAgICAiTGEgY29udHJhc2VcdTAwRjFhIGRlbCBhbG1hY1x1MDBFOW4gZGUgY2xhdmVzIGVzIGRlbWFzaWFkbyBjb3J0YSwgZGViZSB0ZW5lciBhbCBtZW5vcyA2IGNhcmFjdGVyZXMifSwKLSAgICAgICAgeyJVbmtub3duLkVudHJ5LlR5cGUiLCAiVGlwbyBkZSBFbnRyYWRhIERlc2Nvbm9jaWRvIn0sCi0gICAgICAgIHsiVG9vLm1hbnkuZmFpbHVyZXMuQWxpYXMubm90LmNoYW5nZWQiLCAiRGVtYXNpYWRvcyBmYWxsb3MuIE5vIHNlIGhhIGNhbWJpYWRvIGVsIGFsaWFzIn0sCi0gICAgICAgIHsiRW50cnkuZm9yLmFsaWFzLmFsaWFzLnN1Y2Nlc3NmdWxseS5pbXBvcnRlZC4iLAotICAgICAgICAgICAgICAgICAiTGEgZW50cmFkYSBkZWwgYWxpYXMgezB9IHNlIGhhIGltcG9ydGFkbyBjb3JyZWN0YW1lbnRlLiJ9LAotICAgICAgICB7IkVudHJ5LmZvci5hbGlhcy5hbGlhcy5ub3QuaW1wb3J0ZWQuIiwgIkxhIGVudHJhZGEgZGVsIGFsaWFzIHswfSBubyBzZSBoYSBpbXBvcnRhZG8uIn0sCi0gICAgICAgIHsiUHJvYmxlbS5pbXBvcnRpbmcuZW50cnkuZm9yLmFsaWFzLmFsaWFzLmV4Y2VwdGlvbi5FbnRyeS5mb3IuYWxpYXMuYWxpYXMubm90LmltcG9ydGVkLiIsCi0gICAgICAgICAgICAgICAgICJQcm9ibGVtYSBhbCBpbXBvcnRhciBsYSBlbnRyYWRhIGRlbCBhbGlhcyB7MH06IHsxfS5cbk5vIHNlIGhhIGltcG9ydGFkbyBsYSBlbnRyYWRhIGRlbCBhbGlhcyB7MH0uIn0sCi0gICAgICAgIHsiSW1wb3J0LmNvbW1hbmQuY29tcGxldGVkLm9rLmVudHJpZXMuc3VjY2Vzc2Z1bGx5LmltcG9ydGVkLmZhaWwuZW50cmllcy5mYWlsZWQub3IuY2FuY2VsbGVkIiwKLSAgICAgICAgICAgICAgICAgIkNvbWFuZG8gZGUgaW1wb3J0YWNpXHUwMEYzbiBjb21wbGV0YWRvOiB7MH0gZW50cmFkYXMgaW1wb3J0YWRhcyBjb3JyZWN0YW1lbnRlLCB7MX0gZW50cmFkYXMgaW5jb3JyZWN0YXMgbyBjYW5jZWxhZGFzIn0sCi0gICAgICAgIHsiV2FybmluZy5PdmVyd3JpdGluZy5leGlzdGluZy5hbGlhcy5hbGlhcy5pbi5kZXN0aW5hdGlvbi5rZXlzdG9yZSIsCi0gICAgICAgICAgICAgICAgICJBZHZlcnRlbmNpYTogc2Ugc29icmVzY3JpYmlyXHUwMEUxIGVsIGFsaWFzIHswfSBlbiBlbCBhbG1hY1x1MDBFOW4gZGUgY2xhdmVzIGRlIGRlc3Rpbm8ifSwKLSAgICAgICAgeyJFeGlzdGluZy5lbnRyeS5hbGlhcy5hbGlhcy5leGlzdHMub3ZlcndyaXRlLm5vLiIsCi0gICAgICAgICAgICAgICAgICJFbCBhbGlhcyBkZSBlbnRyYWRhIGV4aXN0ZW50ZSB7MH0geWEgZXhpc3RlLCBcdTAwQkZkZXNlYSBzb2JyZXNjcmliaXJsbz8gW25vXTogICJ9LAotICAgICAgICB7IlRvby5tYW55LmZhaWx1cmVzLnRyeS5sYXRlciIsICJEZW1hc2lhZG9zIGZhbGxvczsgaW50XHUwMEU5bnRlbG8gbVx1MDBFMXMgYWRlbGFudGUifSwKLSAgICAgICAgeyJDZXJ0aWZpY2F0aW9uLnJlcXVlc3Quc3RvcmVkLmluLmZpbGUuZmlsZW5hbWUuIiwKLSAgICAgICAgICAgICAgICAiU29saWNpdHVkIGRlIGNlcnRpZmljYWNpXHUwMEYzbiBhbG1hY2VuYWRhIGVuIGVsIGFyY2hpdm8gPHswfT4ifSwKLSAgICAgICAgeyJTdWJtaXQudGhpcy50by55b3VyLkNBIiwgIkVudmlhciBhIGxhIENBIn0sCi0gICAgICAgIHsiaWYuYWxpYXMubm90LnNwZWNpZmllZC5kZXN0YWxpYXMuc3Jja2V5cGFzcy5hbmQuZGVzdGtleXBhc3MubXVzdC5ub3QuYmUuc3BlY2lmaWVkIiwKLSAgICAgICAgICAgICJzaSBubyBzZSBlc3BlY2lmaWNhIGVsIGFsaWFzLCBubyBzZSBwdWVkZSBlc3BlY2lmaWNhciBkZXN0YWxpYXMsIHNyY2tleXBhc3MgbmkgZGVzdGtleXBhc3MifSwKLSAgICAgICAgeyJDZXJ0aWZpY2F0ZS5zdG9yZWQuaW4uZmlsZS5maWxlbmFtZS4iLAotICAgICAgICAgICAgICAgICJDZXJ0aWZpY2FkbyBhbG1hY2VuYWRvIGVuIGVsIGFyY2hpdm8gPHswfT4ifSwKLSAgICAgICAgeyJDZXJ0aWZpY2F0ZS5yZXBseS53YXMuaW5zdGFsbGVkLmluLmtleXN0b3JlIiwKLSAgICAgICAgICAgICAgICAiU2UgaGEgaW5zdGFsYWRvIGxhIHJlc3B1ZXN0YSBkZWwgY2VydGlmaWNhZG8gZW4gZWwgYWxtYWNcdTAwRTluIGRlIGNsYXZlcyJ9LAotICAgICAgICB7IkNlcnRpZmljYXRlLnJlcGx5Lndhcy5ub3QuaW5zdGFsbGVkLmluLmtleXN0b3JlIiwKLSAgICAgICAgICAgICAgICAiTm8gc2UgaGEgaW5zdGFsYWRvIGxhIHJlc3B1ZXN0YSBkZWwgY2VydGlmaWNhZG8gZW4gZWwgYWxtYWNcdTAwRTluIGRlIGNsYXZlcyJ9LAotICAgICAgICB7IkNlcnRpZmljYXRlLndhcy5hZGRlZC50by5rZXlzdG9yZSIsCi0gICAgICAgICAgICAgICAgIlNlIGhhIGFncmVnYWRvIGVsIGNlcnRpZmljYWRvIGFsIGFsbWFjXHUwMEU5biBkZSBjbGF2ZXMifSwKLSAgICAgICAgeyJDZXJ0aWZpY2F0ZS53YXMubm90LmFkZGVkLnRvLmtleXN0b3JlIiwKLSAgICAgICAgICAgICAgICAiTm8gc2UgaGEgYWdyZWdhZG8gZWwgY2VydGlmaWNhZG8gYWwgYWxtYWNcdTAwRTluIGRlIGNsYXZlcyJ9LAotICAgICAgICB7Ii5TdG9yaW5nLmtzZm5hbWUuIiwgIltBbG1hY2VuYW5kbyB7MH1dIn0sCi0gICAgICAgIHsiYWxpYXMuaGFzLm5vLnB1YmxpYy5rZXkuY2VydGlmaWNhdGUuIiwKLSAgICAgICAgICAgICAgICAiezB9IG5vIHRpZW5lIGNsYXZlIHBcdTAwRkFibGljYSAoY2VydGlmaWNhZG8pIn0sCi0gICAgICAgIHsiQ2Fubm90LmRlcml2ZS5zaWduYXR1cmUuYWxnb3JpdGhtIiwKLSAgICAgICAgICAgICAgICAiTm8gc2UgcHVlZGUgZGVyaXZhciBlbCBhbGdvcml0bW8gZGUgZmlybWEifSwKLSAgICAgICAgeyJBbGlhcy5hbGlhcy5kb2VzLm5vdC5leGlzdCIsCi0gICAgICAgICAgICAgICAgIkVsIGFsaWFzIDx7MH0+IG5vIGV4aXN0ZSJ9LAotICAgICAgICB7IkFsaWFzLmFsaWFzLmhhcy5uby5jZXJ0aWZpY2F0ZSIsCi0gICAgICAgICAgICAgICAgIkVsIGFsaWFzIDx7MH0+IG5vIHRpZW5lIGNlcnRpZmljYWRvIn0sCi0gICAgICAgIHsiS2V5LnBhaXIubm90LmdlbmVyYXRlZC5hbGlhcy5hbGlhcy5hbHJlYWR5LmV4aXN0cyIsCi0gICAgICAgICAgICAgICAgIk5vIHNlIGhhIGdlbmVyYWRvIGVsIHBhciBkZSBjbGF2ZXMsIGVsIGFsaWFzIDx7MH0+IHlhIGV4aXN0ZSJ9LAotICAgICAgICB7IkdlbmVyYXRpbmcua2V5c2l6ZS5iaXQua2V5QWxnTmFtZS5rZXkucGFpci5hbmQuc2VsZi5zaWduZWQuY2VydGlmaWNhdGUuc2lnQWxnTmFtZS53aXRoLmEudmFsaWRpdHkub2YudmFsaWRhbGl0eS5kYXlzLmZvciIsCi0gICAgICAgICAgICAgICAgIkdlbmVyYW5kbyBwYXIgZGUgY2xhdmVzIHsxfSBkZSB7MH0gYml0cyBwYXJhIGNlcnRpZmljYWRvIGF1dG9maXJtYWRvICh7Mn0pIGNvbiB1bmEgdmFsaWRleiBkZSB7M30gZFx1MDBFRGFzXG5cdHBhcmE6IHs0fSJ9LAotICAgICAgICB7IkVudGVyLmtleS5wYXNzd29yZC5mb3IuYWxpYXMuIiwgIkludHJvZHV6Y2EgbGEgY29udHJhc2VcdTAwRjFhIGRlIGNsYXZlIHBhcmEgPHswfT4ifSwKLSAgICAgICAgeyIuUkVUVVJOLmlmLnNhbWUuYXMua2V5c3RvcmUucGFzc3dvcmQuIiwKLSAgICAgICAgICAgICAgICAiXHQoSU5UUk8gc2kgZXMgbGEgbWlzbWEgY29udHJhc2VcdTAwRjFhIHF1ZSBsYSBkZWwgYWxtYWNcdTAwRTluIGRlIGNsYXZlcyk6ICAifSwKLSAgICAgICAgeyJLZXkucGFzc3dvcmQuaXMudG9vLnNob3J0Lm11c3QuYmUuYXQubGVhc3QuNi5jaGFyYWN0ZXJzIiwKLSAgICAgICAgICAgICAgICAiTGEgY29udHJhc2VcdTAwRjFhIGRlIGNsYXZlIGVzIGRlbWFzaWFkbyBjb3J0YTsgZGViZSB0ZW5lciBhbCBtZW5vcyA2IGNhcmFjdGVyZXMifSwKLSAgICAgICAgeyJUb28ubWFueS5mYWlsdXJlcy5rZXkubm90LmFkZGVkLnRvLmtleXN0b3JlIiwKLSAgICAgICAgICAgICAgICAiRGVtYXNpYWRvcyBmYWxsb3M7IG5vIHNlIGhhIGFncmVnYWRvIGxhIGNsYXZlIGFsIGFsbWFjXHUwMEU5biBkZSBjbGF2ZXMifSwKLSAgICAgICAgeyJEZXN0aW5hdGlvbi5hbGlhcy5kZXN0LmFscmVhZHkuZXhpc3RzIiwKLSAgICAgICAgICAgICAgICAiRWwgYWxpYXMgZGUgZGVzdGlubyA8ezB9PiB5YSBleGlzdGUifSwKLSAgICAgICAgeyJQYXNzd29yZC5pcy50b28uc2hvcnQubXVzdC5iZS5hdC5sZWFzdC42LmNoYXJhY3RlcnMiLAotICAgICAgICAgICAgICAgICJMYSBjb250cmFzZVx1MDBGMWEgZXMgZGVtYXNpYWRvIGNvcnRhOyBkZWJlIHRlbmVyIGFsIG1lbm9zIDYgY2FyYWN0ZXJlcyJ9LAotICAgICAgICB7IlRvby5tYW55LmZhaWx1cmVzLktleS5lbnRyeS5ub3QuY2xvbmVkIiwKLSAgICAgICAgICAgICAgICAiRGVtYXNpYWRvcyBmYWxsb3MuIE5vIHNlIGhhIGNsb25hZG8gbGEgZW50cmFkYSBkZSBjbGF2ZSJ9LAotICAgICAgICB7ImtleS5wYXNzd29yZC5mb3IuYWxpYXMuIiwgImNvbnRyYXNlXHUwMEYxYSBkZSBjbGF2ZSBwYXJhIDx7MH0+In0sCi0gICAgICAgIHsiS2V5c3RvcmUuZW50cnkuZm9yLmlkLmdldE5hbWUuYWxyZWFkeS5leGlzdHMiLAotICAgICAgICAgICAgICAgICJMYSBlbnRyYWRhIGRlIGFsbWFjXHUwMEU5biBkZSBjbGF2ZXMgcGFyYSA8ezB9PiB5YSBleGlzdGUifSwKLSAgICAgICAgeyJDcmVhdGluZy5rZXlzdG9yZS5lbnRyeS5mb3IuaWQuZ2V0TmFtZS4iLAotICAgICAgICAgICAgICAgICJDcmVhbmRvIGVudHJhZGEgZGUgYWxtYWNcdTAwRTluIGRlIGNsYXZlcyBwYXJhIDx7MH0+IC4uLiJ9LAotICAgICAgICB7Ik5vLmVudHJpZXMuZnJvbS5pZGVudGl0eS5kYXRhYmFzZS5hZGRlZCIsCi0gICAgICAgICAgICAgICAgIk5vIHNlIGhhbiBhZ3JlZ2FkbyBlbnRyYWRhcyBkZSBsYSBiYXNlIGRlIGRhdG9zIGRlIGlkZW50aWRhZGVzIn0sCi0gICAgICAgIHsiQWxpYXMubmFtZS5hbGlhcyIsICJOb21icmUgZGUgQWxpYXM6IHswfSJ9LAotICAgICAgICB7IkNyZWF0aW9uLmRhdGUua2V5U3RvcmUuZ2V0Q3JlYXRpb25EYXRlLmFsaWFzLiIsCi0gICAgICAgICAgICAgICAgIkZlY2hhIGRlIENyZWFjaVx1MDBGM246IHswLGRhdGV9In0sCi0gICAgICAgIHsiYWxpYXMua2V5U3RvcmUuZ2V0Q3JlYXRpb25EYXRlLmFsaWFzLiIsCi0gICAgICAgICAgICAgICAgInswfSwgezEsZGF0ZX0sICJ9LAotICAgICAgICB7ImFsaWFzLiIsICJ7MH0sICJ9LAotICAgICAgICB7IkVudHJ5LnR5cGUudHlwZS4iLCAiVGlwbyBkZSBFbnRyYWRhOiB7MH0ifSwKLSAgICAgICAgeyJDZXJ0aWZpY2F0ZS5jaGFpbi5sZW5ndGguIiwgIkxvbmdpdHVkIGRlIGxhIENhZGVuYSBkZSBDZXJ0aWZpY2FkbzogIn0sCi0gICAgICAgIHsiQ2VydGlmaWNhdGUuaS4xLiIsICJDZXJ0aWZpY2Fkb1t7MCxudW1iZXIsaW50ZWdlcn1dOiJ9LAotICAgICAgICB7IkNlcnRpZmljYXRlLmZpbmdlcnByaW50LlNIQTEuIiwgIkh1ZWxsYSBEaWdpdGFsIGRlIENlcnRpZmljYWRvIChTSEExKTogIn0sCi0gICAgICAgIHsiS2V5c3RvcmUudHlwZS4iLCAiVGlwbyBkZSBBbG1hY1x1MDBFOW4gZGUgQ2xhdmVzOiAifSwKLSAgICAgICAgeyJLZXlzdG9yZS5wcm92aWRlci4iLCAiUHJvdmVlZG9yIGRlIEFsbWFjXHUwMEU5biBkZSBDbGF2ZXM6ICJ9LAotICAgICAgICB7IllvdXIua2V5c3RvcmUuY29udGFpbnMua2V5U3RvcmUuc2l6ZS5lbnRyeSIsCi0gICAgICAgICAgICAgICAgIlN1IGFsbWFjXHUwMEU5biBkZSBjbGF2ZXMgY29udGllbmUgezAsbnVtYmVyLGludGVnZXJ9IGVudHJhZGEifSwKLSAgICAgICAgeyJZb3VyLmtleXN0b3JlLmNvbnRhaW5zLmtleVN0b3JlLnNpemUuZW50cmllcyIsCi0gICAgICAgICAgICAgICAgIlN1IGFsbWFjXHUwMEU5biBkZSBjbGF2ZXMgY29udGllbmUgezAsbnVtYmVyLGludGVnZXJ9IGVudHJhZGFzIn0sCi0gICAgICAgIHsiRmFpbGVkLnRvLnBhcnNlLmlucHV0IiwgIkZhbGxvIGFsIGFuYWxpemFyIGxhIGVudHJhZGEifSwKLSAgICAgICAgeyJFbXB0eS5pbnB1dCIsICJFbnRyYWRhIHZhY1x1MDBFRGEifSwKLSAgICAgICAgeyJOb3QuWC41MDkuY2VydGlmaWNhdGUiLCAiTm8gZXMgdW4gY2VydGlmaWNhZG8gWC41MDkifSwKLSAgICAgICAgeyJhbGlhcy5oYXMubm8ucHVibGljLmtleSIsICJ7MH0gbm8gdGllbmUgY2xhdmUgcFx1MDBGQWJsaWNhIn0sCi0gICAgICAgIHsiYWxpYXMuaGFzLm5vLlguNTA5LmNlcnRpZmljYXRlIiwgInswfSBubyB0aWVuZSBjZXJ0aWZpY2FkbyBYLjUwOSJ9LAotICAgICAgICB7Ik5ldy5jZXJ0aWZpY2F0ZS5zZWxmLnNpZ25lZC4iLCAiTnVldm8gQ2VydGlmaWNhZG8gKEF1dG9maXJtYWRvKToifSwKLSAgICAgICAgeyJSZXBseS5oYXMubm8uY2VydGlmaWNhdGVzIiwgIkxhIHJlc3B1ZXN0YSBubyB0aWVuZSBjZXJ0aWZpY2Fkb3MifSwKLSAgICAgICAgeyJDZXJ0aWZpY2F0ZS5ub3QuaW1wb3J0ZWQuYWxpYXMuYWxpYXMuYWxyZWFkeS5leGlzdHMiLAotICAgICAgICAgICAgICAgICJDZXJ0aWZpY2FkbyBubyBpbXBvcnRhZG8sIGVsIGFsaWFzIDx7MH0+IHlhIGV4aXN0ZSJ9LAotICAgICAgICB7IklucHV0Lm5vdC5hbi5YLjUwOS5jZXJ0aWZpY2F0ZSIsICJMYSBlbnRyYWRhIG5vIGVzIHVuIGNlcnRpZmljYWRvIFguNTA5In0sCi0gICAgICAgIHsiQ2VydGlmaWNhdGUuYWxyZWFkeS5leGlzdHMuaW4ua2V5c3RvcmUudW5kZXIuYWxpYXMudHJ1c3RhbGlhcy4iLAotICAgICAgICAgICAgICAgICJFbCBjZXJ0aWZpY2FkbyB5YSBleGlzdGUgZW4gZWwgYWxtYWNcdTAwRTluIGRlIGNsYXZlcyBjb24gZWwgYWxpYXMgPHswfT4ifSwKLSAgICAgICAgeyJEby55b3Uuc3RpbGwud2FudC50by5hZGQuaXQubm8uIiwKLSAgICAgICAgICAgICAgICAiXHUwMEJGQVx1MDBGQW4gZGVzZWEgYWdyZWdhcmxvPyBbbm9dOiAgIn0sCi0gICAgICAgIHsiQ2VydGlmaWNhdGUuYWxyZWFkeS5leGlzdHMuaW4uc3lzdGVtLndpZGUuQ0Eua2V5c3RvcmUudW5kZXIuYWxpYXMudHJ1c3RhbGlhcy4iLAotICAgICAgICAgICAgICAgICJFbCBjZXJ0aWZpY2FkbyB5YSBleGlzdGUgZW4gZWwgYWxtYWNcdTAwRTluIGRlIGNsYXZlcyBkZSBsYSBDQSBkZWwgc2lzdGVtYSwgY29uIGVsIGFsaWFzIDx7MH0+In0sCi0gICAgICAgIHsiRG8ueW91LnN0aWxsLndhbnQudG8uYWRkLml0LnRvLnlvdXIub3duLmtleXN0b3JlLm5vLiIsCi0gICAgICAgICAgICAgICAgIlx1MDBCRkFcdTAwRkFuIGRlc2VhIGFncmVnYXJsbyBhIHN1IHByb3BpbyBhbG1hY1x1MDBFOW4gZGUgY2xhdmVzPyBbbm9dOiAgIn0sCi0gICAgICAgIHsiVHJ1c3QudGhpcy5jZXJ0aWZpY2F0ZS5uby4iLCAiXHUwMEJGQ29uZmlhciBlbiBlc3RlIGNlcnRpZmljYWRvPyBbbm9dOiAgIn0sCi0gICAgICAgIHsiWUVTIiwgIlNcdTAwRUQifSwKLSAgICAgICAgeyJOZXcucHJvbXB0LiIsICJOdWV2byB7MH06ICJ9LAotICAgICAgICB7IlBhc3N3b3Jkcy5tdXN0LmRpZmZlciIsICJMYXMgY29udHJhc2VcdTAwRjFhcyBkZWJlbiBzZXIgZGlzdGludGFzIn0sCi0gICAgICAgIHsiUmUuZW50ZXIubmV3LnByb21wdC4iLCAiVnVlbHZhIGEgZXNjcmliaXIgZWwgbnVldm8gezB9OiAifSwKLSAgICAgICAgeyJSZS5lbnRlci5uZXcucGFzc3dvcmQuIiwgIlZvbHZlciBhIGVzY3JpYmlyIGxhIGNvbnRyYXNlXHUwMEYxYSBudWV2YTogIn0sCi0gICAgICAgIHsiVGhleS5kb24udC5tYXRjaC5UcnkuYWdhaW4iLCAiTm8gY29pbmNpZGVuLiBJbnRcdTAwRTludGVsbyBkZSBudWV2byJ9LAotICAgICAgICB7IkVudGVyLnByb21wdC5hbGlhcy5uYW1lLiIsICJFc2NyaWJhIGVsIG5vbWJyZSBkZSBhbGlhcyBkZSB7MH06ICAifSwKLSAgICAgICAgeyJFbnRlci5uZXcuYWxpYXMubmFtZS5SRVRVUk4udG8uY2FuY2VsLmltcG9ydC5mb3IudGhpcy5lbnRyeS4iLAotICAgICAgICAgICAgICAgICAiSW5kaXF1ZSBlbCBudWV2byBub21icmUgZGUgYWxpYXNcdChJTlRSTyBwYXJhIGNhbmNlbGFyIGxhIGltcG9ydGFjaVx1MDBGM24gZGUgZXN0YSBlbnRyYWRhKTogICJ9LAotICAgICAgICB7IkVudGVyLmFsaWFzLm5hbWUuIiwgIkludHJvZHV6Y2EgZWwgbm9tYnJlIGRlIGFsaWFzOiAgIn0sCi0gICAgICAgIHsiLlJFVFVSTi5pZi5zYW1lLmFzLmZvci5vdGhlckFsaWFzLiIsCi0gICAgICAgICAgICAgICAgIlx0KElOVFJPIHNpIGVzIGVsIG1pc21vIHF1ZSBwYXJhIDx7MH0+KSJ9LAotICAgICAgICB7Ii5QQVRURVJOLnByaW50WDUwOUNlcnQiLAotICAgICAgICAgICAgICAgICJQcm9waWV0YXJpbzogezB9XG5FbWlzb3I6IHsxfVxuTlx1MDBGQW1lcm8gZGUgc2VyaWU6IHsyfVxuVlx1MDBFMWxpZG8gZGVzZGU6IHszfSBoYXN0YTogezR9XG5IdWVsbGFzIGRpZ2l0YWxlcyBkZWwgQ2VydGlmaWNhZG86XG5cdCBNRDU6IHs1fVxuXHQgU0hBMTogezZ9XG5cdCBTSEEyNTY6IHs3fVxuXHQgTm9tYnJlIGRlbCBBbGdvcml0bW8gZGUgRmlybWE6IHs4fVxuXHQgVmVyc2lcdTAwRjNuOiB7OX0ifSwKLSAgICAgICAgeyJXaGF0LmlzLnlvdXIuZmlyc3QuYW5kLmxhc3QubmFtZS4iLAotICAgICAgICAgICAgICAgICJcdTAwQkZDdVx1MDBFMWxlcyBzb24gc3Ugbm9tYnJlIHkgc3UgYXBlbGxpZG8/In0sCi0gICAgICAgIHsiV2hhdC5pcy50aGUubmFtZS5vZi55b3VyLm9yZ2FuaXphdGlvbmFsLnVuaXQuIiwKLSAgICAgICAgICAgICAgICAiXHUwMEJGQ3VcdTAwRTFsIGVzIGVsIG5vbWJyZSBkZSBzdSB1bmlkYWQgZGUgb3JnYW5pemFjaVx1MDBGM24/In0sCi0gICAgICAgIHsiV2hhdC5pcy50aGUubmFtZS5vZi55b3VyLm9yZ2FuaXphdGlvbi4iLAotICAgICAgICAgICAgICAgICJcdTAwQkZDdVx1MDBFMWwgZXMgZWwgbm9tYnJlIGRlIHN1IG9yZ2FuaXphY2lcdTAwRjNuPyJ9LAotICAgICAgICB7IldoYXQuaXMudGhlLm5hbWUub2YueW91ci5DaXR5Lm9yLkxvY2FsaXR5LiIsCi0gICAgICAgICAgICAgICAgIlx1MDBCRkN1XHUwMEUxbCBlcyBlbCBub21icmUgZGUgc3UgY2l1ZGFkIG8gbG9jYWxpZGFkPyJ9LAotICAgICAgICB7IldoYXQuaXMudGhlLm5hbWUub2YueW91ci5TdGF0ZS5vci5Qcm92aW5jZS4iLAotICAgICAgICAgICAgICAgICJcdTAwQkZDdVx1MDBFMWwgZXMgZWwgbm9tYnJlIGRlIHN1IGVzdGFkbyBvIHByb3ZpbmNpYT8ifSwKLSAgICAgICAgeyJXaGF0LmlzLnRoZS50d28ubGV0dGVyLmNvdW50cnkuY29kZS5mb3IudGhpcy51bml0LiIsCi0gICAgICAgICAgICAgICAgIlx1MDBCRkN1XHUwMEUxbCBlcyBlbCBjXHUwMEYzZGlnbyBkZSBwYVx1MDBFRHMgZGUgZG9zIGxldHJhcyBkZSBsYSB1bmlkYWQ/In0sCi0gICAgICAgIHsiSXMubmFtZS5jb3JyZWN0LiIsICJcdTAwQkZFcyBjb3JyZWN0byB7MH0/In0sCi0gICAgICAgIHsibm8iLCAibm8ifSwKLSAgICAgICAgeyJ5ZXMiLCAic1x1MDBFRCJ9LAotICAgICAgICB7InkiLCAicyJ9LAotICAgICAgICB7Ii5kZWZhdWx0VmFsdWUuIiwgIiAgW3swfV06ICAifSwKLSAgICAgICAgeyJBbGlhcy5hbGlhcy5oYXMubm8ua2V5IiwKLSAgICAgICAgICAgICAgICAiRWwgYWxpYXMgPHswfT4gbm8gdGllbmUgY2xhdmUifSwKLSAgICAgICAgeyJBbGlhcy5hbGlhcy5yZWZlcmVuY2VzLmFuLmVudHJ5LnR5cGUudGhhdC5pcy5ub3QuYS5wcml2YXRlLmtleS5lbnRyeS5UaGUua2V5Y2xvbmUuY29tbWFuZC5vbmx5LnN1cHBvcnRzLmNsb25pbmcub2YucHJpdmF0ZS5rZXkiLAotICAgICAgICAgICAgICAgICAiRWwgYWxpYXMgPHswfT4gaGFjZSByZWZlcmVuY2lhIGEgdW4gdGlwbyBkZSBlbnRyYWRhIHF1ZSBubyBlcyB1bmEgY2xhdmUgcHJpdmFkYS4gRWwgY29tYW5kbyAta2V5Y2xvbmUgc1x1MDBGM2xvIHBlcm1pdGUgbGEgY2xvbmFjaVx1MDBGM24gZGUgZW50cmFkYXMgZGUgY2xhdmVzIHByaXZhZGFzIn0sCi0KLSAgICAgICAgeyIuV0FSTklORy5XQVJOSU5HLldBUk5JTkcuIiwKLSAgICAgICAgICAgICIqKioqKioqKioqKioqKioqKiAgQWR2ZXJ0ZW5jaWEgQWR2ZXJ0ZW5jaWEgQWR2ZXJ0ZW5jaWEgICoqKioqKioqKioqKioqKioqIn0sCi0gICAgICAgIHsiU2lnbmVyLmQuIiwgIiMlZCBkZSBGaXJtYW50ZToifSwKLSAgICAgICAgeyJUaW1lc3RhbXAuIiwgIlJlZ2lzdHJvIGRlIEhvcmE6In0sCi0gICAgICAgIHsiU2lnbmF0dXJlLiIsICJGaXJtYToifSwKLSAgICAgICAgeyJDUkxzLiIsICJDUkw6In0sCi0gICAgICAgIHsiQ2VydGlmaWNhdGUub3duZXIuIiwgIlByb3BpZXRhcmlvIGRlbCBDZXJ0aWZpY2FkbzogIn0sCi0gICAgICAgIHsiTm90LmEuc2lnbmVkLmphci5maWxlIiwgIk5vIGVzIHVuIGFyY2hpdm8gamFyIGZpcm1hZG8ifSwKLSAgICAgICAgeyJOby5jZXJ0aWZpY2F0ZS5mcm9tLnRoZS5TU0wuc2VydmVyIiwKLSAgICAgICAgICAgICAgICAiTmluZ1x1MDBGQW4gY2VydGlmaWNhZG8gZGVsIHNlcnZpZG9yIFNTTCJ9LAotCi0gICAgICAgIHsiLlRoZS5pbnRlZ3JpdHkub2YudGhlLmluZm9ybWF0aW9uLnN0b3JlZC5pbi55b3VyLmtleXN0b3JlLiIsCi0gICAgICAgICAgICAiKiBMYSBpbnRlZ3JpZGFkIGRlIGxhIGluZm9ybWFjaVx1MDBGM24gYWxtYWNlbmFkYSBlbiBlbCBhbG1hY1x1MDBFOW4gZGUgY2xhdmVzICAqXG4qIE5PIHNlIGhhIGNvbXByb2JhZG8uICBQYXJhIGNvbXByb2JhciBkaWNoYSBpbnRlZ3JpZGFkLCAqXG4qIGRlYmUgcHJvcG9yY2lvbmFyIGxhIGNvbnRyYXNlXHUwMEYxYSBkZWwgYWxtYWNcdTAwRTluIGRlIGNsYXZlcy4gICAgICAgICAgICAgICAgICAqIn0sCi0gICAgICAgIHsiLlRoZS5pbnRlZ3JpdHkub2YudGhlLmluZm9ybWF0aW9uLnN0b3JlZC5pbi50aGUuc3Jja2V5c3RvcmUuIiwKLSAgICAgICAgICAgICIqIExhIGludGVncmlkYWQgZGUgbGEgaW5mb3JtYWNpXHUwMEYzbiBhbG1hY2VuYWRhIGVuIHNyY2tleXN0b3JlKlxuKiBOTyBzZSBoYSBjb21wcm9iYWRvLiAgUGFyYSBjb21wcm9iYXIgZGljaGEgaW50ZWdyaWRhZCwgKlxuKiBkZWJlIHByb3BvcmNpb25hciBsYSBjb250cmFzZVx1MDBGMWEgZGUgc3Jja2V5c3RvcmUuICAgICAgICAgICAgICAgICoifSwKLQotICAgICAgICB7IkNlcnRpZmljYXRlLnJlcGx5LmRvZXMubm90LmNvbnRhaW4ucHVibGljLmtleS5mb3IuYWxpYXMuIiwKLSAgICAgICAgICAgICAgICAiTGEgcmVzcHVlc3RhIGRlIGNlcnRpZmljYWRvIG5vIGNvbnRpZW5lIHVuYSBjbGF2ZSBwXHUwMEZBYmxpY2EgcGFyYSA8ezB9PiJ9LAotICAgICAgICB7IkluY29tcGxldGUuY2VydGlmaWNhdGUuY2hhaW4uaW4ucmVwbHkiLAotICAgICAgICAgICAgICAgICJDYWRlbmEgZGUgY2VydGlmaWNhZG8gaW5jb21wbGV0YSBlbiBsYSByZXNwdWVzdGEifSwKLSAgICAgICAgeyJDZXJ0aWZpY2F0ZS5jaGFpbi5pbi5yZXBseS5kb2VzLm5vdC52ZXJpZnkuIiwKLSAgICAgICAgICAgICAgICAiTGEgY2FkZW5hIGRlIGNlcnRpZmljYWRvIGRlIGxhIHJlc3B1ZXN0YSBubyB2ZXJpZmljYTogIn0sCi0gICAgICAgIHsiVG9wLmxldmVsLmNlcnRpZmljYXRlLmluLnJlcGx5LiIsCi0gICAgICAgICAgICAgICAgIkNlcnRpZmljYWRvIGRlIG5pdmVsIHN1cGVyaW9yIGVuIGxhIHJlc3B1ZXN0YTpcbiJ9LAotICAgICAgICB7Ii5pcy5ub3QudHJ1c3RlZC4iLCAiLi4uIG5vIGVzIGRlIGNvbmZpYW56YS4gIn0sCi0gICAgICAgIHsiSW5zdGFsbC5yZXBseS5hbnl3YXkubm8uIiwgIlx1MDBCRkluc3RhbGFyIHJlc3B1ZXN0YSBkZSB0b2RvcyBtb2Rvcz8gW25vXTogICJ9LAotICAgICAgICB7Ik5PIiwgIk5vIn0sCi0gICAgICAgIHsiUHVibGljLmtleXMuaW4ucmVwbHkuYW5kLmtleXN0b3JlLmRvbi50Lm1hdGNoIiwKLSAgICAgICAgICAgICAgICAiTGFzIGNsYXZlcyBwXHUwMEZBYmxpY2FzIGVuIGxhIHJlc3B1ZXN0YSB5IGVuIGVsIGFsbWFjXHUwMEU5biBkZSBjbGF2ZXMgbm8gY29pbmNpZGVuIn0sCi0gICAgICAgIHsiQ2VydGlmaWNhdGUucmVwbHkuYW5kLmNlcnRpZmljYXRlLmluLmtleXN0b3JlLmFyZS5pZGVudGljYWwiLAotICAgICAgICAgICAgICAgICJMYSByZXNwdWVzdGEgZGVsIGNlcnRpZmljYWRvIHkgZWwgY2VydGlmaWNhZG8gZW4gZWwgYWxtYWNcdTAwRTluIGRlIGNsYXZlcyBzb24gaWRcdTAwRTludGljb3MifSwKLSAgICAgICAgeyJGYWlsZWQudG8uZXN0YWJsaXNoLmNoYWluLmZyb20ucmVwbHkiLAotICAgICAgICAgICAgICAgICJObyBzZSBoYSBwb2RpZG8gZGVmaW5pciB1bmEgY2FkZW5hIGEgcGFydGlyIGRlIGxhIHJlc3B1ZXN0YSJ9LAotICAgICAgICB7Im4iLCAibiJ9LAotICAgICAgICB7Ildyb25nLmFuc3dlci50cnkuYWdhaW4iLCAiUmVzcHVlc3RhIGluY29ycmVjdGEsIHZ1ZWx2YSBhIGludGVudGFybG8ifSwKLSAgICAgICAgeyJTZWNyZXQua2V5Lm5vdC5nZW5lcmF0ZWQuYWxpYXMuYWxpYXMuYWxyZWFkeS5leGlzdHMiLAotICAgICAgICAgICAgICAgICJObyBzZSBoYSBnZW5lcmFkbyBsYSBjbGF2ZSBzZWNyZXRhLCBlbCBhbGlhcyA8ezB9PiB5YSBleGlzdGUifSwKLSAgICAgICAgeyJQbGVhc2UucHJvdmlkZS5rZXlzaXplLmZvci5zZWNyZXQua2V5LmdlbmVyYXRpb24iLAotICAgICAgICAgICAgICAgICJQcm9wb3JjaW9uZSBlbCB2YWxvciBkZSAta2V5c2l6ZSBwYXJhIGxhIGdlbmVyYWNpXHUwMEYzbiBkZSBjbGF2ZXMgc2VjcmV0YXMifSwKLQotICAgICAgICB7IkV4dGVuc2lvbnMuIiwgIkV4dGVuc2lvbmVzOiAifSwKLSAgICAgICAgeyIuRW1wdHkudmFsdWUuIiwgIihWYWxvciB2YWNcdTAwRURvKSJ9LAotICAgICAgICB7IkV4dGVuc2lvbi5SZXF1ZXN0LiIsICJTb2xpY2l0dWQgZGUgRXh0ZW5zaVx1MDBGM246In0sCi0gICAgICAgIHsiUEtDUy4xMC5DZXJ0aWZpY2F0ZS5SZXF1ZXN0LlZlcnNpb24uMS4wLlN1YmplY3Qucy5QdWJsaWMuS2V5LnMuZm9ybWF0LnMua2V5LiIsCi0gICAgICAgICAgICAgICAgIlNvbGljaXR1ZCBkZSBDZXJ0aWZpY2FkbyBQS0NTICMxMCAoVmVyc2lcdTAwRjNuIDEuMClcbkFzdW50bzogJXNcbkNsYXZlIFBcdTAwRkFibGljYTogJXMgZm9ybWF0byAlcyBjbGF2ZVxuIn0sCi0gICAgICAgIHsiVW5rbm93bi5rZXlVc2FnZS50eXBlLiIsICJUaXBvIGRlIHVzbyBkZSBjbGF2ZSBkZXNjb25vY2lkbzogIn0sCi0gICAgICAgIHsiVW5rbm93bi5leHRlbmRlZGtleVVzYWdlLnR5cGUuIiwgIlRpcG8gZGUgdXNvIGRlIGNsYXZlIGV4dGVuZGlkYSBkZXNjb25vY2lkbzogIn0sCi0gICAgICAgIHsiVW5rbm93bi5BY2Nlc3NEZXNjcmlwdGlvbi50eXBlLiIsICJUaXBvIGRlIGRlc2NyaXBjaVx1MDBGM24gZGUgYWNjZXNvIGRlc2Nvbm9jaWRvOiAifSwKLSAgICAgICAgeyJVbnJlY29nbml6ZWQuR2VuZXJhbE5hbWUudHlwZS4iLCAiVGlwbyBkZSBub21icmUgZ2VuZXJhbCBubyByZWNvbm9jaWRvOiAifSwKLSAgICAgICAgeyJUaGlzLmV4dGVuc2lvbi5jYW5ub3QuYmUubWFya2VkLmFzLmNyaXRpY2FsLiIsCi0gICAgICAgICAgICAgICAgICJFc3RhIGV4dGVuc2lcdTAwRjNuIG5vIHNlIHB1ZWRlIG1hcmNhciBjb21vIGNyXHUwMEVEdGljYS4gIn0sCi0gICAgICAgIHsiT2RkLm51bWJlci5vZi5oZXguZGlnaXRzLmZvdW5kLiIsICJTZSBoYSBlbmNvbnRyYWRvIHVuIG5cdTAwRkFtZXJvIGltcGFyIGRlIGRcdTAwRURnaXRvcyBoZXhhZGVjaW1hbGVzOiAifSwKLSAgICAgICAgeyJVbmtub3duLmV4dGVuc2lvbi50eXBlLiIsICJUaXBvIGRlIGV4dGVuc2lcdTAwRjNuIGRlc2Nvbm9jaWRhOiAifSwKLSAgICAgICAgeyJjb21tYW5kLnswfS5pcy5hbWJpZ3VvdXMuIiwgIkVsIGNvbWFuZG8gezB9IGVzIGFtYmlndW86In0sCi0KLSAgICAgICAgLy8gcG9saWN5dG9vbAotICAgICAgICB7Ildhcm5pbmcuQS5wdWJsaWMua2V5LmZvci5hbGlhcy5zaWduZXJzLmkuZG9lcy5ub3QuZXhpc3QuTWFrZS5zdXJlLmEuS2V5U3RvcmUuaXMucHJvcGVybHkuY29uZmlndXJlZC4iLAotICAgICAgICAgICAgICAgICJBZHZlcnRlbmNpYTogbm8gaGF5IGNsYXZlIHBcdTAwRkFibGljYSBwYXJhIGVsIGFsaWFzIHswfS4gQXNlZ1x1MDBGQXJlc2UgZGUgcXVlIHNlIGhhIGNvbmZpZ3VyYWRvIGNvcnJlY3RhbWVudGUgdW4gYWxtYWNcdTAwRTluIGRlIGNsYXZlcy4ifSwKLSAgICAgICAgeyJXYXJuaW5nLkNsYXNzLm5vdC5mb3VuZC5jbGFzcyIsICJBZHZlcnRlbmNpYTogbm8gc2UgaGEgZW5jb250cmFkbyBsYSBjbGFzZTogezB9In0sCi0gICAgICAgIHsiV2FybmluZy5JbnZhbGlkLmFyZ3VtZW50LnMuZm9yLmNvbnN0cnVjdG9yLmFyZyIsCi0gICAgICAgICAgICAgICAgIkFkdmVydGVuY2lhOiBhcmd1bWVudG8ocykgbm8gdlx1MDBFMWxpZG8ocykgcGFyYSBlbCBjb25zdHJ1Y3RvcjogezB9In0sCi0gICAgICAgIHsiSWxsZWdhbC5QcmluY2lwYWwuVHlwZS50eXBlIiwgIlRpcG8gZGUgcHJpbmNpcGFsIG5vIHBlcm1pdGlkbzogezB9In0sCi0gICAgICAgIHsiSWxsZWdhbC5vcHRpb24ub3B0aW9uIiwgIk9wY2lcdTAwRjNuIG5vIHBlcm1pdGlkYTogezB9In0sCi0gICAgICAgIHsiVXNhZ2UucG9saWN5dG9vbC5vcHRpb25zLiIsICJTaW50YXhpczogcG9saWN5dG9vbCBbb3BjaW9uZXNdIn0sCi0gICAgICAgIHsiLmZpbGUuZmlsZS5wb2xpY3kuZmlsZS5sb2NhdGlvbiIsCi0gICAgICAgICAgICAgICAgIiAgWy1maWxlIDxhcmNoaXZvPl0gICAgdWJpY2FjaVx1MDBGM24gZGVsIGFyY2hpdm8gZGUgbm9ybWFzIn0sCi0gICAgICAgIHsiTmV3IiwgIk51ZXZvIn0sCi0gICAgICAgIHsiT3BlbiIsICJBYnJpciJ9LAotICAgICAgICB7IlNhdmUiLCAiR3VhcmRhciJ9LAotICAgICAgICB7IlNhdmUuQXMiLCAiR3VhcmRhciBjb21vIn0sCi0gICAgICAgIHsiVmlldy5XYXJuaW5nLkxvZyIsICJWZXIgTG9nIGRlIEFkdmVydGVuY2lhcyJ9LAotICAgICAgICB7IkV4aXQiLCAiU2FsaXIifSwKLSAgICAgICAgeyJBZGQuUG9saWN5LkVudHJ5IiwgIkFncmVnYXIgRW50cmFkYSBkZSBQb2xcdTAwRUR0aWNhIn0sCi0gICAgICAgIHsiRWRpdC5Qb2xpY3kuRW50cnkiLCAiRWRpdGFyIEVudHJhZGEgZGUgUG9sXHUwMEVEdGljYSJ9LAotICAgICAgICB7IlJlbW92ZS5Qb2xpY3kuRW50cnkiLCAiRWxpbWluYXIgRW50cmFkYSBkZSBQb2xcdTAwRUR0aWNhIn0sCi0gICAgICAgIHsiRWRpdCIsICJFZGl0YXIifSwKLSAgICAgICAgeyJSZXRhaW4iLCAiTWFudGVuZXIifSwKLQotICAgICAgICB7Ildhcm5pbmcuRmlsZS5uYW1lLm1heS5pbmNsdWRlLmVzY2FwZWQuYmFja3NsYXNoLmNoYXJhY3RlcnMuSXQuaXMubm90Lm5lY2Vzc2FyeS50by5lc2NhcGUuYmFja3NsYXNoLmNoYXJhY3RlcnMudGhlLnRvb2wuZXNjYXBlcyIsCi0gICAgICAgICAgICAiQWR2ZXJ0ZW5jaWE6IGVsIG5vbWJyZSBkZWwgYXJjaGl2byBwdWVkZSBjb250ZW5lciBjYXJhY3RlcmVzIGRlIGJhcnJhIGludmVydGlkYSBkZSBlc2NhcGUuIE5vIGVzIG5lY2VzYXJpbyB1dGlsaXphciBiYXJyYXMgaW52ZXJ0aWRhcyBkZSBlc2NhcGUgKGxhIGhlcnJhbWllbnRhIGFwbGljYSBjYXJhY3RlcmVzIGRlIGVzY2FwZSBzZWdcdTAwRkFuIHNlYSBuZWNlc2FyaW8gYWwgZXNjcmliaXIgZWwgY29udGVuaWRvIGRlIGxhcyBwb2xcdTAwRUR0aWNhcyBlbiBlbCBhbG1hY1x1MDBFOW4gcGVyc2lzdGVudGUpLlxuXG5IYWdhIGNsaWMgZW4gTWFudGVuZXIgcGFyYSBjb25zZXJ2YXIgZWwgbm9tYnJlIGludHJvZHVjaWRvIG8gZW4gRWRpdGFyIHBhcmEgbW9kaWZpY2FybG8uIn0sCi0KLSAgICAgICAgeyJBZGQuUHVibGljLktleS5BbGlhcyIsICJBZ3JlZ2FyIEFsaWFzIGRlIENsYXZlIFBcdTAwRkFibGljbyJ9LAotICAgICAgICB7IlJlbW92ZS5QdWJsaWMuS2V5LkFsaWFzIiwgIkVsaW1pbmFyIEFsaWFzIGRlIENsYXZlIFBcdTAwRkFibGljbyJ9LAotICAgICAgICB7IkZpbGUiLCAiQXJjaGl2byJ9LAotICAgICAgICB7IktleVN0b3JlIiwgIkFsbWFjXHUwMEU5biBkZSBDbGF2ZXMifSwKLSAgICAgICAgeyJQb2xpY3kuRmlsZS4iLCAiQXJjaGl2byBkZSBQb2xcdTAwRUR0aWNhOiJ9LAotICAgICAgICB7IkNvdWxkLm5vdC5vcGVuLnBvbGljeS5maWxlLnBvbGljeUZpbGUuZS50b1N0cmluZy4iLAotICAgICAgICAgICAgICAgICJObyBzZSBoYSBwb2RpZG8gYWJyaXIgZWwgYXJjaGl2byBkZSBwb2xcdTAwRUR0aWNhOiB7MH06IHsxfSJ9LAotICAgICAgICB7IlBvbGljeS5Ub29sIiwgIkhlcnJhbWllbnRhIGRlIFBvbFx1MDBFRHRpY2FzIn0sCi0gICAgICAgIHsiRXJyb3JzLmhhdmUub2NjdXJyZWQud2hpbGUub3BlbmluZy50aGUucG9saWN5LmNvbmZpZ3VyYXRpb24uVmlldy50aGUuV2FybmluZy5Mb2cuZm9yLm1vcmUuaW5mb3JtYXRpb24uIiwKLSAgICAgICAgICAgICAgICAiSGEgaGFiaWRvIGVycm9yZXMgYWwgYWJyaXIgbGEgY29uZmlndXJhY2lcdTAwRjNuIGRlIHBvbFx1MDBFRHRpY2FzLiBWXHUwMEU5YXNlIGVsIGxvZyBkZSBhZHZlcnRlbmNpYXMgcGFyYSBvYnRlbmVyIG1cdTAwRTFzIGluZm9ybWFjaVx1MDBGM24uIn0sCi0gICAgICAgIHsiRXJyb3IiLCAiRXJyb3IifSwKLSAgICAgICAgeyJPSyIsICJBY2VwdGFyIn0sCi0gICAgICAgIHsiU3RhdHVzIiwgIkVzdGFkbyJ9LAotICAgICAgICB7Ildhcm5pbmciLCAiQWR2ZXJ0ZW5jaWEifSwKLSAgICAgICAgeyJQZXJtaXNzaW9uLiIsCi0gICAgICAgICAgICAgICAgIlBlcm1pc286ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9LAotICAgICAgICB7IlByaW5jaXBhbC5UeXBlLiIsICJUaXBvIGRlIFByaW5jaXBhbDoifSwKLSAgICAgICAgeyJQcmluY2lwYWwuTmFtZS4iLCAiTm9tYnJlIGRlIFByaW5jaXBhbDoifSwKLSAgICAgICAgeyJUYXJnZXQuTmFtZS4iLAotICAgICAgICAgICAgICAgICJOb21icmUgZGUgRGVzdGlubzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIn0sCi0gICAgICAgIHsiQWN0aW9ucy4iLAotICAgICAgICAgICAgICAgICJBY2Npb25lczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIn0sCi0gICAgICAgIHsiT0sudG8ub3ZlcndyaXRlLmV4aXN0aW5nLmZpbGUuZmlsZW5hbWUuIiwKLSAgICAgICAgICAgICAgICAiXHUwMEJGU29icmVzY3JpYmlyIGVsIGFyY2hpdm8gZXhpc3RlbnRlIHswfT8ifSwKLSAgICAgICAgeyJDYW5jZWwiLCAiQ2FuY2VsYXIifSwKLSAgICAgICAgeyJDb2RlQmFzZS4iLCAiQ29kZUJhc2U6In0sCi0gICAgICAgIHsiU2lnbmVkQnkuIiwgIlNpZ25lZEJ5OiJ9LAotICAgICAgICB7IkFkZC5QcmluY2lwYWwiLCAiQWdyZWdhciBQcmluY2lwYWwifSwKLSAgICAgICAgeyJFZGl0LlByaW5jaXBhbCIsICJFZGl0YXIgUHJpbmNpcGFsIn0sCi0gICAgICAgIHsiUmVtb3ZlLlByaW5jaXBhbCIsICJFbGltaW5hciBQcmluY2lwYWwifSwKLSAgICAgICAgeyJQcmluY2lwYWxzLiIsICJQcmluY2lwYWxlczoifSwKLSAgICAgICAgeyIuQWRkLlBlcm1pc3Npb24iLCAiICBBZ3JlZ2FyIFBlcm1pc28ifSwKLSAgICAgICAgeyIuRWRpdC5QZXJtaXNzaW9uIiwgIiAgRWRpdGFyIFBlcm1pc28ifSwKLSAgICAgICAgeyJSZW1vdmUuUGVybWlzc2lvbiIsICJFbGltaW5hciBQZXJtaXNvIn0sCi0gICAgICAgIHsiRG9uZSIsICJMaXN0byJ9LAotICAgICAgICB7IktleVN0b3JlLlVSTC4iLCAiVVJMIGRlIEFsbWFjXHUwMEU5biBkZSBDbGF2ZXM6In0sCi0gICAgICAgIHsiS2V5U3RvcmUuVHlwZS4iLCAiVGlwbyBkZSBBbG1hY1x1MDBFOW4gZGUgQ2xhdmVzOiJ9LAotICAgICAgICB7IktleVN0b3JlLlByb3ZpZGVyLiIsICJQcm92ZWVkb3IgZGUgQWxtYWNcdTAwRTluIGRlIENsYXZlczoifSwKLSAgICAgICAgeyJLZXlTdG9yZS5QYXNzd29yZC5VUkwuIiwgIlVSTCBkZSBDb250cmFzZVx1MDBGMWEgZGUgQWxtYWNcdTAwRTluIGRlIENsYXZlczoifSwKLSAgICAgICAgeyJQcmluY2lwYWxzIiwgIlByaW5jaXBhbGVzIn0sCi0gICAgICAgIHsiLkVkaXQuUHJpbmNpcGFsLiIsICIgIEVkaXRhciBQcmluY2lwYWw6In0sCi0gICAgICAgIHsiLkFkZC5OZXcuUHJpbmNpcGFsLiIsICIgIEFncmVnYXIgTnVldm8gUHJpbmNpcGFsOiJ9LAotICAgICAgICB7IlBlcm1pc3Npb25zIiwgIlBlcm1pc29zIn0sCi0gICAgICAgIHsiLkVkaXQuUGVybWlzc2lvbi4iLCAiICBFZGl0YXIgUGVybWlzbzoifSwKLSAgICAgICAgeyIuQWRkLk5ldy5QZXJtaXNzaW9uLiIsICIgIEFncmVnYXIgUGVybWlzbyBOdWV2bzoifSwKLSAgICAgICAgeyJTaWduZWQuQnkuIiwgIkZpcm1hZG8gUG9yOiJ9LAotICAgICAgICB7IkNhbm5vdC5TcGVjaWZ5LlByaW5jaXBhbC53aXRoLmEuV2lsZGNhcmQuQ2xhc3Mud2l0aG91dC5hLldpbGRjYXJkLk5hbWUiLAotICAgICAgICAgICAgIk5vIHNlIHB1ZWRlIGVzcGVjaWZpY2FyIHVuIHByaW5jaXBhbCBjb24gdW5hIGNsYXNlIGRlIGNvbW9kXHUwMEVEbiBzaW4gdW4gbm9tYnJlIGRlIGNvbW9kXHUwMEVEbiJ9LAotICAgICAgICB7IkNhbm5vdC5TcGVjaWZ5LlByaW5jaXBhbC53aXRob3V0LmEuTmFtZSIsCi0gICAgICAgICAgICAiTm8gc2UgcHVlZGUgZXNwZWNpZmljYXIgZWwgcHJpbmNpcGFsIHNpbiB1biBub21icmUifSwKLSAgICAgICAgeyJQZXJtaXNzaW9uLmFuZC5UYXJnZXQuTmFtZS5tdXN0LmhhdmUuYS52YWx1ZSIsCi0gICAgICAgICAgICAgICAgIlBlcm1pc28geSBOb21icmUgZGUgRGVzdGlubyBkZWJlbiB0ZW5lciB1biB2YWxvciJ9LAotICAgICAgICB7IlJlbW92ZS50aGlzLlBvbGljeS5FbnRyeS4iLCAiXHUwMEJGRWxpbWluYXIgZXN0YSBlbnRyYWRhIGRlIHBvbFx1MDBFRHRpY2E/In0sCi0gICAgICAgIHsiT3ZlcndyaXRlLkZpbGUiLCAiU29icmVzY3JpYmlyIEFyY2hpdm8ifSwKLSAgICAgICAgeyJQb2xpY3kuc3VjY2Vzc2Z1bGx5LndyaXR0ZW4udG8uZmlsZW5hbWUiLAotICAgICAgICAgICAgICAgICJQb2xcdTAwRUR0aWNhIGVzY3JpdGEgY29ycmVjdGFtZW50ZSBlbiB7MH0ifSwKLSAgICAgICAgeyJudWxsLmZpbGVuYW1lIiwgIm5vbWJyZSBkZSBhcmNoaXZvIG51bG8ifSwKLSAgICAgICAgeyJTYXZlLmNoYW5nZXMuIiwgIlx1MDBCRkd1YXJkYXIgbG9zIGNhbWJpb3M/In0sCi0gICAgICAgIHsiWWVzIiwgIlNcdTAwRUQifSwKLSAgICAgICAgeyJObyIsICJObyJ9LAotICAgICAgICB7IlBvbGljeS5FbnRyeSIsICJFbnRyYWRhIGRlIFBvbFx1MDBFRHRpY2EifSwKLSAgICAgICAgeyJTYXZlLkNoYW5nZXMiLCAiR3VhcmRhciBDYW1iaW9zIn0sCi0gICAgICAgIHsiTm8uUG9saWN5LkVudHJ5LnNlbGVjdGVkIiwgIk5vIHNlIGhhIHNlbGVjY2lvbmFkbyBsYSBlbnRyYWRhIGRlIHBvbFx1MDBFRHRpY2EifSwKLSAgICAgICAgeyJVbmFibGUudG8ub3Blbi5LZXlTdG9yZS5leC50b1N0cmluZy4iLAotICAgICAgICAgICAgICAgICJObyBzZSBoYSBwb2RpZG8gYWJyaXIgZWwgYWxtYWNcdTAwRTluIGRlIGNsYXZlczogezB9In0sCi0gICAgICAgIHsiTm8ucHJpbmNpcGFsLnNlbGVjdGVkIiwgIk5vIHNlIGhhIHNlbGVjY2lvbmFkbyB1biBwcmluY2lwYWwifSwKLSAgICAgICAgeyJOby5wZXJtaXNzaW9uLnNlbGVjdGVkIiwgIk5vIHNlIGhhIHNlbGVjY2lvbmFkbyB1biBwZXJtaXNvIn0sCi0gICAgICAgIHsibmFtZSIsICJub21icmUifSwKLSAgICAgICAgeyJjb25maWd1cmF0aW9uLnR5cGUiLCAidGlwbyBkZSBjb25maWd1cmFjaVx1MDBGM24ifSwKLSAgICAgICAgeyJlbnZpcm9ubWVudC52YXJpYWJsZS5uYW1lIiwgIm5vbWJyZSBkZSB2YXJpYWJsZSBkZSBlbnRvcm5vIn0sCi0gICAgICAgIHsibGlicmFyeS5uYW1lIiwgIm5vbWJyZSBkZSBsYSBiaWJsaW90ZWNhIn0sCi0gICAgICAgIHsicGFja2FnZS5uYW1lIiwgIm5vbWJyZSBkZWwgcGFxdWV0ZSJ9LAotICAgICAgICB7InBvbGljeS50eXBlIiwgInRpcG8gZGUgcG9sXHUwMEVEdGljYSJ9LAotICAgICAgICB7InByb3BlcnR5Lm5hbWUiLCAibm9tYnJlIGRlIGxhIHByb3BpZWRhZCJ9LAotICAgICAgICB7IlByaW5jaXBhbC5MaXN0IiwgIkxpc3RhIGRlIFByaW5jaXBhbGVzIn0sCi0gICAgICAgIHsiUGVybWlzc2lvbi5MaXN0IiwgIkxpc3RhIGRlIFBlcm1pc29zIn0sCi0gICAgICAgIHsiQ29kZS5CYXNlIiwgIkJhc2UgZGUgQ1x1MDBGM2RpZ28ifSwKLSAgICAgICAgeyJLZXlTdG9yZS5VLlIuTC4iLCAiVVJMIGRlIEFsbWFjXHUwMEU5biBkZSBDbGF2ZXM6In0sCi0gICAgICAgIHsiS2V5U3RvcmUuUGFzc3dvcmQuVS5SLkwuIiwgIlVSTCBkZSBDb250cmFzZVx1MDBGMWEgZGUgQWxtYWNcdTAwRTluIGRlIENsYXZlczoifSwKLQotCiAgICAgICAgIC8vIGphdmF4LnNlY3VyaXR5LmF1dGguUHJpdmF0ZUNyZWRlbnRpYWxQZXJtaXNzaW9uCiAgICAgICAgIHsiaW52YWxpZC5udWxsLmlucHV0LnMuIiwgImVudHJhZGFzIG51bGFzIG5vIHZcdTAwRTFsaWRhcyJ9LAogICAgICAgICB7ImFjdGlvbnMuY2FuLm9ubHkuYmUucmVhZC4iLCAibGFzIGFjY2lvbmVzIHNcdTAwRjNsbyBwdWVkZW4gJ2xlZXJzZScifSwKQEAgLTU1Myw2ICs1OCw3IEBACiAgICAgICAgIHsicHJvdmlkZWQubnVsbC5PSUQubWFwIiwgIm1hcGEgZGUgT0lEIHByb3BvcmNpb25hZG8gbnVsbyJ9LAogCiAgICAgICAgIC8vIGphdmF4LnNlY3VyaXR5LmF1dGguU3ViamVjdAorICAgICAgICB7Ik5FV0xJTkUiLCAiXG4ifSwKICAgICAgICAgeyJpbnZhbGlkLm51bGwuQWNjZXNzQ29udHJvbENvbnRleHQucHJvdmlkZWQiLAogICAgICAgICAgICAgICAgICJzZSBoYSBwcm9wb3JjaW9uYWRvIHVuIEFjY2Vzc0NvbnRyb2xDb250ZXh0IG51bG8gbm8gdlx1MDBFMWxpZG8ifSwKICAgICAgICAgeyJpbnZhbGlkLm51bGwuYWN0aW9uLnByb3ZpZGVkIiwgInNlIGhhIHByb3BvcmNpb25hZG8gdW5hIGFjY2lcdTAwRjNuIG51bGEgbm8gdlx1MDBFMWxpZGEifSwKQEAgLTY1Niw2ICsxNjIsNyBAQAogICAgICAqCiAgICAgICogQHJldHVybiB0aGUgY29udGVudHMgb2YgdGhpcyA8Y29kZT5SZXNvdXJjZUJ1bmRsZTwvY29kZT4uCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIE9iamVjdFtdW10gZ2V0Q29udGVudHMoKSB7CiAgICAgICAgIHJldHVybiBjb250ZW50czsKICAgICB9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3V0aWwvUmVzb3VyY2VzX2ZyLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3V0aWwvUmVzb3VyY2VzX2ZyLmphdmEKaW5kZXggMzg1YjYxOC4uYTgyYTJlNCAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS91dGlsL1Jlc291cmNlc19mci5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdXRpbC9SZXNvdXJjZXNfZnIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTM0LDUwMSArMzQsNiBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W11bXSBjb250ZW50cyA9IHsKIAotICAgICAgICAvLyBzaGFyZWQgKGZyb20gamFyc2lnbmVyKQotICAgICAgICB7IlNQQUNFIiwgIiAifSwKLSAgICAgICAgeyIyU1BBQ0UiLCAiICAifSwKLSAgICAgICAgeyI2U1BBQ0UiLCAiICAgICAgIn0sCi0gICAgICAgIHsiQ09NTUEiLCAiLCAifSwKLSAgICAgICAgLy8gc2hhcmVkIChmcm9tIGtleXRvb2wpCi0gICAgICAgIHsiTkVXTElORSIsICJcbiJ9LAotICAgICAgICB7IlNUQVIiLAotICAgICAgICAgICAgICAgICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIn0sCi0gICAgICAgIHsiU1RBUk5OIiwKLSAgICAgICAgICAgICAgICAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG4ifSwKLQotICAgICAgICAvLyBrZXl0b29sOiBIZWxwIHBhcnQKLS8vICJPcHRpb24iIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotICAgICAgICB7Ii5PUFRJT04uIiwgIiBbT3B0aW9uXS4uLiJ9LAotICAgICAgICB7Ik9wdGlvbnMuIiwgIk9wdGlvbnMgOiJ9LAotICAgICAgICB7IlVzZS5rZXl0b29sLmhlbHAuZm9yLmFsbC5hdmFpbGFibGUuY29tbWFuZHMiLAotICAgICAgICAgICAgICAgICAiVXRpbGlzZXIgXCJrZXl0b29sIC1oZWxwXCIgcG91ciB0b3V0ZXMgbGVzIGNvbW1hbmRlcyBkaXNwb25pYmxlcyJ9LAotICAgICAgICB7IktleS5hbmQuQ2VydGlmaWNhdGUuTWFuYWdlbWVudC5Ub29sIiwKLSAgICAgICAgICAgICAgICAgIk91dGlsIGRlIGdlc3Rpb24gZGUgY2VydGlmaWNhdHMgZXQgZGUgY2xcdTAwRTlzIn0sCi0gICAgICAgIHsiQ29tbWFuZHMuIiwgIkNvbW1hbmRlcyA6In0sCi0gICAgICAgIHsiVXNlLmtleXRvb2wuY29tbWFuZC5uYW1lLmhlbHAuZm9yLnVzYWdlLm9mLmNvbW1hbmQubmFtZSIsCi0gICAgICAgICAgICAgICAgIlV0aWxpc2VyIFwia2V5dG9vbCAtY29tbWFuZF9uYW1lIC1oZWxwXCIgcG91ciBsYSBzeW50YXhlIGRlIGNvbW1hbmRfbmFtZSJ9LAotICAgICAgICAvLyBrZXl0b29sOiBoZWxwOiBjb21tYW5kcwotICAgICAgICB7IkdlbmVyYXRlcy5hLmNlcnRpZmljYXRlLnJlcXVlc3QiLAotICAgICAgICAgICAgICAgICJHXHUwMEU5blx1MDBFOHJlIHVuZSBkZW1hbmRlIGRlIGNlcnRpZmljYXQifSwgLy8tY2VydHJlcQotICAgICAgICB7IkNoYW5nZXMuYW4uZW50cnkucy5hbGlhcyIsCi0gICAgICAgICAgICAgICAgIk1vZGlmaWUgbCdhbGlhcyBkJ3VuZSBlbnRyXHUwMEU5ZSJ9LCAvLy1jaGFuZ2VhbGlhcwotICAgICAgICB7IkRlbGV0ZXMuYW4uZW50cnkiLAotICAgICAgICAgICAgICAgICJTdXBwcmltZSB1bmUgZW50clx1MDBFOWUifSwgLy8tZGVsZXRlCi0gICAgICAgIHsiRXhwb3J0cy5jZXJ0aWZpY2F0ZSIsCi0gICAgICAgICAgICAgICAgIkV4cG9ydGUgbGUgY2VydGlmaWNhdCJ9LCAvLy1leHBvcnRjZXJ0Ci0gICAgICAgIHsiR2VuZXJhdGVzLmEua2V5LnBhaXIiLAotICAgICAgICAgICAgICAgICJHXHUwMEU5blx1MDBFOHJlIHVuZSBwYWlyZSBkZSBjbFx1MDBFOXMifSwgLy8tZ2Vua2V5cGFpcgotLy8gdHJhbnNsYXRpb24gb2YgInNlY3JldCIga2V5IHNob3VsZCBiZSBkaWZmZXJlbnQgdG8gInByaXZhdGUiIGtleS4KLSAgICAgICAgeyJHZW5lcmF0ZXMuYS5zZWNyZXQua2V5IiwKLSAgICAgICAgICAgICAgICAiR1x1MDBFOW5cdTAwRThyZSB1bmUgY2xcdTAwRTkgc2Vjclx1MDBFOHRlIn0sIC8vLWdlbnNlY2tleQotICAgICAgICB7IkdlbmVyYXRlcy5jZXJ0aWZpY2F0ZS5mcm9tLmEuY2VydGlmaWNhdGUucmVxdWVzdCIsCi0gICAgICAgICAgICAgICAgIkdcdTAwRTluXHUwMEU4cmUgbGUgY2VydGlmaWNhdCBcdTAwRTAgcGFydGlyIGQndW5lIGRlbWFuZGUgZGUgY2VydGlmaWNhdCJ9LCAvLy1nZW5jZXJ0Ci0gICAgICAgIHsiR2VuZXJhdGVzLkNSTCIsICJHXHUwMEU5blx1MDBFOHJlIGxhIGxpc3RlIGRlcyBjZXJ0aWZpY2F0cyByXHUwMEU5dm9xdVx1MDBFOXMgKENSTCkifSwgLy8tZ2VuY3JsCi0gICAgICAgIHsiSW1wb3J0cy5lbnRyaWVzLmZyb20uYS5KREsuMS4xLnguc3R5bGUuaWRlbnRpdHkuZGF0YWJhc2UiLAotICAgICAgICAgICAgICAgICJJbXBvcnRlIGxlcyBlbnRyXHUwMEU5ZXMgXHUwMEUwIHBhcnRpciBkJ3VuZSBiYXNlIGRlIGRvbm5cdTAwRTllcyBkJ2lkZW50aXRcdTAwRTlzIGRlIHR5cGUgSkRLIDEuMS54In0sIC8vLWlkZW50aXR5ZGIKLSAgICAgICAgeyJJbXBvcnRzLmEuY2VydGlmaWNhdGUub3IuYS5jZXJ0aWZpY2F0ZS5jaGFpbiIsCi0gICAgICAgICAgICAgICAgIkltcG9ydGUgdW4gY2VydGlmaWNhdCBvdSB1bmUgY2hhXHUwMEVFbmUgZGUgY2VydGlmaWNhdCJ9LCAvLy1pbXBvcnRjZXJ0Ci0gICAgICAgIHsiSW1wb3J0cy5vbmUub3IuYWxsLmVudHJpZXMuZnJvbS5hbm90aGVyLmtleXN0b3JlIiwKLSAgICAgICAgICAgICAgICAiSW1wb3J0ZSB1bmUgZW50clx1MDBFOWUgb3UgbGEgdG90YWxpdFx1MDBFOSBkZXMgZW50clx1MDBFOWVzIGRlcHVpcyB1biBhdXRyZSBmaWNoaWVyIGRlIGNsXHUwMEU5cyJ9LCAvLy1pbXBvcnRrZXlzdG9yZQotICAgICAgICB7IkNsb25lcy5hLmtleS5lbnRyeSIsCi0gICAgICAgICAgICAgICAgIkNsb25lIHVuZSBlbnRyXHUwMEU5ZSBkZSBjbFx1MDBFOSJ9LCAvLy1rZXljbG9uZQotICAgICAgICB7IkNoYW5nZXMudGhlLmtleS5wYXNzd29yZC5vZi5hbi5lbnRyeSIsCi0gICAgICAgICAgICAgICAgIk1vZGlmaWUgbGUgbW90IGRlIHBhc3NlIGRlIGNsXHUwMEU5IGQndW5lIGVudHJcdTAwRTllIn0sIC8vLWtleXBhc3N3ZAotICAgICAgICB7Ikxpc3RzLmVudHJpZXMuaW4uYS5rZXlzdG9yZSIsCi0gICAgICAgICAgICAgICAgIlJcdTAwRTlwZXJ0b3JpZSBsZXMgZW50clx1MDBFOWVzIGQndW4gZmljaGllciBkZSBjbFx1MDBFOXMifSwgLy8tbGlzdAotICAgICAgICB7IlByaW50cy50aGUuY29udGVudC5vZi5hLmNlcnRpZmljYXRlIiwKLSAgICAgICAgICAgICAgICAiSW1wcmltZSBsZSBjb250ZW51IGQndW4gY2VydGlmaWNhdCJ9LCAvLy1wcmludGNlcnQKLSAgICAgICAgeyJQcmludHMudGhlLmNvbnRlbnQub2YuYS5jZXJ0aWZpY2F0ZS5yZXF1ZXN0IiwKLSAgICAgICAgICAgICAgICAiSW1wcmltZSBsZSBjb250ZW51IGQndW5lIGRlbWFuZGUgZGUgY2VydGlmaWNhdCJ9LCAvLy1wcmludGNlcnRyZXEKLSAgICAgICAgeyJQcmludHMudGhlLmNvbnRlbnQub2YuYS5DUkwuZmlsZSIsCi0gICAgICAgICAgICAgICAgIkltcHJpbWUgbGUgY29udGVudSBkJ3VuIGZpY2hpZXIgZGUgbGlzdGUgZGVzIGNlcnRpZmljYXRzIHJcdTAwRTl2b3F1XHUwMEU5cyAoQ1JMKSJ9LCAvLy1wcmludGNybAotICAgICAgICB7IkdlbmVyYXRlcy5hLnNlbGYuc2lnbmVkLmNlcnRpZmljYXRlIiwKLSAgICAgICAgICAgICAgICAiR1x1MDBFOW5cdTAwRThyZSB1biBjZXJ0aWZpY2F0IGF1dG8tc2lnblx1MDBFOSJ9LCAvLy1zZWxmY2VydAotICAgICAgICB7IkNoYW5nZXMudGhlLnN0b3JlLnBhc3N3b3JkLm9mLmEua2V5c3RvcmUiLAotICAgICAgICAgICAgICAgICJNb2RpZmllIGxlIG1vdCBkZSBwYXNzZSBkZSBiYW5xdWUgZCd1biBmaWNoaWVyIGRlIGNsXHUwMEU5cyJ9LCAvLy1zdG9yZXBhc3N3ZAotICAgICAgICAvLyBrZXl0b29sOiBoZWxwOiBvcHRpb25zCi0gICAgICAgIHsiYWxpYXMubmFtZS5vZi50aGUuZW50cnkudG8ucHJvY2VzcyIsCi0gICAgICAgICAgICAgICAgIm5vbSBkJ2FsaWFzIGRlIGwnZW50clx1MDBFOWUgXHUwMEUwIHRyYWl0ZXIifSwgLy8tYWxpYXMKLSAgICAgICAgeyJkZXN0aW5hdGlvbi5hbGlhcyIsCi0gICAgICAgICAgICAgICAgImFsaWFzIGRlIGRlc3RpbmF0aW9uIn0sIC8vLWRlc3RhbGlhcwotICAgICAgICB7ImRlc3RpbmF0aW9uLmtleS5wYXNzd29yZCIsCi0gICAgICAgICAgICAgICAgIm1vdCBkZSBwYXNzZSBkZSBsYSBjbFx1MDBFOSBkZSBkZXN0aW5hdGlvbiJ9LCAvLy1kZXN0a2V5cGFzcwotICAgICAgICB7ImRlc3RpbmF0aW9uLmtleXN0b3JlLm5hbWUiLAotICAgICAgICAgICAgICAgICJub20gZHUgZmljaGllciBkZSBjbFx1MDBFOXMgZGUgZGVzdGluYXRpb24ifSwgLy8tZGVzdGtleXN0b3JlCi0gICAgICAgIHsiZGVzdGluYXRpb24ua2V5c3RvcmUucGFzc3dvcmQucHJvdGVjdGVkIiwKLSAgICAgICAgICAgICAgICAibW90IGRlIHBhc3NlIGR1IGZpY2hpZXIgZGUgY2xcdTAwRTlzIGRlIGRlc3RpbmF0aW9uIHByb3RcdTAwRTlnXHUwMEU5In0sIC8vLWRlc3Rwcm90ZWN0ZWQKLSAgICAgICAgeyJkZXN0aW5hdGlvbi5rZXlzdG9yZS5wcm92aWRlci5uYW1lIiwKLSAgICAgICAgICAgICAgICAibm9tIGR1IGZvdXJuaXNzZXVyIGR1IGZpY2hpZXIgZGUgY2xcdTAwRTlzIGRlIGRlc3RpbmF0aW9uIn0sIC8vLWRlc3Rwcm92aWRlcm5hbWUKLSAgICAgICAgeyJkZXN0aW5hdGlvbi5rZXlzdG9yZS5wYXNzd29yZCIsCi0gICAgICAgICAgICAgICAgIm1vdCBkZSBwYXNzZSBkdSBmaWNoaWVyIGRlIGNsXHUwMEU5cyBkZSBkZXN0aW5hdGlvbiJ9LCAvLy1kZXN0c3RvcmVwYXNzCi0gICAgICAgIHsiZGVzdGluYXRpb24ua2V5c3RvcmUudHlwZSIsCi0gICAgICAgICAgICAgICAgInR5cGUgZHUgZmljaGllciBkZSBjbFx1MDBFOXMgZGUgZGVzdGluYXRpb24ifSwgLy8tZGVzdHN0b3JldHlwZQotICAgICAgICB7ImRpc3Rpbmd1aXNoZWQubmFtZSIsCi0gICAgICAgICAgICAgICAgIm5vbSBkaXN0aW5jdGlmIn0sIC8vLWRuYW1lCi0gICAgICAgIHsiWC41MDkuZXh0ZW5zaW9uIiwKLSAgICAgICAgICAgICAgICAiZXh0ZW5zaW9uIFguNTA5In0sIC8vLWV4dAotICAgICAgICB7Im91dHB1dC5maWxlLm5hbWUiLAotICAgICAgICAgICAgICAgICJub20gZHUgZmljaGllciBkZSBzb3J0aWUifSwgLy8tZmlsZSBhbmQgLW91dGZpbGUKLSAgICAgICAgeyJpbnB1dC5maWxlLm5hbWUiLAotICAgICAgICAgICAgICAgICJub20gZHUgZmljaGllciBkJ2VudHJcdTAwRTllIn0sIC8vLWZpbGUgYW5kIC1pbmZpbGUKLSAgICAgICAgeyJrZXkuYWxnb3JpdGhtLm5hbWUiLAotICAgICAgICAgICAgICAgICJub20gZGUgbCdhbGdvcml0aG1lIGRlIGNsXHUwMEU5In0sIC8vLWtleWFsZwotICAgICAgICB7ImtleS5wYXNzd29yZCIsCi0gICAgICAgICAgICAgICAgIm1vdCBkZSBwYXNzZSBkZSBsYSBjbFx1MDBFOSJ9LCAvLy1rZXlwYXNzCi0gICAgICAgIHsia2V5LmJpdC5zaXplIiwKLSAgICAgICAgICAgICAgICAidGFpbGxlIGVuIGJpdHMgZGUgbGEgY2xcdTAwRTkifSwgLy8ta2V5c2l6ZQotICAgICAgICB7ImtleXN0b3JlLm5hbWUiLAotICAgICAgICAgICAgICAgICJub20gZHUgZmljaGllciBkZSBjbFx1MDBFOXMifSwgLy8ta2V5c3RvcmUKLSAgICAgICAgeyJuZXcucGFzc3dvcmQiLAotICAgICAgICAgICAgICAgICJub3V2ZWF1IG1vdCBkZSBwYXNzZSJ9LCAvLy1uZXcKLSAgICAgICAgeyJkby5ub3QucHJvbXB0IiwKLSAgICAgICAgICAgICAgICAibmUgcGFzIGludml0ZXIifSwgLy8tbm9wcm9tcHQKLSAgICAgICAgeyJwYXNzd29yZC50aHJvdWdoLnByb3RlY3RlZC5tZWNoYW5pc20iLAotICAgICAgICAgICAgICAgICJtb3QgZGUgcGFzc2UgdmlhIG1cdTAwRTljYW5pc21lIHByb3RcdTAwRTlnXHUwMEU5In0sIC8vLXByb3RlY3RlZAotICAgICAgICB7InByb3ZpZGVyLmFyZ3VtZW50IiwKLSAgICAgICAgICAgICAgICAiYXJndW1lbnQgZHUgZm91cm5pc3NldXIifSwgLy8tcHJvdmlkZXJhcmcKLSAgICAgICAgeyJwcm92aWRlci5jbGFzcy5uYW1lIiwKLSAgICAgICAgICAgICAgICAibm9tIGRlIGxhIGNsYXNzZSBkZSBmb3Vybmlzc2V1ciJ9LCAvLy1wcm92aWRlcmNsYXNzCi0gICAgICAgIHsicHJvdmlkZXIubmFtZSIsCi0gICAgICAgICAgICAgICAgIm5vbSBkdSBmb3Vybmlzc2V1ciJ9LCAvLy1wcm92aWRlcm5hbWUKLSAgICAgICAgeyJwcm92aWRlci5jbGFzc3BhdGgiLAotICAgICAgICAgICAgICAgICJ2YXJpYWJsZSBkJ2Vudmlyb25uZW1lbnQgQ0xBU1NQQVRIIGR1IGZvdXJuaXNzZXVyIn0sIC8vLXByb3ZpZGVycGF0aAotICAgICAgICB7Im91dHB1dC5pbi5SRkMuc3R5bGUiLAotICAgICAgICAgICAgICAgICJzb3J0aWUgYXUgc3R5bGUgUkZDIn0sIC8vLXJmYwotICAgICAgICB7InNpZ25hdHVyZS5hbGdvcml0aG0ubmFtZSIsCi0gICAgICAgICAgICAgICAgIm5vbSBkZSBsJ2FsZ29yaXRobWUgZGUgc2lnbmF0dXJlIn0sIC8vLXNpZ2FsZwotICAgICAgICB7InNvdXJjZS5hbGlhcyIsCi0gICAgICAgICAgICAgICAgImFsaWFzIHNvdXJjZSJ9LCAvLy1zcmNhbGlhcwotICAgICAgICB7InNvdXJjZS5rZXkucGFzc3dvcmQiLAotICAgICAgICAgICAgICAgICJtb3QgZGUgcGFzc2UgZGUgbGEgY2xcdTAwRTkgc291cmNlIn0sIC8vLXNyY2tleXBhc3MKLSAgICAgICAgeyJzb3VyY2Uua2V5c3RvcmUubmFtZSIsCi0gICAgICAgICAgICAgICAgIm5vbSBkdSBmaWNoaWVyIGRlIGNsXHUwMEU5cyBzb3VyY2UifSwgLy8tc3Jja2V5c3RvcmUKLSAgICAgICAgeyJzb3VyY2Uua2V5c3RvcmUucGFzc3dvcmQucHJvdGVjdGVkIiwKLSAgICAgICAgICAgICAgICAibW90IGRlIHBhc3NlIGR1IGZpY2hpZXIgZGUgY2xcdTAwRTlzIHNvdXJjZSBwcm90XHUwMEU5Z1x1MDBFOSJ9LCAvLy1zcmNwcm90ZWN0ZWQKLSAgICAgICAgeyJzb3VyY2Uua2V5c3RvcmUucHJvdmlkZXIubmFtZSIsCi0gICAgICAgICAgICAgICAgIm5vbSBkdSBmb3Vybmlzc2V1ciBkdSBmaWNoaWVyIGRlIGNsXHUwMEU5cyBzb3VyY2UifSwgLy8tc3JjcHJvdmlkZXJuYW1lCi0gICAgICAgIHsic291cmNlLmtleXN0b3JlLnBhc3N3b3JkIiwKLSAgICAgICAgICAgICAgICAibW90IGRlIHBhc3NlIGR1IGZpY2hpZXIgZGUgY2xcdTAwRTlzIHNvdXJjZSJ9LCAvLy1zcmNzdG9yZXBhc3MKLSAgICAgICAgeyJzb3VyY2Uua2V5c3RvcmUudHlwZSIsCi0gICAgICAgICAgICAgICAgInR5cGUgZHUgZmljaGllciBkZSBjbFx1MDBFOXMgc291cmNlIn0sIC8vLXNyY3N0b3JldHlwZQotICAgICAgICB7IlNTTC5zZXJ2ZXIuaG9zdC5hbmQucG9ydCIsCi0gICAgICAgICAgICAgICAgIlBvcnQgZXQgaFx1MDBGNHRlIGR1IHNlcnZldXIgU1NMIn0sIC8vLXNzbHNlcnZlcgotICAgICAgICB7InNpZ25lZC5qYXIuZmlsZSIsCi0gICAgICAgICAgICAgICAgImZpY2hpZXIgSkFSIHNpZ25cdTAwRTkifSwgLy89amFyZmlsZQotICAgICAgICB7ImNlcnRpZmljYXRlLnZhbGlkaXR5LnN0YXJ0LmRhdGUudGltZSIsCi0gICAgICAgICAgICAgICAgImRhdGUvaGV1cmUgZGUgZFx1MDBFOWJ1dCBkZSB2YWxpZGl0XHUwMEU5IGR1IGNlcnRpZmljYXQifSwgLy8tc3RhcnRkYXRlCi0gICAgICAgIHsia2V5c3RvcmUucGFzc3dvcmQiLAotICAgICAgICAgICAgICAgICJtb3QgZGUgcGFzc2UgZHUgZmljaGllciBkZSBjbFx1MDBFOXMifSwgLy8tc3RvcmVwYXNzCi0gICAgICAgIHsia2V5c3RvcmUudHlwZSIsCi0gICAgICAgICAgICAgICAgInR5cGUgZHUgZmljaGllciBkZSBjbFx1MDBFOXMifSwgLy8tc3RvcmV0eXBlCi0gICAgICAgIHsidHJ1c3QuY2VydGlmaWNhdGVzLmZyb20uY2FjZXJ0cyIsCi0gICAgICAgICAgICAgICAgImNlcnRpZmljYXRzIHNcdTAwRTljdXJpc1x1MDBFOXMgaXNzdXMgZGUgY2VydGlmaWNhdHMgQ0EifSwgLy8tdHJ1c3RjYWNlcnRzCi0gICAgICAgIHsidmVyYm9zZS5vdXRwdXQiLAotICAgICAgICAgICAgICAgICJzb3J0aWUgZW4gbW9kZSB2ZXJib3NlIn0sIC8vLXYKLSAgICAgICAgeyJ2YWxpZGl0eS5udW1iZXIub2YuZGF5cyIsCi0gICAgICAgICAgICAgICAgIm5vbWJyZSBkZSBqb3VycyBkZSB2YWxpZGl0XHUwMEU5In0sIC8vLXZhbGlkaXR5Ci0gICAgICAgIHsiU2VyaWFsLklELm9mLmNlcnQudG8ucmV2b2tlIiwKLSAgICAgICAgICAgICAgICAgIklEIGRlIHNcdTAwRTlyaWUgZHUgY2VydGlmaWNhdCBcdTAwRTAgclx1MDBFOXZvcXVlciJ9LCAvLy1pZAotICAgICAgICAvLyBrZXl0b29sOiBSdW5uaW5nIHBhcnQKLSAgICAgICAgeyJrZXl0b29sLmVycm9yLiIsICJlcnJldXIga2V5dG9vbCA6ICJ9LAotICAgICAgICB7IklsbGVnYWwub3B0aW9uLiIsICJPcHRpb24gbm9uIGFkbWlzZSA6ICAifSwKLSAgICAgICAgeyJJbGxlZ2FsLnZhbHVlLiIsICJWYWxldXIgbm9uIGFkbWlzZSA6ICJ9LAotICAgICAgICB7IlVua25vd24ucGFzc3dvcmQudHlwZS4iLCAiVHlwZSBkZSBtb3QgZGUgcGFzc2UgaW5jb25udSA6ICJ9LAotICAgICAgICB7IkNhbm5vdC5maW5kLmVudmlyb25tZW50LnZhcmlhYmxlLiIsCi0gICAgICAgICAgICAgICAgIlZhcmlhYmxlIGQnZW52aXJvbm5lbWVudCBpbnRyb3V2YWJsZSA6ICJ9LAotICAgICAgICB7IkNhbm5vdC5maW5kLmZpbGUuIiwgIkZpY2hpZXIgaW50cm91dmFibGUgOiAifSwKLSAgICAgICAgeyJDb21tYW5kLm9wdGlvbi5mbGFnLm5lZWRzLmFuLmFyZ3VtZW50LiIsICJMJydvcHRpb24gZGUgY29tbWFuZGUgezB9IHJlcXVpZXJ0IHVuIGFyZ3VtZW50LiJ9LAotICAgICAgICB7Ildhcm5pbmcuRGlmZmVyZW50LnN0b3JlLmFuZC5rZXkucGFzc3dvcmRzLm5vdC5zdXBwb3J0ZWQuZm9yLlBLQ1MxMi5LZXlTdG9yZXMuSWdub3JpbmcudXNlci5zcGVjaWZpZWQuY29tbWFuZC52YWx1ZS4iLAotICAgICAgICAgICAgICAgICJBdmVydGlzc2VtZW50XHUwMEEwOiBsZXMgbW90cyBkZSBwYXNzZSBkZSBjbFx1MDBFOSBldCBkZSBiYW5xdWUgZGlzdGluY3RzIG5lIHNvbnQgcGFzIHByaXMgZW4gY2hhcmdlIHBvdXIgbGVzIGZpY2hpZXJzIGRlIGNsXHUwMEU5cyBkJydhY2NcdTAwRThzIFBLQ1MxMi4gTGEgdmFsZXVyIHswfSBzcFx1MDBFOWNpZmlcdTAwRTllIHBhciBsJyd1dGlsaXNhdGV1ciBlc3QgaWdub3JcdTAwRTllLiJ9LAotICAgICAgICB7Ii5rZXlzdG9yZS5tdXN0LmJlLk5PTkUuaWYuc3RvcmV0eXBlLmlzLnswfSIsCi0gICAgICAgICAgICAgICAgIi1rZXlzdG9yZSBkb2l0IFx1MDBFQXRyZSBkXHUwMEU5ZmluaSBzdXIgTk9ORSBzaSAtc3RvcmV0eXBlIGVzdCB7MH0ifSwKLSAgICAgICAgeyJUb28ubWFueS5yZXRyaWVzLnByb2dyYW0udGVybWluYXRlZCIsCi0gICAgICAgICAgICAgICAgICJUcm9wIGRlIHRlbnRhdGl2ZXMsIGZpbiBkdSBwcm9ncmFtbWUifSwKLSAgICAgICAgeyIuc3RvcmVwYXNzd2QuYW5kLmtleXBhc3N3ZC5jb21tYW5kcy5ub3Quc3VwcG9ydGVkLmlmLnN0b3JldHlwZS5pcy57MH0iLAotICAgICAgICAgICAgICAgICJMZXMgY29tbWFuZGVzIC1zdG9yZXBhc3N3ZCBldCAta2V5cGFzc3dkIG5lIHNvbnQgcGFzIHByaXNlcyBlbiBjaGFyZ2Ugc2kgLXN0b3JldHlwZSBlc3QgZFx1MDBFOWZpbmkgc3VyIHswfSJ9LAotICAgICAgICB7Ii5rZXlwYXNzd2QuY29tbWFuZHMubm90LnN1cHBvcnRlZC5pZi5zdG9yZXR5cGUuaXMuUEtDUzEyIiwKLSAgICAgICAgICAgICAgICAiTGVzIGNvbW1hbmRlcyAta2V5cGFzc3dkIG5lIHNvbnQgcGFzIHByaXNlcyBlbiBjaGFyZ2Ugc2kgLXN0b3JldHlwZSBlc3QgZFx1MDBFOWZpbmkgc3VyIFBLQ1MxMiJ9LAotICAgICAgICB7Ii5rZXlwYXNzLmFuZC5uZXcuY2FuLm5vdC5iZS5zcGVjaWZpZWQuaWYuc3RvcmV0eXBlLmlzLnswfSIsCi0gICAgICAgICAgICAgICAgIkxlcyBjb21tYW5kZXMgLWtleXBhc3MgZXQgLW5ldyBuZSBwZXV2ZW50IHBhcyBcdTAwRUF0cmUgc3BcdTAwRTljaWZpXHUwMEU5ZXMgc2kgLXN0b3JldHlwZSBlc3QgZFx1MDBFOWZpbmkgc3VyIHswfSJ9LAotICAgICAgICB7ImlmLnByb3RlY3RlZC5pcy5zcGVjaWZpZWQudGhlbi5zdG9yZXBhc3Mua2V5cGFzcy5hbmQubmV3Lm11c3Qubm90LmJlLnNwZWNpZmllZCIsCi0gICAgICAgICAgICAgICAgInNpIC1wcm90ZWN0ZWQgZXN0IHNwXHUwMEU5Y2lmaVx1MDBFOSwgLXN0b3JlcGFzcywgLWtleXBhc3MgZXQgLW5ldyBuZSBkb2l2ZW50IHBhcyBcdTAwRUF0cmUgaW5kaXF1XHUwMEU5cyJ9LAotICAgICAgICB7ImlmLnNyY3Byb3RlY3RlZC5pcy5zcGVjaWZpZWQudGhlbi5zcmNzdG9yZXBhc3MuYW5kLnNyY2tleXBhc3MubXVzdC5ub3QuYmUuc3BlY2lmaWVkIiwKLSAgICAgICAgICAgICAgICAiU2kgLXNyY3Byb3RlY3RlZCBlc3QgaW5kaXF1XHUwMEU5LCBsZXMgY29tbWFuZGVzIC1zcmNzdG9yZXBhc3MgZXQgLXNyY2tleXBhc3MgbmUgZG9pdmVudCBwYXMgXHUwMEVBdHJlIHNwXHUwMEU5Y2lmaVx1MDBFOWVzIn0sCi0gICAgICAgIHsiaWYua2V5c3RvcmUuaXMubm90LnBhc3N3b3JkLnByb3RlY3RlZC50aGVuLnN0b3JlcGFzcy5rZXlwYXNzLmFuZC5uZXcubXVzdC5ub3QuYmUuc3BlY2lmaWVkIiwKLSAgICAgICAgICAgICAgICAiU2kgbGUgZmljaGllciBkZSBjbFx1MDBFOXMgbidlc3QgcGFzIHByb3RcdTAwRTlnXHUwMEU5IHBhciB1biBtb3QgZGUgcGFzc2UsIGxlcyBjb21tYW5kZXMgLXN0b3JlcGFzcywgLWtleXBhc3MgZXQgLW5ldyBuZSBkb2l2ZW50IHBhcyBcdTAwRUF0cmUgc3BcdTAwRTljaWZpXHUwMEU5ZXMifSwKLSAgICAgICAgeyJpZi5zb3VyY2Uua2V5c3RvcmUuaXMubm90LnBhc3N3b3JkLnByb3RlY3RlZC50aGVuLnNyY3N0b3JlcGFzcy5hbmQuc3Jja2V5cGFzcy5tdXN0Lm5vdC5iZS5zcGVjaWZpZWQiLAotICAgICAgICAgICAgICAgICJTaSBsZSBmaWNoaWVyIGRlIGNsXHUwMEU5cyBzb3VyY2Ugbidlc3QgcGFzIHByb3RcdTAwRTlnXHUwMEU5IHBhciB1biBtb3QgZGUgcGFzc2UsIGxlcyBjb21tYW5kZXMgLXNyY3N0b3JlcGFzcyBldCAtc3Jja2V5cGFzcyBuZSBkb2l2ZW50IHBhcyBcdTAwRUF0cmUgc3BcdTAwRTljaWZpXHUwMEU5ZXMifSwKLSAgICAgICAgeyJJbGxlZ2FsLnN0YXJ0ZGF0ZS52YWx1ZSIsICJWYWxldXIgZGUgZGF0ZSBkZSBkXHUwMEU5YnV0IG5vbiBhZG1pc2UifSwKLSAgICAgICAgeyJWYWxpZGl0eS5tdXN0LmJlLmdyZWF0ZXIudGhhbi56ZXJvIiwKLSAgICAgICAgICAgICAgICAiTGEgdmFsaWRpdFx1MDBFOSBkb2l0IFx1MDBFQXRyZSBzdXBcdTAwRTlyaWV1cmUgXHUwMEUwIHpcdTAwRTlybyJ9LAotICAgICAgICB7InByb3ZOYW1lLm5vdC5hLnByb3ZpZGVyIiwgInswfSBuJydlc3QgcGFzIHVuIGZvdXJuaXNzZXVyIn0sCi0gICAgICAgIHsiVXNhZ2UuZXJyb3Iubm8uY29tbWFuZC5wcm92aWRlZCIsICJFcnJldXIgZGUgc3ludGF4ZVx1MDBBMDogYXVjdW5lIGNvbW1hbmRlIGZvdXJuaWUifSwKLSAgICAgICAgeyJTb3VyY2Uua2V5c3RvcmUuZmlsZS5leGlzdHMuYnV0LmlzLmVtcHR5LiIsICJMZSBmaWNoaWVyIGRlIGNsXHUwMEU5cyBzb3VyY2UgZXhpc3RlIG1haXMgaWwgZXN0IHZpZGUgOiAifSwKLSAgICAgICAgeyJQbGVhc2Uuc3BlY2lmeS5zcmNrZXlzdG9yZSIsICJJbmRpcXVleiAtc3Jja2V5c3RvcmUifSwKLSAgICAgICAgeyJNdXN0Lm5vdC5zcGVjaWZ5LmJvdGgudi5hbmQucmZjLndpdGgubGlzdC5jb21tYW5kIiwKLSAgICAgICAgICAgICAgICAiLXYgZXQgLXJmYyBuZSBkb2l2ZW50IHBhcyBcdTAwRUF0cmUgc3BcdTAwRTljaWZpXHUwMEU5cyBhdmVjIGxhIGNvbW1hbmRlICdsaXN0JyJ9LAotICAgICAgICB7IktleS5wYXNzd29yZC5tdXN0LmJlLmF0LmxlYXN0LjYuY2hhcmFjdGVycyIsCi0gICAgICAgICAgICAgICAgIlVuIG1vdCBkZSBwYXNzZSBkZSBjbFx1MDBFOSBkb2l0IGNvbXBvcnRlciBhdSBtb2lucyA2IGNhcmFjdFx1MDBFOHJlcyJ9LAotICAgICAgICB7Ik5ldy5wYXNzd29yZC5tdXN0LmJlLmF0LmxlYXN0LjYuY2hhcmFjdGVycyIsCi0gICAgICAgICAgICAgICAgIkxlIG5vdXZlYXUgbW90IGRlIHBhc3NlIGRvaXQgY29tcG9ydGVyIGF1IG1vaW5zIDYgY2FyYWN0XHUwMEU4cmVzIn0sCi0gICAgICAgIHsiS2V5c3RvcmUuZmlsZS5leGlzdHMuYnV0LmlzLmVtcHR5LiIsCi0gICAgICAgICAgICAgICAgIkZpY2hpZXIgZGUgY2xcdTAwRTlzIGV4aXN0YW50IG1haXMgdmlkZSA6ICJ9LAotICAgICAgICB7IktleXN0b3JlLmZpbGUuZG9lcy5ub3QuZXhpc3QuIiwKLSAgICAgICAgICAgICAgICAiTGUgZmljaGllciBkZSBjbFx1MDBFOXMgbidleGlzdGUgcGFzIDogIn0sCi0gICAgICAgIHsiTXVzdC5zcGVjaWZ5LmRlc3RpbmF0aW9uLmFsaWFzIiwgIkwnYWxpYXMgZGUgZGVzdGluYXRpb24gZG9pdCBcdTAwRUF0cmUgc3BcdTAwRTljaWZpXHUwMEU5In0sCi0gICAgICAgIHsiTXVzdC5zcGVjaWZ5LmFsaWFzIiwgIkwnYWxpYXMgZG9pdCBcdTAwRUF0cmUgc3BcdTAwRTljaWZpXHUwMEU5In0sCi0gICAgICAgIHsiS2V5c3RvcmUucGFzc3dvcmQubXVzdC5iZS5hdC5sZWFzdC42LmNoYXJhY3RlcnMiLAotICAgICAgICAgICAgICAgICJVbiBtb3QgZGUgcGFzc2UgZGUgZmljaGllciBkZSBjbFx1MDBFOXMgZG9pdCBjb21wb3J0ZXIgYXUgbW9pbnMgNiBjYXJhY3RcdTAwRThyZXMifSwKLSAgICAgICAgeyJFbnRlci5rZXlzdG9yZS5wYXNzd29yZC4iLCAiRW50cmV6IGxlIG1vdCBkZSBwYXNzZSBkdSBmaWNoaWVyIGRlIGNsXHUwMEU5cyA6ICAifSwKLSAgICAgICAgeyJFbnRlci5zb3VyY2Uua2V5c3RvcmUucGFzc3dvcmQuIiwgIkVudHJleiBsZSBtb3QgZGUgcGFzc2UgZHUgZmljaGllciBkZSBjbFx1MDBFOXMgc291cmNlXHUwMEEwOiAgIn0sCi0gICAgICAgIHsiRW50ZXIuZGVzdGluYXRpb24ua2V5c3RvcmUucGFzc3dvcmQuIiwgIkVudHJleiBsZSBtb3QgZGUgcGFzc2UgZHUgZmljaGllciBkZSBjbFx1MDBFOXMgZGUgZGVzdGluYXRpb25cdTAwQTA6ICAifSwKLSAgICAgICAgeyJLZXlzdG9yZS5wYXNzd29yZC5pcy50b28uc2hvcnQubXVzdC5iZS5hdC5sZWFzdC42LmNoYXJhY3RlcnMiLAotICAgICAgICAgIkxlIG1vdCBkZSBwYXNzZSBkdSBmaWNoaWVyIGRlIGNsXHUwMEU5cyBlc3QgdHJvcCBjb3VydCA6IGlsIGRvaXQgY29tcG9ydGVyIGF1IG1vaW5zIDYgY2FyYWN0XHUwMEU4cmVzIn0sCi0gICAgICAgIHsiVW5rbm93bi5FbnRyeS5UeXBlIiwgIlR5cGUgZCdlbnRyXHUwMEU5ZSBpbmNvbm51In0sCi0gICAgICAgIHsiVG9vLm1hbnkuZmFpbHVyZXMuQWxpYXMubm90LmNoYW5nZWQiLCAiVHJvcCBkJ2VycmV1cnMuIEFsaWFzIG5vbiBtb2RpZmlcdTAwRTkifSwKLSAgICAgICAgeyJFbnRyeS5mb3IuYWxpYXMuYWxpYXMuc3VjY2Vzc2Z1bGx5LmltcG9ydGVkLiIsCi0gICAgICAgICAgICAgICAgICJMJydlbnRyXHUwMEU5ZSBkZSBsJydhbGlhcyB7MH0gYSBcdTAwRTl0XHUwMEU5IGltcG9ydFx1MDBFOWUuIn0sCi0gICAgICAgIHsiRW50cnkuZm9yLmFsaWFzLmFsaWFzLm5vdC5pbXBvcnRlZC4iLCAiTCcnZW50clx1MDBFOWUgZGUgbCcnYWxpYXMgezB9IG4nJ2EgcGFzIFx1MDBFOXRcdTAwRTkgaW1wb3J0XHUwMEU5ZS4ifSwKLSAgICAgICAgeyJQcm9ibGVtLmltcG9ydGluZy5lbnRyeS5mb3IuYWxpYXMuYWxpYXMuZXhjZXB0aW9uLkVudHJ5LmZvci5hbGlhcy5hbGlhcy5ub3QuaW1wb3J0ZWQuIiwKLSAgICAgICAgICAgICAgICAgIlByb2JsXHUwMEU4bWUgbG9ycyBkZSBsJydpbXBvcnQgZGUgbCcnZW50clx1MDBFOWUgZGUgbCcnYWxpYXMgezB9XHUwMEEwOiB7MX0uXG5MJydlbnRyXHUwMEU5ZSBkZSBsJydhbGlhcyB7MH0gbicnYSBwYXMgXHUwMEU5dFx1MDBFOSBpbXBvcnRcdTAwRTllLiJ9LAotICAgICAgICB7IkltcG9ydC5jb21tYW5kLmNvbXBsZXRlZC5vay5lbnRyaWVzLnN1Y2Nlc3NmdWxseS5pbXBvcnRlZC5mYWlsLmVudHJpZXMuZmFpbGVkLm9yLmNhbmNlbGxlZCIsCi0gICAgICAgICAgICAgICAgICJDb21tYW5kZSBkJydpbXBvcnQgZXhcdTAwRTljdXRcdTAwRTllXHUwMEEwOiB7MH0gZW50clx1MDBFOWVzIGltcG9ydFx1MDBFOWVzLCBcdTAwRTljaGVjIG91IGFubnVsYXRpb24gZGUgezF9IGVudHJcdTAwRTllcyJ9LAotICAgICAgICB7Ildhcm5pbmcuT3ZlcndyaXRpbmcuZXhpc3RpbmcuYWxpYXMuYWxpYXMuaW4uZGVzdGluYXRpb24ua2V5c3RvcmUiLAotICAgICAgICAgICAgICAgICAiQXZlcnRpc3NlbWVudFx1MDBBMDogbCcnYWxpYXMgezB9IGV4aXN0YW50IHNlcmEgcmVtcGxhY1x1MDBFOSBkYW5zIGxlIGZpY2hpZXIgZGUgY2xcdTAwRTlzIGQnJ2FjY1x1MDBFOHMgZGUgZGVzdGluYXRpb24ifSwKLSAgICAgICAgeyJFeGlzdGluZy5lbnRyeS5hbGlhcy5hbGlhcy5leGlzdHMub3ZlcndyaXRlLm5vLiIsCi0gICAgICAgICAgICAgICAgICJMJydhbGlhcyBkJydlbnRyXHUwMEU5ZSB7MH0gZXhpc3RlIGRcdTAwRTlqXHUwMEUwLiBWb3VsZXotdm91cyBsZSByZW1wbGFjZXIgPyBbbm9uXVx1MDBBMDogICJ9LAotICAgICAgICB7IlRvby5tYW55LmZhaWx1cmVzLnRyeS5sYXRlciIsICJUcm9wIGQnZXJyZXVycy4gUlx1MDBFOWVzc2F5ZXogcGx1cyB0YXJkIn0sCi0gICAgICAgIHsiQ2VydGlmaWNhdGlvbi5yZXF1ZXN0LnN0b3JlZC5pbi5maWxlLmZpbGVuYW1lLiIsCi0gICAgICAgICAgICAgICAgIkRlbWFuZGUgZGUgY2VydGlmaWNhdGlvbiBzdG9ja1x1MDBFOWUgZGFucyBsZSBmaWNoaWVyIDx7MH0+In0sCi0gICAgICAgIHsiU3VibWl0LnRoaXMudG8ueW91ci5DQSIsICJTb3VtZXR0cmUgXHUwMEUwIHZvdHJlIENBIn0sCi0gICAgICAgIHsiaWYuYWxpYXMubm90LnNwZWNpZmllZC5kZXN0YWxpYXMuc3Jja2V5cGFzcy5hbmQuZGVzdGtleXBhc3MubXVzdC5ub3QuYmUuc3BlY2lmaWVkIiwKLSAgICAgICAgICAgICJzaSBsJ2FsaWFzIG4nZXN0IHBhcyBzcFx1MDBFOWNpZmlcdTAwRTksIGRlc3RhbGlhcywgc3Jja2V5cGFzcyBldCBkZXN0a2V5cGFzcyBuZSBkb2l2ZW50IHBhcyBcdTAwRUF0cmUgc3BcdTAwRTljaWZpXHUwMEU5cyJ9LAotICAgICAgICB7IkNlcnRpZmljYXRlLnN0b3JlZC5pbi5maWxlLmZpbGVuYW1lLiIsCi0gICAgICAgICAgICAgICAgIkNlcnRpZmljYXQgc3RvY2tcdTAwRTkgZGFucyBsZSBmaWNoaWVyIDx7MH0+In0sCi0gICAgICAgIHsiQ2VydGlmaWNhdGUucmVwbHkud2FzLmluc3RhbGxlZC5pbi5rZXlzdG9yZSIsCi0gICAgICAgICAgICAgICAgIlJcdTAwRTlwb25zZSBkZSBjZXJ0aWZpY2F0IGluc3RhbGxcdTAwRTllIGRhbnMgbGUgZmljaGllciBkZSBjbFx1MDBFOXMifSwKLSAgICAgICAgeyJDZXJ0aWZpY2F0ZS5yZXBseS53YXMubm90Lmluc3RhbGxlZC5pbi5rZXlzdG9yZSIsCi0gICAgICAgICAgICAgICAgIlJcdTAwRTlwb25zZSBkZSBjZXJ0aWZpY2F0IG5vbiBpbnN0YWxsXHUwMEU5ZSBkYW5zIGxlIGZpY2hpZXIgZGUgY2xcdTAwRTlzIn0sCi0gICAgICAgIHsiQ2VydGlmaWNhdGUud2FzLmFkZGVkLnRvLmtleXN0b3JlIiwKLSAgICAgICAgICAgICAgICAiQ2VydGlmaWNhdCBham91dFx1MDBFOSBhdSBmaWNoaWVyIGRlIGNsXHUwMEU5cyJ9LAotICAgICAgICB7IkNlcnRpZmljYXRlLndhcy5ub3QuYWRkZWQudG8ua2V5c3RvcmUiLAotICAgICAgICAgICAgICAgICJDZXJ0aWZpY2F0IG5vbiBham91dFx1MDBFOSBhdSBmaWNoaWVyIGRlIGNsXHUwMEU5cyJ9LAotICAgICAgICB7Ii5TdG9yaW5nLmtzZm5hbWUuIiwgIltTdG9ja2FnZSBkZSB7MH1dIn0sCi0gICAgICAgIHsiYWxpYXMuaGFzLm5vLnB1YmxpYy5rZXkuY2VydGlmaWNhdGUuIiwKLSAgICAgICAgICAgICAgICAiezB9IG5lIHBvc3NcdTAwRThkZSBwYXMgZGUgY2xcdTAwRTkgcHVibGlxdWUgKGNlcnRpZmljYXQpIn0sCi0gICAgICAgIHsiQ2Fubm90LmRlcml2ZS5zaWduYXR1cmUuYWxnb3JpdGhtIiwKLSAgICAgICAgICAgICAgICAiSW1wb3NzaWJsZSBkZSBkXHUwMEU5ZHVpcmUgbCdhbGdvcml0aG1lIGRlIHNpZ25hdHVyZSJ9LAotICAgICAgICB7IkFsaWFzLmFsaWFzLmRvZXMubm90LmV4aXN0IiwKLSAgICAgICAgICAgICAgICAiTCcnYWxpYXMgPHswfT4gbicnZXhpc3RlIHBhcyJ9LAotICAgICAgICB7IkFsaWFzLmFsaWFzLmhhcy5uby5jZXJ0aWZpY2F0ZSIsCi0gICAgICAgICAgICAgICAgIkwnJ2FsaWFzIDx7MH0+IG5lIHBvc3NcdTAwRThkZSBwYXMgZGUgY2VydGlmaWNhdCJ9LAotICAgICAgICB7IktleS5wYWlyLm5vdC5nZW5lcmF0ZWQuYWxpYXMuYWxpYXMuYWxyZWFkeS5leGlzdHMiLAotICAgICAgICAgICAgICAgICJQYWlyZSBkZSBjbFx1MDBFOXMgbm9uIGdcdTAwRTluXHUwMEU5clx1MDBFOWUsIGwnJ2FsaWFzIDx7MH0+IGV4aXN0ZSBkXHUwMEU5alx1MDBFMCJ9LAotICAgICAgICB7IkdlbmVyYXRpbmcua2V5c2l6ZS5iaXQua2V5QWxnTmFtZS5rZXkucGFpci5hbmQuc2VsZi5zaWduZWQuY2VydGlmaWNhdGUuc2lnQWxnTmFtZS53aXRoLmEudmFsaWRpdHkub2YudmFsaWRhbGl0eS5kYXlzLmZvciIsCi0gICAgICAgICAgICAgICAgIkdcdTAwRTluXHUwMEU5cmF0aW9uIGQnJ3VuZSBwYWlyZSBkZSBjbFx1MDBFOXMgezF9IGRlIHswfSBiaXRzIGV0IGQnJ3VuIGNlcnRpZmljYXQgYXV0by1zaWduXHUwMEU5ICh7Mn0pIGQnJ3VuZSB2YWxpZGl0XHUwMEU5IGRlIHszfSBqb3Vyc1xuXHRwb3VyIDogezR9In0sCi0gICAgICAgIHsiRW50ZXIua2V5LnBhc3N3b3JkLmZvci5hbGlhcy4iLCAiRW50cmV6IGxlIG1vdCBkZSBwYXNzZSBkZSBsYSBjbFx1MDBFOSBwb3VyIDx7MH0+In0sCi0gICAgICAgIHsiLlJFVFVSTi5pZi5zYW1lLmFzLmtleXN0b3JlLnBhc3N3b3JkLiIsCi0gICAgICAgICAgICAgICAgIlx0KGFwcHV5ZXogc3VyIEVudHJcdTAwRTllIHMnaWwgcydhZ2l0IGR1IG1vdCBkZSBwYXNzZSBkdSBmaWNoaWVyIGRlIGNsXHUwMEU5cykgOiAgIn0sCi0gICAgICAgIHsiS2V5LnBhc3N3b3JkLmlzLnRvby5zaG9ydC5tdXN0LmJlLmF0LmxlYXN0LjYuY2hhcmFjdGVycyIsCi0gICAgICAgICAgICAgICAgIkxlIG1vdCBkZSBwYXNzZSBkZSBsYSBjbFx1MDBFOSBlc3QgdHJvcCBjb3VydCA6IGlsIGRvaXQgY29tcG9ydGVyIGF1IG1vaW5zIDYgY2FyYWN0XHUwMEU4cmVzIn0sCi0gICAgICAgIHsiVG9vLm1hbnkuZmFpbHVyZXMua2V5Lm5vdC5hZGRlZC50by5rZXlzdG9yZSIsCi0gICAgICAgICAgICAgICAgIlRyb3AgZCdlcnJldXJzLiBDbFx1MDBFOSBub24gYWpvdXRcdTAwRTllIGF1IGZpY2hpZXIgZGUgY2xcdTAwRTlzIn0sCi0gICAgICAgIHsiRGVzdGluYXRpb24uYWxpYXMuZGVzdC5hbHJlYWR5LmV4aXN0cyIsCi0gICAgICAgICAgICAgICAgIkwnJ2FsaWFzIGRlIGxhIGRlc3RpbmF0aW9uIDx7MH0+IGV4aXN0ZSBkXHUwMEU5alx1MDBFMCJ9LAotICAgICAgICB7IlBhc3N3b3JkLmlzLnRvby5zaG9ydC5tdXN0LmJlLmF0LmxlYXN0LjYuY2hhcmFjdGVycyIsCi0gICAgICAgICAgICAgICAgIkxlIG1vdCBkZSBwYXNzZSBlc3QgdHJvcCBjb3VydCA6IGlsIGRvaXQgY29tcG9ydGVyIGF1IG1vaW5zIDYgY2FyYWN0XHUwMEU4cmVzIn0sCi0gICAgICAgIHsiVG9vLm1hbnkuZmFpbHVyZXMuS2V5LmVudHJ5Lm5vdC5jbG9uZWQiLAotICAgICAgICAgICAgICAgICJUcm9wIGQnZXJyZXVycy4gRW50clx1MDBFOWUgZGUgY2xcdTAwRTkgbm9uIGNsb25cdTAwRTllIn0sCi0gICAgICAgIHsia2V5LnBhc3N3b3JkLmZvci5hbGlhcy4iLCAibW90IGRlIHBhc3NlIGRlIGNsXHUwMEU5IHBvdXIgPHswfT4ifSwKLSAgICAgICAgeyJLZXlzdG9yZS5lbnRyeS5mb3IuaWQuZ2V0TmFtZS5hbHJlYWR5LmV4aXN0cyIsCi0gICAgICAgICAgICAgICAgIkwnJ2VudHJcdTAwRTllIGRlIGZpY2hpZXIgZGUgY2xcdTAwRTlzIGQnJ2FjY1x1MDBFOHMgcG91ciA8ezB9PiBleGlzdGUgZFx1MDBFOWpcdTAwRTAifSwKLSAgICAgICAgeyJDcmVhdGluZy5rZXlzdG9yZS5lbnRyeS5mb3IuaWQuZ2V0TmFtZS4iLAotICAgICAgICAgICAgICAgICJDclx1MDBFOWF0aW9uIGQnJ3VuZSBlbnRyXHUwMEU5ZSBkZSBmaWNoaWVyIGRlIGNsXHUwMEU5cyBkJydhY2NcdTAwRThzIHBvdXIgPHswfT4uLi4ifSwKLSAgICAgICAgeyJOby5lbnRyaWVzLmZyb20uaWRlbnRpdHkuZGF0YWJhc2UuYWRkZWQiLAotICAgICAgICAgICAgICAgICJBdWN1bmUgZW50clx1MDBFOWUgYWpvdXRcdTAwRTllIFx1MDBFMCBwYXJ0aXIgZGUgbGEgYmFzZSBkZSBkb25uXHUwMEU5ZXMgZCdpZGVudGl0XHUwMEU5cyJ9LAotICAgICAgICB7IkFsaWFzLm5hbWUuYWxpYXMiLCAiTm9tIGQnJ2FsaWFzIDogezB9In0sCi0gICAgICAgIHsiQ3JlYXRpb24uZGF0ZS5rZXlTdG9yZS5nZXRDcmVhdGlvbkRhdGUuYWxpYXMuIiwKLSAgICAgICAgICAgICAgICAiRGF0ZSBkZSBjclx1MDBFOWF0aW9uIDogezAsZGF0ZX0ifSwKLSAgICAgICAgeyJhbGlhcy5rZXlTdG9yZS5nZXRDcmVhdGlvbkRhdGUuYWxpYXMuIiwKLSAgICAgICAgICAgICAgICAiezB9LCB7MSxkYXRlfSwgIn0sCi0gICAgICAgIHsiYWxpYXMuIiwgInswfSwgIn0sCi0gICAgICAgIHsiRW50cnkudHlwZS50eXBlLiIsICJUeXBlIGQnJ2VudHJcdTAwRTllXHUwMEEwOiB7MH0ifSwKLSAgICAgICAgeyJDZXJ0aWZpY2F0ZS5jaGFpbi5sZW5ndGguIiwgIkxvbmd1ZXVyIGRlIGNoYVx1MDBFRW5lIGR1IGNlcnRpZmljYXQgOiAifSwKLSAgICAgICAgeyJDZXJ0aWZpY2F0ZS5pLjEuIiwgIkNlcnRpZmljYXRbezAsbnVtYmVyLGludGVnZXJ9XToifSwKLSAgICAgICAgeyJDZXJ0aWZpY2F0ZS5maW5nZXJwcmludC5TSEExLiIsICJFbXByZWludGUgZHUgY2VydGlmaWNhdCAoU0hBMSkgOiAifSwKLSAgICAgICAgeyJLZXlzdG9yZS50eXBlLiIsICJUeXBlIGRlIGZpY2hpZXIgZGUgY2xcdTAwRTlzIDogIn0sCi0gICAgICAgIHsiS2V5c3RvcmUucHJvdmlkZXIuIiwgIkZvdXJuaXNzZXVyIGRlIGZpY2hpZXIgZGUgY2xcdTAwRTlzIDogIn0sCi0gICAgICAgIHsiWW91ci5rZXlzdG9yZS5jb250YWlucy5rZXlTdG9yZS5zaXplLmVudHJ5IiwKLSAgICAgICAgICAgICAgICAiVm90cmUgZmljaGllciBkZSBjbFx1MDBFOXMgZCcnYWNjXHUwMEU4cyBjb250aWVudCB7MCxudW1iZXIsaW50ZWdlcn0gZW50clx1MDBFOWUifSwKLSAgICAgICAgeyJZb3VyLmtleXN0b3JlLmNvbnRhaW5zLmtleVN0b3JlLnNpemUuZW50cmllcyIsCi0gICAgICAgICAgICAgICAgIlZvdHJlIGZpY2hpZXIgZGUgY2xcdTAwRTlzIGQnJ2FjY1x1MDBFOHMgY29udGllbnQgezAsbnVtYmVyLGludGVnZXJ9IGVudHJcdTAwRTllcyJ9LAotICAgICAgICB7IkZhaWxlZC50by5wYXJzZS5pbnB1dCIsICJMJ2FuYWx5c2UgZGUgbCdlbnRyXHUwMEU5ZSBhIFx1MDBFOWNob3VcdTAwRTkifSwKLSAgICAgICAgeyJFbXB0eS5pbnB1dCIsICJFbnRyXHUwMEU5ZSB2aWRlIn0sCi0gICAgICAgIHsiTm90LlguNTA5LmNlcnRpZmljYXRlIiwgIlBhcyB1biBjZXJ0aWZpY2F0IFguNTA5In0sCi0gICAgICAgIHsiYWxpYXMuaGFzLm5vLnB1YmxpYy5rZXkiLCAiezB9IG5lIHBvc3NcdTAwRThkZSBwYXMgZGUgY2xcdTAwRTkgcHVibGlxdWUifSwKLSAgICAgICAgeyJhbGlhcy5oYXMubm8uWC41MDkuY2VydGlmaWNhdGUiLCAiezB9IG5lIHBvc3NcdTAwRThkZSBwYXMgZGUgY2VydGlmaWNhdCBYLjUwOSJ9LAotICAgICAgICB7Ik5ldy5jZXJ0aWZpY2F0ZS5zZWxmLnNpZ25lZC4iLCAiTm91dmVhdSBjZXJ0aWZpY2F0IChhdXRvLXNpZ25cdTAwRTkpIDoifSwKLSAgICAgICAgeyJSZXBseS5oYXMubm8uY2VydGlmaWNhdGVzIiwgIkxhIHJcdTAwRTlwb25zZSBuJ2EgcGFzIGRlIGNlcnRpZmljYXQifSwKLSAgICAgICAgeyJDZXJ0aWZpY2F0ZS5ub3QuaW1wb3J0ZWQuYWxpYXMuYWxpYXMuYWxyZWFkeS5leGlzdHMiLAotICAgICAgICAgICAgICAgICJDZXJ0aWZpY2F0IG5vbiBpbXBvcnRcdTAwRTksIGwnJ2FsaWFzIDx7MH0+IGV4aXN0ZSBkXHUwMEU5alx1MDBFMCJ9LAotICAgICAgICB7IklucHV0Lm5vdC5hbi5YLjUwOS5jZXJ0aWZpY2F0ZSIsICJMJ2VudHJcdTAwRTllIG4nZXN0IHBhcyB1biBjZXJ0aWZpY2F0IFguNTA5In0sCi0gICAgICAgIHsiQ2VydGlmaWNhdGUuYWxyZWFkeS5leGlzdHMuaW4ua2V5c3RvcmUudW5kZXIuYWxpYXMudHJ1c3RhbGlhcy4iLAotICAgICAgICAgICAgICAgICJMZSBjZXJ0aWZpY2F0IGV4aXN0ZSBkXHUwMEU5alx1MDBFMCBkYW5zIGxlIGZpY2hpZXIgZGUgY2xcdTAwRTlzIGQnJ2FjY1x1MDBFOHMgc291cyBsJydhbGlhcyA8ezB9PiJ9LAotICAgICAgICB7IkRvLnlvdS5zdGlsbC53YW50LnRvLmFkZC5pdC5uby4iLAotICAgICAgICAgICAgICAgICJWb3VsZXotdm91cyB0b3Vqb3VycyBsJ2Fqb3V0ZXIgPyBbbm9uXSA6ICAifSwKLSAgICAgICAgeyJDZXJ0aWZpY2F0ZS5hbHJlYWR5LmV4aXN0cy5pbi5zeXN0ZW0ud2lkZS5DQS5rZXlzdG9yZS51bmRlci5hbGlhcy50cnVzdGFsaWFzLiIsCi0gICAgICAgICAgICAgICAgIkxlIGNlcnRpZmljYXQgZXhpc3RlIGRcdTAwRTlqXHUwMEUwIGRhbnMgbGUgZmljaGllciBkZSBjbFx1MDBFOXMgZCcnYWNjXHUwMEU4cyBDQSBzeXN0XHUwMEU4bWUgc291cyBsJydhbGlhcyA8ezB9PiJ9LAotICAgICAgICB7IkRvLnlvdS5zdGlsbC53YW50LnRvLmFkZC5pdC50by55b3VyLm93bi5rZXlzdG9yZS5uby4iLAotICAgICAgICAgICAgICAgICJWb3VsZXotdm91cyB0b3Vqb3VycyBsJ2Fqb3V0ZXIgXHUwMEUwIHZvdHJlIGZpY2hpZXIgZGUgY2xcdTAwRTlzID8gW25vbl0gOiAgIn0sCi0gICAgICAgIHsiVHJ1c3QudGhpcy5jZXJ0aWZpY2F0ZS5uby4iLCAiRmFpcmUgY29uZmlhbmNlIFx1MDBFMCBjZSBjZXJ0aWZpY2F0ID8gW25vbl0gOiAgIn0sCi0gICAgICAgIHsiWUVTIiwgIk91aSJ9LAotICAgICAgICB7Ik5ldy5wcm9tcHQuIiwgIk5vdXZlYXUgezB9IDogIn0sCi0gICAgICAgIHsiUGFzc3dvcmRzLm11c3QuZGlmZmVyIiwgIkxlcyBtb3RzIGRlIHBhc3NlIGRvaXZlbnQgZGlmZlx1MDBFOXJlciJ9LAotICAgICAgICB7IlJlLmVudGVyLm5ldy5wcm9tcHQuIiwgIkluZGlxdWV6IGVuY29yZSBsZSBub3V2ZWF1IHswfSA6ICJ9LAotICAgICAgICB7IlJlLmVudGVyLm5ldy5wYXNzd29yZC4iLCAiUmVzc2Fpc2lzc2V6IGxlIG5vdXZlYXUgbW90IGRlIHBhc3NlIDogIn0sCi0gICAgICAgIHsiVGhleS5kb24udC5tYXRjaC5UcnkuYWdhaW4iLCAiSWxzIHNvbnQgZGlmZlx1MDBFOXJlbnRzLiBSXHUwMEU5ZXNzYXllei4ifSwKLSAgICAgICAgeyJFbnRlci5wcm9tcHQuYWxpYXMubmFtZS4iLCAiSW5kaXF1ZXogbGUgbm9tIGQnJ2FsaWFzIHswfSA6ICAifSwKLSAgICAgICAgeyJFbnRlci5uZXcuYWxpYXMubmFtZS5SRVRVUk4udG8uY2FuY2VsLmltcG9ydC5mb3IudGhpcy5lbnRyeS4iLAotICAgICAgICAgICAgICAgICAiU2Fpc2lzc2V6IGxlIG5vbSBkdSBub3V2ZWwgYWxpYXNcdChvdSBhcHB1eWV6IHN1ciBFbnRyXHUwMEU5ZSBwb3VyIGFubnVsZXIgbCdpbXBvcnQgZGUgY2V0dGUgZW50clx1MDBFOWUpXHUwMEEwOiAgIn0sCi0gICAgICAgIHsiRW50ZXIuYWxpYXMubmFtZS4iLCAiSW5kaXF1ZXogbGUgbm9tIGQnYWxpYXMgOiAgIn0sCi0gICAgICAgIHsiLlJFVFVSTi5pZi5zYW1lLmFzLmZvci5vdGhlckFsaWFzLiIsCi0gICAgICAgICAgICAgICAgIlx0KGFwcHV5ZXogc3VyIEVudHJcdTAwRTllIHNpIGxlIHJcdTAwRTlzdWx0YXQgZXN0IGlkZW50aXF1ZSBcdTAwRTAgPHswfT4pIn0sCi0gICAgICAgIHsiLlBBVFRFUk4ucHJpbnRYNTA5Q2VydCIsCi0gICAgICAgICAgICAgICAgIlByb3ByaVx1MDBFOXRhaXJlIDogezB9XG5FbWV0dGV1ciA6IHsxfVxuTnVtXHUwMEU5cm8gZGUgc1x1MDBFOXJpZSA6IHsyfVxuVmFsaWRlIGR1IDogezN9IGF1IDogezR9XG5FbXByZWludGVzIGR1IGNlcnRpZmljYXQgOlxuXHQgTUQ1OiAgezV9XG5cdCBTSEExIDogezZ9XG5cdCBTSEEyNTYgOiB7N31cblx0IE5vbSBkZSBsJydhbGdvcml0aG1lIGRlIHNpZ25hdHVyZSA6IHs4fVxuXHQgVmVyc2lvbiA6IHs5fSJ9LAotICAgICAgICB7IldoYXQuaXMueW91ci5maXJzdC5hbmQubGFzdC5uYW1lLiIsCi0gICAgICAgICAgICAgICAgIlF1ZWxzIHNvbnQgdm9zIG5vbSBldCBwclx1MDBFOW5vbSA/In0sCi0gICAgICAgIHsiV2hhdC5pcy50aGUubmFtZS5vZi55b3VyLm9yZ2FuaXphdGlvbmFsLnVuaXQuIiwKLSAgICAgICAgICAgICAgICAiUXVlbCBlc3QgbGUgbm9tIGRlIHZvdHJlIHVuaXRcdTAwRTkgb3JnYW5pc2F0aW9ubmVsbGUgPyJ9LAotICAgICAgICB7IldoYXQuaXMudGhlLm5hbWUub2YueW91ci5vcmdhbml6YXRpb24uIiwKLSAgICAgICAgICAgICAgICAiUXVlbCBlc3QgbGUgbm9tIGRlIHZvdHJlIGVudHJlcHJpc2UgPyJ9LAotICAgICAgICB7IldoYXQuaXMudGhlLm5hbWUub2YueW91ci5DaXR5Lm9yLkxvY2FsaXR5LiIsCi0gICAgICAgICAgICAgICAgIlF1ZWwgZXN0IGxlIG5vbSBkZSB2b3RyZSB2aWxsZSBkZSByXHUwMEU5c2lkZW5jZSA/In0sCi0gICAgICAgIHsiV2hhdC5pcy50aGUubmFtZS5vZi55b3VyLlN0YXRlLm9yLlByb3ZpbmNlLiIsCi0gICAgICAgICAgICAgICAgIlF1ZWwgZXN0IGxlIG5vbSBkZSB2b3RyZSBcdTAwRTl0YXQgb3UgcHJvdmluY2UgPyJ9LAotICAgICAgICB7IldoYXQuaXMudGhlLnR3by5sZXR0ZXIuY291bnRyeS5jb2RlLmZvci50aGlzLnVuaXQuIiwKLSAgICAgICAgICAgICAgICAiUXVlbCBlc3QgbGUgY29kZSBwYXlzIFx1MDBFMCBkZXV4IGxldHRyZXMgcG91ciBjZXR0ZSB1bml0XHUwMEU5ID8ifSwKLSAgICAgICAgeyJJcy5uYW1lLmNvcnJlY3QuIiwgIkVzdC1jZSB7MH0gPyJ9LAotICAgICAgICB7Im5vIiwgIm5vbiJ9LAotICAgICAgICB7InllcyIsICJvdWkifSwKLSAgICAgICAgeyJ5IiwgIm8ifSwKLSAgICAgICAgeyIuZGVmYXVsdFZhbHVlLiIsICIgIFt7MH1dOiAgIn0sCi0gICAgICAgIHsiQWxpYXMuYWxpYXMuaGFzLm5vLmtleSIsCi0gICAgICAgICAgICAgICAgIkwnJ2FsaWFzIDx7MH0+IG4nJ2VzdCBhc3NvY2lcdTAwRTkgXHUwMEUwIGF1Y3VuZSBjbFx1MDBFOSJ9LAotICAgICAgICB7IkFsaWFzLmFsaWFzLnJlZmVyZW5jZXMuYW4uZW50cnkudHlwZS50aGF0LmlzLm5vdC5hLnByaXZhdGUua2V5LmVudHJ5LlRoZS5rZXljbG9uZS5jb21tYW5kLm9ubHkuc3VwcG9ydHMuY2xvbmluZy5vZi5wcml2YXRlLmtleSIsCi0gICAgICAgICAgICAgICAgICJMJydlbnRyXHUwMEU5ZSBcdTAwRTAgbGFxdWVsbGUgbCcnYWxpYXMgPHswfT4gZmFpdCByXHUwMEU5Zlx1MDBFOXJlbmNlIG4nJ2VzdCBwYXMgdW5lIGVudHJcdTAwRTllIGRlIHR5cGUgY2xcdTAwRTkgcHJpdlx1MDBFOWUuIExhIGNvbW1hbmRlIC1rZXljbG9uZSBwcmVuZCB1bmlxdWVtZW50IGVuIGNoYXJnZSBsZSBjbG9uYWdlIGRlcyBjbFx1MDBFOXMgcHJpdlx1MDBFOWVzIn0sCi0KLSAgICAgICAgeyIuV0FSTklORy5XQVJOSU5HLldBUk5JTkcuIiwKLSAgICAgICAgICAgICIqKioqKioqKioqKioqKioqKiAgQXZlcnRpc3NlbWVudCBBdmVydGlzc2VtZW50IEF2ZXJ0aXNzZW1lbnQgICoqKioqKioqKioqKioqKioqIn0sCi0gICAgICAgIHsiU2lnbmVyLmQuIiwgIlNpZ25hdGFpcmUgblx1MDBCMCVkIDoifSwKLSAgICAgICAgeyJUaW1lc3RhbXAuIiwgIkhvcm9kYXRhZ2UgOiJ9LAotICAgICAgICB7IlNpZ25hdHVyZS4iLCAiU2lnbmF0dXJlIDoifSwKLSAgICAgICAgeyJDUkxzLiIsICJMaXN0ZXMgZGVzIGNlcnRpZmljYXRzIHJcdTAwRTl2b3F1XHUwMEU5cyAoQ1JMKSA6In0sCi0gICAgICAgIHsiQ2VydGlmaWNhdGUub3duZXIuIiwgIlByb3ByaVx1MDBFOXRhaXJlIGR1IGNlcnRpZmljYXQgOiAifSwKLSAgICAgICAgeyJOb3QuYS5zaWduZWQuamFyLmZpbGUiLCAiRmljaGllciBKQVIgbm9uIHNpZ25cdTAwRTkifSwKLSAgICAgICAgeyJOby5jZXJ0aWZpY2F0ZS5mcm9tLnRoZS5TU0wuc2VydmVyIiwKLSAgICAgICAgICAgICAgICAiQXVjdW4gY2VydGlmaWNhdCBkdSBzZXJ2ZXVyIFNTTCJ9LAotCi0gICAgICAgIHsiLlRoZS5pbnRlZ3JpdHkub2YudGhlLmluZm9ybWF0aW9uLnN0b3JlZC5pbi55b3VyLmtleXN0b3JlLiIsCi0gICAgICAgICAgICAiKiBMJ2ludFx1MDBFOWdyaXRcdTAwRTkgZGVzIGluZm9ybWF0aW9ucyBzdG9ja1x1MDBFOWVzIGRhbnMgdm90cmUgZmljaGllciBkZSBjbFx1MDBFOXMgICpcbiogbidhIFBBUyBcdTAwRTl0XHUwMEU5IHZcdTAwRTlyaWZpXHUwMEU5ZS4gUG91ciBjZWxhLCAqXG4qIHZvdXMgZGV2ZXogZm91cm5pciBsZSBtb3QgZGUgcGFzc2UgZGUgdm90cmUgZmljaGllciBkZSBjbFx1MDBFOXMuICAgICAgICAgICAgICAgICAgKiJ9LAotICAgICAgICB7Ii5UaGUuaW50ZWdyaXR5Lm9mLnRoZS5pbmZvcm1hdGlvbi5zdG9yZWQuaW4udGhlLnNyY2tleXN0b3JlLiIsCi0gICAgICAgICAgICAiKiBMJ2ludFx1MDBFOWdyaXRcdTAwRTkgZGVzIGluZm9ybWF0aW9ucyBzdG9ja1x1MDBFOWVzIGRhbnMgbGUgZmljaGllciBkZSBjbFx1MDBFOXMgc291cmNlICAqXG4qIG4nYSBQQVMgXHUwMEU5dFx1MDBFOSB2XHUwMEU5cmlmaVx1MDBFOWUuIFBvdXIgY2VsYSwgKlxuKiB2b3VzIGRldmV6IGZvdXJuaXIgbGUgbW90IGRlIHBhc3NlIGRlIHZvdHJlIGZpY2hpZXIgZGUgY2xcdTAwRTlzIHNvdXJjZS4gICAgICAgICAgICAgICAgICAqIn0sCi0KLSAgICAgICAgeyJDZXJ0aWZpY2F0ZS5yZXBseS5kb2VzLm5vdC5jb250YWluLnB1YmxpYy5rZXkuZm9yLmFsaWFzLiIsCi0gICAgICAgICAgICAgICAgIkxhIHJcdTAwRTlwb25zZSBhdSBjZXJ0aWZpY2F0IG5lIGNvbnRpZW50IHBhcyBkZSBjbFx1MDBFOSBwdWJsaXF1ZSBwb3VyIDx7MH0+In0sCi0gICAgICAgIHsiSW5jb21wbGV0ZS5jZXJ0aWZpY2F0ZS5jaGFpbi5pbi5yZXBseSIsCi0gICAgICAgICAgICAgICAgIkNoYVx1MDBFRW5lIGRlIGNlcnRpZmljYXQgaW5jb21wbFx1MDBFOHRlIGRhbnMgbGEgclx1MDBFOXBvbnNlIn0sCi0gICAgICAgIHsiQ2VydGlmaWNhdGUuY2hhaW4uaW4ucmVwbHkuZG9lcy5ub3QudmVyaWZ5LiIsCi0gICAgICAgICAgICAgICAgIkxhIGNoYVx1MDBFRW5lIGRlIGNlcnRpZmljYXQgZGUgbGEgclx1MDBFOXBvbnNlIG5lIGNvbmNvcmRlIHBhcyA6ICJ9LAotICAgICAgICB7IlRvcC5sZXZlbC5jZXJ0aWZpY2F0ZS5pbi5yZXBseS4iLAotICAgICAgICAgICAgICAgICJDZXJ0aWZpY2F0IGRlIG5pdmVhdSBzdXBcdTAwRTlyaWV1ciBkYW5zIGxhIHJcdTAwRTlwb25zZSA6XG4ifSwKLSAgICAgICAgeyIuaXMubm90LnRydXN0ZWQuIiwgIi4uLiBub24gc1x1MDBFOWN1cmlzXHUwMEU5LiAifSwKLSAgICAgICAgeyJJbnN0YWxsLnJlcGx5LmFueXdheS5uby4iLCAiSW5zdGFsbGVyIGxhIHJcdTAwRTlwb25zZSBxdWFuZCBtXHUwMEVBbWUgPyBbbm9uXSA6ICAifSwKLSAgICAgICAgeyJOTyIsICJOb24ifSwKLSAgICAgICAgeyJQdWJsaWMua2V5cy5pbi5yZXBseS5hbmQua2V5c3RvcmUuZG9uLnQubWF0Y2giLAotICAgICAgICAgICAgICAgICJMZXMgY2xcdTAwRTlzIHB1YmxpcXVlcyBkZSBsYSByXHUwMEU5cG9uc2UgZXQgZHUgZmljaGllciBkZSBjbFx1MDBFOXMgbmUgY29uY29yZGVudCBwYXMifSwKLSAgICAgICAgeyJDZXJ0aWZpY2F0ZS5yZXBseS5hbmQuY2VydGlmaWNhdGUuaW4ua2V5c3RvcmUuYXJlLmlkZW50aWNhbCIsCi0gICAgICAgICAgICAgICAgIkxhIHJcdTAwRTlwb25zZSBhdSBjZXJ0aWZpY2F0IGV0IGxlIGNlcnRpZmljYXQgZHUgZmljaGllciBkZSBjbFx1MDBFOXMgc29udCBpZGVudGlxdWVzIn0sCi0gICAgICAgIHsiRmFpbGVkLnRvLmVzdGFibGlzaC5jaGFpbi5mcm9tLnJlcGx5IiwKLSAgICAgICAgICAgICAgICAiSW1wb3NzaWJsZSBkZSBjclx1MDBFOWVyIHVuZSBjaGFcdTAwRUVuZSBcdTAwRTAgcGFydGlyIGRlIGxhIHJcdTAwRTlwb25zZSJ9LAotICAgICAgICB7Im4iLCAibiJ9LAotICAgICAgICB7Ildyb25nLmFuc3dlci50cnkuYWdhaW4iLCAiUlx1MDBFOXBvbnNlIGluY29ycmVjdGUsIHJlY29tbWVuY2V6In0sCi0gICAgICAgIHsiU2VjcmV0LmtleS5ub3QuZ2VuZXJhdGVkLmFsaWFzLmFsaWFzLmFscmVhZHkuZXhpc3RzIiwKLSAgICAgICAgICAgICAgICAiQ2xcdTAwRTkgc2Vjclx1MDBFOHRlIG5vbiBnXHUwMEU5blx1MDBFOXJcdTAwRTllLCBsJydhbGlhcyA8ezB9PiBleGlzdGUgZFx1MDBFOWpcdTAwRTAifSwKLSAgICAgICAgeyJQbGVhc2UucHJvdmlkZS5rZXlzaXplLmZvci5zZWNyZXQua2V5LmdlbmVyYXRpb24iLAotICAgICAgICAgICAgICAgICJJbmRpcXVleiAta2V5c2l6ZSBwb3VyIGxhIGdcdTAwRTluXHUwMEU5cmF0aW9uIGRlIGxhIGNsXHUwMEU5IHNlY3JcdTAwRTh0ZSJ9LAotCi0gICAgICAgIHsiRXh0ZW5zaW9ucy4iLCAiRXh0ZW5zaW9uc1x1MDBBMDogIn0sCi0gICAgICAgIHsiLkVtcHR5LnZhbHVlLiIsICIoVmFsZXVyIHZpZGUpIn0sCi0gICAgICAgIHsiRXh0ZW5zaW9uLlJlcXVlc3QuIiwgIkRlbWFuZGUgZCdleHRlbnNpb24gOiJ9LAotICAgICAgICB7IlBLQ1MuMTAuQ2VydGlmaWNhdGUuUmVxdWVzdC5WZXJzaW9uLjEuMC5TdWJqZWN0LnMuUHVibGljLktleS5zLmZvcm1hdC5zLmtleS4iLAotICAgICAgICAgICAgICAgICJEZW1hbmRlIGRlIGNlcnRpZmljYXQgUEtDUyAjMTAgKHZlcnNpb24gMS4wKVxuU3VqZXQgOiAlc1xuQ2xcdTAwRTkgcHVibGlxdWUgOiBmb3JtYXQgJXMgcG91ciBsYSBjbFx1MDBFOSAlc1xuIn0sCi0gICAgICAgIHsiVW5rbm93bi5rZXlVc2FnZS50eXBlLiIsICJUeXBlIGtleVVzYWdlIGluY29ubnUgOiAifSwKLSAgICAgICAgeyJVbmtub3duLmV4dGVuZGVka2V5VXNhZ2UudHlwZS4iLCAiVHlwZSBleHRlbmRlZGtleVVzYWdlIGluY29ubnUgOiAifSwKLSAgICAgICAgeyJVbmtub3duLkFjY2Vzc0Rlc2NyaXB0aW9uLnR5cGUuIiwgIlR5cGUgQWNjZXNzRGVzY3JpcHRpb24gaW5jb25udSA6ICJ9LAotICAgICAgICB7IlVucmVjb2duaXplZC5HZW5lcmFsTmFtZS50eXBlLiIsICJUeXBlIEdlbmVyYWxOYW1lIG5vbiByZWNvbm51IDogIn0sCi0gICAgICAgIHsiVGhpcy5leHRlbnNpb24uY2Fubm90LmJlLm1hcmtlZC5hcy5jcml0aWNhbC4iLAotICAgICAgICAgICAgICAgICAiQ2V0dGUgZXh0ZW5zaW9uIG5lIHBldXQgcGFzIFx1MDBFQXRyZSBtYXJxdVx1MDBFOWUgY29tbWUgY3JpdGlxdWUuICJ9LAotICAgICAgICB7Ik9kZC5udW1iZXIub2YuaGV4LmRpZ2l0cy5mb3VuZC4iLCAiTm9tYnJlIGltcGFpciBkZSBjaGlmZnJlcyBoZXhhZFx1MDBFOWNpbWF1eCB0cm91dlx1MDBFOSA6ICJ9LAotICAgICAgICB7IlVua25vd24uZXh0ZW5zaW9uLnR5cGUuIiwgIlR5cGUgZCdleHRlbnNpb24gaW5jb25udSA6ICJ9LAotICAgICAgICB7ImNvbW1hbmQuezB9LmlzLmFtYmlndW91cy4iLCAiY29tbWFuZGUgezB9IGFtYmlndVx1MDBFQiA6In0sCi0KLSAgICAgICAgLy8gcG9saWN5dG9vbAotICAgICAgICB7Ildhcm5pbmcuQS5wdWJsaWMua2V5LmZvci5hbGlhcy5zaWduZXJzLmkuZG9lcy5ub3QuZXhpc3QuTWFrZS5zdXJlLmEuS2V5U3RvcmUuaXMucHJvcGVybHkuY29uZmlndXJlZC4iLAotICAgICAgICAgICAgICAgICJBdmVydGlzc2VtZW50XHUwMEEwOiBpbCBuJydleGlzdGUgcGFzIGRlIGNsXHUwMEU5IHB1YmxpcXVlIHBvdXIgbCcnYWxpYXMgezB9LiBWXHUwMEU5cmlmaWV6IHF1ZSBsZSBmaWNoaWVyIGRlIGNsXHUwMEU5cyBkJydhY2NcdTAwRThzIGVzdCBjb3JyZWN0ZW1lbnQgY29uZmlndXJcdTAwRTkuIn0sCi0gICAgICAgIHsiV2FybmluZy5DbGFzcy5ub3QuZm91bmQuY2xhc3MiLCAiQXZlcnRpc3NlbWVudCA6IGNsYXNzZSBpbnRyb3V2YWJsZSAtIHswfSJ9LAotICAgICAgICB7Ildhcm5pbmcuSW52YWxpZC5hcmd1bWVudC5zLmZvci5jb25zdHJ1Y3Rvci5hcmciLAotICAgICAgICAgICAgICAgICJBdmVydGlzc2VtZW50XHUwMEEwOiBhcmd1bWVudHMgbm9uIHZhbGlkZXMgcG91ciBsZSBjb25zdHJ1Y3RldXJcdTAwQTAtIHswfSJ9LAotICAgICAgICB7IklsbGVnYWwuUHJpbmNpcGFsLlR5cGUudHlwZSIsICJUeXBlIGRlIHByaW5jaXBhbCBub24gYWRtaXMgOiB7MH0ifSwKLSAgICAgICAgeyJJbGxlZ2FsLm9wdGlvbi5vcHRpb24iLCAiT3B0aW9uIG5vbiBhZG1pc2UgOiB7MH0ifSwKLSAgICAgICAgeyJVc2FnZS5wb2xpY3l0b29sLm9wdGlvbnMuIiwgIlN5bnRheGUgOiBwb2xpY3l0b29sIFtvcHRpb25zXSJ9LAotICAgICAgICB7Ii5maWxlLmZpbGUucG9saWN5LmZpbGUubG9jYXRpb24iLAotICAgICAgICAgICAgICAgICIgIFstZmlsZSA8ZmlsZT5dICAgIGVtcGxhY2VtZW50IGR1IGZpY2hpZXIgZGUgclx1MDBFOGdsZXMifSwKLSAgICAgICAgeyJOZXciLCAiTm91dmVhdSJ9LAotICAgICAgICB7Ik9wZW4iLCAiT3V2cmlyIn0sCi0gICAgICAgIHsiU2F2ZSIsICJFbnJlZ2lzdHJlciJ9LAotICAgICAgICB7IlNhdmUuQXMiLCAiRW5yZWdpc3RyZXIgc291cyJ9LAotICAgICAgICB7IlZpZXcuV2FybmluZy5Mb2ciLCAiQWZmaWNoZXIgbGUgam91cm5hbCBkZXMgYXZlcnRpc3NlbWVudHMifSwKLSAgICAgICAgeyJFeGl0IiwgIlF1aXR0ZXIifSwKLSAgICAgICAgeyJBZGQuUG9saWN5LkVudHJ5IiwgIkFqb3V0ZXIgdW5lIHJcdTAwRThnbGUifSwKLSAgICAgICAgeyJFZGl0LlBvbGljeS5FbnRyeSIsICJNb2RpZmllciB1bmUgclx1MDBFOGdsZSJ9LAotICAgICAgICB7IlJlbW92ZS5Qb2xpY3kuRW50cnkiLCAiRW5sZXZlciB1bmUgclx1MDBFOGdsZSJ9LAotICAgICAgICB7IkVkaXQiLCAiTW9kaWZpZXIifSwKLSAgICAgICAgeyJSZXRhaW4iLCAiQ29uc2VydmVyIn0sCi0KLSAgICAgICAgeyJXYXJuaW5nLkZpbGUubmFtZS5tYXkuaW5jbHVkZS5lc2NhcGVkLmJhY2tzbGFzaC5jaGFyYWN0ZXJzLkl0LmlzLm5vdC5uZWNlc3NhcnkudG8uZXNjYXBlLmJhY2tzbGFzaC5jaGFyYWN0ZXJzLnRoZS50b29sLmVzY2FwZXMiLAotICAgICAgICAgICAgIkF2ZXJ0aXNzZW1lbnQgOiBpbCBzZSBwZXV0IHF1ZSBsZSBub20gZGUgZmljaGllciBjb250aWVubmUgZGVzIGJhcnJlcyBvYmxpcXVlcyBpbnZlcnNlcyBhdmVjIGNhcmFjdFx1MDBFOHJlIGQnXHUwMEU5Y2hhcHBlbWVudC4gSWwgbidlc3QgcGFzIG5cdTAwRTljZXNzYWlyZSBkJ2Fqb3V0ZXIgdW4gY2FyYWN0XHUwMEU4cmUgZCdcdTAwRTljaGFwcGVtZW50IGF1eCBiYXJyZXMgb2JsaXF1ZXMgaW52ZXJzZXMuIEwnb3V0aWwgcHJvY1x1MDBFOGRlIFx1MDBFMCBsJ1x1MDBFOWNoYXBwZW1lbnQgc2kgblx1MDBFOWNlc3NhaXJlIGxvcnNxdSdpbCBcdTAwRTljcml0IGxlIGNvbnRlbnUgZGVzIHJcdTAwRThnbGVzIGRhbnMgbGEgem9uZSBkZSBzdG9ja2FnZSBwZXJzaXN0YW50KS5cblxuQ2xpcXVleiBzdXIgQ29uc2VydmVyIHBvdXIgZ2FyZGVyIGxlIG5vbSBzYWlzaSBvdSBzdXIgTW9kaWZpZXIgcG91ciBsZSByZW1wbGFjZXIuIn0sCi0KLSAgICAgICAgeyJBZGQuUHVibGljLktleS5BbGlhcyIsICJBam91dGVyIHVuIGFsaWFzIGRlIGNsXHUwMEU5IHB1YmxpcXVlIn0sCi0gICAgICAgIHsiUmVtb3ZlLlB1YmxpYy5LZXkuQWxpYXMiLCAiRW5sZXZlciB1biBhbGlhcyBkZSBjbFx1MDBFOSBwdWJsaXF1ZSJ9LAotICAgICAgICB7IkZpbGUiLCAiRmljaGllciJ9LAotICAgICAgICB7IktleVN0b3JlIiwgIkZpY2hpZXIgZGUgY2xcdTAwRTlzIn0sCi0gICAgICAgIHsiUG9saWN5LkZpbGUuIiwgIkZpY2hpZXIgZGUgclx1MDBFOGdsZXMgOiJ9LAotICAgICAgICB7IkNvdWxkLm5vdC5vcGVuLnBvbGljeS5maWxlLnBvbGljeUZpbGUuZS50b1N0cmluZy4iLAotICAgICAgICAgICAgICAgICJJbXBvc3NpYmxlIGQnJ291dnJpciBsZSBmaWNoaWVyIGRlIHJcdTAwRThnbGVzXHUwMEEwOiB7MH06IHsxfSJ9LAotICAgICAgICB7IlBvbGljeS5Ub29sIiwgIlBvbGljeSBUb29sIn0sCi0gICAgICAgIHsiRXJyb3JzLmhhdmUub2NjdXJyZWQud2hpbGUub3BlbmluZy50aGUucG9saWN5LmNvbmZpZ3VyYXRpb24uVmlldy50aGUuV2FybmluZy5Mb2cuZm9yLm1vcmUuaW5mb3JtYXRpb24uIiwKLSAgICAgICAgICAgICAgICAiRGVzIGVycmV1cnMgc2Ugc29udCBwcm9kdWl0ZXMgXHUwMEUwIGwnb3V2ZXJ0dXJlIGRlIGxhIGNvbmZpZ3VyYXRpb24gZGUgclx1MDBFOGdsZXMuIFBvdXIgcGx1cyBkJ2luZm9ybWF0aW9ucywgY29uc3VsdGV6IGxlIGpvdXJuYWwgZGVzIGF2ZXJ0aXNzZW1lbnRzLiJ9LAotICAgICAgICB7IkVycm9yIiwgIkVycmV1ciJ9LAotICAgICAgICB7Ik9LIiwgIk9LIn0sCi0gICAgICAgIHsiU3RhdHVzIiwgIlN0YXR1dCJ9LAotICAgICAgICB7Ildhcm5pbmciLCAiQXZlcnRpc3NlbWVudCJ9LAotICAgICAgICB7IlBlcm1pc3Npb24uIiwKLSAgICAgICAgICAgICAgICAiRHJvaXQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifSwKLSAgICAgICAgeyJQcmluY2lwYWwuVHlwZS4iLCAiVHlwZSBkZSBwcmluY2lwYWwgOiJ9LAotICAgICAgICB7IlByaW5jaXBhbC5OYW1lLiIsICJOb20gZGUgcHJpbmNpcGFsIDoifSwKLSAgICAgICAgeyJUYXJnZXQuTmFtZS4iLAotICAgICAgICAgICAgICAgICJOb20gZGUgY2libGUgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifSwKLSAgICAgICAgeyJBY3Rpb25zLiIsCi0gICAgICAgICAgICAgICAgIkFjdGlvbnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifSwKLSAgICAgICAgeyJPSy50by5vdmVyd3JpdGUuZXhpc3RpbmcuZmlsZS5maWxlbmFtZS4iLAotICAgICAgICAgICAgICAgICJSZW1wbGFjZXIgbGUgZmljaGllciBleGlzdGFudCB7MH0gPyJ9LAotICAgICAgICB7IkNhbmNlbCIsICJBbm51bGVyIn0sCi0gICAgICAgIHsiQ29kZUJhc2UuIiwgIkJhc2UgZGUgY29kZSA6In0sCi0gICAgICAgIHsiU2lnbmVkQnkuIiwgIlNpZ25cdTAwRTkgcGFyIDoifSwKLSAgICAgICAgeyJBZGQuUHJpbmNpcGFsIiwgIkFqb3V0ZXIgdW4gcHJpbmNpcGFsIn0sCi0gICAgICAgIHsiRWRpdC5QcmluY2lwYWwiLCAiTW9kaWZpZXIgdW4gcHJpbmNpcGFsIn0sCi0gICAgICAgIHsiUmVtb3ZlLlByaW5jaXBhbCIsICJFbmxldmVyIHVuIHByaW5jaXBhbCJ9LAotICAgICAgICB7IlByaW5jaXBhbHMuIiwgIlByaW5jaXBhdXggOiJ9LAotICAgICAgICB7Ii5BZGQuUGVybWlzc2lvbiIsICIgIEFqb3V0ZXIgdW4gZHJvaXQifSwKLSAgICAgICAgeyIuRWRpdC5QZXJtaXNzaW9uIiwgIiAgTW9kaWZpZXIgdW4gZHJvaXQifSwKLSAgICAgICAgeyJSZW1vdmUuUGVybWlzc2lvbiIsICJFbmxldmVyIHVuIGRyb2l0In0sCi0gICAgICAgIHsiRG9uZSIsICJUZXJtaW5cdTAwRTkifSwKLSAgICAgICAgeyJLZXlTdG9yZS5VUkwuIiwgIlVSTCBkdSBmaWNoaWVyIGRlIGNsXHUwMEU5cyA6In0sCi0gICAgICAgIHsiS2V5U3RvcmUuVHlwZS4iLCAiVHlwZSBkdSBmaWNoaWVyIGRlIGNsXHUwMEU5cyA6In0sCi0gICAgICAgIHsiS2V5U3RvcmUuUHJvdmlkZXIuIiwgIkZvdXJuaXNzZXVyIGR1IGZpY2hpZXIgZGUgY2xcdTAwRTlzIDoifSwKLSAgICAgICAgeyJLZXlTdG9yZS5QYXNzd29yZC5VUkwuIiwgIlVSTCBkdSBtb3QgZGUgcGFzc2UgZHUgZmljaGllciBkZSBjbFx1MDBFOXMgOiJ9LAotICAgICAgICB7IlByaW5jaXBhbHMiLCAiUHJpbmNpcGF1eCJ9LAotICAgICAgICB7Ii5FZGl0LlByaW5jaXBhbC4iLCAiICBNb2RpZmllciB1biBwcmluY2lwYWwgOiJ9LAotICAgICAgICB7Ii5BZGQuTmV3LlByaW5jaXBhbC4iLCAiICBBam91dGVyIHVuIHByaW5jaXBhbCA6In0sCi0gICAgICAgIHsiUGVybWlzc2lvbnMiLCAiRHJvaXRzIn0sCi0gICAgICAgIHsiLkVkaXQuUGVybWlzc2lvbi4iLCAiICBNb2RpZmllciB1biBkcm9pdCA6In0sCi0gICAgICAgIHsiLkFkZC5OZXcuUGVybWlzc2lvbi4iLCAiICBBam91dGVyIHVuIGRyb2l0IDoifSwKLSAgICAgICAgeyJTaWduZWQuQnkuIiwgIlNpZ25cdTAwRTkgcGFyIDoifSwKLSAgICAgICAgeyJDYW5ub3QuU3BlY2lmeS5QcmluY2lwYWwud2l0aC5hLldpbGRjYXJkLkNsYXNzLndpdGhvdXQuYS5XaWxkY2FyZC5OYW1lIiwKLSAgICAgICAgICAgICJJbXBvc3NpYmxlIGRlIHNwXHUwMEU5Y2lmaWVyIHVuIHByaW5jaXBhbCBhdmVjIHVuZSBjbGFzc2UgZ1x1MDBFOW5cdTAwRTlyaXF1ZSBzYW5zIG5vbSBnXHUwMEU5blx1MDBFOXJpcXVlIn0sCi0gICAgICAgIHsiQ2Fubm90LlNwZWNpZnkuUHJpbmNpcGFsLndpdGhvdXQuYS5OYW1lIiwKLSAgICAgICAgICAgICJJbXBvc3NpYmxlIGRlIHNwXHUwMEU5Y2lmaWVyIHVuIHByaW5jaXBhbCBzYW5zIG5vbSJ9LAotICAgICAgICB7IlBlcm1pc3Npb24uYW5kLlRhcmdldC5OYW1lLm11c3QuaGF2ZS5hLnZhbHVlIiwKLSAgICAgICAgICAgICAgICAiTGUgZHJvaXQgZXQgbGUgbm9tIGRlIGNpYmxlIGRvaXZlbnQgYXZvaXIgdW5lIHZhbGV1ciJ9LAotICAgICAgICB7IlJlbW92ZS50aGlzLlBvbGljeS5FbnRyeS4iLCAiRW5sZXZlciBjZXR0ZSByXHUwMEU4Z2xlID8ifSwKLSAgICAgICAgeyJPdmVyd3JpdGUuRmlsZSIsICJSZW1wbGFjZXIgbGUgZmljaGllciJ9LAotICAgICAgICB7IlBvbGljeS5zdWNjZXNzZnVsbHkud3JpdHRlbi50by5maWxlbmFtZSIsCi0gICAgICAgICAgICAgICAgIlJcdTAwRThnbGUgXHUwMEU5Y3JpdGUgZGFucyB7MH0ifSwKLSAgICAgICAgeyJudWxsLmZpbGVuYW1lIiwgIm5vbSBkZSBmaWNoaWVyIE5VTEwifSwKLSAgICAgICAgeyJTYXZlLmNoYW5nZXMuIiwgIkVucmVnaXN0cmVyIGxlcyBtb2RpZmljYXRpb25zID8ifSwKLSAgICAgICAgeyJZZXMiLCAiT3VpIn0sCi0gICAgICAgIHsiTm8iLCAiTm9uIn0sCi0gICAgICAgIHsiUG9saWN5LkVudHJ5IiwgIlJcdTAwRThnbGUifSwKLSAgICAgICAgeyJTYXZlLkNoYW5nZXMiLCAiRW5yZWdpc3RyZXIgbGVzIG1vZGlmaWNhdGlvbnMifSwKLSAgICAgICAgeyJOby5Qb2xpY3kuRW50cnkuc2VsZWN0ZWQiLCAiQXVjdW5lIHJcdTAwRThnbGUgc1x1MDBFOWxlY3Rpb25uXHUwMEU5ZSJ9LAotICAgICAgICB7IlVuYWJsZS50by5vcGVuLktleVN0b3JlLmV4LnRvU3RyaW5nLiIsCi0gICAgICAgICAgICAgICAgIkltcG9zc2libGUgZCcnb3V2cmlyIGxlIGZpY2hpZXIgZGUgY2xcdTAwRTlzIGQnJ2FjY1x1MDBFOHMgOiB7MH0ifSwKLSAgICAgICAgeyJOby5wcmluY2lwYWwuc2VsZWN0ZWQiLCAiQXVjdW4gcHJpbmNpcGFsIHNcdTAwRTlsZWN0aW9ublx1MDBFOSJ9LAotICAgICAgICB7Ik5vLnBlcm1pc3Npb24uc2VsZWN0ZWQiLCAiQXVjdW4gZHJvaXQgc1x1MDBFOWxlY3Rpb25uXHUwMEU5In0sCi0gICAgICAgIHsibmFtZSIsICJub20ifSwKLSAgICAgICAgeyJjb25maWd1cmF0aW9uLnR5cGUiLCAidHlwZSBkZSBjb25maWd1cmF0aW9uIn0sCi0gICAgICAgIHsiZW52aXJvbm1lbnQudmFyaWFibGUubmFtZSIsICJOb20gZGUgdmFyaWFibGUgZCdlbnZpcm9ubmVtZW50In0sCi0gICAgICAgIHsibGlicmFyeS5uYW1lIiwgIm5vbSBkZSBiaWJsaW90aFx1MDBFOHF1ZSJ9LAotICAgICAgICB7InBhY2thZ2UubmFtZSIsICJub20gZGUgcGFja2FnZSJ9LAotICAgICAgICB7InBvbGljeS50eXBlIiwgInR5cGUgZGUgclx1MDBFOGdsZSJ9LAotICAgICAgICB7InByb3BlcnR5Lm5hbWUiLCAibm9tIGRlIHByb3ByaVx1MDBFOXRcdTAwRTkifSwKLSAgICAgICAgeyJQcmluY2lwYWwuTGlzdCIsICJMaXN0ZSBkZSBwcmluY2lwYXV4In0sCi0gICAgICAgIHsiUGVybWlzc2lvbi5MaXN0IiwgIkxpc3RlIGRlIGRyb2l0cyJ9LAotICAgICAgICB7IkNvZGUuQmFzZSIsICJCYXNlIGRlIGNvZGUifSwKLSAgICAgICAgeyJLZXlTdG9yZS5VLlIuTC4iLCAiVVJMIGR1IGZpY2hpZXIgZGUgY2xcdTAwRTlzIDoifSwKLSAgICAgICAgeyJLZXlTdG9yZS5QYXNzd29yZC5VLlIuTC4iLCAiVVJMIGR1IG1vdCBkZSBwYXNzZSBkdSBmaWNoaWVyIGRlIGNsXHUwMEU5cyA6In0sCi0KLQogICAgICAgICAvLyBqYXZheC5zZWN1cml0eS5hdXRoLlByaXZhdGVDcmVkZW50aWFsUGVybWlzc2lvbgogICAgICAgICB7ImludmFsaWQubnVsbC5pbnB1dC5zLiIsICJlbnRyXHUwMEU5ZXMgTlVMTCBub24gdmFsaWRlcyJ9LAogICAgICAgICB7ImFjdGlvbnMuY2FuLm9ubHkuYmUucmVhZC4iLCAibGVzIGFjdGlvbnMgc29udCBhY2Nlc3NpYmxlcyBlbiBsZWN0dXJlIHVuaXF1ZW1lbnQifSwKQEAgLTU1Myw2ICs1OCw3IEBACiAgICAgICAgIHsicHJvdmlkZWQubnVsbC5PSUQubWFwIiwgIm1hcHBhZ2UgT0lEIE5VTEwgZm91cm5pIn0sCiAKICAgICAgICAgLy8gamF2YXguc2VjdXJpdHkuYXV0aC5TdWJqZWN0CisgICAgICAgIHsiTkVXTElORSIsICJcbiJ9LAogICAgICAgICB7ImludmFsaWQubnVsbC5BY2Nlc3NDb250cm9sQ29udGV4dC5wcm92aWRlZCIsCiAgICAgICAgICAgICAgICAgIkFjY2Vzc0NvbnRyb2xDb250ZXh0IE5VTEwgZm91cm5pIG5vbiB2YWxpZGUifSwKICAgICAgICAgeyJpbnZhbGlkLm51bGwuYWN0aW9uLnByb3ZpZGVkIiwgImFjdGlvbiBOVUxMIGZvdXJuaWUgbm9uIHZhbGlkZSJ9LApAQCAtNjU2LDYgKzE2Miw3IEBACiAgICAgICoKICAgICAgKiBAcmV0dXJuIHRoZSBjb250ZW50cyBvZiB0aGlzIDxjb2RlPlJlc291cmNlQnVuZGxlPC9jb2RlPi4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgT2JqZWN0W11bXSBnZXRDb250ZW50cygpIHsKICAgICAgICAgcmV0dXJuIGNvbnRlbnRzOwogICAgIH0KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdXRpbC9SZXNvdXJjZXNfaXQuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdXRpbC9SZXNvdXJjZXNfaXQuamF2YQppbmRleCAzZDNhYmYwLi5lOTQyZjY0IDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3V0aWwvUmVzb3VyY2VzX2l0LmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS91dGlsL1Jlc291cmNlc19pdC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMzQsNTAxICszNCw2IEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXVtdIGNvbnRlbnRzID0gewogCi0gICAgICAgIC8vIHNoYXJlZCAoZnJvbSBqYXJzaWduZXIpCi0gICAgICAgIHsiU1BBQ0UiLCAiICJ9LAotICAgICAgICB7IjJTUEFDRSIsICIgICJ9LAotICAgICAgICB7IjZTUEFDRSIsICIgICAgICAifSwKLSAgICAgICAgeyJDT01NQSIsICIsICJ9LAotICAgICAgICAvLyBzaGFyZWQgKGZyb20ga2V5dG9vbCkKLSAgICAgICAgeyJORVdMSU5FIiwgIlxuIn0sCi0gICAgICAgIHsiU1RBUiIsCi0gICAgICAgICAgICAgICAgIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioifSwKLSAgICAgICAgeyJTVEFSTk4iLAotICAgICAgICAgICAgICAgICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cbiJ9LAotCi0gICAgICAgIC8vIGtleXRvb2w6IEhlbHAgcGFydAotLy8gIk9wdGlvbiIgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0gICAgICAgIHsiLk9QVElPTi4iLCAiIFtPcHppb25lXS4uLiJ9LAotICAgICAgICB7Ik9wdGlvbnMuIiwgIk9wemlvbmk6In0sCi0gICAgICAgIHsiVXNlLmtleXRvb2wuaGVscC5mb3IuYWxsLmF2YWlsYWJsZS5jb21tYW5kcyIsCi0gICAgICAgICAgICAgICAgICJVdGlsaXp6YXJlIFwia2V5dG9vbCAtaGVscFwiIHBlciB2aXN1YWxpenphcmUgdHV0dGkgaSBjb21hbmRpIGRpc3BvbmliaWxpIn0sCi0gICAgICAgIHsiS2V5LmFuZC5DZXJ0aWZpY2F0ZS5NYW5hZ2VtZW50LlRvb2wiLAotICAgICAgICAgICAgICAgICAiU3RydW1lbnRvIGRpIGdlc3Rpb25lIGRpIGNoaWF2aSBlIGNlcnRpZmljYXRpIn0sCi0gICAgICAgIHsiQ29tbWFuZHMuIiwgIkNvbWFuZGk6In0sCi0gICAgICAgIHsiVXNlLmtleXRvb2wuY29tbWFuZC5uYW1lLmhlbHAuZm9yLnVzYWdlLm9mLmNvbW1hbmQubmFtZSIsCi0gICAgICAgICAgICAgICAgIlV0aWxpenphcmUgXCJrZXl0b29sIC1jb21tYW5kX25hbWUgLWhlbHBcIiBwZXIgaW5mb3JtYXppb25pIHN1bGwndXNvIGRpIGNvbW1hbmRfbmFtZSJ9LAotICAgICAgICAvLyBrZXl0b29sOiBoZWxwOiBjb21tYW5kcwotICAgICAgICB7IkdlbmVyYXRlcy5hLmNlcnRpZmljYXRlLnJlcXVlc3QiLAotICAgICAgICAgICAgICAgICJHZW5lcmEgdW5hIHJpY2hpZXN0YSBkaSBjZXJ0aWZpY2F0byJ9LCAvLy1jZXJ0cmVxCi0gICAgICAgIHsiQ2hhbmdlcy5hbi5lbnRyeS5zLmFsaWFzIiwKLSAgICAgICAgICAgICAgICAiTW9kaWZpY2EgbCdhbGlhcyBkaSB1bmEgdm9jZSJ9LCAvLy1jaGFuZ2VhbGlhcwotICAgICAgICB7IkRlbGV0ZXMuYW4uZW50cnkiLAotICAgICAgICAgICAgICAgICJFbGltaW5hIHVuYSB2b2NlIn0sIC8vLWRlbGV0ZQotICAgICAgICB7IkV4cG9ydHMuY2VydGlmaWNhdGUiLAotICAgICAgICAgICAgICAgICJFc3BvcnRhIGlsIGNlcnRpZmljYXRvIn0sIC8vLWV4cG9ydGNlcnQKLSAgICAgICAgeyJHZW5lcmF0ZXMuYS5rZXkucGFpciIsCi0gICAgICAgICAgICAgICAgIkdlbmVyYSB1bmEgY29wcGlhIGRpIGNoaWF2aSJ9LCAvLy1nZW5rZXlwYWlyCi0vLyB0cmFuc2xhdGlvbiBvZiAic2VjcmV0IiBrZXkgc2hvdWxkIGJlIGRpZmZlcmVudCB0byAicHJpdmF0ZSIga2V5LgotICAgICAgICB7IkdlbmVyYXRlcy5hLnNlY3JldC5rZXkiLAotICAgICAgICAgICAgICAgICJHZW5lcmEgdW5hIGNoaWF2ZSBzZWdyZXRhIn0sIC8vLWdlbnNlY2tleQotICAgICAgICB7IkdlbmVyYXRlcy5jZXJ0aWZpY2F0ZS5mcm9tLmEuY2VydGlmaWNhdGUucmVxdWVzdCIsCi0gICAgICAgICAgICAgICAgIkdlbmVyYSB1biBjZXJ0aWZpY2F0byBkYSB1bmEgcmljaGllc3RhIGRpIGNlcnRpZmljYXRvIn0sIC8vLWdlbmNlcnQKLSAgICAgICAgeyJHZW5lcmF0ZXMuQ1JMIiwgIkdlbmVyYSBDUkwifSwgLy8tZ2VuY3JsCi0gICAgICAgIHsiSW1wb3J0cy5lbnRyaWVzLmZyb20uYS5KREsuMS4xLnguc3R5bGUuaWRlbnRpdHkuZGF0YWJhc2UiLAotICAgICAgICAgICAgICAgICJJbXBvcnRhIGxlIHZvY2kgZGEgdW4gZGF0YWJhc2UgZGVsbGUgaWRlbnRpdFx1MDBFMCBkaSB0aXBvIEpESyAxLjEueCJ9LCAvLy1pZGVudGl0eWRiCi0gICAgICAgIHsiSW1wb3J0cy5hLmNlcnRpZmljYXRlLm9yLmEuY2VydGlmaWNhdGUuY2hhaW4iLAotICAgICAgICAgICAgICAgICJJbXBvcnRhIHVuIGNlcnRpZmljYXRvIG8gdW5hIGNhdGVuYSBkaSBjZXJ0aWZpY2F0aSJ9LCAvLy1pbXBvcnRjZXJ0Ci0gICAgICAgIHsiSW1wb3J0cy5vbmUub3IuYWxsLmVudHJpZXMuZnJvbS5hbm90aGVyLmtleXN0b3JlIiwKLSAgICAgICAgICAgICAgICAiSW1wb3J0YSB1bmEgbyB0dXR0ZSBsZSB2b2NpIGRhIHVuIGFsdHJvIGtleXN0b3JlIn0sIC8vLWltcG9ydGtleXN0b3JlCi0gICAgICAgIHsiQ2xvbmVzLmEua2V5LmVudHJ5IiwKLSAgICAgICAgICAgICAgICAiRHVwbGljYSB1bmEgdm9jZSBkaSBjaGlhdmUifSwgLy8ta2V5Y2xvbmUKLSAgICAgICAgeyJDaGFuZ2VzLnRoZS5rZXkucGFzc3dvcmQub2YuYW4uZW50cnkiLAotICAgICAgICAgICAgICAgICJNb2RpZmljYSBsYSBwYXNzd29yZCBkZWxsYSBjaGlhdmUgcGVyIHVuYSB2b2NlIn0sIC8vLWtleXBhc3N3ZAotICAgICAgICB7Ikxpc3RzLmVudHJpZXMuaW4uYS5rZXlzdG9yZSIsCi0gICAgICAgICAgICAgICAgIkVsZW5jYSBsZSB2b2NpIGluIHVuIGtleXN0b3JlIn0sIC8vLWxpc3QKLSAgICAgICAgeyJQcmludHMudGhlLmNvbnRlbnQub2YuYS5jZXJ0aWZpY2F0ZSIsCi0gICAgICAgICAgICAgICAgIlZpc3VhbGl6emEgaSBjb250ZW51dGkgZGkgdW4gY2VydGlmaWNhdG8ifSwgLy8tcHJpbnRjZXJ0Ci0gICAgICAgIHsiUHJpbnRzLnRoZS5jb250ZW50Lm9mLmEuY2VydGlmaWNhdGUucmVxdWVzdCIsCi0gICAgICAgICAgICAgICAgIlZpc3VhbGl6emEgaSBjb250ZW51dGkgZGkgdW5hIHJpY2hpZXN0YSBkaSBjZXJ0aWZpY2F0byJ9LCAvLy1wcmludGNlcnRyZXEKLSAgICAgICAgeyJQcmludHMudGhlLmNvbnRlbnQub2YuYS5DUkwuZmlsZSIsCi0gICAgICAgICAgICAgICAgIlZpc3VhbGl6emEgaSBjb250ZW51dGkgZGkgdW4gZmlsZSBDUkwifSwgLy8tcHJpbnRjcmwKLSAgICAgICAgeyJHZW5lcmF0ZXMuYS5zZWxmLnNpZ25lZC5jZXJ0aWZpY2F0ZSIsCi0gICAgICAgICAgICAgICAgIkdlbmVyYSBjZXJ0aWZpY2F0byBjb24gZmlybWEgYXV0b21hdGljYSJ9LCAvLy1zZWxmY2VydAotICAgICAgICB7IkNoYW5nZXMudGhlLnN0b3JlLnBhc3N3b3JkLm9mLmEua2V5c3RvcmUiLAotICAgICAgICAgICAgICAgICJNb2RpZmljYSBsYSBwYXNzd29yZCBkaSBhcmVhIGRpIG1lbW9yaXp6YXppb25lIGRpIHVuIGtleXN0b3JlIn0sIC8vLXN0b3JlcGFzc3dkCi0gICAgICAgIC8vIGtleXRvb2w6IGhlbHA6IG9wdGlvbnMKLSAgICAgICAgeyJhbGlhcy5uYW1lLm9mLnRoZS5lbnRyeS50by5wcm9jZXNzIiwKLSAgICAgICAgICAgICAgICAibm9tZSBhbGlhcyBkZWxsYSB2b2NlIGRhIGVsYWJvcmFyZSJ9LCAvLy1hbGlhcwotICAgICAgICB7ImRlc3RpbmF0aW9uLmFsaWFzIiwKLSAgICAgICAgICAgICAgICAiYWxpYXMgZGkgZGVzdGluYXppb25lIn0sIC8vLWRlc3RhbGlhcwotICAgICAgICB7ImRlc3RpbmF0aW9uLmtleS5wYXNzd29yZCIsCi0gICAgICAgICAgICAgICAgInBhc3N3b3JkIGNoaWF2ZSBkaSBkZXN0aW5hemlvbmUifSwgLy8tZGVzdGtleXBhc3MKLSAgICAgICAgeyJkZXN0aW5hdGlvbi5rZXlzdG9yZS5uYW1lIiwKLSAgICAgICAgICAgICAgICAibm9tZSBrZXlzdG9yZSBkaSBkZXN0aW5hemlvbmUifSwgLy8tZGVzdGtleXN0b3JlCi0gICAgICAgIHsiZGVzdGluYXRpb24ua2V5c3RvcmUucGFzc3dvcmQucHJvdGVjdGVkIiwKLSAgICAgICAgICAgICAgICAicGFzc3dvcmQga2V5c3RvcmUgZGkgZGVzdGluYXppb25lIHByb3RldHRhIn0sIC8vLWRlc3Rwcm90ZWN0ZWQKLSAgICAgICAgeyJkZXN0aW5hdGlvbi5rZXlzdG9yZS5wcm92aWRlci5uYW1lIiwKLSAgICAgICAgICAgICAgICAibm9tZSBwcm92aWRlciBrZXlzdG9yZSBkaSBkZXN0aW5hemlvbmUifSwgLy8tZGVzdHByb3ZpZGVybmFtZQotICAgICAgICB7ImRlc3RpbmF0aW9uLmtleXN0b3JlLnBhc3N3b3JkIiwKLSAgICAgICAgICAgICAgICAicGFzc3dvcmQga2V5c3RvcmUgZGkgZGVzdGluYXppb25lIn0sIC8vLWRlc3RzdG9yZXBhc3MKLSAgICAgICAgeyJkZXN0aW5hdGlvbi5rZXlzdG9yZS50eXBlIiwKLSAgICAgICAgICAgICAgICAidGlwbyBrZXlzdG9yZSBkaSBkZXN0aW5hemlvbmUifSwgLy8tZGVzdHN0b3JldHlwZQotICAgICAgICB7ImRpc3Rpbmd1aXNoZWQubmFtZSIsCi0gICAgICAgICAgICAgICAgIm5vbWUgZGlzdGludG8ifSwgLy8tZG5hbWUKLSAgICAgICAgeyJYLjUwOS5leHRlbnNpb24iLAotICAgICAgICAgICAgICAgICJlc3RlbnNpb25lIFguNTA5In0sIC8vLWV4dAotICAgICAgICB7Im91dHB1dC5maWxlLm5hbWUiLAotICAgICAgICAgICAgICAgICJub21lIGZpbGUgZGkgb3V0cHV0In0sIC8vLWZpbGUgYW5kIC1vdXRmaWxlCi0gICAgICAgIHsiaW5wdXQuZmlsZS5uYW1lIiwKLSAgICAgICAgICAgICAgICAibm9tZSBmaWxlIGRpIGlucHV0In0sIC8vLWZpbGUgYW5kIC1pbmZpbGUKLSAgICAgICAgeyJrZXkuYWxnb3JpdGhtLm5hbWUiLAotICAgICAgICAgICAgICAgICJub21lIGFsZ29yaXRtbyBjaGlhdmUifSwgLy8ta2V5YWxnCi0gICAgICAgIHsia2V5LnBhc3N3b3JkIiwKLSAgICAgICAgICAgICAgICAicGFzc3dvcmQgY2hpYXZlIn0sIC8vLWtleXBhc3MKLSAgICAgICAgeyJrZXkuYml0LnNpemUiLAotICAgICAgICAgICAgICAgICJkaW1lbnNpb25lIGJpdCBjaGlhdmUifSwgLy8ta2V5c2l6ZQotICAgICAgICB7ImtleXN0b3JlLm5hbWUiLAotICAgICAgICAgICAgICAgICJub21lIGtleXN0b3JlIn0sIC8vLWtleXN0b3JlCi0gICAgICAgIHsibmV3LnBhc3N3b3JkIiwKLSAgICAgICAgICAgICAgICAibnVvdmEgcGFzc3dvcmQifSwgLy8tbmV3Ci0gICAgICAgIHsiZG8ubm90LnByb21wdCIsCi0gICAgICAgICAgICAgICAgIm5vbiByaWNoaWVkZXJlIn0sIC8vLW5vcHJvbXB0Ci0gICAgICAgIHsicGFzc3dvcmQudGhyb3VnaC5wcm90ZWN0ZWQubWVjaGFuaXNtIiwKLSAgICAgICAgICAgICAgICAicGFzc3dvcmQgbWVkaWFudGUgbWVjY2FuaXNtbyBwcm90ZXR0byJ9LCAvLy1wcm90ZWN0ZWQKLSAgICAgICAgeyJwcm92aWRlci5hcmd1bWVudCIsCi0gICAgICAgICAgICAgICAgImFyZ29tZW50byBwcm92aWRlciJ9LCAvLy1wcm92aWRlcmFyZwotICAgICAgICB7InByb3ZpZGVyLmNsYXNzLm5hbWUiLAotICAgICAgICAgICAgICAgICJub21lIGNsYXNzZSBwcm92aWRlciJ9LCAvLy1wcm92aWRlcmNsYXNzCi0gICAgICAgIHsicHJvdmlkZXIubmFtZSIsCi0gICAgICAgICAgICAgICAgIm5vbWUgcHJvdmlkZXIifSwgLy8tcHJvdmlkZXJuYW1lCi0gICAgICAgIHsicHJvdmlkZXIuY2xhc3NwYXRoIiwKLSAgICAgICAgICAgICAgICAiY2xhc3NwYXRoIHByb3ZpZGVyIn0sIC8vLXByb3ZpZGVycGF0aAotICAgICAgICB7Im91dHB1dC5pbi5SRkMuc3R5bGUiLAotICAgICAgICAgICAgICAgICJvdXRwdXQgaW4gc3RpbGUgUkZDIn0sIC8vLXJmYwotICAgICAgICB7InNpZ25hdHVyZS5hbGdvcml0aG0ubmFtZSIsCi0gICAgICAgICAgICAgICAgIm5vbWUgYWxnb3JpdG1vIGZpcm1hIn0sIC8vLXNpZ2FsZwotICAgICAgICB7InNvdXJjZS5hbGlhcyIsCi0gICAgICAgICAgICAgICAgImFsaWFzIG9yaWdpbmUifSwgLy8tc3JjYWxpYXMKLSAgICAgICAgeyJzb3VyY2Uua2V5LnBhc3N3b3JkIiwKLSAgICAgICAgICAgICAgICAicGFzc3dvcmQgY2hpYXZlIGRpIG9yaWdpbmUifSwgLy8tc3Jja2V5cGFzcwotICAgICAgICB7InNvdXJjZS5rZXlzdG9yZS5uYW1lIiwKLSAgICAgICAgICAgICAgICAibm9tZSBrZXlzdG9yZSBkaSBvcmlnaW5lIn0sIC8vLXNyY2tleXN0b3JlCi0gICAgICAgIHsic291cmNlLmtleXN0b3JlLnBhc3N3b3JkLnByb3RlY3RlZCIsCi0gICAgICAgICAgICAgICAgInBhc3N3b3JkIGtleXN0b3JlIGRpIG9yaWdpbmUgcHJvdGV0dGEifSwgLy8tc3JjcHJvdGVjdGVkCi0gICAgICAgIHsic291cmNlLmtleXN0b3JlLnByb3ZpZGVyLm5hbWUiLAotICAgICAgICAgICAgICAgICJub21lIHByb3ZpZGVyIGtleXN0b3JlIGRpIG9yaWdpbmUifSwgLy8tc3JjcHJvdmlkZXJuYW1lCi0gICAgICAgIHsic291cmNlLmtleXN0b3JlLnBhc3N3b3JkIiwKLSAgICAgICAgICAgICAgICAicGFzc3dvcmQga2V5c3RvcmUgZGkgb3JpZ2luZSJ9LCAvLy1zcmNzdG9yZXBhc3MKLSAgICAgICAgeyJzb3VyY2Uua2V5c3RvcmUudHlwZSIsCi0gICAgICAgICAgICAgICAgInRpcG8ga2V5c3RvcmUgZGkgb3JpZ2luZSJ9LCAvLy1zcmNzdG9yZXR5cGUKLSAgICAgICAgeyJTU0wuc2VydmVyLmhvc3QuYW5kLnBvcnQiLAotICAgICAgICAgICAgICAgICJob3N0IGUgcG9ydGEgc2VydmVyIFNTTCJ9LCAvLy1zc2xzZXJ2ZXIKLSAgICAgICAgeyJzaWduZWQuamFyLmZpbGUiLAotICAgICAgICAgICAgICAgICJmaWxlIGphciBmaXJtYXRvIn0sIC8vPWphcmZpbGUKLSAgICAgICAgeyJjZXJ0aWZpY2F0ZS52YWxpZGl0eS5zdGFydC5kYXRlLnRpbWUiLAotICAgICAgICAgICAgICAgICJkYXRhL29yYSBkaSBpbml6aW8gdmFsaWRpdFx1MDBFMCBjZXJ0aWZpY2F0byJ9LCAvLy1zdGFydGRhdGUKLSAgICAgICAgeyJrZXlzdG9yZS5wYXNzd29yZCIsCi0gICAgICAgICAgICAgICAgInBhc3N3b3JkIGtleXN0b3JlIn0sIC8vLXN0b3JlcGFzcwotICAgICAgICB7ImtleXN0b3JlLnR5cGUiLAotICAgICAgICAgICAgICAgICJ0aXBvIGtleXN0b3JlIn0sIC8vLXN0b3JldHlwZQotICAgICAgICB7InRydXN0LmNlcnRpZmljYXRlcy5mcm9tLmNhY2VydHMiLAotICAgICAgICAgICAgICAgICJjb25zaWRlcmEgc2ljdXJpIGkgY2VydGlmaWNhdGkgZGEgY2FjZXJ0cyJ9LCAvLy10cnVzdGNhY2VydHMKLSAgICAgICAgeyJ2ZXJib3NlLm91dHB1dCIsCi0gICAgICAgICAgICAgICAgIm91dHB1dCBkZXNjcml0dGl2byJ9LCAvLy12Ci0gICAgICAgIHsidmFsaWRpdHkubnVtYmVyLm9mLmRheXMiLAotICAgICAgICAgICAgICAgICJudW1lcm8gZGkgZ2lvcm5pIGRpIHZhbGlkaXRcdTAwRTAifSwgLy8tdmFsaWRpdHkKLSAgICAgICAgeyJTZXJpYWwuSUQub2YuY2VydC50by5yZXZva2UiLAotICAgICAgICAgICAgICAgICAiSUQgc2VyaWFsZSBkZWwgY2VydGlmaWNhdG8gZGEgcmV2b2NhcmUifSwgLy8taWQKLSAgICAgICAgLy8ga2V5dG9vbDogUnVubmluZyBwYXJ0Ci0gICAgICAgIHsia2V5dG9vbC5lcnJvci4iLCAiRXJyb3JlIGtleXRvb2w6ICJ9LAotICAgICAgICB7IklsbGVnYWwub3B0aW9uLiIsICJPcHppb25lIG5vbiB2YWxpZGE6ICAifSwKLSAgICAgICAgeyJJbGxlZ2FsLnZhbHVlLiIsICJWYWxvcmUgbm9uIHZhbGlkbzogIn0sCi0gICAgICAgIHsiVW5rbm93bi5wYXNzd29yZC50eXBlLiIsICJUaXBvIGRpIHBhc3N3b3JkIHNjb25vc2NpdXRvOiAifSwKLSAgICAgICAgeyJDYW5ub3QuZmluZC5lbnZpcm9ubWVudC52YXJpYWJsZS4iLAotICAgICAgICAgICAgICAgICJJbXBvc3NpYmlsZSB0cm92YXJlIGxhIHZhcmlhYmlsZSBkaSBhbWJpZW50ZTogIn0sCi0gICAgICAgIHsiQ2Fubm90LmZpbmQuZmlsZS4iLCAiSW1wb3NzaWJpbGUgdHJvdmFyZSBpbCBmaWxlOiAifSwKLSAgICAgICAgeyJDb21tYW5kLm9wdGlvbi5mbGFnLm5lZWRzLmFuLmFyZ3VtZW50LiIsICJcdTAwQzggbmVjZXNzYXJpbyBzcGVjaWZpY2FyZSB1biBhcmdvbWVudG8gcGVyIGwnJ29wemlvbmUgZGkgY29tYW5kbyB7MH0uIn0sCi0gICAgICAgIHsiV2FybmluZy5EaWZmZXJlbnQuc3RvcmUuYW5kLmtleS5wYXNzd29yZHMubm90LnN1cHBvcnRlZC5mb3IuUEtDUzEyLktleVN0b3Jlcy5JZ25vcmluZy51c2VyLnNwZWNpZmllZC5jb21tYW5kLnZhbHVlLiIsCi0gICAgICAgICAgICAgICAgIkF2dmVydGVuemE6IG5vbiBzb25vIHN1cHBvcnRhdGUgcGFzc3dvcmQgZGl2ZXJzZSBkaSBjaGlhdmUgZSBkaSBhcmNoaXZpbyBwZXIgaSBrZXlzdG9yZSBQS0NTMTIuIElsIHZhbG9yZSB7MH0gc3BlY2lmaWNhdG8gZGFsbCcndXRlbnRlIHZlcnJcdTAwRTAgaWdub3JhdG8uIn0sCi0gICAgICAgIHsiLmtleXN0b3JlLm11c3QuYmUuTk9ORS5pZi5zdG9yZXR5cGUuaXMuezB9IiwKLSAgICAgICAgICAgICAgICAiU2UgLXN0b3JldHlwZSBcdTAwRTggaW1wb3N0YXRvIHN1IHswfSwgLWtleXN0b3JlIGRldmUgZXNzZXJlIGltcG9zdGF0byBzdSBOT05FIn0sCi0gICAgICAgIHsiVG9vLm1hbnkucmV0cmllcy5wcm9ncmFtLnRlcm1pbmF0ZWQiLAotICAgICAgICAgICAgICAgICAiSWwgbnVtZXJvIGRlaSB0ZW50YXRpdmkgY29uc2VudGl0aSBcdTAwRTggc3RhdG8gc3VwZXJhdG8uIElsIHByb2dyYW1tYSB2ZXJyXHUwMEUwIHRlcm1pbmF0by4ifSwKLSAgICAgICAgeyIuc3RvcmVwYXNzd2QuYW5kLmtleXBhc3N3ZC5jb21tYW5kcy5ub3Quc3VwcG9ydGVkLmlmLnN0b3JldHlwZS5pcy57MH0iLAotICAgICAgICAgICAgICAgICJTZSAtc3RvcmV0eXBlIFx1MDBFOCBpbXBvc3RhdG8gc3UgezB9LCBpIGNvbWFuZGkgLXN0b3JlcGFzc3dkIGUgLWtleXBhc3N3ZCBub24gc29ubyBzdXBwb3J0YXRpIn0sCi0gICAgICAgIHsiLmtleXBhc3N3ZC5jb21tYW5kcy5ub3Quc3VwcG9ydGVkLmlmLnN0b3JldHlwZS5pcy5QS0NTMTIiLAotICAgICAgICAgICAgICAgICJTZSAtc3RvcmV0eXBlIFx1MDBFOCBpbXBvc3RhdG8gc3UgUEtDUzEyIGkgY29tYW5kaSAta2V5cGFzc3dkIG5vbiB2ZW5nb25vIHN1cHBvcnRhdGkifSwKLSAgICAgICAgeyIua2V5cGFzcy5hbmQubmV3LmNhbi5ub3QuYmUuc3BlY2lmaWVkLmlmLnN0b3JldHlwZS5pcy57MH0iLAotICAgICAgICAgICAgICAgICJTZSAtc3RvcmV0eXBlIFx1MDBFOCBpbXBvc3RhdG8gc3UgezB9LCBub24gXHUwMEU4IHBvc3NpYmlsZSBzcGVjaWZpY2FyZSB1biB2YWxvcmUgcGVyIC1rZXlwYXNzIGUgLW5ldyJ9LAotICAgICAgICB7ImlmLnByb3RlY3RlZC5pcy5zcGVjaWZpZWQudGhlbi5zdG9yZXBhc3Mua2V5cGFzcy5hbmQubmV3Lm11c3Qubm90LmJlLnNwZWNpZmllZCIsCi0gICAgICAgICAgICAgICAgIlNlIFx1MDBFOCBzcGVjaWZpY2F0YSBsJ29wemlvbmUgLXByb3RlY3RlZCwgbGUgb3B6aW9uaSAtc3RvcmVwYXNzLCAta2V5cGFzcyBlIC1uZXcgbm9uIHBvc3Nvbm8gZXNzZXJlIHNwZWNpZmljYXRlIn0sCi0gICAgICAgIHsiaWYuc3JjcHJvdGVjdGVkLmlzLnNwZWNpZmllZC50aGVuLnNyY3N0b3JlcGFzcy5hbmQuc3Jja2V5cGFzcy5tdXN0Lm5vdC5iZS5zcGVjaWZpZWQiLAotICAgICAgICAgICAgICAgICJTZSB2aWVuZSBzcGVjaWZpY2F0byAtc3JjcHJvdGVjdGVkLCAtc3Jjc3RvcmVwYXNzIGUgLXNyY2tleXBhc3Mgbm9uIGRvdnJhbm5vIGVzc2VyZSBzcGVjaWZpY2F0aSJ9LAotICAgICAgICB7ImlmLmtleXN0b3JlLmlzLm5vdC5wYXNzd29yZC5wcm90ZWN0ZWQudGhlbi5zdG9yZXBhc3Mua2V5cGFzcy5hbmQubmV3Lm11c3Qubm90LmJlLnNwZWNpZmllZCIsCi0gICAgICAgICAgICAgICAgIlNlIGlsIGZpbGUga2V5c3RvcmUgbm9uIFx1MDBFOCBwcm90ZXR0byBkYSBwYXNzd29yZCwgbm9uIGRldmUgZXNzZXJlIHNwZWNpZmljYXRvIGFsY3VuIHZhbG9yZSBwZXIgLXN0b3JlcGFzcywgLWtleXBhc3MgZSAtbmV3In0sCi0gICAgICAgIHsiaWYuc291cmNlLmtleXN0b3JlLmlzLm5vdC5wYXNzd29yZC5wcm90ZWN0ZWQudGhlbi5zcmNzdG9yZXBhc3MuYW5kLnNyY2tleXBhc3MubXVzdC5ub3QuYmUuc3BlY2lmaWVkIiwKLSAgICAgICAgICAgICAgICAiU2UgaWwgZmlsZSBrZXlzdG9yZSBub24gXHUwMEU4IHByb3RldHRvIGRhIHBhc3N3b3JkLCBub24gZGV2ZSBlc3NlcmUgc3BlY2lmaWNhdG8gYWxjdW4gdmFsb3JlIHBlciAtc3Jjc3RvcmVwYXNzIGUgLXNyY2tleXBhc3MifSwKLSAgICAgICAgeyJJbGxlZ2FsLnN0YXJ0ZGF0ZS52YWx1ZSIsICJWYWxvcmUgZGkgZGF0YSBkaSBpbml6aW8gbm9uIHZhbGlkbyJ9LAotICAgICAgICB7IlZhbGlkaXR5Lm11c3QuYmUuZ3JlYXRlci50aGFuLnplcm8iLAotICAgICAgICAgICAgICAgICJMYSB2YWxpZGl0XHUwMEUwIGRldmUgZXNzZXJlIG1hZ2dpb3JlIGRpIHplcm8ifSwKLSAgICAgICAgeyJwcm92TmFtZS5ub3QuYS5wcm92aWRlciIsICJ7MH0gbm9uIFx1MDBFOCB1biBwcm92aWRlciJ9LAotICAgICAgICB7IlVzYWdlLmVycm9yLm5vLmNvbW1hbmQucHJvdmlkZWQiLCAiRXJyb3JlIGRpIHV0aWxpenpvOiBuZXNzdW4gY29tYW5kbyBzcGVjaWZpY2F0byJ9LAotICAgICAgICB7IlNvdXJjZS5rZXlzdG9yZS5maWxlLmV4aXN0cy5idXQuaXMuZW1wdHkuIiwgIklsIGZpbGUga2V5c3RvcmUgZGkgb3JpZ2luZSBlc2lzdGUsIG1hIFx1MDBFOCB2dW90bzogIn0sCi0gICAgICAgIHsiUGxlYXNlLnNwZWNpZnkuc3Jja2V5c3RvcmUiLCAiU3BlY2lmaWNhcmUgLXNyY2tleXN0b3JlIn0sCi0gICAgICAgIHsiTXVzdC5ub3Quc3BlY2lmeS5ib3RoLnYuYW5kLnJmYy53aXRoLmxpc3QuY29tbWFuZCIsCi0gICAgICAgICAgICAgICAgIkltcG9zc2liaWxlIHNwZWNpZmljYXJlIHNpYSAtdiBzaWEgLXJmYyBjb24gaWwgY29tYW5kbyAnbGlzdCcifSwKLSAgICAgICAgeyJLZXkucGFzc3dvcmQubXVzdC5iZS5hdC5sZWFzdC42LmNoYXJhY3RlcnMiLAotICAgICAgICAgICAgICAgICJMYSBwYXNzd29yZCBkZWxsYSBjaGlhdmUgZGV2ZSBjb250ZW5lcmUgYWxtZW5vIDYgY2FyYXR0ZXJpIn0sCi0gICAgICAgIHsiTmV3LnBhc3N3b3JkLm11c3QuYmUuYXQubGVhc3QuNi5jaGFyYWN0ZXJzIiwKLSAgICAgICAgICAgICAgICAiTGEgbnVvdmEgcGFzc3dvcmQgZGV2ZSBjb250ZW5lcmUgYWxtZW5vIDYgY2FyYXR0ZXJpIn0sCi0gICAgICAgIHsiS2V5c3RvcmUuZmlsZS5leGlzdHMuYnV0LmlzLmVtcHR5LiIsCi0gICAgICAgICAgICAgICAgIklsIGZpbGUga2V5c3RvcmUgZXNpc3RlIG1hIFx1MDBFOCB2dW90bzogIn0sCi0gICAgICAgIHsiS2V5c3RvcmUuZmlsZS5kb2VzLm5vdC5leGlzdC4iLAotICAgICAgICAgICAgICAgICJJbCBmaWxlIGtleXN0b3JlIG5vbiBlc2lzdGU6ICJ9LAotICAgICAgICB7Ik11c3Quc3BlY2lmeS5kZXN0aW5hdGlvbi5hbGlhcyIsICJcdTAwQzggbmVjZXNzYXJpbyBzcGVjaWZpY2FyZSBsJ2FsaWFzIGRpIGRlc3RpbmF6aW9uZSJ9LAotICAgICAgICB7Ik11c3Quc3BlY2lmeS5hbGlhcyIsICJcdTAwQzggbmVjZXNzYXJpbyBzcGVjaWZpY2FyZSBsJ2FsaWFzIn0sCi0gICAgICAgIHsiS2V5c3RvcmUucGFzc3dvcmQubXVzdC5iZS5hdC5sZWFzdC42LmNoYXJhY3RlcnMiLAotICAgICAgICAgICAgICAgICJMYSBwYXNzd29yZCBkZWwga2V5c3RvcmUgZGV2ZSBjb250ZW5lcmUgYWxtZW5vIDYgY2FyYXR0ZXJpIn0sCi0gICAgICAgIHsiRW50ZXIua2V5c3RvcmUucGFzc3dvcmQuIiwgIkltbWV0dGVyZSBsYSBwYXNzd29yZCBkZWwga2V5c3RvcmU6ICAifSwKLSAgICAgICAgeyJFbnRlci5zb3VyY2Uua2V5c3RvcmUucGFzc3dvcmQuIiwgIkltbWV0dGVyZSBsYSBwYXNzd29yZCBkZWwga2V5c3RvcmUgZGkgb3JpZ2luZTogICJ9LAotICAgICAgICB7IkVudGVyLmRlc3RpbmF0aW9uLmtleXN0b3JlLnBhc3N3b3JkLiIsICJJbW1ldHRlcmUgbGEgcGFzc3dvcmQgZGVsIGtleXN0b3JlIGRpIGRlc3RpbmF6aW9uZTogICJ9LAotICAgICAgICB7IktleXN0b3JlLnBhc3N3b3JkLmlzLnRvby5zaG9ydC5tdXN0LmJlLmF0LmxlYXN0LjYuY2hhcmFjdGVycyIsCi0gICAgICAgICAiTGEgcGFzc3dvcmQgZGVsIGtleXN0b3JlIFx1MDBFOCB0cm9wcG8gY29ydGEgLSBkZXZlIGNvbnRlbmVyZSBhbG1lbm8gNiBjYXJhdHRlcmkifSwKLSAgICAgICAgeyJVbmtub3duLkVudHJ5LlR5cGUiLCAiVGlwbyBkaSB2b2NlIHNjb25vc2NpdXRvIn0sCi0gICAgICAgIHsiVG9vLm1hbnkuZmFpbHVyZXMuQWxpYXMubm90LmNoYW5nZWQiLCAiTnVtZXJvIGVjY2Vzc2l2byBkaSBlcnJvcmkuIEwnYWxpYXMgbm9uIFx1MDBFOCBzdGF0byBtb2RpZmljYXRvLiJ9LAotICAgICAgICB7IkVudHJ5LmZvci5hbGlhcy5hbGlhcy5zdWNjZXNzZnVsbHkuaW1wb3J0ZWQuIiwKLSAgICAgICAgICAgICAgICAgIkxhIHZvY2UgZGVsbCcnYWxpYXMgezB9IFx1MDBFOCBzdGF0YSBpbXBvcnRhdGEuIn0sCi0gICAgICAgIHsiRW50cnkuZm9yLmFsaWFzLmFsaWFzLm5vdC5pbXBvcnRlZC4iLCAiTGEgdm9jZSBkZWxsJydhbGlhcyB7MH0gbm9uIFx1MDBFOCBzdGF0YSBpbXBvcnRhdGEuIn0sCi0gICAgICAgIHsiUHJvYmxlbS5pbXBvcnRpbmcuZW50cnkuZm9yLmFsaWFzLmFsaWFzLmV4Y2VwdGlvbi5FbnRyeS5mb3IuYWxpYXMuYWxpYXMubm90LmltcG9ydGVkLiIsCi0gICAgICAgICAgICAgICAgICJTaSBcdTAwRTggdmVyaWZpY2F0byB1biBwcm9ibGVtYSBkdXJhbnRlIGwnJ2ltcG9ydGF6aW9uZSBkZWxsYSB2b2NlIGRlbGwnJ2FsaWFzIHswfTogezF9LlxuTGEgdm9jZSBkZWxsJydhbGlhcyB7MH0gbm9uIFx1MDBFOCBzdGF0YSBpbXBvcnRhdGEuIn0sCi0gICAgICAgIHsiSW1wb3J0LmNvbW1hbmQuY29tcGxldGVkLm9rLmVudHJpZXMuc3VjY2Vzc2Z1bGx5LmltcG9ydGVkLmZhaWwuZW50cmllcy5mYWlsZWQub3IuY2FuY2VsbGVkIiwKLSAgICAgICAgICAgICAgICAgIkNvbWFuZG8gZGkgaW1wb3J0YXppb25lIGNvbXBsZXRhdG86IHswfSB2b2NlL2kgaW1wb3J0YXRhL2UsIHsxfSB2b2NlL2kgbm9uIGltcG9ydGF0YS9lIG8gYW5udWxsYXRhL2UifSwKLSAgICAgICAgeyJXYXJuaW5nLk92ZXJ3cml0aW5nLmV4aXN0aW5nLmFsaWFzLmFsaWFzLmluLmRlc3RpbmF0aW9uLmtleXN0b3JlIiwKLSAgICAgICAgICAgICAgICAgIkF2dmVydGVuemE6IHNvdnJhc2NyaXR0dXJhIGluIGNvcnNvIGRlbGwnJ2FsaWFzIHswfSBuZWwgZmlsZSBrZXlzdG9yZSBkaSBkZXN0aW5hemlvbmUifSwKLSAgICAgICAgeyJFeGlzdGluZy5lbnRyeS5hbGlhcy5hbGlhcy5leGlzdHMub3ZlcndyaXRlLm5vLiIsCi0gICAgICAgICAgICAgICAgICJMYSB2b2NlIGRlbGwnJ2FsaWFzIHswfSBlc2lzdGUgZ2lcdTAwRTAuIFNvdnJhc2NyaXZlcmU/IFtub106ICAifSwKLSAgICAgICAgeyJUb28ubWFueS5mYWlsdXJlcy50cnkubGF0ZXIiLCAiVHJvcHBpIGVycm9yaSAtIHJpcHJvdmFyZSJ9LAotICAgICAgICB7IkNlcnRpZmljYXRpb24ucmVxdWVzdC5zdG9yZWQuaW4uZmlsZS5maWxlbmFtZS4iLAotICAgICAgICAgICAgICAgICJMYSByaWNoaWVzdGEgZGkgY2VydGlmaWNhemlvbmUgXHUwMEU4IG1lbW9yaXp6YXRhIG5lbCBmaWxlIDx7MH0+In0sCi0gICAgICAgIHsiU3VibWl0LnRoaXMudG8ueW91ci5DQSIsICJTb3R0b21ldHRlcmUgYWxsYSBwcm9wcmlhIENBIn0sCi0gICAgICAgIHsiaWYuYWxpYXMubm90LnNwZWNpZmllZC5kZXN0YWxpYXMuc3Jja2V5cGFzcy5hbmQuZGVzdGtleXBhc3MubXVzdC5ub3QuYmUuc3BlY2lmaWVkIiwKLSAgICAgICAgICAgICJTZSBsJ2FsaWFzIG5vbiBcdTAwRTggc3BlY2lmaWNhdG8sIGRlc3RhbGlhcywgc3Jja2V5cGFzcyBlIGRlc3RrZXlwYXNzIG5vbiBkb3ZyYW5ubyBlc3NlcmUgc3BlY2lmaWNhdGkifSwKLSAgICAgICAgeyJDZXJ0aWZpY2F0ZS5zdG9yZWQuaW4uZmlsZS5maWxlbmFtZS4iLAotICAgICAgICAgICAgICAgICJJbCBjZXJ0aWZpY2F0byBcdTAwRTggbWVtb3JpenphdG8gbmVsIGZpbGUgPHswfT4ifSwKLSAgICAgICAgeyJDZXJ0aWZpY2F0ZS5yZXBseS53YXMuaW5zdGFsbGVkLmluLmtleXN0b3JlIiwKLSAgICAgICAgICAgICAgICAiTGEgcmlzcG9zdGEgZGVsIGNlcnRpZmljYXRvIFx1MDBFOCBzdGF0YSBpbnN0YWxsYXRhIG5lbCBrZXlzdG9yZSJ9LAotICAgICAgICB7IkNlcnRpZmljYXRlLnJlcGx5Lndhcy5ub3QuaW5zdGFsbGVkLmluLmtleXN0b3JlIiwKLSAgICAgICAgICAgICAgICAiTGEgcmlzcG9zdGEgZGVsIGNlcnRpZmljYXRvIG5vbiBcdTAwRTggc3RhdGEgaW5zdGFsbGF0YSBuZWwga2V5c3RvcmUifSwKLSAgICAgICAgeyJDZXJ0aWZpY2F0ZS53YXMuYWRkZWQudG8ua2V5c3RvcmUiLAotICAgICAgICAgICAgICAgICJJbCBjZXJ0aWZpY2F0byBcdTAwRTggc3RhdG8gYWdnaXVudG8gYWwga2V5c3RvcmUifSwKLSAgICAgICAgeyJDZXJ0aWZpY2F0ZS53YXMubm90LmFkZGVkLnRvLmtleXN0b3JlIiwKLSAgICAgICAgICAgICAgICAiSWwgY2VydGlmaWNhdG8gbm9uIFx1MDBFOCBzdGF0byBhZ2dpdW50byBhbCBrZXlzdG9yZSJ9LAotICAgICAgICB7Ii5TdG9yaW5nLmtzZm5hbWUuIiwgIltNZW1vcml6emF6aW9uZSBkaSB7MH1dIGluIGNvcnNvIn0sCi0gICAgICAgIHsiYWxpYXMuaGFzLm5vLnB1YmxpYy5rZXkuY2VydGlmaWNhdGUuIiwKLSAgICAgICAgICAgICAgICAiezB9IG5vbiBkaXNwb25lIGRpIGNoaWF2ZSBwdWJibGljYSAoY2VydGlmaWNhdG8pIn0sCi0gICAgICAgIHsiQ2Fubm90LmRlcml2ZS5zaWduYXR1cmUuYWxnb3JpdGhtIiwKLSAgICAgICAgICAgICAgICAiSW1wb3NzaWJpbGUgZGVyaXZhcmUgbCdhbGdvcml0bW8gZGkgZmlybWEifSwKLSAgICAgICAgeyJBbGlhcy5hbGlhcy5kb2VzLm5vdC5leGlzdCIsCi0gICAgICAgICAgICAgICAgIkwnJ2FsaWFzIDx7MH0+IG5vbiBlc2lzdGUifSwKLSAgICAgICAgeyJBbGlhcy5hbGlhcy5oYXMubm8uY2VydGlmaWNhdGUiLAotICAgICAgICAgICAgICAgICJMJydhbGlhcyA8ezB9PiBub24gZGlzcG9uZSBkaSBjZXJ0aWZpY2F0byJ9LAotICAgICAgICB7IktleS5wYWlyLm5vdC5nZW5lcmF0ZWQuYWxpYXMuYWxpYXMuYWxyZWFkeS5leGlzdHMiLAotICAgICAgICAgICAgICAgICJOb24gXHUwMEU4IHN0YXRhIGdlbmVyYXRhIGxhIGNvcHBpYSBkaSBjaGlhdmksIGwnJ2FsaWFzIDx7MH0+IFx1MDBFOCBnaVx1MDBFMCBlc2lzdGVudGUifSwKLSAgICAgICAgeyJHZW5lcmF0aW5nLmtleXNpemUuYml0LmtleUFsZ05hbWUua2V5LnBhaXIuYW5kLnNlbGYuc2lnbmVkLmNlcnRpZmljYXRlLnNpZ0FsZ05hbWUud2l0aC5hLnZhbGlkaXR5Lm9mLnZhbGlkYWxpdHkuZGF5cy5mb3IiLAotICAgICAgICAgICAgICAgICJHZW5lcmF6aW9uZSBpbiBjb3JzbyBkaSB1bmEgY29wcGlhIGRpIGNoaWF2aSB7MX0gZGEgezB9IGJpdCBlIGRpIHVuIGNlcnRpZmljYXRvIGF1dG9maXJtYXRvICh7Mn0pIGNvbiB1bmEgdmFsaWRpdFx1MDBFMCBkaSB7M30gZ2lvcm5pXG5cdHBlcjogezR9In0sCi0gICAgICAgIHsiRW50ZXIua2V5LnBhc3N3b3JkLmZvci5hbGlhcy4iLCAiSW1tZXR0ZXJlIGxhIHBhc3N3b3JkIGRlbGxhIGNoaWF2ZSBwZXIgPHswfT4ifSwKLSAgICAgICAgeyIuUkVUVVJOLmlmLnNhbWUuYXMua2V5c3RvcmUucGFzc3dvcmQuIiwKLSAgICAgICAgICAgICAgICAiXHQoSU5WSU8gc2UgY29ycmlzcG9uZGUgYWxsYSBwYXNzd29yZCBkZWwga2V5c3RvcmUpOiAgIn0sCi0gICAgICAgIHsiS2V5LnBhc3N3b3JkLmlzLnRvby5zaG9ydC5tdXN0LmJlLmF0LmxlYXN0LjYuY2hhcmFjdGVycyIsCi0gICAgICAgICAgICAgICAgIkxhIHBhc3N3b3JkIGRlbGxhIGNoaWF2ZSBcdTAwRTggdHJvcHBvIGNvcnRhIC0gZGV2ZSBjb250ZW5lcmUgYWxtZW5vIDYgY2FyYXR0ZXJpIn0sCi0gICAgICAgIHsiVG9vLm1hbnkuZmFpbHVyZXMua2V5Lm5vdC5hZGRlZC50by5rZXlzdG9yZSIsCi0gICAgICAgICAgICAgICAgIlRyb3BwaSBlcnJvcmkgLSBsYSBjaGlhdmUgbm9uIFx1MDBFOCBzdGF0YSBhZ2dpdW50YSBhbCBrZXlzdG9yZSJ9LAotICAgICAgICB7IkRlc3RpbmF0aW9uLmFsaWFzLmRlc3QuYWxyZWFkeS5leGlzdHMiLAotICAgICAgICAgICAgICAgICJMJydhbGlhcyBkaSBkZXN0aW5hemlvbmUgPHswfT4gXHUwMEU4IGdpXHUwMEUwIGVzaXN0ZW50ZSJ9LAotICAgICAgICB7IlBhc3N3b3JkLmlzLnRvby5zaG9ydC5tdXN0LmJlLmF0LmxlYXN0LjYuY2hhcmFjdGVycyIsCi0gICAgICAgICAgICAgICAgIkxhIHBhc3N3b3JkIFx1MDBFOCB0cm9wcG8gY29ydGEgLSBkZXZlIGNvbnRlbmVyZSBhbG1lbm8gNiBjYXJhdHRlcmkifSwKLSAgICAgICAgeyJUb28ubWFueS5mYWlsdXJlcy5LZXkuZW50cnkubm90LmNsb25lZCIsCi0gICAgICAgICAgICAgICAgIk51bWVybyBlY2Nlc3Npdm8gZGkgZXJyb3JpLiBJbCB2YWxvcmUgZGVsbGEgY2hpYXZlIG5vbiBcdTAwRTggc3RhdG8gY29waWF0by4ifSwKLSAgICAgICAgeyJrZXkucGFzc3dvcmQuZm9yLmFsaWFzLiIsICJwYXNzd29yZCBkZWxsYSBjaGlhdmUgcGVyIDx7MH0+In0sCi0gICAgICAgIHsiS2V5c3RvcmUuZW50cnkuZm9yLmlkLmdldE5hbWUuYWxyZWFkeS5leGlzdHMiLAotICAgICAgICAgICAgICAgICJMYSB2b2NlIGRlbCBrZXlzdG9yZSBwZXIgPHswfT4gZXNpc3RlIGdpXHUwMEUwIn0sCi0gICAgICAgIHsiQ3JlYXRpbmcua2V5c3RvcmUuZW50cnkuZm9yLmlkLmdldE5hbWUuIiwKLSAgICAgICAgICAgICAgICAiQ3JlYXppb25lIGRlbGxhIHZvY2UgZGVsIGtleXN0b3JlIHBlciA8ezB9PiBpbiBjb3Jzby4uLiJ9LAotICAgICAgICB7Ik5vLmVudHJpZXMuZnJvbS5pZGVudGl0eS5kYXRhYmFzZS5hZGRlZCIsCi0gICAgICAgICAgICAgICAgIk5lc3N1bmEgdm9jZSBhZ2dpdW50YSBkYWwgZGF0YWJhc2UgZGVsbGUgaWRlbnRpdFx1MDBFMCJ9LAotICAgICAgICB7IkFsaWFzLm5hbWUuYWxpYXMiLCAiTm9tZSBhbGlhczogezB9In0sCi0gICAgICAgIHsiQ3JlYXRpb24uZGF0ZS5rZXlTdG9yZS5nZXRDcmVhdGlvbkRhdGUuYWxpYXMuIiwKLSAgICAgICAgICAgICAgICAiRGF0YSBkaSBjcmVhemlvbmU6IHswLGRhdGV9In0sCi0gICAgICAgIHsiYWxpYXMua2V5U3RvcmUuZ2V0Q3JlYXRpb25EYXRlLmFsaWFzLiIsCi0gICAgICAgICAgICAgICAgInswfSwgezEsZGF0ZX0sICJ9LAotICAgICAgICB7ImFsaWFzLiIsICJ7MH0sICJ9LAotICAgICAgICB7IkVudHJ5LnR5cGUudHlwZS4iLCAiVGlwbyBkaSB2b2NlOiB7MH0ifSwKLSAgICAgICAgeyJDZXJ0aWZpY2F0ZS5jaGFpbi5sZW5ndGguIiwgIkx1bmdoZXp6YSBjYXRlbmEgY2VydGlmaWNhdGk6ICJ9LAotICAgICAgICB7IkNlcnRpZmljYXRlLmkuMS4iLCAiQ2VydGlmaWNhdG9bezAsbnVtYmVyLGludGVnZXJ9XToifSwKLSAgICAgICAgeyJDZXJ0aWZpY2F0ZS5maW5nZXJwcmludC5TSEExLiIsICJJbXByb250YSBkaWdpdGFsZSBjZXJ0aWZpY2F0byAoU0hBMSk6ICJ9LAotICAgICAgICB7IktleXN0b3JlLnR5cGUuIiwgIlRpcG8ga2V5c3RvcmU6ICJ9LAotICAgICAgICB7IktleXN0b3JlLnByb3ZpZGVyLiIsICJQcm92aWRlciBrZXlzdG9yZTogIn0sCi0gICAgICAgIHsiWW91ci5rZXlzdG9yZS5jb250YWlucy5rZXlTdG9yZS5zaXplLmVudHJ5IiwKLSAgICAgICAgICAgICAgICAiSWwga2V5c3RvcmUgY29udGllbmUgezAsbnVtYmVyLGludGVnZXJ9IHZvY2UifSwKLSAgICAgICAgeyJZb3VyLmtleXN0b3JlLmNvbnRhaW5zLmtleVN0b3JlLnNpemUuZW50cmllcyIsCi0gICAgICAgICAgICAgICAgIklsIGtleXN0b3JlIGNvbnRpZW5lIHswLG51bWJlcixpbnRlZ2VyfSB2b2NpIn0sCi0gICAgICAgIHsiRmFpbGVkLnRvLnBhcnNlLmlucHV0IiwgIkltcG9zc2liaWxlIGFuYWxpenphcmUgbCdpbnB1dCJ9LAotICAgICAgICB7IkVtcHR5LmlucHV0IiwgIklucHV0IHZ1b3RvIn0sCi0gICAgICAgIHsiTm90LlguNTA5LmNlcnRpZmljYXRlIiwgIklsIGNlcnRpZmljYXRvIG5vbiBcdTAwRTggWC41MDkifSwKLSAgICAgICAgeyJhbGlhcy5oYXMubm8ucHVibGljLmtleSIsICJ7MH0gbm9uIGRpc3BvbmUgZGkgY2hpYXZlIHB1YmJsaWNhIn0sCi0gICAgICAgIHsiYWxpYXMuaGFzLm5vLlguNTA5LmNlcnRpZmljYXRlIiwgInswfSBub24gZGlzcG9uZSBkaSBjZXJ0aWZpY2F0byBYLjUwOSJ9LAotICAgICAgICB7Ik5ldy5jZXJ0aWZpY2F0ZS5zZWxmLnNpZ25lZC4iLCAiTnVvdm8gY2VydGlmaWNhdG8gKGF1dG9maXJtYXRvKToifSwKLSAgICAgICAgeyJSZXBseS5oYXMubm8uY2VydGlmaWNhdGVzIiwgIkxhIHJpc3Bvc3RhIG5vbiBkaXNwb25lIGRpIGNlcnRpZmljYXRpIn0sCi0gICAgICAgIHsiQ2VydGlmaWNhdGUubm90LmltcG9ydGVkLmFsaWFzLmFsaWFzLmFscmVhZHkuZXhpc3RzIiwKLSAgICAgICAgICAgICAgICAiSW1wb3NzaWJpbGUgaW1wb3J0YXJlIGlsIGNlcnRpZmljYXRvLCBsJydhbGlhcyA8ezB9PiBcdTAwRTggZ2lcdTAwRTAgZXNpc3RlbnRlIn0sCi0gICAgICAgIHsiSW5wdXQubm90LmFuLlguNTA5LmNlcnRpZmljYXRlIiwgIkwnaW5wdXQgbm9uIFx1MDBFOCB1biBjZXJ0aWZpY2F0byBYLjUwOSJ9LAotICAgICAgICB7IkNlcnRpZmljYXRlLmFscmVhZHkuZXhpc3RzLmluLmtleXN0b3JlLnVuZGVyLmFsaWFzLnRydXN0YWxpYXMuIiwKLSAgICAgICAgICAgICAgICAiSWwgY2VydGlmaWNhdG8gZXNpc3RlIGdpXHUwMEUwIG5lbCBrZXlzdG9yZSBjb24gYWxpYXMgPHswfT4ifSwKLSAgICAgICAgeyJEby55b3Uuc3RpbGwud2FudC50by5hZGQuaXQubm8uIiwKLSAgICAgICAgICAgICAgICAiQWdnaXVuZ2VybG8gdWd1YWxtZW50ZT8gW25vXTogICJ9LAotICAgICAgICB7IkNlcnRpZmljYXRlLmFscmVhZHkuZXhpc3RzLmluLnN5c3RlbS53aWRlLkNBLmtleXN0b3JlLnVuZGVyLmFsaWFzLnRydXN0YWxpYXMuIiwKLSAgICAgICAgICAgICAgICAiSWwgY2VydGlmaWNhdG8gZXNpc3RlIGdpXHUwMEUwIG5lbCBrZXlzdG9yZSBDQSBjb24gYWxpYXMgPHswfT4ifSwKLSAgICAgICAgeyJEby55b3Uuc3RpbGwud2FudC50by5hZGQuaXQudG8ueW91ci5vd24ua2V5c3RvcmUubm8uIiwKLSAgICAgICAgICAgICAgICAiQWdnaXVuZ2VybG8gYWwgcHJvcHJpbyBrZXlzdG9yZT8gW25vXTogICJ9LAotICAgICAgICB7IlRydXN0LnRoaXMuY2VydGlmaWNhdGUubm8uIiwgIkNvbnNpZGVyYXJlIHNpY3VybyBxdWVzdG8gY2VydGlmaWNhdG8/IFtub106ICAifSwKLSAgICAgICAgeyJZRVMiLCAiU1x1MDBFQyJ9LAotICAgICAgICB7Ik5ldy5wcm9tcHQuIiwgIk51b3ZhIHswfTogIn0sCi0gICAgICAgIHsiUGFzc3dvcmRzLm11c3QuZGlmZmVyIiwgIkxlIHBhc3N3b3JkIG5vbiBkZXZvbm8gY29pbmNpZGVyZSJ9LAotICAgICAgICB7IlJlLmVudGVyLm5ldy5wcm9tcHQuIiwgIlJlaW1tZXR0ZXJlIHVuIG51b3ZvIHZhbG9yZSBwZXIgezB9OiAifSwKLSAgICAgICAgeyJSZS5lbnRlci5uZXcucGFzc3dvcmQuIiwgIkltbWV0dGVyZSBudW92YW1lbnRlIGxhIG51b3ZhIHBhc3N3b3JkOiAifSwKLSAgICAgICAgeyJUaGV5LmRvbi50Lm1hdGNoLlRyeS5hZ2FpbiIsICJOb24gY29ycmlzcG9uZG9uby4gUmlwcm92YXJlLiJ9LAotICAgICAgICB7IkVudGVyLnByb21wdC5hbGlhcy5uYW1lLiIsICJJbW1ldHRlcmUgbm9tZSBhbGlhcyB7MH06ICAifSwKLSAgICAgICAgeyJFbnRlci5uZXcuYWxpYXMubmFtZS5SRVRVUk4udG8uY2FuY2VsLmltcG9ydC5mb3IudGhpcy5lbnRyeS4iLAotICAgICAgICAgICAgICAgICAiSW1tZXR0ZXJlIHVuIG51b3ZvIG5vbWUgYWxpYXNcdChwcmVtZXJlIElOVklPIHBlciBhbm51bGxhcmUgbCdpbXBvcnRhemlvbmUgZGVsbGEgdm9jZSk6ICAifSwKLSAgICAgICAgeyJFbnRlci5hbGlhcy5uYW1lLiIsICJJbW1ldHRlcmUgbm9tZSBhbGlhczogICJ9LAotICAgICAgICB7Ii5SRVRVUk4uaWYuc2FtZS5hcy5mb3Iub3RoZXJBbGlhcy4iLAotICAgICAgICAgICAgICAgICJcdChJTlZJTyBzZSBjb3JyaXNwb25kZSBhbCBub21lIGRpIDx7MH0+In0sCi0gICAgICAgIHsiLlBBVFRFUk4ucHJpbnRYNTA5Q2VydCIsCi0gICAgICAgICAgICAgICAgIlByb3ByaWV0YXJpbzogezB9XG5BdXRvcml0XHUwMEUwIGVtaXR0ZW50ZTogezF9XG5OdW1lcm8gZGkgc2VyaWU6IHsyfVxuVmFsaWRvIGRhOiB7M30gYTogezR9XG5JbXByb250ZSBkaWdpdGFsaSBjZXJ0aWZpY2F0bzpcblx0IE1ENTogIHs1fVxuXHQgU0hBMTogezZ9XG5cdCBTSEEyNTY6IHs3fVxuXHQgTm9tZSBhbGdvcml0bW8gZmlybWE6IHs4fVxuXHQgVmVyc2lvbmU6IHs5fSJ9LAotICAgICAgICB7IldoYXQuaXMueW91ci5maXJzdC5hbmQubGFzdC5uYW1lLiIsCi0gICAgICAgICAgICAgICAgIlNwZWNpZmljYXJlIG5vbWUgZSBjb2dub21lIn0sCi0gICAgICAgIHsiV2hhdC5pcy50aGUubmFtZS5vZi55b3VyLm9yZ2FuaXphdGlvbmFsLnVuaXQuIiwKLSAgICAgICAgICAgICAgICAiU3BlY2lmaWNhcmUgaWwgbm9tZSBkZWxsJ3VuaXRcdTAwRTAgb3JnYW5penphdGl2YSJ9LAotICAgICAgICB7IldoYXQuaXMudGhlLm5hbWUub2YueW91ci5vcmdhbml6YXRpb24uIiwKLSAgICAgICAgICAgICAgICAiU3BlY2lmaWNhcmUgaWwgbm9tZSBkZWxsJ29yZ2FuaXp6YXppb25lIn0sCi0gICAgICAgIHsiV2hhdC5pcy50aGUubmFtZS5vZi55b3VyLkNpdHkub3IuTG9jYWxpdHkuIiwKLSAgICAgICAgICAgICAgICAiU3BlY2lmaWNhcmUgbGEgbG9jYWxpdFx1MDBFMCJ9LAotICAgICAgICB7IldoYXQuaXMudGhlLm5hbWUub2YueW91ci5TdGF0ZS5vci5Qcm92aW5jZS4iLAotICAgICAgICAgICAgICAgICJTcGVjaWZpY2FyZSBsYSBwcm92aW5jaWEifSwKLSAgICAgICAgeyJXaGF0LmlzLnRoZS50d28ubGV0dGVyLmNvdW50cnkuY29kZS5mb3IudGhpcy51bml0LiIsCi0gICAgICAgICAgICAgICAgIlNwZWNpZmljYXJlIGlsIGNvZGljZSBhIGR1ZSBsZXR0ZXJlIGRlbCBwYWVzZSBpbiBjdWkgc2kgdHJvdmEgbCd1bml0XHUwMEUwIn0sCi0gICAgICAgIHsiSXMubmFtZS5jb3JyZWN0LiIsICJJbCBkYXRvIHswfSBcdTAwRTggY29ycmV0dG8/In0sCi0gICAgICAgIHsibm8iLCAibm8ifSwKLSAgICAgICAgeyJ5ZXMiLCAic1x1MDBFQyJ9LAotICAgICAgICB7InkiLCAicyJ9LAotICAgICAgICB7Ii5kZWZhdWx0VmFsdWUuIiwgIiAgW3swfV06ICAifSwKLSAgICAgICAgeyJBbGlhcy5hbGlhcy5oYXMubm8ua2V5IiwKLSAgICAgICAgICAgICAgICAiQWxsJydhbGlhcyA8ezB9PiBub24gXHUwMEU4IGFzc29jaWF0YSBhbGN1bmEgY2hpYXZlIn0sCi0gICAgICAgIHsiQWxpYXMuYWxpYXMucmVmZXJlbmNlcy5hbi5lbnRyeS50eXBlLnRoYXQuaXMubm90LmEucHJpdmF0ZS5rZXkuZW50cnkuVGhlLmtleWNsb25lLmNvbW1hbmQub25seS5zdXBwb3J0cy5jbG9uaW5nLm9mLnByaXZhdGUua2V5IiwKLSAgICAgICAgICAgICAgICAgIkwnJ2FsaWFzIDx7MH0+IGZhIHJpZmVyaW1lbnRvIGEgdW4gdGlwbyBkaSB2b2NlIGNoZSBub24gXHUwMEU4IHVuYSB2b2NlIGRpIGNoaWF2ZSBwcml2YXRhLiBJbCBjb21hbmRvIC1rZXljbG9uZSBzdXBwb3J0YSBzb2xvIGxhIGNvcGlhIGRlbGxlIHZvY2kgZGkgY2hpYXZlIHByaXZhdGUuIn0sCi0KLSAgICAgICAgeyIuV0FSTklORy5XQVJOSU5HLldBUk5JTkcuIiwKLSAgICAgICAgICAgICIqKioqKioqKioqKioqKioqKiAgQXZ2ZXJ0ZW56YSBBdnZlcnRlbnphIEF2dmVydGVuemEgICoqKioqKioqKioqKioqKioqIn0sCi0gICAgICAgIHsiU2lnbmVyLmQuIiwgIkZpcm1hdGFyaW8gIyVkOiJ9LAotICAgICAgICB7IlRpbWVzdGFtcC4iLCAiSW5kaWNhdG9yZSBvcmFyaW86In0sCi0gICAgICAgIHsiU2lnbmF0dXJlLiIsICJGaXJtYToifSwKLSAgICAgICAgeyJDUkxzLiIsICJDUkw6In0sCi0gICAgICAgIHsiQ2VydGlmaWNhdGUub3duZXIuIiwgIlByb3ByaWV0YXJpbyBjZXJ0aWZpY2F0bzogIn0sCi0gICAgICAgIHsiTm90LmEuc2lnbmVkLmphci5maWxlIiwgIk5vbiBcdTAwRTggdW4gZmlsZSBqYXIgZmlybWF0byJ9LAotICAgICAgICB7Ik5vLmNlcnRpZmljYXRlLmZyb20udGhlLlNTTC5zZXJ2ZXIiLAotICAgICAgICAgICAgICAgICJOZXNzdW4gY2VydGlmaWNhdG8gZGFsIHNlcnZlciBTU0wifSwKLQotICAgICAgICB7Ii5UaGUuaW50ZWdyaXR5Lm9mLnRoZS5pbmZvcm1hdGlvbi5zdG9yZWQuaW4ueW91ci5rZXlzdG9yZS4iLAotICAgICAgICAgICAgIiogTCdpbnRlZ3JpdFx1MDBFMCBkZWxsZSBpbmZvcm1hemlvbmkgbWVtb3JpenphdGUgbmVsIGtleXN0b3JlICpcbiogTk9OIFx1MDBFOCBzdGF0YSB2ZXJpZmljYXRhLiBQZXIgdmVyaWZpY2FybmUgbCdpbnRlZ3JpdFx1MDBFMCAqXG4qIFx1MDBFOCBuZWNlc3NhcmlvIGZvcm5pcmUgbGEgcGFzc3dvcmQgZGVsIGtleXN0b3JlLiAgICAgICAgICAgICAgICAgICoifSwKLSAgICAgICAgeyIuVGhlLmludGVncml0eS5vZi50aGUuaW5mb3JtYXRpb24uc3RvcmVkLmluLnRoZS5zcmNrZXlzdG9yZS4iLAotICAgICAgICAgICAgIiogTCdpbnRlZ3JpdFx1MDBFMCBkZWxsZSBpbmZvcm1hemlvbmkgbWVtb3JpenphdGUgbmVsIHNyY2tleXN0b3JlICpcbiogTk9OIFx1MDBFOCBzdGF0YSB2ZXJpZmljYXRhLiBQZXIgdmVyaWZpY2FybmUgbCdpbnRlZ3JpdFx1MDBFMCAqXG4qIFx1MDBFOCBuZWNlc3NhcmlvIGZvcm5pcmUgbGEgcGFzc3dvcmQgZGVsIHNyY2tleXN0b3JlLiAgICAgICAgICAgICAgICAgICoifSwKLQotICAgICAgICB7IkNlcnRpZmljYXRlLnJlcGx5LmRvZXMubm90LmNvbnRhaW4ucHVibGljLmtleS5mb3IuYWxpYXMuIiwKLSAgICAgICAgICAgICAgICAiTGEgcmlzcG9zdGEgZGVsIGNlcnRpZmljYXRvIG5vbiBjb250aWVuZSBsYSBjaGlhdmUgcHViYmxpY2EgcGVyIDx7MH0+In0sCi0gICAgICAgIHsiSW5jb21wbGV0ZS5jZXJ0aWZpY2F0ZS5jaGFpbi5pbi5yZXBseSIsCi0gICAgICAgICAgICAgICAgIkNhdGVuYSBkZWkgY2VydGlmaWNhdGkgaW5jb21wbGV0YSBuZWxsYSByaXNwb3N0YSJ9LAotICAgICAgICB7IkNlcnRpZmljYXRlLmNoYWluLmluLnJlcGx5LmRvZXMubm90LnZlcmlmeS4iLAotICAgICAgICAgICAgICAgICJMYSBjYXRlbmEgZGVpIGNlcnRpZmljYXRpIG5lbGxhIHJpc3Bvc3RhIG5vbiB2ZXJpZmljYTogIn0sCi0gICAgICAgIHsiVG9wLmxldmVsLmNlcnRpZmljYXRlLmluLnJlcGx5LiIsCi0gICAgICAgICAgICAgICAgIkNlcnRpZmljYXRvIGRpIHByaW1vIGxpdmVsbG8gbmVsbGEgcmlzcG9zdGE6XG4ifSwKLSAgICAgICAgeyIuaXMubm90LnRydXN0ZWQuIiwgIi4uLm5vbiBcdTAwRTggY29uc2lkZXJhdG8gc2ljdXJvLiAifSwKLSAgICAgICAgeyJJbnN0YWxsLnJlcGx5LmFueXdheS5uby4iLCAiSW5zdGFsbGFyZSBsYSByaXNwb3N0YT8gW25vXTogICJ9LAotICAgICAgICB7Ik5PIiwgIk5vIn0sCi0gICAgICAgIHsiUHVibGljLmtleXMuaW4ucmVwbHkuYW5kLmtleXN0b3JlLmRvbi50Lm1hdGNoIiwKLSAgICAgICAgICAgICAgICAiTGUgY2hpYXZpIHB1YmJsaWNoZSBuZWxsYSByaXNwb3N0YSBlIG5lbCBrZXlzdG9yZSBub24gY29ycmlzcG9uZG9ubyJ9LAotICAgICAgICB7IkNlcnRpZmljYXRlLnJlcGx5LmFuZC5jZXJ0aWZpY2F0ZS5pbi5rZXlzdG9yZS5hcmUuaWRlbnRpY2FsIiwKLSAgICAgICAgICAgICAgICAiTGEgcmlzcG9zdGEgZGVsIGNlcnRpZmljYXRvIGUgaWwgY2VydGlmaWNhdG8gbmVsIGtleXN0b3JlIHNvbm8gaWRlbnRpY2kifSwKLSAgICAgICAgeyJGYWlsZWQudG8uZXN0YWJsaXNoLmNoYWluLmZyb20ucmVwbHkiLAotICAgICAgICAgICAgICAgICJJbXBvc3NpYmlsZSBzdGFiaWxpcmUgbGEgY2F0ZW5hIGRhbGxhIHJpc3Bvc3RhIn0sCi0gICAgICAgIHsibiIsICJuIn0sCi0gICAgICAgIHsiV3JvbmcuYW5zd2VyLnRyeS5hZ2FpbiIsICJSaXNwb3N0YSBlcnJhdGEsIHJpcHJvdmFyZSJ9LAotICAgICAgICB7IlNlY3JldC5rZXkubm90LmdlbmVyYXRlZC5hbGlhcy5hbGlhcy5hbHJlYWR5LmV4aXN0cyIsCi0gICAgICAgICAgICAgICAgIkxhIGNoaWF2ZSBzZWdyZXRhIG5vbiBcdTAwRTggc3RhdGEgZ2VuZXJhdGE7IGwnJ2FsaWFzIDx7MH0+IGVzaXN0ZSBnaVx1MDBFMCJ9LAotICAgICAgICB7IlBsZWFzZS5wcm92aWRlLmtleXNpemUuZm9yLnNlY3JldC5rZXkuZ2VuZXJhdGlvbiIsCi0gICAgICAgICAgICAgICAgIlNwZWNpZmljYXJlIGlsIHZhbG9yZSAta2V5c2l6ZSBwZXIgbGEgZ2VuZXJhemlvbmUgZGVsbGEgY2hpYXZlIHNlZ3JldGEifSwKLQotICAgICAgICB7IkV4dGVuc2lvbnMuIiwgIkVzdGVuc2lvbmk6ICJ9LAotICAgICAgICB7Ii5FbXB0eS52YWx1ZS4iLCAiKHZhbG9yZSB2dW90bykifSwKLSAgICAgICAgeyJFeHRlbnNpb24uUmVxdWVzdC4iLCAiUmljaGllc3RhIGRpIGVzdGVuc2lvbmU6In0sCi0gICAgICAgIHsiUEtDUy4xMC5DZXJ0aWZpY2F0ZS5SZXF1ZXN0LlZlcnNpb24uMS4wLlN1YmplY3Qucy5QdWJsaWMuS2V5LnMuZm9ybWF0LnMua2V5LiIsCi0gICAgICAgICAgICAgICAgIlJpY2hpZXN0YSBkaSBjZXJ0aWZpY2F0byBQS0NTICMxMCAodmVyc2lvbmUgMS4wKVxuT2dnZXR0bzogJXNcbkNoaWF2ZSBwdWJibGljYTogJXMgZm9ybWF0byAlcyBjaGlhdmVcbiJ9LAotICAgICAgICB7IlVua25vd24ua2V5VXNhZ2UudHlwZS4iLCAiVGlwbyBrZXlVc2FnZSBzY29ub3NjaXV0bzogIn0sCi0gICAgICAgIHsiVW5rbm93bi5leHRlbmRlZGtleVVzYWdlLnR5cGUuIiwgIlRpcG8gZXh0ZW5kZWRrZXlVc2FnZSBzY29ub3NjaXV0bzogIn0sCi0gICAgICAgIHsiVW5rbm93bi5BY2Nlc3NEZXNjcmlwdGlvbi50eXBlLiIsICJUaXBvIEFjY2Vzc0Rlc2NyaXB0aW9uIHNjb25vc2NpdXRvOiAifSwKLSAgICAgICAgeyJVbnJlY29nbml6ZWQuR2VuZXJhbE5hbWUudHlwZS4iLCAiVGlwbyBHZW5lcmFsTmFtZSBub24gcmljb25vc2NpdXRvOiAifSwKLSAgICAgICAgeyJUaGlzLmV4dGVuc2lvbi5jYW5ub3QuYmUubWFya2VkLmFzLmNyaXRpY2FsLiIsCi0gICAgICAgICAgICAgICAgICJJbXBvc3NpYmlsZSBjb250cmFzc2VnbmFyZSBxdWVzdGEgZXN0ZW5zaW9uZSBjb21lIGNyaXRpY2EuICJ9LAotICAgICAgICB7Ik9kZC5udW1iZXIub2YuaGV4LmRpZ2l0cy5mb3VuZC4iLCAiXHUwMEM4IHN0YXRvIHRyb3ZhdG8gdW4gbnVtZXJvIGRpc3BhcmkgZGkgY2lmcmUgZXNhZGVjaW1hbGk6ICJ9LAotICAgICAgICB7IlVua25vd24uZXh0ZW5zaW9uLnR5cGUuIiwgIlRpcG8gZGkgZXN0ZW5zaW9uZSBzY29ub3NjaXV0bzogIn0sCi0gICAgICAgIHsiY29tbWFuZC57MH0uaXMuYW1iaWd1b3VzLiIsICJpbCBjb21hbmRvIHswfSBcdTAwRTggYW1iaWd1bzoifSwKLQotICAgICAgICAvLyBwb2xpY3l0b29sCi0gICAgICAgIHsiV2FybmluZy5BLnB1YmxpYy5rZXkuZm9yLmFsaWFzLnNpZ25lcnMuaS5kb2VzLm5vdC5leGlzdC5NYWtlLnN1cmUuYS5LZXlTdG9yZS5pcy5wcm9wZXJseS5jb25maWd1cmVkLiIsCi0gICAgICAgICAgICAgICAgIkF2dmVydGVuemE6IG5vbiBlc2lzdGUgdW5hIGNoaWF2ZSBwdWJibGljYSBwZXIgbCcnYWxpYXMgezB9LiBWZXJpZmljYXJlIGNoZSBpbCBrZXlzdG9yZSBzaWEgY29uZmlndXJhdG8gY29ycmV0dGFtZW50ZS4ifSwKLSAgICAgICAgeyJXYXJuaW5nLkNsYXNzLm5vdC5mb3VuZC5jbGFzcyIsICJBdnZlcnRlbnphOiBjbGFzc2Ugbm9uIHRyb3ZhdGE6IHswfSJ9LAotICAgICAgICB7Ildhcm5pbmcuSW52YWxpZC5hcmd1bWVudC5zLmZvci5jb25zdHJ1Y3Rvci5hcmciLAotICAgICAgICAgICAgICAgICJBdnZlcnRlbnphOiBhcmdvbWVudG8gbyBhcmdvbWVudGkgbm9uIHZhbGlkaSBwZXIgaWwgY29zdHJ1dHRvcmUgezB9In0sCi0gICAgICAgIHsiSWxsZWdhbC5QcmluY2lwYWwuVHlwZS50eXBlIiwgIlRpcG8gcHJpbmNpcGFsIG5vbiB2YWxpZG86IHswfSJ9LAotICAgICAgICB7IklsbGVnYWwub3B0aW9uLm9wdGlvbiIsICJPcHppb25lIG5vbiB2YWxpZGE6IHswfSJ9LAotICAgICAgICB7IlVzYWdlLnBvbGljeXRvb2wub3B0aW9ucy4iLCAiVXRpbGl6em86IHBvbGljeXRvb2wgW29wemlvbmldIn0sCi0gICAgICAgIHsiLmZpbGUuZmlsZS5wb2xpY3kuZmlsZS5sb2NhdGlvbiIsCi0gICAgICAgICAgICAgICAgIiAgWy1maWxlIDxmaWxlPl0gICAgcG9zaXppb25lIGRlbCBmaWxlIGRlaSBjcml0ZXJpIn0sCi0gICAgICAgIHsiTmV3IiwgIk51b3ZvIn0sCi0gICAgICAgIHsiT3BlbiIsICJBcHJpIn0sCi0gICAgICAgIHsiU2F2ZSIsICJTYWx2YSJ9LAotICAgICAgICB7IlNhdmUuQXMiLCAiU2FsdmEgY29uIG5vbWUifSwKLSAgICAgICAgeyJWaWV3Lldhcm5pbmcuTG9nIiwgIlZpc3VhbGl6emEgcmVnaXN0cm8gYXZ2ZXJ0ZW56ZSJ9LAotICAgICAgICB7IkV4aXQiLCAiRXNjaSJ9LAotICAgICAgICB7IkFkZC5Qb2xpY3kuRW50cnkiLCAiQWdnaXVuZ2kgdm9jZSBkZWkgY3JpdGVyaSJ9LAotICAgICAgICB7IkVkaXQuUG9saWN5LkVudHJ5IiwgIk1vZGlmaWNhIHZvY2UgZGVpIGNyaXRlcmkifSwKLSAgICAgICAgeyJSZW1vdmUuUG9saWN5LkVudHJ5IiwgIlJpbXVvdmkgdm9jZSBkZWkgY3JpdGVyaSJ9LAotICAgICAgICB7IkVkaXQiLCAiTW9kaWZpY2EifSwKLSAgICAgICAgeyJSZXRhaW4iLCAiTWFudGllbmkifSwKLQotICAgICAgICB7Ildhcm5pbmcuRmlsZS5uYW1lLm1heS5pbmNsdWRlLmVzY2FwZWQuYmFja3NsYXNoLmNoYXJhY3RlcnMuSXQuaXMubm90Lm5lY2Vzc2FyeS50by5lc2NhcGUuYmFja3NsYXNoLmNoYXJhY3RlcnMudGhlLnRvb2wuZXNjYXBlcyIsCi0gICAgICAgICAgICAiQXZ2ZXJ0ZW56YTogaWwgbm9tZSBmaWxlIHB1XHUwMEYyIGluY2x1ZGVyZSBiYXJyZSByb3Zlc2NpYXRlIGNvbiBlc2NhcGUuIE5vbiBcdTAwRTggbmVjZXNzYXJpbyBlc2VndWlyZSBsJ2VzY2FwZSBkZWxsZSBiYXJyZSByb3Zlc2NpYXRlIChzZSBuZWNlc3NhcmlvIGxvIHN0cnVtZW50byBlc2VndWUgbCdlc2NhcGUgZGVpIGNhcmF0dGVyaSBhbCBtb21lbnRvIGRlbGxhIHNjcml0dHVyYSBkZWwgY29udGVudXRvIGRlaSBjcml0ZXJpIG5lbGwnYXJlYSBkaSBtZW1vcml6emF6aW9uZSBwZXJzaXN0ZW50ZSkuXG5cbkZhcmUgY2xpY2sgc3UgTWFudGllbmkgcGVyIGNvbnNlcnZhcmUgaWwgbm9tZSBpbW1lc3NvLCBvcHB1cmUgc3UgTW9kaWZpY2EgcGVyIG1vZGlmaWNhcmUgaWwgbm9tZS4ifSwKLQotICAgICAgICB7IkFkZC5QdWJsaWMuS2V5LkFsaWFzIiwgIkFnZ2l1bmdpIGFsaWFzIGNoaWF2ZSBwdWJibGljYSJ9LAotICAgICAgICB7IlJlbW92ZS5QdWJsaWMuS2V5LkFsaWFzIiwgIlJpbXVvdmkgYWxpYXMgY2hpYXZlIHB1YmJsaWNhIn0sCi0gICAgICAgIHsiRmlsZSIsICJGaWxlIn0sCi0gICAgICAgIHsiS2V5U3RvcmUiLCAiS2V5c3RvcmUifSwKLSAgICAgICAgeyJQb2xpY3kuRmlsZS4iLCAiRmlsZSBkZWkgY3JpdGVyaToifSwKLSAgICAgICAgeyJDb3VsZC5ub3Qub3Blbi5wb2xpY3kuZmlsZS5wb2xpY3lGaWxlLmUudG9TdHJpbmcuIiwKLSAgICAgICAgICAgICAgICAiSW1wb3NzaWJpbGUgYXByaXJlIGlsIGZpbGUgZGkgY3JpdGVyaSB7MH06IHsxfSJ9LAotICAgICAgICB7IlBvbGljeS5Ub29sIiwgIlN0cnVtZW50byBjcml0ZXJpIn0sCi0gICAgICAgIHsiRXJyb3JzLmhhdmUub2NjdXJyZWQud2hpbGUub3BlbmluZy50aGUucG9saWN5LmNvbmZpZ3VyYXRpb24uVmlldy50aGUuV2FybmluZy5Mb2cuZm9yLm1vcmUuaW5mb3JtYXRpb24uIiwKLSAgICAgICAgICAgICAgICAiU2kgc29ubyB2ZXJpZmljYXRpIGVycm9yaSBkdXJhbnRlIGwnYXBlcnR1cmEgZGVsbGEgY29uZmlndXJhemlvbmUgZGVpIGNyaXRlcmkuIENvbnN1bHRhcmUgaWwgcmVnaXN0cm8gZGVsbGUgYXZ2ZXJ0ZW56ZSBwZXIgdWx0ZXJpb3JpIGluZm9ybWF6aW9uaS4ifSwKLSAgICAgICAgeyJFcnJvciIsICJFcnJvcmUifSwKLSAgICAgICAgeyJPSyIsICJPSyJ9LAotICAgICAgICB7IlN0YXR1cyIsICJTdGF0byJ9LAotICAgICAgICB7Ildhcm5pbmciLCAiQXZ2ZXJ0ZW56YSJ9LAotICAgICAgICB7IlBlcm1pc3Npb24uIiwKLSAgICAgICAgICAgICAgICAiQXV0b3JpenphemlvbmU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9LAotICAgICAgICB7IlByaW5jaXBhbC5UeXBlLiIsICJUaXBvIHByaW5jaXBhbDoifSwKLSAgICAgICAgeyJQcmluY2lwYWwuTmFtZS4iLCAiTm9tZSBwcmluY2lwYWw6In0sCi0gICAgICAgIHsiVGFyZ2V0Lk5hbWUuIiwKLSAgICAgICAgICAgICAgICAiTm9tZSBkZXN0aW5hemlvbmU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9LAotICAgICAgICB7IkFjdGlvbnMuIiwKLSAgICAgICAgICAgICAgICAiQXppb25pOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifSwKLSAgICAgICAgeyJPSy50by5vdmVyd3JpdGUuZXhpc3RpbmcuZmlsZS5maWxlbmFtZS4iLAotICAgICAgICAgICAgICAgICJPSyBwZXIgc292cmFzY3JpdmVyZSBpbCBmaWxlIHswfT8ifSwKLSAgICAgICAgeyJDYW5jZWwiLCAiQW5udWxsYSJ9LAotICAgICAgICB7IkNvZGVCYXNlLiIsICJDb2RlQmFzZToifSwKLSAgICAgICAgeyJTaWduZWRCeS4iLCAiU2lnbmVkQnk6In0sCi0gICAgICAgIHsiQWRkLlByaW5jaXBhbCIsICJBZ2dpdW5naSBwcmluY2lwYWwifSwKLSAgICAgICAgeyJFZGl0LlByaW5jaXBhbCIsICJNb2RpZmljYSBwcmluY2lwYWwifSwKLSAgICAgICAgeyJSZW1vdmUuUHJpbmNpcGFsIiwgIlJpbXVvdmkgcHJpbmNpcGFsIn0sCi0gICAgICAgIHsiUHJpbmNpcGFscy4iLCAiUHJpbmNpcGFsOiJ9LAotICAgICAgICB7Ii5BZGQuUGVybWlzc2lvbiIsICIgIEFnZ2l1bmdpIGF1dG9yaXp6YXppb25lIn0sCi0gICAgICAgIHsiLkVkaXQuUGVybWlzc2lvbiIsICIgIE1vZGlmaWNhIGF1dG9yaXp6YXppb25lIn0sCi0gICAgICAgIHsiUmVtb3ZlLlBlcm1pc3Npb24iLCAiUmltdW92aSBhdXRvcml6emF6aW9uZSJ9LAotICAgICAgICB7IkRvbmUiLCAiRmluZSJ9LAotICAgICAgICB7IktleVN0b3JlLlVSTC4iLCAiVVJMIGtleXN0b3JlOiJ9LAotICAgICAgICB7IktleVN0b3JlLlR5cGUuIiwgIlRpcG8ga2V5c3RvcmU6In0sCi0gICAgICAgIHsiS2V5U3RvcmUuUHJvdmlkZXIuIiwgIlByb3ZpZGVyIGtleXN0b3JlOiJ9LAotICAgICAgICB7IktleVN0b3JlLlBhc3N3b3JkLlVSTC4iLCAiVVJMIHBhc3N3b3JkIGtleXN0b3JlOiJ9LAotICAgICAgICB7IlByaW5jaXBhbHMiLCAiUHJpbmNpcGFsOiJ9LAotICAgICAgICB7Ii5FZGl0LlByaW5jaXBhbC4iLCAiICBNb2RpZmljYSBwcmluY2lwYWw6In0sCi0gICAgICAgIHsiLkFkZC5OZXcuUHJpbmNpcGFsLiIsICIgIEFnZ2l1bmdpIG51b3ZvIHByaW5jaXBhbDoifSwKLSAgICAgICAgeyJQZXJtaXNzaW9ucyIsICJBdXRvcml6emF6aW9uaSJ9LAotICAgICAgICB7Ii5FZGl0LlBlcm1pc3Npb24uIiwgIiAgTW9kaWZpY2EgYXV0b3JpenphemlvbmU6In0sCi0gICAgICAgIHsiLkFkZC5OZXcuUGVybWlzc2lvbi4iLCAiICBBZ2dpdW5naSBudW92YSBhdXRvcml6emF6aW9uZToifSwKLSAgICAgICAgeyJTaWduZWQuQnkuIiwgIkZpcm1hdG8gZGE6In0sCi0gICAgICAgIHsiQ2Fubm90LlNwZWNpZnkuUHJpbmNpcGFsLndpdGguYS5XaWxkY2FyZC5DbGFzcy53aXRob3V0LmEuV2lsZGNhcmQuTmFtZSIsCi0gICAgICAgICAgICAiSW1wb3NzaWJpbGUgc3BlY2lmaWNhcmUgcHJpbmNpcGFsIGNvbiB1bmEgY2xhc3NlIGNhcmF0dGVyZSBqb2xseSBzZW56YSB1biBub21lIGNhcmF0dGVyZSBqb2xseSJ9LAotICAgICAgICB7IkNhbm5vdC5TcGVjaWZ5LlByaW5jaXBhbC53aXRob3V0LmEuTmFtZSIsCi0gICAgICAgICAgICAiSW1wb3NzaWJpbGUgc3BlY2lmaWNhcmUgcHJpbmNpcGFsIHNlbnphIHVuIG5vbWUifSwKLSAgICAgICAgeyJQZXJtaXNzaW9uLmFuZC5UYXJnZXQuTmFtZS5tdXN0LmhhdmUuYS52YWx1ZSIsCi0gICAgICAgICAgICAgICAgIkwnYXV0b3JpenphemlvbmUgZSBpbCBub21lIGRlc3RpbmF6aW9uZSBub24gcG9zc29ubyBlc3NlcmUgbnVsbGkifSwKLSAgICAgICAgeyJSZW1vdmUudGhpcy5Qb2xpY3kuRW50cnkuIiwgIlJpbXVvdmVyZSBxdWVzdGEgdm9jZSBkZWkgY3JpdGVyaT8ifSwKLSAgICAgICAgeyJPdmVyd3JpdGUuRmlsZSIsICJTb3ZyYXNjcml2aSBmaWxlIn0sCi0gICAgICAgIHsiUG9saWN5LnN1Y2Nlc3NmdWxseS53cml0dGVuLnRvLmZpbGVuYW1lIiwKLSAgICAgICAgICAgICAgICAiSSBjcml0ZXJpIHNvbm8gc3RhdGkgc2NyaXR0aSBpbiB7MH0ifSwKLSAgICAgICAgeyJudWxsLmZpbGVuYW1lIiwgIm5vbWUgZmlsZSBudWxsbyJ9LAotICAgICAgICB7IlNhdmUuY2hhbmdlcy4iLCAiU2FsdmFyZSBsZSBtb2RpZmljaGU/In0sCi0gICAgICAgIHsiWWVzIiwgIlNcdTAwRUMifSwKLSAgICAgICAgeyJObyIsICJObyJ9LAotICAgICAgICB7IlBvbGljeS5FbnRyeSIsICJWb2NlIGRlaSBjcml0ZXJpIn0sCi0gICAgICAgIHsiU2F2ZS5DaGFuZ2VzIiwgIlNhbHZhIGxlIG1vZGlmaWNoZSJ9LAotICAgICAgICB7Ik5vLlBvbGljeS5FbnRyeS5zZWxlY3RlZCIsICJOZXNzdW5hIHZvY2UgZGVpIGNyaXRlcmkgc2VsZXppb25hdGEifSwKLSAgICAgICAgeyJVbmFibGUudG8ub3Blbi5LZXlTdG9yZS5leC50b1N0cmluZy4iLAotICAgICAgICAgICAgICAgICJJbXBvc3NpYmlsZSBhcHJpcmUgaWwga2V5c3RvcmU6IHswfSJ9LAotICAgICAgICB7Ik5vLnByaW5jaXBhbC5zZWxlY3RlZCIsICJOZXNzdW4gcHJpbmNpcGFsIHNlbGV6aW9uYXRvIn0sCi0gICAgICAgIHsiTm8ucGVybWlzc2lvbi5zZWxlY3RlZCIsICJOZXNzdW5hIGF1dG9yaXp6YXppb25lIHNlbGV6aW9uYXRhIn0sCi0gICAgICAgIHsibmFtZSIsICJub21lIn0sCi0gICAgICAgIHsiY29uZmlndXJhdGlvbi50eXBlIiwgInRpcG8gZGkgY29uZmlndXJhemlvbmUifSwKLSAgICAgICAgeyJlbnZpcm9ubWVudC52YXJpYWJsZS5uYW1lIiwgIm5vbWUgdmFyaWFiaWxlIGFtYmllbnRlIn0sCi0gICAgICAgIHsibGlicmFyeS5uYW1lIiwgIm5vbWUgbGlicmVyaWEifSwKLSAgICAgICAgeyJwYWNrYWdlLm5hbWUiLCAibm9tZSBwYWNrYWdlIn0sCi0gICAgICAgIHsicG9saWN5LnR5cGUiLCAidGlwbyBkaSBjcml0ZXJpIn0sCi0gICAgICAgIHsicHJvcGVydHkubmFtZSIsICJub21lIHByb3ByaWV0XHUwMEUwIn0sCi0gICAgICAgIHsiUHJpbmNpcGFsLkxpc3QiLCAiTGlzdGEgcHJpbmNpcGFsIn0sCi0gICAgICAgIHsiUGVybWlzc2lvbi5MaXN0IiwgIkxpc3RhIGF1dG9yaXp6YXppb25pIn0sCi0gICAgICAgIHsiQ29kZS5CYXNlIiwgIkNvZGViYXNlIn0sCi0gICAgICAgIHsiS2V5U3RvcmUuVS5SLkwuIiwgIlVSTCBrZXlzdG9yZToifSwKLSAgICAgICAgeyJLZXlTdG9yZS5QYXNzd29yZC5VLlIuTC4iLCAiVVJMIHBhc3N3b3JkIGtleXN0b3JlOiJ9LAotCi0KICAgICAgICAgLy8gamF2YXguc2VjdXJpdHkuYXV0aC5Qcml2YXRlQ3JlZGVudGlhbFBlcm1pc3Npb24KICAgICAgICAgeyJpbnZhbGlkLm51bGwuaW5wdXQucy4iLCAiaW5wdXQgbnVsbG8vaSBub24gdmFsaWRvL2kifSwKICAgICAgICAgeyJhY3Rpb25zLmNhbi5vbmx5LmJlLnJlYWQuIiwgImxlIGF6aW9uaSBwb3Nzb25vIGVzc2VyZSBzb2xhbWVudGUgJ2xldHRlJyJ9LApAQCAtNTUzLDYgKzU4LDcgQEAKICAgICAgICAgeyJwcm92aWRlZC5udWxsLk9JRC5tYXAiLCAic3BlY2lmaWNhdGEgbWFwcGEgT0lEIG51bGwifSwKIAogICAgICAgICAvLyBqYXZheC5zZWN1cml0eS5hdXRoLlN1YmplY3QKKyAgICAgICAgeyJORVdMSU5FIiwgIlxuIn0sCiAgICAgICAgIHsiaW52YWxpZC5udWxsLkFjY2Vzc0NvbnRyb2xDb250ZXh0LnByb3ZpZGVkIiwKICAgICAgICAgICAgICAgICAiZm9ybml0byB1biB2YWxvcmUgbnVsbG8gbm9uIHZhbGlkbyBwZXIgQWNjZXNzQ29udHJvbENvbnRleHQifSwKICAgICAgICAgeyJpbnZhbGlkLm51bGwuYWN0aW9uLnByb3ZpZGVkIiwgImZvcm5pdGEgdW4nYXppb25lIG51bGxhIG5vbiB2YWxpZGEifSwKQEAgLTY1Niw2ICsxNjIsNyBAQAogICAgICAqCiAgICAgICogQHJldHVybiB0aGUgY29udGVudHMgb2YgdGhpcyA8Y29kZT5SZXNvdXJjZUJ1bmRsZTwvY29kZT4uCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIE9iamVjdFtdW10gZ2V0Q29udGVudHMoKSB7CiAgICAgICAgIHJldHVybiBjb250ZW50czsKICAgICB9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3V0aWwvUmVzb3VyY2VzX2phLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3V0aWwvUmVzb3VyY2VzX2phLmphdmEKaW5kZXggMjc2NDNkZC4uNjVkOTI4OSAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS91dGlsL1Jlc291cmNlc19qYS5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdXRpbC9SZXNvdXJjZXNfamEuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTM0LDUwMSArMzQsNiBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W11bXSBjb250ZW50cyA9IHsKIAotICAgICAgICAvLyBzaGFyZWQgKGZyb20gamFyc2lnbmVyKQotICAgICAgICB7IlNQQUNFIiwgIiAifSwKLSAgICAgICAgeyIyU1BBQ0UiLCAiICAifSwKLSAgICAgICAgeyI2U1BBQ0UiLCAiICAgICAgIn0sCi0gICAgICAgIHsiQ09NTUEiLCAiLCAifSwKLSAgICAgICAgLy8gc2hhcmVkIChmcm9tIGtleXRvb2wpCi0gICAgICAgIHsiTkVXTElORSIsICJcbiJ9LAotICAgICAgICB7IlNUQVIiLAotICAgICAgICAgICAgICAgICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIn0sCi0gICAgICAgIHsiU1RBUk5OIiwKLSAgICAgICAgICAgICAgICAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG4ifSwKLQotICAgICAgICAvLyBrZXl0b29sOiBIZWxwIHBhcnQKLS8vICJPcHRpb24iIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotICAgICAgICB7Ii5PUFRJT04uIiwgIiBbXHUzMEFBXHUzMEQ3XHUzMEI3XHUzMEU3XHUzMEYzXS4uLiJ9LAotICAgICAgICB7Ik9wdGlvbnMuIiwgIlx1MzBBQVx1MzBEN1x1MzBCN1x1MzBFN1x1MzBGMzoifSwKLSAgICAgICAgeyJVc2Uua2V5dG9vbC5oZWxwLmZvci5hbGwuYXZhaWxhYmxlLmNvbW1hbmRzIiwKLSAgICAgICAgICAgICAgICAgIlx1NEY3Rlx1NzUyOFx1NTNFRlx1ODBGRFx1MzA2QVx1MzA1OVx1MzA3OVx1MzA2Nlx1MzA2RVx1MzBCM1x1MzBERVx1MzBGM1x1MzBDOVx1MzA2Qlx1MzA2NFx1MzA0NFx1MzA2Nlx1MzA2Rlwia2V5dG9vbCAtaGVscFwiXHUzMDkyXHU0RjdGXHU3NTI4XHUzMDU3XHUzMDY2XHUzMDRGXHUzMDYwXHUzMDU1XHUzMDQ0In0sCi0gICAgICAgIHsiS2V5LmFuZC5DZXJ0aWZpY2F0ZS5NYW5hZ2VtZW50LlRvb2wiLAotICAgICAgICAgICAgICAgICAiXHUzMEFEXHUzMEZDXHUzMDRBXHUzMDg4XHUzMDczXHU4QTNDXHU2NjBFXHU2NkY4XHU3QkExXHU3NDA2XHUzMEM0XHUzMEZDXHUzMEVCIn0sCi0gICAgICAgIHsiQ29tbWFuZHMuIiwgIlx1MzBCM1x1MzBERVx1MzBGM1x1MzBDOToifSwKLSAgICAgICAgeyJVc2Uua2V5dG9vbC5jb21tYW5kLm5hbWUuaGVscC5mb3IudXNhZ2Uub2YuY29tbWFuZC5uYW1lIiwKLSAgICAgICAgICAgICAgICAiY29tbWFuZF9uYW1lXHUzMDZFXHU0RjdGXHU3NTI4XHU2NUI5XHU2Q0Q1XHUzMDZCXHUzMDY0XHUzMDQ0XHUzMDY2XHUzMDZGXCJrZXl0b29sIC1jb21tYW5kX25hbWUgLWhlbHBcIlx1MzA5Mlx1NEY3Rlx1NzUyOFx1MzA1N1x1MzA2Nlx1MzA0Rlx1MzA2MFx1MzA1NVx1MzA0NCJ9LAotICAgICAgICAvLyBrZXl0b29sOiBoZWxwOiBjb21tYW5kcwotICAgICAgICB7IkdlbmVyYXRlcy5hLmNlcnRpZmljYXRlLnJlcXVlc3QiLAotICAgICAgICAgICAgICAgICJcdThBM0NcdTY2MEVcdTY2RjhcdTMwRUFcdTMwQUZcdTMwQThcdTMwQjlcdTMwQzhcdTMwOTJcdTc1MUZcdTYyMTBcdTMwNTdcdTMwN0VcdTMwNTkifSwgLy8tY2VydHJlcQotICAgICAgICB7IkNoYW5nZXMuYW4uZW50cnkucy5hbGlhcyIsCi0gICAgICAgICAgICAgICAgIlx1MzBBOFx1MzBGM1x1MzBDOFx1MzBFQVx1MzA2RVx1NTIyNVx1NTQwRFx1MzA5Mlx1NTkwOVx1NjZGNFx1MzA1N1x1MzA3RVx1MzA1OSJ9LCAvLy1jaGFuZ2VhbGlhcwotICAgICAgICB7IkRlbGV0ZXMuYW4uZW50cnkiLAotICAgICAgICAgICAgICAgICJcdTMwQThcdTMwRjNcdTMwQzhcdTMwRUFcdTMwOTJcdTUyNEFcdTk2NjRcdTMwNTdcdTMwN0VcdTMwNTkifSwgLy8tZGVsZXRlCi0gICAgICAgIHsiRXhwb3J0cy5jZXJ0aWZpY2F0ZSIsCi0gICAgICAgICAgICAgICAgIlx1OEEzQ1x1NjYwRVx1NjZGOFx1MzA5Mlx1MzBBOFx1MzBBRlx1MzBCOVx1MzBERFx1MzBGQ1x1MzBDOFx1MzA1N1x1MzA3RVx1MzA1OSJ9LCAvLy1leHBvcnRjZXJ0Ci0gICAgICAgIHsiR2VuZXJhdGVzLmEua2V5LnBhaXIiLAotICAgICAgICAgICAgICAgICJcdTkzNzVcdTMwREFcdTMwQTJcdTMwOTJcdTc1MUZcdTYyMTBcdTMwNTdcdTMwN0VcdTMwNTkifSwgLy8tZ2Vua2V5cGFpcgotLy8gdHJhbnNsYXRpb24gb2YgInNlY3JldCIga2V5IHNob3VsZCBiZSBkaWZmZXJlbnQgdG8gInByaXZhdGUiIGtleS4KLSAgICAgICAgeyJHZW5lcmF0ZXMuYS5zZWNyZXQua2V5IiwKLSAgICAgICAgICAgICAgICAiXHU3OUQ4XHU1QkM2XHU5Mzc1XHUzMDkyXHU3NTFGXHU2MjEwXHUzMDU3XHUzMDdFXHUzMDU5In0sIC8vLWdlbnNlY2tleQotICAgICAgICB7IkdlbmVyYXRlcy5jZXJ0aWZpY2F0ZS5mcm9tLmEuY2VydGlmaWNhdGUucmVxdWVzdCIsCi0gICAgICAgICAgICAgICAgIlx1OEEzQ1x1NjYwRVx1NjZGOFx1MzBFQVx1MzBBRlx1MzBBOFx1MzBCOVx1MzBDOFx1MzA0Qlx1MzA4OVx1OEEzQ1x1NjYwRVx1NjZGOFx1MzA5Mlx1NzUxRlx1NjIxMFx1MzA1N1x1MzA3RVx1MzA1OSJ9LCAvLy1nZW5jZXJ0Ci0gICAgICAgIHsiR2VuZXJhdGVzLkNSTCIsICJDUkxcdTMwOTJcdTc1MUZcdTYyMTBcdTMwNTdcdTMwN0VcdTMwNTkifSwgLy8tZ2VuY3JsCi0gICAgICAgIHsiSW1wb3J0cy5lbnRyaWVzLmZyb20uYS5KREsuMS4xLnguc3R5bGUuaWRlbnRpdHkuZGF0YWJhc2UiLAotICAgICAgICAgICAgICAgICJKREsgMS4xLngtc3R5bGVcdTMwQTJcdTMwQTRcdTMwQzdcdTMwRjNcdTMwQzZcdTMwQTNcdTMwQzZcdTMwQTNcdTMwRkJcdTMwQzdcdTMwRkNcdTMwQkZcdTMwRDlcdTMwRkNcdTMwQjlcdTMwNEJcdTMwODlcdTMwQThcdTMwRjNcdTMwQzhcdTMwRUFcdTMwOTJcdTMwQTRcdTMwRjNcdTMwRERcdTMwRkNcdTMwQzhcdTMwNTdcdTMwN0VcdTMwNTkifSwgLy8taWRlbnRpdHlkYgotICAgICAgICB7IkltcG9ydHMuYS5jZXJ0aWZpY2F0ZS5vci5hLmNlcnRpZmljYXRlLmNoYWluIiwKLSAgICAgICAgICAgICAgICAiXHU4QTNDXHU2NjBFXHU2NkY4XHUzMDdFXHUzMDVGXHUzMDZGXHU4QTNDXHU2NjBFXHU2NkY4XHUzMEMxXHUzMEE3XHUzMEZDXHUzMEYzXHUzMDkyXHUzMEE0XHUzMEYzXHUzMEREXHUzMEZDXHUzMEM4XHUzMDU3XHUzMDdFXHUzMDU5In0sIC8vLWltcG9ydGNlcnQKLSAgICAgICAgeyJJbXBvcnRzLm9uZS5vci5hbGwuZW50cmllcy5mcm9tLmFub3RoZXIua2V5c3RvcmUiLAotICAgICAgICAgICAgICAgICJcdTUyMjVcdTMwNkVcdTMwQURcdTMwRkNcdTMwQjlcdTMwQzhcdTMwQTJcdTMwNEJcdTMwODkxXHUzMDY0XHUzMDdFXHUzMDVGXHUzMDZGXHUzMDU5XHUzMDc5XHUzMDY2XHUzMDZFXHUzMEE4XHUzMEYzXHUzMEM4XHUzMEVBXHUzMDkyXHUzMEE0XHUzMEYzXHUzMEREXHUzMEZDXHUzMEM4XHUzMDU3XHUzMDdFXHUzMDU5In0sIC8vLWltcG9ydGtleXN0b3JlCi0gICAgICAgIHsiQ2xvbmVzLmEua2V5LmVudHJ5IiwKLSAgICAgICAgICAgICAgICAiXHU5Mzc1XHUzMEE4XHUzMEYzXHUzMEM4XHUzMEVBXHUzMDZFXHUzMEFGXHUzMEVEXHUzMEZDXHUzMEYzXHUzMDkyXHU0RjVDXHU2MjEwXHUzMDU3XHUzMDdFXHUzMDU5In0sIC8vLWtleWNsb25lCi0gICAgICAgIHsiQ2hhbmdlcy50aGUua2V5LnBhc3N3b3JkLm9mLmFuLmVudHJ5IiwKLSAgICAgICAgICAgICAgICAiXHUzMEE4XHUzMEYzXHUzMEM4XHUzMEVBXHUzMDZFXHU5Mzc1XHUzMEQxXHUzMEI5XHUzMEVGXHUzMEZDXHUzMEM5XHUzMDkyXHU1OTA5XHU2NkY0XHUzMDU3XHUzMDdFXHUzMDU5In0sIC8vLWtleXBhc3N3ZAotICAgICAgICB7Ikxpc3RzLmVudHJpZXMuaW4uYS5rZXlzdG9yZSIsCi0gICAgICAgICAgICAgICAgIlx1MzBBRFx1MzBGQ1x1MzBCOVx1MzBDOFx1MzBBMlx1NTE4NVx1MzA2RVx1MzBBOFx1MzBGM1x1MzBDOFx1MzBFQVx1MzA5Mlx1MzBFQVx1MzBCOVx1MzBDOFx1MzA1N1x1MzA3RVx1MzA1OSJ9LCAvLy1saXN0Ci0gICAgICAgIHsiUHJpbnRzLnRoZS5jb250ZW50Lm9mLmEuY2VydGlmaWNhdGUiLAotICAgICAgICAgICAgICAgICJcdThBM0NcdTY2MEVcdTY2RjhcdTMwNkVcdTUxODVcdTVCQjlcdTMwOTJcdTUxRkFcdTUyOUJcdTMwNTdcdTMwN0VcdTMwNTkifSwgLy8tcHJpbnRjZXJ0Ci0gICAgICAgIHsiUHJpbnRzLnRoZS5jb250ZW50Lm9mLmEuY2VydGlmaWNhdGUucmVxdWVzdCIsCi0gICAgICAgICAgICAgICAgIlx1OEEzQ1x1NjYwRVx1NjZGOFx1MzBFQVx1MzBBRlx1MzBBOFx1MzBCOVx1MzBDOFx1MzA2RVx1NTE4NVx1NUJCOVx1MzA5Mlx1NTFGQVx1NTI5Qlx1MzA1N1x1MzA3RVx1MzA1OSJ9LCAvLy1wcmludGNlcnRyZXEKLSAgICAgICAgeyJQcmludHMudGhlLmNvbnRlbnQub2YuYS5DUkwuZmlsZSIsCi0gICAgICAgICAgICAgICAgIkNSTFx1MzBENVx1MzBBMVx1MzBBNFx1MzBFQlx1MzA2RVx1NTE4NVx1NUJCOVx1MzA5Mlx1NTFGQVx1NTI5Qlx1MzA1N1x1MzA3RVx1MzA1OSJ9LCAvLy1wcmludGNybAotICAgICAgICB7IkdlbmVyYXRlcy5hLnNlbGYuc2lnbmVkLmNlcnRpZmljYXRlIiwKLSAgICAgICAgICAgICAgICAiXHU4MUVBXHU1REYxXHU3RjcyXHU1NDBEXHU1NzhCXHU4QTNDXHU2NjBFXHU2NkY4XHUzMDkyXHU3NTFGXHU2MjEwXHUzMDU3XHUzMDdFXHUzMDU5In0sIC8vLXNlbGZjZXJ0Ci0gICAgICAgIHsiQ2hhbmdlcy50aGUuc3RvcmUucGFzc3dvcmQub2YuYS5rZXlzdG9yZSIsCi0gICAgICAgICAgICAgICAgIlx1MzBBRFx1MzBGQ1x1MzBCOVx1MzBDOFx1MzBBMlx1MzA2RVx1MzBCOVx1MzBDOFx1MzBBMlx1MzBGQlx1MzBEMVx1MzBCOVx1MzBFRlx1MzBGQ1x1MzBDOVx1MzA5Mlx1NTkwOVx1NjZGNFx1MzA1N1x1MzA3RVx1MzA1OSJ9LCAvLy1zdG9yZXBhc3N3ZAotICAgICAgICAvLyBrZXl0b29sOiBoZWxwOiBvcHRpb25zCi0gICAgICAgIHsiYWxpYXMubmFtZS5vZi50aGUuZW50cnkudG8ucHJvY2VzcyIsCi0gICAgICAgICAgICAgICAgIlx1NTFFNlx1NzQwNlx1MzA1OVx1MzA4Qlx1MzBBOFx1MzBGM1x1MzBDOFx1MzBFQVx1MzA2RVx1NTIyNVx1NTQwRCJ9LCAvLy1hbGlhcwotICAgICAgICB7ImRlc3RpbmF0aW9uLmFsaWFzIiwKLSAgICAgICAgICAgICAgICAiXHU1MUZBXHU1MjlCXHU1MTQ4XHUzMDZFXHU1MjI1XHU1NDBEIn0sIC8vLWRlc3RhbGlhcwotICAgICAgICB7ImRlc3RpbmF0aW9uLmtleS5wYXNzd29yZCIsCi0gICAgICAgICAgICAgICAgIlx1NTFGQVx1NTI5Qlx1NTE0OFx1MzBBRFx1MzBGQ1x1MzA2RVx1MzBEMVx1MzBCOVx1MzBFRlx1MzBGQ1x1MzBDOSJ9LCAvLy1kZXN0a2V5cGFzcwotICAgICAgICB7ImRlc3RpbmF0aW9uLmtleXN0b3JlLm5hbWUiLAotICAgICAgICAgICAgICAgICJcdTUxRkFcdTUyOUJcdTUxNDhcdTMwQURcdTMwRkNcdTMwQjlcdTMwQzhcdTMwQTJcdTU0MEQifSwgLy8tZGVzdGtleXN0b3JlCi0gICAgICAgIHsiZGVzdGluYXRpb24ua2V5c3RvcmUucGFzc3dvcmQucHJvdGVjdGVkIiwKLSAgICAgICAgICAgICAgICAiXHU1MUZBXHU1MjlCXHU1MTQ4XHUzMEFEXHUzMEZDXHUzMEI5XHUzMEM4XHUzMEEyXHUzMDZFXHU0RkREXHU4Qjc3XHU1QkZFXHU4QzYxXHUzMEQxXHUzMEI5XHUzMEVGXHUzMEZDXHUzMEM5In0sIC8vLWRlc3Rwcm90ZWN0ZWQKLSAgICAgICAgeyJkZXN0aW5hdGlvbi5rZXlzdG9yZS5wcm92aWRlci5uYW1lIiwKLSAgICAgICAgICAgICAgICAiXHU1MUZBXHU1MjlCXHU1MTQ4XHUzMEFEXHUzMEZDXHUzMEI5XHUzMEM4XHUzMEEyXHUzMEZCXHUzMEQ3XHUzMEVEXHUzMEQwXHUzMEE0XHUzMEMwXHU1NDBEIn0sIC8vLWRlc3Rwcm92aWRlcm5hbWUKLSAgICAgICAgeyJkZXN0aW5hdGlvbi5rZXlzdG9yZS5wYXNzd29yZCIsCi0gICAgICAgICAgICAgICAgIlx1NTFGQVx1NTI5Qlx1NTE0OFx1MzBBRFx1MzBGQ1x1MzBCOVx1MzBDOFx1MzBBMlx1MzA2RVx1MzBEMVx1MzBCOVx1MzBFRlx1MzBGQ1x1MzBDOSJ9LCAvLy1kZXN0c3RvcmVwYXNzCi0gICAgICAgIHsiZGVzdGluYXRpb24ua2V5c3RvcmUudHlwZSIsCi0gICAgICAgICAgICAgICAgIlx1NTFGQVx1NTI5Qlx1NTE0OFx1MzBBRFx1MzBGQ1x1MzBCOVx1MzBDOFx1MzBBMlx1MzA2RVx1MzBCRlx1MzBBNFx1MzBENyJ9LCAvLy1kZXN0c3RvcmV0eXBlCi0gICAgICAgIHsiZGlzdGluZ3Vpc2hlZC5uYW1lIiwKLSAgICAgICAgICAgICAgICAiXHU4QjU4XHU1MjI1XHU1NDBEIn0sIC8vLWRuYW1lCi0gICAgICAgIHsiWC41MDkuZXh0ZW5zaW9uIiwKLSAgICAgICAgICAgICAgICAiWC41MDlcdTYyRTFcdTVGMzUifSwgLy8tZXh0Ci0gICAgICAgIHsib3V0cHV0LmZpbGUubmFtZSIsCi0gICAgICAgICAgICAgICAgIlx1NTFGQVx1NTI5Qlx1MzBENVx1MzBBMVx1MzBBNFx1MzBFQlx1NTQwRCJ9LCAvLy1maWxlIGFuZCAtb3V0ZmlsZQotICAgICAgICB7ImlucHV0LmZpbGUubmFtZSIsCi0gICAgICAgICAgICAgICAgIlx1NTE2NVx1NTI5Qlx1MzBENVx1MzBBMVx1MzBBNFx1MzBFQlx1NTQwRCJ9LCAvLy1maWxlIGFuZCAtaW5maWxlCi0gICAgICAgIHsia2V5LmFsZ29yaXRobS5uYW1lIiwKLSAgICAgICAgICAgICAgICAiXHU5Mzc1XHUzMEEyXHUzMEVCXHUzMEI0XHUzMEVBXHUzMEJBXHUzMEUwXHU1NDBEIn0sIC8vLWtleWFsZwotICAgICAgICB7ImtleS5wYXNzd29yZCIsCi0gICAgICAgICAgICAgICAgIlx1OTM3NVx1MzA2RVx1MzBEMVx1MzBCOVx1MzBFRlx1MzBGQ1x1MzBDOSJ9LCAvLy1rZXlwYXNzCi0gICAgICAgIHsia2V5LmJpdC5zaXplIiwKLSAgICAgICAgICAgICAgICAiXHU5Mzc1XHUzMDZFXHUzMEQzXHUzMEMzXHUzMEM4XHUzMEZCXHUzMEI1XHUzMEE0XHUzMEJBIn0sIC8vLWtleXNpemUKLSAgICAgICAgeyJrZXlzdG9yZS5uYW1lIiwKLSAgICAgICAgICAgICAgICAiXHUzMEFEXHUzMEZDXHUzMEI5XHUzMEM4XHUzMEEyXHU1NDBEIn0sIC8vLWtleXN0b3JlCi0gICAgICAgIHsibmV3LnBhc3N3b3JkIiwKLSAgICAgICAgICAgICAgICAiXHU2NUIwXHU4OThGXHUzMEQxXHUzMEI5XHUzMEVGXHUzMEZDXHUzMEM5In0sIC8vLW5ldwotICAgICAgICB7ImRvLm5vdC5wcm9tcHQiLAotICAgICAgICAgICAgICAgICJcdTMwRDdcdTMwRURcdTMwRjNcdTMwRDdcdTMwQzhcdTMwOTJcdTg4NjhcdTc5M0FcdTMwNTdcdTMwNkFcdTMwNDQifSwgLy8tbm9wcm9tcHQKLSAgICAgICAgeyJwYXNzd29yZC50aHJvdWdoLnByb3RlY3RlZC5tZWNoYW5pc20iLAotICAgICAgICAgICAgICAgICJcdTRGRERcdThCNzdcdTMwRTFcdTMwQUJcdTMwQ0JcdTMwQkFcdTMwRTBcdTMwNkJcdTMwODhcdTMwOEJcdTMwRDFcdTMwQjlcdTMwRUZcdTMwRkNcdTMwQzkifSwgLy8tcHJvdGVjdGVkCi0gICAgICAgIHsicHJvdmlkZXIuYXJndW1lbnQiLAotICAgICAgICAgICAgICAgICJcdTMwRDdcdTMwRURcdTMwRDBcdTMwQTRcdTMwQzBcdTVGMTVcdTY1NzAifSwgLy8tcHJvdmlkZXJhcmcKLSAgICAgICAgeyJwcm92aWRlci5jbGFzcy5uYW1lIiwKLSAgICAgICAgICAgICAgICAiXHUzMEQ3XHUzMEVEXHUzMEQwXHUzMEE0XHUzMEMwXHUzMEZCXHUzMEFGXHUzMEU5XHUzMEI5XHU1NDBEIn0sIC8vLXByb3ZpZGVyY2xhc3MKLSAgICAgICAgeyJwcm92aWRlci5uYW1lIiwKLSAgICAgICAgICAgICAgICAiXHUzMEQ3XHUzMEVEXHUzMEQwXHUzMEE0XHUzMEMwXHU1NDBEIn0sIC8vLXByb3ZpZGVybmFtZQotICAgICAgICB7InByb3ZpZGVyLmNsYXNzcGF0aCIsCi0gICAgICAgICAgICAgICAgIlx1MzBEN1x1MzBFRFx1MzBEMFx1MzBBNFx1MzBDMFx1MzBGQlx1MzBBRlx1MzBFOVx1MzBCOVx1MzBEMVx1MzBCOSJ9LCAvLy1wcm92aWRlcnBhdGgKLSAgICAgICAgeyJvdXRwdXQuaW4uUkZDLnN0eWxlIiwKLSAgICAgICAgICAgICAgICAiUkZDXHUzMEI5XHUzMEJGXHUzMEE0XHUzMEVCXHUzMDZFXHU1MUZBXHU1MjlCIn0sIC8vLXJmYwotICAgICAgICB7InNpZ25hdHVyZS5hbGdvcml0aG0ubmFtZSIsCi0gICAgICAgICAgICAgICAgIlx1N0Y3Mlx1NTQwRFx1MzBBMlx1MzBFQlx1MzBCNFx1MzBFQVx1MzBCQVx1MzBFMFx1NTQwRCJ9LCAvLy1zaWdhbGcKLSAgICAgICAgeyJzb3VyY2UuYWxpYXMiLAotICAgICAgICAgICAgICAgICJcdTMwQkRcdTMwRkNcdTMwQjlcdTUyMjVcdTU0MEQifSwgLy8tc3JjYWxpYXMKLSAgICAgICAgeyJzb3VyY2Uua2V5LnBhc3N3b3JkIiwKLSAgICAgICAgICAgICAgICAiXHUzMEJEXHUzMEZDXHUzMEI5XHUzMEZCXHUzMEFEXHUzMEZDXHUzMDZFXHUzMEQxXHUzMEI5XHUzMEVGXHUzMEZDXHUzMEM5In0sIC8vLXNyY2tleXBhc3MKLSAgICAgICAgeyJzb3VyY2Uua2V5c3RvcmUubmFtZSIsCi0gICAgICAgICAgICAgICAgIlx1MzBCRFx1MzBGQ1x1MzBCOVx1MzBGQlx1MzBBRFx1MzBGQ1x1MzBCOVx1MzBDOFx1MzBBMlx1NTQwRCJ9LCAvLy1zcmNrZXlzdG9yZQotICAgICAgICB7InNvdXJjZS5rZXlzdG9yZS5wYXNzd29yZC5wcm90ZWN0ZWQiLAotICAgICAgICAgICAgICAgICJcdTMwQkRcdTMwRkNcdTMwQjlcdTMwRkJcdTMwQURcdTMwRkNcdTMwQjlcdTMwQzhcdTMwQTJcdTMwNkVcdTRGRERcdThCNzdcdTVCRkVcdThDNjFcdTMwRDFcdTMwQjlcdTMwRUZcdTMwRkNcdTMwQzkifSwgLy8tc3JjcHJvdGVjdGVkCi0gICAgICAgIHsic291cmNlLmtleXN0b3JlLnByb3ZpZGVyLm5hbWUiLAotICAgICAgICAgICAgICAgICJcdTMwQkRcdTMwRkNcdTMwQjlcdTMwRkJcdTMwQURcdTMwRkNcdTMwQjlcdTMwQzhcdTMwQTJcdTMwRkJcdTMwRDdcdTMwRURcdTMwRDBcdTMwQTRcdTMwQzBcdTU0MEQifSwgLy8tc3JjcHJvdmlkZXJuYW1lCi0gICAgICAgIHsic291cmNlLmtleXN0b3JlLnBhc3N3b3JkIiwKLSAgICAgICAgICAgICAgICAiXHUzMEJEXHUzMEZDXHUzMEI5XHUzMEZCXHUzMEFEXHUzMEZDXHUzMEI5XHUzMEM4XHUzMEEyXHUzMDZFXHUzMEQxXHUzMEI5XHUzMEVGXHUzMEZDXHUzMEM5In0sIC8vLXNyY3N0b3JlcGFzcwotICAgICAgICB7InNvdXJjZS5rZXlzdG9yZS50eXBlIiwKLSAgICAgICAgICAgICAgICAiXHUzMEJEXHUzMEZDXHUzMEI5XHUzMEZCXHUzMEFEXHUzMEZDXHUzMEI5XHUzMEM4XHUzMEEyXHUzMDZFXHUzMEJGXHUzMEE0XHUzMEQ3In0sIC8vLXNyY3N0b3JldHlwZQotICAgICAgICB7IlNTTC5zZXJ2ZXIuaG9zdC5hbmQucG9ydCIsCi0gICAgICAgICAgICAgICAgIlNTTFx1MzBCNVx1MzBGQ1x1MzBEMFx1MzBGQ1x1MzA2RVx1MzBEQlx1MzBCOVx1MzBDOFx1MzA2OFx1MzBERFx1MzBGQ1x1MzBDOCJ9LCAvLy1zc2xzZXJ2ZXIKLSAgICAgICAgeyJzaWduZWQuamFyLmZpbGUiLAotICAgICAgICAgICAgICAgICJcdTdGNzJcdTU0MERcdTRFRDhcdTMwNERKQVJcdTMwRDVcdTMwQTFcdTMwQTRcdTMwRUIifSwgLy89amFyZmlsZQotICAgICAgICB7ImNlcnRpZmljYXRlLnZhbGlkaXR5LnN0YXJ0LmRhdGUudGltZSIsCi0gICAgICAgICAgICAgICAgIlx1OEEzQ1x1NjYwRVx1NjZGOFx1MzA2RVx1NjcwOVx1NTJCOVx1OTU4Qlx1NTlDQlx1NjVFNVx1NjY0MiJ9LCAvLy1zdGFydGRhdGUKLSAgICAgICAgeyJrZXlzdG9yZS5wYXNzd29yZCIsCi0gICAgICAgICAgICAgICAgIlx1MzBBRFx1MzBGQ1x1MzBCOVx1MzBDOFx1MzBBMlx1MzA2RVx1MzBEMVx1MzBCOVx1MzBFRlx1MzBGQ1x1MzBDOSJ9LCAvLy1zdG9yZXBhc3MKLSAgICAgICAgeyJrZXlzdG9yZS50eXBlIiwKLSAgICAgICAgICAgICAgICAiXHUzMEFEXHUzMEZDXHUzMEI5XHUzMEM4XHUzMEEyXHUzMDZFXHUzMEJGXHUzMEE0XHUzMEQ3In0sIC8vLXN0b3JldHlwZQotICAgICAgICB7InRydXN0LmNlcnRpZmljYXRlcy5mcm9tLmNhY2VydHMiLAotICAgICAgICAgICAgICAgICJjYWNlcnRzXHUzMDRCXHUzMDg5XHUzMDZFXHU4QTNDXHU2NjBFXHU2NkY4XHUzMDkyXHU0RkUxXHU5ODNDXHUzMDU5XHUzMDhCIn0sIC8vLXRydXN0Y2FjZXJ0cwotICAgICAgICB7InZlcmJvc2Uub3V0cHV0IiwKLSAgICAgICAgICAgICAgICAiXHU4QTczXHU3RDMwXHU1MUZBXHU1MjlCIn0sIC8vLXYKLSAgICAgICAgeyJ2YWxpZGl0eS5udW1iZXIub2YuZGF5cyIsCi0gICAgICAgICAgICAgICAgIlx1NTlBNVx1NUY1M1x1NjAyN1x1NjVFNVx1NjU3MCJ9LCAvLy12YWxpZGl0eQotICAgICAgICB7IlNlcmlhbC5JRC5vZi5jZXJ0LnRvLnJldm9rZSIsCi0gICAgICAgICAgICAgICAgICJcdTU5MzFcdTUyQjlcdTMwNTlcdTMwOEJcdThBM0NcdTY2MEVcdTY2RjhcdTMwNkVcdTMwQjdcdTMwRUFcdTMwQTJcdTMwRUJJRCJ9LCAvLy1pZAotICAgICAgICAvLyBrZXl0b29sOiBSdW5uaW5nIHBhcnQKLSAgICAgICAgeyJrZXl0b29sLmVycm9yLiIsICJrZXl0b29sXHUzMEE4XHUzMEU5XHUzMEZDOiAifSwKLSAgICAgICAgeyJJbGxlZ2FsLm9wdGlvbi4iLCAiXHU0RTBEXHU2QjYzXHUzMDZBXHUzMEFBXHUzMEQ3XHUzMEI3XHUzMEU3XHUzMEYzOiAgIn0sCi0gICAgICAgIHsiSWxsZWdhbC52YWx1ZS4iLCAiXHU0RTBEXHU2QjYzXHUzMDZBXHU1MDI0OiAifSwKLSAgICAgICAgeyJVbmtub3duLnBhc3N3b3JkLnR5cGUuIiwgIlx1NEUwRFx1NjYwRVx1MzA2QVx1MzBEMVx1MzBCOVx1MzBFRlx1MzBGQ1x1MzBDOVx1MzBGQlx1MzBCRlx1MzBBNFx1MzBENzogIn0sCi0gICAgICAgIHsiQ2Fubm90LmZpbmQuZW52aXJvbm1lbnQudmFyaWFibGUuIiwKLSAgICAgICAgICAgICAgICAiXHU3NEIwXHU1ODgzXHU1OTA5XHU2NTcwXHUzMDRDXHU4OThCXHUzMDY0XHUzMDRCXHUzMDhBXHUzMDdFXHUzMDVCXHUzMDkzOiAifSwKLSAgICAgICAgeyJDYW5ub3QuZmluZC5maWxlLiIsICJcdTMwRDVcdTMwQTFcdTMwQTRcdTMwRUJcdTMwNENcdTg5OEJcdTMwNjRcdTMwNEJcdTMwOEFcdTMwN0VcdTMwNUJcdTMwOTM6ICJ9LAotICAgICAgICB7IkNvbW1hbmQub3B0aW9uLmZsYWcubmVlZHMuYW4uYXJndW1lbnQuIiwgIlx1MzBCM1x1MzBERVx1MzBGM1x1MzBDOVx1MzBGQlx1MzBBQVx1MzBEN1x1MzBCN1x1MzBFN1x1MzBGM3swfVx1MzA2Qlx1MzA2Rlx1NUYxNVx1NjU3MFx1MzA0Q1x1NUZDNVx1ODk4MVx1MzA2N1x1MzA1OVx1MzAwMiJ9LAotICAgICAgICB7Ildhcm5pbmcuRGlmZmVyZW50LnN0b3JlLmFuZC5rZXkucGFzc3dvcmRzLm5vdC5zdXBwb3J0ZWQuZm9yLlBLQ1MxMi5LZXlTdG9yZXMuSWdub3JpbmcudXNlci5zcGVjaWZpZWQuY29tbWFuZC52YWx1ZS4iLAotICAgICAgICAgICAgICAgICJcdThCNjZcdTU0NEE6IFBLQ1MxMlx1MzBBRFx1MzBGQ1x1MzBCOVx1MzBDOFx1MzBBMlx1MzA2N1x1MzA2Rlx1MzAwMVx1MzBCOVx1MzBDOFx1MzBBMlx1MzA2RVx1MzBEMVx1MzBCOVx1MzBFRlx1MzBGQ1x1MzBDOVx1MzA2OFx1OTM3NVx1MzA2RVx1MzBEMVx1MzBCOVx1MzBFRlx1MzBGQ1x1MzBDOVx1MzA0Q1x1NzU3MFx1MzA2QVx1MzA4Qlx1NzJCNlx1NkNDMVx1MzA2Rlx1MzBCNVx1MzBERFx1MzBGQ1x1MzBDOFx1MzA1NVx1MzA4Q1x1MzA3RVx1MzA1Qlx1MzA5M1x1MzAwMlx1MzBFNlx1MzBGQ1x1MzBCNlx1MzBGQ1x1MzA0Q1x1NjMwN1x1NUI5QVx1MzA1N1x1MzA1RnswfVx1MzA2RVx1NTAyNFx1MzA2Rlx1NzEyMVx1ODk5Nlx1MzA1N1x1MzA3RVx1MzA1OVx1MzAwMiJ9LAotICAgICAgICB7Ii5rZXlzdG9yZS5tdXN0LmJlLk5PTkUuaWYuc3RvcmV0eXBlLmlzLnswfSIsCi0gICAgICAgICAgICAgICAgIi1zdG9yZXR5cGVcdTMwNEN7MH1cdTMwNkVcdTU4MzRcdTU0MDhcdTMwMDEta2V5c3RvcmVcdTMwNkZOT05FXHUzMDY3XHUzMDQyXHUzMDhCXHU1RkM1XHU4OTgxXHUzMDRDXHUzMDQyXHUzMDhBXHUzMDdFXHUzMDU5In0sCi0gICAgICAgIHsiVG9vLm1hbnkucmV0cmllcy5wcm9ncmFtLnRlcm1pbmF0ZWQiLAotICAgICAgICAgICAgICAgICAiXHU1MThEXHU4QTY2XHU4ODRDXHUzMDRDXHU1OTFBXHUzMDU5XHUzMDRFXHUzMDdFXHUzMDU5XHUzMDAyXHUzMEQ3XHUzMEVEXHUzMEIwXHUzMEU5XHUzMEUwXHUzMDRDXHU3RDQyXHU0RTg2XHUzMDU3XHUzMDdFXHUzMDU3XHUzMDVGIn0sCi0gICAgICAgIHsiLnN0b3JlcGFzc3dkLmFuZC5rZXlwYXNzd2QuY29tbWFuZHMubm90LnN1cHBvcnRlZC5pZi5zdG9yZXR5cGUuaXMuezB9IiwKLSAgICAgICAgICAgICAgICAiLXN0b3JldHlwZVx1MzA0Q3swfVx1MzA2RVx1NTgzNFx1NTQwOFx1MzAwMS1zdG9yZXBhc3N3ZFx1MzBCM1x1MzBERVx1MzBGM1x1MzBDOVx1MzA0QVx1MzA4OFx1MzA3My1rZXlwYXNzd2RcdTMwQjNcdTMwREVcdTMwRjNcdTMwQzlcdTMwNkZcdTMwQjVcdTMwRERcdTMwRkNcdTMwQzhcdTMwNTVcdTMwOENcdTMwN0VcdTMwNUJcdTMwOTMifSwKLSAgICAgICAgeyIua2V5cGFzc3dkLmNvbW1hbmRzLm5vdC5zdXBwb3J0ZWQuaWYuc3RvcmV0eXBlLmlzLlBLQ1MxMiIsCi0gICAgICAgICAgICAgICAgIi1zdG9yZXR5cGVcdTMwNENQS0NTMTJcdTMwNkVcdTU4MzRcdTU0MDhcdTMwMDEta2V5cGFzc3dkXHUzMEIzXHUzMERFXHUzMEYzXHUzMEM5XHUzMDZGXHUzMEI1XHUzMEREXHUzMEZDXHUzMEM4XHUzMDU1XHUzMDhDXHUzMDdFXHUzMDVCXHUzMDkzIn0sCi0gICAgICAgIHsiLmtleXBhc3MuYW5kLm5ldy5jYW4ubm90LmJlLnNwZWNpZmllZC5pZi5zdG9yZXR5cGUuaXMuezB9IiwKLSAgICAgICAgICAgICAgICAiLXN0b3JldHlwZVx1MzA0Q3swfVx1MzA2RVx1NTgzNFx1NTQwOFx1MzAwMS1rZXlwYXNzXHUzMDY4LW5ld1x1MzA2Rlx1NjMwN1x1NUI5QVx1MzA2N1x1MzA0RFx1MzA3RVx1MzA1Qlx1MzA5MyJ9LAotICAgICAgICB7ImlmLnByb3RlY3RlZC5pcy5zcGVjaWZpZWQudGhlbi5zdG9yZXBhc3Mua2V5cGFzcy5hbmQubmV3Lm11c3Qubm90LmJlLnNwZWNpZmllZCIsCi0gICAgICAgICAgICAgICAgIi1wcm90ZWN0ZWRcdTMwNENcdTYzMDdcdTVCOUFcdTMwNTVcdTMwOENcdTMwNjZcdTMwNDRcdTMwOEJcdTU4MzRcdTU0MDhcdTMwMDEtc3RvcmVwYXNzXHUzMDAxLWtleXBhc3NcdTMwNEFcdTMwODhcdTMwNzMtbmV3XHUzMDZGXHU2MzA3XHU1QjlBXHUzMDY3XHUzMDREXHUzMDdFXHUzMDVCXHUzMDkzIn0sCi0gICAgICAgIHsiaWYuc3JjcHJvdGVjdGVkLmlzLnNwZWNpZmllZC50aGVuLnNyY3N0b3JlcGFzcy5hbmQuc3Jja2V5cGFzcy5tdXN0Lm5vdC5iZS5zcGVjaWZpZWQiLAotICAgICAgICAgICAgICAgICItc3JjcHJvdGVjdGVkXHUzMDRDXHU2MzA3XHU1QjlBXHUzMDU1XHUzMDhDXHUzMDY2XHUzMDQ0XHUzMDhCXHU1ODM0XHU1NDA4XHUzMDAxLXNyY3N0b3JlcGFzc1x1MzA0QVx1MzA4OFx1MzA3My1zcmNrZXlwYXNzXHUzMDZGXHU2MzA3XHU1QjlBXHUzMDY3XHUzMDREXHUzMDdFXHUzMDVCXHUzMDkzIn0sCi0gICAgICAgIHsiaWYua2V5c3RvcmUuaXMubm90LnBhc3N3b3JkLnByb3RlY3RlZC50aGVuLnN0b3JlcGFzcy5rZXlwYXNzLmFuZC5uZXcubXVzdC5ub3QuYmUuc3BlY2lmaWVkIiwKLSAgICAgICAgICAgICAgICAiXHUzMEFEXHUzMEZDXHUzMEI5XHUzMEM4XHUzMEEyXHUzMDRDXHUzMEQxXHUzMEI5XHUzMEVGXHUzMEZDXHUzMEM5XHUzMDY3XHU0RkREXHU4Qjc3XHUzMDU1XHUzMDhDXHUzMDY2XHUzMDQ0XHUzMDZBXHUzMDQ0XHU1ODM0XHU1NDA4XHUzMDAxLXN0b3JlcGFzc1x1MzAwMS1rZXlwYXNzXHUzMDRBXHUzMDg4XHUzMDczLW5ld1x1MzA2Rlx1NjMwN1x1NUI5QVx1MzA2N1x1MzA0RFx1MzA3RVx1MzA1Qlx1MzA5MyJ9LAotICAgICAgICB7ImlmLnNvdXJjZS5rZXlzdG9yZS5pcy5ub3QucGFzc3dvcmQucHJvdGVjdGVkLnRoZW4uc3Jjc3RvcmVwYXNzLmFuZC5zcmNrZXlwYXNzLm11c3Qubm90LmJlLnNwZWNpZmllZCIsCi0gICAgICAgICAgICAgICAgIlx1MzBCRFx1MzBGQ1x1MzBCOVx1MzBGQlx1MzBBRFx1MzBGQ1x1MzBCOVx1MzBDOFx1MzBBMlx1MzA0Q1x1MzBEMVx1MzBCOVx1MzBFRlx1MzBGQ1x1MzBDOVx1MzA2N1x1NEZERFx1OEI3N1x1MzA1NVx1MzA4Q1x1MzA2Nlx1MzA0NFx1MzA2QVx1MzA0NFx1NTgzNFx1NTQwOFx1MzAwMS1zcmNzdG9yZXBhc3NcdTMwNEFcdTMwODhcdTMwNzMtc3Jja2V5cGFzc1x1MzA2Rlx1NjMwN1x1NUI5QVx1MzA2N1x1MzA0RFx1MzA3RVx1MzA1Qlx1MzA5MyJ9LAotICAgICAgICB7IklsbGVnYWwuc3RhcnRkYXRlLnZhbHVlIiwgInN0YXJ0ZGF0ZVx1NTAyNFx1MzA0Q1x1NzEyMVx1NTJCOVx1MzA2N1x1MzA1OSJ9LAotICAgICAgICB7IlZhbGlkaXR5Lm11c3QuYmUuZ3JlYXRlci50aGFuLnplcm8iLAotICAgICAgICAgICAgICAgICJcdTU5QTVcdTVGNTNcdTYwMjdcdTMwNkZcdTMwQkNcdTMwRURcdTMwODhcdTMwOEFcdTU5MjdcdTMwNERcdTMwNDRcdTVGQzVcdTg5ODFcdTMwNENcdTMwNDJcdTMwOEFcdTMwN0VcdTMwNTkifSwKLSAgICAgICAgeyJwcm92TmFtZS5ub3QuYS5wcm92aWRlciIsICJ7MH1cdTMwNkZcdTMwRDdcdTMwRURcdTMwRDBcdTMwQTRcdTMwQzBcdTMwNjdcdTMwNkZcdTMwNDJcdTMwOEFcdTMwN0VcdTMwNUJcdTMwOTMifSwKLSAgICAgICAgeyJVc2FnZS5lcnJvci5uby5jb21tYW5kLnByb3ZpZGVkIiwgIlx1NEY3Rlx1NzUyOFx1MzBBOFx1MzBFOVx1MzBGQzogXHUzMEIzXHUzMERFXHUzMEYzXHUzMEM5XHUzMDRDXHU2MzA3XHU1QjlBXHUzMDU1XHUzMDhDXHUzMDY2XHUzMDQ0XHUzMDdFXHUzMDVCXHUzMDkzIn0sCi0gICAgICAgIHsiU291cmNlLmtleXN0b3JlLmZpbGUuZXhpc3RzLmJ1dC5pcy5lbXB0eS4iLCAiXHUzMEJEXHUzMEZDXHUzMEI5XHUzMEZCXHUzMEFEXHUzMEZDXHUzMEI5XHUzMEM4XHUzMEEyXHUzMEZCXHUzMEQ1XHUzMEExXHUzMEE0XHUzMEVCXHUzMDZGXHUzMDAxXHU1QjU4XHU1NzI4XHUzMDU3XHUzMDdFXHUzMDU5XHUzMDRDXHU3QTdBXHUzMDY3XHUzMDU5OiAifSwKLSAgICAgICAgeyJQbGVhc2Uuc3BlY2lmeS5zcmNrZXlzdG9yZSIsICItc3Jja2V5c3RvcmVcdTMwOTJcdTYzMDdcdTVCOUFcdTMwNTdcdTMwNjZcdTMwNEZcdTMwNjBcdTMwNTVcdTMwNDQifSwKLSAgICAgICAgeyJNdXN0Lm5vdC5zcGVjaWZ5LmJvdGgudi5hbmQucmZjLndpdGgubGlzdC5jb21tYW5kIiwKLSAgICAgICAgICAgICAgICAiJ2xpc3QnXHUzMEIzXHUzMERFXHUzMEYzXHUzMEM5XHUzMDZCLXZcdTMwNjgtcmZjXHUzMDZFXHU0RTIxXHU2NUI5XHUzMDkyXHU2MzA3XHU1QjlBXHUzMDU5XHUzMDhCXHUzMDUzXHUzMDY4XHUzMDZGXHUzMDY3XHUzMDREXHUzMDdFXHUzMDVCXHUzMDkzIn0sCi0gICAgICAgIHsiS2V5LnBhc3N3b3JkLm11c3QuYmUuYXQubGVhc3QuNi5jaGFyYWN0ZXJzIiwKLSAgICAgICAgICAgICAgICAiXHU5Mzc1XHUzMDZFXHUzMEQxXHUzMEI5XHUzMEVGXHUzMEZDXHUzMEM5XHUzMDZGNlx1NjU4N1x1NUI1N1x1NEVFNVx1NEUwQVx1MzA2N1x1MzA0Mlx1MzA4Qlx1NUZDNVx1ODk4MVx1MzA0Q1x1MzA0Mlx1MzA4QVx1MzA3RVx1MzA1OSJ9LAotICAgICAgICB7Ik5ldy5wYXNzd29yZC5tdXN0LmJlLmF0LmxlYXN0LjYuY2hhcmFjdGVycyIsCi0gICAgICAgICAgICAgICAgIlx1NjVCMFx1ODk4Rlx1MzBEMVx1MzBCOVx1MzBFRlx1MzBGQ1x1MzBDOVx1MzA2RjZcdTY1ODdcdTVCNTdcdTRFRTVcdTRFMEFcdTMwNjdcdTMwNDJcdTMwOEJcdTVGQzVcdTg5ODFcdTMwNENcdTMwNDJcdTMwOEFcdTMwN0VcdTMwNTkifSwKLSAgICAgICAgeyJLZXlzdG9yZS5maWxlLmV4aXN0cy5idXQuaXMuZW1wdHkuIiwKLSAgICAgICAgICAgICAgICAiXHUzMEFEXHUzMEZDXHUzMEI5XHUzMEM4XHUzMEEyXHUzMEZCXHUzMEQ1XHUzMEExXHUzMEE0XHUzMEVCXHUzMDZGXHU1QjU4XHU1NzI4XHUzMDU3XHUzMDdFXHUzMDU5XHUzMDRDXHUzMDAxXHU3QTdBXHUzMDY3XHUzMDU5OiAifSwKLSAgICAgICAgeyJLZXlzdG9yZS5maWxlLmRvZXMubm90LmV4aXN0LiIsCi0gICAgICAgICAgICAgICAgIlx1MzBBRFx1MzBGQ1x1MzBCOVx1MzBDOFx1MzBBMlx1MzBGQlx1MzBENVx1MzBBMVx1MzBBNFx1MzBFQlx1MzA2Rlx1NUI1OFx1NTcyOFx1MzA1N1x1MzA3RVx1MzA1Qlx1MzA5MzogIn0sCi0gICAgICAgIHsiTXVzdC5zcGVjaWZ5LmRlc3RpbmF0aW9uLmFsaWFzIiwgIlx1NTFGQVx1NTI5Qlx1NTE0OFx1MzA2RVx1NTIyNVx1NTQwRFx1MzA5Mlx1NjMwN1x1NUI5QVx1MzA1OVx1MzA4Qlx1NUZDNVx1ODk4MVx1MzA0Q1x1MzA0Mlx1MzA4QVx1MzA3RVx1MzA1OSJ9LAotICAgICAgICB7Ik11c3Quc3BlY2lmeS5hbGlhcyIsICJcdTUyMjVcdTU0MERcdTMwOTJcdTYzMDdcdTVCOUFcdTMwNTlcdTMwOEJcdTVGQzVcdTg5ODFcdTMwNENcdTMwNDJcdTMwOEFcdTMwN0VcdTMwNTkifSwKLSAgICAgICAgeyJLZXlzdG9yZS5wYXNzd29yZC5tdXN0LmJlLmF0LmxlYXN0LjYuY2hhcmFjdGVycyIsCi0gICAgICAgICAgICAgICAgIlx1MzBBRFx1MzBGQ1x1MzBCOVx1MzBDOFx1MzBBMlx1MzA2RVx1MzBEMVx1MzBCOVx1MzBFRlx1MzBGQ1x1MzBDOVx1MzA2RjZcdTY1ODdcdTVCNTdcdTRFRTVcdTRFMEFcdTMwNjdcdTMwNDJcdTMwOEJcdTVGQzVcdTg5ODFcdTMwNENcdTMwNDJcdTMwOEFcdTMwN0VcdTMwNTkifSwKLSAgICAgICAgeyJFbnRlci5rZXlzdG9yZS5wYXNzd29yZC4iLCAiXHUzMEFEXHUzMEZDXHUzMEI5XHUzMEM4XHUzMEEyXHUzMDZFXHUzMEQxXHUzMEI5XHUzMEVGXHUzMEZDXHUzMEM5XHUzMDkyXHU1MTY1XHU1MjlCXHUzMDU3XHUzMDY2XHUzMDRGXHUzMDYwXHUzMDU1XHUzMDQ0OiAgIn0sCi0gICAgICAgIHsiRW50ZXIuc291cmNlLmtleXN0b3JlLnBhc3N3b3JkLiIsICJcdTMwQkRcdTMwRkNcdTMwQjlcdTMwRkJcdTMwQURcdTMwRkNcdTMwQjlcdTMwQzhcdTMwQTJcdTMwNkVcdTMwRDFcdTMwQjlcdTMwRUZcdTMwRkNcdTMwQzlcdTMwOTJcdTUxNjVcdTUyOUJcdTMwNTdcdTMwNjZcdTMwNEZcdTMwNjBcdTMwNTVcdTMwNDQ6ICAifSwKLSAgICAgICAgeyJFbnRlci5kZXN0aW5hdGlvbi5rZXlzdG9yZS5wYXNzd29yZC4iLCAiXHU1MUZBXHU1MjlCXHU1MTQ4XHUzMEFEXHUzMEZDXHUzMEI5XHUzMEM4XHUzMEEyXHUzMDZFXHUzMEQxXHUzMEI5XHUzMEVGXHUzMEZDXHUzMEM5XHUzMDkyXHU1MTY1XHU1MjlCXHUzMDU3XHUzMDY2XHUzMDRGXHUzMDYwXHUzMDU1XHUzMDQ0OiAgIn0sCi0gICAgICAgIHsiS2V5c3RvcmUucGFzc3dvcmQuaXMudG9vLnNob3J0Lm11c3QuYmUuYXQubGVhc3QuNi5jaGFyYWN0ZXJzIiwKLSAgICAgICAgICJcdTMwQURcdTMwRkNcdTMwQjlcdTMwQzhcdTMwQTJcdTMwNkVcdTMwRDFcdTMwQjlcdTMwRUZcdTMwRkNcdTMwQzlcdTMwNENcdTc3RURcdTMwNTlcdTMwNEVcdTMwN0VcdTMwNTkgLSA2XHU2NTg3XHU1QjU3XHU0RUU1XHU0RTBBXHUzMDZCXHUzMDU3XHUzMDY2XHUzMDRGXHUzMDYwXHUzMDU1XHUzMDQ0In0sCi0gICAgICAgIHsiVW5rbm93bi5FbnRyeS5UeXBlIiwgIlx1NEUwRFx1NjYwRVx1MzA2QVx1MzBBOFx1MzBGM1x1MzBDOFx1MzBFQVx1MzBGQlx1MzBCRlx1MzBBNFx1MzBENyJ9LAotICAgICAgICB7IlRvby5tYW55LmZhaWx1cmVzLkFsaWFzLm5vdC5jaGFuZ2VkIiwgIlx1OTY5Q1x1NUJCM1x1MzA0Q1x1NTkxQVx1MzA1OVx1MzA0RVx1MzA3RVx1MzA1OVx1MzAwMlx1NTIyNVx1NTQwRFx1MzA2Rlx1NTkwOVx1NjZGNFx1MzA1NVx1MzA4Q1x1MzA3RVx1MzA1Qlx1MzA5MyJ9LAotICAgICAgICB7IkVudHJ5LmZvci5hbGlhcy5hbGlhcy5zdWNjZXNzZnVsbHkuaW1wb3J0ZWQuIiwKLSAgICAgICAgICAgICAgICAgIlx1NTIyNVx1NTQwRHswfVx1MzA2RVx1MzBBOFx1MzBGM1x1MzBDOFx1MzBFQVx1MzA2RVx1MzBBNFx1MzBGM1x1MzBERFx1MzBGQ1x1MzBDOFx1MzA2Qlx1NjIxMFx1NTI5Rlx1MzA1N1x1MzA3RVx1MzA1N1x1MzA1Rlx1MzAwMiJ9LAotICAgICAgICB7IkVudHJ5LmZvci5hbGlhcy5hbGlhcy5ub3QuaW1wb3J0ZWQuIiwgIlx1NTIyNVx1NTQwRHswfVx1MzA2RVx1MzBBOFx1MzBGM1x1MzBDOFx1MzBFQVx1MzA2Rlx1MzBBNFx1MzBGM1x1MzBERFx1MzBGQ1x1MzBDOFx1MzA1NVx1MzA4Q1x1MzA3RVx1MzA1Qlx1MzA5M1x1MzA2N1x1MzA1N1x1MzA1Rlx1MzAwMiJ9LAotICAgICAgICB7IlByb2JsZW0uaW1wb3J0aW5nLmVudHJ5LmZvci5hbGlhcy5hbGlhcy5leGNlcHRpb24uRW50cnkuZm9yLmFsaWFzLmFsaWFzLm5vdC5pbXBvcnRlZC4iLAotICAgICAgICAgICAgICAgICAiXHU1MjI1XHU1NDBEezB9XHUzMDZFXHUzMEE4XHUzMEYzXHUzMEM4XHUzMEVBXHUzMDZFXHUzMEE0XHUzMEYzXHUzMEREXHUzMEZDXHUzMEM4XHU0RTJEXHUzMDZCXHU1NTRGXHU5ODRDXHUzMDRDXHU3NjdBXHU3NTFGXHUzMDU3XHUzMDdFXHUzMDU3XHUzMDVGOiB7MX1cdTMwMDJcblx1NTIyNVx1NTQwRHswfVx1MzA2RVx1MzBBOFx1MzBGM1x1MzBDOFx1MzBFQVx1MzA2Rlx1MzBBNFx1MzBGM1x1MzBERFx1MzBGQ1x1MzBDOFx1MzA1NVx1MzA4Q1x1MzA3RVx1MzA1Qlx1MzA5M1x1MzA2N1x1MzA1N1x1MzA1Rlx1MzAwMiJ9LAotICAgICAgICB7IkltcG9ydC5jb21tYW5kLmNvbXBsZXRlZC5vay5lbnRyaWVzLnN1Y2Nlc3NmdWxseS5pbXBvcnRlZC5mYWlsLmVudHJpZXMuZmFpbGVkLm9yLmNhbmNlbGxlZCIsCi0gICAgICAgICAgICAgICAgICJcdTMwQTRcdTMwRjNcdTMwRERcdTMwRkNcdTMwQzhcdTMwRkJcdTMwQjNcdTMwREVcdTMwRjNcdTMwQzlcdTMwNENcdTVCOENcdTRFODZcdTMwNTdcdTMwN0VcdTMwNTdcdTMwNUY6IHswfVx1NEVGNlx1MzA2RVx1MzBBOFx1MzBGM1x1MzBDOFx1MzBFQVx1MzA2RVx1MzBBNFx1MzBGM1x1MzBERFx1MzBGQ1x1MzBDOFx1MzA0Q1x1NjIxMFx1NTI5Rlx1MzA1N1x1MzA3RVx1MzA1N1x1MzA1Rlx1MzAwMnsxfVx1NEVGNlx1MzA2RVx1MzBBOFx1MzBGM1x1MzBDOFx1MzBFQVx1MzA2RVx1MzBBNFx1MzBGM1x1MzBERFx1MzBGQ1x1MzBDOFx1MzA0Q1x1NTkzMVx1NjU1N1x1MzA1N1x1MzA1Rlx1MzA0Qlx1NTNENlx1MzA4QVx1NkQ4OFx1MzA1NVx1MzA4Q1x1MzA3RVx1MzA1N1x1MzA1RiJ9LAotICAgICAgICB7Ildhcm5pbmcuT3ZlcndyaXRpbmcuZXhpc3RpbmcuYWxpYXMuYWxpYXMuaW4uZGVzdGluYXRpb24ua2V5c3RvcmUiLAotICAgICAgICAgICAgICAgICAiXHU4QjY2XHU1NDRBOiBcdTUxRkFcdTUyOUJcdTUxNDhcdTMwQURcdTMwRkNcdTMwQjlcdTMwQzhcdTMwQTJcdTUxODVcdTMwNkVcdTY1RTJcdTVCNThcdTMwNkVcdTUyMjVcdTU0MER7MH1cdTMwOTJcdTRFMEFcdTY2RjhcdTMwNERcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN0VcdTMwNTkifSwKLSAgICAgICAgeyJFeGlzdGluZy5lbnRyeS5hbGlhcy5hbGlhcy5leGlzdHMub3ZlcndyaXRlLm5vLiIsCi0gICAgICAgICAgICAgICAgICJcdTY1RTJcdTVCNThcdTMwNkVcdTMwQThcdTMwRjNcdTMwQzhcdTMwRUFcdTMwNkVcdTUyMjVcdTU0MER7MH1cdTMwNENcdTVCNThcdTU3MjhcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN0VcdTMwNTlcdTMwMDJcdTRFMEFcdTY2RjhcdTMwNERcdTMwNTdcdTMwN0VcdTMwNTlcdTMwNEJcdTMwMDJbXHUzMDQ0XHUzMDQ0XHUzMDQ4XTogICJ9LAotICAgICAgICB7IlRvby5tYW55LmZhaWx1cmVzLnRyeS5sYXRlciIsICJcdTk2OUNcdTVCQjNcdTMwNENcdTU5MUFcdTMwNTlcdTMwNEVcdTMwN0VcdTMwNTkgLSBcdTVGOENcdTMwNjdcdTVCOUZcdTg4NENcdTMwNTdcdTMwNjZcdTMwNEZcdTMwNjBcdTMwNTVcdTMwNDQifSwKLSAgICAgICAgeyJDZXJ0aWZpY2F0aW9uLnJlcXVlc3Quc3RvcmVkLmluLmZpbGUuZmlsZW5hbWUuIiwKLSAgICAgICAgICAgICAgICAiXHU4QTNDXHU2NjBFXHU2NkY4XHUzMEVBXHUzMEFGXHUzMEE4XHUzMEI5XHUzMEM4XHUzMDRDXHUzMEQ1XHUzMEExXHUzMEE0XHUzMEVCPHswfT5cdTMwNkJcdTRGRERcdTVCNThcdTMwNTVcdTMwOENcdTMwN0VcdTMwNTdcdTMwNUYifSwKLSAgICAgICAgeyJTdWJtaXQudGhpcy50by55b3VyLkNBIiwgIlx1MzA1M1x1MzA4Q1x1MzA5MkNBXHUzMDZCXHU2M0QwXHU1MUZBXHUzMDU3XHUzMDY2XHUzMDRGXHUzMDYwXHUzMDU1XHUzMDQ0In0sCi0gICAgICAgIHsiaWYuYWxpYXMubm90LnNwZWNpZmllZC5kZXN0YWxpYXMuc3Jja2V5cGFzcy5hbmQuZGVzdGtleXBhc3MubXVzdC5ub3QuYmUuc3BlY2lmaWVkIiwKLSAgICAgICAgICAgICJcdTUyMjVcdTU0MERcdTMwOTJcdTYzMDdcdTVCOUFcdTMwNTdcdTMwNkFcdTMwNDRcdTU4MzRcdTU0MDhcdTMwMDFcdTUxRkFcdTUyOUJcdTUxNDhcdTMwQURcdTMwRkNcdTMwQjlcdTMwQzhcdTMwQTJcdTMwNkVcdTUyMjVcdTU0MERcdTMwMDFcdTMwQkRcdTMwRkNcdTMwQjlcdTMwRkJcdTMwQURcdTMwRkNcdTMwQjlcdTMwQzhcdTMwQTJcdTMwNkVcdTMwRDFcdTMwQjlcdTMwRUZcdTMwRkNcdTMwQzlcdTMwNEFcdTMwODhcdTMwNzNcdTUxRkFcdTUyOUJcdTUxNDhcdTMwQURcdTMwRkNcdTMwQjlcdTMwQzhcdTMwQTJcdTMwNkVcdTMwRDFcdTMwQjlcdTMwRUZcdTMwRkNcdTMwQzlcdTMwNkZcdTYzMDdcdTVCOUFcdTMwNjdcdTMwNERcdTMwN0VcdTMwNUJcdTMwOTMifSwKLSAgICAgICAgeyJDZXJ0aWZpY2F0ZS5zdG9yZWQuaW4uZmlsZS5maWxlbmFtZS4iLAotICAgICAgICAgICAgICAgICJcdThBM0NcdTY2MEVcdTY2RjhcdTMwNENcdTMwRDVcdTMwQTFcdTMwQTRcdTMwRUI8ezB9Plx1MzA2Qlx1NEZERFx1NUI1OFx1MzA1NVx1MzA4Q1x1MzA3RVx1MzA1N1x1MzA1RiJ9LAotICAgICAgICB7IkNlcnRpZmljYXRlLnJlcGx5Lndhcy5pbnN0YWxsZWQuaW4ua2V5c3RvcmUiLAotICAgICAgICAgICAgICAgICJcdThBM0NcdTY2MEVcdTY2RjhcdTVGRENcdTdCNTRcdTMwNENcdTMwQURcdTMwRkNcdTMwQjlcdTMwQzhcdTMwQTJcdTMwNkJcdTMwQTRcdTMwRjNcdTMwQjlcdTMwQzhcdTMwRkNcdTMwRUJcdTMwNTVcdTMwOENcdTMwN0VcdTMwNTdcdTMwNUYifSwKLSAgICAgICAgeyJDZXJ0aWZpY2F0ZS5yZXBseS53YXMubm90Lmluc3RhbGxlZC5pbi5rZXlzdG9yZSIsCi0gICAgICAgICAgICAgICAgIlx1OEEzQ1x1NjYwRVx1NjZGOFx1NUZEQ1x1N0I1NFx1MzA0Q1x1MzBBRFx1MzBGQ1x1MzBCOVx1MzBDOFx1MzBBMlx1MzA2Qlx1MzBBNFx1MzBGM1x1MzBCOVx1MzBDOFx1MzBGQ1x1MzBFQlx1MzA1NVx1MzA4Q1x1MzA3RVx1MzA1Qlx1MzA5M1x1MzA2N1x1MzA1N1x1MzA1RiJ9LAotICAgICAgICB7IkNlcnRpZmljYXRlLndhcy5hZGRlZC50by5rZXlzdG9yZSIsCi0gICAgICAgICAgICAgICAgIlx1OEEzQ1x1NjYwRVx1NjZGOFx1MzA0Q1x1MzBBRFx1MzBGQ1x1MzBCOVx1MzBDOFx1MzBBMlx1MzA2Qlx1OEZGRFx1NTJBMFx1MzA1NVx1MzA4Q1x1MzA3RVx1MzA1N1x1MzA1RiJ9LAotICAgICAgICB7IkNlcnRpZmljYXRlLndhcy5ub3QuYWRkZWQudG8ua2V5c3RvcmUiLAotICAgICAgICAgICAgICAgICJcdThBM0NcdTY2MEVcdTY2RjhcdTMwNENcdTMwQURcdTMwRkNcdTMwQjlcdTMwQzhcdTMwQTJcdTMwNkJcdThGRkRcdTUyQTBcdTMwNTVcdTMwOENcdTMwN0VcdTMwNUJcdTMwOTNcdTMwNjdcdTMwNTdcdTMwNUYifSwKLSAgICAgICAgeyIuU3RvcmluZy5rc2ZuYW1lLiIsICJbezB9XHUzMDkyXHU2ODNDXHU3RDBEXHU0RTJEXSJ9LAotICAgICAgICB7ImFsaWFzLmhhcy5uby5wdWJsaWMua2V5LmNlcnRpZmljYXRlLiIsCi0gICAgICAgICAgICAgICAgInswfVx1MzA2Qlx1MzA2Rlx1NTE2Q1x1OTU4Qlx1OTM3NShcdThBM0NcdTY2MEVcdTY2RjgpXHUzMDRDXHUzMDQyXHUzMDhBXHUzMDdFXHUzMDVCXHUzMDkzIn0sCi0gICAgICAgIHsiQ2Fubm90LmRlcml2ZS5zaWduYXR1cmUuYWxnb3JpdGhtIiwKLSAgICAgICAgICAgICAgICAiXHU3RjcyXHU1NDBEXHUzMEEyXHUzMEVCXHUzMEI0XHUzMEVBXHUzMEJBXHUzMEUwXHUzMDkyXHU1M0Q2XHU1Rjk3XHUzMDY3XHUzMDREXHUzMDdFXHUzMDVCXHUzMDkzIn0sCi0gICAgICAgIHsiQWxpYXMuYWxpYXMuZG9lcy5ub3QuZXhpc3QiLAotICAgICAgICAgICAgICAgICJcdTUyMjVcdTU0MEQ8ezB9Plx1MzA2Rlx1NUI1OFx1NTcyOFx1MzA1N1x1MzA3RVx1MzA1Qlx1MzA5MyJ9LAotICAgICAgICB7IkFsaWFzLmFsaWFzLmhhcy5uby5jZXJ0aWZpY2F0ZSIsCi0gICAgICAgICAgICAgICAgIlx1NTIyNVx1NTQwRDx7MH0+XHUzMDZCXHUzMDZGXHU4QTNDXHU2NjBFXHU2NkY4XHUzMDRDXHUzMDQyXHUzMDhBXHUzMDdFXHUzMDVCXHUzMDkzIn0sCi0gICAgICAgIHsiS2V5LnBhaXIubm90LmdlbmVyYXRlZC5hbGlhcy5hbGlhcy5hbHJlYWR5LmV4aXN0cyIsCi0gICAgICAgICAgICAgICAgIlx1OTM3NVx1MzBEQVx1MzBBMlx1MzA2Rlx1NzUxRlx1NjIxMFx1MzA1NVx1MzA4Q1x1MzA3RVx1MzA1Qlx1MzA5M1x1MzA2N1x1MzA1N1x1MzA1Rlx1MzAwMlx1NTIyNVx1NTQwRDx7MH0+XHUzMDZGXHUzMDU5XHUzMDY3XHUzMDZCXHU1QjU4XHU1NzI4XHUzMDU3XHUzMDdFXHUzMDU5In0sCi0gICAgICAgIHsiR2VuZXJhdGluZy5rZXlzaXplLmJpdC5rZXlBbGdOYW1lLmtleS5wYWlyLmFuZC5zZWxmLnNpZ25lZC5jZXJ0aWZpY2F0ZS5zaWdBbGdOYW1lLndpdGguYS52YWxpZGl0eS5vZi52YWxpZGFsaXR5LmRheXMuZm9yIiwKLSAgICAgICAgICAgICAgICAiezN9XHU2NUU1XHU5NTkzXHU2NzA5XHU1MkI5XHUzMDZBezB9XHUzMEQzXHUzMEMzXHUzMEM4XHUzMDZFezF9XHUzMDZFXHU5Mzc1XHUzMERBXHUzMEEyXHUzMDY4XHU4MUVBXHU1REYxXHU3RjcyXHU1NDBEXHU1NzhCXHU4QTNDXHU2NjBFXHU2NkY4KHsyfSlcdTMwOTJcdTc1MUZcdTYyMTBcdTMwNTdcdTMwNjZcdTMwNDRcdTMwN0VcdTMwNTlcblx0XHUzMEM3XHUzMEEzXHUzMEVDXHUzMEFGXHUzMEM4XHUzMEVBXHU1NDBEOiB7NH0ifSwKLSAgICAgICAgeyJFbnRlci5rZXkucGFzc3dvcmQuZm9yLmFsaWFzLiIsICI8ezB9Plx1MzA2RVx1OTM3NVx1MzBEMVx1MzBCOVx1MzBFRlx1MzBGQ1x1MzBDOVx1MzA5Mlx1NTE2NVx1NTI5Qlx1MzA1N1x1MzA2Nlx1MzA0Rlx1MzA2MFx1MzA1NVx1MzA0NCJ9LAotICAgICAgICB7Ii5SRVRVUk4uaWYuc2FtZS5hcy5rZXlzdG9yZS5wYXNzd29yZC4iLAotICAgICAgICAgICAgICAgICJcdChcdTMwQURcdTMwRkNcdTMwQjlcdTMwQzhcdTMwQTJcdTMwNkVcdTMwRDFcdTMwQjlcdTMwRUZcdTMwRkNcdTMwQzlcdTMwNjhcdTU0MENcdTMwNThcdTU4MzRcdTU0MDhcdTMwNkZSRVRVUk5cdTMwOTJcdTYyQkNcdTMwNTdcdTMwNjZcdTMwNEZcdTMwNjBcdTMwNTVcdTMwNDQpOiAgIn0sCi0gICAgICAgIHsiS2V5LnBhc3N3b3JkLmlzLnRvby5zaG9ydC5tdXN0LmJlLmF0LmxlYXN0LjYuY2hhcmFjdGVycyIsCi0gICAgICAgICAgICAgICAgIlx1OTM3NVx1MzA2RVx1MzBEMVx1MzBCOVx1MzBFRlx1MzBGQ1x1MzBDOVx1MzA0Q1x1NzdFRFx1MzA1OVx1MzA0RVx1MzA3RVx1MzA1OSAtIDZcdTY1ODdcdTVCNTdcdTRFRTVcdTRFMEFcdTMwOTJcdTYzMDdcdTVCOUFcdTMwNTdcdTMwNjZcdTMwNEZcdTMwNjBcdTMwNTVcdTMwNDQifSwKLSAgICAgICAgeyJUb28ubWFueS5mYWlsdXJlcy5rZXkubm90LmFkZGVkLnRvLmtleXN0b3JlIiwKLSAgICAgICAgICAgICAgICAiXHU5NjlDXHU1QkIzXHUzMDRDXHU1OTFBXHUzMDU5XHUzMDRFXHUzMDdFXHUzMDU5IC0gXHU5Mzc1XHUzMDZGXHUzMEFEXHUzMEZDXHUzMEI5XHUzMEM4XHUzMEEyXHUzMDZCXHU4RkZEXHU1MkEwXHUzMDU1XHUzMDhDXHUzMDdFXHUzMDVCXHUzMDkzXHUzMDY3XHUzMDU3XHUzMDVGIn0sCi0gICAgICAgIHsiRGVzdGluYXRpb24uYWxpYXMuZGVzdC5hbHJlYWR5LmV4aXN0cyIsCi0gICAgICAgICAgICAgICAgIlx1NTFGQVx1NTI5Qlx1NTE0OFx1MzA2RVx1NTIyNVx1NTQwRDx7MH0+XHUzMDZGXHUzMDU5XHUzMDY3XHUzMDZCXHU1QjU4XHU1NzI4XHUzMDU3XHUzMDdFXHUzMDU5In0sCi0gICAgICAgIHsiUGFzc3dvcmQuaXMudG9vLnNob3J0Lm11c3QuYmUuYXQubGVhc3QuNi5jaGFyYWN0ZXJzIiwKLSAgICAgICAgICAgICAgICAiXHUzMEQxXHUzMEI5XHUzMEVGXHUzMEZDXHUzMEM5XHUzMDRDXHU3N0VEXHUzMDU5XHUzMDRFXHUzMDdFXHUzMDU5IC0gNlx1NjU4N1x1NUI1N1x1NEVFNVx1NEUwQVx1MzA5Mlx1NjMwN1x1NUI5QVx1MzA1N1x1MzA2Nlx1MzA0Rlx1MzA2MFx1MzA1NVx1MzA0NCJ9LAotICAgICAgICB7IlRvby5tYW55LmZhaWx1cmVzLktleS5lbnRyeS5ub3QuY2xvbmVkIiwKLSAgICAgICAgICAgICAgICAiXHU5NjlDXHU1QkIzXHUzMDRDXHU1OTFBXHUzMDU5XHUzMDRFXHUzMDdFXHUzMDU5XHUzMDAyXHU5Mzc1XHUzMEE4XHUzMEYzXHUzMEM4XHUzMEVBXHUzMDZFXHUzMEFGXHUzMEVEXHUzMEZDXHUzMEYzXHUzMDZGXHU0RjVDXHU2MjEwXHUzMDU1XHUzMDhDXHUzMDdFXHUzMDVCXHUzMDkzXHUzMDY3XHUzMDU3XHUzMDVGIn0sCi0gICAgICAgIHsia2V5LnBhc3N3b3JkLmZvci5hbGlhcy4iLCAiPHswfT5cdTMwNkVcdTkzNzVcdTMwNkVcdTMwRDFcdTMwQjlcdTMwRUZcdTMwRkNcdTMwQzkifSwKLSAgICAgICAgeyJLZXlzdG9yZS5lbnRyeS5mb3IuaWQuZ2V0TmFtZS5hbHJlYWR5LmV4aXN0cyIsCi0gICAgICAgICAgICAgICAgIjx7MH0+XHUzMDZFXHUzMEFEXHUzMEZDXHUzMEI5XHUzMEM4XHUzMEEyXHUzMEZCXHUzMEE4XHUzMEYzXHUzMEM4XHUzMEVBXHUzMDZGXHUzMDU5XHUzMDY3XHUzMDZCXHU1QjU4XHU1NzI4XHUzMDU3XHUzMDdFXHUzMDU5In0sCi0gICAgICAgIHsiQ3JlYXRpbmcua2V5c3RvcmUuZW50cnkuZm9yLmlkLmdldE5hbWUuIiwKLSAgICAgICAgICAgICAgICAiPHswfT5cdTMwNkVcdTMwQURcdTMwRkNcdTMwQjlcdTMwQzhcdTMwQTJcdTMwRkJcdTMwQThcdTMwRjNcdTMwQzhcdTMwRUFcdTMwOTJcdTRGNUNcdTYyMTBcdTRFMkQuLi4ifSwKLSAgICAgICAgeyJOby5lbnRyaWVzLmZyb20uaWRlbnRpdHkuZGF0YWJhc2UuYWRkZWQiLAotICAgICAgICAgICAgICAgICJcdTMwQTJcdTMwQTRcdTMwQzdcdTMwRjNcdTMwQzZcdTMwQTNcdTMwQzZcdTMwQTNcdTMwRkJcdTMwQzdcdTMwRkNcdTMwQkZcdTMwRDlcdTMwRkNcdTMwQjlcdTMwNEJcdTMwODlcdThGRkRcdTUyQTBcdTMwNTVcdTMwOENcdTMwNUZcdTMwQThcdTMwRjNcdTMwQzhcdTMwRUFcdTMwNkZcdTMwNDJcdTMwOEFcdTMwN0VcdTMwNUJcdTMwOTMifSwKLSAgICAgICAgeyJBbGlhcy5uYW1lLmFsaWFzIiwgIlx1NTIyNVx1NTQwRDogezB9In0sCi0gICAgICAgIHsiQ3JlYXRpb24uZGF0ZS5rZXlTdG9yZS5nZXRDcmVhdGlvbkRhdGUuYWxpYXMuIiwKLSAgICAgICAgICAgICAgICAiXHU0RjVDXHU2MjEwXHU2NUU1OiB7MCxkYXRlfSJ9LAotICAgICAgICB7ImFsaWFzLmtleVN0b3JlLmdldENyZWF0aW9uRGF0ZS5hbGlhcy4iLAotICAgICAgICAgICAgICAgICJ7MH0sezEsZGF0ZX0sICJ9LAotICAgICAgICB7ImFsaWFzLiIsICJ7MH0sICJ9LAotICAgICAgICB7IkVudHJ5LnR5cGUudHlwZS4iLCAiXHUzMEE4XHUzMEYzXHUzMEM4XHUzMEVBXHUzMEZCXHUzMEJGXHUzMEE0XHUzMEQ3OiB7MH0ifSwKLSAgICAgICAgeyJDZXJ0aWZpY2F0ZS5jaGFpbi5sZW5ndGguIiwgIlx1OEEzQ1x1NjYwRVx1NjZGOFx1MzBDMVx1MzBBN1x1MzBGQ1x1MzBGM1x1MzA2RVx1OTU3N1x1MzA1NTogIn0sCi0gICAgICAgIHsiQ2VydGlmaWNhdGUuaS4xLiIsICJcdThBM0NcdTY2MEVcdTY2RjhbezAsbnVtYmVyLGludGVnZXJ9XToifSwKLSAgICAgICAgeyJDZXJ0aWZpY2F0ZS5maW5nZXJwcmludC5TSEExLiIsICJcdThBM0NcdTY2MEVcdTY2RjhcdTMwNkVcdTMwRDVcdTMwQTNcdTMwRjNcdTMwQUNcdTMwRDdcdTMwRUFcdTMwRjNcdTMwQzgoU0hBMSk6ICJ9LAotICAgICAgICB7IktleXN0b3JlLnR5cGUuIiwgIlx1MzBBRFx1MzBGQ1x1MzBCOVx1MzBDOFx1MzBBMlx1MzA2RVx1MzBCRlx1MzBBNFx1MzBENzogIn0sCi0gICAgICAgIHsiS2V5c3RvcmUucHJvdmlkZXIuIiwgIlx1MzBBRFx1MzBGQ1x1MzBCOVx1MzBDOFx1MzBBMlx1MzBGQlx1MzBEN1x1MzBFRFx1MzBEMFx1MzBBNFx1MzBDMDogIn0sCi0gICAgICAgIHsiWW91ci5rZXlzdG9yZS5jb250YWlucy5rZXlTdG9yZS5zaXplLmVudHJ5IiwKLSAgICAgICAgICAgICAgICAiXHUzMEFEXHUzMEZDXHUzMEI5XHUzMEM4XHUzMEEyXHUzMDZCXHUzMDZGezAsbnVtYmVyLGludGVnZXJ9XHUzMEE4XHUzMEYzXHUzMEM4XHUzMEVBXHUzMDRDXHU1NDJCXHUzMDdFXHUzMDhDXHUzMDdFXHUzMDU5In0sCi0gICAgICAgIHsiWW91ci5rZXlzdG9yZS5jb250YWlucy5rZXlTdG9yZS5zaXplLmVudHJpZXMiLAotICAgICAgICAgICAgICAgICJcdTMwQURcdTMwRkNcdTMwQjlcdTMwQzhcdTMwQTJcdTMwNkJcdTMwNkZ7MCxudW1iZXIsaW50ZWdlcn1cdTMwQThcdTMwRjNcdTMwQzhcdTMwRUFcdTMwNENcdTU0MkJcdTMwN0VcdTMwOENcdTMwN0VcdTMwNTkifSwKLSAgICAgICAgeyJGYWlsZWQudG8ucGFyc2UuaW5wdXQiLCAiXHU1MTY1XHU1MjlCXHUzMDZFXHU2OUNCXHU2NTg3XHU4OUUzXHU2NzkwXHUzMDZCXHU1OTMxXHU2NTU3XHUzMDU3XHUzMDdFXHUzMDU3XHUzMDVGIn0sCi0gICAgICAgIHsiRW1wdHkuaW5wdXQiLCAiXHU1MTY1XHU1MjlCXHUzMDRDXHUzMDQyXHUzMDhBXHUzMDdFXHUzMDVCXHUzMDkzIn0sCi0gICAgICAgIHsiTm90LlguNTA5LmNlcnRpZmljYXRlIiwgIlguNTA5XHU4QTNDXHU2NjBFXHU2NkY4XHUzMDY3XHUzMDZGXHUzMDQyXHUzMDhBXHUzMDdFXHUzMDVCXHUzMDkzIn0sCi0gICAgICAgIHsiYWxpYXMuaGFzLm5vLnB1YmxpYy5rZXkiLCAiezB9XHUzMDZCXHUzMDZGXHU1MTZDXHU5NThCXHU5Mzc1XHUzMDRDXHUzMDQyXHUzMDhBXHUzMDdFXHUzMDVCXHUzMDkzIn0sCi0gICAgICAgIHsiYWxpYXMuaGFzLm5vLlguNTA5LmNlcnRpZmljYXRlIiwgInswfVx1MzA2Qlx1MzA2RlguNTA5XHU4QTNDXHU2NjBFXHU2NkY4XHUzMDRDXHUzMDQyXHUzMDhBXHUzMDdFXHUzMDVCXHUzMDkzIn0sCi0gICAgICAgIHsiTmV3LmNlcnRpZmljYXRlLnNlbGYuc2lnbmVkLiIsICJcdTY1QjBcdTMwNTdcdTMwNDRcdThBM0NcdTY2MEVcdTY2RjgoXHU4MUVBXHU1REYxXHU3RjcyXHU1NDBEXHU1NzhCKToifSwKLSAgICAgICAgeyJSZXBseS5oYXMubm8uY2VydGlmaWNhdGVzIiwgIlx1NUZEQ1x1N0I1NFx1MzA2Qlx1MzA2Rlx1OEEzQ1x1NjYwRVx1NjZGOFx1MzA0Q1x1MzA0Mlx1MzA4QVx1MzA3RVx1MzA1Qlx1MzA5MyJ9LAotICAgICAgICB7IkNlcnRpZmljYXRlLm5vdC5pbXBvcnRlZC5hbGlhcy5hbGlhcy5hbHJlYWR5LmV4aXN0cyIsCi0gICAgICAgICAgICAgICAgIlx1OEEzQ1x1NjYwRVx1NjZGOFx1MzA2Rlx1MzBBNFx1MzBGM1x1MzBERFx1MzBGQ1x1MzBDOFx1MzA1NVx1MzA4Q1x1MzA3RVx1MzA1Qlx1MzA5M1x1MzA2N1x1MzA1N1x1MzA1Rlx1MzAwMlx1NTIyNVx1NTQwRDx7MH0+XHUzMDZGXHUzMDU5XHUzMDY3XHUzMDZCXHU1QjU4XHU1NzI4XHUzMDU3XHUzMDdFXHUzMDU5In0sCi0gICAgICAgIHsiSW5wdXQubm90LmFuLlguNTA5LmNlcnRpZmljYXRlIiwgIlx1NTE2NVx1NTI5Qlx1MzA2RlguNTA5XHU4QTNDXHU2NjBFXHU2NkY4XHUzMDY3XHUzMDZGXHUzMDQyXHUzMDhBXHUzMDdFXHUzMDVCXHUzMDkzIn0sCi0gICAgICAgIHsiQ2VydGlmaWNhdGUuYWxyZWFkeS5leGlzdHMuaW4ua2V5c3RvcmUudW5kZXIuYWxpYXMudHJ1c3RhbGlhcy4iLAotICAgICAgICAgICAgICAgICJcdThBM0NcdTY2MEVcdTY2RjhcdTMwNkZcdTMwMDFcdTUyMjVcdTU0MEQ8ezB9Plx1MzA2RVx1MzBBRFx1MzBGQ1x1MzBCOVx1MzBDOFx1MzBBMlx1MzA2Qlx1MzA1OVx1MzA2N1x1MzA2Qlx1NUI1OFx1NTcyOFx1MzA1N1x1MzA3RVx1MzA1OSJ9LAotICAgICAgICB7IkRvLnlvdS5zdGlsbC53YW50LnRvLmFkZC5pdC5uby4iLAotICAgICAgICAgICAgICAgICJcdThGRkRcdTUyQTBcdTMwNTdcdTMwN0VcdTMwNTlcdTMwNEJcdTMwMDJbXHUzMDQ0XHUzMDQ0XHUzMDQ4XTogICJ9LAotICAgICAgICB7IkNlcnRpZmljYXRlLmFscmVhZHkuZXhpc3RzLmluLnN5c3RlbS53aWRlLkNBLmtleXN0b3JlLnVuZGVyLmFsaWFzLnRydXN0YWxpYXMuIiwKLSAgICAgICAgICAgICAgICAiXHU4QTNDXHU2NjBFXHU2NkY4XHUzMDZGXHUzMDAxXHU1MjI1XHU1NDBEPHswfT5cdTMwNkVcdTMwQjdcdTMwQjlcdTMwQzZcdTMwRTBcdTg5OEZcdTZBMjFcdTMwNkVDQVx1MzBBRFx1MzBGQ1x1MzBCOVx1MzBDOFx1MzBBMlx1NTE4NVx1MzA2Qlx1MzA1OVx1MzA2N1x1MzA2Qlx1NUI1OFx1NTcyOFx1MzA1N1x1MzA3RVx1MzA1OSJ9LAotICAgICAgICB7IkRvLnlvdS5zdGlsbC53YW50LnRvLmFkZC5pdC50by55b3VyLm93bi5rZXlzdG9yZS5uby4iLAotICAgICAgICAgICAgICAgICJcdTMwQURcdTMwRkNcdTMwQjlcdTMwQzhcdTMwQTJcdTMwNkJcdThGRkRcdTUyQTBcdTMwNTdcdTMwN0VcdTMwNTlcdTMwNEJcdTMwMDIgW1x1MzA0NFx1MzA0NFx1MzA0OF06ICAifSwKLSAgICAgICAgeyJUcnVzdC50aGlzLmNlcnRpZmljYXRlLm5vLiIsICJcdTMwNTNcdTMwNkVcdThBM0NcdTY2MEVcdTY2RjhcdTMwOTJcdTRGRTFcdTk4M0NcdTMwNTdcdTMwN0VcdTMwNTlcdTMwNEJcdTMwMDIgW1x1MzA0NFx1MzA0NFx1MzA0OF06ICAifSwKLSAgICAgICAgeyJZRVMiLCAiXHUzMDZGXHUzMDQ0In0sCi0gICAgICAgIHsiTmV3LnByb21wdC4iLCAiXHU2NUIwXHU4OThGezB9OiAifSwKLSAgICAgICAgeyJQYXNzd29yZHMubXVzdC5kaWZmZXIiLCAiXHUzMEQxXHUzMEI5XHUzMEVGXHUzMEZDXHUzMEM5XHUzMDZGXHU3NTcwXHUzMDZBXHUzMDYzXHUzMDY2XHUzMDQ0XHUzMDhCXHU1RkM1XHU4OTgxXHUzMDRDXHUzMDQyXHUzMDhBXHUzMDdFXHUzMDU5In0sCi0gICAgICAgIHsiUmUuZW50ZXIubmV3LnByb21wdC4iLCAiXHU2NUIwXHU4OThGezB9XHUzMDkyXHU1MThEXHU1MTY1XHU1MjlCXHUzMDU3XHUzMDY2XHUzMDRGXHUzMDYwXHUzMDU1XHUzMDQ0OiAifSwKLSAgICAgICAgeyJSZS5lbnRlci5uZXcucGFzc3dvcmQuIiwgIlx1NjVCMFx1ODk4Rlx1MzBEMVx1MzBCOVx1MzBFRlx1MzBGQ1x1MzBDOVx1MzA5Mlx1NTE4RFx1NTE2NVx1NTI5Qlx1MzA1N1x1MzA2Nlx1MzA0Rlx1MzA2MFx1MzA1NVx1MzA0NDogIn0sCi0gICAgICAgIHsiVGhleS5kb24udC5tYXRjaC5UcnkuYWdhaW4iLCAiXHU0RTAwXHU4MUY0XHUzMDU3XHUzMDdFXHUzMDVCXHUzMDkzXHUzMDAyXHUzMDgyXHUzMDQ2XHU0RTAwXHU1RUE2XHU1QjlGXHU4ODRDXHUzMDU3XHUzMDY2XHUzMDRGXHUzMDYwXHUzMDU1XHUzMDQ0In0sCi0gICAgICAgIHsiRW50ZXIucHJvbXB0LmFsaWFzLm5hbWUuIiwgInswfVx1MzA2RVx1NTIyNVx1NTQwRFx1MzA5Mlx1NTE2NVx1NTI5Qlx1MzA1N1x1MzA2Nlx1MzA0Rlx1MzA2MFx1MzA1NVx1MzA0NDogICJ9LAotICAgICAgICB7IkVudGVyLm5ldy5hbGlhcy5uYW1lLlJFVFVSTi50by5jYW5jZWwuaW1wb3J0LmZvci50aGlzLmVudHJ5LiIsCi0gICAgICAgICAgICAgICAgICJcdTY1QjBcdTMwNTdcdTMwNDRcdTUyMjVcdTU0MERcdTMwOTJcdTUxNjVcdTUyOUJcdTMwNTdcdTMwNjZcdTMwNEZcdTMwNjBcdTMwNTVcdTMwNDRcdChcdTMwNTNcdTMwNkVcdTMwQThcdTMwRjNcdTMwQzhcdTMwRUFcdTMwNkVcdTMwQTRcdTMwRjNcdTMwRERcdTMwRkNcdTMwQzhcdTMwOTJcdTUzRDZcdTMwOEFcdTZEODhcdTMwNTlcdTU4MzRcdTU0MDhcdTMwNkZSRVRVUk5cdTMwOTJcdTYyQkNcdTMwNTdcdTMwNjZcdTMwNEZcdTMwNjBcdTMwNTVcdTMwNDQpOiAgIn0sCi0gICAgICAgIHsiRW50ZXIuYWxpYXMubmFtZS4iLCAiXHU1MjI1XHU1NDBEXHUzMDkyXHU1MTY1XHU1MjlCXHUzMDU3XHUzMDY2XHUzMDRGXHUzMDYwXHUzMDU1XHUzMDQ0OiAgIn0sCi0gICAgICAgIHsiLlJFVFVSTi5pZi5zYW1lLmFzLmZvci5vdGhlckFsaWFzLiIsCi0gICAgICAgICAgICAgICAgIlx0KDx7MH0+XHUzMDY4XHU1NDBDXHUzMDU4XHU1ODM0XHU1NDA4XHUzMDZGUkVUVVJOXHUzMDkyXHU2MkJDXHUzMDU3XHUzMDY2XHUzMDRGXHUzMDYwXHUzMDU1XHUzMDQ0KSJ9LAotICAgICAgICB7Ii5QQVRURVJOLnByaW50WDUwOUNlcnQiLAotICAgICAgICAgICAgICAgICJcdTYyNDBcdTY3MDlcdTgwMDU6IHswfVxuXHU3NjdBXHU4ODRDXHU4MDA1OiB7MX1cblx1MzBCN1x1MzBFQVx1MzBBMlx1MzBFQlx1NzU2QVx1NTNGNzogezJ9XG5cdTY3MDlcdTUyQjlcdTY3MUZcdTk1OTNcdTMwNkVcdTk1OEJcdTU5Q0JcdTY1RTU6IHszfVx1N0Q0Mlx1NEU4Nlx1NjVFNTogezR9XG5cdThBM0NcdTY2MEVcdTY2RjhcdTMwNkVcdTMwRDVcdTMwQTNcdTMwRjNcdTMwQUNcdTMwRDdcdTMwRUFcdTMwRjNcdTMwQzg6XG5cdCBNRDU6ICB7NX1cblx0IFNIQTE6IHs2fVxuXHQgU0hBMjU2OiB7N31cblx0IFx1N0Y3Mlx1NTQwRFx1MzBBMlx1MzBFQlx1MzBCNFx1MzBFQVx1MzBCQVx1MzBFMFx1NTQwRDogezh9XG5cdCBcdTMwRDBcdTMwRkNcdTMwQjhcdTMwRTdcdTMwRjM6IHs5fSJ9LAotICAgICAgICB7IldoYXQuaXMueW91ci5maXJzdC5hbmQubGFzdC5uYW1lLiIsCi0gICAgICAgICAgICAgICAgIlx1NTlEM1x1NTQwRFx1MzA5Mlx1NTE2NVx1NTI5Qlx1MzA1N1x1MzA2Nlx1MzA0Rlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMiJ9LAotICAgICAgICB7IldoYXQuaXMudGhlLm5hbWUub2YueW91ci5vcmdhbml6YXRpb25hbC51bml0LiIsCi0gICAgICAgICAgICAgICAgIlx1N0Q0NFx1N0U1NFx1NTM1OFx1NEY0RFx1NTQwRFx1MzA5Mlx1NTE2NVx1NTI5Qlx1MzA1N1x1MzA2Nlx1MzA0Rlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMiJ9LAotICAgICAgICB7IldoYXQuaXMudGhlLm5hbWUub2YueW91ci5vcmdhbml6YXRpb24uIiwKLSAgICAgICAgICAgICAgICAiXHU3RDQ0XHU3RTU0XHU1NDBEXHUzMDkyXHU1MTY1XHU1MjlCXHUzMDU3XHUzMDY2XHUzMDRGXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyIn0sCi0gICAgICAgIHsiV2hhdC5pcy50aGUubmFtZS5vZi55b3VyLkNpdHkub3IuTG9jYWxpdHkuIiwKLSAgICAgICAgICAgICAgICAiXHU5MEZEXHU1RTAyXHU1NDBEXHUzMDdFXHUzMDVGXHUzMDZGXHU1NzMwXHU1N0RGXHU1NDBEXHUzMDkyXHU1MTY1XHU1MjlCXHUzMDU3XHUzMDY2XHUzMDRGXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyIn0sCi0gICAgICAgIHsiV2hhdC5pcy50aGUubmFtZS5vZi55b3VyLlN0YXRlLm9yLlByb3ZpbmNlLiIsCi0gICAgICAgICAgICAgICAgIlx1OTBGRFx1OTA1M1x1NUU5Q1x1NzcwQ1x1NTQwRFx1MzA5Mlx1NTE2NVx1NTI5Qlx1MzA1N1x1MzA2Nlx1MzA0Rlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMiJ9LAotICAgICAgICB7IldoYXQuaXMudGhlLnR3by5sZXR0ZXIuY291bnRyeS5jb2RlLmZvci50aGlzLnVuaXQuIiwKLSAgICAgICAgICAgICAgICAiXHUzMDUzXHUzMDZFXHU1MzU4XHU0RjREXHUzMDZCXHU4QTcyXHU1RjUzXHUzMDU5XHUzMDhCMlx1NjU4N1x1NUI1N1x1MzA2RVx1NTZGRFx1MzBCM1x1MzBGQ1x1MzBDOVx1MzA5Mlx1NTE2NVx1NTI5Qlx1MzA1N1x1MzA2Nlx1MzA0Rlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMiJ9LAotICAgICAgICB7IklzLm5hbWUuY29ycmVjdC4iLCAiezB9XHUzMDY3XHUzMDg4XHUzMDhEXHUzMDU3XHUzMDQ0XHUzMDY3XHUzMDU5XHUzMDRCXHUzMDAyIn0sCi0gICAgICAgIHsibm8iLCAiXHUzMDQ0XHUzMDQ0XHUzMDQ4In0sCi0gICAgICAgIHsieWVzIiwgIlx1MzA2Rlx1MzA0NCJ9LAotICAgICAgICB7InkiLCAieSJ9LAotICAgICAgICB7Ii5kZWZhdWx0VmFsdWUuIiwgIiAgW3swfV06ICAifSwKLSAgICAgICAgeyJBbGlhcy5hbGlhcy5oYXMubm8ua2V5IiwKLSAgICAgICAgICAgICAgICAiXHU1MjI1XHU1NDBEPHswfT5cdTMwNkJcdTMwNkZcdTkzNzVcdTMwNENcdTMwNDJcdTMwOEFcdTMwN0VcdTMwNUJcdTMwOTMifSwKLSAgICAgICAgeyJBbGlhcy5hbGlhcy5yZWZlcmVuY2VzLmFuLmVudHJ5LnR5cGUudGhhdC5pcy5ub3QuYS5wcml2YXRlLmtleS5lbnRyeS5UaGUua2V5Y2xvbmUuY29tbWFuZC5vbmx5LnN1cHBvcnRzLmNsb25pbmcub2YucHJpdmF0ZS5rZXkiLAotICAgICAgICAgICAgICAgICAiXHU1MjI1XHU1NDBEPHswfT5cdTMwNENcdTUzQzJcdTcxNjdcdTMwNTdcdTMwNjZcdTMwNDRcdTMwOEJcdTMwQThcdTMwRjNcdTMwQzhcdTMwRUFcdTMwRkJcdTMwQkZcdTMwQTRcdTMwRDdcdTMwNkZcdTc5RDhcdTVCQzZcdTkzNzVcdTMwQThcdTMwRjNcdTMwQzhcdTMwRUFcdTMwNjdcdTMwNkZcdTMwNDJcdTMwOEFcdTMwN0VcdTMwNUJcdTMwOTNcdTMwMDIta2V5Y2xvbmVcdTMwQjNcdTMwREVcdTMwRjNcdTMwQzlcdTMwNkZcdTc5RDhcdTVCQzZcdTkzNzVcdTMwQThcdTMwRjNcdTMwQzhcdTMwRUFcdTMwNkVcdTMwQUZcdTMwRURcdTMwRkNcdTMwRjNcdTRGNUNcdTYyMTBcdTMwNkVcdTMwN0ZcdTMwOTJcdTMwQjVcdTMwRERcdTMwRkNcdTMwQzhcdTMwNTdcdTMwN0VcdTMwNTkifSwKLQotICAgICAgICB7Ii5XQVJOSU5HLldBUk5JTkcuV0FSTklORy4iLAotICAgICAgICAgICAgIioqKioqKioqKioqKioqKioqXHU4QjY2XHU1NDRBIFx1OEI2Nlx1NTQ0QSBcdThCNjZcdTU0NEEqKioqKioqKioqKioqKioqKiJ9LAotICAgICAgICB7IlNpZ25lci5kLiIsICJcdTdGNzJcdTU0MERcdTgwMDVcdTc1NkFcdTUzRjclZDoifSwKLSAgICAgICAgeyJUaW1lc3RhbXAuIiwgIlx1MzBCRlx1MzBBNFx1MzBFMFx1MzBCOVx1MzBCRlx1MzBGM1x1MzBENzoifSwKLSAgICAgICAgeyJTaWduYXR1cmUuIiwgIlx1N0Y3Mlx1NTQwRDoifSwKLSAgICAgICAgeyJDUkxzLiIsICJDUkw6In0sCi0gICAgICAgIHsiQ2VydGlmaWNhdGUub3duZXIuIiwgIlx1OEEzQ1x1NjYwRVx1NjZGOFx1MzA2RVx1NjI0MFx1NjcwOVx1ODAwNTogIn0sCi0gICAgICAgIHsiTm90LmEuc2lnbmVkLmphci5maWxlIiwgIlx1N0Y3Mlx1NTQwRFx1NEVEOFx1MzA0REpBUlx1MzBENVx1MzBBMVx1MzBBNFx1MzBFQlx1MzA2N1x1MzA2Rlx1MzA0Mlx1MzA4QVx1MzA3RVx1MzA1Qlx1MzA5MyJ9LAotICAgICAgICB7Ik5vLmNlcnRpZmljYXRlLmZyb20udGhlLlNTTC5zZXJ2ZXIiLAotICAgICAgICAgICAgICAgICJTU0xcdTMwQjVcdTMwRkNcdTMwRDBcdTMwRkNcdTMwNEJcdTMwODlcdTMwNkVcdThBM0NcdTY2MEVcdTY2RjhcdTMwNENcdTMwNDJcdTMwOEFcdTMwN0VcdTMwNUJcdTMwOTMifSwKLQotICAgICAgICB7Ii5UaGUuaW50ZWdyaXR5Lm9mLnRoZS5pbmZvcm1hdGlvbi5zdG9yZWQuaW4ueW91ci5rZXlzdG9yZS4iLAotICAgICAgICAgICAgIipcdTMwQURcdTMwRkNcdTMwQjlcdTMwQzhcdTMwQTJcdTMwNkJcdTRGRERcdTVCNThcdTMwNTVcdTMwOENcdTMwNUZcdTYwQzVcdTU4MzFcdTMwNkVcdTY1NzRcdTU0MDhcdTYwMjdcdTMwNkYqXG4qXHU2OTFDXHU4QTNDXHUzMDU1XHUzMDhDXHUzMDY2XHUzMDQ0XHUzMDdFXHUzMDVCXHUzMDkzXHUzMDAyXHU2NTc0XHU1NDA4XHU2MDI3XHUzMDkyXHU2OTFDXHU4QTNDXHUzMDU5XHUzMDhCXHUzMDZCXHUzMDZGKlxuKlx1MzBBRFx1MzBGQ1x1MzBCOVx1MzBDOFx1MzBBMlx1MzA2RVx1MzBEMVx1MzBCOVx1MzBFRlx1MzBGQ1x1MzBDOVx1MzA5Mlx1NTE2NVx1NTI5Qlx1MzA1OVx1MzA4Qlx1NUZDNVx1ODk4MVx1MzA0Q1x1MzA0Mlx1MzA4QVx1MzA3RVx1MzA1OVx1MzAwMioifSwKLSAgICAgICAgeyIuVGhlLmludGVncml0eS5vZi50aGUuaW5mb3JtYXRpb24uc3RvcmVkLmluLnRoZS5zcmNrZXlzdG9yZS4iLAotICAgICAgICAgICAgIipcdTMwQkRcdTMwRkNcdTMwQjlcdTMwRkJcdTMwQURcdTMwRkNcdTMwQjlcdTMwQzhcdTMwQTJcdTMwNkJcdTRGRERcdTVCNThcdTMwNTVcdTMwOENcdTMwNUZcdTYwQzVcdTU4MzFcdTMwNkVcdTY1NzRcdTU0MDhcdTYwMjdcdTMwNkYqXG4qXHU2OTFDXHU4QTNDXHUzMDU1XHUzMDhDXHUzMDY2XHUzMDQ0XHUzMDdFXHUzMDVCXHUzMDkzXHUzMDAyXHU2NTc0XHU1NDA4XHU2MDI3XHUzMDkyXHU2OTFDXHU4QTNDXHUzMDU5XHUzMDhCXHUzMDZCXHUzMDZGKlxuKlx1MzBCRFx1MzBGQ1x1MzBCOVx1MzBGQlx1MzBBRFx1MzBGQ1x1MzBCOVx1MzBDOFx1MzBBMlx1MzA2RVx1MzBEMVx1MzBCOVx1MzBFRlx1MzBGQ1x1MzBDOVx1MzA5Mlx1NTE2NVx1NTI5Qlx1MzA1OVx1MzA4Qlx1NUZDNVx1ODk4MVx1MzA0Q1x1MzA0Mlx1MzA4QVx1MzA3RVx1MzA1OVx1MzAwMioifSwKLQotICAgICAgICB7IkNlcnRpZmljYXRlLnJlcGx5LmRvZXMubm90LmNvbnRhaW4ucHVibGljLmtleS5mb3IuYWxpYXMuIiwKLSAgICAgICAgICAgICAgICAiXHU4QTNDXHU2NjBFXHU2NkY4XHU1RkRDXHU3QjU0XHUzMDZCXHUzMDZGXHUzMDAxPHswfT5cdTMwNkVcdTUxNkNcdTk1OEJcdTkzNzVcdTMwNkZcdTU0MkJcdTMwN0VcdTMwOENcdTMwN0VcdTMwNUJcdTMwOTMifSwKLSAgICAgICAgeyJJbmNvbXBsZXRlLmNlcnRpZmljYXRlLmNoYWluLmluLnJlcGx5IiwKLSAgICAgICAgICAgICAgICAiXHU1RkRDXHU3QjU0XHUzMDU3XHUzMDVGXHU4QTNDXHU2NjBFXHU2NkY4XHUzMEMxXHUzMEE3XHUzMEZDXHUzMEYzXHUzMDZGXHU0RTBEXHU1QjhDXHU1MTY4XHUzMDY3XHUzMDU5In0sCi0gICAgICAgIHsiQ2VydGlmaWNhdGUuY2hhaW4uaW4ucmVwbHkuZG9lcy5ub3QudmVyaWZ5LiIsCi0gICAgICAgICAgICAgICAgIlx1NUZEQ1x1N0I1NFx1MzA1N1x1MzA1Rlx1OEEzQ1x1NjYwRVx1NjZGOFx1MzBDMVx1MzBBN1x1MzBGQ1x1MzBGM1x1MzA2Rlx1NjkxQ1x1OEEzQ1x1MzA1NVx1MzA4Q1x1MzA2Nlx1MzA0NFx1MzA3RVx1MzA1Qlx1MzA5MzogIn0sCi0gICAgICAgIHsiVG9wLmxldmVsLmNlcnRpZmljYXRlLmluLnJlcGx5LiIsCi0gICAgICAgICAgICAgICAgIlx1NUZEQ1x1N0I1NFx1MzA1N1x1MzA1Rlx1MzBDOFx1MzBDM1x1MzBEN1x1MzBFQ1x1MzBEOVx1MzBFQlx1MzA2RVx1OEEzQ1x1NjYwRVx1NjZGODpcbiJ9LAotICAgICAgICB7Ii5pcy5ub3QudHJ1c3RlZC4iLCAiLi4uIFx1MzA2Rlx1NEZFMVx1OTgzQ1x1MzA1NVx1MzA4Q1x1MzA2Nlx1MzA0NFx1MzA3RVx1MzA1Qlx1MzA5M1x1MzAwMiAifSwKLSAgICAgICAgeyJJbnN0YWxsLnJlcGx5LmFueXdheS5uby4iLCAiXHU1RkRDXHU3QjU0XHUzMDkyXHUzMEE0XHUzMEYzXHUzMEI5XHUzMEM4XHUzMEZDXHUzMEVCXHUzMDU3XHUzMDdFXHUzMDU5XHUzMDRCXHUzMDAyW1x1MzA0NFx1MzA0NFx1MzA0OF06ICAifSwKLSAgICAgICAgeyJOTyIsICJcdTMwNDRcdTMwNDRcdTMwNDgifSwKLSAgICAgICAgeyJQdWJsaWMua2V5cy5pbi5yZXBseS5hbmQua2V5c3RvcmUuZG9uLnQubWF0Y2giLAotICAgICAgICAgICAgICAgICJcdTVGRENcdTdCNTRcdTMwNTdcdTMwNUZcdTUxNkNcdTk1OEJcdTkzNzVcdTMwNjhcdTMwQURcdTMwRkNcdTMwQjlcdTMwQzhcdTMwQTJcdTMwNENcdTRFMDBcdTgxRjRcdTMwNTdcdTMwN0VcdTMwNUJcdTMwOTMifSwKLSAgICAgICAgeyJDZXJ0aWZpY2F0ZS5yZXBseS5hbmQuY2VydGlmaWNhdGUuaW4ua2V5c3RvcmUuYXJlLmlkZW50aWNhbCIsCi0gICAgICAgICAgICAgICAgIlx1OEEzQ1x1NjYwRVx1NjZGOFx1NUZEQ1x1N0I1NFx1MzA2OFx1MzBBRFx1MzBGQ1x1MzBCOVx1MzBDOFx1MzBBMlx1NTE4NVx1MzA2RVx1OEEzQ1x1NjYwRVx1NjZGOFx1MzA0Q1x1NTQwQ1x1MzA1OFx1MzA2N1x1MzA1OSJ9LAotICAgICAgICB7IkZhaWxlZC50by5lc3RhYmxpc2guY2hhaW4uZnJvbS5yZXBseSIsCi0gICAgICAgICAgICAgICAgIlx1NUZEQ1x1N0I1NFx1MzA0Qlx1MzA4OVx1OTAyM1x1OTM5Nlx1MzA5Mlx1NzhCQVx1N0FDQlx1MzA2N1x1MzA0RFx1MzA3RVx1MzA1Qlx1MzA5M1x1MzA2N1x1MzA1N1x1MzA1RiJ9LAotICAgICAgICB7Im4iLCAibiJ9LAotICAgICAgICB7Ildyb25nLmFuc3dlci50cnkuYWdhaW4iLCAiXHU1RkRDXHU3QjU0XHUzMDRDXHU5NTkzXHU5MDU1XHUzMDYzXHUzMDY2XHUzMDQ0XHUzMDdFXHUzMDU5XHUzMDAyXHUzMDgyXHUzMDQ2XHU0RTAwXHU1RUE2XHU1QjlGXHU4ODRDXHUzMDU3XHUzMDY2XHUzMDRGXHUzMDYwXHUzMDU1XHUzMDQ0In0sCi0gICAgICAgIHsiU2VjcmV0LmtleS5ub3QuZ2VuZXJhdGVkLmFsaWFzLmFsaWFzLmFscmVhZHkuZXhpc3RzIiwKLSAgICAgICAgICAgICAgICAiXHU3OUQ4XHU1QkM2XHU5Mzc1XHUzMDZGXHU3NTFGXHU2MjEwXHUzMDU1XHUzMDhDXHUzMDdFXHUzMDVCXHUzMDkzXHUzMDY3XHUzMDU3XHUzMDVGXHUzMDAyXHU1MjI1XHU1NDBEPHswfT5cdTMwNkZcdTMwNTlcdTMwNjdcdTMwNkJcdTVCNThcdTU3MjhcdTMwNTdcdTMwN0VcdTMwNTkifSwKLSAgICAgICAgeyJQbGVhc2UucHJvdmlkZS5rZXlzaXplLmZvci5zZWNyZXQua2V5LmdlbmVyYXRpb24iLAotICAgICAgICAgICAgICAgICJcdTc5RDhcdTVCQzZcdTkzNzVcdTMwNkVcdTc1MUZcdTYyMTBcdTY2NDJcdTMwNkJcdTMwNkYgLWtleXNpemVcdTMwOTJcdTYzMDdcdTVCOUFcdTMwNTdcdTMwNjZcdTMwNEZcdTMwNjBcdTMwNTVcdTMwNDQifSwKLQotICAgICAgICB7IkV4dGVuc2lvbnMuIiwgIlx1NjJFMVx1NUYzNTogIn0sCi0gICAgICAgIHsiLkVtcHR5LnZhbHVlLiIsICIoXHU3QTdBXHUzMDZFXHU1MDI0KSJ9LAotICAgICAgICB7IkV4dGVuc2lvbi5SZXF1ZXN0LiIsICJcdTYyRTFcdTVGMzVcdTMwRUFcdTMwQUZcdTMwQThcdTMwQjlcdTMwQzg6In0sCi0gICAgICAgIHsiUEtDUy4xMC5DZXJ0aWZpY2F0ZS5SZXF1ZXN0LlZlcnNpb24uMS4wLlN1YmplY3Qucy5QdWJsaWMuS2V5LnMuZm9ybWF0LnMua2V5LiIsCi0gICAgICAgICAgICAgICAgIlBLQ1MgIzEwXHU4QTNDXHU2NjBFXHU2NkY4XHUzMEVBXHUzMEFGXHUzMEE4XHUzMEI5XHUzMEM4KFx1MzBEMFx1MzBGQ1x1MzBCOFx1MzBFN1x1MzBGMzEuMClcblx1MzBCNVx1MzBENlx1MzBCOFx1MzBBN1x1MzBBRlx1MzBDODogJXNcblx1NTE2Q1x1OTU4Qlx1OTM3NTogJXMgXHUzMEQ1XHUzMEE5XHUzMEZDXHUzMERFXHUzMEMzXHUzMEM4ICVzIFx1MzBBRFx1MzBGQ1xuIn0sCi0gICAgICAgIHsiVW5rbm93bi5rZXlVc2FnZS50eXBlLiIsICJcdTRFMERcdTY2MEVcdTMwNkFrZXlVc2FnZVx1MzBCRlx1MzBBNFx1MzBENzogIn0sCi0gICAgICAgIHsiVW5rbm93bi5leHRlbmRlZGtleVVzYWdlLnR5cGUuIiwgIlx1NEUwRFx1NjYwRVx1MzA2QWV4dGVuZGVka2V5VXNhZ2VcdTMwQkZcdTMwQTRcdTMwRDc6ICJ9LAotICAgICAgICB7IlVua25vd24uQWNjZXNzRGVzY3JpcHRpb24udHlwZS4iLCAiXHU0RTBEXHU2NjBFXHUzMDZBQWNjZXNzRGVzY3JpcHRpb25cdTMwQkZcdTMwQTRcdTMwRDc6ICJ9LAotICAgICAgICB7IlVucmVjb2duaXplZC5HZW5lcmFsTmFtZS50eXBlLiIsICJcdThBOERcdThCNThcdTMwNTVcdTMwOENcdTMwNkFcdTMwNDRHZW5lcmFsTmFtZVx1MzBCRlx1MzBBNFx1MzBENzogIn0sCi0gICAgICAgIHsiVGhpcy5leHRlbnNpb24uY2Fubm90LmJlLm1hcmtlZC5hcy5jcml0aWNhbC4iLAotICAgICAgICAgICAgICAgICAiXHUzMDUzXHUzMDZFXHU2MkUxXHU1RjM1XHUzMDZGXHUzMEFGXHUzMEVBXHUzMEM2XHUzMEEzXHUzMEFCXHUzMEVCXHUzMDY4XHUzMDU3XHUzMDY2XHUzMERFXHUzMEZDXHUzMEFGXHU0RUQ4XHUzMDUxXHUzMDY3XHUzMDREXHUzMDdFXHUzMDVCXHUzMDkzXHUzMDAyICJ9LAotICAgICAgICB7Ik9kZC5udW1iZXIub2YuaGV4LmRpZ2l0cy5mb3VuZC4iLCAiXHU1OTQ3XHU2NTcwXHUzMDZFMTZcdTkwMzJcdTY1NzBcdTMwNENcdTg5OEJcdTMwNjRcdTMwNEJcdTMwOEFcdTMwN0VcdTMwNTdcdTMwNUY6ICJ9LAotICAgICAgICB7IlVua25vd24uZXh0ZW5zaW9uLnR5cGUuIiwgIlx1NEUwRFx1NjYwRVx1MzA2QVx1NjJFMVx1NUYzNVx1MzBCRlx1MzBBNFx1MzBENzogIn0sCi0gICAgICAgIHsiY29tbWFuZC57MH0uaXMuYW1iaWd1b3VzLiIsICJcdTMwQjNcdTMwREVcdTMwRjNcdTMwQzl7MH1cdTMwNkZcdTMwNDJcdTMwNDRcdTMwN0VcdTMwNDRcdTMwNjdcdTMwNTk6In0sCi0KLSAgICAgICAgLy8gcG9saWN5dG9vbAotICAgICAgICB7Ildhcm5pbmcuQS5wdWJsaWMua2V5LmZvci5hbGlhcy5zaWduZXJzLmkuZG9lcy5ub3QuZXhpc3QuTWFrZS5zdXJlLmEuS2V5U3RvcmUuaXMucHJvcGVybHkuY29uZmlndXJlZC4iLAotICAgICAgICAgICAgICAgICJcdThCNjZcdTU0NEE6IFx1NTIyNVx1NTQwRHswfVx1MzA2RVx1NTE2Q1x1OTU4Qlx1OTM3NVx1MzA0Q1x1NUI1OFx1NTcyOFx1MzA1N1x1MzA3RVx1MzA1Qlx1MzA5M1x1MzAwMlx1MzBBRFx1MzBGQ1x1MzBCOVx1MzBDOFx1MzBBMlx1MzA0Q1x1NkI2M1x1MzA1N1x1MzA0Rlx1NjlDQlx1NjIxMFx1MzA1NVx1MzA4Q1x1MzA2Nlx1MzA0NFx1MzA4Qlx1MzA1M1x1MzA2OFx1MzA5Mlx1NzhCQVx1OEE4RFx1MzA1N1x1MzA2Nlx1MzA0Rlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMiJ9LAotICAgICAgICB7Ildhcm5pbmcuQ2xhc3Mubm90LmZvdW5kLmNsYXNzIiwgIlx1OEI2Nlx1NTQ0QTogXHUzMEFGXHUzMEU5XHUzMEI5XHUzMDRDXHU4OThCXHUzMDY0XHUzMDRCXHUzMDhBXHUzMDdFXHUzMDVCXHUzMDkzOiB7MH0ifSwKLSAgICAgICAgeyJXYXJuaW5nLkludmFsaWQuYXJndW1lbnQucy5mb3IuY29uc3RydWN0b3IuYXJnIiwKLSAgICAgICAgICAgICAgICAiXHU4QjY2XHU1NDRBOiBcdTMwQjNcdTMwRjNcdTMwQjlcdTMwQzhcdTMwRTlcdTMwQUZcdTMwQkZcdTMwNkVcdTVGMTVcdTY1NzBcdTMwNENcdTcxMjFcdTUyQjlcdTMwNjdcdTMwNTk6IHswfSJ9LAotICAgICAgICB7IklsbGVnYWwuUHJpbmNpcGFsLlR5cGUudHlwZSIsICJcdTRFMERcdTZCNjNcdTMwNkFcdTMwRDdcdTMwRUFcdTMwRjNcdTMwQjdcdTMwRDFcdTMwRUJcdTMwNkVcdTMwQkZcdTMwQTRcdTMwRDc6IHswfSJ9LAotICAgICAgICB7IklsbGVnYWwub3B0aW9uLm9wdGlvbiIsICJcdTRFMERcdTZCNjNcdTMwNkFcdTMwQUFcdTMwRDdcdTMwQjdcdTMwRTdcdTMwRjM6IHswfSJ9LAotICAgICAgICB7IlVzYWdlLnBvbGljeXRvb2wub3B0aW9ucy4iLCAiXHU0RjdGXHU3NTI4XHU2NUI5XHU2Q0Q1OiBwb2xpY3l0b29sIFtvcHRpb25zXSJ9LAotICAgICAgICB7Ii5maWxlLmZpbGUucG9saWN5LmZpbGUubG9jYXRpb24iLAotICAgICAgICAgICAgICAgICIgIFstZmlsZSA8ZmlsZT5dICBcdTMwRERcdTMwRUFcdTMwQjdcdTMwRkNcdTMwRkJcdTMwRDVcdTMwQTFcdTMwQTRcdTMwRUJcdTMwNkVcdTU4MzRcdTYyNDAifSwKLSAgICAgICAgeyJOZXciLCAiXHU2NUIwXHU4OThGIn0sCi0gICAgICAgIHsiT3BlbiIsICJcdTk1OEJcdTMwNEYifSwKLSAgICAgICAgeyJTYXZlIiwgIlx1NEZERFx1NUI1OCJ9LAotICAgICAgICB7IlNhdmUuQXMiLCAiXHU1MjI1XHU1NDBEXHU0RkREXHU1QjU4In0sCi0gICAgICAgIHsiVmlldy5XYXJuaW5nLkxvZyIsICJcdThCNjZcdTU0NEFcdTMwRURcdTMwQjBcdTMwNkVcdTg4NjhcdTc5M0EifSwKLSAgICAgICAgeyJFeGl0IiwgIlx1N0Q0Mlx1NEU4NiJ9LAotICAgICAgICB7IkFkZC5Qb2xpY3kuRW50cnkiLCAiXHUzMEREXHUzMEVBXHUzMEI3XHUzMEZDXHUzMEZCXHUzMEE4XHUzMEYzXHUzMEM4XHUzMEVBXHUzMDZFXHU4RkZEXHU1MkEwIn0sCi0gICAgICAgIHsiRWRpdC5Qb2xpY3kuRW50cnkiLCAiXHUzMEREXHUzMEVBXHUzMEI3XHUzMEZDXHUzMEZCXHUzMEE4XHUzMEYzXHUzMEM4XHUzMEVBXHUzMDZFXHU3REU4XHU5NkM2In0sCi0gICAgICAgIHsiUmVtb3ZlLlBvbGljeS5FbnRyeSIsICJcdTMwRERcdTMwRUFcdTMwQjdcdTMwRkNcdTMwRkJcdTMwQThcdTMwRjNcdTMwQzhcdTMwRUFcdTMwNkVcdTUyNEFcdTk2NjQifSwKLSAgICAgICAgeyJFZGl0IiwgIlx1N0RFOFx1OTZDNiJ9LAotICAgICAgICB7IlJldGFpbiIsICJcdTRGRERcdTYzMDEifSwKLQotICAgICAgICB7Ildhcm5pbmcuRmlsZS5uYW1lLm1heS5pbmNsdWRlLmVzY2FwZWQuYmFja3NsYXNoLmNoYXJhY3RlcnMuSXQuaXMubm90Lm5lY2Vzc2FyeS50by5lc2NhcGUuYmFja3NsYXNoLmNoYXJhY3RlcnMudGhlLnRvb2wuZXNjYXBlcyIsCi0gICAgICAgICAgICAiXHU4QjY2XHU1NDRBOiBcdTMwRDVcdTMwQTFcdTMwQTRcdTMwRUJcdTU0MERcdTMwNkJcdTMwQThcdTMwQjlcdTMwQjFcdTMwRkNcdTMwRDdcdTMwNTVcdTMwOENcdTMwNUZcdTMwRDBcdTMwQzNcdTMwQUZcdTMwQjlcdTMwRTlcdTMwQzNcdTMwQjdcdTMwRTVcdTY1ODdcdTVCNTdcdTMwNENcdTU0MkJcdTMwN0VcdTMwOENcdTMwNjZcdTMwNDRcdTMwOEJcdTUzRUZcdTgwRkRcdTYwMjdcdTMwNENcdTMwNDJcdTMwOEFcdTMwN0VcdTMwNTlcdTMwMDJcdTMwRDBcdTMwQzNcdTMwQUZcdTMwQjlcdTMwRTlcdTMwQzNcdTMwQjdcdTMwRTVcdTY1ODdcdTVCNTdcdTMwOTJcdTMwQThcdTMwQjlcdTMwQjFcdTMwRkNcdTMwRDdcdTMwNTlcdTMwOEJcdTVGQzVcdTg5ODFcdTMwNkZcdTMwNDJcdTMwOEFcdTMwN0VcdTMwNUJcdTMwOTMoXHUzMEM0XHUzMEZDXHUzMEVCXHUzMDZGXHUzMEREXHUzMEVBXHUzMEI3XHUzMEZDXHU1MTg1XHU1QkI5XHUzMDkyXHU2QzM4XHU3RDlBXHUzMEI5XHUzMEM4XHUzMEEyXHUzMDZCXHU2NkY4XHUzMDREXHU4RkJDXHUzMDgwXHUzMDY4XHUzMDREXHUzMDZCXHUzMDAxXHU1RkM1XHU4OTgxXHUzMDZCXHU1RkRDXHUzMDU4XHUzMDY2XHU2NTg3XHU1QjU3XHUzMDkyXHUzMEE4XHUzMEI5XHUzMEIxXHUzMEZDXHUzMEQ3XHUzMDU3XHUzMDdFXHUzMDU5KVx1MzAwMlxuXG5cdTUxNjVcdTUyOUJcdTZFMDhcdTMwNkVcdTU0MERcdTUyNERcdTMwOTJcdTRGRERcdTYzMDFcdTMwNTlcdTMwOEJcdTMwNkJcdTMwNkZcdTMwMENcdTRGRERcdTYzMDFcdTMwMERcdTMwOTJcdTMwQUZcdTMwRUFcdTMwQzNcdTMwQUZcdTMwNTdcdTMwMDFcdTU0MERcdTUyNERcdTMwOTJcdTdERThcdTk2QzZcdTMwNTlcdTMwOEJcdTMwNkJcdTMwNkZcdTMwMENcdTdERThcdTk2QzZcdTMwMERcdTMwOTJcdTMwQUZcdTMwRUFcdTMwQzNcdTMwQUZcdTMwNTdcdTMwNjZcdTMwNEZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDIifSwKLQotICAgICAgICB7IkFkZC5QdWJsaWMuS2V5LkFsaWFzIiwgIlx1NTE2Q1x1OTU4Qlx1OTM3NVx1MzA2RVx1NTIyNVx1NTQwRFx1MzA2RVx1OEZGRFx1NTJBMCJ9LAotICAgICAgICB7IlJlbW92ZS5QdWJsaWMuS2V5LkFsaWFzIiwgIlx1NTE2Q1x1OTU4Qlx1OTM3NVx1MzA2RVx1NTIyNVx1NTQwRFx1MzA5Mlx1NTI0QVx1OTY2NCJ9LAotICAgICAgICB7IkZpbGUiLCAiXHUzMEQ1XHUzMEExXHUzMEE0XHUzMEVCIn0sCi0gICAgICAgIHsiS2V5U3RvcmUiLCAiXHUzMEFEXHUzMEZDXHUzMEI5XHUzMEM4XHUzMEEyIn0sCi0gICAgICAgIHsiUG9saWN5LkZpbGUuIiwgIlx1MzBERFx1MzBFQVx1MzBCN1x1MzBGQ1x1MzBGQlx1MzBENVx1MzBBMVx1MzBBNFx1MzBFQjoifSwKLSAgICAgICAgeyJDb3VsZC5ub3Qub3Blbi5wb2xpY3kuZmlsZS5wb2xpY3lGaWxlLmUudG9TdHJpbmcuIiwKLSAgICAgICAgICAgICAgICAiXHUzMEREXHUzMEVBXHUzMEI3XHUzMEZDXHUzMEZCXHUzMEQ1XHUzMEExXHUzMEE0XHUzMEVCXHUzMDkyXHU5NThCXHUzMDUxXHUzMDdFXHUzMDVCXHUzMDkzXHUzMDY3XHUzMDU3XHUzMDVGOiB7MH06IHsxfSJ9LAotICAgICAgICB7IlBvbGljeS5Ub29sIiwgIlx1MzBERFx1MzBFQVx1MzBCN1x1MzBGQ1x1MzBGQlx1MzBDNFx1MzBGQ1x1MzBFQiJ9LAotICAgICAgICB7IkVycm9ycy5oYXZlLm9jY3VycmVkLndoaWxlLm9wZW5pbmcudGhlLnBvbGljeS5jb25maWd1cmF0aW9uLlZpZXcudGhlLldhcm5pbmcuTG9nLmZvci5tb3JlLmluZm9ybWF0aW9uLiIsCi0gICAgICAgICAgICAgICAgIlx1MzBERFx1MzBFQVx1MzBCN1x1MzBGQ1x1NjlDQlx1NjIxMFx1MzA5Mlx1OTU4Qlx1MzA0Rlx1MzA2OFx1MzA0RFx1MzA2Qlx1MzBBOFx1MzBFOVx1MzBGQ1x1MzA0Q1x1NzY3QVx1NzUxRlx1MzA1N1x1MzA3RVx1MzA1N1x1MzA1Rlx1MzAwMlx1OEE3M1x1N0QzMFx1MzA2Rlx1OEI2Nlx1NTQ0QVx1MzBFRFx1MzBCMFx1MzA5Mlx1NTNDMlx1NzE2N1x1MzA1N1x1MzA2Nlx1MzA0Rlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMiJ9LAotICAgICAgICB7IkVycm9yIiwgIlx1MzBBOFx1MzBFOVx1MzBGQyJ9LAotICAgICAgICB7Ik9LIiwgIk9LIn0sCi0gICAgICAgIHsiU3RhdHVzIiwgIlx1NzJCNlx1NjE0QiJ9LAotICAgICAgICB7Ildhcm5pbmciLCAiXHU4QjY2XHU1NDRBIn0sCi0gICAgICAgIHsiUGVybWlzc2lvbi4iLAotICAgICAgICAgICAgICAgICJcdTMwQTJcdTMwQUZcdTMwQkJcdTMwQjlcdTZBMjk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9LAotICAgICAgICB7IlByaW5jaXBhbC5UeXBlLiIsICJcdTMwRDdcdTMwRUFcdTMwRjNcdTMwQjdcdTMwRDFcdTMwRUJcdTMwNkVcdTMwQkZcdTMwQTRcdTMwRDc6In0sCi0gICAgICAgIHsiUHJpbmNpcGFsLk5hbWUuIiwgIlx1MzBEN1x1MzBFQVx1MzBGM1x1MzBCN1x1MzBEMVx1MzBFQlx1MzA2RVx1NTQwRFx1NTI0RDoifSwKLSAgICAgICAgeyJUYXJnZXQuTmFtZS4iLAotICAgICAgICAgICAgICAgICJcdTMwQkZcdTMwRkNcdTMwQjJcdTMwQzNcdTMwQzhcdTU0MEQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9LAotICAgICAgICB7IkFjdGlvbnMuIiwKLSAgICAgICAgICAgICAgICAiXHUzMEEyXHUzMEFGXHUzMEI3XHUzMEU3XHUzMEYzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifSwKLSAgICAgICAgeyJPSy50by5vdmVyd3JpdGUuZXhpc3RpbmcuZmlsZS5maWxlbmFtZS4iLAotICAgICAgICAgICAgICAgICJcdTY1RTJcdTVCNThcdTMwNkVcdTMwRDVcdTMwQTFcdTMwQTRcdTMwRUJ7MH1cdTMwNkJcdTRFMEFcdTY2RjhcdTMwNERcdTMwNTdcdTMwN0VcdTMwNTlcdTMwNEJcdTMwMDIifSwKLSAgICAgICAgeyJDYW5jZWwiLCAiXHU1M0Q2XHU2RDg4In0sCi0gICAgICAgIHsiQ29kZUJhc2UuIiwgIkNvZGVCYXNlOiJ9LAotICAgICAgICB7IlNpZ25lZEJ5LiIsICJTaWduZWRCeToifSwKLSAgICAgICAgeyJBZGQuUHJpbmNpcGFsIiwgIlx1MzBEN1x1MzBFQVx1MzBGM1x1MzBCN1x1MzBEMVx1MzBFQlx1MzA2RVx1OEZGRFx1NTJBMCJ9LAotICAgICAgICB7IkVkaXQuUHJpbmNpcGFsIiwgIlx1MzBEN1x1MzBFQVx1MzBGM1x1MzBCN1x1MzBEMVx1MzBFQlx1MzA2RVx1N0RFOFx1OTZDNiJ9LAotICAgICAgICB7IlJlbW92ZS5QcmluY2lwYWwiLCAiXHUzMEQ3XHUzMEVBXHUzMEYzXHUzMEI3XHUzMEQxXHUzMEVCXHUzMDZFXHU1MjRBXHU5NjY0In0sCi0gICAgICAgIHsiUHJpbmNpcGFscy4iLCAiXHUzMEQ3XHUzMEVBXHUzMEYzXHUzMEI3XHUzMEQxXHUzMEVCOiJ9LAotICAgICAgICB7Ii5BZGQuUGVybWlzc2lvbiIsICIgIFx1MzBBMlx1MzBBRlx1MzBCQlx1MzBCOVx1NkEyOVx1MzA2RVx1OEZGRFx1NTJBMCJ9LAotICAgICAgICB7Ii5FZGl0LlBlcm1pc3Npb24iLCAiICBcdTMwQTJcdTMwQUZcdTMwQkJcdTMwQjlcdTZBMjlcdTMwNkVcdTdERThcdTk2QzYifSwKLSAgICAgICAgeyJSZW1vdmUuUGVybWlzc2lvbiIsICJcdTMwQTJcdTMwQUZcdTMwQkJcdTMwQjlcdTZBMjlcdTMwNkVcdTUyNEFcdTk2NjQifSwKLSAgICAgICAgeyJEb25lIiwgIlx1NUI4Q1x1NEU4NiJ9LAotICAgICAgICB7IktleVN0b3JlLlVSTC4iLCAiXHUzMEFEXHUzMEZDXHUzMEI5XHUzMEM4XHUzMEEyVVJMOiJ9LAotICAgICAgICB7IktleVN0b3JlLlR5cGUuIiwgIlx1MzBBRFx1MzBGQ1x1MzBCOVx1MzBDOFx1MzBBMlx1MzA2RVx1MzBCRlx1MzBBNFx1MzBENzoifSwKLSAgICAgICAgeyJLZXlTdG9yZS5Qcm92aWRlci4iLCAiXHUzMEFEXHUzMEZDXHUzMEI5XHUzMEM4XHUzMEEyXHUzMEZCXHUzMEQ3XHUzMEVEXHUzMEQwXHUzMEE0XHUzMEMwOiJ9LAotICAgICAgICB7IktleVN0b3JlLlBhc3N3b3JkLlVSTC4iLCAiXHUzMEFEXHUzMEZDXHUzMEI5XHUzMEM4XHUzMEEyXHUzMEZCXHUzMEQxXHUzMEI5XHUzMEVGXHUzMEZDXHUzMEM5VVJMOiJ9LAotICAgICAgICB7IlByaW5jaXBhbHMiLCAiXHUzMEQ3XHUzMEVBXHUzMEYzXHUzMEI3XHUzMEQxXHUzMEVCIn0sCi0gICAgICAgIHsiLkVkaXQuUHJpbmNpcGFsLiIsICIgIFx1MzBEN1x1MzBFQVx1MzBGM1x1MzBCN1x1MzBEMVx1MzBFQlx1MzA2RVx1N0RFOFx1OTZDNjoifSwKLSAgICAgICAgeyIuQWRkLk5ldy5QcmluY2lwYWwuIiwgIiAgXHUzMEQ3XHUzMEVBXHUzMEYzXHUzMEI3XHUzMEQxXHUzMEVCXHUzMDZFXHU2NUIwXHU4OThGXHU4RkZEXHU1MkEwOiJ9LAotICAgICAgICB7IlBlcm1pc3Npb25zIiwgIlx1MzBBMlx1MzBBRlx1MzBCQlx1MzBCOVx1NkEyOSJ9LAotICAgICAgICB7Ii5FZGl0LlBlcm1pc3Npb24uIiwgIiAgXHUzMEEyXHUzMEFGXHUzMEJCXHUzMEI5XHU2QTI5XHUzMDZFXHU3REU4XHU5NkM2OiJ9LAotICAgICAgICB7Ii5BZGQuTmV3LlBlcm1pc3Npb24uIiwgIiAgXHU2NUIwXHU4OThGXHUzMEEyXHUzMEFGXHUzMEJCXHUzMEI5XHU2QTI5XHUzMDZFXHU4RkZEXHU1MkEwOiJ9LAotICAgICAgICB7IlNpZ25lZC5CeS4iLCAiXHU3RjcyXHU1NDBEXHU4MDA1OiJ9LAotICAgICAgICB7IkNhbm5vdC5TcGVjaWZ5LlByaW5jaXBhbC53aXRoLmEuV2lsZGNhcmQuQ2xhc3Mud2l0aG91dC5hLldpbGRjYXJkLk5hbWUiLAotICAgICAgICAgICAgIlx1MzBFRlx1MzBBNFx1MzBFQlx1MzBDOVx1MzBBQlx1MzBGQ1x1MzBDOVx1NTQwRFx1MzA2RVx1MzA2QVx1MzA0NFx1MzBFRlx1MzBBNFx1MzBFQlx1MzBDOVx1MzBBQlx1MzBGQ1x1MzBDOVx1MzBGQlx1MzBBRlx1MzBFOVx1MzBCOVx1MzA5Mlx1NEY3Rlx1NzUyOFx1MzA1N1x1MzA2Nlx1MzBEN1x1MzBFQVx1MzBGM1x1MzBCN1x1MzBEMVx1MzBFQlx1MzA5Mlx1NjMwN1x1NUI5QVx1MzA1OVx1MzA4Qlx1MzA1M1x1MzA2OFx1MzA2Rlx1MzA2N1x1MzA0RFx1MzA3RVx1MzA1Qlx1MzA5MyJ9LAotICAgICAgICB7IkNhbm5vdC5TcGVjaWZ5LlByaW5jaXBhbC53aXRob3V0LmEuTmFtZSIsCi0gICAgICAgICAgICAiXHU1NDBEXHU1MjREXHUzMDkyXHU0RjdGXHU3NTI4XHUzMDVCXHUzMDVBXHUzMDZCXHUzMEQ3XHUzMEVBXHUzMEYzXHUzMEI3XHUzMEQxXHUzMEVCXHUzMDkyXHU2MzA3XHU1QjlBXHUzMDU5XHUzMDhCXHUzMDUzXHUzMDY4XHUzMDZGXHUzMDY3XHUzMDREXHUzMDdFXHUzMDVCXHUzMDkzIn0sCi0gICAgICAgIHsiUGVybWlzc2lvbi5hbmQuVGFyZ2V0Lk5hbWUubXVzdC5oYXZlLmEudmFsdWUiLAotICAgICAgICAgICAgICAgICJcdTMwQTJcdTMwQUZcdTMwQkJcdTMwQjlcdTZBMjlcdTMwNjhcdTMwQkZcdTMwRkNcdTMwQjJcdTMwQzNcdTMwQzhcdTU0MERcdTMwNkZcdTMwMDFcdTUwMjRcdTMwOTJcdTRGRERcdTYzMDFcdTMwNTlcdTMwOEJcdTVGQzVcdTg5ODFcdTMwNENcdTMwNDJcdTMwOEFcdTMwN0VcdTMwNTkifSwKLSAgICAgICAgeyJSZW1vdmUudGhpcy5Qb2xpY3kuRW50cnkuIiwgIlx1MzA1M1x1MzA2RVx1MzBERFx1MzBFQVx1MzBCN1x1MzBGQ1x1MzBGQlx1MzBBOFx1MzBGM1x1MzBDOFx1MzBFQVx1MzA5Mlx1NTI0QVx1OTY2NFx1MzA1N1x1MzA3RVx1MzA1OVx1MzA0Qlx1MzAwMiJ9LAotICAgICAgICB7Ik92ZXJ3cml0ZS5GaWxlIiwgIlx1MzBENVx1MzBBMVx1MzBBNFx1MzBFQlx1MzA5Mlx1NEUwQVx1NjZGOFx1MzA0RFx1MzA1N1x1MzA3RVx1MzA1OSJ9LAotICAgICAgICB7IlBvbGljeS5zdWNjZXNzZnVsbHkud3JpdHRlbi50by5maWxlbmFtZSIsCi0gICAgICAgICAgICAgICAgIlx1MzBERFx1MzBFQVx1MzBCN1x1MzBGQ1x1MzA2RXswfVx1MzA3OFx1MzA2RVx1NjZGOFx1OEZCQ1x1MzA3Rlx1MzA2Qlx1NjIxMFx1NTI5Rlx1MzA1N1x1MzA3RVx1MzA1N1x1MzA1RiJ9LAotICAgICAgICB7Im51bGwuZmlsZW5hbWUiLCAiXHUzMEQ1XHUzMEExXHUzMEE0XHUzMEVCXHU1NDBEXHUzMDRDbnVsbFx1MzA2N1x1MzA1OSJ9LAotICAgICAgICB7IlNhdmUuY2hhbmdlcy4iLCAiXHU1OTA5XHU2NkY0XHUzMDkyXHU0RkREXHU1QjU4XHUzMDU3XHUzMDdFXHUzMDU5XHUzMDRCXHUzMDAyIn0sCi0gICAgICAgIHsiWWVzIiwgIlx1MzA2Rlx1MzA0NCJ9LAotICAgICAgICB7Ik5vIiwgIlx1MzA0NFx1MzA0NFx1MzA0OCJ9LAotICAgICAgICB7IlBvbGljeS5FbnRyeSIsICJcdTMwRERcdTMwRUFcdTMwQjdcdTMwRkNcdTMwRkJcdTMwQThcdTMwRjNcdTMwQzhcdTMwRUEifSwKLSAgICAgICAgeyJTYXZlLkNoYW5nZXMiLCAiXHU1OTA5XHU2NkY0XHUzMDkyXHU0RkREXHU1QjU4XHUzMDU3XHUzMDdFXHUzMDU5In0sCi0gICAgICAgIHsiTm8uUG9saWN5LkVudHJ5LnNlbGVjdGVkIiwgIlx1MzBERFx1MzBFQVx1MzBCN1x1MzBGQ1x1MzBGQlx1MzBBOFx1MzBGM1x1MzBDOFx1MzBFQVx1MzA0Q1x1OTA3OFx1NjI5RVx1MzA1NVx1MzA4Q1x1MzA2Nlx1MzA0NFx1MzA3RVx1MzA1Qlx1MzA5MyJ9LAotICAgICAgICB7IlVuYWJsZS50by5vcGVuLktleVN0b3JlLmV4LnRvU3RyaW5nLiIsCi0gICAgICAgICAgICAgICAgIlx1MzBBRFx1MzBGQ1x1MzBCOVx1MzBDOFx1MzBBMnswfVx1MzA5Mlx1OTU4Qlx1MzA1MVx1MzA3RVx1MzA1Qlx1MzA5MyJ9LAotICAgICAgICB7Ik5vLnByaW5jaXBhbC5zZWxlY3RlZCIsICJcdTMwRDdcdTMwRUFcdTMwRjNcdTMwQjdcdTMwRDFcdTMwRUJcdTMwNENcdTkwNzhcdTYyOUVcdTMwNTVcdTMwOENcdTMwNjZcdTMwNDRcdTMwN0VcdTMwNUJcdTMwOTMifSwKLSAgICAgICAgeyJOby5wZXJtaXNzaW9uLnNlbGVjdGVkIiwgIlx1MzBBMlx1MzBBRlx1MzBCQlx1MzBCOVx1NkEyOVx1MzA0Q1x1OTA3OFx1NjI5RVx1MzA1NVx1MzA4Q1x1MzA2Nlx1MzA0NFx1MzA3RVx1MzA1Qlx1MzA5MyJ9LAotICAgICAgICB7Im5hbWUiLCAiXHU1NDBEXHU1MjREIn0sCi0gICAgICAgIHsiY29uZmlndXJhdGlvbi50eXBlIiwgIlx1NjlDQlx1NjIxMFx1MzBCRlx1MzBBNFx1MzBENyJ9LAotICAgICAgICB7ImVudmlyb25tZW50LnZhcmlhYmxlLm5hbWUiLCAiXHU3NEIwXHU1ODgzXHU1OTA5XHU2NTcwXHU1NDBEIn0sCi0gICAgICAgIHsibGlicmFyeS5uYW1lIiwgIlx1MzBFOVx1MzBBNFx1MzBENlx1MzBFOVx1MzBFQVx1NTQwRCJ9LAotICAgICAgICB7InBhY2thZ2UubmFtZSIsICJcdTMwRDFcdTMwQzNcdTMwQjFcdTMwRkNcdTMwQjhcdTU0MEQifSwKLSAgICAgICAgeyJwb2xpY3kudHlwZSIsICJcdTMwRERcdTMwRUFcdTMwQjdcdTMwRkNcdTMwRkJcdTMwQkZcdTMwQTRcdTMwRDcifSwKLSAgICAgICAgeyJwcm9wZXJ0eS5uYW1lIiwgIlx1MzBEN1x1MzBFRFx1MzBEMVx1MzBDNlx1MzBBM1x1NTQwRCJ9LAotICAgICAgICB7IlByaW5jaXBhbC5MaXN0IiwgIlx1MzBEN1x1MzBFQVx1MzBGM1x1MzBCN1x1MzBEMVx1MzBFQlx1MzA2RVx1MzBFQVx1MzBCOVx1MzBDOCJ9LAotICAgICAgICB7IlBlcm1pc3Npb24uTGlzdCIsICJcdTMwQTJcdTMwQUZcdTMwQkJcdTMwQjlcdTZBMjlcdTMwNkVcdTMwRUFcdTMwQjlcdTMwQzgifSwKLSAgICAgICAgeyJDb2RlLkJhc2UiLCAiXHUzMEIzXHUzMEZDXHUzMEM5XHUzMEZCXHUzMEQ5XHUzMEZDXHUzMEI5In0sCi0gICAgICAgIHsiS2V5U3RvcmUuVS5SLkwuIiwgIlx1MzBBRFx1MzBGQ1x1MzBCOVx1MzBDOFx1MzBBMlUgUiBMOiJ9LAotICAgICAgICB7IktleVN0b3JlLlBhc3N3b3JkLlUuUi5MLiIsICJcdTMwQURcdTMwRkNcdTMwQjlcdTMwQzhcdTMwQTJcdTMwRkJcdTMwRDFcdTMwQjlcdTMwRUZcdTMwRkNcdTMwQzlVIFIgTDoifSwKLQotCiAgICAgICAgIC8vIGphdmF4LnNlY3VyaXR5LmF1dGguUHJpdmF0ZUNyZWRlbnRpYWxQZXJtaXNzaW9uCiAgICAgICAgIHsiaW52YWxpZC5udWxsLmlucHV0LnMuIiwgIm51bGxcdTMwNkVcdTUxNjVcdTUyOUJcdTMwNkZcdTcxMjFcdTUyQjlcdTMwNjdcdTMwNTkifSwKICAgICAgICAgeyJhY3Rpb25zLmNhbi5vbmx5LmJlLnJlYWQuIiwgIlx1MzBBMlx1MzBBRlx1MzBCN1x1MzBFN1x1MzBGM1x1MzA2RidcdThBQURcdThGQkNcdTMwN0YnXHUzMDZFXHUzMDdGXHU1M0VGXHU4MEZEXHUzMDY3XHUzMDU5In0sCkBAIC01NTMsNiArNTgsNyBAQAogICAgICAgICB7InByb3ZpZGVkLm51bGwuT0lELm1hcCIsICJudWxsXHUzMDZFT0lEXHUzMERFXHUzMEMzXHUzMEQ3XHUzMDRDXHU2MzA3XHU1QjlBXHUzMDU1XHUzMDhDXHUzMDdFXHUzMDU3XHUzMDVGIn0sCiAKICAgICAgICAgLy8gamF2YXguc2VjdXJpdHkuYXV0aC5TdWJqZWN0CisgICAgICAgIHsiTkVXTElORSIsICJcbiJ9LAogICAgICAgICB7ImludmFsaWQubnVsbC5BY2Nlc3NDb250cm9sQ29udGV4dC5wcm92aWRlZCIsCiAgICAgICAgICAgICAgICAgIlx1NzEyMVx1NTJCOVx1MzA2QW51bGwgQWNjZXNzQ29udHJvbENvbnRleHRcdTMwNENcdTYzMDdcdTVCOUFcdTMwNTVcdTMwOENcdTMwN0VcdTMwNTdcdTMwNUYifSwKICAgICAgICAgeyJpbnZhbGlkLm51bGwuYWN0aW9uLnByb3ZpZGVkIiwgIlx1NzEyMVx1NTJCOVx1MzA2QW51bGxcdTMwQTJcdTMwQUZcdTMwQjdcdTMwRTdcdTMwRjNcdTMwNENcdTYzMDdcdTVCOUFcdTMwNTVcdTMwOENcdTMwN0VcdTMwNTdcdTMwNUYifSwKQEAgLTY1Niw2ICsxNjIsNyBAQAogICAgICAqCiAgICAgICogQHJldHVybiB0aGUgY29udGVudHMgb2YgdGhpcyA8Y29kZT5SZXNvdXJjZUJ1bmRsZTwvY29kZT4uCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIE9iamVjdFtdW10gZ2V0Q29udGVudHMoKSB7CiAgICAgICAgIHJldHVybiBjb250ZW50czsKICAgICB9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3V0aWwvUmVzb3VyY2VzX2tvLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3V0aWwvUmVzb3VyY2VzX2tvLmphdmEKaW5kZXggZDFlYzc0NC4uMzk2ODkxOSAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS91dGlsL1Jlc291cmNlc19rby5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdXRpbC9SZXNvdXJjZXNfa28uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTM0LDUwMSArMzQsNiBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W11bXSBjb250ZW50cyA9IHsKIAotICAgICAgICAvLyBzaGFyZWQgKGZyb20gamFyc2lnbmVyKQotICAgICAgICB7IlNQQUNFIiwgIiAifSwKLSAgICAgICAgeyIyU1BBQ0UiLCAiICAifSwKLSAgICAgICAgeyI2U1BBQ0UiLCAiICAgICAgIn0sCi0gICAgICAgIHsiQ09NTUEiLCAiLCAifSwKLSAgICAgICAgLy8gc2hhcmVkIChmcm9tIGtleXRvb2wpCi0gICAgICAgIHsiTkVXTElORSIsICJcbiJ9LAotICAgICAgICB7IlNUQVIiLAotICAgICAgICAgICAgICAgICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIn0sCi0gICAgICAgIHsiU1RBUk5OIiwKLSAgICAgICAgICAgICAgICAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG4ifSwKLQotICAgICAgICAvLyBrZXl0b29sOiBIZWxwIHBhcnQKLS8vICJPcHRpb24iIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotICAgICAgICB7Ii5PUFRJT04uIiwgIiBbXHVDNjM1XHVDMTU4XS4uLiJ9LAotICAgICAgICB7Ik9wdGlvbnMuIiwgIlx1QzYzNVx1QzE1ODoifSwKLSAgICAgICAgeyJVc2Uua2V5dG9vbC5oZWxwLmZvci5hbGwuYXZhaWxhYmxlLmNvbW1hbmRzIiwKLSAgICAgICAgICAgICAgICAgIlx1QzBBQ1x1QzZBOSBcdUFDMDBcdUIyQTVcdUQ1NUMgXHVCQUE4XHVCNEUwIFx1QkE4NVx1QjgzOVx1QzVEMCBcImtleXRvb2wgLWhlbHBcIiBcdUMwQUNcdUM2QTkifSwKLSAgICAgICAgeyJLZXkuYW5kLkNlcnRpZmljYXRlLk1hbmFnZW1lbnQuVG9vbCIsCi0gICAgICAgICAgICAgICAgICJcdUQwQTQgXHVCQzBGIFx1Qzc3OFx1Qzk5RFx1QzExQyBcdUFEMDBcdUI5QUMgXHVEMjM0In0sCi0gICAgICAgIHsiQ29tbWFuZHMuIiwgIlx1QkE4NVx1QjgzOToifSwKLSAgICAgICAgeyJVc2Uua2V5dG9vbC5jb21tYW5kLm5hbWUuaGVscC5mb3IudXNhZ2Uub2YuY29tbWFuZC5uYW1lIiwKLSAgICAgICAgICAgICAgICAiY29tbWFuZF9uYW1lIFx1QzBBQ1x1QzZBOVx1QkM5NVx1QzVEMCBcImtleXRvb2wgLWNvbW1hbmRfbmFtZSAtaGVscFwiIFx1QzBBQ1x1QzZBOSJ9LAotICAgICAgICAvLyBrZXl0b29sOiBoZWxwOiBjb21tYW5kcwotICAgICAgICB7IkdlbmVyYXRlcy5hLmNlcnRpZmljYXRlLnJlcXVlc3QiLAotICAgICAgICAgICAgICAgICJcdUM3NzhcdUM5OURcdUMxMUMgXHVDNjk0XHVDQ0FEXHVDNzQ0IFx1QzBERFx1QzEzMVx1RDU2OVx1QjJDOFx1QjJFNC4ifSwgLy8tY2VydHJlcQotICAgICAgICB7IkNoYW5nZXMuYW4uZW50cnkucy5hbGlhcyIsCi0gICAgICAgICAgICAgICAgIlx1RDU2RFx1QkFBOVx1Qzc1OCBcdUJDQzRcdUNFNkRcdUM3NDQgXHVCQ0MwXHVBQ0JEXHVENTY5XHVCMkM4XHVCMkU0LiJ9LCAvLy1jaGFuZ2VhbGlhcwotICAgICAgICB7IkRlbGV0ZXMuYW4uZW50cnkiLAotICAgICAgICAgICAgICAgICJcdUQ1NkRcdUJBQTlcdUM3NDQgXHVDMEFEXHVDODFDXHVENTY5XHVCMkM4XHVCMkU0LiJ9LCAvLy1kZWxldGUKLSAgICAgICAgeyJFeHBvcnRzLmNlcnRpZmljYXRlIiwKLSAgICAgICAgICAgICAgICAiXHVDNzc4XHVDOTlEXHVDMTFDXHVCOTdDIFx1Qzc3NVx1QzJBNFx1RDNFQ1x1RDJCOFx1RDU2OVx1QjJDOFx1QjJFNC4ifSwgLy8tZXhwb3J0Y2VydAotICAgICAgICB7IkdlbmVyYXRlcy5hLmtleS5wYWlyIiwKLSAgICAgICAgICAgICAgICAiXHVEMEE0IFx1QzMwRFx1Qzc0NCBcdUMwRERcdUMxMzFcdUQ1NjlcdUIyQzhcdUIyRTQuIn0sIC8vLWdlbmtleXBhaXIKLS8vIHRyYW5zbGF0aW9uIG9mICJzZWNyZXQiIGtleSBzaG91bGQgYmUgZGlmZmVyZW50IHRvICJwcml2YXRlIiBrZXkuCi0gICAgICAgIHsiR2VuZXJhdGVzLmEuc2VjcmV0LmtleSIsCi0gICAgICAgICAgICAgICAgIlx1QkNGNFx1QzU0OCBcdUQwQTRcdUI5N0MgXHVDMEREXHVDMTMxXHVENTY5XHVCMkM4XHVCMkU0LiJ9LCAvLy1nZW5zZWNrZXkKLSAgICAgICAgeyJHZW5lcmF0ZXMuY2VydGlmaWNhdGUuZnJvbS5hLmNlcnRpZmljYXRlLnJlcXVlc3QiLAotICAgICAgICAgICAgICAgICJcdUM3NzhcdUM5OURcdUMxMUMgXHVDNjk0XHVDQ0FEXHVDNUQwXHVDMTFDIFx1Qzc3OFx1Qzk5RFx1QzExQ1x1Qjk3QyBcdUMwRERcdUMxMzFcdUQ1NjlcdUIyQzhcdUIyRTQuIn0sIC8vLWdlbmNlcnQKLSAgICAgICAgeyJHZW5lcmF0ZXMuQ1JMIiwgIkNSTFx1Qzc0NCBcdUMwRERcdUMxMzFcdUQ1NjlcdUIyQzhcdUIyRTQuIn0sIC8vLWdlbmNybAotICAgICAgICB7IkltcG9ydHMuZW50cmllcy5mcm9tLmEuSkRLLjEuMS54LnN0eWxlLmlkZW50aXR5LmRhdGFiYXNlIiwKLSAgICAgICAgICAgICAgICAiSkRLIDEuMS54IFx1QzJBNFx1RDBDMFx1Qzc3QyBJRCBcdUIzNzBcdUM3NzRcdUQxMzBcdUJDQTBcdUM3NzRcdUMyQTRcdUM1RDBcdUMxMUMgXHVENTZEXHVCQUE5XHVDNzQ0IFx1Qzc4NFx1RDNFQ1x1RDJCOFx1RDU2OVx1QjJDOFx1QjJFNC4ifSwgLy8taWRlbnRpdHlkYgotICAgICAgICB7IkltcG9ydHMuYS5jZXJ0aWZpY2F0ZS5vci5hLmNlcnRpZmljYXRlLmNoYWluIiwKLSAgICAgICAgICAgICAgICAiXHVDNzc4XHVDOTlEXHVDMTFDIFx1QjYxMFx1QjI5NCBcdUM3NzhcdUM5OURcdUMxMUMgXHVDQ0I0XHVDNzc4XHVDNzQ0IFx1Qzc4NFx1RDNFQ1x1RDJCOFx1RDU2OVx1QjJDOFx1QjJFNC4ifSwgLy8taW1wb3J0Y2VydAotICAgICAgICB7IkltcG9ydHMub25lLm9yLmFsbC5lbnRyaWVzLmZyb20uYW5vdGhlci5rZXlzdG9yZSIsCi0gICAgICAgICAgICAgICAgIlx1QjJFNFx1Qjk3OCBcdUQwQTQgXHVDODAwXHVDN0E1XHVDMThDXHVDNUQwXHVDMTFDIFx1RDU1OFx1QjA5OCBcdUI2MTBcdUIyOTQgXHVCQUE4XHVCNEUwIFx1RDU2RFx1QkFBOVx1Qzc0NCBcdUM3ODRcdUQzRUNcdUQyQjhcdUQ1NjlcdUIyQzhcdUIyRTQuIn0sIC8vLWltcG9ydGtleXN0b3JlCi0gICAgICAgIHsiQ2xvbmVzLmEua2V5LmVudHJ5IiwKLSAgICAgICAgICAgICAgICAiXHVEMEE0IFx1RDU2RFx1QkFBOVx1Qzc0NCBcdUJDRjVcdUM4MUNcdUQ1NjlcdUIyQzhcdUIyRTQuIn0sIC8vLWtleWNsb25lCi0gICAgICAgIHsiQ2hhbmdlcy50aGUua2V5LnBhc3N3b3JkLm9mLmFuLmVudHJ5IiwKLSAgICAgICAgICAgICAgICAiXHVENTZEXHVCQUE5XHVDNzU4IFx1RDBBNCBcdUJFNDRcdUJDMDBcdUJDODhcdUQ2MzhcdUI5N0MgXHVCQ0MwXHVBQ0JEXHVENTY5XHVCMkM4XHVCMkU0LiJ9LCAvLy1rZXlwYXNzd2QKLSAgICAgICAgeyJMaXN0cy5lbnRyaWVzLmluLmEua2V5c3RvcmUiLAotICAgICAgICAgICAgICAgICJcdUQwQTQgXHVDODAwXHVDN0E1XHVDMThDXHVDNzU4IFx1RDU2RFx1QkFBOVx1Qzc0NCBcdUIwOThcdUM1RjRcdUQ1NjlcdUIyQzhcdUIyRTQuIn0sIC8vLWxpc3QKLSAgICAgICAgeyJQcmludHMudGhlLmNvbnRlbnQub2YuYS5jZXJ0aWZpY2F0ZSIsCi0gICAgICAgICAgICAgICAgIlx1Qzc3OFx1Qzk5RFx1QzExQ1x1Qzc1OCBcdUNGNThcdUQxNTBcdUNFMjBcdUI5N0MgXHVDNzc4XHVDMUM0XHVENTY5XHVCMkM4XHVCMkU0LiJ9LCAvLy1wcmludGNlcnQKLSAgICAgICAgeyJQcmludHMudGhlLmNvbnRlbnQub2YuYS5jZXJ0aWZpY2F0ZS5yZXF1ZXN0IiwKLSAgICAgICAgICAgICAgICAiXHVDNzc4XHVDOTlEXHVDMTFDIFx1QzY5NFx1Q0NBRFx1Qzc1OCBcdUNGNThcdUQxNTBcdUNFMjBcdUI5N0MgXHVDNzc4XHVDMUM0XHVENTY5XHVCMkM4XHVCMkU0LiJ9LCAvLy1wcmludGNlcnRyZXEKLSAgICAgICAgeyJQcmludHMudGhlLmNvbnRlbnQub2YuYS5DUkwuZmlsZSIsCi0gICAgICAgICAgICAgICAgIkNSTCBcdUQzMENcdUM3N0NcdUM3NTggXHVDRjU4XHVEMTUwXHVDRTIwXHVCOTdDIFx1Qzc3OFx1QzFDNFx1RDU2OVx1QjJDOFx1QjJFNC4ifSwgLy8tcHJpbnRjcmwKLSAgICAgICAgeyJHZW5lcmF0ZXMuYS5zZWxmLnNpZ25lZC5jZXJ0aWZpY2F0ZSIsCi0gICAgICAgICAgICAgICAgIlx1Qzc5MFx1Q0NCNCBcdUMxMUNcdUJBODVcdUI0MUMgXHVDNzc4XHVDOTlEXHVDMTFDXHVCOTdDIFx1QzBERFx1QzEzMVx1RDU2OVx1QjJDOFx1QjJFNC4ifSwgLy8tc2VsZmNlcnQKLSAgICAgICAgeyJDaGFuZ2VzLnRoZS5zdG9yZS5wYXNzd29yZC5vZi5hLmtleXN0b3JlIiwKLSAgICAgICAgICAgICAgICAiXHVEMEE0IFx1QzgwMFx1QzdBNVx1QzE4Q1x1Qzc1OCBcdUM4MDBcdUM3QTVcdUMxOEMgXHVCRTQ0XHVCQzAwXHVCQzg4XHVENjM4XHVCOTdDIFx1QkNDMFx1QUNCRFx1RDU2OVx1QjJDOFx1QjJFNC4ifSwgLy8tc3RvcmVwYXNzd2QKLSAgICAgICAgLy8ga2V5dG9vbDogaGVscDogb3B0aW9ucwotICAgICAgICB7ImFsaWFzLm5hbWUub2YudGhlLmVudHJ5LnRvLnByb2Nlc3MiLAotICAgICAgICAgICAgICAgICJcdUNDOThcdUI5QUNcdUQ1NjAgXHVENTZEXHVCQUE5XHVDNzU4IFx1QkNDNFx1Q0U2RCBcdUM3NzRcdUI5ODQifSwgLy8tYWxpYXMKLSAgICAgICAgeyJkZXN0aW5hdGlvbi5hbGlhcyIsCi0gICAgICAgICAgICAgICAgIlx1QjMwMFx1QzBDMSBcdUJDQzRcdUNFNkQifSwgLy8tZGVzdGFsaWFzCi0gICAgICAgIHsiZGVzdGluYXRpb24ua2V5LnBhc3N3b3JkIiwKLSAgICAgICAgICAgICAgICAiXHVCMzAwXHVDMEMxIFx1RDBBNCBcdUJFNDRcdUJDMDBcdUJDODhcdUQ2MzgifSwgLy8tZGVzdGtleXBhc3MKLSAgICAgICAgeyJkZXN0aW5hdGlvbi5rZXlzdG9yZS5uYW1lIiwKLSAgICAgICAgICAgICAgICAiXHVCMzAwXHVDMEMxIFx1RDBBNCBcdUM4MDBcdUM3QTVcdUMxOEMgXHVDNzc0XHVCOTg0In0sIC8vLWRlc3RrZXlzdG9yZQotICAgICAgICB7ImRlc3RpbmF0aW9uLmtleXN0b3JlLnBhc3N3b3JkLnByb3RlY3RlZCIsCi0gICAgICAgICAgICAgICAgIlx1QjMwMFx1QzBDMSBcdUQwQTQgXHVDODAwXHVDN0E1XHVDMThDIFx1QkU0NFx1QkMwMFx1QkM4OFx1RDYzOFx1Qjg1QyBcdUJDRjRcdUQ2MzhcdUI0MjgifSwgLy8tZGVzdHByb3RlY3RlZAotICAgICAgICB7ImRlc3RpbmF0aW9uLmtleXN0b3JlLnByb3ZpZGVyLm5hbWUiLAotICAgICAgICAgICAgICAgICJcdUIzMDBcdUMwQzEgXHVEMEE0IFx1QzgwMFx1QzdBNVx1QzE4QyBcdUM4MUNcdUFDRjVcdUM3OTAgXHVDNzc0XHVCOTg0In0sIC8vLWRlc3Rwcm92aWRlcm5hbWUKLSAgICAgICAgeyJkZXN0aW5hdGlvbi5rZXlzdG9yZS5wYXNzd29yZCIsCi0gICAgICAgICAgICAgICAgIlx1QjMwMFx1QzBDMSBcdUQwQTQgXHVDODAwXHVDN0E1XHVDMThDIFx1QkU0NFx1QkMwMFx1QkM4OFx1RDYzOCJ9LCAvLy1kZXN0c3RvcmVwYXNzCi0gICAgICAgIHsiZGVzdGluYXRpb24ua2V5c3RvcmUudHlwZSIsCi0gICAgICAgICAgICAgICAgIlx1QjMwMFx1QzBDMSBcdUQwQTQgXHVDODAwXHVDN0E1XHVDMThDIFx1QzcyMFx1RDYxNSJ9LCAvLy1kZXN0c3RvcmV0eXBlCi0gICAgICAgIHsiZGlzdGluZ3Vpc2hlZC5uYW1lIiwKLSAgICAgICAgICAgICAgICAiXHVDMkREXHVCQ0M0IFx1Qzc3NFx1Qjk4NCJ9LCAvLy1kbmFtZQotICAgICAgICB7IlguNTA5LmV4dGVuc2lvbiIsCi0gICAgICAgICAgICAgICAgIlguNTA5IFx1RDY1NVx1QzdBNSJ9LCAvLy1leHQKLSAgICAgICAgeyJvdXRwdXQuZmlsZS5uYW1lIiwKLSAgICAgICAgICAgICAgICAiXHVDRDlDXHVCODI1IFx1RDMwQ1x1Qzc3QyBcdUM3NzRcdUI5ODQifSwgLy8tZmlsZSBhbmQgLW91dGZpbGUKLSAgICAgICAgeyJpbnB1dC5maWxlLm5hbWUiLAotICAgICAgICAgICAgICAgICJcdUM3ODVcdUI4MjUgXHVEMzBDXHVDNzdDIFx1Qzc3NFx1Qjk4NCJ9LCAvLy1maWxlIGFuZCAtaW5maWxlCi0gICAgICAgIHsia2V5LmFsZ29yaXRobS5uYW1lIiwKLSAgICAgICAgICAgICAgICAiXHVEMEE0IFx1QzU0Q1x1QUNFMFx1QjlBQ1x1Qzk5OCBcdUM3NzRcdUI5ODQifSwgLy8ta2V5YWxnCi0gICAgICAgIHsia2V5LnBhc3N3b3JkIiwKLSAgICAgICAgICAgICAgICAiXHVEMEE0IFx1QkU0NFx1QkMwMFx1QkM4OFx1RDYzOCJ9LCAvLy1rZXlwYXNzCi0gICAgICAgIHsia2V5LmJpdC5zaXplIiwKLSAgICAgICAgICAgICAgICAiXHVEMEE0IFx1QkU0NFx1RDJCOCBcdUQwNkNcdUFFMzAifSwgLy8ta2V5c2l6ZQotICAgICAgICB7ImtleXN0b3JlLm5hbWUiLAotICAgICAgICAgICAgICAgICJcdUQwQTQgXHVDODAwXHVDN0E1XHVDMThDIFx1Qzc3NFx1Qjk4NCJ9LCAvLy1rZXlzdG9yZQotICAgICAgICB7Im5ldy5wYXNzd29yZCIsCi0gICAgICAgICAgICAgICAgIlx1QzBDOCBcdUJFNDRcdUJDMDBcdUJDODhcdUQ2MzgifSwgLy8tbmV3Ci0gICAgICAgIHsiZG8ubm90LnByb21wdCIsCi0gICAgICAgICAgICAgICAgIlx1RDY1NVx1Qzc3OFx1RDU1OFx1QzlDMCBcdUM1NEFcdUM3NEMifSwgLy8tbm9wcm9tcHQKLSAgICAgICAgeyJwYXNzd29yZC50aHJvdWdoLnByb3RlY3RlZC5tZWNoYW5pc20iLAotICAgICAgICAgICAgICAgICJcdUJDRjRcdUQ2MzhcdUI0MThcdUIyOTQgXHVCQTU0XHVDRUU0XHVCMkM4XHVDOTk4XHVDNzQ0IFx1RDFCNVx1RDU1QyBcdUJFNDRcdUJDMDBcdUJDODhcdUQ2MzgifSwgLy8tcHJvdGVjdGVkCi0gICAgICAgIHsicHJvdmlkZXIuYXJndW1lbnQiLAotICAgICAgICAgICAgICAgICJcdUM4MUNcdUFDRjVcdUM3OTAgXHVDNzc4XHVDMjE4In0sIC8vLXByb3ZpZGVyYXJnCi0gICAgICAgIHsicHJvdmlkZXIuY2xhc3MubmFtZSIsCi0gICAgICAgICAgICAgICAgIlx1QzgxQ1x1QUNGNVx1Qzc5MCBcdUQwNzRcdUI3OThcdUMyQTQgXHVDNzc0XHVCOTg0In0sIC8vLXByb3ZpZGVyY2xhc3MKLSAgICAgICAgeyJwcm92aWRlci5uYW1lIiwKLSAgICAgICAgICAgICAgICAiXHVDODFDXHVBQ0Y1XHVDNzkwIFx1Qzc3NFx1Qjk4NCJ9LCAvLy1wcm92aWRlcm5hbWUKLSAgICAgICAgeyJwcm92aWRlci5jbGFzc3BhdGgiLAotICAgICAgICAgICAgICAgICJcdUM4MUNcdUFDRjVcdUM3OTAgXHVEMDc0XHVCNzk4XHVDMkE0IFx1QUNCRFx1Qjg1QyJ9LCAvLy1wcm92aWRlcnBhdGgKLSAgICAgICAgeyJvdXRwdXQuaW4uUkZDLnN0eWxlIiwKLSAgICAgICAgICAgICAgICAiUkZDIFx1QzJBNFx1RDBDMFx1Qzc3Q1x1Qzc1OCBcdUNEOUNcdUI4MjUifSwgLy8tcmZjCi0gICAgICAgIHsic2lnbmF0dXJlLmFsZ29yaXRobS5uYW1lIiwKLSAgICAgICAgICAgICAgICAiXHVDMTFDXHVCQTg1IFx1QzU0Q1x1QUNFMFx1QjlBQ1x1Qzk5OCBcdUM3NzRcdUI5ODQifSwgLy8tc2lnYWxnCi0gICAgICAgIHsic291cmNlLmFsaWFzIiwKLSAgICAgICAgICAgICAgICAiXHVDMThDXHVDMkE0IFx1QkNDNFx1Q0U2RCJ9LCAvLy1zcmNhbGlhcwotICAgICAgICB7InNvdXJjZS5rZXkucGFzc3dvcmQiLAotICAgICAgICAgICAgICAgICJcdUMxOENcdUMyQTQgXHVEMEE0IFx1QkU0NFx1QkMwMFx1QkM4OFx1RDYzOCJ9LCAvLy1zcmNrZXlwYXNzCi0gICAgICAgIHsic291cmNlLmtleXN0b3JlLm5hbWUiLAotICAgICAgICAgICAgICAgICJcdUMxOENcdUMyQTQgXHVEMEE0IFx1QzgwMFx1QzdBNVx1QzE4QyBcdUM3NzRcdUI5ODQifSwgLy8tc3Jja2V5c3RvcmUKLSAgICAgICAgeyJzb3VyY2Uua2V5c3RvcmUucGFzc3dvcmQucHJvdGVjdGVkIiwKLSAgICAgICAgICAgICAgICAiXHVDMThDXHVDMkE0IFx1RDBBNCBcdUM4MDBcdUM3QTVcdUMxOEMgXHVCRTQ0XHVCQzAwXHVCQzg4XHVENjM4XHVCODVDIFx1QkNGNFx1RDYzOFx1QjQyOCJ9LCAvLy1zcmNwcm90ZWN0ZWQKLSAgICAgICAgeyJzb3VyY2Uua2V5c3RvcmUucHJvdmlkZXIubmFtZSIsCi0gICAgICAgICAgICAgICAgIlx1QzE4Q1x1QzJBNCBcdUQwQTQgXHVDODAwXHVDN0E1XHVDMThDIFx1QzgxQ1x1QUNGNVx1Qzc5MCBcdUM3NzRcdUI5ODQifSwgLy8tc3JjcHJvdmlkZXJuYW1lCi0gICAgICAgIHsic291cmNlLmtleXN0b3JlLnBhc3N3b3JkIiwKLSAgICAgICAgICAgICAgICAiXHVDMThDXHVDMkE0IFx1RDBBNCBcdUM4MDBcdUM3QTVcdUMxOEMgXHVCRTQ0XHVCQzAwXHVCQzg4XHVENjM4In0sIC8vLXNyY3N0b3JlcGFzcwotICAgICAgICB7InNvdXJjZS5rZXlzdG9yZS50eXBlIiwKLSAgICAgICAgICAgICAgICAiXHVDMThDXHVDMkE0IFx1RDBBNCBcdUM4MDBcdUM3QTVcdUMxOEMgXHVDNzIwXHVENjE1In0sIC8vLXNyY3N0b3JldHlwZQotICAgICAgICB7IlNTTC5zZXJ2ZXIuaG9zdC5hbmQucG9ydCIsCi0gICAgICAgICAgICAgICAgIlNTTCBcdUMxMUNcdUJDODQgXHVENjM4XHVDMkE0XHVEMkI4IFx1QkMwRiBcdUQzRUNcdUQyQjgifSwgLy8tc3Nsc2VydmVyCi0gICAgICAgIHsic2lnbmVkLmphci5maWxlIiwKLSAgICAgICAgICAgICAgICAiXHVDMTFDXHVCQTg1XHVCNDFDIGphciBcdUQzMENcdUM3N0MifSwgLy89amFyZmlsZQotICAgICAgICB7ImNlcnRpZmljYXRlLnZhbGlkaXR5LnN0YXJ0LmRhdGUudGltZSIsCi0gICAgICAgICAgICAgICAgIlx1Qzc3OFx1Qzk5RFx1QzExQyBcdUM3MjBcdUQ2QTggXHVBRTMwXHVBQzA0IFx1QzJEQ1x1Qzc5MSBcdUIwQTBcdUM5REMvXHVDMkRDXHVBQzA0In0sIC8vLXN0YXJ0ZGF0ZQotICAgICAgICB7ImtleXN0b3JlLnBhc3N3b3JkIiwKLSAgICAgICAgICAgICAgICAiXHVEMEE0IFx1QzgwMFx1QzdBNVx1QzE4QyBcdUJFNDRcdUJDMDBcdUJDODhcdUQ2MzgifSwgLy8tc3RvcmVwYXNzCi0gICAgICAgIHsia2V5c3RvcmUudHlwZSIsCi0gICAgICAgICAgICAgICAgIlx1RDBBNCBcdUM4MDBcdUM3QTVcdUMxOEMgXHVDNzIwXHVENjE1In0sIC8vLXN0b3JldHlwZQotICAgICAgICB7InRydXN0LmNlcnRpZmljYXRlcy5mcm9tLmNhY2VydHMiLAotICAgICAgICAgICAgICAgICJjYWNlcnRzXHVDNzU4IFx1QkNGNFx1QzU0OCBcdUM3NzhcdUM5OURcdUMxMUMifSwgLy8tdHJ1c3RjYWNlcnRzCi0gICAgICAgIHsidmVyYm9zZS5vdXRwdXQiLAotICAgICAgICAgICAgICAgICJcdUMwQzFcdUMxMzggXHVDODE1XHVCQ0Y0IFx1Q0Q5Q1x1QjgyNSJ9LCAvLy12Ci0gICAgICAgIHsidmFsaWRpdHkubnVtYmVyLm9mLmRheXMiLAotICAgICAgICAgICAgICAgICJcdUM3MjBcdUQ2QTggXHVBRTMwXHVBQzA0IFx1Qzc3QyBcdUMyMTgifSwgLy8tdmFsaWRpdHkKLSAgICAgICAgeyJTZXJpYWwuSUQub2YuY2VydC50by5yZXZva2UiLAotICAgICAgICAgICAgICAgICAiXHVDQ0EwXHVENjhDXHVENTYwIFx1Qzc3OFx1Qzk5RFx1QzExQ1x1Qzc1OCBcdUM3N0NcdUI4MjggSUQifSwgLy8taWQKLSAgICAgICAgLy8ga2V5dG9vbDogUnVubmluZyBwYXJ0Ci0gICAgICAgIHsia2V5dG9vbC5lcnJvci4iLCAia2V5dG9vbCBcdUM2MjRcdUI5NTg6ICJ9LAotICAgICAgICB7IklsbGVnYWwub3B0aW9uLiIsICJcdUM3OThcdUJBQkJcdUI0MUMgXHVDNjM1XHVDMTU4OiAgICJ9LAotICAgICAgICB7IklsbGVnYWwudmFsdWUuIiwgIlx1Qzc5OFx1QkFCQlx1QjQxQyBcdUFDMTI6ICJ9LAotICAgICAgICB7IlVua25vd24ucGFzc3dvcmQudHlwZS4iLCAiXHVDNTRDIFx1QzIxOCBcdUM1QzZcdUIyOTQgXHVCRTQ0XHVCQzAwXHVCQzg4XHVENjM4IFx1QzcyMFx1RDYxNTogIn0sCi0gICAgICAgIHsiQ2Fubm90LmZpbmQuZW52aXJvbm1lbnQudmFyaWFibGUuIiwKLSAgICAgICAgICAgICAgICAiXHVENjU4XHVBQ0JEIFx1QkNDMFx1QzIxOFx1Qjk3QyBcdUNDM0VcdUM3NDQgXHVDMjE4IFx1QzVDNlx1Qzc0QzogIn0sCi0gICAgICAgIHsiQ2Fubm90LmZpbmQuZmlsZS4iLCAiXHVEMzBDXHVDNzdDXHVDNzQ0IFx1Q0MzRVx1Qzc0NCBcdUMyMTggXHVDNUM2XHVDNzRDOiAifSwKLSAgICAgICAgeyJDb21tYW5kLm9wdGlvbi5mbGFnLm5lZWRzLmFuLmFyZ3VtZW50LiIsICJcdUJBODVcdUI4MzkgXHVDNjM1XHVDMTU4IHswfVx1QzVEMCBcdUM3NzhcdUMyMThcdUFDMDAgXHVENTQ0XHVDNjk0XHVENTY5XHVCMkM4XHVCMkU0LiJ9LAotICAgICAgICB7Ildhcm5pbmcuRGlmZmVyZW50LnN0b3JlLmFuZC5rZXkucGFzc3dvcmRzLm5vdC5zdXBwb3J0ZWQuZm9yLlBLQ1MxMi5LZXlTdG9yZXMuSWdub3JpbmcudXNlci5zcGVjaWZpZWQuY29tbWFuZC52YWx1ZS4iLAotICAgICAgICAgICAgICAgICJcdUFDQkRcdUFDRTA6IFx1QjJFNFx1Qjk3OCBcdUM4MDBcdUM3QTVcdUMxOEMgXHVCQzBGIFx1RDBBNCBcdUJFNDRcdUJDMDBcdUJDODhcdUQ2MzhcdUIyOTQgUEtDUzEyIEtleVN0b3Jlc1x1QzVEMCBcdUIzMDBcdUQ1NzQgXHVDOUMwXHVDNkQwXHVCNDE4XHVDOUMwIFx1QzU0QVx1QzJCNVx1QjJDOFx1QjJFNC4gXHVDMEFDXHVDNkE5XHVDNzkwXHVBQzAwIFx1QzlDMFx1QzgxNVx1RDU1QyB7MH0gXHVBQzEyXHVDNzQ0IFx1QkIzNFx1QzJEQ1x1RDU1OFx1QjI5NCBcdUM5MTFcdUM3ODVcdUIyQzhcdUIyRTQuIn0sCi0gICAgICAgIHsiLmtleXN0b3JlLm11c3QuYmUuTk9ORS5pZi5zdG9yZXR5cGUuaXMuezB9IiwKLSAgICAgICAgICAgICAgICAiLXN0b3JldHlwZVx1Qzc3NCB7MH1cdUM3NzggXHVBQ0JEXHVDNkIwIC1rZXlzdG9yZVx1QjI5NCBOT05FXHVDNzc0XHVDNUI0XHVDNTdDIFx1RDU2OVx1QjJDOFx1QjJFNC4ifSwKLSAgICAgICAgeyJUb28ubWFueS5yZXRyaWVzLnByb2dyYW0udGVybWluYXRlZCIsCi0gICAgICAgICAgICAgICAgICJcdUM3QUNcdUMyRENcdUIzQzQgXHVENjlGXHVDMjE4XHVBQzAwIFx1QjEwOFx1QkIzNCBcdUI5Q0VcdUM1NDQgXHVENTA0XHVCODVDXHVBREY4XHVCN0E4XHVDNzc0IFx1Qzg4NVx1QjhDQ1x1QjQxOFx1QzVDOFx1QzJCNVx1QjJDOFx1QjJFNC4ifSwKLSAgICAgICAgeyIuc3RvcmVwYXNzd2QuYW5kLmtleXBhc3N3ZC5jb21tYW5kcy5ub3Quc3VwcG9ydGVkLmlmLnN0b3JldHlwZS5pcy57MH0iLAotICAgICAgICAgICAgICAgICItc3RvcmV0eXBlXHVDNzc0IHswfVx1Qzc3OCBcdUFDQkRcdUM2QjAgLXN0b3JlcGFzc3dkIFx1QkMwRiAta2V5cGFzc3dkIFx1QkE4NVx1QjgzOVx1Qzc3NCBcdUM5QzBcdUM2RDBcdUI0MThcdUM5QzAgXHVDNTRBXHVDMkI1XHVCMkM4XHVCMkU0LiJ9LAotICAgICAgICB7Ii5rZXlwYXNzd2QuY29tbWFuZHMubm90LnN1cHBvcnRlZC5pZi5zdG9yZXR5cGUuaXMuUEtDUzEyIiwKLSAgICAgICAgICAgICAgICAiLXN0b3JldHlwZVx1Qzc3NCBQS0NTMTJcdUM3NzggXHVBQ0JEXHVDNkIwIC1rZXlwYXNzd2QgXHVCQTg1XHVCODM5XHVDNzc0IFx1QzlDMFx1QzZEMFx1QjQxOFx1QzlDMCBcdUM1NEFcdUMyQjVcdUIyQzhcdUIyRTQuIn0sCi0gICAgICAgIHsiLmtleXBhc3MuYW5kLm5ldy5jYW4ubm90LmJlLnNwZWNpZmllZC5pZi5zdG9yZXR5cGUuaXMuezB9IiwKLSAgICAgICAgICAgICAgICAiLXN0b3JldHlwZVx1Qzc3NCB7MH1cdUM3NzggXHVBQ0JEXHVDNkIwIC1rZXlwYXNzIFx1QkMwRiAtbmV3XHVCOTdDIFx1QzlDMFx1QzgxNVx1RDU2MCBcdUMyMTggXHVDNUM2XHVDMkI1XHVCMkM4XHVCMkU0LiJ9LAotICAgICAgICB7ImlmLnByb3RlY3RlZC5pcy5zcGVjaWZpZWQudGhlbi5zdG9yZXBhc3Mua2V5cGFzcy5hbmQubmV3Lm11c3Qubm90LmJlLnNwZWNpZmllZCIsCi0gICAgICAgICAgICAgICAgIi1wcm90ZWN0ZWRcdUI5N0MgXHVDOUMwXHVDODE1XHVENTVDIFx1QUNCRFx1QzZCMCAtc3RvcmVwYXNzLCAta2V5cGFzcyBcdUJDMEYgLW5ld1x1Qjk3QyBcdUM5QzBcdUM4MTVcdUQ1NThcdUM5QzAgXHVDNTRBXHVDNTQ0XHVDNTdDIFx1RDU2OVx1QjJDOFx1QjJFNC4ifSwKLSAgICAgICAgeyJpZi5zcmNwcm90ZWN0ZWQuaXMuc3BlY2lmaWVkLnRoZW4uc3Jjc3RvcmVwYXNzLmFuZC5zcmNrZXlwYXNzLm11c3Qubm90LmJlLnNwZWNpZmllZCIsCi0gICAgICAgICAgICAgICAgIi1zcmNwcm90ZWN0ZWRcdUI5N0MgXHVDOUMwXHVDODE1XHVENTVDIFx1QUNCRFx1QzZCMCAtc3Jjc3RvcmVwYXNzIFx1QkMwRiAtc3Jja2V5cGFzc1x1Qjk3QyBcdUM5QzBcdUM4MTVcdUQ1NThcdUM5QzAgXHVDNTRBXHVDNTQ0XHVDNTdDIFx1RDU2OVx1QjJDOFx1QjJFNC4ifSwKLSAgICAgICAgeyJpZi5rZXlzdG9yZS5pcy5ub3QucGFzc3dvcmQucHJvdGVjdGVkLnRoZW4uc3RvcmVwYXNzLmtleXBhc3MuYW5kLm5ldy5tdXN0Lm5vdC5iZS5zcGVjaWZpZWQiLAotICAgICAgICAgICAgICAgICJcdUQwQTQgXHVDODAwXHVDN0E1XHVDMThDXHVBQzAwIFx1QkU0NFx1QkMwMFx1QkM4OFx1RDYzOFx1Qjg1QyBcdUJDRjRcdUQ2MzhcdUI0MThcdUM5QzAgXHVDNTRBXHVCMjk0IFx1QUNCRFx1QzZCMCAtc3RvcmVwYXNzLCAta2V5cGFzcyBcdUJDMEYgLW5ld1x1Qjk3QyBcdUM5QzBcdUM4MTVcdUQ1NThcdUM5QzAgXHVDNTRBXHVDNTQ0XHVDNTdDIFx1RDU2OVx1QjJDOFx1QjJFNC4ifSwKLSAgICAgICAgeyJpZi5zb3VyY2Uua2V5c3RvcmUuaXMubm90LnBhc3N3b3JkLnByb3RlY3RlZC50aGVuLnNyY3N0b3JlcGFzcy5hbmQuc3Jja2V5cGFzcy5tdXN0Lm5vdC5iZS5zcGVjaWZpZWQiLAotICAgICAgICAgICAgICAgICJcdUMxOENcdUMyQTQgXHVEMEE0IFx1QzgwMFx1QzdBNVx1QzE4Q1x1QUMwMCBcdUJFNDRcdUJDMDBcdUJDODhcdUQ2MzhcdUI4NUMgXHVCQ0Y0XHVENjM4XHVCNDE4XHVDOUMwIFx1QzU0QVx1QjI5NCBcdUFDQkRcdUM2QjAgLXNyY3N0b3JlcGFzcyBcdUJDMEYgLXNyY2tleXBhc3NcdUI5N0MgXHVDOUMwXHVDODE1XHVENTU4XHVDOUMwIFx1QzU0QVx1QzU0NFx1QzU3QyBcdUQ1NjlcdUIyQzhcdUIyRTQuIn0sCi0gICAgICAgIHsiSWxsZWdhbC5zdGFydGRhdGUudmFsdWUiLCAic3RhcnRkYXRlIFx1QUMxMlx1Qzc3NCBcdUM3OThcdUJBQkJcdUI0MThcdUM1QzhcdUMyQjVcdUIyQzhcdUIyRTQuIn0sCi0gICAgICAgIHsiVmFsaWRpdHkubXVzdC5iZS5ncmVhdGVyLnRoYW4uemVybyIsCi0gICAgICAgICAgICAgICAgIlx1QzcyMFx1RDZBOCBcdUFFMzBcdUFDMDRcdUM3NDAgMFx1QkNGNFx1QjJFNCBcdUNFRTRcdUM1N0MgXHVENTY5XHVCMkM4XHVCMkU0LiJ9LAotICAgICAgICB7InByb3ZOYW1lLm5vdC5hLnByb3ZpZGVyIiwgInswfVx1Qzc0MChcdUIyOTQpIFx1QzgxQ1x1QUNGNVx1Qzc5MFx1QUMwMCBcdUM1NDRcdUIyRDlcdUIyQzhcdUIyRTQuIn0sCi0gICAgICAgIHsiVXNhZ2UuZXJyb3Iubm8uY29tbWFuZC5wcm92aWRlZCIsICJcdUMwQUNcdUM2QTlcdUJDOTUgXHVDNjI0XHVCOTU4OiBcdUJBODVcdUI4MzlcdUM3NDQgXHVDNzg1XHVCODI1XHVENTU4XHVDOUMwIFx1QzU0QVx1QzU1OFx1QzJCNVx1QjJDOFx1QjJFNC4ifSwKLSAgICAgICAgeyJTb3VyY2Uua2V5c3RvcmUuZmlsZS5leGlzdHMuYnV0LmlzLmVtcHR5LiIsICJcdUMxOENcdUMyQTQgXHVEMEE0IFx1QzgwMFx1QzdBNVx1QzE4QyBcdUQzMENcdUM3N0NcdUM3NzQgXHVDODc0XHVDN0FDXHVENTU4XHVDOUMwXHVCOUNDIFx1QkU0NFx1QzVCNCBcdUM3ODhcdUM3NEM6ICJ9LAotICAgICAgICB7IlBsZWFzZS5zcGVjaWZ5LnNyY2tleXN0b3JlIiwgIi1zcmNrZXlzdG9yZVx1Qjk3QyBcdUM5QzBcdUM4MTVcdUQ1NThcdUMyRURcdUMyRENcdUM2MjQuIn0sCi0gICAgICAgIHsiTXVzdC5ub3Quc3BlY2lmeS5ib3RoLnYuYW5kLnJmYy53aXRoLmxpc3QuY29tbWFuZCIsCi0gICAgICAgICAgICAgICAgIidsaXN0JyBcdUJBODVcdUI4MzlcdUM1RDAgLXZcdUM2NDAgLXJmY1x1Qjk3QyBcdUQ1NjhcdUFFRDggXHVDOUMwXHVDODE1XHVENTU4XHVDOUMwIFx1QzU0QVx1QzU0NFx1QzU3QyBcdUQ1NjlcdUIyQzhcdUIyRTQuIn0sCi0gICAgICAgIHsiS2V5LnBhc3N3b3JkLm11c3QuYmUuYXQubGVhc3QuNi5jaGFyYWN0ZXJzIiwKLSAgICAgICAgICAgICAgICAiXHVEMEE0IFx1QkU0NFx1QkMwMFx1QkM4OFx1RDYzOFx1QjI5NCA2XHVDNzkwIFx1Qzc3NFx1QzBDMVx1Qzc3NFx1QzVCNFx1QzU3QyBcdUQ1NjlcdUIyQzhcdUIyRTQuIn0sCi0gICAgICAgIHsiTmV3LnBhc3N3b3JkLm11c3QuYmUuYXQubGVhc3QuNi5jaGFyYWN0ZXJzIiwKLSAgICAgICAgICAgICAgICAiXHVDMEM4IFx1QkU0NFx1QkMwMFx1QkM4OFx1RDYzOFx1QjI5NCA2XHVDNzkwIFx1Qzc3NFx1QzBDMVx1Qzc3NFx1QzVCNFx1QzU3QyBcdUQ1NjlcdUIyQzhcdUIyRTQuIn0sCi0gICAgICAgIHsiS2V5c3RvcmUuZmlsZS5leGlzdHMuYnV0LmlzLmVtcHR5LiIsCi0gICAgICAgICAgICAgICAgIlx1RDBBNCBcdUM4MDBcdUM3QTVcdUMxOEMgXHVEMzBDXHVDNzdDXHVDNzc0IFx1Qzg3NFx1QzdBQ1x1RDU1OFx1QzlDMFx1QjlDQyBcdUJFNDRcdUM1QjQgXHVDNzg4XHVDNzRDOiAifSwKLSAgICAgICAgeyJLZXlzdG9yZS5maWxlLmRvZXMubm90LmV4aXN0LiIsCi0gICAgICAgICAgICAgICAgIlx1RDBBNCBcdUM4MDBcdUM3QTVcdUMxOEMgXHVEMzBDXHVDNzdDXHVDNzc0IFx1Qzg3NFx1QzdBQ1x1RDU1OFx1QzlDMCBcdUM1NEFcdUM3NEM6ICJ9LAotICAgICAgICB7Ik11c3Quc3BlY2lmeS5kZXN0aW5hdGlvbi5hbGlhcyIsICJcdUIzMDBcdUMwQzEgXHVCQ0M0XHVDRTZEXHVDNzQ0IFx1QzlDMFx1QzgxNVx1RDU3NFx1QzU3QyBcdUQ1NjlcdUIyQzhcdUIyRTQuIn0sCi0gICAgICAgIHsiTXVzdC5zcGVjaWZ5LmFsaWFzIiwgIlx1QkNDNFx1Q0U2RFx1Qzc0NCBcdUM5QzBcdUM4MTVcdUQ1NzRcdUM1N0MgXHVENTY5XHVCMkM4XHVCMkU0LiJ9LAotICAgICAgICB7IktleXN0b3JlLnBhc3N3b3JkLm11c3QuYmUuYXQubGVhc3QuNi5jaGFyYWN0ZXJzIiwKLSAgICAgICAgICAgICAgICAiXHVEMEE0IFx1QzgwMFx1QzdBNVx1QzE4QyBcdUJFNDRcdUJDMDBcdUJDODhcdUQ2MzhcdUIyOTQgNlx1Qzc5MCBcdUM3NzRcdUMwQzFcdUM3NzRcdUM1QjRcdUM1N0MgXHVENTY5XHVCMkM4XHVCMkU0LiJ9LAotICAgICAgICB7IkVudGVyLmtleXN0b3JlLnBhc3N3b3JkLiIsICJcdUQwQTQgXHVDODAwXHVDN0E1XHVDMThDIFx1QkU0NFx1QkMwMFx1QkM4OFx1RDYzOCBcdUM3ODVcdUI4MjU6ICAifSwKLSAgICAgICAgeyJFbnRlci5zb3VyY2Uua2V5c3RvcmUucGFzc3dvcmQuIiwgIlx1QzE4Q1x1QzJBNCBcdUQwQTQgXHVDODAwXHVDN0E1XHVDMThDIFx1QkU0NFx1QkMwMFx1QkM4OFx1RDYzOCBcdUM3ODVcdUI4MjU6ICAifSwKLSAgICAgICAgeyJFbnRlci5kZXN0aW5hdGlvbi5rZXlzdG9yZS5wYXNzd29yZC4iLCAiXHVCMzAwXHVDMEMxIFx1RDBBNCBcdUM4MDBcdUM3QTVcdUMxOEMgXHVCRTQ0XHVCQzAwXHVCQzg4XHVENjM4IFx1Qzc4NVx1QjgyNTogICJ9LAotICAgICAgICB7IktleXN0b3JlLnBhc3N3b3JkLmlzLnRvby5zaG9ydC5tdXN0LmJlLmF0LmxlYXN0LjYuY2hhcmFjdGVycyIsCi0gICAgICAgICAiXHVEMEE0IFx1QzgwMFx1QzdBNVx1QzE4QyBcdUJFNDRcdUJDMDBcdUJDODhcdUQ2MzhcdUFDMDAgXHVCMTA4XHVCQjM0IFx1QzlFN1x1Qzc0QyAtIDZcdUM3OTAgXHVDNzc0XHVDMEMxXHVDNzc0XHVDNUI0XHVDNTdDIFx1RDU2OVx1QjJDOFx1QjJFNC4ifSwKLSAgICAgICAgeyJVbmtub3duLkVudHJ5LlR5cGUiLCAiXHVDNTRDIFx1QzIxOCBcdUM1QzZcdUIyOTQgXHVENTZEXHVCQUE5IFx1QzcyMFx1RDYxNSJ9LAotICAgICAgICB7IlRvby5tYW55LmZhaWx1cmVzLkFsaWFzLm5vdC5jaGFuZ2VkIiwgIlx1QzYyNFx1Qjk1OFx1QUMwMCBcdUIxMDhcdUJCMzQgXHVCOUNFXHVDMkI1XHVCMkM4XHVCMkU0LiBcdUJDQzRcdUNFNkRcdUM3NzQgXHVCQ0MwXHVBQ0JEXHVCNDE4XHVDOUMwIFx1QzU0QVx1QzU1OFx1QzJCNVx1QjJDOFx1QjJFNC4ifSwKLSAgICAgICAgeyJFbnRyeS5mb3IuYWxpYXMuYWxpYXMuc3VjY2Vzc2Z1bGx5LmltcG9ydGVkLiIsCi0gICAgICAgICAgICAgICAgICJ7MH0gXHVCQ0M0XHVDRTZEXHVDNUQwIFx1QjMwMFx1RDU1QyBcdUQ1NkRcdUJBQTlcdUM3NzQgXHVDMTMxXHVBQ0Y1XHVDODAxXHVDNzNDXHVCODVDIFx1Qzc4NFx1RDNFQ1x1RDJCOFx1QjQxOFx1QzVDOFx1QzJCNVx1QjJDOFx1QjJFNC4ifSwKLSAgICAgICAgeyJFbnRyeS5mb3IuYWxpYXMuYWxpYXMubm90LmltcG9ydGVkLiIsICJ7MH0gXHVCQ0M0XHVDRTZEXHVDNUQwIFx1QjMwMFx1RDU1QyBcdUQ1NkRcdUJBQTlcdUM3NzQgXHVDNzg0XHVEM0VDXHVEMkI4XHVCNDE4XHVDOUMwIFx1QzU0QVx1QzU1OFx1QzJCNVx1QjJDOFx1QjJFNC4ifSwKLSAgICAgICAgeyJQcm9ibGVtLmltcG9ydGluZy5lbnRyeS5mb3IuYWxpYXMuYWxpYXMuZXhjZXB0aW9uLkVudHJ5LmZvci5hbGlhcy5hbGlhcy5ub3QuaW1wb3J0ZWQuIiwKLSAgICAgICAgICAgICAgICAgInswfSBcdUJDQzRcdUNFNkRcdUM1RDAgXHVCMzAwXHVENTVDIFx1RDU2RFx1QkFBOVx1Qzc0NCBcdUM3ODRcdUQzRUNcdUQyQjhcdUQ1NThcdUIyOTQgXHVDOTExIFx1QkIzOFx1QzgxQyBcdUJDMUNcdUMwREQ6IHsxfS5cbnswfSBcdUJDQzRcdUNFNkRcdUM1RDAgXHVCMzAwXHVENTVDIFx1RDU2RFx1QkFBOVx1Qzc3NCBcdUM3ODRcdUQzRUNcdUQyQjhcdUI0MThcdUM5QzAgXHVDNTRBXHVDNTU4XHVDMkI1XHVCMkM4XHVCMkU0LiJ9LAotICAgICAgICB7IkltcG9ydC5jb21tYW5kLmNvbXBsZXRlZC5vay5lbnRyaWVzLnN1Y2Nlc3NmdWxseS5pbXBvcnRlZC5mYWlsLmVudHJpZXMuZmFpbGVkLm9yLmNhbmNlbGxlZCIsCi0gICAgICAgICAgICAgICAgICJcdUM3ODRcdUQzRUNcdUQyQjggXHVCQTg1XHVCODM5IFx1QzY0NFx1QjhDQzogXHVDMTMxXHVBQ0Y1XHVDODAxXHVDNzNDXHVCODVDIFx1Qzc4NFx1RDNFQ1x1RDJCOFx1QjQxQyBcdUQ1NkRcdUJBQTlcdUM3NDAgezB9XHVBQzFDLCBcdUMyRTRcdUQzMjhcdUQ1NThcdUFDNzBcdUIwOTggXHVDREU4XHVDMThDXHVCNDFDIFx1RDU2RFx1QkFBOVx1Qzc0MCB7MX1cdUFDMUNcdUM3ODVcdUIyQzhcdUIyRTQuIn0sCi0gICAgICAgIHsiV2FybmluZy5PdmVyd3JpdGluZy5leGlzdGluZy5hbGlhcy5hbGlhcy5pbi5kZXN0aW5hdGlvbi5rZXlzdG9yZSIsCi0gICAgICAgICAgICAgICAgICJcdUFDQkRcdUFDRTA6IFx1QjMwMFx1QzBDMSBcdUQwQTQgXHVDODAwXHVDN0E1XHVDMThDXHVDNUQwXHVDMTFDIFx1QUUzMFx1Qzg3NCBcdUJDQzRcdUNFNkQgezB9XHVDNzQ0KFx1Qjk3QykgXHVBQ0I5XHVDQ0QwIFx1QzRGMFx1QjI5NCBcdUM5MTEifSwKLSAgICAgICAgeyJFeGlzdGluZy5lbnRyeS5hbGlhcy5hbGlhcy5leGlzdHMub3ZlcndyaXRlLm5vLiIsCi0gICAgICAgICAgICAgICAgICJcdUFFMzBcdUM4NzQgXHVENTZEXHVCQUE5IFx1QkNDNFx1Q0U2RCB7MH1cdUM3NzQoXHVBQzAwKSBcdUM4NzRcdUM3QUNcdUQ1NjlcdUIyQzhcdUIyRTQuIFx1QUNCOVx1Q0NEMCBcdUM0RjBcdUFDQTBcdUMyQjVcdUIyQzhcdUFFNEM/IFtcdUM1NDRcdUIyQzhcdUM2MjRdOiAgIn0sCi0gICAgICAgIHsiVG9vLm1hbnkuZmFpbHVyZXMudHJ5LmxhdGVyIiwgIlx1QzYyNFx1Qjk1OFx1QUMwMCBcdUIxMDhcdUJCMzQgXHVCOUNFXHVDNzRDIC0gXHVCMDk4XHVDOTExXHVDNUQwIFx1QzJEQ1x1QjNDNFx1RDU1OFx1QzJFRFx1QzJEQ1x1QzYyNC4ifSwKLSAgICAgICAgeyJDZXJ0aWZpY2F0aW9uLnJlcXVlc3Quc3RvcmVkLmluLmZpbGUuZmlsZW5hbWUuIiwKLSAgICAgICAgICAgICAgICAiXHVDNzc4XHVDOTlEIFx1QzY5NFx1Q0NBRFx1Qzc3NCA8ezB9PiBcdUQzMENcdUM3N0NcdUM1RDAgXHVDODAwXHVDN0E1XHVCNDE4XHVDNUM4XHVDMkI1XHVCMkM4XHVCMkU0LiJ9LAotICAgICAgICB7IlN1Ym1pdC50aGlzLnRvLnlvdXIuQ0EiLCAiQ0FcdUM1RDBcdUFDOEMgXHVDODFDXHVDRDlDXHVENTU4XHVDMkVEXHVDMkRDXHVDNjI0LiJ9LAotICAgICAgICB7ImlmLmFsaWFzLm5vdC5zcGVjaWZpZWQuZGVzdGFsaWFzLnNyY2tleXBhc3MuYW5kLmRlc3RrZXlwYXNzLm11c3Qubm90LmJlLnNwZWNpZmllZCIsCi0gICAgICAgICAgICAiXHVCQ0M0XHVDRTZEXHVDNzQ0IFx1QzlDMFx1QzgxNVx1RDU1OFx1QzlDMCBcdUM1NEFcdUM3NDAgXHVBQ0JEXHVDNkIwIGRlc3RhbGlhcywgc3Jja2V5cGFzcyBcdUJDMEYgZGVzdGtleXBhc3NcdUI5N0MgXHVDOUMwXHVDODE1XHVENTU4XHVDOUMwIFx1QzU0QVx1QzU0NFx1QzU3QyBcdUQ1NjlcdUIyQzhcdUIyRTQuIn0sCi0gICAgICAgIHsiQ2VydGlmaWNhdGUuc3RvcmVkLmluLmZpbGUuZmlsZW5hbWUuIiwKLSAgICAgICAgICAgICAgICAiXHVDNzc4XHVDOTlEXHVDMTFDXHVBQzAwIDx7MH0+IFx1RDMwQ1x1Qzc3Q1x1QzVEMCBcdUM4MDBcdUM3QTVcdUI0MThcdUM1QzhcdUMyQjVcdUIyQzhcdUIyRTQuIn0sCi0gICAgICAgIHsiQ2VydGlmaWNhdGUucmVwbHkud2FzLmluc3RhbGxlZC5pbi5rZXlzdG9yZSIsCi0gICAgICAgICAgICAgICAgIlx1Qzc3OFx1Qzk5RFx1QzExQyBcdUQ2OENcdUMyRTBcdUM3NzQgXHVEMEE0IFx1QzgwMFx1QzdBNVx1QzE4Q1x1QzVEMCBcdUMxMjRcdUNFNThcdUI0MThcdUM1QzhcdUMyQjVcdUIyQzhcdUIyRTQuIn0sCi0gICAgICAgIHsiQ2VydGlmaWNhdGUucmVwbHkud2FzLm5vdC5pbnN0YWxsZWQuaW4ua2V5c3RvcmUiLAotICAgICAgICAgICAgICAgICJcdUM3NzhcdUM5OURcdUMxMUMgXHVENjhDXHVDMkUwXHVDNzc0IFx1RDBBNCBcdUM4MDBcdUM3QTVcdUMxOENcdUM1RDAgXHVDMTI0XHVDRTU4XHVCNDE4XHVDOUMwIFx1QzU0QVx1QzU1OFx1QzJCNVx1QjJDOFx1QjJFNC4ifSwKLSAgICAgICAgeyJDZXJ0aWZpY2F0ZS53YXMuYWRkZWQudG8ua2V5c3RvcmUiLAotICAgICAgICAgICAgICAgICJcdUM3NzhcdUM5OURcdUMxMUNcdUFDMDAgXHVEMEE0IFx1QzgwMFx1QzdBNVx1QzE4Q1x1QzVEMCBcdUNEOTRcdUFDMDBcdUI0MThcdUM1QzhcdUMyQjVcdUIyQzhcdUIyRTQuIn0sCi0gICAgICAgIHsiQ2VydGlmaWNhdGUud2FzLm5vdC5hZGRlZC50by5rZXlzdG9yZSIsCi0gICAgICAgICAgICAgICAgIlx1Qzc3OFx1Qzk5RFx1QzExQ1x1QUMwMCBcdUQwQTQgXHVDODAwXHVDN0E1XHVDMThDXHVDNUQwIFx1Q0Q5NFx1QUMwMFx1QjQxOFx1QzlDMCBcdUM1NEFcdUM1NThcdUMyQjVcdUIyQzhcdUIyRTQuIn0sCi0gICAgICAgIHsiLlN0b3Jpbmcua3NmbmFtZS4iLCAiW3swfVx1Qzc0NChcdUI5N0MpIFx1QzgwMFx1QzdBNVx1RDU1OFx1QjI5NCBcdUM5MTFdIn0sCi0gICAgICAgIHsiYWxpYXMuaGFzLm5vLnB1YmxpYy5rZXkuY2VydGlmaWNhdGUuIiwKLSAgICAgICAgICAgICAgICAiezB9XHVDNUQwIFx1QUNGNVx1QzZBOSBcdUQwQTQoXHVDNzc4XHVDOTlEXHVDMTFDKVx1QUMwMCBcdUM1QzZcdUMyQjVcdUIyQzhcdUIyRTQuIn0sCi0gICAgICAgIHsiQ2Fubm90LmRlcml2ZS5zaWduYXR1cmUuYWxnb3JpdGhtIiwKLSAgICAgICAgICAgICAgICAiXHVDMTFDXHVCQTg1IFx1QzU0Q1x1QUNFMFx1QjlBQ1x1Qzk5OFx1Qzc0NCBcdUQzMENcdUMwRERcdUQ1NjAgXHVDMjE4IFx1QzVDNlx1QzJCNVx1QjJDOFx1QjJFNC4ifSwKLSAgICAgICAgeyJBbGlhcy5hbGlhcy5kb2VzLm5vdC5leGlzdCIsCi0gICAgICAgICAgICAgICAgIjx7MH0+IFx1QkNDNFx1Q0U2RFx1Qzc3NCBcdUM4NzRcdUM3QUNcdUQ1NThcdUM5QzAgXHVDNTRBXHVDMkI1XHVCMkM4XHVCMkU0LiJ9LAotICAgICAgICB7IkFsaWFzLmFsaWFzLmhhcy5uby5jZXJ0aWZpY2F0ZSIsCi0gICAgICAgICAgICAgICAgIjx7MH0+IFx1QkNDNFx1Q0U2RFx1QzVEMCBcdUM3NzhcdUM5OURcdUMxMUNcdUFDMDAgXHVDNUM2XHVDMkI1XHVCMkM4XHVCMkU0LiJ9LAotICAgICAgICB7IktleS5wYWlyLm5vdC5nZW5lcmF0ZWQuYWxpYXMuYWxpYXMuYWxyZWFkeS5leGlzdHMiLAotICAgICAgICAgICAgICAgICJcdUQwQTQgXHVDMzBEXHVDNzc0IFx1QzBERFx1QzEzMVx1QjQxOFx1QzlDMCBcdUM1NEFcdUM1NThcdUM3M0NcdUJBNzAgPHswfT4gXHVCQ0M0XHVDRTZEXHVDNzc0IFx1Qzg3NFx1QzdBQ1x1RDU2OVx1QjJDOFx1QjJFNC4ifSwKLSAgICAgICAgeyJHZW5lcmF0aW5nLmtleXNpemUuYml0LmtleUFsZ05hbWUua2V5LnBhaXIuYW5kLnNlbGYuc2lnbmVkLmNlcnRpZmljYXRlLnNpZ0FsZ05hbWUud2l0aC5hLnZhbGlkaXR5Lm9mLnZhbGlkYWxpdHkuZGF5cy5mb3IiLAotICAgICAgICAgICAgICAgICJcdUIyRTRcdUM3NENcdUM1RDAgXHVCMzAwXHVENTc0IFx1QzcyMFx1RDZBOCBcdUFFMzBcdUFDMDRcdUM3NzQgezN9XHVDNzdDXHVDNzc4IHswfVx1QkU0NFx1RDJCOCB7MX0gXHVEMEE0IFx1QzMwRCBcdUJDMEYgXHVDNzkwXHVDQ0I0IFx1QzExQ1x1QkE4NVx1QjQxQyBcdUM3NzhcdUM5OURcdUMxMUMoezJ9KVx1Qjk3QyBcdUMwRERcdUMxMzFcdUQ1NThcdUIyOTQgXHVDOTExXG5cdDogezR9In0sCi0gICAgICAgIHsiRW50ZXIua2V5LnBhc3N3b3JkLmZvci5hbGlhcy4iLCAiPHswfT5cdUM1RDAgXHVCMzAwXHVENTVDIFx1RDBBNCBcdUJFNDRcdUJDMDBcdUJDODhcdUQ2MzhcdUI5N0MgXHVDNzg1XHVCODI1XHVENTU4XHVDMkVEXHVDMkRDXHVDNjI0LiJ9LAotICAgICAgICB7Ii5SRVRVUk4uaWYuc2FtZS5hcy5rZXlzdG9yZS5wYXNzd29yZC4iLAotICAgICAgICAgICAgICAgICJcdChcdUQwQTQgXHVDODAwXHVDN0E1XHVDMThDIFx1QkU0NFx1QkMwMFx1QkM4OFx1RDYzOFx1QzY0MCBcdUIzRDlcdUM3N0NcdUQ1NUMgXHVBQ0JEXHVDNkIwIEVudGVyIFx1RDBBNFx1Qjk3QyBcdUIyMDRcdUI5ODQpOiAgIn0sCi0gICAgICAgIHsiS2V5LnBhc3N3b3JkLmlzLnRvby5zaG9ydC5tdXN0LmJlLmF0LmxlYXN0LjYuY2hhcmFjdGVycyIsCi0gICAgICAgICAgICAgICAgIlx1RDBBNCBcdUJFNDRcdUJDMDBcdUJDODhcdUQ2MzhcdUFDMDAgXHVCMTA4XHVCQjM0IFx1QzlFN1x1Qzc0QyAtIDZcdUM3OTAgXHVDNzc0XHVDMEMxXHVDNzc0XHVDNUI0XHVDNTdDIFx1RDU2OVx1QjJDOFx1QjJFNC4ifSwKLSAgICAgICAgeyJUb28ubWFueS5mYWlsdXJlcy5rZXkubm90LmFkZGVkLnRvLmtleXN0b3JlIiwKLSAgICAgICAgICAgICAgICAiXHVDNjI0XHVCOTU4XHVBQzAwIFx1QjEwOFx1QkIzNCBcdUI5Q0VcdUM3NEMgLSBcdUQwQTQgXHVDODAwXHVDN0E1XHVDMThDXHVDNUQwIFx1RDBBNFx1QUMwMCBcdUNEOTRcdUFDMDBcdUI0MThcdUM5QzAgXHVDNTRBXHVDNTU4XHVDMkI1XHVCMkM4XHVCMkU0LiJ9LAotICAgICAgICB7IkRlc3RpbmF0aW9uLmFsaWFzLmRlc3QuYWxyZWFkeS5leGlzdHMiLAotICAgICAgICAgICAgICAgICJcdUIzMDBcdUMwQzEgXHVCQ0M0XHVDRTZEIDx7MH0+XHVDNzc0KFx1QUMwMCkgXHVDODc0XHVDN0FDXHVENTY5XHVCMkM4XHVCMkU0LiJ9LAotICAgICAgICB7IlBhc3N3b3JkLmlzLnRvby5zaG9ydC5tdXN0LmJlLmF0LmxlYXN0LjYuY2hhcmFjdGVycyIsCi0gICAgICAgICAgICAgICAgIlx1QkU0NFx1QkMwMFx1QkM4OFx1RDYzOFx1QUMwMCBcdUIxMDhcdUJCMzQgXHVDOUU3XHVDNzRDIC0gNlx1Qzc5MCBcdUM3NzRcdUMwQzFcdUM3NzRcdUM1QjRcdUM1N0MgXHVENTY5XHVCMkM4XHVCMkU0LiJ9LAotICAgICAgICB7IlRvby5tYW55LmZhaWx1cmVzLktleS5lbnRyeS5ub3QuY2xvbmVkIiwKLSAgICAgICAgICAgICAgICAiXHVDNjI0XHVCOTU4XHVBQzAwIFx1QjEwOFx1QkIzNCBcdUI5Q0VcdUMyQjVcdUIyQzhcdUIyRTQuIFx1RDBBNCBcdUQ1NkRcdUJBQTlcdUM3NzQgXHVCQ0Y1XHVDODFDXHVCNDE4XHVDOUMwIFx1QzU0QVx1QzU1OFx1QzJCNVx1QjJDOFx1QjJFNC4ifSwKLSAgICAgICAgeyJrZXkucGFzc3dvcmQuZm9yLmFsaWFzLiIsICI8ezB9Plx1QzVEMCBcdUIzMDBcdUQ1NUMgXHVEMEE0IFx1QkU0NFx1QkMwMFx1QkM4OFx1RDYzOCJ9LAotICAgICAgICB7IktleXN0b3JlLmVudHJ5LmZvci5pZC5nZXROYW1lLmFscmVhZHkuZXhpc3RzIiwKLSAgICAgICAgICAgICAgICAiPHswfT5cdUM1RDAgXHVCMzAwXHVENTVDIFx1RDBBNCBcdUM4MDBcdUM3QTVcdUMxOEMgXHVENTZEXHVCQUE5XHVDNzc0IFx1Qzg3NFx1QzdBQ1x1RDU2OVx1QjJDOFx1QjJFNC4ifSwKLSAgICAgICAgeyJDcmVhdGluZy5rZXlzdG9yZS5lbnRyeS5mb3IuaWQuZ2V0TmFtZS4iLAotICAgICAgICAgICAgICAgICI8ezB9Plx1QzVEMCBcdUIzMDBcdUQ1NUMgXHVEMEE0IFx1QzgwMFx1QzdBNVx1QzE4QyBcdUQ1NkRcdUJBQTlcdUM3NDQgXHVDMEREXHVDMTMxXHVENTU4XHVCMjk0IFx1QzkxMS4uLiJ9LAotICAgICAgICB7Ik5vLmVudHJpZXMuZnJvbS5pZGVudGl0eS5kYXRhYmFzZS5hZGRlZCIsCi0gICAgICAgICAgICAgICAgIklEIFx1QjM3MFx1Qzc3NFx1RDEzMFx1QkNBMFx1Qzc3NFx1QzJBNFx1QzVEMFx1QzExQyBcdUNEOTRcdUFDMDBcdUI0MUMgXHVENTZEXHVCQUE5XHVDNzc0IFx1QzVDNlx1QzJCNVx1QjJDOFx1QjJFNC4ifSwKLSAgICAgICAgeyJBbGlhcy5uYW1lLmFsaWFzIiwgIlx1QkNDNFx1Q0U2RCBcdUM3NzRcdUI5ODQ6IHswfSJ9LAotICAgICAgICB7IkNyZWF0aW9uLmRhdGUua2V5U3RvcmUuZ2V0Q3JlYXRpb25EYXRlLmFsaWFzLiIsCi0gICAgICAgICAgICAgICAgIlx1QzBERFx1QzEzMSBcdUIwQTBcdUM5REM6IHswLGRhdGV9In0sCi0gICAgICAgIHsiYWxpYXMua2V5U3RvcmUuZ2V0Q3JlYXRpb25EYXRlLmFsaWFzLiIsCi0gICAgICAgICAgICAgICAgInswfSwgezEsZGF0ZX0sICJ9LAotICAgICAgICB7ImFsaWFzLiIsICJ7MH0sICJ9LAotICAgICAgICB7IkVudHJ5LnR5cGUudHlwZS4iLCAiXHVENTZEXHVCQUE5IFx1QzcyMFx1RDYxNTogezB9In0sCi0gICAgICAgIHsiQ2VydGlmaWNhdGUuY2hhaW4ubGVuZ3RoLiIsICJcdUM3NzhcdUM5OURcdUMxMUMgXHVDQ0I0XHVDNzc4IFx1QUUzOFx1Qzc3NDogIn0sCi0gICAgICAgIHsiQ2VydGlmaWNhdGUuaS4xLiIsICJcdUM3NzhcdUM5OURcdUMxMUNbezAsbnVtYmVyLGludGVnZXJ9XToifSwKLSAgICAgICAgeyJDZXJ0aWZpY2F0ZS5maW5nZXJwcmludC5TSEExLiIsICJcdUM3NzhcdUM5OURcdUMxMUMgXHVDOUMwXHVCQjM4KFNIQTEpOiAifSwKLSAgICAgICAgeyJLZXlzdG9yZS50eXBlLiIsICJcdUQwQTQgXHVDODAwXHVDN0E1XHVDMThDIFx1QzcyMFx1RDYxNTogIn0sCi0gICAgICAgIHsiS2V5c3RvcmUucHJvdmlkZXIuIiwgIlx1RDBBNCBcdUM4MDBcdUM3QTVcdUMxOEMgXHVDODFDXHVBQ0Y1XHVDNzkwOiAifSwKLSAgICAgICAgeyJZb3VyLmtleXN0b3JlLmNvbnRhaW5zLmtleVN0b3JlLnNpemUuZW50cnkiLAotICAgICAgICAgICAgICAgICJcdUQwQTQgXHVDODAwXHVDN0E1XHVDMThDXHVDNUQwIHswLG51bWJlcixpbnRlZ2VyfVx1QUMxQ1x1Qzc1OCBcdUQ1NkRcdUJBQTlcdUM3NzQgXHVEM0VDXHVENTY4XHVCNDE4XHVDNUI0IFx1Qzc4OFx1QzJCNVx1QjJDOFx1QjJFNC4ifSwKLSAgICAgICAgeyJZb3VyLmtleXN0b3JlLmNvbnRhaW5zLmtleVN0b3JlLnNpemUuZW50cmllcyIsCi0gICAgICAgICAgICAgICAgIlx1RDBBNCBcdUM4MDBcdUM3QTVcdUMxOENcdUM1RDAgezAsbnVtYmVyLGludGVnZXJ9XHVBQzFDXHVDNzU4IFx1RDU2RFx1QkFBOVx1Qzc3NCBcdUQzRUNcdUQ1NjhcdUI0MThcdUM1QjQgXHVDNzg4XHVDMkI1XHVCMkM4XHVCMkU0LiJ9LAotICAgICAgICB7IkZhaWxlZC50by5wYXJzZS5pbnB1dCIsICJcdUM3ODVcdUI4MjVcdUFDMTJcdUM3NTggXHVBRDZDXHVCQjM4IFx1QkQ4NFx1QzExRFx1Qzc0NCBcdUMyRTRcdUQzMjhcdUQ1ODhcdUMyQjVcdUIyQzhcdUIyRTQuIn0sCi0gICAgICAgIHsiRW1wdHkuaW5wdXQiLCAiXHVDNzg1XHVCODI1XHVBQzEyXHVDNzc0IFx1QkU0NFx1QzVCNCBcdUM3ODhcdUMyQjVcdUIyQzhcdUIyRTQuIn0sCi0gICAgICAgIHsiTm90LlguNTA5LmNlcnRpZmljYXRlIiwgIlguNTA5IFx1Qzc3OFx1Qzk5RFx1QzExQ1x1QUMwMCBcdUM1NDRcdUIyRDlcdUIyQzhcdUIyRTQuIn0sCi0gICAgICAgIHsiYWxpYXMuaGFzLm5vLnB1YmxpYy5rZXkiLCAiezB9XHVDNUQwIFx1QUNGNVx1QzZBOSBcdUQwQTRcdUFDMDAgXHVDNUM2XHVDMkI1XHVCMkM4XHVCMkU0LiJ9LAotICAgICAgICB7ImFsaWFzLmhhcy5uby5YLjUwOS5jZXJ0aWZpY2F0ZSIsICJ7MH1cdUM1RDAgWC41MDkgXHVDNzc4XHVDOTlEXHVDMTFDXHVBQzAwIFx1QzVDNlx1QzJCNVx1QjJDOFx1QjJFNC4ifSwKLSAgICAgICAgeyJOZXcuY2VydGlmaWNhdGUuc2VsZi5zaWduZWQuIiwgIlx1QzBDOCBcdUM3NzhcdUM5OURcdUMxMUMoXHVDNzkwXHVDQ0I0IFx1QzExQ1x1QkE4NSk6In0sCi0gICAgICAgIHsiUmVwbHkuaGFzLm5vLmNlcnRpZmljYXRlcyIsICJcdUQ2OENcdUMyRTBcdUM1RDAgXHVDNzc4XHVDOTlEXHVDMTFDXHVBQzAwIFx1QzVDNlx1QzJCNVx1QjJDOFx1QjJFNC4ifSwKLSAgICAgICAgeyJDZXJ0aWZpY2F0ZS5ub3QuaW1wb3J0ZWQuYWxpYXMuYWxpYXMuYWxyZWFkeS5leGlzdHMiLAotICAgICAgICAgICAgICAgICJcdUM3NzhcdUM5OURcdUMxMUNcdUFDMDAgXHVDNzg0XHVEM0VDXHVEMkI4XHVCNDE4XHVDOUMwIFx1QzU0QVx1QzU1OFx1QzczQ1x1QkE3MCA8ezB9PiBcdUJDQzRcdUNFNkRcdUM3NzQgXHVDODc0XHVDN0FDXHVENTY5XHVCMkM4XHVCMkU0LiJ9LAotICAgICAgICB7IklucHV0Lm5vdC5hbi5YLjUwOS5jZXJ0aWZpY2F0ZSIsICJcdUM3ODVcdUI4MjVcdUM3NzQgWC41MDkgXHVDNzc4XHVDOTlEXHVDMTFDXHVBQzAwIFx1QzU0NFx1QjJEOVx1QjJDOFx1QjJFNC4ifSwKLSAgICAgICAgeyJDZXJ0aWZpY2F0ZS5hbHJlYWR5LmV4aXN0cy5pbi5rZXlzdG9yZS51bmRlci5hbGlhcy50cnVzdGFsaWFzLiIsCi0gICAgICAgICAgICAgICAgIlx1Qzc3OFx1Qzk5RFx1QzExQ1x1QUMwMCA8ezB9PiBcdUJDQzRcdUNFNkQgXHVDNTQ0XHVCNzk4XHVDNzU4IFx1RDBBNCBcdUM4MDBcdUM3QTVcdUMxOENcdUM1RDAgXHVDODc0XHVDN0FDXHVENTY5XHVCMkM4XHVCMkU0LiJ9LAotICAgICAgICB7IkRvLnlvdS5zdGlsbC53YW50LnRvLmFkZC5pdC5uby4iLAotICAgICAgICAgICAgICAgICJcdUNEOTRcdUFDMDBcdUQ1NThcdUFDQTBcdUMyQjVcdUIyQzhcdUFFNEM/IFtcdUM1NDRcdUIyQzhcdUM2MjRdOiAgIn0sCi0gICAgICAgIHsiQ2VydGlmaWNhdGUuYWxyZWFkeS5leGlzdHMuaW4uc3lzdGVtLndpZGUuQ0Eua2V5c3RvcmUudW5kZXIuYWxpYXMudHJ1c3RhbGlhcy4iLAotICAgICAgICAgICAgICAgICJcdUM3NzhcdUM5OURcdUMxMUNcdUFDMDAgPHswfT4gXHVCQ0M0XHVDRTZEIFx1QzU0NFx1Qjc5OFx1QzVEMCBcdUM3ODhcdUIyOTQgXHVDMkRDXHVDMkE0XHVEMTVDIFx1Q0MyOFx1QzZEMFx1Qzc1OCBDQSBcdUQwQTQgXHVDODAwXHVDN0E1XHVDMThDXHVDNUQwIFx1Qzg3NFx1QzdBQ1x1RDU2OVx1QjJDOFx1QjJFNC4ifSwKLSAgICAgICAgeyJEby55b3Uuc3RpbGwud2FudC50by5hZGQuaXQudG8ueW91ci5vd24ua2V5c3RvcmUubm8uIiwKLSAgICAgICAgICAgICAgICAiXHVBQ0UwXHVDNzIwXHVENTVDIFx1RDBBNCBcdUM4MDBcdUM3QTVcdUMxOENcdUM1RDAgXHVDRDk0XHVBQzAwXHVENTU4XHVBQ0EwXHVDMkI1XHVCMkM4XHVBRTRDPyBbXHVDNTQ0XHVCMkM4XHVDNjI0XTogICJ9LAotICAgICAgICB7IlRydXN0LnRoaXMuY2VydGlmaWNhdGUubm8uIiwgIlx1Qzc3NCBcdUM3NzhcdUM5OURcdUMxMUNcdUI5N0MgXHVDMkUwXHVCOEIwXHVENTY5XHVCMkM4XHVBRTRDPyBbXHVDNTQ0XHVCMkM4XHVDNjI0XTogICJ9LAotICAgICAgICB7IllFUyIsICJcdUM2MDgifSwKLSAgICAgICAgeyJOZXcucHJvbXB0LiIsICJcdUMwQzggezB9OiAifSwKLSAgICAgICAgeyJQYXNzd29yZHMubXVzdC5kaWZmZXIiLCAiXHVCRTQ0XHVCQzAwXHVCQzg4XHVENjM4XHVCMjk0IFx1QjJFQ1x1Qjc3Q1x1QzU3QyBcdUQ1NjlcdUIyQzhcdUIyRTQuIn0sCi0gICAgICAgIHsiUmUuZW50ZXIubmV3LnByb21wdC4iLCAiXHVDMEM4IHswfSBcdUIyRTRcdUMyREMgXHVDNzg1XHVCODI1OiAifSwKLSAgICAgICAgeyJSZS5lbnRlci5uZXcucGFzc3dvcmQuIiwgIlx1QzBDOCBcdUJFNDRcdUJDMDBcdUJDODhcdUQ2MzggXHVCMkU0XHVDMkRDIFx1Qzc4NVx1QjgyNTogIn0sCi0gICAgICAgIHsiVGhleS5kb24udC5tYXRjaC5UcnkuYWdhaW4iLCAiXHVDNzdDXHVDRTU4XHVENTU4XHVDOUMwIFx1QzU0QVx1QzJCNVx1QjJDOFx1QjJFNC4gXHVCMkU0XHVDMkRDIFx1QzJEQ1x1QjNDNFx1RDU1OFx1QzJFRFx1QzJEQ1x1QzYyNC4ifSwKLSAgICAgICAgeyJFbnRlci5wcm9tcHQuYWxpYXMubmFtZS4iLCAiezB9IFx1QkNDNFx1Q0U2RCBcdUM3NzRcdUI5ODQgXHVDNzg1XHVCODI1OiAgIn0sCi0gICAgICAgIHsiRW50ZXIubmV3LmFsaWFzLm5hbWUuUkVUVVJOLnRvLmNhbmNlbC5pbXBvcnQuZm9yLnRoaXMuZW50cnkuIiwKLSAgICAgICAgICAgICAgICAgIlx1QzBDOCBcdUJDQzRcdUNFNkQgXHVDNzc0XHVCOTg0IFx1Qzc4NVx1QjgyNVx0KFx1Qzc3NCBcdUQ1NkRcdUJBQTlcdUM1RDAgXHVCMzAwXHVENTVDIFx1Qzc4NFx1RDNFQ1x1RDJCOFx1Qjk3QyBcdUNERThcdUMxOENcdUQ1NThcdUI4MjRcdUJBNzQgRW50ZXIgXHVEMEE0XHVCOTdDIFx1QjIwNFx1Qjk4NCk6ICAifSwKLSAgICAgICAgeyJFbnRlci5hbGlhcy5uYW1lLiIsICJcdUJDQzRcdUNFNkQgXHVDNzc0XHVCOTg0IFx1Qzc4NVx1QjgyNTogICJ9LAotICAgICAgICB7Ii5SRVRVUk4uaWYuc2FtZS5hcy5mb3Iub3RoZXJBbGlhcy4iLAotICAgICAgICAgICAgICAgICJcdCg8ezB9Plx1QUNGQyhcdUM2NDApIFx1QjNEOVx1Qzc3Q1x1RDU1QyBcdUFDQkRcdUM2QjAgRW50ZXIgXHVEMEE0XHVCOTdDIFx1QjIwNFx1Qjk4NCkifSwKLSAgICAgICAgeyIuUEFUVEVSTi5wcmludFg1MDlDZXJ0IiwKLSAgICAgICAgICAgICAgICAiXHVDMThDXHVDNzIwXHVDNzkwOiB7MH1cblx1QkMxQ1x1RDU4OVx1Qzc5MDogezF9XG5cdUM3N0NcdUI4MjggXHVCQzg4XHVENjM4OiB7Mn1cblx1QzgwMVx1RDU2OVx1RDU1QyBcdUMyRENcdUM3OTEgXHVCMEEwXHVDOURDOiB7M30sIFx1Qzg4NVx1QjhDQyBcdUIwQTBcdUM5REM6IHs0fVxuXHVDNzc4XHVDOTlEXHVDMTFDIFx1QzlDMFx1QkIzODpcblx0IE1ENTogezV9XG5cdCBTSEExOiB7Nn1cblx0IFNIQTI1Njogezd9XG5cdCBcdUMxMUNcdUJBODUgXHVDNTRDXHVBQ0UwXHVCOUFDXHVDOTk4IFx1Qzc3NFx1Qjk4NDogezh9XG5cdCBcdUJDODRcdUM4MDQ6IHs5fSJ9LAotICAgICAgICB7IldoYXQuaXMueW91ci5maXJzdC5hbmQubGFzdC5uYW1lLiIsCi0gICAgICAgICAgICAgICAgIlx1Qzc3NFx1Qjk4NFx1QUNGQyBcdUMxMzFcdUM3NDQgXHVDNzg1XHVCODI1XHVENTU4XHVDMkVEXHVDMkRDXHVDNjI0LiJ9LAotICAgICAgICB7IldoYXQuaXMudGhlLm5hbWUub2YueW91ci5vcmdhbml6YXRpb25hbC51bml0LiIsCi0gICAgICAgICAgICAgICAgIlx1Qzg3MFx1QzlDMSBcdUIyRThcdUM3MDQgXHVDNzc0XHVCOTg0XHVDNzQ0IFx1Qzc4NVx1QjgyNVx1RDU1OFx1QzJFRFx1QzJEQ1x1QzYyNC4ifSwKLSAgICAgICAgeyJXaGF0LmlzLnRoZS5uYW1lLm9mLnlvdXIub3JnYW5pemF0aW9uLiIsCi0gICAgICAgICAgICAgICAgIlx1Qzg3MFx1QzlDMSBcdUM3NzRcdUI5ODRcdUM3NDQgXHVDNzg1XHVCODI1XHVENTU4XHVDMkVEXHVDMkRDXHVDNjI0LiJ9LAotICAgICAgICB7IldoYXQuaXMudGhlLm5hbWUub2YueW91ci5DaXR5Lm9yLkxvY2FsaXR5LiIsCi0gICAgICAgICAgICAgICAgIlx1QUQ2Qy9cdUFENzAvXHVDMkRDIFx1Qzc3NFx1Qjk4NFx1Qzc0NCBcdUM3ODVcdUI4MjVcdUQ1NThcdUMyRURcdUMyRENcdUM2MjQ/In0sCi0gICAgICAgIHsiV2hhdC5pcy50aGUubmFtZS5vZi55b3VyLlN0YXRlLm9yLlByb3ZpbmNlLiIsCi0gICAgICAgICAgICAgICAgIlx1QzJEQy9cdUIzQzQgXHVDNzc0XHVCOTg0XHVDNzQ0IFx1Qzc4NVx1QjgyNVx1RDU1OFx1QzJFRFx1QzJEQ1x1QzYyNC4ifSwKLSAgICAgICAgeyJXaGF0LmlzLnRoZS50d28ubGV0dGVyLmNvdW50cnkuY29kZS5mb3IudGhpcy51bml0LiIsCi0gICAgICAgICAgICAgICAgIlx1Qzc3NCBcdUM4NzBcdUM5QzFcdUM3NTggXHVCNDUwIFx1Qzc5MFx1QjlBQyBcdUFENkRcdUFDMDAgXHVDRjU0XHVCNERDXHVCOTdDIFx1Qzc4NVx1QjgyNVx1RDU1OFx1QzJFRFx1QzJEQ1x1QzYyNC4ifSwKLSAgICAgICAgeyJJcy5uYW1lLmNvcnJlY3QuIiwgInswfVx1Qzc3NChcdUFDMDApIFx1QjlERVx1QzJCNVx1QjJDOFx1QUU0Qz8ifSwKLSAgICAgICAgeyJubyIsICJcdUM1NDRcdUIyQzhcdUM2MjQifSwKLSAgICAgICAgeyJ5ZXMiLCAiXHVDNjA4In0sCi0gICAgICAgIHsieSIsICJ5In0sCi0gICAgICAgIHsiLmRlZmF1bHRWYWx1ZS4iLCAiICBbezB9XTogICJ9LAotICAgICAgICB7IkFsaWFzLmFsaWFzLmhhcy5uby5rZXkiLAotICAgICAgICAgICAgICAgICI8ezB9PiBcdUJDQzRcdUNFNkRcdUM1RDAgXHVEMEE0XHVBQzAwIFx1QzVDNlx1QzJCNVx1QjJDOFx1QjJFNC4ifSwKLSAgICAgICAgeyJBbGlhcy5hbGlhcy5yZWZlcmVuY2VzLmFuLmVudHJ5LnR5cGUudGhhdC5pcy5ub3QuYS5wcml2YXRlLmtleS5lbnRyeS5UaGUua2V5Y2xvbmUuY29tbWFuZC5vbmx5LnN1cHBvcnRzLmNsb25pbmcub2YucHJpdmF0ZS5rZXkiLAotICAgICAgICAgICAgICAgICAiPHswfT4gXHVCQ0M0XHVDRTZEXHVDNzQwIFx1QzgwNFx1QzZBOSBcdUQwQTQgXHVENTZEXHVCQUE5XHVDNzc0IFx1QzU0NFx1QjJDQyBcdUQ1NkRcdUJBQTkgXHVDNzIwXHVENjE1XHVDNzQ0IFx1Q0MzOFx1Qzg3MFx1RDU2OVx1QjJDOFx1QjJFNC4gLWtleWNsb25lIFx1QkE4NVx1QjgzOVx1Qzc0MCBcdUM4MDRcdUM2QTkgXHVEMEE0IFx1RDU2RFx1QkFBOVx1Qzc1OCBcdUJDRjVcdUM4MUNcdUI5Q0MgXHVDOUMwXHVDNkQwXHVENTY5XHVCMkM4XHVCMkU0LiJ9LAotCi0gICAgICAgIHsiLldBUk5JTkcuV0FSTklORy5XQVJOSU5HLiIsCi0gICAgICAgICAgICAiKioqKioqKioqKioqKioqKiogIFx1QUNCRFx1QUNFMCBcdUFDQkRcdUFDRTAgXHVBQ0JEXHVBQ0UwICAqKioqKioqKioqKioqKioqKiJ9LAotICAgICAgICB7IlNpZ25lci5kLiIsICJcdUMxMUNcdUJBODVcdUM3OTAgIyVkOiJ9LAotICAgICAgICB7IlRpbWVzdGFtcC4iLCAiXHVDMkRDXHVBQzA0IFx1QUUzMFx1Qjg1RDoifSwKLSAgICAgICAgeyJTaWduYXR1cmUuIiwgIlx1QzExQ1x1QkE4NToifSwKLSAgICAgICAgeyJDUkxzLiIsICJDUkw6In0sCi0gICAgICAgIHsiQ2VydGlmaWNhdGUub3duZXIuIiwgIlx1Qzc3OFx1Qzk5RFx1QzExQyBcdUMxOENcdUM3MjBcdUM3OTA6ICJ9LAotICAgICAgICB7Ik5vdC5hLnNpZ25lZC5qYXIuZmlsZSIsICJcdUMxMUNcdUJBODVcdUI0MUMgamFyIFx1RDMwQ1x1Qzc3Q1x1Qzc3NCBcdUM1NDRcdUIyRDlcdUIyQzhcdUIyRTQuIn0sCi0gICAgICAgIHsiTm8uY2VydGlmaWNhdGUuZnJvbS50aGUuU1NMLnNlcnZlciIsCi0gICAgICAgICAgICAgICAgIlNTTCBcdUMxMUNcdUJDODRcdUM1RDBcdUMxMUMgXHVBQzAwXHVDODM4XHVDNjI4IFx1Qzc3OFx1Qzk5RFx1QzExQ1x1QUMwMCBcdUM1QzZcdUMyQjVcdUIyQzhcdUIyRTQuIn0sCi0KLSAgICAgICAgeyIuVGhlLmludGVncml0eS5vZi50aGUuaW5mb3JtYXRpb24uc3RvcmVkLmluLnlvdXIua2V5c3RvcmUuIiwKLSAgICAgICAgICAgICIqIFx1RDBBNCBcdUM4MDBcdUM3QTVcdUMxOENcdUM1RDAgXHVDODAwXHVDN0E1XHVCNDFDIFx1QzgxNVx1QkNGNFx1Qzc1OCBcdUJCMzRcdUFDQjBcdUMxMzFcdUM3NzQgICpcbiogXHVENjU1XHVDNzc4XHVCNDE4XHVDOUMwIFx1QzU0QVx1QzU1OFx1QzJCNVx1QjJDOFx1QjJFNCEgXHVCQjM0XHVBQ0IwXHVDMTMxXHVDNzQ0IFx1RDY1NVx1Qzc3OFx1RDU1OFx1QjgyNFx1QkE3NCwgKlxuKiBcdUQwQTQgXHVDODAwXHVDN0E1XHVDMThDIFx1QkU0NFx1QkMwMFx1QkM4OFx1RDYzOFx1Qjk3QyBcdUM4MUNcdUFDRjVcdUQ1NzRcdUM1N0MgXHVENTY5XHVCMkM4XHVCMkU0LiAgICAgICAgICAgICAgICAgICoifSwKLSAgICAgICAgeyIuVGhlLmludGVncml0eS5vZi50aGUuaW5mb3JtYXRpb24uc3RvcmVkLmluLnRoZS5zcmNrZXlzdG9yZS4iLAotICAgICAgICAgICAgIiogc3Jja2V5c3RvcmVcdUM1RDAgXHVDODAwXHVDN0E1XHVCNDFDIFx1QzgxNVx1QkNGNFx1Qzc1OCBcdUJCMzRcdUFDQjBcdUMxMzFcdUM3NzQgICpcbiogXHVENjU1XHVDNzc4XHVCNDE4XHVDOUMwIFx1QzU0QVx1QzU1OFx1QzJCNVx1QjJDOFx1QjJFNCEgXHVCQjM0XHVBQ0IwXHVDMTMxXHVDNzQ0IFx1RDY1NVx1Qzc3OFx1RDU1OFx1QjgyNFx1QkE3NCwgKlxuKiBzcmNrZXlzdG9yZSBcdUJFNDRcdUJDMDBcdUJDODhcdUQ2MzhcdUI5N0MgXHVDODFDXHVBQ0Y1XHVENTc0XHVDNTdDIFx1RDU2OVx1QjJDOFx1QjJFNC4gICAgICAgICAgICAgICAgICAqIn0sCi0KLSAgICAgICAgeyJDZXJ0aWZpY2F0ZS5yZXBseS5kb2VzLm5vdC5jb250YWluLnB1YmxpYy5rZXkuZm9yLmFsaWFzLiIsCi0gICAgICAgICAgICAgICAgIlx1Qzc3OFx1Qzk5RFx1QzExQyBcdUQ2OENcdUMyRTBcdUM1RDAgPHswfT5cdUM1RDAgXHVCMzAwXHVENTVDIFx1QUNGNVx1QzZBOSBcdUQwQTRcdUFDMDAgXHVEM0VDXHVENTY4XHVCNDE4XHVDNUI0IFx1Qzc4OFx1QzlDMCBcdUM1NEFcdUMyQjVcdUIyQzhcdUIyRTQuIn0sCi0gICAgICAgIHsiSW5jb21wbGV0ZS5jZXJ0aWZpY2F0ZS5jaGFpbi5pbi5yZXBseSIsCi0gICAgICAgICAgICAgICAgIlx1RDY4Q1x1QzJFMFx1QzVEMCBcdUJEODhcdUM2NDRcdUM4MDRcdUQ1NUMgXHVDNzc4XHVDOTlEXHVDMTFDIFx1Q0NCNFx1Qzc3OFx1Qzc3NCBcdUM3ODhcdUMyQjVcdUIyQzhcdUIyRTQuIn0sCi0gICAgICAgIHsiQ2VydGlmaWNhdGUuY2hhaW4uaW4ucmVwbHkuZG9lcy5ub3QudmVyaWZ5LiIsCi0gICAgICAgICAgICAgICAgIlx1RDY4Q1x1QzJFMFx1Qzc1OCBcdUM3NzhcdUM5OURcdUMxMUMgXHVDQ0I0XHVDNzc4XHVDNzc0IFx1RDY1NVx1Qzc3OFx1QjQxOFx1QzlDMCBcdUM1NEFcdUM3NEM6ICJ9LAotICAgICAgICB7IlRvcC5sZXZlbC5jZXJ0aWZpY2F0ZS5pbi5yZXBseS4iLAotICAgICAgICAgICAgICAgICJcdUQ2OENcdUMyRTBcdUM1RDAgXHVDRDVDXHVDMEMxXHVDNzA0IFx1QjgwOFx1QkNBOCBcdUM3NzhcdUM5OURcdUMxMUNcdUFDMDAgXHVDNzg4XHVDNzRDOlxuIn0sCi0gICAgICAgIHsiLmlzLm5vdC50cnVzdGVkLiIsICIuLi5cdUM3NDQoXHVCOTdDKSBcdUMyRTBcdUI4QjBcdUQ1NjAgXHVDMjE4IFx1QzVDNlx1QzJCNVx1QjJDOFx1QjJFNC4gIn0sCi0gICAgICAgIHsiSW5zdGFsbC5yZXBseS5hbnl3YXkubm8uIiwgIlx1RDY4Q1x1QzJFMFx1Qzc0NCBcdUMxMjRcdUNFNThcdUQ1NThcdUFDQTBcdUMyQjVcdUIyQzhcdUFFNEM/IFtcdUM1NDRcdUIyQzhcdUM2MjRdOiAgIn0sCi0gICAgICAgIHsiTk8iLCAiXHVDNTQ0XHVCMkM4XHVDNjI0In0sCi0gICAgICAgIHsiUHVibGljLmtleXMuaW4ucmVwbHkuYW5kLmtleXN0b3JlLmRvbi50Lm1hdGNoIiwKLSAgICAgICAgICAgICAgICAiXHVENjhDXHVDMkUwXHVBQ0ZDIFx1RDBBNCBcdUM4MDBcdUM3QTVcdUMxOENcdUM3NTggXHVBQ0Y1XHVDNkE5IFx1RDBBNFx1QUMwMCBcdUM3N0NcdUNFNThcdUQ1NThcdUM5QzAgXHVDNTRBXHVDMkI1XHVCMkM4XHVCMkU0LiJ9LAotICAgICAgICB7IkNlcnRpZmljYXRlLnJlcGx5LmFuZC5jZXJ0aWZpY2F0ZS5pbi5rZXlzdG9yZS5hcmUuaWRlbnRpY2FsIiwKLSAgICAgICAgICAgICAgICAiXHVENjhDXHVDMkUwXHVBQ0ZDIFx1RDBBNCBcdUM4MDBcdUM3QTVcdUMxOENcdUM3NTggXHVDNzc4XHVDOTlEXHVDMTFDXHVBQzAwIFx1QjNEOVx1Qzc3Q1x1RDU2OVx1QjJDOFx1QjJFNC4ifSwKLSAgICAgICAgeyJGYWlsZWQudG8uZXN0YWJsaXNoLmNoYWluLmZyb20ucmVwbHkiLAotICAgICAgICAgICAgICAgICJcdUQ2OENcdUMyRTBcdUM3NTggXHVDQ0I0XHVDNzc4IFx1QzEyNFx1QzgxNVx1Qzc0NCBcdUMyRTRcdUQzMjhcdUQ1ODhcdUMyQjVcdUIyQzhcdUIyRTQuIn0sCi0gICAgICAgIHsibiIsICJuIn0sCi0gICAgICAgIHsiV3JvbmcuYW5zd2VyLnRyeS5hZ2FpbiIsICJcdUM3OThcdUJBQkJcdUI0MUMgXHVDNzUxXHVCMkY1XHVDNzg1XHVCMkM4XHVCMkU0LiBcdUIyRTRcdUMyREMgXHVDMkRDXHVCM0M0XHVENTU4XHVDMkVEXHVDMkRDXHVDNjI0LiJ9LAotICAgICAgICB7IlNlY3JldC5rZXkubm90LmdlbmVyYXRlZC5hbGlhcy5hbGlhcy5hbHJlYWR5LmV4aXN0cyIsCi0gICAgICAgICAgICAgICAgIlx1QkNGNFx1QzU0OCBcdUQwQTRcdUFDMDAgXHVDMEREXHVDMTMxXHVCNDE4XHVDOUMwIFx1QzU0QVx1QzU1OFx1QzczQ1x1QkE3MCA8ezB9PiBcdUJDQzRcdUNFNkRcdUM3NzQgXHVDODc0XHVDN0FDXHVENTY5XHVCMkM4XHVCMkU0LiJ9LAotICAgICAgICB7IlBsZWFzZS5wcm92aWRlLmtleXNpemUuZm9yLnNlY3JldC5rZXkuZ2VuZXJhdGlvbiIsCi0gICAgICAgICAgICAgICAgIlx1QkNGNFx1QzU0OCBcdUQwQTRcdUI5N0MgXHVDMEREXHVDMTMxXHVENTU4XHVCODI0XHVCQTc0IC1rZXlzaXplXHVCOTdDIFx1QzgxQ1x1QUNGNVx1RDU1OFx1QzJFRFx1QzJEQ1x1QzYyNC4ifSwKLQotICAgICAgICB7IkV4dGVuc2lvbnMuIiwgIlx1RDY1NVx1QzdBNTogIn0sCi0gICAgICAgIHsiLkVtcHR5LnZhbHVlLiIsICIoXHVCRTQ0XHVDNUI0IFx1Qzc4OFx1QjI5NCBcdUFDMTIpIn0sCi0gICAgICAgIHsiRXh0ZW5zaW9uLlJlcXVlc3QuIiwgIlx1RDY1NVx1QzdBNSBcdUM2OTRcdUNDQUQ6In0sCi0gICAgICAgIHsiUEtDUy4xMC5DZXJ0aWZpY2F0ZS5SZXF1ZXN0LlZlcnNpb24uMS4wLlN1YmplY3Qucy5QdWJsaWMuS2V5LnMuZm9ybWF0LnMua2V5LiIsCi0gICAgICAgICAgICAgICAgIlBLQ1MgIzEwIFx1Qzc3OFx1Qzk5RFx1QzExQyBcdUM2OTRcdUNDQUQoMS4wIFx1QkM4NFx1QzgwNClcblx1QzgxQ1x1QkFBOTogJXNcblx1QUNGNVx1QzZBOSBcdUQwQTQ6ICVzIFx1RDYxNVx1QzJERCAlcyBcdUQwQTRcbiJ9LAotICAgICAgICB7IlVua25vd24ua2V5VXNhZ2UudHlwZS4iLCAiXHVDNTRDIFx1QzIxOCBcdUM1QzZcdUIyOTQga2V5VXNhZ2UgXHVDNzIwXHVENjE1OiAifSwKLSAgICAgICAgeyJVbmtub3duLmV4dGVuZGVka2V5VXNhZ2UudHlwZS4iLCAiXHVDNTRDIFx1QzIxOCBcdUM1QzZcdUIyOTQgZXh0ZW5kZWRrZXlVc2FnZSBcdUM3MjBcdUQ2MTU6ICJ9LAotICAgICAgICB7IlVua25vd24uQWNjZXNzRGVzY3JpcHRpb24udHlwZS4iLCAiXHVDNTRDIFx1QzIxOCBcdUM1QzZcdUIyOTQgQWNjZXNzRGVzY3JpcHRpb24gXHVDNzIwXHVENjE1OiAifSwKLSAgICAgICAgeyJVbnJlY29nbml6ZWQuR2VuZXJhbE5hbWUudHlwZS4iLCAiXHVDNTRDIFx1QzIxOCBcdUM1QzZcdUIyOTQgR2VuZXJhbE5hbWUgXHVDNzIwXHVENjE1OiAifSwKLSAgICAgICAgeyJUaGlzLmV4dGVuc2lvbi5jYW5ub3QuYmUubWFya2VkLmFzLmNyaXRpY2FsLiIsCi0gICAgICAgICAgICAgICAgICJcdUM3NzQgXHVENjU1XHVDN0E1XHVDNzQwIFx1QzkxMVx1QzY5NFx1RDU1QyBcdUFDODNcdUM3M0NcdUI4NUMgXHVENDVDXHVDMkRDXHVENTYwIFx1QzIxOCBcdUM1QzZcdUMyQjVcdUIyQzhcdUIyRTQuICJ9LAotICAgICAgICB7Ik9kZC5udW1iZXIub2YuaGV4LmRpZ2l0cy5mb3VuZC4iLCAiXHVENjQwXHVDMjE4IFx1QUMxQ1x1Qzc1OCAxNlx1QzlDNFx1QzIxOFx1QUMwMCBcdUJDMUNcdUFDQUNcdUI0Mjg6ICJ9LAotICAgICAgICB7IlVua25vd24uZXh0ZW5zaW9uLnR5cGUuIiwgIlx1QzU0QyBcdUMyMTggXHVDNUM2XHVCMjk0IFx1RDY1NVx1QzdBNSBcdUM3MjBcdUQ2MTU6ICJ9LAotICAgICAgICB7ImNvbW1hbmQuezB9LmlzLmFtYmlndW91cy4iLCAiezB9IFx1QkE4NVx1QjgzOVx1Qzc3NCBcdUJBQThcdUQ2MzhcdUQ1Njg6In0sCi0KLSAgICAgICAgLy8gcG9saWN5dG9vbAotICAgICAgICB7Ildhcm5pbmcuQS5wdWJsaWMua2V5LmZvci5hbGlhcy5zaWduZXJzLmkuZG9lcy5ub3QuZXhpc3QuTWFrZS5zdXJlLmEuS2V5U3RvcmUuaXMucHJvcGVybHkuY29uZmlndXJlZC4iLAotICAgICAgICAgICAgICAgICJcdUFDQkRcdUFDRTA6IHswfSBcdUJDQzRcdUNFNkRcdUM1RDAgXHVCMzAwXHVENTVDIFx1QUNGNVx1QzZBOSBcdUQwQTRcdUFDMDAgXHVDODc0XHVDN0FDXHVENTU4XHVDOUMwIFx1QzU0QVx1QzJCNVx1QjJDOFx1QjJFNC4gXHVEMEE0IFx1QzgwMFx1QzdBNVx1QzE4Q1x1QUMwMCBcdUM4MUNcdUIzMDBcdUI4NUMgXHVBRDZDXHVDMTMxXHVCNDE4XHVDNUI0IFx1Qzc4OFx1QjI5NFx1QzlDMCBcdUQ2NTVcdUM3NzhcdUQ1NThcdUMyRURcdUMyRENcdUM2MjQuIn0sCi0gICAgICAgIHsiV2FybmluZy5DbGFzcy5ub3QuZm91bmQuY2xhc3MiLCAiXHVBQ0JEXHVBQ0UwOiBcdUQwNzRcdUI3OThcdUMyQTRcdUI5N0MgXHVDQzNFXHVDNzQ0IFx1QzIxOCBcdUM1QzZcdUM3NEM6IHswfSJ9LAotICAgICAgICB7Ildhcm5pbmcuSW52YWxpZC5hcmd1bWVudC5zLmZvci5jb25zdHJ1Y3Rvci5hcmciLAotICAgICAgICAgICAgICAgICJcdUFDQkRcdUFDRTA6IFx1QzBERFx1QzEzMVx1Qzc5MFx1QzVEMCBcdUIzMDBcdUQ1NzQgXHVCRDgwXHVDODAxXHVENTY5XHVENTVDIFx1Qzc3OFx1QzIxODogezB9In0sCi0gICAgICAgIHsiSWxsZWdhbC5QcmluY2lwYWwuVHlwZS50eXBlIiwgIlx1Qzc5OFx1QkFCQlx1QjQxQyBcdUM4RkNcdUNDQjQgXHVDNzIwXHVENjE1OiB7MH0ifSwKLSAgICAgICAgeyJJbGxlZ2FsLm9wdGlvbi5vcHRpb24iLCAiXHVDNzk4XHVCQUJCXHVCNDFDIFx1QzYzNVx1QzE1ODogezB9In0sCi0gICAgICAgIHsiVXNhZ2UucG9saWN5dG9vbC5vcHRpb25zLiIsICJcdUMwQUNcdUM2QTlcdUJDOTU6IHBvbGljeXRvb2wgW29wdGlvbnNdIn0sCi0gICAgICAgIHsiLmZpbGUuZmlsZS5wb2xpY3kuZmlsZS5sb2NhdGlvbiIsCi0gICAgICAgICAgICAgICAgIiAgWy1maWxlIDxmaWxlPl0gICAgXHVDODE1XHVDQzQ1IFx1RDMwQ1x1Qzc3QyBcdUM3MDRcdUNFNTgifSwKLSAgICAgICAgeyJOZXciLCAiXHVDMEM4XHVCODVDIFx1QjlDQ1x1QjRFNFx1QUUzMCJ9LAotICAgICAgICB7Ik9wZW4iLCAiXHVDNUY0XHVBRTMwIn0sCi0gICAgICAgIHsiU2F2ZSIsICJcdUM4MDBcdUM3QTUifSwKLSAgICAgICAgeyJTYXZlLkFzIiwgIlx1QjJFNFx1Qjk3OCBcdUM3NzRcdUI5ODRcdUM3M0NcdUI4NUMgXHVDODAwXHVDN0E1In0sCi0gICAgICAgIHsiVmlldy5XYXJuaW5nLkxvZyIsICJcdUFDQkRcdUFDRTAgXHVCODVDXHVBREY4IFx1QkNGNFx1QUUzMCJ9LAotICAgICAgICB7IkV4aXQiLCAiXHVDODg1XHVCOENDIn0sCi0gICAgICAgIHsiQWRkLlBvbGljeS5FbnRyeSIsICJcdUM4MTVcdUNDNDUgXHVENTZEXHVCQUE5IFx1Q0Q5NFx1QUMwMCJ9LAotICAgICAgICB7IkVkaXQuUG9saWN5LkVudHJ5IiwgIlx1QzgxNVx1Q0M0NSBcdUQ1NkRcdUJBQTkgXHVEM0I4XHVDOUQxIn0sCi0gICAgICAgIHsiUmVtb3ZlLlBvbGljeS5FbnRyeSIsICJcdUM4MTVcdUNDNDUgXHVENTZEXHVCQUE5IFx1QzgxQ1x1QUM3MCJ9LAotICAgICAgICB7IkVkaXQiLCAiXHVEM0I4XHVDOUQxIn0sCi0gICAgICAgIHsiUmV0YWluIiwgIlx1QzcyMFx1QzlDMCJ9LAotCi0gICAgICAgIHsiV2FybmluZy5GaWxlLm5hbWUubWF5LmluY2x1ZGUuZXNjYXBlZC5iYWNrc2xhc2guY2hhcmFjdGVycy5JdC5pcy5ub3QubmVjZXNzYXJ5LnRvLmVzY2FwZS5iYWNrc2xhc2guY2hhcmFjdGVycy50aGUudG9vbC5lc2NhcGVzIiwKLSAgICAgICAgICAgICJcdUFDQkRcdUFDRTA6IFx1RDMwQ1x1Qzc3QyBcdUM3NzRcdUI5ODRcdUM1RDAgXHVDNzc0XHVDMkE0XHVDRjAwXHVDNzc0XHVENTA0XHVCNDFDIFx1QkMzMVx1QzJBQ1x1Qjc5OFx1QzJEQyBcdUJCMzhcdUM3OTBcdUFDMDAgXHVEM0VDXHVENTY4XHVCNDE4XHVDNUM4XHVDNzQ0IFx1QzIxOCBcdUM3ODhcdUMyQjVcdUIyQzhcdUIyRTQuIFx1QkMzMVx1QzJBQ1x1Qjc5OFx1QzJEQyBcdUJCMzhcdUM3OTBcdUIyOTQgXHVDNzc0XHVDMkE0XHVDRjAwXHVDNzc0XHVENTA0XHVENTYwIFx1RDU0NFx1QzY5NFx1QUMwMCBcdUM1QzZcdUMyQjVcdUIyQzhcdUIyRTQuIFx1QzYwMVx1QUQ2QyBcdUM4MDBcdUM3QTVcdUMxOENcdUM1RDAgXHVDODE1XHVDQzQ1IFx1Q0Y1OFx1RDE1MFx1Q0UyMFx1Qjk3QyBcdUM0RjggXHVCNTRDIFx1RDU0NFx1QzY5NFx1QzVEMCBcdUI1MzBcdUI3N0MgXHVDNzkwXHVCM0Q5XHVDNzNDXHVCODVDIFx1QkIzOFx1Qzc5MFx1QUMwMCBcdUM3NzRcdUMyQTRcdUNGMDBcdUM3NzRcdUQ1MDRcdUI0MjlcdUIyQzhcdUIyRTQuXG5cblx1Qzc4NVx1QjgyNVx1QjQxQyBcdUM3NzRcdUI5ODRcdUM3NDQgXHVBREY4XHVCMzAwXHVCODVDIFx1QzcyMFx1QzlDMFx1RDU1OFx1QjgyNFx1QkE3NCBbXHVDNzIwXHVDOUMwXVx1Qjk3QyBcdUIyMDRcdUI5NzRcdUFDRTAsIFx1Qzc3NFx1Qjk4NFx1Qzc0NCBcdUQzQjhcdUM5RDFcdUQ1NThcdUI4MjRcdUJBNzQgW1x1RDNCOFx1QzlEMV1cdUM3NDQgXHVCMjA0XHVCOTc0XHVDMkVEXHVDMkRDXHVDNjI0LiJ9LAotCi0gICAgICAgIHsiQWRkLlB1YmxpYy5LZXkuQWxpYXMiLCAiXHVBQ0Y1XHVDNkE5IFx1RDBBNCBcdUJDQzRcdUNFNkQgXHVDRDk0XHVBQzAwIn0sCi0gICAgICAgIHsiUmVtb3ZlLlB1YmxpYy5LZXkuQWxpYXMiLCAiXHVBQ0Y1XHVDNkE5IFx1RDBBNCBcdUJDQzRcdUNFNkQgXHVDODFDXHVBQzcwIn0sCi0gICAgICAgIHsiRmlsZSIsICJcdUQzMENcdUM3N0MifSwKLSAgICAgICAgeyJLZXlTdG9yZSIsICJcdUQwQTQgXHVDODAwXHVDN0E1XHVDMThDIn0sCi0gICAgICAgIHsiUG9saWN5LkZpbGUuIiwgIlx1QzgxNVx1Q0M0NSBcdUQzMENcdUM3N0M6In0sCi0gICAgICAgIHsiQ291bGQubm90Lm9wZW4ucG9saWN5LmZpbGUucG9saWN5RmlsZS5lLnRvU3RyaW5nLiIsCi0gICAgICAgICAgICAgICAgIlx1QzgxNVx1Q0M0NSBcdUQzMENcdUM3N0NcdUM3NDQgXHVDNUY0IFx1QzIxOCBcdUM1QzZcdUM3NEM6IHswfTogezF9In0sCi0gICAgICAgIHsiUG9saWN5LlRvb2wiLCAiXHVDODE1XHVDQzQ1IFx1RDIzNCJ9LAotICAgICAgICB7IkVycm9ycy5oYXZlLm9jY3VycmVkLndoaWxlLm9wZW5pbmcudGhlLnBvbGljeS5jb25maWd1cmF0aW9uLlZpZXcudGhlLldhcm5pbmcuTG9nLmZvci5tb3JlLmluZm9ybWF0aW9uLiIsCi0gICAgICAgICAgICAgICAgIlx1QzgxNVx1Q0M0NSBcdUFENkNcdUMxMzFcdUM3NDQgXHVDNUVDXHVCMjk0IFx1QzkxMSBcdUM2MjRcdUI5NThcdUFDMDAgXHVCQzFDXHVDMEREXHVENTg4XHVDMkI1XHVCMkM4XHVCMkU0LiBcdUM3OTBcdUMxMzhcdUQ1NUMgXHVCMEI0XHVDNkE5XHVDNzQwIFx1QUNCRFx1QUNFMCBcdUI4NUNcdUFERjhcdUI5N0MgXHVENjU1XHVDNzc4XHVENTU4XHVDMkVEXHVDMkRDXHVDNjI0LiJ9LAotICAgICAgICB7IkVycm9yIiwgIlx1QzYyNFx1Qjk1OCJ9LAotICAgICAgICB7Ik9LIiwgIlx1RDY1NVx1Qzc3OCJ9LAotICAgICAgICB7IlN0YXR1cyIsICJcdUMwQzFcdUQwREMifSwKLSAgICAgICAgeyJXYXJuaW5nIiwgIlx1QUNCRFx1QUNFMCJ9LAotICAgICAgICB7IlBlcm1pc3Npb24uIiwKLSAgICAgICAgICAgICAgICAiXHVBRDhDXHVENTVDOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifSwKLSAgICAgICAgeyJQcmluY2lwYWwuVHlwZS4iLCAiXHVDOEZDXHVDQ0I0IFx1QzcyMFx1RDYxNToifSwKLSAgICAgICAgeyJQcmluY2lwYWwuTmFtZS4iLCAiXHVDOEZDXHVDQ0I0IFx1Qzc3NFx1Qjk4NDoifSwKLSAgICAgICAgeyJUYXJnZXQuTmFtZS4iLAotICAgICAgICAgICAgICAgICJcdUIzMDBcdUMwQzEgXHVDNzc0XHVCOTg0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifSwKLSAgICAgICAgeyJBY3Rpb25zLiIsCi0gICAgICAgICAgICAgICAgIlx1Qzc5MVx1QzVDNTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIn0sCi0gICAgICAgIHsiT0sudG8ub3ZlcndyaXRlLmV4aXN0aW5nLmZpbGUuZmlsZW5hbWUuIiwKLSAgICAgICAgICAgICAgICAiXHVBRTMwXHVDODc0IFx1RDMwQ1x1Qzc3QyB7MH1cdUM3NDQoXHVCOTdDKSBcdUFDQjlcdUNDRDAgXHVDNEYwXHVBQ0EwXHVDMkI1XHVCMkM4XHVBRTRDPyJ9LAotICAgICAgICB7IkNhbmNlbCIsICJcdUNERThcdUMxOEMifSwKLSAgICAgICAgeyJDb2RlQmFzZS4iLCAiQ29kZUJhc2U6In0sCi0gICAgICAgIHsiU2lnbmVkQnkuIiwgIlNpZ25lZEJ5OiJ9LAotICAgICAgICB7IkFkZC5QcmluY2lwYWwiLCAiXHVDOEZDXHVDQ0I0IFx1Q0Q5NFx1QUMwMCJ9LAotICAgICAgICB7IkVkaXQuUHJpbmNpcGFsIiwgIlx1QzhGQ1x1Q0NCNCBcdUQzQjhcdUM5RDEifSwKLSAgICAgICAgeyJSZW1vdmUuUHJpbmNpcGFsIiwgIlx1QzhGQ1x1Q0NCNCBcdUM4MUNcdUFDNzAifSwKLSAgICAgICAgeyJQcmluY2lwYWxzLiIsICJcdUM4RkNcdUNDQjQ6In0sCi0gICAgICAgIHsiLkFkZC5QZXJtaXNzaW9uIiwgIiAgXHVBRDhDXHVENTVDIFx1Q0Q5NFx1QUMwMCJ9LAotICAgICAgICB7Ii5FZGl0LlBlcm1pc3Npb24iLCAiICBcdUFEOENcdUQ1NUMgXHVEM0I4XHVDOUQxIn0sCi0gICAgICAgIHsiUmVtb3ZlLlBlcm1pc3Npb24iLCAiXHVBRDhDXHVENTVDIFx1QzgxQ1x1QUM3MCJ9LAotICAgICAgICB7IkRvbmUiLCAiXHVDNjQ0XHVCOENDIn0sCi0gICAgICAgIHsiS2V5U3RvcmUuVVJMLiIsICJcdUQwQTQgXHVDODAwXHVDN0E1XHVDMThDIFVSTDoifSwKLSAgICAgICAgeyJLZXlTdG9yZS5UeXBlLiIsICJcdUQwQTQgXHVDODAwXHVDN0E1XHVDMThDIFx1QzcyMFx1RDYxNToifSwKLSAgICAgICAgeyJLZXlTdG9yZS5Qcm92aWRlci4iLCAiXHVEMEE0IFx1QzgwMFx1QzdBNVx1QzE4QyBcdUM4MUNcdUFDRjVcdUM3OTA6In0sCi0gICAgICAgIHsiS2V5U3RvcmUuUGFzc3dvcmQuVVJMLiIsICJcdUQwQTQgXHVDODAwXHVDN0E1XHVDMThDIFx1QkU0NFx1QkMwMFx1QkM4OFx1RDYzOCBVUkw6In0sCi0gICAgICAgIHsiUHJpbmNpcGFscyIsICJcdUM4RkNcdUNDQjQifSwKLSAgICAgICAgeyIuRWRpdC5QcmluY2lwYWwuIiwgIiAgXHVDOEZDXHVDQ0I0IFx1RDNCOFx1QzlEMToifSwKLSAgICAgICAgeyIuQWRkLk5ldy5QcmluY2lwYWwuIiwgIiAgXHVDMEM4IFx1QzhGQ1x1Q0NCNCBcdUNEOTRcdUFDMDA6In0sCi0gICAgICAgIHsiUGVybWlzc2lvbnMiLCAiXHVBRDhDXHVENTVDIn0sCi0gICAgICAgIHsiLkVkaXQuUGVybWlzc2lvbi4iLCAiICBcdUFEOENcdUQ1NUMgXHVEM0I4XHVDOUQxOiJ9LAotICAgICAgICB7Ii5BZGQuTmV3LlBlcm1pc3Npb24uIiwgIiAgXHVDMEM4IFx1QUQ4Q1x1RDU1QyBcdUNEOTRcdUFDMDA6In0sCi0gICAgICAgIHsiU2lnbmVkLkJ5LiIsICJcdUMxMUNcdUJBODVcdUM3OTA6In0sCi0gICAgICAgIHsiQ2Fubm90LlNwZWNpZnkuUHJpbmNpcGFsLndpdGguYS5XaWxkY2FyZC5DbGFzcy53aXRob3V0LmEuV2lsZGNhcmQuTmFtZSIsCi0gICAgICAgICAgICAiXHVDNjQwXHVDNzdDXHVCNERDIFx1Q0U3NFx1QjREQyBcdUJCMzhcdUM3OTAgXHVDNzc0XHVCOTg0IFx1QzVDNlx1Qzc3NCBcdUM2NDBcdUM3N0NcdUI0REMgXHVDRTc0XHVCNERDIFx1QkIzOFx1Qzc5MCBcdUQwNzRcdUI3OThcdUMyQTRcdUI5N0MgXHVDMEFDXHVDNkE5XHVENTU4XHVCMjk0IFx1QzhGQ1x1Q0NCNFx1Qjk3QyBcdUM5QzBcdUM4MTVcdUQ1NjAgXHVDMjE4IFx1QzVDNlx1QzJCNVx1QjJDOFx1QjJFNC4ifSwKLSAgICAgICAgeyJDYW5ub3QuU3BlY2lmeS5QcmluY2lwYWwud2l0aG91dC5hLk5hbWUiLAotICAgICAgICAgICAgIlx1Qzc3NFx1Qjk4NCBcdUM1QzZcdUM3NzQgXHVDOEZDXHVDQ0I0XHVCOTdDIFx1QzlDMFx1QzgxNVx1RDU2MCBcdUMyMTggXHVDNUM2XHVDMkI1XHVCMkM4XHVCMkU0LiJ9LAotICAgICAgICB7IlBlcm1pc3Npb24uYW5kLlRhcmdldC5OYW1lLm11c3QuaGF2ZS5hLnZhbHVlIiwKLSAgICAgICAgICAgICAgICAiXHVBRDhDXHVENTVDXHVBQ0ZDIFx1QjMwMFx1QzBDMSBcdUM3NzRcdUI5ODRcdUM3NTggXHVBQzEyXHVDNzc0IFx1Qzc4OFx1QzVCNFx1QzU3QyBcdUQ1NjlcdUIyQzhcdUIyRTQuIn0sCi0gICAgICAgIHsiUmVtb3ZlLnRoaXMuUG9saWN5LkVudHJ5LiIsICJcdUM3NzQgXHVDODE1XHVDQzQ1IFx1RDU2RFx1QkFBOVx1Qzc0NCBcdUM4MUNcdUFDNzBcdUQ1NThcdUFDQTBcdUMyQjVcdUIyQzhcdUFFNEM/In0sCi0gICAgICAgIHsiT3ZlcndyaXRlLkZpbGUiLCAiXHVEMzBDXHVDNzdDIFx1QUNCOVx1Q0NEMFx1QzRGMFx1QUUzMCJ9LAotICAgICAgICB7IlBvbGljeS5zdWNjZXNzZnVsbHkud3JpdHRlbi50by5maWxlbmFtZSIsCi0gICAgICAgICAgICAgICAgInswfVx1QzVEMCBcdUMxMzFcdUFDRjVcdUM4MDFcdUM3M0NcdUI4NUMgXHVDODE1XHVDQzQ1XHVDNzQ0IFx1QzM3Q1x1QzJCNVx1QjJDOFx1QjJFNC4ifSwKLSAgICAgICAgeyJudWxsLmZpbGVuYW1lIiwgIlx1QjExMCBcdUQzMENcdUM3N0MgXHVDNzc0XHVCOTg0In0sCi0gICAgICAgIHsiU2F2ZS5jaGFuZ2VzLiIsICJcdUJDQzBcdUFDQkQgXHVDMEFDXHVENTZEXHVDNzQ0IFx1QzgwMFx1QzdBNVx1RDU1OFx1QUNBMFx1QzJCNVx1QjJDOFx1QUU0Qz8ifSwKLSAgICAgICAgeyJZZXMiLCAiXHVDNjA4In0sCi0gICAgICAgIHsiTm8iLCAiXHVDNTQ0XHVCMkM4XHVDNjI0In0sCi0gICAgICAgIHsiUG9saWN5LkVudHJ5IiwgIlx1QzgxNVx1Q0M0NSBcdUQ1NkRcdUJBQTkifSwKLSAgICAgICAgeyJTYXZlLkNoYW5nZXMiLCAiXHVCQ0MwXHVBQ0JEIFx1QzBBQ1x1RDU2RCBcdUM4MDBcdUM3QTUifSwKLSAgICAgICAgeyJOby5Qb2xpY3kuRW50cnkuc2VsZWN0ZWQiLCAiXHVDMTIwXHVEMEREXHVCNDFDIFx1QzgxNVx1Q0M0NSBcdUQ1NkRcdUJBQTlcdUM3NzQgXHVDNUM2XHVDMkI1XHVCMkM4XHVCMkU0LiJ9LAotICAgICAgICB7IlVuYWJsZS50by5vcGVuLktleVN0b3JlLmV4LnRvU3RyaW5nLiIsCi0gICAgICAgICAgICAgICAgIlx1RDBBNCBcdUM4MDBcdUM3QTVcdUMxOENcdUI5N0MgXHVDNUY0IFx1QzIxOCBcdUM1QzZcdUM3NEM6IHswfSJ9LAotICAgICAgICB7Ik5vLnByaW5jaXBhbC5zZWxlY3RlZCIsICJcdUMxMjBcdUQwRERcdUI0MUMgXHVDOEZDXHVDQ0I0XHVBQzAwIFx1QzVDNlx1QzJCNVx1QjJDOFx1QjJFNC4ifSwKLSAgICAgICAgeyJOby5wZXJtaXNzaW9uLnNlbGVjdGVkIiwgIlx1QzEyMFx1RDBERFx1QjQxQyBcdUFEOENcdUQ1NUNcdUM3NzQgXHVDNUM2XHVDMkI1XHVCMkM4XHVCMkU0LiJ9LAotICAgICAgICB7Im5hbWUiLCAiXHVDNzc0XHVCOTg0In0sCi0gICAgICAgIHsiY29uZmlndXJhdGlvbi50eXBlIiwgIlx1QUQ2Q1x1QzEzMSBcdUM3MjBcdUQ2MTUifSwKLSAgICAgICAgeyJlbnZpcm9ubWVudC52YXJpYWJsZS5uYW1lIiwgIlx1RDY1OFx1QUNCRCBcdUJDQzBcdUMyMTggXHVDNzc0XHVCOTg0In0sCi0gICAgICAgIHsibGlicmFyeS5uYW1lIiwgIlx1Qjc3Q1x1Qzc3NFx1QkUwQ1x1QjdFQ1x1QjlBQyBcdUM3NzRcdUI5ODQifSwKLSAgICAgICAgeyJwYWNrYWdlLm5hbWUiLCAiXHVEMzI4XHVEMEE0XHVDOUMwIFx1Qzc3NFx1Qjk4NCJ9LAotICAgICAgICB7InBvbGljeS50eXBlIiwgIlx1QzgxNVx1Q0M0NSBcdUM3MjBcdUQ2MTUifSwKLSAgICAgICAgeyJwcm9wZXJ0eS5uYW1lIiwgIlx1QzE4RFx1QzEzMSBcdUM3NzRcdUI5ODQifSwKLSAgICAgICAgeyJQcmluY2lwYWwuTGlzdCIsICJcdUM4RkNcdUNDQjQgXHVCQUE5XHVCODVEIn0sCi0gICAgICAgIHsiUGVybWlzc2lvbi5MaXN0IiwgIlx1QUQ4Q1x1RDU1QyBcdUJBQTlcdUI4NUQifSwKLSAgICAgICAgeyJDb2RlLkJhc2UiLCAiXHVDRjU0XHVCNERDIFx1QkNBMFx1Qzc3NFx1QzJBNCJ9LAotICAgICAgICB7IktleVN0b3JlLlUuUi5MLiIsICJcdUQwQTQgXHVDODAwXHVDN0E1XHVDMThDIFVSTDoifSwKLSAgICAgICAgeyJLZXlTdG9yZS5QYXNzd29yZC5VLlIuTC4iLCAiXHVEMEE0IFx1QzgwMFx1QzdBNVx1QzE4QyBcdUJFNDRcdUJDMDBcdUJDODhcdUQ2MzggVVJMOiJ9LAotCi0KICAgICAgICAgLy8gamF2YXguc2VjdXJpdHkuYXV0aC5Qcml2YXRlQ3JlZGVudGlhbFBlcm1pc3Npb24KICAgICAgICAgeyJpbnZhbGlkLm51bGwuaW5wdXQucy4iLCAiXHVCMTEwIFx1Qzc4NVx1QjgyNVx1QUMxMlx1Qzc3NCBcdUJEODBcdUM4MDFcdUQ1NjlcdUQ1NjlcdUIyQzhcdUIyRTQuIn0sCiAgICAgICAgIHsiYWN0aW9ucy5jYW4ub25seS5iZS5yZWFkLiIsICJcdUM3OTFcdUM1QzVcdUM3NDAgJ1x1Qzc3RFx1QUUzMCcgXHVDODA0XHVDNkE5XHVDNzg1XHVCMkM4XHVCMkU0LiJ9LApAQCAtNTUzLDYgKzU4LDcgQEAKICAgICAgICAgeyJwcm92aWRlZC5udWxsLk9JRC5tYXAiLCAiXHVCMTEwIE9JRCBcdUI5RjVcdUM3NDQgXHVDODFDXHVBQ0Y1XHVENTg4XHVDMkI1XHVCMkM4XHVCMkU0LiJ9LAogCiAgICAgICAgIC8vIGphdmF4LnNlY3VyaXR5LmF1dGguU3ViamVjdAorICAgICAgICB7Ik5FV0xJTkUiLCAiXG4ifSwKICAgICAgICAgeyJpbnZhbGlkLm51bGwuQWNjZXNzQ29udHJvbENvbnRleHQucHJvdmlkZWQiLAogICAgICAgICAgICAgICAgICJcdUJEODBcdUM4MDFcdUQ1NjlcdUQ1NUMgXHVCMTEwIEFjY2Vzc0NvbnRyb2xDb250ZXh0XHVBQzAwIFx1QzgxQ1x1QUNGNVx1QjQxOFx1QzVDOFx1QzJCNVx1QjJDOFx1QjJFNC4ifSwKICAgICAgICAgeyJpbnZhbGlkLm51bGwuYWN0aW9uLnByb3ZpZGVkIiwgIlx1QkQ4MFx1QzgwMVx1RDU2OVx1RDU1QyBcdUIxMTAgXHVDNzkxXHVDNUM1XHVDNzc0IFx1QzgxQ1x1QUNGNVx1QjQxOFx1QzVDOFx1QzJCNVx1QjJDOFx1QjJFNC4ifSwKQEAgLTY1Niw2ICsxNjIsNyBAQAogICAgICAqCiAgICAgICogQHJldHVybiB0aGUgY29udGVudHMgb2YgdGhpcyA8Y29kZT5SZXNvdXJjZUJ1bmRsZTwvY29kZT4uCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIE9iamVjdFtdW10gZ2V0Q29udGVudHMoKSB7CiAgICAgICAgIHJldHVybiBjb250ZW50czsKICAgICB9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3V0aWwvUmVzb3VyY2VzX3B0X0JSLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3V0aWwvUmVzb3VyY2VzX3B0X0JSLmphdmEKaW5kZXggNjk4ODI3Zi4uMzE3YTFjYiAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS91dGlsL1Jlc291cmNlc19wdF9CUi5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdXRpbC9SZXNvdXJjZXNfcHRfQlIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTM0LDUwMSArMzQsNiBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W11bXSBjb250ZW50cyA9IHsKIAotICAgICAgICAvLyBzaGFyZWQgKGZyb20gamFyc2lnbmVyKQotICAgICAgICB7IlNQQUNFIiwgIiAifSwKLSAgICAgICAgeyIyU1BBQ0UiLCAiICAifSwKLSAgICAgICAgeyI2U1BBQ0UiLCAiICAgICAgIn0sCi0gICAgICAgIHsiQ09NTUEiLCAiLCAifSwKLSAgICAgICAgLy8gc2hhcmVkIChmcm9tIGtleXRvb2wpCi0gICAgICAgIHsiTkVXTElORSIsICJcbiJ9LAotICAgICAgICB7IlNUQVIiLAotICAgICAgICAgICAgICAgICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIn0sCi0gICAgICAgIHsiU1RBUk5OIiwKLSAgICAgICAgICAgICAgICAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG4ifSwKLQotICAgICAgICAvLyBrZXl0b29sOiBIZWxwIHBhcnQKLS8vICJPcHRpb24iIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotICAgICAgICB7Ii5PUFRJT04uIiwgIiBbT3BcdTAwRTdcdTAwRTNvXS4uLiJ9LAotICAgICAgICB7Ik9wdGlvbnMuIiwgIk9wXHUwMEU3XHUwMEY1ZXM6In0sCi0gICAgICAgIHsiVXNlLmtleXRvb2wuaGVscC5mb3IuYWxsLmF2YWlsYWJsZS5jb21tYW5kcyIsCi0gICAgICAgICAgICAgICAgICJVc2UgXCJrZXl0b29sIC1oZWxwXCIgcGFyYSB0b2RvcyBvcyBjb21hbmRvcyBkaXNwb25cdTAwRUR2ZWlzIn0sCi0gICAgICAgIHsiS2V5LmFuZC5DZXJ0aWZpY2F0ZS5NYW5hZ2VtZW50LlRvb2wiLAotICAgICAgICAgICAgICAgICAiRmVycmFtZW50YSBkZSBHZXJlbmNpYW1lbnRvIGRlIENoYXZlIGUgQ2VydGlmaWNhZG8ifSwKLSAgICAgICAgeyJDb21tYW5kcy4iLCAiQ29tYW5kb3M6In0sCi0gICAgICAgIHsiVXNlLmtleXRvb2wuY29tbWFuZC5uYW1lLmhlbHAuZm9yLnVzYWdlLm9mLmNvbW1hbmQubmFtZSIsCi0gICAgICAgICAgICAgICAgIlVzZSBcImtleXRvb2wgLWNvbW1hbmRfbmFtZSAtaGVscFwiIHBhcmEgdXNvIGRlIGNvbW1hbmRfbmFtZSJ9LAotICAgICAgICAvLyBrZXl0b29sOiBoZWxwOiBjb21tYW5kcwotICAgICAgICB7IkdlbmVyYXRlcy5hLmNlcnRpZmljYXRlLnJlcXVlc3QiLAotICAgICAgICAgICAgICAgICJHZXJhIHVtYSBzb2xpY2l0YVx1MDBFN1x1MDBFM28gZGUgY2VydGlmaWNhZG8ifSwgLy8tY2VydHJlcQotICAgICAgICB7IkNoYW5nZXMuYW4uZW50cnkucy5hbGlhcyIsCi0gICAgICAgICAgICAgICAgIkFsdGVyYSB1bSBhbGlhcyBkZSBlbnRyYWRhIn0sIC8vLWNoYW5nZWFsaWFzCi0gICAgICAgIHsiRGVsZXRlcy5hbi5lbnRyeSIsCi0gICAgICAgICAgICAgICAgIkRlbGV0YSB1bWEgZW50cmFkYSJ9LCAvLy1kZWxldGUKLSAgICAgICAgeyJFeHBvcnRzLmNlcnRpZmljYXRlIiwKLSAgICAgICAgICAgICAgICAiRXhwb3J0YSBvIGNlcnRpZmljYWRvIn0sIC8vLWV4cG9ydGNlcnQKLSAgICAgICAgeyJHZW5lcmF0ZXMuYS5rZXkucGFpciIsCi0gICAgICAgICAgICAgICAgIkdlcmEgdW0gcGFyIGRlIGNoYXZlcyJ9LCAvLy1nZW5rZXlwYWlyCi0vLyB0cmFuc2xhdGlvbiBvZiAic2VjcmV0IiBrZXkgc2hvdWxkIGJlIGRpZmZlcmVudCB0byAicHJpdmF0ZSIga2V5LgotICAgICAgICB7IkdlbmVyYXRlcy5hLnNlY3JldC5rZXkiLAotICAgICAgICAgICAgICAgICJHZXJhIHVtYSBjaGF2ZSBTZWNyZXRhIn0sIC8vLWdlbnNlY2tleQotICAgICAgICB7IkdlbmVyYXRlcy5jZXJ0aWZpY2F0ZS5mcm9tLmEuY2VydGlmaWNhdGUucmVxdWVzdCIsCi0gICAgICAgICAgICAgICAgIkdlcmEgdW0gY2VydGlmaWNhZG8gZGUgdW1hIHNvbGljaXRhXHUwMEU3XHUwMEUzbyBkZSBjZXJ0aWZpY2FkbyJ9LCAvLy1nZW5jZXJ0Ci0gICAgICAgIHsiR2VuZXJhdGVzLkNSTCIsICJHZXJhIENSTCJ9LCAvLy1nZW5jcmwKLSAgICAgICAgeyJJbXBvcnRzLmVudHJpZXMuZnJvbS5hLkpESy4xLjEueC5zdHlsZS5pZGVudGl0eS5kYXRhYmFzZSIsCi0gICAgICAgICAgICAgICAgIkltcG9ydGEgZW50cmFkYXMgZGUgdW0gYmFuY28gZGUgZGFkb3MgZGUgaWRlbnRpZGFkZSBKREsgMS4xLngtc3R5bGUifSwgLy8taWRlbnRpdHlkYgotICAgICAgICB7IkltcG9ydHMuYS5jZXJ0aWZpY2F0ZS5vci5hLmNlcnRpZmljYXRlLmNoYWluIiwKLSAgICAgICAgICAgICAgICAiSW1wb3J0YSB1bSBjZXJ0aWZpY2FkbyBvdSB1bWEgY2FkZWlhIGRlIGNlcnRpZmljYWRvcyJ9LCAvLy1pbXBvcnRjZXJ0Ci0gICAgICAgIHsiSW1wb3J0cy5vbmUub3IuYWxsLmVudHJpZXMuZnJvbS5hbm90aGVyLmtleXN0b3JlIiwKLSAgICAgICAgICAgICAgICAiSW1wb3J0YSB1bWEgb3UgdG9kYXMgYXMgZW50cmFkYXMgZGUgb3V0cmEgXHUwMEUxcmVhIGRlIGFybWF6ZW5hbWVudG8gZGUgY2hhdmVzIn0sIC8vLWltcG9ydGtleXN0b3JlCi0gICAgICAgIHsiQ2xvbmVzLmEua2V5LmVudHJ5IiwKLSAgICAgICAgICAgICAgICAiQ2xvbmEgdW1hIGVudHJhZGEgZGUgY2hhdmUifSwgLy8ta2V5Y2xvbmUKLSAgICAgICAgeyJDaGFuZ2VzLnRoZS5rZXkucGFzc3dvcmQub2YuYW4uZW50cnkiLAotICAgICAgICAgICAgICAgICJBbHRlcmEgYSBzZW5oYSBkYSBjaGF2ZSBkZSB1bWEgZW50cmFkYSJ9LCAvLy1rZXlwYXNzd2QKLSAgICAgICAgeyJMaXN0cy5lbnRyaWVzLmluLmEua2V5c3RvcmUiLAotICAgICAgICAgICAgICAgICJMaXN0YSBlbnRyYWRhcyBlbSB1bWEgXHUwMEUxcmVhIGRlIGFybWF6ZW5hbWVudG8gZGUgY2hhdmVzIn0sIC8vLWxpc3QKLSAgICAgICAgeyJQcmludHMudGhlLmNvbnRlbnQub2YuYS5jZXJ0aWZpY2F0ZSIsCi0gICAgICAgICAgICAgICAgIkltcHJpbWUgbyBjb250ZVx1MDBGQWRvIGRlIHVtIGNlcnRpZmljYWRvIn0sIC8vLXByaW50Y2VydAotICAgICAgICB7IlByaW50cy50aGUuY29udGVudC5vZi5hLmNlcnRpZmljYXRlLnJlcXVlc3QiLAotICAgICAgICAgICAgICAgICJJbXByaW1lIG8gY29udGVcdTAwRkFkbyBkZSB1bWEgc29saWNpdGFcdTAwRTdcdTAwRTNvIGRlIGNlcnRpZmljYWRvIn0sIC8vLXByaW50Y2VydHJlcQotICAgICAgICB7IlByaW50cy50aGUuY29udGVudC5vZi5hLkNSTC5maWxlIiwKLSAgICAgICAgICAgICAgICAiSW1wcmltZSBvIGNvbnRlXHUwMEZBZG8gZGUgdW0gYXJxdWl2byBDUkwifSwgLy8tcHJpbnRjcmwKLSAgICAgICAgeyJHZW5lcmF0ZXMuYS5zZWxmLnNpZ25lZC5jZXJ0aWZpY2F0ZSIsCi0gICAgICAgICAgICAgICAgIkdlcmEgdW0gY2VydGlmaWNhZG8gYXV0b2Fzc2luYWRvIn0sIC8vLXNlbGZjZXJ0Ci0gICAgICAgIHsiQ2hhbmdlcy50aGUuc3RvcmUucGFzc3dvcmQub2YuYS5rZXlzdG9yZSIsCi0gICAgICAgICAgICAgICAgIkFsdGVyYSBhIHNlbmhhIGRlIGFybWF6ZW5hbWVudG8gZGUgdW1hIFx1MDBFMXJlYSBkZSBhcm1hemVuYW1lbnRvIGRlIGNoYXZlcyJ9LCAvLy1zdG9yZXBhc3N3ZAotICAgICAgICAvLyBrZXl0b29sOiBoZWxwOiBvcHRpb25zCi0gICAgICAgIHsiYWxpYXMubmFtZS5vZi50aGUuZW50cnkudG8ucHJvY2VzcyIsCi0gICAgICAgICAgICAgICAgIm5vbWUgZG8gYWxpYXMgZGEgZW50cmFkYSBhIHNlciBwcm9jZXNzYWRhIn0sIC8vLWFsaWFzCi0gICAgICAgIHsiZGVzdGluYXRpb24uYWxpYXMiLAotICAgICAgICAgICAgICAgICJhbGlhcyBkZSBkZXN0aW5vIn0sIC8vLWRlc3RhbGlhcwotICAgICAgICB7ImRlc3RpbmF0aW9uLmtleS5wYXNzd29yZCIsCi0gICAgICAgICAgICAgICAgInNlbmhhIGRhIGNoYXZlIGRlIGRlc3Rpbm8ifSwgLy8tZGVzdGtleXBhc3MKLSAgICAgICAgeyJkZXN0aW5hdGlvbi5rZXlzdG9yZS5uYW1lIiwKLSAgICAgICAgICAgICAgICAibm9tZSBkYSBcdTAwRTFyZWEgZGUgYXJtYXplbmFtZW50byBkZSBjaGF2ZXMgZGUgZGVzdGlubyJ9LCAvLy1kZXN0a2V5c3RvcmUKLSAgICAgICAgeyJkZXN0aW5hdGlvbi5rZXlzdG9yZS5wYXNzd29yZC5wcm90ZWN0ZWQiLAotICAgICAgICAgICAgICAgICJzZW5oYSBwcm90ZWdpZGEgZGEgXHUwMEUxcmVhIGRlIGFybWF6ZW5hbWVudG8gZGUgY2hhdmVzIGRlIGRlc3Rpbm8ifSwgLy8tZGVzdHByb3RlY3RlZAotICAgICAgICB7ImRlc3RpbmF0aW9uLmtleXN0b3JlLnByb3ZpZGVyLm5hbWUiLAotICAgICAgICAgICAgICAgICJub21lIGRvIGZvcm5lY2Vkb3IgZGEgXHUwMEUxcmVhIGRlIGFybWF6ZW5hbWVudG8gZGUgY2hhdmVzIGRlIGRlc3Rpbm8ifSwgLy8tZGVzdHByb3ZpZGVybmFtZQotICAgICAgICB7ImRlc3RpbmF0aW9uLmtleXN0b3JlLnBhc3N3b3JkIiwKLSAgICAgICAgICAgICAgICAic2VuaGEgZGEgXHUwMEUxcmVhIGRlIGFybWF6ZW5hbWVudG8gZGUgY2hhdmVzIGRlIGRlc3Rpbm8ifSwgLy8tZGVzdHN0b3JlcGFzcwotICAgICAgICB7ImRlc3RpbmF0aW9uLmtleXN0b3JlLnR5cGUiLAotICAgICAgICAgICAgICAgICJ0aXBvIGRlIFx1MDBFMXJlYSBkZSBhcm1hemVuYW1lbnRvIGRlIGNoYXZlcyBkZSBkZXN0aW5vIn0sIC8vLWRlc3RzdG9yZXR5cGUKLSAgICAgICAgeyJkaXN0aW5ndWlzaGVkLm5hbWUiLAotICAgICAgICAgICAgICAgICJub21lIGRpc3RpbnRvIn0sIC8vLWRuYW1lCi0gICAgICAgIHsiWC41MDkuZXh0ZW5zaW9uIiwKLSAgICAgICAgICAgICAgICAiZXh0ZW5zXHUwMEUzbyBYLjUwOSJ9LCAvLy1leHQKLSAgICAgICAgeyJvdXRwdXQuZmlsZS5uYW1lIiwKLSAgICAgICAgICAgICAgICAibm9tZSBkbyBhcnF1aXZvIGRlIHNhXHUwMEVEZGEifSwgLy8tZmlsZSBhbmQgLW91dGZpbGUKLSAgICAgICAgeyJpbnB1dC5maWxlLm5hbWUiLAotICAgICAgICAgICAgICAgICJub21lIGRvIGFycXVpdm8gZGUgZW50cmFkYSJ9LCAvLy1maWxlIGFuZCAtaW5maWxlCi0gICAgICAgIHsia2V5LmFsZ29yaXRobS5uYW1lIiwKLSAgICAgICAgICAgICAgICAibm9tZSBkbyBhbGdvcml0bW8gZGEgY2hhdmUifSwgLy8ta2V5YWxnCi0gICAgICAgIHsia2V5LnBhc3N3b3JkIiwKLSAgICAgICAgICAgICAgICAic2VuaGEgZGEgY2hhdmUifSwgLy8ta2V5cGFzcwotICAgICAgICB7ImtleS5iaXQuc2l6ZSIsCi0gICAgICAgICAgICAgICAgInRhbWFuaG8gZG8gYml0IGRhIGNoYXZlIn0sIC8vLWtleXNpemUKLSAgICAgICAgeyJrZXlzdG9yZS5uYW1lIiwKLSAgICAgICAgICAgICAgICAibm9tZSBkYSBcdTAwRTFyZWEgZGUgYXJtYXplbmFtZW50byBkZSBjaGF2ZXMifSwgLy8ta2V5c3RvcmUKLSAgICAgICAgeyJuZXcucGFzc3dvcmQiLAotICAgICAgICAgICAgICAgICJub3ZhIHNlbmhhIn0sIC8vLW5ldwotICAgICAgICB7ImRvLm5vdC5wcm9tcHQiLAotICAgICAgICAgICAgICAgICJuXHUwMEUzbyBwZXJndW50YXIifSwgLy8tbm9wcm9tcHQKLSAgICAgICAgeyJwYXNzd29yZC50aHJvdWdoLnByb3RlY3RlZC5tZWNoYW5pc20iLAotICAgICAgICAgICAgICAgICJzZW5oYSBwb3IgbWVpbyBkZSBtZWNhbmlzbW8gcHJvdGVnaWRvIn0sIC8vLXByb3RlY3RlZAotICAgICAgICB7InByb3ZpZGVyLmFyZ3VtZW50IiwKLSAgICAgICAgICAgICAgICAiYXJndW1lbnRvIGRvIGZvcm5lY2Vkb3IifSwgLy8tcHJvdmlkZXJhcmcKLSAgICAgICAgeyJwcm92aWRlci5jbGFzcy5uYW1lIiwKLSAgICAgICAgICAgICAgICAibm9tZSBkYSBjbGFzc2UgZG8gZm9ybmVjZWRvciJ9LCAvLy1wcm92aWRlcmNsYXNzCi0gICAgICAgIHsicHJvdmlkZXIubmFtZSIsCi0gICAgICAgICAgICAgICAgIm5vbWUgZG8gZm9ybmVjZWRvciJ9LCAvLy1wcm92aWRlcm5hbWUKLSAgICAgICAgeyJwcm92aWRlci5jbGFzc3BhdGgiLAotICAgICAgICAgICAgICAgICJjbGFzc3BhdGggZG8gZm9ybmVjZWRvciJ9LCAvLy1wcm92aWRlcnBhdGgKLSAgICAgICAgeyJvdXRwdXQuaW4uUkZDLnN0eWxlIiwKLSAgICAgICAgICAgICAgICAic2FcdTAwRURkYSBubyBlc3RpbG8gUkZDIn0sIC8vLXJmYwotICAgICAgICB7InNpZ25hdHVyZS5hbGdvcml0aG0ubmFtZSIsCi0gICAgICAgICAgICAgICAgIm5vbWUgZG8gYWxnb3JpdG1vIGRlIGFzc2luYXR1cmEifSwgLy8tc2lnYWxnCi0gICAgICAgIHsic291cmNlLmFsaWFzIiwKLSAgICAgICAgICAgICAgICAiYWxpYXMgZGUgb3JpZ2VtIn0sIC8vLXNyY2FsaWFzCi0gICAgICAgIHsic291cmNlLmtleS5wYXNzd29yZCIsCi0gICAgICAgICAgICAgICAgInNlbmhhIGRhIGNoYXZlIGRlIG9yaWdlbSJ9LCAvLy1zcmNrZXlwYXNzCi0gICAgICAgIHsic291cmNlLmtleXN0b3JlLm5hbWUiLAotICAgICAgICAgICAgICAgICJub21lIGRhIFx1MDBFMXJlYSBkZSBhcm1hemVuYW1lbnRvIGRlIGNoYXZlcyBkZSBvcmlnZW0ifSwgLy8tc3Jja2V5c3RvcmUKLSAgICAgICAgeyJzb3VyY2Uua2V5c3RvcmUucGFzc3dvcmQucHJvdGVjdGVkIiwKLSAgICAgICAgICAgICAgICAic2VuaGEgcHJvdGVnaWRhIGRhIFx1MDBFMXJlYSBkZSBhcm1hemVuYW1lbnRvIGRlIGNoYXZlcyBkZSBvcmlnZW0ifSwgLy8tc3JjcHJvdGVjdGVkCi0gICAgICAgIHsic291cmNlLmtleXN0b3JlLnByb3ZpZGVyLm5hbWUiLAotICAgICAgICAgICAgICAgICJub21lIGRvIGZvcm5lY2Vkb3IgZGEgXHUwMEUxcmVhIGRlIGFybWF6ZW5hbWVudG8gZGUgY2hhdmVzIGRlIG9yaWdlbSJ9LCAvLy1zcmNwcm92aWRlcm5hbWUKLSAgICAgICAgeyJzb3VyY2Uua2V5c3RvcmUucGFzc3dvcmQiLAotICAgICAgICAgICAgICAgICJzZW5oYSBkYSBcdTAwRTFyZWEgZGUgYXJtYXplbmFtZW50byBkZSBjaGF2ZXMgZGUgb3JpZ2VtIn0sIC8vLXNyY3N0b3JlcGFzcwotICAgICAgICB7InNvdXJjZS5rZXlzdG9yZS50eXBlIiwKLSAgICAgICAgICAgICAgICAidGlwbyBkZSBcdTAwRTFyZWEgZGUgYXJtYXplbmFtZW50byBkZSBjaGF2ZXMgZGUgb3JpZ2VtIn0sIC8vLXNyY3N0b3JldHlwZQotICAgICAgICB7IlNTTC5zZXJ2ZXIuaG9zdC5hbmQucG9ydCIsCi0gICAgICAgICAgICAgICAgInBvcnRhIGUgaG9zdCBkbyBzZXJ2aWRvciBTU0wifSwgLy8tc3Nsc2VydmVyCi0gICAgICAgIHsic2lnbmVkLmphci5maWxlIiwKLSAgICAgICAgICAgICAgICAiYXJxdWl2byBqYXIgYXNzaW5hZG8ifSwgLy89amFyZmlsZQotICAgICAgICB7ImNlcnRpZmljYXRlLnZhbGlkaXR5LnN0YXJ0LmRhdGUudGltZSIsCi0gICAgICAgICAgICAgICAgImRhdGEvaG9yYSBpbmljaWFsIGRlIHZhbGlkYWRlIGRvIGNlcnRpZmljYWRvIn0sIC8vLXN0YXJ0ZGF0ZQotICAgICAgICB7ImtleXN0b3JlLnBhc3N3b3JkIiwKLSAgICAgICAgICAgICAgICAic2VuaGEgZGEgXHUwMEUxcmVhIGRlIGFybWF6ZW5hbWVudG8gZGUgY2hhdmVzIn0sIC8vLXN0b3JlcGFzcwotICAgICAgICB7ImtleXN0b3JlLnR5cGUiLAotICAgICAgICAgICAgICAgICJ0aXBvIGRlIFx1MDBFMXJlYSBkZSBhcm1hemVuYW1lbnRvIGRlIGNoYXZlcyJ9LCAvLy1zdG9yZXR5cGUKLSAgICAgICAgeyJ0cnVzdC5jZXJ0aWZpY2F0ZXMuZnJvbS5jYWNlcnRzIiwKLSAgICAgICAgICAgICAgICAiY2VydGlmaWNhZG9zIGNvbmZpXHUwMEUxdmVpcyBkbyBjYWNlcnRzIn0sIC8vLXRydXN0Y2FjZXJ0cwotICAgICAgICB7InZlcmJvc2Uub3V0cHV0IiwKLSAgICAgICAgICAgICAgICAic2FcdTAwRURkYSBkZXRhbGhhZGEifSwgLy8tdgotICAgICAgICB7InZhbGlkaXR5Lm51bWJlci5vZi5kYXlzIiwKLSAgICAgICAgICAgICAgICAiblx1MDBGQW1lcm8gZGUgZGlhcyBkYSB2YWxpZGFkZSJ9LCAvLy12YWxpZGl0eQotICAgICAgICB7IlNlcmlhbC5JRC5vZi5jZXJ0LnRvLnJldm9rZSIsCi0gICAgICAgICAgICAgICAgICJJRCBkZSBzXHUwMEU5cmllIGRvIGNlcnRpZmljYWRvIGEgc2VyIHJldm9nYWRvIn0sIC8vLWlkCi0gICAgICAgIC8vIGtleXRvb2w6IFJ1bm5pbmcgcGFydAotICAgICAgICB7ImtleXRvb2wuZXJyb3IuIiwgImVycm8gZGUga2V5dG9vbDogIn0sCi0gICAgICAgIHsiSWxsZWdhbC5vcHRpb24uIiwgIk9wXHUwMEU3XHUwMEUzbyBpbnZcdTAwRTFsaWRhOiAgIn0sCi0gICAgICAgIHsiSWxsZWdhbC52YWx1ZS4iLCAiVmFsb3IgaW52XHUwMEUxbGlkbzogIn0sCi0gICAgICAgIHsiVW5rbm93bi5wYXNzd29yZC50eXBlLiIsICJUaXBvIGRlIHNlbmhhIGRlc2NvbmhlY2lkbzogIn0sCi0gICAgICAgIHsiQ2Fubm90LmZpbmQuZW52aXJvbm1lbnQudmFyaWFibGUuIiwKLSAgICAgICAgICAgICAgICAiTlx1MDBFM28gXHUwMEU5IHBvc3NcdTAwRUR2ZWwgbG9jYWxpemFyIGEgdmFyaVx1MDBFMXZlbCBkbyBhbWJpZW50ZTogIn0sCi0gICAgICAgIHsiQ2Fubm90LmZpbmQuZmlsZS4iLCAiTlx1MDBFM28gXHUwMEU5IHBvc3NcdTAwRUR2ZWwgbG9jYWxpemFyIG8gYXJxdWl2bzogIn0sCi0gICAgICAgIHsiQ29tbWFuZC5vcHRpb24uZmxhZy5uZWVkcy5hbi5hcmd1bWVudC4iLCAiQSBvcFx1MDBFN1x1MDBFM28gZGUgY29tYW5kbyB7MH0gcHJlY2lzYSBkZSB1bSBhcmd1bWVudG8uIn0sCi0gICAgICAgIHsiV2FybmluZy5EaWZmZXJlbnQuc3RvcmUuYW5kLmtleS5wYXNzd29yZHMubm90LnN1cHBvcnRlZC5mb3IuUEtDUzEyLktleVN0b3Jlcy5JZ25vcmluZy51c2VyLnNwZWNpZmllZC5jb21tYW5kLnZhbHVlLiIsCi0gICAgICAgICAgICAgICAgIkFkdmVydFx1MDBFQW5jaWE6IFNlbmhhcyBkZSBjaGF2ZSBlIGRlIGFybWF6ZW5hbWVudG8gZGlmZXJlbnRlcyBuXHUwMEUzbyBzdXBvcnRhZGFzIHBhcmEgS2V5U3RvcmVzIFBLQ1MxMi4gSWdub3JhbmRvIHZhbG9yIHswfSBlc3BlY2lmaWNhZG8gcGVsbyB1c3VcdTAwRTFyaW8uIn0sCi0gICAgICAgIHsiLmtleXN0b3JlLm11c3QuYmUuTk9ORS5pZi5zdG9yZXR5cGUuaXMuezB9IiwKLSAgICAgICAgICAgICAgICAiLWtleXN0b3JlIGRldmUgc2VyIE5PTkUgc2UgLXN0b3JldHlwZSBmb3IgezB9In0sCi0gICAgICAgIHsiVG9vLm1hbnkucmV0cmllcy5wcm9ncmFtLnRlcm1pbmF0ZWQiLAotICAgICAgICAgICAgICAgICAiRXhjZXNzbyBkZSB0ZW50YXRpdmFzIGRlIHJlcGV0aVx1MDBFN1x1MDBFM287IHByb2dyYW1hIGZpbmFsaXphZG8ifSwKLSAgICAgICAgeyIuc3RvcmVwYXNzd2QuYW5kLmtleXBhc3N3ZC5jb21tYW5kcy5ub3Quc3VwcG9ydGVkLmlmLnN0b3JldHlwZS5pcy57MH0iLAotICAgICAgICAgICAgICAgICJjb21hbmRvcyAtc3RvcmVwYXNzd2QgZSAta2V5cGFzc3dkIG5cdTAwRTNvIHN1cG9ydGFkb3Mgc2UgLXN0b3JldHlwZSBmb3IgezB9In0sCi0gICAgICAgIHsiLmtleXBhc3N3ZC5jb21tYW5kcy5ub3Quc3VwcG9ydGVkLmlmLnN0b3JldHlwZS5pcy5QS0NTMTIiLAotICAgICAgICAgICAgICAgICJjb21hbmRvcyAta2V5cGFzc3dkIG5cdTAwRTNvIHN1cG9ydGFkb3Mgc2UgLXN0b3JldHlwZSBmb3IgUEtDUzEyIn0sCi0gICAgICAgIHsiLmtleXBhc3MuYW5kLm5ldy5jYW4ubm90LmJlLnNwZWNpZmllZC5pZi5zdG9yZXR5cGUuaXMuezB9IiwKLSAgICAgICAgICAgICAgICAiLWtleXBhc3MgZSAtbmV3IG5cdTAwRTNvIHBvZGVtIHNlciBlc3BlY2lmaWNhZG9zIHNlIC1zdG9yZXR5cGUgZm9yIHswfSJ9LAotICAgICAgICB7ImlmLnByb3RlY3RlZC5pcy5zcGVjaWZpZWQudGhlbi5zdG9yZXBhc3Mua2V5cGFzcy5hbmQubmV3Lm11c3Qubm90LmJlLnNwZWNpZmllZCIsCi0gICAgICAgICAgICAgICAgInNlIC1wcm90ZWN0ZWQgZm9yIGVzcGVjaWZpY2FkbywgZW50XHUwMEUzbyAtc3RvcmVwYXNzLCAta2V5cGFzcyBlIC1uZXcgblx1MDBFM28gZGV2ZXJcdTAwRTNvIHNlciBlc3BlY2lmaWNhZG9zIn0sCi0gICAgICAgIHsiaWYuc3JjcHJvdGVjdGVkLmlzLnNwZWNpZmllZC50aGVuLnNyY3N0b3JlcGFzcy5hbmQuc3Jja2V5cGFzcy5tdXN0Lm5vdC5iZS5zcGVjaWZpZWQiLAotICAgICAgICAgICAgICAgICJzZSAtc3JjcHJvdGVjdGVkIGZvciBlc3BlY2lmaWNhZG8sIGVudFx1MDBFM28gLXNyY3N0b3JlcGFzcyBlIC1zcmNrZXlwYXNzIG5cdTAwRTNvIGRldmVyXHUwMEUzbyBzZXIgZXNwZWNpZmljYWRvcyJ9LAotICAgICAgICB7ImlmLmtleXN0b3JlLmlzLm5vdC5wYXNzd29yZC5wcm90ZWN0ZWQudGhlbi5zdG9yZXBhc3Mua2V5cGFzcy5hbmQubmV3Lm11c3Qubm90LmJlLnNwZWNpZmllZCIsCi0gICAgICAgICAgICAgICAgInNlIGEgXHUwMEUxcmVhIGRlIGFybWF6ZW5hbWVudG8gZGUgY2hhdmVzIG5cdTAwRTNvIGVzdGl2ZXIgcHJvdGVnaWRhIHBvciBzZW5oYSwgZW50XHUwMEUzbyAtc3RvcmVwYXNzLCAta2V5cGFzcyBlIC1uZXcgblx1MDBFM28gZGV2ZXJcdTAwRTNvIHNlciBlc3BlY2lmaWNhZG9zIn0sCi0gICAgICAgIHsiaWYuc291cmNlLmtleXN0b3JlLmlzLm5vdC5wYXNzd29yZC5wcm90ZWN0ZWQudGhlbi5zcmNzdG9yZXBhc3MuYW5kLnNyY2tleXBhc3MubXVzdC5ub3QuYmUuc3BlY2lmaWVkIiwKLSAgICAgICAgICAgICAgICAic2UgYSBcdTAwRTFyZWEgZGUgYXJtYXplbmFtZW50byBkZSBjaGF2ZXMgZGUgb3JpZ2VtIG5cdTAwRTNvIGVzdGl2ZXIgcHJvdGVnaWRhIHBvciBzZW5oYSwgZW50XHUwMEUzbyAtc3Jjc3RvcmVwYXNzIGUgLXNyY2tleXBhc3Mgblx1MDBFM28gZGV2ZXJcdTAwRTNvIHNlciBlc3BlY2lmaWNhZG9zIn0sCi0gICAgICAgIHsiSWxsZWdhbC5zdGFydGRhdGUudmFsdWUiLCAidmFsb3IgZGEgZGF0YSBpbmljaWFsIGludlx1MDBFMWxpZG8ifSwKLSAgICAgICAgeyJWYWxpZGl0eS5tdXN0LmJlLmdyZWF0ZXIudGhhbi56ZXJvIiwKLSAgICAgICAgICAgICAgICAiQSB2YWxpZGFkZSBkZXZlIHNlciBtYWlvciBkbyBxdWUgemVybyJ9LAotICAgICAgICB7InByb3ZOYW1lLm5vdC5hLnByb3ZpZGVyIiwgInswfSBuXHUwMEUzbyBcdTAwRTkgdW0gZm9ybmVjZWRvciJ9LAotICAgICAgICB7IlVzYWdlLmVycm9yLm5vLmNvbW1hbmQucHJvdmlkZWQiLCAiRXJybyBkZSB1c286IG5lbmh1bSBjb21hbmRvIGZvcm5lY2lkbyJ9LAotICAgICAgICB7IlNvdXJjZS5rZXlzdG9yZS5maWxlLmV4aXN0cy5idXQuaXMuZW1wdHkuIiwgIk8gYXJxdWl2byBkYSBcdTAwRTFyZWEgZGUgYXJtYXplbmFtZW50byBkZSBjaGF2ZXMgZGUgb3JpZ2VtIGV4aXN0ZSwgbWFzIGVzdFx1MDBFMSB2YXppbzogIn0sCi0gICAgICAgIHsiUGxlYXNlLnNwZWNpZnkuc3Jja2V5c3RvcmUiLCAiRXNwZWNpZmlxdWUgLXNyY2tleXN0b3JlIn0sCi0gICAgICAgIHsiTXVzdC5ub3Quc3BlY2lmeS5ib3RoLnYuYW5kLnJmYy53aXRoLmxpc3QuY29tbWFuZCIsCi0gICAgICAgICAgICAgICAgIk5cdTAwRTNvIGRldmVtIHNlciBlc3BlY2lmaWNhZG9zIC12IGUgLXJmYyBjb20gbyBjb21hbmRvICdsaXN0JyJ9LAotICAgICAgICB7IktleS5wYXNzd29yZC5tdXN0LmJlLmF0LmxlYXN0LjYuY2hhcmFjdGVycyIsCi0gICAgICAgICAgICAgICAgIkEgc2VuaGEgZGEgY2hhdmUgZGV2ZSB0ZXIsIG5vIG1cdTAwRURuaW1vLCA2IGNhcmFjdGVyZXMifSwKLSAgICAgICAgeyJOZXcucGFzc3dvcmQubXVzdC5iZS5hdC5sZWFzdC42LmNoYXJhY3RlcnMiLAotICAgICAgICAgICAgICAgICJBIG5vdmEgc2VuaGEgZGV2ZSB0ZXIsIG5vIG1cdTAwRURuaW1vLCA2IGNhcmFjdGVyZXMifSwKLSAgICAgICAgeyJLZXlzdG9yZS5maWxlLmV4aXN0cy5idXQuaXMuZW1wdHkuIiwKLSAgICAgICAgICAgICAgICAiTyBhcnF1aXZvIGRhIFx1MDBFMXJlYSBkZSBhcm1hemVuYW1lbnRvIGRlIGNoYXZlcyBleGlzdGUsIG1hcyBlc3RcdTAwRTEgdmF6aW86ICJ9LAotICAgICAgICB7IktleXN0b3JlLmZpbGUuZG9lcy5ub3QuZXhpc3QuIiwKLSAgICAgICAgICAgICAgICAiTyBhcnF1aXZvIGRhIFx1MDBFMXJlYSBkZSBhcm1hemVuYW1lbnRvIGRlIGNoYXZlcyBuXHUwMEUzbyBleGlzdGUuICJ9LAotICAgICAgICB7Ik11c3Quc3BlY2lmeS5kZXN0aW5hdGlvbi5hbGlhcyIsICJEZXZlIHNlciBlc3BlY2lmaWNhZG8gdW0gYWxpYXMgZGUgZGVzdGlubyJ9LAotICAgICAgICB7Ik11c3Quc3BlY2lmeS5hbGlhcyIsICJEZXZlIHNlciBlc3BlY2lmaWNhZG8gdW0gYWxpYXMifSwKLSAgICAgICAgeyJLZXlzdG9yZS5wYXNzd29yZC5tdXN0LmJlLmF0LmxlYXN0LjYuY2hhcmFjdGVycyIsCi0gICAgICAgICAgICAgICAgIkEgc2VuaGEgZGEgXHUwMEUxcmVhIGRlIGFybWF6ZW5hbWVudG8gZGUgY2hhdmVzIGRldmUgdGVyLCBubyBtXHUwMEVEbmltbywgNiBjYXJhY3RlcmVzIn0sCi0gICAgICAgIHsiRW50ZXIua2V5c3RvcmUucGFzc3dvcmQuIiwgIkluZm9ybWUgYSBzZW5oYSBkYSBcdTAwRTFyZWEgZGUgYXJtYXplbmFtZW50byBkZSBjaGF2ZXM6ICAifSwKLSAgICAgICAgeyJFbnRlci5zb3VyY2Uua2V5c3RvcmUucGFzc3dvcmQuIiwgIkluZm9ybWUgYSBzZW5oYSBkYSBcdTAwRTFyZWEgZGUgYXJtYXplbmFtZW50byBkZSBjaGF2ZXMgZGUgb3JpZ2VtOiAgIn0sCi0gICAgICAgIHsiRW50ZXIuZGVzdGluYXRpb24ua2V5c3RvcmUucGFzc3dvcmQuIiwgIkluZm9ybWUgYSBzZW5oYSBkYSBcdTAwRTFyZWEgZGUgYXJtYXplbmFtZW50byBkZSBjaGF2ZXMgZGUgZGVzdGlubzogICJ9LAotICAgICAgICB7IktleXN0b3JlLnBhc3N3b3JkLmlzLnRvby5zaG9ydC5tdXN0LmJlLmF0LmxlYXN0LjYuY2hhcmFjdGVycyIsCi0gICAgICAgICAiQSBzZW5oYSBkYSBcdTAwRTFyZWEgZGUgYXJtYXplbmFtZW50byBkZSBjaGF2ZXMgXHUwMEU5IG11aXRvIGN1cnRhIC0gZWxhIGRldmUgdGVyLCBubyBtXHUwMEVEbmltbywgNiBjYXJhY3RlcmVzIn0sCi0gICAgICAgIHsiVW5rbm93bi5FbnRyeS5UeXBlIiwgIlRpcG8gZGUgRW50cmFkYSBEZXNjb25oZWNpZG8ifSwKLSAgICAgICAgeyJUb28ubWFueS5mYWlsdXJlcy5BbGlhcy5ub3QuY2hhbmdlZCIsICJFeGNlc3NvIGRlIGZhbGhhcy4gQWxpYXMgblx1MDBFM28gYWx0ZXJhZG8ifSwKLSAgICAgICAgeyJFbnRyeS5mb3IuYWxpYXMuYWxpYXMuc3VjY2Vzc2Z1bGx5LmltcG9ydGVkLiIsCi0gICAgICAgICAgICAgICAgICJFbnRyYWRhIGRvIGFsaWFzIHswfSBpbXBvcnRhZGEgY29tIFx1MDBFQXhpdG8uIn0sCi0gICAgICAgIHsiRW50cnkuZm9yLmFsaWFzLmFsaWFzLm5vdC5pbXBvcnRlZC4iLCAiRW50cmFkYSBkbyBhbGlhcyB7MH0gblx1MDBFM28gaW1wb3J0YWRhLiJ9LAotICAgICAgICB7IlByb2JsZW0uaW1wb3J0aW5nLmVudHJ5LmZvci5hbGlhcy5hbGlhcy5leGNlcHRpb24uRW50cnkuZm9yLmFsaWFzLmFsaWFzLm5vdC5pbXBvcnRlZC4iLAotICAgICAgICAgICAgICAgICAiUHJvYmxlbWEgYW8gaW1wb3J0YXIgYSBlbnRyYWRhIGRvIGFsaWFzIHswfTogezF9LlxuRW50cmFkYSBkbyBhbGlhcyB7MH0gblx1MDBFM28gaW1wb3J0YWRhLiJ9LAotICAgICAgICB7IkltcG9ydC5jb21tYW5kLmNvbXBsZXRlZC5vay5lbnRyaWVzLnN1Y2Nlc3NmdWxseS5pbXBvcnRlZC5mYWlsLmVudHJpZXMuZmFpbGVkLm9yLmNhbmNlbGxlZCIsCi0gICAgICAgICAgICAgICAgICJDb21hbmRvIGRlIGltcG9ydGFcdTAwRTdcdTAwRTNvIGNvbmNsdVx1MDBFRGRvOiAgezB9IGVudHJhZGFzIGltcG9ydGFkYXMgY29tIFx1MDBFQXhpdG8sIHsxfSBlbnRyYWRhcyBmYWxoYXJhbSBvdSBmb3JhbSBjYW5jZWxhZGFzIn0sCi0gICAgICAgIHsiV2FybmluZy5PdmVyd3JpdGluZy5leGlzdGluZy5hbGlhcy5hbGlhcy5pbi5kZXN0aW5hdGlvbi5rZXlzdG9yZSIsCi0gICAgICAgICAgICAgICAgICJBZHZlcnRcdTAwRUFuY2lhOiBTdWJzdGl0dWlcdTAwRTdcdTAwRTNvIGRvIGFsaWFzIHswfSBleGlzdGVudGUgbmEgXHUwMEUxcmVhIGRlIGFybWF6ZW5hbWVudG8gZGUgY2hhdmVzIGRlIGRlc3Rpbm8ifSwKLSAgICAgICAgeyJFeGlzdGluZy5lbnRyeS5hbGlhcy5hbGlhcy5leGlzdHMub3ZlcndyaXRlLm5vLiIsCi0gICAgICAgICAgICAgICAgICJFbnRyYWRhIGpcdTAwRTEgZXhpc3RlbnRlIG5vIGFsaWFzIHswfSwgc3Vic3RpdHVpcj8gW25cdTAwRTNvXTogICJ9LAotICAgICAgICB7IlRvby5tYW55LmZhaWx1cmVzLnRyeS5sYXRlciIsICJFeGNlc3NvIGRlIGZhbGhhcyAtIHRlbnRlIG1haXMgdGFyZGUifSwKLSAgICAgICAgeyJDZXJ0aWZpY2F0aW9uLnJlcXVlc3Quc3RvcmVkLmluLmZpbGUuZmlsZW5hbWUuIiwKLSAgICAgICAgICAgICAgICAiU29saWNpdGFcdTAwRTdcdTAwRTNvIGRlIGNlcnRpZmljYWRvIGFybWF6ZW5hZGEgbm8gYXJxdWl2byA8ezB9PiJ9LAotICAgICAgICB7IlN1Ym1pdC50aGlzLnRvLnlvdXIuQ0EiLCAiU3VibWV0ZXIgXHUwMEUwIENBIn0sCi0gICAgICAgIHsiaWYuYWxpYXMubm90LnNwZWNpZmllZC5kZXN0YWxpYXMuc3Jja2V5cGFzcy5hbmQuZGVzdGtleXBhc3MubXVzdC5ub3QuYmUuc3BlY2lmaWVkIiwKLSAgICAgICAgICAgICJzZSBvIGFsaWFzIG5cdTAwRTNvIGVzdGl2ZXIgZXNwZWNpZmljYWRvLCBkZXN0YWxpYXMsIHNyY2tleXBhc3MgZSBkZXN0a2V5cGFzcyBuXHUwMEUzbyBkZXZlclx1MDBFM28gc2VyIGVzcGVjaWZpY2Fkb3MifSwKLSAgICAgICAgeyJDZXJ0aWZpY2F0ZS5zdG9yZWQuaW4uZmlsZS5maWxlbmFtZS4iLAotICAgICAgICAgICAgICAgICJDZXJ0aWZpY2FkbyBhcm1hemVuYWRvIG5vIGFycXVpdm8gPHswfT4ifSwKLSAgICAgICAgeyJDZXJ0aWZpY2F0ZS5yZXBseS53YXMuaW5zdGFsbGVkLmluLmtleXN0b3JlIiwKLSAgICAgICAgICAgICAgICAiQSByZXNwb3N0YSBkbyBjZXJ0aWZpY2FkbyBmb2kgaW5zdGFsYWRhIG5hIFx1MDBFMXJlYSBkZSBhcm1hemVuYW1lbnRvIGRlIGNoYXZlcyJ9LAotICAgICAgICB7IkNlcnRpZmljYXRlLnJlcGx5Lndhcy5ub3QuaW5zdGFsbGVkLmluLmtleXN0b3JlIiwKLSAgICAgICAgICAgICAgICAiQSByZXNwb3N0YSBkbyBjZXJ0aWZpY2FkbyBuXHUwMEUzbyBmb2kgaW5zdGFsYWRhIG5hIFx1MDBFMXJlYSBkZSBhcm1hemVuYW1lbnRvIGRlIGNoYXZlcyJ9LAotICAgICAgICB7IkNlcnRpZmljYXRlLndhcy5hZGRlZC50by5rZXlzdG9yZSIsCi0gICAgICAgICAgICAgICAgIk8gY2VydGlmaWNhZG8gZm9pIGFkaWNpb25hZG8gXHUwMEUwIFx1MDBFMXJlYSBkZSBhcm1hemVuYW1lbnRvIGRlIGNoYXZlcyJ9LAotICAgICAgICB7IkNlcnRpZmljYXRlLndhcy5ub3QuYWRkZWQudG8ua2V5c3RvcmUiLAotICAgICAgICAgICAgICAgICJPIGNlcnRpZmljYWRvIG5cdTAwRTNvIGZvaSBhZGljaW9uYWRvIFx1MDBFMCBcdTAwRTFyZWEgZGUgYXJtYXplbmFtZW50byBkZSBjaGF2ZXMifSwKLSAgICAgICAgeyIuU3RvcmluZy5rc2ZuYW1lLiIsICJbQXJtYXplbmFuZG8gezB9XSJ9LAotICAgICAgICB7ImFsaWFzLmhhcy5uby5wdWJsaWMua2V5LmNlcnRpZmljYXRlLiIsCi0gICAgICAgICAgICAgICAgInswfSBuXHUwMEUzbyB0ZW0gY2hhdmUgcFx1MDBGQWJsaWNhIChjZXJ0aWZpY2FkbykifSwKLSAgICAgICAgeyJDYW5ub3QuZGVyaXZlLnNpZ25hdHVyZS5hbGdvcml0aG0iLAotICAgICAgICAgICAgICAgICJOXHUwMEUzbyBcdTAwRTkgcG9zc1x1MDBFRHZlbCBvYnRlciB1bSBhbGdvcml0bW8gZGUgYXNzaW5hdHVyYSJ9LAotICAgICAgICB7IkFsaWFzLmFsaWFzLmRvZXMubm90LmV4aXN0IiwKLSAgICAgICAgICAgICAgICAiTyBhbGlhcyA8ezB9PiBuXHUwMEUzbyBleGlzdGUifSwKLSAgICAgICAgeyJBbGlhcy5hbGlhcy5oYXMubm8uY2VydGlmaWNhdGUiLAotICAgICAgICAgICAgICAgICJPIGFsaWFzIDx7MH0+IG5cdTAwRTNvIHRlbSBjZXJ0aWZpY2FkbyJ9LAotICAgICAgICB7IktleS5wYWlyLm5vdC5nZW5lcmF0ZWQuYWxpYXMuYWxpYXMuYWxyZWFkeS5leGlzdHMiLAotICAgICAgICAgICAgICAgICJQYXIgZGUgY2hhdmVzIG5cdTAwRTNvIGdlcmFkbzsgbyBhbGlhcyA8ezB9PiBqXHUwMEUxIGV4aXN0ZSJ9LAotICAgICAgICB7IkdlbmVyYXRpbmcua2V5c2l6ZS5iaXQua2V5QWxnTmFtZS5rZXkucGFpci5hbmQuc2VsZi5zaWduZWQuY2VydGlmaWNhdGUuc2lnQWxnTmFtZS53aXRoLmEudmFsaWRpdHkub2YudmFsaWRhbGl0eS5kYXlzLmZvciIsCi0gICAgICAgICAgICAgICAgIkdlcmFuZG8gbyBwYXIgZGUgY2hhdmVzIHsxfSBkZSB7MH0gYml0IGUgbyBjZXJ0aWZpY2FkbyBhdXRvYXNzaW5hZG8gKHsyfSkgY29tIHVtYSB2YWxpZGFkZSBkZSB7M30gZGlhc1xuXHRwYXJhOiB7NH0ifSwKLSAgICAgICAgeyJFbnRlci5rZXkucGFzc3dvcmQuZm9yLmFsaWFzLiIsICJJbmZvcm1hciBhIHNlbmhhIGRhIGNoYXZlIGRlIDx7MH0+In0sCi0gICAgICAgIHsiLlJFVFVSTi5pZi5zYW1lLmFzLmtleXN0b3JlLnBhc3N3b3JkLiIsCi0gICAgICAgICAgICAgICAgIlx0KFJFVFVSTiBzZSBmb3IgaWd1YWwgXHUwMEUwIHNlbmhhIGRhIFx1MDBFMXJlYSBkbyBhcm1hemVuYW1lbnRvIGRlIGNoYXZlcyk6ICAifSwKLSAgICAgICAgeyJLZXkucGFzc3dvcmQuaXMudG9vLnNob3J0Lm11c3QuYmUuYXQubGVhc3QuNi5jaGFyYWN0ZXJzIiwKLSAgICAgICAgICAgICAgICAiQSBzZW5oYSBkYSBjaGF2ZSBcdTAwRTkgbXVpdG8gY3VydGEgLSBkZXZlIHRlciwgbm8gbVx1MDBFRG5pbW8sIDYgY2FyYWN0ZXJlcyJ9LAotICAgICAgICB7IlRvby5tYW55LmZhaWx1cmVzLmtleS5ub3QuYWRkZWQudG8ua2V5c3RvcmUiLAotICAgICAgICAgICAgICAgICJFeGNlc3NvIGRlIGZhbGhhcyAtIGNoYXZlIG5cdTAwRTNvIGFkaWNpb25hZGEgYSBcdTAwRTFyZWEgZGUgYXJtYXplbmFtZW50byBkZSBjaGF2ZXMifSwKLSAgICAgICAgeyJEZXN0aW5hdGlvbi5hbGlhcy5kZXN0LmFscmVhZHkuZXhpc3RzIiwKLSAgICAgICAgICAgICAgICAiTyBhbGlhcyBkZSBkZXN0aW5vIDx7MH0+IGpcdTAwRTEgZXhpc3RlIn0sCi0gICAgICAgIHsiUGFzc3dvcmQuaXMudG9vLnNob3J0Lm11c3QuYmUuYXQubGVhc3QuNi5jaGFyYWN0ZXJzIiwKLSAgICAgICAgICAgICAgICAiQSBzZW5oYSBcdTAwRTkgbXVpdG8gY3VydGEgLSBkZXZlIHRlciwgbm8gbVx1MDBFRG5pbW8sIDYgY2FyYWN0ZXJlcyJ9LAotICAgICAgICB7IlRvby5tYW55LmZhaWx1cmVzLktleS5lbnRyeS5ub3QuY2xvbmVkIiwKLSAgICAgICAgICAgICAgICAiRXhjZXNzbyBkZSBmYWxoYXMuIEVudHJhZGEgZGEgY2hhdmUgblx1MDBFM28gY2xvbmFkYSJ9LAotICAgICAgICB7ImtleS5wYXNzd29yZC5mb3IuYWxpYXMuIiwgInNlbmhhIGRhIGNoYXZlIGRlIDx7MH0+In0sCi0gICAgICAgIHsiS2V5c3RvcmUuZW50cnkuZm9yLmlkLmdldE5hbWUuYWxyZWFkeS5leGlzdHMiLAotICAgICAgICAgICAgICAgICJBIGVudHJhZGEgZGEgXHUwMEUxcmVhIGRvIGFybWF6ZW5hbWVudG8gZGUgY2hhdmVzIGRlIDx7MH0+IGpcdTAwRTEgZXhpc3RlIn0sCi0gICAgICAgIHsiQ3JlYXRpbmcua2V5c3RvcmUuZW50cnkuZm9yLmlkLmdldE5hbWUuIiwKLSAgICAgICAgICAgICAgICAiQ3JpYW5kbyBlbnRyYWRhIGRhIFx1MDBFMXJlYSBkbyBhcm1hemVuYW1lbnRvIGRlIGNoYXZlcyBwYXJhIDx7MH0+IC4uLiJ9LAotICAgICAgICB7Ik5vLmVudHJpZXMuZnJvbS5pZGVudGl0eS5kYXRhYmFzZS5hZGRlZCIsCi0gICAgICAgICAgICAgICAgIk5lbmh1bWEgZW50cmFkYSBhZGljaW9uYWRhIGRvIGJhbmNvIGRlIGRhZG9zIGRlIGlkZW50aWRhZGVzIn0sCi0gICAgICAgIHsiQWxpYXMubmFtZS5hbGlhcyIsICJOb21lIGRvIGFsaWFzOiB7MH0ifSwKLSAgICAgICAgeyJDcmVhdGlvbi5kYXRlLmtleVN0b3JlLmdldENyZWF0aW9uRGF0ZS5hbGlhcy4iLAotICAgICAgICAgICAgICAgICJEYXRhIGRlIGNyaWFcdTAwRTdcdTAwRTNvOiB7MCxkYXRlfSJ9LAotICAgICAgICB7ImFsaWFzLmtleVN0b3JlLmdldENyZWF0aW9uRGF0ZS5hbGlhcy4iLAotICAgICAgICAgICAgICAgICJ7MH0sIHsxLGRhdGV9LCAifSwKLSAgICAgICAgeyJhbGlhcy4iLCAiezB9LCAifSwKLSAgICAgICAgeyJFbnRyeS50eXBlLnR5cGUuIiwgIlRpcG8gZGUgZW50cmFkYTogezB9In0sCi0gICAgICAgIHsiQ2VydGlmaWNhdGUuY2hhaW4ubGVuZ3RoLiIsICJDb21wcmltZW50byBkYSBjYWRlaWEgZGUgY2VydGlmaWNhZG9zOiAifSwKLSAgICAgICAgeyJDZXJ0aWZpY2F0ZS5pLjEuIiwgIkNlcnRpZmljYWRvW3swLG51bWJlcixpbnRlZ2VyfV06In0sCi0gICAgICAgIHsiQ2VydGlmaWNhdGUuZmluZ2VycHJpbnQuU0hBMS4iLCAiRmluZ2VycHJpbnQgKE1ENSkgZG8gY2VydGlmaWNhZG86ICJ9LAotICAgICAgICB7IktleXN0b3JlLnR5cGUuIiwgIlRpcG8gZGUgXHUwMEUxcmVhIGRlIGFybWF6ZW5hbWVudG8gZGUgY2hhdmVzOiAifSwKLSAgICAgICAgeyJLZXlzdG9yZS5wcm92aWRlci4iLCAiRm9ybmVjZWRvciBkYSBcdTAwRTFyZWEgZGUgYXJtYXplbmFtZW50byBkZSBjaGF2ZXM6ICJ9LAotICAgICAgICB7IllvdXIua2V5c3RvcmUuY29udGFpbnMua2V5U3RvcmUuc2l6ZS5lbnRyeSIsCi0gICAgICAgICAgICAgICAgIlN1YSBcdTAwRTFyZWEgZGUgYXJtYXplbmFtZW50byBkZSBjaGF2ZXMgY29udFx1MDBFOW0gezAsbnVtYmVyLGludGVnZXJ9IGVudHJhZGEifSwKLSAgICAgICAgeyJZb3VyLmtleXN0b3JlLmNvbnRhaW5zLmtleVN0b3JlLnNpemUuZW50cmllcyIsCi0gICAgICAgICAgICAgICAgIlN1YSBcdTAwRTFyZWEgZGUgYXJtYXplbmFtZW50byBkZSBjaGF2ZXMgY29udFx1MDBFOW0gezAsbnVtYmVyLGludGVnZXJ9IGVudHJhZGFzIn0sCi0gICAgICAgIHsiRmFpbGVkLnRvLnBhcnNlLmlucHV0IiwgIkZhbGhhIGR1cmFudGUgbyBwYXJzZSBkYSBlbnRyYWRhIn0sCi0gICAgICAgIHsiRW1wdHkuaW5wdXQiLCAiRW50cmFkYSB2YXppYSJ9LAotICAgICAgICB7Ik5vdC5YLjUwOS5jZXJ0aWZpY2F0ZSIsICJOXHUwMEUzbyBcdTAwRTkgdW0gY2VydGlmaWNhZG8gWC41MDkifSwKLSAgICAgICAgeyJhbGlhcy5oYXMubm8ucHVibGljLmtleSIsICJ7MH0gblx1MDBFM28gdGVtIGNoYXZlIHBcdTAwRkFibGljYSJ9LAotICAgICAgICB7ImFsaWFzLmhhcy5uby5YLjUwOS5jZXJ0aWZpY2F0ZSIsICJ7MH0gblx1MDBFM28gdGVtIGNlcnRpZmljYWRvIFguNTA5In0sCi0gICAgICAgIHsiTmV3LmNlcnRpZmljYXRlLnNlbGYuc2lnbmVkLiIsICJOb3ZvIGNlcnRpZmljYWRvIChhdXRvYXNzaW5hZG8pOiJ9LAotICAgICAgICB7IlJlcGx5Lmhhcy5uby5jZXJ0aWZpY2F0ZXMiLCAiQSByZXNwb3N0YSBuXHUwMEUzbyB0ZW0gY2VydGlmaWNhZG8ifSwKLSAgICAgICAgeyJDZXJ0aWZpY2F0ZS5ub3QuaW1wb3J0ZWQuYWxpYXMuYWxpYXMuYWxyZWFkeS5leGlzdHMiLAotICAgICAgICAgICAgICAgICJDZXJ0aWZpY2FkbyBuXHUwMEUzbyBpbXBvcnRhZG8sIG8gYWxpYXMgPHswfT4galx1MDBFMSBleGlzdGUifSwKLSAgICAgICAgeyJJbnB1dC5ub3QuYW4uWC41MDkuY2VydGlmaWNhdGUiLCAiQSBlbnRyYWRhIG5cdTAwRTNvIFx1MDBFOSB1bSBjZXJ0aWZpY2FkbyBYLjUwOSJ9LAotICAgICAgICB7IkNlcnRpZmljYXRlLmFscmVhZHkuZXhpc3RzLmluLmtleXN0b3JlLnVuZGVyLmFsaWFzLnRydXN0YWxpYXMuIiwKLSAgICAgICAgICAgICAgICAiTyBjZXJ0aWZpY2FkbyBqXHUwMEUxIGV4aXN0ZSBubyBhcm1hemVuYW1lbnRvIGRlIGNoYXZlcyBubyBhbGlhcyA8ezB9PiJ9LAotICAgICAgICB7IkRvLnlvdS5zdGlsbC53YW50LnRvLmFkZC5pdC5uby4iLAotICAgICAgICAgICAgICAgICJBaW5kYSBkZXNlamEgYWRpY2lvblx1MDBFMS1sbz8gW25cdTAwRTNvXTogICJ9LAotICAgICAgICB7IkNlcnRpZmljYXRlLmFscmVhZHkuZXhpc3RzLmluLnN5c3RlbS53aWRlLkNBLmtleXN0b3JlLnVuZGVyLmFsaWFzLnRydXN0YWxpYXMuIiwKLSAgICAgICAgICAgICAgICAiTyBjZXJ0aWZpY2FkbyBqXHUwMEUxIGV4aXN0ZSBuYSBcdTAwRTFyZWEgZGUgYXJtYXplbmFtZW50byBkZSBjaGF2ZXMgZGEgQ0EgZW0gdG9kbyBvIHNpc3RlbWEgbm8gYWxpYXMgPHswfT4ifSwKLSAgICAgICAgeyJEby55b3Uuc3RpbGwud2FudC50by5hZGQuaXQudG8ueW91ci5vd24ua2V5c3RvcmUubm8uIiwKLSAgICAgICAgICAgICAgICAiQWluZGEgZGVzZWphIGFkaWNpb25cdTAwRTEtbG8gXHUwMEUwIHN1YSBcdTAwRTFyZWEgZGUgYXJtYXplbmFtZW50byBkZSBjaGF2ZXM/IFtuXHUwMEUzb106ICAifSwKLSAgICAgICAgeyJUcnVzdC50aGlzLmNlcnRpZmljYXRlLm5vLiIsICJDb25maWFyIG5lc3RlIGNlcnRpZmljYWRvPyBbblx1MDBFM29dOiAgIn0sCi0gICAgICAgIHsiWUVTIiwgIlNpbSJ9LAotICAgICAgICB7Ik5ldy5wcm9tcHQuIiwgIk5vdmEgezB9OiAifSwKLSAgICAgICAgeyJQYXNzd29yZHMubXVzdC5kaWZmZXIiLCAiQXMgc2VuaGFzIGRldmVtIHNlciBkaWZlcmVudGVzIn0sCi0gICAgICAgIHsiUmUuZW50ZXIubmV3LnByb21wdC4iLCAiSW5mb3JtZSBub3ZhbWVudGUgYSBub3ZhIHswfTogIn0sCi0gICAgICAgIHsiUmUuZW50ZXIubmV3LnBhc3N3b3JkLiIsICJJbmZvcm1lIG5vdmFtZW50ZSBhIG5vdmEgc2VuaGE6ICJ9LAotICAgICAgICB7IlRoZXkuZG9uLnQubWF0Y2guVHJ5LmFnYWluIiwgIkVsYXMgblx1MDBFM28gY29ycmVzcG9uZGVtLiBUZW50ZSBub3ZhbWVudGUifSwKLSAgICAgICAgeyJFbnRlci5wcm9tcHQuYWxpYXMubmFtZS4iLCAiSW5mb3JtZSBvIG5vbWUgZG8gYWxpYXMgezB9OiAgIn0sCi0gICAgICAgIHsiRW50ZXIubmV3LmFsaWFzLm5hbWUuUkVUVVJOLnRvLmNhbmNlbC5pbXBvcnQuZm9yLnRoaXMuZW50cnkuIiwKLSAgICAgICAgICAgICAgICAgIkluZm9ybWUgbyBub3ZvIG5vbWUgZG8gYWxpYXNcdChSRVRVUk4gcGFyYSBjYW5jZWxhciBhIGltcG9ydGFcdTAwRTdcdTAwRTNvIGRlc3RhIGVudHJhZGEpOiAgIn0sCi0gICAgICAgIHsiRW50ZXIuYWxpYXMubmFtZS4iLCAiSW5mb3JtZSBvIG5vbWUgZG8gYWxpYXM6ICAifSwKLSAgICAgICAgeyIuUkVUVVJOLmlmLnNhbWUuYXMuZm9yLm90aGVyQWxpYXMuIiwKLSAgICAgICAgICAgICAgICAiXHQoUkVUVVJOIHNlIGZvciBpZ3VhbCBhbyBkZSA8ezB9PikifSwKLSAgICAgICAgeyIuUEFUVEVSTi5wcmludFg1MDlDZXJ0IiwKLSAgICAgICAgICAgICAgICAiUHJvcHJpZXRcdTAwRTFyaW86IHswfVxuRW1pc3NvcjogezF9XG5OXHUwMEZBbWVybyBkZSBzXHUwMEU5cmllOiB7Mn1cblZcdTAwRTFsaWRvIGRlOiB7M30gYTogezR9XG5GaW5nZXJwcmludHMgZG8gY2VydGlmaWNhZG86XG5cdCBNRDU6ICB7NX1cblx0IFNIQTE6IHs2fVxuXHQgU0hBMjU2OiB7N31cblx0IE5vbWUgZG8gYWxnb3JpdG1vIGRlIGFzc2luYXR1cmE6IHs4fVxuXHQgVmVyc1x1MDBFM286IHs5fSJ9LAotICAgICAgICB7IldoYXQuaXMueW91ci5maXJzdC5hbmQubGFzdC5uYW1lLiIsCi0gICAgICAgICAgICAgICAgIlF1YWwgXHUwMEU5IG8gc2V1IG5vbWUgZSBvIHNldSBzb2JyZW5vbWU/In0sCi0gICAgICAgIHsiV2hhdC5pcy50aGUubmFtZS5vZi55b3VyLm9yZ2FuaXphdGlvbmFsLnVuaXQuIiwKLSAgICAgICAgICAgICAgICAiUXVhbCBcdTAwRTkgbyBub21lIGRhIHN1YSB1bmlkYWRlIG9yZ2FuaXphY2lvbmFsPyJ9LAotICAgICAgICB7IldoYXQuaXMudGhlLm5hbWUub2YueW91ci5vcmdhbml6YXRpb24uIiwKLSAgICAgICAgICAgICAgICAiUXVhbCBcdTAwRTkgbyBub21lIGRhIHN1YSBlbXByZXNhPyJ9LAotICAgICAgICB7IldoYXQuaXMudGhlLm5hbWUub2YueW91ci5DaXR5Lm9yLkxvY2FsaXR5LiIsCi0gICAgICAgICAgICAgICAgIlF1YWwgXHUwMEU5IG8gbm9tZSBkYSBzdWEgQ2lkYWRlIG91IExvY2FsaWRhZGU/In0sCi0gICAgICAgIHsiV2hhdC5pcy50aGUubmFtZS5vZi55b3VyLlN0YXRlLm9yLlByb3ZpbmNlLiIsCi0gICAgICAgICAgICAgICAgIlF1YWwgXHUwMEU5IG8gbm9tZSBkbyBzZXUgRXN0YWRvIG91IE11bmljXHUwMEVEcGlvPyJ9LAotICAgICAgICB7IldoYXQuaXMudGhlLnR3by5sZXR0ZXIuY291bnRyeS5jb2RlLmZvci50aGlzLnVuaXQuIiwKLSAgICAgICAgICAgICAgICAiUXVhaXMgc1x1MDBFM28gYXMgZHVhcyBsZXRyYXMgZG8gY1x1MDBGM2RpZ28gZG8gcGFcdTAwRURzIGRlc3RhIHVuaWRhZGU/In0sCi0gICAgICAgIHsiSXMubmFtZS5jb3JyZWN0LiIsICJ7MH0gRXN0XHUwMEUxIGNvcnJldG8/In0sCi0gICAgICAgIHsibm8iLCAiblx1MDBFM28ifSwKLSAgICAgICAgeyJ5ZXMiLCAic2ltIn0sCi0gICAgICAgIHsieSIsICJzIn0sCi0gICAgICAgIHsiLmRlZmF1bHRWYWx1ZS4iLCAiICBbezB9XTogICJ9LAotICAgICAgICB7IkFsaWFzLmFsaWFzLmhhcy5uby5rZXkiLAotICAgICAgICAgICAgICAgICJPIGFsaWFzIDx7MH0+IG5cdTAwRTNvIHRlbSBjaGF2ZSJ9LAotICAgICAgICB7IkFsaWFzLmFsaWFzLnJlZmVyZW5jZXMuYW4uZW50cnkudHlwZS50aGF0LmlzLm5vdC5hLnByaXZhdGUua2V5LmVudHJ5LlRoZS5rZXljbG9uZS5jb21tYW5kLm9ubHkuc3VwcG9ydHMuY2xvbmluZy5vZi5wcml2YXRlLmtleSIsCi0gICAgICAgICAgICAgICAgICJPIGFsaWFzIDx7MH0+IGZheiByZWZlclx1MDBFQW5jaWEgYSB1bSB0aXBvIGRlIGVudHJhZGEgcXVlIG5cdTAwRTNvIFx1MDBFOSB1bWEgZW50cmFkYSBkZSBjaGF2ZSBwcml2YWRhLiBPIGNvbWFuZG8gLWtleWNsb25lIG9mZXJlY2Ugc3Vwb3J0ZSBzb21lbnRlIFx1MDBFMCBjbG9uYWdlbSBkZSBlbnRyYWRhcyBkZSBjaGF2ZSBwcml2YWRhIn0sCi0KLSAgICAgICAgeyIuV0FSTklORy5XQVJOSU5HLldBUk5JTkcuIiwKLSAgICAgICAgICAgICIqKioqKioqKioqKioqKioqKiAgQWR2ZXJ0XHUwMEVBbmNpYSBBZHZlcnRcdTAwRUFuY2lhIEFkdmVydFx1MDBFQW5jaWEgICoqKioqKioqKioqKioqKioqIn0sCi0gICAgICAgIHsiU2lnbmVyLmQuIiwgIlNpZ25hdFx1MDBFMXJpbyAjJWQ6In0sCi0gICAgICAgIHsiVGltZXN0YW1wLiIsICJUaW1lc3RhbXA6In0sCi0gICAgICAgIHsiU2lnbmF0dXJlLiIsICJBc3NpbmF0dXJhOiJ9LAotICAgICAgICB7IkNSTHMuIiwgIkNSTHM6In0sCi0gICAgICAgIHsiQ2VydGlmaWNhdGUub3duZXIuIiwgIlByb3ByaWV0XHUwMEUxcmlvIGRvIGNlcnRpZmljYWRvOiAifSwKLSAgICAgICAgeyJOb3QuYS5zaWduZWQuamFyLmZpbGUiLCAiTlx1MDBFM28gXHUwMEU5IHVtIGFycXVpdm8gamFyIGFzc2luYWRvIn0sCi0gICAgICAgIHsiTm8uY2VydGlmaWNhdGUuZnJvbS50aGUuU1NMLnNlcnZlciIsCi0gICAgICAgICAgICAgICAgIk5cdTAwRTNvIFx1MDBFOSB1bSBjZXJ0aWZpY2FkbyBkbyBzZXJ2aWRvciBTU0wifSwKLQotICAgICAgICB7Ii5UaGUuaW50ZWdyaXR5Lm9mLnRoZS5pbmZvcm1hdGlvbi5zdG9yZWQuaW4ueW91ci5rZXlzdG9yZS4iLAotICAgICAgICAgICAgIiogQSBpbnRlZ3JpZGFkZSBkYXMgaW5mb3JtYVx1MDBFN1x1MDBGNWVzIGFybWF6ZW5hZGFzIG5hIHN1YSBcdTAwRTFyZWEgZGUgYXJtYXplbmFtZW50byBkZSBjaGF2ZXMgICpcbiogTlx1MDBDM08gZm9pIHZlcmlmaWNhZGEhICBQYXJhIHF1ZSBzZWphIHBvc3NcdTAwRUR2ZWwgdmVyaWZpY2FyIHN1YSBpbnRlZ3JpZGFkZSwgKlxuKiB2b2NcdTAwRUEgZGV2ZSBmb3JuZWNlciBhIHNlbmhhIGRhIFx1MDBFMXJlYSBkZSBhcm1hemVuYW1lbnRvIGRlIGNoYXZlcy4gICAgICAgICAgICAgICAgICAqIn0sCi0gICAgICAgIHsiLlRoZS5pbnRlZ3JpdHkub2YudGhlLmluZm9ybWF0aW9uLnN0b3JlZC5pbi50aGUuc3Jja2V5c3RvcmUuIiwKLSAgICAgICAgICAgICIqIEEgaW50ZWdyaWRhZGUgZGFzIGluZm9ybWFcdTAwRTdcdTAwRjVlcyBhcm1hemVuYWRhcyBubyBzcmNrZXlzdG9yZSAgKlxuKiBOXHUwMEMzTyBmb2kgdmVyaWZpY2FkYSEgIFBhcmEgcXVlIHNlamEgcG9zc1x1MDBFRHZlbCB2ZXJpZmljYXIgc3VhIGludGVncmlkYWRlLCAqXG4qIHZvY1x1MDBFQSBkZXZlIGZvcm5lY2VyIGEgc2VuaGEgZG8gc3Jja2V5c3RvcmUuICAgICAgICAgICAgICAgICAgKiJ9LAotCi0gICAgICAgIHsiQ2VydGlmaWNhdGUucmVwbHkuZG9lcy5ub3QuY29udGFpbi5wdWJsaWMua2V5LmZvci5hbGlhcy4iLAotICAgICAgICAgICAgICAgICJBIHJlc3Bvc3RhIGRvIGNlcnRpZmljYWRvIG5cdTAwRTNvIGNvbnRcdTAwRTltIGEgY2hhdmUgcFx1MDBGQWJsaWNhIGRlIDx7MH0+In0sCi0gICAgICAgIHsiSW5jb21wbGV0ZS5jZXJ0aWZpY2F0ZS5jaGFpbi5pbi5yZXBseSIsCi0gICAgICAgICAgICAgICAgIkNhZGVpYSBkZSBjZXJ0aWZpY2Fkb3MgaW5jb21wbGV0YSBuYSByZXNwb3N0YSJ9LAotICAgICAgICB7IkNlcnRpZmljYXRlLmNoYWluLmluLnJlcGx5LmRvZXMubm90LnZlcmlmeS4iLAotICAgICAgICAgICAgICAgICJBIGNhZGVpYSBkZSBjZXJ0aWZpY2Fkb3MgZGEgcmVzcG9zdGEgblx1MDBFM28gdmVyaWZpY2E6ICJ9LAotICAgICAgICB7IlRvcC5sZXZlbC5jZXJ0aWZpY2F0ZS5pbi5yZXBseS4iLAotICAgICAgICAgICAgICAgICJDZXJ0aWZpY2FkbyBkZSBuXHUwMEVEdmVsIHN1cGVyaW9yIG5hIHJlc3Bvc3RhOlxuIn0sCi0gICAgICAgIHsiLmlzLm5vdC50cnVzdGVkLiIsICIuLi4gblx1MDBFM28gXHUwMEU5IGNvbmZpXHUwMEUxdmVsLiAifSwKLSAgICAgICAgeyJJbnN0YWxsLnJlcGx5LmFueXdheS5uby4iLCAiSW5zdGFsYXIgcmVzcG9zdGEgYXNzaW0gbWVzbW8/IFtuXHUwMEUzb106ICAifSwKLSAgICAgICAgeyJOTyIsICJOXHUwMEUzbyJ9LAotICAgICAgICB7IlB1YmxpYy5rZXlzLmluLnJlcGx5LmFuZC5rZXlzdG9yZS5kb24udC5tYXRjaCIsCi0gICAgICAgICAgICAgICAgIkFzIGNoYXZlcyBwXHUwMEZBYmxpY2FzIGRhIHJlc3Bvc3RhIGUgZGEgXHUwMEUxcmVhIGRlIGFybWF6ZW5hbWVudG8gZGUgY2hhdmVzIG5cdTAwRTNvIGNvcnJlc3BvbmRlbSJ9LAotICAgICAgICB7IkNlcnRpZmljYXRlLnJlcGx5LmFuZC5jZXJ0aWZpY2F0ZS5pbi5rZXlzdG9yZS5hcmUuaWRlbnRpY2FsIiwKLSAgICAgICAgICAgICAgICAiTyBjZXJ0aWZpY2FkbyBkYSByZXNwb3N0YSBlIG8gY2VydGlmaWNhZG8gZGEgXHUwMEUxcmVhIGRlIGFybWF6ZW5hbWVudG8gZGUgY2hhdmVzIHNcdTAwRTNvIGlkXHUwMEVBbnRpY29zIn0sCi0gICAgICAgIHsiRmFpbGVkLnRvLmVzdGFibGlzaC5jaGFpbi5mcm9tLnJlcGx5IiwKLSAgICAgICAgICAgICAgICAiRmFsaGEgYW8gZXN0YWJlbGVjZXIgYSBjYWRlaWEgYSBwYXJ0aXIgZGEgcmVzcG9zdGEifSwKLSAgICAgICAgeyJuIiwgIm4ifSwKLSAgICAgICAgeyJXcm9uZy5hbnN3ZXIudHJ5LmFnYWluIiwgIlJlc3Bvc3RhIGVycmFkYTsgdGVudGUgbm92YW1lbnRlIn0sCi0gICAgICAgIHsiU2VjcmV0LmtleS5ub3QuZ2VuZXJhdGVkLmFsaWFzLmFsaWFzLmFscmVhZHkuZXhpc3RzIiwKLSAgICAgICAgICAgICAgICAiQ2hhdmUgc2VjcmV0YSBuXHUwMEUzbyBnZXJhZGE7IG8gYWxpYXMgPHswfT4galx1MDBFMSBleGlzdGUifSwKLSAgICAgICAgeyJQbGVhc2UucHJvdmlkZS5rZXlzaXplLmZvci5zZWNyZXQua2V5LmdlbmVyYXRpb24iLAotICAgICAgICAgICAgICAgICJGb3JuZVx1MDBFN2EgbyAta2V5c2l6ZSBwYXJhIGEgZ2VyYVx1MDBFN1x1MDBFM28gZGEgY2hhdmUgc2VjcmV0YSJ9LAotCi0gICAgICAgIHsiRXh0ZW5zaW9ucy4iLCAiRXh0ZW5zXHUwMEY1ZXM6ICJ9LAotICAgICAgICB7Ii5FbXB0eS52YWx1ZS4iLCAiKFZhbG9yIHZhemlvKSJ9LAotICAgICAgICB7IkV4dGVuc2lvbi5SZXF1ZXN0LiIsICJTb2xpY2l0YVx1MDBFN1x1MDBFM28gZGUgRXh0ZW5zXHUwMEUzbzoifSwKLSAgICAgICAgeyJQS0NTLjEwLkNlcnRpZmljYXRlLlJlcXVlc3QuVmVyc2lvbi4xLjAuU3ViamVjdC5zLlB1YmxpYy5LZXkucy5mb3JtYXQucy5rZXkuIiwKLSAgICAgICAgICAgICAgICAiU29saWNpdGFcdTAwRTdcdTAwRTNvIGRvIENlcnRpZmljYWRvIFBLQ1MgIzEwIChWZXJzXHUwMEUzbyAxLjApXG5Bc3N1bnRvOiAlc1xuQ2hhdmUgUFx1MDBGQWJsaWNhOiAlcyBmb3JtYXRvICVzIGNoYXZlXG4ifSwKLSAgICAgICAgeyJVbmtub3duLmtleVVzYWdlLnR5cGUuIiwgIlRpcG8gZGUga2V5VXNhZ2UgZGVzY29uaGVjaWRvOiAifSwKLSAgICAgICAgeyJVbmtub3duLmV4dGVuZGVka2V5VXNhZ2UudHlwZS4iLCAiVGlwbyBkZSBleHRlbmRlZGtleVVzYWdlIGRlc2NvbmhlY2lkbzogIn0sCi0gICAgICAgIHsiVW5rbm93bi5BY2Nlc3NEZXNjcmlwdGlvbi50eXBlLiIsICJUaXBvIGRlIEFjY2Vzc0Rlc2NyaXB0aW9uIGRlc2NvbmhlY2lkbzogIn0sCi0gICAgICAgIHsiVW5yZWNvZ25pemVkLkdlbmVyYWxOYW1lLnR5cGUuIiwgIlRpcG8gZGUgR2VuZXJhbE5hbWUgblx1MDBFM28gcmVjb25oZWNpZG86ICJ9LAotICAgICAgICB7IlRoaXMuZXh0ZW5zaW9uLmNhbm5vdC5iZS5tYXJrZWQuYXMuY3JpdGljYWwuIiwKLSAgICAgICAgICAgICAgICAgIkVzdGEgZXh0ZW5zXHUwMEUzbyBuXHUwMEUzbyBwb2RlIHNlciBtYXJjYWRhIGNvbW8gY3JcdTAwRUR0aWNhLiAifSwKLSAgICAgICAgeyJPZGQubnVtYmVyLm9mLmhleC5kaWdpdHMuZm91bmQuIiwgIkVuY29udHJhZG8gblx1MDBGQW1lcm8gXHUwMEVEbXBhciBkZSBzZWlzIGRcdTAwRURnaXRvczogIn0sCi0gICAgICAgIHsiVW5rbm93bi5leHRlbnNpb24udHlwZS4iLCAiVGlwbyBkZSBleHRlbnNcdTAwRTNvIGRlc2NvbmhlY2lkbzogIn0sCi0gICAgICAgIHsiY29tbWFuZC57MH0uaXMuYW1iaWd1b3VzLiIsICJvIGNvbWFuZG8gezB9IFx1MDBFOSBhbWJcdTAwRURndW86In0sCi0KLSAgICAgICAgLy8gcG9saWN5dG9vbAotICAgICAgICB7Ildhcm5pbmcuQS5wdWJsaWMua2V5LmZvci5hbGlhcy5zaWduZXJzLmkuZG9lcy5ub3QuZXhpc3QuTWFrZS5zdXJlLmEuS2V5U3RvcmUuaXMucHJvcGVybHkuY29uZmlndXJlZC4iLAotICAgICAgICAgICAgICAgICJBZHZlcnRcdTAwRUFuY2lhOiBOXHUwMEUzbyBleGlzdGUgdW1hIGNoYXZlIHBcdTAwRkFibGljYSBwYXJhIG8gYWxpYXMgezB9LiBDZXJ0aWZpcXVlLXNlIGRlIHF1ZSB1bSBLZXlTdG9yZSBlc3RlamEgY29uZmlndXJhZG8gYWRlcXVhZGFtZW50ZS4ifSwKLSAgICAgICAgeyJXYXJuaW5nLkNsYXNzLm5vdC5mb3VuZC5jbGFzcyIsICJBZHZlcnRcdTAwRUFuY2lhOiBDbGFzc2Ugblx1MDBFM28gZW5jb250cmFkYTogezB9In0sCi0gICAgICAgIHsiV2FybmluZy5JbnZhbGlkLmFyZ3VtZW50LnMuZm9yLmNvbnN0cnVjdG9yLmFyZyIsCi0gICAgICAgICAgICAgICAgIkFkdmVydFx1MDBFQW5jaWE6IEFyZ3VtZW50byhzKSBpbnZcdTAwRTFsaWRvKHMpIHBhcmEgbyBjb25zdHJ1dG9yOiB7MH0ifSwKLSAgICAgICAgeyJJbGxlZ2FsLlByaW5jaXBhbC5UeXBlLnR5cGUiLCAiVGlwbyBQcmluY2lwYWwgSW52XHUwMEUxbGlkbzogezB9In0sCi0gICAgICAgIHsiSWxsZWdhbC5vcHRpb24ub3B0aW9uIiwgIk9wXHUwMEU3XHUwMEUzbyBpbnZcdTAwRTFsaWRhOiB7MH0ifSwKLSAgICAgICAgeyJVc2FnZS5wb2xpY3l0b29sLm9wdGlvbnMuIiwgIlVzbzogcG9saWN5dG9vbCBbb3BcdTAwRTdcdTAwRjVlc10ifSwKLSAgICAgICAgeyIuZmlsZS5maWxlLnBvbGljeS5maWxlLmxvY2F0aW9uIiwKLSAgICAgICAgICAgICAgICAiICBbLWZpbGUgPGFycXVpdm8+XSAgICBsb2NhbGl6YVx1MDBFN1x1MDBFM28gZG8gYXJxdWl2byBkZSBwb2xcdTAwRUR0aWNhIn0sCi0gICAgICAgIHsiTmV3IiwgIk5vdm8ifSwKLSAgICAgICAgeyJPcGVuIiwgIkFicmlyIn0sCi0gICAgICAgIHsiU2F2ZSIsICJTYWx2YXIifSwKLSAgICAgICAgeyJTYXZlLkFzIiwgIlNhbHZhciBDb21vIn0sCi0gICAgICAgIHsiVmlldy5XYXJuaW5nLkxvZyIsICJFeGliaXIgTG9nIGRlIEFkdmVydFx1MDBFQW5jaWFzIn0sCi0gICAgICAgIHsiRXhpdCIsICJTYWlyIn0sCi0gICAgICAgIHsiQWRkLlBvbGljeS5FbnRyeSIsICJBZGljaW9uYXIgRW50cmFkYSBkZSBQb2xcdTAwRUR0aWNhIn0sCi0gICAgICAgIHsiRWRpdC5Qb2xpY3kuRW50cnkiLCAiRWRpdGFyIEVudHJhZGEgZGUgUG9sXHUwMEVEdGljYSJ9LAotICAgICAgICB7IlJlbW92ZS5Qb2xpY3kuRW50cnkiLCAiUmVtb3ZlciBFbnRyYWRhIGRlIFBvbFx1MDBFRHRpY2EifSwKLSAgICAgICAgeyJFZGl0IiwgIkVkaXRhciJ9LAotICAgICAgICB7IlJldGFpbiIsICJSZXRlciJ9LAotCi0gICAgICAgIHsiV2FybmluZy5GaWxlLm5hbWUubWF5LmluY2x1ZGUuZXNjYXBlZC5iYWNrc2xhc2guY2hhcmFjdGVycy5JdC5pcy5ub3QubmVjZXNzYXJ5LnRvLmVzY2FwZS5iYWNrc2xhc2guY2hhcmFjdGVycy50aGUudG9vbC5lc2NhcGVzIiwKLSAgICAgICAgICAgICJBZHZlcnRcdTAwRUFuY2lhOiBPIG5vbWUgZG8gYXJxdWl2byBwb2RlIGNvbnRlciBjYXJhY3RlcmVzIGRlIGVzY2FwZSBiYXJyYSBpbnZlcnRpZGEuIE5cdTAwRTNvIFx1MDBFOSBuZWNlc3NcdTAwRTFyaW8gZmF6ZXIgbyBlc2NhcGUgZG9zIGNhcmFjdGVyZXMgZGUgYmFycmEgaW52ZXJ0aWRhIChhIGZlcnJhbWVudGEgZmF6IG8gZXNjYXBlIGRvcyBjYXJhY3RlcmVzIGNvbmZvcm1lIG5lY2Vzc1x1MDBFMXJpbyBhbyBncmF2YXIgbyBjb250ZVx1MDBGQWRvIGRhIHBvbFx1MDBFRHRpY2Egbm8gYXJtYXplbmFtZW50byBwZXJzaXN0ZW50ZSkuXG5cbkNsaXF1ZSBlbSBSZXRlciBwYXJhIHJldGVyIG8gbm9tZSBkYSBlbnRyYWRhIG91IGNsaXF1ZSBlbSBFZGl0YXIgcGFyYSBlZGl0XHUwMEUxLWxvLiJ9LAotCi0gICAgICAgIHsiQWRkLlB1YmxpYy5LZXkuQWxpYXMiLCAiQWRpY2lvbmFyIEFsaWFzIGRlIENoYXZlIFBcdTAwRkFibGljYSJ9LAotICAgICAgICB7IlJlbW92ZS5QdWJsaWMuS2V5LkFsaWFzIiwgIlJlbW92ZXIgQWxpYXMgZGUgQ2hhdmUgUFx1MDBGQWJsaWNhIn0sCi0gICAgICAgIHsiRmlsZSIsICJBcnF1aXZvIn0sCi0gICAgICAgIHsiS2V5U3RvcmUiLCAiS2V5U3RvcmUifSwKLSAgICAgICAgeyJQb2xpY3kuRmlsZS4iLCAiQXJxdWl2byBkZSBQb2xcdTAwRUR0aWNhOiJ9LAotICAgICAgICB7IkNvdWxkLm5vdC5vcGVuLnBvbGljeS5maWxlLnBvbGljeUZpbGUuZS50b1N0cmluZy4iLAotICAgICAgICAgICAgICAgICJOXHUwMEUzbyBmb2kgcG9zc1x1MDBFRHZlbCBhYnJpciBvIGFycXVpdm8gZGUgcG9sXHUwMEVEdGljYTogezB9OiB7MX0ifSwKLSAgICAgICAgeyJQb2xpY3kuVG9vbCIsICJGZXJyYW1lbnRhIGRlIFBvbFx1MDBFRHRpY2EifSwKLSAgICAgICAgeyJFcnJvcnMuaGF2ZS5vY2N1cnJlZC53aGlsZS5vcGVuaW5nLnRoZS5wb2xpY3kuY29uZmlndXJhdGlvbi5WaWV3LnRoZS5XYXJuaW5nLkxvZy5mb3IubW9yZS5pbmZvcm1hdGlvbi4iLAotICAgICAgICAgICAgICAgICJFcnJvcyBkdXJhbnRlIGEgYWJlcnR1cmEgZGEgY29uZmlndXJhXHUwMEU3XHUwMEUzbyBkYSBwb2xcdTAwRUR0aWNhLiBDb25zdWx0ZSBvIExvZyBkZSBBZHZlcnRcdTAwRUFuY2lhcyBwYXJhIG9idGVyIG1haXMgaW5mb3JtYVx1MDBFN1x1MDBGNWVzLiJ9LAotICAgICAgICB7IkVycm9yIiwgIkVycm8ifSwKLSAgICAgICAgeyJPSyIsICJPSyJ9LAotICAgICAgICB7IlN0YXR1cyIsICJTdGF0dXMifSwKLSAgICAgICAgeyJXYXJuaW5nIiwgIkFkdmVydFx1MDBFQW5jaWEifSwKLSAgICAgICAgeyJQZXJtaXNzaW9uLiIsCi0gICAgICAgICAgICAgICAgIlBlcm1pc3NcdTAwRTNvOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifSwKLSAgICAgICAgeyJQcmluY2lwYWwuVHlwZS4iLCAiVGlwbyBkbyBQcmluY2lwYWw6In0sCi0gICAgICAgIHsiUHJpbmNpcGFsLk5hbWUuIiwgIk5vbWUgZG8gUHJpbmNpcGFsOiJ9LAotICAgICAgICB7IlRhcmdldC5OYW1lLiIsCi0gICAgICAgICAgICAgICAgIk5vbWUgZG8gQWx2bzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIn0sCi0gICAgICAgIHsiQWN0aW9ucy4iLAotICAgICAgICAgICAgICAgICJBXHUwMEU3XHUwMEY1ZXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9LAotICAgICAgICB7Ik9LLnRvLm92ZXJ3cml0ZS5leGlzdGluZy5maWxlLmZpbGVuYW1lLiIsCi0gICAgICAgICAgICAgICAgIkVzdFx1MDBFMSBjb3JyZXRvIHN1YnN0aXR1aXIgbyBhcnF1aXZvIGV4aXN0ZW50ZSB7MH0/In0sCi0gICAgICAgIHsiQ2FuY2VsIiwgIkNhbmNlbGFyIn0sCi0gICAgICAgIHsiQ29kZUJhc2UuIiwgIkNvZGVCYXNlOiJ9LAotICAgICAgICB7IlNpZ25lZEJ5LiIsICJTaWduZWRCeToifSwKLSAgICAgICAgeyJBZGQuUHJpbmNpcGFsIiwgIkFkaWNpb25hciBQcmluY2lwYWwifSwKLSAgICAgICAgeyJFZGl0LlByaW5jaXBhbCIsICJFZGl0YXIgUHJpbmNpcGFsIn0sCi0gICAgICAgIHsiUmVtb3ZlLlByaW5jaXBhbCIsICJSZW1vdmVyIFByaW5jaXBhbCJ9LAotICAgICAgICB7IlByaW5jaXBhbHMuIiwgIlByaW5jaXBhaXM6In0sCi0gICAgICAgIHsiLkFkZC5QZXJtaXNzaW9uIiwgIiAgQWRpY2lvbmFyIFBlcm1pc3NcdTAwRTNvIn0sCi0gICAgICAgIHsiLkVkaXQuUGVybWlzc2lvbiIsICIgIEVkaXRhciBQZXJtaXNzXHUwMEUzbyJ9LAotICAgICAgICB7IlJlbW92ZS5QZXJtaXNzaW9uIiwgIlJlbW92ZXIgUGVybWlzc1x1MDBFM28ifSwKLSAgICAgICAgeyJEb25lIiwgIkNvbmNsdVx1MDBFRGRvIn0sCi0gICAgICAgIHsiS2V5U3RvcmUuVVJMLiIsICJVUkwgZG8gS2V5U3RvcmU6In0sCi0gICAgICAgIHsiS2V5U3RvcmUuVHlwZS4iLCAiVGlwbyBkZSBLZXlTdG9yZToifSwKLSAgICAgICAgeyJLZXlTdG9yZS5Qcm92aWRlci4iLCAiRm9ybmVjZWRvciBkZSBLZXlTdG9yZToifSwKLSAgICAgICAgeyJLZXlTdG9yZS5QYXNzd29yZC5VUkwuIiwgIlVSTCBkYSBTZW5oYSBkbyBLZXlTdG9yZToifSwKLSAgICAgICAgeyJQcmluY2lwYWxzIiwgIlByaW5jaXBhaXMifSwKLSAgICAgICAgeyIuRWRpdC5QcmluY2lwYWwuIiwgIiAgRWRpdGFyIFByaW5jaXBhbDoifSwKLSAgICAgICAgeyIuQWRkLk5ldy5QcmluY2lwYWwuIiwgIiAgQWRpY2lvbmFyIE5vdm8gUHJpbmNpcGFsOiJ9LAotICAgICAgICB7IlBlcm1pc3Npb25zIiwgIlBlcm1pc3NcdTAwRjVlcyJ9LAotICAgICAgICB7Ii5FZGl0LlBlcm1pc3Npb24uIiwgIiAgRWRpdGFyIFBlcm1pc3NcdTAwRTNvOiJ9LAotICAgICAgICB7Ii5BZGQuTmV3LlBlcm1pc3Npb24uIiwgIiAgQWRpY2lvbmFyIE5vdmEgUGVybWlzc1x1MDBFM286In0sCi0gICAgICAgIHsiU2lnbmVkLkJ5LiIsICJBc3NpbmFkbyBwb3I6In0sCi0gICAgICAgIHsiQ2Fubm90LlNwZWNpZnkuUHJpbmNpcGFsLndpdGguYS5XaWxkY2FyZC5DbGFzcy53aXRob3V0LmEuV2lsZGNhcmQuTmFtZSIsCi0gICAgICAgICAgICAiTlx1MDBFM28gXHUwMEU5IFBvc3NcdTAwRUR2ZWwgRXNwZWNpZmljYXIgdW0gUHJpbmNpcGFsIGNvbSB1bWEgQ2xhc3NlIGRlIEN1cmluZ2Egc2VtIHVtIE5vbWUgZGUgQ3VyaW5nYSJ9LAotICAgICAgICB7IkNhbm5vdC5TcGVjaWZ5LlByaW5jaXBhbC53aXRob3V0LmEuTmFtZSIsCi0gICAgICAgICAgICAiTlx1MDBFM28gXHUwMEU5IFBvc3NcdTAwRUR2ZWwgRXNwZWNpZmljYXIgdW0gUHJpbmNpcGFsIHNlbSB1bSBOb21lIn0sCi0gICAgICAgIHsiUGVybWlzc2lvbi5hbmQuVGFyZ2V0Lk5hbWUubXVzdC5oYXZlLmEudmFsdWUiLAotICAgICAgICAgICAgICAgICJPIE5vbWUgZGUgRGVzdGlubyBlIGEgUGVybWlzc1x1MDBFM28gZGV2ZW0gdGVyIHVtIFZhbG9yIn0sCi0gICAgICAgIHsiUmVtb3ZlLnRoaXMuUG9saWN5LkVudHJ5LiIsICJSZW1vdmVyIGVzdGEgRW50cmFkYSBkZSBQb2xcdTAwRUR0aWNhPyJ9LAotICAgICAgICB7Ik92ZXJ3cml0ZS5GaWxlIiwgIlN1YnN0aXR1aXIgQXJxdWl2byJ9LAotICAgICAgICB7IlBvbGljeS5zdWNjZXNzZnVsbHkud3JpdHRlbi50by5maWxlbmFtZSIsCi0gICAgICAgICAgICAgICAgIlBvbFx1MDBFRHRpY2EgZ3JhdmFkYSBjb20gXHUwMEVBeGl0byBlbSB7MH0ifSwKLSAgICAgICAgeyJudWxsLmZpbGVuYW1lIiwgIm5vbWUgZGUgYXJxdWl2byBudWxvIn0sCi0gICAgICAgIHsiU2F2ZS5jaGFuZ2VzLiIsICJTYWx2YXIgYWx0ZXJhXHUwMEU3XHUwMEY1ZXM/In0sCi0gICAgICAgIHsiWWVzIiwgIlNpbSJ9LAotICAgICAgICB7Ik5vIiwgIk5cdTAwRTNvIn0sCi0gICAgICAgIHsiUG9saWN5LkVudHJ5IiwgIkVudHJhZGEgZGUgUG9sXHUwMEVEdGljYSJ9LAotICAgICAgICB7IlNhdmUuQ2hhbmdlcyIsICJTYWx2YXIgQWx0ZXJhXHUwMEU3XHUwMEY1ZXMifSwKLSAgICAgICAgeyJOby5Qb2xpY3kuRW50cnkuc2VsZWN0ZWQiLCAiTmVuaHVtYSBFbnRyYWRhIGRlIFBvbFx1MDBFRHRpY2EgU2VsZWNpb25hZGEifSwKLSAgICAgICAgeyJVbmFibGUudG8ub3Blbi5LZXlTdG9yZS5leC50b1N0cmluZy4iLAotICAgICAgICAgICAgICAgICJOXHUwMEUzbyBcdTAwRTkgcG9zc1x1MDBFRHZlbCBhYnJpciBhIEtleVN0b3JlOiB7MH0ifSwKLSAgICAgICAgeyJOby5wcmluY2lwYWwuc2VsZWN0ZWQiLCAiTmVuaHVtIHByaW5jaXBhbCBzZWxlY2lvbmFkbyJ9LAotICAgICAgICB7Ik5vLnBlcm1pc3Npb24uc2VsZWN0ZWQiLCAiTmVuaHVtYSBwZXJtaXNzXHUwMEUzbyBzZWxlY2lvbmFkYSJ9LAotICAgICAgICB7Im5hbWUiLCAibm9tZSJ9LAotICAgICAgICB7ImNvbmZpZ3VyYXRpb24udHlwZSIsICJ0aXBvIGRlIGNvbmZpZ3VyYVx1MDBFN1x1MDBFM28ifSwKLSAgICAgICAgeyJlbnZpcm9ubWVudC52YXJpYWJsZS5uYW1lIiwgIm5vbWUgZGEgdmFyaVx1MDBFMXZlbCBkZSBhbWJpZW50ZSJ9LAotICAgICAgICB7ImxpYnJhcnkubmFtZSIsICJub21lIGRhIGJpYmxpb3RlY2EifSwKLSAgICAgICAgeyJwYWNrYWdlLm5hbWUiLCAibm9tZSBkbyBwYWNvdGUifSwKLSAgICAgICAgeyJwb2xpY3kudHlwZSIsICJ0aXBvIGRlIHBvbFx1MDBFRHRpY2EifSwKLSAgICAgICAgeyJwcm9wZXJ0eS5uYW1lIiwgIm5vbWUgZGEgcHJvcHJpZWRhZGUifSwKLSAgICAgICAgeyJQcmluY2lwYWwuTGlzdCIsICJMaXN0YSBkZSBQcmluY2lwYWlzIn0sCi0gICAgICAgIHsiUGVybWlzc2lvbi5MaXN0IiwgIkxpc3RhIGRlIFBlcm1pc3NcdTAwRjVlcyJ9LAotICAgICAgICB7IkNvZGUuQmFzZSIsICJCYXNlIGRlIENcdTAwRjNkaWdvIn0sCi0gICAgICAgIHsiS2V5U3RvcmUuVS5SLkwuIiwgIlUgUiBMIGRhIEtleVN0b3JlOiJ9LAotICAgICAgICB7IktleVN0b3JlLlBhc3N3b3JkLlUuUi5MLiIsICJVIFIgTCBkYSBTZW5oYSBkbyBLZXlTdG9yZToifSwKLQotCiAgICAgICAgIC8vIGphdmF4LnNlY3VyaXR5LmF1dGguUHJpdmF0ZUNyZWRlbnRpYWxQZXJtaXNzaW9uCiAgICAgICAgIHsiaW52YWxpZC5udWxsLmlucHV0LnMuIiwgImVudHJhZGEocykgbnVsYShzKSBpbnZcdTAwRTFsaWRhKHMpIn0sCiAgICAgICAgIHsiYWN0aW9ucy5jYW4ub25seS5iZS5yZWFkLiIsICJhcyBhXHUwMEU3XHUwMEY1ZXMgc1x1MDBGMyBwb2RlbSBzZXIgJ2xpZGFzJyJ9LApAQCAtNTUzLDYgKzU4LDcgQEAKICAgICAgICAgeyJwcm92aWRlZC5udWxsLk9JRC5tYXAiLCAibWFwYSBPSUQgbnVsbyBmb3JuZWNpZG8ifSwKIAogICAgICAgICAvLyBqYXZheC5zZWN1cml0eS5hdXRoLlN1YmplY3QKKyAgICAgICAgeyJORVdMSU5FIiwgIlxuIn0sCiAgICAgICAgIHsiaW52YWxpZC5udWxsLkFjY2Vzc0NvbnRyb2xDb250ZXh0LnByb3ZpZGVkIiwKICAgICAgICAgICAgICAgICAiQWNjZXNzQ29udHJvbENvbnRleHQgbnVsbyBpbnZcdTAwRTFsaWRvIGZvcm5lY2lkbyJ9LAogICAgICAgICB7ImludmFsaWQubnVsbC5hY3Rpb24ucHJvdmlkZWQiLCAiYVx1MDBFN1x1MDBFM28gbnVsYSBpbnZcdTAwRTFsaWRhIGZvcm5lY2lkYSJ9LApAQCAtNjU2LDYgKzE2Miw3IEBACiAgICAgICoKICAgICAgKiBAcmV0dXJuIHRoZSBjb250ZW50cyBvZiB0aGlzIDxjb2RlPlJlc291cmNlQnVuZGxlPC9jb2RlPi4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgT2JqZWN0W11bXSBnZXRDb250ZW50cygpIHsKICAgICAgICAgcmV0dXJuIGNvbnRlbnRzOwogICAgIH0KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdXRpbC9SZXNvdXJjZXNfc3YuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdXRpbC9SZXNvdXJjZXNfc3YuamF2YQppbmRleCA4ZmYwZTNlLi5lMTZjMWY3IDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3V0aWwvUmVzb3VyY2VzX3N2LmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS91dGlsL1Jlc291cmNlc19zdi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMzQsNTAxICszNCw2IEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXVtdIGNvbnRlbnRzID0gewogCi0gICAgICAgIC8vIHNoYXJlZCAoZnJvbSBqYXJzaWduZXIpCi0gICAgICAgIHsiU1BBQ0UiLCAiICJ9LAotICAgICAgICB7IjJTUEFDRSIsICIgICJ9LAotICAgICAgICB7IjZTUEFDRSIsICIgICAgICAifSwKLSAgICAgICAgeyJDT01NQSIsICIsICJ9LAotICAgICAgICAvLyBzaGFyZWQgKGZyb20ga2V5dG9vbCkKLSAgICAgICAgeyJORVdMSU5FIiwgIlxuIn0sCi0gICAgICAgIHsiU1RBUiIsCi0gICAgICAgICAgICAgICAgIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioifSwKLSAgICAgICAgeyJTVEFSTk4iLAotICAgICAgICAgICAgICAgICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cbiJ9LAotCi0gICAgICAgIC8vIGtleXRvb2w6IEhlbHAgcGFydAotLy8gIk9wdGlvbiIgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0gICAgICAgIHsiLk9QVElPTi4iLCAiIFtBbHRlcm5hdGl2XS4uLiJ9LAotICAgICAgICB7Ik9wdGlvbnMuIiwgIkFsdGVybmF0aXY6In0sCi0gICAgICAgIHsiVXNlLmtleXRvb2wuaGVscC5mb3IuYWxsLmF2YWlsYWJsZS5jb21tYW5kcyIsCi0gICAgICAgICAgICAgICAgICJMXHUwMEU0cyBcIkhqXHUwMEU0bHAgLSBOeWNrZWx2ZXJrdHlnXCIgZlx1MDBGNnIgYWxsYSB0aWxsZ1x1MDBFNG5nbGlnYSBrb21tYW5kb24ifSwKLSAgICAgICAgeyJLZXkuYW5kLkNlcnRpZmljYXRlLk1hbmFnZW1lbnQuVG9vbCIsCi0gICAgICAgICAgICAgICAgICJIYW50ZXJpbmdzdmVya3R5ZyBmXHUwMEY2ciBueWNrbGFyIG9jaCBjZXJ0aWZpa2F0In0sCi0gICAgICAgIHsiQ29tbWFuZHMuIiwgIktvbW1hbmRvbjoifSwKLSAgICAgICAgeyJVc2Uua2V5dG9vbC5jb21tYW5kLm5hbWUuaGVscC5mb3IudXNhZ2Uub2YuY29tbWFuZC5uYW1lIiwKLSAgICAgICAgICAgICAgICAiTFx1MDBFNHMgXCJIalx1MDBFNGxwIC0gTnlja2VsdmVya3R5ZyAtIGNvbW1hbmRfbmFtZVwiIG9tIGFudlx1MDBFNG5kbmluZyBhdiBjb21tYW5kX25hbWUifSwKLSAgICAgICAgLy8ga2V5dG9vbDogaGVscDogY29tbWFuZHMKLSAgICAgICAgeyJHZW5lcmF0ZXMuYS5jZXJ0aWZpY2F0ZS5yZXF1ZXN0IiwKLSAgICAgICAgICAgICAgICAiR2VuZXJlcmFyIGNlcnRpZmlrYXRiZWdcdTAwRTRyYW4ifSwgLy8tY2VydHJlcQotICAgICAgICB7IkNoYW5nZXMuYW4uZW50cnkucy5hbGlhcyIsCi0gICAgICAgICAgICAgICAgIlx1MDBDNG5kcmFyIHBvc3RhbGlhcyJ9LCAvLy1jaGFuZ2VhbGlhcwotICAgICAgICB7IkRlbGV0ZXMuYW4uZW50cnkiLAotICAgICAgICAgICAgICAgICJUYXIgYm9ydCBwb3N0In0sIC8vLWRlbGV0ZQotICAgICAgICB7IkV4cG9ydHMuY2VydGlmaWNhdGUiLAotICAgICAgICAgICAgICAgICJFeHBvcnRlcmFyIGNlcnRpZmlrYXQifSwgLy8tZXhwb3J0Y2VydAotICAgICAgICB7IkdlbmVyYXRlcy5hLmtleS5wYWlyIiwKLSAgICAgICAgICAgICAgICAiR2VuZXJlcmFyIG55Y2tlbHBhciJ9LCAvLy1nZW5rZXlwYWlyCi0vLyB0cmFuc2xhdGlvbiBvZiAic2VjcmV0IiBrZXkgc2hvdWxkIGJlIGRpZmZlcmVudCB0byAicHJpdmF0ZSIga2V5LgotICAgICAgICB7IkdlbmVyYXRlcy5hLnNlY3JldC5rZXkiLAotICAgICAgICAgICAgICAgICJHZW5lcmVyYXIgaGVtbGlnIG55Y2tlbCJ9LCAvLy1nZW5zZWNrZXkKLSAgICAgICAgeyJHZW5lcmF0ZXMuY2VydGlmaWNhdGUuZnJvbS5hLmNlcnRpZmljYXRlLnJlcXVlc3QiLAotICAgICAgICAgICAgICAgICJHZW5lcmVyYXIgY2VydGlmaWthdCBmclx1MDBFNW4gY2VydGlmaWthdGJlZ1x1MDBFNHJhbiJ9LCAvLy1nZW5jZXJ0Ci0gICAgICAgIHsiR2VuZXJhdGVzLkNSTCIsICJHZW5lcmVyYXIgQ1JMIn0sIC8vLWdlbmNybAotICAgICAgICB7IkltcG9ydHMuZW50cmllcy5mcm9tLmEuSkRLLjEuMS54LnN0eWxlLmlkZW50aXR5LmRhdGFiYXNlIiwKLSAgICAgICAgICAgICAgICAiSW1wb3J0ZXJhciBwb3N0ZXIgZnJcdTAwRTVuIGlkZW50aXRldHNkYXRhYmFzIGkgSkRLIDEuMS54LWZvcm1hdCJ9LCAvLy1pZGVudGl0eWRiCi0gICAgICAgIHsiSW1wb3J0cy5hLmNlcnRpZmljYXRlLm9yLmEuY2VydGlmaWNhdGUuY2hhaW4iLAotICAgICAgICAgICAgICAgICJJbXBvcnRlcmFyIGV0dCBjZXJ0aWZpa2F0IGVsbGVyIGVuIGNlcnRpZmlrYXRrZWRqYSJ9LCAvLy1pbXBvcnRjZXJ0Ci0gICAgICAgIHsiSW1wb3J0cy5vbmUub3IuYWxsLmVudHJpZXMuZnJvbS5hbm90aGVyLmtleXN0b3JlIiwKLSAgICAgICAgICAgICAgICAiSW1wb3J0ZXJhciBlbiBlbGxlciBhbGxhIHBvc3RlciBmclx1MDBFNW4gYW5uYXQgbnlja2VsbGFnZXIifSwgLy8taW1wb3J0a2V5c3RvcmUKLSAgICAgICAgeyJDbG9uZXMuYS5rZXkuZW50cnkiLAotICAgICAgICAgICAgICAgICJLbG9uYXIgZW4gbnlja2VscG9zdCJ9LCAvLy1rZXljbG9uZQotICAgICAgICB7IkNoYW5nZXMudGhlLmtleS5wYXNzd29yZC5vZi5hbi5lbnRyeSIsCi0gICAgICAgICAgICAgICAgIlx1MDBDNG5kcmFyIG55Y2tlbGxcdTAwRjZzZW5vcmRldCBmXHUwMEY2ciBlbiBwb3N0In0sIC8vLWtleXBhc3N3ZAotICAgICAgICB7Ikxpc3RzLmVudHJpZXMuaW4uYS5rZXlzdG9yZSIsCi0gICAgICAgICAgICAgICAgIlZpc2FyIGxpc3RhIFx1MDBGNnZlciBwb3N0ZXIgaSBueWNrZWxsYWdlciJ9LCAvLy1saXN0Ci0gICAgICAgIHsiUHJpbnRzLnRoZS5jb250ZW50Lm9mLmEuY2VydGlmaWNhdGUiLAotICAgICAgICAgICAgICAgICJTa3JpdmVyIHV0IGlubmVoXHUwMEU1bGxldCBpIGV0dCBjZXJ0aWZpa2F0In0sIC8vLXByaW50Y2VydAotICAgICAgICB7IlByaW50cy50aGUuY29udGVudC5vZi5hLmNlcnRpZmljYXRlLnJlcXVlc3QiLAotICAgICAgICAgICAgICAgICJTa3JpdmVyIHV0IGlubmVoXHUwMEU1bGxldCBpIGVuIGNlcnRpZmlrYXRiZWdcdTAwRTRyYW4ifSwgLy8tcHJpbnRjZXJ0cmVxCi0gICAgICAgIHsiUHJpbnRzLnRoZS5jb250ZW50Lm9mLmEuQ1JMLmZpbGUiLAotICAgICAgICAgICAgICAgICJTa3JpdmVyIHV0IGlubmVoXHUwMEU1bGxldCBpIGVuIENSTC1maWwifSwgLy8tcHJpbnRjcmwKLSAgICAgICAgeyJHZW5lcmF0ZXMuYS5zZWxmLnNpZ25lZC5jZXJ0aWZpY2F0ZSIsCi0gICAgICAgICAgICAgICAgIkdlbmVyZXJhciBldHQgc2pcdTAwRTRsdnNpZ25lcmF0IGNlcnRpZmlrYXQifSwgLy8tc2VsZmNlcnQKLSAgICAgICAgeyJDaGFuZ2VzLnRoZS5zdG9yZS5wYXNzd29yZC5vZi5hLmtleXN0b3JlIiwKLSAgICAgICAgICAgICAgICAiXHUwMEM0bmRyYXIgbGFnZXJsXHUwMEY2c2Vub3JkZXQgZlx1MDBGNnIgZXR0IG55Y2tlbGxhZ2VyIn0sIC8vLXN0b3JlcGFzc3dkCi0gICAgICAgIC8vIGtleXRvb2w6IGhlbHA6IG9wdGlvbnMKLSAgICAgICAgeyJhbGlhcy5uYW1lLm9mLnRoZS5lbnRyeS50by5wcm9jZXNzIiwKLSAgICAgICAgICAgICAgICAiYWxpYXNuYW1uIGZcdTAwRjZyIHBvc3Qgc29tIHNrYSBiZWFyYmV0YXMifSwgLy8tYWxpYXMKLSAgICAgICAgeyJkZXN0aW5hdGlvbi5hbGlhcyIsCi0gICAgICAgICAgICAgICAgImRlc3RpbmF0aW9uc2FsaWFzIn0sIC8vLWRlc3RhbGlhcwotICAgICAgICB7ImRlc3RpbmF0aW9uLmtleS5wYXNzd29yZCIsCi0gICAgICAgICAgICAgICAgImxcdTAwRjZzZW5vcmQgZlx1MDBGNnIgZGVzdGluYXRpb25zbnlja2VsIn0sIC8vLWRlc3RrZXlwYXNzCi0gICAgICAgIHsiZGVzdGluYXRpb24ua2V5c3RvcmUubmFtZSIsCi0gICAgICAgICAgICAgICAgIm5hbW4gcFx1MDBFNSBkZXN0aW5hdGlvbnNueWNrZWxsYWdlciJ9LCAvLy1kZXN0a2V5c3RvcmUKLSAgICAgICAgeyJkZXN0aW5hdGlvbi5rZXlzdG9yZS5wYXNzd29yZC5wcm90ZWN0ZWQiLAotICAgICAgICAgICAgICAgICJza3lkZGF0IGxcdTAwRjZzZW5vcmQgZlx1MDBGNnIgZGVzdGluYXRpb25zbnlja2VsbGFnZXIifSwgLy8tZGVzdHByb3RlY3RlZAotICAgICAgICB7ImRlc3RpbmF0aW9uLmtleXN0b3JlLnByb3ZpZGVyLm5hbWUiLAotICAgICAgICAgICAgICAgICJsZXZlcmFudFx1MDBGNnJzbmFtbiBmXHUwMEY2ciBkZXN0aW5hdGlvbnNueWNrZWxsYWdlciJ9LCAvLy1kZXN0cHJvdmlkZXJuYW1lCi0gICAgICAgIHsiZGVzdGluYXRpb24ua2V5c3RvcmUucGFzc3dvcmQiLAotICAgICAgICAgICAgICAgICJsXHUwMEY2c2Vub3JkIGZcdTAwRjZyIGRlc3RpbmF0aW9uc255Y2tlbGxhZ2VyIn0sIC8vLWRlc3RzdG9yZXBhc3MKLSAgICAgICAgeyJkZXN0aW5hdGlvbi5rZXlzdG9yZS50eXBlIiwKLSAgICAgICAgICAgICAgICAidHlwIGF2IGRlc3RpbmF0aW9uc255Y2tlbGxhZ2VyIn0sIC8vLWRlc3RzdG9yZXR5cGUKLSAgICAgICAgeyJkaXN0aW5ndWlzaGVkLm5hbWUiLAotICAgICAgICAgICAgICAgICJ1bmlrdCBuYW1uIn0sIC8vLWRuYW1lCi0gICAgICAgIHsiWC41MDkuZXh0ZW5zaW9uIiwKLSAgICAgICAgICAgICAgICAiWC41MDktdGlsbFx1MDBFNGdnIn0sIC8vLWV4dAotICAgICAgICB7Im91dHB1dC5maWxlLm5hbWUiLAotICAgICAgICAgICAgICAgICJuYW1uIHBcdTAwRTUgdXRkYXRhZmlsIn0sIC8vLWZpbGUgYW5kIC1vdXRmaWxlCi0gICAgICAgIHsiaW5wdXQuZmlsZS5uYW1lIiwKLSAgICAgICAgICAgICAgICAibmFtbiBwXHUwMEU1IGluZGF0YWZpbCJ9LCAvLy1maWxlIGFuZCAtaW5maWxlCi0gICAgICAgIHsia2V5LmFsZ29yaXRobS5uYW1lIiwKLSAgICAgICAgICAgICAgICAibmFtbiBwXHUwMEU1IG55Y2tlbGFsZ29yaXRtIn0sIC8vLWtleWFsZwotICAgICAgICB7ImtleS5wYXNzd29yZCIsCi0gICAgICAgICAgICAgICAgIm55Y2tlbGxcdTAwRjZzZW5vcmQifSwgLy8ta2V5cGFzcwotICAgICAgICB7ImtleS5iaXQuc2l6ZSIsCi0gICAgICAgICAgICAgICAgIm55Y2tlbGJpdHN0b3JsZWsifSwgLy8ta2V5c2l6ZQotICAgICAgICB7ImtleXN0b3JlLm5hbWUiLAotICAgICAgICAgICAgICAgICJuYW1uIHBcdTAwRTUgbnlja2VsbGFnZXIifSwgLy8ta2V5c3RvcmUKLSAgICAgICAgeyJuZXcucGFzc3dvcmQiLAotICAgICAgICAgICAgICAgICJueXR0IGxcdTAwRjZzZW5vcmQifSwgLy8tbmV3Ci0gICAgICAgIHsiZG8ubm90LnByb21wdCIsCi0gICAgICAgICAgICAgICAgImZyXHUwMEU1Z2EgaW50ZSJ9LCAvLy1ub3Byb21wdAotICAgICAgICB7InBhc3N3b3JkLnRocm91Z2gucHJvdGVjdGVkLm1lY2hhbmlzbSIsCi0gICAgICAgICAgICAgICAgImxcdTAwRjZzZW5vcmQgbWVkIHNreWRkYWQgbWVrYW5pc20ifSwgLy8tcHJvdGVjdGVkCi0gICAgICAgIHsicHJvdmlkZXIuYXJndW1lbnQiLAotICAgICAgICAgICAgICAgICJsZXZlcmFudFx1MDBGNnJzYXJndW1lbnQifSwgLy8tcHJvdmlkZXJhcmcKLSAgICAgICAgeyJwcm92aWRlci5jbGFzcy5uYW1lIiwKLSAgICAgICAgICAgICAgICAibmFtbiBwXHUwMEU1IGxldmVyYW50XHUwMEY2cnNrbGFzcyJ9LCAvLy1wcm92aWRlcmNsYXNzCi0gICAgICAgIHsicHJvdmlkZXIubmFtZSIsCi0gICAgICAgICAgICAgICAgImxldmVyYW50XHUwMEY2cnNuYW1uIn0sIC8vLXByb3ZpZGVybmFtZQotICAgICAgICB7InByb3ZpZGVyLmNsYXNzcGF0aCIsCi0gICAgICAgICAgICAgICAgImxldmVyYW50XHUwMEY2cnNrbGFzc1x1MDBGNmt2XHUwMEU0ZyJ9LCAvLy1wcm92aWRlcnBhdGgKLSAgICAgICAgeyJvdXRwdXQuaW4uUkZDLnN0eWxlIiwKLSAgICAgICAgICAgICAgICAidXRkYXRhIGkgUkZDLWZvcm1hdCJ9LCAvLy1yZmMKLSAgICAgICAgeyJzaWduYXR1cmUuYWxnb3JpdGhtLm5hbWUiLAotICAgICAgICAgICAgICAgICJuYW1uIHBcdTAwRTUgc2lnbmF0dXJhbGdvcml0bSJ9LCAvLy1zaWdhbGcKLSAgICAgICAgeyJzb3VyY2UuYWxpYXMiLAotICAgICAgICAgICAgICAgICJrXHUwMEU0bGxhbGlhcyJ9LCAvLy1zcmNhbGlhcwotICAgICAgICB7InNvdXJjZS5rZXkucGFzc3dvcmQiLAotICAgICAgICAgICAgICAgICJsXHUwMEY2c2Vub3JkIGZcdTAwRjZyIGtcdTAwRTRsbG55Y2tlbCJ9LCAvLy1zcmNrZXlwYXNzCi0gICAgICAgIHsic291cmNlLmtleXN0b3JlLm5hbWUiLAotICAgICAgICAgICAgICAgICJuYW1uIHBcdTAwRTUga1x1MDBFNGxsbnlja2VsbGFnZXIifSwgLy8tc3Jja2V5c3RvcmUKLSAgICAgICAgeyJzb3VyY2Uua2V5c3RvcmUucGFzc3dvcmQucHJvdGVjdGVkIiwKLSAgICAgICAgICAgICAgICAic2t5ZGRhdCBsXHUwMEY2c2Vub3JkIGZcdTAwRjZyIGtcdTAwRTRsbG55Y2tlbGxhZ2VyIn0sIC8vLXNyY3Byb3RlY3RlZAotICAgICAgICB7InNvdXJjZS5rZXlzdG9yZS5wcm92aWRlci5uYW1lIiwKLSAgICAgICAgICAgICAgICAibGV2ZXJhbnRcdTAwRjZyc25hbW4gZlx1MDBGNnIga1x1MDBFNGxsbnlja2VsbGFnZXIifSwgLy8tc3JjcHJvdmlkZXJuYW1lCi0gICAgICAgIHsic291cmNlLmtleXN0b3JlLnBhc3N3b3JkIiwKLSAgICAgICAgICAgICAgICAibFx1MDBGNnNlbm9yZCBmXHUwMEY2ciBrXHUwMEU0bGxueWNrZWxsYWdlciJ9LCAvLy1zcmNzdG9yZXBhc3MKLSAgICAgICAgeyJzb3VyY2Uua2V5c3RvcmUudHlwZSIsCi0gICAgICAgICAgICAgICAgInR5cCBhdiBrXHUwMEU0bGxueWNrZWxsYWdlciJ9LCAvLy1zcmNzdG9yZXR5cGUKLSAgICAgICAgeyJTU0wuc2VydmVyLmhvc3QuYW5kLnBvcnQiLAotICAgICAgICAgICAgICAgICJTU0wtc2VydmVydlx1MDBFNHJkIG9jaCAtcG9ydCJ9LCAvLy1zc2xzZXJ2ZXIKLSAgICAgICAgeyJzaWduZWQuamFyLmZpbGUiLAotICAgICAgICAgICAgICAgICJzaWduZXJhZCBqYXItZmlsIn0sIC8vPWphcmZpbGUKLSAgICAgICAgeyJjZXJ0aWZpY2F0ZS52YWxpZGl0eS5zdGFydC5kYXRlLnRpbWUiLAotICAgICAgICAgICAgICAgICJzdGFydGRhdHVtLy10aWQgZlx1MDBGNnIgY2VydGlmaWthdGV0cyBnaWx0aWdoZXQifSwgLy8tc3RhcnRkYXRlCi0gICAgICAgIHsia2V5c3RvcmUucGFzc3dvcmQiLAotICAgICAgICAgICAgICAgICJsXHUwMEY2c2Vub3JkIGZcdTAwRjZyIG55Y2tlbGxhZ2VyIn0sIC8vLXN0b3JlcGFzcwotICAgICAgICB7ImtleXN0b3JlLnR5cGUiLAotICAgICAgICAgICAgICAgICJueWNrZWxsYWdlcnR5cCJ9LCAvLy1zdG9yZXR5cGUKLSAgICAgICAgeyJ0cnVzdC5jZXJ0aWZpY2F0ZXMuZnJvbS5jYWNlcnRzIiwKLSAgICAgICAgICAgICAgICAidGlsbGZcdTAwRjZybGl0bGlnYSBjZXJ0aWZpa2F0IGZyXHUwMEU1biBjYWNlcnRzIn0sIC8vLXRydXN0Y2FjZXJ0cwotICAgICAgICB7InZlcmJvc2Uub3V0cHV0IiwKLSAgICAgICAgICAgICAgICAidXRmXHUwMEY2cmxpZ2EgdXRkYXRhIn0sIC8vLXYKLSAgICAgICAgeyJ2YWxpZGl0eS5udW1iZXIub2YuZGF5cyIsCi0gICAgICAgICAgICAgICAgImFudGFsIGRhZ2FyIGZcdTAwRjZyIGdpbHRpZ2hldCJ9LCAvLy12YWxpZGl0eQotICAgICAgICB7IlNlcmlhbC5JRC5vZi5jZXJ0LnRvLnJldm9rZSIsCi0gICAgICAgICAgICAgICAgICJTZXJpZWxsdCBJRCBmXHUwMEY2ciBjZXJ0aWZpa2F0IHNvbSBza2EgXHUwMEU1dGVya2FsbGFzIn0sIC8vLWlkCi0gICAgICAgIC8vIGtleXRvb2w6IFJ1bm5pbmcgcGFydAotICAgICAgICB7ImtleXRvb2wuZXJyb3IuIiwgIm55Y2tlbHZlcmt0eWdzZmVsOiAifSwKLSAgICAgICAgeyJJbGxlZ2FsLm9wdGlvbi4iLCAiT3RpbGxcdTAwRTV0ZXQgYWx0ZXJuYXRpdjogICJ9LAotICAgICAgICB7IklsbGVnYWwudmFsdWUuIiwgIk90aWxsXHUwMEU1dGV0IHZcdTAwRTRyZGU6ICJ9LAotICAgICAgICB7IlVua25vd24ucGFzc3dvcmQudHlwZS4iLCAiT2tcdTAwRTRuZCBsXHUwMEY2c2Vub3Jkc3R5cDogIn0sCi0gICAgICAgIHsiQ2Fubm90LmZpbmQuZW52aXJvbm1lbnQudmFyaWFibGUuIiwKLSAgICAgICAgICAgICAgICAiS2FuIGludGUgaGl0dGEgbWlsalx1MDBGNnZhcmlhYmVsOiAifSwKLSAgICAgICAgeyJDYW5ub3QuZmluZC5maWxlLiIsICJIaXR0YXIgaW50ZSBmaWw6ICJ9LAotICAgICAgICB7IkNvbW1hbmQub3B0aW9uLmZsYWcubmVlZHMuYW4uYXJndW1lbnQuIiwgIktvbW1hbmRvYWx0ZXJuYXRpdmV0IHswfSBiZWhcdTAwRjZ2ZXIgZXR0IGFyZ3VtZW50LiJ9LAotICAgICAgICB7Ildhcm5pbmcuRGlmZmVyZW50LnN0b3JlLmFuZC5rZXkucGFzc3dvcmRzLm5vdC5zdXBwb3J0ZWQuZm9yLlBLQ1MxMi5LZXlTdG9yZXMuSWdub3JpbmcudXNlci5zcGVjaWZpZWQuY29tbWFuZC52YWx1ZS4iLAotICAgICAgICAgICAgICAgICJWYXJuaW5nISAgUEtDUzEyLW55Y2tlbGxhZ2VyIGhhciBpbnRlIHN0XHUwMEY2ZCBmXHUwMEY2ciBvbGlrYSBsXHUwMEY2c2Vub3JkIGZcdTAwRjZyIGxhZ3JldCBvY2ggbnlja2Vsbi4gRGV0IGFudlx1MDBFNG5kYXJzcGVjaWZpY2VyYWRlIHswfS12XHUwMEU0cmRldCBpZ25vcmVyYXMuIn0sCi0gICAgICAgIHsiLmtleXN0b3JlLm11c3QuYmUuTk9ORS5pZi5zdG9yZXR5cGUuaXMuezB9IiwKLSAgICAgICAgICAgICAgICAiLWtleXN0b3JlIG1cdTAwRTVzdGUgdmFyYSBOT05FIG9tIC1zdG9yZXR5cGUgXHUwMEU0ciB7MH0ifSwKLSAgICAgICAgeyJUb28ubWFueS5yZXRyaWVzLnByb2dyYW0udGVybWluYXRlZCIsCi0gICAgICAgICAgICAgICAgICJGXHUwMEY2ciBtXHUwMEU1bmdhIGZcdTAwRjZyc1x1MDBGNmsuIFByb2dyYW1tZXQgYXZzbHV0YXMifSwKLSAgICAgICAgeyIuc3RvcmVwYXNzd2QuYW5kLmtleXBhc3N3ZC5jb21tYW5kcy5ub3Quc3VwcG9ydGVkLmlmLnN0b3JldHlwZS5pcy57MH0iLAotICAgICAgICAgICAgICAgICItc3RvcmVwYXNzd2QtIG9jaCAta2V5cGFzc3dkLWtvbW1hbmRvbiBzdFx1MDBGNmRzIGludGUgb20gLXN0b3JldHlwZSBcdTAwRTRyIHswfSJ9LAotICAgICAgICB7Ii5rZXlwYXNzd2QuY29tbWFuZHMubm90LnN1cHBvcnRlZC5pZi5zdG9yZXR5cGUuaXMuUEtDUzEyIiwKLSAgICAgICAgICAgICAgICAiLWtleXBhc3N3ZC1rb21tYW5kb24gc3RcdTAwRjZkcyBpbnRlIG9tIC1zdG9yZXR5cGUgXHUwMEU0ciBQS0NTMTIifSwKLSAgICAgICAgeyIua2V5cGFzcy5hbmQubmV3LmNhbi5ub3QuYmUuc3BlY2lmaWVkLmlmLnN0b3JldHlwZS5pcy57MH0iLAotICAgICAgICAgICAgICAgICIta2V5cGFzcyBvY2ggLW5ldyBrYW4gaW50ZSBhbmdlcyBvbSAtc3RvcmV0eXBlIFx1MDBFNHIgezB9In0sCi0gICAgICAgIHsiaWYucHJvdGVjdGVkLmlzLnNwZWNpZmllZC50aGVuLnN0b3JlcGFzcy5rZXlwYXNzLmFuZC5uZXcubXVzdC5ub3QuYmUuc3BlY2lmaWVkIiwKLSAgICAgICAgICAgICAgICAib20gLXByb3RlY3RlZCBoYXIgYW5nZXR0cyBmXHUwMEU1ciBpbnRlIC1zdG9yZXBhc3MsIC1rZXlwYXNzIG9jaCAtbmV3IGFuZ2VzIn0sCi0gICAgICAgIHsiaWYuc3JjcHJvdGVjdGVkLmlzLnNwZWNpZmllZC50aGVuLnNyY3N0b3JlcGFzcy5hbmQuc3Jja2V5cGFzcy5tdXN0Lm5vdC5iZS5zcGVjaWZpZWQiLAotICAgICAgICAgICAgICAgICJvbSAtc3JjcHJvdGVjdGVkIGFuZ2VzIGZcdTAwRTVyIC1zcmNzdG9yZXBhc3Mgb2NoIC1zcmNrZXlwYXNzIGludGUgYW5nZXMifSwKLSAgICAgICAgeyJpZi5rZXlzdG9yZS5pcy5ub3QucGFzc3dvcmQucHJvdGVjdGVkLnRoZW4uc3RvcmVwYXNzLmtleXBhc3MuYW5kLm5ldy5tdXN0Lm5vdC5iZS5zcGVjaWZpZWQiLAotICAgICAgICAgICAgICAgICJvbSBueWNrZWxsYWdyZXQgaW50ZSBcdTAwRTRyIGxcdTAwRjZzZW5vcmRzc2t5ZGRhdCBmXHUwMEU1ciAtc3RvcmVwYXNzLCAta2V5cGFzcyBvY2ggLW5ldyBpbnRlIGFuZ2VzIn0sCi0gICAgICAgIHsiaWYuc291cmNlLmtleXN0b3JlLmlzLm5vdC5wYXNzd29yZC5wcm90ZWN0ZWQudGhlbi5zcmNzdG9yZXBhc3MuYW5kLnNyY2tleXBhc3MubXVzdC5ub3QuYmUuc3BlY2lmaWVkIiwKLSAgICAgICAgICAgICAgICAib20ga1x1MDBFNGxsbnlja2VsbGFncmV0IGludGUgXHUwMEU0ciBsXHUwMEY2c2Vub3Jkc3NreWRkYXQgZlx1MDBFNXIgLXNyY3N0b3JlcGFzcyBvY2ggLXNyY2tleXBhc3MgaW50ZSBhbmdlcyJ9LAotICAgICAgICB7IklsbGVnYWwuc3RhcnRkYXRlLnZhbHVlIiwgIk90aWxsXHUwMEU1dGV0IHZcdTAwRTRyZGUgZlx1MDBGNnIgc3RhcnRkYXR1bSJ9LAotICAgICAgICB7IlZhbGlkaXR5Lm11c3QuYmUuZ3JlYXRlci50aGFuLnplcm8iLAotICAgICAgICAgICAgICAgICJHaWx0aWdoZXRlbiBtXHUwMEU1c3RlIHZhcmEgc3RcdTAwRjZycmUgXHUwMEU0biBub2xsIn0sCi0gICAgICAgIHsicHJvdk5hbWUubm90LmEucHJvdmlkZXIiLCAiezB9IFx1MDBFNHIgaW50ZSBlbiBsZXZlcmFudFx1MDBGNnIifSwKLSAgICAgICAgeyJVc2FnZS5lcnJvci5uby5jb21tYW5kLnByb3ZpZGVkIiwgIlN5bnRheGZlbDogaW5nZXQga29tbWFuZG8gYW5naXZldCJ9LAotICAgICAgICB7IlNvdXJjZS5rZXlzdG9yZS5maWxlLmV4aXN0cy5idXQuaXMuZW1wdHkuIiwgIk55Y2tlbGxhZ3JldHMga1x1MDBFNGxsZmlsIGZpbm5zLCBtZW4gXHUwMEU0ciB0b206ICJ9LAotICAgICAgICB7IlBsZWFzZS5zcGVjaWZ5LnNyY2tleXN0b3JlIiwgIkFuZ2UgLXNyY2tleXN0b3JlIn0sCi0gICAgICAgIHsiTXVzdC5ub3Quc3BlY2lmeS5ib3RoLnYuYW5kLnJmYy53aXRoLmxpc3QuY29tbWFuZCIsCi0gICAgICAgICAgICAgICAgIkthbiBpbnRlIHNwZWNpZmljZXJhIGJcdTAwRTVkZSAtdiBvY2ggLXJmYyBtZWQgJ2xpc3QnLWtvbW1hbmRvdCJ9LAotICAgICAgICB7IktleS5wYXNzd29yZC5tdXN0LmJlLmF0LmxlYXN0LjYuY2hhcmFjdGVycyIsCi0gICAgICAgICAgICAgICAgIk55Y2tlbGxcdTAwRjZzZW5vcmRldCBtXHUwMEU1c3RlIGlubmVoXHUwMEU1bGxhIG1pbnN0IDYgdGVja2VuIn0sCi0gICAgICAgIHsiTmV3LnBhc3N3b3JkLm11c3QuYmUuYXQubGVhc3QuNi5jaGFyYWN0ZXJzIiwKLSAgICAgICAgICAgICAgICAiRGV0IG55YSBsXHUwMEY2c2Vub3JkZXQgbVx1MDBFNXN0ZSBpbm5laFx1MDBFNWxsYSBtaW5zdCA2IHRlY2tlbiJ9LAotICAgICAgICB7IktleXN0b3JlLmZpbGUuZXhpc3RzLmJ1dC5pcy5lbXB0eS4iLAotICAgICAgICAgICAgICAgICJOeWNrZWxsYWdlcmZpbGVuIGZpbm5zLCBtZW4gXHUwMEU0ciB0b206ICJ9LAotICAgICAgICB7IktleXN0b3JlLmZpbGUuZG9lcy5ub3QuZXhpc3QuIiwKLSAgICAgICAgICAgICAgICAiTnlja2VsbGFnZXJmaWxlbiBmaW5ucyBpbnRlOiAifSwKLSAgICAgICAgeyJNdXN0LnNwZWNpZnkuZGVzdGluYXRpb24uYWxpYXMiLCAiRHUgbVx1MDBFNXN0ZSBhbmdlIGRlc3RpbmF0aW9uc2FsaWFzIn0sCi0gICAgICAgIHsiTXVzdC5zcGVjaWZ5LmFsaWFzIiwgIkR1IG1cdTAwRTVzdGUgYW5nZSBhbGlhcyJ9LAotICAgICAgICB7IktleXN0b3JlLnBhc3N3b3JkLm11c3QuYmUuYXQubGVhc3QuNi5jaGFyYWN0ZXJzIiwKLSAgICAgICAgICAgICAgICAiTnlja2VsbGFnZXJsXHUwMEY2c2Vub3JkZXQgbVx1MDBFNXN0ZSBpbm5laFx1MDBFNWxsYSBtaW5zdCA2IHRlY2tlbiJ9LAotICAgICAgICB7IkVudGVyLmtleXN0b3JlLnBhc3N3b3JkLiIsICJBbmdlIG55Y2tlbGxhZ2VybFx1MDBGNnNlbm9yZDogICJ9LAotICAgICAgICB7IkVudGVyLnNvdXJjZS5rZXlzdG9yZS5wYXNzd29yZC4iLCAiQW5nZSBsXHUwMEY2c2Vub3JkIGZcdTAwRjZyIGtcdTAwRTRsbG55Y2tlbGxhZ3JldDogICJ9LAotICAgICAgICB7IkVudGVyLmRlc3RpbmF0aW9uLmtleXN0b3JlLnBhc3N3b3JkLiIsICJBbmdlIG55Y2tlbGxhZ2VybFx1MDBGNnNlbm9yZCBmXHUwMEY2ciBkZXN0aW5hdGlvbjogICJ9LAotICAgICAgICB7IktleXN0b3JlLnBhc3N3b3JkLmlzLnRvby5zaG9ydC5tdXN0LmJlLmF0LmxlYXN0LjYuY2hhcmFjdGVycyIsCi0gICAgICAgICAiTnlja2VsbGFnZXJsXHUwMEY2c2Vub3JkZXQgXHUwMEU0ciBmXHUwMEY2ciBrb3J0IC0gZGV0IG1cdTAwRTVzdGUgaW5uZWhcdTAwRTVsbGEgbWluc3QgNiB0ZWNrZW4ifSwKLSAgICAgICAgeyJVbmtub3duLkVudHJ5LlR5cGUiLCAiT2tcdTAwRTRuZCBwb3N0dHlwIn0sCi0gICAgICAgIHsiVG9vLm1hbnkuZmFpbHVyZXMuQWxpYXMubm90LmNoYW5nZWQiLCAiRlx1MDBGNnIgbVx1MDBFNW5nYSBmZWwuIEFsaWFzIGhhciBpbnRlIFx1MDBFNG5kcmF0cyJ9LAotICAgICAgICB7IkVudHJ5LmZvci5hbGlhcy5hbGlhcy5zdWNjZXNzZnVsbHkuaW1wb3J0ZWQuIiwKLSAgICAgICAgICAgICAgICAgIlBvc3RlbiBmXHUwMEY2ciBhbGlhcyB7MH0gaGFyIGltcG9ydGVyYXRzLiJ9LAotICAgICAgICB7IkVudHJ5LmZvci5hbGlhcy5hbGlhcy5ub3QuaW1wb3J0ZWQuIiwgIlBvc3RlbiBmXHUwMEY2ciBhbGlhcyB7MH0gaGFyIGludGUgaW1wb3J0ZXJhdHMuIn0sCi0gICAgICAgIHsiUHJvYmxlbS5pbXBvcnRpbmcuZW50cnkuZm9yLmFsaWFzLmFsaWFzLmV4Y2VwdGlvbi5FbnRyeS5mb3IuYWxpYXMuYWxpYXMubm90LmltcG9ydGVkLiIsCi0gICAgICAgICAgICAgICAgICJFdHQgcHJvYmxlbSB1cHBzdG9kIHZpZCBpbXBvcnRlbiBhdiBwb3N0ZW4gZlx1MDBGNnIgYWxpYXMgezB9OiB7MX0uXG5Qb3N0ZW4gezB9IGhhciBpbnRlIGltcG9ydGVyYXRzLiJ9LAotICAgICAgICB7IkltcG9ydC5jb21tYW5kLmNvbXBsZXRlZC5vay5lbnRyaWVzLnN1Y2Nlc3NmdWxseS5pbXBvcnRlZC5mYWlsLmVudHJpZXMuZmFpbGVkLm9yLmNhbmNlbGxlZCIsCi0gICAgICAgICAgICAgICAgICJLb21tYW5kb2ltcG9ydGVuIHNsdXRmXHUwMEY2cmQ6IHswfSBwb3N0ZXIgaGFyIGltcG9ydGVyYXRzLCB7MX0gcG9zdGVyIHZhciBmZWxha3RpZ2EgZWxsZXIgYW5udWxsZXJhZGVzIn0sCi0gICAgICAgIHsiV2FybmluZy5PdmVyd3JpdGluZy5leGlzdGluZy5hbGlhcy5hbGlhcy5pbi5kZXN0aW5hdGlvbi5rZXlzdG9yZSIsCi0gICAgICAgICAgICAgICAgICJWYXJuaW5nISBEZXQgYmVmaW50bGlnYSBhbGlhc2V0IHswfSBpIGRlc3RpbmF0aW9uc255Y2tlbGxhZ3JldCBza3JpdnMgXHUwMEY2dmVyIn0sCi0gICAgICAgIHsiRXhpc3RpbmcuZW50cnkuYWxpYXMuYWxpYXMuZXhpc3RzLm92ZXJ3cml0ZS5uby4iLAotICAgICAgICAgICAgICAgICAiQWxpYXNldCB7MH0gZmlubnMgcmVkYW4uIFZpbGwgZHUgc2tyaXZhIFx1MDBGNnZlciBkZXQ/IFtuZWpdOiAgIn0sCi0gICAgICAgIHsiVG9vLm1hbnkuZmFpbHVyZXMudHJ5LmxhdGVyIiwgIkZcdTAwRjZyIG1cdTAwRTVuZ2EgZmVsIC0gZlx1MDBGNnJzXHUwMEY2ayBpZ2VuIHNlbmFyZSJ9LAotICAgICAgICB7IkNlcnRpZmljYXRpb24ucmVxdWVzdC5zdG9yZWQuaW4uZmlsZS5maWxlbmFtZS4iLAotICAgICAgICAgICAgICAgICJDZXJ0aWZpa2F0YmVnXHUwMEU0cmFuIGhhciBsYWdyYXRzIGkgZmlsZW4gPHswfT4ifSwKLSAgICAgICAgeyJTdWJtaXQudGhpcy50by55b3VyLkNBIiwgIlNraWNrYSBkZXR0YSB0aWxsIGNlcnRpZmlrYXR1dGZcdTAwRTRyZGFyZW4ifSwKLSAgICAgICAgeyJpZi5hbGlhcy5ub3Quc3BlY2lmaWVkLmRlc3RhbGlhcy5zcmNrZXlwYXNzLmFuZC5kZXN0a2V5cGFzcy5tdXN0Lm5vdC5iZS5zcGVjaWZpZWQiLAotICAgICAgICAgICAgIm9tIG5cdTAwRTVnb3QgYWxpYXMgaW50ZSBhbmdlcyBmXHUwMEU1ciBkZXN0YWxpYXMsIHNyY2tleXBhc3Mgb2NoIGRlc3RrZXlwYXNzIGludGUgYW5nZXMifSwKLSAgICAgICAgeyJDZXJ0aWZpY2F0ZS5zdG9yZWQuaW4uZmlsZS5maWxlbmFtZS4iLAotICAgICAgICAgICAgICAgICJDZXJ0aWZpa2F0ZXQgaGFyIGxhZ3JhdHMgaSBmaWxlbiA8ezB9PiJ9LAotICAgICAgICB7IkNlcnRpZmljYXRlLnJlcGx5Lndhcy5pbnN0YWxsZWQuaW4ua2V5c3RvcmUiLAotICAgICAgICAgICAgICAgICJDZXJ0aWZpa2F0c3ZhcmV0IGhhciBpbnN0YWxsZXJhdHMgaSBueWNrZWxsYWdyZXQifSwKLSAgICAgICAgeyJDZXJ0aWZpY2F0ZS5yZXBseS53YXMubm90Lmluc3RhbGxlZC5pbi5rZXlzdG9yZSIsCi0gICAgICAgICAgICAgICAgIkNlcnRpZmlrYXRzdmFyZXQgaGFyIGludGUgaW5zdGFsbGVyYXRzIGkgbnlja2VsbGFncmV0In0sCi0gICAgICAgIHsiQ2VydGlmaWNhdGUud2FzLmFkZGVkLnRvLmtleXN0b3JlIiwKLSAgICAgICAgICAgICAgICAiQ2VydGlmaWthdGV0IGhhciBsYWd0cyB0aWxsIGkgbnlja2VsbGFncmV0In0sCi0gICAgICAgIHsiQ2VydGlmaWNhdGUud2FzLm5vdC5hZGRlZC50by5rZXlzdG9yZSIsCi0gICAgICAgICAgICAgICAgIkNlcnRpZmlrYXRldCBoYXIgaW50ZSBsYWd0cyB0aWxsIGkgbnlja2VsbGFncmV0In0sCi0gICAgICAgIHsiLlN0b3Jpbmcua3NmbmFtZS4iLCAiW0xhZ3JhciB7MH1dIn0sCi0gICAgICAgIHsiYWxpYXMuaGFzLm5vLnB1YmxpYy5rZXkuY2VydGlmaWNhdGUuIiwKLSAgICAgICAgICAgICAgICAiezB9IHNha25hciBvZmZlbnRsaWcgbnlja2VsIChjZXJ0aWZpa2F0KSJ9LAotICAgICAgICB7IkNhbm5vdC5kZXJpdmUuc2lnbmF0dXJlLmFsZ29yaXRobSIsCi0gICAgICAgICAgICAgICAgIkthbiBpbnRlIGhcdTAwRTRybGVkYSBzaWduYXR1cmFsZ29yaXRtIn0sCi0gICAgICAgIHsiQWxpYXMuYWxpYXMuZG9lcy5ub3QuZXhpc3QiLAotICAgICAgICAgICAgICAgICJBbGlhc2V0IDx7MH0+IGZpbm5zIGludGUifSwKLSAgICAgICAgeyJBbGlhcy5hbGlhcy5oYXMubm8uY2VydGlmaWNhdGUiLAotICAgICAgICAgICAgICAgICJBbGlhc2V0IDx7MH0+IHNha25hciBjZXJ0aWZpa2F0In0sCi0gICAgICAgIHsiS2V5LnBhaXIubm90LmdlbmVyYXRlZC5hbGlhcy5hbGlhcy5hbHJlYWR5LmV4aXN0cyIsCi0gICAgICAgICAgICAgICAgIk55Y2tlbHBhcmV0IGdlbmVyZXJhZGVzIGludGUuIEFsaWFzZXQgPHswfT4gZmlubnMgcmVkYW4ifSwKLSAgICAgICAgeyJHZW5lcmF0aW5nLmtleXNpemUuYml0LmtleUFsZ05hbWUua2V5LnBhaXIuYW5kLnNlbGYuc2lnbmVkLmNlcnRpZmljYXRlLnNpZ0FsZ05hbWUud2l0aC5hLnZhbGlkaXR5Lm9mLnZhbGlkYWxpdHkuZGF5cy5mb3IiLAotICAgICAgICAgICAgICAgICJHZW5lcmVyYXIgezB9IGJpdGFycyB7MX0tbnlja2VscGFyIG9jaCBzalx1MDBFNGx2c2lnbmVyYXQgY2VydGlmaWthdCAoezJ9KSBtZWQgZW4gZ2lsdGlnaGV0IHBcdTAwRTUgezN9IGRhZ2FyXG5cdGZcdTAwRjZyOiB7NH0ifSwKLSAgICAgICAgeyJFbnRlci5rZXkucGFzc3dvcmQuZm9yLmFsaWFzLiIsICJBbmdlIG55Y2tlbGxcdTAwRjZzZW5vcmQgZlx1MDBGNnIgPHswfT4ifSwKLSAgICAgICAgeyIuUkVUVVJOLmlmLnNhbWUuYXMua2V5c3RvcmUucGFzc3dvcmQuIiwKLSAgICAgICAgICAgICAgICAiXHQoUkVUVVJOIG9tIGRldCBcdTAwRTRyIGlkZW50aXNrdCBtZWQgbnlja2VsbGFnZXJsXHUwMEY2c2Vub3JkZXQpOiAgIn0sCi0gICAgICAgIHsiS2V5LnBhc3N3b3JkLmlzLnRvby5zaG9ydC5tdXN0LmJlLmF0LmxlYXN0LjYuY2hhcmFjdGVycyIsCi0gICAgICAgICAgICAgICAgIk55Y2tlbGxcdTAwRjZzZW5vcmRldCBcdTAwRTRyIGZcdTAwRjZyIGtvcnQgLSBkZXQgbVx1MDBFNXN0ZSBpbm5laFx1MDBFNWxsYSBtaW5zdCA2IHRlY2tlbiJ9LAotICAgICAgICB7IlRvby5tYW55LmZhaWx1cmVzLmtleS5ub3QuYWRkZWQudG8ua2V5c3RvcmUiLAotICAgICAgICAgICAgICAgICJGXHUwMEY2ciBtXHUwMEU1bmdhIGZlbCAtIG55Y2tlbG4gbGFkZXMgaW50ZSB0aWxsIGkgbnlja2VsbGFncmV0In0sCi0gICAgICAgIHsiRGVzdGluYXRpb24uYWxpYXMuZGVzdC5hbHJlYWR5LmV4aXN0cyIsCi0gICAgICAgICAgICAgICAgIkRlc3RpbmF0aW9uc2FsaWFzZXQgPHswfT4gZmlubnMgcmVkYW4ifSwKLSAgICAgICAgeyJQYXNzd29yZC5pcy50b28uc2hvcnQubXVzdC5iZS5hdC5sZWFzdC42LmNoYXJhY3RlcnMiLAotICAgICAgICAgICAgICAgICJMXHUwMEY2c2Vub3JkZXQgXHUwMEU0ciBmXHUwMEY2ciBrb3J0IC0gZGV0IG1cdTAwRTVzdGUgaW5uZWhcdTAwRTVsbGEgbWluc3QgNiB0ZWNrZW4ifSwKLSAgICAgICAgeyJUb28ubWFueS5mYWlsdXJlcy5LZXkuZW50cnkubm90LmNsb25lZCIsCi0gICAgICAgICAgICAgICAgIkZcdTAwRjZyIG1cdTAwRTVuZ2EgZmVsLiBOeWNrZWxwb3N0ZW4gaGFyIGludGUga2xvbmF0cyJ9LAotICAgICAgICB7ImtleS5wYXNzd29yZC5mb3IuYWxpYXMuIiwgIm55Y2tlbGxcdTAwRjZzZW5vcmQgZlx1MDBGNnIgPHswfT4ifSwKLSAgICAgICAgeyJLZXlzdG9yZS5lbnRyeS5mb3IuaWQuZ2V0TmFtZS5hbHJlYWR5LmV4aXN0cyIsCi0gICAgICAgICAgICAgICAgIk55Y2tlbGxhZ2VycG9zdCBmXHUwMEY2ciA8ezB9PiBmaW5ucyByZWRhbiJ9LAotICAgICAgICB7IkNyZWF0aW5nLmtleXN0b3JlLmVudHJ5LmZvci5pZC5nZXROYW1lLiIsCi0gICAgICAgICAgICAgICAgIlNrYXBhciBueWNrZWxsYWdlcnBvc3QgZlx1MDBGNnIgPHswfT4gLi4uIn0sCi0gICAgICAgIHsiTm8uZW50cmllcy5mcm9tLmlkZW50aXR5LmRhdGFiYXNlLmFkZGVkIiwKLSAgICAgICAgICAgICAgICAiSW5nYSBwb3N0ZXIgZnJcdTAwRTVuIGlkZW50aXRldHNkYXRhYmFzZW4gaGFyIGxhZ3RzIHRpbGwifSwKLSAgICAgICAgeyJBbGlhcy5uYW1lLmFsaWFzIiwgIkFsaWFzbmFtbjogezB9In0sCi0gICAgICAgIHsiQ3JlYXRpb24uZGF0ZS5rZXlTdG9yZS5nZXRDcmVhdGlvbkRhdGUuYWxpYXMuIiwKLSAgICAgICAgICAgICAgICAiU2thcGF0IGRlbjogezAsZGF0ZX0ifSwKLSAgICAgICAgeyJhbGlhcy5rZXlTdG9yZS5nZXRDcmVhdGlvbkRhdGUuYWxpYXMuIiwKLSAgICAgICAgICAgICAgICAiezB9LCB7MSxkYXRlfSwgIn0sCi0gICAgICAgIHsiYWxpYXMuIiwgInswfSwgIn0sCi0gICAgICAgIHsiRW50cnkudHlwZS50eXBlLiIsICJQb3N0dHlwOiB7MH0ifSwKLSAgICAgICAgeyJDZXJ0aWZpY2F0ZS5jaGFpbi5sZW5ndGguIiwgIkxcdTAwRTRuZ2QgcFx1MDBFNSBjZXJ0aWZpa2F0c2tlZGphOiAifSwKLSAgICAgICAgeyJDZXJ0aWZpY2F0ZS5pLjEuIiwgIkNlcnRpZmlrYXRbezAsbnVtYmVyLGludGVnZXJ9XToifSwKLSAgICAgICAgeyJDZXJ0aWZpY2F0ZS5maW5nZXJwcmludC5TSEExLiIsICJDZXJ0aWZpa2F0ZXRzIGZpbmdlcmF2dHJ5Y2sgKFNIQTEpOiAifSwKLSAgICAgICAgeyJLZXlzdG9yZS50eXBlLiIsICJOeWNrZWxsYWdlcnR5cDogIn0sCi0gICAgICAgIHsiS2V5c3RvcmUucHJvdmlkZXIuIiwgIk55Y2tlbGxhZ2VybGV2ZXJhbnRcdTAwRjZyOiAifSwKLSAgICAgICAgeyJZb3VyLmtleXN0b3JlLmNvbnRhaW5zLmtleVN0b3JlLnNpemUuZW50cnkiLAotICAgICAgICAgICAgICAgICJOeWNrZWxsYWdyZXQgaW5uZWhcdTAwRTVsbGVyIHswLG51bWJlcixpbnRlZ2VyfSBwb3N0In0sCi0gICAgICAgIHsiWW91ci5rZXlzdG9yZS5jb250YWlucy5rZXlTdG9yZS5zaXplLmVudHJpZXMiLAotICAgICAgICAgICAgICAgICJOeWNrZWxsYWdyZXQgaW5uZWhcdTAwRTVsbGVyIHswLG51bWJlcixpbnRlZ2VyfSBwb3N0ZXIifSwKLSAgICAgICAgeyJGYWlsZWQudG8ucGFyc2UuaW5wdXQiLCAiS3VuZGUgaW50ZSB0b2xrYSBpbmRhdGEifSwKLSAgICAgICAgeyJFbXB0eS5pbnB1dCIsICJJbmdhIGluZGF0YSJ9LAotICAgICAgICB7Ik5vdC5YLjUwOS5jZXJ0aWZpY2F0ZSIsICJJbnRlIGV0dCBYLjUwOS1jZXJ0aWZpa2F0In0sCi0gICAgICAgIHsiYWxpYXMuaGFzLm5vLnB1YmxpYy5rZXkiLCAiezB9IHNha25hciBvZmZlbnRsaWcgbnlja2VsIn0sCi0gICAgICAgIHsiYWxpYXMuaGFzLm5vLlguNTA5LmNlcnRpZmljYXRlIiwgInswfSBzYWtuYXIgWC41MDktY2VydGlmaWthdCJ9LAotICAgICAgICB7Ik5ldy5jZXJ0aWZpY2F0ZS5zZWxmLnNpZ25lZC4iLCAiTnl0dCBjZXJ0aWZpa2F0IChzalx1MDBFNGx2c2lnbmVyYXQpOiJ9LAotICAgICAgICB7IlJlcGx5Lmhhcy5uby5jZXJ0aWZpY2F0ZXMiLCAiU3ZhcmV0IHNha25hciBjZXJ0aWZpa2F0In0sCi0gICAgICAgIHsiQ2VydGlmaWNhdGUubm90LmltcG9ydGVkLmFsaWFzLmFsaWFzLmFscmVhZHkuZXhpc3RzIiwKLSAgICAgICAgICAgICAgICAiQ2VydGlmaWthdGV0IGltcG9ydGVyYWRlcyBpbnRlLiBBbGlhc2V0IDx7MH0+IGZpbm5zIHJlZGFuIn0sCi0gICAgICAgIHsiSW5wdXQubm90LmFuLlguNTA5LmNlcnRpZmljYXRlIiwgIkluZGF0YSBcdTAwRTRyIGludGUgZXR0IFguNTA5LWNlcnRpZmlrYXQifSwKLSAgICAgICAgeyJDZXJ0aWZpY2F0ZS5hbHJlYWR5LmV4aXN0cy5pbi5rZXlzdG9yZS51bmRlci5hbGlhcy50cnVzdGFsaWFzLiIsCi0gICAgICAgICAgICAgICAgIkNlcnRpZmlrYXRldCBmaW5ucyByZWRhbiBpIG55Y2tlbGxhZ2VyZmlsZW4gdW5kZXIgYWxpYXNldCA8ezB9PiJ9LAotICAgICAgICB7IkRvLnlvdS5zdGlsbC53YW50LnRvLmFkZC5pdC5uby4iLAotICAgICAgICAgICAgICAgICJWaWxsIGR1IGZvcnRmYXJhbmRlIGxcdTAwRTRnZ2EgdGlsbCBkZXQ/IFtuZWpdOiAgIn0sCi0gICAgICAgIHsiQ2VydGlmaWNhdGUuYWxyZWFkeS5leGlzdHMuaW4uc3lzdGVtLndpZGUuQ0Eua2V5c3RvcmUudW5kZXIuYWxpYXMudHJ1c3RhbGlhcy4iLAotICAgICAgICAgICAgICAgICJDZXJ0aWZpa2F0ZXQgZmlubnMgcmVkYW4gaSBkZW4gc3lzdGVtb21zcFx1MDBFNG5uYW5kZSBDQS1ueWNrZWxsYWdlcmZpbGVuIHVuZGVyIGFsaWFzZXQgPHswfT4ifSwKLSAgICAgICAgeyJEby55b3Uuc3RpbGwud2FudC50by5hZGQuaXQudG8ueW91ci5vd24ua2V5c3RvcmUubm8uIiwKLSAgICAgICAgICAgICAgICAiVmlsbCBkdSBmb3J0ZmFyYW5kZSBsXHUwMEU0Z2dhIHRpbGwgZGV0IGkgZGl0dCBlZ2V0IG55Y2tlbGxhZ3JldD8gW25lal06ICAifSwKLSAgICAgICAgeyJUcnVzdC50aGlzLmNlcnRpZmljYXRlLm5vLiIsICJMaXRhciBkdSBwXHUwMEU1IGRldCBoXHUwMEU0ciBjZXJ0aWZpa2F0ZXQ/IFtuZWpdOiAgIn0sCi0gICAgICAgIHsiWUVTIiwgIkphIn0sCi0gICAgICAgIHsiTmV3LnByb21wdC4iLCAiTnl0dCB7MH06ICJ9LAotICAgICAgICB7IlBhc3N3b3Jkcy5tdXN0LmRpZmZlciIsICJMXHUwMEY2c2Vub3JkZW4gbVx1MDBFNXN0ZSB2YXJhIG9saWthIn0sCi0gICAgICAgIHsiUmUuZW50ZXIubmV3LnByb21wdC4iLCAiQW5nZSBueXR0IHswfSBpZ2VuOiAifSwKLSAgICAgICAgeyJSZS5lbnRlci5uZXcucGFzc3dvcmQuIiwgIkFuZ2UgZGV0IG55YSBsXHUwMEY2c2Vub3JkZXQgaWdlbjogIn0sCi0gICAgICAgIHsiVGhleS5kb24udC5tYXRjaC5UcnkuYWdhaW4iLCAiRGUgbWF0Y2hhciBpbnRlLiBGXHUwMEY2cnNcdTAwRjZrIGlnZW4ifSwKLSAgICAgICAgeyJFbnRlci5wcm9tcHQuYWxpYXMubmFtZS4iLCAiQW5nZSBhbGlhc25hbW4gZlx1MDBGNnIgezB9OiAgIn0sCi0gICAgICAgIHsiRW50ZXIubmV3LmFsaWFzLm5hbWUuUkVUVVJOLnRvLmNhbmNlbC5pbXBvcnQuZm9yLnRoaXMuZW50cnkuIiwKLSAgICAgICAgICAgICAgICAgIkFuZ2UgZXR0IG55dHQgYWxpYXNuYW1uXHQoc2tyaXYgUkVUVVJOIGZcdTAwRjZyIGF0dCBhdmJyeXRhIGltcG9ydGVuIGF2IGRlbm5hIHBvc3QpOiAgIn0sCi0gICAgICAgIHsiRW50ZXIuYWxpYXMubmFtZS4iLCAiQW5nZSBhbGlhc25hbW46ICAifSwKLSAgICAgICAgeyIuUkVUVVJOLmlmLnNhbWUuYXMuZm9yLm90aGVyQWxpYXMuIiwKLSAgICAgICAgICAgICAgICAiXHQoUkVUVVJOIG9tIGRldCBcdTAwRTRyIGRldCBzYW1tYSBzb20gZlx1MDBGNnIgPHswfT4pIn0sCi0gICAgICAgIHsiLlBBVFRFUk4ucHJpbnRYNTA5Q2VydCIsCi0gICAgICAgICAgICAgICAgIlx1MDBDNGdhcmU6IHswfVxuVXRmXHUwMEU0cmRhcmU6IHsxfVxuU2VyaWVudW1tZXI6IHsyfVxuR2lsdGlndCBmclx1MDBFNW4gZGVuOiB7M30gdGlsbDogezR9XG5DZXJ0aWZpa2F0ZXRzIGZpbmdlcmF2dHJ5Y2s6XG5cdCBNRDU6IHs1fVxuXHQgU0hBMTogezZ9XG5cdCBTSEEyNTY6IHs3fVxuXHQgTmFtbiBwXHUwMEU1IHNpZ25hdHVyYWxnb3JpdG06IHs4fVxuXHQgVmVyc2lvbjogezl9In0sCi0gICAgICAgIHsiV2hhdC5pcy55b3VyLmZpcnN0LmFuZC5sYXN0Lm5hbWUuIiwKLSAgICAgICAgICAgICAgICAiVmFkIGhldGVyIGR1IGkgZlx1MDBGNnItIG9jaCBlZnRlcm5hbW4/In0sCi0gICAgICAgIHsiV2hhdC5pcy50aGUubmFtZS5vZi55b3VyLm9yZ2FuaXphdGlvbmFsLnVuaXQuIiwKLSAgICAgICAgICAgICAgICAiVmFkIGhldGVyIGRpbiBhdmRlbG5pbmcgaW5vbSBvcmdhbmlzYXRpb25lbj8ifSwKLSAgICAgICAgeyJXaGF0LmlzLnRoZS5uYW1lLm9mLnlvdXIub3JnYW5pemF0aW9uLiIsCi0gICAgICAgICAgICAgICAgIlZhZCBoZXRlciBkaW4gb3JnYW5pc2F0aW9uPyJ9LAotICAgICAgICB7IldoYXQuaXMudGhlLm5hbWUub2YueW91ci5DaXR5Lm9yLkxvY2FsaXR5LiIsCi0gICAgICAgICAgICAgICAgIlZhZCBoZXRlciBkaW4gb3J0IGVsbGVyIHBsYXRzPyJ9LAotICAgICAgICB7IldoYXQuaXMudGhlLm5hbWUub2YueW91ci5TdGF0ZS5vci5Qcm92aW5jZS4iLAotICAgICAgICAgICAgICAgICJWYWQgaGV0ZXIgZGl0dCBsYW5kIGVsbGVyIGRpbiBwcm92aW5zPyJ9LAotICAgICAgICB7IldoYXQuaXMudGhlLnR3by5sZXR0ZXIuY291bnRyeS5jb2RlLmZvci50aGlzLnVuaXQuIiwKLSAgICAgICAgICAgICAgICAiVmlsa2VuIFx1MDBFNHIgZGVuIHR2XHUwMEU1c3RcdTAwRTRsbGlnYSBsYW5kc2tvZGVuPyJ9LAotICAgICAgICB7IklzLm5hbWUuY29ycmVjdC4iLCAiXHUwMEM0ciB7MH0ga29ycmVrdD8ifSwKLSAgICAgICAgeyJubyIsICJuZWoifSwKLSAgICAgICAgeyJ5ZXMiLCAiamEifSwKLSAgICAgICAgeyJ5IiwgImoifSwKLSAgICAgICAgeyIuZGVmYXVsdFZhbHVlLiIsICIgIFt7MH1dOiAgIn0sCi0gICAgICAgIHsiQWxpYXMuYWxpYXMuaGFzLm5vLmtleSIsCi0gICAgICAgICAgICAgICAgIkFsaWFzZXQgPHswfT4gc2FrbmFyIG55Y2tlbCJ9LAotICAgICAgICB7IkFsaWFzLmFsaWFzLnJlZmVyZW5jZXMuYW4uZW50cnkudHlwZS50aGF0LmlzLm5vdC5hLnByaXZhdGUua2V5LmVudHJ5LlRoZS5rZXljbG9uZS5jb21tYW5kLm9ubHkuc3VwcG9ydHMuY2xvbmluZy5vZi5wcml2YXRlLmtleSIsCi0gICAgICAgICAgICAgICAgICJBbGlhc2V0IDx7MH0+IHJlZmVyZXJhciB0aWxsIGVuIHBvc3R0eXAgc29tIGludGUgXHUwMEU0ciBuXHUwMEU1Z29uIHByaXZhdCBueWNrZWxwb3N0LiBLb21tYW5kb3QgLWtleWNsb25lIGhhciBlbmRhc3Qgc3RcdTAwRjZkIGZcdTAwRjZyIGtsb25pbmcgYXYgcHJpdmF0YSBueWNrZWxwb3N0ZXIifSwKLQotICAgICAgICB7Ii5XQVJOSU5HLldBUk5JTkcuV0FSTklORy4iLAotICAgICAgICAgICAgIioqKioqKioqKioqKioqKioqICBWYXJuaW5nIFZhcm5pbmcgVmFybmluZyAgKioqKioqKioqKioqKioqKioifSwKLSAgICAgICAgeyJTaWduZXIuZC4iLCAiU2lnbmVyYXJlICMlZDoifSwKLSAgICAgICAgeyJUaW1lc3RhbXAuIiwgIlRpZHNzdFx1MDBFNG1wZWw6In0sCi0gICAgICAgIHsiU2lnbmF0dXJlLiIsICJVbmRlcnNrcmlmdDoifSwKLSAgICAgICAgeyJDUkxzLiIsICJDUkw6ZXI6In0sCi0gICAgICAgIHsiQ2VydGlmaWNhdGUub3duZXIuIiwgIkNlcnRpZmlrYXRcdTAwRTRnYXJlOiAifSwKLSAgICAgICAgeyJOb3QuYS5zaWduZWQuamFyLmZpbGUiLCAiSW5nZW4gc2lnbmVyYWQgamFyLWZpbCJ9LAotICAgICAgICB7Ik5vLmNlcnRpZmljYXRlLmZyb20udGhlLlNTTC5zZXJ2ZXIiLAotICAgICAgICAgICAgICAgICJJbmdldCBjZXJ0aWZpa2F0IGZyXHUwMEU1biBTU0wtc2VydmVybiJ9LAotCi0gICAgICAgIHsiLlRoZS5pbnRlZ3JpdHkub2YudGhlLmluZm9ybWF0aW9uLnN0b3JlZC5pbi55b3VyLmtleXN0b3JlLiIsCi0gICAgICAgICAgICAiKiBJbnRlZ3JpdGV0ZW4gZlx1MDBGNnIgZGVuIGluZm9ybWF0aW9uIHNvbSBsYWdyYXMgaSBueWNrZWxsYWdlcmZpbGVuICAqXG4qIGhhciBJTlRFIHZlcmlmaWVyYXRzISAgT20gZHUgdmlsbCB2ZXJpZmllcmEgZGVzcyBpbnRlZ3JpdGV0ICpcbiogbVx1MDBFNXN0ZSBkdSBhbmdlIGxcdTAwRjZzZW5vcmRldCBmXHUwMEY2ciBueWNrZWxsYWdyZXQuICAgICAgICAgICAgICAgICAgKiJ9LAotICAgICAgICB7Ii5UaGUuaW50ZWdyaXR5Lm9mLnRoZS5pbmZvcm1hdGlvbi5zdG9yZWQuaW4udGhlLnNyY2tleXN0b3JlLiIsCi0gICAgICAgICAgICAiKiBJbnRlZ3JpdGV0ZW4gZlx1MDBGNnIgZGVuIGluZm9ybWF0aW9uIHNvbSBsYWdyYXMgaSBzcmNrZXlzdG9yZSpcbiogaGFyIElOVEUgdmVyaWZpZXJhdHMhICBPbSBkdSB2aWxsIHZlcmlmaWVyYSBkZXNzIGludGVncml0ZXQgKlxuKiBtXHUwMEU1c3RlIGR1IGFuZ2UgbFx1MDBGNnNlbm9yZGV0IGZcdTAwRjZyIHNyY2tleXN0b3JlLiAgICAgICAgICAgICAgICAqIn0sCi0KLSAgICAgICAgeyJDZXJ0aWZpY2F0ZS5yZXBseS5kb2VzLm5vdC5jb250YWluLnB1YmxpYy5rZXkuZm9yLmFsaWFzLiIsCi0gICAgICAgICAgICAgICAgIkNlcnRpZmlrYXRzdmFyZXQgaW5uZWhcdTAwRTVsbGVyIGludGUgblx1MDBFNWdvbiBvZmZlbnRsaWcgbnlja2VsIGZcdTAwRjZyIDx7MH0+In0sCi0gICAgICAgIHsiSW5jb21wbGV0ZS5jZXJ0aWZpY2F0ZS5jaGFpbi5pbi5yZXBseSIsCi0gICAgICAgICAgICAgICAgIk9mdWxsc3RcdTAwRTRuZGlnIGNlcnRpZmlrYXRza2VkamEgaSBzdmFyZXQifSwKLSAgICAgICAgeyJDZXJ0aWZpY2F0ZS5jaGFpbi5pbi5yZXBseS5kb2VzLm5vdC52ZXJpZnkuIiwKLSAgICAgICAgICAgICAgICAiQ2VydGlmaWthdHNrZWRqYW4gaSBzdmFyZXQgZ1x1MDBFNXIgaW50ZSBhdHQgdmVyaWZpZXJhOiAifSwKLSAgICAgICAgeyJUb3AubGV2ZWwuY2VydGlmaWNhdGUuaW4ucmVwbHkuIiwKLSAgICAgICAgICAgICAgICAiVG9wcG5pdlx1MDBFNWNlcnRpZmlrYXRldCBpIHN2YXJldDpcbiJ9LAotICAgICAgICB7Ii5pcy5ub3QudHJ1c3RlZC4iLCAiLi4uIFx1MDBFNHIgaW50ZSBiZXRyb3R0LiAifSwKLSAgICAgICAgeyJJbnN0YWxsLnJlcGx5LmFueXdheS5uby4iLCAiVmlsbCBkdSBpbnN0YWxsZXJhIHN2YXJldCBcdTAwRTRuZFx1MDBFNT8gW25lal06ICAifSwKLSAgICAgICAgeyJOTyIsICJOZWoifSwKLSAgICAgICAgeyJQdWJsaWMua2V5cy5pbi5yZXBseS5hbmQua2V5c3RvcmUuZG9uLnQubWF0Y2giLAotICAgICAgICAgICAgICAgICJEZSBvZmZlbnRsaWdhIG55Y2tsYXJuYSBpIHN2YXJldCBvY2ggbnlja2VsbGFncmV0IG1hdGNoYXIgaW50ZSB2YXJhbmRyYSJ9LAotICAgICAgICB7IkNlcnRpZmljYXRlLnJlcGx5LmFuZC5jZXJ0aWZpY2F0ZS5pbi5rZXlzdG9yZS5hcmUuaWRlbnRpY2FsIiwKLSAgICAgICAgICAgICAgICAiQ2VydGlmaWthdHN2YXJldCBvY2ggY2VydGlmaWthdGV0IGkgbnlja2VsbGFncmV0IFx1MDBFNHIgaWRlbnRpc2thIn0sCi0gICAgICAgIHsiRmFpbGVkLnRvLmVzdGFibGlzaC5jaGFpbi5mcm9tLnJlcGx5IiwKLSAgICAgICAgICAgICAgICAiS3VuZGUgaW50ZSB1cHByXHUwMEU0dHRhIGtlZGphIGZyXHUwMEU1biBzdmFyZXQifSwKLSAgICAgICAgeyJuIiwgIm4ifSwKLSAgICAgICAgeyJXcm9uZy5hbnN3ZXIudHJ5LmFnYWluIiwgIkZlbCBzdmFyLiBGXHUwMEY2cnNcdTAwRjZrIHBcdTAwRTUgbnl0dC4ifSwKLSAgICAgICAgeyJTZWNyZXQua2V5Lm5vdC5nZW5lcmF0ZWQuYWxpYXMuYWxpYXMuYWxyZWFkeS5leGlzdHMiLAotICAgICAgICAgICAgICAgICJEZW4gaGVtbGlnYSBueWNrZWxuIGhhciBpbnRlIGdlbmVyZXJhdHMgZWZ0ZXJzb20gYWxpYXNldCA8ezB9PiByZWRhbiBmaW5ucyJ9LAotICAgICAgICB7IlBsZWFzZS5wcm92aWRlLmtleXNpemUuZm9yLnNlY3JldC5rZXkuZ2VuZXJhdGlvbiIsCi0gICAgICAgICAgICAgICAgIkFuZ2UgLWtleXNpemUgZlx1MDBGNnIgYXR0IHNrYXBhIGhlbWxpZyBueWNrZWwifSwKLQotICAgICAgICB7IkV4dGVuc2lvbnMuIiwgIlRpbGxcdTAwRTRnZzogIn0sCi0gICAgICAgIHsiLkVtcHR5LnZhbHVlLiIsICIoVG9tdCB2XHUwMEU0cmRlKSJ9LAotICAgICAgICB7IkV4dGVuc2lvbi5SZXF1ZXN0LiIsICJUaWxsXHUwMEU0Z2dzYmVnXHUwMEU0cmFuOiJ9LAotICAgICAgICB7IlBLQ1MuMTAuQ2VydGlmaWNhdGUuUmVxdWVzdC5WZXJzaW9uLjEuMC5TdWJqZWN0LnMuUHVibGljLktleS5zLmZvcm1hdC5zLmtleS4iLAotICAgICAgICAgICAgICAgICJQS0NTICMxMCBjZXJ0aWZpa2F0YmVnXHUwMEU0cmFuICh2ZXJzaW9uIDEuMClcblx1MDBDNG1uZTogJXNcbkFsbG1cdTAwRTRuIG55Y2tlbDogJXMtZm9ybWF0ICVzLW55Y2tlbFxuIn0sCi0gICAgICAgIHsiVW5rbm93bi5rZXlVc2FnZS50eXBlLiIsICJPa1x1MDBFNG5kIGtleVVzYWdlLXR5cDogIn0sCi0gICAgICAgIHsiVW5rbm93bi5leHRlbmRlZGtleVVzYWdlLnR5cGUuIiwgIk9rXHUwMEU0bmQgZXh0ZW5kZWRrZXlVc2FnZS10eXA6ICJ9LAotICAgICAgICB7IlVua25vd24uQWNjZXNzRGVzY3JpcHRpb24udHlwZS4iLCAiT2tcdTAwRTRuZCBBY2Nlc3NEZXNjcmlwdGlvbi10eXA6ICJ9LAotICAgICAgICB7IlVucmVjb2duaXplZC5HZW5lcmFsTmFtZS50eXBlLiIsICJPa1x1MDBFNG5kIEdlbmVyYWxOYW1lLXR5cDogIn0sCi0gICAgICAgIHsiVGhpcy5leHRlbnNpb24uY2Fubm90LmJlLm1hcmtlZC5hcy5jcml0aWNhbC4iLAotICAgICAgICAgICAgICAgICAiRGV0dGEgdGlsbFx1MDBFNGdnIGthbiBpbnRlIG1hcmtlcmFzIHNvbSBrcml0aXNrdC4gIn0sCi0gICAgICAgIHsiT2RkLm51bWJlci5vZi5oZXguZGlnaXRzLmZvdW5kLiIsICJVZGRhIGFudGFsIGhleC1zaWZmcm9yIHBcdTAwRTV0clx1MDBFNGZmYWRlczogIn0sCi0gICAgICAgIHsiVW5rbm93bi5leHRlbnNpb24udHlwZS4iLCAiT2tcdTAwRTRuZCB0aWxsXHUwMEU0Z2dzdHlwOiAifSwKLSAgICAgICAgeyJjb21tYW5kLnswfS5pcy5hbWJpZ3VvdXMuIiwgImtvbW1hbmRvdCB7MH0gXHUwMEU0ciB0dmV0eWRpZ3Q6In0sCi0KLSAgICAgICAgLy8gcG9saWN5dG9vbAotICAgICAgICB7Ildhcm5pbmcuQS5wdWJsaWMua2V5LmZvci5hbGlhcy5zaWduZXJzLmkuZG9lcy5ub3QuZXhpc3QuTWFrZS5zdXJlLmEuS2V5U3RvcmUuaXMucHJvcGVybHkuY29uZmlndXJlZC4iLAotICAgICAgICAgICAgICAgICJWYXJuaW5nISBEZXQgZmlubnMgaW5nZW4gb2ZmZW50bGlnIG55Y2tlbCBmXHUwMEY2ciBhbGlhc2V0IHswfS4gS29udHJvbGxlcmEgYXR0IGRldCBha3R1ZWxsYSBueWNrZWxsYWdyZXQgXHUwMEU0ciBrb3JyZWt0IGtvbmZpZ3VyZXJhdC4ifSwKLSAgICAgICAgeyJXYXJuaW5nLkNsYXNzLm5vdC5mb3VuZC5jbGFzcyIsICJWYXJuaW5nISBLbGFzc2VuIGhpdHRhZGVzIGludGU6IHswfSJ9LAotICAgICAgICB7Ildhcm5pbmcuSW52YWxpZC5hcmd1bWVudC5zLmZvci5jb25zdHJ1Y3Rvci5hcmciLAotICAgICAgICAgICAgICAgICJWYXJuaW5nISBPZ2lsdGlnYSBhcmd1bWVudCBmXHUwMEY2ciBrb25zdHJ1a3RvcjogezB9In0sCi0gICAgICAgIHsiSWxsZWdhbC5QcmluY2lwYWwuVHlwZS50eXBlIiwgIk90aWxsXHUwMEU1dGVuIGlkZW50aXRldHNoYXZhcmV0eXA6IHswfSJ9LAotICAgICAgICB7IklsbGVnYWwub3B0aW9uLm9wdGlvbiIsICJPdGlsbFx1MDBFNXRldCBhbHRlcm5hdGl2OiB7MH0ifSwKLSAgICAgICAgeyJVc2FnZS5wb2xpY3l0b29sLm9wdGlvbnMuIiwgIlN5bnRheDogcG9saWN5dG9vbCBbYWx0ZXJuYXRpdl0ifSwKLSAgICAgICAgeyIuZmlsZS5maWxlLnBvbGljeS5maWxlLmxvY2F0aW9uIiwKLSAgICAgICAgICAgICAgICAiICBbLWZpbGUgPGZpbD5dICAgIHBvbGljeWZpbGVucyBwbGF0cyJ9LAotICAgICAgICB7Ik5ldyIsICJOeXR0In0sCi0gICAgICAgIHsiT3BlbiIsICJcdTAwRDZwcG5hIn0sCi0gICAgICAgIHsiU2F2ZSIsICJTcGFyYSJ9LAotICAgICAgICB7IlNhdmUuQXMiLCAiU3BhcmEgc29tIn0sCi0gICAgICAgIHsiVmlldy5XYXJuaW5nLkxvZyIsICJWaXNhIHZhcm5pbmdzbG9nZyJ9LAotICAgICAgICB7IkV4aXQiLCAiQXZzbHV0YSJ9LAotICAgICAgICB7IkFkZC5Qb2xpY3kuRW50cnkiLCAiTFx1MDBFNGdnIHRpbGwgcG9saWN5cG9zdCJ9LAotICAgICAgICB7IkVkaXQuUG9saWN5LkVudHJ5IiwgIlJlZGlnZXJhIHBvbGljeXBvc3QifSwKLSAgICAgICAgeyJSZW1vdmUuUG9saWN5LkVudHJ5IiwgIlRhIGJvcnQgcG9saWN5cG9zdCJ9LAotICAgICAgICB7IkVkaXQiLCAiUmVkaWdlcmEifSwKLSAgICAgICAgeyJSZXRhaW4iLCAiQmVoXHUwMEU1bGwifSwKLQotICAgICAgICB7Ildhcm5pbmcuRmlsZS5uYW1lLm1heS5pbmNsdWRlLmVzY2FwZWQuYmFja3NsYXNoLmNoYXJhY3RlcnMuSXQuaXMubm90Lm5lY2Vzc2FyeS50by5lc2NhcGUuYmFja3NsYXNoLmNoYXJhY3RlcnMudGhlLnRvb2wuZXNjYXBlcyIsCi0gICAgICAgICAgICAiVmFybmluZyEgRmlsbmFtbmV0IGthbiBpbm5laFx1MDBFNWxsYSBvbXZcdTAwRTRuZGEgc25lZHN0cmVjayBpbm9tIGNpdGF0dGVja2VuLiBDaXRhdHRlY2tlbiBrclx1MDBFNHZzIGludGUgZlx1MDBGNnIgb212XHUwMEU0bmRhIHNuZWRzdHJlY2sgKHZlcmt0eWdldCBoYW50ZXJhciBkZXR0YSBuXHUwMEU0ciBwb2xpY3lpbm5laFx1MDBFNWxsZXQgc2tyaXZzIHRpbGwgZGV0IGJlc3RcdTAwRTRuZGlnYSBsYWdyZXQpLlxuXG5LbGlja2EgcFx1MDBFNSBCZWhcdTAwRTVsbCBmXHUwMEY2ciBhdHQgYmVoXHUwMEU1bGxhIGRldCBhbmdpdm5hIG5hbW5ldCwgZWxsZXIga2xpY2thIHBcdTAwRTUgUmVkaWdlcmEgZlx1MDBGNnIgYXR0IFx1MDBFNG5kcmEgZGV0LiJ9LAotCi0gICAgICAgIHsiQWRkLlB1YmxpYy5LZXkuQWxpYXMiLCAiTFx1MDBFNGdnIHRpbGwgb2ZmZW50bGlndCBueWNrZWxhbGlhcyJ9LAotICAgICAgICB7IlJlbW92ZS5QdWJsaWMuS2V5LkFsaWFzIiwgIlRhIGJvcnQgb2ZmZW50bGlndCBueWNrZWxhbGlhcyJ9LAotICAgICAgICB7IkZpbGUiLCAiRmlsIn0sCi0gICAgICAgIHsiS2V5U3RvcmUiLCAiTnlja2VsbGFnZXIifSwKLSAgICAgICAgeyJQb2xpY3kuRmlsZS4iLCAiUG9saWN5ZmlsOiJ9LAotICAgICAgICB7IkNvdWxkLm5vdC5vcGVuLnBvbGljeS5maWxlLnBvbGljeUZpbGUuZS50b1N0cmluZy4iLAotICAgICAgICAgICAgICAgICJLYW4gaW50ZSBcdTAwRjZwcG5hIHBvbGljeWZpbGVuOiB7MH06IHsxfSJ9LAotICAgICAgICB7IlBvbGljeS5Ub29sIiwgIlBvbGljeXZlcmt0eWcifSwKLSAgICAgICAgeyJFcnJvcnMuaGF2ZS5vY2N1cnJlZC53aGlsZS5vcGVuaW5nLnRoZS5wb2xpY3kuY29uZmlndXJhdGlvbi5WaWV3LnRoZS5XYXJuaW5nLkxvZy5mb3IubW9yZS5pbmZvcm1hdGlvbi4iLAotICAgICAgICAgICAgICAgICJEZXQgdXBwc3RvZCBldHQgZmVsIG5cdTAwRTRyIHBvbGljeWtvbmZpZ3VyYXRpb25lbiBza3VsbGUgXHUwMEY2cHBuYXMuIFNlIHZhcm5pbmdzbG9nZ2VuIGZcdTAwRjZyIG1lciBpbmZvcm1hdGlvbi4ifSwKLSAgICAgICAgeyJFcnJvciIsICJGZWwifSwKLSAgICAgICAgeyJPSyIsICJPSyJ9LAotICAgICAgICB7IlN0YXR1cyIsICJTdGF0dXMifSwKLSAgICAgICAgeyJXYXJuaW5nIiwgIlZhcm5pbmcifSwKLSAgICAgICAgeyJQZXJtaXNzaW9uLiIsCi0gICAgICAgICAgICAgICAgIkJlaFx1MDBGNnJpZ2hldDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIn0sCi0gICAgICAgIHsiUHJpbmNpcGFsLlR5cGUuIiwgIklkZW50aXRldHNoYXZhcmV0eXA6In0sCi0gICAgICAgIHsiUHJpbmNpcGFsLk5hbWUuIiwgIklkZW50aXRldHNoYXZhcmU6In0sCi0gICAgICAgIHsiVGFyZ2V0Lk5hbWUuIiwKLSAgICAgICAgICAgICAgICAiTVx1MDBFNWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9LAotICAgICAgICB7IkFjdGlvbnMuIiwKLSAgICAgICAgICAgICAgICAiRnVua3Rpb25lcjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIn0sCi0gICAgICAgIHsiT0sudG8ub3ZlcndyaXRlLmV4aXN0aW5nLmZpbGUuZmlsZW5hbWUuIiwKLSAgICAgICAgICAgICAgICAiU2thIGRlbiBiZWZpbnRsaWdhIGZpbGVuIHswfSBza3JpdmFzIFx1MDBGNnZlcj8ifSwKLSAgICAgICAgeyJDYW5jZWwiLCAiQXZicnl0In0sCi0gICAgICAgIHsiQ29kZUJhc2UuIiwgIktvZGJhczoifSwKLSAgICAgICAgeyJTaWduZWRCeS4iLCAiU2lnbmVyYWQgYXY6In0sCi0gICAgICAgIHsiQWRkLlByaW5jaXBhbCIsICJMXHUwMEU0Z2cgdGlsbCBpZGVudGl0ZXRzaGF2YXJlIn0sCi0gICAgICAgIHsiRWRpdC5QcmluY2lwYWwiLCAiUmVkaWdlcmEgaWRlbnRpdGV0c2hhdmFyZSJ9LAotICAgICAgICB7IlJlbW92ZS5QcmluY2lwYWwiLCAiVGEgYm9ydCBpZGVudGl0ZXRzaGF2YXJlIn0sCi0gICAgICAgIHsiUHJpbmNpcGFscy4iLCAiSWRlbnRpdGV0c2hhdmFyZToifSwKLSAgICAgICAgeyIuQWRkLlBlcm1pc3Npb24iLCAiICBMXHUwMEU0Z2cgdGlsbCBiZWhcdTAwRjZyaWdoZXQifSwKLSAgICAgICAgeyIuRWRpdC5QZXJtaXNzaW9uIiwgIiAgUmVkaWdlcmEgYmVoXHUwMEY2cmlnaGV0In0sCi0gICAgICAgIHsiUmVtb3ZlLlBlcm1pc3Npb24iLCAiVGEgYm9ydCBiZWhcdTAwRjZyaWdoZXQifSwKLSAgICAgICAgeyJEb25lIiwgIlV0Zlx1MDBGNnJkIn0sCi0gICAgICAgIHsiS2V5U3RvcmUuVVJMLiIsICJVUkwgZlx1MDBGNnIgbnlja2VsbGFnZXI6In0sCi0gICAgICAgIHsiS2V5U3RvcmUuVHlwZS4iLCAiTnlja2VsbGFnZXJ0eXA6In0sCi0gICAgICAgIHsiS2V5U3RvcmUuUHJvdmlkZXIuIiwgIk55Y2tlbGxhZ2VybGV2ZXJhbnRcdTAwRjZyOiJ9LAotICAgICAgICB7IktleVN0b3JlLlBhc3N3b3JkLlVSTC4iLCAiVVJMIGZcdTAwRjZyIGxcdTAwRjZzZW5vcmQgdGlsbCBueWNrZWxsYWdlcjoifSwKLSAgICAgICAgeyJQcmluY2lwYWxzIiwgIklkZW50aXRldHNoYXZhcmUifSwKLSAgICAgICAgeyIuRWRpdC5QcmluY2lwYWwuIiwgIiAgUmVkaWdlcmEgaWRlbnRpdGV0c2hhdmFyZToifSwKLSAgICAgICAgeyIuQWRkLk5ldy5QcmluY2lwYWwuIiwgIiAgTFx1MDBFNGdnIHRpbGwgbnkgaWRlbnRpdGV0c2hhdmFyZToifSwKLSAgICAgICAgeyJQZXJtaXNzaW9ucyIsICJCZWhcdTAwRjZyaWdoZXQifSwKLSAgICAgICAgeyIuRWRpdC5QZXJtaXNzaW9uLiIsICIgIFJlZGlnZXJhIGJlaFx1MDBGNnJpZ2hldDoifSwKLSAgICAgICAgeyIuQWRkLk5ldy5QZXJtaXNzaW9uLiIsICIgIExcdTAwRTRnZyB0aWxsIG55IGJlaFx1MDBGNnJpZ2hldDoifSwKLSAgICAgICAgeyJTaWduZWQuQnkuIiwgIlNpZ25lcmFkIGF2OiJ9LAotICAgICAgICB7IkNhbm5vdC5TcGVjaWZ5LlByaW5jaXBhbC53aXRoLmEuV2lsZGNhcmQuQ2xhc3Mud2l0aG91dC5hLldpbGRjYXJkLk5hbWUiLAotICAgICAgICAgICAgIkthbiBpbnRlIHNwZWNpZmljZXJhIGlkZW50aXRldHNoYXZhcmUgbWVkIGpva2VydGVja2Vua2xhc3MgdXRhbiBqb2tlcnRlY2tlbm5hbW4ifSwKLSAgICAgICAgeyJDYW5ub3QuU3BlY2lmeS5QcmluY2lwYWwud2l0aG91dC5hLk5hbWUiLAotICAgICAgICAgICAgIkthbiBpbnRlIHNwZWNpZmljZXJhIGlkZW50aXRldHNoYXZhcmUgdXRhbiBuYW1uIn0sCi0gICAgICAgIHsiUGVybWlzc2lvbi5hbmQuVGFyZ2V0Lk5hbWUubXVzdC5oYXZlLmEudmFsdWUiLAotICAgICAgICAgICAgICAgICJCZWhcdTAwRjZyaWdoZXQgb2NoIG1cdTAwRTVsbmFtbiBtXHUwMEU1c3RlIGhhIGV0dCB2XHUwMEU0cmRlIn0sCi0gICAgICAgIHsiUmVtb3ZlLnRoaXMuUG9saWN5LkVudHJ5LiIsICJWaWxsIGR1IHRhIGJvcnQgZGVuIGhcdTAwRTRyIHBvbGljeXBvc3Rlbj8ifSwKLSAgICAgICAgeyJPdmVyd3JpdGUuRmlsZSIsICJTa3JpdiBcdTAwRjZ2ZXIgZmlsIn0sCi0gICAgICAgIHsiUG9saWN5LnN1Y2Nlc3NmdWxseS53cml0dGVuLnRvLmZpbGVuYW1lIiwKLSAgICAgICAgICAgICAgICAiUG9saWN5IGhhciBza3Jpdml0cyB0aWxsIHswfSJ9LAotICAgICAgICB7Im51bGwuZmlsZW5hbWUiLCAibnVsbGZpbG5hbW4ifSwKLSAgICAgICAgeyJTYXZlLmNoYW5nZXMuIiwgIlZpbGwgZHUgc3BhcmEgXHUwMEU0bmRyaW5nYXJuYT8ifSwKLSAgICAgICAgeyJZZXMiLCAiSmEifSwKLSAgICAgICAgeyJObyIsICJOZWoifSwKLSAgICAgICAgeyJQb2xpY3kuRW50cnkiLCAiUG9saWN5ZmVsIn0sCi0gICAgICAgIHsiU2F2ZS5DaGFuZ2VzIiwgIlNwYXJhIFx1MDBFNG5kcmluZ2FyIn0sCi0gICAgICAgIHsiTm8uUG9saWN5LkVudHJ5LnNlbGVjdGVkIiwgIkluZ2VuIHBvbGljeXBvc3QgaGFyIHZhbHRzIn0sCi0gICAgICAgIHsiVW5hYmxlLnRvLm9wZW4uS2V5U3RvcmUuZXgudG9TdHJpbmcuIiwKLSAgICAgICAgICAgICAgICAiS2FuIGludGUgXHUwMEY2cHBuYSBueWNrZWxsYWdyZXQ6IHswfSJ9LAotICAgICAgICB7Ik5vLnByaW5jaXBhbC5zZWxlY3RlZCIsICJJbmdlbiBpZGVudGl0ZXRzaGF2YXJlIGhhciB2YWx0cyJ9LAotICAgICAgICB7Ik5vLnBlcm1pc3Npb24uc2VsZWN0ZWQiLCAiSW5nZW4gYmVoXHUwMEY2cmlnaGV0IGhhciB2YWx0cyJ9LAotICAgICAgICB7Im5hbWUiLCAibmFtbiJ9LAotICAgICAgICB7ImNvbmZpZ3VyYXRpb24udHlwZSIsICJrb25maWd1cmF0aW9uc3R5cCJ9LAotICAgICAgICB7ImVudmlyb25tZW50LnZhcmlhYmxlLm5hbWUiLCAidmFyaWFiZWxuYW1uIGZcdTAwRjZyIG1pbGpcdTAwRjYifSwKLSAgICAgICAgeyJsaWJyYXJ5Lm5hbWUiLCAiYmlibGlvdGVrc25hbW4ifSwKLSAgICAgICAgeyJwYWNrYWdlLm5hbWUiLCAicGFrZXRuYW1uIn0sCi0gICAgICAgIHsicG9saWN5LnR5cGUiLCAicG9saWN5dHlwIn0sCi0gICAgICAgIHsicHJvcGVydHkubmFtZSIsICJlZ2Vuc2thcHNuYW1uIn0sCi0gICAgICAgIHsiUHJpbmNpcGFsLkxpc3QiLCAiTGlzdGEgXHUwMEY2dmVyIGlkZW50aXRldHNoYXZhcmUifSwKLSAgICAgICAgeyJQZXJtaXNzaW9uLkxpc3QiLCAiQmVoXHUwMEY2cmlnaGV0c2xpc3RhIn0sCi0gICAgICAgIHsiQ29kZS5CYXNlIiwgIktvZGJhcyJ9LAotICAgICAgICB7IktleVN0b3JlLlUuUi5MLiIsICJVUkwgZlx1MDBGNnIgbnlja2VsbGFnZXI6In0sCi0gICAgICAgIHsiS2V5U3RvcmUuUGFzc3dvcmQuVS5SLkwuIiwgIlVSTCBmXHUwMEY2ciBsXHUwMEY2c2Vub3JkIHRpbGwgbnlja2VsbGFnZXI6In0sCi0KLQogICAgICAgICAvLyBqYXZheC5zZWN1cml0eS5hdXRoLlByaXZhdGVDcmVkZW50aWFsUGVybWlzc2lvbgogICAgICAgICB7ImludmFsaWQubnVsbC5pbnB1dC5zLiIsICJvZ2lsdGlnYSBudWxsLWluZGF0YSJ9LAogICAgICAgICB7ImFjdGlvbnMuY2FuLm9ubHkuYmUucmVhZC4iLCAiZnVua3Rpb25lciBrYW4gZW5kYXN0ICdsXHUwMEU0c2FzJyJ9LApAQCAtNTUzLDYgKzU4LDcgQEAKICAgICAgICAgeyJwcm92aWRlZC5udWxsLk9JRC5tYXAiLCAibnVsbC1PSUQtbWFwcG5pbmcgdGlsbGhhbmRhaFx1MDBGNmxscyJ9LAogCiAgICAgICAgIC8vIGphdmF4LnNlY3VyaXR5LmF1dGguU3ViamVjdAorICAgICAgICB7Ik5FV0xJTkUiLCAiXG4ifSwKICAgICAgICAgeyJpbnZhbGlkLm51bGwuQWNjZXNzQ29udHJvbENvbnRleHQucHJvdmlkZWQiLAogICAgICAgICAgICAgICAgICJvZ2lsdGlndCBudWxsLUFjY2Vzc0NvbnRyb2xDb250ZXh0In0sCiAgICAgICAgIHsiaW52YWxpZC5udWxsLmFjdGlvbi5wcm92aWRlZCIsICJvZ2lsdGlnIG51bGwtZnVua3Rpb24ifSwKQEAgLTY1Niw2ICsxNjIsNyBAQAogICAgICAqCiAgICAgICogQHJldHVybiB0aGUgY29udGVudHMgb2YgdGhpcyA8Y29kZT5SZXNvdXJjZUJ1bmRsZTwvY29kZT4uCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIE9iamVjdFtdW10gZ2V0Q29udGVudHMoKSB7CiAgICAgICAgIHJldHVybiBjb250ZW50czsKICAgICB9CmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3V0aWwvUmVzb3VyY2VzX3poX0NOLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3V0aWwvUmVzb3VyY2VzX3poX0NOLmphdmEKaW5kZXggZmE0ZjdhNC4uODBiODc2MyAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS91dGlsL1Jlc291cmNlc196aF9DTi5qYXZhCisrKyBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdXRpbC9SZXNvdXJjZXNfemhfQ04uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTEsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTM0LDUwMSArMzQsNiBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W11bXSBjb250ZW50cyA9IHsKIAotICAgICAgICAvLyBzaGFyZWQgKGZyb20gamFyc2lnbmVyKQotICAgICAgICB7IlNQQUNFIiwgIiAifSwKLSAgICAgICAgeyIyU1BBQ0UiLCAiICAifSwKLSAgICAgICAgeyI2U1BBQ0UiLCAiICAgICAgIn0sCi0gICAgICAgIHsiQ09NTUEiLCAiLCAifSwKLSAgICAgICAgLy8gc2hhcmVkIChmcm9tIGtleXRvb2wpCi0gICAgICAgIHsiTkVXTElORSIsICJcbiJ9LAotICAgICAgICB7IlNUQVIiLAotICAgICAgICAgICAgICAgICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIn0sCi0gICAgICAgIHsiU1RBUk5OIiwKLSAgICAgICAgICAgICAgICAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG4ifSwKLQotICAgICAgICAvLyBrZXl0b29sOiBIZWxwIHBhcnQKLS8vICJPcHRpb24iIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotICAgICAgICB7Ii5PUFRJT04uIiwgIiBbXHU5MDA5XHU5ODc5XS4uLiJ9LAotICAgICAgICB7Ik9wdGlvbnMuIiwgIlx1OTAwOVx1OTg3OToifSwKLSAgICAgICAgeyJVc2Uua2V5dG9vbC5oZWxwLmZvci5hbGwuYXZhaWxhYmxlLmNvbW1hbmRzIiwKLSAgICAgICAgICAgICAgICAgIlx1NEY3Rlx1NzUyOCBcImtleXRvb2wgLWhlbHBcIiBcdTgzQjdcdTUzRDZcdTYyNDBcdTY3MDlcdTUzRUZcdTc1MjhcdTU0N0RcdTRFRTQifSwKLSAgICAgICAgeyJLZXkuYW5kLkNlcnRpZmljYXRlLk1hbmFnZW1lbnQuVG9vbCIsCi0gICAgICAgICAgICAgICAgICJcdTVCQzZcdTk0QTVcdTU0OENcdThCQzFcdTRFNjZcdTdCQTFcdTc0MDZcdTVERTVcdTUxNzcifSwKLSAgICAgICAgeyJDb21tYW5kcy4iLCAiXHU1NDdEXHU0RUU0OiJ9LAotICAgICAgICB7IlVzZS5rZXl0b29sLmNvbW1hbmQubmFtZS5oZWxwLmZvci51c2FnZS5vZi5jb21tYW5kLm5hbWUiLAotICAgICAgICAgICAgICAgICJcdTRGN0ZcdTc1MjggXCJrZXl0b29sIC1jb21tYW5kX25hbWUgLWhlbHBcIiBcdTgzQjdcdTUzRDYgY29tbWFuZF9uYW1lIFx1NzY4NFx1NzUyOFx1NkNENSJ9LAotICAgICAgICAvLyBrZXl0b29sOiBoZWxwOiBjb21tYW5kcwotICAgICAgICB7IkdlbmVyYXRlcy5hLmNlcnRpZmljYXRlLnJlcXVlc3QiLAotICAgICAgICAgICAgICAgICJcdTc1MUZcdTYyMTBcdThCQzFcdTRFNjZcdThCRjdcdTZDNDIifSwgLy8tY2VydHJlcQotICAgICAgICB7IkNoYW5nZXMuYW4uZW50cnkucy5hbGlhcyIsCi0gICAgICAgICAgICAgICAgIlx1NjZGNFx1NjUzOVx1Njc2MVx1NzZFRVx1NzY4NFx1NTIyQlx1NTQwRCJ9LCAvLy1jaGFuZ2VhbGlhcwotICAgICAgICB7IkRlbGV0ZXMuYW4uZW50cnkiLAotICAgICAgICAgICAgICAgICJcdTUyMjBcdTk2NjRcdTY3NjFcdTc2RUUifSwgLy8tZGVsZXRlCi0gICAgICAgIHsiRXhwb3J0cy5jZXJ0aWZpY2F0ZSIsCi0gICAgICAgICAgICAgICAgIlx1NUJGQ1x1NTFGQVx1OEJDMVx1NEU2NiJ9LCAvLy1leHBvcnRjZXJ0Ci0gICAgICAgIHsiR2VuZXJhdGVzLmEua2V5LnBhaXIiLAotICAgICAgICAgICAgICAgICJcdTc1MUZcdTYyMTBcdTVCQzZcdTk0QTVcdTVCRjkifSwgLy8tZ2Vua2V5cGFpcgotLy8gdHJhbnNsYXRpb24gb2YgInNlY3JldCIga2V5IHNob3VsZCBiZSBkaWZmZXJlbnQgdG8gInByaXZhdGUiIGtleS4KLSAgICAgICAgeyJHZW5lcmF0ZXMuYS5zZWNyZXQua2V5IiwKLSAgICAgICAgICAgICAgICAiXHU3NTFGXHU2MjEwXHU1QkY5XHU3OUYwXHU1QkM2XHU5NEE1In0sIC8vLWdlbnNlY2tleQotICAgICAgICB7IkdlbmVyYXRlcy5jZXJ0aWZpY2F0ZS5mcm9tLmEuY2VydGlmaWNhdGUucmVxdWVzdCIsCi0gICAgICAgICAgICAgICAgIlx1NjgzOVx1NjM2RVx1OEJDMVx1NEU2Nlx1OEJGN1x1NkM0Mlx1NzUxRlx1NjIxMFx1OEJDMVx1NEU2NiJ9LCAvLy1nZW5jZXJ0Ci0gICAgICAgIHsiR2VuZXJhdGVzLkNSTCIsICJcdTc1MUZcdTYyMTAgQ1JMIn0sIC8vLWdlbmNybAotICAgICAgICB7IkltcG9ydHMuZW50cmllcy5mcm9tLmEuSkRLLjEuMS54LnN0eWxlLmlkZW50aXR5LmRhdGFiYXNlIiwKLSAgICAgICAgICAgICAgICAiXHU0RUNFIEpESyAxLjEueCBcdTY4MzdcdTVGMEZcdTc2ODRcdThFQUJcdTRFRkRcdTY1NzBcdTYzNkVcdTVFOTNcdTVCRkNcdTUxNjVcdTY3NjFcdTc2RUUifSwgLy8taWRlbnRpdHlkYgotICAgICAgICB7IkltcG9ydHMuYS5jZXJ0aWZpY2F0ZS5vci5hLmNlcnRpZmljYXRlLmNoYWluIiwKLSAgICAgICAgICAgICAgICAiXHU1QkZDXHU1MTY1XHU4QkMxXHU0RTY2XHU2MjE2XHU4QkMxXHU0RTY2XHU5NEZFIn0sIC8vLWltcG9ydGNlcnQKLSAgICAgICAgeyJJbXBvcnRzLm9uZS5vci5hbGwuZW50cmllcy5mcm9tLmFub3RoZXIua2V5c3RvcmUiLAotICAgICAgICAgICAgICAgICJcdTRFQ0VcdTUxNzZcdTRFRDZcdTVCQzZcdTk0QTVcdTVFOTNcdTVCRkNcdTUxNjVcdTRFMDBcdTRFMkFcdTYyMTZcdTYyNDBcdTY3MDlcdTY3NjFcdTc2RUUifSwgLy8taW1wb3J0a2V5c3RvcmUKLSAgICAgICAgeyJDbG9uZXMuYS5rZXkuZW50cnkiLAotICAgICAgICAgICAgICAgICJcdTUxNEJcdTk2ODZcdTVCQzZcdTk0QTVcdTY3NjFcdTc2RUUifSwgLy8ta2V5Y2xvbmUKLSAgICAgICAgeyJDaGFuZ2VzLnRoZS5rZXkucGFzc3dvcmQub2YuYW4uZW50cnkiLAotICAgICAgICAgICAgICAgICJcdTY2RjRcdTY1MzlcdTY3NjFcdTc2RUVcdTc2ODRcdTVCQzZcdTk0QTVcdTUzRTNcdTRFRTQifSwgLy8ta2V5cGFzc3dkCi0gICAgICAgIHsiTGlzdHMuZW50cmllcy5pbi5hLmtleXN0b3JlIiwKLSAgICAgICAgICAgICAgICAiXHU1MjE3XHU1MUZBXHU1QkM2XHU5NEE1XHU1RTkzXHU0RTJEXHU3Njg0XHU2NzYxXHU3NkVFIn0sIC8vLWxpc3QKLSAgICAgICAgeyJQcmludHMudGhlLmNvbnRlbnQub2YuYS5jZXJ0aWZpY2F0ZSIsCi0gICAgICAgICAgICAgICAgIlx1NjI1M1x1NTM3MFx1OEJDMVx1NEU2Nlx1NTE4NVx1NUJCOSJ9LCAvLy1wcmludGNlcnQKLSAgICAgICAgeyJQcmludHMudGhlLmNvbnRlbnQub2YuYS5jZXJ0aWZpY2F0ZS5yZXF1ZXN0IiwKLSAgICAgICAgICAgICAgICAiXHU2MjUzXHU1MzcwXHU4QkMxXHU0RTY2XHU4QkY3XHU2QzQyXHU3Njg0XHU1MTg1XHU1QkI5In0sIC8vLXByaW50Y2VydHJlcQotICAgICAgICB7IlByaW50cy50aGUuY29udGVudC5vZi5hLkNSTC5maWxlIiwKLSAgICAgICAgICAgICAgICAiXHU2MjUzXHU1MzcwIENSTCBcdTY1ODdcdTRFRjZcdTc2ODRcdTUxODVcdTVCQjkifSwgLy8tcHJpbnRjcmwKLSAgICAgICAgeyJHZW5lcmF0ZXMuYS5zZWxmLnNpZ25lZC5jZXJ0aWZpY2F0ZSIsCi0gICAgICAgICAgICAgICAgIlx1NzUxRlx1NjIxMFx1ODFFQVx1N0I3RVx1NTQwRFx1OEJDMVx1NEU2NiJ9LCAvLy1zZWxmY2VydAotICAgICAgICB7IkNoYW5nZXMudGhlLnN0b3JlLnBhc3N3b3JkLm9mLmEua2V5c3RvcmUiLAotICAgICAgICAgICAgICAgICJcdTY2RjRcdTY1MzlcdTVCQzZcdTk0QTVcdTVFOTNcdTc2ODRcdTVCNThcdTUwQThcdTUzRTNcdTRFRTQifSwgLy8tc3RvcmVwYXNzd2QKLSAgICAgICAgLy8ga2V5dG9vbDogaGVscDogb3B0aW9ucwotICAgICAgICB7ImFsaWFzLm5hbWUub2YudGhlLmVudHJ5LnRvLnByb2Nlc3MiLAotICAgICAgICAgICAgICAgICJcdTg5ODFcdTU5MDRcdTc0MDZcdTc2ODRcdTY3NjFcdTc2RUVcdTc2ODRcdTUyMkJcdTU0MEQifSwgLy8tYWxpYXMKLSAgICAgICAgeyJkZXN0aW5hdGlvbi5hbGlhcyIsCi0gICAgICAgICAgICAgICAgIlx1NzZFRVx1NjgwN1x1NTIyQlx1NTQwRCJ9LCAvLy1kZXN0YWxpYXMKLSAgICAgICAgeyJkZXN0aW5hdGlvbi5rZXkucGFzc3dvcmQiLAotICAgICAgICAgICAgICAgICJcdTc2RUVcdTY4MDdcdTVCQzZcdTk0QTVcdTUzRTNcdTRFRTQifSwgLy8tZGVzdGtleXBhc3MKLSAgICAgICAgeyJkZXN0aW5hdGlvbi5rZXlzdG9yZS5uYW1lIiwKLSAgICAgICAgICAgICAgICAiXHU3NkVFXHU2ODA3XHU1QkM2XHU5NEE1XHU1RTkzXHU1NDBEXHU3OUYwIn0sIC8vLWRlc3RrZXlzdG9yZQotICAgICAgICB7ImRlc3RpbmF0aW9uLmtleXN0b3JlLnBhc3N3b3JkLnByb3RlY3RlZCIsCi0gICAgICAgICAgICAgICAgIlx1NTNEN1x1NEZERFx1NjJBNFx1NzY4NFx1NzZFRVx1NjgwN1x1NUJDNlx1OTRBNVx1NUU5M1x1NTNFM1x1NEVFNCJ9LCAvLy1kZXN0cHJvdGVjdGVkCi0gICAgICAgIHsiZGVzdGluYXRpb24ua2V5c3RvcmUucHJvdmlkZXIubmFtZSIsCi0gICAgICAgICAgICAgICAgIlx1NzZFRVx1NjgwN1x1NUJDNlx1OTRBNVx1NUU5M1x1NjNEMFx1NEY5Qlx1NjVCOVx1NTQwRFx1NzlGMCJ9LCAvLy1kZXN0cHJvdmlkZXJuYW1lCi0gICAgICAgIHsiZGVzdGluYXRpb24ua2V5c3RvcmUucGFzc3dvcmQiLAotICAgICAgICAgICAgICAgICJcdTc2RUVcdTY4MDdcdTVCQzZcdTk0QTVcdTVFOTNcdTUzRTNcdTRFRTQifSwgLy8tZGVzdHN0b3JlcGFzcwotICAgICAgICB7ImRlc3RpbmF0aW9uLmtleXN0b3JlLnR5cGUiLAotICAgICAgICAgICAgICAgICJcdTc2RUVcdTY4MDdcdTVCQzZcdTk0QTVcdTVFOTNcdTdDN0JcdTU3OEIifSwgLy8tZGVzdHN0b3JldHlwZQotICAgICAgICB7ImRpc3Rpbmd1aXNoZWQubmFtZSIsCi0gICAgICAgICAgICAgICAgIlx1NTUyRlx1NEUwMFx1NTIyNFx1NTIyQlx1NTQwRCJ9LCAvLy1kbmFtZQotICAgICAgICB7IlguNTA5LmV4dGVuc2lvbiIsCi0gICAgICAgICAgICAgICAgIlguNTA5IFx1NjI2OVx1NUM1NSJ9LCAvLy1leHQKLSAgICAgICAgeyJvdXRwdXQuZmlsZS5uYW1lIiwKLSAgICAgICAgICAgICAgICAiXHU4RjkzXHU1MUZBXHU2NTg3XHU0RUY2XHU1NDBEIn0sIC8vLWZpbGUgYW5kIC1vdXRmaWxlCi0gICAgICAgIHsiaW5wdXQuZmlsZS5uYW1lIiwKLSAgICAgICAgICAgICAgICAiXHU4RjkzXHU1MTY1XHU2NTg3XHU0RUY2XHU1NDBEIn0sIC8vLWZpbGUgYW5kIC1pbmZpbGUKLSAgICAgICAgeyJrZXkuYWxnb3JpdGhtLm5hbWUiLAotICAgICAgICAgICAgICAgICJcdTVCQzZcdTk0QTVcdTdCOTdcdTZDRDVcdTU0MERcdTc5RjAifSwgLy8ta2V5YWxnCi0gICAgICAgIHsia2V5LnBhc3N3b3JkIiwKLSAgICAgICAgICAgICAgICAiXHU1QkM2XHU5NEE1XHU1M0UzXHU0RUU0In0sIC8vLWtleXBhc3MKLSAgICAgICAgeyJrZXkuYml0LnNpemUiLAotICAgICAgICAgICAgICAgICJcdTVCQzZcdTk0QTVcdTRGNERcdTU5MjdcdTVDMEYifSwgLy8ta2V5c2l6ZQotICAgICAgICB7ImtleXN0b3JlLm5hbWUiLAotICAgICAgICAgICAgICAgICJcdTVCQzZcdTk0QTVcdTVFOTNcdTU0MERcdTc5RjAifSwgLy8ta2V5c3RvcmUKLSAgICAgICAgeyJuZXcucGFzc3dvcmQiLAotICAgICAgICAgICAgICAgICJcdTY1QjBcdTUzRTNcdTRFRTQifSwgLy8tbmV3Ci0gICAgICAgIHsiZG8ubm90LnByb21wdCIsCi0gICAgICAgICAgICAgICAgIlx1NEUwRFx1NjNEMFx1NzkzQSJ9LCAvLy1ub3Byb21wdAotICAgICAgICB7InBhc3N3b3JkLnRocm91Z2gucHJvdGVjdGVkLm1lY2hhbmlzbSIsCi0gICAgICAgICAgICAgICAgIlx1OTAxQVx1OEZDN1x1NTNEN1x1NEZERFx1NjJBNFx1NzY4NFx1NjczQVx1NTIzNlx1NzY4NFx1NTNFM1x1NEVFNCJ9LCAvLy1wcm90ZWN0ZWQKLSAgICAgICAgeyJwcm92aWRlci5hcmd1bWVudCIsCi0gICAgICAgICAgICAgICAgIlx1NjNEMFx1NEY5Qlx1NjVCOVx1NTNDMlx1NjU3MCJ9LCAvLy1wcm92aWRlcmFyZwotICAgICAgICB7InByb3ZpZGVyLmNsYXNzLm5hbWUiLAotICAgICAgICAgICAgICAgICJcdTYzRDBcdTRGOUJcdTY1QjlcdTdDN0JcdTU0MEQifSwgLy8tcHJvdmlkZXJjbGFzcwotICAgICAgICB7InByb3ZpZGVyLm5hbWUiLAotICAgICAgICAgICAgICAgICJcdTYzRDBcdTRGOUJcdTY1QjlcdTU0MERcdTc5RjAifSwgLy8tcHJvdmlkZXJuYW1lCi0gICAgICAgIHsicHJvdmlkZXIuY2xhc3NwYXRoIiwKLSAgICAgICAgICAgICAgICAiXHU2M0QwXHU0RjlCXHU2NUI5XHU3QzdCXHU4REVGXHU1Rjg0In0sIC8vLXByb3ZpZGVycGF0aAotICAgICAgICB7Im91dHB1dC5pbi5SRkMuc3R5bGUiLAotICAgICAgICAgICAgICAgICJcdTRFRTUgUkZDIFx1NjgzN1x1NUYwRlx1OEY5M1x1NTFGQSJ9LCAvLy1yZmMKLSAgICAgICAgeyJzaWduYXR1cmUuYWxnb3JpdGhtLm5hbWUiLAotICAgICAgICAgICAgICAgICJcdTdCN0VcdTU0MERcdTdCOTdcdTZDRDVcdTU0MERcdTc5RjAifSwgLy8tc2lnYWxnCi0gICAgICAgIHsic291cmNlLmFsaWFzIiwKLSAgICAgICAgICAgICAgICAiXHU2RTkwXHU1MjJCXHU1NDBEIn0sIC8vLXNyY2FsaWFzCi0gICAgICAgIHsic291cmNlLmtleS5wYXNzd29yZCIsCi0gICAgICAgICAgICAgICAgIlx1NkU5MFx1NUJDNlx1OTRBNVx1NTNFM1x1NEVFNCJ9LCAvLy1zcmNrZXlwYXNzCi0gICAgICAgIHsic291cmNlLmtleXN0b3JlLm5hbWUiLAotICAgICAgICAgICAgICAgICJcdTZFOTBcdTVCQzZcdTk0QTVcdTVFOTNcdTU0MERcdTc5RjAifSwgLy8tc3Jja2V5c3RvcmUKLSAgICAgICAgeyJzb3VyY2Uua2V5c3RvcmUucGFzc3dvcmQucHJvdGVjdGVkIiwKLSAgICAgICAgICAgICAgICAiXHU1M0Q3XHU0RkREXHU2MkE0XHU3Njg0XHU2RTkwXHU1QkM2XHU5NEE1XHU1RTkzXHU1M0UzXHU0RUU0In0sIC8vLXNyY3Byb3RlY3RlZAotICAgICAgICB7InNvdXJjZS5rZXlzdG9yZS5wcm92aWRlci5uYW1lIiwKLSAgICAgICAgICAgICAgICAiXHU2RTkwXHU1QkM2XHU5NEE1XHU1RTkzXHU2M0QwXHU0RjlCXHU2NUI5XHU1NDBEXHU3OUYwIn0sIC8vLXNyY3Byb3ZpZGVybmFtZQotICAgICAgICB7InNvdXJjZS5rZXlzdG9yZS5wYXNzd29yZCIsCi0gICAgICAgICAgICAgICAgIlx1NkU5MFx1NUJDNlx1OTRBNVx1NUU5M1x1NTNFM1x1NEVFNCJ9LCAvLy1zcmNzdG9yZXBhc3MKLSAgICAgICAgeyJzb3VyY2Uua2V5c3RvcmUudHlwZSIsCi0gICAgICAgICAgICAgICAgIlx1NkU5MFx1NUJDNlx1OTRBNVx1NUU5M1x1N0M3Qlx1NTc4QiJ9LCAvLy1zcmNzdG9yZXR5cGUKLSAgICAgICAgeyJTU0wuc2VydmVyLmhvc3QuYW5kLnBvcnQiLAotICAgICAgICAgICAgICAgICJTU0wgXHU2NzBEXHU1MkExXHU1NjY4XHU0RTNCXHU2NzNBXHU1NDhDXHU3QUVGXHU1M0UzIn0sIC8vLXNzbHNlcnZlcgotICAgICAgICB7InNpZ25lZC5qYXIuZmlsZSIsCi0gICAgICAgICAgICAgICAgIlx1NURGMlx1N0I3RVx1NTQwRFx1NzY4NCBqYXIgXHU2NTg3XHU0RUY2In0sIC8vPWphcmZpbGUKLSAgICAgICAgeyJjZXJ0aWZpY2F0ZS52YWxpZGl0eS5zdGFydC5kYXRlLnRpbWUiLAotICAgICAgICAgICAgICAgICJcdThCQzFcdTRFNjZcdTY3MDlcdTY1NDhcdTY3MUZcdTVGMDBcdTU5Q0JcdTY1RTVcdTY3MUYvXHU2NUY2XHU5NUY0In0sIC8vLXN0YXJ0ZGF0ZQotICAgICAgICB7ImtleXN0b3JlLnBhc3N3b3JkIiwKLSAgICAgICAgICAgICAgICAiXHU1QkM2XHU5NEE1XHU1RTkzXHU1M0UzXHU0RUU0In0sIC8vLXN0b3JlcGFzcwotICAgICAgICB7ImtleXN0b3JlLnR5cGUiLAotICAgICAgICAgICAgICAgICJcdTVCQzZcdTk0QTVcdTVFOTNcdTdDN0JcdTU3OEIifSwgLy8tc3RvcmV0eXBlCi0gICAgICAgIHsidHJ1c3QuY2VydGlmaWNhdGVzLmZyb20uY2FjZXJ0cyIsCi0gICAgICAgICAgICAgICAgIlx1NEZFMVx1NEVGQlx1Njc2NVx1ODFFQSBjYWNlcnRzIFx1NzY4NFx1OEJDMVx1NEU2NiJ9LCAvLy10cnVzdGNhY2VydHMKLSAgICAgICAgeyJ2ZXJib3NlLm91dHB1dCIsCi0gICAgICAgICAgICAgICAgIlx1OEJFNlx1N0VDNlx1OEY5M1x1NTFGQSJ9LCAvLy12Ci0gICAgICAgIHsidmFsaWRpdHkubnVtYmVyLm9mLmRheXMiLAotICAgICAgICAgICAgICAgICJcdTY3MDlcdTY1NDhcdTU5MjlcdTY1NzAifSwgLy8tdmFsaWRpdHkKLSAgICAgICAgeyJTZXJpYWwuSUQub2YuY2VydC50by5yZXZva2UiLAotICAgICAgICAgICAgICAgICAiXHU4OTgxXHU2NEE0XHU5NTAwXHU3Njg0XHU4QkMxXHU0RTY2XHU3Njg0XHU1RThGXHU1MjE3IElEIn0sIC8vLWlkCi0gICAgICAgIC8vIGtleXRvb2w6IFJ1bm5pbmcgcGFydAotICAgICAgICB7ImtleXRvb2wuZXJyb3IuIiwgImtleXRvb2wgXHU5NTE5XHU4QkVGOiAifSwKLSAgICAgICAgeyJJbGxlZ2FsLm9wdGlvbi4iLCAiXHU5NzVFXHU2Q0Q1XHU5MDA5XHU5ODc5OiAgIn0sCi0gICAgICAgIHsiSWxsZWdhbC52YWx1ZS4iLCAiXHU5NzVFXHU2Q0Q1XHU1MDNDOiAifSwKLSAgICAgICAgeyJVbmtub3duLnBhc3N3b3JkLnR5cGUuIiwgIlx1NjcyQVx1NzdFNVx1NTNFM1x1NEVFNFx1N0M3Qlx1NTc4QjogIn0sCi0gICAgICAgIHsiQ2Fubm90LmZpbmQuZW52aXJvbm1lbnQudmFyaWFibGUuIiwKLSAgICAgICAgICAgICAgICAiXHU2MjdFXHU0RTBEXHU1MjMwXHU3M0FGXHU1ODgzXHU1M0Q4XHU5MUNGOiAifSwKLSAgICAgICAgeyJDYW5ub3QuZmluZC5maWxlLiIsICJcdTYyN0VcdTRFMERcdTUyMzBcdTY1ODdcdTRFRjY6ICJ9LAotICAgICAgICB7IkNvbW1hbmQub3B0aW9uLmZsYWcubmVlZHMuYW4uYXJndW1lbnQuIiwgIlx1NTQ3RFx1NEVFNFx1OTAwOVx1OTg3OXswfVx1OTcwMFx1ODk4MVx1NEUwMFx1NEUyQVx1NTNDMlx1NjU3MFx1MzAwMiJ9LAotICAgICAgICB7Ildhcm5pbmcuRGlmZmVyZW50LnN0b3JlLmFuZC5rZXkucGFzc3dvcmRzLm5vdC5zdXBwb3J0ZWQuZm9yLlBLQ1MxMi5LZXlTdG9yZXMuSWdub3JpbmcudXNlci5zcGVjaWZpZWQuY29tbWFuZC52YWx1ZS4iLAotICAgICAgICAgICAgICAgICJcdThCNjZcdTU0NEE6IFBLQ1MxMiBLZXlTdG9yZSBcdTRFMERcdTY1MkZcdTYzMDFcdTUxNzZcdTRFRDZcdTVCNThcdTUwQThcdTU0OENcdTVCQzZcdTk0QTVcdTUzRTNcdTRFRTRcdTMwMDJcdTZCNjNcdTU3MjhcdTVGRkRcdTc1NjVcdTc1MjhcdTYyMzdcdTYzMDdcdTVCOUFcdTc2ODR7MH1cdTUwM0NcdTMwMDIifSwKLSAgICAgICAgeyIua2V5c3RvcmUubXVzdC5iZS5OT05FLmlmLnN0b3JldHlwZS5pcy57MH0iLAotICAgICAgICAgICAgICAgICJcdTU5ODJcdTY3OUMgLXN0b3JldHlwZSBcdTRFM0EgezB9LCBcdTUyMTkgLWtleXN0b3JlIFx1NUZDNVx1OTg3Qlx1NEUzQSBOT05FIn0sCi0gICAgICAgIHsiVG9vLm1hbnkucmV0cmllcy5wcm9ncmFtLnRlcm1pbmF0ZWQiLAotICAgICAgICAgICAgICAgICAiXHU5MUNEXHU4QkQ1XHU2QjIxXHU2NTcwXHU4RkM3XHU1OTFBLCBcdTdBMEJcdTVFOEZcdTVERjJcdTdFQzhcdTZCNjIifSwKLSAgICAgICAgeyIuc3RvcmVwYXNzd2QuYW5kLmtleXBhc3N3ZC5jb21tYW5kcy5ub3Quc3VwcG9ydGVkLmlmLnN0b3JldHlwZS5pcy57MH0iLAotICAgICAgICAgICAgICAgICJcdTU5ODJcdTY3OUMgLXN0b3JldHlwZSBcdTRFM0EgezB9LCBcdTUyMTlcdTRFMERcdTY1MkZcdTYzMDEgLXN0b3JlcGFzc3dkIFx1NTQ4QyAta2V5cGFzc3dkIFx1NTQ3RFx1NEVFNCJ9LAotICAgICAgICB7Ii5rZXlwYXNzd2QuY29tbWFuZHMubm90LnN1cHBvcnRlZC5pZi5zdG9yZXR5cGUuaXMuUEtDUzEyIiwKLSAgICAgICAgICAgICAgICAiXHU1OTgyXHU2NzlDIC1zdG9yZXR5cGUgXHU0RTNBIFBLQ1MxMiwgXHU1MjE5XHU0RTBEXHU2NTJGXHU2MzAxIC1rZXlwYXNzd2QgXHU1NDdEXHU0RUU0In0sCi0gICAgICAgIHsiLmtleXBhc3MuYW5kLm5ldy5jYW4ubm90LmJlLnNwZWNpZmllZC5pZi5zdG9yZXR5cGUuaXMuezB9IiwKLSAgICAgICAgICAgICAgICAiXHU1OTgyXHU2NzlDIC1zdG9yZXR5cGUgXHU0RTNBIHswfSwgXHU1MjE5XHU0RTBEXHU4MEZEXHU2MzA3XHU1QjlBIC1rZXlwYXNzIFx1NTQ4QyAtbmV3In0sCi0gICAgICAgIHsiaWYucHJvdGVjdGVkLmlzLnNwZWNpZmllZC50aGVuLnN0b3JlcGFzcy5rZXlwYXNzLmFuZC5uZXcubXVzdC5ub3QuYmUuc3BlY2lmaWVkIiwKLSAgICAgICAgICAgICAgICAiXHU1OTgyXHU2NzlDXHU2MzA3XHU1QjlBXHU0RTg2IC1wcm90ZWN0ZWQsIFx1NTIxOVx1NEUwRFx1ODBGRFx1NjMwN1x1NUI5QSAtc3RvcmVwYXNzLCAta2V5cGFzcyBcdTU0OEMgLW5ldyJ9LAotICAgICAgICB7ImlmLnNyY3Byb3RlY3RlZC5pcy5zcGVjaWZpZWQudGhlbi5zcmNzdG9yZXBhc3MuYW5kLnNyY2tleXBhc3MubXVzdC5ub3QuYmUuc3BlY2lmaWVkIiwKLSAgICAgICAgICAgICAgICAiXHU1OTgyXHU2NzlDXHU2MzA3XHU1QjlBXHU0RTg2IC1zcmNwcm90ZWN0ZWQsIFx1NTIxOVx1NEUwRFx1ODBGRFx1NjMwN1x1NUI5QSAtc3Jjc3RvcmVwYXNzIFx1NTQ4QyAtc3Jja2V5cGFzcyJ9LAotICAgICAgICB7ImlmLmtleXN0b3JlLmlzLm5vdC5wYXNzd29yZC5wcm90ZWN0ZWQudGhlbi5zdG9yZXBhc3Mua2V5cGFzcy5hbmQubmV3Lm11c3Qubm90LmJlLnNwZWNpZmllZCIsCi0gICAgICAgICAgICAgICAgIlx1NTk4Mlx1Njc5Q1x1NUJDNlx1OTRBNVx1NUU5M1x1NjcyQVx1NTNEN1x1NTNFM1x1NEVFNFx1NEZERFx1NjJBNCwgXHU1MjE5XHU0RTBEXHU4MEZEXHU2MzA3XHU1QjlBIC1zdG9yZXBhc3MsIC1rZXlwYXNzIFx1NTQ4QyAtbmV3In0sCi0gICAgICAgIHsiaWYuc291cmNlLmtleXN0b3JlLmlzLm5vdC5wYXNzd29yZC5wcm90ZWN0ZWQudGhlbi5zcmNzdG9yZXBhc3MuYW5kLnNyY2tleXBhc3MubXVzdC5ub3QuYmUuc3BlY2lmaWVkIiwKLSAgICAgICAgICAgICAgICAiXHU1OTgyXHU2NzlDXHU2RTkwXHU1QkM2XHU5NEE1XHU1RTkzXHU2NzJBXHU1M0Q3XHU1M0UzXHU0RUU0XHU0RkREXHU2MkE0LCBcdTUyMTlcdTRFMERcdTgwRkRcdTYzMDdcdTVCOUEgLXNyY3N0b3JlcGFzcyBcdTU0OEMgLXNyY2tleXBhc3MifSwKLSAgICAgICAgeyJJbGxlZ2FsLnN0YXJ0ZGF0ZS52YWx1ZSIsICJcdTk3NUVcdTZDRDVcdTVGMDBcdTU5Q0JcdTY1RTVcdTY3MUZcdTUwM0MifSwKLSAgICAgICAgeyJWYWxpZGl0eS5tdXN0LmJlLmdyZWF0ZXIudGhhbi56ZXJvIiwKLSAgICAgICAgICAgICAgICAiXHU2NzA5XHU2NTQ4XHU2NzFGXHU1RkM1XHU5ODdCXHU1OTI3XHU0RThFXHU5NkY2In0sCi0gICAgICAgIHsicHJvdk5hbWUubm90LmEucHJvdmlkZXIiLCAiezB9XHU0RTBEXHU2NjJGXHU2M0QwXHU0RjlCXHU2NUI5In0sCi0gICAgICAgIHsiVXNhZ2UuZXJyb3Iubm8uY29tbWFuZC5wcm92aWRlZCIsICJcdTc1MjhcdTZDRDVcdTk1MTlcdThCRUY6IFx1NkNBMVx1NjcwOVx1NjNEMFx1NEY5Qlx1NTQ3RFx1NEVFNCJ9LAotICAgICAgICB7IlNvdXJjZS5rZXlzdG9yZS5maWxlLmV4aXN0cy5idXQuaXMuZW1wdHkuIiwgIlx1NkU5MFx1NUJDNlx1OTRBNVx1NUU5M1x1NjU4N1x1NEVGNlx1NUI1OFx1NTcyOCwgXHU0RjQ2XHU0RTNBXHU3QTdBOiAifSwKLSAgICAgICAgeyJQbGVhc2Uuc3BlY2lmeS5zcmNrZXlzdG9yZSIsICJcdThCRjdcdTYzMDdcdTVCOUEgLXNyY2tleXN0b3JlIn0sCi0gICAgICAgIHsiTXVzdC5ub3Quc3BlY2lmeS5ib3RoLnYuYW5kLnJmYy53aXRoLmxpc3QuY29tbWFuZCIsCi0gICAgICAgICAgICAgICAgIidsaXN0JyBcdTU0N0RcdTRFRTRcdTRFMERcdTgwRkRcdTU0MENcdTY1RjZcdTYzMDdcdTVCOUEgLXYgXHU1M0NBIC1yZmMifSwKLSAgICAgICAgeyJLZXkucGFzc3dvcmQubXVzdC5iZS5hdC5sZWFzdC42LmNoYXJhY3RlcnMiLAotICAgICAgICAgICAgICAgICJcdTVCQzZcdTk0QTVcdTUzRTNcdTRFRTRcdTgxRjNcdTVDMTFcdTVGQzVcdTk4N0JcdTRFM0EgNiBcdTRFMkFcdTVCNTdcdTdCMjYifSwKLSAgICAgICAgeyJOZXcucGFzc3dvcmQubXVzdC5iZS5hdC5sZWFzdC42LmNoYXJhY3RlcnMiLAotICAgICAgICAgICAgICAgICJcdTY1QjBcdTUzRTNcdTRFRTRcdTgxRjNcdTVDMTFcdTVGQzVcdTk4N0JcdTRFM0EgNiBcdTRFMkFcdTVCNTdcdTdCMjYifSwKLSAgICAgICAgeyJLZXlzdG9yZS5maWxlLmV4aXN0cy5idXQuaXMuZW1wdHkuIiwKLSAgICAgICAgICAgICAgICAiXHU1QkM2XHU5NEE1XHU1RTkzXHU2NTg3XHU0RUY2XHU1QjU4XHU1NzI4LCBcdTRGNDZcdTRFM0FcdTdBN0E6ICJ9LAotICAgICAgICB7IktleXN0b3JlLmZpbGUuZG9lcy5ub3QuZXhpc3QuIiwKLSAgICAgICAgICAgICAgICAiXHU1QkM2XHU5NEE1XHU1RTkzXHU2NTg3XHU0RUY2XHU0RTBEXHU1QjU4XHU1NzI4OiAifSwKLSAgICAgICAgeyJNdXN0LnNwZWNpZnkuZGVzdGluYXRpb24uYWxpYXMiLCAiXHU1RkM1XHU5ODdCXHU2MzA3XHU1QjlBXHU3NkVFXHU2ODA3XHU1MjJCXHU1NDBEIn0sCi0gICAgICAgIHsiTXVzdC5zcGVjaWZ5LmFsaWFzIiwgIlx1NUZDNVx1OTg3Qlx1NjMwN1x1NUI5QVx1NTIyQlx1NTQwRCJ9LAotICAgICAgICB7IktleXN0b3JlLnBhc3N3b3JkLm11c3QuYmUuYXQubGVhc3QuNi5jaGFyYWN0ZXJzIiwKLSAgICAgICAgICAgICAgICAiXHU1QkM2XHU5NEE1XHU1RTkzXHU1M0UzXHU0RUU0XHU4MUYzXHU1QzExXHU1RkM1XHU5ODdCXHU0RTNBIDYgXHU0RTJBXHU1QjU3XHU3QjI2In0sCi0gICAgICAgIHsiRW50ZXIua2V5c3RvcmUucGFzc3dvcmQuIiwgIlx1OEY5M1x1NTE2NVx1NUJDNlx1OTRBNVx1NUU5M1x1NTNFM1x1NEVFNDogICJ9LAotICAgICAgICB7IkVudGVyLnNvdXJjZS5rZXlzdG9yZS5wYXNzd29yZC4iLCAiXHU4RjkzXHU1MTY1XHU2RTkwXHU1QkM2XHU5NEE1XHU1RTkzXHU1M0UzXHU0RUU0OiAgIn0sCi0gICAgICAgIHsiRW50ZXIuZGVzdGluYXRpb24ua2V5c3RvcmUucGFzc3dvcmQuIiwgIlx1OEY5M1x1NTE2NVx1NzZFRVx1NjgwN1x1NUJDNlx1OTRBNVx1NUU5M1x1NTNFM1x1NEVFNDogICJ9LAotICAgICAgICB7IktleXN0b3JlLnBhc3N3b3JkLmlzLnRvby5zaG9ydC5tdXN0LmJlLmF0LmxlYXN0LjYuY2hhcmFjdGVycyIsCi0gICAgICAgICAiXHU1QkM2XHU5NEE1XHU1RTkzXHU1M0UzXHU0RUU0XHU1OTJBXHU3N0VEIC0gXHU4MUYzXHU1QzExXHU1RkM1XHU5ODdCXHU0RTNBIDYgXHU0RTJBXHU1QjU3XHU3QjI2In0sCi0gICAgICAgIHsiVW5rbm93bi5FbnRyeS5UeXBlIiwgIlx1NjcyQVx1NzdFNVx1Njc2MVx1NzZFRVx1N0M3Qlx1NTc4QiJ9LAotICAgICAgICB7IlRvby5tYW55LmZhaWx1cmVzLkFsaWFzLm5vdC5jaGFuZ2VkIiwgIlx1NjU0NVx1OTY5Q1x1NTkyQVx1NTkxQVx1MzAwMlx1NjcyQVx1NjZGNFx1NjUzOVx1NTIyQlx1NTQwRCJ9LAotICAgICAgICB7IkVudHJ5LmZvci5hbGlhcy5hbGlhcy5zdWNjZXNzZnVsbHkuaW1wb3J0ZWQuIiwKLSAgICAgICAgICAgICAgICAgIlx1NURGMlx1NjIxMFx1NTI5Rlx1NUJGQ1x1NTE2NVx1NTIyQlx1NTQwRCB7MH0gXHU3Njg0XHU2NzYxXHU3NkVFXHUzMDAyIn0sCi0gICAgICAgIHsiRW50cnkuZm9yLmFsaWFzLmFsaWFzLm5vdC5pbXBvcnRlZC4iLCAiXHU2NzJBXHU1QkZDXHU1MTY1XHU1MjJCXHU1NDBEIHswfSBcdTc2ODRcdTY3NjFcdTc2RUVcdTMwMDIifSwKLSAgICAgICAgeyJQcm9ibGVtLmltcG9ydGluZy5lbnRyeS5mb3IuYWxpYXMuYWxpYXMuZXhjZXB0aW9uLkVudHJ5LmZvci5hbGlhcy5hbGlhcy5ub3QuaW1wb3J0ZWQuIiwKLSAgICAgICAgICAgICAgICAgIlx1NUJGQ1x1NTE2NVx1NTIyQlx1NTQwRCB7MH0gXHU3Njg0XHU2NzYxXHU3NkVFXHU2NUY2XHU1MUZBXHU3M0IwXHU5NUVFXHU5ODk4OiB7MX1cdTMwMDJcblx1NjcyQVx1NUJGQ1x1NTE2NVx1NTIyQlx1NTQwRCB7MH0gXHU3Njg0XHU2NzYxXHU3NkVFXHUzMDAyIn0sCi0gICAgICAgIHsiSW1wb3J0LmNvbW1hbmQuY29tcGxldGVkLm9rLmVudHJpZXMuc3VjY2Vzc2Z1bGx5LmltcG9ydGVkLmZhaWwuZW50cmllcy5mYWlsZWQub3IuY2FuY2VsbGVkIiwKLSAgICAgICAgICAgICAgICAgIlx1NURGMlx1NUI4Q1x1NjIxMFx1NUJGQ1x1NTE2NVx1NTQ3RFx1NEVFNDogezB9IFx1NEUyQVx1Njc2MVx1NzZFRVx1NjIxMFx1NTI5Rlx1NUJGQ1x1NTE2NSwgezF9IFx1NEUyQVx1Njc2MVx1NzZFRVx1NTkzMVx1OEQyNVx1NjIxNlx1NTNENlx1NkQ4OCJ9LAotICAgICAgICB7Ildhcm5pbmcuT3ZlcndyaXRpbmcuZXhpc3RpbmcuYWxpYXMuYWxpYXMuaW4uZGVzdGluYXRpb24ua2V5c3RvcmUiLAotICAgICAgICAgICAgICAgICAiXHU4QjY2XHU1NDRBOiBcdTZCNjNcdTU3MjhcdTg5ODZcdTc2RDZcdTc2RUVcdTY4MDdcdTVCQzZcdTk0QTVcdTVFOTNcdTRFMkRcdTc2ODRcdTczQjBcdTY3MDlcdTUyMkJcdTU0MEQgezB9In0sCi0gICAgICAgIHsiRXhpc3RpbmcuZW50cnkuYWxpYXMuYWxpYXMuZXhpc3RzLm92ZXJ3cml0ZS5uby4iLAotICAgICAgICAgICAgICAgICAiXHU1QjU4XHU1NzI4XHU3M0IwXHU2NzA5XHU2NzYxXHU3NkVFXHU1MjJCXHU1NDBEIHswfSwgXHU2NjJGXHU1NDI2XHU4OTg2XHU3NkQ2PyBbbm9dOiAgIn0sCi0gICAgICAgIHsiVG9vLm1hbnkuZmFpbHVyZXMudHJ5LmxhdGVyIiwgIlx1NjU0NVx1OTY5Q1x1NTkyQVx1NTkxQSAtIFx1OEJGN1x1N0EwRFx1NTQwRVx1NTE4RFx1OEJENSJ9LAotICAgICAgICB7IkNlcnRpZmljYXRpb24ucmVxdWVzdC5zdG9yZWQuaW4uZmlsZS5maWxlbmFtZS4iLAotICAgICAgICAgICAgICAgICJcdTVCNThcdTUwQThcdTU3MjhcdTY1ODdcdTRFRjYgPHswfT4gXHU0RTJEXHU3Njg0XHU4QkE0XHU4QkMxXHU4QkY3XHU2QzQyIn0sCi0gICAgICAgIHsiU3VibWl0LnRoaXMudG8ueW91ci5DQSIsICJcdTVDMDZcdTZCNjRcdTYzRDBcdTRFQTRcdTdFRDlcdTYwQThcdTc2ODQgQ0EifSwKLSAgICAgICAgeyJpZi5hbGlhcy5ub3Quc3BlY2lmaWVkLmRlc3RhbGlhcy5zcmNrZXlwYXNzLmFuZC5kZXN0a2V5cGFzcy5tdXN0Lm5vdC5iZS5zcGVjaWZpZWQiLAotICAgICAgICAgICAgIlx1NTk4Mlx1Njc5Q1x1NkNBMVx1NjcwOVx1NjMwN1x1NUI5QVx1NTIyQlx1NTQwRCwgXHU1MjE5XHU0RTBEXHU4MEZEXHU2MzA3XHU1QjlBXHU3NkVFXHU2ODA3XHU1MjJCXHU1NDBELCBcdTZFOTBcdTVCQzZcdTk0QTVcdTVFOTNcdTUzRTNcdTRFRTRcdTU0OENcdTc2RUVcdTY4MDdcdTVCQzZcdTk0QTVcdTVFOTNcdTUzRTNcdTRFRTQifSwKLSAgICAgICAgeyJDZXJ0aWZpY2F0ZS5zdG9yZWQuaW4uZmlsZS5maWxlbmFtZS4iLAotICAgICAgICAgICAgICAgICJcdTVCNThcdTUwQThcdTU3MjhcdTY1ODdcdTRFRjYgPHswfT4gXHU0RTJEXHU3Njg0XHU4QkMxXHU0RTY2In0sCi0gICAgICAgIHsiQ2VydGlmaWNhdGUucmVwbHkud2FzLmluc3RhbGxlZC5pbi5rZXlzdG9yZSIsCi0gICAgICAgICAgICAgICAgIlx1OEJDMVx1NEU2Nlx1NTZERVx1NTkwRFx1NURGMlx1NUI4OVx1ODhDNVx1NTcyOFx1NUJDNlx1OTRBNVx1NUU5M1x1NEUyRCJ9LAotICAgICAgICB7IkNlcnRpZmljYXRlLnJlcGx5Lndhcy5ub3QuaW5zdGFsbGVkLmluLmtleXN0b3JlIiwKLSAgICAgICAgICAgICAgICAiXHU4QkMxXHU0RTY2XHU1NkRFXHU1OTBEXHU2NzJBXHU1Qjg5XHU4OEM1XHU1NzI4XHU1QkM2XHU5NEE1XHU1RTkzXHU0RTJEIn0sCi0gICAgICAgIHsiQ2VydGlmaWNhdGUud2FzLmFkZGVkLnRvLmtleXN0b3JlIiwKLSAgICAgICAgICAgICAgICAiXHU4QkMxXHU0RTY2XHU1REYyXHU2REZCXHU1MkEwXHU1MjMwXHU1QkM2XHU5NEE1XHU1RTkzXHU0RTJEIn0sCi0gICAgICAgIHsiQ2VydGlmaWNhdGUud2FzLm5vdC5hZGRlZC50by5rZXlzdG9yZSIsCi0gICAgICAgICAgICAgICAgIlx1OEJDMVx1NEU2Nlx1NjcyQVx1NkRGQlx1NTJBMFx1NTIzMFx1NUJDNlx1OTRBNVx1NUU5M1x1NEUyRCJ9LAotICAgICAgICB7Ii5TdG9yaW5nLmtzZm5hbWUuIiwgIltcdTZCNjNcdTU3MjhcdTVCNThcdTUwQTh7MH1dIn0sCi0gICAgICAgIHsiYWxpYXMuaGFzLm5vLnB1YmxpYy5rZXkuY2VydGlmaWNhdGUuIiwKLSAgICAgICAgICAgICAgICAiezB9XHU2Q0ExXHU2NzA5XHU1MTZDXHU1MTcxXHU1QkM2XHU5NEE1IChcdThCQzFcdTRFNjYpIn0sCi0gICAgICAgIHsiQ2Fubm90LmRlcml2ZS5zaWduYXR1cmUuYWxnb3JpdGhtIiwKLSAgICAgICAgICAgICAgICAiXHU2NUUwXHU2Q0Q1XHU2RDNFXHU3NTFGXHU3QjdFXHU1NDBEXHU3Qjk3XHU2Q0Q1In0sCi0gICAgICAgIHsiQWxpYXMuYWxpYXMuZG9lcy5ub3QuZXhpc3QiLAotICAgICAgICAgICAgICAgICJcdTUyMkJcdTU0MEQgPHswfT4gXHU0RTBEXHU1QjU4XHU1NzI4In0sCi0gICAgICAgIHsiQWxpYXMuYWxpYXMuaGFzLm5vLmNlcnRpZmljYXRlIiwKLSAgICAgICAgICAgICAgICAiXHU1MjJCXHU1NDBEIDx7MH0+IFx1NkNBMVx1NjcwOVx1OEJDMVx1NEU2NiJ9LAotICAgICAgICB7IktleS5wYWlyLm5vdC5nZW5lcmF0ZWQuYWxpYXMuYWxpYXMuYWxyZWFkeS5leGlzdHMiLAotICAgICAgICAgICAgICAgICJcdTY3MkFcdTc1MUZcdTYyMTBcdTVCQzZcdTk0QTVcdTVCRjksIFx1NTIyQlx1NTQwRCA8ezB9PiBcdTVERjJcdTdFQ0ZcdTVCNThcdTU3MjgifSwKLSAgICAgICAgeyJHZW5lcmF0aW5nLmtleXNpemUuYml0LmtleUFsZ05hbWUua2V5LnBhaXIuYW5kLnNlbGYuc2lnbmVkLmNlcnRpZmljYXRlLnNpZ0FsZ05hbWUud2l0aC5hLnZhbGlkaXR5Lm9mLnZhbGlkYWxpdHkuZGF5cy5mb3IiLAotICAgICAgICAgICAgICAgICJcdTZCNjNcdTU3MjhcdTRFM0FcdTRFRTVcdTRFMEJcdTVCRjlcdThDNjFcdTc1MUZcdTYyMTAgezB9IFx1NEY0RHsxfVx1NUJDNlx1OTRBNVx1NUJGOVx1NTQ4Q1x1ODFFQVx1N0I3RVx1NTQwRFx1OEJDMVx1NEU2NiAoezJ9KSAoXHU2NzA5XHU2NTQ4XHU2NzFGXHU0RTNBIHszfSBcdTU5MjkpOlxuXHQgezR9In0sCi0gICAgICAgIHsiRW50ZXIua2V5LnBhc3N3b3JkLmZvci5hbGlhcy4iLCAiXHU4RjkzXHU1MTY1IDx7MH0+IFx1NzY4NFx1NUJDNlx1OTRBNVx1NTNFM1x1NEVFNCJ9LAotICAgICAgICB7Ii5SRVRVUk4uaWYuc2FtZS5hcy5rZXlzdG9yZS5wYXNzd29yZC4iLAotICAgICAgICAgICAgICAgICJcdChcdTU5ODJcdTY3OUNcdTU0OENcdTVCQzZcdTk0QTVcdTVFOTNcdTUzRTNcdTRFRTRcdTc2RjhcdTU0MEMsIFx1NjMwOVx1NTZERVx1OEY2Nik6ICAifSwKLSAgICAgICAgeyJLZXkucGFzc3dvcmQuaXMudG9vLnNob3J0Lm11c3QuYmUuYXQubGVhc3QuNi5jaGFyYWN0ZXJzIiwKLSAgICAgICAgICAgICAgICAiXHU1QkM2XHU5NEE1XHU1M0UzXHU0RUU0XHU1OTJBXHU3N0VEIC0gXHU4MUYzXHU1QzExXHU1RkM1XHU5ODdCXHU0RTNBIDYgXHU0RTJBXHU1QjU3XHU3QjI2In0sCi0gICAgICAgIHsiVG9vLm1hbnkuZmFpbHVyZXMua2V5Lm5vdC5hZGRlZC50by5rZXlzdG9yZSIsCi0gICAgICAgICAgICAgICAgIlx1NjU0NVx1OTY5Q1x1NTkyQVx1NTkxQSAtIFx1NUJDNlx1OTRBNVx1NjcyQVx1NkRGQlx1NTJBMFx1NTIzMFx1NUJDNlx1OTRBNVx1NUU5M1x1NEUyRCJ9LAotICAgICAgICB7IkRlc3RpbmF0aW9uLmFsaWFzLmRlc3QuYWxyZWFkeS5leGlzdHMiLAotICAgICAgICAgICAgICAgICJcdTc2RUVcdTY4MDdcdTUyMkJcdTU0MEQgPHswfT4gXHU1REYyXHU3RUNGXHU1QjU4XHU1NzI4In0sCi0gICAgICAgIHsiUGFzc3dvcmQuaXMudG9vLnNob3J0Lm11c3QuYmUuYXQubGVhc3QuNi5jaGFyYWN0ZXJzIiwKLSAgICAgICAgICAgICAgICAiXHU1M0UzXHU0RUU0XHU1OTJBXHU3N0VEIC0gXHU4MUYzXHU1QzExXHU1RkM1XHU5ODdCXHU0RTNBIDYgXHU0RTJBXHU1QjU3XHU3QjI2In0sCi0gICAgICAgIHsiVG9vLm1hbnkuZmFpbHVyZXMuS2V5LmVudHJ5Lm5vdC5jbG9uZWQiLAotICAgICAgICAgICAgICAgICJcdTY1NDVcdTk2OUNcdTU5MkFcdTU5MUFcdTMwMDJcdTY3MkFcdTUxNEJcdTk2ODZcdTVCQzZcdTk0QTVcdTY3NjFcdTc2RUUifSwKLSAgICAgICAgeyJrZXkucGFzc3dvcmQuZm9yLmFsaWFzLiIsICI8ezB9PiBcdTc2ODRcdTVCQzZcdTk0QTVcdTUzRTNcdTRFRTQifSwKLSAgICAgICAgeyJLZXlzdG9yZS5lbnRyeS5mb3IuaWQuZ2V0TmFtZS5hbHJlYWR5LmV4aXN0cyIsCi0gICAgICAgICAgICAgICAgIjx7MH0+IFx1NzY4NFx1NUJDNlx1OTRBNVx1NUU5M1x1Njc2MVx1NzZFRVx1NURGMlx1N0VDRlx1NUI1OFx1NTcyOCJ9LAotICAgICAgICB7IkNyZWF0aW5nLmtleXN0b3JlLmVudHJ5LmZvci5pZC5nZXROYW1lLiIsCi0gICAgICAgICAgICAgICAgIlx1NkI2M1x1NTcyOFx1NTIxQlx1NUVGQSA8ezB9PiBcdTc2ODRcdTVCQzZcdTk0QTVcdTVFOTNcdTY3NjFcdTc2RUUuLi4ifSwKLSAgICAgICAgeyJOby5lbnRyaWVzLmZyb20uaWRlbnRpdHkuZGF0YWJhc2UuYWRkZWQiLAotICAgICAgICAgICAgICAgICJcdTY3MkFcdTRFQ0VcdThFQUJcdTRFRkRcdTY1NzBcdTYzNkVcdTVFOTNcdTRFMkRcdTZERkJcdTUyQTBcdTRFRkJcdTRGNTVcdTY3NjFcdTc2RUUifSwKLSAgICAgICAgeyJBbGlhcy5uYW1lLmFsaWFzIiwgIlx1NTIyQlx1NTQwRDogezB9In0sCi0gICAgICAgIHsiQ3JlYXRpb24uZGF0ZS5rZXlTdG9yZS5nZXRDcmVhdGlvbkRhdGUuYWxpYXMuIiwKLSAgICAgICAgICAgICAgICAiXHU1MjFCXHU1RUZBXHU2NUU1XHU2NzFGOiB7MCxkYXRlfSJ9LAotICAgICAgICB7ImFsaWFzLmtleVN0b3JlLmdldENyZWF0aW9uRGF0ZS5hbGlhcy4iLAotICAgICAgICAgICAgICAgICJ7MH0sIHsxLGRhdGV9LCAifSwKLSAgICAgICAgeyJhbGlhcy4iLCAiezB9LCAifSwKLSAgICAgICAgeyJFbnRyeS50eXBlLnR5cGUuIiwgIlx1Njc2MVx1NzZFRVx1N0M3Qlx1NTc4QjogezB9In0sCi0gICAgICAgIHsiQ2VydGlmaWNhdGUuY2hhaW4ubGVuZ3RoLiIsICJcdThCQzFcdTRFNjZcdTk0RkVcdTk1N0ZcdTVFQTY6ICJ9LAotICAgICAgICB7IkNlcnRpZmljYXRlLmkuMS4iLCAiXHU4QkMxXHU0RTY2W3swLG51bWJlcixpbnRlZ2VyfV06In0sCi0gICAgICAgIHsiQ2VydGlmaWNhdGUuZmluZ2VycHJpbnQuU0hBMS4iLCAiXHU4QkMxXHU0RTY2XHU2MzA3XHU3RUI5IChTSEExKTogIn0sCi0gICAgICAgIHsiS2V5c3RvcmUudHlwZS4iLCAiXHU1QkM2XHU5NEE1XHU1RTkzXHU3QzdCXHU1NzhCOiAifSwKLSAgICAgICAgeyJLZXlzdG9yZS5wcm92aWRlci4iLCAiXHU1QkM2XHU5NEE1XHU1RTkzXHU2M0QwXHU0RjlCXHU2NUI5OiAifSwKLSAgICAgICAgeyJZb3VyLmtleXN0b3JlLmNvbnRhaW5zLmtleVN0b3JlLnNpemUuZW50cnkiLAotICAgICAgICAgICAgICAgICJcdTYwQThcdTc2ODRcdTVCQzZcdTk0QTVcdTVFOTNcdTUzMDVcdTU0MkIgezAsbnVtYmVyLGludGVnZXJ9IFx1NEUyQVx1Njc2MVx1NzZFRSJ9LAotICAgICAgICB7IllvdXIua2V5c3RvcmUuY29udGFpbnMua2V5U3RvcmUuc2l6ZS5lbnRyaWVzIiwKLSAgICAgICAgICAgICAgICAiXHU2MEE4XHU3Njg0XHU1QkM2XHU5NEE1XHU1RTkzXHU1MzA1XHU1NDJCIHswLG51bWJlcixpbnRlZ2VyfSBcdTRFMkFcdTY3NjFcdTc2RUUifSwKLSAgICAgICAgeyJGYWlsZWQudG8ucGFyc2UuaW5wdXQiLCAiXHU2NUUwXHU2Q0Q1XHU1QkY5XHU4RjkzXHU1MTY1XHU4RkRCXHU4ODRDXHU4QkVEXHU2Q0Q1XHU1MjA2XHU2NzkwIn0sCi0gICAgICAgIHsiRW1wdHkuaW5wdXQiLCAiXHU3QTdBXHU4RjkzXHU1MTY1In0sCi0gICAgICAgIHsiTm90LlguNTA5LmNlcnRpZmljYXRlIiwgIlx1OTc1RSBYLjUwOSBcdThCQzFcdTRFNjYifSwKLSAgICAgICAgeyJhbGlhcy5oYXMubm8ucHVibGljLmtleSIsICJ7MH1cdTZDQTFcdTY3MDlcdTUxNkNcdTUxNzFcdTVCQzZcdTk0QTUifSwKLSAgICAgICAgeyJhbGlhcy5oYXMubm8uWC41MDkuY2VydGlmaWNhdGUiLCAiezB9XHU2Q0ExXHU2NzA5IFguNTA5IFx1OEJDMVx1NEU2NiJ9LAotICAgICAgICB7Ik5ldy5jZXJ0aWZpY2F0ZS5zZWxmLnNpZ25lZC4iLCAiXHU2NUIwXHU4QkMxXHU0RTY2IChcdTgxRUFcdTdCN0VcdTU0MEQpOiJ9LAotICAgICAgICB7IlJlcGx5Lmhhcy5uby5jZXJ0aWZpY2F0ZXMiLCAiXHU1NkRFXHU1OTBEXHU0RTJEXHU2Q0ExXHU2NzA5XHU4QkMxXHU0RTY2In0sCi0gICAgICAgIHsiQ2VydGlmaWNhdGUubm90LmltcG9ydGVkLmFsaWFzLmFsaWFzLmFscmVhZHkuZXhpc3RzIiwKLSAgICAgICAgICAgICAgICAiXHU4QkMxXHU0RTY2XHU2NzJBXHU1QkZDXHU1MTY1LCBcdTUyMkJcdTU0MEQgPHswfT4gXHU1REYyXHU3RUNGXHU1QjU4XHU1NzI4In0sCi0gICAgICAgIHsiSW5wdXQubm90LmFuLlguNTA5LmNlcnRpZmljYXRlIiwgIlx1NjI0MFx1OEY5M1x1NTE2NVx1NzY4NFx1NEUwRFx1NjYyRiBYLjUwOSBcdThCQzFcdTRFNjYifSwKLSAgICAgICAgeyJDZXJ0aWZpY2F0ZS5hbHJlYWR5LmV4aXN0cy5pbi5rZXlzdG9yZS51bmRlci5hbGlhcy50cnVzdGFsaWFzLiIsCi0gICAgICAgICAgICAgICAgIlx1NTcyOFx1NTIyQlx1NTQwRCA8ezB9PiBcdTRFNEJcdTRFMEIsIFx1OEJDMVx1NEU2Nlx1NURGMlx1N0VDRlx1NUI1OFx1NTcyOFx1NEU4RVx1NUJDNlx1OTRBNVx1NUU5M1x1NEUyRCJ9LAotICAgICAgICB7IkRvLnlvdS5zdGlsbC53YW50LnRvLmFkZC5pdC5uby4iLAotICAgICAgICAgICAgICAgICJcdTY2MkZcdTU0MjZcdTRFQ0RcdTg5ODFcdTZERkJcdTUyQTA/IFtub106ICAifSwKLSAgICAgICAgeyJDZXJ0aWZpY2F0ZS5hbHJlYWR5LmV4aXN0cy5pbi5zeXN0ZW0ud2lkZS5DQS5rZXlzdG9yZS51bmRlci5hbGlhcy50cnVzdGFsaWFzLiIsCi0gICAgICAgICAgICAgICAgIlx1NTcyOFx1NTIyQlx1NTQwRCA8ezB9PiBcdTRFNEJcdTRFMEIsIFx1OEJDMVx1NEU2Nlx1NURGMlx1N0VDRlx1NUI1OFx1NTcyOFx1NEU4RVx1N0NGQlx1N0VERlx1ODMwM1x1NTZGNFx1NzY4NCBDQSBcdTVCQzZcdTk0QTVcdTVFOTNcdTRFMkQifSwKLSAgICAgICAgeyJEby55b3Uuc3RpbGwud2FudC50by5hZGQuaXQudG8ueW91ci5vd24ua2V5c3RvcmUubm8uIiwKLSAgICAgICAgICAgICAgICAiXHU2NjJGXHU1NDI2XHU0RUNEXHU4OTgxXHU1QzA2XHU1QjgzXHU2REZCXHU1MkEwXHU1MjMwXHU4MUVBXHU1REYxXHU3Njg0XHU1QkM2XHU5NEE1XHU1RTkzPyBbbm9dOiAgIn0sCi0gICAgICAgIHsiVHJ1c3QudGhpcy5jZXJ0aWZpY2F0ZS5uby4iLCAiXHU2NjJGXHU1NDI2XHU0RkUxXHU0RUZCXHU2QjY0XHU4QkMxXHU0RTY2PyBbbm9dOiAgIn0sCi0gICAgICAgIHsiWUVTIiwgIlx1NjYyRiJ9LAotICAgICAgICB7Ik5ldy5wcm9tcHQuIiwgIlx1NjVCMHswfTogIn0sCi0gICAgICAgIHsiUGFzc3dvcmRzLm11c3QuZGlmZmVyIiwgIlx1NTNFM1x1NEVFNFx1NEUwRFx1ODBGRFx1NzZGOFx1NTQwQyJ9LAotICAgICAgICB7IlJlLmVudGVyLm5ldy5wcm9tcHQuIiwgIlx1OTFDRFx1NjVCMFx1OEY5M1x1NTE2NVx1NjVCMHswfTogIn0sCi0gICAgICAgIHsiUmUuZW50ZXIubmV3LnBhc3N3b3JkLiIsICJcdTUxOERcdTZCMjFcdThGOTNcdTUxNjVcdTY1QjBcdTUzRTNcdTRFRTQ6ICJ9LAotICAgICAgICB7IlRoZXkuZG9uLnQubWF0Y2guVHJ5LmFnYWluIiwgIlx1NUI4M1x1NEVFQ1x1NEUwRFx1NTMzOVx1OTE0RFx1MzAwMlx1OEJGN1x1OTFDRFx1OEJENSJ9LAotICAgICAgICB7IkVudGVyLnByb21wdC5hbGlhcy5uYW1lLiIsICJcdThGOTNcdTUxNjV7MH1cdTUyMkJcdTU0MEQ6ICAifSwKLSAgICAgICAgeyJFbnRlci5uZXcuYWxpYXMubmFtZS5SRVRVUk4udG8uY2FuY2VsLmltcG9ydC5mb3IudGhpcy5lbnRyeS4iLAotICAgICAgICAgICAgICAgICAiXHU4RjkzXHU1MTY1XHU2NUIwXHU3Njg0XHU1MjJCXHU1NDBEXHQoXHU2MzA5XHU1NkRFXHU4RjY2XHU0RUU1XHU1M0Q2XHU2RDg4XHU1QkY5XHU2QjY0XHU2NzYxXHU3NkVFXHU3Njg0XHU1QkZDXHU1MTY1KTogICJ9LAotICAgICAgICB7IkVudGVyLmFsaWFzLm5hbWUuIiwgIlx1OEY5M1x1NTE2NVx1NTIyQlx1NTQwRDogICJ9LAotICAgICAgICB7Ii5SRVRVUk4uaWYuc2FtZS5hcy5mb3Iub3RoZXJBbGlhcy4iLAotICAgICAgICAgICAgICAgICJcdChcdTU5ODJcdTY3OUNcdTU0OEMgPHswfT4gXHU3NkY4XHU1NDBDLCBcdTUyMTlcdTYzMDlcdTU2REVcdThGNjYpIn0sCi0gICAgICAgIHsiLlBBVFRFUk4ucHJpbnRYNTA5Q2VydCIsCi0gICAgICAgICAgICAgICAgIlx1NjI0MFx1NjcwOVx1ODAwNTogezB9XG5cdTUzRDFcdTVFMDNcdTgwMDU6IHsxfVxuXHU1RThGXHU1MjE3XHU1M0Y3OiB7Mn1cblx1NjcwOVx1NjU0OFx1NjcxRlx1NUYwMFx1NTlDQlx1NjVFNVx1NjcxRjogezN9LCBcdTYyMkFcdTZCNjJcdTY1RTVcdTY3MUY6IHs0fVxuXHU4QkMxXHU0RTY2XHU2MzA3XHU3RUI5OlxuXHQgTUQ1OiB7NX1cblx0IFNIQTE6IHs2fVxuXHQgU0hBMjU2OiB7N31cblx0IFx1N0I3RVx1NTQwRFx1N0I5N1x1NkNENVx1NTQwRFx1NzlGMDogezh9XG5cdCBcdTcyNDhcdTY3MkM6IHs5fSJ9LAotICAgICAgICB7IldoYXQuaXMueW91ci5maXJzdC5hbmQubGFzdC5uYW1lLiIsCi0gICAgICAgICAgICAgICAgIlx1NjBBOFx1NzY4NFx1NTQwRFx1NUI1N1x1NEUwRVx1NTlEM1x1NkMwRlx1NjYyRlx1NEVDMFx1NEU0OD8ifSwKLSAgICAgICAgeyJXaGF0LmlzLnRoZS5uYW1lLm9mLnlvdXIub3JnYW5pemF0aW9uYWwudW5pdC4iLAotICAgICAgICAgICAgICAgICJcdTYwQThcdTc2ODRcdTdFQzRcdTdFQzdcdTUzNTVcdTRGNERcdTU0MERcdTc5RjBcdTY2MkZcdTRFQzBcdTRFNDg/In0sCi0gICAgICAgIHsiV2hhdC5pcy50aGUubmFtZS5vZi55b3VyLm9yZ2FuaXphdGlvbi4iLAotICAgICAgICAgICAgICAgICJcdTYwQThcdTc2ODRcdTdFQzRcdTdFQzdcdTU0MERcdTc5RjBcdTY2MkZcdTRFQzBcdTRFNDg/In0sCi0gICAgICAgIHsiV2hhdC5pcy50aGUubmFtZS5vZi55b3VyLkNpdHkub3IuTG9jYWxpdHkuIiwKLSAgICAgICAgICAgICAgICAiXHU2MEE4XHU2MjQwXHU1NzI4XHU3Njg0XHU1N0NFXHU1RTAyXHU2MjE2XHU1MzNBXHU1N0RGXHU1NDBEXHU3OUYwXHU2NjJGXHU0RUMwXHU0RTQ4PyJ9LAotICAgICAgICB7IldoYXQuaXMudGhlLm5hbWUub2YueW91ci5TdGF0ZS5vci5Qcm92aW5jZS4iLAotICAgICAgICAgICAgICAgICJcdTYwQThcdTYyNDBcdTU3MjhcdTc2ODRcdTc3MDEvXHU1RTAyL1x1ODFFQVx1NkNCQlx1NTMzQVx1NTQwRFx1NzlGMFx1NjYyRlx1NEVDMFx1NEU0OD8ifSwKLSAgICAgICAgeyJXaGF0LmlzLnRoZS50d28ubGV0dGVyLmNvdW50cnkuY29kZS5mb3IudGhpcy51bml0LiIsCi0gICAgICAgICAgICAgICAgIlx1OEJFNVx1NTM1NVx1NEY0RFx1NzY4NFx1NTNDQ1x1NUI1N1x1NkJDRFx1NTZGRFx1NUJCNi9cdTU3MzBcdTUzM0FcdTRFRTNcdTc4MDFcdTY2MkZcdTRFQzBcdTRFNDg/In0sCi0gICAgICAgIHsiSXMubmFtZS5jb3JyZWN0LiIsICJ7MH1cdTY2MkZcdTU0MjZcdTZCNjNcdTc4NkU/In0sCi0gICAgICAgIHsibm8iLCAiXHU1NDI2In0sCi0gICAgICAgIHsieWVzIiwgIlx1NjYyRiJ9LAotICAgICAgICB7InkiLCAieSJ9LAotICAgICAgICB7Ii5kZWZhdWx0VmFsdWUuIiwgIiAgW3swfV06ICAifSwKLSAgICAgICAgeyJBbGlhcy5hbGlhcy5oYXMubm8ua2V5IiwKLSAgICAgICAgICAgICAgICAiXHU1MjJCXHU1NDBEIDx7MH0+IFx1NkNBMVx1NjcwOVx1NUJDNlx1OTRBNSJ9LAotICAgICAgICB7IkFsaWFzLmFsaWFzLnJlZmVyZW5jZXMuYW4uZW50cnkudHlwZS50aGF0LmlzLm5vdC5hLnByaXZhdGUua2V5LmVudHJ5LlRoZS5rZXljbG9uZS5jb21tYW5kLm9ubHkuc3VwcG9ydHMuY2xvbmluZy5vZi5wcml2YXRlLmtleSIsCi0gICAgICAgICAgICAgICAgICJcdTUyMkJcdTU0MEQgPHswfT4gXHU1RjE1XHU3NTI4XHU0RTg2XHU0RTBEXHU1QzVFXHU0RThFXHU3OUMxXHU2NzA5XHU1QkM2XHU5NEE1XHU2NzYxXHU3NkVFXHU3Njg0XHU2NzYxXHU3NkVFXHU3QzdCXHU1NzhCXHUzMDAyLWtleWNsb25lIFx1NTQ3RFx1NEVFNFx1NEVDNVx1NjUyRlx1NjMwMVx1NUJGOVx1NzlDMVx1NjcwOVx1NUJDNlx1OTRBNVx1Njc2MVx1NzZFRVx1NzY4NFx1NTE0Qlx1OTY4NiJ9LAotCi0gICAgICAgIHsiLldBUk5JTkcuV0FSTklORy5XQVJOSU5HLiIsCi0gICAgICAgICAgICAiKioqKioqKioqKioqKioqKiogIFx1OEI2Nlx1NTQ0QSBcdThCNjZcdTU0NEEgXHU4QjY2XHU1NDRBICAqKioqKioqKioqKioqKioqKiJ9LAotICAgICAgICB7IlNpZ25lci5kLiIsICJcdTdCN0VcdTU0MERcdTgwMDUgIyVkOiJ9LAotICAgICAgICB7IlRpbWVzdGFtcC4iLCAiXHU2NUY2XHU5NUY0XHU2MjMzOiJ9LAotICAgICAgICB7IlNpZ25hdHVyZS4iLCAiXHU3QjdFXHU1NDBEOiJ9LAotICAgICAgICB7IkNSTHMuIiwgIkNSTDoifSwKLSAgICAgICAgeyJDZXJ0aWZpY2F0ZS5vd25lci4iLCAiXHU4QkMxXHU0RTY2XHU2MjQwXHU2NzA5XHU4MDA1OiAifSwKLSAgICAgICAgeyJOb3QuYS5zaWduZWQuamFyLmZpbGUiLCAiXHU0RTBEXHU2NjJGXHU1REYyXHU3QjdFXHU1NDBEXHU3Njg0IGphciBcdTY1ODdcdTRFRjYifSwKLSAgICAgICAgeyJOby5jZXJ0aWZpY2F0ZS5mcm9tLnRoZS5TU0wuc2VydmVyIiwKLSAgICAgICAgICAgICAgICAiXHU2Q0ExXHU2NzA5XHU2NzY1XHU4MUVBIFNTTCBcdTY3MERcdTUyQTFcdTU2NjhcdTc2ODRcdThCQzFcdTRFNjYifSwKLQotICAgICAgICB7Ii5UaGUuaW50ZWdyaXR5Lm9mLnRoZS5pbmZvcm1hdGlvbi5zdG9yZWQuaW4ueW91ci5rZXlzdG9yZS4iLAotICAgICAgICAgICAgIiogXHU1QjU4XHU1MEE4XHU1NzI4XHU2MEE4XHU3Njg0XHU1QkM2XHU5NEE1XHU1RTkzXHU0RTJEXHU3Njg0XHU0RkUxXHU2MDZGXHU3Njg0XHU1QjhDXHU2NTc0XHU2MDI3ICAqXG4qIFx1NUMxQVx1NjcyQVx1N0VDRlx1OEZDN1x1OUE4Q1x1OEJDMSEgIFx1NEUzQVx1NEU4Nlx1OUE4Q1x1OEJDMVx1NTE3Nlx1NUI4Q1x1NjU3NFx1NjAyNywgKlxuKiBcdTVGQzVcdTk4N0JcdTYzRDBcdTRGOUJcdTVCQzZcdTk0QTVcdTVFOTNcdTUzRTNcdTRFRTRcdTMwMDIgICAgICAgICAgICAgICAgICAqIn0sCi0gICAgICAgIHsiLlRoZS5pbnRlZ3JpdHkub2YudGhlLmluZm9ybWF0aW9uLnN0b3JlZC5pbi50aGUuc3Jja2V5c3RvcmUuIiwKLSAgICAgICAgICAgICIqIFx1NUI1OFx1NTBBOFx1NTcyOCBzcmNrZXlzdG9yZSBcdTRFMkRcdTc2ODRcdTRGRTFcdTYwNkZcdTc2ODRcdTVCOENcdTY1NzRcdTYwMjcqXG4qIFx1NUMxQVx1NjcyQVx1N0VDRlx1OEZDN1x1OUE4Q1x1OEJDMSEgIFx1NEUzQVx1NEU4Nlx1OUE4Q1x1OEJDMVx1NTE3Nlx1NUI4Q1x1NjU3NFx1NjAyNywgKlxuKiBcdTVGQzVcdTk4N0JcdTYzRDBcdTRGOUJcdTZFOTBcdTVCQzZcdTk0QTVcdTVFOTNcdTUzRTNcdTRFRTRcdTMwMDIgICAgICAgICAgICAgICAgICAqIn0sCi0KLSAgICAgICAgeyJDZXJ0aWZpY2F0ZS5yZXBseS5kb2VzLm5vdC5jb250YWluLnB1YmxpYy5rZXkuZm9yLmFsaWFzLiIsCi0gICAgICAgICAgICAgICAgIlx1OEJDMVx1NEU2Nlx1NTZERVx1NTkwRFx1NEUyRFx1NEUwRFx1NTMwNVx1NTQyQiA8ezB9PiBcdTc2ODRcdTUxNkNcdTUxNzFcdTVCQzZcdTk0QTUifSwKLSAgICAgICAgeyJJbmNvbXBsZXRlLmNlcnRpZmljYXRlLmNoYWluLmluLnJlcGx5IiwKLSAgICAgICAgICAgICAgICAiXHU1NkRFXHU1OTBEXHU0RTJEXHU3Njg0XHU4QkMxXHU0RTY2XHU5NEZFXHU0RTBEXHU1QjhDXHU2NTc0In0sCi0gICAgICAgIHsiQ2VydGlmaWNhdGUuY2hhaW4uaW4ucmVwbHkuZG9lcy5ub3QudmVyaWZ5LiIsCi0gICAgICAgICAgICAgICAgIlx1NTZERVx1NTkwRFx1NEUyRFx1NzY4NFx1OEJDMVx1NEU2Nlx1OTRGRVx1NjcyQVx1OUE4Q1x1OEJDMTogIn0sCi0gICAgICAgIHsiVG9wLmxldmVsLmNlcnRpZmljYXRlLmluLnJlcGx5LiIsCi0gICAgICAgICAgICAgICAgIlx1NTZERVx1NTkwRFx1NEUyRFx1NzY4NFx1OTg3Nlx1N0VBN1x1OEJDMVx1NEU2NjpcbiJ9LAotICAgICAgICB7Ii5pcy5ub3QudHJ1c3RlZC4iLCAiLi4uIFx1NjYyRlx1NEUwRFx1NTNFRlx1NEZFMVx1NzY4NFx1MzAwMiJ9LAotICAgICAgICB7Ikluc3RhbGwucmVwbHkuYW55d2F5Lm5vLiIsICJcdTY2MkZcdTU0MjZcdTRFQ0RcdTg5ODFcdTVCODlcdTg4QzVcdTU2REVcdTU5MEQ/IFtub106ICAifSwKLSAgICAgICAgeyJOTyIsICJcdTU0MjYifSwKLSAgICAgICAgeyJQdWJsaWMua2V5cy5pbi5yZXBseS5hbmQua2V5c3RvcmUuZG9uLnQubWF0Y2giLAotICAgICAgICAgICAgICAgICJcdTU2REVcdTU5MERcdTRFMkRcdTc2ODRcdTUxNkNcdTUxNzFcdTVCQzZcdTk0QTVcdTRFMEVcdTVCQzZcdTk0QTVcdTVFOTNcdTRFMERcdTUzMzlcdTkxNEQifSwKLSAgICAgICAgeyJDZXJ0aWZpY2F0ZS5yZXBseS5hbmQuY2VydGlmaWNhdGUuaW4ua2V5c3RvcmUuYXJlLmlkZW50aWNhbCIsCi0gICAgICAgICAgICAgICAgIlx1OEJDMVx1NEU2Nlx1NTZERVx1NTkwRFx1NEUwRVx1NUJDNlx1OTRBNVx1NUU5M1x1NEUyRFx1NzY4NFx1OEJDMVx1NEU2Nlx1NjYyRlx1NzZGOFx1NTQwQ1x1NzY4NCJ9LAotICAgICAgICB7IkZhaWxlZC50by5lc3RhYmxpc2guY2hhaW4uZnJvbS5yZXBseSIsCi0gICAgICAgICAgICAgICAgIlx1NjVFMFx1NkNENVx1NEVDRVx1NTZERVx1NTkwRFx1NEUyRFx1NUVGQVx1N0FDQlx1OTRGRSJ9LAotICAgICAgICB7Im4iLCAibiJ9LAotICAgICAgICB7Ildyb25nLmFuc3dlci50cnkuYWdhaW4iLCAiXHU5NTE5XHU4QkVGXHU3Njg0XHU3QjU0XHU2ODQ4LCBcdThCRjdcdTUxOERcdThCRDVcdTRFMDBcdTZCMjEifSwKLSAgICAgICAgeyJTZWNyZXQua2V5Lm5vdC5nZW5lcmF0ZWQuYWxpYXMuYWxpYXMuYWxyZWFkeS5leGlzdHMiLAotICAgICAgICAgICAgICAgICJcdTZDQTFcdTY3MDlcdTc1MUZcdTYyMTBcdTVCQzZcdTk0QTUsIFx1NTIyQlx1NTQwRCA8ezB9PiBcdTVERjJcdTdFQ0ZcdTVCNThcdTU3MjgifSwKLSAgICAgICAgeyJQbGVhc2UucHJvdmlkZS5rZXlzaXplLmZvci5zZWNyZXQua2V5LmdlbmVyYXRpb24iLAotICAgICAgICAgICAgICAgICJcdThCRjdcdTYzRDBcdTRGOUIgLWtleXNpemUgXHU0RUU1XHU3NTFGXHU2MjEwXHU1QkY5XHU3OUYwXHU1QkM2XHU5NEE1In0sCi0KLSAgICAgICAgeyJFeHRlbnNpb25zLiIsICJcdTYyNjlcdTVDNTU6ICJ9LAotICAgICAgICB7Ii5FbXB0eS52YWx1ZS4iLCAiKFx1N0E3QVx1NTAzQykifSwKLSAgICAgICAgeyJFeHRlbnNpb24uUmVxdWVzdC4iLCAiXHU2MjY5XHU1QzU1XHU4QkY3XHU2QzQyOiJ9LAotICAgICAgICB7IlBLQ1MuMTAuQ2VydGlmaWNhdGUuUmVxdWVzdC5WZXJzaW9uLjEuMC5TdWJqZWN0LnMuUHVibGljLktleS5zLmZvcm1hdC5zLmtleS4iLAotICAgICAgICAgICAgICAgICJQS0NTICMxMCBcdThCQzFcdTRFNjZcdThCRjdcdTZDNDIgKFx1NzI0OFx1NjcyQyAxLjApXG5cdTRFM0JcdTk4OTg6ICVzXG5cdTUxNkNcdTUxNzFcdTVCQzZcdTk0QTU6ICVzIFx1NjgzQ1x1NUYwRiAlcyBcdTVCQzZcdTk0QTVcbiJ9LAotICAgICAgICB7IlVua25vd24ua2V5VXNhZ2UudHlwZS4iLCAiXHU2NzJBXHU3N0U1IGtleVVzYWdlIFx1N0M3Qlx1NTc4QjogIn0sCi0gICAgICAgIHsiVW5rbm93bi5leHRlbmRlZGtleVVzYWdlLnR5cGUuIiwgIlx1NjcyQVx1NzdFNSBleHRlbmRlZGtleVVzYWdlIFx1N0M3Qlx1NTc4QjogIn0sCi0gICAgICAgIHsiVW5rbm93bi5BY2Nlc3NEZXNjcmlwdGlvbi50eXBlLiIsICJcdTY3MkFcdTc3RTUgQWNjZXNzRGVzY3JpcHRpb24gXHU3QzdCXHU1NzhCOiAifSwKLSAgICAgICAgeyJVbnJlY29nbml6ZWQuR2VuZXJhbE5hbWUudHlwZS4iLCAiXHU2NUUwXHU2Q0Q1XHU4QkM2XHU1MjJCXHU3Njg0IEdlbmVyYWxOYW1lIFx1N0M3Qlx1NTc4QjogIn0sCi0gICAgICAgIHsiVGhpcy5leHRlbnNpb24uY2Fubm90LmJlLm1hcmtlZC5hcy5jcml0aWNhbC4iLAotICAgICAgICAgICAgICAgICAiXHU2NUUwXHU2Q0Q1XHU1QzA2XHU2QjY0XHU2MjY5XHU1QzU1XHU2ODA3XHU4QkIwXHU0RTNBXHUyMDFDXHU0RTI1XHU5MUNEXHUyMDFEXHUzMDAyIn0sCi0gICAgICAgIHsiT2RkLm51bWJlci5vZi5oZXguZGlnaXRzLmZvdW5kLiIsICJcdTYyN0VcdTUyMzBcdTU5NDdcdTY1NzBcdTRFMkFcdTUzNDFcdTUxNkRcdThGREJcdTUyMzZcdTY1NzBcdTVCNTc6ICJ9LAotICAgICAgICB7IlVua25vd24uZXh0ZW5zaW9uLnR5cGUuIiwgIlx1NjcyQVx1NzdFNVx1NjI2OVx1NUM1NVx1N0M3Qlx1NTc4QjogIn0sCi0gICAgICAgIHsiY29tbWFuZC57MH0uaXMuYW1iaWd1b3VzLiIsICJcdTU0N0RcdTRFRTR7MH1cdTRFMERcdTY2MEVcdTc4NkU6In0sCi0KLSAgICAgICAgLy8gcG9saWN5dG9vbAotICAgICAgICB7Ildhcm5pbmcuQS5wdWJsaWMua2V5LmZvci5hbGlhcy5zaWduZXJzLmkuZG9lcy5ub3QuZXhpc3QuTWFrZS5zdXJlLmEuS2V5U3RvcmUuaXMucHJvcGVybHkuY29uZmlndXJlZC4iLAotICAgICAgICAgICAgICAgICJcdThCNjZcdTU0NEE6IFx1NTIyQlx1NTQwRCB7MH0gXHU3Njg0XHU1MTZDXHU1MTcxXHU1QkM2XHU5NEE1XHU0RTBEXHU1QjU4XHU1NzI4XHUzMDAyXHU4QkY3XHU3ODZFXHU0RkREXHU1REYyXHU2QjYzXHU3ODZFXHU5MTREXHU3RjZFIEtleVN0b3JlXHUzMDAyIn0sCi0gICAgICAgIHsiV2FybmluZy5DbGFzcy5ub3QuZm91bmQuY2xhc3MiLCAiXHU4QjY2XHU1NDRBOiBcdTYyN0VcdTRFMERcdTUyMzBcdTdDN0I6IHswfSJ9LAotICAgICAgICB7Ildhcm5pbmcuSW52YWxpZC5hcmd1bWVudC5zLmZvci5jb25zdHJ1Y3Rvci5hcmciLAotICAgICAgICAgICAgICAgICJcdThCNjZcdTU0NEE6IFx1Njc4NFx1OTAyMFx1NTY2OFx1NzY4NFx1NTNDMlx1NjU3MFx1NjVFMFx1NjU0ODogezB9In0sCi0gICAgICAgIHsiSWxsZWdhbC5QcmluY2lwYWwuVHlwZS50eXBlIiwgIlx1OTc1RVx1NkNENVx1NzY4NFx1NEUzQlx1NzUyOFx1NjIzN1x1N0M3Qlx1NTc4QjogezB9In0sCi0gICAgICAgIHsiSWxsZWdhbC5vcHRpb24ub3B0aW9uIiwgIlx1OTc1RVx1NkNENVx1OTAwOVx1OTg3OTogezB9In0sCi0gICAgICAgIHsiVXNhZ2UucG9saWN5dG9vbC5vcHRpb25zLiIsICJcdTc1MjhcdTZDRDU6IHBvbGljeXRvb2wgW1x1OTAwOVx1OTg3OV0ifSwKLSAgICAgICAgeyIuZmlsZS5maWxlLnBvbGljeS5maWxlLmxvY2F0aW9uIiwKLSAgICAgICAgICAgICAgICAiICBbLWZpbGUgPGZpbGU+XSAgICBcdTdCNTZcdTc1NjVcdTY1ODdcdTRFRjZcdTRGNERcdTdGNkUifSwKLSAgICAgICAgeyJOZXciLCAiXHU2NUIwXHU1RUZBIn0sCi0gICAgICAgIHsiT3BlbiIsICJcdTYyNTNcdTVGMDAifSwKLSAgICAgICAgeyJTYXZlIiwgIlx1NEZERFx1NUI1OCJ9LAotICAgICAgICB7IlNhdmUuQXMiLCAiXHU1M0U2XHU1QjU4XHU0RTNBIn0sCi0gICAgICAgIHsiVmlldy5XYXJuaW5nLkxvZyIsICJcdTY3RTVcdTc3MEJcdThCNjZcdTU0NEFcdTY1RTVcdTVGRDcifSwKLSAgICAgICAgeyJFeGl0IiwgIlx1OTAwMFx1NTFGQSJ9LAotICAgICAgICB7IkFkZC5Qb2xpY3kuRW50cnkiLCAiXHU2REZCXHU1MkEwXHU3QjU2XHU3NTY1XHU2NzYxXHU3NkVFIn0sCi0gICAgICAgIHsiRWRpdC5Qb2xpY3kuRW50cnkiLCAiXHU3RjE2XHU4RjkxXHU3QjU2XHU3NTY1XHU2NzYxXHU3NkVFIn0sCi0gICAgICAgIHsiUmVtb3ZlLlBvbGljeS5FbnRyeSIsICJcdTUyMjBcdTk2NjRcdTdCNTZcdTc1NjVcdTY3NjFcdTc2RUUifSwKLSAgICAgICAgeyJFZGl0IiwgIlx1N0YxNlx1OEY5MSJ9LAotICAgICAgICB7IlJldGFpbiIsICJcdTRGRERcdTc1NTkifSwKLQotICAgICAgICB7Ildhcm5pbmcuRmlsZS5uYW1lLm1heS5pbmNsdWRlLmVzY2FwZWQuYmFja3NsYXNoLmNoYXJhY3RlcnMuSXQuaXMubm90Lm5lY2Vzc2FyeS50by5lc2NhcGUuYmFja3NsYXNoLmNoYXJhY3RlcnMudGhlLnRvb2wuZXNjYXBlcyIsCi0gICAgICAgICAgICAiXHU4QjY2XHU1NDRBOiBcdTY1ODdcdTRFRjZcdTU0MERcdTUzMDVcdTU0MkJcdThGNkNcdTRFNDlcdTc2ODRcdTUzQ0RcdTY1OUNcdTY3NjBcdTVCNTdcdTdCMjZcdTMwMDJcdTRFMERcdTk3MDBcdTg5ODFcdTVCRjlcdTUzQ0RcdTY1OUNcdTY3NjBcdTVCNTdcdTdCMjZcdThGREJcdTg4NENcdThGNkNcdTRFNDkgKFx1OEJFNVx1NURFNVx1NTE3N1x1NTcyOFx1NUMwNlx1N0I1Nlx1NzU2NVx1NTE4NVx1NUJCOVx1NTE5OVx1NTE2NVx1NkMzOFx1NEU0NVx1NUI1OFx1NTBBOFx1NjVGNlx1NEYxQVx1NjgzOVx1NjM2RVx1OTcwMFx1ODk4MVx1NUJGOVx1NUI1N1x1N0IyNlx1OEZEQlx1ODg0Q1x1OEY2Q1x1NEU0OSlcdTMwMDJcblxuXHU1MzU1XHU1MUZCXHUyMDFDXHU0RkREXHU3NTU5XHUyMDFEXHU1M0VGXHU0RkREXHU3NTU5XHU4RjkzXHU1MTY1XHU3Njg0XHU1NDBEXHU3OUYwLCBcdTYyMTZcdTgwMDVcdTUzNTVcdTUxRkJcdTIwMUNcdTdGMTZcdThGOTFcdTIwMURcdTUzRUZcdTdGMTZcdThGOTFcdThCRTVcdTU0MERcdTc5RjBcdTMwMDIifSwKLQotICAgICAgICB7IkFkZC5QdWJsaWMuS2V5LkFsaWFzIiwgIlx1NkRGQlx1NTJBMFx1NTE2Q1x1NTE3MVx1NUJDNlx1OTRBNVx1NTIyQlx1NTQwRCJ9LAotICAgICAgICB7IlJlbW92ZS5QdWJsaWMuS2V5LkFsaWFzIiwgIlx1NTIyMFx1OTY2NFx1NTE2Q1x1NTE3MVx1NUJDNlx1OTRBNVx1NTIyQlx1NTQwRCJ9LAotICAgICAgICB7IkZpbGUiLCAiXHU2NTg3XHU0RUY2In0sCi0gICAgICAgIHsiS2V5U3RvcmUiLCAiS2V5U3RvcmUifSwKLSAgICAgICAgeyJQb2xpY3kuRmlsZS4iLCAiXHU3QjU2XHU3NTY1XHU2NTg3XHU0RUY2OiJ9LAotICAgICAgICB7IkNvdWxkLm5vdC5vcGVuLnBvbGljeS5maWxlLnBvbGljeUZpbGUuZS50b1N0cmluZy4iLAotICAgICAgICAgICAgICAgICJcdTY1RTBcdTZDRDVcdTYyNTNcdTVGMDBcdTdCNTZcdTc1NjVcdTY1ODdcdTRFRjY6IHswfTogezF9In0sCi0gICAgICAgIHsiUG9saWN5LlRvb2wiLCAiXHU3QjU2XHU3NTY1XHU1REU1XHU1MTc3In0sCi0gICAgICAgIHsiRXJyb3JzLmhhdmUub2NjdXJyZWQud2hpbGUub3BlbmluZy50aGUucG9saWN5LmNvbmZpZ3VyYXRpb24uVmlldy50aGUuV2FybmluZy5Mb2cuZm9yLm1vcmUuaW5mb3JtYXRpb24uIiwKLSAgICAgICAgICAgICAgICAiXHU2MjUzXHU1RjAwXHU3QjU2XHU3NTY1XHU5MTREXHU3RjZFXHU2NUY2XHU1MUZBXHU5NTE5XHUzMDAyXHU2NzA5XHU1MTczXHU4QkU2XHU3RUM2XHU0RkUxXHU2MDZGLCBcdThCRjdcdTY3RTVcdTc3MEJcdThCNjZcdTU0NEFcdTY1RTVcdTVGRDdcdTMwMDIifSwKLSAgICAgICAgeyJFcnJvciIsICJcdTk1MTlcdThCRUYifSwKLSAgICAgICAgeyJPSyIsICJcdTc4NkVcdTVCOUEifSwKLSAgICAgICAgeyJTdGF0dXMiLCAiXHU3MkI2XHU2MDAxIn0sCi0gICAgICAgIHsiV2FybmluZyIsICJcdThCNjZcdTU0NEEifSwKLSAgICAgICAgeyJQZXJtaXNzaW9uLiIsCi0gICAgICAgICAgICAgICAgIlx1Njc0M1x1OTY1MDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIn0sCi0gICAgICAgIHsiUHJpbmNpcGFsLlR5cGUuIiwgIlx1NEUzQlx1NzUyOFx1NjIzN1x1N0M3Qlx1NTc4QjoifSwKLSAgICAgICAgeyJQcmluY2lwYWwuTmFtZS4iLCAiXHU0RTNCXHU3NTI4XHU2MjM3XHU1NDBEXHU3OUYwOiJ9LAotICAgICAgICB7IlRhcmdldC5OYW1lLiIsCi0gICAgICAgICAgICAgICAgIlx1NzZFRVx1NjgwN1x1NTQwRFx1NzlGMDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIn0sCi0gICAgICAgIHsiQWN0aW9ucy4iLAotICAgICAgICAgICAgICAgICJcdTY0Q0RcdTRGNUM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9LAotICAgICAgICB7Ik9LLnRvLm92ZXJ3cml0ZS5leGlzdGluZy5maWxlLmZpbGVuYW1lLiIsCi0gICAgICAgICAgICAgICAgIlx1Nzg2RVx1OEJBNFx1ODk4Nlx1NzZENlx1NzNCMFx1NjcwOVx1NzY4NFx1NjU4N1x1NEVGNnswfT8ifSwKLSAgICAgICAgeyJDYW5jZWwiLCAiXHU1M0Q2XHU2RDg4In0sCi0gICAgICAgIHsiQ29kZUJhc2UuIiwgIkNvZGVCYXNlOiJ9LAotICAgICAgICB7IlNpZ25lZEJ5LiIsICJTaWduZWRCeToifSwKLSAgICAgICAgeyJBZGQuUHJpbmNpcGFsIiwgIlx1NkRGQlx1NTJBMFx1NEUzQlx1NzUyOFx1NjIzNyJ9LAotICAgICAgICB7IkVkaXQuUHJpbmNpcGFsIiwgIlx1N0YxNlx1OEY5MVx1NEUzQlx1NzUyOFx1NjIzNyJ9LAotICAgICAgICB7IlJlbW92ZS5QcmluY2lwYWwiLCAiXHU1MjIwXHU5NjY0XHU0RTNCXHU3NTI4XHU2MjM3In0sCi0gICAgICAgIHsiUHJpbmNpcGFscy4iLCAiXHU0RTNCXHU3NTI4XHU2MjM3OiJ9LAotICAgICAgICB7Ii5BZGQuUGVybWlzc2lvbiIsICIgIFx1NkRGQlx1NTJBMFx1Njc0M1x1OTY1MCJ9LAotICAgICAgICB7Ii5FZGl0LlBlcm1pc3Npb24iLCAiICBcdTdGMTZcdThGOTFcdTY3NDNcdTk2NTAifSwKLSAgICAgICAgeyJSZW1vdmUuUGVybWlzc2lvbiIsICJcdTUyMjBcdTk2NjRcdTY3NDNcdTk2NTAifSwKLSAgICAgICAgeyJEb25lIiwgIlx1NUI4Q1x1NjIxMCJ9LAotICAgICAgICB7IktleVN0b3JlLlVSTC4iLCAiS2V5U3RvcmUgVVJMOiJ9LAotICAgICAgICB7IktleVN0b3JlLlR5cGUuIiwgIktleVN0b3JlIFx1N0M3Qlx1NTc4QjoifSwKLSAgICAgICAgeyJLZXlTdG9yZS5Qcm92aWRlci4iLCAiS2V5U3RvcmUgXHU2M0QwXHU0RjlCXHU2NUI5OiJ9LAotICAgICAgICB7IktleVN0b3JlLlBhc3N3b3JkLlVSTC4iLCAiS2V5U3RvcmUgXHU1M0UzXHU0RUU0IFVSTDoifSwKLSAgICAgICAgeyJQcmluY2lwYWxzIiwgIlx1NEUzQlx1NzUyOFx1NjIzNyJ9LAotICAgICAgICB7Ii5FZGl0LlByaW5jaXBhbC4iLCAiICBcdTdGMTZcdThGOTFcdTRFM0JcdTc1MjhcdTYyMzc6In0sCi0gICAgICAgIHsiLkFkZC5OZXcuUHJpbmNpcGFsLiIsICIgIFx1NkRGQlx1NTJBMFx1NjVCMFx1NEUzQlx1NzUyOFx1NjIzNzoifSwKLSAgICAgICAgeyJQZXJtaXNzaW9ucyIsICJcdTY3NDNcdTk2NTAifSwKLSAgICAgICAgeyIuRWRpdC5QZXJtaXNzaW9uLiIsICIgIFx1N0YxNlx1OEY5MVx1Njc0M1x1OTY1MDoifSwKLSAgICAgICAgeyIuQWRkLk5ldy5QZXJtaXNzaW9uLiIsICIgIFx1NTJBMFx1NTE2NVx1NjVCMFx1NzY4NFx1Njc0M1x1OTY1MDoifSwKLSAgICAgICAgeyJTaWduZWQuQnkuIiwgIlx1N0I3RVx1N0Y3Mlx1NEVCQTogIn0sCi0gICAgICAgIHsiQ2Fubm90LlNwZWNpZnkuUHJpbmNpcGFsLndpdGguYS5XaWxkY2FyZC5DbGFzcy53aXRob3V0LmEuV2lsZGNhcmQuTmFtZSIsCi0gICAgICAgICAgICAiXHU2Q0ExXHU2NzA5XHU5MDFBXHU5MTREXHU3QjI2XHU1NDBEXHU3OUYwLCBcdTY1RTBcdTZDRDVcdTRGN0ZcdTc1MjhcdTkwMUFcdTkxNERcdTdCMjZcdTdDN0JcdTYzMDdcdTVCOUFcdTRFM0JcdTc1MjhcdTYyMzcifSwKLSAgICAgICAgeyJDYW5ub3QuU3BlY2lmeS5QcmluY2lwYWwud2l0aG91dC5hLk5hbWUiLAotICAgICAgICAgICAgIlx1NkNBMVx1NjcwOVx1NTQwRFx1NzlGMCwgXHU2NUUwXHU2Q0Q1XHU2MzA3XHU1QjlBXHU0RTNCXHU3NTI4XHU2MjM3In0sCi0gICAgICAgIHsiUGVybWlzc2lvbi5hbmQuVGFyZ2V0Lk5hbWUubXVzdC5oYXZlLmEudmFsdWUiLAotICAgICAgICAgICAgICAgICJcdTY3NDNcdTk2NTBcdTUzQ0FcdTc2RUVcdTY4MDdcdTU0MERcdTVGQzVcdTk4N0JcdTY3MDlcdTRFMDBcdTRFMkFcdTUwM0MifSwKLSAgICAgICAgeyJSZW1vdmUudGhpcy5Qb2xpY3kuRW50cnkuIiwgIlx1NjYyRlx1NTQyNlx1NTIyMFx1OTY2NFx1NkI2NFx1N0I1Nlx1NzU2NVx1Njc2MVx1NzZFRT8ifSwKLSAgICAgICAgeyJPdmVyd3JpdGUuRmlsZSIsICJcdTg5ODZcdTc2RDZcdTY1ODdcdTRFRjYifSwKLSAgICAgICAgeyJQb2xpY3kuc3VjY2Vzc2Z1bGx5LndyaXR0ZW4udG8uZmlsZW5hbWUiLAotICAgICAgICAgICAgICAgICJcdTdCNTZcdTc1NjVcdTVERjJcdTYyMTBcdTUyOUZcdTUxOTlcdTUxNjVcdTUyMzB7MH0ifSwKLSAgICAgICAgeyJudWxsLmZpbGVuYW1lIiwgIlx1N0E3QVx1NjU4N1x1NEVGNlx1NTQwRCJ9LAotICAgICAgICB7IlNhdmUuY2hhbmdlcy4iLCAiXHU2NjJGXHU1NDI2XHU0RkREXHU1QjU4XHU2MjQwXHU1MDVBXHU3Njg0XHU2NkY0XHU2NTM5PyJ9LAotICAgICAgICB7IlllcyIsICJcdTY2MkYifSwKLSAgICAgICAgeyJObyIsICJcdTU0MjYifSwKLSAgICAgICAgeyJQb2xpY3kuRW50cnkiLCAiXHU3QjU2XHU3NTY1XHU2NzYxXHU3NkVFIn0sCi0gICAgICAgIHsiU2F2ZS5DaGFuZ2VzIiwgIlx1NEZERFx1NUI1OFx1NjZGNFx1NjUzOSJ9LAotICAgICAgICB7Ik5vLlBvbGljeS5FbnRyeS5zZWxlY3RlZCIsICJcdTZDQTFcdTY3MDlcdTkwMDlcdTYyRTlcdTdCNTZcdTc1NjVcdTY3NjFcdTc2RUUifSwKLSAgICAgICAgeyJVbmFibGUudG8ub3Blbi5LZXlTdG9yZS5leC50b1N0cmluZy4iLAotICAgICAgICAgICAgICAgICJcdTY1RTBcdTZDRDVcdTYyNTNcdTVGMDAgS2V5U3RvcmU6IHswfSJ9LAotICAgICAgICB7Ik5vLnByaW5jaXBhbC5zZWxlY3RlZCIsICJcdTY3MkFcdTkwMDlcdTYyRTlcdTRFM0JcdTc1MjhcdTYyMzcifSwKLSAgICAgICAgeyJOby5wZXJtaXNzaW9uLnNlbGVjdGVkIiwgIlx1NkNBMVx1NjcwOVx1OTAwOVx1NjJFOVx1Njc0M1x1OTY1MCJ9LAotICAgICAgICB7Im5hbWUiLCAiXHU1NDBEXHU3OUYwIn0sCi0gICAgICAgIHsiY29uZmlndXJhdGlvbi50eXBlIiwgIlx1OTE0RFx1N0Y2RVx1N0M3Qlx1NTc4QiJ9LAotICAgICAgICB7ImVudmlyb25tZW50LnZhcmlhYmxlLm5hbWUiLCAiXHU3M0FGXHU1ODgzXHU1M0Q4XHU5MUNGXHU1NDBEIn0sCi0gICAgICAgIHsibGlicmFyeS5uYW1lIiwgIlx1NUU5M1x1NTQwRFx1NzlGMCJ9LAotICAgICAgICB7InBhY2thZ2UubmFtZSIsICJcdTdBMEJcdTVFOEZcdTUzMDVcdTU0MERcdTc5RjAifSwKLSAgICAgICAgeyJwb2xpY3kudHlwZSIsICJcdTdCNTZcdTc1NjVcdTdDN0JcdTU3OEIifSwKLSAgICAgICAgeyJwcm9wZXJ0eS5uYW1lIiwgIlx1NUM1RVx1NjAyN1x1NTQwRFx1NzlGMCJ9LAotICAgICAgICB7IlByaW5jaXBhbC5MaXN0IiwgIlx1NEUzQlx1NzUyOFx1NjIzN1x1NTIxN1x1ODg2OCJ9LAotICAgICAgICB7IlBlcm1pc3Npb24uTGlzdCIsICJcdTY3NDNcdTk2NTBcdTUyMTdcdTg4NjgifSwKLSAgICAgICAgeyJDb2RlLkJhc2UiLCAiXHU0RUUzXHU3ODAxXHU1RTkzIn0sCi0gICAgICAgIHsiS2V5U3RvcmUuVS5SLkwuIiwgIktleVN0b3JlIFVSTDoifSwKLSAgICAgICAgeyJLZXlTdG9yZS5QYXNzd29yZC5VLlIuTC4iLCAiS2V5U3RvcmUgXHU1M0UzXHU0RUU0IFVSTDoifSwKLQotCiAgICAgICAgIC8vIGphdmF4LnNlY3VyaXR5LmF1dGguUHJpdmF0ZUNyZWRlbnRpYWxQZXJtaXNzaW9uCiAgICAgICAgIHsiaW52YWxpZC5udWxsLmlucHV0LnMuIiwgIlx1NjVFMFx1NjU0OFx1NzY4NFx1N0E3QVx1OEY5M1x1NTE2NSJ9LAogICAgICAgICB7ImFjdGlvbnMuY2FuLm9ubHkuYmUucmVhZC4iLCAiXHU2NENEXHU0RjVDXHU1M0VBXHU4MEZEXHU0RTNBICdcdThCRkJcdTUzRDYnIn0sCkBAIC01NTMsNiArNTgsNyBAQAogICAgICAgICB7InByb3ZpZGVkLm51bGwuT0lELm1hcCIsICJcdTYzRDBcdTRGOUJcdTc2ODQgT0lEIFx1NjYyMFx1NUMwNFx1NEUzQVx1N0E3QVx1NTAzQyJ9LAogCiAgICAgICAgIC8vIGphdmF4LnNlY3VyaXR5LmF1dGguU3ViamVjdAorICAgICAgICB7Ik5FV0xJTkUiLCAiXG4ifSwKICAgICAgICAgeyJpbnZhbGlkLm51bGwuQWNjZXNzQ29udHJvbENvbnRleHQucHJvdmlkZWQiLAogICAgICAgICAgICAgICAgICJcdTYzRDBcdTRGOUJcdTRFODZcdTY1RTBcdTY1NDhcdTc2ODRcdTdBN0EgQWNjZXNzQ29udHJvbENvbnRleHQifSwKICAgICAgICAgeyJpbnZhbGlkLm51bGwuYWN0aW9uLnByb3ZpZGVkIiwgIlx1NjNEMFx1NEY5Qlx1NEU4Nlx1NjVFMFx1NjU0OFx1NzY4NFx1N0E3QVx1NjRDRFx1NEY1QyJ9LApAQCAtNjU2LDYgKzE2Miw3IEBACiAgICAgICoKICAgICAgKiBAcmV0dXJuIHRoZSBjb250ZW50cyBvZiB0aGlzIDxjb2RlPlJlc291cmNlQnVuZGxlPC9jb2RlPi4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgT2JqZWN0W11bXSBnZXRDb250ZW50cygpIHsKICAgICAgICAgcmV0dXJuIGNvbnRlbnRzOwogICAgIH0KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdXRpbC9SZXNvdXJjZXNfemhfVFcuamF2YSBiL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vc2VjdXJpdHkvdXRpbC9SZXNvdXJjZXNfemhfVFcuamF2YQppbmRleCBjZjBmZTVlLi5iOTU2NDdhIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3NlY3VyaXR5L3V0aWwvUmVzb3VyY2VzX3poX1RXLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi9zZWN1cml0eS91dGlsL1Jlc291cmNlc196aF9UVy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMzQsNTAxICszNCw2IEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXVtdIGNvbnRlbnRzID0gewogCi0gICAgICAgIC8vIHNoYXJlZCAoZnJvbSBqYXJzaWduZXIpCi0gICAgICAgIHsiU1BBQ0UiLCAiICJ9LAotICAgICAgICB7IjJTUEFDRSIsICIgICJ9LAotICAgICAgICB7IjZTUEFDRSIsICIgICAgICAifSwKLSAgICAgICAgeyJDT01NQSIsICIsICJ9LAotICAgICAgICAvLyBzaGFyZWQgKGZyb20ga2V5dG9vbCkKLSAgICAgICAgeyJORVdMSU5FIiwgIlxuIn0sCi0gICAgICAgIHsiU1RBUiIsCi0gICAgICAgICAgICAgICAgIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioifSwKLSAgICAgICAgeyJTVEFSTk4iLAotICAgICAgICAgICAgICAgICIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cbiJ9LAotCi0gICAgICAgIC8vIGtleXRvb2w6IEhlbHAgcGFydAotLy8gIk9wdGlvbiIgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0gICAgICAgIHsiLk9QVElPTi4iLCAiIFtcdTkwNzhcdTk4MDVdLi4uIn0sCi0gICAgICAgIHsiT3B0aW9ucy4iLCAiXHU5MDc4XHU5ODA1OiJ9LAotICAgICAgICB7IlVzZS5rZXl0b29sLmhlbHAuZm9yLmFsbC5hdmFpbGFibGUuY29tbWFuZHMiLAotICAgICAgICAgICAgICAgICAiXHU0RjdGXHU3NTI4IFwia2V5dG9vbCAtaGVscFwiIFx1NTNENlx1NUY5N1x1NjI0MFx1NjcwOVx1NTNFRlx1NzUyOFx1NzY4NFx1NTQ3RFx1NEVFNCJ9LAotICAgICAgICB7IktleS5hbmQuQ2VydGlmaWNhdGUuTWFuYWdlbWVudC5Ub29sIiwKLSAgICAgICAgICAgICAgICAgIlx1OTFEMVx1OTQ3MFx1ODIwN1x1NjE5MVx1OEI0OVx1N0JBMVx1NzQwNlx1NURFNVx1NTE3NyJ9LAotICAgICAgICB7IkNvbW1hbmRzLiIsICJcdTU0N0RcdTRFRTQ6In0sCi0gICAgICAgIHsiVXNlLmtleXRvb2wuY29tbWFuZC5uYW1lLmhlbHAuZm9yLnVzYWdlLm9mLmNvbW1hbmQubmFtZSIsCi0gICAgICAgICAgICAgICAgIlx1NEY3Rlx1NzUyOCBcImtleXRvb2wgLWNvbW1hbmRfbmFtZSAtaGVscFwiIFx1NTNENlx1NUY5NyBjb21tYW5kX25hbWUgXHU3Njg0XHU3NTI4XHU2Q0Q1In0sCi0gICAgICAgIC8vIGtleXRvb2w6IGhlbHA6IGNvbW1hbmRzCi0gICAgICAgIHsiR2VuZXJhdGVzLmEuY2VydGlmaWNhdGUucmVxdWVzdCIsCi0gICAgICAgICAgICAgICAgIlx1NzUyMlx1NzUxRlx1NjE5MVx1OEI0OVx1ODk4MVx1NkM0MiJ9LCAvLy1jZXJ0cmVxCi0gICAgICAgIHsiQ2hhbmdlcy5hbi5lbnRyeS5zLmFsaWFzIiwKLSAgICAgICAgICAgICAgICAiXHU4QjhBXHU2NkY0XHU5ODA1XHU3NkVFXHU3Njg0XHU1MjI1XHU1NDBEIn0sIC8vLWNoYW5nZWFsaWFzCi0gICAgICAgIHsiRGVsZXRlcy5hbi5lbnRyeSIsCi0gICAgICAgICAgICAgICAgIlx1NTIyQVx1OTY2NFx1OTgwNVx1NzZFRSJ9LCAvLy1kZWxldGUKLSAgICAgICAgeyJFeHBvcnRzLmNlcnRpZmljYXRlIiwKLSAgICAgICAgICAgICAgICAiXHU1MzJGXHU1MUZBXHU2MTkxXHU4QjQ5In0sIC8vLWV4cG9ydGNlcnQKLSAgICAgICAgeyJHZW5lcmF0ZXMuYS5rZXkucGFpciIsCi0gICAgICAgICAgICAgICAgIlx1NzUyMlx1NzUxRlx1OTFEMVx1OTQ3MFx1N0Q0NCJ9LCAvLy1nZW5rZXlwYWlyCi0vLyB0cmFuc2xhdGlvbiBvZiAic2VjcmV0IiBrZXkgc2hvdWxkIGJlIGRpZmZlcmVudCB0byAicHJpdmF0ZSIga2V5LgotICAgICAgICB7IkdlbmVyYXRlcy5hLnNlY3JldC5rZXkiLAotICAgICAgICAgICAgICAgICJcdTc1MjJcdTc1MUZcdTc5RDhcdTVCQzZcdTkxRDFcdTk0NzAifSwgLy8tZ2Vuc2Vja2V5Ci0gICAgICAgIHsiR2VuZXJhdGVzLmNlcnRpZmljYXRlLmZyb20uYS5jZXJ0aWZpY2F0ZS5yZXF1ZXN0IiwKLSAgICAgICAgICAgICAgICAiXHU1RjlFXHU2MTkxXHU4QjQ5XHU4OTgxXHU2QzQyXHU3NTIyXHU3NTFGXHU2MTkxXHU4QjQ5In0sIC8vLWdlbmNlcnQKLSAgICAgICAgeyJHZW5lcmF0ZXMuQ1JMIiwgIlx1NzUyMlx1NzUxRiBDUkwifSwgLy8tZ2VuY3JsCi0gICAgICAgIHsiSW1wb3J0cy5lbnRyaWVzLmZyb20uYS5KREsuMS4xLnguc3R5bGUuaWRlbnRpdHkuZGF0YWJhc2UiLAotICAgICAgICAgICAgICAgICJcdTVGOUUgSkRLIDEuMS54LXN0eWxlIFx1OEI1OFx1NTIyNVx1OENDN1x1NjU5OVx1NUVBQlx1NTMyRlx1NTE2NVx1OTgwNVx1NzZFRSJ9LCAvLy1pZGVudGl0eWRiCi0gICAgICAgIHsiSW1wb3J0cy5hLmNlcnRpZmljYXRlLm9yLmEuY2VydGlmaWNhdGUuY2hhaW4iLAotICAgICAgICAgICAgICAgICJcdTUzMkZcdTUxNjVcdTYxOTFcdThCNDlcdTYyMTZcdTYxOTFcdThCNDlcdTkzQzgifSwgLy8taW1wb3J0Y2VydAotICAgICAgICB7IkltcG9ydHMub25lLm9yLmFsbC5lbnRyaWVzLmZyb20uYW5vdGhlci5rZXlzdG9yZSIsCi0gICAgICAgICAgICAgICAgIlx1NUY5RVx1NTE3Nlx1NEVENlx1OTFEMVx1OTQ3MFx1NTEzMlx1NUI1OFx1NUVBQlx1NTMyRlx1NTE2NVx1NEUwMFx1NTAwQlx1NjIxNlx1NTE2OFx1OTBFOFx1OTgwNVx1NzZFRSJ9LCAvLy1pbXBvcnRrZXlzdG9yZQotICAgICAgICB7IkNsb25lcy5hLmtleS5lbnRyeSIsCi0gICAgICAgICAgICAgICAgIlx1ODkwN1x1ODhGRFx1OTFEMVx1OTQ3MFx1OTgwNVx1NzZFRSJ9LCAvLy1rZXljbG9uZQotICAgICAgICB7IkNoYW5nZXMudGhlLmtleS5wYXNzd29yZC5vZi5hbi5lbnRyeSIsCi0gICAgICAgICAgICAgICAgIlx1OEI4QVx1NjZGNFx1OTgwNVx1NzZFRVx1NzY4NFx1OTFEMVx1OTQ3MFx1NUJDNlx1NzhCQyJ9LCAvLy1rZXlwYXNzd2QKLSAgICAgICAgeyJMaXN0cy5lbnRyaWVzLmluLmEua2V5c3RvcmUiLAotICAgICAgICAgICAgICAgICJcdTUyMTdcdTc5M0FcdTkxRDFcdTk0NzBcdTUxMzJcdTVCNThcdTVFQUJcdTRFMkRcdTc2ODRcdTk4MDVcdTc2RUUifSwgLy8tbGlzdAotICAgICAgICB7IlByaW50cy50aGUuY29udGVudC5vZi5hLmNlcnRpZmljYXRlIiwKLSAgICAgICAgICAgICAgICAiXHU1MjE3XHU1MzcwXHU2MTkxXHU4QjQ5XHU3Njg0XHU1MTY3XHU1QkI5In0sIC8vLXByaW50Y2VydAotICAgICAgICB7IlByaW50cy50aGUuY29udGVudC5vZi5hLmNlcnRpZmljYXRlLnJlcXVlc3QiLAotICAgICAgICAgICAgICAgICJcdTUyMTdcdTUzNzBcdTYxOTFcdThCNDlcdTg5ODFcdTZDNDJcdTc2ODRcdTUxNjdcdTVCQjkifSwgLy8tcHJpbnRjZXJ0cmVxCi0gICAgICAgIHsiUHJpbnRzLnRoZS5jb250ZW50Lm9mLmEuQ1JMLmZpbGUiLAotICAgICAgICAgICAgICAgICJcdTUyMTdcdTUzNzAgQ1JMIFx1NkE5NFx1Njg0OFx1NzY4NFx1NTE2N1x1NUJCOSJ9LCAvLy1wcmludGNybAotICAgICAgICB7IkdlbmVyYXRlcy5hLnNlbGYuc2lnbmVkLmNlcnRpZmljYXRlIiwKLSAgICAgICAgICAgICAgICAiXHU3NTIyXHU3NTFGXHU4MUVBXHU4ODRDXHU3QzNEXHU3RjcyXHU3Njg0XHU2MTkxXHU4QjQ5In0sIC8vLXNlbGZjZXJ0Ci0gICAgICAgIHsiQ2hhbmdlcy50aGUuc3RvcmUucGFzc3dvcmQub2YuYS5rZXlzdG9yZSIsCi0gICAgICAgICAgICAgICAgIlx1OEI4QVx1NjZGNFx1OTFEMVx1OTQ3MFx1NTEzMlx1NUI1OFx1NUVBQlx1NzY4NFx1NTEzMlx1NUI1OFx1NUJDNlx1NzhCQyJ9LCAvLy1zdG9yZXBhc3N3ZAotICAgICAgICAvLyBrZXl0b29sOiBoZWxwOiBvcHRpb25zCi0gICAgICAgIHsiYWxpYXMubmFtZS5vZi50aGUuZW50cnkudG8ucHJvY2VzcyIsCi0gICAgICAgICAgICAgICAgIlx1ODk4MVx1ODY1NVx1NzQwNlx1OTgwNVx1NzZFRVx1NzY4NFx1NTIyNVx1NTQwRFx1NTQwRFx1N0EzMSJ9LCAvLy1hbGlhcwotICAgICAgICB7ImRlc3RpbmF0aW9uLmFsaWFzIiwKLSAgICAgICAgICAgICAgICAiXHU3NkVFXHU3Njg0XHU1NzMwXHU1MjI1XHU1NDBEIn0sIC8vLWRlc3RhbGlhcwotICAgICAgICB7ImRlc3RpbmF0aW9uLmtleS5wYXNzd29yZCIsCi0gICAgICAgICAgICAgICAgIlx1NzZFRVx1NzY4NFx1NTczMFx1OTFEMVx1OTQ3MFx1NUJDNlx1NzhCQyJ9LCAvLy1kZXN0a2V5cGFzcwotICAgICAgICB7ImRlc3RpbmF0aW9uLmtleXN0b3JlLm5hbWUiLAotICAgICAgICAgICAgICAgICJcdTc2RUVcdTc2ODRcdTU3MzBcdTkxRDFcdTk0NzBcdTUxMzJcdTVCNThcdTVFQUJcdTU0MERcdTdBMzEifSwgLy8tZGVzdGtleXN0b3JlCi0gICAgICAgIHsiZGVzdGluYXRpb24ua2V5c3RvcmUucGFzc3dvcmQucHJvdGVjdGVkIiwKLSAgICAgICAgICAgICAgICAiXHU3NkVFXHU3Njg0XHU1NzMwXHU5MUQxXHU5NDcwXHU1MTMyXHU1QjU4XHU1RUFCXHU1QkM2XHU3OEJDXHU0RkREXHU4Qjc3In0sIC8vLWRlc3Rwcm90ZWN0ZWQKLSAgICAgICAgeyJkZXN0aW5hdGlvbi5rZXlzdG9yZS5wcm92aWRlci5uYW1lIiwKLSAgICAgICAgICAgICAgICAiXHU3NkVFXHU3Njg0XHU1NzMwXHU5MUQxXHU5NDcwXHU1MTMyXHU1QjU4XHU1RUFCXHU2M0QwXHU0RjlCXHU4MDA1XHU1NDBEXHU3QTMxIn0sIC8vLWRlc3Rwcm92aWRlcm5hbWUKLSAgICAgICAgeyJkZXN0aW5hdGlvbi5rZXlzdG9yZS5wYXNzd29yZCIsCi0gICAgICAgICAgICAgICAgIlx1NzZFRVx1NzY4NFx1NTczMFx1OTFEMVx1OTQ3MFx1NTEzMlx1NUI1OFx1NUVBQlx1NUJDNlx1NzhCQyJ9LCAvLy1kZXN0c3RvcmVwYXNzCi0gICAgICAgIHsiZGVzdGluYXRpb24ua2V5c3RvcmUudHlwZSIsCi0gICAgICAgICAgICAgICAgIlx1NzZFRVx1NzY4NFx1NTczMFx1OTFEMVx1OTQ3MFx1NTEzMlx1NUI1OFx1NUVBQlx1OTg1RVx1NTc4QiJ9LCAvLy1kZXN0c3RvcmV0eXBlCi0gICAgICAgIHsiZGlzdGluZ3Vpc2hlZC5uYW1lIiwKLSAgICAgICAgICAgICAgICAiXHU4RkE4XHU1MjI1XHU1NDBEXHU3QTMxIn0sIC8vLWRuYW1lCi0gICAgICAgIHsiWC41MDkuZXh0ZW5zaW9uIiwKLSAgICAgICAgICAgICAgICAiWC41MDkgXHU2NEY0XHU1MTQ1XHU1OTU3XHU0RUY2In0sIC8vLWV4dAotICAgICAgICB7Im91dHB1dC5maWxlLm5hbWUiLAotICAgICAgICAgICAgICAgICJcdThGMzhcdTUxRkFcdTZBOTRcdTY4NDhcdTU0MERcdTdBMzEifSwgLy8tZmlsZSBhbmQgLW91dGZpbGUKLSAgICAgICAgeyJpbnB1dC5maWxlLm5hbWUiLAotICAgICAgICAgICAgICAgICJcdThGMzhcdTUxNjVcdTZBOTRcdTY4NDhcdTU0MERcdTdBMzEifSwgLy8tZmlsZSBhbmQgLWluZmlsZQotICAgICAgICB7ImtleS5hbGdvcml0aG0ubmFtZSIsCi0gICAgICAgICAgICAgICAgIlx1OTFEMVx1OTQ3MFx1NkYxNFx1N0I5N1x1NkNENVx1NTQwRFx1N0EzMSJ9LCAvLy1rZXlhbGcKLSAgICAgICAgeyJrZXkucGFzc3dvcmQiLAotICAgICAgICAgICAgICAgICJcdTkxRDFcdTk0NzBcdTVCQzZcdTc4QkMifSwgLy8ta2V5cGFzcwotICAgICAgICB7ImtleS5iaXQuc2l6ZSIsCi0gICAgICAgICAgICAgICAgIlx1OTFEMVx1OTQ3MFx1NEY0RFx1NTE0M1x1NTkyN1x1NUMwRiJ9LCAvLy1rZXlzaXplCi0gICAgICAgIHsia2V5c3RvcmUubmFtZSIsCi0gICAgICAgICAgICAgICAgIlx1OTFEMVx1OTQ3MFx1NTEzMlx1NUI1OFx1NUVBQlx1NTQwRFx1N0EzMSJ9LCAvLy1rZXlzdG9yZQotICAgICAgICB7Im5ldy5wYXNzd29yZCIsCi0gICAgICAgICAgICAgICAgIlx1NjVCMFx1NUJDNlx1NzhCQyJ9LCAvLy1uZXcKLSAgICAgICAgeyJkby5ub3QucHJvbXB0IiwKLSAgICAgICAgICAgICAgICAiXHU0RTBEXHU4OTgxXHU2M0QwXHU3OTNBIn0sIC8vLW5vcHJvbXB0Ci0gICAgICAgIHsicGFzc3dvcmQudGhyb3VnaC5wcm90ZWN0ZWQubWVjaGFuaXNtIiwKLSAgICAgICAgICAgICAgICAiXHU3RDkzXHU3NTMxXHU0RkREXHU4Qjc3XHU2QTVGXHU1MjM2XHU3Njg0XHU1QkM2XHU3OEJDIn0sIC8vLXByb3RlY3RlZAotICAgICAgICB7InByb3ZpZGVyLmFyZ3VtZW50IiwKLSAgICAgICAgICAgICAgICAiXHU2M0QwXHU0RjlCXHU4MDA1XHU1RjE1XHU2NTc4In0sIC8vLXByb3ZpZGVyYXJnCi0gICAgICAgIHsicHJvdmlkZXIuY2xhc3MubmFtZSIsCi0gICAgICAgICAgICAgICAgIlx1NjNEMFx1NEY5Qlx1ODAwNVx1OTg1RVx1NTIyNVx1NTQwRFx1N0EzMSJ9LCAvLy1wcm92aWRlcmNsYXNzCi0gICAgICAgIHsicHJvdmlkZXIubmFtZSIsCi0gICAgICAgICAgICAgICAgIlx1NjNEMFx1NEY5Qlx1ODAwNVx1NTQwRFx1N0EzMSJ9LCAvLy1wcm92aWRlcm5hbWUKLSAgICAgICAgeyJwcm92aWRlci5jbGFzc3BhdGgiLAotICAgICAgICAgICAgICAgICJcdTYzRDBcdTRGOUJcdTgwMDVcdTk4NUVcdTUyMjVcdThERUZcdTVGOTEifSwgLy8tcHJvdmlkZXJwYXRoCi0gICAgICAgIHsib3V0cHV0LmluLlJGQy5zdHlsZSIsCi0gICAgICAgICAgICAgICAgIlx1NEVFNSBSRkMgXHU2QTIzXHU1RjBGXHU4RjM4XHU1MUZBIn0sIC8vLXJmYwotICAgICAgICB7InNpZ25hdHVyZS5hbGdvcml0aG0ubmFtZSIsCi0gICAgICAgICAgICAgICAgIlx1N0MzRFx1N0FFMFx1NkYxNFx1N0I5N1x1NkNENVx1NTQwRFx1N0EzMSJ9LCAvLy1zaWdhbGcKLSAgICAgICAgeyJzb3VyY2UuYWxpYXMiLAotICAgICAgICAgICAgICAgICJcdTRGODZcdTZFOTBcdTUyMjVcdTU0MEQifSwgLy8tc3JjYWxpYXMKLSAgICAgICAgeyJzb3VyY2Uua2V5LnBhc3N3b3JkIiwKLSAgICAgICAgICAgICAgICAiXHU0Rjg2XHU2RTkwXHU5MUQxXHU5NDcwXHU1QkM2XHU3OEJDIn0sIC8vLXNyY2tleXBhc3MKLSAgICAgICAgeyJzb3VyY2Uua2V5c3RvcmUubmFtZSIsCi0gICAgICAgICAgICAgICAgIlx1NEY4Nlx1NkU5MFx1OTFEMVx1OTQ3MFx1NTEzMlx1NUI1OFx1NUVBQlx1NTQwRFx1N0EzMSJ9LCAvLy1zcmNrZXlzdG9yZQotICAgICAgICB7InNvdXJjZS5rZXlzdG9yZS5wYXNzd29yZC5wcm90ZWN0ZWQiLAotICAgICAgICAgICAgICAgICJcdTRGODZcdTZFOTBcdTkxRDFcdTk0NzBcdTUxMzJcdTVCNThcdTVFQUJcdTVCQzZcdTc4QkNcdTRGRERcdThCNzcifSwgLy8tc3JjcHJvdGVjdGVkCi0gICAgICAgIHsic291cmNlLmtleXN0b3JlLnByb3ZpZGVyLm5hbWUiLAotICAgICAgICAgICAgICAgICJcdTRGODZcdTZFOTBcdTkxRDFcdTk0NzBcdTUxMzJcdTVCNThcdTVFQUJcdTYzRDBcdTRGOUJcdTgwMDVcdTU0MERcdTdBMzEifSwgLy8tc3JjcHJvdmlkZXJuYW1lCi0gICAgICAgIHsic291cmNlLmtleXN0b3JlLnBhc3N3b3JkIiwKLSAgICAgICAgICAgICAgICAiXHU0Rjg2XHU2RTkwXHU5MUQxXHU5NDcwXHU1MTMyXHU1QjU4XHU1RUFCXHU1QkM2XHU3OEJDIn0sIC8vLXNyY3N0b3JlcGFzcwotICAgICAgICB7InNvdXJjZS5rZXlzdG9yZS50eXBlIiwKLSAgICAgICAgICAgICAgICAiXHU0Rjg2XHU2RTkwXHU5MUQxXHU5NDcwXHU1MTMyXHU1QjU4XHU1RUFCXHU5ODVFXHU1NzhCIn0sIC8vLXNyY3N0b3JldHlwZQotICAgICAgICB7IlNTTC5zZXJ2ZXIuaG9zdC5hbmQucG9ydCIsCi0gICAgICAgICAgICAgICAgIlNTTCBcdTRGM0FcdTY3MERcdTU2NjhcdTRFM0JcdTZBNUZcdTgyMDdcdTkwMjNcdTYzQTVcdTU3RTAifSwgLy8tc3Nsc2VydmVyCi0gICAgICAgIHsic2lnbmVkLmphci5maWxlIiwKLSAgICAgICAgICAgICAgICAiXHU3QzNEXHU3RjcyXHU3Njg0IGphciBcdTZBOTRcdTY4NDgifSwgLy89amFyZmlsZQotICAgICAgICB7ImNlcnRpZmljYXRlLnZhbGlkaXR5LnN0YXJ0LmRhdGUudGltZSIsCi0gICAgICAgICAgICAgICAgIlx1NjE5MVx1OEI0OVx1NjcwOVx1NjU0OFx1NjAyN1x1OTU4Qlx1NTlDQlx1NjVFNVx1NjcxRi9cdTY2NDJcdTk1OTMifSwgLy8tc3RhcnRkYXRlCi0gICAgICAgIHsia2V5c3RvcmUucGFzc3dvcmQiLAotICAgICAgICAgICAgICAgICJcdTkxRDFcdTk0NzBcdTUxMzJcdTVCNThcdTVFQUJcdTVCQzZcdTc4QkMifSwgLy8tc3RvcmVwYXNzCi0gICAgICAgIHsia2V5c3RvcmUudHlwZSIsCi0gICAgICAgICAgICAgICAgIlx1OTFEMVx1OTQ3MFx1NTEzMlx1NUI1OFx1NUVBQlx1OTg1RVx1NTc4QiJ9LCAvLy1zdG9yZXR5cGUKLSAgICAgICAgeyJ0cnVzdC5jZXJ0aWZpY2F0ZXMuZnJvbS5jYWNlcnRzIiwKLSAgICAgICAgICAgICAgICAiXHU0Rjg2XHU4MUVBIGNhY2VydHMgXHU3Njg0XHU0RkUxXHU0RUZCXHU2MTkxXHU4QjQ5In0sIC8vLXRydXN0Y2FjZXJ0cwotICAgICAgICB7InZlcmJvc2Uub3V0cHV0IiwKLSAgICAgICAgICAgICAgICAiXHU4QTczXHU3RDMwXHU4Q0M3XHU4QTBBXHU4RjM4XHU1MUZBIn0sIC8vLXYKLSAgICAgICAgeyJ2YWxpZGl0eS5udW1iZXIub2YuZGF5cyIsCi0gICAgICAgICAgICAgICAgIlx1NjcwOVx1NjU0OFx1NjAyN1x1NjVFNVx1NjU3OCJ9LCAvLy12YWxpZGl0eQotICAgICAgICB7IlNlcmlhbC5JRC5vZi5jZXJ0LnRvLnJldm9rZSIsCi0gICAgICAgICAgICAgICAgICJcdTg5ODFcdTY0QTRcdTkyQjdcdTYxOTFcdThCNDlcdTc2ODRcdTVFOEZcdTUyMTcgSUQifSwgLy8taWQKLSAgICAgICAgLy8ga2V5dG9vbDogUnVubmluZyBwYXJ0Ci0gICAgICAgIHsia2V5dG9vbC5lcnJvci4iLCAiXHU5MUQxXHU5NDcwXHU1REU1XHU1MTc3XHU5MzJGXHU4QUE0OiAifSwKLSAgICAgICAgeyJJbGxlZ2FsLm9wdGlvbi4iLCAiXHU3MTIxXHU2NTQ4XHU3Njg0XHU5MDc4XHU5ODA1OiJ9LAotICAgICAgICB7IklsbGVnYWwudmFsdWUuIiwgIlx1NzEyMVx1NjU0OFx1NTAzQzogIn0sCi0gICAgICAgIHsiVW5rbm93bi5wYXNzd29yZC50eXBlLiIsICJcdTRFMERcdTY2MEVcdTc2ODRcdTVCQzZcdTc4QkNcdTk4NUVcdTU3OEI6ICJ9LAotICAgICAgICB7IkNhbm5vdC5maW5kLmVudmlyb25tZW50LnZhcmlhYmxlLiIsCi0gICAgICAgICAgICAgICAgIlx1NjI3RVx1NEUwRFx1NTIzMFx1NzRCMFx1NTg4M1x1OEI4QVx1NjU3ODogIn0sCi0gICAgICAgIHsiQ2Fubm90LmZpbmQuZmlsZS4iLCAiXHU2MjdFXHU0RTBEXHU1MjMwXHU2QTk0XHU2ODQ4OiAifSwKLSAgICAgICAgeyJDb21tYW5kLm9wdGlvbi5mbGFnLm5lZWRzLmFuLmFyZ3VtZW50LiIsICJcdTU0N0RcdTRFRTRcdTkwNzhcdTk4MDUgezB9IFx1OTcwMFx1ODk4MVx1NUYxNVx1NjU3OFx1MzAwMiJ9LAotICAgICAgICB7Ildhcm5pbmcuRGlmZmVyZW50LnN0b3JlLmFuZC5rZXkucGFzc3dvcmRzLm5vdC5zdXBwb3J0ZWQuZm9yLlBLQ1MxMi5LZXlTdG9yZXMuSWdub3JpbmcudXNlci5zcGVjaWZpZWQuY29tbWFuZC52YWx1ZS4iLAotICAgICAgICAgICAgICAgICJcdThCNjZcdTU0NEE6IFBLQ1MxMiBcdTkxRDFcdTk0NzBcdTUxMzJcdTVCNThcdTVFQUJcdTRFMERcdTY1MkZcdTYzRjRcdTRFMERcdTU0MENcdTc2ODRcdTUxMzJcdTVCNThcdTVFQUJcdTU0OENcdTkxRDFcdTk0NzBcdTVCQzZcdTc4QkNcdTMwMDJcdTVGRkRcdTc1NjVcdTRGN0ZcdTc1MjhcdTgwMDVcdTYzMDdcdTVCOUFcdTc2ODQgezB9IFx1NTAzQ1x1MzAwMiJ9LAotICAgICAgICB7Ii5rZXlzdG9yZS5tdXN0LmJlLk5PTkUuaWYuc3RvcmV0eXBlLmlzLnswfSIsCi0gICAgICAgICAgICAgICAgIlx1NTk4Mlx1Njc5QyAtc3RvcmV0eXBlIFx1NzBCQSB7MH1cdUZGMENcdTUyNDcgLWtleXN0b3JlIFx1NUZDNVx1OTgwOFx1NzBCQSBOT05FIn0sCi0gICAgICAgIHsiVG9vLm1hbnkucmV0cmllcy5wcm9ncmFtLnRlcm1pbmF0ZWQiLAotICAgICAgICAgICAgICAgICAiXHU5MUNEXHU4QTY2XHU2QjIxXHU2NTc4XHU1OTJBXHU1OTFBXHVGRjBDXHU3QTBCXHU1RjBGXHU1REYyXHU3RDQyXHU2QjYyIn0sCi0gICAgICAgIHsiLnN0b3JlcGFzc3dkLmFuZC5rZXlwYXNzd2QuY29tbWFuZHMubm90LnN1cHBvcnRlZC5pZi5zdG9yZXR5cGUuaXMuezB9IiwKLSAgICAgICAgICAgICAgICAiXHU1OTgyXHU2NzlDIC1zdG9yZXR5cGUgXHU3MEJBIHswfVx1RkYwQ1x1NTI0N1x1NEUwRFx1NjUyRlx1NjNGNCAtc3RvcmVwYXNzd2QgXHU1NDhDIC1rZXlwYXNzd2QgXHU1NDdEXHU0RUU0In0sCi0gICAgICAgIHsiLmtleXBhc3N3ZC5jb21tYW5kcy5ub3Quc3VwcG9ydGVkLmlmLnN0b3JldHlwZS5pcy5QS0NTMTIiLAotICAgICAgICAgICAgICAgICJcdTU5ODJcdTY3OUMgLXN0b3JldHlwZSBcdTcwQkEgUEtDUzEyXHVGRjBDXHU1MjQ3XHU0RTBEXHU2NTJGXHU2M0Y0IC1rZXlwYXNzd2QgXHU1NDdEXHU0RUU0In0sCi0gICAgICAgIHsiLmtleXBhc3MuYW5kLm5ldy5jYW4ubm90LmJlLnNwZWNpZmllZC5pZi5zdG9yZXR5cGUuaXMuezB9IiwKLSAgICAgICAgICAgICAgICAiXHU1OTgyXHU2NzlDIC1zdG9yZXR5cGUgXHU3MEJBIHswfVx1RkYwQ1x1NTI0N1x1NEUwRFx1ODBGRFx1NjMwN1x1NUI5QSAta2V5cGFzcyBcdTU0OEMgLW5ldyJ9LAotICAgICAgICB7ImlmLnByb3RlY3RlZC5pcy5zcGVjaWZpZWQudGhlbi5zdG9yZXBhc3Mua2V5cGFzcy5hbmQubmV3Lm11c3Qubm90LmJlLnNwZWNpZmllZCIsCi0gICAgICAgICAgICAgICAgIlx1NTk4Mlx1Njc5Q1x1NjMwN1x1NUI5QSAtcHJvdGVjdGVkXHVGRjBDXHU1MjQ3XHU0RTBEXHU4MEZEXHU2MzA3XHU1QjlBIC1zdG9yZXBhc3NcdTMwMDEta2V5cGFzcyBcdTU0OEMgLW5ldyJ9LAotICAgICAgICB7ImlmLnNyY3Byb3RlY3RlZC5pcy5zcGVjaWZpZWQudGhlbi5zcmNzdG9yZXBhc3MuYW5kLnNyY2tleXBhc3MubXVzdC5ub3QuYmUuc3BlY2lmaWVkIiwKLSAgICAgICAgICAgICAgICAiXHU1OTgyXHU2NzlDXHU2MzA3XHU1QjlBIC1zcmNwcm90ZWN0ZWRcdUZGMENcdTUyNDdcdTRFMERcdTgwRkRcdTYzMDdcdTVCOUEgLXNyY3N0b3JlcGFzcyBcdTU0OEMgLXNyY2tleXBhc3MifSwKLSAgICAgICAgeyJpZi5rZXlzdG9yZS5pcy5ub3QucGFzc3dvcmQucHJvdGVjdGVkLnRoZW4uc3RvcmVwYXNzLmtleXBhc3MuYW5kLm5ldy5tdXN0Lm5vdC5iZS5zcGVjaWZpZWQiLAotICAgICAgICAgICAgICAgICJcdTU5ODJcdTY3OUNcdTkxRDFcdTk0NzBcdTUxMzJcdTVCNThcdTVFQUJcdTRFMERcdTUzRDdcdTVCQzZcdTc4QkNcdTRGRERcdThCNzdcdUZGMENcdTUyNDdcdTRFMERcdTgwRkRcdTYzMDdcdTVCOUEgLXN0b3JlcGFzc1x1MzAwMS1rZXlwYXNzIFx1NTQ4QyAtbmV3In0sCi0gICAgICAgIHsiaWYuc291cmNlLmtleXN0b3JlLmlzLm5vdC5wYXNzd29yZC5wcm90ZWN0ZWQudGhlbi5zcmNzdG9yZXBhc3MuYW5kLnNyY2tleXBhc3MubXVzdC5ub3QuYmUuc3BlY2lmaWVkIiwKLSAgICAgICAgICAgICAgICAiXHU1OTgyXHU2NzlDXHU0Rjg2XHU2RTkwXHU5MUQxXHU5NDcwXHU1MTMyXHU1QjU4XHU1RUFCXHU0RTBEXHU1M0Q3XHU1QkM2XHU3OEJDXHU0RkREXHU4Qjc3XHVGRjBDXHU1MjQ3XHU0RTBEXHU4MEZEXHU2MzA3XHU1QjlBIC1zcmNzdG9yZXBhc3MgXHU1NDhDIC1zcmNrZXlwYXNzIn0sCi0gICAgICAgIHsiSWxsZWdhbC5zdGFydGRhdGUudmFsdWUiLCAiXHU3MTIxXHU2NTQ4XHU3Njg0IHN0YXJ0ZGF0ZSBcdTUwM0MifSwKLSAgICAgICAgeyJWYWxpZGl0eS5tdXN0LmJlLmdyZWF0ZXIudGhhbi56ZXJvIiwKLSAgICAgICAgICAgICAgICAiXHU2NzA5XHU2NTQ4XHU2MDI3XHU1RkM1XHU5ODA4XHU1OTI3XHU2NUJDXHU5NkY2In0sCi0gICAgICAgIHsicHJvdk5hbWUubm90LmEucHJvdmlkZXIiLCAiezB9IFx1NEUwRFx1NjYyRlx1NEUwMFx1NTAwQlx1NjNEMFx1NEY5Qlx1ODAwNSJ9LAotICAgICAgICB7IlVzYWdlLmVycm9yLm5vLmNvbW1hbmQucHJvdmlkZWQiLCAiXHU3NTI4XHU2Q0Q1XHU5MzJGXHU4QUE0OiBcdTY3MkFcdTYzRDBcdTRGOUJcdTU0N0RcdTRFRTQifSwKLSAgICAgICAgeyJTb3VyY2Uua2V5c3RvcmUuZmlsZS5leGlzdHMuYnV0LmlzLmVtcHR5LiIsICJcdTRGODZcdTZFOTBcdTkxRDFcdTk0NzBcdTUxMzJcdTVCNThcdTVFQUJcdTZBOTRcdTY4NDhcdTVCNThcdTU3MjhcdUZGMENcdTRGNDZcdTcwQkFcdTdBN0E6ICJ9LAotICAgICAgICB7IlBsZWFzZS5zcGVjaWZ5LnNyY2tleXN0b3JlIiwgIlx1OEFDQlx1NjMwN1x1NUI5QSAtc3Jja2V5c3RvcmUifSwKLSAgICAgICAgeyJNdXN0Lm5vdC5zcGVjaWZ5LmJvdGgudi5hbmQucmZjLndpdGgubGlzdC5jb21tYW5kIiwKLSAgICAgICAgICAgICAgICAiICdsaXN0JyBcdTU0N0RcdTRFRTRcdTRFMERcdTgwRkRcdTU0MENcdTY2NDJcdTYzMDdcdTVCOUEgLXYgXHU1M0NBIC1yZmMifSwKLSAgICAgICAgeyJLZXkucGFzc3dvcmQubXVzdC5iZS5hdC5sZWFzdC42LmNoYXJhY3RlcnMiLAotICAgICAgICAgICAgICAgICJcdTkxRDFcdTk0NzBcdTVCQzZcdTc4QkNcdTVGQzVcdTk4MDhcdTgxRjNcdTVDMTFcdTcwQkEgNiBcdTUwMEJcdTVCNTdcdTUxNDMifSwKLSAgICAgICAgeyJOZXcucGFzc3dvcmQubXVzdC5iZS5hdC5sZWFzdC42LmNoYXJhY3RlcnMiLAotICAgICAgICAgICAgICAgICJcdTY1QjBcdTc2ODRcdTVCQzZcdTc4QkNcdTVGQzVcdTk4MDhcdTgxRjNcdTVDMTFcdTcwQkEgNiBcdTUwMEJcdTVCNTdcdTUxNDMifSwKLSAgICAgICAgeyJLZXlzdG9yZS5maWxlLmV4aXN0cy5idXQuaXMuZW1wdHkuIiwKLSAgICAgICAgICAgICAgICAiXHU5MUQxXHU5NDcwXHU1MTMyXHU1QjU4XHU1RUFCXHU2QTk0XHU2ODQ4XHU1QjU4XHU1NzI4XHVGRjBDXHU0RjQ2XHU3MEJBXHU3QTdBXHU3NjdEOiAifSwKLSAgICAgICAgeyJLZXlzdG9yZS5maWxlLmRvZXMubm90LmV4aXN0LiIsCi0gICAgICAgICAgICAgICAgIlx1OTFEMVx1OTQ3MFx1NTEzMlx1NUI1OFx1NUVBQlx1NkE5NFx1Njg0OFx1NEUwRFx1NUI1OFx1NTcyODogIn0sCi0gICAgICAgIHsiTXVzdC5zcGVjaWZ5LmRlc3RpbmF0aW9uLmFsaWFzIiwgIlx1NUZDNVx1OTgwOFx1NjMwN1x1NUI5QVx1NzZFRVx1NzY4NFx1NTczMFx1NTIyNVx1NTQwRCJ9LAotICAgICAgICB7Ik11c3Quc3BlY2lmeS5hbGlhcyIsICJcdTVGQzVcdTk4MDhcdTYzMDdcdTVCOUFcdTUyMjVcdTU0MEQifSwKLSAgICAgICAgeyJLZXlzdG9yZS5wYXNzd29yZC5tdXN0LmJlLmF0LmxlYXN0LjYuY2hhcmFjdGVycyIsCi0gICAgICAgICAgICAgICAgIlx1OTFEMVx1OTQ3MFx1NTEzMlx1NUI1OFx1NUVBQlx1NUJDNlx1NzhCQ1x1NUZDNVx1OTgwOFx1ODFGM1x1NUMxMVx1NzBCQSA2IFx1NTAwQlx1NUI1N1x1NTE0MyJ9LAotICAgICAgICB7IkVudGVyLmtleXN0b3JlLnBhc3N3b3JkLiIsICJcdThGMzhcdTUxNjVcdTkxRDFcdTk0NzBcdTUxMzJcdTVCNThcdTVFQUJcdTVCQzZcdTc4QkM6ICAifSwKLSAgICAgICAgeyJFbnRlci5zb3VyY2Uua2V5c3RvcmUucGFzc3dvcmQuIiwgIlx1OEFDQlx1OEYzOFx1NTE2NVx1NEY4Nlx1NkU5MFx1OTFEMVx1OTQ3MFx1NTEzMlx1NUI1OFx1NUVBQlx1NUJDNlx1NzhCQzogIn0sCi0gICAgICAgIHsiRW50ZXIuZGVzdGluYXRpb24ua2V5c3RvcmUucGFzc3dvcmQuIiwgIlx1OEFDQlx1OEYzOFx1NTE2NVx1NzZFRVx1NzY4NFx1NTczMFx1OTFEMVx1OTQ3MFx1NTEzMlx1NUI1OFx1NUVBQlx1NUJDNlx1NzhCQzogIn0sCi0gICAgICAgIHsiS2V5c3RvcmUucGFzc3dvcmQuaXMudG9vLnNob3J0Lm11c3QuYmUuYXQubGVhc3QuNi5jaGFyYWN0ZXJzIiwKLSAgICAgICAgICJcdTkxRDFcdTk0NzBcdTUxMzJcdTVCNThcdTVFQUJcdTVCQzZcdTc4QkNcdTU5MkFcdTc3RUQgLSBcdTVGQzVcdTk4MDhcdTgxRjNcdTVDMTFcdTcwQkEgNiBcdTUwMEJcdTVCNTdcdTUxNDMifSwKLSAgICAgICAgeyJVbmtub3duLkVudHJ5LlR5cGUiLCAiXHU0RTBEXHU2NjBFXHU3Njg0XHU5ODA1XHU3NkVFXHU5ODVFXHU1NzhCIn0sCi0gICAgICAgIHsiVG9vLm1hbnkuZmFpbHVyZXMuQWxpYXMubm90LmNoYW5nZWQiLCAiXHU1OTJBXHU1OTFBXHU5MzJGXHU4QUE0XHUzMDAyXHU2NzJBXHU4QjhBXHU2NkY0XHU1MjI1XHU1NDBEIn0sCi0gICAgICAgIHsiRW50cnkuZm9yLmFsaWFzLmFsaWFzLnN1Y2Nlc3NmdWxseS5pbXBvcnRlZC4iLAotICAgICAgICAgICAgICAgICAiXHU1REYyXHU2MjEwXHU1MjlGXHU1MzJGXHU1MTY1XHU1MjI1XHU1NDBEIHswfSBcdTc2ODRcdTk4MDVcdTc2RUVcdTMwMDIifSwKLSAgICAgICAgeyJFbnRyeS5mb3IuYWxpYXMuYWxpYXMubm90LmltcG9ydGVkLiIsICJcdTY3MkFcdTUzMkZcdTUxNjVcdTUyMjVcdTU0MEQgezB9IFx1NzY4NFx1OTgwNVx1NzZFRVx1MzAwMiJ9LAotICAgICAgICB7IlByb2JsZW0uaW1wb3J0aW5nLmVudHJ5LmZvci5hbGlhcy5hbGlhcy5leGNlcHRpb24uRW50cnkuZm9yLmFsaWFzLmFsaWFzLm5vdC5pbXBvcnRlZC4iLAotICAgICAgICAgICAgICAgICAiXHU1MzJGXHU1MTY1XHU1MjI1XHU1NDBEIHswfSBcdTc2ODRcdTk4MDVcdTc2RUVcdTY2NDJcdTUxRkFcdTczRkVcdTU1NEZcdTk4NEM6IHsxfVx1MzAwMlxuXHU2NzJBXHU1MzJGXHU1MTY1XHU1MjI1XHU1NDBEIHswfSBcdTc2ODRcdTk4MDVcdTc2RUVcdTMwMDIifSwKLSAgICAgICAgeyJJbXBvcnQuY29tbWFuZC5jb21wbGV0ZWQub2suZW50cmllcy5zdWNjZXNzZnVsbHkuaW1wb3J0ZWQuZmFpbC5lbnRyaWVzLmZhaWxlZC5vci5jYW5jZWxsZWQiLAotICAgICAgICAgICAgICAgICAiXHU1REYyXHU1QjhDXHU2MjEwXHU1MzJGXHU1MTY1XHU1NDdEXHU0RUU0OiBcdTYyMTBcdTUyOUZcdTUzMkZcdTUxNjUgezB9IFx1NTAwQlx1OTgwNVx1NzZFRVx1RkYwQ3sxfSBcdTUwMEJcdTk4MDVcdTc2RUVcdTU5MzFcdTY1NTdcdTYyMTZcdTVERjJcdTUzRDZcdTZEODgifSwKLSAgICAgICAgeyJXYXJuaW5nLk92ZXJ3cml0aW5nLmV4aXN0aW5nLmFsaWFzLmFsaWFzLmluLmRlc3RpbmF0aW9uLmtleXN0b3JlIiwKLSAgICAgICAgICAgICAgICAgIlx1OEI2Nlx1NTQ0QTogXHU2QjYzXHU1NzI4XHU4OTg2XHU1QkVCXHU3NkVFXHU3Njg0XHU1NzMwXHU5MUQxXHU5NDcwXHU1MTMyXHU1QjU4XHU1RUFCXHU0RTJEXHU3Njg0XHU3M0ZFXHU2NzA5XHU1MjI1XHU1NDBEIHswfSJ9LAotICAgICAgICB7IkV4aXN0aW5nLmVudHJ5LmFsaWFzLmFsaWFzLmV4aXN0cy5vdmVyd3JpdGUubm8uIiwKLSAgICAgICAgICAgICAgICAgIlx1NzNGRVx1NjcwOVx1OTgwNVx1NzZFRVx1NTIyNVx1NTQwRCB7MH0gXHU1QjU4XHU1NzI4XHVGRjBDXHU2NjJGXHU1NDI2XHU4OTg2XHU1QkVCXHVGRjFGW1x1NTQyNl06ICAifSwKLSAgICAgICAgeyJUb28ubWFueS5mYWlsdXJlcy50cnkubGF0ZXIiLCAiXHU1OTJBXHU1OTFBXHU5MzJGXHU4QUE0IC0gXHU4QUNCXHU3QTBEXHU1RjhDXHU1MThEXHU4QTY2In0sCi0gICAgICAgIHsiQ2VydGlmaWNhdGlvbi5yZXF1ZXN0LnN0b3JlZC5pbi5maWxlLmZpbGVuYW1lLiIsCi0gICAgICAgICAgICAgICAgIlx1OEE4RFx1OEI0OVx1ODk4MVx1NkM0Mlx1NTEzMlx1NUI1OFx1NTcyOFx1NkE5NFx1Njg0OCA8ezB9PiJ9LAotICAgICAgICB7IlN1Ym1pdC50aGlzLnRvLnlvdXIuQ0EiLCAiXHU1QzA3XHU2QjY0XHU5MDAxXHU1MUZBXHU4MUYzXHU2MEE4XHU3Njg0IENBIn0sCi0gICAgICAgIHsiaWYuYWxpYXMubm90LnNwZWNpZmllZC5kZXN0YWxpYXMuc3Jja2V5cGFzcy5hbmQuZGVzdGtleXBhc3MubXVzdC5ub3QuYmUuc3BlY2lmaWVkIiwKLSAgICAgICAgICAgICJcdTU5ODJcdTY3OUNcdTY3MkFcdTYzMDdcdTVCOUFcdTUyMjVcdTU0MERcdUZGMENcdTUyNDdcdTRFMERcdTgwRkRcdTYzMDdcdTVCOUEgZGVzdGFsaWFzXHUzMDAxc3Jja2V5cGFzcyBcdTUzQ0EgZGVzdGtleXBhc3MifSwKLSAgICAgICAgeyJDZXJ0aWZpY2F0ZS5zdG9yZWQuaW4uZmlsZS5maWxlbmFtZS4iLAotICAgICAgICAgICAgICAgICJcdTYxOTFcdThCNDlcdTUxMzJcdTVCNThcdTU3MjhcdTZBOTRcdTY4NDggPHswfT4ifSwKLSAgICAgICAgeyJDZXJ0aWZpY2F0ZS5yZXBseS53YXMuaW5zdGFsbGVkLmluLmtleXN0b3JlIiwKLSAgICAgICAgICAgICAgICAiXHU2MTkxXHU4QjQ5XHU1NkRFXHU4OTg2XHU1REYyXHU1Qjg5XHU4OEREXHU1NzI4XHU5MUQxXHU5NDcwXHU1MTMyXHU1QjU4XHU1RUFCXHU0RTJEIn0sCi0gICAgICAgIHsiQ2VydGlmaWNhdGUucmVwbHkud2FzLm5vdC5pbnN0YWxsZWQuaW4ua2V5c3RvcmUiLAotICAgICAgICAgICAgICAgICJcdTYxOTFcdThCNDlcdTU2REVcdTg5ODZcdTY3MkFcdTVCODlcdTg4RERcdTU3MjhcdTkxRDFcdTk0NzBcdTUxMzJcdTVCNThcdTVFQUJcdTRFMkQifSwKLSAgICAgICAgeyJDZXJ0aWZpY2F0ZS53YXMuYWRkZWQudG8ua2V5c3RvcmUiLAotICAgICAgICAgICAgICAgICJcdTYxOTFcdThCNDlcdTVERjJcdTY1QjBcdTU4OUVcdTgxRjNcdTkxRDFcdTk0NzBcdTUxMzJcdTVCNThcdTVFQUJcdTRFMkQifSwKLSAgICAgICAgeyJDZXJ0aWZpY2F0ZS53YXMubm90LmFkZGVkLnRvLmtleXN0b3JlIiwKLSAgICAgICAgICAgICAgICAiXHU2MTkxXHU4QjQ5XHU2NzJBXHU2NUIwXHU1ODlFXHU4MUYzXHU5MUQxXHU5NDcwXHU1MTMyXHU1QjU4XHU1RUFCXHU0RTJEIn0sCi0gICAgICAgIHsiLlN0b3Jpbmcua3NmbmFtZS4iLCAiW1x1NTEzMlx1NUI1OCB7MH1dIn0sCi0gICAgICAgIHsiYWxpYXMuaGFzLm5vLnB1YmxpYy5rZXkuY2VydGlmaWNhdGUuIiwKLSAgICAgICAgICAgICAgICAiezB9IFx1NkM5Mlx1NjcwOVx1NTE2Q1x1OTU4Qlx1OTFEMVx1OTQ3MCAoXHU2MTkxXHU4QjQ5KSJ9LAotICAgICAgICB7IkNhbm5vdC5kZXJpdmUuc2lnbmF0dXJlLmFsZ29yaXRobSIsCi0gICAgICAgICAgICAgICAgIlx1NzEyMVx1NkNENVx1NTNENlx1NUY5N1x1N0MzRFx1N0FFMFx1NkYxNFx1N0I5N1x1NkNENSJ9LAotICAgICAgICB7IkFsaWFzLmFsaWFzLmRvZXMubm90LmV4aXN0IiwKLSAgICAgICAgICAgICAgICAiXHU1MjI1XHU1NDBEIDx7MH0+IFx1NEUwRFx1NUI1OFx1NTcyOCJ9LAotICAgICAgICB7IkFsaWFzLmFsaWFzLmhhcy5uby5jZXJ0aWZpY2F0ZSIsCi0gICAgICAgICAgICAgICAgIlx1NTIyNVx1NTQwRCA8ezB9PiBcdTZDOTJcdTY3MDlcdTYxOTFcdThCNDkifSwKLSAgICAgICAgeyJLZXkucGFpci5ub3QuZ2VuZXJhdGVkLmFsaWFzLmFsaWFzLmFscmVhZHkuZXhpc3RzIiwKLSAgICAgICAgICAgICAgICAiXHU2QzkyXHU2NzA5XHU1RUZBXHU3QUNCXHU5MUQxXHU5NDcwXHU3RDQ0XHVGRjBDXHU1MjI1XHU1NDBEIDx7MH0+IFx1NURGMlx1N0Q5M1x1NUI1OFx1NTcyOCJ9LAotICAgICAgICB7IkdlbmVyYXRpbmcua2V5c2l6ZS5iaXQua2V5QWxnTmFtZS5rZXkucGFpci5hbmQuc2VsZi5zaWduZWQuY2VydGlmaWNhdGUuc2lnQWxnTmFtZS53aXRoLmEudmFsaWRpdHkub2YudmFsaWRhbGl0eS5kYXlzLmZvciIsCi0gICAgICAgICAgICAgICAgIlx1OTFERFx1NUMwRCB7NH0gXHU3NTIyXHU3NTFGXHU2NzA5XHU2NTQ4XHU2NzFGIHszfSBcdTU5MjlcdTc2ODQgezB9IFx1NEY0RFx1NTE0MyB7MX0gXHU5MUQxXHU5NDcwXHU3RDQ0XHU0RUU1XHU1M0NBXHU4MUVBXHU2MjExXHU3QzNEXHU3RjcyXHU2MTkxXHU4QjQ5ICh7Mn0pXG5cdCJ9LAotICAgICAgICB7IkVudGVyLmtleS5wYXNzd29yZC5mb3IuYWxpYXMuIiwgIlx1OEYzOFx1NTE2NSA8ezB9PiBcdTc2ODRcdTkxRDFcdTk0NzBcdTVCQzZcdTc4QkMifSwKLSAgICAgICAgeyIuUkVUVVJOLmlmLnNhbWUuYXMua2V5c3RvcmUucGFzc3dvcmQuIiwKLSAgICAgICAgICAgICAgICAiXHQoUkVUVVJOIFx1NTk4Mlx1Njc5Q1x1NTQ4Q1x1OTFEMVx1OTQ3MFx1NTEzMlx1NUI1OFx1NUVBQlx1NUJDNlx1NzhCQ1x1NzZGOFx1NTQwQyk6ICAifSwKLSAgICAgICAgeyJLZXkucGFzc3dvcmQuaXMudG9vLnNob3J0Lm11c3QuYmUuYXQubGVhc3QuNi5jaGFyYWN0ZXJzIiwKLSAgICAgICAgICAgICAgICAiXHU5MUQxXHU5NDcwXHU1QkM2XHU3OEJDXHU1OTJBXHU3N0VEIC0gXHU1RkM1XHU5ODA4XHU4MUYzXHU1QzExXHU3MEJBIDYgXHU1MDBCXHU1QjU3XHU1MTQzIn0sCi0gICAgICAgIHsiVG9vLm1hbnkuZmFpbHVyZXMua2V5Lm5vdC5hZGRlZC50by5rZXlzdG9yZSIsCi0gICAgICAgICAgICAgICAgIlx1NTkyQVx1NTkxQVx1OTMyRlx1OEFBNCAtIFx1OTFEMVx1OTQ3MFx1NjcyQVx1NjVCMFx1NTg5RVx1ODFGM1x1OTFEMVx1OTQ3MFx1NTEzMlx1NUI1OFx1NUVBQiJ9LAotICAgICAgICB7IkRlc3RpbmF0aW9uLmFsaWFzLmRlc3QuYWxyZWFkeS5leGlzdHMiLAotICAgICAgICAgICAgICAgICJcdTc2RUVcdTc2ODRcdTU3MzBcdTUyMjVcdTU0MEQgPHswfT4gXHU1REYyXHU3RDkzXHU1QjU4XHU1NzI4In0sCi0gICAgICAgIHsiUGFzc3dvcmQuaXMudG9vLnNob3J0Lm11c3QuYmUuYXQubGVhc3QuNi5jaGFyYWN0ZXJzIiwKLSAgICAgICAgICAgICAgICAiXHU1QkM2XHU3OEJDXHU1OTJBXHU3N0VEIC0gXHU1RkM1XHU5ODA4XHU4MUYzXHU1QzExXHU3MEJBIDYgXHU1MDBCXHU1QjU3XHU1MTQzIn0sCi0gICAgICAgIHsiVG9vLm1hbnkuZmFpbHVyZXMuS2V5LmVudHJ5Lm5vdC5jbG9uZWQiLAotICAgICAgICAgICAgICAgICJcdTU5MkFcdTU5MUFcdTkzMkZcdThBQTRcdTMwMDJcdTY3MkFcdTg5MDdcdTg4RkRcdTkxRDFcdTk0NzBcdTk4MDVcdTc2RUUifSwKLSAgICAgICAgeyJrZXkucGFzc3dvcmQuZm9yLmFsaWFzLiIsICI8ezB9PiBcdTc2ODRcdTkxRDFcdTk0NzBcdTVCQzZcdTc4QkMifSwKLSAgICAgICAgeyJLZXlzdG9yZS5lbnRyeS5mb3IuaWQuZ2V0TmFtZS5hbHJlYWR5LmV4aXN0cyIsCi0gICAgICAgICAgICAgICAgIjx7MH0+IFx1NzY4NFx1OTFEMVx1OTQ3MFx1NTEzMlx1NUI1OFx1NUVBQlx1OTgwNVx1NzZFRVx1NURGMlx1N0Q5M1x1NUI1OFx1NTcyOCJ9LAotICAgICAgICB7IkNyZWF0aW5nLmtleXN0b3JlLmVudHJ5LmZvci5pZC5nZXROYW1lLiIsCi0gICAgICAgICAgICAgICAgIlx1NUVGQVx1N0FDQiA8ezB9PiBcdTc2ODRcdTkxRDFcdTk0NzBcdTUxMzJcdTVCNThcdTVFQUJcdTk4MDVcdTc2RUUuLi4ifSwKLSAgICAgICAgeyJOby5lbnRyaWVzLmZyb20uaWRlbnRpdHkuZGF0YWJhc2UuYWRkZWQiLAotICAgICAgICAgICAgICAgICJcdTZDOTJcdTY3MDlcdTY1QjBcdTU4OUVcdTRGODZcdTgxRUFcdThCNThcdTUyMjVcdThDQzdcdTY1OTlcdTVFQUJcdTc2ODRcdTk4MDVcdTc2RUUifSwKLSAgICAgICAgeyJBbGlhcy5uYW1lLmFsaWFzIiwgIlx1NTIyNVx1NTQwRFx1NTQwRFx1N0EzMTogezB9In0sCi0gICAgICAgIHsiQ3JlYXRpb24uZGF0ZS5rZXlTdG9yZS5nZXRDcmVhdGlvbkRhdGUuYWxpYXMuIiwKLSAgICAgICAgICAgICAgICAiXHU1RUZBXHU3QUNCXHU2NUU1XHU2NzFGOiB7MCxkYXRlfSJ9LAotICAgICAgICB7ImFsaWFzLmtleVN0b3JlLmdldENyZWF0aW9uRGF0ZS5hbGlhcy4iLAotICAgICAgICAgICAgICAgICJ7MH0sIHsxLGRhdGV9LCAifSwKLSAgICAgICAgeyJhbGlhcy4iLCAiezB9LCAifSwKLSAgICAgICAgeyJFbnRyeS50eXBlLnR5cGUuIiwgIlx1OTgwNVx1NzZFRVx1OTg1RVx1NTc4QjogezB9In0sCi0gICAgICAgIHsiQ2VydGlmaWNhdGUuY2hhaW4ubGVuZ3RoLiIsICJcdTYxOTFcdThCNDlcdTkzQzhcdTk1NzdcdTVFQTY6ICJ9LAotICAgICAgICB7IkNlcnRpZmljYXRlLmkuMS4iLCAiXHU2MTkxXHU4QjQ5IFt7MCxudW1iZXIsaW50ZWdlcn1dOiJ9LAotICAgICAgICB7IkNlcnRpZmljYXRlLmZpbmdlcnByaW50LlNIQTEuIiwgIlx1NjE5MVx1OEI0OVx1NjMwN1x1N0QwQiAoU0hBMSk6ICJ9LAotICAgICAgICB7IktleXN0b3JlLnR5cGUuIiwgIlx1OTFEMVx1OTQ3MFx1NTEzMlx1NUI1OFx1NUVBQlx1OTg1RVx1NTc4QjogIn0sCi0gICAgICAgIHsiS2V5c3RvcmUucHJvdmlkZXIuIiwgIlx1OTFEMVx1OTQ3MFx1NTEzMlx1NUI1OFx1NUVBQlx1NjNEMFx1NEY5Qlx1ODAwNTogIn0sCi0gICAgICAgIHsiWW91ci5rZXlzdG9yZS5jb250YWlucy5rZXlTdG9yZS5zaXplLmVudHJ5IiwKLSAgICAgICAgICAgICAgICAiXHU2MEE4XHU3Njg0XHU5MUQxXHU5NDcwXHU1MTMyXHU1QjU4XHU1RUFCXHU1MzA1XHU1NDJCIHswLG51bWJlcixpbnRlZ2VyfSBcdTk4MDVcdTc2RUUifSwKLSAgICAgICAgeyJZb3VyLmtleXN0b3JlLmNvbnRhaW5zLmtleVN0b3JlLnNpemUuZW50cmllcyIsCi0gICAgICAgICAgICAgICAgIlx1NjBBOFx1NzY4NFx1OTFEMVx1OTQ3MFx1NTEzMlx1NUI1OFx1NUVBQlx1NTMwNVx1NTQyQiB7MCxudW1iZXIsaW50ZWdlcn0gXHU5ODA1XHU3NkVFIn0sCi0gICAgICAgIHsiRmFpbGVkLnRvLnBhcnNlLmlucHV0IiwgIlx1NzEyMVx1NkNENVx1NTI1Nlx1Njc5MFx1OEYzOFx1NTE2NSJ9LAotICAgICAgICB7IkVtcHR5LmlucHV0IiwgIlx1N0E3QVx1OEYzOFx1NTE2NSJ9LAotICAgICAgICB7Ik5vdC5YLjUwOS5jZXJ0aWZpY2F0ZSIsICJcdTk3NUUgWC41MDkgXHU2MTkxXHU4QjQ5In0sCi0gICAgICAgIHsiYWxpYXMuaGFzLm5vLnB1YmxpYy5rZXkiLCAiezB9IFx1NzEyMVx1NTE2Q1x1OTU4Qlx1OTFEMVx1OTQ3MCJ9LAotICAgICAgICB7ImFsaWFzLmhhcy5uby5YLjUwOS5jZXJ0aWZpY2F0ZSIsICJ7MH0gXHU3MTIxIFguNTA5IFx1NjE5MVx1OEI0OSJ9LAotICAgICAgICB7Ik5ldy5jZXJ0aWZpY2F0ZS5zZWxmLnNpZ25lZC4iLCAiXHU2NUIwXHU2MTkxXHU4QjQ5IChcdTgxRUFcdTYyMTFcdTdDM0RcdTdGNzIpOiAifSwKLSAgICAgICAgeyJSZXBseS5oYXMubm8uY2VydGlmaWNhdGVzIiwgIlx1NTZERVx1ODk4Nlx1NEUwRFx1NTQyQlx1NjE5MVx1OEI0OSJ9LAotICAgICAgICB7IkNlcnRpZmljYXRlLm5vdC5pbXBvcnRlZC5hbGlhcy5hbGlhcy5hbHJlYWR5LmV4aXN0cyIsCi0gICAgICAgICAgICAgICAgIlx1NjE5MVx1OEI0OVx1NjcyQVx1OEYzOFx1NTE2NVx1RkYwQ1x1NTIyNVx1NTQwRCA8ezB9PiBcdTVERjJcdTdEOTNcdTVCNThcdTU3MjgifSwKLSAgICAgICAgeyJJbnB1dC5ub3QuYW4uWC41MDkuY2VydGlmaWNhdGUiLCAiXHU4RjM4XHU1MTY1XHU3Njg0XHU0RTBEXHU2NjJGIFguNTA5IFx1NjE5MVx1OEI0OSJ9LAotICAgICAgICB7IkNlcnRpZmljYXRlLmFscmVhZHkuZXhpc3RzLmluLmtleXN0b3JlLnVuZGVyLmFsaWFzLnRydXN0YWxpYXMuIiwKLSAgICAgICAgICAgICAgICAiXHU5MUQxXHU5NDcwXHU1MTMyXHU1QjU4XHU1RUFCXHU0RTJEXHU3Njg0IDx7MH0+IFx1NTIyNVx1NTQwRFx1NEU0Qlx1NEUwQlx1RkYwQ1x1NjE5MVx1OEI0OVx1NURGMlx1N0Q5M1x1NUI1OFx1NTcyOCJ9LAotICAgICAgICB7IkRvLnlvdS5zdGlsbC53YW50LnRvLmFkZC5pdC5uby4iLAotICAgICAgICAgICAgICAgICJcdTYwQThcdTRFQ0RcdTcxMzZcdTYwRjNcdTg5ODFcdTVDMDdcdTRFNEJcdTY1QjBcdTU4OUVcdTU1Q0VcdUZGMUYgW1x1NTQyNl06ICAifSwKLSAgICAgICAgeyJDZXJ0aWZpY2F0ZS5hbHJlYWR5LmV4aXN0cy5pbi5zeXN0ZW0ud2lkZS5DQS5rZXlzdG9yZS51bmRlci5hbGlhcy50cnVzdGFsaWFzLiIsCi0gICAgICAgICAgICAgICAgIlx1NjU3NFx1NTAwQlx1N0NGQlx1N0Q3MSBDQSBcdTkxRDFcdTk0NzBcdTUxMzJcdTVCNThcdTVFQUJcdTRFMkRcdTc2ODQgPHswfT4gXHU1MjI1XHU1NDBEXHU0RTRCXHU0RTBCXHVGRjBDXHU2MTkxXHU4QjQ5XHU1REYyXHU3RDkzXHU1QjU4XHU1NzI4In0sCi0gICAgICAgIHsiRG8ueW91LnN0aWxsLndhbnQudG8uYWRkLml0LnRvLnlvdXIub3duLmtleXN0b3JlLm5vLiIsCi0gICAgICAgICAgICAgICAgIlx1NjBBOFx1NEVDRFx1NzEzNlx1NjBGM1x1ODk4MVx1NUMwN1x1NEU0Qlx1NjVCMFx1NTg5RVx1ODFGM1x1ODFFQVx1NURGMVx1NzY4NFx1OTFEMVx1OTQ3MFx1NTEzMlx1NUI1OFx1NUVBQlx1NTVDRVx1RkYxRiBbXHU1NDI2XTogICJ9LAotICAgICAgICB7IlRydXN0LnRoaXMuY2VydGlmaWNhdGUubm8uIiwgIlx1NEZFMVx1NEVGQlx1OTAxOVx1NTAwQlx1NjE5MVx1OEI0OVx1RkYxRiBbXHU1NDI2XTogICJ9LAotICAgICAgICB7IllFUyIsICJcdTY2MkYifSwKLSAgICAgICAgeyJOZXcucHJvbXB0LiIsICJcdTY1QjAgezB9OiAifSwKLSAgICAgICAgeyJQYXNzd29yZHMubXVzdC5kaWZmZXIiLCAiXHU1RkM1XHU5ODA4XHU2NjJGXHU0RTBEXHU1NDBDXHU3Njg0XHU1QkM2XHU3OEJDIn0sCi0gICAgICAgIHsiUmUuZW50ZXIubmV3LnByb21wdC4iLCAiXHU5MUNEXHU2NUIwXHU4RjM4XHU1MTY1XHU2NUIwIHswfTogIn0sCi0gICAgICAgIHsiUmUuZW50ZXIubmV3LnBhc3N3b3JkLiIsICJcdTkxQ0RcdTY1QjBcdThGMzhcdTUxNjVcdTY1QjBcdTVCQzZcdTc4QkM6ICJ9LAotICAgICAgICB7IlRoZXkuZG9uLnQubWF0Y2guVHJ5LmFnYWluIiwgIlx1NUI4M1x1NTAxMVx1NEUwRFx1NzZGOFx1N0IyNlx1MzAwMlx1OEFDQlx1OTFDRFx1OEE2NiJ9LAotICAgICAgICB7IkVudGVyLnByb21wdC5hbGlhcy5uYW1lLiIsICJcdThGMzhcdTUxNjUgezB9IFx1NTIyNVx1NTQwRFx1NTQwRFx1N0EzMTogICJ9LAotICAgICAgICB7IkVudGVyLm5ldy5hbGlhcy5uYW1lLlJFVFVSTi50by5jYW5jZWwuaW1wb3J0LmZvci50aGlzLmVudHJ5LiIsCi0gICAgICAgICAgICAgICAgICJcdThBQ0JcdThGMzhcdTUxNjVcdTY1QjBcdTc2ODRcdTUyMjVcdTU0MERcdTU0MERcdTdBMzFcdChSRVRVUk4gXHU0RUU1XHU1M0Q2XHU2RDg4XHU1MzJGXHU1MTY1XHU2QjY0XHU5ODA1XHU3NkVFKToifSwKLSAgICAgICAgeyJFbnRlci5hbGlhcy5uYW1lLiIsICJcdThGMzhcdTUxNjVcdTUyMjVcdTU0MERcdTU0MERcdTdBMzE6ICAifSwKLSAgICAgICAgeyIuUkVUVVJOLmlmLnNhbWUuYXMuZm9yLm90aGVyQWxpYXMuIiwKLSAgICAgICAgICAgICAgICAiXHQoUkVUVVJOIFx1NTk4Mlx1Njc5Q1x1NTQ4QyA8ezB9PiBcdTc2ODRcdTc2RjhcdTU0MEMpIn0sCi0gICAgICAgIHsiLlBBVFRFUk4ucHJpbnRYNTA5Q2VydCIsCi0gICAgICAgICAgICAgICAgIlx1NjRDMVx1NjcwOVx1ODAwNTogezB9XG5cdTc2N0NcdTUxRkFcdTgwMDU6IHsxfVxuXHU1RThGXHU4NjVGOiB7Mn1cblx1NjcwOVx1NjU0OFx1NjcxRlx1ODFFQTogezN9IFx1NTIzMDogezR9XG5cdTYxOTFcdThCNDlcdTYzMDdcdTdEMEI6XG5cdCBNRDU6ICB7NX1cblx0IFNIQTE6IHs2fVxuXHQgU0hBMjU2OiB7N31cblx0IFx1N0MzRFx1N0FFMFx1NkYxNFx1N0I5N1x1NkNENVx1NTQwRFx1N0EzMTogezh9XG5cdCBcdTcyNDhcdTY3MkM6IHs5fSJ9LAotICAgICAgICB7IldoYXQuaXMueW91ci5maXJzdC5hbmQubGFzdC5uYW1lLiIsCi0gICAgICAgICAgICAgICAgIlx1NjBBOFx1NzY4NFx1NTQwRFx1NUI1N1x1ODIwN1x1NTlEM1x1NkMwRlx1NzBCQVx1NEY1NVx1RkYxRiJ9LAotICAgICAgICB7IldoYXQuaXMudGhlLm5hbWUub2YueW91ci5vcmdhbml6YXRpb25hbC51bml0LiIsCi0gICAgICAgICAgICAgICAgIlx1NjBBOFx1NzY4NFx1N0Q0NFx1N0U1NFx1NTVBRVx1NEY0RFx1NTQwRFx1N0EzMVx1NzBCQVx1NEY1NVx1RkYxRiJ9LAotICAgICAgICB7IldoYXQuaXMudGhlLm5hbWUub2YueW91ci5vcmdhbml6YXRpb24uIiwKLSAgICAgICAgICAgICAgICAiXHU2MEE4XHU3Njg0XHU3RDQ0XHU3RTU0XHU1NDBEXHU3QTMxXHU3MEJBXHU0RjU1XHVGRjFGIn0sCi0gICAgICAgIHsiV2hhdC5pcy50aGUubmFtZS5vZi55b3VyLkNpdHkub3IuTG9jYWxpdHkuIiwKLSAgICAgICAgICAgICAgICAiXHU2MEE4XHU2MjQwXHU1NzI4XHU3Njg0XHU1N0NFXHU1RTAyXHU2MjE2XHU1NzMwXHU1MzQwXHU1NDBEXHU3QTMxXHU3MEJBXHU0RjU1XHVGRjFGIn0sCi0gICAgICAgIHsiV2hhdC5pcy50aGUubmFtZS5vZi55b3VyLlN0YXRlLm9yLlByb3ZpbmNlLiIsCi0gICAgICAgICAgICAgICAgIlx1NjBBOFx1NjI0MFx1NTcyOFx1NzY4NFx1NURERVx1NTNDQVx1NzcwMVx1NEVGRFx1NTQwRFx1N0EzMVx1NzBCQVx1NEY1NVx1RkYxRiJ9LAotICAgICAgICB7IldoYXQuaXMudGhlLnR3by5sZXR0ZXIuY291bnRyeS5jb2RlLmZvci50aGlzLnVuaXQuIiwKLSAgICAgICAgICAgICAgICAiXHU2QjY0XHU1NUFFXHU0RjREXHU3Njg0XHU1MTY5XHU1MDBCXHU1QjU3XHU2QkNEXHU1NzBCXHU1MjI1XHU0RUUzXHU3OEJDXHU3MEJBXHU0RjU1XHVGRjFGIn0sCi0gICAgICAgIHsiSXMubmFtZS5jb3JyZWN0LiIsICJ7MH0gXHU2QjYzXHU3OEJBXHU1NUNFXHVGRjFGIn0sCi0gICAgICAgIHsibm8iLCAiXHU1NDI2In0sCi0gICAgICAgIHsieWVzIiwgIlx1NjYyRiJ9LAotICAgICAgICB7InkiLCAieSJ9LAotICAgICAgICB7Ii5kZWZhdWx0VmFsdWUuIiwgIiAgW3swfV06ICAifSwKLSAgICAgICAgeyJBbGlhcy5hbGlhcy5oYXMubm8ua2V5IiwKLSAgICAgICAgICAgICAgICAiXHU1MjI1XHU1NDBEIDx7MH0+IFx1NkM5Mlx1NjcwOVx1OTFEMVx1OTQ3MCJ9LAotICAgICAgICB7IkFsaWFzLmFsaWFzLnJlZmVyZW5jZXMuYW4uZW50cnkudHlwZS50aGF0LmlzLm5vdC5hLnByaXZhdGUua2V5LmVudHJ5LlRoZS5rZXljbG9uZS5jb21tYW5kLm9ubHkuc3VwcG9ydHMuY2xvbmluZy5vZi5wcml2YXRlLmtleSIsCi0gICAgICAgICAgICAgICAgICJcdTUyMjVcdTU0MEQgPHswfT4gXHU2MjQwXHU1M0MzXHU3MTY3XHU3Njg0XHU5ODA1XHU3NkVFXHU0RTBEXHU2NjJGXHU3OUMxXHU1QkM2XHU5MUQxXHU5NDcwXHU5ODVFXHU1NzhCXHUzMDAyLWtleWNsb25lIFx1NTQ3RFx1NEVFNFx1NTBDNVx1NjUyRlx1NjNGNFx1NzlDMVx1NUJDNlx1OTFEMVx1OTQ3MFx1OTgwNVx1NzZFRVx1NzY4NFx1ODkwN1x1ODhGRCJ9LAotCi0gICAgICAgIHsiLldBUk5JTkcuV0FSTklORy5XQVJOSU5HLiIsCi0gICAgICAgICAgICAiKioqKioqKioqKioqKioqKiogIFx1OEI2Nlx1NTQ0QSBcdThCNjZcdTU0NEEgXHU4QjY2XHU1NDRBICAqKioqKioqKioqKioqKioqKiJ9LAotICAgICAgICB7IlNpZ25lci5kLiIsICJcdTdDM0RcdTdGNzJcdTgwMDUgIyVkOiJ9LAotICAgICAgICB7IlRpbWVzdGFtcC4iLCAiXHU2NjQyXHU2MjMzOiJ9LAotICAgICAgICB7IlNpZ25hdHVyZS4iLCAiXHU3QzNEXHU3QUUwOiJ9LAotICAgICAgICB7IkNSTHMuIiwgIkNSTDoifSwKLSAgICAgICAgeyJDZXJ0aWZpY2F0ZS5vd25lci4iLCAiXHU2MTkxXHU4QjQ5XHU2NEMxXHU2NzA5XHU4MDA1OiAifSwKLSAgICAgICAgeyJOb3QuYS5zaWduZWQuamFyLmZpbGUiLCAiXHU0RTBEXHU2NjJGXHU3QzNEXHU3RjcyXHU3Njg0IGphciBcdTZBOTRcdTY4NDgifSwKLSAgICAgICAgeyJOby5jZXJ0aWZpY2F0ZS5mcm9tLnRoZS5TU0wuc2VydmVyIiwKLSAgICAgICAgICAgICAgICAiXHU2QzkyXHU2NzA5XHU0Rjg2XHU4MUVBIFNTTCBcdTRGM0FcdTY3MERcdTU2NjhcdTc2ODRcdTYxOTFcdThCNDkifSwKLQotICAgICAgICB7Ii5UaGUuaW50ZWdyaXR5Lm9mLnRoZS5pbmZvcm1hdGlvbi5zdG9yZWQuaW4ueW91ci5rZXlzdG9yZS4iLAotICAgICAgICAgICAgIiogXHU1QzFBXHU2NzJBXHU5QTU3XHU4QjQ5XHU1MTMyXHU1QjU4XHU2NUJDXHU5MUQxXHU5NDcwXHU1MTMyXHU1QjU4XHU1RUFCXHU0RTJEXHU4Q0M3XHU4QTBBICAqXG4qIFx1NzY4NFx1NUI4Q1x1NjU3NFx1NjAyN1x1RkYwMVx1ODJFNVx1ODk4MVx1OUE1N1x1OEI0OVx1NTE3Nlx1NUI4Q1x1NjU3NFx1NjAyN1x1RkYwQypcbiogXHU2MEE4XHU1RkM1XHU5ODA4XHU2M0QwXHU0RjlCXHU2MEE4XHU3Njg0XHU5MUQxXHU5NDcwXHU1MTMyXHU1QjU4XHU1RUFCXHU1QkM2XHU3OEJDXHUzMDAyICAgICAgICAgICAgICAgICAgKiJ9LAotICAgICAgICB7Ii5UaGUuaW50ZWdyaXR5Lm9mLnRoZS5pbmZvcm1hdGlvbi5zdG9yZWQuaW4udGhlLnNyY2tleXN0b3JlLiIsCi0gICAgICAgICAgICAiKiBcdTVDMUFcdTY3MkFcdTlBNTdcdThCNDlcdTUxMzJcdTVCNThcdTY1QkMgc3Jja2V5c3RvcmUgXHU0RTJEXHU4Q0M3XHU4QTBBKlxuKiBcdTc2ODRcdTVCOENcdTY1NzRcdTYwMjdcdUZGMDFcdTgyRTVcdTg5ODFcdTlBNTdcdThCNDlcdTUxNzZcdTVCOENcdTY1NzRcdTYwMjdcdUZGMENcdTYwQThcdTVGQzVcdTk4MDggKlxuKiBcdTYzRDBcdTRGOUIgc3Jja2V5c3RvcmUgXHU1QkM2XHU3OEJDXHUzMDAyICAgICAgICAgICoifSwKLQotICAgICAgICB7IkNlcnRpZmljYXRlLnJlcGx5LmRvZXMubm90LmNvbnRhaW4ucHVibGljLmtleS5mb3IuYWxpYXMuIiwKLSAgICAgICAgICAgICAgICAiXHU2MTkxXHU4QjQ5XHU1NkRFXHU4OTg2XHU0RTI2XHU2NzJBXHU1MzA1XHU1NDJCIDx7MH0+IFx1NzY4NFx1NTE2Q1x1OTU4Qlx1OTFEMVx1OTQ3MCJ9LAotICAgICAgICB7IkluY29tcGxldGUuY2VydGlmaWNhdGUuY2hhaW4uaW4ucmVwbHkiLAotICAgICAgICAgICAgICAgICJcdTU2REVcdTg5ODZcdTY2NDJcdTc2ODRcdTYxOTFcdThCNDlcdTkzQzhcdTRFMERcdTVCOENcdTY1NzQifSwKLSAgICAgICAgeyJDZXJ0aWZpY2F0ZS5jaGFpbi5pbi5yZXBseS5kb2VzLm5vdC52ZXJpZnkuIiwKLSAgICAgICAgICAgICAgICAiXHU1NkRFXHU4OTg2XHU2NjQyXHU3Njg0XHU2MTkxXHU4QjQ5XHU5M0M4XHU2NzJBXHU5QTU3XHU4QjQ5OiAifSwKLSAgICAgICAgeyJUb3AubGV2ZWwuY2VydGlmaWNhdGUuaW4ucmVwbHkuIiwKLSAgICAgICAgICAgICAgICAiXHU1NkRFXHU4OTg2XHU2NjQyXHU3Njg0XHU2NzAwXHU5QUQ4XHU3RDFBXHU2MTkxXHU4QjQ5OlxcbiJ9LAotICAgICAgICB7Ii5pcy5ub3QudHJ1c3RlZC4iLCAiLi4uIFx1NjYyRlx1NEUwRFx1ODhBQlx1NEZFMVx1NEVGQlx1NzY4NFx1MzAwMiJ9LAotICAgICAgICB7Ikluc3RhbGwucmVwbHkuYW55d2F5Lm5vLiIsICJcdTkwODRcdTY2MkZcdTg5ODFcdTVCODlcdTg4RERcdTU2REVcdTg5ODZcdUZGMUYgW1x1NTQyNl06ICAifSwKLSAgICAgICAgeyJOTyIsICJcdTU0MjYifSwKLSAgICAgICAgeyJQdWJsaWMua2V5cy5pbi5yZXBseS5hbmQua2V5c3RvcmUuZG9uLnQubWF0Y2giLAotICAgICAgICAgICAgICAgICJcdTU2REVcdTg5ODZcdTY2NDJcdTc2ODRcdTUxNkNcdTk1OEJcdTkxRDFcdTk0NzBcdTgyMDdcdTkxRDFcdTk0NzBcdTUxMzJcdTVCNThcdTVFQUJcdTRFMERcdTdCMjYifSwKLSAgICAgICAgeyJDZXJ0aWZpY2F0ZS5yZXBseS5hbmQuY2VydGlmaWNhdGUuaW4ua2V5c3RvcmUuYXJlLmlkZW50aWNhbCIsCi0gICAgICAgICAgICAgICAgIlx1NjE5MVx1OEI0OVx1NTZERVx1ODk4Nlx1ODIwN1x1OTFEMVx1OTQ3MFx1NTEzMlx1NUI1OFx1NUVBQlx1NEUyRFx1NzY4NFx1NjE5MVx1OEI0OVx1NjYyRlx1NzZGOFx1NTQwQ1x1NzY4NCJ9LAotICAgICAgICB7IkZhaWxlZC50by5lc3RhYmxpc2guY2hhaW4uZnJvbS5yZXBseSIsCi0gICAgICAgICAgICAgICAgIlx1NzEyMVx1NkNENVx1NUY5RVx1NTZERVx1ODk4Nlx1NEUyRFx1NUMwN1x1OTNDOFx1NUVGQVx1N0FDQlx1OEQ3N1x1NEY4NiJ9LAotICAgICAgICB7Im4iLCAibiJ9LAotICAgICAgICB7Ildyb25nLmFuc3dlci50cnkuYWdhaW4iLCAiXHU5MzJGXHU4QUE0XHU3Njg0XHU3QjU0XHU2ODQ4XHVGRjBDXHU4QUNCXHU1MThEXHU4QTY2XHU0RTAwXHU2QjIxIn0sCi0gICAgICAgIHsiU2VjcmV0LmtleS5ub3QuZ2VuZXJhdGVkLmFsaWFzLmFsaWFzLmFscmVhZHkuZXhpc3RzIiwKLSAgICAgICAgICAgICAgICAiXHU2NzJBXHU3NTIyXHU3NTFGXHU3OUQ4XHU1QkM2XHU5MUQxXHU5NDcwXHVGRjBDXHU1MjI1XHU1NDBEIDx7MH0+IFx1NURGMlx1NUI1OFx1NTcyOCJ9LAotICAgICAgICB7IlBsZWFzZS5wcm92aWRlLmtleXNpemUuZm9yLnNlY3JldC5rZXkuZ2VuZXJhdGlvbiIsCi0gICAgICAgICAgICAgICAgIlx1OEFDQlx1NjNEMFx1NEY5QiAta2V5c2l6ZSBcdTRFRTVcdTc1MjJcdTc1MUZcdTc5RDhcdTVCQzZcdTkxRDFcdTk0NzAifSwKLQotICAgICAgICB7IkV4dGVuc2lvbnMuIiwgIlx1NjRGNFx1NTE0NVx1NTk1N1x1NEVGNjogIn0sCi0gICAgICAgIHsiLkVtcHR5LnZhbHVlLiIsICIoXHU3QTdBXHU3NjdEXHU1MDNDKSJ9LAotICAgICAgICB7IkV4dGVuc2lvbi5SZXF1ZXN0LiIsICJcdTY0RjRcdTUxNDVcdTU5NTdcdTRFRjZcdTg5ODFcdTZDNDI6In0sCi0gICAgICAgIHsiUEtDUy4xMC5DZXJ0aWZpY2F0ZS5SZXF1ZXN0LlZlcnNpb24uMS4wLlN1YmplY3Qucy5QdWJsaWMuS2V5LnMuZm9ybWF0LnMua2V5LiIsCi0gICAgICAgICAgICAgICAgIlBLQ1MgIzEwIFx1NjE5MVx1OEI0OVx1ODk4MVx1NkM0MiAoXHU3MjQ4XHU2NzJDIDEuMClcblx1NEUzQlx1OUFENDogJXNcblx1NTE2Q1x1NzUyOFx1OTFEMVx1OTQ3MDogJXMgXHU2ODNDXHU1RjBGICVzIFx1OTFEMVx1OTQ3MFxuIn0sCi0gICAgICAgIHsiVW5rbm93bi5rZXlVc2FnZS50eXBlLiIsICJcdTRFMERcdTY2MEVcdTc2ODQga2V5VXNhZ2UgXHU5ODVFXHU1NzhCOiAifSwKLSAgICAgICAgeyJVbmtub3duLmV4dGVuZGVka2V5VXNhZ2UudHlwZS4iLCAiXHU0RTBEXHU2NjBFXHU3Njg0IGV4dGVuZGVka2V5VXNhZ2UgXHU5ODVFXHU1NzhCOiAifSwKLSAgICAgICAgeyJVbmtub3duLkFjY2Vzc0Rlc2NyaXB0aW9uLnR5cGUuIiwgIlx1NEUwRFx1NjYwRVx1NzY4NCBBY2Nlc3NEZXNjcmlwdGlvbiBcdTk4NUVcdTU3OEI6ICJ9LAotICAgICAgICB7IlVucmVjb2duaXplZC5HZW5lcmFsTmFtZS50eXBlLiIsICJcdTcxMjFcdTZDRDVcdThGQThcdThCNThcdTc2ODQgR2VuZXJhbE5hbWUgXHU5ODVFXHU1NzhCOiAifSwKLSAgICAgICAgeyJUaGlzLmV4dGVuc2lvbi5jYW5ub3QuYmUubWFya2VkLmFzLmNyaXRpY2FsLiIsCi0gICAgICAgICAgICAgICAgICJcdTZCNjRcdTY0RjRcdTUxNDVcdTU5NTdcdTRFRjZcdTcxMjFcdTZDRDVcdTZBMTlcdTc5M0FcdTcwQkFcdTk1RENcdTkzNzVcdTMwMDIifSwKLSAgICAgICAgeyJPZGQubnVtYmVyLm9mLmhleC5kaWdpdHMuZm91bmQuIiwgIlx1NjI3RVx1NTIzMFx1NTM0MVx1NTE2RFx1OTAzMlx1NEY0RFx1NjU3OFx1NUI1N1x1NzY4NFx1NTk0N1x1NjU3ODogIn0sCi0gICAgICAgIHsiVW5rbm93bi5leHRlbnNpb24udHlwZS4iLCAiXHU0RTBEXHU2NjBFXHU3Njg0XHU2NEY0XHU1MTQ1XHU1OTU3XHU0RUY2XHU5ODVFXHU1NzhCOiAifSwKLSAgICAgICAgeyJjb21tYW5kLnswfS5pcy5hbWJpZ3VvdXMuIiwgIlx1NTQ3RFx1NEVFNCB7MH0gXHU0RTBEXHU2NjBFXHU3OEJBOiJ9LAotCi0gICAgICAgIC8vIHBvbGljeXRvb2wKLSAgICAgICAgeyJXYXJuaW5nLkEucHVibGljLmtleS5mb3IuYWxpYXMuc2lnbmVycy5pLmRvZXMubm90LmV4aXN0Lk1ha2Uuc3VyZS5hLktleVN0b3JlLmlzLnByb3Blcmx5LmNvbmZpZ3VyZWQuIiwKLSAgICAgICAgICAgICAgICAiXHU4QjY2XHU1NDRBOiBcdTUyMjVcdTU0MEQgezB9IFx1NzY4NFx1NTE2Q1x1OTU4Qlx1OTFEMVx1OTQ3MFx1NEUwRFx1NUI1OFx1NTcyOFx1MzAwMlx1OEFDQlx1NzhCQVx1NUI5QVx1OTFEMVx1OTQ3MFx1NTEzMlx1NUI1OFx1NUVBQlx1OTE0RFx1N0Y2RVx1NkI2M1x1NzhCQVx1MzAwMiJ9LAotICAgICAgICB7Ildhcm5pbmcuQ2xhc3Mubm90LmZvdW5kLmNsYXNzIiwgIlx1OEI2Nlx1NTQ0QTogXHU2MjdFXHU0RTBEXHU1MjMwXHU5ODVFXHU1MjI1IHswfSJ9LAotICAgICAgICB7Ildhcm5pbmcuSW52YWxpZC5hcmd1bWVudC5zLmZvci5jb25zdHJ1Y3Rvci5hcmciLAotICAgICAgICAgICAgICAgICJcdThCNjZcdTU0NEE6IFx1NzEyMVx1NjU0OFx1NzY4NFx1NUVGQVx1NjlDQlx1NUI1MFx1NUYxNVx1NjU3ODogezB9In0sCi0gICAgICAgIHsiSWxsZWdhbC5QcmluY2lwYWwuVHlwZS50eXBlIiwgIlx1NzEyMVx1NjU0OFx1NzY4NCBQcmluY2lwYWwgXHU5ODVFXHU1NzhCOiB7MH0ifSwKLSAgICAgICAgeyJJbGxlZ2FsLm9wdGlvbi5vcHRpb24iLCAiXHU3MTIxXHU2NTQ4XHU3Njg0XHU5MDc4XHU5ODA1OiB7MH0ifSwKLSAgICAgICAgeyJVc2FnZS5wb2xpY3l0b29sLm9wdGlvbnMuIiwgIlx1NzUyOFx1NkNENTogcG9saWN5dG9vbCBbb3B0aW9uc10ifSwKLSAgICAgICAgeyIuZmlsZS5maWxlLnBvbGljeS5maWxlLmxvY2F0aW9uIiwKLSAgICAgICAgICAgICAgICAiICBbLWZpbGUgPGZpbGU+XSAgICBcdTUzOUZcdTUyNDdcdTZBOTRcdTY4NDhcdTRGNERcdTdGNkUifSwKLSAgICAgICAgeyJOZXciLCAiXHU2NUIwXHU1ODlFIn0sCi0gICAgICAgIHsiT3BlbiIsICJcdTk1OEJcdTU1NUYifSwKLSAgICAgICAgeyJTYXZlIiwgIlx1NTEzMlx1NUI1OCJ9LAotICAgICAgICB7IlNhdmUuQXMiLCAiXHU1M0U2XHU1QjU4XHU2NUIwXHU2QTk0In0sCi0gICAgICAgIHsiVmlldy5XYXJuaW5nLkxvZyIsICJcdTZBQTJcdTg5OTZcdThCNjZcdTU0NEFcdThBMThcdTkzMDQifSwKLSAgICAgICAgeyJFeGl0IiwgIlx1N0Q1MFx1Njc1RiJ9LAotICAgICAgICB7IkFkZC5Qb2xpY3kuRW50cnkiLCAiXHU2NUIwXHU1ODlFXHU1MzlGXHU1MjQ3XHU5ODA1XHU3NkVFIn0sCi0gICAgICAgIHsiRWRpdC5Qb2xpY3kuRW50cnkiLCAiXHU3REU4XHU4RjJGXHU1MzlGXHU1MjQ3XHU5ODA1XHU3NkVFIn0sCi0gICAgICAgIHsiUmVtb3ZlLlBvbGljeS5FbnRyeSIsICJcdTc5RkJcdTk2NjRcdTUzOUZcdTUyNDdcdTk4MDVcdTc2RUUifSwKLSAgICAgICAgeyJFZGl0IiwgIlx1N0RFOFx1OEYyRiJ9LAotICAgICAgICB7IlJldGFpbiIsICJcdTRGRERcdTc1NTkifSwKLQotICAgICAgICB7Ildhcm5pbmcuRmlsZS5uYW1lLm1heS5pbmNsdWRlLmVzY2FwZWQuYmFja3NsYXNoLmNoYXJhY3RlcnMuSXQuaXMubm90Lm5lY2Vzc2FyeS50by5lc2NhcGUuYmFja3NsYXNoLmNoYXJhY3RlcnMudGhlLnRvb2wuZXNjYXBlcyIsCi0gICAgICAgICAgICAiXHU4QjY2XHU1NDRBOiBcdTZBOTRcdTY4NDhcdTU0MERcdTdBMzFcdTUzMDVcdTU0MkJcdTkwNDFcdTk2RTJcdTUzQ0RcdTY1OUNcdTdEREFcdTVCNTdcdTUxNDNcdTMwMDJcdTRFMERcdTk3MDBcdTg5ODFcdTkwNDFcdTk2RTJcdTUzQ0RcdTY1OUNcdTdEREFcdTVCNTdcdTUxNDMgKFx1NjRCMFx1NUJFQlx1NTM5Rlx1NTI0N1x1NTE2N1x1NUJCOVx1ODFGM1x1NkMzOFx1NEU0NVx1NUI1OFx1NjUzRVx1NTM0MFx1NjY0Mlx1OTcwMFx1ODk4MVx1NURFNVx1NTE3N1x1OTA0MVx1OTZFMlx1NUI1N1x1NTE0MylcdTMwMDJcblxuXHU2MzA5XHU0RTAwXHU0RTBCXHUzMDBDXHU0RkREXHU3NTU5XHUzMDBEXHU0RUU1XHU0RkREXHU3NTU5XHU4RjM4XHU1MTY1XHU3Njg0XHU1NDBEXHU3QTMxXHVGRjBDXHU2MjE2XHU2MzA5XHU0RTAwXHU0RTBCXHUzMDBDXHU3REU4XHU4RjJGXHUzMDBEXHU0RUU1XHU3REU4XHU4RjJGXHU1NDBEXHU3QTMxXHUzMDAyIn0sCi0KLSAgICAgICAgeyJBZGQuUHVibGljLktleS5BbGlhcyIsICJcdTY1QjBcdTU4OUVcdTUxNkNcdTk1OEJcdTkxRDFcdTk0NzBcdTUyMjVcdTU0MEQifSwKLSAgICAgICAgeyJSZW1vdmUuUHVibGljLktleS5BbGlhcyIsICJcdTc5RkJcdTk2NjRcdTUxNkNcdTk1OEJcdTkxRDFcdTk0NzBcdTUyMjVcdTU0MEQifSwKLSAgICAgICAgeyJGaWxlIiwgIlx1NkE5NFx1Njg0OCJ9LAotICAgICAgICB7IktleVN0b3JlIiwgIlx1OTFEMVx1OTQ3MFx1NTEzMlx1NUI1OFx1NUVBQiJ9LAotICAgICAgICB7IlBvbGljeS5GaWxlLiIsICJcdTUzOUZcdTUyNDdcdTZBOTRcdTY4NDg6ICJ9LAotICAgICAgICB7IkNvdWxkLm5vdC5vcGVuLnBvbGljeS5maWxlLnBvbGljeUZpbGUuZS50b1N0cmluZy4iLAotICAgICAgICAgICAgICAgICJcdTcxMjFcdTZDRDVcdTk1OEJcdTU1NUZcdTUzOUZcdTUyNDdcdTZBOTRcdTY4NDg6IHswfTogezF9In0sCi0gICAgICAgIHsiUG9saWN5LlRvb2wiLCAiXHU1MzlGXHU1MjQ3XHU1REU1XHU1MTc3In0sCi0gICAgICAgIHsiRXJyb3JzLmhhdmUub2NjdXJyZWQud2hpbGUub3BlbmluZy50aGUucG9saWN5LmNvbmZpZ3VyYXRpb24uVmlldy50aGUuV2FybmluZy5Mb2cuZm9yLm1vcmUuaW5mb3JtYXRpb24uIiwKLSAgICAgICAgICAgICAgICAiXHU5NThCXHU1NTVGXHU1MzlGXHU1MjQ3XHU4QTE4XHU3RjZFXHU2NjQyXHU3NjdDXHU3NTFGXHU5MzJGXHU4QUE0XHUzMDAyXHU4QUNCXHU2QUEyXHU4OTk2XHU4QjY2XHU1NDRBXHU4QTE4XHU5MzA0XHU0RUU1XHU1M0Q2XHU1Rjk3XHU2NkY0XHU1OTFBXHU3Njg0XHU4Q0M3XHU4QTBBIn0sCi0gICAgICAgIHsiRXJyb3IiLCAiXHU5MzJGXHU4QUE0In0sCi0gICAgICAgIHsiT0siLCAiXHU3OEJBXHU1QjlBIn0sCi0gICAgICAgIHsiU3RhdHVzIiwgIlx1NzJDMFx1NjE0QiJ9LAotICAgICAgICB7Ildhcm5pbmciLCAiXHU4QjY2XHU1NDRBIn0sCi0gICAgICAgIHsiUGVybWlzc2lvbi4iLAotICAgICAgICAgICAgICAgICJcdTZCMEFcdTk2NTA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9LAotICAgICAgICB7IlByaW5jaXBhbC5UeXBlLiIsICJQcmluY2lwYWwgXHU5ODVFXHU1NzhCOiAifSwKLSAgICAgICAgeyJQcmluY2lwYWwuTmFtZS4iLCAiUHJpbmNpcGFsIFx1NTQwRFx1N0EzMTogIn0sCi0gICAgICAgIHsiVGFyZ2V0Lk5hbWUuIiwKLSAgICAgICAgICAgICAgICAiXHU3NkVFXHU2QTE5XHU1NDBEXHU3QTMxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifSwKLSAgICAgICAgeyJBY3Rpb25zLiIsCi0gICAgICAgICAgICAgICAgIlx1NTJENVx1NEY1QzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIn0sCi0gICAgICAgIHsiT0sudG8ub3ZlcndyaXRlLmV4aXN0aW5nLmZpbGUuZmlsZW5hbWUuIiwKLSAgICAgICAgICAgICAgICAiXHU3OEJBXHU4QThEXHU4OTg2XHU1QkVCXHU3M0ZFXHU1QjU4XHU3Njg0XHU2QTk0XHU2ODQ4IHswfVx1RkYxRiJ9LAotICAgICAgICB7IkNhbmNlbCIsICJcdTUzRDZcdTZEODgifSwKLSAgICAgICAgeyJDb2RlQmFzZS4iLCAiQ29kZUJhc2U6In0sCi0gICAgICAgIHsiU2lnbmVkQnkuIiwgIlNpZ25lZEJ5OiJ9LAotICAgICAgICB7IkFkZC5QcmluY2lwYWwiLCAiXHU2NUIwXHU1ODlFIFByaW5jaXBhbCJ9LAotICAgICAgICB7IkVkaXQuUHJpbmNpcGFsIiwgIlx1N0RFOFx1OEYyRiBQcmluY2lwYWwifSwKLSAgICAgICAgeyJSZW1vdmUuUHJpbmNpcGFsIiwgIlx1NzlGQlx1OTY2NCBQcmluY2lwYWwifSwKLSAgICAgICAgeyJQcmluY2lwYWxzLiIsICJQcmluY2lwYWw6In0sCi0gICAgICAgIHsiLkFkZC5QZXJtaXNzaW9uIiwgIiAgXHU2NUIwXHU1ODlFXHU2QjBBXHU5NjUwIn0sCi0gICAgICAgIHsiLkVkaXQuUGVybWlzc2lvbiIsICIgIFx1N0RFOFx1OEYyRlx1NkIwQVx1OTY1MCJ9LAotICAgICAgICB7IlJlbW92ZS5QZXJtaXNzaW9uIiwgIlx1NzlGQlx1OTY2NFx1NkIwQVx1OTY1MCJ9LAotICAgICAgICB7IkRvbmUiLCAiXHU1QjhDXHU2MjEwIn0sCi0gICAgICAgIHsiS2V5U3RvcmUuVVJMLiIsICJcdTkxRDFcdTk0NzBcdTUxMzJcdTVCNThcdTVFQUIgVVJMOiAifSwKLSAgICAgICAgeyJLZXlTdG9yZS5UeXBlLiIsICJcdTkxRDFcdTk0NzBcdTUxMzJcdTVCNThcdTVFQUJcdTk4NUVcdTU3OEI6In0sCi0gICAgICAgIHsiS2V5U3RvcmUuUHJvdmlkZXIuIiwgIlx1OTFEMVx1OTQ3MFx1NTEzMlx1NUI1OFx1NUVBQlx1NjNEMFx1NEY5Qlx1ODAwNToifSwKLSAgICAgICAgeyJLZXlTdG9yZS5QYXNzd29yZC5VUkwuIiwgIlx1OTFEMVx1OTQ3MFx1NTEzMlx1NUI1OFx1NUVBQlx1NUJDNlx1NzhCQyBVUkw6ICJ9LAotICAgICAgICB7IlByaW5jaXBhbHMiLCAiUHJpbmNpcGFsIn0sCi0gICAgICAgIHsiLkVkaXQuUHJpbmNpcGFsLiIsICIgIFx1N0RFOFx1OEYyRiBQcmluY2lwYWw6ICJ9LAotICAgICAgICB7Ii5BZGQuTmV3LlByaW5jaXBhbC4iLCAiICBcdTY1QjBcdTU4OUUgUHJpbmNpcGFsOiAifSwKLSAgICAgICAgeyJQZXJtaXNzaW9ucyIsICJcdTZCMEFcdTk2NTAifSwKLSAgICAgICAgeyIuRWRpdC5QZXJtaXNzaW9uLiIsICIgIFx1N0RFOFx1OEYyRlx1NkIwQVx1OTY1MDoifSwKLSAgICAgICAgeyIuQWRkLk5ldy5QZXJtaXNzaW9uLiIsICIgIFx1NjVCMFx1NTg5RVx1NkIwQVx1OTY1MDoifSwKLSAgICAgICAgeyJTaWduZWQuQnkuIiwgIlx1N0MzRFx1N0Y3Mlx1NEVCQTogIn0sCi0gICAgICAgIHsiQ2Fubm90LlNwZWNpZnkuUHJpbmNpcGFsLndpdGguYS5XaWxkY2FyZC5DbGFzcy53aXRob3V0LmEuV2lsZGNhcmQuTmFtZSIsCi0gICAgICAgICAgICAiXHU2QzkyXHU2NzA5XHU4NDJDXHU3NTI4XHU1QjU3XHU1MTQzXHU1NDBEXHU3QTMxXHVGRjBDXHU3MTIxXHU2Q0Q1XHU2MzA3XHU1QjlBXHU1NDJCXHU2NzA5XHU4NDJDXHU3NTI4XHU1QjU3XHU1MTQzXHU5ODVFXHU1MjI1XHU3Njg0IFByaW5jaXBhbCJ9LAotICAgICAgICB7IkNhbm5vdC5TcGVjaWZ5LlByaW5jaXBhbC53aXRob3V0LmEuTmFtZSIsCi0gICAgICAgICAgICAiXHU2QzkyXHU2NzA5XHU1NDBEXHU3QTMxXHVGRjBDXHU3MTIxXHU2Q0Q1XHU2MzA3XHU1QjlBIFByaW5jaXBhbCJ9LAotICAgICAgICB7IlBlcm1pc3Npb24uYW5kLlRhcmdldC5OYW1lLm11c3QuaGF2ZS5hLnZhbHVlIiwKLSAgICAgICAgICAgICAgICAiXHU2QjBBXHU5NjUwXHU1M0NBXHU3NkVFXHU2QTE5XHU1NDBEXHU3QTMxXHU1RkM1XHU5ODA4XHU2NzA5XHU0RTAwXHU1MDBCXHU1MDNDXHUzMDAyIn0sCi0gICAgICAgIHsiUmVtb3ZlLnRoaXMuUG9saWN5LkVudHJ5LiIsICJcdTc5RkJcdTk2NjRcdTkwMTlcdTUwMEJcdTUzOUZcdTUyNDdcdTk4MDVcdTc2RUVcdUZGMUYifSwKLSAgICAgICAgeyJPdmVyd3JpdGUuRmlsZSIsICJcdTg5ODZcdTVCRUJcdTZBOTRcdTY4NDgifSwKLSAgICAgICAgeyJQb2xpY3kuc3VjY2Vzc2Z1bGx5LndyaXR0ZW4udG8uZmlsZW5hbWUiLAotICAgICAgICAgICAgICAgICJcdTUzOUZcdTUyNDdcdTYyMTBcdTUyOUZcdTVCRUJcdTUxNjVcdTgxRjMgezB9In0sCi0gICAgICAgIHsibnVsbC5maWxlbmFtZSIsICJcdTdBN0FcdTUwM0NcdTZBOTRcdTU0MEQifSwKLSAgICAgICAgeyJTYXZlLmNoYW5nZXMuIiwgIlx1NTEzMlx1NUI1OFx1OEI4QVx1NjZGNFx1RkYxRiJ9LAotICAgICAgICB7IlllcyIsICJcdTY2MkYifSwKLSAgICAgICAgeyJObyIsICJcdTU0MjYifSwKLSAgICAgICAgeyJQb2xpY3kuRW50cnkiLCAiXHU1MzlGXHU1MjQ3XHU5ODA1XHU3NkVFIn0sCi0gICAgICAgIHsiU2F2ZS5DaGFuZ2VzIiwgIlx1NTEzMlx1NUI1OFx1OEI4QVx1NjZGNCJ9LAotICAgICAgICB7Ik5vLlBvbGljeS5FbnRyeS5zZWxlY3RlZCIsICJcdTZDOTJcdTY3MDlcdTkwNzhcdTUzRDZcdTUzOUZcdTUyNDdcdTk4MDVcdTc2RUUifSwKLSAgICAgICAgeyJVbmFibGUudG8ub3Blbi5LZXlTdG9yZS5leC50b1N0cmluZy4iLAotICAgICAgICAgICAgICAgICJcdTcxMjFcdTZDRDVcdTk1OEJcdTU1NUZcdTkxRDFcdTk0NzBcdTUxMzJcdTVCNThcdTVFQUI6IHswfSJ9LAotICAgICAgICB7Ik5vLnByaW5jaXBhbC5zZWxlY3RlZCIsICJcdTY3MkFcdTkwNzhcdTUzRDYgUHJpbmNpcGFsIn0sCi0gICAgICAgIHsiTm8ucGVybWlzc2lvbi5zZWxlY3RlZCIsICJcdTZDOTJcdTY3MDlcdTkwNzhcdTUzRDZcdTZCMEFcdTk2NTAifSwKLSAgICAgICAgeyJuYW1lIiwgIlx1NTQwRFx1N0EzMSJ9LAotICAgICAgICB7ImNvbmZpZ3VyYXRpb24udHlwZSIsICJcdTdENDRcdTYxNEJcdTk4NUVcdTU3OEIifSwKLSAgICAgICAgeyJlbnZpcm9ubWVudC52YXJpYWJsZS5uYW1lIiwgIlx1NzRCMFx1NTg4M1x1OEI4QVx1NjU3OFx1NTQwRFx1N0EzMSJ9LAotICAgICAgICB7ImxpYnJhcnkubmFtZSIsICJcdTdBMEJcdTVGMEZcdTVFQUJcdTU0MERcdTdBMzEifSwKLSAgICAgICAgeyJwYWNrYWdlLm5hbWUiLCAiXHU1OTU3XHU4OEREXHU3QTBCXHU1RjBGXHU1NDBEXHU3QTMxIn0sCi0gICAgICAgIHsicG9saWN5LnR5cGUiLCAiXHU1MzlGXHU1MjQ3XHU5ODVFXHU1NzhCIn0sCi0gICAgICAgIHsicHJvcGVydHkubmFtZSIsICJcdTVDNkNcdTYwMjdcdTU0MERcdTdBMzEifSwKLSAgICAgICAgeyJQcmluY2lwYWwuTGlzdCIsICJQcmluY2lwYWwgXHU2RTA1XHU1NUFFIn0sCi0gICAgICAgIHsiUGVybWlzc2lvbi5MaXN0IiwgIlx1NkIwQVx1OTY1MFx1NkUwNVx1NTVBRSJ9LAotICAgICAgICB7IkNvZGUuQmFzZSIsICJcdTRFRTNcdTc4QkNcdTU3RkFcdTZFOTYifSwKLSAgICAgICAgeyJLZXlTdG9yZS5VLlIuTC4iLCAiXHU5MUQxXHU5NDcwXHU1MTMyXHU1QjU4XHU1RUFCIFVSTDoifSwKLSAgICAgICAgeyJLZXlTdG9yZS5QYXNzd29yZC5VLlIuTC4iLCAiXHU5MUQxXHU5NDcwXHU1MTMyXHU1QjU4XHU1RUFCXHU1QkM2XHU3OEJDIFVSTDoifSwKLQotCiAgICAgICAgIC8vIGphdmF4LnNlY3VyaXR5LmF1dGguUHJpdmF0ZUNyZWRlbnRpYWxQZXJtaXNzaW9uCiAgICAgICAgIHsiaW52YWxpZC5udWxsLmlucHV0LnMuIiwgIlx1NzEyMVx1NjU0OFx1N0E3QVx1NTAzQ1x1OEYzOFx1NTE2NSJ9LAogICAgICAgICB7ImFjdGlvbnMuY2FuLm9ubHkuYmUucmVhZC4iLCAiXHU1MkQ1XHU0RjVDXHU1M0VBXHU4MEZEXHU4OEFCXHUzMDBDXHU4QjgwXHU1M0Q2XHUzMDBEIn0sCkBAIC01NTMsNiArNTgsNyBAQAogICAgICAgICB7InByb3ZpZGVkLm51bGwuT0lELm1hcCIsICJcdTYzRDBcdTRGOUJcdTdBN0FcdTUwM0MgT0lEIFx1NUMwRFx1NjYyMCJ9LAogCiAgICAgICAgIC8vIGphdmF4LnNlY3VyaXR5LmF1dGguU3ViamVjdAorICAgICAgICB7Ik5FV0xJTkUiLCAiXG4ifSwKICAgICAgICAgeyJpbnZhbGlkLm51bGwuQWNjZXNzQ29udHJvbENvbnRleHQucHJvdmlkZWQiLAogICAgICAgICAgICAgICAgICJcdTYzRDBcdTRGOUJcdTcxMjFcdTY1NDhcdTc2ODRcdTdBN0FcdTUwM0MgQWNjZXNzQ29udHJvbENvbnRleHQifSwKICAgICAgICAgeyJpbnZhbGlkLm51bGwuYWN0aW9uLnByb3ZpZGVkIiwgIlx1NjNEMFx1NEY5Qlx1NzEyMVx1NjU0OFx1NzY4NFx1N0E3QVx1NTAzQ1x1NTJENVx1NEY1QyJ9LApAQCAtNjU2LDYgKzE2Miw3IEBACiAgICAgICoKICAgICAgKiBAcmV0dXJuIHRoZSBjb250ZW50cyBvZiB0aGlzIDxjb2RlPlJlc291cmNlQnVuZGxlPC9jb2RlPi4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgT2JqZWN0W11bXSBnZXRDb250ZW50cygpIHsKICAgICAgICAgcmV0dXJuIGNvbnRlbnRzOwogICAgIH0KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vdXRpbC9sb2NhbGUvcHJvdmlkZXIvQ3VycmVuY3lOYW1lUHJvdmlkZXJJbXBsLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3V0aWwvbG9jYWxlL3Byb3ZpZGVyL0N1cnJlbmN5TmFtZVByb3ZpZGVySW1wbC5qYXZhCmluZGV4IDMzMDg3MTEuLmNmYTgwNWYgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vdXRpbC9sb2NhbGUvcHJvdmlkZXIvQ3VycmVuY3lOYW1lUHJvdmlkZXJJbXBsLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi91dGlsL2xvY2FsZS9wcm92aWRlci9DdXJyZW5jeU5hbWVQcm92aWRlckltcGwuamF2YQpAQCAtMjYsMTAgKzI2LDkgQEAKIHBhY2thZ2Ugc3VuLnV0aWwubG9jYWxlLnByb3ZpZGVyOwogCiBpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogaW1wb3J0IGphdmEudXRpbC5zcGkuQ3VycmVuY3lOYW1lUHJvdmlkZXI7Ci1pbXBvcnQgc3VuLnV0aWwucmVzb3VyY2VzLk9wZW5MaXN0UmVzb3VyY2VCdW5kbGU7CiAKIC8qKgogICogQ29uY3JldGUgaW1wbGVtZW50YXRpb24gb2YgdGhlCkBAIC0xMjEsMTYgKzEyMCwxMCBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CiAgICAgICAgIH0KIAotICAgICAgICBPcGVuTGlzdFJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IExvY2FsZVByb3ZpZGVyQWRhcHRlci5mb3JUeXBlKHR5cGUpLmdldExvY2FsZURhdGEoKS5nZXRDdXJyZW5jeU5hbWVzKGxvY2FsZSk7Ci0gICAgICAgIExvY2FsZVNlcnZpY2VQcm92aWRlclBvb2wgcG9vbCA9Ci0gICAgICAgICAgICAgICAgTG9jYWxlU2VydmljZVByb3ZpZGVyUG9vbC5nZXRQb29sKEN1cnJlbmN5TmFtZVByb3ZpZGVyLmNsYXNzKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmICghcG9vbC5oYXNQcm92aWRlcnMoKSB8fAotICAgICAgICAgICAgICAgIChidW5kbGUuZ2V0TG9jYWxlKCkuZXF1YWxzKGxvY2FsZSkgJiYKLSAgICAgICAgICAgICAgICAgYnVuZGxlLmhhbmRsZUdldEtleXMoKS5jb250YWlucyhrZXkpKSkgeworICAgICAgICBSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBMb2NhbGVQcm92aWRlckFkYXB0ZXIuZm9yVHlwZSh0eXBlKS5nZXRMb2NhbGVEYXRhKCkuZ2V0Q3VycmVuY3lOYW1lcyhsb2NhbGUpOworICAgICAgICBpZiAoYnVuZGxlLmNvbnRhaW5zS2V5KGtleSkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gYnVuZGxlLmdldFN0cmluZyhrZXkpOwogICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gbXJlKSB7fQogCiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vdXRpbC9sb2NhbGUvcHJvdmlkZXIvTG9jYWxlTmFtZVByb3ZpZGVySW1wbC5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi91dGlsL2xvY2FsZS9wcm92aWRlci9Mb2NhbGVOYW1lUHJvdmlkZXJJbXBsLmphdmEKaW5kZXggMDM0NGNhYy4uOTUyMDc4ZiAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi91dGlsL2xvY2FsZS9wcm92aWRlci9Mb2NhbGVOYW1lUHJvdmlkZXJJbXBsLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi91dGlsL2xvY2FsZS9wcm92aWRlci9Mb2NhbGVOYW1lUHJvdmlkZXJJbXBsLmphdmEKQEAgLTI2LDEwICsyNiw5IEBACiBwYWNrYWdlIHN1bi51dGlsLmxvY2FsZS5wcm92aWRlcjsKIAogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKIGltcG9ydCBqYXZhLnV0aWwuc3BpLkxvY2FsZU5hbWVQcm92aWRlcjsKLWltcG9ydCBzdW4udXRpbC5yZXNvdXJjZXMuT3Blbkxpc3RSZXNvdXJjZUJ1bmRsZTsKIAogLyoqCiAgKiBDb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKQEAgLTE3NSwxNSArMTc0LDEwIEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKICAgICAgICAgfQogCi0gICAgICAgIE9wZW5MaXN0UmVzb3VyY2VCdW5kbGUgcmIgPSBMb2NhbGVQcm92aWRlckFkYXB0ZXIuZm9yVHlwZSh0eXBlKS5nZXRMb2NhbGVEYXRhKCkuZ2V0TG9jYWxlTmFtZXMobG9jYWxlKTsKLSAgICAgICAgTG9jYWxlU2VydmljZVByb3ZpZGVyUG9vbCBwb29sID0KLSAgICAgICAgICAgICAgICBMb2NhbGVTZXJ2aWNlUHJvdmlkZXJQb29sLmdldFBvb2woTG9jYWxlTmFtZVByb3ZpZGVyLmNsYXNzKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmICghcG9vbC5oYXNQcm92aWRlcnMoKSB8fAotICAgICAgICAgICAgICAgIChyYi5nZXRMb2NhbGUoKS5lcXVhbHMobG9jYWxlKSAmJiByYi5oYW5kbGVHZXRLZXlzKCkuY29udGFpbnMoa2V5KSkpIHsKKyAgICAgICAgUmVzb3VyY2VCdW5kbGUgcmIgPSBMb2NhbGVQcm92aWRlckFkYXB0ZXIuZm9yVHlwZSh0eXBlKS5nZXRMb2NhbGVEYXRhKCkuZ2V0TG9jYWxlTmFtZXMobG9jYWxlKTsKKyAgICAgICAgaWYgKHJiLmNvbnRhaW5zS2V5KGtleSkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gcmIuZ2V0U3RyaW5nKGtleSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBtcmUpIHt9CiAKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi91dGlsL2xvY2FsZS9wcm92aWRlci9Mb2NhbGVTZXJ2aWNlUHJvdmlkZXJQb29sLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3V0aWwvbG9jYWxlL3Byb3ZpZGVyL0xvY2FsZVNlcnZpY2VQcm92aWRlclBvb2wuamF2YQppbmRleCBhODA0NTYxLi43MWU2YjQyIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3V0aWwvbG9jYWxlL3Byb3ZpZGVyL0xvY2FsZVNlcnZpY2VQcm92aWRlclBvb2wuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3V0aWwvbG9jYWxlL3Byb3ZpZGVyL0xvY2FsZVNlcnZpY2VQcm92aWRlclBvb2wuamF2YQpAQCAtMzAyLDcgKzMwMiw3IEBACiAKICAgICAgICAgICAgICAgICBmb3IgKExvY2FsZVByb3ZpZGVyQWRhcHRlci5UeXBlIHR5cGU6IGZpbmRQcm92aWRlcnMoY3VycmVudCkpIHsKICAgICAgICAgICAgICAgICAgICAgTG9jYWxlU2VydmljZVByb3ZpZGVyIGxzcCA9IHByb3ZpZGVycy5nZXQodHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyc09iaiA9IGdldHRlci5nZXRPYmplY3QoKFApbHNwLCBjdXJyZW50LCBrZXksIHBhcmFtcyk7CisgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyc09iaiA9IGdldHRlci5nZXRPYmplY3QoKFApbHNwLCBsb2NhbGUsIGtleSwgcGFyYW1zKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3ZpZGVyc09iaiAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvdmlkZXJzT2JqOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzT2JqZWN0UHJvdmlkZXIpIHsKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vdXRpbC9sb2NhbGUvcHJvdmlkZXIvVGltZVpvbmVOYW1lUHJvdmlkZXJJbXBsLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3V0aWwvbG9jYWxlL3Byb3ZpZGVyL1RpbWVab25lTmFtZVByb3ZpZGVySW1wbC5qYXZhCmluZGV4IGVhNDM2ZmIuLmZmMDkyODYgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vdXRpbC9sb2NhbGUvcHJvdmlkZXIvVGltZVpvbmVOYW1lUHJvdmlkZXJJbXBsLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi91dGlsL2xvY2FsZS9wcm92aWRlci9UaW1lWm9uZU5hbWVQcm92aWRlckltcGwuamF2YQpAQCAtMjYsMTEgKzI2LDEwIEBACiBwYWNrYWdlIHN1bi51dGlsLmxvY2FsZS5wcm92aWRlcjsKIAogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKIGltcG9ydCBqYXZhLnV0aWwuVGltZVpvbmU7CiBpbXBvcnQgamF2YS51dGlsLnNwaS5UaW1lWm9uZU5hbWVQcm92aWRlcjsKLWltcG9ydCBzdW4udXRpbC5yZXNvdXJjZXMuT3Blbkxpc3RSZXNvdXJjZUJ1bmRsZTsKIAogLyoqCiAgKiBDb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKQEAgLTEwMiwxMiArMTAxLDggQEAKICAgICAgICAgfQogCiAgICAgICAgIExvY2FsZVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gTG9jYWxlUHJvdmlkZXJBZGFwdGVyLmZvclR5cGUodHlwZSk7Ci0gICAgICAgIE9wZW5MaXN0UmVzb3VyY2VCdW5kbGUgcmIgPSBhZGFwdGVyLmdldExvY2FsZVJlc291cmNlcyhsb2NhbGUpLmdldFRpbWVab25lTmFtZXMoKTsKLSAgICAgICAgTG9jYWxlU2VydmljZVByb3ZpZGVyUG9vbCBwb29sID0KLSAgICAgICAgICAgICAgICBMb2NhbGVTZXJ2aWNlUHJvdmlkZXJQb29sLmdldFBvb2woVGltZVpvbmVOYW1lUHJvdmlkZXIuY2xhc3MpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKCFwb29sLmhhc1Byb3ZpZGVycygpIHx8Ci0gICAgICAgICAgICAgICAgKHJiLmdldExvY2FsZSgpLmVxdWFscyhsb2NhbGUpICYmIHJiLmhhbmRsZUdldEtleXMoKS5jb250YWlucyhpZCkpKSB7CisgICAgICAgIFJlc291cmNlQnVuZGxlIHJiID0gYWRhcHRlci5nZXRMb2NhbGVSZXNvdXJjZXMobG9jYWxlKS5nZXRUaW1lWm9uZU5hbWVzKCk7CisgICAgICAgIGlmIChyYi5jb250YWluc0tleShpZCkpIHsKICAgICAgICAgICAgICAgICBTdHJpbmdbXSBuYW1lcyA9IHJiLmdldFN0cmluZ0FycmF5KGlkKTsKICAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBkYXlsaWdodCA/IDMgOiAxOwogICAgICAgICAgICAgICAgIGlmIChzdHlsZSA9PSBUaW1lWm9uZS5TSE9SVCkgewpAQCAtMTE1LDggKzExMCw2IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHJldHVybiBuYW1lc1tpbmRleF07CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBtcmUpIHsKLSAgICAgICAgfQogCiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vdXRpbC9zcGkvWG1sUHJvcGVydGllc1Byb3ZpZGVyLmphdmEgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3V0aWwvc3BpL1htbFByb3BlcnRpZXNQcm92aWRlci5qYXZhCmluZGV4IDQyMTk0ZGEuLjNlNGFjZGQgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vdXRpbC9zcGkvWG1sUHJvcGVydGllc1Byb3ZpZGVyLmphdmEKKysrIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi91dGlsL3NwaS9YbWxQcm9wZXJ0aWVzUHJvdmlkZXIuamF2YQpAQCAtNTUsNiArNTUsOSBAQAogICAgICAqIEBwYXJhbSBwcm9wcyB0aGUgcHJvcGVydGllcyB0YWJsZSB0byBwb3B1bGF0ZQogICAgICAqIEBwYXJhbSBpbiB0aGUgaW5wdXQgc3RyZWFtIGZyb20gd2hpY2ggdG8gcmVhZCB0aGUgWE1MIGRvY3VtZW50CiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiByZWFkaW5nIGZyb20gdGhlIHNwZWNpZmllZCBpbnB1dCBzdHJlYW0gZmFpbHMKKyAgICAgKiBAdGhyb3dzIGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBpZiB0aGUgZG9jdW1lbnQncyBlbmNvZGluZworICAgICAqICAgICAgICAgZGVjbGFyYXRpb24gY2FuIGJlIHJlYWQgYW5kIGl0IHNwZWNpZmllcyBhbiBlbmNvZGluZyB0aGF0IGlzIG5vdAorICAgICAqICAgICAgICAgc3VwcG9ydGVkCiAgICAgICogQHRocm93cyBJbnZhbGlkUHJvcGVydGllc0Zvcm1hdEV4Y2VwdGlvbiBEYXRhIG9uIGlucHV0IHN0cmVhbSBkb2VzIG5vdAogICAgICAqICAgICAgICAgY29uc3RpdHV0ZSBhIHZhbGlkIFhNTCBkb2N1bWVudCB3aXRoIHRoZSBtYW5kYXRlZCBkb2N1bWVudCB0eXBlLgogICAgICAqCkBAIC03Myw2ICs3Niw4IEBACiAgICAgICogQHBhcmFtIGVuY29kaW5nIHRoZSBuYW1lIG9mIGEgc3VwcG9ydGVkIGNoYXJhY3RlciBlbmNvZGluZwogICAgICAqCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB3cml0aW5nIHRvIHRoZSBzcGVjaWZpZWQgb3V0cHV0IHN0cmVhbSBmYWlscworICAgICAqIEB0aHJvd3MgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGlmIHRoZSBlbmNvZGluZyBpcyBub3QKKyAgICAgKiAgICAgICAgIHN1cHBvcnRlZCBieSB0aGUgaW1wbGVtZW50YXRpb24KICAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHtAY29kZSBvdXR9IGlzIG51bGwuCiAgICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gIGlmIHRoaXMge0Bjb2RlIFByb3BlcnRpZXN9IG9iamVjdAogICAgICAqICAgICAgICAgY29udGFpbnMgYW55IGtleXMgb3IgdmFsdWVzIHRoYXQgYXJlIG5vdApkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi91dGlsL3htbC9QbGF0Zm9ybVhtbFByb3BlcnRpZXNQcm92aWRlci5qYXZhIGIvamRrL3NyYy9zaGFyZS9jbGFzc2VzL3N1bi91dGlsL3htbC9QbGF0Zm9ybVhtbFByb3BlcnRpZXNQcm92aWRlci5qYXZhCmluZGV4IGY0ZTQwMTAuLjA4NzhjM2QgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvY2xhc3Nlcy9zdW4vdXRpbC94bWwvUGxhdGZvcm1YbWxQcm9wZXJ0aWVzUHJvdmlkZXIuamF2YQorKysgYi9qZGsvc3JjL3NoYXJlL2NsYXNzZXMvc3VuL3V0aWwveG1sL1BsYXRmb3JtWG1sUHJvcGVydGllc1Byb3ZpZGVyLmphdmEKQEAgLTI3LDYgKzI3LDcgQEAKIAogaW1wb3J0IGphdmEuaW8uKjsKIGltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0Lio7CiBpbXBvcnQgb3JnLnhtbC5zYXguKjsKIGltcG9ydCBvcmcudzNjLmRvbS4qOwogaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLio7CkBAIC0xMjcsNiArMTI4LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVuY29kaW5nKQogICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7CisgICAgICAgIC8vIGZhc3QtZmFpbCBmb3IgdW5zdXBwb3J0ZWQgY2hhcnNldHMgYXMgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBtYXkKKyAgICAgICAgLy8gbm90IGJlIHRocm93biBsYXRlciAoc2VlIEpESy04MDAwNjIxKQorICAgICAgICB0cnkgeworICAgICAgICAgICAgQ2hhcnNldC5mb3JOYW1lKGVuY29kaW5nKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbENoYXJzZXROYW1lRXhjZXB0aW9uIHwgVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uIHgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uKGVuY29kaW5nKTsKKyAgICAgICAgfQogICAgICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGRiZiA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKICAgICAgICAgRG9jdW1lbnRCdWlsZGVyIGRiID0gbnVsbDsKICAgICAgICAgdHJ5IHsKZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvbGliL3NlY3VyaXR5L2phdmEuc2VjdXJpdHkgYi9qZGsvc3JjL3NoYXJlL2xpYi9zZWN1cml0eS9qYXZhLnNlY3VyaXR5CmluZGV4IGU4Y2E3YmQuLjIyMTAzYWQgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc2hhcmUvbGliL3NlY3VyaXR5L2phdmEuc2VjdXJpdHkKKysrIGIvamRrL3NyYy9zaGFyZS9saWIvc2VjdXJpdHkvamF2YS5zZWN1cml0eQpAQCAtMTQ1LDcgKzE0NSw3IEBACiAjIHBhc3NlZCB0byBjaGVja1BhY2thZ2VBY2Nlc3MgdW5sZXNzIHRoZQogIyBjb3JyZXNwb25kaW5nIFJ1bnRpbWVQZXJtaXNzaW9uICgiYWNjZXNzQ2xhc3NJblBhY2thZ2UuIitwYWNrYWdlKSBoYXMKICMgYmVlbiBncmFudGVkLgotcGFja2FnZS5hY2Nlc3M9c3VuLixjb20uc3VuLnhtbC5pbnRlcm5hbC53cy4sY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC4sY29tLnN1bi5pbWFnZWlvLixjb20uc3VuLm9yZy5hcGFjaGUueGVyY2VzLmludGVybmFsLnV0aWxzLixjb20uc3VuLm9yZy5hcGFjaGUueGFsYW4uaW50ZXJuYWwudXRpbHMuCitwYWNrYWdlLmFjY2Vzcz1zdW4uLGNvbS5zdW4ueG1sLmludGVybmFsLndzLixjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLixjb20uc3VuLmltYWdlaW8uLGNvbS5zdW4ub3JnLmFwYWNoZS54ZXJjZXMuaW50ZXJuYWwudXRpbHMuLGNvbS5zdW4ub3JnLmFwYWNoZS54YWxhbi5pbnRlcm5hbC51dGlscy4sY29tLnN1bi5vcmcuZ2xhc3NmaXNoLmV4dGVybmFsLixjb20uc3VuLm9yZy5nbGFzc2Zpc2guZ21iYWwuLGpkay5pbnRlcm5hbC4KIAogIwogIyBMaXN0IG9mIGNvbW1hLXNlcGFyYXRlZCBwYWNrYWdlcyB0aGF0IHN0YXJ0IHdpdGggb3IgZXF1YWwgdGhpcyBzdHJpbmcKQEAgLTE1Nyw3ICsxNTcsNyBAQAogIyBieSBkZWZhdWx0LCBub25lIG9mIHRoZSBjbGFzcyBsb2FkZXJzIHN1cHBsaWVkIHdpdGggdGhlIEpESyBjYWxsCiAjIGNoZWNrUGFja2FnZURlZmluaXRpb24uCiAjCi1wYWNrYWdlLmRlZmluaXRpb249c3VuLixjb20uc3VuLnhtbC5pbnRlcm5hbC53cy4sY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC4sY29tLnN1bi5pbWFnZWlvLixjb20uc3VuLm9yZy5hcGFjaGUueGVyY2VzLmludGVybmFsLnV0aWxzLixjb20uc3VuLm9yZy5hcGFjaGUueGFsYW4uaW50ZXJuYWwudXRpbHMuCitwYWNrYWdlLmRlZmluaXRpb249c3VuLixjb20uc3VuLnhtbC5pbnRlcm5hbC53cy4sY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC4sY29tLnN1bi5pbWFnZWlvLixjb20uc3VuLm9yZy5hcGFjaGUueGVyY2VzLmludGVybmFsLnV0aWxzLixjb20uc3VuLm9yZy5hcGFjaGUueGFsYW4uaW50ZXJuYWwudXRpbHMuLGNvbS5zdW4ub3JnLmdsYXNzZmlzaC5leHRlcm5hbC4sY29tLnN1bi5vcmcuZ2xhc3NmaXNoLmdtYmFsLixqZGsuaW50ZXJuYWwuCiAKICMKICMgRGV0ZXJtaW5lcyB3aGV0aGVyIHRoaXMgcHJvcGVydGllcyBmaWxlIGNhbiBiZSBhcHBlbmRlZCB0bwpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9saWIvc2VjdXJpdHkvamF2YS5zZWN1cml0eS1tYWNvc3ggYi9qZGsvc3JjL3NoYXJlL2xpYi9zZWN1cml0eS9qYXZhLnNlY3VyaXR5LW1hY29zeAppbmRleCAxYzA0MjM2Li4zZGI5MDliIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2xpYi9zZWN1cml0eS9qYXZhLnNlY3VyaXR5LW1hY29zeAorKysgYi9qZGsvc3JjL3NoYXJlL2xpYi9zZWN1cml0eS9qYXZhLnNlY3VyaXR5LW1hY29zeApAQCAtMTQ2LDcgKzE0Niw3IEBACiAjIHBhc3NlZCB0byBjaGVja1BhY2thZ2VBY2Nlc3MgdW5sZXNzIHRoZQogIyBjb3JyZXNwb25kaW5nIFJ1bnRpbWVQZXJtaXNzaW9uICgiYWNjZXNzQ2xhc3NJblBhY2thZ2UuIitwYWNrYWdlKSBoYXMKICMgYmVlbiBncmFudGVkLgotcGFja2FnZS5hY2Nlc3M9c3VuLixjb20uc3VuLnhtbC5pbnRlcm5hbC53cy4sY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC4sY29tLnN1bi5pbWFnZWlvLixhcHBsZS4sY29tLnN1bi5vcmcuYXBhY2hlLnhlcmNlcy5pbnRlcm5hbC51dGlscy4sY29tLnN1bi5vcmcuYXBhY2hlLnhhbGFuLmludGVybmFsLnV0aWxzLgorcGFja2FnZS5hY2Nlc3M9c3VuLixjb20uc3VuLnhtbC5pbnRlcm5hbC53cy4sY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC4sY29tLnN1bi5pbWFnZWlvLixhcHBsZS4sY29tLnN1bi5vcmcuYXBhY2hlLnhlcmNlcy5pbnRlcm5hbC51dGlscy4sY29tLnN1bi5vcmcuYXBhY2hlLnhhbGFuLmludGVybmFsLnV0aWxzLixjb20uc3VuLm9yZy5nbGFzc2Zpc2guZXh0ZXJuYWwuLGNvbS5zdW4ub3JnLmdsYXNzZmlzaC5nbWJhbC4samRrLmludGVybmFsLgogCiAjCiAjIExpc3Qgb2YgY29tbWEtc2VwYXJhdGVkIHBhY2thZ2VzIHRoYXQgc3RhcnQgd2l0aCBvciBlcXVhbCB0aGlzIHN0cmluZwpAQCAtMTU4LDcgKzE1OCw3IEBACiAjIGJ5IGRlZmF1bHQsIG5vbmUgb2YgdGhlIGNsYXNzIGxvYWRlcnMgc3VwcGxpZWQgd2l0aCB0aGUgSkRLIGNhbGwKICMgY2hlY2tQYWNrYWdlRGVmaW5pdGlvbi4KICMKLXBhY2thZ2UuZGVmaW5pdGlvbj1zdW4uLGNvbS5zdW4ueG1sLmludGVybmFsLndzLixjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLixjb20uc3VuLmltYWdlaW8uLGFwcGxlLixjb20uc3VuLm9yZy5hcGFjaGUueGVyY2VzLmludGVybmFsLnV0aWxzLixjb20uc3VuLm9yZy5hcGFjaGUueGFsYW4uaW50ZXJuYWwudXRpbHMuCitwYWNrYWdlLmRlZmluaXRpb249c3VuLixjb20uc3VuLnhtbC5pbnRlcm5hbC53cy4sY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC4sY29tLnN1bi5pbWFnZWlvLixhcHBsZS4sY29tLnN1bi5vcmcuYXBhY2hlLnhlcmNlcy5pbnRlcm5hbC51dGlscy4sY29tLnN1bi5vcmcuYXBhY2hlLnhhbGFuLmludGVybmFsLnV0aWxzLixjb20uc3VuLm9yZy5nbGFzc2Zpc2guZXh0ZXJuYWwuLGNvbS5zdW4ub3JnLmdsYXNzZmlzaC5nbWJhbC4samRrLmludGVybmFsLgogCiAjCiAjIERldGVybWluZXMgd2hldGhlciB0aGlzIHByb3BlcnRpZXMgZmlsZSBjYW4gYmUgYXBwZW5kZWQgdG8KZGlmZiAtLWdpdCBhL2pkay9zcmMvc2hhcmUvbGliL3NlY3VyaXR5L2phdmEuc2VjdXJpdHktc29sYXJpcyBiL2pkay9zcmMvc2hhcmUvbGliL3NlY3VyaXR5L2phdmEuc2VjdXJpdHktc29sYXJpcwppbmRleCA4N2E2ZjFlLi5jZWJlNGU3IDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL2xpYi9zZWN1cml0eS9qYXZhLnNlY3VyaXR5LXNvbGFyaXMKKysrIGIvamRrL3NyYy9zaGFyZS9saWIvc2VjdXJpdHkvamF2YS5zZWN1cml0eS1zb2xhcmlzCkBAIC0xNDcsNyArMTQ3LDcgQEAKICMgcGFzc2VkIHRvIGNoZWNrUGFja2FnZUFjY2VzcyB1bmxlc3MgdGhlCiAjIGNvcnJlc3BvbmRpbmcgUnVudGltZVBlcm1pc3Npb24gKCJhY2Nlc3NDbGFzc0luUGFja2FnZS4iK3BhY2thZ2UpIGhhcwogIyBiZWVuIGdyYW50ZWQuCi1wYWNrYWdlLmFjY2Vzcz1zdW4uLGNvbS5zdW4ueG1sLmludGVybmFsLndzLixjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLixjb20uc3VuLmltYWdlaW8uLGNvbS5zdW4ub3JnLmFwYWNoZS54ZXJjZXMuaW50ZXJuYWwudXRpbHMuLGNvbS5zdW4ub3JnLmFwYWNoZS54YWxhbi5pbnRlcm5hbC51dGlscy4KK3BhY2thZ2UuYWNjZXNzPXN1bi4sY29tLnN1bi54bWwuaW50ZXJuYWwud3MuLGNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQuLGNvbS5zdW4uaW1hZ2Vpby4sY29tLnN1bi5vcmcuYXBhY2hlLnhlcmNlcy5pbnRlcm5hbC51dGlscy4sY29tLnN1bi5vcmcuYXBhY2hlLnhhbGFuLmludGVybmFsLnV0aWxzLixjb20uc3VuLm9yZy5nbGFzc2Zpc2guZXh0ZXJuYWwuLGNvbS5zdW4ub3JnLmdsYXNzZmlzaC5nbWJhbC4samRrLmludGVybmFsLgogCiAjCiAjIExpc3Qgb2YgY29tbWEtc2VwYXJhdGVkIHBhY2thZ2VzIHRoYXQgc3RhcnQgd2l0aCBvciBlcXVhbCB0aGlzIHN0cmluZwpAQCAtMTU5LDcgKzE1OSw3IEBACiAjIGJ5IGRlZmF1bHQsIG5vbmUgb2YgdGhlIGNsYXNzIGxvYWRlcnMgc3VwcGxpZWQgd2l0aCB0aGUgSkRLIGNhbGwKICMgY2hlY2tQYWNrYWdlRGVmaW5pdGlvbi4KICMKLXBhY2thZ2UuZGVmaW5pdGlvbj1zdW4uLGNvbS5zdW4ueG1sLmludGVybmFsLndzLixjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLixjb20uc3VuLmltYWdlaW8uLGNvbS5zdW4ub3JnLmFwYWNoZS54ZXJjZXMuaW50ZXJuYWwudXRpbHMuLGNvbS5zdW4ub3JnLmFwYWNoZS54YWxhbi5pbnRlcm5hbC51dGlscy4KK3BhY2thZ2UuZGVmaW5pdGlvbj1zdW4uLGNvbS5zdW4ueG1sLmludGVybmFsLndzLixjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLixjb20uc3VuLmltYWdlaW8uLGNvbS5zdW4ub3JnLmFwYWNoZS54ZXJjZXMuaW50ZXJuYWwudXRpbHMuLGNvbS5zdW4ub3JnLmFwYWNoZS54YWxhbi5pbnRlcm5hbC51dGlscy4sY29tLnN1bi5vcmcuZ2xhc3NmaXNoLmV4dGVybmFsLixjb20uc3VuLm9yZy5nbGFzc2Zpc2guZ21iYWwuLGpkay5pbnRlcm5hbC4KIAogIwogIyBEZXRlcm1pbmVzIHdoZXRoZXIgdGhpcyBwcm9wZXJ0aWVzIGZpbGUgY2FuIGJlIGFwcGVuZGVkIHRvCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NoYXJlL2xpYi9zZWN1cml0eS9qYXZhLnNlY3VyaXR5LXdpbmRvd3MgYi9qZGsvc3JjL3NoYXJlL2xpYi9zZWN1cml0eS9qYXZhLnNlY3VyaXR5LXdpbmRvd3MKaW5kZXggZTdjMzZkOC4uNzM3YTYwMCAxMDA2NDQKLS0tIGEvamRrL3NyYy9zaGFyZS9saWIvc2VjdXJpdHkvamF2YS5zZWN1cml0eS13aW5kb3dzCisrKyBiL2pkay9zcmMvc2hhcmUvbGliL3NlY3VyaXR5L2phdmEuc2VjdXJpdHktd2luZG93cwpAQCAtMTQ2LDcgKzE0Niw3IEBACiAjIHBhc3NlZCB0byBjaGVja1BhY2thZ2VBY2Nlc3MgdW5sZXNzIHRoZQogIyBjb3JyZXNwb25kaW5nIFJ1bnRpbWVQZXJtaXNzaW9uICgiYWNjZXNzQ2xhc3NJblBhY2thZ2UuIitwYWNrYWdlKSBoYXMKICMgYmVlbiBncmFudGVkLgotcGFja2FnZS5hY2Nlc3M9c3VuLixjb20uc3VuLnhtbC5pbnRlcm5hbC53cy4sY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC4sY29tLnN1bi5pbWFnZWlvLixjb20uc3VuLm9yZy5hcGFjaGUueGVyY2VzLmludGVybmFsLnV0aWxzLixjb20uc3VuLm9yZy5hcGFjaGUueGFsYW4uaW50ZXJuYWwudXRpbHMuCitwYWNrYWdlLmFjY2Vzcz1zdW4uLGNvbS5zdW4ueG1sLmludGVybmFsLndzLixjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLixjb20uc3VuLmltYWdlaW8uLGNvbS5zdW4ub3JnLmFwYWNoZS54ZXJjZXMuaW50ZXJuYWwudXRpbHMuLGNvbS5zdW4ub3JnLmFwYWNoZS54YWxhbi5pbnRlcm5hbC51dGlscy4sY29tLnN1bi5vcmcuZ2xhc3NmaXNoLmV4dGVybmFsLixjb20uc3VuLm9yZy5nbGFzc2Zpc2guZ21iYWwuLGpkay5pbnRlcm5hbC4KIAogIwogIyBMaXN0IG9mIGNvbW1hLXNlcGFyYXRlZCBwYWNrYWdlcyB0aGF0IHN0YXJ0IHdpdGggb3IgZXF1YWwgdGhpcyBzdHJpbmcKQEAgLTE1OCw3ICsxNTgsNyBAQAogIyBieSBkZWZhdWx0LCBub25lIG9mIHRoZSBjbGFzcyBsb2FkZXJzIHN1cHBsaWVkIHdpdGggdGhlIEpESyBjYWxsCiAjIGNoZWNrUGFja2FnZURlZmluaXRpb24uCiAjCi1wYWNrYWdlLmRlZmluaXRpb249c3VuLixjb20uc3VuLnhtbC5pbnRlcm5hbC53cy4sY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC4sY29tLnN1bi5pbWFnZWlvLixjb20uc3VuLm9yZy5hcGFjaGUueGVyY2VzLmludGVybmFsLnV0aWxzLixjb20uc3VuLm9yZy5hcGFjaGUueGFsYW4uaW50ZXJuYWwudXRpbHMuCitwYWNrYWdlLmRlZmluaXRpb249c3VuLixjb20uc3VuLnhtbC5pbnRlcm5hbC53cy4sY29tLnN1bi54bWwuaW50ZXJuYWwuYmluZC4sY29tLnN1bi5pbWFnZWlvLixjb20uc3VuLm9yZy5hcGFjaGUueGVyY2VzLmludGVybmFsLnV0aWxzLixjb20uc3VuLm9yZy5hcGFjaGUueGFsYW4uaW50ZXJuYWwudXRpbHMuLGNvbS5zdW4ub3JnLmdsYXNzZmlzaC5leHRlcm5hbC4sY29tLnN1bi5vcmcuZ2xhc3NmaXNoLmdtYmFsLixqZGsuaW50ZXJuYWwuCiAKICMKICMgRGV0ZXJtaW5lcyB3aGV0aGVyIHRoaXMgcHJvcGVydGllcyBmaWxlIGNhbiBiZSBhcHBlbmRlZCB0bwpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zaGFyZS9uYXRpdmUvc3VuL2phdmEyZC9jbW0vbGNtcy9MQ01TLmMgYi9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vamF2YTJkL2NtbS9sY21zL0xDTVMuYwppbmRleCAxMTk1ZjdjLi45MTA5NjlmIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vamF2YTJkL2NtbS9sY21zL0xDTVMuYworKysgYi9qZGsvc3JjL3NoYXJlL25hdGl2ZS9zdW4vamF2YTJkL2NtbS9sY21zL0xDTVMuYwpAQCAtMjUzLDYgKzI1MywxNiBAQAogCiAgICAgaWYgKHNQcm9mLnBmID09IE5VTEwpIHsKICAgICAgICAgSk5VX1Rocm93SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGVudiwgIkludmFsaWQgcHJvZmlsZSBkYXRhIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogU2FuaXR5IGNoZWNrOiB0cnkgdG8gc2F2ZSB0aGUgcHJvZmlsZSBpbiBvcmRlcgorICAgICAgICAgKiB0byBmb3JjZSBiYXNpYyB2YWxpZGF0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgY21zVUludDMyTnVtYmVyIHBmU2l6ZSA9IDA7CisgICAgICAgIGlmICghY21zU2F2ZVByb2ZpbGVUb01lbShzUHJvZi5wZiwgTlVMTCwgJnBmU2l6ZSkgfHwKKyAgICAgICAgICAgIHBmU2l6ZSA8IHNpemVvZihjbXNJQ0NIZWFkZXIpKQorICAgICAgICB7CisgICAgICAgICAgICBKTlVfVGhyb3dJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZW52LCAiSW52YWxpZCBwcm9maWxlIGRhdGEiKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHJldHVybiBzUHJvZi5qOwpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zb2xhcmlzL2NsYXNzZXMvc3VuL2F3dC9YMTEvWEtleXN5bS5qYXZhIGIvamRrL3NyYy9zb2xhcmlzL2NsYXNzZXMvc3VuL2F3dC9YMTEvWEtleXN5bS5qYXZhCmluZGV4IDZiYTg0YTguLjdkNjM2MjUgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc29sYXJpcy9jbGFzc2VzL3N1bi9hd3QvWDExL1hLZXlzeW0uamF2YQorKysgYi9qZGsvc3JjL3NvbGFyaXMvY2xhc3Nlcy9zdW4vYXd0L1gxMS9YS2V5c3ltLmphdmEKQEAgLTM3OSw2ICszNzksMjUgQEAKICAgICAgICAga2V5c3ltMlVDU0hhc2gucHV0KCAobG9uZykweEZGQjgsIChjaGFyKTB4MDAzOCk7IC8vIFhLX0tQXzggLS0+IERJR0lUIEVJR0hUCiAgICAgICAgIGtleXN5bTJVQ1NIYXNoLnB1dCggKGxvbmcpMHhGRkI5LCAoY2hhcikweDAwMzkpOyAvLyBYS19LUF85IC0tPiBESUdJVCBOSU5FCiAgICAgICAgIGtleXN5bTJVQ1NIYXNoLnB1dCggKGxvbmcpMHhGRTIwLCAoY2hhcikweDAwMDkpOyAvLyBYS19JU09fTGVmdF9UYWIgLS0+IDxjb250cm9sPgorICAgICAgICBrZXlzeW0yVUNTSGFzaC5wdXQoIChsb25nKTB4RkU1MCwgKGNoYXIpMHgwMkNCKTsgLy8gWEtfZGVhZF9ncmF2ZSAtLT4gTU9ESUZJRVIgTEVUVEVSIEdSQVZFIEFDQ0VOVAorICAgICAgICBrZXlzeW0yVUNTSGFzaC5wdXQoIChsb25nKTB4RkU1MSwgKGNoYXIpMHgwMkNBKTsgLy8gWEtfZGVhZF9hY3V0ZSAtLT4gTU9ESUZJRVIgTEVUVEVSIEFDVVRFIEFDQ0VOVAorICAgICAgICBrZXlzeW0yVUNTSGFzaC5wdXQoIChsb25nKTB4RkU1MiwgKGNoYXIpMHgwMkM2KTsgLy8gWEtfZGVhZF9jaXJjdW1mbGV4IC0tPiBNT0RJRklFUiBMRVRURVIgQ0lSQ1VNRkxFWCBBQ0NFTlQKKyAgICAgICAga2V5c3ltMlVDU0hhc2gucHV0KCAobG9uZykweEZFNTMsIChjaGFyKTB4MDJEQyk7IC8vIFhLX2RlYWRfdGlsZGUgLS0+IFNNQUxMIFRJTERFCisgICAgICAgIGtleXN5bTJVQ1NIYXNoLnB1dCggKGxvbmcpMHhGRTU0LCAoY2hhcikweDAyQzkpOyAvLyBYS19kZWFkX21hY3JvbiAtLT4gTU9ESUZJRVIgTEVUVEVSIE1BQ1JPTgorICAgICAgICBrZXlzeW0yVUNTSGFzaC5wdXQoIChsb25nKTB4RkU1NSwgKGNoYXIpMHgwMkQ4KTsgLy8gWEtfZGVhZF9icmV2ZSAtLT4gQlJFVkUKKyAgICAgICAga2V5c3ltMlVDU0hhc2gucHV0KCAobG9uZykweEZFNTYsIChjaGFyKTB4MDJEOSk7IC8vIFhLX2RlYWRfYWJvdmVkb3QgLS0+IERPVCBBQk9WRQorICAgICAgICBrZXlzeW0yVUNTSGFzaC5wdXQoIChsb25nKTB4RkU1NywgKGNoYXIpMHgwMEE4KTsgLy8gWEtfZGVhZF9kaWFlcmVzaXMgLS0+IERJQUVSRVNJUworICAgICAgICBrZXlzeW0yVUNTSGFzaC5wdXQoIChsb25nKTB4RkU1OCwgKGNoYXIpMHgwMkRBKTsgLy8gWEtfZGVhZF9hYm92ZXJpbmcgLS0+IFJJTkcgQUJPVkUKKyAgICAgICAga2V5c3ltMlVDU0hhc2gucHV0KCAobG9uZykweEZFNTksIChjaGFyKTB4MDJERCk7IC8vIFhLX2RlYWRfZG91YmxlYWN1dGUgLS0+IERPVUJMRSBBQ1VURSBBQ0NFTlQKKyAgICAgICAga2V5c3ltMlVDU0hhc2gucHV0KCAobG9uZykweEZFNUEsIChjaGFyKTB4MDJDNyk7IC8vIFhLX2RlYWRfY2Fyb24gLS0+IENBUk9OCisgICAgICAgIGtleXN5bTJVQ1NIYXNoLnB1dCggKGxvbmcpMHhGRTVCLCAoY2hhcikweDAwQjgpOyAvLyBYS19kZWFkX2NlZGlsbGEgLS0+IENFRElMTEEKKyAgICAgICAga2V5c3ltMlVDU0hhc2gucHV0KCAobG9uZykweEZFNUMsIChjaGFyKTB4MDJEQik7IC8vIFhLX2RlYWRfb2dvbmVrIC0tPiBPR09ORUsKKyAgICAgICAga2V5c3ltMlVDU0hhc2gucHV0KCAobG9uZykweEZFNUQsIChjaGFyKTB4MDI2OSk7IC8vIFhLX2RlYWRfaW90YSAtLT4gTEFUSU4gU01BTEwgTEVUVEVSIElPVEEKKyAgICAgICAga2V5c3ltMlVDU0hhc2gucHV0KCAobG9uZykweEZFNUUsIChjaGFyKTB4MzA5OSk7IC8vIFhLX2RlYWRfdm9pY2VkX3NvdW5kIC0tPiBDT01CSU5JTkcgS0FUQUtBTkEtSElSQUdBTkEgVk9JQ0VEIFNPVU5EIE1BUksKKyAgICAgICAga2V5c3ltMlVDU0hhc2gucHV0KCAobG9uZykweEZFNUYsIChjaGFyKTB4MzA5QSk7IC8vIFhLX2RlYWRfc2VtaXZvaWNlZF9zb3VuZCAtLT4gQ09NQklOSU5HIEtBVEFLQU5BLUhJUkFHQU5BIFNFTUktVk9JQ0VEIFNPVU5EIE1BUksKKyAgICAgICAga2V5c3ltMlVDU0hhc2gucHV0KCAobG9uZykweEZFNjAsIChjaGFyKTB4MDMyMyk7IC8vIFhLX2RlYWRfYmVsb3dkb3QgLS0+IENPTUJJTklORyBET1QgQkVMT1cKKyAgICAgICAga2V5c3ltMlVDU0hhc2gucHV0KCAobG9uZykweEZFNjEsIChjaGFyKTB4MDMyMSk7IC8vIFhLX2RlYWRfaG9vayAtLT4gQ09NQklOSU5HIFBBTEFUQUxJWkVEIEhPT0sgQkVMT1cKKyAgICAgICAga2V5c3ltMlVDU0hhc2gucHV0KCAobG9uZykweEZFNjIsIChjaGFyKTB4MDMxQik7IC8vIFhLX2RlYWRfaG9ybiAtLT4gQ09NQklOSU5HIEhPUk4KICAgICAgICAga2V5c3ltMlVDU0hhc2gucHV0KCAobG9uZykweDFhMSwgKGNoYXIpMHgwMTA0KTsgLy8gWEtfQW9nb25layAtLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIE9HT05FSwogICAgICAgICBrZXlzeW0yVUNTSGFzaC5wdXQoIChsb25nKTB4MWEyLCAoY2hhcikweDAyZDgpOyAvLyBYS19icmV2ZSAtLT4gQlJFVkUKICAgICAgICAga2V5c3ltMlVDU0hhc2gucHV0KCAobG9uZykweDFhMywgKGNoYXIpMHgwMTQxKTsgLy8gWEtfTHN0cm9rZSAtLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTCBXSVRIIFNUUk9LRQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zb2xhcmlzL2NsYXNzZXMvc3VuL2F3dC9YMTEvWFdpbmRvdy5qYXZhIGIvamRrL3NyYy9zb2xhcmlzL2NsYXNzZXMvc3VuL2F3dC9YMTEvWFdpbmRvdy5qYXZhCmluZGV4IGE0YzAzOWMuLjBlZWJiZDQgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc29sYXJpcy9jbGFzc2VzL3N1bi9hd3QvWDExL1hXaW5kb3cuamF2YQorKysgYi9qZGsvc3JjL3NvbGFyaXMvY2xhc3Nlcy9zdW4vYXd0L1gxMS9YV2luZG93LmphdmEKQEAgLTExMTUsNyArMTExNSwxMCBAQAogICAgICAgICAvLyAgKDEpIGVpdGhlciBYSU0gY291bGQgbm90IGhhbmRsZSBpdCBvcgogICAgICAgICAvLyAgKDIpIGl0IHdhcyBMYXRpbiAxOjEgbWFwcGluZy4KICAgICAgICAgLy8KLSAgICAgICAgWEtleXN5bS5LZXlzeW0ySmF2YUtleWNvZGUgamtjID0gWEtleXN5bS5nZXRKYXZhS2V5Y29kZShldik7CisgICAgICAgIC8vIFByZXNlcnZlIG1vZGlmaWVycyB0byBnZXQgSmF2YSBrZXkgY29kZSBmb3IgZGVhZCBrZXlzCisgICAgICAgIGJvb2xlYW4gaXNEZWFkS2V5ID0gaXNEZWFkS2V5KGtleXN5bVswXSk7CisgICAgICAgIFhLZXlzeW0uS2V5c3ltMkphdmFLZXljb2RlIGprYyA9IGlzRGVhZEtleSA/IFhLZXlzeW0uZ2V0SmF2YUtleWNvZGUoa2V5c3ltWzBdKQorICAgICAgICAgICAgICAgIDogWEtleXN5bS5nZXRKYXZhS2V5Y29kZShldik7CiAgICAgICAgIGlmKCBqa2MgPT0gbnVsbCApIHsKICAgICAgICAgICAgIGprYyA9IG5ldyBYS2V5c3ltLktleXN5bTJKYXZhS2V5Y29kZShqYXZhLmF3dC5ldmVudC5LZXlFdmVudC5WS19VTkRFRklORUQsIGphdmEuYXd0LmV2ZW50LktleUV2ZW50LktFWV9MT0NBVElPTl9VTktOT1dOKTsKICAgICAgICAgfQpAQCAtMTE0MSw3ICsxMTQ0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamtjLmdldEphdmFLZXljb2RlKCk7CiAgICAgICAgIHBvc3RLZXlFdmVudCggamF2YS5hd3QuZXZlbnQuS2V5RXZlbnQuS0VZX1BSRVNTRUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2LmdldF90aW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGprZXlUb1JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaXNEZWFkS2V5ID8gamtleUV4dGVuZGVkIDogamtleVRvUmV0dXJuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAodW5pY29kZUtleSA9PSAwID8gamF2YS5hd3QuZXZlbnQuS2V5RXZlbnQuQ0hBUl9VTkRFRklORUQgOiB1bmljb2RlS2V5KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgamtjLmdldEtleUxvY2F0aW9uKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2LmdldF9zdGF0ZSgpLGV2LmdldFBEYXRhKCksIFhLZXlFdmVudC5nZXRTaXplKCksIChsb25nKShldi5nZXRfa2V5Y29kZSgpKSwKQEAgLTExNDksNyArMTE1Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgIGprZXlFeHRlbmRlZCk7CiAKIAotICAgICAgICBpZiggdW5pY29kZUtleSA+IDAgKSB7CisgICAgICAgIGlmICh1bmljb2RlS2V5ID4gMCAmJiAhaXNEZWFkS2V5KSB7CiAgICAgICAgICAgICAgICAga2V5RXZlbnRMb2cuZmluZSgiZmlyZSBfVFlQRUQgb24gIit1bmljb2RlS2V5KTsKICAgICAgICAgICAgICAgICBwb3N0S2V5RXZlbnQoIGphdmEuYXd0LmV2ZW50LktleUV2ZW50LktFWV9UWVBFRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2LmdldF90aW1lKCksCkBAIC0xMTc2LDkgKzExNzksNyBAQAogICAgIH0KICAgICAvLyB1bi1wcml2YXRlIGl0IGlmIHlvdSBuZWVkIHRvIGNhbGwgaXQgZnJvbSBlbHNld2hlcmUKICAgICBwcml2YXRlIHZvaWQgaGFuZGxlS2V5UmVsZWFzZShYS2V5RXZlbnQgZXYpIHsKLSAgICAgICAgbG9uZyBrZXlzeW1bXSA9IG5ldyBsb25nWzJdOwogICAgICAgICBpbnQgdW5pY29kZUtleSA9IDA7Ci0gICAgICAgIGtleXN5bVswXSA9IFhDb25zdGFudHMuTm9TeW1ib2w7CiAKICAgICAgICAgaWYgKGtleUV2ZW50TG9nLmlzTG9nZ2FibGUoUGxhdGZvcm1Mb2dnZXIuRklORSkpIHsKICAgICAgICAgICAgIGxvZ0luY29taW5nS2V5RXZlbnQoIGV2ICk7CkBAIC0xMTg3LDcgKzExODgsMTEgQEAKICAgICAgICAgLy8gYW5kIEphdmEgS2V5RXZlbnQga2V5Y29kZSBzaG91bGQgYmUgY2FsY3VsYXRlZC4KICAgICAgICAgLy8gRm9yIHJlbGVhc2Ugd2Ugc2hvdWxkIHBvc3QgcmVsZWFzZWQgZXZlbnQuCiAgICAgICAgIC8vCi0gICAgICAgIFhLZXlzeW0uS2V5c3ltMkphdmFLZXljb2RlIGprYyA9IFhLZXlzeW0uZ2V0SmF2YUtleWNvZGUoZXYpOworICAgICAgICAvLyBQcmVzZXJ2ZSBtb2RpZmllcnMgdG8gZ2V0IEphdmEga2V5IGNvZGUgZm9yIGRlYWQga2V5cworICAgICAgICBsb25nIGtleXN5bSA9IHhrZXljb2RlVG9LZXlzeW0oZXYpOworICAgICAgICBib29sZWFuIGlzRGVhZEtleSA9IGlzRGVhZEtleShrZXlzeW0pOworICAgICAgICBYS2V5c3ltLktleXN5bTJKYXZhS2V5Y29kZSBqa2MgPSBpc0RlYWRLZXkgPyBYS2V5c3ltLmdldEphdmFLZXljb2RlKGtleXN5bSkKKyAgICAgICAgICAgICAgICA6IFhLZXlzeW0uZ2V0SmF2YUtleWNvZGUoZXYpOwogICAgICAgICBpZiggamtjID09IG51bGwgKSB7CiAgICAgICAgICAgICBqa2MgPSBuZXcgWEtleXN5bS5LZXlzeW0ySmF2YUtleWNvZGUoamF2YS5hd3QuZXZlbnQuS2V5RXZlbnQuVktfVU5ERUZJTkVELCBqYXZhLmF3dC5ldmVudC5LZXlFdmVudC5LRVlfTE9DQVRJT05fVU5LTk9XTik7CiAgICAgICAgIH0KQEAgLTEyMTksNyArMTIyNCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGprYy5nZXRKYXZhS2V5Y29kZSgpOwogICAgICAgICBwb3N0S2V5RXZlbnQoICBqYXZhLmF3dC5ldmVudC5LZXlFdmVudC5LRVlfUkVMRUFTRUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2LmdldF90aW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGprZXlUb1JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaXNEZWFkS2V5ID8gamtleUV4dGVuZGVkIDogamtleVRvUmV0dXJuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAodW5pY29kZUtleSA9PSAwID8gamF2YS5hd3QuZXZlbnQuS2V5RXZlbnQuQ0hBUl9VTkRFRklORUQgOiB1bmljb2RlS2V5KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgamtjLmdldEtleUxvY2F0aW9uKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2LmdldF9zdGF0ZSgpLGV2LmdldFBEYXRhKCksIFhLZXlFdmVudC5nZXRTaXplKCksIChsb25nKShldi5nZXRfa2V5Y29kZSgpKSwKQEAgLTEyMjksNiArMTIzNCwxMSBAQAogCiAgICAgfQogCisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNEZWFkS2V5KGxvbmcga2V5c3ltKXsKKyAgICAgICAgcmV0dXJuIFhLZXlTeW1Db25zdGFudHMuWEtfZGVhZF9ncmF2ZSA8PSBrZXlzeW0gJiYga2V5c3ltIDw9IFhLZXlTeW1Db25zdGFudHMuWEtfZGVhZF9zZW1pdm9pY2VkX3NvdW5kOworICAgIH0KKwogICAgIC8qCiAgICAgICogWG1OaWNvbmljIGFuZCBNYXAvVW5tYXBOb3RpZnkgKHRoYXQgWG1OaWNvbmljIHJlbGllcyBvbikgYXJlCiAgICAgICogdW5yZWxpYWJsZSwgc2luY2UgbWFwcGluZyBjaGFuZ2VzIGNhbiBoYXBwZW4gZm9yIGEgdmlydHVhbCBkZXNrdG9wCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NvbGFyaXMvY2xhc3Nlcy9zdW4vYXd0L1gxMS9rZXlzeW0ydWNzLmggYi9qZGsvc3JjL3NvbGFyaXMvY2xhc3Nlcy9zdW4vYXd0L1gxMS9rZXlzeW0ydWNzLmgKaW5kZXggZGViN2E4ZC4uZjgxNjg4NyAxMDA2NDQKLS0tIGEvamRrL3NyYy9zb2xhcmlzL2NsYXNzZXMvc3VuL2F3dC9YMTEva2V5c3ltMnVjcy5oCisrKyBiL2pkay9zcmMvc29sYXJpcy9jbGFzc2VzL3N1bi9hd3QvWDExL2tleXN5bTJ1Y3MuaApAQCAtNjk1LDI1ICs2OTUsMjUgQEAKIDB4MDAwMCAjZGVmaW5lICAgIFhLX0lTT19DZW50ZXJfT2JqZWN0ICAgICAgICAgICAgICAgIDB4RkUzMwogMHgwMDAwICNkZWZpbmUgICAgWEtfSVNPX0VudGVyICAgICAgICAgICAgICAgICAgICAweEZFMzQKIAotMHgwMDAwICNkZWZpbmUgICAgWEtfZGVhZF9ncmF2ZSAgICAgICAgICAgICAgICAgICAgMHhGRTUwCi0weDAwMDAgI2RlZmluZSAgICBYS19kZWFkX2FjdXRlICAgICAgICAgICAgICAgICAgICAweEZFNTEKLTB4MDAwMCAjZGVmaW5lICAgIFhLX2RlYWRfY2lyY3VtZmxleCAgICAgICAgICAgICAgICAweEZFNTIKLTB4MDAwMCAjZGVmaW5lICAgIFhLX2RlYWRfdGlsZGUgICAgICAgICAgICAgICAgICAgIDB4RkU1MwotMHgwMDAwICNkZWZpbmUgICAgWEtfZGVhZF9tYWNyb24gICAgICAgICAgICAgICAgICAgIDB4RkU1NAotMHgwMDAwICNkZWZpbmUgICAgWEtfZGVhZF9icmV2ZSAgICAgICAgICAgICAgICAgICAgMHhGRTU1Ci0weDAwMDAgI2RlZmluZSAgICBYS19kZWFkX2Fib3ZlZG90ICAgICAgICAgICAgICAgIDB4RkU1NgotMHgwMDAwICNkZWZpbmUgICAgWEtfZGVhZF9kaWFlcmVzaXMgICAgICAgICAgICAgICAgMHhGRTU3Ci0weDAwMDAgI2RlZmluZSAgICBYS19kZWFkX2Fib3ZlcmluZyAgICAgICAgICAgICAgICAweEZFNTgKLTB4MDAwMCAjZGVmaW5lICAgIFhLX2RlYWRfZG91YmxlYWN1dGUgICAgICAgICAgICAgICAgMHhGRTU5Ci0weDAwMDAgI2RlZmluZSAgICBYS19kZWFkX2Nhcm9uICAgICAgICAgICAgICAgICAgICAweEZFNUEKLTB4MDAwMCAjZGVmaW5lICAgIFhLX2RlYWRfY2VkaWxsYSAgICAgICAgICAgICAgICAgICAgMHhGRTVCCi0weDAwMDAgI2RlZmluZSAgICBYS19kZWFkX29nb25layAgICAgICAgICAgICAgICAgICAgMHhGRTVDCi0weDAwMDAgI2RlZmluZSAgICBYS19kZWFkX2lvdGEgICAgICAgICAgICAgICAgICAgIDB4RkU1RAotMHgwMDAwICNkZWZpbmUgICAgWEtfZGVhZF92b2ljZWRfc291bmQgICAgICAgICAgICAgICAgMHhGRTVFCi0weDAwMDAgI2RlZmluZSAgICBYS19kZWFkX3NlbWl2b2ljZWRfc291bmQgICAgICAgICAgICAweEZFNUYKLTB4MDAwMCAjZGVmaW5lICAgIFhLX2RlYWRfYmVsb3dkb3QgICAgICAgICAgICAgICAgMHhGRTYwCi0weDAwMDAgI2RlZmluZSBYS19kZWFkX2hvb2sgICAgICAgICAgICAgICAgICAgIDB4RkU2MQotMHgwMDAwICNkZWZpbmUgWEtfZGVhZF9ob3JuICAgICAgICAgICAgICAgICAgICAweEZFNjIKKzB4MDJDQiAjZGVmaW5lICAgIFhLX2RlYWRfZ3JhdmUgICAgICAgICAgICAgICAgICAgIDB4RkU1MAorMHgwMkNBICNkZWZpbmUgICAgWEtfZGVhZF9hY3V0ZSAgICAgICAgICAgICAgICAgICAgMHhGRTUxCisweDAyQzYgI2RlZmluZSAgICBYS19kZWFkX2NpcmN1bWZsZXggICAgICAgICAgICAgICAgMHhGRTUyCisweDAyREMgI2RlZmluZSAgICBYS19kZWFkX3RpbGRlICAgICAgICAgICAgICAgICAgICAweEZFNTMKKzB4MDJDOSAjZGVmaW5lICAgIFhLX2RlYWRfbWFjcm9uICAgICAgICAgICAgICAgICAgICAweEZFNTQKKzB4MDJEOCAjZGVmaW5lICAgIFhLX2RlYWRfYnJldmUgICAgICAgICAgICAgICAgICAgIDB4RkU1NQorMHgwMkQ5ICNkZWZpbmUgICAgWEtfZGVhZF9hYm92ZWRvdCAgICAgICAgICAgICAgICAweEZFNTYKKzB4MDBBOCAjZGVmaW5lICAgIFhLX2RlYWRfZGlhZXJlc2lzICAgICAgICAgICAgICAgIDB4RkU1NworMHgwMkRBICNkZWZpbmUgICAgWEtfZGVhZF9hYm92ZXJpbmcgICAgICAgICAgICAgICAgMHhGRTU4CisweDAyREQgI2RlZmluZSAgICBYS19kZWFkX2RvdWJsZWFjdXRlICAgICAgICAgICAgICAgIDB4RkU1OQorMHgwMkM3ICNkZWZpbmUgICAgWEtfZGVhZF9jYXJvbiAgICAgICAgICAgICAgICAgICAgMHhGRTVBCisweDAwQjggI2RlZmluZSAgICBYS19kZWFkX2NlZGlsbGEgICAgICAgICAgICAgICAgICAgIDB4RkU1QgorMHgwMkRCICNkZWZpbmUgICAgWEtfZGVhZF9vZ29uZWsgICAgICAgICAgICAgICAgICAgIDB4RkU1QworMHgwMjY5ICNkZWZpbmUgICAgWEtfZGVhZF9pb3RhICAgICAgICAgICAgICAgICAgICAweEZFNUQKKzB4MzA5OSAjZGVmaW5lICAgIFhLX2RlYWRfdm9pY2VkX3NvdW5kICAgICAgICAgICAgICAgIDB4RkU1RQorMHgzMDlBICNkZWZpbmUgICAgWEtfZGVhZF9zZW1pdm9pY2VkX3NvdW5kICAgICAgICAgICAgMHhGRTVGCisweDAzMjMgI2RlZmluZSAgICBYS19kZWFkX2JlbG93ZG90ICAgICAgICAgICAgICAgIDB4RkU2MAorMHgwMzIxICNkZWZpbmUgWEtfZGVhZF9ob29rICAgICAgICAgICAgICAgICAgICAweEZFNjEKKzB4MDMxQiAjZGVmaW5lIFhLX2RlYWRfaG9ybiAgICAgICAgICAgICAgICAgICAgMHhGRTYyCiAKIDB4MDAwMCAjZGVmaW5lICAgIFhLX0ZpcnN0X1ZpcnR1YWxfU2NyZWVuICAgICAgICAgICAgICAgIDB4RkVEMAogMHgwMDAwICNkZWZpbmUgICAgWEtfUHJldl9WaXJ0dWFsX1NjcmVlbiAgICAgICAgICAgICAgICAweEZFRDEKQEAgLTI0NjYsNiArMjQ2Niw3IEBACiB0b2phdmEgICAgICAgICBrZXlzeW0ySmF2YUtleWNvZGVIYXNoLnB1dCggTG9uZy52YWx1ZU9mKFhLZXlTeW1Db25zdGFudHMuWEtfTWV0YV9MKSwgICAgIG5ldyBLZXlzeW0ySmF2YUtleWNvZGUoamF2YS5hd3QuZXZlbnQuS2V5RXZlbnQuVktfTUVUQSwgamF2YS5hd3QuZXZlbnQuS2V5RXZlbnQuS0VZX0xPQ0FUSU9OX0xFRlQpKTsKIHRvamF2YSAgICAgICAgIGtleXN5bTJKYXZhS2V5Y29kZUhhc2gucHV0KCBMb25nLnZhbHVlT2YoWEtleVN5bUNvbnN0YW50cy5YS19NZXRhX1IpLCAgICAgbmV3IEtleXN5bTJKYXZhS2V5Y29kZShqYXZhLmF3dC5ldmVudC5LZXlFdmVudC5WS19NRVRBLCBqYXZhLmF3dC5ldmVudC5LZXlFdmVudC5LRVlfTE9DQVRJT05fUklHSFQpKTsKIHRvamF2YSAgICAgICAgIGtleXN5bTJKYXZhS2V5Y29kZUhhc2gucHV0KCBMb25nLnZhbHVlT2YoWEtleVN5bUNvbnN0YW50cy5YS19DYXBzX0xvY2spLCAgICAgbmV3IEtleXN5bTJKYXZhS2V5Y29kZShqYXZhLmF3dC5ldmVudC5LZXlFdmVudC5WS19DQVBTX0xPQ0ssIGphdmEuYXd0LmV2ZW50LktleUV2ZW50LktFWV9MT0NBVElPTl9TVEFOREFSRCkpOwordG9qYXZhICAgICAgICAga2V5c3ltMkphdmFLZXljb2RlSGFzaC5wdXQoIExvbmcudmFsdWVPZihYS2V5U3ltQ29uc3RhbnRzLlhLX1NoaWZ0X0xvY2spLCAgICAgbmV3IEtleXN5bTJKYXZhS2V5Y29kZShqYXZhLmF3dC5ldmVudC5LZXlFdmVudC5WS19DQVBTX0xPQ0ssIGphdmEuYXd0LmV2ZW50LktleUV2ZW50LktFWV9MT0NBVElPTl9TVEFOREFSRCkpOwogdG9qYXZhCiB0b2phdmEgICAgICAgICAgICAgLyogTWlzYyBGdW5jdGlvbnMgKi8KIHRvamF2YSAgICAgICAgIGtleXN5bTJKYXZhS2V5Y29kZUhhc2gucHV0KCBMb25nLnZhbHVlT2YoWEtleVN5bUNvbnN0YW50cy5YS19QcmludCksICAgICBuZXcgS2V5c3ltMkphdmFLZXljb2RlKGphdmEuYXd0LmV2ZW50LktleUV2ZW50LlZLX1BSSU5UU0NSRUVOLCBqYXZhLmF3dC5ldmVudC5LZXlFdmVudC5LRVlfTE9DQVRJT05fU1RBTkRBUkQpKTsKQEAgLTI2NDAsNiArMjY0MSwyMSBAQAogdG9qYXZhICAgICAgICAga2V5c3ltMkphdmFLZXljb2RlSGFzaC5wdXQoIExvbmcudmFsdWVPZihYS2V5U3ltQ29uc3RhbnRzLlhLX0thbmppKSwgICAgIG5ldyBLZXlzeW0ySmF2YUtleWNvZGUoamF2YS5hd3QuZXZlbnQuS2V5RXZlbnQuVktfQ09OVkVSVCwgamF2YS5hd3QuZXZlbnQuS2V5RXZlbnQuS0VZX0xPQ0FUSU9OX1NUQU5EQVJEKSk7CiB0b2phdmEgICAgICAgICAgICAgLyogVHlwZSA1YyBKYXBhbmVzZSBrZXlib2FyZDogbmlob25nbyAqLwogdG9qYXZhICAgICAgICAga2V5c3ltMkphdmFLZXljb2RlSGFzaC5wdXQoIExvbmcudmFsdWVPZihYS2V5U3ltQ29uc3RhbnRzLlhLX0hlbmthbl9Nb2RlKSwgICAgIG5ldyBLZXlzeW0ySmF2YUtleWNvZGUoamF2YS5hd3QuZXZlbnQuS2V5RXZlbnQuVktfSU5QVVRfTUVUSE9EX09OX09GRiwgamF2YS5hd3QuZXZlbnQuS2V5RXZlbnQuS0VZX0xPQ0FUSU9OX1NUQU5EQVJEKSk7Cit0b2phdmEgICAgICAgICBrZXlzeW0ySmF2YUtleWNvZGVIYXNoLnB1dCggTG9uZy52YWx1ZU9mKFhLZXlTeW1Db25zdGFudHMuWEtfRWlzdV9TaGlmdCAgICksIG5ldyBLZXlzeW0ySmF2YUtleWNvZGUoamF2YS5hd3QuZXZlbnQuS2V5RXZlbnQuVktfQUxQSEFOVU1FUklDICAgICAgICwgamF2YS5hd3QuZXZlbnQuS2V5RXZlbnQuS0VZX0xPQ0FUSU9OX1NUQU5EQVJEKSk7Cit0b2phdmEgICAgICAgICBrZXlzeW0ySmF2YUtleWNvZGVIYXNoLnB1dCggTG9uZy52YWx1ZU9mKFhLZXlTeW1Db25zdGFudHMuWEtfRWlzdV90b2dnbGUgICksIG5ldyBLZXlzeW0ySmF2YUtleWNvZGUoamF2YS5hd3QuZXZlbnQuS2V5RXZlbnQuVktfQUxQSEFOVU1FUklDICAgICAgICwgamF2YS5hd3QuZXZlbnQuS2V5RXZlbnQuS0VZX0xPQ0FUSU9OX1NUQU5EQVJEKSk7Cit0b2phdmEgICAgICAgICBrZXlzeW0ySmF2YUtleWNvZGVIYXNoLnB1dCggTG9uZy52YWx1ZU9mKFhLZXlTeW1Db25zdGFudHMuWEtfWmVua2FrdSAgICAgICksIG5ldyBLZXlzeW0ySmF2YUtleWNvZGUoamF2YS5hd3QuZXZlbnQuS2V5RXZlbnQuVktfRlVMTF9XSURUSCAgICAgICAgICwgamF2YS5hd3QuZXZlbnQuS2V5RXZlbnQuS0VZX0xPQ0FUSU9OX1NUQU5EQVJEKSk7Cit0b2phdmEgICAgICAgICBrZXlzeW0ySmF2YUtleWNvZGVIYXNoLnB1dCggTG9uZy52YWx1ZU9mKFhLZXlTeW1Db25zdGFudHMuWEtfSGFua2FrdSAgICAgICksIG5ldyBLZXlzeW0ySmF2YUtleWNvZGUoamF2YS5hd3QuZXZlbnQuS2V5RXZlbnQuVktfSEFMRl9XSURUSCAgICAgICAgICwgamF2YS5hd3QuZXZlbnQuS2V5RXZlbnQuS0VZX0xPQ0FUSU9OX1NUQU5EQVJEKSk7Cit0b2phdmEgICAgICAgICBrZXlzeW0ySmF2YUtleWNvZGVIYXNoLnB1dCggTG9uZy52YWx1ZU9mKFhLZXlTeW1Db25zdGFudHMuWEtfSGlyYWdhbmEgICAgICksIG5ldyBLZXlzeW0ySmF2YUtleWNvZGUoamF2YS5hd3QuZXZlbnQuS2V5RXZlbnQuVktfSElSQUdBTkEgICAgICAgICAgICwgamF2YS5hd3QuZXZlbnQuS2V5RXZlbnQuS0VZX0xPQ0FUSU9OX1NUQU5EQVJEKSk7Cit0b2phdmEgICAgICAgICBrZXlzeW0ySmF2YUtleWNvZGVIYXNoLnB1dCggTG9uZy52YWx1ZU9mKFhLZXlTeW1Db25zdGFudHMuWEtfS2F0YWthbmEgICAgICksIG5ldyBLZXlzeW0ySmF2YUtleWNvZGUoamF2YS5hd3QuZXZlbnQuS2V5RXZlbnQuVktfS0FUQUtBTkEgICAgICAgICAgICwgamF2YS5hd3QuZXZlbnQuS2V5RXZlbnQuS0VZX0xPQ0FUSU9OX1NUQU5EQVJEKSk7Cit0b2phdmEgICAgICAgICBrZXlzeW0ySmF2YUtleWNvZGVIYXNoLnB1dCggTG9uZy52YWx1ZU9mKFhLZXlTeW1Db25zdGFudHMuWEtfUm9tYWppICAgICAgICksIG5ldyBLZXlzeW0ySmF2YUtleWNvZGUoamF2YS5hd3QuZXZlbnQuS2V5RXZlbnQuVktfSkFQQU5FU0VfUk9NQU4gICAgICwgamF2YS5hd3QuZXZlbnQuS2V5RXZlbnQuS0VZX0xPQ0FUSU9OX1NUQU5EQVJEKSk7Cit0b2phdmEgICAgICAgICBrZXlzeW0ySmF2YUtleWNvZGVIYXNoLnB1dCggTG9uZy52YWx1ZU9mKFhLZXlTeW1Db25zdGFudHMuWEtfS2FuYV9TaGlmdCAgICksIG5ldyBLZXlzeW0ySmF2YUtleWNvZGUoamF2YS5hd3QuZXZlbnQuS2V5RXZlbnQuVktfS0FOQSAgICAgICAgICAgICAgICwgamF2YS5hd3QuZXZlbnQuS2V5RXZlbnQuS0VZX0xPQ0FUSU9OX1NUQU5EQVJEKSk7Cit0b2phdmEgICAgICAgICBrZXlzeW0ySmF2YUtleWNvZGVIYXNoLnB1dCggTG9uZy52YWx1ZU9mKFhLZXlTeW1Db25zdGFudHMuWEtfS2FuYV9Mb2NrICAgICksIG5ldyBLZXlzeW0ySmF2YUtleWNvZGUoamF2YS5hd3QuZXZlbnQuS2V5RXZlbnQuVktfS0FOQV9MT0NLICAgICAgICAgICwgamF2YS5hd3QuZXZlbnQuS2V5RXZlbnQuS0VZX0xPQ0FUSU9OX1NUQU5EQVJEKSk7Cit0b2phdmEgICAgICAgICBrZXlzeW0ySmF2YUtleWNvZGVIYXNoLnB1dCggTG9uZy52YWx1ZU9mKFhLZXlTeW1Db25zdGFudHMuWEtfTXVoZW5rYW4gICAgICksIG5ldyBLZXlzeW0ySmF2YUtleWNvZGUoamF2YS5hd3QuZXZlbnQuS2V5RXZlbnQuVktfTk9OQ09OVkVSVCAgICAgICAgICwgamF2YS5hd3QuZXZlbnQuS2V5RXZlbnQuS0VZX0xPQ0FUSU9OX1NUQU5EQVJEKSk7Cit0b2phdmEgICAgICAgICBrZXlzeW0ySmF2YUtleWNvZGVIYXNoLnB1dCggTG9uZy52YWx1ZU9mKFhLZXlTeW1Db25zdGFudHMuWEtfWmVuX0tvaG8gICAgICksIG5ldyBLZXlzeW0ySmF2YUtleWNvZGUoamF2YS5hd3QuZXZlbnQuS2V5RXZlbnQuVktfQUxMX0NBTkRJREFURVMgICAgICwgamF2YS5hd3QuZXZlbnQuS2V5RXZlbnQuS0VZX0xPQ0FUSU9OX1NUQU5EQVJEKSk7Cit0b2phdmEgICAgICAgICBrZXlzeW0ySmF2YUtleWNvZGVIYXNoLnB1dCggTG9uZy52YWx1ZU9mKFhLZXlTeW1Db25zdGFudHMuWEtfS2FuamlfQmFuZ291ICksIG5ldyBLZXlzeW0ySmF2YUtleWNvZGUoamF2YS5hd3QuZXZlbnQuS2V5RXZlbnQuVktfQ09ERV9JTlBVVCAgICAgICAgICwgamF2YS5hd3QuZXZlbnQuS2V5RXZlbnQuS0VZX0xPQ0FUSU9OX1NUQU5EQVJEKSk7Cit0b2phdmEgICAgICAgICBrZXlzeW0ySmF2YUtleWNvZGVIYXNoLnB1dCggTG9uZy52YWx1ZU9mKFhLZXlTeW1Db25zdGFudHMuWEtfTWFlX0tvaG8gICAgICksIG5ldyBLZXlzeW0ySmF2YUtleWNvZGUoamF2YS5hd3QuZXZlbnQuS2V5RXZlbnQuVktfUFJFVklPVVNfQ0FORElEQVRFICwgamF2YS5hd3QuZXZlbnQuS2V5RXZlbnQuS0VZX0xPQ0FUSU9OX1NUQU5EQVJEKSk7Cit0b2phdmEKK3RvamF2YQogdG9qYXZhICAgICAgICAgICAgIC8qIFZLX0tBTkFfTE9DSyBpcyBoYW5kbGVkIHNlcGFyYXRlbHkgYmVjYXVzZSBpdCBnZW5lcmF0ZXMgdGhlCiB0b2phdmEgICAgICAgICAgICAgICogc2FtZSBrZXlzeW0gYXMgQUxUX0dSQVBIIGluIHNwaXRlIG9mIGl0cyBkaWZmZXJlbnQgYmVoYXZpb3IuCiB0b2phdmEgICAgICAgICAgICAgICovCmRpZmYgLS1naXQgYS9qZGsvc3JjL3NvbGFyaXMvbmF0aXZlL2NvbS9zdW4vc2VjdXJpdHkvYXV0aC9tb2R1bGUvVW5peC5jIGIvamRrL3NyYy9zb2xhcmlzL25hdGl2ZS9jb20vc3VuL3NlY3VyaXR5L2F1dGgvbW9kdWxlL1VuaXguYwppbmRleCA2NzdhNzBiLi5mZWMwMjBiIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NvbGFyaXMvbmF0aXZlL2NvbS9zdW4vc2VjdXJpdHkvYXV0aC9tb2R1bGUvVW5peC5jCisrKyBiL2pkay9zcmMvc29sYXJpcy9uYXRpdmUvY29tL3N1bi9zZWN1cml0eS9hdXRoL21vZHVsZS9Vbml4LmMKQEAgLTQ3LDgzICs0Nyw1MyBAQAogICAgIGpzaXplIG51bVN1cHBHcm91cHMgPSBnZXRncm91cHMoMCwgTlVMTCk7CiAgICAgZ2lkX3QgKmdyb3VwcyA9IChnaWRfdCAqKWNhbGxvYyhudW1TdXBwR3JvdXBzLCBzaXplb2YoZ2lkX3QpKTsKIAotICAgIGpmaWVsZElEIGZpZDsKKyAgICBqZmllbGRJRCB1c2VyTmFtZUlEOworICAgIGpmaWVsZElEIHVzZXJJRDsKKyAgICBqZmllbGRJRCBncm91cElEOworICAgIGpmaWVsZElEIHN1cHBsZW1lbnRhcnlHcm91cElEOworCiAgICAganN0cmluZyBqc3RyOwogICAgIGpsb25nQXJyYXkgamdyb3VwczsKICAgICBqbG9uZyAqamdyb3Vwc0FzQXJyYXk7CiAgICAgamNsYXNzIGNscyA9ICgqZW52KS0+R2V0T2JqZWN0Q2xhc3MoZW52LCBvYmopOwogCiAgICAgbWVtc2V0KHB3ZF9idWYsIDAsIHNpemVvZihwd2RfYnVmKSk7CisKICAgICBpZiAoZ2V0cHd1aWRfcihnZXR1aWQoKSwgJnJlc2J1ZiwgcHdkX2J1Ziwgc2l6ZW9mKHB3ZF9idWYpLCAmcHdkKSA9PSAwICYmCiAgICAgICAgIHB3ZCAhPSBOVUxMICYmCiAgICAgICAgIGdldGdyb3VwcyhudW1TdXBwR3JvdXBzLCBncm91cHMpICE9IC0xKSB7CiAKLSAgICAgICAgLyoKLSAgICAgICAgICogc2V0IHVzZXJuYW1lCi0gICAgICAgICAqLwotICAgICAgICBmaWQgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBjbHMsICJ1c2VybmFtZSIsICJMamF2YS9sYW5nL1N0cmluZzsiKTsKLSAgICAgICAgaWYgKGZpZCA9PSAwKSB7Ci0gICAgICAgICAgICBqY2xhc3MgbmV3RXhjQ2xzID0KLSAgICAgICAgICAgICAgICAoKmVudiktPkZpbmRDbGFzcyhlbnYsICJqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIik7Ci0gICAgICAgICAgICBpZiAobmV3RXhjQ2xzID09IDApIHsKLSAgICAgICAgICAgICAgICAvKiBVbmFibGUgdG8gZmluZCB0aGUgbmV3IGV4Y2VwdGlvbiBjbGFzcywgZ2l2ZSB1cC4gKi8KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAoKmVudiktPlRocm93TmV3KGVudiwgbmV3RXhjQ2xzLCAiaW52YWxpZCBmaWVsZDogdXNlcm5hbWUiKTsKLSAgICAgICAgfQorICAgICAgICB1c2VyTmFtZUlEID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgY2xzLCAidXNlcm5hbWUiLCAiTGphdmEvbGFuZy9TdHJpbmc7Iik7CisgICAgICAgIGlmICh1c2VyTmFtZUlEID09IDApCisgICAgICAgICAgICBnb3RvIGNsZWFuVXBBbmRSZXR1cm47CisKKyAgICAgICAgdXNlcklEID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgY2xzLCAidWlkIiwgIkoiKTsKKyAgICAgICAgaWYgKHVzZXJJRCA9PSAwKQorICAgICAgICAgICAgZ290byBjbGVhblVwQW5kUmV0dXJuOworCisgICAgICAgIGdyb3VwSUQgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBjbHMsICJnaWQiLCAiSiIpOworICAgICAgICBpZiAoZ3JvdXBJRCA9PSAwKQorICAgICAgICAgICAgZ290byBjbGVhblVwQW5kUmV0dXJuOworCisgICAgICAgIHN1cHBsZW1lbnRhcnlHcm91cElEID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgY2xzLCAiZ3JvdXBzIiwgIltKIik7CisgICAgICAgIGlmIChzdXBwbGVtZW50YXJ5R3JvdXBJRCA9PSAwKQorICAgICAgICAgICAgZ290byBjbGVhblVwQW5kUmV0dXJuOworCiAgICAgICAgIGpzdHIgPSAoKmVudiktPk5ld1N0cmluZ1VURihlbnYsIHB3ZC0+cHdfbmFtZSk7Ci0gICAgICAgICgqZW52KS0+U2V0T2JqZWN0RmllbGQoZW52LCBvYmosIGZpZCwganN0cik7CisgICAgICAgICgqZW52KS0+U2V0T2JqZWN0RmllbGQoZW52LCBvYmosIHVzZXJOYW1lSUQsIGpzdHIpOwogCi0gICAgICAgIC8qCi0gICAgICAgICAqIHNldCB1aWQKLSAgICAgICAgICovCi0gICAgICAgIGZpZCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGNscywgInVpZCIsICJKIik7Ci0gICAgICAgIGlmIChmaWQgPT0gMCkgewotICAgICAgICAgICAgamNsYXNzIG5ld0V4Y0NscyA9Ci0gICAgICAgICAgICAgICAgKCplbnYpLT5GaW5kQ2xhc3MoZW52LCAiamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIpOwotICAgICAgICAgICAgaWYgKG5ld0V4Y0NscyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgLyogVW5hYmxlIHRvIGZpbmQgdGhlIG5ldyBleGNlcHRpb24gY2xhc3MsIGdpdmUgdXAuICovCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgKCplbnYpLT5UaHJvd05ldyhlbnYsIG5ld0V4Y0NscywgImludmFsaWQgZmllbGQ6IHVzZXJuYW1lIik7Ci0gICAgICAgIH0KLSAgICAgICAgKCplbnYpLT5TZXRMb25nRmllbGQoZW52LCBvYmosIGZpZCwgcHdkLT5wd191aWQpOworICAgICAgICAoKmVudiktPlNldExvbmdGaWVsZChlbnYsIG9iaiwgdXNlcklELCBwd2QtPnB3X3VpZCk7CiAKLSAgICAgICAgLyoKLSAgICAgICAgICogc2V0IGdpZAotICAgICAgICAgKi8KLSAgICAgICAgZmlkID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgY2xzLCAiZ2lkIiwgIkoiKTsKLSAgICAgICAgaWYgKGZpZCA9PSAwKSB7Ci0gICAgICAgICAgICBqY2xhc3MgbmV3RXhjQ2xzID0KLSAgICAgICAgICAgICAgICAoKmVudiktPkZpbmRDbGFzcyhlbnYsICJqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIik7Ci0gICAgICAgICAgICBpZiAobmV3RXhjQ2xzID09IDApIHsKLSAgICAgICAgICAgICAgICAvKiBVbmFibGUgdG8gZmluZCB0aGUgbmV3IGV4Y2VwdGlvbiBjbGFzcywgZ2l2ZSB1cC4gKi8KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAoKmVudiktPlRocm93TmV3KGVudiwgbmV3RXhjQ2xzLCAiaW52YWxpZCBmaWVsZDogdXNlcm5hbWUiKTsKLSAgICAgICAgfQotICAgICAgICAoKmVudiktPlNldExvbmdGaWVsZChlbnYsIG9iaiwgZmlkLCBwd2QtPnB3X2dpZCk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogc2V0IHN1cHBsZW1lbnRhcnkgZ3JvdXBzCi0gICAgICAgICAqLwotICAgICAgICBmaWQgPSAoKmVudiktPkdldEZpZWxkSUQoZW52LCBjbHMsICJncm91cHMiLCAiW0oiKTsKLSAgICAgICAgaWYgKGZpZCA9PSAwKSB7Ci0gICAgICAgICAgICBqY2xhc3MgbmV3RXhjQ2xzID0KLSAgICAgICAgICAgICAgICAoKmVudiktPkZpbmRDbGFzcyhlbnYsICJqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIik7Ci0gICAgICAgICAgICBpZiAobmV3RXhjQ2xzID09IDApIHsKLSAgICAgICAgICAgICAgICAvKiBVbmFibGUgdG8gZmluZCB0aGUgbmV3IGV4Y2VwdGlvbiBjbGFzcywgZ2l2ZSB1cC4gKi8KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAoKmVudiktPlRocm93TmV3KGVudiwgbmV3RXhjQ2xzLCAiaW52YWxpZCBmaWVsZDogdXNlcm5hbWUiKTsKLSAgICAgICAgfQorICAgICAgICAoKmVudiktPlNldExvbmdGaWVsZChlbnYsIG9iaiwgZ3JvdXBJRCwgcHdkLT5wd19naWQpOwogCiAgICAgICAgIGpncm91cHMgPSAoKmVudiktPk5ld0xvbmdBcnJheShlbnYsIG51bVN1cHBHcm91cHMpOwogICAgICAgICBqZ3JvdXBzQXNBcnJheSA9ICgqZW52KS0+R2V0TG9uZ0FycmF5RWxlbWVudHMoZW52LCBqZ3JvdXBzLCAwKTsKICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bVN1cHBHcm91cHM7IGkrKykKICAgICAgICAgICAgIGpncm91cHNBc0FycmF5W2ldID0gZ3JvdXBzW2ldOwogICAgICAgICAoKmVudiktPlJlbGVhc2VMb25nQXJyYXlFbGVtZW50cyhlbnYsIGpncm91cHMsIGpncm91cHNBc0FycmF5LCAwKTsKLSAgICAgICAgKCplbnYpLT5TZXRPYmplY3RGaWVsZChlbnYsIG9iaiwgZmlkLCBqZ3JvdXBzKTsKKyAgICAgICAgKCplbnYpLT5TZXRPYmplY3RGaWVsZChlbnYsIG9iaiwgc3VwcGxlbWVudGFyeUdyb3VwSUQsIGpncm91cHMpOwogICAgIH0KK2NsZWFuVXBBbmRSZXR1cm46CisgICAgZnJlZShncm91cHMpOwogICAgIHJldHVybjsKIH0KZGlmZiAtLWdpdCBhL2pkay9zcmMvc29sYXJpcy9uYXRpdmUvamF2YS9uZXQvUGxhaW5EYXRhZ3JhbVNvY2tldEltcGwuYyBiL2pkay9zcmMvc29sYXJpcy9uYXRpdmUvamF2YS9uZXQvUGxhaW5EYXRhZ3JhbVNvY2tldEltcGwuYwppbmRleCA0MGIzNzVkLi40MjQ5MzgyIDEwMDY0NAotLS0gYS9qZGsvc3JjL3NvbGFyaXMvbmF0aXZlL2phdmEvbmV0L1BsYWluRGF0YWdyYW1Tb2NrZXRJbXBsLmMKKysrIGIvamRrL3NyYy9zb2xhcmlzL25hdGl2ZS9qYXZhL25ldC9QbGFpbkRhdGFncmFtU29ja2V0SW1wbC5jCkBAIC0xMzE4LDEwICsxMzE4LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvYmplY3QgdmFsdWUpIHsKICAgICBpbnQgZmQ7CiAgICAgaW50IGxldmVsLCBvcHRuYW1lLCBvcHRsZW47Ci0gICAgdW5pb24gewotICAgICAgICBpbnQgaTsKLSAgICAgICAgY2hhciBjOwotICAgIH0gb3B0dmFsOworICAgIGludCBvcHR2YWw7CisgICAgb3B0bGVuID0gc2l6ZW9mKGludCk7CiAKICAgICAvKgogICAgICAqIENoZWNrIHRoYXQgc29ja2V0IGhhc24ndCBiZWVuIGNsb3NlZApAQCAtMTM4MSw4ICsxMzc5LDcgQEAKICAgICAgICAgICAgICAgICBmaWQgPSAgKCplbnYpLT5HZXRGaWVsZElEKGVudiwgY2xzLCAidmFsdWUiLCAiSSIpOwogICAgICAgICAgICAgICAgIENIRUNLX05VTEwoZmlkKTsKIAotICAgICAgICAgICAgICAgIG9wdHZhbC5pID0gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIHZhbHVlLCBmaWQpOwotICAgICAgICAgICAgICAgIG9wdGxlbiA9IHNpemVvZihvcHR2YWwuaSk7CisgICAgICAgICAgICAgICAgb3B0dmFsID0gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIHZhbHVlLCBmaWQpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCkBAIC0xNDAxLDggKzEzOTgsNyBAQAogICAgICAgICAgICAgICAgIG9uID0gKCplbnYpLT5HZXRCb29sZWFuRmllbGQoZW52LCB2YWx1ZSwgZmlkKTsKIAogICAgICAgICAgICAgICAgIC8qIFNPX1JFVVNFQUREUiBvciBTT19CUk9BRENBU1QgKi8KLSAgICAgICAgICAgICAgICBvcHR2YWwuaSA9IChvbiA/IDEgOiAwKTsKLSAgICAgICAgICAgICAgICBvcHRsZW4gPSBzaXplb2Yob3B0dmFsLmkpOworICAgICAgICAgICAgICAgIG9wdHZhbCA9IChvbiA/IDEgOiAwKTsKIAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy9zb2xhcmlzL25hdGl2ZS9zdW4vYXd0L2F3dF9HcmFwaGljc0Vudi5jIGIvamRrL3NyYy9zb2xhcmlzL25hdGl2ZS9zdW4vYXd0L2F3dF9HcmFwaGljc0Vudi5jCmluZGV4IDJjYzEyMmMuLjdhZTRjZGQgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvc29sYXJpcy9uYXRpdmUvc3VuL2F3dC9hd3RfR3JhcGhpY3NFbnYuYworKysgYi9qZGsvc3JjL3NvbGFyaXMvbmF0aXZlL3N1bi9hd3QvYXd0X0dyYXBoaWNzRW52LmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAxOTk3LCAyMDExLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC03NTMsNyArNzUzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihlcnJtc2cpLAogICAgICAgICAgICAgICAgICAgICAgIkNhbid0IGNvbm5lY3QgdG8gWDExIHdpbmRvdyBzZXJ2ZXIgdXNpbmcgJyVzJyBhcyB0aGUgdmFsdWUgb2YgdGhlIERJU1BMQVkgdmFyaWFibGUuIiwKICAgICAgICAgICAgICAgICAgICAgIChnZXRlbnYoIkRJU1BMQVkiKSA9PSBOVUxMKSA/ICI6MC4wIiA6IGdldGVudigiRElTUExBWSIpKTsKLSAgICAgICAgSk5VX1Rocm93SW50ZXJuYWxFcnJvcihlbnYsIGVycm1zZyk7CisgICAgICAgIEpOVV9UaHJvd0J5TmFtZShlbnYsICJqYXZhL2F3dC9BV1RFcnJvciIsIGVycm1zZyk7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvamRrL3NyYy93aW5kb3dzL2NsYXNzZXMvamF2YS9pby9XaW4zMkZpbGVTeXN0ZW0uamF2YSBiL2pkay9zcmMvd2luZG93cy9jbGFzc2VzL2phdmEvaW8vV2luMzJGaWxlU3lzdGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwNDBjMTIuLjAwMDAwMDAKLS0tIGEvamRrL3NyYy93aW5kb3dzL2NsYXNzZXMvamF2YS9pby9XaW4zMkZpbGVTeXN0ZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDEwLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBPcmFjbGUgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKLSAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKLSAqIHF1ZXN0aW9ucy4KLSAqLwotCi1wYWNrYWdlIGphdmEuaW87Ci0KLWltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBzdW4uc2VjdXJpdHkuYWN0aW9uLkdldFByb3BlcnR5QWN0aW9uOwotCi0KLWNsYXNzIFdpbjMyRmlsZVN5c3RlbSBleHRlbmRzIEZpbGVTeXN0ZW0gewotCi0gICAgcHJpdmF0ZSBmaW5hbCBjaGFyIHNsYXNoOwotICAgIHByaXZhdGUgZmluYWwgY2hhciBhbHRTbGFzaDsKLSAgICBwcml2YXRlIGZpbmFsIGNoYXIgc2VtaWNvbG9uOwotCi0gICAgcHVibGljIFdpbjMyRmlsZVN5c3RlbSgpIHsKLSAgICAgICAgc2xhc2ggPSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKLSAgICAgICAgICAgIG5ldyBHZXRQcm9wZXJ0eUFjdGlvbigiZmlsZS5zZXBhcmF0b3IiKSkuY2hhckF0KDApOwotICAgICAgICBzZW1pY29sb24gPSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKLSAgICAgICAgICAgIG5ldyBHZXRQcm9wZXJ0eUFjdGlvbigicGF0aC5zZXBhcmF0b3IiKSkuY2hhckF0KDApOwotICAgICAgICBhbHRTbGFzaCA9ICh0aGlzLnNsYXNoID09ICdcXCcpID8gJy8nIDogJ1xcJzsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNTbGFzaChjaGFyIGMpIHsKLSAgICAgICAgcmV0dXJuIChjID09ICdcXCcpIHx8IChjID09ICcvJyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzTGV0dGVyKGNoYXIgYykgewotICAgICAgICByZXR1cm4gKChjID49ICdhJykgJiYgKGMgPD0gJ3onKSkgfHwgKChjID49ICdBJykgJiYgKGMgPD0gJ1onKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgc2xhc2hpZnkoU3RyaW5nIHApIHsKLSAgICAgICAgaWYgKChwLmxlbmd0aCgpID4gMCkgJiYgKHAuY2hhckF0KDApICE9IHNsYXNoKSkgcmV0dXJuIHNsYXNoICsgcDsKLSAgICAgICAgZWxzZSByZXR1cm4gcDsKLSAgICB9Ci0KLQotICAgIC8qIC0tIE5vcm1hbGl6YXRpb24gYW5kIGNvbnN0cnVjdGlvbiAtLSAqLwotCi0gICAgcHVibGljIGNoYXIgZ2V0U2VwYXJhdG9yKCkgewotICAgICAgICByZXR1cm4gc2xhc2g7Ci0gICAgfQotCi0gICAgcHVibGljIGNoYXIgZ2V0UGF0aFNlcGFyYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIHNlbWljb2xvbjsKLSAgICB9Ci0KLSAgICAvKiBBIG5vcm1hbCBXaW4zMiBwYXRobmFtZSBjb250YWlucyBubyBkdXBsaWNhdGUgc2xhc2hlcywgZXhjZXB0IHBvc3NpYmx5Ci0gICAgICAgZm9yIGEgVU5DIHByZWZpeCwgYW5kIGRvZXMgbm90IGVuZCB3aXRoIGEgc2xhc2guICBJdCBtYXkgYmUgdGhlIGVtcHR5Ci0gICAgICAgc3RyaW5nLiAgTm9ybWFsaXplZCBXaW4zMiBwYXRobmFtZXMgaGF2ZSB0aGUgY29udmVuaWVudCBwcm9wZXJ0eSB0aGF0Ci0gICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgcHJlZml4IGFsbW9zdCB1bmlxdWVseSBpZGVudGlmaWVzIHRoZSB0eXBlIG9mIHRoZSBwYXRoCi0gICAgICAgYW5kIHdoZXRoZXIgaXQgaXMgYWJzb2x1dGUgb3IgcmVsYXRpdmU6Ci0KLSAgICAgICAgICAgMCAgcmVsYXRpdmUgdG8gYm90aCBkcml2ZSBhbmQgZGlyZWN0b3J5Ci0gICAgICAgICAgIDEgIGRyaXZlLXJlbGF0aXZlIChiZWdpbnMgd2l0aCAnXFwnKQotICAgICAgICAgICAyICBhYnNvbHV0ZSBVTkMgKGlmIGZpcnN0IGNoYXIgaXMgJ1xcJyksCi0gICAgICAgICAgICAgICAgZWxzZSBkaXJlY3RvcnktcmVsYXRpdmUgKGhhcyBmb3JtICJ6OmZvbyIpCi0gICAgICAgICAgIDMgIGFic29sdXRlIGxvY2FsIHBhdGhuYW1lIChiZWdpbnMgd2l0aCAiejpcXCIpCi0gICAgICovCi0KLSAgICBwcml2YXRlIGludCBub3JtYWxpemVQcmVmaXgoU3RyaW5nIHBhdGgsIGludCBsZW4sIFN0cmluZ0J1ZmZlciBzYikgewotICAgICAgICBpbnQgc3JjID0gMDsKLSAgICAgICAgd2hpbGUgKChzcmMgPCBsZW4pICYmIGlzU2xhc2gocGF0aC5jaGFyQXQoc3JjKSkpIHNyYysrOwotICAgICAgICBjaGFyIGM7Ci0gICAgICAgIGlmICgobGVuIC0gc3JjID49IDIpCi0gICAgICAgICAgICAmJiBpc0xldHRlcihjID0gcGF0aC5jaGFyQXQoc3JjKSkKLSAgICAgICAgICAgICYmIHBhdGguY2hhckF0KHNyYyArIDEpID09ICc6JykgewotICAgICAgICAgICAgLyogUmVtb3ZlIGxlYWRpbmcgc2xhc2hlcyBpZiBmb2xsb3dlZCBieSBkcml2ZSBzcGVjaWZpZXIuCi0gICAgICAgICAgICAgICBUaGlzIGhhY2sgaXMgbmVjZXNzYXJ5IHRvIHN1cHBvcnQgZmlsZSBVUkxzIGNvbnRhaW5pbmcgZHJpdmUKLSAgICAgICAgICAgICAgIHNwZWNpZmllcnMgKGUuZy4sICJmaWxlOi8vYzovcGF0aCIpLiAgQXMgYSBzaWRlIGVmZmVjdCwKLSAgICAgICAgICAgICAgICIvYzovcGF0aCIgY2FuIGJlIHVzZWQgYXMgYW4gYWx0ZXJuYXRpdmUgdG8gImM6L3BhdGgiLiAqLwotICAgICAgICAgICAgc2IuYXBwZW5kKGMpOwotICAgICAgICAgICAgc2IuYXBwZW5kKCc6Jyk7Ci0gICAgICAgICAgICBzcmMgKz0gMjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNyYyA9IDA7Ci0gICAgICAgICAgICBpZiAoKGxlbiA+PSAyKQotICAgICAgICAgICAgICAgICYmIGlzU2xhc2gocGF0aC5jaGFyQXQoMCkpCi0gICAgICAgICAgICAgICAgJiYgaXNTbGFzaChwYXRoLmNoYXJBdCgxKSkpIHsKLSAgICAgICAgICAgICAgICAvKiBVTkMgcGF0aG5hbWU6IFJldGFpbiBmaXJzdCBzbGFzaDsgbGVhdmUgc3JjIHBvaW50ZWQgYXQKLSAgICAgICAgICAgICAgICAgICBzZWNvbmQgc2xhc2ggc28gdGhhdCBmdXJ0aGVyIHNsYXNoZXMgd2lsbCBiZSBjb2xsYXBzZWQKLSAgICAgICAgICAgICAgICAgICBpbnRvIHRoZSBzZWNvbmQgc2xhc2guICBUaGUgcmVzdWx0IHdpbGwgYmUgYSBwYXRobmFtZQotICAgICAgICAgICAgICAgICAgIGJlZ2lubmluZyB3aXRoICJcXFxcIiBmb2xsb3dlZCAobW9zdCBsaWtlbHkpIGJ5IGEgaG9zdAotICAgICAgICAgICAgICAgICAgIG5hbWUuICovCi0gICAgICAgICAgICAgICAgc3JjID0gMTsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoc2xhc2gpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzcmM7Ci0gICAgfQotCi0gICAgLyogTm9ybWFsaXplIHRoZSBnaXZlbiBwYXRobmFtZSwgd2hvc2UgbGVuZ3RoIGlzIGxlbiwgc3RhcnRpbmcgYXQgdGhlIGdpdmVuCi0gICAgICAgb2Zmc2V0OyBldmVyeXRoaW5nIGJlZm9yZSB0aGlzIG9mZnNldCBpcyBhbHJlYWR5IG5vcm1hbC4gKi8KLSAgICBwcml2YXRlIFN0cmluZyBub3JtYWxpemUoU3RyaW5nIHBhdGgsIGludCBsZW4sIGludCBvZmYpIHsKLSAgICAgICAgaWYgKGxlbiA9PSAwKSByZXR1cm4gcGF0aDsKLSAgICAgICAgaWYgKG9mZiA8IDMpIG9mZiA9IDA7ICAgLyogQXZvaWQgZmVuY2Vwb3N0IGNhc2VzIHdpdGggVU5DIHBhdGhuYW1lcyAqLwotICAgICAgICBpbnQgc3JjOwotICAgICAgICBjaGFyIHNsYXNoID0gdGhpcy5zbGFzaDsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihsZW4pOwotCi0gICAgICAgIGlmIChvZmYgPT0gMCkgewotICAgICAgICAgICAgLyogQ29tcGxldGUgbm9ybWFsaXphdGlvbiwgaW5jbHVkaW5nIHByZWZpeCAqLwotICAgICAgICAgICAgc3JjID0gbm9ybWFsaXplUHJlZml4KHBhdGgsIGxlbiwgc2IpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLyogUGFydGlhbCBub3JtYWxpemF0aW9uICovCi0gICAgICAgICAgICBzcmMgPSBvZmY7Ci0gICAgICAgICAgICBzYi5hcHBlbmQocGF0aC5zdWJzdHJpbmcoMCwgb2ZmKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBSZW1vdmUgcmVkdW5kYW50IHNsYXNoZXMgZnJvbSB0aGUgcmVtYWluZGVyIG9mIHRoZSBwYXRoLCBmb3JjaW5nIGFsbAotICAgICAgICAgICBzbGFzaGVzIGludG8gdGhlIHByZWZlcnJlZCBzbGFzaCAqLwotICAgICAgICB3aGlsZSAoc3JjIDwgbGVuKSB7Ci0gICAgICAgICAgICBjaGFyIGMgPSBwYXRoLmNoYXJBdChzcmMrKyk7Ci0gICAgICAgICAgICBpZiAoaXNTbGFzaChjKSkgewotICAgICAgICAgICAgICAgIHdoaWxlICgoc3JjIDwgbGVuKSAmJiBpc1NsYXNoKHBhdGguY2hhckF0KHNyYykpKSBzcmMrKzsKLSAgICAgICAgICAgICAgICBpZiAoc3JjID09IGxlbikgewotICAgICAgICAgICAgICAgICAgICAvKiBDaGVjayBmb3IgdHJhaWxpbmcgc2VwYXJhdG9yICovCi0gICAgICAgICAgICAgICAgICAgIGludCBzbiA9IHNiLmxlbmd0aCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoKHNuID09IDIpICYmIChzYi5jaGFyQXQoMSkgPT0gJzonKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogIno6XFwiICovCi0gICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoc2xhc2gpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHNuID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qICJcXCIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChzbGFzaCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoKHNuID09IDEpICYmIChpc1NsYXNoKHNiLmNoYXJBdCgwKSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiAiXFxcXCIgaXMgbm90IGNvbGxhcHNlZCB0byAiXFwiIGJlY2F1c2UgIlxcXFwiIG1hcmtzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYmVnaW5uaW5nIG9mIGEgVU5DIHBhdGhuYW1lLiAgRXZlbiB0aG91Z2ggaXQgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCwgYnkgaXRzZWxmLCBhIHZhbGlkIFVOQyBwYXRobmFtZSwgd2UgbGVhdmUgaXQgYXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGluIG9yZGVyIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgd2luMzIgQVBJcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIHRyZWF0IHRoaXMgY2FzZSBhcyBhbiBpbnZhbGlkIFVOQyBwYXRobmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0aGVyIHRoYW4gYXMgYW4gYWxpYXMgZm9yIHRoZSByb290IGRpcmVjdG9yeSBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGN1cnJlbnQgZHJpdmUuICovCi0gICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoc2xhc2gpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLyogUGF0aCBkb2VzIG5vdCBkZW5vdGUgYSByb290IGRpcmVjdG9yeSwgc28gZG8gbm90IGFwcGVuZAotICAgICAgICAgICAgICAgICAgICAgICB0cmFpbGluZyBzbGFzaCAqLwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoc2xhc2gpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKGMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHJ2ID0gc2IudG9TdHJpbmcoKTsKLSAgICAgICAgcmV0dXJuIHJ2OwotICAgIH0KLQotICAgIC8qIENoZWNrIHRoYXQgdGhlIGdpdmVuIHBhdGhuYW1lIGlzIG5vcm1hbC4gIElmIG5vdCwgaW52b2tlIHRoZSByZWFsCi0gICAgICAgbm9ybWFsaXplciBvbiB0aGUgcGFydCBvZiB0aGUgcGF0aG5hbWUgdGhhdCByZXF1aXJlcyBub3JtYWxpemF0aW9uLgotICAgICAgIFRoaXMgd2F5IHdlIGl0ZXJhdGUgdGhyb3VnaCB0aGUgd2hvbGUgcGF0aG5hbWUgc3RyaW5nIG9ubHkgb25jZS4gKi8KLSAgICBwdWJsaWMgU3RyaW5nIG5vcm1hbGl6ZShTdHJpbmcgcGF0aCkgewotICAgICAgICBpbnQgbiA9IHBhdGgubGVuZ3RoKCk7Ci0gICAgICAgIGNoYXIgc2xhc2ggPSB0aGlzLnNsYXNoOwotICAgICAgICBjaGFyIGFsdFNsYXNoID0gdGhpcy5hbHRTbGFzaDsKLSAgICAgICAgY2hhciBwcmV2ID0gMDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKLSAgICAgICAgICAgIGNoYXIgYyA9IHBhdGguY2hhckF0KGkpOwotICAgICAgICAgICAgaWYgKGMgPT0gYWx0U2xhc2gpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZShwYXRoLCBuLCAocHJldiA9PSBzbGFzaCkgPyBpIC0gMSA6IGkpOwotICAgICAgICAgICAgaWYgKChjID09IHNsYXNoKSAmJiAocHJldiA9PSBzbGFzaCkgJiYgKGkgPiAxKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gbm9ybWFsaXplKHBhdGgsIG4sIGkgLSAxKTsKLSAgICAgICAgICAgIGlmICgoYyA9PSAnOicpICYmIChpID4gMSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZShwYXRoLCBuLCAwKTsKLSAgICAgICAgICAgIHByZXYgPSBjOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwcmV2ID09IHNsYXNoKSByZXR1cm4gbm9ybWFsaXplKHBhdGgsIG4sIG4gLSAxKTsKLSAgICAgICAgcmV0dXJuIHBhdGg7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBwcmVmaXhMZW5ndGgoU3RyaW5nIHBhdGgpIHsKLSAgICAgICAgY2hhciBzbGFzaCA9IHRoaXMuc2xhc2g7Ci0gICAgICAgIGludCBuID0gcGF0aC5sZW5ndGgoKTsKLSAgICAgICAgaWYgKG4gPT0gMCkgcmV0dXJuIDA7Ci0gICAgICAgIGNoYXIgYzAgPSBwYXRoLmNoYXJBdCgwKTsKLSAgICAgICAgY2hhciBjMSA9IChuID4gMSkgPyBwYXRoLmNoYXJBdCgxKSA6IDA7Ci0gICAgICAgIGlmIChjMCA9PSBzbGFzaCkgewotICAgICAgICAgICAgaWYgKGMxID09IHNsYXNoKSByZXR1cm4gMjsgIC8qIEFic29sdXRlIFVOQyBwYXRobmFtZSAiXFxcXGZvbyIgKi8KLSAgICAgICAgICAgIHJldHVybiAxOyAgICAgICAgICAgICAgICAgICAvKiBEcml2ZS1yZWxhdGl2ZSAiXFxmb28iICovCi0gICAgICAgIH0KLSAgICAgICAgaWYgKGlzTGV0dGVyKGMwKSAmJiAoYzEgPT0gJzonKSkgewotICAgICAgICAgICAgaWYgKChuID4gMikgJiYgKHBhdGguY2hhckF0KDIpID09IHNsYXNoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gMzsgICAgICAgICAgICAgICAvKiBBYnNvbHV0ZSBsb2NhbCBwYXRobmFtZSAiejpcXGZvbyIgKi8KLSAgICAgICAgICAgIHJldHVybiAyOyAgICAgICAgICAgICAgICAgICAvKiBEaXJlY3RvcnktcmVsYXRpdmUgIno6Zm9vIiAqLwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOyAgICAgICAgICAgICAgICAgICAgICAgLyogQ29tcGxldGVseSByZWxhdGl2ZSAqLwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgcmVzb2x2ZShTdHJpbmcgcGFyZW50LCBTdHJpbmcgY2hpbGQpIHsKLSAgICAgICAgaW50IHBuID0gcGFyZW50Lmxlbmd0aCgpOwotICAgICAgICBpZiAocG4gPT0gMCkgcmV0dXJuIGNoaWxkOwotICAgICAgICBpbnQgY24gPSBjaGlsZC5sZW5ndGgoKTsKLSAgICAgICAgaWYgKGNuID09IDApIHJldHVybiBwYXJlbnQ7Ci0KLSAgICAgICAgU3RyaW5nIGMgPSBjaGlsZDsKLSAgICAgICAgaW50IGNoaWxkU3RhcnQgPSAwOwotICAgICAgICBpbnQgcGFyZW50RW5kID0gcG47Ci0KLSAgICAgICAgaWYgKChjbiA+IDEpICYmIChjLmNoYXJBdCgwKSA9PSBzbGFzaCkpIHsKLSAgICAgICAgICAgIGlmIChjLmNoYXJBdCgxKSA9PSBzbGFzaCkgewotICAgICAgICAgICAgICAgIC8qIERyb3AgcHJlZml4IHdoZW4gY2hpbGQgaXMgYSBVTkMgcGF0aG5hbWUgKi8KLSAgICAgICAgICAgICAgICBjaGlsZFN0YXJ0ID0gMjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLyogRHJvcCBwcmVmaXggd2hlbiBjaGlsZCBpcyBkcml2ZS1yZWxhdGl2ZSAqLwotICAgICAgICAgICAgICAgIGNoaWxkU3RhcnQgPSAxOwotCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY24gPT0gY2hpbGRTdGFydCkgeyAvLyBDaGlsZCBpcyBkb3VibGUgc2xhc2gKLSAgICAgICAgICAgICAgICBpZiAocGFyZW50LmNoYXJBdChwbiAtIDEpID09IHNsYXNoKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyZW50LnN1YnN0cmluZygwLCBwbiAtIDEpOwotICAgICAgICAgICAgICAgIHJldHVybiBwYXJlbnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocGFyZW50LmNoYXJBdChwbiAtIDEpID09IHNsYXNoKQotICAgICAgICAgICAgcGFyZW50RW5kLS07Ci0KLSAgICAgICAgaW50IHN0cmxlbiA9IHBhcmVudEVuZCArIGNuIC0gY2hpbGRTdGFydDsKLSAgICAgICAgY2hhcltdIHRoZUNoYXJzID0gbnVsbDsKLSAgICAgICAgaWYgKGNoaWxkLmNoYXJBdChjaGlsZFN0YXJ0KSA9PSBzbGFzaCkgewotICAgICAgICAgICAgdGhlQ2hhcnMgPSBuZXcgY2hhcltzdHJsZW5dOwotICAgICAgICAgICAgcGFyZW50LmdldENoYXJzKDAsIHBhcmVudEVuZCwgdGhlQ2hhcnMsIDApOwotICAgICAgICAgICAgY2hpbGQuZ2V0Q2hhcnMoY2hpbGRTdGFydCwgY24sIHRoZUNoYXJzLCBwYXJlbnRFbmQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhlQ2hhcnMgPSBuZXcgY2hhcltzdHJsZW4gKyAxXTsKLSAgICAgICAgICAgIHBhcmVudC5nZXRDaGFycygwLCBwYXJlbnRFbmQsIHRoZUNoYXJzLCAwKTsKLSAgICAgICAgICAgIHRoZUNoYXJzW3BhcmVudEVuZF0gPSBzbGFzaDsKLSAgICAgICAgICAgIGNoaWxkLmdldENoYXJzKGNoaWxkU3RhcnQsIGNuLCB0aGVDaGFycywgcGFyZW50RW5kICsgMSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcodGhlQ2hhcnMpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFBhcmVudCgpIHsKLSAgICAgICAgcmV0dXJuICgiIiArIHNsYXNoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGZyb21VUklQYXRoKFN0cmluZyBwYXRoKSB7Ci0gICAgICAgIFN0cmluZyBwID0gcGF0aDsKLSAgICAgICAgaWYgKChwLmxlbmd0aCgpID4gMikgJiYgKHAuY2hhckF0KDIpID09ICc6JykpIHsKLSAgICAgICAgICAgIC8vICIvYzovZm9vIiAtLT4gImM6L2ZvbyIKLSAgICAgICAgICAgIHAgPSBwLnN1YnN0cmluZygxKTsKLSAgICAgICAgICAgIC8vICJjOi9mb28vIiAtLT4gImM6L2ZvbyIsIGJ1dCAiYzovIiAtLT4gImM6LyIKLSAgICAgICAgICAgIGlmICgocC5sZW5ndGgoKSA+IDMpICYmIHAuZW5kc1dpdGgoIi8iKSkKLSAgICAgICAgICAgICAgICBwID0gcC5zdWJzdHJpbmcoMCwgcC5sZW5ndGgoKSAtIDEpOwotICAgICAgICB9IGVsc2UgaWYgKChwLmxlbmd0aCgpID4gMSkgJiYgcC5lbmRzV2l0aCgiLyIpKSB7Ci0gICAgICAgICAgICAvLyAiL2Zvby8iIC0tPiAiL2ZvbyIKLSAgICAgICAgICAgIHAgPSBwLnN1YnN0cmluZygwLCBwLmxlbmd0aCgpIC0gMSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHA7Ci0gICAgfQotCi0KLQotICAgIC8qIC0tIFBhdGggb3BlcmF0aW9ucyAtLSAqLwotCi0gICAgcHVibGljIGJvb2xlYW4gaXNBYnNvbHV0ZShGaWxlIGYpIHsKLSAgICAgICAgaW50IHBsID0gZi5nZXRQcmVmaXhMZW5ndGgoKTsKLSAgICAgICAgcmV0dXJuICgoKHBsID09IDIpICYmIChmLmdldFBhdGgoKS5jaGFyQXQoMCkgPT0gc2xhc2gpKQotICAgICAgICAgICAgICAgIHx8IChwbCA9PSAzKSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIG5hdGl2ZSBTdHJpbmcgZ2V0RHJpdmVEaXJlY3RvcnkoaW50IGRyaXZlKTsKLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGRyaXZlRGlyQ2FjaGUgPSBuZXcgU3RyaW5nWzI2XTsKLQotICAgIHByaXZhdGUgc3RhdGljIGludCBkcml2ZUluZGV4KGNoYXIgZCkgewotICAgICAgICBpZiAoKGQgPj0gJ2EnKSAmJiAoZCA8PSAneicpKSByZXR1cm4gZCAtICdhJzsKLSAgICAgICAgaWYgKChkID49ICdBJykgJiYgKGQgPD0gJ1onKSkgcmV0dXJuIGQgLSAnQSc7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXREcml2ZURpcmVjdG9yeShjaGFyIGRyaXZlKSB7Ci0gICAgICAgIGludCBpID0gZHJpdmVJbmRleChkcml2ZSk7Ci0gICAgICAgIGlmIChpIDwgMCkgcmV0dXJuIG51bGw7Ci0gICAgICAgIFN0cmluZyBzID0gZHJpdmVEaXJDYWNoZVtpXTsKLSAgICAgICAgaWYgKHMgIT0gbnVsbCkgcmV0dXJuIHM7Ci0gICAgICAgIHMgPSBnZXREcml2ZURpcmVjdG9yeShpICsgMSk7Ci0gICAgICAgIGRyaXZlRGlyQ2FjaGVbaV0gPSBzOwotICAgICAgICByZXR1cm4gczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBnZXRVc2VyUGF0aCgpIHsKLSAgICAgICAgLyogRm9yIGJvdGggY29tcGF0aWJpbGl0eSBhbmQgc2VjdXJpdHksCi0gICAgICAgICAgIHdlIG11c3QgbG9vayB0aGlzIHVwIGV2ZXJ5IHRpbWUgKi8KLSAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZShTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIikpOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldERyaXZlKFN0cmluZyBwYXRoKSB7Ci0gICAgICAgIGludCBwbCA9IHByZWZpeExlbmd0aChwYXRoKTsKLSAgICAgICAgcmV0dXJuIChwbCA9PSAzKSA/IHBhdGguc3Vic3RyaW5nKDAsIDIpIDogbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIHJlc29sdmUoRmlsZSBmKSB7Ci0gICAgICAgIFN0cmluZyBwYXRoID0gZi5nZXRQYXRoKCk7Ci0gICAgICAgIGludCBwbCA9IGYuZ2V0UHJlZml4TGVuZ3RoKCk7Ci0gICAgICAgIGlmICgocGwgPT0gMikgJiYgKHBhdGguY2hhckF0KDApID09IHNsYXNoKSkKLSAgICAgICAgICAgIHJldHVybiBwYXRoOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVOQyAqLwotICAgICAgICBpZiAocGwgPT0gMykKLSAgICAgICAgICAgIHJldHVybiBwYXRoOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFic29sdXRlIGxvY2FsICovCi0gICAgICAgIGlmIChwbCA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIGdldFVzZXJQYXRoKCkgKyBzbGFzaGlmeShwYXRoKTsgLyogQ29tcGxldGVseSByZWxhdGl2ZSAqLwotICAgICAgICBpZiAocGwgPT0gMSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRHJpdmUtcmVsYXRpdmUgKi8KLSAgICAgICAgICAgIFN0cmluZyB1cCA9IGdldFVzZXJQYXRoKCk7Ci0gICAgICAgICAgICBTdHJpbmcgdWQgPSBnZXREcml2ZSh1cCk7Ci0gICAgICAgICAgICBpZiAodWQgIT0gbnVsbCkgcmV0dXJuIHVkICsgcGF0aDsKLSAgICAgICAgICAgIHJldHVybiB1cCArIHBhdGg7ICAgICAgICAgICAgICAgICAgIC8qIFVzZXIgZGlyIGlzIGEgVU5DIHBhdGggKi8KLSAgICAgICAgfQotICAgICAgICBpZiAocGwgPT0gMikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGlyZWN0b3J5LXJlbGF0aXZlICovCi0gICAgICAgICAgICBTdHJpbmcgdXAgPSBnZXRVc2VyUGF0aCgpOwotICAgICAgICAgICAgU3RyaW5nIHVkID0gZ2V0RHJpdmUodXApOwotICAgICAgICAgICAgaWYgKCh1ZCAhPSBudWxsKSAmJiBwYXRoLnN0YXJ0c1dpdGgodWQpKQotICAgICAgICAgICAgICAgIHJldHVybiB1cCArIHNsYXNoaWZ5KHBhdGguc3Vic3RyaW5nKDIpKTsKLSAgICAgICAgICAgIGNoYXIgZHJpdmUgPSBwYXRoLmNoYXJBdCgwKTsKLSAgICAgICAgICAgIFN0cmluZyBkaXIgPSBnZXREcml2ZURpcmVjdG9yeShkcml2ZSk7Ci0gICAgICAgICAgICBTdHJpbmcgbnA7Ci0gICAgICAgICAgICBpZiAoZGlyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvKiBXaGVuIHJlc29sdmluZyBhIGRpcmVjdG9yeS1yZWxhdGl2ZSBwYXRoIHRoYXQgcmVmZXJzIHRvIGEKLSAgICAgICAgICAgICAgICAgICBkcml2ZSBvdGhlciB0aGFuIHRoZSBjdXJyZW50IGRyaXZlLCBpbnNpc3QgdGhhdCB0aGUgY2FsbGVyCi0gICAgICAgICAgICAgICAgICAgaGF2ZSByZWFkIHBlcm1pc3Npb24gb24gdGhlIHJlc3VsdCAqLwotICAgICAgICAgICAgICAgIFN0cmluZyBwID0gZHJpdmUgKyAoJzonICsgZGlyICsgc2xhc2hpZnkocGF0aC5zdWJzdHJpbmcoMikpKTsKLSAgICAgICAgICAgICAgICBTZWN1cml0eU1hbmFnZXIgc2VjdXJpdHkgPSBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCk7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNlY3VyaXR5ICE9IG51bGwpIHNlY3VyaXR5LmNoZWNrUmVhZChwKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiB4KSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIERvbid0IGRpc2Nsb3NlIHRoZSBkcml2ZSdzIGRpcmVjdG9yeSBpbiB0aGUgZXhjZXB0aW9uICovCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbigiQ2Fubm90IHJlc29sdmUgcGF0aCAiICsgcGF0aCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGRyaXZlICsgIjoiICsgc2xhc2hpZnkocGF0aC5zdWJzdHJpbmcoMikpOyAvKiBmYWtlIGl0ICovCi0gICAgICAgIH0KLSAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoIlVucmVzb2x2YWJsZSBwYXRoOiAiICsgcGF0aCk7Ci0gICAgfQotCi0gICAgLy8gQ2FjaGVzIGZvciBjYW5vbmljYWxpemF0aW9uIHJlc3VsdHMgdG8gaW1wcm92ZSBzdGFydHVwIHBlcmZvcm1hbmNlLgotICAgIC8vIFRoZSBmaXJzdCBjYWNoZSBoYW5kbGVzIHJlcGVhdGVkIGNhbm9uaWNhbGl6YXRpb25zIG9mIHRoZSBzYW1lIHBhdGgKLSAgICAvLyBuYW1lLiBUaGUgcHJlZml4IGNhY2hlIGhhbmRsZXMgcmVwZWF0ZWQgY2Fub25pY2FsaXphdGlvbnMgd2l0aGluIHRoZQotICAgIC8vIHNhbWUgZGlyZWN0b3J5LCBhbmQgbXVzdCBub3QgY3JlYXRlIHJlc3VsdHMgZGlmZmVyaW5nIGZyb20gdGhlIHRydWUKLSAgICAvLyBjYW5vbmljYWxpemF0aW9uIGFsZ29yaXRobSBpbiBjYW5vbmljYWxpemVfbWQuYy4gRm9yIHRoaXMgcmVhc29uIHRoZQotICAgIC8vIHByZWZpeCBjYWNoZSBpcyBjb25zZXJ2YXRpdmUgYW5kIGlzIG5vdCB1c2VkIGZvciBjb21wbGV4IHBhdGggbmFtZXMuCi0gICAgcHJpdmF0ZSBFeHBpcmluZ0NhY2hlIGNhY2hlICAgICAgID0gbmV3IEV4cGlyaW5nQ2FjaGUoKTsKLSAgICBwcml2YXRlIEV4cGlyaW5nQ2FjaGUgcHJlZml4Q2FjaGUgPSBuZXcgRXhwaXJpbmdDYWNoZSgpOwotCi0gICAgcHVibGljIFN0cmluZyBjYW5vbmljYWxpemUoU3RyaW5nIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIElmIHBhdGggaXMgYSBkcml2ZSBsZXR0ZXIgb25seSB0aGVuIHNraXAgY2Fub25pY2FsaXphdGlvbgotICAgICAgICBpbnQgbGVuID0gcGF0aC5sZW5ndGgoKTsKLSAgICAgICAgaWYgKChsZW4gPT0gMikgJiYKLSAgICAgICAgICAgIChpc0xldHRlcihwYXRoLmNoYXJBdCgwKSkpICYmCi0gICAgICAgICAgICAocGF0aC5jaGFyQXQoMSkgPT0gJzonKSkgewotICAgICAgICAgICAgY2hhciBjID0gcGF0aC5jaGFyQXQoMCk7Ci0gICAgICAgICAgICBpZiAoKGMgPj0gJ0EnKSAmJiAoYyA8PSAnWicpKQotICAgICAgICAgICAgICAgIHJldHVybiBwYXRoOwotICAgICAgICAgICAgcmV0dXJuICIiICsgKChjaGFyKSAoYy0zMikpICsgJzonOwotICAgICAgICB9IGVsc2UgaWYgKChsZW4gPT0gMykgJiYKLSAgICAgICAgICAgICAgICAgICAoaXNMZXR0ZXIocGF0aC5jaGFyQXQoMCkpKSAmJgotICAgICAgICAgICAgICAgICAgIChwYXRoLmNoYXJBdCgxKSA9PSAnOicpICYmCi0gICAgICAgICAgICAgICAgICAgKHBhdGguY2hhckF0KDIpID09ICdcXCcpKSB7Ci0gICAgICAgICAgICBjaGFyIGMgPSBwYXRoLmNoYXJBdCgwKTsKLSAgICAgICAgICAgIGlmICgoYyA+PSAnQScpICYmIChjIDw9ICdaJykpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHBhdGg7Ci0gICAgICAgICAgICByZXR1cm4gIiIgKyAoKGNoYXIpIChjLTMyKSkgKyAnOicgKyAnXFwnOwotICAgICAgICB9Ci0gICAgICAgIGlmICghdXNlQ2Fub25DYWNoZXMpIHsKLSAgICAgICAgICAgIHJldHVybiBjYW5vbmljYWxpemUwKHBhdGgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3RyaW5nIHJlcyA9IGNhY2hlLmdldChwYXRoKTsKLSAgICAgICAgICAgIGlmIChyZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBkaXIgPSBudWxsOwotICAgICAgICAgICAgICAgIFN0cmluZyByZXNEaXIgPSBudWxsOwotICAgICAgICAgICAgICAgIGlmICh1c2VDYW5vblByZWZpeENhY2hlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRpciA9IHBhcmVudE9yTnVsbChwYXRoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRpciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXNEaXIgPSBwcmVmaXhDYWNoZS5nZXQoZGlyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNEaXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhpdCBvbmx5IGluIHByZWZpeCBjYWNoZTsgZnVsbCBwYXRoIGlzIGNhbm9uaWNhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBidXQgd2UgbmVlZCB0byBnZXQgdGhlIGNhbm9uaWNhbCBuYW1lIG9mIHRoZSBmaWxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gdGhpcyBkaXJlY3RvcnkgdG8gZ2V0IHRoZSBhcHByb3ByaWF0ZSBjYXBpdGFsaXphdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlbmFtZSA9IHBhdGguc3Vic3RyaW5nKDEgKyBkaXIubGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IGNhbm9uaWNhbGl6ZVdpdGhQcmVmaXgocmVzRGlyLCBmaWxlbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGUucHV0KGRpciArIEZpbGUuc2VwYXJhdG9yQ2hhciArIGZpbGVuYW1lLCByZXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChyZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXMgPSBjYW5vbmljYWxpemUwKHBhdGgpOwotICAgICAgICAgICAgICAgICAgICBjYWNoZS5wdXQocGF0aCwgcmVzKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHVzZUNhbm9uUHJlZml4Q2FjaGUgJiYgZGlyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc0RpciA9IHBhcmVudE9yTnVsbChyZXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc0RpciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUocmVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZi5leGlzdHMoKSAmJiAhZi5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeENhY2hlLnB1dChkaXIsIHJlc0Rpcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJlczsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBuYXRpdmUgU3RyaW5nIGNhbm9uaWNhbGl6ZTAoU3RyaW5nIHBhdGgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb247Ci0gICAgcHJvdGVjdGVkIFN0cmluZyBjYW5vbmljYWxpemVXaXRoUHJlZml4KFN0cmluZyBjYW5vbmljYWxQcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gY2Fub25pY2FsaXplV2l0aFByZWZpeDAoY2Fub25pY2FsUHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Fub25pY2FsUHJlZml4ICsgRmlsZS5zZXBhcmF0b3JDaGFyICsgZmlsZW5hbWUpOwotICAgIH0KLSAgICAvLyBSdW4gdGhlIGNhbm9uaWNhbGl6YXRpb24gb3BlcmF0aW9uIGFzc3VtaW5nIHRoYXQgdGhlIHByZWZpeAotICAgIC8vIChldmVyeXRoaW5nIHVwIHRvIHRoZSBsYXN0IGZpbGVuYW1lKSBpcyBjYW5vbmljYWw7IGp1c3QgZ2V0cwotICAgIC8vIHRoZSBjYW5vbmljYWwgbmFtZSBvZiB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZSBwYXRoCi0gICAgcHJvdGVjdGVkIG5hdGl2ZSBTdHJpbmcgY2Fub25pY2FsaXplV2l0aFByZWZpeDAoU3RyaW5nIGNhbm9uaWNhbFByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aFdpdGhDYW5vbmljYWxQcmVmaXgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb247Ci0gICAgLy8gQmVzdC1lZmZvcnQgYXR0ZW1wdCB0byBnZXQgcGFyZW50IG9mIHRoaXMgcGF0aDsgdXNlZCBmb3IKLSAgICAvLyBvcHRpbWl6YXRpb24gb2YgZmlsZW5hbWUgY2Fub25pY2FsaXphdGlvbi4gVGhpcyBtdXN0IHJldHVybiBudWxsIGZvcgotICAgIC8vIGFueSBjYXNlcyB3aGVyZSB0aGUgY29kZSBpbiBjYW5vbmljYWxpemVfbWQuYyB3b3VsZCB0aHJvdyBhbgotICAgIC8vIGV4Y2VwdGlvbiBvciBvdGhlcndpc2UgZGVhbCB3aXRoIG5vbi1zaW1wbGUgcGF0aG5hbWVzIGxpa2UgaGFuZGxpbmcKLSAgICAvLyBvZiAiLiIgYW5kICIuLiIuIEl0IG1heSBjb25zZXJ2YXRpdmVseSByZXR1cm4gbnVsbCBpbiBvdGhlcgotICAgIC8vIHNpdHVhdGlvbnMgYXMgd2VsbC4gUmV0dXJuaW5nIG51bGwgd2lsbCBjYXVzZSB0aGUgdW5kZXJseWluZwotICAgIC8vIChleHBlbnNpdmUpIGNhbm9uaWNhbGl6YXRpb24gcm91dGluZSB0byBiZSBjYWxsZWQuCi0gICAgc3RhdGljIFN0cmluZyBwYXJlbnRPck51bGwoU3RyaW5nIHBhdGgpIHsKLSAgICAgICAgaWYgKHBhdGggPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0gICAgICAgIGNoYXIgc2VwID0gRmlsZS5zZXBhcmF0b3JDaGFyOwotICAgICAgICBjaGFyIGFsdFNlcCA9ICcvJzsKLSAgICAgICAgaW50IGxhc3QgPSBwYXRoLmxlbmd0aCgpIC0gMTsKLSAgICAgICAgaW50IGlkeCA9IGxhc3Q7Ci0gICAgICAgIGludCBhZGphY2VudERvdHMgPSAwOwotICAgICAgICBpbnQgbm9uRG90Q291bnQgPSAwOwotICAgICAgICB3aGlsZSAoaWR4ID4gMCkgewotICAgICAgICAgICAgY2hhciBjID0gcGF0aC5jaGFyQXQoaWR4KTsKLSAgICAgICAgICAgIGlmIChjID09ICcuJykgewotICAgICAgICAgICAgICAgIGlmICgrK2FkamFjZW50RG90cyA+PSAyKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFB1bnQgb24gcGF0aG5hbWVzIGNvbnRhaW5pbmcgLiBhbmQgLi4KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChub25Eb3RDb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFB1bnQgb24gcGF0aG5hbWVzIGVuZGluZyBpbiBhIC4KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChjID09IHNlcCkgewotICAgICAgICAgICAgICAgIGlmIChhZGphY2VudERvdHMgPT0gMSAmJiBub25Eb3RDb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFB1bnQgb24gcGF0aG5hbWVzIGNvbnRhaW5pbmcgLiBhbmQgLi4KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChpZHggPT0gMCB8fAotICAgICAgICAgICAgICAgICAgICBpZHggPj0gbGFzdCAtIDEgfHwKLSAgICAgICAgICAgICAgICAgICAgcGF0aC5jaGFyQXQoaWR4IC0gMSkgPT0gc2VwIHx8Ci0gICAgICAgICAgICAgICAgICAgIHBhdGguY2hhckF0KGlkeCAtIDEpID09IGFsdFNlcCkgewotICAgICAgICAgICAgICAgICAgICAvLyBQdW50IG9uIHBhdGhuYW1lcyBjb250YWluaW5nIGFkamFjZW50IHNsYXNoZXMKLSAgICAgICAgICAgICAgICAgICAgLy8gdG93YXJkIHRoZSBlbmQKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBwYXRoLnN1YnN0cmluZygwLCBpZHgpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChjID09IGFsdFNlcCkgewotICAgICAgICAgICAgICAgIC8vIFB1bnQgb24gcGF0aG5hbWVzIGNvbnRhaW5pbmcgYm90aCBiYWNrd2FyZCBhbmQKLSAgICAgICAgICAgICAgICAvLyBmb3J3YXJkIHNsYXNoZXMKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnKicgfHwgYyA9PSAnPycpIHsKLSAgICAgICAgICAgICAgICAvLyBQdW50IG9uIHBhdGhuYW1lcyBjb250YWluaW5nIHdpbGRjYXJkcwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICArK25vbkRvdENvdW50OwotICAgICAgICAgICAgICAgIGFkamFjZW50RG90cyA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAtLWlkeDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLQotICAgIC8qIC0tIEF0dHJpYnV0ZSBhY2Nlc3NvcnMgLS0gKi8KLQotICAgIHB1YmxpYyBuYXRpdmUgaW50IGdldEJvb2xlYW5BdHRyaWJ1dGVzKEZpbGUgZik7Ci0gICAgcHVibGljIG5hdGl2ZSBib29sZWFuIGNoZWNrQWNjZXNzKEZpbGUgZiwgaW50IGFjY2Vzcyk7Ci0gICAgcHVibGljIG5hdGl2ZSBsb25nIGdldExhc3RNb2RpZmllZFRpbWUoRmlsZSBmKTsKLSAgICBwdWJsaWMgbmF0aXZlIGxvbmcgZ2V0TGVuZ3RoKEZpbGUgZik7Ci0gICAgcHVibGljIG5hdGl2ZSBib29sZWFuIHNldFBlcm1pc3Npb24oRmlsZSBmLCBpbnQgYWNjZXNzLCBib29sZWFuIGVuYWJsZSwgYm9vbGVhbiBvd25lcm9ubHkpOwotCi0gICAgLyogLS0gRmlsZSBvcGVyYXRpb25zIC0tICovCi0KLSAgICBwdWJsaWMgbmF0aXZlIGJvb2xlYW4gY3JlYXRlRmlsZUV4Y2x1c2l2ZWx5KFN0cmluZyBwYXRoKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb247Ci0gICAgcHVibGljIGJvb2xlYW4gZGVsZXRlKEZpbGUgZikgewotICAgICAgICAvLyBLZWVwIGNhbm9uaWNhbGl6YXRpb24gY2FjaGVzIGluIHN5bmMgYWZ0ZXIgZmlsZSBkZWxldGlvbgotICAgICAgICAvLyBhbmQgcmVuYW1pbmcgb3BlcmF0aW9ucy4gQ291bGQgYmUgbW9yZSBjbGV2ZXIgdGhhbiB0aGlzCi0gICAgICAgIC8vIChpLmUuLCBvbmx5IHJlbW92ZS91cGRhdGUgYWZmZWN0ZWQgZW50cmllcykgYnV0IHByb2JhYmx5Ci0gICAgICAgIC8vIG5vdCB3b3J0aCBpdCBzaW5jZSB0aGVzZSBlbnRyaWVzIGV4cGlyZSBhZnRlciAzMCBzZWNvbmRzCi0gICAgICAgIC8vIGFueXdheS4KLSAgICAgICAgY2FjaGUuY2xlYXIoKTsKLSAgICAgICAgcHJlZml4Q2FjaGUuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuIGRlbGV0ZTAoZik7Ci0gICAgfQotICAgIHByb3RlY3RlZCBuYXRpdmUgYm9vbGVhbiBkZWxldGUwKEZpbGUgZik7Ci0gICAgcHVibGljIG5hdGl2ZSBTdHJpbmdbXSBsaXN0KEZpbGUgZik7Ci0gICAgcHVibGljIG5hdGl2ZSBib29sZWFuIGNyZWF0ZURpcmVjdG9yeShGaWxlIGYpOwotICAgIHB1YmxpYyBib29sZWFuIHJlbmFtZShGaWxlIGYxLCBGaWxlIGYyKSB7Ci0gICAgICAgIC8vIEtlZXAgY2Fub25pY2FsaXphdGlvbiBjYWNoZXMgaW4gc3luYyBhZnRlciBmaWxlIGRlbGV0aW9uCi0gICAgICAgIC8vIGFuZCByZW5hbWluZyBvcGVyYXRpb25zLiBDb3VsZCBiZSBtb3JlIGNsZXZlciB0aGFuIHRoaXMKLSAgICAgICAgLy8gKGkuZS4sIG9ubHkgcmVtb3ZlL3VwZGF0ZSBhZmZlY3RlZCBlbnRyaWVzKSBidXQgcHJvYmFibHkKLSAgICAgICAgLy8gbm90IHdvcnRoIGl0IHNpbmNlIHRoZXNlIGVudHJpZXMgZXhwaXJlIGFmdGVyIDMwIHNlY29uZHMKLSAgICAgICAgLy8gYW55d2F5LgotICAgICAgICBjYWNoZS5jbGVhcigpOwotICAgICAgICBwcmVmaXhDYWNoZS5jbGVhcigpOwotICAgICAgICByZXR1cm4gcmVuYW1lMChmMSwgZjIpOwotICAgIH0KLSAgICBwcm90ZWN0ZWQgbmF0aXZlIGJvb2xlYW4gcmVuYW1lMChGaWxlIGYxLCBGaWxlIGYyKTsKLSAgICBwdWJsaWMgbmF0aXZlIGJvb2xlYW4gc2V0TGFzdE1vZGlmaWVkVGltZShGaWxlIGYsIGxvbmcgdGltZSk7Ci0gICAgcHVibGljIG5hdGl2ZSBib29sZWFuIHNldFJlYWRPbmx5KEZpbGUgZik7Ci0KLQotICAgIC8qIC0tIEZpbGVzeXN0ZW0gaW50ZXJmYWNlIC0tICovCi0KLSAgICBwcml2YXRlIGJvb2xlYW4gYWNjZXNzKFN0cmluZyBwYXRoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTZWN1cml0eU1hbmFnZXIgc2VjdXJpdHkgPSBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCk7Ci0gICAgICAgICAgICBpZiAoc2VjdXJpdHkgIT0gbnVsbCkgc2VjdXJpdHkuY2hlY2tSZWFkKHBhdGgpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIHgpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbGlzdFJvb3RzMCgpOwotCi0gICAgcHVibGljIEZpbGVbXSBsaXN0Um9vdHMoKSB7Ci0gICAgICAgIGludCBkcyA9IGxpc3RSb290czAoKTsKLSAgICAgICAgaW50IG4gPSAwOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI2OyBpKyspIHsKLSAgICAgICAgICAgIGlmICgoKGRzID4+IGkpICYgMSkgIT0gMCkgewotICAgICAgICAgICAgICAgIGlmICghYWNjZXNzKChjaGFyKSgnQScgKyBpKSArICI6IiArIHNsYXNoKSkKLSAgICAgICAgICAgICAgICAgICAgZHMgJj0gfigxIDw8IGkpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgbisrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEZpbGVbXSBmcyA9IG5ldyBGaWxlW25dOwotICAgICAgICBpbnQgaiA9IDA7Ci0gICAgICAgIGNoYXIgc2xhc2ggPSB0aGlzLnNsYXNoOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI2OyBpKyspIHsKLSAgICAgICAgICAgIGlmICgoKGRzID4+IGkpICYgMSkgIT0gMCkKLSAgICAgICAgICAgICAgICBmc1tqKytdID0gbmV3IEZpbGUoKGNoYXIpKCdBJyArIGkpICsgIjoiICsgc2xhc2gpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmczsKLSAgICB9Ci0KLQotICAgIC8qIC0tIERpc2sgdXNhZ2UgLS0gKi8KLSAgICBwdWJsaWMgbG9uZyBnZXRTcGFjZShGaWxlIGYsIGludCB0KSB7Ci0gICAgICAgIGlmIChmLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICBGaWxlIGZpbGUgPSAoZi5pc0RpcmVjdG9yeSgpID8gZiA6IGYuZ2V0UGFyZW50RmlsZSgpKTsKLSAgICAgICAgICAgIHJldHVybiBnZXRTcGFjZTAoZmlsZSwgdCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBuYXRpdmUgbG9uZyBnZXRTcGFjZTAoRmlsZSBmLCBpbnQgdCk7Ci0KLQotICAgIC8qIC0tIEJhc2ljIGluZnJhc3RydWN0dXJlIC0tICovCi0KLSAgICBwdWJsaWMgaW50IGNvbXBhcmUoRmlsZSBmMSwgRmlsZSBmMikgewotICAgICAgICByZXR1cm4gZjEuZ2V0UGF0aCgpLmNvbXBhcmVUb0lnbm9yZUNhc2UoZjIuZ2V0UGF0aCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKEZpbGUgZikgewotICAgICAgICAvKiBDb3VsZCBtYWtlIHRoaXMgbW9yZSBlZmZpY2llbnQ6IFN0cmluZy5oYXNoQ29kZUlnbm9yZUNhc2UgKi8KLSAgICAgICAgcmV0dXJuIGYuZ2V0UGF0aCgpLnRvTG93ZXJDYXNlKExvY2FsZS5FTkdMSVNIKS5oYXNoQ29kZSgpIF4gMTIzNDMyMTsKLSAgICB9Ci0KLQotICAgIHByaXZhdGUgc3RhdGljIG5hdGl2ZSB2b2lkIGluaXRJRHMoKTsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIGluaXRJRHMoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2pkay9zcmMvd2luZG93cy9jbGFzc2VzL2phdmEvaW8vV2luTlRGaWxlU3lzdGVtLmphdmEgYi9qZGsvc3JjL3dpbmRvd3MvY2xhc3Nlcy9qYXZhL2lvL1dpbk5URmlsZVN5c3RlbS5qYXZhCmluZGV4IDVhZDJlZWIuLmNhYTQ3ZjggMTAwNjQ0Ci0tLSBhL2pkay9zcmMvd2luZG93cy9jbGFzc2VzL2phdmEvaW8vV2luTlRGaWxlU3lzdGVtLmphdmEKKysrIGIvamRrL3NyYy93aW5kb3dzL2NsYXNzZXMvamF2YS9pby9XaW5OVEZpbGVTeXN0ZW0uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIzLDM0ICsyMyw2MDEgQEAKICAqIHF1ZXN0aW9ucy4KICAqLwogCi0vKgotICovCi0KIHBhY2thZ2UgamF2YS5pbzsKIAoraW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IHN1bi5zZWN1cml0eS5hY3Rpb24uR2V0UHJvcGVydHlBY3Rpb247CisKIC8qKgogICogVW5pY29kZS1hd2FyZSBGaWxlU3lzdGVtIGZvciBXaW5kb3dzIE5ULzIwMDAuCiAgKgogICogQGF1dGhvciBLb25zdGFudGluIEtsYWRrbwogICogQHNpbmNlIDEuNAogICovCi1jbGFzcyBXaW5OVEZpbGVTeXN0ZW0gZXh0ZW5kcyBXaW4zMkZpbGVTeXN0ZW0geworY2xhc3MgV2luTlRGaWxlU3lzdGVtIGV4dGVuZHMgRmlsZVN5c3RlbSB7CiAKLSAgICBwcm90ZWN0ZWQgbmF0aXZlIFN0cmluZyBjYW5vbmljYWxpemUwKFN0cmluZyBwYXRoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uOwotICAgIHByb3RlY3RlZCBuYXRpdmUgU3RyaW5nIGNhbm9uaWNhbGl6ZVdpdGhQcmVmaXgwKFN0cmluZyBjYW5vbmljYWxQcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhdGhXaXRoQ2Fub25pY2FsUHJlZml4KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uOworICAgIHByaXZhdGUgZmluYWwgY2hhciBzbGFzaDsKKyAgICBwcml2YXRlIGZpbmFsIGNoYXIgYWx0U2xhc2g7CisgICAgcHJpdmF0ZSBmaW5hbCBjaGFyIHNlbWljb2xvbjsKKworICAgIHB1YmxpYyBXaW5OVEZpbGVTeXN0ZW0oKSB7CisgICAgICAgIHNsYXNoID0gQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCisgICAgICAgICAgICBuZXcgR2V0UHJvcGVydHlBY3Rpb24oImZpbGUuc2VwYXJhdG9yIikpLmNoYXJBdCgwKTsKKyAgICAgICAgc2VtaWNvbG9uID0gQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCisgICAgICAgICAgICBuZXcgR2V0UHJvcGVydHlBY3Rpb24oInBhdGguc2VwYXJhdG9yIikpLmNoYXJBdCgwKTsKKyAgICAgICAgYWx0U2xhc2ggPSAodGhpcy5zbGFzaCA9PSAnXFwnKSA/ICcvJyA6ICdcXCc7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGlzU2xhc2goY2hhciBjKSB7CisgICAgICAgIHJldHVybiAoYyA9PSAnXFwnKSB8fCAoYyA9PSAnLycpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpc0xldHRlcihjaGFyIGMpIHsKKyAgICAgICAgcmV0dXJuICgoYyA+PSAnYScpICYmIChjIDw9ICd6JykpIHx8ICgoYyA+PSAnQScpICYmIChjIDw9ICdaJykpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIHNsYXNoaWZ5KFN0cmluZyBwKSB7CisgICAgICAgIGlmICgocC5sZW5ndGgoKSA+IDApICYmIChwLmNoYXJBdCgwKSAhPSBzbGFzaCkpIHJldHVybiBzbGFzaCArIHA7CisgICAgICAgIGVsc2UgcmV0dXJuIHA7CisgICAgfQorCisgICAgLyogLS0gTm9ybWFsaXphdGlvbiBhbmQgY29uc3RydWN0aW9uIC0tICovCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgY2hhciBnZXRTZXBhcmF0b3IoKSB7CisgICAgICAgIHJldHVybiBzbGFzaDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgY2hhciBnZXRQYXRoU2VwYXJhdG9yKCkgeworICAgICAgICByZXR1cm4gc2VtaWNvbG9uOworICAgIH0KKworICAgIC8qIENoZWNrIHRoYXQgdGhlIGdpdmVuIHBhdGhuYW1lIGlzIG5vcm1hbC4gIElmIG5vdCwgaW52b2tlIHRoZSByZWFsCisgICAgICAgbm9ybWFsaXplciBvbiB0aGUgcGFydCBvZiB0aGUgcGF0aG5hbWUgdGhhdCByZXF1aXJlcyBub3JtYWxpemF0aW9uLgorICAgICAgIFRoaXMgd2F5IHdlIGl0ZXJhdGUgdGhyb3VnaCB0aGUgd2hvbGUgcGF0aG5hbWUgc3RyaW5nIG9ubHkgb25jZS4gKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIG5vcm1hbGl6ZShTdHJpbmcgcGF0aCkgeworICAgICAgICBpbnQgbiA9IHBhdGgubGVuZ3RoKCk7CisgICAgICAgIGNoYXIgc2xhc2ggPSB0aGlzLnNsYXNoOworICAgICAgICBjaGFyIGFsdFNsYXNoID0gdGhpcy5hbHRTbGFzaDsKKyAgICAgICAgY2hhciBwcmV2ID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgIGNoYXIgYyA9IHBhdGguY2hhckF0KGkpOworICAgICAgICAgICAgaWYgKGMgPT0gYWx0U2xhc2gpCisgICAgICAgICAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZShwYXRoLCBuLCAocHJldiA9PSBzbGFzaCkgPyBpIC0gMSA6IGkpOworICAgICAgICAgICAgaWYgKChjID09IHNsYXNoKSAmJiAocHJldiA9PSBzbGFzaCkgJiYgKGkgPiAxKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gbm9ybWFsaXplKHBhdGgsIG4sIGkgLSAxKTsKKyAgICAgICAgICAgIGlmICgoYyA9PSAnOicpICYmIChpID4gMSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZShwYXRoLCBuLCAwKTsKKyAgICAgICAgICAgIHByZXYgPSBjOworICAgICAgICB9CisgICAgICAgIGlmIChwcmV2ID09IHNsYXNoKSByZXR1cm4gbm9ybWFsaXplKHBhdGgsIG4sIG4gLSAxKTsKKyAgICAgICAgcmV0dXJuIHBhdGg7CisgICAgfQorCisgICAgLyogTm9ybWFsaXplIHRoZSBnaXZlbiBwYXRobmFtZSwgd2hvc2UgbGVuZ3RoIGlzIGxlbiwgc3RhcnRpbmcgYXQgdGhlIGdpdmVuCisgICAgICAgb2Zmc2V0OyBldmVyeXRoaW5nIGJlZm9yZSB0aGlzIG9mZnNldCBpcyBhbHJlYWR5IG5vcm1hbC4gKi8KKyAgICBwcml2YXRlIFN0cmluZyBub3JtYWxpemUoU3RyaW5nIHBhdGgsIGludCBsZW4sIGludCBvZmYpIHsKKyAgICAgICAgaWYgKGxlbiA9PSAwKSByZXR1cm4gcGF0aDsKKyAgICAgICAgaWYgKG9mZiA8IDMpIG9mZiA9IDA7ICAgLyogQXZvaWQgZmVuY2Vwb3N0IGNhc2VzIHdpdGggVU5DIHBhdGhuYW1lcyAqLworICAgICAgICBpbnQgc3JjOworICAgICAgICBjaGFyIHNsYXNoID0gdGhpcy5zbGFzaDsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihsZW4pOworCisgICAgICAgIGlmIChvZmYgPT0gMCkgeworICAgICAgICAgICAgLyogQ29tcGxldGUgbm9ybWFsaXphdGlvbiwgaW5jbHVkaW5nIHByZWZpeCAqLworICAgICAgICAgICAgc3JjID0gbm9ybWFsaXplUHJlZml4KHBhdGgsIGxlbiwgc2IpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogUGFydGlhbCBub3JtYWxpemF0aW9uICovCisgICAgICAgICAgICBzcmMgPSBvZmY7CisgICAgICAgICAgICBzYi5hcHBlbmQocGF0aC5zdWJzdHJpbmcoMCwgb2ZmKSk7CisgICAgICAgIH0KKworICAgICAgICAvKiBSZW1vdmUgcmVkdW5kYW50IHNsYXNoZXMgZnJvbSB0aGUgcmVtYWluZGVyIG9mIHRoZSBwYXRoLCBmb3JjaW5nIGFsbAorICAgICAgICAgICBzbGFzaGVzIGludG8gdGhlIHByZWZlcnJlZCBzbGFzaCAqLworICAgICAgICB3aGlsZSAoc3JjIDwgbGVuKSB7CisgICAgICAgICAgICBjaGFyIGMgPSBwYXRoLmNoYXJBdChzcmMrKyk7CisgICAgICAgICAgICBpZiAoaXNTbGFzaChjKSkgeworICAgICAgICAgICAgICAgIHdoaWxlICgoc3JjIDwgbGVuKSAmJiBpc1NsYXNoKHBhdGguY2hhckF0KHNyYykpKSBzcmMrKzsKKyAgICAgICAgICAgICAgICBpZiAoc3JjID09IGxlbikgeworICAgICAgICAgICAgICAgICAgICAvKiBDaGVjayBmb3IgdHJhaWxpbmcgc2VwYXJhdG9yICovCisgICAgICAgICAgICAgICAgICAgIGludCBzbiA9IHNiLmxlbmd0aCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoKHNuID09IDIpICYmIChzYi5jaGFyQXQoMSkgPT0gJzonKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogIno6XFwiICovCisgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoc2xhc2gpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHNuID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qICJcXCIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChzbGFzaCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoKHNuID09IDEpICYmIChpc1NsYXNoKHNiLmNoYXJBdCgwKSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiAiXFxcXCIgaXMgbm90IGNvbGxhcHNlZCB0byAiXFwiIGJlY2F1c2UgIlxcXFwiIG1hcmtzCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYmVnaW5uaW5nIG9mIGEgVU5DIHBhdGhuYW1lLiAgRXZlbiB0aG91Z2ggaXQgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCwgYnkgaXRzZWxmLCBhIHZhbGlkIFVOQyBwYXRobmFtZSwgd2UgbGVhdmUgaXQgYXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGluIG9yZGVyIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgd2luMzIgQVBJcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIHRyZWF0IHRoaXMgY2FzZSBhcyBhbiBpbnZhbGlkIFVOQyBwYXRobmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0aGVyIHRoYW4gYXMgYW4gYWxpYXMgZm9yIHRoZSByb290IGRpcmVjdG9yeSBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGN1cnJlbnQgZHJpdmUuICovCisgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoc2xhc2gpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLyogUGF0aCBkb2VzIG5vdCBkZW5vdGUgYSByb290IGRpcmVjdG9yeSwgc28gZG8gbm90IGFwcGVuZAorICAgICAgICAgICAgICAgICAgICAgICB0cmFpbGluZyBzbGFzaCAqLworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoc2xhc2gpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHJ2ID0gc2IudG9TdHJpbmcoKTsKKyAgICAgICAgcmV0dXJuIHJ2OworICAgIH0KKworICAgIC8qIEEgbm9ybWFsIFdpbjMyIHBhdGhuYW1lIGNvbnRhaW5zIG5vIGR1cGxpY2F0ZSBzbGFzaGVzLCBleGNlcHQgcG9zc2libHkKKyAgICAgICBmb3IgYSBVTkMgcHJlZml4LCBhbmQgZG9lcyBub3QgZW5kIHdpdGggYSBzbGFzaC4gIEl0IG1heSBiZSB0aGUgZW1wdHkKKyAgICAgICBzdHJpbmcuICBOb3JtYWxpemVkIFdpbjMyIHBhdGhuYW1lcyBoYXZlIHRoZSBjb252ZW5pZW50IHByb3BlcnR5IHRoYXQKKyAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSBwcmVmaXggYWxtb3N0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIHR5cGUgb2YgdGhlIHBhdGgKKyAgICAgICBhbmQgd2hldGhlciBpdCBpcyBhYnNvbHV0ZSBvciByZWxhdGl2ZToKKworICAgICAgICAgICAwICByZWxhdGl2ZSB0byBib3RoIGRyaXZlIGFuZCBkaXJlY3RvcnkKKyAgICAgICAgICAgMSAgZHJpdmUtcmVsYXRpdmUgKGJlZ2lucyB3aXRoICdcXCcpCisgICAgICAgICAgIDIgIGFic29sdXRlIFVOQyAoaWYgZmlyc3QgY2hhciBpcyAnXFwnKSwKKyAgICAgICAgICAgICAgICBlbHNlIGRpcmVjdG9yeS1yZWxhdGl2ZSAoaGFzIGZvcm0gIno6Zm9vIikKKyAgICAgICAgICAgMyAgYWJzb2x1dGUgbG9jYWwgcGF0aG5hbWUgKGJlZ2lucyB3aXRoICJ6OlxcIikKKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBub3JtYWxpemVQcmVmaXgoU3RyaW5nIHBhdGgsIGludCBsZW4sIFN0cmluZ0J1ZmZlciBzYikgeworICAgICAgICBpbnQgc3JjID0gMDsKKyAgICAgICAgd2hpbGUgKChzcmMgPCBsZW4pICYmIGlzU2xhc2gocGF0aC5jaGFyQXQoc3JjKSkpIHNyYysrOworICAgICAgICBjaGFyIGM7CisgICAgICAgIGlmICgobGVuIC0gc3JjID49IDIpCisgICAgICAgICAgICAmJiBpc0xldHRlcihjID0gcGF0aC5jaGFyQXQoc3JjKSkKKyAgICAgICAgICAgICYmIHBhdGguY2hhckF0KHNyYyArIDEpID09ICc6JykgeworICAgICAgICAgICAgLyogUmVtb3ZlIGxlYWRpbmcgc2xhc2hlcyBpZiBmb2xsb3dlZCBieSBkcml2ZSBzcGVjaWZpZXIuCisgICAgICAgICAgICAgICBUaGlzIGhhY2sgaXMgbmVjZXNzYXJ5IHRvIHN1cHBvcnQgZmlsZSBVUkxzIGNvbnRhaW5pbmcgZHJpdmUKKyAgICAgICAgICAgICAgIHNwZWNpZmllcnMgKGUuZy4sICJmaWxlOi8vYzovcGF0aCIpLiAgQXMgYSBzaWRlIGVmZmVjdCwKKyAgICAgICAgICAgICAgICIvYzovcGF0aCIgY2FuIGJlIHVzZWQgYXMgYW4gYWx0ZXJuYXRpdmUgdG8gImM6L3BhdGgiLiAqLworICAgICAgICAgICAgc2IuYXBwZW5kKGMpOworICAgICAgICAgICAgc2IuYXBwZW5kKCc6Jyk7CisgICAgICAgICAgICBzcmMgKz0gMjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNyYyA9IDA7CisgICAgICAgICAgICBpZiAoKGxlbiA+PSAyKQorICAgICAgICAgICAgICAgICYmIGlzU2xhc2gocGF0aC5jaGFyQXQoMCkpCisgICAgICAgICAgICAgICAgJiYgaXNTbGFzaChwYXRoLmNoYXJBdCgxKSkpIHsKKyAgICAgICAgICAgICAgICAvKiBVTkMgcGF0aG5hbWU6IFJldGFpbiBmaXJzdCBzbGFzaDsgbGVhdmUgc3JjIHBvaW50ZWQgYXQKKyAgICAgICAgICAgICAgICAgICBzZWNvbmQgc2xhc2ggc28gdGhhdCBmdXJ0aGVyIHNsYXNoZXMgd2lsbCBiZSBjb2xsYXBzZWQKKyAgICAgICAgICAgICAgICAgICBpbnRvIHRoZSBzZWNvbmQgc2xhc2guICBUaGUgcmVzdWx0IHdpbGwgYmUgYSBwYXRobmFtZQorICAgICAgICAgICAgICAgICAgIGJlZ2lubmluZyB3aXRoICJcXFxcIiBmb2xsb3dlZCAobW9zdCBsaWtlbHkpIGJ5IGEgaG9zdAorICAgICAgICAgICAgICAgICAgIG5hbWUuICovCisgICAgICAgICAgICAgICAgc3JjID0gMTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoc2xhc2gpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzcmM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBwcmVmaXhMZW5ndGgoU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgY2hhciBzbGFzaCA9IHRoaXMuc2xhc2g7CisgICAgICAgIGludCBuID0gcGF0aC5sZW5ndGgoKTsKKyAgICAgICAgaWYgKG4gPT0gMCkgcmV0dXJuIDA7CisgICAgICAgIGNoYXIgYzAgPSBwYXRoLmNoYXJBdCgwKTsKKyAgICAgICAgY2hhciBjMSA9IChuID4gMSkgPyBwYXRoLmNoYXJBdCgxKSA6IDA7CisgICAgICAgIGlmIChjMCA9PSBzbGFzaCkgeworICAgICAgICAgICAgaWYgKGMxID09IHNsYXNoKSByZXR1cm4gMjsgIC8qIEFic29sdXRlIFVOQyBwYXRobmFtZSAiXFxcXGZvbyIgKi8KKyAgICAgICAgICAgIHJldHVybiAxOyAgICAgICAgICAgICAgICAgICAvKiBEcml2ZS1yZWxhdGl2ZSAiXFxmb28iICovCisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzTGV0dGVyKGMwKSAmJiAoYzEgPT0gJzonKSkgeworICAgICAgICAgICAgaWYgKChuID4gMikgJiYgKHBhdGguY2hhckF0KDIpID09IHNsYXNoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMzsgICAgICAgICAgICAgICAvKiBBYnNvbHV0ZSBsb2NhbCBwYXRobmFtZSAiejpcXGZvbyIgKi8KKyAgICAgICAgICAgIHJldHVybiAyOyAgICAgICAgICAgICAgICAgICAvKiBEaXJlY3RvcnktcmVsYXRpdmUgIno6Zm9vIiAqLworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOyAgICAgICAgICAgICAgICAgICAgICAgLyogQ29tcGxldGVseSByZWxhdGl2ZSAqLworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgcmVzb2x2ZShTdHJpbmcgcGFyZW50LCBTdHJpbmcgY2hpbGQpIHsKKyAgICAgICAgaW50IHBuID0gcGFyZW50Lmxlbmd0aCgpOworICAgICAgICBpZiAocG4gPT0gMCkgcmV0dXJuIGNoaWxkOworICAgICAgICBpbnQgY24gPSBjaGlsZC5sZW5ndGgoKTsKKyAgICAgICAgaWYgKGNuID09IDApIHJldHVybiBwYXJlbnQ7CisKKyAgICAgICAgU3RyaW5nIGMgPSBjaGlsZDsKKyAgICAgICAgaW50IGNoaWxkU3RhcnQgPSAwOworICAgICAgICBpbnQgcGFyZW50RW5kID0gcG47CisKKyAgICAgICAgaWYgKChjbiA+IDEpICYmIChjLmNoYXJBdCgwKSA9PSBzbGFzaCkpIHsKKyAgICAgICAgICAgIGlmIChjLmNoYXJBdCgxKSA9PSBzbGFzaCkgeworICAgICAgICAgICAgICAgIC8qIERyb3AgcHJlZml4IHdoZW4gY2hpbGQgaXMgYSBVTkMgcGF0aG5hbWUgKi8KKyAgICAgICAgICAgICAgICBjaGlsZFN0YXJ0ID0gMjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogRHJvcCBwcmVmaXggd2hlbiBjaGlsZCBpcyBkcml2ZS1yZWxhdGl2ZSAqLworICAgICAgICAgICAgICAgIGNoaWxkU3RhcnQgPSAxOworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY24gPT0gY2hpbGRTdGFydCkgeyAvLyBDaGlsZCBpcyBkb3VibGUgc2xhc2gKKyAgICAgICAgICAgICAgICBpZiAocGFyZW50LmNoYXJBdChwbiAtIDEpID09IHNsYXNoKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyZW50LnN1YnN0cmluZygwLCBwbiAtIDEpOworICAgICAgICAgICAgICAgIHJldHVybiBwYXJlbnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocGFyZW50LmNoYXJBdChwbiAtIDEpID09IHNsYXNoKQorICAgICAgICAgICAgcGFyZW50RW5kLS07CisKKyAgICAgICAgaW50IHN0cmxlbiA9IHBhcmVudEVuZCArIGNuIC0gY2hpbGRTdGFydDsKKyAgICAgICAgY2hhcltdIHRoZUNoYXJzID0gbnVsbDsKKyAgICAgICAgaWYgKGNoaWxkLmNoYXJBdChjaGlsZFN0YXJ0KSA9PSBzbGFzaCkgeworICAgICAgICAgICAgdGhlQ2hhcnMgPSBuZXcgY2hhcltzdHJsZW5dOworICAgICAgICAgICAgcGFyZW50LmdldENoYXJzKDAsIHBhcmVudEVuZCwgdGhlQ2hhcnMsIDApOworICAgICAgICAgICAgY2hpbGQuZ2V0Q2hhcnMoY2hpbGRTdGFydCwgY24sIHRoZUNoYXJzLCBwYXJlbnRFbmQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhlQ2hhcnMgPSBuZXcgY2hhcltzdHJsZW4gKyAxXTsKKyAgICAgICAgICAgIHBhcmVudC5nZXRDaGFycygwLCBwYXJlbnRFbmQsIHRoZUNoYXJzLCAwKTsKKyAgICAgICAgICAgIHRoZUNoYXJzW3BhcmVudEVuZF0gPSBzbGFzaDsKKyAgICAgICAgICAgIGNoaWxkLmdldENoYXJzKGNoaWxkU3RhcnQsIGNuLCB0aGVDaGFycywgcGFyZW50RW5kICsgMSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcodGhlQ2hhcnMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFBhcmVudCgpIHsKKyAgICAgICAgcmV0dXJuICgiIiArIHNsYXNoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGZyb21VUklQYXRoKFN0cmluZyBwYXRoKSB7CisgICAgICAgIFN0cmluZyBwID0gcGF0aDsKKyAgICAgICAgaWYgKChwLmxlbmd0aCgpID4gMikgJiYgKHAuY2hhckF0KDIpID09ICc6JykpIHsKKyAgICAgICAgICAgIC8vICIvYzovZm9vIiAtLT4gImM6L2ZvbyIKKyAgICAgICAgICAgIHAgPSBwLnN1YnN0cmluZygxKTsKKyAgICAgICAgICAgIC8vICJjOi9mb28vIiAtLT4gImM6L2ZvbyIsIGJ1dCAiYzovIiAtLT4gImM6LyIKKyAgICAgICAgICAgIGlmICgocC5sZW5ndGgoKSA+IDMpICYmIHAuZW5kc1dpdGgoIi8iKSkKKyAgICAgICAgICAgICAgICBwID0gcC5zdWJzdHJpbmcoMCwgcC5sZW5ndGgoKSAtIDEpOworICAgICAgICB9IGVsc2UgaWYgKChwLmxlbmd0aCgpID4gMSkgJiYgcC5lbmRzV2l0aCgiLyIpKSB7CisgICAgICAgICAgICAvLyAiL2Zvby8iIC0tPiAiL2ZvbyIKKyAgICAgICAgICAgIHAgPSBwLnN1YnN0cmluZygwLCBwLmxlbmd0aCgpIC0gMSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHA7CisgICAgfQorCisgICAgLyogLS0gUGF0aCBvcGVyYXRpb25zIC0tICovCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Fic29sdXRlKEZpbGUgZikgeworICAgICAgICBpbnQgcGwgPSBmLmdldFByZWZpeExlbmd0aCgpOworICAgICAgICByZXR1cm4gKCgocGwgPT0gMikgJiYgKGYuZ2V0UGF0aCgpLmNoYXJBdCgwKSA9PSBzbGFzaCkpCisgICAgICAgICAgICAgICAgfHwgKHBsID09IDMpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHJlc29sdmUoRmlsZSBmKSB7CisgICAgICAgIFN0cmluZyBwYXRoID0gZi5nZXRQYXRoKCk7CisgICAgICAgIGludCBwbCA9IGYuZ2V0UHJlZml4TGVuZ3RoKCk7CisgICAgICAgIGlmICgocGwgPT0gMikgJiYgKHBhdGguY2hhckF0KDApID09IHNsYXNoKSkKKyAgICAgICAgICAgIHJldHVybiBwYXRoOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVOQyAqLworICAgICAgICBpZiAocGwgPT0gMykKKyAgICAgICAgICAgIHJldHVybiBwYXRoOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFic29sdXRlIGxvY2FsICovCisgICAgICAgIGlmIChwbCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIGdldFVzZXJQYXRoKCkgKyBzbGFzaGlmeShwYXRoKTsgLyogQ29tcGxldGVseSByZWxhdGl2ZSAqLworICAgICAgICBpZiAocGwgPT0gMSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRHJpdmUtcmVsYXRpdmUgKi8KKyAgICAgICAgICAgIFN0cmluZyB1cCA9IGdldFVzZXJQYXRoKCk7CisgICAgICAgICAgICBTdHJpbmcgdWQgPSBnZXREcml2ZSh1cCk7CisgICAgICAgICAgICBpZiAodWQgIT0gbnVsbCkgcmV0dXJuIHVkICsgcGF0aDsKKyAgICAgICAgICAgIHJldHVybiB1cCArIHBhdGg7ICAgICAgICAgICAgICAgICAgIC8qIFVzZXIgZGlyIGlzIGEgVU5DIHBhdGggKi8KKyAgICAgICAgfQorICAgICAgICBpZiAocGwgPT0gMikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGlyZWN0b3J5LXJlbGF0aXZlICovCisgICAgICAgICAgICBTdHJpbmcgdXAgPSBnZXRVc2VyUGF0aCgpOworICAgICAgICAgICAgU3RyaW5nIHVkID0gZ2V0RHJpdmUodXApOworICAgICAgICAgICAgaWYgKCh1ZCAhPSBudWxsKSAmJiBwYXRoLnN0YXJ0c1dpdGgodWQpKQorICAgICAgICAgICAgICAgIHJldHVybiB1cCArIHNsYXNoaWZ5KHBhdGguc3Vic3RyaW5nKDIpKTsKKyAgICAgICAgICAgIGNoYXIgZHJpdmUgPSBwYXRoLmNoYXJBdCgwKTsKKyAgICAgICAgICAgIFN0cmluZyBkaXIgPSBnZXREcml2ZURpcmVjdG9yeShkcml2ZSk7CisgICAgICAgICAgICBTdHJpbmcgbnA7CisgICAgICAgICAgICBpZiAoZGlyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvKiBXaGVuIHJlc29sdmluZyBhIGRpcmVjdG9yeS1yZWxhdGl2ZSBwYXRoIHRoYXQgcmVmZXJzIHRvIGEKKyAgICAgICAgICAgICAgICAgICBkcml2ZSBvdGhlciB0aGFuIHRoZSBjdXJyZW50IGRyaXZlLCBpbnNpc3QgdGhhdCB0aGUgY2FsbGVyCisgICAgICAgICAgICAgICAgICAgaGF2ZSByZWFkIHBlcm1pc3Npb24gb24gdGhlIHJlc3VsdCAqLworICAgICAgICAgICAgICAgIFN0cmluZyBwID0gZHJpdmUgKyAoJzonICsgZGlyICsgc2xhc2hpZnkocGF0aC5zdWJzdHJpbmcoMikpKTsKKyAgICAgICAgICAgICAgICBTZWN1cml0eU1hbmFnZXIgc2VjdXJpdHkgPSBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNlY3VyaXR5ICE9IG51bGwpIHNlY3VyaXR5LmNoZWNrUmVhZChwKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiB4KSB7CisgICAgICAgICAgICAgICAgICAgIC8qIERvbid0IGRpc2Nsb3NlIHRoZSBkcml2ZSdzIGRpcmVjdG9yeSBpbiB0aGUgZXhjZXB0aW9uICovCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbigiQ2Fubm90IHJlc29sdmUgcGF0aCAiICsgcGF0aCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGRyaXZlICsgIjoiICsgc2xhc2hpZnkocGF0aC5zdWJzdHJpbmcoMikpOyAvKiBmYWtlIGl0ICovCisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoIlVucmVzb2x2YWJsZSBwYXRoOiAiICsgcGF0aCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0VXNlclBhdGgoKSB7CisgICAgICAgIC8qIEZvciBib3RoIGNvbXBhdGliaWxpdHkgYW5kIHNlY3VyaXR5LAorICAgICAgICAgICB3ZSBtdXN0IGxvb2sgdGhpcyB1cCBldmVyeSB0aW1lICovCisgICAgICAgIHJldHVybiBub3JtYWxpemUoU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBnZXREcml2ZShTdHJpbmcgcGF0aCkgeworICAgICAgICBpbnQgcGwgPSBwcmVmaXhMZW5ndGgocGF0aCk7CisgICAgICAgIHJldHVybiAocGwgPT0gMykgPyBwYXRoLnN1YnN0cmluZygwLCAyKSA6IG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gZHJpdmVEaXJDYWNoZSA9IG5ldyBTdHJpbmdbMjZdOworCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGRyaXZlSW5kZXgoY2hhciBkKSB7CisgICAgICAgIGlmICgoZCA+PSAnYScpICYmIChkIDw9ICd6JykpIHJldHVybiBkIC0gJ2EnOworICAgICAgICBpZiAoKGQgPj0gJ0EnKSAmJiAoZCA8PSAnWicpKSByZXR1cm4gZCAtICdBJzsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHByaXZhdGUgbmF0aXZlIFN0cmluZyBnZXREcml2ZURpcmVjdG9yeShpbnQgZHJpdmUpOworCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0RHJpdmVEaXJlY3RvcnkoY2hhciBkcml2ZSkgeworICAgICAgICBpbnQgaSA9IGRyaXZlSW5kZXgoZHJpdmUpOworICAgICAgICBpZiAoaSA8IDApIHJldHVybiBudWxsOworICAgICAgICBTdHJpbmcgcyA9IGRyaXZlRGlyQ2FjaGVbaV07CisgICAgICAgIGlmIChzICE9IG51bGwpIHJldHVybiBzOworICAgICAgICBzID0gZ2V0RHJpdmVEaXJlY3RvcnkoaSArIDEpOworICAgICAgICBkcml2ZURpckNhY2hlW2ldID0gczsKKyAgICAgICAgcmV0dXJuIHM7CisgICAgfQorCisgICAgLy8gQ2FjaGVzIGZvciBjYW5vbmljYWxpemF0aW9uIHJlc3VsdHMgdG8gaW1wcm92ZSBzdGFydHVwIHBlcmZvcm1hbmNlLgorICAgIC8vIFRoZSBmaXJzdCBjYWNoZSBoYW5kbGVzIHJlcGVhdGVkIGNhbm9uaWNhbGl6YXRpb25zIG9mIHRoZSBzYW1lIHBhdGgKKyAgICAvLyBuYW1lLiBUaGUgcHJlZml4IGNhY2hlIGhhbmRsZXMgcmVwZWF0ZWQgY2Fub25pY2FsaXphdGlvbnMgd2l0aGluIHRoZQorICAgIC8vIHNhbWUgZGlyZWN0b3J5LCBhbmQgbXVzdCBub3QgY3JlYXRlIHJlc3VsdHMgZGlmZmVyaW5nIGZyb20gdGhlIHRydWUKKyAgICAvLyBjYW5vbmljYWxpemF0aW9uIGFsZ29yaXRobSBpbiBjYW5vbmljYWxpemVfbWQuYy4gRm9yIHRoaXMgcmVhc29uIHRoZQorICAgIC8vIHByZWZpeCBjYWNoZSBpcyBjb25zZXJ2YXRpdmUgYW5kIGlzIG5vdCB1c2VkIGZvciBjb21wbGV4IHBhdGggbmFtZXMuCisgICAgcHJpdmF0ZSBFeHBpcmluZ0NhY2hlIGNhY2hlICAgICAgID0gbmV3IEV4cGlyaW5nQ2FjaGUoKTsKKyAgICBwcml2YXRlIEV4cGlyaW5nQ2FjaGUgcHJlZml4Q2FjaGUgPSBuZXcgRXhwaXJpbmdDYWNoZSgpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBjYW5vbmljYWxpemUoU3RyaW5nIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIElmIHBhdGggaXMgYSBkcml2ZSBsZXR0ZXIgb25seSB0aGVuIHNraXAgY2Fub25pY2FsaXphdGlvbgorICAgICAgICBpbnQgbGVuID0gcGF0aC5sZW5ndGgoKTsKKyAgICAgICAgaWYgKChsZW4gPT0gMikgJiYKKyAgICAgICAgICAgIChpc0xldHRlcihwYXRoLmNoYXJBdCgwKSkpICYmCisgICAgICAgICAgICAocGF0aC5jaGFyQXQoMSkgPT0gJzonKSkgeworICAgICAgICAgICAgY2hhciBjID0gcGF0aC5jaGFyQXQoMCk7CisgICAgICAgICAgICBpZiAoKGMgPj0gJ0EnKSAmJiAoYyA8PSAnWicpKQorICAgICAgICAgICAgICAgIHJldHVybiBwYXRoOworICAgICAgICAgICAgcmV0dXJuICIiICsgKChjaGFyKSAoYy0zMikpICsgJzonOworICAgICAgICB9IGVsc2UgaWYgKChsZW4gPT0gMykgJiYKKyAgICAgICAgICAgICAgICAgICAoaXNMZXR0ZXIocGF0aC5jaGFyQXQoMCkpKSAmJgorICAgICAgICAgICAgICAgICAgIChwYXRoLmNoYXJBdCgxKSA9PSAnOicpICYmCisgICAgICAgICAgICAgICAgICAgKHBhdGguY2hhckF0KDIpID09ICdcXCcpKSB7CisgICAgICAgICAgICBjaGFyIGMgPSBwYXRoLmNoYXJBdCgwKTsKKyAgICAgICAgICAgIGlmICgoYyA+PSAnQScpICYmIChjIDw9ICdaJykpCisgICAgICAgICAgICAgICAgcmV0dXJuIHBhdGg7CisgICAgICAgICAgICByZXR1cm4gIiIgKyAoKGNoYXIpIChjLTMyKSkgKyAnOicgKyAnXFwnOworICAgICAgICB9CisgICAgICAgIGlmICghdXNlQ2Fub25DYWNoZXMpIHsKKyAgICAgICAgICAgIHJldHVybiBjYW5vbmljYWxpemUwKHBhdGgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU3RyaW5nIHJlcyA9IGNhY2hlLmdldChwYXRoKTsKKyAgICAgICAgICAgIGlmIChyZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFN0cmluZyBkaXIgPSBudWxsOworICAgICAgICAgICAgICAgIFN0cmluZyByZXNEaXIgPSBudWxsOworICAgICAgICAgICAgICAgIGlmICh1c2VDYW5vblByZWZpeENhY2hlKSB7CisgICAgICAgICAgICAgICAgICAgIGRpciA9IHBhcmVudE9yTnVsbChwYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRpciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXNEaXIgPSBwcmVmaXhDYWNoZS5nZXQoZGlyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNEaXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogSGl0IG9ubHkgaW4gcHJlZml4IGNhY2hlOyBmdWxsIHBhdGggaXMgY2Fub25pY2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGJ1dCB3ZSBuZWVkIHRvIGdldCB0aGUgY2Fub25pY2FsIG5hbWUgb2YgdGhlIGZpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBpbiB0aGlzIGRpcmVjdG9yeSB0byBnZXQgdGhlIGFwcHJvcHJpYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogY2FwaXRhbGl6YXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSBwYXRoLnN1YnN0cmluZygxICsgZGlyLmxlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMgPSBjYW5vbmljYWxpemVXaXRoUHJlZml4KHJlc0RpciwgZmlsZW5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlLnB1dChkaXIgKyBGaWxlLnNlcGFyYXRvckNoYXIgKyBmaWxlbmFtZSwgcmVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocmVzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzID0gY2Fub25pY2FsaXplMChwYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgY2FjaGUucHV0KHBhdGgsIHJlcyk7CisgICAgICAgICAgICAgICAgICAgIGlmICh1c2VDYW5vblByZWZpeENhY2hlICYmIGRpciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXNEaXIgPSBwYXJlbnRPck51bGwocmVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNEaXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKHJlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGYuZXhpc3RzKCkgJiYgIWYuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXhDYWNoZS5wdXQoZGlyLCByZXNEaXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIG5hdGl2ZSBTdHJpbmcgY2Fub25pY2FsaXplMChTdHJpbmcgcGF0aCkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgIHByaXZhdGUgU3RyaW5nIGNhbm9uaWNhbGl6ZVdpdGhQcmVmaXgoU3RyaW5nIGNhbm9uaWNhbFByZWZpeCwKKyAgICAgICAgICAgIFN0cmluZyBmaWxlbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gY2Fub25pY2FsaXplV2l0aFByZWZpeDAoY2Fub25pY2FsUHJlZml4LAorICAgICAgICAgICAgICAgIGNhbm9uaWNhbFByZWZpeCArIEZpbGUuc2VwYXJhdG9yQ2hhciArIGZpbGVuYW1lKTsKKyAgICB9CisKKyAgICAvLyBSdW4gdGhlIGNhbm9uaWNhbGl6YXRpb24gb3BlcmF0aW9uIGFzc3VtaW5nIHRoYXQgdGhlIHByZWZpeAorICAgIC8vIChldmVyeXRoaW5nIHVwIHRvIHRoZSBsYXN0IGZpbGVuYW1lKSBpcyBjYW5vbmljYWw7IGp1c3QgZ2V0cworICAgIC8vIHRoZSBjYW5vbmljYWwgbmFtZSBvZiB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZSBwYXRoCisgICAgcHJpdmF0ZSBuYXRpdmUgU3RyaW5nIGNhbm9uaWNhbGl6ZVdpdGhQcmVmaXgwKFN0cmluZyBjYW5vbmljYWxQcmVmaXgsCisgICAgICAgICAgICBTdHJpbmcgcGF0aFdpdGhDYW5vbmljYWxQcmVmaXgpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAvLyBCZXN0LWVmZm9ydCBhdHRlbXB0IHRvIGdldCBwYXJlbnQgb2YgdGhpcyBwYXRoOyB1c2VkIGZvcgorICAgIC8vIG9wdGltaXphdGlvbiBvZiBmaWxlbmFtZSBjYW5vbmljYWxpemF0aW9uLiBUaGlzIG11c3QgcmV0dXJuIG51bGwgZm9yCisgICAgLy8gYW55IGNhc2VzIHdoZXJlIHRoZSBjb2RlIGluIGNhbm9uaWNhbGl6ZV9tZC5jIHdvdWxkIHRocm93IGFuCisgICAgLy8gZXhjZXB0aW9uIG9yIG90aGVyd2lzZSBkZWFsIHdpdGggbm9uLXNpbXBsZSBwYXRobmFtZXMgbGlrZSBoYW5kbGluZworICAgIC8vIG9mICIuIiBhbmQgIi4uIi4gSXQgbWF5IGNvbnNlcnZhdGl2ZWx5IHJldHVybiBudWxsIGluIG90aGVyCisgICAgLy8gc2l0dWF0aW9ucyBhcyB3ZWxsLiBSZXR1cm5pbmcgbnVsbCB3aWxsIGNhdXNlIHRoZSB1bmRlcmx5aW5nCisgICAgLy8gKGV4cGVuc2l2ZSkgY2Fub25pY2FsaXphdGlvbiByb3V0aW5lIHRvIGJlIGNhbGxlZC4KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcGFyZW50T3JOdWxsKFN0cmluZyBwYXRoKSB7CisgICAgICAgIGlmIChwYXRoID09IG51bGwpIHJldHVybiBudWxsOworICAgICAgICBjaGFyIHNlcCA9IEZpbGUuc2VwYXJhdG9yQ2hhcjsKKyAgICAgICAgY2hhciBhbHRTZXAgPSAnLyc7CisgICAgICAgIGludCBsYXN0ID0gcGF0aC5sZW5ndGgoKSAtIDE7CisgICAgICAgIGludCBpZHggPSBsYXN0OworICAgICAgICBpbnQgYWRqYWNlbnREb3RzID0gMDsKKyAgICAgICAgaW50IG5vbkRvdENvdW50ID0gMDsKKyAgICAgICAgd2hpbGUgKGlkeCA+IDApIHsKKyAgICAgICAgICAgIGNoYXIgYyA9IHBhdGguY2hhckF0KGlkeCk7CisgICAgICAgICAgICBpZiAoYyA9PSAnLicpIHsKKyAgICAgICAgICAgICAgICBpZiAoKythZGphY2VudERvdHMgPj0gMikgeworICAgICAgICAgICAgICAgICAgICAvLyBQdW50IG9uIHBhdGhuYW1lcyBjb250YWluaW5nIC4gYW5kIC4uCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobm9uRG90Q291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyBQdW50IG9uIHBhdGhuYW1lcyBlbmRpbmcgaW4gYSAuCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSBzZXApIHsKKyAgICAgICAgICAgICAgICBpZiAoYWRqYWNlbnREb3RzID09IDEgJiYgbm9uRG90Q291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyBQdW50IG9uIHBhdGhuYW1lcyBjb250YWluaW5nIC4gYW5kIC4uCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaWR4ID09IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgaWR4ID49IGxhc3QgLSAxIHx8CisgICAgICAgICAgICAgICAgICAgIHBhdGguY2hhckF0KGlkeCAtIDEpID09IHNlcCB8fAorICAgICAgICAgICAgICAgICAgICBwYXRoLmNoYXJBdChpZHggLSAxKSA9PSBhbHRTZXApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gUHVudCBvbiBwYXRobmFtZXMgY29udGFpbmluZyBhZGphY2VudCBzbGFzaGVzCisgICAgICAgICAgICAgICAgICAgIC8vIHRvd2FyZCB0aGUgZW5kCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gcGF0aC5zdWJzdHJpbmcoMCwgaWR4KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSBhbHRTZXApIHsKKyAgICAgICAgICAgICAgICAvLyBQdW50IG9uIHBhdGhuYW1lcyBjb250YWluaW5nIGJvdGggYmFja3dhcmQgYW5kCisgICAgICAgICAgICAgICAgLy8gZm9yd2FyZCBzbGFzaGVzCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJyonIHx8IGMgPT0gJz8nKSB7CisgICAgICAgICAgICAgICAgLy8gUHVudCBvbiBwYXRobmFtZXMgY29udGFpbmluZyB3aWxkY2FyZHMKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKytub25Eb3RDb3VudDsKKyAgICAgICAgICAgICAgICBhZGphY2VudERvdHMgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLS1pZHg7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQogCiAgICAgLyogLS0gQXR0cmlidXRlIGFjY2Vzc29ycyAtLSAqLwogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIG5hdGl2ZSBpbnQgZ2V0Qm9vbGVhbkF0dHJpYnV0ZXMoRmlsZSBmKTsKKworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBuYXRpdmUgYm9vbGVhbiBjaGVja0FjY2VzcyhGaWxlIGYsIGludCBhY2Nlc3MpOworCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIG5hdGl2ZSBsb25nIGdldExhc3RNb2RpZmllZFRpbWUoRmlsZSBmKTsKKworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBuYXRpdmUgbG9uZyBnZXRMZW5ndGgoRmlsZSBmKTsKLSAgICBwdWJsaWMgbmF0aXZlIGJvb2xlYW4gc2V0UGVybWlzc2lvbihGaWxlIGYsIGludCBhY2Nlc3MsIGJvb2xlYW4gZW5hYmxlLCBib29sZWFuIG93bmVyb25seSk7CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgbmF0aXZlIGJvb2xlYW4gc2V0UGVybWlzc2lvbihGaWxlIGYsIGludCBhY2Nlc3MsIGJvb2xlYW4gZW5hYmxlLAorICAgICAgICAgICAgYm9vbGVhbiBvd25lcm9ubHkpOwogCisgICAgLyogLS0gRmlsZSBvcGVyYXRpb25zIC0tICovCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgbmF0aXZlIGJvb2xlYW4gY3JlYXRlRmlsZUV4Y2x1c2l2ZWx5KFN0cmluZyBwYXRoKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIG5hdGl2ZSBTdHJpbmdbXSBsaXN0KEZpbGUgZik7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgbmF0aXZlIGJvb2xlYW4gY3JlYXRlRGlyZWN0b3J5KEZpbGUgZik7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgbmF0aXZlIGJvb2xlYW4gc2V0TGFzdE1vZGlmaWVkVGltZShGaWxlIGYsIGxvbmcgdGltZSk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgbmF0aXZlIGJvb2xlYW4gc2V0UmVhZE9ubHkoRmlsZSBmKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGRlbGV0ZShGaWxlIGYpIHsKKyAgICAgICAgLy8gS2VlcCBjYW5vbmljYWxpemF0aW9uIGNhY2hlcyBpbiBzeW5jIGFmdGVyIGZpbGUgZGVsZXRpb24KKyAgICAgICAgLy8gYW5kIHJlbmFtaW5nIG9wZXJhdGlvbnMuIENvdWxkIGJlIG1vcmUgY2xldmVyIHRoYW4gdGhpcworICAgICAgICAvLyAoaS5lLiwgb25seSByZW1vdmUvdXBkYXRlIGFmZmVjdGVkIGVudHJpZXMpIGJ1dCBwcm9iYWJseQorICAgICAgICAvLyBub3Qgd29ydGggaXQgc2luY2UgdGhlc2UgZW50cmllcyBleHBpcmUgYWZ0ZXIgMzAgc2Vjb25kcworICAgICAgICAvLyBhbnl3YXkuCisgICAgICAgIGNhY2hlLmNsZWFyKCk7CisgICAgICAgIHByZWZpeENhY2hlLmNsZWFyKCk7CisgICAgICAgIHJldHVybiBkZWxldGUwKGYpOworICAgIH0KKworICAgIHByaXZhdGUgbmF0aXZlIGJvb2xlYW4gZGVsZXRlMChGaWxlIGYpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gcmVuYW1lKEZpbGUgZjEsIEZpbGUgZjIpIHsKKyAgICAgICAgLy8gS2VlcCBjYW5vbmljYWxpemF0aW9uIGNhY2hlcyBpbiBzeW5jIGFmdGVyIGZpbGUgZGVsZXRpb24KKyAgICAgICAgLy8gYW5kIHJlbmFtaW5nIG9wZXJhdGlvbnMuIENvdWxkIGJlIG1vcmUgY2xldmVyIHRoYW4gdGhpcworICAgICAgICAvLyAoaS5lLiwgb25seSByZW1vdmUvdXBkYXRlIGFmZmVjdGVkIGVudHJpZXMpIGJ1dCBwcm9iYWJseQorICAgICAgICAvLyBub3Qgd29ydGggaXQgc2luY2UgdGhlc2UgZW50cmllcyBleHBpcmUgYWZ0ZXIgMzAgc2Vjb25kcworICAgICAgICAvLyBhbnl3YXkuCisgICAgICAgIGNhY2hlLmNsZWFyKCk7CisgICAgICAgIHByZWZpeENhY2hlLmNsZWFyKCk7CisgICAgICAgIHJldHVybiByZW5hbWUwKGYxLCBmMik7CisgICAgfQorCisgICAgcHJpdmF0ZSBuYXRpdmUgYm9vbGVhbiByZW5hbWUwKEZpbGUgZjEsIEZpbGUgZjIpOworCisgICAgLyogLS0gRmlsZXN5c3RlbSBpbnRlcmZhY2UgLS0gKi8KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBGaWxlW10gbGlzdFJvb3RzKCkgeworICAgICAgICBpbnQgZHMgPSBsaXN0Um9vdHMwKCk7CisgICAgICAgIGludCBuID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNjsgaSsrKSB7CisgICAgICAgICAgICBpZiAoKChkcyA+PiBpKSAmIDEpICE9IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoIWFjY2VzcygoY2hhcikoJ0EnICsgaSkgKyAiOiIgKyBzbGFzaCkpCisgICAgICAgICAgICAgICAgICAgIGRzICY9IH4oMSA8PCBpKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIG4rKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBGaWxlW10gZnMgPSBuZXcgRmlsZVtuXTsKKyAgICAgICAgaW50IGogPSAwOworICAgICAgICBjaGFyIHNsYXNoID0gdGhpcy5zbGFzaDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNjsgaSsrKSB7CisgICAgICAgICAgICBpZiAoKChkcyA+PiBpKSAmIDEpICE9IDApCisgICAgICAgICAgICAgICAgZnNbaisrXSA9IG5ldyBGaWxlKChjaGFyKSgnQScgKyBpKSArICI6IiArIHNsYXNoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZnM7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIGludCBsaXN0Um9vdHMwKCk7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gYWNjZXNzKFN0cmluZyBwYXRoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTZWN1cml0eU1hbmFnZXIgc2VjdXJpdHkgPSBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCk7CisgICAgICAgICAgICBpZiAoc2VjdXJpdHkgIT0gbnVsbCkgc2VjdXJpdHkuY2hlY2tSZWFkKHBhdGgpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIHgpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIC0tIERpc2sgdXNhZ2UgLS0gKi8KKworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBsb25nIGdldFNwYWNlKEZpbGUgZiwgaW50IHQpIHsKICAgICAgICAgaWYgKGYuZXhpc3RzKCkpIHsKICAgICAgICAgICAgIHJldHVybiBnZXRTcGFjZTAoZiwgdCk7CkBAIC02MCwyMCArNjI3LDIyIEBACiAKICAgICBwcml2YXRlIG5hdGl2ZSBsb25nIGdldFNwYWNlMChGaWxlIGYsIGludCB0KTsKIAotICAgIC8qIC0tIEZpbGUgb3BlcmF0aW9ucyAtLSAqLworICAgIC8qIC0tIEJhc2ljIGluZnJhc3RydWN0dXJlIC0tICovCiAKLSAgICBwdWJsaWMgbmF0aXZlIGJvb2xlYW4gY3JlYXRlRmlsZUV4Y2x1c2l2ZWx5KFN0cmluZyBwYXRoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb247Ci0gICAgcHJvdGVjdGVkIG5hdGl2ZSBib29sZWFuIGRlbGV0ZTAoRmlsZSBmKTsKLSAgICBwdWJsaWMgbmF0aXZlIFN0cmluZ1tdIGxpc3QoRmlsZSBmKTsKLSAgICBwdWJsaWMgbmF0aXZlIGJvb2xlYW4gY3JlYXRlRGlyZWN0b3J5KEZpbGUgZik7Ci0gICAgcHJvdGVjdGVkIG5hdGl2ZSBib29sZWFuIHJlbmFtZTAoRmlsZSBmMSwgRmlsZSBmMik7Ci0gICAgcHVibGljIG5hdGl2ZSBib29sZWFuIHNldExhc3RNb2RpZmllZFRpbWUoRmlsZSBmLCBsb25nIHRpbWUpOwotICAgIHB1YmxpYyBuYXRpdmUgYm9vbGVhbiBzZXRSZWFkT25seShGaWxlIGYpOwotICAgIHByb3RlY3RlZCBuYXRpdmUgU3RyaW5nIGdldERyaXZlRGlyZWN0b3J5KGludCBkcml2ZSk7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBjb21wYXJlKEZpbGUgZjEsIEZpbGUgZjIpIHsKKyAgICAgICAgcmV0dXJuIGYxLmdldFBhdGgoKS5jb21wYXJlVG9JZ25vcmVDYXNlKGYyLmdldFBhdGgoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZShGaWxlIGYpIHsKKyAgICAgICAgLyogQ291bGQgbWFrZSB0aGlzIG1vcmUgZWZmaWNpZW50OiBTdHJpbmcuaGFzaENvZGVJZ25vcmVDYXNlICovCisgICAgICAgIHJldHVybiBmLmdldFBhdGgoKS50b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCkuaGFzaENvZGUoKSBeIDEyMzQzMjE7CisgICAgfQorCiAgICAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIHZvaWQgaW5pdElEcygpOwogCiAgICAgc3RhdGljIHsKLSAgICAgICAgICAgIGluaXRJRHMoKTsKKyAgICAgICAgaW5pdElEcygpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2pkay9zcmMvd2luZG93cy9jbGFzc2VzL3N1bi9hd3Qvc2hlbGwvV2luMzJTaGVsbEZvbGRlcjIuamF2YSBiL2pkay9zcmMvd2luZG93cy9jbGFzc2VzL3N1bi9hd3Qvc2hlbGwvV2luMzJTaGVsbEZvbGRlcjIuamF2YQppbmRleCAwNjMzMWJhLi5jNmNkZTNjIDEwMDY0NAotLS0gYS9qZGsvc3JjL3dpbmRvd3MvY2xhc3Nlcy9zdW4vYXd0L3NoZWxsL1dpbjMyU2hlbGxGb2xkZXIyLmphdmEKKysrIGIvamRrL3NyYy93aW5kb3dzL2NsYXNzZXMvc3VuL2F3dC9zaGVsbC9XaW4zMlNoZWxsRm9sZGVyMi5qYXZhCkBAIC0xMDk5LDcgKzEwOTksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBTd2luZ0NvbnN0YW50cy5DRU5URVIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogU3dpbmdDb25zdGFudHMuTEVBRElORyk7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4uc2V0Q29tcGFyYXRvcihuZXcgQ29sdW1uQ29tcGFyYXRvcihnZXRJU2hlbGxGb2xkZXIoKSwgaSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbi5zZXRDb21wYXJhdG9yKG5ldyBDb2x1bW5Db21wYXJhdG9yKFdpbjMyU2hlbGxGb2xkZXIyLnRoaXMsIGkpKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdE51bGxDb2x1bW5zLmFkZChjb2x1bW4pOwogICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMTEzNSw3ICsxMTM1LDcgQEAKICAgICAgICAgLy8gc3luY2hyb25pemUgdGhlIHdob2xlIGNvZGUgb2YgdGhlIHNvcnQgbWV0aG9kIG9uY2UKICAgICAgICAgaW52b2tlKG5ldyBDYWxsYWJsZTxWb2lkPigpIHsKICAgICAgICAgICAgIHB1YmxpYyBWb2lkIGNhbGwoKSB7Ci0gICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuc29ydChmaWxlcywgbmV3IENvbHVtbkNvbXBhcmF0b3IoZ2V0SVNoZWxsRm9sZGVyKCksIDApKTsKKyAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGZpbGVzLCBuZXcgQ29sdW1uQ29tcGFyYXRvcihXaW4zMlNoZWxsRm9sZGVyMi50aGlzLCAwKSk7CiAKICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgIH0KQEAgLTExNDMsMTIgKzExNDMsMTIgQEAKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDb2x1bW5Db21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvcjxGaWxlPiB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgbG9uZyBwYXJlbnRJU2hlbGxGb2xkZXI7CisgICAgICAgIHByaXZhdGUgZmluYWwgV2luMzJTaGVsbEZvbGRlcjIgc2hlbGxGb2xkZXI7CiAKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgY29sdW1uSWR4OwogCi0gICAgICAgIHB1YmxpYyBDb2x1bW5Db21wYXJhdG9yKGxvbmcgcGFyZW50SVNoZWxsRm9sZGVyLCBpbnQgY29sdW1uSWR4KSB7Ci0gICAgICAgICAgICB0aGlzLnBhcmVudElTaGVsbEZvbGRlciA9IHBhcmVudElTaGVsbEZvbGRlcjsKKyAgICAgICAgcHVibGljIENvbHVtbkNvbXBhcmF0b3IoV2luMzJTaGVsbEZvbGRlcjIgc2hlbGxGb2xkZXIsIGludCBjb2x1bW5JZHgpIHsKKyAgICAgICAgICAgIHRoaXMuc2hlbGxGb2xkZXIgPSBzaGVsbEZvbGRlcjsKICAgICAgICAgICAgIHRoaXMuY29sdW1uSWR4ID0gY29sdW1uSWR4OwogICAgICAgICB9CiAKQEAgLTExNTksNyArMTE1OSw3IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgV2luMzJTaGVsbEZvbGRlcjIKICAgICAgICAgICAgICAgICAgICAgICAgICYmIG8xIGluc3RhbmNlb2YgV2luMzJTaGVsbEZvbGRlcjIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlbGVnYXRlcyBjb21wYXJpc29uIHRvIG5hdGl2ZSBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21wYXJlSURzQnlDb2x1bW4ocGFyZW50SVNoZWxsRm9sZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmVJRHNCeUNvbHVtbihzaGVsbEZvbGRlci5nZXRJU2hlbGxGb2xkZXIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFdpbjMyU2hlbGxGb2xkZXIyKSBvKS5nZXRSZWxhdGl2ZVBJREwoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFdpbjMyU2hlbGxGb2xkZXIyKSBvMSkuZ2V0UmVsYXRpdmVQSURMKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uSWR4KTsKZGlmZiAtLWdpdCBhL2pkay9zcmMvd2luZG93cy9uYXRpdmUvamF2YS9pby9GaWxlU3lzdGVtX21kLmMgYi9qZGsvc3JjL3dpbmRvd3MvbmF0aXZlL2phdmEvaW8vRmlsZVN5c3RlbV9tZC5jCmluZGV4IGE1NmM1YjUuLmJkODEzZTcgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvd2luZG93cy9uYXRpdmUvamF2YS9pby9GaWxlU3lzdGVtX21kLmMKKysrIGIvamRrL3NyYy93aW5kb3dzL25hdGl2ZS9qYXZhL2lvL0ZpbGVTeXN0ZW1fbWQuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDEsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI3LDE2ICsyNyw4IEBACiAjaW5jbHVkZSAiam5pLmgiCiAjaW5jbHVkZSAiam5pX3V0aWwuaCIKIAotZXh0ZXJuIGpib29sZWFuIG9uTlQ7Ci1leHRlcm4gdm9pZCBpbml0aWFsaXplV2luZG93c1ZlcnNpb24oKTsKLQogSk5JRVhQT1JUIGpvYmplY3QgSk5JQ0FMTAogSmF2YV9qYXZhX2lvX0ZpbGVTeXN0ZW1fZ2V0RmlsZVN5c3RlbShKTklFbnYgKmVudiwgamNsYXNzIGlnbm9yZWQpCiB7Ci0gICAgaW5pdGlhbGl6ZVdpbmRvd3NWZXJzaW9uKCk7Ci0gICAgaWYgKG9uTlQpIHsKLSAgICAgICAgcmV0dXJuIEpOVV9OZXdPYmplY3RCeU5hbWUoZW52LCAiamF2YS9pby9XaW5OVEZpbGVTeXN0ZW0iLCAiKClWIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIEpOVV9OZXdPYmplY3RCeU5hbWUoZW52LCAiamF2YS9pby9XaW4zMkZpbGVTeXN0ZW0iLCAiKClWIik7Ci0gICAgfQorICAgIHJldHVybiBKTlVfTmV3T2JqZWN0QnlOYW1lKGVudiwgImphdmEvaW8vV2luTlRGaWxlU3lzdGVtIiwgIigpViIpOwogfQpkaWZmIC0tZ2l0IGEvamRrL3NyYy93aW5kb3dzL25hdGl2ZS9qYXZhL2lvL1dpbjMyRmlsZVN5c3RlbV9tZC5jIGIvamRrL3NyYy93aW5kb3dzL25hdGl2ZS9qYXZhL2lvL1dpbjMyRmlsZVN5c3RlbV9tZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWMwODZjLi4wMDAwMDAwCi0tLSBhL2pkay9zcmMvd2luZG93cy9uYXRpdmUvamF2YS9pby9XaW4zMkZpbGVTeXN0ZW1fbWQuYworKysgL2Rldi9udWxsCkBAIC0xLDUwOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA2LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzCi0gKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCi0gKiBieSBPcmFjbGUgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAotICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCi0gKgotICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKLSAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKLSAqIHF1ZXN0aW9ucy4KLSAqLwotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPGRpcmVjdC5oPgotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSNpbmNsdWRlIDxpby5oPgotCi0jaW5jbHVkZSAianZtLmgiCi0jaW5jbHVkZSAiam5pLmgiCi0jaW5jbHVkZSAiam5pX3V0aWwuaCIKLSNpbmNsdWRlICJqbG9uZy5oIgotI2luY2x1ZGUgImlvX3V0aWwuaCIKLSNpbmNsdWRlICJkaXJlbnRfbWQuaCIKLSNpbmNsdWRlICJqYXZhX2lvX0ZpbGVTeXN0ZW0uaCIKLQotLyogVGhpcyBtYWNybyByZWxpZXMgdXBvbiB0aGUgZmFjdCB0aGF0IEpOVV9HZXRTdHJpbmdQbGF0Zm9ybUNoYXJzIGFsd2F5cyBtYWtlcwotICAgYSBjb3B5IG9mIHRoZSBzdHJpbmcgKi8KLQotI2RlZmluZSBXSVRIX05BVElWRV9QQVRIKGVudiwgb2JqZWN0LCBpZCwgdmFyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFdJVEhfRklFTERfUExBVEZPUk1fU1RSSU5HKGVudiwgb2JqZWN0LCBpZCwgdmFyKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBKVk1fTmF0aXZlUGF0aCgoY2hhciAqKXZhcik7Ci0KLSNkZWZpbmUgRU5EX05BVElWRV9QQVRIKGVudiwgdmFyKSAgICBFTkRfUExBVEZPUk1fU1RSSU5HKGVudiwgdmFyKQotCi0KLXN0YXRpYyBzdHJ1Y3QgewotICAgIGpmaWVsZElEIHBhdGg7Ci19IGlkczsKLQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTAotSmF2YV9qYXZhX2lvX1dpbjMyRmlsZVN5c3RlbV9pbml0SURzKEpOSUVudiAqZW52LCBqY2xhc3MgY2xzKQotewotICAgIGpjbGFzcyBmaWxlQ2xhc3MgPSAoKmVudiktPkZpbmRDbGFzcyhlbnYsICJqYXZhL2lvL0ZpbGUiKTsKLSAgICBpZiAoIWZpbGVDbGFzcykgcmV0dXJuOwotICAgIGlkcy5wYXRoID0gKCplbnYpLT5HZXRGaWVsZElEKGVudiwgZmlsZUNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXRoIiwgIkxqYXZhL2xhbmcvU3RyaW5nOyIpOwotfQotCi0KLS8qIC0tIFBhdGggb3BlcmF0aW9ucyAtLSAqLwotCi0KLWV4dGVybiBpbnQgY2Fub25pY2FsaXplKGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKm91dCwgaW50IGxlbik7Ci1leHRlcm4gaW50IGNhbm9uaWNhbGl6ZVdpdGhQcmVmaXgoY29uc3QgY2hhciogY2Fub25pY2FsUHJlZml4LCBjb25zdCBjaGFyICpwYXRoV2l0aENhbm9uaWNhbFByZWZpeCwgY2hhciAqb3V0LCBpbnQgbGVuKTsKLQotSk5JRVhQT1JUIGpzdHJpbmcgSk5JQ0FMTAotSmF2YV9qYXZhX2lvX1dpbjMyRmlsZVN5c3RlbV9jYW5vbmljYWxpemUwKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganN0cmluZyBwYXRobmFtZSkKLXsKLSAgICBqc3RyaW5nIHJ2ID0gTlVMTDsKLQotICAgIFdJVEhfUExBVEZPUk1fU1RSSU5HKGVudiwgcGF0aG5hbWUsIHBhdGgpIHsKLSAgICAgICAgY2hhciBjYW5vbmljYWxQYXRoW0pWTV9NQVhQQVRITEVOXTsKLSAgICAgICAgaWYgKGNhbm9uaWNhbGl6ZShKVk1fTmF0aXZlUGF0aCgoY2hhciAqKXBhdGgpLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNhbm9uaWNhbFBhdGgsIEpWTV9NQVhQQVRITEVOKSA8IDApIHsKLSAgICAgICAgICAgIEpOVV9UaHJvd0lPRXhjZXB0aW9uV2l0aExhc3RFcnJvcihlbnYsICJCYWQgcGF0aG5hbWUiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJ2ID0gSk5VX05ld1N0cmluZ1BsYXRmb3JtKGVudiwgY2Fub25pY2FsUGF0aCk7Ci0gICAgICAgIH0KLSAgICB9IEVORF9QTEFURk9STV9TVFJJTkcoZW52LCBwYXRoKTsKLSAgICByZXR1cm4gcnY7Ci19Ci0KLQotSk5JRVhQT1JUIGpzdHJpbmcgSk5JQ0FMTAotSmF2YV9qYXZhX2lvX1dpbjMyRmlsZVN5c3RlbV9jYW5vbmljYWxpemVXaXRoUHJlZml4MChKTklFbnYgKmVudiwgam9iamVjdCB0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc3RyaW5nIGNhbm9uaWNhbFByZWZpeFN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganN0cmluZyBwYXRoV2l0aENhbm9uaWNhbFByZWZpeFN0cmluZykKLXsKLSAgICBqc3RyaW5nIHJ2ID0gTlVMTDsKLSAgICBjaGFyIGNhbm9uaWNhbFBhdGhbSlZNX01BWFBBVEhMRU5dOwotCi0gICAgV0lUSF9QTEFURk9STV9TVFJJTkcoZW52LCBjYW5vbmljYWxQcmVmaXhTdHJpbmcsIGNhbm9uaWNhbFByZWZpeCkgewotICAgICAgICBXSVRIX1BMQVRGT1JNX1NUUklORyhlbnYsIHBhdGhXaXRoQ2Fub25pY2FsUHJlZml4U3RyaW5nLCBwYXRoV2l0aENhbm9uaWNhbFByZWZpeCkgewotICAgICAgICAgICAgaWYgKGNhbm9uaWNhbGl6ZVdpdGhQcmVmaXgoY2Fub25pY2FsUHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aFdpdGhDYW5vbmljYWxQcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5vbmljYWxQYXRoLCBKVk1fTUFYUEFUSExFTikgPCAwKSB7Ci0gICAgICAgICAgICAgICAgSk5VX1Rocm93SU9FeGNlcHRpb25XaXRoTGFzdEVycm9yKGVudiwgIkJhZCBwYXRobmFtZSIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBydiA9IEpOVV9OZXdTdHJpbmdQbGF0Zm9ybShlbnYsIGNhbm9uaWNhbFBhdGgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IEVORF9QTEFURk9STV9TVFJJTkcoZW52LCBwYXRoV2l0aENhbm9uaWNhbFByZWZpeCk7Ci0gICAgfSBFTkRfUExBVEZPUk1fU1RSSU5HKGVudiwgY2Fub25pY2FsUHJlZml4KTsKLSAgICByZXR1cm4gcnY7Ci19Ci0KLQotCi0vKiAtLSBBdHRyaWJ1dGUgYWNjZXNzb3JzIC0tICovCi0KLS8qIENoZWNrIHdoZXRoZXIgb3Igbm90IHRoZSBmaWxlIG5hbWUgaW4gInBhdGgiIGlzIGEgV2luZG93cyByZXNlcnZlZAotICAgZGV2aWNlIG5hbWUgKENPTiwgUFJOLCBBVVgsIE5VTCwgQ09NWzEtOV0sIExQVFsxLTldKSBiYXNlZCBvbiB0aGUKLSAgIHJldHVybmVkIHJlc3VsdCBmcm9tIEdldEZ1bGxQYXRoTmFtZS4gSWYgdGhlIGZpbGUgbmFtZSBpbiB0aGUgcGF0aAotICAgaXMgaW5kZWVkIGEgcmVzZXJ2ZWQgZGV2aWNlIG5hbWUgR2V0RnV1bFBhdGhOYW1lIHJldHVybnMKLSAgICJcXC5cW1Jlc2VydmVkRGV2aWNlTmFtZV0iLgotICovCi1CT09MIGlzUmVzZXJ2ZWREZXZpY2VOYW1lKGNvbnN0IGNoYXIqIHBhdGgpIHsKLSNkZWZpbmUgQlVGU0laRSA5Ci0gICAgY2hhciBidWZbQlVGU0laRV07Ci0gICAgY2hhciAqbHBmID0gTlVMTDsKLSAgICBEV09SRCByZXRMZW4gPSBHZXRGdWxsUGF0aE5hbWUocGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlVGU0laRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbHBmKTsKLSAgICBpZiAoKHJldExlbiA9PSBCVUZTSVpFIC0gMSB8fCByZXRMZW4gPT0gQlVGU0laRSAtIDIpICYmCi0gICAgICAgIGJ1ZlswXSA9PSAnXFwnICYmIGJ1ZlsxXSA9PSAnXFwnICYmCi0gICAgICAgIGJ1ZlsyXSA9PSAnLicgJiYgYnVmWzNdID09ICdcXCcpIHsKLSAgICAgICAgY2hhciogZG5hbWUgPSBfc3RydXByKGJ1ZiArIDQpOwotICAgICAgICBpZiAoc3RyY21wKGRuYW1lLCAiQ09OIikgPT0gMCB8fAotICAgICAgICAgICAgc3RyY21wKGRuYW1lLCAiUFJOIikgPT0gMCB8fAotICAgICAgICAgICAgc3RyY21wKGRuYW1lLCAiQVVYIikgPT0gMCB8fAotICAgICAgICAgICAgc3RyY21wKGRuYW1lLCAiTlVMIikgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICBpZiAoKHN0cm5jbXAoZG5hbWUsICJDT00iLCAzKSA9PSAwIHx8Ci0gICAgICAgICAgICAgc3RybmNtcChkbmFtZSwgIkxQVCIsIDMpID09IDApICYmCi0gICAgICAgICAgICBkbmFtZVszXSAtICcwJyA+IDAgJiYKLSAgICAgICAgICAgIGRuYW1lWzNdIC0gJzAnIDw9IDkpCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOwotfQotCi1KTklFWFBPUlQgamludCBKTklDQUxMCi1KYXZhX2phdmFfaW9fV2luMzJGaWxlU3lzdGVtX2dldEJvb2xlYW5BdHRyaWJ1dGVzKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvYmplY3QgZmlsZSkKLXsKLSAgICBqaW50IHJ2ID0gMDsKLQotICAgIFdJVEhfTkFUSVZFX1BBVEgoZW52LCBmaWxlLCBpZHMucGF0aCwgcGF0aCkgewotICAgICAgICBXSU4zMl9GSUxFX0FUVFJJQlVURV9EQVRBIHdmYWQ7Ci0gICAgICAgIGlmICghaXNSZXNlcnZlZERldmljZU5hbWUocGF0aCkgJiYKLSAgICAgICAgICAgIEdldEZpbGVBdHRyaWJ1dGVzRXgocGF0aCwgR2V0RmlsZUV4SW5mb1N0YW5kYXJkLCAmd2ZhZCkpIHsKLSAgICAgICAgICAgIHJ2ID0gKGphdmFfaW9fRmlsZVN5c3RlbV9CQV9FWElTVFMKLSAgICAgICAgICAgICAgICAgIHwgKCh3ZmFkLmR3RmlsZUF0dHJpYnV0ZXMgJiBGSUxFX0FUVFJJQlVURV9ESVJFQ1RPUlkpCi0gICAgICAgICAgICAgICAgICAgICA/IGphdmFfaW9fRmlsZVN5c3RlbV9CQV9ESVJFQ1RPUlkKLSAgICAgICAgICAgICAgICAgICAgIDogamF2YV9pb19GaWxlU3lzdGVtX0JBX1JFR1VMQVIpCi0gICAgICAgICAgICAgICAgICB8ICgod2ZhZC5kd0ZpbGVBdHRyaWJ1dGVzICYgRklMRV9BVFRSSUJVVEVfSElEREVOKQotICAgICAgICAgICAgICAgICAgICAgPyBqYXZhX2lvX0ZpbGVTeXN0ZW1fQkFfSElEREVOIDogMCkpOwotICAgICAgICB9Ci0gICAgfSBFTkRfTkFUSVZFX1BBVEgoZW52LCBwYXRoKTsKLSAgICByZXR1cm4gcnY7Ci19Ci0KLQotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwKLUphdmFfamF2YV9pb19XaW4zMkZpbGVTeXN0ZW1fY2hlY2tBY2Nlc3MoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam9iamVjdCBmaWxlLCBqaW50IGEpCi17Ci0gICAgamJvb2xlYW4gcnYgPSBKTklfRkFMU0U7Ci0gICAgaW50IG1vZGU7Ci0gICAgc3dpdGNoIChhKSB7Ci0gICAgY2FzZSBqYXZhX2lvX0ZpbGVTeXN0ZW1fQUNDRVNTX1JFQUQ6Ci0gICAgY2FzZSBqYXZhX2lvX0ZpbGVTeXN0ZW1fQUNDRVNTX0VYRUNVVEU6Ci0gICAgICAgIG1vZGUgPSA0OwotICAgICAgICBicmVhazsKLSAgICBjYXNlIGphdmFfaW9fRmlsZVN5c3RlbV9BQ0NFU1NfV1JJVEU6Ci0gICAgICAgIG1vZGUgPSAyOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OiBhc3NlcnQoMCk7Ci0gICAgfQotICAgIFdJVEhfTkFUSVZFX1BBVEgoZW52LCBmaWxlLCBpZHMucGF0aCwgcGF0aCkgewotICAgICAgICBpZiAoYWNjZXNzKHBhdGgsIG1vZGUpID09IDApIHsKLSAgICAgICAgICAgIHJ2ID0gSk5JX1RSVUU7Ci0gICAgICAgIH0KLSAgICB9IEVORF9OQVRJVkVfUEFUSChlbnYsIHBhdGgpOwotICAgIHJldHVybiBydjsKLX0KLQotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwKLUphdmFfamF2YV9pb19XaW4zMkZpbGVTeXN0ZW1fc2V0UGVybWlzc2lvbihKTklFbnYgKmVudiwgam9iamVjdCB0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvYmplY3QgZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaW50IGFjY2VzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYm9vbGVhbiBlbmFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamJvb2xlYW4gb3duZXJvbmx5KQotewotICAgIGpib29sZWFuIHJ2ID0gSk5JX0ZBTFNFOwotICAgIGlmIChhY2Nlc3MgPT0gamF2YV9pb19GaWxlU3lzdGVtX0FDQ0VTU19SRUFEIHx8Ci0gICAgICAgIGFjY2VzcyA9PSBqYXZhX2lvX0ZpbGVTeXN0ZW1fQUNDRVNTX0VYRUNVVEUpIHsKLSAgICAgICAgcmV0dXJuIGVuYWJsZTsKLSAgICB9Ci0gICAgV0lUSF9OQVRJVkVfUEFUSChlbnYsIGZpbGUsIGlkcy5wYXRoLCBwYXRoKSB7Ci0gICAgICAgIERXT1JEIGE7Ci0gICAgICAgIGEgPSBHZXRGaWxlQXR0cmlidXRlcyhwYXRoKTsKLSAgICAgICAgaWYgKGEgIT0gSU5WQUxJRF9GSUxFX0FUVFJJQlVURVMpIHsKLSAgICAgICAgICAgIGlmIChlbmFibGUpCi0gICAgICAgICAgICAgICAgYSA9ICBhICYgfkZJTEVfQVRUUklCVVRFX1JFQURPTkxZOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGEgPSAgYSB8IEZJTEVfQVRUUklCVVRFX1JFQURPTkxZOwotICAgICAgICAgICAgaWYgKFNldEZpbGVBdHRyaWJ1dGVzKHBhdGgsIGEpKQotICAgICAgICAgICAgICAgIHJ2ID0gSk5JX1RSVUU7Ci0gICAgICAgIH0KLSAgICB9IEVORF9OQVRJVkVfUEFUSChlbnYsIHBhdGgpOwotICAgIHJldHVybiBydjsKLX0KLQotSk5JRVhQT1JUIGpsb25nIEpOSUNBTEwKLUphdmFfamF2YV9pb19XaW4zMkZpbGVTeXN0ZW1fZ2V0TGFzdE1vZGlmaWVkVGltZShKTklFbnYgKmVudiwgam9iamVjdCB0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvYmplY3QgZmlsZSkKLXsKLSAgICBqbG9uZyBydiA9IDA7Ci0gICAgV0lUSF9OQVRJVkVfUEFUSChlbnYsIGZpbGUsIGlkcy5wYXRoLCBwYXRoKSB7Ci0gICAgLyogV2luOTUsIFdpbjk4LCBXaW5NRSAqLwotICAgIFdJTjMyX0ZJTkRfREFUQSBmZDsKLSAgICBqbG9uZyB0ZW1wID0gMDsKLSAgICBMQVJHRV9JTlRFR0VSIG1vZFRpbWU7Ci0gICAgSEFORExFIGggPSBGaW5kRmlyc3RGaWxlKHBhdGgsICZmZCk7Ci0gICAgaWYgKGggIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKLSAgICAgICAgRmluZENsb3NlKGgpOwotICAgICAgICBtb2RUaW1lLkxvd1BhcnQgPSAoRFdPUkQpIGZkLmZ0TGFzdFdyaXRlVGltZS5kd0xvd0RhdGVUaW1lOwotICAgICAgICBtb2RUaW1lLkhpZ2hQYXJ0ID0gKExPTkcpIGZkLmZ0TGFzdFdyaXRlVGltZS5kd0hpZ2hEYXRlVGltZTsKLSAgICAgICAgcnYgPSBtb2RUaW1lLlF1YWRQYXJ0IC8gMTAwMDA7Ci0gICAgICAgIHJ2IC09IDExNjQ0NDczNjAwMDAwOwotICAgIH0KLSAgICB9IEVORF9OQVRJVkVfUEFUSChlbnYsIHBhdGgpOwotICAgIHJldHVybiBydjsKLX0KLQotSk5JRVhQT1JUIGpsb25nIEpOSUNBTEwKLUphdmFfamF2YV9pb19XaW4zMkZpbGVTeXN0ZW1fZ2V0TGVuZ3RoKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2JqZWN0IGZpbGUpCi17Ci0gICAgamxvbmcgcnYgPSAwOwotCi0gICAgV0lUSF9OQVRJVkVfUEFUSChlbnYsIGZpbGUsIGlkcy5wYXRoLCBwYXRoKSB7Ci0gICAgICAgIHN0cnVjdCBfc3RhdGk2NCBzYjsKLSAgICAgICAgaWYgKF9zdGF0aTY0KHBhdGgsICZzYikgPT0gMCkgewotICAgICAgICAgICAgcnYgPSBzYi5zdF9zaXplOwotICAgICAgICB9Ci0gICAgfSBFTkRfTkFUSVZFX1BBVEgoZW52LCBwYXRoKTsKLSAgICByZXR1cm4gcnY7Ci19Ci0KLQotLyogLS0gRmlsZSBvcGVyYXRpb25zIC0tICovCi0KLQotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwKLUphdmFfamF2YV9pb19XaW4zMkZpbGVTeXN0ZW1fY3JlYXRlRmlsZUV4Y2x1c2l2ZWx5KEpOSUVudiAqZW52LCBqY2xhc3MgY2xzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganN0cmluZyBwYXRobmFtZSkKLXsKLSAgICBqYm9vbGVhbiBydiA9IEpOSV9GQUxTRTsKLSAgICBEV09SRCBhOwotCi0gICAgV0lUSF9QTEFURk9STV9TVFJJTkcoZW52LCBwYXRobmFtZSwgcGF0aCkgewotICAgICAgICBpbnQgb3J2OwotICAgICAgICBpbnQgZXJyb3I7Ci0gICAgICAgIEpWTV9OYXRpdmVQYXRoKChjaGFyICopcGF0aCk7Ci0gICAgICAgIG9ydiA9IEpWTV9PcGVuKHBhdGgsIEpWTV9PX1JEV1IgfCBKVk1fT19DUkVBVCB8IEpWTV9PX0VYQ0wsIDA2NjYpOwotICAgICAgICBpZiAob3J2IDwgMCkgewotICAgICAgICAgICAgaWYgKG9ydiAhPSBKVk1fRUVYSVNUKSB7Ci0gICAgICAgICAgICAgICAgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKLQotICAgICAgICAgICAgICAgIC8vIElmIGEgZGlyZWN0b3J5IGJ5IHRoZSBuYW1lZCBwYXRoIGFscmVhZHkgZXhpc3RzLAotICAgICAgICAgICAgICAgIC8vIHJldHVybiBmYWxzZSAoYmVoYXZpb3Igb2Ygc29sYXJpcyBhbmQgbGludXgpIGluc3RlYWQgb2YKLSAgICAgICAgICAgICAgICAvLyB0aHJvd2luZyBhbiBleGNlcHRpb24KLSAgICAgICAgICAgICAgICBhID0gR2V0RmlsZUF0dHJpYnV0ZXMocGF0aCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoKGEgPT0gSU5WQUxJRF9GSUxFX0FUVFJJQlVURVMpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAhKGEgJiBGSUxFX0FUVFJJQlVURV9ESVJFQ1RPUlkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFNldExhc3RFcnJvcihlcnJvcik7Ci0gICAgICAgICAgICAgICAgICAgIEpOVV9UaHJvd0lPRXhjZXB0aW9uV2l0aExhc3RFcnJvcihlbnYsIHBhdGgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEpWTV9DbG9zZShvcnYpOwotICAgICAgICAgICAgcnYgPSBKTklfVFJVRTsKLSAgICAgICAgfQotICAgIH0gRU5EX1BMQVRGT1JNX1NUUklORyhlbnYsIHBhdGgpOwotICAgIHJldHVybiBydjsKLX0KLQotCi1zdGF0aWMgaW50Ci1yZW1vdmVGaWxlT3JEaXJlY3RvcnkoY29uc3QgY2hhciAqcGF0aCkgLyogUmV0dXJucyAwIG9uIHN1Y2Nlc3MgKi8KLXsKLSAgICBEV09SRCBhOwotCi0gICAgU2V0RmlsZUF0dHJpYnV0ZXMocGF0aCwgMCk7Ci0gICAgYSA9IEdldEZpbGVBdHRyaWJ1dGVzKHBhdGgpOwotICAgIGlmIChhID09IElOVkFMSURfRklMRV9BVFRSSUJVVEVTKSB7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0gZWxzZSBpZiAoYSAmIEZJTEVfQVRUUklCVVRFX0RJUkVDVE9SWSkgewotICAgICAgICByZXR1cm4gIVJlbW92ZURpcmVjdG9yeShwYXRoKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gIURlbGV0ZUZpbGUocGF0aCk7Ci0gICAgfQotfQotCi0KLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMCi1KYXZhX2phdmFfaW9fV2luMzJGaWxlU3lzdGVtX2RlbGV0ZTAoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2JqZWN0IGZpbGUpCi17Ci0gICAgamJvb2xlYW4gcnYgPSBKTklfRkFMU0U7Ci0KLSAgICBXSVRIX05BVElWRV9QQVRIKGVudiwgZmlsZSwgaWRzLnBhdGgsIHBhdGgpIHsKLSAgICAgICAgaWYgKHJlbW92ZUZpbGVPckRpcmVjdG9yeShwYXRoKSA9PSAwKSB7Ci0gICAgICAgICAgICBydiA9IEpOSV9UUlVFOwotICAgICAgICB9Ci0gICAgfSBFTkRfTkFUSVZFX1BBVEgoZW52LCBwYXRoKTsKLSAgICByZXR1cm4gcnY7Ci19Ci0KLQotLyogIyMgQ2xlYW4gdGhpcyB1cCB0byB1c2UgZGlyZWN0IFdpbjMyIGNhbGxzICovCi0KLUpOSUVYUE9SVCBqb2JqZWN0QXJyYXkgSk5JQ0FMTAotSmF2YV9qYXZhX2lvX1dpbjMyRmlsZVN5c3RlbV9saXN0KEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam9iamVjdCBmaWxlKQotewotICAgIERJUiAqZGlyOwotICAgIHN0cnVjdCBkaXJlbnQgKnB0cjsKLSAgICBpbnQgbGVuLCBtYXhsZW47Ci0gICAgam9iamVjdEFycmF5IHJ2LCBvbGQ7Ci0KLSAgICBXSVRIX05BVElWRV9QQVRIKGVudiwgZmlsZSwgaWRzLnBhdGgsIHBhdGgpIHsKLSAgICAgICAgZGlyID0gb3BlbmRpcihwYXRoKTsKLSAgICB9IEVORF9OQVRJVkVfUEFUSChlbnYsIHBhdGgpOwotICAgIGlmIChkaXIgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0KLSAgICAvKiBBbGxvY2F0ZSBhbiBpbml0aWFsIFN0cmluZyBhcnJheSAqLwotICAgIGxlbiA9IDA7Ci0gICAgbWF4bGVuID0gMTY7Ci0gICAgcnYgPSAoKmVudiktPk5ld09iamVjdEFycmF5KGVudiwgbWF4bGVuLCBKTlVfQ2xhc3NTdHJpbmcoZW52KSwgTlVMTCk7Ci0gICAgaWYgKHJ2ID09IE5VTEwpIGdvdG8gZXJyb3I7Ci0KLSAgICAvKiBTY2FuIHRoZSBkaXJlY3RvcnkgKi8KLSAgICB3aGlsZSAoKHB0ciA9IHJlYWRkaXIoZGlyKSkgIT0gTlVMTCkgewotICAgICAgICBqc3RyaW5nIG5hbWU7Ci0gICAgICAgIGlmICghc3RyY21wKHB0ci0+ZF9uYW1lLCAiLiIpIHx8ICFzdHJjbXAocHRyLT5kX25hbWUsICIuLiIpKQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIGlmIChsZW4gPT0gbWF4bGVuKSB7Ci0gICAgICAgICAgICBvbGQgPSBydjsKLSAgICAgICAgICAgIHJ2ID0gKCplbnYpLT5OZXdPYmplY3RBcnJheShlbnYsIG1heGxlbiA8PD0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKTlVfQ2xhc3NTdHJpbmcoZW52KSwgTlVMTCk7Ci0gICAgICAgICAgICBpZiAocnYgPT0gTlVMTCkgZ290byBlcnJvcjsKLSAgICAgICAgICAgIGlmIChKTlVfQ29weU9iamVjdEFycmF5KGVudiwgcnYsIG9sZCwgbGVuKSA8IDApIGdvdG8gZXJyb3I7Ci0gICAgICAgICAgICAoKmVudiktPkRlbGV0ZUxvY2FsUmVmKGVudiwgb2xkKTsKLSAgICAgICAgfQotICAgICAgICBuYW1lID0gSk5VX05ld1N0cmluZ1BsYXRmb3JtKGVudiwgcHRyLT5kX25hbWUpOwotICAgICAgICBpZiAobmFtZSA9PSBOVUxMKSBnb3RvIGVycm9yOwotICAgICAgICAoKmVudiktPlNldE9iamVjdEFycmF5RWxlbWVudChlbnYsIHJ2LCBsZW4rKywgbmFtZSk7Ci0gICAgICAgICgqZW52KS0+RGVsZXRlTG9jYWxSZWYoZW52LCBuYW1lKTsKLSAgICB9Ci0gICAgY2xvc2VkaXIoZGlyKTsKLQotICAgIC8qIENvcHkgdGhlIGZpbmFsIHJlc3VsdHMgaW50byBhbiBhcHByb3ByaWF0ZWx5LXNpemVkIGFycmF5ICovCi0gICAgb2xkID0gcnY7Ci0gICAgcnYgPSAoKmVudiktPk5ld09iamVjdEFycmF5KGVudiwgbGVuLCBKTlVfQ2xhc3NTdHJpbmcoZW52KSwgTlVMTCk7Ci0gICAgaWYgKHJ2ID09IE5VTEwpIGdvdG8gZXJyb3I7Ci0gICAgaWYgKEpOVV9Db3B5T2JqZWN0QXJyYXkoZW52LCBydiwgb2xkLCBsZW4pIDwgMCkgZ290byBlcnJvcjsKLSAgICByZXR1cm4gcnY7Ci0KLSBlcnJvcjoKLSAgICBjbG9zZWRpcihkaXIpOwotICAgIHJldHVybiBOVUxMOwotfQotCi0KLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMCi1KYXZhX2phdmFfaW9fV2luMzJGaWxlU3lzdGVtX2NyZWF0ZURpcmVjdG9yeShKTklFbnYgKmVudiwgam9iamVjdCB0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam9iamVjdCBmaWxlKQotewotICAgIGpib29sZWFuIHJ2ID0gSk5JX0ZBTFNFOwotCi0gICAgV0lUSF9OQVRJVkVfUEFUSChlbnYsIGZpbGUsIGlkcy5wYXRoLCBwYXRoKSB7Ci0gICAgICAgIGlmIChta2RpcihwYXRoKSA9PSAwKSB7Ci0gICAgICAgICAgICBydiA9IEpOSV9UUlVFOwotICAgICAgICB9Ci0gICAgfSBFTkRfTkFUSVZFX1BBVEgoZW52LCBwYXRoKTsKLSAgICByZXR1cm4gcnY7Ci19Ci0KLQotSk5JRVhQT1JUIGpib29sZWFuIEpOSUNBTEwKLUphdmFfamF2YV9pb19XaW4zMkZpbGVTeXN0ZW1fcmVuYW1lMChKTklFbnYgKmVudiwgam9iamVjdCB0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvYmplY3QgZnJvbSwgam9iamVjdCB0bykKLXsKLSAgICBqYm9vbGVhbiBydiA9IEpOSV9GQUxTRTsKLQotICAgIFdJVEhfTkFUSVZFX1BBVEgoZW52LCBmcm9tLCBpZHMucGF0aCwgZnJvbVBhdGgpIHsKLSAgICAgICAgV0lUSF9OQVRJVkVfUEFUSChlbnYsIHRvLCBpZHMucGF0aCwgdG9QYXRoKSB7Ci0gICAgICAgICAgICBpZiAocmVuYW1lKGZyb21QYXRoLCB0b1BhdGgpID09IDApIHsKLSAgICAgICAgICAgICAgICBydiA9IEpOSV9UUlVFOwotICAgICAgICAgICAgfQotICAgICAgICB9IEVORF9OQVRJVkVfUEFUSChlbnYsIHRvUGF0aCk7Ci0gICAgfSBFTkRfTkFUSVZFX1BBVEgoZW52LCBmcm9tUGF0aCk7Ci0gICAgcmV0dXJuIHJ2OwotfQotCi0KLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMCi1KYXZhX2phdmFfaW9fV2luMzJGaWxlU3lzdGVtX3NldExhc3RNb2RpZmllZFRpbWUoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2JqZWN0IGZpbGUsIGpsb25nIHRpbWUpCi17Ci0gICAgamJvb2xlYW4gcnYgPSBKTklfRkFMU0U7Ci0KLSAgICBXSVRIX05BVElWRV9QQVRIKGVudiwgZmlsZSwgaWRzLnBhdGgsIHBhdGgpIHsKLSAgICAgICAgSEFORExFIGg7Ci0gICAgICAgIGggPSBDcmVhdGVGaWxlKHBhdGgsIEdFTkVSSUNfV1JJVEUsIDAsIE5VTEwsIE9QRU5fRVhJU1RJTkcsCi0gICAgICAgICAgICAgICAgICAgICAgIEZJTEVfQVRUUklCVVRFX05PUk1BTCB8IEZJTEVfRkxBR19CQUNLVVBfU0VNQU5USUNTLCAwKTsKLSAgICAgICAgaWYgKGggIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKLSAgICAgICAgICAgIExBUkdFX0lOVEVHRVIgbW9kVGltZTsKLSAgICAgICAgICAgIEZJTEVUSU1FIHQ7Ci0gICAgICAgICAgICBtb2RUaW1lLlF1YWRQYXJ0ID0gKHRpbWUgKyAxMTY0NDQ3MzYwMDAwMEwpICogMTAwMDBMOwotICAgICAgICAgICAgdC5kd0xvd0RhdGVUaW1lID0gKERXT1JEKW1vZFRpbWUuTG93UGFydDsKLSAgICAgICAgICAgIHQuZHdIaWdoRGF0ZVRpbWUgPSAoRFdPUkQpbW9kVGltZS5IaWdoUGFydDsKLSAgICAgICAgICAgIGlmIChTZXRGaWxlVGltZShoLCBOVUxMLCBOVUxMLCAmdCkpIHsKLSAgICAgICAgICAgICAgICBydiA9IEpOSV9UUlVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ2xvc2VIYW5kbGUoaCk7Ci0gICAgICAgIH0KLSAgICB9IEVORF9OQVRJVkVfUEFUSChlbnYsIHBhdGgpOwotCi0gICAgcmV0dXJuIHJ2OwotfQotCi0KLUpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMCi1KYXZhX2phdmFfaW9fV2luMzJGaWxlU3lzdGVtX3NldFJlYWRPbmx5KEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvYmplY3QgZmlsZSkKLXsKLSAgICBqYm9vbGVhbiBydiA9IEpOSV9GQUxTRTsKLQotICAgIFdJVEhfTkFUSVZFX1BBVEgoZW52LCBmaWxlLCBpZHMucGF0aCwgcGF0aCkgewotICAgICAgICBEV09SRCBhOwotICAgICAgICBhID0gR2V0RmlsZUF0dHJpYnV0ZXMocGF0aCk7Ci0gICAgICAgIGlmIChhICE9IElOVkFMSURfRklMRV9BVFRSSUJVVEVTKSB7Ci0gICAgICAgICAgICBpZiAoU2V0RmlsZUF0dHJpYnV0ZXMocGF0aCwgYSB8IEZJTEVfQVRUUklCVVRFX1JFQURPTkxZKSkKLSAgICAgICAgICAgICAgICBydiA9IEpOSV9UUlVFOwotICAgICAgICB9Ci0gICAgfSBFTkRfTkFUSVZFX1BBVEgoZW52LCBwYXRoKTsKLSAgICByZXR1cm4gcnY7Ci19Ci0KLQotLyogLS0gRmlsZXN5c3RlbSBpbnRlcmZhY2UgLS0gKi8KLQotCi1KTklFWFBPUlQgam9iamVjdCBKTklDQUxMCi1KYXZhX2phdmFfaW9fV2luMzJGaWxlU3lzdGVtX2dldERyaXZlRGlyZWN0b3J5KEpOSUVudiAqZW52LCBqY2xhc3MgaWdub3JlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamludCBkcml2ZSkKLXsKLSAgICBjaGFyIGJ1ZltfTUFYX1BBVEhdOwotICAgIGNoYXIgKnAgPSBfZ2V0ZGN3ZChkcml2ZSwgYnVmLCBzaXplb2YoYnVmKSk7Ci0gICAgaWYgKHAgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0gICAgaWYgKGlzYWxwaGEoKnApICYmIChwWzFdID09ICc6JykpIHAgKz0gMjsKLSAgICByZXR1cm4gSk5VX05ld1N0cmluZ1BsYXRmb3JtKGVudiwgcCk7Ci19Ci0KLQotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTAotSmF2YV9qYXZhX2lvX1dpbjMyRmlsZVN5c3RlbV9saXN0Um9vdHMwKEpOSUVudiAqZW52LCBqY2xhc3MgaWdub3JlZCkKLXsKLSAgICByZXR1cm4gR2V0TG9naWNhbERyaXZlcygpOwotfQotCi1KTklFWFBPUlQgamxvbmcgSk5JQ0FMTAotSmF2YV9qYXZhX2lvX1dpbjMyRmlsZVN5c3RlbV9nZXRTcGFjZTAoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvYmplY3QgZmlsZSwgamludCB0KQotewotICAgIGpsb25nIHJ2ID0gMEw7Ci0KLSAgICBXSVRIX05BVElWRV9QQVRIKGVudiwgZmlsZSwgaWRzLnBhdGgsIHBhdGgpIHsKLSAgICAgICAgVUxBUkdFX0lOVEVHRVIgdG90YWxTcGFjZSwgZnJlZVNwYWNlLCB1c2FibGVTcGFjZTsKLSAgICAgICAgaWYgKEdldERpc2tGcmVlU3BhY2VFeChwYXRoLCAmdXNhYmxlU3BhY2UsICZ0b3RhbFNwYWNlLCAmZnJlZVNwYWNlKSkgewotICAgICAgICAgICAgc3dpdGNoKHQpIHsKLSAgICAgICAgICAgIGNhc2UgamF2YV9pb19GaWxlU3lzdGVtX1NQQUNFX1RPVEFMOgotICAgICAgICAgICAgICAgIHJ2ID0gbG9uZ190b19qbG9uZyh0b3RhbFNwYWNlLlF1YWRQYXJ0KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgamF2YV9pb19GaWxlU3lzdGVtX1NQQUNFX0ZSRUU6Ci0gICAgICAgICAgICAgICAgcnYgPSBsb25nX3RvX2psb25nKGZyZWVTcGFjZS5RdWFkUGFydCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIGphdmFfaW9fRmlsZVN5c3RlbV9TUEFDRV9VU0FCTEU6Ci0gICAgICAgICAgICAgICAgcnYgPSBsb25nX3RvX2psb25nKHVzYWJsZVNwYWNlLlF1YWRQYXJ0KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYXNzZXJ0KDApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBFTkRfTkFUSVZFX1BBVEgoZW52LCBwYXRoKTsKLSAgICByZXR1cm4gcnY7Ci19CmRpZmYgLS1naXQgYS9qZGsvc3JjL3dpbmRvd3MvbmF0aXZlL2phdmEvaW8vV2luTlRGaWxlU3lzdGVtX21kLmMgYi9qZGsvc3JjL3dpbmRvd3MvbmF0aXZlL2phdmEvaW8vV2luTlRGaWxlU3lzdGVtX21kLmMKaW5kZXggN2Q5NzgyOS4uOTZmOWYxMyAxMDA2NDQKLS0tIGEvamRrL3NyYy93aW5kb3dzL25hdGl2ZS9qYXZhL2lvL1dpbk5URmlsZVN5c3RlbV9tZC5jCisrKyBiL2pkay9zcmMvd2luZG93cy9uYXRpdmUvamF2YS9pby9XaW5OVEZpbGVTeXN0ZW1fbWQuYwpAQCAtODI4LDYgKzgyOCwxMiBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKK0pOSUVYUE9SVCBqaW50IEpOSUNBTEwKK0phdmFfamF2YV9pb19XaW5OVEZpbGVTeXN0ZW1fbGlzdFJvb3RzMChKTklFbnYgKmVudiwgamNsYXNzIGlnbm9yZWQpCit7CisgICAgcmV0dXJuIEdldExvZ2ljYWxEcml2ZXMoKTsKK30KKwogSk5JRVhQT1JUIGpsb25nIEpOSUNBTEwKIEphdmFfamF2YV9pb19XaW5OVEZpbGVTeXN0ZW1fZ2V0U3BhY2UwKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2JqZWN0IGZpbGUsIGppbnQgdCkKZGlmZiAtLWdpdCBhL2pkay9zcmMvd2luZG93cy9uYXRpdmUvamF2YS9pby9pb191dGlsX21kLmMgYi9qZGsvc3JjL3dpbmRvd3MvbmF0aXZlL2phdmEvaW8vaW9fdXRpbF9tZC5jCmluZGV4IDc4NzYxN2UuLjJmMGU3NGYgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvd2luZG93cy9uYXRpdmUvamF2YS9pby9pb191dGlsX21kLmMKKysrIGIvamRrL3NyYy93aW5kb3dzL25hdGl2ZS9qYXZhL2lvL2lvX3V0aWxfbWQuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTEsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTQwLDIyICs0MCw4IEBACiAjaW5jbHVkZSA8bGltaXRzLmg+CiAjaW5jbHVkZSA8d2luY29uLmg+CiAKLWV4dGVybiBqYm9vbGVhbiBvbk5UID0gSk5JX0ZBTFNFOwotCiBzdGF0aWMgRFdPUkQgTUFYX0lOUFVUX0VWRU5UUyA9IDIwMDA7CiAKLXZvaWQKLWluaXRpYWxpemVXaW5kb3dzVmVyc2lvbigpIHsKLSAgICBPU1ZFUlNJT05JTkZPIHZlcjsKLSAgICB2ZXIuZHdPU1ZlcnNpb25JbmZvU2l6ZSA9IHNpemVvZih2ZXIpOwotICAgIEdldFZlcnNpb25FeCgmdmVyKTsKLSAgICBpZiAodmVyLmR3UGxhdGZvcm1JZCA9PSBWRVJfUExBVEZPUk1fV0lOMzJfTlQpIHsKLSAgICAgICAgb25OVCA9IEpOSV9UUlVFOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG9uTlQgPSBKTklfRkFMU0U7Ci0gICAgfQotfQotCiAvKiBJZiB0aGlzIHJldHVybnMgTlVMTCB0aGVuIGFuIGV4Y2VwdGlvbiBpcyBwZW5kaW5nICovCiBXQ0hBUioKIGZpbGVUb05UUGF0aChKTklFbnYgKmVudiwgam9iamVjdCBmaWxlLCBqZmllbGRJRCBpZCkgewpAQCAtMjQ3LDI3ICsyMzMsMjEgQEAKICAgICBjb25zdCBEV09SRCBmbGFnc0FuZEF0dHJpYnV0ZXMgPSBtYXliZVdyaXRlVGhyb3VnaCB8IG1heWJlRGVsZXRlT25DbG9zZTsKICAgICBIQU5ETEUgaCA9IE5VTEw7CiAKLSAgICBpZiAob25OVCkgewotICAgICAgICBXQ0hBUiAqcGF0aGJ1ZiA9IHBhdGhUb05UUGF0aChlbnYsIHBhdGgsIEpOSV9UUlVFKTsKLSAgICAgICAgaWYgKHBhdGhidWYgPT0gTlVMTCkgewotICAgICAgICAgICAgLyogRXhjZXB0aW9uIGFscmVhZHkgcGVuZGluZyAqLwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIGggPSBDcmVhdGVGaWxlVygKLSAgICAgICAgICAgIHBhdGhidWYsICAgICAgICAgICAgLyogV2lkZSBjaGFyIHBhdGggbmFtZSAqLwotICAgICAgICAgICAgYWNjZXNzLCAgICAgICAgICAgICAvKiBSZWFkIGFuZC9vciB3cml0ZSBwZXJtaXNzaW9uICovCi0gICAgICAgICAgICBzaGFyaW5nLCAgICAgICAgICAgIC8qIEZpbGUgc2hhcmluZyBmbGFncyAqLwotICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAvKiBTZWN1cml0eSBhdHRyaWJ1dGVzICovCi0gICAgICAgICAgICBkaXNwb3NpdGlvbiwgICAgICAgIC8qIGNyZWF0aW9uIGRpc3Bvc2l0aW9uICovCi0gICAgICAgICAgICBmbGFnc0FuZEF0dHJpYnV0ZXMsIC8qIGZsYWdzIGFuZCBhdHRyaWJ1dGVzICovCi0gICAgICAgICAgICBOVUxMKTsKLSAgICAgICAgZnJlZShwYXRoYnVmKTsKLSAgICB9IGVsc2UgewotICAgICAgICBXSVRIX1BMQVRGT1JNX1NUUklORyhlbnYsIHBhdGgsIF9wcykgewotICAgICAgICAgICAgaCA9IENyZWF0ZUZpbGUoX3BzLCBhY2Nlc3MsIHNoYXJpbmcsIE5VTEwsIGRpc3Bvc2l0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3NBbmRBdHRyaWJ1dGVzLCBOVUxMKTsKLSAgICAgICAgfSBFTkRfUExBVEZPUk1fU1RSSU5HKGVudiwgX3BzKTsKKyAgICBXQ0hBUiAqcGF0aGJ1ZiA9IHBhdGhUb05UUGF0aChlbnYsIHBhdGgsIEpOSV9UUlVFKTsKKyAgICBpZiAocGF0aGJ1ZiA9PSBOVUxMKSB7CisgICAgICAgIC8qIEV4Y2VwdGlvbiBhbHJlYWR5IHBlbmRpbmcgKi8KKyAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KKyAgICBoID0gQ3JlYXRlRmlsZVcoCisgICAgICAgIHBhdGhidWYsICAgICAgICAgICAgLyogV2lkZSBjaGFyIHBhdGggbmFtZSAqLworICAgICAgICBhY2Nlc3MsICAgICAgICAgICAgIC8qIFJlYWQgYW5kL29yIHdyaXRlIHBlcm1pc3Npb24gKi8KKyAgICAgICAgc2hhcmluZywgICAgICAgICAgICAvKiBGaWxlIHNoYXJpbmcgZmxhZ3MgKi8KKyAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAvKiBTZWN1cml0eSBhdHRyaWJ1dGVzICovCisgICAgICAgIGRpc3Bvc2l0aW9uLCAgICAgICAgLyogY3JlYXRpb24gZGlzcG9zaXRpb24gKi8KKyAgICAgICAgZmxhZ3NBbmRBdHRyaWJ1dGVzLCAvKiBmbGFncyBhbmQgYXR0cmlidXRlcyAqLworICAgICAgICBOVUxMKTsKKyAgICBmcmVlKHBhdGhidWYpOworCiAgICAgaWYgKGggPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKICAgICAgICAgaW50IGVycm9yID0gR2V0TGFzdEVycm9yKCk7CiAgICAgICAgIGlmIChlcnJvciA9PSBFUlJPUl9UT09fTUFOWV9PUEVOX0ZJTEVTKSB7CmRpZmYgLS1naXQgYS9qZGsvc3JjL3dpbmRvd3MvbmF0aXZlL2phdmEvbGFuZy9Qcm9jZXNzSW1wbF9tZC5jIGIvamRrL3NyYy93aW5kb3dzL25hdGl2ZS9qYXZhL2xhbmcvUHJvY2Vzc0ltcGxfbWQuYwppbmRleCBlZDE0ZWViLi5kZmE1OWY5IDEwMDY0NAotLS0gYS9qZGsvc3JjL3dpbmRvd3MvbmF0aXZlL2phdmEvbGFuZy9Qcm9jZXNzSW1wbF9tZC5jCisrKyBiL2pkay9zcmMvd2luZG93cy9uYXRpdmUvamF2YS9sYW5nL1Byb2Nlc3NJbXBsX21kLmMKQEAgLTQwLDcyICs0MCw2IEBACiAgKi8KICNkZWZpbmUgUElQRV9TSVpFICg0MDk2KzI0KQogCi1jaGFyICoKLWV4dHJhY3RFeGVjdXRhYmxlUGF0aChKTklFbnYgKmVudiwgY2hhciAqc291cmNlKQotewotICAgIGNoYXIgKnAsICpyOwotCi0gICAgLyogSWYgbm8gc3BhY2VzLCB0aGVuIHVzZSBlbnRpcmUgdGhpbmcgKi8KLSAgICBpZiAoKHAgPSBzdHJjaHIoc291cmNlLCAnICcpKSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gc291cmNlOwotCi0gICAgLyogSWYgbm8gcXVvdGVzLCBvciBxdW90ZXMgYWZ0ZXIgc3BhY2UsIHJldHVybiB1cCB0byBzcGFjZSAqLwotICAgIGlmICgoKHIgPSBzdHJjaHIoc291cmNlLCAnIicpKSA9PSBOVUxMKSB8fCAociA+IHApKSB7Ci0gICAgICAgICpwID0gMDsKLSAgICAgICAgcmV0dXJuIHNvdXJjZTsKLSAgICB9Ci0KLSAgICAvKiBRdW90ZXMgYmVmb3JlIHNwYWNlLCByZXR1cm4gdXAgdG8gc3BhY2UgYWZ0ZXIgbmV4dCBxdW90ZXMgKi8KLSAgICBwID0gc3RyY2hyKHIsICciJyk7Ci0gICAgaWYgKChwID0gc3RyY2hyKHAsICcgJykpID09IE5VTEwpCi0gICAgICAgIHJldHVybiBzb3VyY2U7Ci0gICAgKnAgPSAwOwotICAgIHJldHVybiBzb3VyY2U7Ci19Ci0KLURXT1JECi1zZWxlY3RQcm9jZXNzRmxhZyhKTklFbnYgKmVudiwganN0cmluZyBjbWQwKQotewotICAgIGNoYXIgYnVmW01BWF9QQVRIXTsKLSAgICBEV09SRCBuZXdGbGFnID0gMDsKLSAgICBjaGFyICpleGUsICpwLCAqbmFtZTsKLSAgICB1bnNpZ25lZCBjaGFyIGJ1ZmZlclsyXTsKLSAgICBsb25nIGhlYWRlckxvYyA9IDA7Ci0gICAgaW50IGZkID0gMDsKLQotICAgIGV4ZSA9IChjaGFyICopSk5VX0dldFN0cmluZ1BsYXRmb3JtQ2hhcnMoZW52LCBjbWQwLCAwKTsKLSAgICBleGUgPSBleHRyYWN0RXhlY3V0YWJsZVBhdGgoZW52LCBleGUpOwotCi0gICAgaWYgKGV4ZSAhPSBOVUxMKSB7Ci0gICAgICAgIGlmICgocCA9IHN0cmNocihleGUsICdcXCcpKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBTZWFyY2hQYXRoKE5VTEwsIGV4ZSwgIi5leGUiLCBNQVhfUEFUSCwgYnVmLCAmbmFtZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwID0gc3RycmNocihleGUsICdcXCcpOwotICAgICAgICAgICAgKnAgPSAwOwotICAgICAgICAgICAgcCsrOwotICAgICAgICAgICAgU2VhcmNoUGF0aChleGUsIHAsICIuZXhlIiwgTUFYX1BBVEgsIGJ1ZiwgJm5hbWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZmQgPSBfb3BlbihidWYsIF9PX1JET05MWSk7Ci0gICAgaWYgKGZkID4gMCkgewotICAgICAgICBfcmVhZChmZCwgYnVmZmVyLCAyKTsKLSAgICAgICAgaWYgKGJ1ZmZlclswXSA9PSAnTScgJiYgYnVmZmVyWzFdID09ICdaJykgewotICAgICAgICAgICAgX2xzZWVrKGZkLCA2MEwsIFNFRUtfU0VUKTsKLSAgICAgICAgICAgIF9yZWFkKGZkLCBidWZmZXIsIDIpOwotICAgICAgICAgICAgaGVhZGVyTG9jID0gKGxvbmcpYnVmZmVyWzFdIDw8IDggfCAobG9uZylidWZmZXJbMF07Ci0gICAgICAgICAgICBfbHNlZWsoZmQsIGhlYWRlckxvYywgU0VFS19TRVQpOwotICAgICAgICAgICAgX3JlYWQoZmQsIGJ1ZmZlciwgMik7Ci0gICAgICAgICAgICBpZiAoYnVmZmVyWzBdID09ICdQJyAmJiBidWZmZXJbMV0gPT0gJ0UnKSB7Ci0gICAgICAgICAgICAgICAgbmV3RmxhZyA9IERFVEFDSEVEX1BST0NFU1M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgX2Nsb3NlKGZkKTsKLSAgICB9Ci0gICAgSk5VX1JlbGVhc2VTdHJpbmdQbGF0Zm9ybUNoYXJzKGVudiwgY21kMCwgZXhlKTsKLSAgICByZXR1cm4gbmV3RmxhZzsKLX0KLQogc3RhdGljIHZvaWQKIHdpbjMyRXJyb3IoSk5JRW52ICplbnYsIGNvbnN0IGNoYXIgKmZ1bmN0aW9uTmFtZSkKIHsKQEAgLTE1MSwxNSArODUsOCBAQAogICAgIGNvbnN0IGpjaGFyKiAgcGVudkJsb2NrID0gTlVMTDsKICAgICBqbG9uZyAgKmhhbmRsZXMgPSBOVUxMOwogICAgIGpsb25nIHJldCA9IDA7Ci0gICAgT1NWRVJTSU9OSU5GTyB2ZXI7Ci0gICAgamJvb2xlYW4gb25OVCA9IEpOSV9GQUxTRTsKICAgICBEV09SRCBwcm9jZXNzRmxhZzsKIAotICAgIHZlci5kd09TVmVyc2lvbkluZm9TaXplID0gc2l6ZW9mKHZlcik7Ci0gICAgR2V0VmVyc2lvbkV4KCZ2ZXIpOwotICAgIGlmICh2ZXIuZHdQbGF0Zm9ybUlkID09IFZFUl9QTEFURk9STV9XSU4zMl9OVCkKLSAgICAgICAgb25OVCA9IEpOSV9UUlVFOwotCiAgICAgYXNzZXJ0KGNtZCAhPSBOVUxMKTsKICAgICBwY21kID0gKCplbnYpLT5HZXRTdHJpbmdDaGFycyhlbnYsIGNtZCwgTlVMTCk7CiAgICAgaWYgKHBjbWQgPT0gTlVMTCkgZ290byBDYXRjaDsKQEAgLTIyOSwxMCArMTU2LDcgQEAKICAgICB9CiAgICAgU2V0SGFuZGxlSW5mb3JtYXRpb24oc2kuaFN0ZEVycm9yLCBIQU5ETEVfRkxBR19JTkhFUklULCBUUlVFKTsKIAotICAgIGlmIChvbk5UKQotICAgICAgICBwcm9jZXNzRmxhZyA9IENSRUFURV9OT19XSU5ET1cgfCBDUkVBVEVfVU5JQ09ERV9FTlZJUk9OTUVOVDsKLSAgICBlbHNlCi0gICAgICAgIHByb2Nlc3NGbGFnID0gc2VsZWN0UHJvY2Vzc0ZsYWcoZW52LCBjbWQpIHwgQ1JFQVRFX1VOSUNPREVfRU5WSVJPTk1FTlQ7CisgICAgcHJvY2Vzc0ZsYWcgPSBDUkVBVEVfTk9fV0lORE9XIHwgQ1JFQVRFX1VOSUNPREVfRU5WSVJPTk1FTlQ7CiAgICAgcmV0ID0gQ3JlYXRlUHJvY2Vzc1coMCwgICAgICAgICAgICAgICAgLyogZXhlY3V0YWJsZSBuYW1lICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgKExQV1NUUilwY21kLCAgICAgLyogY29tbWFuZCBsaW5lICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgLyogcHJvY2VzcyBzZWN1cml0eSBhdHRyaWJ1dGUgKi8KZGlmZiAtLWdpdCBhL2pkay9zcmMvd2luZG93cy9uYXRpdmUvamF2YS91dGlsL1RpbWVab25lX21kLmMgYi9qZGsvc3JjL3dpbmRvd3MvbmF0aXZlL2phdmEvdXRpbC9UaW1lWm9uZV9tZC5jCmluZGV4IGQyOTU1OGMuLjU3ZDRiNTIgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvd2luZG93cy9uYXRpdmUvamF2YS91dGlsL1RpbWVab25lX21kLmMKKysrIGIvamRrL3NyYy93aW5kb3dzL25hdGl2ZS9qYXZhL3V0aWwvVGltZVpvbmVfbWQuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTksIDIwMTAsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTksIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTY1LDggKzY1LDYgQEAKICNkZWZpbmUgU1RBTkRBUkRfTkFNRSAgICAgICAgICAgMAogI2RlZmluZSBTVERfTkFNRSAgICAgICAgICAgICAgICAyCiAKLXN0YXRpYyBpbnQgaXNOVCA9IEZBTFNFOyAgICAgICAgLyogVFJVRSBpZiBpdCBpcyBOVC4gKi8KLQogLyoKICAqIENhbGxzIFJlZ1F1ZXJ5VmFsdWVFeCgpIHRvIGdldCB0aGUgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQga2V5LiBJZgogICogdGhlIHBsYXRmb3JtIGlzIE5ULCAyMDAwIG9yIFhQLCBpdCBjYWxscyB0aGUgVW5pY29kZQpAQCAtOTUsMTIgKzkzLDEwIEBACiAgICAgaW50IGxlbjsKIAogICAgICp0eXBlUHRyID0gMDsKLSAgICBpZiAoaXNOVCkgewotICAgICAgICByZXQgPSBSZWdRdWVyeVZhbHVlRXhXKGhLZXksIChXQ0hBUiAqKSBrZXlOYW1lc1trZXlJbmRleF0sIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZVB0ciwgYnVmLCBidWZMZW5ndGhQdHIpOwotICAgICAgICBpZiAocmV0ID09IEVSUk9SX1NVQ0NFU1MgJiYgKnR5cGVQdHIgPT0gUkVHX1NaKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICB9CisgICAgcmV0ID0gUmVnUXVlcnlWYWx1ZUV4VyhoS2V5LCAoV0NIQVIgKikga2V5TmFtZXNba2V5SW5kZXhdLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZVB0ciwgYnVmLCBidWZMZW5ndGhQdHIpOworICAgIGlmIChyZXQgPT0gRVJST1JfU1VDQ0VTUyAmJiAqdHlwZVB0ciA9PSBSRUdfU1opIHsKKyAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CiAKICAgICB2YWxTaXplID0gc2l6ZW9mKHZhbCk7CkBAIC0xODAsOCArMTc2LDcgQEAKICAgICAgKi8KICAgICB2ZXIuZHdPU1ZlcnNpb25JbmZvU2l6ZSA9IHNpemVvZih2ZXIpOwogICAgIEdldFZlcnNpb25FeCgmdmVyKTsKLSAgICBpc05UID0gdmVyLmR3UGxhdGZvcm1JZCA9PSBWRVJfUExBVEZPUk1fV0lOMzJfTlQ7Ci0gICAgaXNWaXN0YSA9IGlzTlQgJiYgdmVyLmR3TWFqb3JWZXJzaW9uID49IDY7CisgICAgaXNWaXN0YSA9IHZlci5kd01ham9yVmVyc2lvbiA+PSA2OwogCiAgICAgcmV0ID0gUmVnT3BlbktleUV4KEhLRVlfTE9DQUxfTUFDSElORSwgV0lOX0NVUlJFTlRfVFpfS0VZLCAwLAogICAgICAgICAgICAgICAgICAgICAgICBLRVlfUkVBRCwgKFBIS0VZKSZoS2V5KTsKZGlmZiAtLWdpdCBhL2pkay9zcmMvd2luZG93cy9uYXRpdmUvc3VuL3dpbmRvd3MvYXd0X1dpbmRvdy5jcHAgYi9qZGsvc3JjL3dpbmRvd3MvbmF0aXZlL3N1bi93aW5kb3dzL2F3dF9XaW5kb3cuY3BwCmluZGV4IDVjNWY1M2QuLmI0MTEwZWMgMTAwNjQ0Ci0tLSBhL2pkay9zcmMvd2luZG93cy9uYXRpdmUvc3VuL3dpbmRvd3MvYXd0X1dpbmRvdy5jcHAKKysrIGIvamRrL3NyYy93aW5kb3dzL25hdGl2ZS9zdW4vd2luZG93cy9hd3RfV2luZG93LmNwcApAQCAtMTU1OSwyMSArMTU1OSw4IEBACiAKIEJPT0wgQXd0V2luZG93OjpBd3RTZXRBY3RpdmVXaW5kb3coQk9PTCBpc01vdXNlRXZlbnRDYXVzZSwgVUlOVCBoaXR0ZXN0KQogewotICAgIC8vIEZpeCBmb3IgNjQ1ODQ5Ny4KLSAgICAvLyBSZXRyZWF0IGlmIGN1cnJlbnQgZm9yZWdyb3VuZCB3aW5kb3cgaXMgb3V0IG9mIGJvdGggb3VyIGFuZCBlbWJlZGRlciBwcm9jZXNzLgotICAgIC8vIFRoZSBleGNlcHRpb24gaXMgd2hlbiBhY3RpdmF0aW9uIGlzIHJlcXVlc3RlZCBkdWUgdG8gYSBtb3VzZSBldmVudC4KLSAgICBpZiAoIWlzTW91c2VFdmVudENhdXNlKSB7Ci0gICAgICAgIEhXTkQgZmdXaW5kb3cgPSA6OkdldEZvcmVncm91bmRXaW5kb3coKTsKLSAgICAgICAgaWYgKE5VTEwgIT0gZmdXaW5kb3cpIHsKLSAgICAgICAgICAgIERXT1JEIGZnUHJvY2Vzc0lEOwotICAgICAgICAgICAgOjpHZXRXaW5kb3dUaHJlYWRQcm9jZXNzSWQoZmdXaW5kb3csICZmZ1Byb2Nlc3NJRCk7Ci0gICAgICAgICAgICBpZiAoZmdQcm9jZXNzSUQgIT0gOjpHZXRDdXJyZW50UHJvY2Vzc0lkKCkKLSAgICAgICAgICAgICAgICAmJiAhQXd0VG9vbGtpdDo6R2V0SW5zdGFuY2UoKS5Jc0VtYmVkZGVyUHJvY2Vzc0lkKGZnUHJvY2Vzc0lEKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9CisgICAgLy8gV2UgdXNlZCB0byByZWplY3Qgbm9uIG1vdXNlIHdpbmRvdyBhY3RpdmF0aW9uIGlmIG91ciBhcHAgd2Fzbid0IGFjdGl2ZS4KKyAgICAvLyBUaGlzIGNvZGUgc2luY2UgaGFzIGJlZW4gcmVtb3ZlZCBhcyB0aGUgZml4IGZvciA3MTg1MjgwCiAKICAgICBIV05EIHByb3h5Q29udGFpbmVySFduZCA9IEdldFByb3h5VG9wbGV2ZWxDb250YWluZXIoKTsKICAgICBIV05EIHByb3h5SFduZCA9IEdldFByb3h5Rm9jdXNPd25lcigpOwpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvTWFrZWZpbGUgYi9qZGsvdGVzdC9NYWtlZmlsZQppbmRleCA4NzYyNmUzLi5lNDI0ODFmYSAxMDA2NDQKLS0tIGEvamRrL3Rlc3QvTWFrZWZpbGUKKysrIGIvamRrL3Rlc3QvTWFrZWZpbGUKQEAgLTQ3NywyNSArNDc3LDIxIEBACiAjIFN0YWJsZSBhZ2VudHZtIHRlc3RydW5zIChtaW51cyBpdGVtcyBmcm9tIFBST0JMRU1fTElTVCkKIEpES19BTExfVEFSR0VUUyArPSBqZGtfbGFuZwogSkRLX0RFRkFVTFRfVEFSR0VUUyArPSBqZGtfbGFuZwotamRrX2xhbmc6ICQoY2FsbCBUZXN0RGlycywgamF2YS9sYW5nKQoramRrX2xhbmc6ICQoY2FsbCBUZXN0RGlycywgamF2YS9sYW5nIHN1bi9pbnZva2Ugc3VuL21pc2Mgdm0pCiAJJChjYWxsIFJ1bkFnZW50dm1CYXRjaCkKIAogIyBTdGFibGUgb3RoZXJ2bSB0ZXN0cnVucyAobWludXMgaXRlbXMgZnJvbSBQUk9CTEVNX0xJU1QpCiAjICAgVXNpbmcgYWdlbnR2bSBoYXMgc2VyaW91cyBwcm9ibGVtcyB3aXRoIHRoZXNlIHRlc3RzCi1KREtfQUxMX1RBUkdFVFMgKz0gamRrX21hbmFnZW1lbnQxCi1qZGtfbWFuYWdlbWVudDE6ICQoY2FsbCBUZXN0RGlycywgamF2YXgvbWFuYWdlbWVudCkKK0pES19BTExfVEFSR0VUUyArPSBqZGtfam14CitqZGtfam14OiAkKGNhbGwgVGVzdERpcnMsIGphdmF4L21hbmFnZW1lbnQgY29tL3N1bi9qbXgpCiAJJChjYWxsIFJ1bk90aGVydm1CYXRjaCkKIAogIyBTdGFibGUgb3RoZXJ2bSB0ZXN0cnVucyAobWludXMgaXRlbXMgZnJvbSBQUk9CTEVNX0xJU1QpCiAjICAgVXNpbmcgYWdlbnR2bSBoYXMgc2VyaW91cyBwcm9ibGVtcyB3aXRoIHRoZXNlIHRlc3RzCi1KREtfQUxMX1RBUkdFVFMgKz0gamRrX21hbmFnZW1lbnQyCi1qZGtfbWFuYWdlbWVudDI6ICQoY2FsbCBUZXN0RGlycywgY29tL3N1bi9qbXggY29tL3N1bi9tYW5hZ2VtZW50IHN1bi9tYW5hZ2VtZW50KQorSkRLX0FMTF9UQVJHRVRTICs9IGpka19tYW5hZ2VtZW50CitqZGtfbWFuYWdlbWVudDogJChjYWxsIFRlc3REaXJzLCBjb20vc3VuL21hbmFnZW1lbnQgc3VuL21hbmFnZW1lbnQpCiAJJChjYWxsIFJ1bk90aGVydm1CYXRjaCkKIAotIyBBbGwgbWFuYWdlbWVudCB0ZXN0cwotamRrX21hbmFnZW1lbnQ6IGpka19tYW5hZ2VtZW50MSBqZGtfbWFuYWdlbWVudDIKLQlAJChTdW1tYXJ5SW5mbykKLQogIyBTdGFibGUgYWdlbnR2bSB0ZXN0cnVucyAobWludXMgaXRlbXMgZnJvbSBQUk9CTEVNX0xJU1QpCiBKREtfQUxMX1RBUkdFVFMgKz0gamRrX21hdGgKIEpES19ERUZBVUxUX1RBUkdFVFMgKz0gamRrX21hdGgKQEAgLTUwMyw1MiArNDk5LDQyIEBACiAJJChjYWxsIFJ1bkFnZW50dm1CYXRjaCkKIAogIyBTdGFibGUgYWdlbnR2bSB0ZXN0cnVucyAobWludXMgaXRlbXMgZnJvbSBQUk9CTEVNX0xJU1QpCi1KREtfQUxMX1RBUkdFVFMgKz0gamRrX21pc2MKLUpES19ERUZBVUxUX1RBUkdFVFMgKz0gamRrX21pc2MKLWpka19taXNjOiAkKGNhbGwgVGVzdERpcnMsIFwKLSAgICAgICAgICBkZW1vL2p2bXRpIGRlbW8vemlwZnMgamF2YXgvbmFtaW5nIGphdmF4L3NjcmlwdCBcCi0gICAgICAgICAgamF2YXgvc21hcnRjYXJkaW8gY29tL3N1bi9qbmRpIGNvbS9zdW4veG1sIFwKLSAgICAgICAgICBjb20vc3VuL2NvcmJhIHN1bi9taXNjKQorSkRLX0FMTF9UQVJHRVRTICs9IGpka19vdGhlcgorSkRLX0RFRkFVTFRfVEFSR0VUUyArPSBqZGtfb3RoZXIKK2pka19vdGhlcjogJChjYWxsIFRlc3REaXJzLCBcCisgICAgICAgICAgZGVtby9qdm10aSBkZW1vL3ppcGZzIHNhbXBsZSBcCisgICAgICAgICAgamF2YXgvbmFtaW5nIGNvbS9zdW4vam5kaSBcCisgICAgICAgICAgamF2YXgvc2NyaXB0IFwKKwkgIGphdmF4L3NxbCBcCisgICAgICAgICAgamF2YXgvc21hcnRjYXJkaW8gXAorCSAgamF2YXgveG1sL3dzIGNvbS9zdW4vaW50ZXJuYWwvd3MgXAorCSAgamRrL2FzbSBcCisJICBjb20vc3VuL29yZy9hcGFjaGUveGVyY2VzIFwKKyAgICAgICAgICBjb20vc3VuL2NvcmJhIFwKKwkgIGNvbS9zdW4vc2VydmljZXRhZyBcCisJICBjb20vc3VuL3RyYWNpbmcgXAorCSAgc3VuL3VzYWdldHJhY2tlcikKIAkkKGNhbGwgUnVuQWdlbnR2bUJhdGNoKQogCiAjIFN0YWJsZSBhZ2VudHZtIHRlc3RydW5zIChtaW51cyBpdGVtcyBmcm9tIFBST0JMRU1fTElTVCkKIEpES19BTExfVEFSR0VUUyArPSBqZGtfbmV0CiBKREtfREVGQVVMVF9UQVJHRVRTICs9IGpka19uZXQKLWpka19uZXQ6ICQoY2FsbCBUZXN0RGlycywgY29tL3N1bi9uZXQgamF2YS9uZXQgc3VuL25ldCkKK2pka19uZXQ6ICQoY2FsbCBUZXN0RGlycywgY29tL3N1bi9uZXQgamF2YS9uZXQgc3VuL25ldCBjb20vb3JhY2xlL25ldCkKIAkkKGNhbGwgUnVuQWdlbnR2bUJhdGNoKQogCiAjIFN0YWJsZSBhZ2VudHZtIHRlc3RydW5zIChtaW51cyBpdGVtcyBmcm9tIFBST0JMRU1fTElTVCkKLUpES19BTExfVEFSR0VUUyArPSBqZGtfbmlvMQotSkRLX0RFRkFVTFRfVEFSR0VUUyArPSBqZGtfbmlvMQotamRrX25pbzE6ICQoY2FsbCBUZXN0RGlycywgamF2YS9uaW8vZmlsZSkKLQkkKGNhbGwgUnVuQWdlbnR2bUJhdGNoKQotCi0jIFN0YWJsZSBhZ2VudHZtIHRlc3RydW5zIChtaW51cyBpdGVtcyBmcm9tIFBST0JMRU1fTElTVCkKLUpES19BTExfVEFSR0VUUyArPSBqZGtfbmlvMgotSkRLX0RFRkFVTFRfVEFSR0VUUyArPSBqZGtfbmlvMgotamRrX25pbzI6ICQoY2FsbCBUZXN0RGlycywgamF2YS9uaW8vQnVmZmVyIGphdmEvbmlvL0J5dGVPcmRlciBcCi0gICAgICAgICAgamF2YS9uaW8vY2hhbm5lbHMgamF2YS9uaW8vTWFwcGVkQnl0ZUJ1ZmZlciBzdW4vbmlvL2NoKQoramRrX25pbzogJChjYWxsIFRlc3REaXJzLCBqYXZhL25pbyBzdW4vbmlvIGNvbS9vcmFjbGUvbmlvKQogCSQoY2FsbCBTaGFyZWRMaWJyYXJ5UGVybWlzc2lvbnMsamF2YS9uaW8vY2hhbm5lbHMpCiAJJChjYWxsIFJ1bkFnZW50dm1CYXRjaCkKIAogIyBTdGFibGUgYWdlbnR2bSB0ZXN0cnVucyAobWludXMgaXRlbXMgZnJvbSBQUk9CTEVNX0xJU1QpCi1KREtfQUxMX1RBUkdFVFMgKz0gamRrX25pbzMKLUpES19ERUZBVUxUX1RBUkdFVFMgKz0gamRrX25pbzMKLWpka19uaW8zOiAkKGNhbGwgVGVzdERpcnMsIGphdmEvbmlvL2NoYXJzZXQgc3VuL25pby9jcykKLQkkKGNhbGwgUnVuQWdlbnR2bUJhdGNoKQotCi0jIEFsbCBuaW8gdGVzdHMKLWpka19uaW86IGpka19uaW8xIGpka19uaW8yIGpka19uaW8zCi0JQCQoU3VtbWFyeUluZm8pCi0KLSMgU3RhYmxlIGFnZW50dm0gdGVzdHJ1bnMgKG1pbnVzIGl0ZW1zIGZyb20gUFJPQkxFTV9MSVNUKQogamRrX3NjdHA6ICQoY2FsbCBUZXN0RGlycywgY29tL3N1bi9uaW8vc2N0cCkKIAkkKGNhbGwgUnVuQWdlbnR2bUJhdGNoKQogCiAjIFN0YWJsZSBvdGhlcnZtIHRlc3RydW5zIChtaW51cyBpdGVtcyBmcm9tIFBST0JMRU1fTElTVCkKICMgICBVc2luZyBhZ2VudHZtIGhhcyBzZXJpb3VzIHByb2JsZW1zIHdpdGggdGhlc2UgdGVzdHMKIEpES19BTExfVEFSR0VUUyArPSBqZGtfcm1pCi1qZGtfcm1pOiAkKGNhbGwgVGVzdERpcnMsIGphdmEvcm1pIGphdmF4L3JtaSBzdW4vcm1pKQoramRrX3JtaTogJChjYWxsIFRlc3REaXJzLCBqYXZhL3JtaSBzdW4vcm1pIGphdmF4L3JtaS9zc2wpCiAJJChjYWxsIFJ1bk90aGVydm1CYXRjaCkKIAogIyBTdGFibGUgYWdlbnR2bSB0ZXN0cnVucyAobWludXMgaXRlbXMgZnJvbSBQUk9CTEVNX0xJU1QpCkBAIC01NjYsNyArNTUyLDcgQEAKIEpES19BTExfVEFSR0VUUyArPSBqZGtfc2VjdXJpdHkzCiBqZGtfc2VjdXJpdHkzOiAkKGNhbGwgVGVzdERpcnMsIGNvbS9zdW4vc2VjdXJpdHkgbGliL3NlY3VyaXR5IGphdmF4L3NlY3VyaXR5IFwKICAgICAgICAgc3VuL3NlY3VyaXR5IGNvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvc2VjdXJpdHkgXAotICAgICAgICBjb20vb3JhY2xlL3NlY3VyaXR5L3VjcnlwdG8pCisgICAgICAgIGNvbS9vcmFjbGUvc2VjdXJpdHkpCiAJJChjYWxsIFNoYXJlZExpYnJhcnlQZXJtaXNzaW9ucyxzdW4vc2VjdXJpdHkpCiAJJChjYWxsIFJ1bkFnZW50dm1CYXRjaCkKIApAQCAtNTkzLDIzICs1NzksMTcgQEAKIAkkKGNhbGwgUnVuQWdlbnR2bUJhdGNoKQogCiAjIFN0YWJsZSBhZ2VudHZtIHRlc3RydW5zIChtaW51cyBpdGVtcyBmcm9tIFBST0JMRU1fTElTVCkKLUpES19BTExfVEFSR0VUUyArPSBqZGtfdG9vbHMxCi1qZGtfdG9vbHMxOiAkKGNhbGwgVGVzdERpcnMsIGNvbS9zdW4vamRpKQorSkRLX0FMTF9UQVJHRVRTICs9IGpka19qZGkKK2pka19qZGk6ICQoY2FsbCBUZXN0RGlycywgY29tL3N1bi9qZGkpCiAJJChjYWxsIFJ1bkFnZW50dm1CYXRjaCkKIAogIyBTdGFibGUgb3RoZXJ2bSB0ZXN0cnVucyAobWludXMgaXRlbXMgZnJvbSBQUk9CTEVNX0xJU1QpCiAjICAgVXNpbmcgYWdlbnR2bSBoYXMgc2VyaW91cyBwcm9ibGVtcyB3aXRoIHRoZXNlIHRlc3RzCi1KREtfQUxMX1RBUkdFVFMgKz0gamRrX3Rvb2xzMgotamRrX3Rvb2xzMjogJChjYWxsIFRlc3REaXJzLCBcCi0gICAgICAgICAgICBjb20vc3VuL3Rvb2xzIHN1bi9qdm1zdGF0IHN1bi90b29scyB0b29scyB2bSBcCi0gICAgICAgICAgICBjb20vc3VuL3NlcnZpY2V0YWcgY29tL3N1bi90cmFjaW5nKQorSkRLX0FMTF9UQVJHRVRTICs9IGpka190b29scworamRrX3Rvb2xzOiAkKGNhbGwgVGVzdERpcnMsIGNvbS9zdW4vdG9vbHMgc3VuL2p2bXN0YXQgc3VuL3Rvb2xzIHRvb2xzKQogCSQoY2FsbCBTaGFyZWRMaWJyYXJ5UGVybWlzc2lvbnMsdG9vbHMvbGF1bmNoZXIpCiAJJChjYWxsIFJ1bkFnZW50dm1CYXRjaCkKIAotIyBBbGwgdG9vbHMgdGVzdHMKLWpka190b29sczogamRrX3Rvb2xzMSBqZGtfdG9vbHMyCi0JQCQoU3VtbWFyeUluZm8pCi0KICMgU3RhYmxlIG90aGVydm0gdGVzdHJ1bnMgKG1pbnVzIGl0ZW1zIGZyb20gUFJPQkxFTV9MSVNUKQogIyAgIFVzaW5nIGFnZW50dm0gaGFzIHNlcmlvdXMgcHJvYmxlbXMgd2l0aCB0aGVzZSB0ZXN0cwogaWZkZWYgT1BFTkpESwpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvUHJvYmxlbUxpc3QudHh0IGIvamRrL3Rlc3QvUHJvYmxlbUxpc3QudHh0CmluZGV4IDIzYzkxY2YuLjFkYzA3NTkgMTAwNjQ0Ci0tLSBhL2pkay90ZXN0L1Byb2JsZW1MaXN0LnR4dAorKysgYi9qZGsvdGVzdC9Qcm9ibGVtTGlzdC50eHQKQEAgLTE1Miw2ICsxNTIsMTAgQEAKIAogIyBqZGtfbWFuYWdlbWVudAogCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgamRrX2pteAorCiAjIDY5NTk2MzYKIGphdmF4L21hbmFnZW1lbnQvbG9hZGluZy9MaWJyYXJ5TG9hZGVyL0xpYnJhcnlMb2FkZXJUZXN0LmphdmEJd2luZG93cy1hbGwKIApAQCAtMTY3LDcgKzE3MSw3IEBACiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAotIyBqZGtfbWlzYworIyBqZGtfb3RoZXIKIAogIyA2OTg4OTUwCiBkZW1vL2p2bXRpL2NvbXBpbGVkTWV0aG9kTG9hZC9Db21waWxlZE1ldGhvZExvYWRUZXN0LmphdmEJZ2VuZXJpYy1hbGwKQEAgLTMxNSw2ICszMTksOSBAQAogc3VuL3NlY3VyaXR5L3Rvb2xzL2tleXRvb2wvc2VsZmlzc3VlZC5zaCAgICAgICAgICAgICAgICAgICAgICAgIHNvbGFyaXMtYWxsCiBzdW4vc2VjdXJpdHkvdG9vbHMva2V5dG9vbC9zdGFuZGFyZC5zaCAgICAgICAgICAgICAgICAgICAgICAgICAgc29sYXJpcy1hbGwKIAorIyA4MDAwNDM5OiBOUEc6IFJFR1JFU1NJT04gOiBzdW4vc2VjdXJpdHkva3JiNS9hdXRvL01heFJldHJpZXMuamF2YSBmYWlscyB3aXRoIHRpbWVvdXQKK3N1bi9zZWN1cml0eS9rcmI1L2F1dG8vTWF4UmV0cmllcy5qYXZhICAgICAgICAgICAgICAgICAgICAgICAgICBzb2xhcmlzLXNwYXJjdjkKKwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCiAjIGpka19zb3VuZApAQCAtMzI5LDYgKzMzNiw3IEBACiAKICMgNzE5NjE5OQogamF2YS90ZXh0L0JpZGkvQnVnNjY2NTAyOC5qYXZhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyaWMtYWxsCisKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAogIyBqZGtfdG9vbHMKQEAgLTMzNiw2ICszNDQsMjQgQEAKICMgNjQ2MTYzNQogY29tL3N1bi90b29scy9hdHRhY2gvQmFzaWNUZXN0cy5zaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyaWMtYWxsCiAKKyMgNzE3MjE3Ngorc3VuL3Rvb2xzL2pjb25zb2xlL1Jlc291cmNlQ2hlY2tUZXN0LnNoICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyaWMtYWxsCitzdW4vdG9vbHMvamNvbnNvbGUvSW1tdXRhYmxlUmVzb3VyY2VUZXN0LnNoICAgICAgICAgICAgICAgICAgICAgZ2VuZXJpYy1hbGwKKworIyA3MTMyMjAzCitzdW4vanZtc3RhdC9tb25pdG9yL01vbml0b3JlZFZtL0NSNjY3MjEzNS5qYXZhICAgICAgICAgICAgICAgICAgZ2VuZXJpYy1hbGwKKworIyBUZXN0cyB0YWtlIHRvbyBsb25nLCBzZWUgNzE0MzI3OQordG9vbHMvcGFjazIwMC9Db21tYW5kTGluZVRlc3RzLmphdmEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyaWMtYWxsCit0b29scy9wYWNrMjAwL1BhY2syMDBUZXN0LmphdmEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJpYy1hbGwKKworIyA3MTUwNTY5Cit0b29scy9sYXVuY2hlci9Vbmljb2RlVGVzdC5qYXZhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjb3N4LWFsbAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgamRrX2pkaQorCiAjIEZpbGVkIDY5NTIxMDUKIGNvbS9zdW4vamRpL1N1c3BlbmRUaHJlYWRUZXN0LmphdmEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmljLWFsbAogCkBAIC0zNTEsMjAgKzM3Nyw2IEBACiAjIEZpbGVkIDY0MDIyMDEKIGNvbS9zdW4vamRpL1Byb2Nlc3NBdHRhY2hUZXN0LnNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmljLWFsbAogCi0jIEZpbGVkIDcxNzIxNzYKLXN1bi90b29scy9qY29uc29sZS9SZXNvdXJjZUNoZWNrVGVzdC5zaCAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmljLWFsbAotc3VuL3Rvb2xzL2pjb25zb2xlL0ltbXV0YWJsZVJlc291cmNlVGVzdC5zaAkJCWdlbmVyaWMtYWxsCi0KLSMgNzEzMjIwMwotc3VuL2p2bXN0YXQvbW9uaXRvci9Nb25pdG9yZWRWbS9DUjY2NzIxMzUuamF2YQkJCWdlbmVyaWMtYWxsCi0KLSMgVGVzdHMgdGFrZSB0b28gbG9uZywgc2VlIDcxNDMyNzkKLXRvb2xzL3BhY2syMDAvQ29tbWFuZExpbmVUZXN0cy5qYXZhICAgICAgICAgICAgICAgICAgICAgICAgIAlnZW5lcmljLWFsbAotdG9vbHMvcGFjazIwMC9QYWNrMjAwVGVzdC5qYXZhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCWdlbmVyaWMtYWxsCi0KLSMgNzE1MDU2OQotdG9vbHMvbGF1bmNoZXIvVW5pY29kZVRlc3QuamF2YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY29zeC1hbGwKLQogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCiAjIGpka191dGlsCmRpZmYgLS1naXQgYS9qZGsvdGVzdC9jb20vc3VuL2puZGkvbGRhcC9MZGFwVGltZW91dFRlc3QuamF2YSBiL2pkay90ZXN0L2NvbS9zdW4vam5kaS9sZGFwL0xkYXBUaW1lb3V0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMzc3ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvdGVzdC9jb20vc3VuL2puZGkvbGRhcC9MZGFwVGltZW91dFRlc3QuamF2YQpAQCAtMCwwICsxLDE3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQorICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQorICogcXVlc3Rpb25zLgorICovCisKKy8qKgorICogQHRlc3QKKyAqIEBidWcgNzA5NDM3NyA4MDAwNDg3IDYxNzYwMzYgNzA1NjQ4OQorICogQHN1bW1hcnkgVGltZW91dCB0ZXN0cyBmb3IgbGRhcAorICovCisKK2ltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7CitpbXBvcnQgamF2YS5uZXQuU2VydmVyU29ja2V0OworaW1wb3J0IGphdmEubmV0LlNvY2tldFRpbWVvdXRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmF4Lm5hbWluZy4qOworaW1wb3J0IGphdmF4Lm5hbWluZy5kaXJlY3RvcnkuKjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yczsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TY2hlZHVsZWRFeGVjdXRvclNlcnZpY2U7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuU2NoZWR1bGVkRnV0dXJlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCitwdWJsaWMgY2xhc3MgTGRhcFRpbWVvdXRUZXN0IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTY2hlZHVsZWRFeGVjdXRvclNlcnZpY2UgcG9vbCA9CisgICAgICAgIEV4ZWN1dG9ycy5uZXdTY2hlZHVsZWRUaHJlYWRQb29sKDEpOworICAgIHN0YXRpYyB2b2xhdGlsZSBpbnQgcGFzc2VkID0gMCwgZmFpbGVkID0gMDsKKyAgICBzdGF0aWMgdm9pZCBwYXNzKCkge3Bhc3NlZCsrO30KKyAgICBzdGF0aWMgdm9pZCBmYWlsKCkge2ZhaWxlZCsrOyBUaHJlYWQuZHVtcFN0YWNrKCk7fQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFNlcnZlclNvY2tldCBzZXJ2ZXJTb2NrID0gbmV3IFNlcnZlclNvY2tldCgwKTsKKyAgICAgICAgU2VydmVyIHMgPSBuZXcgU2VydmVyKHNlcnZlclNvY2spOworICAgICAgICBzLnN0YXJ0KCk7CisgICAgICAgIFRocmVhZC5zbGVlcCgyMDApOworCisgICAgICAgIEhhc2h0YWJsZSBlbnYgPSBuZXcgSGFzaHRhYmxlKDExKTsKKyAgICAgICAgZW52LnB1dChDb250ZXh0LklOSVRJQUxfQ09OVEVYVF9GQUNUT1JZLAorICAgICAgICAgICAgImNvbS5zdW4uam5kaS5sZGFwLkxkYXBDdHhGYWN0b3J5Iik7CisgICAgICAgIGVudi5wdXQoQ29udGV4dC5QUk9WSURFUl9VUkwsICJsZGFwOi8vbG9jYWxob3N0OiIgKworICAgICAgICAgICAgc2VydmVyU29jay5nZXRMb2NhbFBvcnQoKSk7CisKKyAgICAgICAgZW52LnB1dChDb250ZXh0LlNFQ1VSSVRZX0FVVEhFTlRJQ0FUSU9OLCJzaW1wbGUiKTsKKworICAgICAgICBlbnYucHV0KENvbnRleHQuU0VDVVJJVFlfUFJJTkNJUEFMLCAidXNlciIpOworICAgICAgICBlbnYucHV0KENvbnRleHQuU0VDVVJJVFlfQ1JFREVOVElBTFMsICJwYXNzd29yZCIpOworCisgICAgICAgIGVudi5wdXQoImNvbS5zdW4uam5kaS5sZGFwLmNvbm5lY3QudGltZW91dCIsICIxMCIpOworICAgICAgICBlbnYucHV0KCJjb20uc3VuLmpuZGkubGRhcC5yZWFkLnRpbWVvdXQiLCAiMzAwMCIpOworCisgICAgICAgIEluaXRpYWxDb250ZXh0IGN0eCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgTGRhcFRpbWVvdXRUZXN0KCkubGRhcFJlYWRUaW1lb3V0VGVzdChlbnYsIGZhbHNlKTsKKyAgICAgICAgICAgIG5ldyBMZGFwVGltZW91dFRlc3QoKS5sZGFwUmVhZFRpbWVvdXRUZXN0KGVudiwgdHJ1ZSk7CisgICAgICAgICAgICBuZXcgTGRhcFRpbWVvdXRUZXN0KCkuc2ltcGxlQXV0aENvbm5lY3RUZXN0KGVudik7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBzLmludGVycnVwdCgpOworICAgICAgICAgICAgTGRhcFRpbWVvdXRUZXN0LnBvb2wuc2h1dGRvd24oKTsKKyAgICAgICAgfQorCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCIlblBhc3NlZCA9ICVkLCBmYWlsZWQgPSAlZCVuJW4iLCBwYXNzZWQsIGZhaWxlZCk7CisgICAgICAgIGlmIChmYWlsZWQgPiAwKSB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoIlNvbWUgdGVzdHMgZmFpbGVkIik7CisgICAgfQorCisgICAgdm9pZCBsZGFwUmVhZFRpbWVvdXRUZXN0KEhhc2h0YWJsZSBlbnYsIGJvb2xlYW4gc3NsKSB7CisgICAgICAgIEluaXRpYWxDb250ZXh0IGN0eCA9IG51bGw7CisgICAgICAgIGlmIChzc2wpIGVudi5wdXQoQ29udGV4dC5TRUNVUklUWV9QUk9UT0NPTCwgInNzbCIpOworICAgICAgICBTY2hlZHVsZWRGdXR1cmUga2lsbGVyID0ga2lsbFN3aXRjaCgpOworICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLm5hbm9UaW1lKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjdHggPSBuZXcgSW5pdGlhbERpckNvbnRleHQoZW52KTsKKyAgICAgICAgICAgIFNlYXJjaENvbnRyb2xzIHNjbCA9IG5ldyBTZWFyY2hDb250cm9scygpOworICAgICAgICAgICAgc2NsLnNldFNlYXJjaFNjb3BlKFNlYXJjaENvbnRyb2xzLlNVQlRSRUVfU0NPUEUpOworICAgICAgICAgICAgTmFtaW5nRW51bWVyYXRpb248U2VhcmNoUmVzdWx0PiBhbnN3ZXIgPSAoKEluaXRpYWxEaXJDb250ZXh0KWN0eCkKKyAgICAgICAgICAgICAgICAuc2VhcmNoKCJvdT1QZW9wbGUsbz1KTkRJVHV0b3JpYWwiLCAiKG9iamVjdENsYXNzPSopIiwgc2NsKTsKKyAgICAgICAgICAgIC8vIHNob3VsZG4ndCByZWFjaCBoZXJlCisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBpZiAoc3NsKSB7CisgICAgICAgICAgICAgICAgaWYgKGUuZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIFNvY2tldFRpbWVvdXRFeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgcGFzcygpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5nZXRDYXVzZSgpIGluc3RhbmNlb2YgSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgICAgICBUaHJlYWQuaW50ZXJydXB0ZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgZmFpbCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcGFzcygpOworICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKCFzaHV0SXREb3duKGtpbGxlciwgY3R4KSkgZmFpbCgpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBzaW1wbGVBdXRoQ29ubmVjdFRlc3QoSGFzaHRhYmxlIGVudikgeworICAgICAgICBJbml0aWFsQ29udGV4dCBjdHggPSBudWxsOworICAgICAgICBTY2hlZHVsZWRGdXR1cmUga2lsbGVyID0ga2lsbFN3aXRjaCgpOworICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLm5hbm9UaW1lKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjdHggPSBuZXcgSW5pdGlhbERpckNvbnRleHQoZW52KTsKKyAgICAgICAgICAgIC8vIHNob3VsZG4ndCByZWFjaCBoZXJlCisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkZhaWw6IEluaXRpYWxEaXJDb250ZXh0IHN1Y2NlZWRlZCIpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9uZyBlbmQgPSBTeXN0ZW0ubmFub1RpbWUoKTsKKyAgICAgICAgICAgIGlmIChlLmdldENhdXNlKCkgaW5zdGFuY2VvZiBTb2NrZXRUaW1lb3V0RXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgaWYgKFRpbWVVbml0Lk5BTk9TRUNPTkRTLnRvTWlsbGlzKGVuZCAtIHN0YXJ0KSA8IDI5MDApIHsKKyAgICAgICAgICAgICAgICAgICAgcGFzcygpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiRmFpbDogV2FpdGVkIHRvbyBsb25nIik7CisgICAgICAgICAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGUuZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIEludGVycnVwdGVkSU9FeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICBUaHJlYWQuaW50ZXJydXB0ZWQoKTsKKyAgICAgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmICghc2h1dEl0RG93bihraWxsZXIsIGN0eCkpIGZhaWwoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJvb2xlYW4gc2h1dEl0RG93bihTY2hlZHVsZWRGdXR1cmUga2lsbGVyLCBJbml0aWFsQ29udGV4dCBjdHgpIHsKKyAgICAgICAga2lsbGVyLmNhbmNlbCh0cnVlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChjdHggIT0gbnVsbCkgY3R4LmNsb3NlKCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBTY2hlZHVsZWRGdXR1cmUga2lsbFN3aXRjaCgpIHsKKyAgICAgICAgZmluYWwgVGhyZWFkIGN1cnJlbnQgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpOworICAgICAgICByZXR1cm4gTGRhcFRpbWVvdXRUZXN0LnBvb2wuc2NoZWR1bGUobmV3IENhbGxhYmxlPFZvaWQ+KCkgeworICAgICAgICAgICAgcHVibGljIFZvaWQgY2FsbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiRmFpbDoga2lsbFN3aXRjaCgpIik7CisgICAgICAgICAgICAgICAgY3VycmVudC5pbnRlcnJ1cHQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwgNTAwMCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgU2VydmVyIGV4dGVuZHMgVGhyZWFkIHsKKyAgICAgICAgZmluYWwgU2VydmVyU29ja2V0IHNlcnZlclNvY2s7CisKKyAgICAgICAgU2VydmVyKFNlcnZlclNvY2tldCBzZXJ2ZXJTb2NrKSB7CisgICAgICAgICAgICB0aGlzLnNlcnZlclNvY2sgPSBzZXJ2ZXJTb2NrOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBTb2NrZXQgc29ja2V0ID0gc2VydmVyU29jay5hY2NlcHQoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHt9CisgICAgICAgIH0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2pkay90ZXN0L2NvbS9zdW4vam5kaS9sZGFwL0xkYXBzUmVhZFRpbWVvdXRUZXN0LmphdmEgYi9qZGsvdGVzdC9jb20vc3VuL2puZGkvbGRhcC9MZGFwc1JlYWRUaW1lb3V0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmFlNzdkLi4wMDAwMDAwCi0tLSBhL2pkay90ZXN0L2NvbS9zdW4vam5kaS9sZGFwL0xkYXBzUmVhZFRpbWVvdXRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0Ci0gKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqCi0gKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQotICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQotICogcXVlc3Rpb25zLgotICovCi0KLS8qKgotICogQHRlc3QKLSAqIEBidWcgNzA5NDM3NwotICogQHN1bW1hcnkgQ29tLnN1bi5qbmRpLmxkYXAucmVhZC50aW1lb3V0IGRvZXNuJ3Qgd29yayB3aXRoIGxkYXBzLgotICovCi0KLWltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7Ci1pbXBvcnQgamF2YS5uZXQuU2VydmVyU29ja2V0OwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZheC5uYW1pbmcuKjsKLWltcG9ydCBqYXZheC5uYW1pbmcuZGlyZWN0b3J5Lio7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotcHVibGljIGNsYXNzIExkYXBzUmVhZFRpbWVvdXRUZXN0IHsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBib29sZWFuIHBhc3NlZCA9IGZhbHNlOwotCi0gICAgICAgIC8vIGNyZWF0ZSB0aGUgc2VydmVyCi0gICAgICAgIHRyeSAoU2VydmVyIHNlcnZlciA9IFNlcnZlci5jcmVhdGUoKSkgewotICAgICAgICAgICAgLy8gU2V0IHVwIHRoZSBlbnZpcm9ubWVudCBmb3IgY3JlYXRpbmcgdGhlIGluaXRpYWwgY29udGV4dAotICAgICAgICAgICAgSGFzaHRhYmxlPFN0cmluZyxPYmplY3Q+IGVudiA9IG5ldyBIYXNodGFibGU8PigxMSk7Ci0gICAgICAgICAgICBlbnYucHV0KENvbnRleHQuSU5JVElBTF9DT05URVhUX0ZBQ1RPUlksCi0gICAgICAgICAgICAgICAgImNvbS5zdW4uam5kaS5sZGFwLkxkYXBDdHhGYWN0b3J5Iik7Ci0gICAgICAgICAgICBlbnYucHV0KCJjb20uc3VuLmpuZGkubGRhcC5jb25uZWN0LnRpbWVvdXQiLCAiMTAwMCIpOwotICAgICAgICAgICAgZW52LnB1dCgiY29tLnN1bi5qbmRpLmxkYXAucmVhZC50aW1lb3V0IiwgIjEwMDAiKTsKLSAgICAgICAgICAgIGVudi5wdXQoQ29udGV4dC5QUk9WSURFUl9VUkwsICJsZGFwczovL2xvY2FsaG9zdDoiICsgc2VydmVyLnBvcnQoKSk7Ci0KLQotICAgICAgICAgICAgLy8gQ3JlYXRlIGluaXRpYWwgY29udGV4dAotICAgICAgICAgICAgRGlyQ29udGV4dCBjdHggPSBuZXcgSW5pdGlhbERpckNvbnRleHQoZW52KTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJMREFQIENsaWVudDogQ29ubmVjdGVkIHRvIHRoZSBTZXJ2ZXIiKTsKLQotICAgICAgICAgICAgICAgIFNlYXJjaENvbnRyb2xzIHNjbCA9IG5ldyBTZWFyY2hDb250cm9scygpOwotICAgICAgICAgICAgICAgIHNjbC5zZXRTZWFyY2hTY29wZShTZWFyY2hDb250cm9scy5TVUJUUkVFX1NDT1BFKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlBlcmZvcm1pbmcgU2VhcmNoIik7Ci0gICAgICAgICAgICAgICAgTmFtaW5nRW51bWVyYXRpb248U2VhcmNoUmVzdWx0PiBhbnN3ZXIgPQotICAgICAgICAgICAgICAgICAgICBjdHguc2VhcmNoKCJvdT1QZW9wbGUsbz1KTkRJVHV0b3JpYWwiLCAiKG9iamVjdENsYXNzPSopIiwgc2NsKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgLy8gQ2xvc2UgdGhlIGNvbnRleHQgd2hlbiB3ZSdyZSBkb25lCi0gICAgICAgICAgICAgICAgY3R4LmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBwYXNzZWQgPSB0cnVlOwotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghcGFzc2VkKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJSZWFkIHRpbWVvdXQgdGVzdCBmYWlsZWQsIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgIiByZWFkIHRpbWVvdXQgZXhjZXB0aW9uIG5vdCB0aHJvd24iKTsKLSAgICAgICAgfQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRoZSB0ZXN0IFBBU1NFRCIpOwotICAgIH0KLQotICAgIHN0YXRpYyBjbGFzcyBTZXJ2ZXIgaW1wbGVtZW50cyBSdW5uYWJsZSwgQ2xvc2VhYmxlIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTZXJ2ZXJTb2NrZXQgc3M7Ci0gICAgICAgIHByaXZhdGUgU29ja2V0IHNyZWY7Ci0KLSAgICAgICAgcHJpdmF0ZSBTZXJ2ZXIoU2VydmVyU29ja2V0IHNzKSB7Ci0gICAgICAgICAgICB0aGlzLnNzID0gc3M7Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0aWMgU2VydmVyIGNyZWF0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBTZXJ2ZXIgc2VydmVyID0gbmV3IFNlcnZlcihuZXcgU2VydmVyU29ja2V0KDApKTsKLSAgICAgICAgICAgIG5ldyBUaHJlYWQoc2VydmVyKS5zdGFydCgpOwotICAgICAgICAgICAgcmV0dXJuIHNlcnZlcjsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBwb3J0KCkgewotICAgICAgICAgICAgcmV0dXJuIHNzLmdldExvY2FsUG9ydCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgdHJ5IChTb2NrZXQgcyA9IHNzLmFjY2VwdCgpKSB7Ci0gICAgICAgICAgICAgICAgc3JlZiA9IHM7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTZXJ2ZXI6IENvbm5lY3Rpb24gYWNjZXB0ZWQiKTsKLSAgICAgICAgICAgICAgICBCdWZmZXJlZElucHV0U3RyZWFtIGJpcyA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKHMuZ2V0SW5wdXRTdHJlYW0oKSk7Ci0gICAgICAgICAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzEwMF07Ci0gICAgICAgICAgICAgICAgaW50IG47Ci0gICAgICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICAgICBuID0gYmlzLnJlYWQoYnVmKTsKLSAgICAgICAgICAgICAgICB9IHdoaWxlIChuID4gMCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gaWdub3JlCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBzcy5jbG9zZSgpOwotICAgICAgICAgICAgc3JlZi5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvY29tL3N1bi9qbmRpL2xkYXAvUmVhZFRpbWVvdXRUZXN0LmphdmEgYi9qZGsvdGVzdC9jb20vc3VuL2puZGkvbGRhcC9SZWFkVGltZW91dFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBlMjkxNy4uMDAwMDAwMAotLS0gYS9qZGsvdGVzdC9jb20vc3VuL2puZGkvbGRhcC9SZWFkVGltZW91dFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDExLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKLSAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKLSAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCi0gKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55Ci0gKiBxdWVzdGlvbnMuCi0gKi8KLQotLyoqCi0gKiBAdGVzdAotICogQGJ1ZyA2MTc2MDM2IDcwNTY0ODkKLSAqIEBzdW1tYXJ5IFJlYWQtdGltZW91dCBzcGVjaWZpY2F0aW9uIGZvciBMREFQIG9wZXJhdGlvbnMKLSAqLwotCi1pbXBvcnQgamF2YS5uZXQuU29ja2V0OwotaW1wb3J0IGphdmEubmV0LlNlcnZlclNvY2tldDsKLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YXgubmFtaW5nLio7Ci1pbXBvcnQgamF2YXgubmFtaW5nLmRpcmVjdG9yeS4qOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLXB1YmxpYyBjbGFzcyBSZWFkVGltZW91dFRlc3QgewotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGJvb2xlYW4gcGFzc2VkID0gZmFsc2U7Ci0KLSAgICAgICAgLy8gY3JlYXRlIHRoZSBzZXJ2ZXIKLSAgICAgICAgdHJ5IChTZXJ2ZXIgc2VydmVyID0gU2VydmVyLmNyZWF0ZSgpKSB7Ci0gICAgICAgICAgICAvLyBTZXQgdXAgdGhlIGVudmlyb25tZW50IGZvciBjcmVhdGluZyB0aGUgaW5pdGlhbCBjb250ZXh0Ci0gICAgICAgICAgICBIYXNodGFibGU8U3RyaW5nLE9iamVjdD4gZW52ID0gbmV3IEhhc2h0YWJsZTw+KDExKTsKLSAgICAgICAgICAgIGVudi5wdXQoQ29udGV4dC5JTklUSUFMX0NPTlRFWFRfRkFDVE9SWSwKLSAgICAgICAgICAgICAgICAiY29tLnN1bi5qbmRpLmxkYXAuTGRhcEN0eEZhY3RvcnkiKTsKLSAgICAgICAgICAgIGVudi5wdXQoImNvbS5zdW4uam5kaS5sZGFwLnJlYWQudGltZW91dCIsICIxMDAwIik7Ci0gICAgICAgICAgICBlbnYucHV0KENvbnRleHQuUFJPVklERVJfVVJMLCAibGRhcDovL2xvY2FsaG9zdDoiICsgc2VydmVyLnBvcnQoKSk7Ci0KLQotICAgICAgICAgICAgLy8gQ3JlYXRlIGluaXRpYWwgY29udGV4dAotICAgICAgICAgICAgRGlyQ29udGV4dCBjdHggPSBuZXcgSW5pdGlhbERpckNvbnRleHQoZW52KTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJMREFQIENsaWVudDogQ29ubmVjdGVkIHRvIHRoZSBTZXJ2ZXIiKTsKLQotICAgICAgICAgICAgICAgIFNlYXJjaENvbnRyb2xzIHNjbCA9IG5ldyBTZWFyY2hDb250cm9scygpOwotICAgICAgICAgICAgICAgIHNjbC5zZXRTZWFyY2hTY29wZShTZWFyY2hDb250cm9scy5TVUJUUkVFX1NDT1BFKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlBlcmZvcm1pbmcgU2VhcmNoIik7Ci0gICAgICAgICAgICAgICAgTmFtaW5nRW51bWVyYXRpb248U2VhcmNoUmVzdWx0PiBhbnN3ZXIgPQotICAgICAgICAgICAgICAgICAgICBjdHguc2VhcmNoKCJvdT1QZW9wbGUsbz1KTkRJVHV0b3JpYWwiLCAiKG9iamVjdENsYXNzPSopIiwgc2NsKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgLy8gQ2xvc2UgdGhlIGNvbnRleHQgd2hlbiB3ZSdyZSBkb25lCi0gICAgICAgICAgICAgICAgY3R4LmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBwYXNzZWQgPSB0cnVlOwotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghcGFzc2VkKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJSZWFkIHRpbWVvdXQgdGVzdCBmYWlsZWQsIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgIiByZWFkIHRpbWVvdXQgZXhjZXB0aW9uIG5vdCB0aHJvd24iKTsKLSAgICAgICAgfQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRoZSB0ZXN0IFBBU1NFRCIpOwotICAgIH0KLQotICAgIHN0YXRpYyBjbGFzcyBTZXJ2ZXIgaW1wbGVtZW50cyBSdW5uYWJsZSwgQ2xvc2VhYmxlIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTZXJ2ZXJTb2NrZXQgc3M7Ci0KLSAgICAgICAgcHJpdmF0ZSBTZXJ2ZXIoU2VydmVyU29ja2V0IHNzKSB7Ci0gICAgICAgICAgICB0aGlzLnNzID0gc3M7Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0aWMgU2VydmVyIGNyZWF0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBTZXJ2ZXIgc2VydmVyID0gbmV3IFNlcnZlcihuZXcgU2VydmVyU29ja2V0KDApKTsKLSAgICAgICAgICAgIG5ldyBUaHJlYWQoc2VydmVyKS5zdGFydCgpOwotICAgICAgICAgICAgcmV0dXJuIHNlcnZlcjsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBwb3J0KCkgewotICAgICAgICAgICAgcmV0dXJuIHNzLmdldExvY2FsUG9ydCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgdHJ5IChTb2NrZXQgcyA9IHNzLmFjY2VwdCgpKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTZXJ2ZXI6IENvbm5lY3Rpb24gYWNjZXB0ZWQiKTsKLSAgICAgICAgICAgICAgICBCdWZmZXJlZElucHV0U3RyZWFtIGJpcyA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKHMuZ2V0SW5wdXRTdHJlYW0oKSk7Ci0gICAgICAgICAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzEwMF07Ci0gICAgICAgICAgICAgICAgaW50IG47Ci0gICAgICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICAgICBuID0gYmlzLnJlYWQoYnVmKTsKLSAgICAgICAgICAgICAgICB9IHdoaWxlIChuID4gMCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gaWdub3JlCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBzcy5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YS9hd3QvRnJhbWUvNzAyNDc0OS9idWc3MDI0NzQ5LmphdmEgYi9qZGsvdGVzdC9qYXZhL2F3dC9GcmFtZS83MDI0NzQ5L2J1ZzcwMjQ3NDkuamF2YQppbmRleCA1ZWIyOGI2Li40ZTdmNjgyIDEwMDY0NAotLS0gYS9qZGsvdGVzdC9qYXZhL2F3dC9GcmFtZS83MDI0NzQ5L2J1ZzcwMjQ3NDkuamF2YQorKysgYi9qZGsvdGVzdC9qYXZhL2F3dC9GcmFtZS83MDI0NzQ5L2J1ZzcwMjQ3NDkuamF2YQpAQCAtMjUsNyArMjUsNyBAQAogICogQHRlc3QKICAqIEBidWcgNzAyNDc0OQogICogQHN1bW1hcnkgSkRLNyBiMTMxLS0tYSBjcmFzaCBpbjogSmF2YV9zdW5fYXd0X3dpbmRvd3NfVGhlbWVSZWFkZXJfaXNHZXRUaGVtZVRyYW5zaXRpb25EdXJhdGlvbkRlZmluZWQrMHg3NQotICogQGxpYnJhcnkgLi4vLi4vLi4vcmVndGVzdGhlbHBlcnMKKyAqIEBsaWJyYXJ5IC4uLy4uL3JlZ3Rlc3RoZWxwZXJzCiAgKiBAYnVpbGQgVXRpbAogICogQGF1dGhvciBPbGVnIFBla2hvdnNraXk6IGFyZWE9YXd0LnRvcGxldmVsCiAgICBAcnVuIG1haW4gYnVnNzAyNDc0OQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YS9hd3QvR3JhcGhpY3NDb25maWd1cmF0aW9uL05vcm1hbGl6aW5nVHJhbnNmb3JtVGVzdC9Ob3JtYWxpemluZ1RyYW5zZm9ybVRlc3QuamF2YSBiL2pkay90ZXN0L2phdmEvYXd0L0dyYXBoaWNzQ29uZmlndXJhdGlvbi9Ob3JtYWxpemluZ1RyYW5zZm9ybVRlc3QvTm9ybWFsaXppbmdUcmFuc2Zvcm1UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU1ZTQ2YgotLS0gL2Rldi9udWxsCisrKyBiL2pkay90ZXN0L2phdmEvYXd0L0dyYXBoaWNzQ29uZmlndXJhdGlvbi9Ob3JtYWxpemluZ1RyYW5zZm9ybVRlc3QvTm9ybWFsaXppbmdUcmFuc2Zvcm1UZXN0LmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQorICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQorICogcXVlc3Rpb25zLgorICovCisKKy8qKgorICogQHRlc3QKKyAqIEBidWcgNjM3MzUwNQorICogQHN1bW1hcnkgVGVzdHMgdGhhdCB0aGUgcmVzdWx0IG9mIFRvb2xraXQuZ2V0U2NyZWVuUmVzb2x1dGlvbigpIGlzCisgKiBjb25zaXN0ZW50IHdpdGggR3JhcGhpY3NDb25maWd1cmF0aW9uLmdldE5vcm1hbGl6aW5nVHJhbnNmb3JtKCkuCisgKiBAYXV0aG9yIERtaXRyaS5UcmVtYm92ZXRza2lAU3VuLkNPTTogYXJlYT1HcmFwaGljc0NvbmZpZ3VyYXRpb24KKyAqIEBydW4gbWFpbiBOb3JtYWxpemluZ1RyYW5zZm9ybVRlc3QKKyAqLworCitpbXBvcnQgamF2YS5hd3QuR3JhcGhpY3NDb25maWd1cmF0aW9uOworaW1wb3J0IGphdmEuYXd0LkdyYXBoaWNzRW52aXJvbm1lbnQ7CitpbXBvcnQgamF2YS5hd3QuVG9vbGtpdDsKK2ltcG9ydCBqYXZhLmF3dC5nZW9tLkFmZmluZVRyYW5zZm9ybTsKKworcHVibGljIGNsYXNzIE5vcm1hbGl6aW5nVHJhbnNmb3JtVGVzdCB7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIEdyYXBoaWNzQ29uZmlndXJhdGlvbiBnYyA9CisgICAgICAgICAgICBHcmFwaGljc0Vudmlyb25tZW50LmdldExvY2FsR3JhcGhpY3NFbnZpcm9ubWVudCgpLgorICAgICAgICAgICAgICAgIGdldERlZmF1bHRTY3JlZW5EZXZpY2UoKS5nZXREZWZhdWx0Q29uZmlndXJhdGlvbigpOworICAgICAgICBBZmZpbmVUcmFuc2Zvcm0gbm9ybVRyYW5zZm9ybSA9IGdjLmdldE5vcm1hbGl6aW5nVHJhbnNmb3JtKCk7CisgICAgICAgIGludCBkcGlYID0gVG9vbGtpdC5nZXREZWZhdWx0VG9vbGtpdCgpLmdldFNjcmVlblJlc29sdXRpb24oKTsKKyAgICAgICAgaW50IG5vcm1EcGlYID0gKGludCkobm9ybVRyYW5zZm9ybS5nZXRTY2FsZVgoKSAqIDcyLjApOworICAgICAgICBpZiAoZHBpWCAhPSBub3JtRHBpWCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIlRlc3QgRkFJTEVELiBUb29sa2l0LmdldFNjcmVlblJlc29sdXRpb24oKT0iICsgZHBpWCArCisgICAgICAgICAgICAgICAgIiBHcmFwaGljc0NvbmZpZ3VyYXRpb24uZ2V0Tm9ybWFsaXppbmdUcmFuc2Zvcm0oKT0iK25vcm1EcGlYKTsKKyAgICAgICAgfQorICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRlc3QgUEFTU0VELiBEUEk9Iitub3JtRHBpWCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZhL2F3dC9Ub29sa2l0L0JhZERpc3BsYXlUZXN0L0JhZERpc3BsYXlUZXN0LmphdmEgYi9qZGsvdGVzdC9qYXZhL2F3dC9Ub29sa2l0L0JhZERpc3BsYXlUZXN0L0JhZERpc3BsYXlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTViZWQ5YwotLS0gL2Rldi9udWxsCisrKyBiL2pkay90ZXN0L2phdmEvYXd0L1Rvb2xraXQvQmFkRGlzcGxheVRlc3QvQmFkRGlzcGxheVRlc3QuamF2YQpAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCisgKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CisgKiBxdWVzdGlvbnMuCisgKi8KKworCisvKgorICogQHRlc3QKKyAqIEBzdW1tYXJ5IFRlc3QgdGhhdCBUb29sa2l0LmdldERlZmF1bHRUb29sa2l0IHRocm93cyBBV1RFcnJvciBleGNlcHRpb24gaWYgYmFkIERJU1BMQVkgdmFyaWFibGUgd2FzIHNldAorICogQGJ1ZyA2ODE4MDgzCisgKgorICogQHJ1biBzaGVsbC90aW1lb3V0PTI0MCBCYWREaXNwbGF5VGVzdC5zaAorICovCisKK2ltcG9ydCBqYXZhLmF3dC4qOworCitwdWJsaWMgY2xhc3MgQmFkRGlzcGxheVRlc3R7CisgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisKKyAgICAgICAgVGhyb3dhYmxlIHRoID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFRvb2xraXQuZ2V0RGVmYXVsdFRvb2xraXQoKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHgpIHsKKyAgICAgICAgICAgIHRoID0geDsKKyAgICAgICAgfQorICAgICAgICBpZiAoICEodGggaW5zdGFuY2VvZiBBV1RFcnJvcikpIHsKKyAgICAgICAgICAgIFN5c3RlbS5leGl0KDEpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YS9hd3QvVG9vbGtpdC9CYWREaXNwbGF5VGVzdC9CYWREaXNwbGF5VGVzdC5zaCBiL2pkay90ZXN0L2phdmEvYXd0L1Rvb2xraXQvQmFkRGlzcGxheVRlc3QvQmFkRGlzcGxheVRlc3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRhNTRkMwotLS0gL2Rldi9udWxsCisrKyBiL2pkay90ZXN0L2phdmEvYXd0L1Rvb2xraXQvQmFkRGlzcGxheVRlc3QvQmFkRGlzcGxheVRlc3Quc2gKQEAgLTAsMCArMSw0MiBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyMKKyMgVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjCisjIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyMgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisjIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyMgMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisjCisjIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCisjIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKKyMgcXVlc3Rpb25zLgorCiske1RFU1RKQVZBfS9iaW4vamF2YWMgLWNwICR7VEVTVFNSQ30gLWQgLiAke1RFU1RTUkN9L0JhZERpc3BsYXlUZXN0LmphdmEKKworCitleHBvcnQgRElTUExBWT0KKworT1M9YHVuYW1lIC1zYAorY2FzZSAiJE9TIiBpbgorICBTdW5PUyApCisgICAgJHtURVNUSkFWQX0vYmluL2phdmEgQmFkRGlzcGxheVRlc3QKKyAgICA7OworICBMaW51eCApCisgICAgJHtURVNUSkFWQX0vYmluL2phdmEgQmFkRGlzcGxheVRlc3QKKyAgICAgOzsKKyAgKiApCisgICAgZWNobyAiVW5zdXBwb3J0ZWQgU3lzdGVtOiAke09TfSIKKyAgICBleGl0IDA7CisgICAgOzsKK2VzYWMKKworZXhpdCAkPworCmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZhL2lvL3BhdGhOYW1lcy93aW4zMi9idWc2MzQ0NjQ2LmphdmEgYi9qZGsvdGVzdC9qYXZhL2lvL3BhdGhOYW1lcy93aW4zMi9idWc2MzQ0NjQ2LmphdmEKaW5kZXggZDM5ZGQ0MC4uMzBmNWFhMiAxMDA2NDQKLS0tIGEvamRrL3Rlc3QvamF2YS9pby9wYXRoTmFtZXMvd2luMzIvYnVnNjM0NDY0Ni5qYXZhCisrKyBiL2pkay90ZXN0L2phdmEvaW8vcGF0aE5hbWVzL3dpbjMyL2J1ZzYzNDQ2NDYuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTEsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIzLDcgKzIzLDcgQEAKIAogLyogQHRlc3QKICAqIEBidWcgNjM0NDY0NgotICogQHN1bW1hcnkgdGVzdHMgdGhhdCBXaW4zMkZpbGVTeXN0ZW0uaGFzaENvZGUoKSB1c2VzCisgKiBAc3VtbWFyeSB0ZXN0cyB0aGF0IFdpbk5URmlsZVN5c3RlbS5oYXNoQ29kZSgpIHVzZXMKICAqICAgIGxvY2FsZSBpbmRlcGVuZGVudCBjYXNlIG1hcHBpbmcuCiAgKi8KIApkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YS9sYW5nL1Byb2Nlc3NCdWlsZGVyL0Jhc2ljLmphdmEgYi9qZGsvdGVzdC9qYXZhL2xhbmcvUHJvY2Vzc0J1aWxkZXIvQmFzaWMuamF2YQppbmRleCBmZjdmMDUxLi44YWQ3YmQ5IDEwMDY0NAotLS0gYS9qZGsvdGVzdC9qYXZhL2xhbmcvUHJvY2Vzc0J1aWxkZXIvQmFzaWMuamF2YQorKysgYi9qZGsvdGVzdC9qYXZhL2xhbmcvUHJvY2Vzc0J1aWxkZXIvQmFzaWMuamF2YQpAQCAtMzYsMTAgKzM2LDEyIEBACiBpbXBvcnQgc3RhdGljIGphdmEubGFuZy5Qcm9jZXNzQnVpbGRlci5SZWRpcmVjdC4qOwogCiBpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwogaW1wb3J0IGphdmEudXRpbC4qOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwogaW1wb3J0IGphdmEuc2VjdXJpdHkuKjsKK2ltcG9ydCBzdW4ubWlzYy5VbnNhZmU7CiBpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CiBpbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7CiBpbXBvcnQgc3RhdGljIGphdmEubGFuZy5TeXN0ZW0uZ2V0ZW52OwpAQCAtMTkzOCwxNyArMTk0MCwyMSBAQAogICAgICAgICAgICAgICAgIGZpbmFsIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlWzEwXTsKICAgICAgICAgICAgICAgICBmaW5hbCBQcm9jZXNzIHAgPSBuZXcgUHJvY2Vzc0J1aWxkZXIoY2hpbGRBcmdzKS5zdGFydCgpOwogICAgICAgICAgICAgICAgIGZpbmFsIENvdW50RG93bkxhdGNoIGxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworICAgICAgICAgICAgICAgIGZpbmFsIElucHV0U3RyZWFtIHM7CisgICAgICAgICAgICAgICAgc3dpdGNoIChhY3Rpb24gJiAweDEpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiBzID0gcC5nZXRJbnB1dFN0cmVhbSgpOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxOiBzID0gcC5nZXRFcnJvclN0cmVhbSgpOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGZpbmFsIFRocmVhZCB0aHJlYWQgPSBuZXcgVGhyZWFkKCkgewogICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGNoLmNvdW50RG93bigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByID0gcC5nZXRJbnB1dFN0cmVhbSgpLnJlYWQoKTsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOiByID0gcC5nZXRFcnJvclN0cmVhbSgpLnJlYWQoKTsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOiByID0gcC5nZXRJbnB1dFN0cmVhbSgpLnJlYWQoYnl0ZXMpOyBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6IHIgPSBwLmdldEVycm9yU3RyZWFtKCkucmVhZChieXRlcyk7IGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvcigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGNoLmNvdW50RG93bigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWN0aW9uICYgMHgyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDogciA9IHMucmVhZCgpOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOiByID0gcy5yZWFkKGJ5dGVzKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvcigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcXVhbCgtMSwgcik7CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeyB1bmV4cGVjdGVkKHQpOyB9fX07CkBAIC0xOTU2LDYgKzE5NjIsNDAgQEAKICAgICAgICAgICAgICAgICB0aHJlYWQuc3RhcnQoKTsKICAgICAgICAgICAgICAgICBsYXRjaC5hd2FpdCgpOwogICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMCk7CisKKyAgICAgICAgICAgICAgICBTdHJpbmcgb3MgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKTsKKyAgICAgICAgICAgICAgICBpZiAob3MuZXF1YWxzSWdub3JlQ2FzZSgiU29sYXJpcyIpIHx8CisgICAgICAgICAgICAgICAgICAgIG9zLmVxdWFsc0lnbm9yZUNhc2UoIlN1bk9TIikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgZGVmZXJyZWQ7CisgICAgICAgICAgICAgICAgICAgIENsYXNzPD8+IGMgPSBzLmdldENsYXNzKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjLmdldE5hbWUoKS5lcXVhbHMoCisgICAgICAgICAgICAgICAgICAgICAgICAiamF2YS5sYW5nLlVOSVhQcm9jZXNzJERlZmVycmVkQ2xvc2VJbnB1dFN0cmVhbSIpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZCA9IHM7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZCBkZWZlcnJlZEZpZWxkID0gcC5nZXRDbGFzcygpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldERlY2xhcmVkRmllbGQoInN0ZG91dF9pbm5lcl9zdHJlYW0iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkRmllbGQuc2V0QWNjZXNzaWJsZSh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkID0gZGVmZXJyZWRGaWVsZC5nZXQocCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgRmllbGQgdXNlQ291bnRGaWVsZCA9IGRlZmVycmVkLmdldENsYXNzKCkuCisgICAgICAgICAgICAgICAgICAgICAgICBnZXREZWNsYXJlZEZpZWxkKCJ1c2VDb3VudCIpOworICAgICAgICAgICAgICAgICAgICB1c2VDb3VudEZpZWxkLnNldEFjY2Vzc2libGUodHJ1ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHVzZUNvdW50RmllbGQuZ2V0SW50KGRlZmVycmVkKSA8PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWQueWllbGQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocyBpbnN0YW5jZW9mIEJ1ZmZlcmVkSW5wdXRTdHJlYW0pIHsKKyAgICAgICAgICAgICAgICAgICAgRmllbGQgZiA9IFVuc2FmZS5jbGFzcy5nZXREZWNsYXJlZEZpZWxkKCJ0aGVVbnNhZmUiKTsKKyAgICAgICAgICAgICAgICAgICAgZi5zZXRBY2Nlc3NpYmxlKHRydWUpOworICAgICAgICAgICAgICAgICAgICBVbnNhZmUgdW5zYWZlID0gKFVuc2FmZSlmLmdldChudWxsKTsKKworICAgICAgICAgICAgICAgICAgICB3aGlsZSAodW5zYWZlLnRyeU1vbml0b3JFbnRlcihzKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdW5zYWZlLm1vbml0b3JFeGl0KHMpOworICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHAuZGVzdHJveSgpOwogICAgICAgICAgICAgICAgIHRocmVhZC5qb2luKCk7CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZhL2xhbmcvaW52b2tlLzcxOTYxOTAvQ2xhc3NGb3JOYW1lVGVzdC5qYXZhIGIvamRrL3Rlc3QvamF2YS9sYW5nL2ludm9rZS83MTk2MTkwL0NsYXNzRm9yTmFtZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGNjYjJhCi0tLSAvZGV2L251bGwKKysrIGIvamRrL3Rlc3QvamF2YS9sYW5nL2ludm9rZS83MTk2MTkwL0NsYXNzRm9yTmFtZVRlc3QuamF2YQpAQCAtMCwwICsxLDk4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCisgKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CisgKiBxdWVzdGlvbnMuCisgKgorICovCisKKy8qKgorICogQHRlc3QKKyAqIEBidWcgNzE5NjE5MAorICogQHN1bW1hcnkgSW1wcm92ZSBtZXRob2Qgb2YgaGFuZGxpbmcgTWV0aG9kSGFuZGxlcworICoKKyAqIEBydW4gbWFpbi9vdGhlcnZtIENsYXNzRm9yTmFtZVRlc3QKKyAqLworCitpbXBvcnQgamF2YS5sYW5nLmludm9rZS4qOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCitwdWJsaWMgY2xhc3MgQ2xhc3NGb3JOYW1lVGVzdCB7CisgICAgZmluYWwgc3RhdGljIFN0cmluZyBOQU1FID0gQ2xhc3NGb3JOYW1lVGVzdC5jbGFzcy5nZXROYW1lKCk7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgeworICAgICAgICAgICAgZmluYWwgTWV0aG9kVHlwZSBtdCA9IE1ldGhvZFR5cGUubWV0aG9kVHlwZShDbGFzcy5jbGFzcywgU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgICAgIGZpbmFsIE1ldGhvZEhhbmRsZSBtaCA9IE1ldGhvZEhhbmRsZXMubG9va3VwKCkKKyAgICAgICAgICAgICAgICAgICAgLmZpbmRTdGF0aWMoQ2xhc3MuY2xhc3MsICJmb3JOYW1lIiwgbXQpOworCisgICAgICAgICAgICBDbGFzcy5mb3JOYW1lKE5BTUUpOworCisgICAgICAgICAgICBtaC5pbnZva2UoTkFNRSk7CisgICAgICAgICAgICBtaC5iaW5kVG8oTkFNRSkuaW52b2tlKCk7CisgICAgICAgICAgICBtaC5pbnZva2VXaXRoQXJndW1lbnRzKEFycmF5cy5hc0xpc3QoTkFNRSkpOworICAgICAgICAgICAgbWguaW52b2tlV2l0aEFyZ3VtZW50cyhOQU1FKTsKKyAgICAgICAgICAgIENsYXNzIGNscyA9IChDbGFzcykgbWguaW52b2tlRXhhY3QoTkFNRSk7CisgICAgICAgIH0KKworICAgICAgICB7CisgICAgICAgICAgICBmaW5hbCBNZXRob2QgZm5NZXRob2QgPSBDbGFzcy5jbGFzcy5nZXRNZXRob2QoImZvck5hbWUiLCBTdHJpbmcuY2xhc3MpOworICAgICAgICAgICAgZmluYWwgTWV0aG9kVHlwZSBtdCA9IE1ldGhvZFR5cGUubWV0aG9kVHlwZShPYmplY3QuY2xhc3MsIE9iamVjdC5jbGFzcywgT2JqZWN0W10uY2xhc3MpOworICAgICAgICAgICAgZmluYWwgTWV0aG9kSGFuZGxlIG1oID0gTWV0aG9kSGFuZGxlcy5sb29rdXAoKQorICAgICAgICAgICAgICAgICAgICAuZmluZFZpcnR1YWwoTWV0aG9kLmNsYXNzLCAiaW52b2tlIiwgbXQpCisgICAgICAgICAgICAgICAgICAgIC5iaW5kVG8oZm5NZXRob2QpOworCisgICAgICAgICAgICBmbk1ldGhvZC5pbnZva2UobnVsbCwgTkFNRSk7CisKKyAgICAgICAgICAgIG1oLmJpbmRUbyhudWxsKS5iaW5kVG8obmV3IE9iamVjdFtde05BTUV9KS5pbnZva2UoKTsKKyAgICAgICAgICAgIG1oLmludm9rZShudWxsLCBuZXcgT2JqZWN0W117TkFNRX0pOworICAgICAgICAgICAgbWguaW52b2tlV2l0aEFyZ3VtZW50cyhudWxsLCBuZXcgT2JqZWN0W117TkFNRX0pOworICAgICAgICAgICAgbWguaW52b2tlV2l0aEFyZ3VtZW50cyhBcnJheXMuYXNMaXN0KG51bGwsIG5ldyBPYmplY3RbXXtOQU1FfSkpOworICAgICAgICAgICAgT2JqZWN0IG9iaiA9IG1oLmludm9rZUV4YWN0KChPYmplY3QpIG51bGwsIG5ldyBPYmplY3RbXXtOQU1FfSk7CisgICAgICAgIH0KKworICAgICAgICB7CisgICAgICAgICAgICBmaW5hbCBNZXRob2QgZm5NZXRob2QgPSBDbGFzcy5jbGFzcy5nZXRNZXRob2QoImZvck5hbWUiLCBTdHJpbmcuY2xhc3MpOworICAgICAgICAgICAgZmluYWwgTWV0aG9kVHlwZSBtdCA9IE1ldGhvZFR5cGUubWV0aG9kVHlwZShPYmplY3QuY2xhc3MsIE9iamVjdC5jbGFzcywgT2JqZWN0W10uY2xhc3MpOworCisgICAgICAgICAgICBmaW5hbCBNZXRob2RIYW5kbGUgbWggPSBNZXRob2RIYW5kbGVzLmxvb2t1cCgpCisgICAgICAgICAgICAgICAgICAgIC5iaW5kKGZuTWV0aG9kLCAiaW52b2tlIiwgbXQpOworCisgICAgICAgICAgICBtaC5iaW5kVG8obnVsbCkuYmluZFRvKG5ldyBPYmplY3RbXXtOQU1FfSkuaW52b2tlKCk7CisgICAgICAgICAgICBtaC5pbnZva2UobnVsbCwgbmV3IE9iamVjdFtde05BTUV9KTsKKyAgICAgICAgICAgIG1oLmludm9rZVdpdGhBcmd1bWVudHMobnVsbCwgTkFNRSk7CisgICAgICAgICAgICBtaC5pbnZva2VXaXRoQXJndW1lbnRzKEFycmF5cy5hc0xpc3QobnVsbCwgTkFNRSkpOworICAgICAgICAgICAgT2JqZWN0IG9iaiA9IG1oLmludm9rZUV4YWN0KChPYmplY3QpIG51bGwsIG5ldyBPYmplY3RbXXtOQU1FfSk7CisgICAgICAgIH0KKworICAgICAgICB7CisgICAgICAgICAgICBmaW5hbCBNZXRob2QgZm5NZXRob2QgPSBDbGFzcy5jbGFzcy5nZXRNZXRob2QoImZvck5hbWUiLCBTdHJpbmcuY2xhc3MpOworICAgICAgICAgICAgZmluYWwgTWV0aG9kSGFuZGxlIG1oID0gTWV0aG9kSGFuZGxlcy5sb29rdXAoKS51bnJlZmxlY3QoZm5NZXRob2QpOworCisgICAgICAgICAgICBtaC5iaW5kVG8oTkFNRSkuaW52b2tlKCk7CisgICAgICAgICAgICBtaC5pbnZva2UoTkFNRSk7CisgICAgICAgICAgICBtaC5pbnZva2VXaXRoQXJndW1lbnRzKE5BTUUpOworICAgICAgICAgICAgbWguaW52b2tlV2l0aEFyZ3VtZW50cyhBcnJheXMuYXNMaXN0KE5BTUUpKTsKKyAgICAgICAgICAgIENsYXNzIGNscyA9IChDbGFzcykgbWguaW52b2tlRXhhY3QoTkFNRSk7CisgICAgICAgIH0KKworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRFU1QgUEFTU0VEIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YS9sYW5nL2ludm9rZS83MTk2MTkwL0dldFVuc2FmZVRlc3QuamF2YSBiL2pkay90ZXN0L2phdmEvbGFuZy9pbnZva2UvNzE5NjE5MC9HZXRVbnNhZmVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZkM2NiZAotLS0gL2Rldi9udWxsCisrKyBiL2pkay90ZXN0L2phdmEvbGFuZy9pbnZva2UvNzE5NjE5MC9HZXRVbnNhZmVUZXN0LmphdmEKQEAgLTAsMCArMSwxMTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKKyAqIHF1ZXN0aW9ucy4KKyAqCisgKi8KKworLyoqCisgKiBAdGVzdAorICogQGJ1ZyA3MTk2MTkwCisgKiBAc3VtbWFyeSBJbXByb3ZlIG1ldGhvZCBvZiBoYW5kbGluZyBNZXRob2RIYW5kbGVzCisgKgorICogQHJ1biBtYWluL290aGVydm0vcG9saWN5PWp0cmVnLnNlY3VyaXR5LnBvbGljeS9zZWN1cmU9amF2YS5sYW5nLlNlY3VyaXR5TWFuYWdlciBHZXRVbnNhZmVUZXN0CisgKi8KKworaW1wb3J0IGphdmEubGFuZy5pbnZva2UuKjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKworcHVibGljIGNsYXNzIEdldFVuc2FmZVRlc3QgeworICAgIGZpbmFsIHN0YXRpYyBTdHJpbmcgTkFNRSA9ICJzdW4ubWlzYy5VbnNhZmUiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1Rlc3RGYWlsZWQgPSBmYWxzZTsKKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZmFpbCgpIHsKKyAgICAgICAgaXNUZXN0RmFpbGVkID0gdHJ1ZTsKKyAgICAgICAgdHJ5IHsgdGhyb3cgbmV3IEV4Y2VwdGlvbigpOyB9IGNhdGNoIChUaHJvd2FibGUgZSkgeworICAgICAgICAgICAgU3RhY2tUcmFjZUVsZW1lbnQgZnJhbWUgPSBlLmdldFN0YWNrVHJhY2UoKVsxXTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCJGYWlsZWQgYXQgJXM6JWRcbiIsIGZyYW1lLmdldEZpbGVOYW1lKCksIGZyYW1lLmdldExpbmVOdW1iZXIoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgeworICAgICAgICAgICAgZmluYWwgTWV0aG9kVHlwZSBtdCA9IE1ldGhvZFR5cGUubWV0aG9kVHlwZShDbGFzcy5jbGFzcywgU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgICAgIGZpbmFsIE1ldGhvZEhhbmRsZSBtaCA9IE1ldGhvZEhhbmRsZXMubG9va3VwKCkKKyAgICAgICAgICAgICAgICAgICAgLmZpbmRTdGF0aWMoQ2xhc3MuY2xhc3MsICJmb3JOYW1lIiwgbXQpOworCisgICAgICAgICAgICB0cnkgeyBDbGFzcy5mb3JOYW1lKE5BTUUpOyAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsKCk7IH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7fQorCisgICAgICAgICAgICB0cnkgeyBtaC5pbnZva2UoTkFNRSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsKCk7IH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7fQorICAgICAgICAgICAgdHJ5IHsgbWguYmluZFRvKE5BTUUpLmludm9rZSgpOyAgICAgICAgICAgICAgICAgICAgZmFpbCgpOyB9IGNhdGNoIChUaHJvd2FibGUgZSkge30KKyAgICAgICAgICAgIHRyeSB7IG1oLmludm9rZVdpdGhBcmd1bWVudHMoQXJyYXlzLmFzTGlzdChOQU1FKSk7IGZhaWwoKTsgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHt9CisgICAgICAgICAgICB0cnkgeyBtaC5pbnZva2VXaXRoQXJndW1lbnRzKE5BTUUpOyAgICAgICAgICAgICAgICBmYWlsKCk7IH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7fQorICAgICAgICAgICAgdHJ5IHsgQ2xhc3MgY2xzID0gKENsYXNzKSBtaC5pbnZva2VFeGFjdChOQU1FKTsgICAgZmFpbCgpOyB9IGNhdGNoIChUaHJvd2FibGUgZSkge30KKyAgICAgICAgfQorCisgICAgICAgIHsKKyAgICAgICAgICAgIGZpbmFsIE1ldGhvZCBmbk1ldGhvZCA9IENsYXNzLmNsYXNzLmdldE1ldGhvZCgiZm9yTmFtZSIsIFN0cmluZy5jbGFzcyk7CisgICAgICAgICAgICBmaW5hbCBNZXRob2RUeXBlIG10ID0gTWV0aG9kVHlwZS5tZXRob2RUeXBlKE9iamVjdC5jbGFzcywgT2JqZWN0LmNsYXNzLCBPYmplY3RbXS5jbGFzcyk7CisgICAgICAgICAgICBmaW5hbCBNZXRob2RIYW5kbGUgbWggPSBNZXRob2RIYW5kbGVzLmxvb2t1cCgpCisgICAgICAgICAgICAgICAgICAgIC5maW5kVmlydHVhbChNZXRob2QuY2xhc3MsICJpbnZva2UiLCBtdCkKKyAgICAgICAgICAgICAgICAgICAgLmJpbmRUbyhmbk1ldGhvZCk7CisKKyAgICAgICAgICAgIHRyeSB7IGZuTWV0aG9kLmludm9rZShudWxsLCBOQU1FKTsgZmFpbCgpOyB9IGNhdGNoIChUaHJvd2FibGUgZSkge30KKworICAgICAgICAgICAgdHJ5IHsgbWguYmluZFRvKG51bGwpLmJpbmRUbyhuZXcgT2JqZWN0W117TkFNRX0pLmludm9rZSgpOyAgICAgICAgICAgICBmYWlsKCk7IH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7fQorICAgICAgICAgICAgdHJ5IHsgbWguaW52b2tlKG51bGwsIG5ldyBPYmplY3RbXXtOQU1FfSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsKCk7IH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7fQorICAgICAgICAgICAgdHJ5IHsgbWguaW52b2tlV2l0aEFyZ3VtZW50cyhudWxsLCBuZXcgT2JqZWN0W117TkFNRX0pOyAgICAgICAgICAgICAgICBmYWlsKCk7IH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7fQorICAgICAgICAgICAgdHJ5IHsgbWguaW52b2tlV2l0aEFyZ3VtZW50cyhBcnJheXMuYXNMaXN0KG51bGwsIG5ldyBPYmplY3RbXXtOQU1FfSkpOyBmYWlsKCk7IH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7fQorICAgICAgICAgICAgdHJ5IHsgT2JqZWN0IG9iaiA9IG1oLmludm9rZUV4YWN0KChPYmplY3QpIG51bGwsIG5ldyBPYmplY3RbXXtOQU1FfSk7ICBmYWlsKCk7IH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7fQorICAgICAgICB9CisKKyAgICAgICAgeworICAgICAgICAgICAgZmluYWwgTWV0aG9kIGZuTWV0aG9kID0gQ2xhc3MuY2xhc3MuZ2V0TWV0aG9kKCJmb3JOYW1lIiwgU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgICAgIGZpbmFsIE1ldGhvZFR5cGUgbXQgPSBNZXRob2RUeXBlLm1ldGhvZFR5cGUoT2JqZWN0LmNsYXNzLCBPYmplY3QuY2xhc3MsIE9iamVjdFtdLmNsYXNzKTsKKworICAgICAgICAgICAgZmluYWwgTWV0aG9kSGFuZGxlIG1oID0gTWV0aG9kSGFuZGxlcy5sb29rdXAoKS5iaW5kKGZuTWV0aG9kLCAiaW52b2tlIiwgbXQpOworCisgICAgICAgICAgICB0cnkgeyBtaC5iaW5kVG8obnVsbCkuYmluZFRvKG5ldyBPYmplY3RbXXtOQU1FfSkuaW52b2tlKCk7ICAgICAgICAgICAgZmFpbCgpOyB9IGNhdGNoIChUaHJvd2FibGUgZSkge30KKyAgICAgICAgICAgIHRyeSB7IG1oLmludm9rZShudWxsLCBuZXcgT2JqZWN0W117TkFNRX0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsKCk7IH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7fQorICAgICAgICAgICAgdHJ5IHsgbWguaW52b2tlV2l0aEFyZ3VtZW50cyhudWxsLCBOQU1FKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwoKTsgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHt9CisgICAgICAgICAgICB0cnkgeyBtaC5pbnZva2VXaXRoQXJndW1lbnRzKEFycmF5cy5hc0xpc3QobnVsbCwgTkFNRSkpOyAgICAgICAgICAgICAgZmFpbCgpOyB9IGNhdGNoIChUaHJvd2FibGUgZSkge30KKyAgICAgICAgICAgIHRyeSB7IE9iamVjdCBvYmogPSBtaC5pbnZva2VFeGFjdCgoT2JqZWN0KSBudWxsLCBuZXcgT2JqZWN0W117TkFNRX0pOyBmYWlsKCk7IH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7fQorICAgICAgICB9CisKKyAgICAgICAgeworICAgICAgICAgICAgZmluYWwgTWV0aG9kIGZuTWV0aG9kID0gQ2xhc3MuY2xhc3MuZ2V0TWV0aG9kKCJmb3JOYW1lIiwgU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgICAgIGZpbmFsIE1ldGhvZEhhbmRsZSBtaCA9IE1ldGhvZEhhbmRsZXMubG9va3VwKCkudW5yZWZsZWN0KGZuTWV0aG9kKTsKKworICAgICAgICAgICAgdHJ5IHsgbWguYmluZFRvKE5BTUUpLmludm9rZSgpOyAgICAgICAgICAgICAgICAgICAgZmFpbCgpOyB9IGNhdGNoIChUaHJvd2FibGUgZSkge30KKyAgICAgICAgICAgIHRyeSB7IG1oLmludm9rZShOQU1FKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwoKTsgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHt9CisgICAgICAgICAgICB0cnkgeyBtaC5pbnZva2VXaXRoQXJndW1lbnRzKE5BTUUpOyAgICAgICAgICAgICAgICBmYWlsKCk7IH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7fQorICAgICAgICAgICAgdHJ5IHsgbWguaW52b2tlV2l0aEFyZ3VtZW50cyhBcnJheXMuYXNMaXN0KE5BTUUpKTsgZmFpbCgpOyB9IGNhdGNoIChUaHJvd2FibGUgZSkge30KKyAgICAgICAgICAgIHRyeSB7IENsYXNzIGNscyA9IChDbGFzcykgbWguaW52b2tlRXhhY3QoTkFNRSk7ICAgIGZhaWwoKTsgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHt9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWlzVGVzdEZhaWxlZCkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJURVNUIFBBU1NFRCIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJURVNUIEZBSUxFRCIpOworICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZhL2xhbmcvaW52b2tlLzcxOTYxOTAvTUhQcm94eVRlc3QuamF2YSBiL2pkay90ZXN0L2phdmEvbGFuZy9pbnZva2UvNzE5NjE5MC9NSFByb3h5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMDdmMzkKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvdGVzdC9qYXZhL2xhbmcvaW52b2tlLzcxOTYxOTAvTUhQcm94eVRlc3QuamF2YQpAQCAtMCwwICsxLDE4MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQorICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQorICogcXVlc3Rpb25zLgorICoKKyAqLworCisvKioKKyAqIEB0ZXN0CisgKiBAYnVnIDcxOTYxOTAKKyAqIEBzdW1tYXJ5IEltcHJvdmUgbWV0aG9kIG9mIGhhbmRsaW5nIE1ldGhvZEhhbmRsZXMKKyAqCisgKiBAcnVuIG1haW4vb3RoZXJ2bSBNSFByb3h5VGVzdAorICovCisKK2ltcG9ydCBqYXZhLmxhbmcuaW52b2tlLio7CitpbXBvcnQgamF2YS5zZWN1cml0eS4qOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuaW52b2tlLk1ldGhvZEhhbmRsZXMuKjsKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmludm9rZS5NZXRob2RUeXBlLio7CisKK3B1YmxpYyBjbGFzcyBNSFByb3h5VGVzdCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3M8Pz4gQ19VbnNhZmU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWV0aG9kSGFuZGxlIE1IX2dldFVuc2FmZTsKKyAgICBzdGF0aWMgeworICAgICAgICAvLyBEbyB0aGVzZSBiZWZvcmUgdGhlcmUgaXMgYSBTTSBpbnN0YWxsZWQuCisgICAgICAgIENfVW5zYWZlID0gc3VuLm1pc2MuVW5zYWZlLmNsYXNzOyAgLy8gRVhQRUNUIEEgV0FSTklORyBPTiBUSElTIExJTkUKKyAgICAgICAgTG9va3VwIGxvb2t1cCA9IGxvb2t1cCgpOworICAgICAgICBNZXRob2RIYW5kbGUgZ3VtaCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBndW1oID0gbG9va3VwLmZpbmRTdGF0aWMoQ19VbnNhZmUsICJnZXRVbnNhZmUiLCBtZXRob2RUeXBlKENfVW5zYWZlKSk7CisgICAgICAgIH0gY2F0Y2ggKFJlZmxlY3RpdmVPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGV4LnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIE1IX2dldFVuc2FmZSA9IGd1bWg7CisgICAgICAgIC8vIFRyeSBzb21lIGRpZmZlcmVudCBsb29rdXBzOgorICAgICAgICB0cnkgeworICAgICAgICAgICAgbG9va3VwLmluKE9iamVjdC5jbGFzcykuZmluZFN0YXRpYyhDX1Vuc2FmZSwgImdldFVuc2FmZSIsIG1ldGhvZFR5cGUoQ19VbnNhZmUpKTsKKyAgICAgICAgfSBjYXRjaCAoUmVmbGVjdGl2ZU9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoZXgudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgbG9va3VwID0gbG9va3VwKCkuaW4oQ19VbnNhZmUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbG9va3VwLmluKENfVW5zYWZlKS5maW5kU3RhdGljKENfVW5zYWZlLCAiZ2V0VW5zYWZlIiwgbWV0aG9kVHlwZShDX1Vuc2FmZSkpOworICAgICAgICB9IGNhdGNoIChSZWZsZWN0aXZlT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihleC50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBTeXN0ZW0uc2V0U2VjdXJpdHlNYW5hZ2VyKG5ldyBTZWN1cml0eU1hbmFnZXIoKSk7CisgICAgICAgIExvb2t1cCBsb29rdXAgPSBsb29rdXAoKTsKKyAgICAgICAgdGVzdEJhc2ljKGxvb2t1cCk7CisgICAgICAgIHRlc3REb1ByaXYobG9va3VwKTsKKyAgICAgICAgdGVzdFNldFZhcigpOworICAgICAgICBMb29rdXAgbDIgPSBsb29rdXAuaW4oT2JqZWN0LmNsYXNzKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI9PT0gIitsMik7CisgICAgICAgIHRlc3RCYXNpYyhsMik7CisgICAgICAgIHRlc3REb1ByaXYobDIpOworICAgICAgICBMb29rdXAgbDMgPSBsb29rdXAuaW4oQ19VbnNhZmUpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIj09PSAiK2wzKTsKKyAgICAgICAgdGVzdEJhc2ljKGwzKTsKKyAgICAgICAgdGVzdERvUHJpdihsMyk7CisgICAgICAgIGlmIChmYWlsdXJlICE9IG51bGwpCisgICAgICAgICAgICB0aHJvdyBmYWlsdXJlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFRocm93YWJsZSBmYWlsdXJlOworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZmFpbChUaHJvd2FibGUgZXgpIHsKKyAgICAgICAgaWYgKGZhaWx1cmUgPT0gbnVsbCkKKyAgICAgICAgICAgIGZhaWx1cmUgPSBleDsKKyAgICAgICAgU3RhY2tUcmFjZUVsZW1lbnQgZnJhbWUgPSBuZXcgRXhjZXB0aW9uKCkuZ2V0U3RhY2tUcmFjZSgpWzFdOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiRmFpbGVkIGF0ICVzOiVkOiAlc1xuIiwgZnJhbWUuZ2V0RmlsZU5hbWUoKSwgZnJhbWUuZ2V0TGluZU51bWJlcigpLCBleCk7CisgICAgfQorICAgIHByaXZhdGUgc3RhdGljIHZvaWQgb2soVGhyb3dhYmxlIGV4KSB7CisgICAgICAgIFN0YWNrVHJhY2VFbGVtZW50IGZyYW1lID0gbmV3IEV4Y2VwdGlvbigpLmdldFN0YWNrVHJhY2UoKVsxXTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIk9LIGF0ICVzOiVkOiAlc1xuIiwgZnJhbWUuZ2V0RmlsZU5hbWUoKSwgZnJhbWUuZ2V0TGluZU51bWJlcigpLCBleCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB0ZXN0QmFzaWMoTG9va3VwIGxvb2t1cCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIC8vIFZlcmlmeSB0aGF0IHdlIGNhbid0IGdldCB0byB0aGlzIGd1eSB1bmRlciB0aGUgU006CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBNZXRob2RIYW5kbGUgYmFkbWggPSBsb29rdXAuZmluZFN0YXRpYyhDX1Vuc2FmZSwgImdldFVuc2FmZSIsIG1ldGhvZFR5cGUoQ19VbnNhZmUpKTsKKyAgICAgICAgICAgIGFzc2VydChiYWRtaC50eXBlKCkgPT0gbWV0aG9kVHlwZShDX1Vuc2FmZSkpOworICAgICAgICAgICAgYmFkbWggPSBiYWRtaC5hc1R5cGUoYmFkbWgudHlwZSgpLmdlbmVyaWMoKSk7CisgICAgICAgICAgICBPYmplY3QgdSA9IENfVW5zYWZlLmNhc3QoYmFkbWguaW52b2tlRXhhY3QoKSk7CisgICAgICAgICAgICBhc3NlcnQoQ19VbnNhZmUuaXNJbnN0YW5jZSh1KSk7CisgICAgICAgICAgICBmYWlsKG5ldyBBc3NlcnRpb25FcnJvcigiZ290IG1oIHRvIGdldFVuc2FmZSEiKSk7CisgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBvayhleCk7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE9iamVjdCB1ID0gTUhfZ2V0VW5zYWZlLmludm9rZVdpdGhBcmd1bWVudHMoKTsKKyAgICAgICAgICAgIGFzc2VydChDX1Vuc2FmZS5pc0luc3RhbmNlKHUpKTsKKyAgICAgICAgICAgIGZhaWwobmV3IEFzc2VydGlvbkVycm9yKCJnb3QgdGhlIFVuc2FmZSBvYmplY3QhIChNSCBpbnZva2UpIikpOworICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgb2soZXgpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBNZXRob2RIYW5kbGUgbWggPSBNSF9nZXRVbnNhZmU7CisgICAgICAgICAgICBtaCA9IG1oLmFzVHlwZShtaC50eXBlKCkuZ2VuZXJpYygpKTsKKyAgICAgICAgICAgIG1oID0gZm9sZEFyZ3VtZW50cyhpZGVudGl0eShPYmplY3QuY2xhc3MpLCBtaCk7CisgICAgICAgICAgICBtaCA9IGZpbHRlclJldHVyblZhbHVlKG1oLCBpZGVudGl0eShPYmplY3QuY2xhc3MpKTsKKyAgICAgICAgICAgIE9iamVjdCB1ID0gbWguaW52b2tlRXhhY3QoKTsKKyAgICAgICAgICAgIGFzc2VydChDX1Vuc2FmZS5pc0luc3RhbmNlKHUpKTsKKyAgICAgICAgICAgIGZhaWwobmV3IEFzc2VydGlvbkVycm9yKCJnb3QgdGhlIFVuc2FmZSBvYmplY3QhIChNSCBpbnZva2VXaXRoQXJndW1lbnRzKSIpKTsKKyAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIG9rKGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdGVzdERvUHJpdihMb29rdXAgbG9va3VwKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgUHJpdmlsZWdlZEFjdGlvbiBwcml2QWN0ID0gTWV0aG9kSGFuZGxlUHJveGllcy5hc0ludGVyZmFjZUluc3RhbmNlKFByaXZpbGVnZWRBY3Rpb24uY2xhc3MsIE1IX2dldFVuc2FmZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBPYmplY3QgdSA9IEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKHByaXZBY3QpOworICAgICAgICAgICAgYXNzZXJ0KENfVW5zYWZlLmlzSW5zdGFuY2UodSkpOworICAgICAgICAgICAgZmFpbChuZXcgQXNzZXJ0aW9uRXJyb3IoImdvdCB0aGUgVW5zYWZlIG9iamVjdCEgKHN0YXRpYyBkb1ByaXYpIikpOworICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgb2soZXgpOworICAgICAgICB9CisgICAgICAgIE1ldGhvZEhhbmRsZSBNSF9kb1ByaXYgPSBsb29rdXAuZmluZFN0YXRpYyhBY2Nlc3NDb250cm9sbGVyLmNsYXNzLCAiZG9Qcml2aWxlZ2VkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZFR5cGUoT2JqZWN0LmNsYXNzLCBQcml2aWxlZ2VkQWN0aW9uLmNsYXNzKSk7CisgICAgICAgIE1IX2RvUHJpdiA9IE1IX2RvUHJpdi5iaW5kVG8ocHJpdkFjdCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBPYmplY3QgdSA9IE1IX2RvUHJpdi5pbnZva2UoKTsKKyAgICAgICAgICAgIGFzc2VydChDX1Vuc2FmZS5pc0luc3RhbmNlKHUpKTsKKyAgICAgICAgICAgIGZhaWwobmV3IEFzc2VydGlvbkVycm9yKCJnb3QgdGhlIFVuc2FmZSBvYmplY3QhIChNSCArIGRvUHJpdikiKSk7CisgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBvayhleCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gdHJ5IG9uZSBtb3JlIGxheWVyIG9mIGluZGlyZWN0aW9uOgorICAgICAgICBSdW5uYWJsZSByYmwgPSBNZXRob2RIYW5kbGVQcm94aWVzLmFzSW50ZXJmYWNlSW5zdGFuY2UoUnVubmFibGUuY2xhc3MsIE1IX2RvUHJpdik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByYmwucnVuKCk7CisgICAgICAgICAgICBmYWlsKG5ldyBBc3NlcnRpb25FcnJvcigiZ290IHRoZSBVbnNhZmUgb2JqZWN0ISAoUnVubmFibGUgKyBNSCArIGRvUHJpdikiKSk7CisgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBvayhleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHRlc3RTZXRWYXIoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgeworICAgICAgICAgICAgLy8gVGVzdCB0aGUgYm94IHBhdHRlcm46CisgICAgICAgICAgICBPYmplY3RbXSBib3ggPSBuZXcgT2JqZWN0WzFdOworICAgICAgICAgICAgTWV0aG9kSGFuZGxlIE1IX2dldEZvbyA9IGlkZW50aXR5KE9iamVjdC5jbGFzcykuYmluZFRvKCJmb28iKTsKKyAgICAgICAgICAgIE1ldGhvZEhhbmRsZSBNSF9zdG9yZVRvQm94ID0gaW5zZXJ0QXJndW1lbnRzKGFycmF5RWxlbWVudFNldHRlcihPYmplY3RbXS5jbGFzcyksIDAsIGJveCwgMCk7CisgICAgICAgICAgICBNZXRob2RIYW5kbGUgbWggPSBmaWx0ZXJSZXR1cm5WYWx1ZShNSF9nZXRGb28sIE1IX3N0b3JlVG9Cb3gpOworICAgICAgICAgICAgbWguaW52b2tlRXhhY3QoKTsKKyAgICAgICAgICAgIGFzc2VydChib3hbMF0gPT0gImZvbyIpOworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIE9iamVjdFtdIGJveCA9IG5ldyBPYmplY3RbMV07CisgICAgICAgICAgICBNZXRob2RIYW5kbGUgTUhfc3RvcmVUb0JveCA9IGluc2VydEFyZ3VtZW50cyhhcnJheUVsZW1lbnRTZXR0ZXIoT2JqZWN0W10uY2xhc3MpLCAwLCBib3gsIDApOworICAgICAgICAgICAgTWV0aG9kSGFuZGxlIG1oID0gZmlsdGVyUmV0dXJuVmFsdWUoTUhfZ2V0VW5zYWZlLmFzVHlwZShNSF9nZXRVbnNhZmUudHlwZSgpLmdlbmVyaWMoKSksIE1IX3N0b3JlVG9Cb3gpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtaC5pbnZva2VFeGFjdCgpOworICAgICAgICAgICAgICAgIE9iamVjdCB1ID0gYm94WzBdOworICAgICAgICAgICAgICAgIGFzc2VydChDX1Vuc2FmZS5pc0luc3RhbmNlKHUpKTsKKyAgICAgICAgICAgICAgICBmYWlsKG5ldyBBc3NlcnRpb25FcnJvcigiZ290IHRoZSBVbnNhZmUgb2JqZWN0ISAoTUggKyBzZXRFbGVtZW50KSIpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgb2soZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YS9sYW5nL2ludm9rZS83MTk2MTkwL2p0cmVnLnNlY3VyaXR5LnBvbGljeSBiL2pkay90ZXN0L2phdmEvbGFuZy9pbnZva2UvNzE5NjE5MC9qdHJlZy5zZWN1cml0eS5wb2xpY3kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMyYzdhZgotLS0gL2Rldi9udWxsCisrKyBiL2pkay90ZXN0L2phdmEvbGFuZy9pbnZva2UvNzE5NjE5MC9qdHJlZy5zZWN1cml0eS5wb2xpY3kKQEAgLTAsMCArMSw5IEBACisvKgorICogc2VjdXJpdHkgcG9saWN5IHVzZWQgYnkgdGhlIHRlc3QgcHJvY2VzcworICogbXVzdCBhbGxvdyBmaWxlIHJlYWRzIHNvIHRoYXQganRyZWcgaXRzZWxmIGNhbiBydW4KKyAqLworCitncmFudCB7CisgIC8vIHN0YW5kYXJkIHRlc3QgYWN0aXZhdGlvbiBwZXJtaXNzaW9ucworICBwZXJtaXNzaW9uIGphdmEuaW8uRmlsZVBlcm1pc3Npb24gIioiLCAicmVhZCI7Cit9OwpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YS9sYW5nL3JlZi9CYXNpYy5qYXZhIGIvamRrL3Rlc3QvamF2YS9sYW5nL3JlZi9CYXNpYy5qYXZhCmluZGV4IDRhODg1ZDguLjEwMzEzYTQgMTAwNjQ0Ci0tLSBhL2pkay90ZXN0L2phdmEvbGFuZy9yZWYvQmFzaWMuamF2YQorKysgYi9qZGsvdGVzdC9qYXZhL2xhbmcvcmVmL0Jhc2ljLmphdmEKQEAgLTEwNSw2ICsxMDUsNyBAQAogICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJHQyAiICsgaSk7CiAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTApOwogICAgICAgICAgICAgU3lzdGVtLmdjKCk7CisgICAgICAgICAgICBTeXN0ZW0ucnVuRmluYWxpemF0aW9uKCk7CiAKICAgICAgICAgICAgIHNob3dSZWZlcmVuY2VzKCk7CiAgICAgICAgICAgICB3aGlsZSAoKHIgPSBxMi5wb2xsKCkpICE9IG51bGwpIHsKZGlmZiAtLWdpdCBhL2pkay90ZXN0L2phdmEvbmV0L1NvY2tldC9Tb2NrZXRHcm93dGguamF2YSBiL2pkay90ZXN0L2phdmEvbmV0L1NvY2tldC9Tb2NrZXRHcm93dGguamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjkwZjgxCi0tLSAvZGV2L251bGwKKysrIGIvamRrL3Rlc3QvamF2YS9uZXQvU29ja2V0L1NvY2tldEdyb3d0aC5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKKyAqIHF1ZXN0aW9ucy4KKyAqLworCisvKgorICogQHRlc3QKKyAqIEBidWcgNzE4MTc5MworICogQHN1bW1hcnkgZ2V0T3V0cHV0U3RyZWFtIGNyZWF0ZSBzdHJlYW1zIHRoYXQgY2Fubm90IGJlIEdDJ2VkIHVudGlsIFNvY2tldCBpcyBjbG9zZWQKKyAqIEBydW4gbWFpbi9vdGhlcnZtIC1YbXgzMm0gU29ja2V0R3Jvd3RoCisgKi8KKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuU2VydmVyU29ja2V0OworaW1wb3J0IGphdmEubmV0LlNvY2tldDsKKworcHVibGljIGNsYXNzIFNvY2tldEdyb3d0aCB7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIHRyeSAoU2VydmVyU29ja2V0IHNzID0gbmV3IFNlcnZlclNvY2tldCgwKSkgeworICAgICAgICAgICAgdHJ5IChTb2NrZXQgcyA9IG5ldyBTb2NrZXQoImxvY2FsaG9zdCIsIHNzLmdldExvY2FsUG9ydCgpKTsKKyAgICAgICAgICAgICAgICAgICAgU29ja2V0IHBlZXIgPSBzcy5hY2NlcHQoKSkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTwxMDAwMDAwOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gYnVnZ3kgSkRLIHdpbGwgcnVuIG91dCBvZiBtZW1vcnkgaW4gdGhpcyBsb29wCisgICAgICAgICAgICAgICAgICAgIHMuZ2V0T3V0cHV0U3RyZWFtKCk7CisgICAgICAgICAgICAgICAgICAgIC8vIHRlc3QgSW5wdXRTdHJlYW0gYWxzbyB3aGlsZSB3ZSdyZSBoZXJlCisgICAgICAgICAgICAgICAgICAgIHMuZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGkgJSAxMDAwMDAgPT0gMCkgU3lzdGVtLm91dC5wcmludGxuKGkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2pkay90ZXN0L2phdmEvbmV0L1VSTC9UZXN0LmphdmEgYi9qZGsvdGVzdC9qYXZhL25ldC9VUkwvVGVzdC5qYXZhCmluZGV4IDU4Yzg4MTguLjVhMDkwOWUgMTAwNjQ0Ci0tLSBhL2pkay90ZXN0L2phdmEvbmV0L1VSTC9UZXN0LmphdmEKKysrIGIvamRrL3Rlc3QvamF2YS9uZXQvVVJML1Rlc3QuamF2YQpAQCAtMzIyLDEwICszMjIsNiBAQAogICAgICAgICB0ZXN0KCJmdHA6Ly9mdHAuaXMuY28uemEvcmZjL3JmYzE4MDgudHh0IikKICAgICAgICAgICAgIC5zKCJmdHAiKS5oKCJmdHAuaXMuY28uemEiKS5wKCIvcmZjL3JmYzE4MDgudHh0IikueigpOwogCi0gICAgICAgIHRlc3QoImdvcGhlcjovL3NwaW5hbHRhcC5taWNyby51bW4uZWR1LzAwL1dlYXRoZXIvQ2FsaWZvcm5pYS9Mb3MlMjBBbmdlbGVzIikKLSAgICAgICAgICAgIC5zKCJnb3BoZXIiKS5oKCJzcGluYWx0YXAubWljcm8udW1uLmVkdSIpCi0gICAgICAgICAgICAucCgiLzAwL1dlYXRoZXIvQ2FsaWZvcm5pYS9Mb3MlMjBBbmdlbGVzIikueigpOwotCiAgICAgICAgIHRlc3QoImh0dHA6Ly93d3cubWF0aC51aW8ubm8vZmFxL2NvbXByZXNzaW9uLWZhcS9wYXJ0MS5odG1sIikKICAgICAgICAgICAgIC5zKCJodHRwIikuaCgid3d3Lm1hdGgudWlvLm5vIikucCgiL2ZhcS9jb21wcmVzc2lvbi1mYXEvcGFydDEuaHRtbCIpLnooKTsKIApkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YS91dGlsL0xvY2FsZS9Mb2NhbGVQcm92aWRlcnMuamF2YSBiL2pkay90ZXN0L2phdmEvdXRpbC9Mb2NhbGUvTG9jYWxlUHJvdmlkZXJzLmphdmEKaW5kZXggOThhOTk5Yi4uNmJjNDk5ZCAxMDA2NDQKLS0tIGEvamRrL3Rlc3QvamF2YS91dGlsL0xvY2FsZS9Mb2NhbGVQcm92aWRlcnMuamF2YQorKysgYi9qZGsvdGVzdC9qYXZhL3V0aWwvTG9jYWxlL0xvY2FsZVByb3ZpZGVycy5qYXZhCkBAIC00Nyw2ICs0NywxMCBAQAogICAgICAgICAgICAgICAgIGJ1ZzcxOTg4MzRUZXN0KCk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKKyAgICAgICAgICAgIGNhc2UgInR6TmFtZVRlc3QiOgorICAgICAgICAgICAgICAgIHR6TmFtZVRlc3QoYXJnc1sxXSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRlc3QgbWV0aG9kICciK21ldGhvZE5hbWUrIicgbm90IGZvdW5kLiIpOwogICAgICAgICB9CkBAIC04MSw0ICs4NSwxMiBAQAogICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJXaW5kb3dzIEhPU1QgbG9jYWxlIGFkYXB0ZXIgbm90IGZvdW5kLiBJZ25vcmluZyB0aGlzIHRlc3QuIik7CiAgICAgICAgIH0KICAgICB9CisKKyAgICBzdGF0aWMgdm9pZCB0ek5hbWVUZXN0KFN0cmluZyBpZCkgeworICAgICAgICBUaW1lWm9uZSB0eiA9IFRpbWVab25lLmdldFRpbWVab25lKGlkKTsKKyAgICAgICAgU3RyaW5nIHR6TmFtZSA9IHR6LmdldERpc3BsYXlOYW1lKGZhbHNlLCBUaW1lWm9uZS5TSE9SVCwgTG9jYWxlLlVTKTsKKyAgICAgICAgaWYgKHR6TmFtZS5zdGFydHNXaXRoKCJHTVQiKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkpSRSdzIGxvY2FsaXplZCB0aW1lIHpvbmUgbmFtZSBmb3IgIitpZCsiIGNvdWxkIG5vdCBiZSByZXRyaWV2ZWQuIFJldHVybmVkIG5hbWUgd2FzOiAiK3R6TmFtZSk7CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZhL3V0aWwvTG9jYWxlL0xvY2FsZVByb3ZpZGVycy5zaCBiL2pkay90ZXN0L2phdmEvdXRpbC9Mb2NhbGUvTG9jYWxlUHJvdmlkZXJzLnNoCmluZGV4IDcwM2QxZjAuLmFiODVlZTcgMTAwNjQ0Ci0tLSBhL2pkay90ZXN0L2phdmEvdXRpbC9Mb2NhbGUvTG9jYWxlUHJvdmlkZXJzLnNoCisrKyBiL2pkay90ZXN0L2phdmEvdXRpbC9Mb2NhbGUvTG9jYWxlUHJvdmlkZXJzLnNoCkBAIC0yMyw3ICsyMyw3IEBACiAjIS9iaW4vc2gKICMKICMgQHRlc3QKLSMgQGJ1ZyA2MzM2ODg1IDcxOTY3OTkgNzE5NzU3MyA3MTk4ODM0CisjIEBidWcgNjMzNjg4NSA3MTk2Nzk5IDcxOTc1NzMgNzE5ODgzNCA4MDAwMjQ1IDgwMDA2MTUKICMgQHN1bW1hcnkgdGVzdHMgZm9yICJqYXZhLmxvY2FsZS5wcm92aWRlcnMiIHN5c3RlbSBwcm9wZXJ0eQogIyBAY29tcGlsZSAtWERpZ25vcmUuc3ltYm9sLmZpbGUgTG9jYWxlUHJvdmlkZXJzLmphdmEKICMgQHJ1biBzaGVsbC90aW1lb3V0PTYwMCBMb2NhbGVQcm92aWRlcnMuc2gKQEAgLTY1LDYgKzY1LDM2IEBACiAgICAgOzsKIGVzYWMKIAorIyBjcmVhdGUgYW4gU1BJIGltcGxlbWVudGF0aW9uCittaygpIHsKKyAgZD1gZGlybmFtZSAkMWAKKyAgaWYgWyAhIC1kICRkIF07IHRoZW4gbWtkaXIgLXAgJGQ7IGZpCisgIGNhdCAtID4kMQorfQorCitTUElESVI9JHtURVNUQ0xBU1NFU30ke0ZTfXNwaQorcm0gLXJmICR7U1BJRElSfQorbWsgJHtTUElESVJ9JHtGU31zcmMke0ZTfXR6bnAuamF2YSA8PCBFT0YKK2ltcG9ydCBqYXZhLnV0aWwuc3BpLlRpbWVab25lTmFtZVByb3ZpZGVyOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CisKK3B1YmxpYyBjbGFzcyB0em5wIGV4dGVuZHMgVGltZVpvbmVOYW1lUHJvdmlkZXIgeworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoU3RyaW5nIElELCBib29sZWFuIGRheWxpZ2h0LCBpbnQgc3R5bGUsIExvY2FsZSBsb2NhbGUpIHsKKyAgICAgICAgcmV0dXJuICJ0em5wIjsKKyAgICB9CisKKyAgICBwdWJsaWMgTG9jYWxlW10gZ2V0QXZhaWxhYmxlTG9jYWxlcygpIHsKKyAgICAgICAgTG9jYWxlW10gbG9jYWxlcyA9IHtMb2NhbGUuR0VSTUFOLCBMb2NhbGUuVVMsIExvY2FsZS5KQVBBTkVTRSwgTG9jYWxlLkNISU5FU0V9OworICAgICAgICByZXR1cm4gbG9jYWxlczsKKyAgICB9Cit9CitFT0YKK21rICR7U1BJRElSfSR7RlN9ZGVzdCR7RlN9TUVUQS1JTkYke0ZTfXNlcnZpY2VzJHtGU31qYXZhLnV0aWwuc3BpLlRpbWVab25lTmFtZVByb3ZpZGVyIDw8IEVPRgordHpucAorRU9GCiske1RFU1RKQVZBfSR7RlN9YmluJHtGU31qYXZhYyAtZCAke1NQSURJUn0ke0ZTfWRlc3QgJHtTUElESVJ9JHtGU31zcmMke0ZTfXR6bnAuamF2YQorJHtURVNUSkFWQX0ke0ZTfWJpbiR7RlN9amFyIGN2ZiAke1NQSURJUn0ke0ZTfXR6bnAuamFyIC1DICR7U1BJRElSfSR7RlN9ZGVzdCAuCisKICMgZ2V0IHRoZSBwbGF0Zm9ybSBkZWZhdWx0IGxvY2FsZXMKIFBMQVRERUY9YCR7VEVTVEpBVkF9JHtGU31iaW4ke0ZTfWphdmEgLWNsYXNzcGF0aCAke1RFU1RDTEFTU0VTfSBMb2NhbGVQcm92aWRlcnMgZ2V0UGxhdGZvcm1Mb2NhbGUgZGlzcGxheWAKIERFRkxBTkc9YGVjaG8gJHtQTEFUREVGfSB8IHNlZCAtZSAicy8sLiovLyJgCkBAIC0xOTksNCArMjI5LDIwIEBACiBQQVJBTTM9CiBydW5UZXN0CiAKKyMgdGVzdGluZyA4MDAwMjQ1IGZpeC4KK01FVEhPRE5BTUU9dHpOYW1lVGVzdAorUFJFRkxJU1Q9IkpSRSAtRGphdmEuZXh0LmRpcnM9JHtTUElESVJ9IgorUEFSQU0xPUV1cm9wZS9Nb3Njb3cKK1BBUkFNMj0KK1BBUkFNMz0KK3J1blRlc3QKKworIyB0ZXN0aW5nIDgwMDA2MTUgZml4LgorTUVUSE9ETkFNRT10ek5hbWVUZXN0CitQUkVGTElTVD0iSlJFIC1EamF2YS5leHQuZGlycz0ke1NQSURJUn0iCitQQVJBTTE9QW1lcmljYS9Mb3NfQW5nZWxlcworUEFSQU0yPQorUEFSQU0zPQorcnVuVGVzdAorCiBleGl0ICRyZXN1bHQKZGlmZiAtLWdpdCBhL2pkay90ZXN0L2phdmEvdXRpbC9NYXAvRW50cnlIYXNoQ29kZS5qYXZhIGIvamRrL3Rlc3QvamF2YS91dGlsL01hcC9FbnRyeUhhc2hDb2RlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThlZjM2NQotLS0gL2Rldi9udWxsCisrKyBiL2pkay90ZXN0L2phdmEvdXRpbC9NYXAvRW50cnlIYXNoQ29kZS5qYXZhCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKKyAqIHF1ZXN0aW9ucy4KKyAqLworCisvKgorICogUG9ydGlvbnMgQ29weXJpZ2h0IChjKSAyMDEyIElCTSBDb3Jwb3JhdGlvbgorICovCisKKy8qCisgKiBAdGVzdAorICogQGJ1ZyA4MDAwOTU1CisgKiBAc3VtbWFyeSBNYXAuRW50cnkgaW1wbGVtZW50YXRpb25zIG5lZWQgdG8gY29tcGx5IHdpdGggTWFwLkVudHJ5Lmhhc2hDb2RlKCkgZGVmaW5lZCBiZWhhdmlvdXIuCisgKiBAYXV0aG9yIG5nbXIKKyAqLworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRTa2lwTGlzdE1hcDsKKworcHVibGljIGNsYXNzIEVudHJ5SGFzaENvZGUgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBURVNUX1NJWkUgPSAxMDA7CisKKyAgICBzdGF0aWMgZmluYWwgT2JqZWN0W11bXSBlbnRyeURhdGEgPSB7CisgICAgICAgIG5ldyBPYmplY3RbVEVTVF9TSVpFXSwKKyAgICAgICAgbmV3IE9iamVjdFtURVNUX1NJWkVdCisgICAgfTsKKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHN0YXRpYyBmaW5hbCBNYXA8T2JqZWN0LE9iamVjdD5bXSBtYXBzID0gKE1hcDxPYmplY3QsT2JqZWN0PltdKW5ldyBNYXBbXSB7CisgICAgICAgIG5ldyBIYXNoTWFwPD4oKSwKKyAgICAgICAgbmV3IEhhc2h0YWJsZTw+KCksCisgICAgICAgIG5ldyBJZGVudGl0eUhhc2hNYXA8PigpLAorICAgICAgICBuZXcgTGlua2VkSGFzaE1hcDw+KCksCisgICAgICAgIG5ldyBUcmVlTWFwPD4oKSwKKyAgICAgICAgbmV3IFdlYWtIYXNoTWFwPD4oKSwKKyAgICAgICAgbmV3IENvbmN1cnJlbnRIYXNoTWFwPD4oKSwKKyAgICAgICAgbmV3IENvbmN1cnJlbnRTa2lwTGlzdE1hcDw+KCkKKyAgICB9OworCisgICAgc3RhdGljIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyeURhdGFbMF0ubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIC8vIGtleSBvYmplY3RzIG5lZWQgdG8gYmUgQ29tcGFyYWJsZSBmb3IgdXNlIGluIFRyZWVNYXAKKyAgICAgICAgICAgIGVudHJ5RGF0YVswXVtpXSA9IG5ldyBDb21wYXJhYmxlPE9iamVjdD4oKSB7CisgICAgICAgICAgICAgICAgcHVibGljIGludCBjb21wYXJlVG8oT2JqZWN0IG8pIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChoYXNoQ29kZSgpIC0gby5oYXNoQ29kZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgZW50cnlEYXRhWzFdW2ldID0gbmV3IE9iamVjdCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRUZXN0RGF0YShNYXA8T2JqZWN0LE9iamVjdD4gbWFwKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW50cnlEYXRhWzBdLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBtYXAucHV0KGVudHJ5RGF0YVswXVtpXSwgZW50cnlEYXRhWzFdW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBFeGNlcHRpb24gZmFpbHVyZSA9IG51bGw7CisgICAgICAgIGZvciAoTWFwPE9iamVjdCxPYmplY3Q+IG1hcDogbWFwcykgeworICAgICAgICAgICAgYWRkVGVzdERhdGEobWFwKTsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxPYmplY3QsT2JqZWN0PiBlOiBtYXAuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgICAgICAgICBPYmplY3Qga2V5ID0gZS5nZXRLZXkoKTsKKyAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gZS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgICAgICAgICBpbnQgZXhwZWN0ZWRFbnRyeUhhc2hDb2RlID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChPYmplY3RzLmhhc2hDb2RlKGtleSkgXiBPYmplY3RzLmhhc2hDb2RlKHZhbHVlKSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGUuaGFzaENvZGUoKSAhPSBleHBlY3RlZEVudHJ5SGFzaENvZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkZBSUxVUkU6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmdldENsYXNzKCkuZ2V0TmFtZSgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi5oYXNoQ29kZSgpIGRvZXMgbm90IGNvbmZvcm0gdG8gZGVmaW5lZCIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGJlaGF2aW91ciBvZiBqYXZhLnV0aWwuTWFwLkVudHJ5Lmhhc2hDb2RlKCkiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgaWYgKGZhaWx1cmUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBmYWlsdXJlID0gZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmYWlsdXJlLmFkZFN1cHByZXNzZWQoZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBtYXAuY2xlYXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZmFpbHVyZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBmYWlsdXJlOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YS91dGlsL1BsdWdnYWJsZUxvY2FsZS9DdXJyZW5jeU5hbWVQcm92aWRlclRlc3QuamF2YSBiL2pkay90ZXN0L2phdmEvdXRpbC9QbHVnZ2FibGVMb2NhbGUvQ3VycmVuY3lOYW1lUHJvdmlkZXJUZXN0LmphdmEKaW5kZXggMjlmMGVlZS4uN2M5ZjYzMSAxMDA2NDQKLS0tIGEvamRrL3Rlc3QvamF2YS91dGlsL1BsdWdnYWJsZUxvY2FsZS9DdXJyZW5jeU5hbWVQcm92aWRlclRlc3QuamF2YQorKysgYi9qZGsvdGVzdC9qYXZhL3V0aWwvUGx1Z2dhYmxlTG9jYWxlL0N1cnJlbmN5TmFtZVByb3ZpZGVyVGVzdC5qYXZhCkBAIC01MCwxMiArNTAsMTMgQEAKICAgICAgICAgY29tLmJhci5DdXJyZW5jeU5hbWVQcm92aWRlckltcGwgY25wID0gbmV3IGNvbS5iYXIuQ3VycmVuY3lOYW1lUHJvdmlkZXJJbXBsKCk7CiAgICAgICAgIExvY2FsZVtdIGF2YWlsbG9jID0gTG9jYWxlLmdldEF2YWlsYWJsZUxvY2FsZXMoKTsKICAgICAgICAgTG9jYWxlW10gdGVzdGxvYyA9IGF2YWlsbG9jLmNsb25lKCk7CisgICAgICAgIExpc3Q8TG9jYWxlPiBqcmVpbXBsbG9jID0gQXJyYXlzLmFzTGlzdChMb2NhbGVQcm92aWRlckFkYXB0ZXIuZm9ySlJFKCkuZ2V0Q3VycmVuY3lOYW1lUHJvdmlkZXIoKS5nZXRBdmFpbGFibGVMb2NhbGVzKCkpOwogICAgICAgICBMaXN0PExvY2FsZT4gcHJvdmlkZXJsb2MgPSBBcnJheXMuYXNMaXN0KGNucC5nZXRBdmFpbGFibGVMb2NhbGVzKCkpOwogCiAgICAgICAgIGZvciAoTG9jYWxlIHRhcmdldDogYXZhaWxsb2MpIHsKICAgICAgICAgICAgIC8vIHB1cmUgSlJFIGltcGxlbWVudGF0aW9uCiAgICAgICAgICAgICBPcGVuTGlzdFJlc291cmNlQnVuZGxlIHJiID0gKE9wZW5MaXN0UmVzb3VyY2VCdW5kbGUpTG9jYWxlUHJvdmlkZXJBZGFwdGVyLmZvckpSRSgpLmdldExvY2FsZURhdGEoKS5nZXRDdXJyZW5jeU5hbWVzKHRhcmdldCk7Ci0gICAgICAgICAgICBib29sZWFuIGpyZUhhc0J1bmRsZSA9IHJiLmdldExvY2FsZSgpLmVxdWFscyh0YXJnZXQpOworICAgICAgICAgICAgYm9vbGVhbiBqcmVTdXBwb3J0c1RhcmdldCA9IGpyZWltcGxsb2MuY29udGFpbnModGFyZ2V0KTsKIAogICAgICAgICAgICAgZm9yIChMb2NhbGUgdGVzdDogdGVzdGxvYykgewogICAgICAgICAgICAgICAgIC8vIGdldCBhIEN1cnJlbmN5IGluc3RhbmNlCkBAIC04MiwyNyArODMsMjQgQEAKICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJzbmFtZSA9IGNucC5nZXREaXNwbGF5TmFtZShjLmdldEN1cnJlbmN5Q29kZSgpLCB0YXJnZXQpOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIC8vIEpSRSdzIG5hbWUgKGlmIGFueSkKKyAgICAgICAgICAgICAgICAvLyBKUkUncyBuYW1lCiAgICAgICAgICAgICAgICAgU3RyaW5nIGpyZXNjdXJyZW5jeSA9IG51bGw7CiAgICAgICAgICAgICAgICAgU3RyaW5nIGpyZXNuYW1lID0gbnVsbDsKICAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gYy5nZXRDdXJyZW5jeUNvZGUoKTsKICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZUtleSA9IGtleS50b0xvd2VyQ2FzZShMb2NhbGUuUk9PVCk7Ci0gICAgICAgICAgICAgICAgaWYgKGpyZUhhc0J1bmRsZSkgeworICAgICAgICAgICAgICAgIGlmIChqcmVTdXBwb3J0c1RhcmdldCkgewogICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAganJlc2N1cnJlbmN5ID0gcmIuZ2V0U3RyaW5nKGtleSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBtcmUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEpSRSBkb2VzIG5vdCBoYXZlIGFueSByZXNvdXJjZSwgImpyZXNjdXJyZW5jeSIgc2hvdWxkIHJlbWFpbiBudWxsCi0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIG1yZSkge30KICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgIGpyZXNuYW1lID0gcmIuZ2V0U3RyaW5nKG5hbWVLZXkpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gbXJlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBKUkUgZG9lcyBub3QgaGF2ZSBhbnkgcmVzb3VyY2UsICJqcmVzbmFtZSIgc2hvdWxkIHJlbWFpbiBudWxsCi0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIG1yZSkge30KICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBjaGVja1ZhbGlkaXR5KHRhcmdldCwganJlc2N1cnJlbmN5LCBwcm92aWRlcnNjdXJyZW5jeSwgY3VycmVuY3lyZXN1bHQsIGpyZXNjdXJyZW5jeSE9bnVsbCk7CisgICAgICAgICAgICAgICAgY2hlY2tWYWxpZGl0eSh0YXJnZXQsIGpyZXNjdXJyZW5jeSwgcHJvdmlkZXJzY3VycmVuY3ksIGN1cnJlbmN5cmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganJlU3VwcG9ydHNUYXJnZXQgJiYganJlc2N1cnJlbmN5ICE9IG51bGwpOwogICAgICAgICAgICAgICAgIGNoZWNrVmFsaWRpdHkodGFyZ2V0LCBqcmVzbmFtZSwgcHJvdmlkZXJzbmFtZSwgbmFtZXJlc3VsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpyZUhhc0J1bmRsZSAmJiByYi5oYW5kbGVHZXRLZXlzKCkuY29udGFpbnMobmFtZUtleSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganJlU3VwcG9ydHNUYXJnZXQgJiYganJlc25hbWUgIT0gbnVsbCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZhL3V0aWwvUGx1Z2dhYmxlTG9jYWxlL0RhdGVGb3JtYXRTeW1ib2xzUHJvdmlkZXJUZXN0LmphdmEgYi9qZGsvdGVzdC9qYXZhL3V0aWwvUGx1Z2dhYmxlTG9jYWxlL0RhdGVGb3JtYXRTeW1ib2xzUHJvdmlkZXJUZXN0LmphdmEKaW5kZXggMjA1NDcyMS4uNDRkNTM3YiAxMDA2NDQKLS0tIGEvamRrL3Rlc3QvamF2YS91dGlsL1BsdWdnYWJsZUxvY2FsZS9EYXRlRm9ybWF0U3ltYm9sc1Byb3ZpZGVyVGVzdC5qYXZhCisrKyBiL2pkay90ZXN0L2phdmEvdXRpbC9QbHVnZ2FibGVMb2NhbGUvRGF0ZUZvcm1hdFN5bWJvbHNQcm92aWRlclRlc3QuamF2YQpAQCAtNDQsNiArNDQsNyBAQAogICAgIERhdGVGb3JtYXRTeW1ib2xzUHJvdmlkZXJUZXN0KCkgewogICAgICAgICBhdmFpbGFibGVMb2NhbGVzVGVzdCgpOwogICAgICAgICBvYmplY3RWYWxpZGl0eVRlc3QoKTsKKyAgICAgICAgaGFzaENvZGVUZXN0KCk7CiAgICAgfQogCiAgICAgdm9pZCBhdmFpbGFibGVMb2NhbGVzVGVzdCgpIHsKQEAgLTEyNCw0ICsxMjUsMTcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KKworICAgIC8vIEJ1ZyA3MjAwMzQxLgorICAgIHZvaWQgaGFzaENvZGVUZXN0KCkgeworICAgICAgICBmb3IgKExvY2FsZSB0YXJnZXQ6IGF2YWlsbG9jKSB7CisgICAgICAgICAgICAvLyBsb29rIGZvciBwcm92aWRlcidzIG9iamVjdAorICAgICAgICAgICAgRGF0ZUZvcm1hdFN5bWJvbHMgZGZzID0gRGF0ZUZvcm1hdFN5bWJvbHMuZ2V0SW5zdGFuY2UodGFyZ2V0KTsKKyAgICAgICAgICAgIGlmIChkZnMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkuZXF1YWxzKCJGb29EYXRlRm9ybWF0U3ltYm9scyIpKSB7CisgICAgICAgICAgICAgICAgLy8gY2FsbCBpdHMgaGFzaENvZGUoKS4gc3VjY2VzcyBpZiBubyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaXMgdGhyb3duLgorICAgICAgICAgICAgICAgIGRmcy5oYXNoQ29kZSgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YS91dGlsL1BsdWdnYWJsZUxvY2FsZS9EYXRlRm9ybWF0U3ltYm9sc1Byb3ZpZGVyVGVzdC5zaCBiL2pkay90ZXN0L2phdmEvdXRpbC9QbHVnZ2FibGVMb2NhbGUvRGF0ZUZvcm1hdFN5bWJvbHNQcm92aWRlclRlc3Quc2gKaW5kZXggMjJjOTdkMC4uMjQxMjljZCAxMDA2NDQKLS0tIGEvamRrL3Rlc3QvamF2YS91dGlsL1BsdWdnYWJsZUxvY2FsZS9EYXRlRm9ybWF0U3ltYm9sc1Byb3ZpZGVyVGVzdC5zaAorKysgYi9qZGsvdGVzdC9qYXZhL3V0aWwvUGx1Z2dhYmxlTG9jYWxlL0RhdGVGb3JtYXRTeW1ib2xzUHJvdmlkZXJUZXN0LnNoCkBAIC0yMyw2ICsyMyw2IEBACiAjIS9iaW4vc2gKICMKICMgQHRlc3QKLSMgQGJ1ZyA0MDUyNDQwCisjIEBidWcgNDA1MjQ0MCA3MjAwMzQxCiAjIEBzdW1tYXJ5IERhdGVGb3JtYXRTeW1ib2xzUHJvdmlkZXIgdGVzdHMKICMgQHJ1biBzaGVsbCBFeGVjVGVzdC5zaCBmb28gRGF0ZUZvcm1hdFN5bWJvbHNQcm92aWRlclRlc3QgdHJ1ZQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YS91dGlsL1BsdWdnYWJsZUxvY2FsZS9Mb2NhbGVOYW1lUHJvdmlkZXJUZXN0LmphdmEgYi9qZGsvdGVzdC9qYXZhL3V0aWwvUGx1Z2dhYmxlTG9jYWxlL0xvY2FsZU5hbWVQcm92aWRlclRlc3QuamF2YQppbmRleCBlOGNjNmM5Li5jODJmYWIwIDEwMDY0NAotLS0gYS9qZGsvdGVzdC9qYXZhL3V0aWwvUGx1Z2dhYmxlTG9jYWxlL0xvY2FsZU5hbWVQcm92aWRlclRlc3QuamF2YQorKysgYi9qZGsvdGVzdC9qYXZhL3V0aWwvUGx1Z2dhYmxlTG9jYWxlL0xvY2FsZU5hbWVQcm92aWRlclRlc3QuamF2YQpAQCAtMzYsMTUgKzM2LDIxIEBACiAgICAgfQogCiAgICAgTG9jYWxlTmFtZVByb3ZpZGVyVGVzdCgpIHsKKyAgICAgICAgY2hlY2tBdmFpbExvY1ZhbGlkaXR5VGVzdCgpOworICAgICAgICB2YXJpYW50RmFsbGJhY2tUZXN0KCk7CisgICAgfQorCisgICAgdm9pZCBjaGVja0F2YWlsTG9jVmFsaWRpdHlUZXN0KCkgewogICAgICAgICBjb20uYmFyLkxvY2FsZU5hbWVQcm92aWRlckltcGwgbG5wID0gbmV3IGNvbS5iYXIuTG9jYWxlTmFtZVByb3ZpZGVySW1wbCgpOwogICAgICAgICBMb2NhbGVbXSBhdmFpbGxvYyA9IExvY2FsZS5nZXRBdmFpbGFibGVMb2NhbGVzKCk7CiAgICAgICAgIExvY2FsZVtdIHRlc3Rsb2MgPSBhdmFpbGxvYy5jbG9uZSgpOworICAgICAgICBMaXN0PExvY2FsZT4ganJlaW1wbGxvYyA9IEFycmF5cy5hc0xpc3QoTG9jYWxlUHJvdmlkZXJBZGFwdGVyLmZvckpSRSgpLmdldExvY2FsZU5hbWVQcm92aWRlcigpLmdldEF2YWlsYWJsZUxvY2FsZXMoKSk7CiAgICAgICAgIExpc3Q8TG9jYWxlPiBwcm92aWRlcmxvYyA9IEFycmF5cy5hc0xpc3QobG5wLmdldEF2YWlsYWJsZUxvY2FsZXMoKSk7CiAKICAgICAgICAgZm9yIChMb2NhbGUgdGFyZ2V0OiBhdmFpbGxvYykgewogICAgICAgICAgICAgLy8gcHVyZSBKUkUgaW1wbGVtZW50YXRpb24KICAgICAgICAgICAgIE9wZW5MaXN0UmVzb3VyY2VCdW5kbGUgcmIgPSBMb2NhbGVQcm92aWRlckFkYXB0ZXIuZm9ySlJFKCkuZ2V0TG9jYWxlRGF0YSgpLmdldExvY2FsZU5hbWVzKHRhcmdldCk7Ci0gICAgICAgICAgICBib29sZWFuIGpyZUhhc0J1bmRsZSA9IHJiLmdldExvY2FsZSgpLmVxdWFscyh0YXJnZXQpOworICAgICAgICAgICAgYm9vbGVhbiBqcmVTdXBwb3J0c1RhcmdldCA9IGpyZWltcGxsb2MuY29udGFpbnModGFyZ2V0KTsKIAogICAgICAgICAgICAgZm9yIChMb2NhbGUgdGVzdDogdGVzdGxvYykgewogICAgICAgICAgICAgICAgIC8vIGNvZGVzCkBAIC02Nyw3ICs3Myw3IEBACiAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyc3ZybnQgPSBsbnAuZ2V0RGlzcGxheVZhcmlhbnQodnJudCwgdGFyZ2V0KTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAvLyBKUkUncyBuYW1lIChpZiBhbnkpCisgICAgICAgICAgICAgICAgLy8gSlJFJ3MgbmFtZQogICAgICAgICAgICAgICAgIFN0cmluZyBqcmVzbGFuZyA9IG51bGw7CiAgICAgICAgICAgICAgICAgU3RyaW5nIGpyZXNjdHJ5ID0gbnVsbDsKICAgICAgICAgICAgICAgICBTdHJpbmcganJlc3ZybnQgPSBudWxsOwpAQCAtODQsMTggKzkwLDQxIEBACiAgICAgICAgICAgICAgICAgaWYgKCF2cm50LmVxdWFscygiIikpIHsKICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgIGpyZXN2cm50ID0gcmIuZ2V0U3RyaW5nKCIlJSIrdnJudCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBtcmUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGpyZXN2cm50ID0gdnJudDsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gbXJlKSB7fQogICAgICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIkZvciBrZXk6ICIrbGFuZysiICIpOwogICAgICAgICAgICAgICAgIGNoZWNrVmFsaWRpdHkodGFyZ2V0LCBqcmVzbGFuZywgcHJvdmlkZXJzbGFuZywgbGFuZ3Jlc3VsdCwKLSAgICAgICAgICAgICAgICAgICAganJlSGFzQnVuZGxlICYmIHJiLmhhbmRsZUdldEtleXMoKS5jb250YWlucyhsYW5nKSk7CisgICAgICAgICAgICAgICAgICAgIGpyZVN1cHBvcnRzVGFyZ2V0ICYmIGpyZXNsYW5nICE9IG51bGwpOworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIkZvciBrZXk6ICIrY3RyeSsiICIpOwogICAgICAgICAgICAgICAgIGNoZWNrVmFsaWRpdHkodGFyZ2V0LCBqcmVzY3RyeSwgcHJvdmlkZXJzY3RyeSwgY3RyeXJlc3VsdCwKLSAgICAgICAgICAgICAgICAgICAganJlSGFzQnVuZGxlICYmIHJiLmhhbmRsZUdldEtleXMoKS5jb250YWlucyhjdHJ5KSk7CisgICAgICAgICAgICAgICAgICAgIGpyZVN1cHBvcnRzVGFyZ2V0ICYmIGpyZXNjdHJ5ICE9IG51bGwpOworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIkZvciBrZXk6ICIrdnJudCsiICIpOwogICAgICAgICAgICAgICAgIGNoZWNrVmFsaWRpdHkodGFyZ2V0LCBqcmVzdnJudCwgcHJvdmlkZXJzdnJudCwgdnJudHJlc3VsdCwKLSAgICAgICAgICAgICAgICAgICAganJlSGFzQnVuZGxlICYmIHJiLmhhbmRsZUdldEtleXMoKS5jb250YWlucygiJSUiK3ZybnQpKTsKKyAgICAgICAgICAgICAgICAgICAganJlU3VwcG9ydHNUYXJnZXQgJiYganJlc3ZybnQgIT0gbnVsbCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CisKKyAgICB2b2lkIHZhcmlhbnRGYWxsYmFja1Rlc3QoKSB7CisgICAgICAgIExvY2FsZSBZWSA9IG5ldyBMb2NhbGUoInl5IiwgIllZIiwgIllZWVkiKTsKKyAgICAgICAgTG9jYWxlIFlZX3N1ZmZpeCA9IG5ldyBMb2NhbGUoInl5IiwgIllZIiwgIllZWVlfc3VmZml4Iik7CisgICAgICAgIFN0cmluZyByZXRWcm50ID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAidmFyaWFudEZhbGxiYWNrVGVzdCgpIHN1Y2NlZWRlZC4iOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFlZLmdldERpc3BsYXlWYXJpYW50KFlZX3N1ZmZpeCk7CisgICAgICAgICAgICBtZXNzYWdlID0gInZhcmlhbnRGYWxsYmFja1Rlc3QoKSBmYWlsZWQuIEVpdGhlciBwcm92aWRlciB3YXNuJ3QgaW52b2tlZCwgb3IgaW52b2tlZCB3aXRob3V0IHN1ZmZpeC4iOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXRWcm50ID0gcmUuZ2V0TWVzc2FnZSgpOworICAgICAgICAgICAgaWYgKFlZX3N1ZmZpeC5nZXRWYXJpYW50KCkuZXF1YWxzKHJldFZybnQpKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgIHJldHVybjsKK30KKyAgICAgICAgICAgIG1lc3NhZ2UgPSAidmFyaWFudEZhbGxiYWNrVGVzdCgpIGZhaWxlZC4gUmV0dXJuZWQgdmFyaWFudDogIityZXRWcm50OworICAgICAgICB9CisKKyAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obWVzc2FnZSk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YS91dGlsL1BsdWdnYWJsZUxvY2FsZS9Mb2NhbGVOYW1lUHJvdmlkZXJUZXN0LnNoIGIvamRrL3Rlc3QvamF2YS91dGlsL1BsdWdnYWJsZUxvY2FsZS9Mb2NhbGVOYW1lUHJvdmlkZXJUZXN0LnNoCmluZGV4IDRlN2U4NWIuLjk1NzViODEgMTAwNjQ0Ci0tLSBhL2pkay90ZXN0L2phdmEvdXRpbC9QbHVnZ2FibGVMb2NhbGUvTG9jYWxlTmFtZVByb3ZpZGVyVGVzdC5zaAorKysgYi9qZGsvdGVzdC9qYXZhL3V0aWwvUGx1Z2dhYmxlTG9jYWxlL0xvY2FsZU5hbWVQcm92aWRlclRlc3Quc2gKQEAgLTIzLDYgKzIzLDYgQEAKICMhL2Jpbi9zaAogIwogIyBAdGVzdAotIyBAYnVnIDQwNTI0NDAKKyMgQGJ1ZyA0MDUyNDQwIDgwMDAyNzMKICMgQHN1bW1hcnkgTG9jYWxlTmFtZVByb3ZpZGVyIHRlc3RzCiAjIEBydW4gc2hlbGwgRXhlY1Rlc3Quc2ggYmFyIExvY2FsZU5hbWVQcm92aWRlclRlc3QgdHJ1ZQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YS91dGlsL1BsdWdnYWJsZUxvY2FsZS9Qcm92aWRlclRlc3QuamF2YSBiL2pkay90ZXN0L2phdmEvdXRpbC9QbHVnZ2FibGVMb2NhbGUvUHJvdmlkZXJUZXN0LmphdmEKaW5kZXggNTdjOGI0My4uNDFlODhhYSAxMDA2NDQKLS0tIGEvamRrL3Rlc3QvamF2YS91dGlsL1BsdWdnYWJsZUxvY2FsZS9Qcm92aWRlclRlc3QuamF2YQorKysgYi9qZGsvdGVzdC9qYXZhL3V0aWwvUGx1Z2dhYmxlTG9jYWxlL1Byb3ZpZGVyVGVzdC5qYXZhCkBAIC00Miw1ICs0Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICJyZXN1bHQgZG8gbm90IG1hdGNoIHdpdGggcHJvdmlkZXIncyByZXN1bHQuIHRhcmdldDogIit0YXJnZXQrIiByZXN1bHQ6ICIrcmVzdWx0KyIgcHJvdmlkZXJzOiAiK3Byb3ZpZGVycyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImNoZWNrVmFsaWRpdHkgc3VjY2VlZGVkLiB0YXJnZXQ6ICIrdGFyZ2V0KyIgcmVzdWx0OiAiK3Jlc3VsdCsiIGpyZSdzOiAiK2pyZXMrIiBwcm92aWRlcnM6ICIrcHJvdmlkZXJzKyIganJlLXByZWZlcnJlZDogIitqcmVzUHJlZmVycmVkKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZhL3V0aWwvUGx1Z2dhYmxlTG9jYWxlL1RpbWVab25lTmFtZVByb3ZpZGVyVGVzdC5qYXZhIGIvamRrL3Rlc3QvamF2YS91dGlsL1BsdWdnYWJsZUxvY2FsZS9UaW1lWm9uZU5hbWVQcm92aWRlclRlc3QuamF2YQppbmRleCA0Nzk1Y2U4Li5jYzcxZTZjIDEwMDY0NAotLS0gYS9qZGsvdGVzdC9qYXZhL3V0aWwvUGx1Z2dhYmxlTG9jYWxlL1RpbWVab25lTmFtZVByb3ZpZGVyVGVzdC5qYXZhCisrKyBiL2pkay90ZXN0L2phdmEvdXRpbC9QbHVnZ2FibGVMb2NhbGUvVGltZVpvbmVOYW1lUHJvdmlkZXJUZXN0LmphdmEKQEAgLTQ1LDEzICs0NSwxNCBAQAogCiAgICAgdm9pZCB0ZXN0MSgpIHsKICAgICAgICAgTG9jYWxlW10gYXZhaWxhYmxlID0gTG9jYWxlLmdldEF2YWlsYWJsZUxvY2FsZXMoKTsKKyAgICAgICAgTGlzdDxMb2NhbGU+IGpyZWltcGxsb2MgPSBBcnJheXMuYXNMaXN0KExvY2FsZVByb3ZpZGVyQWRhcHRlci5mb3JKUkUoKS5nZXRUaW1lWm9uZU5hbWVQcm92aWRlcigpLmdldEF2YWlsYWJsZUxvY2FsZXMoKSk7CiAgICAgICAgIExpc3Q8TG9jYWxlPiBwcm92aWRlckxvY2FsZXMgPSBBcnJheXMuYXNMaXN0KHR6bnAuZ2V0QXZhaWxhYmxlTG9jYWxlcygpKTsKICAgICAgICAgU3RyaW5nW10gaWRzID0gVGltZVpvbmUuZ2V0QXZhaWxhYmxlSURzKCk7CiAKICAgICAgICAgZm9yIChMb2NhbGUgdGFyZ2V0OiBhdmFpbGFibGUpIHsKICAgICAgICAgICAgIC8vIHB1cmUgSlJFIGltcGxlbWVudGF0aW9uCiAgICAgICAgICAgICBPcGVuTGlzdFJlc291cmNlQnVuZGxlIHJiID0gTG9jYWxlUHJvdmlkZXJBZGFwdGVyLmZvckpSRSgpLmdldExvY2FsZURhdGEoKS5nZXRUaW1lWm9uZU5hbWVzKHRhcmdldCk7Ci0gICAgICAgICAgICBib29sZWFuIGpyZUhhc0J1bmRsZSA9IHJiLmdldExvY2FsZSgpLmVxdWFscyh0YXJnZXQpOworICAgICAgICAgICAgYm9vbGVhbiBqcmVTdXBwb3J0c1RhcmdldCA9IGpyZWltcGxsb2MuY29udGFpbnModGFyZ2V0KTsKIAogICAgICAgICAgICAgZm9yIChTdHJpbmcgaWQ6IGlkcykgewogICAgICAgICAgICAgICAgIC8vIHRoZSB0aW1lIHpvbmUKQEAgLTU5LDcgKzYwLDcgQEAKIAogICAgICAgICAgICAgICAgIC8vIEpSRSBzdHJpbmcgYXJyYXkgZm9yIHRoZSBpZAogICAgICAgICAgICAgICAgIFN0cmluZ1tdIGpyZWFycmF5ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBpZiAoanJlSGFzQnVuZGxlKSB7CisgICAgICAgICAgICAgICAgaWYgKGpyZVN1cHBvcnRzVGFyZ2V0KSB7CiAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBqcmVhcnJheSA9IHJiLmdldFN0cmluZ0FycmF5KGlkKTsKICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIG1yZSkge30KQEAgLTc1LDE0ICs3NiwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJzbmFtZSA9IHR6bnAuZ2V0RGlzcGxheU5hbWUoaWQsIGk+PTMsIGklMiwgdGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIC8vIEpSRSdzIG5hbWUgKGlmIGFueSkKKyAgICAgICAgICAgICAgICAgICAgLy8gSlJFJ3MgbmFtZQogICAgICAgICAgICAgICAgICAgICBTdHJpbmcganJlc25hbWUgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICBpZiAoanJlYXJyYXkgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAganJlc25hbWUgPSBqcmVhcnJheVtpXTsKICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgIGNoZWNrVmFsaWRpdHkodGFyZ2V0LCBqcmVzbmFtZSwgcHJvdmlkZXJzbmFtZSwgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGpyZUhhc0J1bmRsZSAmJiByYi5oYW5kbGVHZXRLZXlzKCkuY29udGFpbnMoaWQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGpyZVN1cHBvcnRzVGFyZ2V0ICYmIGpyZXNuYW1lICE9IG51bGwpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YS91dGlsL1BsdWdnYWJsZUxvY2FsZS9iYXJwcm92aWRlci5qYXIgYi9qZGsvdGVzdC9qYXZhL3V0aWwvUGx1Z2dhYmxlTG9jYWxlL2JhcnByb3ZpZGVyLmphcgppbmRleCBkZDhiNGQwLi5iNTI0N2EwIDEwMDY0NAotLS0gYS9qZGsvdGVzdC9qYXZhL3V0aWwvUGx1Z2dhYmxlTG9jYWxlL2JhcnByb3ZpZGVyLmphcgorKysgYi9qZGsvdGVzdC9qYXZhL3V0aWwvUGx1Z2dhYmxlTG9jYWxlL2JhcnByb3ZpZGVyLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZhL3V0aWwvUGx1Z2dhYmxlTG9jYWxlL2Zvb3Byb3ZpZGVyLmphciBiL2pkay90ZXN0L2phdmEvdXRpbC9QbHVnZ2FibGVMb2NhbGUvZm9vcHJvdmlkZXIuamFyCmluZGV4IGMxYjU3MjMuLjEyNWRiZTEgMTAwNjQ0Ci0tLSBhL2pkay90ZXN0L2phdmEvdXRpbC9QbHVnZ2FibGVMb2NhbGUvZm9vcHJvdmlkZXIuamFyCisrKyBiL2pkay90ZXN0L2phdmEvdXRpbC9QbHVnZ2FibGVMb2NhbGUvZm9vcHJvdmlkZXIuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pkay90ZXN0L2phdmEvdXRpbC9QbHVnZ2FibGVMb2NhbGUvcHJvdmlkZXJzcmMvRGF0ZUZvcm1hdFN5bWJvbHNQcm92aWRlckltcGwuamF2YSBiL2pkay90ZXN0L2phdmEvdXRpbC9QbHVnZ2FibGVMb2NhbGUvcHJvdmlkZXJzcmMvRGF0ZUZvcm1hdFN5bWJvbHNQcm92aWRlckltcGwuamF2YQppbmRleCAzNGEyMDFhLi41Yzk2ZmIyIDEwMDY0NAotLS0gYS9qZGsvdGVzdC9qYXZhL3V0aWwvUGx1Z2dhYmxlTG9jYWxlL3Byb3ZpZGVyc3JjL0RhdGVGb3JtYXRTeW1ib2xzUHJvdmlkZXJJbXBsLmphdmEKKysrIGIvamRrL3Rlc3QvamF2YS91dGlsL1BsdWdnYWJsZUxvY2FsZS9wcm92aWRlcnNyYy9EYXRlRm9ybWF0U3ltYm9sc1Byb3ZpZGVySW1wbC5qYXZhCkBAIC0yMjEsNSArMjIxLDEwIEBACiAgICAgICAgIHB1YmxpYyB2b2lkIHNldEFtUG1TdHJpbmdzKFN0cmluZ1tdIG5ld0FtcG1zKSB7CiAgICAgICAgICAgICBhbXBtcyA9IG5ld0FtcG1zOwogICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmdbXVtdIGdldFpvbmVTdHJpbmdzKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbMF1bMF07CisgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZhL3V0aWwvUGx1Z2dhYmxlTG9jYWxlL3Byb3ZpZGVyc3JjL0xvY2FsZU5hbWVQcm92aWRlckltcGwuamF2YSBiL2pkay90ZXN0L2phdmEvdXRpbC9QbHVnZ2FibGVMb2NhbGUvcHJvdmlkZXJzcmMvTG9jYWxlTmFtZVByb3ZpZGVySW1wbC5qYXZhCmluZGV4IGZjM2JlYjguLjJmMDZlYTYgMTAwNjQ0Ci0tLSBhL2pkay90ZXN0L2phdmEvdXRpbC9QbHVnZ2FibGVMb2NhbGUvcHJvdmlkZXJzcmMvTG9jYWxlTmFtZVByb3ZpZGVySW1wbC5qYXZhCisrKyBiL2pkay90ZXN0L2phdmEvdXRpbC9QbHVnZ2FibGVMb2NhbGUvcHJvdmlkZXJzcmMvTG9jYWxlTmFtZVByb3ZpZGVySW1wbC5qYXZhCkBAIC0zNyw1NyArMzcsNjQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxlLkpBUEFOLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTG9jYWxlKCJqYSIsICJKUCIsICJvc2FrYSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTG9jYWxlKCJqYSIsICJKUCIsICJreW90byIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTG9jYWxlKCJ4eCIpfTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IExvY2FsZSgieHgiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IExvY2FsZSgieXkiLCAiWVkiLCAiWVlZWSIpfTsKICAgICBzdGF0aWMgTGlzdDxMb2NhbGU+IGF2YWlsTGlzdCA9IEFycmF5cy5hc0xpc3QoYXZhaWwpOwogICAgIHB1YmxpYyBMb2NhbGVbXSBnZXRBdmFpbGFibGVMb2NhbGVzKCkgewogICAgICAgICByZXR1cm4gYXZhaWw7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyBnZXREaXNwbGF5TGFuZ3VhZ2UoU3RyaW5nIGxhbmcsIExvY2FsZSB0YXJnZXQpIHsKKyAgICAgICAgcmV0dXJuIGdldERpc3BsYXlTdHJpbmcobGFuZywgdGFyZ2V0KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlDb3VudHJ5KFN0cmluZyBjdHJ5LCBMb2NhbGUgdGFyZ2V0KSB7CisgICAgICAgIHJldHVybiBnZXREaXNwbGF5U3RyaW5nKGN0cnksIHRhcmdldCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXREaXNwbGF5VmFyaWFudChTdHJpbmcgdnJudCwgTG9jYWxlIHRhcmdldCkgeworICAgICAgICByZXR1cm4gZ2V0RGlzcGxheVN0cmluZyh2cm50LCB0YXJnZXQpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGdldERpc3BsYXlTdHJpbmcoU3RyaW5nIGtleSwgTG9jYWxlIHRhcmdldCkgewogICAgICAgICBpZiAoIVV0aWxzLnN1cHBvcnRzTG9jYWxlKGF2YWlsTGlzdCwgdGFyZ2V0KSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibG9jYWxlIGlzIG5vdCBzdXBwb3J0ZWQ6ICIrdGFyZ2V0KTsKICAgICAgICAgfQogCiAgICAgICAgIFN0cmluZyByZXQgPSBudWxsOwogCisgICAgICAgIGlmICh0YXJnZXQuZ2V0TGFuZ3VhZ2UoKS5lcXVhbHMoInl5IikgJiYKKyAgICAgICAgICAgIHRhcmdldC5nZXRDb3VudHJ5KCkuZXF1YWxzKCJZWSIpKSB7CisgICAgICAgICAgICBTdHJpbmcgdnJudCA9IHRhcmdldC5nZXRWYXJpYW50KCk7CisgICAgICAgICAgICBpZiAodnJudC5zdGFydHNXaXRoKCJZWVlZIikpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGtleSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlICJ5eSI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgIllZIjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9ICJ3YWl3YWkiOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAiWVlZWSI6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodnJudC5lcXVhbHMoIllZWVlfc3VmZml4IikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgTG9jYWxlTmFtZVByb3ZpZGVyVGVzdC52YXJpYW50RmFsbGJhY2tUZXN0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbih2cm50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gIndhaXdhaSI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyByZXNvdXJjZSBidW5kbGUgYmFzZWQgKGFsbG93cyBmYWxsYmFjaykKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIFJlc291cmNlQnVuZGxlIHJiID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJjb20uYmFyLkxvY2FsZU5hbWVzIiwgdGFyZ2V0KTsKLSAgICAgICAgICAgIHJldCA9IHJiLmdldFN0cmluZyhsYW5nKTsKKyAgICAgICAgICAgICAgICByZXQgPSByYi5nZXRTdHJpbmcoa2V5KTsKICAgICAgICAgfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIG1yZSkgewogICAgICAgICB9CisgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheUNvdW50cnkoU3RyaW5nIGN0cnksIExvY2FsZSB0YXJnZXQpIHsKLSAgICAgICAgaWYgKCFVdGlscy5zdXBwb3J0c0xvY2FsZShhdmFpbExpc3QsIHRhcmdldCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImxvY2FsZSBpcyBub3Qgc3VwcG9ydGVkOiAiK3RhcmdldCk7CiAgICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgcmV0ID0gbnVsbDsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgUmVzb3VyY2VCdW5kbGUgcmIgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoIkxvY2FsZU5hbWVzIiwgdGFyZ2V0KTsKLSAgICAgICAgICAgIHJldCA9IHJiLmdldFN0cmluZyhjdHJ5KTsKLSAgICAgICAgfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIG1yZSkgewotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlWYXJpYW50KFN0cmluZyB2cm50LCBMb2NhbGUgdGFyZ2V0KSB7Ci0gICAgICAgIGlmICghVXRpbHMuc3VwcG9ydHNMb2NhbGUoYXZhaWxMaXN0LCB0YXJnZXQpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJsb2NhbGUgaXMgbm90IHN1cHBvcnRlZDogIit0YXJnZXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHJldCA9IG51bGw7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFJlc291cmNlQnVuZGxlIHJiID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJMb2NhbGVOYW1lcyIsIHRhcmdldCk7Ci0gICAgICAgICAgICByZXQgPSByYi5nZXRTdHJpbmcodnJudCk7Ci0gICAgICAgIH0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBtcmUpIHsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YS91dGlsL1Byb3BlcnRpZXMvTG9hZEFuZFN0b3JlWE1MLmphdmEgYi9qZGsvdGVzdC9qYXZhL3V0aWwvUHJvcGVydGllcy9Mb2FkQW5kU3RvcmVYTUwuamF2YQppbmRleCA4ZmM1ZTczLi5mZDFkODFmIDEwMDY0NAotLS0gYS9qZGsvdGVzdC9qYXZhL3V0aWwvUHJvcGVydGllcy9Mb2FkQW5kU3RvcmVYTUwuamF2YQorKysgYi9qZGsvdGVzdC9qYXZhL3V0aWwvUHJvcGVydGllcy9Mb2FkQW5kU3RvcmVYTUwuamF2YQpAQCAtMjMsNyArMjMsNyBAQAogCiAvKgogICogQHRlc3QKLSAqIEBidWcgODAwMDM1NAorICogQGJ1ZyA4MDAwMzU0IDgwMDA2ODUKICAqIEBzdW1tYXJ5IEJhc2ljIHRlc3Qgb2Ygc3RvcmVUb1hNTCBhbmQgbG9hZFRvWE1MCiAgKi8KIApAQCAtNjYsMTMgKzY2LDEzIEBACiAgICAgICogU2FuaXR5IHRlc3QgdGhhdCBwcm9wZXJ0aWVzIHNhdmVkIHdpdGggUHJvcGVydGllcyNzdG9yZVRvWE1MIGNhbiBiZQogICAgICAqIHJlYWQgd2l0aCBQcm9wZXJ0aWVzI2xvYWRGcm9tWE1MLgogICAgICAqLwotICAgIHN0YXRpYyB2b2lkIHRlc3QoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHN0YXRpYyB2b2lkIHRlc3RMb2FkQW5kU3RvcmUoU3RyaW5nIGVuY29kaW5nKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKICAgICAgICAgcHJvcHMucHV0KCJrMSIsICJmb28iKTsKICAgICAgICAgcHJvcHMucHV0KCJrMiIsICJiYXIiKTsKIAogICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICBwcm9wcy5zdG9yZVRvWE1MKG91dCwgIm5vIGNvbW1lbnQiKTsKKyAgICAgICAgcHJvcHMuc3RvcmVUb1hNTChvdXQsIG51bGwsIGVuY29kaW5nKTsKIAogICAgICAgICBQcm9wZXJ0aWVzIHAgPSBuZXcgUHJvcGVydGllcygpOwogICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvdXQudG9CeXRlQXJyYXkoKSk7CkBAIC04NSwxOSArODUsNzQgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8qKgorICAgICAqIFRlc3QgbG9hZEZyb21YTUwgd2l0aCBhIGRvY3VtZW50IHRoYXQgZG9lcyBub3QgaGF2ZSBhbiBlbmNvZGluZyBkZWNsYXJhdGlvbgorICAgICAqLworICAgIHN0YXRpYyB2b2lkIHRlc3RMb2FkV2l0aG91dEVuY29kaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgUHJvcGVydGllcyBleHBlY3RlZCA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgIGV4cGVjdGVkLnB1dCgiZm9vIiwgImJhciIpOworCisgICAgICAgIFN0cmluZyBzID0gIjw/eG1sIHZlcnNpb249XCIxLjBcIj8+IiArCisgICAgICAgICAgICAgICAgICAgIjwhRE9DVFlQRSBwcm9wZXJ0aWVzIFNZU1RFTSBcImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3Byb3BlcnRpZXMuZHRkXCI+IiArCisgICAgICAgICAgICAgICAgICAgIjxwcm9wZXJ0aWVzPiIgKworICAgICAgICAgICAgICAgICAgICI8ZW50cnkga2V5PVwiZm9vXCI+YmFyPC9lbnRyeT4iICsKKyAgICAgICAgICAgICAgICAgICAiPC9wcm9wZXJ0aWVzPiI7CisgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHMuZ2V0Qnl0ZXMoIlVURi04IikpOworICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgcHJvcHMubG9hZEZyb21YTUwoaW4pOworCisgICAgICAgIGlmICghcHJvcHMuZXF1YWxzKGV4cGVjdGVkKSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJsb2FkZWQ6ICIgKyBwcm9wcyArICIsIGV4cGVjdGVkOiAiICsgZXhwZWN0ZWQpOworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRlc3QgZmFpbGVkIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAgLyoqCisgICAgICAqIFRlc3QgbG9hZEZyb21YTUwgd2l0aCB1bnN1cHBvcnRlZCBlbmNvZGluZworICAgICAgKi8KKyAgICAgc3RhdGljIHZvaWQgdGVzdExvYWRXaXRoQmFkRW5jb2RpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmcgcyA9ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJCQURcIj8+IiArCisgICAgICAgICAgICAgICAgICAgIjwhRE9DVFlQRSBwcm9wZXJ0aWVzIFNZU1RFTSBcImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3Byb3BlcnRpZXMuZHRkXCI+IiArCisgICAgICAgICAgICAgICAgICAgIjxwcm9wZXJ0aWVzPiIgKworICAgICAgICAgICAgICAgICAgICI8ZW50cnkga2V5PVwiZm9vXCI+YmFyPC9lbnRyeT4iICsKKyAgICAgICAgICAgICAgICAgICAiPC9wcm9wZXJ0aWVzPiI7CisgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHMuZ2V0Qnl0ZXMoIlVURi04IikpOworICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByb3BzLmxvYWRGcm9tWE1MKGluKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGV4cGVjdGVkIik7CisgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZXhwZWN0ZWQpIHsgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3Qgc3RvcmVUb1hNTCB3aXRoIHVuc3VwcG9ydGVkIGVuY29kaW5nCisgICAgICovCisgICAgc3RhdGljIHZvaWQgdGVzdFN0b3JlV2l0aEJhZEVuY29kaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgIHByb3BzLnB1dCgiZm9vIiwgImJhciIpOworICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJvcHMuc3RvcmVUb1hNTChvdXQsIG51bGwsICJCQUQiKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGV4cGVjdGVkIik7CisgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZXhwZWN0ZWQpIHsgfQorICAgIH0KKwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAKLSAgICAgICAgLy8gcnVuIHRlc3Qgd2l0aG91dCBzZWN1cml0eSBtYW5hZ2VyCi0gICAgICAgIHRlc3QoKTsKKyAgICAgICAgdGVzdExvYWRBbmRTdG9yZSgiVVRGLTgiKTsKKyAgICAgICAgdGVzdExvYWRBbmRTdG9yZSgiVVRGLTE2Iik7CisgICAgICAgIHRlc3RMb2FkV2l0aG91dEVuY29kaW5nKCk7CisgICAgICAgIHRlc3RMb2FkV2l0aEJhZEVuY29kaW5nKCk7CisgICAgICAgIHRlc3RTdG9yZVdpdGhCYWRFbmNvZGluZygpOwogCi0gICAgICAgIC8vIHJlLXJ1biB0ZXN0IHdpdGggc2VjdXJpdHkgbWFuYWdlcgorICAgICAgICAvLyByZS1ydW4gc2FuaXR5IHRlc3Qgd2l0aCBzZWN1cml0eSBtYW5hZ2VyCiAgICAgICAgIFBvbGljeSBvcmlnID0gUG9saWN5LmdldFBvbGljeSgpOwogICAgICAgICBQb2xpY3kgcCA9IG5ldyBTaW1wbGVQb2xpY3kobmV3IFJ1bnRpbWVQZXJtaXNzaW9uKCJzZXRTZWN1cml0eU1hbmFnZXIiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQcm9wZXJ0eVBlcm1pc3Npb24oImxpbmUuc2VwYXJhdG9yIiwgInJlYWQiKSk7CiAgICAgICAgIFBvbGljeS5zZXRQb2xpY3kocCk7CiAgICAgICAgIFN5c3RlbS5zZXRTZWN1cml0eU1hbmFnZXIobmV3IFNlY3VyaXR5TWFuYWdlcigpKTsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRlc3QoKTsKKyAgICAgICAgICAgIHRlc3RMb2FkQW5kU3RvcmUoIlVURi04Iik7CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAvLyB0dXJuIG9mZiBzZWN1cml0eSBtYW5hZ2VyIGFuZCByZXN0b3JlIHBvbGljeQogICAgICAgICAgICAgU3lzdGVtLnNldFNlY3VyaXR5TWFuYWdlcihudWxsKTsKZGlmZiAtLWdpdCBhL2pkay90ZXN0L2phdmEvdXRpbC9TZXJ2aWNlTG9hZGVyL0Jhc2ljLmphdmEgYi9qZGsvdGVzdC9qYXZhL3V0aWwvU2VydmljZUxvYWRlci9CYXNpYy5qYXZhCmluZGV4IDk5MTJkNjguLjk2NzdkYjcgMTAwNjQ0Ci0tLSBhL2pkay90ZXN0L2phdmEvdXRpbC9TZXJ2aWNlTG9hZGVyL0Jhc2ljLmphdmEKKysrIGIvamRrL3Rlc3QvamF2YS91dGlsL1NlcnZpY2VMb2FkZXIvQmFzaWMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTQ0LDEwICs0NCw0MSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcSwgczEsIHMyKSk7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBUZXN0TG9hZGVyIHsKKyAgICAgICAgU3RyaW5nIG5hbWU7CiAKLSAgICAgICAgU2VydmljZUxvYWRlcjxGb29TZXJ2aWNlPiBzbCA9IFNlcnZpY2VMb2FkZXIubG9hZChGb29TZXJ2aWNlLmNsYXNzKTsKLSAgICAgICAgb3V0LmZvcm1hdCgiJXMlbiIsIHNsKTsKKyAgICAgICAgVGVzdExvYWRlcihTdHJpbmcgbmFtZSkgeyB0aGlzLm5hbWUgPSBuYW1lOyB9CisKKyAgICAgICAgYWJzdHJhY3QgU2VydmljZUxvYWRlcjxGb29TZXJ2aWNlPiBsb2FkKCk7CisgICAgfQorCisgICAgc3RhdGljIFRlc3RMb2FkZXIgdGNjbExvYWRlciA9IG5ldyBUZXN0TG9hZGVyKCJUaHJlYWQgY29udGV4dCBjbGFzcyBsb2FkZXIiKSB7CisgICAgICAgIFNlcnZpY2VMb2FkZXI8Rm9vU2VydmljZT4gbG9hZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBTZXJ2aWNlTG9hZGVyLmxvYWQoRm9vU2VydmljZS5jbGFzcyk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgc3RhdGljIFRlc3RMb2FkZXIgc3lzdGVtQ2xMb2FkZXIgPSBuZXcgVGVzdExvYWRlcigiU3lzdGVtIGNsYXNzIGxvYWRlciIpIHsKKyAgICAgICAgU2VydmljZUxvYWRlcjxGb29TZXJ2aWNlPiBsb2FkKCkgeworICAgICAgICAgICAgcmV0dXJuIFNlcnZpY2VMb2FkZXIubG9hZChGb29TZXJ2aWNlLmNsYXNzLCBDbGFzc0xvYWRlci5nZXRTeXN0ZW1DbGFzc0xvYWRlcigpKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBzdGF0aWMgVGVzdExvYWRlciBudWxsQ2xMb2FkZXIgPSBuZXcgVGVzdExvYWRlcigibnVsbCAoZGVmZXIgdG8gc3lzdGVtIGNsYXNzIGxvYWRlcikiKSB7CisgICAgICAgIFNlcnZpY2VMb2FkZXI8Rm9vU2VydmljZT4gbG9hZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBTZXJ2aWNlTG9hZGVyLmxvYWQoRm9vU2VydmljZS5jbGFzcywgbnVsbCk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICBmb3IgKFRlc3RMb2FkZXIgdGwgOiBBcnJheXMuYXNMaXN0KHRjY2xMb2FkZXIsIHN5c3RlbUNsTG9hZGVyLCBudWxsQ2xMb2FkZXIpKSB7CisgICAgICAgICAgICB0ZXN0KHRsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyB2b2lkIHRlc3QoVGVzdExvYWRlciB0bCkgeworICAgICAgICBTZXJ2aWNlTG9hZGVyPEZvb1NlcnZpY2U+IHNsID0gdGwubG9hZCgpOworICAgICAgICBvdXQuZm9ybWF0KCIlczogJXMlbiIsIHRsLm5hbWUsIHNsKTsKIAogICAgICAgICAvLyBQcm92aWRlcnMgYXJlIGNhY2hlZAogICAgICAgICBTZXQ8Rm9vU2VydmljZT4gcHMgPSBzZXRPZihzbCk7CkBAIC01OCw1ICs4OSw0IEBACiAgICAgICAgIGNoZWNrRXF1YWxzKHBzLCBzZXRPZihzbCksIGZhbHNlKTsKIAogICAgIH0KLQogfQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YS91dGlsL1NlcnZpY2VMb2FkZXIvYmFzaWMuc2ggYi9qZGsvdGVzdC9qYXZhL3V0aWwvU2VydmljZUxvYWRlci9iYXNpYy5zaAppbmRleCBkYzkzMDUxLi5hZjhmNmU4IDEwMDY0NAotLS0gYS9qZGsvdGVzdC9qYXZhL3V0aWwvU2VydmljZUxvYWRlci9iYXNpYy5zaAorKysgYi9qZGsvdGVzdC9qYXZhL3V0aWwvU2VydmljZUxvYWRlci9iYXNpYy5zaApAQCAtMjIsNyArMjIsNyBAQAogIwogCiAjIEB0ZXN0Ci0jIEBidWcgNDY0MDUyMCA2MzU0NjIzCisjIEBidWcgNDY0MDUyMCA2MzU0NjIzIDcxOTg0OTYKICMgQHN1bW1hcnkgVW5pdCB0ZXN0IGZvciBqYXZhLnV0aWwuU2VydmljZUxvYWRlcgogIwogIyBAYnVpbGQgQmFzaWMgTG9hZCBGb29TZXJ2aWNlIEZvb1Byb3ZpZGVyMSBGb29Qcm92aWRlcjIgRm9vUHJvdmlkZXIzCmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZhL3V0aWwvbG9nZ2luZy9Mb2dnaW5nTVhCZWFuVGVzdC5qYXZhIGIvamRrL3Rlc3QvamF2YS91dGlsL2xvZ2dpbmcvTG9nZ2luZ01YQmVhblRlc3QuamF2YQppbmRleCBlNmM2OTRkLi5hMDFlNTdjIDEwMDY0NAotLS0gYS9qZGsvdGVzdC9qYXZhL3V0aWwvbG9nZ2luZy9Mb2dnaW5nTVhCZWFuVGVzdC5qYXZhCisrKyBiL2pkay90ZXN0L2phdmEvdXRpbC9sb2dnaW5nL0xvZ2dpbmdNWEJlYW5UZXN0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC00Myw2ICs0Myw4IEBACiAgICAgT2JqZWN0TmFtZSBvYmplY3ROYW1lID0gbnVsbDsKICAgICBzdGF0aWMgU3RyaW5nIExPR0dFUl9OQU1FXzEgPSAiY29tLnN1bi5tYW5hZ2VtZW50LkxvZ2dlcjEiOwogICAgIHN0YXRpYyBTdHJpbmcgTE9HR0VSX05BTUVfMiA9ICJjb20uc3VuLm1hbmFnZW1lbnQuTG9nZ2VyMiI7CisgICAgc3RhdGljIExvZ2dlciBsb2dnZXIxOworICAgIHN0YXRpYyBMb2dnZXIgbG9nZ2VyMjsKIAogICAgIHB1YmxpYyBMb2dnaW5nTVhCZWFuVGVzdCgpIHRocm93cyBFeGNlcHRpb24gewogCkBAIC0xMzEsOCArMTMzLDggQEAKICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiKioqKioqKioqKiogUGhhc2UgMyAqKioqKioqKioqKiIgKTsKICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIgKTsKICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiIENyZWF0ZSBhbmQgdGVzdCBuZXcgTG9nZ2VycyIgKTsKLSAgICAgICAgTG9nZ2VyIGxvZ2dlcjEgPSBMb2dnZXIuZ2V0TG9nZ2VyKCBMT0dHRVJfTkFNRV8xICk7Ci0gICAgICAgIExvZ2dlciBsb2dnZXIyID0gTG9nZ2VyLmdldExvZ2dlciggTE9HR0VSX05BTUVfMiApOworICAgICAgICBsb2dnZXIxID0gTG9nZ2VyLmdldExvZ2dlciggTE9HR0VSX05BTUVfMSApOworICAgICAgICBsb2dnZXIyID0gTG9nZ2VyLmdldExvZ2dlciggTE9HR0VSX05BTUVfMiApOwogCiAgICAgICAgIC8vIGNoZWNrIHRoYXQgTGV2ZWwgb2JqZWN0IGFyZSByZXR1cm5lZCBwcm9wZXJseQogICAgICAgICB0cnkgewpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YS91dGlsL2xvZ2dpbmcvTG9nZ2luZ01YQmVhblRlc3QyLmphdmEgYi9qZGsvdGVzdC9qYXZhL3V0aWwvbG9nZ2luZy9Mb2dnaW5nTVhCZWFuVGVzdDIuamF2YQppbmRleCAzN2I2YWNlLi4wMDVlZDcyIDEwMDY0NAotLS0gYS9qZGsvdGVzdC9qYXZhL3V0aWwvbG9nZ2luZy9Mb2dnaW5nTVhCZWFuVGVzdDIuamF2YQorKysgYi9qZGsvdGVzdC9qYXZhL3V0aWwvbG9nZ2luZy9Mb2dnaW5nTVhCZWFuVGVzdDIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTQyLDEyICs0MiwxNCBAQAogICAgIHN0YXRpYyBTdHJpbmcgTE9HR0VSX05BTUVfMSA9ICJjb20uc3VuLm1hbmFnZW1lbnQuTG9nZ2VyIjsKICAgICBzdGF0aWMgU3RyaW5nIExPR0dFUl9OQU1FXzIgPSAiY29tLnN1bi5tYW5hZ2VtZW50LkxvZ2dlci5Mb2dnZXIyIjsKICAgICBzdGF0aWMgU3RyaW5nIFVOS05PV05fTE9HR0VSX05BTUUgPSAiY29tLnN1bi5tYW5hZ2VtZW50LlVua25vd24iOworICAgIHN0YXRpYyBMb2dnZXIgbG9nZ2VyMTsKKyAgICBzdGF0aWMgTG9nZ2VyIGxvZ2dlcjI7CiAKICAgICBwdWJsaWMgTG9nZ2luZ01YQmVhblRlc3QyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKLSAgICAgICAgTG9nZ2VyIGxvZ2dlcjEgPSBMb2dnZXIuZ2V0TG9nZ2VyKCBMT0dHRVJfTkFNRV8xICk7CisgICAgICAgIGxvZ2dlcjEgPSBMb2dnZXIuZ2V0TG9nZ2VyKCBMT0dHRVJfTkFNRV8xICk7CiAgICAgICAgIGxvZ2dlcjEuc2V0TGV2ZWwoTGV2ZWwuRklORSk7Ci0gICAgICAgIExvZ2dlciBsb2dnZXIyID0gTG9nZ2VyLmdldExvZ2dlciggTE9HR0VSX05BTUVfMiApOworICAgICAgICBsb2dnZXIyID0gTG9nZ2VyLmdldExvZ2dlciggTE9HR0VSX05BTUVfMiApOwogICAgICAgICBsb2dnZXIyLnNldExldmVsKG51bGwpOwogCiAgICAgICAgIC8qCmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZhL3V0aWwvcHJlZnMvQ2hlY2tVc2VyUHJlZkZpcnN0LmphdmEgYi9qZGsvdGVzdC9qYXZhL3V0aWwvcHJlZnMvQ2hlY2tVc2VyUHJlZkZpcnN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBlZTI3NwotLS0gL2Rldi9udWxsCisrKyBiL2pkay90ZXN0L2phdmEvdXRpbC9wcmVmcy9DaGVja1VzZXJQcmVmRmlyc3QuamF2YQpAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBPcmFjbGUgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKKyAqIHF1ZXN0aW9ucy4KKyAqLworCitpbXBvcnQgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VzOworCisvKioKKyAqCisgKiBAYXV0aG9yIGtoYXpyYQorICogRmlyc3QgY2xhc3MgY2FsbGVkIGJ5IENoZWNrVXNlclByZWZzU3RvcmFnZS5zaCB0byBjcmVhdGUgYW5kCisgKiBzdG9yZSBhIHVzZXIgcHJlZmVyZW5jZQorICovCisKK3B1YmxpYyBjbGFzcyBDaGVja1VzZXJQcmVmRmlyc3QgeworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFByZWZlcmVuY2VzIHByZWZzID0gUHJlZmVyZW5jZXMudXNlck5vZGVGb3JQYWNrYWdlKENoZWNrVXNlclByZWZGaXJzdC5jbGFzcyk7CisgICAgICAgIHByZWZzLnB1dCgiQ2hlY2siLCAiU3VjY2VzcyIpOworICAgICAgICBwcmVmcy5mbHVzaCgpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YS91dGlsL3ByZWZzL0NoZWNrVXNlclByZWZMYXRlci5qYXZhIGIvamRrL3Rlc3QvamF2YS91dGlsL3ByZWZzL0NoZWNrVXNlclByZWZMYXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NWE5YWQKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvdGVzdC9qYXZhL3V0aWwvcHJlZnMvQ2hlY2tVc2VyUHJlZkxhdGVyLmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgT3JhY2xlIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCisgKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CisgKiBxdWVzdGlvbnMuCisgKi8KKworaW1wb3J0IGphdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlczsKKworLyoqCisgKiBDaGVja1VzZXJQcmVmc1N0b3JhZ2Uuc2ggdXNlcyB0aGlzIHRvIGNoZWNrIHRoYXQgcHJlZmVyZW5jZXMgc3RvcmVkCisgKiBieSBDaGVja1VzZXJQcmVmRmlyc3QuamF2YSBjYW4gYmUgcmV0cmlldmVkCisgKiBAYXV0aG9yIGtoYXpyYQorICovCisKK3B1YmxpYyBjbGFzcyBDaGVja1VzZXJQcmVmTGF0ZXIgeworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFByZWZlcmVuY2VzIHByZWZzID0gUHJlZmVyZW5jZXMudXNlck5vZGVGb3JQYWNrYWdlKENoZWNrVXNlclByZWZGaXJzdC5jbGFzcyk7CisgICAgICAgIFN0cmluZyByZXN1bHQgPSBwcmVmcy5nZXQoIkNoZWNrIiwgbnVsbCk7CisgICAgICAgIGlmICgocmVzdWx0ID09IG51bGwpIHx8ICEocmVzdWx0LmVxdWFscygiU3VjY2VzcyIpKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVc2VyIHByZWYgbm90IHN0b3JlZCEiKTsKKyAgICAgICAgcHJlZnMucmVtb3ZlKCJDaGVjayIpOworICAgICAgICBwcmVmcy5mbHVzaCgpOworICAgIH0KKworfQorCmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZhL3V0aWwvcHJlZnMvQ2hlY2tVc2VyUHJlZnNTdG9yYWdlLnNoIGIvamRrL3Rlc3QvamF2YS91dGlsL3ByZWZzL0NoZWNrVXNlclByZWZzU3RvcmFnZS5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWRlZDU5Ci0tLSAvZGV2L251bGwKKysrIGIvamRrL3Rlc3QvamF2YS91dGlsL3ByZWZzL0NoZWNrVXNlclByZWZzU3RvcmFnZS5zaApAQCAtMCwwICsxLDY4IEBACisjCisjIENvcHlyaWdodCAoYykgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorIworIyBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisjIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorIyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyMgYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorIyAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyMKKyMgUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyMgb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQorIyBxdWVzdGlvbnMuCisjCisKKyMgQHRlc3QKKyMgQGJ1ZyA3MTk4MDczCisjIEBidWlsZCBDaGVja1VzZXJQcmVmRmlyc3QgQ2hlY2tVc2VyUHJlZkxhdGVyCisjIEBydW4gc2hlbGwgQ2hlY2tVc2VyUHJlZnNTdG9yYWdlLnNoCisjIEBzdW1tYXJ5IFRlc3RzIHRoYXQgdXNlciBwcmVmZXJlbmNlcyBhcmUgc3RvcmVkIGluIHRoZSAKKyMgICAgICAgICAgcGVybWFuZW50IHN0b3JhZ2UKKyMKKworT1M9YHVuYW1lIC1zYAorY2FzZSAiJE9TIiBpbgorICBTdW5PUyB8IExpbnV4IHwgRGFyd2luICkKKyAgICBQUz0iOiIKKyAgICBGUz0iLyIKKyAgICA7OworICBDWUdXSU4qICkKKyAgICBQUz0iOyIKKyAgICBGUz0iLyIKKyAgICA7OworICBXaW5kb3dzKiApCisgICAgUFM9IjsiCisgICAgRlM9IlxcIgorICAgIDs7CisgICogKQorICAgIGVjaG8gIlVucmVjb2duaXplZCBzeXN0ZW0hIgorICAgIGV4aXQgMTsKKyAgICA7OworZXNhYworCisjIHJ1biBDaGVja1VzZXJQcmVmRmlyc3QgLSBjcmVhdGVzIGFuZCBzdG9yZXMgYSB1c2VyIHByZWYKKyR7VEVTVEpBVkF9JHtGU31iaW4ke0ZTfWphdmEgLWNwICR7VEVTVENMQVNTRVN9IENoZWNrVXNlclByZWZGaXJzdAorcmVzdWx0PSQ/CitpZiBbICIkcmVzdWx0IiAtbmUgIjAiIF07IHRoZW4KKyAgICBleGl0IDEKK2ZpCisKKyMgcnVuIENoZWNrVXNlclByZWZMYXRlciAtIExvb2tzIGZvciB0aGUgc3RvcmVkIHByZWYKKyR7VEVTVEpBVkF9JHtGU31iaW4ke0ZTfWphdmEgLWNwICR7VEVTVENMQVNTRVN9IENoZWNrVXNlclByZWZMYXRlcgorcmVzdWx0PSQ/CitpZiBbICIkcmVzdWx0IiAtbmUgIjAiIF07IHRoZW4KKyAgICBleGl0IDEKK2ZpCisKKyMgbm8gZmFpbHVyZXMsIGV4aXQuCitleGl0IDAKKwpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamF2YXgvbWFuYWdlbWVudC90aW1lci9NaXNzaW5nTm90aWZpY2F0aW9uVGVzdC5qYXZhIGIvamRrL3Rlc3QvamF2YXgvbWFuYWdlbWVudC90aW1lci9NaXNzaW5nTm90aWZpY2F0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ZGE2Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvdGVzdC9qYXZheC9tYW5hZ2VtZW50L3RpbWVyL01pc3NpbmdOb3RpZmljYXRpb25UZXN0LmphdmEKQEAgLTAsMCArMSwxMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKKyAqIHF1ZXN0aW9ucy4KKyAqLworCisvKgorICogQHRlc3QKKyAqIEBidWcgNjgwOTMyMgorICogQHN1bW1hcnkgVGVzdCBmb3IgbWlzc2luZyBub3RpZmljYXRpb25zIGluIGEgaGlnaCBjb25jdXJyZW5jeSBlbnZpcm9ubWVudAorICogQGF1dGhvciBKYXJvc2xhdiBCYWNob3JpaworICogQHJ1biBjbGVhbiBNaXNzaW5nTm90aWZpY2F0aW9uVGVzdAorICogQHJ1biBidWlsZCBNaXNzaW5nTm90aWZpY2F0aW9uVGVzdAorICogQHJ1biBtYWluIE1pc3NpbmdOb3RpZmljYXRpb25UZXN0CisgKi8KKworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5SYW5kb207CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yczsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LnRpbWVyLlRpbWVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTm90aWZpY2F0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTm90aWZpY2F0aW9uTGlzdGVuZXI7CisKK3B1YmxpYyBjbGFzcyBNaXNzaW5nTm90aWZpY2F0aW9uVGVzdCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IFRBU0tfQ09VTlQgPSAxMDAwMDsKKyAgICBwcml2YXRlIHN0YXRpYyBsb25nIGZpeGVkRGVsYXkgPSAwOy8vIGFueXRoaW5nIGJpZ2dlciB0aGFuIDEwMCBhbmQgbm8gYWxhcm1zIHJlbWFpbiB1bmZpcmVkCisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBOb3RpZkxpc3RlbmVyIGltcGxlbWVudHMgTm90aWZpY2F0aW9uTGlzdGVuZXIgeworCisgICAgICAgIGludCBjb3VudDsKKworICAgICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24sIE9iamVjdCBoYW5kYmFjaykgeworICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgfQorCisgICAgICAgIHN5bmNocm9uaXplZCBpbnQgZ2V0Q291bnQoKSB7CisgICAgICAgICAgICByZXR1cm4gY291bnQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKAorICAgICAgICAgICAgIj4+PiBUZXN0IGZvciBtaXNzaW5nIG5vdGlmaWNhdGlvbnMuIik7CisKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI+Pj4gQ3JlYXRlIGEgVGltZXIgb2JqZWN0LiIpOworICAgICAgICBmaW5hbCBUaW1lciB0aW1lciA9IG5ldyBUaW1lcigpOworCisgICAgICAgIHRpbWVyLnN0YXJ0KCk7CisKKyAgICAgICAgTm90aWZMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBOb3RpZkxpc3RlbmVyKCk7CisgICAgICAgIHRpbWVyLmFkZE5vdGlmaWNhdGlvbkxpc3RlbmVyKGxpc3RlbmVyLCBudWxsLCBudWxsKTsKKworICAgICAgICBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3IgPSBFeGVjdXRvcnMubmV3Rml4ZWRUaHJlYWRQb29sKDEwMCk7CisgICAgICAgIGZpbmFsIFJhbmRvbSByYW5kID0gbmV3IFJhbmRvbSgpOworCisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBUQVNLX0NPVU5UOyBpKyspIHsKKyAgICAgICAgICAgIGV4ZWN1dG9yLmV4ZWN1dGUobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9uZyBkYXRlTWlsbGlzID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyBmaXhlZERlbGF5ICsgcmFuZC5uZXh0SW50KDIwMDApOworICAgICAgICAgICAgICAgICAgICBEYXRlIGRhdGUgPSBuZXcgRGF0ZShkYXRlTWlsbGlzKTsKKyAgICAgICAgICAgICAgICAgICAgdGltZXIuYWRkTm90aWZpY2F0aW9uKCJ0eXBlIiwgIm1zZyIsICJ1c2VyRGF0YSIsIGRhdGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisgICAgICAgIH0KKworICAgICAgICBleGVjdXRvci5zaHV0ZG93bigpOworICAgICAgICBleGVjdXRvci5hd2FpdFRlcm1pbmF0aW9uKDIwLCBUaW1lVW5pdC5TRUNPTkRTKTsKKworICAgICAgICB3YWl0Rm9yTm90aWZpY2F0aW9uc1RvRW5kKGxpc3RlbmVyKTsKKworICAgICAgICB0aW1lci5zdG9wKCk7CisKKyAgICAgICAgaWYgKGxpc3RlbmVyLmNvdW50IDwgVEFTS19DT1VOVCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk5vdCBmaXJlZDogIiArIChUQVNLX0NPVU5UIC0gbGlzdGVuZXIuY291bnQpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPj4+IEFsbCBub3RpZmljYXRpb25zIGhhbmRsZWQgT0siKTsKKyAgICAgICAgfQorCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPj4+IEJ5ZSBieWUhIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2lsbCByZXR1cm4gd2hlbiBhbGwgbm90aWZpY2F0aW9ucyBhcmUgaGFuZGxlZCBvciBhZnRlciAxMHNlYy4gb2Ygbm8gbmV3CisgICAgICogbm90aWZpY2F0aW9ucworICAgICAqCisgICAgICogQHBhcmFtIGxpc3RlbmVyCisgICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgd2FpdEZvck5vdGlmaWNhdGlvbnNUb0VuZChOb3RpZkxpc3RlbmVyIGxpc3RlbmVyKQorICAgICAgICAgICAgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaW50IG9sZENvdXQgPSBsaXN0ZW5lci5nZXRDb3VudCgpOworICAgICAgICBpbnQgbm9DaGFuZ2VDb3VudGVyID0gMTsKKyAgICAgICAgd2hpbGUgKGxpc3RlbmVyLmdldENvdW50KCkgPCBUQVNLX0NPVU5UKSB7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCcuJyk7CisgICAgICAgICAgICBpZiAob2xkQ291dCA9PSBsaXN0ZW5lci5nZXRDb3VudCgpKS8vbm8gY2hhbmdlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCsrbm9DaGFuZ2VDb3VudGVyID4gMTApIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBub0NoYW5nZUNvdW50ZXIgPSAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvbGRDb3V0ID0gbGlzdGVuZXIuZ2V0Q291bnQoKTsKKyAgICAgICAgfQorICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZheC9zd2luZy9KTWVudUl0ZW0vNDY1NDkyNy9idWc0NjU0OTI3LmphdmEgYi9qZGsvdGVzdC9qYXZheC9zd2luZy9KTWVudUl0ZW0vNDY1NDkyNy9idWc0NjU0OTI3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FjMzM4NgotLS0gL2Rldi9udWxsCisrKyBiL2pkay90ZXN0L2phdmF4L3N3aW5nL0pNZW51SXRlbS80NjU0OTI3L2J1ZzQ2NTQ5MjcuamF2YQpAQCAtMCwwICsxLDE1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQorICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQorICogcXVlc3Rpb25zLgorICovCisKKy8qCisgKiBAdGVzdAorICogQGJ1ZyA0NjU0OTI3CisgKiBAc3VtbWFyeSBDbGlja2luZyBvbiBHcmV5ZWQgTWVudWl0ZW1zIGNsb3NlcyB0aGUgTWVudWJhciBEcm9wZG93bgorICogQGF1dGhvciBBbGV4YW5kZXIgUG90b2Noa2luCisgKiBAbGlicmFyeSAuLi8uLi9yZWd0ZXN0aGVscGVycworICogQGJ1aWxkIFV0aWwKKyAqIEBydW4gbWFpbiBidWc0NjU0OTI3CisgKi8KKworaW1wb3J0IGphdmF4LnN3aW5nLio7CisKK2ltcG9ydCBqYXZhLmF3dC4qOworaW1wb3J0IGphdmEuYXd0LmV2ZW50LklucHV0RXZlbnQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGU7CitpbXBvcnQgc3VuLmF3dC5TdW5Ub29sa2l0OworCitwdWJsaWMgY2xhc3MgYnVnNDY1NDkyNyB7CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2xhdGlsZSBKTWVudSBtZW51OworICAgIHByaXZhdGUgc3RhdGljIHZvbGF0aWxlIEpNZW51SXRlbSBtZW51SXRlbTsKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgc3lzdGVtTEFGID0gVUlNYW5hZ2VyLmdldFN5c3RlbUxvb2tBbmRGZWVsQ2xhc3NOYW1lKCk7CisgICAgICAgIC8vIHRoZSB0ZXN0IGlzIG5vdCBhcHBsaWNhYmxlIHRvIE1vdGlmIEwmRgorICAgICAgICBpZihzeXN0ZW1MQUYuZW5kc1dpdGgoIk1vdGlmTG9va0FuZEZlZWwiKSl7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBVSU1hbmFnZXIuc2V0TG9va0FuZEZlZWwoc3lzdGVtTEFGKTsKKyAgICAgICAgU3VuVG9vbGtpdCB0b29sa2l0ID0gKFN1blRvb2xraXQpIFRvb2xraXQuZ2V0RGVmYXVsdFRvb2xraXQoKTsKKyAgICAgICAgUm9ib3Qgcm9ib3QgPSBuZXcgUm9ib3QoKTsKKyAgICAgICAgcm9ib3Quc2V0QXV0b0RlbGF5KDEwKTsKKworICAgICAgICBTd2luZ1V0aWxpdGllcy5pbnZva2VBbmRXYWl0KG5ldyBSdW5uYWJsZSgpIHsKKworICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIGNyZWF0ZUFuZFNob3dVSSgpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgdG9vbGtpdC5yZWFsU3luYygpOworCisgICAgICAgIC8vIHRlc3QgbW91c2UgcHJlc3MKKyAgICAgICAgUG9pbnQgcG9pbnQgPSBVdGlsLmdldENlbnRlclBvaW50KG1lbnUpOworICAgICAgICByb2JvdC5tb3VzZU1vdmUocG9pbnQueCwgcG9pbnQueSk7CisgICAgICAgIHJvYm90Lm1vdXNlUHJlc3MoSW5wdXRFdmVudC5CVVRUT04xX01BU0spOworICAgICAgICByb2JvdC5tb3VzZVJlbGVhc2UoSW5wdXRFdmVudC5CVVRUT04xX01BU0spOworICAgICAgICB0b29sa2l0LnJlYWxTeW5jKCk7CisKKyAgICAgICAgcG9pbnQgPSBVdGlsLmdldENlbnRlclBvaW50KG1lbnVJdGVtKTsKKyAgICAgICAgcm9ib3QubW91c2VNb3ZlKHBvaW50LngsIHBvaW50LnkpOworICAgICAgICByb2JvdC5tb3VzZVByZXNzKElucHV0RXZlbnQuQlVUVE9OMV9NQVNLKTsKKyAgICAgICAgcm9ib3QubW91c2VSZWxlYXNlKElucHV0RXZlbnQuQlVUVE9OMV9NQVNLKTsKKyAgICAgICAgdG9vbGtpdC5yZWFsU3luYygpOworCisgICAgICAgIGlmICghaXNNZW51SXRlbVNob3dpbmcoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlBvcHVwIGlzIHVuZXhwZWN0ZWRseSBjbG9zZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRlc3QgbW91c2UgZHJhZworICAgICAgICBwb2ludCA9IFV0aWwuZ2V0Q2VudGVyUG9pbnQobWVudSk7CisgICAgICAgIHJvYm90Lm1vdXNlTW92ZShwb2ludC54LCBwb2ludC55KTsKKyAgICAgICAgUG9pbnQgbWVudUxvY2F0aW9uID0gVXRpbC5pbnZva2VPbkVEVChuZXcgQ2FsbGFibGU8UG9pbnQ+KCkgeworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBQb2ludCBjYWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1lbnUuZ2V0TG9jYXRpb25PblNjcmVlbigpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICBQb2ludCBpdGVtTG9jYXRpb24gPSBVdGlsLmludm9rZU9uRURUKG5ldyBDYWxsYWJsZTxQb2ludD4oKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFBvaW50IGNhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbWVudUl0ZW0uZ2V0TG9jYXRpb25PblNjcmVlbigpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICBpbnQgeDAgPSBtZW51TG9jYXRpb24ueCArIDEwOworICAgICAgICBpbnQgeTAgPSBtZW51TG9jYXRpb24ueSArIDEwOworICAgICAgICBpbnQgeDEgPSBpdGVtTG9jYXRpb24ueCArIDEwOworICAgICAgICBpbnQgeTEgPSBpdGVtTG9jYXRpb24ueSArIDEwOworCisgICAgICAgIC8vIGNsb3NlIG1lbnUKKyAgICAgICAgcm9ib3QubW91c2VQcmVzcyhJbnB1dEV2ZW50LkJVVFRPTjFfTUFTSyk7CisgICAgICAgIHJvYm90Lm1vdXNlUmVsZWFzZShJbnB1dEV2ZW50LkJVVFRPTjFfTUFTSyk7CisgICAgICAgIHRvb2xraXQucmVhbFN5bmMoKTsKKworICAgICAgICByb2JvdC5tb3VzZVByZXNzKElucHV0RXZlbnQuQlVUVE9OMV9NQVNLKTsKKyAgICAgICAgVXRpbC5nbGlkZShyb2JvdCwgeDAsIHkwLCB4MSwgeTEpOworICAgICAgICByb2JvdC5tb3VzZVJlbGVhc2UoSW5wdXRFdmVudC5CVVRUT04xX01BU0spOworICAgICAgICB0b29sa2l0LnJlYWxTeW5jKCk7CisKKyAgICAgICAgaWYgKCFpc01lbnVJdGVtU2hvd2luZygpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiUG9wdXAgaXMgdW5leHBlY3RlZGx5IGNsb3NlZCIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc01lbnVJdGVtU2hvd2luZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICByZXR1cm4gVXRpbC5pbnZva2VPbkVEVChuZXcgQ2FsbGFibGU8Qm9vbGVhbj4oKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIEJvb2xlYW4gY2FsbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgICAgIHJldHVybiBtZW51SXRlbS5pc1Nob3dpbmcoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjcmVhdGVBbmRTaG93VUkoKSB7CisgICAgICAgIEpGcmFtZSBmcmFtZSA9IG5ldyBKRnJhbWUoKTsKKyAgICAgICAgZnJhbWUuc2V0RGVmYXVsdENsb3NlT3BlcmF0aW9uKEpGcmFtZS5FWElUX09OX0NMT1NFKTsKKworICAgICAgICBtZW51ID0gbmV3IEpNZW51KCJNZW51Iik7CisgICAgICAgIG1lbnUuYWRkKG5ldyBKTWVudUl0ZW0oIm1lbnVJdGVtIikpOworICAgICAgICBtZW51SXRlbSA9IG5ldyBKTWVudUl0ZW0oIm1lbnVJdGVtIik7CisgICAgICAgIG1lbnVJdGVtLnNldEVuYWJsZWQoZmFsc2UpOworICAgICAgICBtZW51LmFkZChtZW51SXRlbSk7CisgICAgICAgIG1lbnUuYWRkKG5ldyBKTWVudUl0ZW0oIm1lbnVJdGVtIikpOworCisgICAgICAgIEpNZW51QmFyIGJhciA9IG5ldyBKTWVudUJhcigpOworICAgICAgICBiYXIuYWRkKG1lbnUpOworICAgICAgICBmcmFtZS5zZXRKTWVudUJhcihiYXIpOworCisgICAgICAgIGZyYW1lLnNldFNpemUoMjAwLCAyMDApOworICAgICAgICBmcmFtZS5zZXRMb2NhdGlvblJlbGF0aXZlVG8obnVsbCk7CisgICAgICAgIGZyYW1lLnNldFZpc2libGUodHJ1ZSk7CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9qYXZheC9zd2luZy9yZWd0ZXN0aGVscGVycy9VdGlsLmphdmEgYi9qZGsvdGVzdC9qYXZheC9zd2luZy9yZWd0ZXN0aGVscGVycy9VdGlsLmphdmEKaW5kZXggNjhiYzBmOC4uYTlkZjQ5MyAxMDA2NDQKLS0tIGEvamRrL3Rlc3QvamF2YXgvc3dpbmcvcmVndGVzdGhlbHBlcnMvVXRpbC5qYXZhCisrKyBiL2pkay90ZXN0L2phdmF4L3N3aW5nL3JlZ3Rlc3RoZWxwZXJzL1V0aWwuamF2YQpAQCAtMTU3LDYgKzE1NywzNiBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIE1vdmVzIG1vdXNlIHNtb290aGx5IGZyb20gKHgwLCB5MCkgdG8gKHgxLCB5MSkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGdsaWRlKFJvYm90IHJvYm90LCBpbnQgeDAsIGludCB5MCwgaW50IHgxLCBpbnQgeTEpIHRocm93cyBBV1RFeGNlcHRpb24geworICAgICAgICBmbG9hdCBkbWF4ID0gKGZsb2F0KSBNYXRoLm1heChNYXRoLmFicyh4MSAtIHgwKSwgTWF0aC5hYnMoeTEgLSB5MCkpOworICAgICAgICBmbG9hdCBkeCA9ICh4MSAtIHgwKSAvIGRtYXg7CisgICAgICAgIGZsb2F0IGR5ID0gKHkxIC0geTApIC8gZG1heDsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8PSBkbWF4OyBpICs9IDEwKSB7CisgICAgICAgICAgICByb2JvdC5tb3VzZU1vdmUoKGludCkgKHgwICsgZHggKiBpKSwgKGludCkgKHkwICsgZHkgKiBpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIGNvbXBvbmVudCBjZW50ZXIgcG9pbnQKKyAgICAgKgorICAgICAqIEByZXR1cm4gY2VudGVyIHBvaW50IG9mIHRoZSA8Y29kZT5jb21wb25lbnQ8L2NvZGU+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBQb2ludCBnZXRDZW50ZXJQb2ludChmaW5hbCBDb21wb25lbnQgY29tcG9uZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIFV0aWwuaW52b2tlT25FRFQobmV3IENhbGxhYmxlPFBvaW50PigpIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgUG9pbnQgY2FsbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgICAgIFBvaW50IHAgPSBjb21wb25lbnQuZ2V0TG9jYXRpb25PblNjcmVlbigpOworICAgICAgICAgICAgICAgIERpbWVuc2lvbiBzaXplID0gY29tcG9uZW50LmdldFNpemUoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBvaW50KHAueCArIHNpemUud2lkdGggLyAyLCBwLnkgKyBzaXplLmhlaWdodCAvIDIpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBJbnZva2VzIHRoZSA8Y29kZT50YXNrPC9jb2RlPiBvbiB0aGUgRURUIHRocmVhZC4KICAgICAgKgogICAgICAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSA8Y29kZT50YXNrPC9jb2RlPgpkaWZmIC0tZ2l0IGEvamRrL3Rlc3QvamRrL2FzbS9Bc21TYW5pdHkuamF2YSBiL2pkay90ZXN0L2pkay9hc20vQXNtU2FuaXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFlMWNhZAotLS0gL2Rldi9udWxsCisrKyBiL2pkay90ZXN0L2pkay9hc20vQXNtU2FuaXR5LmphdmEKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQorICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQorICogcXVlc3Rpb25zLgorICovCisvKgorICogQHRlc3QKKyAqIEBidWcgNzE5NzQwMQorICogQHN1bW1hcnkgQWRkIGEgc3Vic2V0IG9mIHRoZSBvcmcub2JqZWN0d2ViLmFzbSBwYWNrYWdlcyB0byBqZGs4CisgKiBUaGlzIHRlc3QgZG9lc24ndCB0ZXN0IGFzbSBmdW5jdGlvbmFsaXR5LCBpdCBqdXN0IHRlc3RzIHRoZSBwcmVzZW5jZSBvZgorICogYXNtIGluIHRoZSBqZGsuCisgKiBUaGVzZSBjb21waWxlL3J1biBjb21tYW5kcyBkbyB0aGUgZm9sbG93aW5nOgorICogLSBWZXJpZnkgdGhhdCBhc20gaXMgbm90IGluIGN0LnN5bSBzbyB1c2VyIGNvZGUgdGhhdCByZWZzIGl0IHdvbid0IGNvbXBpbGUuCisgKiAtIFZlcmlmeSB0aGF0IGFzbSByZWFsbHkgaXMgaW4gcnQuamFyIGFuZCBjYW4gYmUgYWNjZXNzZWQgd2hlbiBjdC5zeW0gaXMgbm90IHVzZWQuCisgKiAtIFZlcmlmeSB0aGF0IGlmIHVzZXIgY29kZSBpcyBjb21waWxlZCB3aXRob3V0IGN0LnN5bSwgaXQgY2FuJ3QgYWNjZXNzIGFzbSBjbGFzc2VzCisgKiAgIGF0IHJ1bnRpbWUgd2hlbiBhIHNlY3VyaXR5IG1hbmFnZXIgaXMgaW4gdXNlLgorICoKKyAqIEBjb21waWxlL2ZhaWwgQXNtU2FuaXR5LmphdmEKKyAqCisgKiBAY29tcGlsZSAtWERpZ25vcmUuc3ltYm9sLmZpbGU9dHJ1ZSBBc21TYW5pdHkuamF2YQorICogQHJ1biBtYWluL290aGVydm0gQXNtU2FuaXR5CisgKgorICogQHJ1biBtYWluL290aGVydm0vZmFpbCBBc21TYW5pdHkgc2VjdXJlCisgKgorICovCisKKworLy8gVmVyaWZ5IHRoYXQgdGhlIGV4cGVjdGVkIGFzbSBwa2dzIGFyZSBwcmVzZW50CitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLio7CitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLmNvbW1vbnMuKjsKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20uc2lnbmF0dXJlLio7CitpbXBvcnQgamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLnRyZWUuKjsKK2ltcG9ydCBqZGsuaW50ZXJuYWwub3JnLm9iamVjdHdlYi5hc20udHJlZS5hbmFseXNpcy4qOworaW1wb3J0IGpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbS51dGlsLio7CisKKy8vIFZlcmlmeSB0aGF0IHdlIGNhbiBhY3R1YWxseSBydW4gc29tZSBvZiB0aGUgYXNtIGNvZGUuCitwdWJsaWMgY2xhc3MgQXNtU2FuaXR5IHsKKworICAgIHN0YXRpYyBwdWJsaWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0gUnVubmluZyB3aXRob3V0IFNlY3VyaXR5TWFuYWdlciIpOworICAgICAgICAgICAgbmV3IExhYmVsKCk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tIFBhc3NlZCIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGFyZ3NbMF0uZXF1YWxzKCJzZWN1cmUiKSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItLSBSdW5uaW5nIHdpdGggU2VjdXJpdHlNYW5hZ2VyIik7CisgICAgICAgICAgICBqYXZhLmxhbmcuU2VjdXJpdHlNYW5hZ2VyIHNtID0gbmV3IFNlY3VyaXR5TWFuYWdlcigpOworICAgICAgICAgICAgU3lzdGVtLnNldFNlY3VyaXR5TWFuYWdlcihzbSk7CisgICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBjYXVzZSBhbiBhY2Nlc3NDbGFzc0luUGFja2FnZSBleGNlcHRpb24KKyAgICAgICAgICAgIG5ldyBMYWJlbCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBFcnJvcigiLS0gRmFpbGVkOiAgVW5rbm93biBhcmd1bWVudCB0byBtYWluOiAiICsgYXJnc1swXSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L2tyYjUvY2NhY2hlL0VtcHR5Q0MuamF2YSBiL2pkay90ZXN0L3N1bi9zZWN1cml0eS9rcmI1L2NjYWNoZS9FbXB0eUNDLmphdmEKaW5kZXggZDViZmMwMC4uYTBjZDc1OSAxMDA2NDQKLS0tIGEvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L2tyYjUvY2NhY2hlL0VtcHR5Q0MuamF2YQorKysgYi9qZGsvdGVzdC9zdW4vc2VjdXJpdHkva3JiNS9jY2FjaGUvRW1wdHlDQy5qYXZhCkBAIC0yNCw5ICsyNCwxMSBAQAogLyoKICAqIEB0ZXN0CiAgKiBAYnVnIDcxNTgzMjkKKyAqIEBidWcgODAwMTIwOAogICogQHN1bW1hcnkgTlBFIGluIHN1bi5zZWN1cml0eS5rcmI1LkNyZWRlbnRpYWxzLmFjcXVpcmVEZWZhdWx0Q3JlZHMoKQogICogQGNvbXBpbGUgLVhEaWdub3JlLnN5bWJvbC5maWxlIEVtcHR5Q0MuamF2YQotICogQHJ1biBtYWluIEVtcHR5Q0MKKyAqIEBydW4gbWFpbiBFbXB0eUNDIHRtcGNjCisgKiBAcnVuIG1haW4gRW1wdHlDQyBGSUxFOnRtcGNjCiAgKi8KIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKQEAgLTQwLDkgKzQyLDkgQEAKIHB1YmxpYyBjbGFzcyBFbXB0eUNDIHsKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgZmluYWwgUHJpbmNpcGFsTmFtZSBwbiA9IG5ldyBQcmluY2lwYWxOYW1lKCJkdW1teUBGT08uQ09NIik7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBjY2FjaGUgPSAidG1wY2MiOworICAgICAgICBmaW5hbCBTdHJpbmcgY2NhY2hlID0gYXJnc1swXTsKIAotICAgICAgICBpZiAoYXJncy5sZW5ndGggPT0gMCkgeworICAgICAgICBpZiAoYXJncy5sZW5ndGggPT0gMSkgewogICAgICAgICAgICAgLy8gTWFpbiBwcm9jZXNzLCB3cml0ZSB0aGUgY2NhY2hlIGFuZCBsYXVuY2ggc3ViIHByb2Nlc3MKICAgICAgICAgICAgIENyZWRlbnRpYWxzQ2FjaGUgY2FjaGUgPSBDcmVkZW50aWFsc0NhY2hlLmNyZWF0ZShwbiwgY2NhY2hlKTsKICAgICAgICAgICAgIGNhY2hlLnNhdmUoKTsKQEAgLTU0LDYgKzU2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgIi1jcCIsCiAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgidGVzdC5jbGFzc2VzIiksCiAgICAgICAgICAgICAgICAgICAgICJFbXB0eUNDIiwKKyAgICAgICAgICAgICAgICAgICAgY2NhY2hlLAogICAgICAgICAgICAgICAgICAgICAicmVhZGNjIgogICAgICAgICAgICAgICAgICAgICApOwogCkBAIC03Nyw2ICs4MCwxNCBAQAogICAgICAgICAgICAgaWYgKCFjYy5lcXVhbHMoY2NhY2hlKSkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oImVudiBub3Qgc2V0IGNvcnJlY3RseSIpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gODAwMTIwODogRml4IGZvciBLUkI1Q0NOQU1FIG5vdCBjb21wbGV0ZQorICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBjY2FjaGUgaXMgY3JlYXRlZCB3aXRoIGJhcmUgZmlsZSBuYW1lCisgICAgICAgICAgICBpZiAoQ3JlZGVudGlhbHNDYWNoZS5nZXRJbnN0YW5jZSgpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJDYWNoZSBub3QgaW5zdGFudGlhdGVkIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIW5ldyBGaWxlKCJ0bXBjYyIpLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiRmlsZSBub3QgZm91bmQiKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIENyZWRlbnRpYWxzLmFjcXVpcmVUR1RGcm9tQ2FjaGUocG4sIG51bGwpOwogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L3BrY3MxMi9QS0NTMTJTYW1lS2V5SWQuamF2YSBiL2pkay90ZXN0L3N1bi9zZWN1cml0eS9wa2NzMTIvUEtDUzEyU2FtZUtleUlkLmphdmEKaW5kZXggMGQwNmQ3My4uOTYyYjFiYyAxMDA2NDQKLS0tIGEvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L3BrY3MxMi9QS0NTMTJTYW1lS2V5SWQuamF2YQorKysgYi9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvcGtjczEyL1BLQ1MxMlNhbWVLZXlJZC5qYXZhCkBAIC0yNSw2ICsyNSw4IEBACiAgKiBAdGVzdAogICogQGJ1ZyA2OTU4MDI2CiAgKiBAc3VtbWFyeSBQcm9ibGVtIHdpdGggUEtDUzEyIGtleXN0b3JlCisgKiBAY29tcGlsZSAtWERpZ25vcmUuc3ltYm9sLmZpbGUgUEtDUzEyU2FtZUtleUlkLmphdmEKKyAqIEBydW4gbWFpbiBQS0NTMTJTYW1lS2V5SWQKICAqLwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwpAQCAtNDAsNyArNDIsNiBAQAogaW1wb3J0IGphdmF4LmNyeXB0by5zcGVjLlBCRUtleVNwZWM7CiBpbXBvcnQgamF2YXguY3J5cHRvLnNwZWMuUEJFUGFyYW1ldGVyU3BlYzsKIGltcG9ydCBzdW4uc2VjdXJpdHkucGtjcy5FbmNyeXB0ZWRQcml2YXRlS2V5SW5mbzsKLWltcG9ydCBzdW4uc2VjdXJpdHkudG9vbHMuS2V5VG9vbDsKIGltcG9ydCBzdW4uc2VjdXJpdHkudXRpbC5PYmplY3RJZGVudGlmaWVyOwogaW1wb3J0IHN1bi5zZWN1cml0eS54NTA5LkFsZ29yaXRobUlkOwogaW1wb3J0IHN1bi5zZWN1cml0eS54NTA5Llg1MDBOYW1lOwpAQCAtNjEsNyArNjIsNyBAQAogICAgICAgICAgICAgU3RyaW5nIGNtZCA9ICIta2V5c3RvcmUgIiArIEpLU0ZJTEUKICAgICAgICAgICAgICAgICAgICAgKyAiIC1zdG9yZXBhc3MgY2hhbmdlaXQgLWtleXBhc3MgY2hhbmdlaXQgIgogICAgICAgICAgICAgICAgICAgICArICItZ2Vua2V5cGFpciAtYWxpYXMgcCIgKyBpICsgIiAtZG5hbWUgQ049IiArIGk7Ci0gICAgICAgICAgICBLZXlUb29sLm1haW4oY21kLnNwbGl0KCIgIikpOworICAgICAgICAgICAgc3VuLnNlY3VyaXR5LnRvb2xzLmtleXRvb2wuTWFpbi5tYWluKGNtZC5zcGxpdCgiICIpKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIFByZXBhcmUgRW5jcnlwdGVkUHJpdmF0ZUtleUluZm8gcGFyYW1ldGVycywgY29waWVkIGZyb20gdmFyaW91cwpkaWZmIC0tZ2l0IGEvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L3NzbC9qYXZheC9uZXQvc3NsL05ld0FQSXMvU1NMRW5naW5lL0xhcmdlUGFja2V0LmphdmEgYi9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvc3NsL2phdmF4L25ldC9zc2wvTmV3QVBJcy9TU0xFbmdpbmUvTGFyZ2VQYWNrZXQuamF2YQppbmRleCA0OThkZjcxLi5jOTVlYmZkIDEwMDY0NAotLS0gYS9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvc3NsL2phdmF4L25ldC9zc2wvTmV3QVBJcy9TU0xFbmdpbmUvTGFyZ2VQYWNrZXQuamF2YQorKysgYi9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvc3NsL2phdmF4L25ldC9zc2wvTmV3QVBJcy9TU0xFbmdpbmUvTGFyZ2VQYWNrZXQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIxLDEzICsyMSwxOCBAQAogICogcXVlc3Rpb25zLgogICovCiAKKy8vCisvLyBTdW5KU1NFIGRvZXMgbm90IHN1cHBvcnQgZHluYW1pYyBzeXN0ZW0gcHJvcGVydGllcywgbm8gd2F5IHRvIHJlLXVzZQorLy8gc3lzdGVtIHByb3BlcnRpZXMgaW4gc2FtZXZtL2FnZW50dm0gbW9kZS4KKy8vCisKIC8qCiAgKiBAdGVzdAogICoKICAqIEBidWcgNjM4ODQ1NgogICogQHN1bW1hcnkgTmVlZCBhZGp1c3RhYmxlIFRMUyBtYXggcmVjb3JkIHNpemUgZm9yIGludGVyb3BlcmFiaWxpdHkKICAqICAgICAgd2l0aCBub24tY29tcGxpYW50Ci0gKiBAcnVuIG1haW4vb3RoZXJ2bSAtRGpzc2UuZW5hYmxlQ0JDUHJvdGVjdGlvbj1mYWxzZSBMYXJnZVBhY2tldAorICogQHJ1biBtYWluL290aGVydm0gTGFyZ2VQYWNrZXQKICAqCiAgKiBAYXV0aG9yIFh1ZWxlaSBGYW4KICAqLwpAQCAtODMsMTIgKzg4LDEyIEBACiAgICAgICAgIFNvY2tldENoYW5uZWwgc2MgPSBzc2MuYWNjZXB0KCk7CiAKICAgICAgICAgLy8gQ29tcGxldGUgY29ubmVjdGlvbi4KLSAgICAgICAgd2hpbGUgKCFzYy5maW5pc2hDb25uZWN0KCkgKSB7CisgICAgICAgIHdoaWxlICghc2MuZmluaXNoQ29ubmVjdCgpKSB7CiAgICAgICAgICAgICAvLyB3YWl0aW5nIGZvciB0aGUgY29ubmVjdGlvbiBjb21wbGV0ZWQuCiAgICAgICAgIH0KIAogICAgICAgICAvLyBoYW5kc2hha2luZwotICAgICAgICBoYW5kc2hha2luZyhzc2xlLCBzYyk7CisgICAgICAgIGhhbmRzaGFraW5nKHNzbGUsIHNjLCBudWxsKTsKIAogICAgICAgICAvLyByZWNlaXZlIGFwcGxpY2F0aW9uIGRhdGEKICAgICAgICAgcmVjZWl2ZShzc2xlLCBzYyk7CkBAIC0xMzEsNyArMTM2LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIGhhbmRzaGFraW5nCi0gICAgICAgIGhhbmRzaGFraW5nKHNzbGUsIHNjKTsKKyAgICAgICAgaGFuZHNoYWtpbmcoc3NsZSwgc2MsIG51bGwpOwogCiAgICAgICAgIC8vIHNlbmQgb3V0IGFwcGxpY2F0aW9uIGRhdGEKICAgICAgICAgZGVsaXZlcihzc2xlLCBzYyk7CkBAIC0xNjksNiArMTc0LDggQEAKICAgICAgKiBGb3JrIG9mZiB0aGUgb3RoZXIgc2lkZSwgdGhlbiBkbyB5b3VyIHdvcmsuCiAgICAgICovCiAgICAgTGFyZ2VQYWNrZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIoIi4uLy4uLy4uLy4uLy4uL2V0YyIpOworCiAgICAgICAgIGlmIChzZXBhcmF0ZVNlcnZlclRocmVhZCkgewogICAgICAgICAgICAgc3RhcnRTZXJ2ZXIodHJ1ZSk7CiAgICAgICAgICAgICBzdGFydENsaWVudChmYWxzZSk7CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvc3NsL2phdmF4L25ldC9zc2wvTmV3QVBJcy9TU0xFbmdpbmUvU1NMRW5naW5lU2VydmljZS5qYXZhIGIvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L3NzbC9qYXZheC9uZXQvc3NsL05ld0FQSXMvU1NMRW5naW5lL1NTTEVuZ2luZVNlcnZpY2UuamF2YQppbmRleCBiMDA3ODBlLi5iYzRjNmY3IDEwMDY0NAotLS0gYS9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvc3NsL2phdmF4L25ldC9zc2wvTmV3QVBJcy9TU0xFbmdpbmUvU1NMRW5naW5lU2VydmljZS5qYXZhCisrKyBiL2pkay90ZXN0L3N1bi9zZWN1cml0eS9zc2wvamF2YXgvbmV0L3NzbC9OZXdBUElzL1NTTEVuZ2luZS9TU0xFbmdpbmVTZXJ2aWNlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMiw4ICsyMiw2IEBACiAgKi8KIAogLyoKLSAqCi0gKgogICogQGJ1ZyA2Mzg4NDU2CiAgKiBAc3VtbWFyeSBOZWVkIGFkanVzdGFibGUgVExTIG1heCByZWNvcmQgc2l6ZSBmb3IgaW50ZXJvcGVyYWJpbGl0eQogICogICAgICB3aXRoIG5vbi1jb21wbGlhbnQgc3RhY2tzCkBAIC00MiwxNyArNDAsMzEgQEAKIAogcHVibGljIGNsYXNzIFNTTEVuZ2luZVNlcnZpY2UgewogCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHBhdGhUb1N0b3JlcyA9ICIuLi8uLi8uLi8uLi8uLi9ldGMiOwogICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBrZXlTdG9yZUZpbGUgPSAia2V5c3RvcmUiOwogICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyB0cnVzdFN0b3JlRmlsZSA9ICJ0cnVzdHN0b3JlIjsKICAgICBwcml2YXRlIHN0YXRpYyBjaGFyW10gcGFzc3BocmFzZSA9ICJwYXNzcGhyYXNlIi50b0NoYXJBcnJheSgpOwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGtleUZpbGVuYW1lID0KKyAgICBwcml2YXRlIFN0cmluZyBwYXRoVG9TdG9yZXM7CisgICAgcHJpdmF0ZSBTdHJpbmcga2V5RmlsZW5hbWU7CisgICAgcHJpdmF0ZSBTdHJpbmcgdHJ1c3RGaWxlbmFtZTsKKworICAgIHByb3RlY3RlZCBTU0xFbmdpbmVTZXJ2aWNlKCkgeworICAgICAgICBpbml0KCIuLi8uLi8uLi8uLi8uLi9ldGMiKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU1NMRW5naW5lU2VydmljZShTdHJpbmcgcGF0aFRvU3RvcmVzKSB7CisgICAgICAgIGluaXQocGF0aFRvU3RvcmVzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdChTdHJpbmcgcGF0aFRvU3RvcmVzKSB7CisgICAgICAgIHRoaXMucGF0aFRvU3RvcmVzID0gcGF0aFRvU3RvcmVzOworICAgICAgICB0aGlzLmtleUZpbGVuYW1lID0KICAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgidGVzdC5zcmMiLCAiLi8iKSArICIvIiArIHBhdGhUb1N0b3JlcyArCiAgICAgICAgICAgICAgICAgIi8iICsga2V5U3RvcmVGaWxlOwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyB0cnVzdEZpbGVuYW1lID0KKyAgICAgICAgdGhpcy50cnVzdEZpbGVuYW1lID0KICAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgidGVzdC5zcmMiLCAiLi8iKSArICIvIiArIHBhdGhUb1N0b3JlcyArCiAgICAgICAgICAgICAgICAgIi8iICsgdHJ1c3RTdG9yZUZpbGU7CisgICAgfQogCiAgICAgLy8gZGVsaXZlciBsb2NhbCBhcHBsaWNhdGlvbiBkYXRhLgogICAgIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBkZWxpdmVyKFNTTEVuZ2luZSBzc2xlLCBTb2NrZXRDaGFubmVsIHNjKQpAQCAtMTQzLDkgKzE1NSwxMiBAQAogICAgICAgICBCeXRlQnVmZmVyIHBlZXJOZXREYXRhID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZShuZXRCdWZmZXJNYXgvMik7CiAgICAgICAgIGludCByZWNlaXZlZCA9IC0xOwogCisgICAgICAgIGJvb2xlYW4gbmVlZFRvUmVhZE1vcmUgPSB0cnVlOwogICAgICAgICB3aGlsZSAocmVjZWl2ZWQgIT0gMCkgewotICAgICAgICAgICAgaWYgKHNzbGUuaXNJbmJvdW5kRG9uZSgpIHx8IHNjLnJlYWQocGVlck5ldERhdGEpIDwgMCkgewotICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgaWYgKG5lZWRUb1JlYWRNb3JlKSB7CisgICAgICAgICAgICAgICAgaWYgKHNzbGUuaXNJbmJvdW5kRG9uZSgpIHx8IHNjLnJlYWQocGVlck5ldERhdGEpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHBlZXJOZXREYXRhLmZsaXAoKTsKQEAgLTE4Niw2ICsyMDEsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIiBieXRlcyBsYXJnZSBwYWNrZXQgIik7CiAgICAgICAgICAgICAgICAgfQogCisgICAgICAgICAgICAgICAgbmVlZFRvUmVhZE1vcmUgPSAocGVlck5ldERhdGEucG9zaXRpb24oKSA+IDApID8gZmFsc2UgOiB0cnVlOworCiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgIGNhc2UgQlVGRkVSX09WRVJGTE9XIDoKQEAgLTIwNiw2ICsyMjMsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIiBieXRlcyBmb3IgQlVGRkVSX1VOREVSRkxPVyIpOwogICAgICAgICAgICAgICAgICAgICBwZWVyTmV0RGF0YSA9IGVubGFyZ2VCdWZmZXIocGVlck5ldERhdGEsIHNpemUpOwogICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG5lZWRUb1JlYWRNb3JlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgICAgZGVmYXVsdCA6IC8vIENMT1NFRCA6CkBAIC0yMTUsOCArMjM0LDggQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBoYW5kc2hha2luZyhTU0xFbmdpbmUgc3NsZSwgU29ja2V0Q2hhbm5lbCBzYykKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGhhbmRzaGFraW5nKFNTTEVuZ2luZSBzc2xlLCBTb2NrZXRDaGFubmVsIHNjLAorICAgICAgICAgICAgQnl0ZUJ1ZmZlciBhZGRpdGlvbmFsKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogICAgICAgICBpbnQgYXBwQnVmZmVyTWF4ID0gc3NsZS5nZXRTZXNzaW9uKCkuZ2V0QXBwbGljYXRpb25CdWZmZXJTaXplKCk7CiAgICAgICAgIGludCBuZXRCdWZmZXJNYXggPSBzc2xlLmdldFNlc3Npb24oKS5nZXRQYWNrZXRCdWZmZXJTaXplKCk7CkBAIC0yMzIsMTUgKzI1MSwzOSBAQAogICAgICAgICBTU0xFbmdpbmVSZXN1bHQuSGFuZHNoYWtlU3RhdHVzIGhzID0gc3NsZS5nZXRIYW5kc2hha2VTdGF0dXMoKTsKIAogICAgICAgICAvLyBzdGFydCBoYW5kc2hha2luZyBmcm9tIHVud3JhcAorICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbMHhGRl07CisgICAgICAgIGJvb2xlYW4gdW5kZXJmbG93ID0gZmFsc2U7CiAgICAgICAgIGRvIHsKICAgICAgICAgICAgIHN3aXRjaCAoaHMpIHsKIAogICAgICAgICAgICAgY2FzZSBORUVEX1VOV1JBUCA6CiAgICAgICAgICAgICAgICAgaWYgKHBlZXJOZXREYXRhLnBvc2l0aW9uKCkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoYWRkaXRpb25hbCAhPSBudWxsICYmIGFkZGl0aW9uYWwuaGFzUmVtYWluaW5nKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuID0gTWF0aC5taW4oYnVmZmVyLmxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlZXJOZXREYXRhLnJlbWFpbmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSBNYXRoLm1pbihsZW4sIGFkZGl0aW9uYWwucmVtYWluaW5nKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZW4gIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsLmdldChidWZmZXIsIDAsIGxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlZXJOZXREYXRhLnB1dChidWZmZXIsIDAsIGxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAocGVlck5ldERhdGEucmVtYWluaW5nKCkgPiAwICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsLmhhc1JlbWFpbmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzYy5yZWFkKHBlZXJOZXREYXRhKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2xlLmNsb3NlSW5ib3VuZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh1bmRlcmZsb3cpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKHNjLnJlYWQocGVlck5ldERhdGEpIDwgMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgc3NsZS5jbG9zZUluYm91bmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHVuZGVyZmxvdyA9IGZhbHNlOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIHBlZXJOZXREYXRhLmZsaXAoKTsKQEAgLTI1OSw2ICszMDIsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplICsgIiBieXRlcyBmb3IgQlVGRkVSX1VOREVSRkxPVyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgcGVlck5ldERhdGEgPSBlbmxhcmdlQnVmZmVyKHBlZXJOZXREYXRhLCBzaXplKTsKICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHVuZGVyZmxvdyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgQlVGRkVSX09WRVJGTE9XIDoKICAgICAgICAgICAgICAgICAgICAgLy8gbWF5YmUgbmVlZCB0byBlbmxhcmdlIHRoZSBwZWVyIGFwcGxpY2F0aW9uIGRhdGEgYnVmZmVyLgpAQCAtMzM5LDcgKzM4NCw3IEBACiAgICAgLyoKICAgICAgKiBDcmVhdGUgYW4gaW5pdGlhbGl6ZWQgU1NMQ29udGV4dCB0byB1c2UgZm9yIHRoaXMgdGVzdC4KICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIFNTTEVuZ2luZSBjcmVhdGVTU0xFbmdpbmUoYm9vbGVhbiBtb2RlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBwcm90ZWN0ZWQgU1NMRW5naW5lIGNyZWF0ZVNTTEVuZ2luZShib29sZWFuIG1vZGUpIHRocm93cyBFeGNlcHRpb24gewogCiAgICAgICAgIFNTTEVuZ2luZSBzc2xlOwogCmRpZmYgLS1naXQgYS9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvc3NsL2phdmF4L25ldC9zc2wvU2VydmVyTmFtZS9TU0xFbmdpbmVFeHBsb3Jlci5qYXZhIGIvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L3NzbC9qYXZheC9uZXQvc3NsL1NlcnZlck5hbWUvU1NMRW5naW5lRXhwbG9yZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2Q0NjM1Ci0tLSAvZGV2L251bGwKKysrIGIvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L3NzbC9qYXZheC9uZXQvc3NsL1NlcnZlck5hbWUvU1NMRW5naW5lRXhwbG9yZXIuamF2YQpAQCAtMCwwICsxLDMzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQorICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQorICogcXVlc3Rpb25zLgorICovCisKKy8vCisvLyBTdW5KU1NFIGRvZXMgbm90IHN1cHBvcnQgZHluYW1pYyBzeXN0ZW0gcHJvcGVydGllcywgbm8gd2F5IHRvIHJlLXVzZQorLy8gc3lzdGVtIHByb3BlcnRpZXMgaW4gc2FtZXZtL2FnZW50dm0gbW9kZS4KKy8vCisKKy8qCisgKiBAdGVzdAorICogQGJ1ZyA3MDY4MzIxCisgKiBAc3VtbWFyeSBTdXBwb3J0IFRMUyBTZXJ2ZXIgTmFtZSBJbmRpY2F0aW9uIChTTkkpIEV4dGVuc2lvbiBpbiBKU1NFIFNlcnZlcgorICogQGxpYnJhcnkgLi4vTmV3QVBJcy9TU0xFbmdpbmUgLi4vLi4vLi4vLi4vdGVtcGxhdGVzCisgKiBAYnVpbGQgU1NMRW5naW5lU2VydmljZSBTU0xDYXBhYmlsaXRpZXMgU1NMRXhwbG9yZXIKKyAqIEBydW4gbWFpbi9vdGhlcnZtIFNTTEVuZ2luZUV4cGxvcmVyIFNTTHYySGVsbG8sU1NMdjMKKyAqIEBydW4gbWFpbi9vdGhlcnZtIFNTTEVuZ2luZUV4cGxvcmVyIFNTTHYzCisgKiBAcnVuIG1haW4vb3RoZXJ2bSBTU0xFbmdpbmVFeHBsb3JlciBUTFN2MQorICogQHJ1biBtYWluL290aGVydm0gU1NMRW5naW5lRXhwbG9yZXIgVExTdjEuMQorICogQHJ1biBtYWluL290aGVydm0gU1NMRW5naW5lRXhwbG9yZXIgVExTdjEuMgorICovCisKK2ltcG9ydCBqYXZheC5uZXQuc3NsLio7CitpbXBvcnQgamF2YS5uaW8uKjsKK2ltcG9ydCBqYXZhLm5ldC4qOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLio7CisKK3B1YmxpYyBjbGFzcyBTU0xFbmdpbmVFeHBsb3JlciBleHRlbmRzIFNTTEVuZ2luZVNlcnZpY2UgeworCisgICAgLyoKKyAgICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICogU2V0IHRoZSB2YXJpb3VzIHZhcmlhYmxlcyBuZWVkZWQgZm9yIHRoZSB0ZXN0cywgdGhlbgorICAgICAqIHNwZWNpZnkgd2hhdCB0ZXN0cyB0byBydW4gb24gZWFjaCBzaWRlLgorICAgICAqLworCisgICAgLyoKKyAgICAgKiBTaG91bGQgd2UgcnVuIHRoZSBjbGllbnQgb3Igc2VydmVyIGluIGEgc2VwYXJhdGUgdGhyZWFkPworICAgICAqIEJvdGggc2lkZXMgY2FuIHRocm93IGV4Y2VwdGlvbnMsIGJ1dCBkbyB5b3UgaGF2ZSBhIHByZWZlcmVuY2UKKyAgICAgKiBhcyB0byB3aGljaCBzaWRlIHNob3VsZCBiZSB0aGUgbWFpbiB0aHJlYWQuCisgICAgICovCisgICAgc3RhdGljIGJvb2xlYW4gc2VwYXJhdGVTZXJ2ZXJUaHJlYWQgPSB0cnVlOworCisgICAgLy8gSXMgdGhlIHNlcnZlciByZWFkeSB0byBzZXJ2ZT8KKyAgICB2b2xhdGlsZSBzdGF0aWMgYm9vbGVhbiBzZXJ2ZXJSZWFkeSA9IGZhbHNlOworCisgICAgLyoKKyAgICAgKiBUdXJuIG9uIFNTTCBkZWJ1Z2dpbmc/CisgICAgICovCisgICAgc3RhdGljIGJvb2xlYW4gZGVidWcgPSBmYWxzZTsKKworICAgIC8qCisgICAgICogRGVmaW5lIHRoZSBzZXJ2ZXIgc2lkZSBvZiB0aGUgdGVzdC4KKyAgICAgKgorICAgICAqIElmIHRoZSBzZXJ2ZXIgcHJlbWF0dXJlbHkgZXhpdHMsIHNlcnZlclJlYWR5IHdpbGwgYmUgc2V0IHRvIHRydWUKKyAgICAgKiB0byBhdm9pZCBpbmZpbml0ZSBoYW5ncy4KKyAgICAgKi8KKyAgICB2b2lkIGRvU2VydmVyU2lkZSgpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIC8vIGNyZWF0ZSBTU0xFbmdpbmUuCisgICAgICAgIFNTTEVuZ2luZSBzc2xlID0gY3JlYXRlU1NMRW5naW5lKGZhbHNlKTsKKworICAgICAgICAvLyBDcmVhdGUgYSBzZXJ2ZXIgc29ja2V0IGNoYW5uZWwuCisgICAgICAgIEluZXRTb2NrZXRBZGRyZXNzIGlzYSA9CisgICAgICAgICAgICAgICAgbmV3IEluZXRTb2NrZXRBZGRyZXNzKEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLCBzZXJ2ZXJQb3J0KTsKKyAgICAgICAgU2VydmVyU29ja2V0Q2hhbm5lbCBzc2MgPSBTZXJ2ZXJTb2NrZXRDaGFubmVsLm9wZW4oKTsKKyAgICAgICAgc3NjLnNvY2tldCgpLmJpbmQoaXNhKTsKKyAgICAgICAgc2VydmVyUG9ydCA9IHNzYy5zb2NrZXQoKS5nZXRMb2NhbFBvcnQoKTsKKworICAgICAgICAvLyBTaWduYWwgQ2xpZW50LCB3ZSdyZSByZWFkeSBmb3IgaGlzIGNvbm5lY3QuCisgICAgICAgIHNlcnZlclJlYWR5ID0gdHJ1ZTsKKworICAgICAgICAvLyBBY2NlcHQgYSBzb2NrZXQgY2hhbm5lbC4KKyAgICAgICAgU29ja2V0Q2hhbm5lbCBzYyA9IHNzYy5hY2NlcHQoKTsKKyAgICAgICAgc2MuY29uZmlndXJlQmxvY2tpbmcoZmFsc2UpOworCisgICAgICAgIC8vIENvbXBsZXRlIGNvbm5lY3Rpb24uCisgICAgICAgIHdoaWxlICghc2MuZmluaXNoQ29ubmVjdCgpKSB7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoNTApOworICAgICAgICAgICAgLy8gd2FpdGluZyBmb3IgdGhlIGNvbm5lY3Rpb24gY29tcGxldGVkLgorICAgICAgICB9CisKKyAgICAgICAgQnl0ZUJ1ZmZlciBidWZmZXIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKDB4RkYpOworICAgICAgICBpbnQgcG9zaXRpb24gPSAwOworICAgICAgICBTU0xDYXBhYmlsaXRpZXMgY2FwYWJpbGl0aWVzID0gbnVsbDsKKworICAgICAgICAvLyBSZWFkIHRoZSBoZWFkZXIgb2YgVExTIHJlY29yZAorICAgICAgICBidWZmZXIubGltaXQoU1NMRXhwbG9yZXIuUkVDT1JEX0hFQURFUl9TSVpFKTsKKyAgICAgICAgd2hpbGUgKHBvc2l0aW9uIDwgU1NMRXhwbG9yZXIuUkVDT1JEX0hFQURFUl9TSVpFKSB7CisgICAgICAgICAgICBpbnQgbiA9IHNjLnJlYWQoYnVmZmVyKTsKKyAgICAgICAgICAgIGlmIChuIDwgMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oInVuZXhwZWN0ZWQgZW5kIG9mIHN0cmVhbSEiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBvc2l0aW9uICs9IG47CisgICAgICAgIH0KKyAgICAgICAgYnVmZmVyLmZsaXAoKTsKKworICAgICAgICBpbnQgcmVjb3JkTGVuZ3RoID0gU1NMRXhwbG9yZXIuZ2V0UmVxdWlyZWRTaXplKGJ1ZmZlcik7CisgICAgICAgIGlmIChidWZmZXIuY2FwYWNpdHkoKSA8IHJlY29yZExlbmd0aCkgeworICAgICAgICAgICAgQnl0ZUJ1ZmZlciBvbGRCdWZmZXIgPSBidWZmZXI7CisgICAgICAgICAgICBidWZmZXIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKHJlY29yZExlbmd0aCk7CisgICAgICAgICAgICBidWZmZXIucHV0KG9sZEJ1ZmZlcik7CisgICAgICAgIH0KKworICAgICAgICBidWZmZXIucG9zaXRpb24oU1NMRXhwbG9yZXIuUkVDT1JEX0hFQURFUl9TSVpFKTsKKyAgICAgICAgYnVmZmVyLmxpbWl0KGJ1ZmZlci5jYXBhY2l0eSgpKTsKKyAgICAgICAgd2hpbGUgKHBvc2l0aW9uIDwgcmVjb3JkTGVuZ3RoKSB7CisgICAgICAgICAgICBpbnQgbiA9IHNjLnJlYWQoYnVmZmVyKTsKKyAgICAgICAgICAgIGlmIChuIDwgMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oInVuZXhwZWN0ZWQgZW5kIG9mIHN0cmVhbSEiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBvc2l0aW9uICs9IG47CisgICAgICAgIH0KKyAgICAgICAgYnVmZmVyLmZsaXAoKTsKKworICAgICAgICBjYXBhYmlsaXRpZXMgPSBTU0xFeHBsb3Jlci5leHBsb3JlKGJ1ZmZlcik7CisgICAgICAgIGlmIChjYXBhYmlsaXRpZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSZWNvcmQgdmVyc2lvbjogIiArCisgICAgICAgICAgICAgICAgICAgIGNhcGFiaWxpdGllcy5nZXRSZWNvcmRWZXJzaW9uKCkpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJIZWxsbyB2ZXJzaW9uOiAiICsKKyAgICAgICAgICAgICAgICAgICAgY2FwYWJpbGl0aWVzLmdldEhlbGxvVmVyc2lvbigpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGhhbmRzaGFraW5nCisgICAgICAgIGhhbmRzaGFraW5nKHNzbGUsIHNjLCBidWZmZXIpOworCisgICAgICAgIC8vIHJlY2VpdmUgYXBwbGljYXRpb24gZGF0YQorICAgICAgICByZWNlaXZlKHNzbGUsIHNjKTsKKworICAgICAgICAvLyBzZW5kIG91dCBhcHBsaWNhdGlvbiBkYXRhCisgICAgICAgIGRlbGl2ZXIoc3NsZSwgc2MpOworCisgICAgICAgIEV4dGVuZGVkU1NMU2Vzc2lvbiBzZXNzaW9uID0gKEV4dGVuZGVkU1NMU2Vzc2lvbilzc2xlLmdldFNlc3Npb24oKTsKKyAgICAgICAgY2hlY2tDYXBhYmlsaXRpZXMoY2FwYWJpbGl0aWVzLCBzZXNzaW9uKTsKKworICAgICAgICAvLyBjbG9zZSB0aGUgc29ja2V0IGNoYW5uZWwuCisgICAgICAgIHNjLmNsb3NlKCk7CisgICAgICAgIHNzYy5jbG9zZSgpOworICAgIH0KKworICAgIC8qCisgICAgICogRGVmaW5lIHRoZSBjbGllbnQgc2lkZSBvZiB0aGUgdGVzdC4KKyAgICAgKgorICAgICAqIElmIHRoZSBzZXJ2ZXIgcHJlbWF0dXJlbHkgZXhpdHMsIHNlcnZlclJlYWR5IHdpbGwgYmUgc2V0IHRvIHRydWUKKyAgICAgKiB0byBhdm9pZCBpbmZpbml0ZSBoYW5ncy4KKyAgICAgKi8KKyAgICB2b2lkIGRvQ2xpZW50U2lkZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBjcmVhdGUgU1NMRW5naW5lLgorICAgICAgICBTU0xFbmdpbmUgc3NsZSA9IGNyZWF0ZVNTTEVuZ2luZSh0cnVlKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBXYWl0IGZvciBzZXJ2ZXIgdG8gZ2V0IHN0YXJ0ZWQuCisgICAgICAgICAqLworICAgICAgICB3aGlsZSAoIXNlcnZlclJlYWR5KSB7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoNTApOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ3JlYXRlIGEgbm9uLWJsb2NraW5nIHNvY2tldCBjaGFubmVsLgorICAgICAgICBTb2NrZXRDaGFubmVsIHNjID0gU29ja2V0Q2hhbm5lbC5vcGVuKCk7CisgICAgICAgIHNjLmNvbmZpZ3VyZUJsb2NraW5nKGZhbHNlKTsKKyAgICAgICAgSW5ldFNvY2tldEFkZHJlc3MgaXNhID0KKyAgICAgICAgICAgICAgICBuZXcgSW5ldFNvY2tldEFkZHJlc3MoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCksIHNlcnZlclBvcnQpOworICAgICAgICBzYy5jb25uZWN0KGlzYSk7CisKKyAgICAgICAgLy8gQ29tcGxldGUgY29ubmVjdGlvbi4KKyAgICAgICAgd2hpbGUgKCFzYy5maW5pc2hDb25uZWN0KCkgKSB7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoNTApOworICAgICAgICAgICAgLy8gd2FpdGluZyBmb3IgdGhlIGNvbm5lY3Rpb24gY29tcGxldGVkLgorICAgICAgICB9CisKKyAgICAgICAgLy8gZW5hYmxlIHRoZSBzcGVjaWZpZWQgVExTIHByb3RvY29sCisgICAgICAgIHNzbGUuc2V0RW5hYmxlZFByb3RvY29scyhzdXBwb3J0ZWRQcm90b2NvbHMpOworCisgICAgICAgIC8vIGhhbmRzaGFraW5nCisgICAgICAgIGhhbmRzaGFraW5nKHNzbGUsIHNjLCBudWxsKTsKKworICAgICAgICAvLyBzZW5kIG91dCBhcHBsaWNhdGlvbiBkYXRhCisgICAgICAgIGRlbGl2ZXIoc3NsZSwgc2MpOworCisgICAgICAgIC8vIHJlY2VpdmUgYXBwbGljYXRpb24gZGF0YQorICAgICAgICByZWNlaXZlKHNzbGUsIHNjKTsKKworICAgICAgICAvLyBjbG9zZSB0aGUgc29ja2V0IGNoYW5uZWwuCisgICAgICAgIHNjLmNsb3NlKCk7CisgICAgfQorCisgICAgdm9pZCBjaGVja0NhcGFiaWxpdGllcyhTU0xDYXBhYmlsaXRpZXMgY2FwYWJpbGl0aWVzLAorICAgICAgICAgICAgRXh0ZW5kZWRTU0xTZXNzaW9uIHNlc3Npb24pIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIExpc3Q8U05JU2VydmVyTmFtZT4gc2Vzc2lvblNOSSA9IHNlc3Npb24uZ2V0UmVxdWVzdGVkU2VydmVyTmFtZXMoKTsKKyAgICAgICAgaWYgKCFzZXNzaW9uU05JLmVxdWFscyhjYXBhYmlsaXRpZXMuZ2V0U2VydmVyTmFtZXMoKSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJzZXJ2ZXIgbmFtZSBpbmRpY2F0aW9uIGRvZXMgbm90IG1hdGNoIGNhcGFiaWxpdGllcyIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gc3VwcG9ydGVkUHJvdG9jb2xzOyAgICAvLyBzdXBwb3J0ZWQgcHJvdG9jb2xzCisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHBhcnNlQXJndW1lbnRzKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgc3VwcG9ydGVkUHJvdG9jb2xzID0gYXJnc1swXS5zcGxpdCgiLCIpOworICAgIH0KKworCisgICAgLyoKKyAgICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICogVGhlIHJlbWFpbmRlciBpcyBqdXN0IHN1cHBvcnQgc3R1ZmYKKyAgICAgKi8KKyAgICB2b2xhdGlsZSBFeGNlcHRpb24gc2VydmVyRXhjZXB0aW9uID0gbnVsbDsKKyAgICB2b2xhdGlsZSBFeGNlcHRpb24gY2xpZW50RXhjZXB0aW9uID0gbnVsbDsKKworICAgIC8vIHVzZSBhbnkgZnJlZSBwb3J0IGJ5IGRlZmF1bHQKKyAgICB2b2xhdGlsZSBpbnQgc2VydmVyUG9ydCA9IDA7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGRlYnVnKQorICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJqYXZheC5uZXQuZGVidWciLCAiYWxsIik7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogR2V0IHRoZSBjdXN0b21pemVkIGFyZ3VtZW50cy4KKyAgICAgICAgICovCisgICAgICAgIHBhcnNlQXJndW1lbnRzKGFyZ3MpOworCisgICAgICAgIG5ldyBTU0xFbmdpbmVFeHBsb3JlcigpOworICAgIH0KKworICAgIFRocmVhZCBjbGllbnRUaHJlYWQgPSBudWxsOworICAgIFRocmVhZCBzZXJ2ZXJUaHJlYWQgPSBudWxsOworCisgICAgLyoKKyAgICAgKiBQcmltYXJ5IGNvbnN0cnVjdG9yLCB1c2VkIHRvIGRyaXZlIHJlbWFpbmRlciBvZiB0aGUgdGVzdC4KKyAgICAgKgorICAgICAqIEZvcmsgb2ZmIHRoZSBvdGhlciBzaWRlLCB0aGVuIGRvIHlvdXIgd29yay4KKyAgICAgKi8KKyAgICBTU0xFbmdpbmVFeHBsb3JlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlcigiLi4vLi4vLi4vLi4vZXRjIik7CisKKyAgICAgICAgaWYgKHNlcGFyYXRlU2VydmVyVGhyZWFkKSB7CisgICAgICAgICAgICBzdGFydFNlcnZlcih0cnVlKTsKKyAgICAgICAgICAgIHN0YXJ0Q2xpZW50KGZhbHNlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXJ0Q2xpZW50KHRydWUpOworICAgICAgICAgICAgc3RhcnRTZXJ2ZXIoZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogV2FpdCBmb3Igb3RoZXIgc2lkZSB0byBjbG9zZSBkb3duLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHNlcGFyYXRlU2VydmVyVGhyZWFkKSB7CisgICAgICAgICAgICBzZXJ2ZXJUaHJlYWQuam9pbigpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2xpZW50VGhyZWFkLmpvaW4oKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIFdoZW4gd2UgZ2V0IGhlcmUsIHRoZSB0ZXN0IGlzIHByZXR0eSBtdWNoIG92ZXIuCisgICAgICAgICAqCisgICAgICAgICAqIElmIHRoZSBtYWluIHRocmVhZCBleGNlcHRlZCwgdGhhdCBwcm9wYWdhdGVzIGJhY2sKKyAgICAgICAgICogaW1tZWRpYXRlbHkuICBJZiB0aGUgb3RoZXIgdGhyZWFkIHRocmV3IGFuIGV4Y2VwdGlvbiwgd2UKKyAgICAgICAgICogc2hvdWxkIHJlcG9ydCBiYWNrLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHNlcnZlckV4Y2VwdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJTZXJ2ZXIgRXhjZXB0aW9uOiIpOworICAgICAgICAgICAgdGhyb3cgc2VydmVyRXhjZXB0aW9uOworICAgICAgICB9CisgICAgICAgIGlmIChjbGllbnRFeGNlcHRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiQ2xpZW50IEV4Y2VwdGlvbjoiKTsKKyAgICAgICAgICAgIHRocm93IGNsaWVudEV4Y2VwdGlvbjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgc3RhcnRTZXJ2ZXIoYm9vbGVhbiBuZXdUaHJlYWQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAobmV3VGhyZWFkKSB7CisgICAgICAgICAgICBzZXJ2ZXJUaHJlYWQgPSBuZXcgVGhyZWFkKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvU2VydmVyU2lkZSgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIE91ciBzZXJ2ZXIgdGhyZWFkIGp1c3QgZGllZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBSZWxlYXNlIHRoZSBjbGllbnQsIGlmIG5vdCBhY3RpdmUgYWxyZWFkeS4uLgorICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlNlcnZlciBkaWVkLi4uIik7CisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJSZWFkeSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJFeGNlcHRpb24gPSBlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHNlcnZlclRocmVhZC5zdGFydCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZG9TZXJ2ZXJTaWRlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHN0YXJ0Q2xpZW50KGJvb2xlYW4gbmV3VGhyZWFkKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG5ld1RocmVhZCkgeworICAgICAgICAgICAgY2xpZW50VGhyZWFkID0gbmV3IFRocmVhZCgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkb0NsaWVudFNpZGUoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBPdXIgY2xpZW50IHRocmVhZCBqdXN0IGRpZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiQ2xpZW50IGRpZWQuLi4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudEV4Y2VwdGlvbiA9IGU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgY2xpZW50VGhyZWFkLnN0YXJ0KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkb0NsaWVudFNpZGUoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2pkay90ZXN0L3N1bi9zZWN1cml0eS9zc2wvamF2YXgvbmV0L3NzbC9TZXJ2ZXJOYW1lL1NTTEVuZ2luZUV4cGxvcmVyTWF0Y2hlZFNOSS5qYXZhIGIvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L3NzbC9qYXZheC9uZXQvc3NsL1NlcnZlck5hbWUvU1NMRW5naW5lRXhwbG9yZXJNYXRjaGVkU05JLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzIwMWJlZQotLS0gL2Rldi9udWxsCisrKyBiL2pkay90ZXN0L3N1bi9zZWN1cml0eS9zc2wvamF2YXgvbmV0L3NzbC9TZXJ2ZXJOYW1lL1NTTEVuZ2luZUV4cGxvcmVyTWF0Y2hlZFNOSS5qYXZhCkBAIC0wLDAgKzEsMzkzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCisgKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CisgKiBxdWVzdGlvbnMuCisgKi8KKworLy8KKy8vIFN1bkpTU0UgZG9lcyBub3Qgc3VwcG9ydCBkeW5hbWljIHN5c3RlbSBwcm9wZXJ0aWVzLCBubyB3YXkgdG8gcmUtdXNlCisvLyBzeXN0ZW0gcHJvcGVydGllcyBpbiBzYW1ldm0vYWdlbnR2bSBtb2RlLgorLy8KKworLyoKKyAqIEB0ZXN0CisgKiBAYnVnIDcwNjgzMjEKKyAqIEBzdW1tYXJ5IFN1cHBvcnQgVExTIFNlcnZlciBOYW1lIEluZGljYXRpb24gKFNOSSkgRXh0ZW5zaW9uIGluIEpTU0UgU2VydmVyCisgKiBAbGlicmFyeSAuLi9OZXdBUElzL1NTTEVuZ2luZSAuLi8uLi8uLi8uLi90ZW1wbGF0ZXMKKyAqIEBidWlsZCBTU0xFbmdpbmVTZXJ2aWNlIFNTTENhcGFiaWxpdGllcyBTU0xFeHBsb3JlcgorICogQHJ1biBtYWluL290aGVydm0gU1NMRW5naW5lRXhwbG9yZXJNYXRjaGVkU05JIHd3dy5leGFtcGxlLmNvbQorICogICAgIHd3d1wuZXhhbXBsZVwuY29tCisgKiBAcnVuIG1haW4vb3RoZXJ2bSBTU0xFbmdpbmVFeHBsb3Jlck1hdGNoZWRTTkkgd3d3LmV4YW1wbGUuY29tCisgKiAgICAgd3d3XC5leGFtcGxlXC4oY29tfG9yZykKKyAqIEBydW4gbWFpbi9vdGhlcnZtIFNTTEVuZ2luZUV4cGxvcmVyTWF0Y2hlZFNOSSBleGFtcGxlLmNvbQorICogICAgICguKlwuKSpleGFtcGxlXC4oY29tfG9yZykKKyAqIEBydW4gbWFpbi9vdGhlcnZtIFNTTEVuZ2luZUV4cGxvcmVyTWF0Y2hlZFNOSSB3d3cuZXhhbXBsZS5jb20KKyAqICAgICAoLipcLikqZXhhbXBsZVwuKGNvbXxvcmcpCisgKiBAcnVuIG1haW4vb3RoZXJ2bSBTU0xFbmdpbmVFeHBsb3Jlck1hdGNoZWRTTkkgd3d3LnVzLmV4YW1wbGUuY29tCisgKiAgICAgKC4qXC4pKmV4YW1wbGVcLihjb218b3JnKQorICovCisKK2ltcG9ydCBqYXZheC5uZXQuc3NsLio7CitpbXBvcnQgamF2YS5uaW8uKjsKK2ltcG9ydCBqYXZhLm5ldC4qOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLio7CisKK3B1YmxpYyBjbGFzcyBTU0xFbmdpbmVFeHBsb3Jlck1hdGNoZWRTTkkgZXh0ZW5kcyBTU0xFbmdpbmVTZXJ2aWNlIHsKKworICAgIC8qCisgICAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAqIFNldCB0aGUgdmFyaW91cyB2YXJpYWJsZXMgbmVlZGVkIGZvciB0aGUgdGVzdHMsIHRoZW4KKyAgICAgKiBzcGVjaWZ5IHdoYXQgdGVzdHMgdG8gcnVuIG9uIGVhY2ggc2lkZS4KKyAgICAgKi8KKworICAgIC8qCisgICAgICogU2hvdWxkIHdlIHJ1biB0aGUgY2xpZW50IG9yIHNlcnZlciBpbiBhIHNlcGFyYXRlIHRocmVhZD8KKyAgICAgKiBCb3RoIHNpZGVzIGNhbiB0aHJvdyBleGNlcHRpb25zLCBidXQgZG8geW91IGhhdmUgYSBwcmVmZXJlbmNlCisgICAgICogYXMgdG8gd2hpY2ggc2lkZSBzaG91bGQgYmUgdGhlIG1haW4gdGhyZWFkLgorICAgICAqLworICAgIHN0YXRpYyBib29sZWFuIHNlcGFyYXRlU2VydmVyVGhyZWFkID0gZmFsc2U7CisKKyAgICAvLyBJcyB0aGUgc2VydmVyIHJlYWR5IHRvIHNlcnZlPworICAgIHZvbGF0aWxlIHN0YXRpYyBib29sZWFuIHNlcnZlclJlYWR5ID0gZmFsc2U7CisKKyAgICAvKgorICAgICAqIFR1cm4gb24gU1NMIGRlYnVnZ2luZz8KKyAgICAgKi8KKyAgICBzdGF0aWMgYm9vbGVhbiBkZWJ1ZyA9IGZhbHNlOworCisgICAgLyoKKyAgICAgKiBEZWZpbmUgdGhlIHNlcnZlciBzaWRlIG9mIHRoZSB0ZXN0LgorICAgICAqCisgICAgICogSWYgdGhlIHNlcnZlciBwcmVtYXR1cmVseSBleGl0cywgc2VydmVyUmVhZHkgd2lsbCBiZSBzZXQgdG8gdHJ1ZQorICAgICAqIHRvIGF2b2lkIGluZmluaXRlIGhhbmdzLgorICAgICAqLworICAgIHZvaWQgZG9TZXJ2ZXJTaWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gY3JlYXRlIFNTTEVuZ2luZS4KKyAgICAgICAgU1NMRW5naW5lIHNzbGUgPSBjcmVhdGVTU0xFbmdpbmUoZmFsc2UpOworCisgICAgICAgIC8vIENyZWF0ZSBhIHNlcnZlciBzb2NrZXQgY2hhbm5lbC4KKyAgICAgICAgSW5ldFNvY2tldEFkZHJlc3MgaXNhID0KKyAgICAgICAgICAgICAgICBuZXcgSW5ldFNvY2tldEFkZHJlc3MoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCksIHNlcnZlclBvcnQpOworICAgICAgICBTZXJ2ZXJTb2NrZXRDaGFubmVsIHNzYyA9IFNlcnZlclNvY2tldENoYW5uZWwub3BlbigpOworICAgICAgICBzc2Muc29ja2V0KCkuYmluZChpc2EpOworICAgICAgICBzZXJ2ZXJQb3J0ID0gc3NjLnNvY2tldCgpLmdldExvY2FsUG9ydCgpOworCisgICAgICAgIC8vIFNpZ25hbCBDbGllbnQsIHdlJ3JlIHJlYWR5IGZvciBoaXMgY29ubmVjdC4KKyAgICAgICAgc2VydmVyUmVhZHkgPSB0cnVlOworCisgICAgICAgIC8vIEFjY2VwdCBhIHNvY2tldCBjaGFubmVsLgorICAgICAgICBTb2NrZXRDaGFubmVsIHNjID0gc3NjLmFjY2VwdCgpOworCisgICAgICAgIC8vIENvbXBsZXRlIGNvbm5lY3Rpb24uCisgICAgICAgIHdoaWxlICghc2MuZmluaXNoQ29ubmVjdCgpKSB7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoNTApOworICAgICAgICAgICAgLy8gd2FpdGluZyBmb3IgdGhlIGNvbm5lY3Rpb24gY29tcGxldGVkLgorICAgICAgICB9CisKKyAgICAgICAgQnl0ZUJ1ZmZlciBidWZmZXIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKDB4RkYpOworICAgICAgICBpbnQgcG9zaXRpb24gPSAwOworICAgICAgICBTU0xDYXBhYmlsaXRpZXMgY2FwYWJpbGl0aWVzID0gbnVsbDsKKworICAgICAgICAvLyBSZWFkIHRoZSBoZWFkZXIgb2YgVExTIHJlY29yZAorICAgICAgICBidWZmZXIubGltaXQoU1NMRXhwbG9yZXIuUkVDT1JEX0hFQURFUl9TSVpFKTsKKyAgICAgICAgd2hpbGUgKHBvc2l0aW9uIDwgU1NMRXhwbG9yZXIuUkVDT1JEX0hFQURFUl9TSVpFKSB7CisgICAgICAgICAgICBpbnQgbiA9IHNjLnJlYWQoYnVmZmVyKTsKKyAgICAgICAgICAgIGlmIChuIDwgMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oInVuZXhwZWN0ZWQgZW5kIG9mIHN0cmVhbSEiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBvc2l0aW9uICs9IG47CisgICAgICAgIH0KKyAgICAgICAgYnVmZmVyLmZsaXAoKTsKKworICAgICAgICBpbnQgcmVjb3JkTGVuZ3RoID0gU1NMRXhwbG9yZXIuZ2V0UmVxdWlyZWRTaXplKGJ1ZmZlcik7CisgICAgICAgIGlmIChidWZmZXIuY2FwYWNpdHkoKSA8IHJlY29yZExlbmd0aCkgeworICAgICAgICAgICAgQnl0ZUJ1ZmZlciBvbGRCdWZmZXIgPSBidWZmZXI7CisgICAgICAgICAgICBidWZmZXIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKHJlY29yZExlbmd0aCk7CisgICAgICAgICAgICBidWZmZXIucHV0KG9sZEJ1ZmZlcik7CisgICAgICAgIH0KKworICAgICAgICBidWZmZXIucG9zaXRpb24oU1NMRXhwbG9yZXIuUkVDT1JEX0hFQURFUl9TSVpFKTsKKyAgICAgICAgYnVmZmVyLmxpbWl0KGJ1ZmZlci5jYXBhY2l0eSgpKTsKKyAgICAgICAgd2hpbGUgKHBvc2l0aW9uIDwgcmVjb3JkTGVuZ3RoKSB7CisgICAgICAgICAgICBpbnQgbiA9IHNjLnJlYWQoYnVmZmVyKTsKKyAgICAgICAgICAgIGlmIChuIDwgMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oInVuZXhwZWN0ZWQgZW5kIG9mIHN0cmVhbSEiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBvc2l0aW9uICs9IG47CisgICAgICAgIH0KKyAgICAgICAgYnVmZmVyLmZsaXAoKTsKKworICAgICAgICBjYXBhYmlsaXRpZXMgPSBTU0xFeHBsb3Jlci5leHBsb3JlKGJ1ZmZlcik7CisgICAgICAgIGlmIChjYXBhYmlsaXRpZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSZWNvcmQgdmVyc2lvbjogIiArCisgICAgICAgICAgICAgICAgICAgIGNhcGFiaWxpdGllcy5nZXRSZWNvcmRWZXJzaW9uKCkpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJIZWxsbyB2ZXJzaW9uOiAiICsKKyAgICAgICAgICAgICAgICAgICAgY2FwYWJpbGl0aWVzLmdldEhlbGxvVmVyc2lvbigpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGVuYWJsZSBzZXJ2ZXIgbmFtZSBpbmRpY2F0aW9uIGNoZWNraW5nCisgICAgICAgIFNOSU1hdGNoZXIgbWF0Y2hlciA9IFNOSUhvc3ROYW1lLmNyZWF0ZVNOSU1hdGNoZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJBY2NlcHRhYmxlSG9zdG5hbWUpOworICAgICAgICBDb2xsZWN0aW9uPFNOSU1hdGNoZXI+IG1hdGNoZXJzID0gbmV3IEFycmF5TGlzdDw+KDEpOworICAgICAgICBtYXRjaGVycy5hZGQobWF0Y2hlcik7CisgICAgICAgIFNTTFBhcmFtZXRlcnMgcGFyYW1zID0gc3NsZS5nZXRTU0xQYXJhbWV0ZXJzKCk7CisgICAgICAgIHBhcmFtcy5zZXRTTklNYXRjaGVycyhtYXRjaGVycyk7CisgICAgICAgIHNzbGUuc2V0U1NMUGFyYW1ldGVycyhwYXJhbXMpOworCisgICAgICAgIC8vIGhhbmRzaGFraW5nCisgICAgICAgIGhhbmRzaGFraW5nKHNzbGUsIHNjLCBidWZmZXIpOworCisgICAgICAgIC8vIHJlY2VpdmUgYXBwbGljYXRpb24gZGF0YQorICAgICAgICByZWNlaXZlKHNzbGUsIHNjKTsKKworICAgICAgICAvLyBzZW5kIG91dCBhcHBsaWNhdGlvbiBkYXRhCisgICAgICAgIGRlbGl2ZXIoc3NsZSwgc2MpOworCisgICAgICAgIC8vIGNoZWNrIHNlcnZlciBuYW1lIGluZGljYXRpb24KKyAgICAgICAgRXh0ZW5kZWRTU0xTZXNzaW9uIHNlc3Npb24gPSAoRXh0ZW5kZWRTU0xTZXNzaW9uKXNzbGUuZ2V0U2Vzc2lvbigpOworICAgICAgICBjaGVja0NhcGFiaWxpdGllcyhjYXBhYmlsaXRpZXMsIHNlc3Npb24pOworCisgICAgICAgIC8vIGNsb3NlIHRoZSBzb2NrZXQgY2hhbm5lbC4KKyAgICAgICAgc2MuY2xvc2UoKTsKKyAgICAgICAgc3NjLmNsb3NlKCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBEZWZpbmUgdGhlIGNsaWVudCBzaWRlIG9mIHRoZSB0ZXN0LgorICAgICAqCisgICAgICogSWYgdGhlIHNlcnZlciBwcmVtYXR1cmVseSBleGl0cywgc2VydmVyUmVhZHkgd2lsbCBiZSBzZXQgdG8gdHJ1ZQorICAgICAqIHRvIGF2b2lkIGluZmluaXRlIGhhbmdzLgorICAgICAqLworICAgIHZvaWQgZG9DbGllbnRTaWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIGNyZWF0ZSBTU0xFbmdpbmUuCisgICAgICAgIFNTTEVuZ2luZSBzc2xlID0gY3JlYXRlU1NMRW5naW5lKHRydWUpOworCisgICAgICAgIC8qCisgICAgICAgICAqIFdhaXQgZm9yIHNlcnZlciB0byBnZXQgc3RhcnRlZC4KKyAgICAgICAgICovCisgICAgICAgIHdoaWxlICghc2VydmVyUmVhZHkpIHsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcCg1MCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDcmVhdGUgYSBub24tYmxvY2tpbmcgc29ja2V0IGNoYW5uZWwuCisgICAgICAgIFNvY2tldENoYW5uZWwgc2MgPSBTb2NrZXRDaGFubmVsLm9wZW4oKTsKKyAgICAgICAgc2MuY29uZmlndXJlQmxvY2tpbmcoZmFsc2UpOworICAgICAgICBJbmV0U29ja2V0QWRkcmVzcyBpc2EgPQorICAgICAgICAgICAgICAgIG5ldyBJbmV0U29ja2V0QWRkcmVzcyhJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSwgc2VydmVyUG9ydCk7CisgICAgICAgIHNjLmNvbm5lY3QoaXNhKTsKKworICAgICAgICAvLyBDb21wbGV0ZSBjb25uZWN0aW9uLgorICAgICAgICB3aGlsZSAoIXNjLmZpbmlzaENvbm5lY3QoKSApIHsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcCg1MCk7CisgICAgICAgICAgICAvLyB3YWl0aW5nIGZvciB0aGUgY29ubmVjdGlvbiBjb21wbGV0ZWQuCisgICAgICAgIH0KKworICAgICAgICBTTklIb3N0TmFtZSBzZXJ2ZXJOYW1lID0gbmV3IFNOSUhvc3ROYW1lKGNsaWVudFJlcXVlc3RlZEhvc3RuYW1lKTsKKyAgICAgICAgTGlzdDxTTklTZXJ2ZXJOYW1lPiBzZXJ2ZXJOYW1lcyA9IG5ldyBBcnJheUxpc3Q8PigxKTsKKyAgICAgICAgc2VydmVyTmFtZXMuYWRkKHNlcnZlck5hbWUpOworICAgICAgICBTU0xQYXJhbWV0ZXJzIHBhcmFtcyA9IHNzbGUuZ2V0U1NMUGFyYW1ldGVycygpOworICAgICAgICBwYXJhbXMuc2V0U2VydmVyTmFtZXMoc2VydmVyTmFtZXMpOworICAgICAgICBzc2xlLnNldFNTTFBhcmFtZXRlcnMocGFyYW1zKTsKKworICAgICAgICAvLyBoYW5kc2hha2luZworICAgICAgICBoYW5kc2hha2luZyhzc2xlLCBzYywgbnVsbCk7CisKKyAgICAgICAgLy8gc2VuZCBvdXQgYXBwbGljYXRpb24gZGF0YQorICAgICAgICBkZWxpdmVyKHNzbGUsIHNjKTsKKworICAgICAgICAvLyByZWNlaXZlIGFwcGxpY2F0aW9uIGRhdGEKKyAgICAgICAgcmVjZWl2ZShzc2xlLCBzYyk7CisKKyAgICAgICAgLy8gY2hlY2sgc2VydmVyIG5hbWUgaW5kaWNhdGlvbgorICAgICAgICBFeHRlbmRlZFNTTFNlc3Npb24gc2Vzc2lvbiA9IChFeHRlbmRlZFNTTFNlc3Npb24pc3NsZS5nZXRTZXNzaW9uKCk7CisgICAgICAgIGNoZWNrU05JSW5TZXNzaW9uKHNlc3Npb24pOworCisgICAgICAgIC8vIGNsb3NlIHRoZSBzb2NrZXQgY2hhbm5lbC4KKyAgICAgICAgc2MuY2xvc2UoKTsKKyAgICB9CisKKyAgICB2b2lkIGNoZWNrQ2FwYWJpbGl0aWVzKFNTTENhcGFiaWxpdGllcyBjYXBhYmlsaXRpZXMsCisgICAgICAgICAgICBFeHRlbmRlZFNTTFNlc3Npb24gc2Vzc2lvbikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIExpc3Q8U05JU2VydmVyTmFtZT4gc2Vzc2lvblNOSSA9IHNlc3Npb24uZ2V0UmVxdWVzdGVkU2VydmVyTmFtZXMoKTsKKyAgICAgICAgaWYgKCFzZXNzaW9uU05JLmVxdWFscyhjYXBhYmlsaXRpZXMuZ2V0U2VydmVyTmFtZXMoKSkpIHsKKyAgICAgICAgICAgIGZvciAoU05JU2VydmVyTmFtZSBzbmkgOiBzZXNzaW9uU05JKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTTkkgaW4gc2Vzc2lvbiBpcyAiICsgc25pKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTGlzdDxTTklTZXJ2ZXJOYW1lPiBjYXBhU05JID0gY2FwYWJpbGl0aWVzLmdldFNlcnZlck5hbWVzKCk7CisgICAgICAgICAgICBmb3IgKFNOSVNlcnZlck5hbWUgc25pIDogY2FwYVNOSSkgeworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU05JIGluIHNlc3Npb24gaXMgIiArIHNuaSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJzZXJ2ZXIgbmFtZSBpbmRpY2F0aW9uIGRvZXMgbm90IG1hdGNoIGNhcGFiaWxpdGllcyIpOworICAgICAgICB9CisKKyAgICAgICAgY2hlY2tTTklJblNlc3Npb24oc2Vzc2lvbik7CisgICAgfQorCisgICAgdm9pZCBjaGVja1NOSUluU2Vzc2lvbihFeHRlbmRlZFNTTFNlc3Npb24gc2Vzc2lvbikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIExpc3Q8U05JU2VydmVyTmFtZT4gc2Vzc2lvblNOSSA9IHNlc3Npb24uZ2V0UmVxdWVzdGVkU2VydmVyTmFtZXMoKTsKKyAgICAgICAgaWYgKHNlc3Npb25TTkkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZCBlbXB0eSByZXF1ZXN0IHNlcnZlciBuYW1lIGluZGljYXRpb24iKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzZXNzaW9uU05JLnNpemUoKSAhPSAxKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZCByZXF1ZXN0IHNlcnZlciBuYW1lIGluZGljYXRpb24iKTsKKyAgICAgICAgfQorCisgICAgICAgIFNOSVNlcnZlck5hbWUgc2VydmVyTmFtZSA9IHNlc3Npb25TTkkuZ2V0KDApOworICAgICAgICBpZiAoIShzZXJ2ZXJOYW1lIGluc3RhbmNlb2YgU05JSG9zdE5hbWUpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZCBpbnN0YW5jZSBvZiByZXF1ZXN0IHNlcnZlciBuYW1lIGluZGljYXRpb24iKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBob3N0bmFtZSA9ICgoU05JSG9zdE5hbWUpc2VydmVyTmFtZSkuZ2V0QXNjaWlOYW1lKCk7CisgICAgICAgIGlmICghY2xpZW50UmVxdWVzdGVkSG9zdG5hbWUuZXF1YWxzSWdub3JlQ2FzZShob3N0bmFtZSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkIHJlcXVlc3Qgc2VydmVyIG5hbWUgaW5kaWNhdGlvbiB2YWx1ZSIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNsaWVudFJlcXVlc3RlZEhvc3RuYW1lOworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBzZXJ2ZXJBY2NlcHRhYmxlSG9zdG5hbWU7CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHBhcnNlQXJndW1lbnRzKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgY2xpZW50UmVxdWVzdGVkSG9zdG5hbWUgPSBhcmdzWzBdOworICAgICAgICBzZXJ2ZXJBY2NlcHRhYmxlSG9zdG5hbWUgPSBhcmdzWzFdOworICAgIH0KKworICAgIC8qCisgICAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAqIFRoZSByZW1haW5kZXIgaXMganVzdCBzdXBwb3J0IHN0dWZmCisgICAgICovCisgICAgdm9sYXRpbGUgRXhjZXB0aW9uIHNlcnZlckV4Y2VwdGlvbiA9IG51bGw7CisgICAgdm9sYXRpbGUgRXhjZXB0aW9uIGNsaWVudEV4Y2VwdGlvbiA9IG51bGw7CisKKyAgICAvLyB1c2UgYW55IGZyZWUgcG9ydCBieSBkZWZhdWx0CisgICAgdm9sYXRpbGUgaW50IHNlcnZlclBvcnQgPSAwOworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChkZWJ1ZykKKyAgICAgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiamF2YXgubmV0LmRlYnVnIiwgImFsbCIpOworCisgICAgICAgIC8qCisgICAgICAgICAqIEdldCB0aGUgY3VzdG9taXplZCBhcmd1bWVudHMuCisgICAgICAgICAqLworICAgICAgICBwYXJzZUFyZ3VtZW50cyhhcmdzKTsKKworICAgICAgICBuZXcgU1NMRW5naW5lRXhwbG9yZXJNYXRjaGVkU05JKCk7CisgICAgfQorCisgICAgVGhyZWFkIGNsaWVudFRocmVhZCA9IG51bGw7CisgICAgVGhyZWFkIHNlcnZlclRocmVhZCA9IG51bGw7CisKKyAgICAvKgorICAgICAqIFByaW1hcnkgY29uc3RydWN0b3IsIHVzZWQgdG8gZHJpdmUgcmVtYWluZGVyIG9mIHRoZSB0ZXN0LgorICAgICAqCisgICAgICogRm9yayBvZmYgdGhlIG90aGVyIHNpZGUsIHRoZW4gZG8geW91ciB3b3JrLgorICAgICAqLworICAgIFNTTEVuZ2luZUV4cGxvcmVyTWF0Y2hlZFNOSSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlcigiLi4vLi4vLi4vLi4vZXRjIik7CisKKyAgICAgICAgaWYgKHNlcGFyYXRlU2VydmVyVGhyZWFkKSB7CisgICAgICAgICAgICBzdGFydFNlcnZlcih0cnVlKTsKKyAgICAgICAgICAgIHN0YXJ0Q2xpZW50KGZhbHNlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXJ0Q2xpZW50KHRydWUpOworICAgICAgICAgICAgc3RhcnRTZXJ2ZXIoZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogV2FpdCBmb3Igb3RoZXIgc2lkZSB0byBjbG9zZSBkb3duLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHNlcGFyYXRlU2VydmVyVGhyZWFkKSB7CisgICAgICAgICAgICBzZXJ2ZXJUaHJlYWQuam9pbigpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2xpZW50VGhyZWFkLmpvaW4oKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIFdoZW4gd2UgZ2V0IGhlcmUsIHRoZSB0ZXN0IGlzIHByZXR0eSBtdWNoIG92ZXIuCisgICAgICAgICAqCisgICAgICAgICAqIElmIHRoZSBtYWluIHRocmVhZCBleGNlcHRlZCwgdGhhdCBwcm9wYWdhdGVzIGJhY2sKKyAgICAgICAgICogaW1tZWRpYXRlbHkuICBJZiB0aGUgb3RoZXIgdGhyZWFkIHRocmV3IGFuIGV4Y2VwdGlvbiwgd2UKKyAgICAgICAgICogc2hvdWxkIHJlcG9ydCBiYWNrLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHNlcnZlckV4Y2VwdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJTZXJ2ZXIgRXhjZXB0aW9uOiIpOworICAgICAgICAgICAgdGhyb3cgc2VydmVyRXhjZXB0aW9uOworICAgICAgICB9CisgICAgICAgIGlmIChjbGllbnRFeGNlcHRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiQ2xpZW50IEV4Y2VwdGlvbjoiKTsKKyAgICAgICAgICAgIHRocm93IGNsaWVudEV4Y2VwdGlvbjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgc3RhcnRTZXJ2ZXIoYm9vbGVhbiBuZXdUaHJlYWQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAobmV3VGhyZWFkKSB7CisgICAgICAgICAgICBzZXJ2ZXJUaHJlYWQgPSBuZXcgVGhyZWFkKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvU2VydmVyU2lkZSgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIE91ciBzZXJ2ZXIgdGhyZWFkIGp1c3QgZGllZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBSZWxlYXNlIHRoZSBjbGllbnQsIGlmIG5vdCBhY3RpdmUgYWxyZWFkeS4uLgorICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlNlcnZlciBkaWVkLi4uIik7CisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJSZWFkeSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJFeGNlcHRpb24gPSBlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHNlcnZlclRocmVhZC5zdGFydCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZG9TZXJ2ZXJTaWRlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHN0YXJ0Q2xpZW50KGJvb2xlYW4gbmV3VGhyZWFkKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG5ld1RocmVhZCkgeworICAgICAgICAgICAgY2xpZW50VGhyZWFkID0gbmV3IFRocmVhZCgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkb0NsaWVudFNpZGUoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBPdXIgY2xpZW50IHRocmVhZCBqdXN0IGRpZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiQ2xpZW50IGRpZWQuLi4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudEV4Y2VwdGlvbiA9IGU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgY2xpZW50VGhyZWFkLnN0YXJ0KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkb0NsaWVudFNpZGUoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2pkay90ZXN0L3N1bi9zZWN1cml0eS9zc2wvamF2YXgvbmV0L3NzbC9TZXJ2ZXJOYW1lL1NTTEVuZ2luZUV4cGxvcmVyVW5tYXRjaGVkU05JLmphdmEgYi9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvc3NsL2phdmF4L25ldC9zc2wvU2VydmVyTmFtZS9TU0xFbmdpbmVFeHBsb3JlclVubWF0Y2hlZFNOSS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhOTY0N2IKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvc3NsL2phdmF4L25ldC9zc2wvU2VydmVyTmFtZS9TU0xFbmdpbmVFeHBsb3JlclVubWF0Y2hlZFNOSS5qYXZhCkBAIC0wLDAgKzEsNDA2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCisgKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CisgKiBxdWVzdGlvbnMuCisgKi8KKworLy8KKy8vIFN1bkpTU0UgZG9lcyBub3Qgc3VwcG9ydCBkeW5hbWljIHN5c3RlbSBwcm9wZXJ0aWVzLCBubyB3YXkgdG8gcmUtdXNlCisvLyBzeXN0ZW0gcHJvcGVydGllcyBpbiBzYW1ldm0vYWdlbnR2bSBtb2RlLgorLy8KKworLyoKKyAqIEB0ZXN0CisgKiBAYnVnIDcwNjgzMjEKKyAqIEBzdW1tYXJ5IFN1cHBvcnQgVExTIFNlcnZlciBOYW1lIEluZGljYXRpb24gKFNOSSkgRXh0ZW5zaW9uIGluIEpTU0UgU2VydmVyCisgKiBAbGlicmFyeSAuLi9OZXdBUElzL1NTTEVuZ2luZSAuLi8uLi8uLi8uLi90ZW1wbGF0ZXMKKyAqIEBidWlsZCBTU0xFbmdpbmVTZXJ2aWNlIFNTTENhcGFiaWxpdGllcyBTU0xFeHBsb3JlcgorICogQHJ1biBtYWluL290aGVydm0gU1NMRW5naW5lRXhwbG9yZXJVbm1hdGNoZWRTTkkgd3d3LmV4YW1wbGUuY29tCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3d3dcLmV4YW1wbGVcLm9yZworICovCisKK2ltcG9ydCBqYXZheC5uZXQuc3NsLio7CitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEubmlvLio7CitpbXBvcnQgamF2YS5uZXQuKjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy4qOworCitwdWJsaWMgY2xhc3MgU1NMRW5naW5lRXhwbG9yZXJVbm1hdGNoZWRTTkkgZXh0ZW5kcyBTU0xFbmdpbmVTZXJ2aWNlIHsKKworICAgIC8qCisgICAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAqIFNldCB0aGUgdmFyaW91cyB2YXJpYWJsZXMgbmVlZGVkIGZvciB0aGUgdGVzdHMsIHRoZW4KKyAgICAgKiBzcGVjaWZ5IHdoYXQgdGVzdHMgdG8gcnVuIG9uIGVhY2ggc2lkZS4KKyAgICAgKi8KKworICAgIC8qCisgICAgICogU2hvdWxkIHdlIHJ1biB0aGUgY2xpZW50IG9yIHNlcnZlciBpbiBhIHNlcGFyYXRlIHRocmVhZD8KKyAgICAgKiBCb3RoIHNpZGVzIGNhbiB0aHJvdyBleGNlcHRpb25zLCBidXQgZG8geW91IGhhdmUgYSBwcmVmZXJlbmNlCisgICAgICogYXMgdG8gd2hpY2ggc2lkZSBzaG91bGQgYmUgdGhlIG1haW4gdGhyZWFkLgorICAgICAqLworICAgIHN0YXRpYyBib29sZWFuIHNlcGFyYXRlU2VydmVyVGhyZWFkID0gZmFsc2U7CisKKyAgICAvLyBJcyB0aGUgc2VydmVyIHJlYWR5IHRvIHNlcnZlPworICAgIHZvbGF0aWxlIHN0YXRpYyBib29sZWFuIHNlcnZlclJlYWR5ID0gZmFsc2U7CisKKyAgICAvKgorICAgICAqIFR1cm4gb24gU1NMIGRlYnVnZ2luZz8KKyAgICAgKi8KKyAgICBzdGF0aWMgYm9vbGVhbiBkZWJ1ZyA9IGZhbHNlOworCisgICAgLyoKKyAgICAgKiBEZWZpbmUgdGhlIHNlcnZlciBzaWRlIG9mIHRoZSB0ZXN0LgorICAgICAqCisgICAgICogSWYgdGhlIHNlcnZlciBwcmVtYXR1cmVseSBleGl0cywgc2VydmVyUmVhZHkgd2lsbCBiZSBzZXQgdG8gdHJ1ZQorICAgICAqIHRvIGF2b2lkIGluZmluaXRlIGhhbmdzLgorICAgICAqLworICAgIHZvaWQgZG9TZXJ2ZXJTaWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gY3JlYXRlIFNTTEVuZ2luZS4KKyAgICAgICAgU1NMRW5naW5lIHNzbGUgPSBjcmVhdGVTU0xFbmdpbmUoZmFsc2UpOworCisgICAgICAgIC8vIENyZWF0ZSBhIHNlcnZlciBzb2NrZXQgY2hhbm5lbC4KKyAgICAgICAgSW5ldFNvY2tldEFkZHJlc3MgaXNhID0KKyAgICAgICAgICAgICAgICBuZXcgSW5ldFNvY2tldEFkZHJlc3MoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCksIHNlcnZlclBvcnQpOworICAgICAgICBTZXJ2ZXJTb2NrZXRDaGFubmVsIHNzYyA9IFNlcnZlclNvY2tldENoYW5uZWwub3BlbigpOworICAgICAgICBzc2Muc29ja2V0KCkuYmluZChpc2EpOworICAgICAgICBzZXJ2ZXJQb3J0ID0gc3NjLnNvY2tldCgpLmdldExvY2FsUG9ydCgpOworCisgICAgICAgIC8vIFNpZ25hbCBDbGllbnQsIHdlJ3JlIHJlYWR5IGZvciBoaXMgY29ubmVjdC4KKyAgICAgICAgc2VydmVyUmVhZHkgPSB0cnVlOworCisgICAgICAgIC8vIEFjY2VwdCBhIHNvY2tldCBjaGFubmVsLgorICAgICAgICBTb2NrZXRDaGFubmVsIHNjID0gc3NjLmFjY2VwdCgpOworCisgICAgICAgIC8vIENvbXBsZXRlIGNvbm5lY3Rpb24uCisgICAgICAgIHdoaWxlICghc2MuZmluaXNoQ29ubmVjdCgpKSB7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoNTApOworICAgICAgICAgICAgLy8gd2FpdGluZyBmb3IgdGhlIGNvbm5lY3Rpb24gY29tcGxldGVkLgorICAgICAgICB9CisKKyAgICAgICAgQnl0ZUJ1ZmZlciBidWZmZXIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKDB4RkYpOworICAgICAgICBpbnQgcG9zaXRpb24gPSAwOworICAgICAgICBTU0xDYXBhYmlsaXRpZXMgY2FwYWJpbGl0aWVzID0gbnVsbDsKKworICAgICAgICAvLyBSZWFkIHRoZSBoZWFkZXIgb2YgVExTIHJlY29yZAorICAgICAgICBidWZmZXIubGltaXQoU1NMRXhwbG9yZXIuUkVDT1JEX0hFQURFUl9TSVpFKTsKKyAgICAgICAgd2hpbGUgKHBvc2l0aW9uIDwgU1NMRXhwbG9yZXIuUkVDT1JEX0hFQURFUl9TSVpFKSB7CisgICAgICAgICAgICBpbnQgbiA9IHNjLnJlYWQoYnVmZmVyKTsKKyAgICAgICAgICAgIGlmIChuIDwgMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oInVuZXhwZWN0ZWQgZW5kIG9mIHN0cmVhbSEiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBvc2l0aW9uICs9IG47CisgICAgICAgIH0KKyAgICAgICAgYnVmZmVyLmZsaXAoKTsKKworICAgICAgICBpbnQgcmVjb3JkTGVuZ3RoID0gU1NMRXhwbG9yZXIuZ2V0UmVxdWlyZWRTaXplKGJ1ZmZlcik7CisgICAgICAgIGlmIChidWZmZXIuY2FwYWNpdHkoKSA8IHJlY29yZExlbmd0aCkgeworICAgICAgICAgICAgQnl0ZUJ1ZmZlciBvbGRCdWZmZXIgPSBidWZmZXI7CisgICAgICAgICAgICBidWZmZXIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKHJlY29yZExlbmd0aCk7CisgICAgICAgICAgICBidWZmZXIucHV0KG9sZEJ1ZmZlcik7CisgICAgICAgIH0KKworICAgICAgICBidWZmZXIucG9zaXRpb24oU1NMRXhwbG9yZXIuUkVDT1JEX0hFQURFUl9TSVpFKTsKKyAgICAgICAgYnVmZmVyLmxpbWl0KGJ1ZmZlci5jYXBhY2l0eSgpKTsKKyAgICAgICAgd2hpbGUgKHBvc2l0aW9uIDwgcmVjb3JkTGVuZ3RoKSB7CisgICAgICAgICAgICBpbnQgbiA9IHNjLnJlYWQoYnVmZmVyKTsKKyAgICAgICAgICAgIGlmIChuIDwgMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oInVuZXhwZWN0ZWQgZW5kIG9mIHN0cmVhbSEiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBvc2l0aW9uICs9IG47CisgICAgICAgIH0KKyAgICAgICAgYnVmZmVyLmZsaXAoKTsKKworICAgICAgICBjYXBhYmlsaXRpZXMgPSBTU0xFeHBsb3Jlci5leHBsb3JlKGJ1ZmZlcik7CisgICAgICAgIGlmIChjYXBhYmlsaXRpZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSZWNvcmQgdmVyc2lvbjogIiArCisgICAgICAgICAgICAgICAgICAgIGNhcGFiaWxpdGllcy5nZXRSZWNvcmRWZXJzaW9uKCkpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJIZWxsbyB2ZXJzaW9uOiAiICsKKyAgICAgICAgICAgICAgICAgICAgY2FwYWJpbGl0aWVzLmdldEhlbGxvVmVyc2lvbigpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGVuYWJsZSBzZXJ2ZXIgbmFtZSBpbmRpY2F0aW9uIGNoZWNraW5nCisgICAgICAgIFNOSU1hdGNoZXIgbWF0Y2hlciA9IFNOSUhvc3ROYW1lLmNyZWF0ZVNOSU1hdGNoZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJBY2NlcHRhYmxlSG9zdG5hbWUpOworICAgICAgICBDb2xsZWN0aW9uPFNOSU1hdGNoZXI+IG1hdGNoZXJzID0gbmV3IEFycmF5TGlzdDw+KDEpOworICAgICAgICBtYXRjaGVycy5hZGQobWF0Y2hlcik7CisgICAgICAgIFNTTFBhcmFtZXRlcnMgcGFyYW1zID0gc3NsZS5nZXRTU0xQYXJhbWV0ZXJzKCk7CisgICAgICAgIHBhcmFtcy5zZXRTTklNYXRjaGVycyhtYXRjaGVycyk7CisgICAgICAgIHNzbGUuc2V0U1NMUGFyYW1ldGVycyhwYXJhbXMpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBoYW5kc2hha2luZworICAgICAgICAgICAgaGFuZHNoYWtpbmcoc3NsZSwgc2MsIGJ1ZmZlcik7CisKKyAgICAgICAgICAgIC8vIHJlY2VpdmUgYXBwbGljYXRpb24gZGF0YQorICAgICAgICAgICAgcmVjZWl2ZShzc2xlLCBzYyk7CisKKyAgICAgICAgICAgIC8vIHNlbmQgb3V0IGFwcGxpY2F0aW9uIGRhdGEKKyAgICAgICAgICAgIGRlbGl2ZXIoc3NsZSwgc2MpOworCisgICAgICAgICAgICAvLyBjaGVjayBzZXJ2ZXIgbmFtZSBpbmRpY2F0aW9uCisgICAgICAgICAgICBFeHRlbmRlZFNTTFNlc3Npb24gc2Vzc2lvbiA9IChFeHRlbmRlZFNTTFNlc3Npb24pc3NsZS5nZXRTZXNzaW9uKCk7CisgICAgICAgICAgICBjaGVja0NhcGFiaWxpdGllcyhjYXBhYmlsaXRpZXMsIHNlc3Npb24pOworCisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJNaXNtYXRjaGVkIHNlcnZlciBuYW1lIGluZGljYXRpb24gd2FzIGFjY2VwdGVkIik7CisgICAgICAgIH0gY2F0Y2ggKFNTTEhhbmRzaGFrZUV4Y2VwdGlvbiBzc2xoZSkgeworICAgICAgICAgICAgLy8gdGhlIGV4cGVjdGVkIHVucmVjb2duaXplZCBzZXJ2ZXIgbmFtZSBpbmRpY2F0aW9uIGV4Y2VwdGlvbgorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgIC8vIHRoZSBwZWVyIG1heSBoYXZlIGNsb3NlZCB0aGUgc29ja2V0IGJlY2F1c2Ugb2YgdGhlIHVubWF0Y2hlZAorICAgICAgICAgICAgLy8gc2VydmVyIG5hbWUgaW5kaWNhdGlvbi4KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIC8vIGNsb3NlIHRoZSBzb2NrZXQgY2hhbm5lbC4KKyAgICAgICAgICAgIHNjLmNsb3NlKCk7CisgICAgICAgICAgICBzc2MuY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogRGVmaW5lIHRoZSBjbGllbnQgc2lkZSBvZiB0aGUgdGVzdC4KKyAgICAgKgorICAgICAqIElmIHRoZSBzZXJ2ZXIgcHJlbWF0dXJlbHkgZXhpdHMsIHNlcnZlclJlYWR5IHdpbGwgYmUgc2V0IHRvIHRydWUKKyAgICAgKiB0byBhdm9pZCBpbmZpbml0ZSBoYW5ncy4KKyAgICAgKi8KKyAgICB2b2lkIGRvQ2xpZW50U2lkZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBjcmVhdGUgU1NMRW5naW5lLgorICAgICAgICBTU0xFbmdpbmUgc3NsZSA9IGNyZWF0ZVNTTEVuZ2luZSh0cnVlKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBXYWl0IGZvciBzZXJ2ZXIgdG8gZ2V0IHN0YXJ0ZWQuCisgICAgICAgICAqLworICAgICAgICB3aGlsZSAoIXNlcnZlclJlYWR5KSB7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoNTApOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ3JlYXRlIGEgbm9uLWJsb2NraW5nIHNvY2tldCBjaGFubmVsLgorICAgICAgICBTb2NrZXRDaGFubmVsIHNjID0gU29ja2V0Q2hhbm5lbC5vcGVuKCk7CisgICAgICAgIHNjLmNvbmZpZ3VyZUJsb2NraW5nKGZhbHNlKTsKKyAgICAgICAgSW5ldFNvY2tldEFkZHJlc3MgaXNhID0KKyAgICAgICAgICAgICAgICBuZXcgSW5ldFNvY2tldEFkZHJlc3MoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCksIHNlcnZlclBvcnQpOworICAgICAgICBzYy5jb25uZWN0KGlzYSk7CisKKyAgICAgICAgLy8gQ29tcGxldGUgY29ubmVjdGlvbi4KKyAgICAgICAgd2hpbGUgKCFzYy5maW5pc2hDb25uZWN0KCkgKSB7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoNTApOworICAgICAgICAgICAgLy8gd2FpdGluZyBmb3IgdGhlIGNvbm5lY3Rpb24gY29tcGxldGVkLgorICAgICAgICB9CisKKyAgICAgICAgU05JSG9zdE5hbWUgc2VydmVyTmFtZSA9IG5ldyBTTklIb3N0TmFtZShjbGllbnRSZXF1ZXN0ZWRIb3N0bmFtZSk7CisgICAgICAgIExpc3Q8U05JU2VydmVyTmFtZT4gc2VydmVyTmFtZXMgPSBuZXcgQXJyYXlMaXN0PD4oMSk7CisgICAgICAgIHNlcnZlck5hbWVzLmFkZChzZXJ2ZXJOYW1lKTsKKyAgICAgICAgU1NMUGFyYW1ldGVycyBwYXJhbXMgPSBzc2xlLmdldFNTTFBhcmFtZXRlcnMoKTsKKyAgICAgICAgcGFyYW1zLnNldFNlcnZlck5hbWVzKHNlcnZlck5hbWVzKTsKKyAgICAgICAgc3NsZS5zZXRTU0xQYXJhbWV0ZXJzKHBhcmFtcyk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIGhhbmRzaGFraW5nCisgICAgICAgICAgICBoYW5kc2hha2luZyhzc2xlLCBzYywgbnVsbCk7CisKKyAgICAgICAgICAgIC8vIHNlbmQgb3V0IGFwcGxpY2F0aW9uIGRhdGEKKyAgICAgICAgICAgIGRlbGl2ZXIoc3NsZSwgc2MpOworCisgICAgICAgICAgICAvLyByZWNlaXZlIGFwcGxpY2F0aW9uIGRhdGEKKyAgICAgICAgICAgIHJlY2VpdmUoc3NsZSwgc2MpOworCisgICAgICAgICAgICAvLyBjaGVjayBzZXJ2ZXIgbmFtZSBpbmRpY2F0aW9uCisgICAgICAgICAgICBFeHRlbmRlZFNTTFNlc3Npb24gc2Vzc2lvbiA9IChFeHRlbmRlZFNTTFNlc3Npb24pc3NsZS5nZXRTZXNzaW9uKCk7CisgICAgICAgICAgICBjaGVja1NOSUluU2Vzc2lvbihzZXNzaW9uKTsKKworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiTWlzbWF0Y2hlZCBzZXJ2ZXIgbmFtZSBpbmRpY2F0aW9uIHdhcyBhY2NlcHRlZCIpOworICAgICAgICB9IGNhdGNoIChTU0xIYW5kc2hha2VFeGNlcHRpb24gc3NsaGUpIHsKKyAgICAgICAgICAgIC8vIHRoZSBleHBlY3RlZCB1bnJlY29nbml6ZWQgc2VydmVyIG5hbWUgaW5kaWNhdGlvbiBleGNlcHRpb24KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICAvLyB0aGUgcGVlciBtYXkgaGF2ZSBjbG9zZWQgdGhlIHNvY2tldCBiZWNhdXNlIG9mIHRoZSB1bm1hdGNoZWQKKyAgICAgICAgICAgIC8vIHNlcnZlciBuYW1lIGluZGljYXRpb24uCisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAvLyBjbG9zZSB0aGUgc29ja2V0IGNoYW5uZWwuCisgICAgICAgICAgICBzYy5jbG9zZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBjaGVja0NhcGFiaWxpdGllcyhTU0xDYXBhYmlsaXRpZXMgY2FwYWJpbGl0aWVzLAorICAgICAgICAgICAgRXh0ZW5kZWRTU0xTZXNzaW9uIHNlc3Npb24pIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBMaXN0PFNOSVNlcnZlck5hbWU+IHNlc3Npb25TTkkgPSBzZXNzaW9uLmdldFJlcXVlc3RlZFNlcnZlck5hbWVzKCk7CisgICAgICAgIGlmICghc2Vzc2lvblNOSS5lcXVhbHMoY2FwYWJpbGl0aWVzLmdldFNlcnZlck5hbWVzKCkpKSB7CisgICAgICAgICAgICBmb3IgKFNOSVNlcnZlck5hbWUgc25pIDogc2Vzc2lvblNOSSkgeworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU05JIGluIHNlc3Npb24gaXMgIiArIHNuaSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIExpc3Q8U05JU2VydmVyTmFtZT4gY2FwYVNOSSA9IGNhcGFiaWxpdGllcy5nZXRTZXJ2ZXJOYW1lcygpOworICAgICAgICAgICAgZm9yIChTTklTZXJ2ZXJOYW1lIHNuaSA6IGNhcGFTTkkpIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNOSSBpbiBzZXNzaW9uIGlzICIgKyBzbmkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAic2VydmVyIG5hbWUgaW5kaWNhdGlvbiBkb2VzIG5vdCBtYXRjaCBjYXBhYmlsaXRpZXMiKTsKKyAgICAgICAgfQorCisgICAgICAgIGNoZWNrU05JSW5TZXNzaW9uKHNlc3Npb24pOworICAgIH0KKworICAgIHZvaWQgY2hlY2tTTklJblNlc3Npb24oRXh0ZW5kZWRTU0xTZXNzaW9uIHNlc3Npb24pIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBMaXN0PFNOSVNlcnZlck5hbWU+IHNlc3Npb25TTkkgPSBzZXNzaW9uLmdldFJlcXVlc3RlZFNlcnZlck5hbWVzKCk7CisgICAgICAgIGlmIChzZXNzaW9uU05JLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQgZW1wdHkgcmVxdWVzdCBzZXJ2ZXIgbmFtZSBpbmRpY2F0aW9uIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2Vzc2lvblNOSS5zaXplKCkgIT0gMSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQgcmVxdWVzdCBzZXJ2ZXIgbmFtZSBpbmRpY2F0aW9uIik7CisgICAgICAgIH0KKworICAgICAgICBTTklTZXJ2ZXJOYW1lIHNlcnZlck5hbWUgPSBzZXNzaW9uU05JLmdldCgwKTsKKyAgICAgICAgaWYgKCEoc2VydmVyTmFtZSBpbnN0YW5jZW9mIFNOSUhvc3ROYW1lKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQgaW5zdGFuY2Ugb2YgcmVxdWVzdCBzZXJ2ZXIgbmFtZSBpbmRpY2F0aW9uIik7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgaG9zdG5hbWUgPSAoKFNOSUhvc3ROYW1lKXNlcnZlck5hbWUpLmdldEFzY2lpTmFtZSgpOworICAgICAgICBpZiAoIWNsaWVudFJlcXVlc3RlZEhvc3RuYW1lLmVxdWFsc0lnbm9yZUNhc2UoaG9zdG5hbWUpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZCByZXF1ZXN0IHNlcnZlciBuYW1lIGluZGljYXRpb24gdmFsdWUiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBjbGllbnRSZXF1ZXN0ZWRIb3N0bmFtZTsKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgc2VydmVyQWNjZXB0YWJsZUhvc3RuYW1lOworCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwYXJzZUFyZ3VtZW50cyhTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIGNsaWVudFJlcXVlc3RlZEhvc3RuYW1lID0gYXJnc1swXTsKKyAgICAgICAgc2VydmVyQWNjZXB0YWJsZUhvc3RuYW1lID0gYXJnc1sxXTsKKyAgICB9CisKKyAgICAvKgorICAgICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgKiBUaGUgcmVtYWluZGVyIGlzIGp1c3Qgc3VwcG9ydCBzdHVmZgorICAgICAqLworICAgIHZvbGF0aWxlIEV4Y2VwdGlvbiBzZXJ2ZXJFeGNlcHRpb24gPSBudWxsOworICAgIHZvbGF0aWxlIEV4Y2VwdGlvbiBjbGllbnRFeGNlcHRpb24gPSBudWxsOworCisgICAgLy8gdXNlIGFueSBmcmVlIHBvcnQgYnkgZGVmYXVsdAorICAgIHZvbGF0aWxlIGludCBzZXJ2ZXJQb3J0ID0gMDsKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoZGVidWcpCisgICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImphdmF4Lm5ldC5kZWJ1ZyIsICJhbGwiKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBHZXQgdGhlIGN1c3RvbWl6ZWQgYXJndW1lbnRzLgorICAgICAgICAgKi8KKyAgICAgICAgcGFyc2VBcmd1bWVudHMoYXJncyk7CisKKyAgICAgICAgbmV3IFNTTEVuZ2luZUV4cGxvcmVyVW5tYXRjaGVkU05JKCk7CisgICAgfQorCisgICAgVGhyZWFkIGNsaWVudFRocmVhZCA9IG51bGw7CisgICAgVGhyZWFkIHNlcnZlclRocmVhZCA9IG51bGw7CisKKyAgICAvKgorICAgICAqIFByaW1hcnkgY29uc3RydWN0b3IsIHVzZWQgdG8gZHJpdmUgcmVtYWluZGVyIG9mIHRoZSB0ZXN0LgorICAgICAqCisgICAgICogRm9yayBvZmYgdGhlIG90aGVyIHNpZGUsIHRoZW4gZG8geW91ciB3b3JrLgorICAgICAqLworICAgIFNTTEVuZ2luZUV4cGxvcmVyVW5tYXRjaGVkU05JKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyKCIuLi8uLi8uLi8uLi9ldGMiKTsKKworICAgICAgICBpZiAoc2VwYXJhdGVTZXJ2ZXJUaHJlYWQpIHsKKyAgICAgICAgICAgIHN0YXJ0U2VydmVyKHRydWUpOworICAgICAgICAgICAgc3RhcnRDbGllbnQoZmFsc2UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhcnRDbGllbnQodHJ1ZSk7CisgICAgICAgICAgICBzdGFydFNlcnZlcihmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBXYWl0IGZvciBvdGhlciBzaWRlIHRvIGNsb3NlIGRvd24uCisgICAgICAgICAqLworICAgICAgICBpZiAoc2VwYXJhdGVTZXJ2ZXJUaHJlYWQpIHsKKyAgICAgICAgICAgIHNlcnZlclRocmVhZC5qb2luKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjbGllbnRUaHJlYWQuam9pbigpOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogV2hlbiB3ZSBnZXQgaGVyZSwgdGhlIHRlc3QgaXMgcHJldHR5IG11Y2ggb3Zlci4KKyAgICAgICAgICoKKyAgICAgICAgICogSWYgdGhlIG1haW4gdGhyZWFkIGV4Y2VwdGVkLCB0aGF0IHByb3BhZ2F0ZXMgYmFjaworICAgICAgICAgKiBpbW1lZGlhdGVseS4gIElmIHRoZSBvdGhlciB0aHJlYWQgdGhyZXcgYW4gZXhjZXB0aW9uLCB3ZQorICAgICAgICAgKiBzaG91bGQgcmVwb3J0IGJhY2suCisgICAgICAgICAqLworICAgICAgICBpZiAoc2VydmVyRXhjZXB0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIlNlcnZlciBFeGNlcHRpb246Iik7CisgICAgICAgICAgICB0aHJvdyBzZXJ2ZXJFeGNlcHRpb247CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNsaWVudEV4Y2VwdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJDbGllbnQgRXhjZXB0aW9uOiIpOworICAgICAgICAgICAgdGhyb3cgY2xpZW50RXhjZXB0aW9uOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBzdGFydFNlcnZlcihib29sZWFuIG5ld1RocmVhZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChuZXdUaHJlYWQpIHsKKyAgICAgICAgICAgIHNlcnZlclRocmVhZCA9IG5ldyBUaHJlYWQoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgZG9TZXJ2ZXJTaWRlKCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgICAgICogT3VyIHNlcnZlciB0aHJlYWQganVzdCBkaWVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIFJlbGVhc2UgdGhlIGNsaWVudCwgaWYgbm90IGFjdGl2ZSBhbHJlYWR5Li4uCisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiU2VydmVyIGRpZWQuLi4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlclJlYWR5ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlckV4Y2VwdGlvbiA9IGU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgc2VydmVyVGhyZWFkLnN0YXJ0KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkb1NlcnZlclNpZGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgc3RhcnRDbGllbnQoYm9vbGVhbiBuZXdUaHJlYWQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAobmV3VGhyZWFkKSB7CisgICAgICAgICAgICBjbGllbnRUaHJlYWQgPSBuZXcgVGhyZWFkKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvQ2xpZW50U2lkZSgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIE91ciBjbGllbnQgdGhyZWFkIGp1c3QgZGllZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJDbGllbnQgZGllZC4uLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50RXhjZXB0aW9uID0gZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBjbGllbnRUaHJlYWQuc3RhcnQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRvQ2xpZW50U2lkZSgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L3NzbC9qYXZheC9uZXQvc3NsL1NlcnZlck5hbWUvU1NMRW5naW5lRXhwbG9yZXJXaXRoQ2xpLmphdmEgYi9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvc3NsL2phdmF4L25ldC9zc2wvU2VydmVyTmFtZS9TU0xFbmdpbmVFeHBsb3JlcldpdGhDbGkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmEyM2NiCi0tLSAvZGV2L251bGwKKysrIGIvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L3NzbC9qYXZheC9uZXQvc3NsL1NlcnZlck5hbWUvU1NMRW5naW5lRXhwbG9yZXJXaXRoQ2xpLmphdmEKQEAgLTAsMCArMSwzNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKKyAqIHF1ZXN0aW9ucy4KKyAqLworCisvLworLy8gU3VuSlNTRSBkb2VzIG5vdCBzdXBwb3J0IGR5bmFtaWMgc3lzdGVtIHByb3BlcnRpZXMsIG5vIHdheSB0byByZS11c2UKKy8vIHN5c3RlbSBwcm9wZXJ0aWVzIGluIHNhbWV2bS9hZ2VudHZtIG1vZGUuCisvLworCisvKgorICogQHRlc3QKKyAqIEBidWcgNzA2ODMyMQorICogQHN1bW1hcnkgU3VwcG9ydCBUTFMgU2VydmVyIE5hbWUgSW5kaWNhdGlvbiAoU05JKSBFeHRlbnNpb24gaW4gSlNTRSBTZXJ2ZXIKKyAqIEBsaWJyYXJ5IC4uL05ld0FQSXMvU1NMRW5naW5lIC4uLy4uLy4uLy4uL3RlbXBsYXRlcworICogQGJ1aWxkIFNTTEVuZ2luZVNlcnZpY2UgU1NMQ2FwYWJpbGl0aWVzIFNTTEV4cGxvcmVyCisgKiBAcnVuIG1haW4vb3RoZXJ2bSBTU0xFbmdpbmVFeHBsb3JlcldpdGhDbGkKKyAqLworCitpbXBvcnQgamF2YXgubmV0LnNzbC4qOworaW1wb3J0IGphdmEubmlvLio7CitpbXBvcnQgamF2YS5uZXQuKjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy4qOworCitwdWJsaWMgY2xhc3MgU1NMRW5naW5lRXhwbG9yZXJXaXRoQ2xpIGV4dGVuZHMgU1NMRW5naW5lU2VydmljZSB7CisKKyAgICAvKgorICAgICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgKiBTZXQgdGhlIHZhcmlvdXMgdmFyaWFibGVzIG5lZWRlZCBmb3IgdGhlIHRlc3RzLCB0aGVuCisgICAgICogc3BlY2lmeSB3aGF0IHRlc3RzIHRvIHJ1biBvbiBlYWNoIHNpZGUuCisgICAgICovCisKKyAgICAvKgorICAgICAqIFNob3VsZCB3ZSBydW4gdGhlIGNsaWVudCBvciBzZXJ2ZXIgaW4gYSBzZXBhcmF0ZSB0aHJlYWQ/CisgICAgICogQm90aCBzaWRlcyBjYW4gdGhyb3cgZXhjZXB0aW9ucywgYnV0IGRvIHlvdSBoYXZlIGEgcHJlZmVyZW5jZQorICAgICAqIGFzIHRvIHdoaWNoIHNpZGUgc2hvdWxkIGJlIHRoZSBtYWluIHRocmVhZC4KKyAgICAgKi8KKyAgICBzdGF0aWMgYm9vbGVhbiBzZXBhcmF0ZVNlcnZlclRocmVhZCA9IHRydWU7CisKKyAgICAvLyBJcyB0aGUgc2VydmVyIHJlYWR5IHRvIHNlcnZlPworICAgIHZvbGF0aWxlIHN0YXRpYyBib29sZWFuIHNlcnZlclJlYWR5ID0gZmFsc2U7CisKKyAgICAvKgorICAgICAqIFR1cm4gb24gU1NMIGRlYnVnZ2luZz8KKyAgICAgKi8KKyAgICBzdGF0aWMgYm9vbGVhbiBkZWJ1ZyA9IGZhbHNlOworCisgICAgLyoKKyAgICAgKiBEZWZpbmUgdGhlIHNlcnZlciBzaWRlIG9mIHRoZSB0ZXN0LgorICAgICAqCisgICAgICogSWYgdGhlIHNlcnZlciBwcmVtYXR1cmVseSBleGl0cywgc2VydmVyUmVhZHkgd2lsbCBiZSBzZXQgdG8gdHJ1ZQorICAgICAqIHRvIGF2b2lkIGluZmluaXRlIGhhbmdzLgorICAgICAqLworICAgIHZvaWQgZG9TZXJ2ZXJTaWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gY3JlYXRlIFNTTEVuZ2luZS4KKyAgICAgICAgU1NMRW5naW5lIHNzbGUgPSBjcmVhdGVTU0xFbmdpbmUoZmFsc2UpOworCisgICAgICAgIC8vIENyZWF0ZSBhIHNlcnZlciBzb2NrZXQgY2hhbm5lbC4KKyAgICAgICAgSW5ldFNvY2tldEFkZHJlc3MgaXNhID0KKyAgICAgICAgICAgICAgICBuZXcgSW5ldFNvY2tldEFkZHJlc3MoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCksIHNlcnZlclBvcnQpOworICAgICAgICBTZXJ2ZXJTb2NrZXRDaGFubmVsIHNzYyA9IFNlcnZlclNvY2tldENoYW5uZWwub3BlbigpOworICAgICAgICBzc2Muc29ja2V0KCkuYmluZChpc2EpOworICAgICAgICBzZXJ2ZXJQb3J0ID0gc3NjLnNvY2tldCgpLmdldExvY2FsUG9ydCgpOworCisgICAgICAgIC8vIFNpZ25hbCBDbGllbnQsIHdlJ3JlIHJlYWR5IGZvciBoaXMgY29ubmVjdC4KKyAgICAgICAgc2VydmVyUmVhZHkgPSB0cnVlOworCisgICAgICAgIC8vIEFjY2VwdCBhIHNvY2tldCBjaGFubmVsLgorICAgICAgICBTb2NrZXRDaGFubmVsIHNjID0gc3NjLmFjY2VwdCgpOworCisgICAgICAgIC8vIENvbXBsZXRlIGNvbm5lY3Rpb24uCisgICAgICAgIHdoaWxlICghc2MuZmluaXNoQ29ubmVjdCgpKSB7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoNTApOworICAgICAgICAgICAgLy8gd2FpdGluZyBmb3IgdGhlIGNvbm5lY3Rpb24gY29tcGxldGVkLgorICAgICAgICB9CisKKyAgICAgICAgQnl0ZUJ1ZmZlciBidWZmZXIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKDB4RkYpOworICAgICAgICBpbnQgcG9zaXRpb24gPSAwOworICAgICAgICBTU0xDYXBhYmlsaXRpZXMgY2FwYWJpbGl0aWVzID0gbnVsbDsKKworICAgICAgICAvLyBSZWFkIHRoZSBoZWFkZXIgb2YgVExTIHJlY29yZAorICAgICAgICBidWZmZXIubGltaXQoU1NMRXhwbG9yZXIuUkVDT1JEX0hFQURFUl9TSVpFKTsKKyAgICAgICAgd2hpbGUgKHBvc2l0aW9uIDwgU1NMRXhwbG9yZXIuUkVDT1JEX0hFQURFUl9TSVpFKSB7CisgICAgICAgICAgICBpbnQgbiA9IHNjLnJlYWQoYnVmZmVyKTsKKyAgICAgICAgICAgIGlmIChuIDwgMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oInVuZXhwZWN0ZWQgZW5kIG9mIHN0cmVhbSEiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBvc2l0aW9uICs9IG47CisgICAgICAgIH0KKyAgICAgICAgYnVmZmVyLmZsaXAoKTsKKworICAgICAgICBpbnQgcmVjb3JkTGVuZ3RoID0gU1NMRXhwbG9yZXIuZ2V0UmVxdWlyZWRTaXplKGJ1ZmZlcik7CisgICAgICAgIGlmIChidWZmZXIuY2FwYWNpdHkoKSA8IHJlY29yZExlbmd0aCkgeworICAgICAgICAgICAgQnl0ZUJ1ZmZlciBvbGRCdWZmZXIgPSBidWZmZXI7CisgICAgICAgICAgICBidWZmZXIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKHJlY29yZExlbmd0aCk7CisgICAgICAgICAgICBidWZmZXIucHV0KG9sZEJ1ZmZlcik7CisgICAgICAgIH0KKworICAgICAgICBidWZmZXIucG9zaXRpb24oU1NMRXhwbG9yZXIuUkVDT1JEX0hFQURFUl9TSVpFKTsKKyAgICAgICAgYnVmZmVyLmxpbWl0KGJ1ZmZlci5jYXBhY2l0eSgpKTsKKyAgICAgICAgd2hpbGUgKHBvc2l0aW9uIDwgcmVjb3JkTGVuZ3RoKSB7CisgICAgICAgICAgICBpbnQgbiA9IHNjLnJlYWQoYnVmZmVyKTsKKyAgICAgICAgICAgIGlmIChuIDwgMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oInVuZXhwZWN0ZWQgZW5kIG9mIHN0cmVhbSEiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBvc2l0aW9uICs9IG47CisgICAgICAgIH0KKyAgICAgICAgYnVmZmVyLmZsaXAoKTsKKworICAgICAgICBjYXBhYmlsaXRpZXMgPSBTU0xFeHBsb3Jlci5leHBsb3JlKGJ1ZmZlcik7CisgICAgICAgIGlmIChjYXBhYmlsaXRpZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSZWNvcmQgdmVyc2lvbjogIiArCisgICAgICAgICAgICAgICAgICAgIGNhcGFiaWxpdGllcy5nZXRSZWNvcmRWZXJzaW9uKCkpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJIZWxsbyB2ZXJzaW9uOiAiICsKKyAgICAgICAgICAgICAgICAgICAgY2FwYWJpbGl0aWVzLmdldEhlbGxvVmVyc2lvbigpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGhhbmRzaGFraW5nCisgICAgICAgIGhhbmRzaGFraW5nKHNzbGUsIHNjLCBidWZmZXIpOworCisgICAgICAgIC8vIHJlY2VpdmUgYXBwbGljYXRpb24gZGF0YQorICAgICAgICByZWNlaXZlKHNzbGUsIHNjKTsKKworICAgICAgICAvLyBzZW5kIG91dCBhcHBsaWNhdGlvbiBkYXRhCisgICAgICAgIGRlbGl2ZXIoc3NsZSwgc2MpOworCisgICAgICAgIEV4dGVuZGVkU1NMU2Vzc2lvbiBzZXNzaW9uID0gKEV4dGVuZGVkU1NMU2Vzc2lvbilzc2xlLmdldFNlc3Npb24oKTsKKyAgICAgICAgY2hlY2tDYXBhYmlsaXRpZXMoY2FwYWJpbGl0aWVzLCBzZXNzaW9uKTsKKworICAgICAgICAvLyBjbG9zZSB0aGUgc29ja2V0IGNoYW5uZWwuCisgICAgICAgIHNjLmNsb3NlKCk7CisgICAgICAgIHNzYy5jbG9zZSgpOworICAgIH0KKworICAgIC8qCisgICAgICogRGVmaW5lIHRoZSBjbGllbnQgc2lkZSBvZiB0aGUgdGVzdC4KKyAgICAgKgorICAgICAqIElmIHRoZSBzZXJ2ZXIgcHJlbWF0dXJlbHkgZXhpdHMsIHNlcnZlclJlYWR5IHdpbGwgYmUgc2V0IHRvIHRydWUKKyAgICAgKiB0byBhdm9pZCBpbmZpbml0ZSBoYW5ncy4KKyAgICAgKi8KKyAgICB2b2lkIGRvQ2xpZW50U2lkZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBjcmVhdGUgU1NMRW5naW5lLgorICAgICAgICBTU0xFbmdpbmUgc3NsZSA9IGNyZWF0ZVNTTEVuZ2luZSh0cnVlKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBXYWl0IGZvciBzZXJ2ZXIgdG8gZ2V0IHN0YXJ0ZWQuCisgICAgICAgICAqLworICAgICAgICB3aGlsZSAoIXNlcnZlclJlYWR5KSB7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoNTApOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ3JlYXRlIGEgbm9uLWJsb2NraW5nIHNvY2tldCBjaGFubmVsLgorICAgICAgICBTb2NrZXRDaGFubmVsIHNjID0gU29ja2V0Q2hhbm5lbC5vcGVuKCk7CisgICAgICAgIHNjLmNvbmZpZ3VyZUJsb2NraW5nKGZhbHNlKTsKKyAgICAgICAgSW5ldFNvY2tldEFkZHJlc3MgaXNhID0KKyAgICAgICAgICAgICAgICBuZXcgSW5ldFNvY2tldEFkZHJlc3MoSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCksIHNlcnZlclBvcnQpOworICAgICAgICBzYy5jb25uZWN0KGlzYSk7CisKKyAgICAgICAgLy8gQ29tcGxldGUgY29ubmVjdGlvbi4KKyAgICAgICAgd2hpbGUgKCFzYy5maW5pc2hDb25uZWN0KCkgKSB7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoNTApOworICAgICAgICAgICAgLy8gd2FpdGluZyBmb3IgdGhlIGNvbm5lY3Rpb24gY29tcGxldGVkLgorICAgICAgICB9CisKKyAgICAgICAgU05JSG9zdE5hbWUgc2VydmVyTmFtZSA9IG5ldyBTTklIb3N0TmFtZShjbGllbnRSZXF1ZXN0ZWRIb3N0bmFtZSk7CisgICAgICAgIExpc3Q8U05JU2VydmVyTmFtZT4gc2VydmVyTmFtZXMgPSBuZXcgQXJyYXlMaXN0PD4oMSk7CisgICAgICAgIHNlcnZlck5hbWVzLmFkZChzZXJ2ZXJOYW1lKTsKKyAgICAgICAgU1NMUGFyYW1ldGVycyBwYXJhbXMgPSBzc2xlLmdldFNTTFBhcmFtZXRlcnMoKTsKKyAgICAgICAgcGFyYW1zLnNldFNlcnZlck5hbWVzKHNlcnZlck5hbWVzKTsKKyAgICAgICAgc3NsZS5zZXRTU0xQYXJhbWV0ZXJzKHBhcmFtcyk7CisKKyAgICAgICAgLy8gaGFuZHNoYWtpbmcKKyAgICAgICAgaGFuZHNoYWtpbmcoc3NsZSwgc2MsIG51bGwpOworCisgICAgICAgIC8vIHNlbmQgb3V0IGFwcGxpY2F0aW9uIGRhdGEKKyAgICAgICAgZGVsaXZlcihzc2xlLCBzYyk7CisKKyAgICAgICAgLy8gcmVjZWl2ZSBhcHBsaWNhdGlvbiBkYXRhCisgICAgICAgIHJlY2VpdmUoc3NsZSwgc2MpOworCisgICAgICAgIC8vIGNoZWNrIHNlcnZlciBuYW1lIGluZGljYXRpb24KKyAgICAgICAgRXh0ZW5kZWRTU0xTZXNzaW9uIHNlc3Npb24gPSAoRXh0ZW5kZWRTU0xTZXNzaW9uKXNzbGUuZ2V0U2Vzc2lvbigpOworICAgICAgICBjaGVja1NOSUluU2Vzc2lvbihzZXNzaW9uKTsKKworICAgICAgICAvLyBjbG9zZSB0aGUgc29ja2V0IGNoYW5uZWwuCisgICAgICAgIHNjLmNsb3NlKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNsaWVudFJlcXVlc3RlZEhvc3RuYW1lID0gInd3dy5leGFtcGxlLmNvbSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHNlcnZlckFjY2VwdGFibGVIb3N0bmFtZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid3d3XFwuZXhhbXBsZVxcLihjb218b3JnKSI7CisKKyAgICB2b2lkIGNoZWNrQ2FwYWJpbGl0aWVzKFNTTENhcGFiaWxpdGllcyBjYXBhYmlsaXRpZXMsCisgICAgICAgICAgICBFeHRlbmRlZFNTTFNlc3Npb24gc2Vzc2lvbikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIExpc3Q8U05JU2VydmVyTmFtZT4gc2Vzc2lvblNOSSA9IHNlc3Npb24uZ2V0UmVxdWVzdGVkU2VydmVyTmFtZXMoKTsKKyAgICAgICAgaWYgKCFzZXNzaW9uU05JLmVxdWFscyhjYXBhYmlsaXRpZXMuZ2V0U2VydmVyTmFtZXMoKSkpIHsKKyAgICAgICAgICAgIGZvciAoU05JU2VydmVyTmFtZSBzbmkgOiBzZXNzaW9uU05JKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTTkkgaW4gc2Vzc2lvbiBpcyAiICsgc25pKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTGlzdDxTTklTZXJ2ZXJOYW1lPiBjYXBhU05JID0gY2FwYWJpbGl0aWVzLmdldFNlcnZlck5hbWVzKCk7CisgICAgICAgICAgICBmb3IgKFNOSVNlcnZlck5hbWUgc25pIDogY2FwYVNOSSkgeworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU05JIGluIHNlc3Npb24gaXMgIiArIHNuaSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJzZXJ2ZXIgbmFtZSBpbmRpY2F0aW9uIGRvZXMgbm90IG1hdGNoIGNhcGFiaWxpdGllcyIpOworICAgICAgICB9CisKKyAgICAgICAgY2hlY2tTTklJblNlc3Npb24oc2Vzc2lvbik7CisgICAgfQorCisgICAgdm9pZCBjaGVja1NOSUluU2Vzc2lvbihFeHRlbmRlZFNTTFNlc3Npb24gc2Vzc2lvbikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIExpc3Q8U05JU2VydmVyTmFtZT4gc2Vzc2lvblNOSSA9IHNlc3Npb24uZ2V0UmVxdWVzdGVkU2VydmVyTmFtZXMoKTsKKyAgICAgICAgaWYgKHNlc3Npb25TTkkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZCBlbXB0eSByZXF1ZXN0IHNlcnZlciBuYW1lIGluZGljYXRpb24iKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzZXNzaW9uU05JLnNpemUoKSAhPSAxKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZCByZXF1ZXN0IHNlcnZlciBuYW1lIGluZGljYXRpb24iKTsKKyAgICAgICAgfQorCisgICAgICAgIFNOSVNlcnZlck5hbWUgc2VydmVyTmFtZSA9IHNlc3Npb25TTkkuZ2V0KDApOworICAgICAgICBpZiAoIShzZXJ2ZXJOYW1lIGluc3RhbmNlb2YgU05JSG9zdE5hbWUpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZCBpbnN0YW5jZSBvZiByZXF1ZXN0IHNlcnZlciBuYW1lIGluZGljYXRpb24iKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBob3N0bmFtZSA9ICgoU05JSG9zdE5hbWUpc2VydmVyTmFtZSkuZ2V0QXNjaWlOYW1lKCk7CisgICAgICAgIGlmICghY2xpZW50UmVxdWVzdGVkSG9zdG5hbWUuZXF1YWxzSWdub3JlQ2FzZShob3N0bmFtZSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkIHJlcXVlc3Qgc2VydmVyIG5hbWUgaW5kaWNhdGlvbiB2YWx1ZSIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICogVGhlIHJlbWFpbmRlciBpcyBqdXN0IHN1cHBvcnQgc3R1ZmYKKyAgICAgKi8KKyAgICB2b2xhdGlsZSBFeGNlcHRpb24gc2VydmVyRXhjZXB0aW9uID0gbnVsbDsKKyAgICB2b2xhdGlsZSBFeGNlcHRpb24gY2xpZW50RXhjZXB0aW9uID0gbnVsbDsKKworICAgIC8vIHVzZSBhbnkgZnJlZSBwb3J0IGJ5IGRlZmF1bHQKKyAgICB2b2xhdGlsZSBpbnQgc2VydmVyUG9ydCA9IDA7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGRlYnVnKQorICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJqYXZheC5uZXQuZGVidWciLCAiYWxsIik7CisKKyAgICAgICAgbmV3IFNTTEVuZ2luZUV4cGxvcmVyV2l0aENsaSgpOworICAgIH0KKworICAgIFRocmVhZCBjbGllbnRUaHJlYWQgPSBudWxsOworICAgIFRocmVhZCBzZXJ2ZXJUaHJlYWQgPSBudWxsOworCisgICAgLyoKKyAgICAgKiBQcmltYXJ5IGNvbnN0cnVjdG9yLCB1c2VkIHRvIGRyaXZlIHJlbWFpbmRlciBvZiB0aGUgdGVzdC4KKyAgICAgKgorICAgICAqIEZvcmsgb2ZmIHRoZSBvdGhlciBzaWRlLCB0aGVuIGRvIHlvdXIgd29yay4KKyAgICAgKi8KKyAgICBTU0xFbmdpbmVFeHBsb3JlcldpdGhDbGkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIoIi4uLy4uLy4uLy4uL2V0YyIpOworCisgICAgICAgIGlmIChzZXBhcmF0ZVNlcnZlclRocmVhZCkgeworICAgICAgICAgICAgc3RhcnRTZXJ2ZXIodHJ1ZSk7CisgICAgICAgICAgICBzdGFydENsaWVudChmYWxzZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGFydENsaWVudCh0cnVlKTsKKyAgICAgICAgICAgIHN0YXJ0U2VydmVyKGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIFdhaXQgZm9yIG90aGVyIHNpZGUgdG8gY2xvc2UgZG93bi4KKyAgICAgICAgICovCisgICAgICAgIGlmIChzZXBhcmF0ZVNlcnZlclRocmVhZCkgeworICAgICAgICAgICAgc2VydmVyVGhyZWFkLmpvaW4oKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNsaWVudFRocmVhZC5qb2luKCk7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBXaGVuIHdlIGdldCBoZXJlLCB0aGUgdGVzdCBpcyBwcmV0dHkgbXVjaCBvdmVyLgorICAgICAgICAgKgorICAgICAgICAgKiBJZiB0aGUgbWFpbiB0aHJlYWQgZXhjZXB0ZWQsIHRoYXQgcHJvcGFnYXRlcyBiYWNrCisgICAgICAgICAqIGltbWVkaWF0ZWx5LiAgSWYgdGhlIG90aGVyIHRocmVhZCB0aHJldyBhbiBleGNlcHRpb24sIHdlCisgICAgICAgICAqIHNob3VsZCByZXBvcnQgYmFjay4KKyAgICAgICAgICovCisgICAgICAgIGlmIChzZXJ2ZXJFeGNlcHRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiU2VydmVyIEV4Y2VwdGlvbjoiKTsKKyAgICAgICAgICAgIHRocm93IHNlcnZlckV4Y2VwdGlvbjsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2xpZW50RXhjZXB0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIkNsaWVudCBFeGNlcHRpb246Iik7CisgICAgICAgICAgICB0aHJvdyBjbGllbnRFeGNlcHRpb247CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHN0YXJ0U2VydmVyKGJvb2xlYW4gbmV3VGhyZWFkKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG5ld1RocmVhZCkgeworICAgICAgICAgICAgc2VydmVyVGhyZWFkID0gbmV3IFRocmVhZCgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkb1NlcnZlclNpZGUoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBPdXIgc2VydmVyIHRocmVhZCBqdXN0IGRpZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAgICAgICAgICAgICAgICAgICAgICAgICogUmVsZWFzZSB0aGUgY2xpZW50LCBpZiBub3QgYWN0aXZlIGFscmVhZHkuLi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJTZXJ2ZXIgZGllZC4uLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKGUpOworICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyUmVhZHkgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyRXhjZXB0aW9uID0gZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBzZXJ2ZXJUaHJlYWQuc3RhcnQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRvU2VydmVyU2lkZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBzdGFydENsaWVudChib29sZWFuIG5ld1RocmVhZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChuZXdUaHJlYWQpIHsKKyAgICAgICAgICAgIGNsaWVudFRocmVhZCA9IG5ldyBUaHJlYWQoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgZG9DbGllbnRTaWRlKCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgICAgICogT3VyIGNsaWVudCB0aHJlYWQganVzdCBkaWVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkNsaWVudCBkaWVkLi4uIik7CisgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRFeGNlcHRpb24gPSBlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGNsaWVudFRocmVhZC5zdGFydCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZG9DbGllbnRTaWRlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvc3NsL2phdmF4L25ldC9zc2wvU2VydmVyTmFtZS9TU0xFbmdpbmVFeHBsb3JlcldpdGhTcnYuamF2YSBiL2pkay90ZXN0L3N1bi9zZWN1cml0eS9zc2wvamF2YXgvbmV0L3NzbC9TZXJ2ZXJOYW1lL1NTTEVuZ2luZUV4cGxvcmVyV2l0aFNydi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ZmQyNzAKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvc3NsL2phdmF4L25ldC9zc2wvU2VydmVyTmFtZS9TU0xFbmdpbmVFeHBsb3JlcldpdGhTcnYuamF2YQpAQCAtMCwwICsxLDM1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQorICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQorICogcXVlc3Rpb25zLgorICovCisKKy8vCisvLyBTdW5KU1NFIGRvZXMgbm90IHN1cHBvcnQgZHluYW1pYyBzeXN0ZW0gcHJvcGVydGllcywgbm8gd2F5IHRvIHJlLXVzZQorLy8gc3lzdGVtIHByb3BlcnRpZXMgaW4gc2FtZXZtL2FnZW50dm0gbW9kZS4KKy8vCisKKy8qCisgKiBAdGVzdAorICogQGJ1ZyA3MDY4MzIxCisgKiBAc3VtbWFyeSBTdXBwb3J0IFRMUyBTZXJ2ZXIgTmFtZSBJbmRpY2F0aW9uIChTTkkpIEV4dGVuc2lvbiBpbiBKU1NFIFNlcnZlcgorICogQGxpYnJhcnkgLi4vTmV3QVBJcy9TU0xFbmdpbmUgLi4vLi4vLi4vLi4vdGVtcGxhdGVzCisgKiBAYnVpbGQgU1NMRW5naW5lU2VydmljZSBTU0xDYXBhYmlsaXRpZXMgU1NMRXhwbG9yZXIKKyAqIEBydW4gbWFpbi9vdGhlcnZtIFNTTEVuZ2luZUV4cGxvcmVyV2l0aFNydgorICovCisKK2ltcG9ydCBqYXZheC5uZXQuc3NsLio7CitpbXBvcnQgamF2YS5uaW8uKjsKK2ltcG9ydCBqYXZhLm5ldC4qOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLio7CisKK3B1YmxpYyBjbGFzcyBTU0xFbmdpbmVFeHBsb3JlcldpdGhTcnYgZXh0ZW5kcyBTU0xFbmdpbmVTZXJ2aWNlIHsKKworICAgIC8qCisgICAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAqIFNldCB0aGUgdmFyaW91cyB2YXJpYWJsZXMgbmVlZGVkIGZvciB0aGUgdGVzdHMsIHRoZW4KKyAgICAgKiBzcGVjaWZ5IHdoYXQgdGVzdHMgdG8gcnVuIG9uIGVhY2ggc2lkZS4KKyAgICAgKi8KKworICAgIC8qCisgICAgICogU2hvdWxkIHdlIHJ1biB0aGUgY2xpZW50IG9yIHNlcnZlciBpbiBhIHNlcGFyYXRlIHRocmVhZD8KKyAgICAgKiBCb3RoIHNpZGVzIGNhbiB0aHJvdyBleGNlcHRpb25zLCBidXQgZG8geW91IGhhdmUgYSBwcmVmZXJlbmNlCisgICAgICogYXMgdG8gd2hpY2ggc2lkZSBzaG91bGQgYmUgdGhlIG1haW4gdGhyZWFkLgorICAgICAqLworICAgIHN0YXRpYyBib29sZWFuIHNlcGFyYXRlU2VydmVyVGhyZWFkID0gdHJ1ZTsKKworICAgIC8vIElzIHRoZSBzZXJ2ZXIgcmVhZHkgdG8gc2VydmU/CisgICAgdm9sYXRpbGUgc3RhdGljIGJvb2xlYW4gc2VydmVyUmVhZHkgPSBmYWxzZTsKKworICAgIC8qCisgICAgICogVHVybiBvbiBTU0wgZGVidWdnaW5nPworICAgICAqLworICAgIHN0YXRpYyBib29sZWFuIGRlYnVnID0gZmFsc2U7CisKKyAgICAvKgorICAgICAqIERlZmluZSB0aGUgc2VydmVyIHNpZGUgb2YgdGhlIHRlc3QuCisgICAgICoKKyAgICAgKiBJZiB0aGUgc2VydmVyIHByZW1hdHVyZWx5IGV4aXRzLCBzZXJ2ZXJSZWFkeSB3aWxsIGJlIHNldCB0byB0cnVlCisgICAgICogdG8gYXZvaWQgaW5maW5pdGUgaGFuZ3MuCisgICAgICovCisgICAgdm9pZCBkb1NlcnZlclNpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBjcmVhdGUgU1NMRW5naW5lLgorICAgICAgICBTU0xFbmdpbmUgc3NsZSA9IGNyZWF0ZVNTTEVuZ2luZShmYWxzZSk7CisKKyAgICAgICAgLy8gQ3JlYXRlIGEgc2VydmVyIHNvY2tldCBjaGFubmVsLgorICAgICAgICBJbmV0U29ja2V0QWRkcmVzcyBpc2EgPQorICAgICAgICAgICAgICAgIG5ldyBJbmV0U29ja2V0QWRkcmVzcyhJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSwgc2VydmVyUG9ydCk7CisgICAgICAgIFNlcnZlclNvY2tldENoYW5uZWwgc3NjID0gU2VydmVyU29ja2V0Q2hhbm5lbC5vcGVuKCk7CisgICAgICAgIHNzYy5zb2NrZXQoKS5iaW5kKGlzYSk7CisgICAgICAgIHNlcnZlclBvcnQgPSBzc2Muc29ja2V0KCkuZ2V0TG9jYWxQb3J0KCk7CisKKyAgICAgICAgLy8gU2lnbmFsIENsaWVudCwgd2UncmUgcmVhZHkgZm9yIGhpcyBjb25uZWN0LgorICAgICAgICBzZXJ2ZXJSZWFkeSA9IHRydWU7CisKKyAgICAgICAgLy8gQWNjZXB0IGEgc29ja2V0IGNoYW5uZWwuCisgICAgICAgIFNvY2tldENoYW5uZWwgc2MgPSBzc2MuYWNjZXB0KCk7CisKKyAgICAgICAgLy8gQ29tcGxldGUgY29ubmVjdGlvbi4KKyAgICAgICAgd2hpbGUgKCFzYy5maW5pc2hDb25uZWN0KCkpIHsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcCg1MCk7CisgICAgICAgICAgICAvLyB3YWl0aW5nIGZvciB0aGUgY29ubmVjdGlvbiBjb21wbGV0ZWQuCisgICAgICAgIH0KKworICAgICAgICBCeXRlQnVmZmVyIGJ1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoMHhGRik7CisgICAgICAgIGludCBwb3NpdGlvbiA9IDA7CisgICAgICAgIFNTTENhcGFiaWxpdGllcyBjYXBhYmlsaXRpZXMgPSBudWxsOworCisgICAgICAgIC8vIFJlYWQgdGhlIGhlYWRlciBvZiBUTFMgcmVjb3JkCisgICAgICAgIGJ1ZmZlci5saW1pdChTU0xFeHBsb3Jlci5SRUNPUkRfSEVBREVSX1NJWkUpOworICAgICAgICB3aGlsZSAocG9zaXRpb24gPCBTU0xFeHBsb3Jlci5SRUNPUkRfSEVBREVSX1NJWkUpIHsKKyAgICAgICAgICAgIGludCBuID0gc2MucmVhZChidWZmZXIpOworICAgICAgICAgICAgaWYgKG4gPCAwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigidW5leHBlY3RlZCBlbmQgb2Ygc3RyZWFtISIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcG9zaXRpb24gKz0gbjsKKyAgICAgICAgfQorICAgICAgICBidWZmZXIuZmxpcCgpOworCisgICAgICAgIGludCByZWNvcmRMZW5ndGggPSBTU0xFeHBsb3Jlci5nZXRSZXF1aXJlZFNpemUoYnVmZmVyKTsKKyAgICAgICAgaWYgKGJ1ZmZlci5jYXBhY2l0eSgpIDwgcmVjb3JkTGVuZ3RoKSB7CisgICAgICAgICAgICBCeXRlQnVmZmVyIG9sZEJ1ZmZlciA9IGJ1ZmZlcjsKKyAgICAgICAgICAgIGJ1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUocmVjb3JkTGVuZ3RoKTsKKyAgICAgICAgICAgIGJ1ZmZlci5wdXQob2xkQnVmZmVyKTsKKyAgICAgICAgfQorCisgICAgICAgIGJ1ZmZlci5wb3NpdGlvbihTU0xFeHBsb3Jlci5SRUNPUkRfSEVBREVSX1NJWkUpOworICAgICAgICBidWZmZXIubGltaXQoYnVmZmVyLmNhcGFjaXR5KCkpOworICAgICAgICB3aGlsZSAocG9zaXRpb24gPCByZWNvcmRMZW5ndGgpIHsKKyAgICAgICAgICAgIGludCBuID0gc2MucmVhZChidWZmZXIpOworICAgICAgICAgICAgaWYgKG4gPCAwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigidW5leHBlY3RlZCBlbmQgb2Ygc3RyZWFtISIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcG9zaXRpb24gKz0gbjsKKyAgICAgICAgfQorICAgICAgICBidWZmZXIuZmxpcCgpOworCisgICAgICAgIGNhcGFiaWxpdGllcyA9IFNTTEV4cGxvcmVyLmV4cGxvcmUoYnVmZmVyKTsKKyAgICAgICAgaWYgKGNhcGFiaWxpdGllcyAhPSBudWxsKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJlY29yZCB2ZXJzaW9uOiAiICsKKyAgICAgICAgICAgICAgICAgICAgY2FwYWJpbGl0aWVzLmdldFJlY29yZFZlcnNpb24oKSk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkhlbGxvIHZlcnNpb246ICIgKworICAgICAgICAgICAgICAgICAgICBjYXBhYmlsaXRpZXMuZ2V0SGVsbG9WZXJzaW9uKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gZW5hYmxlIHNlcnZlciBuYW1lIGluZGljYXRpb24gY2hlY2tpbmcKKyAgICAgICAgU05JTWF0Y2hlciBtYXRjaGVyID0gU05JSG9zdE5hbWUuY3JlYXRlU05JTWF0Y2hlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlckFjY2VwdGFibGVIb3N0bmFtZSk7CisgICAgICAgIENvbGxlY3Rpb248U05JTWF0Y2hlcj4gbWF0Y2hlcnMgPSBuZXcgQXJyYXlMaXN0PD4oMSk7CisgICAgICAgIG1hdGNoZXJzLmFkZChtYXRjaGVyKTsKKyAgICAgICAgU1NMUGFyYW1ldGVycyBwYXJhbXMgPSBzc2xlLmdldFNTTFBhcmFtZXRlcnMoKTsKKyAgICAgICAgcGFyYW1zLnNldFNOSU1hdGNoZXJzKG1hdGNoZXJzKTsKKyAgICAgICAgc3NsZS5zZXRTU0xQYXJhbWV0ZXJzKHBhcmFtcyk7CisKKyAgICAgICAgLy8gaGFuZHNoYWtpbmcKKyAgICAgICAgaGFuZHNoYWtpbmcoc3NsZSwgc2MsIGJ1ZmZlcik7CisKKyAgICAgICAgLy8gcmVjZWl2ZSBhcHBsaWNhdGlvbiBkYXRhCisgICAgICAgIHJlY2VpdmUoc3NsZSwgc2MpOworCisgICAgICAgIC8vIHNlbmQgb3V0IGFwcGxpY2F0aW9uIGRhdGEKKyAgICAgICAgZGVsaXZlcihzc2xlLCBzYyk7CisKKyAgICAgICAgLy8gY2hlY2sgc2VydmVyIG5hbWUgaW5kaWNhdGlvbgorICAgICAgICBFeHRlbmRlZFNTTFNlc3Npb24gc2Vzc2lvbiA9IChFeHRlbmRlZFNTTFNlc3Npb24pc3NsZS5nZXRTZXNzaW9uKCk7CisgICAgICAgIGNoZWNrQ2FwYWJpbGl0aWVzKGNhcGFiaWxpdGllcywgc2Vzc2lvbik7CisKKyAgICAgICAgLy8gY2xvc2UgdGhlIHNvY2tldCBjaGFubmVsLgorICAgICAgICBzYy5jbG9zZSgpOworICAgICAgICBzc2MuY2xvc2UoKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIERlZmluZSB0aGUgY2xpZW50IHNpZGUgb2YgdGhlIHRlc3QuCisgICAgICoKKyAgICAgKiBJZiB0aGUgc2VydmVyIHByZW1hdHVyZWx5IGV4aXRzLCBzZXJ2ZXJSZWFkeSB3aWxsIGJlIHNldCB0byB0cnVlCisgICAgICogdG8gYXZvaWQgaW5maW5pdGUgaGFuZ3MuCisgICAgICovCisgICAgdm9pZCBkb0NsaWVudFNpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gY3JlYXRlIFNTTEVuZ2luZS4KKyAgICAgICAgU1NMRW5naW5lIHNzbGUgPSBjcmVhdGVTU0xFbmdpbmUodHJ1ZSk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogV2FpdCBmb3Igc2VydmVyIHRvIGdldCBzdGFydGVkLgorICAgICAgICAgKi8KKyAgICAgICAgd2hpbGUgKCFzZXJ2ZXJSZWFkeSkgeworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDUwKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENyZWF0ZSBhIG5vbi1ibG9ja2luZyBzb2NrZXQgY2hhbm5lbC4KKyAgICAgICAgU29ja2V0Q2hhbm5lbCBzYyA9IFNvY2tldENoYW5uZWwub3BlbigpOworICAgICAgICBzYy5jb25maWd1cmVCbG9ja2luZyhmYWxzZSk7CisgICAgICAgIEluZXRTb2NrZXRBZGRyZXNzIGlzYSA9CisgICAgICAgICAgICAgICAgbmV3IEluZXRTb2NrZXRBZGRyZXNzKEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLCBzZXJ2ZXJQb3J0KTsKKyAgICAgICAgc2MuY29ubmVjdChpc2EpOworCisgICAgICAgIC8vIENvbXBsZXRlIGNvbm5lY3Rpb24uCisgICAgICAgIHdoaWxlICghc2MuZmluaXNoQ29ubmVjdCgpICkgeworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDUwKTsKKyAgICAgICAgICAgIC8vIHdhaXRpbmcgZm9yIHRoZSBjb25uZWN0aW9uIGNvbXBsZXRlZC4KKyAgICAgICAgfQorCisgICAgICAgIC8vIGhhbmRzaGFraW5nCisgICAgICAgIGhhbmRzaGFraW5nKHNzbGUsIHNjLCBudWxsKTsKKworICAgICAgICAvLyBzZW5kIG91dCBhcHBsaWNhdGlvbiBkYXRhCisgICAgICAgIGRlbGl2ZXIoc3NsZSwgc2MpOworCisgICAgICAgIC8vIHJlY2VpdmUgYXBwbGljYXRpb24gZGF0YQorICAgICAgICByZWNlaXZlKHNzbGUsIHNjKTsKKworICAgICAgICAvLyBjaGVjayBzZXJ2ZXIgbmFtZSBpbmRpY2F0aW9uCisgICAgICAgIEV4dGVuZGVkU1NMU2Vzc2lvbiBzZXNzaW9uID0gKEV4dGVuZGVkU1NMU2Vzc2lvbilzc2xlLmdldFNlc3Npb24oKTsKKyAgICAgICAgY2hlY2tTTklJblNlc3Npb24oc2Vzc2lvbik7CisKKyAgICAgICAgLy8gY2xvc2UgdGhlIHNvY2tldCBjaGFubmVsLgorICAgICAgICBzYy5jbG9zZSgpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBjbGllbnRSZXF1ZXN0ZWRIb3N0bmFtZSA9ICJ3d3cuZXhhbXBsZS5jb20iOworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBzZXJ2ZXJBY2NlcHRhYmxlSG9zdG5hbWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInd3d1xcLmV4YW1wbGVcXC4oY29tfG9yZykiOworCisgICAgdm9pZCBjaGVja0NhcGFiaWxpdGllcyhTU0xDYXBhYmlsaXRpZXMgY2FwYWJpbGl0aWVzLAorICAgICAgICAgICAgRXh0ZW5kZWRTU0xTZXNzaW9uIHNlc3Npb24pIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBMaXN0PFNOSVNlcnZlck5hbWU+IHNlc3Npb25TTkkgPSBzZXNzaW9uLmdldFJlcXVlc3RlZFNlcnZlck5hbWVzKCk7CisgICAgICAgIGlmICghc2Vzc2lvblNOSS5lcXVhbHMoY2FwYWJpbGl0aWVzLmdldFNlcnZlck5hbWVzKCkpKSB7CisgICAgICAgICAgICBmb3IgKFNOSVNlcnZlck5hbWUgc25pIDogc2Vzc2lvblNOSSkgeworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU05JIGluIHNlc3Npb24gaXMgIiArIHNuaSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIExpc3Q8U05JU2VydmVyTmFtZT4gY2FwYVNOSSA9IGNhcGFiaWxpdGllcy5nZXRTZXJ2ZXJOYW1lcygpOworICAgICAgICAgICAgZm9yIChTTklTZXJ2ZXJOYW1lIHNuaSA6IGNhcGFTTkkpIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNOSSBpbiBzZXNzaW9uIGlzICIgKyBzbmkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAic2VydmVyIG5hbWUgaW5kaWNhdGlvbiBkb2VzIG5vdCBtYXRjaCBjYXBhYmlsaXRpZXMiKTsKKyAgICAgICAgfQorCisgICAgICAgIGNoZWNrU05JSW5TZXNzaW9uKHNlc3Npb24pOworICAgIH0KKworICAgIHZvaWQgY2hlY2tTTklJblNlc3Npb24oRXh0ZW5kZWRTU0xTZXNzaW9uIHNlc3Npb24pIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBMaXN0PFNOSVNlcnZlck5hbWU+IHNlc3Npb25TTkkgPSBzZXNzaW9uLmdldFJlcXVlc3RlZFNlcnZlck5hbWVzKCk7CisgICAgICAgIGlmICghc2Vzc2lvblNOSS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJzaG91bGQgYmUgZW1wdHkgcmVxdWVzdCBzZXJ2ZXIgbmFtZSBpbmRpY2F0aW9uIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgKiBUaGUgcmVtYWluZGVyIGlzIGp1c3Qgc3VwcG9ydCBzdHVmZgorICAgICAqLworICAgIHZvbGF0aWxlIEV4Y2VwdGlvbiBzZXJ2ZXJFeGNlcHRpb24gPSBudWxsOworICAgIHZvbGF0aWxlIEV4Y2VwdGlvbiBjbGllbnRFeGNlcHRpb24gPSBudWxsOworCisgICAgLy8gdXNlIGFueSBmcmVlIHBvcnQgYnkgZGVmYXVsdAorICAgIHZvbGF0aWxlIGludCBzZXJ2ZXJQb3J0ID0gMDsKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoZGVidWcpCisgICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImphdmF4Lm5ldC5kZWJ1ZyIsICJhbGwiKTsKKworICAgICAgICBuZXcgU1NMRW5naW5lRXhwbG9yZXJXaXRoU3J2KCk7CisgICAgfQorCisgICAgVGhyZWFkIGNsaWVudFRocmVhZCA9IG51bGw7CisgICAgVGhyZWFkIHNlcnZlclRocmVhZCA9IG51bGw7CisKKyAgICAvKgorICAgICAqIFByaW1hcnkgY29uc3RydWN0b3IsIHVzZWQgdG8gZHJpdmUgcmVtYWluZGVyIG9mIHRoZSB0ZXN0LgorICAgICAqCisgICAgICogRm9yayBvZmYgdGhlIG90aGVyIHNpZGUsIHRoZW4gZG8geW91ciB3b3JrLgorICAgICAqLworICAgIFNTTEVuZ2luZUV4cGxvcmVyV2l0aFNydigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlcigiLi4vLi4vLi4vLi4vZXRjIik7CisKKyAgICAgICAgaWYgKHNlcGFyYXRlU2VydmVyVGhyZWFkKSB7CisgICAgICAgICAgICBzdGFydFNlcnZlcih0cnVlKTsKKyAgICAgICAgICAgIHN0YXJ0Q2xpZW50KGZhbHNlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXJ0Q2xpZW50KHRydWUpOworICAgICAgICAgICAgc3RhcnRTZXJ2ZXIoZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogV2FpdCBmb3Igb3RoZXIgc2lkZSB0byBjbG9zZSBkb3duLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHNlcGFyYXRlU2VydmVyVGhyZWFkKSB7CisgICAgICAgICAgICBzZXJ2ZXJUaHJlYWQuam9pbigpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2xpZW50VGhyZWFkLmpvaW4oKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIFdoZW4gd2UgZ2V0IGhlcmUsIHRoZSB0ZXN0IGlzIHByZXR0eSBtdWNoIG92ZXIuCisgICAgICAgICAqCisgICAgICAgICAqIElmIHRoZSBtYWluIHRocmVhZCBleGNlcHRlZCwgdGhhdCBwcm9wYWdhdGVzIGJhY2sKKyAgICAgICAgICogaW1tZWRpYXRlbHkuICBJZiB0aGUgb3RoZXIgdGhyZWFkIHRocmV3IGFuIGV4Y2VwdGlvbiwgd2UKKyAgICAgICAgICogc2hvdWxkIHJlcG9ydCBiYWNrLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHNlcnZlckV4Y2VwdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJTZXJ2ZXIgRXhjZXB0aW9uOiIpOworICAgICAgICAgICAgdGhyb3cgc2VydmVyRXhjZXB0aW9uOworICAgICAgICB9CisgICAgICAgIGlmIChjbGllbnRFeGNlcHRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiQ2xpZW50IEV4Y2VwdGlvbjoiKTsKKyAgICAgICAgICAgIHRocm93IGNsaWVudEV4Y2VwdGlvbjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgc3RhcnRTZXJ2ZXIoYm9vbGVhbiBuZXdUaHJlYWQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAobmV3VGhyZWFkKSB7CisgICAgICAgICAgICBzZXJ2ZXJUaHJlYWQgPSBuZXcgVGhyZWFkKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvU2VydmVyU2lkZSgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIE91ciBzZXJ2ZXIgdGhyZWFkIGp1c3QgZGllZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBSZWxlYXNlIHRoZSBjbGllbnQsIGlmIG5vdCBhY3RpdmUgYWxyZWFkeS4uLgorICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlNlcnZlciBkaWVkLi4uIik7CisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJSZWFkeSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJFeGNlcHRpb24gPSBlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHNlcnZlclRocmVhZC5zdGFydCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZG9TZXJ2ZXJTaWRlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHN0YXJ0Q2xpZW50KGJvb2xlYW4gbmV3VGhyZWFkKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG5ld1RocmVhZCkgeworICAgICAgICAgICAgY2xpZW50VGhyZWFkID0gbmV3IFRocmVhZCgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkb0NsaWVudFNpZGUoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBPdXIgY2xpZW50IHRocmVhZCBqdXN0IGRpZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiQ2xpZW50IGRpZWQuLi4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudEV4Y2VwdGlvbiA9IGU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgY2xpZW50VGhyZWFkLnN0YXJ0KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkb0NsaWVudFNpZGUoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2pkay90ZXN0L3N1bi9zZWN1cml0eS9zc2wvamF2YXgvbmV0L3NzbC9TZXJ2ZXJOYW1lL1NTTFNvY2tldENvbnNpc3RlbnRTTkkuamF2YSBiL2pkay90ZXN0L3N1bi9zZWN1cml0eS9zc2wvamF2YXgvbmV0L3NzbC9TZXJ2ZXJOYW1lL1NTTFNvY2tldENvbnNpc3RlbnRTTkkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWZmNjkxCi0tLSAvZGV2L251bGwKKysrIGIvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L3NzbC9qYXZheC9uZXQvc3NsL1NlcnZlck5hbWUvU1NMU29ja2V0Q29uc2lzdGVudFNOSS5qYXZhCkBAIC0wLDAgKzEsMzU3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCisgKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CisgKiBxdWVzdGlvbnMuCisgKi8KKworLy8KKy8vIFN1bkpTU0UgZG9lcyBub3Qgc3VwcG9ydCBkeW5hbWljIHN5c3RlbSBwcm9wZXJ0aWVzLCBubyB3YXkgdG8gcmUtdXNlCisvLyBzeXN0ZW0gcHJvcGVydGllcyBpbiBzYW1ldm0vYWdlbnR2bSBtb2RlLgorLy8KKworLyoqCisgKiBAdGVzdAorICogQGJ1ZyA3MDY4MzIxCisgKiBAc3VtbWFyeSBTdXBwb3J0IFRMUyBTZXJ2ZXIgTmFtZSBJbmRpY2F0aW9uIChTTkkpIEV4dGVuc2lvbiBpbiBKU1NFIFNlcnZlcgorICogQHJ1biBtYWluL290aGVydm0gU1NMU29ja2V0Q29uc2lzdGVudFNOSQorICovCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS5uaW8uKjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy4qOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEubmV0Lio7CitpbXBvcnQgamF2YXgubmV0LnNzbC4qOworCitwdWJsaWMgY2xhc3MgU1NMU29ja2V0Q29uc2lzdGVudFNOSSB7CisKKyAgICAvKgorICAgICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgKiBTZXQgdGhlIHZhcmlvdXMgdmFyaWFibGVzIG5lZWRlZCBmb3IgdGhlIHRlc3RzLCB0aGVuCisgICAgICogc3BlY2lmeSB3aGF0IHRlc3RzIHRvIHJ1biBvbiBlYWNoIHNpZGUuCisgICAgICovCisKKyAgICAvKgorICAgICAqIFNob3VsZCB3ZSBydW4gdGhlIGNsaWVudCBvciBzZXJ2ZXIgaW4gYSBzZXBhcmF0ZSB0aHJlYWQ/CisgICAgICogQm90aCBzaWRlcyBjYW4gdGhyb3cgZXhjZXB0aW9ucywgYnV0IGRvIHlvdSBoYXZlIGEgcHJlZmVyZW5jZQorICAgICAqIGFzIHRvIHdoaWNoIHNpZGUgc2hvdWxkIGJlIHRoZSBtYWluIHRocmVhZC4KKyAgICAgKi8KKyAgICBzdGF0aWMgYm9vbGVhbiBzZXBhcmF0ZVNlcnZlclRocmVhZCA9IHRydWU7CisKKyAgICAvKgorICAgICAqIFdoZXJlIGRvIHdlIGZpbmQgdGhlIGtleXN0b3Jlcz8KKyAgICAgKi8KKyAgICBzdGF0aWMgU3RyaW5nIHBhdGhUb1N0b3JlcyA9ICIuLi8uLi8uLi8uLi9ldGMiOworICAgIHN0YXRpYyBTdHJpbmcga2V5U3RvcmVGaWxlID0gImtleXN0b3JlIjsKKyAgICBzdGF0aWMgU3RyaW5nIHRydXN0U3RvcmVGaWxlID0gInRydXN0c3RvcmUiOworICAgIHN0YXRpYyBTdHJpbmcgcGFzc3dkID0gInBhc3NwaHJhc2UiOworCisgICAgLyoKKyAgICAgKiBJcyB0aGUgc2VydmVyIHJlYWR5IHRvIHNlcnZlPworICAgICAqLworICAgIHZvbGF0aWxlIHN0YXRpYyBib29sZWFuIHNlcnZlclJlYWR5ID0gZmFsc2U7CisKKyAgICAvKgorICAgICAqIFR1cm4gb24gU1NMIGRlYnVnZ2luZz8KKyAgICAgKi8KKyAgICBzdGF0aWMgYm9vbGVhbiBkZWJ1ZyA9IGZhbHNlOworCisgICAgLyoKKyAgICAgKiBJZiB0aGUgY2xpZW50IG9yIHNlcnZlciBpcyBkb2luZyBzb21lIGtpbmQgb2Ygb2JqZWN0IGNyZWF0aW9uCisgICAgICogdGhhdCB0aGUgb3RoZXIgc2lkZSBkZXBlbmRzIG9uLCBhbmQgdGhhdCB0aHJlYWQgcHJlbWF0dXJlbHkKKyAgICAgKiBleGl0cywgeW91IG1heSBleHBlcmllbmNlIGEgaGFuZy4gIFRoZSB0ZXN0IGhhcm5lc3Mgd2lsbAorICAgICAqIHRlcm1pbmF0ZSBhbGwgaHVuZyB0aHJlYWRzIGFmdGVyIGl0cyB0aW1lb3V0IGhhcyBleHBpcmVkLAorICAgICAqIGN1cnJlbnRseSAzIG1pbnV0ZXMgYnkgZGVmYXVsdCwgYnV0IHlvdSBtaWdodCB0cnkgdG8gYmUKKyAgICAgKiBzbWFydCBhYm91dCBpdC4uLi4KKyAgICAgKi8KKworICAgIC8qCisgICAgICogRGVmaW5lIHRoZSBzZXJ2ZXIgc2lkZSBvZiB0aGUgdGVzdC4KKyAgICAgKgorICAgICAqIElmIHRoZSBzZXJ2ZXIgcHJlbWF0dXJlbHkgZXhpdHMsIHNlcnZlclJlYWR5IHdpbGwgYmUgc2V0IHRvIHRydWUKKyAgICAgKiB0byBhdm9pZCBpbmZpbml0ZSBoYW5ncy4KKyAgICAgKi8KKyAgICB2b2lkIGRvU2VydmVyU2lkZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTU0xTZXJ2ZXJTb2NrZXRGYWN0b3J5IHNzbHNzZiA9CisgICAgICAgICAgICAoU1NMU2VydmVyU29ja2V0RmFjdG9yeSkgU1NMU2VydmVyU29ja2V0RmFjdG9yeS5nZXREZWZhdWx0KCk7CisgICAgICAgIFNTTFNlcnZlclNvY2tldCBzc2xTZXJ2ZXJTb2NrZXQgPQorICAgICAgICAgICAgKFNTTFNlcnZlclNvY2tldCkgc3Nsc3NmLmNyZWF0ZVNlcnZlclNvY2tldChzZXJ2ZXJQb3J0KTsKKworICAgICAgICBTTklNYXRjaGVyIG1hdGNoZXIgPSBTTklIb3N0TmFtZS5jcmVhdGVTTklNYXRjaGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyQWNjZXB0YWJsZUhvc3RuYW1lKTsKKyAgICAgICAgQ29sbGVjdGlvbjxTTklNYXRjaGVyPiBtYXRjaGVycyA9IG5ldyBBcnJheUxpc3Q8PigxKTsKKyAgICAgICAgbWF0Y2hlcnMuYWRkKG1hdGNoZXIpOworICAgICAgICBTU0xQYXJhbWV0ZXJzIHBhcmFtcyA9IHNzbFNlcnZlclNvY2tldC5nZXRTU0xQYXJhbWV0ZXJzKCk7CisgICAgICAgIHBhcmFtcy5zZXRTTklNYXRjaGVycyhtYXRjaGVycyk7CisgICAgICAgIHNzbFNlcnZlclNvY2tldC5zZXRTU0xQYXJhbWV0ZXJzKHBhcmFtcyk7CisKKyAgICAgICAgc2VydmVyUG9ydCA9IHNzbFNlcnZlclNvY2tldC5nZXRMb2NhbFBvcnQoKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBTaWduYWwgQ2xpZW50LCB3ZSdyZSByZWFkeSBmb3IgaGlzIGNvbm5lY3QuCisgICAgICAgICAqLworICAgICAgICBzZXJ2ZXJSZWFkeSA9IHRydWU7CisKKyAgICAgICAgU1NMU29ja2V0IHNzbFNvY2tldCA9IChTU0xTb2NrZXQpIHNzbFNlcnZlclNvY2tldC5hY2NlcHQoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIElucHV0U3RyZWFtIHNzbElTID0gc3NsU29ja2V0LmdldElucHV0U3RyZWFtKCk7CisgICAgICAgICAgICBPdXRwdXRTdHJlYW0gc3NsT1MgPSBzc2xTb2NrZXQuZ2V0T3V0cHV0U3RyZWFtKCk7CisKKyAgICAgICAgICAgIHNzbElTLnJlYWQoKTsKKyAgICAgICAgICAgIHNzbE9TLndyaXRlKDg1KTsKKyAgICAgICAgICAgIHNzbE9TLmZsdXNoKCk7CisKKyAgICAgICAgICAgIEV4dGVuZGVkU1NMU2Vzc2lvbiBzZXNzaW9uID0KKyAgICAgICAgICAgICAgICAgICAgKEV4dGVuZGVkU1NMU2Vzc2lvbilzc2xTb2NrZXQuZ2V0U2Vzc2lvbigpOworICAgICAgICAgICAgY2hlY2tTTklJblNlc3Npb24oc2Vzc2lvbik7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBzc2xTb2NrZXQuY2xvc2UoKTsKKyAgICAgICAgICAgIHNzbFNlcnZlclNvY2tldC5jbG9zZSgpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKgorICAgICAqIERlZmluZSB0aGUgY2xpZW50IHNpZGUgb2YgdGhlIHRlc3QuCisgICAgICoKKyAgICAgKiBJZiB0aGUgc2VydmVyIHByZW1hdHVyZWx5IGV4aXRzLCBzZXJ2ZXJSZWFkeSB3aWxsIGJlIHNldCB0byB0cnVlCisgICAgICogdG8gYXZvaWQgaW5maW5pdGUgaGFuZ3MuCisgICAgICovCisgICAgdm9pZCBkb0NsaWVudFNpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICAvKgorICAgICAgICAgKiBXYWl0IGZvciBzZXJ2ZXIgdG8gZ2V0IHN0YXJ0ZWQuCisgICAgICAgICAqLworICAgICAgICB3aGlsZSAoIXNlcnZlclJlYWR5KSB7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoNTApOworICAgICAgICB9CisKKyAgICAgICAgU1NMU29ja2V0RmFjdG9yeSBzc2xzZiA9CisgICAgICAgICAgICAoU1NMU29ja2V0RmFjdG9yeSkgU1NMU29ja2V0RmFjdG9yeS5nZXREZWZhdWx0KCk7CisgICAgICAgIFNTTFNvY2tldCBzc2xTb2NrZXQgPSAoU1NMU29ja2V0KQorICAgICAgICAgICAgc3Nsc2YuY3JlYXRlU29ja2V0KCJsb2NhbGhvc3QiLCBzZXJ2ZXJQb3J0KTsKKworICAgICAgICBTTklIb3N0TmFtZSBzZXJ2ZXJOYW1lID0gbmV3IFNOSUhvc3ROYW1lKGNsaWVudFJlcXVlc3RlZEhvc3RuYW1lKTsKKyAgICAgICAgTGlzdDxTTklTZXJ2ZXJOYW1lPiBzZXJ2ZXJOYW1lcyA9IG5ldyBBcnJheUxpc3Q8PigxKTsKKyAgICAgICAgc2VydmVyTmFtZXMuYWRkKHNlcnZlck5hbWUpOworICAgICAgICBTU0xQYXJhbWV0ZXJzIHBhcmFtcyA9IHNzbFNvY2tldC5nZXRTU0xQYXJhbWV0ZXJzKCk7CisgICAgICAgIHBhcmFtcy5zZXRTZXJ2ZXJOYW1lcyhzZXJ2ZXJOYW1lcyk7CisgICAgICAgIHNzbFNvY2tldC5zZXRTU0xQYXJhbWV0ZXJzKHBhcmFtcyk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIElucHV0U3RyZWFtIHNzbElTID0gc3NsU29ja2V0LmdldElucHV0U3RyZWFtKCk7CisgICAgICAgICAgICBPdXRwdXRTdHJlYW0gc3NsT1MgPSBzc2xTb2NrZXQuZ2V0T3V0cHV0U3RyZWFtKCk7CisKKyAgICAgICAgICAgIHNzbE9TLndyaXRlKDI4MCk7CisgICAgICAgICAgICBzc2xPUy5mbHVzaCgpOworICAgICAgICAgICAgc3NsSVMucmVhZCgpOworCisgICAgICAgICAgICBFeHRlbmRlZFNTTFNlc3Npb24gc2Vzc2lvbiA9CisgICAgICAgICAgICAgICAgICAgIChFeHRlbmRlZFNTTFNlc3Npb24pc3NsU29ja2V0LmdldFNlc3Npb24oKTsKKyAgICAgICAgICAgIGNoZWNrU05JSW5TZXNzaW9uKHNlc3Npb24pOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgc3NsU29ja2V0LmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgY2xpZW50UmVxdWVzdGVkSG9zdG5hbWUgPSAid3d3LmV4YW1wbGUuY29tIjsKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgc2VydmVyQWNjZXB0YWJsZUhvc3RuYW1lID0gInd3d1xcLmV4YW1wbGVcXC5jb20iOworCisgICAgdm9pZCBjaGVja1NOSUluU2Vzc2lvbihFeHRlbmRlZFNTTFNlc3Npb24gc2Vzc2lvbikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIExpc3Q8U05JU2VydmVyTmFtZT4gc2Vzc2lvblNOSSA9IHNlc3Npb24uZ2V0UmVxdWVzdGVkU2VydmVyTmFtZXMoKTsKKyAgICAgICAgaWYgKHNlc3Npb25TTkkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZCBlbXB0eSByZXF1ZXN0IHNlcnZlciBuYW1lIGluZGljYXRpb24iKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzZXNzaW9uU05JLnNpemUoKSAhPSAxKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZCByZXF1ZXN0IHNlcnZlciBuYW1lIGluZGljYXRpb24iKTsKKyAgICAgICAgfQorCisgICAgICAgIFNOSVNlcnZlck5hbWUgc2VydmVyTmFtZSA9IHNlc3Npb25TTkkuZ2V0KDApOworICAgICAgICBpZiAoIShzZXJ2ZXJOYW1lIGluc3RhbmNlb2YgU05JSG9zdE5hbWUpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZCBpbnN0YW5jZSBvZiByZXF1ZXN0IHNlcnZlciBuYW1lIGluZGljYXRpb24iKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBob3N0bmFtZSA9ICgoU05JSG9zdE5hbWUpc2VydmVyTmFtZSkuZ2V0QXNjaWlOYW1lKCk7CisgICAgICAgIGlmICghY2xpZW50UmVxdWVzdGVkSG9zdG5hbWUuZXF1YWxzSWdub3JlQ2FzZShob3N0bmFtZSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkIHJlcXVlc3Qgc2VydmVyIG5hbWUgaW5kaWNhdGlvbiB2YWx1ZSIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICogVGhlIHJlbWFpbmRlciBpcyBqdXN0IHN1cHBvcnQgc3R1ZmYKKyAgICAgKi8KKworICAgIC8vIHVzZSBhbnkgZnJlZSBwb3J0IGJ5IGRlZmF1bHQKKyAgICB2b2xhdGlsZSBpbnQgc2VydmVyUG9ydCA9IDA7CisKKyAgICB2b2xhdGlsZSBFeGNlcHRpb24gc2VydmVyRXhjZXB0aW9uID0gbnVsbDsKKyAgICB2b2xhdGlsZSBFeGNlcHRpb24gY2xpZW50RXhjZXB0aW9uID0gbnVsbDsKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcga2V5RmlsZW5hbWUgPQorICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KCJ0ZXN0LnNyYyIsICIuIikgKyAiLyIgKyBwYXRoVG9TdG9yZXMgKworICAgICAgICAgICAgICAgICIvIiArIGtleVN0b3JlRmlsZTsKKyAgICAgICAgU3RyaW5nIHRydXN0RmlsZW5hbWUgPQorICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KCJ0ZXN0LnNyYyIsICIuIikgKyAiLyIgKyBwYXRoVG9TdG9yZXMgKworICAgICAgICAgICAgICAgICIvIiArIHRydXN0U3RvcmVGaWxlOworCisgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiamF2YXgubmV0LnNzbC5rZXlTdG9yZSIsIGtleUZpbGVuYW1lKTsKKyAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJqYXZheC5uZXQuc3NsLmtleVN0b3JlUGFzc3dvcmQiLCBwYXNzd2QpOworICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImphdmF4Lm5ldC5zc2wudHJ1c3RTdG9yZSIsIHRydXN0RmlsZW5hbWUpOworICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImphdmF4Lm5ldC5zc2wudHJ1c3RTdG9yZVBhc3N3b3JkIiwgcGFzc3dkKTsKKworICAgICAgICBpZiAoZGVidWcpCisgICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImphdmF4Lm5ldC5kZWJ1ZyIsICJhbGwiKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBTdGFydCB0aGUgdGVzdHMuCisgICAgICAgICAqLworICAgICAgICBuZXcgU1NMU29ja2V0Q29uc2lzdGVudFNOSSgpOworICAgIH0KKworICAgIFRocmVhZCBjbGllbnRUaHJlYWQgPSBudWxsOworICAgIFRocmVhZCBzZXJ2ZXJUaHJlYWQgPSBudWxsOworCisgICAgLyoKKyAgICAgKiBQcmltYXJ5IGNvbnN0cnVjdG9yLCB1c2VkIHRvIGRyaXZlIHJlbWFpbmRlciBvZiB0aGUgdGVzdC4KKyAgICAgKgorICAgICAqIEZvcmsgb2ZmIHRoZSBvdGhlciBzaWRlLCB0aGVuIGRvIHlvdXIgd29yay4KKyAgICAgKi8KKyAgICBTU0xTb2NrZXRDb25zaXN0ZW50U05JKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoc2VwYXJhdGVTZXJ2ZXJUaHJlYWQpIHsKKyAgICAgICAgICAgICAgICBzdGFydFNlcnZlcih0cnVlKTsKKyAgICAgICAgICAgICAgICBzdGFydENsaWVudChmYWxzZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN0YXJ0Q2xpZW50KHRydWUpOworICAgICAgICAgICAgICAgIHN0YXJ0U2VydmVyKGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIHN3YWxsb3cgZm9yIG5vdy4gIFNob3cgbGF0ZXIKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIFdhaXQgZm9yIG90aGVyIHNpZGUgdG8gY2xvc2UgZG93bi4KKyAgICAgICAgICovCisgICAgICAgIGlmIChzZXBhcmF0ZVNlcnZlclRocmVhZCkgeworICAgICAgICAgICAgc2VydmVyVGhyZWFkLmpvaW4oKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNsaWVudFRocmVhZC5qb2luKCk7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBXaGVuIHdlIGdldCBoZXJlLCB0aGUgdGVzdCBpcyBwcmV0dHkgbXVjaCBvdmVyLgorICAgICAgICAgKiBXaGljaCBzaWRlIHRocmV3IHRoZSBlcnJvcj8KKyAgICAgICAgICovCisgICAgICAgIEV4Y2VwdGlvbiBsb2NhbDsKKyAgICAgICAgRXhjZXB0aW9uIHJlbW90ZTsKKyAgICAgICAgU3RyaW5nIHdoaWNoUmVtb3RlOworCisgICAgICAgIGlmIChzZXBhcmF0ZVNlcnZlclRocmVhZCkgeworICAgICAgICAgICAgcmVtb3RlID0gc2VydmVyRXhjZXB0aW9uOworICAgICAgICAgICAgbG9jYWwgPSBjbGllbnRFeGNlcHRpb247CisgICAgICAgICAgICB3aGljaFJlbW90ZSA9ICJzZXJ2ZXIiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVtb3RlID0gY2xpZW50RXhjZXB0aW9uOworICAgICAgICAgICAgbG9jYWwgPSBzZXJ2ZXJFeGNlcHRpb247CisgICAgICAgICAgICB3aGljaFJlbW90ZSA9ICJjbGllbnQiOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogSWYgYm90aCBmYWlsZWQsIHJldHVybiB0aGUgY3VydGhyZWFkJ3MgZXhjZXB0aW9uLCBidXQgYWxzbworICAgICAgICAgKiBwcmludCB0aGUgcmVtb3RlIHNpZGUgRXhjZXB0aW9uCisgICAgICAgICAqLworICAgICAgICBpZiAoKGxvY2FsICE9IG51bGwpICYmIChyZW1vdGUgIT0gbnVsbCkpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih3aGljaFJlbW90ZSArICIgYWxzbyB0aHJldzoiKTsKKyAgICAgICAgICAgIHJlbW90ZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOworICAgICAgICAgICAgdGhyb3cgbG9jYWw7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVtb3RlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IHJlbW90ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChsb2NhbCAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBsb2NhbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgc3RhcnRTZXJ2ZXIoYm9vbGVhbiBuZXdUaHJlYWQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAobmV3VGhyZWFkKSB7CisgICAgICAgICAgICBzZXJ2ZXJUaHJlYWQgPSBuZXcgVGhyZWFkKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvU2VydmVyU2lkZSgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIE91ciBzZXJ2ZXIgdGhyZWFkIGp1c3QgZGllZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBSZWxlYXNlIHRoZSBjbGllbnQsIGlmIG5vdCBhY3RpdmUgYWxyZWFkeS4uLgorICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlNlcnZlciBkaWVkLi4uIik7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJSZWFkeSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJFeGNlcHRpb24gPSBlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHNlcnZlclRocmVhZC5zdGFydCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBkb1NlcnZlclNpZGUoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgc2VydmVyRXhjZXB0aW9uID0gZTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgc2VydmVyUmVhZHkgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBzdGFydENsaWVudChib29sZWFuIG5ld1RocmVhZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChuZXdUaHJlYWQpIHsKKyAgICAgICAgICAgIGNsaWVudFRocmVhZCA9IG5ldyBUaHJlYWQoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgZG9DbGllbnRTaWRlKCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgICAgICogT3VyIGNsaWVudCB0aHJlYWQganVzdCBkaWVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkNsaWVudCBkaWVkLi4uIik7CisgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRFeGNlcHRpb24gPSBlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGNsaWVudFRocmVhZC5zdGFydCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBkb0NsaWVudFNpZGUoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgY2xpZW50RXhjZXB0aW9uID0gZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2pkay90ZXN0L3N1bi9zZWN1cml0eS9zc2wvamF2YXgvbmV0L3NzbC9TZXJ2ZXJOYW1lL1NTTFNvY2tldEV4cGxvcmVyLmphdmEgYi9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvc3NsL2phdmF4L25ldC9zc2wvU2VydmVyTmFtZS9TU0xTb2NrZXRFeHBsb3Jlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3ZTJiNmEKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvc3NsL2phdmF4L25ldC9zc2wvU2VydmVyTmFtZS9TU0xTb2NrZXRFeHBsb3Jlci5qYXZhCkBAIC0wLDAgKzEsMzc1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCisgKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CisgKiBxdWVzdGlvbnMuCisgKi8KKworLy8KKy8vIFN1bkpTU0UgZG9lcyBub3Qgc3VwcG9ydCBkeW5hbWljIHN5c3RlbSBwcm9wZXJ0aWVzLCBubyB3YXkgdG8gcmUtdXNlCisvLyBzeXN0ZW0gcHJvcGVydGllcyBpbiBzYW1ldm0vYWdlbnR2bSBtb2RlLgorLy8KKworLyoqCisgKiBAdGVzdAorICogQGJ1ZyA3MDY4MzIxCisgKiBAc3VtbWFyeSBTdXBwb3J0IFRMUyBTZXJ2ZXIgTmFtZSBJbmRpY2F0aW9uIChTTkkpIEV4dGVuc2lvbiBpbiBKU1NFIFNlcnZlcgorICogQGxpYnJhcnkgLi4vLi4vLi4vLi4vdGVtcGxhdGVzCisgKiBAYnVpbGQgU1NMQ2FwYWJpbGl0aWVzIFNTTEV4cGxvcmVyCisgKiBAcnVuIG1haW4vb3RoZXJ2bSBTU0xTb2NrZXRFeHBsb3JlciBTU0x2MkhlbGxvLFNTTHYzCisgKiBAcnVuIG1haW4vb3RoZXJ2bSBTU0xTb2NrZXRFeHBsb3JlciBTU0x2MworICogQHJ1biBtYWluL290aGVydm0gU1NMU29ja2V0RXhwbG9yZXIgVExTdjEKKyAqIEBydW4gbWFpbi9vdGhlcnZtIFNTTFNvY2tldEV4cGxvcmVyIFRMU3YxLjEKKyAqIEBydW4gbWFpbi9vdGhlcnZtIFNTTFNvY2tldEV4cGxvcmVyIFRMU3YxLjIKKyAqLworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEubmlvLio7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuKjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLm5ldC4qOworaW1wb3J0IGphdmF4Lm5ldC5zc2wuKjsKKworcHVibGljIGNsYXNzIFNTTFNvY2tldEV4cGxvcmVyIHsKKworICAgIC8qCisgICAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAqIFNldCB0aGUgdmFyaW91cyB2YXJpYWJsZXMgbmVlZGVkIGZvciB0aGUgdGVzdHMsIHRoZW4KKyAgICAgKiBzcGVjaWZ5IHdoYXQgdGVzdHMgdG8gcnVuIG9uIGVhY2ggc2lkZS4KKyAgICAgKi8KKworICAgIC8qCisgICAgICogU2hvdWxkIHdlIHJ1biB0aGUgY2xpZW50IG9yIHNlcnZlciBpbiBhIHNlcGFyYXRlIHRocmVhZD8KKyAgICAgKiBCb3RoIHNpZGVzIGNhbiB0aHJvdyBleGNlcHRpb25zLCBidXQgZG8geW91IGhhdmUgYSBwcmVmZXJlbmNlCisgICAgICogYXMgdG8gd2hpY2ggc2lkZSBzaG91bGQgYmUgdGhlIG1haW4gdGhyZWFkLgorICAgICAqLworICAgIHN0YXRpYyBib29sZWFuIHNlcGFyYXRlU2VydmVyVGhyZWFkID0gdHJ1ZTsKKworICAgIC8qCisgICAgICogV2hlcmUgZG8gd2UgZmluZCB0aGUga2V5c3RvcmVzPworICAgICAqLworICAgIHN0YXRpYyBTdHJpbmcgcGF0aFRvU3RvcmVzID0gIi4uLy4uLy4uLy4uL2V0YyI7CisgICAgc3RhdGljIFN0cmluZyBrZXlTdG9yZUZpbGUgPSAia2V5c3RvcmUiOworICAgIHN0YXRpYyBTdHJpbmcgdHJ1c3RTdG9yZUZpbGUgPSAidHJ1c3RzdG9yZSI7CisgICAgc3RhdGljIFN0cmluZyBwYXNzd2QgPSAicGFzc3BocmFzZSI7CisKKyAgICAvKgorICAgICAqIElzIHRoZSBzZXJ2ZXIgcmVhZHkgdG8gc2VydmU/CisgICAgICovCisgICAgdm9sYXRpbGUgc3RhdGljIGJvb2xlYW4gc2VydmVyUmVhZHkgPSBmYWxzZTsKKworICAgIC8qCisgICAgICogVHVybiBvbiBTU0wgZGVidWdnaW5nPworICAgICAqLworICAgIHN0YXRpYyBib29sZWFuIGRlYnVnID0gZmFsc2U7CisKKyAgICAvKgorICAgICAqIElmIHRoZSBjbGllbnQgb3Igc2VydmVyIGlzIGRvaW5nIHNvbWUga2luZCBvZiBvYmplY3QgY3JlYXRpb24KKyAgICAgKiB0aGF0IHRoZSBvdGhlciBzaWRlIGRlcGVuZHMgb24sIGFuZCB0aGF0IHRocmVhZCBwcmVtYXR1cmVseQorICAgICAqIGV4aXRzLCB5b3UgbWF5IGV4cGVyaWVuY2UgYSBoYW5nLiAgVGhlIHRlc3QgaGFybmVzcyB3aWxsCisgICAgICogdGVybWluYXRlIGFsbCBodW5nIHRocmVhZHMgYWZ0ZXIgaXRzIHRpbWVvdXQgaGFzIGV4cGlyZWQsCisgICAgICogY3VycmVudGx5IDMgbWludXRlcyBieSBkZWZhdWx0LCBidXQgeW91IG1pZ2h0IHRyeSB0byBiZQorICAgICAqIHNtYXJ0IGFib3V0IGl0Li4uLgorICAgICAqLworCisgICAgLyoKKyAgICAgKiBEZWZpbmUgdGhlIHNlcnZlciBzaWRlIG9mIHRoZSB0ZXN0LgorICAgICAqCisgICAgICogSWYgdGhlIHNlcnZlciBwcmVtYXR1cmVseSBleGl0cywgc2VydmVyUmVhZHkgd2lsbCBiZSBzZXQgdG8gdHJ1ZQorICAgICAqIHRvIGF2b2lkIGluZmluaXRlIGhhbmdzLgorICAgICAqLworICAgIHZvaWQgZG9TZXJ2ZXJTaWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgU2VydmVyU29ja2V0IHNlcnZlclNvY2tldCA9IG5ldyBTZXJ2ZXJTb2NrZXQoc2VydmVyUG9ydCk7CisKKyAgICAgICAgLy8gU2lnbmFsIENsaWVudCwgd2UncmUgcmVhZHkgZm9yIGhpcyBjb25uZWN0LgorICAgICAgICBzZXJ2ZXJQb3J0ID0gc2VydmVyU29ja2V0LmdldExvY2FsUG9ydCgpOworICAgICAgICBzZXJ2ZXJSZWFkeSA9IHRydWU7CisKKyAgICAgICAgU29ja2V0IHNvY2tldCA9IHNlcnZlclNvY2tldC5hY2NlcHQoKTsKKyAgICAgICAgSW5wdXRTdHJlYW0gaW5zID0gc29ja2V0LmdldElucHV0U3RyZWFtKCk7CisKKyAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzB4RkZdOworICAgICAgICBpbnQgcG9zaXRpb24gPSAwOworICAgICAgICBTU0xDYXBhYmlsaXRpZXMgY2FwYWJpbGl0aWVzID0gbnVsbDsKKworICAgICAgICAvLyBSZWFkIHRoZSBoZWFkZXIgb2YgVExTIHJlY29yZAorICAgICAgICB3aGlsZSAocG9zaXRpb24gPCBTU0xFeHBsb3Jlci5SRUNPUkRfSEVBREVSX1NJWkUpIHsKKyAgICAgICAgICAgIGludCBjb3VudCA9IFNTTEV4cGxvcmVyLlJFQ09SRF9IRUFERVJfU0laRSAtIHBvc2l0aW9uOworICAgICAgICAgICAgaW50IG4gPSBpbnMucmVhZChidWZmZXIsIHBvc2l0aW9uLCBjb3VudCk7CisgICAgICAgICAgICBpZiAobiA8IDApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJ1bmV4cGVjdGVkIGVuZCBvZiBzdHJlYW0hIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwb3NpdGlvbiArPSBuOworICAgICAgICB9CisKKyAgICAgICAgaW50IHJlY29yZExlbmd0aCA9IFNTTEV4cGxvcmVyLmdldFJlcXVpcmVkU2l6ZShidWZmZXIsIDAsIHBvc2l0aW9uKTsKKyAgICAgICAgaWYgKGJ1ZmZlci5sZW5ndGggPCByZWNvcmRMZW5ndGgpIHsKKyAgICAgICAgICAgIGJ1ZmZlciA9IEFycmF5cy5jb3B5T2YoYnVmZmVyLCByZWNvcmRMZW5ndGgpOworICAgICAgICB9CisKKyAgICAgICAgd2hpbGUgKHBvc2l0aW9uIDwgcmVjb3JkTGVuZ3RoKSB7CisgICAgICAgICAgICBpbnQgY291bnQgPSByZWNvcmRMZW5ndGggLSBwb3NpdGlvbjsKKyAgICAgICAgICAgIGludCBuID0gaW5zLnJlYWQoYnVmZmVyLCBwb3NpdGlvbiwgY291bnQpOworICAgICAgICAgICAgaWYgKG4gPCAwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigidW5leHBlY3RlZCBlbmQgb2Ygc3RyZWFtISIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcG9zaXRpb24gKz0gbjsKKyAgICAgICAgfQorCisgICAgICAgIGNhcGFiaWxpdGllcyA9IFNTTEV4cGxvcmVyLmV4cGxvcmUoYnVmZmVyLCAwLCByZWNvcmRMZW5ndGgpOzsKKyAgICAgICAgaWYgKGNhcGFiaWxpdGllcyAhPSBudWxsKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJlY29yZCB2ZXJzaW9uOiAiICsKKyAgICAgICAgICAgICAgICAgICAgY2FwYWJpbGl0aWVzLmdldFJlY29yZFZlcnNpb24oKSk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkhlbGxvIHZlcnNpb246ICIgKworICAgICAgICAgICAgICAgICAgICBjYXBhYmlsaXRpZXMuZ2V0SGVsbG9WZXJzaW9uKCkpOworICAgICAgICB9CisKKyAgICAgICAgU1NMU29ja2V0RmFjdG9yeSBzc2xzZiA9CisgICAgICAgICAgICAoU1NMU29ja2V0RmFjdG9yeSkgU1NMU29ja2V0RmFjdG9yeS5nZXREZWZhdWx0KCk7CisgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGJhaXMgPQorICAgICAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ1ZmZlciwgMCwgcG9zaXRpb24pOworICAgICAgICBTU0xTb2NrZXQgc3NsU29ja2V0ID0gKFNTTFNvY2tldClzc2xzZi5jcmVhdGVTb2NrZXQoc29ja2V0LCBiYWlzLCB0cnVlKTsKKworICAgICAgICBJbnB1dFN0cmVhbSBzc2xJUyA9IHNzbFNvY2tldC5nZXRJbnB1dFN0cmVhbSgpOworICAgICAgICBPdXRwdXRTdHJlYW0gc3NsT1MgPSBzc2xTb2NrZXQuZ2V0T3V0cHV0U3RyZWFtKCk7CisKKyAgICAgICAgc3NsSVMucmVhZCgpOworICAgICAgICBzc2xPUy53cml0ZSg4NSk7CisgICAgICAgIHNzbE9TLmZsdXNoKCk7CisKKyAgICAgICAgRXh0ZW5kZWRTU0xTZXNzaW9uIHNlc3Npb24gPSAoRXh0ZW5kZWRTU0xTZXNzaW9uKXNzbFNvY2tldC5nZXRTZXNzaW9uKCk7CisgICAgICAgIGNoZWNrQ2FwYWJpbGl0aWVzKGNhcGFiaWxpdGllcywgc2Vzc2lvbik7CisKKyAgICAgICAgc3NsU29ja2V0LmNsb3NlKCk7CisgICAgICAgIHNlcnZlclNvY2tldC5jbG9zZSgpOworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBEZWZpbmUgdGhlIGNsaWVudCBzaWRlIG9mIHRoZSB0ZXN0LgorICAgICAqCisgICAgICogSWYgdGhlIHNlcnZlciBwcmVtYXR1cmVseSBleGl0cywgc2VydmVyUmVhZHkgd2lsbCBiZSBzZXQgdG8gdHJ1ZQorICAgICAqIHRvIGF2b2lkIGluZmluaXRlIGhhbmdzLgorICAgICAqLworICAgIHZvaWQgZG9DbGllbnRTaWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogV2FpdCBmb3Igc2VydmVyIHRvIGdldCBzdGFydGVkLgorICAgICAgICAgKi8KKyAgICAgICAgd2hpbGUgKCFzZXJ2ZXJSZWFkeSkgeworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDUwKTsKKyAgICAgICAgfQorCisgICAgICAgIFNTTFNvY2tldEZhY3Rvcnkgc3Nsc2YgPQorICAgICAgICAgICAgKFNTTFNvY2tldEZhY3RvcnkpIFNTTFNvY2tldEZhY3RvcnkuZ2V0RGVmYXVsdCgpOworICAgICAgICBTU0xTb2NrZXQgc3NsU29ja2V0ID0gKFNTTFNvY2tldCkKKyAgICAgICAgICAgIHNzbHNmLmNyZWF0ZVNvY2tldCgibG9jYWxob3N0Iiwgc2VydmVyUG9ydCk7CisKKyAgICAgICAgLy8gZW5hYmxlIHRoZSBzcGVjaWZpZWQgVExTIHByb3RvY29sCisgICAgICAgIHNzbFNvY2tldC5zZXRFbmFibGVkUHJvdG9jb2xzKHN1cHBvcnRlZFByb3RvY29scyk7CisKKyAgICAgICAgSW5wdXRTdHJlYW0gc3NsSVMgPSBzc2xTb2NrZXQuZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICAgICAgT3V0cHV0U3RyZWFtIHNzbE9TID0gc3NsU29ja2V0LmdldE91dHB1dFN0cmVhbSgpOworCisgICAgICAgIHNzbE9TLndyaXRlKDI4MCk7CisgICAgICAgIHNzbE9TLmZsdXNoKCk7CisgICAgICAgIHNzbElTLnJlYWQoKTsKKworICAgICAgICBzc2xTb2NrZXQuY2xvc2UoKTsKKyAgICB9CisKKyAgICB2b2lkIGNoZWNrQ2FwYWJpbGl0aWVzKFNTTENhcGFiaWxpdGllcyBjYXBhYmlsaXRpZXMsCisgICAgICAgICAgICBFeHRlbmRlZFNTTFNlc3Npb24gc2Vzc2lvbikgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgTGlzdDxTTklTZXJ2ZXJOYW1lPiBzZXNzaW9uU05JID0gc2Vzc2lvbi5nZXRSZXF1ZXN0ZWRTZXJ2ZXJOYW1lcygpOworICAgICAgICBpZiAoIXNlc3Npb25TTkkuZXF1YWxzKGNhcGFiaWxpdGllcy5nZXRTZXJ2ZXJOYW1lcygpKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgInNlcnZlciBuYW1lIGluZGljYXRpb24gZG9lcyBub3QgbWF0Y2ggY2FwYWJpbGl0aWVzIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBzdXBwb3J0ZWRQcm90b2NvbHM7ICAgIC8vIHN1cHBvcnRlZCBwcm90b2NvbHMKKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcGFyc2VBcmd1bWVudHMoU3RyaW5nW10gYXJncykgeworICAgICAgICBzdXBwb3J0ZWRQcm90b2NvbHMgPSBhcmdzWzBdLnNwbGl0KCIsIik7CisgICAgfQorCisKKyAgICAvKgorICAgICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgKiBUaGUgcmVtYWluZGVyIGlzIGp1c3Qgc3VwcG9ydCBzdHVmZgorICAgICAqLworCisgICAgLy8gdXNlIGFueSBmcmVlIHBvcnQgYnkgZGVmYXVsdAorICAgIHZvbGF0aWxlIGludCBzZXJ2ZXJQb3J0ID0gMDsKKworICAgIHZvbGF0aWxlIEV4Y2VwdGlvbiBzZXJ2ZXJFeGNlcHRpb24gPSBudWxsOworICAgIHZvbGF0aWxlIEV4Y2VwdGlvbiBjbGllbnRFeGNlcHRpb24gPSBudWxsOworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBrZXlGaWxlbmFtZSA9CisgICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoInRlc3Quc3JjIiwgIi4iKSArICIvIiArIHBhdGhUb1N0b3JlcyArCisgICAgICAgICAgICAgICAgIi8iICsga2V5U3RvcmVGaWxlOworICAgICAgICBTdHJpbmcgdHJ1c3RGaWxlbmFtZSA9CisgICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoInRlc3Quc3JjIiwgIi4iKSArICIvIiArIHBhdGhUb1N0b3JlcyArCisgICAgICAgICAgICAgICAgIi8iICsgdHJ1c3RTdG9yZUZpbGU7CisKKyAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJqYXZheC5uZXQuc3NsLmtleVN0b3JlIiwga2V5RmlsZW5hbWUpOworICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImphdmF4Lm5ldC5zc2wua2V5U3RvcmVQYXNzd29yZCIsIHBhc3N3ZCk7CisgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiamF2YXgubmV0LnNzbC50cnVzdFN0b3JlIiwgdHJ1c3RGaWxlbmFtZSk7CisgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiamF2YXgubmV0LnNzbC50cnVzdFN0b3JlUGFzc3dvcmQiLCBwYXNzd2QpOworCisgICAgICAgIGlmIChkZWJ1ZykKKyAgICAgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiamF2YXgubmV0LmRlYnVnIiwgImFsbCIpOworCisgICAgICAgIC8qCisgICAgICAgICAqIEdldCB0aGUgY3VzdG9taXplZCBhcmd1bWVudHMuCisgICAgICAgICAqLworICAgICAgICBwYXJzZUFyZ3VtZW50cyhhcmdzKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBTdGFydCB0aGUgdGVzdHMuCisgICAgICAgICAqLworICAgICAgICBuZXcgU1NMU29ja2V0RXhwbG9yZXIoKTsKKyAgICB9CisKKyAgICBUaHJlYWQgY2xpZW50VGhyZWFkID0gbnVsbDsKKyAgICBUaHJlYWQgc2VydmVyVGhyZWFkID0gbnVsbDsKKworICAgIC8qCisgICAgICogUHJpbWFyeSBjb25zdHJ1Y3RvciwgdXNlZCB0byBkcml2ZSByZW1haW5kZXIgb2YgdGhlIHRlc3QuCisgICAgICoKKyAgICAgKiBGb3JrIG9mZiB0aGUgb3RoZXIgc2lkZSwgdGhlbiBkbyB5b3VyIHdvcmsuCisgICAgICovCisgICAgU1NMU29ja2V0RXhwbG9yZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChzZXBhcmF0ZVNlcnZlclRocmVhZCkgeworICAgICAgICAgICAgICAgIHN0YXJ0U2VydmVyKHRydWUpOworICAgICAgICAgICAgICAgIHN0YXJ0Q2xpZW50KGZhbHNlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3RhcnRDbGllbnQodHJ1ZSk7CisgICAgICAgICAgICAgICAgc3RhcnRTZXJ2ZXIoZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gc3dhbGxvdyBmb3Igbm93LiAgU2hvdyBsYXRlcgorICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogV2FpdCBmb3Igb3RoZXIgc2lkZSB0byBjbG9zZSBkb3duLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHNlcGFyYXRlU2VydmVyVGhyZWFkKSB7CisgICAgICAgICAgICBzZXJ2ZXJUaHJlYWQuam9pbigpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2xpZW50VGhyZWFkLmpvaW4oKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIFdoZW4gd2UgZ2V0IGhlcmUsIHRoZSB0ZXN0IGlzIHByZXR0eSBtdWNoIG92ZXIuCisgICAgICAgICAqIFdoaWNoIHNpZGUgdGhyZXcgdGhlIGVycm9yPworICAgICAgICAgKi8KKyAgICAgICAgRXhjZXB0aW9uIGxvY2FsOworICAgICAgICBFeGNlcHRpb24gcmVtb3RlOworICAgICAgICBTdHJpbmcgd2hpY2hSZW1vdGU7CisKKyAgICAgICAgaWYgKHNlcGFyYXRlU2VydmVyVGhyZWFkKSB7CisgICAgICAgICAgICByZW1vdGUgPSBzZXJ2ZXJFeGNlcHRpb247CisgICAgICAgICAgICBsb2NhbCA9IGNsaWVudEV4Y2VwdGlvbjsKKyAgICAgICAgICAgIHdoaWNoUmVtb3RlID0gInNlcnZlciI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZW1vdGUgPSBjbGllbnRFeGNlcHRpb247CisgICAgICAgICAgICBsb2NhbCA9IHNlcnZlckV4Y2VwdGlvbjsKKyAgICAgICAgICAgIHdoaWNoUmVtb3RlID0gImNsaWVudCI7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBJZiBib3RoIGZhaWxlZCwgcmV0dXJuIHRoZSBjdXJ0aHJlYWQncyBleGNlcHRpb24sIGJ1dCBhbHNvCisgICAgICAgICAqIHByaW50IHRoZSByZW1vdGUgc2lkZSBFeGNlcHRpb24KKyAgICAgICAgICovCisgICAgICAgIGlmICgobG9jYWwgIT0gbnVsbCkgJiYgKHJlbW90ZSAhPSBudWxsKSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHdoaWNoUmVtb3RlICsgIiBhbHNvIHRocmV3OiIpOworICAgICAgICAgICAgcmVtb3RlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7CisgICAgICAgICAgICB0aHJvdyBsb2NhbDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZW1vdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgcmVtb3RlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGxvY2FsICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IGxvY2FsOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBzdGFydFNlcnZlcihib29sZWFuIG5ld1RocmVhZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChuZXdUaHJlYWQpIHsKKyAgICAgICAgICAgIHNlcnZlclRocmVhZCA9IG5ldyBUaHJlYWQoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgZG9TZXJ2ZXJTaWRlKCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgICAgICogT3VyIHNlcnZlciB0aHJlYWQganVzdCBkaWVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIFJlbGVhc2UgdGhlIGNsaWVudCwgaWYgbm90IGFjdGl2ZSBhbHJlYWR5Li4uCisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiU2VydmVyIGRpZWQuLi4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlclJlYWR5ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlckV4Y2VwdGlvbiA9IGU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgc2VydmVyVGhyZWFkLnN0YXJ0KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGRvU2VydmVyU2lkZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBzZXJ2ZXJFeGNlcHRpb24gPSBlOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBzZXJ2ZXJSZWFkeSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHN0YXJ0Q2xpZW50KGJvb2xlYW4gbmV3VGhyZWFkKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG5ld1RocmVhZCkgeworICAgICAgICAgICAgY2xpZW50VGhyZWFkID0gbmV3IFRocmVhZCgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkb0NsaWVudFNpZGUoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBPdXIgY2xpZW50IHRocmVhZCBqdXN0IGRpZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiQ2xpZW50IGRpZWQuLi4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudEV4Y2VwdGlvbiA9IGU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgY2xpZW50VGhyZWFkLnN0YXJ0KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGRvQ2xpZW50U2lkZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBjbGllbnRFeGNlcHRpb24gPSBlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L3NzbC9qYXZheC9uZXQvc3NsL1NlcnZlck5hbWUvU1NMU29ja2V0RXhwbG9yZXJGYWlsdXJlLmphdmEgYi9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvc3NsL2phdmF4L25ldC9zc2wvU2VydmVyTmFtZS9TU0xTb2NrZXRFeHBsb3JlckZhaWx1cmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGEzNzE1Ci0tLSAvZGV2L251bGwKKysrIGIvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L3NzbC9qYXZheC9uZXQvc3NsL1NlcnZlck5hbWUvU1NMU29ja2V0RXhwbG9yZXJGYWlsdXJlLmphdmEKQEAgLTAsMCArMSwzODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKKyAqIHF1ZXN0aW9ucy4KKyAqLworCisvLworLy8gU3VuSlNTRSBkb2VzIG5vdCBzdXBwb3J0IGR5bmFtaWMgc3lzdGVtIHByb3BlcnRpZXMsIG5vIHdheSB0byByZS11c2UKKy8vIHN5c3RlbSBwcm9wZXJ0aWVzIGluIHNhbWV2bS9hZ2VudHZtIG1vZGUuCisvLworCisvKioKKyAqIEB0ZXN0CisgKiBAYnVnIDcwNjgzMjEKKyAqIEBzdW1tYXJ5IFN1cHBvcnQgVExTIFNlcnZlciBOYW1lIEluZGljYXRpb24gKFNOSSkgRXh0ZW5zaW9uIGluIEpTU0UgU2VydmVyCisgKiBAbGlicmFyeSAuLi8uLi8uLi8uLi90ZW1wbGF0ZXMKKyAqIEBidWlsZCBTU0xDYXBhYmlsaXRpZXMgU1NMRXhwbG9yZXIKKyAqIEBydW4gbWFpbi9vdGhlcnZtIFNTTFNvY2tldEV4cGxvcmVyRmFpbHVyZSBTU0x2MkhlbGxvLFNTTHYzCisgKiBAcnVuIG1haW4vb3RoZXJ2bSBTU0xTb2NrZXRFeHBsb3JlckZhaWx1cmUgU1NMdjMKKyAqIEBydW4gbWFpbi9vdGhlcnZtIFNTTFNvY2tldEV4cGxvcmVyRmFpbHVyZSBUTFN2MQorICogQHJ1biBtYWluL290aGVydm0gU1NMU29ja2V0RXhwbG9yZXJGYWlsdXJlIFRMU3YxLjEKKyAqIEBydW4gbWFpbi9vdGhlcnZtIFNTTFNvY2tldEV4cGxvcmVyRmFpbHVyZSBUTFN2MS4yCisgKi8KKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLm5pby4qOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLio7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS5uZXQuKjsKK2ltcG9ydCBqYXZheC5uZXQuc3NsLio7CisKK3B1YmxpYyBjbGFzcyBTU0xTb2NrZXRFeHBsb3JlckZhaWx1cmUgeworCisgICAgLyoKKyAgICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICogU2V0IHRoZSB2YXJpb3VzIHZhcmlhYmxlcyBuZWVkZWQgZm9yIHRoZSB0ZXN0cywgdGhlbgorICAgICAqIHNwZWNpZnkgd2hhdCB0ZXN0cyB0byBydW4gb24gZWFjaCBzaWRlLgorICAgICAqLworCisgICAgLyoKKyAgICAgKiBTaG91bGQgd2UgcnVuIHRoZSBjbGllbnQgb3Igc2VydmVyIGluIGEgc2VwYXJhdGUgdGhyZWFkPworICAgICAqIEJvdGggc2lkZXMgY2FuIHRocm93IGV4Y2VwdGlvbnMsIGJ1dCBkbyB5b3UgaGF2ZSBhIHByZWZlcmVuY2UKKyAgICAgKiBhcyB0byB3aGljaCBzaWRlIHNob3VsZCBiZSB0aGUgbWFpbiB0aHJlYWQuCisgICAgICovCisgICAgc3RhdGljIGJvb2xlYW4gc2VwYXJhdGVTZXJ2ZXJUaHJlYWQgPSB0cnVlOworCisgICAgLyoKKyAgICAgKiBXaGVyZSBkbyB3ZSBmaW5kIHRoZSBrZXlzdG9yZXM/CisgICAgICovCisgICAgc3RhdGljIFN0cmluZyBwYXRoVG9TdG9yZXMgPSAiLi4vLi4vLi4vLi4vZXRjIjsKKyAgICBzdGF0aWMgU3RyaW5nIGtleVN0b3JlRmlsZSA9ICJrZXlzdG9yZSI7CisgICAgc3RhdGljIFN0cmluZyB0cnVzdFN0b3JlRmlsZSA9ICJ0cnVzdHN0b3JlIjsKKyAgICBzdGF0aWMgU3RyaW5nIHBhc3N3ZCA9ICJwYXNzcGhyYXNlIjsKKworICAgIC8qCisgICAgICogSXMgdGhlIHNlcnZlciByZWFkeSB0byBzZXJ2ZT8KKyAgICAgKi8KKyAgICB2b2xhdGlsZSBzdGF0aWMgYm9vbGVhbiBzZXJ2ZXJSZWFkeSA9IGZhbHNlOworCisgICAgLyoKKyAgICAgKiBUdXJuIG9uIFNTTCBkZWJ1Z2dpbmc/CisgICAgICovCisgICAgc3RhdGljIGJvb2xlYW4gZGVidWcgPSBmYWxzZTsKKworICAgIC8qCisgICAgICogSWYgdGhlIGNsaWVudCBvciBzZXJ2ZXIgaXMgZG9pbmcgc29tZSBraW5kIG9mIG9iamVjdCBjcmVhdGlvbgorICAgICAqIHRoYXQgdGhlIG90aGVyIHNpZGUgZGVwZW5kcyBvbiwgYW5kIHRoYXQgdGhyZWFkIHByZW1hdHVyZWx5CisgICAgICogZXhpdHMsIHlvdSBtYXkgZXhwZXJpZW5jZSBhIGhhbmcuICBUaGUgdGVzdCBoYXJuZXNzIHdpbGwKKyAgICAgKiB0ZXJtaW5hdGUgYWxsIGh1bmcgdGhyZWFkcyBhZnRlciBpdHMgdGltZW91dCBoYXMgZXhwaXJlZCwKKyAgICAgKiBjdXJyZW50bHkgMyBtaW51dGVzIGJ5IGRlZmF1bHQsIGJ1dCB5b3UgbWlnaHQgdHJ5IHRvIGJlCisgICAgICogc21hcnQgYWJvdXQgaXQuLi4uCisgICAgICovCisKKyAgICAvKgorICAgICAqIERlZmluZSB0aGUgc2VydmVyIHNpZGUgb2YgdGhlIHRlc3QuCisgICAgICoKKyAgICAgKiBJZiB0aGUgc2VydmVyIHByZW1hdHVyZWx5IGV4aXRzLCBzZXJ2ZXJSZWFkeSB3aWxsIGJlIHNldCB0byB0cnVlCisgICAgICogdG8gYXZvaWQgaW5maW5pdGUgaGFuZ3MuCisgICAgICovCisgICAgdm9pZCBkb1NlcnZlclNpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBTZXJ2ZXJTb2NrZXQgc2VydmVyU29ja2V0ID0gbmV3IFNlcnZlclNvY2tldChzZXJ2ZXJQb3J0KTsKKworICAgICAgICAvLyBTaWduYWwgQ2xpZW50LCB3ZSdyZSByZWFkeSBmb3IgaGlzIGNvbm5lY3QuCisgICAgICAgIHNlcnZlclBvcnQgPSBzZXJ2ZXJTb2NrZXQuZ2V0TG9jYWxQb3J0KCk7CisgICAgICAgIHNlcnZlclJlYWR5ID0gdHJ1ZTsKKworICAgICAgICBTb2NrZXQgc29ja2V0ID0gc2VydmVyU29ja2V0LmFjY2VwdCgpOworICAgICAgICBJbnB1dFN0cmVhbSBpbnMgPSBzb2NrZXQuZ2V0SW5wdXRTdHJlYW0oKTsKKworICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbMHhGRl07CisgICAgICAgIGludCBwb3NpdGlvbiA9IDA7CisgICAgICAgIFNTTENhcGFiaWxpdGllcyBjYXBhYmlsaXRpZXMgPSBudWxsOworICAgICAgICBib29sZWFuIGZhaWxlZCA9IGZhbHNlOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gUmVhZCB0aGUgaGVhZGVyIG9mIFRMUyByZWNvcmQKKyAgICAgICAgICAgIHdoaWxlIChwb3NpdGlvbiA8IFNTTEV4cGxvcmVyLlJFQ09SRF9IRUFERVJfU0laRSkgeworICAgICAgICAgICAgICAgIGludCBjb3VudCA9IFNTTEV4cGxvcmVyLlJFQ09SRF9IRUFERVJfU0laRSAtIHBvc2l0aW9uOworICAgICAgICAgICAgICAgIGludCBuID0gaW5zLnJlYWQoYnVmZmVyLCBwb3NpdGlvbiwgY291bnQpOworICAgICAgICAgICAgICAgIGlmIChuIDwgMCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJ1bmV4cGVjdGVkIGVuZCBvZiBzdHJlYW0hIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBvc2l0aW9uICs9IG47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCByZWNvcmRMZW5ndGggPSBTU0xFeHBsb3Jlci5nZXRSZXF1aXJlZFNpemUoYnVmZmVyLCAwLCBwb3NpdGlvbik7CisgICAgICAgICAgICBpZiAoYnVmZmVyLmxlbmd0aCA8IHJlY29yZExlbmd0aCkgeworICAgICAgICAgICAgICAgIGJ1ZmZlciA9IEFycmF5cy5jb3B5T2YoYnVmZmVyLCByZWNvcmRMZW5ndGgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3aGlsZSAocG9zaXRpb24gPCByZWNvcmRMZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBpbnQgY291bnQgPSByZWNvcmRMZW5ndGggLSBwb3NpdGlvbjsKKyAgICAgICAgICAgICAgICBpbnQgbiA9IGlucy5yZWFkKGJ1ZmZlciwgcG9zaXRpb24sIGNvdW50KTsKKyAgICAgICAgICAgICAgICBpZiAobiA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigidW5leHBlY3RlZCBlbmQgb2Ygc3RyZWFtISIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwb3NpdGlvbiArPSBuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXBhYmlsaXRpZXMgPSBTU0xFeHBsb3Jlci5leHBsb3JlKGJ1ZmZlciwgMCwgcmVjb3JkTGVuZ3RoKTs7CisgICAgICAgICAgICBpZiAoY2FwYWJpbGl0aWVzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJlY29yZCB2ZXJzaW9uOiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhcGFiaWxpdGllcy5nZXRSZWNvcmRWZXJzaW9uKCkpOworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSGVsbG8gdmVyc2lvbjogIiArCisgICAgICAgICAgICAgICAgICAgICAgICBjYXBhYmlsaXRpZXMuZ2V0SGVsbG9WZXJzaW9uKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyB3YW50IGFuIEkvTyBleGNlcHRpb24KKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiV2UganVzdCB3YW50IGEgSS9PIGV4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbGVkID0gIHRydWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBvZmYgY291cnNlLCB0aGUgYWJvdmUgZXhwbG9yZSBmYWlsZWQuIEZhaWxlIHRvIGZhaWx1cmUgaGFuZGxlcgorICAgICAgICBTU0xDb250ZXh0IGNvbnRleHQgPSBTU0xDb250ZXh0LmdldEluc3RhbmNlKCJUTFMiKTsKKyAgICAgICAgY29udGV4dC5pbml0KG51bGwsIG51bGwsIG51bGwpOworICAgICAgICBTU0xTb2NrZXRGYWN0b3J5IHNzbHNmID0gY29udGV4dC5nZXRTb2NrZXRGYWN0b3J5KCk7CisgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGJhaXMgPQorICAgICAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ1ZmZlciwgMCwgcG9zaXRpb24pOworICAgICAgICBTU0xTb2NrZXQgc3NsU29ja2V0ID0gKFNTTFNvY2tldClzc2xzZi5jcmVhdGVTb2NrZXQoc29ja2V0LCBiYWlzLCB0cnVlKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgSW5wdXRTdHJlYW0gc3NsSVMgPSBzc2xTb2NrZXQuZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIE91dHB1dFN0cmVhbSBzc2xPUyA9IHNzbFNvY2tldC5nZXRPdXRwdXRTdHJlYW0oKTsKKworICAgICAgICAgICAgc3NsSVMucmVhZCgpOworICAgICAgICAgICAgaWYgKCFmYWlsZWQpIHsKKyAgICAgICAgICAgICAgICBzc2xPUy53cml0ZSg4NSk7CisgICAgICAgICAgICAgICAgc3NsT1MuZmx1c2goKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3NsU29ja2V0LmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInNlcnZlciBleGNlcHRpb24gIiArIGUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgc3NsU29ja2V0LmNsb3NlKCk7CisgICAgICAgICAgICBzZXJ2ZXJTb2NrZXQuY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoKKyAgICAgKiBEZWZpbmUgdGhlIGNsaWVudCBzaWRlIG9mIHRoZSB0ZXN0LgorICAgICAqCisgICAgICogSWYgdGhlIHNlcnZlciBwcmVtYXR1cmVseSBleGl0cywgc2VydmVyUmVhZHkgd2lsbCBiZSBzZXQgdG8gdHJ1ZQorICAgICAqIHRvIGF2b2lkIGluZmluaXRlIGhhbmdzLgorICAgICAqLworICAgIHZvaWQgZG9DbGllbnRTaWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogV2FpdCBmb3Igc2VydmVyIHRvIGdldCBzdGFydGVkLgorICAgICAgICAgKi8KKyAgICAgICAgd2hpbGUgKCFzZXJ2ZXJSZWFkeSkgeworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDUwKTsKKyAgICAgICAgfQorCisgICAgICAgIFNTTFNvY2tldEZhY3Rvcnkgc3Nsc2YgPQorICAgICAgICAgICAgKFNTTFNvY2tldEZhY3RvcnkpIFNTTFNvY2tldEZhY3RvcnkuZ2V0RGVmYXVsdCgpOworICAgICAgICBTU0xTb2NrZXQgc3NsU29ja2V0ID0gKFNTTFNvY2tldCkKKyAgICAgICAgICAgIHNzbHNmLmNyZWF0ZVNvY2tldCgibG9jYWxob3N0Iiwgc2VydmVyUG9ydCk7CisKKyAgICAgICAgLy8gZW5hYmxlIHRoZSBzcGVjaWZpZWQgVExTIHByb3RvY29sCisgICAgICAgIHNzbFNvY2tldC5zZXRFbmFibGVkUHJvdG9jb2xzKHN1cHBvcnRlZFByb3RvY29scyk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIElucHV0U3RyZWFtIHNzbElTID0gc3NsU29ja2V0LmdldElucHV0U3RyZWFtKCk7CisgICAgICAgICAgICBPdXRwdXRTdHJlYW0gc3NsT1MgPSBzc2xTb2NrZXQuZ2V0T3V0cHV0U3RyZWFtKCk7CisKKyAgICAgICAgICAgIHNzbE9TLndyaXRlKDI4MCk7CisgICAgICAgICAgICBzc2xPUy5mbHVzaCgpOworICAgICAgICAgICAgc3NsSVMucmVhZCgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjbGllbnQgZXhjZXB0aW9uICIgKyBlKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHNzbFNvY2tldC5jbG9zZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gc3VwcG9ydGVkUHJvdG9jb2xzOyAgICAvLyBzdXBwb3J0ZWQgcHJvdG9jb2xzCisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHBhcnNlQXJndW1lbnRzKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgc3VwcG9ydGVkUHJvdG9jb2xzID0gYXJnc1swXS5zcGxpdCgiLCIpOworICAgIH0KKworCisgICAgLyoKKyAgICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICogVGhlIHJlbWFpbmRlciBpcyBqdXN0IHN1cHBvcnQgc3R1ZmYKKyAgICAgKi8KKworICAgIC8vIHVzZSBhbnkgZnJlZSBwb3J0IGJ5IGRlZmF1bHQKKyAgICB2b2xhdGlsZSBpbnQgc2VydmVyUG9ydCA9IDA7CisKKyAgICB2b2xhdGlsZSBFeGNlcHRpb24gc2VydmVyRXhjZXB0aW9uID0gbnVsbDsKKyAgICB2b2xhdGlsZSBFeGNlcHRpb24gY2xpZW50RXhjZXB0aW9uID0gbnVsbDsKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcga2V5RmlsZW5hbWUgPQorICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KCJ0ZXN0LnNyYyIsICIuIikgKyAiLyIgKyBwYXRoVG9TdG9yZXMgKworICAgICAgICAgICAgICAgICIvIiArIGtleVN0b3JlRmlsZTsKKyAgICAgICAgU3RyaW5nIHRydXN0RmlsZW5hbWUgPQorICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KCJ0ZXN0LnNyYyIsICIuIikgKyAiLyIgKyBwYXRoVG9TdG9yZXMgKworICAgICAgICAgICAgICAgICIvIiArIHRydXN0U3RvcmVGaWxlOworCisgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiamF2YXgubmV0LnNzbC5rZXlTdG9yZSIsIGtleUZpbGVuYW1lKTsKKyAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJqYXZheC5uZXQuc3NsLmtleVN0b3JlUGFzc3dvcmQiLCBwYXNzd2QpOworICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImphdmF4Lm5ldC5zc2wudHJ1c3RTdG9yZSIsIHRydXN0RmlsZW5hbWUpOworICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImphdmF4Lm5ldC5zc2wudHJ1c3RTdG9yZVBhc3N3b3JkIiwgcGFzc3dkKTsKKworICAgICAgICBpZiAoZGVidWcpCisgICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImphdmF4Lm5ldC5kZWJ1ZyIsICJhbGwiKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBHZXQgdGhlIGN1c3RvbWl6ZWQgYXJndW1lbnRzLgorICAgICAgICAgKi8KKyAgICAgICAgcGFyc2VBcmd1bWVudHMoYXJncyk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogU3RhcnQgdGhlIHRlc3RzLgorICAgICAgICAgKi8KKyAgICAgICAgbmV3IFNTTFNvY2tldEV4cGxvcmVyRmFpbHVyZSgpOworICAgIH0KKworICAgIFRocmVhZCBjbGllbnRUaHJlYWQgPSBudWxsOworICAgIFRocmVhZCBzZXJ2ZXJUaHJlYWQgPSBudWxsOworCisgICAgLyoKKyAgICAgKiBQcmltYXJ5IGNvbnN0cnVjdG9yLCB1c2VkIHRvIGRyaXZlIHJlbWFpbmRlciBvZiB0aGUgdGVzdC4KKyAgICAgKgorICAgICAqIEZvcmsgb2ZmIHRoZSBvdGhlciBzaWRlLCB0aGVuIGRvIHlvdXIgd29yay4KKyAgICAgKi8KKyAgICBTU0xTb2NrZXRFeHBsb3JlckZhaWx1cmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChzZXBhcmF0ZVNlcnZlclRocmVhZCkgeworICAgICAgICAgICAgICAgIHN0YXJ0U2VydmVyKHRydWUpOworICAgICAgICAgICAgICAgIHN0YXJ0Q2xpZW50KGZhbHNlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3RhcnRDbGllbnQodHJ1ZSk7CisgICAgICAgICAgICAgICAgc3RhcnRTZXJ2ZXIoZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gc3dhbGxvdyBmb3Igbm93LiAgU2hvdyBsYXRlcgorICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogV2FpdCBmb3Igb3RoZXIgc2lkZSB0byBjbG9zZSBkb3duLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHNlcGFyYXRlU2VydmVyVGhyZWFkKSB7CisgICAgICAgICAgICBzZXJ2ZXJUaHJlYWQuam9pbigpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2xpZW50VGhyZWFkLmpvaW4oKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIFdoZW4gd2UgZ2V0IGhlcmUsIHRoZSB0ZXN0IGlzIHByZXR0eSBtdWNoIG92ZXIuCisgICAgICAgICAqIFdoaWNoIHNpZGUgdGhyZXcgdGhlIGVycm9yPworICAgICAgICAgKi8KKyAgICAgICAgRXhjZXB0aW9uIGxvY2FsOworICAgICAgICBFeGNlcHRpb24gcmVtb3RlOworICAgICAgICBTdHJpbmcgd2hpY2hSZW1vdGU7CisKKyAgICAgICAgaWYgKHNlcGFyYXRlU2VydmVyVGhyZWFkKSB7CisgICAgICAgICAgICByZW1vdGUgPSBzZXJ2ZXJFeGNlcHRpb247CisgICAgICAgICAgICBsb2NhbCA9IGNsaWVudEV4Y2VwdGlvbjsKKyAgICAgICAgICAgIHdoaWNoUmVtb3RlID0gInNlcnZlciI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZW1vdGUgPSBjbGllbnRFeGNlcHRpb247CisgICAgICAgICAgICBsb2NhbCA9IHNlcnZlckV4Y2VwdGlvbjsKKyAgICAgICAgICAgIHdoaWNoUmVtb3RlID0gImNsaWVudCI7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBJZiBib3RoIGZhaWxlZCwgcmV0dXJuIHRoZSBjdXJ0aHJlYWQncyBleGNlcHRpb24sIGJ1dCBhbHNvCisgICAgICAgICAqIHByaW50IHRoZSByZW1vdGUgc2lkZSBFeGNlcHRpb24KKyAgICAgICAgICovCisgICAgICAgIGlmICgobG9jYWwgIT0gbnVsbCkgJiYgKHJlbW90ZSAhPSBudWxsKSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHdoaWNoUmVtb3RlICsgIiBhbHNvIHRocmV3OiIpOworICAgICAgICAgICAgcmVtb3RlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7CisgICAgICAgICAgICB0aHJvdyBsb2NhbDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZW1vdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgcmVtb3RlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGxvY2FsICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IGxvY2FsOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBzdGFydFNlcnZlcihib29sZWFuIG5ld1RocmVhZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChuZXdUaHJlYWQpIHsKKyAgICAgICAgICAgIHNlcnZlclRocmVhZCA9IG5ldyBUaHJlYWQoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgZG9TZXJ2ZXJTaWRlKCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgICAgICogT3VyIHNlcnZlciB0aHJlYWQganVzdCBkaWVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIFJlbGVhc2UgdGhlIGNsaWVudCwgaWYgbm90IGFjdGl2ZSBhbHJlYWR5Li4uCisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiU2VydmVyIGRpZWQuLi4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlclJlYWR5ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlckV4Y2VwdGlvbiA9IGU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgc2VydmVyVGhyZWFkLnN0YXJ0KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGRvU2VydmVyU2lkZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBzZXJ2ZXJFeGNlcHRpb24gPSBlOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBzZXJ2ZXJSZWFkeSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHN0YXJ0Q2xpZW50KGJvb2xlYW4gbmV3VGhyZWFkKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG5ld1RocmVhZCkgeworICAgICAgICAgICAgY2xpZW50VGhyZWFkID0gbmV3IFRocmVhZCgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkb0NsaWVudFNpZGUoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBPdXIgY2xpZW50IHRocmVhZCBqdXN0IGRpZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiQ2xpZW50IGRpZWQuLi4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudEV4Y2VwdGlvbiA9IGU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgY2xpZW50VGhyZWFkLnN0YXJ0KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGRvQ2xpZW50U2lkZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBjbGllbnRFeGNlcHRpb24gPSBlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L3NzbC9qYXZheC9uZXQvc3NsL1NlcnZlck5hbWUvU1NMU29ja2V0RXhwbG9yZXJNYXRjaGVkU05JLmphdmEgYi9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvc3NsL2phdmF4L25ldC9zc2wvU2VydmVyTmFtZS9TU0xTb2NrZXRFeHBsb3Jlck1hdGNoZWRTTkkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWFlMjZjCi0tLSAvZGV2L251bGwKKysrIGIvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L3NzbC9qYXZheC9uZXQvc3NsL1NlcnZlck5hbWUvU1NMU29ja2V0RXhwbG9yZXJNYXRjaGVkU05JLmphdmEKQEAgLTAsMCArMSw0MzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKKyAqIHF1ZXN0aW9ucy4KKyAqLworCisvLworLy8gU3VuSlNTRSBkb2VzIG5vdCBzdXBwb3J0IGR5bmFtaWMgc3lzdGVtIHByb3BlcnRpZXMsIG5vIHdheSB0byByZS11c2UKKy8vIHN5c3RlbSBwcm9wZXJ0aWVzIGluIHNhbWV2bS9hZ2VudHZtIG1vZGUuCisvLworCisvKioKKyAqIEB0ZXN0CisgKiBAYnVnIDcwNjgzMjEKKyAqIEBzdW1tYXJ5IFN1cHBvcnQgVExTIFNlcnZlciBOYW1lIEluZGljYXRpb24gKFNOSSkgRXh0ZW5zaW9uIGluIEpTU0UgU2VydmVyCisgKiBAbGlicmFyeSAuLi8uLi8uLi8uLi90ZW1wbGF0ZXMKKyAqIEBidWlsZCBTU0xDYXBhYmlsaXRpZXMgU1NMRXhwbG9yZXIKKyAqIEBydW4gbWFpbi9vdGhlcnZtIFNTTFNvY2tldEV4cGxvcmVyTWF0Y2hlZFNOSSB3d3cuZXhhbXBsZS5jb20KKyAqICAgICB3d3dcLmV4YW1wbGVcLmNvbQorICogQHJ1biBtYWluL290aGVydm0gU1NMU29ja2V0RXhwbG9yZXJNYXRjaGVkU05JIHd3dy5leGFtcGxlLmNvbQorICogICAgIHd3d1wuZXhhbXBsZVwuKGNvbXxvcmcpCisgKiBAcnVuIG1haW4vb3RoZXJ2bSBTU0xTb2NrZXRFeHBsb3Jlck1hdGNoZWRTTkkgZXhhbXBsZS5jb20KKyAqICAgICAoLipcLikqZXhhbXBsZVwuKGNvbXxvcmcpCisgKiBAcnVuIG1haW4vb3RoZXJ2bSBTU0xTb2NrZXRFeHBsb3Jlck1hdGNoZWRTTkkgd3d3LmV4YW1wbGUuY29tCisgKiAgICAgKC4qXC4pKmV4YW1wbGVcLihjb218b3JnKQorICogQHJ1biBtYWluL290aGVydm0gU1NMU29ja2V0RXhwbG9yZXJNYXRjaGVkU05JIHd3dy51cy5leGFtcGxlLmNvbQorICogICAgICguKlwuKSpleGFtcGxlXC4oY29tfG9yZykKKyAqLworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEubmlvLio7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuKjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLm5ldC4qOworaW1wb3J0IGphdmF4Lm5ldC5zc2wuKjsKKworcHVibGljIGNsYXNzIFNTTFNvY2tldEV4cGxvcmVyTWF0Y2hlZFNOSSB7CisKKyAgICAvKgorICAgICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgKiBTZXQgdGhlIHZhcmlvdXMgdmFyaWFibGVzIG5lZWRlZCBmb3IgdGhlIHRlc3RzLCB0aGVuCisgICAgICogc3BlY2lmeSB3aGF0IHRlc3RzIHRvIHJ1biBvbiBlYWNoIHNpZGUuCisgICAgICovCisKKyAgICAvKgorICAgICAqIFNob3VsZCB3ZSBydW4gdGhlIGNsaWVudCBvciBzZXJ2ZXIgaW4gYSBzZXBhcmF0ZSB0aHJlYWQ/CisgICAgICogQm90aCBzaWRlcyBjYW4gdGhyb3cgZXhjZXB0aW9ucywgYnV0IGRvIHlvdSBoYXZlIGEgcHJlZmVyZW5jZQorICAgICAqIGFzIHRvIHdoaWNoIHNpZGUgc2hvdWxkIGJlIHRoZSBtYWluIHRocmVhZC4KKyAgICAgKi8KKyAgICBzdGF0aWMgYm9vbGVhbiBzZXBhcmF0ZVNlcnZlclRocmVhZCA9IGZhbHNlOworCisgICAgLyoKKyAgICAgKiBXaGVyZSBkbyB3ZSBmaW5kIHRoZSBrZXlzdG9yZXM/CisgICAgICovCisgICAgc3RhdGljIFN0cmluZyBwYXRoVG9TdG9yZXMgPSAiLi4vLi4vLi4vLi4vZXRjIjsKKyAgICBzdGF0aWMgU3RyaW5nIGtleVN0b3JlRmlsZSA9ICJrZXlzdG9yZSI7CisgICAgc3RhdGljIFN0cmluZyB0cnVzdFN0b3JlRmlsZSA9ICJ0cnVzdHN0b3JlIjsKKyAgICBzdGF0aWMgU3RyaW5nIHBhc3N3ZCA9ICJwYXNzcGhyYXNlIjsKKworICAgIC8qCisgICAgICogSXMgdGhlIHNlcnZlciByZWFkeSB0byBzZXJ2ZT8KKyAgICAgKi8KKyAgICB2b2xhdGlsZSBzdGF0aWMgYm9vbGVhbiBzZXJ2ZXJSZWFkeSA9IGZhbHNlOworCisgICAgLyoKKyAgICAgKiBUdXJuIG9uIFNTTCBkZWJ1Z2dpbmc/CisgICAgICovCisgICAgc3RhdGljIGJvb2xlYW4gZGVidWcgPSBmYWxzZTsKKworICAgIC8qCisgICAgICogSWYgdGhlIGNsaWVudCBvciBzZXJ2ZXIgaXMgZG9pbmcgc29tZSBraW5kIG9mIG9iamVjdCBjcmVhdGlvbgorICAgICAqIHRoYXQgdGhlIG90aGVyIHNpZGUgZGVwZW5kcyBvbiwgYW5kIHRoYXQgdGhyZWFkIHByZW1hdHVyZWx5CisgICAgICogZXhpdHMsIHlvdSBtYXkgZXhwZXJpZW5jZSBhIGhhbmcuICBUaGUgdGVzdCBoYXJuZXNzIHdpbGwKKyAgICAgKiB0ZXJtaW5hdGUgYWxsIGh1bmcgdGhyZWFkcyBhZnRlciBpdHMgdGltZW91dCBoYXMgZXhwaXJlZCwKKyAgICAgKiBjdXJyZW50bHkgMyBtaW51dGVzIGJ5IGRlZmF1bHQsIGJ1dCB5b3UgbWlnaHQgdHJ5IHRvIGJlCisgICAgICogc21hcnQgYWJvdXQgaXQuLi4uCisgICAgICovCisKKyAgICAvKgorICAgICAqIERlZmluZSB0aGUgc2VydmVyIHNpZGUgb2YgdGhlIHRlc3QuCisgICAgICoKKyAgICAgKiBJZiB0aGUgc2VydmVyIHByZW1hdHVyZWx5IGV4aXRzLCBzZXJ2ZXJSZWFkeSB3aWxsIGJlIHNldCB0byB0cnVlCisgICAgICogdG8gYXZvaWQgaW5maW5pdGUgaGFuZ3MuCisgICAgICovCisgICAgdm9pZCBkb1NlcnZlclNpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBTZXJ2ZXJTb2NrZXQgc2VydmVyU29ja2V0ID0gbmV3IFNlcnZlclNvY2tldChzZXJ2ZXJQb3J0KTsKKworICAgICAgICAvLyBTaWduYWwgQ2xpZW50LCB3ZSdyZSByZWFkeSBmb3IgaGlzIGNvbm5lY3QuCisgICAgICAgIHNlcnZlclBvcnQgPSBzZXJ2ZXJTb2NrZXQuZ2V0TG9jYWxQb3J0KCk7CisgICAgICAgIHNlcnZlclJlYWR5ID0gdHJ1ZTsKKworICAgICAgICBTb2NrZXQgc29ja2V0ID0gc2VydmVyU29ja2V0LmFjY2VwdCgpOworICAgICAgICBJbnB1dFN0cmVhbSBpbnMgPSBzb2NrZXQuZ2V0SW5wdXRTdHJlYW0oKTsKKworICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbMHhGRl07CisgICAgICAgIGludCBwb3NpdGlvbiA9IDA7CisgICAgICAgIFNTTENhcGFiaWxpdGllcyBjYXBhYmlsaXRpZXMgPSBudWxsOworCisgICAgICAgIC8vIFJlYWQgdGhlIGhlYWRlciBvZiBUTFMgcmVjb3JkCisgICAgICAgIHdoaWxlIChwb3NpdGlvbiA8IFNTTEV4cGxvcmVyLlJFQ09SRF9IRUFERVJfU0laRSkgeworICAgICAgICAgICAgaW50IGNvdW50ID0gU1NMRXhwbG9yZXIuUkVDT1JEX0hFQURFUl9TSVpFIC0gcG9zaXRpb247CisgICAgICAgICAgICBpbnQgbiA9IGlucy5yZWFkKGJ1ZmZlciwgcG9zaXRpb24sIGNvdW50KTsKKyAgICAgICAgICAgIGlmIChuIDwgMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oInVuZXhwZWN0ZWQgZW5kIG9mIHN0cmVhbSEiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBvc2l0aW9uICs9IG47CisgICAgICAgIH0KKworICAgICAgICBpbnQgcmVjb3JkTGVuZ3RoID0gU1NMRXhwbG9yZXIuZ2V0UmVxdWlyZWRTaXplKGJ1ZmZlciwgMCwgcG9zaXRpb24pOworICAgICAgICBpZiAoYnVmZmVyLmxlbmd0aCA8IHJlY29yZExlbmd0aCkgeworICAgICAgICAgICAgYnVmZmVyID0gQXJyYXlzLmNvcHlPZihidWZmZXIsIHJlY29yZExlbmd0aCk7CisgICAgICAgIH0KKworICAgICAgICB3aGlsZSAocG9zaXRpb24gPCByZWNvcmRMZW5ndGgpIHsKKyAgICAgICAgICAgIGludCBjb3VudCA9IHJlY29yZExlbmd0aCAtIHBvc2l0aW9uOworICAgICAgICAgICAgaW50IG4gPSBpbnMucmVhZChidWZmZXIsIHBvc2l0aW9uLCBjb3VudCk7CisgICAgICAgICAgICBpZiAobiA8IDApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJ1bmV4cGVjdGVkIGVuZCBvZiBzdHJlYW0hIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwb3NpdGlvbiArPSBuOworICAgICAgICB9CisKKyAgICAgICAgY2FwYWJpbGl0aWVzID0gU1NMRXhwbG9yZXIuZXhwbG9yZShidWZmZXIsIDAsIHJlY29yZExlbmd0aCk7OworICAgICAgICBpZiAoY2FwYWJpbGl0aWVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUmVjb3JkIHZlcnNpb246ICIgKworICAgICAgICAgICAgICAgICAgICBjYXBhYmlsaXRpZXMuZ2V0UmVjb3JkVmVyc2lvbigpKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSGVsbG8gdmVyc2lvbjogIiArCisgICAgICAgICAgICAgICAgICAgIGNhcGFiaWxpdGllcy5nZXRIZWxsb1ZlcnNpb24oKSk7CisgICAgICAgIH0KKworICAgICAgICBTU0xTb2NrZXRGYWN0b3J5IHNzbHNmID0KKyAgICAgICAgICAgIChTU0xTb2NrZXRGYWN0b3J5KSBTU0xTb2NrZXRGYWN0b3J5LmdldERlZmF1bHQoKTsKKyAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFpcyA9CisgICAgICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnVmZmVyLCAwLCBwb3NpdGlvbik7CisgICAgICAgIFNTTFNvY2tldCBzc2xTb2NrZXQgPSAoU1NMU29ja2V0KXNzbHNmLmNyZWF0ZVNvY2tldChzb2NrZXQsIGJhaXMsIHRydWUpOworCisgICAgICAgIFNOSU1hdGNoZXIgbWF0Y2hlciA9IFNOSUhvc3ROYW1lLmNyZWF0ZVNOSU1hdGNoZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJBY2NlcHRhYmxlSG9zdG5hbWUpOworICAgICAgICBDb2xsZWN0aW9uPFNOSU1hdGNoZXI+IG1hdGNoZXJzID0gbmV3IEFycmF5TGlzdDw+KDEpOworICAgICAgICBtYXRjaGVycy5hZGQobWF0Y2hlcik7CisgICAgICAgIFNTTFBhcmFtZXRlcnMgcGFyYW1zID0gc3NsU29ja2V0LmdldFNTTFBhcmFtZXRlcnMoKTsKKyAgICAgICAgcGFyYW1zLnNldFNOSU1hdGNoZXJzKG1hdGNoZXJzKTsKKyAgICAgICAgc3NsU29ja2V0LnNldFNTTFBhcmFtZXRlcnMocGFyYW1zKTsKKworICAgICAgICBJbnB1dFN0cmVhbSBzc2xJUyA9IHNzbFNvY2tldC5nZXRJbnB1dFN0cmVhbSgpOworICAgICAgICBPdXRwdXRTdHJlYW0gc3NsT1MgPSBzc2xTb2NrZXQuZ2V0T3V0cHV0U3RyZWFtKCk7CisKKyAgICAgICAgc3NsSVMucmVhZCgpOworICAgICAgICBzc2xPUy53cml0ZSg4NSk7CisgICAgICAgIHNzbE9TLmZsdXNoKCk7CisKKyAgICAgICAgRXh0ZW5kZWRTU0xTZXNzaW9uIHNlc3Npb24gPSAoRXh0ZW5kZWRTU0xTZXNzaW9uKXNzbFNvY2tldC5nZXRTZXNzaW9uKCk7CisgICAgICAgIGNoZWNrQ2FwYWJpbGl0aWVzKGNhcGFiaWxpdGllcywgc2Vzc2lvbik7CisKKyAgICAgICAgc3NsU29ja2V0LmNsb3NlKCk7CisgICAgICAgIHNlcnZlclNvY2tldC5jbG9zZSgpOworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBEZWZpbmUgdGhlIGNsaWVudCBzaWRlIG9mIHRoZSB0ZXN0LgorICAgICAqCisgICAgICogSWYgdGhlIHNlcnZlciBwcmVtYXR1cmVseSBleGl0cywgc2VydmVyUmVhZHkgd2lsbCBiZSBzZXQgdG8gdHJ1ZQorICAgICAqIHRvIGF2b2lkIGluZmluaXRlIGhhbmdzLgorICAgICAqLworICAgIHZvaWQgZG9DbGllbnRTaWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogV2FpdCBmb3Igc2VydmVyIHRvIGdldCBzdGFydGVkLgorICAgICAgICAgKi8KKyAgICAgICAgd2hpbGUgKCFzZXJ2ZXJSZWFkeSkgeworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDUwKTsKKyAgICAgICAgfQorCisgICAgICAgIFNTTFNvY2tldEZhY3Rvcnkgc3Nsc2YgPQorICAgICAgICAgICAgKFNTTFNvY2tldEZhY3RvcnkpIFNTTFNvY2tldEZhY3RvcnkuZ2V0RGVmYXVsdCgpOworICAgICAgICBTU0xTb2NrZXQgc3NsU29ja2V0ID0gKFNTTFNvY2tldCkKKyAgICAgICAgICAgIHNzbHNmLmNyZWF0ZVNvY2tldCgibG9jYWxob3N0Iiwgc2VydmVyUG9ydCk7CisKKyAgICAgICAgU05JSG9zdE5hbWUgc2VydmVyTmFtZSA9IG5ldyBTTklIb3N0TmFtZShjbGllbnRSZXF1ZXN0ZWRIb3N0bmFtZSk7CisgICAgICAgIExpc3Q8U05JU2VydmVyTmFtZT4gc2VydmVyTmFtZXMgPSBuZXcgQXJyYXlMaXN0PD4oMSk7CisgICAgICAgIHNlcnZlck5hbWVzLmFkZChzZXJ2ZXJOYW1lKTsKKyAgICAgICAgU1NMUGFyYW1ldGVycyBwYXJhbXMgPSBzc2xTb2NrZXQuZ2V0U1NMUGFyYW1ldGVycygpOworICAgICAgICBwYXJhbXMuc2V0U2VydmVyTmFtZXMoc2VydmVyTmFtZXMpOworICAgICAgICBzc2xTb2NrZXQuc2V0U1NMUGFyYW1ldGVycyhwYXJhbXMpOworCisgICAgICAgIElucHV0U3RyZWFtIHNzbElTID0gc3NsU29ja2V0LmdldElucHV0U3RyZWFtKCk7CisgICAgICAgIE91dHB1dFN0cmVhbSBzc2xPUyA9IHNzbFNvY2tldC5nZXRPdXRwdXRTdHJlYW0oKTsKKworICAgICAgICBzc2xPUy53cml0ZSgyODApOworICAgICAgICBzc2xPUy5mbHVzaCgpOworICAgICAgICBzc2xJUy5yZWFkKCk7CisKKyAgICAgICAgRXh0ZW5kZWRTU0xTZXNzaW9uIHNlc3Npb24gPSAoRXh0ZW5kZWRTU0xTZXNzaW9uKXNzbFNvY2tldC5nZXRTZXNzaW9uKCk7CisgICAgICAgIGNoZWNrU05JSW5TZXNzaW9uKHNlc3Npb24pOworCisgICAgICAgIHNzbFNvY2tldC5jbG9zZSgpOworICAgIH0KKworCisgICAgdm9pZCBjaGVja0NhcGFiaWxpdGllcyhTU0xDYXBhYmlsaXRpZXMgY2FwYWJpbGl0aWVzLAorICAgICAgICAgICAgRXh0ZW5kZWRTU0xTZXNzaW9uIHNlc3Npb24pIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIExpc3Q8U05JU2VydmVyTmFtZT4gc2Vzc2lvblNOSSA9IHNlc3Npb24uZ2V0UmVxdWVzdGVkU2VydmVyTmFtZXMoKTsKKyAgICAgICAgaWYgKCFzZXNzaW9uU05JLmVxdWFscyhjYXBhYmlsaXRpZXMuZ2V0U2VydmVyTmFtZXMoKSkpIHsKKyAgICAgICAgICAgIGZvciAoU05JU2VydmVyTmFtZSBzbmkgOiBzZXNzaW9uU05JKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTTkkgaW4gc2Vzc2lvbiBpcyAiICsgc25pKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTGlzdDxTTklTZXJ2ZXJOYW1lPiBjYXBhU05JID0gY2FwYWJpbGl0aWVzLmdldFNlcnZlck5hbWVzKCk7CisgICAgICAgICAgICBmb3IgKFNOSVNlcnZlck5hbWUgc25pIDogY2FwYVNOSSkgeworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU05JIGluIHNlc3Npb24gaXMgIiArIHNuaSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJzZXJ2ZXIgbmFtZSBpbmRpY2F0aW9uIGRvZXMgbm90IG1hdGNoIGNhcGFiaWxpdGllcyIpOworICAgICAgICB9CisKKyAgICAgICAgY2hlY2tTTklJblNlc3Npb24oc2Vzc2lvbik7CisgICAgfQorCisgICAgdm9pZCBjaGVja1NOSUluU2Vzc2lvbihFeHRlbmRlZFNTTFNlc3Npb24gc2Vzc2lvbikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIExpc3Q8U05JU2VydmVyTmFtZT4gc2Vzc2lvblNOSSA9IHNlc3Npb24uZ2V0UmVxdWVzdGVkU2VydmVyTmFtZXMoKTsKKyAgICAgICAgaWYgKHNlc3Npb25TTkkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZCBlbXB0eSByZXF1ZXN0IHNlcnZlciBuYW1lIGluZGljYXRpb24iKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzZXNzaW9uU05JLnNpemUoKSAhPSAxKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZCByZXF1ZXN0IHNlcnZlciBuYW1lIGluZGljYXRpb24iKTsKKyAgICAgICAgfQorCisgICAgICAgIFNOSVNlcnZlck5hbWUgc2VydmVyTmFtZSA9IHNlc3Npb25TTkkuZ2V0KDApOworICAgICAgICBpZiAoIShzZXJ2ZXJOYW1lIGluc3RhbmNlb2YgU05JSG9zdE5hbWUpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZCBpbnN0YW5jZSBvZiByZXF1ZXN0IHNlcnZlciBuYW1lIGluZGljYXRpb24iKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBob3N0bmFtZSA9ICgoU05JSG9zdE5hbWUpc2VydmVyTmFtZSkuZ2V0QXNjaWlOYW1lKCk7CisgICAgICAgIGlmICghY2xpZW50UmVxdWVzdGVkSG9zdG5hbWUuZXF1YWxzSWdub3JlQ2FzZShob3N0bmFtZSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkIHJlcXVlc3Qgc2VydmVyIG5hbWUgaW5kaWNhdGlvbiB2YWx1ZSIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNsaWVudFJlcXVlc3RlZEhvc3RuYW1lOworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBzZXJ2ZXJBY2NlcHRhYmxlSG9zdG5hbWU7CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHBhcnNlQXJndW1lbnRzKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgY2xpZW50UmVxdWVzdGVkSG9zdG5hbWUgPSBhcmdzWzBdOworICAgICAgICBzZXJ2ZXJBY2NlcHRhYmxlSG9zdG5hbWUgPSBhcmdzWzFdOworICAgIH0KKworCisgICAgLyoKKyAgICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICogVGhlIHJlbWFpbmRlciBpcyBqdXN0IHN1cHBvcnQgc3R1ZmYKKyAgICAgKi8KKworICAgIC8vIHVzZSBhbnkgZnJlZSBwb3J0IGJ5IGRlZmF1bHQKKyAgICB2b2xhdGlsZSBpbnQgc2VydmVyUG9ydCA9IDA7CisKKyAgICB2b2xhdGlsZSBFeGNlcHRpb24gc2VydmVyRXhjZXB0aW9uID0gbnVsbDsKKyAgICB2b2xhdGlsZSBFeGNlcHRpb24gY2xpZW50RXhjZXB0aW9uID0gbnVsbDsKKworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBrZXlGaWxlbmFtZSA9CisgICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoInRlc3Quc3JjIiwgIi4iKSArICIvIiArIHBhdGhUb1N0b3JlcyArCisgICAgICAgICAgICAgICAgIi8iICsga2V5U3RvcmVGaWxlOworICAgICAgICBTdHJpbmcgdHJ1c3RGaWxlbmFtZSA9CisgICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoInRlc3Quc3JjIiwgIi4iKSArICIvIiArIHBhdGhUb1N0b3JlcyArCisgICAgICAgICAgICAgICAgIi8iICsgdHJ1c3RTdG9yZUZpbGU7CisKKyAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJqYXZheC5uZXQuc3NsLmtleVN0b3JlIiwga2V5RmlsZW5hbWUpOworICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImphdmF4Lm5ldC5zc2wua2V5U3RvcmVQYXNzd29yZCIsIHBhc3N3ZCk7CisgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiamF2YXgubmV0LnNzbC50cnVzdFN0b3JlIiwgdHJ1c3RGaWxlbmFtZSk7CisgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiamF2YXgubmV0LnNzbC50cnVzdFN0b3JlUGFzc3dvcmQiLCBwYXNzd2QpOworCisgICAgICAgIGlmIChkZWJ1ZykKKyAgICAgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiamF2YXgubmV0LmRlYnVnIiwgImFsbCIpOworCisgICAgICAgIC8qCisgICAgICAgICAqIEdldCB0aGUgY3VzdG9taXplZCBhcmd1bWVudHMuCisgICAgICAgICAqLworICAgICAgICBwYXJzZUFyZ3VtZW50cyhhcmdzKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBTdGFydCB0aGUgdGVzdHMuCisgICAgICAgICAqLworICAgICAgICBuZXcgU1NMU29ja2V0RXhwbG9yZXJNYXRjaGVkU05JKCk7CisgICAgfQorCisgICAgVGhyZWFkIGNsaWVudFRocmVhZCA9IG51bGw7CisgICAgVGhyZWFkIHNlcnZlclRocmVhZCA9IG51bGw7CisKKyAgICAvKgorICAgICAqIFByaW1hcnkgY29uc3RydWN0b3IsIHVzZWQgdG8gZHJpdmUgcmVtYWluZGVyIG9mIHRoZSB0ZXN0LgorICAgICAqCisgICAgICogRm9yayBvZmYgdGhlIG90aGVyIHNpZGUsIHRoZW4gZG8geW91ciB3b3JrLgorICAgICAqLworICAgIFNTTFNvY2tldEV4cGxvcmVyTWF0Y2hlZFNOSSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKHNlcGFyYXRlU2VydmVyVGhyZWFkKSB7CisgICAgICAgICAgICAgICAgc3RhcnRTZXJ2ZXIodHJ1ZSk7CisgICAgICAgICAgICAgICAgc3RhcnRDbGllbnQoZmFsc2UpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdGFydENsaWVudCh0cnVlKTsKKyAgICAgICAgICAgICAgICBzdGFydFNlcnZlcihmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBzd2FsbG93IGZvciBub3cuICBTaG93IGxhdGVyCisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBXYWl0IGZvciBvdGhlciBzaWRlIHRvIGNsb3NlIGRvd24uCisgICAgICAgICAqLworICAgICAgICBpZiAoc2VwYXJhdGVTZXJ2ZXJUaHJlYWQpIHsKKyAgICAgICAgICAgIHNlcnZlclRocmVhZC5qb2luKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjbGllbnRUaHJlYWQuam9pbigpOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogV2hlbiB3ZSBnZXQgaGVyZSwgdGhlIHRlc3QgaXMgcHJldHR5IG11Y2ggb3Zlci4KKyAgICAgICAgICogV2hpY2ggc2lkZSB0aHJldyB0aGUgZXJyb3I/CisgICAgICAgICAqLworICAgICAgICBFeGNlcHRpb24gbG9jYWw7CisgICAgICAgIEV4Y2VwdGlvbiByZW1vdGU7CisgICAgICAgIFN0cmluZyB3aGljaFJlbW90ZTsKKworICAgICAgICBpZiAoc2VwYXJhdGVTZXJ2ZXJUaHJlYWQpIHsKKyAgICAgICAgICAgIHJlbW90ZSA9IHNlcnZlckV4Y2VwdGlvbjsKKyAgICAgICAgICAgIGxvY2FsID0gY2xpZW50RXhjZXB0aW9uOworICAgICAgICAgICAgd2hpY2hSZW1vdGUgPSAic2VydmVyIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlbW90ZSA9IGNsaWVudEV4Y2VwdGlvbjsKKyAgICAgICAgICAgIGxvY2FsID0gc2VydmVyRXhjZXB0aW9uOworICAgICAgICAgICAgd2hpY2hSZW1vdGUgPSAiY2xpZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIElmIGJvdGggZmFpbGVkLCByZXR1cm4gdGhlIGN1cnRocmVhZCdzIGV4Y2VwdGlvbiwgYnV0IGFsc28KKyAgICAgICAgICogcHJpbnQgdGhlIHJlbW90ZSBzaWRlIEV4Y2VwdGlvbgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKChsb2NhbCAhPSBudWxsKSAmJiAocmVtb3RlICE9IG51bGwpKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4od2hpY2hSZW1vdGUgKyAiIGFsc28gdGhyZXc6Iik7CisgICAgICAgICAgICByZW1vdGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKKyAgICAgICAgICAgIHRocm93IGxvY2FsOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlbW90ZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyByZW1vdGU7CisgICAgICAgIH0KKworICAgICAgICBpZiAobG9jYWwgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbG9jYWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHN0YXJ0U2VydmVyKGJvb2xlYW4gbmV3VGhyZWFkKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG5ld1RocmVhZCkgeworICAgICAgICAgICAgc2VydmVyVGhyZWFkID0gbmV3IFRocmVhZCgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkb1NlcnZlclNpZGUoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBPdXIgc2VydmVyIHRocmVhZCBqdXN0IGRpZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAgICAgICAgICAgICAgICAgICAgICAgICogUmVsZWFzZSB0aGUgY2xpZW50LCBpZiBub3QgYWN0aXZlIGFscmVhZHkuLi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJTZXJ2ZXIgZGllZC4uLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyUmVhZHkgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyRXhjZXB0aW9uID0gZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBzZXJ2ZXJUaHJlYWQuc3RhcnQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZG9TZXJ2ZXJTaWRlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHNlcnZlckV4Y2VwdGlvbiA9IGU7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIHNlcnZlclJlYWR5ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgc3RhcnRDbGllbnQoYm9vbGVhbiBuZXdUaHJlYWQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAobmV3VGhyZWFkKSB7CisgICAgICAgICAgICBjbGllbnRUaHJlYWQgPSBuZXcgVGhyZWFkKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvQ2xpZW50U2lkZSgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIE91ciBjbGllbnQgdGhyZWFkIGp1c3QgZGllZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJDbGllbnQgZGllZC4uLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50RXhjZXB0aW9uID0gZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBjbGllbnRUaHJlYWQuc3RhcnQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZG9DbGllbnRTaWRlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGNsaWVudEV4Y2VwdGlvbiA9IGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvc3NsL2phdmF4L25ldC9zc2wvU2VydmVyTmFtZS9TU0xTb2NrZXRFeHBsb3JlclVubWF0Y2hlZFNOSS5qYXZhIGIvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L3NzbC9qYXZheC9uZXQvc3NsL1NlcnZlck5hbWUvU1NMU29ja2V0RXhwbG9yZXJVbm1hdGNoZWRTTkkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWI0ODAwCi0tLSAvZGV2L251bGwKKysrIGIvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L3NzbC9qYXZheC9uZXQvc3NsL1NlcnZlck5hbWUvU1NMU29ja2V0RXhwbG9yZXJVbm1hdGNoZWRTTkkuamF2YQpAQCAtMCwwICsxLDM5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQorICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQorICogcXVlc3Rpb25zLgorICovCisKKy8vCisvLyBTdW5KU1NFIGRvZXMgbm90IHN1cHBvcnQgZHluYW1pYyBzeXN0ZW0gcHJvcGVydGllcywgbm8gd2F5IHRvIHJlLXVzZQorLy8gc3lzdGVtIHByb3BlcnRpZXMgaW4gc2FtZXZtL2FnZW50dm0gbW9kZS4KKy8vCisKKy8qKgorICogQHRlc3QKKyAqIEBidWcgNzA2ODMyMQorICogQHN1bW1hcnkgU3VwcG9ydCBUTFMgU2VydmVyIE5hbWUgSW5kaWNhdGlvbiAoU05JKSBFeHRlbnNpb24gaW4gSlNTRSBTZXJ2ZXIKKyAqIEBsaWJyYXJ5IC4uLy4uLy4uLy4uL3RlbXBsYXRlcworICogQGJ1aWxkIFNTTENhcGFiaWxpdGllcyBTU0xFeHBsb3JlcgorICogQHJ1biBtYWluL290aGVydm0gU1NMU29ja2V0RXhwbG9yZXJVbm1hdGNoZWRTTkkgd3d3LmV4YW1wbGUuY29tCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3d3dcLmV4YW1wbGVcLm9yZworICovCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS5uaW8uKjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy4qOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEubmV0Lio7CitpbXBvcnQgamF2YXgubmV0LnNzbC4qOworCitwdWJsaWMgY2xhc3MgU1NMU29ja2V0RXhwbG9yZXJVbm1hdGNoZWRTTkkgeworCisgICAgLyoKKyAgICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICogU2V0IHRoZSB2YXJpb3VzIHZhcmlhYmxlcyBuZWVkZWQgZm9yIHRoZSB0ZXN0cywgdGhlbgorICAgICAqIHNwZWNpZnkgd2hhdCB0ZXN0cyB0byBydW4gb24gZWFjaCBzaWRlLgorICAgICAqLworCisgICAgLyoKKyAgICAgKiBTaG91bGQgd2UgcnVuIHRoZSBjbGllbnQgb3Igc2VydmVyIGluIGEgc2VwYXJhdGUgdGhyZWFkPworICAgICAqIEJvdGggc2lkZXMgY2FuIHRocm93IGV4Y2VwdGlvbnMsIGJ1dCBkbyB5b3UgaGF2ZSBhIHByZWZlcmVuY2UKKyAgICAgKiBhcyB0byB3aGljaCBzaWRlIHNob3VsZCBiZSB0aGUgbWFpbiB0aHJlYWQuCisgICAgICovCisgICAgc3RhdGljIGJvb2xlYW4gc2VwYXJhdGVTZXJ2ZXJUaHJlYWQgPSBmYWxzZTsKKworICAgIC8qCisgICAgICogV2hlcmUgZG8gd2UgZmluZCB0aGUga2V5c3RvcmVzPworICAgICAqLworICAgIHN0YXRpYyBTdHJpbmcgcGF0aFRvU3RvcmVzID0gIi4uLy4uLy4uLy4uL2V0YyI7CisgICAgc3RhdGljIFN0cmluZyBrZXlTdG9yZUZpbGUgPSAia2V5c3RvcmUiOworICAgIHN0YXRpYyBTdHJpbmcgdHJ1c3RTdG9yZUZpbGUgPSAidHJ1c3RzdG9yZSI7CisgICAgc3RhdGljIFN0cmluZyBwYXNzd2QgPSAicGFzc3BocmFzZSI7CisKKyAgICAvKgorICAgICAqIElzIHRoZSBzZXJ2ZXIgcmVhZHkgdG8gc2VydmU/CisgICAgICovCisgICAgdm9sYXRpbGUgc3RhdGljIGJvb2xlYW4gc2VydmVyUmVhZHkgPSBmYWxzZTsKKworICAgIC8qCisgICAgICogVHVybiBvbiBTU0wgZGVidWdnaW5nPworICAgICAqLworICAgIHN0YXRpYyBib29sZWFuIGRlYnVnID0gZmFsc2U7CisKKyAgICAvKgorICAgICAqIElmIHRoZSBjbGllbnQgb3Igc2VydmVyIGlzIGRvaW5nIHNvbWUga2luZCBvZiBvYmplY3QgY3JlYXRpb24KKyAgICAgKiB0aGF0IHRoZSBvdGhlciBzaWRlIGRlcGVuZHMgb24sIGFuZCB0aGF0IHRocmVhZCBwcmVtYXR1cmVseQorICAgICAqIGV4aXRzLCB5b3UgbWF5IGV4cGVyaWVuY2UgYSBoYW5nLiAgVGhlIHRlc3QgaGFybmVzcyB3aWxsCisgICAgICogdGVybWluYXRlIGFsbCBodW5nIHRocmVhZHMgYWZ0ZXIgaXRzIHRpbWVvdXQgaGFzIGV4cGlyZWQsCisgICAgICogY3VycmVudGx5IDMgbWludXRlcyBieSBkZWZhdWx0LCBidXQgeW91IG1pZ2h0IHRyeSB0byBiZQorICAgICAqIHNtYXJ0IGFib3V0IGl0Li4uLgorICAgICAqLworCisgICAgLyoKKyAgICAgKiBEZWZpbmUgdGhlIHNlcnZlciBzaWRlIG9mIHRoZSB0ZXN0LgorICAgICAqCisgICAgICogSWYgdGhlIHNlcnZlciBwcmVtYXR1cmVseSBleGl0cywgc2VydmVyUmVhZHkgd2lsbCBiZSBzZXQgdG8gdHJ1ZQorICAgICAqIHRvIGF2b2lkIGluZmluaXRlIGhhbmdzLgorICAgICAqLworICAgIHZvaWQgZG9TZXJ2ZXJTaWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgU2VydmVyU29ja2V0IHNlcnZlclNvY2tldCA9IG5ldyBTZXJ2ZXJTb2NrZXQoc2VydmVyUG9ydCk7CisKKyAgICAgICAgLy8gU2lnbmFsIENsaWVudCwgd2UncmUgcmVhZHkgZm9yIGhpcyBjb25uZWN0LgorICAgICAgICBzZXJ2ZXJQb3J0ID0gc2VydmVyU29ja2V0LmdldExvY2FsUG9ydCgpOworICAgICAgICBzZXJ2ZXJSZWFkeSA9IHRydWU7CisKKyAgICAgICAgU29ja2V0IHNvY2tldCA9IHNlcnZlclNvY2tldC5hY2NlcHQoKTsKKyAgICAgICAgSW5wdXRTdHJlYW0gaW5zID0gc29ja2V0LmdldElucHV0U3RyZWFtKCk7CisKKyAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzB4RkZdOworICAgICAgICBpbnQgcG9zaXRpb24gPSAwOworICAgICAgICBTU0xDYXBhYmlsaXRpZXMgY2FwYWJpbGl0aWVzID0gbnVsbDsKKworICAgICAgICAvLyBSZWFkIHRoZSBoZWFkZXIgb2YgVExTIHJlY29yZAorICAgICAgICB3aGlsZSAocG9zaXRpb24gPCBTU0xFeHBsb3Jlci5SRUNPUkRfSEVBREVSX1NJWkUpIHsKKyAgICAgICAgICAgIGludCBjb3VudCA9IFNTTEV4cGxvcmVyLlJFQ09SRF9IRUFERVJfU0laRSAtIHBvc2l0aW9uOworICAgICAgICAgICAgaW50IG4gPSBpbnMucmVhZChidWZmZXIsIHBvc2l0aW9uLCBjb3VudCk7CisgICAgICAgICAgICBpZiAobiA8IDApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJ1bmV4cGVjdGVkIGVuZCBvZiBzdHJlYW0hIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwb3NpdGlvbiArPSBuOworICAgICAgICB9CisKKyAgICAgICAgaW50IHJlY29yZExlbmd0aCA9IFNTTEV4cGxvcmVyLmdldFJlcXVpcmVkU2l6ZShidWZmZXIsIDAsIHBvc2l0aW9uKTsKKyAgICAgICAgaWYgKGJ1ZmZlci5sZW5ndGggPCByZWNvcmRMZW5ndGgpIHsKKyAgICAgICAgICAgIGJ1ZmZlciA9IEFycmF5cy5jb3B5T2YoYnVmZmVyLCByZWNvcmRMZW5ndGgpOworICAgICAgICB9CisKKyAgICAgICAgd2hpbGUgKHBvc2l0aW9uIDwgcmVjb3JkTGVuZ3RoKSB7CisgICAgICAgICAgICBpbnQgY291bnQgPSByZWNvcmRMZW5ndGggLSBwb3NpdGlvbjsKKyAgICAgICAgICAgIGludCBuID0gaW5zLnJlYWQoYnVmZmVyLCBwb3NpdGlvbiwgY291bnQpOworICAgICAgICAgICAgaWYgKG4gPCAwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigidW5leHBlY3RlZCBlbmQgb2Ygc3RyZWFtISIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcG9zaXRpb24gKz0gbjsKKyAgICAgICAgfQorCisgICAgICAgIGNhcGFiaWxpdGllcyA9IFNTTEV4cGxvcmVyLmV4cGxvcmUoYnVmZmVyLCAwLCByZWNvcmRMZW5ndGgpOzsKKyAgICAgICAgaWYgKGNhcGFiaWxpdGllcyAhPSBudWxsKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJlY29yZCB2ZXJzaW9uOiAiICsKKyAgICAgICAgICAgICAgICAgICAgY2FwYWJpbGl0aWVzLmdldFJlY29yZFZlcnNpb24oKSk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkhlbGxvIHZlcnNpb246ICIgKworICAgICAgICAgICAgICAgICAgICBjYXBhYmlsaXRpZXMuZ2V0SGVsbG9WZXJzaW9uKCkpOworICAgICAgICB9CisKKyAgICAgICAgU1NMU29ja2V0RmFjdG9yeSBzc2xzZiA9CisgICAgICAgICAgICAoU1NMU29ja2V0RmFjdG9yeSkgU1NMU29ja2V0RmFjdG9yeS5nZXREZWZhdWx0KCk7CisgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGJhaXMgPQorICAgICAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ1ZmZlciwgMCwgcG9zaXRpb24pOworICAgICAgICBTU0xTb2NrZXQgc3NsU29ja2V0ID0gKFNTTFNvY2tldClzc2xzZi5jcmVhdGVTb2NrZXQoc29ja2V0LCBiYWlzLCB0cnVlKTsKKworICAgICAgICBTTklNYXRjaGVyIG1hdGNoZXIgPSBTTklIb3N0TmFtZS5jcmVhdGVTTklNYXRjaGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyQWNjZXB0YWJsZUhvc3RuYW1lKTsKKyAgICAgICAgQ29sbGVjdGlvbjxTTklNYXRjaGVyPiBtYXRjaGVycyA9IG5ldyBBcnJheUxpc3Q8PigxKTsKKyAgICAgICAgbWF0Y2hlcnMuYWRkKG1hdGNoZXIpOworICAgICAgICBTU0xQYXJhbWV0ZXJzIHBhcmFtcyA9IHNzbFNvY2tldC5nZXRTU0xQYXJhbWV0ZXJzKCk7CisgICAgICAgIHBhcmFtcy5zZXRTTklNYXRjaGVycyhtYXRjaGVycyk7CisgICAgICAgIHNzbFNvY2tldC5zZXRTU0xQYXJhbWV0ZXJzKHBhcmFtcyk7CisKKyAgICAgICAgSW5wdXRTdHJlYW0gc3NsSVMgPSBzc2xTb2NrZXQuZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICAgICAgT3V0cHV0U3RyZWFtIHNzbE9TID0gc3NsU29ja2V0LmdldE91dHB1dFN0cmVhbSgpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzc2xJUy5yZWFkKCk7CisgICAgICAgICAgICBzc2xPUy53cml0ZSg4NSk7CisgICAgICAgICAgICBzc2xPUy5mbHVzaCgpOworCisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJNaXNtYXRjaGVkIHNlcnZlciBuYW1lIGluZGljYXRpb24gd2FzIGFjY2VwdGVkIik7CisgICAgICAgIH0gY2F0Y2ggKFNTTEhhbmRzaGFrZUV4Y2VwdGlvbiBzc2xoZSkgeworICAgICAgICAgICAgLy8gdGhlIGV4cGVjdGVkIHVucmVjb2duaXplZCBzZXJ2ZXIgbmFtZSBpbmRpY2F0aW9uIGV4Y2VwdGlvbgorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgIC8vIHRoZSBwZWVyIG1heSBoYXZlIGNsb3NlZCB0aGUgc29ja2V0IGJlY2F1c2Ugb2YgdGhlIHVubWF0Y2hlZAorICAgICAgICAgICAgLy8gc2VydmVyIG5hbWUgaW5kaWNhdGlvbi4KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHNzbFNvY2tldC5jbG9zZSgpOworICAgICAgICAgICAgc2VydmVyU29ja2V0LmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qCisgICAgICogRGVmaW5lIHRoZSBjbGllbnQgc2lkZSBvZiB0aGUgdGVzdC4KKyAgICAgKgorICAgICAqIElmIHRoZSBzZXJ2ZXIgcHJlbWF0dXJlbHkgZXhpdHMsIHNlcnZlclJlYWR5IHdpbGwgYmUgc2V0IHRvIHRydWUKKyAgICAgKiB0byBhdm9pZCBpbmZpbml0ZSBoYW5ncy4KKyAgICAgKi8KKyAgICB2b2lkIGRvQ2xpZW50U2lkZSgpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIC8qCisgICAgICAgICAqIFdhaXQgZm9yIHNlcnZlciB0byBnZXQgc3RhcnRlZC4KKyAgICAgICAgICovCisgICAgICAgIHdoaWxlICghc2VydmVyUmVhZHkpIHsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcCg1MCk7CisgICAgICAgIH0KKworICAgICAgICBTU0xTb2NrZXRGYWN0b3J5IHNzbHNmID0KKyAgICAgICAgICAgIChTU0xTb2NrZXRGYWN0b3J5KSBTU0xTb2NrZXRGYWN0b3J5LmdldERlZmF1bHQoKTsKKyAgICAgICAgU1NMU29ja2V0IHNzbFNvY2tldCA9IChTU0xTb2NrZXQpCisgICAgICAgICAgICBzc2xzZi5jcmVhdGVTb2NrZXQoImxvY2FsaG9zdCIsIHNlcnZlclBvcnQpOworCisgICAgICAgIFNOSUhvc3ROYW1lIHNlcnZlck5hbWUgPSBuZXcgU05JSG9zdE5hbWUoY2xpZW50UmVxdWVzdGVkSG9zdG5hbWUpOworICAgICAgICBMaXN0PFNOSVNlcnZlck5hbWU+IHNlcnZlck5hbWVzID0gbmV3IEFycmF5TGlzdDw+KDEpOworICAgICAgICBzZXJ2ZXJOYW1lcy5hZGQoc2VydmVyTmFtZSk7CisgICAgICAgIFNTTFBhcmFtZXRlcnMgcGFyYW1zID0gc3NsU29ja2V0LmdldFNTTFBhcmFtZXRlcnMoKTsKKyAgICAgICAgcGFyYW1zLnNldFNlcnZlck5hbWVzKHNlcnZlck5hbWVzKTsKKyAgICAgICAgc3NsU29ja2V0LnNldFNTTFBhcmFtZXRlcnMocGFyYW1zKTsKKworICAgICAgICBJbnB1dFN0cmVhbSBzc2xJUyA9IHNzbFNvY2tldC5nZXRJbnB1dFN0cmVhbSgpOworICAgICAgICBPdXRwdXRTdHJlYW0gc3NsT1MgPSBzc2xTb2NrZXQuZ2V0T3V0cHV0U3RyZWFtKCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNzbE9TLndyaXRlKDI4MCk7CisgICAgICAgICAgICBzc2xPUy5mbHVzaCgpOworICAgICAgICAgICAgc3NsSVMucmVhZCgpOworCisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJNaXNtYXRjaGVkIHNlcnZlciBuYW1lIGluZGljYXRpb24gd2FzIGFjY2VwdGVkIik7CisgICAgICAgIH0gY2F0Y2ggKFNTTEhhbmRzaGFrZUV4Y2VwdGlvbiBzc2xoZSkgeworICAgICAgICAgICAgLy8gdGhlIGV4cGVjdGVkIHVucmVjb2duaXplZCBzZXJ2ZXIgbmFtZSBpbmRpY2F0aW9uIGV4Y2VwdGlvbgorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgIC8vIHRoZSBwZWVyIG1heSBoYXZlIGNsb3NlZCB0aGUgc29ja2V0IGJlY2F1c2Ugb2YgdGhlIHVubWF0Y2hlZAorICAgICAgICAgICAgLy8gc2VydmVyIG5hbWUgaW5kaWNhdGlvbi4KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHNzbFNvY2tldC5jbG9zZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNsaWVudFJlcXVlc3RlZEhvc3RuYW1lOworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBzZXJ2ZXJBY2NlcHRhYmxlSG9zdG5hbWU7CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHBhcnNlQXJndW1lbnRzKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgY2xpZW50UmVxdWVzdGVkSG9zdG5hbWUgPSBhcmdzWzBdOworICAgICAgICBzZXJ2ZXJBY2NlcHRhYmxlSG9zdG5hbWUgPSBhcmdzWzFdOworICAgIH0KKworICAgIC8qCisgICAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAqIFRoZSByZW1haW5kZXIgaXMganVzdCBzdXBwb3J0IHN0dWZmCisgICAgICovCisKKyAgICAvLyB1c2UgYW55IGZyZWUgcG9ydCBieSBkZWZhdWx0CisgICAgdm9sYXRpbGUgaW50IHNlcnZlclBvcnQgPSAwOworCisgICAgdm9sYXRpbGUgRXhjZXB0aW9uIHNlcnZlckV4Y2VwdGlvbiA9IG51bGw7CisgICAgdm9sYXRpbGUgRXhjZXB0aW9uIGNsaWVudEV4Y2VwdGlvbiA9IG51bGw7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGtleUZpbGVuYW1lID0KKyAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgidGVzdC5zcmMiLCAiLiIpICsgIi8iICsgcGF0aFRvU3RvcmVzICsKKyAgICAgICAgICAgICAgICAiLyIgKyBrZXlTdG9yZUZpbGU7CisgICAgICAgIFN0cmluZyB0cnVzdEZpbGVuYW1lID0KKyAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgidGVzdC5zcmMiLCAiLiIpICsgIi8iICsgcGF0aFRvU3RvcmVzICsKKyAgICAgICAgICAgICAgICAiLyIgKyB0cnVzdFN0b3JlRmlsZTsKKworICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImphdmF4Lm5ldC5zc2wua2V5U3RvcmUiLCBrZXlGaWxlbmFtZSk7CisgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiamF2YXgubmV0LnNzbC5rZXlTdG9yZVBhc3N3b3JkIiwgcGFzc3dkKTsKKyAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJqYXZheC5uZXQuc3NsLnRydXN0U3RvcmUiLCB0cnVzdEZpbGVuYW1lKTsKKyAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJqYXZheC5uZXQuc3NsLnRydXN0U3RvcmVQYXNzd29yZCIsIHBhc3N3ZCk7CisKKyAgICAgICAgaWYgKGRlYnVnKQorICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJqYXZheC5uZXQuZGVidWciLCAiYWxsIik7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogR2V0IHRoZSBjdXN0b21pemVkIGFyZ3VtZW50cy4KKyAgICAgICAgICovCisgICAgICAgIHBhcnNlQXJndW1lbnRzKGFyZ3MpOworCisgICAgICAgIC8qCisgICAgICAgICAqIFN0YXJ0IHRoZSB0ZXN0cy4KKyAgICAgICAgICovCisgICAgICAgIG5ldyBTU0xTb2NrZXRFeHBsb3JlclVubWF0Y2hlZFNOSSgpOworICAgIH0KKworICAgIFRocmVhZCBjbGllbnRUaHJlYWQgPSBudWxsOworICAgIFRocmVhZCBzZXJ2ZXJUaHJlYWQgPSBudWxsOworCisgICAgLyoKKyAgICAgKiBQcmltYXJ5IGNvbnN0cnVjdG9yLCB1c2VkIHRvIGRyaXZlIHJlbWFpbmRlciBvZiB0aGUgdGVzdC4KKyAgICAgKgorICAgICAqIEZvcmsgb2ZmIHRoZSBvdGhlciBzaWRlLCB0aGVuIGRvIHlvdXIgd29yay4KKyAgICAgKi8KKyAgICBTU0xTb2NrZXRFeHBsb3JlclVubWF0Y2hlZFNOSSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKHNlcGFyYXRlU2VydmVyVGhyZWFkKSB7CisgICAgICAgICAgICAgICAgc3RhcnRTZXJ2ZXIodHJ1ZSk7CisgICAgICAgICAgICAgICAgc3RhcnRDbGllbnQoZmFsc2UpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdGFydENsaWVudCh0cnVlKTsKKyAgICAgICAgICAgICAgICBzdGFydFNlcnZlcihmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBzd2FsbG93IGZvciBub3cuICBTaG93IGxhdGVyCisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBXYWl0IGZvciBvdGhlciBzaWRlIHRvIGNsb3NlIGRvd24uCisgICAgICAgICAqLworICAgICAgICBpZiAoc2VwYXJhdGVTZXJ2ZXJUaHJlYWQpIHsKKyAgICAgICAgICAgIHNlcnZlclRocmVhZC5qb2luKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjbGllbnRUaHJlYWQuam9pbigpOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogV2hlbiB3ZSBnZXQgaGVyZSwgdGhlIHRlc3QgaXMgcHJldHR5IG11Y2ggb3Zlci4KKyAgICAgICAgICogV2hpY2ggc2lkZSB0aHJldyB0aGUgZXJyb3I/CisgICAgICAgICAqLworICAgICAgICBFeGNlcHRpb24gbG9jYWw7CisgICAgICAgIEV4Y2VwdGlvbiByZW1vdGU7CisgICAgICAgIFN0cmluZyB3aGljaFJlbW90ZTsKKworICAgICAgICBpZiAoc2VwYXJhdGVTZXJ2ZXJUaHJlYWQpIHsKKyAgICAgICAgICAgIHJlbW90ZSA9IHNlcnZlckV4Y2VwdGlvbjsKKyAgICAgICAgICAgIGxvY2FsID0gY2xpZW50RXhjZXB0aW9uOworICAgICAgICAgICAgd2hpY2hSZW1vdGUgPSAic2VydmVyIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlbW90ZSA9IGNsaWVudEV4Y2VwdGlvbjsKKyAgICAgICAgICAgIGxvY2FsID0gc2VydmVyRXhjZXB0aW9uOworICAgICAgICAgICAgd2hpY2hSZW1vdGUgPSAiY2xpZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIElmIGJvdGggZmFpbGVkLCByZXR1cm4gdGhlIGN1cnRocmVhZCdzIGV4Y2VwdGlvbiwgYnV0IGFsc28KKyAgICAgICAgICogcHJpbnQgdGhlIHJlbW90ZSBzaWRlIEV4Y2VwdGlvbgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKChsb2NhbCAhPSBudWxsKSAmJiAocmVtb3RlICE9IG51bGwpKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4od2hpY2hSZW1vdGUgKyAiIGFsc28gdGhyZXc6Iik7CisgICAgICAgICAgICByZW1vdGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKKyAgICAgICAgICAgIHRocm93IGxvY2FsOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlbW90ZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyByZW1vdGU7CisgICAgICAgIH0KKworICAgICAgICBpZiAobG9jYWwgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbG9jYWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHN0YXJ0U2VydmVyKGJvb2xlYW4gbmV3VGhyZWFkKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG5ld1RocmVhZCkgeworICAgICAgICAgICAgc2VydmVyVGhyZWFkID0gbmV3IFRocmVhZCgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkb1NlcnZlclNpZGUoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBPdXIgc2VydmVyIHRocmVhZCBqdXN0IGRpZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAgICAgICAgICAgICAgICAgICAgICAgICogUmVsZWFzZSB0aGUgY2xpZW50LCBpZiBub3QgYWN0aXZlIGFscmVhZHkuLi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJTZXJ2ZXIgZGllZC4uLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyUmVhZHkgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyRXhjZXB0aW9uID0gZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBzZXJ2ZXJUaHJlYWQuc3RhcnQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZG9TZXJ2ZXJTaWRlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHNlcnZlckV4Y2VwdGlvbiA9IGU7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIHNlcnZlclJlYWR5ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgc3RhcnRDbGllbnQoYm9vbGVhbiBuZXdUaHJlYWQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAobmV3VGhyZWFkKSB7CisgICAgICAgICAgICBjbGllbnRUaHJlYWQgPSBuZXcgVGhyZWFkKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvQ2xpZW50U2lkZSgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIE91ciBjbGllbnQgdGhyZWFkIGp1c3QgZGllZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJDbGllbnQgZGllZC4uLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50RXhjZXB0aW9uID0gZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBjbGllbnRUaHJlYWQuc3RhcnQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZG9DbGllbnRTaWRlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGNsaWVudEV4Y2VwdGlvbiA9IGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvc3NsL2phdmF4L25ldC9zc2wvU2VydmVyTmFtZS9TU0xTb2NrZXRFeHBsb3JlcldpdGhDbGlTTkkuamF2YSBiL2pkay90ZXN0L3N1bi9zZWN1cml0eS9zc2wvamF2YXgvbmV0L3NzbC9TZXJ2ZXJOYW1lL1NTTFNvY2tldEV4cGxvcmVyV2l0aENsaVNOSS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5MzNjOWEKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvc3NsL2phdmF4L25ldC9zc2wvU2VydmVyTmFtZS9TU0xTb2NrZXRFeHBsb3JlcldpdGhDbGlTTkkuamF2YQpAQCAtMCwwICsxLDQwNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQorICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQorICogcXVlc3Rpb25zLgorICovCisKKy8vCisvLyBTdW5KU1NFIGRvZXMgbm90IHN1cHBvcnQgZHluYW1pYyBzeXN0ZW0gcHJvcGVydGllcywgbm8gd2F5IHRvIHJlLXVzZQorLy8gc3lzdGVtIHByb3BlcnRpZXMgaW4gc2FtZXZtL2FnZW50dm0gbW9kZS4KKy8vCisKKy8qKgorICogQHRlc3QKKyAqIEBidWcgNzA2ODMyMQorICogQHN1bW1hcnkgU3VwcG9ydCBUTFMgU2VydmVyIE5hbWUgSW5kaWNhdGlvbiAoU05JKSBFeHRlbnNpb24gaW4gSlNTRSBTZXJ2ZXIKKyAqIEBsaWJyYXJ5IC4uLy4uLy4uLy4uL3RlbXBsYXRlcworICogQGJ1aWxkIFNTTENhcGFiaWxpdGllcyBTU0xFeHBsb3JlcgorICogQHJ1biBtYWluL290aGVydm0gU1NMU29ja2V0RXhwbG9yZXJXaXRoQ2xpU05JCisgKi8KKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLm5pby4qOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLio7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS5uZXQuKjsKK2ltcG9ydCBqYXZheC5uZXQuc3NsLio7CisKK3B1YmxpYyBjbGFzcyBTU0xTb2NrZXRFeHBsb3JlcldpdGhDbGlTTkkgeworCisgICAgLyoKKyAgICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICogU2V0IHRoZSB2YXJpb3VzIHZhcmlhYmxlcyBuZWVkZWQgZm9yIHRoZSB0ZXN0cywgdGhlbgorICAgICAqIHNwZWNpZnkgd2hhdCB0ZXN0cyB0byBydW4gb24gZWFjaCBzaWRlLgorICAgICAqLworCisgICAgLyoKKyAgICAgKiBTaG91bGQgd2UgcnVuIHRoZSBjbGllbnQgb3Igc2VydmVyIGluIGEgc2VwYXJhdGUgdGhyZWFkPworICAgICAqIEJvdGggc2lkZXMgY2FuIHRocm93IGV4Y2VwdGlvbnMsIGJ1dCBkbyB5b3UgaGF2ZSBhIHByZWZlcmVuY2UKKyAgICAgKiBhcyB0byB3aGljaCBzaWRlIHNob3VsZCBiZSB0aGUgbWFpbiB0aHJlYWQuCisgICAgICovCisgICAgc3RhdGljIGJvb2xlYW4gc2VwYXJhdGVTZXJ2ZXJUaHJlYWQgPSB0cnVlOworCisgICAgLyoKKyAgICAgKiBXaGVyZSBkbyB3ZSBmaW5kIHRoZSBrZXlzdG9yZXM/CisgICAgICovCisgICAgc3RhdGljIFN0cmluZyBwYXRoVG9TdG9yZXMgPSAiLi4vLi4vLi4vLi4vZXRjIjsKKyAgICBzdGF0aWMgU3RyaW5nIGtleVN0b3JlRmlsZSA9ICJrZXlzdG9yZSI7CisgICAgc3RhdGljIFN0cmluZyB0cnVzdFN0b3JlRmlsZSA9ICJ0cnVzdHN0b3JlIjsKKyAgICBzdGF0aWMgU3RyaW5nIHBhc3N3ZCA9ICJwYXNzcGhyYXNlIjsKKworICAgIC8qCisgICAgICogSXMgdGhlIHNlcnZlciByZWFkeSB0byBzZXJ2ZT8KKyAgICAgKi8KKyAgICB2b2xhdGlsZSBzdGF0aWMgYm9vbGVhbiBzZXJ2ZXJSZWFkeSA9IGZhbHNlOworCisgICAgLyoKKyAgICAgKiBUdXJuIG9uIFNTTCBkZWJ1Z2dpbmc/CisgICAgICovCisgICAgc3RhdGljIGJvb2xlYW4gZGVidWcgPSBmYWxzZTsKKworICAgIC8qCisgICAgICogSWYgdGhlIGNsaWVudCBvciBzZXJ2ZXIgaXMgZG9pbmcgc29tZSBraW5kIG9mIG9iamVjdCBjcmVhdGlvbgorICAgICAqIHRoYXQgdGhlIG90aGVyIHNpZGUgZGVwZW5kcyBvbiwgYW5kIHRoYXQgdGhyZWFkIHByZW1hdHVyZWx5CisgICAgICogZXhpdHMsIHlvdSBtYXkgZXhwZXJpZW5jZSBhIGhhbmcuICBUaGUgdGVzdCBoYXJuZXNzIHdpbGwKKyAgICAgKiB0ZXJtaW5hdGUgYWxsIGh1bmcgdGhyZWFkcyBhZnRlciBpdHMgdGltZW91dCBoYXMgZXhwaXJlZCwKKyAgICAgKiBjdXJyZW50bHkgMyBtaW51dGVzIGJ5IGRlZmF1bHQsIGJ1dCB5b3UgbWlnaHQgdHJ5IHRvIGJlCisgICAgICogc21hcnQgYWJvdXQgaXQuLi4uCisgICAgICovCisKKyAgICAvKgorICAgICAqIERlZmluZSB0aGUgc2VydmVyIHNpZGUgb2YgdGhlIHRlc3QuCisgICAgICoKKyAgICAgKiBJZiB0aGUgc2VydmVyIHByZW1hdHVyZWx5IGV4aXRzLCBzZXJ2ZXJSZWFkeSB3aWxsIGJlIHNldCB0byB0cnVlCisgICAgICogdG8gYXZvaWQgaW5maW5pdGUgaGFuZ3MuCisgICAgICovCisgICAgdm9pZCBkb1NlcnZlclNpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBTZXJ2ZXJTb2NrZXQgc2VydmVyU29ja2V0ID0gbmV3IFNlcnZlclNvY2tldChzZXJ2ZXJQb3J0KTsKKworICAgICAgICAvLyBTaWduYWwgQ2xpZW50LCB3ZSdyZSByZWFkeSBmb3IgaGlzIGNvbm5lY3QuCisgICAgICAgIHNlcnZlclBvcnQgPSBzZXJ2ZXJTb2NrZXQuZ2V0TG9jYWxQb3J0KCk7CisgICAgICAgIHNlcnZlclJlYWR5ID0gdHJ1ZTsKKworICAgICAgICBTb2NrZXQgc29ja2V0ID0gc2VydmVyU29ja2V0LmFjY2VwdCgpOworICAgICAgICBJbnB1dFN0cmVhbSBpbnMgPSBzb2NrZXQuZ2V0SW5wdXRTdHJlYW0oKTsKKworICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbMHhGRl07CisgICAgICAgIGludCBwb3NpdGlvbiA9IDA7CisgICAgICAgIFNTTENhcGFiaWxpdGllcyBjYXBhYmlsaXRpZXMgPSBudWxsOworCisgICAgICAgIC8vIFJlYWQgdGhlIGhlYWRlciBvZiBUTFMgcmVjb3JkCisgICAgICAgIHdoaWxlIChwb3NpdGlvbiA8IFNTTEV4cGxvcmVyLlJFQ09SRF9IRUFERVJfU0laRSkgeworICAgICAgICAgICAgaW50IGNvdW50ID0gU1NMRXhwbG9yZXIuUkVDT1JEX0hFQURFUl9TSVpFIC0gcG9zaXRpb247CisgICAgICAgICAgICBpbnQgbiA9IGlucy5yZWFkKGJ1ZmZlciwgcG9zaXRpb24sIGNvdW50KTsKKyAgICAgICAgICAgIGlmIChuIDwgMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oInVuZXhwZWN0ZWQgZW5kIG9mIHN0cmVhbSEiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBvc2l0aW9uICs9IG47CisgICAgICAgIH0KKworICAgICAgICBpbnQgcmVjb3JkTGVuZ3RoID0gU1NMRXhwbG9yZXIuZ2V0UmVxdWlyZWRTaXplKGJ1ZmZlciwgMCwgcG9zaXRpb24pOworICAgICAgICBpZiAoYnVmZmVyLmxlbmd0aCA8IHJlY29yZExlbmd0aCkgeworICAgICAgICAgICAgYnVmZmVyID0gQXJyYXlzLmNvcHlPZihidWZmZXIsIHJlY29yZExlbmd0aCk7CisgICAgICAgIH0KKworICAgICAgICB3aGlsZSAocG9zaXRpb24gPCByZWNvcmRMZW5ndGgpIHsKKyAgICAgICAgICAgIGludCBjb3VudCA9IHJlY29yZExlbmd0aCAtIHBvc2l0aW9uOworICAgICAgICAgICAgaW50IG4gPSBpbnMucmVhZChidWZmZXIsIHBvc2l0aW9uLCBjb3VudCk7CisgICAgICAgICAgICBpZiAobiA8IDApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJ1bmV4cGVjdGVkIGVuZCBvZiBzdHJlYW0hIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwb3NpdGlvbiArPSBuOworICAgICAgICB9CisKKyAgICAgICAgY2FwYWJpbGl0aWVzID0gU1NMRXhwbG9yZXIuZXhwbG9yZShidWZmZXIsIDAsIHJlY29yZExlbmd0aCk7OworICAgICAgICBpZiAoY2FwYWJpbGl0aWVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUmVjb3JkIHZlcnNpb246ICIgKworICAgICAgICAgICAgICAgICAgICBjYXBhYmlsaXRpZXMuZ2V0UmVjb3JkVmVyc2lvbigpKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSGVsbG8gdmVyc2lvbjogIiArCisgICAgICAgICAgICAgICAgICAgIGNhcGFiaWxpdGllcy5nZXRIZWxsb1ZlcnNpb24oKSk7CisgICAgICAgIH0KKworICAgICAgICBTU0xTb2NrZXRGYWN0b3J5IHNzbHNmID0KKyAgICAgICAgICAgIChTU0xTb2NrZXRGYWN0b3J5KSBTU0xTb2NrZXRGYWN0b3J5LmdldERlZmF1bHQoKTsKKyAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFpcyA9CisgICAgICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnVmZmVyLCAwLCBwb3NpdGlvbik7CisgICAgICAgIFNTTFNvY2tldCBzc2xTb2NrZXQgPSAoU1NMU29ja2V0KXNzbHNmLmNyZWF0ZVNvY2tldChzb2NrZXQsIGJhaXMsIHRydWUpOworCisgICAgICAgIElucHV0U3RyZWFtIHNzbElTID0gc3NsU29ja2V0LmdldElucHV0U3RyZWFtKCk7CisgICAgICAgIE91dHB1dFN0cmVhbSBzc2xPUyA9IHNzbFNvY2tldC5nZXRPdXRwdXRTdHJlYW0oKTsKKworICAgICAgICBzc2xJUy5yZWFkKCk7CisgICAgICAgIHNzbE9TLndyaXRlKDg1KTsKKyAgICAgICAgc3NsT1MuZmx1c2goKTsKKworICAgICAgICBFeHRlbmRlZFNTTFNlc3Npb24gc2Vzc2lvbiA9IChFeHRlbmRlZFNTTFNlc3Npb24pc3NsU29ja2V0LmdldFNlc3Npb24oKTsKKyAgICAgICAgY2hlY2tDYXBhYmlsaXRpZXMoY2FwYWJpbGl0aWVzLCBzZXNzaW9uKTsKKworICAgICAgICBzc2xTb2NrZXQuY2xvc2UoKTsKKyAgICAgICAgc2VydmVyU29ja2V0LmNsb3NlKCk7CisgICAgfQorCisKKyAgICAvKgorICAgICAqIERlZmluZSB0aGUgY2xpZW50IHNpZGUgb2YgdGhlIHRlc3QuCisgICAgICoKKyAgICAgKiBJZiB0aGUgc2VydmVyIHByZW1hdHVyZWx5IGV4aXRzLCBzZXJ2ZXJSZWFkeSB3aWxsIGJlIHNldCB0byB0cnVlCisgICAgICogdG8gYXZvaWQgaW5maW5pdGUgaGFuZ3MuCisgICAgICovCisgICAgdm9pZCBkb0NsaWVudFNpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICAvKgorICAgICAgICAgKiBXYWl0IGZvciBzZXJ2ZXIgdG8gZ2V0IHN0YXJ0ZWQuCisgICAgICAgICAqLworICAgICAgICB3aGlsZSAoIXNlcnZlclJlYWR5KSB7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoNTApOworICAgICAgICB9CisKKyAgICAgICAgU1NMU29ja2V0RmFjdG9yeSBzc2xzZiA9CisgICAgICAgICAgICAoU1NMU29ja2V0RmFjdG9yeSkgU1NMU29ja2V0RmFjdG9yeS5nZXREZWZhdWx0KCk7CisgICAgICAgIFNTTFNvY2tldCBzc2xTb2NrZXQgPSAoU1NMU29ja2V0KQorICAgICAgICAgICAgc3Nsc2YuY3JlYXRlU29ja2V0KCJsb2NhbGhvc3QiLCBzZXJ2ZXJQb3J0KTsKKworICAgICAgICBTTklIb3N0TmFtZSBzZXJ2ZXJOYW1lID0gbmV3IFNOSUhvc3ROYW1lKGNsaWVudFJlcXVlc3RlZEhvc3RuYW1lKTsKKyAgICAgICAgTGlzdDxTTklTZXJ2ZXJOYW1lPiBzZXJ2ZXJOYW1lcyA9IG5ldyBBcnJheUxpc3Q8PigxKTsKKyAgICAgICAgc2VydmVyTmFtZXMuYWRkKHNlcnZlck5hbWUpOworICAgICAgICBTU0xQYXJhbWV0ZXJzIHBhcmFtcyA9IHNzbFNvY2tldC5nZXRTU0xQYXJhbWV0ZXJzKCk7CisgICAgICAgIHBhcmFtcy5zZXRTZXJ2ZXJOYW1lcyhzZXJ2ZXJOYW1lcyk7CisgICAgICAgIHNzbFNvY2tldC5zZXRTU0xQYXJhbWV0ZXJzKHBhcmFtcyk7CisKKyAgICAgICAgSW5wdXRTdHJlYW0gc3NsSVMgPSBzc2xTb2NrZXQuZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICAgICAgT3V0cHV0U3RyZWFtIHNzbE9TID0gc3NsU29ja2V0LmdldE91dHB1dFN0cmVhbSgpOworCisgICAgICAgIHNzbE9TLndyaXRlKDI4MCk7CisgICAgICAgIHNzbE9TLmZsdXNoKCk7CisgICAgICAgIHNzbElTLnJlYWQoKTsKKworICAgICAgICBFeHRlbmRlZFNTTFNlc3Npb24gc2Vzc2lvbiA9IChFeHRlbmRlZFNTTFNlc3Npb24pc3NsU29ja2V0LmdldFNlc3Npb24oKTsKKyAgICAgICAgY2hlY2tTTklJblNlc3Npb24oc2Vzc2lvbik7CisKKyAgICAgICAgc3NsU29ja2V0LmNsb3NlKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNsaWVudFJlcXVlc3RlZEhvc3RuYW1lID0gInd3dy5leGFtcGxlLmNvbSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHNlcnZlckFjY2VwdGFibGVIb3N0bmFtZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid3d3XFwuZXhhbXBsZVxcLihjb218b3JnKSI7CisKKyAgICB2b2lkIGNoZWNrQ2FwYWJpbGl0aWVzKFNTTENhcGFiaWxpdGllcyBjYXBhYmlsaXRpZXMsCisgICAgICAgICAgICBFeHRlbmRlZFNTTFNlc3Npb24gc2Vzc2lvbikgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgTGlzdDxTTklTZXJ2ZXJOYW1lPiBzZXNzaW9uU05JID0gc2Vzc2lvbi5nZXRSZXF1ZXN0ZWRTZXJ2ZXJOYW1lcygpOworICAgICAgICBpZiAoIXNlc3Npb25TTkkuZXF1YWxzKGNhcGFiaWxpdGllcy5nZXRTZXJ2ZXJOYW1lcygpKSkgeworICAgICAgICAgICAgZm9yIChTTklTZXJ2ZXJOYW1lIHNuaSA6IHNlc3Npb25TTkkpIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNOSSBpbiBzZXNzaW9uIGlzICIgKyBzbmkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBMaXN0PFNOSVNlcnZlck5hbWU+IGNhcGFTTkkgPSBjYXBhYmlsaXRpZXMuZ2V0U2VydmVyTmFtZXMoKTsKKyAgICAgICAgICAgIGZvciAoU05JU2VydmVyTmFtZSBzbmkgOiBjYXBhU05JKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTTkkgaW4gc2Vzc2lvbiBpcyAiICsgc25pKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgInNlcnZlciBuYW1lIGluZGljYXRpb24gZG9lcyBub3QgbWF0Y2ggY2FwYWJpbGl0aWVzIik7CisgICAgICAgIH0KKworICAgICAgICBjaGVja1NOSUluU2Vzc2lvbihzZXNzaW9uKTsKKyAgICB9CisKKyAgICB2b2lkIGNoZWNrU05JSW5TZXNzaW9uKEV4dGVuZGVkU1NMU2Vzc2lvbiBzZXNzaW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTGlzdDxTTklTZXJ2ZXJOYW1lPiBzZXNzaW9uU05JID0gc2Vzc2lvbi5nZXRSZXF1ZXN0ZWRTZXJ2ZXJOYW1lcygpOworICAgICAgICBpZiAoc2Vzc2lvblNOSS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkIGVtcHR5IHJlcXVlc3Qgc2VydmVyIG5hbWUgaW5kaWNhdGlvbiIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNlc3Npb25TTkkuc2l6ZSgpICE9IDEpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkIHJlcXVlc3Qgc2VydmVyIG5hbWUgaW5kaWNhdGlvbiIpOworICAgICAgICB9CisKKyAgICAgICAgU05JU2VydmVyTmFtZSBzZXJ2ZXJOYW1lID0gc2Vzc2lvblNOSS5nZXQoMCk7CisgICAgICAgIGlmICghKHNlcnZlck5hbWUgaW5zdGFuY2VvZiBTTklIb3N0TmFtZSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkIGluc3RhbmNlIG9mIHJlcXVlc3Qgc2VydmVyIG5hbWUgaW5kaWNhdGlvbiIpOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIGhvc3RuYW1lID0gKChTTklIb3N0TmFtZSlzZXJ2ZXJOYW1lKS5nZXRBc2NpaU5hbWUoKTsKKyAgICAgICAgaWYgKCFjbGllbnRSZXF1ZXN0ZWRIb3N0bmFtZS5lcXVhbHNJZ25vcmVDYXNlKGhvc3RuYW1lKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQgcmVxdWVzdCBzZXJ2ZXIgbmFtZSBpbmRpY2F0aW9uIHZhbHVlIik7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qCisgICAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAqIFRoZSByZW1haW5kZXIgaXMganVzdCBzdXBwb3J0IHN0dWZmCisgICAgICovCisKKyAgICAvLyB1c2UgYW55IGZyZWUgcG9ydCBieSBkZWZhdWx0CisgICAgdm9sYXRpbGUgaW50IHNlcnZlclBvcnQgPSAwOworCisgICAgdm9sYXRpbGUgRXhjZXB0aW9uIHNlcnZlckV4Y2VwdGlvbiA9IG51bGw7CisgICAgdm9sYXRpbGUgRXhjZXB0aW9uIGNsaWVudEV4Y2VwdGlvbiA9IG51bGw7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGtleUZpbGVuYW1lID0KKyAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgidGVzdC5zcmMiLCAiLiIpICsgIi8iICsgcGF0aFRvU3RvcmVzICsKKyAgICAgICAgICAgICAgICAiLyIgKyBrZXlTdG9yZUZpbGU7CisgICAgICAgIFN0cmluZyB0cnVzdEZpbGVuYW1lID0KKyAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgidGVzdC5zcmMiLCAiLiIpICsgIi8iICsgcGF0aFRvU3RvcmVzICsKKyAgICAgICAgICAgICAgICAiLyIgKyB0cnVzdFN0b3JlRmlsZTsKKworICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImphdmF4Lm5ldC5zc2wua2V5U3RvcmUiLCBrZXlGaWxlbmFtZSk7CisgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiamF2YXgubmV0LnNzbC5rZXlTdG9yZVBhc3N3b3JkIiwgcGFzc3dkKTsKKyAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJqYXZheC5uZXQuc3NsLnRydXN0U3RvcmUiLCB0cnVzdEZpbGVuYW1lKTsKKyAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJqYXZheC5uZXQuc3NsLnRydXN0U3RvcmVQYXNzd29yZCIsIHBhc3N3ZCk7CisKKyAgICAgICAgaWYgKGRlYnVnKQorICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJqYXZheC5uZXQuZGVidWciLCAiYWxsIik7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogU3RhcnQgdGhlIHRlc3RzLgorICAgICAgICAgKi8KKyAgICAgICAgbmV3IFNTTFNvY2tldEV4cGxvcmVyV2l0aENsaVNOSSgpOworICAgIH0KKworICAgIFRocmVhZCBjbGllbnRUaHJlYWQgPSBudWxsOworICAgIFRocmVhZCBzZXJ2ZXJUaHJlYWQgPSBudWxsOworCisgICAgLyoKKyAgICAgKiBQcmltYXJ5IGNvbnN0cnVjdG9yLCB1c2VkIHRvIGRyaXZlIHJlbWFpbmRlciBvZiB0aGUgdGVzdC4KKyAgICAgKgorICAgICAqIEZvcmsgb2ZmIHRoZSBvdGhlciBzaWRlLCB0aGVuIGRvIHlvdXIgd29yay4KKyAgICAgKi8KKyAgICBTU0xTb2NrZXRFeHBsb3JlcldpdGhDbGlTTkkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChzZXBhcmF0ZVNlcnZlclRocmVhZCkgeworICAgICAgICAgICAgICAgIHN0YXJ0U2VydmVyKHRydWUpOworICAgICAgICAgICAgICAgIHN0YXJ0Q2xpZW50KGZhbHNlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3RhcnRDbGllbnQodHJ1ZSk7CisgICAgICAgICAgICAgICAgc3RhcnRTZXJ2ZXIoZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gc3dhbGxvdyBmb3Igbm93LiAgU2hvdyBsYXRlcgorICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogV2FpdCBmb3Igb3RoZXIgc2lkZSB0byBjbG9zZSBkb3duLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHNlcGFyYXRlU2VydmVyVGhyZWFkKSB7CisgICAgICAgICAgICBzZXJ2ZXJUaHJlYWQuam9pbigpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2xpZW50VGhyZWFkLmpvaW4oKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIFdoZW4gd2UgZ2V0IGhlcmUsIHRoZSB0ZXN0IGlzIHByZXR0eSBtdWNoIG92ZXIuCisgICAgICAgICAqIFdoaWNoIHNpZGUgdGhyZXcgdGhlIGVycm9yPworICAgICAgICAgKi8KKyAgICAgICAgRXhjZXB0aW9uIGxvY2FsOworICAgICAgICBFeGNlcHRpb24gcmVtb3RlOworICAgICAgICBTdHJpbmcgd2hpY2hSZW1vdGU7CisKKyAgICAgICAgaWYgKHNlcGFyYXRlU2VydmVyVGhyZWFkKSB7CisgICAgICAgICAgICByZW1vdGUgPSBzZXJ2ZXJFeGNlcHRpb247CisgICAgICAgICAgICBsb2NhbCA9IGNsaWVudEV4Y2VwdGlvbjsKKyAgICAgICAgICAgIHdoaWNoUmVtb3RlID0gInNlcnZlciI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZW1vdGUgPSBjbGllbnRFeGNlcHRpb247CisgICAgICAgICAgICBsb2NhbCA9IHNlcnZlckV4Y2VwdGlvbjsKKyAgICAgICAgICAgIHdoaWNoUmVtb3RlID0gImNsaWVudCI7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBJZiBib3RoIGZhaWxlZCwgcmV0dXJuIHRoZSBjdXJ0aHJlYWQncyBleGNlcHRpb24sIGJ1dCBhbHNvCisgICAgICAgICAqIHByaW50IHRoZSByZW1vdGUgc2lkZSBFeGNlcHRpb24KKyAgICAgICAgICovCisgICAgICAgIGlmICgobG9jYWwgIT0gbnVsbCkgJiYgKHJlbW90ZSAhPSBudWxsKSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHdoaWNoUmVtb3RlICsgIiBhbHNvIHRocmV3OiIpOworICAgICAgICAgICAgcmVtb3RlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7CisgICAgICAgICAgICB0aHJvdyBsb2NhbDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZW1vdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgcmVtb3RlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGxvY2FsICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IGxvY2FsOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBzdGFydFNlcnZlcihib29sZWFuIG5ld1RocmVhZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChuZXdUaHJlYWQpIHsKKyAgICAgICAgICAgIHNlcnZlclRocmVhZCA9IG5ldyBUaHJlYWQoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgZG9TZXJ2ZXJTaWRlKCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgICAgICogT3VyIHNlcnZlciB0aHJlYWQganVzdCBkaWVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIFJlbGVhc2UgdGhlIGNsaWVudCwgaWYgbm90IGFjdGl2ZSBhbHJlYWR5Li4uCisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiU2VydmVyIGRpZWQuLi4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlclJlYWR5ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlckV4Y2VwdGlvbiA9IGU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgc2VydmVyVGhyZWFkLnN0YXJ0KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGRvU2VydmVyU2lkZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBzZXJ2ZXJFeGNlcHRpb24gPSBlOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBzZXJ2ZXJSZWFkeSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHN0YXJ0Q2xpZW50KGJvb2xlYW4gbmV3VGhyZWFkKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG5ld1RocmVhZCkgeworICAgICAgICAgICAgY2xpZW50VGhyZWFkID0gbmV3IFRocmVhZCgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkb0NsaWVudFNpZGUoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBPdXIgY2xpZW50IHRocmVhZCBqdXN0IGRpZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiQ2xpZW50IGRpZWQuLi4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudEV4Y2VwdGlvbiA9IGU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgY2xpZW50VGhyZWFkLnN0YXJ0KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGRvQ2xpZW50U2lkZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBjbGllbnRFeGNlcHRpb24gPSBlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L3NzbC9qYXZheC9uZXQvc3NsL1NlcnZlck5hbWUvU1NMU29ja2V0RXhwbG9yZXJXaXRoU3J2U05JLmphdmEgYi9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvc3NsL2phdmF4L25ldC9zc2wvU2VydmVyTmFtZS9TU0xTb2NrZXRFeHBsb3JlcldpdGhTcnZTTkkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGIxYWU5YQotLS0gL2Rldi9udWxsCisrKyBiL2pkay90ZXN0L3N1bi9zZWN1cml0eS9zc2wvamF2YXgvbmV0L3NzbC9TZXJ2ZXJOYW1lL1NTTFNvY2tldEV4cGxvcmVyV2l0aFNydlNOSS5qYXZhCkBAIC0wLDAgKzEsMzkwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCisgKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CisgKiBxdWVzdGlvbnMuCisgKi8KKworLy8KKy8vIFN1bkpTU0UgZG9lcyBub3Qgc3VwcG9ydCBkeW5hbWljIHN5c3RlbSBwcm9wZXJ0aWVzLCBubyB3YXkgdG8gcmUtdXNlCisvLyBzeXN0ZW0gcHJvcGVydGllcyBpbiBzYW1ldm0vYWdlbnR2bSBtb2RlLgorLy8KKworLyoqCisgKiBAdGVzdAorICogQGJ1ZyA3MDY4MzIxCisgKiBAc3VtbWFyeSBTdXBwb3J0IFRMUyBTZXJ2ZXIgTmFtZSBJbmRpY2F0aW9uIChTTkkpIEV4dGVuc2lvbiBpbiBKU1NFIFNlcnZlcgorICogQGxpYnJhcnkgLi4vLi4vLi4vLi4vdGVtcGxhdGVzCisgKiBAYnVpbGQgU1NMQ2FwYWJpbGl0aWVzIFNTTEV4cGxvcmVyCisgKiBAcnVuIG1haW4vb3RoZXJ2bSBTU0xTb2NrZXRFeHBsb3JlcldpdGhTcnZTTkkKKyAqLworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEubmlvLio7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuKjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLm5ldC4qOworaW1wb3J0IGphdmF4Lm5ldC5zc2wuKjsKKworcHVibGljIGNsYXNzIFNTTFNvY2tldEV4cGxvcmVyV2l0aFNydlNOSSB7CisKKyAgICAvKgorICAgICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgKiBTZXQgdGhlIHZhcmlvdXMgdmFyaWFibGVzIG5lZWRlZCBmb3IgdGhlIHRlc3RzLCB0aGVuCisgICAgICogc3BlY2lmeSB3aGF0IHRlc3RzIHRvIHJ1biBvbiBlYWNoIHNpZGUuCisgICAgICovCisKKyAgICAvKgorICAgICAqIFNob3VsZCB3ZSBydW4gdGhlIGNsaWVudCBvciBzZXJ2ZXIgaW4gYSBzZXBhcmF0ZSB0aHJlYWQ/CisgICAgICogQm90aCBzaWRlcyBjYW4gdGhyb3cgZXhjZXB0aW9ucywgYnV0IGRvIHlvdSBoYXZlIGEgcHJlZmVyZW5jZQorICAgICAqIGFzIHRvIHdoaWNoIHNpZGUgc2hvdWxkIGJlIHRoZSBtYWluIHRocmVhZC4KKyAgICAgKi8KKyAgICBzdGF0aWMgYm9vbGVhbiBzZXBhcmF0ZVNlcnZlclRocmVhZCA9IHRydWU7CisKKyAgICAvKgorICAgICAqIFdoZXJlIGRvIHdlIGZpbmQgdGhlIGtleXN0b3Jlcz8KKyAgICAgKi8KKyAgICBzdGF0aWMgU3RyaW5nIHBhdGhUb1N0b3JlcyA9ICIuLi8uLi8uLi8uLi9ldGMiOworICAgIHN0YXRpYyBTdHJpbmcga2V5U3RvcmVGaWxlID0gImtleXN0b3JlIjsKKyAgICBzdGF0aWMgU3RyaW5nIHRydXN0U3RvcmVGaWxlID0gInRydXN0c3RvcmUiOworICAgIHN0YXRpYyBTdHJpbmcgcGFzc3dkID0gInBhc3NwaHJhc2UiOworCisgICAgLyoKKyAgICAgKiBJcyB0aGUgc2VydmVyIHJlYWR5IHRvIHNlcnZlPworICAgICAqLworICAgIHZvbGF0aWxlIHN0YXRpYyBib29sZWFuIHNlcnZlclJlYWR5ID0gZmFsc2U7CisKKyAgICAvKgorICAgICAqIFR1cm4gb24gU1NMIGRlYnVnZ2luZz8KKyAgICAgKi8KKyAgICBzdGF0aWMgYm9vbGVhbiBkZWJ1ZyA9IGZhbHNlOworCisgICAgLyoKKyAgICAgKiBJZiB0aGUgY2xpZW50IG9yIHNlcnZlciBpcyBkb2luZyBzb21lIGtpbmQgb2Ygb2JqZWN0IGNyZWF0aW9uCisgICAgICogdGhhdCB0aGUgb3RoZXIgc2lkZSBkZXBlbmRzIG9uLCBhbmQgdGhhdCB0aHJlYWQgcHJlbWF0dXJlbHkKKyAgICAgKiBleGl0cywgeW91IG1heSBleHBlcmllbmNlIGEgaGFuZy4gIFRoZSB0ZXN0IGhhcm5lc3Mgd2lsbAorICAgICAqIHRlcm1pbmF0ZSBhbGwgaHVuZyB0aHJlYWRzIGFmdGVyIGl0cyB0aW1lb3V0IGhhcyBleHBpcmVkLAorICAgICAqIGN1cnJlbnRseSAzIG1pbnV0ZXMgYnkgZGVmYXVsdCwgYnV0IHlvdSBtaWdodCB0cnkgdG8gYmUKKyAgICAgKiBzbWFydCBhYm91dCBpdC4uLi4KKyAgICAgKi8KKworICAgIC8qCisgICAgICogRGVmaW5lIHRoZSBzZXJ2ZXIgc2lkZSBvZiB0aGUgdGVzdC4KKyAgICAgKgorICAgICAqIElmIHRoZSBzZXJ2ZXIgcHJlbWF0dXJlbHkgZXhpdHMsIHNlcnZlclJlYWR5IHdpbGwgYmUgc2V0IHRvIHRydWUKKyAgICAgKiB0byBhdm9pZCBpbmZpbml0ZSBoYW5ncy4KKyAgICAgKi8KKyAgICB2b2lkIGRvU2VydmVyU2lkZSgpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIFNlcnZlclNvY2tldCBzZXJ2ZXJTb2NrZXQgPSBuZXcgU2VydmVyU29ja2V0KHNlcnZlclBvcnQpOworCisgICAgICAgIC8vIFNpZ25hbCBDbGllbnQsIHdlJ3JlIHJlYWR5IGZvciBoaXMgY29ubmVjdC4KKyAgICAgICAgc2VydmVyUG9ydCA9IHNlcnZlclNvY2tldC5nZXRMb2NhbFBvcnQoKTsKKyAgICAgICAgc2VydmVyUmVhZHkgPSB0cnVlOworCisgICAgICAgIFNvY2tldCBzb2NrZXQgPSBzZXJ2ZXJTb2NrZXQuYWNjZXB0KCk7CisgICAgICAgIElucHV0U3RyZWFtIGlucyA9IHNvY2tldC5nZXRJbnB1dFN0cmVhbSgpOworCisgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVsweEZGXTsKKyAgICAgICAgaW50IHBvc2l0aW9uID0gMDsKKyAgICAgICAgU1NMQ2FwYWJpbGl0aWVzIGNhcGFiaWxpdGllcyA9IG51bGw7CisKKyAgICAgICAgLy8gUmVhZCB0aGUgaGVhZGVyIG9mIFRMUyByZWNvcmQKKyAgICAgICAgd2hpbGUgKHBvc2l0aW9uIDwgU1NMRXhwbG9yZXIuUkVDT1JEX0hFQURFUl9TSVpFKSB7CisgICAgICAgICAgICBpbnQgY291bnQgPSBTU0xFeHBsb3Jlci5SRUNPUkRfSEVBREVSX1NJWkUgLSBwb3NpdGlvbjsKKyAgICAgICAgICAgIGludCBuID0gaW5zLnJlYWQoYnVmZmVyLCBwb3NpdGlvbiwgY291bnQpOworICAgICAgICAgICAgaWYgKG4gPCAwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigidW5leHBlY3RlZCBlbmQgb2Ygc3RyZWFtISIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcG9zaXRpb24gKz0gbjsKKyAgICAgICAgfQorCisgICAgICAgIGludCByZWNvcmRMZW5ndGggPSBTU0xFeHBsb3Jlci5nZXRSZXF1aXJlZFNpemUoYnVmZmVyLCAwLCBwb3NpdGlvbik7CisgICAgICAgIGlmIChidWZmZXIubGVuZ3RoIDwgcmVjb3JkTGVuZ3RoKSB7CisgICAgICAgICAgICBidWZmZXIgPSBBcnJheXMuY29weU9mKGJ1ZmZlciwgcmVjb3JkTGVuZ3RoKTsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlIChwb3NpdGlvbiA8IHJlY29yZExlbmd0aCkgeworICAgICAgICAgICAgaW50IGNvdW50ID0gcmVjb3JkTGVuZ3RoIC0gcG9zaXRpb247CisgICAgICAgICAgICBpbnQgbiA9IGlucy5yZWFkKGJ1ZmZlciwgcG9zaXRpb24sIGNvdW50KTsKKyAgICAgICAgICAgIGlmIChuIDwgMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oInVuZXhwZWN0ZWQgZW5kIG9mIHN0cmVhbSEiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBvc2l0aW9uICs9IG47CisgICAgICAgIH0KKworICAgICAgICBjYXBhYmlsaXRpZXMgPSBTU0xFeHBsb3Jlci5leHBsb3JlKGJ1ZmZlciwgMCwgcmVjb3JkTGVuZ3RoKTs7CisgICAgICAgIGlmIChjYXBhYmlsaXRpZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSZWNvcmQgdmVyc2lvbjogIiArCisgICAgICAgICAgICAgICAgICAgIGNhcGFiaWxpdGllcy5nZXRSZWNvcmRWZXJzaW9uKCkpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJIZWxsbyB2ZXJzaW9uOiAiICsKKyAgICAgICAgICAgICAgICAgICAgY2FwYWJpbGl0aWVzLmdldEhlbGxvVmVyc2lvbigpKTsKKyAgICAgICAgfQorCisgICAgICAgIFNTTFNvY2tldEZhY3Rvcnkgc3Nsc2YgPQorICAgICAgICAgICAgKFNTTFNvY2tldEZhY3RvcnkpIFNTTFNvY2tldEZhY3RvcnkuZ2V0RGVmYXVsdCgpOworICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYWlzID0KKyAgICAgICAgICAgIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShidWZmZXIsIDAsIHBvc2l0aW9uKTsKKyAgICAgICAgU1NMU29ja2V0IHNzbFNvY2tldCA9IChTU0xTb2NrZXQpc3Nsc2YuY3JlYXRlU29ja2V0KHNvY2tldCwgYmFpcywgdHJ1ZSk7CisKKyAgICAgICAgU05JTWF0Y2hlciBtYXRjaGVyID0gU05JSG9zdE5hbWUuY3JlYXRlU05JTWF0Y2hlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlckFjY2VwdGFibGVIb3N0bmFtZSk7CisgICAgICAgIENvbGxlY3Rpb248U05JTWF0Y2hlcj4gbWF0Y2hlcnMgPSBuZXcgQXJyYXlMaXN0PD4oMSk7CisgICAgICAgIG1hdGNoZXJzLmFkZChtYXRjaGVyKTsKKyAgICAgICAgU1NMUGFyYW1ldGVycyBwYXJhbXMgPSBzc2xTb2NrZXQuZ2V0U1NMUGFyYW1ldGVycygpOworICAgICAgICBwYXJhbXMuc2V0U05JTWF0Y2hlcnMobWF0Y2hlcnMpOworICAgICAgICBzc2xTb2NrZXQuc2V0U1NMUGFyYW1ldGVycyhwYXJhbXMpOworCisgICAgICAgIElucHV0U3RyZWFtIHNzbElTID0gc3NsU29ja2V0LmdldElucHV0U3RyZWFtKCk7CisgICAgICAgIE91dHB1dFN0cmVhbSBzc2xPUyA9IHNzbFNvY2tldC5nZXRPdXRwdXRTdHJlYW0oKTsKKworICAgICAgICBzc2xJUy5yZWFkKCk7CisgICAgICAgIHNzbE9TLndyaXRlKDg1KTsKKyAgICAgICAgc3NsT1MuZmx1c2goKTsKKworICAgICAgICBFeHRlbmRlZFNTTFNlc3Npb24gc2Vzc2lvbiA9IChFeHRlbmRlZFNTTFNlc3Npb24pc3NsU29ja2V0LmdldFNlc3Npb24oKTsKKyAgICAgICAgY2hlY2tDYXBhYmlsaXRpZXMoY2FwYWJpbGl0aWVzLCBzZXNzaW9uKTsKKworICAgICAgICBzc2xTb2NrZXQuY2xvc2UoKTsKKyAgICAgICAgc2VydmVyU29ja2V0LmNsb3NlKCk7CisgICAgfQorCisKKyAgICAvKgorICAgICAqIERlZmluZSB0aGUgY2xpZW50IHNpZGUgb2YgdGhlIHRlc3QuCisgICAgICoKKyAgICAgKiBJZiB0aGUgc2VydmVyIHByZW1hdHVyZWx5IGV4aXRzLCBzZXJ2ZXJSZWFkeSB3aWxsIGJlIHNldCB0byB0cnVlCisgICAgICogdG8gYXZvaWQgaW5maW5pdGUgaGFuZ3MuCisgICAgICovCisgICAgdm9pZCBkb0NsaWVudFNpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICAvKgorICAgICAgICAgKiBXYWl0IGZvciBzZXJ2ZXIgdG8gZ2V0IHN0YXJ0ZWQuCisgICAgICAgICAqLworICAgICAgICB3aGlsZSAoIXNlcnZlclJlYWR5KSB7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoNTApOworICAgICAgICB9CisKKyAgICAgICAgU1NMU29ja2V0RmFjdG9yeSBzc2xzZiA9CisgICAgICAgICAgICAoU1NMU29ja2V0RmFjdG9yeSkgU1NMU29ja2V0RmFjdG9yeS5nZXREZWZhdWx0KCk7CisgICAgICAgIFNTTFNvY2tldCBzc2xTb2NrZXQgPSAoU1NMU29ja2V0KQorICAgICAgICAgICAgc3Nsc2YuY3JlYXRlU29ja2V0KCJsb2NhbGhvc3QiLCBzZXJ2ZXJQb3J0KTsKKworICAgICAgICBJbnB1dFN0cmVhbSBzc2xJUyA9IHNzbFNvY2tldC5nZXRJbnB1dFN0cmVhbSgpOworICAgICAgICBPdXRwdXRTdHJlYW0gc3NsT1MgPSBzc2xTb2NrZXQuZ2V0T3V0cHV0U3RyZWFtKCk7CisKKyAgICAgICAgc3NsT1Mud3JpdGUoMjgwKTsKKyAgICAgICAgc3NsT1MuZmx1c2goKTsKKyAgICAgICAgc3NsSVMucmVhZCgpOworCisgICAgICAgIEV4dGVuZGVkU1NMU2Vzc2lvbiBzZXNzaW9uID0gKEV4dGVuZGVkU1NMU2Vzc2lvbilzc2xTb2NrZXQuZ2V0U2Vzc2lvbigpOworICAgICAgICBjaGVja1NOSUluU2Vzc2lvbihzZXNzaW9uKTsKKworICAgICAgICBzc2xTb2NrZXQuY2xvc2UoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgY2xpZW50UmVxdWVzdGVkSG9zdG5hbWUgPSAid3d3LmV4YW1wbGUuY29tIjsKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgc2VydmVyQWNjZXB0YWJsZUhvc3RuYW1lID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3d3dcXC5leGFtcGxlXFwuKGNvbXxvcmcpIjsKKworICAgIHZvaWQgY2hlY2tDYXBhYmlsaXRpZXMoU1NMQ2FwYWJpbGl0aWVzIGNhcGFiaWxpdGllcywKKyAgICAgICAgICAgIEV4dGVuZGVkU1NMU2Vzc2lvbiBzZXNzaW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBMaXN0PFNOSVNlcnZlck5hbWU+IHNlc3Npb25TTkkgPSBzZXNzaW9uLmdldFJlcXVlc3RlZFNlcnZlck5hbWVzKCk7CisgICAgICAgIGlmICghc2Vzc2lvblNOSS5lcXVhbHMoY2FwYWJpbGl0aWVzLmdldFNlcnZlck5hbWVzKCkpKSB7CisgICAgICAgICAgICBmb3IgKFNOSVNlcnZlck5hbWUgc25pIDogc2Vzc2lvblNOSSkgeworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU05JIGluIHNlc3Npb24gaXMgIiArIHNuaSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIExpc3Q8U05JU2VydmVyTmFtZT4gY2FwYVNOSSA9IGNhcGFiaWxpdGllcy5nZXRTZXJ2ZXJOYW1lcygpOworICAgICAgICAgICAgZm9yIChTTklTZXJ2ZXJOYW1lIHNuaSA6IGNhcGFTTkkpIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNOSSBpbiBzZXNzaW9uIGlzICIgKyBzbmkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAic2VydmVyIG5hbWUgaW5kaWNhdGlvbiBkb2VzIG5vdCBtYXRjaCBjYXBhYmlsaXRpZXMiKTsKKyAgICAgICAgfQorCisgICAgICAgIGNoZWNrU05JSW5TZXNzaW9uKHNlc3Npb24pOworICAgIH0KKworICAgIHZvaWQgY2hlY2tTTklJblNlc3Npb24oRXh0ZW5kZWRTU0xTZXNzaW9uIHNlc3Npb24pIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBMaXN0PFNOSVNlcnZlck5hbWU+IHNlc3Npb25TTkkgPSBzZXNzaW9uLmdldFJlcXVlc3RlZFNlcnZlck5hbWVzKCk7CisgICAgICAgIGlmICghc2Vzc2lvblNOSS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJzaG91bGQgYmUgZW1wdHkgcmVxdWVzdCBzZXJ2ZXIgbmFtZSBpbmRpY2F0aW9uIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgKiBUaGUgcmVtYWluZGVyIGlzIGp1c3Qgc3VwcG9ydCBzdHVmZgorICAgICAqLworCisgICAgLy8gdXNlIGFueSBmcmVlIHBvcnQgYnkgZGVmYXVsdAorICAgIHZvbGF0aWxlIGludCBzZXJ2ZXJQb3J0ID0gMDsKKworICAgIHZvbGF0aWxlIEV4Y2VwdGlvbiBzZXJ2ZXJFeGNlcHRpb24gPSBudWxsOworICAgIHZvbGF0aWxlIEV4Y2VwdGlvbiBjbGllbnRFeGNlcHRpb24gPSBudWxsOworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBrZXlGaWxlbmFtZSA9CisgICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoInRlc3Quc3JjIiwgIi4iKSArICIvIiArIHBhdGhUb1N0b3JlcyArCisgICAgICAgICAgICAgICAgIi8iICsga2V5U3RvcmVGaWxlOworICAgICAgICBTdHJpbmcgdHJ1c3RGaWxlbmFtZSA9CisgICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoInRlc3Quc3JjIiwgIi4iKSArICIvIiArIHBhdGhUb1N0b3JlcyArCisgICAgICAgICAgICAgICAgIi8iICsgdHJ1c3RTdG9yZUZpbGU7CisKKyAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJqYXZheC5uZXQuc3NsLmtleVN0b3JlIiwga2V5RmlsZW5hbWUpOworICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImphdmF4Lm5ldC5zc2wua2V5U3RvcmVQYXNzd29yZCIsIHBhc3N3ZCk7CisgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiamF2YXgubmV0LnNzbC50cnVzdFN0b3JlIiwgdHJ1c3RGaWxlbmFtZSk7CisgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiamF2YXgubmV0LnNzbC50cnVzdFN0b3JlUGFzc3dvcmQiLCBwYXNzd2QpOworCisgICAgICAgIGlmIChkZWJ1ZykKKyAgICAgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiamF2YXgubmV0LmRlYnVnIiwgImFsbCIpOworCisgICAgICAgIC8qCisgICAgICAgICAqIFN0YXJ0IHRoZSB0ZXN0cy4KKyAgICAgICAgICovCisgICAgICAgIG5ldyBTU0xTb2NrZXRFeHBsb3JlcldpdGhTcnZTTkkoKTsKKyAgICB9CisKKyAgICBUaHJlYWQgY2xpZW50VGhyZWFkID0gbnVsbDsKKyAgICBUaHJlYWQgc2VydmVyVGhyZWFkID0gbnVsbDsKKworICAgIC8qCisgICAgICogUHJpbWFyeSBjb25zdHJ1Y3RvciwgdXNlZCB0byBkcml2ZSByZW1haW5kZXIgb2YgdGhlIHRlc3QuCisgICAgICoKKyAgICAgKiBGb3JrIG9mZiB0aGUgb3RoZXIgc2lkZSwgdGhlbiBkbyB5b3VyIHdvcmsuCisgICAgICovCisgICAgU1NMU29ja2V0RXhwbG9yZXJXaXRoU3J2U05JKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoc2VwYXJhdGVTZXJ2ZXJUaHJlYWQpIHsKKyAgICAgICAgICAgICAgICBzdGFydFNlcnZlcih0cnVlKTsKKyAgICAgICAgICAgICAgICBzdGFydENsaWVudChmYWxzZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN0YXJ0Q2xpZW50KHRydWUpOworICAgICAgICAgICAgICAgIHN0YXJ0U2VydmVyKGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIHN3YWxsb3cgZm9yIG5vdy4gIFNob3cgbGF0ZXIKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIFdhaXQgZm9yIG90aGVyIHNpZGUgdG8gY2xvc2UgZG93bi4KKyAgICAgICAgICovCisgICAgICAgIGlmIChzZXBhcmF0ZVNlcnZlclRocmVhZCkgeworICAgICAgICAgICAgc2VydmVyVGhyZWFkLmpvaW4oKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNsaWVudFRocmVhZC5qb2luKCk7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBXaGVuIHdlIGdldCBoZXJlLCB0aGUgdGVzdCBpcyBwcmV0dHkgbXVjaCBvdmVyLgorICAgICAgICAgKiBXaGljaCBzaWRlIHRocmV3IHRoZSBlcnJvcj8KKyAgICAgICAgICovCisgICAgICAgIEV4Y2VwdGlvbiBsb2NhbDsKKyAgICAgICAgRXhjZXB0aW9uIHJlbW90ZTsKKyAgICAgICAgU3RyaW5nIHdoaWNoUmVtb3RlOworCisgICAgICAgIGlmIChzZXBhcmF0ZVNlcnZlclRocmVhZCkgeworICAgICAgICAgICAgcmVtb3RlID0gc2VydmVyRXhjZXB0aW9uOworICAgICAgICAgICAgbG9jYWwgPSBjbGllbnRFeGNlcHRpb247CisgICAgICAgICAgICB3aGljaFJlbW90ZSA9ICJzZXJ2ZXIiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVtb3RlID0gY2xpZW50RXhjZXB0aW9uOworICAgICAgICAgICAgbG9jYWwgPSBzZXJ2ZXJFeGNlcHRpb247CisgICAgICAgICAgICB3aGljaFJlbW90ZSA9ICJjbGllbnQiOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogSWYgYm90aCBmYWlsZWQsIHJldHVybiB0aGUgY3VydGhyZWFkJ3MgZXhjZXB0aW9uLCBidXQgYWxzbworICAgICAgICAgKiBwcmludCB0aGUgcmVtb3RlIHNpZGUgRXhjZXB0aW9uCisgICAgICAgICAqLworICAgICAgICBpZiAoKGxvY2FsICE9IG51bGwpICYmIChyZW1vdGUgIT0gbnVsbCkpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih3aGljaFJlbW90ZSArICIgYWxzbyB0aHJldzoiKTsKKyAgICAgICAgICAgIHJlbW90ZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOworICAgICAgICAgICAgdGhyb3cgbG9jYWw7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVtb3RlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IHJlbW90ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChsb2NhbCAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBsb2NhbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgc3RhcnRTZXJ2ZXIoYm9vbGVhbiBuZXdUaHJlYWQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAobmV3VGhyZWFkKSB7CisgICAgICAgICAgICBzZXJ2ZXJUaHJlYWQgPSBuZXcgVGhyZWFkKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvU2VydmVyU2lkZSgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIE91ciBzZXJ2ZXIgdGhyZWFkIGp1c3QgZGllZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBSZWxlYXNlIHRoZSBjbGllbnQsIGlmIG5vdCBhY3RpdmUgYWxyZWFkeS4uLgorICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlNlcnZlciBkaWVkLi4uIik7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJSZWFkeSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJFeGNlcHRpb24gPSBlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHNlcnZlclRocmVhZC5zdGFydCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBkb1NlcnZlclNpZGUoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgc2VydmVyRXhjZXB0aW9uID0gZTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgc2VydmVyUmVhZHkgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBzdGFydENsaWVudChib29sZWFuIG5ld1RocmVhZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChuZXdUaHJlYWQpIHsKKyAgICAgICAgICAgIGNsaWVudFRocmVhZCA9IG5ldyBUaHJlYWQoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgZG9DbGllbnRTaWRlKCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgICAgICogT3VyIGNsaWVudCB0aHJlYWQganVzdCBkaWVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkNsaWVudCBkaWVkLi4uIik7CisgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRFeGNlcHRpb24gPSBlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGNsaWVudFRocmVhZC5zdGFydCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBkb0NsaWVudFNpZGUoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgY2xpZW50RXhjZXB0aW9uID0gZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2pkay90ZXN0L3N1bi9zZWN1cml0eS9zc2wvamF2YXgvbmV0L3NzbC9TZXJ2ZXJOYW1lL1NTTFNvY2tldEluY29uc2lzdGVudFNOSS5qYXZhIGIvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L3NzbC9qYXZheC9uZXQvc3NsL1NlcnZlck5hbWUvU1NMU29ja2V0SW5jb25zaXN0ZW50U05JLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJhMWRmZAotLS0gL2Rldi9udWxsCisrKyBiL2pkay90ZXN0L3N1bi9zZWN1cml0eS9zc2wvamF2YXgvbmV0L3NzbC9TZXJ2ZXJOYW1lL1NTTFNvY2tldEluY29uc2lzdGVudFNOSS5qYXZhCkBAIC0wLDAgKzEsMzQwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCisgKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CisgKiBxdWVzdGlvbnMuCisgKi8KKworLy8KKy8vIFN1bkpTU0UgZG9lcyBub3Qgc3VwcG9ydCBkeW5hbWljIHN5c3RlbSBwcm9wZXJ0aWVzLCBubyB3YXkgdG8gcmUtdXNlCisvLyBzeXN0ZW0gcHJvcGVydGllcyBpbiBzYW1ldm0vYWdlbnR2bSBtb2RlLgorLy8KKworLyoqCisgKiBAdGVzdAorICogQGJ1ZyA3MDY4MzIxCisgKiBAc3VtbWFyeSBTdXBwb3J0IFRMUyBTZXJ2ZXIgTmFtZSBJbmRpY2F0aW9uIChTTkkpIEV4dGVuc2lvbiBpbiBKU1NFIFNlcnZlcgorICogQHJ1biBtYWluL290aGVydm0gU1NMU29ja2V0SW5jb25zaXN0ZW50U05JCisgKi8KKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLm5pby4qOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLio7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS5uZXQuKjsKK2ltcG9ydCBqYXZheC5uZXQuc3NsLio7CisKK3B1YmxpYyBjbGFzcyBTU0xTb2NrZXRJbmNvbnNpc3RlbnRTTkkgeworCisgICAgLyoKKyAgICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICogU2V0IHRoZSB2YXJpb3VzIHZhcmlhYmxlcyBuZWVkZWQgZm9yIHRoZSB0ZXN0cywgdGhlbgorICAgICAqIHNwZWNpZnkgd2hhdCB0ZXN0cyB0byBydW4gb24gZWFjaCBzaWRlLgorICAgICAqLworCisgICAgLyoKKyAgICAgKiBTaG91bGQgd2UgcnVuIHRoZSBjbGllbnQgb3Igc2VydmVyIGluIGEgc2VwYXJhdGUgdGhyZWFkPworICAgICAqIEJvdGggc2lkZXMgY2FuIHRocm93IGV4Y2VwdGlvbnMsIGJ1dCBkbyB5b3UgaGF2ZSBhIHByZWZlcmVuY2UKKyAgICAgKiBhcyB0byB3aGljaCBzaWRlIHNob3VsZCBiZSB0aGUgbWFpbiB0aHJlYWQuCisgICAgICovCisgICAgc3RhdGljIGJvb2xlYW4gc2VwYXJhdGVTZXJ2ZXJUaHJlYWQgPSB0cnVlOworCisgICAgLyoKKyAgICAgKiBXaGVyZSBkbyB3ZSBmaW5kIHRoZSBrZXlzdG9yZXM/CisgICAgICovCisgICAgc3RhdGljIFN0cmluZyBwYXRoVG9TdG9yZXMgPSAiLi4vLi4vLi4vLi4vZXRjIjsKKyAgICBzdGF0aWMgU3RyaW5nIGtleVN0b3JlRmlsZSA9ICJrZXlzdG9yZSI7CisgICAgc3RhdGljIFN0cmluZyB0cnVzdFN0b3JlRmlsZSA9ICJ0cnVzdHN0b3JlIjsKKyAgICBzdGF0aWMgU3RyaW5nIHBhc3N3ZCA9ICJwYXNzcGhyYXNlIjsKKworICAgIC8qCisgICAgICogSXMgdGhlIHNlcnZlciByZWFkeSB0byBzZXJ2ZT8KKyAgICAgKi8KKyAgICB2b2xhdGlsZSBzdGF0aWMgYm9vbGVhbiBzZXJ2ZXJSZWFkeSA9IGZhbHNlOworCisgICAgLyoKKyAgICAgKiBUdXJuIG9uIFNTTCBkZWJ1Z2dpbmc/CisgICAgICovCisgICAgc3RhdGljIGJvb2xlYW4gZGVidWcgPSBmYWxzZTsKKworICAgIC8qCisgICAgICogSWYgdGhlIGNsaWVudCBvciBzZXJ2ZXIgaXMgZG9pbmcgc29tZSBraW5kIG9mIG9iamVjdCBjcmVhdGlvbgorICAgICAqIHRoYXQgdGhlIG90aGVyIHNpZGUgZGVwZW5kcyBvbiwgYW5kIHRoYXQgdGhyZWFkIHByZW1hdHVyZWx5CisgICAgICogZXhpdHMsIHlvdSBtYXkgZXhwZXJpZW5jZSBhIGhhbmcuICBUaGUgdGVzdCBoYXJuZXNzIHdpbGwKKyAgICAgKiB0ZXJtaW5hdGUgYWxsIGh1bmcgdGhyZWFkcyBhZnRlciBpdHMgdGltZW91dCBoYXMgZXhwaXJlZCwKKyAgICAgKiBjdXJyZW50bHkgMyBtaW51dGVzIGJ5IGRlZmF1bHQsIGJ1dCB5b3UgbWlnaHQgdHJ5IHRvIGJlCisgICAgICogc21hcnQgYWJvdXQgaXQuLi4uCisgICAgICovCisKKyAgICAvKgorICAgICAqIERlZmluZSB0aGUgc2VydmVyIHNpZGUgb2YgdGhlIHRlc3QuCisgICAgICoKKyAgICAgKiBJZiB0aGUgc2VydmVyIHByZW1hdHVyZWx5IGV4aXRzLCBzZXJ2ZXJSZWFkeSB3aWxsIGJlIHNldCB0byB0cnVlCisgICAgICogdG8gYXZvaWQgaW5maW5pdGUgaGFuZ3MuCisgICAgICovCisgICAgdm9pZCBkb1NlcnZlclNpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU1NMU2VydmVyU29ja2V0RmFjdG9yeSBzc2xzc2YgPQorICAgICAgICAgICAgKFNTTFNlcnZlclNvY2tldEZhY3RvcnkpIFNTTFNlcnZlclNvY2tldEZhY3RvcnkuZ2V0RGVmYXVsdCgpOworICAgICAgICBTU0xTZXJ2ZXJTb2NrZXQgc3NsU2VydmVyU29ja2V0ID0KKyAgICAgICAgICAgIChTU0xTZXJ2ZXJTb2NrZXQpIHNzbHNzZi5jcmVhdGVTZXJ2ZXJTb2NrZXQoc2VydmVyUG9ydCk7CisKKyAgICAgICAgU05JTWF0Y2hlciBtYXRjaGVyID0gU05JSG9zdE5hbWUuY3JlYXRlU05JTWF0Y2hlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlckFjY2VwdGFibGVIb3N0bmFtZSk7CisgICAgICAgIENvbGxlY3Rpb248U05JTWF0Y2hlcj4gbWF0Y2hlcnMgPSBuZXcgQXJyYXlMaXN0PD4oMSk7CisgICAgICAgIG1hdGNoZXJzLmFkZChtYXRjaGVyKTsKKyAgICAgICAgU1NMUGFyYW1ldGVycyBwYXJhbXMgPSBzc2xTZXJ2ZXJTb2NrZXQuZ2V0U1NMUGFyYW1ldGVycygpOworICAgICAgICBwYXJhbXMuc2V0U05JTWF0Y2hlcnMobWF0Y2hlcnMpOworICAgICAgICBzc2xTZXJ2ZXJTb2NrZXQuc2V0U1NMUGFyYW1ldGVycyhwYXJhbXMpOworCisgICAgICAgIHNlcnZlclBvcnQgPSBzc2xTZXJ2ZXJTb2NrZXQuZ2V0TG9jYWxQb3J0KCk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogU2lnbmFsIENsaWVudCwgd2UncmUgcmVhZHkgZm9yIGhpcyBjb25uZWN0LgorICAgICAgICAgKi8KKyAgICAgICAgc2VydmVyUmVhZHkgPSB0cnVlOworCisgICAgICAgIFNTTFNvY2tldCBzc2xTb2NrZXQgPSAoU1NMU29ja2V0KSBzc2xTZXJ2ZXJTb2NrZXQuYWNjZXB0KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBJbnB1dFN0cmVhbSBzc2xJUyA9IHNzbFNvY2tldC5nZXRJbnB1dFN0cmVhbSgpOworICAgICAgICAgICAgT3V0cHV0U3RyZWFtIHNzbE9TID0gc3NsU29ja2V0LmdldE91dHB1dFN0cmVhbSgpOworCisgICAgICAgICAgICBzc2xJUy5yZWFkKCk7CisgICAgICAgICAgICBzc2xPUy53cml0ZSg4NSk7CisgICAgICAgICAgICBzc2xPUy5mbHVzaCgpOworCisgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJNaXNtYXRjaGVkIHNlcnZlciBuYW1lIGluZGljYXRpb24gd2FzIGFjY2VwdGVkIik7CisgICAgICAgIH0gY2F0Y2ggKFNTTEhhbmRzaGFrZUV4Y2VwdGlvbiBzc2xoZSkgeworICAgICAgICAgICAgLy8gdGhlIGV4cGVjdGVkIHVucmVjb2duaXplZCBzZXJ2ZXIgbmFtZSBpbmRpY2F0aW9uIGV4Y2VwdGlvbgorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgIC8vIHRoZSBwZWVyIG1heSBoYXZlIGNsb3NlZCB0aGUgc29ja2V0IGJlY2F1c2Ugb2YgdGhlIHVubWF0Y2hlZAorICAgICAgICAgICAgLy8gc2VydmVyIG5hbWUgaW5kaWNhdGlvbi4KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHNzbFNvY2tldC5jbG9zZSgpOworICAgICAgICAgICAgc3NsU2VydmVyU29ja2V0LmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qCisgICAgICogRGVmaW5lIHRoZSBjbGllbnQgc2lkZSBvZiB0aGUgdGVzdC4KKyAgICAgKgorICAgICAqIElmIHRoZSBzZXJ2ZXIgcHJlbWF0dXJlbHkgZXhpdHMsIHNlcnZlclJlYWR5IHdpbGwgYmUgc2V0IHRvIHRydWUKKyAgICAgKiB0byBhdm9pZCBpbmZpbml0ZSBoYW5ncy4KKyAgICAgKi8KKyAgICB2b2lkIGRvQ2xpZW50U2lkZSgpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIC8qCisgICAgICAgICAqIFdhaXQgZm9yIHNlcnZlciB0byBnZXQgc3RhcnRlZC4KKyAgICAgICAgICovCisgICAgICAgIHdoaWxlICghc2VydmVyUmVhZHkpIHsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcCg1MCk7CisgICAgICAgIH0KKworICAgICAgICBTU0xTb2NrZXRGYWN0b3J5IHNzbHNmID0KKyAgICAgICAgICAgIChTU0xTb2NrZXRGYWN0b3J5KSBTU0xTb2NrZXRGYWN0b3J5LmdldERlZmF1bHQoKTsKKyAgICAgICAgU1NMU29ja2V0IHNzbFNvY2tldCA9IChTU0xTb2NrZXQpCisgICAgICAgICAgICBzc2xzZi5jcmVhdGVTb2NrZXQoImxvY2FsaG9zdCIsIHNlcnZlclBvcnQpOworCisgICAgICAgIFNOSUhvc3ROYW1lIHNlcnZlck5hbWUgPSBuZXcgU05JSG9zdE5hbWUoY2xpZW50UmVxdWVzdGVkSG9zdG5hbWUpOworICAgICAgICBMaXN0PFNOSVNlcnZlck5hbWU+IHNlcnZlck5hbWVzID0gbmV3IEFycmF5TGlzdDw+KDEpOworICAgICAgICBzZXJ2ZXJOYW1lcy5hZGQoc2VydmVyTmFtZSk7CisgICAgICAgIFNTTFBhcmFtZXRlcnMgcGFyYW1zID0gc3NsU29ja2V0LmdldFNTTFBhcmFtZXRlcnMoKTsKKyAgICAgICAgcGFyYW1zLnNldFNlcnZlck5hbWVzKHNlcnZlck5hbWVzKTsKKyAgICAgICAgc3NsU29ja2V0LnNldFNTTFBhcmFtZXRlcnMocGFyYW1zKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgSW5wdXRTdHJlYW0gc3NsSVMgPSBzc2xTb2NrZXQuZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIE91dHB1dFN0cmVhbSBzc2xPUyA9IHNzbFNvY2tldC5nZXRPdXRwdXRTdHJlYW0oKTsKKworICAgICAgICAgICAgc3NsT1Mud3JpdGUoMjgwKTsKKyAgICAgICAgICAgIHNzbE9TLmZsdXNoKCk7CisgICAgICAgICAgICBzc2xJUy5yZWFkKCk7CisKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIk1pc21hdGNoZWQgc2VydmVyIG5hbWUgaW5kaWNhdGlvbiB3YXMgYWNjZXB0ZWQiKTsKKyAgICAgICAgfSBjYXRjaCAoU1NMSGFuZHNoYWtlRXhjZXB0aW9uIHNzbGhlKSB7CisgICAgICAgICAgICAvLyB0aGUgZXhwZWN0ZWQgdW5yZWNvZ25pemVkIHNlcnZlciBuYW1lIGluZGljYXRpb24gZXhjZXB0aW9uCisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgLy8gdGhlIHBlZXIgbWF5IGhhdmUgY2xvc2VkIHRoZSBzb2NrZXQgYmVjYXVzZSBvZiB0aGUgdW5tYXRjaGVkCisgICAgICAgICAgICAvLyBzZXJ2ZXIgbmFtZSBpbmRpY2F0aW9uLgorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgc3NsU29ja2V0LmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgY2xpZW50UmVxdWVzdGVkSG9zdG5hbWUgPSAid3d3LmV4YW1wbGUuY29tIjsKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgc2VydmVyQWNjZXB0YWJsZUhvc3RuYW1lID0gInd3d1xcLmV4YW1wbGVcXC5vcmciOworCisgICAgLyoKKyAgICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICogVGhlIHJlbWFpbmRlciBpcyBqdXN0IHN1cHBvcnQgc3R1ZmYKKyAgICAgKi8KKworICAgIC8vIHVzZSBhbnkgZnJlZSBwb3J0IGJ5IGRlZmF1bHQKKyAgICB2b2xhdGlsZSBpbnQgc2VydmVyUG9ydCA9IDA7CisKKyAgICB2b2xhdGlsZSBFeGNlcHRpb24gc2VydmVyRXhjZXB0aW9uID0gbnVsbDsKKyAgICB2b2xhdGlsZSBFeGNlcHRpb24gY2xpZW50RXhjZXB0aW9uID0gbnVsbDsKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcga2V5RmlsZW5hbWUgPQorICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KCJ0ZXN0LnNyYyIsICIuIikgKyAiLyIgKyBwYXRoVG9TdG9yZXMgKworICAgICAgICAgICAgICAgICIvIiArIGtleVN0b3JlRmlsZTsKKyAgICAgICAgU3RyaW5nIHRydXN0RmlsZW5hbWUgPQorICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KCJ0ZXN0LnNyYyIsICIuIikgKyAiLyIgKyBwYXRoVG9TdG9yZXMgKworICAgICAgICAgICAgICAgICIvIiArIHRydXN0U3RvcmVGaWxlOworCisgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiamF2YXgubmV0LnNzbC5rZXlTdG9yZSIsIGtleUZpbGVuYW1lKTsKKyAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJqYXZheC5uZXQuc3NsLmtleVN0b3JlUGFzc3dvcmQiLCBwYXNzd2QpOworICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImphdmF4Lm5ldC5zc2wudHJ1c3RTdG9yZSIsIHRydXN0RmlsZW5hbWUpOworICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImphdmF4Lm5ldC5zc2wudHJ1c3RTdG9yZVBhc3N3b3JkIiwgcGFzc3dkKTsKKworICAgICAgICBpZiAoZGVidWcpCisgICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImphdmF4Lm5ldC5kZWJ1ZyIsICJhbGwiKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBTdGFydCB0aGUgdGVzdHMuCisgICAgICAgICAqLworICAgICAgICBuZXcgU1NMU29ja2V0SW5jb25zaXN0ZW50U05JKCk7CisgICAgfQorCisgICAgVGhyZWFkIGNsaWVudFRocmVhZCA9IG51bGw7CisgICAgVGhyZWFkIHNlcnZlclRocmVhZCA9IG51bGw7CisKKyAgICAvKgorICAgICAqIFByaW1hcnkgY29uc3RydWN0b3IsIHVzZWQgdG8gZHJpdmUgcmVtYWluZGVyIG9mIHRoZSB0ZXN0LgorICAgICAqCisgICAgICogRm9yayBvZmYgdGhlIG90aGVyIHNpZGUsIHRoZW4gZG8geW91ciB3b3JrLgorICAgICAqLworICAgIFNTTFNvY2tldEluY29uc2lzdGVudFNOSSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKHNlcGFyYXRlU2VydmVyVGhyZWFkKSB7CisgICAgICAgICAgICAgICAgc3RhcnRTZXJ2ZXIodHJ1ZSk7CisgICAgICAgICAgICAgICAgc3RhcnRDbGllbnQoZmFsc2UpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdGFydENsaWVudCh0cnVlKTsKKyAgICAgICAgICAgICAgICBzdGFydFNlcnZlcihmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBzd2FsbG93IGZvciBub3cuICBTaG93IGxhdGVyCisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBXYWl0IGZvciBvdGhlciBzaWRlIHRvIGNsb3NlIGRvd24uCisgICAgICAgICAqLworICAgICAgICBpZiAoc2VwYXJhdGVTZXJ2ZXJUaHJlYWQpIHsKKyAgICAgICAgICAgIHNlcnZlclRocmVhZC5qb2luKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjbGllbnRUaHJlYWQuam9pbigpOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogV2hlbiB3ZSBnZXQgaGVyZSwgdGhlIHRlc3QgaXMgcHJldHR5IG11Y2ggb3Zlci4KKyAgICAgICAgICogV2hpY2ggc2lkZSB0aHJldyB0aGUgZXJyb3I/CisgICAgICAgICAqLworICAgICAgICBFeGNlcHRpb24gbG9jYWw7CisgICAgICAgIEV4Y2VwdGlvbiByZW1vdGU7CisgICAgICAgIFN0cmluZyB3aGljaFJlbW90ZTsKKworICAgICAgICBpZiAoc2VwYXJhdGVTZXJ2ZXJUaHJlYWQpIHsKKyAgICAgICAgICAgIHJlbW90ZSA9IHNlcnZlckV4Y2VwdGlvbjsKKyAgICAgICAgICAgIGxvY2FsID0gY2xpZW50RXhjZXB0aW9uOworICAgICAgICAgICAgd2hpY2hSZW1vdGUgPSAic2VydmVyIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlbW90ZSA9IGNsaWVudEV4Y2VwdGlvbjsKKyAgICAgICAgICAgIGxvY2FsID0gc2VydmVyRXhjZXB0aW9uOworICAgICAgICAgICAgd2hpY2hSZW1vdGUgPSAiY2xpZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIElmIGJvdGggZmFpbGVkLCByZXR1cm4gdGhlIGN1cnRocmVhZCdzIGV4Y2VwdGlvbiwgYnV0IGFsc28KKyAgICAgICAgICogcHJpbnQgdGhlIHJlbW90ZSBzaWRlIEV4Y2VwdGlvbgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKChsb2NhbCAhPSBudWxsKSAmJiAocmVtb3RlICE9IG51bGwpKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4od2hpY2hSZW1vdGUgKyAiIGFsc28gdGhyZXc6Iik7CisgICAgICAgICAgICByZW1vdGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKKyAgICAgICAgICAgIHRocm93IGxvY2FsOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlbW90ZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyByZW1vdGU7CisgICAgICAgIH0KKworICAgICAgICBpZiAobG9jYWwgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbG9jYWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHN0YXJ0U2VydmVyKGJvb2xlYW4gbmV3VGhyZWFkKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG5ld1RocmVhZCkgeworICAgICAgICAgICAgc2VydmVyVGhyZWFkID0gbmV3IFRocmVhZCgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkb1NlcnZlclNpZGUoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBPdXIgc2VydmVyIHRocmVhZCBqdXN0IGRpZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAgICAgICAgICAgICAgICAgICAgICAgICogUmVsZWFzZSB0aGUgY2xpZW50LCBpZiBub3QgYWN0aXZlIGFscmVhZHkuLi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJTZXJ2ZXIgZGllZC4uLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyUmVhZHkgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyRXhjZXB0aW9uID0gZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBzZXJ2ZXJUaHJlYWQuc3RhcnQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZG9TZXJ2ZXJTaWRlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHNlcnZlckV4Y2VwdGlvbiA9IGU7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIHNlcnZlclJlYWR5ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgc3RhcnRDbGllbnQoYm9vbGVhbiBuZXdUaHJlYWQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAobmV3VGhyZWFkKSB7CisgICAgICAgICAgICBjbGllbnRUaHJlYWQgPSBuZXcgVGhyZWFkKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvQ2xpZW50U2lkZSgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIE91ciBjbGllbnQgdGhyZWFkIGp1c3QgZGllZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJDbGllbnQgZGllZC4uLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50RXhjZXB0aW9uID0gZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBjbGllbnRUaHJlYWQuc3RhcnQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZG9DbGllbnRTaWRlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGNsaWVudEV4Y2VwdGlvbiA9IGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvc3NsL2phdmF4L25ldC9zc2wvU2VydmVyTmFtZS9TU0xTb2NrZXRTTklTZW5zaXRpdmUuamF2YSBiL2pkay90ZXN0L3N1bi9zZWN1cml0eS9zc2wvamF2YXgvbmV0L3NzbC9TZXJ2ZXJOYW1lL1NTTFNvY2tldFNOSVNlbnNpdGl2ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjNTBjMzAKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvc3NsL2phdmF4L25ldC9zc2wvU2VydmVyTmFtZS9TU0xTb2NrZXRTTklTZW5zaXRpdmUuamF2YQpAQCAtMCwwICsxLDU2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgT3JhY2xlIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCisgKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CisgKiBxdWVzdGlvbnMuCisgKi8KKworLy8KKy8vIFN1bkpTU0UgZG9lcyBub3Qgc3VwcG9ydCBkeW5hbWljIHN5c3RlbSBwcm9wZXJ0aWVzLCBubyB3YXkgdG8gcmUtdXNlCisvLyBzeXN0ZW0gcHJvcGVydGllcyBpbiBzYW1ldm0vYWdlbnR2bSBtb2RlLgorLy8KKworLyoKKyAqIEB0ZXN0CisgKiBAYnVnIDcwNjgzMjEKKyAqIEBzdW1tYXJ5IFN1cHBvcnQgVExTIFNlcnZlciBOYW1lIEluZGljYXRpb24gKFNOSSkgRXh0ZW5zaW9uIGluIEpTU0UgU2VydmVyCisgKiBAcnVuIG1haW4vb3RoZXJ2bSBTU0xTb2NrZXRTTklTZW5zaXRpdmUgUEtJWCB3d3cuZXhhbXBsZS5jb20KKyAqIEBydW4gbWFpbi9vdGhlcnZtIFNTTFNvY2tldFNOSVNlbnNpdGl2ZSBTdW5YNTA5IHd3dy5leGFtcGxlLmNvbQorICogQHJ1biBtYWluL290aGVydm0gU1NMU29ja2V0U05JU2Vuc2l0aXZlIFBLSVggd3d3LmV4YW1wbGUubmV0CisgKiBAcnVuIG1haW4vb3RoZXJ2bSBTU0xTb2NrZXRTTklTZW5zaXRpdmUgU3VuWDUwOSB3d3cuZXhhbXBsZS5uZXQKKyAqIEBydW4gbWFpbi9vdGhlcnZtIFNTTFNvY2tldFNOSVNlbnNpdGl2ZSBQS0lYIHd3dy5pbnZhbGlkLmNvbQorICogQHJ1biBtYWluL290aGVydm0gU1NMU29ja2V0U05JU2Vuc2l0aXZlIFN1blg1MDkgd3d3LmludmFsaWQuY29tCisgKi8KKworaW1wb3J0IGphdmEubmV0Lio7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmF4Lm5ldC5zc2wuKjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LktleVN0b3JlOworaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5RmFjdG9yeTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGU7CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVGYWN0b3J5OworaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy4qOworaW1wb3J0IGphdmEuc2VjdXJpdHkuaW50ZXJmYWNlcy4qOworaW1wb3J0IHN1bi5taXNjLkJBU0U2NERlY29kZXI7CisKKworcHVibGljIGNsYXNzIFNTTFNvY2tldFNOSVNlbnNpdGl2ZSB7CisKKyAgICAvKgorICAgICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgKiBTZXQgdGhlIHZhcmlvdXMgdmFyaWFibGVzIG5lZWRlZCBmb3IgdGhlIHRlc3RzLCB0aGVuCisgICAgICogc3BlY2lmeSB3aGF0IHRlc3RzIHRvIHJ1biBvbiBlYWNoIHNpZGUuCisgICAgICovCisKKyAgICAvKgorICAgICAqIFNob3VsZCB3ZSBydW4gdGhlIGNsaWVudCBvciBzZXJ2ZXIgaW4gYSBzZXBhcmF0ZSB0aHJlYWQ/CisgICAgICogQm90aCBzaWRlcyBjYW4gdGhyb3cgZXhjZXB0aW9ucywgYnV0IGRvIHlvdSBoYXZlIGEgcHJlZmVyZW5jZQorICAgICAqIGFzIHRvIHdoaWNoIHNpZGUgc2hvdWxkIGJlIHRoZSBtYWluIHRocmVhZC4KKyAgICAgKi8KKyAgICBzdGF0aWMgYm9vbGVhbiBzZXBhcmF0ZVNlcnZlclRocmVhZCA9IGZhbHNlOworCisgICAgLyoKKyAgICAgKiBXaGVyZSBkbyB3ZSBmaW5kIHRoZSBrZXlzdG9yZXM/CisgICAgICovCisgICAgLy8gQ2VydGlmaWNhdGVzIGFuZCBrZXkgdXNlZCBpbiB0aGUgdGVzdC4KKyAgICBzdGF0aWMgU3RyaW5nIHRydXN0ZWRDZXJ0U3RyID0KKyAgICAgICAgIi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLVxuIiArCisgICAgICAgICJNSUlDa2pDQ0FmdWdBd0lCQWdJQkFEQU5CZ2txaGtpRzl3MEJBUVFGQURBN01Rc3dDUVlEVlFRR0V3SlZVekVOXG4iICsKKyAgICAgICAgIk1Bc0dBMVVFQ2hNRVNtRjJZVEVkTUJzR0ExVUVDeE1VVTNWdVNsTlRSU0JVWlhOMElGTmxjbWwyWTJVd0hoY05cbiIgKworICAgICAgICAiTVRJd05ERTNNVEl3TmpBM1doY05Nek13TXpJNE1USXdOakEzV2pBN01Rc3dDUVlEVlFRR0V3SlZVekVOTUFzR1xuIiArCisgICAgICAgICJBMVVFQ2hNRVNtRjJZVEVkTUJzR0ExVUVDeE1VVTNWdVNsTlRSU0JVWlhOMElGTmxjbWwyWTJVd2daOHdEUVlKXG4iICsKKyAgICAgICAgIktvWklodmNOQVFFQkJRQURnWTBBTUlHSkFvR0JBTlkrN0VucCsxUzU2NmtMY0trK3FlNEtpNkJ4YUhHWit2N3JcbiIgKworICAgICAgICAidkxrc3g5SVFaQ2JBRWY0WUxiclpoS3pLRDNTUElKWHl4UEZ3a25Ba25JaDNLbms4bVZpT1prczdUOEwzR25KclxuIiArCisgICAgICAgICJUQmFWdkR5VHpESnVtL1FZaWFoZk8ycXBmTi9PeWEyVUlMbXFzQkFlTHlXcHpiUXNBeVdCWGZvVXRrT1VnbnpLXG4iICsKKyAgICAgICAgImZrNlFBS1lyQWdNQkFBR2pnYVV3Z2FJd0hRWURWUjBPQkJZRUZFdG1RaTdqVDFpalhPYWZQc2Zrckx3U1Z1OWVcbiIgKworICAgICAgICAiTUdNR0ExVWRJd1JjTUZxQUZFdG1RaTdqVDFpalhPYWZQc2Zrckx3U1Z1OWVvVCtrUFRBN01Rc3dDUVlEVlFRR1xuIiArCisgICAgICAgICJFd0pWVXpFTk1Bc0dBMVVFQ2hNRVNtRjJZVEVkTUJzR0ExVUVDeE1VVTNWdVNsTlRSU0JVWlhOMElGTmxjbWwyXG4iICsKKyAgICAgICAgIlkyV0NBUUF3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFMQmdOVkhROEVCQU1DQVFZd0RRWUpLb1pJaHZjTkFRRUVcbiIgKworICAgICAgICAiQlFBRGdZRUFrS1d4TWM0K09EazVXd0xYWHdlQjgvSUtmVmZyaXpObjBLTEVnc1o2eE5YRklYRHBpUEdBRmNnbFxuIiArCisgICAgICAgICJNekZPNDI0Smd5dlV1bHNVYy9YMTZDbnV3d250a2s2S1VHN3ZFVjdoNG85c0FWN0NheDNnZlFFL0VaRmI0eWJuXG4iICsKKyAgICAgICAgImFCbTFVc3VqTUtkL292cWJiYnhKYm1PV3pDZW8wUWZJR2xlREV5aDNOQkJaMGkxMUtpdz1cbiIgKworICAgICAgICAiLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLSI7CisKKyAgICAvLyB3ZWIgc2VydmVyIGNlcnRpZmljYXRlLCB3d3cuZXhhbXBsZS5jb20KKyAgICBzdGF0aWMgU3RyaW5nIHRhcmdldENlcnRTdHJfQSA9CisgICAgICAgICItLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS1cbiIgKworICAgICAgICAiTUlJQ1ZUQ0NBYjZnQXdJQkFnSUJBakFOQmdrcWhraUc5dzBCQVFRRkFEQTdNUXN3Q1FZRFZRUUdFd0pWVXpFTlxuIiArCisgICAgICAgICJNQXNHQTFVRUNoTUVTbUYyWVRFZE1Cc0dBMVVFQ3hNVVUzVnVTbE5UUlNCVVpYTjBJRk5sY21sMlkyVXdIaGNOXG4iICsKKyAgICAgICAgIk1USXdOREUzTVRJd05qQTRXaGNOTXpJd01UQXpNVEl3TmpBNFdqQlZNUXN3Q1FZRFZRUUdFd0pWVXpFTk1Bc0dcbiIgKworICAgICAgICAiQTFVRUNoTUVTbUYyWVRFZE1Cc0dBMVVFQ3hNVVUzVnVTbE5UUlNCVVpYTjBJRk5sY21sMlkyVXhHREFXQmdOVlxuIiArCisgICAgICAgICJCQU1URDNkM2R5NWxlR0Z0Y0d4bExtTnZiVENCbnpBTkJna3Foa2lHOXcwQkFRRUZBQU9CalFBd2dZa0NnWUVBXG4iICsKKyAgICAgICAgIjR6RnAzUFpOenNkM1p3RzZGTk5XTzllU04rVUJ5bWxmOG9Dd3BLSk0ydElpbm1NV3ZXSVhubHgvMlVYSWZTQXFcbiIgKworICAgICAgICAiUUVHM2FYa0FGeUVpR0dwUWxCYnFjZnJFU3NIc2l6MnBubm01ZEcydi9lUzBCd3oxam1jdU5td25oM1VRdzJWbFxuIiArCisgICAgICAgICIrQkxrOHVrZHJMamlDVDhqQVJpSEV4WWYxWGcrd1VxUTl5OE5WMjZoZGFVQ0F3RUFBYU5QTUUwd0N3WURWUjBQXG4iICsKKyAgICAgICAgIkJBUURBZ1BvTUIwR0ExVWREZ1FXQkJRd3R4K2dxem4ydzR5ODJiclhscDd0cUJZRVpEQWZCZ05WSFNNRUdEQVdcbiIgKworICAgICAgICAiZ0JSTFprSXU0MDlZbzF6bW56N0g1S3k4RWxidlhqQU5CZ2txaGtpRzl3MEJBUVFGQUFPQmdRQUpXbzhCNlVkK1xuIiArCisgICAgICAgICIvT1UrVWNaTGlobGZNWDAyT1NsSzJaQjdtZnFwajJHM0pUOXliMEErVmJZM3V1YWptYVlZSUl4bDNrWEd6L244XG4iICsKKyAgICAgICAgIk0yUS9VeC9NRHhHK0lGS0hDMjZLdWo0ZEFRZ3pqcTJwSUxWUFRFMlFuYVFUTkNzZ1ZadFRhQzQ3U0c5RlJTb0NcbiIgKworICAgICAgICAicXZuSXZuL29UcEtTcXVzNzZJMWNSNGpvRHRpVjJPRXVWdz09XG4iICsKKyAgICAgICAgIi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0iOworCisgICAgLy8gUHJpdmF0ZSBrZXkgaW4gdGhlIGZvcm1hdCBvZiBQS0NTIzgKKyAgICBzdGF0aWMgU3RyaW5nIHRhcmdldFByaXZhdGVLZXlfQSA9CisgICAgICAgICJNSUlDZGdJQkFEQU5CZ2txaGtpRzl3MEJBUUVGQUFTQ0FtQXdnZ0pjQWdFQUFvR0JBT014YWR6MlRjN0hkMmNCXG4iICsKKyAgICAgICAgInVoVFRWanZYa2pmbEFjcHBYL0tBc0tTaVROclNJcDVqRnIxaUY1NWNmOWxGeUgwZ0trQkJ0Mmw1QUJjaEloaHFcbiIgKworICAgICAgICAiVUpRVzZuSDZ4RXJCN0lzOXFaNTV1WFJ0ci8za3RBY005WTVuTGpac0o0ZDFFTU5sWmZnUzVQTHBIYXk0NGdrL1xuIiArCisgICAgICAgICJJd0VZaHhNV0g5VjRQc0ZLa1BjdkRWZHVvWFdsQWdNQkFBRUNnWUFxWDJudUl5WHAzZnZnQTB0d1hPWWxiUlJCXG4iICsKKyAgICAgICAgIlJuM3FBWE02cUZQSnNOZUNyRlIyaythRzFjZXY2bktSMUZrTE5UZU1HbldadjA2TUFjcjVJTUw4aTdXWHlHNENcbiIgKworICAgICAgICAiTFkvQzBnZWRuOTRGREtGbGxuK2JURU53UVRHam40bEt5c0RBK0l1TnBhc1RlTUNhamJpYytkUEJ5aElkVE9qWlxuIiArCisgICAgICAgICJpTUN5eGJMZnBrNDB6UW9wVlFKQkFQeWZHbWtlSEIzR2pkYmRndWpXQ0dLYjJVeEJhNE84ZHkzTzRsMnlpelRuXG4iICsKKyAgICAgICAgInVVcU1HY3dHWTRjaU5TVnZaUTdqS280dkRta1N1WWliNC93b1BDaGFOZk1DUVFEbU8wQlF1U1dZR050U3dWMzVcbiIgKworICAgICAgICAibGFmWmZYMWROQ0xLbTFpTkE2QTEyZXZYZ3ZRaUU5V1Q0bXFpb25pZzBWWlcxNkh0aVk0L0JrSE9jb3MvSzlVbVxuIiArCisgICAgICAgICJBUlFIQWtBOG1rYVJ0U0YxbXk1bnYxZ3FWejVIdWErVmRaUS9WRFViRGlpTDVjc3pjK3Vsa0pxWHNXaXJBRy9UXG4iICsKKyAgICAgICAgImZUZTNMSlFHN0E3Kzhma0VackY0eW9ZMEFBQTFBa0VBb3Rva2V6VUxqNU45aUFMNVN6TDl3SXpRWVY0Z2dmbnlcbiIgKworICAgICAgICAiWUFUQmpYWHhLY2Nha3dRK25kV1pJaU1VZW9TNHNzTGlhbGhUZ3VjVkkwZklrVTJhL3IvaWZ3SkFjNmUrNVB2aFxuIiArCisgICAgICAgICJNZ2hRai9VNzg4T2QvdjZyZ3F6L05Hc2R1Wjd1aWxDTWNXaXdBNzNPUjJNSE1IL09JdW9vZnVFUHJmdVY5aXNWXG4iICsKKyAgICAgICAgInhWWGhncEtmUC9wZE9BPT0iOworCisgICAgLy8gd2ViIHNlcnZlciBjZXJ0aWZpY2F0ZSwgd3d3LmV4YW1wbGUubmV0CisgICAgc3RhdGljIFN0cmluZyB0YXJnZXRDZXJ0U3RyX0IgPQorICAgICAgICAiLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tXG4iICsKKyAgICAgICAgIk1JSUNWVENDQWI2Z0F3SUJBZ0lCQkRBTkJna3Foa2lHOXcwQkFRUUZBREE3TVFzd0NRWURWUVFHRXdKVlV6RU5cbiIgKworICAgICAgICAiTUFzR0ExVUVDaE1FU21GMllURWRNQnNHQTFVRUN4TVVVM1Z1U2xOVFJTQlVaWE4wSUZObGNtbDJZMlV3SGhjTlxuIiArCisgICAgICAgICJNVEl3TkRFM01USXdOakE1V2hjTk16SXdNVEF6TVRJd05qQTVXakJWTVFzd0NRWURWUVFHRXdKVlV6RU5NQXNHXG4iICsKKyAgICAgICAgIkExVUVDaE1FU21GMllURWRNQnNHQTFVRUN4TVVVM1Z1U2xOVFJTQlVaWE4wSUZObGNtbDJZMlV4R0RBV0JnTlZcbiIgKworICAgICAgICAiQkFNVEQzZDNkeTVsZUdGdGNHeGxMbTVsZERDQm56QU5CZ2txaGtpRzl3MEJBUUVGQUFPQmpRQXdnWWtDZ1lFQVxuIiArCisgICAgICAgICIyVmx6RjFmdldZY3pEQ2hyVWVKaUxKMU0vZElTaENhT1RmWUdpWGZRR0VaQ0FXVGFjVWNsd3IrclZNblo3NS9jXG4iICsKKyAgICAgICAgInd3ZzVwTmRYUmlqeE1pbDhEQlRTMWdGY0lGUWhvc0xIdnpJQWU2VUxsZy94QisvTDZLQnorTlRXZm8vMktGNnRcbiIgKworICAgICAgICAieGF0bWNUb05yQ2N3aTdlVU9mYnpRamU2NVRpenM1NmpKWWVtMm03UmswRUNBd0VBQWFOUE1FMHdDd1lEVlIwUFxuIiArCisgICAgICAgICJCQVFEQWdQb01CMEdBMVVkRGdRV0JCUVQvRlIwY0FXY1pRN2gwWDc5S0draTM0T1NRakFmQmdOVkhTTUVHREFXXG4iICsKKyAgICAgICAgImdCUkxaa0l1NDA5WW8xem1uejdINUt5OEVsYnZYakFOQmdrcWhraUc5dzBCQVFRRkFBT0JnUUI2N2NQSVQ2ZnpcbiIgKworICAgICAgICAiNldzOGZCcFlnVzJhZDRjaTY2aTFXZHVCRDlDcEdGRStqUksyZmVSajZodllCWG9jS2owQU1XVUZJRUIyRTNoQVxuIiArCisgICAgICAgICJvSWp4Y2YxR3hJcEhWbDlEamxoeHFYYkEwS3RsNy9OR05SbERTTFRpek9UbDNGQjFtTVRsT0d2WERWbXBjRmhsXG4iICsKKyAgICAgICAgIkh1b1AxaFl2aFRzQndQeDVpZ0dOY2h1UHRESVV6TDJtWHc9PVxuIiArCisgICAgICAgICItLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tIjsKKworICAgIHN0YXRpYyBTdHJpbmcgdGFyZ2V0UHJpdmF0ZUtleV9CID0KKyAgICAgICAgIk1JSUNkZ0lCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQW1Bd2dnSmNBZ0VBQW9HQkFObFpjeGRYNzFtSE13d29cbiIgKworICAgICAgICAiYTFIaVlpeWRUUDNTRW9RbWprMzJCb2wzMEJoR1FnRmsybkZISmNLL3ExVEoyZStmM01NSU9hVFhWMFlvOFRJcFxuIiArCisgICAgICAgICJmQXdVMHRZQlhDQlVJYUxDeDc4eUFIdWxDNVlQOFFmdnkraWdjL2pVMW42UDlpaGVyY1dyWm5FNkRhd25NSXUzXG4iICsKKyAgICAgICAgImxEbjI4MEkzdXVVNHM3T2VveVdIcHRwdTBaTkJBZ01CQUFFQ2dZRUFsMTlIMjZzZmhEKzMyckRQeFpDZ0JTaHNcbiIgKworICAgICAgICAiZFozM3pWZTQ1aTBCY240aVRMV3B4S1REeWY3ZUdwczRyTzJEdmZLZFlxdDQwZ2d6dlNaSWpVSDlKY0RlOEdtR1xuIiArCisgICAgICAgICJkM20wSUxCN3BnNGpzRmxweWVIcFRPOGdyUEx4QTFHOXMzbzBEb0Zwei9yb29xZ0ZmZS9EclJEbVJvT1NrZ2ZWXG4iICsKKyAgICAgICAgIi9nc2VJYmdKSFJPL0N0eXZkaDBDUVFENnVGZDBIeGhIMWpsL0p6dlB6SUg0TFNuUGNkRWg5enNNRWI2dXpoNzVcbiIgKworICAgICAgICAiOXFMK0lIRDVOMkkvcFlaVEtxREZJd2hKZjcwMStMS2FnNTVBWC96ckR0N3JBa0VBM2UwMEFibndhbkRNYTZXalxuIiArCisgICAgICAgICIrZ0Zla1VRdmVTVnJhMzhMaWloekNreVZ2UXBGamJpRjFyVWhTTlEwZHBVNS9obXJZRjBDNkg5VlhBZXNma1VZXG4iICsKKyAgICAgICAgIldocERnd0pBWWpnWk9vcDc3cGlEeWNaSzdpc0Z0MzJwNVhTSEl6RkJWb2NWRmxIMVhLTThVeVhPWEROUUwvTGVcbiIgKworICAgICAgICAiWG5KU3JTZitOUnp2dU5jRzBQVkM1NkV5NmJyWHBRSkFZNE00dmNsdHQ1enEzUjVDUUJtYkdSSjFJeUtYWDNWeFxuIiArCisgICAgICAgICJiRHNsRXFveXZyaTdaWWduWTVhRzNVeGlWZ1ltSWYzS3JnUW5DTEFJUzZNWlF1bWl1TXhzRndKQUs1cEVHMDYzXG4iICsKKyAgICAgICAgIjluZ1VvZjRmRE12WnBocVpqWlIxek1Lei9WLzlnZTBEV0JJTmFxRmdzZ2ViTnUrTXlJbXNDOEM2V0tqR21WLzJcbiIgKworICAgICAgICAiZjFNWTBEN3NDMnZVL1E9PSI7CisKKyAgICAvLyB3ZWIgc2VydmVyIGNlcnRpZmljYXRlLCB3d3cuaW52YWxpZC5jb20KKyAgICBzdGF0aWMgU3RyaW5nIHRhcmdldENlcnRTdHJfQyA9CisgICAgICAgICItLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS1cbiIgKworICAgICAgICAiTUlJQ1ZUQ0NBYjZnQXdJQkFnSUJBekFOQmdrcWhraUc5dzBCQVFRRkFEQTdNUXN3Q1FZRFZRUUdFd0pWVXpFTlxuIiArCisgICAgICAgICJNQXNHQTFVRUNoTUVTbUYyWVRFZE1Cc0dBMVVFQ3hNVVUzVnVTbE5UUlNCVVpYTjBJRk5sY21sMlkyVXdIaGNOXG4iICsKKyAgICAgICAgIk1USXdOREUzTVRJd05qQTVXaGNOTXpJd01UQXpNVEl3TmpBNVdqQlZNUXN3Q1FZRFZRUUdFd0pWVXpFTk1Bc0dcbiIgKworICAgICAgICAiQTFVRUNoTUVTbUYyWVRFZE1Cc0dBMVVFQ3hNVVUzVnVTbE5UUlNCVVpYTjBJRk5sY21sMlkyVXhHREFXQmdOVlxuIiArCisgICAgICAgICJCQU1URDNkM2R5NXBiblpoYkdsa0xtTnZiVENCbnpBTkJna3Foa2lHOXcwQkFRRUZBQU9CalFBd2dZa0NnWUVBXG4iICsKKyAgICAgICAgInE2TXlRd3pDcjJuSjQxbDBmcm1ITDBxVUxTeVc1MU1oZXZCQysxVzI4aTBMRS9lZnJtcHdWM0xkbmxRRUdGYWtcbiIgKworICAgICAgICAiRExEd3RuZmYzaXJ1OGRTTWNBN0tkV1ZraXZzRTdaVFArcUZEYVdCQXk3WFhpU3N2NnlaMk5oNGpKYjBZY0QyOFxuIiArCisgICAgICAgICI0NXprMm5BbDVBejEvUHVvVGkxdnBReHpGWkt1Qm0xSEdnejNNRVp2QnZNQ0F3RUFBYU5QTUUwd0N3WURWUjBQXG4iICsKKyAgICAgICAgIkJBUURBZ1BvTUIwR0ExVWREZ1FXQkJSUk1pZnJORDAxNU5tOE42Z1Y1WDdjZzFZampqQWZCZ05WSFNNRUdEQVdcbiIgKworICAgICAgICAiZ0JSTFprSXU0MDlZbzF6bW56N0g1S3k4RWxidlhqQU5CZ2txaGtpRzl3MEJBUVFGQUFPQmdRQmprVU82UmkvQlxuIiArCisgICAgICAgICJ1REMyZ0RNSXlMNStOVGUvMWRQUFFZTTRIaENOYS9LUVl2VTVsekNLTzlWcGEraStueXJVTk5YVXU4VGt5cTRZXG4iICsKKyAgICAgICAgIkErYUdTbTYrRlQvaTlyRndrWVVkb3JCdEQzS2ZRaXdUSVdyVkVSWEJrV0k1aVpOYVZaaHgwVEZ5NHZVcGY2NWRcbiIgKworICAgICAgICAiUXR3a2JIcEM2NmZkS2MyRWRMWGt1WTlLa210WlpKSjdZQT09XG4iICsKKyAgICAgICAgIi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0iOworCisgICAgc3RhdGljIFN0cmluZyB0YXJnZXRQcml2YXRlS2V5X0MgPQorICAgICAgICAiTUlJQ2R3SUJBREFOQmdrcWhraUc5dzBCQVFFRkFBU0NBbUV3Z2dKZEFnRUFBb0dCQUt1ak1rTU13cTlweWVOWlxuIiArCisgICAgICAgICJkSDY1aHk5S2xDMHNsdWRUSVhyd1F2dFZ0dkl0Q3hQM242NXFjRmR5M1o1VUJCaFdwQXl3OExaMzM5NHE3dkhVXG4iICsKKyAgICAgICAgImpIQU95blZsWklyN0JPMlV6L3FoUTJsZ1FNdTExNGtyTCtzbWRqWWVJeVc5R0hBOXZPT2M1TnB3SmVRTTlmejdcbiIgKworICAgICAgICAicUU0dGI2VU1jeFdTcmdadFJ4b005ekJHYndiekFnTUJBQUVDZ1lBU0pESzQwWTEyV3ZraTFaNnhra3lPbkJSalxuIiArCisgICAgICAgICJYZllwUnlrZnhHdGdBMlJOM3FMd0hsazdaemF1bDQ2RElLQTZMbFl5blRVa0pERitXdzFjZERuUDBsQmx3Y21NXG4iICsKKyAgICAgICAgImlEMGNrM3pZeVlCTGhRSHVWYmtLM1NZRStBTlJoTTBpY3Z2cUFOUDJhdC9VNGF3UWNQTkVhZS9LQ2llY0xOdTNcbiIgKworICAgICAgICAiQ0pHcXloUERkckVBcVB1SkdRSkJBTjQ2cFFDNmwzeXJjU1lFMnM1M2pTbXNtMkhWVk9GbEZYalU2ay9STVR4R1xuIiArCisgICAgICAgICJGZkRKdEdVQU9RMzdyUFEwNnVnci9nakxBbW1QcCtGWG96YUJkQTMyRDgwQ1FRREZ1R1JndjNXWXFiZ2xJY1JMXG4iICsKKyAgICAgICAgIkpSczZ4bGo5dzFGOTdzL2FpVWVudXdoSVBOaVVvUmJWN21uTnVaL3NHRjBzdk9WRTdTYXpSanVGWDZVcUw5WTlcbiIgKworICAgICAgICAiSHpHL0FrRUExNzBwQ0k4Y2w0dzhlVU5IUkI5dHJHS0VLak1YaHdWQ0ZoN2xKZjJaQmNHb2RTenI4dzJIVmhyWlxuIiArCisgICAgICAgICJLZTdoaWVtRFlmZnJiSjFveG12MDUrbyt4M3IwbFFKQkFMNmFkVm0yK0Z5Rk1GbkxaWG16ZWI1OU80aldZNWJ0XG4iICsKKyAgICAgICAgIlF6Ni9IRzZicE81T2lkTXVQOTlZQ0hNa1FRRE9zL1BPM1k1R3VBb1c2SVk0bi9ZOVMyQjgwKzBDUUJsMS9IOS9cbiIgKworICAgICAgICAiMG4vdnJiNnZXNkF6ZHM0OXR1UzgyUkZBbk9odHdUeUJFYWpzMDhXRjhyWlEzV0QyUkhKbkgwK2pqZkwwYW5JcFxuIiArCisgICAgICAgICJkUUJTZU5ON3M3YjZyUms9IjsKKworICAgIC8vIFRoaXMgaXMgYSBjZXJ0aWZpY2F0ZSBmb3IgY2xpZW50CisgICAgc3RhdGljIFN0cmluZyB0YXJnZXRDZXJ0U3RyX0Q9CisgICAgICAgICItLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS1cbiIgKworICAgICAgICAiTUlJQ1ZEQ0NBYjJnQXdJQkFnSUJCVEFOQmdrcWhraUc5dzBCQVFRRkFEQTdNUXN3Q1FZRFZRUUdFd0pWVXpFTlxuIiArCisgICAgICAgICJNQXNHQTFVRUNoTUVTbUYyWVRFZE1Cc0dBMVVFQ3hNVVUzVnVTbE5UUlNCVVpYTjBJRk5sY21sMlkyVXdIaGNOXG4iICsKKyAgICAgICAgIk1USXdOREUzTVRJd05qRXdXaGNOTXpJd01UQXpNVEl3TmpFd1dqQlVNUXN3Q1FZRFZRUUdFd0pWVXpFTk1Bc0dcbiIgKworICAgICAgICAiQTFVRUNoTUVTbUYyWVRFZE1Cc0dBMVVFQ3hNVVUzVnVTbE5UUlNCVVpYTjBJRk5sY21sMlkyVXhGekFWQmdOVlxuIiArCisgICAgICAgICJCQU1URGtsdWRHVnlUM0FnVkdWemRHVnlNSUdmTUEwR0NTcUdTSWIzRFFFQkFRVUFBNEdOQURDQmlRS0JnUURvXG4iICsKKyAgICAgICAgIlEvS29BSUFDMmxqRmZXMkt3am54VHppNE5RSmVVdWsyc2VxS3BzQVk4eDRPNWR2aXh6VWw2MTQyem1samFwcWlcbiIgKworICAgICAgICAiYkpsb1FWcGZCK0NFYzUvbDRoNWd6R1JWemt1cVAxb1B6RHJwWjVHc3ZtdnVIZW5WL1R6Q0lnWDFjTEVUelFWdFxuIiArCisgICAgICAgICI2UmswNm9rb0JQbnczaERKRUppRWMxUnY3SENFOHAvcCtTYWlIcnNrd3dJREFRQUJvMDh3VFRBTEJnTlZIUThFXG4iICsKKyAgICAgICAgIkJBTUNBK2d3SFFZRFZSME9CQllFRlByOTFPMzNSSUdmRlNxemEyQXdRSWdFNFFzd01COEdBMVVkSXdRWU1CYUFcbiIgKworICAgICAgICAiRkV0bVFpN2pUMWlqWE9hZlBzZmtyTHdTVnU5ZU1BMEdDU3FHU0liM0RRRUJCQVVBQTRHQkFOSURGWWdBaG9qM1xuIiArCisgICAgICAgICJCOHUxWXBxZW9FcDJMdDlUd3JZQnNoYUlyYm1CUEN3Q0dpbzBKSXNvb3YzbjhCQ1NnNUYrOE1uT3RQbCtUamVPXG4iICsKKyAgICAgICAgIjBVZys3Z3VQZENrL3dnOFlOeExIZ1NzUWxwY05KRGpXaUVycW1VUFZyZzVCUFBRYjY1cU11bmQ2S1RtTU4weTZcbiIgKworICAgICAgICAiNEViU214UnBaTy9OMC81b0s0dW1UazBFZVhLTmVrQmpcbiIgKworICAgICAgICAiLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLSI7CisKKyAgICBzdGF0aWMgU3RyaW5nIHRhcmdldFByaXZhdGVLZXlfRCA9CisgICAgICAgICJNSUlDZFFJQkFEQU5CZ2txaGtpRzl3MEJBUUVGQUFTQ0FsOHdnZ0piQWdFQUFvR0JBT2hEOHFnQWdBTGFXTVY5XG4iICsKKyAgICAgICAgImJZckNPZkZQT0xnMUFsNVM2VGF4Nm9xbXdCanpIZzdsMitMSE5TWHJYamJPYVdOcW1xSnNtV2hCV2w4SDRJUnpcbiIgKworICAgICAgICAibitYaUhtRE1aRlhPUzZvL1dnL01PdWxua2F5K2ErNGQ2ZFg5UE1JaUJmVndzUlBOQlczcEdUVHFpU2dFK2ZEZVxuIiArCisgICAgICAgICJFTWtRbUlSelZHL3NjSVR5bituNUpxSWV1eVREQWdNQkFBRUNnWUJ3Mzd5SUtwNExST05KTG5oU3E2c08rMG44XG4iICsKKyAgICAgICAgIk16NndhaWlOL1E2WFRRd2owOXB5c1FBWUNHbHF3U1JyREFxcFZzQkpXTytBZStvWUxyTE1pNGhVWm53Tjc1djNcbiIgKworICAgICAgICAicGUxblhsckQxMVJtUExYd0J4cUZ4TlN2QXMyRmdMSFpFdHdISTdCbjhLeWJULzhiR2tROGNzTGNlSW5ZdE1ERFxuIiArCisgICAgICAgICJNdVR5eTJLUmsvcGo2MHpJS1FKQkFQZ2ViUWlBSDZ2aUZRODhBd0hhTnZRaGxVZndtU0MxaTZmOExWb2VxYUhDXG4iICsKKyAgICAgICAgImxuUDBMSkJ3bHlEZWVFSW5oSHJDUjJpYm5DQjZJL1BpZys0OVhRZ2FiSzhDUVFEdnBKd3VHRWJzT08rM3JrSkpcbiIgKworICAgICAgICAiT3BPdzR0b0cwUUpaZFJuVDZsOEk2Qmxib1FSWlNmRmgrbEdHYWh2RlhreGM0S2RVcEo3UVB0WFU3SEhrNkh1a1xuIiArCisgICAgICAgICI4Ull0QWtBOUNXOFZHait3VHV1VFZkWC9qS2pjSWE3UmhiU0Z3V05icmNPU1dkeXMrR3QrbHVDbm42cnQ0UXlBXG4iICsKKyAgICAgICAgImFheERicXVXWmtGZ0Urdm9RUjduYXAwS00wWHRBa0F6bmQwV0FKeW1ITTFsWHQ5Z0xvSEpROU42VEdLWktpUGFcbiIgKworICAgICAgICAiQlUxYStjTWNmVjRXYlZyVW83b1RuWjlGcjczNjgxaVhYcTNtWk9KaDdsdkoxbGxyZVpJeEFrQkVuYmlUZ0VmNFxuIiArCisgICAgICAgICJ0dmt1NjhqSGNSYlJQbWRTN0NCU1dORUJhSExPbTRwVVNUY3hWVEtLTUh3N3ZtTTUvVVlVeEo4UU5LQ1l4bjZPXG4iICsKKyAgICAgICAgIit2dGlCd0Jhd3d6TiI7CisKKyAgICBzdGF0aWMgU3RyaW5nW10gc2VydmVyQ2VydHMgPSB7dGFyZ2V0Q2VydFN0cl9BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRDZXJ0U3RyX0IsIHRhcmdldENlcnRTdHJfQ307CisgICAgc3RhdGljIFN0cmluZ1tdIHNlcnZlcktleXMgID0ge3RhcmdldFByaXZhdGVLZXlfQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0UHJpdmF0ZUtleV9CLCB0YXJnZXRQcml2YXRlS2V5X0N9OworICAgIHN0YXRpYyBTdHJpbmdbXSBjbGllbnRDZXJ0cyA9IHt0YXJnZXRDZXJ0U3RyX0R9OworICAgIHN0YXRpYyBTdHJpbmdbXSBjbGllbnRLZXlzICA9IHt0YXJnZXRQcml2YXRlS2V5X0R9OworCisgICAgc3RhdGljIGNoYXIgcGFzc3BocmFzZVtdID0gInBhc3NwaHJhc2UiLnRvQ2hhckFycmF5KCk7CisKKyAgICAvKgorICAgICAqIElzIHRoZSBzZXJ2ZXIgcmVhZHkgdG8gc2VydmU/CisgICAgICovCisgICAgdm9sYXRpbGUgc3RhdGljIGJvb2xlYW4gc2VydmVyUmVhZHkgPSBmYWxzZTsKKworICAgIC8qCisgICAgICogVHVybiBvbiBTU0wgZGVidWdnaW5nPworICAgICAqLworICAgIHN0YXRpYyBib29sZWFuIGRlYnVnID0gZmFsc2U7CisKKyAgICAvKgorICAgICAqIERlZmluZSB0aGUgc2VydmVyIHNpZGUgb2YgdGhlIHRlc3QuCisgICAgICoKKyAgICAgKiBJZiB0aGUgc2VydmVyIHByZW1hdHVyZWx5IGV4aXRzLCBzZXJ2ZXJSZWFkeSB3aWxsIGJlIHNldCB0byB0cnVlCisgICAgICogdG8gYXZvaWQgaW5maW5pdGUgaGFuZ3MuCisgICAgICovCisgICAgdm9pZCBkb1NlcnZlclNpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU1NMQ29udGV4dCBjb250ZXh0ID0gZ2VuZXJhdGVTU0xDb250ZXh0KGZhbHNlKTsKKyAgICAgICAgU1NMU2VydmVyU29ja2V0RmFjdG9yeSBzc2xzc2YgPSBjb250ZXh0LmdldFNlcnZlclNvY2tldEZhY3RvcnkoKTsKKyAgICAgICAgU1NMU2VydmVyU29ja2V0IHNzbFNlcnZlclNvY2tldCA9CisgICAgICAgICAgICAoU1NMU2VydmVyU29ja2V0KXNzbHNzZi5jcmVhdGVTZXJ2ZXJTb2NrZXQoc2VydmVyUG9ydCk7CisgICAgICAgIHNlcnZlclBvcnQgPSBzc2xTZXJ2ZXJTb2NrZXQuZ2V0TG9jYWxQb3J0KCk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogU2lnbmFsIENsaWVudCwgd2UncmUgcmVhZHkgZm9yIGhpcyBjb25uZWN0LgorICAgICAgICAgKi8KKyAgICAgICAgc2VydmVyUmVhZHkgPSB0cnVlOworCisgICAgICAgIFNTTFNvY2tldCBzc2xTb2NrZXQgPSAoU1NMU29ja2V0KXNzbFNlcnZlclNvY2tldC5hY2NlcHQoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIElucHV0U3RyZWFtIHNzbElTID0gc3NsU29ja2V0LmdldElucHV0U3RyZWFtKCk7CisgICAgICAgICAgICBPdXRwdXRTdHJlYW0gc3NsT1MgPSBzc2xTb2NrZXQuZ2V0T3V0cHV0U3RyZWFtKCk7CisKKyAgICAgICAgICAgIHNzbElTLnJlYWQoKTsKKyAgICAgICAgICAgIHNzbE9TLndyaXRlKCdBJyk7CisgICAgICAgICAgICBzc2xPUy5mbHVzaCgpOworCisgICAgICAgICAgICBTU0xTZXNzaW9uIHNlc3Npb24gPSBzc2xTb2NrZXQuZ2V0U2Vzc2lvbigpOworICAgICAgICAgICAgY2hlY2tDZXJ0aWZpY2F0ZShzZXNzaW9uLmdldExvY2FsQ2VydGlmaWNhdGVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRSZXF1ZXN0ZWRIb3N0bmFtZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBzc2xTb2NrZXQuY2xvc2UoKTsKKyAgICAgICAgICAgIHNzbFNlcnZlclNvY2tldC5jbG9zZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBEZWZpbmUgdGhlIGNsaWVudCBzaWRlIG9mIHRoZSB0ZXN0LgorICAgICAqCisgICAgICogSWYgdGhlIHNlcnZlciBwcmVtYXR1cmVseSBleGl0cywgc2VydmVyUmVhZHkgd2lsbCBiZSBzZXQgdG8gdHJ1ZQorICAgICAqIHRvIGF2b2lkIGluZmluaXRlIGhhbmdzLgorICAgICAqLworICAgIHZvaWQgZG9DbGllbnRTaWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogV2FpdCBmb3Igc2VydmVyIHRvIGdldCBzdGFydGVkLgorICAgICAgICAgKi8KKyAgICAgICAgd2hpbGUgKCFzZXJ2ZXJSZWFkeSkgeworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDUwKTsKKyAgICAgICAgfQorCisgICAgICAgIFNTTENvbnRleHQgY29udGV4dCA9IGdlbmVyYXRlU1NMQ29udGV4dCh0cnVlKTsKKyAgICAgICAgU1NMU29ja2V0RmFjdG9yeSBzc2xzZiA9IGNvbnRleHQuZ2V0U29ja2V0RmFjdG9yeSgpOworCisgICAgICAgIFNTTFNvY2tldCBzc2xTb2NrZXQgPQorICAgICAgICAgICAgKFNTTFNvY2tldClzc2xzZi5jcmVhdGVTb2NrZXQoImxvY2FsaG9zdCIsIHNlcnZlclBvcnQpOworCisgICAgICAgIFNOSUhvc3ROYW1lIHNlcnZlck5hbWUgPSBuZXcgU05JSG9zdE5hbWUoY2xpZW50UmVxdWVzdGVkSG9zdG5hbWUpOworICAgICAgICBMaXN0PFNOSVNlcnZlck5hbWU+IHNlcnZlck5hbWVzID0gbmV3IEFycmF5TGlzdDw+KDEpOworICAgICAgICBzZXJ2ZXJOYW1lcy5hZGQoc2VydmVyTmFtZSk7CisgICAgICAgIFNTTFBhcmFtZXRlcnMgcGFyYW1zID0gc3NsU29ja2V0LmdldFNTTFBhcmFtZXRlcnMoKTsKKyAgICAgICAgcGFyYW1zLnNldFNlcnZlck5hbWVzKHNlcnZlck5hbWVzKTsKKyAgICAgICAgc3NsU29ja2V0LnNldFNTTFBhcmFtZXRlcnMocGFyYW1zKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgSW5wdXRTdHJlYW0gc3NsSVMgPSBzc2xTb2NrZXQuZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIE91dHB1dFN0cmVhbSBzc2xPUyA9IHNzbFNvY2tldC5nZXRPdXRwdXRTdHJlYW0oKTsKKworICAgICAgICAgICAgc3NsT1Mud3JpdGUoJ0InKTsKKyAgICAgICAgICAgIHNzbE9TLmZsdXNoKCk7CisgICAgICAgICAgICBzc2xJUy5yZWFkKCk7CisKKyAgICAgICAgICAgIFNTTFNlc3Npb24gc2Vzc2lvbiA9IHNzbFNvY2tldC5nZXRTZXNzaW9uKCk7CisgICAgICAgICAgICBjaGVja0NlcnRpZmljYXRlKHNlc3Npb24uZ2V0UGVlckNlcnRpZmljYXRlcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50UmVxdWVzdGVkSG9zdG5hbWUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgc3NsU29ja2V0LmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrQ2VydGlmaWNhdGUoQ2VydGlmaWNhdGVbXSBjZXJ0cywKKyAgICAgICAgICAgIFN0cmluZyBob3N0bmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChjZXJ0cyAhPSBudWxsICYmIGNlcnRzLmxlbmd0aCAhPSAwKSB7CisgICAgICAgICAgICBYNTA5Q2VydGlmaWNhdGUgeDUwOUNlcnQgPSAoWDUwOUNlcnRpZmljYXRlKWNlcnRzWzBdOworCisgICAgICAgICAgICBTdHJpbmcgc3ViamVjdCA9IHg1MDlDZXJ0LmdldFN1YmplY3RYNTAwUHJpbmNpcGFsKCkuZ2V0TmFtZSgpOworCisgICAgICAgICAgICBpZiAoIXN1YmplY3QuY29udGFpbnMoaG9zdG5hbWUpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJOb3QgdGhlIGV4cGVjdGVkIGNlcnRpZmljYXRlOiAiICsgc3ViamVjdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgKiBUaGUgcmVtYWluZGVyIGlzIGp1c3Qgc3VwcG9ydCBzdHVmZgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyB0bUFsZ29yaXRobTsgICAgICAgICAgICAgLy8gdHJ1c3QgbWFuYWdlcgorICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBjbGllbnRSZXF1ZXN0ZWRIb3N0bmFtZTsgLy8gc2VydmVyIG5hbWUgaW5kaWNhdGlvbgorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwYXJzZUFyZ3VtZW50cyhTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIHRtQWxnb3JpdGhtID0gYXJnc1swXTsKKyAgICAgICAgY2xpZW50UmVxdWVzdGVkSG9zdG5hbWUgPSBhcmdzWzFdOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFNTTENvbnRleHQgZ2VuZXJhdGVTU0xDb250ZXh0KGJvb2xlYW4gaXNDbGllbnQpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBnZW5lcmF0ZSBjZXJ0aWZpY2F0ZSBmcm9tIGNlcnQgc3RyaW5nCisgICAgICAgIENlcnRpZmljYXRlRmFjdG9yeSBjZiA9IENlcnRpZmljYXRlRmFjdG9yeS5nZXRJbnN0YW5jZSgiWC41MDkiKTsKKworICAgICAgICAvLyBjcmVhdGUgYSBrZXkgc3RvcmUKKyAgICAgICAgS2V5U3RvcmUga3MgPSBLZXlTdG9yZS5nZXRJbnN0YW5jZSgiSktTIik7CisgICAgICAgIGtzLmxvYWQobnVsbCwgbnVsbCk7CisKKyAgICAgICAgLy8gaW1wb3J0IHRoZSB0cnVzZWQgY2VydAorICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBpcyA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh0cnVzdGVkQ2VydFN0ci5nZXRCeXRlcygpKTsKKyAgICAgICAgQ2VydGlmaWNhdGUgdHJ1c2VkQ2VydCA9IGNmLmdlbmVyYXRlQ2VydGlmaWNhdGUoaXMpOworICAgICAgICBpcy5jbG9zZSgpOworCisgICAgICAgIGtzLnNldENlcnRpZmljYXRlRW50cnkoIlJTQSBFeHBvcnQgU2lnbmVyIiwgdHJ1c2VkQ2VydCk7CisKKyAgICAgICAgU3RyaW5nW10gY2VydFN0cnMgPSBudWxsOworICAgICAgICBTdHJpbmdbXSBrZXlTdHJzID0gbnVsbDsKKyAgICAgICAgaWYgKGlzQ2xpZW50KSB7CisgICAgICAgICAgICBjZXJ0U3RycyA9IGNsaWVudENlcnRzOworICAgICAgICAgICAga2V5U3RycyA9IGNsaWVudEtleXM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjZXJ0U3RycyA9IHNlcnZlckNlcnRzOworICAgICAgICAgICAga2V5U3RycyA9IHNlcnZlcktleXM7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNlcnRTdHJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAvLyBnZW5lcmF0ZSB0aGUgcHJpdmF0ZSBrZXkuCisgICAgICAgICAgICBTdHJpbmcga2V5U3BlY1N0ciA9IGtleVN0cnNbaV07CisgICAgICAgICAgICBQS0NTOEVuY29kZWRLZXlTcGVjIHByaUtleVNwZWMgPSBuZXcgUEtDUzhFbmNvZGVkS2V5U3BlYygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJBU0U2NERlY29kZXIoKS5kZWNvZGVCdWZmZXIoa2V5U3BlY1N0cikpOworICAgICAgICAgICAgS2V5RmFjdG9yeSBrZiA9IEtleUZhY3RvcnkuZ2V0SW5zdGFuY2UoIlJTQSIpOworICAgICAgICAgICAgUlNBUHJpdmF0ZUtleSBwcmlLZXkgPQorICAgICAgICAgICAgICAgICAgICAoUlNBUHJpdmF0ZUtleSlrZi5nZW5lcmF0ZVByaXZhdGUocHJpS2V5U3BlYyk7CisKKyAgICAgICAgICAgIC8vIGdlbmVyYXRlIGNlcnRpZmljYXRlIGNoYWluCisgICAgICAgICAgICBTdHJpbmcga2V5Q2VydFN0ciA9IGNlcnRTdHJzW2ldOworICAgICAgICAgICAgaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oa2V5Q2VydFN0ci5nZXRCeXRlcygpKTsKKyAgICAgICAgICAgIENlcnRpZmljYXRlIGtleUNlcnQgPSBjZi5nZW5lcmF0ZUNlcnRpZmljYXRlKGlzKTsKKyAgICAgICAgICAgIGlzLmNsb3NlKCk7CisKKyAgICAgICAgICAgIENlcnRpZmljYXRlW10gY2hhaW4gPSBuZXcgQ2VydGlmaWNhdGVbMl07CisgICAgICAgICAgICBjaGFpblswXSA9IGtleUNlcnQ7CisgICAgICAgICAgICBjaGFpblsxXSA9IHRydXNlZENlcnQ7CisKKyAgICAgICAgICAgIC8vIGltcG9ydCB0aGUga2V5IGVudHJ5LgorICAgICAgICAgICAga3Muc2V0S2V5RW50cnkoImtleS1lbnRyeS0iICsgaSwgcHJpS2V5LCBwYXNzcGhyYXNlLCBjaGFpbik7CisgICAgICAgIH0KKworICAgICAgICAvLyBjcmVhdGUgU1NMIGNvbnRleHQKKyAgICAgICAgVHJ1c3RNYW5hZ2VyRmFjdG9yeSB0bWYgPSBUcnVzdE1hbmFnZXJGYWN0b3J5LmdldEluc3RhbmNlKHRtQWxnb3JpdGhtKTsKKyAgICAgICAgdG1mLmluaXQoa3MpOworCisgICAgICAgIFNTTENvbnRleHQgY3R4ID0gU1NMQ29udGV4dC5nZXRJbnN0YW5jZSgiVExTIik7CisgICAgICAgIEtleU1hbmFnZXJGYWN0b3J5IGttZiA9IEtleU1hbmFnZXJGYWN0b3J5LmdldEluc3RhbmNlKCJOZXdTdW5YNTA5Iik7CisgICAgICAgIGttZi5pbml0KGtzLCBwYXNzcGhyYXNlKTsKKworICAgICAgICBjdHguaW5pdChrbWYuZ2V0S2V5TWFuYWdlcnMoKSwgdG1mLmdldFRydXN0TWFuYWdlcnMoKSwgbnVsbCk7CisgICAgICAgIGtzID0gbnVsbDsKKworICAgICAgICByZXR1cm4gY3R4OworICAgIH0KKworICAgIC8vIHVzZSBhbnkgZnJlZSBwb3J0IGJ5IGRlZmF1bHQKKyAgICB2b2xhdGlsZSBpbnQgc2VydmVyUG9ydCA9IDA7CisKKyAgICB2b2xhdGlsZSBFeGNlcHRpb24gc2VydmVyRXhjZXB0aW9uID0gbnVsbDsKKyAgICB2b2xhdGlsZSBFeGNlcHRpb24gY2xpZW50RXhjZXB0aW9uID0gbnVsbDsKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoZGVidWcpCisgICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImphdmF4Lm5ldC5kZWJ1ZyIsICJhbGwiKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBHZXQgdGhlIGN1c3RvbWl6ZWQgYXJndW1lbnRzLgorICAgICAgICAgKi8KKyAgICAgICAgcGFyc2VBcmd1bWVudHMoYXJncyk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogU3RhcnQgdGhlIHRlc3RzLgorICAgICAgICAgKi8KKyAgICAgICAgbmV3IFNTTFNvY2tldFNOSVNlbnNpdGl2ZSgpOworICAgIH0KKworICAgIFRocmVhZCBjbGllbnRUaHJlYWQgPSBudWxsOworICAgIFRocmVhZCBzZXJ2ZXJUaHJlYWQgPSBudWxsOworCisgICAgLyoKKyAgICAgKiBQcmltYXJ5IGNvbnN0cnVjdG9yLCB1c2VkIHRvIGRyaXZlIHJlbWFpbmRlciBvZiB0aGUgdGVzdC4KKyAgICAgKgorICAgICAqIEZvcmsgb2ZmIHRoZSBvdGhlciBzaWRlLCB0aGVuIGRvIHlvdXIgd29yay4KKyAgICAgKi8KKyAgICBTU0xTb2NrZXRTTklTZW5zaXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChzZXBhcmF0ZVNlcnZlclRocmVhZCkgeworICAgICAgICAgICAgICAgIHN0YXJ0U2VydmVyKHRydWUpOworICAgICAgICAgICAgICAgIHN0YXJ0Q2xpZW50KGZhbHNlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3RhcnRDbGllbnQodHJ1ZSk7CisgICAgICAgICAgICAgICAgc3RhcnRTZXJ2ZXIoZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gc3dhbGxvdyBmb3Igbm93LiAgU2hvdyBsYXRlcgorICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogV2FpdCBmb3Igb3RoZXIgc2lkZSB0byBjbG9zZSBkb3duLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHNlcGFyYXRlU2VydmVyVGhyZWFkKSB7CisgICAgICAgICAgICBzZXJ2ZXJUaHJlYWQuam9pbigpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2xpZW50VGhyZWFkLmpvaW4oKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIFdoZW4gd2UgZ2V0IGhlcmUsIHRoZSB0ZXN0IGlzIHByZXR0eSBtdWNoIG92ZXIuCisgICAgICAgICAqIFdoaWNoIHNpZGUgdGhyZXcgdGhlIGVycm9yPworICAgICAgICAgKi8KKyAgICAgICAgRXhjZXB0aW9uIGxvY2FsOworICAgICAgICBFeGNlcHRpb24gcmVtb3RlOworICAgICAgICBTdHJpbmcgd2hpY2hSZW1vdGU7CisKKyAgICAgICAgaWYgKHNlcGFyYXRlU2VydmVyVGhyZWFkKSB7CisgICAgICAgICAgICByZW1vdGUgPSBzZXJ2ZXJFeGNlcHRpb247CisgICAgICAgICAgICBsb2NhbCA9IGNsaWVudEV4Y2VwdGlvbjsKKyAgICAgICAgICAgIHdoaWNoUmVtb3RlID0gInNlcnZlciI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZW1vdGUgPSBjbGllbnRFeGNlcHRpb247CisgICAgICAgICAgICBsb2NhbCA9IHNlcnZlckV4Y2VwdGlvbjsKKyAgICAgICAgICAgIHdoaWNoUmVtb3RlID0gImNsaWVudCI7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBJZiBib3RoIGZhaWxlZCwgcmV0dXJuIHRoZSBjdXJ0aHJlYWQncyBleGNlcHRpb24sIGJ1dCBhbHNvCisgICAgICAgICAqIHByaW50IHRoZSByZW1vdGUgc2lkZSBFeGNlcHRpb24KKyAgICAgICAgICovCisgICAgICAgIGlmICgobG9jYWwgIT0gbnVsbCkgJiYgKHJlbW90ZSAhPSBudWxsKSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHdoaWNoUmVtb3RlICsgIiBhbHNvIHRocmV3OiIpOworICAgICAgICAgICAgcmVtb3RlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7CisgICAgICAgICAgICB0aHJvdyBsb2NhbDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZW1vdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgcmVtb3RlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGxvY2FsICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IGxvY2FsOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBzdGFydFNlcnZlcihib29sZWFuIG5ld1RocmVhZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChuZXdUaHJlYWQpIHsKKyAgICAgICAgICAgIHNlcnZlclRocmVhZCA9IG5ldyBUaHJlYWQoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgZG9TZXJ2ZXJTaWRlKCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgICAgICogT3VyIHNlcnZlciB0aHJlYWQganVzdCBkaWVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIFJlbGVhc2UgdGhlIGNsaWVudCwgaWYgbm90IGFjdGl2ZSBhbHJlYWR5Li4uCisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiU2VydmVyIGRpZWQuLi4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlclJlYWR5ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlckV4Y2VwdGlvbiA9IGU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgc2VydmVyVGhyZWFkLnN0YXJ0KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGRvU2VydmVyU2lkZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBzZXJ2ZXJFeGNlcHRpb24gPSBlOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBzZXJ2ZXJSZWFkeSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHN0YXJ0Q2xpZW50KGJvb2xlYW4gbmV3VGhyZWFkKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG5ld1RocmVhZCkgeworICAgICAgICAgICAgY2xpZW50VGhyZWFkID0gbmV3IFRocmVhZCgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkb0NsaWVudFNpZGUoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBPdXIgY2xpZW50IHRocmVhZCBqdXN0IGRpZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiQ2xpZW50IGRpZWQuLi4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudEV4Y2VwdGlvbiA9IGU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgY2xpZW50VGhyZWFkLnN0YXJ0KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGRvQ2xpZW50U2lkZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBjbGllbnRFeGNlcHRpb24gPSBlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L3NzbC90ZW1wbGF0ZXMvU1NMQ2FwYWJpbGl0aWVzLmphdmEgYi9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvc3NsL3RlbXBsYXRlcy9TU0xDYXBhYmlsaXRpZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmVhMzYwCi0tLSAvZGV2L251bGwKKysrIGIvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L3NzbC90ZW1wbGF0ZXMvU1NMQ2FwYWJpbGl0aWVzLmphdmEKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgT3JhY2xlIGRlc2lnbmF0ZXMgdGhpcworICogcGFydGljdWxhciBmaWxlIGFzIHN1YmplY3QgdG8gdGhlICJDbGFzc3BhdGgiIGV4Y2VwdGlvbiBhcyBwcm92aWRlZAorICogYnkgT3JhY2xlIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisgKgorICogVGhpcyBjb2RlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZCBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQKKyAqIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCisgKiBvciB2aXNpdCB3d3cub3JhY2xlLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yIGhhdmUgYW55CisgKiBxdWVzdGlvbnMuCisgKi8KKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmF4Lm5ldC5zc2wuU05JU2VydmVyTmFtZTsKKworLyoqCisgKiBFbmNhcHN1bGF0ZXMgdGhlIHNlY3VyaXR5IGNhcGFiaWxpdGllcyBvZiBhbiBTU0wvVExTIGNvbm5lY3Rpb24uCisgKiA8UD4KKyAqIFRoZSBzZWN1cml0eSBjYXBhYmlsaXRpZXMgYXJlIHRoZSBsaXN0IG9mIGNpcGhlcnN1aXRlcyB0byBiZSBhY2NlcHRlZCBpbgorICogYW4gU1NML1RMUyBoYW5kc2hha2UsIHRoZSByZWNvcmQgdmVyc2lvbiwgdGhlIGhlbGxvIHZlcnNpb24sIGFuZCBzZXJ2ZXIKKyAqIG5hbWUgaW5kaWNhdGlvbiwgZXRjLiwgb2YgYW4gU1NML1RMUyBjb25uZWN0aW9uLgorICogPFA+CisgKiA8Y29kZT5TU0xDYXBhYmlsaXRpZXM8L2NvZGU+IGNhbiBiZSByZXRyaWV2ZWQgYnkgZXhwbG9yaW5nIHRoZSBuZXR3b3JrCisgKiBkYXRhIG9mIGFuIFNTTC9UTFMgY29ubmVjdGlvbiB2aWEge0BsaW5rIFNTTEV4cGxvcmVyI2V4cGxvcmUoQnl0ZUJ1ZmZlcil9CisgKiBvciB7QGxpbmsgU1NMRXhwbG9yZXIjZXhwbG9yZShieXRlW10sIGludCwgaW50KX0uCisgKgorICogQHNlZSBTU0xFeHBsb3JlcgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU1NMQ2FwYWJpbGl0aWVzIHsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHJlY29yZCB2ZXJzaW9uIG9mIGFuIFNTTC9UTFMgY29ubmVjdGlvbgorICAgICAqCisgICAgICogQHJldHVybiBhIG5vbi1udWxsIHJlY29yZCB2ZXJzaW9uCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRSZWNvcmRWZXJzaW9uKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBoZWxsbyB2ZXJzaW9uIG9mIGFuIFNTTC9UTFMgY29ubmVjdGlvbgorICAgICAqCisgICAgICogQHJldHVybiBhIG5vbi1udWxsIGhlbGxvIHZlcnNpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldEhlbGxvVmVyc2lvbigpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIDxjb2RlPkxpc3Q8L2NvZGU+IGNvbnRhaW5pbmcgYWxsIHtAbGluayBTTklTZXJ2ZXJOYW1lfXMKKyAgICAgKiBvZiB0aGUgc2VydmVyIG5hbWUgaW5kaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBub24tbnVsbCBpbW11dGFibGUgbGlzdCBvZiB7QGxpbmsgU05JU2VydmVyTmFtZX1zCisgICAgICogICAgICAgICBvZiB0aGUgc2VydmVyIG5hbWUgaW5kaWNhdGlvbiBwYXJhbWV0ZXIsIG1heSBiZSBlbXB0eQorICAgICAqICAgICAgICAgaWYgbm8gc2VydmVyIG5hbWUgaW5kaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEBzZWUgU05JU2VydmVyTmFtZQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBMaXN0PFNOSVNlcnZlck5hbWU+IGdldFNlcnZlck5hbWVzKCk7Cit9CisKZGlmZiAtLWdpdCBhL2pkay90ZXN0L3N1bi9zZWN1cml0eS9zc2wvdGVtcGxhdGVzL1NTTEV4cGxvcmVyLmphdmEgYi9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvc3NsL3RlbXBsYXRlcy9TU0xFeHBsb3Jlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliOTEyYzgKLS0tIC9kZXYvbnVsbAorKysgYi9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvc3NsL3RlbXBsYXRlcy9TU0xFeHBsb3Jlci5qYXZhCkBAIC0wLDAgKzEsNjE1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzCisgKiBwYXJ0aWN1bGFyIGZpbGUgYXMgc3ViamVjdCB0byB0aGUgIkNsYXNzcGF0aCIgZXhjZXB0aW9uIGFzIHByb3ZpZGVkCisgKiBieSBPcmFjbGUgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKKyAqIHF1ZXN0aW9ucy4KKyAqLworCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5CdWZmZXJVbmRlcmZsb3dFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5uZXQuc3NsLio7CitpbXBvcnQgamF2YS51dGlsLio7CisKK2ltcG9ydCBzdW4ubWlzYy5IZXhEdW1wRW5jb2RlcjsKKworLyoqCisgKiBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBhY3RzIGFzIGFuIGV4cGxvcmVyIG9mIHRoZSBuZXR3b3JrIGRhdGEgb2YgYW4KKyAqIFNTTC9UTFMgY29ubmVjdGlvbi4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFNTTEV4cGxvcmVyIHsKKworICAgIC8vIFByaXZhdGUgY29uc3RydWN0b3IgcHJldmVudHMgY29uc3RydWN0aW9uIG91dHNpZGUgdGhpcyBjbGFzcy4KKyAgICBwcml2YXRlIFNTTEV4cGxvcmVyKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBoZWFkZXIgc2l6ZSBvZiBUTFMvU1NMIHJlY29yZHMuCisgICAgICogPFA+CisgICAgICogVGhlIHZhbHVlIG9mIHRoaXMgY29uc3RhbnQgaXMge0B2YWx1ZX0uCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgUkVDT1JEX0hFQURFUl9TSVpFID0gMHgwNTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHJlcXVpcmVkIG51bWJlciBvZiBieXRlcyBpbiB0aGUge0Bjb2RlIHNvdXJjZX0KKyAgICAgKiB7QGxpbmsgQnl0ZUJ1ZmZlcn0gbmVjZXNzYXJ5IHRvIGV4cGxvcmUgU1NML1RMUyBjb25uZWN0aW9uLgorICAgICAqIDxQPgorICAgICAqIFRoaXMgbWV0aG9kIHRyaWVzIHRvIHBhcnNlIGFzIGZldyBieXRlcyBhcyBwb3NzaWJsZSBmcm9tCisgICAgICoge0Bjb2RlIHNvdXJjZX0gYnl0ZSBidWZmZXIgdG8gZ2V0IHRoZSBsZW5ndGggb2YgYW4KKyAgICAgKiBTU0wvVExTIHJlY29yZC4KKyAgICAgKiA8UD4KKyAgICAgKiBUaGlzIG1ldGhvZCBhY2Nlc3NlcyB0aGUge0Bjb2RlIHNvdXJjZX0gcGFyYW1ldGVyIGluIHJlYWQtb25seQorICAgICAqIG1vZGUsIGFuZCBkb2VzIG5vdCB1cGRhdGUgdGhlIGJ1ZmZlcidzIHByb3BlcnRpZXMgc3VjaCBhcyBjYXBhY2l0eSwKKyAgICAgKiBsaW1pdCwgcG9zaXRpb24sIGFuZCBtYXJrIHZhbHVlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgc291cmNlCisgICAgICogICAgICAgICBhIHtAbGluayBCeXRlQnVmZmVyfSBjb250YWluaW5nCisgICAgICogICAgICAgICBpbmJvdW5kIG9yIG91dGJvdW5kIG5ldHdvcmsgZGF0YSBmb3IgYW4gU1NML1RMUyBjb25uZWN0aW9uLgorICAgICAqIEB0aHJvd3MgQnVmZmVyVW5kZXJmbG93RXhjZXB0aW9uIGlmIGxlc3MgdGhhbiB7QGNvZGUgUkVDT1JEX0hFQURFUl9TSVpFfQorICAgICAqICAgICAgICAgYnl0ZXMgcmVtYWluaW5nIGluIHtAY29kZSBzb3VyY2V9CisgICAgICogQHJldHVybiB0aGUgcmVxdWlyZWQgc2l6ZSBpbiBieXRlIHRvIGV4cGxvcmUgYW4gU1NML1RMUyBjb25uZWN0aW9uCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgZ2V0UmVxdWlyZWRTaXplKEJ5dGVCdWZmZXIgc291cmNlKSB7CisKKyAgICAgICAgQnl0ZUJ1ZmZlciBpbnB1dCA9IHNvdXJjZS5kdXBsaWNhdGUoKTsKKworICAgICAgICAvLyBEbyB3ZSBoYXZlIGEgY29tcGxldGUgaGVhZGVyPworICAgICAgICBpZiAoaW5wdXQucmVtYWluaW5nKCkgPCBSRUNPUkRfSEVBREVSX1NJWkUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWZmZXJVbmRlcmZsb3dFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElzIGl0IGEgaGFuZHNoYWtlIG1lc3NhZ2U/CisgICAgICAgIGJ5dGUgZmlyc3RCeXRlID0gaW5wdXQuZ2V0KCk7CisgICAgICAgIGJ5dGUgc2Vjb25kQnl0ZSA9IGlucHV0LmdldCgpOworICAgICAgICBieXRlIHRoaXJkQnl0ZSA9IGlucHV0LmdldCgpOworICAgICAgICBpZiAoKGZpcnN0Qnl0ZSAmIDB4ODApICE9IDAgJiYgdGhpcmRCeXRlID09IDB4MDEpIHsKKyAgICAgICAgICAgIC8vIGxvb2tzIGxpa2UgYSBWMkNsaWVudEhlbGxvCisgICAgICAgICAgICAvLyByZXR1cm4gKCgoZmlyc3RCeXRlICYgMHg3RikgPDwgOCkgfCAoc2Vjb25kQnl0ZSAmIDB4RkYpKSArIDI7CisgICAgICAgICAgICByZXR1cm4gUkVDT1JEX0hFQURFUl9TSVpFOyAgIC8vIE9ubHkgbmVlZCB0aGUgaGVhZGVyIGZpZWxkcworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuICgoKGlucHV0LmdldCgpICYgMHhGRikgPDwgOCkgfCAoaW5wdXQuZ2V0KCkgJiAweEZGKSkgKyA1OworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgcmVxdWlyZWQgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSB7QGNvZGUgc291cmNlfSBieXRlIGFycmF5CisgICAgICogbmVjZXNzYXJ5IHRvIGV4cGxvcmUgU1NML1RMUyBjb25uZWN0aW9uLgorICAgICAqIDxQPgorICAgICAqIFRoaXMgbWV0aG9kIHRyaWVzIHRvIHBhcnNlIGFzIGZldyBieXRlcyBhcyBwb3NzaWJsZSBmcm9tCisgICAgICoge0Bjb2RlIHNvdXJjZX0gYnl0ZSBhcnJheSB0byBnZXQgdGhlIGxlbmd0aCBvZiBhbgorICAgICAqIFNTTC9UTFMgcmVjb3JkLgorICAgICAqCisgICAgICogQHBhcmFtICBzb3VyY2UKKyAgICAgKiAgICAgICAgIGEgYnl0ZSBhcnJheSBjb250YWluaW5nIGluYm91bmQgb3Igb3V0Ym91bmQgbmV0d29yayBkYXRhIGZvcgorICAgICAqICAgICAgICAgYW4gU1NML1RMUyBjb25uZWN0aW9uLgorICAgICAqIEBwYXJhbSAgb2Zmc2V0CisgICAgICogICAgICAgICB0aGUgc3RhcnQgb2Zmc2V0IGluIGFycmF5IHtAY29kZSBzb3VyY2V9IGF0IHdoaWNoIHRoZQorICAgICAqICAgICAgICAgbmV0d29yayBkYXRhIGlzIHJlYWQgZnJvbS4KKyAgICAgKiBAcGFyYW0gIGxlbmd0aAorICAgICAqICAgICAgICAgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbiBpZiBsZXNzIHRoYW4ge0Bjb2RlIFJFQ09SRF9IRUFERVJfU0laRX0KKyAgICAgKiAgICAgICAgIGJ5dGVzIHJlbWFpbmluZyBpbiB7QGNvZGUgc291cmNlfQorICAgICAqIEByZXR1cm4gdGhlIHJlcXVpcmVkIHNpemUgaW4gYnl0ZSB0byBleHBsb3JlIGFuIFNTTC9UTFMgY29ubmVjdGlvbgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IGdldFJlcXVpcmVkU2l6ZShieXRlW10gc291cmNlLAorICAgICAgICAgICAgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICBCeXRlQnVmZmVyIGJ5dGVCdWZmZXIgPQorICAgICAgICAgICAgQnl0ZUJ1ZmZlci53cmFwKHNvdXJjZSwgb2Zmc2V0LCBsZW5ndGgpLmFzUmVhZE9ubHlCdWZmZXIoKTsKKyAgICAgICAgcmV0dXJuIGdldFJlcXVpcmVkU2l6ZShieXRlQnVmZmVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMYXVuY2ggYW5kIGV4cGxvcmUgdGhlIHNlY3VyaXR5IGNhcGFiaWxpdGllcyBmcm9tIGJ5dGUgYnVmZmVyLgorICAgICAqIDxQPgorICAgICAqIFRoaXMgbWV0aG9kIHRyaWVzIHRvIHBhcnNlIGFzIGZldyByZWNvcmRzIGFzIHBvc3NpYmxlIGZyb20KKyAgICAgKiB7QGNvZGUgc291cmNlfSBieXRlIGJ1ZmZlciB0byBnZXQgdGhlIHtAbGluayBTU0xDYXBhYmlsaXRpZXN9CisgICAgICogb2YgYW4gU1NML1RMUyBjb25uZWN0aW9uLgorICAgICAqIDxQPgorICAgICAqIFBsZWFzZSBOT1RFIHRoYXQgdGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGFueSBoYW5kc2hha2luZworICAgICAqIG9jY3Vycy4gIFRoZSBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCBpcyBub3QgZGVmaW5lZCBpbiB0aGlzIHJlbGVhc2UKKyAgICAgKiBpZiB0aGUgaGFuZHNoYWtlIGhhcyBiZWd1biwgb3IgaGFzIGNvbXBsZXRlZC4KKyAgICAgKiA8UD4KKyAgICAgKiBUaGlzIG1ldGhvZCBhY2Nlc3NlcyB0aGUge0Bjb2RlIHNvdXJjZX0gcGFyYW1ldGVyIGluIHJlYWQtb25seQorICAgICAqIG1vZGUsIGFuZCBkb2VzIG5vdCB1cGRhdGUgdGhlIGJ1ZmZlcidzIHByb3BlcnRpZXMgc3VjaCBhcyBjYXBhY2l0eSwKKyAgICAgKiBsaW1pdCwgcG9zaXRpb24sIGFuZCBtYXJrIHZhbHVlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgc291cmNlCisgICAgICogICAgICAgICBhIHtAbGluayBCeXRlQnVmZmVyfSBjb250YWluaW5nCisgICAgICogICAgICAgICBpbmJvdW5kIG9yIG91dGJvdW5kIG5ldHdvcmsgZGF0YSBmb3IgYW4gU1NML1RMUyBjb25uZWN0aW9uLgorICAgICAqCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBvbiBuZXR3b3JrIGRhdGEgZXJyb3IKKyAgICAgKiBAdGhyb3dzIEJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbiBpZiBub3QgZW5vdWdoIHNvdXJjZSBieXRlcyBhdmFpbGFibGUKKyAgICAgKiAgICAgICAgIHRvIG1ha2UgYSBjb21wbGV0ZSBleHBsb3JhdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGV4cGxvcmVkIHtAbGluayBTU0xDYXBhYmlsaXRpZXN9IG9mIHRoZSBTU0wvVExTCisgICAgICogICAgICAgICBjb25uZWN0aW9uCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTU0xDYXBhYmlsaXRpZXMgZXhwbG9yZShCeXRlQnVmZmVyIHNvdXJjZSkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgQnl0ZUJ1ZmZlciBpbnB1dCA9IHNvdXJjZS5kdXBsaWNhdGUoKTsKKworICAgICAgICAvLyBEbyB3ZSBoYXZlIGEgY29tcGxldGUgaGVhZGVyPworICAgICAgICBpZiAoaW5wdXQucmVtYWluaW5nKCkgPCBSRUNPUkRfSEVBREVSX1NJWkUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWZmZXJVbmRlcmZsb3dFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElzIGl0IGEgaGFuZHNoYWtlIG1lc3NhZ2U/CisgICAgICAgIGJ5dGUgZmlyc3RCeXRlID0gaW5wdXQuZ2V0KCk7CisgICAgICAgIGJ5dGUgc2Vjb25kQnl0ZSA9IGlucHV0LmdldCgpOworICAgICAgICBieXRlIHRoaXJkQnl0ZSA9IGlucHV0LmdldCgpOworICAgICAgICBpZiAoKGZpcnN0Qnl0ZSAmIDB4ODApICE9IDAgJiYgdGhpcmRCeXRlID09IDB4MDEpIHsKKyAgICAgICAgICAgIC8vIGxvb2tzIGxpa2UgYSBWMkNsaWVudEhlbGxvCisgICAgICAgICAgICByZXR1cm4gZXhwbG9yZVYySGVsbG9SZWNvcmQoaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEJ5dGUsIHNlY29uZEJ5dGUsIHRoaXJkQnl0ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoZmlyc3RCeXRlID09IDIyKSB7ICAgLy8gMjI6IGhhbmRzaGFrZSByZWNvcmQKKyAgICAgICAgICAgIHJldHVybiBleHBsb3JlVExTUmVjb3JkKGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RCeXRlLCBzZWNvbmRCeXRlLCB0aGlyZEJ5dGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNTTEV4Y2VwdGlvbigiTm90IGhhbmRzaGFrZSByZWNvcmQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIExhdW5jaCBhbmQgZXhwbG9yZSB0aGUgc2VjdXJpdHkgY2FwYWJpbGl0aWVzIGZyb20gYnl0ZSBhcnJheS4KKyAgICAgKiA8UD4KKyAgICAgKiBQbGVhc2UgTk9URSB0aGF0IHRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBhbnkgaGFuZHNoYWtpbmcKKyAgICAgKiBvY2N1cnMuICBUaGUgYmVoYXZpb3Igb2YgdGhpcyBtZXRob2QgaXMgbm90IGRlZmluZWQgaW4gdGhpcyByZWxlYXNlCisgICAgICogaWYgdGhlIGhhbmRzaGFrZSBoYXMgYmVndW4sIG9yIGhhcyBjb21wbGV0ZWQuICBPbmNlIGhhbmRzaGFrZSBoYXMKKyAgICAgKiBiZWd1biwgb3IgaGFzIGNvbXBsZXRlZCwgdGhlIHNlY3VyaXR5IGNhcGFiaWxpdGllcyBjYW4gbm90IGFuZAorICAgICAqIHNob3VsZCBub3QgYmUgbGF1bmNoZWQgd2l0aCB0aGlzIG1ldGhvZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgc291cmNlCisgICAgICogICAgICAgICBhIGJ5dGUgYXJyYXkgY29udGFpbmluZyBpbmJvdW5kIG9yIG91dGJvdW5kIG5ldHdvcmsgZGF0YSBmb3IKKyAgICAgKiAgICAgICAgIGFuIFNTTC9UTFMgY29ubmVjdGlvbi4KKyAgICAgKiBAcGFyYW0gIG9mZnNldAorICAgICAqICAgICAgICAgdGhlIHN0YXJ0IG9mZnNldCBpbiBhcnJheSB7QGNvZGUgc291cmNlfSBhdCB3aGljaCB0aGUKKyAgICAgKiAgICAgICAgIG5ldHdvcmsgZGF0YSBpcyByZWFkIGZyb20uCisgICAgICogQHBhcmFtICBsZW5ndGgKKyAgICAgKiAgICAgICAgIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byByZWFkLgorICAgICAqCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBvbiBuZXR3b3JrIGRhdGEgZXJyb3IKKyAgICAgKiBAdGhyb3dzIEJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbiBpZiBub3QgZW5vdWdoIHNvdXJjZSBieXRlcyBhdmFpbGFibGUKKyAgICAgKiAgICAgICAgIHRvIG1ha2UgYSBjb21wbGV0ZSBleHBsb3JhdGlvbi4KKyAgICAgKiBAcmV0dXJuIHRoZSBleHBsb3JlZCB7QGxpbmsgU1NMQ2FwYWJpbGl0aWVzfSBvZiB0aGUgU1NML1RMUworICAgICAqICAgICAgICAgY29ubmVjdGlvbgorICAgICAqCisgICAgICogQHNlZSAjZXhwbG9yZShCeXRlQnVmZmVyKQorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU1NMQ2FwYWJpbGl0aWVzIGV4cGxvcmUoYnl0ZVtdIHNvdXJjZSwKKyAgICAgICAgICAgIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEJ5dGVCdWZmZXIgYnl0ZUJ1ZmZlciA9CisgICAgICAgICAgICBCeXRlQnVmZmVyLndyYXAoc291cmNlLCBvZmZzZXQsIGxlbmd0aCkuYXNSZWFkT25seUJ1ZmZlcigpOworICAgICAgICByZXR1cm4gZXhwbG9yZShieXRlQnVmZmVyKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIHVpbnQ4IFYyQ2lwaGVyU3BlY1szXTsKKyAgICAgKiBzdHJ1Y3QgeworICAgICAqICAgICB1aW50MTYgbXNnX2xlbmd0aDsgICAgICAgICAvLyBUaGUgaGlnaGVzdCBiaXQgTVVTVCBiZSAxOworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcmVtYWluaW5nIGJpdHMgY29udGFpbiB0aGUgbGVuZ3RoCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mIHRoZSBmb2xsb3dpbmcgZGF0YSBpbiBieXRlcy4KKyAgICAgKiAgICAgdWludDggbXNnX3R5cGU7ICAgICAgICAgICAgLy8gTVVTVCBiZSAxCisgICAgICogICAgIFZlcnNpb24gdmVyc2lvbjsKKyAgICAgKiAgICAgdWludDE2IGNpcGhlcl9zcGVjX2xlbmd0aDsgLy8gSXQgY2Fubm90IGJlIHplcm8gYW5kIE1VU1QgYmUgYQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtdWx0aXBsZSBvZiB0aGUgVjJDaXBoZXJTcGVjIGxlbmd0aC4KKyAgICAgKiAgICAgdWludDE2IHNlc3Npb25faWRfbGVuZ3RoOyAgLy8gVGhpcyBmaWVsZCBNVVNUIGJlIGVtcHR5LgorICAgICAqICAgICB1aW50MTYgY2hhbGxlbmdlX2xlbmd0aDsgICAvLyBTSE9VTEQgdXNlIGEgMzItYnl0ZSBjaGFsbGVuZ2UKKyAgICAgKiAgICAgVjJDaXBoZXJTcGVjIGNpcGhlcl9zcGVjc1tWMkNsaWVudEhlbGxvLmNpcGhlcl9zcGVjX2xlbmd0aF07CisgICAgICogICAgIG9wYXF1ZSBzZXNzaW9uX2lkW1YyQ2xpZW50SGVsbG8uc2Vzc2lvbl9pZF9sZW5ndGhdOworICAgICAqICAgICBvcGFxdWUgY2hhbGxlbmdlW1YyQ2xpZW50SGVsbG8uY2hhbGxlbmdlX2xlbmd0aDsKKyAgICAgKiB9IFYyQ2xpZW50SGVsbG87CisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU1NMQ2FwYWJpbGl0aWVzIGV4cGxvcmVWMkhlbGxvUmVjb3JkKAorICAgICAgICAgICAgQnl0ZUJ1ZmZlciBpbnB1dCwgYnl0ZSBmaXJzdEJ5dGUsIGJ5dGUgc2Vjb25kQnl0ZSwKKyAgICAgICAgICAgIGJ5dGUgdGhpcmRCeXRlKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIC8vIFdlIG9ubHkgbmVlZCB0aGUgaGVhZGVyLiBXZSBoYXZlIGFscmVhZHkgaGFkIGVub3VnaCBzb3VyY2UgYnl0ZXMuCisgICAgICAgIC8vIGludCByZWNvcmRMZW5ndGggPSAoZmlyc3RCeXRlICYgMHg3RikgPDwgOCkgfCAoc2Vjb25kQnl0ZSAmIDB4RkYpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gSXMgaXQgYSBWMkNsaWVudEhlbGxvPworICAgICAgICAgICAgaWYgKHRoaXJkQnl0ZSAhPSAweDAxKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNTTEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJVbnN1cHBvcnRlZCBvciBVbnJlY29nbml6ZWQgU1NMIHJlY29yZCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBXaGF0J3MgdGhlIGhlbGxvIHZlcnNpb24/CisgICAgICAgICAgICBieXRlIGhlbGxvVmVyc2lvbk1ham9yID0gaW5wdXQuZ2V0KCk7CisgICAgICAgICAgICBieXRlIGhlbGxvVmVyc2lvbk1pbm9yID0gaW5wdXQuZ2V0KCk7CisKKyAgICAgICAgICAgIC8vIDB4MDA6IG1ham9yIHZlcnNpb24gb2YgU1NMdjIwCisgICAgICAgICAgICAvLyAweDAyOiBtaW5vciB2ZXJzaW9uIG9mIFNTTHYyMAorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFNOSVNlcnZlck5hbWUgaXMgYW4gZXh0ZW5zaW9uLCBTU0x2MjAgZG9lc24ndCBzdXBwb3J0IGV4dGVuc2lvbi4KKyAgICAgICAgICAgIHJldHVybiBuZXcgU1NMQ2FwYWJpbGl0aWVzSW1wbCgoYnl0ZSkweDAwLCAoYnl0ZSkweDAyLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVsbG9WZXJzaW9uTWFqb3IsIGhlbGxvVmVyc2lvbk1pbm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuPFNOSVNlcnZlck5hbWU+ZW1wdHlMaXN0KCkpOworICAgICAgICB9IGNhdGNoIChCdWZmZXJVbmRlcmZsb3dFeGNlcHRpb24gYnVmZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNTTFByb3RvY29sRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgaGFuZHNoYWtlIHJlY29yZCIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBzdHJ1Y3QgeworICAgICAqICAgICB1aW50OCBtYWpvcjsKKyAgICAgKiAgICAgdWludDggbWlub3I7CisgICAgICogfSBQcm90b2NvbFZlcnNpb247CisgICAgICoKKyAgICAgKiBlbnVtIHsKKyAgICAgKiAgICAgY2hhbmdlX2NpcGhlcl9zcGVjKDIwKSwgYWxlcnQoMjEpLCBoYW5kc2hha2UoMjIpLAorICAgICAqICAgICBhcHBsaWNhdGlvbl9kYXRhKDIzKSwgKDI1NSkKKyAgICAgKiB9IENvbnRlbnRUeXBlOworICAgICAqCisgICAgICogc3RydWN0IHsKKyAgICAgKiAgICAgQ29udGVudFR5cGUgdHlwZTsKKyAgICAgKiAgICAgUHJvdG9jb2xWZXJzaW9uIHZlcnNpb247CisgICAgICogICAgIHVpbnQxNiBsZW5ndGg7CisgICAgICogICAgIG9wYXF1ZSBmcmFnbWVudFtUTFNQbGFpbnRleHQubGVuZ3RoXTsKKyAgICAgKiB9IFRMU1BsYWludGV4dDsKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTU0xDYXBhYmlsaXRpZXMgZXhwbG9yZVRMU1JlY29yZCgKKyAgICAgICAgICAgIEJ5dGVCdWZmZXIgaW5wdXQsIGJ5dGUgZmlyc3RCeXRlLCBieXRlIHNlY29uZEJ5dGUsCisgICAgICAgICAgICBieXRlIHRoaXJkQnl0ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBJcyBpdCBhIGhhbmRzaGFrZSBtZXNzYWdlPworICAgICAgICBpZiAoZmlyc3RCeXRlICE9IDIyKSB7ICAgICAgICAvLyAyMjogaGFuZHNoYWtlIHJlY29yZAorICAgICAgICAgICAgdGhyb3cgbmV3IFNTTEV4Y2VwdGlvbigiTm90IGhhbmRzaGFrZSByZWNvcmQiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFdlIG5lZWQgdGhlIHJlY29yZCB2ZXJzaW9uIHRvIGNvbnN0cnVjdCBTU0xDYXBhYmlsaXRpZXMuCisgICAgICAgIGJ5dGUgcmVjb3JkTWFqb3JWZXJzaW9uID0gc2Vjb25kQnl0ZTsKKyAgICAgICAgYnl0ZSByZWNvcmRNaW5vclZlcnNpb24gPSB0aGlyZEJ5dGU7CisKKyAgICAgICAgLy8gSXMgdGhlcmUgZW5vdWdoIGRhdGEgZm9yIGEgZnVsbCByZWNvcmQ/CisgICAgICAgIGludCByZWNvcmRMZW5ndGggPSBnZXRJbnQxNihpbnB1dCk7CisgICAgICAgIGlmIChyZWNvcmRMZW5ndGggPiBpbnB1dC5yZW1haW5pbmcoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgLy8gV2UgaGF2ZSBhbHJlYWR5IGhhZCBlbm91Z2ggc291cmNlIGJ5dGVzLgorICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGV4cGxvcmVIYW5kc2hha2UoaW5wdXQsCisgICAgICAgICAgICAgICAgcmVjb3JkTWFqb3JWZXJzaW9uLCByZWNvcmRNaW5vclZlcnNpb24sIHJlY29yZExlbmd0aCk7CisgICAgICAgIH0gY2F0Y2ggKEJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbiBidWZlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU1NMUHJvdG9jb2xFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBoYW5kc2hha2UgcmVjb3JkIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIGVudW0geworICAgICAqICAgICBoZWxsb19yZXF1ZXN0KDApLCBjbGllbnRfaGVsbG8oMSksIHNlcnZlcl9oZWxsbygyKSwKKyAgICAgKiAgICAgY2VydGlmaWNhdGUoMTEpLCBzZXJ2ZXJfa2V5X2V4Y2hhbmdlICgxMiksCisgICAgICogICAgIGNlcnRpZmljYXRlX3JlcXVlc3QoMTMpLCBzZXJ2ZXJfaGVsbG9fZG9uZSgxNCksCisgICAgICogICAgIGNlcnRpZmljYXRlX3ZlcmlmeSgxNSksIGNsaWVudF9rZXlfZXhjaGFuZ2UoMTYpLAorICAgICAqICAgICBmaW5pc2hlZCgyMCkKKyAgICAgKiAgICAgKDI1NSkKKyAgICAgKiB9IEhhbmRzaGFrZVR5cGU7CisgICAgICoKKyAgICAgKiBzdHJ1Y3QgeworICAgICAqICAgICBIYW5kc2hha2VUeXBlIG1zZ190eXBlOworICAgICAqICAgICB1aW50MjQgbGVuZ3RoOworICAgICAqICAgICBzZWxlY3QgKEhhbmRzaGFrZVR5cGUpIHsKKyAgICAgKiAgICAgICAgIGNhc2UgaGVsbG9fcmVxdWVzdDogICAgICAgSGVsbG9SZXF1ZXN0OworICAgICAqICAgICAgICAgY2FzZSBjbGllbnRfaGVsbG86ICAgICAgICBDbGllbnRIZWxsbzsKKyAgICAgKiAgICAgICAgIGNhc2Ugc2VydmVyX2hlbGxvOiAgICAgICAgU2VydmVySGVsbG87CisgICAgICogICAgICAgICBjYXNlIGNlcnRpZmljYXRlOiAgICAgICAgIENlcnRpZmljYXRlOworICAgICAqICAgICAgICAgY2FzZSBzZXJ2ZXJfa2V5X2V4Y2hhbmdlOiBTZXJ2ZXJLZXlFeGNoYW5nZTsKKyAgICAgKiAgICAgICAgIGNhc2UgY2VydGlmaWNhdGVfcmVxdWVzdDogQ2VydGlmaWNhdGVSZXF1ZXN0OworICAgICAqICAgICAgICAgY2FzZSBzZXJ2ZXJfaGVsbG9fZG9uZTogICBTZXJ2ZXJIZWxsb0RvbmU7CisgICAgICogICAgICAgICBjYXNlIGNlcnRpZmljYXRlX3ZlcmlmeTogIENlcnRpZmljYXRlVmVyaWZ5OworICAgICAqICAgICAgICAgY2FzZSBjbGllbnRfa2V5X2V4Y2hhbmdlOiBDbGllbnRLZXlFeGNoYW5nZTsKKyAgICAgKiAgICAgICAgIGNhc2UgZmluaXNoZWQ6ICAgICAgICAgICAgRmluaXNoZWQ7CisgICAgICogICAgIH0gYm9keTsKKyAgICAgKiB9IEhhbmRzaGFrZTsKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTU0xDYXBhYmlsaXRpZXMgZXhwbG9yZUhhbmRzaGFrZSgKKyAgICAgICAgICAgIEJ5dGVCdWZmZXIgaW5wdXQsIGJ5dGUgcmVjb3JkTWFqb3JWZXJzaW9uLAorICAgICAgICAgICAgYnl0ZSByZWNvcmRNaW5vclZlcnNpb24sIGludCByZWNvcmRMZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gV2hhdCBpcyB0aGUgaGFuZHNoYWtlIHR5cGU/CisgICAgICAgIGJ5dGUgaGFuZHNoYWtlVHlwZSA9IGlucHV0LmdldCgpOworICAgICAgICBpZiAoaGFuZHNoYWtlVHlwZSAhPSAweDAxKSB7ICAgLy8gMHgwMTogY2xpZW50X2hlbGxvIG1lc3NhZ2UKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk5vdCBpbml0aWFsIGhhbmRzaGFraW5nIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBXaGF0IGlzIHRoZSBoYW5kc2hha2UgYm9keSBsZW5ndGg/CisgICAgICAgIGludCBoYW5kc2hha2VMZW5ndGggPSBnZXRJbnQyNChpbnB1dCk7CisKKyAgICAgICAgLy8gVGhlb3JldGljYWxseSwgYSBzaW5nbGUgaGFuZHNoYWtlIG1lc3NhZ2UgbWlnaHQgc3BhbiBtdWx0aXBsZQorICAgICAgICAvLyByZWNvcmRzLCBidXQgaW4gcHJhY3RpY2UgdGhpcyBkb2VzIG5vdCBvY2N1ci4KKyAgICAgICAgaWYgKGhhbmRzaGFrZUxlbmd0aCA+IChyZWNvcmRMZW5ndGggLSA0KSkgeyAvLyA0OiBoYW5kc2hha2UgaGVhZGVyIHNpemUKKyAgICAgICAgICAgIHRocm93IG5ldyBTU0xFeGNlcHRpb24oIkhhbmRzaGFrZSBtZXNzYWdlIHNwYW5zIG11bHRpcGxlIHJlY29yZHMiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlucHV0ID0gaW5wdXQuZHVwbGljYXRlKCk7CisgICAgICAgIGlucHV0LmxpbWl0KGhhbmRzaGFrZUxlbmd0aCArIGlucHV0LnBvc2l0aW9uKCkpOworICAgICAgICByZXR1cm4gZXhwbG9yZUNsaWVudEhlbGxvKGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkTWFqb3JWZXJzaW9uLCByZWNvcmRNaW5vclZlcnNpb24pOworICAgIH0KKworICAgIC8qCisgICAgICogc3RydWN0IHsKKyAgICAgKiAgICAgdWludDMyIGdtdF91bml4X3RpbWU7CisgICAgICogICAgIG9wYXF1ZSByYW5kb21fYnl0ZXNbMjhdOworICAgICAqIH0gUmFuZG9tOworICAgICAqCisgICAgICogb3BhcXVlIFNlc3Npb25JRDwwLi4zMj47CisgICAgICoKKyAgICAgKiB1aW50OCBDaXBoZXJTdWl0ZVsyXTsKKyAgICAgKgorICAgICAqIGVudW0geyBudWxsKDApLCAoMjU1KSB9IENvbXByZXNzaW9uTWV0aG9kOworICAgICAqCisgICAgICogc3RydWN0IHsKKyAgICAgKiAgICAgUHJvdG9jb2xWZXJzaW9uIGNsaWVudF92ZXJzaW9uOworICAgICAqICAgICBSYW5kb20gcmFuZG9tOworICAgICAqICAgICBTZXNzaW9uSUQgc2Vzc2lvbl9pZDsKKyAgICAgKiAgICAgQ2lwaGVyU3VpdGUgY2lwaGVyX3N1aXRlczwyLi4yXjE2LTI+OworICAgICAqICAgICBDb21wcmVzc2lvbk1ldGhvZCBjb21wcmVzc2lvbl9tZXRob2RzPDEuLjJeOC0xPjsKKyAgICAgKiAgICAgc2VsZWN0IChleHRlbnNpb25zX3ByZXNlbnQpIHsKKyAgICAgKiAgICAgICAgIGNhc2UgZmFsc2U6CisgICAgICogICAgICAgICAgICAgc3RydWN0IHt9OworICAgICAqICAgICAgICAgY2FzZSB0cnVlOgorICAgICAqICAgICAgICAgICAgIEV4dGVuc2lvbiBleHRlbnNpb25zPDAuLjJeMTYtMT47CisgICAgICogICAgIH07CisgICAgICogfSBDbGllbnRIZWxsbzsKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTU0xDYXBhYmlsaXRpZXMgZXhwbG9yZUNsaWVudEhlbGxvKAorICAgICAgICAgICAgQnl0ZUJ1ZmZlciBpbnB1dCwKKyAgICAgICAgICAgIGJ5dGUgcmVjb3JkTWFqb3JWZXJzaW9uLAorICAgICAgICAgICAgYnl0ZSByZWNvcmRNaW5vclZlcnNpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgTGlzdDxTTklTZXJ2ZXJOYW1lPiBzbkxpc3QgPSBDb2xsZWN0aW9ucy48U05JU2VydmVyTmFtZT5lbXB0eUxpc3QoKTsKKworICAgICAgICAvLyBjbGllbnQgdmVyc2lvbgorICAgICAgICBieXRlIGhlbGxvTWFqb3JWZXJzaW9uID0gaW5wdXQuZ2V0KCk7CisgICAgICAgIGJ5dGUgaGVsbG9NaW5vclZlcnNpb24gPSBpbnB1dC5nZXQoKTsKKworICAgICAgICAvLyBpZ25vcmUgcmFuZG9tCisgICAgICAgIGludCBwb3NpdGlvbiA9IGlucHV0LnBvc2l0aW9uKCk7CisgICAgICAgIGlucHV0LnBvc2l0aW9uKHBvc2l0aW9uICsgMzIpOyAgLy8gMzI6IHRoZSBsZW5ndGggb2YgUmFuZG9tCisKKyAgICAgICAgLy8gaWdub3JlIHNlc3Npb24gaWQKKyAgICAgICAgaWdub3JlQnl0ZVZlY3RvcjgoaW5wdXQpOworCisgICAgICAgIC8vIGlnbm9yZSBjaXBoZXJfc3VpdGVzCisgICAgICAgIGlnbm9yZUJ5dGVWZWN0b3IxNihpbnB1dCk7CisKKyAgICAgICAgLy8gaWdub3JlIGNvbXByZXNzaW9uIG1ldGhvZHMKKyAgICAgICAgaWdub3JlQnl0ZVZlY3RvcjgoaW5wdXQpOworCisgICAgICAgIGlmIChpbnB1dC5yZW1haW5pbmcoKSA+IDApIHsKKyAgICAgICAgICAgIHNuTGlzdCA9IGV4cGxvcmVFeHRlbnNpb25zKGlucHV0KTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBuZXcgU1NMQ2FwYWJpbGl0aWVzSW1wbCgKKyAgICAgICAgICAgICAgICByZWNvcmRNYWpvclZlcnNpb24sIHJlY29yZE1pbm9yVmVyc2lvbiwKKyAgICAgICAgICAgICAgICBoZWxsb01ham9yVmVyc2lvbiwgaGVsbG9NaW5vclZlcnNpb24sIHNuTGlzdCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBzdHJ1Y3QgeworICAgICAqICAgICBFeHRlbnNpb25UeXBlIGV4dGVuc2lvbl90eXBlOworICAgICAqICAgICBvcGFxdWUgZXh0ZW5zaW9uX2RhdGE8MC4uMl4xNi0xPjsKKyAgICAgKiB9IEV4dGVuc2lvbjsKKyAgICAgKgorICAgICAqIGVudW0geworICAgICAqICAgICBzZXJ2ZXJfbmFtZSgwKSwgbWF4X2ZyYWdtZW50X2xlbmd0aCgxKSwKKyAgICAgKiAgICAgY2xpZW50X2NlcnRpZmljYXRlX3VybCgyKSwgdHJ1c3RlZF9jYV9rZXlzKDMpLAorICAgICAqICAgICB0cnVuY2F0ZWRfaG1hYyg0KSwgc3RhdHVzX3JlcXVlc3QoNSksICg2NTUzNSkKKyAgICAgKiB9IEV4dGVuc2lvblR5cGU7CisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxTTklTZXJ2ZXJOYW1lPiBleHBsb3JlRXh0ZW5zaW9ucyhCeXRlQnVmZmVyIGlucHV0KQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICBpbnQgbGVuZ3RoID0gZ2V0SW50MTYoaW5wdXQpOyAgICAgICAgICAgLy8gbGVuZ3RoIG9mIGV4dGVuc2lvbnMKKyAgICAgICAgd2hpbGUgKGxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgIGludCBleHRUeXBlID0gZ2V0SW50MTYoaW5wdXQpOyAgICAgIC8vIGV4dGVuc29uIHR5cGUKKyAgICAgICAgICAgIGludCBleHRMZW4gPSBnZXRJbnQxNihpbnB1dCk7ICAgICAgIC8vIGxlbmd0aCBvZiBleHRlbnNpb24gZGF0YQorCisgICAgICAgICAgICBpZiAoZXh0VHlwZSA9PSAweDAwKSB7ICAgICAgLy8gMHgwMDogdHlwZSBvZiBzZXJ2ZXIgbmFtZSBpbmRpY2F0aW9uCisgICAgICAgICAgICAgICAgcmV0dXJuIGV4cGxvcmVTTklFeHQoaW5wdXQsIGV4dExlbik7CisgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIG90aGVyIGV4dGVuc2lvbnMKKyAgICAgICAgICAgICAgICBpZ25vcmVCeXRlVmVjdG9yKGlucHV0LCBleHRMZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsZW5ndGggLT0gZXh0TGVuICsgNDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy48U05JU2VydmVyTmFtZT5lbXB0eUxpc3QoKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIHN0cnVjdCB7CisgICAgICogICAgIE5hbWVUeXBlIG5hbWVfdHlwZTsKKyAgICAgKiAgICAgc2VsZWN0IChuYW1lX3R5cGUpIHsKKyAgICAgKiAgICAgICAgIGNhc2UgaG9zdF9uYW1lOiBIb3N0TmFtZTsKKyAgICAgKiAgICAgfSBuYW1lOworICAgICAqIH0gU2VydmVyTmFtZTsKKyAgICAgKgorICAgICAqIGVudW0geworICAgICAqICAgICBob3N0X25hbWUoMCksICgyNTUpCisgICAgICogfSBOYW1lVHlwZTsKKyAgICAgKgorICAgICAqIG9wYXF1ZSBIb3N0TmFtZTwxLi4yXjE2LTE+OworICAgICAqCisgICAgICogc3RydWN0IHsKKyAgICAgKiAgICAgU2VydmVyTmFtZSBzZXJ2ZXJfbmFtZV9saXN0PDEuLjJeMTYtMT4KKyAgICAgKiB9IFNlcnZlck5hbWVMaXN0OworICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIExpc3Q8U05JU2VydmVyTmFtZT4gZXhwbG9yZVNOSUV4dChCeXRlQnVmZmVyIGlucHV0LAorICAgICAgICAgICAgaW50IGV4dExlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICBNYXA8SW50ZWdlciwgU05JU2VydmVyTmFtZT4gc25pTWFwID0gbmV3IExpbmtlZEhhc2hNYXA8PigpOworCisgICAgICAgIGludCByZW1haW5zID0gZXh0TGVuOworICAgICAgICBpZiAoZXh0TGVuID49IDIpIHsgICAgIC8vICJzZXJ2ZXJfbmFtZSIgZXh0ZW5zaW9uIGluIENsaWVudEhlbGxvCisgICAgICAgICAgICBpbnQgbGlzdExlbiA9IGdldEludDE2KGlucHV0KTsgICAgIC8vIGxlbmd0aCBvZiBzZXJ2ZXJfbmFtZV9saXN0CisgICAgICAgICAgICBpZiAobGlzdExlbiA9PSAwIHx8IGxpc3RMZW4gKyAyICE9IGV4dExlbikgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBTU0xQcm90b2NvbEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgc2VydmVyIG5hbWUgaW5kaWNhdGlvbiBleHRlbnNpb24iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmVtYWlucyAtPSAyOyAgICAgLy8gMHgwMjogdGhlIGxlbmd0aCBmaWVsZCBvZiBzZXJ2ZXJfbmFtZV9saXN0CisgICAgICAgICAgICB3aGlsZSAocmVtYWlucyA+IDApIHsKKyAgICAgICAgICAgICAgICBpbnQgY29kZSA9IGdldEludDgoaW5wdXQpOyAgICAgIC8vIG5hbWVfdHlwZQorICAgICAgICAgICAgICAgIGludCBzbkxlbiA9IGdldEludDE2KGlucHV0KTsgICAgLy8gbGVuZ3RoIGZpZWxkIG9mIHNlcnZlciBuYW1lCisgICAgICAgICAgICAgICAgaWYgKHNuTGVuID4gcmVtYWlucykgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU1NMUHJvdG9jb2xFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiTm90IGVub3VnaCBkYXRhIHRvIGZpbGwgZGVjbGFyZWQgdmVjdG9yIHNpemUiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnl0ZVtdIGVuY29kZWQgPSBuZXcgYnl0ZVtzbkxlbl07CisgICAgICAgICAgICAgICAgaW5wdXQuZ2V0KGVuY29kZWQpOworCisgICAgICAgICAgICAgICAgU05JU2VydmVyTmFtZSBzZXJ2ZXJOYW1lOworICAgICAgICAgICAgICAgIHN3aXRjaCAoY29kZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFN0YW5kYXJkQ29uc3RhbnRzLlNOSV9IT1NUX05BTUU6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5jb2RlZC5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTU0xQcm90b2NvbEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVtcHR5IEhvc3ROYW1lIGluIHNlcnZlciBuYW1lIGluZGljYXRpb24iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlck5hbWUgPSBuZXcgU05JSG9zdE5hbWUoZW5jb2RlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlck5hbWUgPSBuZXcgVW5rbm93blNlcnZlck5hbWUoY29kZSwgZW5jb2RlZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIGNoZWNrIGZvciBkdXBsaWNhdGVkIHNlcnZlciBuYW1lIHR5cGUKKyAgICAgICAgICAgICAgICBpZiAoc25pTWFwLnB1dChzZXJ2ZXJOYW1lLmdldFR5cGUoKSwgc2VydmVyTmFtZSkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU1NMUHJvdG9jb2xFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkR1cGxpY2F0ZWQgc2VydmVyIG5hbWUgb2YgdHlwZSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJOYW1lLmdldFR5cGUoKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmVtYWlucyAtPSBlbmNvZGVkLmxlbmd0aCArIDM7ICAvLyBOYW1lVHlwZTogMSBieXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBIb3N0TmFtZSBsZW5ndGg6IDIgYnl0ZXMKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChleHRMZW4gPT0gMCkgeyAgICAgLy8gInNlcnZlcl9uYW1lIiBleHRlbnNpb24gaW4gU2VydmVySGVsbG8KKyAgICAgICAgICAgIHRocm93IG5ldyBTU0xQcm90b2NvbEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJOb3Qgc2VydmVyIG5hbWUgaW5kaWNhdGlvbiBleHRlbnNpb24gaW4gY2xpZW50Iik7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVtYWlucyAhPSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU1NMUHJvdG9jb2xFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBzZXJ2ZXIgbmFtZSBpbmRpY2F0aW9uIGV4dGVuc2lvbiIpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLjxTTklTZXJ2ZXJOYW1lPnVubW9kaWZpYWJsZUxpc3QoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8PihzbmlNYXAudmFsdWVzKCkpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgZ2V0SW50OChCeXRlQnVmZmVyIGlucHV0KSB7CisgICAgICAgIHJldHVybiBpbnB1dC5nZXQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgZ2V0SW50MTYoQnl0ZUJ1ZmZlciBpbnB1dCkgeworICAgICAgICByZXR1cm4gKChpbnB1dC5nZXQoKSAmIDB4RkYpIDw8IDgpIHwgKGlucHV0LmdldCgpICYgMHhGRik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGdldEludDI0KEJ5dGVCdWZmZXIgaW5wdXQpIHsKKyAgICAgICAgcmV0dXJuICgoaW5wdXQuZ2V0KCkgJiAweEZGKSA8PCAxNikgfCAoKGlucHV0LmdldCgpICYgMHhGRikgPDwgOCkgfAorICAgICAgICAgICAgICAgIChpbnB1dC5nZXQoKSAmIDB4RkYpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgaWdub3JlQnl0ZVZlY3RvcjgoQnl0ZUJ1ZmZlciBpbnB1dCkgeworICAgICAgICBpZ25vcmVCeXRlVmVjdG9yKGlucHV0LCBnZXRJbnQ4KGlucHV0KSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBpZ25vcmVCeXRlVmVjdG9yMTYoQnl0ZUJ1ZmZlciBpbnB1dCkgeworICAgICAgICBpZ25vcmVCeXRlVmVjdG9yKGlucHV0LCBnZXRJbnQxNihpbnB1dCkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgaWdub3JlQnl0ZVZlY3RvcjI0KEJ5dGVCdWZmZXIgaW5wdXQpIHsKKyAgICAgICAgaWdub3JlQnl0ZVZlY3RvcihpbnB1dCwgZ2V0SW50MjQoaW5wdXQpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGlnbm9yZUJ5dGVWZWN0b3IoQnl0ZUJ1ZmZlciBpbnB1dCwgaW50IGxlbmd0aCkgeworICAgICAgICBpZiAobGVuZ3RoICE9IDApIHsKKyAgICAgICAgICAgIGludCBwb3NpdGlvbiA9IGlucHV0LnBvc2l0aW9uKCk7CisgICAgICAgICAgICBpbnB1dC5wb3NpdGlvbihwb3NpdGlvbiArIGxlbmd0aCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBVbmtub3duU2VydmVyTmFtZSBleHRlbmRzIFNOSVNlcnZlck5hbWUgeworICAgICAgICBVbmtub3duU2VydmVyTmFtZShpbnQgY29kZSwgYnl0ZVtdIGVuY29kZWQpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvZGUsIGVuY29kZWQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgU1NMQ2FwYWJpbGl0aWVzSW1wbCBleHRlbmRzIFNTTENhcGFiaWxpdGllcyB7CisgICAgICAgIHByaXZhdGUgZmluYWwgc3RhdGljIE1hcDxJbnRlZ2VyLCBTdHJpbmc+IHZlcnNpb25NYXAgPSBuZXcgSGFzaE1hcDw+KDUpOworCisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHJlY29yZFZlcnNpb247CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGhlbGxvVmVyc2lvbjsKKyAgICAgICAgTGlzdDxTTklTZXJ2ZXJOYW1lPiBzbmlOYW1lczsKKworICAgICAgICBzdGF0aWMgeworICAgICAgICAgICAgdmVyc2lvbk1hcC5wdXQoMHgwMDAyLCAiU1NMdjJIZWxsbyIpOworICAgICAgICAgICAgdmVyc2lvbk1hcC5wdXQoMHgwMzAwLCAiU1NMdjMiKTsKKyAgICAgICAgICAgIHZlcnNpb25NYXAucHV0KDB4MDMwMSwgIlRMU3YxIik7CisgICAgICAgICAgICB2ZXJzaW9uTWFwLnB1dCgweDAzMDIsICJUTFN2MS4xIik7CisgICAgICAgICAgICB2ZXJzaW9uTWFwLnB1dCgweDAzMDMsICJUTFN2MS4yIik7CisgICAgICAgIH0KKworICAgICAgICBTU0xDYXBhYmlsaXRpZXNJbXBsKGJ5dGUgcmVjb3JkTWFqb3JWZXJzaW9uLCBieXRlIHJlY29yZE1pbm9yVmVyc2lvbiwKKyAgICAgICAgICAgICAgICBieXRlIGhlbGxvTWFqb3JWZXJzaW9uLCBieXRlIGhlbGxvTWlub3JWZXJzaW9uLAorICAgICAgICAgICAgICAgIExpc3Q8U05JU2VydmVyTmFtZT4gc25pTmFtZXMpIHsKKworICAgICAgICAgICAgaW50IHZlcnNpb24gPSAocmVjb3JkTWFqb3JWZXJzaW9uIDw8IDgpIHwgcmVjb3JkTWlub3JWZXJzaW9uOworICAgICAgICAgICAgdGhpcy5yZWNvcmRWZXJzaW9uID0gdmVyc2lvbk1hcC5nZXQodmVyc2lvbikgIT0gbnVsbCA/CisgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uTWFwLmdldCh2ZXJzaW9uKSA6CisgICAgICAgICAgICAgICAgICAgICAgICB1bmtub3duVmVyc2lvbihyZWNvcmRNYWpvclZlcnNpb24sIHJlY29yZE1pbm9yVmVyc2lvbik7CisKKyAgICAgICAgICAgIHZlcnNpb24gPSAoaGVsbG9NYWpvclZlcnNpb24gPDwgOCkgfCBoZWxsb01pbm9yVmVyc2lvbjsKKyAgICAgICAgICAgIHRoaXMuaGVsbG9WZXJzaW9uID0gdmVyc2lvbk1hcC5nZXQodmVyc2lvbikgIT0gbnVsbCA/CisgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uTWFwLmdldCh2ZXJzaW9uKSA6CisgICAgICAgICAgICAgICAgICAgICAgICB1bmtub3duVmVyc2lvbihoZWxsb01ham9yVmVyc2lvbiwgaGVsbG9NaW5vclZlcnNpb24pOworCisgICAgICAgICAgICB0aGlzLnNuaU5hbWVzID0gc25pTmFtZXM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRSZWNvcmRWZXJzaW9uKCkgeworICAgICAgICAgICAgcmV0dXJuIHJlY29yZFZlcnNpb247CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRIZWxsb1ZlcnNpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gaGVsbG9WZXJzaW9uOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBMaXN0PFNOSVNlcnZlck5hbWU+IGdldFNlcnZlck5hbWVzKCkgeworICAgICAgICAgICAgaWYgKCFzbmlOYW1lcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuPFNOSVNlcnZlck5hbWU+dW5tb2RpZmlhYmxlTGlzdChzbmlOYW1lcyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBzbmlOYW1lczsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyB1bmtub3duVmVyc2lvbihieXRlIG1ham9yLCBieXRlIG1pbm9yKSB7CisgICAgICAgICAgICByZXR1cm4gIlVua25vd24tIiArICgoaW50KW1ham9yKSArICIuIiArICgoaW50KW1pbm9yKTsKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L3Rvb2xzL2phcnNpZ25lci9KYXJTaWduaW5nTm9uQXNjaWkuamF2YSBiL2pkay90ZXN0L3N1bi9zZWN1cml0eS90b29scy9qYXJzaWduZXIvSmFyU2lnbmluZ05vbkFzY2lpLmphdmEKaW5kZXggYzBjYWUwOC4uNWIyMTFkMSAxMDA2NDQKLS0tIGEvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L3Rvb2xzL2phcnNpZ25lci9KYXJTaWduaW5nTm9uQXNjaWkuamF2YQorKysgYi9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvdG9vbHMvamFyc2lnbmVyL0phclNpZ25pbmdOb25Bc2NpaS5qYXZhCkBAIC02Miw3ICs2Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAiLXNpZ25lZEphciIsIHNpZ25lZEphciwKICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkSmFyLCAiYiIKICAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0gICAgICAgIEphclNpZ25lci5tYWluKGpzQXJncyk7CisgICAgICAgIHN1bi5zZWN1cml0eS50b29scy5qYXJzaWduZXIuTWFpbi5tYWluKGpzQXJncyk7CiAKICAgICAgICAgLy8gIHZlcmlmeSB0aGUgc2lnbmVkIGphciBmaWxlCiAKZGlmZiAtLWdpdCBhL2pkay90ZXN0L3N1bi9zZWN1cml0eS90b29scy9qYXJzaWduZXIvTGFyZ2VKYXJFbnRyeS5qYXZhIGIvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L3Rvb2xzL2phcnNpZ25lci9MYXJnZUphckVudHJ5LmphdmEKaW5kZXggMjgwMTYwYjIuLjM2NGQ1NDQgMTAwNjQ0Ci0tLSBhL2pkay90ZXN0L3N1bi9zZWN1cml0eS90b29scy9qYXJzaWduZXIvTGFyZ2VKYXJFbnRyeS5qYXZhCisrKyBiL2pkay90ZXN0L3N1bi9zZWN1cml0eS90b29scy9qYXJzaWduZXIvTGFyZ2VKYXJFbnRyeS5qYXZhCkBAIC0zNSw3ICszNSw2IEBACiBpbXBvcnQgamF2YS51dGlsLmphci5KYXJFbnRyeTsKIGltcG9ydCBqYXZhLnV0aWwuamFyLkphck91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLnV0aWwuemlwLkNSQzMyOwotaW1wb3J0IHN1bi5zZWN1cml0eS50b29scy5KYXJTaWduZXI7CiAKIHB1YmxpYyBjbGFzcyBMYXJnZUphckVudHJ5IHsKIApAQCAtNzMsNyArNzIsNyBAQAogICAgICAgICAgICAgICAgIGphck5hbWUsICJiIiB9OwogICAgICAgICAvLyBub3csIHRyeSB0byBzaWduIGl0CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBKYXJTaWduZXIubWFpbihqc0FyZ3MpOworICAgICAgICAgICAgc3VuLnNlY3VyaXR5LnRvb2xzLmphcnNpZ25lci5NYWluLm1haW4oanNBcmdzKTsKICAgICAgICAgfSBjYXRjaCAoT3V0T2ZNZW1vcnlFcnJvciBlcnIpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlRlc3QgZmFpbGVkIHdpdGggT3V0T2ZNZW1vcnlFcnJvciIsIGVycik7CiAgICAgICAgIH0gZmluYWxseSB7CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvdG9vbHMva2V5dG9vbC9DbG9zZUZpbGUuamF2YSBiL2pkay90ZXN0L3N1bi9zZWN1cml0eS90b29scy9rZXl0b29sL0Nsb3NlRmlsZS5qYXZhCmluZGV4IGIxYjgzYTQuLjgyYzNlNDQgMTAwNjQ0Ci0tLSBhL2pkay90ZXN0L3N1bi9zZWN1cml0eS90b29scy9rZXl0b29sL0Nsb3NlRmlsZS5qYXZhCisrKyBiL2pkay90ZXN0L3N1bi9zZWN1cml0eS90b29scy9rZXl0b29sL0Nsb3NlRmlsZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjYsMTIgKzI2LDEzIEBACiAgKiBAYnVnIDY0ODk3MjEKICAqIEBzdW1tYXJ5IGtleXRvb2wgaGFzIG5vdCBjbG9zZWQgc2V2ZXJhbCBmaWxlIHN0cmVhbXMKICAqIEBhdXRob3Igd2VpanVuLndhbmcKKyAqIEBjb21waWxlIC1YRGlnbm9yZS5zeW1ib2wuZmlsZSBDbG9zZUZpbGUuamF2YQorICogQHJ1biBtYWluIENsb3NlRmlsZQogICoKICAqIFRoaXMgdGVzdCBpcyBvbmx5IHVzZWZ1bCBvbiBXaW5kb3dzLCB3aGljaCBmYWlscyBiZWZvcmUgdGhlIGZpeCBhbmQgc3VjY2VlZHMKICAqIGFmdGVyIGl0LiBPbiBvdGhlciBwbGF0Zm9ybXMsIGl0IGFsd2F5cyBwYXNzZXMuCiAgKi8KIAotaW1wb3J0IHN1bi5zZWN1cml0eS50b29scy5LZXlUb29sOwogaW1wb3J0IGphdmEuaW8uKjsKIAogcHVibGljIGNsYXNzIENsb3NlRmlsZSB7CkBAIC01OCw3ICs1OSw3IEBACiAgICAgfQogCiAgICAgc3RhdGljIHZvaWQgcnVuKFN0cmluZyBzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgS2V5VG9vbC5tYWluKChzKyIgLWRlYnVnIikuc3BsaXQoIiAiKSk7CisgICAgICAgIHN1bi5zZWN1cml0eS50b29scy5rZXl0b29sLk1haW4ubWFpbigocysiIC1kZWJ1ZyIpLnNwbGl0KCIgIikpOwogICAgIH0KICAgICBzdGF0aWMgdm9pZCByZW1vdmUoU3RyaW5nIGZpbGVuYW1lLCBib29sZWFuIGNoZWNrKSB7CiAgICAgICAgIG5ldyBGaWxlKGZpbGVuYW1lKS5kZWxldGUoKTsKZGlmZiAtLWdpdCBhL2pkay90ZXN0L3N1bi9zZWN1cml0eS90b29scy9rZXl0b29sL0tleVRvb2xUZXN0LmphdmEgYi9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvdG9vbHMva2V5dG9vbC9LZXlUb29sVGVzdC5qYXZhCmluZGV4IDU3M2Y5YmUuLmU4NmFmOTMgMTAwNjQ0Ci0tLSBhL2pkay90ZXN0L3N1bi9zZWN1cml0eS90b29scy9rZXl0b29sL0tleVRvb2xUZXN0LmphdmEKKysrIGIvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L3Rvb2xzL2tleXRvb2wvS2V5VG9vbFRlc3QuamF2YQpAQCAtNTYsNyArNTYsNiBAQAogICovCiAKIGltcG9ydCBqYXZhLnNlY3VyaXR5LktleVN0b3JlOwotaW1wb3J0IHN1bi5zZWN1cml0eS50b29scy5LZXlUb29sOwogaW1wb3J0IHN1bi5zZWN1cml0eS54NTA5Lio7CiBpbXBvcnQgamF2YS5pby4qOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5UGFpckdlbmVyYXRvcjsKQEAgLTE0OSwxMiArMTQ4LDEzIEBACiAgICAgICAgICAgICBTeXN0ZW0uc2V0T3V0KG5ldyBQcmludFN0cmVhbShiMSkpOwogICAgICAgICAgICAgU3lzdGVtLnNldEVycihuZXcgUHJpbnRTdHJlYW0oYjIpKTsKIAotICAgICAgICAgICAgLy8gc2luY2UgU3lzdGVtLmluIGlzIG92ZXJyaWRlZCwgdGhlIEtleVRvb2wubWFpbigpIG1ldGhvZCB3aWxsCisgICAgICAgICAgICAvLyBzaW5jZSBTeXN0ZW0uaW4gaXMgb3ZlcnJpZGVkLCB0aGUKKyAgICAgICAgICAgIC8vIHN1bi5zZWN1cml0eS50b29scy5rZXl0b29sLk1haW4ubWFpbigpIG1ldGhvZCB3aWxsCiAgICAgICAgICAgICAvLyBuZXZlciBibG9jayBhdCB1c2VyIGlucHV0CiAKLSAgICAgICAgICAgIC8vIHVzZSAtZGVidWcgc28gdGhhdCBLZXlUb29sLm1haW4oKSB3aWxsIHRocm93IGFuIEV4Y2VwdGlvbgorICAgICAgICAgICAgLy8gdXNlIC1kZWJ1ZyBzbyB0aGF0IG1haW4oKSB3aWxsIHRocm93IGFuIEV4Y2VwdGlvbgogICAgICAgICAgICAgLy8gaW5zdGVhZCBvZiBjYWxsaW5nIFN5c3RlbS5leGl0KCkKLSAgICAgICAgICAgIEtleVRvb2wubWFpbigoIi1kZWJ1ZyAiK2NtZCkuc3BsaXQoIlxccysiKSk7CisgICAgICAgICAgICBzdW4uc2VjdXJpdHkudG9vbHMua2V5dG9vbC5NYWluLm1haW4oKCItZGVidWcgIitjbWQpLnNwbGl0KCJcXHMrIikpOwogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgb3V0ID0gYjEudG9TdHJpbmcoKTsKICAgICAgICAgICAgIGVyciA9IGIyLnRvU3RyaW5nKCk7CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvdG9vbHMva2V5dG9vbC9OZXdTaXplNy5qYXZhIGIvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L3Rvb2xzL2tleXRvb2wvTmV3U2l6ZTcuamF2YQppbmRleCBhYjhlZjVjYi4uMmU1ZWU2ZSAxMDA2NDQKLS0tIGEvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L3Rvb2xzL2tleXRvb2wvTmV3U2l6ZTcuamF2YQorKysgYi9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvdG9vbHMva2V5dG9vbC9OZXdTaXplNy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsNiArMjUsOCBAQAogICogQHRlc3QKICAqIEBidWcgNjU2MTEyNgogICogQHN1bW1hcnkga2V5dG9vbCBzaG91bGQgdXNlIGxhcmdlciBkZWZhdWx0IGtleXNpemUgZm9yIGtleXBhaXJzCisgKiBAY29tcGlsZSAtWERpZ25vcmUuc3ltYm9sLmZpbGUgTmV3U2l6ZTcuamF2YQorICogQHJ1biBtYWluIE5ld1NpemU3CiAgKi8KIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKQEAgLTM0LDEzICszNiwxMyBAQAogaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5U3RvcmU7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZTsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LmludGVyZmFjZXMuUlNBUHVibGljS2V5OwotaW1wb3J0IHN1bi5zZWN1cml0eS50b29scy5LZXlUb29sOwogCiBwdWJsaWMgY2xhc3MgTmV3U2l6ZTcgewogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBTdHJpbmcgRklMRSA9ICJuZXdzaXplNy1rcyI7CiAgICAgICAgIG5ldyBGaWxlKEZJTEUpLmRlbGV0ZSgpOwotICAgICAgICBLZXlUb29sLm1haW4oKCItZGVidWcgLWdlbmtleXBhaXIgLWtleXN0b3JlICIgKyBGSUxFICsKKyAgICAgICAgc3VuLnNlY3VyaXR5LnRvb2xzLmtleXRvb2wuTWFpbi5tYWluKCgiLWRlYnVnIC1nZW5rZXlwYWlyIC1rZXlzdG9yZSAiICsKKyAgICAgICAgICAgICAgICBGSUxFICsKICAgICAgICAgICAgICAgICAiIC1hbGlhcyBhIC1kbmFtZSBjbj1jIC1zdG9yZXBhc3MgY2hhbmdlaXQiICsKICAgICAgICAgICAgICAgICAiIC1rZXlwYXNzIGNoYW5nZWl0IC1rZXlhbGcgcnNhIikuc3BsaXQoIiAiKSk7CiAgICAgICAgIEtleVN0b3JlIGtzID0gS2V5U3RvcmUuZ2V0SW5zdGFuY2UoIkpLUyIpOwpkaWZmIC0tZ2l0IGEvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L3Rvb2xzL2tleXRvb2wvU3RhcnREYXRlVGVzdC5qYXZhIGIvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L3Rvb2xzL2tleXRvb2wvU3RhcnREYXRlVGVzdC5qYXZhCmluZGV4IGJiNjQ0ODAuLjU5N2M3NDUgMTAwNjQ0Ci0tLSBhL2pkay90ZXN0L3N1bi9zZWN1cml0eS90b29scy9rZXl0b29sL1N0YXJ0RGF0ZVRlc3QuamF2YQorKysgYi9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvdG9vbHMva2V5dG9vbC9TdGFydERhdGVUZXN0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSw2ICsyNSw4IEBACiAgKiBAdGVzdAogICogQGJ1ZyA2NDY4Mjg1CiAgKiBAc3VtbWFyeSBrZXl0b29sIGFiaWxpdHkgdG8gYmFja2RhdGUgc2VsZi1zaWduZWQgY2VydGlmaWNhdGVzIHRvIGNvbXBlbnNhdGUgZm9yIGNsb2NrIHNrZXcKKyAqIEBjb21waWxlIC1YRGlnbm9yZS5zeW1ib2wuZmlsZSBTdGFydERhdGVUZXN0LmphdmEKKyAqIEBydW4gbWFpbiBTdGFydERhdGVUZXN0CiAgKi8KIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKQEAgLTM1LDcgKzM3LDYgQEAKIGltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7CiBpbXBvcnQgamF2YS51dGlsLkRhdGU7CiBpbXBvcnQgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyOwotaW1wb3J0IHN1bi5zZWN1cml0eS50b29scy5LZXlUb29sOwogCiBwdWJsaWMgY2xhc3MgU3RhcnREYXRlVGVzdCB7CiAgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC02Niw3ICs2Nyw4IEBACiAgICAgICAgIG5ldyBGaWxlKCJqa3MiKS5kZWxldGUoKTsKIAogICAgICAgICAvLyBQYXJ0IDI6IFRlc3QgZm9ybWF0Ci0gICAgICAgIE1ldGhvZCBtID0gS2V5VG9vbC5jbGFzcy5nZXREZWNsYXJlZE1ldGhvZCgiZ2V0U3RhcnREYXRlIiwgU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgTWV0aG9kIG0gPSBzdW4uc2VjdXJpdHkudG9vbHMua2V5dG9vbC5NYWluLmNsYXNzLmdldERlY2xhcmVkTWV0aG9kKAorICAgICAgICAgICAgICAgICAgICJnZXRTdGFydERhdGUiLCBTdHJpbmcuY2xhc3MpOwogICAgICAgICBtLnNldEFjY2Vzc2libGUodHJ1ZSk7CiAgICAgICAgIGZvciAoU3RyaW5nIHM6IG5ldyBTdHJpbmdbXSB7CiAgICAgICAgICAgICAgICAgbnVsbCwgICAgICAgLy9OT1chCkBAIC0xMjcsNyArMTI5LDcgQEAKICAgICB9CiAKICAgICBzdGF0aWMgdm9pZCBydW4oU3RyaW5nIHMpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBLZXlUb29sLm1haW4oKHMrIiAtZGVidWciKS5zcGxpdCgiICIpKTsKKyAgICAgICAgc3VuLnNlY3VyaXR5LnRvb2xzLmtleXRvb2wuTWFpbi5tYWluKChzKyIgLWRlYnVnIikuc3BsaXQoIiAiKSk7CiAgICAgfQogCiAgICAgc3RhdGljIERhdGUgZ2V0SXNzdWVEYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvdG9vbHMva2V5dG9vbC9Vbmtub3duQW5kVW5wYXJzZWFibGUuamF2YSBiL2pkay90ZXN0L3N1bi9zZWN1cml0eS90b29scy9rZXl0b29sL1Vua25vd25BbmRVbnBhcnNlYWJsZS5qYXZhCmluZGV4IDVjNTg3YWMuLmNiOGNiYWQgMTAwNjQ0Ci0tLSBhL2pkay90ZXN0L3N1bi9zZWN1cml0eS90b29scy9rZXl0b29sL1Vua25vd25BbmRVbnBhcnNlYWJsZS5qYXZhCisrKyBiL2pkay90ZXN0L3N1bi9zZWN1cml0eS90b29scy9rZXl0b29sL1Vua25vd25BbmRVbnBhcnNlYWJsZS5qYXZhCkBAIC0yNSwxMiArMjUsMTMgQEAKICAqIEB0ZXN0CiAgKiBAYnVnIDcxOTIyMDIKICAqIEBzdW1tYXJ5IE1ha2Ugc3VyZSBrZXl0b29sIHByaW50cyBib3RoIHVua25vd24gYW5kIHVucGFyc2VhYmxlIGV4dGVuc2lvbnMKKyAqIEBjb21waWxlIC1YRGlnbm9yZS5zeW1ib2wuZmlsZSBVbmtub3duQW5kVW5wYXJzZWFibGUuamF2YQorICogQHJ1biBtYWluIFVua25vd25BbmRVbnBhcnNlYWJsZQogICovCiAKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKLWltcG9ydCBzdW4uc2VjdXJpdHkudG9vbHMuS2V5VG9vbDsKIGltcG9ydCBzdW4uc2VjdXJpdHkueDUwOS5QS0lYRXh0ZW5zaW9uczsKIAogcHVibGljIGNsYXNzIFVua25vd25BbmRVbnBhcnNlYWJsZSB7CkBAIC00NCwxNCArNDUsMTQgQEAKICAgICAgICAgU3RyaW5nIGdlbmtleSA9IHMKICAgICAgICAgICAgICAgICArICItZ2Vua2V5cGFpciAtYWxpYXMgYSAtZG5hbWUgQ049QSAtZXh0IDEuMi4zLjQ9MTIzNCAiCiAgICAgICAgICAgICAgICAgKyAiLWV4dCAiICsgUEtJWEV4dGVuc2lvbnMuS2V5VXNhZ2VfSWQudG9TdHJpbmcoKSArICI9NTY3OCI7Ci0gICAgICAgIEtleVRvb2wubWFpbihnZW5rZXkuc3BsaXQoIiAiKSk7CisgICAgICAgIHN1bi5zZWN1cml0eS50b29scy5rZXl0b29sLk1haW4ubWFpbihnZW5rZXkuc3BsaXQoIiAiKSk7CiAKICAgICAgICAgLy8gR2V0IHRoZSBsaXN0IG91dHB1dCB0byBhIHN0cmluZwogICAgICAgICBTdHJpbmcgbGlzdCA9IHMgKyAiLWxpc3QgLXYiOwogICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgUHJpbnRTdHJlYW0gb2xkT3V0ID0gU3lzdGVtLm91dDsKICAgICAgICAgU3lzdGVtLnNldE91dChuZXcgUHJpbnRTdHJlYW0oYm91dCkpOwotICAgICAgICBLZXlUb29sLm1haW4obGlzdC5zcGxpdCgiICIpKTsKKyAgICAgICAgc3VuLnNlY3VyaXR5LnRvb2xzLmtleXRvb2wuTWFpbi5tYWluKGxpc3Quc3BsaXQoIiAiKSk7CiAgICAgICAgIFN5c3RlbS5zZXRPdXQob2xkT3V0KTsKICAgICAgICAgU3RyaW5nIG91dCA9IGJvdXQudG9TdHJpbmcoKTsKICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG91dCk7CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvdG9vbHMva2V5dG9vbC9hdXRvdGVzdC5zaCBiL2pkay90ZXN0L3N1bi9zZWN1cml0eS90b29scy9rZXl0b29sL2F1dG90ZXN0LnNoCmluZGV4IGVhNGMzZjIuLjU2ODM2ZDEgMTAwNjQ0Ci0tLSBhL2pkay90ZXN0L3N1bi9zZWN1cml0eS90b29scy9rZXl0b29sL2F1dG90ZXN0LnNoCisrKyBiL2pkay90ZXN0L3N1bi9zZWN1cml0eS90b29scy9rZXl0b29sL2F1dG90ZXN0LnNoCkBAIC03OCw3ICs3OCw3IEBACiBlc2FjCiAKIGlmIFsgIiRMSUJOQU1FIiA9ICIiIF07IHRoZW4KLSAgZWNobyAiQ2Fubm90IGZpbmQgTElCTkFNRSIKKyAgZWNobyAiQ2Fubm90IGZpbmQgbGlic29mdG9rbjMuc28iCiAgIGV4aXQgMQogZmkKIApkaWZmIC0tZ2l0IGEvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L3Rvb2xzL2tleXRvb2wvc3RhbmRhcmQuc2ggYi9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvdG9vbHMva2V5dG9vbC9zdGFuZGFyZC5zaAppbmRleCA5OGUzYjAzLi42ZGQyYTM1IDEwMDY0NAotLS0gYS9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvdG9vbHMva2V5dG9vbC9zdGFuZGFyZC5zaAorKysgYi9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvdG9vbHMva2V5dG9vbC9zdGFuZGFyZC5zaApAQCAtNTYsNyArNTYsNyBAQAogICAgIDs7CiBlc2FjCiAKLSR7VEVTVEpBVkF9JHtGU31iaW4ke0ZTfWphdmFjIC1kIC4gJHtURVNUU1JDfSR7RlN9S2V5VG9vbFRlc3QuamF2YSB8fCBleGl0IDEwCiske1RFU1RKQVZBfSR7RlN9YmluJHtGU31qYXZhYyAtZCAuIC1YRGlnbm9yZS5zeW1ib2wuZmlsZSAke1RFU1RTUkN9JHtGU31LZXlUb29sVGVzdC5qYXZhIHx8IGV4aXQgMTAKIAogZWNobyB8ICR7VEVTVEpBVkF9JHtGU31iaW4ke0ZTfWphdmEgLURmaWxlIEtleVRvb2xUZXN0CiBzdGF0dXM9JD8KZGlmZiAtLWdpdCBhL2pkay90ZXN0L3N1bi9zZWN1cml0eS91dGlsL1Jlc291cmNlcy9Gb3JtYXQuamF2YSBiL2pkay90ZXN0L3N1bi9zZWN1cml0eS91dGlsL1Jlc291cmNlcy9Gb3JtYXQuamF2YQppbmRleCA1MjQxZDI4Li4zY2M4Y2QwIDEwMDY0NAotLS0gYS9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvdXRpbC9SZXNvdXJjZXMvRm9ybWF0LmphdmEKKysrIGIvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L3V0aWwvUmVzb3VyY2VzL0Zvcm1hdC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMTUwLDcgKzE1MCw3IEBACiAgICAgICAgICAgICBzLmdldFByaXZhdGVDcmVkZW50aWFscygpLmFkZChuZXcgRm9ybWF0KCkpOwogICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUZXN0IDEyLCBzLnRvU3RyaW5nKCkgPSAiICsgcy50b1N0cmluZygpKTsKICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbigidGVzdCAxMiBmYWlsZWQ6IGUudG9TdHJpbmcoKSIpOworICAgICAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKCJ0ZXN0IDEyIGZhaWxlZDogZS50b1N0cmluZygpIiwgZSk7CiAgICAgICAgIH0KIAogICAgICAgICB0cnkgewpkaWZmIC0tZ2l0IGEvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L3V0aWwvUmVzb3VyY2VzL05ld05hbWVzRm9ybWF0LmphdmEgYi9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvdXRpbC9SZXNvdXJjZXMvTmV3TmFtZXNGb3JtYXQuamF2YQppbmRleCA5YzNiNDUyLi5mOTc3NDdlIDEwMDY0NAotLS0gYS9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvdXRpbC9SZXNvdXJjZXMvTmV3TmFtZXNGb3JtYXQuamF2YQorKysgYi9qZGsvdGVzdC9zdW4vc2VjdXJpdHkvdXRpbC9SZXNvdXJjZXMvTmV3TmFtZXNGb3JtYXQuamF2YQpAQCAtNDAsNyArNDAsOSBAQAogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBjaGVja1Jlcygic3VuLnNlY3VyaXR5LnV0aWwuUmVzb3VyY2VzIik7CiAgICAgICAgIGNoZWNrUmVzKCJzdW4uc2VjdXJpdHkudXRpbC5BdXRoUmVzb3VyY2VzIik7Ci0gICAgICAgIGNoZWNrUmVzKCJzdW4uc2VjdXJpdHkudG9vbHMuSmFyU2lnbmVyUmVzb3VyY2VzIik7CisgICAgICAgIGNoZWNrUmVzKCJzdW4uc2VjdXJpdHkudG9vbHMuamFyc2lnbmVyLlJlc291cmNlcyIpOworICAgICAgICBjaGVja1Jlcygic3VuLnNlY3VyaXR5LnRvb2xzLmtleXRvb2wuUmVzb3VyY2VzIik7CisgICAgICAgIGNoZWNrUmVzKCJzdW4uc2VjdXJpdHkudG9vbHMucG9saWN5dG9vbC5SZXNvdXJjZXMiKTsKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrUmVzKFN0cmluZyByZXNOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKZGlmZiAtLWdpdCBhL2pkay90ZXN0L3N1bi9zZWN1cml0eS91dGlsL1Jlc291cmNlcy9OZXdSZXNvdXJjZXNOYW1lcy5qYXZhIGIvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L3V0aWwvUmVzb3VyY2VzL05ld1Jlc291cmNlc05hbWVzLmphdmEKaW5kZXggNzIwNzhiNS4uYzBkYjk1NCAxMDA2NDQKLS0tIGEvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L3V0aWwvUmVzb3VyY2VzL05ld1Jlc291cmNlc05hbWVzLmphdmEKKysrIGIvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L3V0aWwvUmVzb3VyY2VzL05ld1Jlc291cmNlc05hbWVzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC01OSw3ICs1OSw5IEBACiAgICAgc3RhdGljIGludCBNQVhMRU4gPSAxMjc7CiAKICAgICBzdGF0aWMgU3RyaW5nW10gcmVzb3VyY2VzID0gewotICAgICAgICAic3VuL3NlY3VyaXR5L3Rvb2xzL0phclNpZ25lclJlc291cmNlcy5qYXZhIiwKKyAgICAgICAgInN1bi9zZWN1cml0eS90b29scy9qYXJzaWduZXIvUmVzb3VyY2VzLmphdmEiLAorICAgICAgICAic3VuL3NlY3VyaXR5L3Rvb2xzL2tleXRvb2wvUmVzb3VyY2VzLmphdmEiLAorICAgICAgICAic3VuL3NlY3VyaXR5L3Rvb2xzL3BvbGljeXRvb2wvUmVzb3VyY2VzLmphdmEiLAogICAgICAgICAic3VuL3NlY3VyaXR5L3V0aWwvUmVzb3VyY2VzLmphdmEiLAogICAgICAgICAic3VuL3NlY3VyaXR5L3V0aWwvQXV0aFJlc291cmNlcy5qYXZhIiwKICAgICB9OwpAQCAtOTQsNyArOTYsNyBAQAogICAgICAgICAvLwogICAgICAgICAvLyBUaGlzIG1lYW5zIGEgIiBleGlzdHMgcmlnaHQgYWZ0ZXIgZ2V0U3RyaW5nKC4gU29tZXRpbWVzIHlvdSBzZWUKICAgICAgICAgLy8KLSAgICAgICAgLy8gICAgICBXb3JraW5nIG9uIHN1bi9zZWN1cml0eS90b29scy9LZXlUb29sLmphdmEKKyAgICAgICAgLy8gICAgICBXb3JraW5nIG9uIHN1bi9zZWN1cml0eS90b29scy9rZXl0b29sL01haW4uamF2YQogICAgICAgICAvLyAgICAgICAgICBCQUQhISBwbWF0Y2ggIT0gbWF0Y2g6IDIxMiAhPSAyMDkKICAgICAgICAgLy8gICAgICBXb3JraW5nIG9uIHN1bi9zZWN1cml0eS9wcm92aWRlci9Qb2xpY3lGaWxlLmphdmEKICAgICAgICAgLy8gICAgICAgICAgQkFEISEgcG1hdGNoICE9IG1hdGNoOiAxNCAhPSAxMApAQCAtMTY1LDcgKzE2Nyw3IEBACiAKICAgICAgICAgU2V0PFN0cmluZz4gbmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CiAKLSAgICAgICAgU3RyaW5nIGZpbGUgPSAic3VuL3NlY3VyaXR5L3Rvb2xzL0tleVRvb2wuamF2YSI7CisgICAgICAgIFN0cmluZyBmaWxlID0gInN1bi9zZWN1cml0eS90b29scy9rZXl0b29sL01haW4uamF2YSI7CiAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiV29ya2luZyBvbiAiICsgZmlsZSk7CiAgICAgICAgIEZpbGUgb3JpZ0ZpbGUgPSBuZXcgRmlsZShmaWxlKTsKICAgICAgICAgRmlsZSB0bXBGaWxlID0gbmV3IEZpbGUoZmlsZSArICIudG1wIik7CmRpZmYgLS1naXQgYS9qZGsvdGVzdC9zdW4vc2VjdXJpdHkveDUwOS9BbGdvcml0aG1JZC9Ob25TdGFuZGFyZE5hbWVzLmphdmEgYi9qZGsvdGVzdC9zdW4vc2VjdXJpdHkveDUwOS9BbGdvcml0aG1JZC9Ob25TdGFuZGFyZE5hbWVzLmphdmEKaW5kZXggOTg3MGRiMy4uYzZjYTU1YyAxMDA2NDQKLS0tIGEvamRrL3Rlc3Qvc3VuL3NlY3VyaXR5L3g1MDkvQWxnb3JpdGhtSWQvTm9uU3RhbmRhcmROYW1lcy5qYXZhCisrKyBiL2pkay90ZXN0L3N1bi9zZWN1cml0eS94NTA5L0FsZ29yaXRobUlkL05vblN0YW5kYXJkTmFtZXMuamF2YQpAQCAtMjUsNiArMjUsOCBAQAogICogQHRlc3QKICAqIEBidWcgNzE4MDkwNwogICogQHN1bW1hcnkgSmFyc2lnbmVyIC12ZXJpZnkgZmFpbHMgaWYgcnNhIGZpbGUgdXNlZCBzaGEtMjU2IHdpdGggYXV0aGVudGljYXRlZCBhdHRyaWJ1dGVzCisgKiBAY29tcGlsZSAtWERpZ25vcmUuc3ltYm9sLmZpbGUgTm9uU3RhbmRhcmROYW1lcy5qYXZhCisgKiBAcnVuIG1haW4gTm9uU3RhbmRhcmROYW1lcwogICovCiAKIGltcG9ydCBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3Q7CkBAIC0zNSw3ICszNyw3IEBACiBpbXBvcnQgc3VuLnNlY3VyaXR5LnBrY3MuUEtDUzlBdHRyaWJ1dGU7CiBpbXBvcnQgc3VuLnNlY3VyaXR5LnBrY3MuUEtDUzlBdHRyaWJ1dGVzOwogaW1wb3J0IHN1bi5zZWN1cml0eS5wa2NzLlNpZ25lckluZm87Ci1pbXBvcnQgc3VuLnNlY3VyaXR5LnRvb2xzLkNlcnRBbmRLZXlHZW47CitpbXBvcnQgc3VuLnNlY3VyaXR5LnRvb2xzLmtleXRvb2wuQ2VydEFuZEtleUdlbjsKIGltcG9ydCBzdW4uc2VjdXJpdHkueDUwOS5BbGdvcml0aG1JZDsKIGltcG9ydCBzdW4uc2VjdXJpdHkueDUwOS5YNTAwTmFtZTsKIApkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzLy5oZ3RhZ3MgYi9sYW5ndG9vbHMvLmhndGFncwppbmRleCAwODBiZGM0Li4zODdmNGQ2IDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvLmhndGFncworKysgYi9sYW5ndG9vbHMvLmhndGFncwpAQCAtMTgzLDMgKzE4Myw0IEBACiBmMjk5OTI3ZmMzMTY4OTM4NWY2N2FiNzMyMmMxOGViNDFkOGJkNzFlIGpkazgtYjU5CiAzZDJiOThmZmNiNTM0YjBlNWJlODdiYjFmOWY2OGQxNTE4YWQ3NzI5IGpkazgtYjYwCiAyNjAyMGIyNDdhZDM4MDZkYmNhMzNlMDI5ZWUxMmUxYjE5MWY1OWY5IGpkazgtYjYxCitiNDdiYjgxYmE5NjJlZjgwYmI2ZjBiODYzYzMzYTBhZmNmYjBiNDllIGpkazgtYjYyCmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvbWFrZWZpbGVzL0J1aWxkTGFuZ3Rvb2xzLmdtayBiL2xhbmd0b29scy9tYWtlZmlsZXMvQnVpbGRMYW5ndG9vbHMuZ21rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ODcwNzAKLS0tIC9kZXYvbnVsbAorKysgYi9sYW5ndG9vbHMvbWFrZWZpbGVzL0J1aWxkTGFuZ3Rvb2xzLmdtawpAQCAtMCwwICsxLDIwNSBAQAorIworIyBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyMKKyMgVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBPcmFjbGUgZGVzaWduYXRlcyB0aGlzCisjIHBhcnRpY3VsYXIgZmlsZSBhcyBzdWJqZWN0IHRvIHRoZSAiQ2xhc3NwYXRoIiBleGNlcHRpb24gYXMgcHJvdmlkZWQKKyMgYnkgT3JhY2xlIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUuCisjCisjIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyMgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisjIGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyMgMiBhbG9uZyB3aXRoIHRoaXMgd29yazsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisjCisjIFBsZWFzZSBjb250YWN0IE9yYWNsZSwgNTAwIE9yYWNsZSBQYXJrd2F5LCBSZWR3b29kIFNob3JlcywgQ0EgOTQwNjUgVVNBCisjIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKKyMgcXVlc3Rpb25zLgorIworCisjIFRoaXMgbXVzdCBiZSB0aGUgZmlyc3QgcnVsZQorZGVmYXVsdDogYWxsCisKK2luY2x1ZGUgJChTUEVDKQoraW5jbHVkZSBNYWtlQmFzZS5nbWsKK2luY2x1ZGUgSmF2YUNvbXBpbGF0aW9uLmdtaworCisjIFRoZSBCT09UX0pBVkFDIHNldHVwIHVzZXMgdGhlIGJvb3RkaXIgY29tcGlsZXIgdG8gY29tcGlsZSB0aGUgdG9vbHMKKyMgYW5kIHRoZSBib290c3RyYXAgamF2YWMsIHRvIGJlIHJ1biBieSB0aGUgYm9vdGRpciBqdm0uCiskKGV2YWwgJChjYWxsIFNldHVwSmF2YUNvbXBpbGVyLEJPT1RfSkFWQUMsXAorCUpBVkFDOj0kKEpBVkFDKSxcCisgICAgICAgIFNFUlZFUl9ESVI6PSQoU0pBVkFDX1NFUlZFUl9ESVIpLFwKKyAgICAgICAgU0VSVkVSX0pWTTo9JChTSkFWQUNfU0VSVkVSX0pBVkEpLFwKKyAgICAgICAgRkxBR1M6PS1YRGlnbm9yZS5zeW1ib2wuZmlsZT10cnVlIC1nIC1YbGludDphbGwkKENPTU1BKS1kZXByZWNhdGlvbiAtV2Vycm9yKSkKKworIyBOb3cgc2V0dXAgdGhlIGNvbXBpbGF0aW9uIG9mIHRoZSBwcm9wZXJ0aWVzIGNvbXBpbGF0aW9uIHRvb2wuIFlvdSBjYW4gZGVwZW5kCisjIHVwb24gJChCVUlMRF9UT09MUykgdG8gdHJpZ2dlciBhIGNvbXBpbGF0aW9uIG9mIHRoZSB0b29scy4gTm90ZSB0aGF0IHdlCisjIGFkZCBzcmMvc2hhcmUvY2xhc3NlcyB0byB0aGUgc291cmNlcGF0aC4gVGhpcyBpcyBuZWNlc3Nhcnkgc2luY2UgdGhlIEdlblN0dWJzCisjIHByb2dyYW0gbmVlZHMgdG8gYmUgbGlua2VkIGFuZCBydW4gdG93YXJkcyB0aGUgbmV3IGphdmFjIHNvdXJjZXMuCiskKGV2YWwgJChjYWxsIFNldHVwSmF2YUNvbXBpbGF0aW9uLEJVSUxEX1RPT0xTLFwKKwkJU0VUVVA6PUJPT1RfSkFWQUMsXAorCQlESVNBQkxFX1NKQVZBQzo9dHJ1ZSxcCisgICAgICAgICAgICAgICAgQUREX0pBVkFDX0ZMQUdTOj0tWHByZWZlcjpzb3VyY2UsXAorCQlTUkM6PSQoTEFOR1RPT0xTX1RPUERJUikvbWFrZS90b29scyAkKExBTkdUT09MU19UT1BESVIpL3NyYy9zaGFyZS9jbGFzc2VzLFwKKwkJSU5DTFVERVM6PWNvbXBpbGVwcm9wZXJ0aWVzIGdlbnN0dWJzLFwKKwkJQklOOj0kKExBTkdUT09MU19PVVRQVVRESVIpL2J0Y2xhc3NlcykpCisKKyMgVGhlIGNvbXBpbGVwcm9wcyB0b29scyBjb21waWxlcyBhIHByb3BlcnRpZXMgZmlsZSBpbnRvIGEgcmVzb3VyY2UgYnVuZGxlLgorVE9PTF9DT01QSUxFUFJPUFNfQ01EOj0kKEpBVkEpIC1jcCAkKExBTkdUT09MU19PVVRQVVRESVIpL2J0Y2xhc3NlcyBjb21waWxlcHJvcGVydGllcy5Db21waWxlUHJvcGVydGllcyAtcXVpZXQKKyMgTG9va3VwIHRoZSBwcm9wZXJ0aWVzIHRoYXQgbmVlZCB0byBiZSBjb21waWxlZCBpbnRvIHJlc291cmNlIGJ1bmRsZXMuCitQUk9QU09VUkNFUzo9JChzaGVsbCBmaW5kICQoTEFOR1RPT0xTX1RPUERJUikvc3JjL3NoYXJlL2NsYXNzZXMgLW5hbWUgIioucHJvcGVydGllcyIpCisjIFN0cmlwIGF3YXkgcHJlZml4IGFuZCBzdWZmaXgsIGxlYXZpbmcgZm9yIGV4YW1wbGUgb25seTogImNvbS9zdW4vdG9vbHMvamF2YWMvcmVzb3VyY2VzL2phdmFjX3poX0NOIgorUFJPUFBBVEhTOj0kKHBhdHN1YnN0ICQoTEFOR1RPT0xTX1RPUERJUikvc3JjL3NoYXJlL2NsYXNzZXMvJS5wcm9wZXJ0aWVzLCUsJChQUk9QU09VUkNFUykpCisjIEdlbmVyYXRlIHRoZSBsaXN0IG9mIGphdmEgZmlsZXMgdG8gYmUgY3JlYXRlZC4KK1BST1BKQVZBUzo9JChwYXRzdWJzdCAlLCQoTEFOR1RPT0xTX09VVFBVVERJUikvZ2Vuc3JjLyUuamF2YSwkKFBST1BQQVRIUykpCisjIEdlbmVyYXRlIHRoZSBwYWNrYWdlIGRpcnMgZm9yIHRoZSB0b2JlIGdlbmVyYXRlZCBqYXZhIGZpbGVzLgorUFJPUERJUlM6PSQoZGlyICQoUFJPUEpBVkFTKSkKKyMgTm93IGdlbmVyYXRlIGEgc2VxdWVuY2Ugb2YgIi1jb21waWxlIC4uLmphdmFjX3poX0NOLnByb3BlcnRpZXMgLi4uamF2YWNfemhfQ04uamF2YSBqYXZhLnV0aWwuTGlzdFJlc291cmNlQnVuZGxlIgorIyBzdWl0YWJsZSB0byBiZSBmZWQgaW50byB0aGUgQ29tcGlsZVByb3BlcnRpZXMgY29tbWFuZC4KK1BST1BDTURMSU5FOj0kKHN1YnN0IF9TUEFDRV8sJChTUEFDRSksJChqb2luICQoYWRkcHJlZml4IC1jb21waWxlX1NQQUNFXywkKFBST1BTT1VSQ0VTKSksIFwKKwkJJChhZGRzdWZmaXggX1NQQUNFX2phdmEudXRpbC5MaXN0UmVzb3VyY2VCdW5kbGUsJChhZGRwcmVmaXggX1NQQUNFXyQoTEFOR1RPT0xTX09VVFBVVERJUikvZ2Vuc3JjLywkKGFkZHN1ZmZpeCAuamF2YSwkKFBST1BQQVRIUykpKSkpKQorCisjIE5vdyBzZXR1cCB0aGUgcnVsZSBmb3IgdGhlIGdlbmVyYXRpb24gb2YgdGhlIHJlc291cmNlIGJ1bmRsZXMuCiskKExBTkdUT09MU19PVVRQVVRESVIpL2dlbnNyYy9fdGhlX3Byb3BzLmQgOiAkKFBST1BTT1VSQ0VTKSAkKEJVSUxEX1RPT0xTKQorCXJtIC1yZiAkKEBEKS8qCisJbWtkaXIgLXAgJChARCkgJChQUk9QRElSUykKKwlwcmludGYgImpkaz0kKEpES19WRVJTSU9OKVxuZnVsbD0kKEZVTExfVkVSU0lPTilcbnJlbGVhc2U9JChSRUxFQVNFKVxuIiA+ICQoTEFOR1RPT0xTX09VVFBVVERJUikvZ2Vuc3JjL2NvbS9zdW4vdG9vbHMvamF2YWgvcmVzb3VyY2VzL3ZlcnNpb24ucHJvcGVydGllcworCXByaW50ZiAiamRrPSQoSkRLX1ZFUlNJT04pXG5mdWxsPSQoRlVMTF9WRVJTSU9OKVxucmVsZWFzZT0kKFJFTEVBU0UpXG4iID4gJChMQU5HVE9PTFNfT1VUUFVURElSKS9nZW5zcmMvY29tL3N1bi90b29scy9qYXZhcC9yZXNvdXJjZXMvdmVyc2lvbi5wcm9wZXJ0aWVzCisJcHJpbnRmICJqZGs9JChKREtfVkVSU0lPTilcbmZ1bGw9JChGVUxMX1ZFUlNJT04pXG5yZWxlYXNlPSQoUkVMRUFTRSlcbiIgPiAkKExBTkdUT09MU19PVVRQVVRESVIpL2dlbnNyYy9jb20vc3VuL3Rvb2xzL2phdmFjL3Jlc291cmNlcy92ZXJzaW9uLnByb3BlcnRpZXMKKwllY2hvIENvbXBpbGluZyAkKHdvcmRzICQoUFJPUFNPVVJDRVMpIHYxIHYyIHYzKSBwcm9wZXJ0aWVzIGludG8gcmVzb3VyY2UgYnVuZGxlcworCSQoVE9PTF9DT01QSUxFUFJPUFNfQ01EKSAkKFBST1BDTURMSU5FKSBcCisJCS1jb21waWxlIAkkKExBTkdUT09MU19PVVRQVVRESVIpL2dlbnNyYy9jb20vc3VuL3Rvb2xzL2phdmFoL3Jlc291cmNlcy92ZXJzaW9uLnByb3BlcnRpZXMgXAorCQkJCSQoTEFOR1RPT0xTX09VVFBVVERJUikvZ2Vuc3JjL2NvbS9zdW4vdG9vbHMvamF2YWgvcmVzb3VyY2VzL3ZlcnNpb24uamF2YSBcCisJCQkJamF2YS51dGlsLkxpc3RSZXNvdXJjZUJ1bmRsZSBcCisJCS1jb21waWxlIAkkKExBTkdUT09MU19PVVRQVVRESVIpL2dlbnNyYy9jb20vc3VuL3Rvb2xzL2phdmFwL3Jlc291cmNlcy92ZXJzaW9uLnByb3BlcnRpZXMgXAorCQkJCSQoTEFOR1RPT0xTX09VVFBVVERJUikvZ2Vuc3JjL2NvbS9zdW4vdG9vbHMvamF2YXAvcmVzb3VyY2VzL3ZlcnNpb24uamF2YSBcCisJCQkJamF2YS51dGlsLkxpc3RSZXNvdXJjZUJ1bmRsZSBcCisJCS1jb21waWxlCSQoTEFOR1RPT0xTX09VVFBVVERJUikvZ2Vuc3JjL2NvbS9zdW4vdG9vbHMvamF2YWMvcmVzb3VyY2VzL3ZlcnNpb24ucHJvcGVydGllcyBcCisJCQkJJChMQU5HVE9PTFNfT1VUUFVURElSKS9nZW5zcmMvY29tL3N1bi90b29scy9qYXZhYy9yZXNvdXJjZXMvdmVyc2lvbi5qYXZhIFwKKwkJCQlqYXZhLnV0aWwuTGlzdFJlc291cmNlQnVuZGxlCisJZWNobyBQUk9QU19BUkVfQ1JFQVRFRD15ZXMgPiAkQAorCisjIFRyaWdnZXIgdGhlIGdlbmVyYXRpb24gb2YgdGhlIHJlc291cmNlIGJ1bmRsZXMuIEFmdGVyIHRoZSByZXNvdXJjZSBidW5kbGVzIGhhdmUKKyMgYmVlbiBjb21waWxlZCwgdGhlbiB0aGUgbWFrZWZpbGUgd2lsbCByZXN0YXJ0IGFuZCB0aGUgbmV3bHkgY3JlYXRlZCBqYXZhIGZpbGVzCisjIHdpbGwgYmVjb21lIHBhcnQgb2YgdGhlIGJ1aWxkIGZ1cnRoZXIgYWxvbmcgaW4gdGhlIG1ha2VmaWxlLgorLWluY2x1ZGUgJChMQU5HVE9PTFNfT1VUUFVURElSKS9nZW5zcmMvX3RoZV9wcm9wcy5kCisKK2lmZXEgKCQoUFJPUFNfQVJFX0NSRUFURUQpLHllcykKKyAgICAgICAgIyBTZXR1cCB0aGUgcnVsZXMgdG8gYnVpbGQgYSBkaXN0L2Jvb3RzdHJhcC9saWIvamF2YWMuamFyLCBpZSBhIHNtYWxsZXIgaW50ZXJtZWRpYXRlIGphdmFjCisgICAgICAgICMgdGhhdCBjYW4gYmUgY29tcGlsZWQgd2l0aCBhbiBvbGQgamF2YWMuIFRoZSBpbnRlcm1lZGlhdGUgamF2YWMgaXMgdGhlbiB1c2VkCisgICAgICAgICMgdG8gY29tcGlsZSBqYXZhYyBhZ2FpbiBhbmQgdG8gYnVpbGQgdGhlIGNvbXBsZXRlIG5ldyBqZGsuCisgICAgICAgICQoZXZhbCAkKGNhbGwgU2V0dXBKYXZhQ29tcGlsYXRpb24sQlVJTERfQk9PVFNUUkFQX0xBTkdUT09MUyxcCisJCVNFVFVQOj1CT09UX0pBVkFDLFwKKwkJRElTQUJMRV9TSkFWQUM6PXRydWUsXAorCQlTUkM6PSQoTEFOR1RPT0xTX1RPUERJUikvc3JjL3NoYXJlL2NsYXNzZXMgJChMQU5HVE9PTFNfT1VUUFVURElSKS9nZW5zcmMsXAorCQlFWENMVURFUzo9Y29tL3N1bi90b29scy9qYXZhYy9uaW8sXAorCQlCSU46PSQoTEFOR1RPT0xTX09VVFBVVERJUikvYnRjbGFzc2VzL2Jvb3RzdHJhcCkpCisKKyAgICAgICAgJChldmFsICQoY2FsbCBTZXR1cEFyY2hpdmUsQVJDSElWRV9CT09UU1RSQVBfSkFWQUMsJChCVUlMRF9CT09UU1RSQVBfTEFOR1RPT0xTKSxcCisJCVNSQ1M6PSQoTEFOR1RPT0xTX09VVFBVVERJUikvYnRjbGFzc2VzL2Jvb3RzdHJhcCxcCisJCUpBUjo9JChMQU5HVE9PTFNfT1VUUFVURElSKS9kaXN0L2Jvb3RzdHJhcC9saWIvamF2YWMuamFyLFwKKwkJSkFSTUFJTjo9Y29tLnN1bi50b29scy5qYXZhYy5NYWluKSkKKworICAgICAgICAkKGV2YWwgJChjYWxsIFNldHVwQXJjaGl2ZSxBUkNISVZFX0JPT1RTVFJBUF9KQVZBSCwkKEJVSUxEX0JPT1RTVFJBUF9MQU5HVE9PTFMpLFwKKwkJU1JDUzo9JChMQU5HVE9PTFNfT1VUUFVURElSKS9idGNsYXNzZXMvYm9vdHN0cmFwLFwKKwkJSkFSOj0kKExBTkdUT09MU19PVVRQVVRESVIpL2Rpc3QvYm9vdHN0cmFwL2xpYi9qYXZhaC5qYXIsXAorCQlKQVJNQUlOOj1jb20uc3VuLnRvb2xzLmphdmFoLk1haW4pKQorCisgICAgICAgICQoZXZhbCAkKGNhbGwgU2V0dXBBcmNoaXZlLEFSQ0hJVkVfQk9PVFNUUkFQX0pBVkFQLCQoQlVJTERfQk9PVFNUUkFQX0xBTkdUT09MUyksXAorCQlTUkNTOj0kKExBTkdUT09MU19PVVRQVVRESVIpL2J0Y2xhc3Nlcy9ib290c3RyYXAsXAorCQlKQVI6PSQoTEFOR1RPT0xTX09VVFBVVERJUikvZGlzdC9ib290c3RyYXAvbGliL2phdmFwLmphcixcCisJCUpBUk1BSU46PWNvbS5zdW4udG9vbHMuamF2YXAuTWFpbikpCisKKyAgICAgICAgJChldmFsICQoY2FsbCBTZXR1cEFyY2hpdmUsQVJDSElWRV9CT09UU1RSQVBfSkFWQURPQywkKEJVSUxEX0JPT1RTVFJBUF9MQU5HVE9PTFMpLFwKKwkJU1JDUzo9JChMQU5HVE9PTFNfT1VUUFVURElSKS9idGNsYXNzZXMvYm9vdHN0cmFwLFwKKwkJSkFSOj0kKExBTkdUT09MU19PVVRQVVRESVIpL2Rpc3QvYm9vdHN0cmFwL2xpYi9qYXZhZG9jLmphcixcCisJCUpBUk1BSU46PWNvbS5zdW4udG9vbHMuamF2YWRvYy5NYWluKSkKKworICAgICAgICAjIEdlblN0dWJzIGlzIHVzZWQgdG8gYm9vdHN0cmFwIGFueSBkZXBlbmRlbmNpZXMgZnJvbSBqYXZhYyB0byB0aGUgbmV3IEpESyB0aGF0IGlzIG5vdCAKKyAgICAgICAgIyB5ZXQgYnVpbHQuIEl0IGlzIGN1cnJlbnRseSBub3QgbmVlZGVkIGJ1dCBtaWdodCBiZSBhZ2FpbiBpbiB0aGUgZnV0dXJlLiBUaGUgZm9sbG93aW5nCisgICAgICAgICMgZXhlcmNpc2VzIHRoZSBmdW5jdGlvbmFsaXR5IHRvIHZlcmlmeSB0aGF0IGl0IHdvcmtzLgorICAgICAgICBUT09MX0dFTlNUVUJTX0NNRD0kKEpBVkEpIFwKKyAgICAgICAgICAgICAiLVhib290Y2xhc3NwYXRoL3A6JChMQU5HVE9PTFNfT1VUUFVURElSKS9kaXN0L2Jvb3RzdHJhcC9saWIvamF2YWMuamFyIiBcCisgICAgICAgICAgICAgLWNsYXNzcGF0aCAkKExBTkdUT09MU19PVVRQVVRESVIpL2J0Y2xhc3NlcyBcCisgICAgICAgICAgICAgZ2Vuc3R1YnMuR2VuU3R1YnMKKyAgICAgICAgIyBXZSBmZXRjaCBzb3VyY2UgZnJvbSB0aGUgSkRLLi4uCisgICAgICAgIEpES1M9JChKREtfVE9QRElSKS9zcmMvc2hhcmUvY2xhc3NlcworICAgICAgICAjIEJ1aWxkIHRoZSBsaXN0IG9mIGNsYXNzZXMgdG8gZ2VuZXJhdGUgc3R1YnMgZnJvbS4gamF2YS91dGlsL09iamVjdHMuamF2YSBpc24ndAorICAgICAgICAjIGN1cnJlbnRseSBuZWVkZWQsIGJ1dCBpcyB1c2VkIGFzIGEgZGVtbyBmb3Igbm93LgorCSBTVFVCU09VUkNFUzo9JChzaGVsbCAkKEZJTkQpICQoSkRLUykgLW5hbWUgIiouamF2YSIgfCAkKEdSRVApIFwKKwkJICAgIC1lICIkKEpES1MpL2phdmEvdXRpbC9PYmplY3RzLmphdmEiKQorICAgICAgICAjIFJld3JpdGUgdGhlIGZpbGUgbmFtZXMgaW50byBjbGFzcyBuYW1lcyBiZWNhdXNlIHRoZSBHZW5TdHVicyB0b29sIHJlcXVpcmUgdGhpcy4KKyAgICAgICAgU1RVQkNMQVNTRVM6PSQoc3Vic3QgLywuLCQocGF0c3Vic3QgJChKREtTKS8lLmphdmEsJSwkKFNUVUJTT1VSQ0VTKSkpCisKKyAgICAgICAgIyBOb3cgc2V0dXAgdGhlIGJ1aWxkIHJlY2lwZSBmb3IgZ2Vuc3R1YnMuCisgICAgICAgICQoTEFOR1RPT0xTX09VVFBVVERJUikvZ2Vuc3R1YnMvX3RoZV9zdHVicy5kIDogJChTVFVCU09VUkNFUykgJChCVUlMRF9UT09MUykgXAorCQkJCSQoTEFOR1RPT0xTX09VVFBVVERJUikvZGlzdC9ib290c3RyYXAvbGliL2phdmFjLmphciBcCisJCQkJJChMQU5HVE9PTFNfT1VUUFVURElSKS9nZW5zcmMvX3RoZV9wcm9wcy5kCisJICAgICAgIAlta2RpciAtcCAkKEBEKQorCQlta2RpciAtcCAkKExBTkdUT09MU19PVVRQVVRESVIpL3RtcHN0dWJzCisJICAgICAgIAllY2hvICQoTE9HX0lORk8pIEdlbmVyYXRpbmcgc3R1YnMgZnJvbSBKREsgc291cmNlcy4KKwkgICAgICAgCSgkKFRPT0xfR0VOU1RVQlNfQ01EKSAtcyAkKExBTkdUT09MU19PVVRQVVRESVIpL3RtcHN0dWJzIC1zb3VyY2VwYXRoICQoSkRLUykgJChTVFVCQ0xBU1NFUykgJiYgZWNobyBTVFVCU19BUkVfQ1JFQVRFRD15ZXMgPiAkQCkKKwkJaWYgJChESUZGKSAteCAiX3RoZSoiIC1ycSAkKExBTkdUT09MU19PVVRQVVRESVIpL3RtcHN0dWJzICQoTEFOR1RPT0xTX09VVFBVVERJUikvZ2Vuc3R1YnMgPiAvZGV2L251bGwgMj4mMTsgdGhlbiBcCisJCQllY2hvICQoTE9HX0lORk8pIE5vIGNoYW5nZXMgaW4gdGhlIHN0dWJzITsgXAorCQkJcm0gLXJmICQoTEFOR1RPT0xTX09VVFBVVERJUikvdG1wc3R1YnM7IFwKKwkJZWxzZSBcCisJCQllY2hvICQoTE9HX0lORk8pIENoYW5nZXMgaW4gc3R1YnMgZGV0ZWN0ZWQhOyBcCisJCQlybSAtcmYgJChARCk7IFwKKwkJCW12ICQoTEFOR1RPT0xTX09VVFBVVERJUikvdG1wc3R1YnMgJChARCk7IFwKKwkJZmkKKwkJZWNobyBTVFVCU19BUkVfQ1JFQVRFRD15ZXMgPiAkQAorCisgICAgICAgICMgVHJpZ2dlciBhIGdlbmVyYXRpb24gb2YgdGhlIGdlbnN0dWJzIGphdmEgc291cmNlIGNvZGUgYW5kIGEgcmVzdGFydAorICAgICAgICAjIG9mIHRoZSBtYWtlZmlsZSB0byBtYWtlIHN1cmUgdGhhdCB0aGUgZm9sbG93aW5nIGJ1aWxkIHNldHVwIHVzZSB0aGUgCisgICAgICAgICMgbmV3bHkgY3JlYXRlZCBqYXZhIGZpbGVzLgorICAgICAgICAtaW5jbHVkZSAkKExBTkdUT09MU19PVVRQVVRESVIpL2dlbnN0dWJzL190aGVfc3R1YnMuZAorCisJaWZlcSAoJChTVFVCU19BUkVfQ1JFQVRFRCkseWVzKQorICAgICAgICAgICAgICAgICMgU2V0dXAgYSBjb21waWxlciBjb25maWd1cmF0aW9uIHVzaW5nIHRoZSBpbnRlcm1lZGlhdGUgamF2YWMgaW4gZGlzdC9ib290c3RyYXAvbGliL2phdmFjLmphcgorICAgICAgICAgICAgICAgICMgdGhhdCBnZW5lcmF0ZXMgY29kZSBmb3IgdGhlIG5ldyBqZGsgdGhhdCBpcyBiZWluZyBidWlsdC4KKyAgICAgICAgICAgICAgICAjIFRoZSBjb2RlIGNvbXBpbGVkIGJ5IHRoaXMgY29tcGlsZXIgc2V0dXAsIGNhbm5vdCBuZWNlc3NhcmlseSBiZSBydW4gd2l0aCB0aGUgYm9vdHN0cmFwIGp2bS4KKyAgICAgICAgICAgICAgICAkKGV2YWwgJChjYWxsIFNldHVwSmF2YUNvbXBpbGVyLEdFTkVSQVRFX05FV0JZVEVDT0RFLFwKKyAgICAgICAgICAgICAgICAgIEpWTTo9JChKQVZBKSxcCisgICAgICAgICAgICAgICAgICBKQVZBQzo9Ii1YYm9vdGNsYXNzcGF0aC9wOiQoTEFOR1RPT0xTX09VVFBVVERJUikvZGlzdC9ib290c3RyYXAvbGliL2phdmFjLmphciIgXAorCQkJIC1qYXIgJChMQU5HVE9PTFNfT1VUUFVURElSKS9kaXN0L2Jvb3RzdHJhcC9saWIvamF2YWMuamFyLFwKKyAgICAgICAgICAgICAgICAgIEZMQUdTOj0tWERpZ25vcmUuc3ltYm9sLmZpbGU9dHJ1ZSAtWGxpbnQ6YWxsJChDT01NQSktZGVwcmVjYXRpb24gLVdlcnJvcixcCisgICAgICAgICAgICAgICAgICBTRVJWRVJfRElSOj0kKFNKQVZBQ19TRVJWRVJfRElSKSxcCisgICAgICAgICAgICAgICAgICBTRVJWRVJfSlZNOj0kKFNKQVZBQ19TRVJWRVJfSkFWQSkpKQorCisgICAgICAgICAgICAgICAgIyBqYXZheC50b29scy5KYXZhQ29tcGlsZXJUb29sIGlzbid0IHJlYWxseSBhIHN1ZmZpeCBidXQgdGhpcyBnZXRzIHRoZSBmaWxlIGNvcGllZC4KKwkJUkVTT1VSQ0VfU1VGRklYRVM6PS5naWYgLnhtbCAuY3NzIGphdmF4LnRvb2xzLkphdmFDb21waWxlclRvb2wKKworICAgICAgICAgICAgICAgICQoZXZhbCAkKGNhbGwgU2V0dXBKYXZhQ29tcGlsYXRpb24sQlVJTERfRlVMTF9KQVZBQyxcCisJCQlTRVRVUDo9R0VORVJBVEVfTkVXQllURUNPREUsXAorCQkJU1JDOj0kKExBTkdUT09MU19UT1BESVIpL3NyYy9zaGFyZS9jbGFzc2VzICQoTEFOR1RPT0xTX09VVFBVVERJUikvZ2Vuc3JjIFwKKwkJCSAgICAgJChMQU5HVE9PTFNfT1VUUFVURElSKS9nZW5zdHVicyxcCisJCQlFWENMVURFUzo9amF2YS91dGlsIGphdmEvaW8gamF2YS9uaW8sXAorCQkJQ09QWTo9JChSRVNPVVJDRV9TVUZGSVhFUyksXAorCQkJQklOOj0kKExBTkdUT09MU19PVVRQVVRESVIpL2NsYXNzZXMpKQorCisgICAgICAgICAgICAgICAgJChldmFsICQoY2FsbCBTZXR1cEFyY2hpdmUsQVJDSElWRV9GVUxMX0pBVkFDLCQoQlVJTERfRlVMTF9KQVZBQyksXAorCQkJU0VUVVA6PUdFTkVSQVRFX05FV0JZVEVDT0RFLFwKKwkJCVNSQ1M6PSQoTEFOR1RPT0xTX09VVFBVVERJUikvY2xhc3NlcyxcCisJCQlTVUZGSVhFUzo9LmNsYXNzICQoUkVTT1VSQ0VfU1VGRklYRVMpLFwKKwkJCUpBUjo9JChMQU5HVE9PTFNfT1VUUFVURElSKS9kaXN0L2xpYi9jbGFzc2VzLmphcikpCisKKyAgICAgICAgICAgICAgICAkKGV2YWwgJChjYWxsIFNldHVwWmlwQXJjaGl2ZSxaSVBfRlVMTF9KQVZBQ19TT1VSQ0UsXAorCQkJU1JDOj0kKExBTkdUT09MU19UT1BESVIpL3NyYy9zaGFyZS9jbGFzc2VzICQoTEFOR1RPT0xTX09VVFBVVERJUikvZ2Vuc3JjLFwKKwkJCVpJUDo9JChMQU5HVE9PTFNfT1VUUFVURElSKS9kaXN0L2xpYi9zcmMuemlwKSkKKworICAgICAgICAgICAgICAgIGFsbDogCQkkKExBTkdUT09MU19PVVRQVVRESVIpL2Rpc3QvbGliL2NsYXNzZXMuamFyIFwKKwkJCQkkKExBTkdUT09MU19PVVRQVVRESVIpL2Rpc3QvbGliL3NyYy56aXAgXAorCSAgICAgICAgICAgICAgICAgCSQoTEFOR1RPT0xTX09VVFBVVERJUikvZGlzdC9ib290c3RyYXAvbGliL2phdmFjLmphciBcCisJCQkJJChMQU5HVE9PTFNfT1VUUFVURElSKS9kaXN0L2Jvb3RzdHJhcC9saWIvamF2YWguamFyIFwKKwkJCQkkKExBTkdUT09MU19PVVRQVVRESVIpL2Rpc3QvYm9vdHN0cmFwL2xpYi9qYXZhcC5qYXIgXAorCQkJCSQoTEFOR1RPT0xTX09VVFBVVERJUikvZGlzdC9ib290c3RyYXAvbGliL2phdmFkb2MuamFyCisKKworICAgICAgICBlbmRpZgorZW5kaWYKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9tYWtlZmlsZXMvTWFrZWZpbGUgYi9sYW5ndG9vbHMvbWFrZWZpbGVzL01ha2VmaWxlCmluZGV4IDJmOGI0ZTAuLjk1MzlmZTAgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9tYWtlZmlsZXMvTWFrZWZpbGUKKysrIGIvbGFuZ3Rvb2xzL21ha2VmaWxlcy9NYWtlZmlsZQpAQCAtMSw1ICsxLDUgQEAKICMKLSMgQ29weXJpZ2h0IChjKSAyMDExLCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBDb3B5cmlnaHQgKGMpIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAjIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICMKICMgVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTIzLDE4MyArMjMsMjcgQEAKICMgcXVlc3Rpb25zLgogIwogCi0jIFRoaXMgbXVzdCBiZSB0aGUgZmlyc3QgcnVsZQotZGVmYXVsdDogYWxsCi0KLWluY2x1ZGUgJChTUEVDKQotaW5jbHVkZSBNYWtlQmFzZS5nbWsKLWluY2x1ZGUgSmF2YUNvbXBpbGF0aW9uLmdtawotCi0jIFRoZSBCT09UX0pBVkFDIHNldHVwIHVzZXMgdGhlIGJvb3RkaXIgY29tcGlsZXIgdG8gY29tcGlsZSB0aGUgdG9vbHMKLSMgYW5kIHRoZSBib290c3RyYXAgamF2YWMsIHRvIGJlIHJ1biBieSB0aGUgYm9vdGRpciBqdm0uCi0kKGV2YWwgJChjYWxsIFNldHVwSmF2YUNvbXBpbGVyLEJPT1RfSkFWQUMsXAotCUpBVkFDOj0kKEpBVkFDKSxcCi0gICAgICAgIFNFUlZFUl9ESVI6PSQoU0pBVkFDX1NFUlZFUl9ESVIpLFwKLSAgICAgICAgU0VSVkVSX0pWTTo9JChTSkFWQUNfU0VSVkVSX0pBVkEpLFwKLSAgICAgICAgRkxBR1M6PS1YRGlnbm9yZS5zeW1ib2wuZmlsZT10cnVlIC1nIC1YbGludDphbGwkKENPTU1BKS1kZXByZWNhdGlvbiAtV2Vycm9yKSkKLQotIyBOb3cgc2V0dXAgdGhlIGNvbXBpbGF0aW9uIG9mIHRoZSBwcm9wZXJ0aWVzIGNvbXBpbGF0aW9uIHRvb2wuIFlvdSBjYW4gZGVwZW5kCi0jIHVwb24gJChCVUlMRF9UT09MUykgdG8gdHJpZ2dlciBhIGNvbXBpbGF0aW9uIG9mIHRoZSB0b29scy4gTm90ZSB0aGF0IHdlCi0jIGFkZCBzcmMvc2hhcmUvY2xhc3NlcyB0byB0aGUgc291cmNlcGF0aC4gVGhpcyBpcyBuZWNlc3Nhcnkgc2luY2UgdGhlIEdlblN0dWJzCi0jIHByb2dyYW0gbmVlZHMgdG8gYmUgbGlua2VkIGFuZCBydW4gdG93YXJkcyB0aGUgbmV3IGphdmFjIHNvdXJjZXMuCi0kKGV2YWwgJChjYWxsIFNldHVwSmF2YUNvbXBpbGF0aW9uLEJVSUxEX1RPT0xTLFwKLQkJU0VUVVA6PUJPT1RfSkFWQUMsXAotCQlESVNBQkxFX1NKQVZBQzo9dHJ1ZSxcCi0gICAgICAgICAgICAgICAgQUREX0pBVkFDX0ZMQUdTOj0tWHByZWZlcjpzb3VyY2UsXAotCQlTUkM6PSQoTEFOR1RPT0xTX1RPUERJUikvbWFrZS90b29scyAkKExBTkdUT09MU19UT1BESVIpL3NyYy9zaGFyZS9jbGFzc2VzLFwKLQkJSU5DTFVERVM6PWNvbXBpbGVwcm9wZXJ0aWVzIGdlbnN0dWJzLFwKLQkJQklOOj0kKExBTkdUT09MU19PVVRQVVRESVIpL2J0Y2xhc3NlcykpCi0KLSMgVGhlIGNvbXBpbGVwcm9wcyB0b29scyBjb21waWxlcyBhIHByb3BlcnRpZXMgZmlsZSBpbnRvIGEgcmVzb3VyY2UgYnVuZGxlLgotVE9PTF9DT01QSUxFUFJPUFNfQ01EOj0kKEpBVkEpIC1jcCAkKExBTkdUT09MU19PVVRQVVRESVIpL2J0Y2xhc3NlcyBjb21waWxlcHJvcGVydGllcy5Db21waWxlUHJvcGVydGllcyAtcXVpZXQKLSMgTG9va3VwIHRoZSBwcm9wZXJ0aWVzIHRoYXQgbmVlZCB0byBiZSBjb21waWxlZCBpbnRvIHJlc291cmNlIGJ1bmRsZXMuCi1QUk9QU09VUkNFUzo9JChzaGVsbCBmaW5kICQoTEFOR1RPT0xTX1RPUERJUikvc3JjL3NoYXJlL2NsYXNzZXMgLW5hbWUgIioucHJvcGVydGllcyIpCi0jIFN0cmlwIGF3YXkgcHJlZml4IGFuZCBzdWZmaXgsIGxlYXZpbmcgZm9yIGV4YW1wbGUgb25seTogImNvbS9zdW4vdG9vbHMvamF2YWMvcmVzb3VyY2VzL2phdmFjX3poX0NOIgotUFJPUFBBVEhTOj0kKHBhdHN1YnN0ICQoTEFOR1RPT0xTX1RPUERJUikvc3JjL3NoYXJlL2NsYXNzZXMvJS5wcm9wZXJ0aWVzLCUsJChQUk9QU09VUkNFUykpCi0jIEdlbmVyYXRlIHRoZSBsaXN0IG9mIGphdmEgZmlsZXMgdG8gYmUgY3JlYXRlZC4KLVBST1BKQVZBUzo9JChwYXRzdWJzdCAlLCQoTEFOR1RPT0xTX09VVFBVVERJUikvZ2Vuc3JjLyUuamF2YSwkKFBST1BQQVRIUykpCi0jIEdlbmVyYXRlIHRoZSBwYWNrYWdlIGRpcnMgZm9yIHRoZSB0b2JlIGdlbmVyYXRlZCBqYXZhIGZpbGVzLgotUFJPUERJUlM6PSQoZGlyICQoUFJPUEpBVkFTKSkKLSMgTm93IGdlbmVyYXRlIGEgc2VxdWVuY2Ugb2YgIi1jb21waWxlIC4uLmphdmFjX3poX0NOLnByb3BlcnRpZXMgLi4uamF2YWNfemhfQ04uamF2YSBqYXZhLnV0aWwuTGlzdFJlc291cmNlQnVuZGxlIgotIyBzdWl0YWJsZSB0byBiZSBmZWQgaW50byB0aGUgQ29tcGlsZVByb3BlcnRpZXMgY29tbWFuZC4KLVBST1BDTURMSU5FOj0kKHN1YnN0IF9TUEFDRV8sJChTUEFDRSksJChqb2luICQoYWRkcHJlZml4IC1jb21waWxlX1NQQUNFXywkKFBST1BTT1VSQ0VTKSksIFwKLQkJJChhZGRzdWZmaXggX1NQQUNFX2phdmEudXRpbC5MaXN0UmVzb3VyY2VCdW5kbGUsJChhZGRwcmVmaXggX1NQQUNFXyQoTEFOR1RPT0xTX09VVFBVVERJUikvZ2Vuc3JjLywkKGFkZHN1ZmZpeCAuamF2YSwkKFBST1BQQVRIUykpKSkpKQotCi0jIE5vdyBzZXR1cCB0aGUgcnVsZSBmb3IgdGhlIGdlbmVyYXRpb24gb2YgdGhlIHJlc291cmNlIGJ1bmRsZXMuCi0kKExBTkdUT09MU19PVVRQVVRESVIpL2dlbnNyYy9fdGhlX3Byb3BzLmQgOiAkKFBST1BTT1VSQ0VTKSAkKEJVSUxEX1RPT0xTKQotCXJtIC1yZiAkKEBEKS8qCi0JbWtkaXIgLXAgJChARCkgJChQUk9QRElSUykKLQlwcmludGYgImpkaz0kKEpES19WRVJTSU9OKVxuZnVsbD0kKEZVTExfVkVSU0lPTilcbnJlbGVhc2U9JChSRUxFQVNFKVxuIiA+ICQoTEFOR1RPT0xTX09VVFBVVERJUikvZ2Vuc3JjL2NvbS9zdW4vdG9vbHMvamF2YWgvcmVzb3VyY2VzL3ZlcnNpb24ucHJvcGVydGllcwotCXByaW50ZiAiamRrPSQoSkRLX1ZFUlNJT04pXG5mdWxsPSQoRlVMTF9WRVJTSU9OKVxucmVsZWFzZT0kKFJFTEVBU0UpXG4iID4gJChMQU5HVE9PTFNfT1VUUFVURElSKS9nZW5zcmMvY29tL3N1bi90b29scy9qYXZhcC9yZXNvdXJjZXMvdmVyc2lvbi5wcm9wZXJ0aWVzCi0JcHJpbnRmICJqZGs9JChKREtfVkVSU0lPTilcbmZ1bGw9JChGVUxMX1ZFUlNJT04pXG5yZWxlYXNlPSQoUkVMRUFTRSlcbiIgPiAkKExBTkdUT09MU19PVVRQVVRESVIpL2dlbnNyYy9jb20vc3VuL3Rvb2xzL2phdmFjL3Jlc291cmNlcy92ZXJzaW9uLnByb3BlcnRpZXMKLQllY2hvIENvbXBpbGluZyAkKHdvcmRzICQoUFJPUFNPVVJDRVMpIHYxIHYyIHYzKSBwcm9wZXJ0aWVzIGludG8gcmVzb3VyY2UgYnVuZGxlcwotCSQoVE9PTF9DT01QSUxFUFJPUFNfQ01EKSAkKFBST1BDTURMSU5FKSBcCi0JCS1jb21waWxlIAkkKExBTkdUT09MU19PVVRQVVRESVIpL2dlbnNyYy9jb20vc3VuL3Rvb2xzL2phdmFoL3Jlc291cmNlcy92ZXJzaW9uLnByb3BlcnRpZXMgXAotCQkJCSQoTEFOR1RPT0xTX09VVFBVVERJUikvZ2Vuc3JjL2NvbS9zdW4vdG9vbHMvamF2YWgvcmVzb3VyY2VzL3ZlcnNpb24uamF2YSBcCi0JCQkJamF2YS51dGlsLkxpc3RSZXNvdXJjZUJ1bmRsZSBcCi0JCS1jb21waWxlIAkkKExBTkdUT09MU19PVVRQVVRESVIpL2dlbnNyYy9jb20vc3VuL3Rvb2xzL2phdmFwL3Jlc291cmNlcy92ZXJzaW9uLnByb3BlcnRpZXMgXAotCQkJCSQoTEFOR1RPT0xTX09VVFBVVERJUikvZ2Vuc3JjL2NvbS9zdW4vdG9vbHMvamF2YXAvcmVzb3VyY2VzL3ZlcnNpb24uamF2YSBcCi0JCQkJamF2YS51dGlsLkxpc3RSZXNvdXJjZUJ1bmRsZSBcCi0JCS1jb21waWxlCSQoTEFOR1RPT0xTX09VVFBVVERJUikvZ2Vuc3JjL2NvbS9zdW4vdG9vbHMvamF2YWMvcmVzb3VyY2VzL3ZlcnNpb24ucHJvcGVydGllcyBcCi0JCQkJJChMQU5HVE9PTFNfT1VUUFVURElSKS9nZW5zcmMvY29tL3N1bi90b29scy9qYXZhYy9yZXNvdXJjZXMvdmVyc2lvbi5qYXZhIFwKLQkJCQlqYXZhLnV0aWwuTGlzdFJlc291cmNlQnVuZGxlCi0JZWNobyBQUk9QU19BUkVfQ1JFQVRFRD15ZXMgPiAkQAotCi0jIFRyaWdnZXIgdGhlIGdlbmVyYXRpb24gb2YgdGhlIHJlc291cmNlIGJ1bmRsZXMuIEFmdGVyIHRoZSByZXNvdXJjZSBidW5kbGVzIGhhdmUKLSMgYmVlbiBjb21waWxlZCwgdGhlbiB0aGUgbWFrZWZpbGUgd2lsbCByZXN0YXJ0IGFuZCB0aGUgbmV3bHkgY3JlYXRlZCBqYXZhIGZpbGVzCi0jIHdpbGwgYmVjb21lIHBhcnQgb2YgdGhlIGJ1aWxkIGZ1cnRoZXIgYWxvbmcgaW4gdGhlIG1ha2VmaWxlLgotLWluY2x1ZGUgJChMQU5HVE9PTFNfT1VUUFVURElSKS9nZW5zcmMvX3RoZV9wcm9wcy5kCi0KLWlmZXEgKCQoUFJPUFNfQVJFX0NSRUFURUQpLHllcykKLSAgICAgICAgIyBTZXR1cCB0aGUgcnVsZXMgdG8gYnVpbGQgYSBkaXN0L2Jvb3RzdHJhcC9saWIvamF2YWMuamFyLCBpZSBhIHNtYWxsZXIgaW50ZXJtZWRpYXRlIGphdmFjCi0gICAgICAgICMgdGhhdCBjYW4gYmUgY29tcGlsZWQgd2l0aCBhbiBvbGQgamF2YWMuIFRoZSBpbnRlcm1lZGlhdGUgamF2YWMgaXMgdGhlbiB1c2VkCi0gICAgICAgICMgdG8gY29tcGlsZSBqYXZhYyBhZ2FpbiBhbmQgdG8gYnVpbGQgdGhlIGNvbXBsZXRlIG5ldyBqZGsuCi0gICAgICAgICQoZXZhbCAkKGNhbGwgU2V0dXBKYXZhQ29tcGlsYXRpb24sQlVJTERfQk9PVFNUUkFQX0xBTkdUT09MUyxcCi0JCVNFVFVQOj1CT09UX0pBVkFDLFwKLQkJRElTQUJMRV9TSkFWQUM6PXRydWUsXAotCQlTUkM6PSQoTEFOR1RPT0xTX1RPUERJUikvc3JjL3NoYXJlL2NsYXNzZXMgJChMQU5HVE9PTFNfT1VUUFVURElSKS9nZW5zcmMsXAotCQlFWENMVURFUzo9Y29tL3N1bi90b29scy9qYXZhYy9uaW8sXAotCQlCSU46PSQoTEFOR1RPT0xTX09VVFBVVERJUikvYnRjbGFzc2VzL2Jvb3RzdHJhcCkpCi0KLSAgICAgICAgJChldmFsICQoY2FsbCBTZXR1cEFyY2hpdmUsQVJDSElWRV9CT09UU1RSQVBfSkFWQUMsJChCVUlMRF9CT09UU1RSQVBfTEFOR1RPT0xTKSxcCi0JCVNSQ1M6PSQoTEFOR1RPT0xTX09VVFBVVERJUikvYnRjbGFzc2VzL2Jvb3RzdHJhcCxcCi0JCUpBUjo9JChMQU5HVE9PTFNfT1VUUFVURElSKS9kaXN0L2Jvb3RzdHJhcC9saWIvamF2YWMuamFyLFwKLQkJSkFSTUFJTjo9Y29tLnN1bi50b29scy5qYXZhYy5NYWluKSkKLQotICAgICAgICAkKGV2YWwgJChjYWxsIFNldHVwQXJjaGl2ZSxBUkNISVZFX0JPT1RTVFJBUF9KQVZBSCwkKEJVSUxEX0JPT1RTVFJBUF9MQU5HVE9PTFMpLFwKLQkJU1JDUzo9JChMQU5HVE9PTFNfT1VUUFVURElSKS9idGNsYXNzZXMvYm9vdHN0cmFwLFwKLQkJSkFSOj0kKExBTkdUT09MU19PVVRQVVRESVIpL2Rpc3QvYm9vdHN0cmFwL2xpYi9qYXZhaC5qYXIsXAotCQlKQVJNQUlOOj1jb20uc3VuLnRvb2xzLmphdmFoLk1haW4pKQotCi0gICAgICAgICQoZXZhbCAkKGNhbGwgU2V0dXBBcmNoaXZlLEFSQ0hJVkVfQk9PVFNUUkFQX0pBVkFQLCQoQlVJTERfQk9PVFNUUkFQX0xBTkdUT09MUyksXAotCQlTUkNTOj0kKExBTkdUT09MU19PVVRQVVRESVIpL2J0Y2xhc3Nlcy9ib290c3RyYXAsXAotCQlKQVI6PSQoTEFOR1RPT0xTX09VVFBVVERJUikvZGlzdC9ib290c3RyYXAvbGliL2phdmFwLmphcixcCi0JCUpBUk1BSU46PWNvbS5zdW4udG9vbHMuamF2YXAuTWFpbikpCi0KLSAgICAgICAgJChldmFsICQoY2FsbCBTZXR1cEFyY2hpdmUsQVJDSElWRV9CT09UU1RSQVBfSkFWQURPQywkKEJVSUxEX0JPT1RTVFJBUF9MQU5HVE9PTFMpLFwKLQkJU1JDUzo9JChMQU5HVE9PTFNfT1VUUFVURElSKS9idGNsYXNzZXMvYm9vdHN0cmFwLFwKLQkJSkFSOj0kKExBTkdUT09MU19PVVRQVVRESVIpL2Rpc3QvYm9vdHN0cmFwL2xpYi9qYXZhZG9jLmphcixcCi0JCUpBUk1BSU46PWNvbS5zdW4udG9vbHMuamF2YWRvYy5NYWluKSkKLQotICAgICAgICAjIEdlblN0dWJzIGlzIHVzZWQgdG8gYm9vdHN0cmFwIGFueSBkZXBlbmRlbmNpZXMgZnJvbSBqYXZhYyB0byB0aGUgbmV3IEpESyB0aGF0IGlzIG5vdCAKLSAgICAgICAgIyB5ZXQgYnVpbHQuIEl0IGlzIGN1cnJlbnRseSBub3QgbmVlZGVkIGJ1dCBtaWdodCBiZSBhZ2FpbiBpbiB0aGUgZnV0dXJlLiBUaGUgZm9sbG93aW5nCi0gICAgICAgICMgZXhlcmNpc2VzIHRoZSBmdW5jdGlvbmFsaXR5IHRvIHZlcmlmeSB0aGF0IGl0IHdvcmtzLgotICAgICAgICBUT09MX0dFTlNUVUJTX0NNRD0kKEpBVkEpIFwKLSAgICAgICAgICAgICAiLVhib290Y2xhc3NwYXRoL3A6JChMQU5HVE9PTFNfT1VUUFVURElSKS9kaXN0L2Jvb3RzdHJhcC9saWIvamF2YWMuamFyIiBcCi0gICAgICAgICAgICAgLWNsYXNzcGF0aCAkKExBTkdUT09MU19PVVRQVVRESVIpL2J0Y2xhc3NlcyBcCi0gICAgICAgICAgICAgZ2Vuc3R1YnMuR2VuU3R1YnMKLSAgICAgICAgIyBXZSBmZXRjaCBzb3VyY2UgZnJvbSB0aGUgSkRLLi4uCi0gICAgICAgIEpES1M9JChKREtfVE9QRElSKS9zcmMvc2hhcmUvY2xhc3NlcwotICAgICAgICAjIEJ1aWxkIHRoZSBsaXN0IG9mIGNsYXNzZXMgdG8gZ2VuZXJhdGUgc3R1YnMgZnJvbS4gamF2YS91dGlsL09iamVjdHMuamF2YSBpc24ndAotICAgICAgICAjIGN1cnJlbnRseSBuZWVkZWQsIGJ1dCBpcyB1c2VkIGFzIGEgZGVtbyBmb3Igbm93LgotCSBTVFVCU09VUkNFUzo9JChzaGVsbCAkKEZJTkQpICQoSkRLUykgLW5hbWUgIiouamF2YSIgfCAkKEdSRVApIFwKLQkJICAgIC1lICIkKEpES1MpL2phdmEvdXRpbC9PYmplY3RzLmphdmEiKQotICAgICAgICAjIFJld3JpdGUgdGhlIGZpbGUgbmFtZXMgaW50byBjbGFzcyBuYW1lcyBiZWNhdXNlIHRoZSBHZW5TdHVicyB0b29sIHJlcXVpcmUgdGhpcy4KLSAgICAgICAgU1RVQkNMQVNTRVM6PSQoc3Vic3QgLywuLCQocGF0c3Vic3QgJChKREtTKS8lLmphdmEsJSwkKFNUVUJTT1VSQ0VTKSkpCi0KLSAgICAgICAgIyBOb3cgc2V0dXAgdGhlIGJ1aWxkIHJlY2lwZSBmb3IgZ2Vuc3R1YnMuCi0gICAgICAgICQoTEFOR1RPT0xTX09VVFBVVERJUikvZ2Vuc3R1YnMvX3RoZV9zdHVicy5kIDogJChTVFVCU09VUkNFUykgJChCVUlMRF9UT09MUykgXAotCQkJCSQoTEFOR1RPT0xTX09VVFBVVERJUikvZGlzdC9ib290c3RyYXAvbGliL2phdmFjLmphciBcCi0JCQkJJChMQU5HVE9PTFNfT1VUUFVURElSKS9nZW5zcmMvX3RoZV9wcm9wcy5kCi0JICAgICAgIAlta2RpciAtcCAkKEBEKQotCQlta2RpciAtcCAkKExBTkdUT09MU19PVVRQVVRESVIpL3RtcHN0dWJzCi0JICAgICAgIAllY2hvIEdlbmVyYXRpbmcgc3R1YnMgZnJvbSBKREsgc291cmNlcy4KLQkgICAgICAgCSgkKFRPT0xfR0VOU1RVQlNfQ01EKSAtcyAkKExBTkdUT09MU19PVVRQVVRESVIpL3RtcHN0dWJzIC1zb3VyY2VwYXRoICQoSkRLUykgJChTVFVCQ0xBU1NFUykgJiYgZWNobyBTVFVCU19BUkVfQ1JFQVRFRD15ZXMgPiAkQCkKLQkJaWYgJChESUZGKSAteCAiX3RoZSoiIC1ycSAkKExBTkdUT09MU19PVVRQVVRESVIpL3RtcHN0dWJzICQoTEFOR1RPT0xTX09VVFBVVERJUikvZ2Vuc3R1YnMgPiAvZGV2L251bGwgMj4mMTsgdGhlbiBcCi0JCQllY2hvIE5vIGNoYW5nZXMgaW4gdGhlIHN0dWJzITsgXAotCQkJcm0gLXJmICQoTEFOR1RPT0xTX09VVFBVVERJUikvdG1wc3R1YnM7IFwKLQkJZWxzZSBcCi0JCQllY2hvIENoYW5nZXMgaW4gc3R1YnMgZGV0ZWN0ZWQhOyBcCi0JCQlybSAtcmYgJChARCk7IFwKLQkJCW12ICQoTEFOR1RPT0xTX09VVFBVVERJUikvdG1wc3R1YnMgJChARCk7IFwKLQkJZmkKLQkJZWNobyBTVFVCU19BUkVfQ1JFQVRFRD15ZXMgPiAkQAotCi0gICAgICAgICMgVHJpZ2dlciBhIGdlbmVyYXRpb24gb2YgdGhlIGdlbnN0dWJzIGphdmEgc291cmNlIGNvZGUgYW5kIGEgcmVzdGFydAotICAgICAgICAjIG9mIHRoZSBtYWtlZmlsZSB0byBtYWtlIHN1cmUgdGhhdCB0aGUgZm9sbG93aW5nIGJ1aWxkIHNldHVwIHVzZSB0aGUgCi0gICAgICAgICMgbmV3bHkgY3JlYXRlZCBqYXZhIGZpbGVzLgotICAgICAgICAtaW5jbHVkZSAkKExBTkdUT09MU19PVVRQVVRESVIpL2dlbnN0dWJzL190aGVfc3R1YnMuZAotCi0JaWZlcSAoJChTVFVCU19BUkVfQ1JFQVRFRCkseWVzKQotICAgICAgICAgICAgICAgICMgU2V0dXAgYSBjb21waWxlciBjb25maWd1cmF0aW9uIHVzaW5nIHRoZSBpbnRlcm1lZGlhdGUgamF2YWMgaW4gZGlzdC9ib290c3RyYXAvbGliL2phdmFjLmphcgotICAgICAgICAgICAgICAgICMgdGhhdCBnZW5lcmF0ZXMgY29kZSBmb3IgdGhlIG5ldyBqZGsgdGhhdCBpcyBiZWluZyBidWlsdC4KLSAgICAgICAgICAgICAgICAjIFRoZSBjb2RlIGNvbXBpbGVkIGJ5IHRoaXMgY29tcGlsZXIgc2V0dXAsIGNhbm5vdCBuZWNlc3NhcmlseSBiZSBydW4gd2l0aCB0aGUgYm9vdHN0cmFwIGp2bS4KLSAgICAgICAgICAgICAgICAkKGV2YWwgJChjYWxsIFNldHVwSmF2YUNvbXBpbGVyLEdFTkVSQVRFX05FV0JZVEVDT0RFLFwKLSAgICAgICAgICAgICAgICAgIEpWTTo9JChKQVZBKSxcCi0gICAgICAgICAgICAgICAgICBKQVZBQzo9Ii1YYm9vdGNsYXNzcGF0aC9wOiQoTEFOR1RPT0xTX09VVFBVVERJUikvZGlzdC9ib290c3RyYXAvbGliL2phdmFjLmphciIgXAotCQkJIC1qYXIgJChMQU5HVE9PTFNfT1VUUFVURElSKS9kaXN0L2Jvb3RzdHJhcC9saWIvamF2YWMuamFyLFwKLSAgICAgICAgICAgICAgICAgIEZMQUdTOj0tWERpZ25vcmUuc3ltYm9sLmZpbGU9dHJ1ZSAtWGxpbnQ6YWxsJChDT01NQSktZGVwcmVjYXRpb24gLVdlcnJvcixcCi0gICAgICAgICAgICAgICAgICBTRVJWRVJfRElSOj0kKFNKQVZBQ19TRVJWRVJfRElSKSxcCi0gICAgICAgICAgICAgICAgICBTRVJWRVJfSlZNOj0kKFNKQVZBQ19TRVJWRVJfSkFWQSkpKQotCi0gICAgICAgICAgICAgICAgIyBqYXZheC50b29scy5KYXZhQ29tcGlsZXJUb29sIGlzbid0IHJlYWxseSBhIHN1ZmZpeCBidXQgdGhpcyBnZXRzIHRoZSBmaWxlIGNvcGllZC4KLQkJUkVTT1VSQ0VfU1VGRklYRVM6PS5naWYgLnhtbCAuY3NzIGphdmF4LnRvb2xzLkphdmFDb21waWxlclRvb2wKLQotICAgICAgICAgICAgICAgICQoZXZhbCAkKGNhbGwgU2V0dXBKYXZhQ29tcGlsYXRpb24sQlVJTERfRlVMTF9KQVZBQyxcCi0JCQlTRVRVUDo9R0VORVJBVEVfTkVXQllURUNPREUsXAotCQkJU1JDOj0kKExBTkdUT09MU19UT1BESVIpL3NyYy9zaGFyZS9jbGFzc2VzICQoTEFOR1RPT0xTX09VVFBVVERJUikvZ2Vuc3JjIFwKLQkJCSAgICAgJChMQU5HVE9PTFNfT1VUUFVURElSKS9nZW5zdHVicyxcCi0JCQlFWENMVURFUzo9amF2YS91dGlsIGphdmEvaW8gamF2YS9uaW8sXAotCQkJQ09QWTo9JChSRVNPVVJDRV9TVUZGSVhFUyksXAotCQkJQklOOj0kKExBTkdUT09MU19PVVRQVVRESVIpL2NsYXNzZXMpKQotCi0gICAgICAgICAgICAgICAgJChldmFsICQoY2FsbCBTZXR1cEFyY2hpdmUsQVJDSElWRV9GVUxMX0pBVkFDLCQoQlVJTERfRlVMTF9KQVZBQyksXAotCQkJU0VUVVA6PUdFTkVSQVRFX05FV0JZVEVDT0RFLFwKLQkJCVNSQ1M6PSQoTEFOR1RPT0xTX09VVFBVVERJUikvY2xhc3NlcyxcCi0JCQlTVUZGSVhFUzo9LmNsYXNzICQoUkVTT1VSQ0VfU1VGRklYRVMpLFwKLQkJCUpBUjo9JChMQU5HVE9PTFNfT1VUUFVURElSKS9kaXN0L2xpYi9jbGFzc2VzLmphcikpCi0KLSAgICAgICAgICAgICAgICAkKGV2YWwgJChjYWxsIFNldHVwWmlwQXJjaGl2ZSxaSVBfRlVMTF9KQVZBQ19TT1VSQ0UsXAotCQkJU1JDOj0kKExBTkdUT09MU19UT1BESVIpL3NyYy9zaGFyZS9jbGFzc2VzICQoTEFOR1RPT0xTX09VVFBVVERJUikvZ2Vuc3JjLFwKLQkJCVpJUDo9JChMQU5HVE9PTFNfT1VUUFVURElSKS9kaXN0L2xpYi9zcmMuemlwKSkKLQotICAgICAgICAgICAgICAgIGFsbDogCQkkKExBTkdUT09MU19PVVRQVVRESVIpL2Rpc3QvbGliL2NsYXNzZXMuamFyIFwKLQkJCQkkKExBTkdUT09MU19PVVRQVVRESVIpL2Rpc3QvbGliL3NyYy56aXAgXAotCSAgICAgICAgICAgICAgICAgCSQoTEFOR1RPT0xTX09VVFBVVERJUikvZGlzdC9ib290c3RyYXAvbGliL2phdmFjLmphciBcCi0JCQkJJChMQU5HVE9PTFNfT1VUUFVURElSKS9kaXN0L2Jvb3RzdHJhcC9saWIvamF2YWguamFyIFwKLQkJCQkkKExBTkdUT09MU19PVVRQVVRESVIpL2Rpc3QvYm9vdHN0cmFwL2xpYi9qYXZhcC5qYXIgXAotCQkJCSQoTEFOR1RPT0xTX09VVFBVVERJUikvZGlzdC9ib290c3RyYXAvbGliL2phdmFkb2MuamFyCi0KLQotICAgICAgICBlbmRpZgorIyBMb2NhdGUgdGhpcyBNYWtlZmlsZQoraWZlcSAoJChmaWx0ZXIgLyUsJChsYXN0d29yZCAkKE1BS0VGSUxFX0xJU1QpKSksKQorICAgIG1ha2VmaWxlX3BhdGg6PSQoQ1VSRElSKS8kKGxhc3R3b3JkICQoTUFLRUZJTEVfTElTVCkpCitlbHNlCisgICAgbWFrZWZpbGVfcGF0aDo9JChsYXN0d29yZCAkKE1BS0VGSUxFX0xJU1QpKQogZW5kaWYKK3JlcG9fZGlyOj0kKHBhdHN1YnN0ICUvbWFrZWZpbGVzL01ha2VmaWxlLCUsJChtYWtlZmlsZV9wYXRoKSkKKworIyBXaGF0IGlzIHRoZSBuYW1lIG9mIHRoaXMgc3Vic3lzdGVtIChsYW5ndG9vbHMsIGNvcmJhLCBldGMpPworc3Vic3lzdGVtX25hbWU6PSQobm90ZGlyICQocmVwb19kaXIpKQorCisjIFRyeSB0byBsb2NhdGUgdG9wLWxldmVsIG1ha2VmaWxlCit0b3BfbGV2ZWxfbWFrZWZpbGU6PSQocmVwb19kaXIpLy4uL2NvbW1vbi9tYWtlZmlsZXMvTWFrZWZpbGUKK2lmbmVxICgkKHdpbGRjYXJkICQodG9wX2xldmVsX21ha2VmaWxlKSksKQorICAkKGluZm8gV2lsbCBydW4gJChzdWJzeXN0ZW1fbmFtZSkgdGFyZ2V0IG9uIHRvcC1sZXZlbCBNYWtlZmlsZSkKKyAgJChpbmZvIFdBUk5JTkc6IFRoaXMgaXMgYSBub24tcmVjb21tZW5kZWQgd2F5IG9mIGJ1aWxkaW5nISkKKyAgJChpbmZvID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSkKK2Vsc2UKKyAgJChpbmZvIENhbm5vdCBsb2NhdGUgdG9wLWxldmVsIE1ha2VmaWxlLiBJcyB0aGlzIHJlcG8gbm90IGNoZWNrZWQgb3V0IGFzIHBhcnQgb2YgYSBjb21wbGV0ZSBmb3Jlc3Q/KQorICAkKGVycm9yIEJ1aWxkIGZyb20gdG9wLWxldmVsIE1ha2VmaWxlIGluc3RlYWQpCitlbmRpZgorCithbGw6CisJQCQoTUFLRSkgLWYgJCh0b3BfbGV2ZWxfbWFrZWZpbGUpICQoc3Vic3lzdGVtX25hbWUpCmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9qYXZhZG9jL1RhZy5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vamF2YWRvYy9UYWcuamF2YQppbmRleCA5NmZhYWM1Li4yZTEyOWY1IDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9qYXZhZG9jL1RhZy5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL2phdmFkb2MvVGFnLmphdmEKQEAgLTcwLDE0ICs3MCwxNCBAQAogICAgICAqIHRoYW4gb25lIHRhZyBvZiBhIGdpdmVuIGtpbmQ6CiAgICAgICogPHA+CiAgICAgICogPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjQiIGNlbGxzcGFjaW5nPSIwIj4KLSAgICAgKiA8dHI+PHRoPjx0dD4ga2luZCgpICA8L3RoPiAgPHRoPjx0dD4gbmFtZSgpICAgICAgPC90aD48L3RyPgotICAgICAqIDx0cj48dGQ+PHR0PiBAdGhyb3dzIDwvdGQ+ICA8dGQ+PHR0PiBAdGhyb3dzICAgICA8L3RkPjwvdHI+Ci0gICAgICogPHRyPjx0ZD48dHQ+IEB0aHJvd3MgPC90ZD4gIDx0ZD48dHQ+IEBleGNlcHRpb24gIDwvdGQ+PC90cj4KLSAgICAgKiA8dHI+PHRkPjx0dD4gQHNlZSAgICA8L3RkPiAgPHRkPjx0dD4gQHNlZSAgICAgICAgPC90ZD48L3RyPgotICAgICAqIDx0cj48dGQ+PHR0PiBAc2VlICAgIDwvdGQ+ICA8dGQ+PHR0PiBAbGluayAgICAgICA8L3RkPjwvdHI+Ci0gICAgICogPHRyPjx0ZD48dHQ+IEBzZWUgICAgPC90ZD4gIDx0ZD48dHQ+IEBsaW5rcGxhaW4gIDwvdGQ+PC90cj4KLSAgICAgKiA8dHI+PHRkPjx0dD4gQHNlcmlhbCA8L3RkPiAgPHRkPjx0dD4gQHNlcmlhbCAgICAgPC90ZD48L3RyPgotICAgICAqIDx0cj48dGQ+PHR0PiBAc2VyaWFsIDwvdGQ+ICA8dGQ+PHR0PiBAc2VyaWFsRGF0YSA8L3RkPjwvdHI+CisgICAgICogPHRyPjx0aD48dHQ+IGtpbmQoKSAgPC90dD48L3RoPiAgPHRoPjx0dD4gbmFtZSgpICAgICAgPC90dD48L3RoPjwvdHI+CisgICAgICogPHRyPjx0ZD48dHQ+IEB0aHJvd3MgPC90dD48L3RkPiAgPHRkPjx0dD4gQHRocm93cyAgICAgPC90dD48L3RkPjwvdHI+CisgICAgICogPHRyPjx0ZD48dHQ+IEB0aHJvd3MgPC90dD48L3RkPiAgPHRkPjx0dD4gQGV4Y2VwdGlvbiAgPC90dD48L3RkPjwvdHI+CisgICAgICogPHRyPjx0ZD48dHQ+IEBzZWUgICAgPC90dD48L3RkPiAgPHRkPjx0dD4gQHNlZSAgICAgICAgPC90dD48L3RkPjwvdHI+CisgICAgICogPHRyPjx0ZD48dHQ+IEBzZWUgICAgPC90dD48L3RkPiAgPHRkPjx0dD4gQGxpbmsgICAgICAgPC90dD48L3RkPjwvdHI+CisgICAgICogPHRyPjx0ZD48dHQ+IEBzZWUgICAgPC90dD48L3RkPiAgPHRkPjx0dD4gQGxpbmtwbGFpbiAgPC90dD48L3RkPjwvdHI+CisgICAgICogPHRyPjx0ZD48dHQ+IEBzZXJpYWwgPC90dD48L3RkPiAgPHRkPjx0dD4gQHNlcmlhbCAgICAgPC90dD48L3RkPjwvdHI+CisgICAgICogPHRyPjx0ZD48dHQ+IEBzZXJpYWwgPC90dD48L3RkPiAgPHRkPjx0dD4gQHNlcmlhbERhdGEgPC90dD48L3RkPjwvdHI+CiAgICAgICogPC90YWJsZT4KICAgICAgKi8KICAgICBTdHJpbmcga2luZCgpOwpkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vc291cmNlL3RyZWUvQ29tcGlsYXRpb25Vbml0VHJlZS5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vc291cmNlL3RyZWUvQ29tcGlsYXRpb25Vbml0VHJlZS5qYXZhCmluZGV4IDY2YjU4NWMuLmU2ZmYxYWEgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3NvdXJjZS90cmVlL0NvbXBpbGF0aW9uVW5pdFRyZWUuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9zb3VyY2UvdHJlZS9Db21waWxhdGlvblVuaXRUcmVlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNyw3ICsyNyw2IEBACiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZheC50b29scy5KYXZhRmlsZU9iamVjdDsKLWltcG9ydCBjb20uc3VuLnNvdXJjZS50cmVlLkxpbmVNYXA7CiAKIC8qKgogICogUmVwcmVzZW50cyB0aGUgYWJzdHJhY3Qgc3ludGF4IHRyZWUgZm9yIGNvbXBpbGF0aW9uIHVuaXRzIChzb3VyY2UKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3NvdXJjZS90cmVlL1Njb3BlLmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9zb3VyY2UvdHJlZS9TY29wZS5qYXZhCmluZGV4IDQ0MWYzMzcuLjVkODZmYzggMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3NvdXJjZS90cmVlL1Njb3BlLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vc291cmNlL3RyZWUvU2NvcGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDExICsyNSw5IEBACiAKIHBhY2thZ2UgY29tLnN1bi5zb3VyY2UudHJlZTsKIAotaW1wb3J0IGNvbS5zdW4uc291cmNlLnRyZWUuVHJlZTsKIGltcG9ydCBqYXZheC5sYW5nLm1vZGVsLmVsZW1lbnQuRWxlbWVudDsKIGltcG9ydCBqYXZheC5sYW5nLm1vZGVsLmVsZW1lbnQuRXhlY3V0YWJsZUVsZW1lbnQ7CiBpbXBvcnQgamF2YXgubGFuZy5tb2RlbC5lbGVtZW50LlR5cGVFbGVtZW50OwotaW1wb3J0IGphdmF4LmxhbmcubW9kZWwudHlwZS5EZWNsYXJlZFR5cGU7CiAKIC8qKgogICogSW50ZXJmYWNlIGZvciBkZXRlcm1pbmluZyBsb2NhbGx5IGF2YWlsYWJsZSBwcm9ncmFtIGVsZW1lbnRzLCBzdWNoIGFzCmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9zb3VyY2UvdXRpbC9UYXNrRXZlbnQuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3NvdXJjZS91dGlsL1Rhc2tFdmVudC5qYXZhCmluZGV4IDdmNDUxNDkuLjlhZGUyMWYgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3NvdXJjZS91dGlsL1Rhc2tFdmVudC5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3NvdXJjZS91dGlsL1Rhc2tFdmVudC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMTAgKzI1LDExIEBACiAKIHBhY2thZ2UgY29tLnN1bi5zb3VyY2UudXRpbDsKIAotaW1wb3J0IGNvbS5zdW4uc291cmNlLnRyZWUuQ29tcGlsYXRpb25Vbml0VHJlZTsKIGltcG9ydCBqYXZheC5sYW5nLm1vZGVsLmVsZW1lbnQuVHlwZUVsZW1lbnQ7CiBpbXBvcnQgamF2YXgudG9vbHMuSmF2YUZpbGVPYmplY3Q7CiAKK2ltcG9ydCBjb20uc3VuLnNvdXJjZS50cmVlLkNvbXBpbGF0aW9uVW5pdFRyZWU7CisKIC8qKgogICogUHJvdmlkZXMgZGV0YWlscyBhYm91dCB3b3JrIHRoYXQgaGFzIGJlZW4gZG9uZSBieSB0aGUgSkRLIEphdmEgQ29tcGlsZXIsIGphdmFjLgogICoKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3NvdXJjZS91dGlsL1RyZWVQYXRoLmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi9zb3VyY2UvdXRpbC9UcmVlUGF0aC5qYXZhCmluZGV4IDEwM2Y2MjQuLmVlZjQwMGEgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3NvdXJjZS91dGlsL1RyZWVQYXRoLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vc291cmNlL3V0aWwvVHJlZVBhdGguamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDkgKzI1LDEwIEBACiAKIHBhY2thZ2UgY29tLnN1bi5zb3VyY2UudXRpbDsKIAotaW1wb3J0IGNvbS5zdW4uc291cmNlLnRyZWUuKjsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiAKK2ltcG9ydCBjb20uc3VuLnNvdXJjZS50cmVlLio7CisKIC8qKgogICogQSBwYXRoIG9mIHRyZWUgbm9kZXMsIHR5cGljYWxseSB1c2VkIHRvIHJlcHJlc2VudCB0aGUgc2VxdWVuY2Ugb2YgYW5jZXN0b3IKICAqIG5vZGVzIG9mIGEgdHJlZSBub2RlIHVwIHRvIHRoZSB0b3AgbGV2ZWwgQ29tcGlsYXRpb25Vbml0VHJlZSBub2RlLgpkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvY2xhc3NmaWxlL0Jvb3RzdHJhcE1ldGhvZHNfYXR0cmlidXRlLmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9jbGFzc2ZpbGUvQm9vdHN0cmFwTWV0aG9kc19hdHRyaWJ1dGUuamF2YQppbmRleCAzODA0MzMzLi42OWQwMzQ3IDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9jbGFzc2ZpbGUvQm9vdHN0cmFwTWV0aG9kc19hdHRyaWJ1dGUuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9jbGFzc2ZpbGUvQm9vdHN0cmFwTWV0aG9kc19hdHRyaWJ1dGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI4LDggKzI4LDggQEAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogCiAvKioKLSAqIFNlZSBKVk1TIDxUQkQ+Ci0gKiBodHRwOi8vY3Iub3Blbmpkay5qYXZhLm5ldC9+anJvc2UvcHJlcy9pbmR5LWphdmFkb2MtbWx2bS8KKyAqIFNlZSBKVk1TIDQuNy4yMQorICogaHR0cDovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2Uvc3BlY3MvanZtcy9zZTcvaHRtbC9qdm1zLTQuaHRtbCNqdm1zLTQuNy4yMQogICoKICAqICA8cD48Yj5UaGlzIGlzIE5PVCBwYXJ0IG9mIGFueSBzdXBwb3J0ZWQgQVBJLgogICogIElmIHlvdSB3cml0ZSBjb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGlzLCB5b3UgZG8gc28gYXQgeW91ciBvd24gcmlzay4KZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2NsYXNzZmlsZS9DbGFzc1RyYW5zbGF0b3IuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2NsYXNzZmlsZS9DbGFzc1RyYW5zbGF0b3IuamF2YQppbmRleCBmNDBhOGQ1Li42YTViZDhjIDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9jbGFzc2ZpbGUvQ2xhc3NUcmFuc2xhdG9yLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvY2xhc3NmaWxlL0NsYXNzVHJhbnNsYXRvci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsNiArMjUsOCBAQAogCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuY2xhc3NmaWxlOwogCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKwogaW1wb3J0IGNvbS5zdW4udG9vbHMuY2xhc3NmaWxlLkNvbnN0YW50UG9vbC5DT05TVEFOVF9DbGFzc19pbmZvOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuY2xhc3NmaWxlLkNvbnN0YW50UG9vbC5DT05TVEFOVF9Eb3VibGVfaW5mbzsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmNsYXNzZmlsZS5Db25zdGFudFBvb2wuQ09OU1RBTlRfRmllbGRyZWZfaW5mbzsKQEAgLTQwLDcgKzQyLDYgQEAKIGltcG9ydCBjb20uc3VuLnRvb2xzLmNsYXNzZmlsZS5Db25zdGFudFBvb2wuQ09OU1RBTlRfU3RyaW5nX2luZm87CiBpbXBvcnQgY29tLnN1bi50b29scy5jbGFzc2ZpbGUuQ29uc3RhbnRQb29sLkNPTlNUQU5UX1V0ZjhfaW5mbzsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmNsYXNzZmlsZS5Db25zdGFudFBvb2wuQ1BJbmZvOwotaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIC8qKgogICogUmV3cml0ZXMgYSBjbGFzcyBmaWxlIHVzaW5nIGEgbWFwIG9mIHRyYW5zbGF0aW9ucy4KZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2NsYXNzZmlsZS9EZXBlbmRlbmNpZXMuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2NsYXNzZmlsZS9EZXBlbmRlbmNpZXMuamF2YQppbmRleCBjZmZhNzc4Li5hMzM5NjQzIDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9jbGFzc2ZpbGUvRGVwZW5kZW5jaWVzLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvY2xhc3NmaWxlL0RlcGVuZGVuY2llcy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMzMsOCArMzMsOCBAQAogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CiAKLWltcG9ydCBjb20uc3VuLnRvb2xzLmNsYXNzZmlsZS5EZXBlbmRlbmN5LkZpbmRlcjsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmNsYXNzZmlsZS5EZXBlbmRlbmN5LkZpbHRlcjsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmNsYXNzZmlsZS5EZXBlbmRlbmN5LkZpbmRlcjsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmNsYXNzZmlsZS5EZXBlbmRlbmN5LkxvY2F0aW9uOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuY2xhc3NmaWxlLlR5cGUuQXJyYXlUeXBlOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuY2xhc3NmaWxlLlR5cGUuQ2xhc3NTaWdUeXBlOwpAQCAtNDMsNyArNDMsNiBAQAogaW1wb3J0IGNvbS5zdW4udG9vbHMuY2xhc3NmaWxlLlR5cGUuU2ltcGxlVHlwZTsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmNsYXNzZmlsZS5UeXBlLlR5cGVQYXJhbVR5cGU7CiBpbXBvcnQgY29tLnN1bi50b29scy5jbGFzc2ZpbGUuVHlwZS5XaWxkY2FyZFR5cGU7Ci0KIGltcG9ydCBzdGF0aWMgY29tLnN1bi50b29scy5jbGFzc2ZpbGUuQ29uc3RhbnRQb29sLio7CiAKIC8qKgpAQCAtOTksNyArOTgsNyBAQAogICAgICAgICAgKiBHZXQgdGhlIENsYXNzRmlsZSBvYmplY3QgZm9yIGEgc3BlY2lmaWVkIGNsYXNzLgogICAgICAgICAgKiBAcGFyYW0gY2xhc3NOYW1lIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyB0byBiZSByZXR1cm5lZC4KICAgICAgICAgICogQHJldHVybiB0aGUgQ2xhc3NGaWxlIGZvciB0aGUgZ2l2ZW4gY2xhc3MKLSAgICAgICAgICogQHRocm93cyBEZXBlbmRlbmNpZXMjQ2xhc3NGaWxlTm90Rm91bmRFeGNlcHRpb24gaWYgdGhlIGNsYXNzZmlsZSBjYW5ub3QgYmUKKyAgICAgICAgICogQHRocm93cyBEZXBlbmRlbmNpZXMuQ2xhc3NGaWxlTm90Rm91bmRFeGNlcHRpb24gaWYgdGhlIGNsYXNzZmlsZSBjYW5ub3QgYmUKICAgICAgICAgICogICBmb3VuZAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIENsYXNzRmlsZSBnZXRDbGFzc0ZpbGUoU3RyaW5nIGNsYXNzTmFtZSkKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2NsYXNzZmlsZS9EZXNjcmlwdG9yLmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9jbGFzc2ZpbGUvRGVzY3JpcHRvci5qYXZhCmluZGV4IDI4ZGIzMzEuLjdjYmMzNDggMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2NsYXNzZmlsZS9EZXNjcmlwdG9yLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvY2xhc3NmaWxlL0Rlc2NyaXB0b3IuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDksIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTExNCw3ICsxMTQsNyBAQAogICAgIHByaXZhdGUgU3RyaW5nIHBhcnNlKFN0cmluZyBkZXNjLCBpbnQgc3RhcnQsIGludCBlbmQpCiAgICAgICAgICAgICB0aHJvd3MgSW52YWxpZERlc2NyaXB0b3IgewogICAgICAgICBpbnQgcCA9IHN0YXJ0OwotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogICAgICAgICBpbnQgZGltcyA9IDA7CiAgICAgICAgIGNvdW50ID0gMDsKIApkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvY2xhc3NmaWxlL0luc3RydWN0aW9uLmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9jbGFzc2ZpbGUvSW5zdHJ1Y3Rpb24uamF2YQppbmRleCBhMmQzNmY1Li5hYWZiOTg2IDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9jbGFzc2ZpbGUvSW5zdHJ1Y3Rpb24uamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9jbGFzc2ZpbGUvSW5zdHJ1Y3Rpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTEwMyw3ICsxMDMsNyBAQAogICAgICAgICBSIHZpc2l0Q29uc3RhbnRQb29sUmVmQW5kVmFsdWUoSW5zdHJ1Y3Rpb24gaW5zdHIsIGludCBpbmRleCwgaW50IHZhbHVlLCBQIHApOwogICAgICAgICAvKiogU2VlIHtAbGluayBLaW5kI0xPQ0FMfS4gKi8KICAgICAgICAgUiB2aXNpdExvY2FsKEluc3RydWN0aW9uIGluc3RyLCBpbnQgaW5kZXgsIFAgcCk7Ci0gICAgICAgIC8qKiBTZWUge0BsaW5rIEtpbmQjTE9DQUxfVUJZVEV9LiAqLworICAgICAgICAvKiogU2VlIHtAbGluayBLaW5kI0xPQ0FMX0JZVEV9LiAqLwogICAgICAgICBSIHZpc2l0TG9jYWxBbmRWYWx1ZShJbnN0cnVjdGlvbiBpbnN0ciwgaW50IGluZGV4LCBpbnQgdmFsdWUsIFAgcCk7CiAgICAgICAgIC8qKiBTZWUge0BsaW5rIEtpbmQjRFlOQU1JQ30uICovCiAgICAgICAgIFIgdmlzaXRMb29rdXBTd2l0Y2goSW5zdHJ1Y3Rpb24gaW5zdHIsIGludCBkZWZhdWx0XywgaW50IG5wYWlycywgaW50W10gbWF0Y2hlcywgaW50W10gb2Zmc2V0cywgUCBwKTsKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL0Fic3RyYWN0RXhlY3V0YWJsZU1lbWJlcldyaXRlci5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9mb3JtYXRzL2h0bWwvQWJzdHJhY3RFeGVjdXRhYmxlTWVtYmVyV3JpdGVyLmphdmEKaW5kZXggMTkxYjM5Mi4uNjYzM2I3OCAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9mb3JtYXRzL2h0bWwvQWJzdHJhY3RFeGVjdXRhYmxlTWVtYmVyV3JpdGVyLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9mb3JtYXRzL2h0bWwvQWJzdHJhY3RFeGVjdXRhYmxlTWVtYmVyV3JpdGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAxOTk3LCAyMDEwLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0zMyw2ICszMywxMSBAQAogLyoqCiAgKiBQcmludCBtZXRob2QgYW5kIGNvbnN0cnVjdG9yIGluZm8uCiAgKgorICogIDxwPjxiPlRoaXMgaXMgTk9UIHBhcnQgb2YgYW55IHN1cHBvcnRlZCBBUEkuCisgKiAgSWYgeW91IHdyaXRlIGNvZGUgdGhhdCBkZXBlbmRzIG9uIHRoaXMsIHlvdSBkbyBzbyBhdCB5b3VyIG93biByaXNrLgorICogIFRoaXMgY29kZSBhbmQgaXRzIGludGVybmFsIGludGVyZmFjZXMgYXJlIHN1YmplY3QgdG8gY2hhbmdlIG9yCisgKiAgZGVsZXRpb24gd2l0aG91dCBub3RpY2UuPC9iPgorICoKICAqIEBhdXRob3IgUm9iZXJ0IEZpZWxkCiAgKiBAYXV0aG9yIEF0dWwgTSBEYW1iYWxrYXIKICAqIEBhdXRob3IgQmhhdmVzaCBQYXRlbCAoTW9kaWZpZWQpCkBAIC04MSw3ICs4Niw3IEBACiAgICAgICogQWRkIHRoZSBzdW1tYXJ5IGxpbmsgZm9yIHRoZSBtZW1iZXIuCiAgICAgICoKICAgICAgKiBAcGFyYW0gY29udGV4dCB0aGUgaWQgb2YgdGhlIGNvbnRleHQgd2hlcmUgdGhlIGxpbmsgd2lsbCBiZSBwcmludGVkCi0gICAgICogQHBhcmFtIGNsYXNzRG9jIHRoZSBjbGFzc0RvYyB0aGF0IHdlIHNob3VsZCBsaW5rIHRvCisgICAgICogQHBhcmFtIGNkIHRoZSBjbGFzc0RvYyB0aGF0IHdlIHNob3VsZCBsaW5rIHRvCiAgICAgICogQHBhcmFtIG1lbWJlciB0aGUgbWVtYmVyIGJlaW5nIGxpbmtlZCB0bwogICAgICAqIEBwYXJhbSB0ZFN1bW1hcnkgdGhlIGNvbnRlbnQgdHJlZSB0byB3aGljaCB0aGUgbGluayB3aWxsIGJlIGFkZGVkCiAgICAgICovCkBAIC0xMDEsNyArMTA2LDcgQEAKICAgICAvKioKICAgICAgKiBBZGQgdGhlIGluaGVyaXRlZCBzdW1tYXJ5IGxpbmsgZm9yIHRoZSBtZW1iZXIuCiAgICAgICoKLSAgICAgKiBAcGFyYW0gY2xhc3NEb2MgdGhlIGNsYXNzRG9jIHRoYXQgd2Ugc2hvdWxkIGxpbmsgdG8KKyAgICAgKiBAcGFyYW0gY2QgdGhlIGNsYXNzRG9jIHRoYXQgd2Ugc2hvdWxkIGxpbmsgdG8KICAgICAgKiBAcGFyYW0gbWVtYmVyIHRoZSBtZW1iZXIgYmVpbmcgbGlua2VkIHRvCiAgICAgICogQHBhcmFtIGxpbmtzVHJlZSB0aGUgY29udGVudCB0cmVlIHRvIHdoaWNoIHRoZSBsaW5rIHdpbGwgYmUgYWRkZWQKICAgICAgKi8KQEAgLTEzOCw3ICsxNDMsNyBAQAogICAgICAqIEFkZCBhbGwgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBleGVjdXRhYmxlIG1lbWJlci4KICAgICAgKgogICAgICAqIEBwYXJhbSBtZW1iZXIgdGhlIG1lbWJlciB0byB3cml0ZSBwYXJhbWV0ZXJzIGZvci4KLSAgICAgKiBAcGFyYW0gdHJlZSB0aGUgY29udGVudCB0cmVlIHRvIHdoaWNoIHRoZSBwYXJhbWV0ZXJzIGluZm9ybWF0aW9uIHdpbGwgYmUgYWRkZWQuCisgICAgICogQHBhcmFtIGh0bWx0cmVlIHRoZSBjb250ZW50IHRyZWUgdG8gd2hpY2ggdGhlIHBhcmFtZXRlcnMgaW5mb3JtYXRpb24gd2lsbCBiZSBhZGRlZC4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBhZGRQYXJhbWV0ZXJzKEV4ZWN1dGFibGVNZW1iZXJEb2MgbWVtYmVyLCBDb250ZW50IGh0bWx0cmVlKSB7CiAgICAgICAgIGFkZFBhcmFtZXRlcnMobWVtYmVyLCB0cnVlLCBodG1sdHJlZSk7CkBAIC0xNDksNyArMTU0LDcgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSBtZW1iZXIgdGhlIG1lbWJlciB0byB3cml0ZSBwYXJhbWV0ZXJzIGZvci4KICAgICAgKiBAcGFyYW0gaW5jbHVkZUFubm90YXRpb25zIHRydWUgaWYgYW5ub3RhdGlvbiBpbmZvcm1hdGlvbiBuZWVkcyB0byBiZSBhZGRlZC4KLSAgICAgKiBAcGFyYW0gdHJlZSB0aGUgY29udGVudCB0cmVlIHRvIHdoaWNoIHRoZSBwYXJhbWV0ZXJzIGluZm9ybWF0aW9uIHdpbGwgYmUgYWRkZWQuCisgICAgICogQHBhcmFtIGh0bWx0cmVlIHRoZSBjb250ZW50IHRyZWUgdG8gd2hpY2ggdGhlIHBhcmFtZXRlcnMgaW5mb3JtYXRpb24gd2lsbCBiZSBhZGRlZC4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBhZGRQYXJhbWV0ZXJzKEV4ZWN1dGFibGVNZW1iZXJEb2MgbWVtYmVyLAogICAgICAgICAgICAgYm9vbGVhbiBpbmNsdWRlQW5ub3RhdGlvbnMsIENvbnRlbnQgaHRtbHRyZWUpIHsKQEAgLTI3Niw3ICsyODEsNyBAQAogICAgICAqIEByZXR1cm4gdGhlIDEuNC54IHN0eWxlIGFuY2hvciBmb3IgdGhlIEV4ZWN1dGFibGVNZW1iZXJEb2MuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFcmFzdXJlQW5jaG9yKEV4ZWN1dGFibGVNZW1iZXJEb2MgZW1kKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKGVtZC5uYW1lKCkgKyAiKCIpOworICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKGVtZC5uYW1lKCkgKyAiKCIpOwogICAgICAgICBQYXJhbWV0ZXJbXSBwYXJhbXMgPSBlbWQucGFyYW1ldGVycygpOwogICAgICAgICBib29sZWFuIGZvdW5kVHlwZVZhcmlhYmxlID0gZmFsc2U7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1zLmxlbmd0aDsgaSsrKSB7CmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9BYnN0cmFjdEluZGV4V3JpdGVyLmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9BYnN0cmFjdEluZGV4V3JpdGVyLmphdmEKaW5kZXggMDI4NGY4YS4uMmU5MDJiMyAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9mb3JtYXRzL2h0bWwvQWJzdHJhY3RJbmRleFdyaXRlci5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL0Fic3RyYWN0SW5kZXhXcml0ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMTAsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI5LDkgKzI5LDkgQEAKIGltcG9ydCBqYXZhLnV0aWwuKjsKIAogaW1wb3J0IGNvbS5zdW4uamF2YWRvYy4qOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0LnV0aWwuKjsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmRvY2xldHMuZm9ybWF0cy5odG1sLm1hcmt1cC4qOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0Lio7CitpbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQudXRpbC4qOwogCiAvKioKICAqIEdlbmVyYXRlIEluZGV4IGZvciBhbGwgdGhlIE1lbWJlciBOYW1lcyB3aXRoIEluZGV4aW5nIGluCkBAIC0zOSw2ICszOSwxMSBAQAogICoge0BsaW5rIFNwbGl0SW5kZXhXcml0ZXJ9LiBJdCB1c2VzIHRoZSBmdW5jdGlvbmFsaXR5IGZyb20KICAqIHtAbGluayBIdG1sRG9jbGV0V3JpdGVyfSB0byBnZW5lcmF0ZSB0aGUgSW5kZXggQ29udGVudHMuCiAgKgorICogIDxwPjxiPlRoaXMgaXMgTk9UIHBhcnQgb2YgYW55IHN1cHBvcnRlZCBBUEkuCisgKiAgSWYgeW91IHdyaXRlIGNvZGUgdGhhdCBkZXBlbmRzIG9uIHRoaXMsIHlvdSBkbyBzbyBhdCB5b3VyIG93biByaXNrLgorICogIFRoaXMgY29kZSBhbmQgaXRzIGludGVybmFsIGludGVyZmFjZXMgYXJlIHN1YmplY3QgdG8gY2hhbmdlIG9yCisgKiAgZGVsZXRpb24gd2l0aG91dCBub3RpY2UuPC9iPgorICoKICAqIEBzZWUgICAgSW5kZXhCdWlsZGVyCiAgKiBAYXV0aG9yIEF0dWwgTSBEYW1iYWxrYXIKICAqIEBhdXRob3IgQmhhdmVzaCBQYXRlbCAoTW9kaWZpZWQpCmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9BYnN0cmFjdE1lbWJlcldyaXRlci5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9mb3JtYXRzL2h0bWwvQWJzdHJhY3RNZW1iZXJXcml0ZXIuamF2YQppbmRleCAyN2NhMTRmLi5kZjJlOGFmIDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9BYnN0cmFjdE1lbWJlcldyaXRlci5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL0Fic3RyYWN0TWVtYmVyV3JpdGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAxOTk3LCAyMDEwLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwxNyArMjUsMjMgQEAKIAogcGFja2FnZSBjb20uc3VuLnRvb2xzLmRvY2xldHMuZm9ybWF0cy5odG1sOwogCi1pbXBvcnQgamF2YS51dGlsLio7CiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7CitpbXBvcnQgamF2YS51dGlsLio7CisKIGltcG9ydCBjb20uc3VuLmphdmFkb2MuKjsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmRvY2xldHMuZm9ybWF0cy5odG1sLm1hcmt1cC4qOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0Lio7Ci1pbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQudXRpbC4qOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0LnRhZ2xldHMuKjsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC51dGlsLio7CiAKIC8qKgogICogVGhlIGJhc2UgY2xhc3MgZm9yIG1lbWJlciB3cml0ZXJzLgogICoKKyAqICA8cD48Yj5UaGlzIGlzIE5PVCBwYXJ0IG9mIGFueSBzdXBwb3J0ZWQgQVBJLgorICogIElmIHlvdSB3cml0ZSBjb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGlzLCB5b3UgZG8gc28gYXQgeW91ciBvd24gcmlzay4KKyAqICBUaGlzIGNvZGUgYW5kIGl0cyBpbnRlcm5hbCBpbnRlcmZhY2VzIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSBvcgorICogIGRlbGV0aW9uIHdpdGhvdXQgbm90aWNlLjwvYj4KKyAqCiAgKiBAYXV0aG9yIFJvYmVydCBGaWVsZAogICogQGF1dGhvciBBdHVsIE0gRGFtYmFsa2FyCiAgKiBAYXV0aG9yIEphbWllIEhvIChSZS13cml0ZSkKQEAgLTE4MSwyMyArMTg3LDYgQEAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBhZGROYXZEZXRhaWxMaW5rKGJvb2xlYW4gbGluaywgQ29udGVudCBsaU5hdik7CiAKLSAgICAvKioqICAqKiovCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcmludChTdHJpbmcgc3RyKSB7Ci0gICAgICAgIHdyaXRlci5wcmludChzdHIpOwotICAgICAgICB3cml0ZXIuZGlzcGxheUxlbmd0aCArPSBzdHIubGVuZ3RoKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJpbnQoY2hhciBjaCkgewotICAgICAgICB3cml0ZXIucHJpbnQoY2gpOwotICAgICAgICB3cml0ZXIuZGlzcGxheUxlbmd0aCsrOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHN0cm9uZyhTdHJpbmcgc3RyKSB7Ci0gICAgICAgIHdyaXRlci5zdHJvbmcoc3RyKTsKLSAgICAgICAgd3JpdGVyLmRpc3BsYXlMZW5ndGggKz0gc3RyLmxlbmd0aCgpOwotICAgIH0KLQogICAgIC8qKgogICAgICAqIEFkZCB0aGUgbWVtYmVyIG5hbWUgdG8gdGhlIGNvbnRlbnQgdHJlZSBhbmQgbW9kaWZpZXMgdGhlIGRpc3BsYXkgbGVuZ3RoLgogICAgICAqCkBAIC0yNTcsNyArMjQ2LDcgQEAKICAgICAgICAgaWYgKGxlbiA8PSAwKSB7CiAgICAgICAgICAgICByZXR1cm4gIiI7CiAgICAgICAgIH0KLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihsZW4pOworICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIobGVuKTsKICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgICBzYi5hcHBlbmQoJyAnKTsKICAgICB9CkBAIC0zMDQsMjMgKzI5Myw2IEBACiAgICAgICAgIHRkU3VtbWFyeVR5cGUuYWRkQ29udGVudChjb2RlKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgcHJpbnRNb2RpZmllcihQcm9ncmFtRWxlbWVudERvYyBtZW1iZXIpIHsKLSAgICAgICAgaWYgKG1lbWJlci5pc1Byb3RlY3RlZCgpKSB7Ci0gICAgICAgICAgICBwcmludCgicHJvdGVjdGVkICIpOwotICAgICAgICB9IGVsc2UgaWYgKG1lbWJlci5pc1ByaXZhdGUoKSkgewotICAgICAgICAgICAgcHJpbnQoInByaXZhdGUgIik7Ci0gICAgICAgIH0gZWxzZSBpZiAoIW1lbWJlci5pc1B1YmxpYygpKSB7IC8vIFBhY2thZ2UgcHJpdmF0ZQotICAgICAgICAgICAgd3JpdGVyLnByaW50VGV4dCgiZG9jbGV0LlBhY2thZ2VfcHJpdmF0ZSIpOwotICAgICAgICAgICAgcHJpbnQoIiAiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobWVtYmVyLmlzTWV0aG9kKCkgJiYgKChNZXRob2REb2MpbWVtYmVyKS5pc0Fic3RyYWN0KCkpIHsKLSAgICAgICAgICAgIHByaW50KCJhYnN0cmFjdCAiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobWVtYmVyLmlzU3RhdGljKCkpIHsKLSAgICAgICAgICAgIHByaW50KCJzdGF0aWMiKTsKLSAgICAgICAgfQotICAgIH0KLQogICAgIC8qKgogICAgICAqIEFkZCB0aGUgbW9kaWZpZXIgZm9yIHRoZSBtZW1iZXIuCiAgICAgICoKQEAgLTM2NCw3ICszMzYsNyBAQAogICAgICAqIEFkZCB0aGUgY29tbWVudCBmb3IgdGhlIGdpdmVuIG1lbWJlci4KICAgICAgKgogICAgICAqIEBwYXJhbSBtZW1iZXIgdGhlIG1lbWJlciBiZWluZyBkb2N1bWVudGVkLgotICAgICAqIEBwYXJhbSBjb250ZW50VHJlZSB0aGUgY29udGVudCB0cmVlIHRvIHdoaWNoIHRoZSBjb21tZW50IHdpbGwgYmUgYWRkZWQuCisgICAgICogQHBhcmFtIGh0bWx0cmVlIHRoZSBjb250ZW50IHRyZWUgdG8gd2hpY2ggdGhlIGNvbW1lbnQgd2lsbCBiZSBhZGRlZC4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBhZGRDb21tZW50KFByb2dyYW1FbGVtZW50RG9jIG1lbWJlciwgQ29udGVudCBodG1sdHJlZSkgewogICAgICAgICBpZiAobWVtYmVyLmlubGluZVRhZ3MoKS5sZW5ndGggPiAwKSB7CmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9BYnN0cmFjdFBhY2thZ2VJbmRleFdyaXRlci5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9mb3JtYXRzL2h0bWwvQWJzdHJhY3RQYWNrYWdlSW5kZXhXcml0ZXIuamF2YQppbmRleCBlZjQwN2RmLi45NjY3YjBmIDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9BYnN0cmFjdFBhY2thZ2VJbmRleFdyaXRlci5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL0Fic3RyYWN0UGFja2FnZUluZGV4V3JpdGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDEwLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0zNiw2ICszNiwxMSBAQAogICogRnJhbWUgYW5kIE5vbi1GcmFtZSBmb3JtYXQuIFRoaXMgd2lsbCBiZSBzdWItY2xhc3NlZCBieSB0bwogICogZ2VuZXJhdGUgb3ZlcnZpZXctZnJhbWUuaHRtbCBhcyB3ZWxsIGFzIG92ZXJ2aWV3LXN1bW1hcnkuaHRtbC4KICAqCisgKiAgPHA+PGI+VGhpcyBpcyBOT1QgcGFydCBvZiBhbnkgc3VwcG9ydGVkIEFQSS4KKyAqICBJZiB5b3Ugd3JpdGUgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhpcywgeW91IGRvIHNvIGF0IHlvdXIgb3duIHJpc2suCisgKiAgVGhpcyBjb2RlIGFuZCBpdHMgaW50ZXJuYWwgaW50ZXJmYWNlcyBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugb3IKKyAqICBkZWxldGlvbiB3aXRob3V0IG5vdGljZS48L2I+CisgKgogICogQGF1dGhvciBBdHVsIE0gRGFtYmFsa2FyCiAgKiBAYXV0aG9yIEJoYXZlc2ggUGF0ZWwgKE1vZGlmaWVkKQogICovCmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9BYnN0cmFjdFRyZWVXcml0ZXIuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL0Fic3RyYWN0VHJlZVdyaXRlci5qYXZhCmluZGV4IDJiMWIzNTIuLmNjZjgyY2YgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL0Fic3RyYWN0VHJlZVdyaXRlci5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL0Fic3RyYWN0VHJlZVdyaXRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAxMCwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjcsMTAgKzI3LDExIEBACiAKIGltcG9ydCBqYXZhLmlvLio7CiBpbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQudXRpbC4qOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0Lio7Ci1pbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmZvcm1hdHMuaHRtbC5tYXJrdXAuKjsKKwogaW1wb3J0IGNvbS5zdW4uamF2YWRvYy4qOworaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5mb3JtYXRzLmh0bWwubWFya3VwLio7CitpbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQuKjsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC51dGlsLio7CiAKIC8qKgogICogQWJzdHJhY3QgY2xhc3MgdG8gcHJpbnQgdGhlIGNsYXNzIGhpZXJhcmNoeSBwYWdlIGZvciBhbGwgdGhlIENsYXNzZXMuIFRoaXMKQEAgLTM4LDYgKzM5LDExIEBACiAgKiBnZW5lcmF0ZSB0aGUgUGFja2FnZSBUcmVlIGFuZCBnbG9iYWwgVHJlZShmb3IgYWxsIHRoZSBjbGFzc2VzIGFuZCBwYWNrYWdlcykKICAqIHBhZ2VzLgogICoKKyAqICA8cD48Yj5UaGlzIGlzIE5PVCBwYXJ0IG9mIGFueSBzdXBwb3J0ZWQgQVBJLgorICogIElmIHlvdSB3cml0ZSBjb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGlzLCB5b3UgZG8gc28gYXQgeW91ciBvd24gcmlzay4KKyAqICBUaGlzIGNvZGUgYW5kIGl0cyBpbnRlcm5hbCBpbnRlcmZhY2VzIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSBvcgorICogIGRlbGV0aW9uIHdpdGhvdXQgbm90aWNlLjwvYj4KKyAqCiAgKiBAYXV0aG9yIEF0dWwgTSBEYW1iYWxrYXIKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VHJlZVdyaXRlciBleHRlbmRzIEh0bWxEb2NsZXRXcml0ZXIgewpkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9mb3JtYXRzL2h0bWwvQWxsQ2xhc3Nlc0ZyYW1lV3JpdGVyLmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9BbGxDbGFzc2VzRnJhbWVXcml0ZXIuamF2YQppbmRleCBiNjhhZjA0Li5hZGVmMzllIDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9BbGxDbGFzc2VzRnJhbWVXcml0ZXIuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9BbGxDbGFzc2VzRnJhbWVXcml0ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMTAsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI5LDkgKzI5LDkgQEAKIGltcG9ydCBqYXZhLnV0aWwuKjsKIAogaW1wb3J0IGNvbS5zdW4uamF2YWRvYy4qOworaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5mb3JtYXRzLmh0bWwubWFya3VwLio7CiBpbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQuKjsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC51dGlsLio7Ci1pbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmZvcm1hdHMuaHRtbC5tYXJrdXAuKjsKIAogLyoqCiAgKiBHZW5lcmF0ZSB0aGUgZmlsZSB3aXRoIGxpc3Qgb2YgYWxsIHRoZSBjbGFzc2VzIGluIHRoaXMgcnVuLiBUaGlzIHBhZ2Ugd2lsbCBiZQpAQCAtMzksNiArMzksMTEgQEAKICAqIHRoZSBsZWZ0LWhhbmQgdG9wIGZyYW1lLiBUaGUgbmFtZSBvZiB0aGUgZ2VuZXJhdGVkIGZpbGUgaXMKICAqICJhbGxjbGFzc2VzLWZyYW1lLmh0bWwiLgogICoKKyAqICA8cD48Yj5UaGlzIGlzIE5PVCBwYXJ0IG9mIGFueSBzdXBwb3J0ZWQgQVBJLgorICogIElmIHlvdSB3cml0ZSBjb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGlzLCB5b3UgZG8gc28gYXQgeW91ciBvd24gcmlzay4KKyAqICBUaGlzIGNvZGUgYW5kIGl0cyBpbnRlcm5hbCBpbnRlcmZhY2VzIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSBvcgorICogIGRlbGV0aW9uIHdpdGhvdXQgbm90aWNlLjwvYj4KKyAqCiAgKiBAYXV0aG9yIEF0dWwgTSBEYW1iYWxrYXIKICAqIEBhdXRob3IgRG91ZyBLcmFtZXIKICAqIEBhdXRob3IgQmhhdmVzaCBQYXRlbCAoTW9kaWZpZWQpCmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9Bbm5vdGF0aW9uVHlwZU9wdGlvbmFsTWVtYmVyV3JpdGVySW1wbC5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9mb3JtYXRzL2h0bWwvQW5ub3RhdGlvblR5cGVPcHRpb25hbE1lbWJlcldyaXRlckltcGwuamF2YQppbmRleCA3N2YyMzI3Li42NmM1MWFhIDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9Bbm5vdGF0aW9uVHlwZU9wdGlvbmFsTWVtYmVyV3JpdGVySW1wbC5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL0Fubm90YXRpb25UeXBlT3B0aW9uYWxNZW1iZXJXcml0ZXJJbXBsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDEwLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0zNCw2ICszNCwxMSBAQAogLyoqCiAgKiBXcml0ZXMgYW5ub3RhdGlvbiB0eXBlIG9wdGlvbmFsIG1lbWJlciBkb2N1bWVudGF0aW9uIGluIEhUTUwgZm9ybWF0LgogICoKKyAqICA8cD48Yj5UaGlzIGlzIE5PVCBwYXJ0IG9mIGFueSBzdXBwb3J0ZWQgQVBJLgorICogIElmIHlvdSB3cml0ZSBjb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGlzLCB5b3UgZG8gc28gYXQgeW91ciBvd24gcmlzay4KKyAqICBUaGlzIGNvZGUgYW5kIGl0cyBpbnRlcm5hbCBpbnRlcmZhY2VzIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSBvcgorICogIGRlbGV0aW9uIHdpdGhvdXQgbm90aWNlLjwvYj4KKyAqCiAgKiBAYXV0aG9yIEphbWllIEhvCiAgKiBAYXV0aG9yIEJoYXZlc2ggUGF0ZWwgKE1vZGlmaWVkKQogICovCmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9Bbm5vdGF0aW9uVHlwZVJlcXVpcmVkTWVtYmVyV3JpdGVySW1wbC5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9mb3JtYXRzL2h0bWwvQW5ub3RhdGlvblR5cGVSZXF1aXJlZE1lbWJlcldyaXRlckltcGwuamF2YQppbmRleCBmMjQxOGU1Li5iYWE3MjVkIDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9Bbm5vdGF0aW9uVHlwZVJlcXVpcmVkTWVtYmVyV3JpdGVySW1wbC5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL0Fubm90YXRpb25UeXBlUmVxdWlyZWRNZW1iZXJXcml0ZXJJbXBsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDEwLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0zNCw2ICszNCwxMSBAQAogLyoqCiAgKiBXcml0ZXMgYW5ub3RhdGlvbiB0eXBlIHJlcXVpcmVkIG1lbWJlciBkb2N1bWVudGF0aW9uIGluIEhUTUwgZm9ybWF0LgogICoKKyAqICA8cD48Yj5UaGlzIGlzIE5PVCBwYXJ0IG9mIGFueSBzdXBwb3J0ZWQgQVBJLgorICogIElmIHlvdSB3cml0ZSBjb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGlzLCB5b3UgZG8gc28gYXQgeW91ciBvd24gcmlzay4KKyAqICBUaGlzIGNvZGUgYW5kIGl0cyBpbnRlcm5hbCBpbnRlcmZhY2VzIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSBvcgorICogIGRlbGV0aW9uIHdpdGhvdXQgbm90aWNlLjwvYj4KKyAqCiAgKiBAYXV0aG9yIEphbWllIEhvCiAgKiBAYXV0aG9yIEJoYXZlc2ggUGF0ZWwgKE1vZGlmaWVkKQogICovCmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9Bbm5vdGF0aW9uVHlwZVdyaXRlckltcGwuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL0Fubm90YXRpb25UeXBlV3JpdGVySW1wbC5qYXZhCmluZGV4IDgzODg2ZGUuLmJiMjI4ZDIgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL0Fubm90YXRpb25UeXBlV3JpdGVySW1wbC5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL0Fubm90YXRpb25UeXBlV3JpdGVySW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMTQgKzI1LDIyIEBACiAKIHBhY2thZ2UgY29tLnN1bi50b29scy5kb2NsZXRzLmZvcm1hdHMuaHRtbDsKIAoraW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKIGltcG9ydCBjb20uc3VuLmphdmFkb2MuKjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC4qOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0LnV0aWwuKjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC5idWlsZGVycy4qOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5mb3JtYXRzLmh0bWwubWFya3VwLio7CitpbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQuKjsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC5idWlsZGVycy4qOworaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0LnV0aWwuKjsKIAogLyoqCiAgKiBHZW5lcmF0ZSB0aGUgQ2xhc3MgSW5mb3JtYXRpb24gUGFnZS4KKyAqCisgKiAgPHA+PGI+VGhpcyBpcyBOT1QgcGFydCBvZiBhbnkgc3VwcG9ydGVkIEFQSS4KKyAqICBJZiB5b3Ugd3JpdGUgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhpcywgeW91IGRvIHNvIGF0IHlvdXIgb3duIHJpc2suCisgKiAgVGhpcyBjb2RlIGFuZCBpdHMgaW50ZXJuYWwgaW50ZXJmYWNlcyBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugb3IKKyAqICBkZWxldGlvbiB3aXRob3V0IG5vdGljZS48L2I+CisgKgogICogQHNlZSBjb20uc3VuLmphdmFkb2MuQ2xhc3NEb2MKICAqIEBzZWUgamF2YS51dGlsLkNvbGxlY3Rpb25zCiAgKiBAc2VlIGphdmEudXRpbC5MaXN0CkBAIC0xODcsNyArMTk1LDcgQEAKICAgICAvKioKICAgICAgKiB7QGluaGVyaXREb2N9CiAgICAgICovCi0gICAgcHVibGljIHZvaWQgcHJpbnREb2N1bWVudChDb250ZW50IGNvbnRlbnRUcmVlKSB7CisgICAgcHVibGljIHZvaWQgcHJpbnREb2N1bWVudChDb250ZW50IGNvbnRlbnRUcmVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBwcmludEh0bWxEb2N1bWVudChjb25maWd1cmF0aW9uLm1ldGFrZXl3b3Jkcy5nZXRNZXRhS2V5d29yZHMoYW5ub3RhdGlvblR5cGUpLAogICAgICAgICAgICAgICAgIHRydWUsIGNvbnRlbnRUcmVlKTsKICAgICB9CmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9DbGFzc1VzZVdyaXRlci5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9mb3JtYXRzL2h0bWwvQ2xhc3NVc2VXcml0ZXIuamF2YQppbmRleCBkMGNlYTk0Li42OWVkY2RlIDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9DbGFzc1VzZVdyaXRlci5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL0NsYXNzVXNlV3JpdGVyLmphdmEKQEAgLTI3LDE0ICsyNywyMCBAQAogCiBpbXBvcnQgamF2YS5pby4qOwogaW1wb3J0IGphdmEudXRpbC4qOworCiBpbXBvcnQgY29tLnN1bi5qYXZhZG9jLio7Ci1pbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQudXRpbC4qOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5mb3JtYXRzLmh0bWwubWFya3VwLio7CiBpbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQuKjsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC51dGlsLio7CiAKIC8qKgogICogR2VuZXJhdGUgY2xhc3MgdXNhZ2UgaW5mb3JtYXRpb24uCiAgKgorICogIDxwPjxiPlRoaXMgaXMgTk9UIHBhcnQgb2YgYW55IHN1cHBvcnRlZCBBUEkuCisgKiAgSWYgeW91IHdyaXRlIGNvZGUgdGhhdCBkZXBlbmRzIG9uIHRoaXMsIHlvdSBkbyBzbyBhdCB5b3VyIG93biByaXNrLgorICogIFRoaXMgY29kZSBhbmQgaXRzIGludGVybmFsIGludGVyZmFjZXMgYXJlIHN1YmplY3QgdG8gY2hhbmdlIG9yCisgKiAgZGVsZXRpb24gd2l0aG91dCBub3RpY2UuPC9iPgorICoKICAqIEBhdXRob3IgUm9iZXJ0IEcuIEZpZWxkCiAgKiBAYXV0aG9yIEJoYXZlc2ggUGF0ZWwgKE1vZGlmaWVkKQogICovCmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9DbGFzc1dyaXRlckltcGwuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL0NsYXNzV3JpdGVySW1wbC5qYXZhCmluZGV4IGNjODQxMWUuLjVkYjllNjUgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL0NsYXNzV3JpdGVySW1wbC5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL0NsYXNzV3JpdGVySW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMTk5NywgMjAxMSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5NywgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMTcgKzI1LDI0IEBACiAKIHBhY2thZ2UgY29tLnN1bi50b29scy5kb2NsZXRzLmZvcm1hdHMuaHRtbDsKIAoraW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLio7CiAKIGltcG9ydCBjb20uc3VuLmphdmFkb2MuKjsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmRvY2xldHMuZm9ybWF0cy5odG1sLm1hcmt1cC4qOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0Lio7Ci1pbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQudXRpbC4qOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0LmJ1aWxkZXJzLio7CiBpbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQudGFnbGV0cy4qOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5mb3JtYXRzLmh0bWwubWFya3VwLio7CitpbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQudXRpbC4qOwogCiAvKioKICAqIEdlbmVyYXRlIHRoZSBDbGFzcyBJbmZvcm1hdGlvbiBQYWdlLgorICoKKyAqICA8cD48Yj5UaGlzIGlzIE5PVCBwYXJ0IG9mIGFueSBzdXBwb3J0ZWQgQVBJLgorICogIElmIHlvdSB3cml0ZSBjb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGlzLCB5b3UgZG8gc28gYXQgeW91ciBvd24gcmlzay4KKyAqICBUaGlzIGNvZGUgYW5kIGl0cyBpbnRlcm5hbCBpbnRlcmZhY2VzIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSBvcgorICogIGRlbGV0aW9uIHdpdGhvdXQgbm90aWNlLjwvYj4KKyAqCiAgKiBAc2VlIGNvbS5zdW4uamF2YWRvYy5DbGFzc0RvYwogICogQHNlZSBqYXZhLnV0aWwuQ29sbGVjdGlvbnMKICAqIEBzZWUgamF2YS51dGlsLkxpc3QKQEAgLTE5Niw3ICsyMDMsNyBAQAogICAgIC8qKgogICAgICAqIHtAaW5oZXJpdERvY30KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwcmludERvY3VtZW50KENvbnRlbnQgY29udGVudFRyZWUpIHsKKyAgICBwdWJsaWMgdm9pZCBwcmludERvY3VtZW50KENvbnRlbnQgY29udGVudFRyZWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHByaW50SHRtbERvY3VtZW50KGNvbmZpZ3VyYXRpb24ubWV0YWtleXdvcmRzLmdldE1ldGFLZXl3b3JkcyhjbGFzc0RvYyksCiAgICAgICAgICAgICAgICAgdHJ1ZSwgY29udGVudFRyZWUpOwogICAgIH0KZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL0NvbmZpZ3VyYXRpb25JbXBsLmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9Db25maWd1cmF0aW9uSW1wbC5qYXZhCmluZGV4IDc5ODVkOTMuLjdjMjE0NDIgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL0NvbmZpZ3VyYXRpb25JbXBsLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9mb3JtYXRzL2h0bWwvQ29uZmlndXJhdGlvbkltcGwuamF2YQpAQCAtMjUsMTMgKzI1LDEzIEBACiAKIHBhY2thZ2UgY29tLnN1bi50b29scy5kb2NsZXRzLmZvcm1hdHMuaHRtbDsKIAotaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0Lio7Ci1pbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQudXRpbC4qOwotCi1pbXBvcnQgY29tLnN1bi5qYXZhZG9jLio7Ci1pbXBvcnQgamF2YS51dGlsLio7CiBpbXBvcnQgamF2YS5pby4qOwogaW1wb3J0IGphdmEubmV0Lio7CitpbXBvcnQgamF2YS51dGlsLio7CisKK2ltcG9ydCBjb20uc3VuLmphdmFkb2MuKjsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC4qOworaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0LnV0aWwuKjsKIAogLyoqCiAgKiBDb25maWd1cmUgdGhlIG91dHB1dCBiYXNlZCBvbiB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbnMuCkBAIC0xODgsOCArMTg4LDggQEAKICAgICAvLyBDbGFzc1dyaXRlci4KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLiBJbml0aWFsaXNlcyByZXNvdXJjZSBmb3IgdGhlCi0gICAgICoge0BsaW5rIGNvbS5zdW4udG9vbHMuZG9jbGV0cy5NZXNzYWdlUmV0cmlldmVyfS4KKyAgICAgKiBDb25zdHJ1Y3Rvci4gSW5pdGlhbGl6ZXMgcmVzb3VyY2UgZm9yIHRoZQorICAgICAqIHtAbGluayBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC51dGlsLk1lc3NhZ2VSZXRyaWV2ZXIgTWVzc2FnZVJldHJpZXZlcn0uCiAgICAgICovCiAgICAgcHJpdmF0ZSBDb25maWd1cmF0aW9uSW1wbCgpIHsKICAgICAgICAgc3RhbmRhcmRtZXNzYWdlID0gbmV3IE1lc3NhZ2VSZXRyaWV2ZXIodGhpcywKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL0NvbnN0YW50c1N1bW1hcnlXcml0ZXJJbXBsLmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9Db25zdGFudHNTdW1tYXJ5V3JpdGVySW1wbC5qYXZhCmluZGV4IDRkMzhhZDkuLmQ2OTAyNjEgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL0NvbnN0YW50c1N1bW1hcnlXcml0ZXJJbXBsLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9mb3JtYXRzL2h0bWwvQ29uc3RhbnRzU3VtbWFyeVdyaXRlckltcGwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTAsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI3LDE0ICsyNywyMCBAQAogCiBpbXBvcnQgamF2YS5pby4qOwogaW1wb3J0IGphdmEudXRpbC4qOworCiBpbXBvcnQgY29tLnN1bi5qYXZhZG9jLio7CitpbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmZvcm1hdHMuaHRtbC5tYXJrdXAuKjsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC4qOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0LnV0aWwuKjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmRvY2xldHMuZm9ybWF0cy5odG1sLm1hcmt1cC4qOwogCiAvKioKICAqIFdyaXRlIHRoZSBDb25zdGFudHMgU3VtbWFyeSBQYWdlIGluIEhUTUwgZm9ybWF0LgogICoKKyAqICA8cD48Yj5UaGlzIGlzIE5PVCBwYXJ0IG9mIGFueSBzdXBwb3J0ZWQgQVBJLgorICogIElmIHlvdSB3cml0ZSBjb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGlzLCB5b3UgZG8gc28gYXQgeW91ciBvd24gcmlzay4KKyAqICBUaGlzIGNvZGUgYW5kIGl0cyBpbnRlcm5hbCBpbnRlcmZhY2VzIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSBvcgorICogIGRlbGV0aW9uIHdpdGhvdXQgbm90aWNlLjwvYj4KKyAqCiAgKiBAYXV0aG9yIEphbWllIEhvCiAgKiBAYXV0aG9yIEJoYXZlc2ggUGF0ZWwgKE1vZGlmaWVkKQogICogQHNpbmNlIDEuNApAQCAtMjk3LDcgKzMwMyw3IEBACiAgICAgLyoqCiAgICAgICoge0Bpbmhlcml0RG9jfQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHByaW50RG9jdW1lbnQoQ29udGVudCBjb250ZW50VHJlZSkgeworICAgIHB1YmxpYyB2b2lkIHByaW50RG9jdW1lbnQoQ29udGVudCBjb250ZW50VHJlZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgcHJpbnRIdG1sRG9jdW1lbnQobnVsbCwgdHJ1ZSwgY29udGVudFRyZWUpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL0NvbnN0cnVjdG9yV3JpdGVySW1wbC5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9mb3JtYXRzL2h0bWwvQ29uc3RydWN0b3JXcml0ZXJJbXBsLmphdmEKaW5kZXggNmRiMmIwZC4uMjJhNTJhNCAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9mb3JtYXRzL2h0bWwvQ29uc3RydWN0b3JXcml0ZXJJbXBsLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9mb3JtYXRzL2h0bWwvQ29uc3RydWN0b3JXcml0ZXJJbXBsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAxOTk3LCAyMDEwLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0zNiw2ICszNiwxMSBAQAogLyoqCiAgKiBXcml0ZXMgY29uc3RydWN0b3IgZG9jdW1lbnRhdGlvbi4KICAqCisgKiAgPHA+PGI+VGhpcyBpcyBOT1QgcGFydCBvZiBhbnkgc3VwcG9ydGVkIEFQSS4KKyAqICBJZiB5b3Ugd3JpdGUgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhpcywgeW91IGRvIHNvIGF0IHlvdXIgb3duIHJpc2suCisgKiAgVGhpcyBjb2RlIGFuZCBpdHMgaW50ZXJuYWwgaW50ZXJmYWNlcyBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugb3IKKyAqICBkZWxldGlvbiB3aXRob3V0IG5vdGljZS48L2I+CisgKgogICogQGF1dGhvciBSb2JlcnQgRmllbGQKICAqIEBhdXRob3IgQXR1bCBNIERhbWJhbGthcgogICogQGF1dGhvciBCaGF2ZXNoIFBhdGVsIChNb2RpZmllZCkKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL0RlcHJlY2F0ZWRMaXN0V3JpdGVyLmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9EZXByZWNhdGVkTGlzdFdyaXRlci5qYXZhCmluZGV4IGVkOTgwNWIuLjVkODUyMTcgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL0RlcHJlY2F0ZWRMaXN0V3JpdGVyLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9mb3JtYXRzL2h0bWwvRGVwcmVjYXRlZExpc3RXcml0ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTcsIDIwMTEsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI2LDE1ICsyNiwyMCBAQAogcGFja2FnZSBjb20uc3VuLnRvb2xzLmRvY2xldHMuZm9ybWF0cy5odG1sOwogCiBpbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0Lio7Ci1pbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQudXRpbC5EZXByZWNhdGVkQVBJTGlzdEJ1aWxkZXI7Ci1pbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQudXRpbC4qOworCiBpbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmZvcm1hdHMuaHRtbC5tYXJrdXAuKjsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC4qOworaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0LnV0aWwuKjsKIAogLyoqCiAgKiBHZW5lcmF0ZSBGaWxlIHRvIGxpc3QgYWxsIHRoZSBkZXByZWNhdGVkIGNsYXNzZXMgYW5kIGNsYXNzIG1lbWJlcnMgd2l0aCB0aGUKICAqIGFwcHJvcHJpYXRlIGxpbmtzLgogICoKKyAqICA8cD48Yj5UaGlzIGlzIE5PVCBwYXJ0IG9mIGFueSBzdXBwb3J0ZWQgQVBJLgorICogIElmIHlvdSB3cml0ZSBjb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGlzLCB5b3UgZG8gc28gYXQgeW91ciBvd24gcmlzay4KKyAqICBUaGlzIGNvZGUgYW5kIGl0cyBpbnRlcm5hbCBpbnRlcmZhY2VzIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSBvcgorICogIGRlbGV0aW9uIHdpdGhvdXQgbm90aWNlLjwvYj4KKyAqCiAgKiBAc2VlIGphdmEudXRpbC5MaXN0CiAgKiBAYXV0aG9yIEF0dWwgTSBEYW1iYWxrYXIKICAqIEBhdXRob3IgQmhhdmVzaCBQYXRlbCAoTW9kaWZpZWQpCkBAIC0yMDgsNyArMjEzLDcgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSBidWlsZGVyIHRoZSBkZXByZWNhdGVkIGxpc3QgYnVpbGRlcgogICAgICAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIG9mIGxpc3QgYmVpbmcgZG9jdW1lbnRlZAotICAgICAqIEBwYXJhbSBjb250ZW50VHJlZSB0aGUgY29udGVudCB0cmVlIHRvIHdoaWNoIHRoZSBhbmNob3Igd2lsbCBiZSBhZGRlZAorICAgICAqIEBwYXJhbSBodG1sVHJlZSB0aGUgY29udGVudCB0cmVlIHRvIHdoaWNoIHRoZSBhbmNob3Igd2lsbCBiZSBhZGRlZAogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCBhZGRBbmNob3IoRGVwcmVjYXRlZEFQSUxpc3RCdWlsZGVyIGJ1aWxkZXIsIGludCB0eXBlLCBDb250ZW50IGh0bWxUcmVlKSB7CiAgICAgICAgIGlmIChidWlsZGVyLmhhc0RvY3VtZW50YXRpb24odHlwZSkpIHsKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL0VudW1Db25zdGFudFdyaXRlckltcGwuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL0VudW1Db25zdGFudFdyaXRlckltcGwuamF2YQppbmRleCBmNTY3YWFlLi43ZTFhOTc3IDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9FbnVtQ29uc3RhbnRXcml0ZXJJbXBsLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9mb3JtYXRzL2h0bWwvRW51bUNvbnN0YW50V3JpdGVySW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMCwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMzUsNiArMzUsMTEgQEAKIC8qKgogICogV3JpdGVzIGVudW0gY29uc3RhbnQgZG9jdW1lbnRhdGlvbiBpbiBIVE1MIGZvcm1hdC4KICAqCisgKiAgPHA+PGI+VGhpcyBpcyBOT1QgcGFydCBvZiBhbnkgc3VwcG9ydGVkIEFQSS4KKyAqICBJZiB5b3Ugd3JpdGUgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhpcywgeW91IGRvIHNvIGF0IHlvdXIgb3duIHJpc2suCisgKiAgVGhpcyBjb2RlIGFuZCBpdHMgaW50ZXJuYWwgaW50ZXJmYWNlcyBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugb3IKKyAqICBkZWxldGlvbiB3aXRob3V0IG5vdGljZS48L2I+CisgKgogICogQGF1dGhvciBKYW1pZSBIbwogICogQGF1dGhvciBCaGF2ZXNoIFBhdGVsIChNb2RpZmllZCkKICAqLwpkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9mb3JtYXRzL2h0bWwvRmllbGRXcml0ZXJJbXBsLmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9GaWVsZFdyaXRlckltcGwuamF2YQppbmRleCBlZDQ0MmFhLi4zZjAwMDYzIDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9GaWVsZFdyaXRlckltcGwuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9GaWVsZFdyaXRlckltcGwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTcsIDIwMTAsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTM1LDYgKzM1LDExIEBACiAvKioKICAqIFdyaXRlcyBmaWVsZCBkb2N1bWVudGF0aW9uIGluIEhUTUwgZm9ybWF0LgogICoKKyAqICA8cD48Yj5UaGlzIGlzIE5PVCBwYXJ0IG9mIGFueSBzdXBwb3J0ZWQgQVBJLgorICogIElmIHlvdSB3cml0ZSBjb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGlzLCB5b3UgZG8gc28gYXQgeW91ciBvd24gcmlzay4KKyAqICBUaGlzIGNvZGUgYW5kIGl0cyBpbnRlcm5hbCBpbnRlcmZhY2VzIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSBvcgorICogIGRlbGV0aW9uIHdpdGhvdXQgbm90aWNlLjwvYj4KKyAqCiAgKiBAYXV0aG9yIFJvYmVydCBGaWVsZAogICogQGF1dGhvciBBdHVsIE0gRGFtYmFsa2FyCiAgKiBAYXV0aG9yIEphbWllIEhvIChyZXdyaXRlKQpkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9mb3JtYXRzL2h0bWwvRnJhbWVPdXRwdXRXcml0ZXIuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL0ZyYW1lT3V0cHV0V3JpdGVyLmphdmEKaW5kZXggMWQ3YWMyNy4uMDA2ZThlMiAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9mb3JtYXRzL2h0bWwvRnJhbWVPdXRwdXRXcml0ZXIuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9GcmFtZU91dHB1dFdyaXRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMTk5NywgMjAxMCwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5NywgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjYsOSArMjYsMTAgQEAKIHBhY2thZ2UgY29tLnN1bi50b29scy5kb2NsZXRzLmZvcm1hdHMuaHRtbDsKIAogaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC51dGlsLio7Ci1pbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQuKjsKKwogaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5mb3JtYXRzLmh0bWwubWFya3VwLio7CitpbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQuKjsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC51dGlsLio7CiAKIC8qKgogICogR2VuZXJhdGUgdGhlIGRvY3VtZW50YXRpb24gaW4gdGhlIEh0bWwgImZyYW1lIiBmb3JtYXQgaW4gdGhlIGJyb3dzZXIuIFRoZQpAQCAtNDAsNiArNDEsMTEgQEAKICAqIHJpZ2h0LWhhbmQgZnJhbWUgd2lsbCBoYXZlIG92ZXJ2aWV3IG9yIHBhY2thZ2Ugc3VtbWFyeSBvciBjbGFzcyBmaWxlLiBBbHNvCiAgKiB0YWtlIGNhcmUgb2YgYnJvd3NlcnMgd2hpY2ggZG8gbm90IHN1cHBvcnQgSHRtbCBmcmFtZXMuCiAgKgorICogIDxwPjxiPlRoaXMgaXMgTk9UIHBhcnQgb2YgYW55IHN1cHBvcnRlZCBBUEkuCisgKiAgSWYgeW91IHdyaXRlIGNvZGUgdGhhdCBkZXBlbmRzIG9uIHRoaXMsIHlvdSBkbyBzbyBhdCB5b3VyIG93biByaXNrLgorICogIFRoaXMgY29kZSBhbmQgaXRzIGludGVybmFsIGludGVyZmFjZXMgYXJlIHN1YmplY3QgdG8gY2hhbmdlIG9yCisgKiAgZGVsZXRpb24gd2l0aG91dCBub3RpY2UuPC9iPgorICoKICAqIEBhdXRob3IgQXR1bCBNIERhbWJhbGthcgogICovCiBwdWJsaWMgY2xhc3MgRnJhbWVPdXRwdXRXcml0ZXIgZXh0ZW5kcyBIdG1sRG9jbGV0V3JpdGVyIHsKQEAgLTg5LDcgKzk1LDcgQEAKICAgICAgKiBHZW5lcmF0ZSB0aGUgY29udGFudHMgaW4gdGhlICJpbmRleC5odG1sIiBmaWxlLiBQcmludCB0aGUgZnJhbWUgZGV0YWlscwogICAgICAqIGFzIHdlbGwgYXMgd2FybmluZyBpZiBicm93c2VyIGlzIG5vdCBzdXBwb3J0aW5nIHRoZSBIdG1sIGZyYW1lcy4KICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZUZyYW1lRmlsZSgpIHsKKyAgICBwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZUZyYW1lRmlsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIENvbnRlbnQgZnJhbWVzZXQgPSBnZXRGcmFtZURldGFpbHMoKTsKICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24ud2luZG93dGl0bGUubGVuZ3RoKCkgPiAwKSB7CiAgICAgICAgICAgICBwcmludEZyYW1lc2V0RG9jdW1lbnQoY29uZmlndXJhdGlvbi53aW5kb3d0aXRsZSwgY29uZmlndXJhdGlvbi5ub3RpbWVzdGFtcCwKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL0hlbHBXcml0ZXIuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL0hlbHBXcml0ZXIuamF2YQppbmRleCA3ZjE1Yzg0Li5iNWU2YWMzIDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9IZWxwV3JpdGVyLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9mb3JtYXRzL2h0bWwvSGVscFdyaXRlci5qYXZhCkBAIC0yNiwxNCArMjYsMjAgQEAKIHBhY2thZ2UgY29tLnN1bi50b29scy5kb2NsZXRzLmZvcm1hdHMuaHRtbDsKIAogaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC51dGlsLio7Ci1pbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQuKjsKKwogaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5mb3JtYXRzLmh0bWwubWFya3VwLio7CitpbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQuKjsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC51dGlsLio7CiAKIC8qKgogICogR2VuZXJhdGUgdGhlIEhlbHAgRmlsZSBmb3IgdGhlIGdlbmVyYXRlZCBBUEkgZG9jdW1lbnRhdGlvbi4gVGhlIGhlbHAgZmlsZQogICogY29udGVudHMgYXJlIGhlbHBmdWwgZm9yIGJyb3dzaW5nIHRoZSBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbi4KICAqCisgKiAgPHA+PGI+VGhpcyBpcyBOT1QgcGFydCBvZiBhbnkgc3VwcG9ydGVkIEFQSS4KKyAqICBJZiB5b3Ugd3JpdGUgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhpcywgeW91IGRvIHNvIGF0IHlvdXIgb3duIHJpc2suCisgKiAgVGhpcyBjb2RlIGFuZCBpdHMgaW50ZXJuYWwgaW50ZXJmYWNlcyBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugb3IKKyAqICBkZWxldGlvbiB3aXRob3V0IG5vdGljZS48L2I+CisgKgogICogQGF1dGhvciBBdHVsIE0gRGFtYmFsa2FyCiAgKi8KIHB1YmxpYyBjbGFzcyBIZWxwV3JpdGVyIGV4dGVuZHMgSHRtbERvY2xldFdyaXRlciB7CkBAIC03Myw3ICs3OSw3IEBACiAgICAgLyoqCiAgICAgICogR2VuZXJhdGUgdGhlIGhlbHAgZmlsZSBjb250ZW50cy4KICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZUhlbHBGaWxlKCkgeworICAgIHByb3RlY3RlZCB2b2lkIGdlbmVyYXRlSGVscEZpbGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBTdHJpbmcgdGl0bGUgPSBjb25maWd1cmF0aW9uLmdldFRleHQoImRvY2xldC5XaW5kb3dfSGVscF90aXRsZSIpOwogICAgICAgICBDb250ZW50IGJvZHkgPSBnZXRCb2R5KHRydWUsIGdldFdpbmRvd1RpdGxlKHRpdGxlKSk7CiAgICAgICAgIGFkZFRvcChib2R5KTsKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL0h0bWxEb2NsZXQuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL0h0bWxEb2NsZXQuamF2YQppbmRleCA4OWFmOWFiLi5lZjViYjI0IDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9IdG1sRG9jbGV0LmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9mb3JtYXRzL2h0bWwvSHRtbERvY2xldC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMTk5NywgMjAxMSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5NywgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjQsMTcgKzI0LDIyIEBACiAgKi8KIHBhY2thZ2UgY29tLnN1bi50b29scy5kb2NsZXRzLmZvcm1hdHMuaHRtbDsKIAoraW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworaW1wb3J0IGNvbS5zdW4uamF2YWRvYy4qOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0Lio7CiBpbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQuYnVpbGRlcnMuKjsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC51dGlsLio7CiAKLWltcG9ydCBjb20uc3VuLmphdmFkb2MuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLmlvLio7Ci0KIC8qKgogICogVGhlIGNsYXNzIHdpdGggInN0YXJ0IiBtZXRob2QsIGNhbGxzIGluZGl2aWR1YWwgV3JpdGVycy4KICAqCisgKiAgPHA+PGI+VGhpcyBpcyBOT1QgcGFydCBvZiBhbnkgc3VwcG9ydGVkIEFQSS4KKyAqICBJZiB5b3Ugd3JpdGUgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhpcywgeW91IGRvIHNvIGF0IHlvdXIgb3duIHJpc2suCisgKiAgVGhpcyBjb2RlIGFuZCBpdHMgaW50ZXJuYWwgaW50ZXJmYWNlcyBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugb3IKKyAqICBkZWxldGlvbiB3aXRob3V0IG5vdGljZS48L2I+CisgKgogICogQGF1dGhvciBBdHVsIE0gRGFtYmFsa2FyCiAgKiBAYXV0aG9yIFJvYmVydCBGaWVsZAogICogQGF1dGhvciBKYW1pZSBIbwpkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9mb3JtYXRzL2h0bWwvSHRtbERvY2xldFdyaXRlci5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9mb3JtYXRzL2h0bWwvSHRtbERvY2xldFdyaXRlci5qYXZhCmluZGV4IDU5ZDc3NjEuLmM1YmQyODEgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL0h0bWxEb2NsZXRXcml0ZXIuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9IdG1sRG9jbGV0V3JpdGVyLmphdmEKQEAgLTMyLDE0ICszMiwxOSBAQAogaW1wb3J0IGNvbS5zdW4uamF2YWRvYy4qOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5mb3JtYXRzLmh0bWwubWFya3VwLio7CiBpbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQuKjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC51dGlsLio7CiBpbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQudGFnbGV0cy4qOworaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0LnV0aWwuKjsKIAogLyoqCiAgKiBDbGFzcyBmb3IgdGhlIEh0bWwgRm9ybWF0IENvZGUgR2VuZXJhdGlvbiBzcGVjaWZpYyB0byBKYXZhRG9jLgogICogVGhpcyBDbGFzcyBjb250YWlucyBtZXRob2RzIHJlbGF0ZWQgdG8gdGhlIEh0bWwgQ29kZSBHZW5lcmF0aW9uIHdoaWNoCiAgKiBhcmUgdXNlZCBleHRlbnNpdmVseSB3aGlsZSBnZW5lcmF0aW5nIHRoZSBlbnRpcmUgZG9jdW1lbnRhdGlvbi4KICAqCisgKiAgPHA+PGI+VGhpcyBpcyBOT1QgcGFydCBvZiBhbnkgc3VwcG9ydGVkIEFQSS4KKyAqICBJZiB5b3Ugd3JpdGUgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhpcywgeW91IGRvIHNvIGF0IHlvdXIgb3duIHJpc2suCisgKiAgVGhpcyBjb2RlIGFuZCBpdHMgaW50ZXJuYWwgaW50ZXJmYWNlcyBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugb3IKKyAqICBkZWxldGlvbiB3aXRob3V0IG5vdGljZS48L2I+CisgKgogICogQHNpbmNlIDEuMgogICogQGF1dGhvciBBdHVsIE0gRGFtYmFsa2FyCiAgKiBAYXV0aG9yIFJvYmVydCBGaWVsZApAQCAtMjAxLDMzICsyMDYsNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFByaW50IEh0bWwgSHlwZXIgTGluaywgd2l0aCB0YXJnZXQgZnJhbWUuICBUaGlzCi0gICAgICogbGluayB3aWxsIG9ubHkgYXBwZWFyIGlmIHBhZ2UgaXMgbm90IGluIGEgZnJhbWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbGluayBTdHJpbmcgbmFtZSBvZiB0aGUgZmlsZS4KLSAgICAgKiBAcGFyYW0gd2hlcmUgUG9zaXRpb24gaW4gdGhlIGZpbGUKLSAgICAgKiBAcGFyYW0gdGFyZ2V0IE5hbWUgb2YgdGhlIHRhcmdldCBmcmFtZS4KLSAgICAgKiBAcGFyYW0gbGFiZWwgVGFnIGZvciB0aGUgbGluay4KLSAgICAgKiBAcGFyYW0gc3Ryb25nIFdoZXRoZXIgdGhlIGxhYmVsIHNob3VsZCBiZSBzdHJvbmcgb3Igbm90PwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHByaW50Tm9GcmFtZXNUYXJnZXRIeXBlckxpbmsoU3RyaW5nIGxpbmssIFN0cmluZyB3aGVyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRhcmdldCwgU3RyaW5nIGxhYmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHN0cm9uZykgewotICAgICAgICBzY3JpcHQoKTsKLSAgICAgICAgcHJpbnRsbigiICA8IS0tIik7Ci0gICAgICAgIHByaW50bG4oIiAgaWYod2luZG93PT10b3ApIHsiKTsKLSAgICAgICAgcHJpbnRsbigiICAgIGRvY3VtZW50LndyaXRlbG4oJyIKLSAgICAgICAgICAgICsgZ2V0SHlwZXJMaW5rU3RyaW5nKGxpbmssIHdoZXJlLCBsYWJlbCwgc3Ryb25nLCAiIiwgIiIsIHRhcmdldCkgKyAiJyk7Iik7Ci0gICAgICAgIHByaW50bG4oIiAgfSIpOwotICAgICAgICBwcmludGxuKCIgIC8vLS0+Iik7Ci0gICAgICAgIHNjcmlwdEVuZCgpOwotICAgICAgICBub1NjcmlwdCgpOwotICAgICAgICBwcmludGxuKCIgICIgKyBnZXRIeXBlckxpbmtTdHJpbmcobGluaywgd2hlcmUsIGxhYmVsLCBzdHJvbmcsICIiLCAiIiwgdGFyZ2V0KSk7Ci0gICAgICAgIG5vU2NyaXB0RW5kKCk7Ci0gICAgICAgIHByaW50bG4oRG9jbGV0Q29uc3RhbnRzLk5MKTsKLSAgICB9Ci0KLSAgICAvKioKICAgICAgKiBHZXQgdGhlIHNjcmlwdCB0byBzaG93IG9yIGhpZGUgdGhlIEFsbCBjbGFzc2VzIGxpbmsuCiAgICAgICoKICAgICAgKiBAcGFyYW0gaWQgaWQgb2YgdGhlIGVsZW1lbnQgdG8gc2hvdyBvciBoaWRlCkBAIC0zMjQsMTQgKzMwMiw2IEBACiAgICAgICAgIHJldHVybiBuZXcgVGFnbGV0V3JpdGVySW1wbCh0aGlzLCBpc0ZpcnN0U2VudGVuY2UpOwogICAgIH0KIAotICAgIHByb3RlY3RlZCB2b2lkIHByaW50VGFnc0luZm9IZWFkZXIoKSB7Ci0gICAgICAgIGRsKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJpbnRUYWdzSW5mb0Zvb3RlcigpIHsKLSAgICAgICAgZGxFbmQoKTsKLSAgICB9Ci0KICAgICAvKioKICAgICAgKiBHZXQgUGFja2FnZSBsaW5rLCB3aXRoIHRhcmdldCBmcmFtZS4KICAgICAgKgpAQCAtMzQ2LDY2ICszMTYsNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFByaW50IHRoZSBodG1sIGZpbGUgaGVhZGVyLiBBbHNvIHByaW50IEh0bWwgcGFnZSB0aXRsZSBhbmQgc3R5bGVzaGVldAotICAgICAqIGRlZmF1bHQgcHJvcGVydGllcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0aXRsZSAgICAgICAgIFN0cmluZyB3aW5kb3cgdGl0bGUgdG8gZ28gaW4gdGhlICZsdDtUSVRMRSZndDsgdGFnCi0gICAgICogQHBhcmFtIG1ldGFrZXl3b3JkcyAgQXJyYXkgb2YgU3RyaW5nIGtleXdvcmRzIGZvciBNRVRBIHRhZy4gIEVhY2ggZWxlbWVudAotICAgICAqICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBhcnJheSBpcyBhc3NpZ25lZCB0byBhIHNlcGFyYXRlIE1FVEEgdGFnLgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIFBhc3MgaW4gbnVsbCBmb3Igbm8gYXJyYXkuCi0gICAgICogQHBhcmFtIGluY2x1ZGVTY3JpcHQgYm9vbGVhbiB0cnVlIGlmIHByaW50aW5nIHdpbmRvd3RpdGxlIHNjcmlwdC4KLSAgICAgKiAgICAgICAgICAgICBGYWxzZSBmb3IgZmlsZXMgdGhhdCBhcHBlYXIgaW4gdGhlIGxlZnQtaGFuZCBmcmFtZXMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHJpbnRIdG1sSGVhZGVyKFN0cmluZyB0aXRsZSwgU3RyaW5nW10gbWV0YWtleXdvcmRzLAotICAgICAgICAgICAgYm9vbGVhbiBpbmNsdWRlU2NyaXB0KSB7Ci0gICAgICAgIHByaW50bG4oIjwhRE9DVFlQRSBIVE1MIFBVQkxJQyBcIi0vL1czQy8vRFREIEhUTUwgNC4wMSAiICsKLSAgICAgICAgICAgICAgICAgICAgIlRyYW5zaXRpb25hbC8vRU5cIiAiICsKLSAgICAgICAgICAgICAgICAgICAgIlwiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkXCI+Iik7Ci0gICAgICAgIHByaW50bG4oIjwhLS1OZXdQYWdlLS0+Iik7Ci0gICAgICAgIGh0bWwoKTsKLSAgICAgICAgaGVhZCgpOwotICAgICAgICBpZiAoISBjb25maWd1cmF0aW9uLm5vdGltZXN0YW1wKSB7Ci0gICAgICAgICAgICBwcmludCgiPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAoYnVpbGQgIiArIENvbmZpZ3VyYXRpb25JbXBsLkJVSUxEX0RBVEUgKyAiKSBvbiAiKTsKLSAgICAgICAgICAgIHByaW50KHRvZGF5KCkpOwotICAgICAgICAgICAgcHJpbnRsbigiIC0tPiIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjb25maWd1cmF0aW9uLmNoYXJzZXQubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICBwcmludGxuKCI8TUVUQSBodHRwLWVxdWl2PVwiQ29udGVudC1UeXBlXCIgY29udGVudD1cInRleHQvaHRtbDsgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiY2hhcnNldD0iICsgY29uZmlndXJhdGlvbi5jaGFyc2V0ICsgIlwiPiIpOwotICAgICAgICB9Ci0gICAgICAgIGlmICggY29uZmlndXJhdGlvbi53aW5kb3d0aXRsZS5sZW5ndGgoKSA+IDAgKSB7Ci0gICAgICAgICAgICB0aXRsZSArPSAiICgiICsgY29uZmlndXJhdGlvbi53aW5kb3d0aXRsZSAgKyAiKSI7Ci0gICAgICAgIH0KLSAgICAgICAgdGl0bGUodGl0bGUpOwotICAgICAgICBwcmludGxuKHRpdGxlKTsKLSAgICAgICAgdGl0bGVFbmQoKTsKLSAgICAgICAgcHJpbnRsbigiIik7Ci0gICAgICAgIGlmICghIGNvbmZpZ3VyYXRpb24ubm90aW1lc3RhbXApIHsKLSAgICAgICAgICAgICAgICBTaW1wbGVEYXRlRm9ybWF0IGRhdGVGb3JtYXQgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgieXl5eS1NTS1kZCIpOwotICAgICAgICAgICAgICAgIHByaW50bG4oIjxNRVRBIE5BTUU9XCJkYXRlXCIgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiQ09OVEVOVD1cIiIgKyBkYXRlRm9ybWF0LmZvcm1hdChuZXcgRGF0ZSgpKSArICJcIj4iKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIG1ldGFrZXl3b3JkcyAhPSBudWxsICkgewotICAgICAgICAgICAgZm9yICggaW50IGk9MDsgaSA8IG1ldGFrZXl3b3Jkcy5sZW5ndGg7IGkrKyApIHsKLSAgICAgICAgICAgICAgICBwcmludGxuKCI8TUVUQSBOQU1FPVwia2V5d29yZHNcIiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiQ09OVEVOVD1cIiIgKyBtZXRha2V5d29yZHNbaV0gKyAiXCI+Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcHJpbnRsbigiIik7Ci0gICAgICAgIHByaW50U3R5bGVTaGVldFByb3BlcnRpZXMoKTsKLSAgICAgICAgcHJpbnRsbigiIik7Ci0gICAgICAgIC8vIERvbid0IHByaW50IHdpbmRvd3RpdGxlIHNjcmlwdCBmb3Igb3ZlcnZpZXctZnJhbWUsIGFsbGNsYXNzZXMtZnJhbWUKLSAgICAgICAgLy8gYW5kIHBhY2thZ2UtZnJhbWUKLSAgICAgICAgaWYgKGluY2x1ZGVTY3JpcHQpIHsKLSAgICAgICAgICAgIHByaW50V2luVGl0bGVTY3JpcHQodGl0bGUpOwotICAgICAgICB9Ci0gICAgICAgIHByaW50bG4oIiIpOwotICAgICAgICBoZWFkRW5kKCk7Ci0gICAgICAgIHByaW50bG4oIiIpOwotICAgICAgICBib2R5KCJ3aGl0ZSIsIGluY2x1ZGVTY3JpcHQpOwotICAgIH0KLQotICAgIC8qKgogICAgICAqIEdlbmVyYXRlcyB0aGUgSFRNTCBkb2N1bWVudCB0cmVlIGFuZCBwcmludHMgaXQgb3V0LgogICAgICAqCiAgICAgICogQHBhcmFtIG1ldGFrZXl3b3JkcyBBcnJheSBvZiBTdHJpbmcga2V5d29yZHMgZm9yIE1FVEEgdGFnLiBFYWNoIGVsZW1lbnQKQEAgLTQxNiwxMyArMzI2LDEyIEBACiAgICAgICogQHBhcmFtIGJvZHkgdGhlIGJvZHkgaHRtbHRyZWUgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcHJpbnRIdG1sRG9jdW1lbnQoU3RyaW5nW10gbWV0YWtleXdvcmRzLCBib29sZWFuIGluY2x1ZGVTY3JpcHQsCi0gICAgICAgICAgICBDb250ZW50IGJvZHkpIHsKKyAgICAgICAgICAgIENvbnRlbnQgYm9keSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgQ29udGVudCBodG1sRG9jVHlwZSA9IERvY1R5cGUuVHJhbnNpdGlvbmFsKCk7CiAgICAgICAgIENvbnRlbnQgaHRtbENvbW1lbnQgPSBuZXcgQ29tbWVudChjb25maWd1cmF0aW9uLmdldFRleHQoImRvY2xldC5OZXdfUGFnZSIpKTsKICAgICAgICAgQ29udGVudCBoZWFkID0gbmV3IEh0bWxUcmVlKEh0bWxUYWcuSEVBRCk7CiAgICAgICAgIGlmICghY29uZmlndXJhdGlvbi5ub3RpbWVzdGFtcCkgewotICAgICAgICAgICAgQ29udGVudCBoZWFkQ29tbWVudCA9IG5ldyBDb21tZW50KCJHZW5lcmF0ZWQgYnkgamF2YWRvYyAodmVyc2lvbiAiICsKLSAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbkltcGwuQlVJTERfREFURSArICIpIG9uICIgKyB0b2RheSgpKTsKKyAgICAgICAgICAgIENvbnRlbnQgaGVhZENvbW1lbnQgPSBuZXcgQ29tbWVudChnZXRHZW5lcmF0ZWRCeVN0cmluZygpKTsKICAgICAgICAgICAgIGhlYWQuYWRkQ29udGVudChoZWFkQ29tbWVudCk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24uY2hhcnNldC5sZW5ndGgoKSA+IDApIHsKQEAgLTQ0Nyw3ICszNTYsNyBAQAogICAgICAgICAgICAgICAgIGhlYWQsIGJvZHkpOwogICAgICAgICBDb250ZW50IGh0bWxEb2N1bWVudCA9IG5ldyBIdG1sRG9jdW1lbnQoaHRtbERvY1R5cGUsCiAgICAgICAgICAgICAgICAgaHRtbENvbW1lbnQsIGh0bWxUcmVlKTsKLSAgICAgICAgcHJpbnQoaHRtbERvY3VtZW50LnRvU3RyaW5nKCkpOworICAgICAgICB3cml0ZShodG1sRG9jdW1lbnQpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNDY0LDI2ICszNzMsNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFByaW50IHVzZXIgc3BlY2lmaWVkIGhlYWRlciBhbmQgdGhlIGZvb3Rlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBoZWFkZXIgaWYgdHJ1ZSBwcmludCB0aGUgdXNlciBwcm92aWRlZCBoZWFkZXIgZWxzZSBwcmludCB0aGUKLSAgICAgKiB1c2VyIHByb3ZpZGVkIGZvb3Rlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwcmludFVzZXJIZWFkZXJGb290ZXIoYm9vbGVhbiBoZWFkZXIpIHsKLSAgICAgICAgZW0oKTsKLSAgICAgICAgaWYgKGhlYWRlcikgewotICAgICAgICAgICAgcHJpbnQocmVwbGFjZURvY1Jvb3REaXIoY29uZmlndXJhdGlvbi5oZWFkZXIpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uLmZvb3Rlci5sZW5ndGgoKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnQocmVwbGFjZURvY1Jvb3REaXIoY29uZmlndXJhdGlvbi5mb290ZXIpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcHJpbnQocmVwbGFjZURvY1Jvb3REaXIoY29uZmlndXJhdGlvbi5oZWFkZXIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbUVuZCgpOwotICAgIH0KLQotICAgIC8qKgogICAgICAqIEdldCB1c2VyIHNwZWNpZmllZCBoZWFkZXIgYW5kIHRoZSBmb290ZXIuCiAgICAgICoKICAgICAgKiBAcGFyYW0gaGVhZGVyIGlmIHRydWUgcHJpbnQgdGhlIHVzZXIgcHJvdmlkZWQgaGVhZGVyIGVsc2UgcHJpbnQgdGhlCkBAIC01MDYsMTQgKzM5NSw2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUHJpbnQgdGhlIHVzZXIgc3BlY2lmaWVkIHRvcC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwcmludFRvcCgpIHsKLSAgICAgICAgcHJpbnQocmVwbGFjZURvY1Jvb3REaXIoY29uZmlndXJhdGlvbi50b3ApKTsKLSAgICAgICAgaHIoKTsKLSAgICB9Ci0KLSAgICAvKioKICAgICAgKiBBZGRzIHRoZSB1c2VyIHNwZWNpZmllZCB0b3AuCiAgICAgICoKICAgICAgKiBAcGFyYW0gYm9keSB0aGUgY29udGVudCB0cmVlIHRvIHdoaWNoIHVzZXIgc3BlY2lmaWVkIHRvcCB3aWxsIGJlIGFkZGVkCkBAIC01MjQsMTQgKzQwNSw2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUHJpbnQgdGhlIHVzZXIgc3BlY2lmaWVkIGJvdHRvbS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwcmludEJvdHRvbSgpIHsKLSAgICAgICAgaHIoKTsKLSAgICAgICAgcHJpbnQocmVwbGFjZURvY1Jvb3REaXIoY29uZmlndXJhdGlvbi5ib3R0b20pKTsKLSAgICB9Ci0KLSAgICAvKioKICAgICAgKiBBZGRzIHRoZSB1c2VyIHNwZWNpZmllZCBib3R0b20uCiAgICAgICoKICAgICAgKiBAcGFyYW0gYm9keSB0aGUgY29udGVudCB0cmVlIHRvIHdoaWNoIHVzZXIgc3BlY2lmaWVkIGJvdHRvbSB3aWxsIGJlIGFkZGVkCkBAIC01NDQsMTI4ICs0MTcsNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFByaW50IHRoZSBuYXZpZ2F0aW9uIGJhciBmb3IgdGhlIEh0bWwgcGFnZSBhdCB0aGUgdG9wIGFuZCBhbmQgdGhlIGJvdHRvbS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBoZWFkZXIgSWYgdHJ1ZSBwcmludCBuYXZpZ2F0aW9uIGJhciBhdCB0aGUgdG9wIG9mIHRoZSBwYWdlIGVsc2UKLSAgICAgKiBwcmludCB0aGUgbmV2aWdhdGlvbiBiYXIgYXQgdGhlIGJvdHRvbS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBuYXZMaW5rcyhib29sZWFuIGhlYWRlcikgewotICAgICAgICBwcmludGxuKCIiKTsKLSAgICAgICAgaWYgKCFjb25maWd1cmF0aW9uLm5vbmF2YmFyKSB7Ci0gICAgICAgICAgICBpZiAoaGVhZGVyKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRsbihEb2NsZXRDb25zdGFudHMuTkwgKyAiPCEtLSA9PT09PT09PT0gU1RBUlQgT0YgVE9QIE5BVkJBUiA9PT09PT09IC0tPiIpOwotICAgICAgICAgICAgICAgIGFuY2hvcigibmF2YmFyX3RvcCIpOwotICAgICAgICAgICAgICAgIHByaW50bG4oKTsKLSAgICAgICAgICAgICAgICBwcmludChnZXRIeXBlckxpbmtTdHJpbmcoIiIsICJza2lwLW5hdmJhcl90b3AiLCAiIiwgZmFsc2UsICIiLAotICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uLmdldFRleHQoImRvY2xldC5Ta2lwX25hdmlnYXRpb25fbGlua3MiKSwgIiIpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRsbihEb2NsZXRDb25zdGFudHMuTkwgKyAiPCEtLSA9PT09PT09IFNUQVJUIE9GIEJPVFRPTSBOQVZCQVIgPT09PT09IC0tPiIpOwotICAgICAgICAgICAgICAgIGFuY2hvcigibmF2YmFyX2JvdHRvbSIpOwotICAgICAgICAgICAgICAgIHByaW50bG4oKTsKLSAgICAgICAgICAgICAgICBwcmludChnZXRIeXBlckxpbmtTdHJpbmcoIiIsICJza2lwLW5hdmJhcl9ib3R0b20iLCAiIiwgZmFsc2UsICIiLAotICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uLmdldFRleHQoImRvY2xldC5Ta2lwX25hdmlnYXRpb25fbGlua3MiKSwgIiIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRhYmxlKDAsICIxMDAlIiwgMSwgMCk7Ci0gICAgICAgICAgICB0cigpOwotICAgICAgICAgICAgdGRDb2xzcGFuQmdjb2xvclN0eWxlKDIsICIjRUVFRUZGIiwgIk5hdkJhckNlbGwxIik7Ci0gICAgICAgICAgICBwcmludGxuKCIiKTsKLSAgICAgICAgICAgIGlmIChoZWFkZXIpIHsKLSAgICAgICAgICAgICAgICBhbmNob3IoIm5hdmJhcl90b3BfZmlyc3Ryb3ciKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYW5jaG9yKCJuYXZiYXJfYm90dG9tX2ZpcnN0cm93Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0YWJsZSgwLCAwLCAzKTsKLSAgICAgICAgICAgIHByaW50KCIgICIpOwotICAgICAgICAgICAgdHJBbGlnblZBbGlnbigiY2VudGVyIiwgInRvcCIpOwotCi0gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbi5jcmVhdGVvdmVydmlldykgewotICAgICAgICAgICAgICAgIG5hdkxpbmtDb250ZW50cygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbi5wYWNrYWdlcy5sZW5ndGggPT0gMSkgewotICAgICAgICAgICAgICAgIG5hdkxpbmtQYWNrYWdlKGNvbmZpZ3VyYXRpb24ucGFja2FnZXNbMF0pOwotICAgICAgICAgICAgfSBlbHNlIGlmIChjb25maWd1cmF0aW9uLnBhY2thZ2VzLmxlbmd0aCA+IDEpIHsKLSAgICAgICAgICAgICAgICBuYXZMaW5rUGFja2FnZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBuYXZMaW5rQ2xhc3MoKTsKLQotICAgICAgICAgICAgaWYoY29uZmlndXJhdGlvbi5jbGFzc3VzZSkgewotICAgICAgICAgICAgICAgIG5hdkxpbmtDbGFzc1VzZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoY29uZmlndXJhdGlvbi5jcmVhdGV0cmVlKSB7Ci0gICAgICAgICAgICAgICAgbmF2TGlua1RyZWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKCEoY29uZmlndXJhdGlvbi5ub2RlcHJlY2F0ZWQgfHwKLSAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24ubm9kZXByZWNhdGVkbGlzdCkpIHsKLSAgICAgICAgICAgICAgICBuYXZMaW5rRGVwcmVjYXRlZCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoY29uZmlndXJhdGlvbi5jcmVhdGVpbmRleCkgewotICAgICAgICAgICAgICAgIG5hdkxpbmtJbmRleCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFjb25maWd1cmF0aW9uLm5vaGVscCkgewotICAgICAgICAgICAgICAgIG5hdkxpbmtIZWxwKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwcmludCgiICAiKTsKLSAgICAgICAgICAgIHRyRW5kKCk7Ci0gICAgICAgICAgICB0YWJsZUVuZCgpOwotICAgICAgICAgICAgdGRFbmQoKTsKLQotICAgICAgICAgICAgdGRBbGlnblZBbGlnblJvd3NwYW4oInJpZ2h0IiwgInRvcCIsIDMpOwotCi0gICAgICAgICAgICBwcmludFVzZXJIZWFkZXJGb290ZXIoaGVhZGVyKTsKLSAgICAgICAgICAgIHRkRW5kKCk7Ci0gICAgICAgICAgICB0ckVuZCgpOwotICAgICAgICAgICAgcHJpbnRsbigiIik7Ci0KLSAgICAgICAgICAgIHRyKCk7Ci0gICAgICAgICAgICB0ZEJnY29sb3JTdHlsZSgid2hpdGUiLCAiTmF2QmFyQ2VsbDIiKTsKLSAgICAgICAgICAgIGZvbnQoIi0yIik7Ci0gICAgICAgICAgICBzcGFjZSgpOwotICAgICAgICAgICAgbmF2TGlua1ByZXZpb3VzKCk7Ci0gICAgICAgICAgICBzcGFjZSgpOwotICAgICAgICAgICAgcHJpbnRsbigiIik7Ci0gICAgICAgICAgICBzcGFjZSgpOwotICAgICAgICAgICAgbmF2TGlua05leHQoKTsKLSAgICAgICAgICAgIGZvbnRFbmQoKTsKLSAgICAgICAgICAgIHRkRW5kKCk7Ci0KLSAgICAgICAgICAgIHRkQmdjb2xvclN0eWxlKCJ3aGl0ZSIsICJOYXZCYXJDZWxsMiIpOwotICAgICAgICAgICAgZm9udCgiLTIiKTsKLSAgICAgICAgICAgIHByaW50KCIgICIpOwotICAgICAgICAgICAgbmF2U2hvd0xpc3RzKCk7Ci0gICAgICAgICAgICBwcmludCgiICAiKTsKLSAgICAgICAgICAgIHNwYWNlKCk7Ci0gICAgICAgICAgICBwcmludGxuKCIiKTsKLSAgICAgICAgICAgIHNwYWNlKCk7Ci0gICAgICAgICAgICBuYXZIaWRlTGlzdHMoZmlsZW5hbWUpOwotICAgICAgICAgICAgcHJpbnQoIiAgIik7Ci0gICAgICAgICAgICBzcGFjZSgpOwotICAgICAgICAgICAgcHJpbnRsbigiIik7Ci0gICAgICAgICAgICBzcGFjZSgpOwotICAgICAgICAgICAgbmF2TGlua0NsYXNzSW5kZXgoKTsKLSAgICAgICAgICAgIGZvbnRFbmQoKTsKLSAgICAgICAgICAgIHRkRW5kKCk7Ci0KLSAgICAgICAgICAgIHRyRW5kKCk7Ci0KLSAgICAgICAgICAgIHByaW50U3VtbWFyeURldGFpbExpbmtzKCk7Ci0KLSAgICAgICAgICAgIHRhYmxlRW5kKCk7Ci0gICAgICAgICAgICBpZiAoaGVhZGVyKSB7Ci0gICAgICAgICAgICAgICAgYU5hbWUoInNraXAtbmF2YmFyX3RvcCIpOwotICAgICAgICAgICAgICAgIGFFbmQoKTsKLSAgICAgICAgICAgICAgICBwcmludGxuKERvY2xldENvbnN0YW50cy5OTCArICI8IS0tID09PT09PT09PSBFTkQgT0YgVE9QIE5BVkJBUiA9PT09PT09PT0gLS0+Iik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGFOYW1lKCJza2lwLW5hdmJhcl9ib3R0b20iKTsKLSAgICAgICAgICAgICAgICBhRW5kKCk7Ci0gICAgICAgICAgICAgICAgcHJpbnRsbihEb2NsZXRDb25zdGFudHMuTkwgKyAiPCEtLSA9PT09PT09PSBFTkQgT0YgQk9UVE9NIE5BVkJBUiA9PT09PT09IC0tPiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJpbnRsbigiIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKICAgICAgKiBBZGRzIHRoZSBuYXZpZ2F0aW9uIGJhciBmb3IgdGhlIEh0bWwgcGFnZSBhdCB0aGUgdG9wIGFuZCBhbmQgdGhlIGJvdHRvbS4KICAgICAgKgogICAgICAqIEBwYXJhbSBoZWFkZXIgSWYgdHJ1ZSBwcmludCBuYXZpZ2F0aW9uIGJhciBhdCB0aGUgdG9wIG9mIHRoZSBwYWdlIGVsc2UKQEAgLTc1NywxNCArNTA4LDYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQcmludCB0aGUgd29yZCAiTkVYVCIgdG8gaW5kaWNhdGUgdGhhdCBubyBsaW5rIGlzIGF2YWlsYWJsZS4gIE92ZXJyaWRlCi0gICAgICogdGhpcyBtZXRob2QgdG8gY3VzdG9taXplIG5leHQgbGluay4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBuYXZMaW5rTmV4dCgpIHsKLSAgICAgICAgbmF2TGlua05leHQobnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCiAgICAgICogR2V0IHRoZSB3b3JkICJORVhUIiB0byBpbmRpY2F0ZSB0aGF0IG5vIGxpbmsgaXMgYXZhaWxhYmxlLiAgT3ZlcnJpZGUKICAgICAgKiB0aGlzIG1ldGhvZCB0byBjdXN0b21pemUgbmV4dCBsaW5rLgogICAgICAqCkBAIC03NzUsMTQgKzUxOCw2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUHJpbnQgdGhlIHdvcmQgIlBSRVYiIHRvIGluZGljYXRlIHRoYXQgbm8gbGluayBpcyBhdmFpbGFibGUuICBPdmVycmlkZQotICAgICAqIHRoaXMgbWV0aG9kIHRvIGN1c3RvbWl6ZSBwcmV2IGxpbmsuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgbmF2TGlua1ByZXZpb3VzKCkgewotICAgICAgICBuYXZMaW5rUHJldmlvdXMobnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCiAgICAgICogR2V0IHRoZSB3b3JkICJQUkVWIiB0byBpbmRpY2F0ZSB0aGF0IG5vIGxpbmsgaXMgYXZhaWxhYmxlLiAgT3ZlcnJpZGUKICAgICAgKiB0aGlzIG1ldGhvZCB0byBjdXN0b21pemUgcHJldiBsaW5rLgogICAgICAqCkBAIC03OTUsMjYgKzUzMCwxMCBAQAogICAgIC8qKgogICAgICAqIERvIG5vdGhpbmcuIFRoaXMgaXMgdGhlIGRlZmF1bHQgbWV0aG9kLgogICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHByaW50U3VtbWFyeURldGFpbExpbmtzKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIERvIG5vdGhpbmcuIFRoaXMgaXMgdGhlIGRlZmF1bHQgbWV0aG9kLgotICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIGFkZFN1bW1hcnlEZXRhaWxMaW5rcyhDb250ZW50IG5hdkRpdikgewogICAgIH0KIAogICAgIC8qKgotICAgICAqIFByaW50IGxpbmsgdG8gdGhlICJvdmVydmlldy1zdW1tYXJ5Lmh0bWwiIHBhZ2UuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgbmF2TGlua0NvbnRlbnRzKCkgewotICAgICAgICBuYXZDZWxsU3RhcnQoKTsKLSAgICAgICAgcHJpbnRIeXBlckxpbmsocmVsYXRpdmVQYXRoICsgIm92ZXJ2aWV3LXN1bW1hcnkuaHRtbCIsICIiLAotICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uLmdldFRleHQoImRvY2xldC5PdmVydmlldyIpLCB0cnVlLCAiTmF2QmFyRm9udDEiKTsKLSAgICAgICAgbmF2Q2VsbEVuZCgpOwotICAgIH0KLQotICAgIC8qKgogICAgICAqIEdldCBsaW5rIHRvIHRoZSAib3ZlcnZpZXctc3VtbWFyeS5odG1sIiBwYWdlLgogICAgICAqCiAgICAgICogQHJldHVybiBhIGNvbnRlbnQgdHJlZSBmb3IgdGhlIGxpbmsKQEAgLTgyNyw0NiArNTQ2LDYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBEZXNjcmlwdGlvbiBmb3IgYSBjZWxsIGluIHRoZSBuYXZpZ2F0aW9uIGJhci4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBuYXZDZWxsU3RhcnQoKSB7Ci0gICAgICAgIHByaW50KCIgICIpOwotICAgICAgICB0ZEJnY29sb3JTdHlsZSgiI0VFRUVGRiIsICJOYXZCYXJDZWxsMSIpOwotICAgICAgICBwcmludCgiICAgICIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERlc2NyaXB0aW9uIGZvciBhIGNlbGwgaW4gdGhlIG5hdmlnYXRpb24gYmFyLCBidXQgd2l0aCByZXZlcnNlCi0gICAgICogaGlnaC1saWdodCBlZmZlY3QuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgbmF2Q2VsbFJldlN0YXJ0KCkgewotICAgICAgICBwcmludCgiICAiKTsKLSAgICAgICAgdGRCZ2NvbG9yU3R5bGUoIiNGRkZGRkYiLCAiTmF2QmFyQ2VsbDFSZXYiKTsKLSAgICAgICAgcHJpbnQoIiAiKTsKLSAgICAgICAgc3BhY2UoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbG9zaW5nIHRhZyBmb3IgbmF2aWdhdGlvbiBiYXIgY2VsbC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBuYXZDZWxsRW5kKCkgewotICAgICAgICBzcGFjZSgpOwotICAgICAgICB0ZEVuZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50IGxpbmsgdG8gdGhlICJwYWNrYWdlLXN1bW1hcnkuaHRtbCIgcGFnZSBmb3IgdGhlIHBhY2thZ2UgcGFzc2VkLgotICAgICAqCi0gICAgICogQHBhcmFtIHBrZyBQYWNrYWdlIHRvIHdoaWNoIGxpbmsgd2lsbCBiZSBnZW5lcmF0ZWQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgbmF2TGlua1BhY2thZ2UoUGFja2FnZURvYyBwa2cpIHsKLSAgICAgICAgbmF2Q2VsbFN0YXJ0KCk7Ci0gICAgICAgIHByaW50UGFja2FnZUxpbmsocGtnLCBjb25maWd1cmF0aW9uLmdldFRleHQoImRvY2xldC5QYWNrYWdlIiksIHRydWUsCi0gICAgICAgICAgICAiTmF2QmFyRm9udDEiKTsKLSAgICAgICAgbmF2Q2VsbEVuZCgpOwotICAgIH0KLQotICAgIC8qKgogICAgICAqIEdldCBsaW5rIHRvIHRoZSAicGFja2FnZS1zdW1tYXJ5Lmh0bWwiIHBhZ2UgZm9yIHRoZSBwYWNrYWdlIHBhc3NlZC4KICAgICAgKgogICAgICAqIEBwYXJhbSBwa2cgUGFja2FnZSB0byB3aGljaCBsaW5rIHdpbGwgYmUgZ2VuZXJhdGVkCkBAIC04ODAsMTggKzU1OSw2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUHJpbnQgdGhlIHdvcmQgIlBhY2thZ2UiIGluIHRoZSBuYXZpZ2F0aW9uIGJhciBjZWxsLCB0byBpbmRpY2F0ZSB0aGF0Ci0gICAgICogbGluayBpcyBub3QgYXZhaWxhYmxlIGhlcmUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgbmF2TGlua1BhY2thZ2UoKSB7Ci0gICAgICAgIG5hdkNlbGxTdGFydCgpOwotICAgICAgICBmb250U3R5bGUoIk5hdkJhckZvbnQxIik7Ci0gICAgICAgIHByaW50VGV4dCgiZG9jbGV0LlBhY2thZ2UiKTsKLSAgICAgICAgZm9udEVuZCgpOwotICAgICAgICBuYXZDZWxsRW5kKCk7Ci0gICAgfQotCi0gICAgLyoqCiAgICAgICogR2V0IHRoZSB3b3JkICJQYWNrYWdlIiAsIHRvIGluZGljYXRlIHRoYXQgbGluayBpcyBub3QgYXZhaWxhYmxlIGhlcmUuCiAgICAgICoKICAgICAgKiBAcmV0dXJuIGEgY29udGVudCB0cmVlIGZvciB0aGUgbGluawpAQCAtOTAyLDE4ICs1NjksNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFByaW50IHRoZSB3b3JkICJVc2UiIGluIHRoZSBuYXZpZ2F0aW9uIGJhciBjZWxsLCB0byBpbmRpY2F0ZSB0aGF0IGxpbmsKLSAgICAgKiBpcyBub3QgYXZhaWxhYmxlLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIG5hdkxpbmtDbGFzc1VzZSgpIHsKLSAgICAgICAgbmF2Q2VsbFN0YXJ0KCk7Ci0gICAgICAgIGZvbnRTdHlsZSgiTmF2QmFyRm9udDEiKTsKLSAgICAgICAgcHJpbnRUZXh0KCJkb2NsZXQubmF2Q2xhc3NVc2UiKTsKLSAgICAgICAgZm9udEVuZCgpOwotICAgICAgICBuYXZDZWxsRW5kKCk7Ci0gICAgfQotCi0gICAgLyoqCiAgICAgICogR2V0IHRoZSB3b3JkICJVc2UiLCB0byBpbmRpY2F0ZSB0aGF0IGxpbmsgaXMgbm90IGF2YWlsYWJsZS4KICAgICAgKgogICAgICAqIEByZXR1cm4gYSBjb250ZW50IHRyZWUgZm9yIHRoZSBsaW5rCkBAIC05MjQsMjAgKzU3OSw2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUHJpbnQgbGluayBmb3IgcHJldmlvdXMgZmlsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwcmV2IEZpbGUgbmFtZSBmb3IgdGhlIHByZXYgbGluay4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBuYXZMaW5rUHJldmlvdXMoU3RyaW5nIHByZXYpIHsKLSAgICAgICAgU3RyaW5nIHRhZyA9IGNvbmZpZ3VyYXRpb24uZ2V0VGV4dCgiZG9jbGV0LlByZXYiKTsKLSAgICAgICAgaWYgKHByZXYgIT0gbnVsbCkgewotICAgICAgICAgICAgcHJpbnRIeXBlckxpbmsocHJldiwgIiIsIHRhZywgdHJ1ZSkgOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcHJpbnQodGFnKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgogICAgICAqIEdldCBsaW5rIGZvciBwcmV2aW91cyBmaWxlLgogICAgICAqCiAgICAgICogQHBhcmFtIHByZXYgRmlsZSBuYW1lIGZvciB0aGUgcHJldiBsaW5rCkBAIC05NTQsMjEgKzU5NSw2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUHJpbnQgbGluayBmb3IgbmV4dCBmaWxlLiAgSWYgbmV4dCBpcyBudWxsLCBqdXN0IHByaW50IHRoZSBsYWJlbAotICAgICAqIHdpdGhvdXQgbGlua2luZyBpdCBhbnl3aGVyZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuZXh0IEZpbGUgbmFtZSBmb3IgdGhlIG5leHQgbGluay4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBuYXZMaW5rTmV4dChTdHJpbmcgbmV4dCkgewotICAgICAgICBTdHJpbmcgdGFnID0gY29uZmlndXJhdGlvbi5nZXRUZXh0KCJkb2NsZXQuTmV4dCIpOwotICAgICAgICBpZiAobmV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwcmludEh5cGVyTGluayhuZXh0LCAiIiwgdGFnLCB0cnVlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHByaW50KHRhZyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKICAgICAgKiBHZXQgbGluayBmb3IgbmV4dCBmaWxlLiAgSWYgbmV4dCBpcyBudWxsLCBqdXN0IHByaW50IHRoZSBsYWJlbAogICAgICAqIHdpdGhvdXQgbGlua2luZyBpdCBhbnl3aGVyZS4KICAgICAgKgpAQCAtOTg2LDE2ICs2MTIsNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFByaW50ICJGUkFNRVMiIGxpbmssIHRvIHN3aXRjaCB0byB0aGUgZnJhbWUgdmVyc2lvbiBvZiB0aGUgb3V0cHV0LgotICAgICAqCi0gICAgICogQHBhcmFtIGxpbmsgRmlsZSB0byBiZSBsaW5rZWQsICJpbmRleC5odG1sIi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBuYXZTaG93TGlzdHMoU3RyaW5nIGxpbmspIHsKLSAgICAgICAgcHJpbnQoZ2V0SHlwZXJMaW5rU3RyaW5nKGxpbmsgKyAiPyIgKyBwYXRoICsgZmlsZW5hbWUsICIiLAotICAgICAgICAgICAgY29uZmlndXJhdGlvbi5nZXRUZXh0KCJkb2NsZXQuRlJBTUVTIiksIHRydWUsICIiLCAiIiwgIl90b3AiKSk7Ci0gICAgfQotCi0gICAgLyoqCiAgICAgICogR2V0ICJGUkFNRVMiIGxpbmssIHRvIHN3aXRjaCB0byB0aGUgZnJhbWUgdmVyc2lvbiBvZiB0aGUgb3V0cHV0LgogICAgICAqCiAgICAgICogQHBhcmFtIGxpbmsgRmlsZSB0byBiZSBsaW5rZWQsICJpbmRleC5odG1sIgpAQCAtMTAwOSwxMyArNjI1LDYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQcmludCAiRlJBTUVTIiBsaW5rLCB0byBzd2l0Y2ggdG8gdGhlIGZyYW1lIHZlcnNpb24gb2YgdGhlIG91dHB1dC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBuYXZTaG93TGlzdHMoKSB7Ci0gICAgICAgIG5hdlNob3dMaXN0cyhyZWxhdGl2ZVBhdGggKyAiaW5kZXguaHRtbCIpOwotICAgIH0KLQotICAgIC8qKgogICAgICAqIEdldCAiRlJBTUVTIiBsaW5rLCB0byBzd2l0Y2ggdG8gdGhlIGZyYW1lIHZlcnNpb24gb2YgdGhlIG91dHB1dC4KICAgICAgKgogICAgICAqIEByZXR1cm4gYSBjb250ZW50IHRyZWUgZm9yIHRoZSBsaW5rCkBAIC0xMDI1LDE2ICs2MzQsNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFByaW50ICJOTyBGUkFNRVMiIGxpbmssIHRvIHN3aXRjaCB0byB0aGUgbm9uLWZyYW1lIHZlcnNpb24gb2YgdGhlIG91dHB1dC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsaW5rIEZpbGUgdG8gYmUgbGlua2VkLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIG5hdkhpZGVMaXN0cyhTdHJpbmcgbGluaykgewotICAgICAgICBwcmludChnZXRIeXBlckxpbmtTdHJpbmcobGluaywgIiIsIGNvbmZpZ3VyYXRpb24uZ2V0VGV4dCgiZG9jbGV0Lk5PX0ZSQU1FUyIpLAotICAgICAgICAgICAgdHJ1ZSwgIiIsICIiLCAiX3RvcCIpKTsKLSAgICB9Ci0KLSAgICAvKioKICAgICAgKiBHZXQgIk5PIEZSQU1FUyIgbGluaywgdG8gc3dpdGNoIHRvIHRoZSBub24tZnJhbWUgdmVyc2lvbiBvZiB0aGUgb3V0cHV0LgogICAgICAqCiAgICAgICogQHBhcmFtIGxpbmsgRmlsZSB0byBiZSBsaW5rZWQKQEAgLTEwNDcsMjUgKzY0Niw2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUHJpbnQgIlRyZWUiIGxpbmsgaW4gdGhlIG5hdmlnYXRpb24gYmFyLiBJZiB0aGVyZSBpcyBvbmx5IG9uZSBwYWNrYWdlCi0gICAgICogc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUsIHRoZW4gdGhlICJUcmVlIiBsaW5rIHdpbGwgYmUgdG8gdGhlCi0gICAgICogb25seSAicGFja2FnZS10cmVlLmh0bWwiIGZpbGUgb3RoZXJ3aXNlIGl0IHdpbGwgYmUgdG8gdGhlCi0gICAgICogIm92ZXJ2aWV3LXRyZWUuaHRtbCIgZmlsZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBuYXZMaW5rVHJlZSgpIHsKLSAgICAgICAgbmF2Q2VsbFN0YXJ0KCk7Ci0gICAgICAgIFBhY2thZ2VEb2NbXSBwYWNrYWdlcyA9IGNvbmZpZ3VyYXRpb24ucm9vdC5zcGVjaWZpZWRQYWNrYWdlcygpOwotICAgICAgICBpZiAocGFja2FnZXMubGVuZ3RoID09IDEgJiYgY29uZmlndXJhdGlvbi5yb290LnNwZWNpZmllZENsYXNzZXMoKS5sZW5ndGggPT0gMCkgewotICAgICAgICAgICAgcHJpbnRIeXBlckxpbmsocGF0aFN0cmluZyhwYWNrYWdlc1swXSwgInBhY2thZ2UtdHJlZS5odG1sIiksICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbi5nZXRUZXh0KCJkb2NsZXQuVHJlZSIpLCB0cnVlLCAiTmF2QmFyRm9udDEiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHByaW50SHlwZXJMaW5rKHJlbGF0aXZlUGF0aCArICJvdmVydmlldy10cmVlLmh0bWwiLCAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24uZ2V0VGV4dCgiZG9jbGV0LlRyZWUiKSwgdHJ1ZSwgIk5hdkJhckZvbnQxIik7Ci0gICAgICAgIH0KLSAgICAgICAgbmF2Q2VsbEVuZCgpOwotICAgIH0KLQotICAgIC8qKgogICAgICAqIEdldCAiVHJlZSIgbGluayBpbiB0aGUgbmF2aWdhdGlvbiBiYXIuIElmIHRoZXJlIGlzIG9ubHkgb25lIHBhY2thZ2UKICAgICAgKiBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZSwgdGhlbiB0aGUgIlRyZWUiIGxpbmsgd2lsbCBiZSB0byB0aGUKICAgICAgKiBvbmx5ICJwYWNrYWdlLXRyZWUuaHRtbCIgZmlsZSBvdGhlcndpc2UgaXQgd2lsbCBiZSB0byB0aGUKQEAgLTExMDIsMTggKzY4Miw2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUHJpbnQgdGhlIHdvcmQgIkNsYXNzIiBpbiB0aGUgbmF2aWdhdGlvbiBiYXIgY2VsbCwgdG8gaW5kaWNhdGUgdGhhdAotICAgICAqIGNsYXNzIGxpbmsgaXMgbm90IGF2YWlsYWJsZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBuYXZMaW5rQ2xhc3MoKSB7Ci0gICAgICAgIG5hdkNlbGxTdGFydCgpOwotICAgICAgICBmb250U3R5bGUoIk5hdkJhckZvbnQxIik7Ci0gICAgICAgIHByaW50VGV4dCgiZG9jbGV0LkNsYXNzIik7Ci0gICAgICAgIGZvbnRFbmQoKTsKLSAgICAgICAgbmF2Q2VsbEVuZCgpOwotICAgIH0KLQotICAgIC8qKgogICAgICAqIEdldCB0aGUgd29yZCAiQ2xhc3MiLCB0byBpbmRpY2F0ZSB0aGF0IGNsYXNzIGxpbmsgaXMgbm90IGF2YWlsYWJsZS4KICAgICAgKgogICAgICAqIEByZXR1cm4gYSBjb250ZW50IHRyZWUgZm9yIHRoZSBsaW5rCkBAIC0xMTI0LDE2ICs2OTIsNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFByaW50ICJEZXByZWNhdGVkIiBBUEkgbGluayBpbiB0aGUgbmF2aWdhdGlvbiBiYXIuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgbmF2TGlua0RlcHJlY2F0ZWQoKSB7Ci0gICAgICAgIG5hdkNlbGxTdGFydCgpOwotICAgICAgICBwcmludEh5cGVyTGluayhyZWxhdGl2ZVBhdGggKyAiZGVwcmVjYXRlZC1saXN0Lmh0bWwiLCAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbi5nZXRUZXh0KCJkb2NsZXQubmF2RGVwcmVjYXRlZCIpLCB0cnVlLCAiTmF2QmFyRm9udDEiKTsKLSAgICAgICAgbmF2Q2VsbEVuZCgpOwotICAgIH0KLQotICAgIC8qKgogICAgICAqIEdldCAiRGVwcmVjYXRlZCIgQVBJIGxpbmsgaW4gdGhlIG5hdmlnYXRpb24gYmFyLgogICAgICAqCiAgICAgICogQHJldHVybiBhIGNvbnRlbnQgdHJlZSBmb3IgdGhlIGxpbmsKQEAgLTExNDYsMTcgKzcwNCw2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUHJpbnQgbGluayBmb3IgZ2VuZXJhdGVkIGluZGV4LiBJZiB0aGUgdXNlciBoYXMgdXNlZCAiLXNwbGl0aW5kZXgiCi0gICAgICogY29tbWFuZCBsaW5lIG9wdGlvbiwgdGhlbiBsaW5rIHRvIGZpbGUgImluZGV4LWZpbGVzL2luZGV4LTEuaHRtbCIgaXMKLSAgICAgKiBnZW5lcmF0ZWQgb3RoZXJ3aXNlIGxpbmsgdG8gZmlsZSAiaW5kZXgtYWxsLmh0bWwiIGlzIGdlbmVyYXRlZC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBuYXZMaW5rQ2xhc3NJbmRleCgpIHsKLSAgICAgICAgcHJpbnROb0ZyYW1lc1RhcmdldEh5cGVyTGluayhyZWxhdGl2ZVBhdGggKwotICAgICAgICAgICAgICAgIEFsbENsYXNzZXNGcmFtZVdyaXRlci5PVVRQVVRfRklMRV9OQU1FX05PRlJBTUVTLAotICAgICAgICAgICAgIiIsICIiLCBjb25maWd1cmF0aW9uLmdldFRleHQoImRvY2xldC5BbGxfQ2xhc3NlcyIpLCB0cnVlKTsKLSAgICB9Ci0KLSAgICAvKioKICAgICAgKiBHZXQgbGluayBmb3IgZ2VuZXJhdGVkIGluZGV4LiBJZiB0aGUgdXNlciBoYXMgdXNlZCAiLXNwbGl0aW5kZXgiCiAgICAgICogY29tbWFuZCBsaW5lIG9wdGlvbiwgdGhlbiBsaW5rIHRvIGZpbGUgImluZGV4LWZpbGVzL2luZGV4LTEuaHRtbCIgaXMKICAgICAgKiBnZW5lcmF0ZWQgb3RoZXJ3aXNlIGxpbmsgdG8gZmlsZSAiaW5kZXgtYWxsLmh0bWwiIGlzIGdlbmVyYXRlZC4KQEAgLTExNzAsMjAgKzcxNyw2IEBACiAgICAgICAgIENvbnRlbnQgbGkgPSBIdG1sVHJlZS5MSShhbGxDbGFzc2VzQ29udGVudCk7CiAgICAgICAgIHJldHVybiBsaTsKICAgICB9Ci0gICAgLyoqCi0gICAgICogUHJpbnQgbGluayBmb3IgZ2VuZXJhdGVkIGNsYXNzIGluZGV4LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIG5hdkxpbmtJbmRleCgpIHsKLSAgICAgICAgbmF2Q2VsbFN0YXJ0KCk7Ci0gICAgICAgIHByaW50SHlwZXJMaW5rKHJlbGF0aXZlUGF0aCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uZmlndXJhdGlvbi5zcGxpdGluZGV4PwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXJlY3RvcnlNYW5hZ2VyLmdldFBhdGgoImluZGV4LWZpbGVzIikgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlc2VwYXJhdG9yOiAiIikgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbmZpZ3VyYXRpb24uc3BsaXRpbmRleD8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluZGV4LTEuaHRtbCIgOiAiaW5kZXgtYWxsLmh0bWwiKSwgIiIsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24uZ2V0VGV4dCgiZG9jbGV0LkluZGV4IiksIHRydWUsICJOYXZCYXJGb250MSIpOwotICAgICAgICBuYXZDZWxsRW5kKCk7Ci0gICAgfQogCiAgICAgLyoqCiAgICAgICogR2V0IGxpbmsgZm9yIGdlbmVyYXRlZCBjbGFzcyBpbmRleC4KQEAgLTEyMDAsMjcgKzczMyw2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUHJpbnQgaGVscCBmaWxlIGxpbmsuIElmIHVzZXIgaGFzIHByb3ZpZGVkIGEgaGVscCBmaWxlLCB0aGVuIGdlbmVyYXRlIGEKLSAgICAgKiBsaW5rIHRvIHRoZSB1c2VyIGdpdmVuIGZpbGUsIHdoaWNoIGlzIGFscmVhZHkgY29waWVkIHRvIGN1cnJlbnQgb3IKLSAgICAgKiBkZXN0aW5hdGlvbiBkaXJlY3RvcnkuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgbmF2TGlua0hlbHAoKSB7Ci0gICAgICAgIFN0cmluZyBoZWxwZmlsZW5tID0gY29uZmlndXJhdGlvbi5oZWxwZmlsZTsKLSAgICAgICAgaWYgKGhlbHBmaWxlbm0uZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgaGVscGZpbGVubSA9ICJoZWxwLWRvYy5odG1sIjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGludCBsYXN0c2VwOwotICAgICAgICAgICAgaWYgKChsYXN0c2VwID0gaGVscGZpbGVubS5sYXN0SW5kZXhPZihGaWxlLnNlcGFyYXRvckNoYXIpKSAhPSAtMSkgewotICAgICAgICAgICAgICAgIGhlbHBmaWxlbm0gPSBoZWxwZmlsZW5tLnN1YnN0cmluZyhsYXN0c2VwICsgMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbmF2Q2VsbFN0YXJ0KCk7Ci0gICAgICAgIHByaW50SHlwZXJMaW5rKHJlbGF0aXZlUGF0aCArIGhlbHBmaWxlbm0sICIiLAotICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uLmdldFRleHQoImRvY2xldC5IZWxwIiksIHRydWUsICJOYXZCYXJGb250MSIpOwotICAgICAgICBuYXZDZWxsRW5kKCk7Ci0gICAgfQotCi0gICAgLyoqCiAgICAgICogR2V0IGhlbHAgZmlsZSBsaW5rLiBJZiB1c2VyIGhhcyBwcm92aWRlZCBhIGhlbHAgZmlsZSwgdGhlbiBnZW5lcmF0ZSBhCiAgICAgICogbGluayB0byB0aGUgdXNlciBnaXZlbiBmaWxlLCB3aGljaCBpcyBhbHJlYWR5IGNvcGllZCB0byBjdXJyZW50IG9yCiAgICAgICogZGVzdGluYXRpb24gZGlyZWN0b3J5LgpAQCAtMTI0NCw4NyArNzU2LDYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQcmludCB0aGUgd29yZCAiRGV0YWlsIiBpbiB0aGUgbmF2aWdhdGlvbiBiYXIuIE5vIGxpbmsgaXMgYXZhaWxhYmxlLgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIG5hdkRldGFpbCgpIHsKLSAgICAgICAgcHJpbnRUZXh0KCJkb2NsZXQuRGV0YWlsIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnQgdGhlIHdvcmQgIlN1bW1hcnkiIGluIHRoZSBuYXZpZ2F0aW9uIGJhci4gTm8gbGluayBpcyBhdmFpbGFibGUuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgbmF2U3VtbWFyeSgpIHsKLSAgICAgICAgcHJpbnRUZXh0KCJkb2NsZXQuU3VtbWFyeSIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50IHRoZSBIdG1sIHRhYmxlIHRhZyBmb3IgdGhlIGluZGV4IHN1bW1hcnkgdGFibGVzLiBUaGUgdGFibGUgdGFnCi0gICAgICogcHJpbnRlZCBpcwotICAgICAqIHtAY29kZSA8VEFCTEUgQk9SREVSPSIxIiBDRUxMUEFERElORz0iMyIgQ0VMTFNQQUNJTkc9IjAiIFdJRFRIPSIxMDAlIj4gfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRhYmxlSW5kZXhTdW1tYXJ5KCkgewotICAgICAgICB0YWJsZSgxLCAiMTAwJSIsIDMsIDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50IHRoZSBIdG1sIHRhYmxlIHRhZyBmb3IgdGhlIGluZGV4IHN1bW1hcnkgdGFibGVzLgotICAgICAqCi0gICAgICogQHBhcmFtIHN1bW1hcnkgdGhlIHN1bW1hcnkgZm9yIHRoZSB0YWJsZSB0YWcgc3VtbWFyeSBhdHRyaWJ1dGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGFibGVJbmRleFN1bW1hcnkoU3RyaW5nIHN1bW1hcnkpIHsKLSAgICAgICAgdGFibGUoMSwgIjEwMCUiLCAzLCAwLCBzdW1tYXJ5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTYW1lIGFzIHtAbGluayAjdGFibGVJbmRleFN1bW1hcnkoKX0uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGFibGVJbmRleERldGFpbCgpIHsKLSAgICAgICAgdGFibGUoMSwgIjEwMCUiLCAzLCAwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludCBIdG1sIHRhZyBmb3IgdGFibGUgZWxlbWVudHMuIFRoZSB0YWcgcHJpbnRlZCBpcwotICAgICAqICZsdDtURCBBTElHTj0icmlnaHQiIFZBTElHTj0idG9wIiBXSURUSD0iMSUiJmd0Oy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZEluZGV4KCkgewotICAgICAgICBwcmludCgiPFREIEFMSUdOPVwicmlnaHRcIiBWQUxJR049XCJ0b3BcIiBXSURUSD1cIjElXCI+Iik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnQgdGFibGUgY2FwdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0YWJsZUNhcHRpb25TdGFydCgpIHsKLSAgICAgICAgY2FwdGlvblN0eWxlKCJUYWJsZUNhcHRpb24iKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludCB0YWJsZSBzdWItY2FwdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0YWJsZVN1YkNhcHRpb25TdGFydCgpIHsKLSAgICAgICAgY2FwdGlvblN0eWxlKCJUYWJsZVN1YkNhcHRpb24iKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludCB0YWJsZSBjYXB0aW9uIGVuZCB0YWdzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRhYmxlQ2FwdGlvbkVuZCgpIHsKLSAgICAgICAgY2FwdGlvbkVuZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50IHN1bW1hcnkgdGFibGUgaGVhZGVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN1bW1hcnlUYWJsZUhlYWRlcihTdHJpbmdbXSBoZWFkZXIsIFN0cmluZyBzY29wZSkgewotICAgICAgICB0cigpOwotICAgICAgICBmb3IgKCBpbnQgaT0wOyBpIDwgaGVhZGVyLmxlbmd0aDsgaSsrICkgewotICAgICAgICAgICAgdGhTY29wZU5vV3JhcCgiVGFibGVIZWFkZXIiLCBzY29wZSk7Ci0gICAgICAgICAgICBwcmludChoZWFkZXJbaV0pOwotICAgICAgICAgICAgdGhFbmQoKTsKLSAgICAgICAgfQotICAgICAgICB0ckVuZCgpOwotICAgIH0KLQotICAgIC8qKgogICAgICAqIEdldCBzdW1tYXJ5IHRhYmxlIGhlYWRlci4KICAgICAgKgogICAgICAqIEBwYXJhbSBoZWFkZXIgdGhlIGhlYWRlciBmb3IgdGhlIHRhYmxlCkBAIC0xNDA3LDcgKzgzOCw3IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyBhIHBhY2thZ2UgbmFtZSBsYWJlbC4KICAgICAgKgotICAgICAqIEBwYXJhbSBwYXJzZWROYW1lIHRoZSBwYWNrYWdlIG5hbWUKKyAgICAgKiBAcGFyYW0gcGFja2FnZU5hbWUgdGhlIHBhY2thZ2UgbmFtZQogICAgICAqIEByZXR1cm4gdGhlIHBhY2thZ2UgbmFtZSBjb250ZW50CiAgICAgICovCiAgICAgcHVibGljIENvbnRlbnQgZ2V0UGFja2FnZUxhYmVsKFN0cmluZyBwYWNrYWdlTmFtZSkgewpAQCAtMTQ1MywxNDQgKzg4NCw2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUHJpbmUgdGFibGUgaGVhZGVyIGluZm9ybWF0aW9uIGFib3V0IGNvbG9yLCBjb2x1bW4gc3BhbiBhbmQgdGhlIGZvbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29sb3IgQmFja2dyb3VuZCBjb2xvci4KLSAgICAgKiBAcGFyYW0gc3BhbiAgQ29sdW1uIHNwYW4uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGFibGVIZWFkZXJTdGFydChTdHJpbmcgY29sb3IsIGludCBzcGFuKSB7Ci0gICAgICAgIHRyQmdjb2xvclN0eWxlKGNvbG9yLCAiVGFibGVIZWFkaW5nQ29sb3IiKTsKLSAgICAgICAgdGhBbGlnbkNvbHNwYW4oImxlZnQiLCBzcGFuKTsKLSAgICAgICAgZm9udCgiKzIiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludCB0YWJsZSBoZWFkZXIgZm9yIHRoZSBpbmhlcml0ZWQgbWVtYmVycyBzdW1tYXJ5IHRhYmxlcy4gUHJpbnQgdGhlCi0gICAgICogYmFja2dyb3VuZCBjb2xvciBpbmZvcm1hdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb2xvciBCYWNrZ3JvdW5kIGNvbG9yLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRhYmxlSW5oZXJpdGVkSGVhZGVyU3RhcnQoU3RyaW5nIGNvbG9yKSB7Ci0gICAgICAgIHRyQmdjb2xvclN0eWxlKGNvbG9yLCAiVGFibGVTdWJIZWFkaW5nQ29sb3IiKTsKLSAgICAgICAgdGhBbGlnbigibGVmdCIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50ICJVc2UiIHRhYmxlIGhlYWRlci4gUHJpbnQgdGhlIGJhY2tncm91bmQgY29sb3IgYW5kIHRoZSBjb2x1bW4gc3Bhbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb2xvciBCYWNrZ3JvdW5kIGNvbG9yLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRhYmxlVXNlSW5mb0hlYWRlclN0YXJ0KFN0cmluZyBjb2xvcikgewotICAgICAgICB0ckJnY29sb3JTdHlsZShjb2xvciwgIlRhYmxlU3ViSGVhZGluZ0NvbG9yIik7Ci0gICAgICAgIHRoQWxpZ25Db2xzcGFuKCJsZWZ0IiwgMik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnQgdGFibGUgaGVhZGVyIHdpdGggdGhlIGJhY2tncm91bmQgY29sb3Igd2l0aCBkZWZhdWx0IGNvbHVtbiBzcGFuIDIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29sb3IgQmFja2dyb3VuZCBjb2xvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0YWJsZUhlYWRlclN0YXJ0KFN0cmluZyBjb2xvcikgewotICAgICAgICB0YWJsZUhlYWRlclN0YXJ0KGNvbG9yLCAyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludCB0YWJsZSBoZWFkZXIgd2l0aCB0aGUgY29sdW1uIHNwYW4sIHdpdGggdGhlIGRlZmF1bHQgY29sb3IgI0NDQ0NGRi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzcGFuIENvbHVtbiBzcGFuLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRhYmxlSGVhZGVyU3RhcnQoaW50IHNwYW4pIHsKLSAgICAgICAgdGFibGVIZWFkZXJTdGFydCgiI0NDQ0NGRiIsIHNwYW4pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50IHRhYmxlIGhlYWRlciB3aXRoIGRlZmF1bHQgY29sdW1uIHNwYW4gMiBhbmQgZGVmYXVsdCBjb2xvciAjQ0NDQ0ZGLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRhYmxlSGVhZGVyU3RhcnQoKSB7Ci0gICAgICAgIHRhYmxlSGVhZGVyU3RhcnQoMik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnQgdGFibGUgaGVhZGVyIGVuZCB0YWdzIGZvciBmb250LCBjb2x1bW4gYW5kIHJvdy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0YWJsZUhlYWRlckVuZCgpIHsKLSAgICAgICAgZm9udEVuZCgpOwotICAgICAgICB0aEVuZCgpOwotICAgICAgICB0ckVuZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50IHRhYmxlIGhlYWRlciBlbmQgdGFncyBpbiBpbmhlcml0ZWQgdGFibGVzIGZvciBjb2x1bW4gYW5kIHJvdy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0YWJsZUluaGVyaXRlZEhlYWRlckVuZCgpIHsKLSAgICAgICAgdGhFbmQoKTsKLSAgICAgICAgdHJFbmQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludCB0aGUgc3VtbWFyeSB0YWJsZSByb3cgY2VsbCBhdHRyaWJ1dGUgd2lkdGguCi0gICAgICoKLSAgICAgKiBAcGFyYW0gd2lkdGggV2lkdGggb2YgdGhlIHRhYmxlIGNlbGwuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3VtbWFyeVJvdyhpbnQgd2lkdGgpIHsKLSAgICAgICAgaWYgKHdpZHRoICE9IDApIHsKLSAgICAgICAgICAgIHRkV2lkdGgod2lkdGggKyAiJSIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50IHRoZSBzdW1tYXJ5IHRhYmxlIHJvdyBjZWxsIGVuZCB0YWcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3VtbWFyeVJvd0VuZCgpIHsKLSAgICAgICAgdGRFbmQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludCB0aGUgaGVhZGluZyBpbiBIdG1sIHtAbGl0ZXJhbCA8SDI+fSBmb3JtYXQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RyIFRoZSBIZWFkZXIgc3RyaW5nLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHByaW50SW5kZXhIZWFkaW5nKFN0cmluZyBzdHIpIHsKLSAgICAgICAgaDIoKTsKLSAgICAgICAgcHJpbnQoc3RyKTsKLSAgICAgICAgaDJFbmQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludCBIdG1sIHRhZyAmbHQ7RlJBTUVTRVQ9YXJnJmd0Oy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhcmcgQXJndW1lbnQgZm9yIHRoZSB0YWcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZnJhbWVTZXQoU3RyaW5nIGFyZykgewotICAgICAgICBwcmludGxuKCI8RlJBTUVTRVQgIiArIGFyZyArICI+Iik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnQgSHRtbCBjbG9zaW5nIHRhZyAmbHQ7L0ZSQU1FU0VUJmd0Oy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBmcmFtZVNldEVuZCgpIHsKLSAgICAgICAgcHJpbnRsbigiPC9GUkFNRVNFVD4iKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludCBIdG1sIHRhZyAmbHQ7RlJBTUU9YXJnJmd0Oy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhcmcgQXJndW1lbnQgZm9yIHRoZSB0YWcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZnJhbWUoU3RyaW5nIGFyZykgewotICAgICAgICBwcmludGxuKCI8RlJBTUUgIiArIGFyZyArICI+Iik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnQgSHRtbCBjbG9zaW5nIHRhZyAmbHQ7L0ZSQU1FJmd0Oy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBmcmFtZUVuZCgpIHsKLSAgICAgICAgcHJpbnRsbigiPC9GUkFNRT4iKTsKLSAgICB9Ci0KLSAgICAvKioKICAgICAgKiBSZXR1cm4gcGF0aCB0byB0aGUgY2xhc3MgcGFnZSBmb3IgYSBjbGFzc2RvYy4gRm9yIGV4YW1wbGUsIHRoZSBjbGFzcwogICAgICAqIG5hbWUgaXMgImphdmEubGFuZy5PYmplY3QiIGFuZCBpZiB0aGUgY3VycmVudCBmaWxlIGdldHRpbmcgZ2VuZXJhdGVkIGlzCiAgICAgICogImphdmEvaW8vRmlsZS5odG1sIiwgdGhlbiB0aGUgcGF0aCBzdHJpbmcgdG8gdGhlIGNsYXNzLCByZXR1cm5lZCBpcwpAQCAtMTYyMywzNiArOTE2LDEyIEBACiAgICAgICogQHBhcmFtIG5hbWUgRmlsZSBuYW1lLCB0byB3aGljaCBwYXRoIHN0cmluZyBpcy4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgU3RyaW5nIHBhdGhTdHJpbmcoUGFja2FnZURvYyBwZCwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIocmVsYXRpdmVQYXRoKTsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBidWYgPSBuZXcgU3RyaW5nQnVpbGRlcihyZWxhdGl2ZVBhdGgpOwogICAgICAgICBidWYuYXBwZW5kKERpcmVjdG9yeU1hbmFnZXIuZ2V0UGF0aFRvUGFja2FnZShwZCwgbmFtZSkpOwogICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUHJpbnQgdGhlIGxpbmsgdG8gdGhlIGdpdmVuIHBhY2thZ2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGtnIHRoZSBwYWNrYWdlIHRvIGxpbmsgdG8uCi0gICAgICogQHBhcmFtIGxhYmVsIHRoZSBsYWJlbCBmb3IgdGhlIGxpbmsuCi0gICAgICogQHBhcmFtIGlzU3Ryb25nIHRydWUgaWYgdGhlIGxhYmVsIHNob3VsZCBiZSBzdHJvbmcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHJpbnRQYWNrYWdlTGluayhQYWNrYWdlRG9jIHBrZywgU3RyaW5nIGxhYmVsLCBib29sZWFuIGlzU3Ryb25nKSB7Ci0gICAgICAgIHByaW50KGdldFBhY2thZ2VMaW5rU3RyaW5nKHBrZywgbGFiZWwsIGlzU3Ryb25nKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnQgdGhlIGxpbmsgdG8gdGhlIGdpdmVuIHBhY2thZ2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGtnIHRoZSBwYWNrYWdlIHRvIGxpbmsgdG8uCi0gICAgICogQHBhcmFtIGxhYmVsIHRoZSBsYWJlbCBmb3IgdGhlIGxpbmsuCi0gICAgICogQHBhcmFtIGlzU3Ryb25nIHRydWUgaWYgdGhlIGxhYmVsIHNob3VsZCBiZSBzdHJvbmcuCi0gICAgICogQHBhcmFtIHN0eWxlICB0aGUgZm9udCBvZiB0aGUgcGFja2FnZSBsaW5rIGxhYmVsLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHByaW50UGFja2FnZUxpbmsoUGFja2FnZURvYyBwa2csIFN0cmluZyBsYWJlbCwgYm9vbGVhbiBpc1N0cm9uZywKLSAgICAgICAgICAgIFN0cmluZyBzdHlsZSkgewotICAgICAgICBwcmludChnZXRQYWNrYWdlTGlua1N0cmluZyhwa2csIGxhYmVsLCBpc1N0cm9uZywgc3R5bGUpKTsKLSAgICB9Ci0KLSAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIGxpbmsgdG8gdGhlIGdpdmVuIHBhY2thZ2UuCiAgICAgICoKICAgICAgKiBAcGFyYW0gcGtnIHRoZSBwYWNrYWdlIHRvIGxpbmsgdG8uCkBAIC0xNzM1LDIxICsxMDA0LDYgQEAKICAgICAgICAgcmV0dXJuIChjZC5pc0ludGVyZmFjZSgpKT8gIGl0YWxpY3NUZXh0KG5hbWUpOiBuYW1lOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHByaW50U3JjTGluayhQcm9ncmFtRWxlbWVudERvYyBkLCBTdHJpbmcgbGFiZWwpIHsKLSAgICAgICAgaWYgKGQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIENsYXNzRG9jIGNkID0gZC5jb250YWluaW5nQ2xhc3MoKTsKLSAgICAgICAgaWYgKGNkID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vZCBtdXN0IGJlIGEgY2xhc3MgZG9jIHNpbmNlIGluIGhhcyBubyBjb250YWluaW5nIGNsYXNzLgotICAgICAgICAgICAgY2QgPSAoQ2xhc3NEb2MpIGQ7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIGhyZWYgPSByZWxhdGl2ZVBhdGggKyBEb2NsZXRDb25zdGFudHMuU09VUkNFX09VVFBVVF9ESVJfTkFNRQotICAgICAgICAgICAgKyBEaXJlY3RvcnlNYW5hZ2VyLmdldERpcmVjdG9yeVBhdGgoY2QuY29udGFpbmluZ1BhY2thZ2UoKSkKLSAgICAgICAgICAgICsgY2QubmFtZSgpICsgIi5odG1sIyIgKyBTb3VyY2VUb0hUTUxDb252ZXJ0ZXIuZ2V0QW5jaG9yTmFtZShkKTsKLSAgICAgICAgcHJpbnRIeXBlckxpbmsoaHJlZiwgIiIsIGxhYmVsLCB0cnVlKTsKLSAgICB9Ci0KICAgICAvKioKICAgICAgKiBBZGQgdGhlIGxpbmsgdG8gdGhlIGNvbnRlbnQgdHJlZS4KICAgICAgKgpAQCAtMTc5OSwxMyArMTA1Myw2IEBACiAgICAgICAgICAgICBmYWN0b3J5LmdldFR5cGVQYXJhbWV0ZXJMaW5rcyhsaW5rSW5mbywgZmFsc2UpKS50b1N0cmluZygpOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIFByaW50IHRoZSBsaW5rIHRvIHRoZSBnaXZlbiBjbGFzcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwcmludExpbmsoTGlua0luZm9JbXBsIGxpbmtJbmZvKSB7Ci0gICAgICAgIHByaW50KGdldExpbmsobGlua0luZm8pKTsKLSAgICB9Ci0KICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAqIFJldHVybiBhIGNsYXNzIGNyb3NzIGxpbmsgdG8gZXh0ZXJuYWwgY2xhc3MgZG9jdW1lbnRhdGlvbi4KICAgICAgKiBUaGUgbmFtZSBtdXN0IGJlIGZ1bGx5IHF1YWxpZmllZCB0byBkZXRlcm1pbmUgd2hpY2ggcGFja2FnZQpAQCAtMTgyOSw3ICsxMDc2LDcgQEAKICAgICAgICAgd2hpbGUoKHBlcmlvZEluZGV4ID0gcGFja2FnZU5hbWUubGFzdEluZGV4T2YoJy4nKSkgIT0gLTEpIHsKICAgICAgICAgICAgIGNsYXNzTmFtZSA9IHBhY2thZ2VOYW1lLnN1YnN0cmluZyhwZXJpb2RJbmRleCArIDEsIHBhY2thZ2VOYW1lLmxlbmd0aCgpKSArCiAgICAgICAgICAgICAgICAgKGNsYXNzTmFtZS5sZW5ndGgoKSA+IDAgPyAiLiIgKyBjbGFzc05hbWUgOiAiIik7Ci0gICAgICAgICAgICBTdHJpbmcgZGVmYXVsdExhYmVsID0gY29kZSA/IGdldENvZGUoKSArIGNsYXNzTmFtZSArIGdldENvZGVFbmQoKSA6IGNsYXNzTmFtZTsKKyAgICAgICAgICAgIFN0cmluZyBkZWZhdWx0TGFiZWwgPSBjb2RlID8gY29kZVRleHQoY2xhc3NOYW1lKSA6IGNsYXNzTmFtZTsKICAgICAgICAgICAgIHBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWUuc3Vic3RyaW5nKDAsIHBlcmlvZEluZGV4KTsKICAgICAgICAgICAgIGlmIChnZXRDcm9zc1BhY2thZ2VMaW5rKHBhY2thZ2VOYW1lKSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgLy9UaGUgcGFja2FnZSBleGlzdHMgaW4gZXh0ZXJuYWwgZG9jdW1lbnRhdGlvbiwgc28gbGluayB0byB0aGUgZXh0ZXJuYWwKQEAgLTE5MzcsMzAgKzExODQsNiBAQAogICAgICAgICBhZGRQcmVRdWFsaWZpZWRDbGFzc0xpbmsoY29udGV4dCwgY2QsIHRydWUsIGNvbnRlbnRUcmVlKTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBwcmludFRleHQoU3RyaW5nIGtleSkgewotICAgICAgICBwcmludChjb25maWd1cmF0aW9uLmdldFRleHQoa2V5KSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJpbnRUZXh0KFN0cmluZyBrZXksIFN0cmluZyBhMSkgewotICAgICAgICBwcmludChjb25maWd1cmF0aW9uLmdldFRleHQoa2V5LCBhMSkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByaW50VGV4dChTdHJpbmcga2V5LCBTdHJpbmcgYTEsIFN0cmluZyBhMikgewotICAgICAgICBwcmludChjb25maWd1cmF0aW9uLmdldFRleHQoa2V5LCBhMSwgYTIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdHJvbmdUZXh0KFN0cmluZyBrZXkpIHsKLSAgICAgICAgc3Ryb25nKGNvbmZpZ3VyYXRpb24uZ2V0VGV4dChrZXkpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdHJvbmdUZXh0KFN0cmluZyBrZXksIFN0cmluZyBhMSkgewotICAgICAgICBzdHJvbmcoY29uZmlndXJhdGlvbi5nZXRUZXh0KGtleSwgYTEpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdHJvbmdUZXh0KFN0cmluZyBrZXksIFN0cmluZyBhMSwgU3RyaW5nIGEyKSB7Ci0gICAgICAgIHN0cm9uZyhjb25maWd1cmF0aW9uLmdldFRleHQoa2V5LCBhMSwgYTIpKTsKLSAgICB9Ci0KICAgICAvKioKICAgICAgKiBHZXQgdGhlIGxpbmsgZm9yIHRoZSBnaXZlbiBtZW1iZXIuCiAgICAgICoKQEAgLTE5NzQsMjIgKzExOTcsNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFByaW50IHRoZSBsaW5rIGZvciB0aGUgZ2l2ZW4gbWVtYmVyLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnRleHQgdGhlIGlkIG9mIHRoZSBjb250ZXh0IHdoZXJlIHRoZSBsaW5rIHdpbGwgYmUgcHJpbnRlZC4KLSAgICAgKiBAcGFyYW0gY2xhc3NEb2MgdGhlIGNsYXNzRG9jIHRoYXQgd2Ugc2hvdWxkIGxpbmsgdG8uICBUaGlzIGlzIG5vdAotICAgICAqICAgICAgICAgICAgICAgICBuZWNlc3NhcmlseSBlcXVhbCB0byBkb2MuY29udGFpbmluZ0NsYXNzKCkuICBXZSBtYXkgYmUKLSAgICAgKiAgICAgICAgICAgICAgICAgaW5oZXJpdGluZyBjb21tZW50cy4KLSAgICAgKiBAcGFyYW0gZG9jIHRoZSBtZW1iZXIgYmVpbmcgbGlua2VkIHRvLgotICAgICAqIEBwYXJhbSBsYWJlbCB0aGUgbGFiZWwgZm9yIHRoZSBsaW5rLgotICAgICAqIEBwYXJhbSBzdHJvbmcgdHJ1ZSBpZiB0aGUgbGluayBzaG91bGQgYmUgc3Ryb25nLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHByaW50RG9jTGluayhpbnQgY29udGV4dCwgQ2xhc3NEb2MgY2xhc3NEb2MsIE1lbWJlckRvYyBkb2MsCi0gICAgICAgICAgICBTdHJpbmcgbGFiZWwsIGJvb2xlYW4gc3Ryb25nKSB7Ci0gICAgICAgIHByaW50KGdldERvY0xpbmsoY29udGV4dCwgY2xhc3NEb2MsIGRvYywgbGFiZWwsIHN0cm9uZykpOwotICAgIH0KLQotICAgIC8qKgogICAgICAqIFJldHVybiB0aGUgbGluayBmb3IgdGhlIGdpdmVuIG1lbWJlci4KICAgICAgKgogICAgICAqIEBwYXJhbSBjb250ZXh0IHRoZSBpZCBvZiB0aGUgY29udGV4dCB3aGVyZSB0aGUgbGluayB3aWxsIGJlIHByaW50ZWQuCkBAIC0yMDYwLDEwICsxMjY3LDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIGFuY2hvcihFeGVjdXRhYmxlTWVtYmVyRG9jIGVtZCkgewotICAgICAgICBhbmNob3IoZ2V0QW5jaG9yKGVtZCkpOwotICAgIH0KLQogICAgIHB1YmxpYyBTdHJpbmcgZ2V0QW5jaG9yKEV4ZWN1dGFibGVNZW1iZXJEb2MgZW1kKSB7CiAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2lnbmF0dXJlID0gbmV3IFN0cmluZ0J1aWxkZXIoZW1kLnNpZ25hdHVyZSgpKTsKICAgICAgICAgU3RyaW5nQnVpbGRlciBzaWduYXR1cmVQYXJzZWQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwpAQCAtMjA4Niw2NiArMTI4OSw2MSBAQAogICAgICAgICBpZiAoISAodGFnTmFtZS5zdGFydHNXaXRoKCJAbGluayIpIHx8IHRhZ05hbWUuZXF1YWxzKCJAc2VlIikpKSB7CiAgICAgICAgICAgICByZXR1cm4gIiI7CiAgICAgICAgIH0KLSAgICAgICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgYm9vbGVhbiBpc3BsYWludGV4dCA9IHRhZ05hbWUudG9Mb3dlckNhc2UoKS5lcXVhbHMoIkBsaW5rcGxhaW4iKTsKLSAgICAgICAgU3RyaW5nIGxhYmVsID0gc2VlLmxhYmVsKCk7Ci0gICAgICAgIGxhYmVsID0gKGxhYmVsLmxlbmd0aCgpID4gMCk/Ci0gICAgICAgICAgICAoKGlzcGxhaW50ZXh0KSA/IGxhYmVsIDoKLSAgICAgICAgICAgICAgICAgZ2V0Q29kZSgpICsgbGFiZWwgKyBnZXRDb2RlRW5kKCkpOiIiOworCiAgICAgICAgIFN0cmluZyBzZWV0ZXh0ID0gcmVwbGFjZURvY1Jvb3REaXIoc2VlLnRleHQoKSk7CiAKICAgICAgICAgLy9DaGVjayBpZiBAc2VlIGlzIGFuIGhyZWYgb3IgInN0cmluZyIKICAgICAgICAgaWYgKHNlZXRleHQuc3RhcnRzV2l0aCgiPCIpIHx8IHNlZXRleHQuc3RhcnRzV2l0aCgiXCIiKSkgewotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChzZWV0ZXh0KTsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIHJldHVybiBzZWV0ZXh0OwogICAgICAgICB9CiAKKyAgICAgICAgYm9vbGVhbiBwbGFpbiA9IHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZSgiQGxpbmtwbGFpbiIpOworICAgICAgICBTdHJpbmcgbGFiZWwgPSBwbGFpbk9yQ29kZVRleHQocGxhaW4sIHNlZS5sYWJlbCgpKTsKKwogICAgICAgICAvL1RoZSB0ZXh0IGZyb20gdGhlIEBzZWUgdGFnLiAgV2Ugd2lsbCBvdXRwdXQgdGhpcyB0ZXh0IHdoZW4gYSBsYWJlbCBpcyBub3Qgc3BlY2lmaWVkLgotICAgICAgICBTdHJpbmcgdGV4dCA9IChpc3BsYWludGV4dCkgPyBzZWV0ZXh0IDogZ2V0Q29kZSgpICsgc2VldGV4dCArIGdldENvZGVFbmQoKTsKKyAgICAgICAgU3RyaW5nIHRleHQgPSBwbGFpbk9yQ29kZVRleHQocGxhaW4sIHNlZXRleHQpOwogCiAgICAgICAgIENsYXNzRG9jIHJlZkNsYXNzID0gc2VlLnJlZmVyZW5jZWRDbGFzcygpOwogICAgICAgICBTdHJpbmcgcmVmQ2xhc3NOYW1lID0gc2VlLnJlZmVyZW5jZWRDbGFzc05hbWUoKTsKICAgICAgICAgTWVtYmVyRG9jIHJlZk1lbSA9IHNlZS5yZWZlcmVuY2VkTWVtYmVyKCk7CiAgICAgICAgIFN0cmluZyByZWZNZW1OYW1lID0gc2VlLnJlZmVyZW5jZWRNZW1iZXJOYW1lKCk7CisKICAgICAgICAgaWYgKHJlZkNsYXNzID09IG51bGwpIHsKICAgICAgICAgICAgIC8vQHNlZSBpcyBub3QgcmVmZXJlbmNpbmcgYW4gaW5jbHVkZWQgY2xhc3MKICAgICAgICAgICAgIFBhY2thZ2VEb2MgcmVmUGFja2FnZSA9IHNlZS5yZWZlcmVuY2VkUGFja2FnZSgpOwogICAgICAgICAgICAgaWYgKHJlZlBhY2thZ2UgIT0gbnVsbCAmJiByZWZQYWNrYWdlLmlzSW5jbHVkZWQoKSkgewogICAgICAgICAgICAgICAgIC8vQHNlZSBpcyByZWZlcmVuY2luZyBhbiBpbmNsdWRlZCBwYWNrYWdlCi0gICAgICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gaXNwbGFpbnRleHQgPyByZWZQYWNrYWdlLm5hbWUoKSA6Ci0gICAgICAgICAgICAgICAgICAgIGdldENvZGUoKSArIHJlZlBhY2thZ2UubmFtZSgpICsgZ2V0Q29kZUVuZCgpOwotICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoZ2V0UGFja2FnZUxpbmtTdHJpbmcocmVmUGFja2FnZSwKLSAgICAgICAgICAgICAgICAgICAgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IHBhY2thZ2VOYW1lIDogbGFiZWwsIGZhbHNlKSk7CisgICAgICAgICAgICAgICAgaWYgKGxhYmVsLmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBwbGFpbk9yQ29kZVRleHQocGxhaW4sIHJlZlBhY2thZ2UubmFtZSgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0UGFja2FnZUxpbmtTdHJpbmcocmVmUGFja2FnZSwgbGFiZWwsIGZhbHNlKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgLy9Ac2VlIGlzIG5vdCByZWZlcmVuY2luZyBhbiBpbmNsdWRlZCBjbGFzcyBvciBwYWNrYWdlLiAgQ2hlY2sgZm9yIGNyb3NzIGxpbmtzLgogICAgICAgICAgICAgICAgIFN0cmluZyBjbGFzc0Nyb3NzTGluaywgcGFja2FnZUNyb3NzTGluayA9IGdldENyb3NzUGFja2FnZUxpbmsocmVmQ2xhc3NOYW1lKTsKICAgICAgICAgICAgICAgICBpZiAocGFja2FnZUNyb3NzTGluayAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vUGFja2FnZSBjcm9zcyBsaW5rIGZvdW5kCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoZ2V0SHlwZXJMaW5rU3RyaW5nKHBhY2thZ2VDcm9zc0xpbmssICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgKGxhYmVsLmxlbmd0aCgpID09IDApPyB0ZXh0IDogbGFiZWwsIGZhbHNlKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRIeXBlckxpbmtTdHJpbmcocGFja2FnZUNyb3NzTGluaywgIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAobGFiZWwuaXNFbXB0eSgpID8gdGV4dCA6IGxhYmVsKSwgZmFsc2UpOwogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGNsYXNzQ3Jvc3NMaW5rID0gZ2V0Q3Jvc3NDbGFzc0xpbmsocmVmQ2xhc3NOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgcmVmTWVtTmFtZSwgbGFiZWwsIGZhbHNlLCAiIiwgISBpc3BsYWludGV4dCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy9DbGFzcyBjcm9zcyBsaW5rIGZvdW5kIChwb3NzaWJsbHkgdG8gYSBtZW1iZXIgaW4gdGhlIGNsYXNzKQotICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGNsYXNzQ3Jvc3NMaW5rKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlZk1lbU5hbWUsIGxhYmVsLCBmYWxzZSwgIiIsICFwbGFpbikpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgLy9DbGFzcyBjcm9zcyBsaW5rIGZvdW5kIChwb3NzaWJseSB0byBhIG1lbWJlciBpbiB0aGUgY2xhc3MpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjbGFzc0Nyb3NzTGluazsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAvL05vIGNyb3NzIGxpbmsgZm91bmQgc28gcHJpbnQgd2FybmluZwogICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uLmdldERvY2xldFNwZWNpZmljTXNnKCkud2FybmluZyhzZWUucG9zaXRpb24oKSwgImRvY2xldC5zZWUuY2xhc3Nfb3JfcGFja2FnZV9ub3RfZm91bmQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ05hbWUsIHNlZXRleHQpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKChsYWJlbC5sZW5ndGgoKSA9PSAwKT8gdGV4dDogbGFiZWwpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGxhYmVsLmlzRW1wdHkoKSA/IHRleHQ6IGxhYmVsKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAocmVmTWVtTmFtZSA9PSBudWxsKSB7CiAgICAgICAgICAgICAvLyBNdXN0IGJlIGEgY2xhc3MgcmVmZXJlbmNlIHNpbmNlIHJlZkNsYXNzIGlzIG5vdCBudWxsIGFuZCByZWZNZW1OYW1lIGlzIG51bGwuCi0gICAgICAgICAgICBpZiAobGFiZWwubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIGxhYmVsID0gKGlzcGxhaW50ZXh0KSA/IHJlZkNsYXNzLm5hbWUoKSA6IGdldENvZGUoKSArIHJlZkNsYXNzLm5hbWUoKSArIGdldENvZGVFbmQoKTsKLSAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGdldExpbmsobmV3IExpbmtJbmZvSW1wbChyZWZDbGFzcywgbGFiZWwpKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoZ2V0TGluayhuZXcgTGlua0luZm9JbXBsKHJlZkNsYXNzLCBsYWJlbCkpKTsKKyAgICAgICAgICAgIGlmIChsYWJlbC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBsYWJlbCA9IHBsYWluT3JDb2RlVGV4dChwbGFpbiwgcmVmQ2xhc3MubmFtZSgpKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBnZXRMaW5rKG5ldyBMaW5rSW5mb0ltcGwocmVmQ2xhc3MsIGxhYmVsKSk7CiAgICAgICAgIH0gZWxzZSBpZiAocmVmTWVtID09IG51bGwpIHsKICAgICAgICAgICAgIC8vIE11c3QgYmUgYSBtZW1iZXIgcmVmZXJlbmNlIHNpbmNlIHJlZkNsYXNzIGlzIG5vdCBudWxsIGFuZCByZWZNZW1OYW1lIGlzIG5vdCBudWxsLgogICAgICAgICAgICAgLy8gSG93ZXZlciwgcmVmTWVtIGlzIG51bGwsIHNvIHRoaXMgcmVmZXJlbmNlZCBtZW1iZXIgZG9lcyBub3QgZXhpc3QuCi0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKChsYWJlbC5sZW5ndGgoKSA9PSAwKT8gdGV4dDogbGFiZWwpOworICAgICAgICAgICAgcmV0dXJuIChsYWJlbC5pc0VtcHR5KCkgPyB0ZXh0OiBsYWJlbCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBNdXN0IGJlIGEgbWVtYmVyIHJlZmVyZW5jZSBzaW5jZSByZWZDbGFzcyBpcyBub3QgbnVsbCBhbmQgcmVmTWVtTmFtZSBpcyBub3QgbnVsbC4KICAgICAgICAgICAgIC8vIHJlZk1lbSBpcyBub3QgbnVsbCwgc28gdGhpcyBAc2VlIHRhZyBtdXN0IGJlIHJlZmVyZW5jaW5nIGEgdmFsaWQgbWVtYmVyLgpAQCAtMjE3NywxNyArMTM3NSwxNiBAQAogICAgICAgICAgICAgICAgICAgICByZWZNZW1OYW1lICs9ICgoRXhlY3V0YWJsZU1lbWJlckRvYylyZWZNZW0pLnNpZ25hdHVyZSgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRleHQgPSAoaXNwbGFpbnRleHQpID8KLSAgICAgICAgICAgICAgICByZWZNZW1OYW1lIDogZ2V0Q29kZSgpICsgVXRpbC5lc2NhcGVIdG1sQ2hhcnMocmVmTWVtTmFtZSkgKyBnZXRDb2RlRW5kKCk7CiAKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoZ2V0RG9jTGluayhMaW5rSW5mb0ltcGwuQ09OVEVYVF9TRUVfVEFHLCBjb250YWluaW5nLAotICAgICAgICAgICAgICAgIHJlZk1lbSwgKGxhYmVsLmxlbmd0aCgpID09IDApPyB0ZXh0OiBsYWJlbCwgZmFsc2UpKTsKKyAgICAgICAgICAgIHRleHQgPSBwbGFpbk9yQ29kZVRleHQocGxhaW4sIFV0aWwuZXNjYXBlSHRtbENoYXJzKHJlZk1lbU5hbWUpKTsKKworICAgICAgICAgICAgcmV0dXJuIGdldERvY0xpbmsoTGlua0luZm9JbXBsLkNPTlRFWFRfU0VFX1RBRywgY29udGFpbmluZywKKyAgICAgICAgICAgICAgICByZWZNZW0sIChsYWJlbC5pc0VtcHR5KCkgPyB0ZXh0OiBsYWJlbCksIGZhbHNlKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgcHJpbnRJbmxpbmVDb21tZW50KERvYyBkb2MsIFRhZyB0YWcpIHsKLSAgICAgICAgcHJpbnRDb21tZW50VGFncyhkb2MsIHRhZy5pbmxpbmVUYWdzKCksIGZhbHNlLCBmYWxzZSk7CisgICAgcHJpdmF0ZSBTdHJpbmcgcGxhaW5PckNvZGVUZXh0KGJvb2xlYW4gcGxhaW4sIFN0cmluZyB0ZXh0KSB7CisgICAgICAgIHJldHVybiAocGxhaW4gfHwgdGV4dC5pc0VtcHR5KCkpID8gdGV4dCA6IGNvZGVUZXh0KHRleHQpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjIwMSwxMCArMTM5OCw2IEBACiAgICAgICAgIGFkZENvbW1lbnRUYWdzKGRvYywgdGFnLmlubGluZVRhZ3MoKSwgZmFsc2UsIGZhbHNlLCBodG1sdHJlZSk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgcHJpbnRJbmxpbmVEZXByZWNhdGVkQ29tbWVudChEb2MgZG9jLCBUYWcgdGFnKSB7Ci0gICAgICAgIHByaW50Q29tbWVudFRhZ3MoZG9jLCB0YWcuaW5saW5lVGFncygpLCB0cnVlLCBmYWxzZSk7Ci0gICAgfQotCiAgICAgLyoqCiAgICAgICogQWRkIHRoZSBpbmxpbmUgZGVwcmVjYXRlZCBjb21tZW50LgogICAgICAqCkBAIC0yMjE2LDEwICsxNDA5LDYgQEAKICAgICAgICAgYWRkQ29tbWVudFRhZ3MoZG9jLCB0YWcuaW5saW5lVGFncygpLCB0cnVlLCBmYWxzZSwgaHRtbHRyZWUpOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHByaW50U3VtbWFyeUNvbW1lbnQoRG9jIGRvYykgewotICAgICAgICBwcmludFN1bW1hcnlDb21tZW50KGRvYywgZG9jLmZpcnN0U2VudGVuY2VUYWdzKCkpOwotICAgIH0KLQogICAgIC8qKgogICAgICAqIEFkZHMgdGhlIHN1bW1hcnkgY29udGVudC4KICAgICAgKgpAQCAtMjIzMCwxMCArMTQxOSw2IEBACiAgICAgICAgIGFkZFN1bW1hcnlDb21tZW50KGRvYywgZG9jLmZpcnN0U2VudGVuY2VUYWdzKCksIGh0bWx0cmVlKTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBwcmludFN1bW1hcnlDb21tZW50KERvYyBkb2MsIFRhZ1tdIGZpcnN0U2VudGVuY2VUYWdzKSB7Ci0gICAgICAgIHByaW50Q29tbWVudFRhZ3MoZG9jLCBmaXJzdFNlbnRlbmNlVGFncywgZmFsc2UsIHRydWUpOwotICAgIH0KLQogICAgIC8qKgogICAgICAqIEFkZHMgdGhlIHN1bW1hcnkgY29udGVudC4KICAgICAgKgpAQCAtMjI0NSwyMyArMTQzMCwxMCBAQAogICAgICAgICBhZGRDb21tZW50VGFncyhkb2MsIGZpcnN0U2VudGVuY2VUYWdzLCBmYWxzZSwgdHJ1ZSwgaHRtbHRyZWUpOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHByaW50U3VtbWFyeURlcHJlY2F0ZWRDb21tZW50KERvYyBkb2MpIHsKLSAgICAgICAgcHJpbnRDb21tZW50VGFncyhkb2MsIGRvYy5maXJzdFNlbnRlbmNlVGFncygpLCB0cnVlLCB0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcmludFN1bW1hcnlEZXByZWNhdGVkQ29tbWVudChEb2MgZG9jLCBUYWcgdGFnKSB7Ci0gICAgICAgIHByaW50Q29tbWVudFRhZ3MoZG9jLCB0YWcuZmlyc3RTZW50ZW5jZVRhZ3MoKSwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgfQotCiAgICAgcHVibGljIHZvaWQgYWRkU3VtbWFyeURlcHJlY2F0ZWRDb21tZW50KERvYyBkb2MsIFRhZyB0YWcsIENvbnRlbnQgaHRtbHRyZWUpIHsKICAgICAgICAgYWRkQ29tbWVudFRhZ3MoZG9jLCB0YWcuZmlyc3RTZW50ZW5jZVRhZ3MoKSwgdHJ1ZSwgdHJ1ZSwgaHRtbHRyZWUpOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHByaW50SW5saW5lQ29tbWVudChEb2MgZG9jKSB7Ci0gICAgICAgIHByaW50Q29tbWVudFRhZ3MoZG9jLCBkb2MuaW5saW5lVGFncygpLCBmYWxzZSwgZmFsc2UpOwotICAgICAgICBwKCk7Ci0gICAgfQotCiAgICAgLyoqCiAgICAgICogQWRkcyB0aGUgaW5saW5lIGNvbW1lbnQuCiAgICAgICoKQEAgLTIyNzIsMjcgKzE0NDQsNiBAQAogICAgICAgICBhZGRDb21tZW50VGFncyhkb2MsIGRvYy5pbmxpbmVUYWdzKCksIGZhbHNlLCBmYWxzZSwgaHRtbHRyZWUpOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHByaW50SW5saW5lRGVwcmVjYXRlZENvbW1lbnQoRG9jIGRvYykgewotICAgICAgICBwcmludENvbW1lbnRUYWdzKGRvYywgZG9jLmlubGluZVRhZ3MoKSwgdHJ1ZSwgZmFsc2UpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwcmludENvbW1lbnRUYWdzKERvYyBkb2MsIFRhZ1tdIHRhZ3MsIGJvb2xlYW4gZGVwciwgYm9vbGVhbiBmaXJzdCkgewotICAgICAgICBpZihjb25maWd1cmF0aW9uLm5vY29tbWVudCl7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGRlcHIpIHsKLSAgICAgICAgICAgIGl0YWxpYygpOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZyByZXN1bHQgPSBjb21tZW50VGFnc1RvU3RyaW5nKG51bGwsIGRvYywgdGFncywgZmlyc3QpOwotICAgICAgICBwcmludChyZXN1bHQpOwotICAgICAgICBpZiAoZGVwcikgewotICAgICAgICAgICAgaXRhbGljRW5kKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRhZ3MubGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgIHNwYWNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICAvKioKICAgICAgKiBBZGRzIHRoZSBjb21tZW50IHRhZ3MuCiAgICAgICoKQEAgLTIzODUsNyArMTUzNiw3IEBACiAgICAgICAgICAgICAgICAgICAgIHRleHQgPSByZW1vdmVOb25JbmxpbmVIdG1sVGFncyh0ZXh0KTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgU3RyaW5nVG9rZW5pemVyIGxpbmVzID0gbmV3IFN0cmluZ1Rva2VuaXplcih0ZXh0LCAiXHJcbiIsIHRydWUpOwotICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciB0ZXh0QnVmZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHRleHRCdWZmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKICAgICAgICAgICAgICAgICB3aGlsZSAobGluZXMuaGFzTW9yZVRva2VucygpKSB7CiAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgbGluZSA9IG5ldyBTdHJpbmdCdWlsZGVyKGxpbmVzLm5leHRUb2tlbigpKTsKICAgICAgICAgICAgICAgICAgICAgVXRpbC5yZXBsYWNlVGFicyhjb25maWd1cmF0aW9uLnNvdXJjZXRhYiwgbGluZSk7CkBAIC0yNDU0LDcgKzE2MDUsNyBAQAogICAgICAgICAvL1JlZGlyZWN0IGFsbCByZWxhdGl2ZSBsaW5rcy4KICAgICAgICAgaW50IGVuZCwgYmVnaW4gPSB0ZXh0LnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiPGEiKTsKICAgICAgICAgaWYoYmVnaW4gPj0gMCl7Ci0gICAgICAgICAgICBTdHJpbmdCdWZmZXIgdGV4dEJ1ZmYgPSBuZXcgU3RyaW5nQnVmZmVyKHRleHQpOworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciB0ZXh0QnVmZiA9IG5ldyBTdHJpbmdCdWlsZGVyKHRleHQpOwogCiAgICAgICAgICAgICB3aGlsZShiZWdpbiA+PTApewogICAgICAgICAgICAgICAgIGlmICh0ZXh0QnVmZi5sZW5ndGgoKSA+IGJlZ2luICsgMiAmJiAhIENoYXJhY3Rlci5pc1doaXRlc3BhY2UodGV4dEJ1ZmYuY2hhckF0KGJlZ2luKzIpKSkgewpAQCAtMjU1NywyMiArMTcwOCw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBwcmludFN0eWxlU2hlZXRQcm9wZXJ0aWVzKCkgewotICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSBjb25maWd1cmF0aW9uLnN0eWxlc2hlZXRmaWxlOwotICAgICAgICBpZiAoZmlsZW5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICBGaWxlIHN0eWxlZmlsZSA9IG5ldyBGaWxlKGZpbGVuYW1lKTsKLSAgICAgICAgICAgIFN0cmluZyBwYXJlbnQgPSBzdHlsZWZpbGUuZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgICBmaWxlbmFtZSA9IChwYXJlbnQgPT0gbnVsbCk/Ci0gICAgICAgICAgICAgICAgZmlsZW5hbWU6Ci0gICAgICAgICAgICAgICAgZmlsZW5hbWUuc3Vic3RyaW5nKHBhcmVudC5sZW5ndGgoKSArIDEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZmlsZW5hbWUgPSAic3R5bGVzaGVldC5jc3MiOwotICAgICAgICB9Ci0gICAgICAgIGZpbGVuYW1lID0gcmVsYXRpdmVQYXRoICsgZmlsZW5hbWU7Ci0gICAgICAgIGxpbmsoIlJFTCA9XCJzdHlsZXNoZWV0XCIgVFlQRT1cInRleHQvY3NzXCIgSFJFRj1cIiIgKwotICAgICAgICAgICAgICAgICBmaWxlbmFtZSArICJcIiAiICsgIlRJVExFPVwiU3R5bGVcIiIpOwotICAgIH0KLQogICAgIC8qKgogICAgICAqIFJldHVybnMgYSBsaW5rIHRvIHRoZSBzdHlsZXNoZWV0IGZpbGUuCiAgICAgICoKQEAgLTI2MDQsMTUgKzE3MzksNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyaXRlIHRoZSBhbm5vdGF0YXRpb24gdHlwZXMgZm9yIHRoZSBnaXZlbiBwYWNrYWdlRG9jLgotICAgICAqCi0gICAgICogQHBhcmFtIHBhY2thZ2VEb2MgdGhlIHBhY2thZ2UgdG8gd3JpdGUgYW5ub3RhdGlvbnMgZm9yLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHdyaXRlQW5ub3RhdGlvbkluZm8oUGFja2FnZURvYyBwYWNrYWdlRG9jKSB7Ci0gICAgICAgIHdyaXRlQW5ub3RhdGlvbkluZm8ocGFja2FnZURvYywgcGFja2FnZURvYy5hbm5vdGF0aW9ucygpKTsKLSAgICB9Ci0KLSAgICAvKioKICAgICAgKiBBZGRzIHRoZSBhbm5vdGF0YXRpb24gdHlwZXMgZm9yIHRoZSBnaXZlbiBwYWNrYWdlRG9jLgogICAgICAqCiAgICAgICogQHBhcmFtIHBhY2thZ2VEb2MgdGhlIHBhY2thZ2UgdG8gd3JpdGUgYW5ub3RhdGlvbnMgZm9yLgpAQCAtMjYyNCwxOCArMTc1MCw5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogV3JpdGUgdGhlIGFubm90YXRhdGlvbiB0eXBlcyBmb3IgdGhlIGdpdmVuIGRvYy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkb2MgdGhlIGRvYyB0byB3cml0ZSBhbm5vdGF0aW9ucyBmb3IuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgd3JpdGVBbm5vdGF0aW9uSW5mbyhQcm9ncmFtRWxlbWVudERvYyBkb2MpIHsKLSAgICAgICAgd3JpdGVBbm5vdGF0aW9uSW5mbyhkb2MsIGRvYy5hbm5vdGF0aW9ucygpKTsKLSAgICB9Ci0KLSAgICAvKioKICAgICAgKiBBZGRzIHRoZSBhbm5vdGF0YXRpb24gdHlwZXMgZm9yIHRoZSBnaXZlbiBkb2MuCiAgICAgICoKLSAgICAgKiBAcGFyYW0gcGFja2FnZURvYyB0aGUgcGFja2FnZSB0byB3cml0ZSBhbm5vdGF0aW9ucyBmb3IKKyAgICAgKiBAcGFyYW0gZG9jIHRoZSBwYWNrYWdlIHRvIHdyaXRlIGFubm90YXRpb25zIGZvcgogICAgICAqIEBwYXJhbSBodG1sdHJlZSB0aGUgY29udGVudCB0cmVlIHRvIHdoaWNoIHRoZSBhbm5vdGF0aW9uIHR5cGVzIHdpbGwgYmUgYWRkZWQKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhZGRBbm5vdGF0aW9uSW5mbyhQcm9ncmFtRWxlbWVudERvYyBkb2MsIENvbnRlbnQgaHRtbHRyZWUpIHsKQEAgLTI2NDMsMTcgKzE3NjAsNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyaXRlIHRoZSBhbm5vdGF0YXRpb24gdHlwZXMgZm9yIHRoZSBnaXZlbiBkb2MgYW5kIHBhcmFtZXRlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbmRlbnQgdGhlIG51bWJlciBvZiBzcGFjZWQgdG8gaW5kZW50IHRoZSBwYXJhbWV0ZXJzLgotICAgICAqIEBwYXJhbSBkb2MgdGhlIGRvYyB0byB3cml0ZSBhbm5vdGF0aW9ucyBmb3IuCi0gICAgICogQHBhcmFtIHBhcmFtIHRoZSBwYXJhbWV0ZXIgdG8gd3JpdGUgYW5ub3RhdGlvbnMgZm9yLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHdyaXRlQW5ub3RhdGlvbkluZm8oaW50IGluZGVudCwgRG9jIGRvYywgUGFyYW1ldGVyIHBhcmFtKSB7Ci0gICAgICAgIHJldHVybiB3cml0ZUFubm90YXRpb25JbmZvKGluZGVudCwgZG9jLCBwYXJhbS5hbm5vdGF0aW9ucygpLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgLyoqCiAgICAgICogQWRkIHRoZSBhbm5vdGF0YXRpb24gdHlwZXMgZm9yIHRoZSBnaXZlbiBkb2MgYW5kIHBhcmFtZXRlci4KICAgICAgKgogICAgICAqIEBwYXJhbSBpbmRlbnQgdGhlIG51bWJlciBvZiBzcGFjZXMgdG8gaW5kZW50IHRoZSBwYXJhbWV0ZXJzLgpAQCAtMjY2NywxNiArMTc3Myw2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogV3JpdGUgdGhlIGFubm90YXRhdGlvbiB0eXBlcyBmb3IgdGhlIGdpdmVuIGRvYy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkb2MgdGhlIGRvYyB0byB3cml0ZSBhbm5vdGF0aW9ucyBmb3IuCi0gICAgICogQHBhcmFtIGRlc2NMaXN0IHRoZSBhcnJheSBvZiB7QGxpbmsgQW5ub3RhdGlvbkRlc2N9LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCB3cml0ZUFubm90YXRpb25JbmZvKERvYyBkb2MsIEFubm90YXRpb25EZXNjW10gZGVzY0xpc3QpIHsKLSAgICAgICAgd3JpdGVBbm5vdGF0aW9uSW5mbygwLCBkb2MsIGRlc2NMaXN0LCB0cnVlKTsKLSAgICB9Ci0KLSAgICAvKioKICAgICAgKiBBZGRzIHRoZSBhbm5vdGF0YXRpb24gdHlwZXMgZm9yIHRoZSBnaXZlbiBkb2MuCiAgICAgICoKICAgICAgKiBAcGFyYW0gZG9jIHRoZSBkb2MgdG8gd3JpdGUgYW5ub3RhdGlvbnMgZm9yLgpAQCAtMjY5MCwyNiArMTc4Niw2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogV3JpdGUgdGhlIGFubm90YXRhdGlvbiB0eXBlcyBmb3IgdGhlIGdpdmVuIGRvYy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbmRlbnQgdGhlIG51bWJlciBvZiBleHRyYSBzcGFjZXMgdG8gaW5kZW50IHRoZSBhbm5vdGF0aW9ucy4KLSAgICAgKiBAcGFyYW0gZG9jIHRoZSBkb2MgdG8gd3JpdGUgYW5ub3RhdGlvbnMgZm9yLgotICAgICAqIEBwYXJhbSBkZXNjTGlzdCB0aGUgYXJyYXkgb2Yge0BsaW5rIEFubm90YXRpb25EZXNjfS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gd3JpdGVBbm5vdGF0aW9uSW5mbyhpbnQgaW5kZW50LCBEb2MgZG9jLCBBbm5vdGF0aW9uRGVzY1tdIGRlc2NMaXN0LCBib29sZWFuIGxpbmVCcmVhaykgewotICAgICAgICBMaXN0PFN0cmluZz4gYW5ub3RhdGlvbnMgPSBnZXRBbm5vdGF0aW9ucyhpbmRlbnQsIGRlc2NMaXN0LCBsaW5lQnJlYWspOwotICAgICAgICBpZiAoYW5ub3RhdGlvbnMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBmb250Tm9OZXdMaW5lKCItMSIpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yPFN0cmluZz4gaXRlciA9IGFubm90YXRpb25zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgcHJpbnQoaXRlci5uZXh0KCkpOwotICAgICAgICB9Ci0gICAgICAgIGZvbnRFbmQoKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCiAgICAgICogQWRkcyB0aGUgYW5ub3RhdGF0aW9uIHR5cGVzIGZvciB0aGUgZ2l2ZW4gZG9jLgogICAgICAqCiAgICAgICogQHBhcmFtIGluZGVudCB0aGUgbnVtYmVyIG9mIGV4dHJhIHNwYWNlcyB0byBpbmRlbnQgdGhlIGFubm90YXRpb25zLgpAQCAtMjc0NCwxMyArMTgyMCwxMyBAQAogICAgICAqLwogICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IGdldEFubm90YXRpb25zKGludCBpbmRlbnQsIEFubm90YXRpb25EZXNjW10gZGVzY0xpc3QsIGJvb2xlYW4gbGlua0JyZWFrKSB7CiAgICAgICAgIExpc3Q8U3RyaW5nPiByZXN1bHRzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBhbm5vdGF0aW9uOworICAgICAgICBTdHJpbmdCdWlsZGVyIGFubm90YXRpb247CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY0xpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgIEFubm90YXRpb25UeXBlRG9jIGFubm90YXRpb25Eb2MgPSBkZXNjTGlzdFtpXS5hbm5vdGF0aW9uVHlwZSgpOwogICAgICAgICAgICAgaWYgKCEgVXRpbC5pc0RvY3VtZW50ZWRBbm5vdGF0aW9uKGFubm90YXRpb25Eb2MpKXsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFubm90YXRpb24gPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgICAgICBhbm5vdGF0aW9uID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKICAgICAgICAgICAgIExpbmtJbmZvSW1wbCBsaW5rSW5mbyA9IG5ldyBMaW5rSW5mb0ltcGwoCiAgICAgICAgICAgICAgICAgTGlua0luZm9JbXBsLkNPTlRFWFRfQU5OT1RBVElPTiwgYW5ub3RhdGlvbkRvYyk7CiAgICAgICAgICAgICBsaW5rSW5mby5sYWJlbCA9ICJAIiArIGFubm90YXRpb25Eb2MubmFtZSgpOwpAQCAtMjgxNSw5ICsxODkxLDkgQEAKICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBsaXN0ID0gZ2V0QW5ub3RhdGlvbnMoMCwKICAgICAgICAgICAgICAgICBuZXcgQW5ub3RhdGlvbkRlc2NbXXsoQW5ub3RhdGlvbkRlc2MpIGFubm90YXRpb25WYWx1ZS52YWx1ZSgpfSwKICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwotICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3I8U3RyaW5nPiBpdGVyID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgKSB7Ci0gICAgICAgICAgICAgICAgYnVmLmFwcGVuZChpdGVyLm5leHQoKSk7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBmb3IgKFN0cmluZyBzOiBsaXN0KSB7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKICAgICAgICAgfSBlbHNlIGlmIChhbm5vdGF0aW9uVmFsdWUudmFsdWUoKSBpbnN0YW5jZW9mIE1lbWJlckRvYykgewpkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9mb3JtYXRzL2h0bWwvSHRtbFNlcmlhbEZpZWxkV3JpdGVyLmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9IdG1sU2VyaWFsRmllbGRXcml0ZXIuamF2YQppbmRleCA4ZjMyNzg5Li5iNzM1YjAxIDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9IdG1sU2VyaWFsRmllbGRXcml0ZXIuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9IdG1sU2VyaWFsRmllbGRXcml0ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMTEsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI4LDE1ICsyOCwyMCBAQAogaW1wb3J0IGphdmEudXRpbC4qOwogCiBpbXBvcnQgY29tLnN1bi5qYXZhZG9jLio7CitpbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmZvcm1hdHMuaHRtbC5tYXJrdXAuKjsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC4qOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0LnRhZ2xldHMuKjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmRvY2xldHMuZm9ybWF0cy5odG1sLm1hcmt1cC4qOwogCiAvKioKICAqIEdlbmVyYXRlIHNlcmlhbGl6ZWQgZm9ybSBmb3Igc2VyaWFsaXphYmxlIGZpZWxkcy4KICAqIERvY3VtZW50YXRpb24gZGVub3RlZCBieSB0aGUgdGFncyA8Y29kZT5zZXJpYWw8L2NvZGU+IGFuZAogICogPGNvZGU+c2VyaWFsRmllbGQ8L2NvZGU+IGlzIHByb2Nlc3NlZC4KICAqCisgKiAgPHA+PGI+VGhpcyBpcyBOT1QgcGFydCBvZiBhbnkgc3VwcG9ydGVkIEFQSS4KKyAqICBJZiB5b3Ugd3JpdGUgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhpcywgeW91IGRvIHNvIGF0IHlvdXIgb3duIHJpc2suCisgKiAgVGhpcyBjb2RlIGFuZCBpdHMgaW50ZXJuYWwgaW50ZXJmYWNlcyBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugb3IKKyAqICBkZWxldGlvbiB3aXRob3V0IG5vdGljZS48L2I+CisgKgogICogQGF1dGhvciBKb2UgRmlhbGxpCiAgKiBAYXV0aG9yIEJoYXZlc2ggUGF0ZWwgKE1vZGlmaWVkKQogICovCkBAIC01NSwxOCArNjAsNiBAQAogICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChjZC5zZXJpYWxpemFibGVGaWVsZHMoKSk7CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIHZvaWQgcHJpbnRUeXBlTGlua05vRGltZW5zaW9uKFR5cGUgdHlwZSkgewotICAgICAgICBDbGFzc0RvYyBjZCA9IHR5cGUuYXNDbGFzc0RvYygpOwotICAgICAgICAvL0xpbmtpbmcgdG8gcGFja2FnZSBwcml2YXRlIGNsYXNzZXMgaW4gc2VyaWFsaXplZCBmb3IgY2F1c2VzCi0gICAgICAgIC8vYnJva2VuIGxpbmtzLiAgRG9uJ3QgbGluayB0byB0aGVtLgotICAgICAgICBpZiAodHlwZS5pc1ByaW1pdGl2ZSgpIHx8IGNkLmlzUGFja2FnZVByaXZhdGUoKSkgewotICAgICAgICAgICAgcHJpbnQodHlwZS50eXBlTmFtZSgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHdyaXRlci5wcmludExpbmsobmV3IExpbmtJbmZvSW1wbCgKLSAgICAgICAgICAgICAgICBMaW5rSW5mb0ltcGwuQ09OVEVYVF9TRVJJQUxfTUVNQkVSLCB0eXBlKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIGhlYWRlciBmb3Igc2VyaWFsaXphYmxlIGZpZWxkcyBzZWN0aW9uLgogICAgICAqCkBAIC0xMjEsMTAgKzExNCwxMCBAQAogICAgIC8qKgogICAgICAqIEFkZCB0aGUgbWVtYmVyIGhlYWRlci4KICAgICAgKgotICAgICAqIEBwYXJhbSBmaWVsZHNUeXBlIHRoZSBjbGFzcyBkb2N1bWVudCB0byBiZSBsaXN0ZWQKLSAgICAgKiBAcGFyYW0gZmllbGRUeXBlU3RyIHRoZSBzdHJpbmcgZm9yIHRoZSBmaWxlZCB0eXBlIHRvIGJlIGRvY3VtZW50ZWQKKyAgICAgKiBAcGFyYW0gZmllbGRUeXBlIHRoZSBjbGFzcyBkb2N1bWVudCB0byBiZSBsaXN0ZWQKKyAgICAgKiBAcGFyYW0gZmllbGRUeXBlU3RyIHRoZSBzdHJpbmcgZm9yIHRoZSBmaWVsZCB0eXBlIHRvIGJlIGRvY3VtZW50ZWQKICAgICAgKiBAcGFyYW0gZmllbGREaW1lbnNpb25zIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBmaWVsZCBzdHJpbmcgdG8gYmUgYWRkZWQKLSAgICAgKiBAcGFyYW0gZmlybGROYW1lIG5hbWUgb2YgdGhlIGZpZWxkIHRvIGJlIGFkZGVkCisgICAgICogQHBhcmFtIGZpZWxkTmFtZSBuYW1lIG9mIHRoZSBmaWVsZCB0byBiZSBhZGRlZAogICAgICAqIEBwYXJhbSBjb250ZW50VHJlZSB0aGUgY29udGVudCB0cmVlIHRvIHdoaWNoIHRoZSBtZW1iZXIgaGVhZGVyIHdpbGwgYmUgYWRkZWQKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhZGRNZW1iZXJIZWFkZXIoQ2xhc3NEb2MgZmllbGRUeXBlLCBTdHJpbmcgZmllbGRUeXBlU3RyLApkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9mb3JtYXRzL2h0bWwvSHRtbFNlcmlhbE1ldGhvZFdyaXRlci5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9mb3JtYXRzL2h0bWwvSHRtbFNlcmlhbE1ldGhvZFdyaXRlci5qYXZhCmluZGV4IDZjZTAxMjAuLjJiNWJkY2YgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL0h0bWxTZXJpYWxNZXRob2RXcml0ZXIuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9IdG1sU2VyaWFsTWV0aG9kV3JpdGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDEwLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNiwxNCArMjYsMTkgQEAKIHBhY2thZ2UgY29tLnN1bi50b29scy5kb2NsZXRzLmZvcm1hdHMuaHRtbDsKIAogaW1wb3J0IGNvbS5zdW4uamF2YWRvYy4qOworaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5mb3JtYXRzLmh0bWwubWFya3VwLio7CiBpbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQuKjsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC50YWdsZXRzLio7Ci1pbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmZvcm1hdHMuaHRtbC5tYXJrdXAuKjsKIAogLyoqCiAgKiBHZW5lcmF0ZSBzZXJpYWxpemVkIGZvcm0gZm9yIFNlcmlhbGl6YWJsZS9FeHRlcm5hbGl6YWJsZSBtZXRob2RzLgogICogRG9jdW1lbnRhdGlvbiBkZW5vdGVkIGJ5IHRoZSA8Y29kZT5zZXJpYWxEYXRhPC9jb2RlPiB0YWcgaXMgcHJvY2Vzc2VkLgogICoKKyAqICA8cD48Yj5UaGlzIGlzIE5PVCBwYXJ0IG9mIGFueSBzdXBwb3J0ZWQgQVBJLgorICogIElmIHlvdSB3cml0ZSBjb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGlzLCB5b3UgZG8gc28gYXQgeW91ciBvd24gcmlzay4KKyAqICBUaGlzIGNvZGUgYW5kIGl0cyBpbnRlcm5hbCBpbnRlcmZhY2VzIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSBvcgorICogIGRlbGV0aW9uIHdpdGhvdXQgbm90aWNlLjwvYj4KKyAqCiAgKiBAYXV0aG9yIEpvZSBGaWFsbGkKICAqIEBhdXRob3IgQmhhdmVzaCBQYXRlbCAoTW9kaWZpZWQpCiAgKi8KQEAgLTE2MSwxNCArMTY2LDQgQEAKICAgICAgICAgICAgICAgICBtZXRob2QuY29udGFpbmluZ0NsYXNzKCkucXVhbGlmaWVkTmFtZSgpLCBtZXRob2QubmFtZSgpKTsKICAgICAgICAgfQogICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHByaW50VHlwZUxpbmtOb0RpbWVuc2lvbihUeXBlIHR5cGUpIHsKLSAgICAgICAgQ2xhc3NEb2MgY2QgPSB0eXBlLmFzQ2xhc3NEb2MoKTsKLSAgICAgICAgaWYgKHR5cGUuaXNQcmltaXRpdmUoKSB8fCBjZC5pc1BhY2thZ2VQcml2YXRlKCkpIHsKLSAgICAgICAgICAgIHByaW50KHR5cGUudHlwZU5hbWUoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB3cml0ZXIucHJpbnRMaW5rKG5ldyBMaW5rSW5mb0ltcGwoCi0gICAgICAgICAgICAgICAgTGlua0luZm9JbXBsLkNPTlRFWFRfU0VSSUFMX01FTUJFUix0eXBlKSk7Ci0gICAgICAgIH0KLSAgICB9CiB9CmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9MaW5rRmFjdG9yeUltcGwuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL0xpbmtGYWN0b3J5SW1wbC5qYXZhCmluZGV4IDNlNGI5NjguLmRhYzc2NWQgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL0xpbmtGYWN0b3J5SW1wbC5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL0xpbmtGYWN0b3J5SW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMTQgKzI1LDE5IEBACiAKIHBhY2thZ2UgY29tLnN1bi50b29scy5kb2NsZXRzLmZvcm1hdHMuaHRtbDsKIAotaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0LnV0aWwubGlua3MuKjsKIGltcG9ydCBjb20uc3VuLmphdmFkb2MuKjsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC4qOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0LnV0aWwuKjsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC51dGlsLmxpbmtzLio7CiAKIC8qKgogICogQSBmYWN0b3J5IHRoYXQgcmV0dXJucyBhIGxpbmsgZ2l2ZW4gdGhlIGluZm9ybWF0aW9uIGFib3V0IGl0LgogICoKKyAqICA8cD48Yj5UaGlzIGlzIE5PVCBwYXJ0IG9mIGFueSBzdXBwb3J0ZWQgQVBJLgorICogIElmIHlvdSB3cml0ZSBjb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGlzLCB5b3UgZG8gc28gYXQgeW91ciBvd24gcmlzay4KKyAqICBUaGlzIGNvZGUgYW5kIGl0cyBpbnRlcm5hbCBpbnRlcmZhY2VzIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSBvcgorICogIGRlbGV0aW9uIHdpdGhvdXQgbm90aWNlLjwvYj4KKyAqCiAgKiBAYXV0aG9yIEphbWllIEhvCiAgKiBAc2luY2UgMS41CiAgKi8KQEAgLTY2LDcgKzcxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgY2xhc3NMaW5rSW5mby50eXBlICE9IG51bGwgJiYKICAgICAgICAgICAgICAgICAgICAgIWNsYXNzRG9jLnF1YWxpZmllZFR5cGVOYW1lKCkuZXF1YWxzKGNsYXNzTGlua0luZm8udHlwZS5xdWFsaWZpZWRUeXBlTmFtZSgpKSkgOgogICAgICAgICAgICAgIiI7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBsYWJlbCA9IG5ldyBTdHJpbmdCdWZmZXIoCisgICAgICAgIFN0cmluZ0J1aWxkZXIgbGFiZWwgPSBuZXcgU3RyaW5nQnVpbGRlcigKICAgICAgICAgICAgIGNsYXNzTGlua0luZm8uZ2V0Q2xhc3NMaW5rTGFiZWwobV93cml0ZXIuY29uZmlndXJhdGlvbikpOwogICAgICAgICBjbGFzc0xpbmtJbmZvLmRpc3BsYXlMZW5ndGggKz0gbGFiZWwubGVuZ3RoKCk7CiAgICAgICAgIENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IENvbmZpZ3VyYXRpb25JbXBsLmdldEluc3RhbmNlKCk7CkBAIC0xNTUsNyArMTYwLDYgQEAKICAgICAgKiAiLi4vLi4vamF2YS9sYW5nL09iamVjdC5odG1sIgogICAgICAqCiAgICAgICogQHBhcmFtIGxpbmtJbmZvIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbGluay4KLSAgICAgKiBAcGFyYW0gZmlsZU5hbWUgdGhlIGZpbGUgbmFtZSwgdG8gd2hpY2ggcGF0aCBzdHJpbmcgaXMuCiAgICAgICovCiAgICAgcHJpdmF0ZSBTdHJpbmcgcGF0aFN0cmluZyhMaW5rSW5mb0ltcGwgbGlua0luZm8pIHsKICAgICAgICAgaWYgKGxpbmtJbmZvLmNvbnRleHQgPT0gTGlua0luZm9JbXBsLlBBQ0tBR0VfRlJBTUUpIHsKQEAgLTE2Myw3ICsxNjcsNyBAQAogICAgICAgICAgICAgLy93aXRoIDEuNC4yIG91dHB1dC4KICAgICAgICAgICAgIHJldHVybiBsaW5rSW5mby5jbGFzc0RvYy5uYW1lKCkgKyAiLmh0bWwiOwogICAgICAgICB9Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKG1fd3JpdGVyLnJlbGF0aXZlUGF0aCk7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIobV93cml0ZXIucmVsYXRpdmVQYXRoKTsKICAgICAgICAgYnVmLmFwcGVuZChEaXJlY3RvcnlNYW5hZ2VyLmdldFBhdGhUb1BhY2thZ2UoCiAgICAgICAgICAgICBsaW5rSW5mby5jbGFzc0RvYy5jb250YWluaW5nUGFja2FnZSgpLAogICAgICAgICAgICAgbGlua0luZm8uY2xhc3NEb2MubmFtZSgpICsgIi5odG1sIikpOwpkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9mb3JtYXRzL2h0bWwvTGlua0luZm9JbXBsLmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9MaW5rSW5mb0ltcGwuamF2YQppbmRleCBjOWExNzZjLi5lZjVmMzhmIDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9MaW5rSW5mb0ltcGwuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9MaW5rSW5mb0ltcGwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTEsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTMwLDYgKzMwLDEyIEBACiBpbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQudXRpbC4qOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0LnV0aWwubGlua3MuKjsKIAorLyoqCisgKiAgPHA+PGI+VGhpcyBpcyBOT1QgcGFydCBvZiBhbnkgc3VwcG9ydGVkIEFQSS4KKyAqICBJZiB5b3Ugd3JpdGUgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhpcywgeW91IGRvIHNvIGF0IHlvdXIgb3duIHJpc2suCisgKiAgVGhpcyBjb2RlIGFuZCBpdHMgaW50ZXJuYWwgaW50ZXJmYWNlcyBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugb3IKKyAqICBkZWxldGlvbiB3aXRob3V0IG5vdGljZS48L2I+CisgKi8KIHB1YmxpYyBjbGFzcyBMaW5rSW5mb0ltcGwgZXh0ZW5kcyBMaW5rSW5mbyB7CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL0xpbmtPdXRwdXRJbXBsLmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9MaW5rT3V0cHV0SW1wbC5qYXZhCmluZGV4IDc4OGZkNjguLmI0MTcxOTcgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL0xpbmtPdXRwdXRJbXBsLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9mb3JtYXRzL2h0bWwvTGlua091dHB1dEltcGwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTMwLDYgKzMwLDExIEBACiAvKioKICAqIFN0b3JlcyBvdXRwdXQgb2YgYSBsaW5rLgogICoKKyAqICA8cD48Yj5UaGlzIGlzIE5PVCBwYXJ0IG9mIGFueSBzdXBwb3J0ZWQgQVBJLgorICogIElmIHlvdSB3cml0ZSBjb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGlzLCB5b3UgZG8gc28gYXQgeW91ciBvd24gcmlzay4KKyAqICBUaGlzIGNvZGUgYW5kIGl0cyBpbnRlcm5hbCBpbnRlcmZhY2VzIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSBvcgorICogIGRlbGV0aW9uIHdpdGhvdXQgbm90aWNlLjwvYj4KKyAqCiAgKiBAYXV0aG9yIEphbWllIEhvCiAgKiBAc2luY2UgMS41CiAgKi8KQEAgLTM4LDEzICs0MywxMyBAQAogICAgIC8qKgogICAgICAqIFRoZSBvdXRwdXQgb2YgdGhlIGxpbmsuCiAgICAgICovCi0gICAgcHVibGljIFN0cmluZ0J1ZmZlciBvdXRwdXQ7CisgICAgcHVibGljIFN0cmluZ0J1aWxkZXIgb3V0cHV0OwogCiAgICAgLyoqCiAgICAgICogQ29uc3RydWN0IGEgbmV3IExpbmtPdXRwdXRJbXBsLgogICAgICAqLwogICAgIHB1YmxpYyBMaW5rT3V0cHV0SW1wbCgpIHsKLSAgICAgICAgb3V0cHV0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBvdXRwdXQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9mb3JtYXRzL2h0bWwvTWV0aG9kV3JpdGVySW1wbC5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9mb3JtYXRzL2h0bWwvTWV0aG9kV3JpdGVySW1wbC5qYXZhCmluZGV4IDg3NTkxNTUuLjQ2Nzg1OWQgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL01ldGhvZFdyaXRlckltcGwuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9NZXRob2RXcml0ZXJJbXBsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAxOTk3LCAyMDEwLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0zNSw2ICszNSwxMSBAQAogLyoqCiAgKiBXcml0ZXMgbWV0aG9kIGRvY3VtZW50YXRpb24gaW4gSFRNTCBmb3JtYXQuCiAgKgorICogIDxwPjxiPlRoaXMgaXMgTk9UIHBhcnQgb2YgYW55IHN1cHBvcnRlZCBBUEkuCisgKiAgSWYgeW91IHdyaXRlIGNvZGUgdGhhdCBkZXBlbmRzIG9uIHRoaXMsIHlvdSBkbyBzbyBhdCB5b3VyIG93biByaXNrLgorICogIFRoaXMgY29kZSBhbmQgaXRzIGludGVybmFsIGludGVyZmFjZXMgYXJlIHN1YmplY3QgdG8gY2hhbmdlIG9yCisgKiAgZGVsZXRpb24gd2l0aG91dCBub3RpY2UuPC9iPgorICoKICAqIEBhdXRob3IgUm9iZXJ0IEZpZWxkCiAgKiBAYXV0aG9yIEF0dWwgTSBEYW1iYWxrYXIKICAqIEBhdXRob3IgSmFtaWUgSG8gKHJld3JpdGUpCmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9OZXN0ZWRDbGFzc1dyaXRlckltcGwuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL05lc3RlZENsYXNzV3JpdGVySW1wbC5qYXZhCmluZGV4IGRkYTkxY2UuLmVjOWE1MGYgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL05lc3RlZENsYXNzV3JpdGVySW1wbC5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL05lc3RlZENsYXNzV3JpdGVySW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMTk5NywgMjAxMCwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5NywgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMzYsNiArMzYsMTEgQEAKIC8qKgogICogV3JpdGVzIG5lc3RlZCBjbGFzcyBkb2N1bWVudGF0aW9uIGluIEhUTUwgZm9ybWF0LgogICoKKyAqICA8cD48Yj5UaGlzIGlzIE5PVCBwYXJ0IG9mIGFueSBzdXBwb3J0ZWQgQVBJLgorICogIElmIHlvdSB3cml0ZSBjb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGlzLCB5b3UgZG8gc28gYXQgeW91ciBvd24gcmlzay4KKyAqICBUaGlzIGNvZGUgYW5kIGl0cyBpbnRlcm5hbCBpbnRlcmZhY2VzIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSBvcgorICogIGRlbGV0aW9uIHdpdGhvdXQgbm90aWNlLjwvYj4KKyAqCiAgKiBAYXV0aG9yIFJvYmVydCBGaWVsZAogICogQGF1dGhvciBBdHVsIE0gRGFtYmFsa2FyCiAgKiBAYXV0aG9yIEphbWllIEhvIChyZXdyaXRlKQpkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9mb3JtYXRzL2h0bWwvUGFja2FnZUZyYW1lV3JpdGVyLmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9QYWNrYWdlRnJhbWVXcml0ZXIuamF2YQppbmRleCAyNzQxNGUwLi42YzlmMzc3IDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9QYWNrYWdlRnJhbWVXcml0ZXIuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9QYWNrYWdlRnJhbWVXcml0ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMTEsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI3LDE2ICsyNywyMiBAQAogCiBpbXBvcnQgamF2YS5pby4qOwogaW1wb3J0IGphdmEudXRpbC4qOworCiBpbXBvcnQgY29tLnN1bi5qYXZhZG9jLio7Ci1pbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQudXRpbC4qOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0Lio7CiBpbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmZvcm1hdHMuaHRtbC5tYXJrdXAuKjsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC4qOworaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0LnV0aWwuKjsKIAogLyoqCiAgKiBDbGFzcyB0byBnZW5lcmF0ZSBmaWxlIGZvciBlYWNoIHBhY2thZ2UgY29udGVudHMgaW4gdGhlIGxlZnQtaGFuZCBib3R0b20KICAqIGZyYW1lLiBUaGlzIHdpbGwgbGlzdCBhbGwgdGhlIENsYXNzIEtpbmRzIGluIHRoZSBwYWNrYWdlLiBBIGNsaWNrIG9uIGFueQogICogY2xhc3Mta2luZCB3aWxsIHVwZGF0ZSB0aGUgcmlnaHQtaGFuZCBmcmFtZSB3aXRoIHRoZSBjbGlja2VkIGNsYXNzLWtpbmQgcGFnZS4KICAqCisgKiAgPHA+PGI+VGhpcyBpcyBOT1QgcGFydCBvZiBhbnkgc3VwcG9ydGVkIEFQSS4KKyAqICBJZiB5b3Ugd3JpdGUgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhpcywgeW91IGRvIHNvIGF0IHlvdXIgb3duIHJpc2suCisgKiAgVGhpcyBjb2RlIGFuZCBpdHMgaW50ZXJuYWwgaW50ZXJmYWNlcyBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugb3IKKyAqICBkZWxldGlvbiB3aXRob3V0IG5vdGljZS48L2I+CisgKgogICogQGF1dGhvciBBdHVsIE0gRGFtYmFsa2FyCiAgKiBAYXV0aG9yIEJoYXZlc2ggUGF0ZWwgKE1vZGlmaWVkKQogICovCmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9QYWNrYWdlSW5kZXhGcmFtZVdyaXRlci5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9mb3JtYXRzL2h0bWwvUGFja2FnZUluZGV4RnJhbWVXcml0ZXIuamF2YQppbmRleCAzYWM0Yjk4Li4yOTI4OTgzIDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9QYWNrYWdlSW5kZXhGcmFtZVdyaXRlci5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL1BhY2thZ2VJbmRleEZyYW1lV3JpdGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDExLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNiwxNiArMjYsMjIgQEAKIHBhY2thZ2UgY29tLnN1bi50b29scy5kb2NsZXRzLmZvcm1hdHMuaHRtbDsKIAogaW1wb3J0IGphdmEuaW8uKjsKKwogaW1wb3J0IGNvbS5zdW4uamF2YWRvYy4qOworaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5mb3JtYXRzLmh0bWwubWFya3VwLio7CiBpbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQuKjsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC51dGlsLio7Ci1pbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmZvcm1hdHMuaHRtbC5tYXJrdXAuKjsKIAogLyoqCiAgKiBHZW5lcmF0ZSB0aGUgcGFja2FnZSBpbmRleCBmb3IgdGhlIGxlZnQtaGFuZCBmcmFtZSBpbiB0aGUgZ2VuZXJhdGVkIG91dHB1dC4KICAqIEEgY2xpY2sgb24gdGhlIHBhY2thZ2UgbmFtZSBpbiB0aGlzIGZyYW1lIHdpbGwgdXBkYXRlIHRoZSBwYWdlIGluIHRoZSBib3R0b20KICAqIGxlZnQgaGFuZCBmcmFtZSB3aXRoIHRoZSBsaXN0aW5nIG9mIGNvbnRlbnRzIG9mIHRoZSBjbGlja2VkIHBhY2thZ2UuCiAgKgorICogIDxwPjxiPlRoaXMgaXMgTk9UIHBhcnQgb2YgYW55IHN1cHBvcnRlZCBBUEkuCisgKiAgSWYgeW91IHdyaXRlIGNvZGUgdGhhdCBkZXBlbmRzIG9uIHRoaXMsIHlvdSBkbyBzbyBhdCB5b3VyIG93biByaXNrLgorICogIFRoaXMgY29kZSBhbmQgaXRzIGludGVybmFsIGludGVyZmFjZXMgYXJlIHN1YmplY3QgdG8gY2hhbmdlIG9yCisgKiAgZGVsZXRpb24gd2l0aG91dCBub3RpY2UuPC9iPgorICoKICAqIEBhdXRob3IgQXR1bCBNIERhbWJhbGthcgogICovCiBwdWJsaWMgY2xhc3MgUGFja2FnZUluZGV4RnJhbWVXcml0ZXIgZXh0ZW5kcyBBYnN0cmFjdFBhY2thZ2VJbmRleFdyaXRlciB7CmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9QYWNrYWdlSW5kZXhXcml0ZXIuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL1BhY2thZ2VJbmRleFdyaXRlci5qYXZhCmluZGV4IDdiOWJlOTEuLmIxNDAwZjQgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL1BhY2thZ2VJbmRleFdyaXRlci5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL1BhY2thZ2VJbmRleFdyaXRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMTk5NywgMjAxMSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5NywgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjcsMTYgKzI3LDIyIEBACiAKIGltcG9ydCBqYXZhLmlvLio7CiBpbXBvcnQgamF2YS51dGlsLio7CisKIGltcG9ydCBjb20uc3VuLmphdmFkb2MuKjsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmRvY2xldHMuZm9ybWF0cy5odG1sLm1hcmt1cC4qOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0Lio7CiBpbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQudXRpbC4qOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5mb3JtYXRzLmh0bWwubWFya3VwLio7CiAKIC8qKgogICogR2VuZXJhdGUgdGhlIHBhY2thZ2UgaW5kZXggcGFnZSAib3ZlcnZpZXctc3VtbWFyeS5odG1sIiBmb3IgdGhlIHJpZ2h0LWhhbmQKICAqIGZyYW1lLiBBIGNsaWNrIG9uIHRoZSBwYWNrYWdlIG5hbWUgb24gdGhpcyBwYWdlIHdpbGwgdXBkYXRlIHRoZSBzYW1lIGZyYW1lCiAgKiB3aXRoIHRoZSAicGFjYWtnZS1zdW1tYXJ5Lmh0bWwiIGZpbGUgZm9yIHRoZSBjbGlja2VkIHBhY2thZ2UuCiAgKgorICogIDxwPjxiPlRoaXMgaXMgTk9UIHBhcnQgb2YgYW55IHN1cHBvcnRlZCBBUEkuCisgKiAgSWYgeW91IHdyaXRlIGNvZGUgdGhhdCBkZXBlbmRzIG9uIHRoaXMsIHlvdSBkbyBzbyBhdCB5b3VyIG93biByaXNrLgorICogIFRoaXMgY29kZSBhbmQgaXRzIGludGVybmFsIGludGVyZmFjZXMgYXJlIHN1YmplY3QgdG8gY2hhbmdlIG9yCisgKiAgZGVsZXRpb24gd2l0aG91dCBub3RpY2UuPC9iPgorICoKICAqIEBhdXRob3IgQXR1bCBNIERhbWJhbGthcgogICogQGF1dGhvciBCaGF2ZXNoIFBhdGVsIChNb2RpZmllZCkKICAqLwpAQCAtMjI4LDcgKzIzNCw3IEBACiAgICAgICogQWRkcyB0aGUgbG93ZXIgbmF2aWdhdGlvbiBiYXIgYW5kIHRoZSBib3R0b20gdGV4dAogICAgICAqIChmcm9tIHRoZSAtYm90dG9tIG9wdGlvbikgYXQgdGhlIGJvdHRvbSBvZiBwYWdlLgogICAgICAqCi0gICAgICogQHBhcmFtIHRoZSBkb2N1bWVudGF0aW9uIHRyZWUgdG8gd2hpY2ggdGhlIG5hdmlnYXRpb24gYmFyIGZvb3RlciB3aWxsIGJlIGFkZGVkCisgICAgICogQHBhcmFtIGJvZHkgdGhlIGRvY3VtZW50YXRpb24gdHJlZSB0byB3aGljaCB0aGUgbmF2aWdhdGlvbiBiYXIgZm9vdGVyIHdpbGwgYmUgYWRkZWQKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBhZGROYXZpZ2F0aW9uQmFyRm9vdGVyKENvbnRlbnQgYm9keSkgewogICAgICAgICBhZGROYXZMaW5rcyhmYWxzZSwgYm9keSk7CmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9QYWNrYWdlVHJlZVdyaXRlci5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9mb3JtYXRzL2h0bWwvUGFja2FnZVRyZWVXcml0ZXIuamF2YQppbmRleCA3OTk2NjU1Li41ODk1MDE1IDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9QYWNrYWdlVHJlZVdyaXRlci5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL1BhY2thZ2VUcmVlV3JpdGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDEwLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yOCwxNCArMjgsMTkgQEAKIGltcG9ydCBqYXZhLmlvLio7CiAKIGltcG9ydCBjb20uc3VuLmphdmFkb2MuKjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC51dGlsLio7CiBpbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmZvcm1hdHMuaHRtbC5tYXJrdXAuKjsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC4qOworaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0LnV0aWwuKjsKIAogLyoqCiAgKiBDbGFzcyB0byBnZW5lcmF0ZSBUcmVlIHBhZ2UgZm9yIGEgcGFja2FnZS4gVGhlIG5hbWUgb2YgdGhlIGZpbGUgZ2VuZXJhdGVkIGlzCiAgKiAicGFja2FnZS10cmVlLmh0bWwiIGFuZCBpdCBpcyBnZW5lcmF0ZWQgaW4gdGhlIHJlc3BlY3RpdmUgcGFja2FnZSBkaXJlY3RvcnkuCiAgKgorICogIDxwPjxiPlRoaXMgaXMgTk9UIHBhcnQgb2YgYW55IHN1cHBvcnRlZCBBUEkuCisgKiAgSWYgeW91IHdyaXRlIGNvZGUgdGhhdCBkZXBlbmRzIG9uIHRoaXMsIHlvdSBkbyBzbyBhdCB5b3VyIG93biByaXNrLgorICogIFRoaXMgY29kZSBhbmQgaXRzIGludGVybmFsIGludGVyZmFjZXMgYXJlIHN1YmplY3QgdG8gY2hhbmdlIG9yCisgKiAgZGVsZXRpb24gd2l0aG91dCBub3RpY2UuPC9iPgorICoKICAqIEBhdXRob3IgQXR1bCBNIERhbWJhbGthcgogICogQGF1dGhvciBCaGF2ZXNoIFBhdGVsIChNb2RpZmllZCkKICAqLwpkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9mb3JtYXRzL2h0bWwvUGFja2FnZVVzZVdyaXRlci5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9mb3JtYXRzL2h0bWwvUGFja2FnZVVzZVdyaXRlci5qYXZhCmluZGV4IDU3OWFlZTIuLjFiZjYxYTUgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL1BhY2thZ2VVc2VXcml0ZXIuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9QYWNrYWdlVXNlV3JpdGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDExLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNywxNCArMjcsMjAgQEAKIAogaW1wb3J0IGphdmEuaW8uKjsKIGltcG9ydCBqYXZhLnV0aWwuKjsKKwogaW1wb3J0IGNvbS5zdW4uamF2YWRvYy4qOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0LnV0aWwuKjsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmRvY2xldHMuZm9ybWF0cy5odG1sLm1hcmt1cC4qOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0Lio7CitpbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQudXRpbC4qOwogCiAvKioKICAqIEdlbmVyYXRlIHBhY2thZ2UgdXNhZ2UgaW5mb3JtYXRpb24uCiAgKgorICogIDxwPjxiPlRoaXMgaXMgTk9UIHBhcnQgb2YgYW55IHN1cHBvcnRlZCBBUEkuCisgKiAgSWYgeW91IHdyaXRlIGNvZGUgdGhhdCBkZXBlbmRzIG9uIHRoaXMsIHlvdSBkbyBzbyBhdCB5b3VyIG93biByaXNrLgorICogIFRoaXMgY29kZSBhbmQgaXRzIGludGVybmFsIGludGVyZmFjZXMgYXJlIHN1YmplY3QgdG8gY2hhbmdlIG9yCisgKiAgZGVsZXRpb24gd2l0aG91dCBub3RpY2UuPC9iPgorICoKICAqIEBhdXRob3IgUm9iZXJ0IEcuIEZpZWxkCiAgKiBAYXV0aG9yIEJoYXZlc2ggUGF0ZWwgKE1vZGlmaWVkKQogICovCmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9QYWNrYWdlV3JpdGVySW1wbC5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9mb3JtYXRzL2h0bWwvUGFja2FnZVdyaXRlckltcGwuamF2YQppbmRleCBiYzM1MzE4Li5jOTFiZjRkIDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9QYWNrYWdlV3JpdGVySW1wbC5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL1BhY2thZ2VXcml0ZXJJbXBsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAxOTk3LCAyMDExLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNywxNiArMjcsMjIgQEAKIAogaW1wb3J0IGphdmEuaW8uKjsKIGltcG9ydCBqYXZhLnV0aWwuKjsKKwogaW1wb3J0IGNvbS5zdW4uamF2YWRvYy4qOworaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5mb3JtYXRzLmh0bWwubWFya3VwLio7CiBpbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQuKjsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC51dGlsLio7Ci1pbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmZvcm1hdHMuaHRtbC5tYXJrdXAuKjsKIAogLyoqCiAgKiBDbGFzcyB0byBnZW5lcmF0ZSBmaWxlIGZvciBlYWNoIHBhY2thZ2UgY29udGVudHMgaW4gdGhlIHJpZ2h0LWhhbmQKICAqIGZyYW1lLiBUaGlzIHdpbGwgbGlzdCBhbGwgdGhlIENsYXNzIEtpbmRzIGluIHRoZSBwYWNrYWdlLiBBIGNsaWNrIG9uIGFueQogICogY2xhc3Mta2luZCB3aWxsIHVwZGF0ZSB0aGUgZnJhbWUgd2l0aCB0aGUgY2xpY2tlZCBjbGFzcy1raW5kIHBhZ2UuCiAgKgorICogIDxwPjxiPlRoaXMgaXMgTk9UIHBhcnQgb2YgYW55IHN1cHBvcnRlZCBBUEkuCisgKiAgSWYgeW91IHdyaXRlIGNvZGUgdGhhdCBkZXBlbmRzIG9uIHRoaXMsIHlvdSBkbyBzbyBhdCB5b3VyIG93biByaXNrLgorICogIFRoaXMgY29kZSBhbmQgaXRzIGludGVybmFsIGludGVyZmFjZXMgYXJlIHN1YmplY3QgdG8gY2hhbmdlIG9yCisgKiAgZGVsZXRpb24gd2l0aG91dCBub3RpY2UuPC9iPgorICoKICAqIEBhdXRob3IgQXR1bCBNIERhbWJhbGthcgogICogQGF1dGhvciBCaGF2ZXNoIFBhdGVsIChNb2RpZmllZCkKICAqLwpAQCAtMjQ4LDcgKzI1NCw3IEBACiAgICAgLyoqCiAgICAgICoge0Bpbmhlcml0RG9jfQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHByaW50RG9jdW1lbnQoQ29udGVudCBjb250ZW50VHJlZSkgeworICAgIHB1YmxpYyB2b2lkIHByaW50RG9jdW1lbnQoQ29udGVudCBjb250ZW50VHJlZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgcHJpbnRIdG1sRG9jdW1lbnQoY29uZmlndXJhdGlvbi5tZXRha2V5d29yZHMuZ2V0TWV0YUtleXdvcmRzKHBhY2thZ2VEb2MpLAogICAgICAgICAgICAgICAgIHRydWUsIGNvbnRlbnRUcmVlKTsKICAgICB9CmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9TZXJpYWxpemVkRm9ybVdyaXRlckltcGwuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL1NlcmlhbGl6ZWRGb3JtV3JpdGVySW1wbC5qYXZhCmluZGV4IDZkMzlmMGEuLmY3Y2I0ZmUgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL1NlcmlhbGl6ZWRGb3JtV3JpdGVySW1wbC5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL1NlcmlhbGl6ZWRGb3JtV3JpdGVySW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAxMCwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjksMTQgKzI5LDIwIEBACiBpbXBvcnQgY29tLnN1bi5qYXZhZG9jLio7CiBpbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmZvcm1hdHMuaHRtbC5tYXJrdXAuKjsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC4qOworaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0LnV0aWwuRG9jbGV0QWJvcnRFeGNlcHRpb247CiAKIC8qKgogICogR2VuZXJhdGUgdGhlIFNlcmlhbGl6ZWQgRm9ybSBJbmZvcm1hdGlvbiBQYWdlLgogICoKKyAqICA8cD48Yj5UaGlzIGlzIE5PVCBwYXJ0IG9mIGFueSBzdXBwb3J0ZWQgQVBJLgorICogIElmIHlvdSB3cml0ZSBjb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGlzLCB5b3UgZG8gc28gYXQgeW91ciBvd24gcmlzay4KKyAqICBUaGlzIGNvZGUgYW5kIGl0cyBpbnRlcm5hbCBpbnRlcmZhY2VzIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSBvcgorICogIGRlbGV0aW9uIHdpdGhvdXQgbm90aWNlLjwvYj4KKyAqCiAgKiBAYXV0aG9yIEF0dWwgTSBEYW1iYWxrYXIKICAqLwogcHVibGljIGNsYXNzIFNlcmlhbGl6ZWRGb3JtV3JpdGVySW1wbCBleHRlbmRzIFN1YldyaXRlckhvbGRlcldyaXRlcgotICAgIGltcGxlbWVudHMgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQuU2VyaWFsaXplZEZvcm1Xcml0ZXIgeworICAgIGltcGxlbWVudHMgU2VyaWFsaXplZEZvcm1Xcml0ZXIgewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfTkFNRSA9ICJzZXJpYWxpemVkLWZvcm0uaHRtbCI7CiAKQEAgLTQ5LDIzICs1NSw2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogV3JpdGVzIHRoZSBnaXZlbiBoZWFkZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaGVhZGVyIHRoZSBoZWFkZXIgdG8gd3JpdGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgd3JpdGVIZWFkZXIoU3RyaW5nIGhlYWRlcikgewotICAgICAgICBwcmludEh0bWxIZWFkZXIoaGVhZGVyLCBudWxsLCB0cnVlKTsKLSAgICAgICAgcHJpbnRUb3AoKTsKLSAgICAgICAgbmF2TGlua3ModHJ1ZSk7Ci0gICAgICAgIGhyKCk7Ci0gICAgICAgIGNlbnRlcigpOwotICAgICAgICBoMSgpOwotICAgICAgICBwcmludChoZWFkZXIpOwotICAgICAgICBoMUVuZCgpOwotICAgICAgICBjZW50ZXJFbmQoKTsKLSAgICB9Ci0KLSAgICAvKioKICAgICAgKiBHZXQgdGhlIGdpdmVuIGhlYWRlci4KICAgICAgKgogICAgICAqIEBwYXJhbSBoZWFkZXIgdGhlIGhlYWRlciB0byB3cml0ZQpAQCAtMjI1LDIwICsyMTQsMTAgQEAKICAgICAvKioKICAgICAgKiB7QGluaGVyaXREb2N9CiAgICAgICovCi0gICAgcHVibGljIHZvaWQgcHJpbnREb2N1bWVudChDb250ZW50IHNlcmlhbGl6ZWRUcmVlKSB7CisgICAgcHVibGljIHZvaWQgcHJpbnREb2N1bWVudChDb250ZW50IHNlcmlhbGl6ZWRUcmVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBwcmludEh0bWxEb2N1bWVudChudWxsLCB0cnVlLCBzZXJpYWxpemVkVHJlZSk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIHRhYmxlSGVhZGVyKCkgewotICAgICAgICB0YWJsZUluZGV4U3VtbWFyeSgpOwotICAgICAgICB0ckJnY29sb3JTdHlsZSgiI0NDQ0NGRiIsICJUYWJsZVN1YkhlYWRpbmdDb2xvciIpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0YWJsZUZvb3RlcigpIHsKLSAgICAgICAgZm9udEVuZCgpOwotICAgICAgICB0aEVuZCgpOyB0ckVuZCgpOyB0YWJsZUVuZCgpOwotICAgIH0KLQogICAgIC8qKgogICAgICAqIFJldHVybiBhbiBpbnN0YW5jZSBvZiBhIFNlcmlhbEZpZWxkV3JpdGVyLgogICAgICAqCmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9TaW5nbGVJbmRleFdyaXRlci5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9mb3JtYXRzL2h0bWwvU2luZ2xlSW5kZXhXcml0ZXIuamF2YQppbmRleCA2YmJjYWU2Li5hMGNlODBmIDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9TaW5nbGVJbmRleFdyaXRlci5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL1NpbmdsZUluZGV4V3JpdGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDEwLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNiwxNSArMjYsMjEgQEAKIHBhY2thZ2UgY29tLnN1bi50b29scy5kb2NsZXRzLmZvcm1hdHMuaHRtbDsKIAogaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC51dGlsLio7CisKIGltcG9ydCBjb20uc3VuLnRvb2xzLmRvY2xldHMuZm9ybWF0cy5odG1sLm1hcmt1cC4qOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0Lio7CitpbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQudXRpbC4qOwogCiAvKioKICAqIEdlbmVyYXRlIG9ubHkgb25lIGluZGV4IGZpbGUgZm9yIGFsbCB0aGUgTWVtYmVyIE5hbWVzIHdpdGggSW5kZXhpbmcgaW4KICAqIFVuaWNvZGUgT3JkZXIuIFRoZSBuYW1lIG9mIHRoZSBnZW5lcmF0ZWQgZmlsZSBpcyAiaW5kZXgtYWxsLmh0bWwiIGFuZCBpdCBpcwogICogZ2VuZXJhdGVkIGluIGN1cnJlbnQgb3IgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeS4KICAqCisgKiAgPHA+PGI+VGhpcyBpcyBOT1QgcGFydCBvZiBhbnkgc3VwcG9ydGVkIEFQSS4KKyAqICBJZiB5b3Ugd3JpdGUgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhpcywgeW91IGRvIHNvIGF0IHlvdXIgb3duIHJpc2suCisgKiAgVGhpcyBjb2RlIGFuZCBpdHMgaW50ZXJuYWwgaW50ZXJmYWNlcyBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugb3IKKyAqICBkZWxldGlvbiB3aXRob3V0IG5vdGljZS48L2I+CisgKgogICogQHNlZSBqYXZhLmxhbmcuQ2hhcmFjdGVyCiAgKiBAYXV0aG9yIEF0dWwgTSBEYW1iYWxrYXIKICAqIEBhdXRob3IgQmhhdmVzaCBQYXRlbCAoTW9kaWZpZWQpCmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9Tb3VyY2VUb0hUTUxDb252ZXJ0ZXIuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL1NvdXJjZVRvSFRNTENvbnZlcnRlci5qYXZhCmluZGV4IDVmZDdmODguLmM1NjBiYjggMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL1NvdXJjZVRvSFRNTENvbnZlcnRlci5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL1NvdXJjZVRvSFRNTENvbnZlcnRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMzUsOSArMzUsMTAgQEAKIC8qKgogICogQ29udmVydHMgSmF2YSBTb3VyY2UgQ29kZSB0byBIVE1MLgogICoKLSAqIFRoaXMgY29kZSBpcyBub3QgcGFydCBvZiBhbiBBUEkuCi0gKiBJdCBpcyBpbXBsZW1lbnRhdGlvbiB0aGF0IGlzIHN1YmplY3QgdG8gY2hhbmdlLgotICogRG8gbm90IHVzZSBpdCBhcyBhbiBBUEkKKyAqICA8cD48Yj5UaGlzIGlzIE5PVCBwYXJ0IG9mIGFueSBzdXBwb3J0ZWQgQVBJLgorICogIElmIHlvdSB3cml0ZSBjb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGlzLCB5b3UgZG8gc28gYXQgeW91ciBvd24gcmlzay4KKyAqICBUaGlzIGNvZGUgYW5kIGl0cyBpbnRlcm5hbCBpbnRlcmZhY2VzIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSBvcgorICogIGRlbGV0aW9uIHdpdGhvdXQgbm90aWNlLjwvYj4KICAqCiAgKiBAYXV0aG9yIEphbWllIEhvCiAgKiBAYXV0aG9yIEJoYXZlc2ggUGF0ZWwgKE1vZGlmaWVkKQpkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9mb3JtYXRzL2h0bWwvU3BsaXRJbmRleFdyaXRlci5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9mb3JtYXRzL2h0bWwvU3BsaXRJbmRleFdyaXRlci5qYXZhCmluZGV4IDlkNjA4NzMuLmU2MjQ5ZjIgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL1NwbGl0SW5kZXhXcml0ZXIuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9TcGxpdEluZGV4V3JpdGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDEwLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNiwxNSArMjYsMjEgQEAKIHBhY2thZ2UgY29tLnN1bi50b29scy5kb2NsZXRzLmZvcm1hdHMuaHRtbDsKIAogaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC51dGlsLio7CisKIGltcG9ydCBjb20uc3VuLnRvb2xzLmRvY2xldHMuZm9ybWF0cy5odG1sLm1hcmt1cC4qOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0Lio7CitpbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQudXRpbC4qOwogCiAvKioKICAqIEdlbmVyYXRlIFNlcGFyYXRlIEluZGV4IEZpbGVzIGZvciBhbGwgdGhlIG1lbWJlciBuYW1lcyB3aXRoIEluZGV4aW5nIGluCiAgKiBVbmljb2RlIE9yZGVyLiBUaGlzIHdpbGwgY3JlYXRlICJpbmRleC1maWxlcyIgZGlyZWN0b3J5IGluIHRoZSBjdXJyZW50IG9yCiAgKiBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgYW5kIHdpbGwgZ2VuZXJhdGUgc2VwYXJhdGUgZmlsZSBmb3IgZWFjaCB1bmljb2RlIGluZGV4LgogICoKKyAqICA8cD48Yj5UaGlzIGlzIE5PVCBwYXJ0IG9mIGFueSBzdXBwb3J0ZWQgQVBJLgorICogIElmIHlvdSB3cml0ZSBjb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGlzLCB5b3UgZG8gc28gYXQgeW91ciBvd24gcmlzay4KKyAqICBUaGlzIGNvZGUgYW5kIGl0cyBpbnRlcm5hbCBpbnRlcmZhY2VzIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSBvcgorICogIGRlbGV0aW9uIHdpdGhvdXQgbm90aWNlLjwvYj4KKyAqCiAgKiBAc2VlIGphdmEubGFuZy5DaGFyYWN0ZXIKICAqIEBhdXRob3IgQXR1bCBNIERhbWJhbGthcgogICogQGF1dGhvciBCaGF2ZXNoIFBhdGVsIChNb2RpZmllZCkKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL1N1YldyaXRlckhvbGRlcldyaXRlci5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9mb3JtYXRzL2h0bWwvU3ViV3JpdGVySG9sZGVyV3JpdGVyLmphdmEKaW5kZXggNjc5MGI3My4uNDI0YzU1ZCAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9mb3JtYXRzL2h0bWwvU3ViV3JpdGVySG9sZGVyV3JpdGVyLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9mb3JtYXRzL2h0bWwvU3ViV3JpdGVySG9sZGVyV3JpdGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAxOTk3LCAyMDEwLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNiwxMCArMjYsMTEgQEAKIHBhY2thZ2UgY29tLnN1bi50b29scy5kb2NsZXRzLmZvcm1hdHMuaHRtbDsKIAogaW1wb3J0IGphdmEuaW8uKjsKKwogaW1wb3J0IGNvbS5zdW4uamF2YWRvYy4qOworaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5mb3JtYXRzLmh0bWwubWFya3VwLio7CiBpbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQuKjsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC51dGlsLio7Ci1pbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmZvcm1hdHMuaHRtbC5tYXJrdXAuKjsKIAogLyoqCiAgKiBUaGlzIGFic3RyYWN0IGNsYXNzIGV4aXN0cyB0byBwcm92aWRlIGZ1bmN0aW9uYWxpdHkgbmVlZGVkIGluIHRoZQpAQCAtMzksNiArNDAsMTEgQEAKICAqIGNhbiBub3QgYmUgdXNlZCBlZmZlY3RpdmVseSB0byBjaGFuZ2UgZm9ybWF0dGluZy4gIFRoZSBjb25jcmV0ZQogICogY2xhc3Mgc3ViY2xhc3Mgb2YgdGhpcyBjbGFzcyBjYW4gYmUgc3ViY2xhc3NlZCB0byBjaGFuZ2UgZm9ybWF0dGluZy4KICAqCisgKiAgPHA+PGI+VGhpcyBpcyBOT1QgcGFydCBvZiBhbnkgc3VwcG9ydGVkIEFQSS4KKyAqICBJZiB5b3Ugd3JpdGUgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhpcywgeW91IGRvIHNvIGF0IHlvdXIgb3duIHJpc2suCisgKiAgVGhpcyBjb2RlIGFuZCBpdHMgaW50ZXJuYWwgaW50ZXJmYWNlcyBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugb3IKKyAqICBkZWxldGlvbiB3aXRob3V0IG5vdGljZS48L2I+CisgKgogICogQHNlZSBBYnN0cmFjdE1lbWJlcldyaXRlcgogICogQHNlZSBDbGFzc1dyaXRlckltcGwKICAqCkBAIC02MCwxOCArNjYsNiBAQAogICAgICAgICBzdXBlcihjb25maWd1cmF0aW9uLCBwYXRoLCBmaWxlbmFtZSwgcmVscGF0aCk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgcHJpbnRUeXBlU3VtbWFyeUhlYWRlcigpIHsKLSAgICAgICAgdGRJbmRleCgpOwotICAgICAgICBmb250KCItMSIpOwotICAgICAgICBjb2RlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJpbnRUeXBlU3VtbWFyeUZvb3RlcigpIHsKLSAgICAgICAgY29kZUVuZCgpOwotICAgICAgICBmb250RW5kKCk7Ci0gICAgICAgIHRkRW5kKCk7Ci0gICAgfQotCiAgICAgLyoqCiAgICAgICogQWRkIHRoZSBzdW1tYXJ5IGhlYWRlci4KICAgICAgKgpAQCAtOTksMTQgKzkzLDYgQEAKICAgICAgICAgcmV0dXJuIHRhYmxlOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHByaW50VGFibGVIZWFkaW5nQmFja2dyb3VuZChTdHJpbmcgc3RyKSB7Ci0gICAgICAgIHRhYmxlSW5kZXhEZXRhaWwoKTsKLSAgICAgICAgdGFibGVIZWFkZXJTdGFydCgiI0NDQ0NGRiIsIDEpOwotICAgICAgICBzdHJvbmcoc3RyKTsKLSAgICAgICAgdGFibGVIZWFkZXJFbmQoKTsKLSAgICAgICAgdGFibGVFbmQoKTsKLSAgICB9Ci0KICAgICAvKioKICAgICAgKiBBZGQgdGhlIGluaGVyaXRlZCBzdW1tYXJ5IGhlYWRlci4KICAgICAgKgpAQCAtMTIwLDE5ICsxMDYsNiBAQAogICAgICAgICBtdy5hZGRJbmhlcml0ZWRTdW1tYXJ5TGFiZWwoY2QsIGluaGVyaXRlZFRyZWUpOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHByaW50U3VtbWFyeUZvb3RlcihBYnN0cmFjdE1lbWJlcldyaXRlciBtdywgQ2xhc3NEb2MgY2QpIHsKLSAgICAgICAgdGFibGVFbmQoKTsKLSAgICAgICAgc3BhY2UoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcmludEluaGVyaXRlZFN1bW1hcnlGb290ZXIoQWJzdHJhY3RNZW1iZXJXcml0ZXIgbXcsIENsYXNzRG9jIGNkKSB7Ci0gICAgICAgIGNvZGVFbmQoKTsKLSAgICAgICAgc3VtbWFyeVJvd0VuZCgpOwotICAgICAgICB0ckVuZCgpOwotICAgICAgICB0YWJsZUVuZCgpOwotICAgICAgICBzcGFjZSgpOwotICAgIH0KLQogICAgIC8qKgogICAgICAqIEFkZCB0aGUgaW5kZXggY29tbWVudC4KICAgICAgKgpAQCAtMTQzLDI0ICsxMTYsNiBAQAogICAgICAgICBhZGRJbmRleENvbW1lbnQobWVtYmVyLCBtZW1iZXIuZmlyc3RTZW50ZW5jZVRhZ3MoKSwgY29udGVudFRyZWUpOwogICAgIH0KIAotICAgIHByb3RlY3RlZCB2b2lkIHByaW50SW5kZXhDb21tZW50KERvYyBtZW1iZXIsIFRhZ1tdIGZpcnN0U2VudGVuY2VUYWdzKSB7Ci0gICAgICAgIFRhZ1tdIGRlcHJzID0gbWVtYmVyLnRhZ3MoImRlcHJlY2F0ZWQiKTsKLSAgICAgICAgaWYgKFV0aWwuaXNEZXByZWNhdGVkKChQcm9ncmFtRWxlbWVudERvYykgbWVtYmVyKSkgewotICAgICAgICAgICAgc3Ryb25nVGV4dCgiZG9jbGV0LkRlcHJlY2F0ZWQiKTsKLSAgICAgICAgICAgIHNwYWNlKCk7Ci0gICAgICAgICAgICBpZiAoZGVwcnMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgIHByaW50SW5saW5lRGVwcmVjYXRlZENvbW1lbnQobWVtYmVyLCBkZXByc1swXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBDbGFzc0RvYyBjZCA9ICgoUHJvZ3JhbUVsZW1lbnREb2MpbWVtYmVyKS5jb250YWluaW5nQ2xhc3MoKTsKLSAgICAgICAgICAgIGlmIChjZCAhPSBudWxsICYmIFV0aWwuaXNEZXByZWNhdGVkKGNkKSkgewotICAgICAgICAgICAgICAgIHN0cm9uZ1RleHQoImRvY2xldC5EZXByZWNhdGVkIik7IHNwYWNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcHJpbnRTdW1tYXJ5Q29tbWVudChtZW1iZXIsIGZpcnN0U2VudGVuY2VUYWdzKTsKLSAgICB9Ci0KICAgICAvKioKICAgICAgKiBBZGQgdGhlIGluZGV4IGNvbW1lbnQuCiAgICAgICoKQEAgLTIxNywxOCArMTcyLDYgQEAKICAgICAgICAgYWRkU3VtbWFyeUxpbmtDb21tZW50KG13LCBtZW1iZXIsIG1lbWJlci5maXJzdFNlbnRlbmNlVGFncygpLCBjb250ZW50VHJlZSk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgcHJpbnRTdW1tYXJ5TGlua0NvbW1lbnQoQWJzdHJhY3RNZW1iZXJXcml0ZXIgbXcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvZ3JhbUVsZW1lbnREb2MgbWVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhZ1tdIGZpcnN0U2VudGVuY2VUYWdzKSB7Ci0gICAgICAgIGNvZGVFbmQoKTsKLSAgICAgICAgcHJpbnRsbigpOwotICAgICAgICBicigpOwotICAgICAgICBwcmludE5ic3BzKCk7Ci0gICAgICAgIHByaW50SW5kZXhDb21tZW50KG1lbWJlciwgZmlyc3RTZW50ZW5jZVRhZ3MpOwotICAgICAgICBzdW1tYXJ5Um93RW5kKCk7Ci0gICAgICAgIHRyRW5kKCk7Ci0gICAgfQotCiAgICAgLyoqCiAgICAgICogQWRkIHRoZSBzdW1tYXJ5IGxpbmsgY29tbWVudC4KICAgICAgKgpAQCAtMjU5LDEzICsyMDIsNiBAQAogICAgICAgICBtdy5hZGRJbmhlcml0ZWRTdW1tYXJ5TGluayhjZCwgbWVtYmVyLCBsaW5rc1RyZWUpOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHByaW50TWVtYmVySGVhZGVyKCkgewotICAgICAgICBocigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByaW50TWVtYmVyRm9vdGVyKCkgewotICAgIH0KLQogICAgIC8qKgogICAgICAqIEdldCB0aGUgZG9jdW1lbnQgY29udGVudCBoZWFkZXIgdHJlZQogICAgICAqCmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9UYWdsZXRPdXRwdXRJbXBsLmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9UYWdsZXRPdXRwdXRJbXBsLmphdmEKaW5kZXggOWZiM2JjZC4uMGRmYjQ2NyAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9mb3JtYXRzL2h0bWwvVGFnbGV0T3V0cHV0SW1wbC5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL1RhZ2xldE91dHB1dEltcGwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDksIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTMwLDEzICszMCwxOCBAQAogLyoqCiAgKiBUaGUgb3V0cHV0IGZvciBIVE1MIHRhZ2xldHMuCiAgKgorICogIDxwPjxiPlRoaXMgaXMgTk9UIHBhcnQgb2YgYW55IHN1cHBvcnRlZCBBUEkuCisgKiAgSWYgeW91IHdyaXRlIGNvZGUgdGhhdCBkZXBlbmRzIG9uIHRoaXMsIHlvdSBkbyBzbyBhdCB5b3VyIG93biByaXNrLgorICogIFRoaXMgY29kZSBhbmQgaXRzIGludGVybmFsIGludGVyZmFjZXMgYXJlIHN1YmplY3QgdG8gY2hhbmdlIG9yCisgKiAgZGVsZXRpb24gd2l0aG91dCBub3RpY2UuPC9iPgorICoKICAqIEBzaW5jZSAxLjUKICAqIEBhdXRob3IgSmFtaWUgSG8KICAqLwogCiBwdWJsaWMgY2xhc3MgVGFnbGV0T3V0cHV0SW1wbCBpbXBsZW1lbnRzIFRhZ2xldE91dHB1dCB7CiAKLSAgICBwcml2YXRlIFN0cmluZ0J1ZmZlciBvdXRwdXQ7CisgICAgcHJpdmF0ZSBTdHJpbmdCdWlsZGVyIG91dHB1dDsKIAogICAgIHB1YmxpYyBUYWdsZXRPdXRwdXRJbXBsKFN0cmluZyBvKSB7CiAgICAgICAgIHNldE91dHB1dChvKTsKQEAgLTQ2LDcgKzUxLDcgQEAKICAgICAgKiB7QGluaGVyaXREb2N9CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0T3V0cHV0IChPYmplY3QgbykgewotICAgICAgICBvdXRwdXQgPSBuZXcgU3RyaW5nQnVmZmVyKG8gPT0gbnVsbCA/ICIiIDogKFN0cmluZykgbyk7CisgICAgICAgIG91dHB1dCA9IG5ldyBTdHJpbmdCdWlsZGVyKG8gPT0gbnVsbCA/ICIiIDogKFN0cmluZykgbyk7CiAgICAgfQogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9UYWdsZXRXcml0ZXJJbXBsLmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9UYWdsZXRXcml0ZXJJbXBsLmphdmEKaW5kZXggZjBiNDk3OC4uOTI0NzhlMiAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9mb3JtYXRzL2h0bWwvVGFnbGV0V3JpdGVySW1wbC5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL1RhZ2xldFdyaXRlckltcGwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTEsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTM0LDYgKzM0LDExIEBACiAvKioKICAqIFRoZSB0YWdsZXQgd3JpdGVyIHRoYXQgd3JpdGVzIEhUTUwuCiAgKgorICogIDxwPjxiPlRoaXMgaXMgTk9UIHBhcnQgb2YgYW55IHN1cHBvcnRlZCBBUEkuCisgKiAgSWYgeW91IHdyaXRlIGNvZGUgdGhhdCBkZXBlbmRzIG9uIHRoaXMsIHlvdSBkbyBzbyBhdCB5b3VyIG93biByaXNrLgorICogIFRoaXMgY29kZSBhbmQgaXRzIGludGVybmFsIGludGVyZmFjZXMgYXJlIHN1YmplY3QgdG8gY2hhbmdlIG9yCisgKiAgZGVsZXRpb24gd2l0aG91dCBub3RpY2UuPC9iPgorICoKICAqIEBzaW5jZSAxLjUKICAqIEBhdXRob3IgSmFtaWUgSG8KICAqIEBhdXRob3IgQmhhdmVzaCBQYXRlbCAoTW9kaWZpZWQpCkBAIC02OSw3ICs3NCw3IEBACiAgICAgICoge0Bpbmhlcml0RG9jfQogICAgICAqLwogICAgIHB1YmxpYyBUYWdsZXRPdXRwdXQgZGVwcmVjYXRlZFRhZ091dHB1dChEb2MgZG9jKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBvdXRwdXQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgb3V0cHV0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKICAgICAgICAgVGFnW10gZGVwcnMgPSBkb2MudGFncygiZGVwcmVjYXRlZCIpOwogICAgICAgICBpZiAoZG9jIGluc3RhbmNlb2YgQ2xhc3NEb2MpIHsKICAgICAgICAgICAgIGlmIChVdGlsLmlzRGVwcmVjYXRlZCgoUHJvZ3JhbUVsZW1lbnREb2MpIGRvYykpIHsKQEAgLTEyMCw5ICsxMjUsOSBAQAogICAgICAqIHtAaW5oZXJpdERvY30KICAgICAgKi8KICAgICBwdWJsaWMgVGFnbGV0T3V0cHV0IGdldFBhcmFtSGVhZGVyKFN0cmluZyBoZWFkZXIpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgU3RyaW5nQnVpbGRlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogICAgICAgICByZXN1bHQuYXBwZW5kKCI8ZHQ+Iik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIjxzcGFuIGNsYXNzPVwic3Ryb25nXCI+IiArICBoZWFkZXIgKyAiPC9zcGFuPjwvZHQ+Iik7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIjxzcGFuIGNsYXNzPVwic3Ryb25nXCI+IikuYXBwZW5kKGhlYWRlcikuYXBwZW5kKCI8L3NwYW4+PC9kdD4iKTsKICAgICAgICAgcmV0dXJuIG5ldyBUYWdsZXRPdXRwdXRJbXBsKHJlc3VsdC50b1N0cmluZygpKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL1RyZWVXcml0ZXIuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL1RyZWVXcml0ZXIuamF2YQppbmRleCBlMTE2ZmU0Li43ZGFiNDVjIDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9UcmVlV3JpdGVyLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9mb3JtYXRzL2h0bWwvVHJlZVdyaXRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMTk5NywgMjAxMSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5NywgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjgsOSArMjgsOSBAQAogaW1wb3J0IGphdmEuaW8uKjsKIAogaW1wb3J0IGNvbS5zdW4uamF2YWRvYy4qOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0LnV0aWwuKjsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmRvY2xldHMuZm9ybWF0cy5odG1sLm1hcmt1cC4qOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0Lio7CitpbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQudXRpbC4qOwogCiAvKioKICAqIEdlbmVyYXRlIENsYXNzIEhpZXJhcmNoeSBwYWdlIGZvciBhbGwgdGhlIENsYXNzZXMgaW4gdGhpcyBydW4uICBVc2UKQEAgLTM4LDYgKzM4LDExIEBACiAgKiB0aGUgZ2VuZXJhdGVkIGZpbGUgaXMgIm92ZXJ2aWV3LXRyZWUuaHRtbCIgYW5kIGl0IGlzIGdlbmVyYXRlZCBpbiB0aGUKICAqIGN1cnJlbnQgb3IgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeS4KICAqCisgKiAgPHA+PGI+VGhpcyBpcyBOT1QgcGFydCBvZiBhbnkgc3VwcG9ydGVkIEFQSS4KKyAqICBJZiB5b3Ugd3JpdGUgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhpcywgeW91IGRvIHNvIGF0IHlvdXIgb3duIHJpc2suCisgKiAgVGhpcyBjb2RlIGFuZCBpdHMgaW50ZXJuYWwgaW50ZXJmYWNlcyBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugb3IKKyAqICBkZWxldGlvbiB3aXRob3V0IG5vdGljZS48L2I+CisgKgogICogQGF1dGhvciBBdHVsIE0gRGFtYmFsa2FyCiAgKiBAYXV0aG9yIEJoYXZlc2ggUGF0ZWwgKE1vZGlmaWVkKQogICovCmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9Xcml0ZXJGYWN0b3J5SW1wbC5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9mb3JtYXRzL2h0bWwvV3JpdGVyRmFjdG9yeUltcGwuamF2YQppbmRleCA5OWMwZmIwLi41NzNhYmUwIDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9Xcml0ZXJGYWN0b3J5SW1wbC5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL1dyaXRlckZhY3RvcnlJbXBsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwxMyArMjUsMTggQEAKIAogcGFja2FnZSBjb20uc3VuLnRvb2xzLmRvY2xldHMuZm9ybWF0cy5odG1sOwogCitpbXBvcnQgY29tLnN1bi5qYXZhZG9jLio7CiBpbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQuKjsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC51dGlsLio7Ci1pbXBvcnQgY29tLnN1bi5qYXZhZG9jLio7CiAKIC8qKgogICogVGhlIGZhY3RvcnkgdGhhdCByZXR1cm5zIEhUTUwgd3JpdGVycy4KICAqCisgKiAgPHA+PGI+VGhpcyBpcyBOT1QgcGFydCBvZiBhbnkgc3VwcG9ydGVkIEFQSS4KKyAqICBJZiB5b3Ugd3JpdGUgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhpcywgeW91IGRvIHNvIGF0IHlvdXIgb3duIHJpc2suCisgKiAgVGhpcyBjb2RlIGFuZCBpdHMgaW50ZXJuYWwgaW50ZXJmYWNlcyBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugb3IKKyAqICBkZWxldGlvbiB3aXRob3V0IG5vdGljZS48L2I+CisgKgogICogQGF1dGhvciBKYW1pZSBIbwogICogQHNpbmNlIDEuNQogICovCmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9tYXJrdXAvQ29tbWVudC5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9mb3JtYXRzL2h0bWwvbWFya3VwL0NvbW1lbnQuamF2YQppbmRleCA4NmZlYTEzLi41MzNjOWI3IDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9tYXJrdXAvQ29tbWVudC5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL21hcmt1cC9Db21tZW50LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwxNSArMjUsMjMgQEAKIAogcGFja2FnZSBjb20uc3VuLnRvb2xzLmRvY2xldHMuZm9ybWF0cy5odG1sLm1hcmt1cDsKIAoraW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CisKIGltcG9ydCBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC5Db250ZW50OwogaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0LnV0aWwuKjsKIAogLyoqCiAgKiBDbGFzcyBmb3IgZ2VuZXJhdGluZyBhIGNvbW1lbnQgZm9yIEhUTUwgcGFnZXMgb2YgamF2YWRvYyBvdXRwdXQuCiAgKgorICogIDxwPjxiPlRoaXMgaXMgTk9UIHBhcnQgb2YgYW55IHN1cHBvcnRlZCBBUEkuCisgKiAgSWYgeW91IHdyaXRlIGNvZGUgdGhhdCBkZXBlbmRzIG9uIHRoaXMsIHlvdSBkbyBzbyBhdCB5b3VyIG93biByaXNrLgorICogIFRoaXMgY29kZSBhbmQgaXRzIGludGVybmFsIGludGVyZmFjZXMgYXJlIHN1YmplY3QgdG8gY2hhbmdlIG9yCisgKiAgZGVsZXRpb24gd2l0aG91dCBub3RpY2UuPC9iPgorICoKICAqIEBhdXRob3IgQmhhdmVzaCBQYXRlbAogICovCi1wdWJsaWMgY2xhc3MgQ29tbWVudCBleHRlbmRzIENvbnRlbnR7CitwdWJsaWMgY2xhc3MgQ29tbWVudCBleHRlbmRzIENvbnRlbnQgewogCiAgICAgcHJpdmF0ZSBTdHJpbmcgY29tbWVudFRleHQ7CiAKQEAgLTgwLDExICs4OCwxMyBAQAogICAgIC8qKgogICAgICAqIHtAaW5oZXJpdERvY30KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3cml0ZShTdHJpbmdCdWlsZGVyIGNvbnRlbnRCdWlsZGVyKSB7Ci0gICAgICAgIGlmICghZW5kc1dpdGhOZXdMaW5lKGNvbnRlbnRCdWlsZGVyKSkKLSAgICAgICAgICAgIGNvbnRlbnRCdWlsZGVyLmFwcGVuZChEb2NsZXRDb25zdGFudHMuTkwpOwotICAgICAgICBjb250ZW50QnVpbGRlci5hcHBlbmQoIjwhLS0gIik7Ci0gICAgICAgIGNvbnRlbnRCdWlsZGVyLmFwcGVuZChjb21tZW50VGV4dCk7Ci0gICAgICAgIGNvbnRlbnRCdWlsZGVyLmFwcGVuZCgiIC0tPiIgKyBEb2NsZXRDb25zdGFudHMuTkwpOworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHdyaXRlKFdyaXRlciBvdXQsIGJvb2xlYW4gYXROZXdsaW5lKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoIWF0TmV3bGluZSkKKyAgICAgICAgICAgIG91dC53cml0ZShEb2NsZXRDb25zdGFudHMuTkwpOworICAgICAgICBvdXQud3JpdGUoIjwhLS0gIik7CisgICAgICAgIG91dC53cml0ZShjb21tZW50VGV4dCk7CisgICAgICAgIG91dC53cml0ZSgiIC0tPiIgKyBEb2NsZXRDb25zdGFudHMuTkwpOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9tYXJrdXAvRG9jVHlwZS5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9mb3JtYXRzL2h0bWwvbWFya3VwL0RvY1R5cGUuamF2YQppbmRleCAwMzI2NWQyLi5lOTIzMzMzIDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9tYXJrdXAvRG9jVHlwZS5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL21hcmt1cC9Eb2NUeXBlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwxMiArMjUsMjAgQEAKIAogcGFja2FnZSBjb20uc3VuLnRvb2xzLmRvY2xldHMuZm9ybWF0cy5odG1sLm1hcmt1cDsKIAoraW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CisKIGltcG9ydCBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC5Db250ZW50OwogaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0LnV0aWwuKjsKIAogLyoqCiAgKiBDbGFzcyBmb3IgZ2VuZXJhdGluZyBkb2N1bWVudCB0eXBlIGZvciBIVE1MIHBhZ2VzIG9mIGphdmFkb2Mgb3V0cHV0LgogICoKKyAqICA8cD48Yj5UaGlzIGlzIE5PVCBwYXJ0IG9mIGFueSBzdXBwb3J0ZWQgQVBJLgorICogIElmIHlvdSB3cml0ZSBjb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGlzLCB5b3UgZG8gc28gYXQgeW91ciBvd24gcmlzay4KKyAqICBUaGlzIGNvZGUgYW5kIGl0cyBpbnRlcm5hbCBpbnRlcmZhY2VzIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSBvcgorICogIGRlbGV0aW9uIHdpdGhvdXQgbm90aWNlLjwvYj4KKyAqCiAgKiBAYXV0aG9yIEJoYXZlc2ggUGF0ZWwKICAqLwogcHVibGljIGNsYXNzIERvY1R5cGUgZXh0ZW5kcyBDb250ZW50ewpAQCAtMTA3LDcgKzExNSw5IEBACiAgICAgLyoqCiAgICAgICoge0Bpbmhlcml0RG9jfQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHdyaXRlKFN0cmluZ0J1aWxkZXIgY29udGVudEJ1aWxkZXIpIHsKLSAgICAgICAgY29udGVudEJ1aWxkZXIuYXBwZW5kKGRvY1R5cGUpOworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHdyaXRlKFdyaXRlciBvdXQsIGJvb2xlYW4gYXROZXdsaW5lKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBvdXQud3JpdGUoZG9jVHlwZSk7CisgICAgICAgIHJldHVybiB0cnVlOyAvLyBndWFyYW50ZWVkIGJ5IGNvbnN0cnVjdG9yCiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9mb3JtYXRzL2h0bWwvbWFya3VwL0h0bWxBdHRyLmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9tYXJrdXAvSHRtbEF0dHIuamF2YQppbmRleCA5Njg5NTUzLi42MmIwZjYwIDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9tYXJrdXAvSHRtbEF0dHIuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9tYXJrdXAvSHRtbEF0dHIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI4LDYgKzI4LDExIEBACiAvKioKICAqIEVudW0gcmVwcmVzZW50aW5nIEhUTUwgdGFnIGF0dHJpYnV0ZXMuCiAgKgorICogIDxwPjxiPlRoaXMgaXMgTk9UIHBhcnQgb2YgYW55IHN1cHBvcnRlZCBBUEkuCisgKiAgSWYgeW91IHdyaXRlIGNvZGUgdGhhdCBkZXBlbmRzIG9uIHRoaXMsIHlvdSBkbyBzbyBhdCB5b3VyIG93biByaXNrLgorICogIFRoaXMgY29kZSBhbmQgaXRzIGludGVybmFsIGludGVyZmFjZXMgYXJlIHN1YmplY3QgdG8gY2hhbmdlIG9yCisgKiAgZGVsZXRpb24gd2l0aG91dCBub3RpY2UuPC9iPgorICoKICAqIEBhdXRob3IgQmhhdmVzaCBQYXRlbAogICovCiBwdWJsaWMgZW51bSBIdG1sQXR0ciB7CmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9tYXJrdXAvSHRtbENvbnN0YW50cy5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9mb3JtYXRzL2h0bWwvbWFya3VwL0h0bWxDb25zdGFudHMuamF2YQppbmRleCBjODU5MjdlLi44YjRiNDAwIDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9tYXJrdXAvSHRtbENvbnN0YW50cy5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL21hcmt1cC9IdG1sQ29uc3RhbnRzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0zMCw2ICszMCwxMSBAQAogLyoqCiAgKiBTdG9yZXMgY29uc3RhbnRzIGZvciBIdG1sIERvY2xldC4KICAqCisgKiAgPHA+PGI+VGhpcyBpcyBOT1QgcGFydCBvZiBhbnkgc3VwcG9ydGVkIEFQSS4KKyAqICBJZiB5b3Ugd3JpdGUgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhpcywgeW91IGRvIHNvIGF0IHlvdXIgb3duIHJpc2suCisgKiAgVGhpcyBjb2RlIGFuZCBpdHMgaW50ZXJuYWwgaW50ZXJmYWNlcyBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugb3IKKyAqICBkZWxldGlvbiB3aXRob3V0IG5vdGljZS48L2I+CisgKgogICogQGF1dGhvciBCaGF2ZXNoIFBhdGVsCiAgKi8KIHB1YmxpYyBjbGFzcyBIdG1sQ29uc3RhbnRzIHsKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL21hcmt1cC9IdG1sRG9jV3JpdGVyLmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9tYXJrdXAvSHRtbERvY1dyaXRlci5qYXZhCmluZGV4IDk3OWM3MmIuLjRhZjY1MGQgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL21hcmt1cC9IdG1sRG9jV3JpdGVyLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9mb3JtYXRzL2h0bWwvbWFya3VwL0h0bWxEb2NXcml0ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTcsIDIwMTAsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI5LDYgKzI5LDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuKjsKIAogaW1wb3J0IGNvbS5zdW4uamF2YWRvYy4qOworaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5mb3JtYXRzLmh0bWwuQ29uZmlndXJhdGlvbkltcGw7CiBpbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQuKjsKIAogCkBAIC0zOCw2ICszOSwxMSBAQAogICogYXJlIHVzZWQgYnkgdGhlIFN1Yi1DbGFzc2VzIGluIHRoZSBwYWNrYWdlIGNvbS5zdW4udG9vbHMuZG9jbGV0cy5zdGFuZGFyZAogICogYW5kIGNvbS5zdW4udG9vbHMuZG9jbGV0cy5vbmVvbmUuCiAgKgorICogIDxwPjxiPlRoaXMgaXMgTk9UIHBhcnQgb2YgYW55IHN1cHBvcnRlZCBBUEkuCisgKiAgSWYgeW91IHdyaXRlIGNvZGUgdGhhdCBkZXBlbmRzIG9uIHRoaXMsIHlvdSBkbyBzbyBhdCB5b3VyIG93biByaXNrLgorICogIFRoaXMgY29kZSBhbmQgaXRzIGludGVybmFsIGludGVyZmFjZXMgYXJlIHN1YmplY3QgdG8gY2hhbmdlIG9yCisgKiAgZGVsZXRpb24gd2l0aG91dCBub3RpY2UuPC9iPgorICoKICAqIEBzaW5jZSAxLjIKICAqIEBhdXRob3IgQXR1bCBNIERhbWJhbGthcgogICogQGF1dGhvciBSb2JlcnQgRmllbGQKQEAgLTc3LDQ4ICs4Myw2IEBACiAgICAgcHVibGljIGFic3RyYWN0IENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbigpOwogCiAgICAgLyoqCi0gICAgICogUHJpbnQgSHRtbCBIeXBlciBMaW5rLgotICAgICAqCi0gICAgICogQHBhcmFtIGxpbmsgU3RyaW5nIG5hbWUgb2YgdGhlIGZpbGUuCi0gICAgICogQHBhcmFtIHdoZXJlIFBvc2l0aW9uIG9mIHRoZSBsaW5rIGluIHRoZSBmaWxlLiBDaGFyYWN0ZXIgJyMnIGlzIG5vdAotICAgICAqIG5lZWRlZC4KLSAgICAgKiBAcGFyYW0gbGFiZWwgVGFnIGZvciB0aGUgbGluay4KLSAgICAgKiBAcGFyYW0gc3Ryb25nICBCb29sZWFuIHRoYXQgc2V0cyBsYWJlbCB0byBzdHJvbmcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHJpbnRIeXBlckxpbmsoU3RyaW5nIGxpbmssIFN0cmluZyB3aGVyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWwsIGJvb2xlYW4gc3Ryb25nKSB7Ci0gICAgICAgIHByaW50KGdldEh5cGVyTGlua1N0cmluZyhsaW5rLCB3aGVyZSwgbGFiZWwsIHN0cm9uZywgIiIsICIiLCAiIikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50IEh0bWwgSHlwZXIgTGluay4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsaW5rIFN0cmluZyBuYW1lIG9mIHRoZSBmaWxlLgotICAgICAqIEBwYXJhbSB3aGVyZSBQb3NpdGlvbiBvZiB0aGUgbGluayBpbiB0aGUgZmlsZS4gQ2hhcmFjdGVyICcjJyBpcyBub3QKLSAgICAgKiBuZWVkZWQuCi0gICAgICogQHBhcmFtIGxhYmVsIFRhZyBmb3IgdGhlIGxpbmsuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHJpbnRIeXBlckxpbmsoU3RyaW5nIGxpbmssIFN0cmluZyB3aGVyZSwgU3RyaW5nIGxhYmVsKSB7Ci0gICAgICAgIHByaW50SHlwZXJMaW5rKGxpbmssIHdoZXJlLCBsYWJlbCwgZmFsc2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50IEh0bWwgSHlwZXIgTGluay4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsaW5rICAgICAgIFN0cmluZyBuYW1lIG9mIHRoZSBmaWxlLgotICAgICAqIEBwYXJhbSB3aGVyZSAgICAgIFBvc2l0aW9uIG9mIHRoZSBsaW5rIGluIHRoZSBmaWxlLiBDaGFyYWN0ZXIgJyMnIGlzIG5vdAotICAgICAqIG5lZWRlZC4KLSAgICAgKiBAcGFyYW0gbGFiZWwgICAgICBUYWcgZm9yIHRoZSBsaW5rLgotICAgICAqIEBwYXJhbSBzdHJvbmcgICAgICAgQm9vbGVhbiB0aGF0IHNldHMgbGFiZWwgdG8gc3Ryb25nLgotICAgICAqIEBwYXJhbSBzdHlsZW5hbWUgIFN0cmluZyBzdHlsZSBvZiB0ZXh0IGRlZmluZWQgaW4gc3R5bGUgc2hlZXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHJpbnRIeXBlckxpbmsoU3RyaW5nIGxpbmssIFN0cmluZyB3aGVyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWwsIGJvb2xlYW4gc3Ryb25nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzdHlsZW5hbWUpIHsKLSAgICAgICAgcHJpbnQoZ2V0SHlwZXJMaW5rU3RyaW5nKGxpbmssIHdoZXJlLCBsYWJlbCwgc3Ryb25nLCBzdHlsZW5hbWUsICIiLCAiIikpOwotICAgIH0KLQotICAgIC8qKgogICAgICAqIFJldHVybiBIdG1sIEh5cGVyIExpbmsgc3RyaW5nLgogICAgICAqCiAgICAgICogQHBhcmFtIGxpbmsgICAgICAgU3RyaW5nIG5hbWUgb2YgdGhlIGZpbGUuCkBAIC0xODAsNyArMTQ0LDcgQEAKICAgICBwdWJsaWMgU3RyaW5nIGdldEh5cGVyTGlua1N0cmluZyhTdHJpbmcgbGluaywgU3RyaW5nIHdoZXJlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbCwgYm9vbGVhbiBzdHJvbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHN0eWxlbmFtZSwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgdGFyZ2V0KSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciByZXRsaW5rID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBTdHJpbmdCdWlsZGVyIHJldGxpbmsgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogICAgICAgICByZXRsaW5rLmFwcGVuZCgiPGEgaHJlZj1cIiIpOwogICAgICAgICByZXRsaW5rLmFwcGVuZChsaW5rKTsKICAgICAgICAgaWYgKHdoZXJlICE9IG51bGwgJiYgd2hlcmUubGVuZ3RoKCkgIT0gMCkgewpAQCAtMTg5LDEwICsxNTMsMTAgQEAKICAgICAgICAgfQogICAgICAgICByZXRsaW5rLmFwcGVuZCgiXCIiKTsKICAgICAgICAgaWYgKHRpdGxlICE9IG51bGwgJiYgdGl0bGUubGVuZ3RoKCkgIT0gMCkgewotICAgICAgICAgICAgcmV0bGluay5hcHBlbmQoIiB0aXRsZT1cIiIgKyB0aXRsZSArICJcIiIpOworICAgICAgICAgICAgcmV0bGluay5hcHBlbmQoIiB0aXRsZT1cIiIpLmFwcGVuZCh0aXRsZSkuYXBwZW5kKCJcIiIpOwogICAgICAgICB9CiAgICAgICAgIGlmICh0YXJnZXQgIT0gbnVsbCAmJiB0YXJnZXQubGVuZ3RoKCkgIT0gMCkgewotICAgICAgICAgICAgcmV0bGluay5hcHBlbmQoIiB0YXJnZXQ9XCIiICsgdGFyZ2V0ICsgIlwiIik7CisgICAgICAgICAgICByZXRsaW5rLmFwcGVuZCgiIHRhcmdldD1cIiIpLmFwcGVuZCh0YXJnZXQpLmFwcGVuZCgiXCIiKTsKICAgICAgICAgfQogICAgICAgICByZXRsaW5rLmFwcGVuZCgiPiIpOwogICAgICAgICBpZiAoc3R5bGVuYW1lICE9IG51bGwgJiYgc3R5bGVuYW1lLmxlbmd0aCgpICE9IDApIHsKQEAgLTI2MywxNSArMjI3LDYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQcmludCB0aGUgbmFtZSBvZiB0aGUgcGFja2FnZSwgdGhpcyBjbGFzcyBpcyBpbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjZCAgICBDbGFzc0RvYy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwcmludFBrZ05hbWUoQ2xhc3NEb2MgY2QpIHsKLSAgICAgICAgcHJpbnQoZ2V0UGtnTmFtZShjZCkpOwotICAgIH0KLQotICAgIC8qKgogICAgICAqIEdldCB0aGUgbmFtZSBvZiB0aGUgcGFja2FnZSwgdGhpcyBjbGFzcyBpcyBpbi4KICAgICAgKgogICAgICAqIEBwYXJhbSBjZCAgICBDbGFzc0RvYy4KQEAgLTI4NSwyNyArMjQwLDYgQEAKICAgICAgICAgcmV0dXJuICIiOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIEtlZXAgdHJhY2sgb2YgbWVtYmVyIGRldGFpbHMgbGlzdC4gUHJpbnQgdGhlIGRlZmluaXRpb24gbGlzdCBzdGFydCB0YWcKLSAgICAgKiBpZiBpdCBpcyBub3QgcHJpbnRlZCB5ZXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHJpbnRNZW1iZXJEZXRhaWxzTGlzdFN0YXJ0VGFnICgpIHsKLSAgICAgICAgaWYgKCFnZXRNZW1iZXJEZXRhaWxzTGlzdFByaW50ZWQoKSkgewotICAgICAgICAgICAgZGwoKTsKLSAgICAgICAgICAgIG1lbWJlckRldGFpbHNMaXN0UHJpbnRlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludCB0aGUgZGVmaW5pdGlvbiBsaXN0IGVuZCB0YWcgaWYgdGhlIGxpc3Qgc3RhcnQgdGFnIHdhcyBwcmludGVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHByaW50TWVtYmVyRGV0YWlsc0xpc3RFbmRUYWcgKCkgewotICAgICAgICBpZiAoZ2V0TWVtYmVyRGV0YWlsc0xpc3RQcmludGVkKCkpIHsKLSAgICAgICAgICAgIGRsRW5kKCk7Ci0gICAgICAgICAgICBtZW1iZXJEZXRhaWxzTGlzdFByaW50ZWQgPSBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQogICAgIHB1YmxpYyBib29sZWFuIGdldE1lbWJlckRldGFpbHNMaXN0UHJpbnRlZCgpIHsKICAgICAgICAgcmV0dXJuIG1lbWJlckRldGFpbHNMaXN0UHJpbnRlZDsKICAgICB9CkBAIC0zMTksMTIgKzI1MywxMiBAQAogICAgICAqIEBwYXJhbSBmcmFtZXNldCB0aGUgZnJhbWVzZXQgdG8gYmUgYWRkZWQgdG8gdGhlIEhUTUwgZG9jdW1lbnQKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBwcmludEZyYW1lc2V0RG9jdW1lbnQoU3RyaW5nIHRpdGxlLCBib29sZWFuIG5vVGltZVN0YW1wLAotICAgICAgICAgICAgQ29udGVudCBmcmFtZXNldCkgeworICAgICAgICAgICAgQ29udGVudCBmcmFtZXNldCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgQ29udGVudCBodG1sRG9jVHlwZSA9IERvY1R5cGUuRnJhbWVzZXQoKTsKICAgICAgICAgQ29udGVudCBodG1sQ29tbWVudCA9IG5ldyBDb21tZW50KGNvbmZpZ3VyYXRpb24uZ2V0VGV4dCgiZG9jbGV0Lk5ld19QYWdlIikpOwogICAgICAgICBDb250ZW50IGhlYWQgPSBuZXcgSHRtbFRyZWUoSHRtbFRhZy5IRUFEKTsKICAgICAgICAgaWYgKCEgbm9UaW1lU3RhbXApIHsKLSAgICAgICAgICAgIENvbnRlbnQgaGVhZENvbW1lbnQgPSBuZXcgQ29tbWVudCgiR2VuZXJhdGVkIGJ5IGphdmFkb2Mgb24gIiArIHRvZGF5KCkpOworICAgICAgICAgICAgQ29udGVudCBoZWFkQ29tbWVudCA9IG5ldyBDb21tZW50KGdldEdlbmVyYXRlZEJ5U3RyaW5nKCkpOwogICAgICAgICAgICAgaGVhZC5hZGRDb250ZW50KGhlYWRDb21tZW50KTsKICAgICAgICAgfQogICAgICAgICBpZiAoY29uZmlndXJhdGlvbi5jaGFyc2V0Lmxlbmd0aCgpID4gMCkgewpAQCAtMzM5LDcgKzI3Myw3IEBACiAgICAgICAgICAgICAgICAgaGVhZCwgZnJhbWVzZXQpOwogICAgICAgICBDb250ZW50IGh0bWxEb2N1bWVudCA9IG5ldyBIdG1sRG9jdW1lbnQoaHRtbERvY1R5cGUsCiAgICAgICAgICAgICAgICAgaHRtbENvbW1lbnQsIGh0bWxUcmVlKTsKLSAgICAgICAgcHJpbnQoaHRtbERvY3VtZW50LnRvU3RyaW5nKCkpOworICAgICAgICB3cml0ZShodG1sRG9jdW1lbnQpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMzU2LDQ2ICsyOTAsOSBAQAogICAgICAgICByZXR1cm4gc3BhY2U7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogUHJpbnQgdGhlIGNsb3NpbmcgJmx0Oy9ib2R5Jmd0OyBhbmQgJmx0Oy9odG1sJmd0OyB0YWdzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHByaW50Qm9keUh0bWxFbmQoKSB7Ci0gICAgICAgIHByaW50bG4oKTsKLSAgICAgICAgYm9keUVuZCgpOwotICAgICAgICBodG1sRW5kKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbHMge0BsaW5rICNwcmludEJvZHlIdG1sRW5kKCl9IG1ldGhvZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwcmludEZvb3RlcigpIHsKLSAgICAgICAgcHJpbnRCb2R5SHRtbEVuZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50IGNsb3NpbmcgJmx0Oy9odG1sJmd0OyB0YWcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHJpbnRGcmFtZUZvb3RlcigpIHsKLSAgICAgICAgaHRtbEVuZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50IHRlbiBub24tYnJlYWtpbmcgc3BhY2VzKCImIzM4O25ic3A7IikuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHJpbnROYnNwcygpIHsKLSAgICAgICAgcHJpbnQoIiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgZGF5IGFuZCBkYXRlIGluZm9ybWF0aW9uIGZvciB0b2RheSwgZGVwZW5kaW5nIHVwb24gdXNlciBvcHRpb24uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFN0cmluZyBUb2RheS4KLSAgICAgKiBAc2VlIGphdmEudXRpbC5DYWxlbmRhcgotICAgICAqIEBzZWUgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyCi0gICAgICogQHNlZSBqYXZhLnV0aWwuVGltZVpvbmUKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvZGF5KCkgeworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0R2VuZXJhdGVkQnlTdHJpbmcoKSB7CiAgICAgICAgIENhbGVuZGFyIGNhbGVuZGFyID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKFRpbWVab25lLmdldERlZmF1bHQoKSk7Ci0gICAgICAgIHJldHVybiBjYWxlbmRhci5nZXRUaW1lKCkudG9TdHJpbmcoKTsKKyAgICAgICAgRGF0ZSB0b2RheSA9IGNhbGVuZGFyLmdldFRpbWUoKTsKKyAgICAgICAgcmV0dXJuICJHZW5lcmF0ZWQgYnkgamF2YWRvYyAoIisgQ29uZmlndXJhdGlvbkltcGwuQlVJTERfREFURSArICIpIG9uICIgKyB0b2RheTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9tYXJrdXAvSHRtbERvY3VtZW50LmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9tYXJrdXAvSHRtbERvY3VtZW50LmphdmEKaW5kZXggNDU4YzE3NC4uYjYyZmU3NSAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9mb3JtYXRzL2h0bWwvbWFya3VwL0h0bWxEb2N1bWVudC5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL21hcmt1cC9IdG1sRG9jdW1lbnQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDEzICsyNSwyMSBAQAogCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuZG9jbGV0cy5mb3JtYXRzLmh0bWwubWFya3VwOwogCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKIGltcG9ydCBqYXZhLnV0aWwuKjsKKwogaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0LkNvbnRlbnQ7CiBpbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQudXRpbC4qOwogCiAvKioKICAqIENsYXNzIGZvciBnZW5lcmF0aW5nIGFuIEhUTUwgZG9jdW1lbnQgZm9yIGphdmFkb2Mgb3V0cHV0LgogICoKKyAqICA8cD48Yj5UaGlzIGlzIE5PVCBwYXJ0IG9mIGFueSBzdXBwb3J0ZWQgQVBJLgorICogIElmIHlvdSB3cml0ZSBjb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGlzLCB5b3UgZG8gc28gYXQgeW91ciBvd24gcmlzay4KKyAqICBUaGlzIGNvZGUgYW5kIGl0cyBpbnRlcm5hbCBpbnRlcmZhY2VzIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSBvcgorICogIGRlbGV0aW9uIHdpdGhvdXQgbm90aWNlLjwvYj4KKyAqCiAgKiBAYXV0aG9yIEJoYXZlc2ggUGF0ZWwKICAqLwogcHVibGljIGNsYXNzIEh0bWxEb2N1bWVudCBleHRlbmRzIENvbnRlbnQgewpAQCAtNjksNyArNzcsNyBAQAogICAgICAqCiAgICAgICogQHBhcmFtIGh0bWxDb250ZW50IGh0bWwgY29udGVudCB0byBiZSBhZGRlZAogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZENvbnRlbnQoQ29udGVudCBodG1sQ29udGVudCkgeworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGFkZENvbnRlbnQoQ29udGVudCBodG1sQ29udGVudCkgewogICAgICAgICBpZiAoaHRtbENvbnRlbnQuaXNWYWxpZCgpKQogICAgICAgICAgICAgZG9jQ29udGVudC5hZGQoaHRtbENvbnRlbnQpOwogICAgIH0KQEAgLTk2LDggKzEwNCw5IEBACiAgICAgLyoqCiAgICAgICoge0Bpbmhlcml0RG9jfQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHdyaXRlKFN0cmluZ0J1aWxkZXIgY29udGVudEJ1aWxkZXIpIHsKKyAgICBwdWJsaWMgYm9vbGVhbiB3cml0ZShXcml0ZXIgb3V0LCAgYm9vbGVhbiBhdE5ld2xpbmUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGZvciAoQ29udGVudCBjIDogZG9jQ29udGVudCkKLSAgICAgICAgICAgIGMud3JpdGUoY29udGVudEJ1aWxkZXIpOworICAgICAgICAgICAgYXROZXdsaW5lID0gYy53cml0ZShvdXQsIGF0TmV3bGluZSk7CisgICAgICAgIHJldHVybiBhdE5ld2xpbmU7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9mb3JtYXRzL2h0bWwvbWFya3VwL0h0bWxTdHlsZS5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9mb3JtYXRzL2h0bWwvbWFya3VwL0h0bWxTdHlsZS5qYXZhCmluZGV4IDhkNTNjNDYuLjYxYmI4MDAgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL21hcmt1cC9IdG1sU3R5bGUuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9tYXJrdXAvSHRtbFN0eWxlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yOCw2ICsyOCwxMSBAQAogLyoqCiAgKiBFbnVtIHJlcHJlc2VudGluZyBIVE1MIHN0eWxlcy4gVGhlIG5hbWUgbWFwIHRvIHZhbHVlcyBpbiB0aGUgQ1NTIGZpbGUuCiAgKgorICogIDxwPjxiPlRoaXMgaXMgTk9UIHBhcnQgb2YgYW55IHN1cHBvcnRlZCBBUEkuCisgKiAgSWYgeW91IHdyaXRlIGNvZGUgdGhhdCBkZXBlbmRzIG9uIHRoaXMsIHlvdSBkbyBzbyBhdCB5b3VyIG93biByaXNrLgorICogIFRoaXMgY29kZSBhbmQgaXRzIGludGVybmFsIGludGVyZmFjZXMgYXJlIHN1YmplY3QgdG8gY2hhbmdlIG9yCisgKiAgZGVsZXRpb24gd2l0aG91dCBub3RpY2UuPC9iPgorICoKICAqIEBhdXRob3IgQmhhdmVzaCBQYXRlbAogICovCiBwdWJsaWMgZW51bSBIdG1sU3R5bGUgewpkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9mb3JtYXRzL2h0bWwvbWFya3VwL0h0bWxUYWcuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL21hcmt1cC9IdG1sVGFnLmphdmEKaW5kZXggNmE1OGJiMC4uYTRlZTYzZCAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9mb3JtYXRzL2h0bWwvbWFya3VwL0h0bWxUYWcuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9tYXJrdXAvSHRtbFRhZy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjgsNiArMjgsMTEgQEAKIC8qKgogICogRW51bSByZXByZXNlbnRpbmcgSFRNTCB0YWdzLgogICoKKyAqICA8cD48Yj5UaGlzIGlzIE5PVCBwYXJ0IG9mIGFueSBzdXBwb3J0ZWQgQVBJLgorICogIElmIHlvdSB3cml0ZSBjb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGlzLCB5b3UgZG8gc28gYXQgeW91ciBvd24gcmlzay4KKyAqICBUaGlzIGNvZGUgYW5kIGl0cyBpbnRlcm5hbCBpbnRlcmZhY2VzIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSBvcgorICogIGRlbGV0aW9uIHdpdGhvdXQgbm90aWNlLjwvYj4KKyAqCiAgKiBAYXV0aG9yIEJoYXZlc2ggUGF0ZWwKICAqLwogcHVibGljIGVudW0gSHRtbFRhZyB7CmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9tYXJrdXAvSHRtbFRyZWUuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL21hcmt1cC9IdG1sVHJlZS5qYXZhCmluZGV4IGJhNmQ2MjMuLjk5NTQzZDEgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL21hcmt1cC9IdG1sVHJlZS5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL21hcmt1cC9IdG1sVHJlZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMTMgKzI1LDIxIEBACiAKIHBhY2thZ2UgY29tLnN1bi50b29scy5kb2NsZXRzLmZvcm1hdHMuaHRtbC5tYXJrdXA7CiAKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uV3JpdGVyOwogaW1wb3J0IGphdmEudXRpbC4qOworCiBpbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQuQ29udGVudDsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC51dGlsLio7CiAKIC8qKgogICogQ2xhc3MgZm9yIGdlbmVyYXRpbmcgSFRNTCB0cmVlIGZvciBqYXZhZG9jIG91dHB1dC4KICAqCisgKiAgPHA+PGI+VGhpcyBpcyBOT1QgcGFydCBvZiBhbnkgc3VwcG9ydGVkIEFQSS4KKyAqICBJZiB5b3Ugd3JpdGUgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhpcywgeW91IGRvIHNvIGF0IHlvdXIgb3duIHJpc2suCisgKiAgVGhpcyBjb2RlIGFuZCBpdHMgaW50ZXJuYWwgaW50ZXJmYWNlcyBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugb3IKKyAqICBkZWxldGlvbiB3aXRob3V0IG5vdGljZS48L2I+CisgKgogICogQGF1dGhvciBCaGF2ZXNoIFBhdGVsCiAgKi8KIHB1YmxpYyBjbGFzcyBIdG1sVHJlZSBleHRlbmRzIENvbnRlbnQgewpAQCAtNDIzLDkgKzQzMSw5IEBACiAgICAgLyoqCiAgICAgICogR2VuZXJhdGVzIGEgTUVUQSB0YWcgd2l0aCB0aGUgaHR0cC1lcXVpdiwgY29udGVudCBhbmQgY2hhcnNldCBhdHRyaWJ1dGVzLgogICAgICAqCi0gICAgICogQHBhcmFtIGh0dHAtZXF1aXYgaHR0cCBlcXVpdiBhdHRyaWJ1dGUgZm9yIHRoZSBNRVRBIHRhZworICAgICAqIEBwYXJhbSBodHRwRXF1aXYgaHR0cCBlcXVpdiBhdHRyaWJ1dGUgZm9yIHRoZSBNRVRBIHRhZwogICAgICAqIEBwYXJhbSBjb250ZW50IHR5cGUgb2YgY29udGVudAotICAgICAqIEBwYXJhbSBjaGFyc2V0IGNoYXJhY3RlciBzZXQgdXNlZAorICAgICAqIEBwYXJhbSBjaGFyU2V0IGNoYXJhY3RlciBzZXQgdXNlZAogICAgICAqIEByZXR1cm4gYW4gSHRtbFRyZWUgb2JqZWN0IGZvciB0aGUgTUVUQSB0YWcKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIEh0bWxUcmVlIE1FVEEoU3RyaW5nIGh0dHBFcXVpdiwgU3RyaW5nIGNvbnRlbnQsIFN0cmluZyBjaGFyU2V0KSB7CkBAIC03NTEsMzUgKzc1OSw0MSBAQAogICAgIC8qKgogICAgICAqIHtAaW5oZXJpdERvY30KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3cml0ZShTdHJpbmdCdWlsZGVyIGNvbnRlbnRCdWlsZGVyKSB7Ci0gICAgICAgIGlmICghaXNJbmxpbmUoKSAmJiAhZW5kc1dpdGhOZXdMaW5lKGNvbnRlbnRCdWlsZGVyKSkKLSAgICAgICAgICAgIGNvbnRlbnRCdWlsZGVyLmFwcGVuZChEb2NsZXRDb25zdGFudHMuTkwpOworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHdyaXRlKFdyaXRlciBvdXQsIGJvb2xlYW4gYXROZXdsaW5lKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoIWlzSW5saW5lKCkgJiYgIWF0TmV3bGluZSkKKyAgICAgICAgICAgIG91dC53cml0ZShEb2NsZXRDb25zdGFudHMuTkwpOwogICAgICAgICBTdHJpbmcgdGFnU3RyaW5nID0gaHRtbFRhZy50b1N0cmluZygpOwotICAgICAgICBjb250ZW50QnVpbGRlci5hcHBlbmQoIjwiKTsKLSAgICAgICAgY29udGVudEJ1aWxkZXIuYXBwZW5kKHRhZ1N0cmluZyk7CisgICAgICAgIG91dC53cml0ZSgiPCIpOworICAgICAgICBvdXQud3JpdGUodGFnU3RyaW5nKTsKICAgICAgICAgSXRlcmF0b3I8SHRtbEF0dHI+IGl0ZXJhdG9yID0gYXR0cnMua2V5U2V0KCkuaXRlcmF0b3IoKTsKICAgICAgICAgSHRtbEF0dHIga2V5OwogICAgICAgICBTdHJpbmcgdmFsdWUgPSAiIjsKICAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewogICAgICAgICAgICAga2V5ID0gaXRlcmF0b3IubmV4dCgpOwogICAgICAgICAgICAgdmFsdWUgPSBhdHRycy5nZXQoa2V5KTsKLSAgICAgICAgICAgIGNvbnRlbnRCdWlsZGVyLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgY29udGVudEJ1aWxkZXIuYXBwZW5kKGtleS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIG91dC53cml0ZSgiICIpOworICAgICAgICAgICAgb3V0LndyaXRlKGtleS50b1N0cmluZygpKTsKICAgICAgICAgICAgIGlmICghdmFsdWUuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgY29udGVudEJ1aWxkZXIuYXBwZW5kKCI9XCIiKTsKLSAgICAgICAgICAgICAgICBjb250ZW50QnVpbGRlci5hcHBlbmQodmFsdWUpOwotICAgICAgICAgICAgICAgIGNvbnRlbnRCdWlsZGVyLmFwcGVuZCgiXCIiKTsKKyAgICAgICAgICAgICAgICBvdXQud3JpdGUoIj1cIiIpOworICAgICAgICAgICAgICAgIG91dC53cml0ZSh2YWx1ZSk7CisgICAgICAgICAgICAgICAgb3V0LndyaXRlKCJcIiIpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGNvbnRlbnRCdWlsZGVyLmFwcGVuZCgiPiIpOworICAgICAgICBvdXQud3JpdGUoIj4iKTsKKyAgICAgICAgYm9vbGVhbiBubCA9IGZhbHNlOwogICAgICAgICBmb3IgKENvbnRlbnQgYyA6IGNvbnRlbnQpCi0gICAgICAgICAgICBjLndyaXRlKGNvbnRlbnRCdWlsZGVyKTsKKyAgICAgICAgICAgIG5sID0gYy53cml0ZShvdXQsIG5sKTsKICAgICAgICAgaWYgKGh0bWxUYWcuZW5kVGFnUmVxdWlyZWQoKSkgewotICAgICAgICAgICAgY29udGVudEJ1aWxkZXIuYXBwZW5kKCI8LyIpOwotICAgICAgICAgICAgY29udGVudEJ1aWxkZXIuYXBwZW5kKHRhZ1N0cmluZyk7Ci0gICAgICAgICAgICBjb250ZW50QnVpbGRlci5hcHBlbmQoIj4iKTsKKyAgICAgICAgICAgIG91dC53cml0ZSgiPC8iKTsKKyAgICAgICAgICAgIG91dC53cml0ZSh0YWdTdHJpbmcpOworICAgICAgICAgICAgb3V0LndyaXRlKCI+Iik7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKCFpc0lubGluZSgpKQotICAgICAgICAgICAgY29udGVudEJ1aWxkZXIuYXBwZW5kKERvY2xldENvbnN0YW50cy5OTCk7CisgICAgICAgIGlmICghaXNJbmxpbmUoKSkgeworICAgICAgICAgICAgb3V0LndyaXRlKERvY2xldENvbnN0YW50cy5OTCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL21hcmt1cC9IdG1sV3JpdGVyLmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9tYXJrdXAvSHRtbFdyaXRlci5qYXZhCmluZGV4IDE2NmY5ZWYuLjY0ZWE4NzYgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL21hcmt1cC9IdG1sV3JpdGVyLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9mb3JtYXRzL2h0bWwvbWFya3VwL0h0bWxXcml0ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTcsIDIwMTEsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTMyLDE0ICszMiwxOSBAQAogCiAvKioKICAqIENsYXNzIGZvciB0aGUgSHRtbCBmb3JtYXQgY29kZSBnZW5lcmF0aW9uLgotICogSW5pdGlsaXplcyBQcmludFdyaXRlciB3aXRoIEZpbGVXcml0ZXIsIHRvIGVuYWJsZSBwcmludAorICogSW5pdGlhbGl6ZXMgUHJpbnRXcml0ZXIgd2l0aCBGaWxlV3JpdGVyLCB0byBlbmFibGUgcHJpbnQKICAqIHJlbGF0ZWQgbWV0aG9kcyB0byBnZW5lcmF0ZSB0aGUgY29kZSB0byB0aGUgbmFtZWQgRmlsZSB0aHJvdWdoIEZpbGVXcml0ZXIuCiAgKgorICogIDxwPjxiPlRoaXMgaXMgTk9UIHBhcnQgb2YgYW55IHN1cHBvcnRlZCBBUEkuCisgKiAgSWYgeW91IHdyaXRlIGNvZGUgdGhhdCBkZXBlbmRzIG9uIHRoaXMsIHlvdSBkbyBzbyBhdCB5b3VyIG93biByaXNrLgorICogIFRoaXMgY29kZSBhbmQgaXRzIGludGVybmFsIGludGVyZmFjZXMgYXJlIHN1YmplY3QgdG8gY2hhbmdlIG9yCisgKiAgZGVsZXRpb24gd2l0aG91dCBub3RpY2UuPC9iPgorICoKICAqIEBzaW5jZSAxLjIKICAqIEBhdXRob3IgQXR1bCBNIERhbWJhbGthcgogICogQGF1dGhvciBCaGF2ZXNoIFBhdGVsIChNb2RpZmllZCkKICAqLwotcHVibGljIGNsYXNzIEh0bWxXcml0ZXIgZXh0ZW5kcyBQcmludFdyaXRlciB7CitwdWJsaWMgY2xhc3MgSHRtbFdyaXRlciB7CiAKICAgICAvKioKICAgICAgKiBOYW1lIG9mIHRoZSBmaWxlLCB0byB3aGljaCB0aGlzIHdyaXRlciBpcyB3cml0aW5nIHRvLgpAQCAtMTQ4LDYgKzE1Myw4IEBACiAKICAgICBwdWJsaWMgZmluYWwgQ29udGVudCBkZXNjZnJtSW50ZXJmYWNlTGFiZWw7CiAKKyAgICBwcml2YXRlIGZpbmFsIFdyaXRlciB3cml0ZXI7CisKICAgICAvKioKICAgICAgKiBDb25zdHJ1Y3Rvci4KICAgICAgKgpAQCAtMTU4LDEzICsxNjUsMTMgQEAKICAgICAgKiBAcGFyYW0gZG9jZW5jb2RpbmcgRW5jb2RpbmcgdG8gYmUgdXNlZCBmb3IgdGhpcyBmaWxlLgogICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gRXhjZXB0aW9uIHJhaXNlZCBieSB0aGUgRmlsZVdyaXRlciBpcyBwYXNzZWQgb24KICAgICAgKiB0byBuZXh0IGxldmVsLgotICAgICAqIEBleGNlcHRpb24gVW5TdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBFeGNlcHRpb24gcmFpc2VkIGJ5IHRoZQorICAgICAqIEBleGNlcHRpb24gVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBFeGNlcHRpb24gcmFpc2VkIGJ5IHRoZQogICAgICAqIE91dHB1dFN0cmVhbVdyaXRlciBpcyBwYXNzZWQgb24gdG8gbmV4dCBsZXZlbC4KICAgICAgKi8KICAgICBwdWJsaWMgSHRtbFdyaXRlcihDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhdGgsIFN0cmluZyBmaWxlbmFtZSwgU3RyaW5nIGRvY2VuY29kaW5nKQogICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyKFV0aWwuZ2VuV3JpdGVyKGNvbmZpZ3VyYXRpb24sIHBhdGgsIGZpbGVuYW1lLCBkb2NlbmNvZGluZykpOworICAgICAgICB3cml0ZXIgPSBVdGlsLmdlbldyaXRlcihjb25maWd1cmF0aW9uLCBwYXRoLCBmaWxlbmFtZSwgZG9jZW5jb2RpbmcpOwogICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uOwogICAgICAgICBodG1sRmlsZW5hbWUgPSBmaWxlbmFtZTsKICAgICAgICAgdGhpcy5tZW1iZXJEZXRhaWxzTGlzdFByaW50ZWQgPSBmYWxzZTsKQEAgLTIxMyw2ICsyMjAsMTQgQEAKICAgICAgICAgZGVzY2ZybUludGVyZmFjZUxhYmVsID0gZ2V0UmVzb3VyY2UoImRvY2xldC5EZXNjcmlwdGlvbl9Gcm9tX0ludGVyZmFjZSIpOwogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIHdyaXRlKENvbnRlbnQgYykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgYy53cml0ZSh3cml0ZXIsIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgd3JpdGVyLmNsb3NlKCk7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogR2V0IHRoZSBjb25maWd1cmF0aW9uIHN0cmluZyBhcyBhIGNvbnRlbnQuCiAgICAgICoKQEAgLTI0NywzOCArMjYyLDYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQcmludCAmbHQ7SFRNTCZndDsgdGFnLiBBZGQgYSBuZXdsaW5lIGNoYXJhY3RlciBhdCB0aGUgZW5kLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGh0bWwoKSB7Ci0gICAgICAgIHByaW50bG4oIjxIVE1MIGxhbmc9XCIiICsgY29uZmlndXJhdGlvbi5nZXRMb2NhbGUoKS5nZXRMYW5ndWFnZSgpICsgIlwiPiIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50ICZsdDsvSFRNTCZndDsgdGFnLiBBZGQgYSBuZXdsaW5lIGNoYXJhY3RlciBhdCB0aGUgZW5kLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGh0bWxFbmQoKSB7Ci0gICAgICAgIHByaW50bG4oIjwvSFRNTD4iKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludCB0aGUgc2NyaXB0IGNvZGUgdG8gYmUgZW1iZWRlZCBiZWZvcmUgdGhlICAmbHQ7L0hFQUQmZ3Q7IHRhZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcmludFdpblRpdGxlU2NyaXB0KFN0cmluZyB3aW5UaXRsZSl7Ci0gICAgICAgIGlmKHdpblRpdGxlICE9IG51bGwgJiYgd2luVGl0bGUubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICBzY3JpcHQoKTsKLSAgICAgICAgICAgIHByaW50bG4oImZ1bmN0aW9uIHdpbmRvd1RpdGxlKCkiKTsKLSAgICAgICAgICAgIHByaW50bG4oInsiKTsKLSAgICAgICAgICAgIHByaW50bG4oIiAgICBpZiAobG9jYXRpb24uaHJlZi5pbmRleE9mKCdpcy1leHRlcm5hbD10cnVlJykgPT0gLTEpIHsiKTsKLSAgICAgICAgICAgIHByaW50bG4oIiAgICAgICAgcGFyZW50LmRvY3VtZW50LnRpdGxlPVwiIiArIHdpblRpdGxlICsgIlwiOyIpOwotICAgICAgICAgICAgcHJpbnRsbigiICAgIH0iKTsKLSAgICAgICAgICAgIHByaW50bG4oIn0iKTsKLSAgICAgICAgICAgIHNjcmlwdEVuZCgpOwotICAgICAgICAgICAgbm9TY3JpcHQoKTsKLSAgICAgICAgICAgIG5vU2NyaXB0RW5kKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKICAgICAgKiBSZXR1cm5zIGFuIEh0bWxUcmVlIGZvciB0aGUgU0NSSVBUIHRhZy4KICAgICAgKgogICAgICAqIEByZXR1cm4gYW4gSHRtbFRyZWUgZm9yIHRoZSBTQ1JJUFQgdGFnCkBAIC0zMjEsNjQgKzMwNCw2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUHJpbnQgdGhlIEphdmFzY3JpcHQgJmx0O1NDUklQVCZndDsgc3RhcnQgdGFnIHdpdGggaXRzIHR5cGUKLSAgICAgKiBhdHRyaWJ1dGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2NyaXB0KCkgewotICAgICAgICBwcmludGxuKCI8U0NSSVBUIHR5cGU9XCJ0ZXh0L2phdmFzY3JpcHRcIj4iKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludCB0aGUgSmF2YXNjcmlwdCAmbHQ7L1NDUklQVCZndDsgZW5kIHRhZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzY3JpcHRFbmQoKSB7Ci0gICAgICAgIHByaW50bG4oIjwvU0NSSVBUPiIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50IHRoZSBKYXZhc2NyaXB0ICZsdDtOT1NDUklQVCZndDsgc3RhcnQgdGFnLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG5vU2NyaXB0KCkgewotICAgICAgICBwcmludGxuKCI8Tk9TQ1JJUFQ+Iik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnQgdGhlIEphdmFzY3JpcHQgJmx0Oy9OT1NDUklQVCZndDsgZW5kIHRhZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBub1NjcmlwdEVuZCgpIHsKLSAgICAgICAgcHJpbnRsbigiPC9OT1NDUklQVD4iKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIEphdmFzY3JpcHQgY2FsbCB0byBiZSBlbWJlZGRlZCBpbiB0aGUgJmx0O0JPRFkmZ3Q7IHRhZy4KLSAgICAgKiBSZXR1cm4gbm90aGluZyBpZiB3aW5UaXRsZSBpcyBlbXB0eS4KLSAgICAgKiBAcmV0dXJuIHRoZSBKYXZhc2NyaXB0IGNhbGwgdG8gYmUgZW1iZWRkZWQgaW4gdGhlICZsdDtCT0RZJmd0OyB0YWcuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRXaW5kb3dUaXRsZU9ubG9hZCgpewotICAgICAgICBpZih3aW5UaXRsZSAhPSBudWxsICYmIHdpblRpdGxlLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgcmV0dXJuICIgb25sb2FkPVwid2luZG93VGl0bGUoKTtcIiI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludCAmbHQ7Qk9EWSBCR0NPTE9SPSJiZ2NvbG9yIiZndDssIGluY2x1ZGluZyBKYXZhU2NyaXB0Ci0gICAgICogIm9ubG9hZCIgY2FsbCB0byBsb2FkIHdpbmRvd3RpdGxlIHNjcmlwdC4gIFRoaXMgc2NyaXB0IHNob3dzIHRoZSBuYW1lCi0gICAgICogb2YgdGhlIGRvY3VtZW50IGluIHRoZSB3aW5kb3cgdGl0bGUgYmFyIHdoZW4gZnJhbWVzIGFyZSBvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBiZ2NvbG9yIEJhY2tncm91bmQgY29sb3IuCi0gICAgICogQHBhcmFtIGluY2x1ZGVTY3JpcHQgIGJvb2xlYW4gc2V0IHRydWUgaWYgcHJpbnRpbmcgd2luZG93dGl0bGUgc2NyaXB0Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgYm9keShTdHJpbmcgYmdjb2xvciwgYm9vbGVhbiBpbmNsdWRlU2NyaXB0KSB7Ci0gICAgICAgIHByaW50KCI8Qk9EWSBCR0NPTE9SPVwiIiArIGJnY29sb3IgKyAiXCIiKTsKLSAgICAgICAgaWYgKGluY2x1ZGVTY3JpcHQpIHsKLSAgICAgICAgICAgIHByaW50KGdldFdpbmRvd1RpdGxlT25sb2FkKCkpOwotICAgICAgICB9Ci0gICAgICAgIHByaW50bG4oIj4iKTsKLSAgICB9Ci0KLSAgICAvKioKICAgICAgKiBSZXR1cm5zIGFuIEh0bWxUcmVlIGZvciB0aGUgQk9EWSB0YWcuCiAgICAgICoKICAgICAgKiBAcGFyYW0gaW5jbHVkZVNjcmlwdCAgc2V0IHRydWUgaWYgcHJpbnRpbmcgd2luZG93dGl0bGUgc2NyaXB0CkBAIC00MDEsMzEgKzMyNiw2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUHJpbnQgJmx0Oy9CT0RZJmd0OyB0YWcuIEFkZCBhIG5ld2xpbmUgY2hhcmFjdGVyIGF0IHRoZSBlbmQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYm9keUVuZCgpIHsKLSAgICAgICAgcHJpbnRsbigiPC9CT0RZPiIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50ICZsdDtUSVRMRSZndDsgdGFnLiBBZGQgYSBuZXdsaW5lIGNoYXJhY3RlciBhdCB0aGUgZW5kLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRpdGxlKCkgewotICAgICAgICBwcmludGxuKCI8VElUTEU+Iik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnQgJmx0O1RJVExFJmd0OyB0YWcuIEFkZCBhIG5ld2xpbmUgY2hhcmFjdGVyIGF0IHRoZSBlbmQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gd2luVGl0bGUgVGhlIHRpdGxlIG9mIHRoaXMgZG9jdW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGl0bGUoU3RyaW5nIHdpblRpdGxlKSB7Ci0gICAgICAgIC8vIFNldCB3aW5kb3cgdGl0bGUgc3RyaW5nIHdoaWNoIGlzIGxhdGVyIHByaW50ZWQKLSAgICAgICAgdGhpcy53aW5UaXRsZSA9IHdpblRpdGxlOwotICAgICAgICB0aXRsZSgpOwotICAgIH0KLQotICAgIC8qKgogICAgICAqIFJldHVybnMgYW4gSHRtbFRyZWUgZm9yIHRoZSBUSVRMRSB0YWcuCiAgICAgICoKICAgICAgKiBAcmV0dXJuIGFuIEh0bWxUcmVlIGZvciB0aGUgVElUTEUgdGFnCkBAIC00MzYsMjk1ICszMzYsNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFByaW50ICZsdDsvVElUTEUmZ3Q7IHRhZy4gQWRkIGEgbmV3bGluZSBjaGFyYWN0ZXIgYXQgdGhlIGVuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0aXRsZUVuZCgpIHsKLSAgICAgICAgcHJpbnRsbigiPC9USVRMRT4iKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludCAmbHQ7VUwmZ3Q7IHRhZy4gQWRkIGEgbmV3bGluZSBjaGFyYWN0ZXIgYXQgdGhlIGVuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB1bCgpIHsKLSAgICAgICAgcHJpbnRsbigiPFVMPiIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50ICZsdDsvVUwmZ3Q7IHRhZy4gQWRkIGEgbmV3bGluZSBjaGFyYWN0ZXIgYXQgdGhlIGVuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB1bEVuZCgpIHsKLSAgICAgICAgcHJpbnRsbigiPC9VTD4iKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludCAmbHQ7TEkmZ3Q7IHRhZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBsaSgpIHsKLSAgICAgICAgcHJpbnQoIjxMST4iKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludCAmbHQ7TEkgVFlQRT0idHlwZSImZ3Q7IHRhZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0eXBlIFR5cGUgc3RyaW5nLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGxpKFN0cmluZyB0eXBlKSB7Ci0gICAgICAgIHByaW50KCI8TEkgVFlQRT1cIiIgKyB0eXBlICsgIlwiPiIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50ICZsdDtIMSZndDsgdGFnLiBBZGQgYSBuZXdsaW5lIGNoYXJhY3RlciBhdCB0aGUgZW5kLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGgxKCkgewotICAgICAgICBwcmludGxuKCI8SDE+Iik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnQgJmx0Oy9IMSZndDsgdGFnLiBBZGQgYSBuZXdsaW5lIGNoYXJhY3RlciBhdCB0aGUgZW5kLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGgxRW5kKCkgewotICAgICAgICBwcmludGxuKCI8L0gxPiIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50IHRleHQgd2l0aCAmbHQ7SDEmZ3Q7IHRhZy4gQWxzbyBhZGRzICZsdDsvSDEmZ3Q7IHRhZy4gQWRkIGEgbmV3bGluZSBjaGFyYWN0ZXIKLSAgICAgKiBhdCB0aGUgZW5kIG9mIHRoZSB0ZXh0LgotICAgICAqCi0gICAgICogQHBhcmFtIHRleHQgVGV4dCB0byBiZSBwcmludGVkIHdpdGggJmx0O0gxJmd0OyBmb3JtYXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaDEoU3RyaW5nIHRleHQpIHsKLSAgICAgICAgaDEoKTsKLSAgICAgICAgcHJpbnRsbih0ZXh0KTsKLSAgICAgICAgaDFFbmQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludCAmbHQ7SDImZ3Q7IHRhZy4gQWRkIGEgbmV3bGluZSBjaGFyYWN0ZXIgYXQgdGhlIGVuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBoMigpIHsKLSAgICAgICAgcHJpbnRsbigiPEgyPiIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50IHRleHQgd2l0aCAmbHQ7SDImZ3Q7IHRhZy4gQWxzbyBhZGRzICZsdDsvSDImZ3Q7IHRhZy4gQWRkIGEgbmV3bGluZSBjaGFyYWN0ZXIKLSAgICAgKiAgYXQgdGhlIGVuZCBvZiB0aGUgdGV4dC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0ZXh0IFRleHQgdG8gYmUgcHJpbnRlZCB3aXRoICZsdDtIMiZndDsgZm9ybWF0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGgyKFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgIGgyKCk7Ci0gICAgICAgIHByaW50bG4odGV4dCk7Ci0gICAgICAgIGgyRW5kKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnQgJmx0Oy9IMiZndDsgdGFnLiBBZGQgYSBuZXdsaW5lIGNoYXJhY3RlciBhdCB0aGUgZW5kLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGgyRW5kKCkgewotICAgICAgICBwcmludGxuKCI8L0gyPiIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50ICZsdDtIMyZndDsgdGFnLiBBZGQgYSBuZXdsaW5lIGNoYXJhY3RlciBhdCB0aGUgZW5kLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGgzKCkgewotICAgICAgICBwcmludGxuKCI8SDM+Iik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnQgdGV4dCB3aXRoICZsdDtIMyZndDsgdGFnLiBBbHNvIGFkZHMgJmx0Oy9IMyZndDsgdGFnLiBBZGQgYSBuZXdsaW5lIGNoYXJhY3RlcgotICAgICAqICBhdCB0aGUgZW5kIG9mIHRoZSB0ZXh0LgotICAgICAqCi0gICAgICogQHBhcmFtIHRleHQgVGV4dCB0byBiZSBwcmludGVkIHdpdGggJmx0O0gzJmd0OyBmb3JtYXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaDMoU3RyaW5nIHRleHQpIHsKLSAgICAgICAgaDMoKTsKLSAgICAgICAgcHJpbnRsbih0ZXh0KTsKLSAgICAgICAgaDNFbmQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludCAmbHQ7L0gzJmd0OyB0YWcuIEFkZCBhIG5ld2xpbmUgY2hhcmFjdGVyIGF0IHRoZSBlbmQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaDNFbmQoKSB7Ci0gICAgICAgIHByaW50bG4oIjwvSDM+Iik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnQgJmx0O0g0Jmd0OyB0YWcuIEFkZCBhIG5ld2xpbmUgY2hhcmFjdGVyIGF0IHRoZSBlbmQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaDQoKSB7Ci0gICAgICAgIHByaW50bG4oIjxIND4iKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludCAmbHQ7L0g0Jmd0OyB0YWcuIEFkZCBhIG5ld2xpbmUgY2hhcmFjdGVyIGF0IHRoZSBlbmQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaDRFbmQoKSB7Ci0gICAgICAgIHByaW50bG4oIjwvSDQ+Iik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnQgdGV4dCB3aXRoICZsdDtINCZndDsgdGFnLiBBbHNvIGFkZHMgJmx0Oy9INCZndDsgdGFnLiBBZGQgYSBuZXdsaW5lIGNoYXJhY3RlcgotICAgICAqIGF0IHRoZSBlbmQgb2YgdGhlIHRleHQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGV4dCBUZXh0IHRvIGJlIHByaW50ZWQgd2l0aCAmbHQ7SDQmZ3Q7IGZvcm1hdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBoNChTdHJpbmcgdGV4dCkgewotICAgICAgICBoNCgpOwotICAgICAgICBwcmludGxuKHRleHQpOwotICAgICAgICBoNEVuZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50ICZsdDtINSZndDsgdGFnLiBBZGQgYSBuZXdsaW5lIGNoYXJhY3RlciBhdCB0aGUgZW5kLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGg1KCkgewotICAgICAgICBwcmludGxuKCI8SDU+Iik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnQgJmx0Oy9INSZndDsgdGFnLiBBZGQgYSBuZXdsaW5lIGNoYXJhY3RlciBhdCB0aGUgZW5kLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGg1RW5kKCkgewotICAgICAgICBwcmludGxuKCI8L0g1PiIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50IEhUTUwgJmx0O0lNRyBTUkM9ImltZ2dpZiIgV0lEVEg9IndpZHRoIiBIRUlHSFQ9ImhlaWdodCIgQUxUPSJpbWduYW1lJmd0OwotICAgICAqIHRhZy4gSXQgcHJlcGVuZHMgdGhlICJpbWFnZXMiIGRpcmVjdG9yeSBuYW1lIHRvIHRoZSAiaW1nZ2lmIi4gVGhpcwotICAgICAqIG1ldGhvZCBpcyB1c2VkIGZvciBvbmVvbmUgZm9ybWF0IGdlbmVyYXRpb24uIEFkZCBhIG5ld2xpbmUgY2hhcmFjdGVyCi0gICAgICogYXQgdGhlIGVuZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbWdnaWYgICBJbWFnZSBHSUYgZmlsZS4KLSAgICAgKiBAcGFyYW0gaW1nbmFtZSAgSW1hZ2UgbmFtZS4KLSAgICAgKiBAcGFyYW0gd2lkdGggICAgV2lkdGggb2YgdGhlIGltYWdlLgotICAgICAqIEBwYXJhbSBoZWlnaHQgICBIZWlnaHQgb2YgdGhlIGltYWdlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGltZyhTdHJpbmcgaW1nZ2lmLCBTdHJpbmcgaW1nbmFtZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gICAgICAgIHByaW50bG4oIjxJTUcgU1JDPVwiaW1hZ2VzLyIgKyBpbWdnaWYgKyAiLmdpZlwiIgotICAgICAgICAgICAgICArICIgV0lEVEg9XCIiICsgd2lkdGggKyAiXCIgSEVJR0hUPVwiIiArIGhlaWdodAotICAgICAgICAgICAgICArICJcIiBBTFQ9XCIiICsgaW1nbmFtZSArICJcIj4iKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludCAmbHQ7TUVOVSZndDsgdGFnLiBBZGQgYSBuZXdsaW5lIGNoYXJhY3RlciBhdCB0aGUgZW5kLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG1lbnUoKSB7Ci0gICAgICAgIHByaW50bG4oIjxNRU5VPiIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50ICZsdDsvTUVOVSZndDsgdGFnLiBBZGQgYSBuZXdsaW5lIGNoYXJhY3RlciBhdCB0aGUgZW5kLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG1lbnVFbmQoKSB7Ci0gICAgICAgIHByaW50bG4oIjwvTUVOVT4iKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludCAmbHQ7UFJFJmd0OyB0YWcuIEFkZCBhIG5ld2xpbmUgY2hhcmFjdGVyIGF0IHRoZSBlbmQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHJlKCkgewotICAgICAgICBwcmludGxuKCI8UFJFPiIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50ICZsdDtQUkUmZ3Q7IHRhZyB3aXRob3V0IGFkZGluZyBuZXcgbGluZSBjaGFyYWN0ZXIgYXQgdGggZWVuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwcmVOb05ld0xpbmUoKSB7Ci0gICAgICAgIHByaW50KCI8UFJFPiIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50ICZsdDsvUFJFJmd0OyB0YWcuIEFkZCBhIG5ld2xpbmUgY2hhcmFjdGVyIGF0IHRoZSBlbmQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHJlRW5kKCkgewotICAgICAgICBwcmludGxuKCI8L1BSRT4iKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludCAmbHQ7SFImZ3Q7IHRhZy4gQWRkIGEgbmV3bGluZSBjaGFyYWN0ZXIgYXQgdGhlIGVuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBocigpIHsKLSAgICAgICAgcHJpbnRsbigiPEhSPiIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50ICZsdDtIUiBTSVpFPSJzaXplIiBXSURUSD0id2lkdGhwZXJjZW50JSImZ3Q7IHRhZy4gQWRkIGEgbmV3bGluZQotICAgICAqIGNoYXJhY3RlciBhdCB0aGUgZW5kLgotICAgICAqCi0gICAgICogQHBhcmFtIHNpemUgICAgICAgICAgIFNpemUgb2YgdGhlIHJ1bGVyLgotICAgICAqIEBwYXJhbSB3aWR0aFBlcmNlbnQgICBQZXJjZW50YWdlIFdpZHRoIG9mIHRoZSBydWxlcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGhyKGludCBzaXplLCBpbnQgd2lkdGhQZXJjZW50KSB7Ci0gICAgICAgIHByaW50bG4oIjxIUiBTSVpFPVwiIiArIHNpemUgKyAiXCIgV0lEVEg9XCIiICsgd2lkdGhQZXJjZW50ICsgIiVcIj4iKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludCAmbHQ7SFIgU0laRT0ic2l6ZSIgTk9TSEFERSZndDsgdGFnLiBBZGQgYSBuZXdsaW5lIGNoYXJhY3RlciBhdCB0aGUgZW5kLgotICAgICAqCi0gICAgICogQHBhcmFtIHNpemUgICAgICAgICAgIFNpemUgb2YgdGhlIHJ1bGVyLgotICAgICAqIEBwYXJhbSBub3NoYWRlICAgICAgICBub3NoYWRlIHN0cmluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBocihpbnQgc2l6ZSwgU3RyaW5nIG5vc2hhZGUpIHsKLSAgICAgICAgcHJpbnRsbigiPEhSIFNJWkU9XCIiICsgc2l6ZSArICJcIiBOT1NIQURFPiIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgIiZsdDtTVFJPTkcmZ3Q7IiBzdHJpbmcuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFN0cmluZyBSZXR1cm4gU3RyaW5nICImbHQ7U1RST05HJmd0OyI7Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRTdHJvbmcoKSB7Ci0gICAgICAgIHJldHVybiAiPFNUUk9ORz4iOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgIiZsdDsvU1RST05HJmd0OyIgc3RyaW5nLgotICAgICAqCi0gICAgICogQHJldHVybiBTdHJpbmcgUmV0dXJuIFN0cmluZyAiJmx0Oy9TVFJPTkcmZ3Q7IjsKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0cm9uZ0VuZCgpIHsKLSAgICAgICAgcmV0dXJuICI8L1NUUk9ORz4iOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50ICZsdDtTVFJPTkcmZ3Q7IHRhZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdHJvbmcoKSB7Ci0gICAgICAgIHByaW50KCI8U1RST05HPiIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50ICZsdDsvU1RST05HJmd0OyB0YWcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3Ryb25nRW5kKCkgewotICAgICAgICBwcmludCgiPC9TVFJPTkc+Iik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnQgdGV4dCBwYXNzZWQsIGluIHN0cm9uZyBmb3JtYXQgdXNpbmcgJmx0O1NUUk9ORyZndDsgYW5kICZsdDsvU1RST05HJmd0OyB0YWdzLgotICAgICAqCi0gICAgICogQHBhcmFtIHRleHQgU3RyaW5nIHRvIGJlIHByaW50ZWQgaW4gYmV0d2VlbiAmbHQ7U1RST05HJmd0OyBhbmQgJmx0Oy9TVFJPTkcmZ3Q7IHRhZ3MuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3Ryb25nKFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgIHN0cm9uZygpOwotICAgICAgICBwcmludCh0ZXh0KTsKLSAgICAgICAgc3Ryb25nRW5kKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnQgdGV4dCBwYXNzZWQsIGluIEl0YWxpY3MgdXNpbmcgJmx0O0kmZ3Q7IGFuZCAmbHQ7L0kmZ3Q7IHRhZ3MuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGV4dCBTdHJpbmcgdG8gYmUgcHJpbnRlZCBpbiBiZXR3ZWVuICZsdDtJJmd0OyBhbmQgJmx0Oy9JJmd0OyB0YWdzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGl0YWxpY3MoU3RyaW5nIHRleHQpIHsKLSAgICAgICAgcHJpbnQoIjxJPiIpOwotICAgICAgICBwcmludCh0ZXh0KTsKLSAgICAgICAgcHJpbnRsbigiPC9JPiIpOwotICAgIH0KLQotICAgIC8qKgogICAgICAqIFJldHVybiwgdGV4dCBwYXNzZWQsIHdpdGggSXRhbGljcyAmbHQ7aSZndDsgYW5kICZsdDsvaSZndDsgdGFncywgc3Vycm91bmRpbmcgaXQuCiAgICAgICogU28gaWYgdGhlIHRleHQgcGFzc2VkIGlzICJIaSIsIHRoZW4gc3RyaW5nIHJldHVybmVkIHdpbGwgYmUgIiZsdDtpJmd0O0hpJmx0Oy9pJmd0OyIuCiAgICAgICoKQEAgLTczOSw2OTAgKzM1MCwxNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFByaW50ICImIzM4O25ic3A7Iiwgbm9uLWJyZWFraW5nIHNwYWNlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNwYWNlKCkgewotICAgICAgICBwcmludCgiJm5ic3A7Iik7Ci0gICAgfQotCi0gICAgLyoqCiAgICAgICogUmV0dXJuICImIzM4O25ic3A7Iiwgbm9uLWJyZWFraW5nIHNwYWNlLgogICAgICAqLwogICAgIHB1YmxpYyBDb250ZW50IGdldFNwYWNlKCkgewogICAgICAgICByZXR1cm4gUmF3SHRtbC5uYnNwOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIFByaW50ICZsdDtETCZndDsgdGFnLiBBZGQgYSBuZXdsaW5lIGNoYXJhY3RlciBhdCB0aGUgZW5kLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRsKCkgewotICAgICAgICBwcmludGxuKCI8REw+Iik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnQgJmx0Oy9ETCZndDsgdGFnLiBBZGQgYSBuZXdsaW5lIGNoYXJhY3RlciBhdCB0aGUgZW5kLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRsRW5kKCkgewotICAgICAgICBwcmludGxuKCI8L0RMPiIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50ICZsdDtEVCZndDsgdGFnLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGR0KCkgewotICAgICAgICBwcmludCgiPERUPiIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50ICZsdDsvRFQmZ3Q7IHRhZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkdEVuZCgpIHsKLSAgICAgICAgcHJpbnQoIjwvRFQ+Iik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnQgJmx0O0REJmd0OyB0YWcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZGQoKSB7Ci0gICAgICAgIHByaW50KCI8REQ+Iik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnQgJmx0Oy9ERCZndDsgdGFnLiBBZGQgYSBuZXdsaW5lIGNoYXJhY3RlciBhdCB0aGUgZW5kLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRkRW5kKCkgewotICAgICAgICBwcmludGxuKCI8L0REPiIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50ICZsdDtTVVAmZ3Q7IHRhZy4gQWRkIGEgbmV3bGluZSBjaGFyYWN0ZXIgYXQgdGhlIGVuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdXAoKSB7Ci0gICAgICAgIHByaW50bG4oIjxTVVA+Iik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnQgJmx0Oy9TVVAmZ3Q7IHRhZy4gQWRkIGEgbmV3bGluZSBjaGFyYWN0ZXIgYXQgdGhlIGVuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdXBFbmQoKSB7Ci0gICAgICAgIHByaW50bG4oIjwvU1VQPiIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50ICZsdDtGT05UIFNJWkU9InNpemUiJmd0OyB0YWcuIEFkZCBhIG5ld2xpbmUgY2hhcmFjdGVyIGF0IHRoZSBlbmQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2l6ZSBTdHJpbmcgc2l6ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBmb250KFN0cmluZyBzaXplKSB7Ci0gICAgICAgIHByaW50bG4oIjxGT05UIFNJWkU9XCIiICsgc2l6ZSArICJcIj4iKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludCAmbHQ7Rk9OVCBTSVpFPSJzaXplIiZndDsgdGFnLgotICAgICAqCi0gICAgICogQHBhcmFtIHNpemUgU3RyaW5nIHNpemUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZm9udE5vTmV3TGluZShTdHJpbmcgc2l6ZSkgewotICAgICAgICBwcmludCgiPEZPTlQgU0laRT1cIiIgKyBzaXplICsgIlwiPiIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50ICZsdDtGT05UIENMQVNTPSJzdHlsZW5hbWUiJmd0OyB0YWcuIEFkZCBhIG5ld2xpbmUgY2hhcmFjdGVyIGF0IHRoZSBlbmQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3R5bGVuYW1lIFN0cmluZyBzdHlsZW5hbWUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZm9udFN0eWxlKFN0cmluZyBzdHlsZW5hbWUpIHsKLSAgICAgICAgcHJpbnQoIjxGT05UIENMQVNTPVwiIiArIHN0eWxlbmFtZSArICJcIj4iKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludCAmbHQ7Rk9OVCBTSVpFPSJzaXplIiBDTEFTUz0ic3R5bGVuYW1lIiZndDsgdGFnLiBBZGQgYSBuZXdsaW5lIGNoYXJhY3RlcgotICAgICAqIGF0IHRoZSBlbmQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2l6ZSBTdHJpbmcgc2l6ZS4KLSAgICAgKiBAcGFyYW0gc3R5bGVuYW1lIFN0cmluZyBzdHlsZW5hbWUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZm9udFNpemVTdHlsZShTdHJpbmcgc2l6ZSwgU3RyaW5nIHN0eWxlbmFtZSkgewotICAgICAgICBwcmludGxuKCI8Rk9OVCBzaXplPVwiIiArIHNpemUgKyAiXCIgQ0xBU1M9XCIiICsgc3R5bGVuYW1lICsgIlwiPiIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50ICZsdDsvRk9OVCZndDsgdGFnLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGZvbnRFbmQoKSB7Ci0gICAgICAgIHByaW50KCI8L0ZPTlQ+Iik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSAiJmx0O0ZPTlQgQ09MT1I9ImNvbG9yIiZndDsiIHN0cmluZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb2xvciBTdHJpbmcgY29sb3IuCi0gICAgICogQHJldHVybiBTdHJpbmcgUmV0dXJuIFN0cmluZyAiJmx0O0ZPTlQgQ09MT1I9ImNvbG9yIiZndDsiLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rm9udENvbG9yKFN0cmluZyBjb2xvcikgewotICAgICAgICByZXR1cm4gIjxGT05UIENPTE9SPVwiIiArIGNvbG9yICsgIlwiPiI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSAiJmx0Oy9GT05UJmd0OyIgc3RyaW5nLgotICAgICAqCi0gICAgICogQHJldHVybiBTdHJpbmcgUmV0dXJuIFN0cmluZyAiJmx0Oy9GT05UJmd0OyI7Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRGb250RW5kKCkgewotICAgICAgICByZXR1cm4gIjwvRk9OVD4iOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50ICZsdDtDRU5URVImZ3Q7IHRhZy4gQWRkIGEgbmV3bGluZSBjaGFyYWN0ZXIgYXQgdGhlIGVuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjZW50ZXIoKSB7Ci0gICAgICAgIHByaW50bG4oIjxDRU5URVI+Iik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnQgJmx0Oy9DRU5URVImZ3Q7IHRhZy4gQWRkIGEgbmV3bGluZSBjaGFyYWN0ZXIgYXQgdGhlIGVuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjZW50ZXJFbmQoKSB7Ci0gICAgICAgIHByaW50bG4oIjwvQ0VOVEVSPiIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50IGFuY2hvciAmbHQ7QSBOQU1FPSJuYW1lIiZndDsgdGFnLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgTmFtZSBTdHJpbmcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYU5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcHJpbnQoIjxBIE5BTUU9XCIiICsgbmFtZSArICJcIj4iKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludCAmbHQ7L0EmZ3Q7IHRhZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhRW5kKCkgewotICAgICAgICBwcmludCgiPC9BPiIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50ICZsdDtJJmd0OyB0YWcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaXRhbGljKCkgewotICAgICAgICBwcmludCgiPEk+Iik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnQgJmx0Oy9JJmd0OyB0YWcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaXRhbGljRW5kKCkgewotICAgICAgICBwcmludCgiPC9JPiIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50IGNvbnRlbnRzIHdpdGhpbiBhbmNob3IgJmx0O0EgTkFNRT0ibmFtZSImZ3Q7IHRhZ3MuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSBTdHJpbmcgbmFtZS4KLSAgICAgKiBAcGFyYW0gY29udGVudCBTdHJpbmcgY29udGVudHMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYW5jaG9yKFN0cmluZyBuYW1lLCBTdHJpbmcgY29udGVudCkgewotICAgICAgICBhTmFtZShuYW1lKTsKLSAgICAgICAgcHJpbnQoY29udGVudCk7Ci0gICAgICAgIGFFbmQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludCBhbmNob3IgJmx0O0EgTkFNRT0ibmFtZSImZ3Q7IGFuZCAmbHQ7L0EmZ3Q7dGFncy4gUHJpbnQgY29tbWVudCBzdHJpbmcKLSAgICAgKiAiJmx0OyEtLSAtLSZndDsiIHdpdGhpbiB0aG9zZSB0YWdzLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgU3RyaW5nIG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYW5jaG9yKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIGFuY2hvcihuYW1lLCAiPCEtLSAtLT4iKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludCBuZXdsaW5lIGFuZCB0aGVuIHByaW50ICZsdDtQJmd0OyB0YWcuIEFkZCBhIG5ld2xpbmUgY2hhcmFjdGVyIGF0IHRoZQotICAgICAqIGVuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwKCkgewotICAgICAgICBwcmludGxuKCk7Ci0gICAgICAgIHByaW50bG4oIjxQPiIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50IG5ld2xpbmUgYW5kIHRoZW4gcHJpbnQgJmx0Oy9QJmd0OyB0YWcuIEFkZCBhIG5ld2xpbmUgY2hhcmFjdGVyIGF0IHRoZQotICAgICAqIGVuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwRW5kKCkgewotICAgICAgICBwcmludGxuKCk7Ci0gICAgICAgIHByaW50bG4oIjwvUD4iKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludCBuZXdsaW5lIGFuZCB0aGVuIHByaW50ICZsdDtCUiZndDsgdGFnLiBBZGQgYSBuZXdsaW5lIGNoYXJhY3RlciBhdCB0aGUKLSAgICAgKiBlbmQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYnIoKSB7Ci0gICAgICAgIHByaW50bG4oKTsKLSAgICAgICAgcHJpbnRsbigiPEJSPiIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50ICZsdDtBRERSRVNTJmd0OyB0YWcuIEFkZCBhIG5ld2xpbmUgY2hhcmFjdGVyIGF0IHRoZSBlbmQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkcmVzcygpIHsKLSAgICAgICAgcHJpbnRsbigiPEFERFJFU1M+Iik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnQgJmx0Oy9BRERSRVNTJmd0OyB0YWcuIEFkZCBhIG5ld2xpbmUgY2hhcmFjdGVyIGF0IHRoZSBlbmQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkcmVzc0VuZCgpIHsKLSAgICAgICAgcHJpbnRsbigiPC9BRERSRVNTPiIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50ICZsdDtIRUFEJmd0OyB0YWcuIEFkZCBhIG5ld2xpbmUgY2hhcmFjdGVyIGF0IHRoZSBlbmQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaGVhZCgpIHsKLSAgICAgICAgcHJpbnRsbigiPEhFQUQ+Iik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnQgJmx0Oy9IRUFEJmd0OyB0YWcuIEFkZCBhIG5ld2xpbmUgY2hhcmFjdGVyIGF0IHRoZSBlbmQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaGVhZEVuZCgpIHsKLSAgICAgICAgcHJpbnRsbigiPC9IRUFEPiIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50ICZsdDtDT0RFJmd0OyB0YWcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY29kZSgpIHsKLSAgICAgICAgcHJpbnQoIjxDT0RFPiIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50ICZsdDsvQ09ERSZndDsgdGFnLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNvZGVFbmQoKSB7Ci0gICAgICAgIHByaW50KCI8L0NPREU+Iik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnQgJmx0O0VNJmd0OyB0YWcuIEFkZCBhIG5ld2xpbmUgY2hhcmFjdGVyIGF0IHRoZSBlbmQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZW0oKSB7Ci0gICAgICAgIHByaW50bG4oIjxFTT4iKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludCAmbHQ7L0VNJmd0OyB0YWcuIEFkZCBhIG5ld2xpbmUgY2hhcmFjdGVyIGF0IHRoZSBlbmQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZW1FbmQoKSB7Ci0gICAgICAgIHByaW50bG4oIjwvRU0+Iik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnQgSFRNTCAmbHQ7VEFCTEUgQk9SREVSPSJib3JkZXIiIFdJRFRIPSJ3aWR0aCIKLSAgICAgKiBDRUxMUEFERElORz0iY2VsbHBhZGRpbmciIENFTExTUEFDSU5HPSJjZWxsc3BhY2luZyImZ3Q7IHRhZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBib3JkZXIgICAgICAgQm9yZGVyIHNpemUuCi0gICAgICogQHBhcmFtIHdpZHRoICAgICAgICBXaWR0aCBvZiB0aGUgdGFibGUuCi0gICAgICogQHBhcmFtIGNlbGxwYWRkaW5nICBDZWxscGFkZGluZyBmb3IgdGhlIHRhYmxlIGNlbGxzLgotICAgICAqIEBwYXJhbSBjZWxsc3BhY2luZyAgQ2VsbHNwYWNpbmcgZm9yIHRoZSB0YWJsZSBjZWxscy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0YWJsZShpbnQgYm9yZGVyLCBTdHJpbmcgd2lkdGgsIGludCBjZWxscGFkZGluZywKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgY2VsbHNwYWNpbmcpIHsKLSAgICAgICAgcHJpbnRsbihEb2NsZXRDb25zdGFudHMuTkwgKwotICAgICAgICAgICAgICAgICI8VEFCTEUgQk9SREVSPVwiIiArIGJvcmRlciArCi0gICAgICAgICAgICAgICAgIlwiIFdJRFRIPVwiIiArIHdpZHRoICsKLSAgICAgICAgICAgICAgICAiXCIgQ0VMTFBBRERJTkc9XCIiICsgY2VsbHBhZGRpbmcgKwotICAgICAgICAgICAgICAgICJcIiBDRUxMU1BBQ0lORz1cIiIgKyBjZWxsc3BhY2luZyArCi0gICAgICAgICAgICAgICAgIlwiIFNVTU1BUlk9XCJcIj4iKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludCBIVE1MICZsdDtUQUJMRSBCT1JERVI9ImJvcmRlciIgV0lEVEg9IndpZHRoIgotICAgICAqIENFTExQQURESU5HPSJjZWxscGFkZGluZyIgQ0VMTFNQQUNJTkc9ImNlbGxzcGFjaW5nIiBTVU1NQVJZPSJzdW1tYXJ5IiZndDsgdGFnLgotICAgICAqCi0gICAgICogQHBhcmFtIGJvcmRlciAgICAgICBCb3JkZXIgc2l6ZS4KLSAgICAgKiBAcGFyYW0gd2lkdGggICAgICAgIFdpZHRoIG9mIHRoZSB0YWJsZS4KLSAgICAgKiBAcGFyYW0gY2VsbHBhZGRpbmcgIENlbGxwYWRkaW5nIGZvciB0aGUgdGFibGUgY2VsbHMuCi0gICAgICogQHBhcmFtIGNlbGxzcGFjaW5nICBDZWxsc3BhY2luZyBmb3IgdGhlIHRhYmxlIGNlbGxzLgotICAgICAqIEBwYXJhbSBzdW1tYXJ5ICAgICAgVGFibGUgc3VtbWFyeS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0YWJsZShpbnQgYm9yZGVyLCBTdHJpbmcgd2lkdGgsIGludCBjZWxscGFkZGluZywKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgY2VsbHNwYWNpbmcsIFN0cmluZyBzdW1tYXJ5KSB7Ci0gICAgICAgIHByaW50bG4oRG9jbGV0Q29uc3RhbnRzLk5MICsKLSAgICAgICAgICAgICAgICAiPFRBQkxFIEJPUkRFUj1cIiIgKyBib3JkZXIgKwotICAgICAgICAgICAgICAgICJcIiBXSURUSD1cIiIgKyB3aWR0aCArCi0gICAgICAgICAgICAgICAgIlwiIENFTExQQURESU5HPVwiIiArIGNlbGxwYWRkaW5nICsKLSAgICAgICAgICAgICAgICAiXCIgQ0VMTFNQQUNJTkc9XCIiICsgY2VsbHNwYWNpbmcgKwotICAgICAgICAgICAgICAgICJcIiBTVU1NQVJZPVwiIiArIHN1bW1hcnkgKyAiXCI+Iik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnQgSFRNTCAmbHQ7VEFCTEUgQk9SREVSPSJib3JkZXIiIENFTExQQURESU5HPSJjZWxscGFkZGluZyIKLSAgICAgKiBDRUxMU1BBQ0lORz0iY2VsbHNwYWNpbmciJmd0OyB0YWcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYm9yZGVyICAgICAgIEJvcmRlciBzaXplLgotICAgICAqIEBwYXJhbSBjZWxscGFkZGluZyAgQ2VsbHBhZGRpbmcgZm9yIHRoZSB0YWJsZSBjZWxscy4KLSAgICAgKiBAcGFyYW0gY2VsbHNwYWNpbmcgIENlbGxzcGFjaW5nIGZvciB0aGUgdGFibGUgY2VsbHMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGFibGUoaW50IGJvcmRlciwgaW50IGNlbGxwYWRkaW5nLCBpbnQgY2VsbHNwYWNpbmcpIHsKLSAgICAgICAgcHJpbnRsbihEb2NsZXRDb25zdGFudHMuTkwgKwotICAgICAgICAgICAgICAgICI8VEFCTEUgQk9SREVSPVwiIiArIGJvcmRlciArCi0gICAgICAgICAgICAgICAgIlwiIENFTExQQURESU5HPVwiIiArIGNlbGxwYWRkaW5nICsKLSAgICAgICAgICAgICAgICAiXCIgQ0VMTFNQQUNJTkc9XCIiICsgY2VsbHNwYWNpbmcgKwotICAgICAgICAgICAgICAgICJcIiBTVU1NQVJZPVwiXCI+Iik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnQgSFRNTCAmbHQ7VEFCTEUgQk9SREVSPSJib3JkZXIiIENFTExQQURESU5HPSJjZWxscGFkZGluZyIKLSAgICAgKiBDRUxMU1BBQ0lORz0iY2VsbHNwYWNpbmciIFNVTU1BUlk9InN1bW1hcnkiJmd0OyB0YWcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYm9yZGVyICAgICAgIEJvcmRlciBzaXplLgotICAgICAqIEBwYXJhbSBjZWxscGFkZGluZyAgQ2VsbHBhZGRpbmcgZm9yIHRoZSB0YWJsZSBjZWxscy4KLSAgICAgKiBAcGFyYW0gY2VsbHNwYWNpbmcgIENlbGxzcGFjaW5nIGZvciB0aGUgdGFibGUgY2VsbHMuCi0gICAgICogQHBhcmFtIHN1bW1hcnkgICAgICBUYWJsZSBzdW1tYXJ5LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRhYmxlKGludCBib3JkZXIsIGludCBjZWxscGFkZGluZywgaW50IGNlbGxzcGFjaW5nLCBTdHJpbmcgc3VtbWFyeSkgewotICAgICAgICBwcmludGxuKERvY2xldENvbnN0YW50cy5OTCArCi0gICAgICAgICAgICAgICAgIjxUQUJMRSBCT1JERVI9XCIiICsgYm9yZGVyICsKLSAgICAgICAgICAgICAgICAiXCIgQ0VMTFBBRERJTkc9XCIiICsgY2VsbHBhZGRpbmcgKwotICAgICAgICAgICAgICAgICJcIiBDRUxMU1BBQ0lORz1cIiIgKyBjZWxsc3BhY2luZyArCi0gICAgICAgICAgICAgICAgIlwiIFNVTU1BUlk9XCIiICsgc3VtbWFyeSArICJcIj4iKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludCBIVE1MICZsdDtUQUJMRSBCT1JERVI9ImJvcmRlciIgV0lEVEg9IndpZHRoIiZndDsKLSAgICAgKgotICAgICAqIEBwYXJhbSBib3JkZXIgICAgICAgQm9yZGVyIHNpemUuCi0gICAgICogQHBhcmFtIHdpZHRoICAgICAgICBXaWR0aCBvZiB0aGUgdGFibGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGFibGUoaW50IGJvcmRlciwgU3RyaW5nIHdpZHRoKSB7Ci0gICAgICAgIHByaW50bG4oRG9jbGV0Q29uc3RhbnRzLk5MICsKLSAgICAgICAgICAgICAgICAiPFRBQkxFIEJPUkRFUj1cIiIgKyBib3JkZXIgKwotICAgICAgICAgICAgICAgICJcIiBXSURUSD1cIiIgKyB3aWR0aCArCi0gICAgICAgICAgICAgICAgIlwiIFNVTU1BUlk9XCJcIj4iKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludCB0aGUgSFRNTCB0YWJsZSB0YWcgd2l0aCBib3JkZXIgc2l6ZSAwIGFuZCB3aWR0aCAxMDAlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRhYmxlKCkgewotICAgICAgICB0YWJsZSgwLCAiMTAwJSIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50ICZsdDsvVEFCTEUmZ3Q7IHRhZy4gQWRkIGEgbmV3bGluZSBjaGFyYWN0ZXIgYXQgdGhlIGVuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0YWJsZUVuZCgpIHsKLSAgICAgICAgcHJpbnRsbigiPC9UQUJMRT4iKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludCAmbHQ7VFImZ3Q7IHRhZy4gQWRkIGEgbmV3bGluZSBjaGFyYWN0ZXIgYXQgdGhlIGVuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0cigpIHsKLSAgICAgICAgcHJpbnRsbigiPFRSPiIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50ICZsdDsvVFImZ3Q7IHRhZy4gQWRkIGEgbmV3bGluZSBjaGFyYWN0ZXIgYXQgdGhlIGVuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ckVuZCgpIHsKLSAgICAgICAgcHJpbnRsbigiPC9UUj4iKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludCAmbHQ7VEQmZ3Q7IHRhZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZCgpIHsKLSAgICAgICAgcHJpbnQoIjxURD4iKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludCAmbHQ7VEQgTk9XUkFQJmd0OyB0YWcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGROb3dyYXAoKSB7Ci0gICAgICAgIHByaW50KCI8VEQgTk9XUkFQPiIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50ICZsdDtURCBXSURUSD0id2lkdGgiJmd0OyB0YWcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gd2lkdGggU3RyaW5nIHdpZHRoLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRkV2lkdGgoU3RyaW5nIHdpZHRoKSB7Ci0gICAgICAgIHByaW50KCI8VEQgV0lEVEg9XCIiICsgd2lkdGggKyAiXCI+Iik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnQgJmx0Oy9URCZndDsgdGFnLiBBZGQgYSBuZXdsaW5lIGNoYXJhY3RlciBhdCB0aGUgZW5kLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRkRW5kKCkgewotICAgICAgICBwcmludGxuKCI8L1REPiIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50ICZsdDtMSU5LIHN0ciZndDsgdGFnLgotICAgICAqCi0gICAgICogQHBhcmFtIHN0ciBTdHJpbmcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgbGluayhTdHJpbmcgc3RyKSB7Ci0gICAgICAgIHByaW50bG4oIjxMSU5LICIgKyBzdHIgKyAiPiIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50ICImbHQ7IS0tICIgY29tbWVudCBzdGFydCBzdHJpbmcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY29tbWVudFN0YXJ0KCkgewotICAgICAgICAgcHJpbnQoIjwhLS0gIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnQgIi0tJmd0OyIgY29tbWVudCBlbmQgc3RyaW5nLiBBZGQgYSBuZXdsaW5lIGNoYXJhY3RlciBhdCB0aGUgZW5kLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNvbW1lbnRFbmQoKSB7Ci0gICAgICAgICBwcmludGxuKCItLT4iKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludCAmbHQ7Q0FQVElPTiBDTEFTUz0ic3R5bGVuYW1lIiZndDsgdGFnLiBBZGRzIGEgbmV3bGluZSBjaGFyYWN0ZXIKLSAgICAgKiBhdCB0aGUgZW5kLgotICAgICAqCi0gICAgICogQHBhcmFtIHN0eWxlbmFtZSBzdHlsZSB0byBiZSBhcHBsaWVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNhcHRpb25TdHlsZShTdHJpbmcgc3R5bGVuYW1lKSB7Ci0gICAgICAgIHByaW50bG4oIjxDQVBUSU9OIENMQVNTPVwiIiArIHN0eWxlbmFtZSArICJcIj4iKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludCAmbHQ7L0NBUFRJT04mZ3Q7IHRhZy4gQWRkIGEgbmV3bGluZSBjaGFyYWN0ZXIgYXQgdGhlIGVuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjYXB0aW9uRW5kKCkgewotICAgICAgICBwcmludGxuKCI8L0NBUFRJT04+Iik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnQgJmx0O1RSIEJHQ09MT1I9ImNvbG9yIiBDTEFTUz0ic3R5bGVuYW1lIiZndDsgdGFnLiBBZGRzIGEgbmV3bGluZSBjaGFyYWN0ZXIKLSAgICAgKiBhdCB0aGUgZW5kLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbG9yIFN0cmluZyBjb2xvci4KLSAgICAgKiBAcGFyYW0gc3R5bGVuYW1lIFN0cmluZyBzdHlsZW5hbWUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdHJCZ2NvbG9yU3R5bGUoU3RyaW5nIGNvbG9yLCBTdHJpbmcgc3R5bGVuYW1lKSB7Ci0gICAgICAgIHByaW50bG4oIjxUUiBCR0NPTE9SPVwiIiArIGNvbG9yICsgIlwiIENMQVNTPVwiIiArIHN0eWxlbmFtZSArICJcIj4iKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludCAmbHQ7VFIgQkdDT0xPUj0iY29sb3IiJmd0OyB0YWcuIEFkZHMgYSBuZXdsaW5lIGNoYXJhY3RlciBhdCB0aGUgZW5kLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbG9yIFN0cmluZyBjb2xvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ckJnY29sb3IoU3RyaW5nIGNvbG9yKSB7Ci0gICAgICAgIHByaW50bG4oIjxUUiBCR0NPTE9SPVwiIiArIGNvbG9yICsgIlwiPiIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50ICZsdDtUUiBBTElHTj0iYWxpZ24iIFZBTElHTj0idmFsaWduIiZndDsgdGFnLiBBZGRzIGEgbmV3bGluZSBjaGFyYWN0ZXIKLSAgICAgKiBhdCB0aGUgZW5kLgotICAgICAqCi0gICAgICogQHBhcmFtIGFsaWduIFN0cmluZyBhbGlnbi4KLSAgICAgKiBAcGFyYW0gdmFsaWduIFN0cmluZyB2YWxpZ24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdHJBbGlnblZBbGlnbihTdHJpbmcgYWxpZ24sIFN0cmluZyB2YWxpZ24pIHsKLSAgICAgICAgcHJpbnRsbigiPFRSIEFMSUdOPVwiIiArIGFsaWduICsgIlwiIFZBTElHTj1cIiIgKyB2YWxpZ24gKyAiXCI+Iik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnQgJmx0O1RIIEFMSUdOPSJhbGlnbiImZ3Q7IHRhZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhbGlnbiB0aGUgYWxpZ24gYXR0cmlidXRlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRoQWxpZ24oU3RyaW5nIGFsaWduKSB7Ci0gICAgICAgIHByaW50KCI8VEggQUxJR049XCIiICsgYWxpZ24gKyAiXCI+Iik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnQgJmx0O1RIIENMQVNTPSJzdHlsZW5hbWUiIFNDT1BFPSJzY29wZSIgTk9XUkFQJmd0OyB0YWcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3R5bGVuYW1lIHN0eWxlIHRvIGJlIGFwcGxpZWQuCi0gICAgICogQHBhcmFtIHNjb3BlIHRoZSBzY29wZSBhdHRyaWJ1dGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGhTY29wZU5vV3JhcChTdHJpbmcgc3R5bGVuYW1lLCBTdHJpbmcgc2NvcGUpIHsKLSAgICAgICAgcHJpbnQoIjxUSCBDTEFTUz1cIiIgKyBzdHlsZW5hbWUgKyAiXCIgU0NPUEU9XCIiICsgc2NvcGUgKyAiXCIgTk9XUkFQPiIpOwotICAgIH0KLQogICAgIC8qCiAgICAgICogUmV0dXJucyBhIGhlYWRlciBmb3IgTW9kaWZpZXIgYW5kIFR5cGUgY29sdW1uIG9mIGEgdGFibGUuCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRNb2RpZmllclR5cGVIZWFkZXIoKSB7CiAgICAgICAgIHJldHVybiBtb2RpZmllclR5cGVIZWFkZXI7CiAgICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnQgJmx0O1RIIGFsaWduPSJhbGlnbiIgQ09MU1BBTj1pJmd0OyB0YWcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYWxpZ24gdGhlIGFsaWduIGF0dHJpYnV0ZS4KLSAgICAgKiBAcGFyYW0gaSBpbnRlZ2VyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRoQWxpZ25Db2xzcGFuKFN0cmluZyBhbGlnbiwgaW50IGkpIHsKLSAgICAgICAgcHJpbnQoIjxUSCBBTElHTj1cIiIgKyBhbGlnbiArICJcIiBDT0xTUEFOPVwiIiArIGkgKyAiXCI+Iik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnQgJmx0O1RIIGFsaWduPSJhbGlnbiIgTk9XUkFQJmd0OyB0YWcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYWxpZ24gdGhlIGFsaWduIGF0dHJpYnV0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0aEFsaWduTm93cmFwKFN0cmluZyBhbGlnbikgewotICAgICAgICBwcmludCgiPFRIIEFMSUdOPVwiIiArIGFsaWduICsgIlwiIE5PV1JBUD4iKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludCAmbHQ7L1RIJmd0OyB0YWcuIEFkZCBhIG5ld2xpbmUgY2hhcmFjdGVyIGF0IHRoZSBlbmQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGhFbmQoKSB7Ci0gICAgICAgIHByaW50bG4oIjwvVEg+Iik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnQgJmx0O1REIENPTFNQQU49aSZndDsgdGFnLgotICAgICAqCi0gICAgICogQHBhcmFtIGkgaW50ZWdlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZENvbHNwYW4oaW50IGkpIHsKLSAgICAgICAgcHJpbnQoIjxURCBDT0xTUEFOPSIgKyBpICsgIj4iKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludCAmbHQ7VEQgQkdDT0xPUj0iY29sb3IiIENMQVNTPSJzdHlsZW5hbWUiJmd0OyB0YWcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29sb3IgU3RyaW5nIGNvbG9yLgotICAgICAqIEBwYXJhbSBzdHlsZW5hbWUgU3RyaW5nIHN0eWxlbmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZEJnY29sb3JTdHlsZShTdHJpbmcgY29sb3IsIFN0cmluZyBzdHlsZW5hbWUpIHsKLSAgICAgICAgcHJpbnQoIjxURCBCR0NPTE9SPVwiIiArIGNvbG9yICsgIlwiIENMQVNTPVwiIiArIHN0eWxlbmFtZSArICJcIj4iKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludCAmbHQ7VEQgQ09MU1BBTj1pIEJHQ09MT1I9ImNvbG9yIiBDTEFTUz0ic3R5bGVuYW1lIiZndDsgdGFnLgotICAgICAqCi0gICAgICogQHBhcmFtIGkgaW50ZWdlci4KLSAgICAgKiBAcGFyYW0gY29sb3IgU3RyaW5nIGNvbG9yLgotICAgICAqIEBwYXJhbSBzdHlsZW5hbWUgU3RyaW5nIHN0eWxlbmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZENvbHNwYW5CZ2NvbG9yU3R5bGUoaW50IGksIFN0cmluZyBjb2xvciwgU3RyaW5nIHN0eWxlbmFtZSkgewotICAgICAgICBwcmludCgiPFREIENPTFNQQU49IiArIGkgKyAiIEJHQ09MT1I9XCIiICsgY29sb3IgKyAiXCIgQ0xBU1M9XCIiICsKLSAgICAgICAgICAgICAgc3R5bGVuYW1lICsgIlwiPiIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50ICZsdDtURCBBTElHTj0iYWxpZ24iJmd0OyB0YWcuIEFkZHMgYSBuZXdsaW5lIGNoYXJhY3RlcgotICAgICAqIGF0IHRoZSBlbmQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYWxpZ24gU3RyaW5nIGFsaWduLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRkQWxpZ24oU3RyaW5nIGFsaWduKSB7Ci0gICAgICAgIHByaW50KCI8VEQgQUxJR049XCIiICsgYWxpZ24gKyAiXCI+Iik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnQgJmx0O1REIEFMSUdOPSJhbGlnbiIgQ0xBU1M9InN0eWxlbmFtZSImZ3Q7IHRhZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhbGlnbiAgICAgICAgU3RyaW5nIGFsaWduLgotICAgICAqIEBwYXJhbSBzdHlsZW5hbWUgICAgU3RyaW5nIHN0eWxlbmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZFZBbGlnbkNsYXNzKFN0cmluZyBhbGlnbiwgU3RyaW5nIHN0eWxlbmFtZSkgewotICAgICAgICBwcmludCgiPFREIFZBTElHTj1cIiIgKyBhbGlnbiArICJcIiBDTEFTUz1cIiIgKyBzdHlsZW5hbWUgKyAiXCI+Iik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnQgJmx0O1REIFZBTElHTj0idmFsaWduIiZndDsgdGFnLgotICAgICAqCi0gICAgICogQHBhcmFtIHZhbGlnbiBTdHJpbmcgdmFsaWduLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRkVkFsaWduKFN0cmluZyB2YWxpZ24pIHsKLSAgICAgICAgcHJpbnQoIjxURCBWQUxJR049XCIiICsgdmFsaWduICsgIlwiPiIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50ICZsdDtURCBBTElHTj0iYWxpZ24iIFZBTElHTj0idmFsaWduIiZndDsgdGFnLgotICAgICAqCi0gICAgICogQHBhcmFtIGFsaWduICAgU3RyaW5nIGFsaWduLgotICAgICAqIEBwYXJhbSB2YWxpZ24gIFN0cmluZyB2YWxpZ24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGRBbGlnblZBbGlnbihTdHJpbmcgYWxpZ24sIFN0cmluZyB2YWxpZ24pIHsKLSAgICAgICAgcHJpbnQoIjxURCBBTElHTj1cIiIgKyBhbGlnbiArICJcIiBWQUxJR049XCIiICsgdmFsaWduICsgIlwiPiIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50ICZsdDtURCBBTElHTj0iYWxpZ24iIFJPV1NQQU49cm93c3BhbiZndDsgdGFnLgotICAgICAqCi0gICAgICogQHBhcmFtIGFsaWduICAgIFN0cmluZyBhbGlnbi4KLSAgICAgKiBAcGFyYW0gcm93c3BhbiAgaW50ZWdlciByb3dzcGFuLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRkQWxpZ25Sb3dzcGFuKFN0cmluZyBhbGlnbiwgaW50IHJvd3NwYW4pIHsKLSAgICAgICAgcHJpbnQoIjxURCBBTElHTj1cIiIgKyBhbGlnbiArICJcIiBST1dTUEFOPSIgKyByb3dzcGFuICsgIj4iKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludCAmbHQ7VEQgQUxJR049ImFsaWduIiBWQUxJR049InZhbGlnbiIgUk9XU1BBTj1yb3dzcGFuJmd0OyB0YWcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYWxpZ24gICAgU3RyaW5nIGFsaWduLgotICAgICAqIEBwYXJhbSB2YWxpZ24gIFN0cmluZyB2YWxpZ24uCi0gICAgICogQHBhcmFtIHJvd3NwYW4gIGludGVnZXIgcm93c3Bhbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZEFsaWduVkFsaWduUm93c3BhbihTdHJpbmcgYWxpZ24sIFN0cmluZyB2YWxpZ24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvd3NwYW4pIHsKLSAgICAgICAgcHJpbnQoIjxURCBBTElHTj1cIiIgKyBhbGlnbiArICJcIiBWQUxJR049XCIiICsgdmFsaWduCi0gICAgICAgICAgICAgICAgKyAiXCIgUk9XU1BBTj0iICsgcm93c3BhbiArICI+Iik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJpbnQgJmx0O0JMT0NLUVVPVEUmZ3Q7IHRhZy4gQWRkIGEgbmV3bGluZSBjaGFyYWN0ZXIgYXQgdGhlIGVuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBibG9ja3F1b3RlKCkgewotICAgICAgICBwcmludGxuKCI8QkxPQ0tRVU9URT4iKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludCAmbHQ7L0JMT0NLUVVPVEUmZ3Q7IHRhZy4gQWRkIGEgbmV3bGluZSBjaGFyYWN0ZXIgYXQgdGhlIGVuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBibG9ja3F1b3RlRW5kKCkgewotICAgICAgICBwcmludGxuKCI8L0JMT0NLUVVPVEU+Iik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSAiJmx0O2NvZGUmZ3Q7IiBzdHJpbmcuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFN0cmluZyBSZXR1cm4gU3RyaW5nICImbHQ7Y29kZSZndDsiOwotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29kZSgpIHsKLSAgICAgICAgcmV0dXJuICI8Y29kZT4iOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgIiZsdDsvY29kZSZndDsiIHN0cmluZy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gU3RyaW5nIFJldHVybiBTdHJpbmcgIiZsdDsvY29kZSZndDsiOwotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29kZUVuZCgpIHsKLSAgICAgICAgcmV0dXJuICI8L2NvZGU+IjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludCAmbHQ7Tk9GUkFNRVMmZ3Q7IHRhZy4gQWRkIGEgbmV3bGluZSBjaGFyYWN0ZXIgYXQgdGhlIGVuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBub0ZyYW1lcygpIHsKLSAgICAgICAgcHJpbnRsbigiPE5PRlJBTUVTPiIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50ICZsdDsvTk9GUkFNRVMmZ3Q7IHRhZy4gQWRkIGEgbmV3bGluZSBjaGFyYWN0ZXIgYXQgdGhlIGVuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBub0ZyYW1lc0VuZCgpIHsKLSAgICAgICAgcHJpbnRsbigiPC9OT0ZSQU1FUz4iKTsKLSAgICB9CiB9CmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9tYXJrdXAvUmF3SHRtbC5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9mb3JtYXRzL2h0bWwvbWFya3VwL1Jhd0h0bWwuamF2YQppbmRleCA1NmMyMzk2Li44YWQzYzQwIDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9tYXJrdXAvUmF3SHRtbC5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL21hcmt1cC9SYXdIdG1sLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwxMiArMjUsMjAgQEAKIAogcGFja2FnZSBjb20uc3VuLnRvb2xzLmRvY2xldHMuZm9ybWF0cy5odG1sLm1hcmt1cDsKIAoraW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CisKIGltcG9ydCBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC5Db250ZW50OwogaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0LnV0aWwuKjsKIAogLyoqCiAgKiBDbGFzcyBmb3IgZ2VuZXJhdGluZyByYXcgSFRNTCBjb250ZW50IHRvIGJlIGFkZGVkIHRvIEhUTUwgcGFnZXMgb2YgamF2YWRvYyBvdXRwdXQuCiAgKgorICogIDxwPjxiPlRoaXMgaXMgTk9UIHBhcnQgb2YgYW55IHN1cHBvcnRlZCBBUEkuCisgKiAgSWYgeW91IHdyaXRlIGNvZGUgdGhhdCBkZXBlbmRzIG9uIHRoaXMsIHlvdSBkbyBzbyBhdCB5b3VyIG93biByaXNrLgorICogIFRoaXMgY29kZSBhbmQgaXRzIGludGVybmFsIGludGVyZmFjZXMgYXJlIHN1YmplY3QgdG8gY2hhbmdlIG9yCisgKiAgZGVsZXRpb24gd2l0aG91dCBub3RpY2UuPC9iPgorICoKICAqIEBhdXRob3IgQmhhdmVzaCBQYXRlbAogICovCiBwdWJsaWMgY2xhc3MgUmF3SHRtbCBleHRlbmRzIENvbnRlbnR7CkBAIC04Miw3ICs5MCwxNiBAQAogICAgIC8qKgogICAgICAqIHtAaW5oZXJpdERvY30KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3cml0ZShTdHJpbmdCdWlsZGVyIGNvbnRlbnRCdWlsZGVyKSB7Ci0gICAgICAgIGNvbnRlbnRCdWlsZGVyLmFwcGVuZChyYXdIdG1sQ29udGVudCk7CisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIHJhd0h0bWxDb250ZW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiB3cml0ZShXcml0ZXIgb3V0LCBib29sZWFuIGF0TmV3bGluZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgb3V0LndyaXRlKHJhd0h0bWxDb250ZW50KTsKKyAgICAgICAgcmV0dXJuIHJhd0h0bWxDb250ZW50LmVuZHNXaXRoKERvY2xldENvbnN0YW50cy5OTCk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9mb3JtYXRzL2h0bWwvbWFya3VwL1N0cmluZ0NvbnRlbnQuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvZm9ybWF0cy9odG1sL21hcmt1cC9TdHJpbmdDb250ZW50LmphdmEKaW5kZXggMmJmNDQzNy4uYWRkZGIzMiAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9mb3JtYXRzL2h0bWwvbWFya3VwL1N0cmluZ0NvbnRlbnQuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2Zvcm1hdHMvaHRtbC9tYXJrdXAvU3RyaW5nQ29udGVudC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMTIgKzI1LDIwIEBACiAKIHBhY2thZ2UgY29tLnN1bi50b29scy5kb2NsZXRzLmZvcm1hdHMuaHRtbC5tYXJrdXA7CiAKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworCiBpbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQuQ29udGVudDsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC51dGlsLio7CiAKIC8qKgogICogQ2xhc3MgZm9yIGdlbmVyYXRpbmcgc3RyaW5nIGNvbnRlbnQgZm9yIEhUTUwgdGFncyBvZiBqYXZhZG9jIG91dHB1dC4KICAqCisgKiAgPHA+PGI+VGhpcyBpcyBOT1QgcGFydCBvZiBhbnkgc3VwcG9ydGVkIEFQSS4KKyAqICBJZiB5b3Ugd3JpdGUgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhpcywgeW91IGRvIHNvIGF0IHlvdXIgb3duIHJpc2suCisgKiAgVGhpcyBjb2RlIGFuZCBpdHMgaW50ZXJuYWwgaW50ZXJmYWNlcyBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugb3IKKyAqICBkZWxldGlvbiB3aXRob3V0IG5vdGljZS48L2I+CisgKgogICogQGF1dGhvciBCaGF2ZXNoIFBhdGVsCiAgKi8KIHB1YmxpYyBjbGFzcyBTdHJpbmdDb250ZW50IGV4dGVuZHMgQ29udGVudHsKQEAgLTkzLDcgKzEwMSwxMCBAQAogICAgIC8qKgogICAgICAqIHtAaW5oZXJpdERvY30KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3cml0ZShTdHJpbmdCdWlsZGVyIGNvbnRlbnRCdWlsZGVyKSB7Ci0gICAgICAgIGNvbnRlbnRCdWlsZGVyLmFwcGVuZChzdHJpbmdDb250ZW50KTsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiB3cml0ZShXcml0ZXIgb3V0LCBib29sZWFuIGF0TmV3bGluZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHMgPSBzdHJpbmdDb250ZW50LnRvU3RyaW5nKCk7CisgICAgICAgIG91dC53cml0ZShzKTsKKyAgICAgICAgcmV0dXJuIHMuZW5kc1dpdGgoRG9jbGV0Q29uc3RhbnRzLk5MKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvQWJzdHJhY3REb2NsZXQuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC9BYnN0cmFjdERvY2xldC5qYXZhCmluZGV4IDM5ZjNhZjguLjdmMzhmMzggMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC9BYnN0cmFjdERvY2xldC5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC9BYnN0cmFjdERvY2xldC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMTggKzI1LDE5IEBACiAKIHBhY2thZ2UgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQ7CiAKK2ltcG9ydCBjb20uc3VuLmphdmFkb2MuKjsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC5idWlsZGVycy4qOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0LnV0aWwuKjsKLWltcG9ydCBjb20uc3VuLmphdmFkb2MuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CiAKIC8qKgogICogQW4gYWJzdHJhY3QgaW1wbGVtZW50YXRpb24gb2YgYSBEb2NsZXQuCiAgKgotICogVGhpcyBjb2RlIGlzIG5vdCBwYXJ0IG9mIGFuIEFQSS4KLSAqIEl0IGlzIGltcGxlbWVudGF0aW9uIHRoYXQgaXMgc3ViamVjdCB0byBjaGFuZ2UuCi0gKiBEbyBub3QgdXNlIGl0IGFzIGFuIEFQSS4KKyAqICA8cD48Yj5UaGlzIGlzIE5PVCBwYXJ0IG9mIGFueSBzdXBwb3J0ZWQgQVBJLgorICogIElmIHlvdSB3cml0ZSBjb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGlzLCB5b3UgZG8gc28gYXQgeW91ciBvd24gcmlzay4KKyAqICBUaGlzIGNvZGUgYW5kIGl0cyBpbnRlcm5hbCBpbnRlcmZhY2VzIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSBvcgorICogIGRlbGV0aW9uIHdpdGhvdXQgbm90aWNlLjwvYj4KICAqCiAgKiBAYXV0aG9yIEphbWllIEhvCiAgKi8KZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC9Bbm5vdGF0aW9uVHlwZU9wdGlvbmFsTWVtYmVyV3JpdGVyLmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvQW5ub3RhdGlvblR5cGVPcHRpb25hbE1lbWJlcldyaXRlci5qYXZhCmluZGV4IDY0ZjRiMzQuLjE4YWRhMTkgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC9Bbm5vdGF0aW9uVHlwZU9wdGlvbmFsTWVtYmVyV3JpdGVyLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L0Fubm90YXRpb25UeXBlT3B0aW9uYWxNZW1iZXJXcml0ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTAsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTMwLDkgKzMwLDEwIEBACiAvKioKICAqIFRoZSBpbnRlcmZhY2UgZm9yIHdyaXRpbmcgYW5ub3RhdGlvbiB0eXBlIG9wdGlvbmFsIG1lbWJlciBvdXRwdXQuCiAgKgotICogVGhpcyBjb2RlIGlzIG5vdCBwYXJ0IG9mIGFuIEFQSS4KLSAqIEl0IGlzIGltcGxlbWVudGF0aW9uIHRoYXQgaXMgc3ViamVjdCB0byBjaGFuZ2UuCi0gKiBEbyBub3QgdXNlIGl0IGFzIGFuIEFQSQorICogIDxwPjxiPlRoaXMgaXMgTk9UIHBhcnQgb2YgYW55IHN1cHBvcnRlZCBBUEkuCisgKiAgSWYgeW91IHdyaXRlIGNvZGUgdGhhdCBkZXBlbmRzIG9uIHRoaXMsIHlvdSBkbyBzbyBhdCB5b3VyIG93biByaXNrLgorICogIFRoaXMgY29kZSBhbmQgaXRzIGludGVybmFsIGludGVyZmFjZXMgYXJlIHN1YmplY3QgdG8gY2hhbmdlIG9yCisgKiAgZGVsZXRpb24gd2l0aG91dCBub3RpY2UuPC9iPgogICoKICAqIEBhdXRob3IgSmFtaWUgSG8KICAqIEBhdXRob3IgQmhhdmVzaCBQYXRlbCAoTW9kaWZpZWQpCmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvQW5ub3RhdGlvblR5cGVSZXF1aXJlZE1lbWJlcldyaXRlci5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L0Fubm90YXRpb25UeXBlUmVxdWlyZWRNZW1iZXJXcml0ZXIuamF2YQppbmRleCBmYjgzYzJhLi4yOGExOGY5IDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvQW5ub3RhdGlvblR5cGVSZXF1aXJlZE1lbWJlcldyaXRlci5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC9Bbm5vdGF0aW9uVHlwZVJlcXVpcmVkTWVtYmVyV3JpdGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDEwLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0zMSw5ICszMSwxMSBAQAogLyoqCiAgKiBUaGUgaW50ZXJmYWNlIGZvciB3cml0aW5nIGFubm90YXRpb24gdHlwZSByZXF1aXJlZCBtZW1iZXIgb3V0cHV0LgogICoKLSAqIFRoaXMgY29kZSBpcyBub3QgcGFydCBvZiBhbiBBUEkuCi0gKiBJdCBpcyBpbXBsZW1lbnRhdGlvbiB0aGF0IGlzIHN1YmplY3QgdG8gY2hhbmdlLgotICogRG8gbm90IHVzZSBpdCBhcyBhbiBBUEkKKyAqICA8cD48Yj5UaGlzIGlzIE5PVCBwYXJ0IG9mIGFueSBzdXBwb3J0ZWQgQVBJLgorICogIElmIHlvdSB3cml0ZSBjb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGlzLCB5b3UgZG8gc28gYXQgeW91ciBvd24gcmlzay4KKyAqICBUaGlzIGNvZGUgYW5kIGl0cyBpbnRlcm5hbCBpbnRlcmZhY2VzIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSBvcgorICogIGRlbGV0aW9uIHdpdGhvdXQgbm90aWNlLjwvYj4KKyAqCiAgKgogICogQGF1dGhvciBKYW1pZSBIbwogICogQGF1dGhvciBCaGF2ZXNoIFBhdGVsIChNb2RpZmllZCkKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC9Bbm5vdGF0aW9uVHlwZVdyaXRlci5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L0Fubm90YXRpb25UeXBlV3JpdGVyLmphdmEKaW5kZXggOWVmNjNiNS4uYjY1NzQwZSAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L0Fubm90YXRpb25UeXBlV3JpdGVyLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L0Fubm90YXRpb25UeXBlV3JpdGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDEwLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0zMiw5ICszMiwxMCBAQAogLyoqCiAgKiBUaGUgaW50ZXJmYWNlIGZvciB3cml0aW5nIGFubm90YXRpb24gdHlwZSBvdXRwdXQuCiAgKgotICogVGhpcyBjb2RlIGlzIG5vdCBwYXJ0IG9mIGFuIEFQSS4KLSAqIEl0IGlzIGltcGxlbWVudGF0aW9uIHRoYXQgaXMgc3ViamVjdCB0byBjaGFuZ2UuCi0gKiBEbyBub3QgdXNlIGl0IGFzIGFuIEFQSS4KKyAqICA8cD48Yj5UaGlzIGlzIE5PVCBwYXJ0IG9mIGFueSBzdXBwb3J0ZWQgQVBJLgorICogIElmIHlvdSB3cml0ZSBjb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGlzLCB5b3UgZG8gc28gYXQgeW91ciBvd24gcmlzay4KKyAqICBUaGlzIGNvZGUgYW5kIGl0cyBpbnRlcm5hbCBpbnRlcmZhY2VzIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSBvcgorICogIGRlbGV0aW9uIHdpdGhvdXQgbm90aWNlLjwvYj4KICAqCiAgKiBAYXV0aG9yIEphbWllIEhvCiAgKiBAYXV0aG9yIEJoYXZlc2ggUGF0ZWwgKE1vZGlmaWVkKQpAQCAtMTUyLDcgKzE1Myw3IEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gY29udGVudFRyZWUgY29udGVudCB0cmVlIHRoYXQgd2lsbCBiZSBwcmludGVkIGFzIGEgZG9jdW1lbnQKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwcmludERvY3VtZW50KENvbnRlbnQgY29udGVudFRyZWUpOworICAgIHB1YmxpYyB2b2lkIHByaW50RG9jdW1lbnQoQ29udGVudCBjb250ZW50VHJlZSkgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCiAgICAgICogQ2xvc2UgdGhlIHdyaXRlci4KZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC9DbGFzc1dyaXRlci5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L0NsYXNzV3JpdGVyLmphdmEKaW5kZXggYzViZmIxMy4uZjU5MDRiMyAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L0NsYXNzV3JpdGVyLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L0NsYXNzV3JpdGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDEwLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0zMiw5ICszMiwxMCBAQAogLyoqCiAgKiBUaGUgaW50ZXJmYWNlIGZvciB3cml0aW5nIGNsYXNzIG91dHB1dC4KICAqCi0gKiBUaGlzIGNvZGUgaXMgbm90IHBhcnQgb2YgYW4gQVBJLgotICogSXQgaXMgaW1wbGVtZW50YXRpb24gdGhhdCBpcyBzdWJqZWN0IHRvIGNoYW5nZS4KLSAqIERvIG5vdCB1c2UgaXQgYXMgYW4gQVBJCisgKiAgPHA+PGI+VGhpcyBpcyBOT1QgcGFydCBvZiBhbnkgc3VwcG9ydGVkIEFQSS4KKyAqICBJZiB5b3Ugd3JpdGUgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhpcywgeW91IGRvIHNvIGF0IHlvdXIgb3duIHJpc2suCisgKiAgVGhpcyBjb2RlIGFuZCBpdHMgaW50ZXJuYWwgaW50ZXJmYWNlcyBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugb3IKKyAqICBkZWxldGlvbiB3aXRob3V0IG5vdGljZS48L2I+CiAgKgogICogQGF1dGhvciBKYW1pZSBIbwogICogQGF1dGhvciBCaGF2ZXNoIFBhdGVsIChNb2RpZmllZCkKQEAgLTE3OSw3ICsxODAsNyBAQAogICAgICAqCiAgICAgICogQHBhcmFtIGNvbnRlbnRUcmVlIGNvbnRlbnQgdHJlZSB0aGF0IHdpbGwgYmUgcHJpbnRlZCBhcyBhIGRvY3VtZW50CiAgICAgICovCi0gICAgcHVibGljIHZvaWQgcHJpbnREb2N1bWVudChDb250ZW50IGNvbnRlbnRUcmVlKTsKKyAgICBwdWJsaWMgdm9pZCBwcmludERvY3VtZW50KENvbnRlbnQgY29udGVudFRyZWUpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgogICAgICAqIENsb3NlIHRoZSB3cml0ZXIuCmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvQ29uZmlndXJhdGlvbi5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L0NvbmZpZ3VyYXRpb24uamF2YQppbmRleCBlM2QxNWViLi5kM2NmOTdjIDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvQ29uZmlndXJhdGlvbi5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC9Db25maWd1cmF0aW9uLmphdmEKQEAgLTI1LDEyICsyNSwxMyBAQAogCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0OwogCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEudXRpbC4qOworCitpbXBvcnQgY29tLnN1bi5qYXZhZG9jLio7CitpbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQuYnVpbGRlcnMuQnVpbGRlckZhY3Rvcnk7CiBpbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQudGFnbGV0cy4qOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0LnV0aWwuKjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC5idWlsZGVycy5CdWlsZGVyRmFjdG9yeTsKLWltcG9ydCBjb20uc3VuLmphdmFkb2MuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLmlvLio7CiAKIC8qKgogICogQ29uZmlndXJlIHRoZSBvdXRwdXQgYmFzZWQgb24gdGhlIG9wdGlvbnMuIERvY2xldHMgc2hvdWxkIHN1Yi1jbGFzcwpAQCAtMzgsOSArMzksMTAgQEAKICAqIGFsbCB1c2VyIG9wdGlvbnMgd2hpY2ggYXJlIHN1cHBvcnRlZCBieSB0aGUgMS4xIGRvY2xldCBhbmQgdGhlIHN0YW5kYXJkCiAgKiBkb2NsZXQuCiAgKgotICogVGhpcyBjb2RlIGlzIG5vdCBwYXJ0IG9mIGFuIEFQSS4KLSAqIEl0IGlzIGltcGxlbWVudGF0aW9uIHRoYXQgaXMgc3ViamVjdCB0byBjaGFuZ2UuCi0gKiBEbyBub3QgdXNlIGl0IGFzIGFuIEFQSQorICogIDxwPjxiPlRoaXMgaXMgTk9UIHBhcnQgb2YgYW55IHN1cHBvcnRlZCBBUEkuCisgKiAgSWYgeW91IHdyaXRlIGNvZGUgdGhhdCBkZXBlbmRzIG9uIHRoaXMsIHlvdSBkbyBzbyBhdCB5b3VyIG93biByaXNrLgorICogIFRoaXMgY29kZSBhbmQgaXRzIGludGVybmFsIGludGVyZmFjZXMgYXJlIHN1YmplY3QgdG8gY2hhbmdlIG9yCisgKiAgZGVsZXRpb24gd2l0aG91dCBub3RpY2UuPC9iPgogICoKICAqIEBhdXRob3IgUm9iZXJ0IEZpZWxkLgogICogQGF1dGhvciBBdHVsIERhbWJhbGthci4KQEAgLTQ2Myw3ICs0NjUsNyBAQAogICAgICAgICAgICAgICAgICAgICB0YWdsZXRNYW5hZ2VyLmFkZE5ld1NpbXBsZUN1c3RvbVRhZyh0YWdOYW1lLCBudWxsLCAiIik7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgLy9DcmVhdGUgYSBzaW1wbGUgdGFnIHdpdGggdGhlIGhlYWRpbmcgdGhhdCBoYXMgdGhlIHNhbWUgbmFtZSBhcyB0aGUgdGFnLgotICAgICAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgaGVhZGluZyA9IG5ldyBTdHJpbmdCdWZmZXIodGFnTmFtZSArICI6Iik7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgaGVhZGluZyA9IG5ldyBTdHJpbmdCdWlsZGVyKHRhZ05hbWUgKyAiOiIpOwogICAgICAgICAgICAgICAgICAgICBoZWFkaW5nLnNldENoYXJBdCgwLCBDaGFyYWN0ZXIudG9VcHBlckNhc2UodGFnTmFtZS5jaGFyQXQoMCkpKTsKICAgICAgICAgICAgICAgICAgICAgdGFnbGV0TWFuYWdlci5hZGROZXdTaW1wbGVDdXN0b21UYWcodGFnTmFtZSwgaGVhZGluZy50b1N0cmluZygpLCAiYSIpOwogICAgICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC9Db25zdGFudHNTdW1tYXJ5V3JpdGVyLmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvQ29uc3RhbnRzU3VtbWFyeVdyaXRlci5qYXZhCmluZGV4IGEyZWFiMWIuLjEzMThhMTMgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC9Db25zdGFudHNTdW1tYXJ5V3JpdGVyLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L0NvbnN0YW50c1N1bW1hcnlXcml0ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTAsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDE2ICsyNSwxOCBAQAogCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0OwogCi1pbXBvcnQgamF2YS51dGlsLio7CiBpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEudXRpbC4qOworCiBpbXBvcnQgY29tLnN1bi5qYXZhZG9jLio7CiAKIC8qKgogICogVGhlIGludGVyZmFjZSBmb3Igd3JpdGluZyBjb25zdGFudHMgc3VtbWFyeSBvdXRwdXQuCiAgKgotICogVGhpcyBjb2RlIGlzIG5vdCBwYXJ0IG9mIGFuIEFQSS4KLSAqIEl0IGlzIGltcGxlbWVudGF0aW9uIHRoYXQgaXMgc3ViamVjdCB0byBjaGFuZ2UuCi0gKiBEbyBub3QgdXNlIGl0IGFzIGFuIEFQSQorICogIDxwPjxiPlRoaXMgaXMgTk9UIHBhcnQgb2YgYW55IHN1cHBvcnRlZCBBUEkuCisgKiAgSWYgeW91IHdyaXRlIGNvZGUgdGhhdCBkZXBlbmRzIG9uIHRoaXMsIHlvdSBkbyBzbyBhdCB5b3VyIG93biByaXNrLgorICogIFRoaXMgY29kZSBhbmQgaXRzIGludGVybmFsIGludGVyZmFjZXMgYXJlIHN1YmplY3QgdG8gY2hhbmdlIG9yCisgKiAgZGVsZXRpb24gd2l0aG91dCBub3RpY2UuPC9iPgogICoKICAqIEBhdXRob3IgSmFtaWUgSG8KICAqIEBhdXRob3IgQmhhdmVzaCBQYXRlbCAoTW9kaWZpZWQpCkBAIC0xMzcsNiArMTM5LDYgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSBjb250ZW50VHJlZSBjb250ZW50IHRyZWUgd2hpY2ggc2hvdWxkIGJlIHByaW50ZWQKICAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBwcmludERvY3VtZW50KENvbnRlbnQgY29udGVudFRyZWUpOworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHByaW50RG9jdW1lbnQoQ29udGVudCBjb250ZW50VHJlZSkgdGhyb3dzIElPRXhjZXB0aW9uOwogCiB9CmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvQ29uc3RydWN0b3JXcml0ZXIuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC9Db25zdHJ1Y3RvcldyaXRlci5qYXZhCmluZGV4IDhhZDQ4MjQuLmY3ODRiNGEgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC9Db25zdHJ1Y3RvcldyaXRlci5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC9Db25zdHJ1Y3RvcldyaXRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMCwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMzEsOSArMzEsMTAgQEAKIC8qKgogICogVGhlIGludGVyZmFjZSBmb3Igd3JpdGluZyBjb25zdHJ1Y3RvciBvdXRwdXQuCiAgKgotICogVGhpcyBjb2RlIGlzIG5vdCBwYXJ0IG9mIGFuIEFQSS4KLSAqIEl0IGlzIGltcGxlbWVudGF0aW9uIHRoYXQgaXMgc3ViamVjdCB0byBjaGFuZ2UuCi0gKiBEbyBub3QgdXNlIGl0IGFzIGFuIEFQSQorICogIDxwPjxiPlRoaXMgaXMgTk9UIHBhcnQgb2YgYW55IHN1cHBvcnRlZCBBUEkuCisgKiAgSWYgeW91IHdyaXRlIGNvZGUgdGhhdCBkZXBlbmRzIG9uIHRoaXMsIHlvdSBkbyBzbyBhdCB5b3VyIG93biByaXNrLgorICogIFRoaXMgY29kZSBhbmQgaXRzIGludGVybmFsIGludGVyZmFjZXMgYXJlIHN1YmplY3QgdG8gY2hhbmdlIG9yCisgKiAgZGVsZXRpb24gd2l0aG91dCBub3RpY2UuPC9iPgogICoKICAqIEBhdXRob3IgSmFtaWUgSG8KICAqIEBhdXRob3IgQmhhdmVzaCBQYXRlbCAoTW9kaWZpZWQpCmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvQ29udGVudC5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L0NvbnRlbnQuamF2YQppbmRleCBhN2JkZjk2Li44MzZmN2NmIDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvQ29udGVudC5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC9Db250ZW50LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwxMSArMjUsMjAgQEAKIAogcGFja2FnZSBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdDsKIAoraW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CisKIGltcG9ydCBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC51dGlsLio7CiAKIC8qKgogICogQSBjbGFzcyB0byBjcmVhdGUgY29udGVudCBmb3IgamF2YWRvYyBvdXRwdXQgcGFnZXMuCiAgKgorICogIDxwPjxiPlRoaXMgaXMgTk9UIHBhcnQgb2YgYW55IHN1cHBvcnRlZCBBUEkuCisgKiAgSWYgeW91IHdyaXRlIGNvZGUgdGhhdCBkZXBlbmRzIG9uIHRoaXMsIHlvdSBkbyBzbyBhdCB5b3VyIG93biByaXNrLgorICogIFRoaXMgY29kZSBhbmQgaXRzIGludGVybmFsIGludGVyZmFjZXMgYXJlIHN1YmplY3QgdG8gY2hhbmdlIG9yCisgKiAgZGVsZXRpb24gd2l0aG91dCBub3RpY2UuPC9iPgorICoKICAqIEBhdXRob3IgQmhhdmVzaCBQYXRlbAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29udGVudCB7CkBAIC0zOSwxMCArNDgsMTYgQEAKICAgICAgKgogICAgICAqIEByZXR1cm4gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjb250ZW50CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBjb250ZW50QnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIHdyaXRlKGNvbnRlbnRCdWlsZGVyKTsKLSAgICAgICAgcmV0dXJuIGNvbnRlbnRCdWlsZGVyLnRvU3RyaW5nKCk7CisgICAgICAgIFN0cmluZ1dyaXRlciBvdXQgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB3cml0ZShvdXQsIHRydWUpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBjYW5ub3QgaGFwcGVuIGZyb20gU3RyaW5nV3JpdGVyCisgICAgICAgICAgICB0aHJvdyBuZXcgRG9jbGV0QWJvcnRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gb3V0LnRvU3RyaW5nKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC02MCwxMCArNzUsMTAgQEAKICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBhZGRDb250ZW50KFN0cmluZyBzdHJpbmdDb250ZW50KTsKIAogICAgIC8qKgotICAgICAqIFdyaXRlcyBjb250ZW50IHRvIGEgU3RyaW5nQnVpbGRlci4KKyAgICAgKiBXcml0ZXMgY29udGVudCB0byBhIHdyaXRlci4KICAgICAgKgogICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHdyaXRlKFN0cmluZ0J1aWxkZXIgY29udGVudEJ1aWxkZXIpOworICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHdyaXRlKFdyaXRlciB3cml0ZXIsIGJvb2xlYW4gYXROZXdsaW5lKSB0aHJvd3MgSU9FeGNlcHRpb24gOwogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBjb250ZW50IGlzIGVtcHR5LgpkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L0VudW1Db25zdGFudFdyaXRlci5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L0VudW1Db25zdGFudFdyaXRlci5qYXZhCmluZGV4IDhiMTQyNjcuLjk4N2M1MmYgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC9FbnVtQ29uc3RhbnRXcml0ZXIuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvRW51bUNvbnN0YW50V3JpdGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDEwLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0zMSw5ICszMSwxMCBAQAogLyoqCiAgKiBUaGUgaW50ZXJmYWNlIGZvciB3cml0aW5nIGVudW0gY29uc3RhbnQgb3V0cHV0LgogICoKLSAqIFRoaXMgY29kZSBpcyBub3QgcGFydCBvZiBhbiBBUEkuCi0gKiBJdCBpcyBpbXBsZW1lbnRhdGlvbiB0aGF0IGlzIHN1YmplY3QgdG8gY2hhbmdlLgotICogRG8gbm90IHVzZSBpdCBhcyBhbiBBUEkKKyAqICA8cD48Yj5UaGlzIGlzIE5PVCBwYXJ0IG9mIGFueSBzdXBwb3J0ZWQgQVBJLgorICogIElmIHlvdSB3cml0ZSBjb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGlzLCB5b3UgZG8gc28gYXQgeW91ciBvd24gcmlzay4KKyAqICBUaGlzIGNvZGUgYW5kIGl0cyBpbnRlcm5hbCBpbnRlcmZhY2VzIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSBvcgorICogIGRlbGV0aW9uIHdpdGhvdXQgbm90aWNlLjwvYj4KICAqCiAgKiBAYXV0aG9yIEphbWllIEhvCiAgKiBAYXV0aG9yIEJoYXZlc2ggUGF0ZWwgKE1vZGlmaWVkKQpAQCAtNTYsNyArNTcsNyBAQAogICAgICAqIEdldCB0aGUgZW51bSBjb25zdGFudHMgZG9jdW1lbnRhdGlvbiB0cmVlIGhlYWRlci4KICAgICAgKgogICAgICAqIEBwYXJhbSBlbnVtQ29uc3RhbnQgdGhlIGVudW0gY29uc3RhbnQgYmVpbmcgZG9jdW1lbnRlZAotICAgICAqIEBwYXJhbSBlbnVtQ29uc3RhbnREZXRhaWxzVHJlZSB0aGUgY29udGVudCB0cmVlIHJlcHJlc2VudGluZyBlbnVtIGNvbnN0YW50IGRldGFpbHMKKyAgICAgKiBAcGFyYW0gZW51bUNvbnN0YW50c0RldGFpbHNUcmVlIHRoZSBjb250ZW50IHRyZWUgcmVwcmVzZW50aW5nIGVudW0gY29uc3RhbnQgZGV0YWlscwogICAgICAqIEByZXR1cm4gY29udGVudCB0cmVlIGZvciB0aGUgZW51bSBjb25zdGFudCBkb2N1bWVudGF0aW9uIGhlYWRlcgogICAgICAqLwogICAgIHB1YmxpYyBDb250ZW50IGdldEVudW1Db25zdGFudHNUcmVlSGVhZGVyKEZpZWxkRG9jIGVudW1Db25zdGFudCwKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC9GaWVsZFdyaXRlci5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L0ZpZWxkV3JpdGVyLmphdmEKaW5kZXggYzE3YWMyNi4uNTU0ZjE5OSAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L0ZpZWxkV3JpdGVyLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L0ZpZWxkV3JpdGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDEwLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0zMSw5ICszMSwxMCBAQAogLyoqCiAgKiBUaGUgaW50ZXJmYWNlIGZvciB3cml0aW5nIGZpZWxkIG91dHB1dC4KICAqCi0gKiBUaGlzIGNvZGUgaXMgbm90IHBhcnQgb2YgYW4gQVBJLgotICogSXQgaXMgaW1wbGVtZW50YXRpb24gdGhhdCBpcyBzdWJqZWN0IHRvIGNoYW5nZS4KLSAqIERvIG5vdCB1c2UgaXQgYXMgYW4gQVBJCisgKiAgPHA+PGI+VGhpcyBpcyBOT1QgcGFydCBvZiBhbnkgc3VwcG9ydGVkIEFQSS4KKyAqICBJZiB5b3Ugd3JpdGUgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhpcywgeW91IGRvIHNvIGF0IHlvdXIgb3duIHJpc2suCisgKiAgVGhpcyBjb2RlIGFuZCBpdHMgaW50ZXJuYWwgaW50ZXJmYWNlcyBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugb3IKKyAqICBkZWxldGlvbiB3aXRob3V0IG5vdGljZS48L2I+CiAgKgogICogQGF1dGhvciBKYW1pZSBIbwogICogQGF1dGhvciBCaGF2ZXNoIFBhdGVsIChNb2RpZmllZCkKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC9NZW1iZXJTdW1tYXJ5V3JpdGVyLmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvTWVtYmVyU3VtbWFyeVdyaXRlci5qYXZhCmluZGV4IDc2YmFmNTkuLjUzZTBiNWIgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC9NZW1iZXJTdW1tYXJ5V3JpdGVyLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L01lbWJlclN1bW1hcnlXcml0ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTAsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTMyLDkgKzMyLDEwIEBACiAvKioKICAqIFRoZSBpbnRlcmZhY2UgZm9yIHdyaXRpbmcgbWVtYmVyIHN1bW1hcnkgb3V0cHV0LgogICoKLSAqIFRoaXMgY29kZSBpcyBub3QgcGFydCBvZiBhbiBBUEkuCi0gKiBJdCBpcyBpbXBsZW1lbnRhdGlvbiB0aGF0IGlzIHN1YmplY3QgdG8gY2hhbmdlLgotICogRG8gbm90IHVzZSBpdCBhcyBhbiBBUEkKKyAqICA8cD48Yj5UaGlzIGlzIE5PVCBwYXJ0IG9mIGFueSBzdXBwb3J0ZWQgQVBJLgorICogIElmIHlvdSB3cml0ZSBjb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGlzLCB5b3UgZG8gc28gYXQgeW91ciBvd24gcmlzay4KKyAqICBUaGlzIGNvZGUgYW5kIGl0cyBpbnRlcm5hbCBpbnRlcmZhY2VzIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSBvcgorICogIGRlbGV0aW9uIHdpdGhvdXQgbm90aWNlLjwvYj4KICAqCiAgKiBAYXV0aG9yIEphbWllIEhvCiAgKiBAYXV0aG9yIEJoYXZlc2ggUGF0ZWwgKE1vZGlmaWVkKQpkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L01ldGhvZFdyaXRlci5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L01ldGhvZFdyaXRlci5qYXZhCmluZGV4IDE4NjRiZjkuLmNlNGI5MGUgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC9NZXRob2RXcml0ZXIuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvTWV0aG9kV3JpdGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDEwLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0zMSw5ICszMSwxMCBAQAogLyoqCiAgKiBUaGUgaW50ZXJmYWNlIGZvciB3cml0aW5nIG1ldGhvZCBvdXRwdXQuCiAgKgotICogVGhpcyBjb2RlIGlzIG5vdCBwYXJ0IG9mIGFuIEFQSS4KLSAqIEl0IGlzIGltcGxlbWVudGF0aW9uIHRoYXQgaXMgc3ViamVjdCB0byBjaGFuZ2UuCi0gKiBEbyBub3QgdXNlIGl0IGFzIGFuIEFQSQorICogIDxwPjxiPlRoaXMgaXMgTk9UIHBhcnQgb2YgYW55IHN1cHBvcnRlZCBBUEkuCisgKiAgSWYgeW91IHdyaXRlIGNvZGUgdGhhdCBkZXBlbmRzIG9uIHRoaXMsIHlvdSBkbyBzbyBhdCB5b3VyIG93biByaXNrLgorICogIFRoaXMgY29kZSBhbmQgaXRzIGludGVybmFsIGludGVyZmFjZXMgYXJlIHN1YmplY3QgdG8gY2hhbmdlIG9yCisgKiAgZGVsZXRpb24gd2l0aG91dCBub3RpY2UuPC9iPgogICoKICAqIEBhdXRob3IgSmFtaWUgSG8KICAqIEBhdXRob3IgQmhhdmVzaCBQYXRlbCAoTW9kaWZpZWQpCmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvTmVzdGVkQ2xhc3NXcml0ZXIuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC9OZXN0ZWRDbGFzc1dyaXRlci5qYXZhCmluZGV4IGE1YTAyM2EuLjRhZWE5MDkgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC9OZXN0ZWRDbGFzc1dyaXRlci5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC9OZXN0ZWRDbGFzc1dyaXRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMCwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMzAsOSArMzAsMTAgQEAKIC8qKgogICogVGhlIGludGVyZmFjZSBmb3Igd3JpdGluZyBjbGFzcyBvdXRwdXQuCiAgKgotICogVGhpcyBjb2RlIGlzIG5vdCBwYXJ0IG9mIGFuIEFQSS4KLSAqIEl0IGlzIGltcGxlbWVudGF0aW9uIHRoYXQgaXMgc3ViamVjdCB0byBjaGFuZ2UuCi0gKiBEbyBub3QgdXNlIGl0IGFzIGFuIEFQSQorICogIDxwPjxiPlRoaXMgaXMgTk9UIHBhcnQgb2YgYW55IHN1cHBvcnRlZCBBUEkuCisgKiAgSWYgeW91IHdyaXRlIGNvZGUgdGhhdCBkZXBlbmRzIG9uIHRoaXMsIHlvdSBkbyBzbyBhdCB5b3VyIG93biByaXNrLgorICogIFRoaXMgY29kZSBhbmQgaXRzIGludGVybmFsIGludGVyZmFjZXMgYXJlIHN1YmplY3QgdG8gY2hhbmdlIG9yCisgKiAgZGVsZXRpb24gd2l0aG91dCBub3RpY2UuPC9iPgogICoKICAqIEBhdXRob3IgSmFtaWUgSG8KICAqIEBhdXRob3IgQmhhdmVzaCBQYXRlbCAoTW9kaWZpZWQpCmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvUGFja2FnZVN1bW1hcnlXcml0ZXIuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC9QYWNrYWdlU3VtbWFyeVdyaXRlci5qYXZhCmluZGV4IGViOGJmN2IuLjAwMTMzNTEgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC9QYWNrYWdlU3VtbWFyeVdyaXRlci5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC9QYWNrYWdlU3VtbWFyeVdyaXRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMCwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMTUgKzI1LDE3IEBACiAKIHBhY2thZ2UgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQ7CiAKLWltcG9ydCBjb20uc3VuLmphdmFkb2MuKjsKIGltcG9ydCBqYXZhLmlvLio7CiAKK2ltcG9ydCBjb20uc3VuLmphdmFkb2MuKjsKKwogLyoqCiAgKiBUaGUgaW50ZXJmYWNlIGZvciB3cml0aW5nIHBhY2thZ2Ugc3VtbWFyeSBvdXRwdXQuCiAgKgotICogVGhpcyBjb2RlIGlzIG5vdCBwYXJ0IG9mIGFuIEFQSS4KLSAqIEl0IGlzIGltcGxlbWVudGF0aW9uIHRoYXQgaXMgc3ViamVjdCB0byBjaGFuZ2UuCi0gKiBEbyBub3QgdXNlIGl0IGFzIGFuIEFQSQorICogIDxwPjxiPlRoaXMgaXMgTk9UIHBhcnQgb2YgYW55IHN1cHBvcnRlZCBBUEkuCisgKiAgSWYgeW91IHdyaXRlIGNvZGUgdGhhdCBkZXBlbmRzIG9uIHRoaXMsIHlvdSBkbyBzbyBhdCB5b3VyIG93biByaXNrLgorICogIFRoaXMgY29kZSBhbmQgaXRzIGludGVybmFsIGludGVyZmFjZXMgYXJlIHN1YmplY3QgdG8gY2hhbmdlIG9yCisgKiAgZGVsZXRpb24gd2l0aG91dCBub3RpY2UuPC9iPgogICoKICAqIEBhdXRob3IgSmFtaWUgSG8KICAqIEBhdXRob3IgQmhhdmVzaCBQYXRlbCAoTW9kaWZpZWQpCkBAIC0xMTMsNyArMTE1LDcgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSBjb250ZW50VHJlZSB0aGUgY29udGVudCB0cmVlIHRoYXQgd2lsbCBiZSBwcmludGVkCiAgICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgcHJpbnREb2N1bWVudChDb250ZW50IGNvbnRlbnRUcmVlKTsKKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBwcmludERvY3VtZW50KENvbnRlbnQgY29udGVudFRyZWUpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgogICAgICAqIENsb3NlIHRoZSB3cml0ZXIuCmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvU2VyaWFsaXplZEZvcm1Xcml0ZXIuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC9TZXJpYWxpemVkRm9ybVdyaXRlci5qYXZhCmluZGV4IDg0NDU0YWMuLjg5YWRkOGEgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC9TZXJpYWxpemVkRm9ybVdyaXRlci5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC9TZXJpYWxpemVkRm9ybVdyaXRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMCwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMzIsOSArMzIsMTAgQEAKIC8qKgogICogVGhlIGludGVyZmFjZSBmb3Igd3JpdGluZyBzZXJpYWxpemVkIGZvcm0gb3V0cHV0LgogICoKLSAqIFRoaXMgY29kZSBpcyBub3QgcGFydCBvZiBhbiBBUEkuCi0gKiBJdCBpcyBpbXBsZW1lbnRhdGlvbiB0aGF0IGlzIHN1YmplY3QgdG8gY2hhbmdlLgotICogRG8gbm90IHVzZSBpdCBhcyBhbiBBUEkKKyAqICA8cD48Yj5UaGlzIGlzIE5PVCBwYXJ0IG9mIGFueSBzdXBwb3J0ZWQgQVBJLgorICogIElmIHlvdSB3cml0ZSBjb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGlzLCB5b3UgZG8gc28gYXQgeW91ciBvd24gcmlzay4KKyAqICBUaGlzIGNvZGUgYW5kIGl0cyBpbnRlcm5hbCBpbnRlcmZhY2VzIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSBvcgorICogIGRlbGV0aW9uIHdpdGhvdXQgbm90aWNlLjwvYj4KICAqCiAgKiBAYXV0aG9yIEphbWllIEhvCiAgKiBAc2luY2UgMS41CkBAIC0xNTAsNyArMTUxLDcgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSBzZXJpYWxpemVkVHJlZSB0aGUgY29udGVudCB0cmVlIHRoYXQgd2lsbCBiZSBwcmludGVkCiAgICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgcHJpbnREb2N1bWVudChDb250ZW50IHNlcmlhbGl6ZWRUcmVlKTsKKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBwcmludERvY3VtZW50KENvbnRlbnQgc2VyaWFsaXplZFRyZWUpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIC8qKgogICAgICAqIFdyaXRlIHRoZSBzZXJpYWxpemVkIGZvcm0gZm9yIGEgZ2l2ZW4gZmllbGQuCmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvV3JpdGVyRmFjdG9yeS5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L1dyaXRlckZhY3RvcnkuamF2YQppbmRleCAyNTJhNTRjLi42YzJmYjViIDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvV3JpdGVyRmFjdG9yeS5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC9Xcml0ZXJGYWN0b3J5LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwxNSArMjUsMTYgQEAKIAogcGFja2FnZSBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdDsKIAotaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0LnV0aWwuKjsKIGltcG9ydCBjb20uc3VuLmphdmFkb2MuKjsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC51dGlsLio7CiAKIC8qKgogICogVGhlIGludGVyZmFjZSBmb3IgYSBmYWN0b3J5IGNyZWF0ZXMgd3JpdGVycy4KICAqCi0gKiBUaGlzIGNvZGUgaXMgbm90IHBhcnQgb2YgYW4gQVBJLgotICogSXQgaXMgaW1wbGVtZW50YXRpb24gdGhhdCBpcyBzdWJqZWN0IHRvIGNoYW5nZS4KLSAqIERvIG5vdCB1c2UgaXQgYXMgYW4gQVBJCisgKiAgPHA+PGI+VGhpcyBpcyBOT1QgcGFydCBvZiBhbnkgc3VwcG9ydGVkIEFQSS4KKyAqICBJZiB5b3Ugd3JpdGUgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhpcywgeW91IGRvIHNvIGF0IHlvdXIgb3duIHJpc2suCisgKiAgVGhpcyBjb2RlIGFuZCBpdHMgaW50ZXJuYWwgaW50ZXJmYWNlcyBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugb3IKKyAqICBkZWxldGlvbiB3aXRob3V0IG5vdGljZS48L2I+CiAgKgogICogQGF1dGhvciBKYW1pZSBIbwogICogQHNpbmNlIDEuNApkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L2J1aWxkZXJzL0Fic3RyYWN0QnVpbGRlci5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L2J1aWxkZXJzL0Fic3RyYWN0QnVpbGRlci5qYXZhCmluZGV4IGMwMTY3NzUuLmVmN2IwZDkgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC9idWlsZGVycy9BYnN0cmFjdEJ1aWxkZXIuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvYnVpbGRlcnMvQWJzdHJhY3RCdWlsZGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDEwLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwxMiArMjUsMTMgQEAKIAogcGFja2FnZSBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC5idWlsZGVyczsKIAotaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0Lio7Ci1pbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQudXRpbC4qOwogaW1wb3J0IGphdmEuaW8uKjsKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOwogaW1wb3J0IGphdmEudXRpbC4qOwogCitpbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQuKjsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC51dGlsLio7CisKIC8qKgogICogVGhlIHN1cGVyY2xhc3MgZm9yIGFsbCBidWlsZGVycy4gIEEgYnVpbGRlciBpcyBhIGNsYXNzIHRoYXQgcHJvdmlkZXMKICAqIHRoZSBzdHJ1Y3R1cmUgYW5kIGNvbnRlbnQgb2YgQVBJIGRvY3VtZW50YXRpb24uICBBIGJ1aWxkZXIgaXMgY29tcGxldGVseQpAQCAtNDEsOSArNDIsMTAgQEAKICAqIGRvIGlzIGltcGxlbWVudCB0aGUgQ29uc3RhbnRzU3VtbWFyeVdyaXRlciBpbnRlcmZhY2UgYW5kIHBhc3MgaXQgdG8gdGhlCiAgKiBidWlsZGVyIHVzaW5nIGEgV3JpdGVyRmFjdG9yeS4KICAqCi0gKiBUaGlzIGNvZGUgaXMgbm90IHBhcnQgb2YgYW4gQVBJLgotICogSXQgaXMgaW1wbGVtZW50YXRpb24gdGhhdCBpcyBzdWJqZWN0IHRvIGNoYW5nZS4KLSAqIERvIG5vdCB1c2UgaXQgYXMgYW4gQVBJCisgKiAgPHA+PGI+VGhpcyBpcyBOT1QgcGFydCBvZiBhbnkgc3VwcG9ydGVkIEFQSS4KKyAqICBJZiB5b3Ugd3JpdGUgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhpcywgeW91IGRvIHNvIGF0IHlvdXIgb3duIHJpc2suCisgKiAgVGhpcyBjb2RlIGFuZCBpdHMgaW50ZXJuYWwgaW50ZXJmYWNlcyBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugb3IKKyAqICBkZWxldGlvbiB3aXRob3V0IG5vdGljZS48L2I+CiAgKgogICogQGF1dGhvciBKYW1pZSBIbwogICogQHNpbmNlIDEuNQpkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L2J1aWxkZXJzL0Fic3RyYWN0TWVtYmVyQnVpbGRlci5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L2J1aWxkZXJzL0Fic3RyYWN0TWVtYmVyQnVpbGRlci5qYXZhCmluZGV4IDZhNGJlNjAuLmI3NDU0ZDkgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC9idWlsZGVycy9BYnN0cmFjdE1lbWJlckJ1aWxkZXIuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvYnVpbGRlcnMvQWJzdHJhY3RNZW1iZXJCdWlsZGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDEwLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNywxNiArMjcsMTYgQEAKIAogaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0Lio7CiBpbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC4qOwogCiAvKioKICAqIFRoZSBzdXBlcmNsYXNzIGZvciBhbGwgbWVtYmVyIGJ1aWxkZXJzLiAgTWVtYmVyIGJ1aWxkZXJzIGFyZSBvbmx5IGV4ZWN1dGVkCiAgKiB3aXRoaW4gQ2xhc3MgQnVpbGRlcnMuICBUaGV5IGVzc2VudGlhbGx5IGJ1aWxkIHN1Yi1jb21wb25lbnRzLiAgRm9yIGV4YW1wbGUsCiAgKiBtZXRob2QgZG9jdW1lbnRhdGlvbiBpcyBhIHN1Yi1jb21wb25lbnQgb2YgY2xhc3MgZG9jdW1lbnRhdGlvbi4KICAqCi0gKiBUaGlzIGNvZGUgaXMgbm90IHBhcnQgb2YgYW4gQVBJLgotICogSXQgaXMgaW1wbGVtZW50YXRpb24gdGhhdCBpcyBzdWJqZWN0IHRvIGNoYW5nZS4KLSAqIERvIG5vdCB1c2UgaXQgYXMgYW4gQVBJCisgKiAgPHA+PGI+VGhpcyBpcyBOT1QgcGFydCBvZiBhbnkgc3VwcG9ydGVkIEFQSS4KKyAqICBJZiB5b3Ugd3JpdGUgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhpcywgeW91IGRvIHNvIGF0IHlvdXIgb3duIHJpc2suCisgKiAgVGhpcyBjb2RlIGFuZCBpdHMgaW50ZXJuYWwgaW50ZXJmYWNlcyBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugb3IKKyAqICBkZWxldGlvbiB3aXRob3V0IG5vdGljZS48L2I+CiAgKgogICogQGF1dGhvciBKYW1pZSBIbwogICogQHNpbmNlIDEuNQpkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L2J1aWxkZXJzL0Fubm90YXRpb25UeXBlQnVpbGRlci5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L2J1aWxkZXJzL0Fubm90YXRpb25UeXBlQnVpbGRlci5qYXZhCmluZGV4IGE5MmVhNTYuLmRiYjdlNGEgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC9idWlsZGVycy9Bbm5vdGF0aW9uVHlwZUJ1aWxkZXIuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvYnVpbGRlcnMvQW5ub3RhdGlvblR5cGVCdWlsZGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDEwLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNywxNiArMjcsMTggQEAKIAogaW1wb3J0IGphdmEuaW8uKjsKIGltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC51dGlsLio7Ci1pbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQuKjsKKwogaW1wb3J0IGNvbS5zdW4uamF2YWRvYy4qOworaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0Lio7CitpbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQudXRpbC4qOwogCiAvKioKICAqIEJ1aWxkcyB0aGUgc3VtbWFyeSBmb3IgYSBnaXZlbiBhbm5vdGF0aW9uIHR5cGUuCiAgKgotICogVGhpcyBjb2RlIGlzIG5vdCBwYXJ0IG9mIGFuIEFQSS4KLSAqIEl0IGlzIGltcGxlbWVudGF0aW9uIHRoYXQgaXMgc3ViamVjdCB0byBjaGFuZ2UuCi0gKiBEbyBub3QgdXNlIGl0IGFzIGFuIEFQSQorICogIDxwPjxiPlRoaXMgaXMgTk9UIHBhcnQgb2YgYW55IHN1cHBvcnRlZCBBUEkuCisgKiAgSWYgeW91IHdyaXRlIGNvZGUgdGhhdCBkZXBlbmRzIG9uIHRoaXMsIHlvdSBkbyBzbyBhdCB5b3VyIG93biByaXNrLgorICogIFRoaXMgY29kZSBhbmQgaXRzIGludGVybmFsIGludGVyZmFjZXMgYXJlIHN1YmplY3QgdG8gY2hhbmdlIG9yCisgKiAgZGVsZXRpb24gd2l0aG91dCBub3RpY2UuPC9iPgogICoKICAqIEBhdXRob3IgSmFtaWUgSG8KICAqIEBhdXRob3IgQmhhdmVzaCBQYXRlbCAoTW9kaWZpZWQpCkBAIC0xNzcsNyArMTc5LDcgQEAKICAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbkluZm9UcmVlIHRoZSBjb250ZW50IHRyZWUgdG8gd2hpY2ggdGhlIGRvY3VtZW50YXRpb24gd2lsbCBiZSBhZGRlZAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGJ1aWxkQW5ub3RhdGlvblR5cGVTaWduYXR1cmUoWE1MTm9kZSBub2RlLCBDb250ZW50IGFubm90YXRpb25JbmZvVHJlZSkgewotICAgICAgICBTdHJpbmdCdWZmZXIgbW9kaWZpZXJzID0gbmV3IFN0cmluZ0J1ZmZlcigKKyAgICAgICAgU3RyaW5nQnVpbGRlciBtb2RpZmllcnMgPSBuZXcgU3RyaW5nQnVpbGRlcigKICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uVHlwZURvYy5tb2RpZmllcnMoKSArICIgIik7CiAgICAgICAgIHdyaXRlci5hZGRBbm5vdGF0aW9uVHlwZVNpZ25hdHVyZShVdGlsLnJlcGxhY2VUZXh0KAogICAgICAgICAgICAgICAgIG1vZGlmaWVycy50b1N0cmluZygpLCAiaW50ZXJmYWNlIiwgIkBpbnRlcmZhY2UiKSwgYW5ub3RhdGlvbkluZm9UcmVlKTsKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC9idWlsZGVycy9Bbm5vdGF0aW9uVHlwZU9wdGlvbmFsTWVtYmVyQnVpbGRlci5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L2J1aWxkZXJzL0Fubm90YXRpb25UeXBlT3B0aW9uYWxNZW1iZXJCdWlsZGVyLmphdmEKaW5kZXggYjBhYmJjMy4uZWRjZmJlMiAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L2J1aWxkZXJzL0Fubm90YXRpb25UeXBlT3B0aW9uYWxNZW1iZXJCdWlsZGVyLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L2J1aWxkZXJzL0Fubm90YXRpb25UeXBlT3B0aW9uYWxNZW1iZXJCdWlsZGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDEwLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNiwxNiArMjYsMTggQEAKIHBhY2thZ2UgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQuYnVpbGRlcnM7CiAKIGltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC51dGlsLio7Ci1pbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQuKjsKKwogaW1wb3J0IGNvbS5zdW4uamF2YWRvYy4qOworaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0Lio7CitpbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQudXRpbC4qOwogCiAvKioKICAqIEJ1aWxkcyBkb2N1bWVudGF0aW9uIGZvciBvcHRpb25hbCBhbm5vdGF0aW9uIHR5cGUgbWVtYmVycy4KICAqCi0gKiBUaGlzIGNvZGUgaXMgbm90IHBhcnQgb2YgYW4gQVBJLgotICogSXQgaXMgaW1wbGVtZW50YXRpb24gdGhhdCBpcyBzdWJqZWN0IHRvIGNoYW5nZS4KLSAqIERvIG5vdCB1c2UgaXQgYXMgYW4gQVBJCisgKiAgPHA+PGI+VGhpcyBpcyBOT1QgcGFydCBvZiBhbnkgc3VwcG9ydGVkIEFQSS4KKyAqICBJZiB5b3Ugd3JpdGUgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhpcywgeW91IGRvIHNvIGF0IHlvdXIgb3duIHJpc2suCisgKiAgVGhpcyBjb2RlIGFuZCBpdHMgaW50ZXJuYWwgaW50ZXJmYWNlcyBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugb3IKKyAqICBkZWxldGlvbiB3aXRob3V0IG5vdGljZS48L2I+CiAgKgogICogQGF1dGhvciBKYW1pZSBIbwogICogQGF1dGhvciBCaGF2ZXNoIFBhdGVsIChNb2RpZmllZCkKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC9idWlsZGVycy9Bbm5vdGF0aW9uVHlwZVJlcXVpcmVkTWVtYmVyQnVpbGRlci5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L2J1aWxkZXJzL0Fubm90YXRpb25UeXBlUmVxdWlyZWRNZW1iZXJCdWlsZGVyLmphdmEKaW5kZXggZWM5YzRmMi4uNzMzZWFjMyAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L2J1aWxkZXJzL0Fubm90YXRpb25UeXBlUmVxdWlyZWRNZW1iZXJCdWlsZGVyLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L2J1aWxkZXJzL0Fubm90YXRpb25UeXBlUmVxdWlyZWRNZW1iZXJCdWlsZGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDEwLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNiwxNiArMjYsMTggQEAKIHBhY2thZ2UgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQuYnVpbGRlcnM7CiAKIGltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC51dGlsLio7Ci1pbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQuKjsKKwogaW1wb3J0IGNvbS5zdW4uamF2YWRvYy4qOworaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0Lio7CitpbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQudXRpbC4qOwogCiAvKioKICAqIEJ1aWxkcyBkb2N1bWVudGF0aW9uIGZvciByZXF1aXJlZCBhbm5vdGF0aW9uIHR5cGUgbWVtYmVycy4KICAqCi0gKiBUaGlzIGNvZGUgaXMgbm90IHBhcnQgb2YgYW4gQVBJLgotICogSXQgaXMgaW1wbGVtZW50YXRpb24gdGhhdCBpcyBzdWJqZWN0IHRvIGNoYW5nZS4KLSAqIERvIG5vdCB1c2UgaXQgYXMgYW4gQVBJCisgKiAgPHA+PGI+VGhpcyBpcyBOT1QgcGFydCBvZiBhbnkgc3VwcG9ydGVkIEFQSS4KKyAqICBJZiB5b3Ugd3JpdGUgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhpcywgeW91IGRvIHNvIGF0IHlvdXIgb3duIHJpc2suCisgKiAgVGhpcyBjb2RlIGFuZCBpdHMgaW50ZXJuYWwgaW50ZXJmYWNlcyBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugb3IKKyAqICBkZWxldGlvbiB3aXRob3V0IG5vdGljZS48L2I+CiAgKgogICogQGF1dGhvciBKYW1pZSBIbwogICogQGF1dGhvciBCaGF2ZXNoIFBhdGVsIChNb2RpZmllZCkKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC9idWlsZGVycy9CdWlsZGVyRmFjdG9yeS5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L2J1aWxkZXJzL0J1aWxkZXJGYWN0b3J5LmphdmEKaW5kZXggZTM1YmUxMS4uNzFmYjVhMyAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L2J1aWxkZXJzL0J1aWxkZXJGYWN0b3J5LmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L2J1aWxkZXJzL0J1aWxkZXJGYWN0b3J5LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwxNiArMjUsMTcgQEAKIAogcGFja2FnZSBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC5idWlsZGVyczsKIAoraW1wb3J0IGNvbS5zdW4uamF2YWRvYy4qOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0Lio7CiBpbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQudXRpbC4qOwotaW1wb3J0IGNvbS5zdW4uamF2YWRvYy4qOwogCiAvKioKICAqIFRoZSBmYWN0b3J5IGZvciBjb25zdHJ1Y3RpbmcgYnVpbGRlcnMuCiAgKgotICogVGhpcyBjb2RlIGlzIG5vdCBwYXJ0IG9mIGFuIEFQSS4KLSAqIEl0IGlzIGltcGxlbWVudGF0aW9uIHRoYXQgaXMgc3ViamVjdCB0byBjaGFuZ2UuCi0gKiBEbyBub3QgdXNlIGl0IGFzIGFuIEFQSQorICogIDxwPjxiPlRoaXMgaXMgTk9UIHBhcnQgb2YgYW55IHN1cHBvcnRlZCBBUEkuCisgKiAgSWYgeW91IHdyaXRlIGNvZGUgdGhhdCBkZXBlbmRzIG9uIHRoaXMsIHlvdSBkbyBzbyBhdCB5b3VyIG93biByaXNrLgorICogIFRoaXMgY29kZSBhbmQgaXRzIGludGVybmFsIGludGVyZmFjZXMgYXJlIHN1YmplY3QgdG8gY2hhbmdlIG9yCisgKiAgZGVsZXRpb24gd2l0aG91dCBub3RpY2UuPC9iPgogICoKICAqIEBhdXRob3IgSmFtaWUgSG8KICAqIEBzaW5jZSAxLjQKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC9idWlsZGVycy9DbGFzc0J1aWxkZXIuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC9idWlsZGVycy9DbGFzc0J1aWxkZXIuamF2YQppbmRleCBkMDUwY2FiLi45ZjVkMDk1IDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvYnVpbGRlcnMvQ2xhc3NCdWlsZGVyLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L2J1aWxkZXJzL0NsYXNzQnVpbGRlci5qYXZhCkBAIC0yNywxNiArMjcsMTggQEAKIAogaW1wb3J0IGphdmEuaW8uKjsKIGltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC51dGlsLio7Ci1pbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQuKjsKKwogaW1wb3J0IGNvbS5zdW4uamF2YWRvYy4qOworaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0Lio7CitpbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQudXRpbC4qOwogCiAvKioKICAqIEJ1aWxkcyB0aGUgc3VtbWFyeSBmb3IgYSBnaXZlbiBjbGFzcy4KICAqCi0gKiBUaGlzIGNvZGUgaXMgbm90IHBhcnQgb2YgYW4gQVBJLgotICogSXQgaXMgaW1wbGVtZW50YXRpb24gdGhhdCBpcyBzdWJqZWN0IHRvIGNoYW5nZS4KLSAqIERvIG5vdCB1c2UgaXQgYXMgYW4gQVBJCisgKiAgPHA+PGI+VGhpcyBpcyBOT1QgcGFydCBvZiBhbnkgc3VwcG9ydGVkIEFQSS4KKyAqICBJZiB5b3Ugd3JpdGUgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhpcywgeW91IGRvIHNvIGF0IHlvdXIgb3duIHJpc2suCisgKiAgVGhpcyBjb2RlIGFuZCBpdHMgaW50ZXJuYWwgaW50ZXJmYWNlcyBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugb3IKKyAqICBkZWxldGlvbiB3aXRob3V0IG5vdGljZS48L2I+CiAgKgogICogQGF1dGhvciBKYW1pZSBIbwogICogQGF1dGhvciBCaGF2ZXNoIFBhdGVsIChNb2RpZmllZCkKQEAgLTI4MCwxOCArMjgyLDE4IEBACiAgICAgICogQHBhcmFtIGNsYXNzSW5mb1RyZWUgdGhlIGNvbnRlbnQgdHJlZSB0byB3aGljaCB0aGUgZG9jdW1lbnRhdGlvbiB3aWxsIGJlIGFkZGVkCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYnVpbGRDbGFzc1NpZ25hdHVyZShYTUxOb2RlIG5vZGUsIENvbnRlbnQgY2xhc3NJbmZvVHJlZSkgewotICAgICAgICBTdHJpbmdCdWZmZXIgbW9kaWZpZXJzID0gbmV3IFN0cmluZ0J1ZmZlcihjbGFzc0RvYy5tb2RpZmllcnMoKSArICIgIik7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgbW9kaWZpZXJzID0gbmV3IFN0cmluZ0J1aWxkZXIoY2xhc3NEb2MubW9kaWZpZXJzKCkgKyAiICIpOwogICAgICAgICBpZiAoaXNFbnVtKSB7CiAgICAgICAgICAgICBtb2RpZmllcnMuYXBwZW5kKCJlbnVtICIpOwogICAgICAgICAgICAgaW50IGluZGV4OwogICAgICAgICAgICAgaWYgKChpbmRleCA9IG1vZGlmaWVycy5pbmRleE9mKCJhYnN0cmFjdCIpKSA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgbW9kaWZpZXJzLmRlbGV0ZShpbmRleCwgaW5kZXggKyAobmV3IFN0cmluZygiYWJzdHJhY3QiKSkubGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgIG1vZGlmaWVycyA9IG5ldyBTdHJpbmdCdWZmZXIoCisgICAgICAgICAgICAgICAgbW9kaWZpZXJzLmRlbGV0ZShpbmRleCwgaW5kZXggKyAiYWJzdHJhY3QiLmxlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICBtb2RpZmllcnMgPSBuZXcgU3RyaW5nQnVpbGRlcigKICAgICAgICAgICAgICAgICAgICAgICAgIFV0aWwucmVwbGFjZVRleHQobW9kaWZpZXJzLnRvU3RyaW5nKCksICIgICIsICIgIikpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKChpbmRleCA9IG1vZGlmaWVycy5pbmRleE9mKCJmaW5hbCIpKSA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgbW9kaWZpZXJzLmRlbGV0ZShpbmRleCwgaW5kZXggKyAobmV3IFN0cmluZygiZmluYWwiKSkubGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgIG1vZGlmaWVycyA9IG5ldyBTdHJpbmdCdWZmZXIoCisgICAgICAgICAgICAgICAgbW9kaWZpZXJzLmRlbGV0ZShpbmRleCwgaW5kZXggKyAiZmluYWwiLmxlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICBtb2RpZmllcnMgPSBuZXcgU3RyaW5nQnVpbGRlcigKICAgICAgICAgICAgICAgICAgICAgICAgIFV0aWwucmVwbGFjZVRleHQobW9kaWZpZXJzLnRvU3RyaW5nKCksICIgICIsICIgIikpOwogICAgICAgICAgICAgfQogICAgICAgICAvL30gZWxzZSBpZiAoY2xhc3NEb2MuaXNBbm5vdGF0aW9uVHlwZSgpKSB7CmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvYnVpbGRlcnMvQ29uc3RhbnRzU3VtbWFyeUJ1aWxkZXIuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC9idWlsZGVycy9Db25zdGFudHNTdW1tYXJ5QnVpbGRlci5qYXZhCmluZGV4IGJkZWQxZTguLjZkZTlmNzggMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC9idWlsZGVycy9Db25zdGFudHNTdW1tYXJ5QnVpbGRlci5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC9idWlsZGVycy9Db25zdGFudHNTdW1tYXJ5QnVpbGRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMCwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjcsMTYgKzI3LDE4IEBACiAKIGltcG9ydCBqYXZhLmlvLio7CiBpbXBvcnQgamF2YS51dGlsLio7CisKIGltcG9ydCBjb20uc3VuLmphdmFkb2MuKjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC51dGlsLio7CiBpbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQuKjsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC51dGlsLio7CiAKIC8qKgogICogQnVpbGRzIHRoZSBDb25zdGFudHMgU3VtbWFyeSBQYWdlLgogICoKLSAqIFRoaXMgY29kZSBpcyBub3QgcGFydCBvZiBhbiBBUEkuCi0gKiBJdCBpcyBpbXBsZW1lbnRhdGlvbiB0aGF0IGlzIHN1YmplY3QgdG8gY2hhbmdlLgotICogRG8gbm90IHVzZSBpdCBhcyBhbiBBUEkKKyAqICA8cD48Yj5UaGlzIGlzIE5PVCBwYXJ0IG9mIGFueSBzdXBwb3J0ZWQgQVBJLgorICogIElmIHlvdSB3cml0ZSBjb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGlzLCB5b3UgZG8gc28gYXQgeW91ciBvd24gcmlzay4KKyAqICBUaGlzIGNvZGUgYW5kIGl0cyBpbnRlcm5hbCBpbnRlcmZhY2VzIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSBvcgorICogIGRlbGV0aW9uIHdpdGhvdXQgbm90aWNlLjwvYj4KICAqCiAgKiBAYXV0aG9yIEphbWllIEhvCiAgKiBAYXV0aG9yIEJoYXZlc2ggUGF0ZWwgKE1vZGlmaWVkKQpAQCAtMzQ1LDcgKzM0Nyw2IEBACiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIFJldHVybiB0aGUgbGlzdCBvZiB2aXNpYmxlIGNvbnN0YW50IGZpZWxkcyBmb3IgdGhlIGdpdmVuIGNsYXNzZG9jLgotICAgICAgICAgKiBAcGFyYW0gY2QgdGhlIGNsYXNzZG9jIHRvIGV4YW1pbmUuCiAgICAgICAgICAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgdmlzaWJsZSBjb25zdGFudCBmaWVsZHMgZm9yIHRoZSBnaXZlbiBjbGFzc2RvYy4KICAgICAgICAgICovCiAgICAgICAgIHByb3RlY3RlZCBMaXN0PEZpZWxkRG9jPiBtZW1iZXJzKCkgewpkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L2J1aWxkZXJzL0NvbnN0cnVjdG9yQnVpbGRlci5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L2J1aWxkZXJzL0NvbnN0cnVjdG9yQnVpbGRlci5qYXZhCmluZGV4IDY4ZWZlOGMuLjIwZjkzMDggMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC9idWlsZGVycy9Db25zdHJ1Y3RvckJ1aWxkZXIuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvYnVpbGRlcnMvQ29uc3RydWN0b3JCdWlsZGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDEwLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNiwxNiArMjYsMTggQEAKIHBhY2thZ2UgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQuYnVpbGRlcnM7CiAKIGltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC51dGlsLio7Ci1pbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQuKjsKKwogaW1wb3J0IGNvbS5zdW4uamF2YWRvYy4qOworaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0Lio7CitpbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQudXRpbC4qOwogCiAvKioKICAqIEJ1aWxkcyBkb2N1bWVudGF0aW9uIGZvciBhIGNvbnN0cnVjdG9yLgogICoKLSAqIFRoaXMgY29kZSBpcyBub3QgcGFydCBvZiBhbiBBUEkuCi0gKiBJdCBpcyBpbXBsZW1lbnRhdGlvbiB0aGF0IGlzIHN1YmplY3QgdG8gY2hhbmdlLgotICogRG8gbm90IHVzZSBpdCBhcyBhbiBBUEkKKyAqICA8cD48Yj5UaGlzIGlzIE5PVCBwYXJ0IG9mIGFueSBzdXBwb3J0ZWQgQVBJLgorICogIElmIHlvdSB3cml0ZSBjb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGlzLCB5b3UgZG8gc28gYXQgeW91ciBvd24gcmlzay4KKyAqICBUaGlzIGNvZGUgYW5kIGl0cyBpbnRlcm5hbCBpbnRlcmZhY2VzIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSBvcgorICogIGRlbGV0aW9uIHdpdGhvdXQgbm90aWNlLjwvYj4KICAqCiAgKiBAYXV0aG9yIEphbWllIEhvCiAgKiBAYXV0aG9yIEJoYXZlc2ggUGF0ZWwgKE1vZGlmaWVkKQpkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L2J1aWxkZXJzL0VudW1Db25zdGFudEJ1aWxkZXIuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC9idWlsZGVycy9FbnVtQ29uc3RhbnRCdWlsZGVyLmphdmEKaW5kZXggODY4Mjk3Yi4uMzZmNWQzOSAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L2J1aWxkZXJzL0VudW1Db25zdGFudEJ1aWxkZXIuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvYnVpbGRlcnMvRW51bUNvbnN0YW50QnVpbGRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMCwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjYsMTYgKzI2LDE4IEBACiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0LmJ1aWxkZXJzOwogCiBpbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQudXRpbC4qOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0Lio7CisKIGltcG9ydCBjb20uc3VuLmphdmFkb2MuKjsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC4qOworaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0LnV0aWwuKjsKIAogLyoqCiAgKiBCdWlsZHMgZG9jdW1lbnRhdGlvbiBmb3IgYSBlbnVtIGNvbnN0YW50cy4KICAqCi0gKiBUaGlzIGNvZGUgaXMgbm90IHBhcnQgb2YgYW4gQVBJLgotICogSXQgaXMgaW1wbGVtZW50YXRpb24gdGhhdCBpcyBzdWJqZWN0IHRvIGNoYW5nZS4KLSAqIERvIG5vdCB1c2UgaXQgYXMgYW4gQVBJCisgKiAgPHA+PGI+VGhpcyBpcyBOT1QgcGFydCBvZiBhbnkgc3VwcG9ydGVkIEFQSS4KKyAqICBJZiB5b3Ugd3JpdGUgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhpcywgeW91IGRvIHNvIGF0IHlvdXIgb3duIHJpc2suCisgKiAgVGhpcyBjb2RlIGFuZCBpdHMgaW50ZXJuYWwgaW50ZXJmYWNlcyBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugb3IKKyAqICBkZWxldGlvbiB3aXRob3V0IG5vdGljZS48L2I+CiAgKgogICogQGF1dGhvciBKYW1pZSBIbwogICogQGF1dGhvciBCaGF2ZXNoIFBhdGVsIChNb2RpZmllZCkKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC9idWlsZGVycy9GaWVsZEJ1aWxkZXIuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC9idWlsZGVycy9GaWVsZEJ1aWxkZXIuamF2YQppbmRleCAwNDE2YmE5Li40ZjA1MDI3IDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvYnVpbGRlcnMvRmllbGRCdWlsZGVyLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L2J1aWxkZXJzL0ZpZWxkQnVpbGRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMCwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjYsMTYgKzI2LDE4IEBACiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0LmJ1aWxkZXJzOwogCiBpbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQudXRpbC4qOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0Lio7CisKIGltcG9ydCBjb20uc3VuLmphdmFkb2MuKjsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC4qOworaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0LnV0aWwuKjsKIAogLyoqCiAgKiBCdWlsZHMgZG9jdW1lbnRhdGlvbiBmb3IgYSBmaWVsZC4KICAqCi0gKiBUaGlzIGNvZGUgaXMgbm90IHBhcnQgb2YgYW4gQVBJLgotICogSXQgaXMgaW1wbGVtZW50YXRpb24gdGhhdCBpcyBzdWJqZWN0IHRvIGNoYW5nZS4KLSAqIERvIG5vdCB1c2UgaXQgYXMgYW4gQVBJCisgKiAgPHA+PGI+VGhpcyBpcyBOT1QgcGFydCBvZiBhbnkgc3VwcG9ydGVkIEFQSS4KKyAqICBJZiB5b3Ugd3JpdGUgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhpcywgeW91IGRvIHNvIGF0IHlvdXIgb3duIHJpc2suCisgKiAgVGhpcyBjb2RlIGFuZCBpdHMgaW50ZXJuYWwgaW50ZXJmYWNlcyBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugb3IKKyAqICBkZWxldGlvbiB3aXRob3V0IG5vdGljZS48L2I+CiAgKgogICogQGF1dGhvciBKYW1pZSBIbwogICogQGF1dGhvciBCaGF2ZXNoIFBhdGVsIChNb2RpZmllZCkKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC9idWlsZGVycy9MYXlvdXRQYXJzZXIuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC9idWlsZGVycy9MYXlvdXRQYXJzZXIuamF2YQppbmRleCAzNDQ1ZDk2Li5mNmUyZjMzIDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvYnVpbGRlcnMvTGF5b3V0UGFyc2VyLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L2J1aWxkZXJzL0xheW91dFBhcnNlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMCwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjQsMTggKzI0LDI2IEBACiAgKi8KIHBhY2thZ2UgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQuYnVpbGRlcnM7CiAKLWltcG9ydCBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC4qOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0LnV0aWwuKjsKIGltcG9ydCBqYXZhLmlvLio7CiBpbXBvcnQgamF2YS51dGlsLio7CisKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy4qOworCiBpbXBvcnQgb3JnLnhtbC5zYXguKjsKIGltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLio7CisKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC4qOworaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0LnV0aWwuKjsKIAogLyoqCiAgKiBQYXJzZSB0aGUgWE1MIHRoYXQgc3BlY2lmaWVkIHRoZSBvcmRlciBvZiBvcGVyYXRpb24gZm9yIHRoZSBidWlsZGVycy4gIFRoaXMKICAqIFBhcnNlciB1c2VzIFNBWCBwYXJzaW5nLgogICoKKyAqICA8cD48Yj5UaGlzIGlzIE5PVCBwYXJ0IG9mIGFueSBzdXBwb3J0ZWQgQVBJLgorICogIElmIHlvdSB3cml0ZSBjb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGlzLCB5b3UgZG8gc28gYXQgeW91ciBvd24gcmlzay4KKyAqICBUaGlzIGNvZGUgYW5kIGl0cyBpbnRlcm5hbCBpbnRlcmZhY2VzIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSBvcgorICogIGRlbGV0aW9uIHdpdGhvdXQgbm90aWNlLjwvYj4KKyAqCiAgKiBAYXV0aG9yIEphbWllIEhvCiAgKiBAc2luY2UgMS41CiAgKiBAc2VlIFNBWFBhcnNlcgpkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L2J1aWxkZXJzL01lbWJlclN1bW1hcnlCdWlsZGVyLmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvYnVpbGRlcnMvTWVtYmVyU3VtbWFyeUJ1aWxkZXIuamF2YQppbmRleCA4YWQ0YzU4Li4yZDgxYTRjIDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvYnVpbGRlcnMvTWVtYmVyU3VtbWFyeUJ1aWxkZXIuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvYnVpbGRlcnMvTWVtYmVyU3VtbWFyeUJ1aWxkZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTAsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI2LDE2ICsyNiwxOCBAQAogcGFja2FnZSBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC5idWlsZGVyczsKIAogaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0LnV0aWwuKjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC4qOworCiBpbXBvcnQgY29tLnN1bi5qYXZhZG9jLio7CitpbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQuKjsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC51dGlsLio7CiAKIC8qKgogICogQnVpbGRzIHRoZSBtZW1iZXIgc3VtbWFyeS4KICAqCi0gKiBUaGlzIGNvZGUgaXMgbm90IHBhcnQgb2YgYW4gQVBJLgotICogSXQgaXMgaW1wbGVtZW50YXRpb24gdGhhdCBpcyBzdWJqZWN0IHRvIGNoYW5nZS4KLSAqIERvIG5vdCB1c2UgaXQgYXMgYW4gQVBJCisgKiAgPHA+PGI+VGhpcyBpcyBOT1QgcGFydCBvZiBhbnkgc3VwcG9ydGVkIEFQSS4KKyAqICBJZiB5b3Ugd3JpdGUgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhpcywgeW91IGRvIHNvIGF0IHlvdXIgb3duIHJpc2suCisgKiAgVGhpcyBjb2RlIGFuZCBpdHMgaW50ZXJuYWwgaW50ZXJmYWNlcyBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugb3IKKyAqICBkZWxldGlvbiB3aXRob3V0IG5vdGljZS48L2I+CiAgKgogICogQGF1dGhvciBKYW1pZSBIbwogICogQGF1dGhvciBCaGF2ZXNoIFBhdGVsIChNb2RpZmllZCkKQEAgLTE2NSw3ICsxNjcsNiBAQAogICAgICAqIFRoaXMgaW5mb3JtYXRpb24gY2FuIGJlIHVzZWQgZm9yIGRvY2xldCBzcGVjaWZpYyBkb2N1bWVudGF0aW9uCiAgICAgICogZ2VuZXJhdGlvbi4KICAgICAgKgotICAgICAqIEBwYXJhbSBjbGFzc0RvYyB0aGUge0BsaW5rIENsYXNzRG9jfSB3ZSB3YW50IHRvIGNoZWNrLgogICAgICAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIG9mIG1lbWJlcnMgdG8gcmV0dXJuLgogICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIG1ldGhvZHMgdGhhdCB3aWxsIGJlIGRvY3VtZW50ZWQuCiAgICAgICogQHNlZSBWaXNpYmxlTWVtYmVyTWFwCmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvYnVpbGRlcnMvTWV0aG9kQnVpbGRlci5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L2J1aWxkZXJzL01ldGhvZEJ1aWxkZXIuamF2YQppbmRleCAwYTI4ZDg5Li5lZDkzMzM1IDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvYnVpbGRlcnMvTWV0aG9kQnVpbGRlci5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC9idWlsZGVycy9NZXRob2RCdWlsZGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDEwLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNiwxNiArMjYsMTggQEAKIHBhY2thZ2UgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQuYnVpbGRlcnM7CiAKIGltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC51dGlsLio7Ci1pbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQuKjsKKwogaW1wb3J0IGNvbS5zdW4uamF2YWRvYy4qOworaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0Lio7CitpbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQudXRpbC4qOwogCiAvKioKICAqIEJ1aWxkcyBkb2N1bWVudGF0aW9uIGZvciBhIG1ldGhvZC4KICAqCi0gKiBUaGlzIGNvZGUgaXMgbm90IHBhcnQgb2YgYW4gQVBJLgotICogSXQgaXMgaW1wbGVtZW50YXRpb24gdGhhdCBpcyBzdWJqZWN0IHRvIGNoYW5nZS4KLSAqIERvIG5vdCB1c2UgaXQgYXMgYW4gQVBJCisgKiAgPHA+PGI+VGhpcyBpcyBOT1QgcGFydCBvZiBhbnkgc3VwcG9ydGVkIEFQSS4KKyAqICBJZiB5b3Ugd3JpdGUgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhpcywgeW91IGRvIHNvIGF0IHlvdXIgb3duIHJpc2suCisgKiAgVGhpcyBjb2RlIGFuZCBpdHMgaW50ZXJuYWwgaW50ZXJmYWNlcyBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugb3IKKyAqICBkZWxldGlvbiB3aXRob3V0IG5vdGljZS48L2I+CiAgKgogICogQGF1dGhvciBKYW1pZSBIbwogICogQGF1dGhvciBCaGF2ZXNoIFBhdGVsIChNb2RpZmllZCkKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC9idWlsZGVycy9QYWNrYWdlU3VtbWFyeUJ1aWxkZXIuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC9idWlsZGVycy9QYWNrYWdlU3VtbWFyeUJ1aWxkZXIuamF2YQppbmRleCAzZjQ0OTRhLi5iNmRjYWI2IDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvYnVpbGRlcnMvUGFja2FnZVN1bW1hcnlCdWlsZGVyLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L2J1aWxkZXJzL1BhY2thZ2VTdW1tYXJ5QnVpbGRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMCwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjYsMTYgKzI2LDE4IEBACiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0LmJ1aWxkZXJzOwogCiBpbXBvcnQgamF2YS5pby4qOworCiBpbXBvcnQgY29tLnN1bi5qYXZhZG9jLio7Ci1pbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQudXRpbC4qOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0Lio7CitpbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQudXRpbC4qOwogCiAvKioKICAqIEJ1aWxkcyB0aGUgc3VtbWFyeSBmb3IgYSBnaXZlbiBwYWNrYWdlLgogICoKLSAqIFRoaXMgY29kZSBpcyBub3QgcGFydCBvZiBhbiBBUEkuCi0gKiBJdCBpcyBpbXBsZW1lbnRhdGlvbiB0aGF0IGlzIHN1YmplY3QgdG8gY2hhbmdlLgotICogRG8gbm90IHVzZSBpdCBhcyBhbiBBUEkKKyAqICA8cD48Yj5UaGlzIGlzIE5PVCBwYXJ0IG9mIGFueSBzdXBwb3J0ZWQgQVBJLgorICogIElmIHlvdSB3cml0ZSBjb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGlzLCB5b3UgZG8gc28gYXQgeW91ciBvd24gcmlzay4KKyAqICBUaGlzIGNvZGUgYW5kIGl0cyBpbnRlcm5hbCBpbnRlcmZhY2VzIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSBvcgorICogIGRlbGV0aW9uIHdpdGhvdXQgbm90aWNlLjwvYj4KICAqCiAgKiBAYXV0aG9yIEphbWllIEhvCiAgKiBAYXV0aG9yIEJoYXZlc2ggUGF0ZWwgKE1vZGlmaWVkKQpkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L2J1aWxkZXJzL1NlcmlhbGl6ZWRGb3JtQnVpbGRlci5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L2J1aWxkZXJzL1NlcmlhbGl6ZWRGb3JtQnVpbGRlci5qYXZhCmluZGV4IDAxMzEyMGIuLjY2ZTg0NzggMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC9idWlsZGVycy9TZXJpYWxpemVkRm9ybUJ1aWxkZXIuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvYnVpbGRlcnMvU2VyaWFsaXplZEZvcm1CdWlsZGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDExLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNywxNiArMjcsMTggQEAKIAogaW1wb3J0IGphdmEuaW8uKjsKIGltcG9ydCBqYXZhLnV0aWwuKjsKKwogaW1wb3J0IGNvbS5zdW4uamF2YWRvYy4qOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0LnV0aWwuKjsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC4qOworaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0LnV0aWwuKjsKIAogLyoqCiAgKiBCdWlsZHMgdGhlIHNlcmlhbGl6ZWQgZm9ybS4KICAqCi0gKiBUaGlzIGNvZGUgaXMgbm90IHBhcnQgb2YgYW4gQVBJLgotICogSXQgaXMgaW1wbGVtZW50YXRpb24gdGhhdCBpcyBzdWJqZWN0IHRvIGNoYW5nZS4KLSAqIERvIG5vdCB1c2UgaXQgYXMgYW4gQVBJCisgKiAgPHA+PGI+VGhpcyBpcyBOT1QgcGFydCBvZiBhbnkgc3VwcG9ydGVkIEFQSS4KKyAqICBJZiB5b3Ugd3JpdGUgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhpcywgeW91IGRvIHNvIGF0IHlvdXIgb3duIHJpc2suCisgKiAgVGhpcyBjb2RlIGFuZCBpdHMgaW50ZXJuYWwgaW50ZXJmYWNlcyBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugb3IKKyAqICBkZWxldGlvbiB3aXRob3V0IG5vdGljZS48L2I+CiAgKgogICogQGF1dGhvciBKYW1pZSBIbwogICogQGF1dGhvciBCaGF2ZXNoIFBhdGVsIChNb2RpZmllZCkKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC9idWlsZGVycy9YTUxOb2RlLmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvYnVpbGRlcnMvWE1MTm9kZS5qYXZhCmluZGV4IDRiNDE0ZGEuLmFlMzM1YjkgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC9idWlsZGVycy9YTUxOb2RlLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L2J1aWxkZXJzL1hNTE5vZGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTMyLDYgKzMyLDExIEBACiAKIC8qKgogICogU2ltcGxlIGNsYXNzIHRvIHJlcHJlc2VudCB0aGUgYXR0cmlidXRlIGFuZCBlbGVtZW50cyBvZiBhbiBYTUwgbm9kZS4KKyAqCisgKiAgPHA+PGI+VGhpcyBpcyBOT1QgcGFydCBvZiBhbnkgc3VwcG9ydGVkIEFQSS4KKyAqICBJZiB5b3Ugd3JpdGUgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhpcywgeW91IGRvIHNvIGF0IHlvdXIgb3duIHJpc2suCisgKiAgVGhpcyBjb2RlIGFuZCBpdHMgaW50ZXJuYWwgaW50ZXJmYWNlcyBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugb3IKKyAqICBkZWxldGlvbiB3aXRob3V0IG5vdGljZS48L2I+CiAgKi8KIHB1YmxpYyBjbGFzcyBYTUxOb2RlIHsKICAgICBYTUxOb2RlKFhNTE5vZGUgcGFyZW50LCBTdHJpbmcgcW5hbWUpIHsKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC90YWdsZXRzL0Jhc2VFeGVjdXRhYmxlTWVtYmVyVGFnbGV0LmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvdGFnbGV0cy9CYXNlRXhlY3V0YWJsZU1lbWJlclRhZ2xldC5qYXZhCmluZGV4IGEzYjUzZjMuLmNlMTU0NjEgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC90YWdsZXRzL0Jhc2VFeGVjdXRhYmxlTWVtYmVyVGFnbGV0LmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L3RhZ2xldHMvQmFzZUV4ZWN1dGFibGVNZW1iZXJUYWdsZXQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDMsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI5LDkgKzI5LDEwIEBACiAgKiBBbiBhYnN0cmFjdCBjbGFzcyBmb3IgdGhhdCBpbXBsZW1lbnRzIHRoZSB7QGxpbmsgVGFnbGV0fSBpbnRlcmZhY2UKICAqIGZvciB0YWdzIGluIDxjb2RlPkV4ZWN1dGFibGVNZW1iZXJzPC9jb2RlPi4KICAqCi0gKiBUaGlzIGNvZGUgaXMgbm90IHBhcnQgb2YgYW4gQVBJLgotICogSXQgaXMgaW1wbGVtZW50YXRpb24gdGhhdCBpcyBzdWJqZWN0IHRvIGNoYW5nZS4KLSAqIERvIG5vdCB1c2UgaXQgYXMgYW4gQVBJLgorICogIDxwPjxiPlRoaXMgaXMgTk9UIHBhcnQgb2YgYW55IHN1cHBvcnRlZCBBUEkuCisgKiAgSWYgeW91IHdyaXRlIGNvZGUgdGhhdCBkZXBlbmRzIG9uIHRoaXMsIHlvdSBkbyBzbyBhdCB5b3VyIG93biByaXNrLgorICogIFRoaXMgY29kZSBhbmQgaXRzIGludGVybmFsIGludGVyZmFjZXMgYXJlIHN1YmplY3QgdG8gY2hhbmdlIG9yCisgKiAgZGVsZXRpb24gd2l0aG91dCBub3RpY2UuPC9iPgogICoKICAqIEBhdXRob3IgSmFtaWUgSG8KICAqIEBzaW5jZSAxLjQKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC90YWdsZXRzL0Jhc2VJbmxpbmVUYWdsZXQuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC90YWdsZXRzL0Jhc2VJbmxpbmVUYWdsZXQuamF2YQppbmRleCAyZGZmODQxLi4yNDM4M2I4IDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvdGFnbGV0cy9CYXNlSW5saW5lVGFnbGV0LmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L3RhZ2xldHMvQmFzZUlubGluZVRhZ2xldC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwMywgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjgsOSArMjgsMTAgQEAKIC8qKgogICogQW4gYWJzdHJhY3QgaW5saW5lIHRhZ2xldCB0aGF0IG91dHB1dHMgSFRNTC4KICAqCi0gKiBUaGlzIGNvZGUgaXMgbm90IHBhcnQgb2YgYW4gQVBJLgotICogSXQgaXMgaW1wbGVtZW50YXRpb24gdGhhdCBpcyBzdWJqZWN0IHRvIGNoYW5nZS4KLSAqIERvIG5vdCB1c2UgaXQgYXMgYW4gQVBJCisgKiAgPHA+PGI+VGhpcyBpcyBOT1QgcGFydCBvZiBhbnkgc3VwcG9ydGVkIEFQSS4KKyAqICBJZiB5b3Ugd3JpdGUgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhpcywgeW91IGRvIHNvIGF0IHlvdXIgb3duIHJpc2suCisgKiAgVGhpcyBjb2RlIGFuZCBpdHMgaW50ZXJuYWwgaW50ZXJmYWNlcyBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugb3IKKyAqICBkZWxldGlvbiB3aXRob3V0IG5vdGljZS48L2I+CiAgKgogICogQGF1dGhvciBKYW1pZSBIbwogICogQHNpbmNlIDEuNApkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L3RhZ2xldHMvQmFzZVRhZ2xldC5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L3RhZ2xldHMvQmFzZVRhZ2xldC5qYXZhCmluZGV4IGMwYzZiZmYuLmU4M2FjODMgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC90YWdsZXRzL0Jhc2VUYWdsZXQuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvdGFnbGV0cy9CYXNlVGFnbGV0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwxNSArMjUsMTUgQEAKIAogcGFja2FnZSBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC50YWdsZXRzOwogCi1pbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQudXRpbC4qOwogaW1wb3J0IGNvbS5zdW4uamF2YWRvYy4qOwogCiAvKioKICAqIEFuIGFic3RyYWN0IGNsYXNzIGZvciB0aGF0IGltcGxlbWVudHMgdGhlIHtAbGluayBUYWdsZXR9IGludGVyZmFjZS4KICAqCi0gKiBUaGlzIGNvZGUgaXMgbm90IHBhcnQgb2YgYW4gQVBJLgotICogSXQgaXMgaW1wbGVtZW50YXRpb24gdGhhdCBpcyBzdWJqZWN0IHRvIGNoYW5nZS4KLSAqIERvIG5vdCB1c2UgaXQgYXMgYW4gQVBJCisgKiAgPHA+PGI+VGhpcyBpcyBOT1QgcGFydCBvZiBhbnkgc3VwcG9ydGVkIEFQSS4KKyAqICBJZiB5b3Ugd3JpdGUgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhpcywgeW91IGRvIHNvIGF0IHlvdXIgb3duIHJpc2suCisgKiAgVGhpcyBjb2RlIGFuZCBpdHMgaW50ZXJuYWwgaW50ZXJmYWNlcyBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugb3IKKyAqICBkZWxldGlvbiB3aXRob3V0IG5vdGljZS48L2I+CiAgKgogICogQGF1dGhvciBKYW1pZSBIbwogICogQHNpbmNlIDEuNApkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L3RhZ2xldHMvQ29kZVRhZ2xldC5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L3RhZ2xldHMvQ29kZVRhZ2xldC5qYXZhCmluZGV4IDQ0NDc3MWIuLjRmZWM1NjUgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC90YWdsZXRzL0NvZGVUYWdsZXQuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvdGFnbGV0cy9Db2RlVGFnbGV0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC00MCw2ICs0MCwxMSBAQAogICogZGlzcGxheXMgYXM6CiAgKiA8YmxvY2txdW90ZT4gIFRoZSB0eXBlIHtAY29kZSBMaXN0PFA+fSAgPC9ibG9ja3F1b3RlPgogICoKKyAqICA8cD48Yj5UaGlzIGlzIE5PVCBwYXJ0IG9mIGFueSBzdXBwb3J0ZWQgQVBJLgorICogIElmIHlvdSB3cml0ZSBjb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGlzLCB5b3UgZG8gc28gYXQgeW91ciBvd24gcmlzay4KKyAqICBUaGlzIGNvZGUgYW5kIGl0cyBpbnRlcm5hbCBpbnRlcmZhY2VzIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSBvcgorICogIGRlbGV0aW9uIHdpdGhvdXQgbm90aWNlLjwvYj4KKyAqCiAgKiBAYXV0aG9yIFNjb3R0IFNlbGlnbWFuCiAgKiBAc2luY2UgMS41CiAgKi8KZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC90YWdsZXRzL0RlcHJlY2F0ZWRUYWdsZXQuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC90YWdsZXRzL0RlcHJlY2F0ZWRUYWdsZXQuamF2YQppbmRleCBiMjAzNWIzLi5mYzdmYzI0IDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvdGFnbGV0cy9EZXByZWNhdGVkVGFnbGV0LmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L3RhZ2xldHMvRGVwcmVjYXRlZFRhZ2xldC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMzAsOSArMzAsMTAgQEAKIC8qKgogICogQSB0YWdsZXQgdGhhdCByZXByZXNlbnRzIHRoZSBAZGVwcmVjYXRlZCB0YWcuCiAgKgotICogVGhpcyBjb2RlIGlzIG5vdCBwYXJ0IG9mIGFuIEFQSS4KLSAqIEl0IGlzIGltcGxlbWVudGF0aW9uIHRoYXQgaXMgc3ViamVjdCB0byBjaGFuZ2UuCi0gKiBEbyBub3QgdXNlIGl0IGFzIGFuIEFQSQorICogIDxwPjxiPlRoaXMgaXMgTk9UIHBhcnQgb2YgYW55IHN1cHBvcnRlZCBBUEkuCisgKiAgSWYgeW91IHdyaXRlIGNvZGUgdGhhdCBkZXBlbmRzIG9uIHRoaXMsIHlvdSBkbyBzbyBhdCB5b3VyIG93biByaXNrLgorICogIFRoaXMgY29kZSBhbmQgaXRzIGludGVybmFsIGludGVyZmFjZXMgYXJlIHN1YmplY3QgdG8gY2hhbmdlIG9yCisgKiAgZGVsZXRpb24gd2l0aG91dCBub3RpY2UuPC9iPgogICoKICAqIEBhdXRob3IgSmFtaWUgSG8KICAqIEBzaW5jZSAxLjUKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC90YWdsZXRzL0RvY1Jvb3RUYWdsZXQuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC90YWdsZXRzL0RvY1Jvb3RUYWdsZXQuamF2YQppbmRleCBmODk1YjY3Li44OTk4ZjI2IDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvdGFnbGV0cy9Eb2NSb290VGFnbGV0LmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L3RhZ2xldHMvRG9jUm9vdFRhZ2xldC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwMywgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMzIsOSArMzIsMTAgQEAKICAqIHVzZWQgdG8gZ2V0IHRoZSByZWxhdGl2ZSBwYXRoIHRvIHRoZSBkb2N1bWVudCdzIHJvb3Qgb3V0cHV0CiAgKiBkaXJlY3RvcnkuCiAgKgotICogVGhpcyBjb2RlIGlzIG5vdCBwYXJ0IG9mIGFuIEFQSS4KLSAqIEl0IGlzIGltcGxlbWVudGF0aW9uIHRoYXQgaXMgc3ViamVjdCB0byBjaGFuZ2UuCi0gKiBEbyBub3QgdXNlIGl0IGFzIGFuIEFQSQorICogIDxwPjxiPlRoaXMgaXMgTk9UIHBhcnQgb2YgYW55IHN1cHBvcnRlZCBBUEkuCisgKiAgSWYgeW91IHdyaXRlIGNvZGUgdGhhdCBkZXBlbmRzIG9uIHRoaXMsIHlvdSBkbyBzbyBhdCB5b3VyIG93biByaXNrLgorICogIFRoaXMgY29kZSBhbmQgaXRzIGludGVybmFsIGludGVyZmFjZXMgYXJlIHN1YmplY3QgdG8gY2hhbmdlIG9yCisgKiAgZGVsZXRpb24gd2l0aG91dCBub3RpY2UuPC9iPgogICoKICAqIEBhdXRob3IgSmFtaWUgSG8KICAqIEBhdXRob3IgRG91ZyBLcmFtZXIKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC90YWdsZXRzL0luaGVyaXREb2NUYWdsZXQuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC90YWdsZXRzL0luaGVyaXREb2NUYWdsZXQuamF2YQppbmRleCA1NTQ3NTZiLi5lNzM3ZjljIDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvdGFnbGV0cy9Jbmhlcml0RG9jVGFnbGV0LmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L3RhZ2xldHMvSW5oZXJpdERvY1RhZ2xldC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMzMsOSArMzMsMTAgQEAKICAqIGJlIHVzZWQgd2l0aCBhIG1ldGhvZC4gIEl0IGlzIHVzZWQgdG8gaW5oZXJpdCBkb2N1bWVudGF0aW9uIGZyb20gb3ZlcnJpZGVuCiAgKiBhbmQgaW1wbGVtZW50ZWQgbWV0aG9kcy4KICAqCi0gKiBUaGlzIGNvZGUgaXMgbm90IHBhcnQgb2YgYW4gQVBJLgotICogSXQgaXMgaW1wbGVtZW50YXRpb24gdGhhdCBpcyBzdWJqZWN0IHRvIGNoYW5nZS4KLSAqIERvIG5vdCB1c2UgaXQgYXMgYW4gQVBJCisgKiAgPHA+PGI+VGhpcyBpcyBOT1QgcGFydCBvZiBhbnkgc3VwcG9ydGVkIEFQSS4KKyAqICBJZiB5b3Ugd3JpdGUgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhpcywgeW91IGRvIHNvIGF0IHlvdXIgb3duIHJpc2suCisgKiAgVGhpcyBjb2RlIGFuZCBpdHMgaW50ZXJuYWwgaW50ZXJmYWNlcyBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugb3IKKyAqICBkZWxldGlvbiB3aXRob3V0IG5vdGljZS48L2I+CiAgKgogICogQGF1dGhvciBKYW1pZSBIbwogICogQHNpbmNlIDEuNApkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L3RhZ2xldHMvSW5oZXJpdGFibGVUYWdsZXQuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC90YWdsZXRzL0luaGVyaXRhYmxlVGFnbGV0LmphdmEKaW5kZXggMjBhMjY1ZC4uODk1MThlOCAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L3RhZ2xldHMvSW5oZXJpdGFibGVUYWdsZXQuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvdGFnbGV0cy9Jbmhlcml0YWJsZVRhZ2xldC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMywgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMzEsNiArMzEsMTEgQEAKICAqIEEgdGFnbGV0IHNob3VsZCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgaWYgaXQgc3VwcG9ydHMgdGhlIGluaGVyaXREb2MKICAqIHRhZyBvciBpcyBhdXRvbWF0aWNhbGx5IGluaGVyaXRlZCBpZiBpdCBpcyBtaXNzaW5nLgogICoKKyAqICA8cD48Yj5UaGlzIGlzIE5PVCBwYXJ0IG9mIGFueSBzdXBwb3J0ZWQgQVBJLgorICogIElmIHlvdSB3cml0ZSBjb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGlzLCB5b3UgZG8gc28gYXQgeW91ciBvd24gcmlzay4KKyAqICBUaGlzIGNvZGUgYW5kIGl0cyBpbnRlcm5hbCBpbnRlcmZhY2VzIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSBvcgorICogIGRlbGV0aW9uIHdpdGhvdXQgbm90aWNlLjwvYj4KKyAqCiAgKiBAYXV0aG9yIEphbWllIEhvCiAgKiBAc2luY2UgMS41CiAgKi8KZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC90YWdsZXRzL0xlZ2FjeVRhZ2xldC5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L3RhZ2xldHMvTGVnYWN5VGFnbGV0LmphdmEKaW5kZXggYjhjZmE2Zi4uMjk1NTQwNiAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L3RhZ2xldHMvTGVnYWN5VGFnbGV0LmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L3RhZ2xldHMvTGVnYWN5VGFnbGV0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0zNiw5ICszNiwxMCBAQAogICogVGhpcyB0YWdsZXQgaXMgYWJsZSB0byB3cmFwIG1vc3QgbW9zdCBsZWdhY3kgdGFnbGV0cyBiZWNhdXNlCiAgKiB0aGUgc3RhbmRhcmQgZG9jbGV0IGlzIHRoZSBvbmx5IGtub3duIGRvY2xldCB0byB1c2UgbGVnYWN5IHRhZ2xldHMuCiAgKgotICogVGhpcyBjb2RlIGlzIG5vdCBwYXJ0IG9mIGFuIEFQSS4KLSAqIEl0IGlzIGltcGxlbWVudGF0aW9uIHRoYXQgaXMgc3ViamVjdCB0byBjaGFuZ2UuCi0gKiBEbyBub3QgdXNlIGl0IGFzIGFuIEFQSQorICogIDxwPjxiPlRoaXMgaXMgTk9UIHBhcnQgb2YgYW55IHN1cHBvcnRlZCBBUEkuCisgKiAgSWYgeW91IHdyaXRlIGNvZGUgdGhhdCBkZXBlbmRzIG9uIHRoaXMsIHlvdSBkbyBzbyBhdCB5b3VyIG93biByaXNrLgorICogIFRoaXMgY29kZSBhbmQgaXRzIGludGVybmFsIGludGVyZmFjZXMgYXJlIHN1YmplY3QgdG8gY2hhbmdlIG9yCisgKiAgZGVsZXRpb24gd2l0aG91dCBub3RpY2UuPC9iPgogICoKICAqIEBzaW5jZSAxLjUKICAqIEBhdXRob3IgSmFtaWUgSG8KZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC90YWdsZXRzL0xpdGVyYWxUYWdsZXQuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC90YWdsZXRzL0xpdGVyYWxUYWdsZXQuamF2YQppbmRleCA3YTQ2NWUzLi43NWNjM2NmIDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvdGFnbGV0cy9MaXRlcmFsVGFnbGV0LmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L3RhZ2xldHMvTGl0ZXJhbFRhZ2xldC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMzgsNiArMzgsMTEgQEAKICAqIGRpc3BsYXlzIGFzOgogICogPGJsb2NrcXVvdGU+ICB7QGxpdGVyYWwgYTxCPmN9ICA8L2Jsb2NrcXVvdGU+CiAgKgorICogIDxwPjxiPlRoaXMgaXMgTk9UIHBhcnQgb2YgYW55IHN1cHBvcnRlZCBBUEkuCisgKiAgSWYgeW91IHdyaXRlIGNvZGUgdGhhdCBkZXBlbmRzIG9uIHRoaXMsIHlvdSBkbyBzbyBhdCB5b3VyIG93biByaXNrLgorICogIFRoaXMgY29kZSBhbmQgaXRzIGludGVybmFsIGludGVyZmFjZXMgYXJlIHN1YmplY3QgdG8gY2hhbmdlIG9yCisgKiAgZGVsZXRpb24gd2l0aG91dCBub3RpY2UuPC9iPgorICoKICAqIEBhdXRob3IgU2NvdHQgU2VsaWdtYW4KICAqIEBzaW5jZSAxLjUKICAqLwpAQCAtNzksNyArODQsNyBAQAogICAgICAqIFJlcGxhY2Ugb2NjdXJyZW5jZXMgb2YgdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJzOiAgPCA+ICYKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyB0ZXh0VG9TdHJpbmcoU3RyaW5nIHRleHQpIHsKLSAgICAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWYgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRleHQubGVuZ3RoKCk7IGkrKykgewogICAgICAgICAgICAgICAgY2hhciBjID0gdGV4dC5jaGFyQXQoaSk7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKGMpIHsKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC90YWdsZXRzL1BhcmFtVGFnbGV0LmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvdGFnbGV0cy9QYXJhbVRhZ2xldC5qYXZhCmluZGV4IDQ0OWJjMWYuLmFkNGJmOGIgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC90YWdsZXRzL1BhcmFtVGFnbGV0LmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L3RhZ2xldHMvUGFyYW1UYWdsZXQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDgsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDE2ICsyNSwxOCBAQAogCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0LnRhZ2xldHM7CiAKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKwogaW1wb3J0IGNvbS5zdW4uamF2YWRvYy4qOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0LnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKIAogLyoqCiAgKiBBIHRhZ2xldCB0aGF0IHJlcHJlc2VudHMgdGhlIEBwYXJhbSB0YWcuCiAgKgotICogVGhpcyBjb2RlIGlzIG5vdCBwYXJ0IG9mIGFuIEFQSS4KLSAqIEl0IGlzIGltcGxlbWVudGF0aW9uIHRoYXQgaXMgc3ViamVjdCB0byBjaGFuZ2UuCi0gKiBEbyBub3QgdXNlIGl0IGFzIGFuIEFQSQorICogIDxwPjxiPlRoaXMgaXMgTk9UIHBhcnQgb2YgYW55IHN1cHBvcnRlZCBBUEkuCisgKiAgSWYgeW91IHdyaXRlIGNvZGUgdGhhdCBkZXBlbmRzIG9uIHRoaXMsIHlvdSBkbyBzbyBhdCB5b3VyIG93biByaXNrLgorICogIFRoaXMgY29kZSBhbmQgaXRzIGludGVybmFsIGludGVyZmFjZXMgYXJlIHN1YmplY3QgdG8gY2hhbmdlIG9yCisgKiAgZGVsZXRpb24gd2l0aG91dCBub3RpY2UuPC9iPgogICoKICAqIEBhdXRob3IgSmFtaWUgSG8KICAqIEBzaW5jZSAxLjQKQEAgLTE4Miw3ICsxODQsNyBAQAogICAgICAqIEdpdmVuIGFuIGFycmF5IG9mIDxjb2RlPlBhcmFtVGFnPC9jb2RlPnMscmV0dXJuIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCiAgICAgICogVHJ5IHRvIGluaGVyaXQgdGhlIHBhcmFtIHRhZ3MgdGhhdCBhcmUgbWlzc2luZy4KICAgICAgKgotICAgICAqIEBwYXJhbSBkb2MgICAgICAgICAgICAgICB0aGUgZG9jIHRoYXQgaG9sZHMgdGhlIHBhcmFtIHRhZ3MuCisgICAgICogQHBhcmFtIGhvbGRlciAgICAgICAgICAgIHRoZSBkb2MgdGhhdCBob2xkcyB0aGUgcGFyYW0gdGFncy4KICAgICAgKiBAcGFyYW0gd3JpdGVyICAgICAgICAgICAgdGhlIFRhZ2xldFdyaXRlciB0aGF0IHdpbGwgd3JpdGUgdGhpcyB0YWcuCiAgICAgICogQHBhcmFtIGZvcm1hbFBhcmFtZXRlcnMgIFRoZSBhcnJheSBvZiBwYXJtZXRlcnMgKGZyb20gdHlwZSBvciBleGVjdXRhYmxlCiAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWJlcikgdG8gY2hlY2suCkBAIC0yNTUsNyArMjU3LDcgQEAKICAgICAgKiAgICAgICAgYmVlbiBkb2N1bWVudGVkLgogICAgICAqIEBwYXJhbSByYW5rTWFwIGEge0BsaW5rIGphdmEudXRpbC5NYXB9IHdoaWNoIGhvbGRzIG9yZGVyaW5nCiAgICAgICogICAgICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwYXJhbWV0ZXJzLgotICAgICAqIEBwYXJhbSBuYW1lTWFwIGEge0BsaW5rIGphdmEudXRpbC5NYXB9IHdoaWNoIGhvbGRzIGEgbWFwcGluZworICAgICAqIEBwYXJhbSByYW5rTWFwIGEge0BsaW5rIGphdmEudXRpbC5NYXB9IHdoaWNoIGhvbGRzIGEgbWFwcGluZwogICAgICAqICAgICAgICAgICAgICAgIG9mIGEgcmFuayBvZiBhIHBhcmFtZXRlciB0byBpdHMgbmFtZS4gIFRoaXMgaXMKICAgICAgKiAgICAgICAgICAgICAgICB1c2VkIHRvIGVuc3VyZSB0aGF0IHRoZSByaWdodCBuYW1lIGlzIHVzZWQKICAgICAgKiAgICAgICAgICAgICAgICB3aGVuIHBhcmFtZXRlciBkb2N1bWVudGF0aW9uIGlzIGluaGVyaXRlZC4KZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC90YWdsZXRzL1JldHVyblRhZ2xldC5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L3RhZ2xldHMvUmV0dXJuVGFnbGV0LmphdmEKaW5kZXggZjVlOTBjOC4uOWQ5OGE5NiAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L3RhZ2xldHMvUmV0dXJuVGFnbGV0LmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L3RhZ2xldHMvUmV0dXJuVGFnbGV0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDAzLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwxNSArMjUsMTYgQEAKIAogcGFja2FnZSBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC50YWdsZXRzOwogCi1pbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQudXRpbC4qOwogaW1wb3J0IGNvbS5zdW4uamF2YWRvYy4qOworaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0LnV0aWwuKjsKIAogLyoqCiAgKiBBIHRhZ2xldCB0aGF0IHJlcHJlc2VudHMgdGhlIEByZXR1cm4gdGFnLgogICoKLSAqIFRoaXMgY29kZSBpcyBub3QgcGFydCBvZiBhbiBBUEkuCi0gKiBJdCBpcyBpbXBsZW1lbnRhdGlvbiB0aGF0IGlzIHN1YmplY3QgdG8gY2hhbmdlLgotICogRG8gbm90IHVzZSBpdCBhcyBhbiBBUEkKKyAqICA8cD48Yj5UaGlzIGlzIE5PVCBwYXJ0IG9mIGFueSBzdXBwb3J0ZWQgQVBJLgorICogIElmIHlvdSB3cml0ZSBjb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGlzLCB5b3UgZG8gc28gYXQgeW91ciBvd24gcmlzay4KKyAqICBUaGlzIGNvZGUgYW5kIGl0cyBpbnRlcm5hbCBpbnRlcmZhY2VzIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSBvcgorICogIGRlbGV0aW9uIHdpdGhvdXQgbm90aWNlLjwvYj4KICAqCiAgKiBAYXV0aG9yIEphbWllIEhvCiAgKiBAc2luY2UgMS40CmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvdGFnbGV0cy9TZWVUYWdsZXQuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC90YWdsZXRzL1NlZVRhZ2xldC5qYXZhCmluZGV4IGJjYTI3MDcuLjRlM2U4MTAgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC90YWdsZXRzL1NlZVRhZ2xldC5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC90YWdsZXRzL1NlZVRhZ2xldC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwMywgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMTUgKzI1LDE2IEBACiAKIHBhY2thZ2UgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQudGFnbGV0czsKIAotaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0LnV0aWwuKjsKIGltcG9ydCBjb20uc3VuLmphdmFkb2MuKjsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC51dGlsLio7CiAKIC8qKgogICogQSB0YWdsZXQgdGhhdCByZXByZXNlbnRzIHRoZSBAc2VlIHRhZy4KICAqCi0gKiBUaGlzIGNvZGUgaXMgbm90IHBhcnQgb2YgYW4gQVBJLgotICogSXQgaXMgaW1wbGVtZW50YXRpb24gdGhhdCBpcyBzdWJqZWN0IHRvIGNoYW5nZS4KLSAqIERvIG5vdCB1c2UgaXQgYXMgYW4gQVBJCisgKiAgPHA+PGI+VGhpcyBpcyBOT1QgcGFydCBvZiBhbnkgc3VwcG9ydGVkIEFQSS4KKyAqICBJZiB5b3Ugd3JpdGUgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhpcywgeW91IGRvIHNvIGF0IHlvdXIgb3duIHJpc2suCisgKiAgVGhpcyBjb2RlIGFuZCBpdHMgaW50ZXJuYWwgaW50ZXJmYWNlcyBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugb3IKKyAqICBkZWxldGlvbiB3aXRob3V0IG5vdGljZS48L2I+CiAgKgogICogQGF1dGhvciBKYW1pZSBIbwogICogQHNpbmNlIDEuNApkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L3RhZ2xldHMvU2ltcGxlVGFnbGV0LmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvdGFnbGV0cy9TaW1wbGVUYWdsZXQuamF2YQppbmRleCAzMDUxNTAzLi40YjIxY2JkIDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvdGFnbGV0cy9TaW1wbGVUYWdsZXQuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvdGFnbGV0cy9TaW1wbGVUYWdsZXQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDMsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTMwLDkgKzMwLDEwIEBACiAvKioKICAqIEEgc2ltcGxlIHNpbmdsZSBhcmd1bWVudCBjdXN0b20gdGFnLgogICoKLSAqIFRoaXMgY29kZSBpcyBub3QgcGFydCBvZiBhbiBBUEkuCi0gKiBJdCBpcyBpbXBsZW1lbnRhdGlvbiB0aGF0IGlzIHN1YmplY3QgdG8gY2hhbmdlLgotICogRG8gbm90IHVzZSBpdCBhcyBhbiBBUEkKKyAqICA8cD48Yj5UaGlzIGlzIE5PVCBwYXJ0IG9mIGFueSBzdXBwb3J0ZWQgQVBJLgorICogIElmIHlvdSB3cml0ZSBjb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGlzLCB5b3UgZG8gc28gYXQgeW91ciBvd24gcmlzay4KKyAqICBUaGlzIGNvZGUgYW5kIGl0cyBpbnRlcm5hbCBpbnRlcmZhY2VzIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSBvcgorICogIGRlbGV0aW9uIHdpdGhvdXQgbm90aWNlLjwvYj4KICAqCiAgKiBAYXV0aG9yIEphbWllIEhvCiAgKi8KZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC90YWdsZXRzL1RhZ2xldE1hbmFnZXIuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC90YWdsZXRzL1RhZ2xldE1hbmFnZXIuamF2YQppbmRleCA3MGNlZTM5Li4wNDBjOWVhIDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvdGFnbGV0cy9UYWdsZXRNYW5hZ2VyLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L3RhZ2xldHMvVGFnbGV0TWFuYWdlci5qYXZhCkBAIC0yNSwyMCArMjUsMjEgQEAKIAogcGFja2FnZSBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC50YWdsZXRzOwogCi1pbXBvcnQgY29tLnN1bi5qYXZhZG9jLio7Ci1pbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQudXRpbC4qOwotCiBpbXBvcnQgamF2YS5pby4qOwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7CiBpbXBvcnQgamF2YS5uZXQuKjsKIGltcG9ydCBqYXZhLnV0aWwuKjsKIAoraW1wb3J0IGNvbS5zdW4uamF2YWRvYy4qOworaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0LnV0aWwuKjsKKwogLyoqCiAgKiBNYW5hZ2VzIHRoZTxjb2RlPlRhZ2xldDwvY29kZT5zIHVzZWQgYnkgZG9jbGV0cy4KICAqCi0gKiBUaGlzIGNvZGUgaXMgbm90IHBhcnQgb2YgYW4gQVBJLgotICogSXQgaXMgaW1wbGVtZW50YXRpb24gdGhhdCBpcyBzdWJqZWN0IHRvIGNoYW5nZS4KLSAqIERvIG5vdCB1c2UgaXQgYXMgYW4gQVBJCisgKiAgPHA+PGI+VGhpcyBpcyBOT1QgcGFydCBvZiBhbnkgc3VwcG9ydGVkIEFQSS4KKyAqICBJZiB5b3Ugd3JpdGUgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhpcywgeW91IGRvIHNvIGF0IHlvdXIgb3duIHJpc2suCisgKiAgVGhpcyBjb2RlIGFuZCBpdHMgaW50ZXJuYWwgaW50ZXJmYWNlcyBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugb3IKKyAqICBkZWxldGlvbiB3aXRob3V0IG5vdGljZS48L2I+CiAgKgogICogQGF1dGhvciBKYW1pZSBIbwogICogQHNpbmNlIDEuNApAQCAtNDQ4LDcgKzQ0OSw3IEBACiAgICAgICAgICAgICAvL1RoaXMga25vd24gdGFnIGlzIGV4Y2x1ZGVkLgogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBjb21iaW5lZF9sb2NhdGlvbnMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgY29tYmluZWRfbG9jYXRpb25zID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhdGlvbnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgIGlmIChpID4gMCkgewogICAgICAgICAgICAgICAgIGNvbWJpbmVkX2xvY2F0aW9ucy5hcHBlbmQoIiwgIik7CmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvdGFnbGV0cy9UYWdsZXRPdXRwdXQuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC90YWdsZXRzL1RhZ2xldE91dHB1dC5qYXZhCmluZGV4IGUwZGFiYzIuLmM3YmJlZjQgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC90YWdsZXRzL1RhZ2xldE91dHB1dC5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC90YWdsZXRzL1RhZ2xldE91dHB1dC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMywgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMzAsNiArMzAsMTEgQEAKICAqIGRpZmZlcmVudCBkb2NsZXRzIHdvcmsgd2l0aCBkaWZmZXJlbnQgZm9ybWF0cyBvZiBvdXRwdXQuICBBIHNpbmdsZSB0YWdsZXQgY2FuCiAgKiB3b3JrIHdpdGggYW55IGRvY2xldCB0aGF0IHByb3ZpZGVzIGFuIGltcGxlbWVudGF0aW9uIG9mIHRhZ2xldCBvdXRwdXQuCiAgKgorICogIDxwPjxiPlRoaXMgaXMgTk9UIHBhcnQgb2YgYW55IHN1cHBvcnRlZCBBUEkuCisgKiAgSWYgeW91IHdyaXRlIGNvZGUgdGhhdCBkZXBlbmRzIG9uIHRoaXMsIHlvdSBkbyBzbyBhdCB5b3VyIG93biByaXNrLgorICogIFRoaXMgY29kZSBhbmQgaXRzIGludGVybmFsIGludGVyZmFjZXMgYXJlIHN1YmplY3QgdG8gY2hhbmdlIG9yCisgKiAgZGVsZXRpb24gd2l0aG91dCBub3RpY2UuPC9iPgorICoKICAqIEBhdXRob3IgSmFtaWUgSG8KICAqIEBzaW5jZSAxLjUKICAqLwpkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L3RhZ2xldHMvVGFnbGV0V3JpdGVyLmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvdGFnbGV0cy9UYWdsZXRXcml0ZXIuamF2YQppbmRleCBiMjY4NDVjLi4yZTU5NGRiIDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvdGFnbGV0cy9UYWdsZXRXcml0ZXIuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvdGFnbGV0cy9UYWdsZXRXcml0ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDEzICsyNSwxOCBAQAogCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0LnRhZ2xldHM7CiAKK2ltcG9ydCBjb20uc3VuLmphdmFkb2MuKjsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC4qOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0LnV0aWwuKjsKLWltcG9ydCBjb20uc3VuLmphdmFkb2MuKjsKIAogLyoqCiAgKiBUaGUgaW50ZXJmYWNlIGZvciB0aGUgdGFnbGV0IHdyaXRlci4KICAqCisgKiAgPHA+PGI+VGhpcyBpcyBOT1QgcGFydCBvZiBhbnkgc3VwcG9ydGVkIEFQSS4KKyAqICBJZiB5b3Ugd3JpdGUgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhpcywgeW91IGRvIHNvIGF0IHlvdXIgb3duIHJpc2suCisgKiAgVGhpcyBjb2RlIGFuZCBpdHMgaW50ZXJuYWwgaW50ZXJmYWNlcyBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugb3IKKyAqICBkZWxldGlvbiB3aXRob3V0IG5vdGljZS48L2I+CisgKgogICogQHNpbmNlIDEuNQogICogQGF1dGhvciBKYW1pZSBIbwogICovCmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvdGFnbGV0cy9UaHJvd3NUYWdsZXQuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC90YWdsZXRzL1Rocm93c1RhZ2xldC5qYXZhCmluZGV4IGQyNTYxOGEuLjdiOGIzNjUgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC90YWdsZXRzL1Rocm93c1RhZ2xldC5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC90YWdsZXRzL1Rocm93c1RhZ2xldC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwOCwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMTYgKzI1LDE4IEBACiAKIHBhY2thZ2UgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQudGFnbGV0czsKIAoraW1wb3J0IGphdmEudXRpbC4qOworCiBpbXBvcnQgY29tLnN1bi5qYXZhZG9jLio7CiBpbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC4qOwogCiAvKioKICAqIEEgdGFnbGV0IHRoYXQgcmVwcmVzZW50cyB0aGUgQHRocm93cyB0YWcuCiAgKgotICogVGhpcyBjb2RlIGlzIG5vdCBwYXJ0IG9mIGFuIEFQSS4KLSAqIEl0IGlzIGltcGxlbWVudGF0aW9uIHRoYXQgaXMgc3ViamVjdCB0byBjaGFuZ2UuCi0gKiBEbyBub3QgdXNlIGl0IGFzIGFuIEFQSQorICogIDxwPjxiPlRoaXMgaXMgTk9UIHBhcnQgb2YgYW55IHN1cHBvcnRlZCBBUEkuCisgKiAgSWYgeW91IHdyaXRlIGNvZGUgdGhhdCBkZXBlbmRzIG9uIHRoaXMsIHlvdSBkbyBzbyBhdCB5b3VyIG93biByaXNrLgorICogIFRoaXMgY29kZSBhbmQgaXRzIGludGVybmFsIGludGVyZmFjZXMgYXJlIHN1YmplY3QgdG8gY2hhbmdlIG9yCisgKiAgZGVsZXRpb24gd2l0aG91dCBub3RpY2UuPC9iPgogICoKICAqIEBhdXRob3IgSmFtaWUgSG8KICAqIEBzaW5jZSAxLjQKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC90YWdsZXRzL1ZhbHVlVGFnbGV0LmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvdGFnbGV0cy9WYWx1ZVRhZ2xldC5qYXZhCmluZGV4IGUwN2JjMTUuLjkwNzk0YmYgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC90YWdsZXRzL1ZhbHVlVGFnbGV0LmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L3RhZ2xldHMvVmFsdWVUYWdsZXQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDMsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDEwICsyNSwxMSBAQAogCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0LnRhZ2xldHM7CiAKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKwogaW1wb3J0IGNvbS5zdW4uamF2YWRvYy4qOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0LkNvbmZpZ3VyYXRpb247CiBpbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC4qOwogCiAvKioKICAqIEFuIGlubGluZSBUYWdsZXQgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSB0YWcuIFRoaXMgdGFnIHNob3VsZCBvbmx5IGJlIHVzZWQgd2l0aApAQCAtMzksOSArNDAsMTAgQEAKICAqIGlzIHJldHJpZXZlZCBmb3IgdGhlIGZpZWxkIHRoYXQgdGhlIGlubGluZSB0YWcgYXBwZWFycyBvbi4gIFRoZSBuYW1lIGlzIHNwZWNpZmVkCiAgKiBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdDogIFtmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZV0jW2NvbnN0YW50IGZpZWxkIG5hbWVdLgogICoKLSAqIFRoaXMgY29kZSBpcyBub3QgcGFydCBvZiBhbiBBUEkuCi0gKiBJdCBpcyBpbXBsZW1lbnRhdGlvbiB0aGF0IGlzIHN1YmplY3QgdG8gY2hhbmdlLgotICogRG8gbm90IHVzZSBpdCBhcyBhbiBBUEkKKyAqICA8cD48Yj5UaGlzIGlzIE5PVCBwYXJ0IG9mIGFueSBzdXBwb3J0ZWQgQVBJLgorICogIElmIHlvdSB3cml0ZSBjb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGlzLCB5b3UgZG8gc28gYXQgeW91ciBvd24gcmlzay4KKyAqICBUaGlzIGNvZGUgYW5kIGl0cyBpbnRlcm5hbCBpbnRlcmZhY2VzIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSBvcgorICogIGRlbGV0aW9uIHdpdGhvdXQgbm90aWNlLjwvYj4KICAqCiAgKiBAYXV0aG9yIEphbWllIEhvCiAgKiBAc2luY2UgMS40CkBAIC0xMDcsNyArMTA5LDcgQEAKICAgICAgKiBAcGFyYW0gY29uZmlnIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gb2YgdGhlIGRvY2xldC4KICAgICAgKiBAcGFyYW0gdGFnIHRoZSB2YWx1ZSB0YWcuCiAgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpZWxkIHRvIHNlYXJjaCBmb3IuICBUaGUgbmFtZSBzaG91bGQgYmUgaW4KLSAgICAgKiA8cXVhbGlmaWVkIGNsYXNzIG5hbWU+IzxmaWVsZCBuYW1lPiBmb3JtYXQuIElmIHRoZSBjbGFzcyBuYW1lIGlzIG9taXR0ZWQsCisgICAgICoge0Bjb2RlIDxxdWFsaWZpZWQgY2xhc3MgbmFtZT4jPGZpZWxkIG5hbWU+fSBmb3JtYXQuIElmIHRoZSBjbGFzcyBuYW1lIGlzIG9taXR0ZWQsCiAgICAgICogaXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBmaWVsZCBpcyBpbiB0aGUgY3VycmVudCBjbGFzcy4KICAgICAgKgogICAgICAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgRmllbGREb2MuIElmIHRoZSBuYW1lIGlzIG51bGwgb3IgZW1wdHkgc3RyaW5nLApkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L3V0aWwvQ2xhc3NEb2NDYXRhbG9nLmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvdXRpbC9DbGFzc0RvY0NhdGFsb2cuamF2YQppbmRleCA1MjlkNGZjLi45ZTgzZWRmIDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvdXRpbC9DbGFzc0RvY0NhdGFsb2cuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvdXRpbC9DbGFzc0RvY0NhdGFsb2cuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTEsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTM2LDkgKzM2LDEwIEBACiAgKiB0aG9zZSBjbGFzc2VzIHNvIHRoYXQgd2UgY2FuIHJldHJpZXZlIGFsbCBvZiB0aGUgY2xhc3NlcyBmcm9tIGEgcGFydGljdWxhcgogICogcGFja2FnZSBsYXRlci4KICAqCi0gKiBUaGlzIGNvZGUgaXMgbm90IHBhcnQgb2YgYW4gQVBJLgotICogSXQgaXMgaW1wbGVtZW50YXRpb24gdGhhdCBpcyBzdWJqZWN0IHRvIGNoYW5nZS4KLSAqIERvIG5vdCB1c2UgaXQgYXMgYW4gQVBJCisgKiAgPHA+PGI+VGhpcyBpcyBOT1QgcGFydCBvZiBhbnkgc3VwcG9ydGVkIEFQSS4KKyAqICBJZiB5b3Ugd3JpdGUgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhpcywgeW91IGRvIHNvIGF0IHlvdXIgb3duIHJpc2suCisgKiAgVGhpcyBjb2RlIGFuZCBpdHMgaW50ZXJuYWwgaW50ZXJmYWNlcyBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugb3IKKyAqICBkZWxldGlvbiB3aXRob3V0IG5vdGljZS48L2I+CiAgKgogICogQGF1dGhvciBKYW1pZSBIbwogICogQHNpbmNlIDEuNApAQCAtMTg0LDcgKzE4NSw3IEBACiAgICAgICAvKioKICAgICAgICAqIFJldHVybiBhbGwgb2YgdGhlIGNsYXNzZXMgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kLWxpbmUgdGhhdAogICAgICAgICogYmVsb25nIHRvIHRoZSBnaXZlbiBwYWNrYWdlLgotICAgICAgICogQHBhcmFtIHBhY2thZ2VEb2MgdGhlIHBhY2thZ2UgdG8gcmV0dXJuIHRoZSBjbGFzc2VzIGZvci4KKyAgICAgICAqIEBwYXJhbSBwa2dEb2MgdGhlIHBhY2thZ2UgdG8gcmV0dXJuIHRoZSBjbGFzc2VzIGZvci4KICAgICAgICAqLwogICAgICAgcHVibGljIENsYXNzRG9jW10gYWxsQ2xhc3NlcyhQYWNrYWdlRG9jIHBrZ0RvYykgewogICAgICAgICAgIHJldHVybiBwa2dEb2MuaXNJbmNsdWRlZCgpID8KZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC91dGlsL0NsYXNzVHJlZS5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L3V0aWwvQ2xhc3NUcmVlLmphdmEKaW5kZXggNWRhOTE3ZS4uMzlmOWFkZiAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L3V0aWwvQ2xhc3NUcmVlLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L3V0aWwvQ2xhc3NUcmVlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDExLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwxNyArMjUsMTkgQEAKIAogcGFja2FnZSBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC51dGlsOwogCi1pbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQuKjsKLWltcG9ydCBjb20uc3VuLmphdmFkb2MuKjsKIGltcG9ydCBqYXZhLnV0aWwuKjsKIAoraW1wb3J0IGNvbS5zdW4uamF2YWRvYy4qOworaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0Lio7CisKIC8qKgogICogQnVpbGQgQ2xhc3MgSGllcmFyY2h5IGZvciBhbGwgdGhlIENsYXNzZXMuIFRoaXMgY2xhc3MgYnVpbGRzIHRoZSBDbGFzcwogICogVHJlZSBhbmQgdGhlIEludGVyZmFjZSBUcmVlIHNlcGFyYXRlbHkuCiAgKgotICogVGhpcyBjb2RlIGlzIG5vdCBwYXJ0IG9mIGFuIEFQSS4KLSAqIEl0IGlzIGltcGxlbWVudGF0aW9uIHRoYXQgaXMgc3ViamVjdCB0byBjaGFuZ2UuCi0gKiBEbyBub3QgdXNlIGl0IGFzIGFuIEFQSQorICogIDxwPjxiPlRoaXMgaXMgTk9UIHBhcnQgb2YgYW55IHN1cHBvcnRlZCBBUEkuCisgKiAgSWYgeW91IHdyaXRlIGNvZGUgdGhhdCBkZXBlbmRzIG9uIHRoaXMsIHlvdSBkbyBzbyBhdCB5b3VyIG93biByaXNrLgorICogIFRoaXMgY29kZSBhbmQgaXRzIGludGVybmFsIGludGVyZmFjZXMgYXJlIHN1YmplY3QgdG8gY2hhbmdlIG9yCisgKiAgZGVsZXRpb24gd2l0aG91dCBub3RpY2UuPC9iPgogICoKICAqIEBzZWUgamF2YS51dGlsLkhhc2hNYXAKICAqIEBzZWUgamF2YS51dGlsLkxpc3QKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC91dGlsL0NsYXNzVXNlTWFwcGVyLmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvdXRpbC9DbGFzc1VzZU1hcHBlci5qYXZhCmluZGV4IDAxN2VkNzIuLmE3ZWI0ZjYgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC91dGlsL0NsYXNzVXNlTWFwcGVyLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L3V0aWwvQ2xhc3NVc2VNYXBwZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDgsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDE1ICsyNSwxNyBAQAogCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0LnV0aWw7CiAKLWltcG9ydCBjb20uc3VuLmphdmFkb2MuKjsKIGltcG9ydCBqYXZhLnV0aWwuKjsKIAoraW1wb3J0IGNvbS5zdW4uamF2YWRvYy4qOworCiAvKioKICAqIE1hcCBhbGwgY2xhc3MgdXNlcyBmb3IgYSBnaXZlbiBjbGFzcy4KICAqCi0gKiBUaGlzIGNvZGUgaXMgbm90IHBhcnQgb2YgYW4gQVBJLgotICogSXQgaXMgaW1wbGVtZW50YXRpb24gdGhhdCBpcyBzdWJqZWN0IHRvIGNoYW5nZS4KLSAqIERvIG5vdCB1c2UgaXQgYXMgYW4gQVBJCisgKiAgPHA+PGI+VGhpcyBpcyBOT1QgcGFydCBvZiBhbnkgc3VwcG9ydGVkIEFQSS4KKyAqICBJZiB5b3Ugd3JpdGUgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhpcywgeW91IGRvIHNvIGF0IHlvdXIgb3duIHJpc2suCisgKiAgVGhpcyBjb2RlIGFuZCBpdHMgaW50ZXJuYWwgaW50ZXJmYWNlcyBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugb3IKKyAqICBkZWxldGlvbiB3aXRob3V0IG5vdGljZS48L2I+CiAgKgogICogQHNpbmNlIDEuMgogICogQGF1dGhvciBSb2JlcnQgRy4gRmllbGQKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC91dGlsL0NvbW1lbnRlZE1ldGhvZEZpbmRlci5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L3V0aWwvQ29tbWVudGVkTWV0aG9kRmluZGVyLmphdmEKaW5kZXggZDc0YzA4ZS4uNWM4ODIxNCAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L3V0aWwvQ29tbWVudGVkTWV0aG9kRmluZGVyLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L3V0aWwvQ29tbWVudGVkTWV0aG9kRmluZGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAxOTk5LCAyMDAzLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk5LCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0zMCw5ICszMCwxMCBAQAogLyoqCiAgKiBGaW5kIGEgY29tbWVudGVkIG1ldGhvZC4KICAqCi0gKiBUaGlzIGNvZGUgaXMgbm90IHBhcnQgb2YgYW4gQVBJLgotICogSXQgaXMgaW1wbGVtZW50YXRpb24gdGhhdCBpcyBzdWJqZWN0IHRvIGNoYW5nZS4KLSAqIERvIG5vdCB1c2UgaXQgYXMgYW4gQVBJCisgKiAgPHA+PGI+VGhpcyBpcyBOT1QgcGFydCBvZiBhbnkgc3VwcG9ydGVkIEFQSS4KKyAqICBJZiB5b3Ugd3JpdGUgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhpcywgeW91IGRvIHNvIGF0IHlvdXIgb3duIHJpc2suCisgKiAgVGhpcyBjb2RlIGFuZCBpdHMgaW50ZXJuYWwgaW50ZXJmYWNlcyBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugb3IKKyAqICBkZWxldGlvbiB3aXRob3V0IG5vdGljZS48L2I+CiAgKgogICovCiBwdWJsaWMgY2xhc3MgQ29tbWVudGVkTWV0aG9kRmluZGVyIGV4dGVuZHMgTWV0aG9kRmluZGVyIHsKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC91dGlsL0RlcHJlY2F0ZWRBUElMaXN0QnVpbGRlci5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L3V0aWwvRGVwcmVjYXRlZEFQSUxpc3RCdWlsZGVyLmphdmEKaW5kZXggNWM2NGE4Zi4uOGY4YTA5NiAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L3V0aWwvRGVwcmVjYXRlZEFQSUxpc3RCdWlsZGVyLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L3V0aWwvRGVwcmVjYXRlZEFQSUxpc3RCdWlsZGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDExLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwxMyArMjUsMTkgQEAKIAogcGFja2FnZSBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC51dGlsOwogCi1pbXBvcnQgY29tLnN1bi5qYXZhZG9jLio7CiBpbXBvcnQgamF2YS51dGlsLio7CisKK2ltcG9ydCBjb20uc3VuLmphdmFkb2MuKjsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC5Db25maWd1cmF0aW9uOwogCiAvKioKICAqIEJ1aWxkIGxpc3Qgb2YgYWxsIHRoZSBkZXByZWNhdGVkIHBhY2thZ2VzLCBjbGFzc2VzLCBjb25zdHJ1Y3RvcnMsIGZpZWxkcyBhbmQgbWV0aG9kcy4KICAqCisgKiAgPHA+PGI+VGhpcyBpcyBOT1QgcGFydCBvZiBhbnkgc3VwcG9ydGVkIEFQSS4KKyAqICBJZiB5b3Ugd3JpdGUgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhpcywgeW91IGRvIHNvIGF0IHlvdXIgb3duIHJpc2suCisgKiAgVGhpcyBjb2RlIGFuZCBpdHMgaW50ZXJuYWwgaW50ZXJmYWNlcyBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugb3IKKyAqICBkZWxldGlvbiB3aXRob3V0IG5vdGljZS48L2I+CisgKgogICogQGF1dGhvciBBdHVsIE0gRGFtYmFsa2FyCiAgKi8KIHB1YmxpYyBjbGFzcyBEZXByZWNhdGVkQVBJTGlzdEJ1aWxkZXIgewpAQCAtMTQ1LDcgKzE1MSw3IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSBsaXN0IG9mIGRlcHJlY2F0ZWQgRG9jIG9iamVjdHMgb2YgYSBnaXZlbiB0eXBlLgogICAgICAqCi0gICAgICogQHBhcmFtIHRoZSBjb25zdGFudCByZXByZXNlbnRpbmcgdGhlIHR5cGUgb2YgbGlzdCBiZWluZyByZXR1cm5lZC4KKyAgICAgKiBAcGFyYW0gdHlwZSB0aGUgY29uc3RhbnQgcmVwcmVzZW50aW5nIHRoZSB0eXBlIG9mIGxpc3QgYmVpbmcgcmV0dXJuZWQuCiAgICAgICovCiAgICAgcHVibGljIExpc3Q8RG9jPiBnZXRMaXN0KGludCB0eXBlKSB7CiAgICAgICAgIHJldHVybiBkZXByZWNhdGVkTGlzdHMuZ2V0KHR5cGUpOwpkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L3V0aWwvRGlyZWN0b3J5TWFuYWdlci5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L3V0aWwvRGlyZWN0b3J5TWFuYWdlci5qYXZhCmluZGV4IGZkNTBkOGYuLmE5MWExYjcgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC91dGlsL0RpcmVjdG9yeU1hbmFnZXIuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvdXRpbC9EaXJlY3RvcnlNYW5hZ2VyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDEwLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0xMTksNyArMTE5LDcgQEAKICAgICAgICAgaWYgKHBhY2thZ2VOYW1lID09IG51bGwgfHwgcGFja2FnZU5hbWUubGVuZ3RoKCkgPT0gMCkgewogICAgICAgICAgICAgcmV0dXJuICIiOwogICAgICAgICB9Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBwYXRoc3RyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBTdHJpbmdCdWlsZGVyIHBhdGhzdHIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhY2thZ2VOYW1lLmxlbmd0aCgpOyBpKyspIHsKICAgICAgICAgICAgIGNoYXIgY2ggPSBwYWNrYWdlTmFtZS5jaGFyQXQoaSk7CiAgICAgICAgICAgICBpZiAoY2ggPT0gJy4nKSB7CkBAIC0xNTEsNyArMTUxLDcgQEAKICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCB8fCBuYW1lLmxlbmd0aCgpID09IDApIHsKICAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICAgfQotICAgICAgICBTdHJpbmdCdWZmZXIgcGF0aHN0ciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBwYXRoc3RyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lLmxlbmd0aCgpOyBpKyspIHsKICAgICAgICAgICAgIGNoYXIgY2ggPSBuYW1lLmNoYXJBdChpKTsKICAgICAgICAgICAgIGlmIChjaCA9PSAnLicpIHsKQEAgLTE4MSw3ICsxODEsNyBAQAogICAgICAqIEBzZWUgICAgICAgICAgI2dldFBhdGgoU3RyaW5nKQogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlbGF0aXZlUGF0aChTdHJpbmcgZnJvbSwgU3RyaW5nIHRvKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBwYXRoc3RyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBTdHJpbmdCdWlsZGVyIHBhdGhzdHIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogICAgICAgICBwYXRoc3RyLmFwcGVuZChnZXRSZWxhdGl2ZVBhdGgoZnJvbSkpOwogICAgICAgICBwYXRoc3RyLmFwcGVuZChnZXRQYXRoKHRvKSk7CiAgICAgICAgIHBhdGhzdHIuYXBwZW5kKFVSTF9GSUxFX1NFUEFSQVRPUik7CkBAIC0yMjIsNyArMjIyLDcgQEAKICAgICAgICAgaWYgKGZyb20gPT0gbnVsbCB8fCBmcm9tLmxlbmd0aCgpID09IDApIHsKICAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICAgfQotICAgICAgICBTdHJpbmdCdWZmZXIgcGF0aHN0ciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBwYXRoc3RyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcm9tLmxlbmd0aCgpOyBpKyspIHsKICAgICAgICAgICAgIGNoYXIgY2ggPSBmcm9tLmNoYXJBdChpKTsKICAgICAgICAgICAgIGlmIChjaCA9PSAnLicpIHsKQEAgLTI5Myw3ICsyOTMsNyBAQAogICAgICAqIEBwYXJhbSBmaWxlbmFtZSAgIEZpbGUgbmFtZSB0byBiZSBhcHBlbmRlZCB0byB0aGUgcGF0aCBvZiB0aGUgcGFja2FnZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQYXRoVG9QYWNrYWdlKFBhY2thZ2VEb2MgcGQsIFN0cmluZyBmaWxlbmFtZSkgewotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAgICAgICAgIFN0cmluZyBwYXRoc3RyID0gY3JlYXRlUGF0aFN0cmluZyhwZCk7CiAgICAgICAgIGlmIChwYXRoc3RyLmxlbmd0aCgpID4gMCkgewogICAgICAgICAgICAgYnVmLmFwcGVuZChwYXRoc3RyKTsKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC91dGlsL0RvY0ZpbmRlci5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L3V0aWwvRG9jRmluZGVyLmphdmEKaW5kZXggYjIzZTVkYi4uYTBlNDAxNSAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L3V0aWwvRG9jRmluZGVyLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L3V0aWwvRG9jRmluZGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwxMyArMjUsMTkgQEAKIAogcGFja2FnZSBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC51dGlsOwogCitpbXBvcnQgamF2YS51dGlsLio7CisKIGltcG9ydCBjb20uc3VuLmphdmFkb2MuKjsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC50YWdsZXRzLio7Ci1pbXBvcnQgamF2YS51dGlsLio7CiAKIC8qKgogICogU2VhcmNoIGZvciB0aGUgcmVxdWVzdGVkIGRvY3VtZW50YXRpb24uICBJbmhlcml0IGRvY3VtZW50YXRpb24gaWYgbmVjZXNzYXJ5LgogICoKKyAqICA8cD48Yj5UaGlzIGlzIE5PVCBwYXJ0IG9mIGFueSBzdXBwb3J0ZWQgQVBJLgorICogIElmIHlvdSB3cml0ZSBjb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGlzLCB5b3UgZG8gc28gYXQgeW91ciBvd24gcmlzay4KKyAqICBUaGlzIGNvZGUgYW5kIGl0cyBpbnRlcm5hbCBpbnRlcmZhY2VzIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSBvcgorICogIGRlbGV0aW9uIHdpdGhvdXQgbm90aWNlLjwvYj4KKyAqCiAgKiBAYXV0aG9yIEphbWllIEhvCiAgKiBAc2luY2UgMS41CiAgKi8KZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC91dGlsL0RvY2xldEFib3J0RXhjZXB0aW9uLmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvdXRpbC9Eb2NsZXRBYm9ydEV4Y2VwdGlvbi5qYXZhCmluZGV4IGM5M2Q1YmMuLjYyNjFjYWUgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC91dGlsL0RvY2xldEFib3J0RXhjZXB0aW9uLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L3V0aWwvRG9jbGV0QWJvcnRFeGNlcHRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTcsIDIwMDksIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDYgKzI1LDEyIEBACiAKIHBhY2thZ2UgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQudXRpbDsKIAorLyoqCisgKiAgPHA+PGI+VGhpcyBpcyBOT1QgcGFydCBvZiBhbnkgc3VwcG9ydGVkIEFQSS4KKyAqICBJZiB5b3Ugd3JpdGUgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhpcywgeW91IGRvIHNvIGF0IHlvdXIgb3duIHJpc2suCisgKiAgVGhpcyBjb2RlIGFuZCBpdHMgaW50ZXJuYWwgaW50ZXJmYWNlcyBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugb3IKKyAqICBkZWxldGlvbiB3aXRob3V0IG5vdGljZS48L2I+CisgKi8KIHB1YmxpYyBjbGFzcyBEb2NsZXRBYm9ydEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC05MTMxMDU4OTA5NTc2NDE4OTg0TDsKIApkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L3V0aWwvRG9jbGV0Q29uc3RhbnRzLmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvdXRpbC9Eb2NsZXRDb25zdGFudHMuamF2YQppbmRleCBmOTYyMDgwLi44ZjBmZDRjIDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvdXRpbC9Eb2NsZXRDb25zdGFudHMuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvdXRpbC9Eb2NsZXRDb25zdGFudHMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI5LDkgKzI5LDEwIEBACiAgKiBTdG9yZXMgYWxsIGNvbnN0YW50cyBmb3IgYSBEb2NsZXQuICBFeHRlbmQgdGhpcyBjbGFzcyBpZiB5b3UgaGF2ZSBkb2NsZXQKICAqIHNwZWNpZmljIGNvbnN0YW50cyB0byBhZGQuCiAgKgotICogVGhpcyBjb2RlIGlzIG5vdCBwYXJ0IG9mIGFuIEFQSS4KLSAqIEl0IGlzIGltcGxlbWVudGF0aW9uIHRoYXQgaXMgc3ViamVjdCB0byBjaGFuZ2UuCi0gKiBEbyBub3QgdXNlIGl0IGFzIGFuIEFQSQorICogIDxwPjxiPlRoaXMgaXMgTk9UIHBhcnQgb2YgYW55IHN1cHBvcnRlZCBBUEkuCisgKiAgSWYgeW91IHdyaXRlIGNvZGUgdGhhdCBkZXBlbmRzIG9uIHRoaXMsIHlvdSBkbyBzbyBhdCB5b3VyIG93biByaXNrLgorICogIFRoaXMgY29kZSBhbmQgaXRzIGludGVybmFsIGludGVyZmFjZXMgYXJlIHN1YmplY3QgdG8gY2hhbmdlIG9yCisgKiAgZGVsZXRpb24gd2l0aG91dCBub3RpY2UuPC9iPgogICoKICAqIEBhdXRob3IgSmFtaWUgSG8KICAqIEBzaW5jZSAxLjUKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC91dGlsL0V4dGVybi5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L3V0aWwvRXh0ZXJuLmphdmEKaW5kZXggMzJhNGEwZC4uNWMxY2YxYiAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L3V0aWwvRXh0ZXJuLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L3V0aWwvRXh0ZXJuLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwxMyArMjUsMTMgQEAKIAogcGFja2FnZSBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC51dGlsOwogCi1pbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQuKjsKLQotaW1wb3J0IGNvbS5zdW4uamF2YWRvYy4qOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS5pby4qOwogaW1wb3J0IGphdmEubmV0Lio7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGNvbS5zdW4uamF2YWRvYy4qOworaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0Lio7CiAKIC8qKgogICogUHJvY2VzcyBhbmQgbWFuYWdlICItbGluayIgYW5kICItbGlua29mZmxpbmUiIHRvIGV4dGVybmFsIHBhY2thZ2VzLiBUaGUKQEAgLTQwLDkgKzQwLDEwIEBACiAgKiBkb2N1bWVudGVkKSBmaWxlIGluIHRoZSBjdXJyZW50IG9yIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnksIHdoaWxlCiAgKiBnZW5lcmF0aW5nIHRoZSBkb2N1bWVudGF0aW9uLgogICoKLSAqIFRoaXMgY29kZSBpcyBub3QgcGFydCBvZiBhbiBBUEkuCi0gKiBJdCBpcyBpbXBsZW1lbnRhdGlvbiB0aGF0IGlzIHN1YmplY3QgdG8gY2hhbmdlLgotICogRG8gbm90IHVzZSBpdCBhcyBhbiBBUEkKKyAqICA8cD48Yj5UaGlzIGlzIE5PVCBwYXJ0IG9mIGFueSBzdXBwb3J0ZWQgQVBJLgorICogIElmIHlvdSB3cml0ZSBjb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGlzLCB5b3UgZG8gc28gYXQgeW91ciBvd24gcmlzay4KKyAqICBUaGlzIGNvZGUgYW5kIGl0cyBpbnRlcm5hbCBpbnRlcmZhY2VzIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSBvcgorICogIGRlbGV0aW9uIHdpdGhvdXQgbm90aWNlLjwvYj4KICAqCiAgKiBAYXV0aG9yIEF0dWwgTSBEYW1iYWxrYXIKICAqIEBhdXRob3IgUm9iZXJ0IEZpZWxkCkBAIC05MSw3ICs5Miw3IEBACiAgICAgICAgICAqIElmIHRoZSBzYW1lIHBhY2thZ2UgbmFtZSBpcyBmb3VuZCBpbiB0aGUgbWFwLCB0aGVuIHRoZSBmaXJzdCBtYXBwZWQKICAgICAgICAgICogSXRlbSBvYmplY3Qgb3Igb2ZmbGluZSBsb2NhdGlvbiB3aWxsIGJlIHJldGFpbmVkLgogICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gcGFja2FnZW5hbWUgUGFja2FnZSBuYW1lIGZvdW5kIGluIHRoZSAicGFja2FnZS1saXN0IiBmaWxlLgorICAgICAgICAgKiBAcGFyYW0gcGFja2FnZU5hbWUgUGFja2FnZSBuYW1lIGZvdW5kIGluIHRoZSAicGFja2FnZS1saXN0IiBmaWxlLgogICAgICAgICAgKiBAcGFyYW0gcGF0aCAgICAgICAgVVJMIG9yIERpcmVjdG9yeSBwYXRoIGZyb20gd2hlcmUgdGhlICJwYWNrYWdlLWxpc3QiCiAgICAgICAgICAqIGZpbGUgaXMgcGlja2VkLgogICAgICAgICAgKiBAcGFyYW0gcmVsYXRpdmUgICAgVHJ1ZSBpZiBwYXRoIGlzIFVSTCwgZmFsc2UgaWYgZGlyZWN0b3J5IHBhdGguCkBAIC0xNzksNyArMTgwLDcgQEAKICAgICAvKioKICAgICAgKiBHZXQgdGhlIEV4dGVybiBJdGVtIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBwYWNrYWdlIG5hbWUuCiAgICAgICoKLSAgICAgKiBAcGFyYW0gcGtnbmFtZSBQYWNrYWdlIG5hbWUuCisgICAgICogQHBhcmFtIHBrZ05hbWUgUGFja2FnZSBuYW1lLgogICAgICAqLwogICAgIHByaXZhdGUgSXRlbSBmaW5kUGFja2FnZUl0ZW0oU3RyaW5nIHBrZ05hbWUpIHsKICAgICAgICAgaWYgKHBhY2thZ2VUb0l0ZW1NYXAgPT0gbnVsbCkgewpAQCAtMjc2LDcgKzI3Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcmVsYXRpdmUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgQnVmZmVyZWRSZWFkZXIgaW4gPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGlucHV0KSk7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzdHJidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgc3RyYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGludCBjOwogICAgICAgICAgICAgd2hpbGUgKChjID0gaW4ucmVhZCgpKSA+PSAwKSB7CmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvdXRpbC9Hcm91cC5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L3V0aWwvR3JvdXAuamF2YQppbmRleCA1ODkzZjMwLi5iZTUyODRlIDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvdXRpbC9Hcm91cC5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC91dGlsL0dyb3VwLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA4LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwxMCArMjUsMTEgQEAKIAogcGFja2FnZSBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC51dGlsOwogCi1pbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQuKjsKLWltcG9ydCBjb20uc3VuLmphdmFkb2MuKjsKIGltcG9ydCBqYXZhLnV0aWwuKjsKIAoraW1wb3J0IGNvbS5zdW4uamF2YWRvYy4qOworaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0Lio7CisKIC8qKgogICogUHJvY2VzcyBhbmQgbWFuYWdlIGdyb3VwaW5nIG9mIHBhY2thZ2VzLCBhcyBzcGVjaWZpZWQgYnkgIi1ncm91cCIgb3B0aW9uIG9uCiAgKiB0aGUgY29tbWFuZCBsaW5lLgpAQCAtNDgsOSArNDksMTAgQEAKICAqIHdpbGwgcHV0IHRoZSBwYWNrYWdlIGphdmEubGFuZyBpbiB0aGUgZ3JvdXAgIkxhbmciIGFuZCBub3QgaW4gZ3JvdXAgIkNvcmUiLgogICogPC9wPgogICoKLSAqIFRoaXMgY29kZSBpcyBub3QgcGFydCBvZiBhbiBBUEkuCi0gKiBJdCBpcyBpbXBsZW1lbnRhdGlvbiB0aGF0IGlzIHN1YmplY3QgdG8gY2hhbmdlLgotICogRG8gbm90IHVzZSBpdCBhcyBhbiBBUEkKKyAqICA8cD48Yj5UaGlzIGlzIE5PVCBwYXJ0IG9mIGFueSBzdXBwb3J0ZWQgQVBJLgorICogIElmIHlvdSB3cml0ZSBjb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGlzLCB5b3UgZG8gc28gYXQgeW91ciBvd24gcmlzay4KKyAqICBUaGlzIGNvZGUgYW5kIGl0cyBpbnRlcm5hbCBpbnRlcmZhY2VzIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSBvcgorICogIGRlbGV0aW9uIHdpdGhvdXQgbm90aWNlLjwvYj4KICAqCiAgKiBAYXV0aG9yIEF0dWwgTSBEYW1iYWxrYXIKICAqLwpkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L3V0aWwvSW1wbGVtZW50ZWRNZXRob2RzLmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvdXRpbC9JbXBsZW1lbnRlZE1ldGhvZHMuamF2YQppbmRleCAzNzgzNDQyLi5jMmJmYzEzIDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvdXRpbC9JbXBsZW1lbnRlZE1ldGhvZHMuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvdXRpbC9JbXBsZW1lbnRlZE1ldGhvZHMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTksIDIwMDgsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTksIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDE3ICsyNSwxOSBAQAogCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0LnV0aWw7CiAKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKwogaW1wb3J0IGNvbS5zdW4uamF2YWRvYy4qOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0LkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLio7CiAKIC8qKgogICogRm9yIGEgZ2l2ZW4gY2xhc3MgbWV0aG9kLCBidWlsZCBhbiBhcnJheSBvZiBpbnRlcmZhY2UgbWV0aG9kcyB3aGljaCBpdAogICogaW1wbGVtZW50cy4KICAqCi0gKiBUaGlzIGNvZGUgaXMgbm90IHBhcnQgb2YgYW4gQVBJLgotICogSXQgaXMgaW1wbGVtZW50YXRpb24gdGhhdCBpcyBzdWJqZWN0IHRvIGNoYW5nZS4KLSAqIERvIG5vdCB1c2UgaXQgYXMgYW4gQVBJCisgKiAgPHA+PGI+VGhpcyBpcyBOT1QgcGFydCBvZiBhbnkgc3VwcG9ydGVkIEFQSS4KKyAqICBJZiB5b3Ugd3JpdGUgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhpcywgeW91IGRvIHNvIGF0IHlvdXIgb3duIHJpc2suCisgKiAgVGhpcyBjb2RlIGFuZCBpdHMgaW50ZXJuYWwgaW50ZXJmYWNlcyBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugb3IKKyAqICBkZWxldGlvbiB3aXRob3V0IG5vdGljZS48L2I+CiAgKgogICogQGF1dGhvciBBdHVsIE0gRGFtYmFsa2FyCiAgKi8KZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC91dGlsL0luZGV4QnVpbGRlci5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L3V0aWwvSW5kZXhCdWlsZGVyLmphdmEKaW5kZXggN2U2MjcyMi4uZTY5NTgyMSAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L3V0aWwvSW5kZXhCdWlsZGVyLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L3V0aWwvSW5kZXhCdWlsZGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDExLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwxOSArMjUsMjEgQEAKIAogcGFja2FnZSBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC51dGlsOwogCi1pbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQuKjsKLWltcG9ydCBjb20uc3VuLmphdmFkb2MuKjsKIGltcG9ydCBqYXZhLnV0aWwuKjsKIAoraW1wb3J0IGNvbS5zdW4uamF2YWRvYy4qOworaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0Lio7CisKIC8qKgogICogQnVpbGQgdGhlIG1hcHBpbmcgb2YgZWFjaCBVbmljb2RlIGNoYXJhY3RlciB3aXRoIGl0J3MgbWVtYmVyIGxpc3RzCiAgKiBjb250YWluaW5nIG1lbWJlcnMgbmFtZXMgc3RhcnRpbmcgd2l0aCBpdC4gQWxzbyBidWlsZCBhIGxpc3QgZm9yIGFsbCB0aGUKICAqIFVuaWNvZGUgY2hhcmFjdGVycyB3aGljaCBzdGFydCBhIG1lbWJlciBuYW1lLiBNZW1iZXIgbmFtZSBpcwogICogY2xhc3NraW5kIG9yIGZpZWxkIG9yIG1ldGhvZCBvciBjb25zdHJ1Y3RvciBuYW1lLgogICoKLSAqIFRoaXMgY29kZSBpcyBub3QgcGFydCBvZiBhbiBBUEkuCi0gKiBJdCBpcyBpbXBsZW1lbnRhdGlvbiB0aGF0IGlzIHN1YmplY3QgdG8gY2hhbmdlLgotICogRG8gbm90IHVzZSBpdCBhcyBhbiBBUEkKKyAqICA8cD48Yj5UaGlzIGlzIE5PVCBwYXJ0IG9mIGFueSBzdXBwb3J0ZWQgQVBJLgorICogIElmIHlvdSB3cml0ZSBjb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGlzLCB5b3UgZG8gc28gYXQgeW91ciBvd24gcmlzay4KKyAqICBUaGlzIGNvZGUgYW5kIGl0cyBpbnRlcm5hbCBpbnRlcmZhY2VzIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSBvcgorICogIGRlbGV0aW9uIHdpdGhvdXQgbm90aWNlLjwvYj4KICAqCiAgKiBAc2luY2UgMS4yCiAgKiBAc2VlIGphdmEubGFuZy5DaGFyYWN0ZXIKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC91dGlsL01lc3NhZ2VSZXRyaWV2ZXIuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC91dGlsL01lc3NhZ2VSZXRyaWV2ZXIuamF2YQppbmRleCA3ZTI2NGM4Li5kNzYxY2ZlIDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvdXRpbC9NZXNzYWdlUmV0cmlldmVyLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L3V0aWwvTWVzc2FnZVJldHJpZXZlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAwOSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjQsMTggKzI0LDIwIEBACiAgKi8KIHBhY2thZ2UgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQudXRpbDsKIAoraW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC4qOworCiBpbXBvcnQgY29tLnN1bi5qYXZhZG9jLio7CiBpbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQuQ29uZmlndXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKIAogCiAvKioKICAqIFJldHJpZXZlIGFuZCBmb3JtYXQgbWVzc2FnZXMgc3RvcmVkIGluIGEgcmVzb3VyY2UuCiAgKgotICogVGhpcyBjb2RlIGlzIG5vdCBwYXJ0IG9mIGFuIEFQSS4KLSAqIEl0IGlzIGltcGxlbWVudGF0aW9uIHRoYXQgaXMgc3ViamVjdCB0byBjaGFuZ2UuCi0gKiBEbyBub3QgdXNlIGl0IGFzIGFuIEFQSQorICogIDxwPjxiPlRoaXMgaXMgTk9UIHBhcnQgb2YgYW55IHN1cHBvcnRlZCBBUEkuCisgKiAgSWYgeW91IHdyaXRlIGNvZGUgdGhhdCBkZXBlbmRzIG9uIHRoaXMsIHlvdSBkbyBzbyBhdCB5b3VyIG93biByaXNrLgorICogIFRoaXMgY29kZSBhbmQgaXRzIGludGVybmFsIGludGVyZmFjZXMgYXJlIHN1YmplY3QgdG8gY2hhbmdlIG9yCisgKiAgZGVsZXRpb24gd2l0aG91dCBub3RpY2UuPC9iPgogICoKICAqIEBzaW5jZSAxLjIKICAqIEBhdXRob3IgQXR1bCBNIERhbWJhbGthcgpkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L3V0aWwvTWV0YUtleXdvcmRzLmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvdXRpbC9NZXRhS2V5d29yZHMuamF2YQppbmRleCBlOWZkNjFlLi4yZjgxNDI1IDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvdXRpbC9NZXRhS2V5d29yZHMuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvdXRpbC9NZXRhS2V5d29yZHMuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDgsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDE5ICsyNSwyMSBAQAogCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0LnV0aWw7CiAKLWltcG9ydCBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC4qOwotaW1wb3J0IGNvbS5zdW4uamF2YWRvYy4qOwogaW1wb3J0IGphdmEudXRpbC4qOwogCitpbXBvcnQgY29tLnN1bi5qYXZhZG9jLio7CitpbXBvcnQgY29tLnN1bi50b29scy5kb2NsZXRzLmludGVybmFsLnRvb2xraXQuKjsKKwogLyoqCiAgKiBQcm92aWRlcyBtZXRob2RzIGZvciBjcmVhdGluZyBhbiBhcnJheSBvZiBjbGFzcywgbWV0aG9kIGFuZAogICogZmllbGQgbmFtZXMgdG8gYmUgaW5jbHVkZWQgYXMgbWV0YSBrZXl3b3JkcyBpbiB0aGUgSFRNTCBoZWFkZXIKICAqIG9mIGNsYXNzIHBhZ2VzLiAgVGhlc2Uga2V5d29yZHMgaW1wcm92ZSBzZWFyY2ggcmVzdWx0cwogICogb24gYnJvd3NlcnMgdGhhdCBsb29rIGZvciBrZXl3b3Jkcy4KICAqCi0gKiBUaGlzIGNvZGUgaXMgbm90IHBhcnQgb2YgYW4gQVBJLgotICogSXQgaXMgaW1wbGVtZW50YXRpb24gdGhhdCBpcyBzdWJqZWN0IHRvIGNoYW5nZS4KLSAqIERvIG5vdCB1c2UgaXQgYXMgYW4gQVBJCisgKiAgPHA+PGI+VGhpcyBpcyBOT1QgcGFydCBvZiBhbnkgc3VwcG9ydGVkIEFQSS4KKyAqICBJZiB5b3Ugd3JpdGUgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhpcywgeW91IGRvIHNvIGF0IHlvdXIgb3duIHJpc2suCisgKiAgVGhpcyBjb2RlIGFuZCBpdHMgaW50ZXJuYWwgaW50ZXJmYWNlcyBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugb3IKKyAqICBkZWxldGlvbiB3aXRob3V0IG5vdGljZS48L2I+CiAgKgogICogQGF1dGhvciBEb3VnIEtyYW1lcgogICovCmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvdXRpbC9NZXRob2RGaW5kZXIuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC91dGlsL01ldGhvZEZpbmRlci5qYXZhCmluZGV4IGExOWU4YzEuLjY4ZTA4MjcgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC91dGlsL01ldGhvZEZpbmRlci5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC91dGlsL01ldGhvZEZpbmRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMTk5OSwgMjAwNCwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5OSwgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMzMsOSArMzMsMTAgQEAKICAqIHN1cGVyY2xhc3NlcyBhbmQgaW50ZXJmYWNlcyhzdWJzZXF1ZW50bHkgc3VwZXItaW50ZXJmYWNlcyBhbHNvKQogICogcmVjdXJzaXZlbHkuCiAgKgotICogVGhpcyBjb2RlIGlzIG5vdCBwYXJ0IG9mIGFuIEFQSS4KLSAqIEl0IGlzIGltcGxlbWVudGF0aW9uIHRoYXQgaXMgc3ViamVjdCB0byBjaGFuZ2UuCi0gKiBEbyBub3QgdXNlIGl0IGFzIGFuIEFQSS4KKyAqICA8cD48Yj5UaGlzIGlzIE5PVCBwYXJ0IG9mIGFueSBzdXBwb3J0ZWQgQVBJLgorICogIElmIHlvdSB3cml0ZSBjb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGlzLCB5b3UgZG8gc28gYXQgeW91ciBvd24gcmlzay4KKyAqICBUaGlzIGNvZGUgYW5kIGl0cyBpbnRlcm5hbCBpbnRlcmZhY2VzIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSBvcgorICogIGRlbGV0aW9uIHdpdGhvdXQgbm90aWNlLjwvYj4KICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIE1ldGhvZEZpbmRlciB7CiAKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC91dGlsL1BhY2thZ2VMaXN0V3JpdGVyLmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvdXRpbC9QYWNrYWdlTGlzdFdyaXRlci5qYXZhCmluZGV4IGEzMmYwNDguLjQ1ODZkZWUgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC91dGlsL1BhY2thZ2VMaXN0V3JpdGVyLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L3V0aWwvUGFja2FnZUxpc3RXcml0ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMTEsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDE3ICsyNSwxOSBAQAogCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0LnV0aWw7CiAKLWltcG9ydCBjb20uc3VuLnRvb2xzLmRvY2xldHMuaW50ZXJuYWwudG9vbGtpdC4qOwotaW1wb3J0IGNvbS5zdW4uamF2YWRvYy4qOwogaW1wb3J0IGphdmEuaW8uKjsKIGltcG9ydCBqYXZhLnV0aWwuKjsKIAoraW1wb3J0IGNvbS5zdW4uamF2YWRvYy4qOworaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0Lio7CisKIC8qKgogICogV3JpdGUgb3V0IHRoZSBwYWNrYWdlIGluZGV4LgogICoKLSAqIFRoaXMgY29kZSBpcyBub3QgcGFydCBvZiBhbiBBUEkuCi0gKiBJdCBpcyBpbXBsZW1lbnRhdGlvbiB0aGF0IGlzIHN1YmplY3QgdG8gY2hhbmdlLgotICogRG8gbm90IHVzZSBpdCBhcyBhbiBBUEkKKyAqICA8cD48Yj5UaGlzIGlzIE5PVCBwYXJ0IG9mIGFueSBzdXBwb3J0ZWQgQVBJLgorICogIElmIHlvdSB3cml0ZSBjb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGlzLCB5b3UgZG8gc28gYXQgeW91ciBvd24gcmlzay4KKyAqICBUaGlzIGNvZGUgYW5kIGl0cyBpbnRlcm5hbCBpbnRlcmZhY2VzIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSBvcgorICogIGRlbGV0aW9uIHdpdGhvdXQgbm90aWNlLjwvYj4KICAqCiAgKiBAc2VlIGNvbS5zdW4uamF2YWRvYy5QYWNrYWdlRG9jCiAgKiBAYXV0aG9yIEF0dWwgTSBEYW1iYWxrYXIKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC91dGlsL1RhZ2dlZE1ldGhvZEZpbmRlci5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L3V0aWwvVGFnZ2VkTWV0aG9kRmluZGVyLmphdmEKaW5kZXggZTRjN2ZiYy4uMjg1NGI0OSAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L3V0aWwvVGFnZ2VkTWV0aG9kRmluZGVyLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L3V0aWwvVGFnZ2VkTWV0aG9kRmluZGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAxOTk5LCAyMDAzLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk5LCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0zMCw5ICszMCwxMCBAQAogLyoqCiAgKiBGaW5kIGEgdGFnZ2VkIG1ldGhvZC4KICAqCi0gKiBUaGlzIGNvZGUgaXMgbm90IHBhcnQgb2YgYW4gQVBJLgotICogSXQgaXMgaW1wbGVtZW50YXRpb24gdGhhdCBpcyBzdWJqZWN0IHRvIGNoYW5nZS4KLSAqIERvIG5vdCB1c2UgaXQgYXMgYW4gQVBJCisgKiAgPHA+PGI+VGhpcyBpcyBOT1QgcGFydCBvZiBhbnkgc3VwcG9ydGVkIEFQSS4KKyAqICBJZiB5b3Ugd3JpdGUgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhpcywgeW91IGRvIHNvIGF0IHlvdXIgb3duIHJpc2suCisgKiAgVGhpcyBjb2RlIGFuZCBpdHMgaW50ZXJuYWwgaW50ZXJmYWNlcyBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugb3IKKyAqICBkZWxldGlvbiB3aXRob3V0IG5vdGljZS48L2I+CiAgKgogICogQGF1dGhvciBBdHVsIE0gRGFtYmFsa2FyCiAgKi8KZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC91dGlsL1RleHRUYWcuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC91dGlsL1RleHRUYWcuamF2YQppbmRleCBhOWUyYWEwLi4wNzQ3MThmIDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvdXRpbC9UZXh0VGFnLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L3V0aWwvVGV4dFRhZy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMywgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMzAsOSArMzAsMTAgQEAKICAqIEEgdGFnIHRoYXQgaG9sZHMgbm90aGluZyBidXQgcGxhaW4gdGV4dC4gIFRoaXMgaXMgdXNlZnVsIGZvciBwYXNzaW5nCiAgKiB0ZXh0IHRvIG1ldGhvZHMgdGhhdCBvbmx5IGFjY2VwdCBpbmxpbmUgdGFncyBhcyBhIHBhcmFtZXRlci4KICAqCi0gKiBUaGlzIGNvZGUgaXMgbm90IHBhcnQgb2YgYW4gQVBJLgotICogSXQgaXMgaW1wbGVtZW50YXRpb24gdGhhdCBpcyBzdWJqZWN0IHRvIGNoYW5nZS4KLSAqIERvIG5vdCB1c2UgaXQgYXMgYW4gQVBJCisgKiAgPHA+PGI+VGhpcyBpcyBOT1QgcGFydCBvZiBhbnkgc3VwcG9ydGVkIEFQSS4KKyAqICBJZiB5b3Ugd3JpdGUgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhpcywgeW91IGRvIHNvIGF0IHlvdXIgb3duIHJpc2suCisgKiAgVGhpcyBjb2RlIGFuZCBpdHMgaW50ZXJuYWwgaW50ZXJmYWNlcyBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugb3IKKyAqICBkZWxldGlvbiB3aXRob3V0IG5vdGljZS48L2I+CiAgKgogICogQGF1dGhvciBKYW1pZSBIbwogICogQHNpbmNlIDEuNQpkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L3V0aWwvVXRpbC5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L3V0aWwvVXRpbC5qYXZhCmluZGV4IDI1YjhkYjkuLmMwMWFjM2UgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC91dGlsL1V0aWwuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvdXRpbC9VdGlsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAxOTk5LCAyMDExLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk5LCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0zNCw5ICszNCwxMCBAQAogLyoqCiAgKiBVdGlsaXRpZXMgQ2xhc3MgZm9yIERvY2xldHMuCiAgKgotICogVGhpcyBjb2RlIGlzIG5vdCBwYXJ0IG9mIGFuIEFQSS4KLSAqIEl0IGlzIGltcGxlbWVudGF0aW9uIHRoYXQgaXMgc3ViamVjdCB0byBjaGFuZ2UuCi0gKiBEbyBub3QgdXNlIGl0IGFzIGFuIEFQSQorICogIDxwPjxiPlRoaXMgaXMgTk9UIHBhcnQgb2YgYW55IHN1cHBvcnRlZCBBUEkuCisgKiAgSWYgeW91IHdyaXRlIGNvZGUgdGhhdCBkZXBlbmRzIG9uIHRoaXMsIHlvdSBkbyBzbyBhdCB5b3VyIG93biByaXNrLgorICogIFRoaXMgY29kZSBhbmQgaXRzIGludGVybmFsIGludGVyZmFjZXMgYXJlIHN1YmplY3QgdG8gY2hhbmdlIG9yCisgKiAgZGVsZXRpb24gd2l0aG91dCBub3RpY2UuPC9iPgogICoKICAqIEBhdXRob3IgQXR1bCBNIERhbWJhbGthcgogICogQGF1dGhvciBKYW1pZSBIbwpAQCAtMzY2LDcgKzM2NywxMyBAQAogICAgICAgICAgICAgICAgICAgICB3aGlsZSgobiA9IGluLnJlYWQoYnVmKSk+MCkgb3V0LndyaXRlKGJ1ZiwwLG4pOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW4pKTsKLSAgICAgICAgICAgICAgICAgICAgQnVmZmVyZWRXcml0ZXIgd3JpdGVyID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0KSk7CisgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcmVkV3JpdGVyIHdyaXRlcjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24uZG9jZW5jb2RpbmcgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0KSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbi5kb2NlbmNvZGluZykpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGluZTsKICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgobGluZSA9IHJlYWRlci5yZWFkTGluZSgpKSAhPSBudWxsKSB7CkBAIC02NDMsOSArNjUwLDkgQEAKICAgICAgICAgICAgIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGVuYW1lKTsKICAgICAgICAgfQogICAgICAgICBpZiAoZG9jZW5jb2RpbmcgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoZm9zKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihmb3MpKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKGZvcywgZG9jZW5jb2RpbmcpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKGZvcywgZG9jZW5jb2RpbmcpKTsKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L3V0aWwvVmlzaWJsZU1lbWJlck1hcC5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L3V0aWwvVmlzaWJsZU1lbWJlck1hcC5qYXZhCmluZGV4IDRkODhhN2UuLmU4MDA0YzEgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC91dGlsL1Zpc2libGVNZW1iZXJNYXAuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvdXRpbC9WaXNpYmxlTWVtYmVyTWFwLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAxOTk5LCAyMDA4LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk5LCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSw5ICsyNSwxMCBAQAogCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0LnV0aWw7CiAKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKwogaW1wb3J0IGNvbS5zdW4uamF2YWRvYy4qOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuZG9jbGV0cy5pbnRlcm5hbC50b29sa2l0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7CiAKIC8qKgogICogQSBkYXRhIHN0cnVjdHVyZSB0aGF0IGVuY2Fwc3VsYXRlcyB0aGUgdmlzaWJsZSBtZW1iZXJzIG9mIGEgcGFydGljdWxhcgpAQCAtMzYsOSArMzcsMTAgQEAKICAqIG9yIG1ldGhvZCkgYW5kIHRoZSBsZWFmIG9mIHRoZSBjbGFzcyB0cmVlLiAgVGhlIGRhdGEgc3RydWN0dXJlIHdpbGwgbWFwCiAgKiBhbGwgdmlzaWJsZSBtZW1iZXJzIGluIHRoZSBsZWFmIGFuZCBjbGFzc2VzIGFib3ZlIHRoZSBsZWFmIGluIHRoZSB0cmVlLgogICoKLSAqIFRoaXMgY29kZSBpcyBub3QgcGFydCBvZiBhbiBBUEkuCi0gKiBJdCBpcyBpbXBsZW1lbnRhdGlvbiB0aGF0IGlzIHN1YmplY3QgdG8gY2hhbmdlLgotICogRG8gbm90IHVzZSBpdCBhcyBhbiBBUEkKKyAqICA8cD48Yj5UaGlzIGlzIE5PVCBwYXJ0IG9mIGFueSBzdXBwb3J0ZWQgQVBJLgorICogIElmIHlvdSB3cml0ZSBjb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGlzLCB5b3UgZG8gc28gYXQgeW91ciBvd24gcmlzay4KKyAqICBUaGlzIGNvZGUgYW5kIGl0cyBpbnRlcm5hbCBpbnRlcmZhY2VzIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSBvcgorICogIGRlbGV0aW9uIHdpdGhvdXQgbm90aWNlLjwvYj4KICAqCiAgKiBAYXV0aG9yIEF0dWwgTSBEYW1iYWxrYXIKICAqIEBhdXRob3IgSmFtaWUgSG8gKHJld3JpdGUpCkBAIC0xMjUsNyArMTI3LDcgQEAKICAgICAgKiBSZXR1cm4gdGhlIHBhY2thZ2UgcHJpdmF0ZSBtZW1iZXJzIGluaGVyaXRlZCBieSB0aGUgY2xhc3MuICBPbmx5IHJldHVybgogICAgICAqIGlmIHBhcmVudCBpcyBwYWNrYWdlIHByaXZhdGUgYW5kIG5vdCBkb2N1bWVudGVkLgogICAgICAqCi0gICAgICogQHBhcmFtIGNvbmZpZ3VhdGlvbiB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uIG9mIHRoZSBkb2NsZXQuCisgICAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiBvZiB0aGUgZG9jbGV0LgogICAgICAqIEByZXR1cm4gdGhlIHBhY2thZ2UgcHJpdmF0ZSBtZW1iZXJzIGluaGVyaXRlZCBieSB0aGUgY2xhc3MuCiAgICAgICovCiAgICAgcHJpdmF0ZSBMaXN0PFByb2dyYW1FbGVtZW50RG9jPiBnZXRJbmhlcml0ZWRQYWNrYWdlUHJpdmF0ZU1ldGhvZHMoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7CkBAIC0xNDgsNyArMTUwLDcgQEAKICAgICAgKiBlbmQgb2YgdGhlIGxpc3QgbWVtYmVycyB0aGF0IGFyZSBpbmhlcml0ZWQgYnkgaW5hY2Nlc3NpYmxlIHBhcmVudHMuIFdlCiAgICAgICogZG9jdW1lbnQgdGhlc2UgbWVtYmVycyBpbiB0aGUgY2hpbGQgYmVjYXVzZSB0aGUgcGFyZW50IGlzIG5vdCBkb2N1bWVudGVkLgogICAgICAqCi0gICAgICogQHBhcmFtIGNvbmZpZ3VhdGlvbiB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uIG9mIHRoZSBkb2NsZXQuCisgICAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiBvZiB0aGUgZG9jbGV0LgogICAgICAqLwogICAgIHB1YmxpYyBMaXN0PFByb2dyYW1FbGVtZW50RG9jPiBnZXRMZWFmQ2xhc3NNZW1iZXJzKENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgewogICAgICAgICBMaXN0PFByb2dyYW1FbGVtZW50RG9jPiByZXN1bHQgPSBnZXRNZW1iZXJzRm9yKGNsYXNzZG9jKTsKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC91dGlsL2xpbmtzL0xpbmtGYWN0b3J5LmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvdXRpbC9saW5rcy9MaW5rRmFjdG9yeS5qYXZhCmluZGV4IDM3ODU1YWUuLmU5NTM5YTQgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC91dGlsL2xpbmtzL0xpbmtGYWN0b3J5LmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L3V0aWwvbGlua3MvTGlua0ZhY3RvcnkuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDgsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTMwLDYgKzMwLDExIEBACiAvKioKICAqIEEgZmFjdG9yeSB0aGF0IGNvbnN0cnVjdHMgbGlua3MgZnJvbSBnaXZlbiBsaW5rIGluZm9ybWF0aW9uLgogICoKKyAqICA8cD48Yj5UaGlzIGlzIE5PVCBwYXJ0IG9mIGFueSBzdXBwb3J0ZWQgQVBJLgorICogIElmIHlvdSB3cml0ZSBjb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGlzLCB5b3UgZG8gc28gYXQgeW91ciBvd24gcmlzay4KKyAqICBUaGlzIGNvZGUgYW5kIGl0cyBpbnRlcm5hbCBpbnRlcmZhY2VzIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSBvcgorICogIGRlbGV0aW9uIHdpdGhvdXQgbm90aWNlLjwvYj4KKyAqCiAgKiBAYXV0aG9yIEphbWllIEhvCiAgKiBAc2luY2UgMS41CiAgKi8KZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC91dGlsL2xpbmtzL0xpbmtJbmZvLmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvdXRpbC9saW5rcy9MaW5rSW5mby5qYXZhCmluZGV4IDRlMzUxN2QuLjUzYWNkZDUgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC91dGlsL2xpbmtzL0xpbmtJbmZvLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L3V0aWwvbGlua3MvTGlua0luZm8uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTMxLDYgKzMxLDExIEBACiAvKioKICAqIEVuY2Fwc3VsYXRlcyBpbmZvcm1hdGlvbiBhYm91dCBhIGxpbmsuCiAgKgorICogIDxwPjxiPlRoaXMgaXMgTk9UIHBhcnQgb2YgYW55IHN1cHBvcnRlZCBBUEkuCisgKiAgSWYgeW91IHdyaXRlIGNvZGUgdGhhdCBkZXBlbmRzIG9uIHRoaXMsIHlvdSBkbyBzbyBhdCB5b3VyIG93biByaXNrLgorICogIFRoaXMgY29kZSBhbmQgaXRzIGludGVybmFsIGludGVyZmFjZXMgYXJlIHN1YmplY3QgdG8gY2hhbmdlIG9yCisgKiAgZGVsZXRpb24gd2l0aG91dCBub3RpY2UuPC9iPgorICoKICAqIEBhdXRob3IgSmFtaWUgSG8KICAqIEBzaW5jZSAxLjUKICAqLwpkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L3V0aWwvbGlua3MvTGlua091dHB1dC5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvZG9jbGV0cy9pbnRlcm5hbC90b29sa2l0L3V0aWwvbGlua3MvTGlua091dHB1dC5qYXZhCmluZGV4IDE1NmEwMDkuLmNiNThhZTQgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2RvY2xldHMvaW50ZXJuYWwvdG9vbGtpdC91dGlsL2xpbmtzL0xpbmtPdXRwdXQuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9kb2NsZXRzL2ludGVybmFsL3Rvb2xraXQvdXRpbC9saW5rcy9MaW5rT3V0cHV0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yOCw2ICsyOCwxMSBAQAogLyoqCiAgKiBTdG9yZXMgb3V0cHV0IG9mIGEgbGluay4KICAqCisgKiAgPHA+PGI+VGhpcyBpcyBOT1QgcGFydCBvZiBhbnkgc3VwcG9ydGVkIEFQSS4KKyAqICBJZiB5b3Ugd3JpdGUgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhpcywgeW91IGRvIHNvIGF0IHlvdXIgb3duIHJpc2suCisgKiAgVGhpcyBjb2RlIGFuZCBpdHMgaW50ZXJuYWwgaW50ZXJmYWNlcyBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugb3IKKyAqICBkZWxldGlvbiB3aXRob3V0IG5vdGljZS48L2I+CisgKgogICogQGF1dGhvciBKYW1pZSBIbwogICogQHNpbmNlIDEuNQogICovCmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy9hcGkvQmFzaWNKYXZhY1Rhc2suamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL2FwaS9CYXNpY0phdmFjVGFzay5qYXZhCmluZGV4IDAxODM4ZTkuLmU0ODU4MDQgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL2FwaS9CYXNpY0phdmFjVGFzay5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL2FwaS9CYXNpY0phdmFjVGFzay5qYXZhCkBAIC0yNiw2ICsyNiw3IEBACiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuamF2YWMuYXBpOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwogCiBpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5wcm9jZXNzaW5nLlByb2Nlc3NvcjsKQEAgLTQzLDcgKzQ0LDYgQEAKIGltcG9ydCBjb20uc3VuLnRvb2xzLmphdmFjLm1vZGVsLkphdmFjVHlwZXM7CiBpbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy50cmVlLkpDVHJlZTsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmphdmFjLnV0aWwuQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIAogLyoqCiAgKiBQcm92aWRlcyBiYXNpYyBmdW5jdGlvbmFsaXR5IGZvciBpbXBsZW1lbnRhdGlvbnMgb2YgSmF2YWNUYXNrLgpkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvYXBpL0RpYWdub3N0aWNGb3JtYXR0ZXIuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL2FwaS9EaWFnbm9zdGljRm9ybWF0dGVyLmphdmEKaW5kZXggMThhYWZlZS4uZmFiMGFkYSAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvYXBpL0RpYWdub3N0aWNGb3JtYXR0ZXIuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy9hcGkvRGlhZ25vc3RpY0Zvcm1hdHRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMTM4LDcgKzEzOCw3IEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBDb25maWd1cmUgdGhlIHNldCBvZiBkaWFnbm9zdGljIHBhcnRzIHRoYXQgc2hvdWxkIGJlIGRpc3BsYXllZAogICAgICAgICAgKiBieSB0aGUgZm9ybWF0dGVyLgotICAgICAgICAgKiBAcGFyYW0gb3B0aW9ucyBvcHRpb25zIHRvIHNldAorICAgICAgICAgKiBAcGFyYW0gdmlzaWJsZVBhcnRzIHRoZSBwYXJ0cyB0byBiZSBzZXQKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyB2b2lkIHNldFZpc2libGUoU2V0PERpYWdub3N0aWNQYXJ0PiB2aXNpYmxlUGFydHMpOwogCmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy9hcGkvSmF2YWNUb29sLmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy9hcGkvSmF2YWNUb29sLmphdmEKaW5kZXggMGJlODJmYi4uMGE3YTQ2MSAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvYXBpL0phdmFjVG9vbC5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL2FwaS9KYXZhY1Rvb2wuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTEsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTY2LDcgKzY2LDcgQEAKICAgICAgKiBDb25zdHJ1Y3RvciB1c2VkIGJ5IHNlcnZpY2UgcHJvdmlkZXIgbWVjaGFuaXNtLiAgVGhlIHJlY29tbWVuZGVkIHdheSB0bwogICAgICAqIG9idGFpbiBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGlzIGJ5IHVzaW5nIHtAbGluayAjY3JlYXRlfSBvciB0aGUKICAgICAgKiBzZXJ2aWNlIHByb3ZpZGVyIG1lY2hhbmlzbS4KLSAgICAgKiBAc2VlIGphdmF4LnRvb2xzLkphdmFDb21waWxlclRvb2wKKyAgICAgKiBAc2VlIGphdmF4LnRvb2xzLkphdmFDb21waWxlcgogICAgICAqIEBzZWUgamF2YXgudG9vbHMuVG9vbFByb3ZpZGVyCiAgICAgICogQHNlZSAjY3JlYXRlCiAgICAgICovCmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy9hcGkvSmF2YWNUcmVlcy5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvYXBpL0phdmFjVHJlZXMuamF2YQppbmRleCBjNDQ2ZTBhLi4xNzRiM2ZmIDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy9hcGkvSmF2YWNUcmVlcy5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL2FwaS9KYXZhY1RyZWVzLmphdmEKQEAgLTYwLDggKzYwLDggQEAKIGltcG9ydCBjb20uc3VuLnRvb2xzLmphdmFjLmNvbXAuTWVtYmVyRW50ZXI7CiBpbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy5jb21wLlJlc29sdmU7CiBpbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy5tb2RlbC5KYXZhY0VsZW1lbnRzOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuamF2YWMudHJlZS5FbmRQb3NUYWJsZTsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmphdmFjLnByb2Nlc3NpbmcuSmF2YWNQcm9jZXNzaW5nRW52aXJvbm1lbnQ7CitpbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy50cmVlLkVuZFBvc1RhYmxlOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuamF2YWMudHJlZS5KQ1RyZWU7CiBpbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy50cmVlLkpDVHJlZS4qOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuamF2YWMudHJlZS5UcmVlQ29waWVyOwpkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvYXBpL1dyYXBwaW5nSmF2YUZpbGVNYW5hZ2VyLmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy9hcGkvV3JhcHBpbmdKYXZhRmlsZU1hbmFnZXIuamF2YQppbmRleCA0MWQ5ODc0Li4yNDcyODM0IDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy9hcGkvV3JhcHBpbmdKYXZhRmlsZU1hbmFnZXIuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy9hcGkvV3JhcHBpbmdKYXZhRmlsZU1hbmFnZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDgsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTMxLDggKzMxLDkgQEAKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZheC50b29scy5KYXZhRmlsZU9iamVjdC5LaW5kOworCiBpbXBvcnQgamF2YXgudG9vbHMuKjsKK2ltcG9ydCBqYXZheC50b29scy5KYXZhRmlsZU9iamVjdC5LaW5kOwogCiAvKioKICAqIFdyYXBzIGFsbCBjYWxscyB0byBhIGdpdmVuIGZpbGUgbWFuYWdlci4gIFN1YmNsYXNzZXMgb2YgdGhpcyBjbGFzcwpkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvY29kZS9Bbm5vdGF0aW9ucy5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvY29kZS9Bbm5vdGF0aW9ucy5qYXZhCmluZGV4IDQ4NmU5YjYuLjg0ZDkxMDggMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL2NvZGUvQW5ub3RhdGlvbnMuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy9jb2RlL0Fubm90YXRpb25zLmphdmEKQEAgLTI2LDE4ICsyNiwxOCBAQAogcGFja2FnZSBjb20uc3VuLnRvb2xzLmphdmFjLmNvZGU7CiAKIGltcG9ydCBqYXZhLnV0aWwuTWFwOworCiBpbXBvcnQgamF2YXgudG9vbHMuSmF2YUZpbGVPYmplY3Q7CiAKIGltcG9ydCBjb20uc3VuLnRvb2xzLmphdmFjLmNvbXAuQW5ub3RhdGU7CiBpbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy5jb21wLkF0dHJDb250ZXh0OwogaW1wb3J0IGNvbS5zdW4udG9vbHMuamF2YWMuY29tcC5FbnY7CitpbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy51dGlsLio7CiBpbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy51dGlsLkFzc2VydDsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmphdmFjLnV0aWwuTGlzdDsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmphdmFjLnV0aWwuTG9nOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuamF2YWMudXRpbC5QYWlyOwotCiBpbXBvcnQgc3RhdGljIGNvbS5zdW4udG9vbHMuamF2YWMuY29kZS5LaW5kcy5QQ0s7Ci1pbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy51dGlsLio7CiAKIC8qKgogICogQ29udGFpbmVyIGZvciBhbGwgYW5ub3RhdGlvbnMgKGF0dHJpYnV0ZXMgaW4gamF2YWMpIG9uIGEgU3ltYm9sLgpkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvY29kZS9EZWZlcnJlZExpbnRIYW5kbGVyLmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy9jb2RlL0RlZmVycmVkTGludEhhbmRsZXIuamF2YQppbmRleCAzZDhmMDBlLi4wMjI2ODFiIDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy9jb2RlL0RlZmVycmVkTGludEhhbmRsZXIuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy9jb2RlL0RlZmVycmVkTGludEhhbmRsZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTMwLDggKzMwLDggQEAKIAogaW1wb3J0IGNvbS5zdW4udG9vbHMuamF2YWMudXRpbC5Bc3NlcnQ7CiBpbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy51dGlsLkNvbnRleHQ7Ci1pbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy51dGlsLkxpc3RCdWZmZXI7CiBpbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy51dGlsLkpDRGlhZ25vc3RpYy5EaWFnbm9zdGljUG9zaXRpb247CitpbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy51dGlsLkxpc3RCdWZmZXI7CiAKIC8qKgogICoKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL2NvZGUvRmxhZ3MuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL2NvZGUvRmxhZ3MuamF2YQppbmRleCBmOWRmYzEzLi5kMTYwMTU3IDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy9jb2RlL0ZsYWdzLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvY29kZS9GbGFncy5qYXZhCkBAIC0yNSwxMCArMjUsMTEgQEAKIAogcGFja2FnZSBjb20uc3VuLnRvb2xzLmphdmFjLmNvZGU7CiAKLWltcG9ydCBqYXZhLnV0aWwuRW51bVNldDsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkVudW1TZXQ7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OworCiBpbXBvcnQgamF2YXgubGFuZy5tb2RlbC5lbGVtZW50Lk1vZGlmaWVyOwogCiAvKiogQWNjZXNzIGZsYWdzIGFuZCBvdGhlciBtb2RpZmllcnMgZm9yIEphdmEgY2xhc3NlcyBhbmQgbWVtYmVycy4KQEAgLTY2LDYgKzY3LDcgQEAKICAgICAgICAgaWYgKChtYXNrJk5BVElWRSkgIT0gMCkgZmxhZ3MuYWRkKEZsYWcuTkFUSVZFKTsKICAgICAgICAgaWYgKChtYXNrJklOVEVSRkFDRSkgIT0gMCkgZmxhZ3MuYWRkKEZsYWcuSU5URVJGQUNFKTsKICAgICAgICAgaWYgKChtYXNrJkFCU1RSQUNUKSAhPSAwKSBmbGFncy5hZGQoRmxhZy5BQlNUUkFDVCk7CisgICAgICAgIGlmICgobWFzayZERUZBVUxUKSAhPSAwKSBmbGFncy5hZGQoRmxhZy5ERUZBVUxUKTsKICAgICAgICAgaWYgKChtYXNrJlNUUklDVEZQKSAhPSAwKSBmbGFncy5hZGQoRmxhZy5TVFJJQ1RGUCk7CiAgICAgICAgIGlmICgobWFzayZCUklER0UpICE9IDApIGZsYWdzLmFkZChGbGFnLkJSSURHRSk7CiAgICAgICAgIGlmICgobWFzayZTWU5USEVUSUMpICE9IDApIGZsYWdzLmFkZChGbGFnLlNZTlRIRVRJQyk7CkBAIC0yNTEsNiArMjUzLDExIEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIENMQVNIID0gMUw8PDQyOwogCisgICAgLyoqCisgICAgICogRmxhZyB0aGF0IG1hcmtzIGVpdGhlciBhIGRlZmF1bHQgbWV0aG9kIG9yIGFuIGludGVyZmFjZSBjb250YWluaW5nIGRlZmF1bHQgbWV0aG9kcworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBERUZBVUxUID0gMUw8PDQzOworCiAgICAgLyoqIE1vZGlmaWVyIG1hc2tzLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50CkBAIC0yNjYsNyArMjczLDEwIEBACiAgICAgICAgIE1ldGhvZEZsYWdzICAgICAgICAgICA9IEFjY2Vzc0ZsYWdzIHwgQUJTVFJBQ1QgfCBTVEFUSUMgfCBOQVRJVkUgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTWU5DSFJPTklaRUQgfCBGSU5BTCB8IFNUUklDVEZQOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZwotICAgICAgICBMb2NhbFZhckZsYWdzICAgICAgICAgPSBGSU5BTCB8IFBBUkFNRVRFUjsKKyAgICAgICAgRXh0ZW5kZWRTdGFuZGFyZEZsYWdzICAgICAgID0gKGxvbmcpU3RhbmRhcmRGbGFncyB8IERFRkFVTFQsCisgICAgICAgIEludGVyZmFjZURlZmF1bHRNZXRob2RNYXNrICA9IEFCU1RSQUNUIHwgUFVCTElDIHwgU1RSSUNURlAgfCBTWU5DSFJPTklaRUQgfCBERUZBVUxULAorICAgICAgICBMb2NhbFZhckZsYWdzICAgICAgICAgICAgICAgPSBGSU5BTCB8IFBBUkFNRVRFUjsKKwogCiAgICAgcHVibGljIHN0YXRpYyBTZXQ8TW9kaWZpZXI+IGFzTW9kaWZpZXJTZXQobG9uZyBmbGFncykgewogICAgICAgICBTZXQ8TW9kaWZpZXI+IG1vZGlmaWVycyA9IG1vZGlmaWVyU2V0cy5nZXQoZmxhZ3MpOwpAQCAtMzE5LDYgKzMyOSw3IEBACiAgICAgICAgIE5BVElWRSgibmF0aXZlIiksCiAgICAgICAgIElOVEVSRkFDRSgiaW50ZXJmYWNlIiksCiAgICAgICAgIEFCU1RSQUNUKCJhYnN0cmFjdCIpLAorICAgICAgICBERUZBVUxUKCJkZWZhdWx0IiksCiAgICAgICAgIFNUUklDVEZQKCJzdHJpY3RmcCIpLAogICAgICAgICBCUklER0UoImJyaWRnZSIpLAogICAgICAgICBTWU5USEVUSUMoInN5bnRoZXRpYyIpLApkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvY29kZS9LaW5kcy5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvY29kZS9LaW5kcy5qYXZhCmluZGV4IDk0OTVkZGYuLmRjMGQ1MmYgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL2NvZGUvS2luZHMuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy9jb2RlL0tpbmRzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAxOTk5LCAyMDExLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk5LCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0zMSw5ICszMSw4IEBACiBpbXBvcnQgY29tLnN1bi5zb3VyY2UudHJlZS5NZW1iZXJSZWZlcmVuY2VUcmVlOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuamF2YWMuYXBpLkZvcm1hdHRhYmxlOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuamF2YWMuYXBpLk1lc3NhZ2VzOwotCi1pbXBvcnQgc3RhdGljIGNvbS5zdW4udG9vbHMuamF2YWMuY29kZS5UeXBlVGFncy4qOwogaW1wb3J0IHN0YXRpYyBjb20uc3VuLnRvb2xzLmphdmFjLmNvZGUuRmxhZ3MuKjsKK2ltcG9ydCBzdGF0aWMgY29tLnN1bi50b29scy5qYXZhYy5jb2RlLlR5cGVUYWdzLio7CiAKIC8qKiBJbnRlcm5hbCBzeW1ib2wga2luZHMsIHdoaWNoIGRpc3Rpbmd1aXNoIGJldHdlZW4gZWxlbWVudHMgb2YKICAqICBkaWZmZXJlbnQgc3ViY2xhc3NlcyBvZiBTeW1ib2wuIFN5bWJvbCBraW5kcyBhcmUgb3JnYW5pemVkIHNvIHRoZXkgY2FuIGJlCmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy9jb2RlL1ByaW50ZXIuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL2NvZGUvUHJpbnRlci5qYXZhCmluZGV4IDY0NDk1NWMuLjVkN2U0MzAgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL2NvZGUvUHJpbnRlci5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL2NvZGUvUHJpbnRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjgsMTggKzI4LDEzIEBACiBpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKIAogaW1wb3J0IGNvbS5zdW4udG9vbHMuamF2YWMuYXBpLk1lc3NhZ2VzOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuamF2YWMuY29kZS5UeXBlLio7CiBpbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy5jb2RlLlN5bWJvbC4qOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuamF2YWMuY29tcC5EZWZlcnJlZEF0dHIuRGVmZXJyZWRUeXBlOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuamF2YWMudHJlZS5KQ1RyZWU7Ci1pbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy50cmVlLlByZXR0eTsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmphdmFjLnV0aWwuQXNzZXJ0OworaW1wb3J0IGNvbS5zdW4udG9vbHMuamF2YWMuY29kZS5UeXBlLio7CiBpbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy51dGlsLkxpc3Q7CiBpbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy51dGlsLkxpc3RCdWZmZXI7Ci0KLWltcG9ydCBzdGF0aWMgY29tLnN1bi50b29scy5qYXZhYy5jb2RlLlR5cGVUYWdzLio7CiBpbXBvcnQgc3RhdGljIGNvbS5zdW4udG9vbHMuamF2YWMuY29kZS5Cb3VuZEtpbmQuKjsKIGltcG9ydCBzdGF0aWMgY29tLnN1bi50b29scy5qYXZhYy5jb2RlLkZsYWdzLio7CitpbXBvcnQgc3RhdGljIGNvbS5zdW4udG9vbHMuamF2YWMuY29kZS5UeXBlVGFncy4qOwogCiAvKioKICAqIEEgY29tYmluZWQgdHlwZS9zeW1ib2wgdmlzaXRvciBmb3IgZ2VuZXJhdGluZyBub24tdHJpdmlhbCBsb2NhbGl6ZWQgc3RyaW5nCkBAIC0xMjksNyArMTI0LDcgQEAKICAgICAvKioKICAgICAgKiBHZXQgYSBsb2NhbGl6ZWQgc3RyaW5nIHJlcHJlc2VuYXRpb24gZm9yIGEgZ2l2ZW4gdHlwZS4KICAgICAgKgotICAgICAqIEBwYXJhbSB0cyB0eXBlIHRvIGJlIGRpc3BsYXllZAorICAgICAqIEBwYXJhbSB0IHR5cGUgdG8gYmUgZGlzcGxheWVkCiAgICAgICogQHBhcmFtIGxvY2FsZSB0aGUgbG9jYWxlIGluIHdoaWNoIHRoZSBzdHJpbmcgaXMgdG8gYmUgcmVuZGVyZWQKICAgICAgKiBAcmV0dXJuIGxvY2FsaXplZCBzdHJpbmcgcmVwcmVzZW50YXRpb24KICAgICAgKi8KQEAgLTE0MCw3ICsxMzUsNyBAQAogICAgIC8qKgogICAgICAqIEdldCBhIGxvY2FsaXplZCBzdHJpbmcgcmVwcmVzZW5hdGlvbiBmb3IgYSBnaXZlbiBzeW1ib2wuCiAgICAgICoKLSAgICAgKiBAcGFyYW0gdHMgc3ltYm9sIHRvIGJlIGRpc3BsYXllZAorICAgICAqIEBwYXJhbSBzIHN5bWJvbCB0byBiZSBkaXNwbGF5ZWQKICAgICAgKiBAcGFyYW0gbG9jYWxlIHRoZSBsb2NhbGUgaW4gd2hpY2ggdGhlIHN0cmluZyBpcyB0byBiZSByZW5kZXJlZAogICAgICAqIEByZXR1cm4gbG9jYWxpemVkIHN0cmluZyByZXByZXNlbnRhdGlvbgogICAgICAqLwpAQCAtMTg3LDcgKzE4Miw3IEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHZpc2l0Q2xhc3NUeXBlKENsYXNzVHlwZSB0LCBMb2NhbGUgbG9jYWxlKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKICAgICAgICAgaWYgKHQuZ2V0RW5jbG9zaW5nVHlwZSgpLnRhZyA9PSBDTEFTUyAmJiB0LnRzeW0ub3duZXIua2luZCA9PSBLaW5kcy5UWVApIHsKICAgICAgICAgICAgIGJ1Zi5hcHBlbmQodmlzaXQodC5nZXRFbmNsb3NpbmdUeXBlKCksIGxvY2FsZSkpOwogICAgICAgICAgICAgYnVmLmFwcGVuZCgiLiIpOwpAQCAtMjE1LDcgKzIxMCw3IEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHZpc2l0V2lsZGNhcmRUeXBlKFdpbGRjYXJkVHlwZSB0LCBMb2NhbGUgbG9jYWxlKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBTdHJpbmdCdWlsZGVyIHMgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogICAgICAgICBzLmFwcGVuZCh0LmtpbmQpOwogICAgICAgICBpZiAodC5raW5kICE9IFVOQk9VTkQpIHsKICAgICAgICAgICAgIHMuYXBwZW5kKHZpc2l0KHQudHlwZSwgbG9jYWxlKSk7CkBAIC0yNTMsNyArMjQ4LDcgQEAKICAgICBwcm90ZWN0ZWQgU3RyaW5nIGNsYXNzTmFtZShDbGFzc1R5cGUgdCwgYm9vbGVhbiBsb25nZm9ybSwgTG9jYWxlIGxvY2FsZSkgewogICAgICAgICBTeW1ib2wgc3ltID0gdC50c3ltOwogICAgICAgICBpZiAoc3ltLm5hbWUubGVuZ3RoKCkgPT0gMCAmJiAoc3ltLmZsYWdzKCkgJiBDT01QT1VORCkgIT0gMCkgewotICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHMgPSBuZXcgU3RyaW5nQnVmZmVyKHZpc2l0KHQuc3VwZXJ0eXBlX2ZpZWxkLCBsb2NhbGUpKTsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgcyA9IG5ldyBTdHJpbmdCdWlsZGVyKHZpc2l0KHQuc3VwZXJ0eXBlX2ZpZWxkLCBsb2NhbGUpKTsKICAgICAgICAgICAgIGZvciAoTGlzdDxUeXBlPiBpcyA9IHQuaW50ZXJmYWNlc19maWVsZDsgaXMubm9uRW1wdHkoKTsgaXMgPSBpcy50YWlsKSB7CiAgICAgICAgICAgICAgICAgcy5hcHBlbmQoIiYiKTsKICAgICAgICAgICAgICAgICBzLmFwcGVuZCh2aXNpdChpcy5oZWFkLCBsb2NhbGUpKTsKQEAgLTI5Miw3ICsyODcsNyBAQAogICAgICAgICBpZiAoIXZhckFyZ3MpIHsKICAgICAgICAgICAgIHJldHVybiB2aXNpdFR5cGVzKGFyZ3MsIGxvY2FsZSk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWYgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogICAgICAgICAgICAgd2hpbGUgKGFyZ3MudGFpbC5ub25FbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCh2aXNpdChhcmdzLmhlYWQsIGxvY2FsZSkpOwogICAgICAgICAgICAgICAgIGFyZ3MgPSBhcmdzLnRhaWw7CmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy9jb2RlL1Njb3BlLmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy9jb2RlL1Njb3BlLmphdmEKaW5kZXggZGI5NjY0OS4uZTgxNTNkYSAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvY29kZS9TY29wZS5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL2NvZGUvU2NvcGUuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTksIDIwMTEsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTksIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDkgKzI1LDEwIEBACiAKIHBhY2thZ2UgY29tLnN1bi50b29scy5qYXZhYy5jb2RlOwogCi1pbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy51dGlsLio7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogCitpbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy51dGlsLio7CisKIC8qKiBBIHNjb3BlIHJlcHJlc2VudHMgYW4gYXJlYSBvZiB2aXNpYmlsaXR5IGluIGEgSmF2YSBwcm9ncmFtLiBUaGUKICAqICBTY29wZSBjbGFzcyBpcyBhIGNvbnRhaW5lciBmb3Igc3ltYm9scyB3aGljaCBwcm92aWRlcwogICogIGVmZmljaWVudCBhY2Nlc3MgdG8gc3ltYm9scyBnaXZlbiB0aGVpciBuYW1lcy4gU2NvcGVzIGFyZSBpbXBsZW1lbnRlZApkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvY29kZS9Tb3VyY2UuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL2NvZGUvU291cmNlLmphdmEKaW5kZXggZjgzODIzYS4uMDRhNTljZSAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvY29kZS9Tb3VyY2UuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy9jb2RlL1NvdXJjZS5qYXZhCkBAIC0yNiwxMiArMjYsMTIgQEAKIHBhY2thZ2UgY29tLnN1bi50b29scy5qYXZhYy5jb2RlOwogCiBpbXBvcnQgamF2YS51dGlsLio7CisKIGltcG9ydCBqYXZheC5sYW5nLm1vZGVsLlNvdXJjZVZlcnNpb247CiBpbXBvcnQgc3RhdGljIGphdmF4LmxhbmcubW9kZWwuU291cmNlVmVyc2lvbi4qOwogCi1pbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy51dGlsLio7CiBpbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy5qdm0uVGFyZ2V0OwotCitpbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy51dGlsLio7CiBpbXBvcnQgc3RhdGljIGNvbS5zdW4udG9vbHMuamF2YWMubWFpbi5PcHRpb24uKjsKIAogLyoqIFRoZSBzb3VyY2UgbGFuZ3VhZ2UgdmVyc2lvbiBhY2NlcHRlZC4KQEAgLTIwMyw2ICsyMDMsOSBAQAogICAgIHB1YmxpYyBib29sZWFuIGFsbG93TWV0aG9kUmVmZXJlbmNlcygpIHsKICAgICAgICAgcmV0dXJuIGNvbXBhcmVUbyhKREsxXzgpID49IDA7CiAgICAgfQorICAgIHB1YmxpYyBib29sZWFuIGFsbG93RGVmYXVsdE1ldGhvZHMoKSB7CisgICAgICAgIHJldHVybiBjb21wYXJlVG8oSkRLMV84KSA+PSAwOworICAgIH0KICAgICBwdWJsaWMgYm9vbGVhbiBhbGxvd0VmZmVjdGl2ZWx5RmluYWxJbklubmVyQ2xhc3NlcygpIHsKICAgICAgICAgcmV0dXJuIGNvbXBhcmVUbyhKREsxXzgpID49IDA7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvY29kZS9TeW1ib2wuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL2NvZGUvU3ltYm9sLmphdmEKaW5kZXggMDEwZDQ0MS4uMzI4Y2ZjZiAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvY29kZS9TeW1ib2wuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy9jb2RlL1N5bWJvbC5qYXZhCkBAIC0yNywxMSArMjcsMTAgQEAKIAogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGU7CisKIGltcG9ydCBqYXZheC5sYW5nLm1vZGVsLmVsZW1lbnQuKjsKIGltcG9ydCBqYXZheC50b29scy5KYXZhRmlsZU9iamVjdDsKIAotaW1wb3J0IGNvbS5zdW4udG9vbHMuamF2YWMudXRpbC4qOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuamF2YWMudXRpbC5OYW1lOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuamF2YWMuY29kZS5UeXBlLio7CiBpbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy5jb21wLkF0dHI7CiBpbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy5jb21wLkF0dHJDb250ZXh0OwpAQCAtMzksNyArMzgsOCBAQAogaW1wb3J0IGNvbS5zdW4udG9vbHMuamF2YWMuanZtLio7CiBpbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy5tb2RlbC4qOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuamF2YWMudHJlZS5KQ1RyZWU7Ci0KK2ltcG9ydCBjb20uc3VuLnRvb2xzLmphdmFjLnV0aWwuKjsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmphdmFjLnV0aWwuTmFtZTsKIGltcG9ydCBzdGF0aWMgY29tLnN1bi50b29scy5qYXZhYy5jb2RlLkZsYWdzLio7CiBpbXBvcnQgc3RhdGljIGNvbS5zdW4udG9vbHMuamF2YWMuY29kZS5LaW5kcy4qOwogaW1wb3J0IHN0YXRpYyBjb20uc3VuLnRvb2xzLmphdmFjLmNvZGUuVHlwZVRhZ3MuKjsKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL2NvZGUvU3ltdGFiLmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy9jb2RlL1N5bXRhYi5qYXZhCmluZGV4IGMwOWQzMWUuLjI5Y2U4NTkgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL2NvZGUvU3ltdGFiLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvY29kZS9TeW10YWIuamF2YQpAQCAtMjYsMTcgKzI2LDE3IEBACiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuamF2YWMuY29kZTsKIAogaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmF4LmxhbmcubW9kZWwudHlwZS5UeXBlVmlzaXRvcjsKLWltcG9ydCBqYXZheC5sYW5nLm1vZGVsLmVsZW1lbnQuRWxlbWVudFZpc2l0b3I7CiAKLWltcG9ydCBjb20uc3VuLnRvb2xzLmphdmFjLnV0aWwuKjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmphdmFjLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZheC5sYW5nLm1vZGVsLmVsZW1lbnQuRWxlbWVudFZpc2l0b3I7CitpbXBvcnQgamF2YXgubGFuZy5tb2RlbC50eXBlLlR5cGVWaXNpdG9yOworCiBpbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy5jb2RlLlN5bWJvbC4qOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuamF2YWMuY29kZS5UeXBlLio7CiBpbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy5qdm0uKjsKLQotaW1wb3J0IHN0YXRpYyBjb20uc3VuLnRvb2xzLmphdmFjLmp2bS5CeXRlQ29kZXMuKjsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmphdmFjLnV0aWwuKjsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmphdmFjLnV0aWwuTGlzdDsKIGltcG9ydCBzdGF0aWMgY29tLnN1bi50b29scy5qYXZhYy5jb2RlLkZsYWdzLio7CitpbXBvcnQgc3RhdGljIGNvbS5zdW4udG9vbHMuamF2YWMuanZtLkJ5dGVDb2Rlcy4qOwogCiAvKiogQSBjbGFzcyB0aGF0IGRlZmluZXMgYWxsIHByZWRlZmluZWQgY29uc3RhbnRzIGFuZCBvcGVyYXRvcnMKICAqICBhcyB3ZWxsIGFzIHNwZWNpYWwgY2xhc3NlcyBzdWNoIGFzIGphdmEubGFuZy5PYmplY3QsIHdoaWNoIG5lZWQKQEAgLTMwMSw3ICszMDEsNyBAQAogICAgIH0KIAogICAgIC8qKiBFbnRlciBhIGNsYXNzIGludG8gc3ltYm9sIHRhYmxlLgotICAgICAqICBAcGFyYW0gICAgVGhlIG5hbWUgb2YgdGhlIGNsYXNzLgorICAgICAqICBAcGFyYW0gcyBUaGUgbmFtZSBvZiB0aGUgY2xhc3MuCiAgICAgICovCiAgICAgcHJpdmF0ZSBUeXBlIGVudGVyQ2xhc3MoU3RyaW5nIHMpIHsKICAgICAgICAgcmV0dXJuIHJlYWRlci5lbnRlckNsYXNzKG5hbWVzLmZyb21TdHJpbmcocykpLnR5cGU7CmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy9jb2RlL1RhcmdldFR5cGUuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL2NvZGUvVGFyZ2V0VHlwZS5qYXZhCmluZGV4IDZjMjQyODcuLjU3M2Y2MjcgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL2NvZGUvVGFyZ2V0VHlwZS5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL2NvZGUvVGFyZ2V0VHlwZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMTEgKzI1LDExIEBACiAKIHBhY2thZ2UgY29tLnN1bi50b29scy5qYXZhYy5jb2RlOwogCi1pbXBvcnQgc3RhdGljIGNvbS5zdW4udG9vbHMuamF2YWMuY29kZS5UYXJnZXRUeXBlLlRhcmdldEF0dHJpYnV0ZS4qOwotCiBpbXBvcnQgamF2YS51dGlsLkVudW1TZXQ7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKIAoraW1wb3J0IHN0YXRpYyBjb20uc3VuLnRvb2xzLmphdmFjLmNvZGUuVGFyZ2V0VHlwZS5UYXJnZXRBdHRyaWJ1dGUuKjsKKwogLyoqCiAgKiBEZXNjcmliZXMgdGhlIHR5cGUgb2YgcHJvZ3JhbSBlbGVtZW50IGFuIGV4dGVuZGVkIGFubm90YXRpb24gKG9yIGV4dGVuZGVkCiAgKiBjb21wb3VuZCBhdHRyaWJ1dGUpIHRhcmdldHMuCmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy9jb2RlL1R5cGUuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL2NvZGUvVHlwZS5qYXZhCmluZGV4IGVlZmJmOTAuLjM2MmJiNDIgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL2NvZGUvVHlwZS5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL2NvZGUvVHlwZS5qYXZhCkBAIC0yNiwxMCArMjYsNiBAQAogcGFja2FnZSBjb20uc3VuLnRvb2xzLmphdmFjLmNvZGU7CiAKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLWltcG9ydCBjb20uc3VuLnRvb2xzLmphdmFjLmNvZGUuU3ltYm9sLio7Ci1pbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy51dGlsLio7Ci0KIGltcG9ydCBqYXZhLnV0aWwuRW51bU1hcDsKIGltcG9ydCBqYXZhLnV0aWwuRW51bVNldDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwpAQCAtMzcsNiArMzMsOCBAQAogCiBpbXBvcnQgamF2YXgubGFuZy5tb2RlbC50eXBlLio7CiAKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmphdmFjLmNvZGUuU3ltYm9sLio7CitpbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy51dGlsLio7CiBpbXBvcnQgc3RhdGljIGNvbS5zdW4udG9vbHMuamF2YWMuY29kZS5Cb3VuZEtpbmQuKjsKIGltcG9ydCBzdGF0aWMgY29tLnN1bi50b29scy5qYXZhYy5jb2RlLkZsYWdzLio7CiBpbXBvcnQgc3RhdGljIGNvbS5zdW4udG9vbHMuamF2YWMuY29kZS5LaW5kcy4qOwpkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvY29kZS9UeXBlVGFncy5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvY29kZS9UeXBlVGFncy5qYXZhCmluZGV4IGQ0NjI4NmEuLmFlY2Y5M2IgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL2NvZGUvVHlwZVRhZ3MuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy9jb2RlL1R5cGVUYWdzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAxOTk5LCAyMDA1LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk5LCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0xMDYsNyArMTA2LDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZFUlJFRCA9IEZPUkFMTCsxOwogCi0gICAgLyoqIFRoZSB0YWcgb2YgdGhlIGJvdHRvbSB0eXBlIDxudWxsPi4KKyAgICAvKiogVGhlIHRhZyBvZiB0aGUgYm90dG9tIHR5cGUge0Bjb2RlIDxudWxsPn0uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQk9UID0gREVGRVJSRUQrMTsKIApkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvY29kZS9UeXBlcy5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvY29kZS9UeXBlcy5qYXZhCmluZGV4IDBjYjJiMDcuLjliYzEzZTUgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL2NvZGUvVHlwZXMuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy9jb2RlL1R5cGVzLmphdmEKQEAgLTI4LDIxICsyOCwxOSBAQAogaW1wb3J0IGphdmEubGFuZy5yZWYuU29mdFJlZmVyZW5jZTsKIGltcG9ydCBqYXZhLnV0aWwuKjsKIAotaW1wb3J0IGNvbS5zdW4udG9vbHMuamF2YWMudXRpbC4qOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuamF2YWMudXRpbC5MaXN0OwotCi1pbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy5qdm0uQ2xhc3NSZWFkZXI7CiBpbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy5jb2RlLkF0dHJpYnV0ZS5SZXRlbnRpb25Qb2xpY3k7CiBpbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy5jb2RlLkxpbnQuTGludENhdGVnb3J5OwogaW1wb3J0IGNvbS5zdW4udG9vbHMuamF2YWMuY29kZS5UeXBlLlVuZGV0VmFyLkluZmVyZW5jZUJvdW5kOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuamF2YWMuY29tcC5DaGVjazsKLQoraW1wb3J0IGNvbS5zdW4udG9vbHMuamF2YWMuanZtLkNsYXNzUmVhZGVyOworaW1wb3J0IGNvbS5zdW4udG9vbHMuamF2YWMudXRpbC4qOworaW1wb3J0IGNvbS5zdW4udG9vbHMuamF2YWMudXRpbC5MaXN0OworaW1wb3J0IHN0YXRpYyBjb20uc3VuLnRvb2xzLmphdmFjLmNvZGUuQm91bmRLaW5kLio7CitpbXBvcnQgc3RhdGljIGNvbS5zdW4udG9vbHMuamF2YWMuY29kZS5GbGFncy4qOwogaW1wb3J0IHN0YXRpYyBjb20uc3VuLnRvb2xzLmphdmFjLmNvZGUuU2NvcGUuKjsKK2ltcG9ydCBzdGF0aWMgY29tLnN1bi50b29scy5qYXZhYy5jb2RlLlN5bWJvbC4qOwogaW1wb3J0IHN0YXRpYyBjb20uc3VuLnRvb2xzLmphdmFjLmNvZGUuVHlwZS4qOwogaW1wb3J0IHN0YXRpYyBjb20uc3VuLnRvb2xzLmphdmFjLmNvZGUuVHlwZVRhZ3MuKjsKLWltcG9ydCBzdGF0aWMgY29tLnN1bi50b29scy5qYXZhYy5jb2RlLlN5bWJvbC4qOwotaW1wb3J0IHN0YXRpYyBjb20uc3VuLnRvb2xzLmphdmFjLmNvZGUuRmxhZ3MuKjsKLWltcG9ydCBzdGF0aWMgY29tLnN1bi50b29scy5qYXZhYy5jb2RlLkJvdW5kS2luZC4qOwogaW1wb3J0IHN0YXRpYyBjb20uc3VuLnRvb2xzLmphdmFjLnV0aWwuTGlzdEJ1ZmZlci5sYjsKIAogLyoqCkBAIC0xNDI5LDggKzE0MjcsOCBAQAogICAgICAqIGNvbnNlcnZhdGl2ZSBpbiB0aGF0IGl0IGlzIGFsbG93ZWQgdG8gc2F5IHRoYXQgdHdvIHR5cGVzIGFyZQogICAgICAqIG5vdCBkaXNqb2ludCwgZXZlbiB0aG91Z2ggdGhleSBhY3R1YWxseSBhcmUuCiAgICAgICoKLSAgICAgKiBUaGUgdHlwZSBDPFg+IGlzIGNhc3RhYmxlIHRvIEM8WT4gZXhhY3RseSBpZiBYIGFuZCBZIGFyZSBub3QKLSAgICAgKiBkaXNqb2ludC4KKyAgICAgKiBUaGUgdHlwZSB7QGNvZGUgQzxYPn0gaXMgY2FzdGFibGUgdG8ge0Bjb2RlIEM8WT59IGV4YWN0bHkgaWYKKyAgICAgKiB7QGNvZGUgWH0gYW5kIHtAY29kZSBZfSBhcmUgbm90IGRpc2pvaW50LgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGRpc2pvaW50VHlwZShUeXBlIHQsIFR5cGUgcykgewogICAgICAgICByZXR1cm4gZGlzam9pbnRUeXBlLnZpc2l0KHQsIHMpOwpAQCAtMTUyNSw3ICsxNTIzLDcgQEAKICAgICAgKiBzb21ldGhpbmcgb2YgdHlwZSBgdCcgY2FuIGJlIGEgc3VidHlwZSBvZiBgcyc/IFRoaXMgaXMKICAgICAgKiBkaWZmZXJlbnQgZnJvbSB0aGUgcXVlc3Rpb24gImlzIGB0JyBub3QgYSBzdWJ0eXBlIG9mIGBzJz8iCiAgICAgICogd2hlbiB0eXBlIHZhcmlhYmxlcyBhcmUgaW52b2x2ZWQ6IEludGVnZXIgaXMgbm90IGEgc3VidHlwZSBvZiBUCi0gICAgICogd2hlcmUgPFQgZXh0ZW5kcyBOdW1iZXI+IGJ1dCBpdCBpcyBub3QgdHJ1ZSB0aGF0IEludGVnZXIgY2Fubm90CisgICAgICogd2hlcmUge0Bjb2RlIDxUIGV4dGVuZHMgTnVtYmVyPn0gYnV0IGl0IGlzIG5vdCB0cnVlIHRoYXQgSW50ZWdlciBjYW5ub3QKICAgICAgKiBwb3NzaWJseSBiZSBhIHN1YnR5cGUgb2YgVC4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBub3RTb2Z0U3VidHlwZShUeXBlIHQsIFR5cGUgcykgewpkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvY29tcC9BdHRyLmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy9jb21wL0F0dHIuamF2YQppbmRleCBlMTEyOTczLi4xMjc0NDMxIDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy9jb21wL0F0dHIuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy9jb21wL0F0dHIuamF2YQpAQCAtMjUsMzQgKzI1LDMyIEBACiAKIHBhY2thZ2UgY29tLnN1bi50b29scy5qYXZhYy5jb21wOwogCi1pbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy5jb2RlLio7Ci1pbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy5jb21wLkRlZmVycmVkQXR0ci5BdHRyTW9kZTsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmphdmFjLmNvbXAuSW5mZXIuSW5mZXJlbmNlQ29udGV4dDsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmphdmFjLmNvbXAuSW5mZXIuSW5mZXJlbmNlQ29udGV4dC5GcmVlVHlwZUxpc3RlbmVyOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuamF2YWMuanZtLio7Ci1pbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy50cmVlLio7Ci1pbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy51dGlsLio7Ci1pbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy51dGlsLkpDRGlhZ25vc3RpYy5EaWFnbm9zdGljUG9zaXRpb247Ci1pbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLlNldDsKIAotaW1wb3J0IGNvbS5zdW4udG9vbHMuamF2YWMuanZtLlRhcmdldDsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmphdmFjLmNvZGUuTGludC5MaW50Q2F0ZWdvcnk7Ci1pbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy5jb2RlLlN5bWJvbC4qOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuamF2YWMudHJlZS5KQ1RyZWUuKjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmphdmFjLmNvZGUuVHlwZS4qOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuamF2YWMuY29tcC5DaGVjay5DaGVja0NvbnRleHQ7CitpbXBvcnQgamF2YXgubGFuZy5tb2RlbC5lbGVtZW50LkVsZW1lbnRLaW5kOworaW1wb3J0IGphdmF4LnRvb2xzLkphdmFGaWxlT2JqZWN0OwogCiBpbXBvcnQgY29tLnN1bi5zb3VyY2UudHJlZS5JZGVudGlmaWVyVHJlZTsKIGltcG9ydCBjb20uc3VuLnNvdXJjZS50cmVlLk1lbWJlclJlZmVyZW5jZVRyZWUuUmVmZXJlbmNlTW9kZTsKIGltcG9ydCBjb20uc3VuLnNvdXJjZS50cmVlLk1lbWJlclNlbGVjdFRyZWU7CiBpbXBvcnQgY29tLnN1bi5zb3VyY2UudHJlZS5UcmVlVmlzaXRvcjsKIGltcG9ydCBjb20uc3VuLnNvdXJjZS51dGlsLlNpbXBsZVRyZWVWaXNpdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZheC5sYW5nLm1vZGVsLmVsZW1lbnQuRWxlbWVudEtpbmQ7Ci1pbXBvcnQgamF2YXgudG9vbHMuSmF2YUZpbGVPYmplY3Q7Ci0KK2ltcG9ydCBjb20uc3VuLnRvb2xzLmphdmFjLmNvZGUuKjsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmphdmFjLmNvZGUuTGludC5MaW50Q2F0ZWdvcnk7CitpbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy5jb2RlLlN5bWJvbC4qOworaW1wb3J0IGNvbS5zdW4udG9vbHMuamF2YWMuY29kZS5UeXBlLio7CitpbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy5jb21wLkNoZWNrLkNoZWNrQ29udGV4dDsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmphdmFjLmNvbXAuRGVmZXJyZWRBdHRyLkF0dHJNb2RlOworaW1wb3J0IGNvbS5zdW4udG9vbHMuamF2YWMuY29tcC5JbmZlci5JbmZlcmVuY2VDb250ZXh0OworaW1wb3J0IGNvbS5zdW4udG9vbHMuamF2YWMuY29tcC5JbmZlci5JbmZlcmVuY2VDb250ZXh0LkZyZWVUeXBlTGlzdGVuZXI7CitpbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy5qdm0uKjsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmphdmFjLmp2bS5UYXJnZXQ7CitpbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy50cmVlLio7CitpbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy50cmVlLkpDVHJlZS4qOworaW1wb3J0IGNvbS5zdW4udG9vbHMuamF2YWMudXRpbC4qOworaW1wb3J0IGNvbS5zdW4udG9vbHMuamF2YWMudXRpbC5KQ0RpYWdub3N0aWMuRGlhZ25vc3RpY1Bvc2l0aW9uOworaW1wb3J0IGNvbS5zdW4udG9vbHMuamF2YWMudXRpbC5MaXN0OwogaW1wb3J0IHN0YXRpYyBjb20uc3VuLnRvb2xzLmphdmFjLmNvZGUuRmxhZ3MuKjsKIGltcG9ydCBzdGF0aWMgY29tLnN1bi50b29scy5qYXZhYy5jb2RlLkZsYWdzLkFOTk9UQVRJT047CiBpbXBvcnQgc3RhdGljIGNvbS5zdW4udG9vbHMuamF2YWMuY29kZS5GbGFncy5CTE9DSzsKQEAgLTc0Miw3ICs3NDAsNyBAQAogICAgICAqICBAcGFyYW0gZW52ICAgICAgICAgVGhlIGVudiBmb3IgdGhlIGNvbnN0IHZhbHVlCiAgICAgICogIEBwYXJhbSBpbml0aWFsaXplciBUaGUgaW5pdGlhbGl6ZXIgZm9yIHRoZSBjb25zdCB2YWx1ZQogICAgICAqICBAcGFyYW0gdHlwZSAgICAgICAgVGhlIGV4cGVjdGVkIHR5cGUsIG9yIG51bGwKLSAgICAgKiAgQHNlZSBWYXJTeW1ib2wjc2V0bGF6eUNvbnN0VmFsdWUKKyAgICAgKiAgQHNlZSBWYXJTeW1ib2wjc2V0TGF6eUNvbnN0VmFsdWUKICAgICAgKi8KICAgICBwdWJsaWMgT2JqZWN0IGF0dHJpYkxhenlDb25zdGFudFZhbHVlKEVudjxBdHRyQ29udGV4dD4gZW52LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQ1RyZWUuSkNFeHByZXNzaW9uIGluaXRpYWxpemVyLApAQCAtODc1LDYgKzg3Myw3IEBACiAKICAgICBwdWJsaWMgdm9pZCB2aXNpdE1ldGhvZERlZihKQ01ldGhvZERlY2wgdHJlZSkgewogICAgICAgICBNZXRob2RTeW1ib2wgbSA9IHRyZWUuc3ltOworICAgICAgICBib29sZWFuIGlzRGVmYXVsdE1ldGhvZCA9IChtLmZsYWdzKCkgJiBERUZBVUxUKSAhPSAwOwogCiAgICAgICAgIExpbnQgbGludCA9IGVudi5pbmZvLmxpbnQuYXVnbWVudChtLmFubm90YXRpb25zLCBtLmZsYWdzKCkpOwogICAgICAgICBMaW50IHByZXZMaW50ID0gY2hrLnNldExpbnQobGludCk7CkBAIC05NTQsOCArOTUzLDggQEAKICAgICAgICAgICAgICAgICAvLyBFbXB0eSBib2RpZXMgYXJlIG9ubHkgYWxsb3dlZCBmb3IKICAgICAgICAgICAgICAgICAvLyBhYnN0cmFjdCwgbmF0aXZlLCBvciBpbnRlcmZhY2UgbWV0aG9kcywgb3IgZm9yIG1ldGhvZHMKICAgICAgICAgICAgICAgICAvLyBpbiBhIHJldHJvZml0IHNpZ25hdHVyZSBjbGFzcy4KLSAgICAgICAgICAgICAgICBpZiAoKG93bmVyLmZsYWdzKCkgJiBJTlRFUkZBQ0UpID09IDAgJiYKLSAgICAgICAgICAgICAgICAgICAgKHRyZWUubW9kcy5mbGFncyAmIChBQlNUUkFDVCB8IE5BVElWRSkpID09IDAgJiYKKyAgICAgICAgICAgICAgICBpZiAoaXNEZWZhdWx0TWV0aG9kIHx8ICgob3duZXIuZmxhZ3MoKSAmIElOVEVSRkFDRSkgPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAodHJlZS5tb2RzLmZsYWdzICYgKEFCU1RSQUNUIHwgTkFUSVZFKSkgPT0gMCkgJiYKICAgICAgICAgICAgICAgICAgICAgIXJlbGF4KQogICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IodHJlZS5wb3MoKSwgIm1pc3NpbmcubWV0aC5ib2R5Lm9yLmRlY2wuYWJzdHJhY3QiKTsKICAgICAgICAgICAgICAgICBpZiAodHJlZS5kZWZhdWx0VmFsdWUgIT0gbnVsbCkgewpAQCAtOTYzLDcgKzk2Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IodHJlZS5wb3MoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdC5hbGxvd2VkLmluLmludGYuYW5ub3RhdGlvbi5tZW1iZXIiKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKChvd25lci5mbGFncygpICYgSU5URVJGQUNFKSAhPSAwKSB7CisgICAgICAgICAgICB9IGVsc2UgaWYgKChvd25lci5mbGFncygpICYgSU5URVJGQUNFKSAhPSAwICYmICFpc0RlZmF1bHRNZXRob2QpIHsKICAgICAgICAgICAgICAgICBsb2cuZXJyb3IodHJlZS5ib2R5LnBvcygpLCAiaW50Zi5tZXRoLmNhbnQuaGF2ZS5ib2R5Iik7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKCh0cmVlLm1vZHMuZmxhZ3MgJiBBQlNUUkFDVCkgIT0gMCkgewogICAgICAgICAgICAgICAgIGxvZy5lcnJvcih0cmVlLnBvcygpLCAiYWJzdHJhY3QubWV0aC5jYW50LmhhdmUuYm9keSIpOwpkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvY29tcC9DaGVjay5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvY29tcC9DaGVjay5qYXZhCmluZGV4IDg3NjUxNDguLmQxNjc5MjkgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL2NvbXAvQ2hlY2suamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy9jb21wL0NoZWNrLmphdmEKQEAgLTIzMCw3ICsyMzAsNiBAQAogCiAgICAgLyoqIFdhcm4gYWJvdXQgdW5zYWZlIHZhcmFyZyBtZXRob2QgZGVjbC4KICAgICAgKiAgQHBhcmFtIHBvcyAgICAgICAgUG9zaXRpb24gdG8gYmUgdXNlZCBmb3IgZXJyb3IgcmVwb3J0aW5nLgotICAgICAqICBAcGFyYW0gc3ltICAgICAgICBUaGUgZGVwcmVjYXRlZCBzeW1ib2wuCiAgICAgICovCiAgICAgdm9pZCB3YXJuVW5zYWZlVmFyYXJnKERpYWdub3N0aWNQb3NpdGlvbiBwb3MsIFN0cmluZyBrZXksIE9iamVjdC4uLiBhcmdzKSB7CiAgICAgICAgIGlmIChsaW50LmlzRW5hYmxlZChMaW50Q2F0ZWdvcnkuVkFSQVJHUykgJiYgYWxsb3dTaW1wbGlmaWVkVmFyYXJncykKQEAgLTM5Nyw3ICszOTYsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAgICAgLyoqIFJldHVybiBuYW1lIG9mIGxvY2FsIGNsYXNzLgotICAgICAqICBUaGlzIGlzIG9mIHRoZSBmb3JtICAgIDxlbmNsQ2xhc3M+ICQgbiA8Y2xhc3NuYW1lPgorICAgICAqICBUaGlzIGlzIG9mIHRoZSBmb3JtICAge0Bjb2RlIDxlbmNsQ2xhc3M+ICQgbiA8Y2xhc3NuYW1lPiB9CiAgICAgICogIHdoZXJlCiAgICAgICogICAgZW5jbENsYXNzIGlzIHRoZSBmbGF0IG5hbWUgb2YgdGhlIGVuY2xvc2luZyBjbGFzcywKICAgICAgKiAgICBjbGFzc25hbWUgaXMgdGhlIHNpbXBsZSBuYW1lIG9mIHRoZSBsb2NhbCBjbGFzcwpAQCAtNjAwLDExICs1OTksMTAgQEAKIAogICAgIC8qKiBDaGVjayB0aGF0IGEgdHlwZSBpcyB3aXRoaW4gc29tZSBib3VuZHMuCiAgICAgICoKLSAgICAgKiAgVXNlZCBpbiBUeXBlQXBwbHkgdG8gdmVyaWZ5IHRoYXQsIGUuZy4sIFggaW4gVjxYPiBpcyBhIHZhbGlkCisgICAgICogIFVzZWQgaW4gVHlwZUFwcGx5IHRvIHZlcmlmeSB0aGF0LCBlLmcuLCBYIGluIHtAY29kZSBWPFg+fSBpcyBhIHZhbGlkCiAgICAgICogIHR5cGUgYXJndW1lbnQuCi0gICAgICogIEBwYXJhbSBwb3MgICAgICAgICAgIFBvc2l0aW9uIHRvIGJlIHVzZWQgZm9yIGVycm9yIHJlcG9ydGluZy4KICAgICAgKiAgQHBhcmFtIGEgICAgICAgICAgICAgVGhlIHR5cGUgdGhhdCBzaG91bGQgYmUgYm91bmRlZCBieSBicy4KLSAgICAgKiAgQHBhcmFtIGJzICAgICAgICAgICAgVGhlIGJvdW5kLgorICAgICAqICBAcGFyYW0gYm91bmQgICAgICAgICBUaGUgYm91bmQuCiAgICAgICovCiAgICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrRXh0ZW5kcyhUeXBlIGEsIFR5cGUgYm91bmQpIHsKICAgICAgICAgIGlmIChhLmlzVW5ib3VuZCgpKSB7CkBAIC0xMTIzLDggKzExMjEsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgbWFzayA9IFBSSVZBVEU7CiAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgIG1hc2sgPSBDb25zdHJ1Y3RvckZsYWdzOwotICAgICAgICAgICAgfSAgZWxzZSBpZiAoKHN5bS5vd25lci5mbGFnc19maWVsZCAmIElOVEVSRkFDRSkgIT0gMCkKLSAgICAgICAgICAgICAgICBtYXNrID0gaW1wbGljaXQgPSBJbnRlcmZhY2VNZXRob2RGbGFnczsKKyAgICAgICAgICAgIH0gIGVsc2UgaWYgKChzeW0ub3duZXIuZmxhZ3NfZmllbGQgJiBJTlRFUkZBQ0UpICE9IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoKGZsYWdzICYgREVGQVVMVCkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBtYXNrID0gSW50ZXJmYWNlRGVmYXVsdE1ldGhvZE1hc2s7CisgICAgICAgICAgICAgICAgICAgIGltcGxpY2l0ID0gUFVCTElDOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1hc2sgPSBpbXBsaWNpdCA9IEludGVyZmFjZU1ldGhvZEZsYWdzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgIG1hc2sgPSBNZXRob2RGbGFnczsKICAgICAgICAgICAgIH0KQEAgLTExNzEsNyArMTE3NSw3IEBACiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoKTsKICAgICAgICAgfQotICAgICAgICBsb25nIGlsbGVnYWwgPSBmbGFncyAmIFN0YW5kYXJkRmxhZ3MgJiB+bWFzazsKKyAgICAgICAgbG9uZyBpbGxlZ2FsID0gZmxhZ3MgJiBFeHRlbmRlZFN0YW5kYXJkRmxhZ3MgJiB+bWFzazsKICAgICAgICAgaWYgKGlsbGVnYWwgIT0gMCkgewogICAgICAgICAgICAgaWYgKChpbGxlZ2FsICYgSU5URVJGQUNFKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgbG9nLmVycm9yKHBvcywgImludGYubm90LmFsbG93ZWQuaGVyZSIpOwpAQCAtMTE4Nyw3ICsxMTkxLDcgQEAKICAgICAgICAgICAgICAgICAgIC8vIGluIHRoZSBwcmVzZW5jZSBvZiBpbm5lciBjbGFzc2VzLiBTaG91bGQgaXQgYmUgZGVsZXRlZCBoZXJlPwogICAgICAgICAgICAgICAgICAgY2hlY2tEaXNqb2ludChwb3MsIGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQlNUUkFDVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJJVkFURSB8IFNUQVRJQykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSSVZBVEUgfCBTVEFUSUMgfCBERUZBVUxUKSkKICAgICAgICAgICAgICAgICAgJiYKICAgICAgICAgICAgICAgICAgY2hlY2tEaXNqb2ludChwb3MsIGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFCU1RSQUNUIHwgSU5URVJGQUNFLApAQCAtMTIxMSw3ICsxMjE1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RSSUNURlApKSkgewogICAgICAgICAgICAgLy8gc2tpcAogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmbGFncyAmIChtYXNrIHwgflN0YW5kYXJkRmxhZ3MpIHwgaW1wbGljaXQ7CisgICAgICAgIHJldHVybiBmbGFncyAmIChtYXNrIHwgfkV4dGVuZGVkU3RhbmRhcmRGbGFncykgfCBpbXBsaWNpdDsKICAgICB9CiAKIApAQCAtMTI2Miw4ICsxMjY2LDEwIEBACiAgICAgICogIHRoZWlyIGJvdW5kcy4gVGhpcyBtdXN0IGJlIGRvbmUgaW4gYSBzZWNvbmQgcGhhc2UgYWZ0ZXIgdHlwZSBhdHRyaWJ1dG9uCiAgICAgICogIHNpbmNlIGEgY2xhc3MgbWlnaHQgaGF2ZSBhIHN1YmNsYXNzIGFzIHR5cGUgcGFyYW1ldGVyIGJvdW5kLiBFLmc6CiAgICAgICoKKyAgICAgKiAgPHByZT57QGNvZGUKICAgICAgKiAgY2xhc3MgQjxBIGV4dGVuZHMgQz4geyAuLi4gfQogICAgICAqICBjbGFzcyBDIGV4dGVuZHMgQjxDPiB7IC4uLiB9CisgICAgICogIH08L3ByZT4KICAgICAgKgogICAgICAqICBhbmQgd2UgY2FuJ3QgbWFrZSBzdXJlIHRoYXQgdGhlIGJvdW5kIGlzIGFscmVhZHkgYXR0cmlidXRlZCBiZWNhdXNlCiAgICAgICogIG9mIHBvc3NpYmxlIGN5Y2xlcy4KQEAgLTI1NzQsNyArMjU4MCw3IEBACiAgICAgICogJ3BvcycuCiAgICAgICoKICAgICAgKiBAcGFyYW0gcyBUaGUgKGFubm90YXRpb24pdHlwZSBkZWNsYXJhdGlvbiBhbm5vdGF0ZWQgd2l0aCBhIEBDb250YWluZWRCeQotICAgICAqIEBwYXJhbSBjb250YWluZXJBbm5vIHRoZSBAQ29udGFpbmVkQnkgb24gJ3MnCisgICAgICogQHBhcmFtIGNvbnRhaW5lZEJ5IHRoZSBAQ29udGFpbmVkQnkgb24gJ3MnCiAgICAgICogQHBhcmFtIHBvcyB3aGVyZSB0byByZXBvcnQgZXJyb3JzCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdmFsaWRhdGVDb250YWluZWRCeShUeXBlU3ltYm9sIHMsIEF0dHJpYnV0ZS5Db21wb3VuZCBjb250YWluZWRCeSwgRGlhZ25vc3RpY1Bvc2l0aW9uIHBvcykgewpAQCAtMzE4MSw3ICszMTg3LDYgQEAKICAgICAgKiAgQHBhcmFtIHBvcyAgICAgICAgICAgUG9zaXRpb24gZm9yIGVycm9yIHJlcG9ydGluZy4KICAgICAgKiAgQHBhcmFtIHN5bSAgICAgICAgICAgVGhlIHN5bWJvbC4KICAgICAgKiAgQHBhcmFtIHMgICAgICAgICAgICAgVGhlIHNjb3BlCi0gICAgICogIEBwYXJhbSBzdGF0aWNJbXBvcnQgIFdoZXRoZXIgb3Igbm90IHRoaXMgd2FzIGEgc3RhdGljIGltcG9ydAogICAgICAqLwogICAgIGJvb2xlYW4gY2hlY2tVbmlxdWVTdGF0aWNJbXBvcnQoRGlhZ25vc3RpY1Bvc2l0aW9uIHBvcywgU3ltYm9sIHN5bSwgU2NvcGUgcykgewogICAgICAgICByZXR1cm4gY2hlY2tVbmlxdWVJbXBvcnQocG9zLCBzeW0sIHMsIHRydWUpOwpkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvY29tcC9EZWZlcnJlZEF0dHIuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL2NvbXAvRGVmZXJyZWRBdHRyLmphdmEKaW5kZXggNzQwNWNhMS4uMmI2ZDBkNyAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvY29tcC9EZWZlcnJlZEF0dHIuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy9jb21wL0RlZmVycmVkQXR0ci5qYXZhCkBAIC00Niw3ICs0Niw2IEBACiAKIGltcG9ydCBzdGF0aWMgY29tLnN1bi50b29scy5qYXZhYy5jb2RlLlR5cGVUYWdzLio7CiBpbXBvcnQgc3RhdGljIGNvbS5zdW4udG9vbHMuamF2YWMudHJlZS5KQ1RyZWUuVGFnLio7Ci1pbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy51dGlsLkpDRGlhZ25vc3RpYy5EaWFnbm9zdGljUG9zaXRpb247CiAKIC8qKgogICogVGhpcyBpcyBhbiBoZWxwZXIgY2xhc3MgdGhhdCBpcyB1c2VkIHRvIHBlcmZvcm0gZGVmZXJyZWQgdHlwZS1hbmFseXNpcy4KZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL2NvbXAvRmxvdy5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvY29tcC9GbG93LmphdmEKaW5kZXggNTVlMmU3MS4uZTYxNjA5NyAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvY29tcC9GbG93LmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvY29tcC9GbG93LmphdmEKQEAgLTE0OCw3ICsxNDgsNyBAQAogICogIGV4Y2VwdGlvbiB0byB0aGlzIFtubyBwdW4gaW50ZW5kZWRdIGlzIHRoYXQgY2hlY2tlZCBleGNlcHRpb25zIHRoYXQKICAqICBhcmUga25vd24gdG8gYmUgY2F1Z2h0IG9yIGRlY2xhcmVkIHRvIGJlIGNhdWdodCBpbiB0aGUgZW5jbG9zaW5nCiAgKiAgbWV0aG9kIGFyZSBub3QgcmVjb3JkZWQgaW4gdGhlIHF1ZXVlLCBidXQgaW5zdGVhZCBhcmUgcmVjb3JkZWQgaW4gYQotICogIGdsb2JhbCB2YXJpYWJsZSAiU2V0PFR5cGU+IHRocm93biIgdGhhdCByZWNvcmRzIHRoZSB0eXBlIG9mIGFsbAorICogIGdsb2JhbCB2YXJpYWJsZSAie0Bjb2RlIFNldDxUeXBlPiB0aHJvd259IiB0aGF0IHJlY29yZHMgdGhlIHR5cGUgb2YgYWxsCiAgKiAgZXhjZXB0aW9ucyB0aGF0IGNhbiBiZSB0aHJvd24uCiAgKgogICogIDxwPk90aGVyIG1pbm9yIGlzc3VlcyB0aGUgdHJlYXRtZW50IG9mIG1lbWJlcnMgb2Ygb3RoZXIgY2xhc3NlcwpkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvY29tcC9JbmZlci5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvY29tcC9JbmZlci5qYXZhCmluZGV4IDU0OGJiOWQuLmJmZDNjNGUgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL2NvbXAvSW5mZXIuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy9jb21wL0luZmVyLmphdmEKQEAgLTQxLDcgKzQxLDYgQEAKIAogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKIAogaW1wb3J0IHN0YXRpYyBjb20uc3VuLnRvb2xzLmphdmFjLmNvZGUuVHlwZVRhZ3MuKjsKIApkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvY29tcC9Mb3dlci5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvY29tcC9Mb3dlci5qYXZhCmluZGV4IDU3NjA0Y2IuLjEyMGM0MjkgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL2NvbXAvTG93ZXIuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy9jb21wL0xvd2VyLmphdmEKQEAgLTY3MSw3ICs2NzEsNyBAQAogICAgIH07CiAKICAgICAvKiogTG9vayB1cCBhIHN5bnRoZXRpYyBuYW1lIGluIGEgZ2l2ZW4gc2NvcGUuCi0gICAgICogIEBwYXJhbSBzY29wZSAgICAgICAgVGhlIHNjb3BlLgorICAgICAqICBAcGFyYW0gcyAgICAgICAgICAgIFRoZSBzY29wZS4KICAgICAgKiAgQHBhcmFtIG5hbWUgICAgICAgICBUaGUgbmFtZS4KICAgICAgKi8KICAgICBwcml2YXRlIFN5bWJvbCBsb29rdXBTeW50aGV0aWMoTmFtZSBuYW1lLCBTY29wZSBzKSB7CkBAIC03NDcsNyArNzQ3LDcgQEAKICAgICAgKiAgVGhpcyBudW1iZXJpbmcgc2NoZW1lIGlzIHVzZWQgYnkgdGhlIGJhY2tlbmQgdG8gZGVjaWRlIHdoZXRoZXIKICAgICAgKiAgdG8gaXNzdWUgYW4gaW52b2tldmlydHVhbCBvciBpbnZva2VzcGVjaWFsIGNhbGwuCiAgICAgICoKLSAgICAgKiAgQHNlZSBHZW4udmlzaXRTZWxlY3QoU2VsZWN0IHRyZWUpCisgICAgICogIEBzZWUgR2VuI3Zpc2l0U2VsZWN0KEpDRmllbGRBY2Nlc3MgdHJlZSkKICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQKICAgICAgICAgREVSRUZjb2RlID0gMCwKQEAgLTE5NDUsNyArMTk0NSw3IEBACiAgICAgICogIEBwYXJhbSBzaWcgICAgICBUaGUgc2lnbmF0dXJlIG9mIHR5cGUgVC4KICAgICAgKi8KICAgICBwcml2YXRlIE5hbWUgY2FjaGVOYW1lKFN0cmluZyBzaWcpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBidWYgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogICAgICAgICBpZiAoc2lnLnN0YXJ0c1dpdGgoIlsiKSkgewogICAgICAgICAgICAgYnVmID0gYnVmLmFwcGVuZCgiYXJyYXkiKTsKICAgICAgICAgICAgIHdoaWxlIChzaWcuc3RhcnRzV2l0aCgiWyIpKSB7CmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy9jb21wL01lbWJlckVudGVyLmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy9jb21wL01lbWJlckVudGVyLmphdmEKaW5kZXggYTU3ZjNiYS4uODUzOTdmYyAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvY29tcC9NZW1iZXJFbnRlci5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL2NvbXAvTWVtYmVyRW50ZXIuamF2YQpAQCAtMTI4LDggKzEyOCw3IEBACiAgICAgLyoqIEltcG9ydCBhbGwgY2xhc3NlcyBvZiBhIGNsYXNzIG9yIHBhY2thZ2Ugb24gZGVtYW5kLgogICAgICAqICBAcGFyYW0gcG9zICAgICAgICAgICBQb3NpdGlvbiB0byBiZSB1c2VkIGZvciBlcnJvciByZXBvcnRpbmcuCiAgICAgICogIEBwYXJhbSB0c3ltICAgICAgICAgIFRoZSBjbGFzcyBvciBwYWNrYWdlIHRoZSBtZW1iZXJzIG9mIHdoaWNoIGFyZSBpbXBvcnRlZC4KLSAgICAgKiAgQHBhcmFtIHRvU2NvcGUgICBUaGUgKGltcG9ydCkgc2NvcGUgaW4gd2hpY2ggaW1wb3J0ZWQgY2xhc3NlcwotICAgICAqICAgICAgICAgICAgICAgYXJlIGVudGVyZWQuCisgICAgICogIEBwYXJhbSBlbnYgICAgICAgICAgIFRoZSBlbnYgaW4gd2hpY2ggdGhlIGltcG9ydGVkIGNsYXNzZXMgd2lsbCBiZSBlbnRlcmVkLgogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCBpbXBvcnRBbGwoaW50IHBvcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFR5cGVTeW1ib2wgdHN5bSwKQEAgLTE1MCw4ICsxNDksNyBAQAogICAgIC8qKiBJbXBvcnQgYWxsIHN0YXRpYyBtZW1iZXJzIG9mIGEgY2xhc3Mgb3IgcGFja2FnZSBvbiBkZW1hbmQuCiAgICAgICogIEBwYXJhbSBwb3MgICAgICAgICAgIFBvc2l0aW9uIHRvIGJlIHVzZWQgZm9yIGVycm9yIHJlcG9ydGluZy4KICAgICAgKiAgQHBhcmFtIHRzeW0gICAgICAgICAgVGhlIGNsYXNzIG9yIHBhY2thZ2UgdGhlIG1lbWJlcnMgb2Ygd2hpY2ggYXJlIGltcG9ydGVkLgotICAgICAqICBAcGFyYW0gdG9TY29wZSAgIFRoZSAoaW1wb3J0KSBzY29wZSBpbiB3aGljaCBpbXBvcnRlZCBjbGFzc2VzCi0gICAgICogICAgICAgICAgICAgICBhcmUgZW50ZXJlZC4KKyAgICAgKiAgQHBhcmFtIGVudiAgICAgICAgICAgVGhlIGVudiBpbiB3aGljaCB0aGUgaW1wb3J0ZWQgY2xhc3NlcyB3aWxsIGJlIGVudGVyZWQuCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIGltcG9ydFN0YXRpY0FsbChpbnQgcG9zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVHlwZVN5bWJvbCB0c3ltLApkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvY29tcC9UcmFuc1R5cGVzLmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy9jb21wL1RyYW5zVHlwZXMuamF2YQppbmRleCBlM2FmYmI3Li4zNmYzYTI1IDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy9jb21wL1RyYW5zVHlwZXMuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy9jb21wL1RyYW5zVHlwZXMuamF2YQpAQCAtMjcsOCArMjcsNiBAQAogCiBpbXBvcnQgamF2YS51dGlsLio7CiAKLWltcG9ydCBqYXZheC5sYW5nLm1vZGVsLmVsZW1lbnQuRWxlbWVudEtpbmQ7Ci0KIGltcG9ydCBjb20uc3VuLnRvb2xzLmphdmFjLmNvZGUuKjsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmphdmFjLmNvZGUuU3ltYm9sLio7CiBpbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy50cmVlLio7CkBAIC0xMzQsMTcgKzEzMiwyMSBAQAogICAgICAqICBUaGVuLCBjb2VyY2UgdG8gc29tZSBnaXZlbiB0YXJnZXQgdHlwZSB1bmxlc3MgdGFyZ2V0IHR5cGUgaXMgbnVsbC4KICAgICAgKiAgVGhpcyBvcGVyYXRpb24gaXMgdXNlZCBpbiBzaXR1YXRpb25zIGxpa2UgdGhlIGZvbGxvd2luZzoKICAgICAgKgorICAgICAqICA8cHJlPntAY29kZQogICAgICAqICBjbGFzcyBDZWxsPEE+IHsgQSB2YWx1ZTsgfQogICAgICAqICAuLi4KICAgICAgKiAgQ2VsbDxJbnRlZ2VyPiBjZWxsOwogICAgICAqICBJbnRlZ2VyIHggPSBjZWxsLnZhbHVlOworICAgICAqICB9PC9wcmU+CiAgICAgICoKICAgICAgKiAgU2luY2UgdGhlIGVyYXN1cmUgb2YgQ2VsbC52YWx1ZSBpcyBPYmplY3QsIGJ1dCB0aGUgdHlwZQogICAgICAqICBvZiBjZWxsLnZhbHVlIGluIHRoZSBhc3NpZ25tZW50IGlzIEludGVnZXIsIHdlIG5lZWQgdG8KICAgICAgKiAgYWRqdXN0IHRoZSBvcmlnaW5hbCB0eXBlIG9mIGNlbGwudmFsdWUgdG8gT2JqZWN0LCBhbmQgaW5zZXJ0CiAgICAgICogIGEgY2FzdCB0byBJbnRlZ2VyLiBUaGF0IGlzLCB0aGUgbGFzdCBhc3NpZ25tZW50IGJlY29tZXM6CiAgICAgICoKKyAgICAgKiAgPHByZT57QGNvZGUKICAgICAgKiAgSW50ZWdlciB4ID0gKEludGVnZXIpY2VsbC52YWx1ZTsKKyAgICAgKiAgfTwvcHJlPgogICAgICAqCiAgICAgICogIEBwYXJhbSB0cmVlICAgICAgIFRoZSBleHByZXNzaW9uIHRyZWUgd2hvc2UgdHlwZSBtaWdodCBuZWVkIGFkanVzdG1lbnQuCiAgICAgICogIEBwYXJhbSBlcmFzZWRUeXBlIFRoZSBleHByZXNzaW9uJ3MgdHlwZSBhZnRlciBlcmFzdXJlLgpkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvZmlsZS9KYXZhY0ZpbGVNYW5hZ2VyLmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy9maWxlL0phdmFjRmlsZU1hbmFnZXIuamF2YQppbmRleCA3ODc3NDU2Li44N2JiZmJjIDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy9maWxlL0phdmFjRmlsZU1hbmFnZXIuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy9maWxlL0phdmFjRmlsZU1hbmFnZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTEsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTgwNSw4ICs4MDUsOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEVuZm9yY2VzIHRoZSBzcGVjaWZpY2F0aW9uIG9mIGEgInJlbGF0aXZlIiBVUkkgYXMgdXNlZCBpbgotICAgICAqIHtAbGlua3BsYWluICNnZXRGaWxlRm9ySW5wdXQoTG9jYXRpb24sU3RyaW5nLFVSSSkKKyAgICAgKiBFbmZvcmNlcyB0aGUgc3BlY2lmaWNhdGlvbiBvZiBhICJyZWxhdGl2ZSIgbmFtZSBhcyB1c2VkIGluCisgICAgICoge0BsaW5rcGxhaW4gI2dldEZpbGVGb3JJbnB1dChMb2NhdGlvbixTdHJpbmcsU3RyaW5nKQogICAgICAqIGdldEZpbGVGb3JJbnB1dH0uICBUaGlzIG1ldGhvZCBtdXN0IGZvbGxvdyB0aGUgcnVsZXMgZGVmaW5lZCBpbgogICAgICAqIHRoYXQgbWV0aG9kLCBkbyBub3QgbWFrZSBhbnkgY2hhbmdlcyB3aXRob3V0IGNvbnN1bHRpbmcgdGhlCiAgICAgICogc3BlY2lmaWNhdGlvbi4KZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL2ZpbGUvTG9jYXRpb25zLmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy9maWxlL0xvY2F0aW9ucy5qYXZhCmluZGV4IDFlMjlmOTEuLjZlMDQ3MmMgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL2ZpbGUvTG9jYXRpb25zLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvZmlsZS9Mb2NhdGlvbnMuamF2YQpAQCAtNTMsMTMgKzUzLDE0IEBACiBpbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy51dGlsLk9wdGlvbnM7CiAKIGltcG9ydCBqYXZheC50b29scy5KYXZhRmlsZU1hbmFnZXI7CitpbXBvcnQgamF2YXgudG9vbHMuU3RhbmRhcmRKYXZhRmlsZU1hbmFnZXI7CiBpbXBvcnQgc3RhdGljIGphdmF4LnRvb2xzLlN0YW5kYXJkTG9jYXRpb24uKjsKIGltcG9ydCBzdGF0aWMgY29tLnN1bi50b29scy5qYXZhYy5tYWluLk9wdGlvbi4qOwogCiAvKiogVGhpcyBjbGFzcyBjb252ZXJ0cyBjb21tYW5kIGxpbmUgYXJndW1lbnRzLCBlbnZpcm9ubWVudCB2YXJpYWJsZXMKICAqICBhbmQgc3lzdGVtIHByb3BlcnRpZXMgKGluIEZpbGUucGF0aFNlcGFyYXRvci1zZXBhcmF0ZWQgU3RyaW5nIGZvcm0pCiAgKiAgaW50byBhIGJvb3QgY2xhc3MgcGF0aCwgdXNlciBjbGFzcyBwYXRoLCBhbmQgc291cmNlIHBhdGggKGluCi0gKiAgQ29sbGVjdGlvbjxTdHJpbmc+IGZvcm0pLgorICogIHtAY29kZSBDb2xsZWN0aW9uPFN0cmluZz59IGZvcm0pLgogICoKICAqICA8cD48Yj5UaGlzIGlzIE5PVCBwYXJ0IG9mIGFueSBzdXBwb3J0ZWQgQVBJLgogICogIElmIHlvdSB3cml0ZSBjb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGlzLCB5b3UgZG8gc28gYXQgeW91ciBvd24gcmlzay4KQEAgLTM0MiwxMSArMzQzLDExIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICAvKiogQHNlZSBKYXZhRmlsZU1hbmFnZXIjaGFuZGxlT3B0aW9uLiAqLworICAgICAgICAvKiogQHNlZSBKYXZhRmlsZU1hbmFnZXIjaGFuZGxlT3B0aW9uICovCiAgICAgICAgIGFic3RyYWN0IGJvb2xlYW4gaGFuZGxlT3B0aW9uKE9wdGlvbiBvcHRpb24sIFN0cmluZyB2YWx1ZSk7Ci0gICAgICAgIC8qKiBAc2VlIEphdmFGaWxlTWFuYWdlciNnZXRMb2NhdGlvbi4gKi8KKyAgICAgICAgLyoqIEBzZWUgU3RhbmRhcmRKYXZhRmlsZU1hbmFnZXIjZ2V0TG9jYXRpb24gKi8KICAgICAgICAgYWJzdHJhY3QgQ29sbGVjdGlvbjxGaWxlPiBnZXRMb2NhdGlvbigpOwotICAgICAgICAvKiogQHNlZSBKYXZhRmlsZU1hbmFnZXIjc2V0TG9jYXRpb24uICovCisgICAgICAgIC8qKiBAc2VlIFN0YW5kYXJkSmF2YUZpbGVNYW5hZ2VyI3NldExvY2F0aW9uICovCiAgICAgICAgIGFic3RyYWN0IHZvaWQgc2V0TG9jYXRpb24oSXRlcmFibGU8PyBleHRlbmRzIEZpbGU+IGZpbGVzKSB0aHJvd3MgSU9FeGNlcHRpb247CiAgICAgfQogCmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy9maWxlL1ppcEZpbGVJbmRleC5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvZmlsZS9aaXBGaWxlSW5kZXguamF2YQppbmRleCAxY2E4NjBlLi5kYmI5ZjY4IDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy9maWxlL1ppcEZpbGVJbmRleC5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL2ZpbGUvWmlwRmlsZUluZGV4LmphdmEKQEAgLTM4LDcgKzM4LDYgQEAKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwpAQCAtNjAsNyArNTksNyBAQAogICogdGhlIGNvbW1hbmQgbGluZS4pCiAgKgogICogTG9jYXRpb24gd2hlcmUgdG8gbG9vayBmb3IvZ2VuZXJhdGUgb3B0aW1pemVkIHppcCBpbmRleCBmaWxlcyBjYW4gYmUKLSAqIHByb3ZpZGVkIHVzaW5nICItWERjYWNoZXppcGluZGV4ZGlyPTxkaXJlY3Rvcnk+Ii4gSWYgdGhpcyBmbGFnIGlzIG5vdAorICogcHJvdmlkZWQgdXNpbmcgIntAY29kZSAtWERjYWNoZXppcGluZGV4ZGlyPTxkaXJlY3Rvcnk+fSIuIElmIHRoaXMgZmxhZyBpcyBub3QKICAqIHByb3ZpZGVkLCB0aGUgZGVmYXVsdCBsb2NhdGlvbiBpcyB0aGUgdmFsdWUgb2YgdGhlICJqYXZhLmlvLnRtcGRpciIgc3lzdGVtCiAgKiBwcm9wZXJ0eS4KICAqCmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy9qdm0vR2VuLmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy9qdm0vR2VuLmphdmEKaW5kZXggOWE1OWUwZC4uOWY5OWZiNiAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvanZtL0dlbi5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL2p2bS9HZW4uamF2YQpAQCAtNDQ2LDcgKzQ0Niw3IEBACiAgKiBOb3JtYWxpemluZyBjbGFzcy1tZW1iZXJzLgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSAgICAvKiogRGlzdHJpYnV0ZSBtZW1iZXIgaW5pdGlhbGl6ZXIgY29kZSBpbnRvIGNvbnN0cnVjdG9ycyBhbmQgPGNsaW5pdD4KKyAgICAvKiogRGlzdHJpYnV0ZSBtZW1iZXIgaW5pdGlhbGl6ZXIgY29kZSBpbnRvIGNvbnN0cnVjdG9ycyBhbmQge0Bjb2RlIDxjbGluaXQ+fQogICAgICAqICBtZXRob2QuCiAgICAgICogIEBwYXJhbSBkZWZzICAgICAgICAgVGhlIGxpc3Qgb2YgY2xhc3MgbWVtYmVyIGRlY2xhcmF0aW9ucy4KICAgICAgKiAgQHBhcmFtIGMgICAgICAgICAgICBUaGUgZW5jbG9zaW5nIGNsYXNzLgpAQCAtNjg5LDcgKzY4OSw3IEBACiAgICAgICogIHNob3VsZCBiZSBlbWl0dGVkLCBpZiBzbywgcHV0IGEgbmV3IGVudHJ5IGludG8gQ1JUYWJsZQogICAgICAqICBhbmQgY2FsbCBtZXRob2QgdG8gZ2VuZXJhdGUgYnl0ZWNvZGUuCiAgICAgICogIElmIG5vdCwganVzdCBjYWxsIG1ldGhvZCB0byBnZW5lcmF0ZSBieXRlY29kZS4KLSAgICAgKiAgQHNlZSAgICAjZ2VuU3RhdChUcmVlLCBFbnYpCisgICAgICogIEBzZWUgICAgI2dlblN0YXQoSkNUcmVlLCBFbnYpCiAgICAgICoKICAgICAgKiAgQHBhcmFtICB0cmVlICAgICBUaGUgdHJlZSB0byBiZSB2aXNpdGVkLgogICAgICAqICBAcGFyYW0gIGVudiAgICAgIFRoZSBlbnZpcm9ubWVudCB0byB1c2UuCkBAIC03NTYsNyArNzU2LDcgQEAKICAgICAgKiAgc2hvdWxkIGJlIGVtaXR0ZWQsIGlmIHNvLCBwdXQgYSBuZXcgZW50cnkgaW50byBDUlRhYmxlCiAgICAgICogIGFuZCBjYWxsIG1ldGhvZCB0byBnZW5lcmF0ZSBieXRlY29kZS4KICAgICAgKiAgSWYgbm90LCBqdXN0IGNhbGwgbWV0aG9kIHRvIGdlbmVyYXRlIGJ5dGVjb2RlLgotICAgICAqICBAc2VlICAgICNnZW5Db25kKFRyZWUsYm9vbGVhbikKKyAgICAgKiAgQHNlZSAgICAjZ2VuQ29uZChKQ1RyZWUsYm9vbGVhbikKICAgICAgKgogICAgICAqICBAcGFyYW0gIHRyZWUgICAgIFRoZSB0cmVlIHRvIGJlIHZpc2l0ZWQuCiAgICAgICogIEBwYXJhbSAgY3J0RmxhZ3MgVGhlIENoYXJhY3RlclJhbmdlVGFibGUgZmxhZ3MKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL21haW4vSmF2YUNvbXBpbGVyLmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy9tYWluL0phdmFDb21waWxlci5qYXZhCmluZGV4IDY1YzE2ZjAuLjE1MDc0NmEgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL21haW4vSmF2YUNvbXBpbGVyLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvbWFpbi9KYXZhQ29tcGlsZXIuamF2YQpAQCAtNjA3LDcgKzYwNyw3IEBACiAKICAgICAvKiogUGFyc2UgY29udGVudHMgb2YgaW5wdXQgc3RyZWFtLgogICAgICAqICBAcGFyYW0gZmlsZW5hbWUgICAgIFRoZSBuYW1lIG9mIHRoZSBmaWxlIGZyb20gd2hpY2ggaW5wdXQgc3RyZWFtIGNvbWVzLgotICAgICAqICBAcGFyYW0gaW5wdXQgICAgICAgIFRoZSBpbnB1dCBzdHJlYW0gdG8gYmUgcGFyc2VkLgorICAgICAqICBAcGFyYW0gY29udGVudCAgICAgIFRoZSBjaGFyYWN0ZXJzIHRvIGJlIHBhcnNlZC4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgSkNDb21waWxhdGlvblVuaXQgcGFyc2UoSmF2YUZpbGVPYmplY3QgZmlsZW5hbWUsIENoYXJTZXF1ZW5jZSBjb250ZW50KSB7CiAgICAgICAgIGxvbmcgbXNlYyA9IG5vdygpOwpAQCAtNzU1LDggKzc1NSw2IEBACiAgICAgLyoqIENvbXBsZXRlIGNvbXBpbGluZyBhIHNvdXJjZSBmaWxlIHRoYXQgaGFzIGJlZW4gYWNjZXNzZWQKICAgICAgKiAgYnkgdGhlIGNsYXNzIGZpbGUgcmVhZGVyLgogICAgICAqICBAcGFyYW0gYyAgICAgICAgICBUaGUgY2xhc3MgdGhlIHNvdXJjZSBmaWxlIG9mIHdoaWNoIG5lZWRzIHRvIGJlIGNvbXBpbGVkLgotICAgICAqICBAcGFyYW0gZmlsZW5hbWUgICBUaGUgbmFtZSBvZiB0aGUgc291cmNlIGZpbGUuCi0gICAgICogIEBwYXJhbSBmICAgICAgICAgIEFuIGlucHV0IHN0cmVhbSB0aGF0IHJlYWRzIHRoZSBzb3VyY2UgZmlsZS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjb21wbGV0ZShDbGFzc1N5bWJvbCBjKSB0aHJvd3MgQ29tcGxldGlvbkZhaWx1cmUgewogLy8gICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImNvbXBsZXRpbmcgIiArIGMpOy8vREVCVUcKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL21vZGVsL0Fubm90YXRpb25Qcm94eU1ha2VyLmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy9tb2RlbC9Bbm5vdGF0aW9uUHJveHlNYWtlci5qYXZhCmluZGV4IDkyZTFjMTcuLmRkODZlYzIgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL21vZGVsL0Fubm90YXRpb25Qcm94eU1ha2VyLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvbW9kZWwvQW5ub3RhdGlvblByb3h5TWFrZXIuamF2YQpAQCAtMjUsOSArMjUsOCBAQAogCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuamF2YWMubW9kZWw7CiAKLWltcG9ydCBjb20uc3VuLnRvb2xzLmphdmFjLnV0aWwuKjsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi4qOwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5OwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKQEAgLTM1LDEyICszNCwxNCBAQAogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgc3VuLnJlZmxlY3QuYW5ub3RhdGlvbi4qOwogCi1pbXBvcnQgamF2YXgubGFuZy5tb2RlbC50eXBlLlR5cGVNaXJyb3I7CiBpbXBvcnQgamF2YXgubGFuZy5tb2RlbC50eXBlLk1pcnJvcmVkVHlwZUV4Y2VwdGlvbjsKIGltcG9ydCBqYXZheC5sYW5nLm1vZGVsLnR5cGUuTWlycm9yZWRUeXBlc0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5sYW5nLm1vZGVsLnR5cGUuVHlwZU1pcnJvcjsKKwogaW1wb3J0IGNvbS5zdW4udG9vbHMuamF2YWMuY29kZS4qOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuamF2YWMuY29kZS5TeW1ib2wuKjsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmphdmFjLmNvZGUuVHlwZS5BcnJheVR5cGU7CitpbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy51dGlsLio7CiAKIAogLyoqCmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy9uaW8vUGF0aEZpbGVNYW5hZ2VyLmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy9uaW8vUGF0aEZpbGVNYW5hZ2VyLmphdmEKaW5kZXggNGFmZjU2MS4uNzYyYjhlZCAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvbmlvL1BhdGhGaWxlTWFuYWdlci5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL25pby9QYXRoRmlsZU1hbmFnZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI3LDEzICsyNywxNCBAQAogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVTeXN0ZW07CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlU3lzdGVtczsKIGltcG9ydCBqYXZhLm5pby5maWxlLlBhdGg7CiBpbXBvcnQgamF2YXgudG9vbHMuRmlsZU9iamVjdDsKIGltcG9ydCBqYXZheC50b29scy5KYXZhRmlsZU1hbmFnZXI7CiBpbXBvcnQgamF2YXgudG9vbHMuSmF2YUZpbGVPYmplY3Q7CiAKIC8qKgotICogIEZpbGUgbWFuYWdlciBiYXNlZCBvbiB7QGxpbmtwbGFpbiBGaWxlIGphdmEubmlvLmZpbGUuUGF0aH0uCisgKiAgRmlsZSBtYW5hZ2VyIGJhc2VkIG9uIHtAbGluayBqYXZhLm5pby5maWxlLlBhdGh9LgogICoKICAqICBFdmVudHVhbGx5LCB0aGlzIHNob3VsZCBiZSBtb3ZlZCB0byBqYXZheC50b29scy4KICAqICBBbHNvLCBKYXZhQ29tcGlsZXIgbWlnaHQgcmVhc29uYWJseSBwcm92aWRlIGEgbWV0aG9kIGdldFBhdGhGaWxlTWFuYWdlciwKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL25pby9QYXRoRmlsZU9iamVjdC5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvbmlvL1BhdGhGaWxlT2JqZWN0LmphdmEKaW5kZXggYTQ2ZTYzOS4uMzU3ZmM3NyAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvbmlvL1BhdGhGaWxlT2JqZWN0LmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvbmlvL1BhdGhGaWxlT2JqZWN0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0zOSw3ICszOSw2IEBACiBpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKIGltcG9ydCBqYXZhLm5pby5maWxlLkxpbmtPcHRpb247CiBpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoOwotaW1wb3J0IGphdmEubmlvLmZpbGUuYXR0cmlidXRlLkJhc2ljRmlsZUF0dHJpYnV0ZXM7CiBpbXBvcnQgamF2YXgubGFuZy5tb2RlbC5lbGVtZW50Lk1vZGlmaWVyOwogaW1wb3J0IGphdmF4LmxhbmcubW9kZWwuZWxlbWVudC5OZXN0aW5nS2luZDsKIGltcG9ydCBqYXZheC50b29scy5KYXZhRmlsZU9iamVjdDsKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL3BhcnNlci9KYXZhVG9rZW5pemVyLmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy9wYXJzZXIvSmF2YVRva2VuaXplci5qYXZhCmluZGV4IDdiNmNhNTcuLmY2ZGRmY2IgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL3BhcnNlci9KYXZhVG9rZW5pemVyLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvcGFyc2VyL0phdmFUb2tlbml6ZXIuamF2YQpAQCAtMTA4LDggKzEwOCw3IEBACiAgICAgICoge0Bjb2RlIGlucHV0W2lucHV0Lmxlbmd0aCAtMV19IGlzIGEgd2hpdGUgc3BhY2UgY2hhcmFjdGVyLgogICAgICAqCiAgICAgICogQHBhcmFtIGZhYyB0aGUgZmFjdG9yeSB3aGljaCBjcmVhdGVkIHRoaXMgU2Nhbm5lcgotICAgICAqIEBwYXJhbSBpbnB1dCB0aGUgaW5wdXQsIG1pZ2h0IGJlIG1vZGlmaWVkCi0gICAgICogQHBhcmFtIGlucHV0TGVuZ3RoIHRoZSBzaXplIG9mIHRoZSBpbnB1dC4KKyAgICAgKiBAcGFyYW0gYnVmIHRoZSBpbnB1dCwgbWlnaHQgYmUgbW9kaWZpZWQKICAgICAgKiBNdXN0IGJlIHBvc2l0aXZlIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gaW5wdXQubGVuZ3RoLgogICAgICAqLwogICAgIHByb3RlY3RlZCBKYXZhVG9rZW5pemVyKFNjYW5uZXJGYWN0b3J5IGZhYywgQ2hhckJ1ZmZlciBidWYpIHsKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL3BhcnNlci9KYXZhY1BhcnNlci5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvcGFyc2VyL0phdmFjUGFyc2VyLmphdmEKaW5kZXggYWFjODBjNS4uNjE2ZjAyMyAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvcGFyc2VyL0phdmFjUGFyc2VyLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvcGFyc2VyL0phdmFjUGFyc2VyLmphdmEKQEAgLTExNiw2ICsxMTYsOCBAQAogICAgICAgICAgICAgICAgIGZhYy5vcHRpb25zLmlzU2V0KCJhbGxvd0xhbWJkYSIpOyAvL3ByZS1sYW1iZGEgZ3VhcmQKICAgICAgICAgdGhpcy5hbGxvd01ldGhvZFJlZmVyZW5jZXMgPSBzb3VyY2UuYWxsb3dNZXRob2RSZWZlcmVuY2VzKCkgJiYKICAgICAgICAgICAgICAgICBmYWMub3B0aW9ucy5pc1NldCgiYWxsb3dNZXRob2RSZWZlcmVuY2VzIik7IC8vcHJlLWxhbWJkYSBndWFyZAorICAgICAgICB0aGlzLmFsbG93RGVmYXVsdE1ldGhvZHMgPSBzb3VyY2UuYWxsb3dEZWZhdWx0TWV0aG9kcygpICYmCisgICAgICAgICAgICAgICAgZmFjLm9wdGlvbnMuaXNTZXQoImFsbG93RGVmYXVsdE1ldGhvZHMiKTsgLy9wcmUtbGFtYmRhIGd1YXJkCiAgICAgICAgIHRoaXMua2VlcERvY0NvbW1lbnRzID0ga2VlcERvY0NvbW1lbnRzOwogICAgICAgICBkb2NDb21tZW50cyA9IG5ld0RvY0NvbW1lbnRUYWJsZShrZWVwRG9jQ29tbWVudHMpOwogICAgICAgICB0aGlzLmtlZXBMaW5lTWFwID0ga2VlcExpbmVNYXA7CkBAIC0xODUsNiArMTg3LDEwIEBACiAgICAgICovCiAgICAgYm9vbGVhbiBhbGxvd01ldGhvZFJlZmVyZW5jZXM7CiAKKyAgICAvKiogU3dpdGNoOiBzaG91bGQgd2UgYWxsb3cgZGVmYXVsdCBtZXRob2RzIGluIGludGVyZmFjZXM/CisgICAgICovCisgICAgYm9vbGVhbiBhbGxvd0RlZmF1bHRNZXRob2RzOworCiAgICAgLyoqIFN3aXRjaDogc2hvdWxkIHdlIGtlZXAgZG9jQ29tbWVudHM/CiAgICAgICovCiAgICAgYm9vbGVhbiBrZWVwRG9jQ29tbWVudHM7CkBAIC04MDYsNyArODEyLDcgQEAKICAgICAgICAgdCA9IG9kU3RhY2tbMF07CiAKICAgICAgICAgaWYgKHQuaGFzVGFnKEpDVHJlZS5UYWcuUExVUykpIHsKLSAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBmb2xkU3RyaW5ncyh0KTsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmID0gZm9sZFN0cmluZ3ModCk7CiAgICAgICAgICAgICBpZiAoYnVmICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICB0ID0gdG9QKEYuYXQoc3RhcnRQb3MpLkxpdGVyYWwoVHlwZVRhZ3MuQ0xBU1MsIGJ1Zi50b1N0cmluZygpKSk7CiAgICAgICAgICAgICB9CkBAIC04MzMsNyArODM5LDcgQEAKICAgICAgICAgLyoqIElmIHRyZWUgaXMgYSBjb25jYXRlbmF0aW9uIG9mIHN0cmluZyBsaXRlcmFscywgcmVwbGFjZSBpdAogICAgICAgICAgKiAgYnkgYSBzaW5nbGUgbGl0ZXJhbCByZXByZXNlbnRpbmcgdGhlIGNvbmNhdGVuYXRlZCBzdHJpbmcuCiAgICAgICAgICAqLwotICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nQnVmZmVyIGZvbGRTdHJpbmdzKEpDVHJlZSB0cmVlKSB7CisgICAgICAgIHByb3RlY3RlZCBTdHJpbmdCdWlsZGVyIGZvbGRTdHJpbmdzKEpDVHJlZSB0cmVlKSB7CiAgICAgICAgICAgICBpZiAoIWFsbG93U3RyaW5nRm9sZGluZykKICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBidWYgPSBMaXN0Lm5pbCgpOwpAQCAtODQxLDggKzg0Nyw4IEBACiAgICAgICAgICAgICAgICAgaWYgKHRyZWUuaGFzVGFnKExJVEVSQUwpKSB7CiAgICAgICAgICAgICAgICAgICAgIEpDTGl0ZXJhbCBsaXQgPSAoSkNMaXRlcmFsKSB0cmVlOwogICAgICAgICAgICAgICAgICAgICBpZiAobGl0LnR5cGV0YWcgPT0gVHlwZVRhZ3MuQ0xBU1MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYnVmID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nQnVmZmVyKChTdHJpbmcpbGl0LnZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2J1ZiA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ0J1aWxkZXIoKFN0cmluZylsaXQudmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGJ1Zi5ub25FbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2J1Zi5hcHBlbmQoYnVmLmhlYWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiA9IGJ1Zi50YWlsOwpAQCAtMjMxMSw2ICsyMzE3LDcgQEAKICAgICAgICAgICAgIGNhc2UgU1lOQ0hST05JWkVEOiBmbGFnID0gRmxhZ3MuU1lOQ0hST05JWkVEOyBicmVhazsKICAgICAgICAgICAgIGNhc2UgU1RSSUNURlAgICAgOiBmbGFnID0gRmxhZ3MuU1RSSUNURlA7IGJyZWFrOwogICAgICAgICAgICAgY2FzZSBNT05LRVlTX0FUICA6IGZsYWcgPSBGbGFncy5BTk5PVEFUSU9OOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgREVGQVVMVCAgICAgOiBjaGVja0RlZmF1bHRNZXRob2RzKCk7IGZsYWcgPSBGbGFncy5ERUZBVUxUOyBicmVhazsKICAgICAgICAgICAgIGNhc2UgRVJST1IgICAgICAgOiBmbGFnID0gMDsgbmV4dFRva2VuKCk7IGJyZWFrOwogICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgbG9vcDsKICAgICAgICAgICAgIH0KQEAgLTMzNjEsNiArMzM2OCwxMiBAQAogICAgICAgICAgICAgYWxsb3dNZXRob2RSZWZlcmVuY2VzID0gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KKyAgICB2b2lkIGNoZWNrRGVmYXVsdE1ldGhvZHMoKSB7CisgICAgICAgIGlmICghYWxsb3dEZWZhdWx0TWV0aG9kcykgeworICAgICAgICAgICAgbG9nLmVycm9yKHRva2VuLnBvcywgImRlZmF1bHQubWV0aG9kcy5ub3Quc3VwcG9ydGVkLmluLnNvdXJjZSIsIHNvdXJjZS5uYW1lKTsKKyAgICAgICAgICAgIGFsbG93RGVmYXVsdE1ldGhvZHMgPSB0cnVlOworICAgICAgICB9CisgICAgfQogCiAgICAgLyoKICAgICAgKiBhIGZ1bmN0aW9uYWwgc291cmNlIHRyZWUgYW5kIGVuZCBwb3NpdGlvbiBtYXBwaW5ncwpkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvcGFyc2VyL1NjYW5uZXIuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL3BhcnNlci9TY2FubmVyLmphdmEKaW5kZXggOTNiMmU4YS4uMjBjNDllNiAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvcGFyc2VyL1NjYW5uZXIuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy9wYXJzZXIvU2Nhbm5lci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMTk5OSwgMjAxMSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5OSwgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtNjYsOCArNjYsNyBAQAogICAgICAqIHtAY29kZSBpbnB1dFtpbnB1dC5sZW5ndGggLTFdfSBpcyBhIHdoaXRlIHNwYWNlIGNoYXJhY3Rlci4KICAgICAgKgogICAgICAqIEBwYXJhbSBmYWMgdGhlIGZhY3Rvcnkgd2hpY2ggY3JlYXRlZCB0aGlzIFNjYW5uZXIKLSAgICAgKiBAcGFyYW0gaW5wdXQgdGhlIGlucHV0LCBtaWdodCBiZSBtb2RpZmllZAotICAgICAqIEBwYXJhbSBpbnB1dExlbmd0aCB0aGUgc2l6ZSBvZiB0aGUgaW5wdXQuCisgICAgICogQHBhcmFtIGJ1ZiB0aGUgaW5wdXQsIG1pZ2h0IGJlIG1vZGlmaWVkCiAgICAgICogTXVzdCBiZSBwb3NpdGl2ZSBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGlucHV0Lmxlbmd0aC4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgU2Nhbm5lcihTY2FubmVyRmFjdG9yeSBmYWMsIENoYXJCdWZmZXIgYnVmKSB7CmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy9wYXJzZXIvVW5pY29kZVJlYWRlci5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvcGFyc2VyL1VuaWNvZGVSZWFkZXIuamF2YQppbmRleCAwN2I4YzVjLi44NGU2NzkyIDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy9wYXJzZXIvVW5pY29kZVJlYWRlci5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL3BhcnNlci9Vbmljb2RlUmVhZGVyLmphdmEKQEAgLTc3LDkgKzc3LDggQEAKICAgICAgKiB0aGF0IHtAY29kZSBpbnB1dExlbmd0aCA8IGlucHV0Lmxlbmd0aH0gb3IKICAgICAgKiB7QGNvZGUgaW5wdXRbaW5wdXQubGVuZ3RoIC0xXX0gaXMgYSB3aGl0ZSBzcGFjZSBjaGFyYWN0ZXIuCiAgICAgICoKLSAgICAgKiBAcGFyYW0gZmFjIHRoZSBmYWN0b3J5IHdoaWNoIGNyZWF0ZWQgdGhpcyBTY2FubmVyCi0gICAgICogQHBhcmFtIGlucHV0IHRoZSBpbnB1dCwgbWlnaHQgYmUgbW9kaWZpZWQKLSAgICAgKiBAcGFyYW0gaW5wdXRMZW5ndGggdGhlIHNpemUgb2YgdGhlIGlucHV0LgorICAgICAqIEBwYXJhbSBzZiB0aGUgZmFjdG9yeSB3aGljaCBjcmVhdGVkIHRoaXMgU2Nhbm5lcgorICAgICAqIEBwYXJhbSBidWZmZXIgdGhlIGlucHV0LCBtaWdodCBiZSBtb2RpZmllZAogICAgICAqIE11c3QgYmUgcG9zaXRpdmUgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byBpbnB1dC5sZW5ndGguCiAgICAgICovCiAgICAgcHJvdGVjdGVkIFVuaWNvZGVSZWFkZXIoU2Nhbm5lckZhY3Rvcnkgc2YsIENoYXJCdWZmZXIgYnVmZmVyKSB7CkBAIC0yNTUsMTYgKzI1NCwxNiBAQAogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyBhIGNvcHkgb2YgYSBjaGFyYWN0ZXIgYXJyYXkgc3Vic2V0IG9mIHRoZSBpbnB1dCBidWZmZXIuCi0gICAgICogVGhlIHJldHVybmVkIGFycmF5IGJlZ2lucyBhdCB0aGUgPGNvZGU+YmVnaW5JbmRleDwvY29kZT4gYW5kCi0gICAgICogZXh0ZW5kcyB0byB0aGUgY2hhcmFjdGVyIGF0IGluZGV4IDxjb2RlPmVuZEluZGV4IC0gMTwvY29kZT4uCi0gICAgICogVGh1cyB0aGUgbGVuZ3RoIG9mIHRoZSBzdWJzdHJpbmcgaXMgPGNvZGU+ZW5kSW5kZXgtYmVnaW5JbmRleDwvY29kZT4uCisgICAgICogVGhlIHJldHVybmVkIGFycmF5IGJlZ2lucyBhdCB0aGUge0Bjb2RlIGJlZ2luSW5kZXh9IGFuZAorICAgICAqIGV4dGVuZHMgdG8gdGhlIGNoYXJhY3RlciBhdCBpbmRleCB7QGNvZGUgZW5kSW5kZXggLSAxfS4KKyAgICAgKiBUaHVzIHRoZSBsZW5ndGggb2YgdGhlIHN1YnN0cmluZyBpcyB7QGNvZGUgZW5kSW5kZXgtYmVnaW5JbmRleH0uCiAgICAgICogVGhpcyBiZWhhdmlvciBpcyBsaWtlCi0gICAgICogPGNvZGU+U3RyaW5nLnN1YnN0cmluZyhiZWdpbkluZGV4LCBlbmRJbmRleCk8L2NvZGU+LgorICAgICAqIHtAY29kZSBTdHJpbmcuc3Vic3RyaW5nKGJlZ2luSW5kZXgsIGVuZEluZGV4KX0uCiAgICAgICogVW5pY29kZSBlc2NhcGUgc2VxdWVuY2VzIGFyZSBub3QgdHJhbnNsYXRlZC4KICAgICAgKgogICAgICAqIEBwYXJhbSBiZWdpbkluZGV4IHRoZSBiZWdpbm5pbmcgaW5kZXgsIGluY2x1c2l2ZS4KICAgICAgKiBAcGFyYW0gZW5kSW5kZXggdGhlIGVuZGluZyBpbmRleCwgZXhjbHVzaXZlLgotICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kcyBpZiBlaXRoZXIgb2Zmc2V0IGlzIG91dHNpZGUgb2YgdGhlCisgICAgICogQHRocm93cyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgZWl0aGVyIG9mZnNldCBpcyBvdXRzaWRlIG9mIHRoZQogICAgICAqICAgICAgICAgYXJyYXkgYm91bmRzCiAgICAgICovCiAgICAgcHVibGljIGNoYXJbXSBnZXRSYXdDaGFyYWN0ZXJzKGludCBiZWdpbkluZGV4LCBpbnQgZW5kSW5kZXgpIHsKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL3Byb2Nlc3NpbmcvSmF2YWNSb3VuZEVudmlyb25tZW50LmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy9wcm9jZXNzaW5nL0phdmFjUm91bmRFbnZpcm9ubWVudC5qYXZhCmluZGV4IDE4Nzc5YTIuLjE1N2Y3ZWIgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL3Byb2Nlc3NpbmcvSmF2YWNSb3VuZEVudmlyb25tZW50LmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvcHJvY2Vzc2luZy9KYXZhY1JvdW5kRW52aXJvbm1lbnQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTEsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTEwNSw3ICsxMDUsNyBAQAogICAgICAqIE9ubHkgdHlwZSBlbGVtZW50cyA8aT5pbmNsdWRlZDwvaT4gaW4gdGhpcyByb3VuZCBvZiBhbm5vdGF0aW9uCiAgICAgICogcHJvY2Vzc2luZywgb3IgZGVjbGFyYXRpb25zIG9mIG1lbWJlcnMsIHBhcmFtZXRlcnMsIG9yIHR5cGUKICAgICAgKiBwYXJhbWV0ZXJzIGRlY2xhcmVkIHdpdGhpbiB0aG9zZSwgYXJlIHJldHVybmVkLiAgSW5jbHVkZWQgdHlwZQotICAgICAqIGVsZW1lbnRzIGFyZSB7QGxpbmtwbGFpbiAjZ2V0U3BlY2lmaWVkVHlwZUVsZW1lbnRzIHNwZWNpZmllZAorICAgICAqIGVsZW1lbnRzIGFyZSB7QGxpbmtwbGFpbiAjZ2V0Um9vdEVsZW1lbnRzIHNwZWNpZmllZAogICAgICAqIHR5cGVzfSBhbmQgYW55IHR5cGVzIG5lc3RlZCB3aXRoaW4gdGhlbS4KICAgICAgKgogICAgICAqIEBwYXJhbSBhICBhbm5vdGF0aW9uIHR5cGUgYmVpbmcgcmVxdWVzdGVkCmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy9wcm9jZXNzaW5nL1NlcnZpY2VQcm94eS5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvcHJvY2Vzc2luZy9TZXJ2aWNlUHJveHkuamF2YQppbmRleCBlM2NkN2FkLi5lYTZkOWEwIDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy9wcm9jZXNzaW5nL1NlcnZpY2VQcm94eS5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL3Byb2Nlc3NpbmcvU2VydmljZVByb3h5LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC03Miw3ICs3Miw3IEBACiAgICAgICogICAgICAgICBUaGUgc2VydmljZSBjbGFzcyBmb3Igd2hpY2ggcHJvdmlkZXJzIGFyZSBiZWluZyBzb3VnaHQ7CiAgICAgICogICAgICAgICB1c2VkIHRvIGNvbnN0cnVjdCBlcnJvciBkZXRhaWwgc3RyaW5ncwogICAgICAqCi0gICAgICogQHBhcmFtICB1cmwKKyAgICAgKiBAcGFyYW0gIHUKICAgICAgKiAgICAgICAgIFRoZSBVUkwgbmFtaW5nIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgdG8gYmUgcGFyc2VkCiAgICAgICoKICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG5hbWUgb2YgYSBzZXJ2aWNlIGlzIGZvdW5kCmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy9yZXNvdXJjZXMvY29tcGlsZXIucHJvcGVydGllcyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL3Jlc291cmNlcy9jb21waWxlci5wcm9wZXJ0aWVzCmluZGV4IDUxNDBkZTIuLmYzNDk1MDQgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL3Jlc291cmNlcy9jb21waWxlci5wcm9wZXJ0aWVzCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL3Jlc291cmNlcy9jb21waWxlci5wcm9wZXJ0aWVzCkBAIC0yMTc0LDYgKzIxNzQsMTEgQEAKICAgICBtZXRob2QgcmVmZXJlbmNlcyBhcmUgbm90IHN1cHBvcnRlZCBpbiAtc291cmNlIHswfVxuXAogICAgICh1c2UgLXNvdXJjZSA4IG9yIGhpZ2hlciB0byBlbmFibGUgbWV0aG9kIHJlZmVyZW5jZXMpCiAKKyMgMDogc3RyaW5nCitjb21waWxlci5lcnIuZGVmYXVsdC5tZXRob2RzLm5vdC5zdXBwb3J0ZWQuaW4uc291cmNlPVwKKyAgICBkZWZhdWx0IG1ldGhvZHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gLXNvdXJjZSB7MH1cblwKKyAgICAodXNlIC1zb3VyY2UgOCBvciBoaWdoZXIgdG8gZW5hYmxlIGRlZmF1bHQgbWV0aG9kcykKKwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyBEaWFnbm9zdGljcyBmb3IgdmVyYm9zZSByZXNvbHV0aW9uCiAjIHVzZWQgYnkgUmVzb2x2ZSAoZGVidWcgb25seSkKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL3RyZWUvSkNUcmVlLmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy90cmVlL0pDVHJlZS5qYXZhCmluZGV4IDM0OTRmM2IuLmQ4MDA4ZDcgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL3RyZWUvSkNUcmVlLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvdHJlZS9KQ1RyZWUuamF2YQpAQCAtNDY0LDMyICs0NjQsMjkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBFdmVyeXRoaW5nIGluIG9uZSBzb3VyY2UgZmlsZSBpcyBrZXB0IGluIGEgVG9wTGV2ZWwgc3RydWN0dXJlLgotICAgICAqIEBwYXJhbSBwaWQgICAgICAgICAgICAgIFRoZSB0cmVlIHJlcHJlc2VudGluZyB0aGUgcGFja2FnZSBjbGF1c2UuCi0gICAgICogQHBhcmFtIHNvdXJjZWZpbGUgICAgICAgVGhlIHNvdXJjZSBmaWxlIG5hbWUuCi0gICAgICogQHBhcmFtIGRlZnMgICAgICAgICAgICAgQWxsIGRlZmluaXRpb25zIGluIHRoaXMgZmlsZSAoQ2xhc3NEZWYsIEltcG9ydCwgYW5kIFNraXApCi0gICAgICogQHBhcmFtIHBhY2tnZSAgICAgICAgICAgVGhlIHBhY2thZ2UgaXQgYmVsb25ncyB0by4KLSAgICAgKiBAcGFyYW0gbmFtZWRJbXBvcnRTY29wZSBBIHNjb3BlIGZvciBhbGwgbmFtZWQgaW1wb3J0cy4KLSAgICAgKiBAcGFyYW0gc3RhckltcG9ydFNjb3BlICBBIHNjb3BlIGZvciBhbGwgaW1wb3J0LW9uLWRlbWFuZHMuCi0gICAgICogQHBhcmFtIGxpbmVNYXAgICAgICAgICAgTGluZSBzdGFydGluZyBwb3NpdGlvbnMsIGRlZmluZWQgb25seQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG9wdGlvbiAtZyBpcyBzZXQuCi0gICAgICogQHBhcmFtIGRvY0NvbW1lbnRzICAgICAgQSBoYXNodGFibGUgdGhhdCBzdG9yZXMgYWxsIGRvY3VtZW50YXRpb24gY29tbWVudHMKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleGVkIGJ5IHRoZSB0cmVlIG5vZGVzIHRoZXkgcmVmZXIgdG8uCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5lZCBvbmx5IGlmIG9wdGlvbiAtcyBpcyBzZXQuCi0gICAgICogQHBhcmFtIGVuZFBvc2l0aW9ucyAgICAgQW4gb2JqZWN0IGVuY2Fwc3VsYXRpbmcgZW5kaW5nIHBvc2l0aW9ucyBvZiBzb3VyY2UKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZXMgaW5kZXhlZCBieSB0aGUgdHJlZSBub2RlcyB0aGV5IGJlbG9uZyB0by4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBEZWZpbmVkIG9ubHkgaWYgb3B0aW9uIC1YamNvdiBpcyBzZXQuCisgICAgICogRXZlcnl0aGluZyBpbiBvbmUgc291cmNlIGZpbGUgaXMga2VwdCBpbiBhIHtAbGlua3BsYWluIEpDQ29tcGlsYXRpb25Vbml0fSBzdHJ1Y3R1cmUuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKQ0NvbXBpbGF0aW9uVW5pdCBleHRlbmRzIEpDVHJlZSBpbXBsZW1lbnRzIENvbXBpbGF0aW9uVW5pdFRyZWUgewogICAgICAgICBwdWJsaWMgTGlzdDxKQ0Fubm90YXRpb24+IHBhY2thZ2VBbm5vdGF0aW9uczsKKyAgICAgICAgLyoqIFRoZSB0cmVlIHJlcHJlc2VudGluZyB0aGUgcGFja2FnZSBjbGF1c2UuICovCiAgICAgICAgIHB1YmxpYyBKQ0V4cHJlc3Npb24gcGlkOworICAgICAgICAvKiogQWxsIGRlZmluaXRpb25zIGluIHRoaXMgZmlsZSAoQ2xhc3NEZWYsIEltcG9ydCwgYW5kIFNraXApICovCiAgICAgICAgIHB1YmxpYyBMaXN0PEpDVHJlZT4gZGVmczsKKyAgICAgICAgLyogVGhlIHNvdXJjZSBmaWxlIG5hbWUuICovCiAgICAgICAgIHB1YmxpYyBKYXZhRmlsZU9iamVjdCBzb3VyY2VmaWxlOworICAgICAgICAvKiogVGhlIHBhY2thZ2UgdG8gd2hpY2ggdGhpcyBjb21waWxhdGlvbiB1bml0IGJlbG9uZ3MuICovCiAgICAgICAgIHB1YmxpYyBQYWNrYWdlU3ltYm9sIHBhY2tnZTsKKyAgICAgICAgLyoqIEEgc2NvcGUgZm9yIGFsbCBuYW1lZCBpbXBvcnRzLiAqLwogICAgICAgICBwdWJsaWMgSW1wb3J0U2NvcGUgbmFtZWRJbXBvcnRTY29wZTsKKyAgICAgICAgLyoqIEEgc2NvcGUgZm9yIGFsbCBpbXBvcnQtb24tZGVtYW5kcy4gKi8KICAgICAgICAgcHVibGljIFN0YXJJbXBvcnRTY29wZSBzdGFySW1wb3J0U2NvcGU7CisgICAgICAgIC8qKiBMaW5lIHN0YXJ0aW5nIHBvc2l0aW9ucywgZGVmaW5lZCBvbmx5IGlmIG9wdGlvbiAtZyBpcyBzZXQuICovCiAgICAgICAgIHB1YmxpYyBQb3NpdGlvbi5MaW5lTWFwIGxpbmVNYXAgPSBudWxsOworICAgICAgICAvKiogQSB0YWJsZSB0aGF0IHN0b3JlcyBhbGwgZG9jdW1lbnRhdGlvbiBjb21tZW50cyBpbmRleGVkIGJ5IHRoZSB0cmVlCisgICAgICAgICAqIG5vZGVzIHRoZXkgcmVmZXIgdG8uIGRlZmluZWQgb25seSBpZiBvcHRpb24gLXMgaXMgc2V0LiAqLwogICAgICAgICBwdWJsaWMgRG9jQ29tbWVudFRhYmxlIGRvY0NvbW1lbnRzID0gbnVsbDsKKyAgICAgICAgLyogQW4gb2JqZWN0IGVuY2Fwc3VsYXRpbmcgZW5kaW5nIHBvc2l0aW9ucyBvZiBzb3VyY2UgcmFuZ2VzIGluZGV4ZWQgYnkKKyAgICAgICAgICogdGhlIHRyZWUgbm9kZXMgdGhleSBiZWxvbmcgdG8uIERlZmluZWQgb25seSBpZiBvcHRpb24gLVhqY292IGlzIHNldC4gKi8KICAgICAgICAgcHVibGljIEVuZFBvc1RhYmxlIGVuZFBvc2l0aW9ucyA9IG51bGw7CiAgICAgICAgIHByb3RlY3RlZCBKQ0NvbXBpbGF0aW9uVW5pdChMaXN0PEpDQW5ub3RhdGlvbj4gcGFja2FnZUFubm90YXRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgSkNFeHByZXNzaW9uIHBpZCwKQEAgLTU1MCwxMCArNTQ3LDEwIEBACiAKICAgICAvKioKICAgICAgKiBBbiBpbXBvcnQgY2xhdXNlLgotICAgICAqIEBwYXJhbSBxdWFsaWQgICAgVGhlIGltcG9ydGVkIGNsYXNzKGVzKS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEpDSW1wb3J0IGV4dGVuZHMgSkNUcmVlIGltcGxlbWVudHMgSW1wb3J0VHJlZSB7CiAgICAgICAgIHB1YmxpYyBib29sZWFuIHN0YXRpY0ltcG9ydDsKKyAgICAgICAgLyoqIFRoZSBpbXBvcnRlZCBjbGFzcyhlcykuICovCiAgICAgICAgIHB1YmxpYyBKQ1RyZWUgcXVhbGlkOwogICAgICAgICBwcm90ZWN0ZWQgSkNJbXBvcnQoSkNUcmVlIHF1YWxpZCwgYm9vbGVhbiBpbXBvcnRTdGF0aWMpIHsKICAgICAgICAgICAgIHRoaXMucXVhbGlkID0gcXVhbGlkOwpAQCAtNjA1LDIxICs2MDIsMjEgQEAKIAogICAgIC8qKgogICAgICAqIEEgY2xhc3MgZGVmaW5pdGlvbi4KLSAgICAgKiBAcGFyYW0gbW9kaWZpZXJzIHRoZSBtb2RpZmllcnMKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY2xhc3MKLSAgICAgKiBAcGFyYW0gdHlwYXJhbXMgZm9ybWFsIGNsYXNzIHBhcmFtZXRlcnMKLSAgICAgKiBAcGFyYW0gZXh0ZW5kaW5nIHRoZSBjbGFzc2VzIHRoaXMgY2xhc3MgZXh0ZW5kcwotICAgICAqIEBwYXJhbSBpbXBsZW1lbnRpbmcgdGhlIGludGVyZmFjZXMgaW1wbGVtZW50ZWQgYnkgdGhpcyBjbGFzcwotICAgICAqIEBwYXJhbSBkZWZzIGFsbCB2YXJpYWJsZXMgYW5kIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGlzIGNsYXNzCi0gICAgICogQHBhcmFtIHN5bSB0aGUgc3ltYm9sCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKQ0NsYXNzRGVjbCBleHRlbmRzIEpDU3RhdGVtZW50IGltcGxlbWVudHMgQ2xhc3NUcmVlIHsKKyAgICAgICAgLyoqIHRoZSBtb2RpZmllcnMgKi8KICAgICAgICAgcHVibGljIEpDTW9kaWZpZXJzIG1vZHM7CisgICAgICAgIC8qKiB0aGUgbmFtZSBvZiB0aGUgY2xhc3MgKi8KICAgICAgICAgcHVibGljIE5hbWUgbmFtZTsKKyAgICAgICAgLyoqIGZvcm1hbCBjbGFzcyBwYXJhbWV0ZXJzICovCiAgICAgICAgIHB1YmxpYyBMaXN0PEpDVHlwZVBhcmFtZXRlcj4gdHlwYXJhbXM7CisgICAgICAgIC8qKiB0aGUgY2xhc3NlcyB0aGlzIGNsYXNzIGV4dGVuZHMgKi8KICAgICAgICAgcHVibGljIEpDRXhwcmVzc2lvbiBleHRlbmRpbmc7CisgICAgICAgIC8qKiB0aGUgaW50ZXJmYWNlcyBpbXBsZW1lbnRlZCBieSB0aGlzIGNsYXNzICovCiAgICAgICAgIHB1YmxpYyBMaXN0PEpDRXhwcmVzc2lvbj4gaW1wbGVtZW50aW5nOworICAgICAgICAvKiogYWxsIHZhcmlhYmxlcyBhbmQgbWV0aG9kcyBkZWZpbmVkIGluIHRoaXMgY2xhc3MgKi8KICAgICAgICAgcHVibGljIExpc3Q8SkNUcmVlPiBkZWZzOworICAgICAgICAvKiogdGhlIHN5bWJvbCAqLwogICAgICAgICBwdWJsaWMgQ2xhc3NTeW1ib2wgc3ltOwogICAgICAgICBwcm90ZWN0ZWQgSkNDbGFzc0RlY2woSkNNb2RpZmllcnMgbW9kcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgbmFtZSwKQEAgLTY3NiwyNCArNjczLDI1IEBACiAKICAgICAvKioKICAgICAgKiBBIG1ldGhvZCBkZWZpbml0aW9uLgotICAgICAqIEBwYXJhbSBtb2RpZmllcnMgbWV0aG9kIG1vZGlmaWVycwotICAgICAqIEBwYXJhbSBuYW1lIG1ldGhvZCBuYW1lCi0gICAgICogQHBhcmFtIHJlc3R5cGUgdHlwZSBvZiBtZXRob2QgcmV0dXJuIHZhbHVlCi0gICAgICogQHBhcmFtIHR5cGFyYW1zIHR5cGUgcGFyYW1ldGVycwotICAgICAqIEBwYXJhbSBwYXJhbXMgdmFsdWUgcGFyYW1ldGVycwotICAgICAqIEBwYXJhbSB0aHJvd24gZXhjZXB0aW9ucyB0aHJvd24gYnkgdGhpcyBtZXRob2QKLSAgICAgKiBAcGFyYW0gc3RhdHMgc3RhdGVtZW50cyBpbiB0aGUgbWV0aG9kCi0gICAgICogQHBhcmFtIHN5bSBtZXRob2Qgc3ltYm9sCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKQ01ldGhvZERlY2wgZXh0ZW5kcyBKQ1RyZWUgaW1wbGVtZW50cyBNZXRob2RUcmVlIHsKKyAgICAgICAgLyoqIG1ldGhvZCBtb2RpZmllcnMgKi8KICAgICAgICAgcHVibGljIEpDTW9kaWZpZXJzIG1vZHM7CisgICAgICAgIC8qKiBtZXRob2QgbmFtZSAqLwogICAgICAgICBwdWJsaWMgTmFtZSBuYW1lOworICAgICAgICAvKiogdHlwZSBvZiBtZXRob2QgcmV0dXJuIHZhbHVlICovCiAgICAgICAgIHB1YmxpYyBKQ0V4cHJlc3Npb24gcmVzdHlwZTsKKyAgICAgICAgLyoqIHR5cGUgcGFyYW1ldGVycyAqLwogICAgICAgICBwdWJsaWMgTGlzdDxKQ1R5cGVQYXJhbWV0ZXI+IHR5cGFyYW1zOworICAgICAgICAvKiogdmFsdWUgcGFyYW1ldGVycyAqLwogICAgICAgICBwdWJsaWMgTGlzdDxKQ1ZhcmlhYmxlRGVjbD4gcGFyYW1zOworICAgICAgICAvKiogZXhjZXB0aW9ucyB0aHJvd24gYnkgdGhpcyBtZXRob2QgKi8KICAgICAgICAgcHVibGljIExpc3Q8SkNFeHByZXNzaW9uPiB0aHJvd247CisgICAgICAgIC8qKiBzdGF0ZW1lbnRzIGluIHRoZSBtZXRob2QgKi8KICAgICAgICAgcHVibGljIEpDQmxvY2sgYm9keTsKLSAgICAgICAgcHVibGljIEpDRXhwcmVzc2lvbiBkZWZhdWx0VmFsdWU7IC8vIGZvciBhbm5vdGF0aW9uIHR5cGVzCisgICAgICAgIC8qKiBkZWZhdWx0IHZhbHVlLCBmb3IgYW5ub3RhdGlvbiB0eXBlcyAqLworICAgICAgICBwdWJsaWMgSkNFeHByZXNzaW9uIGRlZmF1bHRWYWx1ZTsKKyAgICAgICAgLyoqIG1ldGhvZCBzeW1ib2wgKi8KICAgICAgICAgcHVibGljIE1ldGhvZFN5bWJvbCBzeW07CiAgICAgICAgIHByb3RlY3RlZCBKQ01ldGhvZERlY2woSkNNb2RpZmllcnMgbW9kcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lIG5hbWUsCkBAIC03NDgsMTcgKzc0NiwxNyBAQAogCiAgICAgLyoqCiAgICAgICogQSB2YXJpYWJsZSBkZWZpbml0aW9uLgotICAgICAqIEBwYXJhbSBtb2RpZmllcnMgdmFyaWFibGUgbW9kaWZpZXJzCi0gICAgICogQHBhcmFtIG5hbWUgdmFyaWFibGUgbmFtZQotICAgICAqIEBwYXJhbSB2YXJ0eXBlIHR5cGUgb2YgdGhlIHZhcmlhYmxlCi0gICAgICogQHBhcmFtIGluaXQgdmFyaWFibGVzIGluaXRpYWwgdmFsdWUKLSAgICAgKiBAcGFyYW0gc3ltIHN5bWJvbAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSkNWYXJpYWJsZURlY2wgZXh0ZW5kcyBKQ1N0YXRlbWVudCBpbXBsZW1lbnRzIFZhcmlhYmxlVHJlZSB7CisgICAgICAgIC8qKiB2YXJpYWJsZSBtb2RpZmllcnMgKi8KICAgICAgICAgcHVibGljIEpDTW9kaWZpZXJzIG1vZHM7CisgICAgICAgIC8qKiB2YXJpYWJsZSBuYW1lICovCiAgICAgICAgIHB1YmxpYyBOYW1lIG5hbWU7CisgICAgICAgIC8qKiB0eXBlIG9mIHRoZSB2YXJpYWJsZSAqLwogICAgICAgICBwdWJsaWMgSkNFeHByZXNzaW9uIHZhcnR5cGU7CisgICAgICAgIC8qKiB2YXJpYWJsZSdzIGluaXRpYWwgdmFsdWUgKi8KICAgICAgICAgcHVibGljIEpDRXhwcmVzc2lvbiBpbml0OworICAgICAgICAvKiogc3ltYm9sICovCiAgICAgICAgIHB1YmxpYyBWYXJTeW1ib2wgc3ltOwogICAgICAgICBwcm90ZWN0ZWQgSkNWYXJpYWJsZURlY2woSkNNb2RpZmllcnMgbW9kcywKICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lIG5hbWUsCkBAIC04MTUsMTEgKzgxMywxMSBAQAogCiAgICAgLyoqCiAgICAgICogQSBzdGF0ZW1lbnQgYmxvY2suCi0gICAgICogQHBhcmFtIHN0YXRzIHN0YXRlbWVudHMKLSAgICAgKiBAcGFyYW0gZmxhZ3MgZmxhZ3MKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEpDQmxvY2sgZXh0ZW5kcyBKQ1N0YXRlbWVudCBpbXBsZW1lbnRzIEJsb2NrVHJlZSB7CisgICAgICAgIC8qKiBmbGFncyAqLwogICAgICAgICBwdWJsaWMgbG9uZyBmbGFnczsKKyAgICAgICAgLyoqIHN0YXRlbWVudHMgKi8KICAgICAgICAgcHVibGljIExpc3Q8SkNTdGF0ZW1lbnQ+IHN0YXRzOwogICAgICAgICAvKiogUG9zaXRpb24gb2YgY2xvc2luZyBicmFjZSwgb3B0aW9uYWwuICovCiAgICAgICAgIHB1YmxpYyBpbnQgZW5kcG9zID0gUG9zaXRpb24uTk9QT1M7CkBAIC0xMjA2LDkgKzEyMDQsOSBAQAogCiAgICAgLyoqCiAgICAgICogYW4gZXhwcmVzc2lvbiBzdGF0ZW1lbnQKLSAgICAgKiBAcGFyYW0gZXhwciBleHByZXNzaW9uIHN0cnVjdHVyZQogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSkNFeHByZXNzaW9uU3RhdGVtZW50IGV4dGVuZHMgSkNTdGF0ZW1lbnQgaW1wbGVtZW50cyBFeHByZXNzaW9uU3RhdGVtZW50VHJlZSB7CisgICAgICAgIC8qKiBleHByZXNzaW9uIHN0cnVjdHVyZSAqLwogICAgICAgICBwdWJsaWMgSkNFeHByZXNzaW9uIGV4cHI7CiAgICAgICAgIHByb3RlY3RlZCBKQ0V4cHJlc3Npb25TdGF0ZW1lbnQoSkNFeHByZXNzaW9uIGV4cHIpCiAgICAgICAgIHsKQEAgLTE3NzYsMTMgKzE3NzQsMTMgQEAKIAogICAgIC8qKgogICAgICAqIFNlbGVjdHMgdGhyb3VnaCBwYWNrYWdlcyBhbmQgY2xhc3NlcwotICAgICAqIEBwYXJhbSBzZWxlY3RlZCBzZWxlY3RlZCBUcmVlIGhpZXJhcmNoaWUKLSAgICAgKiBAcGFyYW0gc2VsZWN0b3IgbmFtZSBvZiBmaWVsZCB0byBzZWxlY3QgdGhydQotICAgICAqIEBwYXJhbSBzeW0gc3ltYm9sIG9mIHRoZSBzZWxlY3RlZCBjbGFzcwogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSkNGaWVsZEFjY2VzcyBleHRlbmRzIEpDRXhwcmVzc2lvbiBpbXBsZW1lbnRzIE1lbWJlclNlbGVjdFRyZWUgeworICAgICAgICAvKiogc2VsZWN0ZWQgVHJlZSBoaWVyYXJjaHkgKi8KICAgICAgICAgcHVibGljIEpDRXhwcmVzc2lvbiBzZWxlY3RlZDsKKyAgICAgICAgLyoqIG5hbWUgb2YgZmllbGQgdG8gc2VsZWN0IHRocnUgKi8KICAgICAgICAgcHVibGljIE5hbWUgbmFtZTsKKyAgICAgICAgLyoqIHN5bWJvbCBvZiB0aGUgc2VsZWN0ZWQgY2xhc3MgKi8KICAgICAgICAgcHVibGljIFN5bWJvbCBzeW07CiAgICAgICAgIHByb3RlY3RlZCBKQ0ZpZWxkQWNjZXNzKEpDRXhwcmVzc2lvbiBzZWxlY3RlZCwgTmFtZSBuYW1lLCBTeW1ib2wgc3ltKSB7CiAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkID0gc2VsZWN0ZWQ7CkBAIC0xODg1LDExICsxODgzLDExIEBACiAKICAgICAvKioKICAgICAgKiBBbiBpZGVudGlmaWVyCi0gICAgICogQHBhcmFtIGlkbmFtZSB0aGUgbmFtZQotICAgICAqIEBwYXJhbSBzeW0gdGhlIHN5bWJvbAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSkNJZGVudCBleHRlbmRzIEpDRXhwcmVzc2lvbiBpbXBsZW1lbnRzIElkZW50aWZpZXJUcmVlIHsKKyAgICAgICAgLyoqIHRoZSBuYW1lICovCiAgICAgICAgIHB1YmxpYyBOYW1lIG5hbWU7CisgICAgICAgIC8qKiB0aGUgc3ltYm9sICovCiAgICAgICAgIHB1YmxpYyBTeW1ib2wgc3ltOwogICAgICAgICBwcm90ZWN0ZWQgSkNJZGVudChOYW1lIG5hbWUsIFN5bWJvbCBzeW0pIHsKICAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CkBAIC0xOTEyLDEwICsxOTEwLDEwIEBACiAKICAgICAvKioKICAgICAgKiBBIGNvbnN0YW50IHZhbHVlIGdpdmVuIGxpdGVyYWxseS4KLSAgICAgKiBAcGFyYW0gdmFsdWUgdmFsdWUgcmVwcmVzZW50YXRpb24KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEpDTGl0ZXJhbCBleHRlbmRzIEpDRXhwcmVzc2lvbiBpbXBsZW1lbnRzIExpdGVyYWxUcmVlIHsKICAgICAgICAgcHVibGljIGludCB0eXBldGFnOworICAgICAgICAvKiogdmFsdWUgcmVwcmVzZW50YXRpb24gKi8KICAgICAgICAgcHVibGljIE9iamVjdCB2YWx1ZTsKICAgICAgICAgcHJvdGVjdGVkIEpDTGl0ZXJhbChpbnQgdHlwZXRhZywgT2JqZWN0IHZhbHVlKSB7CiAgICAgICAgICAgICB0aGlzLnR5cGV0YWcgPSB0eXBldGFnOwpAQCAtMTk3OCwxMCArMTk3NiwxMCBAQAogCiAgICAgLyoqCiAgICAgICogSWRlbnRpZmllcyBhIGJhc2ljIHR5cGUuCi0gICAgICogQHBhcmFtIHRhZyB0aGUgYmFzaWMgdHlwZSBpZAogICAgICAqIEBzZWUgVHlwZVRhZ3MKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEpDUHJpbWl0aXZlVHlwZVRyZWUgZXh0ZW5kcyBKQ0V4cHJlc3Npb24gaW1wbGVtZW50cyBQcmltaXRpdmVUeXBlVHJlZSB7CisgICAgICAgIC8qKiB0aGUgYmFzaWMgdHlwZSBpZCAqLwogICAgICAgICBwdWJsaWMgaW50IHR5cGV0YWc7CiAgICAgICAgIHByb3RlY3RlZCBKQ1ByaW1pdGl2ZVR5cGVUcmVlKGludCB0eXBldGFnKSB7CiAgICAgICAgICAgICB0aGlzLnR5cGV0YWcgPSB0eXBldGFnOwpAQCAtMjEwNSwxMSArMjEwMywxMSBAQAogCiAgICAgLyoqCiAgICAgICogQSBmb3JtYWwgY2xhc3MgcGFyYW1ldGVyLgotICAgICAqIEBwYXJhbSBuYW1lIG5hbWUKLSAgICAgKiBAcGFyYW0gYm91bmRzIGJvdW5kcwogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSkNUeXBlUGFyYW1ldGVyIGV4dGVuZHMgSkNUcmVlIGltcGxlbWVudHMgVHlwZVBhcmFtZXRlclRyZWUgeworICAgICAgICAvKiogbmFtZSAqLwogICAgICAgICBwdWJsaWMgTmFtZSBuYW1lOworICAgICAgICAvKiogYm91bmRzICovCiAgICAgICAgIHB1YmxpYyBMaXN0PEpDRXhwcmVzc2lvbj4gYm91bmRzOwogICAgICAgICBwcm90ZWN0ZWQgSkNUeXBlUGFyYW1ldGVyKE5hbWUgbmFtZSwgTGlzdDxKQ0V4cHJlc3Npb24+IGJvdW5kcykgewogICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL3RyZWUvUHJldHR5LmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy90cmVlL1ByZXR0eS5qYXZhCmluZGV4IDA0ZjRkNDcuLmM1MDFmN2EgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL3RyZWUvUHJldHR5LmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvdHJlZS9QcmV0dHkuamF2YQpAQCAtMjYsMTIgKzI2LDEwIEBACiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuamF2YWMudHJlZTsKIAogaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKIAogaW1wb3J0IGNvbS5zdW4uc291cmNlLnRyZWUuTWVtYmVyUmVmZXJlbmNlVHJlZS5SZWZlcmVuY2VNb2RlOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuamF2YWMuY29kZS4qOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuamF2YWMuY29kZS5TeW1ib2wuKjsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmphdmFjLnBhcnNlci5Ub2tlbnMuQ29tbWVudDsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmphdmFjLnRyZWUuSkNUcmVlLio7CiBpbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy51dGlsLio7CiBpbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy51dGlsLkxpc3Q7CkBAIC0yNTAsNyArMjQ4LDcgQEAKICAgICBwdWJsaWMgdm9pZCBwcmludEZsYWdzKGxvbmcgZmxhZ3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGlmICgoZmxhZ3MgJiBTWU5USEVUSUMpICE9IDApIHByaW50KCIvKnN5bnRoZXRpYyovICIpOwogICAgICAgICBwcmludChUcmVlSW5mby5mbGFnTmFtZXMoZmxhZ3MpKTsKLSAgICAgICAgaWYgKChmbGFncyAmIFN0YW5kYXJkRmxhZ3MpICE9IDApIHByaW50KCIgIik7CisgICAgICAgIGlmICgoZmxhZ3MgJiBFeHRlbmRlZFN0YW5kYXJkRmxhZ3MpICE9IDApIHByaW50KCIgIik7CiAgICAgICAgIGlmICgoZmxhZ3MgJiBBTk5PVEFUSU9OKSAhPSAwKSBwcmludCgiQCIpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvdHJlZS9UcmVlSW5mby5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvdHJlZS9UcmVlSW5mby5qYXZhCmluZGV4IDEyMGJmMmEuLjMxMTFiNmEgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL3RyZWUvVHJlZUluZm8uamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy90cmVlL1RyZWVJbmZvLmphdmEKQEAgLTc5MCw4ICs3OTAsOCBAQAogICAgICAqICBwcmU6IGZsYWdzICE9IDAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGxvbmcgZmlyc3RGbGFnKGxvbmcgZmxhZ3MpIHsKLSAgICAgICAgaW50IGZsYWcgPSAxOwotICAgICAgICB3aGlsZSAoKGZsYWcgJiBTdGFuZGFyZEZsYWdzKSAhPSAwICYmIChmbGFnICYgZmxhZ3MpID09IDApCisgICAgICAgIGxvbmcgZmxhZyA9IDE7CisgICAgICAgIHdoaWxlICgoZmxhZyAmIGZsYWdzICYgRXh0ZW5kZWRTdGFuZGFyZEZsYWdzKSA9PSAwKQogICAgICAgICAgICAgZmxhZyA9IGZsYWcgPDwgMTsKICAgICAgICAgcmV0dXJuIGZsYWc7CiAgICAgfQpAQCAtNzk5LDcgKzc5OSw3IEBACiAgICAgLyoqIFJldHVybiBmbGFncyBhcyBhIHN0cmluZywgc2VwYXJhdGVkIGJ5ICIgIi4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBmbGFnTmFtZXMobG9uZyBmbGFncykgewotICAgICAgICByZXR1cm4gRmxhZ3MudG9TdHJpbmcoZmxhZ3MgJiBTdGFuZGFyZEZsYWdzKS50cmltKCk7CisgICAgICAgIHJldHVybiBGbGFncy50b1N0cmluZyhmbGFncyAmIEV4dGVuZGVkU3RhbmRhcmRGbGFncykudHJpbSgpOwogICAgIH0KIAogICAgIC8qKiBPcGVyYXRvciBwcmVjZWRlbmNlcyB2YWx1ZXMuCmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy91dGlsL0Fic3RyYWN0RGlhZ25vc3RpY0Zvcm1hdHRlci5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvdXRpbC9BYnN0cmFjdERpYWdub3N0aWNGb3JtYXR0ZXIuamF2YQppbmRleCBjZWM0M2JkLi4wNmU2ZTQ2IDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy91dGlsL0Fic3RyYWN0RGlhZ25vc3RpY0Zvcm1hdHRlci5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL3V0aWwvQWJzdHJhY3REaWFnbm9zdGljRm9ybWF0dGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC00ODQsNyArNDg0LDcgQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIFRlbGxzIHdoZXRoZXIgdGhlIGNhcmV0IGRpc3BsYXkgaXMgYWN0aXZlIG9yIG5vdC4KICAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGNhcmV0RW5hYmxlZCBpZiB0cnVlIHRoZSBjYXJldCBpcyBlbmFibGVkCisgICAgICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY2FyZXQgaXMgZW5hYmxlZAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNDYXJldEVuYWJsZWQoKSB7CiAgICAgICAgICAgICByZXR1cm4gY2FyZXRFbmFibGVkOwpkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvdXRpbC9BYnN0cmFjdExvZy5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvdXRpbC9BYnN0cmFjdExvZy5qYXZhCmluZGV4IGNhMjVhNWIuLjA3ZjI0NGEgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL3V0aWwvQWJzdHJhY3RMb2cuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy91dGlsL0Fic3RyYWN0TG9nLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAxOTk5LCAyMDExLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk5LCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0xMzIsNyArMTMyLDYgQEAKIAogICAgIC8qKiBSZXBvcnQgYSB3YXJuaW5nLCB1bmxlc3Mgc3VwcHJlc3NlZCBieSB0aGUgIC1ub3dhcm4gb3B0aW9uIG9yIHRoZQogICAgICAqICBtYXhpbXVtIG51bWJlciBvZiB3YXJuaW5ncyBoYXMgYmVlbiByZWFjaGVkLgotICAgICAqICBAcGFyYW0gcG9zICAgIFRoZSBzb3VyY2UgcG9zaXRpb24gYXQgd2hpY2ggdG8gcmVwb3J0IHRoZSB3YXJuaW5nLgogICAgICAqICBAcGFyYW0ga2V5ICAgIFRoZSBrZXkgZm9yIHRoZSBsb2NhbGl6ZWQgd2FybmluZyBtZXNzYWdlLgogICAgICAqICBAcGFyYW0gYXJncyAgIEZpZWxkcyBvZiB0aGUgd2FybmluZyBtZXNzYWdlLgogICAgICAqLwpkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvdXRpbC9CYXNpY0RpYWdub3N0aWNGb3JtYXR0ZXIuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL3V0aWwvQmFzaWNEaWFnbm9zdGljRm9ybWF0dGVyLmphdmEKaW5kZXggY2VjNGI5NS4uN2IxMjAwOSAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvdXRpbC9CYXNpY0RpYWdub3N0aWNGb3JtYXR0ZXIuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy91dGlsL0Jhc2ljRGlhZ25vc3RpY0Zvcm1hdHRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtNjksNyArNjksNyBAQAogICAgIC8qKgogICAgICAqIENyZWF0ZSBhIGJhc2ljIGZvcm1hdHRlciBiYXNlZCBvbiB0aGUgc3VwcGxpZWQgb3B0aW9ucy4KICAgICAgKgotICAgICAqIEBwYXJhbSBvcHRzIGxpc3Qgb2YgY29tbWFuZC1saW5lIG9wdGlvbnMKKyAgICAgKiBAcGFyYW0gb3B0aW9ucyBsaXN0IG9mIGNvbW1hbmQtbGluZSBvcHRpb25zCiAgICAgICogQHBhcmFtIG1zZ3MgSmF2YWNNZXNzYWdlcyBvYmplY3QgdXNlZCBmb3IgaTE4bgogICAgICAqLwogICAgIHB1YmxpYyBCYXNpY0RpYWdub3N0aWNGb3JtYXR0ZXIoT3B0aW9ucyBvcHRpb25zLCBKYXZhY01lc3NhZ2VzIG1zZ3MpIHsKQEAgLTMyOSw3ICszMjksNyBAQAogICAgICAgICAgKiBTZXQgdGhlIGluZGVudGF0aW9uIGxldmVsIGZvciB2YXJpb3VzIGVsZW1lbnQgb2YgYSBnaXZlbiBkaWFnbm9zdGljIC0KICAgICAgICAgICogdGhpcyBtaWdodCBsZWFkIHRvIG1vcmUgcmVhZGFibGUgZGlhZ25vc3RpY3MKICAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGluZGVudGF0aW9uS2luZCBraW5kIG9mIGluZGVudGF0aW9uIHRvIGJlIHNldAorICAgICAgICAgKiBAcGFyYW0gZGlhZ1BhcnQKICAgICAgICAgICogQHBhcmFtIG5TcGFjZXMgYW1vdW50IG9mIHNwYWNlcyBmb3IgdGhlIHNwZWNpZmllZCBkaWFnbm9zdGljIHBhcnQKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyB2b2lkIHNldEluZGVudGF0aW9uKERpYWdub3N0aWNQYXJ0IGRpYWdQYXJ0LCBpbnQgblNwYWNlcykgewpAQCAtMzg0LDcgKzM4NCw3IEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBHZXQgYSBtZXRhY2hhciBzdHJpbmcgZm9yIGEgc3BlY2lmaWMgZm9ybWF0CiAgICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBzb3VyY2VQb3MgYSBwb3NpdGlvbmluZyB2YWx1ZSBmb3Igc291cmNlIGxpbmUKKyAgICAgICAgICogQHBhcmFtIGtpbmQgdGhlIGZvcm1hdCBraW5kIGZvciB3aGljaCB0byBnZXQgdGhlIG1ldGFjaGFyIHN0cmluZwogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIFN0cmluZyBnZXRGb3JtYXQoQmFzaWNGb3JtYXRLaW5kIGtpbmQpIHsKICAgICAgICAgICAgIHJldHVybiBhdmFpbGFibGVGb3JtYXRzLmdldChraW5kKTsKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL3V0aWwvQ29udGV4dC5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvdXRpbC9Db250ZXh0LmphdmEKaW5kZXggOTFhNGU2My4uOTMwMjY2MyAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvdXRpbC9Db250ZXh0LmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvdXRpbC9Db250ZXh0LmphdmEKQEAgLTQ0LDcgKzQ0LDcgQEAKICAqIGluc3RhbmNlIG1ldGhvZCB0aGF0IGlzIG92ZXJyaWRkZW4gaW4gZXh0ZW5kZWQgY29tcG9uZW50cy4gIEEgYmFzZQogICogcGhhc2Ugc3VwcG9ydGluZyBleHRlbnNpb24gd291bGQgbG9vayBzb21ldGhpbmcgbGlrZSB0aGlzOgogICoKLSAqIDxwPjxwcmU+CisgKiA8cD48cHJlPntAY29kZQogICogcHVibGljIGNsYXNzIFBoYXNlIHsKICAqICAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENvbnRleHQuS2V5PFBoYXNlPiBwaGFzZUtleSA9CiAgKiAgICAgICAgIG5ldyBDb250ZXh0LktleTxQaGFzZT4oKTsKQEAgLTYyLDcgKzYyLDcgQEAKICAqICAgICAgICAgLy8gb3RoZXIgaW50aXRpYWxpemF0aW9uIGZvbGxvd3MuLi4KICAqICAgICB9CiAgKiB9Ci0gKiA8L3ByZT4KKyAqIH08L3ByZT4KICAqCiAgKiA8cD5JbiB0aGUgY29tcGlsZXIsIHdlIHNpbXBseSB1c2UgUGhhc2UuaW5zdGFuY2UoY29udGV4dCkgdG8gZ2V0CiAgKiB0aGUgcmVmZXJlbmNlIHRvIHRoZSBwaGFzZS4gIEJ1dCBpbiBleHRlbnNpb25zIG9mIHRoZSBjb21waWxlciwgd2UKQEAgLTcwLDcgKzcwLDcgQEAKICAqIGFuZCB0aGlzIG11c3QgYmUgZG9uZSBiZWZvcmUgYW55IHJlZmVyZW5jZSB0byB0aGUgcGhhc2UgaXMgYWNjZXNzZWQKICAqIHVzaW5nIFBoYXNlLmluc3RhbmNlKCkuICBBbiBleHRlbmRlZCBwaGFzZSBtaWdodCBiZSBkZWNsYXJlZCB0aHVzOgogICoKLSAqIDxwPjxwcmU+CisgKiA8cD48cHJlPntAY29kZQogICogcHVibGljIGNsYXNzIE5ld1BoYXNlIGV4dGVuZHMgUGhhc2UgewogICogICAgIHByb3RlY3RlZCBOZXdQaGFzZShDb250ZXh0IGNvbnRleHQpIHsKICAqICAgICAgICAgc3VwZXIoY29udGV4dCk7CkBAIC04Myw3ICs4Myw3IEBACiAgKiAgICAgICAgIH0pOwogICogICAgIH0KICAqIH0KLSAqIDwvcHJlPgorICogfTwvcHJlPgogICoKICAqIDxwPkFuZCBpcyByZWdpc3RlcmVkIGVhcmx5IGluIHRoZSBleHRlbmRlZCBjb21waWxlciBsaWtlIHRoaXMKICAqCmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy91dGlsL0NvbnZlcnQuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL3V0aWwvQ29udmVydC5qYXZhCmluZGV4IDBjOWYyNTQuLmIyMjUzYWEgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL3V0aWwvQ29udmVydC5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL3V0aWwvQ29udmVydC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMTk5OSwgMjAwOCwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5OSwgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjYwLDcgKzI2MCw3IEBACiAgICAgICAgIHdoaWxlIChpIDwgbGVuKSB7CiAgICAgICAgICAgICBjaGFyIGNoID0gcy5jaGFyQXQoaSk7CiAgICAgICAgICAgICBpZiAoY2ggPiAyNTUpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKHMuc3Vic3RyaW5nKDAsIGkpKTsKICAgICAgICAgICAgICAgICB3aGlsZSAoaSA8IGxlbikgewogICAgICAgICAgICAgICAgICAgICBjaCA9IHMuY2hhckF0KGkpOwpkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvdXRpbC9EaWFnbm9zdGljU291cmNlLmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy91dGlsL0RpYWdub3N0aWNTb3VyY2UuamF2YQppbmRleCBkOGM5NGRlLi43ZjFiYWQzIDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy91dGlsL0RpYWdub3N0aWNTb3VyY2UuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy91dGlsL0RpYWdub3N0aWNTb3VyY2UuamF2YQpAQCAtMjgsMTIgKzI4LDEwIEBACiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmxhbmcucmVmLlNvZnRSZWZlcmVuY2U7CiBpbXBvcnQgamF2YS5uaW8uQ2hhckJ1ZmZlcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmF4LnRvb2xzLkphdmFGaWxlT2JqZWN0OwogCiBpbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy5maWxlLkphdmFjRmlsZU1hbmFnZXI7CiBpbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy50cmVlLkVuZFBvc1RhYmxlOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuamF2YWMudHJlZS5KQ1RyZWU7CiAKIGltcG9ydCBzdGF0aWMgY29tLnN1bi50b29scy5qYXZhYy51dGlsLkxheW91dENoYXJhY3RlcnMuKjsKIApkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvdXRpbC9KQ0RpYWdub3N0aWMuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL3V0aWwvSkNEaWFnbm9zdGljLmphdmEKaW5kZXggNzcwZWUwYi4uMTdjZTIzMSAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvdXRpbC9KQ0RpYWdub3N0aWMuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy91dGlsL0pDRGlhZ25vc3RpYy5qYXZhCkBAIC0yNyw3ICsyNyw2IEBACiAKIGltcG9ydCBqYXZhLnV0aWwuRW51bVNldDsKIGltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKIAogaW1wb3J0IGphdmF4LnRvb2xzLkRpYWdub3N0aWM7CkBAIC0yMTQsNyArMjEzLDYgQEAKICAgICAgICAgICogQ3JlYXRlIGEgbmV3IGRpYWdub3N0aWMgb2YgdGhlIGdpdmVuIGtpbmQsIHdoaWNoIGlzIG5vdCBtYW5kYXRvcnkgYW5kIHdoaWNoIGhhcwogICAgICAgICAgKiBubyBsaW50IGNhdGVnb3J5LgogICAgICAgICAgKiAgQHBhcmFtIGtpbmQgICAgICAgIFRoZSBkaWFnbm9zdGljIGtpbmQKLSAgICAgICAgICogIEBwYXJhbSBscyAgICAgICAgICBUaGUgbGludCBjYXRlZ29yeSwgaWYgYXBwbGljYWJsZSwgb3IgbnVsbAogICAgICAgICAgKiAgQHBhcmFtIHNvdXJjZSAgICAgIFRoZSBzb3VyY2Ugb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXQsIGlmIGFueSwgaW4gd2hpY2ggdG8gcmVwb3J0IHRoZSBtZXNzYWdlLgogICAgICAgICAgKiAgQHBhcmFtIHBvcyAgICAgICAgIFRoZSBzb3VyY2UgcG9zaXRpb24gYXQgd2hpY2ggdG8gcmVwb3J0IHRoZSBtZXNzYWdlLgogICAgICAgICAgKiAgQHBhcmFtIGtleSAgICAgICAgIFRoZSBrZXkgZm9yIHRoZSBsb2NhbGl6ZWQgbWVzc2FnZS4KQEAgLTIyOSw3ICsyMjcsNyBAQAogICAgICAgICAgKiBDcmVhdGUgYSBuZXcgZGlhZ25vc3RpYyBvZiB0aGUgZ2l2ZW4ga2luZC4KICAgICAgICAgICogIEBwYXJhbSBraW5kICAgICAgICBUaGUgZGlhZ25vc3RpYyBraW5kCiAgICAgICAgICAqICBAcGFyYW0gbGMgICAgICAgICAgVGhlIGxpbnQgY2F0ZWdvcnksIGlmIGFwcGxpY2FibGUsIG9yIG51bGwKLSAgICAgICAgICogIEBwYXJhbSBpc01hbmRhdG9yeSBpcyBkaWFnbm9zdGljIG1hbmRhdG9yeT8KKyAgICAgICAgICogIEBwYXJhbSBmbGFncyAgICAgICBUaGUgc2V0IG9mIGZsYWdzIGZvciB0aGUgZGlhZ25vc3RpYwogICAgICAgICAgKiAgQHBhcmFtIHNvdXJjZSAgICAgIFRoZSBzb3VyY2Ugb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXQsIGlmIGFueSwgaW4gd2hpY2ggdG8gcmVwb3J0IHRoZSBtZXNzYWdlLgogICAgICAgICAgKiAgQHBhcmFtIHBvcyAgICAgICAgIFRoZSBzb3VyY2UgcG9zaXRpb24gYXQgd2hpY2ggdG8gcmVwb3J0IHRoZSBtZXNzYWdlLgogICAgICAgICAgKiAgQHBhcmFtIGtleSAgICAgICAgIFRoZSBrZXkgZm9yIHRoZSBsb2NhbGl6ZWQgbWVzc2FnZS4KQEAgLTM2NCw3ICszNjIsNyBAQAogCiAgICAgLyoqCiAgICAgICogQ3JlYXRlIGEgZGlhZ25vc3RpYyBvYmplY3QuCi0gICAgICogQHBhcmFtIGZvbWF0dGVyIHRoZSBmb3JtYXR0ZXIgdG8gdXNlIGZvciB0aGUgZGlhZ25vc3RpYworICAgICAqIEBwYXJhbSBmb3JtYXR0ZXIgdGhlIGZvcm1hdHRlciB0byB1c2UgZm9yIHRoZSBkaWFnbm9zdGljCiAgICAgICogQHBhcmFtIGR0IHRoZSB0eXBlIG9mIGRpYWdub3N0aWMKICAgICAgKiBAcGFyYW0gbGMgICAgIHRoZSBsaW50IGNhdGVnb3J5IGZvciB0aGUgZGlhZ25vc3RpYwogICAgICAqIEBwYXJhbSBzb3VyY2UgdGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlLCBvciBudWxsIGlmIG5vbmUuCmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy91dGlsL0xpc3QuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL3V0aWwvTGlzdC5qYXZhCmluZGV4IGUyNTZjMzcuLjcyZTM2YzggMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL3V0aWwvTGlzdC5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL3V0aWwvTGlzdC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMTk5OSwgMjAxMSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5OSwgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjg3LDcgKzI4Nyw3IEBACiAgICAgICAgIGlmIChpc0VtcHR5KCkpIHsKICAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAgICAgICAgICAgICBidWYuYXBwZW5kKGhlYWQpOwogICAgICAgICAgICAgZm9yIChMaXN0PEE+IGwgPSB0YWlsOyBsLm5vbkVtcHR5KCk7IGwgPSBsLnRhaWwpIHsKICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKHNlcCk7CmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy91dGlsL1Bvc2l0aW9uLmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy91dGlsL1Bvc2l0aW9uLmphdmEKaW5kZXggMjcxNDY3MS4uZjVmYzM5ZiAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWMvdXRpbC9Qb3NpdGlvbi5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL3V0aWwvUG9zaXRpb24uamF2YQpAQCAtODAsMTEgKzgwLDExIEBACiAKICAgICAvKiogRW5jb2RlIGxpbmUgYW5kIGNvbHVtbiBudW1iZXJzIGluIGFuIGludGVnZXIgYXM6CiAgICAgICogIHtAY29kZSBsaW5lLW51bWJlciA8PCBMSU5FU0hJRlQgKyBjb2x1bW4tbnVtYmVyIH0uCi0gICAgICogIHtAbGluayBQb3NpdGlvbi5OT1BPU30gcmVwcmVzZW50cyBhbiB1bmRlZmluZWQgcG9zaXRpb24uCisgICAgICogIHtAbGluayBQb3NpdGlvbiNOT1BPU30gcmVwcmVzZW50cyBhbiB1bmRlZmluZWQgcG9zaXRpb24uCiAgICAgICoKICAgICAgKiBAcGFyYW0gIGxpbmUgIG51bWJlciBvZiBsaW5lIChmaXJzdCBpcyAxKQogICAgICAqIEBwYXJhbSAgY29sICAgbnVtYmVyIG9mIGNoYXJhY3RlciBvbiBsaW5lIChmaXJzdCBpcyAxKQotICAgICAqIEByZXR1cm4gICAgICAgYW4gZW5jb2RlZCBwb3NpdGlvbiBvciB7QGxpbmsgUG9zaXRpb24uTk9QT1N9CisgICAgICogQHJldHVybiAgICAgICBhbiBlbmNvZGVkIHBvc2l0aW9uIG9yIHtAbGluayBQb3NpdGlvbiNOT1BPU30KICAgICAgKiAgICAgICAgICAgICAgIGlmIHRoZSBsaW5lIG9yIGNvbHVtbiBudW1iZXIgaXMgdG9vIGJpZyB0bwogICAgICAqICAgICAgICAgICAgICAgcmVwcmVzZW50IGluIHRoZSBlbmNvZGVkIGZvcm1hdAogICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGxpbmUgb3IgY29sIGlzIGxlc3MgdGhhbiAxCmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhYy91dGlsL1Jhd0RpYWdub3N0aWNGb3JtYXR0ZXIuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL3V0aWwvUmF3RGlhZ25vc3RpY0Zvcm1hdHRlci5qYXZhCmluZGV4IGI0ZjM3M2QuLjAwZTBiMWYgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL3V0aWwvUmF3RGlhZ25vc3RpY0Zvcm1hdHRlci5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFjL3V0aWwvUmF3RGlhZ25vc3RpY0Zvcm1hdHRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtNTIsNyArNTIsNyBAQAogCiAgICAgLyoqCiAgICAgICogQ3JlYXRlIGEgZm9ybWF0dGVyIGJhc2VkIG9uIHRoZSBzdXBwbGllZCBvcHRpb25zLgotICAgICAqIEBwYXJhbSBtc2dzCisgICAgICogQHBhcmFtIG9wdGlvbnMKICAgICAgKi8KICAgICBwdWJsaWMgUmF3RGlhZ25vc3RpY0Zvcm1hdHRlcihPcHRpb25zIG9wdGlvbnMpIHsKICAgICAgICAgc3VwZXIobnVsbCwgbmV3IFNpbXBsZUNvbmZpZ3VyYXRpb24ob3B0aW9ucywKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFkb2MvQWJzdHJhY3RUeXBlSW1wbC5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWRvYy9BYnN0cmFjdFR5cGVJbXBsLmphdmEKaW5kZXggZGVhZjZhMS4uZTU4OWJmYSAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWRvYy9BYnN0cmFjdFR5cGVJbXBsLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWRvYy9BYnN0cmFjdFR5cGVJbXBsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSw3ICsyNSw2IEBACiAKIHBhY2thZ2UgY29tLnN1bi50b29scy5qYXZhZG9jOwogCi0KIGltcG9ydCBjb20uc3VuLmphdmFkb2MuKjsKIAogaW1wb3J0IGNvbS5zdW4udG9vbHMuamF2YWMuY29kZS5UeXBlOwpAQCAtMzYsNiArMzUsMTEgQEAKICAqIGRlZmF1bHRzIGZvciB0aGUgbWV0aG9kcyBpbiA8Y29kZT5UeXBlPC9jb2RlPiAoYW5kIGEgY291cGxlIGZyb20KICAqIDxjb2RlPlByb2dyYW1FbGVtZW50RG9jPC9jb2RlPikuCiAgKgorICogIDxwPjxiPlRoaXMgaXMgTk9UIHBhcnQgb2YgYW55IHN1cHBvcnRlZCBBUEkuCisgKiAgSWYgeW91IHdyaXRlIGNvZGUgdGhhdCBkZXBlbmRzIG9uIHRoaXMsIHlvdSBkbyBzbyBhdCB5b3VyIG93biByaXNrLgorICogIFRoaXMgY29kZSBhbmQgaXRzIGludGVybmFsIGludGVyZmFjZXMgYXJlIHN1YmplY3QgdG8gY2hhbmdlIG9yCisgKiAgZGVsZXRpb24gd2l0aG91dCBub3RpY2UuPC9iPgorICoKICAqIEBhdXRob3IgU2NvdHQgU2VsaWdtYW4KICAqIEBzaW5jZSAxLjUKICAqLwpkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWRvYy9Bbm5vdGF0aW9uRGVzY0ltcGwuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFkb2MvQW5ub3RhdGlvbkRlc2NJbXBsLmphdmEKaW5kZXggOGU4ZjcwYy4uN2NmYmY1MiAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWRvYy9Bbm5vdGF0aW9uRGVzY0ltcGwuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhZG9jL0Fubm90YXRpb25EZXNjSW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsNyArMjUsNiBAQAogCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuamF2YWRvYzsKIAotCiBpbXBvcnQgY29tLnN1bi5qYXZhZG9jLio7CiAKIGltcG9ydCBjb20uc3VuLnRvb2xzLmphdmFjLmNvZGUuQXR0cmlidXRlOwpAQCAtNDAsNiArMzksMTEgQEAKICAqIFN1cmUgaXQgb3VnaHQgdG8gYmUgY2FsbGVkICJBbm5vdGF0aW9uIiwgYnV0IHRoYXQgY2xhc2hlcyB3aXRoCiAgKiBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uLgogICoKKyAqICA8cD48Yj5UaGlzIGlzIE5PVCBwYXJ0IG9mIGFueSBzdXBwb3J0ZWQgQVBJLgorICogIElmIHlvdSB3cml0ZSBjb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGlzLCB5b3UgZG8gc28gYXQgeW91ciBvd24gcmlzay4KKyAqICBUaGlzIGNvZGUgYW5kIGl0cyBpbnRlcm5hbCBpbnRlcmZhY2VzIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSBvcgorICogIGRlbGV0aW9uIHdpdGhvdXQgbm90aWNlLjwvYj4KKyAqCiAgKiBAYXV0aG9yIFNjb3R0IFNlbGlnbWFuCiAgKiBAc2luY2UgMS41CiAgKi8KZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFkb2MvQW5ub3RhdGlvblR5cGVEb2NJbXBsLmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhZG9jL0Fubm90YXRpb25UeXBlRG9jSW1wbC5qYXZhCmluZGV4IDNjMmVmYTMuLjM1Y2UwZGIgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFkb2MvQW5ub3RhdGlvblR5cGVEb2NJbXBsLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWRvYy9Bbm5vdGF0aW9uVHlwZURvY0ltcGwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTEsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI3LDcgKzI3LDYgQEAKIAogaW1wb3J0IGNvbS5zdW4uamF2YWRvYy4qOwogCi0KIGltcG9ydCBjb20uc3VuLnRvb2xzLmphdmFjLmNvZGUuS2luZHM7CiBpbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy5jb2RlLlNjb3BlOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuamF2YWMuY29kZS5TeW1ib2wuKjsKQEAgLTM5LDYgKzM4LDExIEBACiAvKioKICAqIFJlcHJlc2VudHMgYW4gYW5ub3RhdGlvbiB0eXBlLgogICoKKyAqICA8cD48Yj5UaGlzIGlzIE5PVCBwYXJ0IG9mIGFueSBzdXBwb3J0ZWQgQVBJLgorICogIElmIHlvdSB3cml0ZSBjb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGlzLCB5b3UgZG8gc28gYXQgeW91ciBvd24gcmlzay4KKyAqICBUaGlzIGNvZGUgYW5kIGl0cyBpbnRlcm5hbCBpbnRlcmZhY2VzIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSBvcgorICogIGRlbGV0aW9uIHdpdGhvdXQgbm90aWNlLjwvYj4KKyAqCiAgKiBAYXV0aG9yIFNjb3R0IFNlbGlnbWFuCiAgKiBAc2luY2UgMS41CiAgKi8KZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFkb2MvQW5ub3RhdGlvblR5cGVFbGVtZW50RG9jSW1wbC5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWRvYy9Bbm5vdGF0aW9uVHlwZUVsZW1lbnREb2NJbXBsLmphdmEKaW5kZXggZTU2MzJkYy4uNGMzZmFkNiAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWRvYy9Bbm5vdGF0aW9uVHlwZUVsZW1lbnREb2NJbXBsLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWRvYy9Bbm5vdGF0aW9uVHlwZUVsZW1lbnREb2NJbXBsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDExLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNywxNyArMjcsMTggQEAKIAogaW1wb3J0IGNvbS5zdW4uamF2YWRvYy4qOwogCi1pbXBvcnQgc3RhdGljIGNvbS5zdW4uamF2YWRvYy5MYW5ndWFnZVZlcnNpb24uKjsKLQogaW1wb3J0IGNvbS5zdW4udG9vbHMuamF2YWMuY29kZS5TeW1ib2wuKjsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmphdmFjLnRyZWUuSkNUcmVlLio7Ci1pbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy51dGlsLkxpc3Q7Ci1pbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy51dGlsLk5hbWU7CiBpbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy51dGlsLlBvc2l0aW9uOwogCiAvKioKICAqIFJlcHJlc2VudHMgYW4gZWxlbWVudCBvZiBhbiBhbm5vdGF0aW9uIHR5cGUuCiAgKgorICogIDxwPjxiPlRoaXMgaXMgTk9UIHBhcnQgb2YgYW55IHN1cHBvcnRlZCBBUEkuCisgKiAgSWYgeW91IHdyaXRlIGNvZGUgdGhhdCBkZXBlbmRzIG9uIHRoaXMsIHlvdSBkbyBzbyBhdCB5b3VyIG93biByaXNrLgorICogIFRoaXMgY29kZSBhbmQgaXRzIGludGVybmFsIGludGVyZmFjZXMgYXJlIHN1YmplY3QgdG8gY2hhbmdlIG9yCisgKiAgZGVsZXRpb24gd2l0aG91dCBub3RpY2UuPC9iPgorICoKICAqIEBhdXRob3IgU2NvdHQgU2VsaWdtYW4KICAqIEBzaW5jZSAxLjUKICAqLwpkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWRvYy9Bbm5vdGF0aW9uVmFsdWVJbXBsLmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhZG9jL0Fubm90YXRpb25WYWx1ZUltcGwuamF2YQppbmRleCA4MjAxNGNhLi42YTg4MThjIDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhZG9jL0Fubm90YXRpb25WYWx1ZUltcGwuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhZG9jL0Fubm90YXRpb25WYWx1ZUltcGwuamF2YQpAQCAtMjUsNyArMjUsNiBAQAogCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuamF2YWRvYzsKIAotCiBpbXBvcnQgY29tLnN1bi5qYXZhZG9jLio7CiAKIGltcG9ydCBjb20uc3VuLnRvb2xzLmphdmFjLmNvZGUuQXR0cmlidXRlOwpAQCAtMzYsNiArMzUsMTEgQEAKIC8qKgogICogUmVwcmVzZW50cyBhIHZhbHVlIG9mIGFuIGFubm90YXRpb24gdHlwZSBlbGVtZW50LgogICoKKyAqICA8cD48Yj5UaGlzIGlzIE5PVCBwYXJ0IG9mIGFueSBzdXBwb3J0ZWQgQVBJLgorICogIElmIHlvdSB3cml0ZSBjb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGlzLCB5b3UgZG8gc28gYXQgeW91ciBvd24gcmlzay4KKyAqICBUaGlzIGNvZGUgYW5kIGl0cyBpbnRlcm5hbCBpbnRlcmZhY2VzIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSBvcgorICogIGRlbGV0aW9uIHdpdGhvdXQgbm90aWNlLjwvYj4KKyAqCiAgKiBAYXV0aG9yIFNjb3R0IFNlbGlnbWFuCiAgKiBAc2luY2UgMS41CiAgKi8KZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFkb2MvQ2xhc3NEb2NJbXBsLmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhZG9jL0NsYXNzRG9jSW1wbC5qYXZhCmluZGV4IGE1ZmVkNGIuLmVmYWY0YTQgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFkb2MvQ2xhc3NEb2NJbXBsLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWRvYy9DbGFzc0RvY0ltcGwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTcsIDIwMTEsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTM4LDggKzM4LDYgQEAKIAogaW1wb3J0IGNvbS5zdW4uamF2YWRvYy4qOwogCi1pbXBvcnQgc3RhdGljIGNvbS5zdW4uamF2YWRvYy5MYW5ndWFnZVZlcnNpb24uKjsKLQogaW1wb3J0IGNvbS5zdW4udG9vbHMuamF2YWMuY29kZS5GbGFnczsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmphdmFjLmNvZGUuS2luZHM7CiBpbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy5jb2RlLlNjb3BlOwpAQCAtNzYsNiArNzQsMTEgQEAKICAqIHJlZmVycmVkIHRvIHVzaW5nIFR5cGUgKHdoaWNoIGNhbiBiZSBjb252ZXJ0ZWQgdG8gQ2xhc3NEb2NJbXBsLAogICogaWYgcG9zc2libGUpLgogICoKKyAqICA8cD48Yj5UaGlzIGlzIE5PVCBwYXJ0IG9mIGFueSBzdXBwb3J0ZWQgQVBJLgorICogIElmIHlvdSB3cml0ZSBjb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGlzLCB5b3UgZG8gc28gYXQgeW91ciBvd24gcmlzay4KKyAqICBUaGlzIGNvZGUgYW5kIGl0cyBpbnRlcm5hbCBpbnRlcmZhY2VzIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSBvcgorICogIGRlbGV0aW9uIHdpdGhvdXQgbm90aWNlLjwvYj4KKyAqCiAgKiBAc2VlIFR5cGUKICAqCiAgKiBAc2luY2UgMS4yCkBAIC04NDYsNyArODQ5LDcgQEAKICAgICAgKiBOb3RlIHRoYXQgdGhpcyBpcyBub3QgbmVjZXNzYXJpbHkgd2hhdCB0aGUgY29tcGlsZXIgd291bGQgZG8hCiAgICAgICoKICAgICAgKiBAcGFyYW0gbWV0aG9kTmFtZSB0aGUgdW5xdWFsaWZpZWQgbmFtZSB0byBzZWFyY2ggZm9yLgotICAgICAqIEBwYXJhbSBwYXJhbVR5cGVBcnJheSB0aGUgYXJyYXkgb2YgU3RyaW5ncyBmb3IgbWV0aG9kIHBhcmFtZXRlciB0eXBlcy4KKyAgICAgKiBAcGFyYW0gcGFyYW1UeXBlcyB0aGUgYXJyYXkgb2YgU3RyaW5ncyBmb3IgbWV0aG9kIHBhcmFtZXRlciB0eXBlcy4KICAgICAgKiBAcmV0dXJuIHRoZSBmaXJzdCBNZXRob2REb2NJbXBsIHdoaWNoIG1hdGNoZXMsIG51bGwgaWYgbm90IGZvdW5kLgogICAgICAqLwogICAgIHB1YmxpYyBNZXRob2REb2NJbXBsIGZpbmRNZXRob2QoU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZ1tdIHBhcmFtVHlwZXMpIHsKQEAgLTk3Myw3ICs5NzYsNyBAQAogICAgICAqIEZpbmQgY29uc3RydWN0b3IgaW4gdGhpcyBjbGFzcy4KICAgICAgKgogICAgICAqIEBwYXJhbSBjb25zdHJOYW1lIHRoZSB1bnF1YWxpZmllZCBuYW1lIHRvIHNlYXJjaCBmb3IuCi0gICAgICogQHBhcmFtIHBhcmFtVHlwZUFycmF5IHRoZSBhcnJheSBvZiBTdHJpbmdzIGZvciBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzLgorICAgICAqIEBwYXJhbSBwYXJhbVR5cGVzIHRoZSBhcnJheSBvZiBTdHJpbmdzIGZvciBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzLgogICAgICAqIEByZXR1cm4gdGhlIGZpcnN0IENvbnN0cnVjdG9yRG9jSW1wbCB3aGljaCBtYXRjaGVzLCBudWxsIGlmIG5vdCBmb3VuZC4KICAgICAgKi8KICAgICBwdWJsaWMgQ29uc3RydWN0b3JEb2MgZmluZENvbnN0cnVjdG9yKFN0cmluZyBjb25zdHJOYW1lLApkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWRvYy9Db21tZW50LmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhZG9jL0NvbW1lbnQuamF2YQppbmRleCAyYzI3ZThiNC4uNTkyMzZmMyAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWRvYy9Db21tZW50LmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWRvYy9Db21tZW50LmphdmEKQEAgLTMzLDYgKzMzLDExIEBACiAgKiAgICAgIEl0IGFsbG93cyB1c2VycyB0byBnZXQgZmlyc3Qgc2VudGVuY2Ugb2YgdGhpcyBjb21tZW50LCBnZXQKICAqICAgICAgY29tbWVudCBmb3IgZGlmZmVyZW50IHRhZ3MuLi4KICAqCisgKiAgPHA+PGI+VGhpcyBpcyBOT1QgcGFydCBvZiBhbnkgc3VwcG9ydGVkIEFQSS4KKyAqICBJZiB5b3Ugd3JpdGUgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhpcywgeW91IGRvIHNvIGF0IHlvdXIgb3duIHJpc2suCisgKiAgVGhpcyBjb2RlIGFuZCBpdHMgaW50ZXJuYWwgaW50ZXJmYWNlcyBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugb3IKKyAqICBkZWxldGlvbiB3aXRob3V0IG5vdGljZS48L2I+CisgKgogICogQGF1dGhvciBLYWl5YW5nIExpdSAob3JpZ2luYWwpCiAgKiBAYXV0aG9yIFJvYmVydCBGaWVsZCAocmV3cml0ZSkKICAqIEBhdXRob3IgQXR1bCBNIERhbWJhbGthcgpkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWRvYy9Db25zdHJ1Y3RvckRvY0ltcGwuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFkb2MvQ29uc3RydWN0b3JEb2NJbXBsLmphdmEKaW5kZXggOTgwYmQ4Yi4uZTFmNDY3OCAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWRvYy9Db25zdHJ1Y3RvckRvY0ltcGwuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhZG9jL0NvbnN0cnVjdG9yRG9jSW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMTk5NywgMjAwNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5NywgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMzUsNiArMzUsMTEgQEAKIC8qKgogICogUmVwcmVzZW50cyBhIGNvbnN0cnVjdG9yIG9mIGEgamF2YSBjbGFzcy4KICAqCisgKiAgPHA+PGI+VGhpcyBpcyBOT1QgcGFydCBvZiBhbnkgc3VwcG9ydGVkIEFQSS4KKyAqICBJZiB5b3Ugd3JpdGUgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhpcywgeW91IGRvIHNvIGF0IHlvdXIgb3duIHJpc2suCisgKiAgVGhpcyBjb2RlIGFuZCBpdHMgaW50ZXJuYWwgaW50ZXJmYWNlcyBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugb3IKKyAqICBkZWxldGlvbiB3aXRob3V0IG5vdGljZS48L2I+CisgKgogICogQHNpbmNlIDEuMgogICogQGF1dGhvciBSb2JlcnQgRmllbGQKICAqIEBhdXRob3IgTmVhbCBHYWZ0ZXIgKHJld3JpdGUpCmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhZG9jL0RvY0Vudi5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWRvYy9Eb2NFbnYuamF2YQppbmRleCA1ODg3YzUwLi41Y2Q0MzA2IDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhZG9jL0RvY0Vudi5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFkb2MvRG9jRW52LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDExLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC00Niw2ICs0NiwxMSBAQAogICogcnVuIGFuZCBub3QgdGhlIGNvbXBpbGVyIGluZm8gdGhhdCBjb3VsZCBiZSBHQydlZAogICogb3IgcG9ydGVkLgogICoKKyAqICA8cD48Yj5UaGlzIGlzIE5PVCBwYXJ0IG9mIGFueSBzdXBwb3J0ZWQgQVBJLgorICogIElmIHlvdSB3cml0ZSBjb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGlzLCB5b3UgZG8gc28gYXQgeW91ciBvd24gcmlzay4KKyAqICBUaGlzIGNvZGUgYW5kIGl0cyBpbnRlcm5hbCBpbnRlcmZhY2VzIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSBvcgorICogIGRlbGV0aW9uIHdpdGhvdXQgbm90aWNlLjwvYj4KKyAqCiAgKiBAc2luY2UgMS40CiAgKiBAYXV0aG9yIFJvYmVydCBGaWVsZAogICogQGF1dGhvciBOZWFsIEdhZnRlciAocmV3cml0ZSkKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFkb2MvRG9jSW1wbC5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWRvYy9Eb2NJbXBsLmphdmEKaW5kZXggMDkzNjE5NC4uZjI2MzEyMyAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWRvYy9Eb2NJbXBsLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWRvYy9Eb2NJbXBsLmphdmEKQEAgLTI2LDE2ICsyNiwxNiBAQAogcGFja2FnZSBjb20uc3VuLnRvb2xzLmphdmFkb2M7CiAKIGltcG9ydCBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLnRleHQuQ29sbGF0aW9uS2V5OworaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworCiBpbXBvcnQgamF2YXgudG9vbHMuRmlsZU9iamVjdDsKIAogaW1wb3J0IGNvbS5zdW4uamF2YWRvYy4qOwotCiBpbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy51dGlsLlBvc2l0aW9uOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwogCiAvKioKICAqIGFic3RyYWN0IGJhc2UgY2xhc3Mgb2YgYWxsIERvYyBjbGFzc2VzLiAgRG9jIGl0ZW0ncyBhcmUgcmVwcmVzZW50YXRpb25zCkBAIC00Myw2ICs0MywxMSBAQAogICogY29tbWVudHMgYW5kIGhhdmUgYmVlbiBwcm9jZXNzZWQgYnkgdGhpcyBydW4gb2YgamF2YWRvYy4gIEFsbCBEb2MgaXRlbXMKICAqIGFyZSB1bmlxdWUsIHRoYXQgaXMsIHRoZXkgYXJlID09IGNvbXBhcmFibGUuCiAgKgorICogIDxwPjxiPlRoaXMgaXMgTk9UIHBhcnQgb2YgYW55IHN1cHBvcnRlZCBBUEkuCisgKiAgSWYgeW91IHdyaXRlIGNvZGUgdGhhdCBkZXBlbmRzIG9uIHRoaXMsIHlvdSBkbyBzbyBhdCB5b3VyIG93biByaXNrLgorICogIFRoaXMgY29kZSBhbmQgaXRzIGludGVybmFsIGludGVyZmFjZXMgYXJlIHN1YmplY3QgdG8gY2hhbmdlIG9yCisgKiAgZGVsZXRpb24gd2l0aG91dCBub3RpY2UuPC9iPgorICoKICAqIEBzaW5jZSAxLjIKICAqIEBhdXRob3IgUm9iZXJ0IEZpZWxkCiAgKiBAYXV0aG9yIEF0dWwgTSBEYW1iYWxrYXIKQEAgLTI2Miw3ICsyNjcsNyBAQAogICAgICAqIDxwPgogICAgICAqIEluY2x1ZGVkIHNvIHRoYXQgRG9jIGl0ZW0gYXJlIGphdmEubGFuZy5Db21wYXJhYmxlLgogICAgICAqCi0gICAgICogQHBhcmFtICAgbyB0aGUgPGNvZGU+T2JqZWN0PC9jb2RlPiB0byBiZSBjb21wYXJlZC4KKyAgICAgKiBAcGFyYW0gICBvYmogdGhlIHtAY29kZSBPYmplY3R9IHRvIGJlIGNvbXBhcmVkLgogICAgICAqIEByZXR1cm4gIGEgbmVnYXRpdmUgaW50ZWdlciwgemVybywgb3IgYSBwb3NpdGl2ZSBpbnRlZ2VyIGFzIHRoaXMgT2JqZWN0CiAgICAgICogICAgICAgICAgaXMgbGVzcyB0aGFuLCBlcXVhbCB0bywgb3IgZ3JlYXRlciB0aGFuIHRoZSBnaXZlbiBPYmplY3QuCiAgICAgICogQGV4Y2VwdGlvbiBDbGFzc0Nhc3RFeGNlcHRpb24gdGhlIHNwZWNpZmllZCBPYmplY3QncyB0eXBlIHByZXZlbnRzIGl0CmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhZG9jL0RvY0xvY2FsZS5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWRvYy9Eb2NMb2NhbGUuamF2YQppbmRleCA2YWM2YTFlLi4wZjhiYTMyIDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhZG9jL0RvY0xvY2FsZS5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFkb2MvRG9jTG9jYWxlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwxNCArMjUsMTggQEAKIAogcGFja2FnZSBjb20uc3VuLnRvb2xzLmphdmFkb2M7CiAKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudGV4dC5Db2xsYXRvcjsKIGltcG9ydCBqYXZhLnRleHQuQnJlYWtJdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnRleHQuQ29sbGF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKIAogLyoqCiAgKiBUaGlzIGNsYXNzIGhvbGRzIHRoZSBpbmZvcm1hdGlvbiBhYm91dCBsb2NhbGVzLgogICoKKyAqICA8cD48Yj5UaGlzIGlzIE5PVCBwYXJ0IG9mIGFueSBzdXBwb3J0ZWQgQVBJLgorICogIElmIHlvdSB3cml0ZSBjb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGlzLCB5b3UgZG8gc28gYXQgeW91ciBvd24gcmlzay4KKyAqICBUaGlzIGNvZGUgYW5kIGl0cyBpbnRlcm5hbCBpbnRlcmZhY2VzIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSBvcgorICogIGRlbGV0aW9uIHdpdGhvdXQgbm90aWNlLjwvYj4KKyAqCiAgKiBAc2luY2UgMS40CiAgKiBAYXV0aG9yIFJvYmVydCBGaWVsZAogICovCmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhZG9jL0RvY2xldEludm9rZXIuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFkb2MvRG9jbGV0SW52b2tlci5qYXZhCmluZGV4IGQ5YjJlNjkuLjMwOGI5MDMgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFkb2MvRG9jbGV0SW52b2tlci5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFkb2MvRG9jbGV0SW52b2tlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAxMSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMjIgKzI1LDI2IEBACiAKIHBhY2thZ2UgY29tLnN1bi50b29scy5qYXZhZG9jOwogCi1pbXBvcnQgY29tLnN1bi5qYXZhZG9jLio7Ci0KLWltcG9ydCBzdGF0aWMgY29tLnN1bi5qYXZhZG9jLkxhbmd1YWdlVmVyc2lvbi4qOwotCi1pbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy51dGlsLkxpc3Q7Ci0KIGltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5ldC5VUkw7CiBpbXBvcnQgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXI7CiAKK2ltcG9ydCBjb20uc3VuLmphdmFkb2MuKjsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmphdmFjLnV0aWwuTGlzdDsKK2ltcG9ydCBzdGF0aWMgY29tLnN1bi5qYXZhZG9jLkxhbmd1YWdlVmVyc2lvbi4qOworCiAKIC8qKgogICogQ2xhc3MgY3JlYXRlcywgY29udHJvbHMgYW5kIGludm9rZXMgZG9jbGV0cy4KKyAqCisgKiAgPHA+PGI+VGhpcyBpcyBOT1QgcGFydCBvZiBhbnkgc3VwcG9ydGVkIEFQSS4KKyAqICBJZiB5b3Ugd3JpdGUgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhpcywgeW91IGRvIHNvIGF0IHlvdXIgb3duIHJpc2suCisgKiAgVGhpcyBjb2RlIGFuZCBpdHMgaW50ZXJuYWwgaW50ZXJmYWNlcyBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugb3IKKyAqICBkZWxldGlvbiB3aXRob3V0IG5vdGljZS48L2I+CisgKgogICogQGF1dGhvciBOZWFsIEdhZnRlciAocmV3cml0ZSkKICAqLwogcHVibGljIGNsYXNzIERvY2xldEludm9rZXIgewpkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWRvYy9FeGVjdXRhYmxlTWVtYmVyRG9jSW1wbC5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWRvYy9FeGVjdXRhYmxlTWVtYmVyRG9jSW1wbC5qYXZhCmluZGV4IGUwMjRjYzAuLjYwMGVlYjIgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFkb2MvRXhlY3V0YWJsZU1lbWJlckRvY0ltcGwuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhZG9jL0V4ZWN1dGFibGVNZW1iZXJEb2NJbXBsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAxOTk3LCAyMDExLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC00MSw2ICs0MSwxMSBAQAogLyoqCiAgKiBSZXByZXNlbnRzIGEgbWV0aG9kIG9yIGNvbnN0cnVjdG9yIG9mIGEgamF2YSBjbGFzcy4KICAqCisgKiAgPHA+PGI+VGhpcyBpcyBOT1QgcGFydCBvZiBhbnkgc3VwcG9ydGVkIEFQSS4KKyAqICBJZiB5b3Ugd3JpdGUgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhpcywgeW91IGRvIHNvIGF0IHlvdXIgb3duIHJpc2suCisgKiAgVGhpcyBjb2RlIGFuZCBpdHMgaW50ZXJuYWwgaW50ZXJmYWNlcyBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugb3IKKyAqICBkZWxldGlvbiB3aXRob3V0IG5vdGljZS48L2I+CisgKgogICogQHNpbmNlIDEuMgogICogQGF1dGhvciBSb2JlcnQgRmllbGQKICAqIEBhdXRob3IgTmVhbCBHYWZ0ZXIgKHJld3JpdGUpCmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhZG9jL0ZpZWxkRG9jSW1wbC5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWRvYy9GaWVsZERvY0ltcGwuamF2YQppbmRleCBjMTFjODRiLi5jNzZkZDdhIDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhZG9jL0ZpZWxkRG9jSW1wbC5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFkb2MvRmllbGREb2NJbXBsLmphdmEKQEAgLTI5LDggKzI5LDYgQEAKIAogaW1wb3J0IGNvbS5zdW4uamF2YWRvYy4qOwogCi1pbXBvcnQgc3RhdGljIGNvbS5zdW4uamF2YWRvYy5MYW5ndWFnZVZlcnNpb24uKjsKLQogaW1wb3J0IGNvbS5zdW4udG9vbHMuamF2YWMuY29kZS5GbGFnczsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmphdmFjLmNvZGUuU3ltYm9sLkNsYXNzU3ltYm9sOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuamF2YWMuY29kZS5TeW1ib2wuVmFyU3ltYm9sOwpAQCAtNDMsNiArNDEsMTEgQEAKIC8qKgogICogUmVwcmVzZW50cyBhIGZpZWxkIGluIGEgamF2YSBjbGFzcy4KICAqCisgKiAgPHA+PGI+VGhpcyBpcyBOT1QgcGFydCBvZiBhbnkgc3VwcG9ydGVkIEFQSS4KKyAqICBJZiB5b3Ugd3JpdGUgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhpcywgeW91IGRvIHNvIGF0IHlvdXIgb3duIHJpc2suCisgKiAgVGhpcyBjb2RlIGFuZCBpdHMgaW50ZXJuYWwgaW50ZXJmYWNlcyBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugb3IKKyAqICBkZWxldGlvbiB3aXRob3V0IG5vdGljZS48L2I+CisgKgogICogQHNlZSBNZW1iZXJEb2NJbXBsCiAgKgogICogQHNpbmNlIDEuMgpkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWRvYy9KYXZhZG9jQ2xhc3NSZWFkZXIuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFkb2MvSmF2YWRvY0NsYXNzUmVhZGVyLmphdmEKaW5kZXggNjdmYTYxZC4uZGY1MjcyNSAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWRvYy9KYXZhZG9jQ2xhc3NSZWFkZXIuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhZG9jL0phdmFkb2NDbGFzc1JlYWRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMzMsNiArMzMsMTIgQEAKIGltcG9ydCBjb20uc3VuLnRvb2xzLmphdmFjLnV0aWwuQ29udGV4dDsKIAogLyoqIEphdmFkb2MgdXNlcyBhbiBleHRlbmRlZCBjbGFzcyByZWFkZXIgdGhhdCByZWNvcmRzIHBhY2thZ2UuaHRtbCBlbnRyaWVzCisgKgorICogIDxwPjxiPlRoaXMgaXMgTk9UIHBhcnQgb2YgYW55IHN1cHBvcnRlZCBBUEkuCisgKiAgSWYgeW91IHdyaXRlIGNvZGUgdGhhdCBkZXBlbmRzIG9uIHRoaXMsIHlvdSBkbyBzbyBhdCB5b3VyIG93biByaXNrLgorICogIFRoaXMgY29kZSBhbmQgaXRzIGludGVybmFsIGludGVyZmFjZXMgYXJlIHN1YmplY3QgdG8gY2hhbmdlIG9yCisgKiAgZGVsZXRpb24gd2l0aG91dCBub3RpY2UuPC9iPgorICoKICAqICBAYXV0aG9yIE5lYWwgR2FmdGVyCiAgKi8KIHB1YmxpYyBjbGFzcyBKYXZhZG9jQ2xhc3NSZWFkZXIgZXh0ZW5kcyBDbGFzc1JlYWRlciB7CmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhZG9jL0phdmFkb2NFbnRlci5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWRvYy9KYXZhZG9jRW50ZXIuamF2YQppbmRleCBmMmMyODg0Li5kOTE0ZWVmIDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhZG9jL0phdmFkb2NFbnRlci5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFkb2MvSmF2YWRvY0VudGVyLmphdmEKQEAgLTI1LDcgKzI1LDYgQEAKIAogcGFja2FnZSBjb20uc3VuLnRvb2xzLmphdmFkb2M7CiAKLQogaW1wb3J0IGphdmF4LnRvb2xzLkphdmFGaWxlT2JqZWN0OwogCiBpbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy5jb2RlLktpbmRzOwpAQCAtNDAsNiArMzksMTIgQEAKIC8qKgogICogIEphdmFkb2MncyBvd24gZW50ZXIgcGhhc2UgZG9lcyBhIGZldyB0aGluZ3MgYWJvdmUgYW5kIGJleW9uZCB0aGF0CiAgKiAgZG9uZSBieSBqYXZhYy4KKyAqCisgKiAgPHA+PGI+VGhpcyBpcyBOT1QgcGFydCBvZiBhbnkgc3VwcG9ydGVkIEFQSS4KKyAqICBJZiB5b3Ugd3JpdGUgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhpcywgeW91IGRvIHNvIGF0IHlvdXIgb3duIHJpc2suCisgKiAgVGhpcyBjb2RlIGFuZCBpdHMgaW50ZXJuYWwgaW50ZXJmYWNlcyBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugb3IKKyAqICBkZWxldGlvbiB3aXRob3V0IG5vdGljZS48L2I+CisgKgogICogIEBhdXRob3IgTmVhbCBHYWZ0ZXIKICAqLwogcHVibGljIGNsYXNzIEphdmFkb2NFbnRlciBleHRlbmRzIEVudGVyIHsKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFkb2MvSmF2YWRvY01lbWJlckVudGVyLmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhZG9jL0phdmFkb2NNZW1iZXJFbnRlci5qYXZhCmluZGV4IDRlMWQzMWYuLmUyOWFlMDAgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFkb2MvSmF2YWRvY01lbWJlckVudGVyLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWRvYy9KYXZhZG9jTWVtYmVyRW50ZXIuamF2YQpAQCAtMzcsNiArMzcsMTIgQEAKIC8qKgogICogIEphdmFkb2MncyBvd24gbWVtYmVyRW50ZXIgcGhhc2UgZG9lcyBhIGZldyB0aGluZ3MgYWJvdmUgYW5kIGJleW9uZCB0aGF0CiAgKiAgZG9uZSBieSBqYXZhYy4KKyAqCisgKiAgPHA+PGI+VGhpcyBpcyBOT1QgcGFydCBvZiBhbnkgc3VwcG9ydGVkIEFQSS4KKyAqICBJZiB5b3Ugd3JpdGUgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhpcywgeW91IGRvIHNvIGF0IHlvdXIgb3duIHJpc2suCisgKiAgVGhpcyBjb2RlIGFuZCBpdHMgaW50ZXJuYWwgaW50ZXJmYWNlcyBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugb3IKKyAqICBkZWxldGlvbiB3aXRob3V0IG5vdGljZS48L2I+CisgKgogICogIEBhdXRob3IgTmVhbCBHYWZ0ZXIKICAqLwogcHVibGljIGNsYXNzIEphdmFkb2NNZW1iZXJFbnRlciBleHRlbmRzIE1lbWJlckVudGVyIHsKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFkb2MvSmF2YWRvY1RvZG8uamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFkb2MvSmF2YWRvY1RvZG8uamF2YQppbmRleCA2ZDY5MTcyLi5jYmVhZjY5IDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhZG9jL0phdmFkb2NUb2RvLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWRvYy9KYXZhZG9jVG9kby5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMzEsNiArMzEsMTIgQEAKIC8qKgogICogIEphdmFkb2MncyBvd24gdG9kbyBxdWV1ZSBkb2Vzbid0IHF1ZXVlIGl0cyBpbnB1dHMsIGFzIGphdmFkb2MKICAqICBkb2Vzbid0IHBlcmZvcm0gYXR0cmlidXRpb24gb2YgbWV0aG9kIGJvZGllcyBvciBzZW1hbnRpYyBjaGVja2luZy4KKyAqCisgKiAgPHA+PGI+VGhpcyBpcyBOT1QgcGFydCBvZiBhbnkgc3VwcG9ydGVkIEFQSS4KKyAqICBJZiB5b3Ugd3JpdGUgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhpcywgeW91IGRvIHNvIGF0IHlvdXIgb3duIHJpc2suCisgKiAgVGhpcyBjb2RlIGFuZCBpdHMgaW50ZXJuYWwgaW50ZXJmYWNlcyBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugb3IKKyAqICBkZWxldGlvbiB3aXRob3V0IG5vdGljZS48L2I+CisgKgogICogIEBhdXRob3IgTmVhbCBHYWZ0ZXIKICAqLwogcHVibGljIGNsYXNzIEphdmFkb2NUb2RvIGV4dGVuZHMgVG9kbyB7CmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhZG9jL0phdmFkb2NUb29sLmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhZG9jL0phdmFkb2NUb29sLmphdmEKaW5kZXggODFiY2RiZC4uNGJjMTQ5MyAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWRvYy9KYXZhZG9jVG9vbC5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFkb2MvSmF2YWRvY1Rvb2wuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTEsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTU0LDYgKzU0LDEyIEBACiAgKiAgY29tcG9uZW50IGluIGEgbGFyZ2VyIHNvZnR3YXJlIHN5c3RlbS4gSXQgcHJvdmlkZXMgb3BlcmF0aW9ucyB0bwogICogIGNvbnN0cnVjdCBhIG5ldyBqYXZhZG9jIHByb2Nlc3NvciwgYW5kIHRvIHJ1biBpdCBvbiBhIHNldCBvZiBzb3VyY2UKICAqICBmaWxlcy4KKyAqCisgKiAgPHA+PGI+VGhpcyBpcyBOT1QgcGFydCBvZiBhbnkgc3VwcG9ydGVkIEFQSS4KKyAqICBJZiB5b3Ugd3JpdGUgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhpcywgeW91IGRvIHNvIGF0IHlvdXIgb3duIHJpc2suCisgKiAgVGhpcyBjb2RlIGFuZCBpdHMgaW50ZXJuYWwgaW50ZXJmYWNlcyBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugb3IKKyAqICBkZWxldGlvbiB3aXRob3V0IG5vdGljZS48L2I+CisgKgogICogIEBhdXRob3IgTmVhbCBHYWZ0ZXIKICAqLwogcHVibGljIGNsYXNzIEphdmFkb2NUb29sIGV4dGVuZHMgY29tLnN1bi50b29scy5qYXZhYy5tYWluLkphdmFDb21waWxlciB7CkBAIC0zODYsNyArMzkyLDcgQEAKICAgICAvKioKICAgICAgKiBSZXR1cm4gdHJ1ZSBpZiBnaXZlbiBmaWxlIG5hbWUgaXMgYSB2YWxpZCBjbGFzcyBuYW1lCiAgICAgICogKGluY2x1ZGluZyAicGFja2FnZS1pbmZvIikuCi0gICAgICogQHBhcmFtIGNsYXp6bmFtZSB0aGUgbmFtZSBvZiB0aGUgY2xhc3MgdG8gY2hlY2suCisgICAgICogQHBhcmFtIHMgdGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRvIGNoZWNrLgogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBnaXZlbiBjbGFzcyBuYW1lIGlzIGEgdmFsaWQgY2xhc3MgbmFtZQogICAgICAqIGFuZCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhZG9jL01haW4uamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFkb2MvTWFpbi5qYXZhCmluZGV4IDA4NmUxM2QuLmRmYzIxYjIgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFkb2MvTWFpbi5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFkb2MvTWFpbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMzEsNiArMzEsMTEgQEAKICAqIFByb3ZpZGVzIGV4dGVybmFsIGVudHJ5IHBvaW50cyAodG9vbCBhbmQgcHJvZ3JhbW1hdGljKQogICogZm9yIHRoZSBqYXZhZG9jIHByb2dyYW0uCiAgKgorICogIDxwPjxiPlRoaXMgaXMgTk9UIHBhcnQgb2YgYW55IHN1cHBvcnRlZCBBUEkuCisgKiAgSWYgeW91IHdyaXRlIGNvZGUgdGhhdCBkZXBlbmRzIG9uIHRoaXMsIHlvdSBkbyBzbyBhdCB5b3VyIG93biByaXNrLgorICogIFRoaXMgY29kZSBhbmQgaXRzIGludGVybmFsIGludGVyZmFjZXMgYXJlIHN1YmplY3QgdG8gY2hhbmdlIG9yCisgKiAgZGVsZXRpb24gd2l0aG91dCBub3RpY2UuPC9iPgorICoKICAqIEBzaW5jZSAxLjQKICAqLwogcHVibGljIGNsYXNzIE1haW4gewpkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWRvYy9NZW1iZXJEb2NJbXBsLmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhZG9jL01lbWJlckRvY0ltcGwuamF2YQppbmRleCA4ZGNkMzc1Li44OGRhOWMwIDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhZG9jL01lbWJlckRvY0ltcGwuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhZG9jL01lbWJlckRvY0ltcGwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTcsIDIwMDUsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTM3LDYgKzM3LDExIEBACiAgKiBtZXRob2QsIGNvbnN0cnVjdG9yIGFuZCBmaWVsZCBtZW1iZXJzLiBDbGFzcyBtZW1iZXJzIG9mIGEgY2xhc3MKICAqIChuZXN0ZWQgY2xhc3NlcykgYXJlIHJlcHJlc2VudGVkIGluc3RlYWQgYnkgQ2xhc3NEb2NJbXBsLgogICoKKyAqICA8cD48Yj5UaGlzIGlzIE5PVCBwYXJ0IG9mIGFueSBzdXBwb3J0ZWQgQVBJLgorICogIElmIHlvdSB3cml0ZSBjb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGlzLCB5b3UgZG8gc28gYXQgeW91ciBvd24gcmlzay4KKyAqICBUaGlzIGNvZGUgYW5kIGl0cyBpbnRlcm5hbCBpbnRlcmZhY2VzIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSBvcgorICogIGRlbGV0aW9uIHdpdGhvdXQgbm90aWNlLjwvYj4KKyAqCiAgKiBAc2VlIE1ldGhvZERvY0ltcGwKICAqIEBzZWUgRmllbGREb2NJbXBsCiAgKiBAc2VlIENsYXNzRG9jSW1wbApkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWRvYy9NZXNzYWdlci5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWRvYy9NZXNzYWdlci5qYXZhCmluZGV4IDU5OTRlNzYuLjY0ZmE2ZGIgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFkb2MvTWVzc2FnZXIuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhZG9jL01lc3NhZ2VyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAxOTk3LCAyMDExLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwxNiArMjUsMTQgQEAKIAogcGFja2FnZSBjb20uc3VuLnRvb2xzLmphdmFkb2M7CiAKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7ICAvLyBBY2Nlc3MgdG8gJ2phdmFjJyBvdXRwdXQgc3RyZWFtcwogaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKIGltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKIAogaW1wb3J0IGNvbS5zdW4uamF2YWRvYy4qOwotCiBpbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy51dGlsLkNvbnRleHQ7Ci0KLWltcG9ydCBjb20uc3VuLnRvb2xzLmphdmFjLnV0aWwuTG9nOyAgLy8gQWNjZXNzIHRvICdqYXZhYycgb3V0cHV0IHN0cmVhbXMKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmphdmFjLnV0aWwuTG9nOwogCiAvKioKICAqIFV0aWxpdHkgZm9yIGludGVncmF0aW5nIHdpdGggamF2YWRvYyB0b29scyBhbmQgZm9yIGxvY2FsaXphdGlvbi4KQEAgLTQzLDYgKzQxLDExIEBACiAgKiA8YnI+CiAgKiBBbHNvIHByb3ZpZGVzIGltcGxlbWVudGF0aW9uIGZvciBEb2NFcnJvclJlcG9ydGVyLgogICoKKyAqICA8cD48Yj5UaGlzIGlzIE5PVCBwYXJ0IG9mIGFueSBzdXBwb3J0ZWQgQVBJLgorICogIElmIHlvdSB3cml0ZSBjb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGlzLCB5b3UgZG8gc28gYXQgeW91ciBvd24gcmlzay4KKyAqICBUaGlzIGNvZGUgYW5kIGl0cyBpbnRlcm5hbCBpbnRlcmZhY2VzIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSBvcgorICogIGRlbGV0aW9uIHdpdGhvdXQgbm90aWNlLjwvYj4KKyAqCiAgKiBAc2VlIGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZQogICogQHNlZSBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdAogICogQGF1dGhvciBOZWFsIEdhZnRlciAocmV3cml0ZSkKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFkb2MvTWV0aG9kRG9jSW1wbC5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWRvYy9NZXRob2REb2NJbXBsLmphdmEKaW5kZXggNzJlZDg2ZC4uZjkwYjE2NCAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWRvYy9NZXRob2REb2NJbXBsLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWRvYy9NZXRob2REb2NJbXBsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAxOTk3LCAyMDA2LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSw4ICsyNSw5IEBACiAKIHBhY2thZ2UgY29tLnN1bi50b29scy5qYXZhZG9jOwogCi1pbXBvcnQgY29tLnN1bi5qYXZhZG9jLio7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7CiAKK2ltcG9ydCBjb20uc3VuLmphdmFkb2MuKjsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmphdmFjLmNvZGUuKjsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmphdmFjLmNvZGUuU3ltYm9sLio7CiBpbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy5jb2RlLlR5cGU7CkBAIC0zNCwxMSArMzUsMTQgQEAKIGltcG9ydCBjb20uc3VuLnRvb2xzLmphdmFjLnRyZWUuSkNUcmVlLkpDTWV0aG9kRGVjbDsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmphdmFjLnV0aWwuUG9zaXRpb247CiAKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKLQogLyoqCiAgKiBSZXByZXNlbnRzIGEgbWV0aG9kIG9mIGEgamF2YSBjbGFzcy4KICAqCisgKiAgPHA+PGI+VGhpcyBpcyBOT1QgcGFydCBvZiBhbnkgc3VwcG9ydGVkIEFQSS4KKyAqICBJZiB5b3Ugd3JpdGUgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhpcywgeW91IGRvIHNvIGF0IHlvdXIgb3duIHJpc2suCisgKiAgVGhpcyBjb2RlIGFuZCBpdHMgaW50ZXJuYWwgaW50ZXJmYWNlcyBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugb3IKKyAqICBkZWxldGlvbiB3aXRob3V0IG5vdGljZS48L2I+CisgKgogICogQHNpbmNlIDEuMgogICogQGF1dGhvciBSb2JlcnQgRmllbGQKICAqIEBhdXRob3IgTmVhbCBHYWZ0ZXIgKHJld3JpdGUpCmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhZG9jL01vZGlmaWVyRmlsdGVyLmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhZG9jL01vZGlmaWVyRmlsdGVyLmphdmEKaW5kZXggNWU5NjM3Mi4uNDBhOTA0MCAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWRvYy9Nb2RpZmllckZpbHRlci5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFkb2MvTW9kaWZpZXJGaWx0ZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTMyLDcgKzMyLDEzIEBACiAgKiAgIEZpbHRlcmluZyBpcyBkb25lIGJ5IHJldHVybmluZyBib29sZWFuIHZhbHVlcy4KICAqICAgQ2xhc3NlcywgbWV0aG9kcyBhbmQgZmllbGRzIGNhbiBiZSBmaWx0ZXJlZCwgb3IgZmlsdGVyaW5nCiAgKiAgIGNhbiBiZSBkb25lIGRpcmVjdGx5IG9uIG1vZGlmaWVyIGJpdHMuCi0gKiAgIEBzZWUgY29tLnN1bi50b29scy5qYXZhYy5jb2RlLkZsYWdzOworICoKKyAqICA8cD48Yj5UaGlzIGlzIE5PVCBwYXJ0IG9mIGFueSBzdXBwb3J0ZWQgQVBJLgorICogIElmIHlvdSB3cml0ZSBjb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGlzLCB5b3UgZG8gc28gYXQgeW91ciBvd24gcmlzay4KKyAqICBUaGlzIGNvZGUgYW5kIGl0cyBpbnRlcm5hbCBpbnRlcmZhY2VzIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSBvcgorICogIGRlbGV0aW9uIHdpdGhvdXQgbm90aWNlLjwvYj4KKyAqCisgKiAgIEBzZWUgY29tLnN1bi50b29scy5qYXZhYy5jb2RlLkZsYWdzCiAgKiAgIEBhdXRob3IgUm9iZXJ0IEZpZWxkCiAgKi8KIApkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWRvYy9QYWNrYWdlRG9jSW1wbC5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWRvYy9QYWNrYWdlRG9jSW1wbC5qYXZhCmluZGV4IDRjN2U0NzIuLjlhMDcyMjUgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFkb2MvUGFja2FnZURvY0ltcGwuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhZG9jL1BhY2thZ2VEb2NJbXBsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAxOTk3LCAyMDExLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwxMiArMjUsMTIgQEAKIAogcGFja2FnZSBjb20uc3VuLnRvb2xzLmphdmFkb2M7CiAKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKKwogaW1wb3J0IGphdmF4LnRvb2xzLkZpbGVPYmplY3Q7CiAKIGltcG9ydCBjb20uc3VuLmphdmFkb2MuKjsKLQogaW1wb3J0IGNvbS5zdW4udG9vbHMuamF2YWMuY29kZS5BdHRyaWJ1dGU7CiBpbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy5jb2RlLlNjb3BlOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuamF2YWMuY29kZS5TeW1ib2wuQ2xhc3NTeW1ib2w7CkBAIC00Nyw2ICs0NywxMSBAQAogICogYWJvdXQgdGhlIHBhY2thZ2UsIHRoZSBwYWNrYWdlJ3MgY29tbWVudCBhbmQgdGFncywgYW5kIHRoZQogICogY2xhc3NlcyBpbiB0aGUgcGFja2FnZS4KICAqCisgKiAgPHA+PGI+VGhpcyBpcyBOT1QgcGFydCBvZiBhbnkgc3VwcG9ydGVkIEFQSS4KKyAqICBJZiB5b3Ugd3JpdGUgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhpcywgeW91IGRvIHNvIGF0IHlvdXIgb3duIHJpc2suCisgKiAgVGhpcyBjb2RlIGFuZCBpdHMgaW50ZXJuYWwgaW50ZXJmYWNlcyBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugb3IKKyAqICBkZWxldGlvbiB3aXRob3V0IG5vdGljZS48L2I+CisgKgogICogQHNpbmNlIDEuMgogICogQGF1dGhvciBLYWl5YW5nIExpdSAob3JpZ2luYWwpCiAgKiBAYXV0aG9yIFJvYmVydCBGaWVsZCAocmV3cml0ZSkKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFkb2MvUGFyYW1UYWdJbXBsLmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhZG9jL1BhcmFtVGFnSW1wbC5qYXZhCmluZGV4IDYwODA5YmIuLjgwMzM0MDUgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFkb2MvUGFyYW1UYWdJbXBsLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWRvYy9QYXJhbVRhZ0ltcGwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTcsIDIwMTEsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTMzLDYgKzMzLDExIEBACiAgKiBSZXByZXNlbnRzIGFuIEBwYXJhbSBkb2N1bWVudGF0aW9uIHRhZy4KICAqIFBhcnNlcyBhbmQgc3RvcmVzIHRoZSBuYW1lIGFuZCBjb21tZW50IHBhcnRzIG9mIHRoZSBwYXJhbWV0ZXIgdGFnLgogICoKKyAqICA8cD48Yj5UaGlzIGlzIE5PVCBwYXJ0IG9mIGFueSBzdXBwb3J0ZWQgQVBJLgorICogIElmIHlvdSB3cml0ZSBjb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGlzLCB5b3UgZG8gc28gYXQgeW91ciBvd24gcmlzay4KKyAqICBUaGlzIGNvZGUgYW5kIGl0cyBpbnRlcm5hbCBpbnRlcmZhY2VzIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSBvcgorICogIGRlbGV0aW9uIHdpdGhvdXQgbm90aWNlLjwvYj4KKyAqCiAgKiBAYXV0aG9yIFJvYmVydCBGaWVsZAogICoKICAqLwpAQCAtMTAxLDggKzEwNiw4IEBACiAgICAgICogVGFnSW1wbHMgY29uc2lzdGluZyBvZiBTZWVUYWdJbXBsKHMpIGFuZCB0ZXh0IGNvbnRhaW5pbmcgVGFnSW1wbChzKS4KICAgICAgKgogICAgICAqIEByZXR1cm4gVGFnSW1wbFtdIEFycmF5IG9mIHRhZ3Mgd2l0aCBpbmxpbmUgU2VlVGFnSW1wbHMuCi0gICAgICogQHNlZSBUYWdJbXBsI2lubGluZVRhZ0ltcGxzKCkKLSAgICAgKiBAc2VlIFRocm93c1RhZ0ltcGwjaW5saW5lVGFnSW1wbHMoKQorICAgICAqIEBzZWUgVGFnSW1wbCNpbmxpbmVUYWdzKCkKKyAgICAgKiBAc2VlIFRocm93c1RhZ0ltcGwjaW5saW5lVGFncygpCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFRhZ1tdIGlubGluZVRhZ3MoKSB7CmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhZG9jL1BhcmFtZXRlckltcGwuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFkb2MvUGFyYW1ldGVySW1wbC5qYXZhCmluZGV4IDlhYzE5YTEuLjUyNGE1ZWEgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFkb2MvUGFyYW1ldGVySW1wbC5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFkb2MvUGFyYW1ldGVySW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMTk5NywgMjAwNSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5NywgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjksMTIgKzI5LDE2IEBACiAKIGltcG9ydCBjb20uc3VuLnRvb2xzLmphdmFjLmNvZGUuQXR0cmlidXRlOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuamF2YWMuY29kZS5TeW1ib2wuVmFyU3ltYm9sOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuamF2YWMuY29kZS5UeXBlOwogCiAvKioKICAqIFBhcmFtZXRlckltcGwgaW5mb3JtYXRpb24uCiAgKiBUaGlzIGluY2x1ZGVzIGEgcGFyYW1ldGVyIHR5cGUgYW5kIHBhcmFtZXRlciBuYW1lLgogICoKKyAqICA8cD48Yj5UaGlzIGlzIE5PVCBwYXJ0IG9mIGFueSBzdXBwb3J0ZWQgQVBJLgorICogIElmIHlvdSB3cml0ZSBjb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGlzLCB5b3UgZG8gc28gYXQgeW91ciBvd24gcmlzay4KKyAqICBUaGlzIGNvZGUgYW5kIGl0cyBpbnRlcm5hbCBpbnRlcmZhY2VzIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSBvcgorICogIGRlbGV0aW9uIHdpdGhvdXQgbm90aWNlLjwvYj4KKyAqCiAgKiBAYXV0aG9yIEthaXlhbmcgTGl1IChvcmlnaW5hbCkKICAqIEBhdXRob3IgUm9iZXJ0IEZpZWxkIChyZXdyaXRlKQogICogQGF1dGhvciBTY290dCBTZWxpZ21hbiAoZ2VuZXJpY3MsIGFubm90YXRpb25zKQpkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWRvYy9QYXJhbWV0ZXJpemVkVHlwZUltcGwuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFkb2MvUGFyYW1ldGVyaXplZFR5cGVJbXBsLmphdmEKaW5kZXggODM4OTk0Zi4uMTk3NGVjMSAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWRvYy9QYXJhbWV0ZXJpemVkVHlwZUltcGwuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhZG9jL1BhcmFtZXRlcml6ZWRUeXBlSW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMzgsNiArMzgsMTEgQEAKICAqIEltcGxlbWVudGF0aW9uIG9mIDxjb2RlPlBhcmFtZXRlcml6ZWRUeXBlPC9jb2RlPiwgd2hpY2gKICAqIHJlcHJlc2VudHMgYW4gaW52b2NhdGlvbiBvZiBhIGdlbmVyaWMgY2xhc3Mgb3IgaW50ZXJmYWNlLgogICoKKyAqICA8cD48Yj5UaGlzIGlzIE5PVCBwYXJ0IG9mIGFueSBzdXBwb3J0ZWQgQVBJLgorICogIElmIHlvdSB3cml0ZSBjb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGlzLCB5b3UgZG8gc28gYXQgeW91ciBvd24gcmlzay4KKyAqICBUaGlzIGNvZGUgYW5kIGl0cyBpbnRlcm5hbCBpbnRlcmZhY2VzIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSBvcgorICogIGRlbGV0aW9uIHdpdGhvdXQgbm90aWNlLjwvYj4KKyAqCiAgKiBAYXV0aG9yIFNjb3R0IFNlbGlnbWFuCiAgKiBAc2luY2UgMS41CiAgKi8KZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFkb2MvUHJpbWl0aXZlVHlwZS5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWRvYy9QcmltaXRpdmVUeXBlLmphdmEKaW5kZXggYmU2MTIyOC4uMTU2NzlhNyAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWRvYy9QcmltaXRpdmVUeXBlLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWRvYy9QcmltaXRpdmVUeXBlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDAzLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNywxMyArMjcsMTIgQEAKIAogaW1wb3J0IGNvbS5zdW4uamF2YWRvYy4qOwogCi1pbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy5jb2RlLlN5bWJvbDsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmphdmFjLmNvZGUuU3ltYm9sLkNsYXNzU3ltYm9sOwotCi1pbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy5jb2RlLlR5cGU7Ci1pbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy5jb2RlLlR5cGVUYWdzOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuamF2YWMuY29kZS5UeXBlLkNsYXNzVHlwZTsKLQorLyoqCisgKiAgPHA+PGI+VGhpcyBpcyBOT1QgcGFydCBvZiBhbnkgc3VwcG9ydGVkIEFQSS4KKyAqICBJZiB5b3Ugd3JpdGUgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhpcywgeW91IGRvIHNvIGF0IHlvdXIgb3duIHJpc2suCisgKiAgVGhpcyBjb2RlIGFuZCBpdHMgaW50ZXJuYWwgaW50ZXJmYWNlcyBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugb3IKKyAqICBkZWxldGlvbiB3aXRob3V0IG5vdGljZS48L2I+CisgKi8KIGNsYXNzIFByaW1pdGl2ZVR5cGUgaW1wbGVtZW50cyBjb20uc3VuLmphdmFkb2MuVHlwZSB7CiAKICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwpkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWRvYy9Qcm9ncmFtRWxlbWVudERvY0ltcGwuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFkb2MvUHJvZ3JhbUVsZW1lbnREb2NJbXBsLmphdmEKaW5kZXggZTZjZDBlOC4uY2RkNGE0NCAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWRvYy9Qcm9ncmFtRWxlbWVudERvY0ltcGwuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhZG9jL1Byb2dyYW1FbGVtZW50RG9jSW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMTk5NywgMjAwNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5NywgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMjYgKzI1LDI3IEBACiAKIHBhY2thZ2UgY29tLnN1bi50b29scy5qYXZhZG9jOwogCi1pbXBvcnQgY29tLnN1bi5qYXZhZG9jLio7Ci0KLWltcG9ydCBjb20uc3VuLnRvb2xzLmphdmFjLmNvZGUuQXR0cmlidXRlOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuamF2YWMuY29kZS5GbGFnczsKLWltcG9ydCBjb20uc3VuLnRvb2xzLmphdmFjLmNvZGUuU3ltYm9sOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuamF2YWMuY29kZS5TeW1ib2wuQ2xhc3NTeW1ib2w7Ci0KLWltcG9ydCBjb20uc3VuLnRvb2xzLmphdmFjLnRyZWUuSkNUcmVlOwotCi1pbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy51dGlsLlBvc2l0aW9uOwotCiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7CiBpbXBvcnQgamF2YS50ZXh0LkNvbGxhdGlvbktleTsKIAoraW1wb3J0IGNvbS5zdW4uamF2YWRvYy4qOworaW1wb3J0IGNvbS5zdW4udG9vbHMuamF2YWMuY29kZS5BdHRyaWJ1dGU7CitpbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy5jb2RlLlN5bWJvbDsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmphdmFjLmNvZGUuU3ltYm9sLkNsYXNzU3ltYm9sOworaW1wb3J0IGNvbS5zdW4udG9vbHMuamF2YWMudHJlZS5KQ1RyZWU7CitpbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy51dGlsLlBvc2l0aW9uOworCiAvKioKICAqIFJlcHJlc2VudHMgYSBqYXZhIHByb2dyYW0gZWxlbWVudDogY2xhc3MsIGludGVyZmFjZSwgZmllbGQsCiAgKiBjb25zdHJ1Y3Rvciwgb3IgbWV0aG9kLgogICogVGhpcyBpcyBhbiBhYnN0cmFjdCBjbGFzcyBkZWFsaW5nIHdpdGggaW5mb3JtYXRpb24gY29tbW9uIHRvCiAgKiB0aGVzZSBlbGVtZW50cy4KICAqCisgKiAgPHA+PGI+VGhpcyBpcyBOT1QgcGFydCBvZiBhbnkgc3VwcG9ydGVkIEFQSS4KKyAqICBJZiB5b3Ugd3JpdGUgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhpcywgeW91IGRvIHNvIGF0IHlvdXIgb3duIHJpc2suCisgKiAgVGhpcyBjb2RlIGFuZCBpdHMgaW50ZXJuYWwgaW50ZXJmYWNlcyBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugb3IKKyAqICBkZWxldGlvbiB3aXRob3V0IG5vdGljZS48L2I+CisgKgogICogQHNlZSBNZW1iZXJEb2NJbXBsCiAgKiBAc2VlIENsYXNzRG9jSW1wbAogICoKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFkb2MvUm9vdERvY0ltcGwuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFkb2MvUm9vdERvY0ltcGwuamF2YQppbmRleCA1ZjEwN2ZhLi5kNmViYTJlIDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhZG9jL1Jvb3REb2NJbXBsLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWRvYy9Sb290RG9jSW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMTk5NywgMjAxMSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5NywgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtNDAsNyArNDAsMTIgQEAKIC8qKgogICogVGhpcyBjbGFzcyBob2xkcyB0aGUgaW5mb3JtYXRpb24gZnJvbSBvbmUgcnVuIG9mIGphdmFkb2MuCiAgKiBQYXJ0aWN1bGFybHkgdGhlIHBhY2thZ2VzLCBjbGFzc2VzIGFuZCBvcHRpb25zIHNwZWNpZmllZAotICogYnkgdGhlIHVzZXIuLgorICogYnkgdGhlIHVzZXIuCisgKgorICogIDxwPjxiPlRoaXMgaXMgTk9UIHBhcnQgb2YgYW55IHN1cHBvcnRlZCBBUEkuCisgKiAgSWYgeW91IHdyaXRlIGNvZGUgdGhhdCBkZXBlbmRzIG9uIHRoaXMsIHlvdSBkbyBzbyBhdCB5b3VyIG93biByaXNrLgorICogIFRoaXMgY29kZSBhbmQgaXRzIGludGVybmFsIGludGVyZmFjZXMgYXJlIHN1YmplY3QgdG8gY2hhbmdlIG9yCisgKiAgZGVsZXRpb24gd2l0aG91dCBub3RpY2UuPC9iPgogICoKICAqIEBzaW5jZSAxLjIKICAqIEBhdXRob3IgUm9iZXJ0IEZpZWxkCmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhZG9jL1NlZVRhZ0ltcGwuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFkb2MvU2VlVGFnSW1wbC5qYXZhCmluZGV4IGY3NThiMTYuLjQ5OTRmZTYgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFkb2MvU2VlVGFnSW1wbC5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFkb2MvU2VlVGFnSW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMTk5NywgMjAxMSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5NywgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMTQgKzI1LDE4IEBACiAKIHBhY2thZ2UgY29tLnN1bi50b29scy5qYXZhZG9jOwogCi1pbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy51dGlsLio7Ci0KIGltcG9ydCBjb20uc3VuLmphdmFkb2MuKjsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmphdmFjLnV0aWwuKjsKIAogLyoqCiAgKiBSZXByZXNlbnRzIGEgc2VlIGFsc28gZG9jdW1lbnRhdGlvbiB0YWcuCiAgKiBUaGUgQHNlZSB0YWcgY2FuIGJlIHBsYWluIHRleHQsIG9yIHJlZmVyZW5jZSBhIGNsYXNzIG9yIG1lbWJlci4KICAqCisgKiAgPHA+PGI+VGhpcyBpcyBOT1QgcGFydCBvZiBhbnkgc3VwcG9ydGVkIEFQSS4KKyAqICBJZiB5b3Ugd3JpdGUgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhpcywgeW91IGRvIHNvIGF0IHlvdXIgb3duIHJpc2suCisgKiAgVGhpcyBjb2RlIGFuZCBpdHMgaW50ZXJuYWwgaW50ZXJmYWNlcyBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugb3IKKyAqICBkZWxldGlvbiB3aXRob3V0IG5vdGljZS48L2I+CisgKgogICogQGF1dGhvciBLYWl5YW5nIExpdSAob3JpZ2luYWwpCiAgKiBAYXV0aG9yIFJvYmVydCBGaWVsZCAocmV3cml0ZSkKICAqIEBhdXRob3IgQXR1bCBNIERhbWJhbGthcgpkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWRvYy9TZXJpYWxGaWVsZFRhZ0ltcGwuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFkb2MvU2VyaWFsRmllbGRUYWdJbXBsLmphdmEKaW5kZXggYzQyOWJhNy4uZTg5ODY2ZCAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWRvYy9TZXJpYWxGaWVsZFRhZ0ltcGwuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhZG9jL1NlcmlhbEZpZWxkVGFnSW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAxMSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5OCwgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtNDEsNiArNDEsMTEgQEAKICAqIFRoaXMgdGFnIGlzIG9ubHkgYWxsb3dlZCBpbiB0aGUgamF2YWRvYyBmb3IgdGhlIHNwZWNpYWwgbWVtYmVyCiAgKiBzZXJpYWxQZXJzaXN0ZW50RmllbGRzLgogICoKKyAqICA8cD48Yj5UaGlzIGlzIE5PVCBwYXJ0IG9mIGFueSBzdXBwb3J0ZWQgQVBJLgorICogIElmIHlvdSB3cml0ZSBjb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGlzLCB5b3UgZG8gc28gYXQgeW91ciBvd24gcmlzay4KKyAqICBUaGlzIGNvZGUgYW5kIGl0cyBpbnRlcm5hbCBpbnRlcmZhY2VzIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSBvcgorICogIGRlbGV0aW9uIHdpdGhvdXQgbm90aWNlLjwvYj4KKyAqCiAgKiBAYXV0aG9yIEpvZSBGaWFsbGkKICAqIEBhdXRob3IgTmVhbCBHYWZ0ZXIKICAqCmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhZG9jL1NlcmlhbGl6ZWRGb3JtLmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhZG9jL1NlcmlhbGl6ZWRGb3JtLmphdmEKaW5kZXggZThiMTQ3Zi4uNTU5YmUzNiAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWRvYy9TZXJpYWxpemVkRm9ybS5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFkb2MvU2VyaWFsaXplZEZvcm0uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMDgsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI2LDE1ICsyNiwxNCBAQAogcGFja2FnZSBjb20uc3VuLnRvb2xzLmphdmFkb2M7CiAKIGltcG9ydCBjb20uc3VuLmphdmFkb2MuKjsKLQogaW1wb3J0IGNvbS5zdW4udG9vbHMuamF2YWMuY29kZS5GbGFnczsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmphdmFjLmNvZGUuS2luZHM7CiBpbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy5jb2RlLlNjb3BlOwotaW1wb3J0IGNvbS5zdW4udG9vbHMuamF2YWMuY29kZS5TeW1ib2wuVmFyU3ltYm9sOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuamF2YWMuY29kZS5TeW1ib2wuQ2xhc3NTeW1ib2w7CiBpbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy5jb2RlLlN5bWJvbC5NZXRob2RTeW1ib2w7Ci1pbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy51dGlsLk5hbWU7CitpbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy5jb2RlLlN5bWJvbC5WYXJTeW1ib2w7CiBpbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy51dGlsLkxpc3RCdWZmZXI7CitpbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy51dGlsLk5hbWU7CiBpbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy51dGlsLk5hbWVzOwogCiAvKioKQEAgLTU5LDYgKzU4LDExIEBACiAgKiAgICBiLiBGb3IgRXh0ZXJuYWxpemFibGUsIGRhdGEgbGF5b3V0IGlzIGRlc2NyaWJlZCBieSAyKGIpLgogICogPC9wcmU+CiAgKgorICogIDxwPjxiPlRoaXMgaXMgTk9UIHBhcnQgb2YgYW55IHN1cHBvcnRlZCBBUEkuCisgKiAgSWYgeW91IHdyaXRlIGNvZGUgdGhhdCBkZXBlbmRzIG9uIHRoaXMsIHlvdSBkbyBzbyBhdCB5b3VyIG93biByaXNrLgorICogIFRoaXMgY29kZSBhbmQgaXRzIGludGVybmFsIGludGVyZmFjZXMgYXJlIHN1YmplY3QgdG8gY2hhbmdlIG9yCisgKiAgZGVsZXRpb24gd2l0aG91dCBub3RpY2UuPC9iPgorICoKICAqIEBzaW5jZSAxLjIKICAqIEBhdXRob3IgSm9lIEZpYWxsaQogICogQGF1dGhvciBOZWFsIEdhZnRlciAocmV3cml0ZSBidXQgbm90IHRvbyBwcm91ZCkKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFkb2MvU291cmNlUG9zaXRpb25JbXBsLmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhZG9jL1NvdXJjZVBvc2l0aW9uSW1wbC5qYXZhCmluZGV4IGQyMGI1NzkuLjg5MTA2ZGUgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFkb2MvU291cmNlUG9zaXRpb25JbXBsLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWRvYy9Tb3VyY2VQb3NpdGlvbkltcGwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDksIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTM0LDYgKzM0LDExIEBACiAvKioKICAqIEEgc291cmNlIHBvc2l0aW9uOiBmaWxlbmFtZSwgbGluZSBudW1iZXIsIGFuZCBjb2x1bW4gbnVtYmVyLgogICoKKyAqICA8cD48Yj5UaGlzIGlzIE5PVCBwYXJ0IG9mIGFueSBzdXBwb3J0ZWQgQVBJLgorICogIElmIHlvdSB3cml0ZSBjb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGlzLCB5b3UgZG8gc28gYXQgeW91ciBvd24gcmlzay4KKyAqICBUaGlzIGNvZGUgYW5kIGl0cyBpbnRlcm5hbCBpbnRlcmZhY2VzIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSBvcgorICogIGRlbGV0aW9uIHdpdGhvdXQgbm90aWNlLjwvYj4KKyAqCiAgKiBAc2luY2UgSjJTRTEuNAogICogQGF1dGhvciBOZWFsIE0gR2FmdGVyCiAgKiBAYXV0aG9yIE1pY2hhZWwgVmFuIERlIFZhbnRlciAocG9zaXRpb24gcmVwcmVzZW50YXRpb24gY2hhbmdlZCB0byBjaGFyIG9mZnNldHMpCmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhZG9jL1N0YXJ0LmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhZG9jL1N0YXJ0LmphdmEKaW5kZXggNjY1MTRmNC4uNjdmNWU0YyAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWRvYy9TdGFydC5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFkb2MvU3RhcnQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTcsIDIwMTEsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDI4ICsyNSwzMCBAQAogCiBwYWNrYWdlIGNvbS5zdW4udG9vbHMuamF2YWRvYzsKIAotaW1wb3J0IGNvbS5zdW4uamF2YWRvYy4qOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKIAoraW1wb3J0IGNvbS5zdW4uamF2YWRvYy4qOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuamF2YWMubWFpbi5Db21tYW5kTGluZTsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmphdmFjLnV0aWwuQ29udGV4dDsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmphdmFjLnV0aWwuTGlzdDsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmphdmFjLnV0aWwuTGlzdEJ1ZmZlcjsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmphdmFjLnV0aWwuTG9nOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuamF2YWMudXRpbC5PcHRpb25zOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KIGltcG9ydCBzdGF0aWMgY29tLnN1bi50b29scy5qYXZhYy5jb2RlLkZsYWdzLio7CiAKIC8qKgogICogTWFpbiBwcm9ncmFtIG9mIEphdmFkb2MuCiAgKiBQcmV2aW91c2x5IG5hbWVkICJNYWluIi4KICAqCisgKiAgPHA+PGI+VGhpcyBpcyBOT1QgcGFydCBvZiBhbnkgc3VwcG9ydGVkIEFQSS4KKyAqICBJZiB5b3Ugd3JpdGUgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhpcywgeW91IGRvIHNvIGF0IHlvdXIgb3duIHJpc2suCisgKiAgVGhpcyBjb2RlIGFuZCBpdHMgaW50ZXJuYWwgaW50ZXJmYWNlcyBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugb3IKKyAqICBkZWxldGlvbiB3aXRob3V0IG5vdGljZS48L2I+CisgKgogICogQHNpbmNlIDEuMgogICogQGF1dGhvciBSb2JlcnQgRmllbGQKICAqIEBhdXRob3IgTmVhbCBHYWZ0ZXIgKHJld3JpdGUpCmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhZG9jL1RhZ0ltcGwuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFkb2MvVGFnSW1wbC5qYXZhCmluZGV4IDEwYTI3NjQuLmExMDZiYjYgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFkb2MvVGFnSW1wbC5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFkb2MvVGFnSW1wbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMTk5NywgMjAwNCwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMTk5NywgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMzQsNiArMzQsMTEgQEAKICAqIHNwZWNpYWwgcHJvY2Vzc2luZyBhcmUgaGFuZGxlZCBieSBzdWJjbGFzc2VzIChQYXJhbVRhZ0ltcGwsIFNlZVRhZ0ltcGwsCiAgKiBhbmQgVGhyb3dzVGFnSW1wbAogICoKKyAqICA8cD48Yj5UaGlzIGlzIE5PVCBwYXJ0IG9mIGFueSBzdXBwb3J0ZWQgQVBJLgorICogIElmIHlvdSB3cml0ZSBjb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGlzLCB5b3UgZG8gc28gYXQgeW91ciBvd24gcmlzay4KKyAqICBUaGlzIGNvZGUgYW5kIGl0cyBpbnRlcm5hbCBpbnRlcmZhY2VzIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSBvcgorICogIGRlbGV0aW9uIHdpdGhvdXQgbm90aWNlLjwvYj4KKyAqCiAgKiBAYXV0aG9yIFJvYmVydCBGaWVsZAogICogQGF1dGhvciBBdHVsIE0gRGFtYmFsa2FyCiAgKiBAYXV0aG9yIE5lYWwgTSBHYWZ0ZXIKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFkb2MvVGhyb3dzVGFnSW1wbC5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWRvYy9UaHJvd3NUYWdJbXBsLmphdmEKaW5kZXggZjYzZmZlYy4uNmRhNDU0ZiAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWRvYy9UaHJvd3NUYWdJbXBsLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWRvYy9UaHJvd3NUYWdJbXBsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAxOTk3LCAyMDExLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk3LCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0zMyw2ICszMywxMSBAQAogICogVGhlIGV4Y2VwdGlvbiBuYW1lIG15IGJlIHRoZSBuYW1lIG9mIGEgdHlwZSB2YXJpYWJsZS4KICAqIE5vdGU6IEBleGNlcHRpb24gaXMgYSBiYWNrd2FyZHMgY29tcGF0aWJsZSBzeW5vbnlteSBmb3IgQHRocm93cy4KICAqCisgKiAgPHA+PGI+VGhpcyBpcyBOT1QgcGFydCBvZiBhbnkgc3VwcG9ydGVkIEFQSS4KKyAqICBJZiB5b3Ugd3JpdGUgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhpcywgeW91IGRvIHNvIGF0IHlvdXIgb3duIHJpc2suCisgKiAgVGhpcyBjb2RlIGFuZCBpdHMgaW50ZXJuYWwgaW50ZXJmYWNlcyBhcmUgc3ViamVjdCB0byBjaGFuZ2Ugb3IKKyAqICBkZWxldGlvbiB3aXRob3V0IG5vdGljZS48L2I+CisgKgogICogQGF1dGhvciBSb2JlcnQgRmllbGQKICAqIEBhdXRob3IgQXR1bCBNIERhbWJhbGthcgogICogQHNlZSBFeGVjdXRhYmxlTWVtYmVyRG9jSW1wbCN0aHJvd3NUYWdzKCkKQEAgLTEwOCw4ICsxMTMsOCBAQAogICAgICAqIFRhZ0ltcGxzIGNvbnNpc3Rpbmcgb2YgU2VlVGFnSW1wbChzKSBhbmQgdGV4dCBjb250YWluaW5nIFRhZ0ltcGwocykuCiAgICAgICoKICAgICAgKiBAcmV0dXJuIFRhZ0ltcGxbXSBBcnJheSBvZiB0YWdzIHdpdGggaW5saW5lIFNlZVRhZ0ltcGxzLgotICAgICAqIEBzZWUgVGFnSW1wbCNpbmxpbmVUYWdJbXBscygpCi0gICAgICogQHNlZSBQYXJhbVRhZ0ltcGwjaW5saW5lVGFnSW1wbHMoKQorICAgICAqIEBzZWUgVGFnSW1wbCNpbmxpbmVUYWdzKCkKKyAgICAgKiBAc2VlIFBhcmFtVGFnSW1wbCNpbmxpbmVUYWdzKCkKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgVGFnW10gaW5saW5lVGFncygpIHsKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFkb2MvVHlwZU1ha2VyLmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhZG9jL1R5cGVNYWtlci5qYXZhCmluZGV4IDhmN2Y3N2MuLjYzYWRhMmIgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFkb2MvVHlwZU1ha2VyLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWRvYy9UeXBlTWFrZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTcsIDIwMTEsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI2LDE4ICsyNiwyMSBAQAogcGFja2FnZSBjb20uc3VuLnRvb2xzLmphdmFkb2M7CiAKIGltcG9ydCBjb20uc3VuLmphdmFkb2MuKjsKLQogaW1wb3J0IGNvbS5zdW4udG9vbHMuamF2YWMuY29kZS5TeW1ib2w7CiBpbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy5jb2RlLlN5bWJvbC5DbGFzc1N5bWJvbDsKIGltcG9ydCBjb20uc3VuLnRvb2xzLmphdmFjLmNvZGUuVHlwZTsKK2ltcG9ydCBjb20uc3VuLnRvb2xzLmphdmFjLmNvZGUuVHlwZS5BcnJheVR5cGU7CiBpbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy5jb2RlLlR5cGUuQ2xhc3NUeXBlOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuamF2YWMuY29kZS5UeXBlLlR5cGVWYXI7Ci1pbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy5jb2RlLlR5cGUuQXJyYXlUeXBlOwogaW1wb3J0IGNvbS5zdW4udG9vbHMuamF2YWMudXRpbC5MaXN0OwotCiBpbXBvcnQgc3RhdGljIGNvbS5zdW4udG9vbHMuamF2YWMuY29kZS5UeXBlVGFncy4qOwogCi0KKy8qKgorICogIDxwPjxiPlRoaXMgaXMgTk9UIHBhcnQgb2YgYW55IHN1cHBvcnRlZCBBUEkuCisgKiAgSWYgeW91IHdyaXRlIGNvZGUgdGhhdCBkZXBlbmRzIG9uIHRoaXMsIHlvdSBkbyBzbyBhdCB5b3VyIG93biByaXNrLgorICogIFRoaXMgY29kZSBhbmQgaXRzIGludGVybmFsIGludGVyZmFjZXMgYXJlIHN1YmplY3QgdG8gY2hhbmdlIG9yCisgKiAgZGVsZXRpb24gd2l0aG91dCBub3RpY2UuPC9iPgorICovCiBwdWJsaWMgY2xhc3MgVHlwZU1ha2VyIHsKIAogICAgIHB1YmxpYyBzdGF0aWMgY29tLnN1bi5qYXZhZG9jLlR5cGUgZ2V0VHlwZShEb2NFbnYgZW52LCBUeXBlIHQpIHsKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFkb2MvVHlwZVZhcmlhYmxlSW1wbC5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWRvYy9UeXBlVmFyaWFibGVJbXBsLmphdmEKaW5kZXggNTU2NjBhYy4uODVmOTQ2YyAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWRvYy9UeXBlVmFyaWFibGVJbXBsLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWRvYy9UeXBlVmFyaWFibGVJbXBsLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDExLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSw3ICsyNSw2IEBACiAKIHBhY2thZ2UgY29tLnN1bi50b29scy5qYXZhZG9jOwogCi0KIGltcG9ydCBjb20uc3VuLmphdmFkb2MuKjsKIAogaW1wb3J0IGNvbS5zdW4udG9vbHMuamF2YWMuY29kZS5LaW5kczsKQEAgLTQyLDYgKzQxLDExIEBACiAgKiBJbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5UeXBlVmFyaWFibGU8L2NvZGU+LCB3aGljaAogICogcmVwcmVzZW50cyBhIHR5cGUgdmFyaWFibGUuCiAgKgorICogIDxwPjxiPlRoaXMgaXMgTk9UIHBhcnQgb2YgYW55IHN1cHBvcnRlZCBBUEkuCisgKiAgSWYgeW91IHdyaXRlIGNvZGUgdGhhdCBkZXBlbmRzIG9uIHRoaXMsIHlvdSBkbyBzbyBhdCB5b3VyIG93biByaXNrLgorICogIFRoaXMgY29kZSBhbmQgaXRzIGludGVybmFsIGludGVyZmFjZXMgYXJlIHN1YmplY3QgdG8gY2hhbmdlIG9yCisgKiAgZGVsZXRpb24gd2l0aG91dCBub3RpY2UuPC9iPgorICoKICAqIEBhdXRob3IgU2NvdHQgU2VsaWdtYW4KICAqIEBzaW5jZSAxLjUKICAqLwpkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWRvYy9XaWxkY2FyZFR5cGVJbXBsLmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhZG9jL1dpbGRjYXJkVHlwZUltcGwuamF2YQppbmRleCBkYWNlMGU4Li5jZjQ1OGQyIDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhZG9jL1dpbGRjYXJkVHlwZUltcGwuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhZG9jL1dpbGRjYXJkVHlwZUltcGwuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTEsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDcgKzI1LDYgQEAKIAogcGFja2FnZSBjb20uc3VuLnRvb2xzLmphdmFkb2M7CiAKLQogaW1wb3J0IGNvbS5zdW4uamF2YWRvYy4qOwogCiBpbXBvcnQgY29tLnN1bi50b29scy5qYXZhYy5jb2RlLlN5bWJvbC5DbGFzc1N5bWJvbDsKQEAgLTM3LDYgKzM2LDExIEBACiAgKiBJbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5XaWxkY2FyZFR5cGU8L2NvZGU+LCB3aGljaAogICogcmVwcmVzZW50cyBhIHdpbGRjYXJkIHR5cGUuCiAgKgorICogIDxwPjxiPlRoaXMgaXMgTk9UIHBhcnQgb2YgYW55IHN1cHBvcnRlZCBBUEkuCisgKiAgSWYgeW91IHdyaXRlIGNvZGUgdGhhdCBkZXBlbmRzIG9uIHRoaXMsIHlvdSBkbyBzbyBhdCB5b3VyIG93biByaXNrLgorICogIFRoaXMgY29kZSBhbmQgaXRzIGludGVybmFsIGludGVyZmFjZXMgYXJlIHN1YmplY3QgdG8gY2hhbmdlIG9yCisgKiAgZGVsZXRpb24gd2l0aG91dCBub3RpY2UuPC9iPgorICoKICAqIEBhdXRob3IgU2NvdHQgU2VsaWdtYW4KICAqIEBzaW5jZSAxLjUKICAqLwpkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWgvR2VuLmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhaC9HZW4uamF2YQppbmRleCA1NjgyOTg2Li5kYzUwYmFlIDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhaC9HZW4uamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhaC9HZW4uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDksIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI4Nyw3ICsyODcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RTdHJpbmcgPSB2YWx1ZS50b1N0cmluZygpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAoY29uc3RTdHJpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgcyA9IG5ldyBTdHJpbmdCdWZmZXIoIiN1bmRlZiAiKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzID0gbmV3IFN0cmluZ0J1aWxkZXIoIiN1bmRlZiAiKTsKICAgICAgICAgICAgICAgICAgICAgcy5hcHBlbmQoY25hbWUpOyBzLmFwcGVuZCgiXyIpOyBzLmFwcGVuZChmbmFtZSk7IHMuYXBwZW5kKGxpbmVTZXApOwogICAgICAgICAgICAgICAgICAgICBzLmFwcGVuZCgiI2RlZmluZSAiKTsgcy5hcHBlbmQoY25hbWUpOyBzLmFwcGVuZCgiXyIpOwogICAgICAgICAgICAgICAgICAgICBzLmFwcGVuZChmbmFtZSk7IHMuYXBwZW5kKCIgIik7IHMuYXBwZW5kKGNvbnN0U3RyaW5nKTsKQEAgLTM3MCw3ICszNzAsNyBAQAogCiAgICAgLy8gYy5mLiBNZXRob2REb2Muc2lnbmF0dXJlCiAgICAgU3RyaW5nIHNpZ25hdHVyZShFeGVjdXRhYmxlRWxlbWVudCBlKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIigiKTsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCIoIik7CiAgICAgICAgIFN0cmluZyBzZXAgPSAiIjsKICAgICAgICAgZm9yIChWYXJpYWJsZUVsZW1lbnQgcDogZS5nZXRQYXJhbWV0ZXJzKCkpIHsKICAgICAgICAgICAgIHNiLmFwcGVuZChzZXApOwpkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWgvTExOSS5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWgvTExOSS5qYXZhCmluZGV4IGFiNjdmOGMuLjc4MzY0OGEgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFoL0xMTkkuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhaC9MTE5JLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDExLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC02NDcsNyArNjQ3LDcgQEAKICAgICAgICAlJSUgVGhpcyBtYXkgbm90IGJlIHJpZ2h0LCBidXQgc2hvdWxkIGJlIGNhbGxlZCBtb3JlIG9mdGVuLiAqLwogICAgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgbmFtZVRvSWRlbnRpZmllcihTdHJpbmcgbmFtZSkgewogICAgICAgICBpbnQgbGVuID0gbmFtZS5sZW5ndGgoKTsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIobGVuKTsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBidWYgPSBuZXcgU3RyaW5nQnVpbGRlcihsZW4pOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgICBjaGFyIGMgPSBuYW1lLmNoYXJBdChpKTsKICAgICAgICAgICAgIGlmIChpc0FTQ0lJTGV0dGVyT3JEaWdpdChjKSkKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFoL01hbmdsZS5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWgvTWFuZ2xlLmphdmEKaW5kZXggNjE2YmI3NC4uMmNjNzRmNSAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWgvTWFuZ2xlLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWgvTWFuZ2xlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDEwLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC02Niw3ICs2Niw3IEBACiAgICAgfQogCiAgICAgcHVibGljIGZpbmFsIFN0cmluZyBtYW5nbGUoQ2hhclNlcXVlbmNlIG5hbWUsIGludCBtdHlwZSkgewotICAgICAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigxMDApOworICAgICAgICBTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKDEwMCk7CiAgICAgICAgIGludCBsZW5ndGggPSBuYW1lLmxlbmd0aCgpOwogCiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKQEAgLTExNSw3ICsxMTUsNyBAQAogCiAgICAgcHVibGljIFN0cmluZyBtYW5nbGVNZXRob2QoRXhlY3V0YWJsZUVsZW1lbnQgbWV0aG9kLCBUeXBlRWxlbWVudCBjbGF6eiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG10eXBlKSB0aHJvd3MgVHlwZVNpZ25hdHVyZS5TaWduYXR1cmVFeGNlcHRpb24gewotICAgICAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigxMDApOworICAgICAgICBTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKDEwMCk7CiAgICAgICAgIHJlc3VsdC5hcHBlbmQoIkphdmFfIik7CiAKICAgICAgICAgaWYgKG10eXBlID09IE1hbmdsZS5UeXBlLk1FVEhPRF9KREtfMSkgewpAQCAtMTY0LDcgKzE2NCw3IEBACiAKICAgICAvLyBXYXJuaW5nOiBkdXBsaWNhdGVkIGluIEdlbgogICAgIHByaXZhdGUgU3RyaW5nIHNpZ25hdHVyZShFeGVjdXRhYmxlRWxlbWVudCBlKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAgICAgICAgIFN0cmluZyBzZXAgPSAiKCI7CiAgICAgICAgIGZvciAoVmFyaWFibGVFbGVtZW50IHA6IGUuZ2V0UGFyYW1ldGVycygpKSB7CiAgICAgICAgICAgICBzYi5hcHBlbmQoc2VwKTsKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFoL05hdGl2ZUhlYWRlclRvb2wuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFoL05hdGl2ZUhlYWRlclRvb2wuamF2YQppbmRleCA1MTA3ZGQxLi4xZjRhZGMwIDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhaC9OYXRpdmVIZWFkZXJUb29sLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YWgvTmF0aXZlSGVhZGVyVG9vbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjksMTEgKzI5LDEzIEBACiBpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OwogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGU7CitpbXBvcnQgamF2YXgudG9vbHMuRGlhZ25vc3RpYzsKIGltcG9ydCBqYXZheC50b29scy5EaWFnbm9zdGljTGlzdGVuZXI7CiBpbXBvcnQgamF2YXgudG9vbHMuSmF2YUZpbGVNYW5hZ2VyOwogaW1wb3J0IGphdmF4LnRvb2xzLkphdmFGaWxlT2JqZWN0OwogaW1wb3J0IGphdmF4LnRvb2xzLk9wdGlvbkNoZWNrZXI7CiBpbXBvcnQgamF2YXgudG9vbHMuU3RhbmRhcmRKYXZhRmlsZU1hbmFnZXI7CitpbXBvcnQgamF2YXgudG9vbHMuU3RhbmRhcmRMb2NhdGlvbjsKIGltcG9ydCBqYXZheC50b29scy5Ub29sOwogCiAvKioKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFwL0Rpc2Fzc2VtYmxlclRvb2wuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9jb20vc3VuL3Rvb2xzL2phdmFwL0Rpc2Fzc2VtYmxlclRvb2wuamF2YQppbmRleCAzNTZmYzlhLi44ZjdhNTg4IDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvY29tL3N1bi90b29scy9qYXZhcC9EaXNhc3NlbWJsZXJUb29sLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2NvbS9zdW4vdG9vbHMvamF2YXAvRGlzYXNzZW1ibGVyVG9vbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjksMTEgKzI5LDEzIEBACiBpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OwogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGU7CitpbXBvcnQgamF2YXgudG9vbHMuRGlhZ25vc3RpYzsKIGltcG9ydCBqYXZheC50b29scy5EaWFnbm9zdGljTGlzdGVuZXI7CiBpbXBvcnQgamF2YXgudG9vbHMuSmF2YUZpbGVNYW5hZ2VyOwogaW1wb3J0IGphdmF4LnRvb2xzLkphdmFGaWxlT2JqZWN0OwogaW1wb3J0IGphdmF4LnRvb2xzLk9wdGlvbkNoZWNrZXI7CiBpbXBvcnQgamF2YXgudG9vbHMuU3RhbmRhcmRKYXZhRmlsZU1hbmFnZXI7CitpbXBvcnQgamF2YXgudG9vbHMuU3RhbmRhcmRMb2NhdGlvbjsKIGltcG9ydCBqYXZheC50b29scy5Ub29sOwogCiAvKioKQEAgLTY5LDkgKzcxLDcgQEAKICAgICAgKiBAcGFyYW0gb3B0aW9ucyBjb21waWxlciBvcHRpb25zLCB7QGNvZGUgbnVsbH0gbWVhbnMgbm8gb3B0aW9ucwogICAgICAqIEBwYXJhbSBjbGFzc2VzIGNsYXNzIG5hbWVzIChmb3IgYW5ub3RhdGlvbiBwcm9jZXNzaW5nKSwge0Bjb2RlCiAgICAgICogbnVsbH0gbWVhbnMgbm8gY2xhc3MgbmFtZXMKLSAgICAgKiBAcGFyYW0gY29tcGlsYXRpb25Vbml0cyB0aGUgY29tcGlsYXRpb24gdW5pdHMgdG8gY29tcGlsZSwge0Bjb2RlCi0gICAgICogbnVsbH0gbWVhbnMgbm8gY29tcGlsYXRpb24gdW5pdHMKLSAgICAgKiBAcmV0dXJuIGFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGNvbXBpbGF0aW9uCisgICAgICogQHJldHVybiBhIHRhc2sgdG8gcGVyZm9ybSB0aGUgZGlzYXNzZW1ibHkKICAgICAgKiBAdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24gaWYgYW4gdW5yZWNvdmVyYWJsZSBlcnJvcgogICAgICAqIG9jY3VycmVkIGluIGEgdXNlciBzdXBwbGllZCBjb21wb25lbnQuICBUaGUKICAgICAgKiB7QGxpbmtwbGFpbiBUaHJvd2FibGUjZ2V0Q2F1c2UoKSBjYXVzZX0gd2lsbCBiZSB0aGUgZXJyb3IgaW4KZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9hbm5vdGF0aW9uL3Byb2Nlc3NpbmcvQ29tcGxldGlvbnMuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9hbm5vdGF0aW9uL3Byb2Nlc3NpbmcvQ29tcGxldGlvbnMuamF2YQppbmRleCAzZDk2MjA0Li4wNDRhZTIwIDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvYW5ub3RhdGlvbi9wcm9jZXNzaW5nL0NvbXBsZXRpb25zLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L2Fubm90YXRpb24vcHJvY2Vzc2luZy9Db21wbGV0aW9ucy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsOCArMjUsNiBAQAogCiBwYWNrYWdlIGphdmF4LmFubm90YXRpb24ucHJvY2Vzc2luZzsKIAotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KIC8qKgogICogVXRpbGl0eSBjbGFzcyBmb3IgYXNzZW1ibGluZyB7QGxpbmsgQ29tcGxldGlvbn0gb2JqZWN0cy4KICAqCmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvYW5ub3RhdGlvbi9wcm9jZXNzaW5nL0ZpbGVyRXhjZXB0aW9uLmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvYW5ub3RhdGlvbi9wcm9jZXNzaW5nL0ZpbGVyRXhjZXB0aW9uLmphdmEKaW5kZXggZDMzYjYzMS4uMzBhMTM4OCAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L2Fubm90YXRpb24vcHJvY2Vzc2luZy9GaWxlckV4Y2VwdGlvbi5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9hbm5vdGF0aW9uL3Byb2Nlc3NpbmcvRmlsZXJFeGNlcHRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI2LDcgKzI2LDYgQEAKIHBhY2thZ2UgamF2YXguYW5ub3RhdGlvbi5wcm9jZXNzaW5nOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5hbm5vdGF0aW9uLnByb2Nlc3NpbmcuRmlsZXI7CiAKIC8qKgogICogSW5kaWNhdGVzIGEge0BsaW5rIEZpbGVyfSBkZXRlY3RlZCBhbiBhdHRlbXB0IHRvIG9wZW4gYSBmaWxlIHRoYXQKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9hbm5vdGF0aW9uL3Byb2Nlc3NpbmcvUHJvY2Vzc2luZ0Vudmlyb25tZW50LmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvYW5ub3RhdGlvbi9wcm9jZXNzaW5nL1Byb2Nlc3NpbmdFbnZpcm9ubWVudC5qYXZhCmluZGV4IDY5MjQ1NjQuLjVhZGU3NzYgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9hbm5vdGF0aW9uL3Byb2Nlc3NpbmcvUHJvY2Vzc2luZ0Vudmlyb25tZW50LmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L2Fubm90YXRpb24vcHJvY2Vzc2luZy9Qcm9jZXNzaW5nRW52aXJvbm1lbnQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI2LDEyICsyNiwxMCBAQAogcGFja2FnZSBqYXZheC5hbm5vdGF0aW9uLnByb2Nlc3Npbmc7CiAKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiBpbXBvcnQgamF2YXgubGFuZy5tb2RlbC5Tb3VyY2VWZXJzaW9uOwogaW1wb3J0IGphdmF4LmxhbmcubW9kZWwudXRpbC5FbGVtZW50czsKIGltcG9ydCBqYXZheC5sYW5nLm1vZGVsLnV0aWwuVHlwZXM7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwogCiAvKioKICAqIEFuIGFubm90YXRpb24gcHJvY2Vzc2luZyB0b29sIGZyYW1ld29yayB3aWxsIHtAbGlua3BsYWluCmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvbGFuZy9tb2RlbC9lbGVtZW50L0Fubm90YXRpb25WYWx1ZS5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L2xhbmcvbW9kZWwvZWxlbWVudC9Bbm5vdGF0aW9uVmFsdWUuamF2YQppbmRleCAzYjY2YmFkLi42OGI1NDIxIDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvbGFuZy9tb2RlbC9lbGVtZW50L0Fubm90YXRpb25WYWx1ZS5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9sYW5nL21vZGVsL2VsZW1lbnQvQW5ub3RhdGlvblZhbHVlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2LCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwxMCArMjUsNiBAQAogCiBwYWNrYWdlIGphdmF4LmxhbmcubW9kZWwuZWxlbWVudDsKIAotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YXgubGFuZy5tb2RlbC50eXBlLio7Ci0KIC8qKgogICogUmVwcmVzZW50cyBhIHZhbHVlIG9mIGFuIGFubm90YXRpb24gdHlwZSBlbGVtZW50LgogICogQSB2YWx1ZSBpcyBvZiBvbmUgb2YgdGhlIGZvbGxvd2luZyB0eXBlczoKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9sYW5nL21vZGVsL2VsZW1lbnQvRWxlbWVudC5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L2xhbmcvbW9kZWwvZWxlbWVudC9FbGVtZW50LmphdmEKaW5kZXggNmQyNzQzYy4uNjRmZTdlYSAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L2xhbmcvbW9kZWwvZWxlbWVudC9FbGVtZW50LmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L2xhbmcvbW9kZWwvZWxlbWVudC9FbGVtZW50LmphdmEKQEAgLTMyLDcgKzMyLDYgQEAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogCi1pbXBvcnQgamF2YXgubGFuZy5tb2RlbC5lbGVtZW50Lk1vZGlmaWVyOwogaW1wb3J0IGphdmF4LmxhbmcubW9kZWwudHlwZS4qOwogaW1wb3J0IGphdmF4LmxhbmcubW9kZWwudXRpbC4qOwogCmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvbGFuZy9tb2RlbC9lbGVtZW50L0V4ZWN1dGFibGVFbGVtZW50LmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvbGFuZy9tb2RlbC9lbGVtZW50L0V4ZWN1dGFibGVFbGVtZW50LmphdmEKaW5kZXggOWQ1MTRmMi4uMTM4ZjM1OCAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L2xhbmcvbW9kZWwvZWxlbWVudC9FeGVjdXRhYmxlRWxlbWVudC5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9sYW5nL21vZGVsL2VsZW1lbnQvRXhlY3V0YWJsZUVsZW1lbnQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTEsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI2LDcgKzI2LDYgQEAKIHBhY2thZ2UgamF2YXgubGFuZy5tb2RlbC5lbGVtZW50OwogCiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YXgubGFuZy5tb2RlbC51dGlsLlR5cGVzOwogaW1wb3J0IGphdmF4LmxhbmcubW9kZWwudHlwZS4qOwogCiAvKioKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9sYW5nL21vZGVsL2VsZW1lbnQvVmFyaWFibGVFbGVtZW50LmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvbGFuZy9tb2RlbC9lbGVtZW50L1ZhcmlhYmxlRWxlbWVudC5qYXZhCmluZGV4IDc3NDUxZmEuLmNkODJlZmQgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9sYW5nL21vZGVsL2VsZW1lbnQvVmFyaWFibGVFbGVtZW50LmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L2xhbmcvbW9kZWwvZWxlbWVudC9WYXJpYWJsZUVsZW1lbnQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTEsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDcgKzI1LDYgQEAKIAogcGFja2FnZSBqYXZheC5sYW5nLm1vZGVsLmVsZW1lbnQ7CiAKLWltcG9ydCBqYXZheC5sYW5nLm1vZGVsLnR5cGUuVHlwZU1pcnJvcjsKIGltcG9ydCBqYXZheC5sYW5nLm1vZGVsLnV0aWwuRWxlbWVudHM7CiAKIC8qKgpkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L2xhbmcvbW9kZWwvdHlwZS9NaXJyb3JlZFR5cGVFeGNlcHRpb24uamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9sYW5nL21vZGVsL3R5cGUvTWlycm9yZWRUeXBlRXhjZXB0aW9uLmphdmEKaW5kZXggOGYwMWJlZC4uZmQ3OWYwNCAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L2xhbmcvbW9kZWwvdHlwZS9NaXJyb3JlZFR5cGVFeGNlcHRpb24uamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvbGFuZy9tb2RlbC90eXBlL01pcnJvcmVkVHlwZUV4Y2VwdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjcsNyArMjcsNiBAQAogCiBpbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CiBpbXBvcnQgamF2YXgubGFuZy5tb2RlbC5lbGVtZW50LkVsZW1lbnQ7CiAKIApkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L2xhbmcvbW9kZWwvdHlwZS9NaXJyb3JlZFR5cGVzRXhjZXB0aW9uLmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvbGFuZy9tb2RlbC90eXBlL01pcnJvcmVkVHlwZXNFeGNlcHRpb24uamF2YQppbmRleCBkZTNlMTYzLi45NjIwOWRmIDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvbGFuZy9tb2RlbC90eXBlL01pcnJvcmVkVHlwZXNFeGNlcHRpb24uamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvbGFuZy9tb2RlbC90eXBlL01pcnJvcmVkVHlwZXNFeGNlcHRpb24uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDcgKzI1LDYgQEAKIAogcGFja2FnZSBqYXZheC5sYW5nLm1vZGVsLnR5cGU7CiAKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwpkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L2xhbmcvbW9kZWwvdXRpbC9BYnN0cmFjdEFubm90YXRpb25WYWx1ZVZpc2l0b3I2LmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvbGFuZy9tb2RlbC91dGlsL0Fic3RyYWN0QW5ub3RhdGlvblZhbHVlVmlzaXRvcjYuamF2YQppbmRleCBlMzZhMDBmLi4xMDkzNDlhIDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvbGFuZy9tb2RlbC91dGlsL0Fic3RyYWN0QW5ub3RhdGlvblZhbHVlVmlzaXRvcjYuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvbGFuZy9tb2RlbC91dGlsL0Fic3RyYWN0QW5ub3RhdGlvblZhbHVlVmlzaXRvcjYuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTEsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI2LDEwICsyNiw4IEBACiBwYWNrYWdlIGphdmF4LmxhbmcubW9kZWwudXRpbDsKIAogCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YXgubGFuZy5tb2RlbC5lbGVtZW50Lio7CiAKLWltcG9ydCBqYXZheC5sYW5nLm1vZGVsLnR5cGUuVHlwZU1pcnJvcjsKIGltcG9ydCBzdGF0aWMgamF2YXgubGFuZy5tb2RlbC5Tb3VyY2VWZXJzaW9uLio7CiBpbXBvcnQgamF2YXgubGFuZy5tb2RlbC5Tb3VyY2VWZXJzaW9uOwogaW1wb3J0IGphdmF4LmFubm90YXRpb24ucHJvY2Vzc2luZy5TdXBwb3J0ZWRTb3VyY2VWZXJzaW9uOwpkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L2xhbmcvbW9kZWwvdXRpbC9BYnN0cmFjdEFubm90YXRpb25WYWx1ZVZpc2l0b3I3LmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvbGFuZy9tb2RlbC91dGlsL0Fic3RyYWN0QW5ub3RhdGlvblZhbHVlVmlzaXRvcjcuamF2YQppbmRleCA0YTVhYzFjLi40NmZhMjdmIDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvbGFuZy9tb2RlbC91dGlsL0Fic3RyYWN0QW5ub3RhdGlvblZhbHVlVmlzaXRvcjcuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvbGFuZy9tb2RlbC91dGlsL0Fic3RyYWN0QW5ub3RhdGlvblZhbHVlVmlzaXRvcjcuamF2YQpAQCAtMjUsMTAgKzI1LDYgQEAKIAogcGFja2FnZSBqYXZheC5sYW5nLm1vZGVsLnV0aWw7CiAKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZheC5sYW5nLm1vZGVsLmVsZW1lbnQuKjsKLQotaW1wb3J0IGphdmF4LmxhbmcubW9kZWwudHlwZS5UeXBlTWlycm9yOwogaW1wb3J0IHN0YXRpYyBqYXZheC5sYW5nLm1vZGVsLlNvdXJjZVZlcnNpb24uKjsKIGltcG9ydCBqYXZheC5sYW5nLm1vZGVsLlNvdXJjZVZlcnNpb247CiBpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5wcm9jZXNzaW5nLlN1cHBvcnRlZFNvdXJjZVZlcnNpb247CmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvbGFuZy9tb2RlbC91dGlsL0Fic3RyYWN0QW5ub3RhdGlvblZhbHVlVmlzaXRvcjguamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9sYW5nL21vZGVsL3V0aWwvQWJzdHJhY3RBbm5vdGF0aW9uVmFsdWVWaXNpdG9yOC5qYXZhCmluZGV4IDIxMjk0NjQuLmM3YTBmN2IgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9sYW5nL21vZGVsL3V0aWwvQWJzdHJhY3RBbm5vdGF0aW9uVmFsdWVWaXNpdG9yOC5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9sYW5nL21vZGVsL3V0aWwvQWJzdHJhY3RBbm5vdGF0aW9uVmFsdWVWaXNpdG9yOC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMTAgKzI1LDYgQEAKIAogcGFja2FnZSBqYXZheC5sYW5nLm1vZGVsLnV0aWw7CiAKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZheC5sYW5nLm1vZGVsLmVsZW1lbnQuKjsKLQotaW1wb3J0IGphdmF4LmxhbmcubW9kZWwudHlwZS5UeXBlTWlycm9yOwogaW1wb3J0IHN0YXRpYyBqYXZheC5sYW5nLm1vZGVsLlNvdXJjZVZlcnNpb24uKjsKIGltcG9ydCBqYXZheC5sYW5nLm1vZGVsLlNvdXJjZVZlcnNpb247CiBpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5wcm9jZXNzaW5nLlN1cHBvcnRlZFNvdXJjZVZlcnNpb247CmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvbGFuZy9tb2RlbC91dGlsL0Fic3RyYWN0RWxlbWVudFZpc2l0b3I2LmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvbGFuZy9tb2RlbC91dGlsL0Fic3RyYWN0RWxlbWVudFZpc2l0b3I2LmphdmEKaW5kZXggMGU0YTM0My4uOGUxZDY1NiAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L2xhbmcvbW9kZWwvdXRpbC9BYnN0cmFjdEVsZW1lbnRWaXNpdG9yNi5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9sYW5nL21vZGVsL3V0aWwvQWJzdHJhY3RFbGVtZW50VmlzaXRvcjYuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTEsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDEzICsyNSwxMCBAQAogCiBwYWNrYWdlIGphdmF4LmxhbmcubW9kZWwudXRpbDsKIAotCi1pbXBvcnQgamF2YXgubGFuZy5tb2RlbC5lbGVtZW50Lio7CiBpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5wcm9jZXNzaW5nLlN1cHBvcnRlZFNvdXJjZVZlcnNpb247Ci1pbXBvcnQgamF2YXgubGFuZy5tb2RlbC5lbGVtZW50Lio7Ci1pbXBvcnQgc3RhdGljIGphdmF4LmxhbmcubW9kZWwuZWxlbWVudC5FbGVtZW50S2luZC4qOwotaW1wb3J0IHN0YXRpYyBqYXZheC5sYW5nLm1vZGVsLlNvdXJjZVZlcnNpb24uKjsKIGltcG9ydCBqYXZheC5sYW5nLm1vZGVsLlNvdXJjZVZlcnNpb247CitpbXBvcnQgamF2YXgubGFuZy5tb2RlbC5lbGVtZW50Lio7CitpbXBvcnQgc3RhdGljIGphdmF4LmxhbmcubW9kZWwuU291cmNlVmVyc2lvbi4qOwogCiAKIC8qKgpkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L2xhbmcvbW9kZWwvdXRpbC9BYnN0cmFjdEVsZW1lbnRWaXNpdG9yNy5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L2xhbmcvbW9kZWwvdXRpbC9BYnN0cmFjdEVsZW1lbnRWaXNpdG9yNy5qYXZhCmluZGV4IDk0NTQ2ZGIuLjBlNWQ4ZGEgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9sYW5nL21vZGVsL3V0aWwvQWJzdHJhY3RFbGVtZW50VmlzaXRvcjcuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvbGFuZy9tb2RlbC91dGlsL0Fic3RyYWN0RWxlbWVudFZpc2l0b3I3LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwxMiArMjUsOSBAQAogCiBwYWNrYWdlIGphdmF4LmxhbmcubW9kZWwudXRpbDsKIAotaW1wb3J0IGphdmF4LmxhbmcubW9kZWwuZWxlbWVudC4qOwogaW1wb3J0IGphdmF4LmFubm90YXRpb24ucHJvY2Vzc2luZy5TdXBwb3J0ZWRTb3VyY2VWZXJzaW9uOwotaW1wb3J0IGphdmF4LmxhbmcubW9kZWwuZWxlbWVudC4qOwotaW1wb3J0IHN0YXRpYyBqYXZheC5sYW5nLm1vZGVsLmVsZW1lbnQuRWxlbWVudEtpbmQuKjsKLWltcG9ydCBzdGF0aWMgamF2YXgubGFuZy5tb2RlbC5Tb3VyY2VWZXJzaW9uLio7CiBpbXBvcnQgamF2YXgubGFuZy5tb2RlbC5Tb3VyY2VWZXJzaW9uOworaW1wb3J0IHN0YXRpYyBqYXZheC5sYW5nLm1vZGVsLlNvdXJjZVZlcnNpb24uKjsKIAogCiAvKioKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9sYW5nL21vZGVsL3V0aWwvQWJzdHJhY3RFbGVtZW50VmlzaXRvcjguamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9sYW5nL21vZGVsL3V0aWwvQWJzdHJhY3RFbGVtZW50VmlzaXRvcjguamF2YQppbmRleCA5Y2YxMDRkLi5iNGFmZTExIDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvbGFuZy9tb2RlbC91dGlsL0Fic3RyYWN0RWxlbWVudFZpc2l0b3I4LmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L2xhbmcvbW9kZWwvdXRpbC9BYnN0cmFjdEVsZW1lbnRWaXNpdG9yOC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMTIgKzI1LDkgQEAKIAogcGFja2FnZSBqYXZheC5sYW5nLm1vZGVsLnV0aWw7CiAKLWltcG9ydCBqYXZheC5sYW5nLm1vZGVsLmVsZW1lbnQuKjsKIGltcG9ydCBqYXZheC5hbm5vdGF0aW9uLnByb2Nlc3NpbmcuU3VwcG9ydGVkU291cmNlVmVyc2lvbjsKLWltcG9ydCBqYXZheC5sYW5nLm1vZGVsLmVsZW1lbnQuKjsKLWltcG9ydCBzdGF0aWMgamF2YXgubGFuZy5tb2RlbC5lbGVtZW50LkVsZW1lbnRLaW5kLio7Ci1pbXBvcnQgc3RhdGljIGphdmF4LmxhbmcubW9kZWwuU291cmNlVmVyc2lvbi4qOwogaW1wb3J0IGphdmF4LmxhbmcubW9kZWwuU291cmNlVmVyc2lvbjsKK2ltcG9ydCBzdGF0aWMgamF2YXgubGFuZy5tb2RlbC5Tb3VyY2VWZXJzaW9uLio7CiAKIAogLyoqCmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvbGFuZy9tb2RlbC91dGlsL0VsZW1lbnRGaWx0ZXIuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9sYW5nL21vZGVsL3V0aWwvRWxlbWVudEZpbHRlci5qYXZhCmluZGV4IGM5NWZmNWYuLjU5MjkxMDIgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9sYW5nL21vZGVsL3V0aWwvRWxlbWVudEZpbHRlci5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9sYW5nL21vZGVsL3V0aWwvRWxlbWVudEZpbHRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMTggKzI1LDE0IEBACiAKIHBhY2thZ2UgamF2YXgubGFuZy5tb2RlbC51dGlsOwogCi1pbXBvcnQgamF2YS5sYW5nLkl0ZXJhYmxlOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKIGltcG9ydCBqYXZhLnV0aWwuRW51bVNldDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwogCiBpbXBvcnQgamF2YXgubGFuZy5tb2RlbC5lbGVtZW50Lio7Ci1pbXBvcnQgamF2YXgubGFuZy5tb2RlbC50eXBlLio7CiAKIAogLyoqCmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvbGFuZy9tb2RlbC91dGlsL0VsZW1lbnRLaW5kVmlzaXRvcjcuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9sYW5nL21vZGVsL3V0aWwvRWxlbWVudEtpbmRWaXNpdG9yNy5qYXZhCmluZGV4IGFjZTE1MTUuLjI1YTY4YTkgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9sYW5nL21vZGVsL3V0aWwvRWxlbWVudEtpbmRWaXNpdG9yNy5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9sYW5nL21vZGVsL3V0aWwvRWxlbWVudEtpbmRWaXNpdG9yNy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjUsMTEgKzI1LDEwIEBACiAKIHBhY2thZ2UgamF2YXgubGFuZy5tb2RlbC51dGlsOwogCi1pbXBvcnQgamF2YXgubGFuZy5tb2RlbC5lbGVtZW50Lio7Ci1pbXBvcnQgc3RhdGljIGphdmF4LmxhbmcubW9kZWwuZWxlbWVudC5FbGVtZW50S2luZC4qOwogaW1wb3J0IGphdmF4LmFubm90YXRpb24ucHJvY2Vzc2luZy5TdXBwb3J0ZWRTb3VyY2VWZXJzaW9uOwotaW1wb3J0IHN0YXRpYyBqYXZheC5sYW5nLm1vZGVsLlNvdXJjZVZlcnNpb24uKjsKIGltcG9ydCBqYXZheC5sYW5nLm1vZGVsLlNvdXJjZVZlcnNpb247CitpbXBvcnQgamF2YXgubGFuZy5tb2RlbC5lbGVtZW50Lio7CitpbXBvcnQgc3RhdGljIGphdmF4LmxhbmcubW9kZWwuU291cmNlVmVyc2lvbi4qOwogCiAvKioKICAqIEEgdmlzaXRvciBvZiBwcm9ncmFtIGVsZW1lbnRzIGJhc2VkIG9uIHRoZWlyIHtAbGlua3BsYWluCmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvbGFuZy9tb2RlbC91dGlsL0VsZW1lbnRLaW5kVmlzaXRvcjguamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9sYW5nL21vZGVsL3V0aWwvRWxlbWVudEtpbmRWaXNpdG9yOC5qYXZhCmluZGV4IDU3ODE4NzUuLmU5YTk4M2IgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9sYW5nL21vZGVsL3V0aWwvRWxlbWVudEtpbmRWaXNpdG9yOC5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9sYW5nL21vZGVsL3V0aWwvRWxlbWVudEtpbmRWaXNpdG9yOC5qYXZhCkBAIC0yNiw3ICsyNiw2IEBACiBwYWNrYWdlIGphdmF4LmxhbmcubW9kZWwudXRpbDsKIAogaW1wb3J0IGphdmF4LmxhbmcubW9kZWwuZWxlbWVudC4qOwotaW1wb3J0IHN0YXRpYyBqYXZheC5sYW5nLm1vZGVsLmVsZW1lbnQuRWxlbWVudEtpbmQuKjsKIGltcG9ydCBqYXZheC5hbm5vdGF0aW9uLnByb2Nlc3NpbmcuU3VwcG9ydGVkU291cmNlVmVyc2lvbjsKIGltcG9ydCBzdGF0aWMgamF2YXgubGFuZy5tb2RlbC5Tb3VyY2VWZXJzaW9uLio7CiBpbXBvcnQgamF2YXgubGFuZy5tb2RlbC5Tb3VyY2VWZXJzaW9uOwpkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L2xhbmcvbW9kZWwvdXRpbC9FbGVtZW50U2Nhbm5lcjYuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9sYW5nL21vZGVsL3V0aWwvRWxlbWVudFNjYW5uZXI2LmphdmEKaW5kZXggNzExMTU0Zi4uODA5YjRkZCAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L2xhbmcvbW9kZWwvdXRpbC9FbGVtZW50U2Nhbm5lcjYuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvbGFuZy9tb2RlbC91dGlsL0VsZW1lbnRTY2FubmVyNi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjcsNyArMjcsNiBAQAogCiBpbXBvcnQgamF2YXgubGFuZy5tb2RlbC5lbGVtZW50Lio7CiBpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5wcm9jZXNzaW5nLlN1cHBvcnRlZFNvdXJjZVZlcnNpb247Ci1pbXBvcnQgc3RhdGljIGphdmF4LmxhbmcubW9kZWwuZWxlbWVudC5FbGVtZW50S2luZC4qOwogaW1wb3J0IGphdmF4LmxhbmcubW9kZWwuU291cmNlVmVyc2lvbjsKIGltcG9ydCBzdGF0aWMgamF2YXgubGFuZy5tb2RlbC5Tb3VyY2VWZXJzaW9uLio7CiAKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9sYW5nL21vZGVsL3V0aWwvRWxlbWVudFNjYW5uZXI3LmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvbGFuZy9tb2RlbC91dGlsL0VsZW1lbnRTY2FubmVyNy5qYXZhCmluZGV4IDExOWIzZDcuLmY0ZDg0ZDAgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9sYW5nL21vZGVsL3V0aWwvRWxlbWVudFNjYW5uZXI3LmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L2xhbmcvbW9kZWwvdXRpbC9FbGVtZW50U2Nhbm5lcjcuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI3LDcgKzI3LDYgQEAKIAogaW1wb3J0IGphdmF4LmxhbmcubW9kZWwuZWxlbWVudC4qOwogaW1wb3J0IGphdmF4LmFubm90YXRpb24ucHJvY2Vzc2luZy5TdXBwb3J0ZWRTb3VyY2VWZXJzaW9uOwotaW1wb3J0IHN0YXRpYyBqYXZheC5sYW5nLm1vZGVsLmVsZW1lbnQuRWxlbWVudEtpbmQuKjsKIGltcG9ydCBqYXZheC5sYW5nLm1vZGVsLlNvdXJjZVZlcnNpb247CiBpbXBvcnQgc3RhdGljIGphdmF4LmxhbmcubW9kZWwuU291cmNlVmVyc2lvbi4qOwogCmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvbGFuZy9tb2RlbC91dGlsL0VsZW1lbnRTY2FubmVyOC5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L2xhbmcvbW9kZWwvdXRpbC9FbGVtZW50U2Nhbm5lcjguamF2YQppbmRleCBkYWVhMjMyLi41YmQwYjkxIDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvbGFuZy9tb2RlbC91dGlsL0VsZW1lbnRTY2FubmVyOC5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9sYW5nL21vZGVsL3V0aWwvRWxlbWVudFNjYW5uZXI4LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDExLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNyw3ICsyNyw2IEBACiAKIGltcG9ydCBqYXZheC5sYW5nLm1vZGVsLmVsZW1lbnQuKjsKIGltcG9ydCBqYXZheC5hbm5vdGF0aW9uLnByb2Nlc3NpbmcuU3VwcG9ydGVkU291cmNlVmVyc2lvbjsKLWltcG9ydCBzdGF0aWMgamF2YXgubGFuZy5tb2RlbC5lbGVtZW50LkVsZW1lbnRLaW5kLio7CiBpbXBvcnQgamF2YXgubGFuZy5tb2RlbC5Tb3VyY2VWZXJzaW9uOwogaW1wb3J0IHN0YXRpYyBqYXZheC5sYW5nLm1vZGVsLlNvdXJjZVZlcnNpb24uKjsKIApkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L2xhbmcvbW9kZWwvdXRpbC9TaW1wbGVBbm5vdGF0aW9uVmFsdWVWaXNpdG9yNy5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L2xhbmcvbW9kZWwvdXRpbC9TaW1wbGVBbm5vdGF0aW9uVmFsdWVWaXNpdG9yNy5qYXZhCmluZGV4IGViMzkyODQuLjJlM2NmYWYgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9sYW5nL21vZGVsL3V0aWwvU2ltcGxlQW5ub3RhdGlvblZhbHVlVmlzaXRvcjcuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvbGFuZy9tb2RlbC91dGlsL1NpbXBsZUFubm90YXRpb25WYWx1ZVZpc2l0b3I3LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwxMyArMjUsOSBAQAogCiBwYWNrYWdlIGphdmF4LmxhbmcubW9kZWwudXRpbDsKIAotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmF4LmxhbmcubW9kZWwuZWxlbWVudC4qOwotCi1pbXBvcnQgamF2YXgubGFuZy5tb2RlbC50eXBlLlR5cGVNaXJyb3I7Ci1pbXBvcnQgc3RhdGljIGphdmF4LmxhbmcubW9kZWwuU291cmNlVmVyc2lvbi4qOwotaW1wb3J0IGphdmF4LmxhbmcubW9kZWwuU291cmNlVmVyc2lvbjsKIGltcG9ydCBqYXZheC5hbm5vdGF0aW9uLnByb2Nlc3NpbmcuU3VwcG9ydGVkU291cmNlVmVyc2lvbjsKK2ltcG9ydCBqYXZheC5sYW5nLm1vZGVsLlNvdXJjZVZlcnNpb247CitpbXBvcnQgc3RhdGljIGphdmF4LmxhbmcubW9kZWwuU291cmNlVmVyc2lvbi4qOwogCiAvKioKICAqIEEgc2ltcGxlIHZpc2l0b3IgZm9yIGFubm90YXRpb24gdmFsdWVzIHdpdGggZGVmYXVsdCBiZWhhdmlvcgpkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L2xhbmcvbW9kZWwvdXRpbC9TaW1wbGVBbm5vdGF0aW9uVmFsdWVWaXNpdG9yOC5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L2xhbmcvbW9kZWwvdXRpbC9TaW1wbGVBbm5vdGF0aW9uVmFsdWVWaXNpdG9yOC5qYXZhCmluZGV4IGE2OWYwZmUuLjMwODIzY2QgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9sYW5nL21vZGVsL3V0aWwvU2ltcGxlQW5ub3RhdGlvblZhbHVlVmlzaXRvcjguamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvbGFuZy9tb2RlbC91dGlsL1NpbXBsZUFubm90YXRpb25WYWx1ZVZpc2l0b3I4LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDExLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwxMyArMjUsOSBAQAogCiBwYWNrYWdlIGphdmF4LmxhbmcubW9kZWwudXRpbDsKIAotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmF4LmxhbmcubW9kZWwuZWxlbWVudC4qOwotCi1pbXBvcnQgamF2YXgubGFuZy5tb2RlbC50eXBlLlR5cGVNaXJyb3I7Ci1pbXBvcnQgc3RhdGljIGphdmF4LmxhbmcubW9kZWwuU291cmNlVmVyc2lvbi4qOwotaW1wb3J0IGphdmF4LmxhbmcubW9kZWwuU291cmNlVmVyc2lvbjsKIGltcG9ydCBqYXZheC5hbm5vdGF0aW9uLnByb2Nlc3NpbmcuU3VwcG9ydGVkU291cmNlVmVyc2lvbjsKK2ltcG9ydCBqYXZheC5sYW5nLm1vZGVsLlNvdXJjZVZlcnNpb247CitpbXBvcnQgc3RhdGljIGphdmF4LmxhbmcubW9kZWwuU291cmNlVmVyc2lvbi4qOwogCiAvKioKICAqIEEgc2ltcGxlIHZpc2l0b3IgZm9yIGFubm90YXRpb24gdmFsdWVzIHdpdGggZGVmYXVsdCBiZWhhdmlvcgpkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L2xhbmcvbW9kZWwvdXRpbC9TaW1wbGVFbGVtZW50VmlzaXRvcjYuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9sYW5nL21vZGVsL3V0aWwvU2ltcGxlRWxlbWVudFZpc2l0b3I2LmphdmEKaW5kZXggMmU5MmQ4Zi4uYTAwNTVmNyAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L2xhbmcvbW9kZWwvdXRpbC9TaW1wbGVFbGVtZW50VmlzaXRvcjYuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvbGFuZy9tb2RlbC91dGlsL1NpbXBsZUVsZW1lbnRWaXNpdG9yNi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjcsNyArMjcsNiBAQAogCiBpbXBvcnQgamF2YXgubGFuZy5tb2RlbC5lbGVtZW50Lio7CiBpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5wcm9jZXNzaW5nLlN1cHBvcnRlZFNvdXJjZVZlcnNpb247Ci1pbXBvcnQgc3RhdGljIGphdmF4LmxhbmcubW9kZWwuZWxlbWVudC5FbGVtZW50S2luZC4qOwogaW1wb3J0IGphdmF4LmxhbmcubW9kZWwuU291cmNlVmVyc2lvbjsKIGltcG9ydCBzdGF0aWMgamF2YXgubGFuZy5tb2RlbC5Tb3VyY2VWZXJzaW9uLio7CiAKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9sYW5nL21vZGVsL3V0aWwvU2ltcGxlRWxlbWVudFZpc2l0b3I3LmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvbGFuZy9tb2RlbC91dGlsL1NpbXBsZUVsZW1lbnRWaXNpdG9yNy5qYXZhCmluZGV4IGVjN2U5MmEuLjVkNTRjZmYgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9sYW5nL21vZGVsL3V0aWwvU2ltcGxlRWxlbWVudFZpc2l0b3I3LmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L2xhbmcvbW9kZWwvdXRpbC9TaW1wbGVFbGVtZW50VmlzaXRvcjcuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI3LDcgKzI3LDYgQEAKIAogaW1wb3J0IGphdmF4LmxhbmcubW9kZWwuZWxlbWVudC4qOwogaW1wb3J0IGphdmF4LmFubm90YXRpb24ucHJvY2Vzc2luZy5TdXBwb3J0ZWRTb3VyY2VWZXJzaW9uOwotaW1wb3J0IHN0YXRpYyBqYXZheC5sYW5nLm1vZGVsLmVsZW1lbnQuRWxlbWVudEtpbmQuKjsKIGltcG9ydCBqYXZheC5sYW5nLm1vZGVsLlNvdXJjZVZlcnNpb247CiBpbXBvcnQgc3RhdGljIGphdmF4LmxhbmcubW9kZWwuU291cmNlVmVyc2lvbi4qOwogCmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvbGFuZy9tb2RlbC91dGlsL1NpbXBsZUVsZW1lbnRWaXNpdG9yOC5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L2xhbmcvbW9kZWwvdXRpbC9TaW1wbGVFbGVtZW50VmlzaXRvcjguamF2YQppbmRleCBkYjgzYTM4Li42M2NhY2QwIDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvbGFuZy9tb2RlbC91dGlsL1NpbXBsZUVsZW1lbnRWaXNpdG9yOC5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9sYW5nL21vZGVsL3V0aWwvU2ltcGxlRWxlbWVudFZpc2l0b3I4LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDExLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSw5ICsyNSw3IEBACiAKIHBhY2thZ2UgamF2YXgubGFuZy5tb2RlbC51dGlsOwogCi1pbXBvcnQgamF2YXgubGFuZy5tb2RlbC5lbGVtZW50Lio7CiBpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5wcm9jZXNzaW5nLlN1cHBvcnRlZFNvdXJjZVZlcnNpb247Ci1pbXBvcnQgc3RhdGljIGphdmF4LmxhbmcubW9kZWwuZWxlbWVudC5FbGVtZW50S2luZC4qOwogaW1wb3J0IGphdmF4LmxhbmcubW9kZWwuU291cmNlVmVyc2lvbjsKIGltcG9ydCBzdGF0aWMgamF2YXgubGFuZy5tb2RlbC5Tb3VyY2VWZXJzaW9uLio7CiAKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9sYW5nL21vZGVsL3V0aWwvU2ltcGxlVHlwZVZpc2l0b3I4LmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvbGFuZy9tb2RlbC91dGlsL1NpbXBsZVR5cGVWaXNpdG9yOC5qYXZhCmluZGV4IDY5ODg5OTkuLmZjMDIzZDggMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9sYW5nL21vZGVsL3V0aWwvU2ltcGxlVHlwZVZpc2l0b3I4LmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L2xhbmcvbW9kZWwvdXRpbC9TaW1wbGVUeXBlVmlzaXRvcjguamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDcgKzI1LDYgQEAKIAogcGFja2FnZSBqYXZheC5sYW5nLm1vZGVsLnV0aWw7CiAKLWltcG9ydCBqYXZheC5sYW5nLm1vZGVsLnR5cGUuKjsKIGltcG9ydCBqYXZheC5hbm5vdGF0aW9uLnByb2Nlc3NpbmcuU3VwcG9ydGVkU291cmNlVmVyc2lvbjsKIGltcG9ydCBqYXZheC5sYW5nLm1vZGVsLlNvdXJjZVZlcnNpb247CiBpbXBvcnQgc3RhdGljIGphdmF4LmxhbmcubW9kZWwuU291cmNlVmVyc2lvbi4qOwpkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L2xhbmcvbW9kZWwvdXRpbC9UeXBlS2luZFZpc2l0b3I2LmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvbGFuZy9tb2RlbC91dGlsL1R5cGVLaW5kVmlzaXRvcjYuamF2YQppbmRleCA3YWRjOTkzLi45ZTAwN2ZlIDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvbGFuZy9tb2RlbC91dGlsL1R5cGVLaW5kVmlzaXRvcjYuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvbGFuZy9tb2RlbC91dGlsL1R5cGVLaW5kVmlzaXRvcjYuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTEsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDEyICsyNSwxMCBAQAogCiBwYWNrYWdlIGphdmF4LmxhbmcubW9kZWwudXRpbDsKIAotCi1pbXBvcnQgamF2YXgubGFuZy5tb2RlbC50eXBlLio7CiBpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5wcm9jZXNzaW5nLlN1cHBvcnRlZFNvdXJjZVZlcnNpb247Ci1pbXBvcnQgc3RhdGljIGphdmF4LmxhbmcubW9kZWwuZWxlbWVudC5FbGVtZW50S2luZC4qOwotaW1wb3J0IHN0YXRpYyBqYXZheC5sYW5nLm1vZGVsLlNvdXJjZVZlcnNpb24uKjsKIGltcG9ydCBqYXZheC5sYW5nLm1vZGVsLlNvdXJjZVZlcnNpb247CitpbXBvcnQgamF2YXgubGFuZy5tb2RlbC50eXBlLio7CitpbXBvcnQgc3RhdGljIGphdmF4LmxhbmcubW9kZWwuU291cmNlVmVyc2lvbi4qOwogCiAvKioKICAqIEEgdmlzaXRvciBvZiB0eXBlcyBiYXNlZCBvbiB0aGVpciB7QGxpbmtwbGFpbiBUeXBlS2luZCBraW5kfSB3aXRoCmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvbGFuZy9tb2RlbC91dGlsL1R5cGVLaW5kVmlzaXRvcjcuamF2YSBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9sYW5nL21vZGVsL3V0aWwvVHlwZUtpbmRWaXNpdG9yNy5qYXZhCmluZGV4IDcwMWI1MjUuLjRiYmUxZDYgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9sYW5nL21vZGVsL3V0aWwvVHlwZUtpbmRWaXNpdG9yNy5qYXZhCisrKyBiL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9sYW5nL21vZGVsL3V0aWwvVHlwZUtpbmRWaXNpdG9yNy5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KICAqCiAgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMjcsNyArMjcsNiBAQAogCiBpbXBvcnQgamF2YXgubGFuZy5tb2RlbC50eXBlLio7CiBpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5wcm9jZXNzaW5nLlN1cHBvcnRlZFNvdXJjZVZlcnNpb247Ci1pbXBvcnQgc3RhdGljIGphdmF4LmxhbmcubW9kZWwuZWxlbWVudC5FbGVtZW50S2luZC4qOwogaW1wb3J0IHN0YXRpYyBqYXZheC5sYW5nLm1vZGVsLlNvdXJjZVZlcnNpb24uKjsKIGltcG9ydCBqYXZheC5sYW5nLm1vZGVsLlNvdXJjZVZlcnNpb247CiAKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC9sYW5nL21vZGVsL3V0aWwvVHlwZUtpbmRWaXNpdG9yOC5qYXZhIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L2xhbmcvbW9kZWwvdXRpbC9UeXBlS2luZFZpc2l0b3I4LmphdmEKaW5kZXggMjZhYzljMS4uNjk4MzY0ZiAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L2xhbmcvbW9kZWwvdXRpbC9UeXBlS2luZFZpc2l0b3I4LmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L2xhbmcvbW9kZWwvdXRpbC9UeXBlS2luZFZpc2l0b3I4LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDExLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDEyLCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgogICoKICAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yNSwxMSArMjUsMTAgQEAKIAogcGFja2FnZSBqYXZheC5sYW5nLm1vZGVsLnV0aWw7CiAKLWltcG9ydCBqYXZheC5sYW5nLm1vZGVsLnR5cGUuKjsKIGltcG9ydCBqYXZheC5hbm5vdGF0aW9uLnByb2Nlc3NpbmcuU3VwcG9ydGVkU291cmNlVmVyc2lvbjsKLWltcG9ydCBzdGF0aWMgamF2YXgubGFuZy5tb2RlbC5lbGVtZW50LkVsZW1lbnRLaW5kLio7Ci1pbXBvcnQgc3RhdGljIGphdmF4LmxhbmcubW9kZWwuU291cmNlVmVyc2lvbi4qOwogaW1wb3J0IGphdmF4LmxhbmcubW9kZWwuU291cmNlVmVyc2lvbjsKK2ltcG9ydCBqYXZheC5sYW5nLm1vZGVsLnR5cGUuKjsKK2ltcG9ydCBzdGF0aWMgamF2YXgubGFuZy5tb2RlbC5Tb3VyY2VWZXJzaW9uLio7CiAKIC8qKgogICogQSB2aXNpdG9yIG9mIHR5cGVzIGJhc2VkIG9uIHRoZWlyIHtAbGlua3BsYWluIFR5cGVLaW5kIGtpbmR9IHdpdGgKZGlmZiAtLWdpdCBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC90b29scy9Gb3J3YXJkaW5nSmF2YUZpbGVNYW5hZ2VyLmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvdG9vbHMvRm9yd2FyZGluZ0phdmFGaWxlTWFuYWdlci5qYXZhCmluZGV4IGY4NzViOTQuLjliZjM0MDUgMTAwNjQ0Ci0tLSBhL2xhbmd0b29scy9zcmMvc2hhcmUvY2xhc3Nlcy9qYXZheC90b29scy9Gb3J3YXJkaW5nSmF2YUZpbGVNYW5hZ2VyLmphdmEKKysrIGIvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3Rvb2xzL0ZvcndhcmRpbmdKYXZhRmlsZU1hbmFnZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI2LDcgKzI2LDYgQEAKIHBhY2thZ2UgamF2YXgudG9vbHM7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSSTsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKIGltcG9ydCBqYXZheC50b29scy5KYXZhRmlsZU9iamVjdC5LaW5kOwpkaWZmIC0tZ2l0IGEvbGFuZ3Rvb2xzL3NyYy9zaGFyZS9jbGFzc2VzL2phdmF4L3Rvb2xzL0phdmFGaWxlT2JqZWN0LmphdmEgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvdG9vbHMvSmF2YUZpbGVPYmplY3QuamF2YQppbmRleCA5ZTg0YjNjLi5lYTlkZDc1IDEwMDY0NAotLS0gYS9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvdG9vbHMvSmF2YUZpbGVPYmplY3QuamF2YQorKysgYi9sYW5ndG9vbHMvc3JjL3NoYXJlL2NsYXNzZXMvamF2YXgvdG9vbHMvSmF2YUZpbGVPYmplY3QuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTI1LDEyICsyNSw2IEBACiAKIHBhY2thZ2UgamF2YXgudG9vbHM7CiAKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQgamF2YS5uaW8uQ2hhckJ1ZmZlcjsKIGltcG9ydCBqYXZheC5sYW5nLm1vZGVsLmVsZW1lbnQuTmVzdGluZ0tpbmQ7CiBpbXBvcnQgamF2YXgubGFuZy5tb2RlbC5lbGVtZW50Lk1vZGlmaWVyOwogCmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvdGVzdC9jb20vc3VuL2phdmFkb2MvVmVyc2lvbk51bWJlci9WZXJzaW9uTnVtYmVyLmphdmEgYi9sYW5ndG9vbHMvdGVzdC9jb20vc3VuL2phdmFkb2MvVmVyc2lvbk51bWJlci9WZXJzaW9uTnVtYmVyLmphdmEKaW5kZXggZWFkZjFjYS4uZTRjYjAxMCAxMDA2NDQKLS0tIGEvbGFuZ3Rvb2xzL3Rlc3QvY29tL3N1bi9qYXZhZG9jL1ZlcnNpb25OdW1iZXIvVmVyc2lvbk51bWJlci5qYXZhCisrKyBiL2xhbmd0b29scy90ZXN0L2NvbS9zdW4vamF2YWRvYy9WZXJzaW9uTnVtYmVyL1ZlcnNpb25OdW1iZXIuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMTAsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCiAgKgogICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKQEAgLTg0LDcgKzg0LDcgQEAKIAogICAgICAgICAgICAgLy8gVGVzdCB0aGUgcHJvcGVyIERPQ1RZUEUgZWxlbWVudCBpcyBwcmVzZW50OgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAiPCEtLSBHZW5lcmF0ZWQgYnkgamF2YWRvYyAodmVyc2lvbiIsCisgICAgICAgICAgICAgICAgICI8IS0tIEdlbmVyYXRlZCBieSBqYXZhZG9jICgiLAogICAgICAgICAgICAgICAgICAgICAgVE1QREVTVF9ESVIxICsgInAxIiArIEZTICsgIkMuaHRtbCIgIH0sCiAKICAgICAgICAgfTsKZGlmZiAtLWdpdCBhL2xhbmd0b29scy90ZXN0L2NvbS9zdW4vamF2YWRvYy90ZXN0RG9jRW5jb2RpbmcvVGVzdERvY0VuY29kaW5nLmphdmEgYi9sYW5ndG9vbHMvdGVzdC9jb20vc3VuL2phdmFkb2MvdGVzdERvY0VuY29kaW5nL1Rlc3REb2NFbmNvZGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxMTk3NmEKLS0tIC9kZXYvbnVsbAorKysgYi9sYW5ndG9vbHMvdGVzdC9jb20vc3VuL2phdmFkb2MvdGVzdERvY0VuY29kaW5nL1Rlc3REb2NFbmNvZGluZy5qYXZhCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKKyAqIHF1ZXN0aW9ucy4KKyAqLworCisvKgorICogUG9ydGlvbnMgQ29weXJpZ2h0IChjKSAyMDEyIElCTSBDb3Jwb3JhdGlvbgorICovCisKKy8qCisgKiBAdGVzdAorICogQGJ1ZyAgICAgIDgwMDA3NDMKKyAqIEBzdW1tYXJ5ICBSdW4gdGVzdHMgb24gLWRvY2VuY29kaW5nIHRvIHNlZSBpZiB0aGUgdmFsdWUgaXMKKyAgICAgICAgICAgICB1c2VkIGZvciBzdHlsZXNoZWV0IGFzIHdlbGwuCisgKiBAYXV0aG9yICAgamF5YXNocmVlIHZpc3dhbmF0aGFuCisgKiBAbGlicmFyeSAgLi4vbGliLworICogQGJ1aWxkICAgIEphdmFkb2NUZXN0ZXIgVGVzdERvY0VuY29kaW5nCisgKiBAcnVuIG1haW4gVGVzdERvY0VuY29kaW5nCisgKi8KKworcHVibGljIGNsYXNzIFRlc3REb2NFbmNvZGluZyBleHRlbmRzIEphdmFkb2NUZXN0ZXIgeworCisgICAgLy9UZXN0IGluZm9ybWF0aW9uLgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVUdfSUQgPSAiODAwMDc0MyI7CisKKyAgICAvL0phdmFkb2MgYXJndW1lbnRzLgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEFSR1MgPSBuZXcgU3RyaW5nW10geworICAgICAgICAiLWQiLCBCVUdfSUQsICItZG9jZW5jb2RpbmciLCAiQ3A5MzAiLAorICAgICAgICAiLXNvdXJjZXBhdGgiLCBTUkNfRElSLCAicGtnIgorICAgIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXVtdIFRFU1QgPSBOT19URVNUOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW11bXSBORUdBVEVEX1RFU1QgPSB7CisgICAgICAgIHtCVUdfSUQgKyBGUyArICJzdHlsZXNoZWV0LmNzcyIsCisgICAgICAgICAgICAiYm9keSB7IiArIE5MICsgIiAgICBiYWNrZ3JvdW5kLWNvbG9yOiNmZmZmZmY7In0KKyAgICB9OworCisgICAgLyoqCisgICAgICogVGhlIGVudHJ5IHBvaW50IG9mIHRoZSB0ZXN0LgorICAgICAqIEBwYXJhbSBhcmdzIHRoZSBhcnJheSBvZiBjb21tYW5kIGxpbmUgYXJndW1lbnRzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgVGVzdERvY0VuY29kaW5nIHRlc3RlciA9IG5ldyBUZXN0RG9jRW5jb2RpbmcoKTsKKyAgICAgICAgcnVuKHRlc3RlciwgQVJHUywgVEVTVCwgTkVHQVRFRF9URVNUKTsKKyAgICAgICAgdGVzdGVyLnByaW50U3VtbWFyeSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEJ1Z0lkKCkgeworICAgICAgICByZXR1cm4gQlVHX0lEOworICAgIH0KKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEJ1Z05hbWUoKSB7CisgICAgICAgIHJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2xhbmd0b29scy90ZXN0L2NvbS9zdW4vamF2YWRvYy90ZXN0RG9jRW5jb2RpbmcvcGtnL1Rlc3QuamF2YSBiL2xhbmd0b29scy90ZXN0L2NvbS9zdW4vamF2YWRvYy90ZXN0RG9jRW5jb2RpbmcvcGtnL1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzRmZGEyCi0tLSAvZGV2L251bGwKKysrIGIvbGFuZ3Rvb2xzL3Rlc3QvY29tL3N1bi9qYXZhZG9jL3Rlc3REb2NFbmNvZGluZy9wa2cvVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKKyAqIHF1ZXN0aW9ucy4KKyAqLworCisvKgorICogUG9ydGlvbnMgQ29weXJpZ2h0IChjKSAyMDEyIElCTSBDb3Jwb3JhdGlvbgorICovCisKK3BhY2thZ2UgcGtnOworCitwdWJsaWMgY2xhc3MgVGVzdCB7fQorCmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvdGVzdC9jb20vc3VuL2phdmFkb2MvdGVzdEdlbmVyYXRlZEJ5L1Rlc3RHZW5lcmF0ZWRCeS5qYXZhIGIvbGFuZ3Rvb2xzL3Rlc3QvY29tL3N1bi9qYXZhZG9jL3Rlc3RHZW5lcmF0ZWRCeS9UZXN0R2VuZXJhdGVkQnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjIxMDVlCi0tLSAvZGV2L251bGwKKysrIGIvbGFuZ3Rvb2xzL3Rlc3QvY29tL3N1bi9qYXZhZG9jL3Rlc3RHZW5lcmF0ZWRCeS9UZXN0R2VuZXJhdGVkQnkuamF2YQpAQCAtMCwwICsxLDExMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQorICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQorICogcXVlc3Rpb25zLgorICovCisKKy8qCisgKiBAdGVzdAorICogQGJ1ZyA4MDAwNDE4CisgKiBAc3VtbWFyeSBWZXJpZnkgdGhhdCBmaWxlcyB1c2UgYSBjb21tb24gR2VuZXJhdGVkIEJ5IHN0cmluZworICogQGxpYnJhcnkgLi4vbGliLworICogQGJ1aWxkIEphdmFkb2NUZXN0ZXIgVGVzdEdlbmVyYXRlZEJ5CisgKiBAcnVuIG1haW4gVGVzdEdlbmVyYXRlZEJ5CisgKi8KKworcHVibGljIGNsYXNzIFRlc3RHZW5lcmF0ZWRCeSBleHRlbmRzIEphdmFkb2NUZXN0ZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9VVFBVVF9ESVIgPSAidG1wIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEZJTEVTID0geworICAgICAgICAicGtnL015Q2xhc3MuaHRtbCIsCisgICAgICAgICJwa2cvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiLAorICAgICAgICAicGtnL3BhY2thZ2UtZnJhbWUuaHRtbCIsCisgICAgICAgICJwa2cvcGFja2FnZS10cmVlLmh0bWwiLAorICAgICAgICAiYWxsY2xhc3Nlcy1ub2ZyYW1lLmh0bWwiLAorICAgICAgICAiY29uc3RhbnQtdmFsdWVzLmh0bWwiLAorICAgICAgICAiYWxsY2xhc3Nlcy1mcmFtZS5odG1sIiwKKyAgICAgICAgIm92ZXJ2aWV3LXRyZWUuaHRtbCIsCisgICAgICAgICJkZXByZWNhdGVkLWxpc3QuaHRtbCIsCisgICAgICAgICJzZXJpYWxpemVkLWZvcm0uaHRtbCIsCisgICAgICAgICJoZWxwLWRvYy5odG1sIiwKKyAgICAgICAgImluZGV4LWFsbC5odG1sIiwKKyAgICAgICAgImluZGV4Lmh0bWwiCisgICAgfTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEFSR1MgPQorICAgICAgICBuZXcgU3RyaW5nW10geworICAgICAgICAgICAgIi1kIiwgT1VUUFVUX0RJUiwKKyAgICAgICAgICAgICItc291cmNlcGF0aCIsIFNSQ19ESVIsCisgICAgICAgICAgICAicGtnIgorICAgICAgICB9OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVUdfSUQgPSAiODAwMDQxOCI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmdbXVtdIGdldFRlc3RzKCkgeworICAgICAgICBTdHJpbmcgdmVyc2lvbiA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS52ZXJzaW9uIik7CisgICAgICAgIFN0cmluZ1tdW10gdGVzdHMgPSBuZXcgU3RyaW5nW0ZJTEVTLmxlbmd0aF1bXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBGSUxFUy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdGVzdHNbaV0gPSBuZXcgU3RyaW5nW10geworICAgICAgICAgICAgICAgIE9VVFBVVF9ESVIgKyBGUyArIEZJTEVTW2ldLAorICAgICAgICAgICAgICAgICJHZW5lcmF0ZWQgYnkgamF2YWRvYyAoIiArIHZlcnNpb24gKyAiKSBvbiAiCisgICAgICAgICAgICB9OworICAgICAgICB9CisgICAgICAgIHJldHVybiB0ZXN0czsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmdbXVtdIGdldE5lZ2F0ZWRUZXN0cygpIHsKKyAgICAgICAgU3RyaW5nW11bXSB0ZXN0cyA9IG5ldyBTdHJpbmdbRklMRVMubGVuZ3RoXVtdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEZJTEVTLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0ZXN0c1tpXSA9IG5ldyBTdHJpbmdbXSB7CisgICAgICAgICAgICAgICAgT1VUUFVUX0RJUiArIEZTICsgRklMRVNbaV0sCisgICAgICAgICAgICAgICAgIkdlbmVyYXRlZCBieSBqYXZhZG9jICh2ZXJzaW9uIiwKKyAgICAgICAgICAgICAgICAiR2VuZXJhdGVkIGJ5IGphdmFkb2Mgb24iCisgICAgICAgICAgICB9OworICAgICAgICB9CisgICAgICAgIHJldHVybiB0ZXN0czsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgZW50cnkgcG9pbnQgb2YgdGhlIHRlc3QuCisgICAgICogQHBhcmFtIGFyZ3MgdGhlIGFycmF5IG9mIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICBUZXN0R2VuZXJhdGVkQnkgdGVzdGVyID0gbmV3IFRlc3RHZW5lcmF0ZWRCeSgpOworICAgICAgICBpbnQgZXhpdENvZGUgPSBydW4odGVzdGVyLCBBUkdTLCBnZXRUZXN0cygpLCBnZXROZWdhdGVkVGVzdHMoKSk7CisgICAgICAgIHRlc3Rlci5wcmludFN1bW1hcnkoKTsKKyAgICAgICAgaWYgKGV4aXRDb2RlICE9IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiRXJyb3IgZm91bmQgd2hpbGUgZXhlY3V0aW5nIEphdmFkb2MiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEJ1Z0lkKCkgeworICAgICAgICByZXR1cm4gQlVHX0lEOworICAgIH0KKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEJ1Z05hbWUoKSB7CisgICAgICAgIHJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2xhbmd0b29scy90ZXN0L2NvbS9zdW4vamF2YWRvYy90ZXN0R2VuZXJhdGVkQnkvcGtnL015Q2xhc3MuamF2YSBiL2xhbmd0b29scy90ZXN0L2NvbS9zdW4vamF2YWRvYy90ZXN0R2VuZXJhdGVkQnkvcGtnL015Q2xhc3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2I2OTliCi0tLSAvZGV2L251bGwKKysrIGIvbGFuZ3Rvb2xzL3Rlc3QvY29tL3N1bi9qYXZhZG9jL3Rlc3RHZW5lcmF0ZWRCeS9wa2cvTXlDbGFzcy5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKKyAqIHF1ZXN0aW9ucy4KKyAqLworCitwYWNrYWdlIHBrZzsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworCitwdWJsaWMgY2xhc3MgTXlDbGFzcyBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7Cit9CmRpZmYgLS1naXQgYS9sYW5ndG9vbHMvdGVzdC90b29scy9qYXZhYy9kZWZhdWx0TWV0aG9kcy9zeW50YXgvVGVzdERlZmF1bHRNZXRob2RzU3ludGF4LmphdmEgYi9sYW5ndG9vbHMvdGVzdC90b29scy9qYXZhYy9kZWZhdWx0TWV0aG9kcy9zeW50YXgvVGVzdERlZmF1bHRNZXRob2RzU3ludGF4LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTczZTRjNgotLS0gL2Rldi9udWxsCisrKyBiL2xhbmd0b29scy90ZXN0L3Rvb2xzL2phdmFjL2RlZmF1bHRNZXRob2RzL3N5bnRheC9UZXN0RGVmYXVsdE1ldGhvZHNTeW50YXguamF2YQpAQCAtMCwwICsxLDMxMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQgaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0CisgKiBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYWxvbmcgd2l0aCB0aGlzIHdvcms7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBQbGVhc2UgY29udGFjdCBPcmFjbGUsIDUwMCBPcmFjbGUgUGFya3dheSwgUmVkd29vZCBTaG9yZXMsIENBIDk0MDY1IFVTQQorICogb3IgdmlzaXQgd3d3Lm9yYWNsZS5jb20gaWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvciBoYXZlIGFueQorICogcXVlc3Rpb25zLgorICovCisKKy8qCisgKiBAdGVzdAorICogQGJ1ZyA3MTkyMjQ1CisgKiBAc3VtbWFyeSBBdXRvbWF0aWMgdGVzdCBmb3IgY2hlY2tpbmcgc2V0IG9mIGFsbG93ZWQgbW9kaWZpZXJzIG9uIGludGVyZmFjZSBtZXRob2RzCisgKi8KKworaW1wb3J0IGNvbS5zdW4uc291cmNlLnV0aWwuSmF2YWNUYXNrOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmF4LnRvb2xzLkRpYWdub3N0aWM7CitpbXBvcnQgamF2YXgudG9vbHMuSmF2YUNvbXBpbGVyOworaW1wb3J0IGphdmF4LnRvb2xzLkphdmFGaWxlT2JqZWN0OworaW1wb3J0IGphdmF4LnRvb2xzLlNpbXBsZUphdmFGaWxlT2JqZWN0OworaW1wb3J0IGphdmF4LnRvb2xzLlN0YW5kYXJkSmF2YUZpbGVNYW5hZ2VyOworaW1wb3J0IGphdmF4LnRvb2xzLlRvb2xQcm92aWRlcjsKKworCitwdWJsaWMgY2xhc3MgVGVzdERlZmF1bHRNZXRob2RzU3ludGF4IHsKKworICAgIHN0YXRpYyBpbnQgY2hlY2tDb3VudCA9IDA7CisKKyAgICBlbnVtIFZlcnNpb25LaW5kIHsKKyAgICAgICAgUFJFX0xBTUJEQSgiNyIpLAorICAgICAgICBMQU1CREEoIjgiKTsKKworICAgICAgICBTdHJpbmcgdmVyc2lvblN0cmluZzsKKworICAgICAgICBWZXJzaW9uS2luZChTdHJpbmcgdmVyc2lvblN0cmluZykgeworICAgICAgICAgICAgdGhpcy52ZXJzaW9uU3RyaW5nID0gdmVyc2lvblN0cmluZzsKKyAgICAgICAgfQorCisgICAgICAgIExpc3Q8U3RyaW5nPiBnZXRPcHRpb25zKCkgeworICAgICAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QoIi1YRGFsbG93RGVmYXVsdE1ldGhvZHMiLCAiLXNvdXJjZSIsIHZlcnNpb25TdHJpbmcpOworICAgICAgICB9CisgICAgfQorCisgICAgZW51bSBNb2RpZmllcktpbmQgeworICAgICAgICBOT05FKCIiKSwKKyAgICAgICAgUFVCTElDKCJwdWJsaWMiKSwKKyAgICAgICAgUFJPVEVDVEVEKCJwcm90ZWN0ZWQiKSwKKyAgICAgICAgUFJJVkFURSgicHJpdmF0ZSIpLAorICAgICAgICBBQlNUUkFDVCgiYWJzdHJhY3QiKSwKKyAgICAgICAgU1RBVElDKCJzdGF0aWMiKSwKKyAgICAgICAgTkFUSVZFKCJuYXRpdmUiKSwKKyAgICAgICAgU1lOQ0hST05JWkVEKCJzeW5jaHJvbml6ZWQiKSwKKyAgICAgICAgRklOQUwoImZpbmFsIiksCisgICAgICAgIFNUUklDVEZQKCJzdHJpY3RmcCIpLAorICAgICAgICBERUZBVUxUKCJkZWZhdWx0Iik7CisKKyAgICAgICAgU3RyaW5nIG1vZFN0cjsKKworICAgICAgICBwcml2YXRlIE1vZGlmaWVyS2luZChTdHJpbmcgbW9kU3RyKSB7CisgICAgICAgICAgICB0aGlzLm1vZFN0ciA9IG1vZFN0cjsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2xlYW4gaXNBbGxvd2VkKEVuY2xvc2luZ0tpbmQgZWssIE1vZGlmaWVyS2luZCBvdGhlck1vZCkgeworICAgICAgICAgICAgaWYgKHRoaXMgPT0gb3RoZXJNb2QpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHN3aXRjaCAodGhpcykgeworICAgICAgICAgICAgICAgIGNhc2UgTk9ORToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgY2FzZSBBQlNUUkFDVDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG90aGVyTW9kICE9IFBSSVZBVEU7CisgICAgICAgICAgICAgICAgY2FzZSBOQVRJVkU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBvdGhlck1vZCAhPSBBQlNUUkFDVCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyTW9kICE9IFNUUklDVEZQOworICAgICAgICAgICAgICAgIGNhc2UgRklOQUw6CisgICAgICAgICAgICAgICAgY2FzZSBTVEFUSUM6CisgICAgICAgICAgICAgICAgY2FzZSBTWU5DSFJPTklaRUQ6CisgICAgICAgICAgICAgICAgY2FzZSBTVFJJQ1RGUDoKKyAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvdGhlck1vZCAhPSBBQlNUUkFDVDsKKyAgICAgICAgICAgICAgICBjYXNlIFBVQkxJQzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgY2FzZSBQUk9URUNURUQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlayA9PSBFbmNsb3NpbmdLaW5kLkFCU1RSQUNUX0NMQVNTOworICAgICAgICAgICAgICAgIGNhc2UgREVGQVVMVDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG90aGVyTW9kICE9IEFCU1RSQUNUOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIGJvb2xlYW4gaW50ZXJzZWN0KE1vZGlmaWVyS2luZCBtaywgTW9kaWZpZXJLaW5kLi4uIG1rcykgeworICAgICAgICAgICAgZm9yIChNb2RpZmllcktpbmQgbWsyIDogbWtzKSB7CisgICAgICAgICAgICAgICAgaWYgKG1rID09IG1rMikgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgYm9vbGVhbiBjb21wYXRpYmxlKE1ldGhvZEtpbmQgbWssIE1vZGlmaWVyS2luZCBtb2QxLCBNb2RpZmllcktpbmQgbW9kMiwgRW5jbG9zaW5nS2luZCBlaykgeworICAgICAgICAgICAgaWYgKGludGVyc2VjdChBQlNUUkFDVCwgbW9kMSwgbW9kMikgfHwgaW50ZXJzZWN0KE5BVElWRSwgbW9kMSwgbW9kMikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbWsgPT0gTWV0aG9kS2luZC5OT19CT0RZOworICAgICAgICAgICAgfSBlbHNlIGlmIChpbnRlcnNlY3QoREVGQVVMVCwgbW9kMSwgbW9kMikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbWsgPT0gTWV0aG9kS2luZC5CT0RZOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZWsgPT0gRW5jbG9zaW5nS2luZC5JTlRFUkZBQ0UgPworICAgICAgICAgICAgICAgICAgICAgICAgbWsgPT0gTWV0aG9kS2luZC5OT19CT0RZIDogbWsgPT0gTWV0aG9kS2luZC5CT0RZOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiBjb21wYXRpYmxlKEVuY2xvc2luZ0tpbmQgZWspIHsKKyAgICAgICAgICAgIHN3aXRjaCAodGhpcykgeworICAgICAgICAgICAgICAgIGNhc2UgU1RBVElDOgorICAgICAgICAgICAgICAgIGNhc2UgUFJJVkFURToKKyAgICAgICAgICAgICAgICBjYXNlIFBST1RFQ1RFRDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVrICE9IEVuY2xvc2luZ0tpbmQuSU5URVJGQUNFOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIGJvb2xlYW4gY29tcGF0aWJsZShNb2RpZmllcktpbmQgbTEsIE1vZGlmaWVyS2luZCBtMiwgRW5jbG9zaW5nS2luZCBlaykgeworICAgICAgICAgICAgUmVzdWx0IHJlczEgPSBhbGxvd2VkTW9kaWZpZXJQYWlyc1ttMS5vcmRpbmFsKCldW20yLm9yZGluYWwoKV07CisgICAgICAgICAgICBSZXN1bHQgcmVzMiA9IGFsbG93ZWRNb2RpZmllclBhaXJzW20yLm9yZGluYWwoKV1bbTEub3JkaW5hbCgpXTsKKyAgICAgICAgICAgIGlmIChyZXMxICE9IHJlczIpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoU3RyaW5nLmZvcm1hdCgiSWxsLWZvcm1lZCB0YWJsZTogWyVzLCVzXSAhPSBbJXMsJXNdIiwgbTEsIG0yLCBtMiwgbTEpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlczEuY29tcGF0aWJsZShlaywgbTEsIG0yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGludGVyZmFjZSBSZXN1bHQgeworICAgICAgICAgICAgYm9vbGVhbiBjb21wYXRpYmxlKEVuY2xvc2luZ0tpbmQgZWssIE1vZGlmaWVyS2luZCBtMSwgTW9kaWZpZXJLaW5kIG0yKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyBmaW5hbCBSZXN1bHQgVCA9IG5ldyBSZXN1bHQoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGNvbXBhdGlibGUoRW5jbG9zaW5nS2luZCBlaywgTW9kaWZpZXJLaW5kIG0xLCBNb2RpZmllcktpbmQgbTIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBzdGF0aWMgZmluYWwgUmVzdWx0IEYgPSBuZXcgUmVzdWx0KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb21wYXRpYmxlKEVuY2xvc2luZ0tpbmQgZWssIE1vZGlmaWVyS2luZCBtMSwgTW9kaWZpZXJLaW5kIG0yKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIHN0YXRpYyBmaW5hbCBSZXN1bHQgQyA9IG5ldyBSZXN1bHQoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGNvbXBhdGlibGUoRW5jbG9zaW5nS2luZCBlaywgTW9kaWZpZXJLaW5kIG0xLCBNb2RpZmllcktpbmQgbTIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZWsgIT0gRW5jbG9zaW5nS2luZC5JTlRFUkZBQ0U7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgc3RhdGljIGZpbmFsIFJlc3VsdCBJID0gbmV3IFJlc3VsdCgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gY29tcGF0aWJsZShFbmNsb3NpbmdLaW5kIGVrLCBNb2RpZmllcktpbmQgbTEsIE1vZGlmaWVyS2luZCBtMikgeworICAgICAgICAgICAgICAgIHJldHVybiBlayA9PSBFbmNsb3NpbmdLaW5kLklOVEVSRkFDRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBzdGF0aWMgUmVzdWx0W11bXSBhbGxvd2VkTW9kaWZpZXJQYWlycyA9IHsKKyAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgTk9ORSAgUFVCTElDICBQUk9URUNURUQgIFBSSVZBVEUgIEFCU1RSQUNUICBTVEFUSUMgIE5BVElWRSAgU1lOQ0hST05JWkVEICBGSU5BTCAgU1RSSUNURlAgIERFRkFVTFQgKi8KKyAgICAgICAgICAgIC8qIE5PTkUgKi8gICAgICAgICAgIHsgVCAgICwgVCAgICAsIEMgICAgICAgICwgQyAgICAgICAsIFQgICAgICAgLCBDICAgICAsIEMgICAgICwgQyAgICAgICAgICAgLCBDICAgICwgQyAgICAgICAsIEkgICB9LAorICAgICAgICAgICAgLyogUFVCTElDICovICAgICAgICAgeyBUICAgLCBGICAgICwgRiAgICAgICAgLCBGICAgICAgICwgVCAgICAgICAsIEMgICAgICwgQyAgICAgLCBDICAgICAgICAgICAsIEMgICAgLCBDICAgICAgICwgSSAgIH0sCisgICAgICAgICAgICAvKiBQUk9URUNURUQgKi8gICAgICB7IEMgICAsIEYgICAgLCBGICAgICAgICAsIEYgICAgICAgLCBDICAgICAgICwgQyAgICAgLCBDICAgICAsIEMgICAgICAgICAgICwgQyAgICAsIEMgICAgICAgLCBGICAgfSwKKyAgICAgICAgICAgIC8qIFBSSVZBVEUgKi8gICAgICAgIHsgQyAgICwgRiAgICAsIEYgICAgICAgICwgRiAgICAgICAsIEYgICAgICAgLCBDICAgICAsIEMgICAgICwgQyAgICAgICAgICAgLCBDICAgICwgQyAgICAgICAsIEYgICB9LAorICAgICAgICAgICAgLyogQUJTVFJBQ1QgKi8gICAgICAgeyBUICAgLCBUICAgICwgQyAgICAgICAgLCBGICAgICAgICwgRiAgICAgICAsIEYgICAgICwgRiAgICAgLCBGICAgICAgICAgICAsIEYgICAgLCBGICAgICAgICwgRiAgIH0sCisgICAgICAgICAgICAvKiBTVEFUSUMgKi8gICAgICAgICB7IEMgICAsIEMgICAgLCBDICAgICAgICAsIEMgICAgICAgLCBGICAgICAgICwgRiAgICAgLCBDICAgICAsIEMgICAgICAgICAgICwgQyAgICAsIEMgICAgICAgLCBGICAgfSwKKyAgICAgICAgICAgIC8qIE5BVElWRSAqLyAgICAgICAgIHsgQyAgICwgQyAgICAsIEMgICAgICAgICwgQyAgICAgICAsIEYgICAgICAgLCBDICAgICAsIEYgICAgICwgQyAgICAgICAgICAgLCBDICAgICwgRiAgICAgICAsIEYgICB9LAorICAgICAgICAgICAgLyogU1lOQ0hST05JWkVEICovICAgeyBDICAgLCBDICAgICwgQyAgICAgICAgLCBDICAgICAgICwgRiAgICAgICAsIEMgICAgICwgQyAgICAgLCBGICAgICAgICAgICAsIEMgICAgLCBDICAgICAgICwgSSAgIH0sCisgICAgICAgICAgICAvKiBGSU5BTCAqLyAgICAgICAgICB7IEMgICAsIEMgICAgLCBDICAgICAgICAsIEMgICAgICAgLCBGICAgICAgICwgQyAgICAgLCBDICAgICAsIEMgICAgICAgICAgICwgRiAgICAsIEMgICAgICAgLCBGICAgfSwKKyAgICAgICAgICAgIC8qIFNUUklDVEZQICovICAgICAgIHsgQyAgICwgQyAgICAsIEMgICAgICAgICwgQyAgICAgICAsIEYgICAgICAgLCBDICAgICAsIEYgICAgICwgQyAgICAgICAgICAgLCBDICAgICwgRiAgICAgICAsIEkgICB9LAorICAgICAgICAgICAgLyogREVGQVVMVCAqLyAgICAgICAgeyBJICAgLCBJICAgICwgRiAgICAgICAgLCBGICAgICAgICwgRiAgICAgICAsIEYgICAgICwgRiAgICAgLCBJICAgICAgICAgICAsIEYgICAgLCBJICAgICAgICwgRiAgIH19OworICAgIH0KKworICAgIGVudW0gTWV0aG9kS2luZCB7CisgICAgICAgIE5PX0JPRFkoInZvaWQgbSgpOyIpLAorICAgICAgICBCT0RZKCJ2b2lkIG0oKSB7IH0iKTsKKworICAgICAgICBTdHJpbmcgbWV0aFN0cjsKKworICAgICAgICBwcml2YXRlIE1ldGhvZEtpbmQoU3RyaW5nIG1ldGhTdHIpIHsKKyAgICAgICAgICAgIHRoaXMubWV0aFN0ciA9IG1ldGhTdHI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBlbnVtIEVuY2xvc2luZ0tpbmQgeworICAgICAgICBBQlNUUkFDVF9DTEFTUygiYWJzdHJhY3QgY2xhc3MgVGVzdCAiKSwKKyAgICAgICAgSU5URVJGQUNFKCJpbnRlcmZhY2UgVGVzdCAiKTsKKworICAgICAgICBTdHJpbmcgZW5jbFN0cjsKKworICAgICAgICBFbmNsb3NpbmdLaW5kKFN0cmluZyBlbmNsU3RyKSB7CisgICAgICAgICAgICB0aGlzLmVuY2xTdHIgPSBlbmNsU3RyOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nLi4uIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIC8vY3JlYXRlIGRlZmF1bHQgc2hhcmVkIEphdmFDb21waWxlciAtIHJldXNlZCBhY3Jvc3MgbXVsdGlwbGUgY29tcGlsYXRpb25zCisgICAgICAgIEphdmFDb21waWxlciBjb21wID0gVG9vbFByb3ZpZGVyLmdldFN5c3RlbUphdmFDb21waWxlcigpOworICAgICAgICBTdGFuZGFyZEphdmFGaWxlTWFuYWdlciBmbSA9IGNvbXAuZ2V0U3RhbmRhcmRGaWxlTWFuYWdlcihudWxsLCBudWxsLCBudWxsKTsKKworICAgICAgICBmb3IgKFZlcnNpb25LaW5kIHZrIDogVmVyc2lvbktpbmQudmFsdWVzKCkpIHsKKyAgICAgICAgICAgIGZvciAoRW5jbG9zaW5nS2luZCBlayA6IEVuY2xvc2luZ0tpbmQudmFsdWVzKCkpIHsKKyAgICAgICAgICAgICAgICBmb3IgKE1ldGhvZEtpbmQgbWsgOiBNZXRob2RLaW5kLnZhbHVlcygpKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoTW9kaWZpZXJLaW5kIG1vZGsxIDogTW9kaWZpZXJLaW5kLnZhbHVlcygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKE1vZGlmaWVyS2luZCBtb2RrMiA6IE1vZGlmaWVyS2luZC52YWx1ZXMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUZXN0RGVmYXVsdE1ldGhvZHNTeW50YXgodmssIGVrLCBtaywgbW9kazEsIG1vZGsyKS5ydW4oY29tcCwgZm0pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVG90YWwgY2hlY2sgZXhlY3V0ZWQ6ICIgKyBjaGVja0NvdW50KTsKKyAgICB9CisKKyAgICBWZXJzaW9uS2luZCB2azsKKyAgICBFbmNsb3NpbmdLaW5kIGVrOworICAgIE1ldGhvZEtpbmQgbWs7CisgICAgTW9kaWZpZXJLaW5kIG1vZGsxLCBtb2RrMjsKKyAgICBKYXZhU291cmNlIHNvdXJjZTsKKyAgICBEaWFnbm9zdGljQ2hlY2tlciBkaWFnQ2hlY2tlcjsKKworICAgIFRlc3REZWZhdWx0TWV0aG9kc1N5bnRheChWZXJzaW9uS2luZCB2aywgRW5jbG9zaW5nS2luZCBlaywgTWV0aG9kS2luZCBtaywgTW9kaWZpZXJLaW5kIG1vZGsxLCBNb2RpZmllcktpbmQgbW9kazIpIHsKKyAgICAgICAgdGhpcy52ayA9IHZrOworICAgICAgICB0aGlzLmVrID0gZWs7CisgICAgICAgIHRoaXMubWsgPSBtazsKKyAgICAgICAgdGhpcy5tb2RrMSA9IG1vZGsxOworICAgICAgICB0aGlzLm1vZGsyID0gbW9kazI7CisgICAgICAgIHRoaXMuc291cmNlID0gbmV3IEphdmFTb3VyY2UoKTsKKyAgICAgICAgdGhpcy5kaWFnQ2hlY2tlciA9IG5ldyBEaWFnbm9zdGljQ2hlY2tlcigpOworICAgIH0KKworICAgIGNsYXNzIEphdmFTb3VyY2UgZXh0ZW5kcyBTaW1wbGVKYXZhRmlsZU9iamVjdCB7CisKKyAgICAgICAgU3RyaW5nIHRlbXBsYXRlID0gIiNFSyB7XG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICNNT0QxICNNT0QyICNNRVRIXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIn1cbiI7CisKKyAgICAgICAgU3RyaW5nIHNvdXJjZTsKKworICAgICAgICBwdWJsaWMgSmF2YVNvdXJjZSgpIHsKKyAgICAgICAgICAgIHN1cGVyKFVSSS5jcmVhdGUoIm15Zm86L1Rlc3QuamF2YSIpLCBKYXZhRmlsZU9iamVjdC5LaW5kLlNPVVJDRSk7CisgICAgICAgICAgICBzb3VyY2UgPSB0ZW1wbGF0ZS5yZXBsYWNlQWxsKCIjRUsiLCBlay5lbmNsU3RyKQorICAgICAgICAgICAgICAgICAgICAucmVwbGFjZUFsbCgiI01PRDEiLCBtb2RrMS5tb2RTdHIpCisgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlQWxsKCIjTU9EMiIsIG1vZGsyLm1vZFN0cikKKyAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2VBbGwoIiNNRVRIIiwgbWsubWV0aFN0cik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRDaGFyQ29udGVudChib29sZWFuIGlnbm9yZUVuY29kaW5nRXJyb3JzKSB7CisgICAgICAgICAgICByZXR1cm4gc291cmNlOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBydW4oSmF2YUNvbXBpbGVyIHRvb2wsIFN0YW5kYXJkSmF2YUZpbGVNYW5hZ2VyIGZtKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSmF2YWNUYXNrIGN0ID0gKEphdmFjVGFzayl0b29sLmdldFRhc2sobnVsbCwgZm0sIGRpYWdDaGVja2VyLAorICAgICAgICAgICAgICAgIHZrLmdldE9wdGlvbnMoKSwgbnVsbCwgQXJyYXlzLmFzTGlzdChzb3VyY2UpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGN0LmFuYWx5emUoKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGV4KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoIkVycm9yIHRocm93biB3aGVuIGFuYWx5emluZyB0aGUgZm9sbG93aW5nIHNvdXJjZTpcbiIgKyBzb3VyY2UuZ2V0Q2hhckNvbnRlbnQodHJ1ZSkpOworICAgICAgICB9CisgICAgICAgIGNoZWNrKCk7CisgICAgfQorCisgICAgdm9pZCBjaGVjaygpIHsKKyAgICAgICAgYm9vbGVhbiBlcnJvckV4cGVjdGVkID0gIU1vZGlmaWVyS2luZC5jb21wYXRpYmxlKG1vZGsxLCBtb2RrMiwgZWspOworCisgICAgICAgIGVycm9yRXhwZWN0ZWQgfD0gIU1vZGlmaWVyS2luZC5jb21wYXRpYmxlKG1rLCBtb2RrMSwgbW9kazIsIGVrKTsKKworICAgICAgICBlcnJvckV4cGVjdGVkIHw9ICFtb2RrMS5jb21wYXRpYmxlKGVrKSB8fCAhbW9kazIuY29tcGF0aWJsZShlayk7CisKKyAgICAgICAgZXJyb3JFeHBlY3RlZCB8PSBNb2RpZmllcktpbmQuaW50ZXJzZWN0KE1vZGlmaWVyS2luZC5ERUZBVUxULCBtb2RrMSwgbW9kazIpICYmCisgICAgICAgICAgICAgICAgdmsgPT0gVmVyc2lvbktpbmQuUFJFX0xBTUJEQTsKKworICAgICAgICBjaGVja0NvdW50Kys7CisgICAgICAgIGlmIChkaWFnQ2hlY2tlci5lcnJvckZvdW5kICE9IGVycm9yRXhwZWN0ZWQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiUHJvYmxlbSB3aGVuIGNvbXBpbGluZyBzb3VyY2U6XG4iICsgc291cmNlLmdldENoYXJDb250ZW50KHRydWUpICsKKyAgICAgICAgICAgICAgICAgICAgIlxuZm91bmQgZXJyb3I6ICIgKyBkaWFnQ2hlY2tlci5lcnJvckZvdW5kKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBEaWFnbm9zdGljQ2hlY2tlciBpbXBsZW1lbnRzIGphdmF4LnRvb2xzLkRpYWdub3N0aWNMaXN0ZW5lcjxKYXZhRmlsZU9iamVjdD4geworCisgICAgICAgIGJvb2xlYW4gZXJyb3JGb3VuZDsKKworICAgICAgICBwdWJsaWMgdm9pZCByZXBvcnQoRGlhZ25vc3RpYzw/IGV4dGVuZHMgSmF2YUZpbGVPYmplY3Q+IGRpYWdub3N0aWMpIHsKKyAgICAgICAgICAgIGlmIChkaWFnbm9zdGljLmdldEtpbmQoKSA9PSBEaWFnbm9zdGljLktpbmQuRVJST1IpIHsKKyAgICAgICAgICAgICAgICBlcnJvckZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xhbmd0b29scy90ZXN0L3Rvb2xzL2phdmFjL2RpYWdzL2V4YW1wbGVzL0RlZmF1bHRNZXRob2ROb3RTdXBwb3J0ZWQuamF2YSBiL2xhbmd0b29scy90ZXN0L3Rvb2xzL2phdmFjL2RpYWdzL2V4YW1wbGVzL0RlZmF1bHRNZXRob2ROb3RTdXBwb3J0ZWQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTQ3OTk5Ci0tLSAvZGV2L251bGwKKysrIGIvbGFuZ3Rvb2xzL3Rlc3QvdG9vbHMvamF2YWMvZGlhZ3MvZXhhbXBsZXMvRGVmYXVsdE1ldGhvZE5vdFN1cHBvcnRlZC5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBjb2RlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdAorICogYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFsb25nIHdpdGggdGhpcyB3b3JrOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogUGxlYXNlIGNvbnRhY3QgT3JhY2xlLCA1MDAgT3JhY2xlIFBhcmt3YXksIFJlZHdvb2QgU2hvcmVzLCBDQSA5NDA2NSBVU0EKKyAqIG9yIHZpc2l0IHd3dy5vcmFjbGUuY29tIGlmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb3IgaGF2ZSBhbnkKKyAqIHF1ZXN0aW9ucy4KKyAqLworCisvLyBrZXk6IGNvbXBpbGVyLmVyci5kZWZhdWx0Lm1ldGhvZHMubm90LnN1cHBvcnRlZC5pbi5zb3VyY2UKKy8vIG9wdGlvbnM6IC1zb3VyY2UgNyAtWGxpbnQ6LW9wdGlvbnMKKworaW50ZXJmYWNlIERlZmF1bHRNZXRob2ROb3RTdXBwb3J0ZWQgeworICAgIGRlZmF1bHQgdm9pZCBtKCkgeyB9Cit9CmRpZmYgLS1naXQgYS9tYWtlL2pwcnQucHJvcGVydGllcyBiL21ha2UvanBydC5wcm9wZXJ0aWVzCmluZGV4IDJiMDQ0ZjAuLjk4NGMyYjEgMTAwNjQ0Ci0tLSBhL21ha2UvanBydC5wcm9wZXJ0aWVzCisrKyBiL21ha2UvanBydC5wcm9wZXJ0aWVzCkBAIC03OSwyMCArNzksMTggQEAKICAgICAke2pwcnQubXkudGVzdC50YXJnZXQuc2V0OlRFU1ROQU1FPWpka191dGlsfSwgICAgICAgICAgICAgICBcCiAgICAgJHtqcHJ0Lm15LnRlc3QudGFyZ2V0LnNldDpURVNUTkFNRT1qZGtfaW99LAkJCVwKICAgICAke2pwcnQubXkudGVzdC50YXJnZXQuc2V0OlRFU1ROQU1FPWpka19uZXR9LAkJXAotICAgICR7anBydC5teS50ZXN0LnRhcmdldC5zZXQ6VEVTVE5BTUU9amRrX25pbzF9LAkJXAotICAgICR7anBydC5teS50ZXN0LnRhcmdldC5zZXQ6VEVTVE5BTUU9amRrX25pbzJ9LAkJXAotICAgICR7anBydC5teS50ZXN0LnRhcmdldC5zZXQ6VEVTVE5BTUU9amRrX25pbzN9LAkJXAorICAgICR7anBydC5teS50ZXN0LnRhcmdldC5zZXQ6VEVTVE5BTUU9amRrX25pb30sCQlcCiAgICAgJHtqcHJ0Lm15LnRlc3QudGFyZ2V0LnNldDpURVNUTkFNRT1qZGtfc2VjdXJpdHkxfSwJCVwKICAgICAke2pwcnQubXkudGVzdC50YXJnZXQuc2V0OlRFU1ROQU1FPWpka19zZWN1cml0eTJ9LCAgICAgICAgICBcCiAgICAgJHtqcHJ0Lm15LnRlc3QudGFyZ2V0LnNldDpURVNUTkFNRT1qZGtfc2VjdXJpdHkzfSwgICAgICAgICAgXAogICAgICR7anBydC5teS50ZXN0LnRhcmdldC5zZXQ6VEVTVE5BTUU9amRrX3JtaX0sICAgICAgICAgICAgICAgIFwKLSAgICAke2pwcnQubXkudGVzdC50YXJnZXQuc2V0OlRFU1ROQU1FPWpka19tYW5hZ2VtZW50MX0sICAgICAgICBcCi0gICAgJHtqcHJ0Lm15LnRlc3QudGFyZ2V0LnNldDpURVNUTkFNRT1qZGtfbWFuYWdlbWVudDJ9LCAgICAgICAgXAorICAgICR7anBydC5teS50ZXN0LnRhcmdldC5zZXQ6VEVTVE5BTUU9amRrX21hbmFnZW1lbnR9LCAgICAgICAgIFwKKyAgICAke2pwcnQubXkudGVzdC50YXJnZXQuc2V0OlRFU1ROQU1FPWpka19qbXh9LCAgICAgICAgICAgICAgICBcCiAgICAgJHtqcHJ0Lm15LnRlc3QudGFyZ2V0LnNldDpURVNUTkFNRT1qZGtfdGV4dH0sCQlcCi0gICAgJHtqcHJ0Lm15LnRlc3QudGFyZ2V0LnNldDpURVNUTkFNRT1qZGtfdG9vbHMxfSwgICAgICAgICAgICAgXAotICAgICR7anBydC5teS50ZXN0LnRhcmdldC5zZXQ6VEVTVE5BTUU9amRrX3Rvb2xzMn0sICAgICAgICAgICAgIFwKKyAgICAke2pwcnQubXkudGVzdC50YXJnZXQuc2V0OlRFU1ROQU1FPWpka190b29sc30sICAgICAgICAgICAgICBcCisgICAgJHtqcHJ0Lm15LnRlc3QudGFyZ2V0LnNldDpURVNUTkFNRT1qZGtfamRpfSwgICAgICAgICAgICAgICAgXAogICAgICR7anBydC5teS50ZXN0LnRhcmdldC5zZXQ6VEVTVE5BTUU9amRrX2pmcn0sICAgICAgICAgICAgICAgIFwKLSAgICAke2pwcnQubXkudGVzdC50YXJnZXQuc2V0OlRFU1ROQU1FPWpka19taXNjfQorICAgICR7anBydC5teS50ZXN0LnRhcmdldC5zZXQ6VEVTVE5BTUU9amRrX290aGVyfQogCiAjIEFsbCB2bSB0ZXN0IHRhcmdldHMgKHRlc3RzZXQ9YWxsKQoganBydC52bS5hbGwudGVzdC50YXJnZXRzPSAgICAJCQkJCVwKZGlmZiAtLWdpdCBhL3Rlc3QvTWFrZWZpbGUgYi90ZXN0L01ha2VmaWxlCmluZGV4IGYxZGZlMWQuLjllNGQ1MDkgMTAwNjQ0Ci0tLSBhL3Rlc3QvTWFrZWZpbGUKKysrIGIvdGVzdC9NYWtlZmlsZQpAQCAtNTgsOSArNTgsOSBAQAogCWpka19pbyAgXAogCWpka19sYW5nICBcCiAJamRrX21hdGggIFwKLQlqZGtfbWlzYyAgXAorCWpka19vdGhlciAgXAogCWpka19uZXQgIFwKLQlqZGtfbmlvMSBqZGtfbmlvMiBqZGtfbmlvMyAgXAorCWpka19uaW8gXAogCWpka19zZWN1cml0eTEgXAogCWpka190ZXh0ICBcCiAJamRrX3V0aWwKQEAgLTY5LDEyICs2OSwxNCBAQAogSkRLX05PTkRFRkFVTFRfVEVTVF9MSVNUID0gXAogCWpka19hd3QgXAogCWpka19iZWFuczIgamRrX2JlYW5zMyAgXAotCWpka19tYW5hZ2VtZW50MSBqZGtfbWFuYWdlbWVudDIgIFwKKwlqZGtfbWFuYWdlbWVudCBcCisJamRrX2pteCBcCiAJamRrX3NlY3VyaXR5MiBqZGtfc2VjdXJpdHkzICBcCiAJamRrX3JtaSBcCiAJamRrX3NvdW5kIFwKIAlqZGtfc3dpbmcgXAotCWpka190b29sczEgamRrX3Rvb2xzMiBcCisJamRrX3Rvb2xzIFwKKwlqZGtfamRpIFwKIAlqZGtfamZyCiAKICMgQWxsIGpkayB0ZXN0cwo=